From 842b2f39d516e0aca4c2b8b1503b3dd568ba2548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Thu, 4 Aug 2022 10:52:08 +0200 Subject: [PATCH 01/12] Add psalm configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- composer.json | 8 +- composer.lock | 1251 +- psalm.xml | 18 + vendor-bin/coding-standard/composer.lock | 108 +- vendor/amphp/amp/LICENSE | 23 + vendor/amphp/amp/composer.json | 74 + vendor/amphp/amp/lib/CallableMaker.php | 80 + vendor/amphp/amp/lib/CancellationToken.php | 49 + .../amphp/amp/lib/CancellationTokenSource.php | 163 + vendor/amphp/amp/lib/CancelledException.php | 17 + .../amp/lib/CombinedCancellationToken.php | 87 + vendor/amphp/amp/lib/Coroutine.php | 160 + vendor/amphp/amp/lib/Deferred.php | 76 + vendor/amphp/amp/lib/Delayed.php | 58 + vendor/amphp/amp/lib/Emitter.php | 84 + vendor/amphp/amp/lib/Failure.php | 52 + vendor/amphp/amp/lib/Internal/Placeholder.php | 187 + .../amp/lib/Internal/PrivateIterator.php | 45 + .../amphp/amp/lib/Internal/PrivatePromise.php | 25 + vendor/amphp/amp/lib/Internal/Producer.php | 212 + .../amp/lib/Internal/ResolutionQueue.php | 90 + vendor/amphp/amp/lib/Internal/functions.php | 117 + vendor/amphp/amp/lib/InvalidYieldError.php | 39 + vendor/amphp/amp/lib/Iterator.php | 34 + vendor/amphp/amp/lib/LazyPromise.php | 44 + vendor/amphp/amp/lib/Loop.php | 456 + vendor/amphp/amp/lib/Loop/Driver.php | 742 + vendor/amphp/amp/lib/Loop/DriverFactory.php | 73 + vendor/amphp/amp/lib/Loop/EvDriver.php | 317 + vendor/amphp/amp/lib/Loop/EventDriver.php | 367 + .../amp/lib/Loop/Internal/TimerQueue.php | 169 + .../amp/lib/Loop/InvalidWatcherError.php | 32 + vendor/amphp/amp/lib/Loop/NativeDriver.php | 445 + vendor/amphp/amp/lib/Loop/TracingDriver.php | 251 + .../lib/Loop/UnsupportedFeatureException.php | 12 + vendor/amphp/amp/lib/Loop/UvDriver.php | 350 + vendor/amphp/amp/lib/Loop/Watcher.php | 57 + vendor/amphp/amp/lib/MultiReasonException.php | 29 + .../amphp/amp/lib/NullCancellationToken.php | 53 + vendor/amphp/amp/lib/Producer.php | 43 + vendor/amphp/amp/lib/Promise.php | 37 + vendor/amphp/amp/lib/Struct.php | 78 + vendor/amphp/amp/lib/Success.php | 60 + .../amp/lib/TimeoutCancellationToken.php | 75 + vendor/amphp/amp/lib/TimeoutException.php | 19 + vendor/amphp/amp/lib/functions.php | 825 + .../byte-stream/.github/workflows/ci.yml | 135 + vendor/amphp/byte-stream/LICENSE | 22 + vendor/amphp/byte-stream/composer.json | 58 + .../lib/Base64/Base64DecodingInputStream.php | 65 + .../lib/Base64/Base64DecodingOutputStream.php | 55 + .../lib/Base64/Base64EncodingInputStream.php | 46 + .../lib/Base64/Base64EncodingOutputStream.php | 39 + .../amphp/byte-stream/lib/ClosedException.php | 7 + .../amphp/byte-stream/lib/InMemoryStream.php | 39 + vendor/amphp/byte-stream/lib/InputStream.php | 38 + .../byte-stream/lib/InputStreamChain.php | 52 + .../amphp/byte-stream/lib/IteratorStream.php | 70 + vendor/amphp/byte-stream/lib/LineReader.php | 71 + vendor/amphp/byte-stream/lib/Message.php | 176 + vendor/amphp/byte-stream/lib/OutputBuffer.php | 55 + vendor/amphp/byte-stream/lib/OutputStream.php | 37 + vendor/amphp/byte-stream/lib/Payload.php | 92 + .../byte-stream/lib/PendingReadError.php | 17 + .../byte-stream/lib/ResourceInputStream.php | 262 + .../byte-stream/lib/ResourceOutputStream.php | 321 + .../amphp/byte-stream/lib/StreamException.php | 7 + .../amphp/byte-stream/lib/ZlibInputStream.php | 112 + .../byte-stream/lib/ZlibOutputStream.php | 119 + vendor/amphp/byte-stream/lib/functions.php | 188 + vendor/amphp/byte-stream/psalm.xml | 53 + vendor/autoload.php | 5 + vendor/bin/php-cs-fixer | 121 +- vendor/bin/php-parse | 120 + vendor/bin/psalm | 120 + vendor/bin/psalm-language-server | 120 + vendor/bin/psalm-plugin | 120 + vendor/bin/psalm-refactor | 120 + vendor/bin/psalter | 120 + vendor/composer/ClassLoader.php | 155 +- vendor/composer/InstalledVersions.php | 27 +- vendor/composer/autoload_classmap.php | 1690 +- vendor/composer/autoload_files.php | 9 +- vendor/composer/autoload_namespaces.php | 4 +- vendor/composer/autoload_psr4.php | 17 +- vendor/composer/autoload_real.php | 32 +- vendor/composer/autoload_static.php | 1808 +- vendor/composer/installed.json | 2473 ++- vendor/composer/installed.php | 214 +- .../package-versions-deprecated/CHANGELOG.md | 120 + .../CONTRIBUTING.md | 39 + .../package-versions-deprecated/LICENSE | 19 + .../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 + vendor/composer/pcre/LICENSE | 19 + vendor/composer/pcre/README.md | 164 + vendor/composer/pcre/composer.json | 46 + vendor/composer/pcre/phpstan-baseline.neon | 17 + vendor/composer/pcre/src/MatchAllResult.php | 46 + .../pcre/src/MatchAllWithOffsetsResult.php | 48 + vendor/composer/pcre/src/MatchResult.php | 39 + .../pcre/src/MatchWithOffsetsResult.php | 41 + vendor/composer/pcre/src/PcreException.php | 60 + vendor/composer/pcre/src/Preg.php | 275 + vendor/composer/pcre/src/Regex.php | 118 + vendor/composer/pcre/src/ReplaceResult.php | 44 + vendor/composer/semver/CHANGELOG.md | 209 + vendor/composer/semver/LICENSE | 19 + vendor/composer/semver/README.md | 98 + vendor/composer/semver/composer.json | 59 + vendor/composer/semver/src/Comparator.php | 113 + .../composer/semver/src/CompilingMatcher.php | 94 + .../composer/semver/src/Constraint/Bound.php | 122 + .../semver/src/Constraint/Constraint.php | 435 + .../src/Constraint/ConstraintInterface.php | 75 + .../src/Constraint/MatchAllConstraint.php | 85 + .../src/Constraint/MatchNoneConstraint.php | 83 + .../semver/src/Constraint/MultiConstraint.php | 325 + vendor/composer/semver/src/Interval.php | 98 + vendor/composer/semver/src/Intervals.php | 478 + vendor/composer/semver/src/Semver.php | 129 + vendor/composer/semver/src/VersionParser.php | 586 + vendor/composer/xdebug-handler/CHANGELOG.md | 134 + vendor/composer/xdebug-handler/LICENSE | 21 + vendor/composer/xdebug-handler/README.md | 298 + vendor/composer/xdebug-handler/composer.json | 44 + .../composer/xdebug-handler/src/PhpConfig.php | 91 + .../composer/xdebug-handler/src/Process.php | 118 + vendor/composer/xdebug-handler/src/Status.php | 203 + .../xdebug-handler/src/XdebugHandler.php | 668 + vendor/dnoegel/php-xdg-base-dir/LICENSE | 19 + vendor/dnoegel/php-xdg-base-dir/README.md | 41 + vendor/dnoegel/php-xdg-base-dir/composer.json | 17 + vendor/dnoegel/php-xdg-base-dir/src/Xdg.php | 132 + .../.github/workflows/build.yml | 63 + vendor/felixfbecker/advanced-json-rpc/LICENSE | 15 + .../advanced-json-rpc/composer.json | 32 + .../advanced-json-rpc/lib/Dispatcher.php | 171 + .../advanced-json-rpc/lib/Error.php | 38 + .../advanced-json-rpc/lib/ErrorCode.php | 48 + .../advanced-json-rpc/lib/ErrorResponse.php | 40 + .../advanced-json-rpc/lib/Message.php | 52 + .../advanced-json-rpc/lib/Notification.php | 56 + .../advanced-json-rpc/lib/Request.php | 63 + .../advanced-json-rpc/lib/Response.php | 40 + .../advanced-json-rpc/lib/SuccessResponse.php | 40 + .../language-server-protocol/.editorconfig | 17 + .../.github/workflows/build.yml | 67 + .../language-server-protocol/LICENSE | 15 + .../language-server-protocol/README.md | 19 + .../language-server-protocol/composer.json | 44 + .../package-lock.json | 6489 ++++++ .../language-server-protocol/package.json | 15 + .../psalm-baseline.xml | 146 + .../language-server-protocol/psalm.xml | 16 + .../src/CallHierarchyClientCapabilities.php | 22 + .../src/ChangeAnnotation.php | 39 + .../src/ClientCapabilities.php | 97 + .../src/ClientCapabilitiesGeneral.php | 33 + .../src/ClientCapabilitiesWindow.php | 47 + .../src/ClientCapabilitiesWorkspace.php | 99 + ...entCapabilitiesWorkspaceFileOperations.php | 75 + .../src/ClientInfo.php | 29 + .../src/CodeAction.php | 146 + .../src/CodeActionClientCapabilities.php | 95 + ...ntCapabilitiesCodeActionLiteralSupport.php | 20 + ...CodeActionLiteralSupportcodeActionKind.php | 28 + ...ActionClientCapabilitiesResolveSupport.php | 21 + .../src/CodeActionContext.php | 51 + .../src/CodeActionDisabled.php | 21 + .../src/CodeActionKind.php | 87 + .../src/CodeActionTriggerKind.php | 22 + .../src/CodeDescription.php | 23 + .../language-server-protocol/src/CodeLens.php | 46 + .../src/CodeLensClientCapabilities.php | 20 + .../src/CodeLensOptions.php | 21 + .../CodeLensWorkspaceClientCapabilities.php | 25 + .../language-server-protocol/src/Command.php | 42 + .../src/CompletionClientCapabilities.php | 65 + ...letionClientCapabilitiesCompletionItem.php | 140 + ...iesCompletionItemInsertTextModeSupport.php | 24 + ...pabilitiesCompletionItemResolveSupport.php | 24 + ...ntCapabilitiesCompletionItemTagSupport.php | 24 + ...letionClientCapabilitiesCompletionList.php | 30 + .../src/CompletionContext.php | 31 + .../src/CompletionItem.php | 248 + .../src/CompletionItemKind.php | 71 + .../src/CompletionItemLabelDetails.php | 35 + .../src/CompletionItemTag.php | 11 + .../src/CompletionList.php | 39 + .../src/CompletionOptions.php | 33 + .../src/CompletionTriggerKind.php | 16 + .../src/ContentChangeEvent.php | 39 + .../src/DeclarationClientCapabilities.php | 31 + .../src/DefinitionClientCapabilities.php | 29 + .../src/DependencyReference.php | 27 + .../src/Diagnostic.php | 121 + .../src/DiagnosticRelatedInformation.php | 31 + .../src/DiagnosticSeverity.php | 26 + .../src/DiagnosticTag.php | 27 + ...dChangeConfigurationClientCapabilities.php | 20 + ...idChangeWatchedFilesClientCapabilities.php | 21 + .../src/DocumentColorClientCapabilities.php | 20 + .../DocumentFormattingClientCapabilities.php | 20 + .../src/DocumentHighlight.php | 32 + .../DocumentHighlightClientCapabilities.php | 18 + .../src/DocumentHighlightKind.php | 24 + .../src/DocumentLinkClientCapabilities.php | 31 + ...mentOnTypeFormattingClientCapabilities.php | 20 + .../src/DocumentOnTypeFormattingOptions.php | 33 + ...umentRangeFormattingClientCapabilities.php | 20 + .../src/DocumentSymbolClientCapabilities.php | 64 + ...mentSymbolClientCapabilitiesSymbolKind.php | 37 + ...mentSymbolClientCapabilitiesTagSupport.php | 32 + .../src/ErrorCode.php | 17 + .../src/ExecuteCommandClientCapabilities.php | 20 + .../src/ExecuteCommandOptions.php | 23 + .../src/FailureHandlingKind.php | 36 + .../src/FileChangeType.php | 24 + .../src/FileEvent.php | 33 + .../src/FoldingRangeClientCapabilities.php | 42 + .../src/FormattingOptions.php | 33 + .../language-server-protocol/src/Hover.php | 34 + .../src/HoverClientCapabilities.php | 36 + .../src/ImplementationClientCapabilities.php | 32 + .../src/InitializeResult.php | 29 + .../src/InitializeResultServerInfo.php | 26 + .../src/InsertTextFormat.php | 25 + .../src/InsertTextMode.php | 32 + .../LinkedEditingRangeClientCapabilities.php | 23 + .../language-server-protocol/src/Location.php | 27 + .../src/LogMessage.php | 30 + .../language-server-protocol/src/LogTrace.php | 39 + .../src/MarkdownClientCapabilities.php | 47 + .../src/MarkedString.php | 24 + .../src/MarkupContent.php | 52 + .../src/MarkupKind.php | 23 + .../src/MessageActionItem.php | 19 + .../src/MessageType.php | 29 + .../src/MonikerClientCapabilities.php | 23 + .../src/PackageDescriptor.php | 26 + .../src/ParameterInformation.php | 45 + .../language-server-protocol/src/Position.php | 67 + .../src/PrepareSupportDefaultBehavior.php | 12 + .../PublishDiagnosticsClientCapabilities.php | 67 + ...iagnosticsClientCapabilitiesTagSupport.php | 23 + .../language-server-protocol/src/Range.php | 42 + .../src/ReferenceClientCapabilities.php | 18 + .../src/ReferenceContext.php | 19 + .../src/ReferenceInformation.php | 39 + .../RegularExpressionsClientCapabilities.php | 33 + .../src/RenameClientCapabilities.php | 68 + .../src/ResourceOperationKind.php | 24 + .../src/SaveOptions.php | 15 + .../src/SelectionRangeClientCapabilities.php | 22 + .../src/SemanticTokensClientCapabilities.php | 133 + ...manticTokensClientCapabilitiesRequests.php | 31 + ...anticTokensWorkspaceClientCapabilities.php | 24 + .../src/ServerCapabilities.php | 157 + .../src/ShowDocumentClientCapabilities.php | 19 + .../ShowMessageRequestClientCapabilities.php | 20 + ...estClientCapabilitiesMessageActionItem.php | 22 + .../src/SignatureHelp.php | 61 + .../src/SignatureHelpClientCapabilities.php | 43 + ...ClientCapabilitiesSignatureInformation.php | 50 + ...gnatureInformationParameterInformation.php | 24 + .../src/SignatureHelpOptions.php | 24 + .../src/SignatureInformation.php | 66 + .../src/SymbolDescriptor.php | 36 + .../src/SymbolInformation.php | 55 + .../src/SymbolKind.php | 28 + .../src/SymbolLocationInformation.php | 33 + .../src/SymbolTag.php | 16 + .../src/TextDocumentClientCapabilities.php | 265 + .../src/TextDocumentContentChangeEvent.php | 39 + .../src/TextDocumentIdentifier.php | 22 + .../src/TextDocumentItem.php | 50 + .../TextDocumentSyncClientCapabilities.php | 49 + .../src/TextDocumentSyncKind.php | 25 + .../src/TextDocumentSyncOptions.php | 41 + .../language-server-protocol/src/TextEdit.php | 31 + .../src/TokenFormat.php | 8 + .../src/TypeDefinitionClientCapabilities.php | 33 + .../src/VersionedTextDocumentIdentifier.php | 19 + .../src/WorkspaceEdit.php | 78 + .../src/WorkspaceEditClientCapabilities.php | 80 + ...entCapabilitiesChangeAnnotationSupport.php | 21 + .../src/WorkspaceFolder.php | 31 + .../src/WorkspaceSymbolClientCapabilities.php | 55 + ...SymbolClientCapabilitiesResolveSupport.php | 24 + ...paceSymbolClientCapabilitiesSymbolKind.php | 30 + ...paceSymbolClientCapabilitiesTagSupport.php | 30 + vendor/netresearch/jsonmapper/LICENSE | 47 + vendor/netresearch/jsonmapper/composer.json | 31 + .../netresearch/jsonmapper/contributing.rst | 13 + vendor/netresearch/jsonmapper/phpunit.xml | 18 + .../netresearch/jsonmapper/src/JsonMapper.php | 850 + .../jsonmapper/src/JsonMapper/Exception.php | 26 + vendor/nikic/php-parser/LICENSE | 29 + vendor/nikic/php-parser/README.md | 225 + vendor/nikic/php-parser/bin/php-parse | 205 + vendor/nikic/php-parser/composer.json | 41 + vendor/nikic/php-parser/grammar/README.md | 30 + .../nikic/php-parser/grammar/parser.template | 106 + vendor/nikic/php-parser/grammar/php5.y | 1036 + vendor/nikic/php-parser/grammar/php7.y | 1204 ++ vendor/nikic/php-parser/grammar/phpyLang.php | 184 + .../php-parser/grammar/rebuildParsers.php | 81 + .../nikic/php-parser/grammar/tokens.template | 17 + vendor/nikic/php-parser/grammar/tokens.y | 115 + .../php-parser/lib/PhpParser/Builder.php | 13 + .../lib/PhpParser/Builder/ClassConst.php | 132 + .../lib/PhpParser/Builder/Class_.php | 146 + .../lib/PhpParser/Builder/Declaration.php | 43 + .../lib/PhpParser/Builder/EnumCase.php | 85 + .../lib/PhpParser/Builder/Enum_.php | 117 + .../lib/PhpParser/Builder/FunctionLike.php | 73 + .../lib/PhpParser/Builder/Function_.php | 67 + .../lib/PhpParser/Builder/Interface_.php | 93 + .../lib/PhpParser/Builder/Method.php | 146 + .../lib/PhpParser/Builder/Namespace_.php | 45 + .../lib/PhpParser/Builder/Param.php | 122 + .../lib/PhpParser/Builder/Property.php | 161 + .../lib/PhpParser/Builder/TraitUse.php | 64 + .../PhpParser/Builder/TraitUseAdaptation.php | 148 + .../lib/PhpParser/Builder/Trait_.php | 78 + .../php-parser/lib/PhpParser/Builder/Use_.php | 49 + .../lib/PhpParser/BuilderFactory.php | 399 + .../lib/PhpParser/BuilderHelpers.php | 322 + .../php-parser/lib/PhpParser/Comment.php | 239 + .../php-parser/lib/PhpParser/Comment/Doc.php | 7 + .../ConstExprEvaluationException.php | 6 + .../lib/PhpParser/ConstExprEvaluator.php | 229 + .../nikic/php-parser/lib/PhpParser/Error.php | 180 + .../php-parser/lib/PhpParser/ErrorHandler.php | 13 + .../lib/PhpParser/ErrorHandler/Collecting.php | 46 + .../lib/PhpParser/ErrorHandler/Throwing.php | 18 + .../lib/PhpParser/Internal/DiffElem.php | 27 + .../lib/PhpParser/Internal/Differ.php | 164 + .../Internal/PrintableNewAnonClassNode.php | 61 + .../lib/PhpParser/Internal/TokenStream.php | 281 + .../php-parser/lib/PhpParser/JsonDecoder.php | 103 + .../nikic/php-parser/lib/PhpParser/Lexer.php | 560 + .../lib/PhpParser/Lexer/Emulative.php | 248 + .../Lexer/TokenEmulator/AttributeEmulator.php | 56 + .../CoaleseEqualTokenEmulator.php | 47 + .../Lexer/TokenEmulator/EnumTokenEmulator.php | 31 + .../TokenEmulator/ExplicitOctalEmulator.php | 44 + .../FlexibleDocStringEmulator.php | 76 + .../Lexer/TokenEmulator/FnTokenEmulator.php | 23 + .../Lexer/TokenEmulator/KeywordEmulator.php | 62 + .../TokenEmulator/MatchTokenEmulator.php | 23 + .../TokenEmulator/NullsafeTokenEmulator.php | 67 + .../NumericLiteralSeparatorEmulator.php | 105 + .../TokenEmulator/ReadonlyTokenEmulator.php | 23 + .../Lexer/TokenEmulator/ReverseEmulator.php | 36 + .../Lexer/TokenEmulator/TokenEmulator.php | 25 + .../php-parser/lib/PhpParser/NameContext.php | 285 + .../nikic/php-parser/lib/PhpParser/Node.php | 151 + .../php-parser/lib/PhpParser/Node/Arg.php | 46 + .../lib/PhpParser/Node/Attribute.php | 34 + .../lib/PhpParser/Node/AttributeGroup.php | 29 + .../lib/PhpParser/Node/ComplexType.php | 14 + .../php-parser/lib/PhpParser/Node/Const_.php | 37 + .../php-parser/lib/PhpParser/Node/Expr.php | 9 + .../lib/PhpParser/Node/Expr/ArrayDimFetch.php | 34 + .../lib/PhpParser/Node/Expr/ArrayItem.php | 41 + .../lib/PhpParser/Node/Expr/Array_.php | 34 + .../lib/PhpParser/Node/Expr/ArrowFunction.php | 79 + .../lib/PhpParser/Node/Expr/Assign.php | 34 + .../lib/PhpParser/Node/Expr/AssignOp.php | 30 + .../Node/Expr/AssignOp/BitwiseAnd.php | 12 + .../Node/Expr/AssignOp/BitwiseOr.php | 12 + .../Node/Expr/AssignOp/BitwiseXor.php | 12 + .../PhpParser/Node/Expr/AssignOp/Coalesce.php | 12 + .../PhpParser/Node/Expr/AssignOp/Concat.php | 12 + .../lib/PhpParser/Node/Expr/AssignOp/Div.php | 12 + .../PhpParser/Node/Expr/AssignOp/Minus.php | 12 + .../lib/PhpParser/Node/Expr/AssignOp/Mod.php | 12 + .../lib/PhpParser/Node/Expr/AssignOp/Mul.php | 12 + .../lib/PhpParser/Node/Expr/AssignOp/Plus.php | 12 + .../lib/PhpParser/Node/Expr/AssignOp/Pow.php | 12 + .../Node/Expr/AssignOp/ShiftLeft.php | 12 + .../Node/Expr/AssignOp/ShiftRight.php | 12 + .../lib/PhpParser/Node/Expr/AssignRef.php | 34 + .../lib/PhpParser/Node/Expr/BinaryOp.php | 40 + .../Node/Expr/BinaryOp/BitwiseAnd.php | 16 + .../Node/Expr/BinaryOp/BitwiseOr.php | 16 + .../Node/Expr/BinaryOp/BitwiseXor.php | 16 + .../Node/Expr/BinaryOp/BooleanAnd.php | 16 + .../Node/Expr/BinaryOp/BooleanOr.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Coalesce.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Concat.php | 16 + .../lib/PhpParser/Node/Expr/BinaryOp/Div.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Equal.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Greater.php | 16 + .../Node/Expr/BinaryOp/GreaterOrEqual.php | 16 + .../Node/Expr/BinaryOp/Identical.php | 16 + .../Node/Expr/BinaryOp/LogicalAnd.php | 16 + .../Node/Expr/BinaryOp/LogicalOr.php | 16 + .../Node/Expr/BinaryOp/LogicalXor.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Minus.php | 16 + .../lib/PhpParser/Node/Expr/BinaryOp/Mod.php | 16 + .../lib/PhpParser/Node/Expr/BinaryOp/Mul.php | 16 + .../PhpParser/Node/Expr/BinaryOp/NotEqual.php | 16 + .../Node/Expr/BinaryOp/NotIdentical.php | 16 + .../lib/PhpParser/Node/Expr/BinaryOp/Plus.php | 16 + .../lib/PhpParser/Node/Expr/BinaryOp/Pow.php | 16 + .../Node/Expr/BinaryOp/ShiftLeft.php | 16 + .../Node/Expr/BinaryOp/ShiftRight.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Smaller.php | 16 + .../Node/Expr/BinaryOp/SmallerOrEqual.php | 16 + .../Node/Expr/BinaryOp/Spaceship.php | 16 + .../lib/PhpParser/Node/Expr/BitwiseNot.php | 30 + .../lib/PhpParser/Node/Expr/BooleanNot.php | 30 + .../lib/PhpParser/Node/Expr/CallLike.php | 39 + .../lib/PhpParser/Node/Expr/Cast.php | 26 + .../lib/PhpParser/Node/Expr/Cast/Array_.php | 12 + .../lib/PhpParser/Node/Expr/Cast/Bool_.php | 12 + .../lib/PhpParser/Node/Expr/Cast/Double.php | 17 + .../lib/PhpParser/Node/Expr/Cast/Int_.php | 12 + .../lib/PhpParser/Node/Expr/Cast/Object_.php | 12 + .../lib/PhpParser/Node/Expr/Cast/String_.php | 12 + .../lib/PhpParser/Node/Expr/Cast/Unset_.php | 12 + .../PhpParser/Node/Expr/ClassConstFetch.php | 36 + .../lib/PhpParser/Node/Expr/Clone_.php | 30 + .../lib/PhpParser/Node/Expr/Closure.php | 79 + .../lib/PhpParser/Node/Expr/ClosureUse.php | 34 + .../lib/PhpParser/Node/Expr/ConstFetch.php | 31 + .../lib/PhpParser/Node/Expr/Empty_.php | 30 + .../lib/PhpParser/Node/Expr/Error.php | 31 + .../lib/PhpParser/Node/Expr/ErrorSuppress.php | 30 + .../lib/PhpParser/Node/Expr/Eval_.php | 30 + .../lib/PhpParser/Node/Expr/Exit_.php | 34 + .../lib/PhpParser/Node/Expr/FuncCall.php | 39 + .../lib/PhpParser/Node/Expr/Include_.php | 39 + .../lib/PhpParser/Node/Expr/Instanceof_.php | 35 + .../lib/PhpParser/Node/Expr/Isset_.php | 30 + .../lib/PhpParser/Node/Expr/List_.php | 30 + .../lib/PhpParser/Node/Expr/Match_.php | 31 + .../lib/PhpParser/Node/Expr/MethodCall.php | 45 + .../lib/PhpParser/Node/Expr/New_.php | 41 + .../Node/Expr/NullsafeMethodCall.php | 45 + .../Node/Expr/NullsafePropertyFetch.php | 35 + .../lib/PhpParser/Node/Expr/PostDec.php | 30 + .../lib/PhpParser/Node/Expr/PostInc.php | 30 + .../lib/PhpParser/Node/Expr/PreDec.php | 30 + .../lib/PhpParser/Node/Expr/PreInc.php | 30 + .../lib/PhpParser/Node/Expr/Print_.php | 30 + .../lib/PhpParser/Node/Expr/PropertyFetch.php | 35 + .../lib/PhpParser/Node/Expr/ShellExec.php | 30 + .../lib/PhpParser/Node/Expr/StaticCall.php | 46 + .../Node/Expr/StaticPropertyFetch.php | 36 + .../lib/PhpParser/Node/Expr/Ternary.php | 38 + .../lib/PhpParser/Node/Expr/Throw_.php | 30 + .../lib/PhpParser/Node/Expr/UnaryMinus.php | 30 + .../lib/PhpParser/Node/Expr/UnaryPlus.php | 30 + .../lib/PhpParser/Node/Expr/Variable.php | 30 + .../lib/PhpParser/Node/Expr/YieldFrom.php | 30 + .../lib/PhpParser/Node/Expr/Yield_.php | 34 + .../lib/PhpParser/Node/FunctionLike.php | 43 + .../lib/PhpParser/Node/Identifier.php | 75 + .../lib/PhpParser/Node/IntersectionType.php | 30 + .../lib/PhpParser/Node/MatchArm.php | 31 + .../php-parser/lib/PhpParser/Node/Name.php | 242 + .../PhpParser/Node/Name/FullyQualified.php | 50 + .../lib/PhpParser/Node/Name/Relative.php | 50 + .../lib/PhpParser/Node/NullableType.php | 28 + .../php-parser/lib/PhpParser/Node/Param.php | 60 + .../php-parser/lib/PhpParser/Node/Scalar.php | 7 + .../lib/PhpParser/Node/Scalar/DNumber.php | 81 + .../lib/PhpParser/Node/Scalar/Encapsed.php | 31 + .../Node/Scalar/EncapsedStringPart.php | 30 + .../lib/PhpParser/Node/Scalar/LNumber.php | 80 + .../lib/PhpParser/Node/Scalar/MagicConst.php | 28 + .../Node/Scalar/MagicConst/Class_.php | 16 + .../PhpParser/Node/Scalar/MagicConst/Dir.php | 16 + .../PhpParser/Node/Scalar/MagicConst/File.php | 16 + .../Node/Scalar/MagicConst/Function_.php | 16 + .../PhpParser/Node/Scalar/MagicConst/Line.php | 16 + .../Node/Scalar/MagicConst/Method.php | 16 + .../Node/Scalar/MagicConst/Namespace_.php | 16 + .../Node/Scalar/MagicConst/Trait_.php | 16 + .../lib/PhpParser/Node/Scalar/String_.php | 157 + .../php-parser/lib/PhpParser/Node/Stmt.php | 9 + .../lib/PhpParser/Node/Stmt/Break_.php | 30 + .../lib/PhpParser/Node/Stmt/Case_.php | 34 + .../lib/PhpParser/Node/Stmt/Catch_.php | 41 + .../lib/PhpParser/Node/Stmt/ClassConst.php | 80 + .../lib/PhpParser/Node/Stmt/ClassLike.php | 109 + .../lib/PhpParser/Node/Stmt/ClassMethod.php | 159 + .../lib/PhpParser/Node/Stmt/Class_.php | 137 + .../lib/PhpParser/Node/Stmt/Const_.php | 30 + .../lib/PhpParser/Node/Stmt/Continue_.php | 30 + .../PhpParser/Node/Stmt/DeclareDeclare.php | 34 + .../lib/PhpParser/Node/Stmt/Declare_.php | 34 + .../lib/PhpParser/Node/Stmt/Do_.php | 34 + .../lib/PhpParser/Node/Stmt/Echo_.php | 30 + .../lib/PhpParser/Node/Stmt/ElseIf_.php | 34 + .../lib/PhpParser/Node/Stmt/Else_.php | 30 + .../lib/PhpParser/Node/Stmt/EnumCase.php | 37 + .../lib/PhpParser/Node/Stmt/Enum_.php | 40 + .../lib/PhpParser/Node/Stmt/Expression.php | 33 + .../lib/PhpParser/Node/Stmt/Finally_.php | 30 + .../lib/PhpParser/Node/Stmt/For_.php | 43 + .../lib/PhpParser/Node/Stmt/Foreach_.php | 47 + .../lib/PhpParser/Node/Stmt/Function_.php | 77 + .../lib/PhpParser/Node/Stmt/Global_.php | 30 + .../lib/PhpParser/Node/Stmt/Goto_.php | 31 + .../lib/PhpParser/Node/Stmt/GroupUse.php | 39 + .../lib/PhpParser/Node/Stmt/HaltCompiler.php | 30 + .../lib/PhpParser/Node/Stmt/If_.php | 43 + .../lib/PhpParser/Node/Stmt/InlineHTML.php | 30 + .../lib/PhpParser/Node/Stmt/Interface_.php | 37 + .../lib/PhpParser/Node/Stmt/Label.php | 31 + .../lib/PhpParser/Node/Stmt/Namespace_.php | 38 + .../lib/PhpParser/Node/Stmt/Nop.php | 17 + .../lib/PhpParser/Node/Stmt/Property.php | 91 + .../PhpParser/Node/Stmt/PropertyProperty.php | 34 + .../lib/PhpParser/Node/Stmt/Return_.php | 30 + .../lib/PhpParser/Node/Stmt/StaticVar.php | 37 + .../lib/PhpParser/Node/Stmt/Static_.php | 30 + .../lib/PhpParser/Node/Stmt/Switch_.php | 34 + .../lib/PhpParser/Node/Stmt/Throw_.php | 30 + .../lib/PhpParser/Node/Stmt/TraitUse.php | 34 + .../Node/Stmt/TraitUseAdaptation.php | 13 + .../Node/Stmt/TraitUseAdaptation/Alias.php | 38 + .../Stmt/TraitUseAdaptation/Precedence.php | 34 + .../lib/PhpParser/Node/Stmt/Trait_.php | 32 + .../lib/PhpParser/Node/Stmt/TryCatch.php | 38 + .../lib/PhpParser/Node/Stmt/Unset_.php | 30 + .../lib/PhpParser/Node/Stmt/UseUse.php | 52 + .../lib/PhpParser/Node/Stmt/Use_.php | 47 + .../lib/PhpParser/Node/Stmt/While_.php | 34 + .../lib/PhpParser/Node/UnionType.php | 28 + .../lib/PhpParser/Node/VarLikeIdentifier.php | 17 + .../PhpParser/Node/VariadicPlaceholder.php | 27 + .../php-parser/lib/PhpParser/NodeAbstract.php | 178 + .../php-parser/lib/PhpParser/NodeDumper.php | 206 + .../php-parser/lib/PhpParser/NodeFinder.php | 81 + .../lib/PhpParser/NodeTraverser.php | 291 + .../lib/PhpParser/NodeTraverserInterface.php | 29 + .../php-parser/lib/PhpParser/NodeVisitor.php | 72 + .../PhpParser/NodeVisitor/CloningVisitor.php | 20 + .../PhpParser/NodeVisitor/FindingVisitor.php | 48 + .../NodeVisitor/FirstFindingVisitor.php | 50 + .../PhpParser/NodeVisitor/NameResolver.php | 257 + .../NodeVisitor/NodeConnectingVisitor.php | 52 + .../NodeVisitor/ParentConnectingVisitor.php | 41 + .../lib/PhpParser/NodeVisitorAbstract.php | 25 + .../nikic/php-parser/lib/PhpParser/Parser.php | 18 + .../lib/PhpParser/Parser/Multiple.php | 55 + .../php-parser/lib/PhpParser/Parser/Php5.php | 2672 +++ .../php-parser/lib/PhpParser/Parser/Php7.php | 2829 +++ .../lib/PhpParser/Parser/Tokens.php | 148 + .../lib/PhpParser/ParserAbstract.php | 1038 + .../lib/PhpParser/ParserFactory.php | 44 + .../lib/PhpParser/PrettyPrinter/Standard.php | 1105 + .../lib/PhpParser/PrettyPrinterAbstract.php | 1506 ++ vendor/openlss/lib-array2xml/.gitignore | 3 + vendor/openlss/lib-array2xml/COPYING | 674 + vendor/openlss/lib-array2xml/COPYING LESSER | 165 + .../openlss/lib-array2xml/LSS/Array2XML.php | 209 + .../openlss/lib-array2xml/LSS/XML2Array.php | 173 + vendor/openlss/lib-array2xml/README.md | 72 + vendor/openlss/lib-array2xml/composer.json | 33 + .../reflection-common/.github/dependabot.yml | 7 + .../.github/workflows/push.yml | 223 + .../phpdocumentor/reflection-common/LICENSE | 22 + .../phpdocumentor/reflection-common/README.md | 11 + .../reflection-common/composer.json | 28 + .../reflection-common/src/Element.php | 30 + .../reflection-common/src/File.php | 35 + .../reflection-common/src/Fqsen.php | 89 + .../reflection-common/src/Location.php | 53 + .../reflection-common/src/Project.php | 25 + .../reflection-common/src/ProjectFactory.php | 28 + .../phpdocumentor/reflection-docblock/LICENSE | 21 + .../reflection-docblock/README.md | 75 + .../reflection-docblock/composer.json | 42 + .../reflection-docblock/src/DocBlock.php | 228 + .../src/DocBlock/Description.php | 115 + .../src/DocBlock/DescriptionFactory.php | 178 + .../src/DocBlock/ExampleFinder.php | 159 + .../src/DocBlock/Serializer.php | 157 + .../src/DocBlock/StandardTagFactory.php | 348 + .../reflection-docblock/src/DocBlock/Tag.php | 31 + .../src/DocBlock/TagFactory.php | 84 + .../src/DocBlock/Tags/Author.php | 102 + .../src/DocBlock/Tags/BaseTag.php | 53 + .../src/DocBlock/Tags/Covers.php | 101 + .../src/DocBlock/Tags/Deprecated.php | 109 + .../src/DocBlock/Tags/Example.php | 200 + .../DocBlock/Tags/Factory/StaticMethod.php | 25 + .../src/DocBlock/Tags/Formatter.php | 24 + .../Tags/Formatter/AlignFormatter.php | 50 + .../Tags/Formatter/PassthroughFormatter.php | 30 + .../src/DocBlock/Tags/Generic.php | 89 + .../src/DocBlock/Tags/InvalidTag.php | 145 + .../src/DocBlock/Tags/Link.php | 78 + .../src/DocBlock/Tags/Method.php | 279 + .../src/DocBlock/Tags/Param.php | 174 + .../src/DocBlock/Tags/Property.php | 121 + .../src/DocBlock/Tags/PropertyRead.php | 121 + .../src/DocBlock/Tags/PropertyWrite.php | 121 + .../src/DocBlock/Tags/Reference/Fqsen.php | 38 + .../src/DocBlock/Tags/Reference/Reference.php | 22 + .../src/DocBlock/Tags/Reference/Url.php | 36 + .../src/DocBlock/Tags/Return_.php | 64 + .../src/DocBlock/Tags/See.php | 106 + .../src/DocBlock/Tags/Since.php | 103 + .../src/DocBlock/Tags/Source.php | 116 + .../src/DocBlock/Tags/TagWithType.php | 66 + .../src/DocBlock/Tags/Throws.php | 64 + .../src/DocBlock/Tags/Uses.php | 100 + .../src/DocBlock/Tags/Var_.php | 122 + .../src/DocBlock/Tags/Version.php | 106 + .../src/DocBlockFactory.php | 287 + .../src/DocBlockFactoryInterface.php | 23 + .../src/Exception/PcreException.php | 44 + .../reflection-docblock/src/Utils.php | 62 + vendor/phpdocumentor/type-resolver/LICENSE | 21 + vendor/phpdocumentor/type-resolver/README.md | 177 + .../phpdocumentor/type-resolver/composer.json | 35 + .../type-resolver/src/FqsenResolver.php | 80 + .../type-resolver/src/PseudoType.php | 19 + .../src/PseudoTypes/CallableString.php | 39 + .../type-resolver/src/PseudoTypes/False_.php | 40 + .../src/PseudoTypes/HtmlEscapedString.php | 39 + .../src/PseudoTypes/IntegerRange.php | 61 + .../type-resolver/src/PseudoTypes/List_.php | 50 + .../src/PseudoTypes/LiteralString.php | 39 + .../src/PseudoTypes/LowercaseString.php | 39 + .../src/PseudoTypes/NegativeInteger.php | 39 + .../PseudoTypes/NonEmptyLowercaseString.php | 39 + .../src/PseudoTypes/NonEmptyString.php | 39 + .../src/PseudoTypes/NumericString.php | 39 + .../src/PseudoTypes/Numeric_.php | 47 + .../src/PseudoTypes/PositiveInteger.php | 39 + .../src/PseudoTypes/TraitString.php | 39 + .../type-resolver/src/PseudoTypes/True_.php | 40 + .../phpdocumentor/type-resolver/src/Type.php | 25 + .../type-resolver/src/TypeResolver.php | 700 + .../type-resolver/src/Types/AbstractList.php | 83 + .../src/Types/AggregatedType.php | 125 + .../type-resolver/src/Types/ArrayKey.php | 42 + .../type-resolver/src/Types/Array_.php | 29 + .../type-resolver/src/Types/Boolean.php | 32 + .../type-resolver/src/Types/Callable_.php | 32 + .../type-resolver/src/Types/ClassString.php | 62 + .../type-resolver/src/Types/Collection.php | 68 + .../type-resolver/src/Types/Compound.php | 38 + .../type-resolver/src/Types/Context.php | 95 + .../src/Types/ContextFactory.php | 420 + .../type-resolver/src/Types/Expression.php | 51 + .../type-resolver/src/Types/Float_.php | 32 + .../type-resolver/src/Types/Integer.php | 32 + .../src/Types/InterfaceString.php | 56 + .../type-resolver/src/Types/Intersection.php | 37 + .../type-resolver/src/Types/Iterable_.php | 38 + .../type-resolver/src/Types/Mixed_.php | 32 + .../type-resolver/src/Types/Never_.php | 35 + .../type-resolver/src/Types/Null_.php | 32 + .../type-resolver/src/Types/Nullable.php | 51 + .../type-resolver/src/Types/Object_.php | 69 + .../type-resolver/src/Types/Parent_.php | 34 + .../type-resolver/src/Types/Resource_.php | 32 + .../type-resolver/src/Types/Scalar.php | 32 + .../type-resolver/src/Types/Self_.php | 34 + .../type-resolver/src/Types/Static_.php | 39 + .../type-resolver/src/Types/String_.php | 32 + .../type-resolver/src/Types/This.php | 35 + .../type-resolver/src/Types/Void_.php | 35 + vendor/psr/log/LICENSE | 19 + vendor/psr/log/Psr/Log/AbstractLogger.php | 128 + .../log/Psr/Log/InvalidArgumentException.php | 7 + vendor/psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 + vendor/psr/log/Psr/Log/LoggerAwareTrait.php | 26 + vendor/psr/log/Psr/Log/LoggerInterface.php | 125 + vendor/psr/log/Psr/Log/LoggerTrait.php | 142 + vendor/psr/log/Psr/Log/NullLogger.php | 30 + vendor/psr/log/Psr/Log/Test/DummyTest.php | 18 + .../log/Psr/Log/Test/LoggerInterfaceTest.php | 138 + vendor/psr/log/Psr/Log/Test/TestLogger.php | 147 + vendor/psr/log/README.md | 58 + vendor/psr/log/composer.json | 26 + vendor/sebastian/diff/ChangeLog.md | 88 + vendor/sebastian/diff/LICENSE | 33 + vendor/sebastian/diff/README.md | 202 + vendor/sebastian/diff/composer.json | 47 + vendor/sebastian/diff/src/Chunk.php | 89 + vendor/sebastian/diff/src/Diff.php | 64 + vendor/sebastian/diff/src/Differ.php | 327 + .../src/Exception/ConfigurationException.php | 38 + .../diff/src/Exception/Exception.php | 16 + .../Exception/InvalidArgumentException.php | 14 + vendor/sebastian/diff/src/Line.php | 45 + .../LongestCommonSubsequenceCalculator.php | 18 + ...ientLongestCommonSubsequenceCalculator.php | 88 + .../src/Output/AbstractChunkOutputBuilder.php | 52 + .../diff/src/Output/DiffOnlyOutputBuilder.php | 72 + .../src/Output/DiffOutputBuilderInterface.php | 19 + .../Output/StrictUnifiedDiffOutputBuilder.php | 338 + .../src/Output/UnifiedDiffOutputBuilder.php | 272 + vendor/sebastian/diff/src/Parser.php | 110 + ...ientLongestCommonSubsequenceCalculator.php | 70 + vendor/vimeo/psalm/LICENSE | 21 + vendor/vimeo/psalm/composer.json | 134 + vendor/vimeo/psalm/config.xsd | 708 + vendor/vimeo/psalm/dictionaries/CallMap.php | 16820 ++++++++++++++++ .../psalm/dictionaries/CallMap_71_delta.php | 76 + .../psalm/dictionaries/CallMap_72_delta.php | 230 + .../psalm/dictionaries/CallMap_73_delta.php | 72 + .../psalm/dictionaries/CallMap_74_delta.php | 50 + .../psalm/dictionaries/CallMap_80_delta.php | 1683 ++ .../psalm/dictionaries/CallMap_81_delta.php | 1133 ++ .../psalm/dictionaries/CallMap_historical.php | 16618 +++++++++++++++ .../dictionaries/InternalTaintSinkMap.php | 65 + .../vimeo/psalm/dictionaries/PropertyMap.php | 542 + vendor/vimeo/psalm/psalm | 7 + vendor/vimeo/psalm/psalm-language-server | 7 + vendor/vimeo/psalm/psalm-plugin | 7 + vendor/vimeo/psalm/psalm-refactor | 7 + vendor/vimeo/psalm/psalter | 7 + vendor/vimeo/psalm/src/Psalm/Aliases.php | 74 + vendor/vimeo/psalm/src/Psalm/CodeLocation.php | 392 + .../CodeLocation/DocblockTypeLocation.php | 30 + .../Psalm/CodeLocation/ParseErrorLocation.php | 35 + .../psalm/src/Psalm/CodeLocation/Raw.php | 33 + vendor/vimeo/psalm/src/Psalm/Codebase.php | 2013 ++ vendor/vimeo/psalm/src/Psalm/Config.php | 2403 +++ .../vimeo/psalm/src/Psalm/Config/Creator.php | 296 + .../src/Psalm/Config/ErrorLevelFileFilter.php | 68 + .../psalm/src/Psalm/Config/FileFilter.php | 559 + .../psalm/src/Psalm/Config/IssueHandler.php | 174 + .../src/Psalm/Config/ProjectFileFilter.php | 95 + .../Psalm/Config/TaintAnalysisFileFilter.php | 7 + vendor/vimeo/psalm/src/Psalm/Context.php | 855 + vendor/vimeo/psalm/src/Psalm/DocComment.php | 245 + .../vimeo/psalm/src/Psalm/ErrorBaseline.php | 331 + .../Exception/CircularReferenceException.php | 9 + .../src/Psalm/Exception/CodeException.php | 9 + .../ComplicatedExpressionException.php | 9 + .../Exception/ConfigCreationException.php | 9 + .../src/Psalm/Exception/ConfigException.php | 9 + .../Exception/ConfigNotFoundException.php | 7 + .../Exception/DocblockParseException.php | 9 + .../Psalm/Exception/FileIncludeException.php | 9 + .../Exception/IncorrectDocblockException.php | 7 + .../InvalidClasslikeOverrideException.php | 9 + .../InvalidMethodOverrideException.php | 9 + .../src/Psalm/Exception/RefactorException.php | 9 + .../Exception/ScopeAnalysisException.php | 9 + .../Exception/TypeParseTreeException.php | 9 + .../Exception/UnanalyzedFileException.php | 9 + .../UnpopulatedClasslikeException.php | 16 + .../Exception/UnpreparedAnalysisException.php | 9 + .../UnsupportedIssueToFixException.php | 10 + .../src/Psalm/FileBasedPluginAdapter.php | 70 + .../psalm/src/Psalm/FileManipulation.php | 83 + vendor/vimeo/psalm/src/Psalm/FileSource.php | 16 + .../psalm/src/Psalm/Internal/Algebra.php | 630 + .../Internal/Algebra/FormulaGenerator.php | 457 + .../Internal/Analyzer/AlgebraAnalyzer.php | 174 + .../Internal/Analyzer/AttributesAnalyzer.php | 394 + .../src/Psalm/Internal/Analyzer/CanAlias.php | 162 + .../Psalm/Internal/Analyzer/ClassAnalyzer.php | 2638 +++ .../Internal/Analyzer/ClassLikeAnalyzer.php | 648 + .../Analyzer/ClassLikeNameOptions.php | 40 + .../Internal/Analyzer/ClosureAnalyzer.php | 343 + .../Internal/Analyzer/CommentAnalyzer.php | 391 + .../Internal/Analyzer/DataFlowNodeData.php | 90 + .../Psalm/Internal/Analyzer/FileAnalyzer.php | 682 + .../Internal/Analyzer/FunctionAnalyzer.php | 124 + .../FunctionLike/ReturnTypeAnalyzer.php | 978 + .../FunctionLike/ReturnTypeCollector.php | 384 + .../Analyzer/FunctionLikeAnalyzer.php | 2023 ++ .../Internal/Analyzer/InterfaceAnalyzer.php | 147 + .../src/Psalm/Internal/Analyzer/IssueData.php | 175 + .../Internal/Analyzer/MethodAnalyzer.php | 290 + .../Internal/Analyzer/MethodComparator.php | 1080 + .../Internal/Analyzer/NamespaceAnalyzer.php | 280 + .../Internal/Analyzer/ProjectAnalyzer.php | 1527 ++ .../Psalm/Internal/Analyzer/ScopeAnalyzer.php | 529 + .../Internal/Analyzer/SourceAnalyzer.php | 182 + .../Analyzer/Statements/Block/DoAnalyzer.php | 210 + .../Analyzer/Statements/Block/ForAnalyzer.php | 190 + .../Statements/Block/ForeachAnalyzer.php | 1149 ++ .../Block/IfConditionalAnalyzer.php | 377 + .../Statements/Block/IfElse/ElseAnalyzer.php | 242 + .../Block/IfElse/ElseIfAnalyzer.php | 439 + .../Statements/Block/IfElse/IfAnalyzer.php | 532 + .../Statements/Block/IfElseAnalyzer.php | 509 + .../Statements/Block/LoopAnalyzer.php | 735 + .../Statements/Block/SwitchAnalyzer.php | 234 + .../Statements/Block/SwitchCaseAnalyzer.php | 769 + .../Analyzer/Statements/Block/TryAnalyzer.php | 516 + .../Statements/Block/WhileAnalyzer.php | 139 + .../Analyzer/Statements/BreakAnalyzer.php | 95 + .../Analyzer/Statements/ContinueAnalyzer.php | 100 + .../Analyzer/Statements/EchoAnalyzer.php | 135 + .../Statements/Expression/ArrayAnalyzer.php | 607 + .../Expression/ArrayCreationInfo.php | 55 + .../Statements/Expression/AssertionFinder.php | 4122 ++++ .../Assignment/ArrayAssignmentAnalyzer.php | 1027 + .../Assignment/AssignedProperty.php | 33 + .../InstancePropertyAssignmentAnalyzer.php | 1540 ++ .../StaticPropertyAssignmentAnalyzer.php | 342 + .../Expression/AssignmentAnalyzer.php | 1728 ++ .../Expression/BinaryOp/AndAnalyzer.php | 232 + .../BinaryOp/ArithmeticOpAnalyzer.php | 1373 ++ .../Expression/BinaryOp/CoalesceAnalyzer.php | 89 + .../Expression/BinaryOp/ConcatAnalyzer.php | 432 + .../BinaryOp/NonComparisonOpAnalyzer.php | 134 + .../Expression/BinaryOp/OrAnalyzer.php | 411 + .../Expression/BinaryOpAnalyzer.php | 530 + .../Expression/BitwiseNotAnalyzer.php | 124 + .../Expression/BooleanNotAnalyzer.php | 46 + .../Expression/Call/ArgumentAnalyzer.php | 1629 ++ .../Expression/Call/ArgumentMapPopulator.php | 142 + .../Expression/Call/ArgumentsAnalyzer.php | 1620 ++ .../Call/ArrayFunctionArgumentsAnalyzer.php | 957 + .../Call/ClassTemplateParamCollector.php | 282 + .../Expression/Call/FunctionCallAnalyzer.php | 1129 ++ .../Expression/Call/FunctionCallInfo.php | 87 + .../Call/FunctionCallReturnTypeFetcher.php | 861 + .../Call/Method/AtomicCallContext.php | 22 + .../Method/AtomicMethodCallAnalysisResult.php | 89 + .../Call/Method/AtomicMethodCallAnalyzer.php | 890 + .../ExistingAtomicMethodCallAnalyzer.php | 673 + .../Method/MethodCallProhibitionAnalyzer.php | 70 + .../Call/Method/MethodCallPurityAnalyzer.php | 173 + .../Method/MethodCallReturnTypeFetcher.php | 634 + .../Call/Method/MethodVisibilityAnalyzer.php | 196 + .../Call/Method/MissingMethodCallHandler.php | 454 + .../Expression/Call/MethodCallAnalyzer.php | 437 + .../Call/NamedFunctionCallHandler.php | 586 + .../Expression/Call/NewAnalyzer.php | 866 + .../Expression/Call/StaticCallAnalyzer.php | 382 + .../StaticMethod/AtomicStaticCallAnalyzer.php | 1136 ++ .../ExistingAtomicStaticCallAnalyzer.php | 642 + .../Statements/Expression/CallAnalyzer.php | 1171 ++ .../Statements/Expression/CastAnalyzer.php | 538 + .../Statements/Expression/CloneAnalyzer.php | 148 + .../Statements/Expression/EmptyAnalyzer.php | 52 + .../Expression/EncapsulatedStringAnalyzer.php | 142 + .../Statements/Expression/EvalAnalyzer.php | 85 + .../Statements/Expression/ExitAnalyzer.php | 145 + .../Expression/ExpressionIdentifier.php | 224 + .../Expression/Fetch/ArrayFetchAnalyzer.php | 2060 ++ .../Fetch/AtomicPropertyFetchAnalyzer.php | 1217 ++ .../Fetch/ClassConstFetchAnalyzer.php | 679 + .../Expression/Fetch/ConstFetchAnalyzer.php | 309 + .../Fetch/InstancePropertyFetchAnalyzer.php | 482 + .../Fetch/StaticPropertyFetchAnalyzer.php | 486 + .../Fetch/VariableFetchAnalyzer.php | 559 + .../Expression/IncDecExpressionAnalyzer.php | 138 + .../Statements/Expression/IncludeAnalyzer.php | 423 + .../Expression/InstanceofAnalyzer.php | 95 + .../Statements/Expression/IssetAnalyzer.php | 49 + .../Expression/MagicConstAnalyzer.php | 107 + .../Statements/Expression/MatchAnalyzer.php | 351 + .../Expression/NullsafeAnalyzer.php | 98 + .../Statements/Expression/PrintAnalyzer.php | 109 + .../Expression/SimpleTypeInferer.php | 760 + .../Statements/Expression/TernaryAnalyzer.php | 306 + .../Expression/UnaryPlusMinusAnalyzer.php | 134 + .../Statements/Expression/YieldAnalyzer.php | 219 + .../Expression/YieldFromAnalyzer.php | 82 + .../Statements/ExpressionAnalyzer.php | 514 + .../Analyzer/Statements/GlobalAnalyzer.php | 83 + .../Analyzer/Statements/ReturnAnalyzer.php | 658 + .../Analyzer/Statements/StaticAnalyzer.php | 188 + .../Analyzer/Statements/ThrowAnalyzer.php | 93 + .../Analyzer/Statements/UnsetAnalyzer.php | 138 + .../Statements/UnusedAssignmentRemover.php | 357 + .../Internal/Analyzer/StatementsAnalyzer.php | 1076 + .../Psalm/Internal/Analyzer/TraitAnalyzer.php | 76 + .../Psalm/Internal/Analyzer/TypeAnalyzer.php | 118 + .../vimeo/psalm/src/Psalm/Internal/Clause.php | 295 + .../src/Psalm/Internal/Cli/LanguageServer.php | 323 + .../psalm/src/Psalm/Internal/Cli/Plugin.php | 46 + .../psalm/src/Psalm/Internal/Cli/Psalm.php | 1176 ++ .../psalm/src/Psalm/Internal/Cli/Psalter.php | 578 + .../psalm/src/Psalm/Internal/Cli/Refactor.php | 330 + .../psalm/src/Psalm/Internal/CliUtils.php | 665 + .../src/Psalm/Internal/Codebase/Analyzer.php | 1644 ++ .../ClassConstantByWildcardResolver.php | 61 + .../Psalm/Internal/Codebase/ClassLikes.php | 2331 +++ .../Codebase/ConstantTypeResolver.php | 363 + .../Psalm/Internal/Codebase/DataFlowGraph.php | 159 + .../src/Psalm/Internal/Codebase/Functions.php | 603 + .../Codebase/InternalCallMapHandler.php | 437 + .../src/Psalm/Internal/Codebase/Methods.php | 1255 ++ .../src/Psalm/Internal/Codebase/Populator.php | 1224 ++ .../Psalm/Internal/Codebase/Properties.php | 356 + .../Psalm/Internal/Codebase/PropertyMap.php | 46 + .../Codebase/ReferenceMapGenerator.php | 61 + .../Psalm/Internal/Codebase/Reflection.php | 548 + .../src/Psalm/Internal/Codebase/Scanner.php | 811 + .../Internal/Codebase/TaintFlowGraph.php | 524 + .../Internal/Codebase/VariableUseGraph.php | 224 + .../psalm/src/Psalm/Internal/Composer.php | 43 + .../Psalm/Internal/DataFlow/DataFlowNode.php | 137 + .../src/Psalm/Internal/DataFlow/Path.php | 33 + .../src/Psalm/Internal/DataFlow/TaintSink.php | 7 + .../Psalm/Internal/DataFlow/TaintSource.php | 7 + .../src/Psalm/Internal/Diff/AstDiffer.php | 129 + .../Internal/Diff/ClassStatementsDiffer.php | 251 + .../src/Psalm/Internal/Diff/DiffElem.php | 37 + .../src/Psalm/Internal/Diff/FileDiffer.php | 319 + .../Internal/Diff/FileStatementsDiffer.php | 172 + .../Diff/NamespaceStatementsDiffer.php | 144 + .../psalm/src/Psalm/Internal/ErrorHandler.php | 90 + .../src/Psalm/Internal/EventDispatcher.php | 621 + .../BuildInfoCollector.php | 321 + .../ExecutionEnvironment/GitInfoCollector.php | 142 + .../SystemCommandExecutor.php | 42 + .../ClassDocblockManipulator.php | 141 + .../FileManipulation/CodeMigration.php | 38 + .../FileManipulationBuffer.php | 245 + .../FunctionDocblockManipulator.php | 579 + .../PropertyDocblockManipulator.php | 281 + .../src/Psalm/Internal/Fork/ForkMessage.php | 7 + .../Internal/Fork/ForkProcessDoneMessage.php | 20 + .../Internal/Fork/ForkProcessErrorMessage.php | 17 + .../Internal/Fork/ForkTaskDoneMessage.php | 20 + .../psalm/src/Psalm/Internal/Fork/Pool.php | 492 + .../Psalm/Internal/Fork/PsalmRestarter.php | 68 + .../src/Psalm/Internal/IncludeCollector.php | 55 + .../psalm/src/Psalm/Internal/Json/Json.php | 46 + .../LanguageServer/Client/TextDocument.php | 79 + .../Internal/LanguageServer/ClientHandler.php | 111 + .../LanguageServer/EmitterInterface.php | 71 + .../Internal/LanguageServer/EmitterTrait.php | 157 + .../Internal/LanguageServer/IdGenerator.php | 25 + .../LanguageServer/LanguageClient.php | 64 + .../LanguageServer/LanguageServer.php | 575 + .../Psalm/Internal/LanguageServer/Message.php | 73 + .../LanguageServer/ProtocolReader.php | 15 + .../LanguageServer/ProtocolStreamReader.php | 148 + .../LanguageServer/ProtocolStreamWriter.php | 35 + .../LanguageServer/ProtocolWriter.php | 18 + .../LanguageServer/Server/TextDocument.php | 410 + .../LanguageServer/Server/Workspace.php | 78 + .../src/Psalm/Internal/MethodIdentifier.php | 70 + .../Internal/PhpTraverser/CustomTraverser.php | 174 + .../PhpVisitor/AssignmentMapVisitor.php | 117 + .../PhpVisitor/CheckTrivialExprVisitor.php | 80 + .../Internal/PhpVisitor/CloningVisitor.php | 40 + .../PhpVisitor/ConditionCloningVisitor.php | 39 + .../PhpVisitor/NodeCleanerVisitor.php | 28 + .../PhpVisitor/NodeCounterVisitor.php | 21 + .../PhpVisitor/OffsetShifterVisitor.php | 70 + .../PhpVisitor/ParamReplacementVisitor.php | 122 + .../PhpVisitor/PartialParserVisitor.php | 409 + .../Reflector/AttributeResolver.php | 80 + .../Reflector/ClassLikeDocblockParser.php | 562 + .../Reflector/ClassLikeNodeScanner.php | 1861 ++ .../Reflector/ExpressionResolver.php | 450 + .../Reflector/ExpressionScanner.php | 332 + .../Reflector/FunctionLikeDocblockParser.php | 697 + .../Reflector/FunctionLikeDocblockScanner.php | 1454 ++ .../Reflector/FunctionLikeNodeScanner.php | 1151 ++ .../PhpVisitor/Reflector/TypeHintResolver.php | 111 + .../Internal/PhpVisitor/ReflectorVisitor.php | 650 + .../PhpVisitor/ShortClosureVisitor.php | 35 + .../PhpVisitor/SimpleNameResolver.php | 252 + .../Psalm/Internal/PhpVisitor/TraitFinder.php | 84 + .../PhpVisitor/TypeMappingVisitor.php | 41 + .../PluginManager/Command/DisableCommand.php | 86 + .../PluginManager/Command/EnableCommand.php | 86 + .../PluginManager/Command/ShowCommand.php | 98 + .../Internal/PluginManager/ComposerLock.php | 111 + .../Internal/PluginManager/ConfigFile.php | 152 + .../Internal/PluginManager/PluginList.php | 120 + .../PluginManager/PluginListFactory.php | 76 + .../AddRemoveTaints/HtmlFunctionTainter.php | 115 + .../ClassLikeStorageCacheProvider.php | 182 + .../Provider/ClassLikeStorageProvider.php | 138 + .../Internal/Provider/FakeFileProvider.php | 75 + .../Psalm/Internal/Provider/FileProvider.php | 163 + .../Provider/FileReferenceCacheProvider.php | 1007 + .../Provider/FileReferenceProvider.php | 1320 ++ .../Provider/FileStorageCacheProvider.php | 184 + .../Internal/Provider/FileStorageProvider.php | 131 + .../Provider/FunctionExistenceProvider.php | 117 + .../Provider/FunctionParamsProvider.php | 139 + .../Provider/FunctionReturnTypeProvider.php | 205 + .../Provider/MethodExistenceProvider.php | 126 + .../Provider/MethodParamsProvider.php | 148 + .../Provider/MethodReturnTypeProvider.php | 170 + .../Provider/MethodVisibilityProvider.php | 133 + .../Internal/Provider/NodeDataProvider.php | 133 + .../Internal/Provider/ParserCacheProvider.php | 399 + .../Provider/ProjectCacheProvider.php | 141 + .../Provider/PropertyExistenceProvider.php | 138 + .../Provider/PropertyTypeProvider.php | 140 + .../DomDocumentPropertyTypeProvider.php | 33 + .../Provider/PropertyVisibilityProvider.php | 138 + .../src/Psalm/Internal/Provider/Providers.php | 66 + .../ArrayChunkReturnTypeProvider.php | 55 + .../ArrayColumnReturnTypeProvider.php | 142 + .../ArrayFillReturnTypeProvider.php | 111 + .../ArrayFilterReturnTypeProvider.php | 331 + .../ArrayMapReturnTypeProvider.php | 499 + .../ArrayMergeReturnTypeProvider.php | 287 + .../ArrayPadReturnTypeProvider.php | 68 + ...rayPointerAdjustmentReturnTypeProvider.php | 105 + .../ArrayPopReturnTypeProvider.php | 96 + .../ArrayRandReturnTypeProvider.php | 76 + .../ArrayReduceReturnTypeProvider.php | 298 + .../ArrayReverseReturnTypeProvider.php | 68 + .../ArraySliceReturnTypeProvider.php | 98 + .../ArraySpliceReturnTypeProvider.php | 76 + .../ArrayUniqueReturnTypeProvider.php | 80 + .../ArrayValuesReturnTypeProvider.php | 88 + .../ClosureFromCallableReturnTypeProvider.php | 70 + .../ReturnTypeProvider/DomNodeAppendChild.php | 42 + .../ExplodeReturnTypeProvider.php | 102 + .../FilterVarReturnTypeProvider.php | 170 + .../FirstArgStringReturnTypeProvider.php | 47 + .../GetClassMethodsReturnTypeProvider.php | 41 + .../GetObjectVarsReturnTypeProvider.php | 131 + .../HexdecReturnTypeProvider.php | 30 + .../ImagickPixelColorReturnTypeProvider.php | 88 + .../InArrayReturnTypeProvider.php | 84 + .../IteratorToArrayReturnTypeProvider.php | 129 + .../MinMaxReturnTypeProvider.php | 143 + .../MktimeReturnTypeProvider.php | 51 + .../ParseUrlReturnTypeProvider.php | 163 + .../PdoStatementReturnTypeProvider.php | 115 + .../PdoStatementSetFetchMode.php | 111 + .../RandReturnTypeProvider.php | 70 + .../SimpleXmlElementAsXml.php | 31 + .../StrReplaceReturnTypeProvider.php | 64 + .../StrTrReturnTypeProvider.php | 72 + .../TriggerErrorReturnTypeProvider.php | 74 + .../VersionCompareReturnTypeProvider.php | 82 + .../Internal/Provider/StatementsProvider.php | 538 + .../Provider/StatementsVolatileCache.php | 108 + .../Psalm/Internal/ReferenceConstraint.php | 36 + .../src/Psalm/Internal/RuntimeCaches.php | 44 + .../Scanner/ClassLikeDocblockComment.php | 147 + .../Psalm/Internal/Scanner/DocblockParser.php | 300 + .../Psalm/Internal/Scanner/FileScanner.php | 117 + .../Scanner/FunctionDocblockComment.php | 228 + .../Psalm/Internal/Scanner/ParsedDocblock.php | 95 + .../Internal/Scanner/PhpStormMetaScanner.php | 398 + .../UnresolvedConstant/ArrayOffsetFetch.php | 23 + .../UnresolvedConstant/ArraySpread.php | 19 + .../Scanner/UnresolvedConstant/ArrayValue.php | 20 + .../UnresolvedConstant/ClassConstant.php | 23 + .../Scanner/UnresolvedConstant/Constant.php | 23 + .../UnresolvedConstant/KeyValuePair.php | 23 + .../UnresolvedConstant/ScalarValue.php | 20 + .../UnresolvedAdditionOp.php | 10 + .../UnresolvedConstant/UnresolvedBinaryOp.php | 23 + .../UnresolvedBitwiseAnd.php | 10 + .../UnresolvedBitwiseOr.php | 10 + .../UnresolvedBitwiseXor.php | 10 + .../UnresolvedConstant/UnresolvedConcatOp.php | 10 + .../UnresolvedDivisionOp.php | 10 + .../UnresolvedMultiplicationOp.php | 10 + .../UnresolvedSubtractionOp.php | 10 + .../UnresolvedConstant/UnresolvedTernary.php | 28 + .../Scanner/UnresolvedConstantComponent.php | 10 + .../Internal/Scanner/VarDocblockComment.php | 86 + .../src/Psalm/Internal/Scope/CaseScope.php | 32 + .../src/Psalm/Internal/Scope/FinallyScope.php | 24 + .../Internal/Scope/IfConditionalScope.php | 50 + .../src/Psalm/Internal/Scope/IfScope.php | 87 + .../src/Psalm/Internal/Scope/LoopScope.php | 74 + .../src/Psalm/Internal/Scope/SwitchScope.php | 53 + .../Generator/ClassLikeStubGenerator.php | 314 + .../Stubs/Generator/StubsGenerator.php | 480 + .../src/Psalm/Internal/Type/ArrayType.php | 63 + .../Internal/Type/AssertionReconciler.php | 1816 ++ .../Type/Comparator/ArrayTypeComparator.php | 293 + .../Type/Comparator/AtomicTypeComparator.php | 712 + .../Comparator/CallableTypeComparator.php | 524 + .../Comparator/ClassLikeStringComparator.php | 92 + .../Type/Comparator/GenericTypeComparator.php | 207 + .../Comparator/IntegerRangeComparator.php | 180 + .../Type/Comparator/KeyedArrayComparator.php | 166 + .../Type/Comparator/ObjectComparator.php | 311 + .../Type/Comparator/ScalarTypeComparator.php | 640 + .../Type/Comparator/TypeComparisonResult.php | 43 + .../Type/Comparator/UnionTypeComparator.php | 499 + .../Type/NegatedAssertionReconciler.php | 425 + .../src/Psalm/Internal/Type/ParseTree.php | 43 + .../Type/ParseTree/CallableParamTree.php | 21 + .../Internal/Type/ParseTree/CallableTree.php | 27 + .../ParseTree/CallableWithReturnTypeTree.php | 12 + .../Type/ParseTree/ConditionalTree.php | 22 + .../Type/ParseTree/EncapsulationTree.php | 16 + .../Internal/Type/ParseTree/GenericTree.php | 27 + .../Type/ParseTree/IndexedAccessTree.php | 22 + .../Type/ParseTree/IntersectionTree.php | 12 + .../Type/ParseTree/KeyedArrayPropertyTree.php | 22 + .../Type/ParseTree/KeyedArrayTree.php | 27 + .../Type/ParseTree/MethodParamTree.php | 43 + .../Internal/Type/ParseTree/MethodTree.php | 22 + .../ParseTree/MethodWithReturnTypeTree.php | 12 + .../Internal/Type/ParseTree/NullableTree.php | 12 + .../Psalm/Internal/Type/ParseTree/Root.php | 12 + .../Type/ParseTree/TemplateAsTree.php | 28 + .../Type/ParseTree/TemplateIsTree.php | 22 + .../Internal/Type/ParseTree/UnionTree.php | 12 + .../Psalm/Internal/Type/ParseTree/Value.php | 48 + .../Psalm/Internal/Type/ParseTreeCreator.php | 842 + .../Type/SimpleAssertionReconciler.php | 2554 +++ .../Type/SimpleNegatedAssertionReconciler.php | 1819 ++ .../src/Psalm/Internal/Type/TemplateBound.php | 52 + .../Type/TemplateInferredTypeReplacer.php | 416 + .../Psalm/Internal/Type/TemplateResult.php | 73 + .../Type/TemplateStandinTypeReplacer.php | 1249 ++ .../src/Psalm/Internal/Type/TypeAlias.php | 7 + .../Type/TypeAlias/ClassTypeAlias.php | 22 + .../Type/TypeAlias/InlineTypeAlias.php | 24 + .../Type/TypeAlias/LinkableTypeAlias.php | 35 + .../Psalm/Internal/Type/TypeCombination.php | 99 + .../src/Psalm/Internal/Type/TypeCombiner.php | 1528 ++ .../src/Psalm/Internal/Type/TypeExpander.php | 909 + .../src/Psalm/Internal/Type/TypeParser.php | 1336 ++ .../src/Psalm/Internal/Type/TypeTokenizer.php | 511 + .../TypeVisitor/ContainsClassLikeVisitor.php | 63 + .../TypeVisitor/ContainsLiteralVisitor.php | 45 + .../TypeVisitor/FromDocblockSetter.php | 31 + .../TypeVisitor/TemplateTypeCollector.php | 50 + .../Internal/TypeVisitor/TypeChecker.php | 410 + .../Internal/TypeVisitor/TypeScanner.php | 89 + .../src/Psalm/Issue/AbstractInstantiation.php | 9 + .../src/Psalm/Issue/AbstractMethodCall.php | 9 + .../psalm/src/Psalm/Issue/ArgumentIssue.php | 24 + .../src/Psalm/Issue/ArgumentTypeCoercion.php | 9 + .../src/Psalm/Issue/AssignmentToVoid.php | 9 + .../src/Psalm/Issue/CircularReference.php | 9 + .../psalm/src/Psalm/Issue/ClassIssue.php | 22 + .../vimeo/psalm/src/Psalm/Issue/CodeIssue.php | 134 + .../psalm/src/Psalm/Issue/ComplexFunction.php | 9 + .../psalm/src/Psalm/Issue/ComplexMethod.php | 9 + .../psalm/src/Psalm/Issue/ConfigIssue.php | 9 + .../Issue/ConflictingReferenceConstraint.php | 9 + .../Issue/ConstructorSignatureMismatch.php | 9 + .../src/Psalm/Issue/ContinueOutsideLoop.php | 9 + .../psalm/src/Psalm/Issue/DeprecatedClass.php | 9 + .../src/Psalm/Issue/DeprecatedConstant.php | 9 + .../src/Psalm/Issue/DeprecatedFunction.php | 9 + .../src/Psalm/Issue/DeprecatedInterface.php | 9 + .../src/Psalm/Issue/DeprecatedMethod.php | 9 + .../src/Psalm/Issue/DeprecatedProperty.php | 9 + .../psalm/src/Psalm/Issue/DeprecatedTrait.php | 9 + .../Psalm/Issue/DocblockTypeContradiction.php | 17 + .../src/Psalm/Issue/DuplicateArrayKey.php | 9 + .../psalm/src/Psalm/Issue/DuplicateClass.php | 9 + .../src/Psalm/Issue/DuplicateConstant.php | 9 + .../src/Psalm/Issue/DuplicateEnumCase.php | 9 + .../Psalm/Issue/DuplicateEnumCaseValue.php | 9 + .../src/Psalm/Issue/DuplicateFunction.php | 9 + .../psalm/src/Psalm/Issue/DuplicateMethod.php | 9 + .../psalm/src/Psalm/Issue/DuplicateParam.php | 9 + .../src/Psalm/Issue/EmptyArrayAccess.php | 9 + .../Issue/ExtensionRequirementViolation.php | 9 + .../Psalm/Issue/FalsableReturnStatement.php | 9 + .../psalm/src/Psalm/Issue/FalseOperand.php | 9 + .../psalm/src/Psalm/Issue/ForbiddenCode.php | 9 + .../psalm/src/Psalm/Issue/ForbiddenEcho.php | 9 + .../psalm/src/Psalm/Issue/FunctionIssue.php | 24 + .../src/Psalm/Issue/IfThisIsMismatch.php | 9 + .../ImplementationRequirementViolation.php | 9 + .../Issue/ImplementedParamTypeMismatch.php | 9 + .../Issue/ImplementedReturnTypeMismatch.php | 9 + .../src/Psalm/Issue/ImplicitToStringCast.php | 9 + .../Issue/ImpureByReferenceAssignment.php | 9 + .../src/Psalm/Issue/ImpureFunctionCall.php | 9 + .../src/Psalm/Issue/ImpureMethodCall.php | 9 + .../Psalm/Issue/ImpurePropertyAssignment.php | 9 + .../src/Psalm/Issue/ImpurePropertyFetch.php | 9 + .../src/Psalm/Issue/ImpureStaticProperty.php | 9 + .../src/Psalm/Issue/ImpureStaticVariable.php | 9 + .../psalm/src/Psalm/Issue/ImpureVariable.php | 9 + .../Psalm/Issue/InaccessibleClassConstant.php | 9 + .../src/Psalm/Issue/InaccessibleMethod.php | 9 + .../src/Psalm/Issue/InaccessibleProperty.php | 9 + .../Psalm/Issue/InterfaceInstantiation.php | 9 + .../psalm/src/Psalm/Issue/InternalClass.php | 32 + .../psalm/src/Psalm/Issue/InternalMethod.php | 9 + .../src/Psalm/Issue/InternalProperty.php | 9 + .../psalm/src/Psalm/Issue/InvalidArgument.php | 9 + .../src/Psalm/Issue/InvalidArrayAccess.php | 9 + .../Psalm/Issue/InvalidArrayAssignment.php | 9 + .../src/Psalm/Issue/InvalidArrayOffset.php | 9 + .../src/Psalm/Issue/InvalidAttribute.php | 9 + .../psalm/src/Psalm/Issue/InvalidCast.php | 9 + .../psalm/src/Psalm/Issue/InvalidCatch.php | 9 + .../psalm/src/Psalm/Issue/InvalidClass.php | 9 + .../psalm/src/Psalm/Issue/InvalidClone.php | 9 + .../psalm/src/Psalm/Issue/InvalidDocblock.php | 9 + .../Psalm/Issue/InvalidDocblockParamName.php | 9 + .../Psalm/Issue/InvalidEnumBackingType.php | 9 + .../src/Psalm/Issue/InvalidEnumCaseValue.php | 9 + .../src/Psalm/Issue/InvalidExtendClass.php | 9 + .../Psalm/Issue/InvalidFalsableReturnType.php | 9 + .../src/Psalm/Issue/InvalidFunctionCall.php | 9 + .../psalm/src/Psalm/Issue/InvalidGlobal.php | 9 + .../psalm/src/Psalm/Issue/InvalidIterator.php | 9 + .../Psalm/Issue/InvalidLiteralArgument.php | 9 + .../src/Psalm/Issue/InvalidMethodCall.php | 9 + .../src/Psalm/Issue/InvalidNamedArgument.php | 9 + .../Psalm/Issue/InvalidNullableReturnType.php | 9 + .../psalm/src/Psalm/Issue/InvalidOperand.php | 9 + .../src/Psalm/Issue/InvalidParamDefault.php | 9 + .../psalm/src/Psalm/Issue/InvalidParent.php | 9 + .../Psalm/Issue/InvalidPassByReference.php | 9 + .../Psalm/Issue/InvalidPropertyAssignment.php | 9 + .../Issue/InvalidPropertyAssignmentValue.php | 9 + .../src/Psalm/Issue/InvalidPropertyFetch.php | 9 + .../Psalm/Issue/InvalidReturnStatement.php | 9 + .../src/Psalm/Issue/InvalidReturnType.php | 9 + .../src/Psalm/Issue/InvalidScalarArgument.php | 9 + .../psalm/src/Psalm/Issue/InvalidScope.php | 9 + .../Psalm/Issue/InvalidStaticInvocation.php | 9 + .../src/Psalm/Issue/InvalidStringClass.php | 9 + .../src/Psalm/Issue/InvalidTemplateParam.php | 9 + .../psalm/src/Psalm/Issue/InvalidThrow.php | 9 + .../psalm/src/Psalm/Issue/InvalidToString.php | 9 + .../InvalidTraversableImplementation.php | 9 + .../src/Psalm/Issue/InvalidTypeImport.php | 9 + .../LessSpecificImplementedReturnType.php | 9 + .../Issue/LessSpecificReturnStatement.php | 9 + .../Psalm/Issue/LessSpecificReturnType.php | 9 + .../src/Psalm/Issue/LoopInvalidation.php | 9 + .../psalm/src/Psalm/Issue/MethodIssue.php | 24 + .../Psalm/Issue/MethodSignatureMismatch.php | 9 + .../MethodSignatureMustOmitReturnType.php | 9 + .../MethodSignatureMustProvideReturnType.php | 9 + .../Issue/MismatchingDocblockParamType.php | 9 + .../Issue/MismatchingDocblockPropertyType.php | 9 + .../Issue/MismatchingDocblockReturnType.php | 9 + .../Psalm/Issue/MissingClosureParamType.php | 9 + .../Psalm/Issue/MissingClosureReturnType.php | 9 + .../src/Psalm/Issue/MissingConstructor.php | 17 + .../src/Psalm/Issue/MissingDependency.php | 8 + .../src/Psalm/Issue/MissingDocblockType.php | 9 + .../psalm/src/Psalm/Issue/MissingFile.php | 8 + .../Issue/MissingImmutableAnnotation.php | 8 + .../src/Psalm/Issue/MissingParamType.php | 9 + .../src/Psalm/Issue/MissingPropertyType.php | 9 + .../src/Psalm/Issue/MissingReturnType.php | 9 + .../src/Psalm/Issue/MissingTemplateParam.php | 8 + .../src/Psalm/Issue/MissingThrowsDocblock.php | 8 + .../psalm/src/Psalm/Issue/MixedArgument.php | 27 + .../Psalm/Issue/MixedArgumentTypeCoercion.php | 27 + .../src/Psalm/Issue/MixedArrayAccess.php | 11 + .../src/Psalm/Issue/MixedArrayAssignment.php | 11 + .../src/Psalm/Issue/MixedArrayOffset.php | 11 + .../Psalm/Issue/MixedArrayTypeCoercion.php | 11 + .../psalm/src/Psalm/Issue/MixedAssignment.php | 11 + .../psalm/src/Psalm/Issue/MixedClone.php | 11 + .../src/Psalm/Issue/MixedFunctionCall.php | 11 + .../Psalm/Issue/MixedInferredReturnType.php | 11 + .../psalm/src/Psalm/Issue/MixedIssue.php | 12 + .../psalm/src/Psalm/Issue/MixedIssueTrait.php | 37 + .../psalm/src/Psalm/Issue/MixedMethodCall.php | 11 + .../psalm/src/Psalm/Issue/MixedOperand.php | 11 + .../Psalm/Issue/MixedPropertyAssignment.php | 11 + .../src/Psalm/Issue/MixedPropertyFetch.php | 11 + .../Psalm/Issue/MixedPropertyTypeCoercion.php | 23 + .../src/Psalm/Issue/MixedReturnStatement.php | 11 + .../Psalm/Issue/MixedReturnTypeCoercion.php | 11 + .../Issue/MixedStringOffsetAssignment.php | 11 + .../MoreSpecificImplementedParamType.php | 9 + .../Psalm/Issue/MoreSpecificReturnType.php | 9 + .../src/Psalm/Issue/MutableDependency.php | 9 + .../Psalm/Issue/NamedArgumentNotAllowed.php | 9 + .../src/Psalm/Issue/NoEnumProperties.php | 9 + .../src/Psalm/Issue/NoInterfaceProperties.php | 9 + .../vimeo/psalm/src/Psalm/Issue/NoValue.php | 9 + .../NonInvariantDocblockPropertyType.php | 11 + .../Psalm/Issue/NonInvariantPropertyType.php | 11 + .../src/Psalm/Issue/NonStaticSelfCall.php | 9 + .../psalm/src/Psalm/Issue/NullArgument.php | 9 + .../psalm/src/Psalm/Issue/NullArrayAccess.php | 13 + .../psalm/src/Psalm/Issue/NullArrayOffset.php | 9 + .../src/Psalm/Issue/NullFunctionCall.php | 9 + .../psalm/src/Psalm/Issue/NullIterator.php | 9 + .../psalm/src/Psalm/Issue/NullOperand.php | 9 + .../Psalm/Issue/NullPropertyAssignment.php | 13 + .../src/Psalm/Issue/NullPropertyFetch.php | 13 + .../psalm/src/Psalm/Issue/NullReference.php | 9 + .../Psalm/Issue/NullableReturnStatement.php | 9 + .../Psalm/Issue/OverriddenMethodAccess.php | 9 + .../Psalm/Issue/OverriddenPropertyAccess.php | 9 + .../src/Psalm/Issue/ParadoxicalCondition.php | 9 + .../src/Psalm/Issue/ParamNameMismatch.php | 9 + .../psalm/src/Psalm/Issue/ParentNotFound.php | 9 + .../psalm/src/Psalm/Issue/ParseError.php | 9 + .../psalm/src/Psalm/Issue/PluginIssue.php | 7 + .../Issue/PossibleRawObjectIteration.php | 9 + .../src/Psalm/Issue/PossiblyFalseArgument.php | 9 + .../src/Psalm/Issue/PossiblyFalseIterator.php | 9 + .../src/Psalm/Issue/PossiblyFalseOperand.php | 9 + .../PossiblyFalsePropertyAssignmentValue.php | 9 + .../Psalm/Issue/PossiblyFalseReference.php | 9 + .../Psalm/Issue/PossiblyInvalidArgument.php | 9 + .../Issue/PossiblyInvalidArrayAccess.php | 9 + .../Issue/PossiblyInvalidArrayAssignment.php | 9 + .../Issue/PossiblyInvalidArrayOffset.php | 9 + .../src/Psalm/Issue/PossiblyInvalidCast.php | 9 + .../src/Psalm/Issue/PossiblyInvalidClone.php | 9 + .../Issue/PossiblyInvalidDocblockTag.php | 9 + .../Issue/PossiblyInvalidFunctionCall.php | 9 + .../Psalm/Issue/PossiblyInvalidIterator.php | 9 + .../Psalm/Issue/PossiblyInvalidMethodCall.php | 9 + .../Psalm/Issue/PossiblyInvalidOperand.php | 9 + .../PossiblyInvalidPropertyAssignment.php | 9 + ...PossiblyInvalidPropertyAssignmentValue.php | 9 + .../Issue/PossiblyInvalidPropertyFetch.php | 9 + .../src/Psalm/Issue/PossiblyNullArgument.php | 9 + .../Psalm/Issue/PossiblyNullArrayAccess.php | 13 + .../Issue/PossiblyNullArrayAssignment.php | 9 + .../Psalm/Issue/PossiblyNullArrayOffset.php | 9 + .../Psalm/Issue/PossiblyNullFunctionCall.php | 9 + .../src/Psalm/Issue/PossiblyNullIterator.php | 9 + .../src/Psalm/Issue/PossiblyNullOperand.php | 9 + .../Issue/PossiblyNullPropertyAssignment.php | 13 + .../PossiblyNullPropertyAssignmentValue.php | 9 + .../Psalm/Issue/PossiblyNullPropertyFetch.php | 13 + .../src/Psalm/Issue/PossiblyNullReference.php | 9 + .../Issue/PossiblyUndefinedArrayOffset.php | 9 + .../Issue/PossiblyUndefinedGlobalVariable.php | 9 + .../Issue/PossiblyUndefinedIntArrayOffset.php | 9 + .../Psalm/Issue/PossiblyUndefinedMethod.php | 9 + .../PossiblyUndefinedStringArrayOffset.php | 9 + .../Psalm/Issue/PossiblyUndefinedVariable.php | 9 + .../src/Psalm/Issue/PossiblyUnusedMethod.php | 9 + .../src/Psalm/Issue/PossiblyUnusedParam.php | 9 + .../Psalm/Issue/PossiblyUnusedProperty.php | 9 + .../Psalm/Issue/PossiblyUnusedReturnValue.php | 9 + .../psalm/src/Psalm/Issue/PropertyIssue.php | 22 + .../Issue/PropertyNotSetInConstructor.php | 20 + .../src/Psalm/Issue/PropertyTypeCoercion.php | 9 + .../src/Psalm/Issue/PsalmInternalError.php | 9 + .../src/Psalm/Issue/RawObjectIteration.php | 9 + .../psalm/src/Psalm/Issue/RedundantCast.php | 9 + .../Issue/RedundantCastGivenDocblockType.php | 9 + .../src/Psalm/Issue/RedundantCondition.php | 17 + .../RedundantConditionGivenDocblockType.php | 18 + .../src/Psalm/Issue/RedundantFunctionCall.php | 9 + ...RedundantFunctionCallGivenDocblockType.php | 9 + .../Psalm/Issue/RedundantIdentityWithTrue.php | 9 + .../RedundantPropertyInitializationCheck.php | 9 + .../Issue/ReferenceConstraintViolation.php | 9 + .../psalm/src/Psalm/Issue/ReservedWord.php | 9 + .../psalm/src/Psalm/Issue/StringIncrement.php | 9 + .../psalm/src/Psalm/Issue/TaintedCallable.php | 8 + .../psalm/src/Psalm/Issue/TaintedCookie.php | 8 + .../psalm/src/Psalm/Issue/TaintedCustom.php | 8 + .../psalm/src/Psalm/Issue/TaintedEval.php | 8 + .../psalm/src/Psalm/Issue/TaintedFile.php | 8 + .../psalm/src/Psalm/Issue/TaintedHeader.php | 8 + .../psalm/src/Psalm/Issue/TaintedHtml.php | 8 + .../psalm/src/Psalm/Issue/TaintedInclude.php | 8 + .../psalm/src/Psalm/Issue/TaintedInput.php | 84 + .../psalm/src/Psalm/Issue/TaintedLdap.php | 8 + .../psalm/src/Psalm/Issue/TaintedSSRF.php | 8 + .../psalm/src/Psalm/Issue/TaintedShell.php | 8 + .../psalm/src/Psalm/Issue/TaintedSql.php | 8 + .../src/Psalm/Issue/TaintedSystemSecret.php | 8 + .../src/Psalm/Issue/TaintedTextWithQuotes.php | 8 + .../src/Psalm/Issue/TaintedUnserialize.php | 8 + .../src/Psalm/Issue/TaintedUserSecret.php | 8 + .../psalm/src/Psalm/Issue/TooFewArguments.php | 9 + .../src/Psalm/Issue/TooManyArguments.php | 9 + .../src/Psalm/Issue/TooManyTemplateParams.php | 9 + vendor/vimeo/psalm/src/Psalm/Issue/Trace.php | 9 + .../Issue/TraitMethodSignatureMismatch.php | 9 + .../Psalm/Issue/TypeDoesNotContainNull.php | 17 + .../Psalm/Issue/TypeDoesNotContainType.php | 17 + .../Issue/UncaughtThrowInGlobalScope.php | 9 + .../Psalm/Issue/UndefinedAttributeClass.php | 9 + .../psalm/src/Psalm/Issue/UndefinedClass.php | 9 + .../src/Psalm/Issue/UndefinedConstant.php | 9 + .../Psalm/Issue/UndefinedDocblockClass.php | 9 + .../src/Psalm/Issue/UndefinedFunction.php | 9 + .../Psalm/Issue/UndefinedGlobalVariable.php | 9 + .../src/Psalm/Issue/UndefinedInterface.php | 9 + .../Psalm/Issue/UndefinedInterfaceMethod.php | 9 + .../src/Psalm/Issue/UndefinedMagicMethod.php | 9 + .../UndefinedMagicPropertyAssignment.php | 9 + .../Issue/UndefinedMagicPropertyFetch.php | 9 + .../psalm/src/Psalm/Issue/UndefinedMethod.php | 9 + .../Issue/UndefinedPropertyAssignment.php | 9 + .../Psalm/Issue/UndefinedPropertyFetch.php | 9 + .../Issue/UndefinedThisPropertyAssignment.php | 9 + .../Issue/UndefinedThisPropertyFetch.php | 9 + .../psalm/src/Psalm/Issue/UndefinedTrace.php | 9 + .../psalm/src/Psalm/Issue/UndefinedTrait.php | 9 + .../src/Psalm/Issue/UndefinedVariable.php | 9 + .../psalm/src/Psalm/Issue/UnevaluatedCode.php | 9 + .../Psalm/Issue/UnhandledMatchCondition.php | 9 + .../Issue/UnimplementedAbstractMethod.php | 9 + .../Issue/UnimplementedInterfaceMethod.php | 9 + .../src/Psalm/Issue/UninitializedProperty.php | 9 + .../Psalm/Issue/UnnecessaryVarAnnotation.php | 9 + .../Psalm/Issue/UnrecognizedExpression.php | 9 + .../src/Psalm/Issue/UnrecognizedStatement.php | 9 + .../src/Psalm/Issue/UnresolvableInclude.php | 9 + .../Issue/UnsafeGenericInstantiation.php | 9 + .../src/Psalm/Issue/UnsafeInstantiation.php | 9 + .../psalm/src/Psalm/Issue/UnusedClass.php | 9 + .../src/Psalm/Issue/UnusedClosureParam.php | 9 + .../src/Psalm/Issue/UnusedConstructor.php | 9 + .../src/Psalm/Issue/UnusedForeachValue.php | 9 + .../src/Psalm/Issue/UnusedFunctionCall.php | 9 + .../psalm/src/Psalm/Issue/UnusedMethod.php | 9 + .../src/Psalm/Issue/UnusedMethodCall.php | 9 + .../psalm/src/Psalm/Issue/UnusedParam.php | 9 + .../psalm/src/Psalm/Issue/UnusedProperty.php | 9 + .../src/Psalm/Issue/UnusedPsalmSuppress.php | 9 + .../src/Psalm/Issue/UnusedReturnValue.php | 9 + .../psalm/src/Psalm/Issue/UnusedVariable.php | 9 + .../psalm/src/Psalm/Issue/VariableIssue.php | 24 + vendor/vimeo/psalm/src/Psalm/IssueBuffer.php | 1029 + .../Node/Expr/AssignOp/VirtualBitwiseAnd.php | 13 + .../Node/Expr/AssignOp/VirtualBitwiseOr.php | 13 + .../Node/Expr/AssignOp/VirtualBitwiseXor.php | 13 + .../Node/Expr/AssignOp/VirtualCoalesce.php | 13 + .../Node/Expr/AssignOp/VirtualConcat.php | 13 + .../Psalm/Node/Expr/AssignOp/VirtualDiv.php | 13 + .../Psalm/Node/Expr/AssignOp/VirtualMinus.php | 13 + .../Psalm/Node/Expr/AssignOp/VirtualMod.php | 13 + .../Psalm/Node/Expr/AssignOp/VirtualMul.php | 13 + .../Psalm/Node/Expr/AssignOp/VirtualPlus.php | 13 + .../Psalm/Node/Expr/AssignOp/VirtualPow.php | 13 + .../Node/Expr/AssignOp/VirtualShiftLeft.php | 13 + .../Node/Expr/AssignOp/VirtualShiftRight.php | 13 + .../Node/Expr/BinaryOp/VirtualBitwiseAnd.php | 13 + .../Node/Expr/BinaryOp/VirtualBitwiseOr.php | 13 + .../Node/Expr/BinaryOp/VirtualBitwiseXor.php | 13 + .../Node/Expr/BinaryOp/VirtualBooleanAnd.php | 13 + .../Node/Expr/BinaryOp/VirtualBooleanOr.php | 13 + .../Node/Expr/BinaryOp/VirtualCoalesce.php | 13 + .../Node/Expr/BinaryOp/VirtualConcat.php | 13 + .../Psalm/Node/Expr/BinaryOp/VirtualDiv.php | 13 + .../Psalm/Node/Expr/BinaryOp/VirtualEqual.php | 13 + .../Node/Expr/BinaryOp/VirtualGreater.php | 13 + .../Expr/BinaryOp/VirtualGreaterOrEqual.php | 13 + .../Node/Expr/BinaryOp/VirtualIdentical.php | 13 + .../Node/Expr/BinaryOp/VirtualLogicalAnd.php | 13 + .../Node/Expr/BinaryOp/VirtualLogicalOr.php | 13 + .../Node/Expr/BinaryOp/VirtualLogicalXor.php | 13 + .../Psalm/Node/Expr/BinaryOp/VirtualMinus.php | 13 + .../Psalm/Node/Expr/BinaryOp/VirtualMod.php | 13 + .../Psalm/Node/Expr/BinaryOp/VirtualMul.php | 13 + .../Node/Expr/BinaryOp/VirtualNotEqual.php | 13 + .../Expr/BinaryOp/VirtualNotIdentical.php | 13 + .../Psalm/Node/Expr/BinaryOp/VirtualPlus.php | 13 + .../Psalm/Node/Expr/BinaryOp/VirtualPow.php | 13 + .../Node/Expr/BinaryOp/VirtualShiftLeft.php | 13 + .../Node/Expr/BinaryOp/VirtualShiftRight.php | 13 + .../Node/Expr/BinaryOp/VirtualSmaller.php | 13 + .../Expr/BinaryOp/VirtualSmallerOrEqual.php | 13 + .../Node/Expr/BinaryOp/VirtualSpaceship.php | 13 + .../src/Psalm/Node/Expr/Cast/VirtualArray.php | 13 + .../src/Psalm/Node/Expr/Cast/VirtualBool.php | 13 + .../Psalm/Node/Expr/Cast/VirtualDouble.php | 13 + .../src/Psalm/Node/Expr/Cast/VirtualInt.php | 13 + .../Psalm/Node/Expr/Cast/VirtualObject.php | 13 + .../Psalm/Node/Expr/Cast/VirtualString.php | 13 + .../src/Psalm/Node/Expr/Cast/VirtualUnset.php | 13 + .../src/Psalm/Node/Expr/VirtualArray.php | 13 + .../Psalm/Node/Expr/VirtualArrayDimFetch.php | 13 + .../src/Psalm/Node/Expr/VirtualArrayItem.php | 13 + .../Psalm/Node/Expr/VirtualArrowFunction.php | 13 + .../src/Psalm/Node/Expr/VirtualAssign.php | 13 + .../src/Psalm/Node/Expr/VirtualAssignRef.php | 13 + .../src/Psalm/Node/Expr/VirtualBitwiseNot.php | 13 + .../src/Psalm/Node/Expr/VirtualBooleanNot.php | 13 + .../Node/Expr/VirtualClassConstFetch.php | 13 + .../src/Psalm/Node/Expr/VirtualClone.php | 13 + .../src/Psalm/Node/Expr/VirtualClosure.php | 13 + .../src/Psalm/Node/Expr/VirtualClosureUse.php | 13 + .../src/Psalm/Node/Expr/VirtualConstFetch.php | 13 + .../src/Psalm/Node/Expr/VirtualEmpty.php | 13 + .../src/Psalm/Node/Expr/VirtualError.php | 19 + .../Psalm/Node/Expr/VirtualErrorSuppress.php | 13 + .../psalm/src/Psalm/Node/Expr/VirtualEval.php | 13 + .../psalm/src/Psalm/Node/Expr/VirtualExit.php | 13 + .../src/Psalm/Node/Expr/VirtualFuncCall.php | 13 + .../src/Psalm/Node/Expr/VirtualInclude.php | 13 + .../src/Psalm/Node/Expr/VirtualInstanceof.php | 13 + .../src/Psalm/Node/Expr/VirtualIsset.php | 13 + .../psalm/src/Psalm/Node/Expr/VirtualList.php | 13 + .../src/Psalm/Node/Expr/VirtualMatch.php | 13 + .../src/Psalm/Node/Expr/VirtualMethodCall.php | 13 + .../psalm/src/Psalm/Node/Expr/VirtualNew.php | 13 + .../Node/Expr/VirtualNullsafeMethodCall.php | 13 + .../Expr/VirtualNullsafePropertyFetch.php | 13 + .../src/Psalm/Node/Expr/VirtualPostDec.php | 13 + .../src/Psalm/Node/Expr/VirtualPostInc.php | 13 + .../src/Psalm/Node/Expr/VirtualPreDec.php | 13 + .../src/Psalm/Node/Expr/VirtualPreInc.php | 13 + .../src/Psalm/Node/Expr/VirtualPrint.php | 13 + .../Psalm/Node/Expr/VirtualPropertyFetch.php | 13 + .../src/Psalm/Node/Expr/VirtualShellExec.php | 13 + .../src/Psalm/Node/Expr/VirtualStaticCall.php | 13 + .../Node/Expr/VirtualStaticPropertyFetch.php | 13 + .../src/Psalm/Node/Expr/VirtualTernary.php | 13 + .../src/Psalm/Node/Expr/VirtualThrow.php | 13 + .../src/Psalm/Node/Expr/VirtualUnaryMinus.php | 13 + .../src/Psalm/Node/Expr/VirtualUnaryPlus.php | 13 + .../src/Psalm/Node/Expr/VirtualVariable.php | 13 + .../src/Psalm/Node/Expr/VirtualYield.php | 13 + .../src/Psalm/Node/Expr/VirtualYieldFrom.php | 13 + .../Psalm/Node/Name/VirtualFullyQualified.php | 13 + .../src/Psalm/Node/Name/VirtualRelative.php | 13 + .../Node/Scalar/MagicConst/VirtualClass.php | 13 + .../Node/Scalar/MagicConst/VirtualDir.php | 13 + .../Node/Scalar/MagicConst/VirtualFile.php | 13 + .../Scalar/MagicConst/VirtualFunction.php | 13 + .../Node/Scalar/MagicConst/VirtualLine.php | 13 + .../Node/Scalar/MagicConst/VirtualMethod.php | 13 + .../Scalar/MagicConst/VirtualNamespace.php | 13 + .../Node/Scalar/MagicConst/VirtualTrait.php | 13 + .../src/Psalm/Node/Scalar/VirtualDNumber.php | 13 + .../src/Psalm/Node/Scalar/VirtualEncapsed.php | 13 + .../Node/Scalar/VirtualEncapsedStringPart.php | 13 + .../src/Psalm/Node/Scalar/VirtualLNumber.php | 13 + .../src/Psalm/Node/Scalar/VirtualString.php | 13 + .../Stmt/TraitUseAdaptation/VirtualAlias.php | 13 + .../TraitUseAdaptation/VirtualPrecedence.php | 13 + .../src/Psalm/Node/Stmt/VirtualBreak.php | 13 + .../psalm/src/Psalm/Node/Stmt/VirtualCase.php | 13 + .../src/Psalm/Node/Stmt/VirtualCatch.php | 13 + .../src/Psalm/Node/Stmt/VirtualClass.php | 13 + .../src/Psalm/Node/Stmt/VirtualClassConst.php | 13 + .../Psalm/Node/Stmt/VirtualClassMethod.php | 13 + .../src/Psalm/Node/Stmt/VirtualConst.php | 13 + .../src/Psalm/Node/Stmt/VirtualContinue.php | 13 + .../src/Psalm/Node/Stmt/VirtualDeclare.php | 13 + .../Psalm/Node/Stmt/VirtualDeclareDeclare.php | 13 + .../psalm/src/Psalm/Node/Stmt/VirtualDo.php | 13 + .../psalm/src/Psalm/Node/Stmt/VirtualEcho.php | 13 + .../psalm/src/Psalm/Node/Stmt/VirtualElse.php | 13 + .../src/Psalm/Node/Stmt/VirtualElseIf.php | 13 + .../src/Psalm/Node/Stmt/VirtualExpression.php | 16 + .../src/Psalm/Node/Stmt/VirtualFinally.php | 13 + .../psalm/src/Psalm/Node/Stmt/VirtualFor.php | 13 + .../src/Psalm/Node/Stmt/VirtualForeach.php | 13 + .../src/Psalm/Node/Stmt/VirtualFunction.php | 13 + .../src/Psalm/Node/Stmt/VirtualGlobal.php | 13 + .../psalm/src/Psalm/Node/Stmt/VirtualGoto.php | 13 + .../src/Psalm/Node/Stmt/VirtualGroupUse.php | 13 + .../Psalm/Node/Stmt/VirtualHaltCompiler.php | 13 + .../psalm/src/Psalm/Node/Stmt/VirtualIf.php | 13 + .../src/Psalm/Node/Stmt/VirtualInlineHTML.php | 13 + .../src/Psalm/Node/Stmt/VirtualInterface.php | 13 + .../src/Psalm/Node/Stmt/VirtualLabel.php | 13 + .../src/Psalm/Node/Stmt/VirtualNamespace.php | 13 + .../psalm/src/Psalm/Node/Stmt/VirtualNop.php | 14 + .../src/Psalm/Node/Stmt/VirtualProperty.php | 13 + .../Node/Stmt/VirtualPropertyProperty.php | 13 + .../src/Psalm/Node/Stmt/VirtualReturn.php | 13 + .../src/Psalm/Node/Stmt/VirtualStatic.php | 13 + .../src/Psalm/Node/Stmt/VirtualStaticVar.php | 13 + .../src/Psalm/Node/Stmt/VirtualSwitch.php | 13 + .../src/Psalm/Node/Stmt/VirtualThrow.php | 13 + .../src/Psalm/Node/Stmt/VirtualTrait.php | 13 + .../src/Psalm/Node/Stmt/VirtualTraitUse.php | 13 + .../src/Psalm/Node/Stmt/VirtualTryCatch.php | 13 + .../src/Psalm/Node/Stmt/VirtualUnset.php | 13 + .../psalm/src/Psalm/Node/Stmt/VirtualUse.php | 13 + .../src/Psalm/Node/Stmt/VirtualUseUse.php | 13 + .../src/Psalm/Node/Stmt/VirtualWhile.php | 13 + .../vimeo/psalm/src/Psalm/Node/VirtualArg.php | 12 + .../psalm/src/Psalm/Node/VirtualAttribute.php | 12 + .../src/Psalm/Node/VirtualAttributeGroup.php | 12 + .../psalm/src/Psalm/Node/VirtualConst.php | 12 + .../src/Psalm/Node/VirtualIdentifier.php | 15 + .../psalm/src/Psalm/Node/VirtualMatchArm.php | 12 + .../psalm/src/Psalm/Node/VirtualName.php | 12 + .../psalm/src/Psalm/Node/VirtualNode.php | 11 + .../src/Psalm/Node/VirtualNullableType.php | 12 + .../psalm/src/Psalm/Node/VirtualParam.php | 12 + .../psalm/src/Psalm/Node/VirtualUnionType.php | 12 + .../Psalm/Node/VirtualVarLikeIdentifier.php | 19 + .../psalm/src/Psalm/NodeTypeProvider.php | 19 + .../EventHandler/AddTaintsInterface.php | 15 + .../EventHandler/AfterAnalysisInterface.php | 13 + .../AfterClassLikeAnalysisInterface.php | 16 + .../AfterClassLikeExistenceCheckInterface.php | 10 + .../AfterClassLikeVisitInterface.php | 14 + .../AfterCodebasePopulatedInterface.php | 16 + ...fterEveryFunctionCallAnalysisInterface.php | 10 + .../AfterExpressionAnalysisInterface.php | 15 + .../AfterFileAnalysisInterface.php | 13 + .../AfterFunctionCallAnalysisInterface.php | 10 + .../AfterFunctionLikeAnalysisInterface.php | 15 + .../AfterMethodCallAnalysisInterface.php | 10 + .../AfterStatementAnalysisInterface.php | 15 + .../BeforeFileAnalysisInterface.php | 13 + .../Event/AddRemoveTaintsEvent.php | 63 + .../EventHandler/Event/AfterAnalysisEvent.php | 67 + .../Event/AfterClassLikeAnalysisEvent.php | 88 + .../AfterClassLikeExistenceCheckEvent.php | 85 + .../Event/AfterClassLikeVisitEvent.php | 86 + .../Event/AfterCodebasePopulatedEvent.php | 26 + .../AfterEveryFunctionCallAnalysisEvent.php | 71 + .../Event/AfterExpressionAnalysisEvent.php | 88 + .../Event/AfterFileAnalysisEvent.php | 80 + .../Event/AfterFunctionCallAnalysisEvent.php | 113 + .../Event/AfterFunctionLikeAnalysisEvent.php | 120 + .../Event/AfterMethodCallAnalysisEvent.php | 142 + .../Event/AfterStatementAnalysisEvent.php | 88 + .../Event/BeforeFileAnalysisEvent.php | 63 + .../Event/FunctionExistenceProviderEvent.php | 40 + .../Event/FunctionParamsProviderEvent.php | 77 + .../Event/FunctionReturnTypeProviderEvent.php | 89 + .../Event/MethodExistenceProviderEvent.php | 63 + .../Event/MethodParamsProviderEvent.php | 88 + .../Event/MethodReturnTypeProviderEvent.php | 146 + .../Event/MethodVisibilityProviderEvent.php | 70 + .../Event/PropertyExistenceProviderEvent.php | 87 + .../Event/PropertyTypeProviderEvent.php | 69 + .../Event/PropertyVisibilityProviderEvent.php | 81 + .../Event/StringInterpreterEvent.php | 24 + .../FunctionExistenceProviderInterface.php | 21 + .../FunctionParamsProviderInterface.php | 19 + .../FunctionReturnTypeProviderInterface.php | 21 + .../MethodExistenceProviderInterface.php | 20 + .../MethodParamsProviderInterface.php | 19 + .../MethodReturnTypeProviderInterface.php | 21 + .../MethodVisibilityProviderInterface.php | 15 + .../PropertyExistenceProviderInterface.php | 21 + .../PropertyTypeProviderInterface.php | 16 + .../PropertyVisibilityProviderInterface.php | 15 + .../EventHandler/RemoveTaintsInterface.php | 15 + .../StringInterpreterInterface.php | 14 + .../Plugin/Hook/AfterAnalysisInterface.php | 23 + .../Hook/AfterClassLikeAnalysisInterface.php | 29 + .../AfterClassLikeExistenceCheckInterface.php | 23 + .../Hook/AfterClassLikeVisitInterface.php | 27 + .../Hook/AfterCodebasePopulatedInterface.php | 17 + ...fterEveryFunctionCallAnalysisInterface.php | 20 + .../Hook/AfterExpressionAnalysisInterface.php | 28 + .../Hook/AfterFileAnalysisInterface.php | 22 + .../AfterFunctionCallAnalysisInterface.php | 28 + .../AfterFunctionLikeAnalysisInterface.php | 28 + .../Hook/AfterMethodCallAnalysisInterface.php | 32 + .../Hook/AfterStatementAnalysisInterface.php | 28 + .../Hook/BeforeFileAnalysisInterface.php | 22 + .../FunctionExistenceProviderInterface.php | 25 + .../Hook/FunctionParamsProviderInterface.php | 31 + .../FunctionReturnTypeProviderInterface.php | 33 + .../Hook/MethodExistenceProviderInterface.php | 27 + .../Hook/MethodParamsProviderInterface.php | 32 + .../MethodReturnTypeProviderInterface.php | 40 + .../MethodVisibilityProviderInterface.php | 24 + .../PropertyExistenceProviderInterface.php | 31 + .../Hook/PropertyTypeProviderInterface.php | 24 + .../PropertyVisibilityProviderInterface.php | 25 + .../Hook/StringInterpreterInterface.php | 16 + .../Plugin/PluginEntryPointInterface.php | 10 + .../Psalm/Plugin/RegistrationInterface.php | 30 + .../vimeo/psalm/src/Psalm/Plugin/Shepherd.php | 223 + .../src/Psalm/PluginRegistrationSocket.php | 238 + .../src/Psalm/Progress/DebugProgress.php | 40 + .../src/Psalm/Progress/DefaultProgress.php | 104 + .../psalm/src/Psalm/Progress/LongProgress.php | 110 + .../psalm/src/Psalm/Progress/Progress.php | 69 + .../psalm/src/Psalm/Progress/VoidProgress.php | 10 + vendor/vimeo/psalm/src/Psalm/Report.php | 101 + .../src/Psalm/Report/CheckstyleReport.php | 39 + .../src/Psalm/Report/CodeClimateReport.php | 95 + .../psalm/src/Psalm/Report/CompactReport.php | 84 + .../psalm/src/Psalm/Report/ConsoleReport.php | 149 + .../psalm/src/Psalm/Report/CountReport.php | 39 + .../psalm/src/Psalm/Report/EmacsReport.php | 28 + .../src/Psalm/Report/GithubActionsReport.php | 72 + .../psalm/src/Psalm/Report/JsonReport.php | 28 + .../src/Psalm/Report/JsonSummaryReport.php | 32 + .../psalm/src/Psalm/Report/JunitReport.php | 175 + .../psalm/src/Psalm/Report/PhpStormReport.php | 99 + .../psalm/src/Psalm/Report/PylintReport.php | 49 + .../psalm/src/Psalm/Report/ReportOptions.php | 46 + .../psalm/src/Psalm/Report/SarifReport.php | 135 + .../src/Psalm/Report/SonarqubeReport.php | 47 + .../psalm/src/Psalm/Report/TextReport.php | 29 + .../psalm/src/Psalm/Report/XmlReport.php | 52 + .../Psalm/SourceControl/Git/CommitInfo.php | 209 + .../src/Psalm/SourceControl/Git/GitInfo.php | 111 + .../Psalm/SourceControl/Git/RemoteInfo.php | 81 + .../Psalm/SourceControl/SourceControlInfo.php | 8 + .../psalm/src/Psalm/StatementsSource.php | 64 + .../psalm/src/Psalm/Storage/Assertion.php | 105 + .../psalm/src/Psalm/Storage/AttributeArg.php | 40 + .../src/Psalm/Storage/AttributeStorage.php | 47 + .../Psalm/Storage/ClassConstantStorage.php | 62 + .../src/Psalm/Storage/ClassLikeStorage.php | 491 + .../src/Psalm/Storage/CustomMetadataTrait.php | 12 + .../src/Psalm/Storage/EnumCaseStorage.php | 32 + .../psalm/src/Psalm/Storage/FileStorage.php | 103 + .../Psalm/Storage/FunctionLikeParameter.php | 161 + .../src/Psalm/Storage/FunctionLikeStorage.php | 304 + .../src/Psalm/Storage/FunctionStorage.php | 9 + .../Psalm/Storage/HasAttributesInterface.php | 17 + .../psalm/src/Psalm/Storage/MethodStorage.php | 107 + .../src/Psalm/Storage/PropertyStorage.php | 135 + vendor/vimeo/psalm/src/Psalm/Type.php | 761 + vendor/vimeo/psalm/src/Psalm/Type/Atomic.php | 812 + .../src/Psalm/Type/Atomic/CallableTrait.php | 300 + .../src/Psalm/Type/Atomic/DependentType.php | 15 + .../src/Psalm/Type/Atomic/GenericTrait.php | 294 + .../Type/Atomic/HasIntersectionTrait.php | 109 + .../psalm/src/Psalm/Type/Atomic/Scalar.php | 13 + .../Type/Atomic/TAnonymousClassInstance.php | 49 + .../psalm/src/Psalm/Type/Atomic/TArray.php | 95 + .../psalm/src/Psalm/Type/Atomic/TArrayKey.php | 49 + .../src/Psalm/Type/Atomic/TAssertionFalsy.php | 44 + .../psalm/src/Psalm/Type/Atomic/TBool.php | 32 + .../psalm/src/Psalm/Type/Atomic/TCallable.php | 36 + .../src/Psalm/Type/Atomic/TCallableArray.php | 14 + .../Psalm/Type/Atomic/TCallableKeyedArray.php | 16 + .../src/Psalm/Type/Atomic/TCallableList.php | 11 + .../src/Psalm/Type/Atomic/TCallableObject.php | 44 + .../src/Psalm/Type/Atomic/TCallableString.php | 30 + .../src/Psalm/Type/Atomic/TClassConstant.php | 81 + .../src/Psalm/Type/Atomic/TClassString.php | 171 + .../src/Psalm/Type/Atomic/TClassStringMap.php | 251 + .../src/Psalm/Type/Atomic/TClosedResource.php | 44 + .../psalm/src/Psalm/Type/Atomic/TClosure.php | 19 + .../src/Psalm/Type/Atomic/TConditional.php | 148 + .../Psalm/Type/Atomic/TDependentGetClass.php | 63 + .../Type/Atomic/TDependentGetDebugType.php | 46 + .../Psalm/Type/Atomic/TDependentGetType.php | 29 + .../Psalm/Type/Atomic/TDependentListKey.php | 51 + .../psalm/src/Psalm/Type/Atomic/TEmpty.php | 34 + .../src/Psalm/Type/Atomic/TEmptyMixed.php | 15 + .../src/Psalm/Type/Atomic/TEmptyNumeric.php | 14 + .../src/Psalm/Type/Atomic/TEmptyScalar.php | 14 + .../psalm/src/Psalm/Type/Atomic/TEnumCase.php | 59 + .../psalm/src/Psalm/Type/Atomic/TFalse.php | 27 + .../psalm/src/Psalm/Type/Atomic/TFloat.php | 32 + .../src/Psalm/Type/Atomic/TGenericObject.php | 115 + .../Psalm/Type/Atomic/THtmlEscapedString.php | 25 + .../psalm/src/Psalm/Type/Atomic/TInt.php | 32 + .../psalm/src/Psalm/Type/Atomic/TIntMask.php | 71 + .../src/Psalm/Type/Atomic/TIntMaskOf.php | 57 + .../psalm/src/Psalm/Type/Atomic/TIntRange.php | 161 + .../psalm/src/Psalm/Type/Atomic/TIterable.php | 129 + .../Psalm/Type/Atomic/TKeyOfClassConstant.php | 105 + .../src/Psalm/Type/Atomic/TKeyedArray.php | 434 + .../psalm/src/Psalm/Type/Atomic/TList.php | 209 + .../Psalm/Type/Atomic/TLiteralClassString.php | 105 + .../src/Psalm/Type/Atomic/TLiteralFloat.php | 40 + .../src/Psalm/Type/Atomic/TLiteralInt.php | 45 + .../src/Psalm/Type/Atomic/TLiteralString.php | 55 + .../Psalm/Type/Atomic/TLowercaseString.php | 16 + .../psalm/src/Psalm/Type/Atomic/TMixed.php | 52 + .../src/Psalm/Type/Atomic/TNamedObject.php | 160 + .../psalm/src/Psalm/Type/Atomic/TNever.php | 40 + .../src/Psalm/Type/Atomic/TNonEmptyArray.php | 20 + .../src/Psalm/Type/Atomic/TNonEmptyList.php | 21 + .../Type/Atomic/TNonEmptyLowercaseString.php | 22 + .../src/Psalm/Type/Atomic/TNonEmptyMixed.php | 15 + .../TNonEmptyNonspecificLiteralString.php | 15 + .../src/Psalm/Type/Atomic/TNonEmptyScalar.php | 14 + .../src/Psalm/Type/Atomic/TNonEmptyString.php | 14 + .../src/Psalm/Type/Atomic/TNonFalsyString.php | 14 + .../Type/Atomic/TNonspecificLiteralInt.php | 25 + .../Type/Atomic/TNonspecificLiteralString.php | 25 + .../psalm/src/Psalm/Type/Atomic/TNull.php | 39 + .../psalm/src/Psalm/Type/Atomic/TNumeric.php | 37 + .../src/Psalm/Type/Atomic/TNumericString.php | 34 + .../psalm/src/Psalm/Type/Atomic/TObject.php | 42 + .../Type/Atomic/TObjectWithProperties.php | 287 + .../src/Psalm/Type/Atomic/TPositiveInt.php | 41 + .../psalm/src/Psalm/Type/Atomic/TResource.php | 39 + .../psalm/src/Psalm/Type/Atomic/TScalar.php | 43 + .../src/Psalm/Type/Atomic/TSingleLetter.php | 10 + .../psalm/src/Psalm/Type/Atomic/TString.php | 32 + .../Type/Atomic/TTemplateIndexedAccess.php | 66 + .../src/Psalm/Type/Atomic/TTemplateKeyOf.php | 63 + .../src/Psalm/Type/Atomic/TTemplateParam.php | 135 + .../Psalm/Type/Atomic/TTemplateParamClass.php | 65 + .../src/Psalm/Type/Atomic/TTraitString.php | 55 + .../psalm/src/Psalm/Type/Atomic/TTrue.php | 27 + .../src/Psalm/Type/Atomic/TTypeAlias.php | 88 + .../Type/Atomic/TValueOfClassConstant.php | 80 + .../psalm/src/Psalm/Type/Atomic/TVoid.php | 41 + .../psalm/src/Psalm/Type/NodeVisitor.php | 50 + .../vimeo/psalm/src/Psalm/Type/Reconciler.php | 1110 + .../vimeo/psalm/src/Psalm/Type/TaintKind.php | 25 + .../psalm/src/Psalm/Type/TaintKindGroup.php | 25 + .../vimeo/psalm/src/Psalm/Type/TypeNode.php | 11 + vendor/vimeo/psalm/src/Psalm/Type/Union.php | 1668 ++ vendor/vimeo/psalm/src/command_functions.php | 88 + vendor/vimeo/psalm/src/functions.php | 13 + .../vimeo/psalm/src/psalm-language-server.php | 10 + vendor/vimeo/psalm/src/psalm-refactor.php | 10 + vendor/vimeo/psalm/src/psalm.php | 10 + vendor/vimeo/psalm/src/psalm_plugin.php | 10 + vendor/vimeo/psalm/src/psalter.php | 10 + vendor/vimeo/psalm/src/spl_object_id.php | 54 + .../psalm/stubs/CoreGenericClasses.phpstub | 503 + .../psalm/stubs/CoreGenericFunctions.phpstub | 1368 ++ .../psalm/stubs/CoreGenericIterators.phpstub | 1094 + .../psalm/stubs/CoreImmutableClasses.phpstub | 242 + vendor/vimeo/psalm/stubs/DOM.phpstub | 176 + vendor/vimeo/psalm/stubs/Php80.phpstub | 105 + vendor/vimeo/psalm/stubs/Php81.phpstub | 91 + vendor/vimeo/psalm/stubs/Reflection.phpstub | 148 + vendor/vimeo/psalm/stubs/SPL.phpstub | 972 + vendor/vimeo/psalm/stubs/Xdebug.phpstub | 43 + vendor/vimeo/psalm/stubs/decimal.phpstub | 492 + vendor/vimeo/psalm/stubs/ext-apcu.phpstub | 92 + vendor/vimeo/psalm/stubs/ext-ds.phpstub | 1434 ++ vendor/vimeo/psalm/stubs/ext-geos.phpstub | 25 + vendor/vimeo/psalm/stubs/mongodb.phpstub | 59 + vendor/vimeo/psalm/stubs/mysqli.phpstub | 33 + vendor/vimeo/psalm/stubs/pdo.phpstub | 19 + vendor/vimeo/psalm/stubs/phpparser.phpstub | 22 + vendor/vimeo/psalm/stubs/phpredis.phpstub | 548 + vendor/vimeo/psalm/stubs/soap.phpstub | 284 + vendor/webmozart/assert/CHANGELOG.md | 207 + vendor/webmozart/assert/LICENSE | 20 + vendor/webmozart/assert/README.md | 287 + vendor/webmozart/assert/composer.json | 43 + vendor/webmozart/assert/src/Assert.php | 2080 ++ .../assert/src/InvalidArgumentException.php | 16 + vendor/webmozart/assert/src/Mixin.php | 5089 +++++ vendor/webmozart/path-util/.gitignore | 2 + vendor/webmozart/path-util/.styleci.yml | 8 + vendor/webmozart/path-util/.travis.yml | 29 + vendor/webmozart/path-util/CHANGELOG.md | 68 + vendor/webmozart/path-util/LICENSE | 20 + vendor/webmozart/path-util/README.md | 143 + vendor/webmozart/path-util/appveyor.yml | 34 + vendor/webmozart/path-util/composer.json | 34 + vendor/webmozart/path-util/docs/usage.md | 203 + vendor/webmozart/path-util/phpunit.xml.dist | 16 + vendor/webmozart/path-util/src/Path.php | 1008 + vendor/webmozart/path-util/src/Url.php | 111 + vendor/webmozart/path-util/tests/PathTest.php | 1340 ++ vendor/webmozart/path-util/tests/UrlTest.php | 179 + 1853 files changed, 290565 insertions(+), 658 deletions(-) create mode 100644 psalm.xml create mode 100644 vendor/amphp/amp/LICENSE create mode 100644 vendor/amphp/amp/composer.json create mode 100644 vendor/amphp/amp/lib/CallableMaker.php create mode 100644 vendor/amphp/amp/lib/CancellationToken.php create mode 100644 vendor/amphp/amp/lib/CancellationTokenSource.php create mode 100644 vendor/amphp/amp/lib/CancelledException.php create mode 100644 vendor/amphp/amp/lib/CombinedCancellationToken.php create mode 100644 vendor/amphp/amp/lib/Coroutine.php create mode 100644 vendor/amphp/amp/lib/Deferred.php create mode 100644 vendor/amphp/amp/lib/Delayed.php create mode 100644 vendor/amphp/amp/lib/Emitter.php create mode 100644 vendor/amphp/amp/lib/Failure.php create mode 100644 vendor/amphp/amp/lib/Internal/Placeholder.php create mode 100644 vendor/amphp/amp/lib/Internal/PrivateIterator.php create mode 100644 vendor/amphp/amp/lib/Internal/PrivatePromise.php create mode 100644 vendor/amphp/amp/lib/Internal/Producer.php create mode 100644 vendor/amphp/amp/lib/Internal/ResolutionQueue.php create mode 100644 vendor/amphp/amp/lib/Internal/functions.php create mode 100644 vendor/amphp/amp/lib/InvalidYieldError.php create mode 100644 vendor/amphp/amp/lib/Iterator.php create mode 100644 vendor/amphp/amp/lib/LazyPromise.php create mode 100644 vendor/amphp/amp/lib/Loop.php create mode 100644 vendor/amphp/amp/lib/Loop/Driver.php create mode 100644 vendor/amphp/amp/lib/Loop/DriverFactory.php create mode 100644 vendor/amphp/amp/lib/Loop/EvDriver.php create mode 100644 vendor/amphp/amp/lib/Loop/EventDriver.php create mode 100644 vendor/amphp/amp/lib/Loop/Internal/TimerQueue.php create mode 100644 vendor/amphp/amp/lib/Loop/InvalidWatcherError.php create mode 100644 vendor/amphp/amp/lib/Loop/NativeDriver.php create mode 100644 vendor/amphp/amp/lib/Loop/TracingDriver.php create mode 100644 vendor/amphp/amp/lib/Loop/UnsupportedFeatureException.php create mode 100644 vendor/amphp/amp/lib/Loop/UvDriver.php create mode 100644 vendor/amphp/amp/lib/Loop/Watcher.php create mode 100644 vendor/amphp/amp/lib/MultiReasonException.php create mode 100644 vendor/amphp/amp/lib/NullCancellationToken.php create mode 100644 vendor/amphp/amp/lib/Producer.php create mode 100644 vendor/amphp/amp/lib/Promise.php create mode 100644 vendor/amphp/amp/lib/Struct.php create mode 100644 vendor/amphp/amp/lib/Success.php create mode 100644 vendor/amphp/amp/lib/TimeoutCancellationToken.php create mode 100644 vendor/amphp/amp/lib/TimeoutException.php create mode 100644 vendor/amphp/amp/lib/functions.php create mode 100644 vendor/amphp/byte-stream/.github/workflows/ci.yml create mode 100644 vendor/amphp/byte-stream/LICENSE create mode 100644 vendor/amphp/byte-stream/composer.json create mode 100644 vendor/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php create mode 100644 vendor/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php create mode 100644 vendor/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php create mode 100644 vendor/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php create mode 100644 vendor/amphp/byte-stream/lib/ClosedException.php create mode 100644 vendor/amphp/byte-stream/lib/InMemoryStream.php create mode 100644 vendor/amphp/byte-stream/lib/InputStream.php create mode 100644 vendor/amphp/byte-stream/lib/InputStreamChain.php create mode 100644 vendor/amphp/byte-stream/lib/IteratorStream.php create mode 100644 vendor/amphp/byte-stream/lib/LineReader.php create mode 100644 vendor/amphp/byte-stream/lib/Message.php create mode 100644 vendor/amphp/byte-stream/lib/OutputBuffer.php create mode 100644 vendor/amphp/byte-stream/lib/OutputStream.php create mode 100644 vendor/amphp/byte-stream/lib/Payload.php create mode 100644 vendor/amphp/byte-stream/lib/PendingReadError.php create mode 100644 vendor/amphp/byte-stream/lib/ResourceInputStream.php create mode 100644 vendor/amphp/byte-stream/lib/ResourceOutputStream.php create mode 100644 vendor/amphp/byte-stream/lib/StreamException.php create mode 100644 vendor/amphp/byte-stream/lib/ZlibInputStream.php create mode 100644 vendor/amphp/byte-stream/lib/ZlibOutputStream.php create mode 100644 vendor/amphp/byte-stream/lib/functions.php create mode 100644 vendor/amphp/byte-stream/psalm.xml mode change 120000 => 100755 vendor/bin/php-cs-fixer create mode 100755 vendor/bin/php-parse create mode 100755 vendor/bin/psalm create mode 100755 vendor/bin/psalm-language-server create mode 100755 vendor/bin/psalm-plugin create mode 100755 vendor/bin/psalm-refactor create mode 100755 vendor/bin/psalter create mode 100644 vendor/composer/package-versions-deprecated/CHANGELOG.md create mode 100644 vendor/composer/package-versions-deprecated/CONTRIBUTING.md create mode 100644 vendor/composer/package-versions-deprecated/LICENSE create mode 100644 vendor/composer/package-versions-deprecated/README.md create mode 100644 vendor/composer/package-versions-deprecated/SECURITY.md create mode 100644 vendor/composer/package-versions-deprecated/composer.json create mode 100644 vendor/composer/package-versions-deprecated/composer.lock create mode 100644 vendor/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php create mode 100644 vendor/composer/package-versions-deprecated/src/PackageVersions/Installer.php create mode 100644 vendor/composer/package-versions-deprecated/src/PackageVersions/Versions.php create mode 100644 vendor/composer/pcre/LICENSE create mode 100644 vendor/composer/pcre/README.md create mode 100644 vendor/composer/pcre/composer.json create mode 100644 vendor/composer/pcre/phpstan-baseline.neon create mode 100644 vendor/composer/pcre/src/MatchAllResult.php create mode 100644 vendor/composer/pcre/src/MatchAllWithOffsetsResult.php create mode 100644 vendor/composer/pcre/src/MatchResult.php create mode 100644 vendor/composer/pcre/src/MatchWithOffsetsResult.php create mode 100644 vendor/composer/pcre/src/PcreException.php create mode 100644 vendor/composer/pcre/src/Preg.php create mode 100644 vendor/composer/pcre/src/Regex.php create mode 100644 vendor/composer/pcre/src/ReplaceResult.php create mode 100644 vendor/composer/semver/CHANGELOG.md create mode 100644 vendor/composer/semver/LICENSE create mode 100644 vendor/composer/semver/README.md create mode 100644 vendor/composer/semver/composer.json create mode 100644 vendor/composer/semver/src/Comparator.php create mode 100644 vendor/composer/semver/src/CompilingMatcher.php create mode 100644 vendor/composer/semver/src/Constraint/Bound.php create mode 100644 vendor/composer/semver/src/Constraint/Constraint.php create mode 100644 vendor/composer/semver/src/Constraint/ConstraintInterface.php create mode 100644 vendor/composer/semver/src/Constraint/MatchAllConstraint.php create mode 100644 vendor/composer/semver/src/Constraint/MatchNoneConstraint.php create mode 100644 vendor/composer/semver/src/Constraint/MultiConstraint.php create mode 100644 vendor/composer/semver/src/Interval.php create mode 100644 vendor/composer/semver/src/Intervals.php create mode 100644 vendor/composer/semver/src/Semver.php create mode 100644 vendor/composer/semver/src/VersionParser.php create mode 100644 vendor/composer/xdebug-handler/CHANGELOG.md create mode 100644 vendor/composer/xdebug-handler/LICENSE create mode 100644 vendor/composer/xdebug-handler/README.md create mode 100644 vendor/composer/xdebug-handler/composer.json create mode 100644 vendor/composer/xdebug-handler/src/PhpConfig.php create mode 100644 vendor/composer/xdebug-handler/src/Process.php create mode 100644 vendor/composer/xdebug-handler/src/Status.php create mode 100644 vendor/composer/xdebug-handler/src/XdebugHandler.php create mode 100644 vendor/dnoegel/php-xdg-base-dir/LICENSE create mode 100644 vendor/dnoegel/php-xdg-base-dir/README.md create mode 100644 vendor/dnoegel/php-xdg-base-dir/composer.json create mode 100644 vendor/dnoegel/php-xdg-base-dir/src/Xdg.php create mode 100644 vendor/felixfbecker/advanced-json-rpc/.github/workflows/build.yml create mode 100644 vendor/felixfbecker/advanced-json-rpc/LICENSE create mode 100644 vendor/felixfbecker/advanced-json-rpc/composer.json create mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php create mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Error.php create mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php create mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/ErrorResponse.php create mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Message.php create mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Notification.php create mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Request.php create mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Response.php create mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php create mode 100644 vendor/felixfbecker/language-server-protocol/.editorconfig create mode 100644 vendor/felixfbecker/language-server-protocol/.github/workflows/build.yml create mode 100644 vendor/felixfbecker/language-server-protocol/LICENSE create mode 100644 vendor/felixfbecker/language-server-protocol/README.md create mode 100644 vendor/felixfbecker/language-server-protocol/composer.json create mode 100644 vendor/felixfbecker/language-server-protocol/package-lock.json create mode 100644 vendor/felixfbecker/language-server-protocol/package.json create mode 100644 vendor/felixfbecker/language-server-protocol/psalm-baseline.xml create mode 100644 vendor/felixfbecker/language-server-protocol/psalm.xml create mode 100644 vendor/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ChangeAnnotation.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspaceFileOperations.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientInfo.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeAction.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionContext.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionDisabled.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionTriggerKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeDescription.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeLens.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeLensOptions.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/Command.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionContext.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionItem.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionItemKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionItemLabelDetails.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionItemTag.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionList.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionOptions.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ContentChangeEvent.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DependencyReference.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/Diagnostic.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DiagnosticTag.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DidChangeConfigurationClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentHighlight.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentLinkClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ErrorCode.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ExecuteCommandClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/FailureHandlingKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/FileChangeType.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/FileEvent.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/FormattingOptions.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/Hover.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/InitializeResult.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/InsertTextFormat.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/InsertTextMode.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/Location.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/LogMessage.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/LogTrace.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/MarkedString.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/MarkupContent.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/MarkupKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/MessageActionItem.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/MessageType.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/MonikerClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/PackageDescriptor.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ParameterInformation.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/Position.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/Range.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ReferenceContext.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ReferenceInformation.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ResourceOperationKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SaveOptions.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SelectionRangeClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ServerCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ShowDocumentClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureHelp.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureInformation.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SymbolDescriptor.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SymbolInformation.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SymbolKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SymbolLocationInformation.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/SymbolTag.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentItem.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncOptions.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/TextEdit.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/TokenFormat.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/TypeDefinitionClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceEdit.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceFolder.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php create mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php create mode 100644 vendor/netresearch/jsonmapper/LICENSE create mode 100644 vendor/netresearch/jsonmapper/composer.json create mode 100644 vendor/netresearch/jsonmapper/contributing.rst create mode 100644 vendor/netresearch/jsonmapper/phpunit.xml create mode 100644 vendor/netresearch/jsonmapper/src/JsonMapper.php create mode 100644 vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php create mode 100644 vendor/nikic/php-parser/LICENSE create mode 100644 vendor/nikic/php-parser/README.md create mode 100755 vendor/nikic/php-parser/bin/php-parse create mode 100644 vendor/nikic/php-parser/composer.json create mode 100644 vendor/nikic/php-parser/grammar/README.md create mode 100644 vendor/nikic/php-parser/grammar/parser.template create mode 100644 vendor/nikic/php-parser/grammar/php5.y create mode 100644 vendor/nikic/php-parser/grammar/php7.y create mode 100644 vendor/nikic/php-parser/grammar/phpyLang.php create mode 100644 vendor/nikic/php-parser/grammar/rebuildParsers.php create mode 100644 vendor/nikic/php-parser/grammar/tokens.template create mode 100644 vendor/nikic/php-parser/grammar/tokens.y create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Comment.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Error.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NameContext.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Param.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php create mode 100644 vendor/openlss/lib-array2xml/.gitignore create mode 100644 vendor/openlss/lib-array2xml/COPYING create mode 100644 vendor/openlss/lib-array2xml/COPYING LESSER create mode 100644 vendor/openlss/lib-array2xml/LSS/Array2XML.php create mode 100644 vendor/openlss/lib-array2xml/LSS/XML2Array.php create mode 100644 vendor/openlss/lib-array2xml/README.md create mode 100644 vendor/openlss/lib-array2xml/composer.json create mode 100644 vendor/phpdocumentor/reflection-common/.github/dependabot.yml create mode 100644 vendor/phpdocumentor/reflection-common/.github/workflows/push.yml create mode 100644 vendor/phpdocumentor/reflection-common/LICENSE create mode 100644 vendor/phpdocumentor/reflection-common/README.md create mode 100644 vendor/phpdocumentor/reflection-common/composer.json create mode 100644 vendor/phpdocumentor/reflection-common/src/Element.php create mode 100644 vendor/phpdocumentor/reflection-common/src/File.php create mode 100644 vendor/phpdocumentor/reflection-common/src/Fqsen.php create mode 100644 vendor/phpdocumentor/reflection-common/src/Location.php create mode 100644 vendor/phpdocumentor/reflection-common/src/Project.php create mode 100644 vendor/phpdocumentor/reflection-common/src/ProjectFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/LICENSE create mode 100644 vendor/phpdocumentor/reflection-docblock/README.md create mode 100644 vendor/phpdocumentor/reflection-docblock/composer.json create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/Utils.php create mode 100644 vendor/phpdocumentor/type-resolver/LICENSE create mode 100644 vendor/phpdocumentor/type-resolver/README.md create mode 100644 vendor/phpdocumentor/type-resolver/composer.json create mode 100644 vendor/phpdocumentor/type-resolver/src/FqsenResolver.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoType.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/False_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/True_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Type.php create mode 100644 vendor/phpdocumentor/type-resolver/src/TypeResolver.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Array_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Boolean.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Callable_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ClassString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Collection.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Compound.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Context.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Expression.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Float_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Integer.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/InterfaceString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Intersection.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Never_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Null_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Nullable.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Object_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Parent_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Resource_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Scalar.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Self_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Static_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/String_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/This.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Void_.php create mode 100644 vendor/psr/log/LICENSE create mode 100644 vendor/psr/log/Psr/Log/AbstractLogger.php create mode 100644 vendor/psr/log/Psr/Log/InvalidArgumentException.php create mode 100644 vendor/psr/log/Psr/Log/LogLevel.php create mode 100644 vendor/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100644 vendor/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100644 vendor/psr/log/Psr/Log/LoggerInterface.php create mode 100644 vendor/psr/log/Psr/Log/LoggerTrait.php create mode 100644 vendor/psr/log/Psr/Log/NullLogger.php create mode 100644 vendor/psr/log/Psr/Log/Test/DummyTest.php create mode 100644 vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php create mode 100644 vendor/psr/log/Psr/Log/Test/TestLogger.php create mode 100644 vendor/psr/log/README.md create mode 100644 vendor/psr/log/composer.json create mode 100644 vendor/sebastian/diff/ChangeLog.md create mode 100644 vendor/sebastian/diff/LICENSE create mode 100644 vendor/sebastian/diff/README.md create mode 100644 vendor/sebastian/diff/composer.json create mode 100644 vendor/sebastian/diff/src/Chunk.php create mode 100644 vendor/sebastian/diff/src/Diff.php create mode 100644 vendor/sebastian/diff/src/Differ.php create mode 100644 vendor/sebastian/diff/src/Exception/ConfigurationException.php create mode 100644 vendor/sebastian/diff/src/Exception/Exception.php create mode 100644 vendor/sebastian/diff/src/Exception/InvalidArgumentException.php create mode 100644 vendor/sebastian/diff/src/Line.php create mode 100644 vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php create mode 100644 vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php create mode 100644 vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php create mode 100644 vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Parser.php create mode 100644 vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php create mode 100644 vendor/vimeo/psalm/LICENSE create mode 100644 vendor/vimeo/psalm/composer.json create mode 100644 vendor/vimeo/psalm/config.xsd create mode 100644 vendor/vimeo/psalm/dictionaries/CallMap.php create mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_71_delta.php create mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_72_delta.php create mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_73_delta.php create mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_74_delta.php create mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php create mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php create mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_historical.php create mode 100644 vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php create mode 100644 vendor/vimeo/psalm/dictionaries/PropertyMap.php create mode 100755 vendor/vimeo/psalm/psalm create mode 100755 vendor/vimeo/psalm/psalm-language-server create mode 100755 vendor/vimeo/psalm/psalm-plugin create mode 100755 vendor/vimeo/psalm/psalm-refactor create mode 100755 vendor/vimeo/psalm/psalter create mode 100644 vendor/vimeo/psalm/src/Psalm/Aliases.php create mode 100644 vendor/vimeo/psalm/src/Psalm/CodeLocation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/CodeLocation/Raw.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Codebase.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Config.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Config/Creator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Config/FileFilter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Config/IssueHandler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Context.php create mode 100644 vendor/vimeo/psalm/src/Psalm/DocComment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/ErrorBaseline.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/CodeException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/ComplicatedExpressionException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/ConfigCreationException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/ConfigException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/ConfigNotFoundException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/DocblockParseException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/FileIncludeException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/IncorrectDocblockException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/InvalidClasslikeOverrideException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/InvalidMethodOverrideException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/RefactorException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/ScopeAnalysisException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/TypeParseTreeException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/UnanalyzedFileException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/UnpopulatedClasslikeException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/UnpreparedAnalysisException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/UnsupportedIssueToFixException.php create mode 100644 vendor/vimeo/psalm/src/Psalm/FileBasedPluginAdapter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/FileManipulation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/FileSource.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Algebra.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Clause.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/CliUtils.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Composer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/DataFlowNode.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSource.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/AstDiffer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/EventDispatcher.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Json/Json.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Client/TextDocument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/TextDocument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/VarDocblockComment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/GenericTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/NullableTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Root.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Value.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/AbstractMethodCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ArgumentIssue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/AssignmentToVoid.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/CircularReference.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ClassIssue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/CodeIssue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ComplexMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ConfigIssue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ConflictingReferenceConstraint.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ConstructorSignatureMismatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ContinueOutsideLoop.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedConstant.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedFunction.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedProperty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedTrait.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DocblockTypeContradiction.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateConstant.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCase.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCaseValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateFunction.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateParam.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/EmptyArrayAccess.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ExtensionRequirementViolation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/FalsableReturnStatement.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/FalseOperand.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenCode.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenEcho.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/FunctionIssue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImplementationRequirementViolation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImplementedParamTypeMismatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImplementedReturnTypeMismatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImplicitToStringCast.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureByReferenceAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureFunctionCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureMethodCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticProperty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticVariable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureVariable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleClassConstant.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleProperty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InterfaceInstantiation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InternalClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InternalMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InternalProperty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidArgument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAccess.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayOffset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidAttribute.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidCast.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidCatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidClone.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblock.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblockParamName.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumBackingType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumCaseValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidExtendClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidFalsableReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidFunctionCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidGlobal.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidIterator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidLiteralArgument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidMethodCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidNamedArgument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidNullableReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidOperand.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidParamDefault.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidParent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidPassByReference.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignmentValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnStatement.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidScalarArgument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidScope.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidStaticInvocation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidStringClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidTemplateParam.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidThrow.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidToString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidTraversableImplementation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidTypeImport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificImplementedReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnStatement.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/LoopInvalidation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MethodIssue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockParamType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockPropertyType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureParamType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingConstructor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingDependency.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingDocblockType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingFile.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingImmutableAnnotation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingParamType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingPropertyType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingTemplateParam.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingThrowsDocblock.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArgument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayOffset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayTypeCoercion.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedClone.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedFunctionCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedInferredReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedIssue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedIssueTrait.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedOperand.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyTypeCoercion.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnTypeCoercion.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedStringOffsetAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificImplementedParamType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificReturnType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MutableDependency.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NamedArgumentNotAllowed.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NoEnumProperties.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NoInterfaceProperties.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NoValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantDocblockPropertyType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantPropertyType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NonStaticSelfCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullArgument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullArrayAccess.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullArrayOffset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullFunctionCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullIterator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullOperand.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullReference.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullableReturnStatement.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/OverriddenMethodAccess.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/OverriddenPropertyAccess.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ParadoxicalCondition.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ParamNameMismatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ParentNotFound.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ParseError.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PluginIssue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossibleRawObjectIteration.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseArgument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseIterator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseOperand.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseReference.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArgument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAccess.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayOffset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidCast.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidClone.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidDocblockTag.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidFunctionCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidIterator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidMethodCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidOperand.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArgument.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAccess.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayOffset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullFunctionCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullIterator.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullOperand.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullReference.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedVariable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedParam.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedProperty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedReturnValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PropertyIssue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PsalmInternalError.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RawObjectIteration.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantCast.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantCastGivenDocblockType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantCondition.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantIdentityWithTrue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantPropertyInitializationCheck.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ReferenceConstraintViolation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ReservedWord.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/StringIncrement.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedCallable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedCookie.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedCustom.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedEval.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedFile.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedHeader.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedHtml.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedInclude.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedInput.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedSSRF.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedShell.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedSql.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedSystemSecret.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedTextWithQuotes.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedUnserialize.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedUserSecret.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TooFewArguments.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TooManyArguments.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TooManyTemplateParams.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/Trace.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TraitMethodSignatureMismatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainNull.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedAttributeClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedConstant.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedDocblockClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedFunction.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedGlobalVariable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterfaceMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyAssignment.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrace.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrait.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedVariable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnevaluatedCode.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnhandledMatchCondition.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedAbstractMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedInterfaceMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UninitializedProperty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnnecessaryVarAnnotation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedExpression.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedStatement.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnresolvableInclude.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnsafeGenericInstantiation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnsafeInstantiation.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedClosureParam.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedConstructor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedForeachValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedFunctionCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethodCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedParam.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedProperty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedPsalmSuppress.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedReturnValue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedVariable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/VariableIssue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/IssueBuffer.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMul.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPow.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualArray.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualBool.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualDouble.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualInt.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualObject.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualUnset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArray.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayDimFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayItem.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrowFunction.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssign.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssignRef.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBitwiseNot.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBooleanNot.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClassConstFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClone.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosure.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosureUse.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualConstFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEmpty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualError.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualErrorSuppress.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEval.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualExit.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualFuncCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInclude.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInstanceof.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualIsset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualList.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMethodCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNew.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostDec.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostInc.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreDec.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreInc.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPrint.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualShellExec.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticCall.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualTernary.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualThrow.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryMinus.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryPlus.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualVariable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYield.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYieldFrom.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualFullyQualified.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualRelative.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualDNumber.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsed.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualLNumber.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualBreak.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCase.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassConst.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassMethod.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualConst.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualContinue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclare.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDo.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualEcho.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElse.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElseIf.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualExpression.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFinally.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualForeach.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFunction.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGlobal.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGoto.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGroupUse.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualHaltCompiler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualIf.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInlineHTML.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualLabel.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNamespace.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNop.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualProperty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualPropertyProperty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualReturn.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStatic.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStaticVar.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualSwitch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualThrow.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTrait.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTraitUse.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTryCatch.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUnset.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUse.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUseUse.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualWhile.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualArg.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualAttribute.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualAttributeGroup.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualConst.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualIdentifier.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualMatchArm.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualName.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualNode.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualNullableType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualParam.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualUnionType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualVarLikeIdentifier.php create mode 100644 vendor/vimeo/psalm/src/Psalm/NodeTypeProvider.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeExistenceCheckInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeVisitInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterCodebasePopulatedInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterEveryFunctionCallAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterExpressionAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFileAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionCallAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionLikeAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterMethodCallAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterStatementAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/BeforeFileAnalysisInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionExistenceProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/PluginEntryPointInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/RegistrationInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Shepherd.php create mode 100644 vendor/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Progress/DebugProgress.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Progress/LongProgress.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Progress/Progress.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Progress/VoidProgress.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/CompactReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/ConsoleReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/CountReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/EmacsReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/JsonReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/JunitReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/PhpStormReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/PylintReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/ReportOptions.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/SarifReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/TextReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Report/XmlReport.php create mode 100644 vendor/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php create mode 100644 vendor/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php create mode 100644 vendor/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php create mode 100644 vendor/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php create mode 100644 vendor/vimeo/psalm/src/Psalm/StatementsSource.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/Assertion.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/AttributeArg.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/FileStorage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/MethodStorage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/GenericTrait.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAnonymousClassInstance.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableKeyedArray.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableList.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableObject.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyNumeric.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyScalar.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEnumCase.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFloat.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TList.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TMixed.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyMixed.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyScalar.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonFalsyString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNull.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTypeAlias.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/NodeVisitor.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Reconciler.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/TaintKind.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/TaintKindGroup.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/TypeNode.php create mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Union.php create mode 100644 vendor/vimeo/psalm/src/command_functions.php create mode 100644 vendor/vimeo/psalm/src/functions.php create mode 100644 vendor/vimeo/psalm/src/psalm-language-server.php create mode 100644 vendor/vimeo/psalm/src/psalm-refactor.php create mode 100644 vendor/vimeo/psalm/src/psalm.php create mode 100644 vendor/vimeo/psalm/src/psalm_plugin.php create mode 100644 vendor/vimeo/psalm/src/psalter.php create mode 100644 vendor/vimeo/psalm/src/spl_object_id.php create mode 100644 vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub create mode 100644 vendor/vimeo/psalm/stubs/CoreGenericFunctions.phpstub create mode 100644 vendor/vimeo/psalm/stubs/CoreGenericIterators.phpstub create mode 100644 vendor/vimeo/psalm/stubs/CoreImmutableClasses.phpstub create mode 100644 vendor/vimeo/psalm/stubs/DOM.phpstub create mode 100644 vendor/vimeo/psalm/stubs/Php80.phpstub create mode 100644 vendor/vimeo/psalm/stubs/Php81.phpstub create mode 100644 vendor/vimeo/psalm/stubs/Reflection.phpstub create mode 100644 vendor/vimeo/psalm/stubs/SPL.phpstub create mode 100644 vendor/vimeo/psalm/stubs/Xdebug.phpstub create mode 100644 vendor/vimeo/psalm/stubs/decimal.phpstub create mode 100644 vendor/vimeo/psalm/stubs/ext-apcu.phpstub create mode 100644 vendor/vimeo/psalm/stubs/ext-ds.phpstub create mode 100644 vendor/vimeo/psalm/stubs/ext-geos.phpstub create mode 100644 vendor/vimeo/psalm/stubs/mongodb.phpstub create mode 100644 vendor/vimeo/psalm/stubs/mysqli.phpstub create mode 100644 vendor/vimeo/psalm/stubs/pdo.phpstub create mode 100644 vendor/vimeo/psalm/stubs/phpparser.phpstub create mode 100644 vendor/vimeo/psalm/stubs/phpredis.phpstub create mode 100644 vendor/vimeo/psalm/stubs/soap.phpstub create mode 100644 vendor/webmozart/assert/CHANGELOG.md create mode 100644 vendor/webmozart/assert/LICENSE create mode 100644 vendor/webmozart/assert/README.md create mode 100644 vendor/webmozart/assert/composer.json create mode 100644 vendor/webmozart/assert/src/Assert.php create mode 100644 vendor/webmozart/assert/src/InvalidArgumentException.php create mode 100644 vendor/webmozart/assert/src/Mixin.php create mode 100644 vendor/webmozart/path-util/.gitignore create mode 100644 vendor/webmozart/path-util/.styleci.yml create mode 100644 vendor/webmozart/path-util/.travis.yml create mode 100644 vendor/webmozart/path-util/CHANGELOG.md create mode 100644 vendor/webmozart/path-util/LICENSE create mode 100644 vendor/webmozart/path-util/README.md create mode 100644 vendor/webmozart/path-util/appveyor.yml create mode 100644 vendor/webmozart/path-util/composer.json create mode 100644 vendor/webmozart/path-util/docs/usage.md create mode 100644 vendor/webmozart/path-util/phpunit.xml.dist create mode 100644 vendor/webmozart/path-util/src/Path.php create mode 100644 vendor/webmozart/path-util/src/Url.php create mode 100644 vendor/webmozart/path-util/tests/PathTest.php create mode 100644 vendor/webmozart/path-util/tests/UrlTest.php diff --git a/composer.json b/composer.json index 90683020..a1afd71f 100644 --- a/composer.json +++ b/composer.json @@ -23,9 +23,13 @@ "cs:fix": "php-cs-fixer fix", "lint": "find . -name \\*.php -not -path './vendor*' -not -path './build/*' -not -path './node_modules/*' -print0 | xargs -0 -n1 php -l", "post-install-cmd": ["@composer bin all install --ansi"], - "post-update-cmd": ["@composer bin all update --ansi"] + "post-update-cmd": ["@composer bin all update --ansi"], + "psalm": "psalm", + "psalm:fix": "psalm --alter --issues=InvalidReturnType,InvalidNullableReturnType,MissingParamType,InvalidFalsableReturnType", + "psalm:update-baseline": "psalm --threads=1 --update-baseline" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.5" + "bamarni/composer-bin-plugin": "^1.5", + "vimeo/psalm": "^4.26" } } diff --git a/composer.lock b/composer.lock index a2cc241d..be76e46f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "41e003a0aea3705ba595ca045d13224e", + "content-hash": "14070e04f41bafba05d6808f713bb088", "packages": [ { "name": "psr/container", @@ -541,6 +541,172 @@ } ], "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2022-02-20T17:52:18+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "http://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2021-03-30T17:13:30+00:00" + }, { "name": "bamarni/composer-bin-plugin", "version": "v1.5.0", @@ -586,6 +752,1087 @@ "tool" ], "time": "2022-02-22T21:01:25+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.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.0.0" + }, + "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-02-25T20:21:48+00:00" + }, + { + "name": "composer/semver", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.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/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-04-01T19:23:25+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "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/3.0.3" + }, + "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-02-25T21:32:43+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + }, + "time": "2022-03-02T22:36:06+00:00" + }, + { + "name": "netresearch/jsonmapper", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" + }, + "time": "2020-12-01T19:48:11+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.14.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + }, + "time": "2022-05-31T20:59:12+00:00" + }, + { + "name": "openlss/lib-array2xml", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/nullivex/lib-array2xml.git", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "LSS": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Bryan Tong", + "email": "bryan@nullivex.com", + "homepage": "https://www.nullivex.com" + }, + { + "name": "Tony Butler", + "email": "spudz76@gmail.com", + "homepage": "https://www.nullivex.com" + } + ], + "description": "Array2XML conversion library credit to lalit.org", + "homepage": "https://www.nullivex.com", + "keywords": [ + "array", + "array conversion", + "xml", + "xml conversion" + ], + "support": { + "issues": "https://github.com/nullivex/lib-array2xml/issues", + "source": "https://github.com/nullivex/lib-array2xml/tree/master" + }, + "time": "2019-03-29T20:06:56+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "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.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "77a32518733312af16a44300404e945338981de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "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/1.6.1" + }, + "time": "2022-03-15T21:29:03+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "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": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "vimeo/psalm", + "version": "4.26.0", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "6998fabb2bf528b65777bf9941920888d23c03ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/6998fabb2bf528b65777bf9941920888d23c03ac", + "reference": "6998fabb2bf528b65777bf9941920888d23c03ac", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer/package-versions-deprecated": "^1.8.0", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.0.3", + "felixfbecker/language-server-protocol": "^1.5", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.13", + "openlss/lib-array2xml": "^1.0", + "php": "^7.1|^8", + "sebastian/diff": "^3.0 || ^4.0", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.25", + "webmozart/path-util": "^2.3" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "brianium/paratest": "^4.0||^6.0", + "ext-curl": "*", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpdocumentor/reflection-docblock": "^5", + "phpmyadmin/sql-parser": "5.1.0||dev-master", + "phpspec/prophecy": ">=1.9.0", + "phpunit/phpunit": "^9.0", + "psalm/plugin-phpunit": "^0.16", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.3 || ^5.0 || ^6.0", + "weirdan/prophecy-shim": "^1.0 || ^2.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php", + "src/spl_object_id.php" + ], + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php" + ], + "support": { + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm/tree/4.26.0" + }, + "time": "2022-07-31T13:10:26+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "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/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "webmozart/path-util", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/path-util.git", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "webmozart/assert": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\PathUtil\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", + "support": { + "issues": "https://github.com/webmozart/path-util/issues", + "source": "https://github.com/webmozart/path-util/tree/2.3.0" + }, + "abandoned": "symfony/filesystem", + "time": "2015-12-17T08:42:14+00:00" } ], "aliases": [], @@ -598,5 +1845,5 @@ "platform-overrides": { "php": "7.4" }, - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.3.0" } diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 00000000..f0f625cd --- /dev/null +++ b/psalm.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/vendor-bin/coding-standard/composer.lock b/vendor-bin/coding-standard/composer.lock index 59cc8db7..6dd1d152 100644 --- a/vendor-bin/coding-standard/composer.lock +++ b/vendor-bin/coding-standard/composer.lock @@ -600,6 +600,9 @@ "psr", "psr-6" ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, "time": "2016-08-06T20:24:11+00:00" }, { @@ -644,6 +647,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, "time": "2021-11-05T16:50:12+00:00" }, { @@ -741,20 +748,23 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, "time": "2021-05-03T11:20:27+00:00" }, { "name": "symfony/console", - "version": "v5.4.10", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000" + "reference": "535846c7ee6bc4dd027ca0d93220601456734b10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000", - "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000", + "url": "https://api.github.com/repos/symfony/console/zipball/535846c7ee6bc4dd027ca0d93220601456734b10", + "reference": "535846c7ee6bc4dd027ca0d93220601456734b10", "shasum": "" }, "require": { @@ -823,6 +833,9 @@ "console", "terminal" ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.11" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -837,7 +850,7 @@ "type": "tidelift" } ], - "time": "2022-06-26T13:00:04+00:00" + "time": "2022-07-22T10:42:43+00:00" }, { "name": "symfony/deprecation-contracts", @@ -887,6 +900,9 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -969,6 +985,9 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1045,6 +1064,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1063,16 +1085,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.9", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba" + "reference": "6699fb0228d1bc35b12aed6dd5e7455457609ddd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba", - "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6699fb0228d1bc35b12aed6dd5e7455457609ddd", + "reference": "6699fb0228d1bc35b12aed6dd5e7455457609ddd", "shasum": "" }, "require": { @@ -1106,6 +1128,9 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.11" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1120,20 +1145,20 @@ "type": "tidelift" } ], - "time": "2022-05-20T13:55:35+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/finder", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { @@ -1166,6 +1191,9 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.11" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1180,20 +1208,20 @@ "type": "tidelift" } ], - "time": "2022-04-15T08:07:45+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.4.3", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8" + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/cc1147cb11af1b43f503ac18f31aa3bec213aba8", - "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/54f14e36aa73cb8f7261d7686691fd4d75ea2690", + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690", "shasum": "" }, "require": { @@ -1232,6 +1260,9 @@ "configuration", "options" ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.4.11" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1246,7 +1277,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1638,6 +1669,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1818,16 +1852,16 @@ }, { "name": "symfony/process", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { @@ -1859,6 +1893,9 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.11" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1873,7 +1910,7 @@ "type": "tidelift" } ], - "time": "2022-04-08T05:07:18+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/service-contracts", @@ -1939,6 +1976,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1998,6 +2038,9 @@ ], "description": "Provides a way to profile code", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.4.5" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -2016,16 +2059,16 @@ }, { "name": "symfony/string", - "version": "v5.4.10", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097" + "reference": "5eb661e49ad389e4ae2b6e4df8d783a8a6548322" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097", - "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097", + "url": "https://api.github.com/repos/symfony/string/zipball/5eb661e49ad389e4ae2b6e4df8d783a8a6548322", + "reference": "5eb661e49ad389e4ae2b6e4df8d783a8a6548322", "shasum": "" }, "require": { @@ -2081,6 +2124,9 @@ "utf-8", "utf8" ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.11" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -2095,7 +2141,7 @@ "type": "tidelift" } ], - "time": "2022-06-26T15:57:47+00:00" + "time": "2022-07-24T16:15:25+00:00" } ], "aliases": [], @@ -2108,5 +2154,5 @@ "platform-overrides": { "php": "7.4" }, - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.3.0" } diff --git a/vendor/amphp/amp/LICENSE b/vendor/amphp/amp/LICENSE new file mode 100644 index 00000000..2b431ba0 --- /dev/null +++ b/vendor/amphp/amp/LICENSE @@ -0,0 +1,23 @@ + +The MIT License (MIT) + +Copyright (c) 2015-2019 amphp +Copyright (c) 2016 PHP Asynchronous Interoperability Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/amphp/amp/composer.json b/vendor/amphp/amp/composer.json new file mode 100644 index 00000000..c50a2bdc --- /dev/null +++ b/vendor/amphp/amp/composer.json @@ -0,0 +1,74 @@ +{ + "name": "amphp/amp", + "homepage": "https://amphp.org/amp", + "description": "A non-blocking concurrency framework for PHP applications.", + "keywords": [ + "async", + "asynchronous", + "concurrency", + "promise", + "awaitable", + "future", + "non-blocking", + "event", + "event-loop" + ], + "license": "MIT", + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "require": { + "php": ">=7.1" + }, + "require-dev": { + "ext-json": "*", + "amphp/phpunit-util": "^1", + "amphp/php-cs-fixer-config": "dev-master", + "react/promise": "^2", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "jetbrains/phpstorm-stubs": "^2019.3" + }, + "autoload": { + "psr-4": { + "Amp\\": "lib" + }, + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Amp\\Test\\": "test" + } + }, + "support": { + "issues": "https://github.com/amphp/amp/issues", + "irc": "irc://irc.freenode.org/amphp" + }, + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "scripts": { + "test": "@php -dzend.assertions=1 -dassert.exception=1 ./vendor/bin/phpunit", + "code-style": "@php ./vendor/bin/php-cs-fixer fix" + } +} diff --git a/vendor/amphp/amp/lib/CallableMaker.php b/vendor/amphp/amp/lib/CallableMaker.php new file mode 100644 index 00000000..8fa8cff7 --- /dev/null +++ b/vendor/amphp/amp/lib/CallableMaker.php @@ -0,0 +1,80 @@ +getMethod($method); + } + + return self::$__reflectionMethods[$method]->getClosure($this); + } + + /** + * Creates a callable from a protected or private static method that may be invoked by methods requiring a + * publicly invokable callback. + * + * @param string $method Static method name. + * + * @return callable + * + * @psalm-suppress MixedInferredReturnType + */ + private static function callableFromStaticMethod(string $method): callable + { + if (!isset(self::$__reflectionMethods[$method])) { + if (self::$__reflectionClass === null) { + self::$__reflectionClass = new \ReflectionClass(self::class); + } + self::$__reflectionMethods[$method] = self::$__reflectionClass->getMethod($method); + } + + return self::$__reflectionMethods[$method]->getClosure(); + } + } +} else { + /** @psalm-suppress DuplicateClass */ + trait CallableMaker + { + /** + * @deprecated Use \Closure::fromCallable() instead of this method in PHP 7.1. + */ + private function callableFromInstanceMethod(string $method): callable + { + return \Closure::fromCallable([$this, $method]); + } + + /** + * @deprecated Use \Closure::fromCallable() instead of this method in PHP 7.1. + */ + private static function callableFromStaticMethod(string $method): callable + { + return \Closure::fromCallable([self::class, $method]); + } + } +} // @codeCoverageIgnoreEnd diff --git a/vendor/amphp/amp/lib/CancellationToken.php b/vendor/amphp/amp/lib/CancellationToken.php new file mode 100644 index 00000000..b802994d --- /dev/null +++ b/vendor/amphp/amp/lib/CancellationToken.php @@ -0,0 +1,49 @@ +getToken(); + * + * $response = yield $httpClient->request("https://example.com/stream", $token); + * $responseBody = $response->getBody(); + * + * while (($chunk = yield $response->read()) !== null) { + * // consume $chunk + * + * if ($noLongerInterested) { + * $cancellationTokenSource->cancel(); + * break; + * } + * } + * ``` + * + * @see CancellationToken + * @see CancelledException + */ +final class CancellationTokenSource +{ + /** @var CancellationToken */ + private $token; + + /** @var callable|null */ + private $onCancel; + + public function __construct() + { + $onCancel = null; + + $this->token = new class($onCancel) implements CancellationToken { + /** @var string */ + private $nextId = "a"; + + /** @var callable[] */ + private $callbacks = []; + + /** @var \Throwable|null */ + private $exception; + + /** + * @param mixed $onCancel + * @param-out callable $onCancel + */ + public function __construct(&$onCancel) + { + /** @psalm-suppress MissingClosureReturnType We still support PHP 7.0 */ + $onCancel = function (\Throwable $exception) { + $this->exception = $exception; + + $callbacks = $this->callbacks; + $this->callbacks = []; + + foreach ($callbacks as $callback) { + $this->invokeCallback($callback); + } + }; + } + + /** + * @param callable $callback + * + * @return void + */ + private function invokeCallback(callable $callback) + { + // No type declaration to prevent exception outside the try! + try { + /** @var mixed $result */ + $result = $callback($this->exception); + + if ($result instanceof \Generator) { + /** @psalm-var \Generator $result */ + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + Loop::defer(static function () use ($exception) { + throw $exception; + }); + } + } + + public function subscribe(callable $callback): string + { + $id = $this->nextId++; + + if ($this->exception) { + $this->invokeCallback($callback); + } else { + $this->callbacks[$id] = $callback; + } + + return $id; + } + + public function unsubscribe(string $id) + { + unset($this->callbacks[$id]); + } + + public function isRequested(): bool + { + return isset($this->exception); + } + + public function throwIfRequested() + { + if (isset($this->exception)) { + throw $this->exception; + } + } + }; + + $this->onCancel = $onCancel; + } + + public function getToken(): CancellationToken + { + return $this->token; + } + + /** + * @param \Throwable|null $previous Exception to be used as the previous exception to CancelledException. + * + * @return void + */ + public function cancel(\Throwable $previous = null) + { + if ($this->onCancel === null) { + return; + } + + $onCancel = $this->onCancel; + $this->onCancel = null; + $onCancel(new CancelledException($previous)); + } +} diff --git a/vendor/amphp/amp/lib/CancelledException.php b/vendor/amphp/amp/lib/CancelledException.php new file mode 100644 index 00000000..25f8c400 --- /dev/null +++ b/vendor/amphp/amp/lib/CancelledException.php @@ -0,0 +1,17 @@ +exception; + $thatCallbacks = &$this->callbacks; + + foreach ($tokens as $token) { + $id = $token->subscribe(static function (CancelledException $exception) use (&$thatException, &$thatCallbacks) { + $thatException = $exception; + + $callbacks = $thatCallbacks; + $thatCallbacks = []; + + foreach ($callbacks as $callback) { + asyncCall($callback, $thatException); + } + }); + + $this->tokens[] = [$token, $id]; + } + } + + public function __destruct() + { + foreach ($this->tokens as list($token, $id)) { + /** @var CancellationToken $token */ + $token->unsubscribe($id); + } + } + + /** @inheritdoc */ + public function subscribe(callable $callback): string + { + $id = $this->nextId++; + + if ($this->exception) { + asyncCall($callback, $this->exception); + } else { + $this->callbacks[$id] = $callback; + } + + return $id; + } + + /** @inheritdoc */ + public function unsubscribe(string $id) + { + unset($this->callbacks[$id]); + } + + /** @inheritdoc */ + public function isRequested(): bool + { + foreach ($this->tokens as list($token)) { + if ($token->isRequested()) { + return true; + } + } + + return false; + } + + /** @inheritdoc */ + public function throwIfRequested() + { + foreach ($this->tokens as list($token)) { + $token->throwIfRequested(); + } + } +} diff --git a/vendor/amphp/amp/lib/Coroutine.php b/vendor/amphp/amp/lib/Coroutine.php new file mode 100644 index 00000000..5a3b4aa8 --- /dev/null +++ b/vendor/amphp/amp/lib/Coroutine.php @@ -0,0 +1,160 @@ + + */ +final class Coroutine implements Promise +{ + use Internal\Placeholder; + + /** + * Attempts to transform the non-promise yielded from the generator into a promise, otherwise returns an instance + * `Amp\Failure` failed with an instance of `Amp\InvalidYieldError`. + * + * @param mixed $yielded Non-promise yielded from generator. + * @param \Generator $generator No type for performance, we already know the type. + * + * @return Promise + */ + private static function transform($yielded, $generator): Promise + { + $exception = null; // initialize here, see https://github.com/vimeo/psalm/issues/2951 + + try { + if (\is_array($yielded)) { + return Promise\all($yielded); + } + + if ($yielded instanceof ReactPromise) { + return Promise\adapt($yielded); + } + + // No match, continue to returning Failure below. + } catch (\Throwable $exception) { + // Conversion to promise failed, fall-through to returning Failure below. + } + + return new Failure(new InvalidYieldError( + $generator, + \sprintf( + "Unexpected yield; Expected an instance of %s or %s or an array of such instances", + Promise::class, + ReactPromise::class + ), + $exception + )); + } + + /** + * @param \Generator $generator + * @psalm-param \Generator,mixed,Promise|ReactPromise|TReturn> $generator + */ + public function __construct(\Generator $generator) + { + try { + $yielded = $generator->current(); + + if (!$yielded instanceof Promise) { + if (!$generator->valid()) { + $this->resolve($generator->getReturn()); + return; + } + + $yielded = self::transform($yielded, $generator); + } + } catch (\Throwable $exception) { + $this->fail($exception); + return; + } + + /** + * @param \Throwable|null $e Exception to be thrown into the generator. + * @param mixed $v Value to be sent into the generator. + * + * @return void + * + * @psalm-suppress MissingClosureParamType + * @psalm-suppress MissingClosureReturnType + */ + $onResolve = function (\Throwable $e = null, $v) use ($generator, &$onResolve) { + /** @var bool $immediate Used to control iterative coroutine continuation. */ + static $immediate = true; + + /** @var \Throwable|null $exception Promise failure reason when executing next coroutine step, null at all other times. */ + static $exception; + + /** @var mixed $value Promise success value when executing next coroutine step, null at all other times. */ + static $value; + + $exception = $e; + /** @psalm-suppress MixedAssignment */ + $value = $v; + + if (!$immediate) { + $immediate = true; + return; + } + + try { + try { + do { + if ($exception) { + // Throw exception at current execution point. + $yielded = $generator->throw($exception); + } else { + // Send the new value and execute to next yield statement. + $yielded = $generator->send($value); + } + + if (!$yielded instanceof Promise) { + if (!$generator->valid()) { + $this->resolve($generator->getReturn()); + $onResolve = null; + return; + } + + $yielded = self::transform($yielded, $generator); + } + + $immediate = false; + $yielded->onResolve($onResolve); + } while ($immediate); + + $immediate = true; + } catch (\Throwable $exception) { + $this->fail($exception); + $onResolve = null; + } finally { + $exception = null; + $value = null; + } + } catch (\Throwable $e) { + Loop::defer(static function () use ($e) { + throw $e; + }); + } + }; + + try { + $yielded->onResolve($onResolve); + + unset($generator, $yielded, $onResolve); + } catch (\Throwable $e) { + Loop::defer(static function () use ($e) { + throw $e; + }); + } + } +} diff --git a/vendor/amphp/amp/lib/Deferred.php b/vendor/amphp/amp/lib/Deferred.php new file mode 100644 index 00000000..cec1c5a4 --- /dev/null +++ b/vendor/amphp/amp/lib/Deferred.php @@ -0,0 +1,76 @@ + Has public resolve and fail methods. */ + private $resolver; + + /** @var Promise Hides placeholder methods */ + private $promise; + + public function __construct() + { + $this->resolver = new class implements Promise { + use Internal\Placeholder { + resolve as public; + fail as public; + isResolved as public; + } + }; + + $this->promise = new Internal\PrivatePromise($this->resolver); + } + + /** + * @return Promise + */ + public function promise(): Promise + { + return $this->promise; + } + + /** + * Fulfill the promise with the given value. + * + * @param mixed $value + * + * @psalm-param TValue|Promise $value + * + * @return void + */ + public function resolve($value = null) + { + /** @psalm-suppress UndefinedInterfaceMethod */ + $this->resolver->resolve($value); + } + + /** + * Fails the promise the the given reason. + * + * @param \Throwable $reason + * + * @return void + */ + public function fail(\Throwable $reason) + { + /** @psalm-suppress UndefinedInterfaceMethod */ + $this->resolver->fail($reason); + } + + /** + * @return bool True if the promise has been resolved. + */ + public function isResolved(): bool + { + return $this->resolver->isResolved(); + } +} diff --git a/vendor/amphp/amp/lib/Delayed.php b/vendor/amphp/amp/lib/Delayed.php new file mode 100644 index 00000000..ec9b4202 --- /dev/null +++ b/vendor/amphp/amp/lib/Delayed.php @@ -0,0 +1,58 @@ + + */ +final class Delayed implements Promise +{ + use Internal\Placeholder; + + /** @var string|null Event loop watcher identifier. */ + private $watcher; + + /** + * @param int $time Milliseconds before succeeding the promise. + * @param TReturn $value Succeed the promise with this value. + */ + public function __construct(int $time, $value = null) + { + $this->watcher = Loop::delay($time, function () use ($value) { + $this->watcher = null; + $this->resolve($value); + }); + } + + /** + * References the internal watcher in the event loop, keeping the loop running while this promise is pending. + * + * @return self + */ + public function reference(): self + { + if ($this->watcher !== null) { + Loop::reference($this->watcher); + } + + return $this; + } + + /** + * Unreferences the internal watcher in the event loop, allowing the loop to stop while this promise is pending if + * no other events are pending in the loop. + * + * @return self + */ + public function unreference(): self + { + if ($this->watcher !== null) { + Loop::unreference($this->watcher); + } + + return $this; + } +} diff --git a/vendor/amphp/amp/lib/Emitter.php b/vendor/amphp/amp/lib/Emitter.php new file mode 100644 index 00000000..cd6b7e54 --- /dev/null +++ b/vendor/amphp/amp/lib/Emitter.php @@ -0,0 +1,84 @@ + Has public emit, complete, and fail methods. */ + private $emitter; + + /** @var Iterator Hides producer methods. */ + private $iterator; + + public function __construct() + { + $this->emitter = new class implements Iterator { + use Internal\Producer { + emit as public; + complete as public; + fail as public; + } + }; + + $this->iterator = new Internal\PrivateIterator($this->emitter); + } + + /** + * @return Iterator + * @psalm-return Iterator + */ + public function iterate(): Iterator + { + return $this->iterator; + } + + /** + * Emits a value to the iterator. + * + * @param mixed $value + * + * @psalm-param TValue $value + * + * @return Promise + * @psalm-return Promise + * @psalm-suppress MixedInferredReturnType + * @psalm-suppress MixedReturnStatement + */ + public function emit($value): Promise + { + /** @psalm-suppress UndefinedInterfaceMethod */ + return $this->emitter->emit($value); + } + + /** + * Completes the iterator. + * + * @return void + */ + public function complete() + { + /** @psalm-suppress UndefinedInterfaceMethod */ + $this->emitter->complete(); + } + + /** + * Fails the iterator with the given reason. + * + * @param \Throwable $reason + * + * @return void + */ + public function fail(\Throwable $reason) + { + /** @psalm-suppress UndefinedInterfaceMethod */ + $this->emitter->fail($reason); + } +} diff --git a/vendor/amphp/amp/lib/Failure.php b/vendor/amphp/amp/lib/Failure.php new file mode 100644 index 00000000..4c1ea62d --- /dev/null +++ b/vendor/amphp/amp/lib/Failure.php @@ -0,0 +1,52 @@ + + */ +final class Failure implements Promise +{ + /** @var \Throwable $exception */ + private $exception; + + /** + * @param \Throwable $exception Rejection reason. + */ + public function __construct(\Throwable $exception) + { + $this->exception = $exception; + } + + /** + * {@inheritdoc} + */ + public function onResolve(callable $onResolved) + { + try { + /** @var mixed $result */ + $result = $onResolved($this->exception, null); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + Promise\rethrow($result); + } + } catch (\Throwable $exception) { + Loop::defer(static function () use ($exception) { + throw $exception; + }); + } + } +} diff --git a/vendor/amphp/amp/lib/Internal/Placeholder.php b/vendor/amphp/amp/lib/Internal/Placeholder.php new file mode 100644 index 00000000..dccf6067 --- /dev/null +++ b/vendor/amphp/amp/lib/Internal/Placeholder.php @@ -0,0 +1,187 @@ +, mixed, + * mixed>|null)|callable(\Throwable|null, mixed): void */ + private $onResolved; + + /** @var null|array */ + private $resolutionTrace; + + /** + * @inheritdoc + */ + public function onResolve(callable $onResolved) + { + if ($this->resolved) { + if ($this->result instanceof Promise) { + $this->result->onResolve($onResolved); + return; + } + + try { + /** @var mixed $result */ + $result = $onResolved(null, $this->result); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + Promise\rethrow($result); + } + } catch (\Throwable $exception) { + Loop::defer(static function () use ($exception) { + throw $exception; + }); + } + return; + } + + if (null === $this->onResolved) { + $this->onResolved = $onResolved; + return; + } + + if (!$this->onResolved instanceof ResolutionQueue) { + /** @psalm-suppress InternalClass */ + $this->onResolved = new ResolutionQueue($this->onResolved); + } + + /** @psalm-suppress InternalMethod */ + $this->onResolved->push($onResolved); + } + + public function __destruct() + { + try { + $this->result = null; + } catch (\Throwable $e) { + Loop::defer(static function () use ($e) { + throw $e; + }); + } + } + + /** + * @param mixed $value + * + * @return void + * + * @throws \Error Thrown if the promise has already been resolved. + */ + private function resolve($value = null) + { + if ($this->resolved) { + $message = "Promise has already been resolved"; + + if (isset($this->resolutionTrace)) { + $trace = formatStacktrace($this->resolutionTrace); + $message .= ". Previous resolution trace:\n\n{$trace}\n\n"; + } else { + // @codeCoverageIgnoreStart + $message .= ", define environment variable AMP_DEBUG or const AMP_DEBUG = true and enable assertions " + . "for a stacktrace of the previous resolution."; + // @codeCoverageIgnoreEnd + } + + throw new \Error($message); + } + + \assert((function () { + $env = \getenv("AMP_DEBUG") ?: "0"; + if (($env !== "0" && $env !== "false") || (\defined("AMP_DEBUG") && \AMP_DEBUG)) { + $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); + \array_shift($trace); // remove current closure + $this->resolutionTrace = $trace; + } + + return true; + })()); + + if ($value instanceof ReactPromise) { + $value = Promise\adapt($value); + } + + $this->resolved = true; + $this->result = $value; + + if ($this->onResolved === null) { + return; + } + + $onResolved = $this->onResolved; + $this->onResolved = null; + + if ($this->result instanceof Promise) { + $this->result->onResolve($onResolved); + return; + } + + try { + /** @var mixed $result */ + $result = $onResolved(null, $this->result); + $onResolved = null; // allow garbage collection of $onResolved, to catch any exceptions from destructors + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + Promise\rethrow($result); + } + } catch (\Throwable $exception) { + Loop::defer(static function () use ($exception) { + throw $exception; + }); + } + } + + /** + * @param \Throwable $reason Failure reason. + * + * @return void + */ + private function fail(\Throwable $reason) + { + $this->resolve(new Failure($reason)); + } + + /** + * @return bool True if the placeholder has been resolved. + */ + private function isResolved(): bool + { + return $this->resolved; + } +} diff --git a/vendor/amphp/amp/lib/Internal/PrivateIterator.php b/vendor/amphp/amp/lib/Internal/PrivateIterator.php new file mode 100644 index 00000000..7a14b243 --- /dev/null +++ b/vendor/amphp/amp/lib/Internal/PrivateIterator.php @@ -0,0 +1,45 @@ + + */ +final class PrivateIterator implements Iterator +{ + /** @var Iterator */ + private $iterator; + + /** + * @param Iterator $iterator + * + * @psalm-param Iterator $iterator + */ + public function __construct(Iterator $iterator) + { + $this->iterator = $iterator; + } + + /** + * @return Promise + */ + public function advance(): Promise + { + return $this->iterator->advance(); + } + + /** + * @psalm-return TValue + */ + public function getCurrent() + { + return $this->iterator->getCurrent(); + } +} diff --git a/vendor/amphp/amp/lib/Internal/PrivatePromise.php b/vendor/amphp/amp/lib/Internal/PrivatePromise.php new file mode 100644 index 00000000..3bd568a8 --- /dev/null +++ b/vendor/amphp/amp/lib/Internal/PrivatePromise.php @@ -0,0 +1,25 @@ +promise = $promise; + } + + public function onResolve(callable $onResolved) + { + $this->promise->onResolve($onResolved); + } +} diff --git a/vendor/amphp/amp/lib/Internal/Producer.php b/vendor/amphp/amp/lib/Internal/Producer.php new file mode 100644 index 00000000..c955755a --- /dev/null +++ b/vendor/amphp/amp/lib/Internal/Producer.php @@ -0,0 +1,212 @@ + + */ + public function advance(): Promise + { + if ($this->waiting !== null) { + throw new \Error("The prior promise returned must resolve before invoking this method again"); + } + + unset($this->values[$this->consumePosition]); + + $position = ++$this->consumePosition; + + if (\array_key_exists($position, $this->values)) { + \assert(isset($this->backPressure[$position])); + $deferred = $this->backPressure[$position]; + unset($this->backPressure[$position]); + $deferred->resolve(); + + return new Success(true); + } + + if ($this->complete) { + return $this->complete; + } + + $this->waiting = new Deferred; + + return $this->waiting->promise(); + } + + /** + * {@inheritdoc} + * + * @return TValue + */ + public function getCurrent() + { + if (empty($this->values) && $this->complete) { + throw new \Error("The iterator has completed"); + } + + if (!\array_key_exists($this->consumePosition, $this->values)) { + throw new \Error("Promise returned from advance() must resolve before calling this method"); + } + + return $this->values[$this->consumePosition]; + } + + /** + * Emits a value from the iterator. The returned promise is resolved once the emitted value has been consumed. + * + * @param mixed $value + * + * @return Promise + * @psalm-return Promise + * + * @throws \Error If the iterator has completed. + */ + private function emit($value): Promise + { + if ($this->complete) { + throw new \Error("Iterators cannot emit values after calling complete"); + } + + if ($value instanceof ReactPromise) { + $value = Promise\adapt($value); + } + + if ($value instanceof Promise) { + $deferred = new Deferred; + $value->onResolve(function ($e, $v) use ($deferred) { + if ($this->complete) { + $deferred->fail( + new \Error("The iterator was completed before the promise result could be emitted") + ); + return; + } + + if ($e) { + $this->fail($e); + $deferred->fail($e); + return; + } + + $deferred->resolve($this->emit($v)); + }); + + return $deferred->promise(); + } + + $position = ++$this->emitPosition; + + $this->values[$position] = $value; + + if ($this->waiting !== null) { + $waiting = $this->waiting; + $this->waiting = null; + $waiting->resolve(true); + return new Success; // Consumer was already waiting for a new value, so back-pressure is unnecessary. + } + + $this->backPressure[$position] = $pressure = new Deferred; + + return $pressure->promise(); + } + + /** + * Completes the iterator. + * + * @return void + * + * @throws \Error If the iterator has already been completed. + */ + private function complete() + { + if ($this->complete) { + $message = "Iterator has already been completed"; + + if (isset($this->resolutionTrace)) { + $trace = formatStacktrace($this->resolutionTrace); + $message .= ". Previous completion trace:\n\n{$trace}\n\n"; + } else { + // @codeCoverageIgnoreStart + $message .= ", define environment variable AMP_DEBUG or const AMP_DEBUG = true and enable assertions " + . "for a stacktrace of the previous resolution."; + // @codeCoverageIgnoreEnd + } + + throw new \Error($message); + } + + \assert((function () { + $env = \getenv("AMP_DEBUG") ?: "0"; + if (($env !== "0" && $env !== "false") || (\defined("AMP_DEBUG") && \AMP_DEBUG)) { + $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); + \array_shift($trace); // remove current closure + $this->resolutionTrace = $trace; + } + + return true; + })()); + + $this->complete = new Success(false); + + if ($this->waiting !== null) { + $waiting = $this->waiting; + $this->waiting = null; + $waiting->resolve($this->complete); + } + } + + /** + * @param \Throwable $exception + * + * @return void + */ + private function fail(\Throwable $exception) + { + $this->complete = new Failure($exception); + + if ($this->waiting !== null) { + $waiting = $this->waiting; + $this->waiting = null; + $waiting->resolve($this->complete); + } + } +} diff --git a/vendor/amphp/amp/lib/Internal/ResolutionQueue.php b/vendor/amphp/amp/lib/Internal/ResolutionQueue.php new file mode 100644 index 00000000..353a8b93 --- /dev/null +++ b/vendor/amphp/amp/lib/Internal/ResolutionQueue.php @@ -0,0 +1,90 @@ +, mixed, + * mixed>|null) | callable(\Throwable|null, mixed): void> */ + private $queue = []; + + /** + * @param callable|null $callback Initial callback to add to queue. + * + * @psalm-param null|callable(\Throwable|null, mixed): (Promise|\React\Promise\PromiseInterface|\Generator, mixed, + * mixed>|null) | callable(\Throwable|null, mixed): void $callback + */ + public function __construct(callable $callback = null) + { + if ($callback !== null) { + $this->push($callback); + } + } + + /** + * Unrolls instances of self to avoid blowing up the call stack on resolution. + * + * @param callable $callback + * + * @psalm-param callable(\Throwable|null, mixed): (Promise|\React\Promise\PromiseInterface|\Generator, mixed, + * mixed>|null) | callable(\Throwable|null, mixed): void $callback + * + * @return void + */ + public function push(callable $callback) + { + if ($callback instanceof self) { + $this->queue = \array_merge($this->queue, $callback->queue); + return; + } + + $this->queue[] = $callback; + } + + /** + * Calls each callback in the queue, passing the provided values to the function. + * + * @param \Throwable|null $exception + * @param mixed $value + * + * @return void + */ + public function __invoke($exception, $value) + { + foreach ($this->queue as $callback) { + try { + $result = $callback($exception, $value); + + if ($result === null) { + continue; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + Promise\rethrow($result); + } + } catch (\Throwable $exception) { + Loop::defer(static function () use ($exception) { + throw $exception; + }); + } + } + } +} diff --git a/vendor/amphp/amp/lib/Internal/functions.php b/vendor/amphp/amp/lib/Internal/functions.php new file mode 100644 index 00000000..eee9af20 --- /dev/null +++ b/vendor/amphp/amp/lib/Internal/functions.php @@ -0,0 +1,117 @@ + $trace Output of + * `debug_backtrace()`. + * + * @return string Formatted stacktrace. + * + * @codeCoverageIgnore + * @internal + */ +function formatStacktrace(array $trace): string +{ + return \implode("\n", \array_map(static function ($e, $i) { + $line = "#{$i} "; + + if (isset($e["file"])) { + $line .= "{$e['file']}:{$e['line']} "; + } + + if (isset($e["type"])) { + $line .= $e["class"] . $e["type"]; + } + + return $line . $e["function"] . "()"; + }, $trace, \array_keys($trace))); +} + +/** + * Creates a `TypeError` with a standardized error message. + * + * @param string[] $expected Expected types. + * @param mixed $given Given value. + * + * @return \TypeError + * + * @internal + */ +function createTypeError(array $expected, $given): \TypeError +{ + $givenType = \is_object($given) ? \sprintf("instance of %s", \get_class($given)) : \gettype($given); + + if (\count($expected) === 1) { + $expectedType = "Expected the following type: " . \array_pop($expected); + } else { + $expectedType = "Expected one of the following types: " . \implode(", ", $expected); + } + + return new \TypeError("{$expectedType}; {$givenType} given"); +} + +/** + * Returns the current time relative to an arbitrary point in time. + * + * @return int Time in milliseconds. + */ +function getCurrentTime(): int +{ + /** @var int|null $startTime */ + static $startTime; + /** @var int|null $nextWarning */ + static $nextWarning; + + if (\PHP_INT_SIZE === 4) { + // @codeCoverageIgnoreStart + if ($startTime === null) { + $startTime = \PHP_VERSION_ID >= 70300 ? \hrtime(false)[0] : \time(); + $nextWarning = \PHP_INT_MAX - 86400 * 7; + } + + if (\PHP_VERSION_ID >= 70300) { + list($seconds, $nanoseconds) = \hrtime(false); + $seconds -= $startTime; + + if ($seconds >= $nextWarning) { + $timeToOverflow = (\PHP_INT_MAX - $seconds * 1000) / 1000; + \trigger_error( + "getCurrentTime() will overflow in $timeToOverflow seconds, please restart the process before that. " . + "You're using a 32 bit version of PHP, so time will overflow about every 24 days. Regular restarts are required.", + \E_USER_WARNING + ); + + /** @psalm-suppress PossiblyNullOperand */ + $nextWarning += 600; // every 10 minutes + } + + return (int) ($seconds * 1000 + $nanoseconds / 1000000); + } + + $seconds = \microtime(true) - $startTime; + if ($seconds >= $nextWarning) { + $timeToOverflow = (\PHP_INT_MAX - $seconds * 1000) / 1000; + \trigger_error( + "getCurrentTime() will overflow in $timeToOverflow seconds, please restart the process before that. " . + "You're using a 32 bit version of PHP, so time will overflow about every 24 days. Regular restarts are required.", + \E_USER_WARNING + ); + + /** @psalm-suppress PossiblyNullOperand */ + $nextWarning += 600; // every 10 minutes + } + + return (int) ($seconds * 1000); + // @codeCoverageIgnoreEnd + } + + if (\PHP_VERSION_ID >= 70300) { + list($seconds, $nanoseconds) = \hrtime(false); + return (int) ($seconds * 1000 + $nanoseconds / 1000000); + } + + return (int) (\microtime(true) * 1000); +} diff --git a/vendor/amphp/amp/lib/InvalidYieldError.php b/vendor/amphp/amp/lib/InvalidYieldError.php new file mode 100644 index 00000000..8785708e --- /dev/null +++ b/vendor/amphp/amp/lib/InvalidYieldError.php @@ -0,0 +1,39 @@ +current(); + $prefix .= \sprintf( + "; %s yielded at key %s", + \is_object($yielded) ? \get_class($yielded) : \gettype($yielded), + \var_export($generator->key(), true) + ); + + if (!$generator->valid()) { + parent::__construct($prefix, 0, $previous); + return; + } + + $reflGen = new \ReflectionGenerator($generator); + $exeGen = $reflGen->getExecutingGenerator(); + if ($isSubgenerator = ($exeGen !== $generator)) { + $reflGen = new \ReflectionGenerator($exeGen); + } + + parent::__construct(\sprintf( + "%s on line %s in %s", + $prefix, + $reflGen->getExecutingLine(), + $reflGen->getExecutingFile() + ), 0, $previous); + } +} diff --git a/vendor/amphp/amp/lib/Iterator.php b/vendor/amphp/amp/lib/Iterator.php new file mode 100644 index 00000000..fee9b76b --- /dev/null +++ b/vendor/amphp/amp/lib/Iterator.php @@ -0,0 +1,34 @@ + + * + * @throws \Error If the prior promise returned from this method has not resolved. + * @throws \Throwable The exception used to fail the iterator. + */ + public function advance(): Promise; + + /** + * Gets the last emitted value or throws an exception if the iterator has completed. + * + * @return mixed Value emitted from the iterator. + * @psalm-return TValue + * + * @throws \Error If the iterator has resolved or advance() was not called before calling this method. + * @throws \Throwable The exception used to fail the iterator. + */ + public function getCurrent(); +} diff --git a/vendor/amphp/amp/lib/LazyPromise.php b/vendor/amphp/amp/lib/LazyPromise.php new file mode 100644 index 00000000..96be33f5 --- /dev/null +++ b/vendor/amphp/amp/lib/LazyPromise.php @@ -0,0 +1,44 @@ +promisor = $promisor; + } + + /** + * {@inheritdoc} + */ + public function onResolve(callable $onResolved) + { + if ($this->promise === null) { + \assert($this->promisor !== null); + + $provider = $this->promisor; + $this->promisor = null; + $this->promise = call($provider); + } + + \assert($this->promise !== null); + + $this->promise->onResolve($onResolved); + } +} diff --git a/vendor/amphp/amp/lib/Loop.php b/vendor/amphp/amp/lib/Loop.php new file mode 100644 index 00000000..d89d2101 --- /dev/null +++ b/vendor/amphp/amp/lib/Loop.php @@ -0,0 +1,456 @@ +defer($callback); + } + + self::$driver->run(); + } + + /** + * Stop the event loop. + * + * When an event loop is stopped, it continues with its current tick and exits the loop afterwards. Multiple calls + * to stop MUST be ignored and MUST NOT raise an exception. + * + * @return void + */ + public static function stop() + { + self::$driver->stop(); + } + + /** + * Defer the execution of a callback. + * + * The deferred callable MUST be executed before any other type of watcher in a tick. Order of enabling MUST be + * preserved when executing the callbacks. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param callable(string $watcherId, mixed $data) $callback The callback to defer. The `$watcherId` will be + * invalidated before the callback call. + * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + */ + public static function defer(callable $callback, $data = null): string + { + return self::$driver->defer($callback, $data); + } + + /** + * Delay the execution of a callback. + * + * The delay is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be determined by which + * timers expire first, but timers with the same expiration time MAY be executed in any order. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param int $delay The amount of time, in milliseconds, to delay the execution for. + * @param callable(string $watcherId, mixed $data) $callback The callback to delay. The `$watcherId` will be + * invalidated before the callback call. + * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + */ + public static function delay(int $delay, callable $callback, $data = null): string + { + return self::$driver->delay($delay, $callback, $data); + } + + /** + * Repeatedly execute a callback. + * + * The interval between executions is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be + * determined by which timers expire first, but timers with the same expiration time MAY be executed in any order. + * The first execution is scheduled after the first interval period. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param int $interval The time interval, in milliseconds, to wait between executions. + * @param callable(string $watcherId, mixed $data) $callback The callback to repeat. + * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + */ + public static function repeat(int $interval, callable $callback, $data = null): string + { + return self::$driver->repeat($interval, $callback, $data); + } + + /** + * Execute a callback when a stream resource becomes readable or is closed for reading. + * + * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the + * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid + * resources, but are not required to, due to the high performance impact. Watchers on closed resources are + * therefore undefined behavior. + * + * Multiple watchers on the same stream MAY be executed in any order. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param resource $stream The stream to monitor. + * @param callable(string $watcherId, resource $stream, mixed $data) $callback The callback to execute. + * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + */ + public static function onReadable($stream, callable $callback, $data = null): string + { + return self::$driver->onReadable($stream, $callback, $data); + } + + /** + * Execute a callback when a stream resource becomes writable or is closed for writing. + * + * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the + * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid + * resources, but are not required to, due to the high performance impact. Watchers on closed resources are + * therefore undefined behavior. + * + * Multiple watchers on the same stream MAY be executed in any order. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param resource $stream The stream to monitor. + * @param callable(string $watcherId, resource $stream, mixed $data) $callback The callback to execute. + * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + */ + public static function onWritable($stream, callable $callback, $data = null): string + { + return self::$driver->onWritable($stream, $callback, $data); + } + + /** + * Execute a callback when a signal is received. + * + * Warning: Installing the same signal on different instances of this interface is deemed undefined behavior. + * Implementations MAY try to detect this, if possible, but are not required to. This is due to technical + * limitations of the signals being registered globally per process. + * + * Multiple watchers on the same signal MAY be executed in any order. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param int $signo The signal number to monitor. + * @param callable(string $watcherId, int $signo, mixed $data) $callback The callback to execute. + * @param mixed $data Arbitrary data given to the callback function as the $data parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + * + * @throws UnsupportedFeatureException If signal handling is not supported. + */ + public static function onSignal(int $signo, callable $callback, $data = null): string + { + return self::$driver->onSignal($signo, $callback, $data); + } + + /** + * Enable a watcher to be active starting in the next tick. + * + * Watchers MUST immediately be marked as enabled, but only be activated (i.e. callbacks can be called) right before + * the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param string $watcherId The watcher identifier. + * + * @return void + * + * @throws InvalidWatcherError If the watcher identifier is invalid. + */ + public static function enable(string $watcherId) + { + self::$driver->enable($watcherId); + } + + /** + * Disable a watcher immediately. + * + * A watcher MUST be disabled immediately, e.g. if a defer watcher disables a later defer watcher, the second defer + * watcher isn't executed in this tick. + * + * Disabling a watcher MUST NOT invalidate the watcher. Calling this function MUST NOT fail, even if passed an + * invalid watcher. + * + * @param string $watcherId The watcher identifier. + * + * @return void + */ + public static function disable(string $watcherId) + { + if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { + // Prior to PHP 7.2, self::$driver may be unset during destruct. + // See https://github.com/amphp/amp/issues/212. + return; + } + + self::$driver->disable($watcherId); + } + + /** + * Cancel a watcher. + * + * This will detatch the event loop from all resources that are associated to the watcher. After this operation the + * watcher is permanently invalid. Calling this function MUST NOT fail, even if passed an invalid watcher. + * + * @param string $watcherId The watcher identifier. + * + * @return void + */ + public static function cancel(string $watcherId) + { + if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { + // Prior to PHP 7.2, self::$driver may be unset during destruct. + // See https://github.com/amphp/amp/issues/212. + return; + } + + self::$driver->cancel($watcherId); + } + + /** + * Reference a watcher. + * + * This will keep the event loop alive whilst the watcher is still being monitored. Watchers have this state by + * default. + * + * @param string $watcherId The watcher identifier. + * + * @return void + * + * @throws InvalidWatcherError If the watcher identifier is invalid. + */ + public static function reference(string $watcherId) + { + self::$driver->reference($watcherId); + } + + /** + * Unreference a watcher. + * + * The event loop should exit the run method when only unreferenced watchers are still being monitored. Watchers + * are all referenced by default. + * + * @param string $watcherId The watcher identifier. + * + * @return void + */ + public static function unreference(string $watcherId) + { + if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { + // Prior to PHP 7.2, self::$driver may be unset during destruct. + // See https://github.com/amphp/amp/issues/212. + return; + } + + self::$driver->unreference($watcherId); + } + + /** + * Returns the current loop time in millisecond increments. Note this value does not necessarily correlate to + * wall-clock time, rather the value returned is meant to be used in relative comparisons to prior values returned + * by this method (intervals, expiration calculations, etc.) and is only updated once per loop tick. + * + * @return int + */ + public static function now(): int + { + return self::$driver->now(); + } + + /** + * Stores information in the loop bound registry. + * + * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages + * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. + * + * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated + * interface for that purpose instead of sharing the storage key. + * + * @param string $key The namespaced storage key. + * @param mixed $value The value to be stored. + * + * @return void + */ + public static function setState(string $key, $value) + { + self::$driver->setState($key, $value); + } + + /** + * Gets information stored bound to the loop. + * + * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages + * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. + * + * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated + * interface for that purpose instead of sharing the storage key. + * + * @param string $key The namespaced storage key. + * + * @return mixed The previously stored value or `null` if it doesn't exist. + */ + public static function getState(string $key) + { + return self::$driver->getState($key); + } + + /** + * Set a callback to be executed when an error occurs. + * + * The callback receives the error as the first and only parameter. The return value of the callback gets ignored. + * If it can't handle the error, it MUST throw the error. Errors thrown by the callback or during its invocation + * MUST be thrown into the `run` loop and stop the driver. + * + * Subsequent calls to this method will overwrite the previous handler. + * + * @param callable(\Throwable $error)|null $callback The callback to execute. `null` will clear the + * current handler. + * + * @return callable(\Throwable $error)|null The previous handler, `null` if there was none. + */ + public static function setErrorHandler(callable $callback = null) + { + return self::$driver->setErrorHandler($callback); + } + + /** + * Retrieve an associative array of information about the event loop driver. + * + * The returned array MUST contain the following data describing the driver's currently registered watchers: + * + * [ + * "defer" => ["enabled" => int, "disabled" => int], + * "delay" => ["enabled" => int, "disabled" => int], + * "repeat" => ["enabled" => int, "disabled" => int], + * "on_readable" => ["enabled" => int, "disabled" => int], + * "on_writable" => ["enabled" => int, "disabled" => int], + * "on_signal" => ["enabled" => int, "disabled" => int], + * "enabled_watchers" => ["referenced" => int, "unreferenced" => int], + * "running" => bool + * ]; + * + * Implementations MAY optionally add more information in the array but at minimum the above `key => value` format + * MUST always be provided. + * + * @return array Statistics about the loop in the described format. + */ + public static function getInfo(): array + { + return self::$driver->getInfo(); + } + + /** + * Retrieve the event loop driver that is in scope. + * + * @return Driver + */ + public static function get(): Driver + { + return self::$driver; + } +} + +// Default factory, don't move this to a file loaded by the composer "files" autoload mechanism, otherwise custom +// implementations might have issues setting a default loop, because it's overridden by us then. + +// @codeCoverageIgnoreStart +Loop::set((new DriverFactory)->create()); +// @codeCoverageIgnoreEnd diff --git a/vendor/amphp/amp/lib/Loop/Driver.php b/vendor/amphp/amp/lib/Loop/Driver.php new file mode 100644 index 00000000..448bab62 --- /dev/null +++ b/vendor/amphp/amp/lib/Loop/Driver.php @@ -0,0 +1,742 @@ +running = true; + + try { + while ($this->running) { + if ($this->isEmpty()) { + return; + } + $this->tick(); + } + } finally { + $this->stop(); + } + } + + /** + * @return bool True if no enabled and referenced watchers remain in the loop. + */ + private function isEmpty(): bool + { + foreach ($this->watchers as $watcher) { + if ($watcher->enabled && $watcher->referenced) { + return false; + } + } + + return true; + } + + /** + * Executes a single tick of the event loop. + * + * @return void + */ + private function tick() + { + if (empty($this->deferQueue)) { + $this->deferQueue = $this->nextTickQueue; + } else { + $this->deferQueue = \array_merge($this->deferQueue, $this->nextTickQueue); + } + $this->nextTickQueue = []; + + $this->activate($this->enableQueue); + $this->enableQueue = []; + + foreach ($this->deferQueue as $watcher) { + if (!isset($this->deferQueue[$watcher->id])) { + continue; // Watcher disabled by another defer watcher. + } + + unset($this->watchers[$watcher->id], $this->deferQueue[$watcher->id]); + + try { + /** @var mixed $result */ + $result = ($watcher->callback)($watcher->id, $watcher->data); + + if ($result === null) { + continue; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + } + + /** @psalm-suppress RedundantCondition */ + $this->dispatch(empty($this->nextTickQueue) && empty($this->enableQueue) && $this->running && !$this->isEmpty()); + } + + /** + * Activates (enables) all the given watchers. + * + * @param Watcher[] $watchers + * + * @return void + */ + abstract protected function activate(array $watchers); + + /** + * Dispatches any pending read/write, timer, and signal events. + * + * @param bool $blocking + * + * @return void + */ + abstract protected function dispatch(bool $blocking); + + /** + * Stop the event loop. + * + * When an event loop is stopped, it continues with its current tick and exits the loop afterwards. Multiple calls + * to stop MUST be ignored and MUST NOT raise an exception. + * + * @return void + */ + public function stop() + { + $this->running = false; + } + + /** + * Defer the execution of a callback. + * + * The deferred callable MUST be executed before any other type of watcher in a tick. Order of enabling MUST be + * preserved when executing the callbacks. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param callable (string $watcherId, mixed $data) $callback The callback to defer. The `$watcherId` will be + * invalidated before the callback call. + * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + */ + public function defer(callable $callback, $data = null): string + { + /** @psalm-var Watcher $watcher */ + $watcher = new Watcher; + $watcher->type = Watcher::DEFER; + $watcher->id = $this->nextId++; + $watcher->callback = $callback; + $watcher->data = $data; + + $this->watchers[$watcher->id] = $watcher; + $this->nextTickQueue[$watcher->id] = $watcher; + + return $watcher->id; + } + + /** + * Delay the execution of a callback. + * + * The delay is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be determined by which + * timers expire first, but timers with the same expiration time MAY be executed in any order. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param int $delay The amount of time, in milliseconds, to delay the execution for. + * @param callable (string $watcherId, mixed $data) $callback The callback to delay. The `$watcherId` will be + * invalidated before the callback call. + * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + */ + public function delay(int $delay, callable $callback, $data = null): string + { + if ($delay < 0) { + throw new \Error("Delay must be greater than or equal to zero"); + } + + /** @psalm-var Watcher $watcher */ + $watcher = new Watcher; + $watcher->type = Watcher::DELAY; + $watcher->id = $this->nextId++; + $watcher->callback = $callback; + $watcher->value = $delay; + $watcher->expiration = $this->now() + $delay; + $watcher->data = $data; + + $this->watchers[$watcher->id] = $watcher; + $this->enableQueue[$watcher->id] = $watcher; + + return $watcher->id; + } + + /** + * Repeatedly execute a callback. + * + * The interval between executions is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be + * determined by which timers expire first, but timers with the same expiration time MAY be executed in any order. + * The first execution is scheduled after the first interval period. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param int $interval The time interval, in milliseconds, to wait between executions. + * @param callable (string $watcherId, mixed $data) $callback The callback to repeat. + * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + */ + public function repeat(int $interval, callable $callback, $data = null): string + { + if ($interval < 0) { + throw new \Error("Interval must be greater than or equal to zero"); + } + + /** @psalm-var Watcher $watcher */ + $watcher = new Watcher; + $watcher->type = Watcher::REPEAT; + $watcher->id = $this->nextId++; + $watcher->callback = $callback; + $watcher->value = $interval; + $watcher->expiration = $this->now() + $interval; + $watcher->data = $data; + + $this->watchers[$watcher->id] = $watcher; + $this->enableQueue[$watcher->id] = $watcher; + + return $watcher->id; + } + + /** + * Execute a callback when a stream resource becomes readable or is closed for reading. + * + * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the + * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid + * resources, but are not required to, due to the high performance impact. Watchers on closed resources are + * therefore undefined behavior. + * + * Multiple watchers on the same stream MAY be executed in any order. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param resource $stream The stream to monitor. + * @param callable (string $watcherId, resource $stream, mixed $data) $callback The callback to execute. + * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + */ + public function onReadable($stream, callable $callback, $data = null): string + { + /** @psalm-var Watcher $watcher */ + $watcher = new Watcher; + $watcher->type = Watcher::READABLE; + $watcher->id = $this->nextId++; + $watcher->callback = $callback; + $watcher->value = $stream; + $watcher->data = $data; + + $this->watchers[$watcher->id] = $watcher; + $this->enableQueue[$watcher->id] = $watcher; + + return $watcher->id; + } + + /** + * Execute a callback when a stream resource becomes writable or is closed for writing. + * + * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the + * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid + * resources, but are not required to, due to the high performance impact. Watchers on closed resources are + * therefore undefined behavior. + * + * Multiple watchers on the same stream MAY be executed in any order. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param resource $stream The stream to monitor. + * @param callable (string $watcherId, resource $stream, mixed $data) $callback The callback to execute. + * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + */ + public function onWritable($stream, callable $callback, $data = null): string + { + /** @psalm-var Watcher $watcher */ + $watcher = new Watcher; + $watcher->type = Watcher::WRITABLE; + $watcher->id = $this->nextId++; + $watcher->callback = $callback; + $watcher->value = $stream; + $watcher->data = $data; + + $this->watchers[$watcher->id] = $watcher; + $this->enableQueue[$watcher->id] = $watcher; + + return $watcher->id; + } + + /** + * Execute a callback when a signal is received. + * + * Warning: Installing the same signal on different instances of this interface is deemed undefined behavior. + * Implementations MAY try to detect this, if possible, but are not required to. This is due to technical + * limitations of the signals being registered globally per process. + * + * Multiple watchers on the same signal MAY be executed in any order. + * + * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) + * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param int $signo The signal number to monitor. + * @param callable (string $watcherId, int $signo, mixed $data) $callback The callback to execute. + * @param mixed $data Arbitrary data given to the callback function as the $data parameter. + * + * @return string An unique identifier that can be used to cancel, enable or disable the watcher. + * + * @throws UnsupportedFeatureException If signal handling is not supported. + */ + public function onSignal(int $signo, callable $callback, $data = null): string + { + /** @psalm-var Watcher $watcher */ + $watcher = new Watcher; + $watcher->type = Watcher::SIGNAL; + $watcher->id = $this->nextId++; + $watcher->callback = $callback; + $watcher->value = $signo; + $watcher->data = $data; + + $this->watchers[$watcher->id] = $watcher; + $this->enableQueue[$watcher->id] = $watcher; + + return $watcher->id; + } + + /** + * Enable a watcher to be active starting in the next tick. + * + * Watchers MUST immediately be marked as enabled, but only be activated (i.e. callbacks can be called) right before + * the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. + * + * @param string $watcherId The watcher identifier. + * + * @return void + * + * @throws InvalidWatcherError If the watcher identifier is invalid. + */ + public function enable(string $watcherId) + { + if (!isset($this->watchers[$watcherId])) { + throw new InvalidWatcherError($watcherId, "Cannot enable an invalid watcher identifier: '{$watcherId}'"); + } + + $watcher = $this->watchers[$watcherId]; + + if ($watcher->enabled) { + return; // Watcher already enabled. + } + + $watcher->enabled = true; + + switch ($watcher->type) { + case Watcher::DEFER: + $this->nextTickQueue[$watcher->id] = $watcher; + break; + + case Watcher::REPEAT: + case Watcher::DELAY: + \assert(\is_int($watcher->value)); + + $watcher->expiration = $this->now() + $watcher->value; + $this->enableQueue[$watcher->id] = $watcher; + break; + + default: + $this->enableQueue[$watcher->id] = $watcher; + break; + } + } + + /** + * Cancel a watcher. + * + * This will detach the event loop from all resources that are associated to the watcher. After this operation the + * watcher is permanently invalid. Calling this function MUST NOT fail, even if passed an invalid watcher. + * + * @param string $watcherId The watcher identifier. + * + * @return void + */ + public function cancel(string $watcherId) + { + $this->disable($watcherId); + unset($this->watchers[$watcherId]); + } + + /** + * Disable a watcher immediately. + * + * A watcher MUST be disabled immediately, e.g. if a defer watcher disables a later defer watcher, the second defer + * watcher isn't executed in this tick. + * + * Disabling a watcher MUST NOT invalidate the watcher. Calling this function MUST NOT fail, even if passed an + * invalid watcher. + * + * @param string $watcherId The watcher identifier. + * + * @return void + */ + public function disable(string $watcherId) + { + if (!isset($this->watchers[$watcherId])) { + return; + } + + $watcher = $this->watchers[$watcherId]; + + if (!$watcher->enabled) { + return; // Watcher already disabled. + } + + $watcher->enabled = false; + $id = $watcher->id; + + switch ($watcher->type) { + case Watcher::DEFER: + if (isset($this->nextTickQueue[$id])) { + // Watcher was only queued to be enabled. + unset($this->nextTickQueue[$id]); + } else { + unset($this->deferQueue[$id]); + } + break; + + default: + if (isset($this->enableQueue[$id])) { + // Watcher was only queued to be enabled. + unset($this->enableQueue[$id]); + } else { + $this->deactivate($watcher); + } + break; + } + } + + /** + * Deactivates (disables) the given watcher. + * + * @param Watcher $watcher + * + * @return void + */ + abstract protected function deactivate(Watcher $watcher); + + /** + * Reference a watcher. + * + * This will keep the event loop alive whilst the watcher is still being monitored. Watchers have this state by + * default. + * + * @param string $watcherId The watcher identifier. + * + * @return void + * + * @throws InvalidWatcherError If the watcher identifier is invalid. + */ + public function reference(string $watcherId) + { + if (!isset($this->watchers[$watcherId])) { + throw new InvalidWatcherError($watcherId, "Cannot reference an invalid watcher identifier: '{$watcherId}'"); + } + + $this->watchers[$watcherId]->referenced = true; + } + + /** + * Unreference a watcher. + * + * The event loop should exit the run method when only unreferenced watchers are still being monitored. Watchers + * are all referenced by default. + * + * @param string $watcherId The watcher identifier. + * + * @return void + */ + public function unreference(string $watcherId) + { + if (!isset($this->watchers[$watcherId])) { + return; + } + + $this->watchers[$watcherId]->referenced = false; + } + + /** + * Stores information in the loop bound registry. + * + * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages + * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. + * + * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated + * interface for that purpose instead of sharing the storage key. + * + * @param string $key The namespaced storage key. + * @param mixed $value The value to be stored. + * + * @return void + */ + final public function setState(string $key, $value) + { + if ($value === null) { + unset($this->registry[$key]); + } else { + $this->registry[$key] = $value; + } + } + + /** + * Gets information stored bound to the loop. + * + * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages + * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. + * + * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated + * interface for that purpose instead of sharing the storage key. + * + * @param string $key The namespaced storage key. + * + * @return mixed The previously stored value or `null` if it doesn't exist. + */ + final public function getState(string $key) + { + return isset($this->registry[$key]) ? $this->registry[$key] : null; + } + + /** + * Set a callback to be executed when an error occurs. + * + * The callback receives the error as the first and only parameter. The return value of the callback gets ignored. + * If it can't handle the error, it MUST throw the error. Errors thrown by the callback or during its invocation + * MUST be thrown into the `run` loop and stop the driver. + * + * Subsequent calls to this method will overwrite the previous handler. + * + * @param callable(\Throwable $error):void|null $callback The callback to execute. `null` will clear the + * current handler. + * + * @return callable(\Throwable $error):void|null The previous handler, `null` if there was none. + */ + public function setErrorHandler(callable $callback = null) + { + $previous = $this->errorHandler; + $this->errorHandler = $callback; + return $previous; + } + + /** + * Invokes the error handler with the given exception. + * + * @param \Throwable $exception The exception thrown from a watcher callback. + * + * @return void + * @throws \Throwable If no error handler has been set. + */ + protected function error(\Throwable $exception) + { + if ($this->errorHandler === null) { + throw $exception; + } + + ($this->errorHandler)($exception); + } + + /** + * Returns the current loop time in millisecond increments. Note this value does not necessarily correlate to + * wall-clock time, rather the value returned is meant to be used in relative comparisons to prior values returned + * by this method (intervals, expiration calculations, etc.) and is only updated once per loop tick. + * + * Extending classes should override this function to return a value cached once per loop tick. + * + * @return int + */ + public function now(): int + { + return (int) (\microtime(true) * self::MILLISEC_PER_SEC); + } + + /** + * Get the underlying loop handle. + * + * Example: the `uv_loop` resource for `libuv` or the `EvLoop` object for `libev` or `null` for a native driver. + * + * Note: This function is *not* exposed in the `Loop` class. Users shall access it directly on the respective loop + * instance. + * + * @return null|object|resource The loop handle the event loop operates on. `null` if there is none. + */ + abstract public function getHandle(); + + /** + * Returns the same array of data as getInfo(). + * + * @return array + */ + public function __debugInfo() + { + // @codeCoverageIgnoreStart + return $this->getInfo(); + // @codeCoverageIgnoreEnd + } + + /** + * Retrieve an associative array of information about the event loop driver. + * + * The returned array MUST contain the following data describing the driver's currently registered watchers: + * + * [ + * "defer" => ["enabled" => int, "disabled" => int], + * "delay" => ["enabled" => int, "disabled" => int], + * "repeat" => ["enabled" => int, "disabled" => int], + * "on_readable" => ["enabled" => int, "disabled" => int], + * "on_writable" => ["enabled" => int, "disabled" => int], + * "on_signal" => ["enabled" => int, "disabled" => int], + * "enabled_watchers" => ["referenced" => int, "unreferenced" => int], + * "running" => bool + * ]; + * + * Implementations MAY optionally add more information in the array but at minimum the above `key => value` format + * MUST always be provided. + * + * @return array Statistics about the loop in the described format. + */ + public function getInfo(): array + { + $watchers = [ + "referenced" => 0, + "unreferenced" => 0, + ]; + + $defer = $delay = $repeat = $onReadable = $onWritable = $onSignal = [ + "enabled" => 0, + "disabled" => 0, + ]; + + foreach ($this->watchers as $watcher) { + switch ($watcher->type) { + case Watcher::READABLE: + $array = &$onReadable; + break; + case Watcher::WRITABLE: + $array = &$onWritable; + break; + case Watcher::SIGNAL: + $array = &$onSignal; + break; + case Watcher::DEFER: + $array = &$defer; + break; + case Watcher::DELAY: + $array = &$delay; + break; + case Watcher::REPEAT: + $array = &$repeat; + break; + + default: + // @codeCoverageIgnoreStart + throw new \Error("Unknown watcher type"); + // @codeCoverageIgnoreEnd + } + + if ($watcher->enabled) { + ++$array["enabled"]; + + if ($watcher->referenced) { + ++$watchers["referenced"]; + } else { + ++$watchers["unreferenced"]; + } + } else { + ++$array["disabled"]; + } + } + + return [ + "enabled_watchers" => $watchers, + "defer" => $defer, + "delay" => $delay, + "repeat" => $repeat, + "on_readable" => $onReadable, + "on_writable" => $onWritable, + "on_signal" => $onSignal, + "running" => (bool) $this->running, + ]; + } +} diff --git a/vendor/amphp/amp/lib/Loop/DriverFactory.php b/vendor/amphp/amp/lib/Loop/DriverFactory.php new file mode 100644 index 00000000..0ce16524 --- /dev/null +++ b/vendor/amphp/amp/lib/Loop/DriverFactory.php @@ -0,0 +1,73 @@ +createDriverFromEnv()) { + return $driver; + } + + if (UvDriver::isSupported()) { + return new UvDriver; + } + + if (EvDriver::isSupported()) { + return new EvDriver; + } + + if (EventDriver::isSupported()) { + return new EventDriver; + } + + return new NativeDriver; + })(); + + if (\getenv("AMP_DEBUG_TRACE_WATCHERS")) { + return new TracingDriver($driver); + } + + return $driver; + } + + /** + * @return Driver|null + */ + private function createDriverFromEnv() + { + $driver = \getenv("AMP_LOOP_DRIVER"); + + if (!$driver) { + return null; + } + + if (!\class_exists($driver)) { + throw new \Error(\sprintf( + "Driver '%s' does not exist.", + $driver + )); + } + + if (!\is_subclass_of($driver, Driver::class)) { + throw new \Error(\sprintf( + "Driver '%s' is not a subclass of '%s'.", + $driver, + Driver::class + )); + } + + return new $driver; + } +} +// @codeCoverageIgnoreEnd diff --git a/vendor/amphp/amp/lib/Loop/EvDriver.php b/vendor/amphp/amp/lib/Loop/EvDriver.php new file mode 100644 index 00000000..401bb3ba --- /dev/null +++ b/vendor/amphp/amp/lib/Loop/EvDriver.php @@ -0,0 +1,317 @@ +handle = new \EvLoop; + $this->nowOffset = getCurrentTime(); + $this->now = \random_int(0, $this->nowOffset); + $this->nowOffset -= $this->now; + + if (self::$activeSignals === null) { + self::$activeSignals = &$this->signals; + } + + /** + * @param \EvIO $event + * + * @return void + */ + $this->ioCallback = function (\EvIO $event) { + /** @var Watcher $watcher */ + $watcher = $event->data; + + try { + $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + }; + + /** + * @param \EvTimer $event + * + * @return void + */ + $this->timerCallback = function (\EvTimer $event) { + /** @var Watcher $watcher */ + $watcher = $event->data; + + if ($watcher->type & Watcher::DELAY) { + $this->cancel($watcher->id); + } elseif ($watcher->value === 0) { + // Disable and re-enable so it's not executed repeatedly in the same tick + // See https://github.com/amphp/amp/issues/131 + $this->disable($watcher->id); + $this->enable($watcher->id); + } + + try { + $result = ($watcher->callback)($watcher->id, $watcher->data); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + }; + + /** + * @param \EvSignal $event + * + * @return void + */ + $this->signalCallback = function (\EvSignal $event) { + /** @var Watcher $watcher */ + $watcher = $event->data; + + try { + $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + }; + } + + /** + * {@inheritdoc} + */ + public function cancel(string $watcherId) + { + parent::cancel($watcherId); + unset($this->events[$watcherId]); + } + + public function __destruct() + { + foreach ($this->events as $event) { + /** @psalm-suppress all */ + if ($event !== null) { // Events may have been nulled in extension depending on destruct order. + $event->stop(); + } + } + + // We need to clear all references to events manually, see + // https://bitbucket.org/osmanov/pecl-ev/issues/31/segfault-in-ev_timer_stop + $this->events = []; + } + + /** + * {@inheritdoc} + */ + public function run() + { + $active = self::$activeSignals; + + \assert($active !== null); + + foreach ($active as $event) { + $event->stop(); + } + + self::$activeSignals = &$this->signals; + + foreach ($this->signals as $event) { + $event->start(); + } + + try { + parent::run(); + } finally { + foreach ($this->signals as $event) { + $event->stop(); + } + + self::$activeSignals = &$active; + + foreach ($active as $event) { + $event->start(); + } + } + } + + /** + * {@inheritdoc} + */ + public function stop() + { + $this->handle->stop(); + parent::stop(); + } + + /** + * {@inheritdoc} + */ + public function now(): int + { + $this->now = getCurrentTime() - $this->nowOffset; + + return $this->now; + } + + /** + * {@inheritdoc} + */ + public function getHandle(): \EvLoop + { + return $this->handle; + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function dispatch(bool $blocking) + { + $this->handle->run($blocking ? \Ev::RUN_ONCE : \Ev::RUN_ONCE | \Ev::RUN_NOWAIT); + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function activate(array $watchers) + { + $this->handle->nowUpdate(); + $now = $this->now(); + + foreach ($watchers as $watcher) { + if (!isset($this->events[$id = $watcher->id])) { + switch ($watcher->type) { + case Watcher::READABLE: + \assert(\is_resource($watcher->value)); + + $this->events[$id] = $this->handle->io($watcher->value, \Ev::READ, $this->ioCallback, $watcher); + break; + + case Watcher::WRITABLE: + \assert(\is_resource($watcher->value)); + + $this->events[$id] = $this->handle->io( + $watcher->value, + \Ev::WRITE, + $this->ioCallback, + $watcher + ); + break; + + case Watcher::DELAY: + case Watcher::REPEAT: + \assert(\is_int($watcher->value)); + + $interval = $watcher->value / self::MILLISEC_PER_SEC; + $this->events[$id] = $this->handle->timer( + \max(0, ($watcher->expiration - $now) / self::MILLISEC_PER_SEC), + ($watcher->type & Watcher::REPEAT) ? $interval : 0, + $this->timerCallback, + $watcher + ); + break; + + case Watcher::SIGNAL: + \assert(\is_int($watcher->value)); + + $this->events[$id] = $this->handle->signal($watcher->value, $this->signalCallback, $watcher); + break; + + default: + // @codeCoverageIgnoreStart + throw new \Error("Unknown watcher type"); + // @codeCoverageIgnoreEnd + } + } else { + $this->events[$id]->start(); + } + + if ($watcher->type === Watcher::SIGNAL) { + /** @psalm-suppress PropertyTypeCoercion */ + $this->signals[$id] = $this->events[$id]; + } + } + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function deactivate(Watcher $watcher) + { + if (isset($this->events[$id = $watcher->id])) { + $this->events[$id]->stop(); + + if ($watcher->type === Watcher::SIGNAL) { + unset($this->signals[$id]); + } + } + } +} diff --git a/vendor/amphp/amp/lib/Loop/EventDriver.php b/vendor/amphp/amp/lib/Loop/EventDriver.php new file mode 100644 index 00000000..c4a9b9b5 --- /dev/null +++ b/vendor/amphp/amp/lib/Loop/EventDriver.php @@ -0,0 +1,367 @@ +requireFeatures(\EventConfig::FEATURE_FDS); + } + + $this->handle = new \EventBase($config); + $this->nowOffset = getCurrentTime(); + $this->now = \random_int(0, $this->nowOffset); + $this->nowOffset -= $this->now; + + if (self::$activeSignals === null) { + self::$activeSignals = &$this->signals; + } + + /** + * @param $resource + * @param $what + * @param Watcher $watcher + * + * @return void + */ + $this->ioCallback = function ($resource, $what, Watcher $watcher) { + \assert(\is_resource($watcher->value)); + + try { + $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + }; + + /** + * @param $resource + * @param $what + * @param Watcher $watcher + * + * @return void + */ + $this->timerCallback = function ($resource, $what, Watcher $watcher) { + \assert(\is_int($watcher->value)); + + if ($watcher->type & Watcher::DELAY) { + $this->cancel($watcher->id); + } else { + $this->events[$watcher->id]->add($watcher->value / self::MILLISEC_PER_SEC); + } + + try { + $result = ($watcher->callback)($watcher->id, $watcher->data); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + }; + + /** + * @param $signum + * @param $what + * @param Watcher $watcher + * + * @return void + */ + $this->signalCallback = function ($signum, $what, Watcher $watcher) { + try { + $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + }; + } + + /** + * {@inheritdoc} + */ + public function cancel(string $watcherId) + { + parent::cancel($watcherId); + + if (isset($this->events[$watcherId])) { + $this->events[$watcherId]->free(); + unset($this->events[$watcherId]); + } + } + + public static function isSupported(): bool + { + return \extension_loaded("event"); + } + + /** + * @codeCoverageIgnore + */ + public function __destruct() + { + // Unset here, otherwise $event->del() in the loop may fail with a warning, because __destruct order isn't defined. + // Related https://github.com/amphp/amp/issues/159. + $events = $this->events; + $this->events = []; + + foreach ($events as $event) { + if ($event !== null) { // Events may have been nulled in extension depending on destruct order. + $event->free(); + } + } + + // Manually free the loop handle to fully release loop resources. + // See https://github.com/amphp/amp/issues/177. + if ($this->handle !== null) { + $this->handle->free(); + $this->handle = null; + } + } + + /** + * {@inheritdoc} + */ + public function run() + { + $active = self::$activeSignals; + + \assert($active !== null); + + foreach ($active as $event) { + $event->del(); + } + + self::$activeSignals = &$this->signals; + + foreach ($this->signals as $event) { + /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ + $event->add(); + } + + try { + parent::run(); + } finally { + foreach ($this->signals as $event) { + $event->del(); + } + + self::$activeSignals = &$active; + + foreach ($active as $event) { + /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ + $event->add(); + } + } + } + + /** + * {@inheritdoc} + */ + public function stop() + { + $this->handle->stop(); + parent::stop(); + } + + /** + * {@inheritdoc} + */ + public function now(): int + { + $this->now = getCurrentTime() - $this->nowOffset; + + return $this->now; + } + + /** + * {@inheritdoc} + */ + public function getHandle(): \EventBase + { + return $this->handle; + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function dispatch(bool $blocking) + { + $this->handle->loop($blocking ? \EventBase::LOOP_ONCE : \EventBase::LOOP_ONCE | \EventBase::LOOP_NONBLOCK); + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function activate(array $watchers) + { + $now = $this->now(); + + foreach ($watchers as $watcher) { + if (!isset($this->events[$id = $watcher->id])) { + switch ($watcher->type) { + case Watcher::READABLE: + \assert(\is_resource($watcher->value)); + + $this->events[$id] = new \Event( + $this->handle, + $watcher->value, + \Event::READ | \Event::PERSIST, + $this->ioCallback, + $watcher + ); + break; + + case Watcher::WRITABLE: + \assert(\is_resource($watcher->value)); + + $this->events[$id] = new \Event( + $this->handle, + $watcher->value, + \Event::WRITE | \Event::PERSIST, + $this->ioCallback, + $watcher + ); + break; + + case Watcher::DELAY: + case Watcher::REPEAT: + \assert(\is_int($watcher->value)); + + $this->events[$id] = new \Event( + $this->handle, + -1, + \Event::TIMEOUT, + $this->timerCallback, + $watcher + ); + break; + + case Watcher::SIGNAL: + \assert(\is_int($watcher->value)); + + $this->events[$id] = new \Event( + $this->handle, + $watcher->value, + \Event::SIGNAL | \Event::PERSIST, + $this->signalCallback, + $watcher + ); + break; + + default: + // @codeCoverageIgnoreStart + throw new \Error("Unknown watcher type"); + // @codeCoverageIgnoreEnd + } + } + + switch ($watcher->type) { + case Watcher::DELAY: + case Watcher::REPEAT: + \assert(\is_int($watcher->value)); + + $interval = \max(0, $watcher->expiration - $now); + $this->events[$id]->add($interval > 0 ? $interval / self::MILLISEC_PER_SEC : 0); + break; + + case Watcher::SIGNAL: + $this->signals[$id] = $this->events[$id]; + // no break + + default: + /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ + $this->events[$id]->add(); + break; + } + } + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function deactivate(Watcher $watcher) + { + if (isset($this->events[$id = $watcher->id])) { + $this->events[$id]->del(); + + if ($watcher->type === Watcher::SIGNAL) { + unset($this->signals[$id]); + } + } + } +} diff --git a/vendor/amphp/amp/lib/Loop/Internal/TimerQueue.php b/vendor/amphp/amp/lib/Loop/Internal/TimerQueue.php new file mode 100644 index 00000000..f2be704c --- /dev/null +++ b/vendor/amphp/amp/lib/Loop/Internal/TimerQueue.php @@ -0,0 +1,169 @@ +data[$node]; + while ($node !== 0 && $entry->expiration < $this->data[$parent = ($node - 1) >> 1]->expiration) { + $this->swap($node, $parent); + $node = $parent; + } + } + + /** + * @param int $node Rebuild the data array from the given node downward. + * + * @return void + */ + private function heapifyDown(int $node) + { + $length = \count($this->data); + while (($child = ($node << 1) + 1) < $length) { + if ($this->data[$child]->expiration < $this->data[$node]->expiration + && ($child + 1 >= $length || $this->data[$child]->expiration < $this->data[$child + 1]->expiration) + ) { + // Left child is less than parent and right child. + $swap = $child; + } elseif ($child + 1 < $length && $this->data[$child + 1]->expiration < $this->data[$node]->expiration) { + // Right child is less than parent and left child. + $swap = $child + 1; + } else { // Left and right child are greater than parent. + break; + } + + $this->swap($node, $swap); + $node = $swap; + } + } + + private function swap(int $left, int $right) + { + $temp = $this->data[$left]; + + $this->data[$left] = $this->data[$right]; + $this->pointers[$this->data[$right]->id] = $left; + + $this->data[$right] = $temp; + $this->pointers[$temp->id] = $right; + } + + /** + * Inserts the watcher into the queue. Time complexity: O(log(n)). + * + * @param Watcher $watcher + * + * @psalm-param Watcher $watcher + * + * @return void + */ + public function insert(Watcher $watcher) + { + \assert($watcher->expiration !== null); + \assert(!isset($this->pointers[$watcher->id])); + + $node = \count($this->data); + $this->data[$node] = $watcher; + $this->pointers[$watcher->id] = $node; + + $this->heapifyUp($node); + } + + /** + * Removes the given watcher from the queue. Time complexity: O(log(n)). + * + * @param Watcher $watcher + * + * @psalm-param Watcher $watcher + * + * @return void + */ + public function remove(Watcher $watcher) + { + $id = $watcher->id; + + if (!isset($this->pointers[$id])) { + return; + } + + $this->removeAndRebuild($this->pointers[$id]); + } + + /** + * Deletes and returns the Watcher on top of the heap if it has expired, otherwise null is returned. + * Time complexity: O(log(n)). + * + * @param int $now Current loop time. + * + * @return Watcher|null Expired watcher at the top of the heap or null if the watcher has not expired. + * + * @psalm-return Watcher|null + */ + public function extract(int $now) + { + if (empty($this->data)) { + return null; + } + + $watcher = $this->data[0]; + + if ($watcher->expiration > $now) { + return null; + } + + $this->removeAndRebuild(0); + + return $watcher; + } + + /** + * Returns the expiration time value at the top of the heap. Time complexity: O(1). + * + * @return int|null Expiration time of the watcher at the top of the heap or null if the heap is empty. + */ + public function peek() + { + return isset($this->data[0]) ? $this->data[0]->expiration : null; + } + + /** + * @param int $node Remove the given node and then rebuild the data array. + * + * @return void + */ + private function removeAndRebuild(int $node) + { + $length = \count($this->data) - 1; + $id = $this->data[$node]->id; + $left = $this->data[$node] = $this->data[$length]; + $this->pointers[$left->id] = $node; + unset($this->data[$length], $this->pointers[$id]); + + if ($node < $length) { // don't need to do anything if we removed the last element + $parent = ($node - 1) >> 1; + if ($parent >= 0 && $this->data[$node]->expiration < $this->data[$parent]->expiration) { + $this->heapifyUp($node); + } else { + $this->heapifyDown($node); + } + } + } +} diff --git a/vendor/amphp/amp/lib/Loop/InvalidWatcherError.php b/vendor/amphp/amp/lib/Loop/InvalidWatcherError.php new file mode 100644 index 00000000..4842ecf5 --- /dev/null +++ b/vendor/amphp/amp/lib/Loop/InvalidWatcherError.php @@ -0,0 +1,32 @@ +watcherId = $watcherId; + parent::__construct($message); + } + + /** + * @return string The watcher identifier. + */ + public function getWatcherId() + { + return $this->watcherId; + } +} diff --git a/vendor/amphp/amp/lib/Loop/NativeDriver.php b/vendor/amphp/amp/lib/Loop/NativeDriver.php new file mode 100644 index 00000000..1a1302e3 --- /dev/null +++ b/vendor/amphp/amp/lib/Loop/NativeDriver.php @@ -0,0 +1,445 @@ +timerQueue = new Internal\TimerQueue; + $this->signalHandling = \extension_loaded("pcntl"); + $this->nowOffset = getCurrentTime(); + $this->now = \random_int(0, $this->nowOffset); + $this->nowOffset -= $this->now; + $this->streamSelectErrorHandler = function ($errno, $message) { + // Casing changed in PHP 8 from 'unable' to 'Unable' + if (\stripos($message, "stream_select(): unable to select [4]: ") === 0) { // EINTR + $this->streamSelectIgnoreResult = true; + + return; + } + + if (\strpos($message, 'FD_SETSIZE') !== false) { + $message = \str_replace(["\r\n", "\n", "\r"], " ", $message); + $pattern = '(stream_select\(\): You MUST recompile PHP with a larger value of FD_SETSIZE. It is set to (\d+), but you have descriptors numbered at least as high as (\d+)\.)'; + + if (\preg_match($pattern, $message, $match)) { + $helpLink = 'https://amphp.org/amp/event-loop/#implementations'; + + $message = 'You have reached the limits of stream_select(). It has a FD_SETSIZE of ' . $match[1] + . ', but you have file descriptors numbered at least as high as ' . $match[2] . '. ' + . "You can install one of the extensions listed on {$helpLink} to support a higher number of " + . "concurrent file descriptors. If a large number of open file descriptors is unexpected, you " + . "might be leaking file descriptors that aren't closed correctly."; + } + } + + throw new \Exception($message, $errno); + }; + } + + /** + * {@inheritdoc} + * + * @throws \Amp\Loop\UnsupportedFeatureException If the pcntl extension is not available. + */ + public function onSignal(int $signo, callable $callback, $data = null): string + { + if (!$this->signalHandling) { + throw new UnsupportedFeatureException("Signal handling requires the pcntl extension"); + } + + return parent::onSignal($signo, $callback, $data); + } + + /** + * {@inheritdoc} + */ + public function now(): int + { + $this->now = getCurrentTime() - $this->nowOffset; + + return $this->now; + } + + /** + * {@inheritdoc} + */ + public function getHandle() + { + return null; + } + + /** + * @param bool $blocking + * + * @return void + * + * @throws \Throwable + */ + protected function dispatch(bool $blocking) + { + $this->selectStreams( + $this->readStreams, + $this->writeStreams, + $blocking ? $this->getTimeout() : 0 + ); + + $now = $this->now(); + + while ($watcher = $this->timerQueue->extract($now)) { + if ($watcher->type & Watcher::REPEAT) { + $watcher->enabled = false; // Trick base class into adding to enable queue when calling enable() + $this->enable($watcher->id); + } else { + $this->cancel($watcher->id); + } + + try { + // Execute the timer. + $result = ($watcher->callback)($watcher->id, $watcher->data); + + if ($result === null) { + continue; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + } + + if ($this->signalHandling) { + \pcntl_signal_dispatch(); + } + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function activate(array $watchers) + { + foreach ($watchers as $watcher) { + switch ($watcher->type) { + case Watcher::READABLE: + \assert(\is_resource($watcher->value)); + + $streamId = (int) $watcher->value; + $this->readWatchers[$streamId][$watcher->id] = $watcher; + $this->readStreams[$streamId] = $watcher->value; + break; + + case Watcher::WRITABLE: + \assert(\is_resource($watcher->value)); + + $streamId = (int) $watcher->value; + $this->writeWatchers[$streamId][$watcher->id] = $watcher; + $this->writeStreams[$streamId] = $watcher->value; + break; + + case Watcher::DELAY: + case Watcher::REPEAT: + \assert(\is_int($watcher->value)); + $this->timerQueue->insert($watcher); + break; + + case Watcher::SIGNAL: + \assert(\is_int($watcher->value)); + + if (!isset($this->signalWatchers[$watcher->value])) { + if (!@\pcntl_signal($watcher->value, $this->callableFromInstanceMethod('handleSignal'))) { + $message = "Failed to register signal handler"; + if ($error = \error_get_last()) { + $message .= \sprintf("; Errno: %d; %s", $error["type"], $error["message"]); + } + throw new \Error($message); + } + } + + $this->signalWatchers[$watcher->value][$watcher->id] = $watcher; + break; + + default: + // @codeCoverageIgnoreStart + throw new \Error("Unknown watcher type"); + // @codeCoverageIgnoreEnd + } + } + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function deactivate(Watcher $watcher) + { + switch ($watcher->type) { + case Watcher::READABLE: + $streamId = (int) $watcher->value; + unset($this->readWatchers[$streamId][$watcher->id]); + if (empty($this->readWatchers[$streamId])) { + unset($this->readWatchers[$streamId], $this->readStreams[$streamId]); + } + break; + + case Watcher::WRITABLE: + $streamId = (int) $watcher->value; + unset($this->writeWatchers[$streamId][$watcher->id]); + if (empty($this->writeWatchers[$streamId])) { + unset($this->writeWatchers[$streamId], $this->writeStreams[$streamId]); + } + break; + + case Watcher::DELAY: + case Watcher::REPEAT: + $this->timerQueue->remove($watcher); + break; + + case Watcher::SIGNAL: + \assert(\is_int($watcher->value)); + + if (isset($this->signalWatchers[$watcher->value])) { + unset($this->signalWatchers[$watcher->value][$watcher->id]); + + if (empty($this->signalWatchers[$watcher->value])) { + unset($this->signalWatchers[$watcher->value]); + @\pcntl_signal($watcher->value, \SIG_DFL); + } + } + break; + + default: + // @codeCoverageIgnoreStart + throw new \Error("Unknown watcher type"); + // @codeCoverageIgnoreEnd + } + } + + /** + * @param resource[] $read + * @param resource[] $write + * @param int $timeout + * + * @return void + */ + private function selectStreams(array $read, array $write, int $timeout) + { + $timeout /= self::MILLISEC_PER_SEC; + + if (!empty($read) || !empty($write)) { // Use stream_select() if there are any streams in the loop. + if ($timeout >= 0) { + $seconds = (int) $timeout; + $microseconds = (int) (($timeout - $seconds) * self::MICROSEC_PER_SEC); + } else { + $seconds = null; + $microseconds = null; + } + + // Failed connection attempts are indicated via except on Windows + // @link https://github.com/reactphp/event-loop/blob/8bd064ce23c26c4decf186c2a5a818c9a8209eb0/src/StreamSelectLoop.php#L279-L287 + // @link https://docs.microsoft.com/de-de/windows/win32/api/winsock2/nf-winsock2-select + $except = null; + if (\DIRECTORY_SEPARATOR === '\\') { + $except = $write; + } + + \set_error_handler($this->streamSelectErrorHandler); + + try { + $result = \stream_select($read, $write, $except, $seconds, $microseconds); + } finally { + \restore_error_handler(); + } + + if ($this->streamSelectIgnoreResult || $result === 0) { + $this->streamSelectIgnoreResult = false; + return; + } + + if (!$result) { + $this->error(new \Exception('Unknown error during stream_select')); + return; + } + + foreach ($read as $stream) { + $streamId = (int) $stream; + if (!isset($this->readWatchers[$streamId])) { + continue; // All read watchers disabled. + } + + foreach ($this->readWatchers[$streamId] as $watcher) { + if (!isset($this->readWatchers[$streamId][$watcher->id])) { + continue; // Watcher disabled by another IO watcher. + } + + try { + $result = ($watcher->callback)($watcher->id, $stream, $watcher->data); + + if ($result === null) { + continue; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + } + } + + \assert(\is_array($write)); // See https://github.com/vimeo/psalm/issues/3036 + + if ($except) { + foreach ($except as $key => $socket) { + $write[$key] = $socket; + } + } + + foreach ($write as $stream) { + $streamId = (int) $stream; + if (!isset($this->writeWatchers[$streamId])) { + continue; // All write watchers disabled. + } + + foreach ($this->writeWatchers[$streamId] as $watcher) { + if (!isset($this->writeWatchers[$streamId][$watcher->id])) { + continue; // Watcher disabled by another IO watcher. + } + + try { + $result = ($watcher->callback)($watcher->id, $stream, $watcher->data); + + if ($result === null) { + continue; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + } + } + + return; + } + + if ($timeout < 0) { // Only signal watchers are enabled, so sleep indefinitely. + \usleep(\PHP_INT_MAX); + return; + } + + if ($timeout > 0) { // Sleep until next timer expires. + \usleep((int) ($timeout * self::MICROSEC_PER_SEC)); + } + } + + /** + * @return int Milliseconds until next timer expires or -1 if there are no pending times. + */ + private function getTimeout(): int + { + $expiration = $this->timerQueue->peek(); + + if ($expiration === null) { + return -1; + } + + $expiration -= getCurrentTime() - $this->nowOffset; + + return $expiration > 0 ? $expiration : 0; + } + + /** + * @param int $signo + * + * @return void + */ + private function handleSignal(int $signo) + { + foreach ($this->signalWatchers[$signo] as $watcher) { + if (!isset($this->signalWatchers[$signo][$watcher->id])) { + continue; + } + + try { + $result = ($watcher->callback)($watcher->id, $signo, $watcher->data); + + if ($result === null) { + continue; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + } + } +} diff --git a/vendor/amphp/amp/lib/Loop/TracingDriver.php b/vendor/amphp/amp/lib/Loop/TracingDriver.php new file mode 100644 index 00000000..7b787548 --- /dev/null +++ b/vendor/amphp/amp/lib/Loop/TracingDriver.php @@ -0,0 +1,251 @@ +driver = $driver; + } + + public function run() + { + $this->driver->run(); + } + + public function stop() + { + $this->driver->stop(); + } + + public function defer(callable $callback, $data = null): string + { + $id = $this->driver->defer(function (...$args) use ($callback) { + $this->cancel($args[0]); + return $callback(...$args); + }, $data); + + $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); + $this->enabledWatchers[$id] = true; + + return $id; + } + + public function delay(int $delay, callable $callback, $data = null): string + { + $id = $this->driver->delay($delay, function (...$args) use ($callback) { + $this->cancel($args[0]); + return $callback(...$args); + }, $data); + + $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); + $this->enabledWatchers[$id] = true; + + return $id; + } + + public function repeat(int $interval, callable $callback, $data = null): string + { + $id = $this->driver->repeat($interval, $callback, $data); + + $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); + $this->enabledWatchers[$id] = true; + + return $id; + } + + public function onReadable($stream, callable $callback, $data = null): string + { + $id = $this->driver->onReadable($stream, $callback, $data); + + $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); + $this->enabledWatchers[$id] = true; + + return $id; + } + + public function onWritable($stream, callable $callback, $data = null): string + { + $id = $this->driver->onWritable($stream, $callback, $data); + + $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); + $this->enabledWatchers[$id] = true; + + return $id; + } + + public function onSignal(int $signo, callable $callback, $data = null): string + { + $id = $this->driver->onSignal($signo, $callback, $data); + + $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); + $this->enabledWatchers[$id] = true; + + return $id; + } + + public function enable(string $watcherId) + { + try { + $this->driver->enable($watcherId); + $this->enabledWatchers[$watcherId] = true; + } catch (InvalidWatcherError $e) { + throw new InvalidWatcherError( + $watcherId, + $e->getMessage() . "\r\n\r\n" . $this->getTraces($watcherId) + ); + } + } + + public function cancel(string $watcherId) + { + $this->driver->cancel($watcherId); + + if (!isset($this->cancelTraces[$watcherId])) { + $this->cancelTraces[$watcherId] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); + } + + unset($this->enabledWatchers[$watcherId], $this->unreferencedWatchers[$watcherId]); + } + + public function disable(string $watcherId) + { + $this->driver->disable($watcherId); + unset($this->enabledWatchers[$watcherId]); + } + + public function reference(string $watcherId) + { + try { + $this->driver->reference($watcherId); + unset($this->unreferencedWatchers[$watcherId]); + } catch (InvalidWatcherError $e) { + throw new InvalidWatcherError( + $watcherId, + $e->getMessage() . "\r\n\r\n" . $this->getTraces($watcherId) + ); + } + } + + public function unreference(string $watcherId) + { + $this->driver->unreference($watcherId); + $this->unreferencedWatchers[$watcherId] = true; + } + + public function setErrorHandler(callable $callback = null) + { + return $this->driver->setErrorHandler($callback); + } + + /** @inheritdoc */ + public function getHandle() + { + $this->driver->getHandle(); + } + + public function dump(): string + { + $dump = "Enabled, referenced watchers keeping the loop running: "; + + foreach ($this->enabledWatchers as $watcher => $_) { + if (isset($this->unreferencedWatchers[$watcher])) { + continue; + } + + $dump .= "Watcher ID: " . $watcher . "\r\n"; + $dump .= $this->getCreationTrace($watcher); + $dump .= "\r\n\r\n"; + } + + return \rtrim($dump); + } + + public function getInfo(): array + { + return $this->driver->getInfo(); + } + + public function __debugInfo() + { + return $this->driver->__debugInfo(); + } + + public function now(): int + { + return $this->driver->now(); + } + + protected function error(\Throwable $exception) + { + $this->driver->error($exception); + } + + /** + * @inheritdoc + * + * @return void + */ + protected function activate(array $watchers) + { + // nothing to do in a decorator + } + + /** + * @inheritdoc + * + * @return void + */ + protected function dispatch(bool $blocking) + { + // nothing to do in a decorator + } + + /** + * @inheritdoc + * + * @return void + */ + protected function deactivate(Watcher $watcher) + { + // nothing to do in a decorator + } + + private function getTraces(string $watcherId): string + { + return "Creation Trace:\r\n" . $this->getCreationTrace($watcherId) . "\r\n\r\n" . + "Cancellation Trace:\r\n" . $this->getCancelTrace($watcherId); + } + + private function getCreationTrace(string $watcher): string + { + if (!isset($this->creationTraces[$watcher])) { + return 'No creation trace, yet.'; + } + + return $this->creationTraces[$watcher]; + } + + private function getCancelTrace(string $watcher): string + { + if (!isset($this->cancelTraces[$watcher])) { + return 'No cancellation trace, yet.'; + } + + return $this->cancelTraces[$watcher]; + } +} diff --git a/vendor/amphp/amp/lib/Loop/UnsupportedFeatureException.php b/vendor/amphp/amp/lib/Loop/UnsupportedFeatureException.php new file mode 100644 index 00000000..e767cbe1 --- /dev/null +++ b/vendor/amphp/amp/lib/Loop/UnsupportedFeatureException.php @@ -0,0 +1,12 @@ +handle = \uv_loop_new(); + + /** + * @param $event + * @param $status + * @param $events + * @param $resource + * + * @return void + */ + $this->ioCallback = function ($event, $status, $events, $resource) { + $watchers = $this->watchers[(int) $event]; + + switch ($status) { + case 0: // OK + break; + + default: // Invoke the callback on errors, as this matches behavior with other loop back-ends. + // Re-enable watcher as libuv disables the watcher on non-zero status. + $flags = 0; + foreach ($watchers as $watcher) { + $flags |= $watcher->enabled ? $watcher->type : 0; + } + \uv_poll_start($event, $flags, $this->ioCallback); + break; + } + + foreach ($watchers as $watcher) { + // $events is OR'ed with 4 to trigger watcher if no events are indicated (0) or on UV_DISCONNECT (4). + // http://docs.libuv.org/en/v1.x/poll.html + if (!($watcher->enabled && ($watcher->type & $events || ($events | 4) === 4))) { + continue; + } + + try { + $result = ($watcher->callback)($watcher->id, $resource, $watcher->data); + + if ($result === null) { + continue; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + } + }; + + /** + * @param $event + * + * @return void + */ + $this->timerCallback = function ($event) { + $watcher = $this->watchers[(int) $event][0]; + + if ($watcher->type & Watcher::DELAY) { + unset($this->events[$watcher->id], $this->watchers[(int) $event]); // Avoid call to uv_is_active(). + $this->cancel($watcher->id); // Remove reference to watcher in parent. + } elseif ($watcher->value === 0) { + // Disable and re-enable so it's not executed repeatedly in the same tick + // See https://github.com/amphp/amp/issues/131 + $this->disable($watcher->id); + $this->enable($watcher->id); + } + + try { + $result = ($watcher->callback)($watcher->id, $watcher->data); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + }; + + /** + * @param $event + * @param $signo + * + * @return void + */ + $this->signalCallback = function ($event, $signo) { + $watcher = $this->watchers[(int) $event][0]; + + try { + $result = ($watcher->callback)($watcher->id, $signo, $watcher->data); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + rethrow($result); + } + } catch (\Throwable $exception) { + $this->error($exception); + } + }; + } + + /** + * {@inheritdoc} + */ + public function cancel(string $watcherId) + { + parent::cancel($watcherId); + + if (!isset($this->events[$watcherId])) { + return; + } + + $event = $this->events[$watcherId]; + $eventId = (int) $event; + + if (isset($this->watchers[$eventId][0])) { // All except IO watchers. + unset($this->watchers[$eventId]); + } elseif (isset($this->watchers[$eventId][$watcherId])) { + $watcher = $this->watchers[$eventId][$watcherId]; + unset($this->watchers[$eventId][$watcherId]); + + if (empty($this->watchers[$eventId])) { + unset($this->watchers[$eventId], $this->streams[(int) $watcher->value]); + } + } + + unset($this->events[$watcherId]); + } + + public static function isSupported(): bool + { + return \extension_loaded("uv"); + } + + /** + * {@inheritdoc} + */ + public function now(): int + { + \uv_update_time($this->handle); + + /** @psalm-suppress TooManyArguments */ + return \uv_now($this->handle); + } + + /** + * {@inheritdoc} + */ + public function getHandle() + { + return $this->handle; + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function dispatch(bool $blocking) + { + /** @psalm-suppress TooManyArguments */ + \uv_run($this->handle, $blocking ? \UV::RUN_ONCE : \UV::RUN_NOWAIT); + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function activate(array $watchers) + { + $now = $this->now(); + + foreach ($watchers as $watcher) { + $id = $watcher->id; + + switch ($watcher->type) { + case Watcher::READABLE: + case Watcher::WRITABLE: + \assert(\is_resource($watcher->value)); + + $streamId = (int) $watcher->value; + + if (isset($this->streams[$streamId])) { + $event = $this->streams[$streamId]; + } elseif (isset($this->events[$id])) { + $event = $this->streams[$streamId] = $this->events[$id]; + } else { + /** @psalm-suppress UndefinedFunction */ + $event = $this->streams[$streamId] = \uv_poll_init_socket($this->handle, $watcher->value); + } + + $eventId = (int) $event; + $this->events[$id] = $event; + $this->watchers[$eventId][$id] = $watcher; + + $flags = 0; + foreach ($this->watchers[$eventId] as $w) { + $flags |= $w->enabled ? $w->type : 0; + } + \uv_poll_start($event, $flags, $this->ioCallback); + break; + + case Watcher::DELAY: + case Watcher::REPEAT: + \assert(\is_int($watcher->value)); + + if (isset($this->events[$id])) { + $event = $this->events[$id]; + } else { + $event = $this->events[$id] = \uv_timer_init($this->handle); + } + + $this->watchers[(int) $event] = [$watcher]; + + \uv_timer_start( + $event, + \max(0, $watcher->expiration - $now), + ($watcher->type & Watcher::REPEAT) ? $watcher->value : 0, + $this->timerCallback + ); + break; + + case Watcher::SIGNAL: + \assert(\is_int($watcher->value)); + + if (isset($this->events[$id])) { + $event = $this->events[$id]; + } else { + /** @psalm-suppress UndefinedFunction */ + $event = $this->events[$id] = \uv_signal_init($this->handle); + } + + $this->watchers[(int) $event] = [$watcher]; + + /** @psalm-suppress UndefinedFunction */ + \uv_signal_start($event, $this->signalCallback, $watcher->value); + break; + + default: + // @codeCoverageIgnoreStart + throw new \Error("Unknown watcher type"); + // @codeCoverageIgnoreEnd + } + } + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function deactivate(Watcher $watcher) + { + $id = $watcher->id; + + if (!isset($this->events[$id])) { + return; + } + + $event = $this->events[$id]; + + if (!\uv_is_active($event)) { + return; + } + + switch ($watcher->type) { + case Watcher::READABLE: + case Watcher::WRITABLE: + $flags = 0; + foreach ($this->watchers[(int) $event] as $w) { + $flags |= $w->enabled ? $w->type : 0; + } + + if ($flags) { + \uv_poll_start($event, $flags, $this->ioCallback); + } else { + \uv_poll_stop($event); + } + break; + + case Watcher::DELAY: + case Watcher::REPEAT: + \uv_timer_stop($event); + break; + + case Watcher::SIGNAL: + \uv_signal_stop($event); + break; + + default: + // @codeCoverageIgnoreStart + throw new \Error("Unknown watcher type"); + // @codeCoverageIgnoreEnd + } + } +} diff --git a/vendor/amphp/amp/lib/Loop/Watcher.php b/vendor/amphp/amp/lib/Loop/Watcher.php new file mode 100644 index 00000000..4d16f9b9 --- /dev/null +++ b/vendor/amphp/amp/lib/Loop/Watcher.php @@ -0,0 +1,57 @@ +reasons = $reasons; + } + + /** + * @return \Throwable[] + */ + public function getReasons(): array + { + return $this->reasons; + } +} diff --git a/vendor/amphp/amp/lib/NullCancellationToken.php b/vendor/amphp/amp/lib/NullCancellationToken.php new file mode 100644 index 00000000..66faeba1 --- /dev/null +++ b/vendor/amphp/amp/lib/NullCancellationToken.php @@ -0,0 +1,53 @@ +throwIfRequested(); + * } + * ``` + * + * potentially multiple times, it allows writing + * + * ```php + * $token = $token ?? new NullCancellationToken; + * + * // ... + * + * $token->throwIfRequested(); + * ``` + * + * instead. + */ +final class NullCancellationToken implements CancellationToken +{ + /** @inheritdoc */ + public function subscribe(callable $callback): string + { + return "null-token"; + } + + /** @inheritdoc */ + public function unsubscribe(string $id) + { + // nothing to do + } + + /** @inheritdoc */ + public function isRequested(): bool + { + return false; + } + + /** @inheritdoc */ + public function throwIfRequested() + { + // nothing to do + } +} diff --git a/vendor/amphp/amp/lib/Producer.php b/vendor/amphp/amp/lib/Producer.php new file mode 100644 index 00000000..35b88c91 --- /dev/null +++ b/vendor/amphp/amp/lib/Producer.php @@ -0,0 +1,43 @@ + + */ +final class Producer implements Iterator +{ + /** + * @use Internal\Producer + */ + use CallableMaker, Internal\Producer; + + /** + * @param callable(callable(TValue):Promise):\Generator $producer + * + * @throws \Error Thrown if the callable does not return a Generator. + */ + public function __construct(callable $producer) + { + $result = $producer($this->callableFromInstanceMethod("emit")); + + if (!$result instanceof \Generator) { + throw new \Error("The callable did not return a Generator"); + } + + $coroutine = new Coroutine($result); + $coroutine->onResolve(function ($exception) { + if ($this->complete) { + return; + } + + if ($exception) { + $this->fail($exception); + return; + } + + $this->complete(); + }); + } +} diff --git a/vendor/amphp/amp/lib/Promise.php b/vendor/amphp/amp/lib/Promise.php new file mode 100644 index 00000000..2f7e824e --- /dev/null +++ b/vendor/amphp/amp/lib/Promise.php @@ -0,0 +1,37 @@ +, mixed, + * mixed>|null) | callable(\Throwable|null, mixed): void $onResolved + * + * @return void + */ + public function onResolve(callable $onResolved); +} diff --git a/vendor/amphp/amp/lib/Struct.php b/vendor/amphp/amp/lib/Struct.php new file mode 100644 index 00000000..0cb2563c --- /dev/null +++ b/vendor/amphp/amp/lib/Struct.php @@ -0,0 +1,78 @@ +generateStructPropertyError($property) + ); + } + + /** + * @param string $property + * @param mixed $value + * + * @psalm-return no-return + */ + public function __set(string $property, $value) + { + throw new \Error( + $this->generateStructPropertyError($property) + ); + } + + private function generateStructPropertyError(string $property): string + { + $suggestion = $this->suggestPropertyName($property); + $suggestStr = ($suggestion == "") ? "" : " ... did you mean \"{$suggestion}?\""; + + return \sprintf( + "%s property \"%s\" does not exist%s", + \str_replace("\0", "@", \get_class($this)), // Handle anonymous class names. + $property, + $suggestStr + ); + } + + private function suggestPropertyName(string $badProperty): string + { + $badProperty = \strtolower($badProperty); + $bestMatch = ""; + $bestMatchPercentage = 0; + + /** @psalm-suppress RawObjectIteration */ + foreach ($this as $property => $value) { + // Never suggest properties that begin with an underscore + if ($property[0] === "_") { + continue; + } + \similar_text($badProperty, \strtolower($property), $byRefPercentage); + if ($byRefPercentage > $bestMatchPercentage) { + $bestMatchPercentage = $byRefPercentage; + $bestMatch = $property; + } + } + + return ($bestMatchPercentage >= $this->__propertySuggestThreshold) ? $bestMatch : ""; + } +} diff --git a/vendor/amphp/amp/lib/Success.php b/vendor/amphp/amp/lib/Success.php new file mode 100644 index 00000000..1817c5a2 --- /dev/null +++ b/vendor/amphp/amp/lib/Success.php @@ -0,0 +1,60 @@ + + */ +final class Success implements Promise +{ + /** @var mixed */ + private $value; + + /** + * @param mixed $value Anything other than a Promise object. + * + * @psalm-param TValue $value + * + * @throws \Error If a promise is given as the value. + */ + public function __construct($value = null) + { + if ($value instanceof Promise || $value instanceof ReactPromise) { + throw new \Error("Cannot use a promise as success value"); + } + + $this->value = $value; + } + + /** + * {@inheritdoc} + */ + public function onResolve(callable $onResolved) + { + try { + $result = $onResolved(null, $this->value); + + if ($result === null) { + return; + } + + if ($result instanceof \Generator) { + $result = new Coroutine($result); + } + + if ($result instanceof Promise || $result instanceof ReactPromise) { + Promise\rethrow($result); + } + } catch (\Throwable $exception) { + Loop::defer(static function () use ($exception) { + throw $exception; + }); + } + } +} diff --git a/vendor/amphp/amp/lib/TimeoutCancellationToken.php b/vendor/amphp/amp/lib/TimeoutCancellationToken.php new file mode 100644 index 00000000..4c46ceb0 --- /dev/null +++ b/vendor/amphp/amp/lib/TimeoutCancellationToken.php @@ -0,0 +1,75 @@ +token = $source->getToken(); + + $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); + $this->watcher = Loop::delay($timeout, static function () use ($source, $message, $trace) { + $trace = formatStacktrace($trace); + $source->cancel(new TimeoutException("$message\r\nTimeoutCancellationToken was created here:\r\n$trace")); + }); + + Loop::unreference($this->watcher); + } + + /** + * Cancels the delay watcher. + */ + public function __destruct() + { + Loop::cancel($this->watcher); + } + + /** + * {@inheritdoc} + */ + public function subscribe(callable $callback): string + { + return $this->token->subscribe($callback); + } + + /** + * {@inheritdoc} + */ + public function unsubscribe(string $id) + { + $this->token->unsubscribe($id); + } + + /** + * {@inheritdoc} + */ + public function isRequested(): bool + { + return $this->token->isRequested(); + } + + /** + * {@inheritdoc} + */ + public function throwIfRequested() + { + $this->token->throwIfRequested(); + } +} diff --git a/vendor/amphp/amp/lib/TimeoutException.php b/vendor/amphp/amp/lib/TimeoutException.php new file mode 100644 index 00000000..dc7fba9e --- /dev/null +++ b/vendor/amphp/amp/lib/TimeoutException.php @@ -0,0 +1,19 @@ + + * @template T as TReturn|Promise|\Generator + * + * @formatter:off + * + * @param callable(...mixed): T $callback + * + * @return callable + * @psalm-return (T is Promise ? (callable(mixed...): Promise) : (T is \Generator ? (TGenerator is Promise ? (callable(mixed...): Promise) : (callable(mixed...): Promise)) : (callable(mixed...): Promise))) + * + * @formatter:on + * + * @see asyncCoroutine() + * + * @psalm-suppress InvalidReturnType + */ + function coroutine(callable $callback): callable + { + /** @psalm-suppress InvalidReturnStatement */ + return static function (...$args) use ($callback): Promise { + return call($callback, ...$args); + }; + } + + /** + * Returns a new function that wraps $callback in a promise/coroutine-aware function that automatically runs + * Generators as coroutines. The returned function always returns void when invoked. Errors are forwarded to the + * loop's error handler using `Amp\Promise\rethrow()`. + * + * Use this function to create a coroutine-aware callable for a non-promise-aware callback caller. + * + * @param callable(...mixed): mixed $callback + * + * @return callable + * @psalm-return callable(mixed...): void + * + * @see coroutine() + */ + function asyncCoroutine(callable $callback): callable + { + return static function (...$args) use ($callback) { + Promise\rethrow(call($callback, ...$args)); + }; + } + + /** + * Calls the given function, always returning a promise. If the function returns a Generator, it will be run as a + * coroutine. If the function throws, a failed promise will be returned. + * + * @template TReturn + * @template TPromise + * @template TGeneratorReturn + * @template TGeneratorPromise + * + * @template TGenerator as TGeneratorReturn|Promise + * @template T as TReturn|Promise|\Generator + * + * @formatter:off + * + * @param callable(...mixed): T $callback + * @param mixed ...$args Arguments to pass to the function. + * + * @return Promise + * @psalm-return (T is Promise ? Promise : (T is \Generator ? (TGenerator is Promise ? Promise : Promise) : Promise)) + * + * @formatter:on + */ + function call(callable $callback, ...$args): Promise + { + try { + $result = $callback(...$args); + } catch (\Throwable $exception) { + return new Failure($exception); + } + + if ($result instanceof \Generator) { + return new Coroutine($result); + } + + if ($result instanceof Promise) { + return $result; + } + + if ($result instanceof ReactPromise) { + return Promise\adapt($result); + } + + return new Success($result); + } + + /** + * Calls the given function. If the function returns a Generator, it will be run as a coroutine. If the function + * throws or returns a failing promise, the failure is forwarded to the loop error handler. + * + * @param callable(...mixed): mixed $callback + * @param mixed ...$args Arguments to pass to the function. + * + * @return void + */ + function asyncCall(callable $callback, ...$args) + { + Promise\rethrow(call($callback, ...$args)); + } + + /** + * Sleeps for the specified number of milliseconds. + * + * @param int $milliseconds + * + * @return Delayed + */ + function delay(int $milliseconds): Delayed + { + return new Delayed($milliseconds); + } + + /** + * Returns the current time relative to an arbitrary point in time. + * + * @return int Time in milliseconds. + */ + function getCurrentTime(): int + { + return Internal\getCurrentTime(); + } +} + +namespace Amp\Promise +{ + + use Amp\Deferred; + use Amp\Loop; + use Amp\MultiReasonException; + use Amp\Promise; + use Amp\Success; + use Amp\TimeoutException; + use React\Promise\PromiseInterface as ReactPromise; + use function Amp\call; + use function Amp\Internal\createTypeError; + + /** + * Registers a callback that will forward the failure reason to the event loop's error handler if the promise fails. + * + * Use this function if you neither return the promise nor handle a possible error yourself to prevent errors from + * going entirely unnoticed. + * + * @param Promise|ReactPromise $promise Promise to register the handler on. + * + * @return void + * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. + * + */ + function rethrow($promise) + { + if (!$promise instanceof Promise) { + if ($promise instanceof ReactPromise) { + $promise = adapt($promise); + } else { + throw createTypeError([Promise::class, ReactPromise::class], $promise); + } + } + + $promise->onResolve(static function ($exception) { + if ($exception) { + throw $exception; + } + }); + } + + /** + * Runs the event loop until the promise is resolved. Should not be called within a running event loop. + * + * Use this function only in synchronous contexts to wait for an asynchronous operation. Use coroutines and yield to + * await promise resolution in a fully asynchronous application instead. + * + * @template TPromise + * @template T as Promise|ReactPromise + * + * @param Promise|ReactPromise $promise Promise to wait for. + * + * @return mixed Promise success value. + * + * @psalm-param T $promise + * @psalm-return (T is Promise ? TPromise : mixed) + * + * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. + * @throws \Error If the event loop stopped without the $promise being resolved. + * @throws \Throwable Promise failure reason. + */ + function wait($promise) + { + if (!$promise instanceof Promise) { + if ($promise instanceof ReactPromise) { + $promise = adapt($promise); + } else { + throw createTypeError([Promise::class, ReactPromise::class], $promise); + } + } + + $resolved = false; + + try { + Loop::run(function () use (&$resolved, &$value, &$exception, $promise) { + $promise->onResolve(function ($e, $v) use (&$resolved, &$value, &$exception) { + Loop::stop(); + $resolved = true; + $exception = $e; + $value = $v; + }); + }); + } catch (\Throwable $throwable) { + throw new \Error("Loop exceptionally stopped without resolving the promise", 0, $throwable); + } + + if (!$resolved) { + throw new \Error("Loop stopped without resolving the promise"); + } + + if ($exception) { + throw $exception; + } + + return $value; + } + + /** + * Creates an artificial timeout for any `Promise`. + * + * If the timeout expires before the promise is resolved, the returned promise fails with an instance of + * `Amp\TimeoutException`. + * + * @template TReturn + * + * @param Promise|ReactPromise $promise Promise to which the timeout is applied. + * @param int $timeout Timeout in milliseconds. + * + * @return Promise + * + * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. + */ + function timeout($promise, int $timeout): Promise + { + if (!$promise instanceof Promise) { + if ($promise instanceof ReactPromise) { + $promise = adapt($promise); + } else { + throw createTypeError([Promise::class, ReactPromise::class], $promise); + } + } + + $deferred = new Deferred; + + $watcher = Loop::delay($timeout, static function () use (&$deferred) { + $temp = $deferred; // prevent double resolve + $deferred = null; + $temp->fail(new TimeoutException); + }); + Loop::unreference($watcher); + + $promise->onResolve(function () use (&$deferred, $promise, $watcher) { + if ($deferred !== null) { + Loop::cancel($watcher); + $deferred->resolve($promise); + } + }); + + return $deferred->promise(); + } + + /** + * Creates an artificial timeout for any `Promise`. + * + * If the promise is resolved before the timeout expires, the result is returned + * + * If the timeout expires before the promise is resolved, a default value is returned + * + * @template TReturn + * + * @param Promise|ReactPromise $promise Promise to which the timeout is applied. + * @param int $timeout Timeout in milliseconds. + * @param TReturn $default + * + * @return Promise + * + * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. + */ + function timeoutWithDefault($promise, int $timeout, $default = null): Promise + { + $promise = timeout($promise, $timeout); + + return call(static function () use ($promise, $default) { + try { + return yield $promise; + } catch (TimeoutException $exception) { + return $default; + } + }); + } + + /** + * Adapts any object with a done(callable $onFulfilled, callable $onRejected) or then(callable $onFulfilled, + * callable $onRejected) method to a promise usable by components depending on placeholders implementing + * \AsyncInterop\Promise. + * + * @param object $promise Object with a done() or then() method. + * + * @return Promise Promise resolved by the $thenable object. + * + * @throws \Error If the provided object does not have a then() method. + */ + function adapt($promise): Promise + { + if (!\is_object($promise)) { + throw new \Error("Object must be provided"); + } + + $deferred = new Deferred; + + if (\method_exists($promise, 'done')) { + $promise->done([$deferred, 'resolve'], [$deferred, 'fail']); + } elseif (\method_exists($promise, 'then')) { + $promise->then([$deferred, 'resolve'], [$deferred, 'fail']); + } else { + throw new \Error("Object must have a 'then' or 'done' method"); + } + + return $deferred->promise(); + } + + /** + * Returns a promise that is resolved when all promises are resolved. The returned promise will not fail. + * Returned promise succeeds with a two-item array delineating successful and failed promise results, + * with keys identical and corresponding to the original given array. + * + * This function is the same as some() with the notable exception that it will never fail even + * if all promises in the array resolve unsuccessfully. + * + * @template TValue + * + * @param Promise[]|ReactPromise[] $promises + * + * @return Promise + * + * @throws \Error If a non-Promise is in the array. + */ + function any(array $promises): Promise + { + return some($promises, 0); + } + + /** + * Returns a promise that succeeds when all promises succeed, and fails if any promise fails. Returned + * promise succeeds with an array of values used to succeed each contained promise, with keys corresponding to + * the array of promises. + * + * @param Promise[]|ReactPromise[] $promises Array of only promises. + * + * @return Promise + * + * @throws \Error If a non-Promise is in the array. + * + * @template TValue + * + * @psalm-param array|ReactPromise> $promises + * @psalm-assert array|ReactPromise> $promises $promises + * @psalm-return Promise> + */ + function all(array $promises): Promise + { + if (empty($promises)) { + return new Success([]); + } + + $deferred = new Deferred; + $result = $deferred->promise(); + + $pending = \count($promises); + $values = []; + + foreach ($promises as $key => $promise) { + if ($promise instanceof ReactPromise) { + $promise = adapt($promise); + } elseif (!$promise instanceof Promise) { + throw createTypeError([Promise::class, ReactPromise::class], $promise); + } + + $values[$key] = null; // add entry to array to preserve order + $promise->onResolve(function ($exception, $value) use (&$deferred, &$values, &$pending, $key) { + if ($pending === 0) { + return; + } + + if ($exception) { + $pending = 0; + $deferred->fail($exception); + $deferred = null; + return; + } + + $values[$key] = $value; + if (0 === --$pending) { + $deferred->resolve($values); + } + }); + } + + return $result; + } + + /** + * Returns a promise that succeeds when the first promise succeeds, and fails only if all promises fail. + * + * @template TValue + * + * @param Promise[]|ReactPromise[] $promises Array of only promises. + * + * @return Promise + * + * @throws \Error If the array is empty or a non-Promise is in the array. + */ + function first(array $promises): Promise + { + if (empty($promises)) { + throw new \Error("No promises provided"); + } + + $deferred = new Deferred; + $result = $deferred->promise(); + + $pending = \count($promises); + $exceptions = []; + + foreach ($promises as $key => $promise) { + if ($promise instanceof ReactPromise) { + $promise = adapt($promise); + } elseif (!$promise instanceof Promise) { + throw createTypeError([Promise::class, ReactPromise::class], $promise); + } + + $exceptions[$key] = null; // add entry to array to preserve order + $promise->onResolve(function ($error, $value) use (&$deferred, &$exceptions, &$pending, $key) { + if ($pending === 0) { + return; + } + + if (!$error) { + $pending = 0; + $deferred->resolve($value); + $deferred = null; + return; + } + + $exceptions[$key] = $error; + if (0 === --$pending) { + $deferred->fail(new MultiReasonException($exceptions)); + } + }); + } + + return $result; + } + + /** + * Resolves with a two-item array delineating successful and failed Promise results. + * + * The returned promise will only fail if the given number of required promises fail. + * + * @template TValue + * + * @param Promise[]|ReactPromise[] $promises Array of only promises. + * @param int $required Number of promises that must succeed for the + * returned promise to succeed. + * + * @return Promise + * + * @throws \Error If a non-Promise is in the array. + */ + function some(array $promises, int $required = 1): Promise + { + if ($required < 0) { + throw new \Error("Number of promises required must be non-negative"); + } + + $pending = \count($promises); + + if ($required > $pending) { + throw new \Error("Too few promises provided"); + } + + if (empty($promises)) { + return new Success([[], []]); + } + + $deferred = new Deferred; + $result = $deferred->promise(); + $values = []; + $exceptions = []; + + foreach ($promises as $key => $promise) { + if ($promise instanceof ReactPromise) { + $promise = adapt($promise); + } elseif (!$promise instanceof Promise) { + throw createTypeError([Promise::class, ReactPromise::class], $promise); + } + + $values[$key] = $exceptions[$key] = null; // add entry to arrays to preserve order + $promise->onResolve(static function ($exception, $value) use ( + &$values, + &$exceptions, + &$pending, + $key, + $required, + $deferred + ) { + if ($exception) { + $exceptions[$key] = $exception; + unset($values[$key]); + } else { + $values[$key] = $value; + unset($exceptions[$key]); + } + + if (0 === --$pending) { + if (\count($values) < $required) { + $deferred->fail(new MultiReasonException($exceptions)); + } else { + $deferred->resolve([$exceptions, $values]); + } + } + }); + } + + return $result; + } + + /** + * Wraps a promise into another promise, altering the exception or result. + * + * @param Promise|ReactPromise $promise + * @param callable $callback + * + * @return Promise + */ + function wrap($promise, callable $callback): Promise + { + if ($promise instanceof ReactPromise) { + $promise = adapt($promise); + } elseif (!$promise instanceof Promise) { + throw createTypeError([Promise::class, ReactPromise::class], $promise); + } + + $deferred = new Deferred(); + + $promise->onResolve(static function (\Throwable $exception = null, $result) use ($deferred, $callback) { + try { + $result = $callback($exception, $result); + } catch (\Throwable $exception) { + $deferred->fail($exception); + + return; + } + + $deferred->resolve($result); + }); + + return $deferred->promise(); + } +} + +namespace Amp\Iterator +{ + + use Amp\Delayed; + use Amp\Emitter; + use Amp\Iterator; + use Amp\Producer; + use Amp\Promise; + use function Amp\call; + use function Amp\coroutine; + use function Amp\Internal\createTypeError; + + /** + * Creates an iterator from the given iterable, emitting the each value. The iterable may contain promises. If any + * promise fails, the iterator will fail with the same reason. + * + * @param array|\Traversable $iterable Elements to emit. + * @param int $delay Delay between element emissions in milliseconds. + * + * @return Iterator + * + * @throws \TypeError If the argument is not an array or instance of \Traversable. + */ + function fromIterable(/* iterable */ + $iterable, + int $delay = 0 + ): Iterator { + if (!$iterable instanceof \Traversable && !\is_array($iterable)) { + throw createTypeError(["array", "Traversable"], $iterable); + } + + if ($delay) { + return new Producer(static function (callable $emit) use ($iterable, $delay) { + foreach ($iterable as $value) { + yield new Delayed($delay); + yield $emit($value); + } + }); + } + + return new Producer(static function (callable $emit) use ($iterable) { + foreach ($iterable as $value) { + yield $emit($value); + } + }); + } + + /** + * @template TValue + * @template TReturn + * + * @param Iterator $iterator + * @param callable (TValue $value): TReturn $onEmit + * + * @return Iterator + */ + function map(Iterator $iterator, callable $onEmit): Iterator + { + return new Producer(static function (callable $emit) use ($iterator, $onEmit) { + while (yield $iterator->advance()) { + yield $emit($onEmit($iterator->getCurrent())); + } + }); + } + + /** + * @template TValue + * + * @param Iterator $iterator + * @param callable(TValue $value):bool $filter + * + * @return Iterator + */ + function filter(Iterator $iterator, callable $filter): Iterator + { + return new Producer(static function (callable $emit) use ($iterator, $filter) { + while (yield $iterator->advance()) { + if ($filter($iterator->getCurrent())) { + yield $emit($iterator->getCurrent()); + } + } + }); + } + + /** + * Creates an iterator that emits values emitted from any iterator in the array of iterators. + * + * @param Iterator[] $iterators + * + * @return Iterator + */ + function merge(array $iterators): Iterator + { + $emitter = new Emitter; + $result = $emitter->iterate(); + + $coroutine = coroutine(static function (Iterator $iterator) use (&$emitter) { + while ((yield $iterator->advance()) && $emitter !== null) { + yield $emitter->emit($iterator->getCurrent()); + } + }); + + $coroutines = []; + foreach ($iterators as $iterator) { + if (!$iterator instanceof Iterator) { + throw createTypeError([Iterator::class], $iterator); + } + + $coroutines[] = $coroutine($iterator); + } + + Promise\all($coroutines)->onResolve(static function ($exception) use (&$emitter) { + if ($exception) { + $emitter->fail($exception); + $emitter = null; + } else { + $emitter->complete(); + } + }); + + return $result; + } + + /** + * Concatenates the given iterators into a single iterator, emitting values from a single iterator at a time. The + * prior iterator must complete before values are emitted from any subsequent iterators. Iterators are concatenated + * in the order given (iteration order of the array). + * + * @param Iterator[] $iterators + * + * @return Iterator + */ + function concat(array $iterators): Iterator + { + foreach ($iterators as $iterator) { + if (!$iterator instanceof Iterator) { + throw createTypeError([Iterator::class], $iterator); + } + } + + $emitter = new Emitter; + $previous = []; + $promise = Promise\all($previous); + + $coroutine = coroutine(static function (Iterator $iterator, callable $emit) { + while (yield $iterator->advance()) { + yield $emit($iterator->getCurrent()); + } + }); + + foreach ($iterators as $iterator) { + $emit = coroutine(static function ($value) use ($emitter, $promise) { + static $pending = true, $failed = false; + + if ($failed) { + return; + } + + if ($pending) { + try { + yield $promise; + $pending = false; + } catch (\Throwable $exception) { + $failed = true; + return; // Prior iterator failed. + } + } + + yield $emitter->emit($value); + }); + $previous[] = $coroutine($iterator, $emit); + $promise = Promise\all($previous); + } + + $promise->onResolve(static function ($exception) use ($emitter) { + if ($exception) { + $emitter->fail($exception); + return; + } + + $emitter->complete(); + }); + + return $emitter->iterate(); + } + + /** + * Discards all remaining items and returns the number of discarded items. + * + * @template TValue + * + * @param Iterator $iterator + * + * @return Promise + * + * @psalm-param Iterator $iterator + * @psalm-return Promise + */ + function discard(Iterator $iterator): Promise + { + return call(static function () use ($iterator): \Generator { + $count = 0; + + while (yield $iterator->advance()) { + $count++; + } + + return $count; + }); + } + + /** + * Collects all items from an iterator into an array. + * + * @template TValue + * + * @param Iterator $iterator + * + * @psalm-param Iterator $iterator + * + * @return Promise + * @psalm-return Promise> + */ + function toArray(Iterator $iterator): Promise + { + return call(static function () use ($iterator) { + /** @psalm-var list $array */ + $array = []; + + while (yield $iterator->advance()) { + $array[] = $iterator->getCurrent(); + } + + return $array; + }); + } +} diff --git a/vendor/amphp/byte-stream/.github/workflows/ci.yml b/vendor/amphp/byte-stream/.github/workflows/ci.yml new file mode 100644 index 00000000..b725757f --- /dev/null +++ b/vendor/amphp/byte-stream/.github/workflows/ci.yml @@ -0,0 +1,135 @@ +name: Continuous Integration + +on: + push: null + pull_request: + branches: + - master + +jobs: + unit_tests: + strategy: + matrix: + include: + - operating-system: 'ubuntu-latest' + php-version: '7.1' + + - operating-system: 'ubuntu-latest' + php-version: '7.2' + + - operating-system: 'ubuntu-latest' + php-version: '7.3' + + - operating-system: 'ubuntu-latest' + php-version: '7.4' + + - operating-system: 'ubuntu-latest' + php-version: '8.0' + composer-flags: '--ignore-platform-req=php' + + - operating-system: 'windows-latest' + php-version: '8.0' + composer-flags: '--ignore-platform-req=php' + + - operating-system: 'macos-latest' + php-version: '8.0' + composer-flags: '--ignore-platform-req=php' + + name: PHP ${{ matrix.php-version }} on ${{ matrix.operating-system }} + + runs-on: ${{ matrix.operating-system }} + + steps: + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + + - name: Use LF line ends + run: | + git config --global core.autocrlf false + git config --global core.eol lf + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get Composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-dir)" + + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.*') }}-${{ matrix.composer-flags }} + restore-keys: | + composer-${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.*') }}- + composer-${{ runner.os }}-${{ matrix.php-version }}- + + - name: Install dependencies + uses: nick-invision/retry@v2 + with: + timeout_minutes: 5 + max_attempts: 5 + retry_wait_seconds: 30 + command: | + php_version=$(php -v) + composer update --optimize-autoloader --no-interaction --no-progress ${{ matrix.composer-flags }} + composer info -D + + - name: Run unit tests + run: vendor/bin/phpunit --verbose + + coding_standards: + strategy: + matrix: + include: + - operating-system: 'ubuntu-latest' + php-version: '8.0' + composer-flags: '--ignore-platform-req=php' + + name: Coding standards + runs-on: ${{ matrix.operating-system }} + + steps: + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + + - name: Use LF line ends + run: | + git config --global core.autocrlf false + git config --global core.eol lf + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get Composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-dir)" + + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.*') }}-${{ matrix.composer-flags }} + restore-keys: | + composer-${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.*') }}- + composer-${{ runner.os }}-${{ matrix.php-version }}- + + - name: Install dependencies + uses: nick-invision/retry@v2 + with: + timeout_minutes: 5 + max_attempts: 5 + retry_wait_seconds: 30 + command: | + php_version=$(php -v) + composer update --optimize-autoloader --no-interaction --no-progress ${{ matrix.composer-flags }} + composer info -D + + - name: Run style fixer + env: + PHP_CS_FIXER_IGNORE_ENV: 1 + run: vendor/bin/php-cs-fixer --diff --dry-run -v fix diff --git a/vendor/amphp/byte-stream/LICENSE b/vendor/amphp/byte-stream/LICENSE new file mode 100644 index 00000000..7977d674 --- /dev/null +++ b/vendor/amphp/byte-stream/LICENSE @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2016-2021 amphp + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/amphp/byte-stream/composer.json b/vendor/amphp/byte-stream/composer.json new file mode 100644 index 00000000..0315674b --- /dev/null +++ b/vendor/amphp/byte-stream/composer.json @@ -0,0 +1,58 @@ +{ + "name": "amphp/byte-stream", + "homepage": "http://amphp.org/byte-stream", + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "support": { + "issues": "https://github.com/amphp/byte-stream/issues", + "irc": "irc://irc.freenode.org/amphp" + }, + "keywords": [ + "stream", + "async", + "non-blocking", + "amp", + "amphp", + "io" + ], + "license": "MIT", + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "require": { + "php": ">=7.1", + "amphp/amp": "^2" + }, + "require-dev": { + "amphp/phpunit-util": "^1.4", + "phpunit/phpunit": "^6 || ^7 || ^8", + "friendsofphp/php-cs-fixer": "^2.3", + "amphp/php-cs-fixer-config": "dev-master", + "psalm/phar": "^3.11.4", + "jetbrains/phpstorm-stubs": "^2019.3" + }, + "autoload": { + "psr-4": { + "Amp\\ByteStream\\": "lib" + }, + "files": [ + "lib/functions.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Amp\\ByteStream\\Test\\": "test" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + } +} diff --git a/vendor/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php b/vendor/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php new file mode 100644 index 00000000..294287d2 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php @@ -0,0 +1,65 @@ +source = $source; + } + + public function read(): Promise + { + return call(function () { + if ($this->source === null) { + throw new StreamException('Failed to read stream chunk due to invalid base64 data'); + } + + $chunk = yield $this->source->read(); + if ($chunk === null) { + if ($this->buffer === null) { + return null; + } + + $chunk = \base64_decode($this->buffer, true); + if ($chunk === false) { + $this->source = null; + $this->buffer = null; + + throw new StreamException('Failed to read stream chunk due to invalid base64 data'); + } + + $this->buffer = null; + + return $chunk; + } + + $this->buffer .= $chunk; + + $length = \strlen($this->buffer); + $chunk = \base64_decode(\substr($this->buffer, 0, $length - $length % 4), true); + if ($chunk === false) { + $this->source = null; + $this->buffer = null; + + throw new StreamException('Failed to read stream chunk due to invalid base64 data'); + } + + $this->buffer = \substr($this->buffer, $length - $length % 4); + + return $chunk; + }); + } +} diff --git a/vendor/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php b/vendor/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php new file mode 100644 index 00000000..664d99d7 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php @@ -0,0 +1,55 @@ +destination = $destination; + } + + public function write(string $data): Promise + { + $this->buffer .= $data; + + $length = \strlen($this->buffer); + $chunk = \base64_decode(\substr($this->buffer, 0, $length - $length % 4), true); + if ($chunk === false) { + return new Failure(new StreamException('Invalid base64 near offset ' . $this->offset)); + } + + $this->offset += $length - $length % 4; + $this->buffer = \substr($this->buffer, $length - $length % 4); + + return $this->destination->write($chunk); + } + + public function end(string $finalData = ""): Promise + { + $this->offset += \strlen($this->buffer); + + $chunk = \base64_decode($this->buffer . $finalData, true); + if ($chunk === false) { + return new Failure(new StreamException('Invalid base64 near offset ' . $this->offset)); + } + + $this->buffer = ''; + + return $this->destination->end($chunk); + } +} diff --git a/vendor/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php b/vendor/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php new file mode 100644 index 00000000..523af9d2 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php @@ -0,0 +1,46 @@ +source = $source; + } + + public function read(): Promise + { + return call(function () { + $chunk = yield $this->source->read(); + if ($chunk === null) { + if ($this->buffer === null) { + return null; + } + + $chunk = \base64_encode($this->buffer); + $this->buffer = null; + + return $chunk; + } + + $this->buffer .= $chunk; + + $length = \strlen($this->buffer); + $chunk = \base64_encode(\substr($this->buffer, 0, $length - $length % 3)); + $this->buffer = \substr($this->buffer, $length - $length % 3); + + return $chunk; + }); + } +} diff --git a/vendor/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php b/vendor/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php new file mode 100644 index 00000000..e23d6f53 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php @@ -0,0 +1,39 @@ +destination = $destination; + } + + public function write(string $data): Promise + { + $this->buffer .= $data; + + $length = \strlen($this->buffer); + $chunk = \base64_encode(\substr($this->buffer, 0, $length - $length % 3)); + $this->buffer = \substr($this->buffer, $length - $length % 3); + + return $this->destination->write($chunk); + } + + public function end(string $finalData = ""): Promise + { + $chunk = \base64_encode($this->buffer . $finalData); + $this->buffer = ''; + + return $this->destination->end($chunk); + } +} diff --git a/vendor/amphp/byte-stream/lib/ClosedException.php b/vendor/amphp/byte-stream/lib/ClosedException.php new file mode 100644 index 00000000..17957a86 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/ClosedException.php @@ -0,0 +1,7 @@ +contents = $contents; + } + + /** + * Reads data from the stream. + * + * @return Promise Resolves with the full contents or `null` if the stream has closed / already been consumed. + */ + public function read(): Promise + { + if ($this->contents === null) { + return new Success; + } + + $promise = new Success($this->contents); + $this->contents = null; + + return $promise; + } +} diff --git a/vendor/amphp/byte-stream/lib/InputStream.php b/vendor/amphp/byte-stream/lib/InputStream.php new file mode 100644 index 00000000..4c0b9e8f --- /dev/null +++ b/vendor/amphp/byte-stream/lib/InputStream.php @@ -0,0 +1,38 @@ +read()) !== null) { + * $buffer .= $chunk; + * } + * + * return $buffer; + * }); + * } + * ``` + */ +interface InputStream +{ + /** + * Reads data from the stream. + * + * @return Promise Resolves with a string when new data is available or `null` if the stream has closed. + * + * @psalm-return Promise + * + * @throws PendingReadError Thrown if another read operation is still pending. + */ + public function read(): Promise; +} diff --git a/vendor/amphp/byte-stream/lib/InputStreamChain.php b/vendor/amphp/byte-stream/lib/InputStreamChain.php new file mode 100644 index 00000000..d952a852 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/InputStreamChain.php @@ -0,0 +1,52 @@ +streams = $streams; + } + + /** @inheritDoc */ + public function read(): Promise + { + if ($this->reading) { + throw new PendingReadError; + } + + if (!$this->streams) { + return new Success(null); + } + + return call(function () { + $this->reading = true; + + try { + while ($this->streams) { + $chunk = yield $this->streams[0]->read(); + if ($chunk === null) { + \array_shift($this->streams); + continue; + } + + return $chunk; + } + + return null; + } finally { + $this->reading = false; + } + }); + } +} diff --git a/vendor/amphp/byte-stream/lib/IteratorStream.php b/vendor/amphp/byte-stream/lib/IteratorStream.php new file mode 100644 index 00000000..6fbe3912 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/IteratorStream.php @@ -0,0 +1,70 @@ + */ + private $iterator; + /** @var \Throwable|null */ + private $exception; + /** @var bool */ + private $pending = false; + + /** + * @psam-param Iterator $iterator + */ + public function __construct(Iterator $iterator) + { + $this->iterator = $iterator; + } + + /** @inheritdoc */ + public function read(): Promise + { + if ($this->exception) { + return new Failure($this->exception); + } + + if ($this->pending) { + throw new PendingReadError; + } + + $this->pending = true; + /** @var Deferred $deferred */ + $deferred = new Deferred; + + $this->iterator->advance()->onResolve(function ($error, $hasNextElement) use ($deferred) { + $this->pending = false; + + if ($error) { + $this->exception = $error; + $deferred->fail($error); + } elseif ($hasNextElement) { + $chunk = $this->iterator->getCurrent(); + + if (!\is_string($chunk)) { + $this->exception = new StreamException(\sprintf( + "Unexpected iterator value of type '%s', expected string", + \is_object($chunk) ? \get_class($chunk) : \gettype($chunk) + )); + + $deferred->fail($this->exception); + + return; + } + + $deferred->resolve($chunk); + } else { + $deferred->resolve(); + } + }); + + return $deferred->promise(); + } +} diff --git a/vendor/amphp/byte-stream/lib/LineReader.php b/vendor/amphp/byte-stream/lib/LineReader.php new file mode 100644 index 00000000..ed6b0a2a --- /dev/null +++ b/vendor/amphp/byte-stream/lib/LineReader.php @@ -0,0 +1,71 @@ +source = $inputStream; + $this->delimiter = $delimiter === null ? "\n" : $delimiter; + $this->lineMode = $delimiter === null; + } + + /** + * @return Promise + */ + public function readLine(): Promise + { + return call(function () { + if (false !== \strpos($this->buffer, $this->delimiter)) { + list($line, $this->buffer) = \explode($this->delimiter, $this->buffer, 2); + return $this->lineMode ? \rtrim($line, "\r") : $line; + } + + while (null !== $chunk = yield $this->source->read()) { + $this->buffer .= $chunk; + + if (false !== \strpos($this->buffer, $this->delimiter)) { + list($line, $this->buffer) = \explode($this->delimiter, $this->buffer, 2); + return $this->lineMode ? \rtrim($line, "\r") : $line; + } + } + + if ($this->buffer === "") { + return null; + } + + $line = $this->buffer; + $this->buffer = ""; + return $this->lineMode ? \rtrim($line, "\r") : $line; + }); + } + + public function getBuffer(): string + { + return $this->buffer; + } + + /** + * @return void + */ + public function clearBuffer() + { + $this->buffer = ""; + } +} diff --git a/vendor/amphp/byte-stream/lib/Message.php b/vendor/amphp/byte-stream/lib/Message.php new file mode 100644 index 00000000..33046233 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/Message.php @@ -0,0 +1,176 @@ +read()) !== null) { + * // Immediately use $chunk, reducing memory consumption since the entire message is never buffered. + * } + * + * @deprecated Use Amp\ByteStream\Payload instead. + */ +class Message implements InputStream, Promise +{ + /** @var InputStream */ + private $source; + + /** @var string */ + private $buffer = ""; + + /** @var Deferred|null */ + private $pendingRead; + + /** @var Coroutine|null */ + private $coroutine; + + /** @var bool True if onResolve() has been called. */ + private $buffering = false; + + /** @var Deferred|null */ + private $backpressure; + + /** @var bool True if the iterator has completed. */ + private $complete = false; + + /** @var \Throwable|null Used to fail future reads on failure. */ + private $error; + + /** + * @param InputStream $source An iterator that only emits strings. + */ + public function __construct(InputStream $source) + { + $this->source = $source; + } + + private function consume(): \Generator + { + while (($chunk = yield $this->source->read()) !== null) { + $buffer = $this->buffer .= $chunk; + + if ($buffer === "") { + continue; // Do not succeed reads with empty string. + } elseif ($this->pendingRead) { + $deferred = $this->pendingRead; + $this->pendingRead = null; + $this->buffer = ""; + $deferred->resolve($buffer); + $buffer = ""; // Destroy last emitted chunk to free memory. + } elseif (!$this->buffering) { + $buffer = ""; // Destroy last emitted chunk to free memory. + $this->backpressure = new Deferred; + yield $this->backpressure->promise(); + } + } + + $this->complete = true; + + if ($this->pendingRead) { + $deferred = $this->pendingRead; + $this->pendingRead = null; + $deferred->resolve($this->buffer !== "" ? $this->buffer : null); + $this->buffer = ""; + } + + return $this->buffer; + } + + /** @inheritdoc */ + final public function read(): Promise + { + if ($this->pendingRead) { + throw new PendingReadError; + } + + if ($this->coroutine === null) { + $this->coroutine = new Coroutine($this->consume()); + $this->coroutine->onResolve(function ($error) { + if ($error) { + $this->error = $error; + } + + if ($this->pendingRead) { + $deferred = $this->pendingRead; + $this->pendingRead = null; + $deferred->fail($error); + } + }); + } + + if ($this->error) { + return new Failure($this->error); + } + + if ($this->buffer !== "") { + $buffer = $this->buffer; + $this->buffer = ""; + + if ($this->backpressure) { + $backpressure = $this->backpressure; + $this->backpressure = null; + $backpressure->resolve(); + } + + return new Success($buffer); + } + + if ($this->complete) { + return new Success; + } + + $this->pendingRead = new Deferred; + return $this->pendingRead->promise(); + } + + /** @inheritdoc */ + final public function onResolve(callable $onResolved) + { + $this->buffering = true; + + if ($this->coroutine === null) { + $this->coroutine = new Coroutine($this->consume()); + } + + if ($this->backpressure) { + $backpressure = $this->backpressure; + $this->backpressure = null; + $backpressure->resolve(); + } + + $this->coroutine->onResolve($onResolved); + } + + /** + * Exposes the source input stream. + * + * This might be required to resolve a promise with an InputStream, because promises in Amp can't be resolved with + * other promises. + * + * @return InputStream + */ + final public function getInputStream(): InputStream + { + return $this->source; + } +} diff --git a/vendor/amphp/byte-stream/lib/OutputBuffer.php b/vendor/amphp/byte-stream/lib/OutputBuffer.php new file mode 100644 index 00000000..832dc71b --- /dev/null +++ b/vendor/amphp/byte-stream/lib/OutputBuffer.php @@ -0,0 +1,55 @@ +deferred = new Deferred; + } + + public function write(string $data): Promise + { + if ($this->closed) { + throw new ClosedException("The stream has already been closed."); + } + + $this->contents .= $data; + + return new Success(\strlen($data)); + } + + public function end(string $finalData = ""): Promise + { + if ($this->closed) { + throw new ClosedException("The stream has already been closed."); + } + + $this->contents .= $finalData; + $this->closed = true; + + $this->deferred->resolve($this->contents); + $this->contents = ""; + + return new Success(\strlen($finalData)); + } + + public function onResolve(callable $onResolved) + { + $this->deferred->promise()->onResolve($onResolved); + } +} diff --git a/vendor/amphp/byte-stream/lib/OutputStream.php b/vendor/amphp/byte-stream/lib/OutputStream.php new file mode 100644 index 00000000..68f51fc1 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/OutputStream.php @@ -0,0 +1,37 @@ +stream = $stream; + } + + public function __destruct() + { + if (!$this->promise) { + Promise\rethrow(new Coroutine($this->consume())); + } + } + + private function consume(): \Generator + { + try { + if ($this->lastRead && null === yield $this->lastRead) { + return; + } + + while (null !== yield $this->stream->read()) { + // Discard unread bytes from message. + } + } catch (\Throwable $exception) { + // If exception is thrown here the connection closed anyway. + } + } + + /** + * @inheritdoc + * + * @throws \Error If a buffered message was requested by calling buffer(). + */ + final public function read(): Promise + { + if ($this->promise) { + throw new \Error("Cannot stream message data once a buffered message has been requested"); + } + + return $this->lastRead = $this->stream->read(); + } + + /** + * Buffers the entire message and resolves the returned promise then. + * + * @return Promise Resolves with the entire message contents. + */ + final public function buffer(): Promise + { + if ($this->promise) { + return $this->promise; + } + + return $this->promise = call(function () { + $buffer = ''; + if ($this->lastRead && null === yield $this->lastRead) { + return $buffer; + } + + while (null !== $chunk = yield $this->stream->read()) { + $buffer .= $chunk; + } + return $buffer; + }); + } +} diff --git a/vendor/amphp/byte-stream/lib/PendingReadError.php b/vendor/amphp/byte-stream/lib/PendingReadError.php new file mode 100644 index 00000000..66dc1fbd --- /dev/null +++ b/vendor/amphp/byte-stream/lib/PendingReadError.php @@ -0,0 +1,17 @@ +useSingleRead = $useSingleRead; + + if (\strpos($meta["mode"], "r") === false && \strpos($meta["mode"], "+") === false) { + throw new \Error("Expected a readable stream"); + } + + \stream_set_blocking($stream, false); + \stream_set_read_buffer($stream, 0); + + $this->resource = &$stream; + $this->chunkSize = &$chunkSize; + + $deferred = &$this->deferred; + $readable = &$this->readable; + + $this->watcher = Loop::onReadable($this->resource, static function ($watcher) use ( + &$deferred, + &$readable, + &$stream, + &$chunkSize, + $useSingleRead + ) { + if ($useSingleRead) { + $data = @\fread($stream, $chunkSize); + } else { + $data = @\stream_get_contents($stream, $chunkSize); + } + + \assert($data !== false, "Trying to read from a previously fclose()'d resource. Do NOT manually fclose() resources the loop still has a reference to."); + + // Error suppression, because pthreads does crazy things with resources, + // which might be closed during two operations. + // See https://github.com/amphp/byte-stream/issues/32 + if ($data === '' && @\feof($stream)) { + $readable = false; + $stream = null; + $data = null; // Stream closed, resolve read with null. + Loop::cancel($watcher); + } else { + Loop::disable($watcher); + } + + $temp = $deferred; + $deferred = null; + + \assert($temp instanceof Deferred); + $temp->resolve($data); + }); + + $this->immediateCallable = static function ($watcherId, $data) use (&$deferred) { + $temp = $deferred; + $deferred = null; + + \assert($temp instanceof Deferred); + $temp->resolve($data); + }; + + Loop::disable($this->watcher); + } + + /** @inheritdoc */ + public function read(): Promise + { + if ($this->deferred !== null) { + throw new PendingReadError; + } + + if (!$this->readable) { + return new Success; // Resolve with null on closed stream. + } + + \assert($this->resource !== null); + + // Attempt a direct read, because Windows suffers from slow I/O on STDIN otherwise. + if ($this->useSingleRead) { + $data = @\fread($this->resource, $this->chunkSize); + } else { + $data = @\stream_get_contents($this->resource, $this->chunkSize); + } + + \assert($data !== false, "Trying to read from a previously fclose()'d resource. Do NOT manually fclose() resources the loop still has a reference to."); + + if ($data === '') { + // Error suppression, because pthreads does crazy things with resources, + // which might be closed during two operations. + // See https://github.com/amphp/byte-stream/issues/32 + if (@\feof($this->resource)) { + $this->readable = false; + $this->resource = null; + Loop::cancel($this->watcher); + + return new Success; // Stream closed, resolve read with null. + } + + $this->deferred = new Deferred; + Loop::enable($this->watcher); + + return $this->deferred->promise(); + } + + // Prevent an immediate read → write loop from blocking everything + // See e.g. examples/benchmark-throughput.php + $this->deferred = new Deferred; + $this->immediateWatcher = Loop::defer($this->immediateCallable, $data); + + return $this->deferred->promise(); + } + + /** + * Closes the stream forcefully. Multiple `close()` calls are ignored. + * + * @return void + */ + public function close() + { + if (\is_resource($this->resource)) { + // Error suppression, as resource might already be closed + $meta = @\stream_get_meta_data($this->resource); + + if ($meta && \strpos($meta["mode"], "+") !== false) { + @\stream_socket_shutdown($this->resource, \STREAM_SHUT_RD); + } else { + /** @psalm-suppress InvalidPropertyAssignmentValue */ + @\fclose($this->resource); + } + } + + $this->free(); + } + + /** + * Nulls reference to resource, marks stream unreadable, and succeeds any pending read with null. + * + * @return void + */ + private function free() + { + $this->readable = false; + $this->resource = null; + + if ($this->deferred !== null) { + $deferred = $this->deferred; + $this->deferred = null; + $deferred->resolve(); + } + + Loop::cancel($this->watcher); + + if ($this->immediateWatcher !== null) { + Loop::cancel($this->immediateWatcher); + } + } + + /** + * @return resource|null The stream resource or null if the stream has closed. + */ + public function getResource() + { + return $this->resource; + } + + /** + * @return void + */ + public function setChunkSize(int $chunkSize) + { + $this->chunkSize = $chunkSize; + } + + /** + * References the read watcher, so the loop keeps running in case there's an active read. + * + * @return void + * + * @see Loop::reference() + */ + public function reference() + { + if (!$this->resource) { + throw new \Error("Resource has already been freed"); + } + + Loop::reference($this->watcher); + } + + /** + * Unreferences the read watcher, so the loop doesn't keep running even if there are active reads. + * + * @return void + * + * @see Loop::unreference() + */ + public function unreference() + { + if (!$this->resource) { + throw new \Error("Resource has already been freed"); + } + + Loop::unreference($this->watcher); + } + + public function __destruct() + { + if ($this->resource !== null) { + $this->free(); + } + } +} diff --git a/vendor/amphp/byte-stream/lib/ResourceOutputStream.php b/vendor/amphp/byte-stream/lib/ResourceOutputStream.php new file mode 100644 index 00000000..035e480b --- /dev/null +++ b/vendor/amphp/byte-stream/lib/ResourceOutputStream.php @@ -0,0 +1,321 @@ + */ + private $writes; + + /** @var bool */ + private $writable = true; + + /** @var int|null */ + private $chunkSize; + + /** + * @param resource $stream Stream resource. + * @param int|null $chunkSize Chunk size per `fwrite()` operation. + */ + public function __construct($stream, int $chunkSize = null) + { + if (!\is_resource($stream) || \get_resource_type($stream) !== 'stream') { + throw new \Error("Expected a valid stream"); + } + + $meta = \stream_get_meta_data($stream); + + if (\strpos($meta["mode"], "r") !== false && \strpos($meta["mode"], "+") === false) { + throw new \Error("Expected a writable stream"); + } + + \stream_set_blocking($stream, false); + \stream_set_write_buffer($stream, 0); + + $this->resource = $stream; + $this->chunkSize = &$chunkSize; + + $writes = $this->writes = new \SplQueue; + $writable = &$this->writable; + $resource = &$this->resource; + + $this->watcher = Loop::onWritable($stream, static function ($watcher, $stream) use ($writes, &$chunkSize, &$writable, &$resource) { + static $emptyWrites = 0; + + try { + while (!$writes->isEmpty()) { + /** @var Deferred $deferred */ + list($data, $previous, $deferred) = $writes->shift(); + $length = \strlen($data); + + if ($length === 0) { + $deferred->resolve(0); + continue; + } + + if (!\is_resource($stream) || (($metaData = @\stream_get_meta_data($stream)) && $metaData['eof'])) { + throw new ClosedException("The stream was closed by the peer"); + } + + // Error reporting suppressed since fwrite() emits E_WARNING if the pipe is broken or the buffer is full. + // Use conditional, because PHP doesn't like getting null passed + if ($chunkSize) { + $written = @\fwrite($stream, $data, $chunkSize); + } else { + $written = @\fwrite($stream, $data); + } + + \assert( + $written !== false || \PHP_VERSION_ID >= 70400, // PHP 7.4+ returns false on EPIPE. + "Trying to write on a previously fclose()'d resource. Do NOT manually fclose() resources the still referenced in the loop." + ); + + // PHP 7.4.0 and 7.4.1 may return false on EAGAIN. + if ($written === false && \PHP_VERSION_ID >= 70402) { + $message = "Failed to write to stream"; + if ($error = \error_get_last()) { + $message .= \sprintf("; %s", $error["message"]); + } + throw new StreamException($message); + } + + // Broken pipes between processes on macOS/FreeBSD do not detect EOF properly. + if ($written === 0 || $written === false) { + if ($emptyWrites++ > self::MAX_CONSECUTIVE_EMPTY_WRITES) { + $message = "Failed to write to stream after multiple attempts"; + if ($error = \error_get_last()) { + $message .= \sprintf("; %s", $error["message"]); + } + throw new StreamException($message); + } + + $writes->unshift([$data, $previous, $deferred]); + return; + } + + $emptyWrites = 0; + + if ($length > $written) { + $data = \substr($data, $written); + $writes->unshift([$data, $written + $previous, $deferred]); + return; + } + + $deferred->resolve($written + $previous); + } + } catch (\Throwable $exception) { + $resource = null; + $writable = false; + + /** @psalm-suppress PossiblyUndefinedVariable */ + $deferred->fail($exception); + while (!$writes->isEmpty()) { + list(, , $deferred) = $writes->shift(); + $deferred->fail($exception); + } + + Loop::cancel($watcher); + } finally { + if ($writes->isEmpty()) { + Loop::disable($watcher); + } + } + }); + + Loop::disable($this->watcher); + } + + /** + * Writes data to the stream. + * + * @param string $data Bytes to write. + * + * @return Promise Succeeds once the data has been successfully written to the stream. + * + * @throws ClosedException If the stream has already been closed. + */ + public function write(string $data): Promise + { + return $this->send($data, false); + } + + /** + * Closes the stream after all pending writes have been completed. Optionally writes a final data chunk before. + * + * @param string $finalData Bytes to write. + * + * @return Promise Succeeds once the data has been successfully written to the stream. + * + * @throws ClosedException If the stream has already been closed. + */ + public function end(string $finalData = ""): Promise + { + return $this->send($finalData, true); + } + + private function send(string $data, bool $end = false): Promise + { + if (!$this->writable) { + return new Failure(new ClosedException("The stream is not writable")); + } + + $length = \strlen($data); + $written = 0; + + if ($end) { + $this->writable = false; + } + + if ($this->writes->isEmpty()) { + if ($length === 0) { + if ($end) { + $this->close(); + } + return new Success(0); + } + + if (!\is_resource($this->resource) || (($metaData = @\stream_get_meta_data($this->resource)) && $metaData['eof'])) { + return new Failure(new ClosedException("The stream was closed by the peer")); + } + + // Error reporting suppressed since fwrite() emits E_WARNING if the pipe is broken or the buffer is full. + // Use conditional, because PHP doesn't like getting null passed. + if ($this->chunkSize) { + $written = @\fwrite($this->resource, $data, $this->chunkSize); + } else { + $written = @\fwrite($this->resource, $data); + } + + \assert( + $written !== false || \PHP_VERSION_ID >= 70400, // PHP 7.4+ returns false on EPIPE. + "Trying to write on a previously fclose()'d resource. Do NOT manually fclose() resources the still referenced in the loop." + ); + + // PHP 7.4.0 and 7.4.1 may return false on EAGAIN. + if ($written === false && \PHP_VERSION_ID >= 70402) { + $message = "Failed to write to stream"; + if ($error = \error_get_last()) { + $message .= \sprintf("; %s", $error["message"]); + } + return new Failure(new StreamException($message)); + } + + $written = (int) $written; // Cast potential false to 0. + + if ($length === $written) { + if ($end) { + $this->close(); + } + return new Success($written); + } + + $data = \substr($data, $written); + } + + $deferred = new Deferred; + + if ($length - $written > self::LARGE_CHUNK_SIZE) { + $chunks = \str_split($data, self::LARGE_CHUNK_SIZE); + $data = \array_pop($chunks); + foreach ($chunks as $chunk) { + $this->writes->push([$chunk, $written, new Deferred]); + $written += self::LARGE_CHUNK_SIZE; + } + } + + $this->writes->push([$data, $written, $deferred]); + Loop::enable($this->watcher); + $promise = $deferred->promise(); + + if ($end) { + $promise->onResolve([$this, "close"]); + } + + return $promise; + } + + /** + * Closes the stream forcefully. Multiple `close()` calls are ignored. + * + * @return void + */ + public function close() + { + if (\is_resource($this->resource)) { + // Error suppression, as resource might already be closed + $meta = @\stream_get_meta_data($this->resource); + + if ($meta && \strpos($meta["mode"], "+") !== false) { + @\stream_socket_shutdown($this->resource, \STREAM_SHUT_WR); + } else { + /** @psalm-suppress InvalidPropertyAssignmentValue psalm reports this as closed-resource */ + @\fclose($this->resource); + } + } + + $this->free(); + } + + /** + * Nulls reference to resource, marks stream unwritable, and fails any pending write. + * + * @return void + */ + private function free() + { + $this->resource = null; + $this->writable = false; + + if (!$this->writes->isEmpty()) { + $exception = new ClosedException("The socket was closed before writing completed"); + do { + /** @var Deferred $deferred */ + list(, , $deferred) = $this->writes->shift(); + $deferred->fail($exception); + } while (!$this->writes->isEmpty()); + } + + Loop::cancel($this->watcher); + } + + /** + * @return resource|null Stream resource or null if end() has been called or the stream closed. + */ + public function getResource() + { + return $this->resource; + } + + /** + * @return void + */ + public function setChunkSize(int $chunkSize) + { + $this->chunkSize = $chunkSize; + } + + public function __destruct() + { + if ($this->resource !== null) { + $this->free(); + } + } +} diff --git a/vendor/amphp/byte-stream/lib/StreamException.php b/vendor/amphp/byte-stream/lib/StreamException.php new file mode 100644 index 00000000..b86ec7e0 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/StreamException.php @@ -0,0 +1,7 @@ +source = $source; + $this->encoding = $encoding; + $this->options = $options; + $this->resource = @\inflate_init($encoding, $options); + + if ($this->resource === false) { + throw new StreamException("Failed initializing deflate context"); + } + } + + /** @inheritdoc */ + public function read(): Promise + { + return call(function () { + if ($this->resource === null) { + return null; + } + + \assert($this->source !== null); + + $data = yield $this->source->read(); + + // Needs a double guard, as stream might have been closed while reading + /** @psalm-suppress ParadoxicalCondition */ + if ($this->resource === null) { + return null; + } + + if ($data === null) { + $decompressed = @\inflate_add($this->resource, "", \ZLIB_FINISH); + + if ($decompressed === false) { + throw new StreamException("Failed adding data to deflate context"); + } + + $this->close(); + + return $decompressed; + } + + $decompressed = @\inflate_add($this->resource, $data, \ZLIB_SYNC_FLUSH); + + if ($decompressed === false) { + throw new StreamException("Failed adding data to deflate context"); + } + + return $decompressed; + }); + } + + /** + * @internal + * @return void + */ + private function close() + { + $this->resource = null; + $this->source = null; + } + + /** + * Gets the used compression encoding. + * + * @return int Encoding specified on construction time. + */ + public function getEncoding(): int + { + return $this->encoding; + } + /** + * Gets the used compression options. + * + * @return array Options array passed on construction time. + */ + public function getOptions(): array + { + return $this->options; + } +} diff --git a/vendor/amphp/byte-stream/lib/ZlibOutputStream.php b/vendor/amphp/byte-stream/lib/ZlibOutputStream.php new file mode 100644 index 00000000..542df1ce --- /dev/null +++ b/vendor/amphp/byte-stream/lib/ZlibOutputStream.php @@ -0,0 +1,119 @@ +destination = $destination; + $this->encoding = $encoding; + $this->options = $options; + $this->resource = @\deflate_init($encoding, $options); + + if ($this->resource === false) { + throw new StreamException("Failed initializing deflate context"); + } + } + + /** @inheritdoc */ + public function write(string $data): Promise + { + if ($this->resource === null) { + throw new ClosedException("The stream has already been closed"); + } + + \assert($this->destination !== null); + + $compressed = \deflate_add($this->resource, $data, \ZLIB_SYNC_FLUSH); + + if ($compressed === false) { + throw new StreamException("Failed adding data to deflate context"); + } + + $promise = $this->destination->write($compressed); + $promise->onResolve(function ($error) { + if ($error) { + $this->close(); + } + }); + + return $promise; + } + + /** @inheritdoc */ + public function end(string $finalData = ""): Promise + { + if ($this->resource === null) { + throw new ClosedException("The stream has already been closed"); + } + + \assert($this->destination !== null); + + $compressed = \deflate_add($this->resource, $finalData, \ZLIB_FINISH); + + if ($compressed === false) { + throw new StreamException("Failed adding data to deflate context"); + } + + $promise = $this->destination->end($compressed); + $promise->onResolve(function () { + $this->close(); + }); + + return $promise; + } + + /** + * @internal + * @return void + */ + private function close() + { + $this->resource = null; + $this->destination = null; + } + + /** + * Gets the used compression encoding. + * + * @return int Encoding specified on construction time. + */ + public function getEncoding(): int + { + return $this->encoding; + } + + /** + * Gets the used compression options. + * + * @return array Options array passed on construction time. + */ + public function getOptions(): array + { + return $this->options; + } +} diff --git a/vendor/amphp/byte-stream/lib/functions.php b/vendor/amphp/byte-stream/lib/functions.php new file mode 100644 index 00000000..434aef32 --- /dev/null +++ b/vendor/amphp/byte-stream/lib/functions.php @@ -0,0 +1,188 @@ +read()) !== null) { + $written += \strlen($chunk); + $writePromise = $destination->write($chunk); + $chunk = null; // free memory + yield $writePromise; + } + + return $written; + }); +} + +/** + * @param \Amp\ByteStream\InputStream $source + * + * @return \Amp\Promise + */ +function buffer(InputStream $source): Promise +{ + return call(function () use ($source): \Generator { + $buffer = ""; + + while (($chunk = yield $source->read()) !== null) { + $buffer .= $chunk; + $chunk = null; // free memory + } + + return $buffer; + }); +} + +/** + * The php://input input buffer stream for the process associated with the currently active event loop. + * + * @return ResourceInputStream + */ +function getInputBufferStream(): ResourceInputStream +{ + static $key = InputStream::class . '\\input'; + + $stream = Loop::getState($key); + + if (!$stream) { + $stream = new ResourceInputStream(\fopen('php://input', 'rb')); + Loop::setState($key, $stream); + } + + return $stream; +} + +/** + * The php://output output buffer stream for the process associated with the currently active event loop. + * + * @return ResourceOutputStream + */ +function getOutputBufferStream(): ResourceOutputStream +{ + static $key = OutputStream::class . '\\output'; + + $stream = Loop::getState($key); + + if (!$stream) { + $stream = new ResourceOutputStream(\fopen('php://output', 'wb')); + Loop::setState($key, $stream); + } + + return $stream; +} + +/** + * The STDIN stream for the process associated with the currently active event loop. + * + * @return ResourceInputStream + */ +function getStdin(): ResourceInputStream +{ + static $key = InputStream::class . '\\stdin'; + + $stream = Loop::getState($key); + + if (!$stream) { + $stream = new ResourceInputStream(\STDIN); + Loop::setState($key, $stream); + } + + return $stream; +} + +/** + * The STDOUT stream for the process associated with the currently active event loop. + * + * @return ResourceOutputStream + */ +function getStdout(): ResourceOutputStream +{ + static $key = OutputStream::class . '\\stdout'; + + $stream = Loop::getState($key); + + if (!$stream) { + $stream = new ResourceOutputStream(\STDOUT); + Loop::setState($key, $stream); + } + + return $stream; +} + +/** + * The STDERR stream for the process associated with the currently active event loop. + * + * @return ResourceOutputStream + */ +function getStderr(): ResourceOutputStream +{ + static $key = OutputStream::class . '\\stderr'; + + $stream = Loop::getState($key); + + if (!$stream) { + $stream = new ResourceOutputStream(\STDERR); + Loop::setState($key, $stream); + } + + return $stream; +} + +function parseLineDelimitedJson(InputStream $stream, bool $assoc = false, int $depth = 512, int $options = 0): Iterator +{ + return new Producer(static function (callable $emit) use ($stream, $assoc, $depth, $options) { + $reader = new LineReader($stream); + + while (null !== $line = yield $reader->readLine()) { + $line = \trim($line); + + if ($line === '') { + continue; + } + + /** @noinspection PhpComposerExtensionStubsInspection */ + $data = \json_decode($line, $assoc, $depth, $options); + /** @noinspection PhpComposerExtensionStubsInspection */ + $error = \json_last_error(); + + /** @noinspection PhpComposerExtensionStubsInspection */ + if ($error !== \JSON_ERROR_NONE) { + /** @noinspection PhpComposerExtensionStubsInspection */ + throw new StreamException('Failed to parse JSON: ' . \json_last_error_msg(), $error); + } + + yield $emit($data); + } + }); +} diff --git a/vendor/amphp/byte-stream/psalm.xml b/vendor/amphp/byte-stream/psalm.xml new file mode 100644 index 00000000..9684f55d --- /dev/null +++ b/vendor/amphp/byte-stream/psalm.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/autoload.php b/vendor/autoload.php index fe174d45..f1c16ba1 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -2,6 +2,11 @@ // autoload.php @generated by Composer +if (PHP_VERSION_ID < 50600) { + echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + exit(1); +} + require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit2723bf3c902a907c44396c9253500aff::getLoader(); diff --git a/vendor/bin/php-cs-fixer b/vendor/bin/php-cs-fixer deleted file mode 120000 index 6241fa7f..00000000 --- a/vendor/bin/php-cs-fixer +++ /dev/null @@ -1 +0,0 @@ -../../vendor-bin/coding-standard/vendor/friendsofphp/php-cs-fixer/php-cs-fixer \ No newline at end of file diff --git a/vendor/bin/php-cs-fixer b/vendor/bin/php-cs-fixer new file mode 100755 index 00000000..b7445d40 --- /dev/null +++ b/vendor/bin/php-cs-fixer @@ -0,0 +1,120 @@ +#!/usr/bin/env php +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/friendsofphp/php-cs-fixer/php-cs-fixer'); + exit(0); + } +} + +include __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/friendsofphp/php-cs-fixer/php-cs-fixer'; diff --git a/vendor/bin/php-parse b/vendor/bin/php-parse new file mode 100755 index 00000000..1bd2c838 --- /dev/null +++ b/vendor/bin/php-parse @@ -0,0 +1,120 @@ +#!/usr/bin/env php +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + include("phpvfscomposer://" . __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse'); + exit(0); + } +} + +include __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse'; diff --git a/vendor/bin/psalm b/vendor/bin/psalm new file mode 100755 index 00000000..baac2024 --- /dev/null +++ b/vendor/bin/psalm @@ -0,0 +1,120 @@ +#!/usr/bin/env php +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + include("phpvfscomposer://" . __DIR__ . '/..'.'/vimeo/psalm/psalm'); + exit(0); + } +} + +include __DIR__ . '/..'.'/vimeo/psalm/psalm'; diff --git a/vendor/bin/psalm-language-server b/vendor/bin/psalm-language-server new file mode 100755 index 00000000..552f19b2 --- /dev/null +++ b/vendor/bin/psalm-language-server @@ -0,0 +1,120 @@ +#!/usr/bin/env php +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + include("phpvfscomposer://" . __DIR__ . '/..'.'/vimeo/psalm/psalm-language-server'); + exit(0); + } +} + +include __DIR__ . '/..'.'/vimeo/psalm/psalm-language-server'; diff --git a/vendor/bin/psalm-plugin b/vendor/bin/psalm-plugin new file mode 100755 index 00000000..a1db9f67 --- /dev/null +++ b/vendor/bin/psalm-plugin @@ -0,0 +1,120 @@ +#!/usr/bin/env php +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + include("phpvfscomposer://" . __DIR__ . '/..'.'/vimeo/psalm/psalm-plugin'); + exit(0); + } +} + +include __DIR__ . '/..'.'/vimeo/psalm/psalm-plugin'; diff --git a/vendor/bin/psalm-refactor b/vendor/bin/psalm-refactor new file mode 100755 index 00000000..2376e6cf --- /dev/null +++ b/vendor/bin/psalm-refactor @@ -0,0 +1,120 @@ +#!/usr/bin/env php +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + include("phpvfscomposer://" . __DIR__ . '/..'.'/vimeo/psalm/psalm-refactor'); + exit(0); + } +} + +include __DIR__ . '/..'.'/vimeo/psalm/psalm-refactor'; diff --git a/vendor/bin/psalter b/vendor/bin/psalter new file mode 100755 index 00000000..c1ad8e78 --- /dev/null +++ b/vendor/bin/psalter @@ -0,0 +1,120 @@ +#!/usr/bin/env php +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + include("phpvfscomposer://" . __DIR__ . '/..'.'/vimeo/psalm/psalter'); + exit(0); + } +} + +include __DIR__ . '/..'.'/vimeo/psalm/psalter'; diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php index 03b9bb9c..afef3fa2 100644 --- a/vendor/composer/ClassLoader.php +++ b/vendor/composer/ClassLoader.php @@ -37,26 +37,80 @@ * * @author Fabien Potencier * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { + /** @var ?string */ + private $vendorDir; + // PSR-4 + /** + * @var array[] + * @psalm-var array> + */ private $prefixLengthsPsr4 = array(); + /** + * @var array[] + * @psalm-var array> + */ private $prefixDirsPsr4 = array(); + /** + * @var array[] + * @psalm-var array + */ private $fallbackDirsPsr4 = array(); // PSR-0 + /** + * @var array[] + * @psalm-var array> + */ private $prefixesPsr0 = array(); + /** + * @var array[] + * @psalm-var array + */ private $fallbackDirsPsr0 = array(); + /** @var bool */ private $useIncludePath = false; + + /** + * @var string[] + * @psalm-var array + */ private $classMap = array(); + + /** @var bool */ private $classMapAuthoritative = false; + + /** + * @var bool[] + * @psalm-var array + */ private $missingClasses = array(); + + /** @var ?string */ private $apcuPrefix; + /** + * @var self[] + */ + private static $registeredLoaders = array(); + + /** + * @param ?string $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + } + + /** + * @return string[] + */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { @@ -66,28 +120,47 @@ public function getPrefixes() return array(); } + /** + * @return array[] + * @psalm-return array> + */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } + /** + * @return array[] + * @psalm-return array + */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } + /** + * @return array[] + * @psalm-return array + */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } + /** + * @return string[] Array of classname => path + * @psalm-return array + */ public function getClassMap() { return $this->classMap; } /** - * @param array $classMap Class to filename map + * @param string[] $classMap Class to filename map + * @psalm-param array $classMap + * + * @return void */ public function addClassMap(array $classMap) { @@ -102,9 +175,11 @@ public function addClassMap(array $classMap) * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void */ public function add($prefix, $paths, $prepend = false) { @@ -147,11 +222,13 @@ public function add($prefix, $paths, $prepend = false) * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException + * + * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { @@ -195,8 +272,10 @@ public function addPsr4($prefix, $paths, $prepend = false) * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 base directories + * + * @return void */ public function set($prefix, $paths) { @@ -211,10 +290,12 @@ public function set($prefix, $paths) * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException + * + * @return void */ public function setPsr4($prefix, $paths) { @@ -234,6 +315,8 @@ public function setPsr4($prefix, $paths) * Turns on searching the include path for class files. * * @param bool $useIncludePath + * + * @return void */ public function setUseIncludePath($useIncludePath) { @@ -256,6 +339,8 @@ public function getUseIncludePath() * that have not been registered with the class map. * * @param bool $classMapAuthoritative + * + * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { @@ -276,6 +361,8 @@ public function isClassMapAuthoritative() * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix + * + * @return void */ public function setApcuPrefix($apcuPrefix) { @@ -296,25 +383,44 @@ public function getApcuPrefix() * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } } /** * Unregisters this instance as an autoloader. + * + * @return void */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } } /** * Loads the given class or interface. * * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise + * @return true|null True if loaded, null otherwise */ public function loadClass($class) { @@ -323,6 +429,8 @@ public function loadClass($class) return true; } + + return null; } /** @@ -367,6 +475,21 @@ public function findFile($class) return $file; } + /** + * Returns the currently registered loaders indexed by their corresponding vendor directories. + * + * @return self[] + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup @@ -438,6 +561,10 @@ private function findFileWithExtension($class, $ext) * Scope isolated include. * * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + * @private */ function includeFile($file) { diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php index b3a4e161..c6b54af7 100644 --- a/vendor/composer/InstalledVersions.php +++ b/vendor/composer/InstalledVersions.php @@ -20,12 +20,27 @@ * * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * - * To require it's presence, you can require `composer-runtime-api ^2.0` + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final */ class InstalledVersions { + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ private static $installed; + + /** + * @var bool|null + */ private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ private static $installedByVendor = array(); /** @@ -228,7 +243,7 @@ public static function getInstallPath($packageName) /** * @return array - * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string} + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} */ public static function getRootPackage() { @@ -242,7 +257,7 @@ public static function getRootPackage() * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] - * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array} + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} */ public static function getRawData() { @@ -265,7 +280,7 @@ public static function getRawData() * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] - * @psalm-return list}> + * @psalm-return list}> */ public static function getAllRawData() { @@ -288,7 +303,7 @@ public static function getAllRawData() * @param array[] $data A vendor/composer/installed.php data set * @return void * - * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array} $data + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data */ public static function reload($data) { @@ -298,7 +313,7 @@ public static function reload($data) /** * @return array[] - * @psalm-return list}> + * @psalm-return list}> */ private static function getInstalled() { diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 799bc34e..77b4c1f3 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -2,26 +2,1612 @@ // autoload_classmap.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( + 'AdvancedJsonRpc\\Dispatcher' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Dispatcher.php', + 'AdvancedJsonRpc\\Error' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Error.php', + 'AdvancedJsonRpc\\ErrorCode' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/ErrorCode.php', + 'AdvancedJsonRpc\\ErrorResponse' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/ErrorResponse.php', + 'AdvancedJsonRpc\\Message' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Message.php', + 'AdvancedJsonRpc\\Notification' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Notification.php', + 'AdvancedJsonRpc\\Request' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Request.php', + 'AdvancedJsonRpc\\Response' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Response.php', + 'AdvancedJsonRpc\\SuccessResponse' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php', + 'Amp\\ByteStream\\Base64\\Base64DecodingInputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php', + 'Amp\\ByteStream\\Base64\\Base64DecodingOutputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php', + 'Amp\\ByteStream\\Base64\\Base64EncodingInputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php', + 'Amp\\ByteStream\\Base64\\Base64EncodingOutputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php', + 'Amp\\ByteStream\\ClosedException' => $vendorDir . '/amphp/byte-stream/lib/ClosedException.php', + 'Amp\\ByteStream\\InMemoryStream' => $vendorDir . '/amphp/byte-stream/lib/InMemoryStream.php', + 'Amp\\ByteStream\\InputStream' => $vendorDir . '/amphp/byte-stream/lib/InputStream.php', + 'Amp\\ByteStream\\InputStreamChain' => $vendorDir . '/amphp/byte-stream/lib/InputStreamChain.php', + 'Amp\\ByteStream\\IteratorStream' => $vendorDir . '/amphp/byte-stream/lib/IteratorStream.php', + 'Amp\\ByteStream\\LineReader' => $vendorDir . '/amphp/byte-stream/lib/LineReader.php', + 'Amp\\ByteStream\\Message' => $vendorDir . '/amphp/byte-stream/lib/Message.php', + 'Amp\\ByteStream\\OutputBuffer' => $vendorDir . '/amphp/byte-stream/lib/OutputBuffer.php', + 'Amp\\ByteStream\\OutputStream' => $vendorDir . '/amphp/byte-stream/lib/OutputStream.php', + 'Amp\\ByteStream\\Payload' => $vendorDir . '/amphp/byte-stream/lib/Payload.php', + 'Amp\\ByteStream\\PendingReadError' => $vendorDir . '/amphp/byte-stream/lib/PendingReadError.php', + 'Amp\\ByteStream\\ResourceInputStream' => $vendorDir . '/amphp/byte-stream/lib/ResourceInputStream.php', + 'Amp\\ByteStream\\ResourceOutputStream' => $vendorDir . '/amphp/byte-stream/lib/ResourceOutputStream.php', + 'Amp\\ByteStream\\StreamException' => $vendorDir . '/amphp/byte-stream/lib/StreamException.php', + 'Amp\\ByteStream\\ZlibInputStream' => $vendorDir . '/amphp/byte-stream/lib/ZlibInputStream.php', + 'Amp\\ByteStream\\ZlibOutputStream' => $vendorDir . '/amphp/byte-stream/lib/ZlibOutputStream.php', + 'Amp\\CallableMaker' => $vendorDir . '/amphp/amp/lib/CallableMaker.php', + 'Amp\\CancellationToken' => $vendorDir . '/amphp/amp/lib/CancellationToken.php', + 'Amp\\CancellationTokenSource' => $vendorDir . '/amphp/amp/lib/CancellationTokenSource.php', + 'Amp\\CancelledException' => $vendorDir . '/amphp/amp/lib/CancelledException.php', + 'Amp\\CombinedCancellationToken' => $vendorDir . '/amphp/amp/lib/CombinedCancellationToken.php', + 'Amp\\Coroutine' => $vendorDir . '/amphp/amp/lib/Coroutine.php', + 'Amp\\Deferred' => $vendorDir . '/amphp/amp/lib/Deferred.php', + 'Amp\\Delayed' => $vendorDir . '/amphp/amp/lib/Delayed.php', + 'Amp\\Emitter' => $vendorDir . '/amphp/amp/lib/Emitter.php', + 'Amp\\Failure' => $vendorDir . '/amphp/amp/lib/Failure.php', + 'Amp\\Internal\\Placeholder' => $vendorDir . '/amphp/amp/lib/Internal/Placeholder.php', + 'Amp\\Internal\\PrivateIterator' => $vendorDir . '/amphp/amp/lib/Internal/PrivateIterator.php', + 'Amp\\Internal\\PrivatePromise' => $vendorDir . '/amphp/amp/lib/Internal/PrivatePromise.php', + 'Amp\\Internal\\Producer' => $vendorDir . '/amphp/amp/lib/Internal/Producer.php', + 'Amp\\Internal\\ResolutionQueue' => $vendorDir . '/amphp/amp/lib/Internal/ResolutionQueue.php', + 'Amp\\InvalidYieldError' => $vendorDir . '/amphp/amp/lib/InvalidYieldError.php', + 'Amp\\Iterator' => $vendorDir . '/amphp/amp/lib/Iterator.php', + 'Amp\\LazyPromise' => $vendorDir . '/amphp/amp/lib/LazyPromise.php', + 'Amp\\Loop' => $vendorDir . '/amphp/amp/lib/Loop.php', + 'Amp\\Loop\\Driver' => $vendorDir . '/amphp/amp/lib/Loop/Driver.php', + 'Amp\\Loop\\DriverFactory' => $vendorDir . '/amphp/amp/lib/Loop/DriverFactory.php', + 'Amp\\Loop\\EvDriver' => $vendorDir . '/amphp/amp/lib/Loop/EvDriver.php', + 'Amp\\Loop\\EventDriver' => $vendorDir . '/amphp/amp/lib/Loop/EventDriver.php', + 'Amp\\Loop\\Internal\\TimerQueue' => $vendorDir . '/amphp/amp/lib/Loop/Internal/TimerQueue.php', + 'Amp\\Loop\\InvalidWatcherError' => $vendorDir . '/amphp/amp/lib/Loop/InvalidWatcherError.php', + 'Amp\\Loop\\NativeDriver' => $vendorDir . '/amphp/amp/lib/Loop/NativeDriver.php', + 'Amp\\Loop\\TracingDriver' => $vendorDir . '/amphp/amp/lib/Loop/TracingDriver.php', + 'Amp\\Loop\\UnsupportedFeatureException' => $vendorDir . '/amphp/amp/lib/Loop/UnsupportedFeatureException.php', + 'Amp\\Loop\\UvDriver' => $vendorDir . '/amphp/amp/lib/Loop/UvDriver.php', + 'Amp\\Loop\\Watcher' => $vendorDir . '/amphp/amp/lib/Loop/Watcher.php', + 'Amp\\MultiReasonException' => $vendorDir . '/amphp/amp/lib/MultiReasonException.php', + 'Amp\\NullCancellationToken' => $vendorDir . '/amphp/amp/lib/NullCancellationToken.php', + 'Amp\\Producer' => $vendorDir . '/amphp/amp/lib/Producer.php', + 'Amp\\Promise' => $vendorDir . '/amphp/amp/lib/Promise.php', + 'Amp\\Struct' => $vendorDir . '/amphp/amp/lib/Struct.php', + 'Amp\\Success' => $vendorDir . '/amphp/amp/lib/Success.php', + 'Amp\\TimeoutCancellationToken' => $vendorDir . '/amphp/amp/lib/TimeoutCancellationToken.php', + 'Amp\\TimeoutException' => $vendorDir . '/amphp/amp/lib/TimeoutException.php', 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Bamarni\\Composer\\Bin\\BinCommand' => $vendorDir . '/bamarni/composer-bin-plugin/src/BinCommand.php', 'Bamarni\\Composer\\Bin\\CommandProvider' => $vendorDir . '/bamarni/composer-bin-plugin/src/CommandProvider.php', 'Bamarni\\Composer\\Bin\\Config' => $vendorDir . '/bamarni/composer-bin-plugin/src/Config.php', 'Bamarni\\Composer\\Bin\\Plugin' => $vendorDir . '/bamarni/composer-bin-plugin/src/Plugin.php', + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'Composer\\Pcre\\MatchAllResult' => $vendorDir . '/composer/pcre/src/MatchAllResult.php', + 'Composer\\Pcre\\MatchAllWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchAllWithOffsetsResult.php', + 'Composer\\Pcre\\MatchResult' => $vendorDir . '/composer/pcre/src/MatchResult.php', + 'Composer\\Pcre\\MatchWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchWithOffsetsResult.php', + 'Composer\\Pcre\\PcreException' => $vendorDir . '/composer/pcre/src/PcreException.php', + 'Composer\\Pcre\\Preg' => $vendorDir . '/composer/pcre/src/Preg.php', + 'Composer\\Pcre\\Regex' => $vendorDir . '/composer/pcre/src/Regex.php', + 'Composer\\Pcre\\ReplaceResult' => $vendorDir . '/composer/pcre/src/ReplaceResult.php', + 'Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php', + 'Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php', + 'Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php', + 'Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', + 'Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', + 'Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php', + 'Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php', + 'Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', + 'Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php', + 'Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php', + 'Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', + 'Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', + 'Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php', + 'Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php', + 'Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php', + 'Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php', 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', + 'JsonMapper' => $vendorDir . '/netresearch/jsonmapper/src/JsonMapper.php', + 'JsonMapper_Exception' => $vendorDir . '/netresearch/jsonmapper/src/JsonMapper/Exception.php', + 'LSS\\Array2XML' => $vendorDir . '/openlss/lib-array2xml/LSS/Array2XML.php', + 'LSS\\XML2Array' => $vendorDir . '/openlss/lib-array2xml/LSS/XML2Array.php', + 'LanguageServerProtocol\\CallHierarchyClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php', + 'LanguageServerProtocol\\ChangeAnnotation' => $vendorDir . '/felixfbecker/language-server-protocol/src/ChangeAnnotation.php', + 'LanguageServerProtocol\\ClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilities.php', + 'LanguageServerProtocol\\ClientCapabilitiesGeneral' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php', + 'LanguageServerProtocol\\ClientCapabilitiesWindow' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php', + 'LanguageServerProtocol\\ClientCapabilitiesWorkspace' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php', + 'LanguageServerProtocol\\ClientCapabilitiesWorkspaceFileOperations' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspaceFileOperations.php', + 'LanguageServerProtocol\\ClientInfo' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientInfo.php', + 'LanguageServerProtocol\\CodeAction' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeAction.php', + 'LanguageServerProtocol\\CodeActionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php', + 'LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php', + 'LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php', + 'LanguageServerProtocol\\CodeActionClientCapabilitiesResolveSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php', + 'LanguageServerProtocol\\CodeActionContext' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionContext.php', + 'LanguageServerProtocol\\CodeActionDisabled' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionDisabled.php', + 'LanguageServerProtocol\\CodeActionKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionKind.php', + 'LanguageServerProtocol\\CodeActionTriggerKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionTriggerKind.php', + 'LanguageServerProtocol\\CodeDescription' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeDescription.php', + 'LanguageServerProtocol\\CodeLens' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLens.php', + 'LanguageServerProtocol\\CodeLensClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php', + 'LanguageServerProtocol\\CodeLensOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLensOptions.php', + 'LanguageServerProtocol\\CodeLensWorkspaceClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php', + 'LanguageServerProtocol\\Command' => $vendorDir . '/felixfbecker/language-server-protocol/src/Command.php', + 'LanguageServerProtocol\\CompletionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php', + 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php', + 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemInsertTextModeSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php', + 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemResolveSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php', + 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php', + 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionList' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php', + 'LanguageServerProtocol\\CompletionContext' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionContext.php', + 'LanguageServerProtocol\\CompletionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItem.php', + 'LanguageServerProtocol\\CompletionItemKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItemKind.php', + 'LanguageServerProtocol\\CompletionItemLabelDetails' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItemLabelDetails.php', + 'LanguageServerProtocol\\CompletionItemTag' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItemTag.php', + 'LanguageServerProtocol\\CompletionList' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionList.php', + 'LanguageServerProtocol\\CompletionOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionOptions.php', + 'LanguageServerProtocol\\CompletionTriggerKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php', + 'LanguageServerProtocol\\ContentChangeEvent' => $vendorDir . '/felixfbecker/language-server-protocol/src/ContentChangeEvent.php', + 'LanguageServerProtocol\\DeclarationClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php', + 'LanguageServerProtocol\\DefinitionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php', + 'LanguageServerProtocol\\DependencyReference' => $vendorDir . '/felixfbecker/language-server-protocol/src/DependencyReference.php', + 'LanguageServerProtocol\\Diagnostic' => $vendorDir . '/felixfbecker/language-server-protocol/src/Diagnostic.php', + 'LanguageServerProtocol\\DiagnosticRelatedInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php', + 'LanguageServerProtocol\\DiagnosticSeverity' => $vendorDir . '/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php', + 'LanguageServerProtocol\\DiagnosticTag' => $vendorDir . '/felixfbecker/language-server-protocol/src/DiagnosticTag.php', + 'LanguageServerProtocol\\DidChangeConfigurationClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DidChangeConfigurationClientCapabilities.php', + 'LanguageServerProtocol\\DidChangeWatchedFilesClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php', + 'LanguageServerProtocol\\DocumentColorClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php', + 'LanguageServerProtocol\\DocumentFormattingClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php', + 'LanguageServerProtocol\\DocumentHighlight' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentHighlight.php', + 'LanguageServerProtocol\\DocumentHighlightClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php', + 'LanguageServerProtocol\\DocumentHighlightKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php', + 'LanguageServerProtocol\\DocumentLinkClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentLinkClientCapabilities.php', + 'LanguageServerProtocol\\DocumentOnTypeFormattingClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php', + 'LanguageServerProtocol\\DocumentOnTypeFormattingOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php', + 'LanguageServerProtocol\\DocumentRangeFormattingClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php', + 'LanguageServerProtocol\\DocumentSymbolClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php', + 'LanguageServerProtocol\\DocumentSymbolClientCapabilitiesSymbolKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php', + 'LanguageServerProtocol\\DocumentSymbolClientCapabilitiesTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php', + 'LanguageServerProtocol\\ErrorCode' => $vendorDir . '/felixfbecker/language-server-protocol/src/ErrorCode.php', + 'LanguageServerProtocol\\ExecuteCommandClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ExecuteCommandClientCapabilities.php', + 'LanguageServerProtocol\\ExecuteCommandOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php', + 'LanguageServerProtocol\\FailureHandlingKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/FailureHandlingKind.php', + 'LanguageServerProtocol\\FileChangeType' => $vendorDir . '/felixfbecker/language-server-protocol/src/FileChangeType.php', + 'LanguageServerProtocol\\FileEvent' => $vendorDir . '/felixfbecker/language-server-protocol/src/FileEvent.php', + 'LanguageServerProtocol\\FoldingRangeClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php', + 'LanguageServerProtocol\\FormattingOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/FormattingOptions.php', + 'LanguageServerProtocol\\Hover' => $vendorDir . '/felixfbecker/language-server-protocol/src/Hover.php', + 'LanguageServerProtocol\\HoverClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php', + 'LanguageServerProtocol\\ImplementationClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php', + 'LanguageServerProtocol\\InitializeResult' => $vendorDir . '/felixfbecker/language-server-protocol/src/InitializeResult.php', + 'LanguageServerProtocol\\InitializeResultServerInfo' => $vendorDir . '/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php', + 'LanguageServerProtocol\\InsertTextFormat' => $vendorDir . '/felixfbecker/language-server-protocol/src/InsertTextFormat.php', + 'LanguageServerProtocol\\InsertTextMode' => $vendorDir . '/felixfbecker/language-server-protocol/src/InsertTextMode.php', + 'LanguageServerProtocol\\LinkedEditingRangeClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php', + 'LanguageServerProtocol\\Location' => $vendorDir . '/felixfbecker/language-server-protocol/src/Location.php', + 'LanguageServerProtocol\\LogMessage' => $vendorDir . '/felixfbecker/language-server-protocol/src/LogMessage.php', + 'LanguageServerProtocol\\LogTrace' => $vendorDir . '/felixfbecker/language-server-protocol/src/LogTrace.php', + 'LanguageServerProtocol\\MarkdownClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php', + 'LanguageServerProtocol\\MarkedString' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkedString.php', + 'LanguageServerProtocol\\MarkupContent' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkupContent.php', + 'LanguageServerProtocol\\MarkupKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkupKind.php', + 'LanguageServerProtocol\\MessageActionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/MessageActionItem.php', + 'LanguageServerProtocol\\MessageType' => $vendorDir . '/felixfbecker/language-server-protocol/src/MessageType.php', + 'LanguageServerProtocol\\MonikerClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/MonikerClientCapabilities.php', + 'LanguageServerProtocol\\PackageDescriptor' => $vendorDir . '/felixfbecker/language-server-protocol/src/PackageDescriptor.php', + 'LanguageServerProtocol\\ParameterInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/ParameterInformation.php', + 'LanguageServerProtocol\\Position' => $vendorDir . '/felixfbecker/language-server-protocol/src/Position.php', + 'LanguageServerProtocol\\PrepareSupportDefaultBehavior' => $vendorDir . '/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php', + 'LanguageServerProtocol\\PublishDiagnosticsClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilities.php', + 'LanguageServerProtocol\\PublishDiagnosticsClientCapabilitiesTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php', + 'LanguageServerProtocol\\Range' => $vendorDir . '/felixfbecker/language-server-protocol/src/Range.php', + 'LanguageServerProtocol\\ReferenceClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php', + 'LanguageServerProtocol\\ReferenceContext' => $vendorDir . '/felixfbecker/language-server-protocol/src/ReferenceContext.php', + 'LanguageServerProtocol\\ReferenceInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/ReferenceInformation.php', + 'LanguageServerProtocol\\RegularExpressionsClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php', + 'LanguageServerProtocol\\RenameClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php', + 'LanguageServerProtocol\\ResourceOperationKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/ResourceOperationKind.php', + 'LanguageServerProtocol\\SaveOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/SaveOptions.php', + 'LanguageServerProtocol\\SelectionRangeClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SelectionRangeClientCapabilities.php', + 'LanguageServerProtocol\\SemanticTokensClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php', + 'LanguageServerProtocol\\SemanticTokensClientCapabilitiesRequests' => $vendorDir . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php', + 'LanguageServerProtocol\\SemanticTokensWorkspaceClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php', + 'LanguageServerProtocol\\ServerCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ServerCapabilities.php', + 'LanguageServerProtocol\\ShowDocumentClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ShowDocumentClientCapabilities.php', + 'LanguageServerProtocol\\ShowMessageRequestClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php', + 'LanguageServerProtocol\\ShowMessageRequestClientCapabilitiesMessageActionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php', + 'LanguageServerProtocol\\SignatureHelp' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelp.php', + 'LanguageServerProtocol\\SignatureHelpClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php', + 'LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php', + 'LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformationParameterInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php', + 'LanguageServerProtocol\\SignatureHelpOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php', + 'LanguageServerProtocol\\SignatureInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureInformation.php', + 'LanguageServerProtocol\\SymbolDescriptor' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolDescriptor.php', + 'LanguageServerProtocol\\SymbolInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolInformation.php', + 'LanguageServerProtocol\\SymbolKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolKind.php', + 'LanguageServerProtocol\\SymbolLocationInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolLocationInformation.php', + 'LanguageServerProtocol\\SymbolTag' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolTag.php', + 'LanguageServerProtocol\\TextDocumentClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentClientCapabilities.php', + 'LanguageServerProtocol\\TextDocumentContentChangeEvent' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php', + 'LanguageServerProtocol\\TextDocumentIdentifier' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php', + 'LanguageServerProtocol\\TextDocumentItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentItem.php', + 'LanguageServerProtocol\\TextDocumentSyncClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php', + 'LanguageServerProtocol\\TextDocumentSyncKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php', + 'LanguageServerProtocol\\TextDocumentSyncOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentSyncOptions.php', + 'LanguageServerProtocol\\TextEdit' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextEdit.php', + 'LanguageServerProtocol\\TokenFormat' => $vendorDir . '/felixfbecker/language-server-protocol/src/TokenFormat.php', + 'LanguageServerProtocol\\TypeDefinitionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/TypeDefinitionClientCapabilities.php', + 'LanguageServerProtocol\\VersionedTextDocumentIdentifier' => $vendorDir . '/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php', + 'LanguageServerProtocol\\WorkspaceEdit' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceEdit.php', + 'LanguageServerProtocol\\WorkspaceEditClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php', + 'LanguageServerProtocol\\WorkspaceEditClientCapabilitiesChangeAnnotationSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php', + 'LanguageServerProtocol\\WorkspaceFolder' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceFolder.php', + 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php', + 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesResolveSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php', + 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesSymbolKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php', + 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php', 'NC\\Updater\\CommandApplication' => $baseDir . '/lib/CommandApplication.php', 'NC\\Updater\\LogException' => $baseDir . '/lib/LogException.php', 'NC\\Updater\\RecursiveDirectoryIteratorWithoutData' => $baseDir . '/lib/RecursiveDirectoryIteratorWithoutData.php', 'NC\\Updater\\UpdateCommand' => $baseDir . '/lib/UpdateCommand.php', 'NC\\Updater\\UpdateException' => $baseDir . '/lib/UpdateException.php', 'NC\\Updater\\Updater' => $baseDir . '/lib/Updater.php', + 'PackageVersions\\FallbackVersions' => $vendorDir . '/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php', + 'PackageVersions\\Installer' => $vendorDir . '/composer/package-versions-deprecated/src/PackageVersions/Installer.php', + 'PackageVersions\\Versions' => $vendorDir . '/composer/package-versions-deprecated/src/PackageVersions/Versions.php', + 'PhpParser\\Builder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder.php', + 'PhpParser\\BuilderFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', + 'PhpParser\\BuilderHelpers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', + 'PhpParser\\Builder\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php', + 'PhpParser\\Builder\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', + 'PhpParser\\Builder\\Declaration' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', + 'PhpParser\\Builder\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php', + 'PhpParser\\Builder\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php', + 'PhpParser\\Builder\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', + 'PhpParser\\Builder\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', + 'PhpParser\\Builder\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', + 'PhpParser\\Builder\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', + 'PhpParser\\Builder\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', + 'PhpParser\\Builder\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', + 'PhpParser\\Builder\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', + 'PhpParser\\Builder\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', + 'PhpParser\\Builder\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', + 'PhpParser\\Builder\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', + 'PhpParser\\Builder\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', + 'PhpParser\\Comment' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment.php', + 'PhpParser\\Comment\\Doc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', + 'PhpParser\\ConstExprEvaluationException' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', + 'PhpParser\\ConstExprEvaluator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', + 'PhpParser\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Error.php', + 'PhpParser\\ErrorHandler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', + 'PhpParser\\ErrorHandler\\Collecting' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', + 'PhpParser\\ErrorHandler\\Throwing' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', + 'PhpParser\\Internal\\DiffElem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', + 'PhpParser\\Internal\\Differ' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', + 'PhpParser\\Internal\\PrintableNewAnonClassNode' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', + 'PhpParser\\Internal\\TokenStream' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', + 'PhpParser\\JsonDecoder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', + 'PhpParser\\Lexer' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer.php', + 'PhpParser\\Lexer\\Emulative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', + 'PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', + 'PhpParser\\NameContext' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NameContext.php', + 'PhpParser\\Node' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node.php', + 'PhpParser\\NodeAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', + 'PhpParser\\NodeDumper' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', + 'PhpParser\\NodeFinder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', + 'PhpParser\\NodeTraverser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', + 'PhpParser\\NodeTraverserInterface' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', + 'PhpParser\\NodeVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', + 'PhpParser\\NodeVisitorAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', + 'PhpParser\\NodeVisitor\\CloningVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', + 'PhpParser\\NodeVisitor\\FindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', + 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', + 'PhpParser\\NodeVisitor\\NameResolver' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', + 'PhpParser\\NodeVisitor\\NodeConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', + 'PhpParser\\NodeVisitor\\ParentConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', + 'PhpParser\\Node\\Arg' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', + 'PhpParser\\Node\\Attribute' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', + 'PhpParser\\Node\\AttributeGroup' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', + 'PhpParser\\Node\\ComplexType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', + 'PhpParser\\Node\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', + 'PhpParser\\Node\\Expr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', + 'PhpParser\\Node\\Expr\\ArrayDimFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', + 'PhpParser\\Node\\Expr\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', + 'PhpParser\\Node\\Expr\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', + 'PhpParser\\Node\\Expr\\ArrowFunction' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', + 'PhpParser\\Node\\Expr\\Assign' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', + 'PhpParser\\Node\\Expr\\AssignOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', + 'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', + 'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', + 'PhpParser\\Node\\Expr\\AssignRef' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', + 'PhpParser\\Node\\Expr\\BinaryOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', + 'PhpParser\\Node\\Expr\\BitwiseNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', + 'PhpParser\\Node\\Expr\\BooleanNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', + 'PhpParser\\Node\\Expr\\CallLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php', + 'PhpParser\\Node\\Expr\\Cast' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', + 'PhpParser\\Node\\Expr\\Cast\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', + 'PhpParser\\Node\\Expr\\Cast\\Bool_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', + 'PhpParser\\Node\\Expr\\Cast\\Double' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', + 'PhpParser\\Node\\Expr\\Cast\\Int_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', + 'PhpParser\\Node\\Expr\\Cast\\Object_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', + 'PhpParser\\Node\\Expr\\Cast\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', + 'PhpParser\\Node\\Expr\\Cast\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', + 'PhpParser\\Node\\Expr\\ClassConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', + 'PhpParser\\Node\\Expr\\Clone_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', + 'PhpParser\\Node\\Expr\\Closure' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', + 'PhpParser\\Node\\Expr\\ClosureUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', + 'PhpParser\\Node\\Expr\\ConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', + 'PhpParser\\Node\\Expr\\Empty_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', + 'PhpParser\\Node\\Expr\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', + 'PhpParser\\Node\\Expr\\ErrorSuppress' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', + 'PhpParser\\Node\\Expr\\Eval_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', + 'PhpParser\\Node\\Expr\\Exit_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', + 'PhpParser\\Node\\Expr\\FuncCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', + 'PhpParser\\Node\\Expr\\Include_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', + 'PhpParser\\Node\\Expr\\Instanceof_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', + 'PhpParser\\Node\\Expr\\Isset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', + 'PhpParser\\Node\\Expr\\List_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', + 'PhpParser\\Node\\Expr\\Match_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php', + 'PhpParser\\Node\\Expr\\MethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', + 'PhpParser\\Node\\Expr\\New_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', + 'PhpParser\\Node\\Expr\\NullsafeMethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php', + 'PhpParser\\Node\\Expr\\NullsafePropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php', + 'PhpParser\\Node\\Expr\\PostDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', + 'PhpParser\\Node\\Expr\\PostInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', + 'PhpParser\\Node\\Expr\\PreDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', + 'PhpParser\\Node\\Expr\\PreInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', + 'PhpParser\\Node\\Expr\\Print_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', + 'PhpParser\\Node\\Expr\\PropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', + 'PhpParser\\Node\\Expr\\ShellExec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', + 'PhpParser\\Node\\Expr\\StaticCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', + 'PhpParser\\Node\\Expr\\StaticPropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', + 'PhpParser\\Node\\Expr\\Ternary' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', + 'PhpParser\\Node\\Expr\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php', + 'PhpParser\\Node\\Expr\\UnaryMinus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', + 'PhpParser\\Node\\Expr\\UnaryPlus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', + 'PhpParser\\Node\\Expr\\Variable' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', + 'PhpParser\\Node\\Expr\\YieldFrom' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', + 'PhpParser\\Node\\Expr\\Yield_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', + 'PhpParser\\Node\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', + 'PhpParser\\Node\\Identifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', + 'PhpParser\\Node\\IntersectionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', + 'PhpParser\\Node\\MatchArm' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', + 'PhpParser\\Node\\Name' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name.php', + 'PhpParser\\Node\\Name\\FullyQualified' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', + 'PhpParser\\Node\\Name\\Relative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', + 'PhpParser\\Node\\NullableType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', + 'PhpParser\\Node\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Param.php', + 'PhpParser\\Node\\Scalar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', + 'PhpParser\\Node\\Scalar\\DNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', + 'PhpParser\\Node\\Scalar\\Encapsed' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', + 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', + 'PhpParser\\Node\\Scalar\\LNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', + 'PhpParser\\Node\\Scalar\\MagicConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\File' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', + 'PhpParser\\Node\\Scalar\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', + 'PhpParser\\Node\\Stmt' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', + 'PhpParser\\Node\\Stmt\\Break_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', + 'PhpParser\\Node\\Stmt\\Case_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', + 'PhpParser\\Node\\Stmt\\Catch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', + 'PhpParser\\Node\\Stmt\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', + 'PhpParser\\Node\\Stmt\\ClassLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', + 'PhpParser\\Node\\Stmt\\ClassMethod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', + 'PhpParser\\Node\\Stmt\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', + 'PhpParser\\Node\\Stmt\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', + 'PhpParser\\Node\\Stmt\\Continue_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', + 'PhpParser\\Node\\Stmt\\DeclareDeclare' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', + 'PhpParser\\Node\\Stmt\\Declare_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', + 'PhpParser\\Node\\Stmt\\Do_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', + 'PhpParser\\Node\\Stmt\\Echo_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', + 'PhpParser\\Node\\Stmt\\ElseIf_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', + 'PhpParser\\Node\\Stmt\\Else_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', + 'PhpParser\\Node\\Stmt\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php', + 'PhpParser\\Node\\Stmt\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php', + 'PhpParser\\Node\\Stmt\\Expression' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', + 'PhpParser\\Node\\Stmt\\Finally_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', + 'PhpParser\\Node\\Stmt\\For_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', + 'PhpParser\\Node\\Stmt\\Foreach_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', + 'PhpParser\\Node\\Stmt\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', + 'PhpParser\\Node\\Stmt\\Global_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', + 'PhpParser\\Node\\Stmt\\Goto_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', + 'PhpParser\\Node\\Stmt\\GroupUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', + 'PhpParser\\Node\\Stmt\\HaltCompiler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', + 'PhpParser\\Node\\Stmt\\If_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', + 'PhpParser\\Node\\Stmt\\InlineHTML' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', + 'PhpParser\\Node\\Stmt\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', + 'PhpParser\\Node\\Stmt\\Label' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', + 'PhpParser\\Node\\Stmt\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', + 'PhpParser\\Node\\Stmt\\Nop' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', + 'PhpParser\\Node\\Stmt\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', + 'PhpParser\\Node\\Stmt\\PropertyProperty' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', + 'PhpParser\\Node\\Stmt\\Return_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', + 'PhpParser\\Node\\Stmt\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', + 'PhpParser\\Node\\Stmt\\Static_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', + 'PhpParser\\Node\\Stmt\\Switch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', + 'PhpParser\\Node\\Stmt\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', + 'PhpParser\\Node\\Stmt\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', + 'PhpParser\\Node\\Stmt\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', + 'PhpParser\\Node\\Stmt\\TryCatch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', + 'PhpParser\\Node\\Stmt\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', + 'PhpParser\\Node\\Stmt\\UseUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', + 'PhpParser\\Node\\Stmt\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', + 'PhpParser\\Node\\Stmt\\While_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', + 'PhpParser\\Node\\UnionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', + 'PhpParser\\Node\\VarLikeIdentifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', + 'PhpParser\\Node\\VariadicPlaceholder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', + 'PhpParser\\Parser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser.php', + 'PhpParser\\ParserAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', + 'PhpParser\\ParserFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', + 'PhpParser\\Parser\\Multiple' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', + 'PhpParser\\Parser\\Php5' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', + 'PhpParser\\Parser\\Php7' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', + 'PhpParser\\Parser\\Tokens' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', + 'PhpParser\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', + 'PhpParser\\PrettyPrinter\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'Psalm\\Aliases' => $vendorDir . '/vimeo/psalm/src/Psalm/Aliases.php', + 'Psalm\\CodeLocation' => $vendorDir . '/vimeo/psalm/src/Psalm/CodeLocation.php', + 'Psalm\\CodeLocation\\DocblockTypeLocation' => $vendorDir . '/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php', + 'Psalm\\CodeLocation\\ParseErrorLocation' => $vendorDir . '/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php', + 'Psalm\\CodeLocation\\Raw' => $vendorDir . '/vimeo/psalm/src/Psalm/CodeLocation/Raw.php', + 'Psalm\\Codebase' => $vendorDir . '/vimeo/psalm/src/Psalm/Codebase.php', + 'Psalm\\Config' => $vendorDir . '/vimeo/psalm/src/Psalm/Config.php', + 'Psalm\\Config\\Creator' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/Creator.php', + 'Psalm\\Config\\ErrorLevelFileFilter' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php', + 'Psalm\\Config\\FileFilter' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/FileFilter.php', + 'Psalm\\Config\\IssueHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/IssueHandler.php', + 'Psalm\\Config\\ProjectFileFilter' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php', + 'Psalm\\Config\\TaintAnalysisFileFilter' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php', + 'Psalm\\Context' => $vendorDir . '/vimeo/psalm/src/Psalm/Context.php', + 'Psalm\\DocComment' => $vendorDir . '/vimeo/psalm/src/Psalm/DocComment.php', + 'Psalm\\ErrorBaseline' => $vendorDir . '/vimeo/psalm/src/Psalm/ErrorBaseline.php', + 'Psalm\\Exception\\CircularReferenceException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php', + 'Psalm\\Exception\\CodeException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/CodeException.php', + 'Psalm\\Exception\\ComplicatedExpressionException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/ComplicatedExpressionException.php', + 'Psalm\\Exception\\ConfigCreationException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/ConfigCreationException.php', + 'Psalm\\Exception\\ConfigException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/ConfigException.php', + 'Psalm\\Exception\\ConfigNotFoundException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/ConfigNotFoundException.php', + 'Psalm\\Exception\\DocblockParseException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/DocblockParseException.php', + 'Psalm\\Exception\\FileIncludeException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/FileIncludeException.php', + 'Psalm\\Exception\\IncorrectDocblockException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/IncorrectDocblockException.php', + 'Psalm\\Exception\\InvalidClasslikeOverrideException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/InvalidClasslikeOverrideException.php', + 'Psalm\\Exception\\InvalidMethodOverrideException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/InvalidMethodOverrideException.php', + 'Psalm\\Exception\\RefactorException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/RefactorException.php', + 'Psalm\\Exception\\ScopeAnalysisException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/ScopeAnalysisException.php', + 'Psalm\\Exception\\TypeParseTreeException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/TypeParseTreeException.php', + 'Psalm\\Exception\\UnanalyzedFileException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/UnanalyzedFileException.php', + 'Psalm\\Exception\\UnpopulatedClasslikeException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/UnpopulatedClasslikeException.php', + 'Psalm\\Exception\\UnpreparedAnalysisException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/UnpreparedAnalysisException.php', + 'Psalm\\Exception\\UnsupportedIssueToFixException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/UnsupportedIssueToFixException.php', + 'Psalm\\FileBasedPluginAdapter' => $vendorDir . '/vimeo/psalm/src/Psalm/FileBasedPluginAdapter.php', + 'Psalm\\FileManipulation' => $vendorDir . '/vimeo/psalm/src/Psalm/FileManipulation.php', + 'Psalm\\FileSource' => $vendorDir . '/vimeo/psalm/src/Psalm/FileSource.php', + 'Psalm\\Internal\\Algebra' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Algebra.php', + 'Psalm\\Internal\\Algebra\\FormulaGenerator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php', + 'Psalm\\Internal\\Analyzer\\AlgebraAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\AttributesAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\CanAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php', + 'Psalm\\Internal\\Analyzer\\ClassAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\ClassLikeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\ClassLikeNameOptions' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php', + 'Psalm\\Internal\\Analyzer\\ClosureAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\CommentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\DataFlowNodeData' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php', + 'Psalm\\Internal\\Analyzer\\FileAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\FunctionAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\FunctionLikeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php', + 'Psalm\\Internal\\Analyzer\\InterfaceAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\IssueData' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php', + 'Psalm\\Internal\\Analyzer\\MethodAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\MethodComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php', + 'Psalm\\Internal\\Analyzer\\NamespaceAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\ProjectAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\ScopeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\SourceAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\StatementsAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\DoAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForeachAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfConditionalAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElseAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseIfAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\IfAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\LoopAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchCaseAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\TryAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\WhileAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\BreakAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\ContinueAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\EchoAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\ExpressionAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayCreationInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssertionFinder' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssignmentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\ArrayAssignmentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\AssignedProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\InstancePropertyAssignmentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\StaticPropertyAssignmentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOpAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\AndAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ArithmeticOpAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\CoalesceAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ConcatAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\NonComparisonOpAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\OrAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BitwiseNotAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BooleanNotAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentMapPopulator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentsAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArrayFunctionArgumentsAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ClassTemplateParamCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallReturnTypeFetcher' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\MethodCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicCallContext' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalysisResult' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\ExistingAtomicMethodCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallProhibitionAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallPurityAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallReturnTypeFetcher' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodVisibilityAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MissingMethodCallHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NamedFunctionCallHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NewAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\AtomicStaticCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\ExistingAtomicStaticCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CastAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CloneAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EmptyAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EncapsulatedStringAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EvalAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExitAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExpressionIdentifier' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ArrayFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\AtomicPropertyFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ClassConstFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ConstFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\InstancePropertyFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\StaticPropertyFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\VariableFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncDecExpressionAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncludeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\InstanceofAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IssetAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MagicConstAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MatchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\NullsafeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\PrintAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\SimpleTypeInferer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\TernaryAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\UnaryPlusMinusAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldFromAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\GlobalAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\ReturnAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\StaticAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\ThrowAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\UnsetAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\UnusedAssignmentRemover' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php', + 'Psalm\\Internal\\Analyzer\\TraitAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\TypeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php', + 'Psalm\\Internal\\Clause' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Clause.php', + 'Psalm\\Internal\\CliUtils' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/CliUtils.php', + 'Psalm\\Internal\\Cli\\LanguageServer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php', + 'Psalm\\Internal\\Cli\\Plugin' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php', + 'Psalm\\Internal\\Cli\\Psalm' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php', + 'Psalm\\Internal\\Cli\\Psalter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php', + 'Psalm\\Internal\\Cli\\Refactor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php', + 'Psalm\\Internal\\Codebase\\Analyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php', + 'Psalm\\Internal\\Codebase\\ClassConstantByWildcardResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php', + 'Psalm\\Internal\\Codebase\\ClassLikes' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php', + 'Psalm\\Internal\\Codebase\\ConstantTypeResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php', + 'Psalm\\Internal\\Codebase\\DataFlowGraph' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php', + 'Psalm\\Internal\\Codebase\\Functions' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php', + 'Psalm\\Internal\\Codebase\\InternalCallMapHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php', + 'Psalm\\Internal\\Codebase\\Methods' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php', + 'Psalm\\Internal\\Codebase\\Populator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php', + 'Psalm\\Internal\\Codebase\\Properties' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php', + 'Psalm\\Internal\\Codebase\\PropertyMap' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php', + 'Psalm\\Internal\\Codebase\\ReferenceMapGenerator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php', + 'Psalm\\Internal\\Codebase\\Reflection' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php', + 'Psalm\\Internal\\Codebase\\Scanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php', + 'Psalm\\Internal\\Codebase\\TaintFlowGraph' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php', + 'Psalm\\Internal\\Codebase\\VariableUseGraph' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php', + 'Psalm\\Internal\\Composer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Composer.php', + 'Psalm\\Internal\\DataFlow\\DataFlowNode' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/DataFlow/DataFlowNode.php', + 'Psalm\\Internal\\DataFlow\\Path' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php', + 'Psalm\\Internal\\DataFlow\\TaintSink' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php', + 'Psalm\\Internal\\DataFlow\\TaintSource' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSource.php', + 'Psalm\\Internal\\Diff\\AstDiffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/AstDiffer.php', + 'Psalm\\Internal\\Diff\\ClassStatementsDiffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php', + 'Psalm\\Internal\\Diff\\DiffElem' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php', + 'Psalm\\Internal\\Diff\\FileDiffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php', + 'Psalm\\Internal\\Diff\\FileStatementsDiffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php', + 'Psalm\\Internal\\Diff\\NamespaceStatementsDiffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php', + 'Psalm\\Internal\\ErrorHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php', + 'Psalm\\Internal\\EventDispatcher' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/EventDispatcher.php', + 'Psalm\\Internal\\ExecutionEnvironment\\BuildInfoCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php', + 'Psalm\\Internal\\ExecutionEnvironment\\GitInfoCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php', + 'Psalm\\Internal\\ExecutionEnvironment\\SystemCommandExecutor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php', + 'Psalm\\Internal\\FileManipulation\\ClassDocblockManipulator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php', + 'Psalm\\Internal\\FileManipulation\\CodeMigration' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php', + 'Psalm\\Internal\\FileManipulation\\FileManipulationBuffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php', + 'Psalm\\Internal\\FileManipulation\\FunctionDocblockManipulator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php', + 'Psalm\\Internal\\FileManipulation\\PropertyDocblockManipulator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php', + 'Psalm\\Internal\\Fork\\ForkMessage' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php', + 'Psalm\\Internal\\Fork\\ForkProcessDoneMessage' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php', + 'Psalm\\Internal\\Fork\\ForkProcessErrorMessage' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php', + 'Psalm\\Internal\\Fork\\ForkTaskDoneMessage' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php', + 'Psalm\\Internal\\Fork\\Pool' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php', + 'Psalm\\Internal\\Fork\\PsalmRestarter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php', + 'Psalm\\Internal\\IncludeCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php', + 'Psalm\\Internal\\Json\\Json' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Json/Json.php', + 'Psalm\\Internal\\LanguageServer\\ClientHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php', + 'Psalm\\Internal\\LanguageServer\\Client\\TextDocument' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Client/TextDocument.php', + 'Psalm\\Internal\\LanguageServer\\EmitterInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php', + 'Psalm\\Internal\\LanguageServer\\EmitterTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php', + 'Psalm\\Internal\\LanguageServer\\IdGenerator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php', + 'Psalm\\Internal\\LanguageServer\\LanguageClient' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php', + 'Psalm\\Internal\\LanguageServer\\LanguageServer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php', + 'Psalm\\Internal\\LanguageServer\\Message' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php', + 'Psalm\\Internal\\LanguageServer\\ProtocolReader' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php', + 'Psalm\\Internal\\LanguageServer\\ProtocolStreamReader' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php', + 'Psalm\\Internal\\LanguageServer\\ProtocolStreamWriter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php', + 'Psalm\\Internal\\LanguageServer\\ProtocolWriter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php', + 'Psalm\\Internal\\LanguageServer\\Server\\TextDocument' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/TextDocument.php', + 'Psalm\\Internal\\LanguageServer\\Server\\Workspace' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php', + 'Psalm\\Internal\\MethodIdentifier' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php', + 'Psalm\\Internal\\PhpTraverser\\CustomTraverser' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php', + 'Psalm\\Internal\\PhpVisitor\\AssignmentMapVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\CheckTrivialExprVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\CloningVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\ConditionCloningVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\NodeCleanerVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\NodeCounterVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\OffsetShifterVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\ParamReplacementVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\PartialParserVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\ReflectorVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\AttributeResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeDocblockParser' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeNodeScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockParser' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeNodeScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\TypeHintResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php', + 'Psalm\\Internal\\PhpVisitor\\ShortClosureVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\SimpleNameResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php', + 'Psalm\\Internal\\PhpVisitor\\TraitFinder' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php', + 'Psalm\\Internal\\PhpVisitor\\TypeMappingVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php', + 'Psalm\\Internal\\PluginManager\\Command\\DisableCommand' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php', + 'Psalm\\Internal\\PluginManager\\Command\\EnableCommand' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php', + 'Psalm\\Internal\\PluginManager\\Command\\ShowCommand' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php', + 'Psalm\\Internal\\PluginManager\\ComposerLock' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php', + 'Psalm\\Internal\\PluginManager\\ConfigFile' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php', + 'Psalm\\Internal\\PluginManager\\PluginList' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php', + 'Psalm\\Internal\\PluginManager\\PluginListFactory' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php', + 'Psalm\\Internal\\Provider\\AddRemoveTaints\\HtmlFunctionTainter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php', + 'Psalm\\Internal\\Provider\\ClassLikeStorageCacheProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php', + 'Psalm\\Internal\\Provider\\ClassLikeStorageProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php', + 'Psalm\\Internal\\Provider\\FakeFileProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php', + 'Psalm\\Internal\\Provider\\FileProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php', + 'Psalm\\Internal\\Provider\\FileReferenceCacheProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php', + 'Psalm\\Internal\\Provider\\FileReferenceProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php', + 'Psalm\\Internal\\Provider\\FileStorageCacheProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php', + 'Psalm\\Internal\\Provider\\FileStorageProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php', + 'Psalm\\Internal\\Provider\\FunctionExistenceProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php', + 'Psalm\\Internal\\Provider\\FunctionParamsProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php', + 'Psalm\\Internal\\Provider\\FunctionReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\MethodExistenceProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php', + 'Psalm\\Internal\\Provider\\MethodParamsProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php', + 'Psalm\\Internal\\Provider\\MethodReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\MethodVisibilityProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php', + 'Psalm\\Internal\\Provider\\NodeDataProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php', + 'Psalm\\Internal\\Provider\\ParserCacheProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php', + 'Psalm\\Internal\\Provider\\ProjectCacheProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php', + 'Psalm\\Internal\\Provider\\PropertyExistenceProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php', + 'Psalm\\Internal\\Provider\\PropertyTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php', + 'Psalm\\Internal\\Provider\\PropertyTypeProvider\\DomDocumentPropertyTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php', + 'Psalm\\Internal\\Provider\\PropertyVisibilityProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php', + 'Psalm\\Internal\\Provider\\Providers' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayChunkReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayColumnReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFillReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFilterReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMapReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMergeReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPadReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPointerAdjustmentReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPopReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayRandReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReduceReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReverseReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySliceReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySpliceReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayUniqueReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayValuesReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ClosureFromCallableReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\DomNodeAppendChild' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ExplodeReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FilterVarReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FirstArgStringReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetClassMethodsReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetObjectVarsReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\HexdecReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ImagickPixelColorReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\InArrayReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\IteratorToArrayReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MinMaxReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MktimeReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ParseUrlReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementSetFetchMode' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\RandReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\SimpleXmlElementAsXml' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrReplaceReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrTrReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\TriggerErrorReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\VersionCompareReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\StatementsProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php', + 'Psalm\\Internal\\Provider\\StatementsVolatileCache' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php', + 'Psalm\\Internal\\ReferenceConstraint' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php', + 'Psalm\\Internal\\RuntimeCaches' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php', + 'Psalm\\Internal\\Scanner\\ClassLikeDocblockComment' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php', + 'Psalm\\Internal\\Scanner\\DocblockParser' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php', + 'Psalm\\Internal\\Scanner\\FileScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php', + 'Psalm\\Internal\\Scanner\\FunctionDocblockComment' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php', + 'Psalm\\Internal\\Scanner\\ParsedDocblock' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php', + 'Psalm\\Internal\\Scanner\\PhpStormMetaScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstantComponent' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayOffsetFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArraySpread' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ClassConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\Constant' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\KeyValuePair' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ScalarValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedAdditionOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBinaryOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseAnd' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseOr' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseXor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedConcatOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedDivisionOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedMultiplicationOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedSubtractionOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedTernary' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php', + 'Psalm\\Internal\\Scanner\\VarDocblockComment' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/VarDocblockComment.php', + 'Psalm\\Internal\\Scope\\CaseScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php', + 'Psalm\\Internal\\Scope\\FinallyScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php', + 'Psalm\\Internal\\Scope\\IfConditionalScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php', + 'Psalm\\Internal\\Scope\\IfScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php', + 'Psalm\\Internal\\Scope\\LoopScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php', + 'Psalm\\Internal\\Scope\\SwitchScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php', + 'Psalm\\Internal\\Stubs\\Generator\\ClassLikeStubGenerator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php', + 'Psalm\\Internal\\Stubs\\Generator\\StubsGenerator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php', + 'Psalm\\Internal\\TypeVisitor\\ContainsClassLikeVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php', + 'Psalm\\Internal\\TypeVisitor\\ContainsLiteralVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php', + 'Psalm\\Internal\\TypeVisitor\\FromDocblockSetter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php', + 'Psalm\\Internal\\TypeVisitor\\TemplateTypeCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php', + 'Psalm\\Internal\\TypeVisitor\\TypeChecker' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php', + 'Psalm\\Internal\\TypeVisitor\\TypeScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php', + 'Psalm\\Internal\\Type\\ArrayType' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php', + 'Psalm\\Internal\\Type\\AssertionReconciler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php', + 'Psalm\\Internal\\Type\\Comparator\\ArrayTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\AtomicTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\CallableTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\ClassLikeStringComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\GenericTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\IntegerRangeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\KeyedArrayComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\ObjectComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\ScalarTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\TypeComparisonResult' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php', + 'Psalm\\Internal\\Type\\Comparator\\UnionTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php', + 'Psalm\\Internal\\Type\\NegatedAssertionReconciler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php', + 'Psalm\\Internal\\Type\\ParseTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php', + 'Psalm\\Internal\\Type\\ParseTreeCreator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php', + 'Psalm\\Internal\\Type\\ParseTree\\CallableParamTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\CallableTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\CallableWithReturnTypeTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\ConditionalTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\EncapsulationTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\GenericTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/GenericTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\IndexedAccessTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\IntersectionTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayPropertyTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\MethodParamTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\MethodTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\MethodWithReturnTypeTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\NullableTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/NullableTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\Root' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Root.php', + 'Psalm\\Internal\\Type\\ParseTree\\TemplateAsTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\TemplateIsTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\UnionTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\Value' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Value.php', + 'Psalm\\Internal\\Type\\SimpleAssertionReconciler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php', + 'Psalm\\Internal\\Type\\SimpleNegatedAssertionReconciler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php', + 'Psalm\\Internal\\Type\\TemplateBound' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php', + 'Psalm\\Internal\\Type\\TemplateInferredTypeReplacer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php', + 'Psalm\\Internal\\Type\\TemplateResult' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php', + 'Psalm\\Internal\\Type\\TemplateStandinTypeReplacer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php', + 'Psalm\\Internal\\Type\\TypeAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php', + 'Psalm\\Internal\\Type\\TypeAlias\\ClassTypeAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php', + 'Psalm\\Internal\\Type\\TypeAlias\\InlineTypeAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php', + 'Psalm\\Internal\\Type\\TypeAlias\\LinkableTypeAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php', + 'Psalm\\Internal\\Type\\TypeCombination' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php', + 'Psalm\\Internal\\Type\\TypeCombiner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php', + 'Psalm\\Internal\\Type\\TypeExpander' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php', + 'Psalm\\Internal\\Type\\TypeParser' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php', + 'Psalm\\Internal\\Type\\TypeTokenizer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php', + 'Psalm\\IssueBuffer' => $vendorDir . '/vimeo/psalm/src/Psalm/IssueBuffer.php', + 'Psalm\\Issue\\AbstractInstantiation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php', + 'Psalm\\Issue\\AbstractMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/AbstractMethodCall.php', + 'Psalm\\Issue\\ArgumentIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ArgumentIssue.php', + 'Psalm\\Issue\\ArgumentTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php', + 'Psalm\\Issue\\AssignmentToVoid' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/AssignmentToVoid.php', + 'Psalm\\Issue\\CircularReference' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/CircularReference.php', + 'Psalm\\Issue\\ClassIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ClassIssue.php', + 'Psalm\\Issue\\CodeIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/CodeIssue.php', + 'Psalm\\Issue\\ComplexFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php', + 'Psalm\\Issue\\ComplexMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ComplexMethod.php', + 'Psalm\\Issue\\ConfigIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ConfigIssue.php', + 'Psalm\\Issue\\ConflictingReferenceConstraint' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ConflictingReferenceConstraint.php', + 'Psalm\\Issue\\ConstructorSignatureMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ConstructorSignatureMismatch.php', + 'Psalm\\Issue\\ContinueOutsideLoop' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ContinueOutsideLoop.php', + 'Psalm\\Issue\\DeprecatedClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedClass.php', + 'Psalm\\Issue\\DeprecatedConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedConstant.php', + 'Psalm\\Issue\\DeprecatedFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedFunction.php', + 'Psalm\\Issue\\DeprecatedInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedInterface.php', + 'Psalm\\Issue\\DeprecatedMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedMethod.php', + 'Psalm\\Issue\\DeprecatedProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedProperty.php', + 'Psalm\\Issue\\DeprecatedTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedTrait.php', + 'Psalm\\Issue\\DocblockTypeContradiction' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DocblockTypeContradiction.php', + 'Psalm\\Issue\\DuplicateArrayKey' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php', + 'Psalm\\Issue\\DuplicateClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateClass.php', + 'Psalm\\Issue\\DuplicateConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateConstant.php', + 'Psalm\\Issue\\DuplicateEnumCase' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCase.php', + 'Psalm\\Issue\\DuplicateEnumCaseValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCaseValue.php', + 'Psalm\\Issue\\DuplicateFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateFunction.php', + 'Psalm\\Issue\\DuplicateMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateMethod.php', + 'Psalm\\Issue\\DuplicateParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateParam.php', + 'Psalm\\Issue\\EmptyArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/EmptyArrayAccess.php', + 'Psalm\\Issue\\ExtensionRequirementViolation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ExtensionRequirementViolation.php', + 'Psalm\\Issue\\FalsableReturnStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/FalsableReturnStatement.php', + 'Psalm\\Issue\\FalseOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/FalseOperand.php', + 'Psalm\\Issue\\ForbiddenCode' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ForbiddenCode.php', + 'Psalm\\Issue\\ForbiddenEcho' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ForbiddenEcho.php', + 'Psalm\\Issue\\FunctionIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/FunctionIssue.php', + 'Psalm\\Issue\\IfThisIsMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php', + 'Psalm\\Issue\\ImplementationRequirementViolation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImplementationRequirementViolation.php', + 'Psalm\\Issue\\ImplementedParamTypeMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImplementedParamTypeMismatch.php', + 'Psalm\\Issue\\ImplementedReturnTypeMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImplementedReturnTypeMismatch.php', + 'Psalm\\Issue\\ImplicitToStringCast' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImplicitToStringCast.php', + 'Psalm\\Issue\\ImpureByReferenceAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureByReferenceAssignment.php', + 'Psalm\\Issue\\ImpureFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureFunctionCall.php', + 'Psalm\\Issue\\ImpureMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureMethodCall.php', + 'Psalm\\Issue\\ImpurePropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpurePropertyAssignment.php', + 'Psalm\\Issue\\ImpurePropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpurePropertyFetch.php', + 'Psalm\\Issue\\ImpureStaticProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureStaticProperty.php', + 'Psalm\\Issue\\ImpureStaticVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureStaticVariable.php', + 'Psalm\\Issue\\ImpureVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureVariable.php', + 'Psalm\\Issue\\InaccessibleClassConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InaccessibleClassConstant.php', + 'Psalm\\Issue\\InaccessibleMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InaccessibleMethod.php', + 'Psalm\\Issue\\InaccessibleProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InaccessibleProperty.php', + 'Psalm\\Issue\\InterfaceInstantiation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InterfaceInstantiation.php', + 'Psalm\\Issue\\InternalClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InternalClass.php', + 'Psalm\\Issue\\InternalMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InternalMethod.php', + 'Psalm\\Issue\\InternalProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InternalProperty.php', + 'Psalm\\Issue\\InvalidArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidArgument.php', + 'Psalm\\Issue\\InvalidArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayAccess.php', + 'Psalm\\Issue\\InvalidArrayAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayAssignment.php', + 'Psalm\\Issue\\InvalidArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayOffset.php', + 'Psalm\\Issue\\InvalidAttribute' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidAttribute.php', + 'Psalm\\Issue\\InvalidCast' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidCast.php', + 'Psalm\\Issue\\InvalidCatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidCatch.php', + 'Psalm\\Issue\\InvalidClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidClass.php', + 'Psalm\\Issue\\InvalidClone' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidClone.php', + 'Psalm\\Issue\\InvalidDocblock' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidDocblock.php', + 'Psalm\\Issue\\InvalidDocblockParamName' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidDocblockParamName.php', + 'Psalm\\Issue\\InvalidEnumBackingType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidEnumBackingType.php', + 'Psalm\\Issue\\InvalidEnumCaseValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidEnumCaseValue.php', + 'Psalm\\Issue\\InvalidExtendClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidExtendClass.php', + 'Psalm\\Issue\\InvalidFalsableReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidFalsableReturnType.php', + 'Psalm\\Issue\\InvalidFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidFunctionCall.php', + 'Psalm\\Issue\\InvalidGlobal' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidGlobal.php', + 'Psalm\\Issue\\InvalidIterator' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidIterator.php', + 'Psalm\\Issue\\InvalidLiteralArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidLiteralArgument.php', + 'Psalm\\Issue\\InvalidMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidMethodCall.php', + 'Psalm\\Issue\\InvalidNamedArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidNamedArgument.php', + 'Psalm\\Issue\\InvalidNullableReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidNullableReturnType.php', + 'Psalm\\Issue\\InvalidOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidOperand.php', + 'Psalm\\Issue\\InvalidParamDefault' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidParamDefault.php', + 'Psalm\\Issue\\InvalidParent' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidParent.php', + 'Psalm\\Issue\\InvalidPassByReference' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidPassByReference.php', + 'Psalm\\Issue\\InvalidPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignment.php', + 'Psalm\\Issue\\InvalidPropertyAssignmentValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignmentValue.php', + 'Psalm\\Issue\\InvalidPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyFetch.php', + 'Psalm\\Issue\\InvalidReturnStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidReturnStatement.php', + 'Psalm\\Issue\\InvalidReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidReturnType.php', + 'Psalm\\Issue\\InvalidScalarArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidScalarArgument.php', + 'Psalm\\Issue\\InvalidScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidScope.php', + 'Psalm\\Issue\\InvalidStaticInvocation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidStaticInvocation.php', + 'Psalm\\Issue\\InvalidStringClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidStringClass.php', + 'Psalm\\Issue\\InvalidTemplateParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidTemplateParam.php', + 'Psalm\\Issue\\InvalidThrow' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidThrow.php', + 'Psalm\\Issue\\InvalidToString' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidToString.php', + 'Psalm\\Issue\\InvalidTraversableImplementation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidTraversableImplementation.php', + 'Psalm\\Issue\\InvalidTypeImport' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidTypeImport.php', + 'Psalm\\Issue\\LessSpecificImplementedReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/LessSpecificImplementedReturnType.php', + 'Psalm\\Issue\\LessSpecificReturnStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnStatement.php', + 'Psalm\\Issue\\LessSpecificReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnType.php', + 'Psalm\\Issue\\LoopInvalidation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/LoopInvalidation.php', + 'Psalm\\Issue\\MethodIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MethodIssue.php', + 'Psalm\\Issue\\MethodSignatureMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php', + 'Psalm\\Issue\\MethodSignatureMustOmitReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php', + 'Psalm\\Issue\\MethodSignatureMustProvideReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php', + 'Psalm\\Issue\\MismatchingDocblockParamType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockParamType.php', + 'Psalm\\Issue\\MismatchingDocblockPropertyType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockPropertyType.php', + 'Psalm\\Issue\\MismatchingDocblockReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockReturnType.php', + 'Psalm\\Issue\\MissingClosureParamType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingClosureParamType.php', + 'Psalm\\Issue\\MissingClosureReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingClosureReturnType.php', + 'Psalm\\Issue\\MissingConstructor' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingConstructor.php', + 'Psalm\\Issue\\MissingDependency' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingDependency.php', + 'Psalm\\Issue\\MissingDocblockType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingDocblockType.php', + 'Psalm\\Issue\\MissingFile' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingFile.php', + 'Psalm\\Issue\\MissingImmutableAnnotation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingImmutableAnnotation.php', + 'Psalm\\Issue\\MissingParamType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingParamType.php', + 'Psalm\\Issue\\MissingPropertyType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingPropertyType.php', + 'Psalm\\Issue\\MissingReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingReturnType.php', + 'Psalm\\Issue\\MissingTemplateParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingTemplateParam.php', + 'Psalm\\Issue\\MissingThrowsDocblock' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingThrowsDocblock.php', + 'Psalm\\Issue\\MixedArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArgument.php', + 'Psalm\\Issue\\MixedArgumentTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php', + 'Psalm\\Issue\\MixedArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php', + 'Psalm\\Issue\\MixedArrayAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArrayAssignment.php', + 'Psalm\\Issue\\MixedArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArrayOffset.php', + 'Psalm\\Issue\\MixedArrayTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArrayTypeCoercion.php', + 'Psalm\\Issue\\MixedAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedAssignment.php', + 'Psalm\\Issue\\MixedClone' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedClone.php', + 'Psalm\\Issue\\MixedFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedFunctionCall.php', + 'Psalm\\Issue\\MixedInferredReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedInferredReturnType.php', + 'Psalm\\Issue\\MixedIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedIssue.php', + 'Psalm\\Issue\\MixedIssueTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedIssueTrait.php', + 'Psalm\\Issue\\MixedMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php', + 'Psalm\\Issue\\MixedOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedOperand.php', + 'Psalm\\Issue\\MixedPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyAssignment.php', + 'Psalm\\Issue\\MixedPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyFetch.php', + 'Psalm\\Issue\\MixedPropertyTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyTypeCoercion.php', + 'Psalm\\Issue\\MixedReturnStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php', + 'Psalm\\Issue\\MixedReturnTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedReturnTypeCoercion.php', + 'Psalm\\Issue\\MixedStringOffsetAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedStringOffsetAssignment.php', + 'Psalm\\Issue\\MoreSpecificImplementedParamType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MoreSpecificImplementedParamType.php', + 'Psalm\\Issue\\MoreSpecificReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MoreSpecificReturnType.php', + 'Psalm\\Issue\\MutableDependency' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MutableDependency.php', + 'Psalm\\Issue\\NamedArgumentNotAllowed' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NamedArgumentNotAllowed.php', + 'Psalm\\Issue\\NoEnumProperties' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NoEnumProperties.php', + 'Psalm\\Issue\\NoInterfaceProperties' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NoInterfaceProperties.php', + 'Psalm\\Issue\\NoValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NoValue.php', + 'Psalm\\Issue\\NonInvariantDocblockPropertyType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NonInvariantDocblockPropertyType.php', + 'Psalm\\Issue\\NonInvariantPropertyType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NonInvariantPropertyType.php', + 'Psalm\\Issue\\NonStaticSelfCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NonStaticSelfCall.php', + 'Psalm\\Issue\\NullArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullArgument.php', + 'Psalm\\Issue\\NullArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullArrayAccess.php', + 'Psalm\\Issue\\NullArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullArrayOffset.php', + 'Psalm\\Issue\\NullFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullFunctionCall.php', + 'Psalm\\Issue\\NullIterator' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullIterator.php', + 'Psalm\\Issue\\NullOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullOperand.php', + 'Psalm\\Issue\\NullPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullPropertyAssignment.php', + 'Psalm\\Issue\\NullPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullPropertyFetch.php', + 'Psalm\\Issue\\NullReference' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullReference.php', + 'Psalm\\Issue\\NullableReturnStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullableReturnStatement.php', + 'Psalm\\Issue\\OverriddenMethodAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/OverriddenMethodAccess.php', + 'Psalm\\Issue\\OverriddenPropertyAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/OverriddenPropertyAccess.php', + 'Psalm\\Issue\\ParadoxicalCondition' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ParadoxicalCondition.php', + 'Psalm\\Issue\\ParamNameMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ParamNameMismatch.php', + 'Psalm\\Issue\\ParentNotFound' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ParentNotFound.php', + 'Psalm\\Issue\\ParseError' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ParseError.php', + 'Psalm\\Issue\\PluginIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PluginIssue.php', + 'Psalm\\Issue\\PossibleRawObjectIteration' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossibleRawObjectIteration.php', + 'Psalm\\Issue\\PossiblyFalseArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseArgument.php', + 'Psalm\\Issue\\PossiblyFalseIterator' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseIterator.php', + 'Psalm\\Issue\\PossiblyFalseOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseOperand.php', + 'Psalm\\Issue\\PossiblyFalsePropertyAssignmentValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php', + 'Psalm\\Issue\\PossiblyFalseReference' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseReference.php', + 'Psalm\\Issue\\PossiblyInvalidArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArgument.php', + 'Psalm\\Issue\\PossiblyInvalidArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAccess.php', + 'Psalm\\Issue\\PossiblyInvalidArrayAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php', + 'Psalm\\Issue\\PossiblyInvalidArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayOffset.php', + 'Psalm\\Issue\\PossiblyInvalidCast' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidCast.php', + 'Psalm\\Issue\\PossiblyInvalidClone' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidClone.php', + 'Psalm\\Issue\\PossiblyInvalidDocblockTag' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidDocblockTag.php', + 'Psalm\\Issue\\PossiblyInvalidFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidFunctionCall.php', + 'Psalm\\Issue\\PossiblyInvalidIterator' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidIterator.php', + 'Psalm\\Issue\\PossiblyInvalidMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidMethodCall.php', + 'Psalm\\Issue\\PossiblyInvalidOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidOperand.php', + 'Psalm\\Issue\\PossiblyInvalidPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php', + 'Psalm\\Issue\\PossiblyInvalidPropertyAssignmentValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php', + 'Psalm\\Issue\\PossiblyInvalidPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php', + 'Psalm\\Issue\\PossiblyNullArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArgument.php', + 'Psalm\\Issue\\PossiblyNullArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAccess.php', + 'Psalm\\Issue\\PossiblyNullArrayAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAssignment.php', + 'Psalm\\Issue\\PossiblyNullArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayOffset.php', + 'Psalm\\Issue\\PossiblyNullFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullFunctionCall.php', + 'Psalm\\Issue\\PossiblyNullIterator' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullIterator.php', + 'Psalm\\Issue\\PossiblyNullOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullOperand.php', + 'Psalm\\Issue\\PossiblyNullPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignment.php', + 'Psalm\\Issue\\PossiblyNullPropertyAssignmentValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php', + 'Psalm\\Issue\\PossiblyNullPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyFetch.php', + 'Psalm\\Issue\\PossiblyNullReference' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullReference.php', + 'Psalm\\Issue\\PossiblyUndefinedArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php', + 'Psalm\\Issue\\PossiblyUndefinedGlobalVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php', + 'Psalm\\Issue\\PossiblyUndefinedIntArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php', + 'Psalm\\Issue\\PossiblyUndefinedMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedMethod.php', + 'Psalm\\Issue\\PossiblyUndefinedStringArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php', + 'Psalm\\Issue\\PossiblyUndefinedVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedVariable.php', + 'Psalm\\Issue\\PossiblyUnusedMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedMethod.php', + 'Psalm\\Issue\\PossiblyUnusedParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedParam.php', + 'Psalm\\Issue\\PossiblyUnusedProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedProperty.php', + 'Psalm\\Issue\\PossiblyUnusedReturnValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedReturnValue.php', + 'Psalm\\Issue\\PropertyIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PropertyIssue.php', + 'Psalm\\Issue\\PropertyNotSetInConstructor' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php', + 'Psalm\\Issue\\PropertyTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php', + 'Psalm\\Issue\\PsalmInternalError' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PsalmInternalError.php', + 'Psalm\\Issue\\RawObjectIteration' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RawObjectIteration.php', + 'Psalm\\Issue\\RedundantCast' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantCast.php', + 'Psalm\\Issue\\RedundantCastGivenDocblockType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantCastGivenDocblockType.php', + 'Psalm\\Issue\\RedundantCondition' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantCondition.php', + 'Psalm\\Issue\\RedundantConditionGivenDocblockType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php', + 'Psalm\\Issue\\RedundantFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php', + 'Psalm\\Issue\\RedundantFunctionCallGivenDocblockType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php', + 'Psalm\\Issue\\RedundantIdentityWithTrue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantIdentityWithTrue.php', + 'Psalm\\Issue\\RedundantPropertyInitializationCheck' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantPropertyInitializationCheck.php', + 'Psalm\\Issue\\ReferenceConstraintViolation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ReferenceConstraintViolation.php', + 'Psalm\\Issue\\ReservedWord' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ReservedWord.php', + 'Psalm\\Issue\\StringIncrement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/StringIncrement.php', + 'Psalm\\Issue\\TaintedCallable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedCallable.php', + 'Psalm\\Issue\\TaintedCookie' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedCookie.php', + 'Psalm\\Issue\\TaintedCustom' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedCustom.php', + 'Psalm\\Issue\\TaintedEval' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedEval.php', + 'Psalm\\Issue\\TaintedFile' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedFile.php', + 'Psalm\\Issue\\TaintedHeader' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedHeader.php', + 'Psalm\\Issue\\TaintedHtml' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedHtml.php', + 'Psalm\\Issue\\TaintedInclude' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedInclude.php', + 'Psalm\\Issue\\TaintedInput' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedInput.php', + 'Psalm\\Issue\\TaintedLdap' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php', + 'Psalm\\Issue\\TaintedSSRF' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedSSRF.php', + 'Psalm\\Issue\\TaintedShell' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedShell.php', + 'Psalm\\Issue\\TaintedSql' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedSql.php', + 'Psalm\\Issue\\TaintedSystemSecret' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedSystemSecret.php', + 'Psalm\\Issue\\TaintedTextWithQuotes' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedTextWithQuotes.php', + 'Psalm\\Issue\\TaintedUnserialize' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedUnserialize.php', + 'Psalm\\Issue\\TaintedUserSecret' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedUserSecret.php', + 'Psalm\\Issue\\TooFewArguments' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TooFewArguments.php', + 'Psalm\\Issue\\TooManyArguments' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TooManyArguments.php', + 'Psalm\\Issue\\TooManyTemplateParams' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TooManyTemplateParams.php', + 'Psalm\\Issue\\Trace' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/Trace.php', + 'Psalm\\Issue\\TraitMethodSignatureMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TraitMethodSignatureMismatch.php', + 'Psalm\\Issue\\TypeDoesNotContainNull' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainNull.php', + 'Psalm\\Issue\\TypeDoesNotContainType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php', + 'Psalm\\Issue\\UncaughtThrowInGlobalScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php', + 'Psalm\\Issue\\UndefinedAttributeClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedAttributeClass.php', + 'Psalm\\Issue\\UndefinedClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedClass.php', + 'Psalm\\Issue\\UndefinedConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedConstant.php', + 'Psalm\\Issue\\UndefinedDocblockClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedDocblockClass.php', + 'Psalm\\Issue\\UndefinedFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedFunction.php', + 'Psalm\\Issue\\UndefinedGlobalVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedGlobalVariable.php', + 'Psalm\\Issue\\UndefinedInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedInterface.php', + 'Psalm\\Issue\\UndefinedInterfaceMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedInterfaceMethod.php', + 'Psalm\\Issue\\UndefinedMagicMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicMethod.php', + 'Psalm\\Issue\\UndefinedMagicPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php', + 'Psalm\\Issue\\UndefinedMagicPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyFetch.php', + 'Psalm\\Issue\\UndefinedMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedMethod.php', + 'Psalm\\Issue\\UndefinedPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyAssignment.php', + 'Psalm\\Issue\\UndefinedPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyFetch.php', + 'Psalm\\Issue\\UndefinedThisPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyAssignment.php', + 'Psalm\\Issue\\UndefinedThisPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyFetch.php', + 'Psalm\\Issue\\UndefinedTrace' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedTrace.php', + 'Psalm\\Issue\\UndefinedTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedTrait.php', + 'Psalm\\Issue\\UndefinedVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedVariable.php', + 'Psalm\\Issue\\UnevaluatedCode' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnevaluatedCode.php', + 'Psalm\\Issue\\UnhandledMatchCondition' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnhandledMatchCondition.php', + 'Psalm\\Issue\\UnimplementedAbstractMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnimplementedAbstractMethod.php', + 'Psalm\\Issue\\UnimplementedInterfaceMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnimplementedInterfaceMethod.php', + 'Psalm\\Issue\\UninitializedProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UninitializedProperty.php', + 'Psalm\\Issue\\UnnecessaryVarAnnotation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnnecessaryVarAnnotation.php', + 'Psalm\\Issue\\UnrecognizedExpression' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnrecognizedExpression.php', + 'Psalm\\Issue\\UnrecognizedStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnrecognizedStatement.php', + 'Psalm\\Issue\\UnresolvableInclude' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnresolvableInclude.php', + 'Psalm\\Issue\\UnsafeGenericInstantiation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnsafeGenericInstantiation.php', + 'Psalm\\Issue\\UnsafeInstantiation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnsafeInstantiation.php', + 'Psalm\\Issue\\UnusedClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedClass.php', + 'Psalm\\Issue\\UnusedClosureParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedClosureParam.php', + 'Psalm\\Issue\\UnusedConstructor' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedConstructor.php', + 'Psalm\\Issue\\UnusedForeachValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedForeachValue.php', + 'Psalm\\Issue\\UnusedFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedFunctionCall.php', + 'Psalm\\Issue\\UnusedMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedMethod.php', + 'Psalm\\Issue\\UnusedMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedMethodCall.php', + 'Psalm\\Issue\\UnusedParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedParam.php', + 'Psalm\\Issue\\UnusedProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedProperty.php', + 'Psalm\\Issue\\UnusedPsalmSuppress' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedPsalmSuppress.php', + 'Psalm\\Issue\\UnusedReturnValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedReturnValue.php', + 'Psalm\\Issue\\UnusedVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedVariable.php', + 'Psalm\\Issue\\VariableIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/VariableIssue.php', + 'Psalm\\NodeTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/NodeTypeProvider.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseAnd' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseOr' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseXor' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualCoalesce' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualConcat' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualDiv' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualMinus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualMod' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMod.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualMul' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMul.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualPlus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualPow' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPow.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftLeft' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftRight' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseAnd' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseOr' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseXor' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanAnd' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanOr' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualCoalesce' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualConcat' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualDiv' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualEqual' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreater' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreaterOrEqual' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualIdentical' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalAnd' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalOr' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalXor' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMinus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMod' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMul' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotEqual' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotIdentical' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPlus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPow' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftLeft' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftRight' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmaller' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmallerOrEqual' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSpaceship' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualArray.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualBool' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualBool.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualDouble' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualDouble.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualInt' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualInt.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualObject' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualObject.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualString' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualString.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualUnset' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualUnset.php', + 'Psalm\\Node\\Expr\\VirtualArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArray.php', + 'Psalm\\Node\\Expr\\VirtualArrayDimFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayDimFetch.php', + 'Psalm\\Node\\Expr\\VirtualArrayItem' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayItem.php', + 'Psalm\\Node\\Expr\\VirtualArrowFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrowFunction.php', + 'Psalm\\Node\\Expr\\VirtualAssign' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssign.php', + 'Psalm\\Node\\Expr\\VirtualAssignRef' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssignRef.php', + 'Psalm\\Node\\Expr\\VirtualBitwiseNot' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualBitwiseNot.php', + 'Psalm\\Node\\Expr\\VirtualBooleanNot' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualBooleanNot.php', + 'Psalm\\Node\\Expr\\VirtualClassConstFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClassConstFetch.php', + 'Psalm\\Node\\Expr\\VirtualClone' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClone.php', + 'Psalm\\Node\\Expr\\VirtualClosure' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosure.php', + 'Psalm\\Node\\Expr\\VirtualClosureUse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosureUse.php', + 'Psalm\\Node\\Expr\\VirtualConstFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualConstFetch.php', + 'Psalm\\Node\\Expr\\VirtualEmpty' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualEmpty.php', + 'Psalm\\Node\\Expr\\VirtualError' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualError.php', + 'Psalm\\Node\\Expr\\VirtualErrorSuppress' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualErrorSuppress.php', + 'Psalm\\Node\\Expr\\VirtualEval' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualEval.php', + 'Psalm\\Node\\Expr\\VirtualExit' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualExit.php', + 'Psalm\\Node\\Expr\\VirtualFuncCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualFuncCall.php', + 'Psalm\\Node\\Expr\\VirtualInclude' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualInclude.php', + 'Psalm\\Node\\Expr\\VirtualInstanceof' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualInstanceof.php', + 'Psalm\\Node\\Expr\\VirtualIsset' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualIsset.php', + 'Psalm\\Node\\Expr\\VirtualList' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualList.php', + 'Psalm\\Node\\Expr\\VirtualMatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualMatch.php', + 'Psalm\\Node\\Expr\\VirtualMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualMethodCall.php', + 'Psalm\\Node\\Expr\\VirtualNew' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNew.php', + 'Psalm\\Node\\Expr\\VirtualNullsafeMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php', + 'Psalm\\Node\\Expr\\VirtualNullsafePropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php', + 'Psalm\\Node\\Expr\\VirtualPostDec' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostDec.php', + 'Psalm\\Node\\Expr\\VirtualPostInc' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostInc.php', + 'Psalm\\Node\\Expr\\VirtualPreDec' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreDec.php', + 'Psalm\\Node\\Expr\\VirtualPreInc' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreInc.php', + 'Psalm\\Node\\Expr\\VirtualPrint' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPrint.php', + 'Psalm\\Node\\Expr\\VirtualPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPropertyFetch.php', + 'Psalm\\Node\\Expr\\VirtualShellExec' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualShellExec.php', + 'Psalm\\Node\\Expr\\VirtualStaticCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticCall.php', + 'Psalm\\Node\\Expr\\VirtualStaticPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php', + 'Psalm\\Node\\Expr\\VirtualTernary' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualTernary.php', + 'Psalm\\Node\\Expr\\VirtualThrow' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualThrow.php', + 'Psalm\\Node\\Expr\\VirtualUnaryMinus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryMinus.php', + 'Psalm\\Node\\Expr\\VirtualUnaryPlus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryPlus.php', + 'Psalm\\Node\\Expr\\VirtualVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualVariable.php', + 'Psalm\\Node\\Expr\\VirtualYield' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualYield.php', + 'Psalm\\Node\\Expr\\VirtualYieldFrom' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualYieldFrom.php', + 'Psalm\\Node\\Name\\VirtualFullyQualified' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Name/VirtualFullyQualified.php', + 'Psalm\\Node\\Name\\VirtualRelative' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Name/VirtualRelative.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualDir' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFile' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualLine' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualNamespace' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php', + 'Psalm\\Node\\Scalar\\VirtualDNumber' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualDNumber.php', + 'Psalm\\Node\\Scalar\\VirtualEncapsed' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsed.php', + 'Psalm\\Node\\Scalar\\VirtualEncapsedStringPart' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php', + 'Psalm\\Node\\Scalar\\VirtualLNumber' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualLNumber.php', + 'Psalm\\Node\\Scalar\\VirtualString' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualString.php', + 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php', + 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualPrecedence' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php', + 'Psalm\\Node\\Stmt\\VirtualBreak' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualBreak.php', + 'Psalm\\Node\\Stmt\\VirtualCase' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCase.php', + 'Psalm\\Node\\Stmt\\VirtualCatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCatch.php', + 'Psalm\\Node\\Stmt\\VirtualClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClass.php', + 'Psalm\\Node\\Stmt\\VirtualClassConst' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassConst.php', + 'Psalm\\Node\\Stmt\\VirtualClassMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassMethod.php', + 'Psalm\\Node\\Stmt\\VirtualConst' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualConst.php', + 'Psalm\\Node\\Stmt\\VirtualContinue' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualContinue.php', + 'Psalm\\Node\\Stmt\\VirtualDeclare' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclare.php', + 'Psalm\\Node\\Stmt\\VirtualDeclareDeclare' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php', + 'Psalm\\Node\\Stmt\\VirtualDo' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDo.php', + 'Psalm\\Node\\Stmt\\VirtualEcho' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualEcho.php', + 'Psalm\\Node\\Stmt\\VirtualElse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElse.php', + 'Psalm\\Node\\Stmt\\VirtualElseIf' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElseIf.php', + 'Psalm\\Node\\Stmt\\VirtualExpression' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualExpression.php', + 'Psalm\\Node\\Stmt\\VirtualFinally' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFinally.php', + 'Psalm\\Node\\Stmt\\VirtualFor' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFor.php', + 'Psalm\\Node\\Stmt\\VirtualForeach' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualForeach.php', + 'Psalm\\Node\\Stmt\\VirtualFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFunction.php', + 'Psalm\\Node\\Stmt\\VirtualGlobal' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGlobal.php', + 'Psalm\\Node\\Stmt\\VirtualGoto' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGoto.php', + 'Psalm\\Node\\Stmt\\VirtualGroupUse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGroupUse.php', + 'Psalm\\Node\\Stmt\\VirtualHaltCompiler' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualHaltCompiler.php', + 'Psalm\\Node\\Stmt\\VirtualIf' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualIf.php', + 'Psalm\\Node\\Stmt\\VirtualInlineHTML' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInlineHTML.php', + 'Psalm\\Node\\Stmt\\VirtualInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInterface.php', + 'Psalm\\Node\\Stmt\\VirtualLabel' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualLabel.php', + 'Psalm\\Node\\Stmt\\VirtualNamespace' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNamespace.php', + 'Psalm\\Node\\Stmt\\VirtualNop' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNop.php', + 'Psalm\\Node\\Stmt\\VirtualProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualProperty.php', + 'Psalm\\Node\\Stmt\\VirtualPropertyProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualPropertyProperty.php', + 'Psalm\\Node\\Stmt\\VirtualReturn' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualReturn.php', + 'Psalm\\Node\\Stmt\\VirtualStatic' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStatic.php', + 'Psalm\\Node\\Stmt\\VirtualStaticVar' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStaticVar.php', + 'Psalm\\Node\\Stmt\\VirtualSwitch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualSwitch.php', + 'Psalm\\Node\\Stmt\\VirtualThrow' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualThrow.php', + 'Psalm\\Node\\Stmt\\VirtualTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTrait.php', + 'Psalm\\Node\\Stmt\\VirtualTraitUse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTraitUse.php', + 'Psalm\\Node\\Stmt\\VirtualTryCatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTryCatch.php', + 'Psalm\\Node\\Stmt\\VirtualUnset' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUnset.php', + 'Psalm\\Node\\Stmt\\VirtualUse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUse.php', + 'Psalm\\Node\\Stmt\\VirtualUseUse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUseUse.php', + 'Psalm\\Node\\Stmt\\VirtualWhile' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualWhile.php', + 'Psalm\\Node\\VirtualArg' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualArg.php', + 'Psalm\\Node\\VirtualAttribute' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualAttribute.php', + 'Psalm\\Node\\VirtualAttributeGroup' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualAttributeGroup.php', + 'Psalm\\Node\\VirtualConst' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualConst.php', + 'Psalm\\Node\\VirtualIdentifier' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualIdentifier.php', + 'Psalm\\Node\\VirtualMatchArm' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualMatchArm.php', + 'Psalm\\Node\\VirtualName' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualName.php', + 'Psalm\\Node\\VirtualNode' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualNode.php', + 'Psalm\\Node\\VirtualNullableType' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualNullableType.php', + 'Psalm\\Node\\VirtualParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualParam.php', + 'Psalm\\Node\\VirtualUnionType' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualUnionType.php', + 'Psalm\\Node\\VirtualVarLikeIdentifier' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualVarLikeIdentifier.php', + 'Psalm\\PluginRegistrationSocket' => $vendorDir . '/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php', + 'Psalm\\Plugin\\EventHandler\\AddTaintsInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterClassLikeAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterClassLikeExistenceCheckInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterClassLikeVisitInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterCodebasePopulatedInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterEveryFunctionCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterExpressionAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterFileAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterFunctionCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterFunctionLikeAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterMethodCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterStatementAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\BeforeFileAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AddRemoveTaintsEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeExistenceCheckEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeVisitEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterCodebasePopulatedEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterEveryFunctionCallAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterExpressionAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterFileAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionCallAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionLikeAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterMethodCallAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterStatementAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\BeforeFileAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\FunctionExistenceProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\FunctionParamsProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\FunctionReturnTypeProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\MethodExistenceProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\MethodParamsProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\MethodReturnTypeProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\MethodVisibilityProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\PropertyExistenceProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\PropertyTypeProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\PropertyVisibilityProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\StringInterpreterEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php', + 'Psalm\\Plugin\\EventHandler\\FunctionExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\FunctionParamsProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\FunctionReturnTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\MethodExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\MethodParamsProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\MethodReturnTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\MethodVisibilityProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\PropertyExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\PropertyTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\PropertyVisibilityProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\RemoveTaintsInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php', + 'Psalm\\Plugin\\EventHandler\\StringInterpreterInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php', + 'Psalm\\Plugin\\Hook\\AfterAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterClassLikeAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterClassLikeExistenceCheckInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeExistenceCheckInterface.php', + 'Psalm\\Plugin\\Hook\\AfterClassLikeVisitInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeVisitInterface.php', + 'Psalm\\Plugin\\Hook\\AfterCodebasePopulatedInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterCodebasePopulatedInterface.php', + 'Psalm\\Plugin\\Hook\\AfterEveryFunctionCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterEveryFunctionCallAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterExpressionAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterExpressionAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterFileAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFileAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterFunctionCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionCallAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterFunctionLikeAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionLikeAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterMethodCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterMethodCallAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterStatementAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterStatementAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\BeforeFileAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/BeforeFileAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\FunctionExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionExistenceProviderInterface.php', + 'Psalm\\Plugin\\Hook\\FunctionParamsProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php', + 'Psalm\\Plugin\\Hook\\FunctionReturnTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php', + 'Psalm\\Plugin\\Hook\\MethodExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php', + 'Psalm\\Plugin\\Hook\\MethodParamsProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php', + 'Psalm\\Plugin\\Hook\\MethodReturnTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php', + 'Psalm\\Plugin\\Hook\\MethodVisibilityProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php', + 'Psalm\\Plugin\\Hook\\PropertyExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php', + 'Psalm\\Plugin\\Hook\\PropertyTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php', + 'Psalm\\Plugin\\Hook\\PropertyVisibilityProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php', + 'Psalm\\Plugin\\Hook\\StringInterpreterInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php', + 'Psalm\\Plugin\\PluginEntryPointInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/PluginEntryPointInterface.php', + 'Psalm\\Plugin\\RegistrationInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/RegistrationInterface.php', + 'Psalm\\Plugin\\Shepherd' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Shepherd.php', + 'Psalm\\Progress\\DebugProgress' => $vendorDir . '/vimeo/psalm/src/Psalm/Progress/DebugProgress.php', + 'Psalm\\Progress\\DefaultProgress' => $vendorDir . '/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php', + 'Psalm\\Progress\\LongProgress' => $vendorDir . '/vimeo/psalm/src/Psalm/Progress/LongProgress.php', + 'Psalm\\Progress\\Progress' => $vendorDir . '/vimeo/psalm/src/Psalm/Progress/Progress.php', + 'Psalm\\Progress\\VoidProgress' => $vendorDir . '/vimeo/psalm/src/Psalm/Progress/VoidProgress.php', + 'Psalm\\Report' => $vendorDir . '/vimeo/psalm/src/Psalm/Report.php', + 'Psalm\\Report\\CheckstyleReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php', + 'Psalm\\Report\\CodeClimateReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php', + 'Psalm\\Report\\CompactReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/CompactReport.php', + 'Psalm\\Report\\ConsoleReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/ConsoleReport.php', + 'Psalm\\Report\\CountReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/CountReport.php', + 'Psalm\\Report\\EmacsReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/EmacsReport.php', + 'Psalm\\Report\\GithubActionsReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php', + 'Psalm\\Report\\JsonReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/JsonReport.php', + 'Psalm\\Report\\JsonSummaryReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php', + 'Psalm\\Report\\JunitReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/JunitReport.php', + 'Psalm\\Report\\PhpStormReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/PhpStormReport.php', + 'Psalm\\Report\\PylintReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/PylintReport.php', + 'Psalm\\Report\\ReportOptions' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/ReportOptions.php', + 'Psalm\\Report\\SarifReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/SarifReport.php', + 'Psalm\\Report\\SonarqubeReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php', + 'Psalm\\Report\\TextReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/TextReport.php', + 'Psalm\\Report\\XmlReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/XmlReport.php', + 'Psalm\\SourceControl\\Git\\CommitInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php', + 'Psalm\\SourceControl\\Git\\GitInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php', + 'Psalm\\SourceControl\\Git\\RemoteInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php', + 'Psalm\\SourceControl\\SourceControlInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php', + 'Psalm\\StatementsSource' => $vendorDir . '/vimeo/psalm/src/Psalm/StatementsSource.php', + 'Psalm\\Storage\\Assertion' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/Assertion.php', + 'Psalm\\Storage\\AttributeArg' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/AttributeArg.php', + 'Psalm\\Storage\\AttributeStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php', + 'Psalm\\Storage\\ClassConstantStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php', + 'Psalm\\Storage\\ClassLikeStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php', + 'Psalm\\Storage\\CustomMetadataTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php', + 'Psalm\\Storage\\EnumCaseStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php', + 'Psalm\\Storage\\FileStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/FileStorage.php', + 'Psalm\\Storage\\FunctionLikeParameter' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php', + 'Psalm\\Storage\\FunctionLikeStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php', + 'Psalm\\Storage\\FunctionStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php', + 'Psalm\\Storage\\HasAttributesInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php', + 'Psalm\\Storage\\MethodStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/MethodStorage.php', + 'Psalm\\Storage\\PropertyStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php', + 'Psalm\\Type' => $vendorDir . '/vimeo/psalm/src/Psalm/Type.php', + 'Psalm\\Type\\Atomic' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic.php', + 'Psalm\\Type\\Atomic\\CallableTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php', + 'Psalm\\Type\\Atomic\\DependentType' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php', + 'Psalm\\Type\\Atomic\\GenericTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/GenericTrait.php', + 'Psalm\\Type\\Atomic\\HasIntersectionTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php', + 'Psalm\\Type\\Atomic\\Scalar' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php', + 'Psalm\\Type\\Atomic\\TAnonymousClassInstance' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TAnonymousClassInstance.php', + 'Psalm\\Type\\Atomic\\TArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php', + 'Psalm\\Type\\Atomic\\TArrayKey' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php', + 'Psalm\\Type\\Atomic\\TAssertionFalsy' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php', + 'Psalm\\Type\\Atomic\\TBool' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php', + 'Psalm\\Type\\Atomic\\TCallable' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php', + 'Psalm\\Type\\Atomic\\TCallableArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php', + 'Psalm\\Type\\Atomic\\TCallableKeyedArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableKeyedArray.php', + 'Psalm\\Type\\Atomic\\TCallableList' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableList.php', + 'Psalm\\Type\\Atomic\\TCallableObject' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableObject.php', + 'Psalm\\Type\\Atomic\\TCallableString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php', + 'Psalm\\Type\\Atomic\\TClassConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php', + 'Psalm\\Type\\Atomic\\TClassString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php', + 'Psalm\\Type\\Atomic\\TClassStringMap' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php', + 'Psalm\\Type\\Atomic\\TClosedResource' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php', + 'Psalm\\Type\\Atomic\\TClosure' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php', + 'Psalm\\Type\\Atomic\\TConditional' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php', + 'Psalm\\Type\\Atomic\\TDependentGetClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php', + 'Psalm\\Type\\Atomic\\TDependentGetDebugType' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php', + 'Psalm\\Type\\Atomic\\TDependentGetType' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php', + 'Psalm\\Type\\Atomic\\TDependentListKey' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php', + 'Psalm\\Type\\Atomic\\TEmpty' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php', + 'Psalm\\Type\\Atomic\\TEmptyMixed' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php', + 'Psalm\\Type\\Atomic\\TEmptyNumeric' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyNumeric.php', + 'Psalm\\Type\\Atomic\\TEmptyScalar' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyScalar.php', + 'Psalm\\Type\\Atomic\\TEnumCase' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TEnumCase.php', + 'Psalm\\Type\\Atomic\\TFalse' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php', + 'Psalm\\Type\\Atomic\\TFloat' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TFloat.php', + 'Psalm\\Type\\Atomic\\TGenericObject' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php', + 'Psalm\\Type\\Atomic\\THtmlEscapedString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php', + 'Psalm\\Type\\Atomic\\TInt' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php', + 'Psalm\\Type\\Atomic\\TIntMask' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php', + 'Psalm\\Type\\Atomic\\TIntMaskOf' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php', + 'Psalm\\Type\\Atomic\\TIntRange' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php', + 'Psalm\\Type\\Atomic\\TIterable' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php', + 'Psalm\\Type\\Atomic\\TKeyOfClassConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php', + 'Psalm\\Type\\Atomic\\TKeyedArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php', + 'Psalm\\Type\\Atomic\\TList' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TList.php', + 'Psalm\\Type\\Atomic\\TLiteralClassString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php', + 'Psalm\\Type\\Atomic\\TLiteralFloat' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php', + 'Psalm\\Type\\Atomic\\TLiteralInt' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php', + 'Psalm\\Type\\Atomic\\TLiteralString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php', + 'Psalm\\Type\\Atomic\\TLowercaseString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php', + 'Psalm\\Type\\Atomic\\TMixed' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TMixed.php', + 'Psalm\\Type\\Atomic\\TNamedObject' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php', + 'Psalm\\Type\\Atomic\\TNever' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php', + 'Psalm\\Type\\Atomic\\TNonEmptyArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php', + 'Psalm\\Type\\Atomic\\TNonEmptyList' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php', + 'Psalm\\Type\\Atomic\\TNonEmptyLowercaseString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php', + 'Psalm\\Type\\Atomic\\TNonEmptyMixed' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyMixed.php', + 'Psalm\\Type\\Atomic\\TNonEmptyNonspecificLiteralString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php', + 'Psalm\\Type\\Atomic\\TNonEmptyScalar' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyScalar.php', + 'Psalm\\Type\\Atomic\\TNonEmptyString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyString.php', + 'Psalm\\Type\\Atomic\\TNonFalsyString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonFalsyString.php', + 'Psalm\\Type\\Atomic\\TNonspecificLiteralInt' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php', + 'Psalm\\Type\\Atomic\\TNonspecificLiteralString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralString.php', + 'Psalm\\Type\\Atomic\\TNull' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNull.php', + 'Psalm\\Type\\Atomic\\TNumeric' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php', + 'Psalm\\Type\\Atomic\\TNumericString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php', + 'Psalm\\Type\\Atomic\\TObject' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php', + 'Psalm\\Type\\Atomic\\TObjectWithProperties' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php', + 'Psalm\\Type\\Atomic\\TPositiveInt' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php', + 'Psalm\\Type\\Atomic\\TResource' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php', + 'Psalm\\Type\\Atomic\\TScalar' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php', + 'Psalm\\Type\\Atomic\\TSingleLetter' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php', + 'Psalm\\Type\\Atomic\\TString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TString.php', + 'Psalm\\Type\\Atomic\\TTemplateIndexedAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php', + 'Psalm\\Type\\Atomic\\TTemplateKeyOf' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php', + 'Psalm\\Type\\Atomic\\TTemplateParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php', + 'Psalm\\Type\\Atomic\\TTemplateParamClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php', + 'Psalm\\Type\\Atomic\\TTraitString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php', + 'Psalm\\Type\\Atomic\\TTrue' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php', + 'Psalm\\Type\\Atomic\\TTypeAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTypeAlias.php', + 'Psalm\\Type\\Atomic\\TValueOfClassConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php', + 'Psalm\\Type\\Atomic\\TVoid' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php', + 'Psalm\\Type\\NodeVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/NodeVisitor.php', + 'Psalm\\Type\\Reconciler' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Reconciler.php', + 'Psalm\\Type\\TaintKind' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/TaintKind.php', + 'Psalm\\Type\\TaintKindGroup' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/TaintKindGroup.php', + 'Psalm\\Type\\TypeNode' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/TypeNode.php', + 'Psalm\\Type\\Union' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Union.php', 'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', 'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', + 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php', + 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php', + 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', + 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', + 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', + 'SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', + 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', + 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', 'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', @@ -121,4 +1707,106 @@ 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', + 'Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', + 'Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php', + 'Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', + 'Webmozart\\PathUtil\\Path' => $vendorDir . '/webmozart/path-util/src/Path.php', + 'Webmozart\\PathUtil\\Url' => $vendorDir . '/webmozart/path-util/src/Url.php', + 'XdgBaseDir\\Xdg' => $vendorDir . '/dnoegel/php-xdg-base-dir/src/Xdg.php', + 'phpDocumentor\\Reflection\\DocBlock' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock.php', + 'phpDocumentor\\Reflection\\DocBlockFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', + 'phpDocumentor\\Reflection\\DocBlockFactoryInterface' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', + 'phpDocumentor\\Reflection\\DocBlock\\Description' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', + 'phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', + 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', + 'phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', + 'phpDocumentor\\Reflection\\DocBlock\\TagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', + 'phpDocumentor\\Reflection\\Element' => $vendorDir . '/phpdocumentor/reflection-common/src/Element.php', + 'phpDocumentor\\Reflection\\Exception\\PcreException' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', + 'phpDocumentor\\Reflection\\File' => $vendorDir . '/phpdocumentor/reflection-common/src/File.php', + 'phpDocumentor\\Reflection\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-common/src/Fqsen.php', + 'phpDocumentor\\Reflection\\FqsenResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/FqsenResolver.php', + 'phpDocumentor\\Reflection\\Location' => $vendorDir . '/phpdocumentor/reflection-common/src/Location.php', + 'phpDocumentor\\Reflection\\Project' => $vendorDir . '/phpdocumentor/reflection-common/src/Project.php', + 'phpDocumentor\\Reflection\\ProjectFactory' => $vendorDir . '/phpdocumentor/reflection-common/src/ProjectFactory.php', + 'phpDocumentor\\Reflection\\PseudoType' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoType.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\False_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\List_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/List_.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\True_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', + 'phpDocumentor\\Reflection\\Type' => $vendorDir . '/phpdocumentor/type-resolver/src/Type.php', + 'phpDocumentor\\Reflection\\TypeResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/TypeResolver.php', + 'phpDocumentor\\Reflection\\Types\\AbstractList' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', + 'phpDocumentor\\Reflection\\Types\\AggregatedType' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', + 'phpDocumentor\\Reflection\\Types\\ArrayKey' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ArrayKey.php', + 'phpDocumentor\\Reflection\\Types\\Array_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Array_.php', + 'phpDocumentor\\Reflection\\Types\\Boolean' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Boolean.php', + 'phpDocumentor\\Reflection\\Types\\Callable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Callable_.php', + 'phpDocumentor\\Reflection\\Types\\ClassString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ClassString.php', + 'phpDocumentor\\Reflection\\Types\\Collection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Collection.php', + 'phpDocumentor\\Reflection\\Types\\Compound' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Compound.php', + 'phpDocumentor\\Reflection\\Types\\Context' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Context.php', + 'phpDocumentor\\Reflection\\Types\\ContextFactory' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', + 'phpDocumentor\\Reflection\\Types\\Expression' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Expression.php', + 'phpDocumentor\\Reflection\\Types\\Float_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Float_.php', + 'phpDocumentor\\Reflection\\Types\\Integer' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Integer.php', + 'phpDocumentor\\Reflection\\Types\\InterfaceString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/InterfaceString.php', + 'phpDocumentor\\Reflection\\Types\\Intersection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Intersection.php', + 'phpDocumentor\\Reflection\\Types\\Iterable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', + 'phpDocumentor\\Reflection\\Types\\Mixed_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', + 'phpDocumentor\\Reflection\\Types\\Never_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Never_.php', + 'phpDocumentor\\Reflection\\Types\\Null_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Null_.php', + 'phpDocumentor\\Reflection\\Types\\Nullable' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Nullable.php', + 'phpDocumentor\\Reflection\\Types\\Object_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Object_.php', + 'phpDocumentor\\Reflection\\Types\\Parent_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Parent_.php', + 'phpDocumentor\\Reflection\\Types\\Resource_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Resource_.php', + 'phpDocumentor\\Reflection\\Types\\Scalar' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Scalar.php', + 'phpDocumentor\\Reflection\\Types\\Self_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Self_.php', + 'phpDocumentor\\Reflection\\Types\\Static_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Static_.php', + 'phpDocumentor\\Reflection\\Types\\String_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/String_.php', + 'phpDocumentor\\Reflection\\Types\\This' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/This.php', + 'phpDocumentor\\Reflection\\Types\\Void_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Void_.php', + 'phpDocumentor\\Reflection\\Utils' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Utils.php', ); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index 920b04eb..d238b9c7 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -2,12 +2,17 @@ // autoload_files.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( + 'e8aa6e4b5a1db2f56ae794f1505391a8' => $vendorDir . '/amphp/amp/lib/functions.php', + '76cd0796156622033397994f25b0d8fc' => $vendorDir . '/amphp/amp/lib/Internal/functions.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', + 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', - 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', + '6cd5651c4fef5ed6b63e8d8b8ffbf3cc' => $vendorDir . '/amphp/byte-stream/lib/functions.php', + 'dc51568953534d6c54b08731e61104e2' => $vendorDir . '/vimeo/psalm/src/functions.php', + '8e4171839e12546525126d38dac3dafa' => $vendorDir . '/vimeo/psalm/src/spl_object_id.php', ); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php index b7fc0125..e79487ed 100644 --- a/vendor/composer/autoload_namespaces.php +++ b/vendor/composer/autoload_namespaces.php @@ -2,8 +2,10 @@ // autoload_namespaces.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( + 'LSS' => array($vendorDir . '/openlss/lib-array2xml'), + 'JsonMapper' => array($vendorDir . '/netresearch/jsonmapper/src'), ); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 53254961..ec80265a 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -2,16 +2,31 @@ // autoload_psr4.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( + 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'), + 'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'), + 'Webmozart\\PathUtil\\' => array($vendorDir . '/webmozart/path-util/src'), + 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), + 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), + 'Psalm\\' => array($vendorDir . '/vimeo/psalm/src/Psalm'), + 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), + 'PackageVersions\\' => array($vendorDir . '/composer/package-versions-deprecated/src/PackageVersions'), 'NC\\Updater\\' => array($baseDir . '/lib'), + 'LanguageServerProtocol\\' => array($vendorDir . '/felixfbecker/language-server-protocol/src'), + 'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), + 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), + 'Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), 'Bamarni\\Composer\\Bin\\' => array($vendorDir . '/bamarni/composer-bin-plugin/src'), + 'Amp\\ByteStream\\' => array($vendorDir . '/amphp/byte-stream/lib'), + 'Amp\\' => array($vendorDir . '/amphp/amp/lib'), + 'AdvancedJsonRpc\\' => array($vendorDir . '/felixfbecker/advanced-json-rpc/lib'), ); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 5cd1eb8a..c550b7ed 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -22,30 +22,19 @@ public static function getLoader() return self::$loader; } + require __DIR__ . '/platform_check.php'; + spl_autoload_register(array('ComposerAutoloaderInit2723bf3c902a907c44396c9253500aff', 'loadClassLoader'), true, true); - self::$loader = $loader = new \Composer\Autoload\ClassLoader(); + self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); spl_autoload_unregister(array('ComposerAutoloaderInit2723bf3c902a907c44396c9253500aff', 'loadClassLoader')); - $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInit2723bf3c902a907c44396c9253500aff::getInitializer($loader)); - } else { - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } + require __DIR__ . '/autoload_static.php'; + call_user_func(\Composer\Autoload\ComposerStaticInit2723bf3c902a907c44396c9253500aff::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInit2723bf3c902a907c44396c9253500aff::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } + $includeFiles = \Composer\Autoload\ComposerStaticInit2723bf3c902a907c44396c9253500aff::$files; foreach ($includeFiles as $fileIdentifier => $file) { composerRequire2723bf3c902a907c44396c9253500aff($fileIdentifier, $file); } @@ -54,11 +43,16 @@ public static function getLoader() } } +/** + * @param string $fileIdentifier + * @param string $file + * @return void + */ function composerRequire2723bf3c902a907c44396c9253500aff($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - require $file; - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; } } diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index d6355f20..6f1c6bdf 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -7,13 +7,31 @@ class ComposerStaticInit2723bf3c902a907c44396c9253500aff { public static $files = array ( + 'e8aa6e4b5a1db2f56ae794f1505391a8' => __DIR__ . '/..' . '/amphp/amp/lib/functions.php', + '76cd0796156622033397994f25b0d8fc' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/functions.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', + 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', - 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', + '6cd5651c4fef5ed6b63e8d8b8ffbf3cc' => __DIR__ . '/..' . '/amphp/byte-stream/lib/functions.php', + 'dc51568953534d6c54b08731e61104e2' => __DIR__ . '/..' . '/vimeo/psalm/src/functions.php', + '8e4171839e12546525126d38dac3dafa' => __DIR__ . '/..' . '/vimeo/psalm/src/spl_object_id.php', ); public static $prefixLengthsPsr4 = array ( + 'p' => + array ( + 'phpDocumentor\\Reflection\\' => 25, + ), + 'X' => + array ( + 'XdgBaseDir\\' => 11, + ), + 'W' => + array ( + 'Webmozart\\PathUtil\\' => 19, + 'Webmozart\\Assert\\' => 17, + ), 'S' => array ( 'Symfony\\Polyfill\\Php80\\' => 23, @@ -24,19 +42,57 @@ class ComposerStaticInit2723bf3c902a907c44396c9253500aff ), 'P' => array ( + 'Psr\\Log\\' => 8, 'Psr\\Container\\' => 14, + 'Psalm\\' => 6, + 'PhpParser\\' => 10, + 'PackageVersions\\' => 16, ), 'N' => array ( 'NC\\Updater\\' => 11, ), + 'L' => + array ( + 'LanguageServerProtocol\\' => 23, + ), + 'C' => + array ( + 'Composer\\XdebugHandler\\' => 23, + 'Composer\\Semver\\' => 16, + 'Composer\\Pcre\\' => 14, + ), 'B' => array ( 'Bamarni\\Composer\\Bin\\' => 21, ), + 'A' => + array ( + 'Amp\\ByteStream\\' => 15, + 'Amp\\' => 4, + 'AdvancedJsonRpc\\' => 16, + ), ); public static $prefixDirsPsr4 = array ( + 'phpDocumentor\\Reflection\\' => + array ( + 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', + 1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', + 2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', + ), + 'XdgBaseDir\\' => + array ( + 0 => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src', + ), + 'Webmozart\\PathUtil\\' => + array ( + 0 => __DIR__ . '/..' . '/webmozart/path-util/src', + ), + 'Webmozart\\Assert\\' => + array ( + 0 => __DIR__ . '/..' . '/webmozart/assert/src', + ), 'Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', @@ -57,37 +113,1684 @@ class ComposerStaticInit2723bf3c902a907c44396c9253500aff array ( 0 => __DIR__ . '/..' . '/symfony/console', ), + 'Psr\\Log\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', + ), 'Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), + 'Psalm\\' => + array ( + 0 => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm', + ), + 'PhpParser\\' => + array ( + 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', + ), + 'PackageVersions\\' => + array ( + 0 => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions', + ), 'NC\\Updater\\' => array ( 0 => __DIR__ . '/../..' . '/lib', ), + 'LanguageServerProtocol\\' => + array ( + 0 => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src', + ), + 'Composer\\XdebugHandler\\' => + array ( + 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', + ), + 'Composer\\Semver\\' => + array ( + 0 => __DIR__ . '/..' . '/composer/semver/src', + ), + 'Composer\\Pcre\\' => + array ( + 0 => __DIR__ . '/..' . '/composer/pcre/src', + ), 'Bamarni\\Composer\\Bin\\' => array ( 0 => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src', ), + 'Amp\\ByteStream\\' => + array ( + 0 => __DIR__ . '/..' . '/amphp/byte-stream/lib', + ), + 'Amp\\' => + array ( + 0 => __DIR__ . '/..' . '/amphp/amp/lib', + ), + 'AdvancedJsonRpc\\' => + array ( + 0 => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib', + ), + ); + + public static $prefixesPsr0 = array ( + 'L' => + array ( + 'LSS' => + array ( + 0 => __DIR__ . '/..' . '/openlss/lib-array2xml', + ), + ), + 'J' => + array ( + 'JsonMapper' => + array ( + 0 => __DIR__ . '/..' . '/netresearch/jsonmapper/src', + ), + ), ); public static $classMap = array ( + 'AdvancedJsonRpc\\Dispatcher' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Dispatcher.php', + 'AdvancedJsonRpc\\Error' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Error.php', + 'AdvancedJsonRpc\\ErrorCode' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/ErrorCode.php', + 'AdvancedJsonRpc\\ErrorResponse' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/ErrorResponse.php', + 'AdvancedJsonRpc\\Message' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Message.php', + 'AdvancedJsonRpc\\Notification' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Notification.php', + 'AdvancedJsonRpc\\Request' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Request.php', + 'AdvancedJsonRpc\\Response' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Response.php', + 'AdvancedJsonRpc\\SuccessResponse' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php', + 'Amp\\ByteStream\\Base64\\Base64DecodingInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php', + 'Amp\\ByteStream\\Base64\\Base64DecodingOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php', + 'Amp\\ByteStream\\Base64\\Base64EncodingInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php', + 'Amp\\ByteStream\\Base64\\Base64EncodingOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php', + 'Amp\\ByteStream\\ClosedException' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ClosedException.php', + 'Amp\\ByteStream\\InMemoryStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InMemoryStream.php', + 'Amp\\ByteStream\\InputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InputStream.php', + 'Amp\\ByteStream\\InputStreamChain' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InputStreamChain.php', + 'Amp\\ByteStream\\IteratorStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/IteratorStream.php', + 'Amp\\ByteStream\\LineReader' => __DIR__ . '/..' . '/amphp/byte-stream/lib/LineReader.php', + 'Amp\\ByteStream\\Message' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Message.php', + 'Amp\\ByteStream\\OutputBuffer' => __DIR__ . '/..' . '/amphp/byte-stream/lib/OutputBuffer.php', + 'Amp\\ByteStream\\OutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/OutputStream.php', + 'Amp\\ByteStream\\Payload' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Payload.php', + 'Amp\\ByteStream\\PendingReadError' => __DIR__ . '/..' . '/amphp/byte-stream/lib/PendingReadError.php', + 'Amp\\ByteStream\\ResourceInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ResourceInputStream.php', + 'Amp\\ByteStream\\ResourceOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ResourceOutputStream.php', + 'Amp\\ByteStream\\StreamException' => __DIR__ . '/..' . '/amphp/byte-stream/lib/StreamException.php', + 'Amp\\ByteStream\\ZlibInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ZlibInputStream.php', + 'Amp\\ByteStream\\ZlibOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ZlibOutputStream.php', + 'Amp\\CallableMaker' => __DIR__ . '/..' . '/amphp/amp/lib/CallableMaker.php', + 'Amp\\CancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/CancellationToken.php', + 'Amp\\CancellationTokenSource' => __DIR__ . '/..' . '/amphp/amp/lib/CancellationTokenSource.php', + 'Amp\\CancelledException' => __DIR__ . '/..' . '/amphp/amp/lib/CancelledException.php', + 'Amp\\CombinedCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/CombinedCancellationToken.php', + 'Amp\\Coroutine' => __DIR__ . '/..' . '/amphp/amp/lib/Coroutine.php', + 'Amp\\Deferred' => __DIR__ . '/..' . '/amphp/amp/lib/Deferred.php', + 'Amp\\Delayed' => __DIR__ . '/..' . '/amphp/amp/lib/Delayed.php', + 'Amp\\Emitter' => __DIR__ . '/..' . '/amphp/amp/lib/Emitter.php', + 'Amp\\Failure' => __DIR__ . '/..' . '/amphp/amp/lib/Failure.php', + 'Amp\\Internal\\Placeholder' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/Placeholder.php', + 'Amp\\Internal\\PrivateIterator' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/PrivateIterator.php', + 'Amp\\Internal\\PrivatePromise' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/PrivatePromise.php', + 'Amp\\Internal\\Producer' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/Producer.php', + 'Amp\\Internal\\ResolutionQueue' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/ResolutionQueue.php', + 'Amp\\InvalidYieldError' => __DIR__ . '/..' . '/amphp/amp/lib/InvalidYieldError.php', + 'Amp\\Iterator' => __DIR__ . '/..' . '/amphp/amp/lib/Iterator.php', + 'Amp\\LazyPromise' => __DIR__ . '/..' . '/amphp/amp/lib/LazyPromise.php', + 'Amp\\Loop' => __DIR__ . '/..' . '/amphp/amp/lib/Loop.php', + 'Amp\\Loop\\Driver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Driver.php', + 'Amp\\Loop\\DriverFactory' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/DriverFactory.php', + 'Amp\\Loop\\EvDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/EvDriver.php', + 'Amp\\Loop\\EventDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/EventDriver.php', + 'Amp\\Loop\\Internal\\TimerQueue' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Internal/TimerQueue.php', + 'Amp\\Loop\\InvalidWatcherError' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/InvalidWatcherError.php', + 'Amp\\Loop\\NativeDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/NativeDriver.php', + 'Amp\\Loop\\TracingDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/TracingDriver.php', + 'Amp\\Loop\\UnsupportedFeatureException' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/UnsupportedFeatureException.php', + 'Amp\\Loop\\UvDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/UvDriver.php', + 'Amp\\Loop\\Watcher' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Watcher.php', + 'Amp\\MultiReasonException' => __DIR__ . '/..' . '/amphp/amp/lib/MultiReasonException.php', + 'Amp\\NullCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/NullCancellationToken.php', + 'Amp\\Producer' => __DIR__ . '/..' . '/amphp/amp/lib/Producer.php', + 'Amp\\Promise' => __DIR__ . '/..' . '/amphp/amp/lib/Promise.php', + 'Amp\\Struct' => __DIR__ . '/..' . '/amphp/amp/lib/Struct.php', + 'Amp\\Success' => __DIR__ . '/..' . '/amphp/amp/lib/Success.php', + 'Amp\\TimeoutCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/TimeoutCancellationToken.php', + 'Amp\\TimeoutException' => __DIR__ . '/..' . '/amphp/amp/lib/TimeoutException.php', 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Bamarni\\Composer\\Bin\\BinCommand' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/BinCommand.php', 'Bamarni\\Composer\\Bin\\CommandProvider' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/CommandProvider.php', 'Bamarni\\Composer\\Bin\\Config' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Config.php', 'Bamarni\\Composer\\Bin\\Plugin' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Plugin.php', + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Composer\\Pcre\\MatchAllResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllResult.php', + 'Composer\\Pcre\\MatchAllWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllWithOffsetsResult.php', + 'Composer\\Pcre\\MatchResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchResult.php', + 'Composer\\Pcre\\MatchWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchWithOffsetsResult.php', + 'Composer\\Pcre\\PcreException' => __DIR__ . '/..' . '/composer/pcre/src/PcreException.php', + 'Composer\\Pcre\\Preg' => __DIR__ . '/..' . '/composer/pcre/src/Preg.php', + 'Composer\\Pcre\\Regex' => __DIR__ . '/..' . '/composer/pcre/src/Regex.php', + 'Composer\\Pcre\\ReplaceResult' => __DIR__ . '/..' . '/composer/pcre/src/ReplaceResult.php', + 'Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', + 'Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php', + 'Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php', + 'Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', + 'Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', + 'Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php', + 'Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php', + 'Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', + 'Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php', + 'Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php', + 'Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', + 'Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', + 'Composer\\XdebugHandler\\PhpConfig' => __DIR__ . '/..' . '/composer/xdebug-handler/src/PhpConfig.php', + 'Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php', + 'Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php', + 'Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php', 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', + 'JsonMapper' => __DIR__ . '/..' . '/netresearch/jsonmapper/src/JsonMapper.php', + 'JsonMapper_Exception' => __DIR__ . '/..' . '/netresearch/jsonmapper/src/JsonMapper/Exception.php', + 'LSS\\Array2XML' => __DIR__ . '/..' . '/openlss/lib-array2xml/LSS/Array2XML.php', + 'LSS\\XML2Array' => __DIR__ . '/..' . '/openlss/lib-array2xml/LSS/XML2Array.php', + 'LanguageServerProtocol\\CallHierarchyClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php', + 'LanguageServerProtocol\\ChangeAnnotation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ChangeAnnotation.php', + 'LanguageServerProtocol\\ClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilities.php', + 'LanguageServerProtocol\\ClientCapabilitiesGeneral' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php', + 'LanguageServerProtocol\\ClientCapabilitiesWindow' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php', + 'LanguageServerProtocol\\ClientCapabilitiesWorkspace' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php', + 'LanguageServerProtocol\\ClientCapabilitiesWorkspaceFileOperations' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspaceFileOperations.php', + 'LanguageServerProtocol\\ClientInfo' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientInfo.php', + 'LanguageServerProtocol\\CodeAction' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeAction.php', + 'LanguageServerProtocol\\CodeActionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php', + 'LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php', + 'LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php', + 'LanguageServerProtocol\\CodeActionClientCapabilitiesResolveSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php', + 'LanguageServerProtocol\\CodeActionContext' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionContext.php', + 'LanguageServerProtocol\\CodeActionDisabled' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionDisabled.php', + 'LanguageServerProtocol\\CodeActionKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionKind.php', + 'LanguageServerProtocol\\CodeActionTriggerKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionTriggerKind.php', + 'LanguageServerProtocol\\CodeDescription' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeDescription.php', + 'LanguageServerProtocol\\CodeLens' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLens.php', + 'LanguageServerProtocol\\CodeLensClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php', + 'LanguageServerProtocol\\CodeLensOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLensOptions.php', + 'LanguageServerProtocol\\CodeLensWorkspaceClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php', + 'LanguageServerProtocol\\Command' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Command.php', + 'LanguageServerProtocol\\CompletionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php', + 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php', + 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemInsertTextModeSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php', + 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemResolveSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php', + 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php', + 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionList' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php', + 'LanguageServerProtocol\\CompletionContext' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionContext.php', + 'LanguageServerProtocol\\CompletionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItem.php', + 'LanguageServerProtocol\\CompletionItemKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItemKind.php', + 'LanguageServerProtocol\\CompletionItemLabelDetails' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItemLabelDetails.php', + 'LanguageServerProtocol\\CompletionItemTag' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItemTag.php', + 'LanguageServerProtocol\\CompletionList' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionList.php', + 'LanguageServerProtocol\\CompletionOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionOptions.php', + 'LanguageServerProtocol\\CompletionTriggerKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php', + 'LanguageServerProtocol\\ContentChangeEvent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ContentChangeEvent.php', + 'LanguageServerProtocol\\DeclarationClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php', + 'LanguageServerProtocol\\DefinitionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php', + 'LanguageServerProtocol\\DependencyReference' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DependencyReference.php', + 'LanguageServerProtocol\\Diagnostic' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Diagnostic.php', + 'LanguageServerProtocol\\DiagnosticRelatedInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php', + 'LanguageServerProtocol\\DiagnosticSeverity' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php', + 'LanguageServerProtocol\\DiagnosticTag' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DiagnosticTag.php', + 'LanguageServerProtocol\\DidChangeConfigurationClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DidChangeConfigurationClientCapabilities.php', + 'LanguageServerProtocol\\DidChangeWatchedFilesClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php', + 'LanguageServerProtocol\\DocumentColorClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php', + 'LanguageServerProtocol\\DocumentFormattingClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php', + 'LanguageServerProtocol\\DocumentHighlight' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentHighlight.php', + 'LanguageServerProtocol\\DocumentHighlightClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php', + 'LanguageServerProtocol\\DocumentHighlightKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php', + 'LanguageServerProtocol\\DocumentLinkClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentLinkClientCapabilities.php', + 'LanguageServerProtocol\\DocumentOnTypeFormattingClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php', + 'LanguageServerProtocol\\DocumentOnTypeFormattingOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php', + 'LanguageServerProtocol\\DocumentRangeFormattingClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php', + 'LanguageServerProtocol\\DocumentSymbolClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php', + 'LanguageServerProtocol\\DocumentSymbolClientCapabilitiesSymbolKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php', + 'LanguageServerProtocol\\DocumentSymbolClientCapabilitiesTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php', + 'LanguageServerProtocol\\ErrorCode' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ErrorCode.php', + 'LanguageServerProtocol\\ExecuteCommandClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ExecuteCommandClientCapabilities.php', + 'LanguageServerProtocol\\ExecuteCommandOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php', + 'LanguageServerProtocol\\FailureHandlingKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FailureHandlingKind.php', + 'LanguageServerProtocol\\FileChangeType' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FileChangeType.php', + 'LanguageServerProtocol\\FileEvent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FileEvent.php', + 'LanguageServerProtocol\\FoldingRangeClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php', + 'LanguageServerProtocol\\FormattingOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FormattingOptions.php', + 'LanguageServerProtocol\\Hover' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Hover.php', + 'LanguageServerProtocol\\HoverClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php', + 'LanguageServerProtocol\\ImplementationClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php', + 'LanguageServerProtocol\\InitializeResult' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InitializeResult.php', + 'LanguageServerProtocol\\InitializeResultServerInfo' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php', + 'LanguageServerProtocol\\InsertTextFormat' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InsertTextFormat.php', + 'LanguageServerProtocol\\InsertTextMode' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InsertTextMode.php', + 'LanguageServerProtocol\\LinkedEditingRangeClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php', + 'LanguageServerProtocol\\Location' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Location.php', + 'LanguageServerProtocol\\LogMessage' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/LogMessage.php', + 'LanguageServerProtocol\\LogTrace' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/LogTrace.php', + 'LanguageServerProtocol\\MarkdownClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php', + 'LanguageServerProtocol\\MarkedString' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkedString.php', + 'LanguageServerProtocol\\MarkupContent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkupContent.php', + 'LanguageServerProtocol\\MarkupKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkupKind.php', + 'LanguageServerProtocol\\MessageActionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MessageActionItem.php', + 'LanguageServerProtocol\\MessageType' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MessageType.php', + 'LanguageServerProtocol\\MonikerClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MonikerClientCapabilities.php', + 'LanguageServerProtocol\\PackageDescriptor' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PackageDescriptor.php', + 'LanguageServerProtocol\\ParameterInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ParameterInformation.php', + 'LanguageServerProtocol\\Position' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Position.php', + 'LanguageServerProtocol\\PrepareSupportDefaultBehavior' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php', + 'LanguageServerProtocol\\PublishDiagnosticsClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilities.php', + 'LanguageServerProtocol\\PublishDiagnosticsClientCapabilitiesTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php', + 'LanguageServerProtocol\\Range' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Range.php', + 'LanguageServerProtocol\\ReferenceClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php', + 'LanguageServerProtocol\\ReferenceContext' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ReferenceContext.php', + 'LanguageServerProtocol\\ReferenceInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ReferenceInformation.php', + 'LanguageServerProtocol\\RegularExpressionsClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php', + 'LanguageServerProtocol\\RenameClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php', + 'LanguageServerProtocol\\ResourceOperationKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ResourceOperationKind.php', + 'LanguageServerProtocol\\SaveOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SaveOptions.php', + 'LanguageServerProtocol\\SelectionRangeClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SelectionRangeClientCapabilities.php', + 'LanguageServerProtocol\\SemanticTokensClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php', + 'LanguageServerProtocol\\SemanticTokensClientCapabilitiesRequests' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php', + 'LanguageServerProtocol\\SemanticTokensWorkspaceClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php', + 'LanguageServerProtocol\\ServerCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ServerCapabilities.php', + 'LanguageServerProtocol\\ShowDocumentClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ShowDocumentClientCapabilities.php', + 'LanguageServerProtocol\\ShowMessageRequestClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php', + 'LanguageServerProtocol\\ShowMessageRequestClientCapabilitiesMessageActionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php', + 'LanguageServerProtocol\\SignatureHelp' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelp.php', + 'LanguageServerProtocol\\SignatureHelpClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php', + 'LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php', + 'LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformationParameterInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php', + 'LanguageServerProtocol\\SignatureHelpOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php', + 'LanguageServerProtocol\\SignatureInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureInformation.php', + 'LanguageServerProtocol\\SymbolDescriptor' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolDescriptor.php', + 'LanguageServerProtocol\\SymbolInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolInformation.php', + 'LanguageServerProtocol\\SymbolKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolKind.php', + 'LanguageServerProtocol\\SymbolLocationInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolLocationInformation.php', + 'LanguageServerProtocol\\SymbolTag' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolTag.php', + 'LanguageServerProtocol\\TextDocumentClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentClientCapabilities.php', + 'LanguageServerProtocol\\TextDocumentContentChangeEvent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php', + 'LanguageServerProtocol\\TextDocumentIdentifier' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php', + 'LanguageServerProtocol\\TextDocumentItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentItem.php', + 'LanguageServerProtocol\\TextDocumentSyncClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php', + 'LanguageServerProtocol\\TextDocumentSyncKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php', + 'LanguageServerProtocol\\TextDocumentSyncOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentSyncOptions.php', + 'LanguageServerProtocol\\TextEdit' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextEdit.php', + 'LanguageServerProtocol\\TokenFormat' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TokenFormat.php', + 'LanguageServerProtocol\\TypeDefinitionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TypeDefinitionClientCapabilities.php', + 'LanguageServerProtocol\\VersionedTextDocumentIdentifier' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php', + 'LanguageServerProtocol\\WorkspaceEdit' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceEdit.php', + 'LanguageServerProtocol\\WorkspaceEditClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php', + 'LanguageServerProtocol\\WorkspaceEditClientCapabilitiesChangeAnnotationSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php', + 'LanguageServerProtocol\\WorkspaceFolder' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceFolder.php', + 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php', + 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesResolveSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php', + 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesSymbolKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php', + 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php', 'NC\\Updater\\CommandApplication' => __DIR__ . '/../..' . '/lib/CommandApplication.php', 'NC\\Updater\\LogException' => __DIR__ . '/../..' . '/lib/LogException.php', 'NC\\Updater\\RecursiveDirectoryIteratorWithoutData' => __DIR__ . '/../..' . '/lib/RecursiveDirectoryIteratorWithoutData.php', 'NC\\Updater\\UpdateCommand' => __DIR__ . '/../..' . '/lib/UpdateCommand.php', 'NC\\Updater\\UpdateException' => __DIR__ . '/../..' . '/lib/UpdateException.php', 'NC\\Updater\\Updater' => __DIR__ . '/../..' . '/lib/Updater.php', + 'PackageVersions\\FallbackVersions' => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php', + 'PackageVersions\\Installer' => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions/Installer.php', + 'PackageVersions\\Versions' => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions/Versions.php', + 'PhpParser\\Builder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder.php', + 'PhpParser\\BuilderFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', + 'PhpParser\\BuilderHelpers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', + 'PhpParser\\Builder\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php', + 'PhpParser\\Builder\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', + 'PhpParser\\Builder\\Declaration' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', + 'PhpParser\\Builder\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php', + 'PhpParser\\Builder\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php', + 'PhpParser\\Builder\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', + 'PhpParser\\Builder\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', + 'PhpParser\\Builder\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', + 'PhpParser\\Builder\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', + 'PhpParser\\Builder\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', + 'PhpParser\\Builder\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', + 'PhpParser\\Builder\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', + 'PhpParser\\Builder\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', + 'PhpParser\\Builder\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', + 'PhpParser\\Builder\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', + 'PhpParser\\Builder\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', + 'PhpParser\\Comment' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment.php', + 'PhpParser\\Comment\\Doc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', + 'PhpParser\\ConstExprEvaluationException' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', + 'PhpParser\\ConstExprEvaluator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', + 'PhpParser\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Error.php', + 'PhpParser\\ErrorHandler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', + 'PhpParser\\ErrorHandler\\Collecting' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', + 'PhpParser\\ErrorHandler\\Throwing' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', + 'PhpParser\\Internal\\DiffElem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', + 'PhpParser\\Internal\\Differ' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', + 'PhpParser\\Internal\\PrintableNewAnonClassNode' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', + 'PhpParser\\Internal\\TokenStream' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', + 'PhpParser\\JsonDecoder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', + 'PhpParser\\Lexer' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer.php', + 'PhpParser\\Lexer\\Emulative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', + 'PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', + 'PhpParser\\NameContext' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NameContext.php', + 'PhpParser\\Node' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node.php', + 'PhpParser\\NodeAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', + 'PhpParser\\NodeDumper' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', + 'PhpParser\\NodeFinder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', + 'PhpParser\\NodeTraverser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', + 'PhpParser\\NodeTraverserInterface' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', + 'PhpParser\\NodeVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', + 'PhpParser\\NodeVisitorAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', + 'PhpParser\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', + 'PhpParser\\NodeVisitor\\FindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', + 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', + 'PhpParser\\NodeVisitor\\NameResolver' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', + 'PhpParser\\NodeVisitor\\NodeConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', + 'PhpParser\\NodeVisitor\\ParentConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', + 'PhpParser\\Node\\Arg' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', + 'PhpParser\\Node\\Attribute' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', + 'PhpParser\\Node\\AttributeGroup' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', + 'PhpParser\\Node\\ComplexType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', + 'PhpParser\\Node\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', + 'PhpParser\\Node\\Expr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', + 'PhpParser\\Node\\Expr\\ArrayDimFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', + 'PhpParser\\Node\\Expr\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', + 'PhpParser\\Node\\Expr\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', + 'PhpParser\\Node\\Expr\\ArrowFunction' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', + 'PhpParser\\Node\\Expr\\Assign' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', + 'PhpParser\\Node\\Expr\\AssignOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', + 'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', + 'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', + 'PhpParser\\Node\\Expr\\AssignRef' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', + 'PhpParser\\Node\\Expr\\BinaryOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', + 'PhpParser\\Node\\Expr\\BitwiseNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', + 'PhpParser\\Node\\Expr\\BooleanNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', + 'PhpParser\\Node\\Expr\\CallLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php', + 'PhpParser\\Node\\Expr\\Cast' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', + 'PhpParser\\Node\\Expr\\Cast\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', + 'PhpParser\\Node\\Expr\\Cast\\Bool_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', + 'PhpParser\\Node\\Expr\\Cast\\Double' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', + 'PhpParser\\Node\\Expr\\Cast\\Int_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', + 'PhpParser\\Node\\Expr\\Cast\\Object_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', + 'PhpParser\\Node\\Expr\\Cast\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', + 'PhpParser\\Node\\Expr\\Cast\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', + 'PhpParser\\Node\\Expr\\ClassConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', + 'PhpParser\\Node\\Expr\\Clone_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', + 'PhpParser\\Node\\Expr\\Closure' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', + 'PhpParser\\Node\\Expr\\ClosureUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', + 'PhpParser\\Node\\Expr\\ConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', + 'PhpParser\\Node\\Expr\\Empty_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', + 'PhpParser\\Node\\Expr\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', + 'PhpParser\\Node\\Expr\\ErrorSuppress' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', + 'PhpParser\\Node\\Expr\\Eval_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', + 'PhpParser\\Node\\Expr\\Exit_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', + 'PhpParser\\Node\\Expr\\FuncCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', + 'PhpParser\\Node\\Expr\\Include_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', + 'PhpParser\\Node\\Expr\\Instanceof_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', + 'PhpParser\\Node\\Expr\\Isset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', + 'PhpParser\\Node\\Expr\\List_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', + 'PhpParser\\Node\\Expr\\Match_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php', + 'PhpParser\\Node\\Expr\\MethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', + 'PhpParser\\Node\\Expr\\New_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', + 'PhpParser\\Node\\Expr\\NullsafeMethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php', + 'PhpParser\\Node\\Expr\\NullsafePropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php', + 'PhpParser\\Node\\Expr\\PostDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', + 'PhpParser\\Node\\Expr\\PostInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', + 'PhpParser\\Node\\Expr\\PreDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', + 'PhpParser\\Node\\Expr\\PreInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', + 'PhpParser\\Node\\Expr\\Print_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', + 'PhpParser\\Node\\Expr\\PropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', + 'PhpParser\\Node\\Expr\\ShellExec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', + 'PhpParser\\Node\\Expr\\StaticCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', + 'PhpParser\\Node\\Expr\\StaticPropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', + 'PhpParser\\Node\\Expr\\Ternary' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', + 'PhpParser\\Node\\Expr\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php', + 'PhpParser\\Node\\Expr\\UnaryMinus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', + 'PhpParser\\Node\\Expr\\UnaryPlus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', + 'PhpParser\\Node\\Expr\\Variable' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', + 'PhpParser\\Node\\Expr\\YieldFrom' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', + 'PhpParser\\Node\\Expr\\Yield_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', + 'PhpParser\\Node\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', + 'PhpParser\\Node\\Identifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', + 'PhpParser\\Node\\IntersectionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', + 'PhpParser\\Node\\MatchArm' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', + 'PhpParser\\Node\\Name' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name.php', + 'PhpParser\\Node\\Name\\FullyQualified' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', + 'PhpParser\\Node\\Name\\Relative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', + 'PhpParser\\Node\\NullableType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', + 'PhpParser\\Node\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Param.php', + 'PhpParser\\Node\\Scalar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', + 'PhpParser\\Node\\Scalar\\DNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', + 'PhpParser\\Node\\Scalar\\Encapsed' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', + 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', + 'PhpParser\\Node\\Scalar\\LNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', + 'PhpParser\\Node\\Scalar\\MagicConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\File' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', + 'PhpParser\\Node\\Scalar\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', + 'PhpParser\\Node\\Stmt' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', + 'PhpParser\\Node\\Stmt\\Break_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', + 'PhpParser\\Node\\Stmt\\Case_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', + 'PhpParser\\Node\\Stmt\\Catch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', + 'PhpParser\\Node\\Stmt\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', + 'PhpParser\\Node\\Stmt\\ClassLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', + 'PhpParser\\Node\\Stmt\\ClassMethod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', + 'PhpParser\\Node\\Stmt\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', + 'PhpParser\\Node\\Stmt\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', + 'PhpParser\\Node\\Stmt\\Continue_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', + 'PhpParser\\Node\\Stmt\\DeclareDeclare' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', + 'PhpParser\\Node\\Stmt\\Declare_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', + 'PhpParser\\Node\\Stmt\\Do_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', + 'PhpParser\\Node\\Stmt\\Echo_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', + 'PhpParser\\Node\\Stmt\\ElseIf_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', + 'PhpParser\\Node\\Stmt\\Else_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', + 'PhpParser\\Node\\Stmt\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php', + 'PhpParser\\Node\\Stmt\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php', + 'PhpParser\\Node\\Stmt\\Expression' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', + 'PhpParser\\Node\\Stmt\\Finally_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', + 'PhpParser\\Node\\Stmt\\For_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', + 'PhpParser\\Node\\Stmt\\Foreach_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', + 'PhpParser\\Node\\Stmt\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', + 'PhpParser\\Node\\Stmt\\Global_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', + 'PhpParser\\Node\\Stmt\\Goto_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', + 'PhpParser\\Node\\Stmt\\GroupUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', + 'PhpParser\\Node\\Stmt\\HaltCompiler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', + 'PhpParser\\Node\\Stmt\\If_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', + 'PhpParser\\Node\\Stmt\\InlineHTML' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', + 'PhpParser\\Node\\Stmt\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', + 'PhpParser\\Node\\Stmt\\Label' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', + 'PhpParser\\Node\\Stmt\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', + 'PhpParser\\Node\\Stmt\\Nop' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', + 'PhpParser\\Node\\Stmt\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', + 'PhpParser\\Node\\Stmt\\PropertyProperty' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', + 'PhpParser\\Node\\Stmt\\Return_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', + 'PhpParser\\Node\\Stmt\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', + 'PhpParser\\Node\\Stmt\\Static_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', + 'PhpParser\\Node\\Stmt\\Switch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', + 'PhpParser\\Node\\Stmt\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', + 'PhpParser\\Node\\Stmt\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', + 'PhpParser\\Node\\Stmt\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', + 'PhpParser\\Node\\Stmt\\TryCatch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', + 'PhpParser\\Node\\Stmt\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', + 'PhpParser\\Node\\Stmt\\UseUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', + 'PhpParser\\Node\\Stmt\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', + 'PhpParser\\Node\\Stmt\\While_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', + 'PhpParser\\Node\\UnionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', + 'PhpParser\\Node\\VarLikeIdentifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', + 'PhpParser\\Node\\VariadicPlaceholder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', + 'PhpParser\\Parser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser.php', + 'PhpParser\\ParserAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', + 'PhpParser\\ParserFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', + 'PhpParser\\Parser\\Multiple' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', + 'PhpParser\\Parser\\Php5' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', + 'PhpParser\\Parser\\Php7' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', + 'PhpParser\\Parser\\Tokens' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', + 'PhpParser\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', + 'PhpParser\\PrettyPrinter\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'Psalm\\Aliases' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Aliases.php', + 'Psalm\\CodeLocation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/CodeLocation.php', + 'Psalm\\CodeLocation\\DocblockTypeLocation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php', + 'Psalm\\CodeLocation\\ParseErrorLocation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php', + 'Psalm\\CodeLocation\\Raw' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/CodeLocation/Raw.php', + 'Psalm\\Codebase' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Codebase.php', + 'Psalm\\Config' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config.php', + 'Psalm\\Config\\Creator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/Creator.php', + 'Psalm\\Config\\ErrorLevelFileFilter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php', + 'Psalm\\Config\\FileFilter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/FileFilter.php', + 'Psalm\\Config\\IssueHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/IssueHandler.php', + 'Psalm\\Config\\ProjectFileFilter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php', + 'Psalm\\Config\\TaintAnalysisFileFilter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php', + 'Psalm\\Context' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Context.php', + 'Psalm\\DocComment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/DocComment.php', + 'Psalm\\ErrorBaseline' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/ErrorBaseline.php', + 'Psalm\\Exception\\CircularReferenceException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php', + 'Psalm\\Exception\\CodeException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/CodeException.php', + 'Psalm\\Exception\\ComplicatedExpressionException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/ComplicatedExpressionException.php', + 'Psalm\\Exception\\ConfigCreationException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/ConfigCreationException.php', + 'Psalm\\Exception\\ConfigException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/ConfigException.php', + 'Psalm\\Exception\\ConfigNotFoundException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/ConfigNotFoundException.php', + 'Psalm\\Exception\\DocblockParseException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/DocblockParseException.php', + 'Psalm\\Exception\\FileIncludeException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/FileIncludeException.php', + 'Psalm\\Exception\\IncorrectDocblockException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/IncorrectDocblockException.php', + 'Psalm\\Exception\\InvalidClasslikeOverrideException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/InvalidClasslikeOverrideException.php', + 'Psalm\\Exception\\InvalidMethodOverrideException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/InvalidMethodOverrideException.php', + 'Psalm\\Exception\\RefactorException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/RefactorException.php', + 'Psalm\\Exception\\ScopeAnalysisException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/ScopeAnalysisException.php', + 'Psalm\\Exception\\TypeParseTreeException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/TypeParseTreeException.php', + 'Psalm\\Exception\\UnanalyzedFileException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/UnanalyzedFileException.php', + 'Psalm\\Exception\\UnpopulatedClasslikeException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/UnpopulatedClasslikeException.php', + 'Psalm\\Exception\\UnpreparedAnalysisException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/UnpreparedAnalysisException.php', + 'Psalm\\Exception\\UnsupportedIssueToFixException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/UnsupportedIssueToFixException.php', + 'Psalm\\FileBasedPluginAdapter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/FileBasedPluginAdapter.php', + 'Psalm\\FileManipulation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/FileManipulation.php', + 'Psalm\\FileSource' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/FileSource.php', + 'Psalm\\Internal\\Algebra' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Algebra.php', + 'Psalm\\Internal\\Algebra\\FormulaGenerator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php', + 'Psalm\\Internal\\Analyzer\\AlgebraAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\AttributesAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\CanAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php', + 'Psalm\\Internal\\Analyzer\\ClassAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\ClassLikeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\ClassLikeNameOptions' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php', + 'Psalm\\Internal\\Analyzer\\ClosureAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\CommentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\DataFlowNodeData' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php', + 'Psalm\\Internal\\Analyzer\\FileAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\FunctionAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\FunctionLikeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php', + 'Psalm\\Internal\\Analyzer\\InterfaceAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\IssueData' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php', + 'Psalm\\Internal\\Analyzer\\MethodAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\MethodComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php', + 'Psalm\\Internal\\Analyzer\\NamespaceAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\ProjectAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\ScopeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\SourceAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\StatementsAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\DoAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForeachAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfConditionalAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElseAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseIfAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\IfAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\LoopAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchCaseAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\TryAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Block\\WhileAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\BreakAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\ContinueAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\EchoAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\ExpressionAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayCreationInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssertionFinder' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssignmentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\ArrayAssignmentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\AssignedProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\InstancePropertyAssignmentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\StaticPropertyAssignmentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOpAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\AndAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ArithmeticOpAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\CoalesceAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ConcatAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\NonComparisonOpAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\OrAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BitwiseNotAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BooleanNotAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentMapPopulator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentsAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArrayFunctionArgumentsAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ClassTemplateParamCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallReturnTypeFetcher' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\MethodCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicCallContext' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalysisResult' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\ExistingAtomicMethodCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallProhibitionAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallPurityAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallReturnTypeFetcher' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodVisibilityAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MissingMethodCallHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NamedFunctionCallHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NewAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\AtomicStaticCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\ExistingAtomicStaticCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CastAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CloneAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EmptyAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EncapsulatedStringAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EvalAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExitAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExpressionIdentifier' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ArrayFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\AtomicPropertyFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ClassConstFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ConstFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\InstancePropertyFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\StaticPropertyFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\VariableFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncDecExpressionAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncludeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\InstanceofAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IssetAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MagicConstAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MatchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\NullsafeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\PrintAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\SimpleTypeInferer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\TernaryAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\UnaryPlusMinusAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldFromAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\GlobalAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\ReturnAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\StaticAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\ThrowAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\UnsetAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\Statements\\UnusedAssignmentRemover' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php', + 'Psalm\\Internal\\Analyzer\\TraitAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php', + 'Psalm\\Internal\\Analyzer\\TypeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php', + 'Psalm\\Internal\\Clause' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Clause.php', + 'Psalm\\Internal\\CliUtils' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/CliUtils.php', + 'Psalm\\Internal\\Cli\\LanguageServer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php', + 'Psalm\\Internal\\Cli\\Plugin' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php', + 'Psalm\\Internal\\Cli\\Psalm' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php', + 'Psalm\\Internal\\Cli\\Psalter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php', + 'Psalm\\Internal\\Cli\\Refactor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php', + 'Psalm\\Internal\\Codebase\\Analyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php', + 'Psalm\\Internal\\Codebase\\ClassConstantByWildcardResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php', + 'Psalm\\Internal\\Codebase\\ClassLikes' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php', + 'Psalm\\Internal\\Codebase\\ConstantTypeResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php', + 'Psalm\\Internal\\Codebase\\DataFlowGraph' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php', + 'Psalm\\Internal\\Codebase\\Functions' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php', + 'Psalm\\Internal\\Codebase\\InternalCallMapHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php', + 'Psalm\\Internal\\Codebase\\Methods' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php', + 'Psalm\\Internal\\Codebase\\Populator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php', + 'Psalm\\Internal\\Codebase\\Properties' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php', + 'Psalm\\Internal\\Codebase\\PropertyMap' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php', + 'Psalm\\Internal\\Codebase\\ReferenceMapGenerator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php', + 'Psalm\\Internal\\Codebase\\Reflection' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php', + 'Psalm\\Internal\\Codebase\\Scanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php', + 'Psalm\\Internal\\Codebase\\TaintFlowGraph' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php', + 'Psalm\\Internal\\Codebase\\VariableUseGraph' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php', + 'Psalm\\Internal\\Composer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Composer.php', + 'Psalm\\Internal\\DataFlow\\DataFlowNode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/DataFlow/DataFlowNode.php', + 'Psalm\\Internal\\DataFlow\\Path' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php', + 'Psalm\\Internal\\DataFlow\\TaintSink' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php', + 'Psalm\\Internal\\DataFlow\\TaintSource' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSource.php', + 'Psalm\\Internal\\Diff\\AstDiffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/AstDiffer.php', + 'Psalm\\Internal\\Diff\\ClassStatementsDiffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php', + 'Psalm\\Internal\\Diff\\DiffElem' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php', + 'Psalm\\Internal\\Diff\\FileDiffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php', + 'Psalm\\Internal\\Diff\\FileStatementsDiffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php', + 'Psalm\\Internal\\Diff\\NamespaceStatementsDiffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php', + 'Psalm\\Internal\\ErrorHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php', + 'Psalm\\Internal\\EventDispatcher' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/EventDispatcher.php', + 'Psalm\\Internal\\ExecutionEnvironment\\BuildInfoCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php', + 'Psalm\\Internal\\ExecutionEnvironment\\GitInfoCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php', + 'Psalm\\Internal\\ExecutionEnvironment\\SystemCommandExecutor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php', + 'Psalm\\Internal\\FileManipulation\\ClassDocblockManipulator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php', + 'Psalm\\Internal\\FileManipulation\\CodeMigration' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php', + 'Psalm\\Internal\\FileManipulation\\FileManipulationBuffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php', + 'Psalm\\Internal\\FileManipulation\\FunctionDocblockManipulator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php', + 'Psalm\\Internal\\FileManipulation\\PropertyDocblockManipulator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php', + 'Psalm\\Internal\\Fork\\ForkMessage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php', + 'Psalm\\Internal\\Fork\\ForkProcessDoneMessage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php', + 'Psalm\\Internal\\Fork\\ForkProcessErrorMessage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php', + 'Psalm\\Internal\\Fork\\ForkTaskDoneMessage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php', + 'Psalm\\Internal\\Fork\\Pool' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php', + 'Psalm\\Internal\\Fork\\PsalmRestarter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php', + 'Psalm\\Internal\\IncludeCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php', + 'Psalm\\Internal\\Json\\Json' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Json/Json.php', + 'Psalm\\Internal\\LanguageServer\\ClientHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php', + 'Psalm\\Internal\\LanguageServer\\Client\\TextDocument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Client/TextDocument.php', + 'Psalm\\Internal\\LanguageServer\\EmitterInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php', + 'Psalm\\Internal\\LanguageServer\\EmitterTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php', + 'Psalm\\Internal\\LanguageServer\\IdGenerator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php', + 'Psalm\\Internal\\LanguageServer\\LanguageClient' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php', + 'Psalm\\Internal\\LanguageServer\\LanguageServer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php', + 'Psalm\\Internal\\LanguageServer\\Message' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php', + 'Psalm\\Internal\\LanguageServer\\ProtocolReader' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php', + 'Psalm\\Internal\\LanguageServer\\ProtocolStreamReader' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php', + 'Psalm\\Internal\\LanguageServer\\ProtocolStreamWriter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php', + 'Psalm\\Internal\\LanguageServer\\ProtocolWriter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php', + 'Psalm\\Internal\\LanguageServer\\Server\\TextDocument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/TextDocument.php', + 'Psalm\\Internal\\LanguageServer\\Server\\Workspace' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php', + 'Psalm\\Internal\\MethodIdentifier' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php', + 'Psalm\\Internal\\PhpTraverser\\CustomTraverser' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php', + 'Psalm\\Internal\\PhpVisitor\\AssignmentMapVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\CheckTrivialExprVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\CloningVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\ConditionCloningVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\NodeCleanerVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\NodeCounterVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\OffsetShifterVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\ParamReplacementVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\PartialParserVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\ReflectorVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\AttributeResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeDocblockParser' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeNodeScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockParser' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeNodeScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php', + 'Psalm\\Internal\\PhpVisitor\\Reflector\\TypeHintResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php', + 'Psalm\\Internal\\PhpVisitor\\ShortClosureVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php', + 'Psalm\\Internal\\PhpVisitor\\SimpleNameResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php', + 'Psalm\\Internal\\PhpVisitor\\TraitFinder' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php', + 'Psalm\\Internal\\PhpVisitor\\TypeMappingVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php', + 'Psalm\\Internal\\PluginManager\\Command\\DisableCommand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php', + 'Psalm\\Internal\\PluginManager\\Command\\EnableCommand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php', + 'Psalm\\Internal\\PluginManager\\Command\\ShowCommand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php', + 'Psalm\\Internal\\PluginManager\\ComposerLock' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php', + 'Psalm\\Internal\\PluginManager\\ConfigFile' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php', + 'Psalm\\Internal\\PluginManager\\PluginList' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php', + 'Psalm\\Internal\\PluginManager\\PluginListFactory' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php', + 'Psalm\\Internal\\Provider\\AddRemoveTaints\\HtmlFunctionTainter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php', + 'Psalm\\Internal\\Provider\\ClassLikeStorageCacheProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php', + 'Psalm\\Internal\\Provider\\ClassLikeStorageProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php', + 'Psalm\\Internal\\Provider\\FakeFileProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php', + 'Psalm\\Internal\\Provider\\FileProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php', + 'Psalm\\Internal\\Provider\\FileReferenceCacheProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php', + 'Psalm\\Internal\\Provider\\FileReferenceProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php', + 'Psalm\\Internal\\Provider\\FileStorageCacheProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php', + 'Psalm\\Internal\\Provider\\FileStorageProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php', + 'Psalm\\Internal\\Provider\\FunctionExistenceProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php', + 'Psalm\\Internal\\Provider\\FunctionParamsProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php', + 'Psalm\\Internal\\Provider\\FunctionReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\MethodExistenceProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php', + 'Psalm\\Internal\\Provider\\MethodParamsProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php', + 'Psalm\\Internal\\Provider\\MethodReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\MethodVisibilityProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php', + 'Psalm\\Internal\\Provider\\NodeDataProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php', + 'Psalm\\Internal\\Provider\\ParserCacheProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php', + 'Psalm\\Internal\\Provider\\ProjectCacheProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php', + 'Psalm\\Internal\\Provider\\PropertyExistenceProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php', + 'Psalm\\Internal\\Provider\\PropertyTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php', + 'Psalm\\Internal\\Provider\\PropertyTypeProvider\\DomDocumentPropertyTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php', + 'Psalm\\Internal\\Provider\\PropertyVisibilityProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php', + 'Psalm\\Internal\\Provider\\Providers' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayChunkReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayColumnReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFillReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFilterReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMapReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMergeReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPadReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPointerAdjustmentReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPopReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayRandReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReduceReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReverseReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySliceReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySpliceReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayUniqueReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayValuesReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ClosureFromCallableReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\DomNodeAppendChild' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ExplodeReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FilterVarReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FirstArgStringReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetClassMethodsReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetObjectVarsReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\HexdecReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ImagickPixelColorReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\InArrayReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\IteratorToArrayReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MinMaxReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MktimeReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ParseUrlReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementSetFetchMode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\RandReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\SimpleXmlElementAsXml' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrReplaceReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrTrReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\TriggerErrorReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\VersionCompareReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php', + 'Psalm\\Internal\\Provider\\StatementsProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php', + 'Psalm\\Internal\\Provider\\StatementsVolatileCache' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php', + 'Psalm\\Internal\\ReferenceConstraint' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php', + 'Psalm\\Internal\\RuntimeCaches' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php', + 'Psalm\\Internal\\Scanner\\ClassLikeDocblockComment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php', + 'Psalm\\Internal\\Scanner\\DocblockParser' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php', + 'Psalm\\Internal\\Scanner\\FileScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php', + 'Psalm\\Internal\\Scanner\\FunctionDocblockComment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php', + 'Psalm\\Internal\\Scanner\\ParsedDocblock' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php', + 'Psalm\\Internal\\Scanner\\PhpStormMetaScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstantComponent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayOffsetFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArraySpread' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ClassConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\Constant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\KeyValuePair' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ScalarValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedAdditionOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBinaryOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseAnd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseOr' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseXor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedConcatOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedDivisionOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedMultiplicationOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedSubtractionOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php', + 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedTernary' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php', + 'Psalm\\Internal\\Scanner\\VarDocblockComment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/VarDocblockComment.php', + 'Psalm\\Internal\\Scope\\CaseScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php', + 'Psalm\\Internal\\Scope\\FinallyScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php', + 'Psalm\\Internal\\Scope\\IfConditionalScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php', + 'Psalm\\Internal\\Scope\\IfScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php', + 'Psalm\\Internal\\Scope\\LoopScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php', + 'Psalm\\Internal\\Scope\\SwitchScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php', + 'Psalm\\Internal\\Stubs\\Generator\\ClassLikeStubGenerator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php', + 'Psalm\\Internal\\Stubs\\Generator\\StubsGenerator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php', + 'Psalm\\Internal\\TypeVisitor\\ContainsClassLikeVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php', + 'Psalm\\Internal\\TypeVisitor\\ContainsLiteralVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php', + 'Psalm\\Internal\\TypeVisitor\\FromDocblockSetter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php', + 'Psalm\\Internal\\TypeVisitor\\TemplateTypeCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php', + 'Psalm\\Internal\\TypeVisitor\\TypeChecker' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php', + 'Psalm\\Internal\\TypeVisitor\\TypeScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php', + 'Psalm\\Internal\\Type\\ArrayType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php', + 'Psalm\\Internal\\Type\\AssertionReconciler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php', + 'Psalm\\Internal\\Type\\Comparator\\ArrayTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\AtomicTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\CallableTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\ClassLikeStringComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\GenericTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\IntegerRangeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\KeyedArrayComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\ScalarTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php', + 'Psalm\\Internal\\Type\\Comparator\\TypeComparisonResult' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php', + 'Psalm\\Internal\\Type\\Comparator\\UnionTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php', + 'Psalm\\Internal\\Type\\NegatedAssertionReconciler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php', + 'Psalm\\Internal\\Type\\ParseTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php', + 'Psalm\\Internal\\Type\\ParseTreeCreator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php', + 'Psalm\\Internal\\Type\\ParseTree\\CallableParamTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\CallableTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\CallableWithReturnTypeTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\ConditionalTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\EncapsulationTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\GenericTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/GenericTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\IndexedAccessTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\IntersectionTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayPropertyTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\MethodParamTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\MethodTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\MethodWithReturnTypeTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\NullableTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/NullableTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\Root' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Root.php', + 'Psalm\\Internal\\Type\\ParseTree\\TemplateAsTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\TemplateIsTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\UnionTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php', + 'Psalm\\Internal\\Type\\ParseTree\\Value' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Value.php', + 'Psalm\\Internal\\Type\\SimpleAssertionReconciler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php', + 'Psalm\\Internal\\Type\\SimpleNegatedAssertionReconciler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php', + 'Psalm\\Internal\\Type\\TemplateBound' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php', + 'Psalm\\Internal\\Type\\TemplateInferredTypeReplacer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php', + 'Psalm\\Internal\\Type\\TemplateResult' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php', + 'Psalm\\Internal\\Type\\TemplateStandinTypeReplacer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php', + 'Psalm\\Internal\\Type\\TypeAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php', + 'Psalm\\Internal\\Type\\TypeAlias\\ClassTypeAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php', + 'Psalm\\Internal\\Type\\TypeAlias\\InlineTypeAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php', + 'Psalm\\Internal\\Type\\TypeAlias\\LinkableTypeAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php', + 'Psalm\\Internal\\Type\\TypeCombination' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php', + 'Psalm\\Internal\\Type\\TypeCombiner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php', + 'Psalm\\Internal\\Type\\TypeExpander' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php', + 'Psalm\\Internal\\Type\\TypeParser' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php', + 'Psalm\\Internal\\Type\\TypeTokenizer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php', + 'Psalm\\IssueBuffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/IssueBuffer.php', + 'Psalm\\Issue\\AbstractInstantiation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php', + 'Psalm\\Issue\\AbstractMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/AbstractMethodCall.php', + 'Psalm\\Issue\\ArgumentIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ArgumentIssue.php', + 'Psalm\\Issue\\ArgumentTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php', + 'Psalm\\Issue\\AssignmentToVoid' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/AssignmentToVoid.php', + 'Psalm\\Issue\\CircularReference' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/CircularReference.php', + 'Psalm\\Issue\\ClassIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ClassIssue.php', + 'Psalm\\Issue\\CodeIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/CodeIssue.php', + 'Psalm\\Issue\\ComplexFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php', + 'Psalm\\Issue\\ComplexMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ComplexMethod.php', + 'Psalm\\Issue\\ConfigIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ConfigIssue.php', + 'Psalm\\Issue\\ConflictingReferenceConstraint' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ConflictingReferenceConstraint.php', + 'Psalm\\Issue\\ConstructorSignatureMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ConstructorSignatureMismatch.php', + 'Psalm\\Issue\\ContinueOutsideLoop' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ContinueOutsideLoop.php', + 'Psalm\\Issue\\DeprecatedClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedClass.php', + 'Psalm\\Issue\\DeprecatedConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedConstant.php', + 'Psalm\\Issue\\DeprecatedFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedFunction.php', + 'Psalm\\Issue\\DeprecatedInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedInterface.php', + 'Psalm\\Issue\\DeprecatedMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedMethod.php', + 'Psalm\\Issue\\DeprecatedProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedProperty.php', + 'Psalm\\Issue\\DeprecatedTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedTrait.php', + 'Psalm\\Issue\\DocblockTypeContradiction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DocblockTypeContradiction.php', + 'Psalm\\Issue\\DuplicateArrayKey' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php', + 'Psalm\\Issue\\DuplicateClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateClass.php', + 'Psalm\\Issue\\DuplicateConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateConstant.php', + 'Psalm\\Issue\\DuplicateEnumCase' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCase.php', + 'Psalm\\Issue\\DuplicateEnumCaseValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCaseValue.php', + 'Psalm\\Issue\\DuplicateFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateFunction.php', + 'Psalm\\Issue\\DuplicateMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateMethod.php', + 'Psalm\\Issue\\DuplicateParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateParam.php', + 'Psalm\\Issue\\EmptyArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/EmptyArrayAccess.php', + 'Psalm\\Issue\\ExtensionRequirementViolation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ExtensionRequirementViolation.php', + 'Psalm\\Issue\\FalsableReturnStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/FalsableReturnStatement.php', + 'Psalm\\Issue\\FalseOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/FalseOperand.php', + 'Psalm\\Issue\\ForbiddenCode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ForbiddenCode.php', + 'Psalm\\Issue\\ForbiddenEcho' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ForbiddenEcho.php', + 'Psalm\\Issue\\FunctionIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/FunctionIssue.php', + 'Psalm\\Issue\\IfThisIsMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php', + 'Psalm\\Issue\\ImplementationRequirementViolation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImplementationRequirementViolation.php', + 'Psalm\\Issue\\ImplementedParamTypeMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImplementedParamTypeMismatch.php', + 'Psalm\\Issue\\ImplementedReturnTypeMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImplementedReturnTypeMismatch.php', + 'Psalm\\Issue\\ImplicitToStringCast' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImplicitToStringCast.php', + 'Psalm\\Issue\\ImpureByReferenceAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureByReferenceAssignment.php', + 'Psalm\\Issue\\ImpureFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureFunctionCall.php', + 'Psalm\\Issue\\ImpureMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureMethodCall.php', + 'Psalm\\Issue\\ImpurePropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpurePropertyAssignment.php', + 'Psalm\\Issue\\ImpurePropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpurePropertyFetch.php', + 'Psalm\\Issue\\ImpureStaticProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureStaticProperty.php', + 'Psalm\\Issue\\ImpureStaticVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureStaticVariable.php', + 'Psalm\\Issue\\ImpureVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureVariable.php', + 'Psalm\\Issue\\InaccessibleClassConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InaccessibleClassConstant.php', + 'Psalm\\Issue\\InaccessibleMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InaccessibleMethod.php', + 'Psalm\\Issue\\InaccessibleProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InaccessibleProperty.php', + 'Psalm\\Issue\\InterfaceInstantiation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InterfaceInstantiation.php', + 'Psalm\\Issue\\InternalClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InternalClass.php', + 'Psalm\\Issue\\InternalMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InternalMethod.php', + 'Psalm\\Issue\\InternalProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InternalProperty.php', + 'Psalm\\Issue\\InvalidArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidArgument.php', + 'Psalm\\Issue\\InvalidArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayAccess.php', + 'Psalm\\Issue\\InvalidArrayAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayAssignment.php', + 'Psalm\\Issue\\InvalidArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayOffset.php', + 'Psalm\\Issue\\InvalidAttribute' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidAttribute.php', + 'Psalm\\Issue\\InvalidCast' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidCast.php', + 'Psalm\\Issue\\InvalidCatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidCatch.php', + 'Psalm\\Issue\\InvalidClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidClass.php', + 'Psalm\\Issue\\InvalidClone' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidClone.php', + 'Psalm\\Issue\\InvalidDocblock' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidDocblock.php', + 'Psalm\\Issue\\InvalidDocblockParamName' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidDocblockParamName.php', + 'Psalm\\Issue\\InvalidEnumBackingType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidEnumBackingType.php', + 'Psalm\\Issue\\InvalidEnumCaseValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidEnumCaseValue.php', + 'Psalm\\Issue\\InvalidExtendClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidExtendClass.php', + 'Psalm\\Issue\\InvalidFalsableReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidFalsableReturnType.php', + 'Psalm\\Issue\\InvalidFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidFunctionCall.php', + 'Psalm\\Issue\\InvalidGlobal' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidGlobal.php', + 'Psalm\\Issue\\InvalidIterator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidIterator.php', + 'Psalm\\Issue\\InvalidLiteralArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidLiteralArgument.php', + 'Psalm\\Issue\\InvalidMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidMethodCall.php', + 'Psalm\\Issue\\InvalidNamedArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidNamedArgument.php', + 'Psalm\\Issue\\InvalidNullableReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidNullableReturnType.php', + 'Psalm\\Issue\\InvalidOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidOperand.php', + 'Psalm\\Issue\\InvalidParamDefault' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidParamDefault.php', + 'Psalm\\Issue\\InvalidParent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidParent.php', + 'Psalm\\Issue\\InvalidPassByReference' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidPassByReference.php', + 'Psalm\\Issue\\InvalidPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignment.php', + 'Psalm\\Issue\\InvalidPropertyAssignmentValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignmentValue.php', + 'Psalm\\Issue\\InvalidPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyFetch.php', + 'Psalm\\Issue\\InvalidReturnStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidReturnStatement.php', + 'Psalm\\Issue\\InvalidReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidReturnType.php', + 'Psalm\\Issue\\InvalidScalarArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidScalarArgument.php', + 'Psalm\\Issue\\InvalidScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidScope.php', + 'Psalm\\Issue\\InvalidStaticInvocation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidStaticInvocation.php', + 'Psalm\\Issue\\InvalidStringClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidStringClass.php', + 'Psalm\\Issue\\InvalidTemplateParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidTemplateParam.php', + 'Psalm\\Issue\\InvalidThrow' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidThrow.php', + 'Psalm\\Issue\\InvalidToString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidToString.php', + 'Psalm\\Issue\\InvalidTraversableImplementation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidTraversableImplementation.php', + 'Psalm\\Issue\\InvalidTypeImport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidTypeImport.php', + 'Psalm\\Issue\\LessSpecificImplementedReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/LessSpecificImplementedReturnType.php', + 'Psalm\\Issue\\LessSpecificReturnStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnStatement.php', + 'Psalm\\Issue\\LessSpecificReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnType.php', + 'Psalm\\Issue\\LoopInvalidation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/LoopInvalidation.php', + 'Psalm\\Issue\\MethodIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MethodIssue.php', + 'Psalm\\Issue\\MethodSignatureMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php', + 'Psalm\\Issue\\MethodSignatureMustOmitReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php', + 'Psalm\\Issue\\MethodSignatureMustProvideReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php', + 'Psalm\\Issue\\MismatchingDocblockParamType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockParamType.php', + 'Psalm\\Issue\\MismatchingDocblockPropertyType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockPropertyType.php', + 'Psalm\\Issue\\MismatchingDocblockReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockReturnType.php', + 'Psalm\\Issue\\MissingClosureParamType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingClosureParamType.php', + 'Psalm\\Issue\\MissingClosureReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingClosureReturnType.php', + 'Psalm\\Issue\\MissingConstructor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingConstructor.php', + 'Psalm\\Issue\\MissingDependency' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingDependency.php', + 'Psalm\\Issue\\MissingDocblockType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingDocblockType.php', + 'Psalm\\Issue\\MissingFile' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingFile.php', + 'Psalm\\Issue\\MissingImmutableAnnotation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingImmutableAnnotation.php', + 'Psalm\\Issue\\MissingParamType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingParamType.php', + 'Psalm\\Issue\\MissingPropertyType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingPropertyType.php', + 'Psalm\\Issue\\MissingReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingReturnType.php', + 'Psalm\\Issue\\MissingTemplateParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingTemplateParam.php', + 'Psalm\\Issue\\MissingThrowsDocblock' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingThrowsDocblock.php', + 'Psalm\\Issue\\MixedArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArgument.php', + 'Psalm\\Issue\\MixedArgumentTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php', + 'Psalm\\Issue\\MixedArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php', + 'Psalm\\Issue\\MixedArrayAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArrayAssignment.php', + 'Psalm\\Issue\\MixedArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArrayOffset.php', + 'Psalm\\Issue\\MixedArrayTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArrayTypeCoercion.php', + 'Psalm\\Issue\\MixedAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedAssignment.php', + 'Psalm\\Issue\\MixedClone' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedClone.php', + 'Psalm\\Issue\\MixedFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedFunctionCall.php', + 'Psalm\\Issue\\MixedInferredReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedInferredReturnType.php', + 'Psalm\\Issue\\MixedIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedIssue.php', + 'Psalm\\Issue\\MixedIssueTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedIssueTrait.php', + 'Psalm\\Issue\\MixedMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php', + 'Psalm\\Issue\\MixedOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedOperand.php', + 'Psalm\\Issue\\MixedPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyAssignment.php', + 'Psalm\\Issue\\MixedPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyFetch.php', + 'Psalm\\Issue\\MixedPropertyTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyTypeCoercion.php', + 'Psalm\\Issue\\MixedReturnStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php', + 'Psalm\\Issue\\MixedReturnTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedReturnTypeCoercion.php', + 'Psalm\\Issue\\MixedStringOffsetAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedStringOffsetAssignment.php', + 'Psalm\\Issue\\MoreSpecificImplementedParamType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MoreSpecificImplementedParamType.php', + 'Psalm\\Issue\\MoreSpecificReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MoreSpecificReturnType.php', + 'Psalm\\Issue\\MutableDependency' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MutableDependency.php', + 'Psalm\\Issue\\NamedArgumentNotAllowed' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NamedArgumentNotAllowed.php', + 'Psalm\\Issue\\NoEnumProperties' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NoEnumProperties.php', + 'Psalm\\Issue\\NoInterfaceProperties' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NoInterfaceProperties.php', + 'Psalm\\Issue\\NoValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NoValue.php', + 'Psalm\\Issue\\NonInvariantDocblockPropertyType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NonInvariantDocblockPropertyType.php', + 'Psalm\\Issue\\NonInvariantPropertyType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NonInvariantPropertyType.php', + 'Psalm\\Issue\\NonStaticSelfCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NonStaticSelfCall.php', + 'Psalm\\Issue\\NullArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullArgument.php', + 'Psalm\\Issue\\NullArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullArrayAccess.php', + 'Psalm\\Issue\\NullArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullArrayOffset.php', + 'Psalm\\Issue\\NullFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullFunctionCall.php', + 'Psalm\\Issue\\NullIterator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullIterator.php', + 'Psalm\\Issue\\NullOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullOperand.php', + 'Psalm\\Issue\\NullPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullPropertyAssignment.php', + 'Psalm\\Issue\\NullPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullPropertyFetch.php', + 'Psalm\\Issue\\NullReference' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullReference.php', + 'Psalm\\Issue\\NullableReturnStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullableReturnStatement.php', + 'Psalm\\Issue\\OverriddenMethodAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/OverriddenMethodAccess.php', + 'Psalm\\Issue\\OverriddenPropertyAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/OverriddenPropertyAccess.php', + 'Psalm\\Issue\\ParadoxicalCondition' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ParadoxicalCondition.php', + 'Psalm\\Issue\\ParamNameMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ParamNameMismatch.php', + 'Psalm\\Issue\\ParentNotFound' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ParentNotFound.php', + 'Psalm\\Issue\\ParseError' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ParseError.php', + 'Psalm\\Issue\\PluginIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PluginIssue.php', + 'Psalm\\Issue\\PossibleRawObjectIteration' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossibleRawObjectIteration.php', + 'Psalm\\Issue\\PossiblyFalseArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseArgument.php', + 'Psalm\\Issue\\PossiblyFalseIterator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseIterator.php', + 'Psalm\\Issue\\PossiblyFalseOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseOperand.php', + 'Psalm\\Issue\\PossiblyFalsePropertyAssignmentValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php', + 'Psalm\\Issue\\PossiblyFalseReference' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseReference.php', + 'Psalm\\Issue\\PossiblyInvalidArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArgument.php', + 'Psalm\\Issue\\PossiblyInvalidArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAccess.php', + 'Psalm\\Issue\\PossiblyInvalidArrayAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php', + 'Psalm\\Issue\\PossiblyInvalidArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayOffset.php', + 'Psalm\\Issue\\PossiblyInvalidCast' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidCast.php', + 'Psalm\\Issue\\PossiblyInvalidClone' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidClone.php', + 'Psalm\\Issue\\PossiblyInvalidDocblockTag' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidDocblockTag.php', + 'Psalm\\Issue\\PossiblyInvalidFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidFunctionCall.php', + 'Psalm\\Issue\\PossiblyInvalidIterator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidIterator.php', + 'Psalm\\Issue\\PossiblyInvalidMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidMethodCall.php', + 'Psalm\\Issue\\PossiblyInvalidOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidOperand.php', + 'Psalm\\Issue\\PossiblyInvalidPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php', + 'Psalm\\Issue\\PossiblyInvalidPropertyAssignmentValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php', + 'Psalm\\Issue\\PossiblyInvalidPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php', + 'Psalm\\Issue\\PossiblyNullArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArgument.php', + 'Psalm\\Issue\\PossiblyNullArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAccess.php', + 'Psalm\\Issue\\PossiblyNullArrayAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAssignment.php', + 'Psalm\\Issue\\PossiblyNullArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayOffset.php', + 'Psalm\\Issue\\PossiblyNullFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullFunctionCall.php', + 'Psalm\\Issue\\PossiblyNullIterator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullIterator.php', + 'Psalm\\Issue\\PossiblyNullOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullOperand.php', + 'Psalm\\Issue\\PossiblyNullPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignment.php', + 'Psalm\\Issue\\PossiblyNullPropertyAssignmentValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php', + 'Psalm\\Issue\\PossiblyNullPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyFetch.php', + 'Psalm\\Issue\\PossiblyNullReference' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullReference.php', + 'Psalm\\Issue\\PossiblyUndefinedArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php', + 'Psalm\\Issue\\PossiblyUndefinedGlobalVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php', + 'Psalm\\Issue\\PossiblyUndefinedIntArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php', + 'Psalm\\Issue\\PossiblyUndefinedMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedMethod.php', + 'Psalm\\Issue\\PossiblyUndefinedStringArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php', + 'Psalm\\Issue\\PossiblyUndefinedVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedVariable.php', + 'Psalm\\Issue\\PossiblyUnusedMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedMethod.php', + 'Psalm\\Issue\\PossiblyUnusedParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedParam.php', + 'Psalm\\Issue\\PossiblyUnusedProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedProperty.php', + 'Psalm\\Issue\\PossiblyUnusedReturnValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedReturnValue.php', + 'Psalm\\Issue\\PropertyIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PropertyIssue.php', + 'Psalm\\Issue\\PropertyNotSetInConstructor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php', + 'Psalm\\Issue\\PropertyTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php', + 'Psalm\\Issue\\PsalmInternalError' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PsalmInternalError.php', + 'Psalm\\Issue\\RawObjectIteration' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RawObjectIteration.php', + 'Psalm\\Issue\\RedundantCast' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantCast.php', + 'Psalm\\Issue\\RedundantCastGivenDocblockType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantCastGivenDocblockType.php', + 'Psalm\\Issue\\RedundantCondition' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantCondition.php', + 'Psalm\\Issue\\RedundantConditionGivenDocblockType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php', + 'Psalm\\Issue\\RedundantFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php', + 'Psalm\\Issue\\RedundantFunctionCallGivenDocblockType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php', + 'Psalm\\Issue\\RedundantIdentityWithTrue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantIdentityWithTrue.php', + 'Psalm\\Issue\\RedundantPropertyInitializationCheck' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantPropertyInitializationCheck.php', + 'Psalm\\Issue\\ReferenceConstraintViolation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ReferenceConstraintViolation.php', + 'Psalm\\Issue\\ReservedWord' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ReservedWord.php', + 'Psalm\\Issue\\StringIncrement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/StringIncrement.php', + 'Psalm\\Issue\\TaintedCallable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedCallable.php', + 'Psalm\\Issue\\TaintedCookie' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedCookie.php', + 'Psalm\\Issue\\TaintedCustom' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedCustom.php', + 'Psalm\\Issue\\TaintedEval' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedEval.php', + 'Psalm\\Issue\\TaintedFile' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedFile.php', + 'Psalm\\Issue\\TaintedHeader' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedHeader.php', + 'Psalm\\Issue\\TaintedHtml' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedHtml.php', + 'Psalm\\Issue\\TaintedInclude' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedInclude.php', + 'Psalm\\Issue\\TaintedInput' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedInput.php', + 'Psalm\\Issue\\TaintedLdap' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php', + 'Psalm\\Issue\\TaintedSSRF' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedSSRF.php', + 'Psalm\\Issue\\TaintedShell' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedShell.php', + 'Psalm\\Issue\\TaintedSql' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedSql.php', + 'Psalm\\Issue\\TaintedSystemSecret' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedSystemSecret.php', + 'Psalm\\Issue\\TaintedTextWithQuotes' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedTextWithQuotes.php', + 'Psalm\\Issue\\TaintedUnserialize' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedUnserialize.php', + 'Psalm\\Issue\\TaintedUserSecret' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedUserSecret.php', + 'Psalm\\Issue\\TooFewArguments' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TooFewArguments.php', + 'Psalm\\Issue\\TooManyArguments' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TooManyArguments.php', + 'Psalm\\Issue\\TooManyTemplateParams' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TooManyTemplateParams.php', + 'Psalm\\Issue\\Trace' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/Trace.php', + 'Psalm\\Issue\\TraitMethodSignatureMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TraitMethodSignatureMismatch.php', + 'Psalm\\Issue\\TypeDoesNotContainNull' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainNull.php', + 'Psalm\\Issue\\TypeDoesNotContainType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php', + 'Psalm\\Issue\\UncaughtThrowInGlobalScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php', + 'Psalm\\Issue\\UndefinedAttributeClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedAttributeClass.php', + 'Psalm\\Issue\\UndefinedClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedClass.php', + 'Psalm\\Issue\\UndefinedConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedConstant.php', + 'Psalm\\Issue\\UndefinedDocblockClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedDocblockClass.php', + 'Psalm\\Issue\\UndefinedFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedFunction.php', + 'Psalm\\Issue\\UndefinedGlobalVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedGlobalVariable.php', + 'Psalm\\Issue\\UndefinedInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedInterface.php', + 'Psalm\\Issue\\UndefinedInterfaceMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedInterfaceMethod.php', + 'Psalm\\Issue\\UndefinedMagicMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicMethod.php', + 'Psalm\\Issue\\UndefinedMagicPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php', + 'Psalm\\Issue\\UndefinedMagicPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyFetch.php', + 'Psalm\\Issue\\UndefinedMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedMethod.php', + 'Psalm\\Issue\\UndefinedPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyAssignment.php', + 'Psalm\\Issue\\UndefinedPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyFetch.php', + 'Psalm\\Issue\\UndefinedThisPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyAssignment.php', + 'Psalm\\Issue\\UndefinedThisPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyFetch.php', + 'Psalm\\Issue\\UndefinedTrace' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedTrace.php', + 'Psalm\\Issue\\UndefinedTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedTrait.php', + 'Psalm\\Issue\\UndefinedVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedVariable.php', + 'Psalm\\Issue\\UnevaluatedCode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnevaluatedCode.php', + 'Psalm\\Issue\\UnhandledMatchCondition' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnhandledMatchCondition.php', + 'Psalm\\Issue\\UnimplementedAbstractMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnimplementedAbstractMethod.php', + 'Psalm\\Issue\\UnimplementedInterfaceMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnimplementedInterfaceMethod.php', + 'Psalm\\Issue\\UninitializedProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UninitializedProperty.php', + 'Psalm\\Issue\\UnnecessaryVarAnnotation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnnecessaryVarAnnotation.php', + 'Psalm\\Issue\\UnrecognizedExpression' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnrecognizedExpression.php', + 'Psalm\\Issue\\UnrecognizedStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnrecognizedStatement.php', + 'Psalm\\Issue\\UnresolvableInclude' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnresolvableInclude.php', + 'Psalm\\Issue\\UnsafeGenericInstantiation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnsafeGenericInstantiation.php', + 'Psalm\\Issue\\UnsafeInstantiation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnsafeInstantiation.php', + 'Psalm\\Issue\\UnusedClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedClass.php', + 'Psalm\\Issue\\UnusedClosureParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedClosureParam.php', + 'Psalm\\Issue\\UnusedConstructor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedConstructor.php', + 'Psalm\\Issue\\UnusedForeachValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedForeachValue.php', + 'Psalm\\Issue\\UnusedFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedFunctionCall.php', + 'Psalm\\Issue\\UnusedMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedMethod.php', + 'Psalm\\Issue\\UnusedMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedMethodCall.php', + 'Psalm\\Issue\\UnusedParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedParam.php', + 'Psalm\\Issue\\UnusedProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedProperty.php', + 'Psalm\\Issue\\UnusedPsalmSuppress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedPsalmSuppress.php', + 'Psalm\\Issue\\UnusedReturnValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedReturnValue.php', + 'Psalm\\Issue\\UnusedVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedVariable.php', + 'Psalm\\Issue\\VariableIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/VariableIssue.php', + 'Psalm\\NodeTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/NodeTypeProvider.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseAnd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseOr' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseXor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualCoalesce' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualConcat' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualDiv' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualMinus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualMod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMod.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualMul' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMul.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualPlus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualPow' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPow.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftLeft' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php', + 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftRight' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseAnd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseOr' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseXor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanAnd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanOr' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualCoalesce' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualConcat' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualDiv' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualEqual' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreater' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreaterOrEqual' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualIdentical' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalAnd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalOr' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalXor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMinus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMul' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotEqual' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotIdentical' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPlus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPow' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftLeft' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftRight' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmaller' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmallerOrEqual' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php', + 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSpaceship' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualArray.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualBool' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualBool.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualDouble' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualDouble.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualInt' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualInt.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualObject' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualObject.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualString.php', + 'Psalm\\Node\\Expr\\Cast\\VirtualUnset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualUnset.php', + 'Psalm\\Node\\Expr\\VirtualArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArray.php', + 'Psalm\\Node\\Expr\\VirtualArrayDimFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayDimFetch.php', + 'Psalm\\Node\\Expr\\VirtualArrayItem' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayItem.php', + 'Psalm\\Node\\Expr\\VirtualArrowFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrowFunction.php', + 'Psalm\\Node\\Expr\\VirtualAssign' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssign.php', + 'Psalm\\Node\\Expr\\VirtualAssignRef' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssignRef.php', + 'Psalm\\Node\\Expr\\VirtualBitwiseNot' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualBitwiseNot.php', + 'Psalm\\Node\\Expr\\VirtualBooleanNot' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualBooleanNot.php', + 'Psalm\\Node\\Expr\\VirtualClassConstFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClassConstFetch.php', + 'Psalm\\Node\\Expr\\VirtualClone' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClone.php', + 'Psalm\\Node\\Expr\\VirtualClosure' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosure.php', + 'Psalm\\Node\\Expr\\VirtualClosureUse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosureUse.php', + 'Psalm\\Node\\Expr\\VirtualConstFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualConstFetch.php', + 'Psalm\\Node\\Expr\\VirtualEmpty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualEmpty.php', + 'Psalm\\Node\\Expr\\VirtualError' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualError.php', + 'Psalm\\Node\\Expr\\VirtualErrorSuppress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualErrorSuppress.php', + 'Psalm\\Node\\Expr\\VirtualEval' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualEval.php', + 'Psalm\\Node\\Expr\\VirtualExit' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualExit.php', + 'Psalm\\Node\\Expr\\VirtualFuncCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualFuncCall.php', + 'Psalm\\Node\\Expr\\VirtualInclude' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualInclude.php', + 'Psalm\\Node\\Expr\\VirtualInstanceof' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualInstanceof.php', + 'Psalm\\Node\\Expr\\VirtualIsset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualIsset.php', + 'Psalm\\Node\\Expr\\VirtualList' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualList.php', + 'Psalm\\Node\\Expr\\VirtualMatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualMatch.php', + 'Psalm\\Node\\Expr\\VirtualMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualMethodCall.php', + 'Psalm\\Node\\Expr\\VirtualNew' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNew.php', + 'Psalm\\Node\\Expr\\VirtualNullsafeMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php', + 'Psalm\\Node\\Expr\\VirtualNullsafePropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php', + 'Psalm\\Node\\Expr\\VirtualPostDec' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostDec.php', + 'Psalm\\Node\\Expr\\VirtualPostInc' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostInc.php', + 'Psalm\\Node\\Expr\\VirtualPreDec' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreDec.php', + 'Psalm\\Node\\Expr\\VirtualPreInc' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreInc.php', + 'Psalm\\Node\\Expr\\VirtualPrint' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPrint.php', + 'Psalm\\Node\\Expr\\VirtualPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPropertyFetch.php', + 'Psalm\\Node\\Expr\\VirtualShellExec' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualShellExec.php', + 'Psalm\\Node\\Expr\\VirtualStaticCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticCall.php', + 'Psalm\\Node\\Expr\\VirtualStaticPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php', + 'Psalm\\Node\\Expr\\VirtualTernary' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualTernary.php', + 'Psalm\\Node\\Expr\\VirtualThrow' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualThrow.php', + 'Psalm\\Node\\Expr\\VirtualUnaryMinus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryMinus.php', + 'Psalm\\Node\\Expr\\VirtualUnaryPlus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryPlus.php', + 'Psalm\\Node\\Expr\\VirtualVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualVariable.php', + 'Psalm\\Node\\Expr\\VirtualYield' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualYield.php', + 'Psalm\\Node\\Expr\\VirtualYieldFrom' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualYieldFrom.php', + 'Psalm\\Node\\Name\\VirtualFullyQualified' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Name/VirtualFullyQualified.php', + 'Psalm\\Node\\Name\\VirtualRelative' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Name/VirtualRelative.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualDir' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFile' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualLine' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualNamespace' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php', + 'Psalm\\Node\\Scalar\\MagicConst\\VirtualTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php', + 'Psalm\\Node\\Scalar\\VirtualDNumber' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualDNumber.php', + 'Psalm\\Node\\Scalar\\VirtualEncapsed' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsed.php', + 'Psalm\\Node\\Scalar\\VirtualEncapsedStringPart' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php', + 'Psalm\\Node\\Scalar\\VirtualLNumber' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualLNumber.php', + 'Psalm\\Node\\Scalar\\VirtualString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualString.php', + 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php', + 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualPrecedence' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php', + 'Psalm\\Node\\Stmt\\VirtualBreak' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualBreak.php', + 'Psalm\\Node\\Stmt\\VirtualCase' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCase.php', + 'Psalm\\Node\\Stmt\\VirtualCatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCatch.php', + 'Psalm\\Node\\Stmt\\VirtualClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClass.php', + 'Psalm\\Node\\Stmt\\VirtualClassConst' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassConst.php', + 'Psalm\\Node\\Stmt\\VirtualClassMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassMethod.php', + 'Psalm\\Node\\Stmt\\VirtualConst' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualConst.php', + 'Psalm\\Node\\Stmt\\VirtualContinue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualContinue.php', + 'Psalm\\Node\\Stmt\\VirtualDeclare' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclare.php', + 'Psalm\\Node\\Stmt\\VirtualDeclareDeclare' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php', + 'Psalm\\Node\\Stmt\\VirtualDo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDo.php', + 'Psalm\\Node\\Stmt\\VirtualEcho' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualEcho.php', + 'Psalm\\Node\\Stmt\\VirtualElse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElse.php', + 'Psalm\\Node\\Stmt\\VirtualElseIf' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElseIf.php', + 'Psalm\\Node\\Stmt\\VirtualExpression' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualExpression.php', + 'Psalm\\Node\\Stmt\\VirtualFinally' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFinally.php', + 'Psalm\\Node\\Stmt\\VirtualFor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFor.php', + 'Psalm\\Node\\Stmt\\VirtualForeach' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualForeach.php', + 'Psalm\\Node\\Stmt\\VirtualFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFunction.php', + 'Psalm\\Node\\Stmt\\VirtualGlobal' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGlobal.php', + 'Psalm\\Node\\Stmt\\VirtualGoto' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGoto.php', + 'Psalm\\Node\\Stmt\\VirtualGroupUse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGroupUse.php', + 'Psalm\\Node\\Stmt\\VirtualHaltCompiler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualHaltCompiler.php', + 'Psalm\\Node\\Stmt\\VirtualIf' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualIf.php', + 'Psalm\\Node\\Stmt\\VirtualInlineHTML' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInlineHTML.php', + 'Psalm\\Node\\Stmt\\VirtualInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInterface.php', + 'Psalm\\Node\\Stmt\\VirtualLabel' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualLabel.php', + 'Psalm\\Node\\Stmt\\VirtualNamespace' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNamespace.php', + 'Psalm\\Node\\Stmt\\VirtualNop' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNop.php', + 'Psalm\\Node\\Stmt\\VirtualProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualProperty.php', + 'Psalm\\Node\\Stmt\\VirtualPropertyProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualPropertyProperty.php', + 'Psalm\\Node\\Stmt\\VirtualReturn' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualReturn.php', + 'Psalm\\Node\\Stmt\\VirtualStatic' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStatic.php', + 'Psalm\\Node\\Stmt\\VirtualStaticVar' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStaticVar.php', + 'Psalm\\Node\\Stmt\\VirtualSwitch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualSwitch.php', + 'Psalm\\Node\\Stmt\\VirtualThrow' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualThrow.php', + 'Psalm\\Node\\Stmt\\VirtualTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTrait.php', + 'Psalm\\Node\\Stmt\\VirtualTraitUse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTraitUse.php', + 'Psalm\\Node\\Stmt\\VirtualTryCatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTryCatch.php', + 'Psalm\\Node\\Stmt\\VirtualUnset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUnset.php', + 'Psalm\\Node\\Stmt\\VirtualUse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUse.php', + 'Psalm\\Node\\Stmt\\VirtualUseUse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUseUse.php', + 'Psalm\\Node\\Stmt\\VirtualWhile' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualWhile.php', + 'Psalm\\Node\\VirtualArg' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualArg.php', + 'Psalm\\Node\\VirtualAttribute' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualAttribute.php', + 'Psalm\\Node\\VirtualAttributeGroup' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualAttributeGroup.php', + 'Psalm\\Node\\VirtualConst' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualConst.php', + 'Psalm\\Node\\VirtualIdentifier' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualIdentifier.php', + 'Psalm\\Node\\VirtualMatchArm' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualMatchArm.php', + 'Psalm\\Node\\VirtualName' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualName.php', + 'Psalm\\Node\\VirtualNode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualNode.php', + 'Psalm\\Node\\VirtualNullableType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualNullableType.php', + 'Psalm\\Node\\VirtualParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualParam.php', + 'Psalm\\Node\\VirtualUnionType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualUnionType.php', + 'Psalm\\Node\\VirtualVarLikeIdentifier' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualVarLikeIdentifier.php', + 'Psalm\\PluginRegistrationSocket' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php', + 'Psalm\\Plugin\\EventHandler\\AddTaintsInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterClassLikeAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterClassLikeExistenceCheckInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterClassLikeVisitInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterCodebasePopulatedInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterEveryFunctionCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterExpressionAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterFileAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterFunctionCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterFunctionLikeAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterMethodCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\AfterStatementAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\BeforeFileAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AddRemoveTaintsEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeExistenceCheckEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeVisitEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterCodebasePopulatedEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterEveryFunctionCallAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterExpressionAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterFileAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionCallAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionLikeAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterMethodCallAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\AfterStatementAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\BeforeFileAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\FunctionExistenceProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\FunctionParamsProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\FunctionReturnTypeProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\MethodExistenceProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\MethodParamsProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\MethodReturnTypeProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\MethodVisibilityProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\PropertyExistenceProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\PropertyTypeProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\PropertyVisibilityProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php', + 'Psalm\\Plugin\\EventHandler\\Event\\StringInterpreterEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php', + 'Psalm\\Plugin\\EventHandler\\FunctionExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\FunctionParamsProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\FunctionReturnTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\MethodExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\MethodParamsProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\MethodReturnTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\MethodVisibilityProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\PropertyExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\PropertyTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\PropertyVisibilityProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php', + 'Psalm\\Plugin\\EventHandler\\RemoveTaintsInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php', + 'Psalm\\Plugin\\EventHandler\\StringInterpreterInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php', + 'Psalm\\Plugin\\Hook\\AfterAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterClassLikeAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterClassLikeExistenceCheckInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeExistenceCheckInterface.php', + 'Psalm\\Plugin\\Hook\\AfterClassLikeVisitInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeVisitInterface.php', + 'Psalm\\Plugin\\Hook\\AfterCodebasePopulatedInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterCodebasePopulatedInterface.php', + 'Psalm\\Plugin\\Hook\\AfterEveryFunctionCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterEveryFunctionCallAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterExpressionAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterExpressionAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterFileAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFileAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterFunctionCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionCallAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterFunctionLikeAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionLikeAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterMethodCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterMethodCallAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\AfterStatementAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterStatementAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\BeforeFileAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/BeforeFileAnalysisInterface.php', + 'Psalm\\Plugin\\Hook\\FunctionExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionExistenceProviderInterface.php', + 'Psalm\\Plugin\\Hook\\FunctionParamsProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php', + 'Psalm\\Plugin\\Hook\\FunctionReturnTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php', + 'Psalm\\Plugin\\Hook\\MethodExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php', + 'Psalm\\Plugin\\Hook\\MethodParamsProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php', + 'Psalm\\Plugin\\Hook\\MethodReturnTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php', + 'Psalm\\Plugin\\Hook\\MethodVisibilityProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php', + 'Psalm\\Plugin\\Hook\\PropertyExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php', + 'Psalm\\Plugin\\Hook\\PropertyTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php', + 'Psalm\\Plugin\\Hook\\PropertyVisibilityProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php', + 'Psalm\\Plugin\\Hook\\StringInterpreterInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php', + 'Psalm\\Plugin\\PluginEntryPointInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/PluginEntryPointInterface.php', + 'Psalm\\Plugin\\RegistrationInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/RegistrationInterface.php', + 'Psalm\\Plugin\\Shepherd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Shepherd.php', + 'Psalm\\Progress\\DebugProgress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Progress/DebugProgress.php', + 'Psalm\\Progress\\DefaultProgress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php', + 'Psalm\\Progress\\LongProgress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Progress/LongProgress.php', + 'Psalm\\Progress\\Progress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Progress/Progress.php', + 'Psalm\\Progress\\VoidProgress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Progress/VoidProgress.php', + 'Psalm\\Report' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report.php', + 'Psalm\\Report\\CheckstyleReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php', + 'Psalm\\Report\\CodeClimateReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php', + 'Psalm\\Report\\CompactReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/CompactReport.php', + 'Psalm\\Report\\ConsoleReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/ConsoleReport.php', + 'Psalm\\Report\\CountReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/CountReport.php', + 'Psalm\\Report\\EmacsReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/EmacsReport.php', + 'Psalm\\Report\\GithubActionsReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php', + 'Psalm\\Report\\JsonReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/JsonReport.php', + 'Psalm\\Report\\JsonSummaryReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php', + 'Psalm\\Report\\JunitReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/JunitReport.php', + 'Psalm\\Report\\PhpStormReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/PhpStormReport.php', + 'Psalm\\Report\\PylintReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/PylintReport.php', + 'Psalm\\Report\\ReportOptions' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/ReportOptions.php', + 'Psalm\\Report\\SarifReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/SarifReport.php', + 'Psalm\\Report\\SonarqubeReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php', + 'Psalm\\Report\\TextReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/TextReport.php', + 'Psalm\\Report\\XmlReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/XmlReport.php', + 'Psalm\\SourceControl\\Git\\CommitInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php', + 'Psalm\\SourceControl\\Git\\GitInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php', + 'Psalm\\SourceControl\\Git\\RemoteInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php', + 'Psalm\\SourceControl\\SourceControlInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php', + 'Psalm\\StatementsSource' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/StatementsSource.php', + 'Psalm\\Storage\\Assertion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/Assertion.php', + 'Psalm\\Storage\\AttributeArg' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/AttributeArg.php', + 'Psalm\\Storage\\AttributeStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php', + 'Psalm\\Storage\\ClassConstantStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php', + 'Psalm\\Storage\\ClassLikeStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php', + 'Psalm\\Storage\\CustomMetadataTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php', + 'Psalm\\Storage\\EnumCaseStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php', + 'Psalm\\Storage\\FileStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/FileStorage.php', + 'Psalm\\Storage\\FunctionLikeParameter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php', + 'Psalm\\Storage\\FunctionLikeStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php', + 'Psalm\\Storage\\FunctionStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php', + 'Psalm\\Storage\\HasAttributesInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php', + 'Psalm\\Storage\\MethodStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/MethodStorage.php', + 'Psalm\\Storage\\PropertyStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php', + 'Psalm\\Type' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type.php', + 'Psalm\\Type\\Atomic' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic.php', + 'Psalm\\Type\\Atomic\\CallableTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php', + 'Psalm\\Type\\Atomic\\DependentType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php', + 'Psalm\\Type\\Atomic\\GenericTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/GenericTrait.php', + 'Psalm\\Type\\Atomic\\HasIntersectionTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php', + 'Psalm\\Type\\Atomic\\Scalar' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php', + 'Psalm\\Type\\Atomic\\TAnonymousClassInstance' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TAnonymousClassInstance.php', + 'Psalm\\Type\\Atomic\\TArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php', + 'Psalm\\Type\\Atomic\\TArrayKey' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php', + 'Psalm\\Type\\Atomic\\TAssertionFalsy' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php', + 'Psalm\\Type\\Atomic\\TBool' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php', + 'Psalm\\Type\\Atomic\\TCallable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php', + 'Psalm\\Type\\Atomic\\TCallableArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php', + 'Psalm\\Type\\Atomic\\TCallableKeyedArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableKeyedArray.php', + 'Psalm\\Type\\Atomic\\TCallableList' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableList.php', + 'Psalm\\Type\\Atomic\\TCallableObject' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableObject.php', + 'Psalm\\Type\\Atomic\\TCallableString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php', + 'Psalm\\Type\\Atomic\\TClassConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php', + 'Psalm\\Type\\Atomic\\TClassString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php', + 'Psalm\\Type\\Atomic\\TClassStringMap' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php', + 'Psalm\\Type\\Atomic\\TClosedResource' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php', + 'Psalm\\Type\\Atomic\\TClosure' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php', + 'Psalm\\Type\\Atomic\\TConditional' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php', + 'Psalm\\Type\\Atomic\\TDependentGetClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php', + 'Psalm\\Type\\Atomic\\TDependentGetDebugType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php', + 'Psalm\\Type\\Atomic\\TDependentGetType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php', + 'Psalm\\Type\\Atomic\\TDependentListKey' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php', + 'Psalm\\Type\\Atomic\\TEmpty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php', + 'Psalm\\Type\\Atomic\\TEmptyMixed' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php', + 'Psalm\\Type\\Atomic\\TEmptyNumeric' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyNumeric.php', + 'Psalm\\Type\\Atomic\\TEmptyScalar' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyScalar.php', + 'Psalm\\Type\\Atomic\\TEnumCase' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TEnumCase.php', + 'Psalm\\Type\\Atomic\\TFalse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php', + 'Psalm\\Type\\Atomic\\TFloat' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TFloat.php', + 'Psalm\\Type\\Atomic\\TGenericObject' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php', + 'Psalm\\Type\\Atomic\\THtmlEscapedString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php', + 'Psalm\\Type\\Atomic\\TInt' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php', + 'Psalm\\Type\\Atomic\\TIntMask' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php', + 'Psalm\\Type\\Atomic\\TIntMaskOf' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php', + 'Psalm\\Type\\Atomic\\TIntRange' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php', + 'Psalm\\Type\\Atomic\\TIterable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php', + 'Psalm\\Type\\Atomic\\TKeyOfClassConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php', + 'Psalm\\Type\\Atomic\\TKeyedArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php', + 'Psalm\\Type\\Atomic\\TList' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TList.php', + 'Psalm\\Type\\Atomic\\TLiteralClassString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php', + 'Psalm\\Type\\Atomic\\TLiteralFloat' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php', + 'Psalm\\Type\\Atomic\\TLiteralInt' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php', + 'Psalm\\Type\\Atomic\\TLiteralString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php', + 'Psalm\\Type\\Atomic\\TLowercaseString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php', + 'Psalm\\Type\\Atomic\\TMixed' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TMixed.php', + 'Psalm\\Type\\Atomic\\TNamedObject' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php', + 'Psalm\\Type\\Atomic\\TNever' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php', + 'Psalm\\Type\\Atomic\\TNonEmptyArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php', + 'Psalm\\Type\\Atomic\\TNonEmptyList' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php', + 'Psalm\\Type\\Atomic\\TNonEmptyLowercaseString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php', + 'Psalm\\Type\\Atomic\\TNonEmptyMixed' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyMixed.php', + 'Psalm\\Type\\Atomic\\TNonEmptyNonspecificLiteralString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php', + 'Psalm\\Type\\Atomic\\TNonEmptyScalar' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyScalar.php', + 'Psalm\\Type\\Atomic\\TNonEmptyString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyString.php', + 'Psalm\\Type\\Atomic\\TNonFalsyString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonFalsyString.php', + 'Psalm\\Type\\Atomic\\TNonspecificLiteralInt' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php', + 'Psalm\\Type\\Atomic\\TNonspecificLiteralString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralString.php', + 'Psalm\\Type\\Atomic\\TNull' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNull.php', + 'Psalm\\Type\\Atomic\\TNumeric' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php', + 'Psalm\\Type\\Atomic\\TNumericString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php', + 'Psalm\\Type\\Atomic\\TObject' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php', + 'Psalm\\Type\\Atomic\\TObjectWithProperties' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php', + 'Psalm\\Type\\Atomic\\TPositiveInt' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php', + 'Psalm\\Type\\Atomic\\TResource' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php', + 'Psalm\\Type\\Atomic\\TScalar' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php', + 'Psalm\\Type\\Atomic\\TSingleLetter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php', + 'Psalm\\Type\\Atomic\\TString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TString.php', + 'Psalm\\Type\\Atomic\\TTemplateIndexedAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php', + 'Psalm\\Type\\Atomic\\TTemplateKeyOf' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php', + 'Psalm\\Type\\Atomic\\TTemplateParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php', + 'Psalm\\Type\\Atomic\\TTemplateParamClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php', + 'Psalm\\Type\\Atomic\\TTraitString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php', + 'Psalm\\Type\\Atomic\\TTrue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php', + 'Psalm\\Type\\Atomic\\TTypeAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTypeAlias.php', + 'Psalm\\Type\\Atomic\\TValueOfClassConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php', + 'Psalm\\Type\\Atomic\\TVoid' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php', + 'Psalm\\Type\\NodeVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/NodeVisitor.php', + 'Psalm\\Type\\Reconciler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Reconciler.php', + 'Psalm\\Type\\TaintKind' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/TaintKind.php', + 'Psalm\\Type\\TaintKindGroup' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/TaintKindGroup.php', + 'Psalm\\Type\\TypeNode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/TypeNode.php', + 'Psalm\\Type\\Union' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Union.php', 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', 'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', + 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php', + 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php', + 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', + 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', + 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', + 'SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', + 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', + 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', 'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', @@ -187,6 +1890,108 @@ class ComposerStaticInit2723bf3c902a907c44396c9253500aff 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', + 'Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', + 'Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php', + 'Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', + 'Webmozart\\PathUtil\\Path' => __DIR__ . '/..' . '/webmozart/path-util/src/Path.php', + 'Webmozart\\PathUtil\\Url' => __DIR__ . '/..' . '/webmozart/path-util/src/Url.php', + 'XdgBaseDir\\Xdg' => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src/Xdg.php', + 'phpDocumentor\\Reflection\\DocBlock' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock.php', + 'phpDocumentor\\Reflection\\DocBlockFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', + 'phpDocumentor\\Reflection\\DocBlockFactoryInterface' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', + 'phpDocumentor\\Reflection\\DocBlock\\Description' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', + 'phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', + 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', + 'phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', + 'phpDocumentor\\Reflection\\DocBlock\\TagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', + 'phpDocumentor\\Reflection\\Element' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Element.php', + 'phpDocumentor\\Reflection\\Exception\\PcreException' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', + 'phpDocumentor\\Reflection\\File' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/File.php', + 'phpDocumentor\\Reflection\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Fqsen.php', + 'phpDocumentor\\Reflection\\FqsenResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/FqsenResolver.php', + 'phpDocumentor\\Reflection\\Location' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Location.php', + 'phpDocumentor\\Reflection\\Project' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Project.php', + 'phpDocumentor\\Reflection\\ProjectFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/ProjectFactory.php', + 'phpDocumentor\\Reflection\\PseudoType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoType.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\False_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\List_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/List_.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\True_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', + 'phpDocumentor\\Reflection\\Type' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Type.php', + 'phpDocumentor\\Reflection\\TypeResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/TypeResolver.php', + 'phpDocumentor\\Reflection\\Types\\AbstractList' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', + 'phpDocumentor\\Reflection\\Types\\AggregatedType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', + 'phpDocumentor\\Reflection\\Types\\ArrayKey' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ArrayKey.php', + 'phpDocumentor\\Reflection\\Types\\Array_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Array_.php', + 'phpDocumentor\\Reflection\\Types\\Boolean' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Boolean.php', + 'phpDocumentor\\Reflection\\Types\\Callable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Callable_.php', + 'phpDocumentor\\Reflection\\Types\\ClassString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ClassString.php', + 'phpDocumentor\\Reflection\\Types\\Collection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Collection.php', + 'phpDocumentor\\Reflection\\Types\\Compound' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Compound.php', + 'phpDocumentor\\Reflection\\Types\\Context' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Context.php', + 'phpDocumentor\\Reflection\\Types\\ContextFactory' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', + 'phpDocumentor\\Reflection\\Types\\Expression' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Expression.php', + 'phpDocumentor\\Reflection\\Types\\Float_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Float_.php', + 'phpDocumentor\\Reflection\\Types\\Integer' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Integer.php', + 'phpDocumentor\\Reflection\\Types\\InterfaceString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/InterfaceString.php', + 'phpDocumentor\\Reflection\\Types\\Intersection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Intersection.php', + 'phpDocumentor\\Reflection\\Types\\Iterable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', + 'phpDocumentor\\Reflection\\Types\\Mixed_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', + 'phpDocumentor\\Reflection\\Types\\Never_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Never_.php', + 'phpDocumentor\\Reflection\\Types\\Null_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Null_.php', + 'phpDocumentor\\Reflection\\Types\\Nullable' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Nullable.php', + 'phpDocumentor\\Reflection\\Types\\Object_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Object_.php', + 'phpDocumentor\\Reflection\\Types\\Parent_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Parent_.php', + 'phpDocumentor\\Reflection\\Types\\Resource_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Resource_.php', + 'phpDocumentor\\Reflection\\Types\\Scalar' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Scalar.php', + 'phpDocumentor\\Reflection\\Types\\Self_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Self_.php', + 'phpDocumentor\\Reflection\\Types\\Static_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Static_.php', + 'phpDocumentor\\Reflection\\Types\\String_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/String_.php', + 'phpDocumentor\\Reflection\\Types\\This' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/This.php', + 'phpDocumentor\\Reflection\\Types\\Void_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Void_.php', + 'phpDocumentor\\Reflection\\Utils' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Utils.php', ); public static function getInitializer(ClassLoader $loader) @@ -194,6 +1999,7 @@ public static function getInitializer(ClassLoader $loader) return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$prefixesPsr0; $loader->classMap = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$classMap; }, null, ClassLoader::class); diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 5b5f1125..517a6b61 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,597 +1,1938 @@ -[ - { - "name": "bamarni/composer-bin-plugin", - "version": "v1.5.0", - "version_normalized": "1.5.0.0", - "source": { - "type": "git", - "url": "https://github.com/bamarni/composer-bin-plugin.git", - "reference": "49934ffea764864788334c1485fbb08a4b852031" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/49934ffea764864788334c1485fbb08a4b852031", - "reference": "49934ffea764864788334c1485fbb08a4b852031", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": "^5.5.9 || ^7.0 || ^8.0" - }, - "require-dev": { - "composer/composer": "^1.0 || ^2.0", - "symfony/console": "^2.5 || ^3.0 || ^4.0" - }, - "time": "2022-02-22T21:01:25+00:00", - "type": "composer-plugin", - "extra": { - "class": "Bamarni\\Composer\\Bin\\Plugin" - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Bamarni\\Composer\\Bin\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "No conflicts for your bin dependencies", - "keywords": [ - "composer", - "conflict", - "dependency", - "executable", - "isolation", - "tool" - ] - }, - { - "name": "psr/container", - "version": "1.1.2", - "version_normalized": "1.1.2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "time": "2021-11-05T16:50:12+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" - } - }, - { - "name": "symfony/console", - "version": "v4.4.43", - "version_normalized": "4.4.43.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "8a2628d2d5639f35113dc1b833ecd91e1ed1cf46" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8a2628d2d5639f35113dc1b833ecd91e1ed1cf46", - "reference": "8a2628d2d5639f35113dc1b833ecd91e1ed1cf46", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/lock": "<4.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "time": "2022-06-23T12:22:25+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/console/tree/v4.4.43" - }, - "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" - } - ] - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.5.2", - "version_normalized": "2.5.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2022-01-02T09:53:40+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" - }, - "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" - } - ] - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", - "version_normalized": "1.26.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "shasum": "" +{ + "packages": [ + { + "name": "amphp/amp", + "version": "v2.6.2", + "version_normalized": "2.6.2.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" + }, + "time": "2022-02-20T17:52:18+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "install-path": "../amphp/amp" }, - "require": { - "php": ">=7.1" + { + "name": "amphp/byte-stream", + "version": "v1.8.1", + "version_normalized": "1.8.1.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "time": "2021-03-30T17:13:30+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "http://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "install-path": "../amphp/byte-stream" }, - "provide": { - "ext-mbstring": "*" + { + "name": "bamarni/composer-bin-plugin", + "version": "v1.5.0", + "version_normalized": "1.5.0.0", + "source": { + "type": "git", + "url": "https://github.com/bamarni/composer-bin-plugin.git", + "reference": "49934ffea764864788334c1485fbb08a4b852031" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/49934ffea764864788334c1485fbb08a4b852031", + "reference": "49934ffea764864788334c1485fbb08a4b852031", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": "^5.5.9 || ^7.0 || ^8.0" + }, + "require-dev": { + "composer/composer": "^1.0 || ^2.0", + "symfony/console": "^2.5 || ^3.0 || ^4.0" + }, + "time": "2022-02-22T21:01:25+00:00", + "type": "composer-plugin", + "extra": { + "class": "Bamarni\\Composer\\Bin\\Plugin" + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Bamarni\\Composer\\Bin\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "No conflicts for your bin dependencies", + "keywords": [ + "composer", + "conflict", + "dependency", + "executable", + "isolation", + "tool" + ], + "install-path": "../bamarni/composer-bin-plugin" }, - "suggest": { - "ext-mbstring": "For best performance" + { + "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" }, - "time": "2022-05-24T11:49:31+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + { + "name": "composer/pcre", + "version": "3.0.0", + "version_normalized": "3.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "time": "2022-02-25T20:21:48+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.0.0" + }, + "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": "./pcre" }, - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + { + "name": "composer/semver", + "version": "3.3.2", + "version_normalized": "3.3.2.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "time": "2022-04-01T19:23:25+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "install-path": "./semver" }, - "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.26.0" + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "time": "2022-02-25T21:32:43+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "install-path": "./xdebug-handler" }, - "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" - } - ] - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.26.0", - "version_normalized": "1.26.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "version_normalized": "0.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "time": "2019-12-04T15:06:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "install-path": "../dnoegel/php-xdg-base-dir" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", - "shasum": "" + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "version_normalized": "3.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "time": "2021-06-11T22:34:44+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "install-path": "../felixfbecker/advanced-json-rpc" }, - "require": { - "php": ">=7.1" + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", + "version_normalized": "1.5.2.0", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "time": "2022-03-02T22:36:06+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + }, + "install-path": "../felixfbecker/language-server-protocol" }, - "time": "2022-05-24T11:49:31+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + { + "name": "netresearch/jsonmapper", + "version": "v4.0.0", + "version_normalized": "4.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "time": "2020-12-01T19:48:11+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" + }, + "install-path": "../netresearch/jsonmapper" }, - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" + { + "name": "nikic/php-parser", + "version": "v4.14.0", + "version_normalized": "4.14.0.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "time": "2022-05-31T20:59:12+00:00", + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" }, - "classmap": [ - "Resources/stubs" - ] + "install-path": "../nikic/php-parser" }, - "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.26.0" + { + "name": "openlss/lib-array2xml", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/nullivex/lib-array2xml.git", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "time": "2019-03-29T20:06:56+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "LSS": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Bryan Tong", + "email": "bryan@nullivex.com", + "homepage": "https://www.nullivex.com" + }, + { + "name": "Tony Butler", + "email": "spudz76@gmail.com", + "homepage": "https://www.nullivex.com" + } + ], + "description": "Array2XML conversion library credit to lalit.org", + "homepage": "https://www.nullivex.com", + "keywords": [ + "array", + "array conversion", + "xml", + "xml conversion" + ], + "support": { + "issues": "https://github.com/nullivex/lib-array2xml/issues", + "source": "https://github.com/nullivex/lib-array2xml/tree/master" + }, + "install-path": "../openlss/lib-array2xml" }, - "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" - } - ] - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.26.0", - "version_normalized": "1.26.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "version_normalized": "2.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "time": "2020-06-27T09:03:43+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "install-path": "../phpdocumentor/reflection-common" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "shasum": "" + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "version_normalized": "5.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "time": "2021-10-19T17:43:47+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "installation-source": "dist", + "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.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "install-path": "../phpdocumentor/reflection-docblock" }, - "require": { - "php": ">=7.1" + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.1", + "version_normalized": "1.6.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "77a32518733312af16a44300404e945338981de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "time": "2022-03-15T21:29:03+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "installation-source": "dist", + "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/1.6.1" + }, + "install-path": "../phpdocumentor/type-resolver" }, - "time": "2022-05-10T07:21:04+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + { + "name": "psr/container", + "version": "1.1.2", + "version_normalized": "1.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "time": "2021-11-05T16:50:12+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "install-path": "../psr/container" }, - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" + { + "name": "psr/log", + "version": "1.1.4", + "version_normalized": "1.1.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2021-05-03T11:20:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "classmap": [ - "Resources/stubs" - ] + "install-path": "../psr/log" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + { + "name": "sebastian/diff", + "version": "4.0.4", + "version_normalized": "4.0.4.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "time": "2020-10-26T13:10:38+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "install-path": "../sebastian/diff" }, - "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" - } - ] - }, - { - "name": "symfony/service-contracts", - "version": "v2.5.2", - "version_normalized": "2.5.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + { + "name": "symfony/console", + "version": "v4.4.43", + "version_normalized": "4.4.43.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "8a2628d2d5639f35113dc1b833ecd91e1ed1cf46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/8a2628d2d5639f35113dc1b833ecd91e1ed1cf46", + "reference": "8a2628d2d5639f35113dc1b833ecd91e1ed1cf46", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/lock": "<4.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "time": "2022-06-23T12:22:25+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v4.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/console" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "shasum": "" + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "time": "2022-01-02T09:53:40+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/deprecation-contracts" }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" + { + "name": "symfony/polyfill-mbstring", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2022-05-24T11:49:31+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "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.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-mbstring" }, - "conflict": { - "ext-psr": "<1.1|>=2" + { + "name": "symfony/polyfill-php73", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "time": "2022-05-24T11:49:31+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "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.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php73" }, - "suggest": { - "symfony/service-implementation": "" + { + "name": "symfony/polyfill-php80", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "time": "2022-05-10T07:21:04+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php80" }, - "time": "2022-05-30T19:17:29+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + { + "name": "symfony/service-contracts", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "time": "2022-05-30T19:17:29+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/service-contracts" }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } + { + "name": "vimeo/psalm", + "version": "4.26.0", + "version_normalized": "4.26.0.0", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "6998fabb2bf528b65777bf9941920888d23c03ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/6998fabb2bf528b65777bf9941920888d23c03ac", + "reference": "6998fabb2bf528b65777bf9941920888d23c03ac", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer/package-versions-deprecated": "^1.8.0", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.0.3", + "felixfbecker/language-server-protocol": "^1.5", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.13", + "openlss/lib-array2xml": "^1.0", + "php": "^7.1|^8", + "sebastian/diff": "^3.0 || ^4.0", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.25", + "webmozart/path-util": "^2.3" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "brianium/paratest": "^4.0||^6.0", + "ext-curl": "*", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpdocumentor/reflection-docblock": "^5", + "phpmyadmin/sql-parser": "5.1.0||dev-master", + "phpspec/prophecy": ">=1.9.0", + "phpunit/phpunit": "^9.0", + "psalm/plugin-phpunit": "^0.16", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.3 || ^5.0 || ^6.0", + "weirdan/prophecy-shim": "^1.0 || ^2.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "time": "2022-07-31T13:10:26+00:00", + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions.php", + "src/spl_object_id.php" + ], + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php" + ], + "support": { + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm/tree/4.26.0" + }, + "install-path": "../vimeo/psalm" }, - "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.5.2" + { + "name": "webmozart/assert", + "version": "1.11.0", + "version_normalized": "1.11.0.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "time": "2022-06-03T18:03:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "installation-source": "dist", + "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/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "install-path": "../webmozart/assert" }, - "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" - } - ] - } -] + { + "name": "webmozart/path-util", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/path-util.git", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "webmozart/assert": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "time": "2015-12-17T08:42:14+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Webmozart\\PathUtil\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", + "support": { + "issues": "https://github.com/webmozart/path-util/issues", + "source": "https://github.com/webmozart/path-util/tree/2.3.0" + }, + "abandoned": "symfony/filesystem", + "install-path": "../webmozart/path-util" + } + ], + "dev": true, + "dev-package-names": [ + "amphp/amp", + "amphp/byte-stream", + "bamarni/composer-bin-plugin", + "composer/package-versions-deprecated", + "composer/pcre", + "composer/semver", + "composer/xdebug-handler", + "dnoegel/php-xdg-base-dir", + "felixfbecker/advanced-json-rpc", + "felixfbecker/language-server-protocol", + "netresearch/jsonmapper", + "nikic/php-parser", + "openlss/lib-array2xml", + "phpdocumentor/reflection-common", + "phpdocumentor/reflection-docblock", + "phpdocumentor/type-resolver", + "psr/log", + "sebastian/diff", + "vimeo/psalm", + "webmozart/assert", + "webmozart/path-util" + ] +} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 701ecf33..7b567c6b 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -1,101 +1,293 @@ array( + 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', + 'reference' => '86df76f48f6646656a8094e0de0ae1956fd565d9', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '0272cf514a21042263535c1555af65a1f920effb', - 'name' => '__root__', 'dev' => true, ), 'versions' => array( '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', + 'reference' => '86df76f48f6646656a8094e0de0ae1956fd565d9', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '0272cf514a21042263535c1555af65a1f920effb', 'dev_requirement' => false, ), + 'amphp/amp' => array( + 'pretty_version' => 'v2.6.2', + 'version' => '2.6.2.0', + 'reference' => '9d5100cebffa729aaffecd3ad25dc5aeea4f13bb', + 'type' => 'library', + 'install_path' => __DIR__ . '/../amphp/amp', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'amphp/byte-stream' => array( + 'pretty_version' => 'v1.8.1', + 'version' => '1.8.1.0', + 'reference' => 'acbd8002b3536485c997c4e019206b3f10ca15bd', + 'type' => 'library', + 'install_path' => __DIR__ . '/../amphp/byte-stream', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'bamarni/composer-bin-plugin' => array( 'pretty_version' => 'v1.5.0', 'version' => '1.5.0.0', + 'reference' => '49934ffea764864788334c1485fbb08a4b852031', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../bamarni/composer-bin-plugin', 'aliases' => array(), - 'reference' => '49934ffea764864788334c1485fbb08a4b852031', '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.0.0', + 'version' => '3.0.0.0', + 'reference' => 'e300eb6c535192decd27a85bc72a9290f0d6b3bd', + 'type' => 'library', + 'install_path' => __DIR__ . '/./pcre', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'composer/semver' => array( + 'pretty_version' => '3.3.2', + 'version' => '3.3.2.0', + 'reference' => '3953f23262f2bff1919fc82183ad9acb13ff62c9', + 'type' => 'library', + 'install_path' => __DIR__ . '/./semver', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'composer/xdebug-handler' => array( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'reference' => 'ced299686f41dce890debac69273b47ffe98a40c', + 'type' => 'library', + 'install_path' => __DIR__ . '/./xdebug-handler', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'dnoegel/php-xdg-base-dir' => array( + 'pretty_version' => 'v0.1.1', + 'version' => '0.1.1.0', + 'reference' => '8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd', + 'type' => 'library', + 'install_path' => __DIR__ . '/../dnoegel/php-xdg-base-dir', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'felixfbecker/advanced-json-rpc' => array( + 'pretty_version' => 'v3.2.1', + 'version' => '3.2.1.0', + 'reference' => 'b5f37dbff9a8ad360ca341f3240dc1c168b45447', + 'type' => 'library', + 'install_path' => __DIR__ . '/../felixfbecker/advanced-json-rpc', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'felixfbecker/language-server-protocol' => array( + 'pretty_version' => 'v1.5.2', + 'version' => '1.5.2.0', + 'reference' => '6e82196ffd7c62f7794d778ca52b69feec9f2842', + 'type' => 'library', + 'install_path' => __DIR__ . '/../felixfbecker/language-server-protocol', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'netresearch/jsonmapper' => array( + 'pretty_version' => 'v4.0.0', + 'version' => '4.0.0.0', + 'reference' => '8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../netresearch/jsonmapper', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'nikic/php-parser' => array( + 'pretty_version' => 'v4.14.0', + 'version' => '4.14.0.0', + 'reference' => '34bea19b6e03d8153165d8f30bba4c3be86184c1', + 'type' => 'library', + 'install_path' => __DIR__ . '/../nikic/php-parser', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'ocramius/package-versions' => array( + 'dev_requirement' => true, + 'replaced' => array( + 0 => '1.11.99', + ), + ), + 'openlss/lib-array2xml' => array( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'reference' => 'a91f18a8dfc69ffabe5f9b068bc39bb202c81d90', + 'type' => 'library', + 'install_path' => __DIR__ . '/../openlss/lib-array2xml', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'phpdocumentor/reflection-common' => array( + 'pretty_version' => '2.2.0', + 'version' => '2.2.0.0', + 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpdocumentor/reflection-common', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'phpdocumentor/reflection-docblock' => array( + 'pretty_version' => '5.3.0', + 'version' => '5.3.0.0', + 'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'phpdocumentor/type-resolver' => array( + 'pretty_version' => '1.6.1', + 'version' => '1.6.1.0', + 'reference' => '77a32518733312af16a44300404e945338981de3', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'psalm/psalm' => array( + 'dev_requirement' => true, + 'provided' => array( + 0 => '4.26.0', + ), + ), 'psr/container' => array( 'pretty_version' => '1.1.2', 'version' => '1.1.2.0', + 'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/container', 'aliases' => array(), - 'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea', 'dev_requirement' => false, ), + 'psr/log' => array( + 'pretty_version' => '1.1.4', + 'version' => '1.1.4.0', + 'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/log', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'psr/log-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0|2.0', ), ), + 'sebastian/diff' => array( + 'pretty_version' => '4.0.4', + 'version' => '4.0.4.0', + 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../sebastian/diff', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'symfony/console' => array( 'pretty_version' => 'v4.4.43', 'version' => '4.4.43.0', + 'reference' => '8a2628d2d5639f35113dc1b833ecd91e1ed1cf46', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), - 'reference' => '8a2628d2d5639f35113dc1b833ecd91e1ed1cf46', 'dev_requirement' => false, ), 'symfony/deprecation-contracts' => array( 'pretty_version' => 'v2.5.2', 'version' => '2.5.2.0', + 'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), - 'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66', 'dev_requirement' => false, ), 'symfony/polyfill-mbstring' => array( 'pretty_version' => 'v1.26.0', 'version' => '1.26.0.0', + 'reference' => '9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), - 'reference' => '9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e', 'dev_requirement' => false, ), 'symfony/polyfill-php73' => array( 'pretty_version' => 'v1.26.0', 'version' => '1.26.0.0', + 'reference' => 'e440d35fa0286f77fb45b79a03fedbeda9307e85', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', 'aliases' => array(), - 'reference' => 'e440d35fa0286f77fb45b79a03fedbeda9307e85', 'dev_requirement' => false, ), 'symfony/polyfill-php80' => array( 'pretty_version' => 'v1.26.0', 'version' => '1.26.0.0', + 'reference' => 'cfa0ae98841b9e461207c13ab093d76b0fa7bace', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), - 'reference' => 'cfa0ae98841b9e461207c13ab093d76b0fa7bace', 'dev_requirement' => false, ), 'symfony/service-contracts' => array( 'pretty_version' => 'v2.5.2', 'version' => '2.5.2.0', + 'reference' => '4b426aac47d6427cc1a1d0f7e2ac724627f5966c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), - 'reference' => '4b426aac47d6427cc1a1d0f7e2ac724627f5966c', 'dev_requirement' => false, ), + 'vimeo/psalm' => array( + 'pretty_version' => '4.26.0', + 'version' => '4.26.0.0', + 'reference' => '6998fabb2bf528b65777bf9941920888d23c03ac', + 'type' => 'library', + 'install_path' => __DIR__ . '/../vimeo/psalm', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'webmozart/assert' => array( + 'pretty_version' => '1.11.0', + 'version' => '1.11.0.0', + 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', + 'type' => 'library', + 'install_path' => __DIR__ . '/../webmozart/assert', + 'aliases' => array(), + 'dev_requirement' => true, + ), + 'webmozart/path-util' => array( + 'pretty_version' => '2.3.0', + 'version' => '2.3.0.0', + 'reference' => 'd939f7edc24c9a1bb9c0dee5cb05d8e859490725', + 'type' => 'library', + 'install_path' => __DIR__ . '/../webmozart/path-util', + 'aliases' => array(), + 'dev_requirement' => true, + ), ), ); diff --git a/vendor/composer/package-versions-deprecated/CHANGELOG.md b/vendor/composer/package-versions-deprecated/CHANGELOG.md new file mode 100644 index 00000000..a838c56a --- /dev/null +++ b/vendor/composer/package-versions-deprecated/CHANGELOG.md @@ -0,0 +1,120 @@ +# 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 new file mode 100644 index 00000000..71806175 --- /dev/null +++ b/vendor/composer/package-versions-deprecated/CONTRIBUTING.md @@ -0,0 +1,39 @@ +--- +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/LICENSE b/vendor/composer/package-versions-deprecated/LICENSE new file mode 100644 index 00000000..a90b0792 --- /dev/null +++ b/vendor/composer/package-versions-deprecated/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2016 Marco Pivetta + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/composer/package-versions-deprecated/README.md b/vendor/composer/package-versions-deprecated/README.md new file mode 100644 index 00000000..8bea9d41 --- /dev/null +++ b/vendor/composer/package-versions-deprecated/README.md @@ -0,0 +1,7 @@ +# 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 new file mode 100644 index 00000000..da9c516d --- /dev/null +++ b/vendor/composer/package-versions-deprecated/SECURITY.md @@ -0,0 +1,5 @@ +## 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 new file mode 100644 index 00000000..d5a40daa --- /dev/null +++ b/vendor/composer/package-versions-deprecated/composer.json @@ -0,0 +1,48 @@ +{ + "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 new file mode 100644 index 00000000..b711f6b1 --- /dev/null +++ b/vendor/composer/package-versions-deprecated/composer.lock @@ -0,0 +1,2603 @@ +{ + "_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 new file mode 100644 index 00000000..18e5fe64 --- /dev/null +++ b/vendor/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php @@ -0,0 +1,128 @@ + + */ + 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 new file mode 100644 index 00000000..05bdac9a --- /dev/null +++ b/vendor/composer/package-versions-deprecated/src/PackageVersions/Installer.php @@ -0,0 +1,290 @@ + + * @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 new file mode 100644 index 00000000..c1f45b5d --- /dev/null +++ b/vendor/composer/package-versions-deprecated/src/PackageVersions/Versions.php @@ -0,0 +1,94 @@ + fn ($match) => strtoupper($match[0])], $string); +$filtered = preg_grep('{[a-z]}', $elements); +$array = preg_split('{[a-z]+}', $string); +``` + +You can now call these on the `Preg` class: + +```php +use Composer\Pcre\Preg; + +if (Preg::match('{fo+}', $string, $matches)) { ... } +if (Preg::matchWithOffsets('{fo+}', $string, $matches)) { ... } +if (Preg::matchAll('{fo+}', $string, $matches)) { ... } +$newString = Preg::replace('{fo+}', 'bar', $string); +$newString = Preg::replaceCallback('{fo+}', function ($match) { return strtoupper($match[0]); }, $string); +$newString = Preg::replaceCallbackArray(['{fo+}' => fn ($match) => strtoupper($match[0])], $string); +$filtered = Preg::grep('{[a-z]}', $elements); +$array = Preg::split('{[a-z]+}', $string); +``` + +The main difference is if anything fails to match/replace/.., it will throw a `Composer\Pcre\PcreException` +instead of returning `null` (or false in some cases), so you can now use the return values safely relying on +the fact that they can only be strings (for replace), ints (for match) or arrays (for grep/split). + +Additionally the `Preg` class provides match methods that return `bool` rather than `int`, for stricter type safety +when the number of pattern matches is not useful: + +```php +use Composer\Pcre\Preg; + +if (Preg::isMatch('{fo+}', $string, $matches)) // bool +if (Preg::isMatchAll('{fo+}', $string, $matches)) // bool +``` + +If you would prefer a slightly more verbose usage, replacing by-ref arguments by result objects, you can use the `Regex` class: + +```php +use Composer\Pcre\Regex; + +// this is useful when you are just interested in knowing if something matched +// as it returns a bool instead of int(1/0) for match +$bool = Regex::isMatch('{fo+}', $string); + +$result = Regex::match('{fo+}', $string); +if ($result->matched) { something($result->matches); } + +$result = Regex::matchWithOffsets('{fo+}', $string); +if ($result->matched) { something($result->matches); } + +$result = Regex::matchAll('{fo+}', $string); +if ($result->matched && $result->count > 3) { something($result->matches); } + +$newString = Regex::replace('{fo+}', 'bar', $string)->result; +$newString = Regex::replaceCallback('{fo+}', function ($match) { return strtoupper($match[0]); }, $string)->result; +$newString = Regex::replaceCallbackArray(['{fo+}' => fn ($match) => strtoupper($match[0])], $string)->result; +``` + +Note that `preg_grep` and `preg_split` are only callable via the `Preg` class as they do not have +complex return types warranting a specific result object. + +See the [MatchResult](src/MatchResult.php), [MatchWithOffsetsResult](src/MatchWithOffsetsResult.php), [MatchAllResult](src/MatchAllResult.php), +[MatchAllWithOffsetsResult](src/MatchAllWithOffsetsResult.php), and [ReplaceResult](src/ReplaceResult.php) class sources for more details. + +Restrictions / Limitations +-------------------------- + +Due to type safety requirements a few restrictions are in place. + +- matching using `PREG_OFFSET_CAPTURE` is made available via `matchWithOffsets` and `matchAllWithOffsets`. + You cannot pass the flag to `match`/`matchAll`. +- `Preg::split` will also reject `PREG_SPLIT_OFFSET_CAPTURE` and you should use `splitWithOffsets` + instead. +- `matchAll` rejects `PREG_SET_ORDER` as it also changes the shape of the returned matches. There + is no alternative provided as you can fairly easily code around it. +- `preg_filter` is not supported as it has a rather crazy API, most likely you should rather + use `Preg::grep` in combination with some loop and `Preg::replace`. +- `replace`, `replaceCallback` and `replaceCallbackArray` do not support an array `$subject`, + only simple strings. +- As of 2.0, the library always uses `PREG_UNMATCHED_AS_NULL` for matching, which offers [much + saner/more predictable results](#preg_unmatched_as_null). As of 3.0 the flag is also set for + `replaceCallback` and `replaceCallbackArray`. + +#### PREG_UNMATCHED_AS_NULL + +As of 2.0, this library always uses PREG_UNMATCHED_AS_NULL for all `match*` and `isMatch*` +functions. As of 3.0 it is also done for `replaceCallback` and `replaceCallbackArray`. + +This means your matches will always contain all matching groups, either as null if unmatched +or as string if it matched. + +The advantages in clarity and predictability are clearer if you compare the two outputs of +running this with and without PREG_UNMATCHED_AS_NULL in $flags: + +```php +preg_match('/(a)(b)*(c)(d)*/', 'ac', $matches, $flags); +``` + +| no flag | PREG_UNMATCHED_AS_NULL | +| --- | --- | +| array (size=4) | array (size=5) | +| 0 => string 'ac' (length=2) | 0 => string 'ac' (length=2) | +| 1 => string 'a' (length=1) | 1 => string 'a' (length=1) | +| 2 => string '' (length=0) | 2 => null | +| 3 => string 'c' (length=1) | 3 => string 'c' (length=1) | +| | 4 => null | +| group 2 (any unmatched group preceding one that matched) is set to `''`. You cannot tell if it matched an empty string or did not match at all | group 2 is `null` when unmatched and a string if it matched, easy to check for | +| group 4 (any optional group without a matching one following) is missing altogether. So you have to check with `isset()`, but really you want `isset($m[4]) && $m[4] !== ''` for safety unless you are very careful to check that a non-optional group follows it | group 4 is always set, and null in this case as there was no match, easy to check for with `$m[4] !== null` | + +License +------- + +composer/pcre is licensed under the MIT License, see the LICENSE file for details. diff --git a/vendor/composer/pcre/composer.json b/vendor/composer/pcre/composer.json new file mode 100644 index 00000000..40477ff4 --- /dev/null +++ b/vendor/composer/pcre/composer.json @@ -0,0 +1,46 @@ +{ + "name": "composer/pcre", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "type": "library", + "license": "MIT", + "keywords": [ + "pcre", + "regex", + "preg", + "regular expression" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5", + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1" + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Composer\\Pcre\\": "tests" + } + }, + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "scripts": { + "test": "vendor/bin/simple-phpunit", + "phpstan": "phpstan analyse" + } +} diff --git a/vendor/composer/pcre/phpstan-baseline.neon b/vendor/composer/pcre/phpstan-baseline.neon new file mode 100644 index 00000000..df994246 --- /dev/null +++ b/vendor/composer/pcre/phpstan-baseline.neon @@ -0,0 +1,17 @@ +parameters: + ignoreErrors: + - + message: "#^Method Composer\\\\Pcre\\\\Preg\\:\\:matchAll\\(\\) should return int\\<0, max\\> but returns int\\.$#" + count: 1 + path: src/Preg.php + + - + message: "#^Method Composer\\\\Pcre\\\\Preg\\:\\:matchAllWithOffsets\\(\\) should return int\\<0, max\\> but returns int\\.$#" + count: 1 + path: src/Preg.php + + - + message: "#^Strict comparison using \\=\\=\\= between int and null will always evaluate to false\\.$#" + count: 2 + path: src/Preg.php + diff --git a/vendor/composer/pcre/src/MatchAllResult.php b/vendor/composer/pcre/src/MatchAllResult.php new file mode 100644 index 00000000..4c367b03 --- /dev/null +++ b/vendor/composer/pcre/src/MatchAllResult.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Pcre; + +final class MatchAllResult +{ + /** + * An array of match group => list of matched strings + * + * @readonly + * @var array> + */ + public $matches; + + /** + * @readonly + * @var 0|positive-int + */ + public $count; + + /** + * @readonly + * @var bool + */ + public $matched; + + /** + * @param 0|positive-int $count + * @param array> $matches + */ + public function __construct($count, array $matches) + { + $this->matches = $matches; + $this->matched = (bool) $count; + $this->count = $count; + } +} diff --git a/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php b/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php new file mode 100644 index 00000000..4e893fec --- /dev/null +++ b/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Pcre; + +final class MatchAllWithOffsetsResult +{ + /** + * An array of match group => list of matches, every match being a pair of string matched + offset in bytes (or -1 if no match) + * + * @readonly + * @var array> + * @phpstan-var array}>> + */ + public $matches; + + /** + * @readonly + * @var 0|positive-int + */ + public $count; + + /** + * @readonly + * @var bool + */ + public $matched; + + /** + * @param 0|positive-int $count + * @param array> $matches + * @phpstan-param array}>> $matches + */ + public function __construct($count, array $matches) + { + $this->matches = $matches; + $this->matched = (bool) $count; + $this->count = $count; + } +} diff --git a/vendor/composer/pcre/src/MatchResult.php b/vendor/composer/pcre/src/MatchResult.php new file mode 100644 index 00000000..d8e34606 --- /dev/null +++ b/vendor/composer/pcre/src/MatchResult.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Pcre; + +final class MatchResult +{ + /** + * An array of match group => string matched + * + * @readonly + * @var array + */ + public $matches; + + /** + * @readonly + * @var bool + */ + public $matched; + + /** + * @param 0|positive-int $count + * @param array $matches + */ + public function __construct($count, array $matches) + { + $this->matches = $matches; + $this->matched = (bool) $count; + } +} diff --git a/vendor/composer/pcre/src/MatchWithOffsetsResult.php b/vendor/composer/pcre/src/MatchWithOffsetsResult.php new file mode 100644 index 00000000..9bd813bb --- /dev/null +++ b/vendor/composer/pcre/src/MatchWithOffsetsResult.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Pcre; + +final class MatchWithOffsetsResult +{ + /** + * An array of match group => pair of string matched + offset in bytes (or -1 if no match) + * + * @readonly + * @var array + * @phpstan-var array}> + */ + public $matches; + + /** + * @readonly + * @var bool + */ + public $matched; + + /** + * @param 0|positive-int $count + * @param array $matches + * @phpstan-param array}> $matches + */ + public function __construct($count, array $matches) + { + $this->matches = $matches; + $this->matched = (bool) $count; + } +} diff --git a/vendor/composer/pcre/src/PcreException.php b/vendor/composer/pcre/src/PcreException.php new file mode 100644 index 00000000..218b2f2d --- /dev/null +++ b/vendor/composer/pcre/src/PcreException.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Pcre; + +class PcreException extends \RuntimeException +{ + /** + * @param string $function + * @param string|string[] $pattern + * @return self + */ + public static function fromFunction($function, $pattern) + { + $code = preg_last_error(); + + if (is_array($pattern)) { + $pattern = implode(', ', $pattern); + } + + return new PcreException($function.'(): failed executing "'.$pattern.'": '.self::pcreLastErrorMessage($code), $code); + } + + /** + * @param int $code + * @return string + */ + private static function pcreLastErrorMessage($code) + { + if (function_exists('preg_last_error_msg')) { + return preg_last_error_msg(); + } + + // older php versions did not set the code properly in all cases + if (PHP_VERSION_ID < 70201 && $code === 0) { + return 'UNDEFINED_ERROR'; + } + + $constants = get_defined_constants(true); + if (!isset($constants['pcre'])) { + return 'UNDEFINED_ERROR'; + } + + foreach ($constants['pcre'] as $const => $val) { + if ($val === $code && substr($const, -6) === '_ERROR') { + return $const; + } + } + + return 'UNDEFINED_ERROR'; + } +} diff --git a/vendor/composer/pcre/src/Preg.php b/vendor/composer/pcre/src/Preg.php new file mode 100644 index 00000000..af215779 --- /dev/null +++ b/vendor/composer/pcre/src/Preg.php @@ -0,0 +1,275 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Pcre; + +class Preg +{ + /** @internal */ + public const ARRAY_MSG = '$subject as an array is not supported. You can use \'foreach\' instead.'; + /** @internal */ + public const INVALID_TYPE_MSG = '$subject must be a string, %s given.'; + + /** + * @param non-empty-string $pattern + * @param array $matches Set by method + * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported + * @return 0|1 + */ + public static function match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int + { + if (($flags & PREG_OFFSET_CAPTURE) !== 0) { + throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the type of $matches, use matchWithOffsets() instead'); + } + + $result = preg_match($pattern, $subject, $matches, $flags | PREG_UNMATCHED_AS_NULL, $offset); + if ($result === false) { + throw PcreException::fromFunction('preg_match', $pattern); + } + + return $result; + } + + /** + * Runs preg_match with PREG_OFFSET_CAPTURE + * + * @param non-empty-string $pattern + * @param array $matches Set by method + * @param int $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported + * @return 0|1 + * + * @phpstan-param array}> $matches + */ + public static function matchWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0): int + { + $result = preg_match($pattern, $subject, $matches, $flags | PREG_UNMATCHED_AS_NULL | PREG_OFFSET_CAPTURE, $offset); + if ($result === false) { + throw PcreException::fromFunction('preg_match', $pattern); + } + + return $result; + } + + /** + * @param non-empty-string $pattern + * @param array> $matches Set by method + * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported + * @return 0|positive-int + */ + public static function matchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int + { + if (($flags & PREG_OFFSET_CAPTURE) !== 0) { + throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the type of $matches, use matchAllWithOffsets() instead'); + } + + if (($flags & PREG_SET_ORDER) !== 0) { + throw new \InvalidArgumentException('PREG_SET_ORDER is not supported as it changes the type of $matches'); + } + + $result = preg_match_all($pattern, $subject, $matches, $flags | PREG_UNMATCHED_AS_NULL, $offset); + if ($result === false || /* PHP < 8 may return null */ $result === null) { + throw PcreException::fromFunction('preg_match_all', $pattern); + } + + return $result; + } + + /** + * Runs preg_match_all with PREG_OFFSET_CAPTURE + * + * @param non-empty-string $pattern + * @param array> $matches Set by method + * @param int $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported + * @return 0|positive-int + * + * @phpstan-param array}>> $matches + */ + public static function matchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0): int + { + $result = preg_match_all($pattern, $subject, $matches, $flags | PREG_UNMATCHED_AS_NULL | PREG_OFFSET_CAPTURE, $offset); + if ($result === false || /* PHP < 8 may return null */ $result === null) { + throw PcreException::fromFunction('preg_match_all', $pattern); + } + + return $result; + } + + /** + * @param string|string[] $pattern + * @param string|string[] $replacement + * @param string $subject + * @param int $count Set by method + */ + public static function replace($pattern, $replacement, $subject, int $limit = -1, int &$count = null): string + { + if (!is_scalar($subject)) { + if (is_array($subject)) { + throw new \InvalidArgumentException(static::ARRAY_MSG); + } + + throw new \TypeError(sprintf(static::INVALID_TYPE_MSG, gettype($subject))); + } + + $result = preg_replace($pattern, $replacement, $subject, $limit, $count); + if ($result === null) { + throw PcreException::fromFunction('preg_replace', $pattern); + } + + return $result; + } + + /** + * @param string|string[] $pattern + * @param string $subject + * @param int $count Set by method + * @param int $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set + */ + public static function replaceCallback($pattern, callable $replacement, $subject, int $limit = -1, int &$count = null, int $flags = 0): string + { + if (!is_scalar($subject)) { + if (is_array($subject)) { + throw new \InvalidArgumentException(static::ARRAY_MSG); + } + + throw new \TypeError(sprintf(static::INVALID_TYPE_MSG, gettype($subject))); + } + + $result = preg_replace_callback($pattern, $replacement, $subject, $limit, $count, $flags | PREG_UNMATCHED_AS_NULL); + if ($result === null) { + throw PcreException::fromFunction('preg_replace_callback', $pattern); + } + + return $result; + } + + /** + * @param array $pattern + * @param string $subject + * @param int $count Set by method + * @param int $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set + */ + public static function replaceCallbackArray(array $pattern, $subject, int $limit = -1, int &$count = null, int $flags = 0): string + { + if (!is_scalar($subject)) { + if (is_array($subject)) { + throw new \InvalidArgumentException(static::ARRAY_MSG); + } + + throw new \TypeError(sprintf(static::INVALID_TYPE_MSG, gettype($subject))); + } + + $result = preg_replace_callback_array($pattern, $subject, $limit, $count, $flags | PREG_UNMATCHED_AS_NULL); + if ($result === null) { + $pattern = array_keys($pattern); + throw PcreException::fromFunction('preg_replace_callback_array', $pattern); + } + + return $result; + } + + /** + * @param int $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE + * @return list + */ + public static function split(string $pattern, string $subject, int $limit = -1, int $flags = 0): array + { + if (($flags & PREG_SPLIT_OFFSET_CAPTURE) !== 0) { + throw new \InvalidArgumentException('PREG_SPLIT_OFFSET_CAPTURE is not supported as it changes the type of $matches, use splitWithOffsets() instead'); + } + + $result = preg_split($pattern, $subject, $limit, $flags); + if ($result === false) { + throw PcreException::fromFunction('preg_split', $pattern); + } + + return $result; + } + + /** + * @param int $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE, PREG_SPLIT_OFFSET_CAPTURE is always set + * @return list + * @phpstan-return list}> + */ + public static function splitWithOffsets(string $pattern, string $subject, int $limit = -1, int $flags = 0): array + { + $result = preg_split($pattern, $subject, $limit, $flags | PREG_SPLIT_OFFSET_CAPTURE); + if ($result === false) { + throw PcreException::fromFunction('preg_split', $pattern); + } + + return $result; + } + + /** + * @template T of string|\Stringable + * @param string $pattern + * @param array $array + * @param int $flags PREG_GREP_INVERT + * @return array + */ + public static function grep(string $pattern, array $array, int $flags = 0): array + { + $result = preg_grep($pattern, $array, $flags); + if ($result === false) { + throw PcreException::fromFunction('preg_grep', $pattern); + } + + return $result; + } + + /** + * @param non-empty-string $pattern + * @param array $matches Set by method + * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported + */ + public static function isMatch(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): bool + { + return (bool) static::match($pattern, $subject, $matches, $flags, $offset); + } + + /** + * @param non-empty-string $pattern + * @param array> $matches Set by method + * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported + */ + public static function isMatchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): bool + { + return (bool) static::matchAll($pattern, $subject, $matches, $flags, $offset); + } + + /** + * Runs preg_match with PREG_OFFSET_CAPTURE + * + * @param non-empty-string $pattern + * @param array $matches Set by method + * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported + * + * @phpstan-param array}> $matches + */ + public static function isMatchWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0): bool + { + return (bool) static::matchWithOffsets($pattern, $subject, $matches, $flags, $offset); + } + + /** + * Runs preg_match_all with PREG_OFFSET_CAPTURE + * + * @param non-empty-string $pattern + * @param array> $matches Set by method + * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported + * + * @phpstan-param array}>> $matches + */ + public static function isMatchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0): bool + { + return (bool) static::matchAllWithOffsets($pattern, $subject, $matches, $flags, $offset); + } +} diff --git a/vendor/composer/pcre/src/Regex.php b/vendor/composer/pcre/src/Regex.php new file mode 100644 index 00000000..9e8e7b81 --- /dev/null +++ b/vendor/composer/pcre/src/Regex.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Pcre; + +class Regex +{ + /** + * @param non-empty-string $pattern + */ + public static function isMatch(string $pattern, string $subject, int $offset = 0): bool + { + return (bool) Preg::match($pattern, $subject, $matches, 0, $offset); + } + + /** + * @param non-empty-string $pattern + * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported + */ + public static function match(string $pattern, string $subject, int $flags = 0, int $offset = 0): MatchResult + { + if (($flags & PREG_OFFSET_CAPTURE) !== 0) { + throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the return type, use matchWithOffsets() instead'); + } + + $count = Preg::match($pattern, $subject, $matches, $flags, $offset); + + return new MatchResult($count, $matches); + } + + /** + * Runs preg_match with PREG_OFFSET_CAPTURE + * + * @param non-empty-string $pattern + * @param int $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported + */ + public static function matchWithOffsets(string $pattern, string $subject, int $flags = 0, int $offset = 0): MatchWithOffsetsResult + { + $count = Preg::matchWithOffsets($pattern, $subject, $matches, $flags, $offset); + + return new MatchWithOffsetsResult($count, $matches); + } + + /** + * @param non-empty-string $pattern + * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported + */ + public static function matchAll(string $pattern, string $subject, int $flags = 0, int $offset = 0): MatchAllResult + { + if (($flags & PREG_OFFSET_CAPTURE) !== 0) { + throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the return type, use matchAllWithOffsets() instead'); + } + + if (($flags & PREG_SET_ORDER) !== 0) { + throw new \InvalidArgumentException('PREG_SET_ORDER is not supported as it changes the return type'); + } + + $count = Preg::matchAll($pattern, $subject, $matches, $flags, $offset); + + return new MatchAllResult($count, $matches); + } + + /** + * Runs preg_match_all with PREG_OFFSET_CAPTURE + * + * @param non-empty-string $pattern + * @param int $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported + */ + public static function matchAllWithOffsets(string $pattern, string $subject, int $flags = 0, int $offset = 0): MatchAllWithOffsetsResult + { + $count = Preg::matchAllWithOffsets($pattern, $subject, $matches, $flags, $offset); + + return new MatchAllWithOffsetsResult($count, $matches); + } + /** + * @param string|string[] $pattern + * @param string|string[] $replacement + * @param string $subject + */ + public static function replace($pattern, $replacement, $subject, int $limit = -1): ReplaceResult + { + $result = Preg::replace($pattern, $replacement, $subject, $limit, $count); + + return new ReplaceResult($count, $result); + } + + /** + * @param string|string[] $pattern + * @param string $subject + * @param int $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set + */ + public static function replaceCallback($pattern, callable $replacement, $subject, int $limit = -1, int $flags = 0): ReplaceResult + { + $result = Preg::replaceCallback($pattern, $replacement, $subject, $limit, $count, $flags); + + return new ReplaceResult($count, $result); + } + + /** + * @param array $pattern + * @param string $subject + * @param int $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set + */ + public static function replaceCallbackArray(array $pattern, $subject, int $limit = -1, int $flags = 0): ReplaceResult + { + $result = Preg::replaceCallbackArray($pattern, $subject, $limit, $count, $flags); + + return new ReplaceResult($count, $result); + } +} diff --git a/vendor/composer/pcre/src/ReplaceResult.php b/vendor/composer/pcre/src/ReplaceResult.php new file mode 100644 index 00000000..0ac08401 --- /dev/null +++ b/vendor/composer/pcre/src/ReplaceResult.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Pcre; + +final class ReplaceResult +{ + /** + * @readonly + * @var string + */ + public $result; + + /** + * @readonly + * @var 0|positive-int + */ + public $count; + + /** + * @readonly + * @var bool + */ + public $matched; + + /** + * @param 0|positive-int $count + * @param string $result + */ + public function __construct($count, $result) + { + $this->count = $count; + $this->matched = (bool) $count; + $this->result = $result; + } +} diff --git a/vendor/composer/semver/CHANGELOG.md b/vendor/composer/semver/CHANGELOG.md new file mode 100644 index 00000000..c9514773 --- /dev/null +++ b/vendor/composer/semver/CHANGELOG.md @@ -0,0 +1,209 @@ +# Change Log + +All notable changes to this project will be documented in this file. +This project adheres to [Semantic Versioning](http://semver.org/). + +### [3.3.2] 2022-04-01 + + * Fixed handling of non-string values (#134) + +### [3.3.1] 2022-03-16 + + * Fixed possible cache key clash in the CompilingMatcher memoization (#132) + +### [3.3.0] 2022-03-15 + + * Improved performance of CompilingMatcher by memoizing more (#131) + * Added CompilingMatcher::clear to clear all memoization caches + +### [3.2.9] 2022-02-04 + + * Revert #129 (Fixed MultiConstraint with MatchAllConstraint) which caused regressions + +### [3.2.8] 2022-02-04 + + * Updates to latest phpstan / CI by @Seldaek in https://github.com/composer/semver/pull/130 + * Fixed MultiConstraint with MatchAllConstraint by @Toflar in https://github.com/composer/semver/pull/129 + +### [3.2.7] 2022-01-04 + + * Fixed: typo in type definition of Intervals class causing issues with Psalm scanning vendors + +### [3.2.6] 2021-10-25 + + * Fixed: type improvements to parseStability + +### [3.2.5] 2021-05-24 + + * Fixed: issue comparing disjunctive MultiConstraints to conjunctive ones (#127) + * Fixed: added complete type information using phpstan annotations + +### [3.2.4] 2020-11-13 + + * Fixed: code clean-up + +### [3.2.3] 2020-11-12 + + * Fixed: constraints in the form of `X || Y, >=Y.1` and other such complex constructs were in some cases being optimized into a more restrictive constraint + +### [3.2.2] 2020-10-14 + + * Fixed: internal code cleanups + +### [3.2.1] 2020-09-27 + + * Fixed: accidental validation of broken constraints combining ^/~ and wildcards, and -dev suffix allowing weird cases + * Fixed: normalization of beta0 and such which was dropping the 0 + +### [3.2.0] 2020-09-09 + + * Added: support for `x || @dev`, not very useful but seen in the wild and failed to validate with 1.5.2/1.6.0 + * Added: support for `foobar-dev` being equal to `dev-foobar`, dev-foobar is the official way to write it but we need to support the other for BC and convenience + +### [3.1.0] 2020-09-08 + + * Added: support for constraints like `^2.x-dev` and `~2.x-dev`, not very useful but seen in the wild and failed to validate with 3.0.1 + * Fixed: invalid aliases will no longer throw, unless explicitly validated by Composer in the root package + +### [3.0.1] 2020-09-08 + + * Fixed: handling of some invalid -dev versions which were seen as valid + +### [3.0.0] 2020-05-26 + + * Break: Renamed `EmptyConstraint`, replace it with `MatchAllConstraint` + * Break: Unlikely to affect anyone but strictly speaking a breaking change, `*.*` and such variants will not match all `dev-*` versions anymore, only `*` does + * Break: ConstraintInterface is now considered internal/private and not meant to be implemented by third parties anymore + * Added `Intervals` class to check if a constraint is a subsets of another one, and allow compacting complex MultiConstraints into simpler ones + * Added `CompilingMatcher` class to speed up constraint matching against simple Constraint instances + * Added `MatchAllConstraint` and `MatchNoneConstraint` which match everything and nothing + * Added more advanced optimization of contiguous constraints inside MultiConstraint + * Added tentative support for PHP 8 + * Fixed ConstraintInterface::matches to be commutative in all cases + +### [2.0.0] 2020-04-21 + + * Break: `dev-master`, `dev-trunk` and `dev-default` now normalize to `dev-master`, `dev-trunk` and `dev-default` instead of `9999999-dev` in 1.x + * Break: Removed the deprecated `AbstractConstraint` + * Added `getUpperBound` and `getLowerBound` to ConstraintInterface. They return `Composer\Semver\Constraint\Bound` instances + * Added `MultiConstraint::create` to create the most-optimal form of ConstraintInterface from an array of constraint strings + +### [1.7.2] 2020-12-03 + + * Fixed: Allow installing on php 8 + +### [1.7.1] 2020-09-27 + + * Fixed: accidental validation of broken constraints combining ^/~ and wildcards, and -dev suffix allowing weird cases + * Fixed: normalization of beta0 and such which was dropping the 0 + +### [1.7.0] 2020-09-09 + + * Added: support for `x || @dev`, not very useful but seen in the wild and failed to validate with 1.5.2/1.6.0 + * Added: support for `foobar-dev` being equal to `dev-foobar`, dev-foobar is the official way to write it but we need to support the other for BC and convenience + +### [1.6.0] 2020-09-08 + + * Added: support for constraints like `^2.x-dev` and `~2.x-dev`, not very useful but seen in the wild and failed to validate with 1.5.2 + * Fixed: invalid aliases will no longer throw, unless explicitly validated by Composer in the root package + +### [1.5.2] 2020-09-08 + + * Fixed: handling of some invalid -dev versions which were seen as valid + * Fixed: some doctypes + +### [1.5.1] 2020-01-13 + + * Fixed: Parsing of aliased version was not validating the alias to be a valid version + +### [1.5.0] 2019-03-19 + + * Added: some support for date versions (e.g. 201903) in `~` operator + * Fixed: support for stabilities in `~` operator was inconsistent + +### [1.4.2] 2016-08-30 + + * Fixed: collapsing of complex constraints lead to buggy constraints + +### [1.4.1] 2016-06-02 + + * Changed: branch-like requirements no longer strip build metadata - [composer/semver#38](https://github.com/composer/semver/pull/38). + +### [1.4.0] 2016-03-30 + + * Added: getters on MultiConstraint - [composer/semver#35](https://github.com/composer/semver/pull/35). + +### [1.3.0] 2016-02-25 + + * Fixed: stability parsing - [composer/composer#1234](https://github.com/composer/composer/issues/4889). + * Changed: collapse contiguous constraints when possible. + +### [1.2.0] 2015-11-10 + + * Changed: allow multiple numerical identifiers in 'pre-release' version part. + * Changed: add more 'v' prefix support. + +### [1.1.0] 2015-11-03 + + * Changed: dropped redundant `test` namespace. + * Changed: minor adjustment in datetime parsing normalization. + * Changed: `ConstraintInterface` relaxed, setPrettyString is not required anymore. + * Changed: `AbstractConstraint` marked deprecated, will be removed in 2.0. + * Changed: `Constraint` is now extensible. + +### [1.0.0] 2015-09-21 + + * Break: `VersionConstraint` renamed to `Constraint`. + * Break: `SpecificConstraint` renamed to `AbstractConstraint`. + * Break: `LinkConstraintInterface` renamed to `ConstraintInterface`. + * Break: `VersionParser::parseNameVersionPairs` was removed. + * Changed: `VersionParser::parseConstraints` allows (but ignores) build metadata now. + * Changed: `VersionParser::parseConstraints` allows (but ignores) prefixing numeric versions with a 'v' now. + * Changed: Fixed namespace(s) of test files. + * Changed: `Comparator::compare` no longer throws `InvalidArgumentException`. + * Changed: `Constraint` now throws `InvalidArgumentException`. + +### [0.1.0] 2015-07-23 + + * Added: `Composer\Semver\Comparator`, various methods to compare versions. + * Added: various documents such as README.md, LICENSE, etc. + * Added: configuration files for Git, Travis, php-cs-fixer, phpunit. + * Break: the following namespaces were renamed: + - Namespace: `Composer\Package\Version` -> `Composer\Semver` + - Namespace: `Composer\Package\LinkConstraint` -> `Composer\Semver\Constraint` + - Namespace: `Composer\Test\Package\Version` -> `Composer\Test\Semver` + - Namespace: `Composer\Test\Package\LinkConstraint` -> `Composer\Test\Semver\Constraint` + * Changed: code style using php-cs-fixer. + +[3.3.2]: https://github.com/composer/semver/compare/3.3.1...3.3.2 +[3.3.1]: https://github.com/composer/semver/compare/3.3.0...3.3.1 +[3.3.0]: https://github.com/composer/semver/compare/3.2.9...3.3.0 +[3.2.9]: https://github.com/composer/semver/compare/3.2.8...3.2.9 +[3.2.8]: https://github.com/composer/semver/compare/3.2.7...3.2.8 +[3.2.7]: https://github.com/composer/semver/compare/3.2.6...3.2.7 +[3.2.6]: https://github.com/composer/semver/compare/3.2.5...3.2.6 +[3.2.5]: https://github.com/composer/semver/compare/3.2.4...3.2.5 +[3.2.4]: https://github.com/composer/semver/compare/3.2.3...3.2.4 +[3.2.3]: https://github.com/composer/semver/compare/3.2.2...3.2.3 +[3.2.2]: https://github.com/composer/semver/compare/3.2.1...3.2.2 +[3.2.1]: https://github.com/composer/semver/compare/3.2.0...3.2.1 +[3.2.0]: https://github.com/composer/semver/compare/3.1.0...3.2.0 +[3.1.0]: https://github.com/composer/semver/compare/3.0.1...3.1.0 +[3.0.1]: https://github.com/composer/semver/compare/3.0.0...3.0.1 +[3.0.0]: https://github.com/composer/semver/compare/2.0.0...3.0.0 +[2.0.0]: https://github.com/composer/semver/compare/1.5.1...2.0.0 +[1.7.2]: https://github.com/composer/semver/compare/1.7.1...1.7.2 +[1.7.1]: https://github.com/composer/semver/compare/1.7.0...1.7.1 +[1.7.0]: https://github.com/composer/semver/compare/1.6.0...1.7.0 +[1.6.0]: https://github.com/composer/semver/compare/1.5.2...1.6.0 +[1.5.2]: https://github.com/composer/semver/compare/1.5.1...1.5.2 +[1.5.1]: https://github.com/composer/semver/compare/1.5.0...1.5.1 +[1.5.0]: https://github.com/composer/semver/compare/1.4.2...1.5.0 +[1.4.2]: https://github.com/composer/semver/compare/1.4.1...1.4.2 +[1.4.1]: https://github.com/composer/semver/compare/1.4.0...1.4.1 +[1.4.0]: https://github.com/composer/semver/compare/1.3.0...1.4.0 +[1.3.0]: https://github.com/composer/semver/compare/1.2.0...1.3.0 +[1.2.0]: https://github.com/composer/semver/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/composer/semver/compare/1.0.0...1.1.0 +[1.0.0]: https://github.com/composer/semver/compare/0.1.0...1.0.0 +[0.1.0]: https://github.com/composer/semver/compare/5e0b9a4da...0.1.0 diff --git a/vendor/composer/semver/LICENSE b/vendor/composer/semver/LICENSE new file mode 100644 index 00000000..46697586 --- /dev/null +++ b/vendor/composer/semver/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2015 Composer + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/composer/semver/README.md b/vendor/composer/semver/README.md new file mode 100644 index 00000000..35db99a5 --- /dev/null +++ b/vendor/composer/semver/README.md @@ -0,0 +1,98 @@ +composer/semver +=============== + +Semver (Semantic Versioning) library that offers utilities, version constraint parsing and validation. + +Originally written as part of [composer/composer](https://github.com/composer/composer), +now extracted and made available as a stand-alone library. + +[![Continuous Integration](https://github.com/composer/semver/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/composer/semver/actions) + + +Installation +------------ + +Install the latest version with: + +```bash +$ composer require composer/semver +``` + + +Requirements +------------ + +* PHP 5.3.2 is required but using the latest version of PHP is highly recommended. + + +Version Comparison +------------------ + +For details on how versions are compared, refer to the [Versions](https://getcomposer.org/doc/articles/versions.md) +article in the documentation section of the [getcomposer.org](https://getcomposer.org) website. + + +Basic usage +----------- + +### Comparator + +The [`Composer\Semver\Comparator`](https://github.com/composer/semver/blob/main/src/Comparator.php) class provides the following methods for comparing versions: + +* greaterThan($v1, $v2) +* greaterThanOrEqualTo($v1, $v2) +* lessThan($v1, $v2) +* lessThanOrEqualTo($v1, $v2) +* equalTo($v1, $v2) +* notEqualTo($v1, $v2) + +Each function takes two version strings as arguments and returns a boolean. For example: + +```php +use Composer\Semver\Comparator; + +Comparator::greaterThan('1.25.0', '1.24.0'); // 1.25.0 > 1.24.0 +``` + +### Semver + +The [`Composer\Semver\Semver`](https://github.com/composer/semver/blob/main/src/Semver.php) class provides the following methods: + +* satisfies($version, $constraints) +* satisfiedBy(array $versions, $constraint) +* sort($versions) +* rsort($versions) + +### Intervals + +The [`Composer\Semver\Intervals`](https://github.com/composer/semver/blob/main/src/Intervals.php) static class provides +a few utilities to work with complex constraints or read version intervals from a constraint: + +```php +use Composer\Semver\Intervals; + +// Checks whether $candidate is a subset of $constraint +Intervals::isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint); + +// Checks whether $a and $b have any intersection, equivalent to $a->matches($b) +Intervals::haveIntersections(ConstraintInterface $a, ConstraintInterface $b); + +// Optimizes a complex multi constraint by merging all intervals down to the smallest +// possible multi constraint. The drawbacks are this is not very fast, and the resulting +// multi constraint will have no human readable prettyConstraint configured on it +Intervals::compactConstraint(ConstraintInterface $constraint); + +// Creates an array of numeric intervals and branch constraints representing a given constraint +Intervals::get(ConstraintInterface $constraint); + +// Clears the memoization cache when you are done processing constraints +Intervals::clear() +``` + +See the class docblocks for more details. + + +License +------- + +composer/semver is licensed under the MIT License, see the LICENSE file for details. diff --git a/vendor/composer/semver/composer.json b/vendor/composer/semver/composer.json new file mode 100644 index 00000000..ba78676d --- /dev/null +++ b/vendor/composer/semver/composer.json @@ -0,0 +1,59 @@ +{ + "name": "composer/semver", + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "type": "library", + "license": "MIT", + "keywords": [ + "semver", + "semantic", + "versioning", + "validation" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.2 || ^5", + "phpstan/phpstan": "^1.4" + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Composer\\Semver\\": "tests" + } + }, + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "scripts": { + "test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor/bin/simple-phpunit", + "phpstan": "@php vendor/bin/phpstan analyse" + } +} diff --git a/vendor/composer/semver/src/Comparator.php b/vendor/composer/semver/src/Comparator.php new file mode 100644 index 00000000..38f483aa --- /dev/null +++ b/vendor/composer/semver/src/Comparator.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver; + +use Composer\Semver\Constraint\Constraint; + +class Comparator +{ + /** + * Evaluates the expression: $version1 > $version2. + * + * @param string $version1 + * @param string $version2 + * + * @return bool + */ + public static function greaterThan($version1, $version2) + { + return self::compare($version1, '>', $version2); + } + + /** + * Evaluates the expression: $version1 >= $version2. + * + * @param string $version1 + * @param string $version2 + * + * @return bool + */ + public static function greaterThanOrEqualTo($version1, $version2) + { + return self::compare($version1, '>=', $version2); + } + + /** + * Evaluates the expression: $version1 < $version2. + * + * @param string $version1 + * @param string $version2 + * + * @return bool + */ + public static function lessThan($version1, $version2) + { + return self::compare($version1, '<', $version2); + } + + /** + * Evaluates the expression: $version1 <= $version2. + * + * @param string $version1 + * @param string $version2 + * + * @return bool + */ + public static function lessThanOrEqualTo($version1, $version2) + { + return self::compare($version1, '<=', $version2); + } + + /** + * Evaluates the expression: $version1 == $version2. + * + * @param string $version1 + * @param string $version2 + * + * @return bool + */ + public static function equalTo($version1, $version2) + { + return self::compare($version1, '==', $version2); + } + + /** + * Evaluates the expression: $version1 != $version2. + * + * @param string $version1 + * @param string $version2 + * + * @return bool + */ + public static function notEqualTo($version1, $version2) + { + return self::compare($version1, '!=', $version2); + } + + /** + * Evaluates the expression: $version1 $operator $version2. + * + * @param string $version1 + * @param string $operator + * @param string $version2 + * + * @return bool + * + * @phpstan-param Constraint::STR_OP_* $operator + */ + public static function compare($version1, $operator, $version2) + { + $constraint = new Constraint($operator, $version2); + + return $constraint->matchSpecific(new Constraint('==', $version1), true); + } +} diff --git a/vendor/composer/semver/src/CompilingMatcher.php b/vendor/composer/semver/src/CompilingMatcher.php new file mode 100644 index 00000000..45bce70a --- /dev/null +++ b/vendor/composer/semver/src/CompilingMatcher.php @@ -0,0 +1,94 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver; + +use Composer\Semver\Constraint\Constraint; +use Composer\Semver\Constraint\ConstraintInterface; + +/** + * Helper class to evaluate constraint by compiling and reusing the code to evaluate + */ +class CompilingMatcher +{ + /** + * @var array + * @phpstan-var array + */ + private static $compiledCheckerCache = array(); + /** + * @var array + * @phpstan-var array + */ + private static $resultCache = array(); + + /** @var bool */ + private static $enabled; + + /** + * @phpstan-var array + */ + private static $transOpInt = array( + Constraint::OP_EQ => Constraint::STR_OP_EQ, + Constraint::OP_LT => Constraint::STR_OP_LT, + Constraint::OP_LE => Constraint::STR_OP_LE, + Constraint::OP_GT => Constraint::STR_OP_GT, + Constraint::OP_GE => Constraint::STR_OP_GE, + Constraint::OP_NE => Constraint::STR_OP_NE, + ); + + /** + * Clears the memoization cache once you are done + * + * @return void + */ + public static function clear() + { + self::$resultCache = array(); + self::$compiledCheckerCache = array(); + } + + /** + * Evaluates the expression: $constraint match $operator $version + * + * @param ConstraintInterface $constraint + * @param int $operator + * @phpstan-param Constraint::OP_* $operator + * @param string $version + * + * @return mixed + */ + public static function match(ConstraintInterface $constraint, $operator, $version) + { + $resultCacheKey = $operator.$constraint.';'.$version; + + if (isset(self::$resultCache[$resultCacheKey])) { + return self::$resultCache[$resultCacheKey]; + } + + if (self::$enabled === null) { + self::$enabled = !\in_array('eval', explode(',', (string) ini_get('disable_functions')), true); + } + if (!self::$enabled) { + return self::$resultCache[$resultCacheKey] = $constraint->matches(new Constraint(self::$transOpInt[$operator], $version)); + } + + $cacheKey = $operator.$constraint; + if (!isset(self::$compiledCheckerCache[$cacheKey])) { + $code = $constraint->compile($operator); + self::$compiledCheckerCache[$cacheKey] = $function = eval('return function($v, $b){return '.$code.';};'); + } else { + $function = self::$compiledCheckerCache[$cacheKey]; + } + + return self::$resultCache[$resultCacheKey] = $function($version, strpos($version, 'dev-') === 0); + } +} diff --git a/vendor/composer/semver/src/Constraint/Bound.php b/vendor/composer/semver/src/Constraint/Bound.php new file mode 100644 index 00000000..7effb11a --- /dev/null +++ b/vendor/composer/semver/src/Constraint/Bound.php @@ -0,0 +1,122 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver\Constraint; + +class Bound +{ + /** + * @var string + */ + private $version; + + /** + * @var bool + */ + private $isInclusive; + + /** + * @param string $version + * @param bool $isInclusive + */ + public function __construct($version, $isInclusive) + { + $this->version = $version; + $this->isInclusive = $isInclusive; + } + + /** + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * @return bool + */ + public function isInclusive() + { + return $this->isInclusive; + } + + /** + * @return bool + */ + public function isZero() + { + return $this->getVersion() === '0.0.0.0-dev' && $this->isInclusive(); + } + + /** + * @return bool + */ + public function isPositiveInfinity() + { + return $this->getVersion() === PHP_INT_MAX.'.0.0.0' && !$this->isInclusive(); + } + + /** + * Compares a bound to another with a given operator. + * + * @param Bound $other + * @param string $operator + * + * @return bool + */ + public function compareTo(Bound $other, $operator) + { + if (!\in_array($operator, array('<', '>'), true)) { + throw new \InvalidArgumentException('Does not support any other operator other than > or <.'); + } + + // If they are the same it doesn't matter + if ($this == $other) { + return false; + } + + $compareResult = version_compare($this->getVersion(), $other->getVersion()); + + // Not the same version means we don't need to check if the bounds are inclusive or not + if (0 !== $compareResult) { + return (('>' === $operator) ? 1 : -1) === $compareResult; + } + + // Question we're answering here is "am I higher than $other?" + return '>' === $operator ? $other->isInclusive() : !$other->isInclusive(); + } + + public function __toString() + { + return sprintf( + '%s [%s]', + $this->getVersion(), + $this->isInclusive() ? 'inclusive' : 'exclusive' + ); + } + + /** + * @return self + */ + public static function zero() + { + return new Bound('0.0.0.0-dev', true); + } + + /** + * @return self + */ + public static function positiveInfinity() + { + return new Bound(PHP_INT_MAX.'.0.0.0', false); + } +} diff --git a/vendor/composer/semver/src/Constraint/Constraint.php b/vendor/composer/semver/src/Constraint/Constraint.php new file mode 100644 index 00000000..dc394829 --- /dev/null +++ b/vendor/composer/semver/src/Constraint/Constraint.php @@ -0,0 +1,435 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver\Constraint; + +/** + * Defines a constraint. + */ +class Constraint implements ConstraintInterface +{ + /* operator integer values */ + const OP_EQ = 0; + const OP_LT = 1; + const OP_LE = 2; + const OP_GT = 3; + const OP_GE = 4; + const OP_NE = 5; + + /* operator string values */ + const STR_OP_EQ = '=='; + const STR_OP_EQ_ALT = '='; + const STR_OP_LT = '<'; + const STR_OP_LE = '<='; + const STR_OP_GT = '>'; + const STR_OP_GE = '>='; + const STR_OP_NE = '!='; + const STR_OP_NE_ALT = '<>'; + + /** + * Operator to integer translation table. + * + * @var array + * @phpstan-var array + */ + private static $transOpStr = array( + '=' => self::OP_EQ, + '==' => self::OP_EQ, + '<' => self::OP_LT, + '<=' => self::OP_LE, + '>' => self::OP_GT, + '>=' => self::OP_GE, + '<>' => self::OP_NE, + '!=' => self::OP_NE, + ); + + /** + * Integer to operator translation table. + * + * @var array + * @phpstan-var array + */ + private static $transOpInt = array( + self::OP_EQ => '==', + self::OP_LT => '<', + self::OP_LE => '<=', + self::OP_GT => '>', + self::OP_GE => '>=', + self::OP_NE => '!=', + ); + + /** + * @var int + * @phpstan-var self::OP_* + */ + protected $operator; + + /** @var string */ + protected $version; + + /** @var string|null */ + protected $prettyString; + + /** @var Bound */ + protected $lowerBound; + + /** @var Bound */ + protected $upperBound; + + /** + * Sets operator and version to compare with. + * + * @param string $operator + * @param string $version + * + * @throws \InvalidArgumentException if invalid operator is given. + * + * @phpstan-param self::STR_OP_* $operator + */ + public function __construct($operator, $version) + { + if (!isset(self::$transOpStr[$operator])) { + throw new \InvalidArgumentException(sprintf( + 'Invalid operator "%s" given, expected one of: %s', + $operator, + implode(', ', self::getSupportedOperators()) + )); + } + + $this->operator = self::$transOpStr[$operator]; + $this->version = $version; + } + + /** + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * @return string + * + * @phpstan-return self::STR_OP_* + */ + public function getOperator() + { + return self::$transOpInt[$this->operator]; + } + + /** + * @param ConstraintInterface $provider + * + * @return bool + */ + public function matches(ConstraintInterface $provider) + { + if ($provider instanceof self) { + return $this->matchSpecific($provider); + } + + // turn matching around to find a match + return $provider->matches($this); + } + + /** + * {@inheritDoc} + */ + public function setPrettyString($prettyString) + { + $this->prettyString = $prettyString; + } + + /** + * {@inheritDoc} + */ + public function getPrettyString() + { + if ($this->prettyString) { + return $this->prettyString; + } + + return $this->__toString(); + } + + /** + * Get all supported comparison operators. + * + * @return array + * + * @phpstan-return list + */ + public static function getSupportedOperators() + { + return array_keys(self::$transOpStr); + } + + /** + * @param string $operator + * @return int + * + * @phpstan-param self::STR_OP_* $operator + * @phpstan-return self::OP_* + */ + public static function getOperatorConstant($operator) + { + return self::$transOpStr[$operator]; + } + + /** + * @param string $a + * @param string $b + * @param string $operator + * @param bool $compareBranches + * + * @throws \InvalidArgumentException if invalid operator is given. + * + * @return bool + * + * @phpstan-param self::STR_OP_* $operator + */ + public function versionCompare($a, $b, $operator, $compareBranches = false) + { + if (!isset(self::$transOpStr[$operator])) { + throw new \InvalidArgumentException(sprintf( + 'Invalid operator "%s" given, expected one of: %s', + $operator, + implode(', ', self::getSupportedOperators()) + )); + } + + $aIsBranch = strpos($a, 'dev-') === 0; + $bIsBranch = strpos($b, 'dev-') === 0; + + if ($operator === '!=' && ($aIsBranch || $bIsBranch)) { + return $a !== $b; + } + + if ($aIsBranch && $bIsBranch) { + return $operator === '==' && $a === $b; + } + + // when branches are not comparable, we make sure dev branches never match anything + if (!$compareBranches && ($aIsBranch || $bIsBranch)) { + return false; + } + + return \version_compare($a, $b, $operator); + } + + /** + * {@inheritDoc} + */ + public function compile($otherOperator) + { + if (strpos($this->version, 'dev-') === 0) { + if (self::OP_EQ === $this->operator) { + if (self::OP_EQ === $otherOperator) { + return sprintf('$b && $v === %s', \var_export($this->version, true)); + } + if (self::OP_NE === $otherOperator) { + return sprintf('!$b || $v !== %s', \var_export($this->version, true)); + } + return 'false'; + } + + if (self::OP_NE === $this->operator) { + if (self::OP_EQ === $otherOperator) { + return sprintf('!$b || $v !== %s', \var_export($this->version, true)); + } + if (self::OP_NE === $otherOperator) { + return 'true'; + } + return '!$b'; + } + + return 'false'; + } + + if (self::OP_EQ === $this->operator) { + if (self::OP_EQ === $otherOperator) { + return sprintf('\version_compare($v, %s, \'==\')', \var_export($this->version, true)); + } + if (self::OP_NE === $otherOperator) { + return sprintf('$b || \version_compare($v, %s, \'!=\')', \var_export($this->version, true)); + } + + return sprintf('!$b && \version_compare(%s, $v, \'%s\')', \var_export($this->version, true), self::$transOpInt[$otherOperator]); + } + + if (self::OP_NE === $this->operator) { + if (self::OP_EQ === $otherOperator) { + return sprintf('$b || (!$b && \version_compare($v, %s, \'!=\'))', \var_export($this->version, true)); + } + + if (self::OP_NE === $otherOperator) { + return 'true'; + } + return '!$b'; + } + + if (self::OP_LT === $this->operator || self::OP_LE === $this->operator) { + if (self::OP_LT === $otherOperator || self::OP_LE === $otherOperator) { + return '!$b'; + } + } else { // $this->operator must be self::OP_GT || self::OP_GE here + if (self::OP_GT === $otherOperator || self::OP_GE === $otherOperator) { + return '!$b'; + } + } + + if (self::OP_NE === $otherOperator) { + return 'true'; + } + + $codeComparison = sprintf('\version_compare($v, %s, \'%s\')', \var_export($this->version, true), self::$transOpInt[$this->operator]); + if ($this->operator === self::OP_LE) { + if ($otherOperator === self::OP_GT) { + return sprintf('!$b && \version_compare($v, %s, \'!=\') && ', \var_export($this->version, true)) . $codeComparison; + } + } elseif ($this->operator === self::OP_GE) { + if ($otherOperator === self::OP_LT) { + return sprintf('!$b && \version_compare($v, %s, \'!=\') && ', \var_export($this->version, true)) . $codeComparison; + } + } + + return sprintf('!$b && %s', $codeComparison); + } + + /** + * @param Constraint $provider + * @param bool $compareBranches + * + * @return bool + */ + public function matchSpecific(Constraint $provider, $compareBranches = false) + { + $noEqualOp = str_replace('=', '', self::$transOpInt[$this->operator]); + $providerNoEqualOp = str_replace('=', '', self::$transOpInt[$provider->operator]); + + $isEqualOp = self::OP_EQ === $this->operator; + $isNonEqualOp = self::OP_NE === $this->operator; + $isProviderEqualOp = self::OP_EQ === $provider->operator; + $isProviderNonEqualOp = self::OP_NE === $provider->operator; + + // '!=' operator is match when other operator is not '==' operator or version is not match + // these kinds of comparisons always have a solution + if ($isNonEqualOp || $isProviderNonEqualOp) { + if ($isNonEqualOp && !$isProviderNonEqualOp && !$isProviderEqualOp && strpos($provider->version, 'dev-') === 0) { + return false; + } + + if ($isProviderNonEqualOp && !$isNonEqualOp && !$isEqualOp && strpos($this->version, 'dev-') === 0) { + return false; + } + + if (!$isEqualOp && !$isProviderEqualOp) { + return true; + } + return $this->versionCompare($provider->version, $this->version, '!=', $compareBranches); + } + + // an example for the condition is <= 2.0 & < 1.0 + // these kinds of comparisons always have a solution + if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) { + return !(strpos($this->version, 'dev-') === 0 || strpos($provider->version, 'dev-') === 0); + } + + $version1 = $isEqualOp ? $this->version : $provider->version; + $version2 = $isEqualOp ? $provider->version : $this->version; + $operator = $isEqualOp ? $provider->operator : $this->operator; + + if ($this->versionCompare($version1, $version2, self::$transOpInt[$operator], $compareBranches)) { + // special case, e.g. require >= 1.0 and provide < 1.0 + // 1.0 >= 1.0 but 1.0 is outside of the provided interval + + return !(self::$transOpInt[$provider->operator] === $providerNoEqualOp + && self::$transOpInt[$this->operator] !== $noEqualOp + && \version_compare($provider->version, $this->version, '==')); + } + + return false; + } + + /** + * @return string + */ + public function __toString() + { + return self::$transOpInt[$this->operator] . ' ' . $this->version; + } + + /** + * {@inheritDoc} + */ + public function getLowerBound() + { + $this->extractBounds(); + + return $this->lowerBound; + } + + /** + * {@inheritDoc} + */ + public function getUpperBound() + { + $this->extractBounds(); + + return $this->upperBound; + } + + /** + * @return void + */ + private function extractBounds() + { + if (null !== $this->lowerBound) { + return; + } + + // Branches + if (strpos($this->version, 'dev-') === 0) { + $this->lowerBound = Bound::zero(); + $this->upperBound = Bound::positiveInfinity(); + + return; + } + + switch ($this->operator) { + case self::OP_EQ: + $this->lowerBound = new Bound($this->version, true); + $this->upperBound = new Bound($this->version, true); + break; + case self::OP_LT: + $this->lowerBound = Bound::zero(); + $this->upperBound = new Bound($this->version, false); + break; + case self::OP_LE: + $this->lowerBound = Bound::zero(); + $this->upperBound = new Bound($this->version, true); + break; + case self::OP_GT: + $this->lowerBound = new Bound($this->version, false); + $this->upperBound = Bound::positiveInfinity(); + break; + case self::OP_GE: + $this->lowerBound = new Bound($this->version, true); + $this->upperBound = Bound::positiveInfinity(); + break; + case self::OP_NE: + $this->lowerBound = Bound::zero(); + $this->upperBound = Bound::positiveInfinity(); + break; + } + } +} diff --git a/vendor/composer/semver/src/Constraint/ConstraintInterface.php b/vendor/composer/semver/src/Constraint/ConstraintInterface.php new file mode 100644 index 00000000..389b935b --- /dev/null +++ b/vendor/composer/semver/src/Constraint/ConstraintInterface.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver\Constraint; + +/** + * DO NOT IMPLEMENT this interface. It is only meant for usage as a type hint + * in libraries relying on composer/semver but creating your own constraint class + * that implements this interface is not a supported use case and will cause the + * composer/semver components to return unexpected results. + */ +interface ConstraintInterface +{ + /** + * Checks whether the given constraint intersects in any way with this constraint + * + * @param ConstraintInterface $provider + * + * @return bool + */ + public function matches(ConstraintInterface $provider); + + /** + * Provides a compiled version of the constraint for the given operator + * The compiled version must be a PHP expression. + * Executor of compile version must provide 2 variables: + * - $v = the string version to compare with + * - $b = whether or not the version is a non-comparable branch (starts with "dev-") + * + * @see Constraint::OP_* for the list of available operators. + * @example return '!$b && version_compare($v, '1.0', '>')'; + * + * @param int $otherOperator one Constraint::OP_* + * + * @return string + * + * @phpstan-param Constraint::OP_* $otherOperator + */ + public function compile($otherOperator); + + /** + * @return Bound + */ + public function getUpperBound(); + + /** + * @return Bound + */ + public function getLowerBound(); + + /** + * @return string + */ + public function getPrettyString(); + + /** + * @param string|null $prettyString + * + * @return void + */ + public function setPrettyString($prettyString); + + /** + * @return string + */ + public function __toString(); +} diff --git a/vendor/composer/semver/src/Constraint/MatchAllConstraint.php b/vendor/composer/semver/src/Constraint/MatchAllConstraint.php new file mode 100644 index 00000000..5e51af95 --- /dev/null +++ b/vendor/composer/semver/src/Constraint/MatchAllConstraint.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver\Constraint; + +/** + * Defines the absence of a constraint. + * + * This constraint matches everything. + */ +class MatchAllConstraint implements ConstraintInterface +{ + /** @var string|null */ + protected $prettyString; + + /** + * @param ConstraintInterface $provider + * + * @return bool + */ + public function matches(ConstraintInterface $provider) + { + return true; + } + + /** + * {@inheritDoc} + */ + public function compile($otherOperator) + { + return 'true'; + } + + /** + * {@inheritDoc} + */ + public function setPrettyString($prettyString) + { + $this->prettyString = $prettyString; + } + + /** + * {@inheritDoc} + */ + public function getPrettyString() + { + if ($this->prettyString) { + return $this->prettyString; + } + + return (string) $this; + } + + /** + * {@inheritDoc} + */ + public function __toString() + { + return '*'; + } + + /** + * {@inheritDoc} + */ + public function getUpperBound() + { + return Bound::positiveInfinity(); + } + + /** + * {@inheritDoc} + */ + public function getLowerBound() + { + return Bound::zero(); + } +} diff --git a/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php b/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php new file mode 100644 index 00000000..dadcf622 --- /dev/null +++ b/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver\Constraint; + +/** + * Blackhole of constraints, nothing escapes it + */ +class MatchNoneConstraint implements ConstraintInterface +{ + /** @var string|null */ + protected $prettyString; + + /** + * @param ConstraintInterface $provider + * + * @return bool + */ + public function matches(ConstraintInterface $provider) + { + return false; + } + + /** + * {@inheritDoc} + */ + public function compile($otherOperator) + { + return 'false'; + } + + /** + * {@inheritDoc} + */ + public function setPrettyString($prettyString) + { + $this->prettyString = $prettyString; + } + + /** + * {@inheritDoc} + */ + public function getPrettyString() + { + if ($this->prettyString) { + return $this->prettyString; + } + + return (string) $this; + } + + /** + * {@inheritDoc} + */ + public function __toString() + { + return '[]'; + } + + /** + * {@inheritDoc} + */ + public function getUpperBound() + { + return new Bound('0.0.0.0-dev', false); + } + + /** + * {@inheritDoc} + */ + public function getLowerBound() + { + return new Bound('0.0.0.0-dev', false); + } +} diff --git a/vendor/composer/semver/src/Constraint/MultiConstraint.php b/vendor/composer/semver/src/Constraint/MultiConstraint.php new file mode 100644 index 00000000..1f4c0061 --- /dev/null +++ b/vendor/composer/semver/src/Constraint/MultiConstraint.php @@ -0,0 +1,325 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver\Constraint; + +/** + * Defines a conjunctive or disjunctive set of constraints. + */ +class MultiConstraint implements ConstraintInterface +{ + /** + * @var ConstraintInterface[] + * @phpstan-var non-empty-array + */ + protected $constraints; + + /** @var string|null */ + protected $prettyString; + + /** @var string|null */ + protected $string; + + /** @var bool */ + protected $conjunctive; + + /** @var Bound|null */ + protected $lowerBound; + + /** @var Bound|null */ + protected $upperBound; + + /** + * @param ConstraintInterface[] $constraints A set of constraints + * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive + * + * @throws \InvalidArgumentException If less than 2 constraints are passed + */ + public function __construct(array $constraints, $conjunctive = true) + { + if (\count($constraints) < 2) { + throw new \InvalidArgumentException( + 'Must provide at least two constraints for a MultiConstraint. Use '. + 'the regular Constraint class for one constraint only or MatchAllConstraint for none. You may use '. + 'MultiConstraint::create() which optimizes and handles those cases automatically.' + ); + } + + $this->constraints = $constraints; + $this->conjunctive = $conjunctive; + } + + /** + * @return ConstraintInterface[] + */ + public function getConstraints() + { + return $this->constraints; + } + + /** + * @return bool + */ + public function isConjunctive() + { + return $this->conjunctive; + } + + /** + * @return bool + */ + public function isDisjunctive() + { + return !$this->conjunctive; + } + + /** + * {@inheritDoc} + */ + public function compile($otherOperator) + { + $parts = array(); + foreach ($this->constraints as $constraint) { + $code = $constraint->compile($otherOperator); + if ($code === 'true') { + if (!$this->conjunctive) { + return 'true'; + } + } elseif ($code === 'false') { + if ($this->conjunctive) { + return 'false'; + } + } else { + $parts[] = '('.$code.')'; + } + } + + if (!$parts) { + return $this->conjunctive ? 'true' : 'false'; + } + + return $this->conjunctive ? implode('&&', $parts) : implode('||', $parts); + } + + /** + * @param ConstraintInterface $provider + * + * @return bool + */ + public function matches(ConstraintInterface $provider) + { + if (false === $this->conjunctive) { + foreach ($this->constraints as $constraint) { + if ($provider->matches($constraint)) { + return true; + } + } + + return false; + } + + // when matching a conjunctive and a disjunctive multi constraint we have to iterate over the disjunctive one + // otherwise we'd return true if different parts of the disjunctive constraint match the conjunctive one + // which would lead to incorrect results, e.g. [>1 and <2] would match [<1 or >2] although they do not intersect + if ($provider instanceof MultiConstraint && $provider->isDisjunctive()) { + return $provider->matches($this); + } + + foreach ($this->constraints as $constraint) { + if (!$provider->matches($constraint)) { + return false; + } + } + + return true; + } + + /** + * {@inheritDoc} + */ + public function setPrettyString($prettyString) + { + $this->prettyString = $prettyString; + } + + /** + * {@inheritDoc} + */ + public function getPrettyString() + { + if ($this->prettyString) { + return $this->prettyString; + } + + return (string) $this; + } + + /** + * {@inheritDoc} + */ + public function __toString() + { + if ($this->string !== null) { + return $this->string; + } + + $constraints = array(); + foreach ($this->constraints as $constraint) { + $constraints[] = (string) $constraint; + } + + return $this->string = '[' . implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']'; + } + + /** + * {@inheritDoc} + */ + public function getLowerBound() + { + $this->extractBounds(); + + if (null === $this->lowerBound) { + throw new \LogicException('extractBounds should have populated the lowerBound property'); + } + + return $this->lowerBound; + } + + /** + * {@inheritDoc} + */ + public function getUpperBound() + { + $this->extractBounds(); + + if (null === $this->upperBound) { + throw new \LogicException('extractBounds should have populated the upperBound property'); + } + + return $this->upperBound; + } + + /** + * Tries to optimize the constraints as much as possible, meaning + * reducing/collapsing congruent constraints etc. + * Does not necessarily return a MultiConstraint instance if + * things can be reduced to a simple constraint + * + * @param ConstraintInterface[] $constraints A set of constraints + * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive + * + * @return ConstraintInterface + */ + public static function create(array $constraints, $conjunctive = true) + { + if (0 === \count($constraints)) { + return new MatchAllConstraint(); + } + + if (1 === \count($constraints)) { + return $constraints[0]; + } + + $optimized = self::optimizeConstraints($constraints, $conjunctive); + if ($optimized !== null) { + list($constraints, $conjunctive) = $optimized; + if (\count($constraints) === 1) { + return $constraints[0]; + } + } + + return new self($constraints, $conjunctive); + } + + /** + * @param ConstraintInterface[] $constraints + * @param bool $conjunctive + * @return ?array + * + * @phpstan-return array{0: list, 1: bool}|null + */ + private static function optimizeConstraints(array $constraints, $conjunctive) + { + // parse the two OR groups and if they are contiguous we collapse + // them into one constraint + // [>= 1 < 2] || [>= 2 < 3] || [>= 3 < 4] => [>= 1 < 4] + if (!$conjunctive) { + $left = $constraints[0]; + $mergedConstraints = array(); + $optimized = false; + for ($i = 1, $l = \count($constraints); $i < $l; $i++) { + $right = $constraints[$i]; + if ( + $left instanceof self + && $left->conjunctive + && $right instanceof self + && $right->conjunctive + && \count($left->constraints) === 2 + && \count($right->constraints) === 2 + && ($left0 = (string) $left->constraints[0]) + && $left0[0] === '>' && $left0[1] === '=' + && ($left1 = (string) $left->constraints[1]) + && $left1[0] === '<' + && ($right0 = (string) $right->constraints[0]) + && $right0[0] === '>' && $right0[1] === '=' + && ($right1 = (string) $right->constraints[1]) + && $right1[0] === '<' + && substr($left1, 2) === substr($right0, 3) + ) { + $optimized = true; + $left = new MultiConstraint( + array( + $left->constraints[0], + $right->constraints[1], + ), + true); + } else { + $mergedConstraints[] = $left; + $left = $right; + } + } + if ($optimized) { + $mergedConstraints[] = $left; + return array($mergedConstraints, false); + } + } + + // TODO: Here's the place to put more optimizations + + return null; + } + + /** + * @return void + */ + private function extractBounds() + { + if (null !== $this->lowerBound) { + return; + } + + foreach ($this->constraints as $constraint) { + if (null === $this->lowerBound || null === $this->upperBound) { + $this->lowerBound = $constraint->getLowerBound(); + $this->upperBound = $constraint->getUpperBound(); + continue; + } + + if ($constraint->getLowerBound()->compareTo($this->lowerBound, $this->isConjunctive() ? '>' : '<')) { + $this->lowerBound = $constraint->getLowerBound(); + } + + if ($constraint->getUpperBound()->compareTo($this->upperBound, $this->isConjunctive() ? '<' : '>')) { + $this->upperBound = $constraint->getUpperBound(); + } + } + } +} diff --git a/vendor/composer/semver/src/Interval.php b/vendor/composer/semver/src/Interval.php new file mode 100644 index 00000000..43d5a4f5 --- /dev/null +++ b/vendor/composer/semver/src/Interval.php @@ -0,0 +1,98 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver; + +use Composer\Semver\Constraint\Constraint; + +class Interval +{ + /** @var Constraint */ + private $start; + /** @var Constraint */ + private $end; + + public function __construct(Constraint $start, Constraint $end) + { + $this->start = $start; + $this->end = $end; + } + + /** + * @return Constraint + */ + public function getStart() + { + return $this->start; + } + + /** + * @return Constraint + */ + public function getEnd() + { + return $this->end; + } + + /** + * @return Constraint + */ + public static function fromZero() + { + static $zero; + + if (null === $zero) { + $zero = new Constraint('>=', '0.0.0.0-dev'); + } + + return $zero; + } + + /** + * @return Constraint + */ + public static function untilPositiveInfinity() + { + static $positiveInfinity; + + if (null === $positiveInfinity) { + $positiveInfinity = new Constraint('<', PHP_INT_MAX.'.0.0.0'); + } + + return $positiveInfinity; + } + + /** + * @return self + */ + public static function any() + { + return new self(self::fromZero(), self::untilPositiveInfinity()); + } + + /** + * @return array{'names': string[], 'exclude': bool} + */ + public static function anyDev() + { + // any == exclude nothing + return array('names' => array(), 'exclude' => true); + } + + /** + * @return array{'names': string[], 'exclude': bool} + */ + public static function noDev() + { + // nothing == no names included + return array('names' => array(), 'exclude' => false); + } +} diff --git a/vendor/composer/semver/src/Intervals.php b/vendor/composer/semver/src/Intervals.php new file mode 100644 index 00000000..d889d0ad --- /dev/null +++ b/vendor/composer/semver/src/Intervals.php @@ -0,0 +1,478 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver; + +use Composer\Semver\Constraint\Constraint; +use Composer\Semver\Constraint\ConstraintInterface; +use Composer\Semver\Constraint\MatchAllConstraint; +use Composer\Semver\Constraint\MatchNoneConstraint; +use Composer\Semver\Constraint\MultiConstraint; + +/** + * Helper class generating intervals from constraints + * + * This contains utilities for: + * + * - compacting an existing constraint which can be used to combine several into one + * by creating a MultiConstraint out of the many constraints you have. + * + * - checking whether one subset is a subset of another. + * + * Note: You should call clear to free memoization memory usage when you are done using this class + */ +class Intervals +{ + /** + * @phpstan-var array + */ + private static $intervalsCache = array(); + + /** + * @phpstan-var array + */ + private static $opSortOrder = array( + '>=' => -3, + '<' => -2, + '>' => 2, + '<=' => 3, + ); + + /** + * Clears the memoization cache once you are done + * + * @return void + */ + public static function clear() + { + self::$intervalsCache = array(); + } + + /** + * Checks whether $candidate is a subset of $constraint + * + * @return bool + */ + public static function isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint) + { + if ($constraint instanceof MatchAllConstraint) { + return true; + } + + if ($candidate instanceof MatchNoneConstraint || $constraint instanceof MatchNoneConstraint) { + return false; + } + + $intersectionIntervals = self::get(new MultiConstraint(array($candidate, $constraint), true)); + $candidateIntervals = self::get($candidate); + if (\count($intersectionIntervals['numeric']) !== \count($candidateIntervals['numeric'])) { + return false; + } + + foreach ($intersectionIntervals['numeric'] as $index => $interval) { + if (!isset($candidateIntervals['numeric'][$index])) { + return false; + } + + if ((string) $candidateIntervals['numeric'][$index]->getStart() !== (string) $interval->getStart()) { + return false; + } + + if ((string) $candidateIntervals['numeric'][$index]->getEnd() !== (string) $interval->getEnd()) { + return false; + } + } + + if ($intersectionIntervals['branches']['exclude'] !== $candidateIntervals['branches']['exclude']) { + return false; + } + if (\count($intersectionIntervals['branches']['names']) !== \count($candidateIntervals['branches']['names'])) { + return false; + } + foreach ($intersectionIntervals['branches']['names'] as $index => $name) { + if ($name !== $candidateIntervals['branches']['names'][$index]) { + return false; + } + } + + return true; + } + + /** + * Checks whether $a and $b have any intersection, equivalent to $a->matches($b) + * + * @return bool + */ + public static function haveIntersections(ConstraintInterface $a, ConstraintInterface $b) + { + if ($a instanceof MatchAllConstraint || $b instanceof MatchAllConstraint) { + return true; + } + + if ($a instanceof MatchNoneConstraint || $b instanceof MatchNoneConstraint) { + return false; + } + + $intersectionIntervals = self::generateIntervals(new MultiConstraint(array($a, $b), true), true); + + return \count($intersectionIntervals['numeric']) > 0 || $intersectionIntervals['branches']['exclude'] || \count($intersectionIntervals['branches']['names']) > 0; + } + + /** + * Attempts to optimize a MultiConstraint + * + * When merging MultiConstraints together they can get very large, this will + * compact it by looking at the real intervals covered by all the constraints + * and then creates a new constraint containing only the smallest amount of rules + * to match the same intervals. + * + * @return ConstraintInterface + */ + public static function compactConstraint(ConstraintInterface $constraint) + { + if (!$constraint instanceof MultiConstraint) { + return $constraint; + } + + $intervals = self::generateIntervals($constraint); + $constraints = array(); + $hasNumericMatchAll = false; + + if (\count($intervals['numeric']) === 1 && (string) $intervals['numeric'][0]->getStart() === (string) Interval::fromZero() && (string) $intervals['numeric'][0]->getEnd() === (string) Interval::untilPositiveInfinity()) { + $constraints[] = $intervals['numeric'][0]->getStart(); + $hasNumericMatchAll = true; + } else { + $unEqualConstraints = array(); + for ($i = 0, $count = \count($intervals['numeric']); $i < $count; $i++) { + $interval = $intervals['numeric'][$i]; + + // if current interval ends with < N and next interval begins with > N we can swap this out for != N + // but this needs to happen as a conjunctive expression together with the start of the current interval + // and end of next interval, so [>=M, N, [>=M, !=N, getEnd()->getOperator() === '<' && $i+1 < $count) { + $nextInterval = $intervals['numeric'][$i+1]; + if ($interval->getEnd()->getVersion() === $nextInterval->getStart()->getVersion() && $nextInterval->getStart()->getOperator() === '>') { + // only add a start if we didn't already do so, can be skipped if we're looking at second + // interval in [>=M, N, P, =M, !=N] already and we only want to add !=P right now + if (\count($unEqualConstraints) === 0 && (string) $interval->getStart() !== (string) Interval::fromZero()) { + $unEqualConstraints[] = $interval->getStart(); + } + $unEqualConstraints[] = new Constraint('!=', $interval->getEnd()->getVersion()); + continue; + } + } + + if (\count($unEqualConstraints) > 0) { + // this is where the end of the following interval of a != constraint is added as explained above + if ((string) $interval->getEnd() !== (string) Interval::untilPositiveInfinity()) { + $unEqualConstraints[] = $interval->getEnd(); + } + + // count is 1 if entire constraint is just one != expression + if (\count($unEqualConstraints) > 1) { + $constraints[] = new MultiConstraint($unEqualConstraints, true); + } else { + $constraints[] = $unEqualConstraints[0]; + } + + $unEqualConstraints = array(); + continue; + } + + // convert back >= x - <= x intervals to == x + if ($interval->getStart()->getVersion() === $interval->getEnd()->getVersion() && $interval->getStart()->getOperator() === '>=' && $interval->getEnd()->getOperator() === '<=') { + $constraints[] = new Constraint('==', $interval->getStart()->getVersion()); + continue; + } + + if ((string) $interval->getStart() === (string) Interval::fromZero()) { + $constraints[] = $interval->getEnd(); + } elseif ((string) $interval->getEnd() === (string) Interval::untilPositiveInfinity()) { + $constraints[] = $interval->getStart(); + } else { + $constraints[] = new MultiConstraint(array($interval->getStart(), $interval->getEnd()), true); + } + } + } + + $devConstraints = array(); + + if (0 === \count($intervals['branches']['names'])) { + if ($intervals['branches']['exclude']) { + if ($hasNumericMatchAll) { + return new MatchAllConstraint; + } + // otherwise constraint should contain a != operator and already cover this + } + } else { + foreach ($intervals['branches']['names'] as $branchName) { + if ($intervals['branches']['exclude']) { + $devConstraints[] = new Constraint('!=', $branchName); + } else { + $devConstraints[] = new Constraint('==', $branchName); + } + } + + // excluded branches, e.g. != dev-foo are conjunctive with the interval, so + // > 2.0 != dev-foo must return a conjunctive constraint + if ($intervals['branches']['exclude']) { + if (\count($constraints) > 1) { + return new MultiConstraint(array_merge( + array(new MultiConstraint($constraints, false)), + $devConstraints + ), true); + } + + if (\count($constraints) === 1 && (string)$constraints[0] === (string)Interval::fromZero()) { + if (\count($devConstraints) > 1) { + return new MultiConstraint($devConstraints, true); + } + return $devConstraints[0]; + } + + return new MultiConstraint(array_merge($constraints, $devConstraints), true); + } + + // otherwise devConstraints contains a list of == operators for branches which are disjunctive with the + // rest of the constraint + $constraints = array_merge($constraints, $devConstraints); + } + + if (\count($constraints) > 1) { + return new MultiConstraint($constraints, false); + } + + if (\count($constraints) === 1) { + return $constraints[0]; + } + + return new MatchNoneConstraint; + } + + /** + * Creates an array of numeric intervals and branch constraints representing a given constraint + * + * if the returned numeric array is empty it means the constraint matches nothing in the numeric range (0 - +inf) + * if the returned branches array is empty it means no dev-* versions are matched + * if a constraint matches all possible dev-* versions, branches will contain Interval::anyDev() + * + * @return array + * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} + */ + public static function get(ConstraintInterface $constraint) + { + $key = (string) $constraint; + + if (!isset(self::$intervalsCache[$key])) { + self::$intervalsCache[$key] = self::generateIntervals($constraint); + } + + return self::$intervalsCache[$key]; + } + + /** + * @param bool $stopOnFirstValidInterval + * + * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} + */ + private static function generateIntervals(ConstraintInterface $constraint, $stopOnFirstValidInterval = false) + { + if ($constraint instanceof MatchAllConstraint) { + return array('numeric' => array(new Interval(Interval::fromZero(), Interval::untilPositiveInfinity())), 'branches' => Interval::anyDev()); + } + + if ($constraint instanceof MatchNoneConstraint) { + return array('numeric' => array(), 'branches' => array('names' => array(), 'exclude' => false)); + } + + if ($constraint instanceof Constraint) { + return self::generateSingleConstraintIntervals($constraint); + } + + if (!$constraint instanceof MultiConstraint) { + throw new \UnexpectedValueException('The constraint passed in should be an MatchAllConstraint, Constraint or MultiConstraint instance, got '.\get_class($constraint).'.'); + } + + $constraints = $constraint->getConstraints(); + + $numericGroups = array(); + $constraintBranches = array(); + foreach ($constraints as $c) { + $res = self::get($c); + $numericGroups[] = $res['numeric']; + $constraintBranches[] = $res['branches']; + } + + if ($constraint->isDisjunctive()) { + $branches = Interval::noDev(); + foreach ($constraintBranches as $b) { + if ($b['exclude']) { + if ($branches['exclude']) { + // disjunctive constraint, so only exclude what's excluded in all constraints + // !=a,!=b || !=b,!=c => !=b + $branches['names'] = array_intersect($branches['names'], $b['names']); + } else { + // disjunctive constraint so exclude all names which are not explicitly included in the alternative + // (==b || ==c) || !=a,!=b => !=a + $branches['exclude'] = true; + $branches['names'] = array_diff($b['names'], $branches['names']); + } + } else { + if ($branches['exclude']) { + // disjunctive constraint so exclude all names which are not explicitly included in the alternative + // !=a,!=b || (==b || ==c) => !=a + $branches['names'] = array_diff($branches['names'], $b['names']); + } else { + // disjunctive constraint, so just add all the other branches + // (==a || ==b) || ==c => ==a || ==b || ==c + $branches['names'] = array_merge($branches['names'], $b['names']); + } + } + } + } else { + $branches = Interval::anyDev(); + foreach ($constraintBranches as $b) { + if ($b['exclude']) { + if ($branches['exclude']) { + // conjunctive, so just add all branch names to be excluded + // !=a && !=b => !=a,!=b + $branches['names'] = array_merge($branches['names'], $b['names']); + } else { + // conjunctive, so only keep included names which are not excluded + // (==a||==c) && !=a,!=b => ==c + $branches['names'] = array_diff($branches['names'], $b['names']); + } + } else { + if ($branches['exclude']) { + // conjunctive, so only keep included names which are not excluded + // !=a,!=b && (==a||==c) => ==c + $branches['names'] = array_diff($b['names'], $branches['names']); + $branches['exclude'] = false; + } else { + // conjunctive, so only keep names that are included in both + // (==a||==b) && (==a||==c) => ==a + $branches['names'] = array_intersect($branches['names'], $b['names']); + } + } + } + } + + $branches['names'] = array_unique($branches['names']); + + if (\count($numericGroups) === 1) { + return array('numeric' => $numericGroups[0], 'branches' => $branches); + } + + $borders = array(); + foreach ($numericGroups as $group) { + foreach ($group as $interval) { + $borders[] = array('version' => $interval->getStart()->getVersion(), 'operator' => $interval->getStart()->getOperator(), 'side' => 'start'); + $borders[] = array('version' => $interval->getEnd()->getVersion(), 'operator' => $interval->getEnd()->getOperator(), 'side' => 'end'); + } + } + + $opSortOrder = self::$opSortOrder; + usort($borders, function ($a, $b) use ($opSortOrder) { + $order = version_compare($a['version'], $b['version']); + if ($order === 0) { + return $opSortOrder[$a['operator']] - $opSortOrder[$b['operator']]; + } + + return $order; + }); + + $activeIntervals = 0; + $intervals = array(); + $index = 0; + $activationThreshold = $constraint->isConjunctive() ? \count($numericGroups) : 1; + $start = null; + foreach ($borders as $border) { + if ($border['side'] === 'start') { + $activeIntervals++; + } else { + $activeIntervals--; + } + if (!$start && $activeIntervals >= $activationThreshold) { + $start = new Constraint($border['operator'], $border['version']); + } elseif ($start && $activeIntervals < $activationThreshold) { + // filter out invalid intervals like > x - <= x, or >= x - < x + if ( + version_compare($start->getVersion(), $border['version'], '=') + && ( + ($start->getOperator() === '>' && $border['operator'] === '<=') + || ($start->getOperator() === '>=' && $border['operator'] === '<') + ) + ) { + unset($intervals[$index]); + } else { + $intervals[$index] = new Interval($start, new Constraint($border['operator'], $border['version'])); + $index++; + + if ($stopOnFirstValidInterval) { + break; + } + } + + $start = null; + } + } + + return array('numeric' => $intervals, 'branches' => $branches); + } + + /** + * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} + */ + private static function generateSingleConstraintIntervals(Constraint $constraint) + { + $op = $constraint->getOperator(); + + // handle branch constraints first + if (strpos($constraint->getVersion(), 'dev-') === 0) { + $intervals = array(); + $branches = array('names' => array(), 'exclude' => false); + + // != dev-foo means any numeric version may match, we treat >/< like != they are not really defined for branches + if ($op === '!=') { + $intervals[] = new Interval(Interval::fromZero(), Interval::untilPositiveInfinity()); + $branches = array('names' => array($constraint->getVersion()), 'exclude' => true); + } elseif ($op === '==') { + $branches['names'][] = $constraint->getVersion(); + } + + return array( + 'numeric' => $intervals, + 'branches' => $branches, + ); + } + + if ($op[0] === '>') { // > & >= + return array('numeric' => array(new Interval($constraint, Interval::untilPositiveInfinity())), 'branches' => Interval::noDev()); + } + if ($op[0] === '<') { // < & <= + return array('numeric' => array(new Interval(Interval::fromZero(), $constraint)), 'branches' => Interval::noDev()); + } + if ($op === '!=') { + // convert !=x to intervals of 0 - x - +inf + dev* + return array('numeric' => array( + new Interval(Interval::fromZero(), new Constraint('<', $constraint->getVersion())), + new Interval(new Constraint('>', $constraint->getVersion()), Interval::untilPositiveInfinity()), + ), 'branches' => Interval::anyDev()); + } + + // convert ==x to an interval of >=x - <=x + return array('numeric' => array( + new Interval(new Constraint('>=', $constraint->getVersion()), new Constraint('<=', $constraint->getVersion())), + ), 'branches' => Interval::noDev()); + } +} diff --git a/vendor/composer/semver/src/Semver.php b/vendor/composer/semver/src/Semver.php new file mode 100644 index 00000000..4d6de3c2 --- /dev/null +++ b/vendor/composer/semver/src/Semver.php @@ -0,0 +1,129 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver; + +use Composer\Semver\Constraint\Constraint; + +class Semver +{ + const SORT_ASC = 1; + const SORT_DESC = -1; + + /** @var VersionParser */ + private static $versionParser; + + /** + * Determine if given version satisfies given constraints. + * + * @param string $version + * @param string $constraints + * + * @return bool + */ + public static function satisfies($version, $constraints) + { + if (null === self::$versionParser) { + self::$versionParser = new VersionParser(); + } + + $versionParser = self::$versionParser; + $provider = new Constraint('==', $versionParser->normalize($version)); + $parsedConstraints = $versionParser->parseConstraints($constraints); + + return $parsedConstraints->matches($provider); + } + + /** + * Return all versions that satisfy given constraints. + * + * @param string[] $versions + * @param string $constraints + * + * @return string[] + */ + public static function satisfiedBy(array $versions, $constraints) + { + $versions = array_filter($versions, function ($version) use ($constraints) { + return Semver::satisfies($version, $constraints); + }); + + return array_values($versions); + } + + /** + * Sort given array of versions. + * + * @param string[] $versions + * + * @return string[] + */ + public static function sort(array $versions) + { + return self::usort($versions, self::SORT_ASC); + } + + /** + * Sort given array of versions in reverse. + * + * @param string[] $versions + * + * @return string[] + */ + public static function rsort(array $versions) + { + return self::usort($versions, self::SORT_DESC); + } + + /** + * @param string[] $versions + * @param int $direction + * + * @return string[] + */ + private static function usort(array $versions, $direction) + { + if (null === self::$versionParser) { + self::$versionParser = new VersionParser(); + } + + $versionParser = self::$versionParser; + $normalized = array(); + + // Normalize outside of usort() scope for minor performance increase. + // Creates an array of arrays: [[normalized, key], ...] + foreach ($versions as $key => $version) { + $normalizedVersion = $versionParser->normalize($version); + $normalizedVersion = $versionParser->normalizeDefaultBranch($normalizedVersion); + $normalized[] = array($normalizedVersion, $key); + } + + usort($normalized, function (array $left, array $right) use ($direction) { + if ($left[0] === $right[0]) { + return 0; + } + + if (Comparator::lessThan($left[0], $right[0])) { + return -$direction; + } + + return $direction; + }); + + // Recreate input array, using the original indexes which are now in sorted order. + $sorted = array(); + foreach ($normalized as $item) { + $sorted[] = $versions[$item[1]]; + } + + return $sorted; + } +} diff --git a/vendor/composer/semver/src/VersionParser.php b/vendor/composer/semver/src/VersionParser.php new file mode 100644 index 00000000..202ce247 --- /dev/null +++ b/vendor/composer/semver/src/VersionParser.php @@ -0,0 +1,586 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\Semver; + +use Composer\Semver\Constraint\ConstraintInterface; +use Composer\Semver\Constraint\MatchAllConstraint; +use Composer\Semver\Constraint\MultiConstraint; +use Composer\Semver\Constraint\Constraint; + +/** + * Version parser. + * + * @author Jordi Boggiano + */ +class VersionParser +{ + /** + * Regex to match pre-release data (sort of). + * + * Due to backwards compatibility: + * - Instead of enforcing hyphen, an underscore, dot or nothing at all are also accepted. + * - Only stabilities as recognized by Composer are allowed to precede a numerical identifier. + * - Numerical-only pre-release identifiers are not supported, see tests. + * + * |--------------| + * [major].[minor].[patch] -[pre-release] +[build-metadata] + * + * @var string + */ + private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\d+)*+)?)?([.-]?dev)?'; + + /** @var string */ + private static $stabilitiesRegex = 'stable|RC|beta|alpha|dev'; + + /** + * Returns the stability of a version. + * + * @param string $version + * + * @return string + * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev' + */ + public static function parseStability($version) + { + $version = (string) preg_replace('{#.+$}', '', (string) $version); + + if (strpos($version, 'dev-') === 0 || '-dev' === substr($version, -4)) { + return 'dev'; + } + + preg_match('{' . self::$modifierRegex . '(?:\+.*)?$}i', strtolower($version), $match); + + if (!empty($match[3])) { + return 'dev'; + } + + if (!empty($match[1])) { + if ('beta' === $match[1] || 'b' === $match[1]) { + return 'beta'; + } + if ('alpha' === $match[1] || 'a' === $match[1]) { + return 'alpha'; + } + if ('rc' === $match[1]) { + return 'RC'; + } + } + + return 'stable'; + } + + /** + * @param string $stability + * + * @return string + */ + public static function normalizeStability($stability) + { + $stability = strtolower((string) $stability); + + return $stability === 'rc' ? 'RC' : $stability; + } + + /** + * Normalizes a version string to be able to perform comparisons on it. + * + * @param string $version + * @param ?string $fullVersion optional complete version string to give more context + * + * @throws \UnexpectedValueException + * + * @return string + */ + public function normalize($version, $fullVersion = null) + { + $version = trim((string) $version); + $origVersion = $version; + if (null === $fullVersion) { + $fullVersion = $version; + } + + // strip off aliasing + if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $version, $match)) { + $version = $match[1]; + } + + // strip off stability flag + if (preg_match('{@(?:' . self::$stabilitiesRegex . ')$}i', $version, $match)) { + $version = substr($version, 0, strlen($version) - strlen($match[0])); + } + + // normalize master/trunk/default branches to dev-name for BC with 1.x as these used to be valid constraints + if (\in_array($version, array('master', 'trunk', 'default'), true)) { + $version = 'dev-' . $version; + } + + // if requirement is branch-like, use full name + if (stripos($version, 'dev-') === 0) { + return 'dev-' . substr($version, 4); + } + + // strip off build metadata + if (preg_match('{^([^,\s+]++)\+[^\s]++$}', $version, $match)) { + $version = $match[1]; + } + + // match classical versioning + if (preg_match('{^v?(\d{1,5})(\.\d++)?(\.\d++)?(\.\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) { + $version = $matches[1] + . (!empty($matches[2]) ? $matches[2] : '.0') + . (!empty($matches[3]) ? $matches[3] : '.0') + . (!empty($matches[4]) ? $matches[4] : '.0'); + $index = 5; + // match date(time) based versioning + } elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3})?)' . self::$modifierRegex . '$}i', $version, $matches)) { + $version = preg_replace('{\D}', '.', $matches[1]); + $index = 2; + } + + // add version modifiers if a version was matched + if (isset($index)) { + if (!empty($matches[$index])) { + if ('stable' === $matches[$index]) { + return $version; + } + $version .= '-' . $this->expandStability($matches[$index]) . (isset($matches[$index + 1]) && '' !== $matches[$index + 1] ? ltrim($matches[$index + 1], '.-') : ''); + } + + if (!empty($matches[$index + 2])) { + $version .= '-dev'; + } + + return $version; + } + + // match dev branches + if (preg_match('{(.*?)[.-]?dev$}i', $version, $match)) { + try { + $normalized = $this->normalizeBranch($match[1]); + // a branch ending with -dev is only valid if it is numeric + // if it gets prefixed with dev- it means the branch name should + // have had a dev- prefix already when passed to normalize + if (strpos($normalized, 'dev-') === false) { + return $normalized; + } + } catch (\Exception $e) { + } + } + + $extraMessage = ''; + if (preg_match('{ +as +' . preg_quote($version) . '(?:@(?:'.self::$stabilitiesRegex.'))?$}', $fullVersion)) { + $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version'; + } elseif (preg_match('{^' . preg_quote($version) . '(?:@(?:'.self::$stabilitiesRegex.'))? +as +}', $fullVersion)) { + $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-'; + } + + throw new \UnexpectedValueException('Invalid version string "' . $origVersion . '"' . $extraMessage); + } + + /** + * Extract numeric prefix from alias, if it is in numeric format, suitable for version comparison. + * + * @param string $branch Branch name (e.g. 2.1.x-dev) + * + * @return string|false Numeric prefix if present (e.g. 2.1.) or false + */ + public function parseNumericAliasPrefix($branch) + { + if (preg_match('{^(?P(\d++\\.)*\d++)(?:\.x)?-dev$}i', (string) $branch, $matches)) { + return $matches['version'] . '.'; + } + + return false; + } + + /** + * Normalizes a branch name to be able to perform comparisons on it. + * + * @param string $name + * + * @return string + */ + public function normalizeBranch($name) + { + $name = trim((string) $name); + + if (preg_match('{^v?(\d++)(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?$}i', $name, $matches)) { + $version = ''; + for ($i = 1; $i < 5; ++$i) { + $version .= isset($matches[$i]) ? str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x'; + } + + return str_replace('x', '9999999', $version) . '-dev'; + } + + return 'dev-' . $name; + } + + /** + * Normalizes a default branch name (i.e. master on git) to 9999999-dev. + * + * @param string $name + * + * @return string + * + * @deprecated No need to use this anymore in theory, Composer 2 does not normalize any branch names to 9999999-dev anymore + */ + public function normalizeDefaultBranch($name) + { + if ($name === 'dev-master' || $name === 'dev-default' || $name === 'dev-trunk') { + return '9999999-dev'; + } + + return (string) $name; + } + + /** + * Parses a constraint string into MultiConstraint and/or Constraint objects. + * + * @param string $constraints + * + * @return ConstraintInterface + */ + public function parseConstraints($constraints) + { + $prettyConstraint = (string) $constraints; + + $orConstraints = preg_split('{\s*\|\|?\s*}', trim((string) $constraints)); + if (false === $orConstraints) { + throw new \RuntimeException('Failed to preg_split string: '.$constraints); + } + $orGroups = array(); + + foreach ($orConstraints as $constraints) { + $andConstraints = preg_split('{(?< ,]) *(? 1) { + $constraintObjects = array(); + foreach ($andConstraints as $constraint) { + foreach ($this->parseConstraint($constraint) as $parsedConstraint) { + $constraintObjects[] = $parsedConstraint; + } + } + } else { + $constraintObjects = $this->parseConstraint($andConstraints[0]); + } + + if (1 === \count($constraintObjects)) { + $constraint = $constraintObjects[0]; + } else { + $constraint = new MultiConstraint($constraintObjects); + } + + $orGroups[] = $constraint; + } + + $constraint = MultiConstraint::create($orGroups, false); + + $constraint->setPrettyString($prettyConstraint); + + return $constraint; + } + + /** + * @param string $constraint + * + * @throws \UnexpectedValueException + * + * @return array + * + * @phpstan-return non-empty-array + */ + private function parseConstraint($constraint) + { + // strip off aliasing + if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $constraint, $match)) { + $constraint = $match[1]; + } + + // strip @stability flags, and keep it for later use + if (preg_match('{^([^,\s]*?)@(' . self::$stabilitiesRegex . ')$}i', $constraint, $match)) { + $constraint = '' !== $match[1] ? $match[1] : '*'; + if ($match[2] !== 'stable') { + $stabilityModifier = $match[2]; + } + } + + // get rid of #refs as those are used by composer only + if (preg_match('{^(dev-[^,\s@]+?|[^,\s@]+?\.x-dev)#.+$}i', $constraint, $match)) { + $constraint = $match[1]; + } + + if (preg_match('{^(v)?[xX*](\.[xX*])*$}i', $constraint, $match)) { + if (!empty($match[1]) || !empty($match[2])) { + return array(new Constraint('>=', '0.0.0.0-dev')); + } + + return array(new MatchAllConstraint()); + } + + $versionRegex = 'v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.(\d++))?(?:' . self::$modifierRegex . '|\.([xX*][.-]?dev))(?:\+[^\s]+)?'; + + // Tilde Range + // + // Like wildcard constraints, unsuffixed tilde constraints say that they must be greater than the previous + // version, to ensure that unstable instances of the current version are allowed. However, if a stability + // suffix is added to the constraint, then a >= match on the current version is used instead. + if (preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) { + if (strpos($constraint, '~>') === 0) { + throw new \UnexpectedValueException( + 'Could not parse version constraint ' . $constraint . ': ' . + 'Invalid operator "~>", you probably meant to use the "~" operator' + ); + } + + // Work out which position in the version we are operating at + if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) { + $position = 4; + } elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { + $position = 3; + } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { + $position = 2; + } else { + $position = 1; + } + + // when matching 2.x-dev or 3.0.x-dev we have to shift the second or third number, despite no second/third number matching above + if (!empty($matches[8])) { + $position++; + } + + // Calculate the stability suffix + $stabilitySuffix = ''; + if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { + $stabilitySuffix .= '-dev'; + } + + $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1)); + $lowerBound = new Constraint('>=', $lowVersion); + + // For upper bound, we increment the position of one more significance, + // but highPosition = 0 would be illegal + $highPosition = max(1, $position - 1); + $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev'; + $upperBound = new Constraint('<', $highVersion); + + return array( + $lowerBound, + $upperBound, + ); + } + + // Caret Range + // + // Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple. + // In other words, this allows patch and minor updates for versions 1.0.0 and above, patch updates for + // versions 0.X >=0.1.0, and no updates for versions 0.0.X + if (preg_match('{^\^' . $versionRegex . '($)}i', $constraint, $matches)) { + // Work out which position in the version we are operating at + if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) { + $position = 1; + } elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) { + $position = 2; + } else { + $position = 3; + } + + // Calculate the stability suffix + $stabilitySuffix = ''; + if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { + $stabilitySuffix .= '-dev'; + } + + $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1)); + $lowerBound = new Constraint('>=', $lowVersion); + + // For upper bound, we increment the position of one more significance, + // but highPosition = 0 would be illegal + $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; + $upperBound = new Constraint('<', $highVersion); + + return array( + $lowerBound, + $upperBound, + ); + } + + // X Range + // + // Any of X, x, or * may be used to "stand in" for one of the numeric values in the [major, minor, patch] tuple. + // A partial version range is treated as an X-Range, so the special character is in fact optional. + if (preg_match('{^v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.[xX*])++$}', $constraint, $matches)) { + if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { + $position = 3; + } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { + $position = 2; + } else { + $position = 1; + } + + $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev'; + $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; + + if ($lowVersion === '0.0.0.0-dev') { + return array(new Constraint('<', $highVersion)); + } + + return array( + new Constraint('>=', $lowVersion), + new Constraint('<', $highVersion), + ); + } + + // Hyphen Range + // + // Specifies an inclusive set. If a partial version is provided as the first version in the inclusive range, + // then the missing pieces are replaced with zeroes. If a partial version is provided as the second version in + // the inclusive range, then all versions that start with the supplied parts of the tuple are accepted, but + // nothing that would be greater than the provided tuple parts. + if (preg_match('{^(?P' . $versionRegex . ') +- +(?P' . $versionRegex . ')($)}i', $constraint, $matches)) { + // Calculate the stability suffix + $lowStabilitySuffix = ''; + if (empty($matches[6]) && empty($matches[8]) && empty($matches[9])) { + $lowStabilitySuffix = '-dev'; + } + + $lowVersion = $this->normalize($matches['from']); + $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix); + + $empty = function ($x) { + return ($x === 0 || $x === '0') ? false : empty($x); + }; + + if ((!$empty($matches[12]) && !$empty($matches[13])) || !empty($matches[15]) || !empty($matches[17]) || !empty($matches[18])) { + $highVersion = $this->normalize($matches['to']); + $upperBound = new Constraint('<=', $highVersion); + } else { + $highMatch = array('', $matches[11], $matches[12], $matches[13], $matches[14]); + + // validate to version + $this->normalize($matches['to']); + + $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[12]) ? 1 : 2, 1) . '-dev'; + $upperBound = new Constraint('<', $highVersion); + } + + return array( + $lowerBound, + $upperBound, + ); + } + + // Basic Comparators + if (preg_match('{^(<>|!=|>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) { + try { + try { + $version = $this->normalize($matches[2]); + } catch (\UnexpectedValueException $e) { + // recover from an invalid constraint like foobar-dev which should be dev-foobar + // except if the constraint uses a known operator, in which case it must be a parse error + if (substr($matches[2], -4) === '-dev' && preg_match('{^[0-9a-zA-Z-./]+$}', $matches[2])) { + $version = $this->normalize('dev-'.substr($matches[2], 0, -4)); + } else { + throw $e; + } + } + + $op = $matches[1] ?: '='; + + if ($op !== '==' && $op !== '=' && !empty($stabilityModifier) && self::parseStability($version) === 'stable') { + $version .= '-' . $stabilityModifier; + } elseif ('<' === $op || '>=' === $op) { + if (!preg_match('/-' . self::$modifierRegex . '$/', strtolower($matches[2]))) { + if (strpos($matches[2], 'dev-') !== 0) { + $version .= '-dev'; + } + } + } + + return array(new Constraint($matches[1] ?: '=', $version)); + } catch (\Exception $e) { + } + } + + $message = 'Could not parse version constraint ' . $constraint; + if (isset($e)) { + $message .= ': ' . $e->getMessage(); + } + + throw new \UnexpectedValueException($message); + } + + /** + * Increment, decrement, or simply pad a version number. + * + * Support function for {@link parseConstraint()} + * + * @param array $matches Array with version parts in array indexes 1,2,3,4 + * @param int $position 1,2,3,4 - which segment of the version to increment/decrement + * @param int $increment + * @param string $pad The string to pad version parts after $position + * + * @return string|null The new version + * + * @phpstan-param string[] $matches + */ + private function manipulateVersionString(array $matches, $position, $increment = 0, $pad = '0') + { + for ($i = 4; $i > 0; --$i) { + if ($i > $position) { + $matches[$i] = $pad; + } elseif ($i === $position && $increment) { + $matches[$i] += $increment; + // If $matches[$i] was 0, carry the decrement + if ($matches[$i] < 0) { + $matches[$i] = $pad; + --$position; + + // Return null on a carry overflow + if ($i === 1) { + return null; + } + } + } + } + + return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4]; + } + + /** + * Expand shorthand stability string to long version. + * + * @param string $stability + * + * @return string + */ + private function expandStability($stability) + { + $stability = strtolower($stability); + + switch ($stability) { + case 'a': + return 'alpha'; + case 'b': + return 'beta'; + case 'p': + case 'pl': + return 'patch'; + case 'rc': + return 'RC'; + default: + return $stability; + } + } +} diff --git a/vendor/composer/xdebug-handler/CHANGELOG.md b/vendor/composer/xdebug-handler/CHANGELOG.md new file mode 100644 index 00000000..c5b5bcf4 --- /dev/null +++ b/vendor/composer/xdebug-handler/CHANGELOG.md @@ -0,0 +1,134 @@ +## [Unreleased] + +## [3.0.3] - 2022-02-25 + * Added: support for composer/pcre versions 2 and 3. + +## [3.0.2] - 2022-02-24 + * Fixed: regression in 3.0.1 affecting Xdebug 2 + +## [3.0.1] - 2022-01-04 + * Fixed: error when calling `isXdebugActive` before class instantiation. + +## [3.0.0] - 2021-12-23 + * Removed: support for legacy PHP versions (< PHP 7.2.5). + * Added: type declarations to arguments and return values. + * Added: strict typing to all classes. + +## [2.0.3] - 2021-12-08 + * Added: support, type annotations and refactoring for stricter PHPStan analysis. + +## [2.0.2] - 2021-07-31 + * Added: support for `xdebug_info('mode')` in Xdebug 3.1. + * Added: support for Psr\Log versions 2 and 3. + * Fixed: remove ini directives from non-cli HOST/PATH sections. + +## [2.0.1] - 2021-05-05 + * Fixed: don't restart if the cwd is a UNC path and cmd.exe will be invoked. + +## [2.0.0] - 2021-04-09 + * Break: this is a major release, see [UPGRADE.md](UPGRADE.md) for more information. + * Break: removed optional `$colorOption` constructor param and passthru fallback. + * Break: renamed `requiresRestart` param from `$isLoaded` to `$default`. + * Break: changed `restart` param `$command` from a string to an array. + * Added: support for Xdebug3 to only restart if Xdebug is not running with `xdebug.mode=off`. + * Added: `isXdebugActive()` method to determine if Xdebug is still running in the restart. + * Added: feature to bypass the shell in PHP-7.4+ by giving `proc_open` an array of arguments. + * Added: Process utility class to the API. + +## [1.4.6] - 2021-03-25 + * Fixed: fail restart if `proc_open` has been disabled in `disable_functions`. + * Fixed: enable Windows CTRL event handling in the restarted process. + +## [1.4.5] - 2020-11-13 + * Fixed: use `proc_open` when available for correct FD forwarding to the restarted process. + +## [1.4.4] - 2020-10-24 + * Fixed: exception if 'pcntl_signal' is disabled. + +## [1.4.3] - 2020-08-19 + * Fixed: restore SIGINT to default handler in restarted process if no other handler exists. + +## [1.4.2] - 2020-06-04 + * Fixed: ignore SIGINTs to let the restarted process handle them. + +## [1.4.1] - 2020-03-01 + * Fixed: restart fails if an ini file is empty. + +## [1.4.0] - 2019-11-06 + * Added: support for `NO_COLOR` environment variable: https://no-color.org + * Added: color support for Hyper terminal: https://github.com/zeit/hyper + * Fixed: correct capitalization of Xdebug (apparently). + * Fixed: improved handling for uopz extension. + +## [1.3.3] - 2019-05-27 + * Fixed: add environment changes to `$_ENV` if it is being used. + +## [1.3.2] - 2019-01-28 + * Fixed: exit call being blocked by uopz extension, resulting in application code running twice. + +## [1.3.1] - 2018-11-29 + * Fixed: fail restart if `passthru` has been disabled in `disable_functions`. + * Fixed: fail restart if an ini file cannot be opened, otherwise settings will be missing. + +## [1.3.0] - 2018-08-31 + * Added: `setPersistent` method to use environment variables for the restart. + * Fixed: improved debugging by writing output to stderr. + * Fixed: no restart when `php_ini_scanned_files` is not functional and is needed. + +## [1.2.1] - 2018-08-23 + * Fixed: fatal error with apc, when using `apc.mmap_file_mask`. + +## [1.2.0] - 2018-08-16 + * Added: debug information using `XDEBUG_HANDLER_DEBUG`. + * Added: fluent interface for setters. + * Added: `PhpConfig` helper class for calling PHP sub-processes. + * Added: `PHPRC` original value to restart stettings, for use in a restarted process. + * Changed: internal procedure to disable ini-scanning, using `-n` command-line option. + * Fixed: replaced `escapeshellarg` usage to avoid locale problems. + * Fixed: improved color-option handling to respect double-dash delimiter. + * Fixed: color-option handling regression from main script changes. + * Fixed: improved handling when checking main script. + * Fixed: handling for standard input, that never actually did anything. + * Fixed: fatal error when ctype extension is not available. + +## [1.1.0] - 2018-04-11 + * Added: `getRestartSettings` method for calling PHP processes in a restarted process. + * Added: API definition and @internal class annotations. + * Added: protected `requiresRestart` method for extending classes. + * Added: `setMainScript` method for applications that change the working directory. + * Changed: private `tmpIni` variable to protected for extending classes. + * Fixed: environment variables not available in $_SERVER when restored in the restart. + * Fixed: relative path problems caused by Phar::interceptFileFuncs. + * Fixed: incorrect handling when script file cannot be found. + +## [1.0.0] - 2018-03-08 + * Added: PSR3 logging for optional status output. + * Added: existing ini settings are merged to catch command-line overrides. + * Added: code, tests and other artefacts to decouple from Composer. + * Break: the following class was renamed: + - `Composer\XdebugHandler` -> `Composer\XdebugHandler\XdebugHandler` + +[Unreleased]: https://github.com/composer/xdebug-handler/compare/3.0.3...HEAD +[3.0.2]: https://github.com/composer/xdebug-handler/compare/3.0.2...3.0.3 +[3.0.2]: https://github.com/composer/xdebug-handler/compare/3.0.1...3.0.2 +[3.0.1]: https://github.com/composer/xdebug-handler/compare/3.0.0...3.0.1 +[3.0.0]: https://github.com/composer/xdebug-handler/compare/2.0.3...3.0.0 +[2.0.3]: https://github.com/composer/xdebug-handler/compare/2.0.2...2.0.3 +[2.0.2]: https://github.com/composer/xdebug-handler/compare/2.0.1...2.0.2 +[2.0.1]: https://github.com/composer/xdebug-handler/compare/2.0.0...2.0.1 +[2.0.0]: https://github.com/composer/xdebug-handler/compare/1.4.6...2.0.0 +[1.4.6]: https://github.com/composer/xdebug-handler/compare/1.4.5...1.4.6 +[1.4.5]: https://github.com/composer/xdebug-handler/compare/1.4.4...1.4.5 +[1.4.4]: https://github.com/composer/xdebug-handler/compare/1.4.3...1.4.4 +[1.4.3]: https://github.com/composer/xdebug-handler/compare/1.4.2...1.4.3 +[1.4.2]: https://github.com/composer/xdebug-handler/compare/1.4.1...1.4.2 +[1.4.1]: https://github.com/composer/xdebug-handler/compare/1.4.0...1.4.1 +[1.4.0]: https://github.com/composer/xdebug-handler/compare/1.3.3...1.4.0 +[1.3.3]: https://github.com/composer/xdebug-handler/compare/1.3.2...1.3.3 +[1.3.2]: https://github.com/composer/xdebug-handler/compare/1.3.1...1.3.2 +[1.3.1]: https://github.com/composer/xdebug-handler/compare/1.3.0...1.3.1 +[1.3.0]: https://github.com/composer/xdebug-handler/compare/1.2.1...1.3.0 +[1.2.1]: https://github.com/composer/xdebug-handler/compare/1.2.0...1.2.1 +[1.2.0]: https://github.com/composer/xdebug-handler/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/composer/xdebug-handler/compare/1.0.0...1.1.0 +[1.0.0]: https://github.com/composer/xdebug-handler/compare/d66f0d15cb57...1.0.0 diff --git a/vendor/composer/xdebug-handler/LICENSE b/vendor/composer/xdebug-handler/LICENSE new file mode 100644 index 00000000..963618a1 --- /dev/null +++ b/vendor/composer/xdebug-handler/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Composer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/composer/xdebug-handler/README.md b/vendor/composer/xdebug-handler/README.md new file mode 100644 index 00000000..56618fc1 --- /dev/null +++ b/vendor/composer/xdebug-handler/README.md @@ -0,0 +1,298 @@ +# composer/xdebug-handler + +[![packagist](https://img.shields.io/packagist/v/composer/xdebug-handler)](https://packagist.org/packages/composer/xdebug-handler) +[![Continuous Integration](https://github.com/composer/xdebug-handler/actions/workflows/continuous-integration.yml/badge.svg?branch=main)](https://github.com/composer/xdebug-handler/actions?query=branch:main) +![license](https://img.shields.io/github/license/composer/xdebug-handler.svg) +![php](https://img.shields.io/packagist/php-v/composer/xdebug-handler?colorB=8892BF) + +Restart a CLI process without loading the Xdebug extension, unless `xdebug.mode=off`. + +Originally written as part of [composer/composer](https://github.com/composer/composer), +now extracted and made available as a stand-alone library. + +### Version 3 + +Removed support for legacy PHP versions and added type declarations. + +Long term support for version 2 (PHP 5.3.2 - 7.2.4) follows [Composer 2.2 LTS](https://blog.packagist.com/composer-2-2/) policy. + +## Installation + +Install the latest version with: + +```bash +$ composer require composer/xdebug-handler +``` + +## Requirements + +* PHP 7.2.5 minimum, although using the latest PHP version is highly recommended. + +## Basic Usage +```php +use Composer\XdebugHandler\XdebugHandler; + +$xdebug = new XdebugHandler('myapp'); +$xdebug->check(); +unset($xdebug); +``` + +The constructor takes a single parameter, `$envPrefix`, which is upper-cased and prepended to default base values to create two distinct environment variables. The above example enables the use of: + +- `MYAPP_ALLOW_XDEBUG=1` to override automatic restart and allow Xdebug +- `MYAPP_ORIGINAL_INIS` to obtain ini file locations in a restarted process + +## Advanced Usage + +* [How it works](#how-it-works) +* [Limitations](#limitations) +* [Helper methods](#helper-methods) +* [Setter methods](#setter-methods) +* [Process configuration](#process-configuration) +* [Troubleshooting](#troubleshooting) +* [Extending the library](#extending-the-library) + +### How it works + +A temporary ini file is created from the loaded (and scanned) ini files, with any references to the Xdebug extension commented out. Current ini settings are merged, so that most ini settings made on the command-line or by the application are included (see [Limitations](#limitations)) + +* `MYAPP_ALLOW_XDEBUG` is set with internal data to flag and use in the restart. +* The command-line and environment are [configured](#process-configuration) for the restart. +* The application is restarted in a new process. + * The restart settings are stored in the environment. + * `MYAPP_ALLOW_XDEBUG` is unset. + * The application runs and exits. +* The main process exits with the exit code from the restarted process. + +#### Signal handling +Asynchronous signal handling is automatically enabled if the pcntl extension is loaded. `SIGINT` is set to `SIG_IGN` in the parent +process and restored to `SIG_DFL` in the restarted process (if no other handler has been set). + +From PHP 7.4 on Windows, `CTRL+C` and `CTRL+BREAK` handling is automatically enabled in the restarted process and ignored in the parent process. + +### Limitations +There are a few things to be aware of when running inside a restarted process. + +* Extensions set on the command-line will not be loaded. +* Ini file locations will be reported as per the restart - see [getAllIniFiles()](#getallinifiles). +* Php sub-processes may be loaded with Xdebug enabled - see [Process configuration](#process-configuration). + +### Helper methods +These static methods provide information from the current process, regardless of whether it has been restarted or not. + +#### _getAllIniFiles(): array_ +Returns an array of the original ini file locations. Use this instead of calling `php_ini_loaded_file` and `php_ini_scanned_files`, which will report the wrong values in a restarted process. + +```php +use Composer\XdebugHandler\XdebugHandler; + +$files = XdebugHandler::getAllIniFiles(); + +# $files[0] always exists, it could be an empty string +$loadedIni = array_shift($files); +$scannedInis = $files; +``` + +These locations are also available in the `MYAPP_ORIGINAL_INIS` environment variable. This is a path-separated string comprising the location returned from `php_ini_loaded_file`, which could be empty, followed by locations parsed from calling `php_ini_scanned_files`. + +#### _getRestartSettings(): ?array_ +Returns an array of settings that can be used with PHP [sub-processes](#sub-processes), or null if the process was not restarted. + +```php +use Composer\XdebugHandler\XdebugHandler; + +$settings = XdebugHandler::getRestartSettings(); +/** + * $settings: array (if the current process was restarted, + * or called with the settings from a previous restart), or null + * + * 'tmpIni' => the temporary ini file used in the restart (string) + * 'scannedInis' => if there were any scanned inis (bool) + * 'scanDir' => the original PHP_INI_SCAN_DIR value (false|string) + * 'phprc' => the original PHPRC value (false|string) + * 'inis' => the original inis from getAllIniFiles (array) + * 'skipped' => the skipped version from getSkippedVersion (string) + */ +``` + +#### _getSkippedVersion(): string_ +Returns the Xdebug version string that was skipped by the restart, or an empty string if there was no restart (or Xdebug is still loaded, perhaps by an extending class restarting for a reason other than removing Xdebug). + +```php +use Composer\XdebugHandler\XdebugHandler; + +$version = XdebugHandler::getSkippedVersion(); +# $version: '3.1.1' (for example), or an empty string +``` + +#### _isXdebugActive(): bool_ +Returns true if Xdebug is loaded and is running in an active mode (if it supports modes). Returns false if Xdebug is not loaded, or it is running with `xdebug.mode=off`. + +### Setter methods +These methods implement a fluent interface and must be called before the main `check()` method. + +#### _setLogger(LoggerInterface $logger): self_ +Enables the output of status messages to an external PSR3 logger. All messages are reported with either `DEBUG` or `WARNING` log levels. For example (showing the level and message): + +``` +// No restart +DEBUG Checking MYAPP_ALLOW_XDEBUG +DEBUG The Xdebug extension is loaded (3.1.1) xdebug.mode=off +DEBUG No restart (APP_ALLOW_XDEBUG=0) Allowed by xdebug.mode + +// Restart overridden +DEBUG Checking MYAPP_ALLOW_XDEBUG +DEBUG The Xdebug extension is loaded (3.1.1) xdebug.mode=coverage,debug,develop +DEBUG No restart (MYAPP_ALLOW_XDEBUG=1) + +// Failed restart +DEBUG Checking MYAPP_ALLOW_XDEBUG +DEBUG The Xdebug extension is loaded (3.1.0) +WARNING No restart (Unable to create temp ini file at: ...) +``` + +Status messages can also be output with `XDEBUG_HANDLER_DEBUG`. See [Troubleshooting](#troubleshooting). + +#### _setMainScript(string $script): self_ +Sets the location of the main script to run in the restart. This is only needed in more esoteric use-cases, or if the `argv[0]` location is inaccessible. The script name `--` is supported for standard input. + +#### _setPersistent(): self_ +Configures the restart using [persistent settings](#persistent-settings), so that Xdebug is not loaded in any sub-process. + +Use this method if your application invokes one or more PHP sub-process and the Xdebug extension is not needed. This avoids the overhead of implementing specific [sub-process](#sub-processes) strategies. + +Alternatively, this method can be used to set up a default _Xdebug-free_ environment which can be changed if a sub-process requires Xdebug, then restored afterwards: + +```php +function SubProcessWithXdebug() +{ + $phpConfig = new Composer\XdebugHandler\PhpConfig(); + + # Set the environment to the original configuration + $phpConfig->useOriginal(); + + # run the process with Xdebug loaded + ... + + # Restore Xdebug-free environment + $phpConfig->usePersistent(); +} +``` + +### Process configuration +The library offers two strategies to invoke a new PHP process without loading Xdebug, using either _standard_ or _persistent_ settings. Note that this is only important if the application calls a PHP sub-process. + +#### Standard settings +Uses command-line options to remove Xdebug from the new process only. + +* The -n option is added to the command-line. This tells PHP not to scan for additional inis. +* The temporary ini is added to the command-line with the -c option. + +>_If the new process calls a PHP sub-process, Xdebug will be loaded in that sub-process (unless it implements xdebug-handler, in which case there will be another restart)._ + +This is the default strategy used in the restart. + +#### Persistent settings +Uses environment variables to remove Xdebug from the new process and persist these settings to any sub-process. + +* `PHP_INI_SCAN_DIR` is set to an empty string. This tells PHP not to scan for additional inis. +* `PHPRC` is set to the temporary ini. + +>_If the new process calls a PHP sub-process, Xdebug will not be loaded in that sub-process._ + +This strategy can be used in the restart by calling [setPersistent()](#setpersistent). + +#### Sub-processes +The `PhpConfig` helper class makes it easy to invoke a PHP sub-process (with or without Xdebug loaded), regardless of whether there has been a restart. + +Each of its methods returns an array of PHP options (to add to the command-line) and sets up the environment for the required strategy. The [getRestartSettings()](#getrestartsettings) method is used internally. + +* `useOriginal()` - Xdebug will be loaded in the new process. +* `useStandard()` - Xdebug will **not** be loaded in the new process - see [standard settings](#standard-settings). +* `userPersistent()` - Xdebug will **not** be loaded in the new process - see [persistent settings](#persistent-settings) + +If there was no restart, an empty options array is returned and the environment is not changed. + +```php +use Composer\XdebugHandler\PhpConfig; + +$config = new PhpConfig; + +$options = $config->useOriginal(); +# $options: empty array +# environment: PHPRC and PHP_INI_SCAN_DIR set to original values + +$options = $config->useStandard(); +# $options: [-n, -c, tmpIni] +# environment: PHPRC and PHP_INI_SCAN_DIR set to original values + +$options = $config->usePersistent(); +# $options: empty array +# environment: PHPRC=tmpIni, PHP_INI_SCAN_DIR='' +``` + +### Troubleshooting +The following environment settings can be used to troubleshoot unexpected behavior: + +* `XDEBUG_HANDLER_DEBUG=1` Outputs status messages to `STDERR`, if it is defined, irrespective of any PSR3 logger. Each message is prefixed `xdebug-handler[pid]`, where pid is the process identifier. + +* `XDEBUG_HANDLER_DEBUG=2` As above, but additionally saves the temporary ini file and reports its location in a status message. + +### Extending the library +The API is defined by classes and their accessible elements that are not annotated as @internal. The main class has two protected methods that can be overridden to provide additional functionality: + +#### _requiresRestart(bool $default): bool_ +By default the process will restart if Xdebug is loaded and not running with `xdebug.mode=off`. Extending this method allows an application to decide, by returning a boolean (or equivalent) value. +It is only called if `MYAPP_ALLOW_XDEBUG` is empty, so it will not be called in the restarted process (where this variable contains internal data), or if the restart has been overridden. + +Note that the [setMainScript()](#setmainscriptscript) and [setPersistent()](#setpersistent) setters can be used here, if required. + +#### _restart(array $command): void_ +An application can extend this to modify the temporary ini file, its location given in the `tmpIni` property. New settings can be safely appended to the end of the data, which is `PHP_EOL` terminated. + +The `$command` parameter is an array of unescaped command-line arguments that will be used for the new process. + +Remember to finish with `parent::restart($command)`. + +#### Example +This example demonstrates two ways to extend basic functionality: + +* To avoid the overhead of spinning up a new process, the restart is skipped if a simple help command is requested. + +* The application needs write-access to phar files, so it will force a restart if `phar.readonly` is set (regardless of whether Xdebug is loaded) and change this value in the temporary ini file. + +```php +use Composer\XdebugHandler\XdebugHandler; +use MyApp\Command; + +class MyRestarter extends XdebugHandler +{ + private $required; + + protected function requiresRestart(bool $default): bool + { + if (Command::isHelp()) { + # No need to disable Xdebug for this + return false; + } + + $this->required = (bool) ini_get('phar.readonly'); + return $this->required || $default; + } + + protected function restart(array $command): void + { + if ($this->required) { + # Add required ini setting to tmpIni + $content = file_get_contents($this->tmpIni); + $content .= 'phar.readonly=0'.PHP_EOL; + file_put_contents($this->tmpIni, $content); + } + + parent::restart($command); + } +} +``` + +## License +composer/xdebug-handler is licensed under the MIT License, see the LICENSE file for details. diff --git a/vendor/composer/xdebug-handler/composer.json b/vendor/composer/xdebug-handler/composer.json new file mode 100644 index 00000000..6b649dab --- /dev/null +++ b/vendor/composer/xdebug-handler/composer.json @@ -0,0 +1,44 @@ +{ + "name": "composer/xdebug-handler", + "description": "Restarts a process without Xdebug.", + "type": "library", + "license": "MIT", + "keywords": [ + "xdebug", + "performance" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3", + "composer/pcre": "^1 || ^2 || ^3" + }, + "require-dev": { + "symfony/phpunit-bridge": "^6.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1" + }, + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Composer\\XdebugHandler\\Tests\\": "tests" + } + }, + "scripts": { + "test": "@php vendor/bin/simple-phpunit", + "phpstan": "@php vendor/bin/phpstan analyse" + } +} diff --git a/vendor/composer/xdebug-handler/src/PhpConfig.php b/vendor/composer/xdebug-handler/src/PhpConfig.php new file mode 100644 index 00000000..7edac888 --- /dev/null +++ b/vendor/composer/xdebug-handler/src/PhpConfig.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\XdebugHandler; + +/** + * @author John Stevenson + * + * @phpstan-type restartData array{tmpIni: string, scannedInis: bool, scanDir: false|string, phprc: false|string, inis: string[], skipped: string} + */ +class PhpConfig +{ + /** + * Use the original PHP configuration + * + * @return string[] Empty array of PHP cli options + */ + public function useOriginal(): array + { + $this->getDataAndReset(); + return []; + } + + /** + * Use standard restart settings + * + * @return string[] PHP cli options + */ + public function useStandard(): array + { + $data = $this->getDataAndReset(); + if ($data !== null) { + return ['-n', '-c', $data['tmpIni']]; + } + + return []; + } + + /** + * Use environment variables to persist settings + * + * @return string[] Empty array of PHP cli options + */ + public function usePersistent(): array + { + $data = $this->getDataAndReset(); + if ($data !== null) { + $this->updateEnv('PHPRC', $data['tmpIni']); + $this->updateEnv('PHP_INI_SCAN_DIR', ''); + } + + return []; + } + + /** + * Returns restart data if available and resets the environment + * + * @phpstan-return restartData|null + */ + private function getDataAndReset(): ?array + { + $data = XdebugHandler::getRestartSettings(); + if ($data !== null) { + $this->updateEnv('PHPRC', $data['phprc']); + $this->updateEnv('PHP_INI_SCAN_DIR', $data['scanDir']); + } + + return $data; + } + + /** + * Updates a restart settings value in the environment + * + * @param string $name + * @param string|false $value + */ + private function updateEnv(string $name, $value): void + { + Process::setEnv($name, false !== $value ? $value : null); + } +} diff --git a/vendor/composer/xdebug-handler/src/Process.php b/vendor/composer/xdebug-handler/src/Process.php new file mode 100644 index 00000000..c612200b --- /dev/null +++ b/vendor/composer/xdebug-handler/src/Process.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Composer\XdebugHandler; + +use Composer\Pcre\Preg; + +/** + * Process utility functions + * + * @author John Stevenson + */ +class Process +{ + /** + * Escapes a string to be used as a shell argument. + * + * From https://github.com/johnstevenson/winbox-args + * MIT Licensed (c) John Stevenson + * + * @param string $arg The argument to be escaped + * @param bool $meta Additionally escape cmd.exe meta characters + * @param bool $module The argument is the module to invoke + */ + public static function escape(string $arg, bool $meta = true, bool $module = false): string + { + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { + return "'".str_replace("'", "'\\''", $arg)."'"; + } + + $quote = strpbrk($arg, " \t") !== false || $arg === ''; + + $arg = Preg::replace('/(\\\\*)"/', '$1$1\\"', $arg, -1, $dquotes); + + if ($meta) { + $meta = $dquotes || Preg::isMatch('/%[^%]+%/', $arg); + + if (!$meta) { + $quote = $quote || strpbrk($arg, '^&|<>()') !== false; + } elseif ($module && !$dquotes && $quote) { + $meta = false; + } + } + + if ($quote) { + $arg = '"'.(Preg::replace('/(\\\\*)$/', '$1$1', $arg)).'"'; + } + + if ($meta) { + $arg = Preg::replace('/(["^&|<>()%])/', '^$1', $arg); + } + + return $arg; + } + + /** + * Escapes an array of arguments that make up a shell command + * + * @param string[] $args Argument list, with the module name first + */ + public static function escapeShellCommand(array $args): string + { + $command = ''; + $module = array_shift($args); + + if ($module !== null) { + $command = self::escape($module, true, true); + + foreach ($args as $arg) { + $command .= ' '.self::escape($arg); + } + } + + return $command; + } + + /** + * Makes putenv environment changes available in $_SERVER and $_ENV + * + * @param string $name + * @param ?string $value A null value unsets the variable + */ + public static function setEnv(string $name, ?string $value = null): bool + { + $unset = null === $value; + + if (!putenv($unset ? $name : $name.'='.$value)) { + return false; + } + + if ($unset) { + unset($_SERVER[$name]); + } else { + $_SERVER[$name] = $value; + } + + // Update $_ENV if it is being used + if (false !== stripos((string) ini_get('variables_order'), 'E')) { + if ($unset) { + unset($_ENV[$name]); + } else { + $_ENV[$name] = $value; + } + } + + return true; + } +} diff --git a/vendor/composer/xdebug-handler/src/Status.php b/vendor/composer/xdebug-handler/src/Status.php new file mode 100644 index 00000000..b434f859 --- /dev/null +++ b/vendor/composer/xdebug-handler/src/Status.php @@ -0,0 +1,203 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Composer\XdebugHandler; + +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; + +/** + * @author John Stevenson + * @internal + */ +class Status +{ + const ENV_RESTART = 'XDEBUG_HANDLER_RESTART'; + const CHECK = 'Check'; + const ERROR = 'Error'; + const INFO = 'Info'; + const NORESTART = 'NoRestart'; + const RESTART = 'Restart'; + const RESTARTING = 'Restarting'; + const RESTARTED = 'Restarted'; + + /** @var bool */ + private $debug; + + /** @var string */ + private $envAllowXdebug; + + /** @var string|null */ + private $loaded; + + /** @var LoggerInterface|null */ + private $logger; + + /** @var bool */ + private $modeOff; + + /** @var float */ + private $time; + + /** + * @param string $envAllowXdebug Prefixed _ALLOW_XDEBUG name + * @param bool $debug Whether debug output is required + */ + public function __construct(string $envAllowXdebug, bool $debug) + { + $start = getenv(self::ENV_RESTART); + Process::setEnv(self::ENV_RESTART); + $this->time = is_numeric($start) ? round((microtime(true) - $start) * 1000) : 0; + + $this->envAllowXdebug = $envAllowXdebug; + $this->debug = $debug && defined('STDERR'); + $this->modeOff = false; + } + + /** + * Activates status message output to a PSR3 logger + * + * @return void + */ + public function setLogger(LoggerInterface $logger): void + { + $this->logger = $logger; + } + + /** + * Calls a handler method to report a message + * + * @throws \InvalidArgumentException If $op is not known + */ + public function report(string $op, ?string $data): void + { + if ($this->logger !== null || $this->debug) { + $callable = [$this, 'report'.$op]; + + if (!is_callable($callable)) { + throw new \InvalidArgumentException('Unknown op handler: '.$op); + } + + $params = $data !== null ? [$data] : []; + call_user_func_array($callable, $params); + } + } + + /** + * Outputs a status message + */ + private function output(string $text, ?string $level = null): void + { + if ($this->logger !== null) { + $this->logger->log($level !== null ? $level: LogLevel::DEBUG, $text); + } + + if ($this->debug) { + fwrite(STDERR, sprintf('xdebug-handler[%d] %s', getmypid(), $text.PHP_EOL)); + } + } + + /** + * Checking status message + */ + private function reportCheck(string $loaded): void + { + list($version, $mode) = explode('|', $loaded); + + if ($version !== '') { + $this->loaded = '('.$version.')'.($mode !== '' ? ' xdebug.mode='.$mode : ''); + } + $this->modeOff = $mode === 'off'; + $this->output('Checking '.$this->envAllowXdebug); + } + + /** + * Error status message + */ + private function reportError(string $error): void + { + $this->output(sprintf('No restart (%s)', $error), LogLevel::WARNING); + } + + /** + * Info status message + */ + private function reportInfo(string $info): void + { + $this->output($info); + } + + /** + * No restart status message + */ + private function reportNoRestart(): void + { + $this->output($this->getLoadedMessage()); + + if ($this->loaded !== null) { + $text = sprintf('No restart (%s)', $this->getEnvAllow()); + if (!((bool) getenv($this->envAllowXdebug))) { + $text .= ' Allowed by '.($this->modeOff ? 'xdebug.mode' : 'application'); + } + $this->output($text); + } + } + + /** + * Restart status message + */ + private function reportRestart(): void + { + $this->output($this->getLoadedMessage()); + Process::setEnv(self::ENV_RESTART, (string) microtime(true)); + } + + /** + * Restarted status message + */ + private function reportRestarted(): void + { + $loaded = $this->getLoadedMessage(); + $text = sprintf('Restarted (%d ms). %s', $this->time, $loaded); + $level = $this->loaded !== null ? LogLevel::WARNING : null; + $this->output($text, $level); + } + + /** + * Restarting status message + */ + private function reportRestarting(string $command): void + { + $text = sprintf('Process restarting (%s)', $this->getEnvAllow()); + $this->output($text); + $text = 'Running '.$command; + $this->output($text); + } + + /** + * Returns the _ALLOW_XDEBUG environment variable as name=value + */ + private function getEnvAllow(): string + { + return $this->envAllowXdebug.'='.getenv($this->envAllowXdebug); + } + + /** + * Returns the Xdebug status and version + */ + private function getLoadedMessage(): string + { + $loaded = $this->loaded !== null ? sprintf('loaded %s', $this->loaded) : 'not loaded'; + return 'The Xdebug extension is '.$loaded; + } +} diff --git a/vendor/composer/xdebug-handler/src/XdebugHandler.php b/vendor/composer/xdebug-handler/src/XdebugHandler.php new file mode 100644 index 00000000..9052bfa4 --- /dev/null +++ b/vendor/composer/xdebug-handler/src/XdebugHandler.php @@ -0,0 +1,668 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Composer\XdebugHandler; + +use Composer\Pcre\Preg; +use Psr\Log\LoggerInterface; + +/** + * @author John Stevenson + * + * @phpstan-import-type restartData from PhpConfig + */ +class XdebugHandler +{ + const SUFFIX_ALLOW = '_ALLOW_XDEBUG'; + const SUFFIX_INIS = '_ORIGINAL_INIS'; + const RESTART_ID = 'internal'; + const RESTART_SETTINGS = 'XDEBUG_HANDLER_SETTINGS'; + const DEBUG = 'XDEBUG_HANDLER_DEBUG'; + + /** @var string|null */ + protected $tmpIni; + + /** @var bool */ + private static $inRestart; + + /** @var string */ + private static $name; + + /** @var string|null */ + private static $skipped; + + /** @var bool */ + private static $xdebugActive; + + /** @var string|null */ + private static $xdebugMode; + + /** @var string|null */ + private static $xdebugVersion; + + /** @var bool */ + private $cli; + + /** @var string|null */ + private $debug; + + /** @var string */ + private $envAllowXdebug; + + /** @var string */ + private $envOriginalInis; + + /** @var bool */ + private $persistent; + + /** @var string|null */ + private $script; + + /** @var Status */ + private $statusWriter; + + /** + * Constructor + * + * The $envPrefix is used to create distinct environment variables. It is + * uppercased and prepended to the default base values. For example 'myapp' + * would result in MYAPP_ALLOW_XDEBUG and MYAPP_ORIGINAL_INIS. + * + * @param string $envPrefix Value used in environment variables + * @throws \RuntimeException If the parameter is invalid + */ + public function __construct(string $envPrefix) + { + if ($envPrefix === '') { + throw new \RuntimeException('Invalid constructor parameter'); + } + + self::$name = strtoupper($envPrefix); + $this->envAllowXdebug = self::$name.self::SUFFIX_ALLOW; + $this->envOriginalInis = self::$name.self::SUFFIX_INIS; + + self::setXdebugDetails(); + self::$inRestart = false; + + if ($this->cli = PHP_SAPI === 'cli') { + $this->debug = (string) getenv(self::DEBUG); + } + + $this->statusWriter = new Status($this->envAllowXdebug, (bool) $this->debug); + } + + /** + * Activates status message output to a PSR3 logger + */ + public function setLogger(LoggerInterface $logger): self + { + $this->statusWriter->setLogger($logger); + return $this; + } + + /** + * Sets the main script location if it cannot be called from argv + */ + public function setMainScript(string $script): self + { + $this->script = $script; + return $this; + } + + /** + * Persist the settings to keep Xdebug out of sub-processes + */ + public function setPersistent(): self + { + $this->persistent = true; + return $this; + } + + /** + * Checks if Xdebug is loaded and the process needs to be restarted + * + * This behaviour can be disabled by setting the MYAPP_ALLOW_XDEBUG + * environment variable to 1. This variable is used internally so that + * the restarted process is created only once. + */ + public function check(): void + { + $this->notify(Status::CHECK, self::$xdebugVersion.'|'.self::$xdebugMode); + $envArgs = explode('|', (string) getenv($this->envAllowXdebug)); + + if (!((bool) $envArgs[0]) && $this->requiresRestart(self::$xdebugActive)) { + // Restart required + $this->notify(Status::RESTART); + + if ($this->prepareRestart()) { + $command = $this->getCommand(); + $this->restart($command); + } + return; + } + + if (self::RESTART_ID === $envArgs[0] && count($envArgs) === 5) { + // Restarted, so unset environment variable and use saved values + $this->notify(Status::RESTARTED); + + Process::setEnv($this->envAllowXdebug); + self::$inRestart = true; + + if (self::$xdebugVersion === null) { + // Skipped version is only set if Xdebug is not loaded + self::$skipped = $envArgs[1]; + } + + $this->tryEnableSignals(); + + // Put restart settings in the environment + $this->setEnvRestartSettings($envArgs); + return; + } + + $this->notify(Status::NORESTART); + $settings = self::getRestartSettings(); + + if ($settings !== null) { + // Called with existing settings, so sync our settings + $this->syncSettings($settings); + } + } + + /** + * Returns an array of php.ini locations with at least one entry + * + * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. + * The loaded ini location is the first entry and may be empty. + * + * @return string[] + */ + public static function getAllIniFiles(): array + { + if (self::$name !== null) { + $env = getenv(self::$name.self::SUFFIX_INIS); + + if (false !== $env) { + return explode(PATH_SEPARATOR, $env); + } + } + + $paths = [(string) php_ini_loaded_file()]; + $scanned = php_ini_scanned_files(); + + if ($scanned !== false) { + $paths = array_merge($paths, array_map('trim', explode(',', $scanned))); + } + + return $paths; + } + + /** + * Returns an array of restart settings or null + * + * Settings will be available if the current process was restarted, or + * called with the settings from an existing restart. + * + * @phpstan-return restartData|null + */ + public static function getRestartSettings(): ?array + { + $envArgs = explode('|', (string) getenv(self::RESTART_SETTINGS)); + + if (count($envArgs) !== 6 + || (!self::$inRestart && php_ini_loaded_file() !== $envArgs[0])) { + return null; + } + + return [ + 'tmpIni' => $envArgs[0], + 'scannedInis' => (bool) $envArgs[1], + 'scanDir' => '*' === $envArgs[2] ? false : $envArgs[2], + 'phprc' => '*' === $envArgs[3] ? false : $envArgs[3], + 'inis' => explode(PATH_SEPARATOR, $envArgs[4]), + 'skipped' => $envArgs[5], + ]; + } + + /** + * Returns the Xdebug version that triggered a successful restart + */ + public static function getSkippedVersion(): string + { + return (string) self::$skipped; + } + + /** + * Returns whether Xdebug is loaded and active + * + * true: if Xdebug is loaded and is running in an active mode. + * false: if Xdebug is not loaded, or it is running with xdebug.mode=off. + */ + public static function isXdebugActive(): bool + { + self::setXdebugDetails(); + return self::$xdebugActive; + } + + /** + * Allows an extending class to decide if there should be a restart + * + * The default is to restart if Xdebug is loaded and its mode is not "off". + */ + protected function requiresRestart(bool $default): bool + { + return $default; + } + + /** + * Allows an extending class to access the tmpIni + * + * @param string[] $command * + */ + protected function restart(array $command): void + { + $this->doRestart($command); + } + + /** + * Executes the restarted command then deletes the tmp ini + * + * @param string[] $command + * @phpstan-return never + */ + private function doRestart(array $command): void + { + $this->tryEnableSignals(); + $this->notify(Status::RESTARTING, implode(' ', $command)); + + if (PHP_VERSION_ID >= 70400) { + $cmd = $command; + } else { + $cmd = Process::escapeShellCommand($command); + if (defined('PHP_WINDOWS_VERSION_BUILD')) { + // Outer quotes required on cmd string below PHP 8 + $cmd = '"'.$cmd.'"'; + } + } + + $process = proc_open($cmd, [], $pipes); + if (is_resource($process)) { + $exitCode = proc_close($process); + } + + if (!isset($exitCode)) { + // Unlikely that php or the default shell cannot be invoked + $this->notify(Status::ERROR, 'Unable to restart process'); + $exitCode = -1; + } else { + $this->notify(Status::INFO, 'Restarted process exited '.$exitCode); + } + + if ($this->debug === '2') { + $this->notify(Status::INFO, 'Temp ini saved: '.$this->tmpIni); + } else { + @unlink((string) $this->tmpIni); + } + + exit($exitCode); + } + + /** + * Returns true if everything was written for the restart + * + * If any of the following fails (however unlikely) we must return false to + * stop potential recursion: + * - tmp ini file creation + * - environment variable creation + */ + private function prepareRestart(): bool + { + $error = null; + $iniFiles = self::getAllIniFiles(); + $scannedInis = count($iniFiles) > 1; + $tmpDir = sys_get_temp_dir(); + + if (!$this->cli) { + $error = 'Unsupported SAPI: '.PHP_SAPI; + } elseif (!$this->checkConfiguration($info)) { + $error = $info; + } elseif (!$this->checkMainScript()) { + $error = 'Unable to access main script: '.$this->script; + } elseif (!$this->writeTmpIni($iniFiles, $tmpDir, $error)) { + $error = $error !== null ? $error : 'Unable to create temp ini file at: '.$tmpDir; + } elseif (!$this->setEnvironment($scannedInis, $iniFiles)) { + $error = 'Unable to set environment variables'; + } + + if ($error !== null) { + $this->notify(Status::ERROR, $error); + } + + return $error === null; + } + + /** + * Returns true if the tmp ini file was written + * + * @param string[] $iniFiles All ini files used in the current process + */ + private function writeTmpIni(array $iniFiles, string $tmpDir, ?string &$error): bool + { + if (($tmpfile = @tempnam($tmpDir, '')) === false) { + return false; + } + + $this->tmpIni = $tmpfile; + + // $iniFiles has at least one item and it may be empty + if ($iniFiles[0] === '') { + array_shift($iniFiles); + } + + $content = ''; + $sectionRegex = '/^\s*\[(?:PATH|HOST)\s*=/mi'; + $xdebugRegex = '/^\s*(zend_extension\s*=.*xdebug.*)$/mi'; + + foreach ($iniFiles as $file) { + // Check for inaccessible ini files + if (($data = @file_get_contents($file)) === false) { + $error = 'Unable to read ini: '.$file; + return false; + } + // Check and remove directives after HOST and PATH sections + if (Preg::isMatchWithOffsets($sectionRegex, $data, $matches, PREG_OFFSET_CAPTURE)) { + $data = substr($data, 0, $matches[0][1]); + } + $content .= Preg::replace($xdebugRegex, ';$1', $data).PHP_EOL; + } + + // Merge loaded settings into our ini content, if it is valid + $config = parse_ini_string($content); + $loaded = ini_get_all(null, false); + + if (false === $config || false === $loaded) { + $error = 'Unable to parse ini data'; + return false; + } + + $content .= $this->mergeLoadedConfig($loaded, $config); + + // Work-around for https://bugs.php.net/bug.php?id=75932 + $content .= 'opcache.enable_cli=0'.PHP_EOL; + + return (bool) @file_put_contents($this->tmpIni, $content); + } + + /** + * Returns the command line arguments for the restart + * + * @return string[] + */ + private function getCommand(): array + { + $php = [PHP_BINARY]; + $args = array_slice($_SERVER['argv'], 1); + + if (!$this->persistent) { + // Use command-line options + array_push($php, '-n', '-c', $this->tmpIni); + } + + return array_merge($php, [$this->script], $args); + } + + /** + * Returns true if the restart environment variables were set + * + * No need to update $_SERVER since this is set in the restarted process. + * + * @param string[] $iniFiles All ini files used in the current process + */ + private function setEnvironment(bool $scannedInis, array $iniFiles): bool + { + $scanDir = getenv('PHP_INI_SCAN_DIR'); + $phprc = getenv('PHPRC'); + + // Make original inis available to restarted process + if (!putenv($this->envOriginalInis.'='.implode(PATH_SEPARATOR, $iniFiles))) { + return false; + } + + if ($this->persistent) { + // Use the environment to persist the settings + if (!putenv('PHP_INI_SCAN_DIR=') || !putenv('PHPRC='.$this->tmpIni)) { + return false; + } + } + + // Flag restarted process and save values for it to use + $envArgs = [ + self::RESTART_ID, + self::$xdebugVersion, + (int) $scannedInis, + false === $scanDir ? '*' : $scanDir, + false === $phprc ? '*' : $phprc, + ]; + + return putenv($this->envAllowXdebug.'='.implode('|', $envArgs)); + } + + /** + * Logs status messages + */ + private function notify(string $op, ?string $data = null): void + { + $this->statusWriter->report($op, $data); + } + + /** + * Returns default, changed and command-line ini settings + * + * @param mixed[] $loadedConfig All current ini settings + * @param mixed[] $iniConfig Settings from user ini files + * + */ + private function mergeLoadedConfig(array $loadedConfig, array $iniConfig): string + { + $content = ''; + + foreach ($loadedConfig as $name => $value) { + // Value will either be null, string or array (HHVM only) + if (!is_string($value) + || strpos($name, 'xdebug') === 0 + || $name === 'apc.mmap_file_mask') { + continue; + } + + if (!isset($iniConfig[$name]) || $iniConfig[$name] !== $value) { + // Double-quote escape each value + $content .= $name.'="'.addcslashes($value, '\\"').'"'.PHP_EOL; + } + } + + return $content; + } + + /** + * Returns true if the script name can be used + */ + private function checkMainScript(): bool + { + if ($this->script !== null) { + // Allow an application to set -- for standard input + return file_exists($this->script) || '--' === $this->script; + } + + if (file_exists($this->script = $_SERVER['argv'][0])) { + return true; + } + + // Use a backtrace to resolve Phar and chdir issues. + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + $main = end($trace); + + if ($main !== false && isset($main['file'])) { + return file_exists($this->script = $main['file']); + } + + return false; + } + + /** + * Adds restart settings to the environment + * + * @param string[] $envArgs + */ + private function setEnvRestartSettings(array $envArgs): void + { + $settings = [ + php_ini_loaded_file(), + $envArgs[2], + $envArgs[3], + $envArgs[4], + getenv($this->envOriginalInis), + self::$skipped, + ]; + + Process::setEnv(self::RESTART_SETTINGS, implode('|', $settings)); + } + + /** + * Syncs settings and the environment if called with existing settings + * + * @phpstan-param restartData $settings + */ + private function syncSettings(array $settings): void + { + if (false === getenv($this->envOriginalInis)) { + // Called by another app, so make original inis available + Process::setEnv($this->envOriginalInis, implode(PATH_SEPARATOR, $settings['inis'])); + } + + self::$skipped = $settings['skipped']; + $this->notify(Status::INFO, 'Process called with existing restart settings'); + } + + /** + * Returns true if there are no known configuration issues + */ + private function checkConfiguration(?string &$info): bool + { + if (!function_exists('proc_open')) { + $info = 'proc_open function is disabled'; + return false; + } + + if (extension_loaded('uopz') && !((bool) ini_get('uopz.disable'))) { + // uopz works at opcode level and disables exit calls + if (function_exists('uopz_allow_exit')) { + @uopz_allow_exit(true); + } else { + $info = 'uopz extension is not compatible'; + return false; + } + } + + // Check UNC paths when using cmd.exe + if (defined('PHP_WINDOWS_VERSION_BUILD') && PHP_VERSION_ID < 70400) { + $workingDir = getcwd(); + + if ($workingDir === false) { + $info = 'unable to determine working directory'; + return false; + } + + if (0 === strpos($workingDir, '\\\\')) { + $info = 'cmd.exe does not support UNC paths: '.$workingDir; + return false; + } + } + + return true; + } + + /** + * Enables async signals and control interrupts in the restarted process + * + * Available on Unix PHP 7.1+ with the pcntl extension and Windows PHP 7.4+. + */ + private function tryEnableSignals(): void + { + if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { + pcntl_async_signals(true); + $message = 'Async signals enabled'; + + if (!self::$inRestart) { + // Restarting, so ignore SIGINT in parent + pcntl_signal(SIGINT, SIG_IGN); + } elseif (is_int(pcntl_signal_get_handler(SIGINT))) { + // Restarted, no handler set so force default action + pcntl_signal(SIGINT, SIG_DFL); + } + } + + if (!self::$inRestart && function_exists('sapi_windows_set_ctrl_handler')) { + // Restarting, so set a handler to ignore CTRL events in the parent. + // This ensures that CTRL+C events will be available in the child + // process without having to enable them there, which is unreliable. + sapi_windows_set_ctrl_handler(function ($evt) {}); + } + } + + /** + * Sets static properties $xdebugActive, $xdebugVersion and $xdebugMode + */ + private static function setXdebugDetails(): void + { + if (self::$xdebugActive !== null) { + return; + } + + self::$xdebugActive = false; + if (!extension_loaded('xdebug')) { + return; + } + + $version = phpversion('xdebug'); + self::$xdebugVersion = $version !== false ? $version : 'unknown'; + + if (version_compare(self::$xdebugVersion, '3.1', '>=')) { + $modes = xdebug_info('mode'); + self::$xdebugMode = count($modes) === 0 ? 'off' : implode(',', $modes); + self::$xdebugActive = self::$xdebugMode !== 'off'; + return; + } + + // See if xdebug.mode is supported in this version + $iniMode = ini_get('xdebug.mode'); + if ($iniMode === false) { + self::$xdebugActive = true; + return; + } + + // Environment value wins but cannot be empty + $envMode = (string) getenv('XDEBUG_MODE'); + if ($envMode !== '') { + self::$xdebugMode = $envMode; + } else { + self::$xdebugMode = $iniMode !== '' ? $iniMode : 'off'; + } + + // An empty comma-separated list is treated as mode 'off' + if (Preg::isMatch('/^,+$/', str_replace(' ', '', self::$xdebugMode))) { + self::$xdebugMode = 'off'; + } + + self::$xdebugActive = self::$xdebugMode !== 'off'; + } +} diff --git a/vendor/dnoegel/php-xdg-base-dir/LICENSE b/vendor/dnoegel/php-xdg-base-dir/LICENSE new file mode 100644 index 00000000..029a00ab --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 Daniel Nögel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/dnoegel/php-xdg-base-dir/README.md b/vendor/dnoegel/php-xdg-base-dir/README.md new file mode 100644 index 00000000..ee06b2d6 --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/README.md @@ -0,0 +1,41 @@ +# XDG Base Directory + +[![Latest Stable Version](https://img.shields.io/packagist/v/dnoegel/php-xdg-base-dir.svg?style=flat-square)](https://packagist.org/packages/dnoegel/php-xdg-base-dir) +[![Total Downloads](https://img.shields.io/packagist/dt/dnoegel/php-xdg-base-dir.svg?style=flat-square)](https://packagist.org/packages/dnoegel/php-xdg-base-dir) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md) +[![Build Status](https://img.shields.io/travis/dnoegel/php-xdg-base-dir/master.svg?style=flat-square)](https://travis-ci.org/dnoegel/php-xdg-base-dir) + +Implementation of XDG Base Directory specification for php + +## Install + +Via Composer + +``` bash +$ composer require dnoegel/php-xdg-base-dir +``` + +## Usage + +``` php +$xdg = new \XdgBaseDir\Xdg(); + +echo $xdg->getHomeDir(); +echo $xdg->getHomeConfigDir(); +echo $xdg->getHomeDataDir(); +echo $xdg->getHomeCacheDir(); +echo $xdg->getRuntimeDir(); + +print_r($xdg->getDataDirs()); // returns array +print_r($xdg->getConfigDirs()); // returns array +``` + +## Testing + +``` bash +$ phpunit +``` + +## License + +The MIT License (MIT). Please see [License File](https://github.com/dnoegel/php-xdg-base-dir/blob/master/LICENSE) for more information. diff --git a/vendor/dnoegel/php-xdg-base-dir/composer.json b/vendor/dnoegel/php-xdg-base-dir/composer.json new file mode 100644 index 00000000..94c46374 --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/composer.json @@ -0,0 +1,17 @@ +{ + "name": "dnoegel/php-xdg-base-dir", + "description": "implementation of xdg base directory specification for php", + "type": "library", + "license": "MIT", + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + } +} diff --git a/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php b/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php new file mode 100644 index 00000000..2dd314d0 --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php @@ -0,0 +1,132 @@ +getHomeDir(); + + $path = DIRECTORY_SEPARATOR === $homeDir ? $homeDir.'.config' : $homeDir . DIRECTORY_SEPARATOR . '.config'; + + return $path; + } + + /** + * @return string + */ + public function getHomeDataDir() + { + $path = getenv('XDG_DATA_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.local' . DIRECTORY_SEPARATOR . 'share'; + + return $path; + } + + /** + * @return array + */ + public function getConfigDirs() + { + $configDirs = getenv('XDG_CONFIG_DIRS') ? explode(':', getenv('XDG_CONFIG_DIRS')) : array('/etc/xdg'); + + $paths = array_merge(array($this->getHomeConfigDir()), $configDirs); + + return $paths; + } + + /** + * @return array + */ + public function getDataDirs() + { + $dataDirs = getenv('XDG_DATA_DIRS') ? explode(':', getenv('XDG_DATA_DIRS')) : array('/usr/local/share', '/usr/share'); + + $paths = array_merge(array($this->getHomeDataDir()), $dataDirs); + + return $paths; + } + + /** + * @return string + */ + public function getHomeCacheDir() + { + $path = getenv('XDG_CACHE_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.cache'; + + return $path; + + } + + public function getRuntimeDir($strict=true) + { + if ($runtimeDir = getenv('XDG_RUNTIME_DIR')) { + return $runtimeDir; + } + + if ($strict) { + throw new \RuntimeException('XDG_RUNTIME_DIR was not set'); + } + + $fallback = sys_get_temp_dir() . DIRECTORY_SEPARATOR . self::RUNTIME_DIR_FALLBACK . getenv('USER'); + + $create = false; + + if (!is_dir($fallback)) { + mkdir($fallback, 0700, true); + } + + $st = lstat($fallback); + + # The fallback must be a directory + if (!$st['mode'] & self::S_IFDIR) { + rmdir($fallback); + $create = true; + } elseif ($st['uid'] != $this->getUid() || + $st['mode'] & (self::S_IRWXG | self::S_IRWXO) + ) { + rmdir($fallback); + $create = true; + } + + if ($create) { + mkdir($fallback, 0700, true); + } + + return $fallback; + } + + private function getUid() + { + if (function_exists('posix_getuid')) { + return posix_getuid(); + } + + return getmyuid(); + } +} diff --git a/vendor/felixfbecker/advanced-json-rpc/.github/workflows/build.yml b/vendor/felixfbecker/advanced-json-rpc/.github/workflows/build.yml new file mode 100644 index 00000000..4b0bd562 --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/.github/workflows/build.yml @@ -0,0 +1,63 @@ +name: build + +on: [push, pull_request] + +env: + FORCE_COLOR: 1 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +jobs: + test: + strategy: + matrix: + php: + - 7.1 + - 7.2 + - 7.3 + - 7.4 + - 8.0 + deps: + - lowest + - highest + include: + - php: 8.1 + deps: highest + composer-options: --ignore-platform-reqs + exclude: + # that config currently breaks as older PHPUnit cannot generate coverage on PHP 8 + - php: 8 + deps: lowest + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + + - uses: ramsey/composer-install@v1 + with: + dependency-versions: ${{ matrix.deps }} + composer-options: ${{ matrix.composer-options }} + + - run: vendor/bin/phpunit --coverage-clover=coverage.xml --whitelist lib --bootstrap vendor/autoload.php tests + + - uses: codecov/codecov-action@v1 + + release: + needs: test + if: github.repository_owner == 'felixfbecker' && github.event_name == 'push' && github.ref == 'refs/heads/master' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup Node.js + uses: actions/setup-node@v2 + + - name: Install npm dependencies + run: npm ci + + - name: Release + run: npm run semantic-release diff --git a/vendor/felixfbecker/advanced-json-rpc/LICENSE b/vendor/felixfbecker/advanced-json-rpc/LICENSE new file mode 100644 index 00000000..fc354170 --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2016, Felix Frederick Becker + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/felixfbecker/advanced-json-rpc/composer.json b/vendor/felixfbecker/advanced-json-rpc/composer.json new file mode 100644 index 00000000..c4d5739e --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/composer.json @@ -0,0 +1,32 @@ +{ + "name": "felixfbecker/advanced-json-rpc", + "description": "A more advanced JSONRPC implementation", + "type": "library", + "license": "ISC", + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "autoload-dev": { + "psr-4": { + "AdvancedJsonRpc\\Tests\\": "tests/" + } + }, + "require": { + "php": "^7.1 || ^8.0", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php b/vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php new file mode 100644 index 00000000..5f045df6 --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php @@ -0,0 +1,171 @@ + ReflectionMethod[] + * + * @var ReflectionMethod + */ + private $methods; + + /** + * @var \phpDocumentor\Reflection\DocBlockFactory + */ + private $docBlockFactory; + + /** + * @var \phpDocumentor\Reflection\Types\ContextFactory + */ + private $contextFactory; + + /** + * @param object $target The target object that should receive the method calls + * @param string $delimiter A delimiter for method calls on properties, for example someProperty->someMethod + */ + public function __construct($target, $delimiter = '->') + { + $this->target = $target; + $this->delimiter = $delimiter; + $this->docBlockFactory = DocBlockFactory::createInstance(); + $this->contextFactory = new Types\ContextFactory(); + $this->mapper = new JsonMapper(); + } + + /** + * Calls the appropriate method handler for an incoming Message + * + * @param string|object $msg The incoming message + * @return mixed + */ + public function dispatch($msg) + { + if (is_string($msg)) { + $msg = json_decode($msg); + if (json_last_error() !== JSON_ERROR_NONE) { + throw new Error(json_last_error_msg(), ErrorCode::PARSE_ERROR); + } + } + // Find out the object and function that should be called + $obj = $this->target; + $parts = explode($this->delimiter, $msg->method); + // The function to call is always the last part of the method + $fn = array_pop($parts); + // For namespaced methods like textDocument/didOpen, call the didOpen method on the $textDocument property + // For simple methods like initialize, shutdown, exit, this loop will simply not be entered and $obj will be + // the target + foreach ($parts as $part) { + if (!isset($obj->$part)) { + throw new Error("Method {$msg->method} is not implemented", ErrorCode::METHOD_NOT_FOUND); + } + $obj = $obj->$part; + } + if (!isset($this->methods[$msg->method])) { + try { + $method = new ReflectionMethod($obj, $fn); + $this->methods[$msg->method] = $method; + } catch (ReflectionException $e) { + throw new Error($e->getMessage(), ErrorCode::METHOD_NOT_FOUND, null, $e); + } + } + $method = $this->methods[$msg->method]; + $parameters = $method->getParameters(); + if ($method->getDocComment()) { + $docBlock = $this->docBlockFactory->create( + $method->getDocComment(), + $this->contextFactory->createFromReflector($method->getDeclaringClass()) + ); + $paramTags = $docBlock->getTagsByName('param'); + } + $args = []; + if (isset($msg->params)) { + // Find out the position + if (is_array($msg->params)) { + $args = $msg->params; + } else if (is_object($msg->params)) { + foreach ($parameters as $pos => $parameter) { + $value = null; + foreach(get_object_vars($msg->params) as $key => $val) { + if ($parameter->name === $key) { + $value = $val; + break; + } + } + $args[$pos] = $value; + } + } else { + throw new Error('Params must be structured or omitted', ErrorCode::INVALID_REQUEST); + } + foreach ($args as $position => $value) { + try { + // If the type is structured (array or object), map it with JsonMapper + if (is_object($value)) { + // Does the parameter have a type hint? + $param = $parameters[$position]; + if ($param->hasType()) { + $paramType = $param->getType(); + if ($paramType instanceof ReflectionNamedType) { + // We have object data to map and want the class name. + // This should not include the `?` if the type was nullable. + $class = $paramType->getName(); + } else { + // Fallback for php 7.0, which is still supported (and doesn't have nullable). + $class = (string)$paramType; + } + $value = $this->mapper->map($value, new $class()); + } + } else if (is_array($value) && isset($docBlock)) { + // Get the array type from the DocBlock + $type = $paramTags[$position]->getType(); + // For union types, use the first one that is a class array (often it is SomeClass[]|null) + if ($type instanceof Types\Compound) { + for ($i = 0; $t = $type->get($i); $i++) { + if ( + $t instanceof Types\Array_ + && $t->getValueType() instanceof Types\Object_ + && (string)$t->getValueType() !== 'object' + ) { + $class = (string)$t->getValueType()->getFqsen(); + $value = $this->mapper->mapArray($value, [], $class); + break; + } + } + } else if ($type instanceof Types\Array_) { + $class = (string)$type->getValueType()->getFqsen(); + $value = $this->mapper->mapArray($value, [], $class); + } else { + throw new Error('Type is not matching @param tag', ErrorCode::INVALID_PARAMS); + } + } + } catch (JsonMapper_Exception $e) { + throw new Error($e->getMessage(), ErrorCode::INVALID_PARAMS, null, $e); + } + $args[$position] = $value; + } + } + ksort($args); + $result = $obj->$fn(...$args); + return $result; + } +} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Error.php b/vendor/felixfbecker/advanced-json-rpc/lib/Error.php new file mode 100644 index 00000000..b2801918 --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/lib/Error.php @@ -0,0 +1,38 @@ +data = $data; + } +} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php b/vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php new file mode 100644 index 00000000..f0ef4792 --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php @@ -0,0 +1,48 @@ +id) && isset($msg->error); + } + + /** + * @param int|string $id + * @param \AdvancedJsonRpc\Error $error + */ + public function __construct($id, Error $error) + { + parent::__construct($id); + $this->error = $error; + } +} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Message.php b/vendor/felixfbecker/advanced-json-rpc/lib/Message.php new file mode 100644 index 00000000..e2231dc5 --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/lib/Message.php @@ -0,0 +1,52 @@ +method, $decoded->params ?? null); + } else if (Request::isRequest($decoded)) { + $obj = new Request($decoded->id, $decoded->method, $decoded->params ?? null); + } else if (SuccessResponse::isSuccessResponse($decoded)) { + $obj = new SuccessResponse($decoded->id, $decoded->result); + } else if (ErrorResponse::isErrorResponse($decoded)) { + $obj = new ErrorResponse($decoded->id, new Error($decoded->error->message, $decoded->error->code, $decoded->error->data ?? null)); + } else { + throw new Error('Invalid message', ErrorCode::INVALID_REQUEST); + } + return $obj; + } + + public function __toString(): string + { + $encoded = json_encode($this); + if ($encoded === false) { + throw new Error(json_last_error_msg(), ErrorCode::INTERNAL_ERROR); + } + return $encoded; + } +} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Notification.php b/vendor/felixfbecker/advanced-json-rpc/lib/Notification.php new file mode 100644 index 00000000..3440164d --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/lib/Notification.php @@ -0,0 +1,56 @@ +method); + } + + /** + * @param string $method + * @param mixed $params + */ + public function __construct(string $method, $params = null) + { + $this->method = $method; + $this->params = $params; + } +} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Request.php b/vendor/felixfbecker/advanced-json-rpc/lib/Request.php new file mode 100644 index 00000000..14290082 --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/lib/Request.php @@ -0,0 +1,63 @@ +method); + } + + /** + * @param string|int $id + * @param string $method + * @param object|array $params + */ + public function __construct($id, string $method, $params = null) + { + $this->id = $id; + $this->method = $method; + $this->params = $params; + } +} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Response.php b/vendor/felixfbecker/advanced-json-rpc/lib/Response.php new file mode 100644 index 00000000..a871eeac --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/lib/Response.php @@ -0,0 +1,40 @@ +error)); + } + + /** + * @param int|string $id + * @param mixed $result + * @param ResponseError $error + */ + public function __construct($id) + { + $this->id = $id; + } +} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php b/vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php new file mode 100644 index 00000000..222fd46e --- /dev/null +++ b/vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php @@ -0,0 +1,40 @@ +result = $result; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/.editorconfig b/vendor/felixfbecker/language-server-protocol/.editorconfig new file mode 100644 index 00000000..b5f0c5df --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/.editorconfig @@ -0,0 +1,17 @@ + +[*] +insert_final_newline = true +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 + +[*.{json,yml}] +indent_size = 2 + +[composer.json] +indent_size = 4 + +[*.md] +trim_trailing_whitespace = false diff --git a/vendor/felixfbecker/language-server-protocol/.github/workflows/build.yml b/vendor/felixfbecker/language-server-protocol/.github/workflows/build.yml new file mode 100644 index 00000000..5a9a2a4d --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/.github/workflows/build.yml @@ -0,0 +1,67 @@ +name: build + +on: [push, pull_request] + +env: + FORCE_COLOR: 3 + +jobs: + test: + if: github.event_name == 'pull_request' || github.ref == 'refs/heads/master' + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + - php: '7.4' + os: ubuntu-18.04 + - php: '8.0' + os: ubuntu-18.04 + - php: '8.1' + os: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: '14.15.3' # renovate:keep-up-to-date + - name: Install npm dependencies + run: npm ci + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: ${{ matrix.xdebug }}, ast + tools: composer + - name: Composer Install + run: COMPOSER_ROOT_VERSION=dev-master composer install --prefer-dist --no-interaction + - name: phpcs + run: ./vendor/bin/phpcs -n + - name: phpstan + run: ./vendor/bin/phpstan + - name: psalm + run: ./vendor/bin/psalm +# - name: phan +# run: ./vendor/bin/phan +# - name: phpunit +# run: vendor/bin/phpunit --coverage-clover=coverage.xml --colors=always +# - name: Upload coverage to Codecov +# uses: codecov/codecov-action@v2 +# release: +# runs-on: ubuntu-18.04 +# needs: test +# if: github.repository_owner == 'xdebug' && github.event_name == 'push' && github.ref == 'refs/heads/main' +# steps: +# - uses: actions/checkout@v2 +# - name: Setup Node.js +# uses: actions/setup-node@v2 +# with: +# node-version: '14.15.3' # renovate:keep-up-to-date +# - name: Install npm dependencies +# run: npm ci +# - name: Build VS Code extension +# run: npm run build +# - name: Release +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# VSCE_TOKEN: ${{ secrets.VSCE_TOKEN }} +# run: npm run semantic-release diff --git a/vendor/felixfbecker/language-server-protocol/LICENSE b/vendor/felixfbecker/language-server-protocol/LICENSE new file mode 100644 index 00000000..fc354170 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2016, Felix Frederick Becker + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/felixfbecker/language-server-protocol/README.md b/vendor/felixfbecker/language-server-protocol/README.md new file mode 100644 index 00000000..1e169d1e --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/README.md @@ -0,0 +1,19 @@ +# Language Server Protocol for PHP + +[![packagist](https://img.shields.io/packagist/v/felixfbecker/language-server-protocol.svg)](https://packagist.org/packages/felixfbecker/language-server-protocol) +[![build](https://travis-ci.org/felixfbecker/php-language-server-protocol.svg?branch=master)](https://travis-ci.org/felixfbecker/php-language-server-protocol) +[![php](https://img.shields.io/badge/php-%3E%3D%207.0-8892BF.svg)](https://php.net/) +[![license](https://img.shields.io/packagist/l/felixfbecker/language-server-protocol.svg)](https://github.com/felixfbecker/php-language-server-protocol/blob/master/LICENSE) + +Protocol classes for the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) in PHP + +## Installation + +``` +composer require felixfbecker/language-server-protocol +``` + +## Releases + +Releases are done automatically in CI by analyzing commit messages. +Make sure to follow the [Conventional Commits Convention](https://www.conventionalcommits.org/en/v1.0.0-beta.2/). diff --git a/vendor/felixfbecker/language-server-protocol/composer.json b/vendor/felixfbecker/language-server-protocol/composer.json new file mode 100644 index 00000000..4d653b4a --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/composer.json @@ -0,0 +1,44 @@ +{ + "name": "felixfbecker/language-server-protocol", + "description": "PHP classes for the Language Server Protocol", + "license": "ISC", + "keywords": [ + "php", + "language", + "server", + "microsoft" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "minimum-stability": "dev", + "prefer-stable": true, + "scripts": + { + "phpstan": "phpstan analyse -c phpstan.neon --ansi --level=7 -vvv src", + "psalm": "psalm", + "phpcs": "phpcs", + "phpcbf": "phpcbf" + } +} diff --git a/vendor/felixfbecker/language-server-protocol/package-lock.json b/vendor/felixfbecker/language-server-protocol/package-lock.json new file mode 100644 index 00000000..7fcdd3b4 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/package-lock.json @@ -0,0 +1,6489 @@ +{ + "name": "php-language-server-protocol", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz", + "integrity": "sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw==", + "dev": true + }, + "@octokit/rest": { + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-15.12.0.tgz", + "integrity": "sha512-5wRag4kHRkp0JDo++L9x9FkDlHEALbLnbSede16D8u+a2/t+gX32uhDs8cukVLyyrZR79nmh1lNpxZmffwoNoQ==", + "dev": true, + "requires": { + "before-after-hook": "^1.1.0", + "btoa-lite": "^1.0.0", + "debug": "^3.1.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.0", + "lodash": "^4.17.4", + "node-fetch": "^2.1.1", + "universal-user-agent": "^2.0.0", + "url-template": "^2.0.8" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@semantic-release/commit-analyzer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-6.0.1.tgz", + "integrity": "sha512-ENCRn1tm1D08CCBnIPsID8GjboWT6E97s0Lk3XrpAh+IMx615uAU1X2FoXyOGGc6zmqp9Ff4s8KECd/GjMcodQ==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.0", + "debug": "^4.0.0", + "import-from": "^2.1.0", + "lodash": "^4.17.4" + } + }, + "@semantic-release/error": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", + "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", + "dev": true + }, + "@semantic-release/github": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-5.0.5.tgz", + "integrity": "sha512-Hdt6b8ST2pg6pl151PlcsnTcdsC2UJhA5FdbmunbZG/TVmlnKCZ4WUzpji7YqJtDLjbQTuFm/vhM6atW3XjMWg==", + "dev": true, + "requires": { + "@octokit/rest": "^15.2.0", + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^1.0.0", + "bottleneck": "^2.0.1", + "debug": "^4.0.0", + "dir-glob": "^2.0.0", + "fs-extra": "^7.0.0", + "globby": "^8.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "issue-parser": "^3.0.0", + "lodash": "^4.17.4", + "mime": "^2.0.3", + "p-filter": "^1.0.0", + "p-retry": "^2.0.0", + "parse-github-url": "^1.0.1", + "url-join": "^4.0.0" + } + }, + "@semantic-release/npm": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-5.0.4.tgz", + "integrity": "sha512-ExGXP9GnM2hqUIgTnp6sXKB1G0Yh+fuLftmIopq5KHBWj34Wd2YbM/3iLkXXnAP1YZ9YCp7hsAdsR014ctbwHg==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^1.0.0", + "detect-indent": "^5.0.0", + "detect-newline": "^2.1.0", + "execa": "^1.0.0", + "fs-extra": "^7.0.0", + "lodash": "^4.17.4", + "nerf-dart": "^1.0.0", + "normalize-url": "^3.0.0", + "npm": "^6.3.0", + "parse-json": "^4.0.0", + "rc": "^1.2.8", + "read-pkg": "^4.0.0", + "registry-auth-token": "^3.3.1" + }, + "dependencies": { + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + } + } + }, + "@semantic-release/release-notes-generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-7.0.2.tgz", + "integrity": "sha512-fomHrGq/gfZIAQYZk0MLRwfQ8d+DbTcI3kuO1hU2L0fDJYKHZHuPmKnsfVa5KoNdVVPHx878D/ojgyStRqhc9g==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^4.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.0", + "debug": "^4.0.0", + "get-stream": "^4.0.0", + "git-url-parse": "^10.0.1", + "import-from": "^2.1.0", + "into-stream": "^3.1.0", + "lodash": "^4.17.4" + } + }, + "JSONStream": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", + "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "aggregate-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz", + "integrity": "sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w=", + "dev": true, + "requires": { + "clean-stack": "^1.0.0", + "indent-string": "^3.0.0" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "before-after-hook": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.1.0.tgz", + "integrity": "sha512-VOMDtYPwLbIncTxNoSzRyvaMxtXmLWLUqr8k5AfC1BzLk34HvBXaQX8snOwQZ4c0aX8aSERqtJSiI9/m2u5kuA==", + "dev": true + }, + "bottleneck": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.11.0.tgz", + "integrity": "sha512-DvKiYR1kG1qRVoLBUtPlmJffktoBZIz3qtdUbINlwzQXDhlhZdF8gWesPjwp05xqr5QZ7wXA2k1w78/COCweTg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "dev": true, + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "conventional-changelog-angular": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.1.tgz", + "integrity": "sha512-q4ylJ68fWZDdrFC9z4zKcf97HW6hp7Mo2YlqD4owfXhecFKy/PJCU/1oVFF4TqochchChqmZ0Vb0e0g8/MKNlA==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-writer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.0.tgz", + "integrity": "sha512-hMZPe0AQ6Bi05epeK/7hz80xxk59nPA5z/b63TOHq2wigM0/akreOc8N4Jam5b9nFgKWX1e9PdPv2ewgW6bcfg==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^2.0.0", + "dateformat": "^3.0.0", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "semver": "^5.5.0", + "split": "^1.0.0", + "through2": "^2.0.0" + } + }, + "conventional-commits-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.0.tgz", + "integrity": "sha512-Cfl0j1/NquB/TMVx7Wrmyq7uRM+/rPQbtVVGwzfkhZ6/yH6fcMmP0Q/9044TBZPTNdGzm46vXFXL14wbET0/Mg==", + "dev": true, + "requires": { + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.0.tgz", + "integrity": "sha512-GWh71U26BLWgMykCp+VghZ4s64wVbtseECcKQ/PvcPZR2cUnz+FUc2J9KjxNl7/ZbCxST8R03c9fc+Vi0umS9Q==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.0", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", + "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.0.1.tgz", + "integrity": "sha512-K23FHJ/Mt404FSlp6gSZCevIbTMLX0j3fmHhUEhQ3Wq0FMODW3+cUSoLdy1Gx4polAf4t/lphhmHH35BB8cLYw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "env-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.0.0.tgz", + "integrity": "sha512-3Xt4Cfjdy9MTTrg/eWTnJNQIrtU1DDV0KyuWOGlrR2oa9dOdzoOMbQBFbfrTiv+GypdiWWIw5HdmtakZO+rzWA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "java-properties": "^0.2.9" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", + "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.0.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.10" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "find-versions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-2.0.0.tgz", + "integrity": "sha1-KtkNSQ9oKMGqQCks9wmsMxghDDw=", + "dev": true, + "requires": { + "array-uniq": "^1.0.0", + "semver-regex": "^1.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.0.0.tgz", + "integrity": "sha512-FneLKMENeOR7wOK0/ZXCh+lwqtnPwkeunJjRN28LPqzGvNAhYvrTAhXv6xDm4vsJ0M7lcRbIYHQudKsSy2RtSQ==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", + "dev": true, + "requires": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + }, + "dependencies": { + "split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", + "dev": true, + "requires": { + "through2": "~2.0.0" + } + } + } + }, + "git-up": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-2.0.10.tgz", + "integrity": "sha512-2v4UN3qV2RGypD9QpmUjpk+4+RlYpW8GFuiZqQnKmvei08HsFPd0RfbDvEhnE4wBvnYs8ORVtYpOFuuCEmBVBw==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "parse-url": "^1.3.0" + } + }, + "git-url-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-10.0.1.tgz", + "integrity": "sha512-Tq2u8UPXc/FawC/dO8bvh8jcck0Lkor5OhuZvmVSeyJGRucDBfw9y2zy/GNCx28lMYh1N12IzPwDexjUNFyAeg==", + "dev": true, + "requires": { + "git-up": "^2.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hook-std": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-1.1.0.tgz", + "integrity": "sha512-aIyBZbZl3NS8XoSwIDQ+ZaiBuPOhhPWoBFA3QX0Q8hOMO8Tx4xGRTDnn/nl/LAtZWdieXzFC9ohAtTSnWrlHCQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-ssh": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.0.tgz", + "integrity": "sha1-6+oRaaJhTaOSpjdANmw84EnY3/Y=", + "dev": true, + "requires": { + "protocols": "^1.1.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "issue-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-3.0.0.tgz", + "integrity": "sha512-VWIhBdy0eOhlvpxOOMecBCHMpjx7lWVZcYpSzjD4dSdxptzI9TBR/cQEh057HL8+7jQKTLs+uCtezY/9VoveCA==", + "dev": true, + "requires": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + } + }, + "java-properties": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-0.2.10.tgz", + "integrity": "sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w==", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + } + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", + "dev": true + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "macos-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", + "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", + "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.0.tgz", + "integrity": "sha512-UhjmkCWKu1SS/BIePL2a59BMJ7V42EYtTfksodPRXzPEGEph3Inp5dylseqt+KbU9Jglsx8xcMKmlumfJMBXAA==", + "dev": true + }, + "marked-terminal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.1.1.tgz", + "integrity": "sha512-7UBFww1rdx0w9HehLMCVYa8/AxXaiDigDfMsJcj82/wgLQG9cj+oiMAVlJpeWD57VFJY2OYY+bKeEVIjIlxi+w==", + "dev": true, + "requires": { + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "cli-table": "^0.3.1", + "lodash.assign": "^4.2.0", + "node-emoji": "^1.4.1" + } + }, + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + } + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + }, + "dependencies": { + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + } + } + }, + "merge2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", + "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-emoji": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", + "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-fetch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.0.tgz", + "integrity": "sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA==", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.4.1.tgz", + "integrity": "sha512-mXJL1NTVU136PtuopXCUQaNWuHlXCTp4McwlSW8S9/Aj8OEPAlSBgo8og7kJ01MjCDrkmqFQTvN5tTEhBMhXQg==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "~1.2.0", + "archy": "~1.0.0", + "bin-links": "^1.1.2", + "bluebird": "~3.5.1", + "byte-size": "^4.0.3", + "cacache": "^11.2.0", + "call-limit": "~1.1.0", + "chownr": "~1.0.1", + "ci-info": "^1.4.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.5.0", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "~1.1.11", + "debuglog": "*", + "detect-indent": "~5.0.0", + "detect-newline": "^2.1.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "figgy-pudding": "^3.4.1", + "find-npm-prefix": "^1.0.2", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "gentle-fs": "^2.0.1", + "glob": "~7.1.2", + "graceful-fs": "~4.1.11", + "has-unicode": "~2.0.1", + "hosted-git-info": "^2.7.1", + "iferr": "^1.0.2", + "imurmurhash": "*", + "inflight": "~1.0.6", + "inherits": "~2.0.3", + "ini": "^1.3.5", + "init-package-json": "^1.10.3", + "is-cidr": "^2.0.6", + "json-parse-better-errors": "^1.0.2", + "lazy-property": "~1.0.0", + "libcipm": "^2.0.2", + "libnpmhook": "^4.0.1", + "libnpx": "^10.2.0", + "lock-verify": "^2.0.2", + "lockfile": "^1.0.4", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "^4.1.3", + "meant": "~1.0.1", + "mississippi": "^3.0.0", + "mkdirp": "~0.5.1", + "move-concurrently": "^1.0.1", + "node-gyp": "^3.8.0", + "nopt": "~4.0.1", + "normalize-package-data": "~2.4.0", + "npm-audit-report": "^1.3.1", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~3.0.0", + "npm-lifecycle": "^2.1.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.11", + "npm-pick-manifest": "^2.1.0", + "npm-profile": "^3.0.2", + "npm-registry-client": "^8.6.0", + "npm-registry-fetch": "^1.1.0", + "npm-user-validate": "~1.0.0", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "^1.5.0", + "osenv": "^0.1.5", + "pacote": "^8.1.6", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "qrcode-terminal": "^0.12.0", + "query-string": "^6.1.0", + "qw": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "~1.0.1", + "read-installed": "~4.0.3", + "read-package-json": "^2.0.13", + "read-package-tree": "^5.2.1", + "readable-stream": "^2.3.6", + "readdir-scoped-modules": "*", + "request": "^2.88.0", + "retry": "^0.12.0", + "rimraf": "~2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.5.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "^6.0.0", + "stringify-package": "^1.0.0", + "tar": "^4.4.6", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "unique-filename": "~1.1.0", + "unpipe": "~1.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.2", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^1.3.1", + "worker-farm": "^1.6.0", + "write-file-atomic": "^2.3.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "agent-base": { + "version": "4.2.0", + "bundled": true, + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.4.1", + "bundled": true, + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "5.5.2", + "bundled": true, + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-align": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asap": { + "version": "2.0.6", + "bundled": true, + "dev": true + }, + "asn1": { + "version": "0.2.4", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.8.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bin-links": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "cmd-shim": "^2.0.2", + "gentle-fs": "^2.0.0", + "graceful-fs": "^4.1.11", + "write-file-atomic": "^2.3.0" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.1", + "bundled": true, + "dev": true + }, + "boxen": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "builtins": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "byline": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "byte-size": { + "version": "4.0.3", + "bundled": true, + "dev": true + }, + "cacache": { + "version": "11.2.0", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "figgy-pudding": "^3.1.0", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.0", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "call-limit": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "chalk": { + "version": "2.4.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "ci-info": { + "version": "1.4.0", + "bundled": true, + "dev": true + }, + "cidr-regex": { + "version": "2.0.9", + "bundled": true, + "dev": true, + "requires": { + "ip-regex": "^2.1.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "cli-columns": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "cli-table3": { + "version": "0.5.0", + "bundled": true, + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "cmd-shim": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "colors": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "dev": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "bundled": true, + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "bundled": true, + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "bundled": true, + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "duplexify": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editor": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "encoding": { + "version": "0.1.12", + "bundled": true, + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "err-code": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "errno": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es6-promise": { + "version": "4.2.4", + "bundled": true, + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "figgy-pudding": { + "version": "3.4.1", + "bundled": true, + "dev": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "genfun": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "gentle-fs": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.2", + "fs-vacuum": "^1.2.10", + "graceful-fs": "^4.1.11", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "path-is-inside": "^1.0.2", + "read-cmd-shim": "^1.0.1", + "slide": "^1.1.6" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-dirs": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "bundled": true, + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "bundled": true, + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true, + "dev": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "iferr": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-lazy": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "init-package-json": { + "version": "1.10.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "ip": { + "version": "1.1.5", + "bundled": true, + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-ci": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "ci-info": "^1.0.0" + } + }, + "is-cidr": { + "version": "2.0.6", + "bundled": true, + "dev": true, + "requires": { + "cidr-regex": "^2.0.8" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-redirect": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "bundled": true, + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "latest-version": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-property": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "libcipm": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "graceful-fs": "^4.1.11", + "lock-verify": "^2.0.2", + "mkdirp": "^0.5.1", + "npm-lifecycle": "^2.0.3", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "pacote": "^8.1.6", + "protoduck": "^5.0.0", + "read-package-json": "^2.0.13", + "rimraf": "^2.6.2", + "worker-farm": "^1.6.0" + } + }, + "libnpmhook": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.1.0", + "npm-registry-fetch": "^3.0.0" + }, + "dependencies": { + "npm-registry-fetch": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "figgy-pudding": "^3.1.0", + "lru-cache": "^4.1.2", + "make-fetch-happen": "^4.0.0", + "npm-package-arg": "^6.0.0" + } + } + } + }, + "libnpx": { + "version": "10.2.0", + "bundled": true, + "dev": true, + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^11.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lock-verify": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "npm-package-arg": "^5.1.2 || 6", + "semver": "^5.4.1" + } + }, + "lockfile": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "signal-exit": "^3.0.2" + } + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "requires": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash._createset": { + "version": "4.0.3", + "bundled": true, + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true, + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true, + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true, + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-fetch-happen": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "meant": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "mime-db": { + "version": "1.35.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mississippi": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "bundled": true, + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "bundled": true, + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + } + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-audit-report": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "cli-table3": "^0.5.0", + "console-control-strings": "^1.1.0" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "npm-install-checks": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "npm-lifecycle": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "byline": "^5.0.0", + "graceful-fs": "^4.1.11", + "node-gyp": "^3.8.0", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.1" + } + }, + "npm-logical-tree": { + "version": "1.2.1", + "bundled": true, + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-profile": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.2 || 2", + "make-fetch-happen": "^2.5.0 || 3 || 4" + } + }, + "npm-registry-client": { + "version": "8.6.0", + "bundled": true, + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "bundled": true, + "dev": true + }, + "ssri": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + } + } + }, + "npm-registry-fetch": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "figgy-pudding": "^2.0.1", + "lru-cache": "^4.1.2", + "make-fetch-happen": "^3.0.0", + "npm-package-arg": "^6.0.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "cacache": { + "version": "10.0.4", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + }, + "dependencies": { + "mississippi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + } + } + }, + "figgy-pudding": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "make-fetch-happen": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^10.0.4", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.0", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^3.0.1", + "ssri": "^5.2.4" + } + }, + "pump": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "smart-buffer": { + "version": "1.1.15", + "bundled": true, + "dev": true + }, + "socks": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "requires": { + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "socks": "^1.1.10" + } + }, + "ssri": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.0", + "bundled": true, + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "package-json": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pacote": { + "version": "8.1.6", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "cacache": "^11.0.2", + "get-stream": "^3.0.0", + "glob": "^7.1.2", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.10", + "npm-pick-manifest": "^2.1.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.5.0", + "ssri": "^6.0.0", + "tar": "^4.4.3", + "unique-filename": "^1.1.0", + "which": "^1.3.0" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "pify": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "bundled": true, + "dev": true + } + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "read": "1" + } + }, + "proto-list": { + "version": "1.2.4", + "bundled": true, + "dev": true + }, + "protoduck": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "genfun": "^4.0.1" + } + }, + "prr": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "psl": { + "version": "1.1.29", + "bundled": true, + "dev": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "bundled": true, + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.5.2", + "bundled": true, + "dev": true + }, + "query-string": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "strict-uri-encode": "^2.0.0" + } + }, + "qw": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "read": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "read-package-json": { + "version": "2.0.13", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.2.1", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "bundled": true, + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "request": { + "version": "2.88.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "retry": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "sha": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slash": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "smart-buffer": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "socks": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" + } + }, + "socks-proxy-agent": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "~4.2.0", + "socks": "~2.2.0" + } + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "sorted-union-stream": { + "version": "2.1.3", + "bundled": true, + "dev": true, + "requires": { + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" + }, + "dependencies": { + "from2": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" + } + }, + "isarray": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true, + "dev": true + } + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "bundled": true, + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.0", + "bundled": true, + "dev": true + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-package": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "4.4.6", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.3", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "term-size": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "through": { + "version": "2.3.8", + "bundled": true, + "dev": true + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "bundled": true, + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "umask": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "unique-filename": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "util-extend": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.3.2", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "worker-farm": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "11.0.0", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "os-locale": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "os-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", + "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", + "dev": true, + "requires": { + "macos-release": "^1.0.0", + "win-release": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-1.0.0.tgz", + "integrity": "sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds=", + "dev": true, + "requires": { + "p-map": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + }, + "dependencies": { + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + } + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-retry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-2.0.0.tgz", + "integrity": "sha512-ZbCuzAmiwJ45q4evp/IG9D+5MUllGSUeCWwPt3j/tdYSi1KPkSD+46uqmAA1LhccDhOXv8kYZKNb8x78VflzfA==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-url": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", + "integrity": "sha1-V8FUKKuKiSsfQ4aWRccR0OFEtVQ=", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "protocols": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.6.tgz", + "integrity": "sha1-+LsmPqG1/Xp2BNJri+Ob13Z4v4o=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "dev": true, + "requires": { + "esprima": "~4.0.0" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "semantic-release": { + "version": "15.9.16", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.9.16.tgz", + "integrity": "sha512-5RWqMFwDBXzIaNGUdnJxI4aCd4DtKtdc+5ZNjNWXABEmkimZVuuzZhMaTVNhHYfSuVUqWG9GuATEKhjlVoTzfQ==", + "dev": true, + "requires": { + "@semantic-release/commit-analyzer": "^6.0.0", + "@semantic-release/error": "^2.2.0", + "@semantic-release/github": "^5.0.0", + "@semantic-release/npm": "^5.0.1", + "@semantic-release/release-notes-generator": "^7.0.0", + "aggregate-error": "^1.0.0", + "cosmiconfig": "^5.0.1", + "debug": "^4.0.0", + "env-ci": "^3.0.0", + "execa": "^1.0.0", + "figures": "^2.0.0", + "find-versions": "^2.0.0", + "get-stream": "^4.0.0", + "git-log-parser": "^1.2.0", + "git-url-parse": "^10.0.1", + "hook-std": "^1.1.0", + "hosted-git-info": "^2.7.1", + "lodash": "^4.17.4", + "marked": "^0.5.0", + "marked-terminal": "^3.0.0", + "p-locate": "^3.0.0", + "p-reduce": "^1.0.0", + "read-pkg-up": "^4.0.0", + "resolve-from": "^4.0.0", + "semver": "^5.4.1", + "signale": "^1.2.1", + "yargs": "^12.0.0" + } + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + }, + "semver-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "signale": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.3.0.tgz", + "integrity": "sha512-TyFhsQ9wZDYDfsPqWMyjCxsDoMwfpsT0130Mce7wDiVCSDdtWSg83dOqoj8aGpGCs3n1YPcam6sT1OFPuGT/OQ==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "^2.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "text-extensions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.8.0.tgz", + "integrity": "sha512-mVzjRxuWnDKs/qH1rbOJEVHLlSX9kty9lpi7lMvLgU9S74mQ8/Ozg9UPcKxShh0qG2NZ+NyPOPpcZU4C1Eld9A==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "universal-user-agent": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.1.tgz", + "integrity": "sha512-vz+heWVydO0iyYAa65VHD7WZkYzhl7BeNVy4i54p4TF8OMiLSXdbuQe4hm+fmWAsL+rVibaQHXfhvkw3c1Ws2w==", + "dev": true, + "requires": { + "os-name": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", + "dev": true + }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "dev": true, + "requires": { + "semver": "^5.0.1" + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" + }, + "dependencies": { + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } +} diff --git a/vendor/felixfbecker/language-server-protocol/package.json b/vendor/felixfbecker/language-server-protocol/package.json new file mode 100644 index 00000000..314301e0 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/package.json @@ -0,0 +1,15 @@ +{ + "private": true, + "repository": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol" + }, + "release": { + "verifyConditions": "@semantic-release/github", + "prepare": [], + "publish": "@semantic-release/github" + }, + "devDependencies": { + "semantic-release": "^15.9.16" + } +} diff --git a/vendor/felixfbecker/language-server-protocol/psalm-baseline.xml b/vendor/felixfbecker/language-server-protocol/psalm-baseline.xml new file mode 100644 index 00000000..ca496853 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/psalm-baseline.xml @@ -0,0 +1,146 @@ + + + + + $range + + + + + $triggerKind + + + + + $label + + + + + $text + + + + + $message + + + + + $range + + + + + $firstTriggerCharacter + + + + + $insertSpaces + $tabSize + + + + + $contents + + + + + $range + $uri + + + + + $language + $value + + + + + $kind + $value + + + + + $title + + + + + $name + + + + + $character + $line + + + + + $end + $start + + + + + $includeDeclaration + + + + + $reference + $symbol + + + + + $fqsen + + + + + $kind + $location + $name + + + + + $symbol + + + + + $text + + + + + $uri + + + + + $languageId + $text + $uri + $version + + + + + $newText + $range + + + + + $version + + + diff --git a/vendor/felixfbecker/language-server-protocol/psalm.xml b/vendor/felixfbecker/language-server-protocol/psalm.xml new file mode 100644 index 00000000..378f26fa --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/psalm.xml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/vendor/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php new file mode 100644 index 00000000..4062ada7 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php @@ -0,0 +1,22 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ChangeAnnotation.php b/vendor/felixfbecker/language-server-protocol/src/ChangeAnnotation.php new file mode 100644 index 00000000..39868e53 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ChangeAnnotation.php @@ -0,0 +1,39 @@ +label = $label; + $this->needsConfirmation = $needsConfirmation; + $this->description = $description; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilities.php new file mode 100644 index 00000000..c706dce7 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilities.php @@ -0,0 +1,97 @@ +workspace = $workspace; + $this->textDocument = $textDocument; + $this->window = $window; + $this->general = $general; + $this->experimental = $experimental; + $this->xfilesProvider = $xfilesProvider; + $this->xcontentProvider = $xcontentProvider; + $this->xcacheProvider = $xcacheProvider; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php new file mode 100644 index 00000000..70463d07 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php @@ -0,0 +1,33 @@ +regularExpressions = $regularExpressions; + $this->markdown = $markdown; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php new file mode 100644 index 00000000..8d6551f5 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php @@ -0,0 +1,47 @@ +workDoneProgress = $workDoneProgress; + $this->showMessage = $showMessage; + $this->showDocument = $showDocument; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php new file mode 100644 index 00000000..00e92475 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php @@ -0,0 +1,99 @@ +dynamicRegistration = $dynamicRegistration; + $this->didCreate = $didCreate; + $this->willCreate = $willCreate; + $this->didRename = $didRename; + $this->willRename = $willRename; + $this->didDelete = $didDelete; + $this->willDelete = $willDelete; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ClientInfo.php b/vendor/felixfbecker/language-server-protocol/src/ClientInfo.php new file mode 100644 index 00000000..5903a0c8 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ClientInfo.php @@ -0,0 +1,29 @@ +name = $name; + $this->version = $version; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeAction.php b/vendor/felixfbecker/language-server-protocol/src/CodeAction.php new file mode 100644 index 00000000..90133465 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeAction.php @@ -0,0 +1,146 @@ +title = $title; + $this->kind = $kind; + $this->diagnostics = $diagnostics; + $this->isPreferred = $isPreferred; + $this->disabled = $disabled; + $this->edit = $edit; + $this->command = $command; + $this->data = $data; + } + + /** + * This is needed because VSCode Does not like nulls + * meaning if a null is sent then this will not compute + * + * @return mixed + */ + #[\ReturnTypeWillChange] + public function jsonSerialize() + { + return array_filter(get_object_vars($this)); + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php new file mode 100644 index 00000000..8abb115e --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php @@ -0,0 +1,95 @@ +dynamicRegistration = $dynamicRegistration; + $this->codeActionLiteralSupport = $codeActionLiteralSupport; + $this->isPreferredSupport = $isPreferredSupport; + $this->disabledSupport = $disabledSupport; + $this->dataSupport = $dataSupport; + $this->resolveSupport = $resolveSupport; + $this->honorsChangeAnnotations = $honorsChangeAnnotations; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php new file mode 100644 index 00000000..ea3583f3 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php @@ -0,0 +1,20 @@ +codeActionKind = $codeActionKind; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php new file mode 100644 index 00000000..3d510737 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php @@ -0,0 +1,28 @@ +valueSet = $valueSet; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php new file mode 100644 index 00000000..89118ec1 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php @@ -0,0 +1,21 @@ +properties = $properties; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionContext.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionContext.php new file mode 100644 index 00000000..3766334a --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeActionContext.php @@ -0,0 +1,51 @@ +diagnostics = $diagnostics; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionDisabled.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionDisabled.php new file mode 100644 index 00000000..a16d9642 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeActionDisabled.php @@ -0,0 +1,21 @@ +reason = $reason; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionKind.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionKind.php new file mode 100644 index 00000000..b1329b16 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeActionKind.php @@ -0,0 +1,87 @@ +href = $href; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeLens.php b/vendor/felixfbecker/language-server-protocol/src/CodeLens.php new file mode 100644 index 00000000..25998e3c --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeLens.php @@ -0,0 +1,46 @@ +range = $range; + $this->command = $command; + $this->data = $data; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php new file mode 100644 index 00000000..706733e5 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php @@ -0,0 +1,20 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeLensOptions.php b/vendor/felixfbecker/language-server-protocol/src/CodeLensOptions.php new file mode 100644 index 00000000..7db0d4df --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeLensOptions.php @@ -0,0 +1,21 @@ +resolveProvider = $resolveProvider; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php new file mode 100644 index 00000000..e97a8b1d --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php @@ -0,0 +1,25 @@ +refreshSupport = $refreshSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/Command.php b/vendor/felixfbecker/language-server-protocol/src/Command.php new file mode 100644 index 00000000..97e0f0cb --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/Command.php @@ -0,0 +1,42 @@ +title = $title; + $this->command = $command; + $this->arguments = $arguments; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php new file mode 100644 index 00000000..2f1ad4a6 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php @@ -0,0 +1,65 @@ +dynamicRegistration = $dynamicRegistration; + $this->completionItem = $completionItem; + $this->contextSupport = $contextSupport; + $this->insertTextMode = $insertTextMode; + $this->completionList = $completionList; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php new file mode 100644 index 00000000..d1c1eb7f --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php @@ -0,0 +1,140 @@ +snippetSupport = $snippetSupport; + $this->commitCharactersSupport = $commitCharactersSupport; + $this->documentationFormat = $documentationFormat; + $this->deprecatedSupport = $deprecatedSupport; + $this->preselectSupport = $preselectSupport; + $this->tagSupport = $tagSupport; + $this->insertReplaceSupport = $insertReplaceSupport; + $this->resolveSupport = $resolveSupport; + $this->insertTextModeSupport = $insertTextModeSupport; + $this->labelDetailsSupport = $labelDetailsSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php new file mode 100644 index 00000000..68d4ead8 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php @@ -0,0 +1,24 @@ +valueSet = $valueSet; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php new file mode 100644 index 00000000..9afadfcd --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php @@ -0,0 +1,24 @@ +properties = $properties; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php new file mode 100644 index 00000000..b80a4152 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php @@ -0,0 +1,24 @@ +valueSet = $valueSet; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php new file mode 100644 index 00000000..2a23ed93 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php @@ -0,0 +1,30 @@ +itemDefaults = $itemDefaults; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionContext.php b/vendor/felixfbecker/language-server-protocol/src/CompletionContext.php new file mode 100644 index 00000000..1c6d43fb --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionContext.php @@ -0,0 +1,31 @@ +triggerKind = $triggerKind; + $this->triggerCharacter = $triggerCharacter; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionItem.php b/vendor/felixfbecker/language-server-protocol/src/CompletionItem.php new file mode 100644 index 00000000..ec8e4122 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionItem.php @@ -0,0 +1,248 @@ +` and a completion item with an `insertText` of + * `console` is provided it will only insert `sole`. Therefore it is + * recommended to use `textEdit` instead since it avoids additional client + * side interpretation. + * + * @var string|null + */ + public $insertText; + + /** + * The format of the insert text. The format applies to both the + * `insertText` property and the `newText` property of a provided + * `textEdit`. If omitted defaults to `InsertTextFormat.PlainText`. + * + * Please note that the insertTextFormat doesn't apply to + * `additionalTextEdits`. + * + * @var int|null + * @see InsertTextFormat + */ + public $insertTextFormat; + + /** + * How whitespace and indentation is handled during completion + * item insertion. If not provided the client's default value depends on + * the `textDocument.completion.insertTextMode` client capability. + * + * @since 3.16.0 + * @since 3.17.0 - support for `textDocument.completion.insertTextMode` + * + * @var int|null + * @see InsertTextMode + */ + public $insertTextMode; + + /** + * An edit which is applied to a document when selecting this completion. + * When an edit is provided the value of `insertText` is ignored. + * + * *Note:* The range of the edit must be a single line range and it must + * contain the position at which completion has been requested. + * + * Most editors support two different operations when accepting a completion + * item. One is to insert a completion text and the other is to replace an + * existing text with a completion text. Since this can usually not be + * predetermined by a server it can report both ranges. Clients need to + * signal support for `InsertReplaceEdit`s via the + * `textDocument.completion.completionItem.insertReplaceSupport` client + * capability property. + * + * *Note 1:* The text edit's range as well as both ranges from an insert + * replace edit must be a [single line] and they must contain the position + * at which completion has been requested. + * *Note 2:* If an `InsertReplaceEdit` is returned the edit's insert range + * must be a prefix of the edit's replace range, that means it must be + * contained and starting at the same position. + * + * @since 3.16.0 additional type `InsertReplaceEdit` + * + * @var TextEdit|null + */ + public $textEdit; + + /** + * An optional array of additional text edits that are applied when + * selecting this completion. Edits must not overlap (including the same + * insert position) with the main edit nor with themselves. + * + * Additional text edits should be used to change text unrelated to the + * current cursor position (for example adding an import statement at the + * top of the file if the completion item will insert an unqualified type). + * + * @var TextEdit[]|null + */ + public $additionalTextEdits; + + /** + * An optional set of characters that when pressed while this completion is + * active will accept it first and then type that character. *Note* that all + * commit characters should have `length=1` and that superfluous characters + * will be ignored. + * + * @var string[]|null + */ + public $commitCharacters; + + /** + * An optional command that is executed *after* inserting this completion. *Note* that + * additional modifications to the current document should be described with the + * additionalTextEdits-property. + * + * @var Command|null + */ + public $command; + + /** + * An data entry field that is preserved on a completion item between + * a completion and a completion resolve request. + * + * @var mixed + */ + public $data; + + /** + * @param string $label + * @param int|null $kind + * @param string|null $detail + * @param string|null $documentation + * @param string|null $sortText + * @param string|null $filterText + * @param string|null $insertText + * @param TextEdit|null $textEdit + * @param TextEdit[]|null $additionalTextEdits + * @param Command|null $command + * @param mixed|null $data + * @param int|null $insertTextFormat + */ + public function __construct( + string $label = null, + int $kind = null, + string $detail = null, + string $documentation = null, + string $sortText = null, + string $filterText = null, + string $insertText = null, + TextEdit $textEdit = null, + array $additionalTextEdits = null, + Command $command = null, + $data = null, + int $insertTextFormat = null + ) { + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->label = $label; + $this->kind = $kind; + $this->detail = $detail; + $this->documentation = $documentation; + $this->sortText = $sortText; + $this->filterText = $filterText; + $this->insertText = $insertText; + $this->textEdit = $textEdit; + $this->additionalTextEdits = $additionalTextEdits; + $this->command = $command; + $this->data = $data; + $this->insertTextFormat = $insertTextFormat; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionItemKind.php b/vendor/felixfbecker/language-server-protocol/src/CompletionItemKind.php new file mode 100644 index 00000000..f2897f9b --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionItemKind.php @@ -0,0 +1,71 @@ +detail = $detail; + $this->description = $description; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionItemTag.php b/vendor/felixfbecker/language-server-protocol/src/CompletionItemTag.php new file mode 100644 index 00000000..e88af50c --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionItemTag.php @@ -0,0 +1,11 @@ +items = $items; + $this->isIncomplete = $isIncomplete; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionOptions.php b/vendor/felixfbecker/language-server-protocol/src/CompletionOptions.php new file mode 100644 index 00000000..f0c60f96 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionOptions.php @@ -0,0 +1,33 @@ +resolveProvider = $resolveProvider; + $this->triggerCharacters = $triggerCharacters; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php b/vendor/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php new file mode 100644 index 00000000..f84c48b5 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php @@ -0,0 +1,16 @@ +range = $range; + $this->rangeLength = $rangeLength; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->text = $text; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php new file mode 100644 index 00000000..bab0442e --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php @@ -0,0 +1,31 @@ +dynamicRegistration = $dynamicRegistration; + $this->linkSupport = $linkSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php new file mode 100644 index 00000000..bc01efda --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php @@ -0,0 +1,29 @@ +dynamicRegistration = $dynamicRegistration; + $this->linkSupport = $linkSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DependencyReference.php b/vendor/felixfbecker/language-server-protocol/src/DependencyReference.php new file mode 100644 index 00000000..afb6d30d --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DependencyReference.php @@ -0,0 +1,27 @@ +attributes = $attributes ?? new \stdClass; + $this->hints = $hints; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/Diagnostic.php b/vendor/felixfbecker/language-server-protocol/src/Diagnostic.php new file mode 100644 index 00000000..657bf0fe --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/Diagnostic.php @@ -0,0 +1,121 @@ +message = $message; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->range = $range; + $this->code = $code; + $this->severity = $severity; + $this->source = $source; + $this->codeDescription = $codeDescription; + $this->tags = $tags; + $this->relatedInformation = $relatedInformation; + $this->data = $data; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php b/vendor/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php new file mode 100644 index 00000000..78e2b9b4 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php @@ -0,0 +1,31 @@ +location = $location; + $this->message = $message; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php b/vendor/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php new file mode 100644 index 00000000..d11ed95d --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php @@ -0,0 +1,26 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php new file mode 100644 index 00000000..e82b1841 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php @@ -0,0 +1,21 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php new file mode 100644 index 00000000..93f55150 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php @@ -0,0 +1,20 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php new file mode 100644 index 00000000..97261175 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php @@ -0,0 +1,20 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentHighlight.php b/vendor/felixfbecker/language-server-protocol/src/DocumentHighlight.php new file mode 100644 index 00000000..4c329fce --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentHighlight.php @@ -0,0 +1,32 @@ +range = $range; + $this->kind = $kind; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php new file mode 100644 index 00000000..f7fe47b0 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php @@ -0,0 +1,18 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php b/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php new file mode 100644 index 00000000..21c5001e --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php @@ -0,0 +1,24 @@ +dynamicRegistration = $dynamicRegistration; + $this->tooltipSupport = $tooltipSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php new file mode 100644 index 00000000..0101fc13 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php @@ -0,0 +1,20 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php b/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php new file mode 100644 index 00000000..149ea36c --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php @@ -0,0 +1,33 @@ +firstTriggerCharacter = $firstTriggerCharacter; + $this->moreTriggerCharacter = $moreTriggerCharacter; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php new file mode 100644 index 00000000..5edca75b --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php @@ -0,0 +1,20 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php new file mode 100644 index 00000000..eaa10a4f --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php @@ -0,0 +1,64 @@ +dynamicRegistration = $dynamicRegistration; + $this->symbolKind = $symbolKind; + $this->hierarchicalDocumentSymbolSupport = $hierarchicalDocumentSymbolSupport; + $this->tagSupport = $tagSupport; + $this->labelSupport = $labelSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php b/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php new file mode 100644 index 00000000..536e5e9c --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php @@ -0,0 +1,37 @@ +valueSet = $valueSet; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php b/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php new file mode 100644 index 00000000..f423a1a6 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php @@ -0,0 +1,32 @@ +valueSet = $valueSet; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ErrorCode.php b/vendor/felixfbecker/language-server-protocol/src/ErrorCode.php new file mode 100644 index 00000000..ffbc0755 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ErrorCode.php @@ -0,0 +1,17 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php b/vendor/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php new file mode 100644 index 00000000..0f77b607 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php @@ -0,0 +1,23 @@ +commands = $commands; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/FailureHandlingKind.php b/vendor/felixfbecker/language-server-protocol/src/FailureHandlingKind.php new file mode 100644 index 00000000..c0c48db2 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/FailureHandlingKind.php @@ -0,0 +1,36 @@ +uri = $uri; + $this->type = $type; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php new file mode 100644 index 00000000..4efe925b --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php @@ -0,0 +1,42 @@ +dynamicRegistration = $dynamicRegistration; + $this->rangeLimit = $rangeLimit; + $this->lineFoldingOnly = $lineFoldingOnly; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/FormattingOptions.php b/vendor/felixfbecker/language-server-protocol/src/FormattingOptions.php new file mode 100644 index 00000000..1d9c1327 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/FormattingOptions.php @@ -0,0 +1,33 @@ +tabSize = $tabSize; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->insertSpaces = $insertSpaces; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/Hover.php b/vendor/felixfbecker/language-server-protocol/src/Hover.php new file mode 100644 index 00000000..8c39c97d --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/Hover.php @@ -0,0 +1,34 @@ +contents = $contents; + $this->range = $range; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php new file mode 100644 index 00000000..2ba234cb --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php @@ -0,0 +1,36 @@ +dynamicRegistration = $dynamicRegistration; + $this->contentFormat = $contentFormat; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php new file mode 100644 index 00000000..9caef5dd --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php @@ -0,0 +1,32 @@ +dynamicRegistration = $dynamicRegistration; + $this->linkSupport = $linkSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/InitializeResult.php b/vendor/felixfbecker/language-server-protocol/src/InitializeResult.php new file mode 100644 index 00000000..59333eae --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/InitializeResult.php @@ -0,0 +1,29 @@ +capabilities = $capabilities; + $this->serverInfo = $serverInfo; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php b/vendor/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php new file mode 100644 index 00000000..040b5839 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php @@ -0,0 +1,26 @@ +name = $name; + $this->version = $version; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/InsertTextFormat.php b/vendor/felixfbecker/language-server-protocol/src/InsertTextFormat.php new file mode 100644 index 00000000..459904f5 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/InsertTextFormat.php @@ -0,0 +1,25 @@ +<3tabs>foo. Accepting a + * multi line completion item is indented using 2 tabs and all + * following lines inserted will be indented using 2 tabs as well. + */ + const ADJUST_INDENTATION = 2; +} diff --git a/vendor/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php new file mode 100644 index 00000000..05c51086 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php @@ -0,0 +1,23 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/Location.php b/vendor/felixfbecker/language-server-protocol/src/Location.php new file mode 100644 index 00000000..7429620d --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/Location.php @@ -0,0 +1,27 @@ +uri = $uri; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->range = $range; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/LogMessage.php b/vendor/felixfbecker/language-server-protocol/src/LogMessage.php new file mode 100644 index 00000000..9c6f38d6 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/LogMessage.php @@ -0,0 +1,30 @@ +type = $type; + $this->message = $message; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/LogTrace.php b/vendor/felixfbecker/language-server-protocol/src/LogTrace.php new file mode 100644 index 00000000..dfba3645 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/LogTrace.php @@ -0,0 +1,39 @@ +message = $message; + $this->verbose = $verbose; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php new file mode 100644 index 00000000..5af49455 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php @@ -0,0 +1,47 @@ +parser = $parser; + $this->version = $version; + $this->allowedTags = $allowedTags; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/MarkedString.php b/vendor/felixfbecker/language-server-protocol/src/MarkedString.php new file mode 100644 index 00000000..402a8793 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/MarkedString.php @@ -0,0 +1,24 @@ +language = $language; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->value = $value; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/MarkupContent.php b/vendor/felixfbecker/language-server-protocol/src/MarkupContent.php new file mode 100644 index 00000000..5b7e6db1 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/MarkupContent.php @@ -0,0 +1,52 @@ +kind = $kind; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->value = $value; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/MarkupKind.php b/vendor/felixfbecker/language-server-protocol/src/MarkupKind.php new file mode 100644 index 00000000..962fb031 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/MarkupKind.php @@ -0,0 +1,23 @@ +title = $title; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/MessageType.php b/vendor/felixfbecker/language-server-protocol/src/MessageType.php new file mode 100644 index 00000000..1d01540b --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/MessageType.php @@ -0,0 +1,29 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/PackageDescriptor.php b/vendor/felixfbecker/language-server-protocol/src/PackageDescriptor.php new file mode 100644 index 00000000..9f26856b --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/PackageDescriptor.php @@ -0,0 +1,26 @@ +name = $name; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ParameterInformation.php b/vendor/felixfbecker/language-server-protocol/src/ParameterInformation.php new file mode 100644 index 00000000..a94bb671 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ParameterInformation.php @@ -0,0 +1,45 @@ +label = $label; + $this->documentation = $documentation; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/Position.php b/vendor/felixfbecker/language-server-protocol/src/Position.php new file mode 100644 index 00000000..26c5f1e6 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/Position.php @@ -0,0 +1,67 @@ +line = $line; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->character = $character; + } + + /** + * Compares this position to another position + * Returns + * - 0 if the positions match + * - a negative number if $this is before $position + * - a positive number otherwise + * + * @param Position $position + * @return int + */ + public function compare(Position $position): int + { + if ($this->line === $position->line && $this->character === $position->character) { + return 0; + } + + if ($this->line !== $position->line) { + return $this->line - $position->line; + } + + return $this->character - $position->character; + } + + /** + * Returns the offset of the position in a string + * + * @param string $content + * @return int + */ + public function toOffset(string $content): int + { + $lines = explode("\n", $content); + $slice = array_slice($lines, 0, $this->line); + return array_sum(array_map('strlen', $slice)) + count($slice) + $this->character; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php b/vendor/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php new file mode 100644 index 00000000..fe374095 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php @@ -0,0 +1,12 @@ +relatedInformation = $relatedInformation; + $this->tagSupport = $tagSupport; + $this->versionSupport = $versionSupport; + $this->codeDescriptionSupport = $codeDescriptionSupport; + $this->dataSupport = $dataSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php b/vendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php new file mode 100644 index 00000000..7fe5df63 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php @@ -0,0 +1,23 @@ +valueSet = $valueSet; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/Range.php b/vendor/felixfbecker/language-server-protocol/src/Range.php new file mode 100644 index 00000000..9077a523 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/Range.php @@ -0,0 +1,42 @@ +start = $start; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->end = $end; + } + + /** + * Checks if a position is within the range + * + * @param Position $position + * @return bool + */ + public function includes(Position $position): bool + { + return $this->start->compare($position) <= 0 && $this->end->compare($position) >= 0; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php new file mode 100644 index 00000000..195f096f --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php @@ -0,0 +1,18 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ReferenceContext.php b/vendor/felixfbecker/language-server-protocol/src/ReferenceContext.php new file mode 100644 index 00000000..fe941aee --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ReferenceContext.php @@ -0,0 +1,19 @@ +includeDeclaration = $includeDeclaration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ReferenceInformation.php b/vendor/felixfbecker/language-server-protocol/src/ReferenceInformation.php new file mode 100644 index 00000000..03a3be1d --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ReferenceInformation.php @@ -0,0 +1,39 @@ +reference = $reference; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->symbol = $symbol; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php new file mode 100644 index 00000000..e3c16435 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php @@ -0,0 +1,33 @@ +engine = $engine; + $this->version = $version; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php new file mode 100644 index 00000000..faaf258d --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php @@ -0,0 +1,68 @@ +dynamicRegistration = $dynamicRegistration; + $this->prepareSupport = $prepareSupport; + $this->prepareSupportDefaultBehavior = $prepareSupportDefaultBehavior; + $this->honorsChangeAnnotations = $honorsChangeAnnotations; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ResourceOperationKind.php b/vendor/felixfbecker/language-server-protocol/src/ResourceOperationKind.php new file mode 100644 index 00000000..7bc9ca90 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ResourceOperationKind.php @@ -0,0 +1,24 @@ +dynamicRegistration = $dynamicRegistration; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php new file mode 100644 index 00000000..a254dbd7 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php @@ -0,0 +1,133 @@ +requests = $requests; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->tokenTypes = $tokenTypes; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->tokenModifiers = $tokenModifiers; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->formats = $formats; + $this->dynamicRegistration = $dynamicRegistration; + $this->overlappingTokenSupport = $overlappingTokenSupport; + $this->multilineTokenSupport = $multilineTokenSupport; + $this->serverCancelSupport = $serverCancelSupport; + $this->augmentsSyntaxTokens = $augmentsSyntaxTokens; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php b/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php new file mode 100644 index 00000000..62d2bfd6 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php @@ -0,0 +1,31 @@ +range = $range; + $this->full = $full; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php new file mode 100644 index 00000000..ae1c0ed3 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php @@ -0,0 +1,24 @@ +refreshSupport = $refreshSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ServerCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/ServerCapabilities.php new file mode 100644 index 00000000..3604321f --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ServerCapabilities.php @@ -0,0 +1,157 @@ +support = $support; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php new file mode 100644 index 00000000..b19bd870 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php @@ -0,0 +1,20 @@ +messageActionItem = $messageActionItem; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php b/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php new file mode 100644 index 00000000..4303f18b --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php @@ -0,0 +1,22 @@ +additionalPropertiesSupport = $additionalPropertiesSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureHelp.php b/vendor/felixfbecker/language-server-protocol/src/SignatureHelp.php new file mode 100644 index 00000000..c5b853eb --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SignatureHelp.php @@ -0,0 +1,61 @@ +signatures = $signatures; + $this->activeSignature = $activeSignature; + $this->activeParameter = $activeParameter; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php new file mode 100644 index 00000000..58b48052 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php @@ -0,0 +1,43 @@ +dynamicRegistration = $dynamicRegistration; + $this->signatureInformation = $signatureInformation; + $this->contextSupport = $contextSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php new file mode 100644 index 00000000..a333846b --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php @@ -0,0 +1,50 @@ +documentationFormat = $documentationFormat; + $this->parameterInformation = $parameterInformation; + $this->activeParameterSupport = $activeParameterSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php new file mode 100644 index 00000000..72c7d004 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php @@ -0,0 +1,24 @@ +labelOffsetSupport = $labelOffsetSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php new file mode 100644 index 00000000..04222ed4 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php @@ -0,0 +1,24 @@ +triggerCharacters = $triggerCharacters; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureInformation.php b/vendor/felixfbecker/language-server-protocol/src/SignatureInformation.php new file mode 100644 index 00000000..c7329feb --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SignatureInformation.php @@ -0,0 +1,66 @@ +label = $label; + $this->parameters = $parameters; + $this->documentation = $documentation; + $this->activeParameter = $activeParameter; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SymbolDescriptor.php b/vendor/felixfbecker/language-server-protocol/src/SymbolDescriptor.php new file mode 100644 index 00000000..2bcd4a41 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SymbolDescriptor.php @@ -0,0 +1,36 @@ +fqsen = $fqsen; + $this->package = $package; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SymbolInformation.php b/vendor/felixfbecker/language-server-protocol/src/SymbolInformation.php new file mode 100644 index 00000000..26688f97 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SymbolInformation.php @@ -0,0 +1,55 @@ +name = $name; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->kind = $kind; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->location = $location; + $this->containerName = $containerName; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SymbolKind.php b/vendor/felixfbecker/language-server-protocol/src/SymbolKind.php new file mode 100644 index 00000000..b59eecae --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SymbolKind.php @@ -0,0 +1,28 @@ +symbol = $symbol; + $this->location = $location; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/SymbolTag.php b/vendor/felixfbecker/language-server-protocol/src/SymbolTag.php new file mode 100644 index 00000000..6eed0476 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/SymbolTag.php @@ -0,0 +1,16 @@ +synchronization = $synchronization; + $this->completion = $completion; + $this->hover = $hover; + $this->signatureHelp = $signatureHelp; + $this->declaration = $declaration; + $this->definition = $definition; + $this->typeDefinition = $typeDefinition; + $this->implementation = $implementation; + $this->references = $references; + $this->documentHighlight = $documentHighlight; + $this->documentSymbol = $documentSymbol; + $this->codeAction = $codeAction; + $this->codeLens = $codeLens; + $this->documentLink = $documentLink; + $this->colorProvider = $colorProvider; + $this->formatting = $formatting; + $this->rangeFormatting = $rangeFormatting; + $this->onTypeFormatting = $onTypeFormatting; + $this->rename = $rename; + $this->publishDiagnostics = $publishDiagnostics; + $this->foldingRange = $foldingRange; + $this->selectionRange = $selectionRange; + $this->linkedEditingRange = $linkedEditingRange; + $this->callHierarchy = $callHierarchy; + $this->semanticTokens = $semanticTokens; + $this->moniker = $moniker; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php b/vendor/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php new file mode 100644 index 00000000..77589fca --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php @@ -0,0 +1,39 @@ +range = $range; + $this->rangeLength = $rangeLength; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->text = $text; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php b/vendor/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php new file mode 100644 index 00000000..fe9eaddc --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php @@ -0,0 +1,22 @@ +uri = $uri; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/TextDocumentItem.php b/vendor/felixfbecker/language-server-protocol/src/TextDocumentItem.php new file mode 100644 index 00000000..cb9fd651 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/TextDocumentItem.php @@ -0,0 +1,50 @@ +uri = $uri; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->languageId = $languageId; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->version = $version; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->text = $text; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php new file mode 100644 index 00000000..6bb119c7 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php @@ -0,0 +1,49 @@ +dynamicRegistration = $dynamicRegistration; + $this->willSave = $willSave; + $this->willSaveWaitUntil = $willSaveWaitUntil; + $this->didSave = $didSave; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php b/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php new file mode 100644 index 00000000..0adf6345 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php @@ -0,0 +1,25 @@ +range = $range; + $this->newText = $newText; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/TokenFormat.php b/vendor/felixfbecker/language-server-protocol/src/TokenFormat.php new file mode 100644 index 00000000..73eff909 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/TokenFormat.php @@ -0,0 +1,8 @@ +dynamicRegistration = $dynamicRegistration; + $this->linkSupport = $linkSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php b/vendor/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php new file mode 100644 index 00000000..6232713f --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php @@ -0,0 +1,19 @@ +version = $version; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceEdit.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceEdit.php new file mode 100644 index 00000000..eaa71950 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/WorkspaceEdit.php @@ -0,0 +1,78 @@ + + */ + public $changes; + + /** + * Depending on the client capability + * `workspace.workspaceEdit.resourceOperations` document changes are either + * an array of `TextDocumentEdit`s to express changes to n different text + * documents where each text document edit addresses a specific version of + * a text document. Or it can contain above `TextDocumentEdit`s mixed with + * create, rename and delete file / folder operations. + * + * Whether a client supports versioned document edits is expressed via + * `workspace.workspaceEdit.documentChanges` client capability. + * + * If a client neither supports `documentChanges` nor + * `workspace.workspaceEdit.resourceOperations` then only plain `TextEdit`s + * using the `changes` property are supported. + * + * @var mixed + */ + public $documentChanges; + + /** + * A map of change annotations that can be referenced in + * `AnnotatedTextEdit`s or create, rename and delete file / folder + * operations. + * + * Whether clients honor this property depends on the client capability + * `workspace.changeAnnotationSupport`. + * + * @since 3.16.0 + * + * @var array|null + */ + public $changeAnnotations; + + /** + * @param array $changes + * @param mixed $documentChanges + * @param array|null $changeAnnotations + */ + public function __construct( + array $changes = [], + $documentChanges = null, + array $changeAnnotations = null + ) { + $this->changes = $changes; + $this->documentChanges = $documentChanges; + $this->changeAnnotations = $changeAnnotations; + } + + /** + * This is needed because VSCode Does not like nulls + * meaning if a null is sent then this will not compute + * + * @return mixed + */ + #[\ReturnTypeWillChange] + public function jsonSerialize() + { + return array_filter(get_object_vars($this)); + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php new file mode 100644 index 00000000..31e21c62 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php @@ -0,0 +1,80 @@ +documentChanges = $documentChanges; + $this->resourceOperations = $resourceOperations; + $this->failureHandling = $failureHandling; + $this->normalizesLineEndings = $normalizesLineEndings; + $this->changeAnnotationSupport = $changeAnnotationSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php new file mode 100644 index 00000000..8f62d562 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php @@ -0,0 +1,21 @@ +groupsOnLabel = $groupsOnLabel; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceFolder.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceFolder.php new file mode 100644 index 00000000..764e0c28 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/WorkspaceFolder.php @@ -0,0 +1,31 @@ +uri = $uri; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->name = $name; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php new file mode 100644 index 00000000..57550c1b --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php @@ -0,0 +1,55 @@ +dynamicRegistration = $dynamicRegistration; + $this->symbolKind = $symbolKind; + $this->tagSupport = $tagSupport; + $this->resolveSupport = $resolveSupport; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php new file mode 100644 index 00000000..b5450396 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php @@ -0,0 +1,24 @@ +properties = $properties; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php new file mode 100644 index 00000000..7796d062 --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php @@ -0,0 +1,30 @@ +valueSet = $valueSet; + } +} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php new file mode 100644 index 00000000..1e21a84d --- /dev/null +++ b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php @@ -0,0 +1,30 @@ +valueSet = $valueSet; + } +} diff --git a/vendor/netresearch/jsonmapper/LICENSE b/vendor/netresearch/jsonmapper/LICENSE new file mode 100644 index 00000000..2ebd4813 --- /dev/null +++ b/vendor/netresearch/jsonmapper/LICENSE @@ -0,0 +1,47 @@ +Open Software License v. 3.0 (OSL-3.0) + +This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: + + Licensed under the Open Software License version 3.0 + +1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: + + a) to reproduce the Original Work in copies, either alone or as part of a collective work; + + b) to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; + + c) to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License; + + d) to perform the Original Work publicly; and + + e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. + +4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor’s trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. + +5) External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). + +6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + +7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. + +9) Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including “fair use” or “fair dealing”). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). + +10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. + +12) Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + +13) Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + +16) Modification of This License. This License is Copyright (c) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under " or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. \ No newline at end of file diff --git a/vendor/netresearch/jsonmapper/composer.json b/vendor/netresearch/jsonmapper/composer.json new file mode 100644 index 00000000..0c5c699e --- /dev/null +++ b/vendor/netresearch/jsonmapper/composer.json @@ -0,0 +1,31 @@ +{ + "name": "netresearch/jsonmapper", + "description": "Map nested JSON structures onto PHP classes", + "license": "OSL-3.0", + "autoload": { + "psr-0": {"JsonMapper": "src/"} + }, + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues" + }, + "require":{ + "php": ">=7.1", + "ext-spl": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", + "squizlabs/php_codesniffer": "~3.5" + } +} diff --git a/vendor/netresearch/jsonmapper/contributing.rst b/vendor/netresearch/jsonmapper/contributing.rst new file mode 100644 index 00000000..1e40f12c --- /dev/null +++ b/vendor/netresearch/jsonmapper/contributing.rst @@ -0,0 +1,13 @@ +************************************** +How to add your features to JsonMapper +************************************** + +If you want to add a new feature or a fix to this library, please consider these aspects: + +- Respect the original code style and continue using it - it uses `PEAR Coding Standards`__. +- Pull requests fixing a bug should include a test case that illustrates the wrong behaviour. +- Pull requests adding a new feature should also include a test for the new feature. + + __ http://pear.php.net/manual/en/standards.php + +Having test cases included in your pull request greatly helps reviewing it and will increase the chance of it being merged. diff --git a/vendor/netresearch/jsonmapper/phpunit.xml b/vendor/netresearch/jsonmapper/phpunit.xml new file mode 100644 index 00000000..c99d7bfd --- /dev/null +++ b/vendor/netresearch/jsonmapper/phpunit.xml @@ -0,0 +1,18 @@ + + + + tests + + + + + src/ + + + diff --git a/vendor/netresearch/jsonmapper/src/JsonMapper.php b/vendor/netresearch/jsonmapper/src/JsonMapper.php new file mode 100644 index 00000000..ace12bd4 --- /dev/null +++ b/vendor/netresearch/jsonmapper/src/JsonMapper.php @@ -0,0 +1,850 @@ + + * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 + * @link http://cweiske.de/ + */ + +/** + * Automatically map JSON structures into objects. + * + * @category Netresearch + * @package JsonMapper + * @author Christian Weiske + * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 + * @link http://cweiske.de/ + */ +class JsonMapper +{ + /** + * PSR-3 compatible logger object + * + * @link http://www.php-fig.org/psr/psr-3/ + * @var object + * @see setLogger() + */ + protected $logger; + + /** + * Throw an exception when JSON data contain a property + * that is not defined in the PHP class + * + * @var boolean + */ + public $bExceptionOnUndefinedProperty = false; + + /** + * Throw an exception if the JSON data miss a property + * that is marked with @required in the PHP class + * + * @var boolean + */ + public $bExceptionOnMissingData = false; + + /** + * If the types of map() parameters shall be checked. + * + * You have to disable it if you're using the json_decode "assoc" parameter. + * + * json_decode($str, false) + * + * @var boolean + */ + public $bEnforceMapType = true; + + /** + * Throw an exception when an object is expected but the JSON contains + * a non-object type. + * + * @var boolean + */ + public $bStrictObjectTypeChecking = false; + + /** + * Throw an exception, if null value is found + * but the type of attribute does not allow nulls. + * + * @var bool + */ + public $bStrictNullTypes = true; + + /** + * Allow mapping of private and proteted properties. + * + * @var boolean + */ + public $bIgnoreVisibility = false; + + /** + * Remove attributes that were not passed in JSON, + * to avoid confusion between them and NULL values. + * + * @var boolean + */ + public $bRemoveUndefinedAttributes = false; + + /** + * Override class names that JsonMapper uses to create objects. + * Useful when your setter methods accept abstract classes or interfaces. + * + * @var array + */ + public $classMap = array(); + + /** + * Callback used when an undefined property is found. + * + * Works only when $bExceptionOnUndefinedProperty is disabled. + * + * Parameters to this function are: + * 1. Object that is being filled + * 2. Name of the unknown JSON property + * 3. JSON value of the property + * + * @var callable + */ + public $undefinedPropertyHandler = null; + + /** + * Runtime cache for inspected classes. This is particularly effective if + * mapArray() is called with a large number of objects + * + * @var array property inspection result cache + */ + protected $arInspectedClasses = array(); + + /** + * Method to call on each object after deserialization is done. + * + * Is only called if it exists on the object. + * + * @var string|null + */ + public $postMappingMethod = null; + + /** + * Map data all data in $json into the given $object instance. + * + * @param object|array $json JSON object structure from json_decode() + * @param object $object Object to map $json data into + * + * @return mixed Mapped object is returned. + * @see mapArray() + */ + public function map($json, $object) + { + if ($this->bEnforceMapType && !is_object($json)) { + throw new InvalidArgumentException( + 'JsonMapper::map() requires first argument to be an object' + . ', ' . gettype($json) . ' given.' + ); + } + if (!is_object($object)) { + throw new InvalidArgumentException( + 'JsonMapper::map() requires second argument to be an object' + . ', ' . gettype($object) . ' given.' + ); + } + + $strClassName = get_class($object); + $rc = new ReflectionClass($object); + $strNs = $rc->getNamespaceName(); + $providedProperties = array(); + foreach ($json as $key => $jvalue) { + $key = $this->getSafeName($key); + $providedProperties[$key] = true; + + // Store the property inspection results so we don't have to do it + // again for subsequent objects of the same type + if (!isset($this->arInspectedClasses[$strClassName][$key])) { + $this->arInspectedClasses[$strClassName][$key] + = $this->inspectProperty($rc, $key); + } + + list($hasProperty, $accessor, $type, $isNullable) + = $this->arInspectedClasses[$strClassName][$key]; + + if (!$hasProperty) { + if ($this->bExceptionOnUndefinedProperty) { + throw new JsonMapper_Exception( + 'JSON property "' . $key . '" does not exist' + . ' in object of type ' . $strClassName + ); + } else if ($this->undefinedPropertyHandler !== null) { + call_user_func( + $this->undefinedPropertyHandler, + $object, $key, $jvalue + ); + } else { + $this->log( + 'info', + 'Property {property} does not exist in {class}', + array('property' => $key, 'class' => $strClassName) + ); + } + continue; + } + + if ($accessor === null) { + if ($this->bExceptionOnUndefinedProperty) { + throw new JsonMapper_Exception( + 'JSON property "' . $key . '" has no public setter method' + . ' in object of type ' . $strClassName + ); + } + $this->log( + 'info', + 'Property {property} has no public setter method in {class}', + array('property' => $key, 'class' => $strClassName) + ); + continue; + } + + if ($isNullable || !$this->bStrictNullTypes) { + if ($jvalue === null) { + $this->setProperty($object, $accessor, null); + continue; + } + $type = $this->removeNullable($type); + } else if ($jvalue === null) { + throw new JsonMapper_Exception( + 'JSON property "' . $key . '" in class "' + . $strClassName . '" must not be NULL' + ); + } + + $type = $this->getFullNamespace($type, $strNs); + $type = $this->getMappedType($type, $jvalue); + + if ($type === null || $type === 'mixed') { + //no given type - simply set the json data + $this->setProperty($object, $accessor, $jvalue); + continue; + } else if ($this->isObjectOfSameType($type, $jvalue)) { + $this->setProperty($object, $accessor, $jvalue); + continue; + } else if ($this->isSimpleType($type)) { + if ($type === 'string' && is_object($jvalue)) { + throw new JsonMapper_Exception( + 'JSON property "' . $key . '" in class "' + . $strClassName . '" is an object and' + . ' cannot be converted to a string' + ); + } + settype($jvalue, $type); + $this->setProperty($object, $accessor, $jvalue); + continue; + } + + //FIXME: check if type exists, give detailed error message if not + if ($type === '') { + throw new JsonMapper_Exception( + 'Empty type at property "' + . $strClassName . '::$' . $key . '"' + ); + } + + $array = null; + $subtype = null; + if ($this->isArrayOfType($type)) { + //array + $array = array(); + $subtype = substr($type, 0, -2); + } else if (substr($type, -1) == ']') { + list($proptype, $subtype) = explode('[', substr($type, 0, -1)); + if ($proptype == 'array') { + $array = array(); + } else { + $array = $this->createInstance($proptype, false, $jvalue); + } + } else { + if (is_a($type, 'ArrayObject', true)) { + $array = $this->createInstance($type, false, $jvalue); + } + } + + if ($array !== null) { + if (!is_array($jvalue) && $this->isFlatType(gettype($jvalue))) { + throw new JsonMapper_Exception( + 'JSON property "' . $key . '" must be an array, ' + . gettype($jvalue) . ' given' + ); + } + + $cleanSubtype = $this->removeNullable($subtype); + $subtype = $this->getFullNamespace($cleanSubtype, $strNs); + $child = $this->mapArray($jvalue, $array, $subtype, $key); + } else if ($this->isFlatType(gettype($jvalue))) { + //use constructor parameter if we have a class + // but only a flat type (i.e. string, int) + if ($this->bStrictObjectTypeChecking) { + throw new JsonMapper_Exception( + 'JSON property "' . $key . '" must be an object, ' + . gettype($jvalue) . ' given' + ); + } + $child = $this->createInstance($type, true, $jvalue); + } else { + $child = $this->createInstance($type, false, $jvalue); + $this->map($jvalue, $child); + } + $this->setProperty($object, $accessor, $child); + } + + if ($this->bExceptionOnMissingData) { + $this->checkMissingData($providedProperties, $rc); + } + + if ($this->bRemoveUndefinedAttributes) { + $this->removeUndefinedAttributes($object, $providedProperties); + } + + if ($this->postMappingMethod !== null + && $rc->hasMethod($this->postMappingMethod) + ) { + $refDeserializePostMethod = $rc->getMethod( + $this->postMappingMethod + ); + $refDeserializePostMethod->setAccessible(true); + $refDeserializePostMethod->invoke($object); + } + + return $object; + } + + /** + * Convert a type name to a fully namespaced type name. + * + * @param string $type Type name (simple type or class name) + * @param string $strNs Base namespace that gets prepended to the type name + * + * @return string Fully-qualified type name with namespace + */ + protected function getFullNamespace($type, $strNs) + { + if ($type === null || $type === '' || $type[0] === '\\' || $strNs === '') { + return $type; + } + list($first) = explode('[', $type, 2); + if ($first === 'mixed' || $this->isSimpleType($first)) { + return $type; + } + + //create a full qualified namespace + return '\\' . $strNs . '\\' . $type; + } + + /** + * Check required properties exist in json + * + * @param array $providedProperties array with json properties + * @param object $rc Reflection class to check + * + * @throws JsonMapper_Exception + * + * @return void + */ + protected function checkMissingData($providedProperties, ReflectionClass $rc) + { + foreach ($rc->getProperties() as $property) { + $rprop = $rc->getProperty($property->name); + $docblock = $rprop->getDocComment(); + $annotations = static::parseAnnotations($docblock); + if (isset($annotations['required']) + && !isset($providedProperties[$property->name]) + ) { + throw new JsonMapper_Exception( + 'Required property "' . $property->name . '" of class ' + . $rc->getName() + . ' is missing in JSON data' + ); + } + } + } + + /** + * Remove attributes from object that were not passed in JSON data. + * + * This is to avoid confusion between those that were actually passed + * as NULL, and those that weren't provided at all. + * + * @param object $object Object to remove properties from + * @param array $providedProperties Array with JSON properties + * + * @return void + */ + protected function removeUndefinedAttributes($object, $providedProperties) + { + foreach (get_object_vars($object) as $propertyName => $dummy) { + if (!isset($providedProperties[$propertyName])) { + unset($object->{$propertyName}); + } + } + } + + /** + * Map an array + * + * @param array $json JSON array structure from json_decode() + * @param mixed $array Array or ArrayObject that gets filled with + * data from $json + * @param string $class Class name for children objects. + * All children will get mapped onto this type. + * Supports class names and simple types + * like "string" and nullability "string|null". + * Pass "null" to not convert any values + * @param string $parent_key Defines the key this array belongs to + * in order to aid debugging. + * + * @return mixed Mapped $array is returned + */ + public function mapArray($json, $array, $class = null, $parent_key = '') + { + $originalClass = $class; + foreach ($json as $key => $jvalue) { + $class = $this->getMappedType($originalClass, $jvalue); + if ($class === null) { + $array[$key] = $jvalue; + } else if ($this->isArrayOfType($class)) { + $array[$key] = $this->mapArray( + $jvalue, + array(), + substr($class, 0, -2) + ); + } else if ($this->isFlatType(gettype($jvalue))) { + //use constructor parameter if we have a class + // but only a flat type (i.e. string, int) + if ($jvalue === null) { + $array[$key] = null; + } else { + if ($this->isSimpleType($class)) { + settype($jvalue, $class); + $array[$key] = $jvalue; + } else { + $array[$key] = $this->createInstance( + $class, true, $jvalue + ); + } + } + } else if ($this->isFlatType($class)) { + throw new JsonMapper_Exception( + 'JSON property "' . ($parent_key ? $parent_key : '?') . '"' + . ' is an array of type "' . $class . '"' + . ' but contained a value of type' + . ' "' . gettype($jvalue) . '"' + ); + } else if (is_a($class, 'ArrayObject', true)) { + $array[$key] = $this->mapArray( + $jvalue, + $this->createInstance($class) + ); + } else { + $array[$key] = $this->map( + $jvalue, $this->createInstance($class, false, $jvalue) + ); + } + } + return $array; + } + + /** + * Try to find out if a property exists in a given class. + * Checks property first, falls back to setter method. + * + * @param ReflectionClass $rc Reflection class to check + * @param string $name Property name + * + * @return array First value: if the property exists + * Second value: the accessor to use ( + * ReflectionMethod or ReflectionProperty, or null) + * Third value: type of the property + * Fourth value: if the property is nullable + */ + protected function inspectProperty(ReflectionClass $rc, $name) + { + //try setter method first + $setter = 'set' . $this->getCamelCaseName($name); + + if ($rc->hasMethod($setter)) { + $rmeth = $rc->getMethod($setter); + if ($rmeth->isPublic() || $this->bIgnoreVisibility) { + $isNullable = false; + $rparams = $rmeth->getParameters(); + if (count($rparams) > 0) { + $isNullable = $rparams[0]->allowsNull(); + $ptype = $rparams[0]->getType(); + if ($ptype !== null) { + if ($ptype instanceof ReflectionNamedType) { + $typeName = $ptype->getName(); + } + if ($ptype instanceof ReflectionUnionType + || !$ptype->isBuiltin() + ) { + $typeName = '\\' . $typeName; + } + //allow overriding an "array" type hint + // with a more specific class in the docblock + if ($typeName !== 'array') { + return array( + true, $rmeth, + $typeName, + $isNullable, + ); + } + } + } + + $docblock = $rmeth->getDocComment(); + $annotations = static::parseAnnotations($docblock); + + if (!isset($annotations['param'][0])) { + return array(true, $rmeth, null, $isNullable); + } + list($type) = explode(' ', trim($annotations['param'][0])); + return array(true, $rmeth, $type, $this->isNullable($type)); + } + } + + //now try to set the property directly + //we have to look it up in the class hierarchy + $class = $rc; + $rprop = null; + do { + if ($class->hasProperty($name)) { + $rprop = $class->getProperty($name); + } + } while ($rprop === null && $class = $class->getParentClass()); + + if ($rprop === null) { + //case-insensitive property matching + foreach ($rc->getProperties() as $p) { + if ((strcasecmp($p->name, $name) === 0)) { + $rprop = $p; + break; + } + } + } + if ($rprop !== null) { + if ($rprop->isPublic() || $this->bIgnoreVisibility) { + $docblock = $rprop->getDocComment(); + $annotations = static::parseAnnotations($docblock); + + if (!isset($annotations['var'][0])) { + // If there is no annotations (higher priority) inspect + // if there's a scalar type being defined + if (PHP_VERSION_ID >= 70400 && $rprop->hasType()) { + $rPropType = $rprop->getType(); + $propTypeName = $rPropType->getName(); + + if ($this->isSimpleType($propTypeName)) { + return array( + true, + $rprop, + $propTypeName, + $rPropType->allowsNull() + ); + } + + return array( + true, + $rprop, + '\\'.$propTypeName, + $rPropType->allowsNull() + ); + } + + return array(true, $rprop, null, false); + } + + //support "@var type description" + list($type) = explode(' ', $annotations['var'][0]); + + return array(true, $rprop, $type, $this->isNullable($type)); + } else { + //no setter, private property + return array(true, null, null, false); + } + } + + //no setter, no property + return array(false, null, null, false); + } + + /** + * Removes - and _ and makes the next letter uppercase + * + * @param string $name Property name + * + * @return string CamelCasedVariableName + */ + protected function getCamelCaseName($name) + { + return str_replace( + ' ', '', ucwords(str_replace(array('_', '-'), ' ', $name)) + ); + } + + /** + * Since hyphens cannot be used in variables we have to uppercase them. + * + * Technically you may use them, but they are awkward to access. + * + * @param string $name Property name + * + * @return string Name without hyphen + */ + protected function getSafeName($name) + { + if (strpos($name, '-') !== false) { + $name = $this->getCamelCaseName($name); + } + + return $name; + } + + /** + * Set a property on a given object to a given value. + * + * Checks if the setter or the property are public are made before + * calling this method. + * + * @param object $object Object to set property on + * @param object $accessor ReflectionMethod or ReflectionProperty + * @param mixed $value Value of property + * + * @return void + */ + protected function setProperty( + $object, $accessor, $value + ) { + if (!$accessor->isPublic() && $this->bIgnoreVisibility) { + $accessor->setAccessible(true); + } + if ($accessor instanceof ReflectionProperty) { + $accessor->setValue($object, $value); + } else { + //setter method + $accessor->invoke($object, $value); + } + } + + /** + * Create a new object of the given type. + * + * This method exists to be overwritten in child classes, + * so you can do dependency injection or so. + * + * @param string $class Class name to instantiate + * @param boolean $useParameter Pass $parameter to the constructor or not + * @param mixed $jvalue Constructor parameter (the json value) + * + * @return object Freshly created object + */ + protected function createInstance( + $class, $useParameter = false, $jvalue = null + ) { + if ($useParameter) { + return new $class($jvalue); + } else { + $reflectClass = new ReflectionClass($class); + $constructor = $reflectClass->getConstructor(); + if (null === $constructor + || $constructor->getNumberOfRequiredParameters() > 0 + ) { + return $reflectClass->newInstanceWithoutConstructor(); + } + return $reflectClass->newInstance(); + } + } + + /** + * Get the mapped class/type name for this class. + * Returns the incoming classname if not mapped. + * + * @param string $type Type name to map + * @param mixed $jvalue Constructor parameter (the json value) + * + * @return string The mapped type/class name + */ + protected function getMappedType($type, $jvalue = null) + { + if (isset($this->classMap[$type])) { + $target = $this->classMap[$type]; + } else if (is_string($type) && $type !== '' && $type[0] == '\\' + && isset($this->classMap[substr($type, 1)]) + ) { + $target = $this->classMap[substr($type, 1)]; + } else { + $target = null; + } + + if ($target) { + if (is_callable($target)) { + $type = $target($type, $jvalue); + } else { + $type = $target; + } + } + return $type; + } + + /** + * Checks if the given type is a "simple type" + * + * @param string $type type name from gettype() + * + * @return boolean True if it is a simple PHP type + * + * @see isFlatType() + */ + protected function isSimpleType($type) + { + return $type == 'string' + || $type == 'boolean' || $type == 'bool' + || $type == 'integer' || $type == 'int' + || $type == 'double' || $type == 'float' + || $type == 'array' || $type == 'object'; + } + + /** + * Checks if the object is of this type or has this type as one of its parents + * + * @param string $type class name of type being required + * @param mixed $value Some PHP value to be tested + * + * @return boolean True if $object has type of $type + */ + protected function isObjectOfSameType($type, $value) + { + if (false === is_object($value)) { + return false; + } + + return is_a($value, $type); + } + + /** + * Checks if the given type is a type that is not nested + * (simple type except array and object) + * + * @param string $type type name from gettype() + * + * @return boolean True if it is a non-nested PHP type + * + * @see isSimpleType() + */ + protected function isFlatType($type) + { + return $type == 'NULL' + || $type == 'string' + || $type == 'boolean' || $type == 'bool' + || $type == 'integer' || $type == 'int' + || $type == 'double' || $type == 'float'; + } + + /** + * Returns true if type is an array of elements + * (bracket notation) + * + * @param string $strType type to be matched + * + * @return bool + */ + protected function isArrayOfType($strType) + { + return substr($strType, -2) === '[]'; + } + + /** + * Checks if the given type is nullable + * + * @param string $type type name from the phpdoc param + * + * @return boolean True if it is nullable + */ + protected function isNullable($type) + { + return stripos('|' . $type . '|', '|null|') !== false; + } + + /** + * Remove the 'null' section of a type + * + * @param string $type type name from the phpdoc param + * + * @return string The new type value + */ + protected function removeNullable($type) + { + if ($type === null) { + return null; + } + return substr( + str_ireplace('|null|', '|', '|' . $type . '|'), + 1, -1 + ); + } + + /** + * Copied from PHPUnit 3.7.29, Util/Test.php + * + * @param string $docblock Full method docblock + * + * @return array Array of arrays. + * Key is the "@"-name like "param", + * each value is an array of the rest of the @-lines + */ + protected static function parseAnnotations($docblock) + { + $annotations = array(); + // Strip away the docblock header and footer + // to ease parsing of one line annotations + $docblock = substr($docblock, 3, -2); + + $re = '/@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?$/m'; + if (preg_match_all($re, $docblock, $matches)) { + $numMatches = count($matches[0]); + + for ($i = 0; $i < $numMatches; ++$i) { + $annotations[$matches['name'][$i]][] = $matches['value'][$i]; + } + } + + return $annotations; + } + + /** + * Log a message to the $logger object + * + * @param string $level Logging level + * @param string $message Text to log + * @param array $context Additional information + * + * @return null + */ + protected function log($level, $message, array $context = array()) + { + if ($this->logger) { + $this->logger->log($level, $message, $context); + } + } + + /** + * Sets a logger instance on the object + * + * @param LoggerInterface $logger PSR-3 compatible logger object + * + * @return null + */ + public function setLogger($logger) + { + $this->logger = $logger; + } +} +?> diff --git a/vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php b/vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php new file mode 100644 index 00000000..bb8040c6 --- /dev/null +++ b/vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php @@ -0,0 +1,26 @@ + + * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 + * @link http://cweiske.de/ + */ + +/** + * Simple exception + * + * @category Netresearch + * @package JsonMapper + * @author Christian Weiske + * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 + * @link http://cweiske.de/ + */ +class JsonMapper_Exception extends Exception +{ +} +?> diff --git a/vendor/nikic/php-parser/LICENSE b/vendor/nikic/php-parser/LICENSE new file mode 100644 index 00000000..2e567183 --- /dev/null +++ b/vendor/nikic/php-parser/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2011, Nikita Popov +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/nikic/php-parser/README.md b/vendor/nikic/php-parser/README.md new file mode 100644 index 00000000..708cdfcb --- /dev/null +++ b/vendor/nikic/php-parser/README.md @@ -0,0 +1,225 @@ +PHP Parser +========== + +[![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master) + +This is a PHP 5.2 to PHP 8.1 parser written in PHP. Its purpose is to simplify static code analysis and +manipulation. + +[**Documentation for version 4.x**][doc_master] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.1). + +[Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2). + +Features +-------- + +The main features provided by this library are: + + * Parsing PHP 5, PHP 7, and PHP 8 code into an abstract syntax tree (AST). + * Invalid code can be parsed into a partial AST. + * The AST contains accurate location information. + * Dumping the AST in human-readable form. + * Converting an AST back to PHP code. + * Experimental: Formatting can be preserved for partially changed ASTs. + * Infrastructure to traverse and modify ASTs. + * Resolution of namespaced names. + * Evaluation of constant expressions. + * Builders to simplify AST construction for code generation. + * Converting an AST into JSON and back. + +Quick Start +----------- + +Install the library using [composer](https://getcomposer.org): + + php composer.phar require nikic/php-parser + +Parse some PHP code into an AST and dump the result in human-readable form: + +```php +create(ParserFactory::PREFER_PHP7); +try { + $ast = $parser->parse($code); +} catch (Error $error) { + echo "Parse error: {$error->getMessage()}\n"; + return; +} + +$dumper = new NodeDumper; +echo $dumper->dump($ast) . "\n"; +``` + +This dumps an AST looking something like this: + +``` +array( + 0: Stmt_Function( + byRef: false + name: Identifier( + name: test + ) + params: array( + 0: Param( + type: null + byRef: false + variadic: false + var: Expr_Variable( + name: foo + ) + default: null + ) + ) + returnType: null + stmts: array( + 0: Stmt_Expression( + expr: Expr_FuncCall( + name: Name( + parts: array( + 0: var_dump + ) + ) + args: array( + 0: Arg( + value: Expr_Variable( + name: foo + ) + byRef: false + unpack: false + ) + ) + ) + ) + ) + ) +) +``` + +Let's traverse the AST and perform some kind of modification. For example, drop all function bodies: + +```php +use PhpParser\Node; +use PhpParser\Node\Stmt\Function_; +use PhpParser\NodeTraverser; +use PhpParser\NodeVisitorAbstract; + +$traverser = new NodeTraverser(); +$traverser->addVisitor(new class extends NodeVisitorAbstract { + public function enterNode(Node $node) { + if ($node instanceof Function_) { + // Clean out the function body + $node->stmts = []; + } + } +}); + +$ast = $traverser->traverse($ast); +echo $dumper->dump($ast) . "\n"; +``` + +This gives us an AST where the `Function_::$stmts` are empty: + +``` +array( + 0: Stmt_Function( + byRef: false + name: Identifier( + name: test + ) + params: array( + 0: Param( + type: null + byRef: false + variadic: false + var: Expr_Variable( + name: foo + ) + default: null + ) + ) + returnType: null + stmts: array( + ) + ) +) +``` + +Finally, we can convert the new AST back to PHP code: + +```php +use PhpParser\PrettyPrinter; + +$prettyPrinter = new PrettyPrinter\Standard; +echo $prettyPrinter->prettyPrintFile($ast); +``` + +This gives us our original code, minus the `var_dump()` call inside the function: + +```php + [ + 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments' +]]); +$parser = (new PhpParser\ParserFactory)->create( + PhpParser\ParserFactory::PREFER_PHP7, + $lexer +); +$dumper = new PhpParser\NodeDumper([ + 'dumpComments' => true, + 'dumpPositions' => $attributes['with-positions'], +]); +$prettyPrinter = new PhpParser\PrettyPrinter\Standard; + +$traverser = new PhpParser\NodeTraverser(); +$traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver); + +foreach ($files as $file) { + if (strpos($file, ' Code $code\n"); + } else { + if (!file_exists($file)) { + fwrite(STDERR, "File $file does not exist.\n"); + exit(1); + } + + $code = file_get_contents($file); + fwrite(STDERR, "====> File $file:\n"); + } + + if ($attributes['with-recovery']) { + $errorHandler = new PhpParser\ErrorHandler\Collecting; + $stmts = $parser->parse($code, $errorHandler); + foreach ($errorHandler->getErrors() as $error) { + $message = formatErrorMessage($error, $code, $attributes['with-column-info']); + fwrite(STDERR, $message . "\n"); + } + if (null === $stmts) { + continue; + } + } else { + try { + $stmts = $parser->parse($code); + } catch (PhpParser\Error $error) { + $message = formatErrorMessage($error, $code, $attributes['with-column-info']); + fwrite(STDERR, $message . "\n"); + exit(1); + } + } + + foreach ($operations as $operation) { + if ('dump' === $operation) { + fwrite(STDERR, "==> Node dump:\n"); + echo $dumper->dump($stmts, $code), "\n"; + } elseif ('pretty-print' === $operation) { + fwrite(STDERR, "==> Pretty print:\n"); + echo $prettyPrinter->prettyPrintFile($stmts), "\n"; + } elseif ('json-dump' === $operation) { + fwrite(STDERR, "==> JSON dump:\n"); + echo json_encode($stmts, JSON_PRETTY_PRINT), "\n"; + } elseif ('var-dump' === $operation) { + fwrite(STDERR, "==> var_dump():\n"); + var_dump($stmts); + } elseif ('resolve-names' === $operation) { + fwrite(STDERR, "==> Resolved names.\n"); + $stmts = $traverser->traverse($stmts); + } + } +} + +function formatErrorMessage(PhpParser\Error $e, $code, $withColumnInfo) { + if ($withColumnInfo && $e->hasColumnInfo()) { + return $e->getMessageWithColumnInfo($code); + } else { + return $e->getMessage(); + } +} + +function showHelp($error = '') { + if ($error) { + fwrite(STDERR, $error . "\n\n"); + } + fwrite($error ? STDERR : STDOUT, << false, + 'with-positions' => false, + 'with-recovery' => false, + ]; + + array_shift($args); + $parseOptions = true; + foreach ($args as $arg) { + if (!$parseOptions) { + $files[] = $arg; + continue; + } + + switch ($arg) { + case '--dump': + case '-d': + $operations[] = 'dump'; + break; + case '--pretty-print': + case '-p': + $operations[] = 'pretty-print'; + break; + case '--json-dump': + case '-j': + $operations[] = 'json-dump'; + break; + case '--var-dump': + $operations[] = 'var-dump'; + break; + case '--resolve-names': + case '-N'; + $operations[] = 'resolve-names'; + break; + case '--with-column-info': + case '-c'; + $attributes['with-column-info'] = true; + break; + case '--with-positions': + case '-P': + $attributes['with-positions'] = true; + break; + case '--with-recovery': + case '-r': + $attributes['with-recovery'] = true; + break; + case '--help': + case '-h'; + showHelp(); + break; + case '--': + $parseOptions = false; + break; + default: + if ($arg[0] === '-') { + showHelp("Invalid operation $arg."); + } else { + $files[] = $arg; + } + } + } + + return [$operations, $files, $attributes]; +} diff --git a/vendor/nikic/php-parser/composer.json b/vendor/nikic/php-parser/composer.json new file mode 100644 index 00000000..2fd064a2 --- /dev/null +++ b/vendor/nikic/php-parser/composer.json @@ -0,0 +1,41 @@ +{ + "name": "nikic/php-parser", + "type": "library", + "description": "A PHP parser written in PHP", + "keywords": [ + "php", + "parser" + ], + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Nikita Popov" + } + ], + "require": { + "php": ">=7.0", + "ext-tokenizer": "*" + }, + "require-dev": { + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0", + "ircmaxell/php-yacc": "^0.0.7" + }, + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "autoload-dev": { + "psr-4": { + "PhpParser\\": "test/PhpParser/" + } + }, + "bin": [ + "bin/php-parse" + ] +} diff --git a/vendor/nikic/php-parser/grammar/README.md b/vendor/nikic/php-parser/grammar/README.md new file mode 100644 index 00000000..4bae11d8 --- /dev/null +++ b/vendor/nikic/php-parser/grammar/README.md @@ -0,0 +1,30 @@ +What do all those files mean? +============================= + + * `php5.y`: PHP 5 grammar written in a pseudo language + * `php7.y`: PHP 7 grammar written in a pseudo language + * `tokens.y`: Tokens definition shared between PHP 5 and PHP 7 grammars + * `parser.template`: A `kmyacc` parser prototype file for PHP + * `tokens.template`: A `kmyacc` prototype file for the `Tokens` class + * `rebuildParsers.php`: Preprocesses the grammar and builds the parser using `kmyacc` + +.phpy pseudo language +===================== + +The `.y` file is a normal grammar in `kmyacc` (`yacc`) style, with some transformations +applied to it: + + * Nodes are created using the syntax `Name[..., ...]`. This is transformed into + `new Name(..., ..., attributes())` + * Some function-like constructs are resolved (see `rebuildParsers.php` for a list) + +Building the parser +=================== + +Run `php grammar/rebuildParsers.php` to rebuild the parsers. Additional options: + + * The `KMYACC` environment variable can be used to specify an alternative `kmyacc` binary. + By default the `phpyacc` dev dependency will be used. To use the original `kmyacc`, you + need to compile [moriyoshi's fork](https://github.com/moriyoshi/kmyacc-forked). + * The `--debug` option enables emission of debug symbols and creates the `y.output` file. + * The `--keep-tmp-grammar` option preserves the preprocessed grammar file. diff --git a/vendor/nikic/php-parser/grammar/parser.template b/vendor/nikic/php-parser/grammar/parser.template new file mode 100644 index 00000000..6166607c --- /dev/null +++ b/vendor/nikic/php-parser/grammar/parser.template @@ -0,0 +1,106 @@ +semValue +#semval($,%t) $this->semValue +#semval(%n) $stackPos-(%l-%n) +#semval(%n,%t) $stackPos-(%l-%n) + +namespace PhpParser\Parser; + +use PhpParser\Error; +use PhpParser\Node; +use PhpParser\Node\Expr; +use PhpParser\Node\Name; +use PhpParser\Node\Scalar; +use PhpParser\Node\Stmt; +#include; + +/* This is an automatically GENERATED file, which should not be manually edited. + * Instead edit one of the following: + * * the grammar files grammar/php5.y or grammar/php7.y + * * the skeleton file grammar/parser.template + * * the preprocessing script grammar/rebuildParsers.php + */ +class #(-p) extends \PhpParser\ParserAbstract +{ + protected $tokenToSymbolMapSize = #(YYMAXLEX); + protected $actionTableSize = #(YYLAST); + protected $gotoTableSize = #(YYGLAST); + + protected $invalidSymbol = #(YYBADCH); + protected $errorSymbol = #(YYINTERRTOK); + protected $defaultAction = #(YYDEFAULT); + protected $unexpectedTokenRule = #(YYUNEXPECTED); + + protected $YY2TBLSTATE = #(YY2TBLSTATE); + protected $numNonLeafStates = #(YYNLSTATES); + + protected $symbolToName = array( + #listvar terminals + ); + + protected $tokenToSymbol = array( + #listvar yytranslate + ); + + protected $action = array( + #listvar yyaction + ); + + protected $actionCheck = array( + #listvar yycheck + ); + + protected $actionBase = array( + #listvar yybase + ); + + protected $actionDefault = array( + #listvar yydefault + ); + + protected $goto = array( + #listvar yygoto + ); + + protected $gotoCheck = array( + #listvar yygcheck + ); + + protected $gotoBase = array( + #listvar yygbase + ); + + protected $gotoDefault = array( + #listvar yygdefault + ); + + protected $ruleToNonTerminal = array( + #listvar yylhs + ); + + protected $ruleToLength = array( + #listvar yylen + ); +#if -t + + protected $productions = array( + #production-strings; + ); +#endif + + protected function initReduceCallbacks() { + $this->reduceCallbacks = [ +#reduce + %n => function ($stackPos) { + %b + }, +#noact + %n => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, +#endreduce + ]; + } +} +#tailcode; diff --git a/vendor/nikic/php-parser/grammar/php5.y b/vendor/nikic/php-parser/grammar/php5.y new file mode 100644 index 00000000..a62e9a31 --- /dev/null +++ b/vendor/nikic/php-parser/grammar/php5.y @@ -0,0 +1,1036 @@ +%pure_parser +%expect 6 + +%tokens + +%% + +start: + top_statement_list { $$ = $this->handleNamespaces($1); } +; + +top_statement_list_ex: + top_statement_list_ex top_statement { pushNormalizing($1, $2); } + | /* empty */ { init(); } +; + +top_statement_list: + top_statement_list_ex + { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); + if ($nop !== null) { $1[] = $nop; } $$ = $1; } +; + +ampersand: + T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG + | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG +; + +reserved_non_modifiers: + T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND + | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE + | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH + | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO + | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT + | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS + | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN + | T_MATCH +; + +semi_reserved: + reserved_non_modifiers + | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC +; + +identifier_ex: + T_STRING { $$ = Node\Identifier[$1]; } + | semi_reserved { $$ = Node\Identifier[$1]; } +; + +identifier: + T_STRING { $$ = Node\Identifier[$1]; } +; + +reserved_non_modifiers_identifier: + reserved_non_modifiers { $$ = Node\Identifier[$1]; } +; + +namespace_name: + T_STRING { $$ = Name[$1]; } + | T_NAME_QUALIFIED { $$ = Name[$1]; } +; + +legacy_namespace_name: + namespace_name { $$ = $1; } + | T_NAME_FULLY_QUALIFIED { $$ = Name[substr($1, 1)]; } +; + +plain_variable: + T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; } +; + +top_statement: + statement { $$ = $1; } + | function_declaration_statement { $$ = $1; } + | class_declaration_statement { $$ = $1; } + | T_HALT_COMPILER + { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; } + | T_NAMESPACE namespace_name ';' + { $$ = Stmt\Namespace_[$2, null]; + $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $this->checkNamespace($$); } + | T_NAMESPACE namespace_name '{' top_statement_list '}' + { $$ = Stmt\Namespace_[$2, $4]; + $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($$); } + | T_NAMESPACE '{' top_statement_list '}' + { $$ = Stmt\Namespace_[null, $3]; + $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($$); } + | T_USE use_declarations ';' { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; } + | T_USE use_type use_declarations ';' { $$ = Stmt\Use_[$3, $2]; } + | group_use_declaration ';' { $$ = $1; } + | T_CONST constant_declaration_list ';' { $$ = Stmt\Const_[$2]; } +; + +use_type: + T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; } + | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; } +; + +group_use_declaration: + T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}' + { $$ = Stmt\GroupUse[$3, $6, $2]; } + | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}' + { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; } +; + +unprefixed_use_declarations: + unprefixed_use_declarations ',' unprefixed_use_declaration + { push($1, $3); } + | unprefixed_use_declaration { init($1); } +; + +use_declarations: + use_declarations ',' use_declaration { push($1, $3); } + | use_declaration { init($1); } +; + +inline_use_declarations: + inline_use_declarations ',' inline_use_declaration { push($1, $3); } + | inline_use_declaration { init($1); } +; + +unprefixed_use_declaration: + namespace_name + { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } + | namespace_name T_AS identifier + { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } +; + +use_declaration: + legacy_namespace_name + { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } + | legacy_namespace_name T_AS identifier + { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } +; + +inline_use_declaration: + unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; } + | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; } +; + +constant_declaration_list: + constant_declaration_list ',' constant_declaration { push($1, $3); } + | constant_declaration { init($1); } +; + +constant_declaration: + identifier '=' static_scalar { $$ = Node\Const_[$1, $3]; } +; + +class_const_list: + class_const_list ',' class_const { push($1, $3); } + | class_const { init($1); } +; + +class_const: + identifier_ex '=' static_scalar { $$ = Node\Const_[$1, $3]; } +; + +inner_statement_list_ex: + inner_statement_list_ex inner_statement { pushNormalizing($1, $2); } + | /* empty */ { init(); } +; + +inner_statement_list: + inner_statement_list_ex + { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); + if ($nop !== null) { $1[] = $nop; } $$ = $1; } +; + +inner_statement: + statement { $$ = $1; } + | function_declaration_statement { $$ = $1; } + | class_declaration_statement { $$ = $1; } + | T_HALT_COMPILER + { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); } +; + +non_empty_statement: + '{' inner_statement_list '}' + { + if ($2) { + $$ = $2; prependLeadingComments($$); + } else { + makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); + if (null === $$) { $$ = array(); } + } + } + | T_IF parentheses_expr statement elseif_list else_single + { $$ = Stmt\If_[$2, ['stmts' => toArray($3), 'elseifs' => $4, 'else' => $5]]; } + | T_IF parentheses_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' + { $$ = Stmt\If_[$2, ['stmts' => $4, 'elseifs' => $5, 'else' => $6]]; } + | T_WHILE parentheses_expr while_statement { $$ = Stmt\While_[$2, $3]; } + | T_DO statement T_WHILE parentheses_expr ';' { $$ = Stmt\Do_ [$4, toArray($2)]; } + | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement + { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; } + | T_SWITCH parentheses_expr switch_case_list { $$ = Stmt\Switch_[$2, $3]; } + | T_BREAK ';' { $$ = Stmt\Break_[null]; } + | T_BREAK expr ';' { $$ = Stmt\Break_[$2]; } + | T_CONTINUE ';' { $$ = Stmt\Continue_[null]; } + | T_CONTINUE expr ';' { $$ = Stmt\Continue_[$2]; } + | T_RETURN ';' { $$ = Stmt\Return_[null]; } + | T_RETURN expr ';' { $$ = Stmt\Return_[$2]; } + | T_GLOBAL global_var_list ';' { $$ = Stmt\Global_[$2]; } + | T_STATIC static_var_list ';' { $$ = Stmt\Static_[$2]; } + | T_ECHO expr_list ';' { $$ = Stmt\Echo_[$2]; } + | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; } + | yield_expr ';' { $$ = Stmt\Expression[$1]; } + | expr ';' { $$ = Stmt\Expression[$1]; } + | T_UNSET '(' variables_list ')' ';' { $$ = Stmt\Unset_[$3]; } + | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement + { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; } + | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement + { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; } + | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; } + | T_TRY '{' inner_statement_list '}' catches optional_finally + { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); } + | T_THROW expr ';' { $$ = Stmt\Throw_[$2]; } + | T_GOTO identifier ';' { $$ = Stmt\Goto_[$2]; } + | identifier ':' { $$ = Stmt\Label[$1]; } + | expr error { $$ = Stmt\Expression[$1]; } + | error { $$ = array(); /* means: no statement */ } +; + +statement: + non_empty_statement { $$ = $1; } + | ';' + { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); + if ($$ === null) $$ = array(); /* means: no statement */ } +; + +catches: + /* empty */ { init(); } + | catches catch { push($1, $2); } +; + +catch: + T_CATCH '(' name plain_variable ')' '{' inner_statement_list '}' + { $$ = Stmt\Catch_[array($3), $4, $7]; } +; + +optional_finally: + /* empty */ { $$ = null; } + | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; } +; + +variables_list: + variable { init($1); } + | variables_list ',' variable { push($1, $3); } +; + +optional_ref: + /* empty */ { $$ = false; } + | ampersand { $$ = true; } +; + +optional_arg_ref: + /* empty */ { $$ = false; } + | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG { $$ = true; } +; + +optional_ellipsis: + /* empty */ { $$ = false; } + | T_ELLIPSIS { $$ = true; } +; + +function_declaration_statement: + T_FUNCTION optional_ref identifier '(' parameter_list ')' optional_return_type '{' inner_statement_list '}' + { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $9]]; } +; + +class_declaration_statement: + class_entry_type identifier extends_from implements_list '{' class_statement_list '}' + { $$ = Stmt\Class_[$2, ['type' => $1, 'extends' => $3, 'implements' => $4, 'stmts' => $6]]; + $this->checkClass($$, #2); } + | T_INTERFACE identifier interface_extends_list '{' class_statement_list '}' + { $$ = Stmt\Interface_[$2, ['extends' => $3, 'stmts' => $5]]; + $this->checkInterface($$, #2); } + | T_TRAIT identifier '{' class_statement_list '}' + { $$ = Stmt\Trait_[$2, ['stmts' => $4]]; } +; + +class_entry_type: + T_CLASS { $$ = 0; } + | T_ABSTRACT T_CLASS { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } + | T_FINAL T_CLASS { $$ = Stmt\Class_::MODIFIER_FINAL; } +; + +extends_from: + /* empty */ { $$ = null; } + | T_EXTENDS class_name { $$ = $2; } +; + +interface_extends_list: + /* empty */ { $$ = array(); } + | T_EXTENDS class_name_list { $$ = $2; } +; + +implements_list: + /* empty */ { $$ = array(); } + | T_IMPLEMENTS class_name_list { $$ = $2; } +; + +class_name_list: + class_name { init($1); } + | class_name_list ',' class_name { push($1, $3); } +; + +for_statement: + statement { $$ = toArray($1); } + | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } +; + +foreach_statement: + statement { $$ = toArray($1); } + | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } +; + +declare_statement: + non_empty_statement { $$ = toArray($1); } + | ';' { $$ = null; } + | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } +; + +declare_list: + declare_list_element { init($1); } + | declare_list ',' declare_list_element { push($1, $3); } +; + +declare_list_element: + identifier '=' static_scalar { $$ = Stmt\DeclareDeclare[$1, $3]; } +; + +switch_case_list: + '{' case_list '}' { $$ = $2; } + | '{' ';' case_list '}' { $$ = $3; } + | ':' case_list T_ENDSWITCH ';' { $$ = $2; } + | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } +; + +case_list: + /* empty */ { init(); } + | case_list case { push($1, $2); } +; + +case: + T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; } + | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; } +; + +case_separator: + ':' + | ';' +; + +while_statement: + statement { $$ = toArray($1); } + | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } +; + +elseif_list: + /* empty */ { init(); } + | elseif_list elseif { push($1, $2); } +; + +elseif: + T_ELSEIF parentheses_expr statement { $$ = Stmt\ElseIf_[$2, toArray($3)]; } +; + +new_elseif_list: + /* empty */ { init(); } + | new_elseif_list new_elseif { push($1, $2); } +; + +new_elseif: + T_ELSEIF parentheses_expr ':' inner_statement_list { $$ = Stmt\ElseIf_[$2, $4]; } +; + +else_single: + /* empty */ { $$ = null; } + | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; } +; + +new_else_single: + /* empty */ { $$ = null; } + | T_ELSE ':' inner_statement_list { $$ = Stmt\Else_[$3]; } +; + +foreach_variable: + variable { $$ = array($1, false); } + | ampersand variable { $$ = array($2, true); } + | list_expr { $$ = array($1, false); } +; + +parameter_list: + non_empty_parameter_list { $$ = $1; } + | /* empty */ { $$ = array(); } +; + +non_empty_parameter_list: + parameter { init($1); } + | non_empty_parameter_list ',' parameter { push($1, $3); } +; + +parameter: + optional_param_type optional_arg_ref optional_ellipsis plain_variable + { $$ = Node\Param[$4, null, $1, $2, $3]; $this->checkParam($$); } + | optional_param_type optional_arg_ref optional_ellipsis plain_variable '=' static_scalar + { $$ = Node\Param[$4, $6, $1, $2, $3]; $this->checkParam($$); } +; + +type: + name { $$ = $1; } + | T_ARRAY { $$ = Node\Identifier['array']; } + | T_CALLABLE { $$ = Node\Identifier['callable']; } +; + +optional_param_type: + /* empty */ { $$ = null; } + | type { $$ = $1; } +; + +optional_return_type: + /* empty */ { $$ = null; } + | ':' type { $$ = $2; } +; + +argument_list: + '(' ')' { $$ = array(); } + | '(' non_empty_argument_list ')' { $$ = $2; } + | '(' yield_expr ')' { $$ = array(Node\Arg[$2, false, false]); } +; + +non_empty_argument_list: + argument { init($1); } + | non_empty_argument_list ',' argument { push($1, $3); } +; + +argument: + expr { $$ = Node\Arg[$1, false, false]; } + | ampersand variable { $$ = Node\Arg[$2, true, false]; } + | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; } +; + +global_var_list: + global_var_list ',' global_var { push($1, $3); } + | global_var { init($1); } +; + +global_var: + plain_variable { $$ = $1; } + | '$' variable { $$ = Expr\Variable[$2]; } + | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } +; + +static_var_list: + static_var_list ',' static_var { push($1, $3); } + | static_var { init($1); } +; + +static_var: + plain_variable { $$ = Stmt\StaticVar[$1, null]; } + | plain_variable '=' static_scalar { $$ = Stmt\StaticVar[$1, $3]; } +; + +class_statement_list_ex: + class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } } + | /* empty */ { init(); } +; + +class_statement_list: + class_statement_list_ex + { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); + if ($nop !== null) { $1[] = $nop; } $$ = $1; } +; + +class_statement: + variable_modifiers property_declaration_list ';' + { $$ = Stmt\Property[$1, $2]; $this->checkProperty($$, #1); } + | T_CONST class_const_list ';' { $$ = Stmt\ClassConst[$2, 0]; } + | method_modifiers T_FUNCTION optional_ref identifier_ex '(' parameter_list ')' optional_return_type method_body + { $$ = Stmt\ClassMethod[$4, ['type' => $1, 'byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9]]; + $this->checkClassMethod($$, #1); } + | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; } +; + +trait_adaptations: + ';' { $$ = array(); } + | '{' trait_adaptation_list '}' { $$ = $2; } +; + +trait_adaptation_list: + /* empty */ { init(); } + | trait_adaptation_list trait_adaptation { push($1, $2); } +; + +trait_adaptation: + trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';' + { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; } + | trait_method_reference T_AS member_modifier identifier_ex ';' + { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; } + | trait_method_reference T_AS member_modifier ';' + { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; } + | trait_method_reference T_AS identifier ';' + { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } + | trait_method_reference T_AS reserved_non_modifiers_identifier ';' + { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } +; + +trait_method_reference_fully_qualified: + name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = array($1, $3); } +; +trait_method_reference: + trait_method_reference_fully_qualified { $$ = $1; } + | identifier_ex { $$ = array(null, $1); } +; + +method_body: + ';' /* abstract method */ { $$ = null; } + | '{' inner_statement_list '}' { $$ = $2; } +; + +variable_modifiers: + non_empty_member_modifiers { $$ = $1; } + | T_VAR { $$ = 0; } +; + +method_modifiers: + /* empty */ { $$ = 0; } + | non_empty_member_modifiers { $$ = $1; } +; + +non_empty_member_modifiers: + member_modifier { $$ = $1; } + | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } +; + +member_modifier: + T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } + | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } + | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } + | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; } + | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } + | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } +; + +property_declaration_list: + property_declaration { init($1); } + | property_declaration_list ',' property_declaration { push($1, $3); } +; + +property_decl_name: + T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; } +; + +property_declaration: + property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; } + | property_decl_name '=' static_scalar { $$ = Stmt\PropertyProperty[$1, $3]; } +; + +expr_list: + expr_list ',' expr { push($1, $3); } + | expr { init($1); } +; + +for_expr: + /* empty */ { $$ = array(); } + | expr_list { $$ = $1; } +; + +expr: + variable { $$ = $1; } + | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; } + | variable '=' expr { $$ = Expr\Assign[$1, $3]; } + | variable '=' ampersand variable { $$ = Expr\AssignRef[$1, $4]; } + | variable '=' ampersand new_expr { $$ = Expr\AssignRef[$1, $4]; } + | new_expr { $$ = $1; } + | T_CLONE expr { $$ = Expr\Clone_[$2]; } + | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; } + | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; } + | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; } + | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; } + | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; } + | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; } + | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; } + | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; } + | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; } + | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; } + | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; } + | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; } + | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; } + | variable T_INC { $$ = Expr\PostInc[$1]; } + | T_INC variable { $$ = Expr\PreInc [$2]; } + | variable T_DEC { $$ = Expr\PostDec[$1]; } + | T_DEC variable { $$ = Expr\PreDec [$2]; } + | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } + | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } + | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } + | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } + | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } + | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } + | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } + | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } + | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } + | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; } + | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; } + | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; } + | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; } + | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; } + | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; } + | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } + | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } + | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; } + | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; } + | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; } + | '!' expr { $$ = Expr\BooleanNot[$2]; } + | '~' expr { $$ = Expr\BitwiseNot[$2]; } + | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; } + | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } + | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; } + | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } + | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; } + | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; } + | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } + | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; } + | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } + | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; } + | parentheses_expr { $$ = $1; } + /* we need a separate '(' new_expr ')' rule to avoid problems caused by a s/r conflict */ + | '(' new_expr ')' { $$ = $2; } + | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; } + | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; } + | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; } + | T_ISSET '(' variables_list ')' { $$ = Expr\Isset_[$3]; } + | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; } + | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; } + | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; } + | T_EVAL parentheses_expr { $$ = Expr\Eval_[$2]; } + | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; } + | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; } + | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; } + | T_DOUBLE_CAST expr + { $attrs = attributes(); + $attrs['kind'] = $this->getFloatCastKind($1); + $$ = new Expr\Cast\Double($2, $attrs); } + | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; } + | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; } + | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; } + | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; } + | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; } + | T_EXIT exit_expr + { $attrs = attributes(); + $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; + $$ = new Expr\Exit_($2, $attrs); } + | '@' expr { $$ = Expr\ErrorSuppress[$2]; } + | scalar { $$ = $1; } + | array_expr { $$ = $1; } + | scalar_dereference { $$ = $1; } + | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; } + | T_PRINT expr { $$ = Expr\Print_[$2]; } + | T_YIELD { $$ = Expr\Yield_[null, null]; } + | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; } + | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type + '{' inner_statement_list '}' + { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $9]]; } + | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type + '{' inner_statement_list '}' + { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $10]]; } +; + +parentheses_expr: + '(' expr ')' { $$ = $2; } + | '(' yield_expr ')' { $$ = $2; } +; + +yield_expr: + T_YIELD expr { $$ = Expr\Yield_[$2, null]; } + | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; } +; + +array_expr: + T_ARRAY '(' array_pair_list ')' + { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; + $$ = new Expr\Array_($3, $attrs); } + | '[' array_pair_list ']' + { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT; + $$ = new Expr\Array_($2, $attrs); } +; + +scalar_dereference: + array_expr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[Scalar\String_::fromString($1, attributes()), $3]; } + | constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + /* alternative array syntax missing intentionally */ +; + +anonymous_class: + T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' + { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $3, 'implements' => $4, 'stmts' => $6]], $2); + $this->checkClass($$[0], -1); } +; + +new_expr: + T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; } + | T_NEW anonymous_class + { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; } +; + +lexical_vars: + /* empty */ { $$ = array(); } + | T_USE '(' lexical_var_list ')' { $$ = $3; } +; + +lexical_var_list: + lexical_var { init($1); } + | lexical_var_list ',' lexical_var { push($1, $3); } +; + +lexical_var: + optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; } +; + +function_call: + name argument_list { $$ = Expr\FuncCall[$1, $2]; } + | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex argument_list + { $$ = Expr\StaticCall[$1, $3, $4]; } + | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}' argument_list + { $$ = Expr\StaticCall[$1, $4, $6]; } + | static_property argument_list + { $$ = $this->fixupPhp5StaticPropCall($1, $2, attributes()); } + | variable_without_objects argument_list + { $$ = Expr\FuncCall[$1, $2]; } + | function_call '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + /* alternative array syntax missing intentionally */ +; + +class_name: + T_STATIC { $$ = Name[$1]; } + | name { $$ = $1; } +; + +name: + T_STRING { $$ = Name[$1]; } + | T_NAME_QUALIFIED { $$ = Name[$1]; } + | T_NAME_FULLY_QUALIFIED { $$ = Name\FullyQualified[substr($1, 1)]; } + | T_NAME_RELATIVE { $$ = Name\Relative[substr($1, 10)]; } +; + +class_name_reference: + class_name { $$ = $1; } + | dynamic_class_name_reference { $$ = $1; } +; + +dynamic_class_name_reference: + object_access_for_dcnr { $$ = $1; } + | base_variable { $$ = $1; } +; + +class_name_or_var: + class_name { $$ = $1; } + | reference_variable { $$ = $1; } +; + +object_access_for_dcnr: + base_variable T_OBJECT_OPERATOR object_property + { $$ = Expr\PropertyFetch[$1, $3]; } + | object_access_for_dcnr T_OBJECT_OPERATOR object_property + { $$ = Expr\PropertyFetch[$1, $3]; } + | object_access_for_dcnr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | object_access_for_dcnr '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } +; + +exit_expr: + /* empty */ { $$ = null; } + | '(' ')' { $$ = null; } + | parentheses_expr { $$ = $1; } +; + +backticks_expr: + /* empty */ { $$ = array(); } + | T_ENCAPSED_AND_WHITESPACE + { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`', false)]); } + | encaps_list { parseEncapsed($1, '`', false); $$ = $1; } +; + +ctor_arguments: + /* empty */ { $$ = array(); } + | argument_list { $$ = $1; } +; + +common_scalar: + T_LNUMBER { $$ = $this->parseLNumber($1, attributes(), true); } + | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); } + | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes(), false); } + | T_LINE { $$ = Scalar\MagicConst\Line[]; } + | T_FILE { $$ = Scalar\MagicConst\File[]; } + | T_DIR { $$ = Scalar\MagicConst\Dir[]; } + | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; } + | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; } + | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; } + | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; } + | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; } + | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC + { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), false); } + | T_START_HEREDOC T_END_HEREDOC + { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), false); } +; + +static_scalar: + common_scalar { $$ = $1; } + | class_name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = Expr\ClassConstFetch[$1, $3]; } + | name { $$ = Expr\ConstFetch[$1]; } + | T_ARRAY '(' static_array_pair_list ')' { $$ = Expr\Array_[$3]; } + | '[' static_array_pair_list ']' { $$ = Expr\Array_[$2]; } + | static_operation { $$ = $1; } +; + +static_operation: + static_scalar T_BOOLEAN_OR static_scalar { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } + | static_scalar T_BOOLEAN_AND static_scalar { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } + | static_scalar T_LOGICAL_OR static_scalar { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } + | static_scalar T_LOGICAL_AND static_scalar { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } + | static_scalar T_LOGICAL_XOR static_scalar { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } + | static_scalar '|' static_scalar { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } + | static_scalar T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG static_scalar + { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } + | static_scalar T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG static_scalar + { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } + | static_scalar '^' static_scalar { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } + | static_scalar '.' static_scalar { $$ = Expr\BinaryOp\Concat [$1, $3]; } + | static_scalar '+' static_scalar { $$ = Expr\BinaryOp\Plus [$1, $3]; } + | static_scalar '-' static_scalar { $$ = Expr\BinaryOp\Minus [$1, $3]; } + | static_scalar '*' static_scalar { $$ = Expr\BinaryOp\Mul [$1, $3]; } + | static_scalar '/' static_scalar { $$ = Expr\BinaryOp\Div [$1, $3]; } + | static_scalar '%' static_scalar { $$ = Expr\BinaryOp\Mod [$1, $3]; } + | static_scalar T_SL static_scalar { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } + | static_scalar T_SR static_scalar { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } + | static_scalar T_POW static_scalar { $$ = Expr\BinaryOp\Pow [$1, $3]; } + | '+' static_scalar %prec T_INC { $$ = Expr\UnaryPlus [$2]; } + | '-' static_scalar %prec T_INC { $$ = Expr\UnaryMinus[$2]; } + | '!' static_scalar { $$ = Expr\BooleanNot[$2]; } + | '~' static_scalar { $$ = Expr\BitwiseNot[$2]; } + | static_scalar T_IS_IDENTICAL static_scalar { $$ = Expr\BinaryOp\Identical [$1, $3]; } + | static_scalar T_IS_NOT_IDENTICAL static_scalar { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } + | static_scalar T_IS_EQUAL static_scalar { $$ = Expr\BinaryOp\Equal [$1, $3]; } + | static_scalar T_IS_NOT_EQUAL static_scalar { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } + | static_scalar '<' static_scalar { $$ = Expr\BinaryOp\Smaller [$1, $3]; } + | static_scalar T_IS_SMALLER_OR_EQUAL static_scalar { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } + | static_scalar '>' static_scalar { $$ = Expr\BinaryOp\Greater [$1, $3]; } + | static_scalar T_IS_GREATER_OR_EQUAL static_scalar { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } + | static_scalar '?' static_scalar ':' static_scalar { $$ = Expr\Ternary[$1, $3, $5]; } + | static_scalar '?' ':' static_scalar { $$ = Expr\Ternary[$1, null, $4]; } + | static_scalar '[' static_scalar ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | '(' static_scalar ')' { $$ = $2; } +; + +constant: + name { $$ = Expr\ConstFetch[$1]; } + | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex + { $$ = Expr\ClassConstFetch[$1, $3]; } +; + +scalar: + common_scalar { $$ = $1; } + | constant { $$ = $1; } + | '"' encaps_list '"' + { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; + parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } + | T_START_HEREDOC encaps_list T_END_HEREDOC + { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } +; + +static_array_pair_list: + /* empty */ { $$ = array(); } + | non_empty_static_array_pair_list optional_comma { $$ = $1; } +; + +optional_comma: + /* empty */ + | ',' +; + +non_empty_static_array_pair_list: + non_empty_static_array_pair_list ',' static_array_pair { push($1, $3); } + | static_array_pair { init($1); } +; + +static_array_pair: + static_scalar T_DOUBLE_ARROW static_scalar { $$ = Expr\ArrayItem[$3, $1, false]; } + | static_scalar { $$ = Expr\ArrayItem[$1, null, false]; } +; + +variable: + object_access { $$ = $1; } + | base_variable { $$ = $1; } + | function_call { $$ = $1; } + | new_expr_array_deref { $$ = $1; } +; + +new_expr_array_deref: + '(' new_expr ')' '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$2, $5]; } + | new_expr_array_deref '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + /* alternative array syntax missing intentionally */ +; + +object_access: + variable_or_new_expr T_OBJECT_OPERATOR object_property + { $$ = Expr\PropertyFetch[$1, $3]; } + | variable_or_new_expr T_OBJECT_OPERATOR object_property argument_list + { $$ = Expr\MethodCall[$1, $3, $4]; } + | object_access argument_list { $$ = Expr\FuncCall[$1, $2]; } + | object_access '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | object_access '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } +; + +variable_or_new_expr: + variable { $$ = $1; } + | '(' new_expr ')' { $$ = $2; } +; + +variable_without_objects: + reference_variable { $$ = $1; } + | '$' variable_without_objects { $$ = Expr\Variable[$2]; } +; + +base_variable: + variable_without_objects { $$ = $1; } + | static_property { $$ = $1; } +; + +static_property: + class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' reference_variable + { $$ = Expr\StaticPropertyFetch[$1, $4]; } + | static_property_with_arrays { $$ = $1; } +; + +static_property_simple_name: + T_VARIABLE + { $var = parseVar($1); $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; } +; + +static_property_with_arrays: + class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_property_simple_name + { $$ = Expr\StaticPropertyFetch[$1, $3]; } + | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' '{' expr '}' + { $$ = Expr\StaticPropertyFetch[$1, $5]; } + | static_property_with_arrays '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | static_property_with_arrays '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } +; + +reference_variable: + reference_variable '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | reference_variable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | plain_variable { $$ = $1; } + | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } +; + +dim_offset: + /* empty */ { $$ = null; } + | expr { $$ = $1; } +; + +object_property: + identifier { $$ = $1; } + | '{' expr '}' { $$ = $2; } + | variable_without_objects { $$ = $1; } + | error { $$ = Expr\Error[]; $this->errorState = 2; } +; + +list_expr: + T_LIST '(' list_expr_elements ')' { $$ = Expr\List_[$3]; } +; + +list_expr_elements: + list_expr_elements ',' list_expr_element { push($1, $3); } + | list_expr_element { init($1); } +; + +list_expr_element: + variable { $$ = Expr\ArrayItem[$1, null, false]; } + | list_expr { $$ = Expr\ArrayItem[$1, null, false]; } + | /* empty */ { $$ = null; } +; + +array_pair_list: + /* empty */ { $$ = array(); } + | non_empty_array_pair_list optional_comma { $$ = $1; } +; + +non_empty_array_pair_list: + non_empty_array_pair_list ',' array_pair { push($1, $3); } + | array_pair { init($1); } +; + +array_pair: + expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } + | expr { $$ = Expr\ArrayItem[$1, null, false]; } + | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } + | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } + | T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; } +; + +encaps_list: + encaps_list encaps_var { push($1, $2); } + | encaps_list encaps_string_part { push($1, $2); } + | encaps_var { init($1); } + | encaps_string_part encaps_var { init($1, $2); } +; + +encaps_string_part: + T_ENCAPSED_AND_WHITESPACE { $$ = Scalar\EncapsedStringPart[$1]; } +; + +encaps_str_varname: + T_STRING_VARNAME { $$ = Expr\Variable[$1]; } +; + +encaps_var: + plain_variable { $$ = $1; } + | plain_variable '[' encaps_var_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | plain_variable T_OBJECT_OPERATOR identifier { $$ = Expr\PropertyFetch[$1, $3]; } + | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = Expr\Variable[$2]; } + | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = Expr\Variable[$2]; } + | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}' + { $$ = Expr\ArrayDimFetch[$2, $4]; } + | T_CURLY_OPEN variable '}' { $$ = $2; } +; + +encaps_var_offset: + T_STRING { $$ = Scalar\String_[$1]; } + | T_NUM_STRING { $$ = $this->parseNumString($1, attributes()); } + | plain_variable { $$ = $1; } +; + +%% diff --git a/vendor/nikic/php-parser/grammar/php7.y b/vendor/nikic/php-parser/grammar/php7.y new file mode 100644 index 00000000..087bc739 --- /dev/null +++ b/vendor/nikic/php-parser/grammar/php7.y @@ -0,0 +1,1204 @@ +%pure_parser +%expect 2 + +%tokens + +%% + +start: + top_statement_list { $$ = $this->handleNamespaces($1); } +; + +top_statement_list_ex: + top_statement_list_ex top_statement { pushNormalizing($1, $2); } + | /* empty */ { init(); } +; + +top_statement_list: + top_statement_list_ex + { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); + if ($nop !== null) { $1[] = $nop; } $$ = $1; } +; + +ampersand: + T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG + | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG +; + +reserved_non_modifiers: + T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND + | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE + | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH + | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO + | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT + | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS + | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN + | T_MATCH | T_ENUM +; + +semi_reserved: + reserved_non_modifiers + | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC | T_READONLY +; + +identifier_maybe_reserved: + T_STRING { $$ = Node\Identifier[$1]; } + | semi_reserved { $$ = Node\Identifier[$1]; } +; + +identifier_not_reserved: + T_STRING { $$ = Node\Identifier[$1]; } +; + +reserved_non_modifiers_identifier: + reserved_non_modifiers { $$ = Node\Identifier[$1]; } +; + +namespace_declaration_name: + T_STRING { $$ = Name[$1]; } + | semi_reserved { $$ = Name[$1]; } + | T_NAME_QUALIFIED { $$ = Name[$1]; } +; + +namespace_name: + T_STRING { $$ = Name[$1]; } + | T_NAME_QUALIFIED { $$ = Name[$1]; } +; + +legacy_namespace_name: + namespace_name { $$ = $1; } + | T_NAME_FULLY_QUALIFIED { $$ = Name[substr($1, 1)]; } +; + +plain_variable: + T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; } +; + +semi: + ';' { /* nothing */ } + | error { /* nothing */ } +; + +no_comma: + /* empty */ { /* nothing */ } + | ',' { $this->emitError(new Error('A trailing comma is not allowed here', attributes())); } +; + +optional_comma: + /* empty */ + | ',' +; + +attribute_decl: + class_name { $$ = Node\Attribute[$1, []]; } + | class_name argument_list { $$ = Node\Attribute[$1, $2]; } +; + +attribute_group: + attribute_decl { init($1); } + | attribute_group ',' attribute_decl { push($1, $3); } +; + +attribute: + T_ATTRIBUTE attribute_group optional_comma ']' { $$ = Node\AttributeGroup[$2]; } +; + +attributes: + attribute { init($1); } + | attributes attribute { push($1, $2); } +; + +optional_attributes: + /* empty */ { $$ = []; } + | attributes { $$ = $1; } +; + +top_statement: + statement { $$ = $1; } + | function_declaration_statement { $$ = $1; } + | class_declaration_statement { $$ = $1; } + | T_HALT_COMPILER + { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; } + | T_NAMESPACE namespace_declaration_name semi + { $$ = Stmt\Namespace_[$2, null]; + $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $this->checkNamespace($$); } + | T_NAMESPACE namespace_declaration_name '{' top_statement_list '}' + { $$ = Stmt\Namespace_[$2, $4]; + $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($$); } + | T_NAMESPACE '{' top_statement_list '}' + { $$ = Stmt\Namespace_[null, $3]; + $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($$); } + | T_USE use_declarations semi { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; } + | T_USE use_type use_declarations semi { $$ = Stmt\Use_[$3, $2]; } + | group_use_declaration semi { $$ = $1; } + | T_CONST constant_declaration_list semi { $$ = Stmt\Const_[$2]; } +; + +use_type: + T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; } + | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; } +; + +group_use_declaration: + T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}' + { $$ = Stmt\GroupUse[$3, $6, $2]; } + | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}' + { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; } +; + +unprefixed_use_declarations: + non_empty_unprefixed_use_declarations optional_comma { $$ = $1; } +; + +non_empty_unprefixed_use_declarations: + non_empty_unprefixed_use_declarations ',' unprefixed_use_declaration + { push($1, $3); } + | unprefixed_use_declaration { init($1); } +; + +use_declarations: + non_empty_use_declarations no_comma { $$ = $1; } +; + +non_empty_use_declarations: + non_empty_use_declarations ',' use_declaration { push($1, $3); } + | use_declaration { init($1); } +; + +inline_use_declarations: + non_empty_inline_use_declarations optional_comma { $$ = $1; } +; + +non_empty_inline_use_declarations: + non_empty_inline_use_declarations ',' inline_use_declaration + { push($1, $3); } + | inline_use_declaration { init($1); } +; + +unprefixed_use_declaration: + namespace_name + { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } + | namespace_name T_AS identifier_not_reserved + { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } +; + +use_declaration: + legacy_namespace_name + { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } + | legacy_namespace_name T_AS identifier_not_reserved + { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } +; + +inline_use_declaration: + unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; } + | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; } +; + +constant_declaration_list: + non_empty_constant_declaration_list no_comma { $$ = $1; } +; + +non_empty_constant_declaration_list: + non_empty_constant_declaration_list ',' constant_declaration + { push($1, $3); } + | constant_declaration { init($1); } +; + +constant_declaration: + identifier_not_reserved '=' expr { $$ = Node\Const_[$1, $3]; } +; + +class_const_list: + non_empty_class_const_list no_comma { $$ = $1; } +; + +non_empty_class_const_list: + non_empty_class_const_list ',' class_const { push($1, $3); } + | class_const { init($1); } +; + +class_const: + identifier_maybe_reserved '=' expr { $$ = Node\Const_[$1, $3]; } +; + +inner_statement_list_ex: + inner_statement_list_ex inner_statement { pushNormalizing($1, $2); } + | /* empty */ { init(); } +; + +inner_statement_list: + inner_statement_list_ex + { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); + if ($nop !== null) { $1[] = $nop; } $$ = $1; } +; + +inner_statement: + statement { $$ = $1; } + | function_declaration_statement { $$ = $1; } + | class_declaration_statement { $$ = $1; } + | T_HALT_COMPILER + { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); } +; + +non_empty_statement: + '{' inner_statement_list '}' + { + if ($2) { + $$ = $2; prependLeadingComments($$); + } else { + makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); + if (null === $$) { $$ = array(); } + } + } + | T_IF '(' expr ')' statement elseif_list else_single + { $$ = Stmt\If_[$3, ['stmts' => toArray($5), 'elseifs' => $6, 'else' => $7]]; } + | T_IF '(' expr ')' ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' + { $$ = Stmt\If_[$3, ['stmts' => $6, 'elseifs' => $7, 'else' => $8]]; } + | T_WHILE '(' expr ')' while_statement { $$ = Stmt\While_[$3, $5]; } + | T_DO statement T_WHILE '(' expr ')' ';' { $$ = Stmt\Do_ [$5, toArray($2)]; } + | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement + { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; } + | T_SWITCH '(' expr ')' switch_case_list { $$ = Stmt\Switch_[$3, $5]; } + | T_BREAK optional_expr semi { $$ = Stmt\Break_[$2]; } + | T_CONTINUE optional_expr semi { $$ = Stmt\Continue_[$2]; } + | T_RETURN optional_expr semi { $$ = Stmt\Return_[$2]; } + | T_GLOBAL global_var_list semi { $$ = Stmt\Global_[$2]; } + | T_STATIC static_var_list semi { $$ = Stmt\Static_[$2]; } + | T_ECHO expr_list_forbid_comma semi { $$ = Stmt\Echo_[$2]; } + | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; } + | expr semi { + $e = $1; + if ($e instanceof Expr\Throw_) { + // For backwards-compatibility reasons, convert throw in statement position into + // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). + $$ = Stmt\Throw_[$e->expr]; + } else { + $$ = Stmt\Expression[$e]; + } + } + | T_UNSET '(' variables_list ')' semi { $$ = Stmt\Unset_[$3]; } + | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement + { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; } + | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement + { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; } + | T_FOREACH '(' expr error ')' foreach_statement + { $$ = Stmt\Foreach_[$3, new Expr\Error(stackAttributes(#4)), ['stmts' => $6]]; } + | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; } + | T_TRY '{' inner_statement_list '}' catches optional_finally + { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); } + | T_GOTO identifier_not_reserved semi { $$ = Stmt\Goto_[$2]; } + | identifier_not_reserved ':' { $$ = Stmt\Label[$1]; } + | error { $$ = array(); /* means: no statement */ } +; + +statement: + non_empty_statement { $$ = $1; } + | ';' + { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); + if ($$ === null) $$ = array(); /* means: no statement */ } +; + +catches: + /* empty */ { init(); } + | catches catch { push($1, $2); } +; + +name_union: + name { init($1); } + | name_union '|' name { push($1, $3); } +; + +catch: + T_CATCH '(' name_union optional_plain_variable ')' '{' inner_statement_list '}' + { $$ = Stmt\Catch_[$3, $4, $7]; } +; + +optional_finally: + /* empty */ { $$ = null; } + | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; } +; + +variables_list: + non_empty_variables_list optional_comma { $$ = $1; } +; + +non_empty_variables_list: + variable { init($1); } + | non_empty_variables_list ',' variable { push($1, $3); } +; + +optional_ref: + /* empty */ { $$ = false; } + | ampersand { $$ = true; } +; + +optional_arg_ref: + /* empty */ { $$ = false; } + | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG { $$ = true; } +; + +optional_ellipsis: + /* empty */ { $$ = false; } + | T_ELLIPSIS { $$ = true; } +; + +block_or_error: + '{' inner_statement_list '}' { $$ = $2; } + | error { $$ = []; } +; + +function_declaration_statement: + T_FUNCTION optional_ref identifier_not_reserved '(' parameter_list ')' optional_return_type block_or_error + { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; } + | attributes T_FUNCTION optional_ref identifier_not_reserved '(' parameter_list ')' optional_return_type block_or_error + { $$ = Stmt\Function_[$4, ['byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; } +; + +class_declaration_statement: + optional_attributes class_entry_type identifier_not_reserved extends_from implements_list '{' class_statement_list '}' + { $$ = Stmt\Class_[$3, ['type' => $2, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]]; + $this->checkClass($$, #3); } + | optional_attributes T_INTERFACE identifier_not_reserved interface_extends_list '{' class_statement_list '}' + { $$ = Stmt\Interface_[$3, ['extends' => $4, 'stmts' => $6, 'attrGroups' => $1]]; + $this->checkInterface($$, #3); } + | optional_attributes T_TRAIT identifier_not_reserved '{' class_statement_list '}' + { $$ = Stmt\Trait_[$3, ['stmts' => $5, 'attrGroups' => $1]]; } + | optional_attributes T_ENUM identifier_not_reserved enum_scalar_type implements_list '{' class_statement_list '}' + { $$ = Stmt\Enum_[$3, ['scalarType' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]]; + $this->checkEnum($$, #3); } +; + +enum_scalar_type: + /* empty */ { $$ = null; } + | ':' type { $$ = $2; } + +enum_case_expr: + /* empty */ { $$ = null; } + | '=' expr { $$ = $2; } +; + +class_entry_type: + T_CLASS { $$ = 0; } + | class_modifiers T_CLASS { $$ = $1; } +; + +class_modifiers: + class_modifier { $$ = $1; } + | class_modifiers class_modifier { $this->checkClassModifier($1, $2, #2); $$ = $1 | $2; } +; + +class_modifier: + T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } + | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } + | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } +; + +extends_from: + /* empty */ { $$ = null; } + | T_EXTENDS class_name { $$ = $2; } +; + +interface_extends_list: + /* empty */ { $$ = array(); } + | T_EXTENDS class_name_list { $$ = $2; } +; + +implements_list: + /* empty */ { $$ = array(); } + | T_IMPLEMENTS class_name_list { $$ = $2; } +; + +class_name_list: + non_empty_class_name_list no_comma { $$ = $1; } +; + +non_empty_class_name_list: + class_name { init($1); } + | non_empty_class_name_list ',' class_name { push($1, $3); } +; + +for_statement: + statement { $$ = toArray($1); } + | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } +; + +foreach_statement: + statement { $$ = toArray($1); } + | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } +; + +declare_statement: + non_empty_statement { $$ = toArray($1); } + | ';' { $$ = null; } + | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } +; + +declare_list: + non_empty_declare_list no_comma { $$ = $1; } +; + +non_empty_declare_list: + declare_list_element { init($1); } + | non_empty_declare_list ',' declare_list_element { push($1, $3); } +; + +declare_list_element: + identifier_not_reserved '=' expr { $$ = Stmt\DeclareDeclare[$1, $3]; } +; + +switch_case_list: + '{' case_list '}' { $$ = $2; } + | '{' ';' case_list '}' { $$ = $3; } + | ':' case_list T_ENDSWITCH ';' { $$ = $2; } + | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } +; + +case_list: + /* empty */ { init(); } + | case_list case { push($1, $2); } +; + +case: + T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; } + | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; } +; + +case_separator: + ':' + | ';' +; + +match: + T_MATCH '(' expr ')' '{' match_arm_list '}' { $$ = Expr\Match_[$3, $6]; } +; + +match_arm_list: + /* empty */ { $$ = []; } + | non_empty_match_arm_list optional_comma { $$ = $1; } +; + +non_empty_match_arm_list: + match_arm { init($1); } + | non_empty_match_arm_list ',' match_arm { push($1, $3); } +; + +match_arm: + expr_list_allow_comma T_DOUBLE_ARROW expr { $$ = Node\MatchArm[$1, $3]; } + | T_DEFAULT optional_comma T_DOUBLE_ARROW expr { $$ = Node\MatchArm[null, $4]; } +; + +while_statement: + statement { $$ = toArray($1); } + | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } +; + +elseif_list: + /* empty */ { init(); } + | elseif_list elseif { push($1, $2); } +; + +elseif: + T_ELSEIF '(' expr ')' statement { $$ = Stmt\ElseIf_[$3, toArray($5)]; } +; + +new_elseif_list: + /* empty */ { init(); } + | new_elseif_list new_elseif { push($1, $2); } +; + +new_elseif: + T_ELSEIF '(' expr ')' ':' inner_statement_list { $$ = Stmt\ElseIf_[$3, $6]; } +; + +else_single: + /* empty */ { $$ = null; } + | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; } +; + +new_else_single: + /* empty */ { $$ = null; } + | T_ELSE ':' inner_statement_list { $$ = Stmt\Else_[$3]; } +; + +foreach_variable: + variable { $$ = array($1, false); } + | ampersand variable { $$ = array($2, true); } + | list_expr { $$ = array($1, false); } + | array_short_syntax { $$ = array($1, false); } +; + +parameter_list: + non_empty_parameter_list optional_comma { $$ = $1; } + | /* empty */ { $$ = array(); } +; + +non_empty_parameter_list: + parameter { init($1); } + | non_empty_parameter_list ',' parameter { push($1, $3); } +; + +optional_property_modifiers: + /* empty */ { $$ = 0; } + | optional_property_modifiers property_modifier + { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } +; + +property_modifier: + T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } + | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } + | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } + | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } +; + +parameter: + optional_attributes optional_property_modifiers optional_type_without_static + optional_arg_ref optional_ellipsis plain_variable + { $$ = new Node\Param($6, null, $3, $4, $5, attributes(), $2, $1); + $this->checkParam($$); } + | optional_attributes optional_property_modifiers optional_type_without_static + optional_arg_ref optional_ellipsis plain_variable '=' expr + { $$ = new Node\Param($6, $8, $3, $4, $5, attributes(), $2, $1); + $this->checkParam($$); } + | optional_attributes optional_property_modifiers optional_type_without_static + optional_arg_ref optional_ellipsis error + { $$ = new Node\Param(Expr\Error[], null, $3, $4, $5, attributes(), $2, $1); } +; + +type_expr: + type { $$ = $1; } + | '?' type { $$ = Node\NullableType[$2]; } + | union_type { $$ = Node\UnionType[$1]; } + | intersection_type { $$ = Node\IntersectionType[$1]; } +; + +type: + type_without_static { $$ = $1; } + | T_STATIC { $$ = Node\Name['static']; } +; + +type_without_static: + name { $$ = $this->handleBuiltinTypes($1); } + | T_ARRAY { $$ = Node\Identifier['array']; } + | T_CALLABLE { $$ = Node\Identifier['callable']; } +; + +union_type: + type '|' type { init($1, $3); } + | union_type '|' type { push($1, $3); } +; + +union_type_without_static: + type_without_static '|' type_without_static { init($1, $3); } + | union_type_without_static '|' type_without_static { push($1, $3); } +; + +intersection_type: + type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type { init($1, $3); } + | intersection_type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type + { push($1, $3); } +; + +intersection_type_without_static: + type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static + { init($1, $3); } + | intersection_type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static + { push($1, $3); } +; + +type_expr_without_static: + type_without_static { $$ = $1; } + | '?' type_without_static { $$ = Node\NullableType[$2]; } + | union_type_without_static { $$ = Node\UnionType[$1]; } + | intersection_type_without_static { $$ = Node\IntersectionType[$1]; } +; + +optional_type_without_static: + /* empty */ { $$ = null; } + | type_expr_without_static { $$ = $1; } +; + +optional_return_type: + /* empty */ { $$ = null; } + | ':' type_expr { $$ = $2; } + | ':' error { $$ = null; } +; + +argument_list: + '(' ')' { $$ = array(); } + | '(' non_empty_argument_list optional_comma ')' { $$ = $2; } + | '(' variadic_placeholder ')' { init($2); } +; + +variadic_placeholder: + T_ELLIPSIS { $$ = Node\VariadicPlaceholder[]; } +; + +non_empty_argument_list: + argument { init($1); } + | non_empty_argument_list ',' argument { push($1, $3); } +; + +argument: + expr { $$ = Node\Arg[$1, false, false]; } + | ampersand variable { $$ = Node\Arg[$2, true, false]; } + | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; } + | identifier_maybe_reserved ':' expr + { $$ = new Node\Arg($3, false, false, attributes(), $1); } +; + +global_var_list: + non_empty_global_var_list no_comma { $$ = $1; } +; + +non_empty_global_var_list: + non_empty_global_var_list ',' global_var { push($1, $3); } + | global_var { init($1); } +; + +global_var: + simple_variable { $$ = $1; } +; + +static_var_list: + non_empty_static_var_list no_comma { $$ = $1; } +; + +non_empty_static_var_list: + non_empty_static_var_list ',' static_var { push($1, $3); } + | static_var { init($1); } +; + +static_var: + plain_variable { $$ = Stmt\StaticVar[$1, null]; } + | plain_variable '=' expr { $$ = Stmt\StaticVar[$1, $3]; } +; + +class_statement_list_ex: + class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } } + | /* empty */ { init(); } +; + +class_statement_list: + class_statement_list_ex + { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); + if ($nop !== null) { $1[] = $nop; } $$ = $1; } +; + +class_statement: + optional_attributes variable_modifiers optional_type_without_static property_declaration_list semi + { $$ = new Stmt\Property($2, $4, attributes(), $3, $1); + $this->checkProperty($$, #2); } + | optional_attributes method_modifiers T_CONST class_const_list semi + { $$ = new Stmt\ClassConst($4, $2, attributes(), $1); + $this->checkClassConst($$, #2); } + | optional_attributes method_modifiers T_FUNCTION optional_ref identifier_maybe_reserved '(' parameter_list ')' + optional_return_type method_body + { $$ = Stmt\ClassMethod[$5, ['type' => $2, 'byRef' => $4, 'params' => $7, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; + $this->checkClassMethod($$, #2); } + | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; } + | optional_attributes T_CASE identifier_maybe_reserved enum_case_expr semi + { $$ = Stmt\EnumCase[$3, $4, $1]; } + | error { $$ = null; /* will be skipped */ } +; + +trait_adaptations: + ';' { $$ = array(); } + | '{' trait_adaptation_list '}' { $$ = $2; } +; + +trait_adaptation_list: + /* empty */ { init(); } + | trait_adaptation_list trait_adaptation { push($1, $2); } +; + +trait_adaptation: + trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';' + { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; } + | trait_method_reference T_AS member_modifier identifier_maybe_reserved ';' + { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; } + | trait_method_reference T_AS member_modifier ';' + { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; } + | trait_method_reference T_AS identifier_not_reserved ';' + { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } + | trait_method_reference T_AS reserved_non_modifiers_identifier ';' + { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } +; + +trait_method_reference_fully_qualified: + name T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved { $$ = array($1, $3); } +; +trait_method_reference: + trait_method_reference_fully_qualified { $$ = $1; } + | identifier_maybe_reserved { $$ = array(null, $1); } +; + +method_body: + ';' /* abstract method */ { $$ = null; } + | block_or_error { $$ = $1; } +; + +variable_modifiers: + non_empty_member_modifiers { $$ = $1; } + | T_VAR { $$ = 0; } +; + +method_modifiers: + /* empty */ { $$ = 0; } + | non_empty_member_modifiers { $$ = $1; } +; + +non_empty_member_modifiers: + member_modifier { $$ = $1; } + | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } +; + +member_modifier: + T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } + | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } + | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } + | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; } + | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } + | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } + | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } +; + +property_declaration_list: + non_empty_property_declaration_list no_comma { $$ = $1; } +; + +non_empty_property_declaration_list: + property_declaration { init($1); } + | non_empty_property_declaration_list ',' property_declaration + { push($1, $3); } +; + +property_decl_name: + T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; } +; + +property_declaration: + property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; } + | property_decl_name '=' expr { $$ = Stmt\PropertyProperty[$1, $3]; } +; + +expr_list_forbid_comma: + non_empty_expr_list no_comma { $$ = $1; } +; + +expr_list_allow_comma: + non_empty_expr_list optional_comma { $$ = $1; } +; + +non_empty_expr_list: + non_empty_expr_list ',' expr { push($1, $3); } + | expr { init($1); } +; + +for_expr: + /* empty */ { $$ = array(); } + | expr_list_forbid_comma { $$ = $1; } +; + +expr: + variable { $$ = $1; } + | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; } + | array_short_syntax '=' expr { $$ = Expr\Assign[$1, $3]; } + | variable '=' expr { $$ = Expr\Assign[$1, $3]; } + | variable '=' ampersand variable { $$ = Expr\AssignRef[$1, $4]; } + | new_expr { $$ = $1; } + | match { $$ = $1; } + | T_CLONE expr { $$ = Expr\Clone_[$2]; } + | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; } + | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; } + | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; } + | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; } + | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; } + | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; } + | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; } + | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; } + | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; } + | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; } + | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; } + | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; } + | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; } + | variable T_INC { $$ = Expr\PostInc[$1]; } + | T_INC variable { $$ = Expr\PreInc [$2]; } + | variable T_DEC { $$ = Expr\PostDec[$1]; } + | T_DEC variable { $$ = Expr\PreDec [$2]; } + | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } + | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } + | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } + | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } + | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } + | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } + | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } + | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } + | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } + | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; } + | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; } + | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; } + | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; } + | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; } + | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; } + | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } + | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } + | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; } + | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; } + | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; } + | '!' expr { $$ = Expr\BooleanNot[$2]; } + | '~' expr { $$ = Expr\BitwiseNot[$2]; } + | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; } + | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } + | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; } + | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } + | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; } + | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; } + | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } + | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; } + | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } + | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; } + | '(' expr ')' { $$ = $2; } + | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; } + | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; } + | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; } + | T_ISSET '(' expr_list_allow_comma ')' { $$ = Expr\Isset_[$3]; } + | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; } + | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; } + | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; } + | T_EVAL '(' expr ')' { $$ = Expr\Eval_[$3]; } + | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; } + | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; } + | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; } + | T_DOUBLE_CAST expr + { $attrs = attributes(); + $attrs['kind'] = $this->getFloatCastKind($1); + $$ = new Expr\Cast\Double($2, $attrs); } + | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; } + | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; } + | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; } + | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; } + | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; } + | T_EXIT exit_expr + { $attrs = attributes(); + $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; + $$ = new Expr\Exit_($2, $attrs); } + | '@' expr { $$ = Expr\ErrorSuppress[$2]; } + | scalar { $$ = $1; } + | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; } + | T_PRINT expr { $$ = Expr\Print_[$2]; } + | T_YIELD { $$ = Expr\Yield_[null, null]; } + | T_YIELD expr { $$ = Expr\Yield_[$2, null]; } + | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; } + | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; } + | T_THROW expr { $$ = Expr\Throw_[$2]; } + + | T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW + { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $2, 'params' => $4, 'returnType' => $6, 'expr' => $8, 'attrGroups' => []]]; } + | T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW + { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => []]]; } + | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error + { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; } + | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error + { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => []]]; } + + | attributes T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW + { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => $1]]; } + | attributes T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW + { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $4, 'params' => $6, 'returnType' => $8, 'expr' => $10, 'attrGroups' => $1]]; } + | attributes T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error + { $$ = Expr\Closure[['static' => false, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; } + | attributes T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error + { $$ = Expr\Closure[['static' => true, 'byRef' => $4, 'params' => $6, 'uses' => $8, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; } +; + +anonymous_class: + optional_attributes T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' + { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]], $3); + $this->checkClass($$[0], -1); } +; + +new_expr: + T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; } + | T_NEW anonymous_class + { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; } +; + +lexical_vars: + /* empty */ { $$ = array(); } + | T_USE '(' lexical_var_list ')' { $$ = $3; } +; + +lexical_var_list: + non_empty_lexical_var_list optional_comma { $$ = $1; } +; + +non_empty_lexical_var_list: + lexical_var { init($1); } + | non_empty_lexical_var_list ',' lexical_var { push($1, $3); } +; + +lexical_var: + optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; } +; + +function_call: + name argument_list { $$ = Expr\FuncCall[$1, $2]; } + | callable_expr argument_list { $$ = Expr\FuncCall[$1, $2]; } + | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM member_name argument_list + { $$ = Expr\StaticCall[$1, $3, $4]; } +; + +class_name: + T_STATIC { $$ = Name[$1]; } + | name { $$ = $1; } +; + +name: + T_STRING { $$ = Name[$1]; } + | T_NAME_QUALIFIED { $$ = Name[$1]; } + | T_NAME_FULLY_QUALIFIED { $$ = Name\FullyQualified[substr($1, 1)]; } + | T_NAME_RELATIVE { $$ = Name\Relative[substr($1, 10)]; } +; + +class_name_reference: + class_name { $$ = $1; } + | new_variable { $$ = $1; } + | '(' expr ')' { $$ = $2; } + | error { $$ = Expr\Error[]; $this->errorState = 2; } +; + +class_name_or_var: + class_name { $$ = $1; } + | fully_dereferencable { $$ = $1; } +; + +exit_expr: + /* empty */ { $$ = null; } + | '(' optional_expr ')' { $$ = $2; } +; + +backticks_expr: + /* empty */ { $$ = array(); } + | T_ENCAPSED_AND_WHITESPACE + { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`')]); } + | encaps_list { parseEncapsed($1, '`', true); $$ = $1; } +; + +ctor_arguments: + /* empty */ { $$ = array(); } + | argument_list { $$ = $1; } +; + +constant: + name { $$ = Expr\ConstFetch[$1]; } + | T_LINE { $$ = Scalar\MagicConst\Line[]; } + | T_FILE { $$ = Scalar\MagicConst\File[]; } + | T_DIR { $$ = Scalar\MagicConst\Dir[]; } + | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; } + | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; } + | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; } + | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; } + | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; } +; + +class_constant: + class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved + { $$ = Expr\ClassConstFetch[$1, $3]; } + /* We interpret an isolated FOO:: as an unfinished class constant fetch. It could also be + an unfinished static property fetch or unfinished scoped call. */ + | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM error + { $$ = Expr\ClassConstFetch[$1, new Expr\Error(stackAttributes(#3))]; $this->errorState = 2; } +; + +array_short_syntax: + '[' array_pair_list ']' + { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT; + $$ = new Expr\Array_($2, $attrs); } +; + +dereferencable_scalar: + T_ARRAY '(' array_pair_list ')' + { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; + $$ = new Expr\Array_($3, $attrs); } + | array_short_syntax { $$ = $1; } + | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes()); } + | '"' encaps_list '"' + { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; + parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } +; + +scalar: + T_LNUMBER { $$ = $this->parseLNumber($1, attributes()); } + | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); } + | dereferencable_scalar { $$ = $1; } + | constant { $$ = $1; } + | class_constant { $$ = $1; } + | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC + { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } + | T_START_HEREDOC T_END_HEREDOC + { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), true); } + | T_START_HEREDOC encaps_list T_END_HEREDOC + { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } +; + +optional_expr: + /* empty */ { $$ = null; } + | expr { $$ = $1; } +; + +fully_dereferencable: + variable { $$ = $1; } + | '(' expr ')' { $$ = $2; } + | dereferencable_scalar { $$ = $1; } + | class_constant { $$ = $1; } +; + +array_object_dereferencable: + fully_dereferencable { $$ = $1; } + | constant { $$ = $1; } +; + +callable_expr: + callable_variable { $$ = $1; } + | '(' expr ')' { $$ = $2; } + | dereferencable_scalar { $$ = $1; } +; + +callable_variable: + simple_variable { $$ = $1; } + | array_object_dereferencable '[' optional_expr ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | array_object_dereferencable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | function_call { $$ = $1; } + | array_object_dereferencable T_OBJECT_OPERATOR property_name argument_list + { $$ = Expr\MethodCall[$1, $3, $4]; } + | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name argument_list + { $$ = Expr\NullsafeMethodCall[$1, $3, $4]; } +; + +optional_plain_variable: + /* empty */ { $$ = null; } + | plain_variable { $$ = $1; } +; + +variable: + callable_variable { $$ = $1; } + | static_member { $$ = $1; } + | array_object_dereferencable T_OBJECT_OPERATOR property_name + { $$ = Expr\PropertyFetch[$1, $3]; } + | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name + { $$ = Expr\NullsafePropertyFetch[$1, $3]; } +; + +simple_variable: + plain_variable { $$ = $1; } + | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } + | '$' simple_variable { $$ = Expr\Variable[$2]; } + | '$' error { $$ = Expr\Variable[Expr\Error[]]; $this->errorState = 2; } +; + +static_member_prop_name: + simple_variable + { $var = $1->name; $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; } +; + +static_member: + class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name + { $$ = Expr\StaticPropertyFetch[$1, $3]; } +; + +new_variable: + simple_variable { $$ = $1; } + | new_variable '[' optional_expr ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | new_variable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | new_variable T_OBJECT_OPERATOR property_name { $$ = Expr\PropertyFetch[$1, $3]; } + | new_variable T_NULLSAFE_OBJECT_OPERATOR property_name { $$ = Expr\NullsafePropertyFetch[$1, $3]; } + | class_name T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name + { $$ = Expr\StaticPropertyFetch[$1, $3]; } + | new_variable T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name + { $$ = Expr\StaticPropertyFetch[$1, $3]; } +; + +member_name: + identifier_maybe_reserved { $$ = $1; } + | '{' expr '}' { $$ = $2; } + | simple_variable { $$ = $1; } +; + +property_name: + identifier_not_reserved { $$ = $1; } + | '{' expr '}' { $$ = $2; } + | simple_variable { $$ = $1; } + | error { $$ = Expr\Error[]; $this->errorState = 2; } +; + +list_expr: + T_LIST '(' inner_array_pair_list ')' { $$ = Expr\List_[$3]; } +; + +array_pair_list: + inner_array_pair_list + { $$ = $1; $end = count($$)-1; if ($$[$end] === null) array_pop($$); } +; + +comma_or_error: + ',' + | error + { /* do nothing -- prevent default action of $$=$1. See #551. */ } +; + +inner_array_pair_list: + inner_array_pair_list comma_or_error array_pair { push($1, $3); } + | array_pair { init($1); } +; + +array_pair: + expr { $$ = Expr\ArrayItem[$1, null, false]; } + | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } + | list_expr { $$ = Expr\ArrayItem[$1, null, false]; } + | expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } + | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } + | expr T_DOUBLE_ARROW list_expr { $$ = Expr\ArrayItem[$3, $1, false]; } + | T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; } + | /* empty */ { $$ = null; } +; + +encaps_list: + encaps_list encaps_var { push($1, $2); } + | encaps_list encaps_string_part { push($1, $2); } + | encaps_var { init($1); } + | encaps_string_part encaps_var { init($1, $2); } +; + +encaps_string_part: + T_ENCAPSED_AND_WHITESPACE { $$ = Scalar\EncapsedStringPart[$1]; } +; + +encaps_str_varname: + T_STRING_VARNAME { $$ = Expr\Variable[$1]; } +; + +encaps_var: + plain_variable { $$ = $1; } + | plain_variable '[' encaps_var_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } + | plain_variable T_OBJECT_OPERATOR identifier_not_reserved + { $$ = Expr\PropertyFetch[$1, $3]; } + | plain_variable T_NULLSAFE_OBJECT_OPERATOR identifier_not_reserved + { $$ = Expr\NullsafePropertyFetch[$1, $3]; } + | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = Expr\Variable[$2]; } + | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = Expr\Variable[$2]; } + | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}' + { $$ = Expr\ArrayDimFetch[$2, $4]; } + | T_CURLY_OPEN variable '}' { $$ = $2; } +; + +encaps_var_offset: + T_STRING { $$ = Scalar\String_[$1]; } + | T_NUM_STRING { $$ = $this->parseNumString($1, attributes()); } + | '-' T_NUM_STRING { $$ = $this->parseNumString('-' . $2, attributes()); } + | plain_variable { $$ = $1; } +; + +%% diff --git a/vendor/nikic/php-parser/grammar/phpyLang.php b/vendor/nikic/php-parser/grammar/phpyLang.php new file mode 100644 index 00000000..663c2a14 --- /dev/null +++ b/vendor/nikic/php-parser/grammar/phpyLang.php @@ -0,0 +1,184 @@ +\'[^\\\\\']*+(?:\\\\.[^\\\\\']*+)*+\') + (?"[^\\\\"]*+(?:\\\\.[^\\\\"]*+)*+") + (?(?&singleQuotedString)|(?&doubleQuotedString)) + (?/\*[^*]*+(?:\*(?!/)[^*]*+)*+\*/) + (?\{[^\'"/{}]*+(?:(?:(?&string)|(?&comment)|(?&code)|/)[^\'"/{}]*+)*+}) +)'; + +const PARAMS = '\[(?[^[\]]*+(?:\[(?¶ms)\][^[\]]*+)*+)\]'; +const ARGS = '\((?[^()]*+(?:\((?&args)\)[^()]*+)*+)\)'; + +/////////////////////////////// +/// Preprocessing functions /// +/////////////////////////////// + +function preprocessGrammar($code) { + $code = resolveNodes($code); + $code = resolveMacros($code); + $code = resolveStackAccess($code); + + return $code; +} + +function resolveNodes($code) { + return preg_replace_callback( + '~\b(?[A-Z][a-zA-Z_\\\\]++)\s*' . PARAMS . '~', + function($matches) { + // recurse + $matches['params'] = resolveNodes($matches['params']); + + $params = magicSplit( + '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,', + $matches['params'] + ); + + $paramCode = ''; + foreach ($params as $param) { + $paramCode .= $param . ', '; + } + + return 'new ' . $matches['name'] . '(' . $paramCode . 'attributes())'; + }, + $code + ); +} + +function resolveMacros($code) { + return preg_replace_callback( + '~\b(?)(?!array\()(?[a-z][A-Za-z]++)' . ARGS . '~', + function($matches) { + // recurse + $matches['args'] = resolveMacros($matches['args']); + + $name = $matches['name']; + $args = magicSplit( + '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,', + $matches['args'] + ); + + if ('attributes' === $name) { + assertArgs(0, $args, $name); + return '$this->startAttributeStack[#1] + $this->endAttributes'; + } + + if ('stackAttributes' === $name) { + assertArgs(1, $args, $name); + return '$this->startAttributeStack[' . $args[0] . ']' + . ' + $this->endAttributeStack[' . $args[0] . ']'; + } + + if ('init' === $name) { + return '$$ = array(' . implode(', ', $args) . ')'; + } + + if ('push' === $name) { + assertArgs(2, $args, $name); + + return $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0]; + } + + if ('pushNormalizing' === $name) { + assertArgs(2, $args, $name); + + return 'if (is_array(' . $args[1] . ')) { $$ = array_merge(' . $args[0] . ', ' . $args[1] . '); }' + . ' else { ' . $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0] . '; }'; + } + + if ('toArray' == $name) { + assertArgs(1, $args, $name); + + return 'is_array(' . $args[0] . ') ? ' . $args[0] . ' : array(' . $args[0] . ')'; + } + + if ('parseVar' === $name) { + assertArgs(1, $args, $name); + + return 'substr(' . $args[0] . ', 1)'; + } + + if ('parseEncapsed' === $name) { + assertArgs(3, $args, $name); + + return 'foreach (' . $args[0] . ' as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) {' + . ' $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, ' . $args[1] . ', ' . $args[2] . '); } }'; + } + + if ('makeNop' === $name) { + assertArgs(3, $args, $name); + + return '$startAttributes = ' . $args[1] . ';' + . ' if (isset($startAttributes[\'comments\']))' + . ' { ' . $args[0] . ' = new Stmt\Nop($startAttributes + ' . $args[2] . '); }' + . ' else { ' . $args[0] . ' = null; }'; + } + + if ('makeZeroLengthNop' == $name) { + assertArgs(2, $args, $name); + + return '$startAttributes = ' . $args[1] . ';' + . ' if (isset($startAttributes[\'comments\']))' + . ' { ' . $args[0] . ' = new Stmt\Nop($this->createCommentNopAttributes($startAttributes[\'comments\'])); }' + . ' else { ' . $args[0] . ' = null; }'; + } + + if ('prependLeadingComments' === $name) { + assertArgs(1, $args, $name); + + return '$attrs = $this->startAttributeStack[#1]; $stmts = ' . $args[0] . '; ' + . 'if (!empty($attrs[\'comments\'])) {' + . '$stmts[0]->setAttribute(\'comments\', ' + . 'array_merge($attrs[\'comments\'], $stmts[0]->getAttribute(\'comments\', []))); }'; + } + + return $matches[0]; + }, + $code + ); +} + +function assertArgs($num, $args, $name) { + if ($num != count($args)) { + die('Wrong argument count for ' . $name . '().'); + } +} + +function resolveStackAccess($code) { + $code = preg_replace('/\$\d+/', '$this->semStack[$0]', $code); + $code = preg_replace('/#(\d+)/', '$$1', $code); + return $code; +} + +function removeTrailingWhitespace($code) { + $lines = explode("\n", $code); + $lines = array_map('rtrim', $lines); + return implode("\n", $lines); +} + +////////////////////////////// +/// Regex helper functions /// +////////////////////////////// + +function regex($regex) { + return '~' . LIB . '(?:' . str_replace('~', '\~', $regex) . ')~'; +} + +function magicSplit($regex, $string) { + $pieces = preg_split(regex('(?:(?&string)|(?&comment)|(?&code))(*SKIP)(*FAIL)|' . $regex), $string); + + foreach ($pieces as &$piece) { + $piece = trim($piece); + } + + if ($pieces === ['']) { + return []; + } + + return $pieces; +} diff --git a/vendor/nikic/php-parser/grammar/rebuildParsers.php b/vendor/nikic/php-parser/grammar/rebuildParsers.php new file mode 100644 index 00000000..2d0c6b14 --- /dev/null +++ b/vendor/nikic/php-parser/grammar/rebuildParsers.php @@ -0,0 +1,81 @@ + 'Php5', + __DIR__ . '/php7.y' => 'Php7', +]; + +$tokensFile = __DIR__ . '/tokens.y'; +$tokensTemplate = __DIR__ . '/tokens.template'; +$skeletonFile = __DIR__ . '/parser.template'; +$tmpGrammarFile = __DIR__ . '/tmp_parser.phpy'; +$tmpResultFile = __DIR__ . '/tmp_parser.php'; +$resultDir = __DIR__ . '/../lib/PhpParser/Parser'; +$tokensResultsFile = $resultDir . '/Tokens.php'; + +$kmyacc = getenv('KMYACC'); +if (!$kmyacc) { + // Use phpyacc from dev dependencies by default. + $kmyacc = __DIR__ . '/../vendor/bin/phpyacc'; +} + +$options = array_flip($argv); +$optionDebug = isset($options['--debug']); +$optionKeepTmpGrammar = isset($options['--keep-tmp-grammar']); + +/////////////////// +/// Main script /// +/////////////////// + +$tokens = file_get_contents($tokensFile); + +foreach ($grammarFileToName as $grammarFile => $name) { + echo "Building temporary $name grammar file.\n"; + + $grammarCode = file_get_contents($grammarFile); + $grammarCode = str_replace('%tokens', $tokens, $grammarCode); + $grammarCode = preprocessGrammar($grammarCode); + + file_put_contents($tmpGrammarFile, $grammarCode); + + $additionalArgs = $optionDebug ? '-t -v' : ''; + + echo "Building $name parser.\n"; + $output = execCmd("$kmyacc $additionalArgs -m $skeletonFile -p $name $tmpGrammarFile"); + + $resultCode = file_get_contents($tmpResultFile); + $resultCode = removeTrailingWhitespace($resultCode); + + ensureDirExists($resultDir); + file_put_contents("$resultDir/$name.php", $resultCode); + unlink($tmpResultFile); + + echo "Building token definition.\n"; + $output = execCmd("$kmyacc -m $tokensTemplate $tmpGrammarFile"); + rename($tmpResultFile, $tokensResultsFile); + + if (!$optionKeepTmpGrammar) { + unlink($tmpGrammarFile); + } +} + +//////////////////////////////// +/// Utility helper functions /// +//////////////////////////////// + +function ensureDirExists($dir) { + if (!is_dir($dir)) { + mkdir($dir, 0777, true); + } +} + +function execCmd($cmd) { + $output = trim(shell_exec("$cmd 2>&1")); + if ($output !== "") { + echo "> " . $cmd . "\n"; + echo $output; + } + return $output; +} diff --git a/vendor/nikic/php-parser/grammar/tokens.template b/vendor/nikic/php-parser/grammar/tokens.template new file mode 100644 index 00000000..ba4e4901 --- /dev/null +++ b/vendor/nikic/php-parser/grammar/tokens.template @@ -0,0 +1,17 @@ +semValue +#semval($,%t) $this->semValue +#semval(%n) $this->stackPos-(%l-%n) +#semval(%n,%t) $this->stackPos-(%l-%n) + +namespace PhpParser\Parser; +#include; + +/* GENERATED file based on grammar/tokens.y */ +final class Tokens +{ +#tokenval + const %s = %n; +#endtokenval +} diff --git a/vendor/nikic/php-parser/grammar/tokens.y b/vendor/nikic/php-parser/grammar/tokens.y new file mode 100644 index 00000000..8f0b2172 --- /dev/null +++ b/vendor/nikic/php-parser/grammar/tokens.y @@ -0,0 +1,115 @@ +/* We currently rely on the token ID mapping to be the same between PHP 5 and PHP 7 - so the same lexer can be used for + * both. This is enforced by sharing this token file. */ + +%right T_THROW +%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE +%left ',' +%left T_LOGICAL_OR +%left T_LOGICAL_XOR +%left T_LOGICAL_AND +%right T_PRINT +%right T_YIELD +%right T_DOUBLE_ARROW +%right T_YIELD_FROM +%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL +%left '?' ':' +%right T_COALESCE +%left T_BOOLEAN_OR +%left T_BOOLEAN_AND +%left '|' +%left '^' +%left T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG +%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL T_SPACESHIP +%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL +%left T_SL T_SR +%left '+' '-' '.' +%left '*' '/' '%' +%right '!' +%nonassoc T_INSTANCEOF +%right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@' +%right T_POW +%right '[' +%nonassoc T_NEW T_CLONE +%token T_EXIT +%token T_IF +%left T_ELSEIF +%left T_ELSE +%left T_ENDIF +%token T_LNUMBER +%token T_DNUMBER +%token T_STRING +%token T_STRING_VARNAME +%token T_VARIABLE +%token T_NUM_STRING +%token T_INLINE_HTML +%token T_ENCAPSED_AND_WHITESPACE +%token T_CONSTANT_ENCAPSED_STRING +%token T_ECHO +%token T_DO +%token T_WHILE +%token T_ENDWHILE +%token T_FOR +%token T_ENDFOR +%token T_FOREACH +%token T_ENDFOREACH +%token T_DECLARE +%token T_ENDDECLARE +%token T_AS +%token T_SWITCH +%token T_MATCH +%token T_ENDSWITCH +%token T_CASE +%token T_DEFAULT +%token T_BREAK +%token T_CONTINUE +%token T_GOTO +%token T_FUNCTION +%token T_FN +%token T_CONST +%token T_RETURN +%token T_TRY +%token T_CATCH +%token T_FINALLY +%token T_THROW +%token T_USE +%token T_INSTEADOF +%token T_GLOBAL +%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC T_READONLY +%token T_VAR +%token T_UNSET +%token T_ISSET +%token T_EMPTY +%token T_HALT_COMPILER +%token T_CLASS +%token T_TRAIT +%token T_INTERFACE +%token T_ENUM +%token T_EXTENDS +%token T_IMPLEMENTS +%token T_OBJECT_OPERATOR +%token T_NULLSAFE_OBJECT_OPERATOR +%token T_DOUBLE_ARROW +%token T_LIST +%token T_ARRAY +%token T_CALLABLE +%token T_CLASS_C +%token T_TRAIT_C +%token T_METHOD_C +%token T_FUNC_C +%token T_LINE +%token T_FILE +%token T_START_HEREDOC +%token T_END_HEREDOC +%token T_DOLLAR_OPEN_CURLY_BRACES +%token T_CURLY_OPEN +%token T_PAAMAYIM_NEKUDOTAYIM +%token T_NAMESPACE +%token T_NS_C +%token T_DIR +%token T_NS_SEPARATOR +%token T_ELLIPSIS +%token T_NAME_FULLY_QUALIFIED +%token T_NAME_QUALIFIED +%token T_NAME_RELATIVE +%token T_ATTRIBUTE +%token T_ENUM diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder.php b/vendor/nikic/php-parser/lib/PhpParser/Builder.php new file mode 100644 index 00000000..26d8921e --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder.php @@ -0,0 +1,13 @@ +constants = [new Const_($name, BuilderHelpers::normalizeValue($value))]; + } + + /** + * Add another constant to const group + * + * @param string|Identifier $name Name + * @param Node\Expr|bool|null|int|float|string|array $value Value + * + * @return $this The builder instance (for fluid interface) + */ + public function addConst($name, $value) { + $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value)); + + return $this; + } + + /** + * Makes the constant public. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePublic() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + + return $this; + } + + /** + * Makes the constant protected. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeProtected() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + + return $this; + } + + /** + * Makes the constant private. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePrivate() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + + return $this; + } + + /** + * Makes the constant final. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeFinal() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + + return $this; + } + + /** + * Sets doc comment for the constant. + * + * @param PhpParser\Comment\Doc|string $docComment Doc comment to set + * + * @return $this The builder instance (for fluid interface) + */ + public function setDocComment($docComment) { + $this->attributes = [ + 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] + ]; + + return $this; + } + + /** + * Adds an attribute group. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) + */ + public function addAttribute($attribute) { + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + + return $this; + } + + /** + * Returns the built class node. + * + * @return Stmt\ClassConst The built constant node + */ + public function getNode(): PhpParser\Node { + return new Stmt\ClassConst( + $this->constants, + $this->flags, + $this->attributes, + $this->attributeGroups + ); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php new file mode 100644 index 00000000..35b54d04 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php @@ -0,0 +1,146 @@ +name = $name; + } + + /** + * Extends a class. + * + * @param Name|string $class Name of class to extend + * + * @return $this The builder instance (for fluid interface) + */ + public function extend($class) { + $this->extends = BuilderHelpers::normalizeName($class); + + return $this; + } + + /** + * Implements one or more interfaces. + * + * @param Name|string ...$interfaces Names of interfaces to implement + * + * @return $this The builder instance (for fluid interface) + */ + public function implement(...$interfaces) { + foreach ($interfaces as $interface) { + $this->implements[] = BuilderHelpers::normalizeName($interface); + } + + return $this; + } + + /** + * Makes the class abstract. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeAbstract() { + $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); + + return $this; + } + + /** + * Makes the class final. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeFinal() { + $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + + return $this; + } + + public function makeReadonly() { + $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); + + return $this; + } + + /** + * Adds a statement. + * + * @param Stmt|PhpParser\Builder $stmt The statement to add + * + * @return $this The builder instance (for fluid interface) + */ + public function addStmt($stmt) { + $stmt = BuilderHelpers::normalizeNode($stmt); + + $targets = [ + Stmt\TraitUse::class => &$this->uses, + Stmt\ClassConst::class => &$this->constants, + Stmt\Property::class => &$this->properties, + Stmt\ClassMethod::class => &$this->methods, + ]; + + $class = \get_class($stmt); + if (!isset($targets[$class])) { + throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); + } + + $targets[$class][] = $stmt; + + return $this; + } + + /** + * Adds an attribute group. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) + */ + public function addAttribute($attribute) { + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + + return $this; + } + + /** + * Returns the built class node. + * + * @return Stmt\Class_ The built class node + */ + public function getNode() : PhpParser\Node { + return new Stmt\Class_($this->name, [ + 'flags' => $this->flags, + 'extends' => $this->extends, + 'implements' => $this->implements, + 'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods), + 'attrGroups' => $this->attributeGroups, + ], $this->attributes); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php new file mode 100644 index 00000000..83094992 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php @@ -0,0 +1,43 @@ +addStmt($stmt); + } + + return $this; + } + + /** + * Sets doc comment for the declaration. + * + * @param PhpParser\Comment\Doc|string $docComment Doc comment to set + * + * @return $this The builder instance (for fluid interface) + */ + public function setDocComment($docComment) { + $this->attributes['comments'] = [ + BuilderHelpers::normalizeDocComment($docComment) + ]; + + return $this; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php new file mode 100644 index 00000000..02fa83e6 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php @@ -0,0 +1,85 @@ +name = $name; + } + + /** + * Sets the value. + * + * @param Node\Expr|string|int $value + * + * @return $this + */ + public function setValue($value) { + $this->value = BuilderHelpers::normalizeValue($value); + + return $this; + } + + /** + * Sets doc comment for the constant. + * + * @param PhpParser\Comment\Doc|string $docComment Doc comment to set + * + * @return $this The builder instance (for fluid interface) + */ + public function setDocComment($docComment) { + $this->attributes = [ + 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] + ]; + + return $this; + } + + /** + * Adds an attribute group. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) + */ + public function addAttribute($attribute) { + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + + return $this; + } + + /** + * Returns the built enum case node. + * + * @return Stmt\EnumCase The built constant node + */ + public function getNode(): PhpParser\Node { + return new Stmt\EnumCase( + $this->name, + $this->value, + $this->attributes, + $this->attributeGroups + ); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php new file mode 100644 index 00000000..be7eef95 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php @@ -0,0 +1,117 @@ +name = $name; + } + + /** + * Sets the scalar type. + * + * @param string|Identifier $type + * + * @return $this + */ + public function setScalarType($scalarType) { + $this->scalarType = BuilderHelpers::normalizeType($scalarType); + + return $this; + } + + /** + * Implements one or more interfaces. + * + * @param Name|string ...$interfaces Names of interfaces to implement + * + * @return $this The builder instance (for fluid interface) + */ + public function implement(...$interfaces) { + foreach ($interfaces as $interface) { + $this->implements[] = BuilderHelpers::normalizeName($interface); + } + + return $this; + } + + /** + * Adds a statement. + * + * @param Stmt|PhpParser\Builder $stmt The statement to add + * + * @return $this The builder instance (for fluid interface) + */ + public function addStmt($stmt) { + $stmt = BuilderHelpers::normalizeNode($stmt); + + $targets = [ + Stmt\TraitUse::class => &$this->uses, + Stmt\EnumCase::class => &$this->enumCases, + Stmt\ClassConst::class => &$this->constants, + Stmt\ClassMethod::class => &$this->methods, + ]; + + $class = \get_class($stmt); + if (!isset($targets[$class])) { + throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); + } + + $targets[$class][] = $stmt; + + return $this; + } + + /** + * Adds an attribute group. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) + */ + public function addAttribute($attribute) { + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + + return $this; + } + + /** + * Returns the built class node. + * + * @return Stmt\Enum_ The built enum node + */ + public function getNode() : PhpParser\Node { + return new Stmt\Enum_($this->name, [ + 'scalarType' => $this->scalarType, + 'implements' => $this->implements, + 'stmts' => array_merge($this->uses, $this->enumCases, $this->constants, $this->methods), + 'attrGroups' => $this->attributeGroups, + ], $this->attributes); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php new file mode 100644 index 00000000..98ea9d33 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php @@ -0,0 +1,73 @@ +returnByRef = true; + + return $this; + } + + /** + * Adds a parameter. + * + * @param Node\Param|Param $param The parameter to add + * + * @return $this The builder instance (for fluid interface) + */ + public function addParam($param) { + $param = BuilderHelpers::normalizeNode($param); + + if (!$param instanceof Node\Param) { + throw new \LogicException(sprintf('Expected parameter node, got "%s"', $param->getType())); + } + + $this->params[] = $param; + + return $this; + } + + /** + * Adds multiple parameters. + * + * @param array $params The parameters to add + * + * @return $this The builder instance (for fluid interface) + */ + public function addParams(array $params) { + foreach ($params as $param) { + $this->addParam($param); + } + + return $this; + } + + /** + * Sets the return type for PHP 7. + * + * @param string|Node\Name|Node\Identifier|Node\ComplexType $type + * + * @return $this The builder instance (for fluid interface) + */ + public function setReturnType($type) { + $this->returnType = BuilderHelpers::normalizeType($type); + + return $this; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php new file mode 100644 index 00000000..1cd73c0d --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php @@ -0,0 +1,67 @@ +name = $name; + } + + /** + * Adds a statement. + * + * @param Node|PhpParser\Builder $stmt The statement to add + * + * @return $this The builder instance (for fluid interface) + */ + public function addStmt($stmt) { + $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); + + return $this; + } + + /** + * Adds an attribute group. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) + */ + public function addAttribute($attribute) { + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + + return $this; + } + + /** + * Returns the built function node. + * + * @return Stmt\Function_ The built function node + */ + public function getNode() : Node { + return new Stmt\Function_($this->name, [ + 'byRef' => $this->returnByRef, + 'params' => $this->params, + 'returnType' => $this->returnType, + 'stmts' => $this->stmts, + 'attrGroups' => $this->attributeGroups, + ], $this->attributes); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php new file mode 100644 index 00000000..7806e85f --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php @@ -0,0 +1,93 @@ +name = $name; + } + + /** + * Extends one or more interfaces. + * + * @param Name|string ...$interfaces Names of interfaces to extend + * + * @return $this The builder instance (for fluid interface) + */ + public function extend(...$interfaces) { + foreach ($interfaces as $interface) { + $this->extends[] = BuilderHelpers::normalizeName($interface); + } + + return $this; + } + + /** + * Adds a statement. + * + * @param Stmt|PhpParser\Builder $stmt The statement to add + * + * @return $this The builder instance (for fluid interface) + */ + public function addStmt($stmt) { + $stmt = BuilderHelpers::normalizeNode($stmt); + + if ($stmt instanceof Stmt\ClassConst) { + $this->constants[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassMethod) { + // we erase all statements in the body of an interface method + $stmt->stmts = null; + $this->methods[] = $stmt; + } else { + throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); + } + + return $this; + } + + /** + * Adds an attribute group. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) + */ + public function addAttribute($attribute) { + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + + return $this; + } + + /** + * Returns the built interface node. + * + * @return Stmt\Interface_ The built interface node + */ + public function getNode() : PhpParser\Node { + return new Stmt\Interface_($this->name, [ + 'extends' => $this->extends, + 'stmts' => array_merge($this->constants, $this->methods), + 'attrGroups' => $this->attributeGroups, + ], $this->attributes); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php new file mode 100644 index 00000000..232d7cb8 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php @@ -0,0 +1,146 @@ +name = $name; + } + + /** + * Makes the method public. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePublic() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + + return $this; + } + + /** + * Makes the method protected. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeProtected() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + + return $this; + } + + /** + * Makes the method private. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePrivate() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + + return $this; + } + + /** + * Makes the method static. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeStatic() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); + + return $this; + } + + /** + * Makes the method abstract. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeAbstract() { + if (!empty($this->stmts)) { + throw new \LogicException('Cannot make method with statements abstract'); + } + + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); + $this->stmts = null; // abstract methods don't have statements + + return $this; + } + + /** + * Makes the method final. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeFinal() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + + return $this; + } + + /** + * Adds a statement. + * + * @param Node|PhpParser\Builder $stmt The statement to add + * + * @return $this The builder instance (for fluid interface) + */ + public function addStmt($stmt) { + if (null === $this->stmts) { + throw new \LogicException('Cannot add statements to an abstract method'); + } + + $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); + + return $this; + } + + /** + * Adds an attribute group. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) + */ + public function addAttribute($attribute) { + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + + return $this; + } + + /** + * Returns the built method node. + * + * @return Stmt\ClassMethod The built method node + */ + public function getNode() : Node { + return new Stmt\ClassMethod($this->name, [ + 'flags' => $this->flags, + 'byRef' => $this->returnByRef, + 'params' => $this->params, + 'returnType' => $this->returnType, + 'stmts' => $this->stmts, + 'attrGroups' => $this->attributeGroups, + ], $this->attributes); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php new file mode 100644 index 00000000..1c751e16 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php @@ -0,0 +1,45 @@ +name = null !== $name ? BuilderHelpers::normalizeName($name) : null; + } + + /** + * Adds a statement. + * + * @param Node|PhpParser\Builder $stmt The statement to add + * + * @return $this The builder instance (for fluid interface) + */ + public function addStmt($stmt) { + $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); + + return $this; + } + + /** + * Returns the built node. + * + * @return Stmt\Namespace_ The built node + */ + public function getNode() : Node { + return new Stmt\Namespace_($this->name, $this->stmts, $this->attributes); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php new file mode 100644 index 00000000..de9aae7e --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php @@ -0,0 +1,122 @@ +name = $name; + } + + /** + * Sets default value for the parameter. + * + * @param mixed $value Default value to use + * + * @return $this The builder instance (for fluid interface) + */ + public function setDefault($value) { + $this->default = BuilderHelpers::normalizeValue($value); + + return $this; + } + + /** + * Sets type for the parameter. + * + * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type + * + * @return $this The builder instance (for fluid interface) + */ + public function setType($type) { + $this->type = BuilderHelpers::normalizeType($type); + if ($this->type == 'void') { + throw new \LogicException('Parameter type cannot be void'); + } + + return $this; + } + + /** + * Sets type for the parameter. + * + * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type + * + * @return $this The builder instance (for fluid interface) + * + * @deprecated Use setType() instead + */ + public function setTypeHint($type) { + return $this->setType($type); + } + + /** + * Make the parameter accept the value by reference. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeByRef() { + $this->byRef = true; + + return $this; + } + + /** + * Make the parameter variadic + * + * @return $this The builder instance (for fluid interface) + */ + public function makeVariadic() { + $this->variadic = true; + + return $this; + } + + /** + * Adds an attribute group. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) + */ + public function addAttribute($attribute) { + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + + return $this; + } + + /** + * Returns the built parameter node. + * + * @return Node\Param The built parameter node + */ + public function getNode() : Node { + return new Node\Param( + new Node\Expr\Variable($this->name), + $this->default, $this->type, $this->byRef, $this->variadic, [], 0, $this->attributeGroups + ); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php new file mode 100644 index 00000000..68e31856 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php @@ -0,0 +1,161 @@ +name = $name; + } + + /** + * Makes the property public. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePublic() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + + return $this; + } + + /** + * Makes the property protected. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeProtected() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + + return $this; + } + + /** + * Makes the property private. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePrivate() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + + return $this; + } + + /** + * Makes the property static. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeStatic() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); + + return $this; + } + + /** + * Makes the property readonly. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeReadonly() { + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); + + return $this; + } + + /** + * Sets default value for the property. + * + * @param mixed $value Default value to use + * + * @return $this The builder instance (for fluid interface) + */ + public function setDefault($value) { + $this->default = BuilderHelpers::normalizeValue($value); + + return $this; + } + + /** + * Sets doc comment for the property. + * + * @param PhpParser\Comment\Doc|string $docComment Doc comment to set + * + * @return $this The builder instance (for fluid interface) + */ + public function setDocComment($docComment) { + $this->attributes = [ + 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] + ]; + + return $this; + } + + /** + * Sets the property type for PHP 7.4+. + * + * @param string|Name|Identifier|ComplexType $type + * + * @return $this + */ + public function setType($type) { + $this->type = BuilderHelpers::normalizeType($type); + + return $this; + } + + /** + * Adds an attribute group. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) + */ + public function addAttribute($attribute) { + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + + return $this; + } + + /** + * Returns the built class node. + * + * @return Stmt\Property The built property node + */ + public function getNode() : PhpParser\Node { + return new Stmt\Property( + $this->flags !== 0 ? $this->flags : Stmt\Class_::MODIFIER_PUBLIC, + [ + new Stmt\PropertyProperty($this->name, $this->default) + ], + $this->attributes, + $this->type, + $this->attributeGroups + ); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php new file mode 100644 index 00000000..311e8cd7 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php @@ -0,0 +1,64 @@ +and($trait); + } + } + + /** + * Adds used trait. + * + * @param Node\Name|string $trait Trait name + * + * @return $this The builder instance (for fluid interface) + */ + public function and($trait) { + $this->traits[] = BuilderHelpers::normalizeName($trait); + return $this; + } + + /** + * Adds trait adaptation. + * + * @param Stmt\TraitUseAdaptation|Builder\TraitUseAdaptation $adaptation Trait adaptation + * + * @return $this The builder instance (for fluid interface) + */ + public function with($adaptation) { + $adaptation = BuilderHelpers::normalizeNode($adaptation); + + if (!$adaptation instanceof Stmt\TraitUseAdaptation) { + throw new \LogicException('Adaptation must have type TraitUseAdaptation'); + } + + $this->adaptations[] = $adaptation; + return $this; + } + + /** + * Returns the built node. + * + * @return Node The built node + */ + public function getNode() : Node { + return new Stmt\TraitUse($this->traits, $this->adaptations); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php new file mode 100644 index 00000000..eb6c0b62 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php @@ -0,0 +1,148 @@ +type = self::TYPE_UNDEFINED; + + $this->trait = is_null($trait)? null: BuilderHelpers::normalizeName($trait); + $this->method = BuilderHelpers::normalizeIdentifier($method); + } + + /** + * Sets alias of method. + * + * @param Node\Identifier|string $alias Alias for adaptated method + * + * @return $this The builder instance (for fluid interface) + */ + public function as($alias) { + if ($this->type === self::TYPE_UNDEFINED) { + $this->type = self::TYPE_ALIAS; + } + + if ($this->type !== self::TYPE_ALIAS) { + throw new \LogicException('Cannot set alias for not alias adaptation buider'); + } + + $this->alias = $alias; + return $this; + } + + /** + * Sets adaptated method public. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePublic() { + $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC); + return $this; + } + + /** + * Sets adaptated method protected. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeProtected() { + $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED); + return $this; + } + + /** + * Sets adaptated method private. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePrivate() { + $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE); + return $this; + } + + /** + * Adds overwritten traits. + * + * @param Node\Name|string ...$traits Traits for overwrite + * + * @return $this The builder instance (for fluid interface) + */ + public function insteadof(...$traits) { + if ($this->type === self::TYPE_UNDEFINED) { + if (is_null($this->trait)) { + throw new \LogicException('Precedence adaptation must have trait'); + } + + $this->type = self::TYPE_PRECEDENCE; + } + + if ($this->type !== self::TYPE_PRECEDENCE) { + throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider'); + } + + foreach ($traits as $trait) { + $this->insteadof[] = BuilderHelpers::normalizeName($trait); + } + + return $this; + } + + protected function setModifier(int $modifier) { + if ($this->type === self::TYPE_UNDEFINED) { + $this->type = self::TYPE_ALIAS; + } + + if ($this->type !== self::TYPE_ALIAS) { + throw new \LogicException('Cannot set access modifier for not alias adaptation buider'); + } + + if (is_null($this->modifier)) { + $this->modifier = $modifier; + } else { + throw new \LogicException('Multiple access type modifiers are not allowed'); + } + } + + /** + * Returns the built node. + * + * @return Node The built node + */ + public function getNode() : Node { + switch ($this->type) { + case self::TYPE_ALIAS: + return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias); + case self::TYPE_PRECEDENCE: + return new Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof); + default: + throw new \LogicException('Type of adaptation is not defined'); + } + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php new file mode 100644 index 00000000..97f32f98 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php @@ -0,0 +1,78 @@ +name = $name; + } + + /** + * Adds a statement. + * + * @param Stmt|PhpParser\Builder $stmt The statement to add + * + * @return $this The builder instance (for fluid interface) + */ + public function addStmt($stmt) { + $stmt = BuilderHelpers::normalizeNode($stmt); + + if ($stmt instanceof Stmt\Property) { + $this->properties[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassMethod) { + $this->methods[] = $stmt; + } elseif ($stmt instanceof Stmt\TraitUse) { + $this->uses[] = $stmt; + } else { + throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); + } + + return $this; + } + + /** + * Adds an attribute group. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) + */ + public function addAttribute($attribute) { + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + + return $this; + } + + /** + * Returns the built trait node. + * + * @return Stmt\Trait_ The built interface node + */ + public function getNode() : PhpParser\Node { + return new Stmt\Trait_( + $this->name, [ + 'stmts' => array_merge($this->uses, $this->properties, $this->methods), + 'attrGroups' => $this->attributeGroups, + ], $this->attributes + ); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php new file mode 100644 index 00000000..4bd3d12d --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php @@ -0,0 +1,49 @@ +name = BuilderHelpers::normalizeName($name); + $this->type = $type; + } + + /** + * Sets alias for used name. + * + * @param string $alias Alias to use (last component of full name by default) + * + * @return $this The builder instance (for fluid interface) + */ + public function as(string $alias) { + $this->alias = $alias; + return $this; + } + + /** + * Returns the built node. + * + * @return Stmt\Use_ The built node + */ + public function getNode() : Node { + return new Stmt\Use_([ + new Stmt\UseUse($this->name, $this->alias) + ], $this->type); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php b/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php new file mode 100644 index 00000000..fef2579b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php @@ -0,0 +1,399 @@ +args($args) + ); + } + + /** + * Creates a namespace builder. + * + * @param null|string|Node\Name $name Name of the namespace + * + * @return Builder\Namespace_ The created namespace builder + */ + public function namespace($name) : Builder\Namespace_ { + return new Builder\Namespace_($name); + } + + /** + * Creates a class builder. + * + * @param string $name Name of the class + * + * @return Builder\Class_ The created class builder + */ + public function class(string $name) : Builder\Class_ { + return new Builder\Class_($name); + } + + /** + * Creates an interface builder. + * + * @param string $name Name of the interface + * + * @return Builder\Interface_ The created interface builder + */ + public function interface(string $name) : Builder\Interface_ { + return new Builder\Interface_($name); + } + + /** + * Creates a trait builder. + * + * @param string $name Name of the trait + * + * @return Builder\Trait_ The created trait builder + */ + public function trait(string $name) : Builder\Trait_ { + return new Builder\Trait_($name); + } + + /** + * Creates an enum builder. + * + * @param string $name Name of the enum + * + * @return Builder\Enum_ The created enum builder + */ + public function enum(string $name) : Builder\Enum_ { + return new Builder\Enum_($name); + } + + /** + * Creates a trait use builder. + * + * @param Node\Name|string ...$traits Trait names + * + * @return Builder\TraitUse The create trait use builder + */ + public function useTrait(...$traits) : Builder\TraitUse { + return new Builder\TraitUse(...$traits); + } + + /** + * Creates a trait use adaptation builder. + * + * @param Node\Name|string|null $trait Trait name + * @param Node\Identifier|string $method Method name + * + * @return Builder\TraitUseAdaptation The create trait use adaptation builder + */ + public function traitUseAdaptation($trait, $method = null) : Builder\TraitUseAdaptation { + if ($method === null) { + $method = $trait; + $trait = null; + } + + return new Builder\TraitUseAdaptation($trait, $method); + } + + /** + * Creates a method builder. + * + * @param string $name Name of the method + * + * @return Builder\Method The created method builder + */ + public function method(string $name) : Builder\Method { + return new Builder\Method($name); + } + + /** + * Creates a parameter builder. + * + * @param string $name Name of the parameter + * + * @return Builder\Param The created parameter builder + */ + public function param(string $name) : Builder\Param { + return new Builder\Param($name); + } + + /** + * Creates a property builder. + * + * @param string $name Name of the property + * + * @return Builder\Property The created property builder + */ + public function property(string $name) : Builder\Property { + return new Builder\Property($name); + } + + /** + * Creates a function builder. + * + * @param string $name Name of the function + * + * @return Builder\Function_ The created function builder + */ + public function function(string $name) : Builder\Function_ { + return new Builder\Function_($name); + } + + /** + * Creates a namespace/class use builder. + * + * @param Node\Name|string $name Name of the entity (namespace or class) to alias + * + * @return Builder\Use_ The created use builder + */ + public function use($name) : Builder\Use_ { + return new Builder\Use_($name, Use_::TYPE_NORMAL); + } + + /** + * Creates a function use builder. + * + * @param Node\Name|string $name Name of the function to alias + * + * @return Builder\Use_ The created use function builder + */ + public function useFunction($name) : Builder\Use_ { + return new Builder\Use_($name, Use_::TYPE_FUNCTION); + } + + /** + * Creates a constant use builder. + * + * @param Node\Name|string $name Name of the const to alias + * + * @return Builder\Use_ The created use const builder + */ + public function useConst($name) : Builder\Use_ { + return new Builder\Use_($name, Use_::TYPE_CONSTANT); + } + + /** + * Creates a class constant builder. + * + * @param string|Identifier $name Name + * @param Node\Expr|bool|null|int|float|string|array $value Value + * + * @return Builder\ClassConst The created use const builder + */ + public function classConst($name, $value) : Builder\ClassConst { + return new Builder\ClassConst($name, $value); + } + + /** + * Creates an enum case builder. + * + * @param string|Identifier $name Name + * + * @return Builder\EnumCase The created use const builder + */ + public function enumCase($name) : Builder\EnumCase { + return new Builder\EnumCase($name); + } + + /** + * Creates node a for a literal value. + * + * @param Expr|bool|null|int|float|string|array $value $value + * + * @return Expr + */ + public function val($value) : Expr { + return BuilderHelpers::normalizeValue($value); + } + + /** + * Creates variable node. + * + * @param string|Expr $name Name + * + * @return Expr\Variable + */ + public function var($name) : Expr\Variable { + if (!\is_string($name) && !$name instanceof Expr) { + throw new \LogicException('Variable name must be string or Expr'); + } + + return new Expr\Variable($name); + } + + /** + * Normalizes an argument list. + * + * Creates Arg nodes for all arguments and converts literal values to expressions. + * + * @param array $args List of arguments to normalize + * + * @return Arg[] + */ + public function args(array $args) : array { + $normalizedArgs = []; + foreach ($args as $key => $arg) { + if (!($arg instanceof Arg)) { + $arg = new Arg(BuilderHelpers::normalizeValue($arg)); + } + if (\is_string($key)) { + $arg->name = BuilderHelpers::normalizeIdentifier($key); + } + $normalizedArgs[] = $arg; + } + return $normalizedArgs; + } + + /** + * Creates a function call node. + * + * @param string|Name|Expr $name Function name + * @param array $args Function arguments + * + * @return Expr\FuncCall + */ + public function funcCall($name, array $args = []) : Expr\FuncCall { + return new Expr\FuncCall( + BuilderHelpers::normalizeNameOrExpr($name), + $this->args($args) + ); + } + + /** + * Creates a method call node. + * + * @param Expr $var Variable the method is called on + * @param string|Identifier|Expr $name Method name + * @param array $args Method arguments + * + * @return Expr\MethodCall + */ + public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall { + return new Expr\MethodCall( + $var, + BuilderHelpers::normalizeIdentifierOrExpr($name), + $this->args($args) + ); + } + + /** + * Creates a static method call node. + * + * @param string|Name|Expr $class Class name + * @param string|Identifier|Expr $name Method name + * @param array $args Method arguments + * + * @return Expr\StaticCall + */ + public function staticCall($class, $name, array $args = []) : Expr\StaticCall { + return new Expr\StaticCall( + BuilderHelpers::normalizeNameOrExpr($class), + BuilderHelpers::normalizeIdentifierOrExpr($name), + $this->args($args) + ); + } + + /** + * Creates an object creation node. + * + * @param string|Name|Expr $class Class name + * @param array $args Constructor arguments + * + * @return Expr\New_ + */ + public function new($class, array $args = []) : Expr\New_ { + return new Expr\New_( + BuilderHelpers::normalizeNameOrExpr($class), + $this->args($args) + ); + } + + /** + * Creates a constant fetch node. + * + * @param string|Name $name Constant name + * + * @return Expr\ConstFetch + */ + public function constFetch($name) : Expr\ConstFetch { + return new Expr\ConstFetch(BuilderHelpers::normalizeName($name)); + } + + /** + * Creates a property fetch node. + * + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Property name + * + * @return Expr\PropertyFetch + */ + public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch { + return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name)); + } + + /** + * Creates a class constant fetch node. + * + * @param string|Name|Expr $class Class name + * @param string|Identifier $name Constant name + * + * @return Expr\ClassConstFetch + */ + public function classConstFetch($class, $name): Expr\ClassConstFetch { + return new Expr\ClassConstFetch( + BuilderHelpers::normalizeNameOrExpr($class), + BuilderHelpers::normalizeIdentifier($name) + ); + } + + /** + * Creates nested Concat nodes from a list of expressions. + * + * @param Expr|string ...$exprs Expressions or literal strings + * + * @return Concat + */ + public function concat(...$exprs) : Concat { + $numExprs = count($exprs); + if ($numExprs < 2) { + throw new \LogicException('Expected at least two expressions'); + } + + $lastConcat = $this->normalizeStringExpr($exprs[0]); + for ($i = 1; $i < $numExprs; $i++) { + $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i])); + } + return $lastConcat; + } + + /** + * @param string|Expr $expr + * @return Expr + */ + private function normalizeStringExpr($expr) : Expr { + if ($expr instanceof Expr) { + return $expr; + } + + if (\is_string($expr)) { + return new String_($expr); + } + + throw new \LogicException('Expected string or Expr'); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php b/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php new file mode 100644 index 00000000..b8839db3 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php @@ -0,0 +1,322 @@ +getNode(); + } + + if ($node instanceof Node) { + return $node; + } + + throw new \LogicException('Expected node or builder object'); + } + + /** + * Normalizes a node to a statement. + * + * Expressions are wrapped in a Stmt\Expression node. + * + * @param Node|Builder $node The node to normalize + * + * @return Stmt The normalized statement node + */ + public static function normalizeStmt($node) : Stmt { + $node = self::normalizeNode($node); + if ($node instanceof Stmt) { + return $node; + } + + if ($node instanceof Expr) { + return new Stmt\Expression($node); + } + + throw new \LogicException('Expected statement or expression node'); + } + + /** + * Normalizes strings to Identifier. + * + * @param string|Identifier $name The identifier to normalize + * + * @return Identifier The normalized identifier + */ + public static function normalizeIdentifier($name) : Identifier { + if ($name instanceof Identifier) { + return $name; + } + + if (\is_string($name)) { + return new Identifier($name); + } + + throw new \LogicException('Expected string or instance of Node\Identifier'); + } + + /** + * Normalizes strings to Identifier, also allowing expressions. + * + * @param string|Identifier|Expr $name The identifier to normalize + * + * @return Identifier|Expr The normalized identifier or expression + */ + public static function normalizeIdentifierOrExpr($name) { + if ($name instanceof Identifier || $name instanceof Expr) { + return $name; + } + + if (\is_string($name)) { + return new Identifier($name); + } + + throw new \LogicException('Expected string or instance of Node\Identifier or Node\Expr'); + } + + /** + * Normalizes a name: Converts string names to Name nodes. + * + * @param Name|string $name The name to normalize + * + * @return Name The normalized name + */ + public static function normalizeName($name) : Name { + if ($name instanceof Name) { + return $name; + } + + if (is_string($name)) { + if (!$name) { + throw new \LogicException('Name cannot be empty'); + } + + if ($name[0] === '\\') { + return new Name\FullyQualified(substr($name, 1)); + } + + if (0 === strpos($name, 'namespace\\')) { + return new Name\Relative(substr($name, strlen('namespace\\'))); + } + + return new Name($name); + } + + throw new \LogicException('Name must be a string or an instance of Node\Name'); + } + + /** + * Normalizes a name: Converts string names to Name nodes, while also allowing expressions. + * + * @param Expr|Name|string $name The name to normalize + * + * @return Name|Expr The normalized name or expression + */ + public static function normalizeNameOrExpr($name) { + if ($name instanceof Expr) { + return $name; + } + + if (!is_string($name) && !($name instanceof Name)) { + throw new \LogicException( + 'Name must be a string or an instance of Node\Name or Node\Expr' + ); + } + + return self::normalizeName($name); + } + + /** + * Normalizes a type: Converts plain-text type names into proper AST representation. + * + * In particular, builtin types become Identifiers, custom types become Names and nullables + * are wrapped in NullableType nodes. + * + * @param string|Name|Identifier|ComplexType $type The type to normalize + * + * @return Name|Identifier|ComplexType The normalized type + */ + public static function normalizeType($type) { + if (!is_string($type)) { + if ( + !$type instanceof Name && !$type instanceof Identifier && + !$type instanceof ComplexType + ) { + throw new \LogicException( + 'Type must be a string, or an instance of Name, Identifier or ComplexType' + ); + } + return $type; + } + + $nullable = false; + if (strlen($type) > 0 && $type[0] === '?') { + $nullable = true; + $type = substr($type, 1); + } + + $builtinTypes = [ + 'array', 'callable', 'string', 'int', 'float', 'bool', 'iterable', 'void', 'object', 'mixed', 'never', + ]; + + $lowerType = strtolower($type); + if (in_array($lowerType, $builtinTypes)) { + $type = new Identifier($lowerType); + } else { + $type = self::normalizeName($type); + } + + $notNullableTypes = [ + 'void', 'mixed', 'never', + ]; + if ($nullable && in_array((string) $type, $notNullableTypes)) { + throw new \LogicException(sprintf('%s type cannot be nullable', $type)); + } + + return $nullable ? new NullableType($type) : $type; + } + + /** + * Normalizes a value: Converts nulls, booleans, integers, + * floats, strings and arrays into their respective nodes + * + * @param Node\Expr|bool|null|int|float|string|array $value The value to normalize + * + * @return Expr The normalized value + */ + public static function normalizeValue($value) : Expr { + if ($value instanceof Node\Expr) { + return $value; + } + + if (is_null($value)) { + return new Expr\ConstFetch( + new Name('null') + ); + } + + if (is_bool($value)) { + return new Expr\ConstFetch( + new Name($value ? 'true' : 'false') + ); + } + + if (is_int($value)) { + return new Scalar\LNumber($value); + } + + if (is_float($value)) { + return new Scalar\DNumber($value); + } + + if (is_string($value)) { + return new Scalar\String_($value); + } + + if (is_array($value)) { + $items = []; + $lastKey = -1; + foreach ($value as $itemKey => $itemValue) { + // for consecutive, numeric keys don't generate keys + if (null !== $lastKey && ++$lastKey === $itemKey) { + $items[] = new Expr\ArrayItem( + self::normalizeValue($itemValue) + ); + } else { + $lastKey = null; + $items[] = new Expr\ArrayItem( + self::normalizeValue($itemValue), + self::normalizeValue($itemKey) + ); + } + } + + return new Expr\Array_($items); + } + + throw new \LogicException('Invalid value'); + } + + /** + * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc. + * + * @param Comment\Doc|string $docComment The doc comment to normalize + * + * @return Comment\Doc The normalized doc comment + */ + public static function normalizeDocComment($docComment) : Comment\Doc { + if ($docComment instanceof Comment\Doc) { + return $docComment; + } + + if (is_string($docComment)) { + return new Comment\Doc($docComment); + } + + throw new \LogicException('Doc comment must be a string or an instance of PhpParser\Comment\Doc'); + } + + /** + * Normalizes a attribute: Converts attribute to the Attribute Group if needed. + * + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return Node\AttributeGroup The Attribute Group + */ + public static function normalizeAttribute($attribute) : Node\AttributeGroup + { + if ($attribute instanceof Node\AttributeGroup) { + return $attribute; + } + + if (!($attribute instanceof Node\Attribute)) { + throw new \LogicException('Attribute must be an instance of PhpParser\Node\Attribute or PhpParser\Node\AttributeGroup'); + } + + return new Node\AttributeGroup([$attribute]); + } + + /** + * Adds a modifier and returns new modifier bitmask. + * + * @param int $modifiers Existing modifiers + * @param int $modifier Modifier to set + * + * @return int New modifiers + */ + public static function addModifier(int $modifiers, int $modifier) : int { + Stmt\Class_::verifyModifier($modifiers, $modifier); + return $modifiers | $modifier; + } + + /** + * Adds a modifier and returns new modifier bitmask. + * @return int New modifiers + */ + public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int { + Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet); + return $existingModifiers | $modifierToSet; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Comment.php b/vendor/nikic/php-parser/lib/PhpParser/Comment.php new file mode 100644 index 00000000..61e98d3d --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Comment.php @@ -0,0 +1,239 @@ +text = $text; + $this->startLine = $startLine; + $this->startFilePos = $startFilePos; + $this->startTokenPos = $startTokenPos; + $this->endLine = $endLine; + $this->endFilePos = $endFilePos; + $this->endTokenPos = $endTokenPos; + } + + /** + * Gets the comment text. + * + * @return string The comment text (including comment delimiters like /*) + */ + public function getText() : string { + return $this->text; + } + + /** + * Gets the line number the comment started on. + * + * @return int Line number (or -1 if not available) + */ + public function getStartLine() : int { + return $this->startLine; + } + + /** + * Gets the file offset the comment started on. + * + * @return int File offset (or -1 if not available) + */ + public function getStartFilePos() : int { + return $this->startFilePos; + } + + /** + * Gets the token offset the comment started on. + * + * @return int Token offset (or -1 if not available) + */ + public function getStartTokenPos() : int { + return $this->startTokenPos; + } + + /** + * Gets the line number the comment ends on. + * + * @return int Line number (or -1 if not available) + */ + public function getEndLine() : int { + return $this->endLine; + } + + /** + * Gets the file offset the comment ends on. + * + * @return int File offset (or -1 if not available) + */ + public function getEndFilePos() : int { + return $this->endFilePos; + } + + /** + * Gets the token offset the comment ends on. + * + * @return int Token offset (or -1 if not available) + */ + public function getEndTokenPos() : int { + return $this->endTokenPos; + } + + /** + * Gets the line number the comment started on. + * + * @deprecated Use getStartLine() instead + * + * @return int Line number + */ + public function getLine() : int { + return $this->startLine; + } + + /** + * Gets the file offset the comment started on. + * + * @deprecated Use getStartFilePos() instead + * + * @return int File offset + */ + public function getFilePos() : int { + return $this->startFilePos; + } + + /** + * Gets the token offset the comment started on. + * + * @deprecated Use getStartTokenPos() instead + * + * @return int Token offset + */ + public function getTokenPos() : int { + return $this->startTokenPos; + } + + /** + * Gets the comment text. + * + * @return string The comment text (including comment delimiters like /*) + */ + public function __toString() : string { + return $this->text; + } + + /** + * Gets the reformatted comment text. + * + * "Reformatted" here means that we try to clean up the whitespace at the + * starts of the lines. This is necessary because we receive the comments + * without trailing whitespace on the first line, but with trailing whitespace + * on all subsequent lines. + * + * @return mixed|string + */ + public function getReformattedText() { + $text = trim($this->text); + $newlinePos = strpos($text, "\n"); + if (false === $newlinePos) { + // Single line comments don't need further processing + return $text; + } elseif (preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\R\s+\*.*)+$)', $text)) { + // Multi line comment of the type + // + // /* + // * Some text. + // * Some more text. + // */ + // + // is handled by replacing the whitespace sequences before the * by a single space + return preg_replace('(^\s+\*)m', ' *', $this->text); + } elseif (preg_match('(^/\*\*?\s*[\r\n])', $text) && preg_match('(\n(\s*)\*/$)', $text, $matches)) { + // Multi line comment of the type + // + // /* + // Some text. + // Some more text. + // */ + // + // is handled by removing the whitespace sequence on the line before the closing + // */ on all lines. So if the last line is " */", then " " is removed at the + // start of all lines. + return preg_replace('(^' . preg_quote($matches[1]) . ')m', '', $text); + } elseif (preg_match('(^/\*\*?\s*(?!\s))', $text, $matches)) { + // Multi line comment of the type + // + // /* Some text. + // Some more text. + // Indented text. + // Even more text. */ + // + // is handled by removing the difference between the shortest whitespace prefix on all + // lines and the length of the "/* " opening sequence. + $prefixLen = $this->getShortestWhitespacePrefixLen(substr($text, $newlinePos + 1)); + $removeLen = $prefixLen - strlen($matches[0]); + return preg_replace('(^\s{' . $removeLen . '})m', '', $text); + } + + // No idea how to format this comment, so simply return as is + return $text; + } + + /** + * Get length of shortest whitespace prefix (at the start of a line). + * + * If there is a line with no prefix whitespace, 0 is a valid return value. + * + * @param string $str String to check + * @return int Length in characters. Tabs count as single characters. + */ + private function getShortestWhitespacePrefixLen(string $str) : int { + $lines = explode("\n", $str); + $shortestPrefixLen = \INF; + foreach ($lines as $line) { + preg_match('(^\s*)', $line, $matches); + $prefixLen = strlen($matches[0]); + if ($prefixLen < $shortestPrefixLen) { + $shortestPrefixLen = $prefixLen; + } + } + return $shortestPrefixLen; + } + + /** + * @return array + * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} + */ + public function jsonSerialize() : array { + // Technically not a node, but we make it look like one anyway + $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment'; + return [ + 'nodeType' => $type, + 'text' => $this->text, + // TODO: Rename these to include "start". + 'line' => $this->startLine, + 'filePos' => $this->startFilePos, + 'tokenPos' => $this->startTokenPos, + 'endLine' => $this->endLine, + 'endFilePos' => $this->endFilePos, + 'endTokenPos' => $this->endTokenPos, + ]; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php b/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php new file mode 100644 index 00000000..a9db6128 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php @@ -0,0 +1,7 @@ +fallbackEvaluator = $fallbackEvaluator ?? function(Expr $expr) { + throw new ConstExprEvaluationException( + "Expression of type {$expr->getType()} cannot be evaluated" + ); + }; + } + + /** + * Silently evaluates a constant expression into a PHP value. + * + * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException. + * The original source of the exception is available through getPrevious(). + * + * If some part of the expression cannot be evaluated, the fallback evaluator passed to the + * constructor will be invoked. By default, if no fallback is provided, an exception of type + * ConstExprEvaluationException is thrown. + * + * See class doc comment for caveats and limitations. + * + * @param Expr $expr Constant expression to evaluate + * @return mixed Result of evaluation + * + * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred + */ + public function evaluateSilently(Expr $expr) { + set_error_handler(function($num, $str, $file, $line) { + throw new \ErrorException($str, 0, $num, $file, $line); + }); + + try { + return $this->evaluate($expr); + } catch (\Throwable $e) { + if (!$e instanceof ConstExprEvaluationException) { + $e = new ConstExprEvaluationException( + "An error occurred during constant expression evaluation", 0, $e); + } + throw $e; + } finally { + restore_error_handler(); + } + } + + /** + * Directly evaluates a constant expression into a PHP value. + * + * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these + * into a ConstExprEvaluationException. + * + * If some part of the expression cannot be evaluated, the fallback evaluator passed to the + * constructor will be invoked. By default, if no fallback is provided, an exception of type + * ConstExprEvaluationException is thrown. + * + * See class doc comment for caveats and limitations. + * + * @param Expr $expr Constant expression to evaluate + * @return mixed Result of evaluation + * + * @throws ConstExprEvaluationException if the expression cannot be evaluated + */ + public function evaluateDirectly(Expr $expr) { + return $this->evaluate($expr); + } + + private function evaluate(Expr $expr) { + if ($expr instanceof Scalar\LNumber + || $expr instanceof Scalar\DNumber + || $expr instanceof Scalar\String_ + ) { + return $expr->value; + } + + if ($expr instanceof Expr\Array_) { + return $this->evaluateArray($expr); + } + + // Unary operators + if ($expr instanceof Expr\UnaryPlus) { + return +$this->evaluate($expr->expr); + } + if ($expr instanceof Expr\UnaryMinus) { + return -$this->evaluate($expr->expr); + } + if ($expr instanceof Expr\BooleanNot) { + return !$this->evaluate($expr->expr); + } + if ($expr instanceof Expr\BitwiseNot) { + return ~$this->evaluate($expr->expr); + } + + if ($expr instanceof Expr\BinaryOp) { + return $this->evaluateBinaryOp($expr); + } + + if ($expr instanceof Expr\Ternary) { + return $this->evaluateTernary($expr); + } + + if ($expr instanceof Expr\ArrayDimFetch && null !== $expr->dim) { + return $this->evaluate($expr->var)[$this->evaluate($expr->dim)]; + } + + if ($expr instanceof Expr\ConstFetch) { + return $this->evaluateConstFetch($expr); + } + + return ($this->fallbackEvaluator)($expr); + } + + private function evaluateArray(Expr\Array_ $expr) { + $array = []; + foreach ($expr->items as $item) { + if (null !== $item->key) { + $array[$this->evaluate($item->key)] = $this->evaluate($item->value); + } elseif ($item->unpack) { + $array = array_merge($array, $this->evaluate($item->value)); + } else { + $array[] = $this->evaluate($item->value); + } + } + return $array; + } + + private function evaluateTernary(Expr\Ternary $expr) { + if (null === $expr->if) { + return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else); + } + + return $this->evaluate($expr->cond) + ? $this->evaluate($expr->if) + : $this->evaluate($expr->else); + } + + private function evaluateBinaryOp(Expr\BinaryOp $expr) { + if ($expr instanceof Expr\BinaryOp\Coalesce + && $expr->left instanceof Expr\ArrayDimFetch + ) { + // This needs to be special cased to respect BP_VAR_IS fetch semantics + return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] + ?? $this->evaluate($expr->right); + } + + // The evaluate() calls are repeated in each branch, because some of the operators are + // short-circuiting and evaluating the RHS in advance may be illegal in that case + $l = $expr->left; + $r = $expr->right; + switch ($expr->getOperatorSigil()) { + case '&': return $this->evaluate($l) & $this->evaluate($r); + case '|': return $this->evaluate($l) | $this->evaluate($r); + case '^': return $this->evaluate($l) ^ $this->evaluate($r); + case '&&': return $this->evaluate($l) && $this->evaluate($r); + case '||': return $this->evaluate($l) || $this->evaluate($r); + case '??': return $this->evaluate($l) ?? $this->evaluate($r); + case '.': return $this->evaluate($l) . $this->evaluate($r); + case '/': return $this->evaluate($l) / $this->evaluate($r); + case '==': return $this->evaluate($l) == $this->evaluate($r); + case '>': return $this->evaluate($l) > $this->evaluate($r); + case '>=': return $this->evaluate($l) >= $this->evaluate($r); + case '===': return $this->evaluate($l) === $this->evaluate($r); + case 'and': return $this->evaluate($l) and $this->evaluate($r); + case 'or': return $this->evaluate($l) or $this->evaluate($r); + case 'xor': return $this->evaluate($l) xor $this->evaluate($r); + case '-': return $this->evaluate($l) - $this->evaluate($r); + case '%': return $this->evaluate($l) % $this->evaluate($r); + case '*': return $this->evaluate($l) * $this->evaluate($r); + case '!=': return $this->evaluate($l) != $this->evaluate($r); + case '!==': return $this->evaluate($l) !== $this->evaluate($r); + case '+': return $this->evaluate($l) + $this->evaluate($r); + case '**': return $this->evaluate($l) ** $this->evaluate($r); + case '<<': return $this->evaluate($l) << $this->evaluate($r); + case '>>': return $this->evaluate($l) >> $this->evaluate($r); + case '<': return $this->evaluate($l) < $this->evaluate($r); + case '<=': return $this->evaluate($l) <= $this->evaluate($r); + case '<=>': return $this->evaluate($l) <=> $this->evaluate($r); + } + + throw new \Exception('Should not happen'); + } + + private function evaluateConstFetch(Expr\ConstFetch $expr) { + $name = $expr->name->toLowerString(); + switch ($name) { + case 'null': return null; + case 'false': return false; + case 'true': return true; + } + + return ($this->fallbackEvaluator)($expr); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Error.php b/vendor/nikic/php-parser/lib/PhpParser/Error.php new file mode 100644 index 00000000..d1fb959d --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Error.php @@ -0,0 +1,180 @@ +rawMessage = $message; + if (is_array($attributes)) { + $this->attributes = $attributes; + } else { + $this->attributes = ['startLine' => $attributes]; + } + $this->updateMessage(); + } + + /** + * Gets the error message + * + * @return string Error message + */ + public function getRawMessage() : string { + return $this->rawMessage; + } + + /** + * Gets the line the error starts in. + * + * @return int Error start line + */ + public function getStartLine() : int { + return $this->attributes['startLine'] ?? -1; + } + + /** + * Gets the line the error ends in. + * + * @return int Error end line + */ + public function getEndLine() : int { + return $this->attributes['endLine'] ?? -1; + } + + /** + * Gets the attributes of the node/token the error occurred at. + * + * @return array + */ + public function getAttributes() : array { + return $this->attributes; + } + + /** + * Sets the attributes of the node/token the error occurred at. + * + * @param array $attributes + */ + public function setAttributes(array $attributes) { + $this->attributes = $attributes; + $this->updateMessage(); + } + + /** + * Sets the line of the PHP file the error occurred in. + * + * @param string $message Error message + */ + public function setRawMessage(string $message) { + $this->rawMessage = $message; + $this->updateMessage(); + } + + /** + * Sets the line the error starts in. + * + * @param int $line Error start line + */ + public function setStartLine(int $line) { + $this->attributes['startLine'] = $line; + $this->updateMessage(); + } + + /** + * Returns whether the error has start and end column information. + * + * For column information enable the startFilePos and endFilePos in the lexer options. + * + * @return bool + */ + public function hasColumnInfo() : bool { + return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']); + } + + /** + * Gets the start column (1-based) into the line where the error started. + * + * @param string $code Source code of the file + * @return int + */ + public function getStartColumn(string $code) : int { + if (!$this->hasColumnInfo()) { + throw new \RuntimeException('Error does not have column information'); + } + + return $this->toColumn($code, $this->attributes['startFilePos']); + } + + /** + * Gets the end column (1-based) into the line where the error ended. + * + * @param string $code Source code of the file + * @return int + */ + public function getEndColumn(string $code) : int { + if (!$this->hasColumnInfo()) { + throw new \RuntimeException('Error does not have column information'); + } + + return $this->toColumn($code, $this->attributes['endFilePos']); + } + + /** + * Formats message including line and column information. + * + * @param string $code Source code associated with the error, for calculation of the columns + * + * @return string Formatted message + */ + public function getMessageWithColumnInfo(string $code) : string { + return sprintf( + '%s from %d:%d to %d:%d', $this->getRawMessage(), + $this->getStartLine(), $this->getStartColumn($code), + $this->getEndLine(), $this->getEndColumn($code) + ); + } + + /** + * Converts a file offset into a column. + * + * @param string $code Source code that $pos indexes into + * @param int $pos 0-based position in $code + * + * @return int 1-based column (relative to start of line) + */ + private function toColumn(string $code, int $pos) : int { + if ($pos > strlen($code)) { + throw new \RuntimeException('Invalid position information'); + } + + $lineStartPos = strrpos($code, "\n", $pos - strlen($code)); + if (false === $lineStartPos) { + $lineStartPos = -1; + } + + return $pos - $lineStartPos; + } + + /** + * Updates the exception message after a change to rawMessage or rawLine. + */ + protected function updateMessage() { + $this->message = $this->rawMessage; + + if (-1 === $this->getStartLine()) { + $this->message .= ' on unknown line'; + } else { + $this->message .= ' on line ' . $this->getStartLine(); + } + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php b/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php new file mode 100644 index 00000000..d620e745 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php @@ -0,0 +1,13 @@ +errors[] = $error; + } + + /** + * Get collected errors. + * + * @return Error[] + */ + public function getErrors() : array { + return $this->errors; + } + + /** + * Check whether there are any errors. + * + * @return bool + */ + public function hasErrors() : bool { + return !empty($this->errors); + } + + /** + * Reset/clear collected errors. + */ + public function clearErrors() { + $this->errors = []; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php b/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php new file mode 100644 index 00000000..aeee989b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php @@ -0,0 +1,18 @@ +type = $type; + $this->old = $old; + $this->new = $new; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php b/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php new file mode 100644 index 00000000..7f218c74 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php @@ -0,0 +1,164 @@ +isEqual = $isEqual; + } + + /** + * Calculate diff (edit script) from $old to $new. + * + * @param array $old Original array + * @param array $new New array + * + * @return DiffElem[] Diff (edit script) + */ + public function diff(array $old, array $new) { + list($trace, $x, $y) = $this->calculateTrace($old, $new); + return $this->extractDiff($trace, $x, $y, $old, $new); + } + + /** + * Calculate diff, including "replace" operations. + * + * If a sequence of remove operations is followed by the same number of add operations, these + * will be coalesced into replace operations. + * + * @param array $old Original array + * @param array $new New array + * + * @return DiffElem[] Diff (edit script), including replace operations + */ + public function diffWithReplacements(array $old, array $new) { + return $this->coalesceReplacements($this->diff($old, $new)); + } + + private function calculateTrace(array $a, array $b) { + $n = \count($a); + $m = \count($b); + $max = $n + $m; + $v = [1 => 0]; + $trace = []; + for ($d = 0; $d <= $max; $d++) { + $trace[] = $v; + for ($k = -$d; $k <= $d; $k += 2) { + if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) { + $x = $v[$k+1]; + } else { + $x = $v[$k-1] + 1; + } + + $y = $x - $k; + while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) { + $x++; + $y++; + } + + $v[$k] = $x; + if ($x >= $n && $y >= $m) { + return [$trace, $x, $y]; + } + } + } + throw new \Exception('Should not happen'); + } + + private function extractDiff(array $trace, int $x, int $y, array $a, array $b) { + $result = []; + for ($d = \count($trace) - 1; $d >= 0; $d--) { + $v = $trace[$d]; + $k = $x - $y; + + if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) { + $prevK = $k + 1; + } else { + $prevK = $k - 1; + } + + $prevX = $v[$prevK]; + $prevY = $prevX - $prevK; + + while ($x > $prevX && $y > $prevY) { + $result[] = new DiffElem(DiffElem::TYPE_KEEP, $a[$x-1], $b[$y-1]); + $x--; + $y--; + } + + if ($d === 0) { + break; + } + + while ($x > $prevX) { + $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x-1], null); + $x--; + } + + while ($y > $prevY) { + $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y-1]); + $y--; + } + } + return array_reverse($result); + } + + /** + * Coalesce equal-length sequences of remove+add into a replace operation. + * + * @param DiffElem[] $diff + * @return DiffElem[] + */ + private function coalesceReplacements(array $diff) { + $newDiff = []; + $c = \count($diff); + for ($i = 0; $i < $c; $i++) { + $diffType = $diff[$i]->type; + if ($diffType !== DiffElem::TYPE_REMOVE) { + $newDiff[] = $diff[$i]; + continue; + } + + $j = $i; + while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { + $j++; + } + + $k = $j; + while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { + $k++; + } + + if ($j - $i === $k - $j) { + $len = $j - $i; + for ($n = 0; $n < $len; $n++) { + $newDiff[] = new DiffElem( + DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new + ); + } + } else { + for (; $i < $k; $i++) { + $newDiff[] = $diff[$i]; + } + } + $i = $k - 1; + } + return $newDiff; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php b/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php new file mode 100644 index 00000000..3eeac04a --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php @@ -0,0 +1,61 @@ +attrGroups = $attrGroups; + $this->args = $args; + $this->extends = $extends; + $this->implements = $implements; + $this->stmts = $stmts; + } + + public static function fromNewNode(Expr\New_ $newNode) { + $class = $newNode->class; + assert($class instanceof Node\Stmt\Class_); + // We don't assert that $class->name is null here, to allow consumers to assign unique names + // to anonymous classes for their own purposes. We simplify ignore the name here. + return new self( + $class->attrGroups, $newNode->args, $class->extends, $class->implements, + $class->stmts, $newNode->getAttributes() + ); + } + + public function getType() : string { + return 'Expr_PrintableNewAnonClass'; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'args', 'extends', 'implements', 'stmts']; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php b/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php new file mode 100644 index 00000000..84c0175e --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php @@ -0,0 +1,281 @@ +tokens = $tokens; + $this->indentMap = $this->calcIndentMap(); + } + + /** + * Whether the given position is immediately surrounded by parenthesis. + * + * @param int $startPos Start position + * @param int $endPos End position + * + * @return bool + */ + public function haveParens(int $startPos, int $endPos) : bool { + return $this->haveTokenImmediatelyBefore($startPos, '(') + && $this->haveTokenImmediatelyAfter($endPos, ')'); + } + + /** + * Whether the given position is immediately surrounded by braces. + * + * @param int $startPos Start position + * @param int $endPos End position + * + * @return bool + */ + public function haveBraces(int $startPos, int $endPos) : bool { + return ($this->haveTokenImmediatelyBefore($startPos, '{') + || $this->haveTokenImmediatelyBefore($startPos, T_CURLY_OPEN)) + && $this->haveTokenImmediatelyAfter($endPos, '}'); + } + + /** + * Check whether the position is directly preceded by a certain token type. + * + * During this check whitespace and comments are skipped. + * + * @param int $pos Position before which the token should occur + * @param int|string $expectedTokenType Token to check for + * + * @return bool Whether the expected token was found + */ + public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType) : bool { + $tokens = $this->tokens; + $pos--; + for (; $pos >= 0; $pos--) { + $tokenType = $tokens[$pos][0]; + if ($tokenType === $expectedTokenType) { + return true; + } + if ($tokenType !== \T_WHITESPACE + && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { + break; + } + } + return false; + } + + /** + * Check whether the position is directly followed by a certain token type. + * + * During this check whitespace and comments are skipped. + * + * @param int $pos Position after which the token should occur + * @param int|string $expectedTokenType Token to check for + * + * @return bool Whether the expected token was found + */ + public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool { + $tokens = $this->tokens; + $pos++; + for (; $pos < \count($tokens); $pos++) { + $tokenType = $tokens[$pos][0]; + if ($tokenType === $expectedTokenType) { + return true; + } + if ($tokenType !== \T_WHITESPACE + && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { + break; + } + } + return false; + } + + public function skipLeft(int $pos, $skipTokenType) { + $tokens = $this->tokens; + + $pos = $this->skipLeftWhitespace($pos); + if ($skipTokenType === \T_WHITESPACE) { + return $pos; + } + + if ($tokens[$pos][0] !== $skipTokenType) { + // Shouldn't happen. The skip token MUST be there + throw new \Exception('Encountered unexpected token'); + } + $pos--; + + return $this->skipLeftWhitespace($pos); + } + + public function skipRight(int $pos, $skipTokenType) { + $tokens = $this->tokens; + + $pos = $this->skipRightWhitespace($pos); + if ($skipTokenType === \T_WHITESPACE) { + return $pos; + } + + if ($tokens[$pos][0] !== $skipTokenType) { + // Shouldn't happen. The skip token MUST be there + throw new \Exception('Encountered unexpected token'); + } + $pos++; + + return $this->skipRightWhitespace($pos); + } + + /** + * Return first non-whitespace token position smaller or equal to passed position. + * + * @param int $pos Token position + * @return int Non-whitespace token position + */ + public function skipLeftWhitespace(int $pos) { + $tokens = $this->tokens; + for (; $pos >= 0; $pos--) { + $type = $tokens[$pos][0]; + if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { + break; + } + } + return $pos; + } + + /** + * Return first non-whitespace position greater or equal to passed position. + * + * @param int $pos Token position + * @return int Non-whitespace token position + */ + public function skipRightWhitespace(int $pos) { + $tokens = $this->tokens; + for ($count = \count($tokens); $pos < $count; $pos++) { + $type = $tokens[$pos][0]; + if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { + break; + } + } + return $pos; + } + + public function findRight(int $pos, $findTokenType) { + $tokens = $this->tokens; + for ($count = \count($tokens); $pos < $count; $pos++) { + $type = $tokens[$pos][0]; + if ($type === $findTokenType) { + return $pos; + } + } + return -1; + } + + /** + * Whether the given position range contains a certain token type. + * + * @param int $startPos Starting position (inclusive) + * @param int $endPos Ending position (exclusive) + * @param int|string $tokenType Token type to look for + * @return bool Whether the token occurs in the given range + */ + public function haveTokenInRange(int $startPos, int $endPos, $tokenType) { + $tokens = $this->tokens; + for ($pos = $startPos; $pos < $endPos; $pos++) { + if ($tokens[$pos][0] === $tokenType) { + return true; + } + } + return false; + } + + public function haveBracesInRange(int $startPos, int $endPos) { + return $this->haveTokenInRange($startPos, $endPos, '{') + || $this->haveTokenInRange($startPos, $endPos, T_CURLY_OPEN) + || $this->haveTokenInRange($startPos, $endPos, '}'); + } + + /** + * Get indentation before token position. + * + * @param int $pos Token position + * + * @return int Indentation depth (in spaces) + */ + public function getIndentationBefore(int $pos) : int { + return $this->indentMap[$pos]; + } + + /** + * Get the code corresponding to a token offset range, optionally adjusted for indentation. + * + * @param int $from Token start position (inclusive) + * @param int $to Token end position (exclusive) + * @param int $indent By how much the code should be indented (can be negative as well) + * + * @return string Code corresponding to token range, adjusted for indentation + */ + public function getTokenCode(int $from, int $to, int $indent) : string { + $tokens = $this->tokens; + $result = ''; + for ($pos = $from; $pos < $to; $pos++) { + $token = $tokens[$pos]; + if (\is_array($token)) { + $type = $token[0]; + $content = $token[1]; + if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) { + $result .= $content; + } else { + // TODO Handle non-space indentation + if ($indent < 0) { + $result .= str_replace("\n" . str_repeat(" ", -$indent), "\n", $content); + } elseif ($indent > 0) { + $result .= str_replace("\n", "\n" . str_repeat(" ", $indent), $content); + } else { + $result .= $content; + } + } + } else { + $result .= $token; + } + } + return $result; + } + + /** + * Precalculate the indentation at every token position. + * + * @return int[] Token position to indentation map + */ + private function calcIndentMap() { + $indentMap = []; + $indent = 0; + foreach ($this->tokens as $token) { + $indentMap[] = $indent; + + if ($token[0] === \T_WHITESPACE) { + $content = $token[1]; + $newlinePos = \strrpos($content, "\n"); + if (false !== $newlinePos) { + $indent = \strlen($content) - $newlinePos - 1; + } + } + } + + // Add a sentinel for one past end of the file + $indentMap[] = $indent; + + return $indentMap; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php b/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php new file mode 100644 index 00000000..47d2003d --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php @@ -0,0 +1,103 @@ +decodeRecursive($value); + } + + private function decodeRecursive($value) { + if (\is_array($value)) { + if (isset($value['nodeType'])) { + if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') { + return $this->decodeComment($value); + } + return $this->decodeNode($value); + } + return $this->decodeArray($value); + } + return $value; + } + + private function decodeArray(array $array) : array { + $decodedArray = []; + foreach ($array as $key => $value) { + $decodedArray[$key] = $this->decodeRecursive($value); + } + return $decodedArray; + } + + private function decodeNode(array $value) : Node { + $nodeType = $value['nodeType']; + if (!\is_string($nodeType)) { + throw new \RuntimeException('Node type must be a string'); + } + + $reflectionClass = $this->reflectionClassFromNodeType($nodeType); + /** @var Node $node */ + $node = $reflectionClass->newInstanceWithoutConstructor(); + + if (isset($value['attributes'])) { + if (!\is_array($value['attributes'])) { + throw new \RuntimeException('Attributes must be an array'); + } + + $node->setAttributes($this->decodeArray($value['attributes'])); + } + + foreach ($value as $name => $subNode) { + if ($name === 'nodeType' || $name === 'attributes') { + continue; + } + + $node->$name = $this->decodeRecursive($subNode); + } + + return $node; + } + + private function decodeComment(array $value) : Comment { + $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\Doc::class; + if (!isset($value['text'])) { + throw new \RuntimeException('Comment must have text'); + } + + return new $className( + $value['text'], + $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1, + $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1 + ); + } + + private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass { + if (!isset($this->reflectionClassCache[$nodeType])) { + $className = $this->classNameFromNodeType($nodeType); + $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className); + } + return $this->reflectionClassCache[$nodeType]; + } + + private function classNameFromNodeType(string $nodeType) : string { + $className = 'PhpParser\\Node\\' . strtr($nodeType, '_', '\\'); + if (class_exists($className)) { + return $className; + } + + $className .= '_'; + if (class_exists($className)) { + return $className; + } + + throw new \RuntimeException("Unknown node type \"$nodeType\""); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer.php new file mode 100644 index 00000000..e15dd0a5 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer.php @@ -0,0 +1,560 @@ +defineCompatibilityTokens(); + $this->tokenMap = $this->createTokenMap(); + $this->identifierTokens = $this->createIdentifierTokenMap(); + + // map of tokens to drop while lexing (the map is only used for isset lookup, + // that's why the value is simply set to 1; the value is never actually used.) + $this->dropTokens = array_fill_keys( + [\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], 1 + ); + + $defaultAttributes = ['comments', 'startLine', 'endLine']; + $usedAttributes = array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, true); + + // Create individual boolean properties to make these checks faster. + $this->attributeStartLineUsed = isset($usedAttributes['startLine']); + $this->attributeEndLineUsed = isset($usedAttributes['endLine']); + $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']); + $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']); + $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']); + $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']); + $this->attributeCommentsUsed = isset($usedAttributes['comments']); + } + + /** + * Initializes the lexer for lexing the provided source code. + * + * This function does not throw if lexing errors occur. Instead, errors may be retrieved using + * the getErrors() method. + * + * @param string $code The source code to lex + * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to + * ErrorHandler\Throwing + */ + public function startLexing(string $code, ErrorHandler $errorHandler = null) { + if (null === $errorHandler) { + $errorHandler = new ErrorHandler\Throwing(); + } + + $this->code = $code; // keep the code around for __halt_compiler() handling + $this->pos = -1; + $this->line = 1; + $this->filePos = 0; + + // If inline HTML occurs without preceding code, treat it as if it had a leading newline. + // This ensures proper composability, because having a newline is the "safe" assumption. + $this->prevCloseTagHasNewline = true; + + $scream = ini_set('xdebug.scream', '0'); + + $this->tokens = @token_get_all($code); + $this->postprocessTokens($errorHandler); + + if (false !== $scream) { + ini_set('xdebug.scream', $scream); + } + } + + private function handleInvalidCharacterRange($start, $end, $line, ErrorHandler $errorHandler) { + $tokens = []; + for ($i = $start; $i < $end; $i++) { + $chr = $this->code[$i]; + if ($chr === "\0") { + // PHP cuts error message after null byte, so need special case + $errorMsg = 'Unexpected null byte'; + } else { + $errorMsg = sprintf( + 'Unexpected character "%s" (ASCII %d)', $chr, ord($chr) + ); + } + + $tokens[] = [\T_BAD_CHARACTER, $chr, $line]; + $errorHandler->handleError(new Error($errorMsg, [ + 'startLine' => $line, + 'endLine' => $line, + 'startFilePos' => $i, + 'endFilePos' => $i, + ])); + } + return $tokens; + } + + /** + * Check whether comment token is unterminated. + * + * @return bool + */ + private function isUnterminatedComment($token) : bool { + return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) + && substr($token[1], 0, 2) === '/*' + && substr($token[1], -2) !== '*/'; + } + + protected function postprocessTokens(ErrorHandler $errorHandler) { + // PHP's error handling for token_get_all() is rather bad, so if we want detailed + // error information we need to compute it ourselves. Invalid character errors are + // detected by finding "gaps" in the token array. Unterminated comments are detected + // by checking if a trailing comment has a "*/" at the end. + // + // Additionally, we perform a number of canonicalizations here: + // * Use the PHP 8.0 comment format, which does not include trailing whitespace anymore. + // * Use PHP 8.0 T_NAME_* tokens. + // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and + // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. + + $filePos = 0; + $line = 1; + $numTokens = \count($this->tokens); + for ($i = 0; $i < $numTokens; $i++) { + $token = $this->tokens[$i]; + + // Since PHP 7.4 invalid characters are represented by a T_BAD_CHARACTER token. + // In this case we only need to emit an error. + if ($token[0] === \T_BAD_CHARACTER) { + $this->handleInvalidCharacterRange($filePos, $filePos + 1, $line, $errorHandler); + } + + if ($token[0] === \T_COMMENT && substr($token[1], 0, 2) !== '/*' + && preg_match('/(\r\n|\n|\r)$/D', $token[1], $matches)) { + $trailingNewline = $matches[0]; + $token[1] = substr($token[1], 0, -strlen($trailingNewline)); + $this->tokens[$i] = $token; + if (isset($this->tokens[$i + 1]) && $this->tokens[$i + 1][0] === \T_WHITESPACE) { + // Move trailing newline into following T_WHITESPACE token, if it already exists. + $this->tokens[$i + 1][1] = $trailingNewline . $this->tokens[$i + 1][1]; + $this->tokens[$i + 1][2]--; + } else { + // Otherwise, we need to create a new T_WHITESPACE token. + array_splice($this->tokens, $i + 1, 0, [ + [\T_WHITESPACE, $trailingNewline, $line], + ]); + $numTokens++; + } + } + + // Emulate PHP 8 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and T_STRING + // into a single token. + if (\is_array($token) + && ($token[0] === \T_NS_SEPARATOR || isset($this->identifierTokens[$token[0]]))) { + $lastWasSeparator = $token[0] === \T_NS_SEPARATOR; + $text = $token[1]; + for ($j = $i + 1; isset($this->tokens[$j]); $j++) { + if ($lastWasSeparator) { + if (!isset($this->identifierTokens[$this->tokens[$j][0]])) { + break; + } + $lastWasSeparator = false; + } else { + if ($this->tokens[$j][0] !== \T_NS_SEPARATOR) { + break; + } + $lastWasSeparator = true; + } + $text .= $this->tokens[$j][1]; + } + if ($lastWasSeparator) { + // Trailing separator is not part of the name. + $j--; + $text = substr($text, 0, -1); + } + if ($j > $i + 1) { + if ($token[0] === \T_NS_SEPARATOR) { + $type = \T_NAME_FULLY_QUALIFIED; + } else if ($token[0] === \T_NAMESPACE) { + $type = \T_NAME_RELATIVE; + } else { + $type = \T_NAME_QUALIFIED; + } + $token = [$type, $text, $line]; + array_splice($this->tokens, $i, $j - $i, [$token]); + $numTokens -= $j - $i - 1; + } + } + + if ($token === '&') { + $next = $i + 1; + while (isset($this->tokens[$next]) && $this->tokens[$next][0] === \T_WHITESPACE) { + $next++; + } + $followedByVarOrVarArg = isset($this->tokens[$next]) && + ($this->tokens[$next][0] === \T_VARIABLE || $this->tokens[$next][0] === \T_ELLIPSIS); + $this->tokens[$i] = $token = [ + $followedByVarOrVarArg + ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG + : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG, + '&', + $line, + ]; + } + + $tokenValue = \is_string($token) ? $token : $token[1]; + $tokenLen = \strlen($tokenValue); + + if (substr($this->code, $filePos, $tokenLen) !== $tokenValue) { + // Something is missing, must be an invalid character + $nextFilePos = strpos($this->code, $tokenValue, $filePos); + $badCharTokens = $this->handleInvalidCharacterRange( + $filePos, $nextFilePos, $line, $errorHandler); + $filePos = (int) $nextFilePos; + + array_splice($this->tokens, $i, 0, $badCharTokens); + $numTokens += \count($badCharTokens); + $i += \count($badCharTokens); + } + + $filePos += $tokenLen; + $line += substr_count($tokenValue, "\n"); + } + + if ($filePos !== \strlen($this->code)) { + if (substr($this->code, $filePos, 2) === '/*') { + // Unlike PHP, HHVM will drop unterminated comments entirely + $comment = substr($this->code, $filePos); + $errorHandler->handleError(new Error('Unterminated comment', [ + 'startLine' => $line, + 'endLine' => $line + substr_count($comment, "\n"), + 'startFilePos' => $filePos, + 'endFilePos' => $filePos + \strlen($comment), + ])); + + // Emulate the PHP behavior + $isDocComment = isset($comment[3]) && $comment[3] === '*'; + $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line]; + } else { + // Invalid characters at the end of the input + $badCharTokens = $this->handleInvalidCharacterRange( + $filePos, \strlen($this->code), $line, $errorHandler); + $this->tokens = array_merge($this->tokens, $badCharTokens); + } + return; + } + + if (count($this->tokens) > 0) { + // Check for unterminated comment + $lastToken = $this->tokens[count($this->tokens) - 1]; + if ($this->isUnterminatedComment($lastToken)) { + $errorHandler->handleError(new Error('Unterminated comment', [ + 'startLine' => $line - substr_count($lastToken[1], "\n"), + 'endLine' => $line, + 'startFilePos' => $filePos - \strlen($lastToken[1]), + 'endFilePos' => $filePos, + ])); + } + } + } + + /** + * Fetches the next token. + * + * The available attributes are determined by the 'usedAttributes' option, which can + * be specified in the constructor. The following attributes are supported: + * + * * 'comments' => Array of PhpParser\Comment or PhpParser\Comment\Doc instances, + * representing all comments that occurred between the previous + * non-discarded token and the current one. + * * 'startLine' => Line in which the node starts. + * * 'endLine' => Line in which the node ends. + * * 'startTokenPos' => Offset into the token array of the first token in the node. + * * 'endTokenPos' => Offset into the token array of the last token in the node. + * * 'startFilePos' => Offset into the code string of the first character that is part of the node. + * * 'endFilePos' => Offset into the code string of the last character that is part of the node. + * + * @param mixed $value Variable to store token content in + * @param mixed $startAttributes Variable to store start attributes in + * @param mixed $endAttributes Variable to store end attributes in + * + * @return int Token id + */ + public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int { + $startAttributes = []; + $endAttributes = []; + + while (1) { + if (isset($this->tokens[++$this->pos])) { + $token = $this->tokens[$this->pos]; + } else { + // EOF token with ID 0 + $token = "\0"; + } + + if ($this->attributeStartLineUsed) { + $startAttributes['startLine'] = $this->line; + } + if ($this->attributeStartTokenPosUsed) { + $startAttributes['startTokenPos'] = $this->pos; + } + if ($this->attributeStartFilePosUsed) { + $startAttributes['startFilePos'] = $this->filePos; + } + + if (\is_string($token)) { + $value = $token; + if (isset($token[1])) { + // bug in token_get_all + $this->filePos += 2; + $id = ord('"'); + } else { + $this->filePos += 1; + $id = ord($token); + } + } elseif (!isset($this->dropTokens[$token[0]])) { + $value = $token[1]; + $id = $this->tokenMap[$token[0]]; + if (\T_CLOSE_TAG === $token[0]) { + $this->prevCloseTagHasNewline = false !== strpos($token[1], "\n") + || false !== strpos($token[1], "\r"); + } elseif (\T_INLINE_HTML === $token[0]) { + $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline; + } + + $this->line += substr_count($value, "\n"); + $this->filePos += \strlen($value); + } else { + $origLine = $this->line; + $origFilePos = $this->filePos; + $this->line += substr_count($token[1], "\n"); + $this->filePos += \strlen($token[1]); + + if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) { + if ($this->attributeCommentsUsed) { + $comment = \T_DOC_COMMENT === $token[0] + ? new Comment\Doc($token[1], + $origLine, $origFilePos, $this->pos, + $this->line, $this->filePos - 1, $this->pos) + : new Comment($token[1], + $origLine, $origFilePos, $this->pos, + $this->line, $this->filePos - 1, $this->pos); + $startAttributes['comments'][] = $comment; + } + } + continue; + } + + if ($this->attributeEndLineUsed) { + $endAttributes['endLine'] = $this->line; + } + if ($this->attributeEndTokenPosUsed) { + $endAttributes['endTokenPos'] = $this->pos; + } + if ($this->attributeEndFilePosUsed) { + $endAttributes['endFilePos'] = $this->filePos - 1; + } + + return $id; + } + + throw new \RuntimeException('Reached end of lexer loop'); + } + + /** + * Returns the token array for current code. + * + * The token array is in the same format as provided by the + * token_get_all() function and does not discard tokens (i.e. + * whitespace and comments are included). The token position + * attributes are against this token array. + * + * @return array Array of tokens in token_get_all() format + */ + public function getTokens() : array { + return $this->tokens; + } + + /** + * Handles __halt_compiler() by returning the text after it. + * + * @return string Remaining text + */ + public function handleHaltCompiler() : string { + // text after T_HALT_COMPILER, still including (); + $textAfter = substr($this->code, $this->filePos); + + // ensure that it is followed by (); + // this simplifies the situation, by not allowing any comments + // in between of the tokens. + if (!preg_match('~^\s*\(\s*\)\s*(?:;|\?>\r?\n?)~', $textAfter, $matches)) { + throw new Error('__HALT_COMPILER must be followed by "();"'); + } + + // prevent the lexer from returning any further tokens + $this->pos = count($this->tokens); + + // return with (); removed + return substr($textAfter, strlen($matches[0])); + } + + private function defineCompatibilityTokens() { + static $compatTokensDefined = false; + if ($compatTokensDefined) { + return; + } + + $compatTokens = [ + // PHP 7.4 + 'T_BAD_CHARACTER', + 'T_FN', + 'T_COALESCE_EQUAL', + // PHP 8.0 + 'T_NAME_QUALIFIED', + 'T_NAME_FULLY_QUALIFIED', + 'T_NAME_RELATIVE', + 'T_MATCH', + 'T_NULLSAFE_OBJECT_OPERATOR', + 'T_ATTRIBUTE', + // PHP 8.1 + 'T_ENUM', + 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', + 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', + 'T_READONLY', + ]; + + // PHP-Parser might be used together with another library that also emulates some or all + // of these tokens. Perform a sanity-check that all already defined tokens have been + // assigned a unique ID. + $usedTokenIds = []; + foreach ($compatTokens as $token) { + if (\defined($token)) { + $tokenId = \constant($token); + $clashingToken = $usedTokenIds[$tokenId] ?? null; + if ($clashingToken !== null) { + throw new \Error(sprintf( + 'Token %s has same ID as token %s, ' . + 'you may be using a library with broken token emulation', + $token, $clashingToken + )); + } + $usedTokenIds[$tokenId] = $token; + } + } + + // Now define any tokens that have not yet been emulated. Try to assign IDs from -1 + // downwards, but skip any IDs that may already be in use. + $newTokenId = -1; + foreach ($compatTokens as $token) { + if (!\defined($token)) { + while (isset($usedTokenIds[$newTokenId])) { + $newTokenId--; + } + \define($token, $newTokenId); + $newTokenId--; + } + } + + $compatTokensDefined = true; + } + + /** + * Creates the token map. + * + * The token map maps the PHP internal token identifiers + * to the identifiers used by the Parser. Additionally it + * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. + * + * @return array The token map + */ + protected function createTokenMap() : array { + $tokenMap = []; + + // 256 is the minimum possible token number, as everything below + // it is an ASCII value + for ($i = 256; $i < 1000; ++$i) { + if (\T_DOUBLE_COLON === $i) { + // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM + $tokenMap[$i] = Tokens::T_PAAMAYIM_NEKUDOTAYIM; + } elseif(\T_OPEN_TAG_WITH_ECHO === $i) { + // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO + $tokenMap[$i] = Tokens::T_ECHO; + } elseif(\T_CLOSE_TAG === $i) { + // T_CLOSE_TAG is equivalent to ';' + $tokenMap[$i] = ord(';'); + } elseif ('UNKNOWN' !== $name = token_name($i)) { + if ('T_HASHBANG' === $name) { + // HHVM uses a special token for #! hashbang lines + $tokenMap[$i] = Tokens::T_INLINE_HTML; + } elseif (defined($name = Tokens::class . '::' . $name)) { + // Other tokens can be mapped directly + $tokenMap[$i] = constant($name); + } + } + } + + // HHVM uses a special token for numbers that overflow to double + if (defined('T_ONUMBER')) { + $tokenMap[\T_ONUMBER] = Tokens::T_DNUMBER; + } + // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant + if (defined('T_COMPILER_HALT_OFFSET')) { + $tokenMap[\T_COMPILER_HALT_OFFSET] = Tokens::T_STRING; + } + + // Assign tokens for which we define compatibility constants, as token_name() does not know them. + $tokenMap[\T_FN] = Tokens::T_FN; + $tokenMap[\T_COALESCE_EQUAL] = Tokens::T_COALESCE_EQUAL; + $tokenMap[\T_NAME_QUALIFIED] = Tokens::T_NAME_QUALIFIED; + $tokenMap[\T_NAME_FULLY_QUALIFIED] = Tokens::T_NAME_FULLY_QUALIFIED; + $tokenMap[\T_NAME_RELATIVE] = Tokens::T_NAME_RELATIVE; + $tokenMap[\T_MATCH] = Tokens::T_MATCH; + $tokenMap[\T_NULLSAFE_OBJECT_OPERATOR] = Tokens::T_NULLSAFE_OBJECT_OPERATOR; + $tokenMap[\T_ATTRIBUTE] = Tokens::T_ATTRIBUTE; + $tokenMap[\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; + $tokenMap[\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG; + $tokenMap[\T_ENUM] = Tokens::T_ENUM; + $tokenMap[\T_READONLY] = Tokens::T_READONLY; + + return $tokenMap; + } + + private function createIdentifierTokenMap(): array { + // Based on semi_reserved production. + return array_fill_keys([ + \T_STRING, + \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, + \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, + \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, + \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, + \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, + \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, + \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, + \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, + \T_MATCH, + ], true); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php new file mode 100644 index 00000000..5c56e026 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php @@ -0,0 +1,248 @@ +targetPhpVersion = $options['phpVersion'] ?? Emulative::PHP_8_1; + unset($options['phpVersion']); + + parent::__construct($options); + + $emulators = [ + new FlexibleDocStringEmulator(), + new FnTokenEmulator(), + new MatchTokenEmulator(), + new CoaleseEqualTokenEmulator(), + new NumericLiteralSeparatorEmulator(), + new NullsafeTokenEmulator(), + new AttributeEmulator(), + new EnumTokenEmulator(), + new ReadonlyTokenEmulator(), + new ExplicitOctalEmulator(), + ]; + + // Collect emulators that are relevant for the PHP version we're running + // and the PHP version we're targeting for emulation. + foreach ($emulators as $emulator) { + $emulatorPhpVersion = $emulator->getPhpVersion(); + if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) { + $this->emulators[] = $emulator; + } else if ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { + $this->emulators[] = new ReverseEmulator($emulator); + } + } + } + + public function startLexing(string $code, ErrorHandler $errorHandler = null) { + $emulators = array_filter($this->emulators, function($emulator) use($code) { + return $emulator->isEmulationNeeded($code); + }); + + if (empty($emulators)) { + // Nothing to emulate, yay + parent::startLexing($code, $errorHandler); + return; + } + + $this->patches = []; + foreach ($emulators as $emulator) { + $code = $emulator->preprocessCode($code, $this->patches); + } + + $collector = new ErrorHandler\Collecting(); + parent::startLexing($code, $collector); + $this->sortPatches(); + $this->fixupTokens(); + + $errors = $collector->getErrors(); + if (!empty($errors)) { + $this->fixupErrors($errors); + foreach ($errors as $error) { + $errorHandler->handleError($error); + } + } + + foreach ($emulators as $emulator) { + $this->tokens = $emulator->emulate($code, $this->tokens); + } + } + + private function isForwardEmulationNeeded(string $emulatorPhpVersion): bool { + return version_compare(\PHP_VERSION, $emulatorPhpVersion, '<') + && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '>='); + } + + private function isReverseEmulationNeeded(string $emulatorPhpVersion): bool { + return version_compare(\PHP_VERSION, $emulatorPhpVersion, '>=') + && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '<'); + } + + private function sortPatches() + { + // Patches may be contributed by different emulators. + // Make sure they are sorted by increasing patch position. + usort($this->patches, function($p1, $p2) { + return $p1[0] <=> $p2[0]; + }); + } + + private function fixupTokens() + { + if (\count($this->patches) === 0) { + return; + } + + // Load first patch + $patchIdx = 0; + + list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; + + // We use a manual loop over the tokens, because we modify the array on the fly + $pos = 0; + for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) { + $token = $this->tokens[$i]; + if (\is_string($token)) { + if ($patchPos === $pos) { + // Only support replacement for string tokens. + assert($patchType === 'replace'); + $this->tokens[$i] = $patchText; + + // Fetch the next patch + $patchIdx++; + if ($patchIdx >= \count($this->patches)) { + // No more patches, we're done + return; + } + list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; + } + + $pos += \strlen($token); + continue; + } + + $len = \strlen($token[1]); + $posDelta = 0; + while ($patchPos >= $pos && $patchPos < $pos + $len) { + $patchTextLen = \strlen($patchText); + if ($patchType === 'remove') { + if ($patchPos === $pos && $patchTextLen === $len) { + // Remove token entirely + array_splice($this->tokens, $i, 1, []); + $i--; + $c--; + } else { + // Remove from token string + $this->tokens[$i][1] = substr_replace( + $token[1], '', $patchPos - $pos + $posDelta, $patchTextLen + ); + $posDelta -= $patchTextLen; + } + } elseif ($patchType === 'add') { + // Insert into the token string + $this->tokens[$i][1] = substr_replace( + $token[1], $patchText, $patchPos - $pos + $posDelta, 0 + ); + $posDelta += $patchTextLen; + } else if ($patchType === 'replace') { + // Replace inside the token string + $this->tokens[$i][1] = substr_replace( + $token[1], $patchText, $patchPos - $pos + $posDelta, $patchTextLen + ); + } else { + assert(false); + } + + // Fetch the next patch + $patchIdx++; + if ($patchIdx >= \count($this->patches)) { + // No more patches, we're done + return; + } + + list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; + + // Multiple patches may apply to the same token. Reload the current one to check + // If the new patch applies + $token = $this->tokens[$i]; + } + + $pos += $len; + } + + // A patch did not apply + assert(false); + } + + /** + * Fixup line and position information in errors. + * + * @param Error[] $errors + */ + private function fixupErrors(array $errors) { + foreach ($errors as $error) { + $attrs = $error->getAttributes(); + + $posDelta = 0; + $lineDelta = 0; + foreach ($this->patches as $patch) { + list($patchPos, $patchType, $patchText) = $patch; + if ($patchPos >= $attrs['startFilePos']) { + // No longer relevant + break; + } + + if ($patchType === 'add') { + $posDelta += strlen($patchText); + $lineDelta += substr_count($patchText, "\n"); + } else if ($patchType === 'remove') { + $posDelta -= strlen($patchText); + $lineDelta -= substr_count($patchText, "\n"); + } + } + + $attrs['startFilePos'] += $posDelta; + $attrs['endFilePos'] += $posDelta; + $attrs['startLine'] += $lineDelta; + $attrs['endLine'] += $lineDelta; + $error->setAttributes($attrs); + } + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php new file mode 100644 index 00000000..6776a519 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php @@ -0,0 +1,56 @@ +resolveIntegerOrFloatToken($tokens[$i + 1][1]); + array_splice($tokens, $i, 2, [ + [$tokenKind, '0' . $tokens[$i + 1][1], $tokens[$i][2]], + ]); + $c--; + } + } + return $tokens; + } + + private function resolveIntegerOrFloatToken(string $str): int + { + $str = substr($str, 1); + $str = str_replace('_', '', $str); + $num = octdec($str); + return is_float($num) ? \T_DNUMBER : \T_LNUMBER; + } + + public function reverseEmulate(string $code, array $tokens): array { + // Explicit octals were not legal code previously, don't bother. + return $tokens; + } +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php new file mode 100644 index 00000000..c15d6271 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php @@ -0,0 +1,76 @@ +\h*)\2(?![a-zA-Z0-9_\x80-\xff])(?(?:;?[\r\n])?)/x +REGEX; + + public function getPhpVersion(): string + { + return Emulative::PHP_7_3; + } + + public function isEmulationNeeded(string $code) : bool + { + return strpos($code, '<<<') !== false; + } + + public function emulate(string $code, array $tokens): array + { + // Handled by preprocessing + fixup. + return $tokens; + } + + public function reverseEmulate(string $code, array $tokens): array + { + // Not supported. + return $tokens; + } + + public function preprocessCode(string $code, array &$patches): string { + if (!preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE)) { + // No heredoc/nowdoc found + return $code; + } + + // Keep track of how much we need to adjust string offsets due to the modifications we + // already made + $posDelta = 0; + foreach ($matches as $match) { + $indentation = $match['indentation'][0]; + $indentationStart = $match['indentation'][1]; + + $separator = $match['separator'][0]; + $separatorStart = $match['separator'][1]; + + if ($indentation === '' && $separator !== '') { + // Ordinary heredoc/nowdoc + continue; + } + + if ($indentation !== '') { + // Remove indentation + $indentationLen = strlen($indentation); + $code = substr_replace($code, '', $indentationStart + $posDelta, $indentationLen); + $patches[] = [$indentationStart + $posDelta, 'add', $indentation]; + $posDelta -= $indentationLen; + } + + if ($separator === '') { + // Insert newline as separator + $code = substr_replace($code, "\n", $separatorStart + $posDelta, 0); + $patches[] = [$separatorStart + $posDelta, 'remove', "\n"]; + $posDelta += 1; + } + } + + return $code; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php new file mode 100644 index 00000000..eb7e4963 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php @@ -0,0 +1,23 @@ +getKeywordString()) !== false; + } + + protected function isKeywordContext(array $tokens, int $pos): bool + { + $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos); + return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR; + } + + public function emulate(string $code, array $tokens): array + { + $keywordString = $this->getKeywordString(); + foreach ($tokens as $i => $token) { + if ($token[0] === T_STRING && strtolower($token[1]) === $keywordString + && $this->isKeywordContext($tokens, $i)) { + $tokens[$i][0] = $this->getKeywordToken(); + } + } + + return $tokens; + } + + /** + * @param mixed[] $tokens + * @return mixed[]|null + */ + private function getPreviousNonSpaceToken(array $tokens, int $start) + { + for ($i = $start - 1; $i >= 0; --$i) { + if ($tokens[$i][0] === T_WHITESPACE) { + continue; + } + + return $tokens[$i]; + } + + return null; + } + + public function reverseEmulate(string $code, array $tokens): array + { + $keywordToken = $this->getKeywordToken(); + foreach ($tokens as $i => $token) { + if ($token[0] === $keywordToken) { + $tokens[$i][0] = \T_STRING; + } + } + + return $tokens; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php new file mode 100644 index 00000000..902a46df --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php @@ -0,0 +1,23 @@ +') !== false; + } + + public function emulate(string $code, array $tokens): array + { + // We need to manually iterate and manage a count because we'll change + // the tokens array on the way + $line = 1; + for ($i = 0, $c = count($tokens); $i < $c; ++$i) { + if ($tokens[$i] === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR) { + array_splice($tokens, $i, 2, [ + [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line] + ]); + $c--; + continue; + } + + // Handle ?-> inside encapsed string. + if ($tokens[$i][0] === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) + && $tokens[$i - 1][0] === \T_VARIABLE + && preg_match('/^\?->([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)/', $tokens[$i][1], $matches) + ) { + $replacement = [ + [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line], + [\T_STRING, $matches[1], $line], + ]; + if (\strlen($matches[0]) !== \strlen($tokens[$i][1])) { + $replacement[] = [ + \T_ENCAPSED_AND_WHITESPACE, + \substr($tokens[$i][1], \strlen($matches[0])), + $line + ]; + } + array_splice($tokens, $i, 1, $replacement); + $c += \count($replacement) - 1; + continue; + } + + if (\is_array($tokens[$i])) { + $line += substr_count($tokens[$i][1], "\n"); + } + } + + return $tokens; + } + + public function reverseEmulate(string $code, array $tokens): array + { + // ?-> was not valid code previously, don't bother. + return $tokens; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php new file mode 100644 index 00000000..cdf793e4 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php @@ -0,0 +1,105 @@ +resolveIntegerOrFloatToken($match); + $newTokens = [[$tokenKind, $match, $token[2]]]; + + $numTokens = 1; + $len = $tokenLen; + while ($matchLen > $len) { + $nextToken = $tokens[$i + $numTokens]; + $nextTokenText = \is_array($nextToken) ? $nextToken[1] : $nextToken; + $nextTokenLen = \strlen($nextTokenText); + + $numTokens++; + if ($matchLen < $len + $nextTokenLen) { + // Split trailing characters into a partial token. + assert(is_array($nextToken), "Partial token should be an array token"); + $partialText = substr($nextTokenText, $matchLen - $len); + $newTokens[] = [$nextToken[0], $partialText, $nextToken[2]]; + break; + } + + $len += $nextTokenLen; + } + + array_splice($tokens, $i, $numTokens, $newTokens); + $c -= $numTokens - \count($newTokens); + $codeOffset += $matchLen; + } + + return $tokens; + } + + private function resolveIntegerOrFloatToken(string $str): int + { + $str = str_replace('_', '', $str); + + if (stripos($str, '0b') === 0) { + $num = bindec($str); + } elseif (stripos($str, '0x') === 0) { + $num = hexdec($str); + } elseif (stripos($str, '0') === 0 && ctype_digit($str)) { + $num = octdec($str); + } else { + $num = +$str; + } + + return is_float($num) ? T_DNUMBER : T_LNUMBER; + } + + public function reverseEmulate(string $code, array $tokens): array + { + // Numeric separators were not legal code previously, don't bother. + return $tokens; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php new file mode 100644 index 00000000..b97f8d11 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php @@ -0,0 +1,23 @@ +emulator = $emulator; + } + + public function getPhpVersion(): string { + return $this->emulator->getPhpVersion(); + } + + public function isEmulationNeeded(string $code): bool { + return $this->emulator->isEmulationNeeded($code); + } + + public function emulate(string $code, array $tokens): array { + return $this->emulator->reverseEmulate($code, $tokens); + } + + public function reverseEmulate(string $code, array $tokens): array { + return $this->emulator->emulate($code, $tokens); + } + + public function preprocessCode(string $code, array &$patches): string { + return $code; + } +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php new file mode 100644 index 00000000..a020bc0f --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php @@ -0,0 +1,25 @@ + [aliasName => originalName]] */ + protected $aliases = []; + + /** @var Name[][] Same as $aliases but preserving original case */ + protected $origAliases = []; + + /** @var ErrorHandler Error handler */ + protected $errorHandler; + + /** + * Create a name context. + * + * @param ErrorHandler $errorHandler Error handling used to report errors + */ + public function __construct(ErrorHandler $errorHandler) { + $this->errorHandler = $errorHandler; + } + + /** + * Start a new namespace. + * + * This also resets the alias table. + * + * @param Name|null $namespace Null is the global namespace + */ + public function startNamespace(Name $namespace = null) { + $this->namespace = $namespace; + $this->origAliases = $this->aliases = [ + Stmt\Use_::TYPE_NORMAL => [], + Stmt\Use_::TYPE_FUNCTION => [], + Stmt\Use_::TYPE_CONSTANT => [], + ]; + } + + /** + * Add an alias / import. + * + * @param Name $name Original name + * @param string $aliasName Aliased name + * @param int $type One of Stmt\Use_::TYPE_* + * @param array $errorAttrs Attributes to use to report an error + */ + public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) { + // Constant names are case sensitive, everything else case insensitive + if ($type === Stmt\Use_::TYPE_CONSTANT) { + $aliasLookupName = $aliasName; + } else { + $aliasLookupName = strtolower($aliasName); + } + + if (isset($this->aliases[$type][$aliasLookupName])) { + $typeStringMap = [ + Stmt\Use_::TYPE_NORMAL => '', + Stmt\Use_::TYPE_FUNCTION => 'function ', + Stmt\Use_::TYPE_CONSTANT => 'const ', + ]; + + $this->errorHandler->handleError(new Error( + sprintf( + 'Cannot use %s%s as %s because the name is already in use', + $typeStringMap[$type], $name, $aliasName + ), + $errorAttrs + )); + return; + } + + $this->aliases[$type][$aliasLookupName] = $name; + $this->origAliases[$type][$aliasName] = $name; + } + + /** + * Get current namespace. + * + * @return null|Name Namespace (or null if global namespace) + */ + public function getNamespace() { + return $this->namespace; + } + + /** + * Get resolved name. + * + * @param Name $name Name to resolve + * @param int $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} + * + * @return null|Name Resolved name, or null if static resolution is not possible + */ + public function getResolvedName(Name $name, int $type) { + // don't resolve special class names + if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) { + if (!$name->isUnqualified()) { + $this->errorHandler->handleError(new Error( + sprintf("'\\%s' is an invalid class name", $name->toString()), + $name->getAttributes() + )); + } + return $name; + } + + // fully qualified names are already resolved + if ($name->isFullyQualified()) { + return $name; + } + + // Try to resolve aliases + if (null !== $resolvedName = $this->resolveAlias($name, $type)) { + return $resolvedName; + } + + if ($type !== Stmt\Use_::TYPE_NORMAL && $name->isUnqualified()) { + if (null === $this->namespace) { + // outside of a namespace unaliased unqualified is same as fully qualified + return new FullyQualified($name, $name->getAttributes()); + } + + // Cannot resolve statically + return null; + } + + // if no alias exists prepend current namespace + return FullyQualified::concat($this->namespace, $name, $name->getAttributes()); + } + + /** + * Get resolved class name. + * + * @param Name $name Class ame to resolve + * + * @return Name Resolved name + */ + public function getResolvedClassName(Name $name) : Name { + return $this->getResolvedName($name, Stmt\Use_::TYPE_NORMAL); + } + + /** + * Get possible ways of writing a fully qualified name (e.g., by making use of aliases). + * + * @param string $name Fully-qualified name (without leading namespace separator) + * @param int $type One of Stmt\Use_::TYPE_* + * + * @return Name[] Possible representations of the name + */ + public function getPossibleNames(string $name, int $type) : array { + $lcName = strtolower($name); + + if ($type === Stmt\Use_::TYPE_NORMAL) { + // self, parent and static must always be unqualified + if ($lcName === "self" || $lcName === "parent" || $lcName === "static") { + return [new Name($name)]; + } + } + + // Collect possible ways to write this name, starting with the fully-qualified name + $possibleNames = [new FullyQualified($name)]; + + if (null !== $nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type)) { + // Make sure there is no alias that makes the normally namespace-relative name + // into something else + if (null === $this->resolveAlias($nsRelativeName, $type)) { + $possibleNames[] = $nsRelativeName; + } + } + + // Check for relevant namespace use statements + foreach ($this->origAliases[Stmt\Use_::TYPE_NORMAL] as $alias => $orig) { + $lcOrig = $orig->toLowerString(); + if (0 === strpos($lcName, $lcOrig . '\\')) { + $possibleNames[] = new Name($alias . substr($name, strlen($lcOrig))); + } + } + + // Check for relevant type-specific use statements + foreach ($this->origAliases[$type] as $alias => $orig) { + if ($type === Stmt\Use_::TYPE_CONSTANT) { + // Constants are are complicated-sensitive + $normalizedOrig = $this->normalizeConstName($orig->toString()); + if ($normalizedOrig === $this->normalizeConstName($name)) { + $possibleNames[] = new Name($alias); + } + } else { + // Everything else is case-insensitive + if ($orig->toLowerString() === $lcName) { + $possibleNames[] = new Name($alias); + } + } + } + + return $possibleNames; + } + + /** + * Get shortest representation of this fully-qualified name. + * + * @param string $name Fully-qualified name (without leading namespace separator) + * @param int $type One of Stmt\Use_::TYPE_* + * + * @return Name Shortest representation + */ + public function getShortName(string $name, int $type) : Name { + $possibleNames = $this->getPossibleNames($name, $type); + + // Find shortest name + $shortestName = null; + $shortestLength = \INF; + foreach ($possibleNames as $possibleName) { + $length = strlen($possibleName->toCodeString()); + if ($length < $shortestLength) { + $shortestName = $possibleName; + $shortestLength = $length; + } + } + + return $shortestName; + } + + private function resolveAlias(Name $name, $type) { + $firstPart = $name->getFirst(); + + if ($name->isQualified()) { + // resolve aliases for qualified names, always against class alias table + $checkName = strtolower($firstPart); + if (isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName])) { + $alias = $this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName]; + return FullyQualified::concat($alias, $name->slice(1), $name->getAttributes()); + } + } elseif ($name->isUnqualified()) { + // constant aliases are case-sensitive, function aliases case-insensitive + $checkName = $type === Stmt\Use_::TYPE_CONSTANT ? $firstPart : strtolower($firstPart); + if (isset($this->aliases[$type][$checkName])) { + // resolve unqualified aliases + return new FullyQualified($this->aliases[$type][$checkName], $name->getAttributes()); + } + } + + // No applicable aliases + return null; + } + + private function getNamespaceRelativeName(string $name, string $lcName, int $type) { + if (null === $this->namespace) { + return new Name($name); + } + + if ($type === Stmt\Use_::TYPE_CONSTANT) { + // The constants true/false/null always resolve to the global symbols, even inside a + // namespace, so they may be used without qualification + if ($lcName === "true" || $lcName === "false" || $lcName === "null") { + return new Name($name); + } + } + + $namespacePrefix = strtolower($this->namespace . '\\'); + if (0 === strpos($lcName, $namespacePrefix)) { + return new Name(substr($name, strlen($namespacePrefix))); + } + + return null; + } + + private function normalizeConstName(string $name) { + $nsSep = strrpos($name, '\\'); + if (false === $nsSep) { + return $name; + } + + // Constants have case-insensitive namespace and case-sensitive short-name + $ns = substr($name, 0, $nsSep); + $shortName = substr($name, $nsSep + 1); + return strtolower($ns) . '\\' . $shortName; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node.php b/vendor/nikic/php-parser/lib/PhpParser/Node.php new file mode 100644 index 00000000..befb2565 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node.php @@ -0,0 +1,151 @@ +attributes = $attributes; + $this->name = $name; + $this->value = $value; + $this->byRef = $byRef; + $this->unpack = $unpack; + } + + public function getSubNodeNames() : array { + return ['name', 'value', 'byRef', 'unpack']; + } + + public function getType() : string { + return 'Arg'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php new file mode 100644 index 00000000..c96f66e5 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->name = $name; + $this->args = $args; + } + + public function getSubNodeNames() : array { + return ['name', 'args']; + } + + public function getType() : string { + return 'Attribute'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php b/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php new file mode 100644 index 00000000..613bfc41 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php @@ -0,0 +1,29 @@ +attributes = $attributes; + $this->attrs = $attrs; + } + + public function getSubNodeNames() : array { + return ['attrs']; + } + + public function getType() : string { + return 'AttributeGroup'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php new file mode 100644 index 00000000..9505532a --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php @@ -0,0 +1,14 @@ +attributes = $attributes; + $this->name = \is_string($name) ? new Identifier($name) : $name; + $this->value = $value; + } + + public function getSubNodeNames() : array { + return ['name', 'value']; + } + + public function getType() : string { + return 'Const'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php new file mode 100644 index 00000000..6cf4df22 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php @@ -0,0 +1,9 @@ +attributes = $attributes; + $this->var = $var; + $this->dim = $dim; + } + + public function getSubNodeNames() : array { + return ['var', 'dim']; + } + + public function getType() : string { + return 'Expr_ArrayDimFetch'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php new file mode 100644 index 00000000..1b078f82 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php @@ -0,0 +1,41 @@ +attributes = $attributes; + $this->key = $key; + $this->value = $value; + $this->byRef = $byRef; + $this->unpack = $unpack; + } + + public function getSubNodeNames() : array { + return ['key', 'value', 'byRef', 'unpack']; + } + + public function getType() : string { + return 'Expr_ArrayItem'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php new file mode 100644 index 00000000..e6eaa283 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->items = $items; + } + + public function getSubNodeNames() : array { + return ['items']; + } + + public function getType() : string { + return 'Expr_Array'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php new file mode 100644 index 00000000..c273fb7e --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php @@ -0,0 +1,79 @@ + false : Whether the closure is static + * 'byRef' => false : Whether to return by reference + * 'params' => array() : Parameters + * 'returnType' => null : Return type + * 'expr' => Expr : Expression body + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes + */ + public function __construct(array $subNodes = [], array $attributes = []) { + $this->attributes = $attributes; + $this->static = $subNodes['static'] ?? false; + $this->byRef = $subNodes['byRef'] ?? false; + $this->params = $subNodes['params'] ?? []; + $returnType = $subNodes['returnType'] ?? null; + $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->expr = $subNodes['expr']; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr']; + } + + public function returnsByRef() : bool { + return $this->byRef; + } + + public function getParams() : array { + return $this->params; + } + + public function getReturnType() { + return $this->returnType; + } + + public function getAttrGroups() : array { + return $this->attrGroups; + } + + /** + * @return Node\Stmt\Return_[] + */ + public function getStmts() : array { + return [new Node\Stmt\Return_($this->expr)]; + } + + public function getType() : string { + return 'Expr_ArrowFunction'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php new file mode 100644 index 00000000..cf9e6e82 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->var = $var; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['var', 'expr']; + } + + public function getType() : string { + return 'Expr_Assign'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php new file mode 100644 index 00000000..bce8604f --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->var = $var; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['var', 'expr']; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php new file mode 100644 index 00000000..420284cd --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php @@ -0,0 +1,12 @@ +attributes = $attributes; + $this->var = $var; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['var', 'expr']; + } + + public function getType() : string { + return 'Expr_AssignRef'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php new file mode 100644 index 00000000..d9c582b0 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php @@ -0,0 +1,40 @@ +attributes = $attributes; + $this->left = $left; + $this->right = $right; + } + + public function getSubNodeNames() : array { + return ['left', 'right']; + } + + /** + * Get the operator sigil for this binary operation. + * + * In the case there are multiple possible sigils for an operator, this method does not + * necessarily return the one used in the parsed code. + * + * @return string + */ + abstract public function getOperatorSigil() : string; +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php new file mode 100644 index 00000000..d907393b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php @@ -0,0 +1,16 @@ +'; + } + + public function getType() : string { + return 'Expr_BinaryOp_Greater'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php new file mode 100644 index 00000000..d677502c --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php @@ -0,0 +1,16 @@ +='; + } + + public function getType() : string { + return 'Expr_BinaryOp_GreaterOrEqual'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php new file mode 100644 index 00000000..3d96285c --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php @@ -0,0 +1,16 @@ +>'; + } + + public function getType() : string { + return 'Expr_BinaryOp_ShiftRight'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php new file mode 100644 index 00000000..3cb8e7e0 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php @@ -0,0 +1,16 @@ +'; + } + + public function getType() : string { + return 'Expr_BinaryOp_Spaceship'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php new file mode 100644 index 00000000..ed44984b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_BitwiseNot'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php new file mode 100644 index 00000000..bf27e9f6 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_BooleanNot'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php new file mode 100644 index 00000000..78e1cf34 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php @@ -0,0 +1,39 @@ + + */ + abstract public function getRawArgs(): array; + + /** + * Returns whether this call expression is actually a first class callable. + */ + public function isFirstClassCallable(): bool { + foreach ($this->getRawArgs() as $arg) { + if ($arg instanceof VariadicPlaceholder) { + return true; + } + } + return false; + } + + /** + * Assert that this is not a first-class callable and return only ordinary Args. + * + * @return Arg[] + */ + public function getArgs(): array { + assert(!$this->isFirstClassCallable()); + return $this->getRawArgs(); + } +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php new file mode 100644 index 00000000..36769d4f --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php @@ -0,0 +1,26 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php new file mode 100644 index 00000000..57cc473b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php @@ -0,0 +1,12 @@ +attributes = $attributes; + $this->class = $class; + $this->name = \is_string($name) ? new Identifier($name) : $name; + } + + public function getSubNodeNames() : array { + return ['class', 'name']; + } + + public function getType() : string { + return 'Expr_ClassConstFetch'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php new file mode 100644 index 00000000..db216b8f --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_Clone'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php new file mode 100644 index 00000000..56ddea6a --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php @@ -0,0 +1,79 @@ + false : Whether the closure is static + * 'byRef' => false : Whether to return by reference + * 'params' => array(): Parameters + * 'uses' => array(): use()s + * 'returnType' => null : Return type + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attributes groups + * @param array $attributes Additional attributes + */ + public function __construct(array $subNodes = [], array $attributes = []) { + $this->attributes = $attributes; + $this->static = $subNodes['static'] ?? false; + $this->byRef = $subNodes['byRef'] ?? false; + $this->params = $subNodes['params'] ?? []; + $this->uses = $subNodes['uses'] ?? []; + $returnType = $subNodes['returnType'] ?? null; + $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts']; + } + + public function returnsByRef() : bool { + return $this->byRef; + } + + public function getParams() : array { + return $this->params; + } + + public function getReturnType() { + return $this->returnType; + } + + /** @return Node\Stmt[] */ + public function getStmts() : array { + return $this->stmts; + } + + public function getAttrGroups() : array { + return $this->attrGroups; + } + + public function getType() : string { + return 'Expr_Closure'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php new file mode 100644 index 00000000..2b8a0966 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->var = $var; + $this->byRef = $byRef; + } + + public function getSubNodeNames() : array { + return ['var', 'byRef']; + } + + public function getType() : string { + return 'Expr_ClosureUse'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php new file mode 100644 index 00000000..14ebd16b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php @@ -0,0 +1,31 @@ +attributes = $attributes; + $this->name = $name; + } + + public function getSubNodeNames() : array { + return ['name']; + } + + public function getType() : string { + return 'Expr_ConstFetch'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php new file mode 100644 index 00000000..4042ec93 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_Empty'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php new file mode 100644 index 00000000..1637f3ae --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php @@ -0,0 +1,31 @@ +attributes = $attributes; + } + + public function getSubNodeNames() : array { + return []; + } + + public function getType() : string { + return 'Expr_Error'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php new file mode 100644 index 00000000..c44ff6f9 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_ErrorSuppress'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php new file mode 100644 index 00000000..85685474 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_Eval'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php new file mode 100644 index 00000000..b88a8f7e --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_Exit'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php new file mode 100644 index 00000000..2de4d0dd --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php @@ -0,0 +1,39 @@ + Arguments */ + public $args; + + /** + * Constructs a function call node. + * + * @param Node\Name|Expr $name Function name + * @param array $args Arguments + * @param array $attributes Additional attributes + */ + public function __construct($name, array $args = [], array $attributes = []) { + $this->attributes = $attributes; + $this->name = $name; + $this->args = $args; + } + + public function getSubNodeNames() : array { + return ['name', 'args']; + } + + public function getType() : string { + return 'Expr_FuncCall'; + } + + public function getRawArgs(): array { + return $this->args; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php new file mode 100644 index 00000000..07ce5968 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php @@ -0,0 +1,39 @@ +attributes = $attributes; + $this->expr = $expr; + $this->type = $type; + } + + public function getSubNodeNames() : array { + return ['expr', 'type']; + } + + public function getType() : string { + return 'Expr_Include'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php new file mode 100644 index 00000000..9000d47b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php @@ -0,0 +1,35 @@ +attributes = $attributes; + $this->expr = $expr; + $this->class = $class; + } + + public function getSubNodeNames() : array { + return ['expr', 'class']; + } + + public function getType() : string { + return 'Expr_Instanceof'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php new file mode 100644 index 00000000..76b73875 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->vars = $vars; + } + + public function getSubNodeNames() : array { + return ['vars']; + } + + public function getType() : string { + return 'Expr_Isset'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php new file mode 100644 index 00000000..c27a27b9 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->items = $items; + } + + public function getSubNodeNames() : array { + return ['items']; + } + + public function getType() : string { + return 'Expr_List'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php new file mode 100644 index 00000000..2455a302 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php @@ -0,0 +1,31 @@ +attributes = $attributes; + $this->cond = $cond; + $this->arms = $arms; + } + + public function getSubNodeNames() : array { + return ['cond', 'arms']; + } + + public function getType() : string { + return 'Expr_Match'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php new file mode 100644 index 00000000..49ca4835 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php @@ -0,0 +1,45 @@ + Arguments */ + public $args; + + /** + * Constructs a function call node. + * + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes + */ + public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { + $this->attributes = $attributes; + $this->var = $var; + $this->name = \is_string($name) ? new Identifier($name) : $name; + $this->args = $args; + } + + public function getSubNodeNames() : array { + return ['var', 'name', 'args']; + } + + public function getType() : string { + return 'Expr_MethodCall'; + } + + public function getRawArgs(): array { + return $this->args; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php new file mode 100644 index 00000000..e2bb6492 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php @@ -0,0 +1,41 @@ + Arguments */ + public $args; + + /** + * Constructs a function call node. + * + * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) + * @param array $args Arguments + * @param array $attributes Additional attributes + */ + public function __construct($class, array $args = [], array $attributes = []) { + $this->attributes = $attributes; + $this->class = $class; + $this->args = $args; + } + + public function getSubNodeNames() : array { + return ['class', 'args']; + } + + public function getType() : string { + return 'Expr_New'; + } + + public function getRawArgs(): array { + return $this->args; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php new file mode 100644 index 00000000..07a571fd --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php @@ -0,0 +1,45 @@ + Arguments */ + public $args; + + /** + * Constructs a nullsafe method call node. + * + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes + */ + public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { + $this->attributes = $attributes; + $this->var = $var; + $this->name = \is_string($name) ? new Identifier($name) : $name; + $this->args = $args; + } + + public function getSubNodeNames() : array { + return ['var', 'name', 'args']; + } + + public function getType() : string { + return 'Expr_NullsafeMethodCall'; + } + + public function getRawArgs(): array { + return $this->args; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php new file mode 100644 index 00000000..9317eb3b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php @@ -0,0 +1,35 @@ +attributes = $attributes; + $this->var = $var; + $this->name = \is_string($name) ? new Identifier($name) : $name; + } + + public function getSubNodeNames() : array { + return ['var', 'name']; + } + + public function getType() : string { + return 'Expr_NullsafePropertyFetch'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php new file mode 100644 index 00000000..94d6c296 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->var = $var; + } + + public function getSubNodeNames() : array { + return ['var']; + } + + public function getType() : string { + return 'Expr_PostDec'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php new file mode 100644 index 00000000..005c443a --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->var = $var; + } + + public function getSubNodeNames() : array { + return ['var']; + } + + public function getType() : string { + return 'Expr_PostInc'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php new file mode 100644 index 00000000..a5ca685a --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->var = $var; + } + + public function getSubNodeNames() : array { + return ['var']; + } + + public function getType() : string { + return 'Expr_PreDec'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php new file mode 100644 index 00000000..0986c447 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->var = $var; + } + + public function getSubNodeNames() : array { + return ['var']; + } + + public function getType() : string { + return 'Expr_PreInc'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php new file mode 100644 index 00000000..2d43c2ac --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_Print'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php new file mode 100644 index 00000000..4281f31c --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php @@ -0,0 +1,35 @@ +attributes = $attributes; + $this->var = $var; + $this->name = \is_string($name) ? new Identifier($name) : $name; + } + + public function getSubNodeNames() : array { + return ['var', 'name']; + } + + public function getType() : string { + return 'Expr_PropertyFetch'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php new file mode 100644 index 00000000..537a7cc8 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->parts = $parts; + } + + public function getSubNodeNames() : array { + return ['parts']; + } + + public function getType() : string { + return 'Expr_ShellExec'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php new file mode 100644 index 00000000..d0d099c4 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php @@ -0,0 +1,46 @@ + Arguments */ + public $args; + + /** + * Constructs a static method call node. + * + * @param Node\Name|Expr $class Class name + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes + */ + public function __construct($class, $name, array $args = [], array $attributes = []) { + $this->attributes = $attributes; + $this->class = $class; + $this->name = \is_string($name) ? new Identifier($name) : $name; + $this->args = $args; + } + + public function getSubNodeNames() : array { + return ['class', 'name', 'args']; + } + + public function getType() : string { + return 'Expr_StaticCall'; + } + + public function getRawArgs(): array { + return $this->args; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php new file mode 100644 index 00000000..1ee1a25e --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php @@ -0,0 +1,36 @@ +attributes = $attributes; + $this->class = $class; + $this->name = \is_string($name) ? new VarLikeIdentifier($name) : $name; + } + + public function getSubNodeNames() : array { + return ['class', 'name']; + } + + public function getType() : string { + return 'Expr_StaticPropertyFetch'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php new file mode 100644 index 00000000..9316f47d --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php @@ -0,0 +1,38 @@ +attributes = $attributes; + $this->cond = $cond; + $this->if = $if; + $this->else = $else; + } + + public function getSubNodeNames() : array { + return ['cond', 'if', 'else']; + } + + public function getType() : string { + return 'Expr_Ternary'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php new file mode 100644 index 00000000..5c97f0e2 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_Throw'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php new file mode 100644 index 00000000..ce8808bc --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_UnaryMinus'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php new file mode 100644 index 00000000..d23047e5 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_UnaryPlus'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php new file mode 100644 index 00000000..b47d38e9 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->name = $name; + } + + public function getSubNodeNames() : array { + return ['name']; + } + + public function getType() : string { + return 'Expr_Variable'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php new file mode 100644 index 00000000..a3efce61 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Expr_YieldFrom'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php new file mode 100644 index 00000000..aef8fc33 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->key = $key; + $this->value = $value; + } + + public function getSubNodeNames() : array { + return ['key', 'value']; + } + + public function getType() : string { + return 'Expr_Yield'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php new file mode 100644 index 00000000..5a825e73 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php @@ -0,0 +1,43 @@ + true, + 'parent' => true, + 'static' => true, + ]; + + /** + * Constructs an identifier node. + * + * @param string $name Identifier as string + * @param array $attributes Additional attributes + */ + public function __construct(string $name, array $attributes = []) { + $this->attributes = $attributes; + $this->name = $name; + } + + public function getSubNodeNames() : array { + return ['name']; + } + + /** + * Get identifier as string. + * + * @return string Identifier as string. + */ + public function toString() : string { + return $this->name; + } + + /** + * Get lowercased identifier as string. + * + * @return string Lowercased identifier as string + */ + public function toLowerString() : string { + return strtolower($this->name); + } + + /** + * Checks whether the identifier is a special class name (self, parent or static). + * + * @return bool Whether identifier is a special class name + */ + public function isSpecialClassName() : bool { + return isset(self::$specialClassNames[strtolower($this->name)]); + } + + /** + * Get identifier as string. + * + * @return string Identifier as string + */ + public function __toString() : string { + return $this->name; + } + + public function getType() : string { + return 'Identifier'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php new file mode 100644 index 00000000..9208e139 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->types = $types; + } + + public function getSubNodeNames() : array { + return ['types']; + } + + public function getType() : string { + return 'IntersectionType'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php b/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php new file mode 100644 index 00000000..2ae1c86b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php @@ -0,0 +1,31 @@ +conds = $conds; + $this->body = $body; + $this->attributes = $attributes; + } + + public function getSubNodeNames() : array { + return ['conds', 'body']; + } + + public function getType() : string { + return 'MatchArm'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php new file mode 100644 index 00000000..6b1cc9f8 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php @@ -0,0 +1,242 @@ + true, + 'parent' => true, + 'static' => true, + ]; + + /** + * Constructs a name node. + * + * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) + * @param array $attributes Additional attributes + */ + public function __construct($name, array $attributes = []) { + $this->attributes = $attributes; + $this->parts = self::prepareName($name); + } + + public function getSubNodeNames() : array { + return ['parts']; + } + + /** + * Gets the first part of the name, i.e. everything before the first namespace separator. + * + * @return string First part of the name + */ + public function getFirst() : string { + return $this->parts[0]; + } + + /** + * Gets the last part of the name, i.e. everything after the last namespace separator. + * + * @return string Last part of the name + */ + public function getLast() : string { + return $this->parts[count($this->parts) - 1]; + } + + /** + * Checks whether the name is unqualified. (E.g. Name) + * + * @return bool Whether the name is unqualified + */ + public function isUnqualified() : bool { + return 1 === count($this->parts); + } + + /** + * Checks whether the name is qualified. (E.g. Name\Name) + * + * @return bool Whether the name is qualified + */ + public function isQualified() : bool { + return 1 < count($this->parts); + } + + /** + * Checks whether the name is fully qualified. (E.g. \Name) + * + * @return bool Whether the name is fully qualified + */ + public function isFullyQualified() : bool { + return false; + } + + /** + * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) + * + * @return bool Whether the name is relative + */ + public function isRelative() : bool { + return false; + } + + /** + * Returns a string representation of the name itself, without taking the name type into + * account (e.g., not including a leading backslash for fully qualified names). + * + * @return string String representation + */ + public function toString() : string { + return implode('\\', $this->parts); + } + + /** + * Returns a string representation of the name as it would occur in code (e.g., including + * leading backslash for fully qualified names. + * + * @return string String representation + */ + public function toCodeString() : string { + return $this->toString(); + } + + /** + * Returns lowercased string representation of the name, without taking the name type into + * account (e.g., no leading backslash for fully qualified names). + * + * @return string Lowercased string representation + */ + public function toLowerString() : string { + return strtolower(implode('\\', $this->parts)); + } + + /** + * Checks whether the identifier is a special class name (self, parent or static). + * + * @return bool Whether identifier is a special class name + */ + public function isSpecialClassName() : bool { + return count($this->parts) === 1 + && isset(self::$specialClassNames[strtolower($this->parts[0])]); + } + + /** + * Returns a string representation of the name by imploding the namespace parts with the + * namespace separator. + * + * @return string String representation + */ + public function __toString() : string { + return implode('\\', $this->parts); + } + + /** + * Gets a slice of a name (similar to array_slice). + * + * This method returns a new instance of the same type as the original and with the same + * attributes. + * + * If the slice is empty, null is returned. The null value will be correctly handled in + * concatenations using concat(). + * + * Offset and length have the same meaning as in array_slice(). + * + * @param int $offset Offset to start the slice at (may be negative) + * @param int|null $length Length of the slice (may be negative) + * + * @return static|null Sliced name + */ + public function slice(int $offset, int $length = null) { + $numParts = count($this->parts); + + $realOffset = $offset < 0 ? $offset + $numParts : $offset; + if ($realOffset < 0 || $realOffset > $numParts) { + throw new \OutOfBoundsException(sprintf('Offset %d is out of bounds', $offset)); + } + + if (null === $length) { + $realLength = $numParts - $realOffset; + } else { + $realLength = $length < 0 ? $length + $numParts - $realOffset : $length; + if ($realLength < 0 || $realLength > $numParts) { + throw new \OutOfBoundsException(sprintf('Length %d is out of bounds', $length)); + } + } + + if ($realLength === 0) { + // Empty slice is represented as null + return null; + } + + return new static(array_slice($this->parts, $realOffset, $realLength), $this->attributes); + } + + /** + * Concatenate two names, yielding a new Name instance. + * + * The type of the generated instance depends on which class this method is called on, for + * example Name\FullyQualified::concat() will yield a Name\FullyQualified instance. + * + * If one of the arguments is null, a new instance of the other name will be returned. If both + * arguments are null, null will be returned. As such, writing + * Name::concat($namespace, $shortName) + * where $namespace is a Name node or null will work as expected. + * + * @param string|string[]|self|null $name1 The first name + * @param string|string[]|self|null $name2 The second name + * @param array $attributes Attributes to assign to concatenated name + * + * @return static|null Concatenated name + */ + public static function concat($name1, $name2, array $attributes = []) { + if (null === $name1 && null === $name2) { + return null; + } elseif (null === $name1) { + return new static(self::prepareName($name2), $attributes); + } elseif (null === $name2) { + return new static(self::prepareName($name1), $attributes); + } else { + return new static( + array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes + ); + } + } + + /** + * Prepares a (string, array or Name node) name for use in name changing methods by converting + * it to an array. + * + * @param string|string[]|self $name Name to prepare + * + * @return string[] Prepared name + */ + private static function prepareName($name) : array { + if (\is_string($name)) { + if ('' === $name) { + throw new \InvalidArgumentException('Name cannot be empty'); + } + + return explode('\\', $name); + } elseif (\is_array($name)) { + if (empty($name)) { + throw new \InvalidArgumentException('Name cannot be empty'); + } + + return $name; + } elseif ($name instanceof self) { + return $name->parts; + } + + throw new \InvalidArgumentException( + 'Expected string, array of parts or Name instance' + ); + } + + public function getType() : string { + return 'Name'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php new file mode 100644 index 00000000..1df93a56 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php @@ -0,0 +1,50 @@ +toString(); + } + + public function getType() : string { + return 'Name_FullyQualified'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php new file mode 100644 index 00000000..57bf7af2 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php @@ -0,0 +1,50 @@ +toString(); + } + + public function getType() : string { + return 'Name_Relative'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php new file mode 100644 index 00000000..d68e26a3 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php @@ -0,0 +1,28 @@ +attributes = $attributes; + $this->type = \is_string($type) ? new Identifier($type) : $type; + } + + public function getSubNodeNames() : array { + return ['type']; + } + + public function getType() : string { + return 'NullableType'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php new file mode 100644 index 00000000..1e90b794 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php @@ -0,0 +1,60 @@ +attributes = $attributes; + $this->type = \is_string($type) ? new Identifier($type) : $type; + $this->byRef = $byRef; + $this->variadic = $variadic; + $this->var = $var; + $this->default = $default; + $this->flags = $flags; + $this->attrGroups = $attrGroups; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default']; + } + + public function getType() : string { + return 'Param'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php new file mode 100644 index 00000000..8117909b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php @@ -0,0 +1,7 @@ +attributes = $attributes; + $this->value = $value; + } + + public function getSubNodeNames() : array { + return ['value']; + } + + /** + * @param mixed[] $attributes + */ + public static function fromString(string $str, array $attributes = []): DNumber + { + $attributes['rawValue'] = $str; + $float = self::parse($str); + + return new DNumber($float, $attributes); + } + + /** + * @internal + * + * Parses a DNUMBER token like PHP would. + * + * @param string $str A string number + * + * @return float The parsed number + */ + public static function parse(string $str) : float { + $str = str_replace('_', '', $str); + + // if string contains any of .eE just cast it to float + if (false !== strpbrk($str, '.eE')) { + return (float) $str; + } + + // otherwise it's an integer notation that overflowed into a float + // if it starts with 0 it's one of the special integer notations + if ('0' === $str[0]) { + // hex + if ('x' === $str[1] || 'X' === $str[1]) { + return hexdec($str); + } + + // bin + if ('b' === $str[1] || 'B' === $str[1]) { + return bindec($str); + } + + // oct + // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit (8 or 9) + // so that only the digits before that are used + return octdec(substr($str, 0, strcspn($str, '89'))); + } + + // dec + return (float) $str; + } + + public function getType() : string { + return 'Scalar_DNumber'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php new file mode 100644 index 00000000..fa5d2e26 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php @@ -0,0 +1,31 @@ +attributes = $attributes; + $this->parts = $parts; + } + + public function getSubNodeNames() : array { + return ['parts']; + } + + public function getType() : string { + return 'Scalar_Encapsed'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php new file mode 100644 index 00000000..bb3194c1 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->value = $value; + } + + public function getSubNodeNames() : array { + return ['value']; + } + + public function getType() : string { + return 'Scalar_EncapsedStringPart'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php new file mode 100644 index 00000000..2cc2b22c --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php @@ -0,0 +1,80 @@ +attributes = $attributes; + $this->value = $value; + } + + public function getSubNodeNames() : array { + return ['value']; + } + + /** + * Constructs an LNumber node from a string number literal. + * + * @param string $str String number literal (decimal, octal, hex or binary) + * @param array $attributes Additional attributes + * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) + * + * @return LNumber The constructed LNumber, including kind attribute + */ + public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false) : LNumber { + $attributes['rawValue'] = $str; + + $str = str_replace('_', '', $str); + + if ('0' !== $str[0] || '0' === $str) { + $attributes['kind'] = LNumber::KIND_DEC; + return new LNumber((int) $str, $attributes); + } + + if ('x' === $str[1] || 'X' === $str[1]) { + $attributes['kind'] = LNumber::KIND_HEX; + return new LNumber(hexdec($str), $attributes); + } + + if ('b' === $str[1] || 'B' === $str[1]) { + $attributes['kind'] = LNumber::KIND_BIN; + return new LNumber(bindec($str), $attributes); + } + + if (!$allowInvalidOctal && strpbrk($str, '89')) { + throw new Error('Invalid numeric literal', $attributes); + } + + // Strip optional explicit octal prefix. + if ('o' === $str[1] || 'O' === $str[1]) { + $str = substr($str, 2); + } + + // use intval instead of octdec to get proper cutting behavior with malformed numbers + $attributes['kind'] = LNumber::KIND_OCT; + return new LNumber(intval($str, 8), $attributes); + } + + public function getType() : string { + return 'Scalar_LNumber'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php new file mode 100644 index 00000000..941f0c76 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php @@ -0,0 +1,28 @@ +attributes = $attributes; + } + + public function getSubNodeNames() : array { + return []; + } + + /** + * Get name of magic constant. + * + * @return string Name of magic constant + */ + abstract public function getName() : string; +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php new file mode 100644 index 00000000..24432847 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php @@ -0,0 +1,16 @@ + '\\', + '$' => '$', + 'n' => "\n", + 'r' => "\r", + 't' => "\t", + 'f' => "\f", + 'v' => "\v", + 'e' => "\x1B", + ]; + + /** + * Constructs a string scalar node. + * + * @param string $value Value of the string + * @param array $attributes Additional attributes + */ + public function __construct(string $value, array $attributes = []) { + $this->attributes = $attributes; + $this->value = $value; + } + + public function getSubNodeNames() : array { + return ['value']; + } + + /** + * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes + */ + public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self + { + $attributes['kind'] = ($str[0] === "'" || ($str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B'))) + ? Scalar\String_::KIND_SINGLE_QUOTED + : Scalar\String_::KIND_DOUBLE_QUOTED; + + $attributes['rawValue'] = $str; + + $string = self::parse($str, $parseUnicodeEscape); + + return new self($string, $attributes); + } + + /** + * @internal + * + * Parses a string token. + * + * @param string $str String token content + * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes + * + * @return string The parsed string + */ + public static function parse(string $str, bool $parseUnicodeEscape = true) : string { + $bLength = 0; + if ('b' === $str[0] || 'B' === $str[0]) { + $bLength = 1; + } + + if ('\'' === $str[$bLength]) { + return str_replace( + ['\\\\', '\\\''], + ['\\', '\''], + substr($str, $bLength + 1, -1) + ); + } else { + return self::parseEscapeSequences( + substr($str, $bLength + 1, -1), '"', $parseUnicodeEscape + ); + } + } + + /** + * @internal + * + * Parses escape sequences in strings (all string types apart from single quoted). + * + * @param string $str String without quotes + * @param null|string $quote Quote type + * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes + * + * @return string String with escape sequences parsed + */ + public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = true) : string { + if (null !== $quote) { + $str = str_replace('\\' . $quote, $quote, $str); + } + + $extra = ''; + if ($parseUnicodeEscape) { + $extra = '|u\{([0-9a-fA-F]+)\}'; + } + + return preg_replace_callback( + '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~', + function($matches) { + $str = $matches[1]; + + if (isset(self::$replacements[$str])) { + return self::$replacements[$str]; + } elseif ('x' === $str[0] || 'X' === $str[0]) { + return chr(hexdec(substr($str, 1))); + } elseif ('u' === $str[0]) { + return self::codePointToUtf8(hexdec($matches[2])); + } else { + return chr(octdec($str)); + } + }, + $str + ); + } + + /** + * Converts a Unicode code point to its UTF-8 encoded representation. + * + * @param int $num Code point + * + * @return string UTF-8 representation of code point + */ + 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); + } + throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large'); + } + + public function getType() : string { + return 'Scalar_String'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php new file mode 100644 index 00000000..69d33e57 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php @@ -0,0 +1,9 @@ +attributes = $attributes; + $this->num = $num; + } + + public function getSubNodeNames() : array { + return ['num']; + } + + public function getType() : string { + return 'Stmt_Break'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php new file mode 100644 index 00000000..2bf044c9 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->cond = $cond; + $this->stmts = $stmts; + } + + public function getSubNodeNames() : array { + return ['cond', 'stmts']; + } + + public function getType() : string { + return 'Stmt_Case'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php new file mode 100644 index 00000000..9b9c0947 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php @@ -0,0 +1,41 @@ +attributes = $attributes; + $this->types = $types; + $this->var = $var; + $this->stmts = $stmts; + } + + public function getSubNodeNames() : array { + return ['types', 'var', 'stmts']; + } + + public function getType() : string { + return 'Stmt_Catch'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php new file mode 100644 index 00000000..1fc7f336 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php @@ -0,0 +1,80 @@ +attributes = $attributes; + $this->flags = $flags; + $this->consts = $consts; + $this->attrGroups = $attrGroups; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'flags', 'consts']; + } + + /** + * Whether constant is explicitly or implicitly public. + * + * @return bool + */ + public function isPublic() : bool { + return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 + || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; + } + + /** + * Whether constant is protected. + * + * @return bool + */ + public function isProtected() : bool { + return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); + } + + /** + * Whether constant is private. + * + * @return bool + */ + public function isPrivate() : bool { + return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); + } + + /** + * Whether constant is final. + * + * @return bool + */ + public function isFinal() : bool { + return (bool) ($this->flags & Class_::MODIFIER_FINAL); + } + + public function getType() : string { + return 'Stmt_ClassConst'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php new file mode 100644 index 00000000..2fa4e861 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php @@ -0,0 +1,109 @@ +stmts as $stmt) { + if ($stmt instanceof TraitUse) { + $traitUses[] = $stmt; + } + } + return $traitUses; + } + + /** + * @return ClassConst[] + */ + public function getConstants() : array { + $constants = []; + foreach ($this->stmts as $stmt) { + if ($stmt instanceof ClassConst) { + $constants[] = $stmt; + } + } + return $constants; + } + + /** + * @return Property[] + */ + public function getProperties() : array { + $properties = []; + foreach ($this->stmts as $stmt) { + if ($stmt instanceof Property) { + $properties[] = $stmt; + } + } + return $properties; + } + + /** + * Gets property with the given name defined directly in this class/interface/trait. + * + * @param string $name Name of the property + * + * @return Property|null Property node or null if the property does not exist + */ + public function getProperty(string $name) { + foreach ($this->stmts as $stmt) { + if ($stmt instanceof Property) { + foreach ($stmt->props as $prop) { + if ($prop instanceof PropertyProperty && $name === $prop->name->toString()) { + return $stmt; + } + } + } + } + return null; + } + + /** + * Gets all methods defined directly in this class/interface/trait + * + * @return ClassMethod[] + */ + public function getMethods() : array { + $methods = []; + foreach ($this->stmts as $stmt) { + if ($stmt instanceof ClassMethod) { + $methods[] = $stmt; + } + } + return $methods; + } + + /** + * Gets method with the given name defined directly in this class/interface/trait. + * + * @param string $name Name of the method (compared case-insensitively) + * + * @return ClassMethod|null Method node or null if the method does not exist + */ + public function getMethod(string $name) { + $lowerName = strtolower($name); + foreach ($this->stmts as $stmt) { + if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) { + return $stmt; + } + } + return null; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php new file mode 100644 index 00000000..09b877a9 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php @@ -0,0 +1,159 @@ + true, + '__destruct' => true, + '__call' => true, + '__callstatic' => true, + '__get' => true, + '__set' => true, + '__isset' => true, + '__unset' => true, + '__sleep' => true, + '__wakeup' => true, + '__tostring' => true, + '__set_state' => true, + '__clone' => true, + '__invoke' => true, + '__debuginfo' => true, + ]; + + /** + * Constructs a class method node. + * + * @param string|Node\Identifier $name Name + * @param array $subNodes Array of the following optional subnodes: + * 'flags => MODIFIER_PUBLIC: Flags + * 'byRef' => false : Whether to return by reference + * 'params' => array() : Parameters + * 'returnType' => null : Return type + * 'stmts' => array() : Statements + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes + */ + public function __construct($name, array $subNodes = [], array $attributes = []) { + $this->attributes = $attributes; + $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; + $this->byRef = $subNodes['byRef'] ?? false; + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->params = $subNodes['params'] ?? []; + $returnType = $subNodes['returnType'] ?? null; + $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->stmts = array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts']; + } + + public function returnsByRef() : bool { + return $this->byRef; + } + + public function getParams() : array { + return $this->params; + } + + public function getReturnType() { + return $this->returnType; + } + + public function getStmts() { + return $this->stmts; + } + + public function getAttrGroups() : array { + return $this->attrGroups; + } + + /** + * Whether the method is explicitly or implicitly public. + * + * @return bool + */ + public function isPublic() : bool { + return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 + || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; + } + + /** + * Whether the method is protected. + * + * @return bool + */ + public function isProtected() : bool { + return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); + } + + /** + * Whether the method is private. + * + * @return bool + */ + public function isPrivate() : bool { + return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); + } + + /** + * Whether the method is abstract. + * + * @return bool + */ + public function isAbstract() : bool { + return (bool) ($this->flags & Class_::MODIFIER_ABSTRACT); + } + + /** + * Whether the method is final. + * + * @return bool + */ + public function isFinal() : bool { + return (bool) ($this->flags & Class_::MODIFIER_FINAL); + } + + /** + * Whether the method is static. + * + * @return bool + */ + public function isStatic() : bool { + return (bool) ($this->flags & Class_::MODIFIER_STATIC); + } + + /** + * Whether the method is magic. + * + * @return bool + */ + public function isMagic() : bool { + return isset(self::$magicNames[$this->name->toLowerString()]); + } + + public function getType() : string { + return 'Stmt_ClassMethod'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php new file mode 100644 index 00000000..52ed6c6c --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php @@ -0,0 +1,137 @@ + 0 : Flags + * 'extends' => null : Name of extended class + * 'implements' => array(): Names of implemented interfaces + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes + */ + public function __construct($name, array $subNodes = [], array $attributes = []) { + $this->attributes = $attributes; + $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->extends = $subNodes['extends'] ?? null; + $this->implements = $subNodes['implements'] ?? []; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts']; + } + + /** + * Whether the class is explicitly abstract. + * + * @return bool + */ + public function isAbstract() : bool { + return (bool) ($this->flags & self::MODIFIER_ABSTRACT); + } + + /** + * Whether the class is final. + * + * @return bool + */ + public function isFinal() : bool { + return (bool) ($this->flags & self::MODIFIER_FINAL); + } + + public function isReadonly() : bool { + return (bool) ($this->flags & self::MODIFIER_READONLY); + } + + /** + * Whether the class is anonymous. + * + * @return bool + */ + public function isAnonymous() : bool { + return null === $this->name; + } + + /** + * @internal + */ + public static function verifyClassModifier($a, $b) { + if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { + throw new Error('Multiple abstract modifiers are not allowed'); + } + + if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { + throw new Error('Multiple final modifiers are not allowed'); + } + + if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { + throw new Error('Multiple readonly modifiers are not allowed'); + } + + if ($a & 48 && $b & 48) { + throw new Error('Cannot use the final modifier on an abstract class'); + } + } + + /** + * @internal + */ + public static function verifyModifier($a, $b) { + if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) { + throw new Error('Multiple access type modifiers are not allowed'); + } + + if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { + throw new Error('Multiple abstract modifiers are not allowed'); + } + + if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) { + throw new Error('Multiple static modifiers are not allowed'); + } + + if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { + throw new Error('Multiple final modifiers are not allowed'); + } + + if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { + throw new Error('Multiple readonly modifiers are not allowed'); + } + + if ($a & 48 && $b & 48) { + throw new Error('Cannot use the final modifier on an abstract class member'); + } + } + + public function getType() : string { + return 'Stmt_Class'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php new file mode 100644 index 00000000..e6316345 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->consts = $consts; + } + + public function getSubNodeNames() : array { + return ['consts']; + } + + public function getType() : string { + return 'Stmt_Const'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php new file mode 100644 index 00000000..24882683 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->num = $num; + } + + public function getSubNodeNames() : array { + return ['num']; + } + + public function getType() : string { + return 'Stmt_Continue'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php new file mode 100644 index 00000000..ac07f30c --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php @@ -0,0 +1,34 @@ +value pair node. + * + * @param string|Node\Identifier $key Key + * @param Node\Expr $value Value + * @param array $attributes Additional attributes + */ + public function __construct($key, Node\Expr $value, array $attributes = []) { + $this->attributes = $attributes; + $this->key = \is_string($key) ? new Node\Identifier($key) : $key; + $this->value = $value; + } + + public function getSubNodeNames() : array { + return ['key', 'value']; + } + + public function getType() : string { + return 'Stmt_DeclareDeclare'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php new file mode 100644 index 00000000..f46ff0ba --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->declares = $declares; + $this->stmts = $stmts; + } + + public function getSubNodeNames() : array { + return ['declares', 'stmts']; + } + + public function getType() : string { + return 'Stmt_Declare'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php new file mode 100644 index 00000000..78e90da0 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->cond = $cond; + $this->stmts = $stmts; + } + + public function getSubNodeNames() : array { + return ['stmts', 'cond']; + } + + public function getType() : string { + return 'Stmt_Do'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php new file mode 100644 index 00000000..7cc50d5d --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->exprs = $exprs; + } + + public function getSubNodeNames() : array { + return ['exprs']; + } + + public function getType() : string { + return 'Stmt_Echo'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php new file mode 100644 index 00000000..eef1ece3 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->cond = $cond; + $this->stmts = $stmts; + } + + public function getSubNodeNames() : array { + return ['cond', 'stmts']; + } + + public function getType() : string { + return 'Stmt_ElseIf'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php new file mode 100644 index 00000000..0e61778e --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->stmts = $stmts; + } + + public function getSubNodeNames() : array { + return ['stmts']; + } + + public function getType() : string { + return 'Stmt_Else'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php new file mode 100644 index 00000000..5beff8b3 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php @@ -0,0 +1,37 @@ +name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->expr = $expr; + $this->attrGroups = $attrGroups; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'name', 'expr']; + } + + public function getType() : string { + return 'Stmt_EnumCase'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php new file mode 100644 index 00000000..3a50c225 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php @@ -0,0 +1,40 @@ + null : Scalar type + * 'implements' => array() : Names of implemented interfaces + * 'stmts' => array() : Statements + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes + */ + public function __construct($name, array $subNodes = [], array $attributes = []) { + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->scalarType = $subNodes['scalarType'] ?? null; + $this->implements = $subNodes['implements'] ?? []; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + + parent::__construct($attributes); + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts']; + } + + public function getType() : string { + return 'Stmt_Enum'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php new file mode 100644 index 00000000..99d1687d --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php @@ -0,0 +1,33 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Stmt_Expression'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php new file mode 100644 index 00000000..d55b8b68 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->stmts = $stmts; + } + + public function getSubNodeNames() : array { + return ['stmts']; + } + + public function getType() : string { + return 'Stmt_Finally'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php new file mode 100644 index 00000000..1323d37c --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php @@ -0,0 +1,43 @@ + array(): Init expressions + * 'cond' => array(): Loop conditions + * 'loop' => array(): Loop expressions + * 'stmts' => array(): Statements + * @param array $attributes Additional attributes + */ + public function __construct(array $subNodes = [], array $attributes = []) { + $this->attributes = $attributes; + $this->init = $subNodes['init'] ?? []; + $this->cond = $subNodes['cond'] ?? []; + $this->loop = $subNodes['loop'] ?? []; + $this->stmts = $subNodes['stmts'] ?? []; + } + + public function getSubNodeNames() : array { + return ['init', 'cond', 'loop', 'stmts']; + } + + public function getType() : string { + return 'Stmt_For'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php new file mode 100644 index 00000000..0556a7ce --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php @@ -0,0 +1,47 @@ + null : Variable to assign key to + * 'byRef' => false : Whether to assign value by reference + * 'stmts' => array(): Statements + * @param array $attributes Additional attributes + */ + public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) { + $this->attributes = $attributes; + $this->expr = $expr; + $this->keyVar = $subNodes['keyVar'] ?? null; + $this->byRef = $subNodes['byRef'] ?? false; + $this->valueVar = $valueVar; + $this->stmts = $subNodes['stmts'] ?? []; + } + + public function getSubNodeNames() : array { + return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts']; + } + + public function getType() : string { + return 'Stmt_Foreach'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php new file mode 100644 index 00000000..c2ccae24 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php @@ -0,0 +1,77 @@ + false : Whether to return by reference + * 'params' => array(): Parameters + * 'returnType' => null : Return type + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes + */ + public function __construct($name, array $subNodes = [], array $attributes = []) { + $this->attributes = $attributes; + $this->byRef = $subNodes['byRef'] ?? false; + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->params = $subNodes['params'] ?? []; + $returnType = $subNodes['returnType'] ?? null; + $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts']; + } + + public function returnsByRef() : bool { + return $this->byRef; + } + + public function getParams() : array { + return $this->params; + } + + public function getReturnType() { + return $this->returnType; + } + + public function getAttrGroups() : array { + return $this->attrGroups; + } + + /** @return Node\Stmt[] */ + public function getStmts() : array { + return $this->stmts; + } + + public function getType() : string { + return 'Stmt_Function'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php new file mode 100644 index 00000000..a0022ad9 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->vars = $vars; + } + + public function getSubNodeNames() : array { + return ['vars']; + } + + public function getType() : string { + return 'Stmt_Global'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php new file mode 100644 index 00000000..24a57f78 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php @@ -0,0 +1,31 @@ +attributes = $attributes; + $this->name = \is_string($name) ? new Identifier($name) : $name; + } + + public function getSubNodeNames() : array { + return ['name']; + } + + public function getType() : string { + return 'Stmt_Goto'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php new file mode 100644 index 00000000..24520d22 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php @@ -0,0 +1,39 @@ +attributes = $attributes; + $this->type = $type; + $this->prefix = $prefix; + $this->uses = $uses; + } + + public function getSubNodeNames() : array { + return ['type', 'prefix', 'uses']; + } + + public function getType() : string { + return 'Stmt_GroupUse'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php new file mode 100644 index 00000000..8e624e0f --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->remaining = $remaining; + } + + public function getSubNodeNames() : array { + return ['remaining']; + } + + public function getType() : string { + return 'Stmt_HaltCompiler'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php new file mode 100644 index 00000000..a1bae4bf --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php @@ -0,0 +1,43 @@ + array(): Statements + * 'elseifs' => array(): Elseif clauses + * 'else' => null : Else clause + * @param array $attributes Additional attributes + */ + public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) { + $this->attributes = $attributes; + $this->cond = $cond; + $this->stmts = $subNodes['stmts'] ?? []; + $this->elseifs = $subNodes['elseifs'] ?? []; + $this->else = $subNodes['else'] ?? null; + } + + public function getSubNodeNames() : array { + return ['cond', 'stmts', 'elseifs', 'else']; + } + + public function getType() : string { + return 'Stmt_If'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php new file mode 100644 index 00000000..0711d284 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->value = $value; + } + + public function getSubNodeNames() : array { + return ['value']; + } + + public function getType() : string { + return 'Stmt_InlineHTML'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php new file mode 100644 index 00000000..4d587dd4 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php @@ -0,0 +1,37 @@ + array(): Name of extended interfaces + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes + */ + public function __construct($name, array $subNodes = [], array $attributes = []) { + $this->attributes = $attributes; + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->extends = $subNodes['extends'] ?? []; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'name', 'extends', 'stmts']; + } + + public function getType() : string { + return 'Stmt_Interface'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php new file mode 100644 index 00000000..3edcb3be --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php @@ -0,0 +1,31 @@ +attributes = $attributes; + $this->name = \is_string($name) ? new Identifier($name) : $name; + } + + public function getSubNodeNames() : array { + return ['name']; + } + + public function getType() : string { + return 'Stmt_Label'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php new file mode 100644 index 00000000..c6320457 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php @@ -0,0 +1,38 @@ +attributes = $attributes; + $this->name = $name; + $this->stmts = $stmts; + } + + public function getSubNodeNames() : array { + return ['name', 'stmts']; + } + + public function getType() : string { + return 'Stmt_Namespace'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php new file mode 100644 index 00000000..f86f8df7 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php @@ -0,0 +1,17 @@ +attributes = $attributes; + $this->flags = $flags; + $this->props = $props; + $this->type = \is_string($type) ? new Identifier($type) : $type; + $this->attrGroups = $attrGroups; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'flags', 'type', 'props']; + } + + /** + * Whether the property is explicitly or implicitly public. + * + * @return bool + */ + public function isPublic() : bool { + return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 + || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; + } + + /** + * Whether the property is protected. + * + * @return bool + */ + public function isProtected() : bool { + return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); + } + + /** + * Whether the property is private. + * + * @return bool + */ + public function isPrivate() : bool { + return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); + } + + /** + * Whether the property is static. + * + * @return bool + */ + public function isStatic() : bool { + return (bool) ($this->flags & Class_::MODIFIER_STATIC); + } + + /** + * Whether the property is readonly. + * + * @return bool + */ + public function isReadonly() : bool { + return (bool) ($this->flags & Class_::MODIFIER_READONLY); + } + + public function getType() : string { + return 'Stmt_Property'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php new file mode 100644 index 00000000..205731e2 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; + $this->default = $default; + } + + public function getSubNodeNames() : array { + return ['name', 'default']; + } + + public function getType() : string { + return 'Stmt_PropertyProperty'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php new file mode 100644 index 00000000..efc578c5 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Stmt_Return'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php new file mode 100644 index 00000000..29584560 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php @@ -0,0 +1,37 @@ +attributes = $attributes; + $this->var = $var; + $this->default = $default; + } + + public function getSubNodeNames() : array { + return ['var', 'default']; + } + + public function getType() : string { + return 'Stmt_StaticVar'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php new file mode 100644 index 00000000..464898ff --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->vars = $vars; + } + + public function getSubNodeNames() : array { + return ['vars']; + } + + public function getType() : string { + return 'Stmt_Static'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php new file mode 100644 index 00000000..2c8dae02 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->cond = $cond; + $this->cases = $cases; + } + + public function getSubNodeNames() : array { + return ['cond', 'cases']; + } + + public function getType() : string { + return 'Stmt_Switch'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php new file mode 100644 index 00000000..a34e2b36 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->expr = $expr; + } + + public function getSubNodeNames() : array { + return ['expr']; + } + + public function getType() : string { + return 'Stmt_Throw'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php new file mode 100644 index 00000000..9e97053b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->traits = $traits; + $this->adaptations = $adaptations; + } + + public function getSubNodeNames() : array { + return ['traits', 'adaptations']; + } + + public function getType() : string { + return 'Stmt_TraitUse'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php new file mode 100644 index 00000000..8bdd2c04 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php @@ -0,0 +1,13 @@ +attributes = $attributes; + $this->trait = $trait; + $this->method = \is_string($method) ? new Node\Identifier($method) : $method; + $this->newModifier = $newModifier; + $this->newName = \is_string($newName) ? new Node\Identifier($newName) : $newName; + } + + public function getSubNodeNames() : array { + return ['trait', 'method', 'newModifier', 'newName']; + } + + public function getType() : string { + return 'Stmt_TraitUseAdaptation_Alias'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php new file mode 100644 index 00000000..80385f64 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->trait = $trait; + $this->method = \is_string($method) ? new Node\Identifier($method) : $method; + $this->insteadof = $insteadof; + } + + public function getSubNodeNames() : array { + return ['trait', 'method', 'insteadof']; + } + + public function getType() : string { + return 'Stmt_TraitUseAdaptation_Precedence'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php new file mode 100644 index 00000000..0cec203a --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php @@ -0,0 +1,32 @@ + array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes + */ + public function __construct($name, array $subNodes = [], array $attributes = []) { + $this->attributes = $attributes; + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + + public function getSubNodeNames() : array { + return ['attrGroups', 'name', 'stmts']; + } + + public function getType() : string { + return 'Stmt_Trait'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php new file mode 100644 index 00000000..7fc158c5 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php @@ -0,0 +1,38 @@ +attributes = $attributes; + $this->stmts = $stmts; + $this->catches = $catches; + $this->finally = $finally; + } + + public function getSubNodeNames() : array { + return ['stmts', 'catches', 'finally']; + } + + public function getType() : string { + return 'Stmt_TryCatch'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php new file mode 100644 index 00000000..310e427a --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php @@ -0,0 +1,30 @@ +attributes = $attributes; + $this->vars = $vars; + } + + public function getSubNodeNames() : array { + return ['vars']; + } + + public function getType() : string { + return 'Stmt_Unset'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php new file mode 100644 index 00000000..32bd7847 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php @@ -0,0 +1,52 @@ +attributes = $attributes; + $this->type = $type; + $this->name = $name; + $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; + } + + public function getSubNodeNames() : array { + return ['type', 'name', 'alias']; + } + + /** + * Get alias. If not explicitly given this is the last component of the used name. + * + * @return Identifier + */ + public function getAlias() : Identifier { + if (null !== $this->alias) { + return $this->alias; + } + + return new Identifier($this->name->getLast()); + } + + public function getType() : string { + return 'Stmt_UseUse'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php new file mode 100644 index 00000000..8753da31 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php @@ -0,0 +1,47 @@ +attributes = $attributes; + $this->type = $type; + $this->uses = $uses; + } + + public function getSubNodeNames() : array { + return ['type', 'uses']; + } + + public function getType() : string { + return 'Stmt_Use'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php new file mode 100644 index 00000000..f41034f8 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php @@ -0,0 +1,34 @@ +attributes = $attributes; + $this->cond = $cond; + $this->stmts = $stmts; + } + + public function getSubNodeNames() : array { + return ['cond', 'stmts']; + } + + public function getType() : string { + return 'Stmt_While'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php new file mode 100644 index 00000000..61c2d810 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php @@ -0,0 +1,28 @@ +attributes = $attributes; + $this->types = $types; + } + + public function getSubNodeNames() : array { + return ['types']; + } + + public function getType() : string { + return 'UnionType'; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php b/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php new file mode 100644 index 00000000..a30807a6 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php @@ -0,0 +1,17 @@ +attributes = $attributes; + } + + public function getType(): string { + return 'VariadicPlaceholder'; + } + + public function getSubNodeNames(): array { + return []; + } +} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php new file mode 100644 index 00000000..04514da1 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php @@ -0,0 +1,178 @@ +attributes = $attributes; + } + + /** + * Gets line the node started in (alias of getStartLine). + * + * @return int Start line (or -1 if not available) + */ + public function getLine() : int { + return $this->attributes['startLine'] ?? -1; + } + + /** + * Gets line the node started in. + * + * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). + * + * @return int Start line (or -1 if not available) + */ + public function getStartLine() : int { + return $this->attributes['startLine'] ?? -1; + } + + /** + * Gets the line the node ended in. + * + * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). + * + * @return int End line (or -1 if not available) + */ + public function getEndLine() : int { + return $this->attributes['endLine'] ?? -1; + } + + /** + * Gets the token offset of the first token that is part of this node. + * + * The offset is an index into the array returned by Lexer::getTokens(). + * + * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int Token start position (or -1 if not available) + */ + public function getStartTokenPos() : int { + return $this->attributes['startTokenPos'] ?? -1; + } + + /** + * Gets the token offset of the last token that is part of this node. + * + * The offset is an index into the array returned by Lexer::getTokens(). + * + * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int Token end position (or -1 if not available) + */ + public function getEndTokenPos() : int { + return $this->attributes['endTokenPos'] ?? -1; + } + + /** + * Gets the file offset of the first character that is part of this node. + * + * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int File start position (or -1 if not available) + */ + public function getStartFilePos() : int { + return $this->attributes['startFilePos'] ?? -1; + } + + /** + * Gets the file offset of the last character that is part of this node. + * + * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int File end position (or -1 if not available) + */ + public function getEndFilePos() : int { + return $this->attributes['endFilePos'] ?? -1; + } + + /** + * Gets all comments directly preceding this node. + * + * The comments are also available through the "comments" attribute. + * + * @return Comment[] + */ + public function getComments() : array { + return $this->attributes['comments'] ?? []; + } + + /** + * Gets the doc comment of the node. + * + * @return null|Comment\Doc Doc comment object or null + */ + public function getDocComment() { + $comments = $this->getComments(); + for ($i = count($comments) - 1; $i >= 0; $i--) { + $comment = $comments[$i]; + if ($comment instanceof Comment\Doc) { + return $comment; + } + } + + return null; + } + + /** + * Sets the doc comment of the node. + * + * This will either replace an existing doc comment or add it to the comments array. + * + * @param Comment\Doc $docComment Doc comment to set + */ + public function setDocComment(Comment\Doc $docComment) { + $comments = $this->getComments(); + for ($i = count($comments) - 1; $i >= 0; $i--) { + if ($comments[$i] instanceof Comment\Doc) { + // Replace existing doc comment. + $comments[$i] = $docComment; + $this->setAttribute('comments', $comments); + return; + } + } + + // Append new doc comment. + $comments[] = $docComment; + $this->setAttribute('comments', $comments); + } + + public function setAttribute(string $key, $value) { + $this->attributes[$key] = $value; + } + + public function hasAttribute(string $key) : bool { + return array_key_exists($key, $this->attributes); + } + + public function getAttribute(string $key, $default = null) { + if (array_key_exists($key, $this->attributes)) { + return $this->attributes[$key]; + } + + return $default; + } + + public function getAttributes() : array { + return $this->attributes; + } + + public function setAttributes(array $attributes) { + $this->attributes = $attributes; + } + + /** + * @return array + */ + public function jsonSerialize() : array { + return ['nodeType' => $this->getType()] + get_object_vars($this); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php b/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php new file mode 100644 index 00000000..ba622efd --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php @@ -0,0 +1,206 @@ +dumpComments = !empty($options['dumpComments']); + $this->dumpPositions = !empty($options['dumpPositions']); + } + + /** + * Dumps a node or array. + * + * @param array|Node $node Node or array to dump + * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if + * the dumpPositions option is enabled and the dumping of node offsets + * is desired. + * + * @return string Dumped value + */ + public function dump($node, string $code = null) : string { + $this->code = $code; + return $this->dumpRecursive($node); + } + + protected function dumpRecursive($node) { + if ($node instanceof Node) { + $r = $node->getType(); + if ($this->dumpPositions && null !== $p = $this->dumpPosition($node)) { + $r .= $p; + } + $r .= '('; + + foreach ($node->getSubNodeNames() as $key) { + $r .= "\n " . $key . ': '; + + $value = $node->$key; + if (null === $value) { + $r .= 'null'; + } elseif (false === $value) { + $r .= 'false'; + } elseif (true === $value) { + $r .= 'true'; + } elseif (is_scalar($value)) { + if ('flags' === $key || 'newModifier' === $key) { + $r .= $this->dumpFlags($value); + } elseif ('type' === $key && $node instanceof Include_) { + $r .= $this->dumpIncludeType($value); + } elseif ('type' === $key + && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) { + $r .= $this->dumpUseType($value); + } else { + $r .= $value; + } + } else { + $r .= str_replace("\n", "\n ", $this->dumpRecursive($value)); + } + } + + if ($this->dumpComments && $comments = $node->getComments()) { + $r .= "\n comments: " . str_replace("\n", "\n ", $this->dumpRecursive($comments)); + } + } elseif (is_array($node)) { + $r = 'array('; + + foreach ($node as $key => $value) { + $r .= "\n " . $key . ': '; + + if (null === $value) { + $r .= 'null'; + } elseif (false === $value) { + $r .= 'false'; + } elseif (true === $value) { + $r .= 'true'; + } elseif (is_scalar($value)) { + $r .= $value; + } else { + $r .= str_replace("\n", "\n ", $this->dumpRecursive($value)); + } + } + } elseif ($node instanceof Comment) { + return $node->getReformattedText(); + } else { + throw new \InvalidArgumentException('Can only dump nodes and arrays.'); + } + + return $r . "\n)"; + } + + protected function dumpFlags($flags) { + $strs = []; + if ($flags & Class_::MODIFIER_PUBLIC) { + $strs[] = 'MODIFIER_PUBLIC'; + } + if ($flags & Class_::MODIFIER_PROTECTED) { + $strs[] = 'MODIFIER_PROTECTED'; + } + if ($flags & Class_::MODIFIER_PRIVATE) { + $strs[] = 'MODIFIER_PRIVATE'; + } + if ($flags & Class_::MODIFIER_ABSTRACT) { + $strs[] = 'MODIFIER_ABSTRACT'; + } + if ($flags & Class_::MODIFIER_STATIC) { + $strs[] = 'MODIFIER_STATIC'; + } + if ($flags & Class_::MODIFIER_FINAL) { + $strs[] = 'MODIFIER_FINAL'; + } + if ($flags & Class_::MODIFIER_READONLY) { + $strs[] = 'MODIFIER_READONLY'; + } + + if ($strs) { + return implode(' | ', $strs) . ' (' . $flags . ')'; + } else { + return $flags; + } + } + + protected function dumpIncludeType($type) { + $map = [ + Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', + Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', + Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', + Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE', + ]; + + if (!isset($map[$type])) { + return $type; + } + return $map[$type] . ' (' . $type . ')'; + } + + protected function dumpUseType($type) { + $map = [ + Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', + Use_::TYPE_NORMAL => 'TYPE_NORMAL', + Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', + Use_::TYPE_CONSTANT => 'TYPE_CONSTANT', + ]; + + if (!isset($map[$type])) { + return $type; + } + return $map[$type] . ' (' . $type . ')'; + } + + /** + * Dump node position, if possible. + * + * @param Node $node Node for which to dump position + * + * @return string|null Dump of position, or null if position information not available + */ + protected function dumpPosition(Node $node) { + if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) { + return null; + } + + $start = $node->getStartLine(); + $end = $node->getEndLine(); + if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos') + && null !== $this->code + ) { + $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos()); + $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos()); + } + return "[$start - $end]"; + } + + // Copied from Error class + private function toColumn($code, $pos) { + if ($pos > strlen($code)) { + throw new \RuntimeException('Invalid position information'); + } + + $lineStartPos = strrpos($code, "\n", $pos - strlen($code)); + if (false === $lineStartPos) { + $lineStartPos = -1; + } + + return $pos - $lineStartPos; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php b/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php new file mode 100644 index 00000000..2e7cfdad --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php @@ -0,0 +1,81 @@ +addVisitor($visitor); + $traverser->traverse($nodes); + + return $visitor->getFoundNodes(); + } + + /** + * Find all nodes that are instances of a certain class. + * + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param string $class Class name + * + * @return Node[] Found nodes (all instances of $class) + */ + public function findInstanceOf($nodes, string $class) : array { + return $this->find($nodes, function ($node) use ($class) { + return $node instanceof $class; + }); + } + + /** + * Find first node satisfying a filter callback. + * + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param callable $filter Filter callback: function(Node $node) : bool + * + * @return null|Node Found node (or null if none found) + */ + public function findFirst($nodes, callable $filter) { + if (!is_array($nodes)) { + $nodes = [$nodes]; + } + + $visitor = new FirstFindingVisitor($filter); + + $traverser = new NodeTraverser; + $traverser->addVisitor($visitor); + $traverser->traverse($nodes); + + return $visitor->getFoundNode(); + } + + /** + * Find first node that is an instance of a certain class. + * + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param string $class Class name + * + * @return null|Node Found node, which is an instance of $class (or null if none found) + */ + public function findFirstInstanceOf($nodes, string $class) { + return $this->findFirst($nodes, function ($node) use ($class) { + return $node instanceof $class; + }); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php new file mode 100644 index 00000000..97d45bda --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php @@ -0,0 +1,291 @@ +visitors[] = $visitor; + } + + /** + * Removes an added visitor. + * + * @param NodeVisitor $visitor + */ + public function removeVisitor(NodeVisitor $visitor) { + foreach ($this->visitors as $index => $storedVisitor) { + if ($storedVisitor === $visitor) { + unset($this->visitors[$index]); + break; + } + } + } + + /** + * Traverses an array of nodes using the registered visitors. + * + * @param Node[] $nodes Array of nodes + * + * @return Node[] Traversed array of nodes + */ + public function traverse(array $nodes) : array { + $this->stopTraversal = false; + + foreach ($this->visitors as $visitor) { + if (null !== $return = $visitor->beforeTraverse($nodes)) { + $nodes = $return; + } + } + + $nodes = $this->traverseArray($nodes); + + foreach ($this->visitors as $visitor) { + if (null !== $return = $visitor->afterTraverse($nodes)) { + $nodes = $return; + } + } + + return $nodes; + } + + /** + * Recursively traverse a node. + * + * @param Node $node Node to traverse. + * + * @return Node Result of traversal (may be original node or new one) + */ + protected function traverseNode(Node $node) : Node { + foreach ($node->getSubNodeNames() as $name) { + $subNode =& $node->$name; + + if (\is_array($subNode)) { + $subNode = $this->traverseArray($subNode); + if ($this->stopTraversal) { + break; + } + } elseif ($subNode instanceof Node) { + $traverseChildren = true; + $breakVisitorIndex = null; + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->enterNode($subNode); + if (null !== $return) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($subNode, $return); + $subNode = $return; + } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { + $traverseChildren = false; + } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { + $traverseChildren = false; + $breakVisitorIndex = $visitorIndex; + break; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = true; + break 2; + } else { + throw new \LogicException( + 'enterNode() returned invalid value of type ' . gettype($return) + ); + } + } + } + + if ($traverseChildren) { + $subNode = $this->traverseNode($subNode); + if ($this->stopTraversal) { + break; + } + } + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->leaveNode($subNode); + + if (null !== $return) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($subNode, $return); + $subNode = $return; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = true; + break 2; + } elseif (\is_array($return)) { + throw new \LogicException( + 'leaveNode() may only return an array ' . + 'if the parent structure is an array' + ); + } else { + throw new \LogicException( + 'leaveNode() returned invalid value of type ' . gettype($return) + ); + } + } + + if ($breakVisitorIndex === $visitorIndex) { + break; + } + } + } + } + + return $node; + } + + /** + * Recursively traverse array (usually of nodes). + * + * @param array $nodes Array to traverse + * + * @return array Result of traversal (may be original array or changed one) + */ + protected function traverseArray(array $nodes) : array { + $doNodes = []; + + foreach ($nodes as $i => &$node) { + if ($node instanceof Node) { + $traverseChildren = true; + $breakVisitorIndex = null; + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->enterNode($node); + if (null !== $return) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($node, $return); + $node = $return; + } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { + $traverseChildren = false; + } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { + $traverseChildren = false; + $breakVisitorIndex = $visitorIndex; + break; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = true; + break 2; + } else { + throw new \LogicException( + 'enterNode() returned invalid value of type ' . gettype($return) + ); + } + } + } + + if ($traverseChildren) { + $node = $this->traverseNode($node); + if ($this->stopTraversal) { + break; + } + } + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->leaveNode($node); + + if (null !== $return) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($node, $return); + $node = $return; + } elseif (\is_array($return)) { + $doNodes[] = [$i, $return]; + break; + } elseif (self::REMOVE_NODE === $return) { + $doNodes[] = [$i, []]; + break; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = true; + break 2; + } elseif (false === $return) { + throw new \LogicException( + 'bool(false) return from leaveNode() no longer supported. ' . + 'Return NodeTraverser::REMOVE_NODE instead' + ); + } else { + throw new \LogicException( + 'leaveNode() returned invalid value of type ' . gettype($return) + ); + } + } + + if ($breakVisitorIndex === $visitorIndex) { + break; + } + } + } elseif (\is_array($node)) { + throw new \LogicException('Invalid node structure: Contains nested arrays'); + } + } + + if (!empty($doNodes)) { + while (list($i, $replace) = array_pop($doNodes)) { + array_splice($nodes, $i, 1, $replace); + } + } + + return $nodes; + } + + private function ensureReplacementReasonable($old, $new) { + if ($old instanceof Node\Stmt && $new instanceof Node\Expr) { + throw new \LogicException( + "Trying to replace statement ({$old->getType()}) " . + "with expression ({$new->getType()}). Are you missing a " . + "Stmt_Expression wrapper?" + ); + } + + if ($old instanceof Node\Expr && $new instanceof Node\Stmt) { + throw new \LogicException( + "Trying to replace expression ({$old->getType()}) " . + "with statement ({$new->getType()})" + ); + } + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php new file mode 100644 index 00000000..77ff3d27 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php @@ -0,0 +1,29 @@ + $node stays as-is + * * NodeTraverser::DONT_TRAVERSE_CHILDREN + * => Children of $node are not traversed. $node stays as-is + * * NodeTraverser::STOP_TRAVERSAL + * => Traversal is aborted. $node stays as-is + * * otherwise + * => $node is set to the return value + * + * @param Node $node Node + * + * @return null|int|Node Replacement node (or special return value) + */ + public function enterNode(Node $node); + + /** + * Called when leaving a node. + * + * Return value semantics: + * * null + * => $node stays as-is + * * NodeTraverser::REMOVE_NODE + * => $node is removed from the parent array + * * NodeTraverser::STOP_TRAVERSAL + * => Traversal is aborted. $node stays as-is + * * array (of Nodes) + * => The return value is merged into the parent array (at the position of the $node) + * * otherwise + * => $node is set to the return value + * + * @param Node $node Node + * + * @return null|int|Node|Node[] Replacement node (or special return value) + */ + public function leaveNode(Node $node); + + /** + * Called once after traversal. + * + * Return value semantics: + * * null: $nodes stays as-is + * * otherwise: $nodes is set to the return value + * + * @param Node[] $nodes Array of nodes + * + * @return null|Node[] Array of nodes + */ + public function afterTraverse(array $nodes); +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php new file mode 100644 index 00000000..a85fa493 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php @@ -0,0 +1,20 @@ +setAttribute('origNode', $origNode); + return $node; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php new file mode 100644 index 00000000..9531edbc --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php @@ -0,0 +1,48 @@ +filterCallback = $filterCallback; + } + + /** + * Get found nodes satisfying the filter callback. + * + * Nodes are returned in pre-order. + * + * @return Node[] Found nodes + */ + public function getFoundNodes() : array { + return $this->foundNodes; + } + + public function beforeTraverse(array $nodes) { + $this->foundNodes = []; + + return null; + } + + public function enterNode(Node $node) { + $filterCallback = $this->filterCallback; + if ($filterCallback($node)) { + $this->foundNodes[] = $node; + } + + return null; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php new file mode 100644 index 00000000..596a7d7f --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php @@ -0,0 +1,50 @@ +filterCallback = $filterCallback; + } + + /** + * Get found node satisfying the filter callback. + * + * Returns null if no node satisfies the filter callback. + * + * @return null|Node Found node (or null if not found) + */ + public function getFoundNode() { + return $this->foundNode; + } + + public function beforeTraverse(array $nodes) { + $this->foundNode = null; + + return null; + } + + public function enterNode(Node $node) { + $filterCallback = $this->filterCallback; + if ($filterCallback($node)) { + $this->foundNode = $node; + return NodeTraverser::STOP_TRAVERSAL; + } + + return null; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php new file mode 100644 index 00000000..8e259c57 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php @@ -0,0 +1,257 @@ +nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing); + $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? false; + $this->replaceNodes = $options['replaceNodes'] ?? true; + } + + /** + * Get name resolution context. + * + * @return NameContext + */ + public function getNameContext() : NameContext { + return $this->nameContext; + } + + public function beforeTraverse(array $nodes) { + $this->nameContext->startNamespace(); + return null; + } + + public function enterNode(Node $node) { + if ($node instanceof Stmt\Namespace_) { + $this->nameContext->startNamespace($node->name); + } elseif ($node instanceof Stmt\Use_) { + foreach ($node->uses as $use) { + $this->addAlias($use, $node->type, null); + } + } elseif ($node instanceof Stmt\GroupUse) { + foreach ($node->uses as $use) { + $this->addAlias($use, $node->type, $node->prefix); + } + } elseif ($node instanceof Stmt\Class_) { + if (null !== $node->extends) { + $node->extends = $this->resolveClassName($node->extends); + } + + foreach ($node->implements as &$interface) { + $interface = $this->resolveClassName($interface); + } + + $this->resolveAttrGroups($node); + if (null !== $node->name) { + $this->addNamespacedName($node); + } + } elseif ($node instanceof Stmt\Interface_) { + foreach ($node->extends as &$interface) { + $interface = $this->resolveClassName($interface); + } + + $this->resolveAttrGroups($node); + $this->addNamespacedName($node); + } elseif ($node instanceof Stmt\Enum_) { + foreach ($node->implements as &$interface) { + $interface = $this->resolveClassName($interface); + } + + $this->resolveAttrGroups($node); + if (null !== $node->name) { + $this->addNamespacedName($node); + } + } elseif ($node instanceof Stmt\Trait_) { + $this->resolveAttrGroups($node); + $this->addNamespacedName($node); + } elseif ($node instanceof Stmt\Function_) { + $this->resolveSignature($node); + $this->resolveAttrGroups($node); + $this->addNamespacedName($node); + } elseif ($node instanceof Stmt\ClassMethod + || $node instanceof Expr\Closure + || $node instanceof Expr\ArrowFunction + ) { + $this->resolveSignature($node); + $this->resolveAttrGroups($node); + } elseif ($node instanceof Stmt\Property) { + if (null !== $node->type) { + $node->type = $this->resolveType($node->type); + } + $this->resolveAttrGroups($node); + } elseif ($node instanceof Stmt\Const_) { + foreach ($node->consts as $const) { + $this->addNamespacedName($const); + } + } else if ($node instanceof Stmt\ClassConst) { + $this->resolveAttrGroups($node); + } else if ($node instanceof Stmt\EnumCase) { + $this->resolveAttrGroups($node); + } elseif ($node instanceof Expr\StaticCall + || $node instanceof Expr\StaticPropertyFetch + || $node instanceof Expr\ClassConstFetch + || $node instanceof Expr\New_ + || $node instanceof Expr\Instanceof_ + ) { + if ($node->class instanceof Name) { + $node->class = $this->resolveClassName($node->class); + } + } elseif ($node instanceof Stmt\Catch_) { + foreach ($node->types as &$type) { + $type = $this->resolveClassName($type); + } + } elseif ($node instanceof Expr\FuncCall) { + if ($node->name instanceof Name) { + $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); + } + } elseif ($node instanceof Expr\ConstFetch) { + $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); + } elseif ($node instanceof Stmt\TraitUse) { + foreach ($node->traits as &$trait) { + $trait = $this->resolveClassName($trait); + } + + foreach ($node->adaptations as $adaptation) { + if (null !== $adaptation->trait) { + $adaptation->trait = $this->resolveClassName($adaptation->trait); + } + + if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { + foreach ($adaptation->insteadof as &$insteadof) { + $insteadof = $this->resolveClassName($insteadof); + } + } + } + } + + return null; + } + + private function addAlias(Stmt\UseUse $use, $type, Name $prefix = null) { + // Add prefix for group uses + $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; + // Type is determined either by individual element or whole use declaration + $type |= $use->type; + + $this->nameContext->addAlias( + $name, (string) $use->getAlias(), $type, $use->getAttributes() + ); + } + + /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */ + private function resolveSignature($node) { + foreach ($node->params as $param) { + $param->type = $this->resolveType($param->type); + $this->resolveAttrGroups($param); + } + $node->returnType = $this->resolveType($node->returnType); + } + + private function resolveType($node) { + if ($node instanceof Name) { + return $this->resolveClassName($node); + } + if ($node instanceof Node\NullableType) { + $node->type = $this->resolveType($node->type); + return $node; + } + if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) { + foreach ($node->types as &$type) { + $type = $this->resolveType($type); + } + return $node; + } + return $node; + } + + /** + * Resolve name, according to name resolver options. + * + * @param Name $name Function or constant name to resolve + * @param int $type One of Stmt\Use_::TYPE_* + * + * @return Name Resolved name, or original name with attribute + */ + protected function resolveName(Name $name, int $type) : Name { + if (!$this->replaceNodes) { + $resolvedName = $this->nameContext->getResolvedName($name, $type); + if (null !== $resolvedName) { + $name->setAttribute('resolvedName', $resolvedName); + } else { + $name->setAttribute('namespacedName', FullyQualified::concat( + $this->nameContext->getNamespace(), $name, $name->getAttributes())); + } + return $name; + } + + if ($this->preserveOriginalNames) { + // Save the original name + $originalName = $name; + $name = clone $originalName; + $name->setAttribute('originalName', $originalName); + } + + $resolvedName = $this->nameContext->getResolvedName($name, $type); + if (null !== $resolvedName) { + return $resolvedName; + } + + // unqualified names inside a namespace cannot be resolved at compile-time + // add the namespaced version of the name as an attribute + $name->setAttribute('namespacedName', FullyQualified::concat( + $this->nameContext->getNamespace(), $name, $name->getAttributes())); + return $name; + } + + protected function resolveClassName(Name $name) { + return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); + } + + protected function addNamespacedName(Node $node) { + $node->namespacedName = Name::concat( + $this->nameContext->getNamespace(), (string) $node->name); + } + + protected function resolveAttrGroups(Node $node) + { + foreach ($node->attrGroups as $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + $attr->name = $this->resolveClassName($attr->name); + } + } + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php new file mode 100644 index 00000000..ea372e5b --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php @@ -0,0 +1,52 @@ +$node->getAttribute('parent'), the previous + * node can be accessed through $node->getAttribute('previous'), + * and the next node can be accessed through $node->getAttribute('next'). + */ +final class NodeConnectingVisitor extends NodeVisitorAbstract +{ + /** + * @var Node[] + */ + private $stack = []; + + /** + * @var ?Node + */ + private $previous; + + public function beforeTraverse(array $nodes) { + $this->stack = []; + $this->previous = null; + } + + public function enterNode(Node $node) { + if (!empty($this->stack)) { + $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); + } + + if ($this->previous !== null && $this->previous->getAttribute('parent') === $node->getAttribute('parent')) { + $node->setAttribute('previous', $this->previous); + $this->previous->setAttribute('next', $node); + } + + $this->stack[] = $node; + } + + public function leaveNode(Node $node) { + $this->previous = $node; + + array_pop($this->stack); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php new file mode 100644 index 00000000..b98d2bfa --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php @@ -0,0 +1,41 @@ +$node->getAttribute('parent'). + */ +final class ParentConnectingVisitor extends NodeVisitorAbstract +{ + /** + * @var Node[] + */ + private $stack = []; + + public function beforeTraverse(array $nodes) + { + $this->stack = []; + } + + public function enterNode(Node $node) + { + if (!empty($this->stack)) { + $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); + } + + $this->stack[] = $node; + } + + public function leaveNode(Node $node) + { + array_pop($this->stack); + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php new file mode 100644 index 00000000..d378d670 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php @@ -0,0 +1,25 @@ +parsers = $parsers; + } + + public function parse(string $code, ErrorHandler $errorHandler = null) { + if (null === $errorHandler) { + $errorHandler = new ErrorHandler\Throwing; + } + + list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code); + if ($firstError === null) { + return $firstStmts; + } + + for ($i = 1, $c = count($this->parsers); $i < $c; ++$i) { + list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code); + if ($error === null) { + return $stmts; + } + } + + throw $firstError; + } + + private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) { + $stmts = null; + $error = null; + try { + $stmts = $parser->parse($code, $errorHandler); + } catch (Error $error) {} + return [$stmts, $error]; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php new file mode 100644 index 00000000..d9c8fe04 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php @@ -0,0 +1,2672 @@ +'", + "T_IS_GREATER_OR_EQUAL", + "T_SL", + "T_SR", + "'+'", + "'-'", + "'.'", + "'*'", + "'/'", + "'%'", + "'!'", + "T_INSTANCEOF", + "'~'", + "T_INC", + "T_DEC", + "T_INT_CAST", + "T_DOUBLE_CAST", + "T_STRING_CAST", + "T_ARRAY_CAST", + "T_OBJECT_CAST", + "T_BOOL_CAST", + "T_UNSET_CAST", + "'@'", + "T_POW", + "'['", + "T_NEW", + "T_CLONE", + "T_EXIT", + "T_IF", + "T_ELSEIF", + "T_ELSE", + "T_ENDIF", + "T_LNUMBER", + "T_DNUMBER", + "T_STRING", + "T_STRING_VARNAME", + "T_VARIABLE", + "T_NUM_STRING", + "T_INLINE_HTML", + "T_ENCAPSED_AND_WHITESPACE", + "T_CONSTANT_ENCAPSED_STRING", + "T_ECHO", + "T_DO", + "T_WHILE", + "T_ENDWHILE", + "T_FOR", + "T_ENDFOR", + "T_FOREACH", + "T_ENDFOREACH", + "T_DECLARE", + "T_ENDDECLARE", + "T_AS", + "T_SWITCH", + "T_MATCH", + "T_ENDSWITCH", + "T_CASE", + "T_DEFAULT", + "T_BREAK", + "T_CONTINUE", + "T_GOTO", + "T_FUNCTION", + "T_FN", + "T_CONST", + "T_RETURN", + "T_TRY", + "T_CATCH", + "T_FINALLY", + "T_USE", + "T_INSTEADOF", + "T_GLOBAL", + "T_STATIC", + "T_ABSTRACT", + "T_FINAL", + "T_PRIVATE", + "T_PROTECTED", + "T_PUBLIC", + "T_VAR", + "T_UNSET", + "T_ISSET", + "T_EMPTY", + "T_HALT_COMPILER", + "T_CLASS", + "T_TRAIT", + "T_INTERFACE", + "T_EXTENDS", + "T_IMPLEMENTS", + "T_OBJECT_OPERATOR", + "T_LIST", + "T_ARRAY", + "T_CALLABLE", + "T_CLASS_C", + "T_TRAIT_C", + "T_METHOD_C", + "T_FUNC_C", + "T_LINE", + "T_FILE", + "T_START_HEREDOC", + "T_END_HEREDOC", + "T_DOLLAR_OPEN_CURLY_BRACES", + "T_CURLY_OPEN", + "T_PAAMAYIM_NEKUDOTAYIM", + "T_NAMESPACE", + "T_NS_C", + "T_DIR", + "T_NS_SEPARATOR", + "T_ELLIPSIS", + "T_NAME_FULLY_QUALIFIED", + "T_NAME_QUALIFIED", + "T_NAME_RELATIVE", + "';'", + "'{'", + "'}'", + "'('", + "')'", + "'$'", + "'`'", + "']'", + "'\"'", + "T_READONLY", + "T_ENUM", + "T_NULLSAFE_OBJECT_OPERATOR", + "T_ATTRIBUTE" + ); + + protected $tokenToSymbol = array( + 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 56, 163, 168, 160, 55, 168, 168, + 158, 159, 53, 50, 8, 51, 52, 54, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 31, 155, + 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 70, 168, 162, 36, 168, 161, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 156, 35, 157, 58, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, + 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, + 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 164, + 122, 123, 124, 125, 126, 127, 128, 129, 165, 130, + 131, 132, 166, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 167 + ); + + protected $action = array( + 699, 669, 670, 671, 672, 673, 286, 674, 675, 676, + 712, 713, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 0, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244,-32766,-32766,-32766,-32766,-32766, + -32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, 245, 246, + 242, 243, 244,-32766,-32766, 677,-32766, 750,-32766,-32766, + -32766,-32766,-32766,-32766,-32766, 1224, 245, 246, 1225, 678, + 679, 680, 681, 682, 683, 684,-32766, 48, 746,-32766, + -32766,-32766,-32766,-32766,-32766, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 715, 738, 716, 717, + 718, 719, 707, 708, 709, 737, 710, 711, 696, 697, + 698, 700, 701, 702, 740, 741, 742, 743, 744, 745, + 703, 704, 705, 706, 736, 727, 725, 726, 722, 723, + 751, 714, 720, 721, 728, 729, 731, 730, 732, 733, + 55, 56, 425, 57, 58, 724, 735, 734, 1073, 59, + 60, -224, 61,-32766,-32766,-32766,-32766,-32766,-32766,-32766, + -32766,-32766,-32766, 121,-32767,-32767,-32767,-32767, 29, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 1043, 766, 1071, 767, 580, 62, 63,-32766, + -32766,-32766,-32766, 64, 516, 65, 294, 295, 66, 67, + 68, 69, 70, 71, 72, 73, 822, 25, 302, 74, + 418, 981, 983, 1043, 1181, 1095, 1096, 1073, 748, 754, + 1075, 1074, 1076, 469,-32766,-32766,-32766, 337, 823, 54, + -32767,-32767,-32767,-32767, 98, 99, 100, 101, 102, 220, + 221, 222, 78, 361, 1107,-32766, 341,-32766,-32766,-32766, + -32766,-32766, 1107, 492, 949, 950, 951, 948, 947, 946, + 207, 477, 478, 949, 950, 951, 948, 947, 946, 1043, + 479, 480, 52, 1101, 1102, 1103, 1104, 1098, 1099, 319, + 872, 668, 667, 27, -511, 1105, 1100,-32766, 130, 1075, + 1074, 1076, 345, 668, 667, 41, 126, 341, 334, 369, + 336, 426, -128, -128, -128, 896, 897, 468, 220, 221, + 222, 811, 1195, 619, 40, 21, 427, -128, 470, -128, + 471, -128, 472, -128, 802, 428, -4, 823, 54, 207, + 33, 34, 429, 360, 317, 28, 35, 473,-32766,-32766, + -32766, 211, 356, 357, 474, 475,-32766,-32766,-32766, 754, + 476, 49, 313, 794, 843, 430, 431, 289, 125,-32766, + 813,-32766,-32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767, + -32767,-32767,-32767,-32766,-32766,-32766, 769, 103, 104, 105, + 327, 307, 825, 633, -128, 1075, 1074, 1076, 221, 222, + 927, 748, 1146, 106,-32766, 129,-32766,-32766,-32766,-32766, + 426, 823, 54, 902, 873, 302, 468, 75, 207, 359, + 811, 668, 667, 40, 21, 427, 754, 470, 754, 471, + 423, 472, 1043, 127, 428, 435, 1043, 341, 1043, 33, + 34, 429, 360, 1181, 415, 35, 473, 122, 10, 315, + 128, 356, 357, 474, 475,-32766,-32766,-32766, 768, 476, + 668, 667, 758, 843, 430, 431, 754, 1043, 1147,-32766, + -32766,-32766, 754, 419, 342, 1215,-32766, 131,-32766,-32766, + -32766, 341, 363, 346, 426, 823, 54, 100, 101, 102, + 468, 825, 633, -4, 811, 442, 903, 40, 21, 427, + 754, 470, 435, 471, 341, 472, 341, 766, 428, 767, + -209, -209, -209, 33, 34, 429, 360, 479, 1196, 35, + 473, 345,-32766,-32766,-32766, 356, 357, 474, 475, 220, + 221, 222, 421, 476, 32, 297, 794, 843, 430, 431, + 754, 754, 435,-32766, 341,-32766,-32766, 9, 300, 51, + 207, 249, 324, 753, 120, 220, 221, 222, 426, 30, + 247, 941, 422, 424, 468, 825, 633, -209, 811, 1043, + 1061, 40, 21, 427, 129, 470, 207, 471, 341, 472, + 804, 20, 428, 124, -208, -208, -208, 33, 34, 429, + 360, 479, 212, 35, 473, 923, -259, 823, 54, 356, + 357, 474, 475,-32766,-32766,-32766, 1043, 476, 213, 806, + 794, 843, 430, 431,-32766,-32766, 435, 435, 341, 341, + 443, 79, 80, 81,-32766, 668, 667, 636, 344, 808, + 668, 667, 239, 240, 241, 123, 214, 538, 250, 825, + 633, -208, 36, 251, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 252, 307, + 426, 220, 221, 222, 823, 54, 468,-32766, 222, 765, + 811, 106, 134, 40, 21, 427, 571, 470, 207, 471, + 445, 472, 207,-32766, 428, 896, 897, 207, 307, 33, + 34, 429, 245, 246, 637, 35, 473, 452, 22, 809, + 922, 356, 357, 457, 588, 135, 374, 595, 596, 476, + -228, 759, 639, 938, 653, 926, 661, -86, 823, 54, + 314, 644, 647, 821, 133, 836, 43, 106, 603, 44, + 45, 46, 47, 748, 50, 53, 132, 426, 302,-32766, + 520, 825, 633, 468, -84, 607, 577, 811, 641, 362, + 40, 21, 427, -278, 470, 754, 471, 954, 472, 441, + 627, 428, 823, 54, 574, 844, 33, 34, 429, 11, + 615, 845, 35, 473, 444, 461, 285, -511, 356, 357, + 592, -419, 593, 1106, 1153, -410, 476, 368, 838, 38, + 658, 426, 645, 795, 1052, 0, 325, 468, 0,-32766, + 0, 811, 0, 0, 40, 21, 427, 0, 470, 0, + 471, 0, 472, 0, 322, 428, 823, 54, 825, 633, + 33, 34, 429, 0, 326, 0, 35, 473, 323, 0, + 316, 318, 356, 357, -512, 426, 0, 753, 531, 0, + 476, 468, 6, 0, 0, 811, 650, 7, 40, 21, + 427, 12, 470, 14, 471, 373, 472, -420, 562, 428, + 823, 54, 78, -225, 33, 34, 429, 39, 656, 657, + 35, 473, 859, 633, 764, 812, 356, 357, 820, 799, + 814, 875, 866, 867, 476, 797, 860, 857, 855, 426, + 933, 934, 931, 819, 803, 468, 805, 807, 810, 811, + 930, 762, 40, 21, 427, 763, 470, 932, 471, 335, + 472, 358, 634, 428, 638, 640, 825, 633, 33, 34, + 429, 642, 643, 646, 35, 473, 648, 649, 651, 652, + 356, 357, 635, 426, 1221, 1223, 761, 842, 476, 468, + 248, 760, 841, 811, 1222, 840, 40, 21, 427, 1057, + 470, 830, 471, 1045, 472, 839, 1046, 428, 828, 215, + 216, 939, 33, 34, 429, 217, 864, 218, 35, 473, + 825, 633, 24, 865, 356, 357, 456, 1220, 1189, 209, + 1187, 1172, 476, 1185, 215, 216, 1086, 1095, 1096, 914, + 217, 1193, 218, 1183, -224, 1097, 26, 31, 37, 42, + 76, 77, 210, 288, 209, 292, 293, 308, 309, 310, + 311, 339, 1095, 1096, 825, 633, 355, 291, 416, 1152, + 1097, 16, 17, 18, 393, 453, 460, 462, 466, 552, + 624, 1048, 1051, 904, 1111, 1047, 1023, 563, 1022, 1088, + 0, 0, -429, 558, 1041, 1101, 1102, 1103, 1104, 1098, + 1099, 398, 1054, 1053, 1056, 1055, 1070, 1105, 1100, 1186, + 1171, 1167, 1184, 1085, 1218, 1112, 1166, 219, 558, 599, + 1101, 1102, 1103, 1104, 1098, 1099, 398, 0, 0, 0, + 0, 0, 1105, 1100, 0, 0, 0, 0, 0, 0, + 0, 0, 219 + ); + + protected $actionCheck = array( + 2, 3, 4, 5, 6, 7, 14, 9, 10, 11, + 12, 13, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 0, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 9, 10, 11, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 69, 70, + 53, 54, 55, 9, 10, 57, 30, 80, 32, 33, + 34, 35, 36, 37, 38, 80, 69, 70, 83, 71, + 72, 73, 74, 75, 76, 77, 9, 70, 80, 33, + 34, 35, 36, 37, 38, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 153, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 3, 4, 5, 6, 7, 147, 148, 149, 80, 12, + 13, 159, 15, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 156, 44, 45, 46, 47, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 13, 106, 116, 108, 85, 50, 51, 33, + 34, 35, 36, 56, 85, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 1, 70, 71, 72, + 73, 59, 60, 13, 82, 78, 79, 80, 80, 82, + 152, 153, 154, 86, 9, 10, 11, 8, 1, 2, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 9, + 10, 11, 156, 106, 143, 30, 160, 32, 33, 34, + 35, 36, 143, 116, 116, 117, 118, 119, 120, 121, + 30, 124, 125, 116, 117, 118, 119, 120, 121, 13, + 133, 134, 70, 136, 137, 138, 139, 140, 141, 142, + 31, 37, 38, 8, 132, 148, 149, 116, 156, 152, + 153, 154, 160, 37, 38, 158, 8, 160, 161, 8, + 163, 74, 75, 76, 77, 134, 135, 80, 9, 10, + 11, 84, 1, 80, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 155, 98, 0, 1, 2, 30, + 103, 104, 105, 106, 132, 8, 109, 110, 9, 10, + 11, 8, 115, 116, 117, 118, 9, 10, 11, 82, + 123, 70, 8, 126, 127, 128, 129, 8, 156, 30, + 155, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 9, 10, 11, 157, 53, 54, 55, + 8, 57, 155, 156, 157, 152, 153, 154, 10, 11, + 157, 80, 162, 69, 30, 151, 32, 33, 34, 35, + 74, 1, 2, 159, 155, 71, 80, 151, 30, 8, + 84, 37, 38, 87, 88, 89, 82, 91, 82, 93, + 8, 95, 13, 156, 98, 158, 13, 160, 13, 103, + 104, 105, 106, 82, 108, 109, 110, 156, 8, 113, + 31, 115, 116, 117, 118, 9, 10, 11, 157, 123, + 37, 38, 126, 127, 128, 129, 82, 13, 159, 33, + 34, 35, 82, 127, 8, 85, 30, 156, 32, 33, + 34, 160, 8, 147, 74, 1, 2, 50, 51, 52, + 80, 155, 156, 157, 84, 31, 159, 87, 88, 89, + 82, 91, 158, 93, 160, 95, 160, 106, 98, 108, + 100, 101, 102, 103, 104, 105, 106, 133, 159, 109, + 110, 160, 9, 10, 11, 115, 116, 117, 118, 9, + 10, 11, 8, 123, 144, 145, 126, 127, 128, 129, + 82, 82, 158, 30, 160, 32, 33, 108, 8, 70, + 30, 31, 113, 152, 16, 9, 10, 11, 74, 14, + 14, 122, 8, 8, 80, 155, 156, 157, 84, 13, + 159, 87, 88, 89, 151, 91, 30, 93, 160, 95, + 155, 159, 98, 14, 100, 101, 102, 103, 104, 105, + 106, 133, 16, 109, 110, 155, 157, 1, 2, 115, + 116, 117, 118, 9, 10, 11, 13, 123, 16, 155, + 126, 127, 128, 129, 33, 34, 158, 158, 160, 160, + 156, 9, 10, 11, 30, 37, 38, 31, 70, 155, + 37, 38, 50, 51, 52, 156, 16, 81, 16, 155, + 156, 157, 30, 16, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 16, 57, + 74, 9, 10, 11, 1, 2, 80, 116, 11, 155, + 84, 69, 156, 87, 88, 89, 160, 91, 30, 93, + 132, 95, 30, 33, 98, 134, 135, 30, 57, 103, + 104, 105, 69, 70, 31, 109, 110, 75, 76, 155, + 155, 115, 116, 75, 76, 101, 102, 111, 112, 123, + 159, 155, 156, 155, 156, 155, 156, 31, 1, 2, + 31, 31, 31, 31, 31, 38, 70, 69, 77, 70, + 70, 70, 70, 80, 70, 70, 70, 74, 71, 85, + 85, 155, 156, 80, 97, 96, 100, 84, 31, 106, + 87, 88, 89, 82, 91, 82, 93, 82, 95, 89, + 92, 98, 1, 2, 90, 127, 103, 104, 105, 97, + 94, 127, 109, 110, 97, 97, 97, 132, 115, 116, + 100, 146, 113, 143, 143, 146, 123, 106, 151, 155, + 157, 74, 31, 157, 162, -1, 114, 80, -1, 116, + -1, 84, -1, -1, 87, 88, 89, -1, 91, -1, + 93, -1, 95, -1, 130, 98, 1, 2, 155, 156, + 103, 104, 105, -1, 130, -1, 109, 110, 131, -1, + 132, 132, 115, 116, 132, 74, -1, 152, 150, -1, + 123, 80, 146, -1, -1, 84, 31, 146, 87, 88, + 89, 146, 91, 146, 93, 146, 95, 146, 150, 98, + 1, 2, 156, 159, 103, 104, 105, 155, 155, 155, + 109, 110, 155, 156, 155, 155, 115, 116, 155, 155, + 155, 155, 155, 155, 123, 155, 155, 155, 155, 74, + 155, 155, 155, 155, 155, 80, 155, 155, 155, 84, + 155, 155, 87, 88, 89, 155, 91, 155, 93, 156, + 95, 156, 156, 98, 156, 156, 155, 156, 103, 104, + 105, 156, 156, 156, 109, 110, 156, 156, 156, 156, + 115, 116, 156, 74, 157, 157, 157, 157, 123, 80, + 31, 157, 157, 84, 157, 157, 87, 88, 89, 157, + 91, 157, 93, 157, 95, 157, 157, 98, 157, 50, + 51, 157, 103, 104, 105, 56, 157, 58, 109, 110, + 155, 156, 158, 157, 115, 116, 157, 157, 157, 70, + 157, 157, 123, 157, 50, 51, 157, 78, 79, 157, + 56, 157, 58, 157, 159, 86, 158, 158, 158, 158, + 158, 158, 158, 158, 70, 158, 158, 158, 158, 158, + 158, 158, 78, 79, 155, 156, 158, 160, 158, 163, + 86, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + -1, -1, 161, 134, 161, 136, 137, 138, 139, 140, + 141, 142, 162, 162, 162, 162, 162, 148, 149, 162, + 162, 162, 162, 162, 162, 162, 162, 158, 134, 162, + 136, 137, 138, 139, 140, 141, 142, -1, -1, -1, + -1, -1, 148, 149, -1, -1, -1, -1, -1, -1, + -1, -1, 158 + ); + + protected $actionBase = array( + 0, 227, 326, 400, 474, 233, 132, 132, 752, -2, + -2, 138, -2, -2, -2, 663, 761, 815, 761, 586, + 717, 859, 859, 859, 244, 256, 256, 256, 413, 583, + 583, 880, 546, 169, 415, 444, 409, 200, 200, 200, + 200, 137, 137, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 249, 205, 738, 559, + 535, 739, 741, 742, 876, 679, 877, 820, 821, 693, + 823, 824, 826, 829, 832, 819, 834, 907, 836, 602, + 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, + 602, 67, 536, 299, 510, 230, 44, 652, 652, 652, + 652, 652, 652, 652, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 378, 584, 584, 584, 657, 909, 648, 934, + 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, + 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, + 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, + 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, + 934, 934, 934, 503, -21, -21, 436, 650, 364, 571, + 215, 426, 156, 26, 26, 329, 329, 329, 329, 329, + 46, 46, 5, 5, 5, 5, 152, 186, 186, 186, + 186, 120, 120, 120, 120, 374, 374, 429, 448, 448, + 334, 267, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 336, 427, 427, 572, 572, 408, 551, 551, + 551, 551, 671, 171, 171, 391, 311, 311, 311, 109, + 641, 856, 68, 68, 68, 68, 68, 68, 324, 324, + 324, -3, -3, -3, 655, 77, 380, 77, 380, 683, + 685, 86, 685, 654, -15, 516, 776, 281, 646, 809, + 680, 816, 560, 711, 202, 578, 857, 643, -23, 578, + 578, 578, 578, 857, 622, 628, 596, -23, 578, -23, + 639, 454, 849, 351, 249, 558, 469, 631, 743, 514, + 688, 746, 464, 544, 548, 556, 7, 412, 708, 750, + 878, 879, 349, 702, 631, 631, 631, 327, 101, 7, + -8, 623, 623, 623, 623, 219, 623, 623, 623, 623, + 291, 430, 545, 401, 745, 653, 653, 675, 839, 814, + 814, 653, 673, 653, 675, 841, 841, 841, 841, 653, + 653, 653, 653, 814, 814, 667, 814, 275, 684, 694, + 694, 841, 713, 714, 653, 653, 697, 814, 814, 814, + 697, 687, 841, 669, 637, 333, 814, 841, 689, 673, + 689, 653, 669, 689, 673, 673, 689, 22, 686, 656, + 840, 842, 860, 756, 638, 644, 847, 848, 843, 845, + 838, 692, 719, 720, 528, 659, 660, 661, 662, 696, + 664, 698, 643, 658, 658, 658, 645, 701, 645, 658, + 658, 658, 658, 658, 658, 658, 658, 632, 635, 709, + 699, 670, 723, 566, 582, 758, 640, 636, 872, 865, + 881, 883, 849, 870, 645, 890, 634, 288, 610, 850, + 633, 753, 645, 851, 645, 759, 645, 873, 777, 666, + 778, 779, 658, 874, 891, 892, 893, 894, 897, 898, + 899, 900, 665, 901, 724, 674, 866, 344, 844, 639, + 705, 677, 755, 725, 780, 372, 902, 784, 645, 645, + 765, 706, 645, 766, 726, 712, 862, 727, 867, 903, + 640, 678, 868, 645, 681, 785, 904, 372, 690, 651, + 704, 649, 728, 858, 875, 853, 767, 612, 617, 787, + 788, 792, 691, 730, 863, 864, 835, 731, 770, 642, + 771, 676, 794, 772, 852, 732, 796, 798, 871, 647, + 707, 682, 672, 668, 773, 799, 869, 733, 735, 736, + 801, 737, 804, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 137, 137, 137, 137, -2, -2, -2, + -2, 0, 0, -2, 0, 0, 0, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 0, 0, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 602, 602, + 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, + 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 602, -21, -21, -21, -21, 602, -21, + -21, -21, -21, -21, -21, -21, 602, 602, 602, 602, + 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 602, 602, -21, 602, 602, 602, -21, 68, + -21, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 602, 0, 0, 602, -21, + 602, -21, 602, -21, -21, 602, 602, 602, 602, 602, + 602, 602, -21, -21, -21, -21, -21, -21, 0, 324, + 324, 324, 324, -21, -21, -21, -21, 68, 68, 147, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 324, 324, -3, -3, 68, + 68, 68, 68, 68, 147, 68, 68, -23, 673, 673, + 673, 380, 380, 380, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 380, -23, 0, -23, + 0, 68, -23, 673, -23, 380, 673, 673, -23, 814, + 604, 604, 604, 604, 372, 7, 0, 0, 673, 673, + 0, 0, 0, 0, 0, 673, 0, 0, 0, 0, + 0, 0, 814, 0, 653, 0, 0, 0, 0, 658, + 288, 0, 677, 456, 0, 0, 0, 0, 0, 0, + 677, 456, 530, 530, 0, 665, 658, 658, 658, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 372 + ); + + protected $actionDefault = array( + 3,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767, 540, 540, 495,32767,32767, + 32767,32767,32767,32767,32767,32767,32767, 297, 297, 297, + 32767,32767,32767, 528, 528, 528, 528, 528, 528, 528, + 528, 528, 528, 528,32767,32767,32767,32767,32767,32767, + 381,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767, 387, + 545,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767, 362, + 363, 365, 366, 296, 548, 529, 245, 388, 544, 295, + 247, 325, 499,32767,32767,32767, 327, 122, 256, 201, + 498, 125, 294, 232, 380, 382, 326, 301, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 300, 454, 359, 358, 357, 456,32767, 455, 492, + 492, 495,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767, 323, 483, 482, 324, 452, 328, 453, + 331, 457, 460, 329, 330, 347, 348, 345, 346, 349, + 458, 459, 476, 477, 474, 475, 299, 350, 351, 352, + 353, 478, 479, 480, 481,32767,32767, 280, 539, 539, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767, 338, 339, 467, 468,32767, 236, 236, + 236, 236, 281, 236,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767, 333, 334, + 332, 462, 463, 461, 428,32767,32767,32767, 430,32767, + 32767,32767,32767,32767,32767,32767,32767, 500,32767,32767, + 32767,32767,32767, 513, 417, 171,32767, 409,32767, 171, + 171, 171, 171,32767, 220, 222, 167,32767, 171,32767, + 486,32767,32767,32767,32767,32767, 518, 343,32767,32767, + 116,32767,32767,32767, 555,32767, 513,32767, 116,32767, + 32767,32767,32767, 356, 335, 336, 337,32767,32767, 517, + 511, 470, 471, 472, 473,32767, 464, 465, 466, 469, + 32767,32767,32767,32767,32767,32767,32767,32767, 425, 431, + 431,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767, 516, 515,32767, 410, 494, 186, 184, + 184,32767, 206, 206,32767,32767, 188, 487, 506,32767, + 188, 173,32767, 398, 175, 494,32767,32767, 238,32767, + 238,32767, 398, 238,32767,32767, 238,32767, 411, 435, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767, 377, 378, 489, 502,32767, + 503,32767, 409, 341, 342, 344, 320,32767, 322, 367, + 368, 369, 370, 371, 372, 373, 375,32767, 415,32767, + 418,32767,32767,32767, 255,32767, 553,32767,32767, 304, + 553,32767,32767,32767, 547,32767,32767, 298,32767,32767, + 32767,32767, 251,32767, 169,32767, 537,32767, 554,32767, + 511,32767, 340,32767,32767,32767,32767,32767,32767,32767, + 32767,32767, 512,32767,32767,32767,32767, 227,32767, 448, + 32767, 116,32767,32767,32767, 187,32767,32767, 302, 246, + 32767,32767, 546,32767,32767,32767,32767,32767,32767,32767, + 32767, 114,32767, 170,32767,32767,32767, 189,32767,32767, + 511,32767,32767,32767,32767,32767,32767,32767, 293,32767, + 32767,32767,32767,32767,32767,32767, 511,32767,32767, 231, + 32767,32767,32767,32767,32767,32767,32767,32767,32767, 411, + 32767, 274,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767, 127, 127, 3, 127, 127, 258, 3, + 258, 127, 258, 258, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 214, 217, 206, 206, 164, 127, + 127, 266 + ); + + protected $goto = array( + 166, 140, 140, 140, 166, 187, 168, 144, 147, 141, + 142, 143, 149, 163, 163, 163, 163, 144, 144, 165, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 138, 159, 160, 161, 162, 184, 139, 185, 493, 494, + 377, 495, 499, 500, 501, 502, 503, 504, 505, 506, + 967, 164, 145, 146, 148, 171, 176, 186, 203, 253, + 256, 258, 260, 263, 264, 265, 266, 267, 268, 269, + 277, 278, 279, 280, 303, 304, 328, 329, 330, 394, + 395, 396, 542, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 150, 151, 152, + 167, 153, 169, 154, 204, 170, 155, 156, 157, 205, + 158, 136, 620, 560, 756, 560, 560, 560, 560, 560, + 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, + 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, + 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, + 560, 560, 560, 560, 560, 560, 560, 560, 560, 1108, + 628, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 757, 888, 888, 508, 1200, + 1200, 400, 606, 508, 536, 536, 568, 532, 534, 534, + 496, 498, 524, 540, 569, 572, 583, 590, 852, 852, + 852, 852, 847, 853, 174, 585, 519, 600, 601, 177, + 178, 179, 401, 402, 403, 404, 173, 202, 206, 208, + 257, 259, 261, 262, 270, 271, 272, 273, 274, 275, + 281, 282, 283, 284, 305, 306, 331, 332, 333, 406, + 407, 408, 409, 175, 180, 254, 255, 181, 182, 183, + 497, 497, 785, 497, 497, 497, 497, 497, 497, 497, + 497, 497, 497, 497, 497, 497, 497, 509, 578, 582, + 626, 749, 509, 544, 545, 546, 547, 548, 549, 550, + 551, 553, 586, 338, 559, 321, 559, 559, 559, 559, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 530, 349, 655, 555, 587, 352, 414, 591, 575, 604, + 885, 611, 612, 881, 616, 617, 623, 625, 630, 632, + 298, 296, 296, 296, 298, 290, 299, 944, 610, 816, + 1170, 613, 436, 436, 375, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, 436, 1072, + 1084, 1083, 945, 1065, 1072, 895, 895, 895, 895, 1178, + 895, 895, 1212, 1212, 1178, 388, 858, 561, 755, 1072, + 1072, 1072, 1072, 1072, 1072, 3, 4, 384, 384, 384, + 1212, 874, 856, 854, 856, 654, 465, 511, 883, 878, + 1089, 541, 384, 537, 384, 567, 384, 1026, 19, 15, + 371, 384, 1226, 510, 1204, 1192, 1192, 1192, 510, 906, + 372, 522, 533, 554, 912, 514, 1068, 1069, 13, 1065, + 378, 912, 1158, 594, 23, 965, 386, 386, 386, 602, + 1066, 1169, 1066, 937, 447, 449, 631, 752, 1177, 1067, + 1109, 614, 935, 1177, 605, 1197, 391, 1211, 1211, 543, + 892, 386, 1194, 1194, 1194, 399, 518, 1016, 901, 389, + 771, 529, 752, 340, 752, 1211, 518, 518, 385, 781, + 1214, 770, 772, 1063, 910, 774, 1058, 1176, 659, 953, + 514, 782, 862, 915, 450, 573, 1155, 0, 463, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 513, 528, 0, 0, 0, 0, + 513, 0, 528, 0, 350, 351, 0, 609, 512, 515, + 438, 439, 1064, 618, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 779, 1219, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 301, 301 + ); + + protected $gotoCheck = array( + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 57, 68, 15, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 126, + 9, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 16, 76, 76, 68, 76, + 76, 51, 51, 68, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 68, 68, + 68, 68, 68, 68, 27, 66, 101, 66, 66, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 117, 117, 29, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 61, 61, + 61, 6, 117, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 125, 57, 125, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 32, 71, 32, 32, 69, 69, 69, 32, 40, 40, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 5, 5, 5, 5, 5, 5, 5, 97, 62, 50, + 81, 62, 57, 57, 62, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 124, 124, 97, 81, 57, 57, 57, 57, 57, 118, + 57, 57, 142, 142, 118, 12, 33, 12, 14, 57, + 57, 57, 57, 57, 57, 30, 30, 13, 13, 13, + 142, 14, 14, 14, 14, 14, 57, 14, 14, 14, + 34, 2, 13, 109, 13, 2, 13, 34, 34, 34, + 34, 13, 13, 122, 140, 9, 9, 9, 122, 83, + 58, 58, 58, 34, 13, 13, 81, 81, 58, 81, + 46, 13, 131, 127, 34, 101, 123, 123, 123, 34, + 81, 81, 81, 8, 8, 8, 8, 11, 119, 81, + 8, 8, 8, 119, 49, 138, 48, 141, 141, 47, + 78, 123, 119, 119, 119, 123, 47, 102, 80, 17, + 23, 9, 11, 18, 11, 141, 47, 47, 11, 23, + 141, 23, 24, 115, 84, 25, 113, 119, 73, 99, + 13, 26, 70, 85, 64, 65, 130, -1, 108, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, + 9, -1, 9, -1, 71, 71, -1, 13, 9, 9, + 9, 9, 13, 13, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 9, 9, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5, 5 + ); + + protected $gotoBase = array( + 0, 0, -184, 0, 0, 356, 290, 0, 488, 149, + 0, 182, 85, 118, 426, 112, 203, 179, 208, 0, + 0, 0, 0, 162, 190, 198, 120, 27, 0, 272, + -224, 0, -274, 406, 32, 0, 0, 0, 0, 0, + 330, 0, 0, -24, 0, 0, 440, 485, 213, 218, + 371, -74, 0, 0, 0, 0, 0, 107, 110, 0, + 0, -11, -72, 0, 104, 95, -405, 0, -94, 41, + 119, -82, 0, 164, 0, 0, -79, 0, 197, 0, + 204, 43, 0, 441, 171, 121, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 100, 0, 115, + 0, 195, 210, 0, 0, 0, 0, 0, 86, 427, + 259, 0, 0, 116, 0, 174, 0, -5, 117, 196, + 0, 0, 161, 170, 93, -21, -48, 273, 0, 0, + 91, 271, 0, 0, 0, 0, 0, 0, 216, 0, + 437, 187, 102, 0, 0 + ); + + protected $gotoDefault = array( + -32768, 467, 663, 2, 664, 834, 739, 747, 597, 481, + 629, 581, 380, 1188, 791, 792, 793, 381, 367, 482, + 379, 410, 405, 780, 773, 775, 783, 172, 411, 786, + 1, 788, 517, 824, 1017, 364, 796, 365, 589, 798, + 526, 800, 801, 137, 382, 383, 527, 483, 390, 576, + 815, 276, 387, 817, 366, 818, 827, 370, 464, 454, + 459, 556, 608, 432, 446, 570, 564, 535, 1081, 565, + 861, 348, 869, 660, 877, 880, 484, 557, 891, 451, + 899, 1094, 397, 905, 911, 916, 287, 919, 417, 412, + 584, 924, 925, 5, 929, 621, 622, 8, 312, 952, + 598, 966, 420, 1036, 1038, 485, 486, 521, 458, 507, + 525, 487, 1059, 440, 413, 1062, 488, 489, 433, 434, + 1078, 354, 1163, 353, 448, 320, 1150, 579, 1113, 455, + 1203, 1159, 347, 490, 491, 376, 1182, 392, 1198, 437, + 1205, 1213, 343, 539, 566 + ); + + protected $ruleToNonTerminal = array( + 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, + 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, + 12, 12, 13, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 18, 18, 19, 19, 21, 21, + 17, 17, 22, 22, 23, 23, 24, 24, 25, 25, + 20, 20, 26, 28, 28, 29, 30, 30, 32, 31, + 31, 31, 31, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 14, 14, 54, 54, 56, 55, 55, 48, + 48, 58, 58, 59, 59, 60, 60, 15, 16, 16, + 16, 63, 63, 63, 64, 64, 67, 67, 65, 65, + 69, 69, 41, 41, 50, 50, 53, 53, 53, 52, + 52, 70, 42, 42, 42, 42, 71, 71, 72, 72, + 73, 73, 39, 39, 35, 35, 74, 37, 37, 75, + 36, 36, 38, 38, 49, 49, 49, 61, 61, 77, + 77, 78, 78, 80, 80, 80, 79, 79, 62, 62, + 81, 81, 81, 82, 82, 83, 83, 83, 44, 44, + 84, 84, 84, 45, 45, 85, 85, 86, 86, 66, + 87, 87, 87, 87, 92, 92, 93, 93, 94, 94, + 94, 94, 94, 95, 96, 96, 91, 91, 88, 88, + 90, 90, 98, 98, 97, 97, 97, 97, 97, 97, + 89, 89, 100, 99, 99, 46, 46, 40, 40, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 34, 34, 47, 47, 105, + 105, 106, 106, 106, 106, 112, 101, 101, 108, 108, + 114, 114, 115, 116, 116, 116, 116, 116, 116, 68, + 68, 57, 57, 57, 57, 102, 102, 120, 120, 117, + 117, 121, 121, 121, 121, 103, 103, 103, 107, 107, + 107, 113, 113, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 27, 27, 27, 27, + 27, 27, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 111, 111, 104, 104, + 104, 104, 127, 127, 130, 130, 129, 129, 131, 131, + 51, 51, 51, 51, 133, 133, 132, 132, 132, 132, + 132, 134, 134, 119, 119, 122, 122, 118, 118, 136, + 135, 135, 135, 135, 123, 123, 123, 123, 110, 110, + 124, 124, 124, 124, 76, 137, 137, 138, 138, 138, + 109, 109, 139, 139, 140, 140, 140, 140, 140, 125, + 125, 125, 125, 142, 143, 141, 141, 141, 141, 141, + 141, 141, 144, 144, 144 + ); + + protected $ruleToLength = array( + 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 5, 4, + 3, 4, 2, 3, 1, 1, 7, 6, 3, 1, + 3, 1, 3, 1, 1, 3, 1, 3, 1, 2, + 3, 1, 3, 3, 1, 3, 2, 0, 1, 1, + 1, 1, 1, 3, 5, 8, 3, 5, 9, 3, + 2, 3, 2, 3, 2, 3, 3, 3, 3, 1, + 2, 2, 5, 7, 9, 5, 6, 3, 3, 2, + 2, 1, 1, 1, 0, 2, 8, 0, 4, 1, + 3, 0, 1, 0, 1, 0, 1, 10, 7, 6, + 5, 1, 2, 2, 0, 2, 0, 2, 0, 2, + 1, 3, 1, 4, 1, 4, 1, 1, 4, 1, + 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, + 1, 1, 1, 4, 0, 2, 3, 0, 2, 4, + 0, 2, 0, 3, 1, 2, 1, 1, 0, 1, + 3, 4, 6, 1, 1, 1, 0, 1, 0, 2, + 2, 3, 3, 1, 3, 1, 2, 2, 3, 1, + 1, 2, 4, 3, 1, 1, 3, 2, 0, 1, + 3, 3, 9, 3, 1, 3, 0, 2, 4, 5, + 4, 4, 4, 3, 1, 1, 1, 3, 1, 1, + 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 3, 3, 1, 0, 1, 1, + 3, 3, 4, 4, 1, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 1, 3, 5, 4, 3, + 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, + 2, 1, 2, 10, 11, 3, 3, 2, 4, 4, + 3, 4, 4, 4, 4, 7, 3, 2, 0, 4, + 1, 3, 2, 2, 4, 6, 2, 2, 4, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 3, 4, 4, 0, 2, 1, 0, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 2, 1, 3, 1, 4, + 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 5, 4, 4, 3, 1, 3, 1, 1, + 3, 3, 0, 2, 0, 1, 3, 1, 3, 1, + 1, 1, 1, 1, 6, 4, 3, 4, 2, 4, + 4, 1, 3, 1, 2, 1, 1, 4, 1, 1, + 3, 6, 4, 4, 4, 4, 1, 4, 0, 1, + 1, 3, 1, 1, 4, 3, 1, 1, 1, 0, + 0, 2, 3, 1, 3, 1, 4, 2, 2, 2, + 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, + 6, 3, 1, 1, 1 + ); + + protected function initReduceCallbacks() { + $this->reduceCallbacks = [ + 0 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 1 => function ($stackPos) { + $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); + }, + 2 => function ($stackPos) { + if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; + }, + 3 => function ($stackPos) { + $this->semValue = array(); + }, + 4 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; + if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 5 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 6 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 7 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 8 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 9 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 10 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 11 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 12 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 13 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 14 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 15 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 16 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 17 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 18 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 19 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 20 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 21 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 22 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 23 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 24 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 25 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 26 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 27 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 28 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 29 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 30 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 31 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 32 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 33 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 34 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 35 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 36 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 37 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 38 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 39 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 40 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 41 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 42 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 43 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 44 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 45 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 46 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 47 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 48 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 49 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 50 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 51 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 52 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 53 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 54 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 55 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 56 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 57 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 58 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 59 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 60 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 61 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 62 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 63 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 64 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 65 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 66 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 67 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 68 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 69 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 70 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 71 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 72 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 73 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 74 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 75 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 76 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 77 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 78 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 79 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 80 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 81 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 82 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 83 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 84 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 85 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 86 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 87 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 88 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 89 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 90 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 91 => function ($stackPos) { + $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 92 => function ($stackPos) { + $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 93 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 94 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 95 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 96 => function ($stackPos) { + $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 97 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $this->checkNamespace($this->semValue); + }, + 98 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($this->semValue); + }, + 99 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($this->semValue); + }, + 100 => function ($stackPos) { + $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 101 => function ($stackPos) { + $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 102 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 103 => function ($stackPos) { + $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 104 => function ($stackPos) { + $this->semValue = Stmt\Use_::TYPE_FUNCTION; + }, + 105 => function ($stackPos) { + $this->semValue = Stmt\Use_::TYPE_CONSTANT; + }, + 106 => function ($stackPos) { + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + }, + 107 => function ($stackPos) { + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 108 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 109 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 110 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 111 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 112 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 113 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 114 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); + }, + 115 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); + }, + 116 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); + }, + 117 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); + }, + 118 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; + }, + 119 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; + }, + 120 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 121 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 122 => function ($stackPos) { + $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 123 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 124 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 125 => function ($stackPos) { + $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 126 => function ($stackPos) { + if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; + }, + 127 => function ($stackPos) { + $this->semValue = array(); + }, + 128 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; + if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 129 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 130 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 131 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 132 => function ($stackPos) { + throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 133 => function ($stackPos) { + + if ($this->semStack[$stackPos-(3-2)]) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; + } else { + $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; + if (null === $this->semValue) { $this->semValue = array(); } + } + + }, + 134 => function ($stackPos) { + $this->semValue = new Stmt\If_($this->semStack[$stackPos-(5-2)], ['stmts' => is_array($this->semStack[$stackPos-(5-3)]) ? $this->semStack[$stackPos-(5-3)] : array($this->semStack[$stackPos-(5-3)]), 'elseifs' => $this->semStack[$stackPos-(5-4)], 'else' => $this->semStack[$stackPos-(5-5)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 135 => function ($stackPos) { + $this->semValue = new Stmt\If_($this->semStack[$stackPos-(8-2)], ['stmts' => $this->semStack[$stackPos-(8-4)], 'elseifs' => $this->semStack[$stackPos-(8-5)], 'else' => $this->semStack[$stackPos-(8-6)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + }, + 136 => function ($stackPos) { + $this->semValue = new Stmt\While_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 137 => function ($stackPos) { + $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(5-4)], is_array($this->semStack[$stackPos-(5-2)]) ? $this->semStack[$stackPos-(5-2)] : array($this->semStack[$stackPos-(5-2)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 138 => function ($stackPos) { + $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + }, + 139 => function ($stackPos) { + $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 140 => function ($stackPos) { + $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 141 => function ($stackPos) { + $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 142 => function ($stackPos) { + $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 143 => function ($stackPos) { + $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 144 => function ($stackPos) { + $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 145 => function ($stackPos) { + $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 146 => function ($stackPos) { + $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 147 => function ($stackPos) { + $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 148 => function ($stackPos) { + $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 149 => function ($stackPos) { + $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 150 => function ($stackPos) { + $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 151 => function ($stackPos) { + $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 152 => function ($stackPos) { + $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 153 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + }, + 154 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + }, + 155 => function ($stackPos) { + $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 156 => function ($stackPos) { + $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); + }, + 157 => function ($stackPos) { + $this->semValue = new Stmt\Throw_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 158 => function ($stackPos) { + $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 159 => function ($stackPos) { + $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 160 => function ($stackPos) { + $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 161 => function ($stackPos) { + $this->semValue = array(); /* means: no statement */ + }, + 162 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 163 => function ($stackPos) { + $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; + if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ + }, + 164 => function ($stackPos) { + $this->semValue = array(); + }, + 165 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 166 => function ($stackPos) { + $this->semValue = new Stmt\Catch_(array($this->semStack[$stackPos-(8-3)]), $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + }, + 167 => function ($stackPos) { + $this->semValue = null; + }, + 168 => function ($stackPos) { + $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 169 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 170 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 171 => function ($stackPos) { + $this->semValue = false; + }, + 172 => function ($stackPos) { + $this->semValue = true; + }, + 173 => function ($stackPos) { + $this->semValue = false; + }, + 174 => function ($stackPos) { + $this->semValue = true; + }, + 175 => function ($stackPos) { + $this->semValue = false; + }, + 176 => function ($stackPos) { + $this->semValue = true; + }, + 177 => function ($stackPos) { + $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(10-3)], ['byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-5)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + }, + 178 => function ($stackPos) { + $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + $this->checkClass($this->semValue, $stackPos-(7-2)); + }, + 179 => function ($stackPos) { + $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(6-2)], ['extends' => $this->semStack[$stackPos-(6-3)], 'stmts' => $this->semStack[$stackPos-(6-5)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + $this->checkInterface($this->semValue, $stackPos-(6-2)); + }, + 180 => function ($stackPos) { + $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(5-2)], ['stmts' => $this->semStack[$stackPos-(5-4)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 181 => function ($stackPos) { + $this->semValue = 0; + }, + 182 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + }, + 183 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_FINAL; + }, + 184 => function ($stackPos) { + $this->semValue = null; + }, + 185 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 186 => function ($stackPos) { + $this->semValue = array(); + }, + 187 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 188 => function ($stackPos) { + $this->semValue = array(); + }, + 189 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 190 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 191 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 192 => function ($stackPos) { + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + }, + 193 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 194 => function ($stackPos) { + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + }, + 195 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 196 => function ($stackPos) { + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + }, + 197 => function ($stackPos) { + $this->semValue = null; + }, + 198 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 199 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 200 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 201 => function ($stackPos) { + $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 202 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 203 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-3)]; + }, + 204 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 205 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(5-3)]; + }, + 206 => function ($stackPos) { + $this->semValue = array(); + }, + 207 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 208 => function ($stackPos) { + $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 209 => function ($stackPos) { + $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 210 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 211 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 212 => function ($stackPos) { + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + }, + 213 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 214 => function ($stackPos) { + $this->semValue = array(); + }, + 215 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 216 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(3-2)], is_array($this->semStack[$stackPos-(3-3)]) ? $this->semStack[$stackPos-(3-3)] : array($this->semStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 217 => function ($stackPos) { + $this->semValue = array(); + }, + 218 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 219 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 220 => function ($stackPos) { + $this->semValue = null; + }, + 221 => function ($stackPos) { + $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 222 => function ($stackPos) { + $this->semValue = null; + }, + 223 => function ($stackPos) { + $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 224 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + }, + 225 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(2-2)], true); + }, + 226 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + }, + 227 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 228 => function ($stackPos) { + $this->semValue = array(); + }, + 229 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 230 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 231 => function ($stackPos) { + $this->semValue = new Node\Param($this->semStack[$stackPos-(4-4)], null, $this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); $this->checkParam($this->semValue); + }, + 232 => function ($stackPos) { + $this->semValue = new Node\Param($this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-3)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkParam($this->semValue); + }, + 233 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 234 => function ($stackPos) { + $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 235 => function ($stackPos) { + $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 236 => function ($stackPos) { + $this->semValue = null; + }, + 237 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 238 => function ($stackPos) { + $this->semValue = null; + }, + 239 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 240 => function ($stackPos) { + $this->semValue = array(); + }, + 241 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 242 => function ($stackPos) { + $this->semValue = array(new Node\Arg($this->semStack[$stackPos-(3-2)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes)); + }, + 243 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 244 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 245 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 246 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 247 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 248 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 249 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 250 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 251 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 252 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 253 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 254 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 255 => function ($stackPos) { + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 256 => function ($stackPos) { + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 257 => function ($stackPos) { + if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } + }, + 258 => function ($stackPos) { + $this->semValue = array(); + }, + 259 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; + if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 260 => function ($stackPos) { + $this->semValue = new Stmt\Property($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkProperty($this->semValue, $stackPos-(3-1)); + }, + 261 => function ($stackPos) { + $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(3-2)], 0, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 262 => function ($stackPos) { + $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(9-4)], ['type' => $this->semStack[$stackPos-(9-1)], 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->checkClassMethod($this->semValue, $stackPos-(9-1)); + }, + 263 => function ($stackPos) { + $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 264 => function ($stackPos) { + $this->semValue = array(); + }, + 265 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 266 => function ($stackPos) { + $this->semValue = array(); + }, + 267 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 268 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 269 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 270 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 271 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 272 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 273 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 274 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 275 => function ($stackPos) { + $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); + }, + 276 => function ($stackPos) { + $this->semValue = null; + }, + 277 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 278 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 279 => function ($stackPos) { + $this->semValue = 0; + }, + 280 => function ($stackPos) { + $this->semValue = 0; + }, + 281 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 282 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 283 => function ($stackPos) { + $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + }, + 284 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + }, + 285 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + }, + 286 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + }, + 287 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_STATIC; + }, + 288 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + }, + 289 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_FINAL; + }, + 290 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 291 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 292 => function ($stackPos) { + $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 293 => function ($stackPos) { + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 294 => function ($stackPos) { + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 295 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 296 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 297 => function ($stackPos) { + $this->semValue = array(); + }, + 298 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 299 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 300 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 301 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 302 => function ($stackPos) { + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 303 => function ($stackPos) { + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 304 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 305 => function ($stackPos) { + $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 306 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 307 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 308 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 309 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 310 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 311 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 312 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 313 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 314 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 315 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 316 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 317 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 318 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 319 => function ($stackPos) { + $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 320 => function ($stackPos) { + $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 321 => function ($stackPos) { + $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 322 => function ($stackPos) { + $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 323 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 324 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 325 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 326 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 327 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 328 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 329 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 330 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 331 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 332 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 333 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 334 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 335 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 336 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 337 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 338 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 339 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 340 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 341 => function ($stackPos) { + $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 342 => function ($stackPos) { + $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 343 => function ($stackPos) { + $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 344 => function ($stackPos) { + $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 345 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 346 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 347 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 348 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 349 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 350 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 351 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 352 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 353 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 354 => function ($stackPos) { + $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 355 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 356 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 357 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 358 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 359 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 360 => function ($stackPos) { + $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 361 => function ($stackPos) { + $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 362 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 363 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 364 => function ($stackPos) { + $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 365 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 366 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 367 => function ($stackPos) { + $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 368 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; + $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); + $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); + }, + 369 => function ($stackPos) { + $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 370 => function ($stackPos) { + $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 371 => function ($stackPos) { + $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 372 => function ($stackPos) { + $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 373 => function ($stackPos) { + $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 374 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; + $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; + $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); + }, + 375 => function ($stackPos) { + $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 376 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 377 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 378 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 379 => function ($stackPos) { + $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 380 => function ($stackPos) { + $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 381 => function ($stackPos) { + $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 382 => function ($stackPos) { + $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 383 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-4)], 'uses' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + }, + 384 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(11-3)], 'params' => $this->semStack[$stackPos-(11-5)], 'uses' => $this->semStack[$stackPos-(11-7)], 'returnType' => $this->semStack[$stackPos-(11-8)], 'stmts' => $this->semStack[$stackPos-(11-10)]], $this->startAttributeStack[$stackPos-(11-1)] + $this->endAttributes); + }, + 385 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 386 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 387 => function ($stackPos) { + $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 388 => function ($stackPos) { + $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 389 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); + }, + 390 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); + }, + 391 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 392 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos-(4-1)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 393 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 394 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 395 => function ($stackPos) { + $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes), $this->semStack[$stackPos-(7-2)]); + $this->checkClass($this->semValue[0], -1); + }, + 396 => function ($stackPos) { + $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 397 => function ($stackPos) { + list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 398 => function ($stackPos) { + $this->semValue = array(); + }, + 399 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-3)]; + }, + 400 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 401 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 402 => function ($stackPos) { + $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 403 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 404 => function ($stackPos) { + $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 405 => function ($stackPos) { + $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 406 => function ($stackPos) { + $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 407 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 408 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 409 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 410 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 411 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 412 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 413 => function ($stackPos) { + $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 414 => function ($stackPos) { + $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 415 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 416 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 417 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 418 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 419 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 420 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 421 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 422 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 423 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 424 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 425 => function ($stackPos) { + $this->semValue = null; + }, + 426 => function ($stackPos) { + $this->semValue = null; + }, + 427 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 428 => function ($stackPos) { + $this->semValue = array(); + }, + 429 => function ($stackPos) { + $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`', false), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); + }, + 430 => function ($stackPos) { + foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', false); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 431 => function ($stackPos) { + $this->semValue = array(); + }, + 432 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 433 => function ($stackPos) { + $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, true); + }, + 434 => function ($stackPos) { + $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 435 => function ($stackPos) { + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, false); + }, + 436 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 437 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 438 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 439 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 440 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 441 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 442 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 443 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 444 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], false); + }, + 445 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], false); + }, + 446 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 447 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 448 => function ($stackPos) { + $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 449 => function ($stackPos) { + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 450 => function ($stackPos) { + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 451 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 452 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 453 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 454 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 455 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 456 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 457 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 458 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 459 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 460 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 461 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 462 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 463 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 464 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 465 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 466 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 467 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 468 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 469 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 470 => function ($stackPos) { + $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 471 => function ($stackPos) { + $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 472 => function ($stackPos) { + $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 473 => function ($stackPos) { + $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 474 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 475 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 476 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 477 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 478 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 479 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 480 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 481 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 482 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 483 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 484 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 485 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 486 => function ($stackPos) { + $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 487 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 488 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 489 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 490 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; + foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); + }, + 491 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); + }, + 492 => function ($stackPos) { + $this->semValue = array(); + }, + 493 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 494 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 495 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 496 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 497 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 498 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 499 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 500 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 501 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 502 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 503 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 504 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 505 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 506 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 507 => function ($stackPos) { + $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 508 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 509 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 510 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 511 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 512 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 513 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 514 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 515 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 516 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 517 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 518 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 519 => function ($stackPos) { + $var = substr($this->semStack[$stackPos-(1-1)], 1); $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; + }, + 520 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 521 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 522 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 523 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 524 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 525 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 526 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 527 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 528 => function ($stackPos) { + $this->semValue = null; + }, + 529 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 530 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 531 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 532 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 533 => function ($stackPos) { + $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; + }, + 534 => function ($stackPos) { + $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 535 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 536 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 537 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 538 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 539 => function ($stackPos) { + $this->semValue = null; + }, + 540 => function ($stackPos) { + $this->semValue = array(); + }, + 541 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 542 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 543 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 544 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 545 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 546 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 547 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 548 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 549 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 550 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 551 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 552 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); + }, + 553 => function ($stackPos) { + $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 554 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 555 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 556 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 557 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 558 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 559 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 560 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 561 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 562 => function ($stackPos) { + $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 563 => function ($stackPos) { + $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 564 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + ]; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php new file mode 100644 index 00000000..71ba0187 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php @@ -0,0 +1,2829 @@ +'", + "T_IS_GREATER_OR_EQUAL", + "T_SL", + "T_SR", + "'+'", + "'-'", + "'.'", + "'*'", + "'/'", + "'%'", + "'!'", + "T_INSTANCEOF", + "'~'", + "T_INC", + "T_DEC", + "T_INT_CAST", + "T_DOUBLE_CAST", + "T_STRING_CAST", + "T_ARRAY_CAST", + "T_OBJECT_CAST", + "T_BOOL_CAST", + "T_UNSET_CAST", + "'@'", + "T_POW", + "'['", + "T_NEW", + "T_CLONE", + "T_EXIT", + "T_IF", + "T_ELSEIF", + "T_ELSE", + "T_ENDIF", + "T_LNUMBER", + "T_DNUMBER", + "T_STRING", + "T_STRING_VARNAME", + "T_VARIABLE", + "T_NUM_STRING", + "T_INLINE_HTML", + "T_ENCAPSED_AND_WHITESPACE", + "T_CONSTANT_ENCAPSED_STRING", + "T_ECHO", + "T_DO", + "T_WHILE", + "T_ENDWHILE", + "T_FOR", + "T_ENDFOR", + "T_FOREACH", + "T_ENDFOREACH", + "T_DECLARE", + "T_ENDDECLARE", + "T_AS", + "T_SWITCH", + "T_MATCH", + "T_ENDSWITCH", + "T_CASE", + "T_DEFAULT", + "T_BREAK", + "T_CONTINUE", + "T_GOTO", + "T_FUNCTION", + "T_FN", + "T_CONST", + "T_RETURN", + "T_TRY", + "T_CATCH", + "T_FINALLY", + "T_USE", + "T_INSTEADOF", + "T_GLOBAL", + "T_STATIC", + "T_ABSTRACT", + "T_FINAL", + "T_PRIVATE", + "T_PROTECTED", + "T_PUBLIC", + "T_READONLY", + "T_VAR", + "T_UNSET", + "T_ISSET", + "T_EMPTY", + "T_HALT_COMPILER", + "T_CLASS", + "T_TRAIT", + "T_INTERFACE", + "T_ENUM", + "T_EXTENDS", + "T_IMPLEMENTS", + "T_OBJECT_OPERATOR", + "T_NULLSAFE_OBJECT_OPERATOR", + "T_LIST", + "T_ARRAY", + "T_CALLABLE", + "T_CLASS_C", + "T_TRAIT_C", + "T_METHOD_C", + "T_FUNC_C", + "T_LINE", + "T_FILE", + "T_START_HEREDOC", + "T_END_HEREDOC", + "T_DOLLAR_OPEN_CURLY_BRACES", + "T_CURLY_OPEN", + "T_PAAMAYIM_NEKUDOTAYIM", + "T_NAMESPACE", + "T_NS_C", + "T_DIR", + "T_NS_SEPARATOR", + "T_ELLIPSIS", + "T_NAME_FULLY_QUALIFIED", + "T_NAME_QUALIFIED", + "T_NAME_RELATIVE", + "T_ATTRIBUTE", + "';'", + "']'", + "'{'", + "'}'", + "'('", + "')'", + "'`'", + "'\"'", + "'$'" + ); + + protected $tokenToSymbol = array( + 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 56, 166, 168, 167, 55, 168, 168, + 163, 164, 53, 50, 8, 51, 52, 54, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 31, 159, + 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 70, 168, 160, 36, 168, 165, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 161, 35, 162, 58, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, + 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, + 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158 + ); + + protected $action = array( + 132, 133, 134, 568, 135, 136, 0, 721, 722, 723, + 137, 37, 921, 448, 449, 450,-32766,-32766,-32766,-32767, + -32767,-32767,-32767, 101, 102, 103, 104, 105, 1071, 1072, + 1073, 1070, 1069, 1068, 1074, 715, 714,-32766,-32766,-32766, + -32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, + -32767, 371, 372, 240, 2, 724,-32766,-32766,-32766, 1001, + 1002, 415, 956,-32766,-32766,-32766, 373, 372, 12, 267, + 138, 397, 728, 729, 730, 731, 415,-32766, 421,-32766, + -32766,-32766,-32766,-32766,-32766, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 762, 569, 763, 764, + 765, 766, 754, 755, 337, 338, 757, 758, 743, 744, + 745, 747, 748, 749, 347, 789, 790, 791, 792, 793, + 794, 750, 751, 570, 571, 783, 774, 772, 773, 786, + 769, 770, 284, 421, 572, 573, 768, 574, 575, 576, + 577, 578, 579, 597, -579,-32766,-32766, 797, 771, 580, + 581, -579, 139,-32766,-32766,-32766, 132, 133, 134, 568, + 135, 136, 1020, 721, 722, 723, 137, 37,-32766,-32766, + -32766, 542, 1306, 126,-32766, 1307,-32766,-32766,-32766,-32766, + -32766,-32766,-32766, 1071, 1072, 1073, 1070, 1069, 1068, 1074, + 957, 715, 714, -318, 993, 1261,-32766,-32766,-32766, -576, + 106, 107, 108, -268, 270, 890, -576, 910, 1196, 1195, + 1197, 724,-32766,-32766,-32766, 1049, 109,-32766,-32766,-32766, + -32766, 989, 988, 987, 990, 267, 138, 397, 728, 729, + 730, 731, 1233,-32766, 421,-32766,-32766,-32766,-32766, 1001, + 1002, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 762, 569, 763, 764, 765, 766, 754, 755, + 337, 338, 757, 758, 743, 744, 745, 747, 748, 749, + 347, 789, 790, 791, 792, 793, 794, 750, 751, 570, + 571, 783, 774, 772, 773, 786, 769, 770, 880, 321, + 572, 573, 768, 574, 575, 576, 577, 578, 579,-32766, + 82, 83, 84, -579, 771, 580, 581, -579, 148, 746, + 716, 717, 718, 719, 720, 1281, 721, 722, 723, 759, + 760, 36, 1280, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 999, 270, -318, + -32766,-32766,-32766, 456, 457, 81, -193, 808, -576, 1019, + 109, 320, -576, 892, 724, 681, 802, 695, 1001, 1002, + 591,-32766, 1047,-32766,-32766,-32766, 715, 714, 725, 726, + 727, 728, 729, 730, 731, -192, -86, 795, 279, -530, + 284,-32766,-32766,-32766, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 762, 785, 763, 764, 765, + 766, 754, 755, 756, 784, 757, 758, 743, 744, 745, + 747, 748, 749, 788, 789, 790, 791, 792, 793, 794, + 750, 751, 752, 753, 783, 774, 772, 773, 786, 769, + 770, 470, 803, 761, 767, 768, 775, 776, 778, 777, + 779, 780, -86, -530, -530, 637, 25, 771, 782, 781, + 49, 50, 51, 501, 52, 53, 239, 34, -530, 890, + 54, 55, -111, 56, 999, 128,-32766, -111, 1201, -111, + -530, -570, -536, 890, 300, -570, 144, -111, -111, -111, + -111, -111, -111, -111, -111, 1001, 1002, 1001, 1002, 686, + 1201, 925, 926, 1194, 806, 890, 927, 1296, 57, 58, + 799, 253, -193, 687, 59, 807, 60, 246, 247, 61, + 62, 63, 64, 65, 66, 67, 68, 304, 27, 268, + 69, 437, 502, -332, 306, 688, 1227, 1228, 503, 1192, + 806, -192, 318, 890, 1225, 41, 24, 504, 334, 505, + 14, 506, 880, 507, 653, 654, 508, 509, 280, 806, + 281, 43, 44, 438, 368, 367, 880, 45, 510, 35, + 249, 471, 1063, 359, 333, 103, 104, 105, 1196, 1195, + 1197, 806, 511, 512, 513, 335, 801, 1221, 880, 361, + 285, 683, 286, 365, 514, 515, 380, 1215, 1216, 1217, + 1218, 1212, 1213, 292, 433, -111, 715, 714, 434, 1219, + 1214, 149, 400, 1196, 1195, 1197, 293, -153, -153, -153, + -356, 70, -356, 316, 317, 320, 880, 892, -531, 681, + 435, 1048, -153, 707, -153, 293, -153, 1277, -153, 27, + 74, 892, 436, 681, 320, 369, 370, 833, 366, 834, + -529, 806, 382, 812, 11, 1225, 833, 150, 834, -111, + -111, 151, 74, 942, -111, 681, 320, 153, 806, 866, + -111, -111, -111, -111, 31, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 715, 714, + 374, 375, -531, -531, 890, 154, 805, 155, -4, 890, + 157, 892, -88, 681, -153, 514, 515, -531, 1215, 1216, + 1217, 1218, 1212, 1213, -529, -529, 797, 1108, 1110, -531, + 1219, 1214, 715, 714, 690,-32766, 629, 630, -528, -529, + 32, 1194, 72, 123, 124, 317, 320, 129,-32766,-32766, + -32766, -529,-32766, -535,-32766, 130,-32766, 140, 143,-32766, + 158, 159, 160, 320,-32766,-32766,-32766, 161, -528,-32766, + -32766,-32766, -79, 282, -75, 1194,-32766, 412, -73, 27, + -72, -71,-32766,-32766,-32766,-32766,-32766, 880,-32766, 287, + -32766, 806, 880,-32766, -70, 1225, -69, -68,-32766,-32766, + -32766, -67, -528, -528,-32766,-32766, -66, 141, -47, -18, + -32766, 412, 147, 320, 366, 73, 428, -528, 271,-32766, + 278, 291, -51, 696, 699, -111, -111, 1201, -533, -528, + -111, 889, -528, -528, 48, 825, -111, -111, -111, -111, + 146, 327, 283, 270, 288, 109, 515, -528, 1215, 1216, + 1217, 1218, 1212, 1213, 131, 906, 661, -16, 9, -528, + 1219, 1214, 892, 797, 681,-32766, 145, 892, 1308, 681, + -4, 1194, 72,-32766, 638, 317, 320, 806,-32766,-32766, + -32766, 1078,-32766, 544,-32766, 627,-32766, 13, 656,-32766, + 548, 298, -533, -533,-32766,-32766,-32766,-32766, 296, 297, + -32766,-32766, 674, 1194, 643, 890,-32766, 412, 806, 453, + -32766,-32766,-32766, 364,-32766,-32766,-32766, 481,-32766, -533, + -32766,-32766, 47, -494, 890, 127,-32766,-32766,-32766,-32766, + 644, 657,-32766,-32766, 305, 1194, 890, 805,-32766, 412, + 1222, 301,-32766,-32766,-32766, 0,-32766,-32766,-32766, 432, + -32766, 299, 922,-32766, -111, 293, 554, 476,-32766,-32766, + -32766,-32766, 1232, -484,-32766,-32766, 697, 1194, 560, 908, + -32766, 412, 595, 817,-32766,-32766,-32766, 7,-32766,-32766, + -32766, 1234,-32766, 16, 293,-32766, 294, 295, 880, 74, + -32766,-32766,-32766, 320, 363, 39,-32766,-32766, 40, 704, + 705, 871,-32766, 412, -246, -246, -246, 880, 966, 943, + 366,-32766, 950, 125, 1247, 940, 951, 869, 938, 880, + 1052, -111, -111, -245, -245, -245, -111, 1055, 1056, 366, + 1053, 866, -111, -111, -111, -111, 1054, 1060, 701, 1265, + -111, -111, 1299, 632, -564, -111, 33, 315, -271, 362, + 866, -111, -111, -111, -111, 682, 685, 689, 691, 692, + 693, 694,-32766, 892, 698, 681, -246, 684, 1194, 867, + 1303, 1305, 828, 827, 836,-32766,-32766,-32766, 915,-32766, + 958,-32766, 892,-32766, 681, -245,-32766, 835, 1304, 914, + 916,-32766,-32766,-32766, 892, 913, 681,-32766,-32766, 1180, + 899, 909, 897,-32766, 412, 948, 949, 1302, 1259, 1248, + 1266, 1272,-32766, 1275, -269, -562, -536, -535, -534, 1, + 28, 29, 38, 42, 46, 71, 75, 76, 77, 78, + 79, 80, 142, 152, 156, 245, 322, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 360, 429, + 0, -268, 0, 18, 19, 20, 21, 23, 399, 472, + 473, 480, 483, 484, 485, 486, 490, 491, 492, 499, + 668, 1205, 1148, 1223, 1022, 1021, 1184, -273, -103, 17, + 22, 26, 290, 398, 588, 592, 619, 673, 1152, 1200, + 1149, 1278, 0, -498, 1165, 0, 1226, 0, 320 + ); + + protected $actionCheck = array( + 2, 3, 4, 5, 6, 7, 0, 9, 10, 11, + 12, 13, 128, 129, 130, 131, 9, 10, 11, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 116, 117, + 118, 119, 120, 121, 122, 37, 38, 30, 116, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 106, 107, 14, 8, 57, 9, 10, 11, 137, + 138, 116, 31, 9, 10, 11, 106, 107, 8, 71, + 72, 73, 74, 75, 76, 77, 116, 30, 80, 32, + 33, 34, 35, 36, 30, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 30, 80, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 51, 1, 9, 10, 80, 150, 151, + 152, 8, 154, 9, 10, 11, 2, 3, 4, 5, + 6, 7, 164, 9, 10, 11, 12, 13, 9, 10, + 11, 85, 80, 14, 30, 83, 32, 33, 34, 35, + 36, 37, 38, 116, 117, 118, 119, 120, 121, 122, + 159, 37, 38, 8, 1, 1, 9, 10, 11, 1, + 53, 54, 55, 164, 57, 1, 8, 1, 155, 156, + 157, 57, 9, 10, 11, 162, 69, 30, 116, 32, + 33, 119, 120, 121, 122, 71, 72, 73, 74, 75, + 76, 77, 146, 30, 80, 32, 33, 34, 35, 137, + 138, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 84, 70, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 9, + 9, 10, 11, 160, 150, 151, 152, 164, 154, 2, + 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, + 13, 30, 8, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 116, 57, 164, + 9, 10, 11, 134, 135, 161, 8, 1, 160, 1, + 69, 167, 164, 159, 57, 161, 80, 161, 137, 138, + 1, 30, 1, 32, 33, 34, 37, 38, 71, 72, + 73, 74, 75, 76, 77, 8, 31, 80, 30, 70, + 30, 9, 10, 11, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 31, 156, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 97, 134, 135, 75, 76, 150, 151, 152, + 2, 3, 4, 5, 6, 7, 97, 8, 149, 1, + 12, 13, 101, 15, 116, 8, 116, 106, 1, 108, + 161, 160, 163, 1, 113, 164, 8, 116, 117, 118, + 119, 120, 121, 122, 123, 137, 138, 137, 138, 31, + 1, 117, 118, 80, 82, 1, 122, 85, 50, 51, + 80, 8, 164, 31, 56, 159, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 8, 70, 71, + 72, 73, 74, 162, 8, 31, 78, 79, 80, 116, + 82, 164, 8, 1, 86, 87, 88, 89, 8, 91, + 101, 93, 84, 95, 75, 76, 98, 99, 35, 82, + 37, 103, 104, 105, 106, 107, 84, 109, 110, 147, + 148, 161, 123, 115, 116, 50, 51, 52, 155, 156, + 157, 82, 124, 125, 126, 8, 156, 1, 84, 8, + 35, 161, 37, 8, 136, 137, 8, 139, 140, 141, + 142, 143, 144, 145, 8, 128, 37, 38, 8, 151, + 152, 101, 102, 155, 156, 157, 158, 75, 76, 77, + 106, 163, 108, 165, 166, 167, 84, 159, 70, 161, + 8, 159, 90, 161, 92, 158, 94, 1, 96, 70, + 163, 159, 8, 161, 167, 106, 107, 106, 106, 108, + 70, 82, 106, 8, 108, 86, 106, 14, 108, 117, + 118, 14, 163, 159, 122, 161, 167, 14, 82, 127, + 128, 129, 130, 131, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 37, 38, + 106, 107, 134, 135, 1, 14, 155, 14, 0, 1, + 14, 159, 31, 161, 162, 136, 137, 149, 139, 140, + 141, 142, 143, 144, 134, 135, 80, 59, 60, 161, + 151, 152, 37, 38, 31, 74, 111, 112, 70, 149, + 14, 80, 163, 16, 16, 166, 167, 16, 87, 88, + 89, 161, 91, 163, 93, 16, 95, 161, 16, 98, + 16, 16, 16, 167, 103, 104, 105, 16, 70, 74, + 109, 110, 31, 35, 31, 80, 115, 116, 31, 70, + 31, 31, 87, 88, 89, 124, 91, 84, 93, 35, + 95, 82, 84, 98, 31, 86, 31, 31, 103, 104, + 105, 31, 134, 135, 109, 110, 31, 161, 31, 31, + 115, 116, 31, 167, 106, 154, 108, 149, 31, 124, + 31, 113, 31, 31, 31, 117, 118, 1, 70, 161, + 122, 31, 134, 135, 70, 127, 128, 129, 130, 131, + 31, 35, 37, 57, 37, 69, 137, 149, 139, 140, + 141, 142, 143, 144, 31, 38, 77, 31, 150, 161, + 151, 152, 159, 80, 161, 74, 70, 159, 83, 161, + 162, 80, 163, 85, 90, 166, 167, 82, 87, 88, + 89, 82, 91, 85, 93, 113, 95, 97, 94, 98, + 89, 132, 134, 135, 103, 104, 105, 74, 134, 135, + 109, 110, 92, 80, 96, 1, 115, 116, 82, 97, + 87, 88, 89, 149, 91, 124, 93, 97, 95, 161, + 116, 98, 70, 149, 1, 161, 103, 104, 105, 74, + 100, 100, 109, 110, 132, 80, 1, 155, 115, 116, + 160, 114, 87, 88, 89, -1, 91, 124, 93, 128, + 95, 133, 128, 98, 128, 158, 153, 102, 103, 104, + 105, 74, 146, 149, 109, 110, 31, 80, 81, 154, + 115, 116, 153, 160, 87, 88, 89, 149, 91, 124, + 93, 146, 95, 149, 158, 98, 134, 135, 84, 163, + 103, 104, 105, 167, 149, 159, 109, 110, 159, 159, + 159, 159, 115, 116, 100, 101, 102, 84, 159, 159, + 106, 124, 159, 161, 160, 159, 159, 159, 159, 84, + 159, 117, 118, 100, 101, 102, 122, 159, 159, 106, + 159, 127, 128, 129, 130, 131, 159, 159, 162, 160, + 117, 118, 160, 160, 163, 122, 161, 161, 164, 161, + 127, 128, 129, 130, 131, 161, 161, 161, 161, 161, + 161, 161, 74, 159, 161, 161, 162, 161, 80, 162, + 162, 162, 162, 162, 162, 87, 88, 89, 162, 91, + 162, 93, 159, 95, 161, 162, 98, 162, 162, 162, + 162, 103, 104, 105, 159, 162, 161, 109, 110, 162, + 162, 162, 162, 115, 116, 162, 162, 162, 162, 162, + 162, 162, 124, 162, 164, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + -1, 164, -1, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, -1, 165, 165, -1, 166, -1, 167 + ); + + protected $actionBase = array( + 0, -2, 154, 542, 698, 894, 913, 586, 53, 430, + 867, 307, 307, 67, 307, 307, 307, 482, 693, 693, + 925, 693, 468, 504, 204, 204, 204, 651, 651, 651, + 651, 685, 685, 845, 845, 877, 813, 781, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 356, 31, 369, 716, 1008, 1014, 1010, 1015, + 1006, 1005, 1009, 1011, 1016, 935, 936, 799, 937, 938, + 939, 941, 1012, 873, 1007, 1013, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 290, 159, 136, 382, 382, 382, 382, 382, + 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, + 382, 382, 382, 382, 382, 54, 54, 54, 187, 569, + 569, 341, 203, 658, 47, 699, 699, 699, 699, 699, + 699, 699, 699, 699, 699, 144, 144, 7, 7, 7, + 7, 7, 371, -25, -25, -25, -25, 816, 477, 102, + 499, 358, 449, 514, 525, 525, 360, -116, 231, 231, + 231, 231, 231, 231, -78, -78, -78, -78, -78, 319, + 580, 541, 86, 423, 636, 636, 636, 636, 423, 423, + 423, 423, 825, 1020, 423, 423, 423, 558, 688, 688, + 754, 147, 147, 147, 688, 550, 788, 422, 550, 422, + 194, 92, 794, -55, -40, 321, 814, 794, 748, 842, + 198, 143, 772, 539, 772, 1004, 778, 767, 733, 868, + 896, 1017, 820, 933, 821, 934, 219, 731, 1003, 1003, + 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1021, + 339, 1004, 286, 1021, 1021, 1021, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 615, 286, 380, 479, + 286, 796, 339, 356, 804, 356, 356, 356, 356, 964, + 356, 356, 356, 356, 356, 356, 969, 768, 410, 356, + 31, 206, 206, 472, 193, 206, 206, 206, 206, 356, + 356, 356, 539, 776, 793, 584, 809, 377, 776, 776, + 776, 355, 185, 39, 348, 555, 523, 546, 773, 773, + 789, 946, 946, 773, 785, 773, 789, 951, 773, 946, + 787, 467, 596, 540, 585, 600, 946, 519, 773, 773, + 773, 773, 622, 773, 503, 478, 773, 773, 749, 779, + 792, 46, 946, 946, 946, 792, 581, 808, 808, 808, + 830, 831, 762, 777, 534, 526, 645, 459, 807, 777, + 777, 773, 588, 762, 777, 762, 777, 805, 777, 777, + 777, 762, 777, 785, 577, 777, 734, 634, 60, 777, + 6, 952, 953, 671, 954, 949, 955, 976, 956, 957, + 884, 962, 950, 958, 948, 947, 790, 717, 718, 818, + 764, 945, 766, 766, 766, 943, 766, 766, 766, 766, + 766, 766, 766, 766, 717, 770, 835, 811, 791, 965, + 721, 729, 806, 897, 1018, 1019, 964, 997, 959, 826, + 732, 983, 966, 866, 876, 967, 968, 984, 998, 999, + 898, 786, 899, 900, 803, 970, 885, 766, 952, 957, + 950, 958, 948, 947, 765, 760, 755, 756, 753, 740, + 737, 739, 771, 1000, 942, 871, 844, 969, 944, 717, + 869, 979, 875, 985, 986, 878, 802, 775, 872, 901, + 971, 972, 973, 886, 1001, 829, 980, 874, 987, 810, + 902, 988, 989, 990, 991, 906, 887, 888, 889, 832, + 774, 940, 798, 908, 643, 744, 797, 975, 647, 963, + 890, 915, 916, 992, 993, 994, 917, 960, 839, 981, + 784, 982, 977, 840, 843, 653, 728, 795, 681, 683, + 918, 923, 927, 961, 782, 769, 846, 847, 1002, 928, + 686, 848, 735, 929, 996, 736, 741, 800, 893, 824, + 817, 780, 974, 783, 849, 930, 851, 858, 859, 995, + 861, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 458, 458, 458, 458, 458, 458, 307, 307, 307, 307, + 0, 0, 307, 0, 0, 0, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 423, 423, + 291, 291, 0, 291, 423, 423, 423, 423, 423, 423, + 423, 423, 423, 423, 291, 291, 291, 291, 291, 291, + 291, 787, 147, 147, 147, 147, 423, 423, 423, 423, + 423, -88, -88, 147, 147, 423, 384, 423, 423, 423, + 423, 423, 423, 423, 423, 423, 423, 423, 0, 0, + 286, 422, 0, 785, 785, 785, 785, 0, 0, 0, + 0, 422, 422, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 286, 422, 0, 286, 0, 785, + 785, 423, 787, 787, 314, 384, 423, 0, 0, 0, + 0, 286, 785, 286, 339, 422, 339, 339, 206, 356, + 314, 510, 510, 510, 510, 0, 539, 787, 787, 787, + 787, 787, 787, 787, 787, 787, 787, 787, 785, 0, + 787, 0, 785, 785, 785, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 785, 0, 0, 946, 0, 0, 0, 0, 773, 0, + 0, 0, 0, 0, 0, 773, 951, 0, 0, 0, + 0, 0, 0, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 766, 802, 0, 802, 0, 766, 766, 766 + ); + + protected $actionDefault = array( + 3,32767, 103,32767,32767,32767,32767,32767,32767,32767, + 32767,32767, 101,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767, 582, 582, 582, + 582,32767,32767, 250, 103,32767,32767, 458, 376, 376, + 376,32767,32767, 526, 526, 526, 526, 526, 526,32767, + 32767,32767,32767,32767,32767, 458,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767, 101,32767, + 32767,32767, 37, 7, 8, 10, 11, 50, 17, 314, + 32767,32767,32767,32767, 103,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767, 575,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767, 462, 441, 442, 444, + 445, 375, 527, 581, 317, 578, 374, 146, 329, 319, + 238, 320, 254, 463, 255, 464, 467, 468, 211, 283, + 371, 150, 405, 459, 407, 457, 461, 406, 381, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 379, 380, 460, 438, 437, 436, 403,32767, + 32767, 404, 408, 378, 411,32767,32767,32767,32767,32767, + 32767,32767,32767, 103,32767, 409, 410, 427, 428, 425, + 426, 429,32767, 430, 431, 432, 433,32767,32767, 306, + 32767,32767, 355, 353, 418, 419, 306,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767, 520, + 435,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767, 103,32767, 101, 522, 400, 402, + 490, 413, 414, 412, 382,32767, 497,32767, 103, 499, + 32767,32767,32767, 112,32767,32767,32767,32767, 521,32767, + 528, 528,32767, 483, 101, 194,32767, 194, 194,32767, + 32767,32767,32767,32767,32767,32767, 589, 483, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111,32767, + 194, 111,32767,32767,32767, 101, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 189,32767, 264, 266, + 103, 543, 194,32767, 502,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767, 495,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767, 483, 423, 139,32767, 139, 528, 415, 416, + 417, 485, 528, 528, 528, 302, 285,32767,32767,32767, + 32767, 500, 500, 101, 101, 101, 101, 495,32767,32767, + 112, 100, 100, 100, 100, 100, 104, 102,32767,32767, + 32767,32767, 100,32767, 102, 102,32767,32767, 221, 208, + 219, 102,32767, 547, 548, 219, 102, 223, 223, 223, + 243, 243, 474, 308, 102, 100, 102, 102, 196, 308, + 308,32767, 102, 474, 308, 474, 308, 198, 308, 308, + 308, 474, 308,32767, 102, 308, 210, 100, 100, 308, + 32767,32767,32767, 485,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767, 515,32767, + 532, 545, 421, 422, 424, 530, 446, 447, 448, 449, + 450, 451, 452, 454, 577,32767, 489,32767,32767,32767, + 32767, 328, 587,32767, 587,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 588,32767, 528,32767,32767,32767,32767, 420, 9, 76, + 43, 44, 52, 58, 506, 507, 508, 509, 503, 504, + 510, 505,32767,32767, 511, 553,32767,32767, 529, 580, + 32767,32767,32767,32767,32767,32767, 139,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767, 515,32767, 137, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767, 528,32767,32767,32767, 304, 305,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767, 528,32767,32767,32767, 287, 288,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767, 282,32767,32767, 370,32767,32767,32767,32767, + 349,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767, 152, 152, 3, 3, 331, 152, 152, 152, 331, + 152, 331, 331, 331, 152, 152, 152, 152, 152, 152, + 276, 184, 258, 261, 243, 243, 152, 341, 152 + ); + + protected $goto = array( + 194, 194, 669, 423, 642, 883, 839, 884, 1025, 417, + 308, 309, 330, 562, 314, 422, 331, 424, 621, 823, + 677, 851, 824, 585, 838, 857, 165, 165, 165, 165, + 218, 195, 191, 191, 175, 177, 213, 191, 191, 191, + 191, 191, 192, 192, 192, 192, 192, 192, 186, 187, + 188, 189, 190, 215, 213, 216, 522, 523, 413, 524, + 526, 527, 528, 529, 530, 531, 532, 533, 1094, 166, + 167, 168, 193, 169, 170, 171, 164, 172, 173, 174, + 176, 212, 214, 217, 235, 238, 241, 242, 244, 255, + 256, 257, 258, 259, 260, 261, 263, 264, 265, 266, + 274, 275, 311, 312, 313, 418, 419, 420, 567, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 178, 234, 179, 196, 197, 198, + 236, 186, 187, 188, 189, 190, 215, 1094, 199, 180, + 181, 182, 200, 196, 183, 237, 201, 199, 163, 202, + 203, 184, 204, 205, 206, 185, 207, 208, 209, 210, + 211, 323, 323, 323, 323, 826, 607, 607, 800, 546, + 539, 1189, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1242, 1242, 343, 464, 1267, 1268, 1242, 1242, + 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 389, 539, + 546, 555, 556, 396, 565, 587, 601, 602, 831, 798, + 879, 874, 875, 888, 15, 832, 876, 829, 877, 878, + 830, 455, 455, 941, 882, 804, 1190, 251, 251, 559, + 455, 1240, 1240, 814, 1046, 1042, 1043, 1240, 1240, 1240, + 1240, 1240, 1240, 1240, 1240, 1240, 1240, 605, 639, 1191, + 1250, 1251, 341, 248, 248, 248, 248, 250, 252, 819, + 819, 1193, 1193, 1000, 1193, 1000, 804, 416, 804, 596, + 1000, 1282, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1264, 1264, 962, 1264, 1193, 488, 5, + 489, 6, 1193, 1193, 1193, 1193, 495, 385, 1193, 1193, + 1193, 1274, 1274, 1274, 1274, 277, 277, 277, 277, 558, + 1276, 1276, 1276, 1276, 1066, 1067, 895, 346, 553, 319, + 303, 896, 703, 620, 622, 641, 640, 346, 346, 1143, + 659, 663, 976, 667, 675, 972, 1260, 430, 1292, 1292, + 332, 346, 346, 816, 346, 636, 1309, 650, 651, 652, + 844, 536, 536, 924, 536, 1292, 525, 525, 541, 1269, + 1270, 346, 525, 525, 525, 525, 525, 525, 525, 525, + 525, 525, 1295, 617, 618, 1033, 819, 446, 395, 1262, + 1262, 1033, 935, 935, 935, 935, 563, 599, 446, 929, + 936, 933, 403, 676, 822, 1186, 552, 534, 534, 534, + 534, 841, 589, 600, 984, 1031, 1253, 965, 939, 939, + 937, 939, 702, 465, 538, 974, 969, 344, 345, 706, + 440, 900, 1082, 853, 946, 440, 440, 1035, 604, 662, + 469, 1293, 1293, 981, 1077, 540, 550, 0, 0, 0, + 540, 843, 550, 645, 960, 388, 1174, 911, 1293, 837, + 1175, 1178, 912, 1179, 0, 566, 458, 459, 460, 541, + 849, 1185, 0, 1300, 1301, 254, 254, 401, 402, 0, + 0, 0, 648, 0, 649, 0, 405, 406, 407, 0, + 660, 0, 0, 408, 0, 0, 0, 339, 847, 594, + 608, 611, 612, 613, 614, 633, 634, 635, 679, 918, + 995, 1003, 1007, 1004, 1008, 0, 440, 440, 440, 440, + 440, 440, 440, 440, 440, 440, 440, 0, 1188, 440, + 852, 840, 1030, 1034, 584, 1059, 0, 680, 666, 666, + 944, 496, 672, 1057, 387, 391, 547, 586, 590, 425, + 0, 0, 0, 0, 0, 0, 425, 0, 0, 0, + 0, 0, 0, 934, 1012, 1005, 1009, 1006, 1010, 0, + 0, 0, 0, 0, 272, 0, 0, 0, 0, 537, + 537, 0, 0, 0, 0, 1075, 856, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 979, + 979 + ); + + protected $gotoCheck = array( + 42, 42, 72, 65, 65, 64, 35, 64, 121, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 26, + 9, 35, 27, 124, 35, 45, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 23, 23, 23, 23, 15, 106, 106, 7, 75, + 75, 20, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 162, 162, 95, 168, 168, 168, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 15, 6, + 15, 15, 15, 15, 75, 15, 15, 15, 15, 15, + 15, 143, 143, 49, 15, 12, 20, 5, 5, 164, + 143, 163, 163, 20, 15, 15, 15, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 55, 55, 20, + 20, 20, 171, 5, 5, 5, 5, 5, 5, 22, + 22, 72, 72, 72, 72, 72, 12, 13, 12, 13, + 72, 173, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 124, 124, 101, 124, 72, 149, 46, + 149, 46, 72, 72, 72, 72, 149, 61, 72, 72, + 72, 9, 9, 9, 9, 24, 24, 24, 24, 102, + 124, 124, 124, 124, 138, 138, 72, 14, 48, 161, + 161, 72, 48, 48, 48, 63, 48, 14, 14, 145, + 48, 48, 48, 48, 48, 48, 124, 111, 174, 174, + 29, 14, 14, 18, 14, 84, 14, 84, 84, 84, + 39, 19, 19, 90, 19, 174, 165, 165, 14, 170, + 170, 14, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 174, 83, 83, 124, 22, 19, 28, 124, + 124, 124, 19, 19, 19, 19, 2, 2, 19, 19, + 19, 91, 91, 91, 25, 154, 9, 105, 105, 105, + 105, 37, 105, 9, 108, 123, 14, 25, 25, 25, + 25, 25, 25, 151, 25, 25, 25, 95, 95, 97, + 23, 17, 17, 41, 94, 23, 23, 126, 17, 14, + 82, 175, 175, 17, 141, 9, 9, -1, -1, -1, + 9, 17, 9, 17, 17, 9, 78, 78, 175, 17, + 78, 78, 78, 78, -1, 9, 9, 9, 9, 14, + 9, 17, -1, 9, 9, 5, 5, 80, 80, -1, + -1, -1, 80, -1, 80, -1, 80, 80, 80, -1, + 80, -1, -1, 80, -1, -1, -1, 80, 9, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 87, + 87, 87, 87, 87, 87, -1, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, -1, 14, 23, + 16, 16, 16, 16, 8, 8, -1, 8, 8, 8, + 16, 8, 8, 8, 58, 58, 58, 58, 58, 115, + -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, + -1, -1, -1, 16, 115, 115, 115, 115, 115, -1, + -1, -1, -1, -1, 24, -1, -1, -1, -1, 24, + 24, -1, -1, -1, -1, 16, 16, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, + 105 + ); + + protected $gotoBase = array( + 0, 0, -297, 0, 0, 226, 196, 159, 517, 7, + 0, 0, -66, -65, 25, -175, 78, -33, 39, 84, + -213, 0, -64, 158, 302, 390, 15, 18, 46, 49, + 0, 0, 0, 0, 0, -356, 0, 67, 0, 32, + 0, -10, -1, 0, 0, 13, -417, 0, -364, 200, + 0, 0, 0, 0, 0, 208, 0, 0, 490, 0, + 0, 256, 0, 85, -14, -236, 0, 0, 0, 0, + 0, 0, -6, 0, 0, -168, 0, 0, 45, 140, + -12, 0, -35, -95, -344, 0, 0, 221, 0, 0, + 27, 92, 0, 0, -11, -287, 0, 19, 0, 0, + 0, 251, 267, 0, 0, 370, -73, 0, 43, 0, + 0, 61, 0, 0, 0, 270, 0, 0, 0, 0, + 0, 6, 0, 40, 16, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, + 0, -2, 0, 188, 0, 59, 0, 0, 0, -195, + 0, -19, 0, 0, 35, 0, 0, 0, 0, 0, + 0, 3, -57, -8, 201, 117, 0, 0, -110, 0, + -4, 223, 0, 241, 36, 129, 0, 0 + ); + + protected $gotoDefault = array( + -32768, 500, 710, 4, 711, 904, 787, 796, 582, 516, + 678, 340, 609, 414, 1258, 881, 1081, 564, 815, 1202, + 1210, 447, 818, 324, 700, 863, 864, 865, 392, 377, + 383, 390, 631, 610, 482, 850, 443, 842, 474, 845, + 442, 854, 162, 411, 498, 858, 3, 860, 543, 891, + 378, 868, 379, 655, 870, 549, 872, 873, 386, 393, + 394, 1086, 557, 606, 885, 243, 551, 886, 376, 887, + 894, 381, 384, 664, 454, 493, 487, 404, 1061, 593, + 628, 451, 468, 616, 615, 603, 467, 426, 409, 326, + 923, 931, 475, 452, 945, 342, 953, 708, 1093, 623, + 477, 961, 624, 968, 971, 517, 518, 466, 983, 269, + 986, 478, 1018, 646, 647, 998, 625, 626, 1016, 461, + 583, 1024, 444, 1032, 1246, 445, 1036, 262, 1039, 276, + 410, 427, 1044, 1045, 8, 1051, 670, 671, 10, 273, + 497, 1076, 665, 441, 1092, 431, 1162, 1164, 545, 479, + 1182, 1181, 658, 494, 1187, 1249, 439, 519, 462, 310, + 520, 302, 328, 307, 535, 289, 329, 521, 463, 1255, + 1263, 325, 30, 1283, 1294, 336, 561, 598 + ); + + protected $ruleToNonTerminal = array( + 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, + 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, + 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, + 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, + 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, + 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, + 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 25, 25, 68, 68, 71, 71, 70, 69, + 69, 62, 74, 74, 75, 75, 76, 76, 77, 77, + 78, 78, 26, 26, 27, 27, 27, 27, 86, 86, + 88, 88, 81, 81, 89, 89, 90, 90, 90, 82, + 82, 85, 85, 83, 83, 91, 92, 92, 56, 56, + 64, 64, 67, 67, 67, 66, 93, 93, 94, 57, + 57, 57, 57, 95, 95, 96, 96, 97, 97, 98, + 99, 99, 100, 100, 101, 101, 54, 54, 50, 50, + 103, 52, 52, 104, 51, 51, 53, 53, 63, 63, + 63, 63, 79, 79, 107, 107, 109, 109, 110, 110, + 110, 110, 108, 108, 108, 112, 112, 112, 112, 87, + 87, 115, 115, 115, 113, 113, 116, 116, 114, 114, + 117, 117, 118, 118, 118, 118, 111, 111, 80, 80, + 80, 20, 20, 20, 120, 119, 119, 121, 121, 121, + 121, 59, 122, 122, 123, 60, 125, 125, 126, 126, + 127, 127, 84, 128, 128, 128, 128, 128, 128, 133, + 133, 134, 134, 135, 135, 135, 135, 135, 136, 137, + 137, 132, 132, 129, 129, 131, 131, 139, 139, 138, + 138, 138, 138, 138, 138, 138, 130, 140, 140, 142, + 141, 141, 61, 102, 143, 143, 55, 55, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 150, 144, 144, 149, 149, 152, 153, 153, 154, + 155, 155, 155, 19, 19, 72, 72, 72, 72, 145, + 145, 145, 145, 157, 157, 146, 146, 148, 148, 148, + 151, 151, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 163, 163, 106, 165, 165, 165, 165, 147, 147, + 147, 147, 147, 147, 147, 147, 58, 58, 160, 160, + 160, 160, 166, 166, 156, 156, 156, 167, 167, 167, + 167, 167, 167, 73, 73, 65, 65, 65, 65, 124, + 124, 124, 124, 170, 169, 159, 159, 159, 159, 159, + 159, 159, 158, 158, 158, 168, 168, 168, 168, 105, + 164, 172, 172, 171, 171, 173, 173, 173, 173, 173, + 173, 173, 173, 161, 161, 161, 161, 175, 176, 174, + 174, 174, 174, 174, 174, 174, 174, 177, 177, 177, + 177 + ); + + protected $ruleToLength = array( + 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, + 2, 0, 1, 1, 1, 1, 1, 3, 5, 4, + 3, 4, 2, 3, 1, 1, 7, 6, 2, 3, + 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, + 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, + 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, + 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, + 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, + 2, 1, 1, 1, 0, 2, 1, 3, 8, 0, + 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, + 3, 1, 8, 9, 8, 7, 6, 8, 0, 2, + 0, 2, 1, 2, 1, 2, 1, 1, 1, 0, + 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, + 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, + 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, + 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, + 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, + 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, + 1, 1, 6, 8, 6, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 2, 1, 1, 0, 1, 0, 2, + 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, + 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, + 2, 0, 1, 5, 5, 10, 3, 5, 1, 1, + 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, + 1, 3, 2, 2, 3, 1, 0, 1, 1, 3, + 3, 3, 4, 1, 1, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, + 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, + 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, + 10, 8, 3, 2, 0, 4, 2, 1, 3, 2, + 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 1, 0, 3, 0, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 3, 3, 4, 1, 1, 3, 1, 1, + 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, + 1, 1, 1, 1, 1, 3, 1, 1, 4, 4, + 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, + 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, + 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, + 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, + 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, + 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, + 1 + ); + + protected function initReduceCallbacks() { + $this->reduceCallbacks = [ + 0 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 1 => function ($stackPos) { + $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); + }, + 2 => function ($stackPos) { + if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; + }, + 3 => function ($stackPos) { + $this->semValue = array(); + }, + 4 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; + if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 5 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 6 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 7 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 8 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 9 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 10 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 11 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 12 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 13 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 14 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 15 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 16 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 17 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 18 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 19 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 20 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 21 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 22 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 23 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 24 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 25 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 26 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 27 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 28 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 29 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 30 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 31 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 32 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 33 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 34 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 35 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 36 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 37 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 38 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 39 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 40 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 41 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 42 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 43 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 44 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 45 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 46 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 47 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 48 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 49 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 50 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 51 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 52 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 53 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 54 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 55 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 56 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 57 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 58 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 59 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 60 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 61 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 62 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 63 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 64 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 65 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 66 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 67 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 68 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 69 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 70 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 71 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 72 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 73 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 74 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 75 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 76 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 77 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 78 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 79 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 80 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 81 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 82 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 83 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 84 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 85 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 86 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 87 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 88 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 89 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 90 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 91 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 92 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 93 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 94 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 95 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 96 => function ($stackPos) { + $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 97 => function ($stackPos) { + $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 98 => function ($stackPos) { + /* nothing */ + }, + 99 => function ($stackPos) { + /* nothing */ + }, + 100 => function ($stackPos) { + /* nothing */ + }, + 101 => function ($stackPos) { + $this->emitError(new Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); + }, + 102 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 103 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 104 => function ($stackPos) { + $this->semValue = new Node\Attribute($this->semStack[$stackPos-(1-1)], [], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 105 => function ($stackPos) { + $this->semValue = new Node\Attribute($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 106 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 107 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 108 => function ($stackPos) { + $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 109 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 110 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 111 => function ($stackPos) { + $this->semValue = []; + }, + 112 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 113 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 114 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 115 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 116 => function ($stackPos) { + $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 117 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $this->checkNamespace($this->semValue); + }, + 118 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($this->semValue); + }, + 119 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($this->semValue); + }, + 120 => function ($stackPos) { + $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 121 => function ($stackPos) { + $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 122 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 123 => function ($stackPos) { + $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 124 => function ($stackPos) { + $this->semValue = Stmt\Use_::TYPE_FUNCTION; + }, + 125 => function ($stackPos) { + $this->semValue = Stmt\Use_::TYPE_CONSTANT; + }, + 126 => function ($stackPos) { + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + }, + 127 => function ($stackPos) { + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 128 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 129 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 130 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 131 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 132 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 133 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 134 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 135 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 136 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 137 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); + }, + 138 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); + }, + 139 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); + }, + 140 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); + }, + 141 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; + }, + 142 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; + }, + 143 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 144 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 145 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 146 => function ($stackPos) { + $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 147 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 148 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 149 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 150 => function ($stackPos) { + $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 151 => function ($stackPos) { + if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; + }, + 152 => function ($stackPos) { + $this->semValue = array(); + }, + 153 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; + if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 154 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 155 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 156 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 157 => function ($stackPos) { + throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 158 => function ($stackPos) { + + if ($this->semStack[$stackPos-(3-2)]) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; + } else { + $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; + if (null === $this->semValue) { $this->semValue = array(); } + } + + }, + 159 => function ($stackPos) { + $this->semValue = new Stmt\If_($this->semStack[$stackPos-(7-3)], ['stmts' => is_array($this->semStack[$stackPos-(7-5)]) ? $this->semStack[$stackPos-(7-5)] : array($this->semStack[$stackPos-(7-5)]), 'elseifs' => $this->semStack[$stackPos-(7-6)], 'else' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + }, + 160 => function ($stackPos) { + $this->semValue = new Stmt\If_($this->semStack[$stackPos-(10-3)], ['stmts' => $this->semStack[$stackPos-(10-6)], 'elseifs' => $this->semStack[$stackPos-(10-7)], 'else' => $this->semStack[$stackPos-(10-8)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + }, + 161 => function ($stackPos) { + $this->semValue = new Stmt\While_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 162 => function ($stackPos) { + $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(7-5)], is_array($this->semStack[$stackPos-(7-2)]) ? $this->semStack[$stackPos-(7-2)] : array($this->semStack[$stackPos-(7-2)]), $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + }, + 163 => function ($stackPos) { + $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + }, + 164 => function ($stackPos) { + $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 165 => function ($stackPos) { + $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 166 => function ($stackPos) { + $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 167 => function ($stackPos) { + $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 168 => function ($stackPos) { + $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 169 => function ($stackPos) { + $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 170 => function ($stackPos) { + $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 171 => function ($stackPos) { + $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 172 => function ($stackPos) { + + $e = $this->semStack[$stackPos-(2-1)]; + if ($e instanceof Expr\Throw_) { + // For backwards-compatibility reasons, convert throw in statement position into + // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). + $this->semValue = new Stmt\Throw_($e->expr, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + } else { + $this->semValue = new Stmt\Expression($e, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + } + + }, + 173 => function ($stackPos) { + $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 174 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + }, + 175 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + }, + 176 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(6-3)], new Expr\Error($this->startAttributeStack[$stackPos-(6-4)] + $this->endAttributeStack[$stackPos-(6-4)]), ['stmts' => $this->semStack[$stackPos-(6-6)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 177 => function ($stackPos) { + $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 178 => function ($stackPos) { + $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); + }, + 179 => function ($stackPos) { + $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 180 => function ($stackPos) { + $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 181 => function ($stackPos) { + $this->semValue = array(); /* means: no statement */ + }, + 182 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 183 => function ($stackPos) { + $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; + if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ + }, + 184 => function ($stackPos) { + $this->semValue = array(); + }, + 185 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 186 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 187 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 188 => function ($stackPos) { + $this->semValue = new Stmt\Catch_($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + }, + 189 => function ($stackPos) { + $this->semValue = null; + }, + 190 => function ($stackPos) { + $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 191 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 192 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 193 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 194 => function ($stackPos) { + $this->semValue = false; + }, + 195 => function ($stackPos) { + $this->semValue = true; + }, + 196 => function ($stackPos) { + $this->semValue = false; + }, + 197 => function ($stackPos) { + $this->semValue = true; + }, + 198 => function ($stackPos) { + $this->semValue = false; + }, + 199 => function ($stackPos) { + $this->semValue = true; + }, + 200 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 201 => function ($stackPos) { + $this->semValue = []; + }, + 202 => function ($stackPos) { + $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(8-3)], ['byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-5)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + }, + 203 => function ($stackPos) { + $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(9-4)], ['byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + }, + 204 => function ($stackPos) { + $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(8-3)], ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + $this->checkClass($this->semValue, $stackPos-(8-3)); + }, + 205 => function ($stackPos) { + $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(7-3)], ['extends' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => $this->semStack[$stackPos-(7-1)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + $this->checkInterface($this->semValue, $stackPos-(7-3)); + }, + 206 => function ($stackPos) { + $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(6-3)], ['stmts' => $this->semStack[$stackPos-(6-5)], 'attrGroups' => $this->semStack[$stackPos-(6-1)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 207 => function ($stackPos) { + $this->semValue = new Stmt\Enum_($this->semStack[$stackPos-(8-3)], ['scalarType' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + $this->checkEnum($this->semValue, $stackPos-(8-3)); + }, + 208 => function ($stackPos) { + $this->semValue = null; + }, + 209 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 210 => function ($stackPos) { + $this->semValue = null; + }, + 211 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 212 => function ($stackPos) { + $this->semValue = 0; + }, + 213 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 214 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 215 => function ($stackPos) { + $this->checkClassModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + }, + 216 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + }, + 217 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_FINAL; + }, + 218 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_READONLY; + }, + 219 => function ($stackPos) { + $this->semValue = null; + }, + 220 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 221 => function ($stackPos) { + $this->semValue = array(); + }, + 222 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 223 => function ($stackPos) { + $this->semValue = array(); + }, + 224 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 225 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 226 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 227 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 228 => function ($stackPos) { + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + }, + 229 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 230 => function ($stackPos) { + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + }, + 231 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 232 => function ($stackPos) { + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + }, + 233 => function ($stackPos) { + $this->semValue = null; + }, + 234 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 235 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 236 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 237 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 238 => function ($stackPos) { + $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 239 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 240 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-3)]; + }, + 241 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 242 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(5-3)]; + }, + 243 => function ($stackPos) { + $this->semValue = array(); + }, + 244 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 245 => function ($stackPos) { + $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 246 => function ($stackPos) { + $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 247 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 248 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 249 => function ($stackPos) { + $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + }, + 250 => function ($stackPos) { + $this->semValue = []; + }, + 251 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 252 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 253 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 254 => function ($stackPos) { + $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 255 => function ($stackPos) { + $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 256 => function ($stackPos) { + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + }, + 257 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 258 => function ($stackPos) { + $this->semValue = array(); + }, + 259 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 260 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 261 => function ($stackPos) { + $this->semValue = array(); + }, + 262 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 263 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 264 => function ($stackPos) { + $this->semValue = null; + }, + 265 => function ($stackPos) { + $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 266 => function ($stackPos) { + $this->semValue = null; + }, + 267 => function ($stackPos) { + $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 268 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + }, + 269 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(2-2)], true); + }, + 270 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + }, + 271 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + }, + 272 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 273 => function ($stackPos) { + $this->semValue = array(); + }, + 274 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 275 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 276 => function ($stackPos) { + $this->semValue = 0; + }, + 277 => function ($stackPos) { + $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + }, + 278 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + }, + 279 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + }, + 280 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + }, + 281 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_READONLY; + }, + 282 => function ($stackPos) { + $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); + $this->checkParam($this->semValue); + }, + 283 => function ($stackPos) { + $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]); + $this->checkParam($this->semValue); + }, + 284 => function ($stackPos) { + $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); + }, + 285 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 286 => function ($stackPos) { + $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 287 => function ($stackPos) { + $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 288 => function ($stackPos) { + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 289 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 290 => function ($stackPos) { + $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 291 => function ($stackPos) { + $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]); + }, + 292 => function ($stackPos) { + $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 293 => function ($stackPos) { + $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 294 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 295 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 296 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 297 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 298 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 299 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 300 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 301 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 302 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 303 => function ($stackPos) { + $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 304 => function ($stackPos) { + $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 305 => function ($stackPos) { + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 306 => function ($stackPos) { + $this->semValue = null; + }, + 307 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 308 => function ($stackPos) { + $this->semValue = null; + }, + 309 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 310 => function ($stackPos) { + $this->semValue = null; + }, + 311 => function ($stackPos) { + $this->semValue = array(); + }, + 312 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 313 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-2)]); + }, + 314 => function ($stackPos) { + $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 315 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 316 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 317 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 318 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 319 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 320 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]); + }, + 321 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 322 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 323 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 324 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 325 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 326 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 327 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 328 => function ($stackPos) { + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 329 => function ($stackPos) { + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 330 => function ($stackPos) { + if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } + }, + 331 => function ($stackPos) { + $this->semValue = array(); + }, + 332 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; + if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 333 => function ($stackPos) { + $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]); + $this->checkProperty($this->semValue, $stackPos-(5-2)); + }, + 334 => function ($stackPos) { + $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-1)]); + $this->checkClassConst($this->semValue, $stackPos-(5-2)); + }, + 335 => function ($stackPos) { + $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + $this->checkClassMethod($this->semValue, $stackPos-(10-2)); + }, + 336 => function ($stackPos) { + $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 337 => function ($stackPos) { + $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 338 => function ($stackPos) { + $this->semValue = null; /* will be skipped */ + }, + 339 => function ($stackPos) { + $this->semValue = array(); + }, + 340 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 341 => function ($stackPos) { + $this->semValue = array(); + }, + 342 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 343 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 344 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 345 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 346 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 347 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 348 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 349 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 350 => function ($stackPos) { + $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); + }, + 351 => function ($stackPos) { + $this->semValue = null; + }, + 352 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 353 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 354 => function ($stackPos) { + $this->semValue = 0; + }, + 355 => function ($stackPos) { + $this->semValue = 0; + }, + 356 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 357 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 358 => function ($stackPos) { + $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + }, + 359 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + }, + 360 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + }, + 361 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + }, + 362 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_STATIC; + }, + 363 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + }, + 364 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_FINAL; + }, + 365 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_READONLY; + }, + 366 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 367 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 368 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 369 => function ($stackPos) { + $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 370 => function ($stackPos) { + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 371 => function ($stackPos) { + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 372 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 373 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 374 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 375 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 376 => function ($stackPos) { + $this->semValue = array(); + }, + 377 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 378 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 379 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 380 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 381 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 382 => function ($stackPos) { + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 383 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 384 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 385 => function ($stackPos) { + $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 386 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 387 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 388 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 389 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 390 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 391 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 392 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 393 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 394 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 395 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 396 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 397 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 398 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 399 => function ($stackPos) { + $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 400 => function ($stackPos) { + $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 401 => function ($stackPos) { + $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 402 => function ($stackPos) { + $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 403 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 404 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 405 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 406 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 407 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 408 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 409 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 410 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 411 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 412 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 413 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 414 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 415 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 416 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 417 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 418 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 419 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 420 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 421 => function ($stackPos) { + $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 422 => function ($stackPos) { + $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 423 => function ($stackPos) { + $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 424 => function ($stackPos) { + $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 425 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 426 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 427 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 428 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 429 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 430 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 431 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 432 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 433 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 434 => function ($stackPos) { + $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 435 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 436 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 437 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 438 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 439 => function ($stackPos) { + $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 440 => function ($stackPos) { + $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 441 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 442 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 443 => function ($stackPos) { + $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 444 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 445 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 446 => function ($stackPos) { + $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 447 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; + $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); + $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); + }, + 448 => function ($stackPos) { + $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 449 => function ($stackPos) { + $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 450 => function ($stackPos) { + $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 451 => function ($stackPos) { + $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 452 => function ($stackPos) { + $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 453 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; + $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; + $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); + }, + 454 => function ($stackPos) { + $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 455 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 456 => function ($stackPos) { + $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 457 => function ($stackPos) { + $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 458 => function ($stackPos) { + $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 459 => function ($stackPos) { + $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 460 => function ($stackPos) { + $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 461 => function ($stackPos) { + $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 462 => function ($stackPos) { + $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 463 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + }, + 464 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + }, + 465 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + }, + 466 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + }, + 467 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + }, + 468 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + }, + 469 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + }, + 470 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + }, + 471 => function ($stackPos) { + $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]); + $this->checkClass($this->semValue[0], -1); + }, + 472 => function ($stackPos) { + $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 473 => function ($stackPos) { + list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 474 => function ($stackPos) { + $this->semValue = array(); + }, + 475 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-3)]; + }, + 476 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 477 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 478 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 479 => function ($stackPos) { + $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 480 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 481 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 482 => function ($stackPos) { + $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 483 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 484 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 485 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 486 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 487 => function ($stackPos) { + $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 488 => function ($stackPos) { + $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 489 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 490 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 491 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 492 => function ($stackPos) { + $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; + }, + 493 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 494 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 495 => function ($stackPos) { + $this->semValue = null; + }, + 496 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 497 => function ($stackPos) { + $this->semValue = array(); + }, + 498 => function ($stackPos) { + $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); + }, + 499 => function ($stackPos) { + foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 500 => function ($stackPos) { + $this->semValue = array(); + }, + 501 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 502 => function ($stackPos) { + $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 503 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 504 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 505 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 506 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 507 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 508 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 509 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 510 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 511 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 512 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2; + }, + 513 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); + }, + 514 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); + }, + 515 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 516 => function ($stackPos) { + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 517 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; + foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); + }, + 518 => function ($stackPos) { + $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 519 => function ($stackPos) { + $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 520 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 521 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 522 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 523 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); + }, + 524 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true); + }, + 525 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); + }, + 526 => function ($stackPos) { + $this->semValue = null; + }, + 527 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 528 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 529 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 530 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 531 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 532 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 533 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 534 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 535 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 536 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 537 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 538 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 539 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 540 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 541 => function ($stackPos) { + $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 542 => function ($stackPos) { + $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 543 => function ($stackPos) { + $this->semValue = null; + }, + 544 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 545 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 546 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 547 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 548 => function ($stackPos) { + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 549 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 550 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 551 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 552 => function ($stackPos) { + $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2; + }, + 553 => function ($stackPos) { + $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; + }, + 554 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 555 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 556 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 557 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 558 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 559 => function ($stackPos) { + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 560 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 561 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 562 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 563 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 564 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 565 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 566 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 567 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 568 => function ($stackPos) { + $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; + }, + 569 => function ($stackPos) { + $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 570 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue); + }, + 571 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 572 => function ($stackPos) { + /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ + }, + 573 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 574 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 575 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 576 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 577 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 578 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 579 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 580 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 581 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 582 => function ($stackPos) { + $this->semValue = null; + }, + 583 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 584 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 585 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 586 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); + }, + 587 => function ($stackPos) { + $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 588 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 589 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 590 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 591 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 592 => function ($stackPos) { + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 593 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 594 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 595 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 596 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 597 => function ($stackPos) { + $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 598 => function ($stackPos) { + $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 599 => function ($stackPos) { + $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 600 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + ]; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php new file mode 100644 index 00000000..b76a5d94 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php @@ -0,0 +1,148 @@ +lexer = $lexer; + + if (isset($options['throwOnError'])) { + throw new \LogicException( + '"throwOnError" is no longer supported, use "errorHandler" instead'); + } + + $this->initReduceCallbacks(); + } + + /** + * Parses PHP code into a node tree. + * + * If a non-throwing error handler is used, the parser will continue parsing after an error + * occurred and attempt to build a partial AST. + * + * @param string $code The source code to parse + * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults + * to ErrorHandler\Throwing. + * + * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and + * the parser was unable to recover from an error). + */ + public function parse(string $code, ErrorHandler $errorHandler = null) { + $this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing; + + $this->lexer->startLexing($code, $this->errorHandler); + $result = $this->doParse(); + + // Clear out some of the interior state, so we don't hold onto unnecessary + // memory between uses of the parser + $this->startAttributeStack = []; + $this->endAttributeStack = []; + $this->semStack = []; + $this->semValue = null; + + return $result; + } + + protected function doParse() { + // We start off with no lookahead-token + $symbol = self::SYMBOL_NONE; + + // The attributes for a node are taken from the first and last token of the node. + // From the first token only the startAttributes are taken and from the last only + // the endAttributes. Both are merged using the array union operator (+). + $startAttributes = []; + $endAttributes = []; + $this->endAttributes = $endAttributes; + + // Keep stack of start and end attributes + $this->startAttributeStack = []; + $this->endAttributeStack = [$endAttributes]; + + // Start off in the initial state and keep a stack of previous states + $state = 0; + $stateStack = [$state]; + + // Semantic value stack (contains values of tokens and semantic action results) + $this->semStack = []; + + // Current position in the stack(s) + $stackPos = 0; + + $this->errorState = 0; + + for (;;) { + //$this->traceNewState($state, $symbol); + + if ($this->actionBase[$state] === 0) { + $rule = $this->actionDefault[$state]; + } else { + if ($symbol === self::SYMBOL_NONE) { + // Fetch the next token id from the lexer and fetch additional info by-ref. + // The end attributes are fetched into a temporary variable and only set once the token is really + // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is + // reduced after a token was read but not yet shifted. + $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes); + + // map the lexer token id to the internally used symbols + $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize + ? $this->tokenToSymbol[$tokenId] + : $this->invalidSymbol; + + if ($symbol === $this->invalidSymbol) { + throw new \RangeException(sprintf( + 'The lexer returned an invalid token (id=%d, value=%s)', + $tokenId, $tokenValue + )); + } + + // Allow productions to access the start attributes of the lookahead token. + $this->lookaheadStartAttributes = $startAttributes; + + //$this->traceRead($symbol); + } + + $idx = $this->actionBase[$state] + $symbol; + if ((($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) + || ($state < $this->YY2TBLSTATE + && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 + && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol)) + && ($action = $this->action[$idx]) !== $this->defaultAction) { + /* + * >= numNonLeafStates: shift and reduce + * > 0: shift + * = 0: accept + * < 0: reduce + * = -YYUNEXPECTED: error + */ + if ($action > 0) { + /* shift */ + //$this->traceShift($symbol); + + ++$stackPos; + $stateStack[$stackPos] = $state = $action; + $this->semStack[$stackPos] = $tokenValue; + $this->startAttributeStack[$stackPos] = $startAttributes; + $this->endAttributeStack[$stackPos] = $endAttributes; + $this->endAttributes = $endAttributes; + $symbol = self::SYMBOL_NONE; + + if ($this->errorState) { + --$this->errorState; + } + + if ($action < $this->numNonLeafStates) { + continue; + } + + /* $yyn >= numNonLeafStates means shift-and-reduce */ + $rule = $action - $this->numNonLeafStates; + } else { + $rule = -$action; + } + } else { + $rule = $this->actionDefault[$state]; + } + } + + for (;;) { + if ($rule === 0) { + /* accept */ + //$this->traceAccept(); + return $this->semValue; + } elseif ($rule !== $this->unexpectedTokenRule) { + /* reduce */ + //$this->traceReduce($rule); + + try { + $this->reduceCallbacks[$rule]($stackPos); + } catch (Error $e) { + if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) { + $e->setStartLine($startAttributes['startLine']); + } + + $this->emitError($e); + // Can't recover from this type of error + return null; + } + + /* Goto - shift nonterminal */ + $lastEndAttributes = $this->endAttributeStack[$stackPos]; + $ruleLength = $this->ruleToLength[$rule]; + $stackPos -= $ruleLength; + $nonTerminal = $this->ruleToNonTerminal[$rule]; + $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos]; + if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) { + $state = $this->goto[$idx]; + } else { + $state = $this->gotoDefault[$nonTerminal]; + } + + ++$stackPos; + $stateStack[$stackPos] = $state; + $this->semStack[$stackPos] = $this->semValue; + $this->endAttributeStack[$stackPos] = $lastEndAttributes; + if ($ruleLength === 0) { + // Empty productions use the start attributes of the lookahead token. + $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; + } + } else { + /* error */ + switch ($this->errorState) { + case 0: + $msg = $this->getErrorMessage($symbol, $state); + $this->emitError(new Error($msg, $startAttributes + $endAttributes)); + // Break missing intentionally + case 1: + case 2: + $this->errorState = 3; + + // Pop until error-expecting state uncovered + while (!( + (($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0 + && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) + || ($state < $this->YY2TBLSTATE + && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0 + && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) + ) || ($action = $this->action[$idx]) === $this->defaultAction) { // Not totally sure about this + if ($stackPos <= 0) { + // Could not recover from error + return null; + } + $state = $stateStack[--$stackPos]; + //$this->tracePop($state); + } + + //$this->traceShift($this->errorSymbol); + ++$stackPos; + $stateStack[$stackPos] = $state = $action; + + // We treat the error symbol as being empty, so we reset the end attributes + // to the end attributes of the last non-error symbol + $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; + $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1]; + $this->endAttributes = $this->endAttributeStack[$stackPos - 1]; + break; + + case 3: + if ($symbol === 0) { + // Reached EOF without recovering from error + return null; + } + + //$this->traceDiscard($symbol); + $symbol = self::SYMBOL_NONE; + break 2; + } + } + + if ($state < $this->numNonLeafStates) { + break; + } + + /* >= numNonLeafStates means shift-and-reduce */ + $rule = $state - $this->numNonLeafStates; + } + } + + throw new \RuntimeException('Reached end of parser loop'); + } + + protected function emitError(Error $error) { + $this->errorHandler->handleError($error); + } + + /** + * Format error message including expected tokens. + * + * @param int $symbol Unexpected symbol + * @param int $state State at time of error + * + * @return string Formatted error message + */ + protected function getErrorMessage(int $symbol, int $state) : string { + $expectedString = ''; + if ($expected = $this->getExpectedTokens($state)) { + $expectedString = ', expecting ' . implode(' or ', $expected); + } + + return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString; + } + + /** + * Get limited number of expected tokens in given state. + * + * @param int $state State + * + * @return string[] Expected tokens. If too many, an empty array is returned. + */ + protected function getExpectedTokens(int $state) : array { + $expected = []; + + $base = $this->actionBase[$state]; + foreach ($this->symbolToName as $symbol => $name) { + $idx = $base + $symbol; + if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol + || $state < $this->YY2TBLSTATE + && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 + && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol + ) { + if ($this->action[$idx] !== $this->unexpectedTokenRule + && $this->action[$idx] !== $this->defaultAction + && $symbol !== $this->errorSymbol + ) { + if (count($expected) === 4) { + /* Too many expected tokens */ + return []; + } + + $expected[] = $name; + } + } + } + + return $expected; + } + + /* + * Tracing functions used for debugging the parser. + */ + + /* + protected function traceNewState($state, $symbol) { + echo '% State ' . $state + . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n"; + } + + protected function traceRead($symbol) { + echo '% Reading ' . $this->symbolToName[$symbol] . "\n"; + } + + protected function traceShift($symbol) { + echo '% Shift ' . $this->symbolToName[$symbol] . "\n"; + } + + protected function traceAccept() { + echo "% Accepted.\n"; + } + + protected function traceReduce($n) { + echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n"; + } + + protected function tracePop($state) { + echo '% Recovering, uncovered state ' . $state . "\n"; + } + + protected function traceDiscard($symbol) { + echo '% Discard ' . $this->symbolToName[$symbol] . "\n"; + } + */ + + /* + * Helper functions invoked by semantic actions + */ + + /** + * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions. + * + * @param Node\Stmt[] $stmts + * @return Node\Stmt[] + */ + protected function handleNamespaces(array $stmts) : array { + $hasErrored = false; + $style = $this->getNamespacingStyle($stmts); + if (null === $style) { + // not namespaced, nothing to do + return $stmts; + } elseif ('brace' === $style) { + // For braced namespaces we only have to check that there are no invalid statements between the namespaces + $afterFirstNamespace = false; + foreach ($stmts as $stmt) { + if ($stmt instanceof Node\Stmt\Namespace_) { + $afterFirstNamespace = true; + } elseif (!$stmt instanceof Node\Stmt\HaltCompiler + && !$stmt instanceof Node\Stmt\Nop + && $afterFirstNamespace && !$hasErrored) { + $this->emitError(new Error( + 'No code may exist outside of namespace {}', $stmt->getAttributes())); + $hasErrored = true; // Avoid one error for every statement + } + } + return $stmts; + } else { + // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts + $resultStmts = []; + $targetStmts =& $resultStmts; + $lastNs = null; + foreach ($stmts as $stmt) { + if ($stmt instanceof Node\Stmt\Namespace_) { + if ($lastNs !== null) { + $this->fixupNamespaceAttributes($lastNs); + } + if ($stmt->stmts === null) { + $stmt->stmts = []; + $targetStmts =& $stmt->stmts; + $resultStmts[] = $stmt; + } else { + // This handles the invalid case of mixed style namespaces + $resultStmts[] = $stmt; + $targetStmts =& $resultStmts; + } + $lastNs = $stmt; + } elseif ($stmt instanceof Node\Stmt\HaltCompiler) { + // __halt_compiler() is not moved into the namespace + $resultStmts[] = $stmt; + } else { + $targetStmts[] = $stmt; + } + } + if ($lastNs !== null) { + $this->fixupNamespaceAttributes($lastNs); + } + return $resultStmts; + } + } + + private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt) { + // We moved the statements into the namespace node, as such the end of the namespace node + // needs to be extended to the end of the statements. + if (empty($stmt->stmts)) { + return; + } + + // We only move the builtin end attributes here. This is the best we can do with the + // knowledge we have. + $endAttributes = ['endLine', 'endFilePos', 'endTokenPos']; + $lastStmt = $stmt->stmts[count($stmt->stmts) - 1]; + foreach ($endAttributes as $endAttribute) { + if ($lastStmt->hasAttribute($endAttribute)) { + $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute)); + } + } + } + + /** + * Determine namespacing style (semicolon or brace) + * + * @param Node[] $stmts Top-level statements. + * + * @return null|string One of "semicolon", "brace" or null (no namespaces) + */ + private function getNamespacingStyle(array $stmts) { + $style = null; + $hasNotAllowedStmts = false; + foreach ($stmts as $i => $stmt) { + if ($stmt instanceof Node\Stmt\Namespace_) { + $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace'; + if (null === $style) { + $style = $currentStyle; + if ($hasNotAllowedStmts) { + $this->emitError(new Error( + 'Namespace declaration statement has to be the very first statement in the script', + $stmt->getLine() // Avoid marking the entire namespace as an error + )); + } + } elseif ($style !== $currentStyle) { + $this->emitError(new Error( + 'Cannot mix bracketed namespace declarations with unbracketed namespace declarations', + $stmt->getLine() // Avoid marking the entire namespace as an error + )); + // Treat like semicolon style for namespace normalization + return 'semicolon'; + } + continue; + } + + /* declare(), __halt_compiler() and nops can be used before a namespace declaration */ + if ($stmt instanceof Node\Stmt\Declare_ + || $stmt instanceof Node\Stmt\HaltCompiler + || $stmt instanceof Node\Stmt\Nop) { + continue; + } + + /* There may be a hashbang line at the very start of the file */ + if ($i === 0 && $stmt instanceof Node\Stmt\InlineHTML && preg_match('/\A#!.*\r?\n\z/', $stmt->value)) { + continue; + } + + /* Everything else if forbidden before namespace declarations */ + $hasNotAllowedStmts = true; + } + return $style; + } + + /** + * Fix up parsing of static property calls in PHP 5. + * + * In PHP 5 A::$b[c][d] and A::$b[c][d]() have very different interpretation. The former is + * interpreted as (A::$b)[c][d], while the latter is the same as A::{$b[c][d]}(). We parse the + * latter as the former initially and this method fixes the AST into the correct form when we + * encounter the "()". + * + * @param Node\Expr\StaticPropertyFetch|Node\Expr\ArrayDimFetch $prop + * @param Node\Arg[] $args + * @param array $attributes + * + * @return Expr\StaticCall + */ + protected function fixupPhp5StaticPropCall($prop, array $args, array $attributes) : Expr\StaticCall { + if ($prop instanceof Node\Expr\StaticPropertyFetch) { + $name = $prop->name instanceof VarLikeIdentifier + ? $prop->name->toString() : $prop->name; + $var = new Expr\Variable($name, $prop->name->getAttributes()); + return new Expr\StaticCall($prop->class, $var, $args, $attributes); + } elseif ($prop instanceof Node\Expr\ArrayDimFetch) { + $tmp = $prop; + while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { + $tmp = $tmp->var; + } + + /** @var Expr\StaticPropertyFetch $staticProp */ + $staticProp = $tmp->var; + + // Set start attributes to attributes of innermost node + $tmp = $prop; + $this->fixupStartAttributes($tmp, $staticProp->name); + while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { + $tmp = $tmp->var; + $this->fixupStartAttributes($tmp, $staticProp->name); + } + + $name = $staticProp->name instanceof VarLikeIdentifier + ? $staticProp->name->toString() : $staticProp->name; + $tmp->var = new Expr\Variable($name, $staticProp->name->getAttributes()); + return new Expr\StaticCall($staticProp->class, $prop, $args, $attributes); + } else { + throw new \Exception; + } + } + + protected function fixupStartAttributes(Node $to, Node $from) { + $startAttributes = ['startLine', 'startFilePos', 'startTokenPos']; + foreach ($startAttributes as $startAttribute) { + if ($from->hasAttribute($startAttribute)) { + $to->setAttribute($startAttribute, $from->getAttribute($startAttribute)); + } + } + } + + protected function handleBuiltinTypes(Name $name) { + $builtinTypes = [ + 'bool' => true, + 'int' => true, + 'float' => true, + 'string' => true, + 'iterable' => true, + 'void' => true, + 'object' => true, + 'null' => true, + 'false' => true, + 'mixed' => true, + 'never' => true, + ]; + + if (!$name->isUnqualified()) { + return $name; + } + + $lowerName = $name->toLowerString(); + if (!isset($builtinTypes[$lowerName])) { + return $name; + } + + return new Node\Identifier($lowerName, $name->getAttributes()); + } + + /** + * Get combined start and end attributes at a stack location + * + * @param int $pos Stack location + * + * @return array Combined start and end attributes + */ + protected function getAttributesAt(int $pos) : array { + return $this->startAttributeStack[$pos] + $this->endAttributeStack[$pos]; + } + + protected function getFloatCastKind(string $cast): int + { + $cast = strtolower($cast); + if (strpos($cast, 'float') !== false) { + return Double::KIND_FLOAT; + } + + if (strpos($cast, 'real') !== false) { + return Double::KIND_REAL; + } + + return Double::KIND_DOUBLE; + } + + protected function parseLNumber($str, $attributes, $allowInvalidOctal = false) { + try { + return LNumber::fromString($str, $attributes, $allowInvalidOctal); + } catch (Error $error) { + $this->emitError($error); + // Use dummy value + return new LNumber(0, $attributes); + } + } + + /** + * Parse a T_NUM_STRING token into either an integer or string node. + * + * @param string $str Number string + * @param array $attributes Attributes + * + * @return LNumber|String_ Integer or string node. + */ + protected function parseNumString(string $str, array $attributes) { + if (!preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) { + return new String_($str, $attributes); + } + + $num = +$str; + if (!is_int($num)) { + return new String_($str, $attributes); + } + + return new LNumber($num, $attributes); + } + + protected function stripIndentation( + string $string, int $indentLen, string $indentChar, + bool $newlineAtStart, bool $newlineAtEnd, array $attributes + ) { + if ($indentLen === 0) { + return $string; + } + + $start = $newlineAtStart ? '(?:(?<=\n)|\A)' : '(?<=\n)'; + $end = $newlineAtEnd ? '(?:(?=[\r\n])|\z)' : '(?=[\r\n])'; + $regex = '/' . $start . '([ \t]*)(' . $end . ')?/'; + return preg_replace_callback( + $regex, + function ($matches) use ($indentLen, $indentChar, $attributes) { + $prefix = substr($matches[1], 0, $indentLen); + if (false !== strpos($prefix, $indentChar === " " ? "\t" : " ")) { + $this->emitError(new Error( + 'Invalid indentation - tabs and spaces cannot be mixed', $attributes + )); + } elseif (strlen($prefix) < $indentLen && !isset($matches[2])) { + $this->emitError(new Error( + 'Invalid body indentation level ' . + '(expecting an indentation level of at least ' . $indentLen . ')', + $attributes + )); + } + return substr($matches[0], strlen($prefix)); + }, + $string + ); + } + + protected function parseDocString( + string $startToken, $contents, string $endToken, + array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape + ) { + $kind = strpos($startToken, "'") === false + ? String_::KIND_HEREDOC : String_::KIND_NOWDOC; + + $regex = '/\A[bB]?<<<[ \t]*[\'"]?([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[\'"]?(?:\r\n|\n|\r)\z/'; + $result = preg_match($regex, $startToken, $matches); + assert($result === 1); + $label = $matches[1]; + + $result = preg_match('/\A[ \t]*/', $endToken, $matches); + assert($result === 1); + $indentation = $matches[0]; + + $attributes['kind'] = $kind; + $attributes['docLabel'] = $label; + $attributes['docIndentation'] = $indentation; + + $indentHasSpaces = false !== strpos($indentation, " "); + $indentHasTabs = false !== strpos($indentation, "\t"); + if ($indentHasSpaces && $indentHasTabs) { + $this->emitError(new Error( + 'Invalid indentation - tabs and spaces cannot be mixed', + $endTokenAttributes + )); + + // Proceed processing as if this doc string is not indented + $indentation = ''; + } + + $indentLen = \strlen($indentation); + $indentChar = $indentHasSpaces ? " " : "\t"; + + if (\is_string($contents)) { + if ($contents === '') { + return new String_('', $attributes); + } + + $contents = $this->stripIndentation( + $contents, $indentLen, $indentChar, true, true, $attributes + ); + $contents = preg_replace('~(\r\n|\n|\r)\z~', '', $contents); + + if ($kind === String_::KIND_HEREDOC) { + $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape); + } + + return new String_($contents, $attributes); + } else { + assert(count($contents) > 0); + if (!$contents[0] instanceof Node\Scalar\EncapsedStringPart) { + // If there is no leading encapsed string part, pretend there is an empty one + $this->stripIndentation( + '', $indentLen, $indentChar, true, false, $contents[0]->getAttributes() + ); + } + + $newContents = []; + foreach ($contents as $i => $part) { + if ($part instanceof Node\Scalar\EncapsedStringPart) { + $isLast = $i === \count($contents) - 1; + $part->value = $this->stripIndentation( + $part->value, $indentLen, $indentChar, + $i === 0, $isLast, $part->getAttributes() + ); + $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); + if ($isLast) { + $part->value = preg_replace('~(\r\n|\n|\r)\z~', '', $part->value); + } + if ('' === $part->value) { + continue; + } + } + $newContents[] = $part; + } + return new Encapsed($newContents, $attributes); + } + } + + /** + * Create attributes for a zero-length common-capturing nop. + * + * @param Comment[] $comments + * @return array + */ + protected function createCommentNopAttributes(array $comments) { + $comment = $comments[count($comments) - 1]; + $commentEndLine = $comment->getEndLine(); + $commentEndFilePos = $comment->getEndFilePos(); + $commentEndTokenPos = $comment->getEndTokenPos(); + + $attributes = ['comments' => $comments]; + if (-1 !== $commentEndLine) { + $attributes['startLine'] = $commentEndLine; + $attributes['endLine'] = $commentEndLine; + } + if (-1 !== $commentEndFilePos) { + $attributes['startFilePos'] = $commentEndFilePos + 1; + $attributes['endFilePos'] = $commentEndFilePos; + } + if (-1 !== $commentEndTokenPos) { + $attributes['startTokenPos'] = $commentEndTokenPos + 1; + $attributes['endTokenPos'] = $commentEndTokenPos; + } + return $attributes; + } + + protected function checkClassModifier($a, $b, $modifierPos) { + try { + Class_::verifyClassModifier($a, $b); + } catch (Error $error) { + $error->setAttributes($this->getAttributesAt($modifierPos)); + $this->emitError($error); + } + } + + protected function checkModifier($a, $b, $modifierPos) { + // Jumping through some hoops here because verifyModifier() is also used elsewhere + try { + Class_::verifyModifier($a, $b); + } catch (Error $error) { + $error->setAttributes($this->getAttributesAt($modifierPos)); + $this->emitError($error); + } + } + + protected function checkParam(Param $node) { + if ($node->variadic && null !== $node->default) { + $this->emitError(new Error( + 'Variadic parameter cannot have a default value', + $node->default->getAttributes() + )); + } + } + + protected function checkTryCatch(TryCatch $node) { + if (empty($node->catches) && null === $node->finally) { + $this->emitError(new Error( + 'Cannot use try without catch or finally', $node->getAttributes() + )); + } + } + + protected function checkNamespace(Namespace_ $node) { + if (null !== $node->stmts) { + foreach ($node->stmts as $stmt) { + if ($stmt instanceof Namespace_) { + $this->emitError(new Error( + 'Namespace declarations cannot be nested', $stmt->getAttributes() + )); + } + } + } + } + + private function checkClassName($name, $namePos) { + if (null !== $name && $name->isSpecialClassName()) { + $this->emitError(new Error( + sprintf('Cannot use \'%s\' as class name as it is reserved', $name), + $this->getAttributesAt($namePos) + )); + } + } + + private function checkImplementedInterfaces(array $interfaces) { + foreach ($interfaces as $interface) { + if ($interface->isSpecialClassName()) { + $this->emitError(new Error( + sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface), + $interface->getAttributes() + )); + } + } + } + + protected function checkClass(Class_ $node, $namePos) { + $this->checkClassName($node->name, $namePos); + + if ($node->extends && $node->extends->isSpecialClassName()) { + $this->emitError(new Error( + sprintf('Cannot use \'%s\' as class name as it is reserved', $node->extends), + $node->extends->getAttributes() + )); + } + + $this->checkImplementedInterfaces($node->implements); + } + + protected function checkInterface(Interface_ $node, $namePos) { + $this->checkClassName($node->name, $namePos); + $this->checkImplementedInterfaces($node->extends); + } + + protected function checkEnum(Enum_ $node, $namePos) { + $this->checkClassName($node->name, $namePos); + $this->checkImplementedInterfaces($node->implements); + } + + protected function checkClassMethod(ClassMethod $node, $modifierPos) { + if ($node->flags & Class_::MODIFIER_STATIC) { + switch ($node->name->toLowerString()) { + case '__construct': + $this->emitError(new Error( + sprintf('Constructor %s() cannot be static', $node->name), + $this->getAttributesAt($modifierPos))); + break; + case '__destruct': + $this->emitError(new Error( + sprintf('Destructor %s() cannot be static', $node->name), + $this->getAttributesAt($modifierPos))); + break; + case '__clone': + $this->emitError(new Error( + sprintf('Clone method %s() cannot be static', $node->name), + $this->getAttributesAt($modifierPos))); + break; + } + } + + if ($node->flags & Class_::MODIFIER_READONLY) { + $this->emitError(new Error( + sprintf('Method %s() cannot be readonly', $node->name), + $this->getAttributesAt($modifierPos))); + } + } + + protected function checkClassConst(ClassConst $node, $modifierPos) { + if ($node->flags & Class_::MODIFIER_STATIC) { + $this->emitError(new Error( + "Cannot use 'static' as constant modifier", + $this->getAttributesAt($modifierPos))); + } + if ($node->flags & Class_::MODIFIER_ABSTRACT) { + $this->emitError(new Error( + "Cannot use 'abstract' as constant modifier", + $this->getAttributesAt($modifierPos))); + } + if ($node->flags & Class_::MODIFIER_READONLY) { + $this->emitError(new Error( + "Cannot use 'readonly' as constant modifier", + $this->getAttributesAt($modifierPos))); + } + } + + protected function checkProperty(Property $node, $modifierPos) { + if ($node->flags & Class_::MODIFIER_ABSTRACT) { + $this->emitError(new Error('Properties cannot be declared abstract', + $this->getAttributesAt($modifierPos))); + } + + if ($node->flags & Class_::MODIFIER_FINAL) { + $this->emitError(new Error('Properties cannot be declared final', + $this->getAttributesAt($modifierPos))); + } + } + + protected function checkUseUse(UseUse $node, $namePos) { + if ($node->alias && $node->alias->isSpecialClassName()) { + $this->emitError(new Error( + sprintf( + 'Cannot use %s as %s because \'%2$s\' is a special class name', + $node->name, $node->alias + ), + $this->getAttributesAt($namePos) + )); + } + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php b/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php new file mode 100644 index 00000000..f041e7ff --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php @@ -0,0 +1,44 @@ +pAttrGroups($node->attrGroups, true) + . $this->pModifiers($node->flags) + . ($node->type ? $this->p($node->type) . ' ' : '') + . ($node->byRef ? '&' : '') + . ($node->variadic ? '...' : '') + . $this->p($node->var) + . ($node->default ? ' = ' . $this->p($node->default) : ''); + } + + protected function pArg(Node\Arg $node) { + return ($node->name ? $node->name->toString() . ': ' : '') + . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') + . $this->p($node->value); + } + + protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) { + return '...'; + } + + protected function pConst(Node\Const_ $node) { + return $node->name . ' = ' . $this->p($node->value); + } + + protected function pNullableType(Node\NullableType $node) { + return '?' . $this->p($node->type); + } + + protected function pUnionType(Node\UnionType $node) { + return $this->pImplode($node->types, '|'); + } + + protected function pIntersectionType(Node\IntersectionType $node) { + return $this->pImplode($node->types, '&'); + } + + protected function pIdentifier(Node\Identifier $node) { + return $node->name; + } + + protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) { + return '$' . $node->name; + } + + protected function pAttribute(Node\Attribute $node) { + return $this->p($node->name) + . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : ''); + } + + protected function pAttributeGroup(Node\AttributeGroup $node) { + return '#[' . $this->pCommaSeparated($node->attrs) . ']'; + } + + // Names + + protected function pName(Name $node) { + return implode('\\', $node->parts); + } + + protected function pName_FullyQualified(Name\FullyQualified $node) { + return '\\' . implode('\\', $node->parts); + } + + protected function pName_Relative(Name\Relative $node) { + return 'namespace\\' . implode('\\', $node->parts); + } + + // Magic Constants + + protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) { + return '__CLASS__'; + } + + protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) { + return '__DIR__'; + } + + protected function pScalar_MagicConst_File(MagicConst\File $node) { + return '__FILE__'; + } + + protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) { + return '__FUNCTION__'; + } + + protected function pScalar_MagicConst_Line(MagicConst\Line $node) { + return '__LINE__'; + } + + protected function pScalar_MagicConst_Method(MagicConst\Method $node) { + return '__METHOD__'; + } + + protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) { + return '__NAMESPACE__'; + } + + protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) { + return '__TRAIT__'; + } + + // Scalars + + protected function pScalar_String(Scalar\String_ $node) { + $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED); + switch ($kind) { + case Scalar\String_::KIND_NOWDOC: + $label = $node->getAttribute('docLabel'); + if ($label && !$this->containsEndLabel($node->value, $label)) { + if ($node->value === '') { + return "<<<'$label'\n$label" . $this->docStringEndToken; + } + + return "<<<'$label'\n$node->value\n$label" + . $this->docStringEndToken; + } + /* break missing intentionally */ + case Scalar\String_::KIND_SINGLE_QUOTED: + return $this->pSingleQuotedString($node->value); + case Scalar\String_::KIND_HEREDOC: + $label = $node->getAttribute('docLabel'); + if ($label && !$this->containsEndLabel($node->value, $label)) { + if ($node->value === '') { + return "<<<$label\n$label" . $this->docStringEndToken; + } + + $escaped = $this->escapeString($node->value, null); + return "<<<$label\n" . $escaped . "\n$label" + . $this->docStringEndToken; + } + /* break missing intentionally */ + case Scalar\String_::KIND_DOUBLE_QUOTED: + return '"' . $this->escapeString($node->value, '"') . '"'; + } + throw new \Exception('Invalid string kind'); + } + + protected function pScalar_Encapsed(Scalar\Encapsed $node) { + if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) { + $label = $node->getAttribute('docLabel'); + if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) { + if (count($node->parts) === 1 + && $node->parts[0] instanceof Scalar\EncapsedStringPart + && $node->parts[0]->value === '' + ) { + return "<<<$label\n$label" . $this->docStringEndToken; + } + + return "<<<$label\n" . $this->pEncapsList($node->parts, null) . "\n$label" + . $this->docStringEndToken; + } + } + return '"' . $this->pEncapsList($node->parts, '"') . '"'; + } + + protected function pScalar_LNumber(Scalar\LNumber $node) { + if ($node->value === -\PHP_INT_MAX-1) { + // PHP_INT_MIN cannot be represented as a literal, + // because the sign is not part of the literal + return '(-' . \PHP_INT_MAX . '-1)'; + } + + $kind = $node->getAttribute('kind', Scalar\LNumber::KIND_DEC); + if (Scalar\LNumber::KIND_DEC === $kind) { + return (string) $node->value; + } + + if ($node->value < 0) { + $sign = '-'; + $str = (string) -$node->value; + } else { + $sign = ''; + $str = (string) $node->value; + } + switch ($kind) { + case Scalar\LNumber::KIND_BIN: + return $sign . '0b' . base_convert($str, 10, 2); + case Scalar\LNumber::KIND_OCT: + return $sign . '0' . base_convert($str, 10, 8); + case Scalar\LNumber::KIND_HEX: + return $sign . '0x' . base_convert($str, 10, 16); + } + throw new \Exception('Invalid number kind'); + } + + protected function pScalar_DNumber(Scalar\DNumber $node) { + if (!is_finite($node->value)) { + if ($node->value === \INF) { + return '\INF'; + } elseif ($node->value === -\INF) { + return '-\INF'; + } else { + return '\NAN'; + } + } + + // Try to find a short full-precision representation + $stringValue = sprintf('%.16G', $node->value); + if ($node->value !== (double) $stringValue) { + $stringValue = sprintf('%.17G', $node->value); + } + + // %G is locale dependent and there exists no locale-independent alternative. We don't want + // mess with switching locales here, so let's assume that a comma is the only non-standard + // decimal separator we may encounter... + $stringValue = str_replace(',', '.', $stringValue); + + // ensure that number is really printed as float + return preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue; + } + + protected function pScalar_EncapsedStringPart(Scalar\EncapsedStringPart $node) { + throw new \LogicException('Cannot directly print EncapsedStringPart'); + } + + // Assignments + + protected function pExpr_Assign(Expr\Assign $node) { + return $this->pInfixOp(Expr\Assign::class, $node->var, ' = ', $node->expr); + } + + protected function pExpr_AssignRef(Expr\AssignRef $node) { + return $this->pInfixOp(Expr\AssignRef::class, $node->var, ' =& ', $node->expr); + } + + protected function pExpr_AssignOp_Plus(AssignOp\Plus $node) { + return $this->pInfixOp(AssignOp\Plus::class, $node->var, ' += ', $node->expr); + } + + protected function pExpr_AssignOp_Minus(AssignOp\Minus $node) { + return $this->pInfixOp(AssignOp\Minus::class, $node->var, ' -= ', $node->expr); + } + + protected function pExpr_AssignOp_Mul(AssignOp\Mul $node) { + return $this->pInfixOp(AssignOp\Mul::class, $node->var, ' *= ', $node->expr); + } + + protected function pExpr_AssignOp_Div(AssignOp\Div $node) { + return $this->pInfixOp(AssignOp\Div::class, $node->var, ' /= ', $node->expr); + } + + protected function pExpr_AssignOp_Concat(AssignOp\Concat $node) { + return $this->pInfixOp(AssignOp\Concat::class, $node->var, ' .= ', $node->expr); + } + + protected function pExpr_AssignOp_Mod(AssignOp\Mod $node) { + return $this->pInfixOp(AssignOp\Mod::class, $node->var, ' %= ', $node->expr); + } + + protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) { + return $this->pInfixOp(AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr); + } + + protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) { + return $this->pInfixOp(AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr); + } + + protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) { + return $this->pInfixOp(AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr); + } + + protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) { + return $this->pInfixOp(AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr); + } + + protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) { + return $this->pInfixOp(AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr); + } + + protected function pExpr_AssignOp_Pow(AssignOp\Pow $node) { + return $this->pInfixOp(AssignOp\Pow::class, $node->var, ' **= ', $node->expr); + } + + protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node) { + return $this->pInfixOp(AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr); + } + + // Binary expressions + + protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) { + return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right); + } + + protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) { + return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right); + } + + protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) { + return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right); + } + + protected function pExpr_BinaryOp_Div(BinaryOp\Div $node) { + return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right); + } + + protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) { + return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right); + } + + protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) { + return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right); + } + + protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) { + return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right); + } + + protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) { + return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right); + } + + protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) { + return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right); + } + + protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) { + return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right); + } + + protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) { + return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right); + } + + protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) { + return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right); + } + + protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) { + return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right); + } + + protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) { + return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right); + } + + protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) { + return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right); + } + + protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) { + return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right); + } + + protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) { + return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right); + } + + protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) { + return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right); + } + + protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) { + return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right); + } + + protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) { + return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right); + } + + protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) { + return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right); + } + + protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) { + return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right); + } + + protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) { + return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right); + } + + protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) { + return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right); + } + + protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) { + return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right); + } + + protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) { + return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right); + } + + protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) { + return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right); + } + + protected function pExpr_Instanceof(Expr\Instanceof_ $node) { + list($precedence, $associativity) = $this->precedenceMap[Expr\Instanceof_::class]; + return $this->pPrec($node->expr, $precedence, $associativity, -1) + . ' instanceof ' + . $this->pNewVariable($node->class); + } + + // Unary expressions + + protected function pExpr_BooleanNot(Expr\BooleanNot $node) { + return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr); + } + + protected function pExpr_BitwiseNot(Expr\BitwiseNot $node) { + return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr); + } + + protected function pExpr_UnaryMinus(Expr\UnaryMinus $node) { + if ($node->expr instanceof Expr\UnaryMinus || $node->expr instanceof Expr\PreDec) { + // Enforce -(-$expr) instead of --$expr + return '-(' . $this->p($node->expr) . ')'; + } + return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr); + } + + protected function pExpr_UnaryPlus(Expr\UnaryPlus $node) { + if ($node->expr instanceof Expr\UnaryPlus || $node->expr instanceof Expr\PreInc) { + // Enforce +(+$expr) instead of ++$expr + return '+(' . $this->p($node->expr) . ')'; + } + return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr); + } + + protected function pExpr_PreInc(Expr\PreInc $node) { + return $this->pPrefixOp(Expr\PreInc::class, '++', $node->var); + } + + protected function pExpr_PreDec(Expr\PreDec $node) { + return $this->pPrefixOp(Expr\PreDec::class, '--', $node->var); + } + + protected function pExpr_PostInc(Expr\PostInc $node) { + return $this->pPostfixOp(Expr\PostInc::class, $node->var, '++'); + } + + protected function pExpr_PostDec(Expr\PostDec $node) { + return $this->pPostfixOp(Expr\PostDec::class, $node->var, '--'); + } + + protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) { + return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr); + } + + protected function pExpr_YieldFrom(Expr\YieldFrom $node) { + return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr); + } + + protected function pExpr_Print(Expr\Print_ $node) { + return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr); + } + + // Casts + + protected function pExpr_Cast_Int(Cast\Int_ $node) { + return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr); + } + + protected function pExpr_Cast_Double(Cast\Double $node) { + $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE); + if ($kind === Cast\Double::KIND_DOUBLE) { + $cast = '(double)'; + } elseif ($kind === Cast\Double::KIND_FLOAT) { + $cast = '(float)'; + } elseif ($kind === Cast\Double::KIND_REAL) { + $cast = '(real)'; + } + return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr); + } + + protected function pExpr_Cast_String(Cast\String_ $node) { + return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr); + } + + protected function pExpr_Cast_Array(Cast\Array_ $node) { + return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr); + } + + protected function pExpr_Cast_Object(Cast\Object_ $node) { + return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr); + } + + protected function pExpr_Cast_Bool(Cast\Bool_ $node) { + return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr); + } + + protected function pExpr_Cast_Unset(Cast\Unset_ $node) { + return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr); + } + + // Function calls and similar constructs + + protected function pExpr_FuncCall(Expr\FuncCall $node) { + return $this->pCallLhs($node->name) + . '(' . $this->pMaybeMultiline($node->args) . ')'; + } + + protected function pExpr_MethodCall(Expr\MethodCall $node) { + return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) + . '(' . $this->pMaybeMultiline($node->args) . ')'; + } + + protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) { + return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name) + . '(' . $this->pMaybeMultiline($node->args) . ')'; + } + + protected function pExpr_StaticCall(Expr\StaticCall $node) { + return $this->pDereferenceLhs($node->class) . '::' + . ($node->name instanceof Expr + ? ($node->name instanceof Expr\Variable + ? $this->p($node->name) + : '{' . $this->p($node->name) . '}') + : $node->name) + . '(' . $this->pMaybeMultiline($node->args) . ')'; + } + + protected function pExpr_Empty(Expr\Empty_ $node) { + return 'empty(' . $this->p($node->expr) . ')'; + } + + protected function pExpr_Isset(Expr\Isset_ $node) { + return 'isset(' . $this->pCommaSeparated($node->vars) . ')'; + } + + protected function pExpr_Eval(Expr\Eval_ $node) { + return 'eval(' . $this->p($node->expr) . ')'; + } + + protected function pExpr_Include(Expr\Include_ $node) { + static $map = [ + Expr\Include_::TYPE_INCLUDE => 'include', + Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', + Expr\Include_::TYPE_REQUIRE => 'require', + Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once', + ]; + + return $map[$node->type] . ' ' . $this->p($node->expr); + } + + protected function pExpr_List(Expr\List_ $node) { + return 'list(' . $this->pCommaSeparated($node->items) . ')'; + } + + // Other + + protected function pExpr_Error(Expr\Error $node) { + throw new \LogicException('Cannot pretty-print AST with Error nodes'); + } + + protected function pExpr_Variable(Expr\Variable $node) { + if ($node->name instanceof Expr) { + return '${' . $this->p($node->name) . '}'; + } else { + return '$' . $node->name; + } + } + + protected function pExpr_Array(Expr\Array_ $node) { + $syntax = $node->getAttribute('kind', + $this->options['shortArraySyntax'] ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); + if ($syntax === Expr\Array_::KIND_SHORT) { + return '[' . $this->pMaybeMultiline($node->items, true) . ']'; + } else { + return 'array(' . $this->pMaybeMultiline($node->items, true) . ')'; + } + } + + protected function pExpr_ArrayItem(Expr\ArrayItem $node) { + return (null !== $node->key ? $this->p($node->key) . ' => ' : '') + . ($node->byRef ? '&' : '') + . ($node->unpack ? '...' : '') + . $this->p($node->value); + } + + protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) { + return $this->pDereferenceLhs($node->var) + . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']'; + } + + protected function pExpr_ConstFetch(Expr\ConstFetch $node) { + return $this->p($node->name); + } + + protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) { + return $this->pDereferenceLhs($node->class) . '::' . $this->p($node->name); + } + + protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) { + return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name); + } + + protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) { + return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name); + } + + protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) { + return $this->pDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); + } + + protected function pExpr_ShellExec(Expr\ShellExec $node) { + return '`' . $this->pEncapsList($node->parts, '`') . '`'; + } + + protected function pExpr_Closure(Expr\Closure $node) { + return $this->pAttrGroups($node->attrGroups, true) + . ($node->static ? 'static ' : '') + . 'function ' . ($node->byRef ? '&' : '') + . '(' . $this->pCommaSeparated($node->params) . ')' + . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '') + . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') + . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pExpr_Match(Expr\Match_ $node) { + return 'match (' . $this->p($node->cond) . ') {' + . $this->pCommaSeparatedMultiline($node->arms, true) + . $this->nl + . '}'; + } + + protected function pMatchArm(Node\MatchArm $node) { + return ($node->conds ? $this->pCommaSeparated($node->conds) : 'default') + . ' => ' . $this->p($node->body); + } + + protected function pExpr_ArrowFunction(Expr\ArrowFunction $node) { + return $this->pAttrGroups($node->attrGroups, true) + . ($node->static ? 'static ' : '') + . 'fn' . ($node->byRef ? '&' : '') + . '(' . $this->pCommaSeparated($node->params) . ')' + . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') + . ' => ' + . $this->p($node->expr); + } + + protected function pExpr_ClosureUse(Expr\ClosureUse $node) { + return ($node->byRef ? '&' : '') . $this->p($node->var); + } + + protected function pExpr_New(Expr\New_ $node) { + if ($node->class instanceof Stmt\Class_) { + $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : ''; + return 'new ' . $this->pClassCommon($node->class, $args); + } + return 'new ' . $this->pNewVariable($node->class) + . '(' . $this->pMaybeMultiline($node->args) . ')'; + } + + protected function pExpr_Clone(Expr\Clone_ $node) { + return 'clone ' . $this->p($node->expr); + } + + protected function pExpr_Ternary(Expr\Ternary $node) { + // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator. + // this is okay because the part between ? and : never needs parentheses. + return $this->pInfixOp(Expr\Ternary::class, + $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else + ); + } + + protected function pExpr_Exit(Expr\Exit_ $node) { + $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE); + return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die') + . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : ''); + } + + protected function pExpr_Throw(Expr\Throw_ $node) { + return 'throw ' . $this->p($node->expr); + } + + protected function pExpr_Yield(Expr\Yield_ $node) { + if ($node->value === null) { + return 'yield'; + } else { + // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary + return '(yield ' + . ($node->key !== null ? $this->p($node->key) . ' => ' : '') + . $this->p($node->value) + . ')'; + } + } + + // Declarations + + protected function pStmt_Namespace(Stmt\Namespace_ $node) { + if ($this->canUseSemicolonNamespaces) { + return 'namespace ' . $this->p($node->name) . ';' + . $this->nl . $this->pStmts($node->stmts, false); + } else { + return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '') + . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + } + + protected function pStmt_Use(Stmt\Use_ $node) { + return 'use ' . $this->pUseType($node->type) + . $this->pCommaSeparated($node->uses) . ';'; + } + + protected function pStmt_GroupUse(Stmt\GroupUse $node) { + return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) + . '\{' . $this->pCommaSeparated($node->uses) . '};'; + } + + protected function pStmt_UseUse(Stmt\UseUse $node) { + return $this->pUseType($node->type) . $this->p($node->name) + . (null !== $node->alias ? ' as ' . $node->alias : ''); + } + + protected function pUseType($type) { + return $type === Stmt\Use_::TYPE_FUNCTION ? 'function ' + : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : ''); + } + + protected function pStmt_Interface(Stmt\Interface_ $node) { + return $this->pAttrGroups($node->attrGroups) + . 'interface ' . $node->name + . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') + . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_Enum(Stmt\Enum_ $node) { + return $this->pAttrGroups($node->attrGroups) + . 'enum ' . $node->name + . ($node->scalarType ? " : $node->scalarType" : '') + . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') + . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_Class(Stmt\Class_ $node) { + return $this->pClassCommon($node, ' ' . $node->name); + } + + protected function pStmt_Trait(Stmt\Trait_ $node) { + return $this->pAttrGroups($node->attrGroups) + . 'trait ' . $node->name + . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_EnumCase(Stmt\EnumCase $node) { + return $this->pAttrGroups($node->attrGroups) + . 'case ' . $node->name + . ($node->expr ? ' = ' . $this->p($node->expr) : '') + . ';'; + } + + protected function pStmt_TraitUse(Stmt\TraitUse $node) { + return 'use ' . $this->pCommaSeparated($node->traits) + . (empty($node->adaptations) + ? ';' + : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}'); + } + + protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) { + return $this->p($node->trait) . '::' . $node->method + . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';'; + } + + protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) { + return (null !== $node->trait ? $this->p($node->trait) . '::' : '') + . $node->method . ' as' + . (null !== $node->newModifier ? ' ' . rtrim($this->pModifiers($node->newModifier), ' ') : '') + . (null !== $node->newName ? ' ' . $node->newName : '') + . ';'; + } + + protected function pStmt_Property(Stmt\Property $node) { + return $this->pAttrGroups($node->attrGroups) + . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) + . ($node->type ? $this->p($node->type) . ' ' : '') + . $this->pCommaSeparated($node->props) . ';'; + } + + protected function pStmt_PropertyProperty(Stmt\PropertyProperty $node) { + return '$' . $node->name + . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); + } + + protected function pStmt_ClassMethod(Stmt\ClassMethod $node) { + return $this->pAttrGroups($node->attrGroups) + . $this->pModifiers($node->flags) + . 'function ' . ($node->byRef ? '&' : '') . $node->name + . '(' . $this->pMaybeMultiline($node->params) . ')' + . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') + . (null !== $node->stmts + ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' + : ';'); + } + + protected function pStmt_ClassConst(Stmt\ClassConst $node) { + return $this->pAttrGroups($node->attrGroups) + . $this->pModifiers($node->flags) + . 'const ' . $this->pCommaSeparated($node->consts) . ';'; + } + + protected function pStmt_Function(Stmt\Function_ $node) { + return $this->pAttrGroups($node->attrGroups) + . 'function ' . ($node->byRef ? '&' : '') . $node->name + . '(' . $this->pCommaSeparated($node->params) . ')' + . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') + . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_Const(Stmt\Const_ $node) { + return 'const ' . $this->pCommaSeparated($node->consts) . ';'; + } + + protected function pStmt_Declare(Stmt\Declare_ $node) { + return 'declare (' . $this->pCommaSeparated($node->declares) . ')' + . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); + } + + protected function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) { + return $node->key . '=' . $this->p($node->value); + } + + // Control flow + + protected function pStmt_If(Stmt\If_ $node) { + return 'if (' . $this->p($node->cond) . ') {' + . $this->pStmts($node->stmts) . $this->nl . '}' + . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') + . (null !== $node->else ? ' ' . $this->p($node->else) : ''); + } + + protected function pStmt_ElseIf(Stmt\ElseIf_ $node) { + return 'elseif (' . $this->p($node->cond) . ') {' + . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_Else(Stmt\Else_ $node) { + return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_For(Stmt\For_ $node) { + return 'for (' + . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') + . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') + . $this->pCommaSeparated($node->loop) + . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_Foreach(Stmt\Foreach_ $node) { + return 'foreach (' . $this->p($node->expr) . ' as ' + . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') + . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' + . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_While(Stmt\While_ $node) { + return 'while (' . $this->p($node->cond) . ') {' + . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_Do(Stmt\Do_ $node) { + return 'do {' . $this->pStmts($node->stmts) . $this->nl + . '} while (' . $this->p($node->cond) . ');'; + } + + protected function pStmt_Switch(Stmt\Switch_ $node) { + return 'switch (' . $this->p($node->cond) . ') {' + . $this->pStmts($node->cases) . $this->nl . '}'; + } + + protected function pStmt_Case(Stmt\Case_ $node) { + return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' + . $this->pStmts($node->stmts); + } + + protected function pStmt_TryCatch(Stmt\TryCatch $node) { + return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' + . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') + . ($node->finally !== null ? ' ' . $this->p($node->finally) : ''); + } + + protected function pStmt_Catch(Stmt\Catch_ $node) { + return 'catch (' . $this->pImplode($node->types, '|') + . ($node->var !== null ? ' ' . $this->p($node->var) : '') + . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_Finally(Stmt\Finally_ $node) { + return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pStmt_Break(Stmt\Break_ $node) { + return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; + } + + protected function pStmt_Continue(Stmt\Continue_ $node) { + return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; + } + + protected function pStmt_Return(Stmt\Return_ $node) { + return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';'; + } + + protected function pStmt_Throw(Stmt\Throw_ $node) { + return 'throw ' . $this->p($node->expr) . ';'; + } + + protected function pStmt_Label(Stmt\Label $node) { + return $node->name . ':'; + } + + protected function pStmt_Goto(Stmt\Goto_ $node) { + return 'goto ' . $node->name . ';'; + } + + // Other + + protected function pStmt_Expression(Stmt\Expression $node) { + return $this->p($node->expr) . ';'; + } + + protected function pStmt_Echo(Stmt\Echo_ $node) { + return 'echo ' . $this->pCommaSeparated($node->exprs) . ';'; + } + + protected function pStmt_Static(Stmt\Static_ $node) { + return 'static ' . $this->pCommaSeparated($node->vars) . ';'; + } + + protected function pStmt_Global(Stmt\Global_ $node) { + return 'global ' . $this->pCommaSeparated($node->vars) . ';'; + } + + protected function pStmt_StaticVar(Stmt\StaticVar $node) { + return $this->p($node->var) + . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); + } + + protected function pStmt_Unset(Stmt\Unset_ $node) { + return 'unset(' . $this->pCommaSeparated($node->vars) . ');'; + } + + protected function pStmt_InlineHTML(Stmt\InlineHTML $node) { + $newline = $node->getAttribute('hasLeadingNewline', true) ? "\n" : ''; + return '?>' . $newline . $node->value . 'remaining; + } + + protected function pStmt_Nop(Stmt\Nop $node) { + return ''; + } + + // Helpers + + protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) { + return $this->pAttrGroups($node->attrGroups, $node->name === null) + . $this->pModifiers($node->flags) + . 'class' . $afterClassToken + . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '') + . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') + . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + + protected function pObjectProperty($node) { + if ($node instanceof Expr) { + return '{' . $this->p($node) . '}'; + } else { + return $node; + } + } + + protected function pEncapsList(array $encapsList, $quote) { + $return = ''; + foreach ($encapsList as $element) { + if ($element instanceof Scalar\EncapsedStringPart) { + $return .= $this->escapeString($element->value, $quote); + } else { + $return .= '{' . $this->p($element) . '}'; + } + } + + return $return; + } + + protected function pSingleQuotedString(string $string) { + return '\'' . addcslashes($string, '\'\\') . '\''; + } + + protected function escapeString($string, $quote) { + if (null === $quote) { + // For doc strings, don't escape newlines + $escaped = addcslashes($string, "\t\f\v$\\"); + } else { + $escaped = addcslashes($string, "\n\r\t\f\v$" . $quote . "\\"); + } + + // Escape control characters and non-UTF-8 characters. + // Regex based on https://stackoverflow.com/a/11709412/385378. + $regex = '/( + [\x00-\x08\x0E-\x1F] # Control characters + | [\xC0-\xC1] # Invalid UTF-8 Bytes + | [\xF5-\xFF] # Invalid UTF-8 Bytes + | \xE0(?=[\x80-\x9F]) # Overlong encoding of prior code point + | \xF0(?=[\x80-\x8F]) # Overlong encoding of prior code point + | [\xC2-\xDF](?![\x80-\xBF]) # Invalid UTF-8 Sequence Start + | [\xE0-\xEF](?![\x80-\xBF]{2}) # Invalid UTF-8 Sequence Start + | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start + | (?<=[\x00-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle + | (? $part) { + $atStart = $i === 0; + $atEnd = $i === count($parts) - 1; + if ($part instanceof Scalar\EncapsedStringPart + && $this->containsEndLabel($part->value, $label, $atStart, $atEnd) + ) { + return true; + } + } + return false; + } + + protected function pDereferenceLhs(Node $node) { + if (!$this->dereferenceLhsRequiresParens($node)) { + return $this->p($node); + } else { + return '(' . $this->p($node) . ')'; + } + } + + protected function pCallLhs(Node $node) { + if (!$this->callLhsRequiresParens($node)) { + return $this->p($node); + } else { + return '(' . $this->p($node) . ')'; + } + } + + protected function pNewVariable(Node $node) { + // TODO: This is not fully accurate. + return $this->pDereferenceLhs($node); + } + + /** + * @param Node[] $nodes + * @return bool + */ + protected function hasNodeWithComments(array $nodes) { + foreach ($nodes as $node) { + if ($node && $node->getComments()) { + return true; + } + } + return false; + } + + protected function pMaybeMultiline(array $nodes, bool $trailingComma = false) { + if (!$this->hasNodeWithComments($nodes)) { + return $this->pCommaSeparated($nodes); + } else { + return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl; + } + } + + protected function pAttrGroups(array $nodes, bool $inline = false): string { + $result = ''; + $sep = $inline ? ' ' : $this->nl; + foreach ($nodes as $node) { + $result .= $this->p($node) . $sep; + } + + return $result; + } +} diff --git a/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php new file mode 100644 index 00000000..2c7fc307 --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php @@ -0,0 +1,1506 @@ + [ 0, 1], + Expr\BitwiseNot::class => [ 10, 1], + Expr\PreInc::class => [ 10, 1], + Expr\PreDec::class => [ 10, 1], + Expr\PostInc::class => [ 10, -1], + Expr\PostDec::class => [ 10, -1], + Expr\UnaryPlus::class => [ 10, 1], + Expr\UnaryMinus::class => [ 10, 1], + Cast\Int_::class => [ 10, 1], + Cast\Double::class => [ 10, 1], + Cast\String_::class => [ 10, 1], + Cast\Array_::class => [ 10, 1], + Cast\Object_::class => [ 10, 1], + Cast\Bool_::class => [ 10, 1], + Cast\Unset_::class => [ 10, 1], + Expr\ErrorSuppress::class => [ 10, 1], + Expr\Instanceof_::class => [ 20, 0], + Expr\BooleanNot::class => [ 30, 1], + BinaryOp\Mul::class => [ 40, -1], + BinaryOp\Div::class => [ 40, -1], + BinaryOp\Mod::class => [ 40, -1], + BinaryOp\Plus::class => [ 50, -1], + BinaryOp\Minus::class => [ 50, -1], + BinaryOp\Concat::class => [ 50, -1], + BinaryOp\ShiftLeft::class => [ 60, -1], + BinaryOp\ShiftRight::class => [ 60, -1], + BinaryOp\Smaller::class => [ 70, 0], + BinaryOp\SmallerOrEqual::class => [ 70, 0], + BinaryOp\Greater::class => [ 70, 0], + BinaryOp\GreaterOrEqual::class => [ 70, 0], + BinaryOp\Equal::class => [ 80, 0], + BinaryOp\NotEqual::class => [ 80, 0], + BinaryOp\Identical::class => [ 80, 0], + BinaryOp\NotIdentical::class => [ 80, 0], + BinaryOp\Spaceship::class => [ 80, 0], + BinaryOp\BitwiseAnd::class => [ 90, -1], + BinaryOp\BitwiseXor::class => [100, -1], + BinaryOp\BitwiseOr::class => [110, -1], + BinaryOp\BooleanAnd::class => [120, -1], + BinaryOp\BooleanOr::class => [130, -1], + BinaryOp\Coalesce::class => [140, 1], + Expr\Ternary::class => [150, 0], + // parser uses %left for assignments, but they really behave as %right + Expr\Assign::class => [160, 1], + Expr\AssignRef::class => [160, 1], + AssignOp\Plus::class => [160, 1], + AssignOp\Minus::class => [160, 1], + AssignOp\Mul::class => [160, 1], + AssignOp\Div::class => [160, 1], + AssignOp\Concat::class => [160, 1], + AssignOp\Mod::class => [160, 1], + AssignOp\BitwiseAnd::class => [160, 1], + AssignOp\BitwiseOr::class => [160, 1], + AssignOp\BitwiseXor::class => [160, 1], + AssignOp\ShiftLeft::class => [160, 1], + AssignOp\ShiftRight::class => [160, 1], + AssignOp\Pow::class => [160, 1], + AssignOp\Coalesce::class => [160, 1], + Expr\YieldFrom::class => [165, 1], + Expr\Print_::class => [168, 1], + BinaryOp\LogicalAnd::class => [170, -1], + BinaryOp\LogicalXor::class => [180, -1], + BinaryOp\LogicalOr::class => [190, -1], + Expr\Include_::class => [200, -1], + ]; + + /** @var int Current indentation level. */ + protected $indentLevel; + /** @var string Newline including current indentation. */ + protected $nl; + /** @var string Token placed at end of doc string to ensure it is followed by a newline. */ + protected $docStringEndToken; + /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */ + protected $canUseSemicolonNamespaces; + /** @var array Pretty printer options */ + protected $options; + + /** @var TokenStream Original tokens for use in format-preserving pretty print */ + protected $origTokens; + /** @var Internal\Differ Differ for node lists */ + protected $nodeListDiffer; + /** @var bool[] Map determining whether a certain character is a label character */ + protected $labelCharMap; + /** + * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used + * during format-preserving prints to place additional parens/braces if necessary. + */ + protected $fixupMap; + /** + * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r], + * where $l and $r specify the token type that needs to be stripped when removing + * this node. + */ + protected $removalMap; + /** + * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. + * $find is an optional token after which the insertion occurs. $extraLeft/Right + * are optionally added before/after the main insertions. + */ + protected $insertionMap; + /** + * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted + * between elements of this list subnode. + */ + protected $listInsertionMap; + protected $emptyListInsertionMap; + /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers + * should be reprinted. */ + protected $modifierChangeMap; + + /** + * Creates a pretty printer instance using the given options. + * + * Supported options: + * * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array + * syntax, if the node does not specify a format. + * + * @param array $options Dictionary of formatting options + */ + public function __construct(array $options = []) { + $this->docStringEndToken = '_DOC_STRING_END_' . mt_rand(); + + $defaultOptions = ['shortArraySyntax' => false]; + $this->options = $options + $defaultOptions; + } + + /** + * Reset pretty printing state. + */ + protected function resetState() { + $this->indentLevel = 0; + $this->nl = "\n"; + $this->origTokens = null; + } + + /** + * Set indentation level + * + * @param int $level Level in number of spaces + */ + protected function setIndentLevel(int $level) { + $this->indentLevel = $level; + $this->nl = "\n" . \str_repeat(' ', $level); + } + + /** + * Increase indentation level. + */ + protected function indent() { + $this->indentLevel += 4; + $this->nl .= ' '; + } + + /** + * Decrease indentation level. + */ + protected function outdent() { + assert($this->indentLevel >= 4); + $this->indentLevel -= 4; + $this->nl = "\n" . str_repeat(' ', $this->indentLevel); + } + + /** + * Pretty prints an array of statements. + * + * @param Node[] $stmts Array of statements + * + * @return string Pretty printed statements + */ + public function prettyPrint(array $stmts) : string { + $this->resetState(); + $this->preprocessNodes($stmts); + + return ltrim($this->handleMagicTokens($this->pStmts($stmts, false))); + } + + /** + * Pretty prints an expression. + * + * @param Expr $node Expression node + * + * @return string Pretty printed node + */ + public function prettyPrintExpr(Expr $node) : string { + $this->resetState(); + return $this->handleMagicTokens($this->p($node)); + } + + /** + * Pretty prints a file of statements (includes the opening prettyPrint($stmts); + + if ($stmts[0] instanceof Stmt\InlineHTML) { + $p = preg_replace('/^<\?php\s+\?>\n?/', '', $p); + } + if ($stmts[count($stmts) - 1] instanceof Stmt\InlineHTML) { + $p = preg_replace('/<\?php$/', '', rtrim($p)); + } + + return $p; + } + + /** + * Preprocesses the top-level nodes to initialize pretty printer state. + * + * @param Node[] $nodes Array of nodes + */ + protected function preprocessNodes(array $nodes) { + /* We can use semicolon-namespaces unless there is a global namespace declaration */ + $this->canUseSemicolonNamespaces = true; + foreach ($nodes as $node) { + if ($node instanceof Stmt\Namespace_ && null === $node->name) { + $this->canUseSemicolonNamespaces = false; + break; + } + } + } + + /** + * Handles (and removes) no-indent and doc-string-end tokens. + * + * @param string $str + * @return string + */ + protected function handleMagicTokens(string $str) : string { + // Replace doc-string-end tokens with nothing or a newline + $str = str_replace($this->docStringEndToken . ";\n", ";\n", $str); + $str = str_replace($this->docStringEndToken, "\n", $str); + + return $str; + } + + /** + * Pretty prints an array of nodes (statements) and indents them optionally. + * + * @param Node[] $nodes Array of nodes + * @param bool $indent Whether to indent the printed nodes + * + * @return string Pretty printed statements + */ + protected function pStmts(array $nodes, bool $indent = true) : string { + if ($indent) { + $this->indent(); + } + + $result = ''; + foreach ($nodes as $node) { + $comments = $node->getComments(); + if ($comments) { + $result .= $this->nl . $this->pComments($comments); + if ($node instanceof Stmt\Nop) { + continue; + } + } + + $result .= $this->nl . $this->p($node); + } + + if ($indent) { + $this->outdent(); + } + + return $result; + } + + /** + * Pretty-print an infix operation while taking precedence into account. + * + * @param string $class Node class of operator + * @param Node $leftNode Left-hand side node + * @param string $operatorString String representation of the operator + * @param Node $rightNode Right-hand side node + * + * @return string Pretty printed infix operation + */ + protected function pInfixOp(string $class, Node $leftNode, string $operatorString, Node $rightNode) : string { + list($precedence, $associativity) = $this->precedenceMap[$class]; + + return $this->pPrec($leftNode, $precedence, $associativity, -1) + . $operatorString + . $this->pPrec($rightNode, $precedence, $associativity, 1); + } + + /** + * Pretty-print a prefix operation while taking precedence into account. + * + * @param string $class Node class of operator + * @param string $operatorString String representation of the operator + * @param Node $node Node + * + * @return string Pretty printed prefix operation + */ + protected function pPrefixOp(string $class, string $operatorString, Node $node) : string { + list($precedence, $associativity) = $this->precedenceMap[$class]; + return $operatorString . $this->pPrec($node, $precedence, $associativity, 1); + } + + /** + * Pretty-print a postfix operation while taking precedence into account. + * + * @param string $class Node class of operator + * @param string $operatorString String representation of the operator + * @param Node $node Node + * + * @return string Pretty printed postfix operation + */ + protected function pPostfixOp(string $class, Node $node, string $operatorString) : string { + list($precedence, $associativity) = $this->precedenceMap[$class]; + return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString; + } + + /** + * Prints an expression node with the least amount of parentheses necessary to preserve the meaning. + * + * @param Node $node Node to pretty print + * @param int $parentPrecedence Precedence of the parent operator + * @param int $parentAssociativity Associativity of parent operator + * (-1 is left, 0 is nonassoc, 1 is right) + * @param int $childPosition Position of the node relative to the operator + * (-1 is left, 1 is right) + * + * @return string The pretty printed node + */ + protected function pPrec(Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string { + $class = \get_class($node); + if (isset($this->precedenceMap[$class])) { + $childPrecedence = $this->precedenceMap[$class][0]; + if ($childPrecedence > $parentPrecedence + || ($parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition) + ) { + return '(' . $this->p($node) . ')'; + } + } + + return $this->p($node); + } + + /** + * Pretty prints an array of nodes and implodes the printed values. + * + * @param Node[] $nodes Array of Nodes to be printed + * @param string $glue Character to implode with + * + * @return string Imploded pretty printed nodes + */ + protected function pImplode(array $nodes, string $glue = '') : string { + $pNodes = []; + foreach ($nodes as $node) { + if (null === $node) { + $pNodes[] = ''; + } else { + $pNodes[] = $this->p($node); + } + } + + return implode($glue, $pNodes); + } + + /** + * Pretty prints an array of nodes and implodes the printed values with commas. + * + * @param Node[] $nodes Array of Nodes to be printed + * + * @return string Comma separated pretty printed nodes + */ + protected function pCommaSeparated(array $nodes) : string { + return $this->pImplode($nodes, ', '); + } + + /** + * Pretty prints a comma-separated list of nodes in multiline style, including comments. + * + * The result includes a leading newline and one level of indentation (same as pStmts). + * + * @param Node[] $nodes Array of Nodes to be printed + * @param bool $trailingComma Whether to use a trailing comma + * + * @return string Comma separated pretty printed nodes in multiline style + */ + protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma) : string { + $this->indent(); + + $result = ''; + $lastIdx = count($nodes) - 1; + foreach ($nodes as $idx => $node) { + if ($node !== null) { + $comments = $node->getComments(); + if ($comments) { + $result .= $this->nl . $this->pComments($comments); + } + + $result .= $this->nl . $this->p($node); + } else { + $result .= $this->nl; + } + if ($trailingComma || $idx !== $lastIdx) { + $result .= ','; + } + } + + $this->outdent(); + return $result; + } + + /** + * Prints reformatted text of the passed comments. + * + * @param Comment[] $comments List of comments + * + * @return string Reformatted text of comments + */ + protected function pComments(array $comments) : string { + $formattedComments = []; + + foreach ($comments as $comment) { + $formattedComments[] = str_replace("\n", $this->nl, $comment->getReformattedText()); + } + + return implode($this->nl, $formattedComments); + } + + /** + * Perform a format-preserving pretty print of an AST. + * + * The format preservation is best effort. For some changes to the AST the formatting will not + * be preserved (at least not locally). + * + * In order to use this method a number of prerequisites must be satisfied: + * * The startTokenPos and endTokenPos attributes in the lexer must be enabled. + * * The CloningVisitor must be run on the AST prior to modification. + * * The original tokens must be provided, using the getTokens() method on the lexer. + * + * @param Node[] $stmts Modified AST with links to original AST + * @param Node[] $origStmts Original AST with token offset information + * @param array $origTokens Tokens of the original code + * + * @return string + */ + public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens) : string { + $this->initializeNodeListDiffer(); + $this->initializeLabelCharMap(); + $this->initializeFixupMap(); + $this->initializeRemovalMap(); + $this->initializeInsertionMap(); + $this->initializeListInsertionMap(); + $this->initializeEmptyListInsertionMap(); + $this->initializeModifierChangeMap(); + + $this->resetState(); + $this->origTokens = new TokenStream($origTokens); + + $this->preprocessNodes($stmts); + + $pos = 0; + $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null); + if (null !== $result) { + $result .= $this->origTokens->getTokenCode($pos, count($origTokens), 0); + } else { + // Fallback + // TODO Add pStmts($stmts, false); + } + + return ltrim($this->handleMagicTokens($result)); + } + + protected function pFallback(Node $node) { + return $this->{'p' . $node->getType()}($node); + } + + /** + * Pretty prints a node. + * + * This method also handles formatting preservation for nodes. + * + * @param Node $node Node to be pretty printed + * @param bool $parentFormatPreserved Whether parent node has preserved formatting + * + * @return string Pretty printed node + */ + protected function p(Node $node, $parentFormatPreserved = false) : string { + // No orig tokens means this is a normal pretty print without preservation of formatting + if (!$this->origTokens) { + return $this->{'p' . $node->getType()}($node); + } + + /** @var Node $origNode */ + $origNode = $node->getAttribute('origNode'); + if (null === $origNode) { + return $this->pFallback($node); + } + + $class = \get_class($node); + \assert($class === \get_class($origNode)); + + $startPos = $origNode->getStartTokenPos(); + $endPos = $origNode->getEndTokenPos(); + \assert($startPos >= 0 && $endPos >= 0); + + $fallbackNode = $node; + if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) { + // Normalize node structure of anonymous classes + $node = PrintableNewAnonClassNode::fromNewNode($node); + $origNode = PrintableNewAnonClassNode::fromNewNode($origNode); + } + + // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting + // is not preserved, then we need to use the fallback code to make sure the tags are + // printed. + if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) { + return $this->pFallback($fallbackNode); + } + + $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos); + + $type = $node->getType(); + $fixupInfo = $this->fixupMap[$class] ?? null; + + $result = ''; + $pos = $startPos; + foreach ($node->getSubNodeNames() as $subNodeName) { + $subNode = $node->$subNodeName; + $origSubNode = $origNode->$subNodeName; + + if ((!$subNode instanceof Node && $subNode !== null) + || (!$origSubNode instanceof Node && $origSubNode !== null) + ) { + if ($subNode === $origSubNode) { + // Unchanged, can reuse old code + continue; + } + + if (is_array($subNode) && is_array($origSubNode)) { + // Array subnode changed, we might be able to reconstruct it + $listResult = $this->pArray( + $subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName, + $fixupInfo[$subNodeName] ?? null + ); + if (null === $listResult) { + return $this->pFallback($fallbackNode); + } + + $result .= $listResult; + continue; + } + + if (is_int($subNode) && is_int($origSubNode)) { + // Check if this is a modifier change + $key = $type . '->' . $subNodeName; + if (!isset($this->modifierChangeMap[$key])) { + return $this->pFallback($fallbackNode); + } + + $findToken = $this->modifierChangeMap[$key]; + $result .= $this->pModifiers($subNode); + $pos = $this->origTokens->findRight($pos, $findToken); + continue; + } + + // If a non-node, non-array subnode changed, we don't be able to do a partial + // reconstructions, as we don't have enough offset information. Pretty print the + // whole node instead. + return $this->pFallback($fallbackNode); + } + + $extraLeft = ''; + $extraRight = ''; + if ($origSubNode !== null) { + $subStartPos = $origSubNode->getStartTokenPos(); + $subEndPos = $origSubNode->getEndTokenPos(); + \assert($subStartPos >= 0 && $subEndPos >= 0); + } else { + if ($subNode === null) { + // Both null, nothing to do + continue; + } + + // A node has been inserted, check if we have insertion information for it + $key = $type . '->' . $subNodeName; + if (!isset($this->insertionMap[$key])) { + return $this->pFallback($fallbackNode); + } + + list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key]; + if (null !== $findToken) { + $subStartPos = $this->origTokens->findRight($pos, $findToken) + + (int) !$beforeToken; + } else { + $subStartPos = $pos; + } + + if (null === $extraLeft && null !== $extraRight) { + // If inserting on the right only, skipping whitespace looks better + $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos); + } + $subEndPos = $subStartPos - 1; + } + + if (null === $subNode) { + // A node has been removed, check if we have removal information for it + $key = $type . '->' . $subNodeName; + if (!isset($this->removalMap[$key])) { + return $this->pFallback($fallbackNode); + } + + // Adjust positions to account for additional tokens that must be skipped + $removalInfo = $this->removalMap[$key]; + if (isset($removalInfo['left'])) { + $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1; + } + if (isset($removalInfo['right'])) { + $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1; + } + } + + $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment); + + if (null !== $subNode) { + $result .= $extraLeft; + + $origIndentLevel = $this->indentLevel; + $this->setIndentLevel($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment); + + // If it's the same node that was previously in this position, it certainly doesn't + // need fixup. It's important to check this here, because our fixup checks are more + // conservative than strictly necessary. + if (isset($fixupInfo[$subNodeName]) + && $subNode->getAttribute('origNode') !== $origSubNode + ) { + $fixup = $fixupInfo[$subNodeName]; + $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos); + } else { + $res = $this->p($subNode, true); + } + + $this->safeAppend($result, $res); + $this->setIndentLevel($origIndentLevel); + + $result .= $extraRight; + } + + $pos = $subEndPos + 1; + } + + $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment); + return $result; + } + + /** + * Perform a format-preserving pretty print of an array. + * + * @param array $nodes New nodes + * @param array $origNodes Original nodes + * @param int $pos Current token position (updated by reference) + * @param int $indentAdjustment Adjustment for indentation + * @param string $parentNodeType Type of the containing node. + * @param string $subNodeName Name of array subnode. + * @param null|int $fixup Fixup information for array item nodes + * + * @return null|string Result of pretty print or null if cannot preserve formatting + */ + protected function pArray( + array $nodes, array $origNodes, int &$pos, int $indentAdjustment, + string $parentNodeType, string $subNodeName, $fixup + ) { + $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes); + + $mapKey = $parentNodeType . '->' . $subNodeName; + $insertStr = $this->listInsertionMap[$mapKey] ?? null; + $isStmtList = $subNodeName === 'stmts'; + + $beforeFirstKeepOrReplace = true; + $skipRemovedNode = false; + $delayedAdd = []; + $lastElemIndentLevel = $this->indentLevel; + + $insertNewline = false; + if ($insertStr === "\n") { + $insertStr = ''; + $insertNewline = true; + } + + if ($isStmtList && \count($origNodes) === 1 && \count($nodes) !== 1) { + $startPos = $origNodes[0]->getStartTokenPos(); + $endPos = $origNodes[0]->getEndTokenPos(); + \assert($startPos >= 0 && $endPos >= 0); + if (!$this->origTokens->haveBraces($startPos, $endPos)) { + // This was a single statement without braces, but either additional statements + // have been added, or the single statement has been removed. This requires the + // addition of braces. For now fall back. + // TODO: Try to preserve formatting + return null; + } + } + + $result = ''; + foreach ($diff as $i => $diffElem) { + $diffType = $diffElem->type; + /** @var Node|null $arrItem */ + $arrItem = $diffElem->new; + /** @var Node|null $origArrItem */ + $origArrItem = $diffElem->old; + + if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { + $beforeFirstKeepOrReplace = false; + + if ($origArrItem === null || $arrItem === null) { + // We can only handle the case where both are null + if ($origArrItem === $arrItem) { + continue; + } + return null; + } + + if (!$arrItem instanceof Node || !$origArrItem instanceof Node) { + // We can only deal with nodes. This can occur for Names, which use string arrays. + return null; + } + + $itemStartPos = $origArrItem->getStartTokenPos(); + $itemEndPos = $origArrItem->getEndTokenPos(); + \assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos); + + $origIndentLevel = $this->indentLevel; + $lastElemIndentLevel = $this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment; + $this->setIndentLevel($lastElemIndentLevel); + + $comments = $arrItem->getComments(); + $origComments = $origArrItem->getComments(); + $commentStartPos = $origComments ? $origComments[0]->getStartTokenPos() : $itemStartPos; + \assert($commentStartPos >= 0); + + if ($commentStartPos < $pos) { + // Comments may be assigned to multiple nodes if they start at the same position. + // Make sure we don't try to print them multiple times. + $commentStartPos = $itemStartPos; + } + + if ($skipRemovedNode) { + if ($isStmtList && $this->origTokens->haveBracesInRange($pos, $itemStartPos)) { + // We'd remove the brace of a code block. + // TODO: Preserve formatting. + $this->setIndentLevel($origIndentLevel); + return null; + } + } else { + $result .= $this->origTokens->getTokenCode( + $pos, $commentStartPos, $indentAdjustment); + } + + if (!empty($delayedAdd)) { + /** @var Node $delayedAddNode */ + foreach ($delayedAdd as $delayedAddNode) { + if ($insertNewline) { + $delayedAddComments = $delayedAddNode->getComments(); + if ($delayedAddComments) { + $result .= $this->pComments($delayedAddComments) . $this->nl; + } + } + + $this->safeAppend($result, $this->p($delayedAddNode, true)); + + if ($insertNewline) { + $result .= $insertStr . $this->nl; + } else { + $result .= $insertStr; + } + } + + $delayedAdd = []; + } + + if ($comments !== $origComments) { + if ($comments) { + $result .= $this->pComments($comments) . $this->nl; + } + } else { + $result .= $this->origTokens->getTokenCode( + $commentStartPos, $itemStartPos, $indentAdjustment); + } + + // If we had to remove anything, we have done so now. + $skipRemovedNode = false; + } elseif ($diffType === DiffElem::TYPE_ADD) { + if (null === $insertStr) { + // We don't have insertion information for this list type + return null; + } + + // We go multiline if the original code was multiline, + // or if it's an array item with a comment above it. + if ($insertStr === ', ' && + ($this->isMultiline($origNodes) || $arrItem->getComments()) + ) { + $insertStr = ','; + $insertNewline = true; + } + + if ($beforeFirstKeepOrReplace) { + // Will be inserted at the next "replace" or "keep" element + $delayedAdd[] = $arrItem; + continue; + } + + $itemStartPos = $pos; + $itemEndPos = $pos - 1; + + $origIndentLevel = $this->indentLevel; + $this->setIndentLevel($lastElemIndentLevel); + + if ($insertNewline) { + $result .= $insertStr . $this->nl; + $comments = $arrItem->getComments(); + if ($comments) { + $result .= $this->pComments($comments) . $this->nl; + } + } else { + $result .= $insertStr; + } + } elseif ($diffType === DiffElem::TYPE_REMOVE) { + if (!$origArrItem instanceof Node) { + // We only support removal for nodes + return null; + } + + $itemStartPos = $origArrItem->getStartTokenPos(); + $itemEndPos = $origArrItem->getEndTokenPos(); + \assert($itemStartPos >= 0 && $itemEndPos >= 0); + + // Consider comments part of the node. + $origComments = $origArrItem->getComments(); + if ($origComments) { + $itemStartPos = $origComments[0]->getStartTokenPos(); + } + + if ($i === 0) { + // If we're removing from the start, keep the tokens before the node and drop those after it, + // instead of the other way around. + $result .= $this->origTokens->getTokenCode( + $pos, $itemStartPos, $indentAdjustment); + $skipRemovedNode = true; + } else { + if ($isStmtList && $this->origTokens->haveBracesInRange($pos, $itemStartPos)) { + // We'd remove the brace of a code block. + // TODO: Preserve formatting. + return null; + } + } + + $pos = $itemEndPos + 1; + continue; + } else { + throw new \Exception("Shouldn't happen"); + } + + if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) { + $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos); + } else { + $res = $this->p($arrItem, true); + } + $this->safeAppend($result, $res); + + $this->setIndentLevel($origIndentLevel); + $pos = $itemEndPos + 1; + } + + if ($skipRemovedNode) { + // TODO: Support removing single node. + return null; + } + + if (!empty($delayedAdd)) { + if (!isset($this->emptyListInsertionMap[$mapKey])) { + return null; + } + + list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey]; + if (null !== $findToken) { + $insertPos = $this->origTokens->findRight($pos, $findToken) + 1; + $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment); + $pos = $insertPos; + } + + $first = true; + $result .= $extraLeft; + foreach ($delayedAdd as $delayedAddNode) { + if (!$first) { + $result .= $insertStr; + } + $result .= $this->p($delayedAddNode, true); + $first = false; + } + $result .= $extraRight; + } + + return $result; + } + + /** + * Print node with fixups. + * + * Fixups here refer to the addition of extra parentheses, braces or other characters, that + * are required to preserve program semantics in a certain context (e.g. to maintain precedence + * or because only certain expressions are allowed in certain places). + * + * @param int $fixup Fixup type + * @param Node $subNode Subnode to print + * @param string|null $parentClass Class of parent node + * @param int $subStartPos Original start pos of subnode + * @param int $subEndPos Original end pos of subnode + * + * @return string Result of fixed-up print of subnode + */ + protected function pFixup(int $fixup, Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string { + switch ($fixup) { + case self::FIXUP_PREC_LEFT: + case self::FIXUP_PREC_RIGHT: + if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { + list($precedence, $associativity) = $this->precedenceMap[$parentClass]; + return $this->pPrec($subNode, $precedence, $associativity, + $fixup === self::FIXUP_PREC_LEFT ? -1 : 1); + } + break; + case self::FIXUP_CALL_LHS: + if ($this->callLhsRequiresParens($subNode) + && !$this->origTokens->haveParens($subStartPos, $subEndPos) + ) { + return '(' . $this->p($subNode) . ')'; + } + break; + case self::FIXUP_DEREF_LHS: + if ($this->dereferenceLhsRequiresParens($subNode) + && !$this->origTokens->haveParens($subStartPos, $subEndPos) + ) { + return '(' . $this->p($subNode) . ')'; + } + break; + case self::FIXUP_BRACED_NAME: + case self::FIXUP_VAR_BRACED_NAME: + if ($subNode instanceof Expr + && !$this->origTokens->haveBraces($subStartPos, $subEndPos) + ) { + return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '') + . '{' . $this->p($subNode) . '}'; + } + break; + case self::FIXUP_ENCAPSED: + if (!$subNode instanceof Scalar\EncapsedStringPart + && !$this->origTokens->haveBraces($subStartPos, $subEndPos) + ) { + return '{' . $this->p($subNode) . '}'; + } + break; + default: + throw new \Exception('Cannot happen'); + } + + // Nothing special to do + return $this->p($subNode); + } + + /** + * Appends to a string, ensuring whitespace between label characters. + * + * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x". + * Without safeAppend the result would be "echox", which does not preserve semantics. + * + * @param string $str + * @param string $append + */ + protected function safeAppend(string &$str, string $append) { + if ($str === "") { + $str = $append; + return; + } + + if ($append === "") { + return; + } + + if (!$this->labelCharMap[$append[0]] + || !$this->labelCharMap[$str[\strlen($str) - 1]]) { + $str .= $append; + } else { + $str .= " " . $append; + } + } + + /** + * Determines whether the LHS of a call must be wrapped in parenthesis. + * + * @param Node $node LHS of a call + * + * @return bool Whether parentheses are required + */ + protected function callLhsRequiresParens(Node $node) : bool { + return !($node instanceof Node\Name + || $node instanceof Expr\Variable + || $node instanceof Expr\ArrayDimFetch + || $node instanceof Expr\FuncCall + || $node instanceof Expr\MethodCall + || $node instanceof Expr\NullsafeMethodCall + || $node instanceof Expr\StaticCall + || $node instanceof Expr\Array_); + } + + /** + * Determines whether the LHS of a dereferencing operation must be wrapped in parenthesis. + * + * @param Node $node LHS of dereferencing operation + * + * @return bool Whether parentheses are required + */ + protected function dereferenceLhsRequiresParens(Node $node) : bool { + return !($node instanceof Expr\Variable + || $node instanceof Node\Name + || $node instanceof Expr\ArrayDimFetch + || $node instanceof Expr\PropertyFetch + || $node instanceof Expr\NullsafePropertyFetch + || $node instanceof Expr\StaticPropertyFetch + || $node instanceof Expr\FuncCall + || $node instanceof Expr\MethodCall + || $node instanceof Expr\NullsafeMethodCall + || $node instanceof Expr\StaticCall + || $node instanceof Expr\Array_ + || $node instanceof Scalar\String_ + || $node instanceof Expr\ConstFetch + || $node instanceof Expr\ClassConstFetch); + } + + /** + * Print modifiers, including trailing whitespace. + * + * @param int $modifiers Modifier mask to print + * + * @return string Printed modifiers + */ + protected function pModifiers(int $modifiers) { + return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC ? 'public ' : '') + . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '') + . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE ? 'private ' : '') + . ($modifiers & Stmt\Class_::MODIFIER_STATIC ? 'static ' : '') + . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT ? 'abstract ' : '') + . ($modifiers & Stmt\Class_::MODIFIER_FINAL ? 'final ' : '') + . ($modifiers & Stmt\Class_::MODIFIER_READONLY ? 'readonly ' : ''); + } + + /** + * Determine whether a list of nodes uses multiline formatting. + * + * @param (Node|null)[] $nodes Node list + * + * @return bool Whether multiline formatting is used + */ + protected function isMultiline(array $nodes) : bool { + if (\count($nodes) < 2) { + return false; + } + + $pos = -1; + foreach ($nodes as $node) { + if (null === $node) { + continue; + } + + $endPos = $node->getEndTokenPos() + 1; + if ($pos >= 0) { + $text = $this->origTokens->getTokenCode($pos, $endPos, 0); + if (false === strpos($text, "\n")) { + // We require that a newline is present between *every* item. If the formatting + // is inconsistent, with only some items having newlines, we don't consider it + // as multiline + return false; + } + } + $pos = $endPos; + } + + return true; + } + + /** + * Lazily initializes label char map. + * + * The label char map determines whether a certain character may occur in a label. + */ + protected function initializeLabelCharMap() { + if ($this->labelCharMap) return; + + $this->labelCharMap = []; + for ($i = 0; $i < 256; $i++) { + // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for + // older versions. + $chr = chr($i); + $this->labelCharMap[$chr] = $i >= 0x7f || ctype_alnum($chr); + } + } + + /** + * Lazily initializes node list differ. + * + * The node list differ is used to determine differences between two array subnodes. + */ + protected function initializeNodeListDiffer() { + if ($this->nodeListDiffer) return; + + $this->nodeListDiffer = new Internal\Differ(function ($a, $b) { + if ($a instanceof Node && $b instanceof Node) { + return $a === $b->getAttribute('origNode'); + } + // Can happen for array destructuring + return $a === null && $b === null; + }); + } + + /** + * Lazily initializes fixup map. + * + * The fixup map is used to determine whether a certain subnode of a certain node may require + * some kind of "fixup" operation, e.g. the addition of parenthesis or braces. + */ + protected function initializeFixupMap() { + if ($this->fixupMap) return; + + $this->fixupMap = [ + Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT], + Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT], + Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT], + Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], + Expr\Instanceof_::class => [ + 'expr' => self::FIXUP_PREC_LEFT, + 'class' => self::FIXUP_PREC_RIGHT, // TODO: FIXUP_NEW_VARIABLE + ], + Expr\Ternary::class => [ + 'cond' => self::FIXUP_PREC_LEFT, + 'else' => self::FIXUP_PREC_RIGHT, + ], + + Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], + Expr\StaticCall::class => ['class' => self::FIXUP_DEREF_LHS], + Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], + Expr\ClassConstFetch::class => ['var' => self::FIXUP_DEREF_LHS], + Expr\New_::class => ['class' => self::FIXUP_DEREF_LHS], // TODO: FIXUP_NEW_VARIABLE + Expr\MethodCall::class => [ + 'var' => self::FIXUP_DEREF_LHS, + 'name' => self::FIXUP_BRACED_NAME, + ], + Expr\NullsafeMethodCall::class => [ + 'var' => self::FIXUP_DEREF_LHS, + 'name' => self::FIXUP_BRACED_NAME, + ], + Expr\StaticPropertyFetch::class => [ + 'class' => self::FIXUP_DEREF_LHS, + 'name' => self::FIXUP_VAR_BRACED_NAME, + ], + Expr\PropertyFetch::class => [ + 'var' => self::FIXUP_DEREF_LHS, + 'name' => self::FIXUP_BRACED_NAME, + ], + Expr\NullsafePropertyFetch::class => [ + 'var' => self::FIXUP_DEREF_LHS, + 'name' => self::FIXUP_BRACED_NAME, + ], + Scalar\Encapsed::class => [ + 'parts' => self::FIXUP_ENCAPSED, + ], + ]; + + $binaryOps = [ + BinaryOp\Pow::class, BinaryOp\Mul::class, BinaryOp\Div::class, BinaryOp\Mod::class, + BinaryOp\Plus::class, BinaryOp\Minus::class, BinaryOp\Concat::class, + BinaryOp\ShiftLeft::class, BinaryOp\ShiftRight::class, BinaryOp\Smaller::class, + BinaryOp\SmallerOrEqual::class, BinaryOp\Greater::class, BinaryOp\GreaterOrEqual::class, + BinaryOp\Equal::class, BinaryOp\NotEqual::class, BinaryOp\Identical::class, + BinaryOp\NotIdentical::class, BinaryOp\Spaceship::class, BinaryOp\BitwiseAnd::class, + BinaryOp\BitwiseXor::class, BinaryOp\BitwiseOr::class, BinaryOp\BooleanAnd::class, + BinaryOp\BooleanOr::class, BinaryOp\Coalesce::class, BinaryOp\LogicalAnd::class, + BinaryOp\LogicalXor::class, BinaryOp\LogicalOr::class, + ]; + foreach ($binaryOps as $binaryOp) { + $this->fixupMap[$binaryOp] = [ + 'left' => self::FIXUP_PREC_LEFT, + 'right' => self::FIXUP_PREC_RIGHT + ]; + } + + $assignOps = [ + Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, + AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, + AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, + AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class + ]; + foreach ($assignOps as $assignOp) { + $this->fixupMap[$assignOp] = [ + 'var' => self::FIXUP_PREC_LEFT, + 'expr' => self::FIXUP_PREC_RIGHT, + ]; + } + + $prefixOps = [ + Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, + Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, + Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, + Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class, + ]; + foreach ($prefixOps as $prefixOp) { + $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT]; + } + } + + /** + * Lazily initializes the removal map. + * + * The removal map is used to determine which additional tokens should be removed when a + * certain node is replaced by null. + */ + protected function initializeRemovalMap() { + if ($this->removalMap) return; + + $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE]; + $stripLeft = ['left' => \T_WHITESPACE]; + $stripRight = ['right' => \T_WHITESPACE]; + $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW]; + $stripColon = ['left' => ':']; + $stripEquals = ['left' => '=']; + $this->removalMap = [ + 'Expr_ArrayDimFetch->dim' => $stripBoth, + 'Expr_ArrayItem->key' => $stripDoubleArrow, + 'Expr_ArrowFunction->returnType' => $stripColon, + 'Expr_Closure->returnType' => $stripColon, + 'Expr_Exit->expr' => $stripBoth, + 'Expr_Ternary->if' => $stripBoth, + 'Expr_Yield->key' => $stripDoubleArrow, + 'Expr_Yield->value' => $stripBoth, + 'Param->type' => $stripRight, + 'Param->default' => $stripEquals, + 'Stmt_Break->num' => $stripBoth, + 'Stmt_Catch->var' => $stripLeft, + 'Stmt_ClassMethod->returnType' => $stripColon, + 'Stmt_Class->extends' => ['left' => \T_EXTENDS], + 'Stmt_Enum->scalarType' => $stripColon, + 'Stmt_EnumCase->expr' => $stripEquals, + 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], + 'Stmt_Continue->num' => $stripBoth, + 'Stmt_Foreach->keyVar' => $stripDoubleArrow, + 'Stmt_Function->returnType' => $stripColon, + 'Stmt_If->else' => $stripLeft, + 'Stmt_Namespace->name' => $stripLeft, + 'Stmt_Property->type' => $stripRight, + 'Stmt_PropertyProperty->default' => $stripEquals, + 'Stmt_Return->expr' => $stripBoth, + 'Stmt_StaticVar->default' => $stripEquals, + 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, + 'Stmt_TryCatch->finally' => $stripLeft, + // 'Stmt_Case->cond': Replace with "default" + // 'Stmt_Class->name': Unclear what to do + // 'Stmt_Declare->stmts': Not a plain node + // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a plain node + ]; + } + + protected function initializeInsertionMap() { + if ($this->insertionMap) return; + + // TODO: "yield" where both key and value are inserted doesn't work + // [$find, $beforeToken, $extraLeft, $extraRight] + $this->insertionMap = [ + 'Expr_ArrayDimFetch->dim' => ['[', false, null, null], + 'Expr_ArrayItem->key' => [null, false, null, ' => '], + 'Expr_ArrowFunction->returnType' => [')', false, ' : ', null], + 'Expr_Closure->returnType' => [')', false, ' : ', null], + 'Expr_Ternary->if' => ['?', false, ' ', ' '], + 'Expr_Yield->key' => [\T_YIELD, false, null, ' => '], + 'Expr_Yield->value' => [\T_YIELD, false, ' ', null], + 'Param->type' => [null, false, null, ' '], + 'Param->default' => [null, false, ' = ', null], + 'Stmt_Break->num' => [\T_BREAK, false, ' ', null], + 'Stmt_Catch->var' => [null, false, ' ', null], + 'Stmt_ClassMethod->returnType' => [')', false, ' : ', null], + 'Stmt_Class->extends' => [null, false, ' extends ', null], + 'Stmt_Enum->scalarType' => [null, false, ' : ', null], + 'Stmt_EnumCase->expr' => [null, false, ' = ', null], + 'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null], + 'Stmt_Continue->num' => [\T_CONTINUE, false, ' ', null], + 'Stmt_Foreach->keyVar' => [\T_AS, false, null, ' => '], + 'Stmt_Function->returnType' => [')', false, ' : ', null], + 'Stmt_If->else' => [null, false, ' ', null], + 'Stmt_Namespace->name' => [\T_NAMESPACE, false, ' ', null], + 'Stmt_Property->type' => [\T_VARIABLE, true, null, ' '], + 'Stmt_PropertyProperty->default' => [null, false, ' = ', null], + 'Stmt_Return->expr' => [\T_RETURN, false, ' ', null], + 'Stmt_StaticVar->default' => [null, false, ' = ', null], + //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO + 'Stmt_TryCatch->finally' => [null, false, ' ', null], + + // 'Expr_Exit->expr': Complicated due to optional () + // 'Stmt_Case->cond': Conversion from default to case + // 'Stmt_Class->name': Unclear + // 'Stmt_Declare->stmts': Not a proper node + // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a proper node + ]; + } + + protected function initializeListInsertionMap() { + if ($this->listInsertionMap) return; + + $this->listInsertionMap = [ + // special + //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully + //'Scalar_Encapsed->parts' => '', + 'Stmt_Catch->types' => '|', + 'UnionType->types' => '|', + 'IntersectionType->types' => '&', + 'Stmt_If->elseifs' => ' ', + 'Stmt_TryCatch->catches' => ' ', + + // comma-separated lists + 'Expr_Array->items' => ', ', + 'Expr_ArrowFunction->params' => ', ', + 'Expr_Closure->params' => ', ', + 'Expr_Closure->uses' => ', ', + 'Expr_FuncCall->args' => ', ', + 'Expr_Isset->vars' => ', ', + 'Expr_List->items' => ', ', + 'Expr_MethodCall->args' => ', ', + 'Expr_NullsafeMethodCall->args' => ', ', + 'Expr_New->args' => ', ', + 'Expr_PrintableNewAnonClass->args' => ', ', + 'Expr_StaticCall->args' => ', ', + 'Stmt_ClassConst->consts' => ', ', + 'Stmt_ClassMethod->params' => ', ', + 'Stmt_Class->implements' => ', ', + 'Stmt_Enum->implements' => ', ', + 'Expr_PrintableNewAnonClass->implements' => ', ', + 'Stmt_Const->consts' => ', ', + 'Stmt_Declare->declares' => ', ', + 'Stmt_Echo->exprs' => ', ', + 'Stmt_For->init' => ', ', + 'Stmt_For->cond' => ', ', + 'Stmt_For->loop' => ', ', + 'Stmt_Function->params' => ', ', + 'Stmt_Global->vars' => ', ', + 'Stmt_GroupUse->uses' => ', ', + 'Stmt_Interface->extends' => ', ', + 'Stmt_Match->arms' => ', ', + 'Stmt_Property->props' => ', ', + 'Stmt_StaticVar->vars' => ', ', + 'Stmt_TraitUse->traits' => ', ', + 'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ', + 'Stmt_Unset->vars' => ', ', + 'Stmt_Use->uses' => ', ', + 'MatchArm->conds' => ', ', + 'AttributeGroup->attrs' => ', ', + + // statement lists + 'Expr_Closure->stmts' => "\n", + 'Stmt_Case->stmts' => "\n", + 'Stmt_Catch->stmts' => "\n", + 'Stmt_Class->stmts' => "\n", + 'Stmt_Enum->stmts' => "\n", + 'Expr_PrintableNewAnonClass->stmts' => "\n", + 'Stmt_Interface->stmts' => "\n", + 'Stmt_Trait->stmts' => "\n", + 'Stmt_ClassMethod->stmts' => "\n", + 'Stmt_Declare->stmts' => "\n", + 'Stmt_Do->stmts' => "\n", + 'Stmt_ElseIf->stmts' => "\n", + 'Stmt_Else->stmts' => "\n", + 'Stmt_Finally->stmts' => "\n", + 'Stmt_Foreach->stmts' => "\n", + 'Stmt_For->stmts' => "\n", + 'Stmt_Function->stmts' => "\n", + 'Stmt_If->stmts' => "\n", + 'Stmt_Namespace->stmts' => "\n", + 'Stmt_Class->attrGroups' => "\n", + 'Stmt_Enum->attrGroups' => "\n", + 'Stmt_EnumCase->attrGroups' => "\n", + 'Stmt_Interface->attrGroups' => "\n", + 'Stmt_Trait->attrGroups' => "\n", + 'Stmt_Function->attrGroups' => "\n", + 'Stmt_ClassMethod->attrGroups' => "\n", + 'Stmt_ClassConst->attrGroups' => "\n", + 'Stmt_Property->attrGroups' => "\n", + 'Expr_PrintableNewAnonClass->attrGroups' => ' ', + 'Expr_Closure->attrGroups' => ' ', + 'Expr_ArrowFunction->attrGroups' => ' ', + 'Param->attrGroups' => ' ', + 'Stmt_Switch->cases' => "\n", + 'Stmt_TraitUse->adaptations' => "\n", + 'Stmt_TryCatch->stmts' => "\n", + 'Stmt_While->stmts' => "\n", + + // dummy for top-level context + 'File->stmts' => "\n", + ]; + } + + protected function initializeEmptyListInsertionMap() { + if ($this->emptyListInsertionMap) return; + + // TODO Insertion into empty statement lists. + + // [$find, $extraLeft, $extraRight] + $this->emptyListInsertionMap = [ + 'Expr_ArrowFunction->params' => ['(', '', ''], + 'Expr_Closure->uses' => [')', ' use(', ')'], + 'Expr_Closure->params' => ['(', '', ''], + 'Expr_FuncCall->args' => ['(', '', ''], + 'Expr_MethodCall->args' => ['(', '', ''], + 'Expr_NullsafeMethodCall->args' => ['(', '', ''], + 'Expr_New->args' => ['(', '', ''], + 'Expr_PrintableNewAnonClass->args' => ['(', '', ''], + 'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''], + 'Expr_StaticCall->args' => ['(', '', ''], + 'Stmt_Class->implements' => [null, ' implements ', ''], + 'Stmt_Enum->implements' => [null, ' implements ', ''], + 'Stmt_ClassMethod->params' => ['(', '', ''], + 'Stmt_Interface->extends' => [null, ' extends ', ''], + 'Stmt_Function->params' => ['(', '', ''], + + /* These cannot be empty to start with: + * Expr_Isset->vars + * Stmt_Catch->types + * Stmt_Const->consts + * Stmt_ClassConst->consts + * Stmt_Declare->declares + * Stmt_Echo->exprs + * Stmt_Global->vars + * Stmt_GroupUse->uses + * Stmt_Property->props + * Stmt_StaticVar->vars + * Stmt_TraitUse->traits + * Stmt_TraitUseAdaptation_Precedence->insteadof + * Stmt_Unset->vars + * Stmt_Use->uses + * UnionType->types + */ + + /* TODO + * Stmt_If->elseifs + * Stmt_TryCatch->catches + * Expr_Array->items + * Expr_List->items + * Stmt_For->init + * Stmt_For->cond + * Stmt_For->loop + */ + ]; + } + + protected function initializeModifierChangeMap() { + if ($this->modifierChangeMap) return; + + $this->modifierChangeMap = [ + 'Stmt_ClassConst->flags' => \T_CONST, + 'Stmt_ClassMethod->flags' => \T_FUNCTION, + 'Stmt_Class->flags' => \T_CLASS, + 'Stmt_Property->flags' => \T_VARIABLE, + 'Param->flags' => \T_VARIABLE, + //'Stmt_TraitUseAdaptation_Alias->newModifier' => 0, // TODO + ]; + + // List of integer subnodes that are not modifiers: + // Expr_Include->type + // Stmt_GroupUse->type + // Stmt_Use->type + // Stmt_UseUse->type + } +} diff --git a/vendor/openlss/lib-array2xml/.gitignore b/vendor/openlss/lib-array2xml/.gitignore new file mode 100644 index 00000000..1ee4bf6f --- /dev/null +++ b/vendor/openlss/lib-array2xml/.gitignore @@ -0,0 +1,3 @@ +.idea +/vendor +/composer.lock diff --git a/vendor/openlss/lib-array2xml/COPYING b/vendor/openlss/lib-array2xml/COPYING new file mode 100644 index 00000000..20d40b6b --- /dev/null +++ b/vendor/openlss/lib-array2xml/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/vendor/openlss/lib-array2xml/COPYING LESSER b/vendor/openlss/lib-array2xml/COPYING LESSER new file mode 100644 index 00000000..02bbb60b --- /dev/null +++ b/vendor/openlss/lib-array2xml/COPYING LESSER @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/vendor/openlss/lib-array2xml/LSS/Array2XML.php b/vendor/openlss/lib-array2xml/LSS/Array2XML.php new file mode 100644 index 00000000..99e0659a --- /dev/null +++ b/vendor/openlss/lib-array2xml/LSS/Array2XML.php @@ -0,0 +1,209 @@ +. + */ +namespace LSS; + +use \DomDocument; +use \Exception; + +/** + * Array2XML: A class to convert array in PHP to XML + * It also takes into account attributes names unlike SimpleXML in PHP + * It returns the XML in form of DOMDocument class for further manipulation. + * It throws exception if the tag name or attribute name has illegal chars. + * + * Author : Lalit Patel + * Website: http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes + * License: Apache License 2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * Version: 0.1 (10 July 2011) + * Version: 0.2 (16 August 2011) + * - replaced htmlentities() with htmlspecialchars() (Thanks to Liel Dulev) + * - fixed a edge case where root node has a false/null/0 value. (Thanks to Liel Dulev) + * Version: 0.3 (22 August 2011) + * - fixed tag sanitize regex which didn't allow tagnames with single character. + * Version: 0.4 (18 September 2011) + * - Added support for CDATA section using @cdata instead of @value. + * Version: 0.5 (07 December 2011) + * - Changed logic to check numeric array indices not starting from 0. + * Version: 0.6 (04 March 2012) + * - Code now doesn't @cdata to be placed in an empty array + * Version: 0.7 (24 March 2012) + * - Reverted to version 0.5 + * Version: 0.8 (02 May 2012) + * - Removed htmlspecialchars() before adding to text node or attributes. + * Version: 0.11 (28 October 2015) + * - Fixed typos; Added support for plain insertion of XML trough @xml. + * + * Usage: + * $xml = Array2XML::createXML('root_node_name', $php_array); + * echo $xml->saveXML(); + */ +class Array2XML { + + /** + * @var DOMDocument + */ + private static $xml = null; + private static $encoding = 'UTF-8'; + + /** + * Initialize the root XML node [optional] + * @param $version + * @param $encoding + * @param $format_output + */ + public static function init($version = '1.0', $encoding = 'UTF-8', $format_output = true) { + self::$xml = new DomDocument($version, $encoding); + self::$xml->formatOutput = $format_output; + self::$encoding = $encoding; + } + + /** + * Convert an Array to XML + * @param string $node_name - name of the root node to be converted + * @param array $arr - aray to be converterd + * @return DomDocument + */ + public static function &createXML($node_name, $arr = array()) { + $xml = self::getXMLRoot(); + $xml->appendChild(self::convert($node_name, $arr)); + + self::$xml = null; // clear the xml node in the class for 2nd time use. + return $xml; + } + + /** + * Convert an Array to XML. + * + * @param string $node_name + * Name of the root node to be converted. + * @param array $arr + * Array to be converted. + * + * @throws \Exception + * + * @return \DOMNode + */ + private static function &convert($node_name, $arr = array()) { + + //print_arr($node_name); + $xml = self::getXMLRoot(); + $node = $xml->createElement($node_name); + + if (is_array($arr)) { + // get the attributes first.; + if (isset($arr['@attributes'])) { + foreach ($arr['@attributes'] as $key => $value) { + if (!self::isValidTagName($key)) { + throw new Exception('[Array2XML] Illegal character in attribute name. attribute: ' . $key . ' in node: ' . $node_name); + } + $node->setAttribute($key, self::bool2str($value)); + } + unset($arr['@attributes']); //remove the key from the array once done. + } + + // check if it has a value stored in @value, if yes store the value and return + // else check if its directly stored as string + if (isset($arr['@value'])) { + $node->appendChild($xml->createTextNode(self::bool2str($arr['@value']))); + unset($arr['@value']); //remove the key from the array once done. + //return from recursion, as a note with value cannot have child nodes. + return $node; + } else if (isset($arr['@cdata'])) { + $node->appendChild($xml->createCDATASection(self::bool2str($arr['@cdata']))); + unset($arr['@cdata']); //remove the key from the array once done. + //return from recursion, as a note with cdata cannot have child nodes. + return $node; + } + else if (isset($arr['@comment']) && is_string($arr['@comment'])) { + $node->appendChild($xml->createComment(self::bool2str($arr['@comment']))); + unset($arr['@comment']); + } + else if (isset($arr['@xml'])) { + $fragment = $xml->createDocumentFragment(); + $fragment->appendXML($arr['@xml']); + $node->appendChild($fragment); + unset($arr['@xml']); + return $node; + } + } + + //create subnodes using recursion + if (is_array($arr)) { + // recurse to get the node for that key + foreach ($arr as $key => $value) { + if (!self::isValidTagName($key)) { + throw new Exception('[Array2XML] Illegal character in tag name. tag: ' . $key . ' in node: ' . $node_name); + } + if (is_array($value) && is_numeric(key($value))) { + // MORE THAN ONE NODE OF ITS KIND; + // if the new array is numeric index, means it is array of nodes of the same kind + // it should follow the parent key name + foreach ($value as $k => $v) { + $node->appendChild(self::convert($key, $v)); + } + } else { + // ONLY ONE NODE OF ITS KIND + $node->appendChild(self::convert($key, $value)); + } + unset($arr[$key]); //remove the key from the array once done. + } + } + + // after we are done with all the keys in the array (if it is one) + // we check if it has any text value, if yes, append it. + if (!is_array($arr)) { + $node->appendChild($xml->createTextNode(self::bool2str($arr))); + } + + return $node; + } + + /* + * Get the root XML node, if there isn't one, create it. + */ + private static function getXMLRoot() { + if (empty(self::$xml)) { + self::init(); + } + return self::$xml; + } + + /* + * Get string representation of boolean value + */ + private static function bool2str($v) { + //convert boolean to text value. + $v = $v === true ? 'true' : $v; + $v = $v === false ? 'false' : $v; + return $v; + } + + /* + * Check if the tag name or attribute name contains illegal characters + * Ref: http://www.w3.org/TR/xml/#sec-common-syn + */ + private static function isValidTagName($tag) { + $pattern = '/^[a-z_]+[a-z0-9\:\-\.\_]*[^:]*$/i'; + return preg_match($pattern, $tag, $matches) && $matches[0] == $tag; + } +} + diff --git a/vendor/openlss/lib-array2xml/LSS/XML2Array.php b/vendor/openlss/lib-array2xml/LSS/XML2Array.php new file mode 100644 index 00000000..ad5dafaa --- /dev/null +++ b/vendor/openlss/lib-array2xml/LSS/XML2Array.php @@ -0,0 +1,173 @@ +. + */ +namespace LSS; +use \DOMDocument; +use \Exception; + +/** + * XML2Array: A class to convert XML to array in PHP + * It returns the array which can be converted back to XML using the Array2XML script + * It takes an XML string or a DOMDocument object as an input. + * + * See Array2XML: http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes + * + * Author : Lalit Patel + * Website: http://www.lalit.org/lab/convert-xml-to-array-in-php-xml2array + * License: Apache License 2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * Version: 0.1 (07 Dec 2011) + * Version: 0.2 (04 Mar 2012) + * Fixed typo 'DomDocument' to 'DOMDocument' + * + * Usage: + * $array = XML2Array::createArray($xml); + */ + +class XML2Array { + + protected static $xml = null; + protected static $encoding = 'UTF-8'; + protected static $prefix_attributes = '@'; + + /** + * Initialize the root XML node [optional] + * @param $version + * @param $encoding + * @param $format_output + */ + public static function init($version = '1.0', $encoding = 'UTF-8', $format_output = true) { + self::$xml = new DOMDocument($version, $encoding); + self::$xml->formatOutput = $format_output; + self::$encoding = $encoding; + } + + /** + * Convert an XML to Array + * @param string $node_name - name of the root node to be converted + * @param int - Bitwise OR of the libxml option constants see @link http://php.net/manual/libxml.constants.php + * @param array $arr - aray to be converterd + * @param mixed $callback - callback function + * @return array + */ + public static function &createArray($input_xml, $options = 0, $callback = null) { + $xml = self::getXMLRoot(); + if(is_string($input_xml)) { + $parsed = $xml->loadXML($input_xml, $options); + if(!$parsed) { + throw new Exception('[XML2Array] Error parsing the XML string.'); + } + } else { + if(get_class($input_xml) != 'DOMDocument') { + throw new Exception('[XML2Array] The input XML object should be of type: DOMDocument.'); + } + $xml = self::$xml = $input_xml; + } + $array[$xml->documentElement->tagName] = self::convert($xml->documentElement, $callback); + self::$xml = null; // clear the xml node in the class for 2nd time use. + return $array; + } + + /** + * Convert an Array to XML + * @param mixed $node - XML as a string or as an object of DOMDocument + * @param mixed $callback - callback function + * @return mixed + */ + protected static function &convert($node, $callback = null) { + $output = array(); + + switch ($node->nodeType) { + case XML_CDATA_SECTION_NODE: + $output[static::$prefix_attributes.'cdata'] = trim($node->textContent); + break; + + case XML_TEXT_NODE: + $output = trim($node->textContent); + break; + + case XML_ELEMENT_NODE: + // for each child node, call the covert function recursively + for ($i=0, $m=$node->childNodes->length; $i<$m; $i++) { + if ($callback!==null) { + $callback($m=$node->childNodes->length, $i); + } + $child = $node->childNodes->item($i); + $v = self::convert($child); + if(isset($child->tagName)) { + $t = $child->tagName; + + // avoid fatal error if the content looks like 'You are being redirected.' + if(isset($output) && !is_array($output)) { + continue; + } + // assume more nodes of same kind are coming + if(!isset($output[$t])) { + $output[$t] = array(); + } + $output[$t][] = $v; + } else { + //check if it is not an empty text node + if($v !== '') { + $output = $v; + } + } + } + + if(is_array($output)) { + // if only one node of its kind, assign it directly instead if array($value); + foreach ($output as $t => $v) { + if(is_array($v) && count($v)==1) { + $output[$t] = $v[0]; + } + } + if(empty($output)) { + //for empty nodes + $output = ''; + } + } + + // loop through the attributes and collect them + if($node->attributes->length) { + $a = array(); + foreach($node->attributes as $attrName => $attrNode) { + $a[$attrName] = (string) $attrNode->value; + } + // if its an leaf node, store the value in @value instead of directly storing it. + if(!is_array($output)) { + $output = array(static::$prefix_attributes.'value' => $output); + } + $output[static::$prefix_attributes.'attributes'] = $a; + } + break; + } + return $output; + } + + /* + * Get the root XML node, if there isn't one, create it. + */ + protected static function getXMLRoot(){ + if(empty(self::$xml)) { + self::init(); + } + return self::$xml; + } +} diff --git a/vendor/openlss/lib-array2xml/README.md b/vendor/openlss/lib-array2xml/README.md new file mode 100644 index 00000000..d3207ce2 --- /dev/null +++ b/vendor/openlss/lib-array2xml/README.md @@ -0,0 +1,72 @@ +lib-array2xml +============= + +Array2XML conversion library credit to lalit.org + +Usage +---- +```php +//create XML +$xml = Array2XML::createXML('root_node_name', $php_array); +echo $xml->saveXML(); + +//create Array +$array = XML2Array::createArray($xml); +print_r($array); +``` + +Array2XML +---- + +@xml example: +```php +// Build the array that should be transformed into a XML object. +$array = [ + 'title' => 'A title', + 'body' => [ + '@xml' => '

The content for the news item

', + ], +]; + +// Use the Array2XML object to transform it. +$xml = Array2XML::createXML('news', $array); +echo $xml->saveXML(); +``` +This will result in the following. +```xml + + + A title + + + +

The content for the news item

+ + + +
+``` + +Reference +---- +More complete references can be found here + http://www.lalit.org/lab/convert-xml-to-array-in-php-xml2array/ + http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes/ + +## Changelog + +### 1.0.0 +* Add ability for callbacks during processing to check status. + +### 0.5.1 +* Fix fata error when the array passed is empty fixed by pull request #6 + +### 0.5.0 +* add second parameter to XML2Array::createArray for DOMDocument::load, e.g: LIBXML_NOCDATA +* change method visibility from private to protected for overloading +* Merge pull request #5 to add child xml +* Merge pull request #4 to change method visibility and add second parameter for load. + + +### 0.1.0 +* Initial Release diff --git a/vendor/openlss/lib-array2xml/composer.json b/vendor/openlss/lib-array2xml/composer.json new file mode 100644 index 00000000..7471231f --- /dev/null +++ b/vendor/openlss/lib-array2xml/composer.json @@ -0,0 +1,33 @@ +{ + "name": "openlss/lib-array2xml" + ,"homepage": "https://www.nullivex.com" + ,"description": "Array2XML conversion library credit to lalit.org" + ,"license": "Apache-2.0" + ,"type": "library" + ,"keywords": [ + "array" + ,"xml" + ,"xml conversion" + ,"array conversion" + ] + ,"authors": [ + { + "name": "Bryan Tong" + ,"email": "bryan@nullivex.com" + ,"homepage": "https://www.nullivex.com" + } + ,{ + "name": "Tony Butler" + ,"email": "spudz76@gmail.com" + ,"homepage": "https://www.nullivex.com" + } + ] + ,"require": { + "php": ">=5.3.2" + } + ,"autoload": { + "psr-0": { + "LSS": "" + } + } +} diff --git a/vendor/phpdocumentor/reflection-common/.github/dependabot.yml b/vendor/phpdocumentor/reflection-common/.github/dependabot.yml new file mode 100644 index 00000000..c630ffa6 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: composer + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 diff --git a/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml b/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml new file mode 100644 index 00000000..484410e9 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml @@ -0,0 +1,223 @@ +on: + push: + branches: + - 2.x + pull_request: +name: Qa workflow +jobs: + setup: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Restore/cache vendor folder + uses: actions/cache@v1 + with: + path: vendor + key: all-build-${{ hashFiles('**/composer.lock') }} + restore-keys: | + all-build-${{ hashFiles('**/composer.lock') }} + all-build- + + - name: Restore/cache tools folder + uses: actions/cache@v1 + with: + path: tools + key: all-tools-${{ github.sha }} + restore-keys: | + all-tools-${{ github.sha }}- + all-tools- + + - name: composer + uses: docker://composer + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: install --no-interaction --prefer-dist --optimize-autoloader + + - name: Install phive + run: make install-phive + + - name: Install PHAR dependencies + run: tools/phive.phar --no-progress install --copy --trust-gpg-keys 4AA394086372C20A,8A03EA3B385DBAA1 --force-accept-unsigned + + phpunit-with-coverage: + runs-on: ubuntu-latest + name: Unit tests + needs: setup + steps: + - uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 7.2 + ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 + coverage: pcov + + - name: Restore/cache tools folder + uses: actions/cache@v1 + with: + path: tools + key: all-tools-${{ github.sha }} + restore-keys: | + all-tools-${{ github.sha }}- + all-tools- + + - name: Get composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache composer dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ubuntu-latest-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ubuntu-latest-composer- + + - name: Install Composer dependencies + run: | + composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader + + - name: Run PHPUnit + run: php tools/phpunit + + phpunit: + runs-on: ${{ matrix.operating-system }} + strategy: + matrix: + operating-system: + - ubuntu-latest + - windows-latest + - macOS-latest + php-versions: ['7.2', '7.3', '7.4', '8.0'] + name: Unit tests for PHP version ${{ matrix.php-versions }} on ${{ matrix.operating-system }} + needs: + - setup + - phpunit-with-coverage + steps: + - uses: actions/checkout@v2 + + - name: Restore/cache tools folder + uses: actions/cache@v1 + with: + path: tools + key: all-tools-${{ github.sha }} + restore-keys: | + all-tools-${{ github.sha }}- + all-tools- + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 + coverage: none + + - name: Get composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache composer dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install Composer dependencies + run: | + composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader + + - name: Run PHPUnit + continue-on-error: true + run: php tools/phpunit + + codestyle: + runs-on: ubuntu-latest + needs: [setup, phpunit] + steps: + - uses: actions/checkout@v2 + - name: Restore/cache vendor folder + uses: actions/cache@v1 + with: + path: vendor + key: all-build-${{ hashFiles('**/composer.lock') }} + restore-keys: | + all-build-${{ hashFiles('**/composer.lock') }} + all-build- + - name: Code style check + uses: phpDocumentor/coding-standard@latest + with: + args: -s + + phpstan: + runs-on: ubuntu-latest + needs: [setup, phpunit] + steps: + - uses: actions/checkout@v2 + - name: Restore/cache vendor folder + uses: actions/cache@v1 + with: + path: vendor + key: all-build-${{ hashFiles('**/composer.lock') }} + restore-keys: | + all-build-${{ hashFiles('**/composer.lock') }} + all-build- + - name: PHPStan + uses: phpDocumentor/phpstan-ga@latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: analyse src --configuration phpstan.neon + + psalm: + runs-on: ubuntu-latest + needs: [setup, phpunit] + steps: + - uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 7.2 + ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 + tools: psalm + coverage: none + + - name: Get composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache composer dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install Composer dependencies + run: | + composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader + + - name: Psalm + run: psalm --output-format=github + + bc_check: + name: BC Check + runs-on: ubuntu-latest + needs: [setup, phpunit] + steps: + - uses: actions/checkout@v2 + - name: fetch tags + run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* + - name: Restore/cache vendor folder + uses: actions/cache@v1 + with: + path: vendor + key: all-build-${{ hashFiles('**/composer.lock') }} + restore-keys: | + all-build-${{ hashFiles('**/composer.lock') }} + all-build- + - name: Roave BC Check + uses: docker://nyholm/roave-bc-check-ga diff --git a/vendor/phpdocumentor/reflection-common/LICENSE b/vendor/phpdocumentor/reflection-common/LICENSE new file mode 100644 index 00000000..ed6926c1 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 phpDocumentor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/vendor/phpdocumentor/reflection-common/README.md b/vendor/phpdocumentor/reflection-common/README.md new file mode 100644 index 00000000..70f830dc --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/README.md @@ -0,0 +1,11 @@ +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +![Qa workflow](https://github.com/phpDocumentor/ReflectionCommon/workflows/Qa%20workflow/badge.svg) +[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionCommon.svg)](https://coveralls.io/github/phpDocumentor/ReflectionCommon?branch=master) +[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) +[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) +[![Stable Version](https://img.shields.io/packagist/v/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) +[![Unstable Version](https://img.shields.io/packagist/vpre/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) + + +ReflectionCommon +================ diff --git a/vendor/phpdocumentor/reflection-common/composer.json b/vendor/phpdocumentor/reflection-common/composer.json new file mode 100644 index 00000000..4d128b49 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/composer.json @@ -0,0 +1,28 @@ +{ + "name": "phpdocumentor/reflection-common", + "keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN"], + "homepage": "http://www.phpdoc.org", + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "license": "MIT", + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "require": { + "php": "^7.2 || ^8.0" + }, + "autoload" : { + "psr-4" : { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "require-dev": { + }, + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + } +} diff --git a/vendor/phpdocumentor/reflection-common/src/Element.php b/vendor/phpdocumentor/reflection-common/src/Element.php new file mode 100644 index 00000000..8923e4fb --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/src/Element.php @@ -0,0 +1,30 @@ +fqsen = $fqsen; + + if (isset($matches[2])) { + $this->name = $matches[2]; + } else { + $matches = explode('\\', $fqsen); + $name = end($matches); + assert(is_string($name)); + $this->name = trim($name, '()'); + } + } + + /** + * converts this class to string. + */ + public function __toString() : string + { + return $this->fqsen; + } + + /** + * Returns the name of the element without path. + */ + public function getName() : string + { + return $this->name; + } +} diff --git a/vendor/phpdocumentor/reflection-common/src/Location.php b/vendor/phpdocumentor/reflection-common/src/Location.php new file mode 100644 index 00000000..177deede --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/src/Location.php @@ -0,0 +1,53 @@ +lineNumber = $lineNumber; + $this->columnNumber = $columnNumber; + } + + /** + * Returns the line number that is covered by this location. + */ + public function getLineNumber() : int + { + return $this->lineNumber; + } + + /** + * Returns the column number (character position on a line) for this location object. + */ + public function getColumnNumber() : int + { + return $this->columnNumber; + } +} diff --git a/vendor/phpdocumentor/reflection-common/src/Project.php b/vendor/phpdocumentor/reflection-common/src/Project.php new file mode 100644 index 00000000..57839fd1 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/src/Project.php @@ -0,0 +1,25 @@ +create($docComment); +``` + +The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock` +whose methods can be queried: + +```php +// Contains the summary for this DocBlock +$summary = $docblock->getSummary(); + +// Contains \phpDocumentor\Reflection\DocBlock\Description object +$description = $docblock->getDescription(); + +// You can either cast it to string +$description = (string) $docblock->getDescription(); + +// Or use the render method to get a string representation of the Description. +$description = $docblock->getDescription()->render(); +``` + +> For more examples it would be best to review the scripts in the [`/examples` folder](/examples). diff --git a/vendor/phpdocumentor/reflection-docblock/composer.json b/vendor/phpdocumentor/reflection-docblock/composer.json new file mode 100644 index 00000000..d9076302 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/composer.json @@ -0,0 +1,42 @@ +{ + "name": "phpdocumentor/reflection-docblock", + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1", + "phpdocumentor/reflection-common": "^2.2", + "ext-filter": "*" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "phpDocumentor\\Reflection\\": ["tests/unit", "tests/integration"] + } + }, + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php new file mode 100644 index 00000000..cc33e60e --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php @@ -0,0 +1,228 @@ +summary = $summary; + $this->description = $description ?: new DocBlock\Description(''); + foreach ($tags as $tag) { + $this->addTag($tag); + } + + $this->context = $context; + $this->location = $location; + + $this->isTemplateEnd = $isTemplateEnd; + $this->isTemplateStart = $isTemplateStart; + } + + public function getSummary(): string + { + return $this->summary; + } + + public function getDescription(): DocBlock\Description + { + return $this->description; + } + + /** + * Returns the current context. + */ + public function getContext(): ?Types\Context + { + return $this->context; + } + + /** + * Returns the current location. + */ + public function getLocation(): ?Location + { + return $this->location; + } + + /** + * Returns whether this DocBlock is the start of a Template section. + * + * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker + * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. + * + * An example of such an opening is: + * + * ``` + * /**#@+ + * * My DocBlock + * * / + * ``` + * + * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all + * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). + * + * @see self::isTemplateEnd() for the check whether a closing marker was provided. + */ + public function isTemplateStart(): bool + { + return $this->isTemplateStart; + } + + /** + * Returns whether this DocBlock is the end of a Template section. + * + * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. + */ + public function isTemplateEnd(): bool + { + return $this->isTemplateEnd; + } + + /** + * Returns the tags for this DocBlock. + * + * @return Tag[] + */ + public function getTags(): array + { + return $this->tags; + } + + /** + * Returns an array of tags matching the given name. If no tags are found + * an empty array is returned. + * + * @param string $name String to search by. + * + * @return Tag[] + */ + public function getTagsByName(string $name): array + { + $result = []; + + foreach ($this->getTags() as $tag) { + if ($tag->getName() !== $name) { + continue; + } + + $result[] = $tag; + } + + return $result; + } + + /** + * Returns an array of tags with type matching the given name. If no tags are found + * an empty array is returned. + * + * @param string $name String to search by. + * + * @return TagWithType[] + */ + public function getTagsWithTypeByName(string $name): array + { + $result = []; + + foreach ($this->getTagsByName($name) as $tag) { + if (!$tag instanceof TagWithType) { + continue; + } + + $result[] = $tag; + } + + return $result; + } + + /** + * Checks if a tag of a certain type is present in this DocBlock. + * + * @param string $name Tag name to check for. + */ + public function hasTag(string $name): bool + { + foreach ($this->getTags() as $tag) { + if ($tag->getName() === $name) { + return true; + } + } + + return false; + } + + /** + * Remove a tag from this DocBlock. + * + * @param Tag $tagToRemove The tag to remove. + */ + public function removeTag(Tag $tagToRemove): void + { + foreach ($this->tags as $key => $tag) { + if ($tag === $tagToRemove) { + unset($this->tags[$key]); + break; + } + } + } + + /** + * Adds a tag to this DocBlock. + * + * @param Tag $tag The tag to add. + */ + private function addTag(Tag $tag): void + { + $this->tags[] = $tag; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php new file mode 100644 index 00000000..a31b2892 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php @@ -0,0 +1,115 @@ +create('This is a {@see Description}', $context); + * + * The description factory will interpret the given body and create a body template and list of tags from them, and pass + * that onto the constructor if this class. + * + * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace + * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial + * > type names and FQSENs. + * + * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: + * + * $description = new Description( + * 'This is a %1$s', + * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] + * ); + * + * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object + * is mainly responsible for rendering. + * + * @see DescriptionFactory to create a new Description. + * @see Description\Formatter for the formatting of the body and tags. + */ +class Description +{ + /** @var string */ + private $bodyTemplate; + + /** @var Tag[] */ + private $tags; + + /** + * Initializes a Description with its body (template) and a listing of the tags used in the body template. + * + * @param Tag[] $tags + */ + public function __construct(string $bodyTemplate, array $tags = []) + { + $this->bodyTemplate = $bodyTemplate; + $this->tags = $tags; + } + + /** + * Returns the body template. + */ + public function getBodyTemplate(): string + { + return $this->bodyTemplate; + } + + /** + * Returns the tags for this DocBlock. + * + * @return Tag[] + */ + public function getTags(): array + { + return $this->tags; + } + + /** + * Renders this description as a string where the provided formatter will format the tags in the expected string + * format. + */ + public function render(?Formatter $formatter = null): string + { + if ($formatter === null) { + $formatter = new PassthroughFormatter(); + } + + $tags = []; + foreach ($this->tags as $tag) { + $tags[] = '{' . $formatter->format($tag) . '}'; + } + + return vsprintf($this->bodyTemplate, $tags); + } + + /** + * Returns a plain string representation of this description. + */ + public function __toString(): string + { + return $this->render(); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php new file mode 100644 index 00000000..1a519ec4 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php @@ -0,0 +1,178 @@ +tagFactory = $tagFactory; + } + + /** + * Returns the parsed text of this description. + */ + public function create(string $contents, ?TypeContext $context = null): Description + { + $tokens = $this->lex($contents); + $count = count($tokens); + $tagCount = 0; + $tags = []; + + for ($i = 1; $i < $count; $i += 2) { + $tags[] = $this->tagFactory->create($tokens[$i], $context); + $tokens[$i] = '%' . ++$tagCount . '$s'; + } + + //In order to allow "literal" inline tags, the otherwise invalid + //sequence "{@}" is changed to "@", and "{}" is changed to "}". + //"%" is escaped to "%%" because of vsprintf. + //See unit tests for examples. + for ($i = 0; $i < $count; $i += 2) { + $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); + } + + return new Description(implode('', $tokens), $tags); + } + + /** + * Strips the contents from superfluous whitespace and splits the description into a series of tokens. + * + * @return string[] A series of tokens of which the description text is composed. + */ + private function lex(string $contents): array + { + $contents = $this->removeSuperfluousStartingWhitespace($contents); + + // performance optimalization; if there is no inline tag, don't bother splitting it up. + if (strpos($contents, '{@') === false) { + return [$contents]; + } + + return Utils::pregSplit( + '/\{ + # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. + (?!@\}) + # We want to capture the whole tag line, but without the inline tag delimiters. + (\@ + # Match everything up to the next delimiter. + [^{}]* + # Nested inline tag content should not be captured, or it will appear in the result separately. + (?: + # Match nested inline tags. + (?: + # Because we did not catch the tag delimiters earlier, we must be explicit with them here. + # Notice that this also matches "{}", as a way to later introduce it as an escape sequence. + \{(?1)?\} + | + # Make sure we match hanging "{". + \{ + ) + # Match content after the nested inline tag. + [^{}]* + )* # If there are more inline tags, match them as well. We use "*" since there may not be any + # nested inline tags. + ) + \}/Sux', + $contents, + 0, + PREG_SPLIT_DELIM_CAPTURE + ); + } + + /** + * Removes the superfluous from a multi-line description. + * + * When a description has more than one line then it can happen that the second and subsequent lines have an + * additional indentation. This is commonly in use with tags like this: + * + * {@}since 1.1.0 This is an example + * description where we have an + * indentation in the second and + * subsequent lines. + * + * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent + * lines and this may cause rendering issues when, for example, using a Markdown converter. + */ + private function removeSuperfluousStartingWhitespace(string $contents): string + { + $lines = Utils::pregSplit("/\r\n?|\n/", $contents); + + // if there is only one line then we don't have lines with superfluous whitespace and + // can use the contents as-is + if (count($lines) <= 1) { + return $contents; + } + + // determine how many whitespace characters need to be stripped + $startingSpaceCount = 9999999; + for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { + // lines with a no length do not count as they are not indented at all + if (trim($lines[$i]) === '') { + continue; + } + + // determine the number of prefixing spaces by checking the difference in line length before and after + // an ltrim + $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); + } + + // strip the number of spaces from each line + if ($startingSpaceCount > 0) { + for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { + $lines[$i] = substr($lines[$i], $startingSpaceCount); + } + } + + return implode("\n", $lines); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php new file mode 100644 index 00000000..6a6b4729 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php @@ -0,0 +1,159 @@ +getFilePath(); + + $file = $this->getExampleFileContents($filename); + if (!$file) { + return sprintf('** File not found : %s **', $filename); + } + + return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); + } + + /** + * Registers the project's root directory where an 'examples' folder can be expected. + */ + public function setSourceDirectory(string $directory = ''): void + { + $this->sourceDirectory = $directory; + } + + /** + * Returns the project's root directory where an 'examples' folder can be expected. + */ + public function getSourceDirectory(): string + { + return $this->sourceDirectory; + } + + /** + * Registers a series of directories that may contain examples. + * + * @param string[] $directories + */ + public function setExampleDirectories(array $directories): void + { + $this->exampleDirectories = $directories; + } + + /** + * Returns a series of directories that may contain examples. + * + * @return string[] + */ + public function getExampleDirectories(): array + { + return $this->exampleDirectories; + } + + /** + * Attempts to find the requested example file and returns its contents or null if no file was found. + * + * This method will try several methods in search of the given example file, the first one it encounters is + * returned: + * + * 1. Iterates through all examples folders for the given filename + * 2. Checks the source folder for the given filename + * 3. Checks the 'examples' folder in the current working directory for examples + * 4. Checks the path relative to the current working directory for the given filename + * + * @return string[] all lines of the example file + */ + private function getExampleFileContents(string $filename): ?array + { + $normalizedPath = null; + + foreach ($this->exampleDirectories as $directory) { + $exampleFileFromConfig = $this->constructExamplePath($directory, $filename); + if (is_readable($exampleFileFromConfig)) { + $normalizedPath = $exampleFileFromConfig; + break; + } + } + + if (!$normalizedPath) { + if (is_readable($this->getExamplePathFromSource($filename))) { + $normalizedPath = $this->getExamplePathFromSource($filename); + } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { + $normalizedPath = $this->getExamplePathFromExampleDirectory($filename); + } elseif (is_readable($filename)) { + $normalizedPath = $filename; + } + } + + $lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : false; + + return $lines !== false ? $lines : null; + } + + /** + * Get example filepath based on the example directory inside your project. + */ + private function getExamplePathFromExampleDirectory(string $file): string + { + return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; + } + + /** + * Returns a path to the example file in the given directory.. + */ + private function constructExamplePath(string $directory, string $file): string + { + return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; + } + + /** + * Get example filepath based on sourcecode. + */ + private function getExamplePathFromSource(string $file): string + { + return sprintf( + '%s%s%s', + trim($this->getSourceDirectory(), '\\/'), + DIRECTORY_SEPARATOR, + trim($file, '"') + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php new file mode 100644 index 00000000..77e5fb5f --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php @@ -0,0 +1,157 @@ +indent = $indent; + $this->indentString = $indentString; + $this->isFirstLineIndented = $indentFirstLine; + $this->lineLength = $lineLength; + $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); + $this->lineEnding = $lineEnding; + } + + /** + * Generate a DocBlock comment. + * + * @param DocBlock $docblock The DocBlock to serialize. + * + * @return string The serialized doc block. + */ + public function getDocComment(DocBlock $docblock): string + { + $indent = str_repeat($this->indentString, $this->indent); + $firstIndent = $this->isFirstLineIndented ? $indent : ''; + // 3 === strlen(' * ') + $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; + + $text = $this->removeTrailingSpaces( + $indent, + $this->addAsterisksForEachLine( + $indent, + $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength) + ) + ); + + $comment = $firstIndent . "/**\n"; + if ($text) { + $comment .= $indent . ' * ' . $text . "\n"; + $comment .= $indent . " *\n"; + } + + $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); + + return str_replace("\n", $this->lineEnding, $comment . $indent . ' */'); + } + + private function removeTrailingSpaces(string $indent, string $text): string + { + return str_replace( + sprintf("\n%s * \n", $indent), + sprintf("\n%s *\n", $indent), + $text + ); + } + + private function addAsterisksForEachLine(string $indent, string $text): string + { + return str_replace( + "\n", + sprintf("\n%s * ", $indent), + $text + ); + } + + private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength): string + { + $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() + : ''); + if ($wrapLength !== null) { + $text = wordwrap($text, $wrapLength); + + return $text; + } + + return $text; + } + + private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment): string + { + foreach ($docblock->getTags() as $tag) { + $tagText = $this->tagFormatter->format($tag); + if ($wrapLength !== null) { + $tagText = wordwrap($tagText, $wrapLength); + } + + $tagText = str_replace( + "\n", + sprintf("\n%s * ", $indent), + $tagText + ); + + $comment .= sprintf("%s * %s\n", $indent, $tagText); + } + + return $comment; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php new file mode 100644 index 00000000..8d765951 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php @@ -0,0 +1,348 @@ + Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise + * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to + * > verify that a dependency is actually passed. + * + * This Factory also features a Service Locator component that is used to pass the right dependencies to the + * `create` method of a tag; each dependency should be registered as a service or as a parameter. + * + * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass + * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. + */ +final class StandardTagFactory implements TagFactory +{ + /** PCRE regular expression matching a tag name. */ + public const REGEX_TAGNAME = '[\w\-\_\\\\:]+'; + + /** + * @var array> An array with a tag as a key, and an + * FQCN to a class that handles it as an array value. + */ + private $tagHandlerMappings = [ + 'author' => Author::class, + 'covers' => Covers::class, + 'deprecated' => Deprecated::class, + // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', + 'link' => LinkTag::class, + 'method' => Method::class, + 'param' => Param::class, + 'property-read' => PropertyRead::class, + 'property' => Property::class, + 'property-write' => PropertyWrite::class, + 'return' => Return_::class, + 'see' => SeeTag::class, + 'since' => Since::class, + 'source' => Source::class, + 'throw' => Throws::class, + 'throws' => Throws::class, + 'uses' => Uses::class, + 'var' => Var_::class, + 'version' => Version::class, + ]; + + /** + * @var array> An array with a anotation s a key, and an + * FQCN to a class that handles it as an array value. + */ + private $annotationMappings = []; + + /** + * @var ReflectionParameter[][] a lazy-loading cache containing parameters + * for each tagHandler that has been used. + */ + private $tagHandlerParameterCache = []; + + /** @var FqsenResolver */ + private $fqsenResolver; + + /** + * @var mixed[] an array representing a simple Service Locator where we can store parameters and + * services that can be inserted into the Factory Methods of Tag Handlers. + */ + private $serviceLocator = []; + + /** + * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. + * + * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property + * is used. + * + * @see self::registerTagHandler() to add a new tag handler to the existing default list. + * + * @param array> $tagHandlers + */ + public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) + { + $this->fqsenResolver = $fqsenResolver; + if ($tagHandlers !== null) { + $this->tagHandlerMappings = $tagHandlers; + } + + $this->addService($fqsenResolver, FqsenResolver::class); + } + + public function create(string $tagLine, ?TypeContext $context = null): Tag + { + if (!$context) { + $context = new TypeContext(''); + } + + [$tagName, $tagBody] = $this->extractTagParts($tagLine); + + return $this->createTag(trim($tagBody), $tagName, $context); + } + + /** + * @param mixed $value + */ + public function addParameter(string $name, $value): void + { + $this->serviceLocator[$name] = $value; + } + + public function addService(object $service, ?string $alias = null): void + { + $this->serviceLocator[$alias ?: get_class($service)] = $service; + } + + public function registerTagHandler(string $tagName, string $handler): void + { + Assert::stringNotEmpty($tagName); + Assert::classExists($handler); + Assert::implementsInterface($handler, Tag::class); + + if (strpos($tagName, '\\') && $tagName[0] !== '\\') { + throw new InvalidArgumentException( + 'A namespaced tag must have a leading backslash as it must be fully qualified' + ); + } + + $this->tagHandlerMappings[$tagName] = $handler; + } + + /** + * Extracts all components for a tag. + * + * @return string[] + */ + private function extractTagParts(string $tagLine): array + { + $matches = []; + if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\s\(\{])\s*([^\s].*)|$)/us', $tagLine, $matches)) { + throw new InvalidArgumentException( + 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors' + ); + } + + if (count($matches) < 3) { + $matches[] = ''; + } + + return array_slice($matches, 1); + } + + /** + * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the + * body was invalid. + */ + private function createTag(string $body, string $name, TypeContext $context): Tag + { + $handlerClassName = $this->findHandlerClassName($name, $context); + $arguments = $this->getArgumentsForParametersFromWiring( + $this->fetchParametersForHandlerFactoryMethod($handlerClassName), + $this->getServiceLocatorWithDynamicParameters($context, $name, $body) + ); + + try { + $callable = [$handlerClassName, 'create']; + Assert::isCallable($callable); + /** @phpstan-var callable(string): ?Tag $callable */ + $tag = call_user_func_array($callable, $arguments); + + return $tag ?? InvalidTag::create($body, $name); + } catch (InvalidArgumentException $e) { + return InvalidTag::create($body, $name)->withError($e); + } + } + + /** + * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). + * + * @return class-string + */ + private function findHandlerClassName(string $tagName, TypeContext $context): string + { + $handlerClassName = Generic::class; + if (isset($this->tagHandlerMappings[$tagName])) { + $handlerClassName = $this->tagHandlerMappings[$tagName]; + } elseif ($this->isAnnotation($tagName)) { + // TODO: Annotation support is planned for a later stage and as such is disabled for now + $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); + if (isset($this->annotationMappings[$tagName])) { + $handlerClassName = $this->annotationMappings[$tagName]; + } + } + + return $handlerClassName; + } + + /** + * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. + * + * @param ReflectionParameter[] $parameters + * @param mixed[] $locator + * + * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters + * is provided with this method. + */ + private function getArgumentsForParametersFromWiring(array $parameters, array $locator): array + { + $arguments = []; + foreach ($parameters as $parameter) { + $type = $parameter->getType(); + $typeHint = null; + if ($type instanceof ReflectionNamedType) { + $typeHint = $type->getName(); + if ($typeHint === 'self') { + $declaringClass = $parameter->getDeclaringClass(); + if ($declaringClass !== null) { + $typeHint = $declaringClass->getName(); + } + } + } + + if (isset($locator[$typeHint])) { + $arguments[] = $locator[$typeHint]; + continue; + } + + $parameterName = $parameter->getName(); + if (isset($locator[$parameterName])) { + $arguments[] = $locator[$parameterName]; + continue; + } + + $arguments[] = null; + } + + return $arguments; + } + + /** + * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given + * tag handler class name. + * + * @param class-string $handlerClassName + * + * @return ReflectionParameter[] + */ + private function fetchParametersForHandlerFactoryMethod(string $handlerClassName): array + { + if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { + $methodReflection = new ReflectionMethod($handlerClassName, 'create'); + $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); + } + + return $this->tagHandlerParameterCache[$handlerClassName]; + } + + /** + * Returns a copy of this class' Service Locator with added dynamic parameters, + * such as the tag's name, body and Context. + * + * @param TypeContext $context The Context (namespace and aliasses) that may be + * passed and is used to resolve FQSENs. + * @param string $tagName The name of the tag that may be + * passed onto the factory method of the Tag class. + * @param string $tagBody The body of the tag that may be + * passed onto the factory method of the Tag class. + * + * @return mixed[] + */ + private function getServiceLocatorWithDynamicParameters( + TypeContext $context, + string $tagName, + string $tagBody + ): array { + return array_merge( + $this->serviceLocator, + [ + 'name' => $tagName, + 'body' => $tagBody, + TypeContext::class => $context, + ] + ); + } + + /** + * Returns whether the given tag belongs to an annotation. + * + * @todo this method should be populated once we implement Annotation notation support. + */ + private function isAnnotation(string $tagContent): bool + { + // 1. Contains a namespace separator + // 2. Contains parenthesis + // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part + // of the annotation class name matches the found tag name + + return false; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php new file mode 100644 index 00000000..7cf07b4d --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php @@ -0,0 +1,31 @@ + $handler FQCN of handler. + * + * @throws InvalidArgumentException If the tag name is not a string. + * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but + * does not start with a backslash. + * @throws InvalidArgumentException If the handler is not a string. + * @throws InvalidArgumentException If the handler is not an existing class. + * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. + */ + public function registerTagHandler(string $tagName, string $handler): void; +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php new file mode 100644 index 00000000..ae09ecf4 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php @@ -0,0 +1,102 @@ +authorName = $authorName; + $this->authorEmail = $authorEmail; + } + + /** + * Gets the author's name. + * + * @return string The author's name. + */ + public function getAuthorName(): string + { + return $this->authorName; + } + + /** + * Returns the author's email. + * + * @return string The author's email. + */ + public function getEmail(): string + { + return $this->authorEmail; + } + + /** + * Returns this tag in string form. + */ + public function __toString(): string + { + if ($this->authorEmail) { + $authorEmail = '<' . $this->authorEmail . '>'; + } else { + $authorEmail = ''; + } + + $authorName = $this->authorName; + + return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); + } + + /** + * Attempts to create a new Author object based on the tag body. + */ + public static function create(string $body): ?self + { + $splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches); + if (!$splitTagContent) { + return null; + } + + $authorName = trim($matches[1]); + $email = isset($matches[2]) ? trim($matches[2]) : ''; + + return new static($authorName, $email); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php new file mode 100644 index 00000000..a28d5bf9 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php @@ -0,0 +1,53 @@ +name; + } + + public function getDescription(): ?Description + { + return $this->description; + } + + public function render(?Formatter $formatter = null): string + { + if ($formatter === null) { + $formatter = new Formatter\PassthroughFormatter(); + } + + return $formatter->format($this); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php new file mode 100644 index 00000000..3eff9d8b --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php @@ -0,0 +1,101 @@ +refers = $refers; + $this->description = $description; + } + + public static function create( + string $body, + ?DescriptionFactory $descriptionFactory = null, + ?FqsenResolver $resolver = null, + ?TypeContext $context = null + ): self { + Assert::stringNotEmpty($body); + Assert::notNull($descriptionFactory); + Assert::notNull($resolver); + + $parts = Utils::pregSplit('/\s+/Su', $body, 2); + + return new static( + self::resolveFqsen($parts[0], $resolver, $context), + $descriptionFactory->create($parts[1] ?? '', $context) + ); + } + + private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context): Fqsen + { + Assert::notNull($fqsenResolver); + $fqsenParts = explode('::', $parts); + $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); + + if (!array_key_exists(1, $fqsenParts)) { + return $resolved; + } + + return new Fqsen($resolved . '::' . $fqsenParts[1]); + } + + /** + * Returns the structural element this tag refers to. + */ + public function getReference(): Fqsen + { + return $this->refers; + } + + /** + * Returns a string representation of this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $refers = (string) $this->refers; + + return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php new file mode 100644 index 00000000..dbcad28c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php @@ -0,0 +1,109 @@ +version = $version; + $this->description = $description; + } + + /** + * @return static + */ + public static function create( + ?string $body, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + if (empty($body)) { + return new static(); + } + + $matches = []; + if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { + return new static( + null, + $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null + ); + } + + Assert::notNull($descriptionFactory); + + return new static( + $matches[1], + $descriptionFactory->create($matches[2] ?? '', $context) + ); + } + + /** + * Gets the version section of the tag. + */ + public function getVersion(): ?string + { + return $this->version; + } + + /** + * Returns a string representation for this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $version = (string) $this->version; + + return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php new file mode 100644 index 00000000..825355aa --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php @@ -0,0 +1,200 @@ +filePath = $filePath; + $this->startingLine = $startingLine; + $this->lineCount = $lineCount; + if ($content !== null) { + $this->content = trim($content); + } + + $this->isURI = $isURI; + } + + public function getContent(): string + { + if ($this->content === null || $this->content === '') { + $filePath = $this->filePath; + if ($this->isURI) { + $filePath = $this->isUriRelative($this->filePath) + ? str_replace('%2F', '/', rawurlencode($this->filePath)) + : $this->filePath; + } + + return trim($filePath); + } + + return $this->content; + } + + public function getDescription(): ?string + { + return $this->content; + } + + public static function create(string $body): ?Tag + { + // File component: File path in quotes or File URI / Source information + if (!preg_match('/^\s*(?:(\"[^\"]+\")|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) { + return null; + } + + $filePath = null; + $fileUri = null; + if ($matches[1] !== '') { + $filePath = $matches[1]; + } else { + $fileUri = $matches[2]; + } + + $startingLine = 1; + $lineCount = 0; + $description = null; + + if (array_key_exists(3, $matches)) { + $description = $matches[3]; + + // Starting line / Number of lines / Description + if (preg_match('/^([1-9]\d*)(?:\s+((?1))\s*)?(.*)$/sux', $matches[3], $contentMatches)) { + $startingLine = (int) $contentMatches[1]; + if (isset($contentMatches[2])) { + $lineCount = (int) $contentMatches[2]; + } + + if (array_key_exists(3, $contentMatches)) { + $description = $contentMatches[3]; + } + } + } + + return new static( + $filePath ?? ($fileUri ?? ''), + $fileUri !== null, + $startingLine, + $lineCount, + $description + ); + } + + /** + * Returns the file path. + * + * @return string Path to a file to use as an example. + * May also be an absolute URI. + */ + public function getFilePath(): string + { + return trim($this->filePath, '"'); + } + + /** + * Returns a string representation for this tag. + */ + public function __toString(): string + { + $filePath = $this->filePath; + $isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; + $startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; + $lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; + $content = (string) $this->content; + + return $filePath + . ($startingLine !== '' + ? ($filePath !== '' ? ' ' : '') . $startingLine + : '') + . ($lineCount !== '' + ? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount + : '') + . ($content !== '' + ? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content + : ''); + } + + /** + * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). + */ + private function isUriRelative(string $uri): bool + { + return strpos($uri, ':') === false; + } + + public function getStartingLine(): int + { + return $this->startingLine; + } + + public function getLineCount(): int + { + return $this->lineCount; + } + + public function getName(): string + { + return 'example'; + } + + public function render(?Formatter $formatter = null): string + { + if ($formatter === null) { + $formatter = new Formatter\PassthroughFormatter(); + } + + return $formatter->format($this); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php new file mode 100644 index 00000000..f6f0bb5a --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php @@ -0,0 +1,25 @@ +maxLen = max($this->maxLen, strlen($tag->getName())); + } + } + + /** + * Formats the given tag to return a simple plain text version. + */ + public function format(Tag $tag): string + { + return '@' . $tag->getName() . + str_repeat( + ' ', + $this->maxLen - strlen($tag->getName()) + 1 + ) . + $tag; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php new file mode 100644 index 00000000..2afdfe55 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php @@ -0,0 +1,30 @@ +getName() . ' ' . $tag); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php new file mode 100644 index 00000000..bc1ab10c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php @@ -0,0 +1,89 @@ +validateTagName($name); + + $this->name = $name; + $this->description = $description; + } + + /** + * Creates a new tag that represents any unknown tag type. + * + * @return static + */ + public static function create( + string $body, + string $name = '', + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::stringNotEmpty($name); + Assert::notNull($descriptionFactory); + + $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; + + return new static($name, $description); + } + + /** + * Returns the tag as a serialized string + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + return $description; + } + + /** + * Validates if the tag name matches the expected format, otherwise throws an exception. + */ + private function validateTagName(string $name): void + { + if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { + throw new InvalidArgumentException( + 'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' + . 'hyphens and backslashes.' + ); + } + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php new file mode 100644 index 00000000..4e6abb8c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php @@ -0,0 +1,145 @@ +name = $name; + $this->body = $body; + } + + public function getException(): ?Throwable + { + return $this->throwable; + } + + public function getName(): string + { + return $this->name; + } + + public static function create(string $body, string $name = ''): self + { + return new self($name, $body); + } + + public function withError(Throwable $exception): self + { + $this->flattenExceptionBacktrace($exception); + $tag = new self($this->name, $this->body); + $tag->throwable = $exception; + + return $tag; + } + + /** + * Removes all complex types from backtrace + * + * Not all objects are serializable. So we need to remove them from the + * stored exception to be sure that we do not break existing library usage. + */ + private function flattenExceptionBacktrace(Throwable $exception): void + { + $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); + $traceProperty->setAccessible(true); + + do { + $trace = $exception->getTrace(); + if (isset($trace[0]['args'])) { + $trace = array_map( + function (array $call): array { + $call['args'] = array_map([$this, 'flattenArguments'], $call['args'] ?? []); + + return $call; + }, + $trace + ); + } + + $traceProperty->setValue($exception, $trace); + $exception = $exception->getPrevious(); + } while ($exception !== null); + + $traceProperty->setAccessible(false); + } + + /** + * @param mixed $value + * + * @return mixed + * + * @throws ReflectionException + */ + private function flattenArguments($value) + { + if ($value instanceof Closure) { + $closureReflection = new ReflectionFunction($value); + $value = sprintf( + '(Closure at %s:%s)', + $closureReflection->getFileName(), + $closureReflection->getStartLine() + ); + } elseif (is_object($value)) { + $value = sprintf('object(%s)', get_class($value)); + } elseif (is_resource($value)) { + $value = sprintf('resource(%s)', get_resource_type($value)); + } elseif (is_array($value)) { + $value = array_map([$this, 'flattenArguments'], $value); + } + + return $value; + } + + public function render(?Formatter $formatter = null): string + { + if ($formatter === null) { + $formatter = new Formatter\PassthroughFormatter(); + } + + return $formatter->format($this); + } + + public function __toString(): string + { + return $this->body; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php new file mode 100644 index 00000000..ee242e3b --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php @@ -0,0 +1,78 @@ +link = $link; + $this->description = $description; + } + + public static function create( + string $body, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::notNull($descriptionFactory); + + $parts = Utils::pregSplit('/\s+/Su', $body, 2); + $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; + + return new static($parts[0], $description); + } + + /** + * Gets the link + */ + public function getLink(): string + { + return $this->link; + } + + /** + * Returns a string representation for this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $link = $this->link; + + return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php new file mode 100644 index 00000000..f08bfffd --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php @@ -0,0 +1,279 @@ + + * @var array> + */ + private $arguments; + + /** @var bool */ + private $isStatic; + + /** @var Type */ + private $returnType; + + /** + * @param array> $arguments + * @phpstan-param array $arguments + */ + public function __construct( + string $methodName, + array $arguments = [], + ?Type $returnType = null, + bool $static = false, + ?Description $description = null + ) { + Assert::stringNotEmpty($methodName); + + if ($returnType === null) { + $returnType = new Void_(); + } + + $this->methodName = $methodName; + $this->arguments = $this->filterArguments($arguments); + $this->returnType = $returnType; + $this->isStatic = $static; + $this->description = $description; + } + + public static function create( + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): ?self { + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + + // 1. none or more whitespace + // 2. optionally the keyword "static" followed by whitespace + // 3. optionally a word with underscores followed by whitespace : as + // type for the return value + // 4. then optionally a word with underscores followed by () and + // whitespace : as method name as used by phpDocumentor + // 5. then a word with underscores, followed by ( and any character + // until a ) and whitespace : as method name with signature + // 6. any remaining text : as description + if ( + !preg_match( + '/^ + # Static keyword + # Declares a static method ONLY if type is also present + (?: + (static) + \s+ + )? + # Return type + (?: + ( + (?:[\w\|_\\\\]*\$this[\w\|_\\\\]*) + | + (?: + (?:[\w\|_\\\\]+) + # array notation + (?:\[\])* + )*+ + ) + \s+ + )? + # Method name + ([\w_]+) + # Arguments + (?: + \(([^\)]*)\) + )? + \s* + # Description + (.*) + $/sux', + $body, + $matches + ) + ) { + return null; + } + + [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; + + $static = $static === 'static'; + + if ($returnType === '') { + $returnType = 'void'; + } + + $returnType = $typeResolver->resolve($returnType, $context); + $description = $descriptionFactory->create($description, $context); + + /** @phpstan-var array $arguments */ + $arguments = []; + if ($argumentLines !== '') { + $argumentsExploded = explode(',', $argumentLines); + foreach ($argumentsExploded as $argument) { + $argument = explode(' ', self::stripRestArg(trim($argument)), 2); + if (strpos($argument[0], '$') === 0) { + $argumentName = substr($argument[0], 1); + $argumentType = new Mixed_(); + } else { + $argumentType = $typeResolver->resolve($argument[0], $context); + $argumentName = ''; + if (isset($argument[1])) { + $argument[1] = self::stripRestArg($argument[1]); + $argumentName = substr($argument[1], 1); + } + } + + $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; + } + } + + return new static($methodName, $arguments, $returnType, $static, $description); + } + + /** + * Retrieves the method name. + */ + public function getMethodName(): string + { + return $this->methodName; + } + + /** + * @return array> + * @phpstan-return array + */ + public function getArguments(): array + { + return $this->arguments; + } + + /** + * Checks whether the method tag describes a static method or not. + * + * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. + */ + public function isStatic(): bool + { + return $this->isStatic; + } + + public function getReturnType(): Type + { + return $this->returnType; + } + + public function __toString(): string + { + $arguments = []; + foreach ($this->arguments as $argument) { + $arguments[] = $argument['type'] . ' $' . $argument['name']; + } + + $argumentStr = '(' . implode(', ', $arguments) . ')'; + + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $static = $this->isStatic ? 'static' : ''; + + $returnType = (string) $this->returnType; + + $methodName = $this->methodName; + + return $static + . ($returnType !== '' ? ($static !== '' ? ' ' : '') . $returnType : '') + . ($methodName !== '' ? ($static !== '' || $returnType !== '' ? ' ' : '') . $methodName : '') + . $argumentStr + . ($description !== '' ? ' ' . $description : ''); + } + + /** + * @param mixed[][]|string[] $arguments + * @phpstan-param array $arguments + * + * @return mixed[][] + * @phpstan-return array + */ + private function filterArguments(array $arguments = []): array + { + $result = []; + foreach ($arguments as $argument) { + if (is_string($argument)) { + $argument = ['name' => $argument]; + } + + if (!isset($argument['type'])) { + $argument['type'] = new Mixed_(); + } + + $keys = array_keys($argument); + sort($keys); + if ($keys !== ['name', 'type']) { + throw new InvalidArgumentException( + 'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true) + ); + } + + $result[] = $argument; + } + + return $result; + } + + private static function stripRestArg(string $argument): string + { + if (strpos($argument, '...') === 0) { + $argument = trim(substr($argument, 3)); + } + + return $argument; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php new file mode 100644 index 00000000..3399649b --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php @@ -0,0 +1,174 @@ +name = 'param'; + $this->variableName = $variableName; + $this->type = $type; + $this->isVariadic = $isVariadic; + $this->description = $description; + $this->isReference = $isReference; + } + + public static function create( + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + + [$firstPart, $body] = self::extractTypeFromBody($body); + + $type = null; + $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $variableName = ''; + $isVariadic = false; + $isReference = false; + + // if the first item that is encountered is not a variable; it is a type + if ($firstPart && !self::strStartsWithVariable($firstPart)) { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); + } + + // if the next item starts with a $ or ...$ or &$ or &...$ it must be the variable name + if (isset($parts[0]) && self::strStartsWithVariable($parts[0])) { + $variableName = array_shift($parts); + if ($type) { + array_shift($parts); + } + + Assert::notNull($variableName); + + if (strpos($variableName, '$') === 0) { + $variableName = substr($variableName, 1); + } elseif (strpos($variableName, '&$') === 0) { + $isReference = true; + $variableName = substr($variableName, 2); + } elseif (strpos($variableName, '...$') === 0) { + $isVariadic = true; + $variableName = substr($variableName, 4); + } elseif (strpos($variableName, '&...$') === 0) { + $isVariadic = true; + $isReference = true; + $variableName = substr($variableName, 5); + } + } + + $description = $descriptionFactory->create(implode('', $parts), $context); + + return new static($variableName, $type, $isVariadic, $description, $isReference); + } + + /** + * Returns the variable's name. + */ + public function getVariableName(): ?string + { + return $this->variableName; + } + + /** + * Returns whether this tag is variadic. + */ + public function isVariadic(): bool + { + return $this->isVariadic; + } + + /** + * Returns whether this tag is passed by reference. + */ + public function isReference(): bool + { + return $this->isReference; + } + + /** + * Returns a string representation for this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $variableName = ''; + if ($this->variableName) { + $variableName .= ($this->isReference ? '&' : '') . ($this->isVariadic ? '...' : ''); + $variableName .= '$' . $this->variableName; + } + + $type = (string) $this->type; + + return $type + . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') + . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); + } + + private static function strStartsWithVariable(string $str): bool + { + return strpos($str, '$') === 0 + || + strpos($str, '...$') === 0 + || + strpos($str, '&$') === 0 + || + strpos($str, '&...$') === 0; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php new file mode 100644 index 00000000..2521fb3f --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php @@ -0,0 +1,121 @@ +name = 'property'; + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; + } + + public static function create( + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + + [$firstPart, $body] = self::extractTypeFromBody($body); + $type = null; + $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $variableName = ''; + + // if the first item that is encountered is not a variable; it is a type + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); + } + + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { + $variableName = array_shift($parts); + if ($type) { + array_shift($parts); + } + + Assert::notNull($variableName); + + $variableName = substr($variableName, 1); + } + + $description = $descriptionFactory->create(implode('', $parts), $context); + + return new static($variableName, $type, $description); + } + + /** + * Returns the variable's name. + */ + public function getVariableName(): ?string + { + return $this->variableName; + } + + /** + * Returns a string representation for this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + + $type = (string) $this->type; + + return $type + . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') + . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php new file mode 100644 index 00000000..9491b39c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php @@ -0,0 +1,121 @@ +name = 'property-read'; + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; + } + + public static function create( + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + + [$firstPart, $body] = self::extractTypeFromBody($body); + $type = null; + $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $variableName = ''; + + // if the first item that is encountered is not a variable; it is a type + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); + } + + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { + $variableName = array_shift($parts); + if ($type) { + array_shift($parts); + } + + Assert::notNull($variableName); + + $variableName = substr($variableName, 1); + } + + $description = $descriptionFactory->create(implode('', $parts), $context); + + return new static($variableName, $type, $description); + } + + /** + * Returns the variable's name. + */ + public function getVariableName(): ?string + { + return $this->variableName; + } + + /** + * Returns a string representation for this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + + $type = (string) $this->type; + + return $type + . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') + . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php new file mode 100644 index 00000000..2bfdac6a --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php @@ -0,0 +1,121 @@ +name = 'property-write'; + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; + } + + public static function create( + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + + [$firstPart, $body] = self::extractTypeFromBody($body); + $type = null; + $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $variableName = ''; + + // if the first item that is encountered is not a variable; it is a type + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); + } + + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { + $variableName = array_shift($parts); + if ($type) { + array_shift($parts); + } + + Assert::notNull($variableName); + + $variableName = substr($variableName, 1); + } + + $description = $descriptionFactory->create(implode('', $parts), $context); + + return new static($variableName, $type, $description); + } + + /** + * Returns the variable's name. + */ + public function getVariableName(): ?string + { + return $this->variableName; + } + + /** + * Returns a string representation for this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + + $type = (string) $this->type; + + return $type + . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') + . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php new file mode 100644 index 00000000..532003dd --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php @@ -0,0 +1,38 @@ +fqsen = $fqsen; + } + + /** + * @return string string representation of the referenced fqsen + */ + public function __toString(): string + { + return (string) $this->fqsen; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php new file mode 100644 index 00000000..e7dea868 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php @@ -0,0 +1,22 @@ +uri = $uri; + } + + public function __toString(): string + { + return $this->uri; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php new file mode 100644 index 00000000..f021b609 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php @@ -0,0 +1,64 @@ +name = 'return'; + $this->type = $type; + $this->description = $description; + } + + public static function create( + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + + [$type, $description] = self::extractTypeFromBody($body); + + $type = $typeResolver->resolve($type, $context); + $description = $descriptionFactory->create($description, $context); + + return new static($type, $description); + } + + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $type = $this->type ? '' . $this->type : 'mixed'; + + return $type . ($description !== '' ? ' ' . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php new file mode 100644 index 00000000..a194c7de --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php @@ -0,0 +1,106 @@ +refers = $refers; + $this->description = $description; + } + + public static function create( + string $body, + ?FqsenResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::notNull($descriptionFactory); + + $parts = Utils::pregSplit('/\s+/Su', $body, 2); + $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; + + // https://tools.ietf.org/html/rfc2396#section-3 + if (preg_match('#\w://\w#', $parts[0])) { + return new static(new Url($parts[0]), $description); + } + + return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description); + } + + private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context): Fqsen + { + Assert::notNull($fqsenResolver); + $fqsenParts = explode('::', $parts); + $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); + + if (!array_key_exists(1, $fqsenParts)) { + return $resolved; + } + + return new Fqsen($resolved . '::' . $fqsenParts[1]); + } + + /** + * Returns the ref of this tag. + */ + public function getReference(): Reference + { + return $this->refers; + } + + /** + * Returns a string representation of this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $refers = (string) $this->refers; + + return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php new file mode 100644 index 00000000..54af43cd --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php @@ -0,0 +1,103 @@ +version = $version; + $this->description = $description; + } + + public static function create( + ?string $body, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): ?self { + if (empty($body)) { + return new static(); + } + + $matches = []; + if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { + return null; + } + + Assert::notNull($descriptionFactory); + + return new static( + $matches[1], + $descriptionFactory->create($matches[2] ?? '', $context) + ); + } + + /** + * Gets the version section of the tag. + */ + public function getVersion(): ?string + { + return $this->version; + } + + /** + * Returns a string representation for this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $version = (string) $this->version; + + return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php new file mode 100644 index 00000000..8b8c0fb4 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php @@ -0,0 +1,116 @@ +startingLine = (int) $startingLine; + $this->lineCount = $lineCount !== null ? (int) $lineCount : null; + $this->description = $description; + } + + public static function create( + string $body, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::stringNotEmpty($body); + Assert::notNull($descriptionFactory); + + $startingLine = 1; + $lineCount = null; + $description = null; + + // Starting line / Number of lines / Description + if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $body, $matches)) { + $startingLine = (int) $matches[1]; + if (isset($matches[2]) && $matches[2] !== '') { + $lineCount = (int) $matches[2]; + } + + $description = $matches[3]; + } + + return new static($startingLine, $lineCount, $descriptionFactory->create($description ?? '', $context)); + } + + /** + * Gets the starting line. + * + * @return int The starting line, relative to the structural element's + * location. + */ + public function getStartingLine(): int + { + return $this->startingLine; + } + + /** + * Returns the number of lines. + * + * @return int|null The number of lines, relative to the starting line. NULL + * means "to the end". + */ + public function getLineCount(): ?int + { + return $this->lineCount; + } + + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $startingLine = (string) $this->startingLine; + + $lineCount = $this->lineCount !== null ? ' ' . $this->lineCount : ''; + + return $startingLine + . $lineCount + . ($description !== '' + ? ' ' . $description + : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php new file mode 100644 index 00000000..158578bd --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php @@ -0,0 +1,66 @@ +type; + } + + /** + * @return string[] + */ + protected static function extractTypeFromBody(string $body): array + { + $type = ''; + $nestingLevel = 0; + for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { + $character = $body[$i]; + + if ($nestingLevel === 0 && trim($character) === '') { + break; + } + + $type .= $character; + if (in_array($character, ['<', '(', '[', '{'])) { + $nestingLevel++; + continue; + } + + if (in_array($character, ['>', ')', ']', '}'])) { + $nestingLevel--; + continue; + } + } + + $description = trim(substr($body, strlen($type))); + + return [$type, $description]; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php new file mode 100644 index 00000000..f21c9101 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php @@ -0,0 +1,64 @@ +name = 'throws'; + $this->type = $type; + $this->description = $description; + } + + public static function create( + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + + [$type, $description] = self::extractTypeFromBody($body); + + $type = $typeResolver->resolve($type, $context); + $description = $descriptionFactory->create($description, $context); + + return new static($type, $description); + } + + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $type = (string) $this->type; + + return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php new file mode 100644 index 00000000..b72f4034 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php @@ -0,0 +1,100 @@ +refers = $refers; + $this->description = $description; + } + + public static function create( + string $body, + ?FqsenResolver $resolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::notNull($resolver); + Assert::notNull($descriptionFactory); + + $parts = Utils::pregSplit('/\s+/Su', $body, 2); + + return new static( + self::resolveFqsen($parts[0], $resolver, $context), + $descriptionFactory->create($parts[1] ?? '', $context) + ); + } + + private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context): Fqsen + { + Assert::notNull($fqsenResolver); + $fqsenParts = explode('::', $parts); + $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); + + if (!array_key_exists(1, $fqsenParts)) { + return $resolved; + } + + return new Fqsen($resolved . '::' . $fqsenParts[1]); + } + + /** + * Returns the structural element this tag refers to. + */ + public function getReference(): Fqsen + { + return $this->refers; + } + + /** + * Returns a string representation of this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $refers = (string) $this->refers; + + return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php new file mode 100644 index 00000000..fa1f9dbf --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php @@ -0,0 +1,122 @@ +name = 'var'; + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; + } + + public static function create( + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): self { + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + + [$firstPart, $body] = self::extractTypeFromBody($body); + + $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $type = null; + $variableName = ''; + + // if the first item that is encountered is not a variable; it is a type + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); + } + + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { + $variableName = array_shift($parts); + if ($type) { + array_shift($parts); + } + + Assert::notNull($variableName); + + $variableName = substr($variableName, 1); + } + + $description = $descriptionFactory->create(implode('', $parts), $context); + + return new static($variableName, $type, $description); + } + + /** + * Returns the variable's name. + */ + public function getVariableName(): ?string + { + return $this->variableName; + } + + /** + * Returns a string representation for this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + + $type = (string) $this->type; + + return $type + . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') + . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php new file mode 100644 index 00000000..f46e4b8c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php @@ -0,0 +1,106 @@ +version = $version; + $this->description = $description; + } + + public static function create( + ?string $body, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ): ?self { + if (empty($body)) { + return new static(); + } + + $matches = []; + if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { + return null; + } + + $description = null; + if ($descriptionFactory !== null) { + $description = $descriptionFactory->create($matches[2] ?? '', $context); + } + + return new static( + $matches[1], + $description + ); + } + + /** + * Gets the version section of the tag. + */ + public function getVersion(): ?string + { + return $this->version; + } + + /** + * Returns a string representation for this tag. + */ + public function __toString(): string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $version = (string) $this->version; + + return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php new file mode 100644 index 00000000..37f72dd2 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php @@ -0,0 +1,287 @@ +descriptionFactory = $descriptionFactory; + $this->tagFactory = $tagFactory; + } + + /** + * Factory method for easy instantiation. + * + * @param array> $additionalTags + */ + public static function createInstance(array $additionalTags = []): self + { + $fqsenResolver = new FqsenResolver(); + $tagFactory = new StandardTagFactory($fqsenResolver); + $descriptionFactory = new DescriptionFactory($tagFactory); + + $tagFactory->addService($descriptionFactory); + $tagFactory->addService(new TypeResolver($fqsenResolver)); + + $docBlockFactory = new self($descriptionFactory, $tagFactory); + foreach ($additionalTags as $tagName => $tagHandler) { + $docBlockFactory->registerTagHandler($tagName, $tagHandler); + } + + return $docBlockFactory; + } + + /** + * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the + * getDocComment method (such as a ReflectionClass object). + */ + public function create($docblock, ?Types\Context $context = null, ?Location $location = null): DocBlock + { + if (is_object($docblock)) { + if (!method_exists($docblock, 'getDocComment')) { + $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; + + throw new InvalidArgumentException($exceptionMessage); + } + + $docblock = $docblock->getDocComment(); + Assert::string($docblock); + } + + Assert::stringNotEmpty($docblock); + + if ($context === null) { + $context = new Types\Context(''); + } + + $parts = $this->splitDocBlock($this->stripDocComment($docblock)); + + [$templateMarker, $summary, $description, $tags] = $parts; + + return new DocBlock( + $summary, + $description ? $this->descriptionFactory->create($description, $context) : null, + $this->parseTagBlock($tags, $context), + $context, + $location, + $templateMarker === '#@+', + $templateMarker === '#@-' + ); + } + + /** + * @param class-string $handler + */ + public function registerTagHandler(string $tagName, string $handler): void + { + $this->tagFactory->registerTagHandler($tagName, $handler); + } + + /** + * Strips the asterisks from the DocBlock comment. + * + * @param string $comment String containing the comment text. + */ + private function stripDocComment(string $comment): string + { + $comment = preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]?(.*)?#u', '$1', $comment); + Assert::string($comment); + $comment = trim($comment); + + // reg ex above is not able to remove */ from a single line docblock + if (substr($comment, -2) === '*/') { + $comment = trim(substr($comment, 0, -2)); + } + + return str_replace(["\r\n", "\r"], "\n", $comment); + } + + // phpcs:disable + /** + * Splits the DocBlock into a template marker, summary, description and block of tags. + * + * @param string $comment Comment to split into the sub-parts. + * + * @return string[] containing the template marker (if any), summary, description and a string containing the tags. + * + * @author Mike van Riel for extending the regex with template marker support. + * + * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. + */ + private function splitDocBlock(string $comment) : array + { + // phpcs:enable + // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This + // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the + // performance impact of running a regular expression + if (strpos($comment, '@') === 0) { + return ['', '', '', $comment]; + } + + // clears all extra horizontal whitespace from the line endings to prevent parsing issues + $comment = preg_replace('/\h*$/Sum', '', $comment); + Assert::string($comment); + /* + * Splits the docblock into a template marker, summary, description and tags section. + * + * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may + * occur after it and will be stripped). + * - The short description is started from the first character until a dot is encountered followed by a + * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing + * errors). This is optional. + * - The long description, any character until a new line is encountered followed by an @ and word + * characters (a tag). This is optional. + * - Tags; the remaining characters + * + * Big thanks to RichardJ for contributing this Regular Expression + */ + preg_match( + '/ + \A + # 1. Extract the template marker + (?:(\#\@\+|\#\@\-)\n?)? + + # 2. Extract the summary + (?: + (?! @\pL ) # The summary may not start with an @ + ( + [^\n.]+ + (?: + (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines + [\n.]* (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line + [^\n.]+ # Include anything else + )* + \.? + )? + ) + + # 3. Extract the description + (?: + \s* # Some form of whitespace _must_ precede a description because a summary must be there + (?! @\pL ) # The description may not start with an @ + ( + [^\n]+ + (?: \n+ + (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line + [^\n]+ # Include anything else + )* + ) + )? + + # 4. Extract the tags (anything that follows) + (\s+ [\s\S]*)? # everything that follows + /ux', + $comment, + $matches + ); + array_shift($matches); + + while (count($matches) < 4) { + $matches[] = ''; + } + + return $matches; + } + + /** + * Creates the tag objects. + * + * @param string $tags Tag block to parse. + * @param Types\Context $context Context of the parsed Tag + * + * @return DocBlock\Tag[] + */ + private function parseTagBlock(string $tags, Types\Context $context): array + { + $tags = $this->filterTagBlock($tags); + if ($tags === null) { + return []; + } + + $result = []; + $lines = $this->splitTagBlockIntoTagLines($tags); + foreach ($lines as $key => $tagLine) { + $result[$key] = $this->tagFactory->create(trim($tagLine), $context); + } + + return $result; + } + + /** + * @return string[] + */ + private function splitTagBlockIntoTagLines(string $tags): array + { + $result = []; + foreach (explode("\n", $tags) as $tagLine) { + if ($tagLine !== '' && strpos($tagLine, '@') === 0) { + $result[] = $tagLine; + } else { + $result[count($result) - 1] .= "\n" . $tagLine; + } + } + + return $result; + } + + private function filterTagBlock(string $tags): ?string + { + $tags = trim($tags); + if (!$tags) { + return null; + } + + if ($tags[0] !== '@') { + // @codeCoverageIgnoreStart + // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that + // we didn't foresee. + + throw new LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); + + // @codeCoverageIgnoreEnd + } + + return $tags; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php new file mode 100644 index 00000000..9995c0c0 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php @@ -0,0 +1,23 @@ +> $additionalTags + */ + public static function createInstance(array $additionalTags = []): DocBlockFactory; + + /** + * @param string|object $docblock + */ + public function create($docblock, ?Types\Context $context = null, ?Location $location = null): DocBlock; +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php b/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php new file mode 100644 index 00000000..b8b6da8c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php @@ -0,0 +1,44 @@ + please note that if you want to pass partial class names that additional steps are necessary, see the + > chapter `Resolving partial classes and FQSENs` for more information. + +Where the FqsenResolver can resolve: + +- Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`) +- Function expressions (i.e. `@see \MyNamespace\myFunction()`) +- Class expressions (i.e. `@see \MyNamespace\MyClass`) +- Interface expressions (i.e. `@see \MyNamespace\MyInterface`) +- Trait expressions (i.e. `@see \MyNamespace\MyTrait`) +- Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`) +- Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`) +- Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`) + +## Resolving a type + +In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` and call its `resolve` method like this: + +```php +$typeResolver = new \phpDocumentor\Reflection\TypeResolver(); +$type = $typeResolver->resolve('string|integer'); +``` + +In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two +elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type +`\phpDocumentor\Reflection\Types\Integer`. + +The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. + +### Resolving nullable types + +Php 7.1 introduced nullable types e.g. `?string`. Type resolver will resolve the original type without the nullable notation `?` +just like it would do without the `?`. After that the type is wrapped in a `\phpDocumentor\Reflection\Types\Nullable` object. +The `Nullable` type has a method to fetch the actual type. + +## Resolving an FQSEN + +A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: + +```php +$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); +$fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()'); +``` + +In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. + +The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. + +## Resolving partial Classes and Structural Element Names + +Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class names. + +For example, you have this file: + +```php +namespace My\Example; + +use phpDocumentor\Reflection\Types; + +class Classy +{ + /** + * @var Types\Context + * @see Classy::otherFunction() + */ + public function __construct($context) {} + + public function otherFunction(){} +} +``` + +Suppose that you would want to resolve (and expand) the type in the `@var` tag and the element name in the `@see` tag. + +For the resolvers to know how to expand partial names you have to provide a bit of _Context_ for them by instantiating a new class named `\phpDocumentor\Reflection\Types\Context` with the name of the namespace and the aliases that are in play. + +### Creating a Context + +You can do this by manually creating a Context like this: + +```php +$context = new \phpDocumentor\Reflection\Types\Context( + '\My\Example', + [ 'Types' => '\phpDocumentor\Reflection\Types'] +); +``` + +Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector object or by providing the namespace that you'd like to extract and the source code of the file in which the given type expression occurs. + +```php +$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); +$context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct')); +``` + +or + +```php +$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); +$context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php')); +``` + +### Using the Context + +After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver class as second argument and the Resolvers will take this into account when resolving partial names. + +To obtain the resolved class name for the `@var` tag in the example above you can do: + +```php +$typeResolver = new \phpDocumentor\Reflection\TypeResolver(); +$type = $typeResolver->resolve('Types\Context', $context); +``` + +When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be `phpDocumentor\Reflection\Types\Context`. + +> Why is the FQSEN wrapped in another object `Object_`? +> +> The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. + +Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To resolve that you can do the following: + +```php +$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); +$type = $fqsenResolver->resolve('Classy::otherFunction()', $context); +``` + +Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the `resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to `\My\Example\Classy::otherFunction()`. diff --git a/vendor/phpdocumentor/type-resolver/composer.json b/vendor/phpdocumentor/type-resolver/composer.json new file mode 100644 index 00000000..4dbf6237 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/composer.json @@ -0,0 +1,35 @@ +{ + "name": "phpdocumentor/type-resolver", + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "phpDocumentor\\Reflection\\": ["tests/unit", "tests/benchmark"] + } + }, + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php b/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php new file mode 100644 index 00000000..068fa208 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php @@ -0,0 +1,80 @@ +isFqsen($fqsen)) { + return new Fqsen($fqsen); + } + + return $this->resolvePartialStructuralElementName($fqsen, $context); + } + + /** + * Tests whether the given type is a Fully Qualified Structural Element Name. + */ + private function isFqsen(string $type): bool + { + return strpos($type, self::OPERATOR_NAMESPACE) === 0; + } + + /** + * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation + * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. + * + * @throws InvalidArgumentException When type is not a valid FQSEN. + */ + private function resolvePartialStructuralElementName(string $type, Context $context): Fqsen + { + $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); + + $namespaceAliases = $context->getNamespaceAliases(); + + // if the first segment is not an alias; prepend namespace name and return + if (!isset($namespaceAliases[$typeParts[0]])) { + $namespace = $context->getNamespace(); + if ($namespace !== '') { + $namespace .= self::OPERATOR_NAMESPACE; + } + + return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); + } + + $typeParts[0] = $namespaceAliases[$typeParts[0]]; + + return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoType.php b/vendor/phpdocumentor/type-resolver/src/PseudoType.php new file mode 100644 index 00000000..dd91ed79 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoType.php @@ -0,0 +1,19 @@ +minValue = $minValue; + $this->maxValue = $maxValue; + } + + public function underlyingType(): Type + { + return new Integer(); + } + + public function getMinValue(): string + { + return $this->minValue; + } + + public function getMaxValue(): string + { + return $this->maxValue; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString(): string + { + return 'int<' . $this->minValue . ', ' . $this->maxValue . '>'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.php new file mode 100644 index 00000000..f9f0c6b5 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.php @@ -0,0 +1,50 @@ +valueType instanceof Mixed_) { + return 'list'; + } + + return 'list<' . $this->valueType . '>'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php new file mode 100644 index 00000000..690f782b --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php @@ -0,0 +1,39 @@ + List of recognized keywords and unto which Value Object they map + * @psalm-var array> + */ + private $keywords = [ + 'string' => Types\String_::class, + 'class-string' => Types\ClassString::class, + 'interface-string' => Types\InterfaceString::class, + 'html-escaped-string' => PseudoTypes\HtmlEscapedString::class, + 'lowercase-string' => PseudoTypes\LowercaseString::class, + 'non-empty-lowercase-string' => PseudoTypes\NonEmptyLowercaseString::class, + 'non-empty-string' => PseudoTypes\NonEmptyString::class, + 'numeric-string' => PseudoTypes\NumericString::class, + 'numeric' => PseudoTypes\Numeric_::class, + 'trait-string' => PseudoTypes\TraitString::class, + 'int' => Types\Integer::class, + 'integer' => Types\Integer::class, + 'positive-int' => PseudoTypes\PositiveInteger::class, + 'negative-int' => PseudoTypes\NegativeInteger::class, + 'bool' => Types\Boolean::class, + 'boolean' => Types\Boolean::class, + 'real' => Types\Float_::class, + 'float' => Types\Float_::class, + 'double' => Types\Float_::class, + 'object' => Types\Object_::class, + 'mixed' => Types\Mixed_::class, + 'array' => Types\Array_::class, + 'array-key' => Types\ArrayKey::class, + 'resource' => Types\Resource_::class, + 'void' => Types\Void_::class, + 'null' => Types\Null_::class, + 'scalar' => Types\Scalar::class, + 'callback' => Types\Callable_::class, + 'callable' => Types\Callable_::class, + 'callable-string' => PseudoTypes\CallableString::class, + 'false' => PseudoTypes\False_::class, + 'true' => PseudoTypes\True_::class, + 'literal-string' => PseudoTypes\LiteralString::class, + 'self' => Types\Self_::class, + '$this' => Types\This::class, + 'static' => Types\Static_::class, + 'parent' => Types\Parent_::class, + 'iterable' => Types\Iterable_::class, + 'never' => Types\Never_::class, + 'list' => PseudoTypes\List_::class, + ]; + + /** + * @var FqsenResolver + * @psalm-readonly + */ + private $fqsenResolver; + + /** + * Initializes this TypeResolver with the means to create and resolve Fqsen objects. + */ + public function __construct(?FqsenResolver $fqsenResolver = null) + { + $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); + } + + /** + * Analyzes the given type and returns the FQCN variant. + * + * When a type is provided this method checks whether it is not a keyword or + * Fully Qualified Class Name. If so it will use the given namespace and + * aliases to expand the type to a FQCN representation. + * + * This method only works as expected if the namespace and aliases are set; + * no dynamic reflection is being performed here. + * + * @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. + */ + public function resolve(string $type, ?Context $context = null): Type + { + $type = trim($type); + if (!$type) { + throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); + } + + if ($context === null) { + $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 + ); + + if ($tokens === false) { + throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); + } + + /** @var ArrayIterator $tokenIterator */ + $tokenIterator = new ArrayIterator($tokens); + + return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); + } + + /** + * 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 + { + $types = []; + $token = ''; + $compoundToken = '|'; + while ($tokens->valid()) { + $token = $tokens->current(); + if ($token === null) { + throw new RuntimeException( + 'Unexpected nullable character' + ); + } + + if ($token === '|' || $token === '&') { + if (count($types) === 0) { + throw new RuntimeException( + 'A type is missing before a type separator' + ); + } + + if ( + !in_array($parserContext, [ + self::PARSER_IN_COMPOUND, + self::PARSER_IN_ARRAY_EXPRESSION, + self::PARSER_IN_COLLECTION_EXPRESSION, + ], true) + ) { + throw new RuntimeException( + 'Unexpected type separator' + ); + } + + $compoundToken = $token; + $tokens->next(); + } elseif ($token === '?') { + if ( + !in_array($parserContext, [ + self::PARSER_IN_COMPOUND, + self::PARSER_IN_ARRAY_EXPRESSION, + self::PARSER_IN_COLLECTION_EXPRESSION, + ], true) + ) { + throw new RuntimeException( + 'Unexpected nullable character' + ); + } + + $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); + + $token = $tokens->current(); + if ($token === null) { // Someone did not properly close their array expression .. + break; + } + + $tokens->next(); + + $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) { + end($types); + $last = key($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 { + $type = $this->resolveSingleType($token, $context); + $tokens->next(); + if ($parserContext === self::PARSER_IN_NULLABLE) { + return $type; + } + + $types[] = $type; + } + } + + 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' + ); + } + + 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); + } + + if ($compoundToken === '|') { + return new Compound(array_values($types)); + } + + return new Intersection(array_values($types)); + } + + /** + * resolve the given type into a type object + * + * @param string $type the type string, representing a single type + * + * @return Type|Array_|Object_ + * + * @psalm-mutation-free + */ + private function resolveSingleType(string $type, Context $context): object + { + switch (true) { + case $this->isKeyword($type): + return $this->resolveKeyword($type); + + case $this->isFqsen($type): + return $this->resolveTypedObject($type); + + case $this->isPartialStructuralElementName($type): + return $this->resolveTypedObject($type, $context); + + // @codeCoverageIgnoreStart + default: + // I haven't got the foggiest how the logic would come here but added this as a defense. + throw new RuntimeException( + 'Unable to resolve type "' . $type . '", there is no known method to resolve it' + ); + } + + // @codeCoverageIgnoreEnd + } + + /** + * Adds a keyword to the list of Keywords and associates it with a specific Value Object. + * + * @psalm-param class-string $typeClassName + */ + public function addKeyword(string $keyword, string $typeClassName): void + { + if (!class_exists($typeClassName)) { + throw new InvalidArgumentException( + 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' + . ' but we could not find the class ' . $typeClassName + ); + } + + $interfaces = class_implements($typeClassName); + if ($interfaces === false) { + throw new InvalidArgumentException( + 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' + . ' but we could not find the class ' . $typeClassName + ); + } + + if (!in_array(Type::class, $interfaces, true)) { + throw new InvalidArgumentException( + 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"' + ); + } + + $this->keywords[$keyword] = $typeClassName; + } + + /** + * Detects whether the given type represents a PHPDoc keyword. + * + * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. + * + * @psalm-mutation-free + */ + private function isKeyword(string $type): bool + { + return array_key_exists(strtolower($type), $this->keywords); + } + + /** + * Detects whether the given type represents a relative structural element name. + * + * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. + * + * @psalm-mutation-free + */ + private function isPartialStructuralElementName(string $type): bool + { + return (isset($type[0]) && $type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type); + } + + /** + * Tests whether the given type is a Fully Qualified Structural Element Name. + * + * @psalm-mutation-free + */ + private function isFqsen(string $type): bool + { + return strpos($type, self::OPERATOR_NAMESPACE) === 0; + } + + /** + * Resolves the given keyword (such as `string`) into a Type object representing that keyword. + * + * @psalm-mutation-free + */ + private function resolveKeyword(string $type): Type + { + $className = $this->keywords[strtolower($type)]; + + return new $className(); + } + + /** + * Resolves the given FQSEN string into an FQSEN object. + * + * @psalm-mutation-free + */ + private function resolveTypedObject(string $type, ?Context $context = null): Object_ + { + return new Object_($this->fqsenResolver->resolve($type, $context)); + } + + /** + * Resolves class string + * + * @param ArrayIterator $tokens + */ + private function resolveClassString(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 class string' + ); + } + + $token = $tokens->current(); + if ($token !== '>') { + if (empty($token)) { + throw new RuntimeException( + 'class-string: ">" is missing' + ); + } + + throw new RuntimeException( + 'Unexpected character "' . $token . '", ">" is missing' + ); + } + + return new ClassString($classType->getFqsen()); + } + + /** + * Resolves integer ranges + * + * @param ArrayIterator $tokens + */ + private function resolveIntRange(ArrayIterator $tokens): 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) + ) { + throw new RuntimeException( + $classType . ' is not a collection' + ); + } + + $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' + ); + } + } + } + } + + $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' + ); + } + + 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); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php b/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php new file mode 100644 index 00000000..b674862a --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php @@ -0,0 +1,83 @@ +valueType = $valueType; + $this->defaultKeyType = new Compound([new String_(), new Integer()]); + $this->keyType = $keyType; + } + + /** + * Returns the type for the keys of this array. + */ + public function getKeyType(): Type + { + return $this->keyType ?? $this->defaultKeyType; + } + + /** + * Returns the value for the keys of this array. + */ + public function getValueType(): Type + { + return $this->valueType; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString(): string + { + if ($this->keyType) { + return 'array<' . $this->keyType . ',' . $this->valueType . '>'; + } + + if ($this->valueType instanceof Mixed_) { + return 'array'; + } + + if ($this->valueType instanceof Compound) { + return '(' . $this->valueType . ')[]'; + } + + return $this->valueType . '[]'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php b/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php new file mode 100644 index 00000000..472a1cdc --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php @@ -0,0 +1,125 @@ + + */ +abstract class AggregatedType implements Type, IteratorAggregate +{ + /** + * @psalm-allow-private-mutation + * @var array + */ + private $types = []; + + /** @var string */ + private $token; + + /** + * @param array $types + */ + public function __construct(array $types, string $token) + { + foreach ($types as $type) { + $this->add($type); + } + + $this->token = $token; + } + + /** + * Returns the type at the given index. + */ + public function get(int $index): ?Type + { + if (!$this->has($index)) { + return null; + } + + return $this->types[$index]; + } + + /** + * Tests if this compound type has a type with the given index. + */ + public function has(int $index): bool + { + return array_key_exists($index, $this->types); + } + + /** + * Tests if this compound type contains the given type. + */ + public function contains(Type $type): bool + { + foreach ($this->types as $typePart) { + // if the type is duplicate; do not add it + if ((string) $typePart === (string) $type) { + return true; + } + } + + return false; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString(): string + { + return implode($this->token, $this->types); + } + + /** + * @return ArrayIterator + */ + public function getIterator(): ArrayIterator + { + return new ArrayIterator($this->types); + } + + /** + * @psalm-suppress ImpureMethodCall + */ + private function add(Type $type): void + { + if ($type instanceof self) { + foreach ($type->getIterator() as $subType) { + $this->add($subType); + } + + return; + } + + // if the type is duplicate; do not add it + if ($this->contains($type)) { + return; + } + + $this->types[] = $type; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.php b/vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.php new file mode 100644 index 00000000..cf86df00 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.php @@ -0,0 +1,42 @@ +fqsen = $fqsen; + } + + public function underlyingType(): Type + { + return new String_(); + } + + /** + * Returns the FQSEN associated with this object. + */ + public function getFqsen(): ?Fqsen + { + return $this->fqsen; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString(): string + { + if ($this->fqsen === null) { + return 'class-string'; + } + + return 'class-string<' . (string) $this->fqsen . '>'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Collection.php b/vendor/phpdocumentor/type-resolver/src/Types/Collection.php new file mode 100644 index 00000000..943cc22e --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Collection.php @@ -0,0 +1,68 @@ +` + * 2. `ACollectionObject` + * + * - ACollectionObject can be 'array' or an object that can act as an array + * - aValueType and aKeyType can be any type expression + * + * @psalm-immutable + */ +final class Collection extends AbstractList +{ + /** @var Fqsen|null */ + private $fqsen; + + /** + * Initializes this representation of an array with the given Type or Fqsen. + */ + public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) + { + parent::__construct($valueType, $keyType); + + $this->fqsen = $fqsen; + } + + /** + * Returns the FQSEN associated with this object. + */ + public function getFqsen(): ?Fqsen + { + return $this->fqsen; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString(): string + { + $objectType = (string) ($this->fqsen ?? 'object'); + + if ($this->keyType === null) { + return $objectType . '<' . $this->valueType . '>'; + } + + return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php new file mode 100644 index 00000000..ad426cc2 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php @@ -0,0 +1,38 @@ + $types + */ + public function __construct(array $types) + { + parent::__construct($types, '|'); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Context.php b/vendor/phpdocumentor/type-resolver/src/Types/Context.php new file mode 100644 index 00000000..79aadaf8 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Context.php @@ -0,0 +1,95 @@ + Fully Qualified Namespace. + * @psalm-var array + */ + private $namespaceAliases; + + /** + * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) + * format (without a preceding `\`). + * + * @param string $namespace The namespace where this DocBlock resides in. + * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. + * @psalm-param array $namespaceAliases + */ + public function __construct(string $namespace, array $namespaceAliases = []) + { + $this->namespace = $namespace !== 'global' && $namespace !== 'default' + ? trim($namespace, '\\') + : ''; + + foreach ($namespaceAliases as $alias => $fqnn) { + if ($fqnn[0] === '\\') { + $fqnn = substr($fqnn, 1); + } + + if ($fqnn[strlen($fqnn) - 1] === '\\') { + $fqnn = substr($fqnn, 0, -1); + } + + $namespaceAliases[$alias] = $fqnn; + } + + $this->namespaceAliases = $namespaceAliases; + } + + /** + * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. + */ + public function getNamespace(): string + { + return $this->namespace; + } + + /** + * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent + * the alias for the imported Namespace. + * + * @return string[] + * @psalm-return array + */ + public function getNamespaceAliases(): array + { + return $this->namespaceAliases; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php b/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php new file mode 100644 index 00000000..892ee0f9 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php @@ -0,0 +1,420 @@ + $reflector */ + + return $this->createFromReflectionClass($reflector); + } + + if ($reflector instanceof ReflectionParameter) { + return $this->createFromReflectionParameter($reflector); + } + + if ($reflector instanceof ReflectionMethod) { + return $this->createFromReflectionMethod($reflector); + } + + if ($reflector instanceof ReflectionProperty) { + return $this->createFromReflectionProperty($reflector); + } + + if ($reflector instanceof ReflectionClassConstant) { + return $this->createFromReflectionClassConstant($reflector); + } + + throw new UnexpectedValueException('Unhandled \Reflector instance given: ' . get_class($reflector)); + } + + private function createFromReflectionParameter(ReflectionParameter $parameter): Context + { + $class = $parameter->getDeclaringClass(); + if (!$class) { + throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); + } + + return $this->createFromReflectionClass($class); + } + + private function createFromReflectionMethod(ReflectionMethod $method): Context + { + $class = $method->getDeclaringClass(); + + return $this->createFromReflectionClass($class); + } + + private function createFromReflectionProperty(ReflectionProperty $property): Context + { + $class = $property->getDeclaringClass(); + + return $this->createFromReflectionClass($class); + } + + private function createFromReflectionClassConstant(ReflectionClassConstant $constant): Context + { + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @phpstan-var ReflectionClass $class */ + $class = $constant->getDeclaringClass(); + + return $this->createFromReflectionClass($class); + } + + /** + * @phpstan-param ReflectionClass $class + */ + private function createFromReflectionClass(ReflectionClass $class): Context + { + $fileName = $class->getFileName(); + $namespace = $class->getNamespaceName(); + + if (is_string($fileName) && file_exists($fileName)) { + $contents = file_get_contents($fileName); + if ($contents === false) { + throw new RuntimeException('Unable to read file "' . $fileName . '"'); + } + + return $this->createForNamespace($namespace, $contents); + } + + return new Context($namespace, []); + } + + /** + * Build a Context for a namespace in the provided file contents. + * + * @see Context for more information on Contexts. + * + * @param string $namespace It does not matter if a `\` precedes the namespace name, + * this method first normalizes. + * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. + */ + public function createForNamespace(string $namespace, string $fileContents): Context + { + $namespace = trim($namespace, '\\'); + $useStatements = []; + $currentNamespace = ''; + $tokens = new ArrayIterator(token_get_all($fileContents)); + + while ($tokens->valid()) { + $currentToken = $tokens->current(); + switch ($currentToken[0]) { + case T_NAMESPACE: + $currentNamespace = $this->parseNamespace($tokens); + break; + case T_CLASS: + // Fast-forward the iterator through the class so that any + // T_USE tokens found within are skipped - these are not + // valid namespace use statements so should be ignored. + $braceLevel = 0; + $firstBraceFound = false; + while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { + $currentToken = $tokens->current(); + if ( + $currentToken === '{' + || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], true) + ) { + if (!$firstBraceFound) { + $firstBraceFound = true; + } + + ++$braceLevel; + } + + if ($currentToken === '}') { + --$braceLevel; + } + + $tokens->next(); + } + + break; + case T_USE: + if ($currentNamespace === $namespace) { + $useStatements += $this->parseUseStatement($tokens); + } + + break; + } + + $tokens->next(); + } + + return new Context($namespace, $useStatements); + } + + /** + * Deduce the name from tokens when we are at the T_NAMESPACE token. + * + * @param ArrayIterator $tokens + */ + private function parseNamespace(ArrayIterator $tokens): string + { + // skip to the first string or namespace separator + $this->skipToNextStringOrNamespaceSeparator($tokens); + + $name = ''; + $acceptedTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED]; + while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, true)) { + $name .= $tokens->current()[1]; + $tokens->next(); + } + + return $name; + } + + /** + * Deduce the names of all imports when we are at the T_USE token. + * + * @param ArrayIterator $tokens + * + * @return string[] + * @psalm-return array + */ + private function parseUseStatement(ArrayIterator $tokens): array + { + $uses = []; + + while ($tokens->valid()) { + $this->skipToNextStringOrNamespaceSeparator($tokens); + + $uses += $this->extractUseStatements($tokens); + $currentToken = $tokens->current(); + if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { + return $uses; + } + } + + return $uses; + } + + /** + * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. + * + * @param ArrayIterator $tokens + */ + private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens): void + { + while ($tokens->valid()) { + $currentToken = $tokens->current(); + if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], true)) { + break; + } + + if ($currentToken[0] === T_NAME_QUALIFIED) { + break; + } + + if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === T_NAME_FULLY_QUALIFIED) { + break; + } + + $tokens->next(); + } + } + + /** + * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of + * a USE statement yet. This will return a key/value array of the alias => namespace. + * + * @param ArrayIterator $tokens + * + * @return string[] + * @psalm-return array + * + * @psalm-suppress TypeDoesNotContainType + */ + private function extractUseStatements(ArrayIterator $tokens): array + { + $extractedUseStatements = []; + $groupedNs = ''; + $currentNs = ''; + $currentAlias = ''; + $state = 'start'; + + while ($tokens->valid()) { + $currentToken = $tokens->current(); + $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; + $tokenValue = is_string($currentToken) ? null : $currentToken[1]; + switch ($state) { + case 'start': + switch ($tokenId) { + case T_STRING: + case T_NS_SEPARATOR: + $currentNs .= (string) $tokenValue; + $currentAlias = $tokenValue; + break; + case T_NAME_QUALIFIED: + case T_NAME_FULLY_QUALIFIED: + $currentNs .= (string) $tokenValue; + $currentAlias = substr( + (string) $tokenValue, + (int) (strrpos((string) $tokenValue, '\\')) + 1 + ); + break; + case T_CURLY_OPEN: + case '{': + $state = 'grouped'; + $groupedNs = $currentNs; + break; + case T_AS: + $state = 'start-alias'; + break; + case self::T_LITERAL_USE_SEPARATOR: + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + + break; + case 'start-alias': + switch ($tokenId) { + case T_STRING: + $currentAlias = $tokenValue; + break; + case self::T_LITERAL_USE_SEPARATOR: + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + + break; + case 'grouped': + switch ($tokenId) { + case T_STRING: + case T_NS_SEPARATOR: + $currentNs .= (string) $tokenValue; + $currentAlias = $tokenValue; + break; + case T_AS: + $state = 'grouped-alias'; + break; + case self::T_LITERAL_USE_SEPARATOR: + $state = 'grouped'; + $extractedUseStatements[(string) $currentAlias] = $currentNs; + $currentNs = $groupedNs; + $currentAlias = ''; + break; + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + + break; + case 'grouped-alias': + switch ($tokenId) { + case T_STRING: + $currentAlias = $tokenValue; + break; + case self::T_LITERAL_USE_SEPARATOR: + $state = 'grouped'; + $extractedUseStatements[(string) $currentAlias] = $currentNs; + $currentNs = $groupedNs; + $currentAlias = ''; + break; + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + } + + if ($state === 'end') { + break; + } + + $tokens->next(); + } + + if ($groupedNs !== $currentNs) { + $extractedUseStatements[(string) $currentAlias] = $currentNs; + } + + return $extractedUseStatements; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Expression.php b/vendor/phpdocumentor/type-resolver/src/Types/Expression.php new file mode 100644 index 00000000..da5f65d5 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Expression.php @@ -0,0 +1,51 @@ +valueType = $valueType; + } + + /** + * Returns the value for the keys of this array. + */ + public function getValueType(): Type + { + return $this->valueType; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString(): string + { + return '(' . $this->valueType . ')'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Float_.php b/vendor/phpdocumentor/type-resolver/src/Types/Float_.php new file mode 100644 index 00000000..86138c0e --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Float_.php @@ -0,0 +1,32 @@ +fqsen = $fqsen; + } + + /** + * Returns the FQSEN associated with this object. + */ + public function getFqsen(): ?Fqsen + { + return $this->fqsen; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString(): string + { + if ($this->fqsen === null) { + return 'interface-string'; + } + + return 'interface-string<' . (string) $this->fqsen . '>'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php b/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php new file mode 100644 index 00000000..ced37b62 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php @@ -0,0 +1,37 @@ + $types + */ + public function __construct(array $types) + { + parent::__construct($types, '&'); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php b/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php new file mode 100644 index 00000000..1ca069f2 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php @@ -0,0 +1,38 @@ +keyType) { + return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; + } + + if ($this->valueType instanceof Mixed_) { + return 'iterable'; + } + + return 'iterable<' . $this->valueType . '>'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php b/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php new file mode 100644 index 00000000..56d1b6da --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php @@ -0,0 +1,32 @@ +realType = $realType; + } + + /** + * Provide access to the actual type directly, if needed. + */ + public function getActualType(): Type + { + return $this->realType; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString(): string + { + return '?' . $this->realType->__toString(); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Object_.php b/vendor/phpdocumentor/type-resolver/src/Types/Object_.php new file mode 100644 index 00000000..90dee57a --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Object_.php @@ -0,0 +1,69 @@ +fqsen = $fqsen; + } + + /** + * Returns the FQSEN associated with this object. + */ + public function getFqsen(): ?Fqsen + { + return $this->fqsen; + } + + public function __toString(): string + { + if ($this->fqsen) { + return (string) $this->fqsen; + } + + return 'object'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php b/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php new file mode 100644 index 00000000..34838599 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php @@ -0,0 +1,34 @@ +log(LogLevel::EMERGENCY, $message, $context); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function alert($message, array $context = array()) + { + $this->log(LogLevel::ALERT, $message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function critical($message, array $context = array()) + { + $this->log(LogLevel::CRITICAL, $message, $context); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function error($message, array $context = array()) + { + $this->log(LogLevel::ERROR, $message, $context); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function warning($message, array $context = array()) + { + $this->log(LogLevel::WARNING, $message, $context); + } + + /** + * Normal but significant events. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function notice($message, array $context = array()) + { + $this->log(LogLevel::NOTICE, $message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function info($message, array $context = array()) + { + $this->log(LogLevel::INFO, $message, $context); + } + + /** + * Detailed debug information. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function debug($message, array $context = array()) + { + $this->log(LogLevel::DEBUG, $message, $context); + } +} diff --git a/vendor/psr/log/Psr/Log/InvalidArgumentException.php b/vendor/psr/log/Psr/Log/InvalidArgumentException.php new file mode 100644 index 00000000..67f852d1 --- /dev/null +++ b/vendor/psr/log/Psr/Log/InvalidArgumentException.php @@ -0,0 +1,7 @@ +logger = $logger; + } +} diff --git a/vendor/psr/log/Psr/Log/LoggerInterface.php b/vendor/psr/log/Psr/Log/LoggerInterface.php new file mode 100644 index 00000000..2206cfde --- /dev/null +++ b/vendor/psr/log/Psr/Log/LoggerInterface.php @@ -0,0 +1,125 @@ +log(LogLevel::EMERGENCY, $message, $context); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function alert($message, array $context = array()) + { + $this->log(LogLevel::ALERT, $message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function critical($message, array $context = array()) + { + $this->log(LogLevel::CRITICAL, $message, $context); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function error($message, array $context = array()) + { + $this->log(LogLevel::ERROR, $message, $context); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function warning($message, array $context = array()) + { + $this->log(LogLevel::WARNING, $message, $context); + } + + /** + * Normal but significant events. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function notice($message, array $context = array()) + { + $this->log(LogLevel::NOTICE, $message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function info($message, array $context = array()) + { + $this->log(LogLevel::INFO, $message, $context); + } + + /** + * Detailed debug information. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function debug($message, array $context = array()) + { + $this->log(LogLevel::DEBUG, $message, $context); + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + * + * @return void + * + * @throws \Psr\Log\InvalidArgumentException + */ + abstract public function log($level, $message, array $context = array()); +} diff --git a/vendor/psr/log/Psr/Log/NullLogger.php b/vendor/psr/log/Psr/Log/NullLogger.php new file mode 100644 index 00000000..c8f7293b --- /dev/null +++ b/vendor/psr/log/Psr/Log/NullLogger.php @@ -0,0 +1,30 @@ +logger) { }` + * blocks. + */ +class NullLogger extends AbstractLogger +{ + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + * + * @return void + * + * @throws \Psr\Log\InvalidArgumentException + */ + public function log($level, $message, array $context = array()) + { + // noop + } +} diff --git a/vendor/psr/log/Psr/Log/Test/DummyTest.php b/vendor/psr/log/Psr/Log/Test/DummyTest.php new file mode 100644 index 00000000..9638c110 --- /dev/null +++ b/vendor/psr/log/Psr/Log/Test/DummyTest.php @@ -0,0 +1,18 @@ + ". + * + * Example ->error('Foo') would yield "error Foo". + * + * @return string[] + */ + abstract public function getLogs(); + + public function testImplements() + { + $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger()); + } + + /** + * @dataProvider provideLevelsAndMessages + */ + public function testLogsAtAllLevels($level, $message) + { + $logger = $this->getLogger(); + $logger->{$level}($message, array('user' => 'Bob')); + $logger->log($level, $message, array('user' => 'Bob')); + + $expected = array( + $level.' message of level '.$level.' with context: Bob', + $level.' message of level '.$level.' with context: Bob', + ); + $this->assertEquals($expected, $this->getLogs()); + } + + public function provideLevelsAndMessages() + { + return array( + LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), + LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), + LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), + LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), + LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), + LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), + LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), + LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), + ); + } + + /** + * @expectedException \Psr\Log\InvalidArgumentException + */ + public function testThrowsOnInvalidLevel() + { + $logger = $this->getLogger(); + $logger->log('invalid level', 'Foo'); + } + + public function testContextReplacement() + { + $logger = $this->getLogger(); + $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); + + $expected = array('info {Message {nothing} Bob Bar a}'); + $this->assertEquals($expected, $this->getLogs()); + } + + public function testObjectCastToString() + { + if (method_exists($this, 'createPartialMock')) { + $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString')); + } else { + $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString')); + } + $dummy->expects($this->once()) + ->method('__toString') + ->will($this->returnValue('DUMMY')); + + $this->getLogger()->warning($dummy); + + $expected = array('warning DUMMY'); + $this->assertEquals($expected, $this->getLogs()); + } + + public function testContextCanContainAnything() + { + $closed = fopen('php://memory', 'r'); + fclose($closed); + + $context = array( + 'bool' => true, + 'null' => null, + 'string' => 'Foo', + 'int' => 0, + 'float' => 0.5, + 'nested' => array('with object' => new DummyTest), + 'object' => new \DateTime, + 'resource' => fopen('php://memory', 'r'), + 'closed' => $closed, + ); + + $this->getLogger()->warning('Crazy context data', $context); + + $expected = array('warning Crazy context data'); + $this->assertEquals($expected, $this->getLogs()); + } + + public function testContextExceptionKeyCanBeExceptionOrOtherValues() + { + $logger = $this->getLogger(); + $logger->warning('Random message', array('exception' => 'oops')); + $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); + + $expected = array( + 'warning Random message', + 'critical Uncaught Exception!' + ); + $this->assertEquals($expected, $this->getLogs()); + } +} diff --git a/vendor/psr/log/Psr/Log/Test/TestLogger.php b/vendor/psr/log/Psr/Log/Test/TestLogger.php new file mode 100644 index 00000000..1be32304 --- /dev/null +++ b/vendor/psr/log/Psr/Log/Test/TestLogger.php @@ -0,0 +1,147 @@ + $level, + 'message' => $message, + 'context' => $context, + ]; + + $this->recordsByLevel[$record['level']][] = $record; + $this->records[] = $record; + } + + public function hasRecords($level) + { + return isset($this->recordsByLevel[$level]); + } + + public function hasRecord($record, $level) + { + if (is_string($record)) { + $record = ['message' => $record]; + } + return $this->hasRecordThatPasses(function ($rec) use ($record) { + if ($rec['message'] !== $record['message']) { + return false; + } + if (isset($record['context']) && $rec['context'] !== $record['context']) { + return false; + } + return true; + }, $level); + } + + public function hasRecordThatContains($message, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($message) { + return strpos($rec['message'], $message) !== false; + }, $level); + } + + public function hasRecordThatMatches($regex, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($regex) { + return preg_match($regex, $rec['message']) > 0; + }, $level); + } + + public function hasRecordThatPasses(callable $predicate, $level) + { + if (!isset($this->recordsByLevel[$level])) { + return false; + } + foreach ($this->recordsByLevel[$level] as $i => $rec) { + if (call_user_func($predicate, $rec, $i)) { + return true; + } + } + return false; + } + + public function __call($method, $args) + { + if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { + $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; + $level = strtolower($matches[2]); + if (method_exists($this, $genericMethod)) { + $args[] = $level; + return call_user_func_array([$this, $genericMethod], $args); + } + } + throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); + } + + public function reset() + { + $this->records = []; + $this->recordsByLevel = []; + } +} diff --git a/vendor/psr/log/README.md b/vendor/psr/log/README.md new file mode 100644 index 00000000..a9f20c43 --- /dev/null +++ b/vendor/psr/log/README.md @@ -0,0 +1,58 @@ +PSR Log +======= + +This repository holds all interfaces/classes/traits related to +[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md). + +Note that this is not a logger of its own. It is merely an interface that +describes a logger. See the specification for more details. + +Installation +------------ + +```bash +composer require psr/log +``` + +Usage +----- + +If you need a logger, you can use the interface like this: + +```php +logger = $logger; + } + + public function doSomething() + { + if ($this->logger) { + $this->logger->info('Doing work'); + } + + try { + $this->doSomethingElse(); + } catch (Exception $exception) { + $this->logger->error('Oh no!', array('exception' => $exception)); + } + + // do something useful + } +} +``` + +You can then pick one of the implementations of the interface to get a logger. + +If you want to implement the interface, you can require this package and +implement `Psr\Log\LoggerInterface` in your code. Please read the +[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) +for details. diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json new file mode 100644 index 00000000..ca056953 --- /dev/null +++ b/vendor/psr/log/composer.json @@ -0,0 +1,26 @@ +{ + "name": "psr/log", + "description": "Common interface for logging libraries", + "keywords": ["psr", "psr-3", "log"], + "homepage": "https://github.com/php-fig/log", + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "require": { + "php": ">=5.3.0" + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + } +} diff --git a/vendor/sebastian/diff/ChangeLog.md b/vendor/sebastian/diff/ChangeLog.md new file mode 100644 index 00000000..9bdcc5b6 --- /dev/null +++ b/vendor/sebastian/diff/ChangeLog.md @@ -0,0 +1,88 @@ +# ChangeLog + +All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [4.0.4] - 2020-10-26 + +### Fixed + +* `SebastianBergmann\Diff\Exception` now correctly extends `\Throwable` + +## [4.0.3] - 2020-09-28 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` + +## [4.0.2] - 2020-06-30 + +### Added + +* This component is now supported on PHP 8 + +## [4.0.1] - 2020-05-08 + +### Fixed + +* [#99](https://github.com/sebastianbergmann/diff/pull/99): Regression in unified diff output of identical strings + +## [4.0.0] - 2020-02-07 + +### Removed + +* Removed support for PHP 7.1 and PHP 7.2 + +## [3.0.2] - 2019-02-04 + +### Changed + +* `Chunk::setLines()` now ensures that the `$lines` array only contains `Line` objects + +## [3.0.1] - 2018-06-10 + +### Fixed + +* Removed `"minimum-stability": "dev",` from `composer.json` + +## [3.0.0] - 2018-02-01 + +* The `StrictUnifiedDiffOutputBuilder` implementation of the `DiffOutputBuilderInterface` was added + +### Changed + +* The default `DiffOutputBuilderInterface` implementation now generates context lines (unchanged lines) + +### Removed + +* Removed support for PHP 7.0 + +### Fixed + +* [#70](https://github.com/sebastianbergmann/diff/issues/70): Diffing of arrays no longer works + +## [2.0.1] - 2017-08-03 + +### Fixed + +* [#66](https://github.com/sebastianbergmann/diff/pull/66): Restored backwards compatibility for PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 + +## [2.0.0] - 2017-07-11 [YANKED] + +### Added + +* [#64](https://github.com/sebastianbergmann/diff/pull/64): Show line numbers for chunks of a diff + +### Removed + +* This component is no longer supported on PHP 5.6 + +[4.0.4]: https://github.com/sebastianbergmann/diff/compare/4.0.3...4.0.4 +[4.0.3]: https://github.com/sebastianbergmann/diff/compare/4.0.2...4.0.3 +[4.0.2]: https://github.com/sebastianbergmann/diff/compare/4.0.1...4.0.2 +[4.0.1]: https://github.com/sebastianbergmann/diff/compare/4.0.0...4.0.1 +[4.0.0]: https://github.com/sebastianbergmann/diff/compare/3.0.2...4.0.0 +[3.0.2]: https://github.com/sebastianbergmann/diff/compare/3.0.1...3.0.2 +[3.0.1]: https://github.com/sebastianbergmann/diff/compare/3.0.0...3.0.1 +[3.0.0]: https://github.com/sebastianbergmann/diff/compare/2.0...3.0.0 +[2.0.1]: https://github.com/sebastianbergmann/diff/compare/c341c98ce083db77f896a0aa64f5ee7652915970...2.0.1 +[2.0.0]: https://github.com/sebastianbergmann/diff/compare/1.4...c341c98ce083db77f896a0aa64f5ee7652915970 diff --git a/vendor/sebastian/diff/LICENSE b/vendor/sebastian/diff/LICENSE new file mode 100644 index 00000000..f22f31cf --- /dev/null +++ b/vendor/sebastian/diff/LICENSE @@ -0,0 +1,33 @@ +sebastian/diff + +Copyright (c) 2002-2020, Sebastian Bergmann . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Sebastian Bergmann nor the names of his + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/diff/README.md b/vendor/sebastian/diff/README.md new file mode 100644 index 00000000..734b852d --- /dev/null +++ b/vendor/sebastian/diff/README.md @@ -0,0 +1,202 @@ +# sebastian/diff + +[![CI Status](https://github.com/sebastianbergmann/diff/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/diff/actions) +[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/diff/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/diff) + +Diff implementation for PHP, factored out of PHPUnit into a stand-alone component. + +## Installation + +You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): + +``` +composer require sebastian/diff +``` + +If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: + +``` +composer require --dev sebastian/diff +``` + +### Usage + +#### Generating diff + +The `Differ` class can be used to generate a textual representation of the difference between two strings: + +```php +diff('foo', 'bar'); +``` + +The code above yields the output below: +```diff +--- Original ++++ New +@@ @@ +-foo ++bar +``` + +There are three output builders available in this package: + +#### UnifiedDiffOutputBuilder + +This is default builder, which generates the output close to udiff and is used by PHPUnit. + +```php +diff('foo', 'bar'); +``` + +#### StrictUnifiedDiffOutputBuilder + +Generates (strict) Unified diff's (unidiffs) with hunks, +similar to `diff -u` and compatible with `patch` and `git apply`. + +```php + true, // ranges of length one are rendered with the trailing `,1` + 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) + 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 + 'fromFile' => null, + 'fromFileDate' => null, + 'toFile' => null, + 'toFileDate' => null, +]); + +$differ = new Differ($builder); +print $differ->diff('foo', 'bar'); +``` + +#### DiffOnlyOutputBuilder + +Output only the lines that differ. + +```php +diff('foo', 'bar'); +``` + +#### DiffOutputBuilderInterface + +You can pass any output builder to the `Differ` class as longs as it implements the `DiffOutputBuilderInterface`. + +#### Parsing diff + +The `Parser` class can be used to parse a unified diff into an object graph: + +```php +use SebastianBergmann\Diff\Parser; +use SebastianBergmann\Git; + +$git = new Git('/usr/local/src/money'); + +$diff = $git->getDiff( + '948a1a07768d8edd10dcefa8315c1cbeffb31833', + 'c07a373d2399f3e686234c4f7f088d635eb9641b' +); + +$parser = new Parser; + +print_r($parser->parse($diff)); +``` + +The code above yields the output below: + + Array + ( + [0] => SebastianBergmann\Diff\Diff Object + ( + [from:SebastianBergmann\Diff\Diff:private] => a/tests/MoneyTest.php + [to:SebastianBergmann\Diff\Diff:private] => b/tests/MoneyTest.php + [chunks:SebastianBergmann\Diff\Diff:private] => Array + ( + [0] => SebastianBergmann\Diff\Chunk Object + ( + [start:SebastianBergmann\Diff\Chunk:private] => 87 + [startRange:SebastianBergmann\Diff\Chunk:private] => 7 + [end:SebastianBergmann\Diff\Chunk:private] => 87 + [endRange:SebastianBergmann\Diff\Chunk:private] => 7 + [lines:SebastianBergmann\Diff\Chunk:private] => Array + ( + [0] => SebastianBergmann\Diff\Line Object + ( + [type:SebastianBergmann\Diff\Line:private] => 3 + [content:SebastianBergmann\Diff\Line:private] => * @covers SebastianBergmann\Money\Money::add + ) + + [1] => SebastianBergmann\Diff\Line Object + ( + [type:SebastianBergmann\Diff\Line:private] => 3 + [content:SebastianBergmann\Diff\Line:private] => * @covers SebastianBergmann\Money\Money::newMoney + ) + + [2] => SebastianBergmann\Diff\Line Object + ( + [type:SebastianBergmann\Diff\Line:private] => 3 + [content:SebastianBergmann\Diff\Line:private] => */ + ) + + [3] => SebastianBergmann\Diff\Line Object + ( + [type:SebastianBergmann\Diff\Line:private] => 2 + [content:SebastianBergmann\Diff\Line:private] => public function testAnotherMoneyWithSameCurrencyObjectCanBeAdded() + ) + + [4] => SebastianBergmann\Diff\Line Object + ( + [type:SebastianBergmann\Diff\Line:private] => 1 + [content:SebastianBergmann\Diff\Line:private] => public function testAnotherMoneyObjectWithSameCurrencyCanBeAdded() + ) + + [5] => SebastianBergmann\Diff\Line Object + ( + [type:SebastianBergmann\Diff\Line:private] => 3 + [content:SebastianBergmann\Diff\Line:private] => { + ) + + [6] => SebastianBergmann\Diff\Line Object + ( + [type:SebastianBergmann\Diff\Line:private] => 3 + [content:SebastianBergmann\Diff\Line:private] => $a = new Money(1, new Currency('EUR')); + ) + + [7] => SebastianBergmann\Diff\Line Object + ( + [type:SebastianBergmann\Diff\Line:private] => 3 + [content:SebastianBergmann\Diff\Line:private] => $b = new Money(2, new Currency('EUR')); + ) + ) + ) + ) + ) + ) diff --git a/vendor/sebastian/diff/composer.json b/vendor/sebastian/diff/composer.json new file mode 100644 index 00000000..cf92202b --- /dev/null +++ b/vendor/sebastian/diff/composer.json @@ -0,0 +1,47 @@ +{ + "name": "sebastian/diff", + "description": "Diff implementation", + "keywords": ["diff", "udiff", "unidiff", "unified diff"], + "homepage": "https://github.com/sebastianbergmann/diff", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "prefer-stable": true, + "config": { + "platform": { + "php": "7.3.0" + }, + "optimize-autoloader": true, + "sort-packages": true + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "autoload-dev": { + "classmap": [ + "tests/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + } +} diff --git a/vendor/sebastian/diff/src/Chunk.php b/vendor/sebastian/diff/src/Chunk.php new file mode 100644 index 00000000..16ae34f4 --- /dev/null +++ b/vendor/sebastian/diff/src/Chunk.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +final class Chunk +{ + /** + * @var int + */ + private $start; + + /** + * @var int + */ + private $startRange; + + /** + * @var int + */ + private $end; + + /** + * @var int + */ + private $endRange; + + /** + * @var Line[] + */ + private $lines; + + public function __construct(int $start = 0, int $startRange = 1, int $end = 0, int $endRange = 1, array $lines = []) + { + $this->start = $start; + $this->startRange = $startRange; + $this->end = $end; + $this->endRange = $endRange; + $this->lines = $lines; + } + + public function getStart(): int + { + return $this->start; + } + + public function getStartRange(): int + { + return $this->startRange; + } + + public function getEnd(): int + { + return $this->end; + } + + public function getEndRange(): int + { + return $this->endRange; + } + + /** + * @return Line[] + */ + public function getLines(): array + { + return $this->lines; + } + + /** + * @param Line[] $lines + */ + public function setLines(array $lines): void + { + foreach ($lines as $line) { + if (!$line instanceof Line) { + throw new InvalidArgumentException; + } + } + + $this->lines = $lines; + } +} diff --git a/vendor/sebastian/diff/src/Diff.php b/vendor/sebastian/diff/src/Diff.php new file mode 100644 index 00000000..17b2084f --- /dev/null +++ b/vendor/sebastian/diff/src/Diff.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +final class Diff +{ + /** + * @var string + */ + private $from; + + /** + * @var string + */ + private $to; + + /** + * @var Chunk[] + */ + private $chunks; + + /** + * @param Chunk[] $chunks + */ + public function __construct(string $from, string $to, array $chunks = []) + { + $this->from = $from; + $this->to = $to; + $this->chunks = $chunks; + } + + public function getFrom(): string + { + return $this->from; + } + + public function getTo(): string + { + return $this->to; + } + + /** + * @return Chunk[] + */ + public function getChunks(): array + { + return $this->chunks; + } + + /** + * @param Chunk[] $chunks + */ + public function setChunks(array $chunks): void + { + $this->chunks = $chunks; + } +} diff --git a/vendor/sebastian/diff/src/Differ.php b/vendor/sebastian/diff/src/Differ.php new file mode 100644 index 00000000..5a4d9d10 --- /dev/null +++ b/vendor/sebastian/diff/src/Differ.php @@ -0,0 +1,327 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +use const PHP_INT_SIZE; +use const PREG_SPLIT_DELIM_CAPTURE; +use const PREG_SPLIT_NO_EMPTY; +use function array_shift; +use function array_unshift; +use function array_values; +use function count; +use function current; +use function end; +use function get_class; +use function gettype; +use function is_array; +use function is_object; +use function is_string; +use function key; +use function min; +use function preg_split; +use function prev; +use function reset; +use function sprintf; +use function substr; +use SebastianBergmann\Diff\Output\DiffOutputBuilderInterface; +use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; + +final class Differ +{ + public const OLD = 0; + + public const ADDED = 1; + + public const REMOVED = 2; + + public const DIFF_LINE_END_WARNING = 3; + + public const NO_LINE_END_EOF_WARNING = 4; + + /** + * @var DiffOutputBuilderInterface + */ + private $outputBuilder; + + /** + * @param DiffOutputBuilderInterface $outputBuilder + * + * @throws InvalidArgumentException + */ + public function __construct($outputBuilder = null) + { + if ($outputBuilder instanceof DiffOutputBuilderInterface) { + $this->outputBuilder = $outputBuilder; + } elseif (null === $outputBuilder) { + $this->outputBuilder = new UnifiedDiffOutputBuilder; + } elseif (is_string($outputBuilder)) { + // PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 support + // @see https://github.com/sebastianbergmann/phpunit/issues/2734#issuecomment-314514056 + // @deprecated + $this->outputBuilder = new UnifiedDiffOutputBuilder($outputBuilder); + } else { + throw new InvalidArgumentException( + sprintf( + 'Expected builder to be an instance of DiffOutputBuilderInterface, or a string, got %s.', + is_object($outputBuilder) ? 'instance of "' . get_class($outputBuilder) . '"' : gettype($outputBuilder) . ' "' . $outputBuilder . '"' + ) + ); + } + } + + /** + * Returns the diff between two arrays or strings as string. + * + * @param array|string $from + * @param array|string $to + */ + public function diff($from, $to, LongestCommonSubsequenceCalculator $lcs = null): string + { + $diff = $this->diffToArray( + $this->normalizeDiffInput($from), + $this->normalizeDiffInput($to), + $lcs + ); + + return $this->outputBuilder->getDiff($diff); + } + + /** + * Returns the diff between two arrays or strings as array. + * + * Each array element contains two elements: + * - [0] => mixed $token + * - [1] => 2|1|0 + * + * - 2: REMOVED: $token was removed from $from + * - 1: ADDED: $token was added to $from + * - 0: OLD: $token is not changed in $to + * + * @param array|string $from + * @param array|string $to + * @param LongestCommonSubsequenceCalculator $lcs + */ + public function diffToArray($from, $to, LongestCommonSubsequenceCalculator $lcs = null): array + { + if (is_string($from)) { + $from = $this->splitStringByLines($from); + } elseif (!is_array($from)) { + throw new InvalidArgumentException('"from" must be an array or string.'); + } + + if (is_string($to)) { + $to = $this->splitStringByLines($to); + } elseif (!is_array($to)) { + throw new InvalidArgumentException('"to" must be an array or string.'); + } + + [$from, $to, $start, $end] = self::getArrayDiffParted($from, $to); + + if ($lcs === null) { + $lcs = $this->selectLcsImplementation($from, $to); + } + + $common = $lcs->calculate(array_values($from), array_values($to)); + $diff = []; + + foreach ($start as $token) { + $diff[] = [$token, self::OLD]; + } + + reset($from); + reset($to); + + foreach ($common as $token) { + while (($fromToken = reset($from)) !== $token) { + $diff[] = [array_shift($from), self::REMOVED]; + } + + while (($toToken = reset($to)) !== $token) { + $diff[] = [array_shift($to), self::ADDED]; + } + + $diff[] = [$token, self::OLD]; + + array_shift($from); + array_shift($to); + } + + while (($token = array_shift($from)) !== null) { + $diff[] = [$token, self::REMOVED]; + } + + while (($token = array_shift($to)) !== null) { + $diff[] = [$token, self::ADDED]; + } + + foreach ($end as $token) { + $diff[] = [$token, self::OLD]; + } + + if ($this->detectUnmatchedLineEndings($diff)) { + array_unshift($diff, ["#Warning: Strings contain different line endings!\n", self::DIFF_LINE_END_WARNING]); + } + + return $diff; + } + + /** + * Casts variable to string if it is not a string or array. + * + * @return array|string + */ + private function normalizeDiffInput($input) + { + if (!is_array($input) && !is_string($input)) { + return (string) $input; + } + + return $input; + } + + /** + * Checks if input is string, if so it will split it line-by-line. + */ + private function splitStringByLines(string $input): array + { + return preg_split('/(.*\R)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + } + + private function selectLcsImplementation(array $from, array $to): LongestCommonSubsequenceCalculator + { + // We do not want to use the time-efficient implementation if its memory + // footprint will probably exceed this value. Note that the footprint + // calculation is only an estimation for the matrix and the LCS method + // will typically allocate a bit more memory than this. + $memoryLimit = 100 * 1024 * 1024; + + if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) { + return new MemoryEfficientLongestCommonSubsequenceCalculator; + } + + return new TimeEfficientLongestCommonSubsequenceCalculator; + } + + /** + * Calculates the estimated memory footprint for the DP-based method. + * + * @return float|int + */ + private function calculateEstimatedFootprint(array $from, array $to) + { + $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; + + return $itemSize * min(count($from), count($to)) ** 2; + } + + /** + * Returns true if line ends don't match in a diff. + */ + private function detectUnmatchedLineEndings(array $diff): bool + { + $newLineBreaks = ['' => true]; + $oldLineBreaks = ['' => true]; + + foreach ($diff as $entry) { + if (self::OLD === $entry[1]) { + $ln = $this->getLinebreak($entry[0]); + $oldLineBreaks[$ln] = true; + $newLineBreaks[$ln] = true; + } elseif (self::ADDED === $entry[1]) { + $newLineBreaks[$this->getLinebreak($entry[0])] = true; + } elseif (self::REMOVED === $entry[1]) { + $oldLineBreaks[$this->getLinebreak($entry[0])] = true; + } + } + + // if either input or output is a single line without breaks than no warning should be raised + if (['' => true] === $newLineBreaks || ['' => true] === $oldLineBreaks) { + return false; + } + + // two way compare + foreach ($newLineBreaks as $break => $set) { + if (!isset($oldLineBreaks[$break])) { + return true; + } + } + + foreach ($oldLineBreaks as $break => $set) { + if (!isset($newLineBreaks[$break])) { + return true; + } + } + + return false; + } + + private function getLinebreak($line): string + { + if (!is_string($line)) { + return ''; + } + + $lc = substr($line, -1); + + if ("\r" === $lc) { + return "\r"; + } + + if ("\n" !== $lc) { + return ''; + } + + if ("\r\n" === substr($line, -2)) { + return "\r\n"; + } + + return "\n"; + } + + private static function getArrayDiffParted(array &$from, array &$to): array + { + $start = []; + $end = []; + + reset($to); + + foreach ($from as $k => $v) { + $toK = key($to); + + if ($toK === $k && $v === $to[$k]) { + $start[$k] = $v; + + unset($from[$k], $to[$k]); + } else { + break; + } + } + + end($from); + end($to); + + do { + $fromK = key($from); + $toK = key($to); + + if (null === $fromK || null === $toK || current($from) !== current($to)) { + break; + } + + prev($from); + prev($to); + + $end = [$fromK => $from[$fromK]] + $end; + unset($from[$fromK], $to[$toK]); + } while (true); + + return [$from, $to, $start, $end]; + } +} diff --git a/vendor/sebastian/diff/src/Exception/ConfigurationException.php b/vendor/sebastian/diff/src/Exception/ConfigurationException.php new file mode 100644 index 00000000..b767b219 --- /dev/null +++ b/vendor/sebastian/diff/src/Exception/ConfigurationException.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +use function get_class; +use function gettype; +use function is_object; +use function sprintf; +use Exception; + +final class ConfigurationException extends InvalidArgumentException +{ + public function __construct( + string $option, + string $expected, + $value, + int $code = 0, + Exception $previous = null + ) { + parent::__construct( + sprintf( + 'Option "%s" must be %s, got "%s".', + $option, + $expected, + is_object($value) ? get_class($value) : (null === $value ? '' : gettype($value) . '#' . $value) + ), + $code, + $previous + ); + } +} diff --git a/vendor/sebastian/diff/src/Exception/Exception.php b/vendor/sebastian/diff/src/Exception/Exception.php new file mode 100644 index 00000000..e20d3203 --- /dev/null +++ b/vendor/sebastian/diff/src/Exception/Exception.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +use Throwable; + +interface Exception extends Throwable +{ +} diff --git a/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php b/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php new file mode 100644 index 00000000..846ac3fb --- /dev/null +++ b/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +class InvalidArgumentException extends \InvalidArgumentException implements Exception +{ +} diff --git a/vendor/sebastian/diff/src/Line.php b/vendor/sebastian/diff/src/Line.php new file mode 100644 index 00000000..3596ed26 --- /dev/null +++ b/vendor/sebastian/diff/src/Line.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +final class Line +{ + public const ADDED = 1; + + public const REMOVED = 2; + + public const UNCHANGED = 3; + + /** + * @var int + */ + private $type; + + /** + * @var string + */ + private $content; + + public function __construct(int $type = self::UNCHANGED, string $content = '') + { + $this->type = $type; + $this->content = $content; + } + + public function getContent(): string + { + return $this->content; + } + + public function getType(): int + { + return $this->type; + } +} diff --git a/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php new file mode 100644 index 00000000..dea8fe1c --- /dev/null +++ b/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +interface LongestCommonSubsequenceCalculator +{ + /** + * Calculates the longest common subsequence of two arrays. + */ + public function calculate(array $from, array $to): array; +} diff --git a/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php new file mode 100644 index 00000000..0b626eaf --- /dev/null +++ b/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +use function array_fill; +use function array_merge; +use function array_reverse; +use function array_slice; +use function count; +use function in_array; +use function max; + +final class MemoryEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator +{ + /** + * {@inheritdoc} + */ + public function calculate(array $from, array $to): array + { + $cFrom = count($from); + $cTo = count($to); + + if ($cFrom === 0) { + return []; + } + + if ($cFrom === 1) { + if (in_array($from[0], $to, true)) { + return [$from[0]]; + } + + return []; + } + + $i = (int) ($cFrom / 2); + $fromStart = array_slice($from, 0, $i); + $fromEnd = array_slice($from, $i); + $llB = $this->length($fromStart, $to); + $llE = $this->length(array_reverse($fromEnd), array_reverse($to)); + $jMax = 0; + $max = 0; + + for ($j = 0; $j <= $cTo; $j++) { + $m = $llB[$j] + $llE[$cTo - $j]; + + if ($m >= $max) { + $max = $m; + $jMax = $j; + } + } + + $toStart = array_slice($to, 0, $jMax); + $toEnd = array_slice($to, $jMax); + + return array_merge( + $this->calculate($fromStart, $toStart), + $this->calculate($fromEnd, $toEnd) + ); + } + + private function length(array $from, array $to): array + { + $current = array_fill(0, count($to) + 1, 0); + $cFrom = count($from); + $cTo = count($to); + + for ($i = 0; $i < $cFrom; $i++) { + $prev = $current; + + for ($j = 0; $j < $cTo; $j++) { + if ($from[$i] === $to[$j]) { + $current[$j + 1] = $prev[$j] + 1; + } else { + $current[$j + 1] = max($current[$j], $prev[$j + 1]); + } + } + } + + return $current; + } +} diff --git a/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php b/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php new file mode 100644 index 00000000..e55757c3 --- /dev/null +++ b/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff\Output; + +use function count; + +abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface +{ + /** + * Takes input of the diff array and returns the common parts. + * Iterates through diff line by line. + */ + protected function getCommonChunks(array $diff, int $lineThreshold = 5): array + { + $diffSize = count($diff); + $capturing = false; + $chunkStart = 0; + $chunkSize = 0; + $commonChunks = []; + + for ($i = 0; $i < $diffSize; ++$i) { + if ($diff[$i][1] === 0 /* OLD */) { + if ($capturing === false) { + $capturing = true; + $chunkStart = $i; + $chunkSize = 0; + } else { + ++$chunkSize; + } + } elseif ($capturing !== false) { + if ($chunkSize >= $lineThreshold) { + $commonChunks[$chunkStart] = $chunkStart + $chunkSize; + } + + $capturing = false; + } + } + + if ($capturing !== false && $chunkSize >= $lineThreshold) { + $commonChunks[$chunkStart] = $chunkStart + $chunkSize; + } + + return $commonChunks; + } +} diff --git a/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php b/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php new file mode 100644 index 00000000..f79a935c --- /dev/null +++ b/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff\Output; + +use function fclose; +use function fopen; +use function fwrite; +use function stream_get_contents; +use function substr; +use SebastianBergmann\Diff\Differ; + +/** + * Builds a diff string representation in a loose unified diff format + * listing only changes lines. Does not include line numbers. + */ +final class DiffOnlyOutputBuilder implements DiffOutputBuilderInterface +{ + /** + * @var string + */ + private $header; + + public function __construct(string $header = "--- Original\n+++ New\n") + { + $this->header = $header; + } + + public function getDiff(array $diff): string + { + $buffer = fopen('php://memory', 'r+b'); + + if ('' !== $this->header) { + fwrite($buffer, $this->header); + + if ("\n" !== substr($this->header, -1, 1)) { + fwrite($buffer, "\n"); + } + } + + foreach ($diff as $diffEntry) { + if ($diffEntry[1] === Differ::ADDED) { + fwrite($buffer, '+' . $diffEntry[0]); + } elseif ($diffEntry[1] === Differ::REMOVED) { + fwrite($buffer, '-' . $diffEntry[0]); + } elseif ($diffEntry[1] === Differ::DIFF_LINE_END_WARNING) { + fwrite($buffer, ' ' . $diffEntry[0]); + + continue; // Warnings should not be tested for line break, it will always be there + } else { /* Not changed (old) 0 */ + continue; // we didn't write the non changs line, so do not add a line break either + } + + $lc = substr($diffEntry[0], -1); + + if ($lc !== "\n" && $lc !== "\r") { + fwrite($buffer, "\n"); // \No newline at end of file + } + } + + $diff = stream_get_contents($buffer, -1, 0); + fclose($buffer); + + return $diff; + } +} diff --git a/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php b/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php new file mode 100644 index 00000000..0e18f9f2 --- /dev/null +++ b/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff\Output; + +/** + * Defines how an output builder should take a generated + * diff array and return a string representation of that diff. + */ +interface DiffOutputBuilderInterface +{ + public function getDiff(array $diff): string; +} diff --git a/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php b/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php new file mode 100644 index 00000000..9c55ab2a --- /dev/null +++ b/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php @@ -0,0 +1,338 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff\Output; + +use function array_merge; +use function array_splice; +use function count; +use function fclose; +use function fopen; +use function fwrite; +use function is_bool; +use function is_int; +use function is_string; +use function max; +use function min; +use function sprintf; +use function stream_get_contents; +use function substr; +use SebastianBergmann\Diff\ConfigurationException; +use SebastianBergmann\Diff\Differ; + +/** + * Strict Unified diff output builder. + * + * Generates (strict) Unified diff's (unidiffs) with hunks. + */ +final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface +{ + private static $default = [ + 'collapseRanges' => true, // ranges of length one are rendered with the trailing `,1` + 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) + 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 + 'fromFile' => null, + 'fromFileDate' => null, + 'toFile' => null, + 'toFileDate' => null, + ]; + + /** + * @var bool + */ + private $changed; + + /** + * @var bool + */ + private $collapseRanges; + + /** + * @var int >= 0 + */ + private $commonLineThreshold; + + /** + * @var string + */ + private $header; + + /** + * @var int >= 0 + */ + private $contextLines; + + public function __construct(array $options = []) + { + $options = array_merge(self::$default, $options); + + if (!is_bool($options['collapseRanges'])) { + throw new ConfigurationException('collapseRanges', 'a bool', $options['collapseRanges']); + } + + if (!is_int($options['contextLines']) || $options['contextLines'] < 0) { + throw new ConfigurationException('contextLines', 'an int >= 0', $options['contextLines']); + } + + if (!is_int($options['commonLineThreshold']) || $options['commonLineThreshold'] <= 0) { + throw new ConfigurationException('commonLineThreshold', 'an int > 0', $options['commonLineThreshold']); + } + + $this->assertString($options, 'fromFile'); + $this->assertString($options, 'toFile'); + $this->assertStringOrNull($options, 'fromFileDate'); + $this->assertStringOrNull($options, 'toFileDate'); + + $this->header = sprintf( + "--- %s%s\n+++ %s%s\n", + $options['fromFile'], + null === $options['fromFileDate'] ? '' : "\t" . $options['fromFileDate'], + $options['toFile'], + null === $options['toFileDate'] ? '' : "\t" . $options['toFileDate'] + ); + + $this->collapseRanges = $options['collapseRanges']; + $this->commonLineThreshold = $options['commonLineThreshold']; + $this->contextLines = $options['contextLines']; + } + + public function getDiff(array $diff): string + { + if (0 === count($diff)) { + return ''; + } + + $this->changed = false; + + $buffer = fopen('php://memory', 'r+b'); + fwrite($buffer, $this->header); + + $this->writeDiffHunks($buffer, $diff); + + if (!$this->changed) { + fclose($buffer); + + return ''; + } + + $diff = stream_get_contents($buffer, -1, 0); + + fclose($buffer); + + // If the last char is not a linebreak: add it. + // This might happen when both the `from` and `to` do not have a trailing linebreak + $last = substr($diff, -1); + + return "\n" !== $last && "\r" !== $last + ? $diff . "\n" + : $diff; + } + + private function writeDiffHunks($output, array $diff): void + { + // detect "No newline at end of file" and insert into `$diff` if needed + + $upperLimit = count($diff); + + if (0 === $diff[$upperLimit - 1][1]) { + $lc = substr($diff[$upperLimit - 1][0], -1); + + if ("\n" !== $lc) { + array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); + } + } else { + // search back for the last `+` and `-` line, + // check if has trailing linebreak, else add under it warning under it + $toFind = [1 => true, 2 => true]; + + for ($i = $upperLimit - 1; $i >= 0; --$i) { + if (isset($toFind[$diff[$i][1]])) { + unset($toFind[$diff[$i][1]]); + $lc = substr($diff[$i][0], -1); + + if ("\n" !== $lc) { + array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); + } + + if (!count($toFind)) { + break; + } + } + } + } + + // write hunks to output buffer + + $cutOff = max($this->commonLineThreshold, $this->contextLines); + $hunkCapture = false; + $sameCount = $toRange = $fromRange = 0; + $toStart = $fromStart = 1; + $i = 0; + + /** @var int $i */ + foreach ($diff as $i => $entry) { + if (0 === $entry[1]) { // same + if (false === $hunkCapture) { + ++$fromStart; + ++$toStart; + + continue; + } + + ++$sameCount; + ++$toRange; + ++$fromRange; + + if ($sameCount === $cutOff) { + $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 + ? $hunkCapture + : $this->contextLines; + + // note: $contextEndOffset = $this->contextLines; + // + // because we never go beyond the end of the diff. + // with the cutoff/contextlines here the follow is never true; + // + // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { + // $contextEndOffset = count($diff) - 1; + // } + // + // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop + + $this->writeHunk( + $diff, + $hunkCapture - $contextStartOffset, + $i - $cutOff + $this->contextLines + 1, + $fromStart - $contextStartOffset, + $fromRange - $cutOff + $contextStartOffset + $this->contextLines, + $toStart - $contextStartOffset, + $toRange - $cutOff + $contextStartOffset + $this->contextLines, + $output + ); + + $fromStart += $fromRange; + $toStart += $toRange; + + $hunkCapture = false; + $sameCount = $toRange = $fromRange = 0; + } + + continue; + } + + $sameCount = 0; + + if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { + continue; + } + + $this->changed = true; + + if (false === $hunkCapture) { + $hunkCapture = $i; + } + + if (Differ::ADDED === $entry[1]) { // added + ++$toRange; + } + + if (Differ::REMOVED === $entry[1]) { // removed + ++$fromRange; + } + } + + if (false === $hunkCapture) { + return; + } + + // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, + // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold + + $contextStartOffset = $hunkCapture - $this->contextLines < 0 + ? $hunkCapture + : $this->contextLines; + + // prevent trying to write out more common lines than there are in the diff _and_ + // do not write more than configured through the context lines + $contextEndOffset = min($sameCount, $this->contextLines); + + $fromRange -= $sameCount; + $toRange -= $sameCount; + + $this->writeHunk( + $diff, + $hunkCapture - $contextStartOffset, + $i - $sameCount + $contextEndOffset + 1, + $fromStart - $contextStartOffset, + $fromRange + $contextStartOffset + $contextEndOffset, + $toStart - $contextStartOffset, + $toRange + $contextStartOffset + $contextEndOffset, + $output + ); + } + + private function writeHunk( + array $diff, + int $diffStartIndex, + int $diffEndIndex, + int $fromStart, + int $fromRange, + int $toStart, + int $toRange, + $output + ): void { + fwrite($output, '@@ -' . $fromStart); + + if (!$this->collapseRanges || 1 !== $fromRange) { + fwrite($output, ',' . $fromRange); + } + + fwrite($output, ' +' . $toStart); + + if (!$this->collapseRanges || 1 !== $toRange) { + fwrite($output, ',' . $toRange); + } + + fwrite($output, " @@\n"); + + for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { + if ($diff[$i][1] === Differ::ADDED) { + $this->changed = true; + fwrite($output, '+' . $diff[$i][0]); + } elseif ($diff[$i][1] === Differ::REMOVED) { + $this->changed = true; + fwrite($output, '-' . $diff[$i][0]); + } elseif ($diff[$i][1] === Differ::OLD) { + fwrite($output, ' ' . $diff[$i][0]); + } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { + $this->changed = true; + fwrite($output, $diff[$i][0]); + } + //} elseif ($diff[$i][1] === Differ::DIFF_LINE_END_WARNING) { // custom comment inserted by PHPUnit/diff package + // skip + //} else { + // unknown/invalid + //} + } + } + + private function assertString(array $options, string $option): void + { + if (!is_string($options[$option])) { + throw new ConfigurationException($option, 'a string', $options[$option]); + } + } + + private function assertStringOrNull(array $options, string $option): void + { + if (null !== $options[$option] && !is_string($options[$option])) { + throw new ConfigurationException($option, 'a string or ', $options[$option]); + } + } +} diff --git a/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php b/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php new file mode 100644 index 00000000..8aae6450 --- /dev/null +++ b/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php @@ -0,0 +1,272 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff\Output; + +use function array_splice; +use function count; +use function fclose; +use function fopen; +use function fwrite; +use function max; +use function min; +use function stream_get_contents; +use function strlen; +use function substr; +use SebastianBergmann\Diff\Differ; + +/** + * Builds a diff string representation in unified diff format in chunks. + */ +final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder +{ + /** + * @var bool + */ + private $collapseRanges = true; + + /** + * @var int >= 0 + */ + private $commonLineThreshold = 6; + + /** + * @var int >= 0 + */ + private $contextLines = 3; + + /** + * @var string + */ + private $header; + + /** + * @var bool + */ + private $addLineNumbers; + + public function __construct(string $header = "--- Original\n+++ New\n", bool $addLineNumbers = false) + { + $this->header = $header; + $this->addLineNumbers = $addLineNumbers; + } + + public function getDiff(array $diff): string + { + $buffer = fopen('php://memory', 'r+b'); + + if ('' !== $this->header) { + fwrite($buffer, $this->header); + + if ("\n" !== substr($this->header, -1, 1)) { + fwrite($buffer, "\n"); + } + } + + if (0 !== count($diff)) { + $this->writeDiffHunks($buffer, $diff); + } + + $diff = stream_get_contents($buffer, -1, 0); + + fclose($buffer); + + // If the diff is non-empty and last char is not a linebreak: add it. + // This might happen when both the `from` and `to` do not have a trailing linebreak + $last = substr($diff, -1); + + return 0 !== strlen($diff) && "\n" !== $last && "\r" !== $last + ? $diff . "\n" + : $diff; + } + + private function writeDiffHunks($output, array $diff): void + { + // detect "No newline at end of file" and insert into `$diff` if needed + + $upperLimit = count($diff); + + if (0 === $diff[$upperLimit - 1][1]) { + $lc = substr($diff[$upperLimit - 1][0], -1); + + if ("\n" !== $lc) { + array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); + } + } else { + // search back for the last `+` and `-` line, + // check if has trailing linebreak, else add under it warning under it + $toFind = [1 => true, 2 => true]; + + for ($i = $upperLimit - 1; $i >= 0; --$i) { + if (isset($toFind[$diff[$i][1]])) { + unset($toFind[$diff[$i][1]]); + $lc = substr($diff[$i][0], -1); + + if ("\n" !== $lc) { + array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); + } + + if (!count($toFind)) { + break; + } + } + } + } + + // write hunks to output buffer + + $cutOff = max($this->commonLineThreshold, $this->contextLines); + $hunkCapture = false; + $sameCount = $toRange = $fromRange = 0; + $toStart = $fromStart = 1; + $i = 0; + + /** @var int $i */ + foreach ($diff as $i => $entry) { + if (0 === $entry[1]) { // same + if (false === $hunkCapture) { + ++$fromStart; + ++$toStart; + + continue; + } + + ++$sameCount; + ++$toRange; + ++$fromRange; + + if ($sameCount === $cutOff) { + $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 + ? $hunkCapture + : $this->contextLines; + + // note: $contextEndOffset = $this->contextLines; + // + // because we never go beyond the end of the diff. + // with the cutoff/contextlines here the follow is never true; + // + // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { + // $contextEndOffset = count($diff) - 1; + // } + // + // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop + + $this->writeHunk( + $diff, + $hunkCapture - $contextStartOffset, + $i - $cutOff + $this->contextLines + 1, + $fromStart - $contextStartOffset, + $fromRange - $cutOff + $contextStartOffset + $this->contextLines, + $toStart - $contextStartOffset, + $toRange - $cutOff + $contextStartOffset + $this->contextLines, + $output + ); + + $fromStart += $fromRange; + $toStart += $toRange; + + $hunkCapture = false; + $sameCount = $toRange = $fromRange = 0; + } + + continue; + } + + $sameCount = 0; + + if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { + continue; + } + + if (false === $hunkCapture) { + $hunkCapture = $i; + } + + if (Differ::ADDED === $entry[1]) { + ++$toRange; + } + + if (Differ::REMOVED === $entry[1]) { + ++$fromRange; + } + } + + if (false === $hunkCapture) { + return; + } + + // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, + // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold + + $contextStartOffset = $hunkCapture - $this->contextLines < 0 + ? $hunkCapture + : $this->contextLines; + + // prevent trying to write out more common lines than there are in the diff _and_ + // do not write more than configured through the context lines + $contextEndOffset = min($sameCount, $this->contextLines); + + $fromRange -= $sameCount; + $toRange -= $sameCount; + + $this->writeHunk( + $diff, + $hunkCapture - $contextStartOffset, + $i - $sameCount + $contextEndOffset + 1, + $fromStart - $contextStartOffset, + $fromRange + $contextStartOffset + $contextEndOffset, + $toStart - $contextStartOffset, + $toRange + $contextStartOffset + $contextEndOffset, + $output + ); + } + + private function writeHunk( + array $diff, + int $diffStartIndex, + int $diffEndIndex, + int $fromStart, + int $fromRange, + int $toStart, + int $toRange, + $output + ): void { + if ($this->addLineNumbers) { + fwrite($output, '@@ -' . $fromStart); + + if (!$this->collapseRanges || 1 !== $fromRange) { + fwrite($output, ',' . $fromRange); + } + + fwrite($output, ' +' . $toStart); + + if (!$this->collapseRanges || 1 !== $toRange) { + fwrite($output, ',' . $toRange); + } + + fwrite($output, " @@\n"); + } else { + fwrite($output, "@@ @@\n"); + } + + for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { + if ($diff[$i][1] === Differ::ADDED) { + fwrite($output, '+' . $diff[$i][0]); + } elseif ($diff[$i][1] === Differ::REMOVED) { + fwrite($output, '-' . $diff[$i][0]); + } elseif ($diff[$i][1] === Differ::OLD) { + fwrite($output, ' ' . $diff[$i][0]); + } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { + fwrite($output, "\n"); // $diff[$i][0] + } else { /* Not changed (old) Differ::OLD or Warning Differ::DIFF_LINE_END_WARNING */ + fwrite($output, ' ' . $diff[$i][0]); + } + } + } +} diff --git a/vendor/sebastian/diff/src/Parser.php b/vendor/sebastian/diff/src/Parser.php new file mode 100644 index 00000000..cc9e3887 --- /dev/null +++ b/vendor/sebastian/diff/src/Parser.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +use function array_pop; +use function count; +use function max; +use function preg_match; +use function preg_split; + +/** + * Unified diff parser. + */ +final class Parser +{ + /** + * @return Diff[] + */ + public function parse(string $string): array + { + $lines = preg_split('(\r\n|\r|\n)', $string); + + if (!empty($lines) && $lines[count($lines) - 1] === '') { + array_pop($lines); + } + + $lineCount = count($lines); + $diffs = []; + $diff = null; + $collected = []; + + for ($i = 0; $i < $lineCount; ++$i) { + if (preg_match('#^---\h+"?(?P[^\\v\\t"]+)#', $lines[$i], $fromMatch) && + preg_match('#^\\+\\+\\+\\h+"?(?P[^\\v\\t"]+)#', $lines[$i + 1], $toMatch)) { + if ($diff !== null) { + $this->parseFileDiff($diff, $collected); + + $diffs[] = $diff; + $collected = []; + } + + $diff = new Diff($fromMatch['file'], $toMatch['file']); + + ++$i; + } else { + if (preg_match('/^(?:diff --git |index [\da-f\.]+|[+-]{3} [ab])/', $lines[$i])) { + continue; + } + + $collected[] = $lines[$i]; + } + } + + if ($diff !== null && count($collected)) { + $this->parseFileDiff($diff, $collected); + + $diffs[] = $diff; + } + + return $diffs; + } + + private function parseFileDiff(Diff $diff, array $lines): void + { + $chunks = []; + $chunk = null; + $diffLines = []; + + foreach ($lines as $line) { + if (preg_match('/^@@\s+-(?P\d+)(?:,\s*(?P\d+))?\s+\+(?P\d+)(?:,\s*(?P\d+))?\s+@@/', $line, $match)) { + $chunk = new Chunk( + (int) $match['start'], + isset($match['startrange']) ? max(1, (int) $match['startrange']) : 1, + (int) $match['end'], + isset($match['endrange']) ? max(1, (int) $match['endrange']) : 1 + ); + + $chunks[] = $chunk; + $diffLines = []; + + continue; + } + + if (preg_match('/^(?P[+ -])?(?P.*)/', $line, $match)) { + $type = Line::UNCHANGED; + + if ($match['type'] === '+') { + $type = Line::ADDED; + } elseif ($match['type'] === '-') { + $type = Line::REMOVED; + } + + $diffLines[] = new Line($type, $match['line']); + + if (null !== $chunk) { + $chunk->setLines($diffLines); + } + } + } + + $diff->setChunks($chunks); + } +} diff --git a/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php new file mode 100644 index 00000000..fd19cac7 --- /dev/null +++ b/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Diff; + +use function array_reverse; +use function count; +use function max; +use SplFixedArray; + +final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator +{ + /** + * {@inheritdoc} + */ + public function calculate(array $from, array $to): array + { + $common = []; + $fromLength = count($from); + $toLength = count($to); + $width = $fromLength + 1; + $matrix = new SplFixedArray($width * ($toLength + 1)); + + for ($i = 0; $i <= $fromLength; ++$i) { + $matrix[$i] = 0; + } + + for ($j = 0; $j <= $toLength; ++$j) { + $matrix[$j * $width] = 0; + } + + for ($i = 1; $i <= $fromLength; ++$i) { + for ($j = 1; $j <= $toLength; ++$j) { + $o = ($j * $width) + $i; + $matrix[$o] = max( + $matrix[$o - 1], + $matrix[$o - $width], + $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0 + ); + } + } + + $i = $fromLength; + $j = $toLength; + + while ($i > 0 && $j > 0) { + if ($from[$i - 1] === $to[$j - 1]) { + $common[] = $from[$i - 1]; + --$i; + --$j; + } else { + $o = ($j * $width) + $i; + + if ($matrix[$o - $width] > $matrix[$o - 1]) { + --$j; + } else { + --$i; + } + } + } + + return array_reverse($common); + } +} diff --git a/vendor/vimeo/psalm/LICENSE b/vendor/vimeo/psalm/LICENSE new file mode 100644 index 00000000..bfb2d1c5 --- /dev/null +++ b/vendor/vimeo/psalm/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Vimeo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/vimeo/psalm/composer.json b/vendor/vimeo/psalm/composer.json new file mode 100644 index 00000000..ddbe93f4 --- /dev/null +++ b/vendor/vimeo/psalm/composer.json @@ -0,0 +1,134 @@ +{ + "name": "vimeo/psalm", + "type": "library", + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "php", + "code", + "inspection" + ], + "license": "MIT", + "authors": [ + { + "name": "Matthew Brown" + } + ], + "require": { + "php": "^7.1|^8", + "ext-SimpleXML": "*", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer/package-versions-deprecated": "^1.8.0", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "felixfbecker/advanced-json-rpc": "^3.0.3", + "felixfbecker/language-server-protocol": "^1.5", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.13", + "openlss/lib-array2xml": "^1.0", + "sebastian/diff": "^3.0 || ^4.0", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.25", + "webmozart/path-util": "^2.3" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "ext-curl": "*", + "bamarni/composer-bin-plugin": "^1.2", + "brianium/paratest": "^4.0||^6.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpdocumentor/reflection-docblock": "^5", + "phpmyadmin/sql-parser": "5.1.0||dev-master", + "phpspec/prophecy": ">=1.9.0", + "phpunit/phpunit": "^9.0", + "psalm/plugin-phpunit": "^0.16", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.3 || ^5.0 || ^6.0", + "weirdan/prophecy-shim": "^1.0 || ^2.0" + }, + "suggest": { + "ext-igbinary": "^2.0.5 is required, used to serialize caching data", + "ext-curl": "In order to send data to shepherd" + }, + "config": { + "allow-plugins": { + "bamarni/composer-bin-plugin": true, + "composer/package-versions-deprecated": true, + "dealerdirect/phpcodesniffer-composer-installer": true + }, + "optimize-autoloader": true, + "sort-packages": true, + "platform-check": false + }, + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psalm\\": "src/Psalm/" + }, + "files": [ + "src/functions.php", + "src/spl_object_id.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Psalm\\Tests\\": "tests/" + } + }, + "repositories": [ + { + "type": "path", + "url": "examples/plugins/composer-based/echo-checker" + } + ], + "minimum-stability": "dev", + "prefer-stable": true, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "scripts": { + "cs": "phpcs -p", + "cs-fix": "phpcbf -p", + "lint": "parallel-lint ./src ./tests", + "phpunit": "paratest --runner=WrapperRunner", + "phpunit-std": "phpunit", + "verify-callmap": "phpunit tests/Internal/Codebase/InternalCallMapHandlerTest.php", + "psalm": "@php ./psalm --find-dead-code", + "tests": [ + "@lint", + "@cs", + "@psalm", + "@phpunit" + ] + }, + "scripts-descriptions": { + "cs": "Checks that the code conforms to the coding standard.", + "cs-fix": "Automatically correct coding standard violations.", + "lint": "Runs unit tests.", + "phpunit": "Runs unit tests in parallel.", + "phpunit-std": "Runs unit tests.", + "psalm": "Runs static analysis.", + "tests": "Runs all available tests." + } +} diff --git a/vendor/vimeo/psalm/config.xsd b/vendor/vimeo/psalm/config.xsd new file mode 100644 index 00000000..e942fcba --- /dev/null +++ b/vendor/vimeo/psalm/config.xsd @@ -0,0 +1,708 @@ + + + + + + + + + + + + + + + + + + Deprecated. Replaced by documenting never as a return type. It is going to be removed in Psalm 5. + + + + + + + + + + + + + + + + + + + + + + + + + + Deprecated. Has no effect since Psalm 3 and is going to be removed in Psalm 5. + + + + + + + + + + Deprecated. PHPStorm now supports generics for the most part and @psalm- annotations can be used + + + + + + + + + + + + + + + Deprecated. Will be replaced by adding echo to forbiddenFunctions in Psalm 5. + + + + + + + + + + + + + Default is runtime-specific: if not present, Psalm will only load the Xdebug stub if psalm has unloaded the extension. + + + + + Deprecated. In Psalm 5 extensions will be loaded based on composer.json and overridden with enableExtensions/disableExtensions. + + + + + + + + + + + + Setting `totallyTyped` to `"true"` is equivalent to setting `errorLevel` to `"1"`. Setting `totallyTyped` to `"false"` is equivalent to setting `errorLevel` to `"2"` and `reportMixedIssues` to `"false"` + + + + + Deprecated. Replaced by `errorLevel` and `reportMixedIssues`. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/vimeo/psalm/dictionaries/CallMap.php b/vendor/vimeo/psalm/dictionaries/CallMap.php new file mode 100644 index 00000000..219e6372 --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/CallMap.php @@ -0,0 +1,16820 @@ +' => [', ''=>''] + * alternative signature for the same function + * '' => [', ''=>''] + * + * A '&' in front of the means the arg is always passed by reference. + * (i.e. ReflectionParameter->isPassedByReference()) + * This was previously only used in cases where the function actually created the + * variable in the local scope. + * Some reference arguments will have prefixes in to indicate the way the argument is used. + * Currently, the only prefixes with meaning are 'rw_' (read-write) and 'w_' (write). + * Those prefixes don't mean anything for non-references. + * Code using these signatures should remove those prefixes from messages rendered to the user. + * 1. '&rw_' indicates that a parameter with a value is expected to be passed in, and may be modified. + * Phan will warn if the variable has an incompatible type, or is undefined. + * 2. '&w_' indicates that a parameter is expected to be passed in, and the value will be ignored, and may be overwritten. + * 3. The absence of a prefix is treated by Phan the same way as having the prefix 'w_' (Some may be changed to 'rw_name'). These will have prefixes added later. + * + * So, for functions like sort() where technically the arg is by-ref, + * indicate the reference param's signature by-ref and read-write, + * as `'&rw_array'=>'array'` + * so that Phan won't create it in the local scope + * + * However, for a function like preg_match() where the 3rd arg is an array of sub-pattern matches (and optional), + * this arg needs to be marked as by-ref and write-only, as `'&w_matches='=>'array'`. + * + * A '=' following the indicates this arg is optional. + * + * The can begin with '...' to indicate the arg is variadic. + * '...args=' indicates it is both variadic and optional. + * + * Some reference arguments will have prefixes in to indicate the way the argument is used. + * Currently, the only prefixes with meaning are 'rw_' and 'w_'. + * Code using these signatures should remove those prefixes from messages rendered to the user. + * 1. '&rw_name' indicates that a parameter with a value is expected to be passed in, and may be modified. + * 2. '&w_name' indicates that a parameter is expected to be passed in, and the value will be ignored, and may be overwritten. + * + * This file contains the signatures for the most recent minor release of PHP supported by phan (php 7.2) + * + * Changes: + * + * In Phan 0.12.3, + * + * - This started using array shapes for union types (array{...}). + * + * \Phan\Language\UnionType->withFlattenedArrayShapeOrLiteralTypeInstances() may be of help to programmatically convert these to array|array + * + * - This started using array shapes with optional fields for union types (array{key?:int}). + * A `?` after the array shape field's key indicates that the field is optional. + * + * - This started adding param signatures and return signatures to `callable` types. + * E.g. 'usort' => ['bool', '&rw_array_arg'=>'array', 'cmp_function'=>'callable(mixed,mixed):int']. + * See NEWS.md for 0.12.3 for possible syntax. A suffix of `=` within `callable(...)` means that a parameter is optional. + * + * (Phan assumes that callbacks with optional arguments can be cast to callbacks with/without those args (Similar to inheritance checks) + * (e.g. callable(T1,T2=) can be cast to callable(T1) or callable(T1,T2), in the same way that a subclass would check). + * For some signatures, e.g. set_error_handler, this results in repetition, because callable(T1=) can't cast to callable(T1). + * + * Sources of stub info: + * + * 1. Reflection + * 2. docs.php.net's SVN repo or website, and examples (See internal/internalsignatures.php) + * + * See https://secure.php.net/manual/en/copyright.php + * + * The PHP manual text and comments are covered by the [Creative Commons Attribution 3.0 License](http://creativecommons.org/licenses/by/3.0/legalcode), + * copyright (c) the PHP Documentation Group + * 3. Various websites documenting individual extensions + * 4. PHPStorm stubs (For anything missing from the above sources) + * See internal/internalsignatures.php + * + * Available from https://github.com/JetBrains/phpstorm-stubs under the [Apache 2 license](https://www.apache.org/licenses/LICENSE-2.0) + * + * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file) + * + * Note: Some of Phan's inferences about return types are written as plugins for functions/methods where the return type depends on the parameter types. + * E.g. src/Phan/Plugin/Internal/DependentReturnTypeOverridePlugin.php is one plugin + */ +return [ +'_' => ['string', 'message'=>'string'], +'__halt_compiler' => ['void'], +'abs' => ['0|positive-int', 'num'=>'int'], +'abs\'1' => ['float', 'num'=>'float'], +'abs\'2' => ['numeric', 'num'=>'numeric'], +'accelerator_get_configuration' => ['array'], +'accelerator_get_scripts' => ['array'], +'accelerator_get_status' => ['array', 'fetch_scripts'=>'bool'], +'accelerator_reset' => [''], +'accelerator_set_status' => ['void', 'status'=>'bool'], +'acos' => ['float', 'num'=>'float'], +'acosh' => ['float', 'num'=>'float'], +'addcslashes' => ['string', 'string'=>'string', 'characters'=>'string'], +'addslashes' => ['string', 'string'=>'string'], +'AMQPBasicProperties::__construct' => ['void', 'content_type='=>'string', 'content_encoding='=>'string', 'headers='=>'array', 'delivery_mode='=>'int', 'priority='=>'int', 'correlation_id='=>'string', 'reply_to='=>'string', 'expiration='=>'string', 'message_id='=>'string', 'timestamp='=>'int', 'type='=>'string', 'user_id='=>'string', 'app_id='=>'string', 'cluster_id='=>'string'], +'AMQPBasicProperties::getAppId' => ['string'], +'AMQPBasicProperties::getClusterId' => ['string'], +'AMQPBasicProperties::getContentEncoding' => ['string'], +'AMQPBasicProperties::getContentType' => ['string'], +'AMQPBasicProperties::getCorrelationId' => ['string'], +'AMQPBasicProperties::getDeliveryMode' => ['int'], +'AMQPBasicProperties::getExpiration' => ['string'], +'AMQPBasicProperties::getHeaders' => ['array'], +'AMQPBasicProperties::getMessageId' => ['string'], +'AMQPBasicProperties::getPriority' => ['int'], +'AMQPBasicProperties::getReplyTo' => ['string'], +'AMQPBasicProperties::getTimestamp' => ['string'], +'AMQPBasicProperties::getType' => ['string'], +'AMQPBasicProperties::getUserId' => ['string'], +'AMQPChannel::__construct' => ['void', 'amqp_connection'=>'AMQPConnection'], +'AMQPChannel::basicRecover' => ['', 'requeue='=>'bool'], +'AMQPChannel::close' => [''], +'AMQPChannel::commitTransaction' => ['bool'], +'AMQPChannel::confirmSelect' => [''], +'AMQPChannel::getChannelId' => ['int'], +'AMQPChannel::getConnection' => ['AMQPConnection'], +'AMQPChannel::getConsumers' => ['AMQPQueue[]'], +'AMQPChannel::getPrefetchCount' => ['int'], +'AMQPChannel::getPrefetchSize' => ['int'], +'AMQPChannel::isConnected' => ['bool'], +'AMQPChannel::qos' => ['bool', 'size'=>'int', 'count'=>'int'], +'AMQPChannel::rollbackTransaction' => ['bool'], +'AMQPChannel::setConfirmCallback' => ['', 'ack_callback='=>'?callable', 'nack_callback='=>'?callable'], +'AMQPChannel::setPrefetchCount' => ['bool', 'count'=>'int'], +'AMQPChannel::setPrefetchSize' => ['bool', 'size'=>'int'], +'AMQPChannel::setReturnCallback' => ['', 'return_callback='=>'?callable'], +'AMQPChannel::startTransaction' => ['bool'], +'AMQPChannel::waitForBasicReturn' => ['', 'timeout='=>'float'], +'AMQPChannel::waitForConfirm' => ['', 'timeout='=>'float'], +'AMQPConnection::__construct' => ['void', 'credentials='=>'array'], +'AMQPConnection::connect' => ['bool'], +'AMQPConnection::disconnect' => ['bool'], +'AMQPConnection::getCACert' => ['string'], +'AMQPConnection::getCert' => ['string'], +'AMQPConnection::getHeartbeatInterval' => ['int'], +'AMQPConnection::getHost' => ['string'], +'AMQPConnection::getKey' => ['string'], +'AMQPConnection::getLogin' => ['string'], +'AMQPConnection::getMaxChannels' => ['?int'], +'AMQPConnection::getMaxFrameSize' => ['int'], +'AMQPConnection::getPassword' => ['string'], +'AMQPConnection::getPort' => ['int'], +'AMQPConnection::getReadTimeout' => ['float'], +'AMQPConnection::getTimeout' => ['float'], +'AMQPConnection::getUsedChannels' => ['int'], +'AMQPConnection::getVerify' => ['bool'], +'AMQPConnection::getVhost' => ['string'], +'AMQPConnection::getWriteTimeout' => ['float'], +'AMQPConnection::isConnected' => ['bool'], +'AMQPConnection::isPersistent' => ['?bool'], +'AMQPConnection::pconnect' => ['bool'], +'AMQPConnection::pdisconnect' => ['bool'], +'AMQPConnection::preconnect' => ['bool'], +'AMQPConnection::reconnect' => ['bool'], +'AMQPConnection::setCACert' => ['', 'cacert'=>'string'], +'AMQPConnection::setCert' => ['', 'cert'=>'string'], +'AMQPConnection::setHost' => ['bool', 'host'=>'string'], +'AMQPConnection::setKey' => ['', 'key'=>'string'], +'AMQPConnection::setLogin' => ['bool', 'login'=>'string'], +'AMQPConnection::setPassword' => ['bool', 'password'=>'string'], +'AMQPConnection::setPort' => ['bool', 'port'=>'int'], +'AMQPConnection::setReadTimeout' => ['bool', 'timeout'=>'int'], +'AMQPConnection::setTimeout' => ['bool', 'timeout'=>'int'], +'AMQPConnection::setVerify' => ['', 'verify'=>'bool'], +'AMQPConnection::setVhost' => ['bool', 'vhost'=>'string'], +'AMQPConnection::setWriteTimeout' => ['bool', 'timeout'=>'int'], +'AMQPDecimal::__construct' => ['void', 'exponent'=>'', 'significand'=>''], +'AMQPDecimal::getExponent' => ['int'], +'AMQPDecimal::getSignificand' => ['int'], +'AMQPEnvelope::__construct' => ['void'], +'AMQPEnvelope::getAppId' => ['string'], +'AMQPEnvelope::getBody' => ['string'], +'AMQPEnvelope::getClusterId' => ['string'], +'AMQPEnvelope::getConsumerTag' => ['string'], +'AMQPEnvelope::getContentEncoding' => ['string'], +'AMQPEnvelope::getContentType' => ['string'], +'AMQPEnvelope::getCorrelationId' => ['string'], +'AMQPEnvelope::getDeliveryMode' => ['int'], +'AMQPEnvelope::getDeliveryTag' => ['string'], +'AMQPEnvelope::getExchangeName' => ['string'], +'AMQPEnvelope::getExpiration' => ['string'], +'AMQPEnvelope::getHeader' => ['string|false', 'header_key'=>'string'], +'AMQPEnvelope::getHeaders' => ['array'], +'AMQPEnvelope::getMessageId' => ['string'], +'AMQPEnvelope::getPriority' => ['int'], +'AMQPEnvelope::getReplyTo' => ['string'], +'AMQPEnvelope::getRoutingKey' => ['string'], +'AMQPEnvelope::getTimeStamp' => ['string'], +'AMQPEnvelope::getType' => ['string'], +'AMQPEnvelope::getUserId' => ['string'], +'AMQPEnvelope::hasHeader' => ['bool', 'header_key'=>'string'], +'AMQPEnvelope::isRedelivery' => ['bool'], +'AMQPExchange::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'], +'AMQPExchange::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], +'AMQPExchange::declareExchange' => ['bool'], +'AMQPExchange::delete' => ['bool', 'exchangeName='=>'string', 'flags='=>'int'], +'AMQPExchange::getArgument' => ['int|string|false', 'key'=>'string'], +'AMQPExchange::getArguments' => ['array'], +'AMQPExchange::getChannel' => ['AMQPChannel'], +'AMQPExchange::getConnection' => ['AMQPConnection'], +'AMQPExchange::getFlags' => ['int'], +'AMQPExchange::getName' => ['string'], +'AMQPExchange::getType' => ['string'], +'AMQPExchange::hasArgument' => ['bool', 'key'=>'string'], +'AMQPExchange::publish' => ['bool', 'message'=>'string', 'routing_key='=>'string', 'flags='=>'int', 'attributes='=>'array'], +'AMQPExchange::setArgument' => ['bool', 'key'=>'string', 'value'=>'int|string'], +'AMQPExchange::setArguments' => ['bool', 'arguments'=>'array'], +'AMQPExchange::setFlags' => ['bool', 'flags'=>'int'], +'AMQPExchange::setName' => ['bool', 'exchange_name'=>'string'], +'AMQPExchange::setType' => ['bool', 'exchange_type'=>'string'], +'AMQPExchange::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], +'AMQPQueue::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'], +'AMQPQueue::ack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], +'AMQPQueue::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], +'AMQPQueue::cancel' => ['bool', 'consumer_tag='=>'string'], +'AMQPQueue::consume' => ['void', 'callback='=>'?callable', 'flags='=>'int', 'consumerTag='=>'string'], +'AMQPQueue::declareQueue' => ['int'], +'AMQPQueue::delete' => ['int', 'flags='=>'int'], +'AMQPQueue::get' => ['AMQPEnvelope|false', 'flags='=>'int'], +'AMQPQueue::getArgument' => ['int|string|false', 'key'=>'string'], +'AMQPQueue::getArguments' => ['array'], +'AMQPQueue::getChannel' => ['AMQPChannel'], +'AMQPQueue::getConnection' => ['AMQPConnection'], +'AMQPQueue::getConsumerTag' => ['?string'], +'AMQPQueue::getFlags' => ['int'], +'AMQPQueue::getName' => ['string'], +'AMQPQueue::hasArgument' => ['bool', 'key'=>'string'], +'AMQPQueue::nack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], +'AMQPQueue::purge' => ['bool'], +'AMQPQueue::reject' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], +'AMQPQueue::setArgument' => ['bool', 'key'=>'string', 'value'=>'mixed'], +'AMQPQueue::setArguments' => ['bool', 'arguments'=>'array'], +'AMQPQueue::setFlags' => ['bool', 'flags'=>'int'], +'AMQPQueue::setName' => ['bool', 'queue_name'=>'string'], +'AMQPQueue::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], +'AMQPTimestamp::__construct' => ['void', 'timestamp'=>'string'], +'AMQPTimestamp::__toString' => ['string'], +'AMQPTimestamp::getTimestamp' => ['string'], +'apache_child_terminate' => ['bool'], +'apache_get_modules' => ['array'], +'apache_get_version' => ['string|false'], +'apache_getenv' => ['string|false', 'variable'=>'string', 'walk_to_top='=>'bool'], +'apache_lookup_uri' => ['object', 'filename'=>'string'], +'apache_note' => ['string|false', 'note_name'=>'string', 'note_value='=>'string'], +'apache_request_headers' => ['array|false'], +'apache_reset_timeout' => ['bool'], +'apache_response_headers' => ['array|false'], +'apache_setenv' => ['bool', 'variable'=>'string', 'value'=>'string', 'walk_to_top='=>'bool'], +'apc_add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'ttl='=>'int'], +'apc_add\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], +'apc_bin_dump' => ['string|false|null', 'files='=>'array', 'user_vars='=>'array'], +'apc_bin_dumpfile' => ['int|false', 'files'=>'array', 'user_vars'=>'array', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], +'apc_bin_load' => ['bool', 'data'=>'string', 'flags='=>'int'], +'apc_bin_loadfile' => ['bool', 'filename'=>'string', 'context='=>'resource', 'flags='=>'int'], +'apc_cache_info' => ['array|false', 'cache_type='=>'string', 'limited='=>'bool'], +'apc_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'], +'apc_clear_cache' => ['bool', 'cache_type='=>'string'], +'apc_compile_file' => ['bool', 'filename'=>'string', 'atomic='=>'bool'], +'apc_dec' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool'], +'apc_define_constants' => ['bool', 'key'=>'string', 'constants'=>'array', 'case_sensitive='=>'bool'], +'apc_delete' => ['bool', 'key'=>'string|string[]|APCIterator'], +'apc_delete_file' => ['bool|string[]', 'keys'=>'mixed'], +'apc_exists' => ['bool', 'keys'=>'string'], +'apc_exists\'1' => ['array', 'keys'=>'string[]'], +'apc_fetch' => ['mixed|false', 'key'=>'string', '&w_success='=>'bool'], +'apc_fetch\'1' => ['array|false', 'key'=>'string[]', '&w_success='=>'bool'], +'apc_inc' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool'], +'apc_load_constants' => ['bool', 'key'=>'string', 'case_sensitive='=>'bool'], +'apc_sma_info' => ['array|false', 'limited='=>'bool'], +'apc_store' => ['bool', 'key'=>'string', 'var'=>'', 'ttl='=>'int'], +'apc_store\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], +'APCIterator::__construct' => ['void', 'cache'=>'string', 'search='=>'null|string|string[]', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'], +'APCIterator::current' => ['mixed|false'], +'APCIterator::getTotalCount' => ['int|false'], +'APCIterator::getTotalHits' => ['int|false'], +'APCIterator::getTotalSize' => ['int|false'], +'APCIterator::key' => ['string'], +'APCIterator::next' => ['void'], +'APCIterator::rewind' => ['void'], +'APCIterator::valid' => ['bool'], +'apcu_add' => ['bool', 'key'=>'string', 'var'=>'', 'ttl='=>'int'], +'apcu_add\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], +'apcu_cache_info' => ['array|false', 'limited='=>'bool'], +'apcu_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'], +'apcu_clear_cache' => ['bool'], +'apcu_dec' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'], +'apcu_delete' => ['bool', 'key'=>'string|APCuIterator'], +'apcu_delete\'1' => ['list', 'key'=>'string[]'], +'apcu_enabled' => ['bool'], +'apcu_entry' => ['mixed', 'key'=>'string', 'generator'=>'callable', 'ttl='=>'int'], +'apcu_exists' => ['bool', 'keys'=>'string'], +'apcu_exists\'1' => ['array', 'keys'=>'string[]'], +'apcu_fetch' => ['mixed|false', 'key'=>'string', '&w_success='=>'bool'], +'apcu_fetch\'1' => ['array|false', 'key'=>'string[]', '&w_success='=>'bool'], +'apcu_inc' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'], +'apcu_key_info' => ['?array', 'key'=>'string'], +'apcu_sma_info' => ['array|false', 'limited='=>'bool'], +'apcu_store' => ['bool', 'key'=>'string', 'var='=>'', 'ttl='=>'int'], +'apcu_store\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], +'APCuIterator::__construct' => ['void', 'search='=>'string|string[]|null', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'], +'APCuIterator::current' => ['mixed'], +'APCuIterator::getTotalCount' => ['int'], +'APCuIterator::getTotalHits' => ['int'], +'APCuIterator::getTotalSize' => ['int'], +'APCuIterator::key' => ['string'], +'APCuIterator::next' => ['void'], +'APCuIterator::rewind' => ['void'], +'APCuIterator::valid' => ['bool'], +'apd_breakpoint' => ['bool', 'debug_level'=>'int'], +'apd_callstack' => ['array'], +'apd_clunk' => ['void', 'warning'=>'string', 'delimiter='=>'string'], +'apd_continue' => ['bool', 'debug_level'=>'int'], +'apd_croak' => ['void', 'warning'=>'string', 'delimiter='=>'string'], +'apd_dump_function_table' => ['void'], +'apd_dump_persistent_resources' => ['array'], +'apd_dump_regular_resources' => ['array'], +'apd_echo' => ['bool', 'output'=>'string'], +'apd_get_active_symbols' => ['array'], +'apd_set_pprof_trace' => ['string', 'dump_directory='=>'string', 'fragment='=>'string'], +'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'], +'AppendIterator::__construct' => ['void'], +'AppendIterator::append' => ['void', 'iterator'=>'Iterator'], +'AppendIterator::current' => ['mixed'], +'AppendIterator::getArrayIterator' => ['ArrayIterator'], +'AppendIterator::getInnerIterator' => ['Iterator'], +'AppendIterator::getIteratorIndex' => ['int'], +'AppendIterator::key' => ['int|string|float|bool'], +'AppendIterator::next' => ['void'], +'AppendIterator::rewind' => ['void'], +'AppendIterator::valid' => ['bool'], +'ArgumentCountError::__clone' => ['void'], +'ArgumentCountError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], +'ArgumentCountError::__toString' => ['string'], +'ArgumentCountError::__wakeup' => ['void'], +'ArgumentCountError::getCode' => ['int'], +'ArgumentCountError::getFile' => ['string'], +'ArgumentCountError::getLine' => ['int'], +'ArgumentCountError::getMessage' => ['string'], +'ArgumentCountError::getPrevious' => ['?Throwable'], +'ArgumentCountError::getTrace' => ['list\',args?:array}>'], +'ArgumentCountError::getTraceAsString' => ['string'], +'ArithmeticError::__clone' => ['void'], +'ArithmeticError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], +'ArithmeticError::__toString' => ['string'], +'ArithmeticError::__wakeup' => ['void'], +'ArithmeticError::getCode' => ['int'], +'ArithmeticError::getFile' => ['string'], +'ArithmeticError::getLine' => ['int'], +'ArithmeticError::getMessage' => ['string'], +'ArithmeticError::getPrevious' => ['?Throwable'], +'ArithmeticError::getTrace' => ['list\',args?:array}>'], +'ArithmeticError::getTraceAsString' => ['string'], +'array_change_key_case' => ['associative-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_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_is_list' => ['bool', 'array'=>'array'], +'array_key_exists' => ['bool', 'key'=>'string|int', 'array'=>'array'], +'array_key_first' => ['int|string|null', 'array'=>'array'], +'array_key_last' => ['int|string|null', 'array'=>'array'], +'array_keys' => ['list', 'array'=>'array', 'filter_value='=>'mixed', 'strict='=>'bool'], +'array_map' => ['array', 'callback'=>'?callable', 'array'=>'array', '...arrays='=>'array'], +'array_merge' => ['array', '...arrays='=>'array'], +'array_merge_recursive' => ['array', '...arrays='=>'array'], +'array_multisort' => ['bool', '&rw_array'=>'array', 'rest='=>'array|int', 'array1_sort_flags='=>'array|int', '...args='=>'array|int'], +'array_pad' => ['array', 'array'=>'array', 'length'=>'int', 'value'=>'mixed'], +'array_pop' => ['mixed', '&rw_array'=>'array'], +'array_product' => ['int|float', 'array'=>'array'], +'array_push' => ['int', '&rw_array'=>'array', '...values='=>'mixed'], +'array_rand' => ['int|string|array|array', 'array'=>'non-empty-array', 'num'=>'int'], +'array_rand\'1' => ['int|string', 'array'=>'array'], +'array_reduce' => ['mixed', 'array'=>'array', 'callback'=>'callable(mixed,mixed):mixed', 'initial='=>'mixed'], +'array_replace' => ['array', 'array'=>'array', '...replacements='=>'array'], +'array_replace_recursive' => ['array', 'array'=>'array', '...replacements='=>'array'], +'array_reverse' => ['array', 'array'=>'array', 'preserve_keys='=>'bool'], +'array_search' => ['int|string|false', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'], +'array_shift' => ['mixed|null', '&rw_array'=>'array'], +'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_unique' => ['array', 'array'=>'array', 'flags='=>'0'], +'array_unique\'1' => ['array', 'array'=>'array', 'flags='=>'1'], +'array_unique\'2' => ['array', 'array'=>'array', 'flags='=>'2|5'], +'array_unshift' => ['int', '&rw_array'=>'array', '...values='=>'mixed'], +'array_values' => ['list', 'array'=>'array'], +'array_walk' => ['bool', '&rw_array'=>'array', 'callback'=>'callable', 'arg='=>'mixed'], +'array_walk\'1' => ['bool', '&rw_array'=>'object', 'callback'=>'callable', 'arg='=>'mixed'], +'array_walk_recursive' => ['bool', '&rw_array'=>'array', 'callback'=>'callable', 'arg='=>'mixed'], +'array_walk_recursive\'1' => ['bool', '&rw_array'=>'object', 'callback'=>'callable', 'arg='=>'mixed'], +'ArrayAccess::offsetExists' => ['bool', 'offset'=>'mixed'], +'ArrayAccess::offsetGet' => ['mixed', 'offset'=>'mixed'], +'ArrayAccess::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], +'ArrayAccess::offsetUnset' => ['void', 'offset'=>'mixed'], +'ArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'], +'ArrayIterator::append' => ['void', 'value'=>'mixed'], +'ArrayIterator::asort' => ['void'], +'ArrayIterator::count' => ['int'], +'ArrayIterator::current' => ['mixed'], +'ArrayIterator::getArrayCopy' => ['array'], +'ArrayIterator::getFlags' => ['int'], +'ArrayIterator::key' => ['int|string|false'], +'ArrayIterator::ksort' => ['void'], +'ArrayIterator::natcasesort' => ['void'], +'ArrayIterator::natsort' => ['void'], +'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::rewind' => ['void'], +'ArrayIterator::seek' => ['void', 'position'=>'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::valid' => ['bool'], +'ArrayObject::__construct' => ['void', 'input='=>'array|object', 'flags='=>'int', 'iterator_class='=>'string'], +'ArrayObject::append' => ['void', 'value'=>'mixed'], +'ArrayObject::asort' => ['void'], +'ArrayObject::count' => ['int'], +'ArrayObject::exchangeArray' => ['array', 'ar'=>'mixed'], +'ArrayObject::getArrayCopy' => ['array'], +'ArrayObject::getFlags' => ['int'], +'ArrayObject::getIterator' => ['ArrayIterator'], +'ArrayObject::getIteratorClass' => ['string'], +'ArrayObject::ksort' => ['void'], +'ArrayObject::natcasesort' => ['void'], +'ArrayObject::natsort' => ['void'], +'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::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'], +'arsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], +'asin' => ['float', 'num'=>'float'], +'asinh' => ['float', 'num'=>'float'], +'asort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], +'assert' => ['bool', 'assertion'=>'string|bool|int', 'description='=>'string|Throwable|null'], +'assert_options' => ['mixed|false', 'option'=>'int', 'value='=>'mixed'], +'ast\get_kind_name' => ['string', 'kind'=>'int'], +'ast\get_metadata' => ['array'], +'ast\get_supported_versions' => ['array', 'exclude_deprecated='=>'bool'], +'ast\kind_uses_flags' => ['bool', 'kind'=>'int'], +'ast\Node::__construct' => ['void', 'kind='=>'int', 'flags='=>'int', 'children='=>'ast\Node\Decl[]|ast\Node[]|int[]|string[]|float[]|bool[]|null[]', 'start_line='=>'int'], +'ast\parse_code' => ['ast\Node', 'code'=>'string', 'version'=>'int', 'filename='=>'string'], +'ast\parse_file' => ['ast\Node', 'filename'=>'string', 'version'=>'int'], +'atan' => ['float', 'num'=>'float'], +'atan2' => ['float', 'y'=>'float', 'x'=>'float'], +'atanh' => ['float', 'num'=>'float'], +'BadFunctionCallException::__clone' => ['void'], +'BadFunctionCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?BadFunctionCallException'], +'BadFunctionCallException::__toString' => ['string'], +'BadFunctionCallException::getCode' => ['int'], +'BadFunctionCallException::getFile' => ['string'], +'BadFunctionCallException::getLine' => ['int'], +'BadFunctionCallException::getMessage' => ['string'], +'BadFunctionCallException::getPrevious' => ['?Throwable|?BadFunctionCallException'], +'BadFunctionCallException::getTrace' => ['list\',args?:array}>'], +'BadFunctionCallException::getTraceAsString' => ['string'], +'BadMethodCallException::__clone' => ['void'], +'BadMethodCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?BadMethodCallException'], +'BadMethodCallException::__toString' => ['string'], +'BadMethodCallException::getCode' => ['int'], +'BadMethodCallException::getFile' => ['string'], +'BadMethodCallException::getLine' => ['int'], +'BadMethodCallException::getMessage' => ['string'], +'BadMethodCallException::getPrevious' => ['?Throwable|?BadMethodCallException'], +'BadMethodCallException::getTrace' => ['list\',args?:array}>'], +'BadMethodCallException::getTraceAsString' => ['string'], +'base64_decode' => ['string|false', 'string'=>'string', 'strict='=>'bool'], +'base64_encode' => ['string', 'string'=>'string'], +'base_convert' => ['string', 'num'=>'string', 'from_base'=>'int', 'to_base'=>'int'], +'basename' => ['string', 'path'=>'string', 'suffix='=>'string'], +'bbcode_add_element' => ['bool', 'bbcode_container'=>'resource', 'tag_name'=>'string', 'tag_rules'=>'array'], +'bbcode_add_smiley' => ['bool', 'bbcode_container'=>'resource', 'smiley'=>'string', 'replace_by'=>'string'], +'bbcode_create' => ['resource', 'bbcode_initial_tags='=>'array'], +'bbcode_destroy' => ['bool', 'bbcode_container'=>'resource'], +'bbcode_parse' => ['string', 'bbcode_container'=>'resource', 'to_parse'=>'string'], +'bbcode_set_arg_parser' => ['bool', 'bbcode_container'=>'resource', 'bbcode_arg_parser'=>'resource'], +'bbcode_set_flags' => ['bool', 'bbcode_container'=>'resource', 'flags'=>'int', 'mode='=>'int'], +'bcadd' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], +'bccomp' => ['int', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], +'bcdiv' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int|null'], +'bcmod' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int|null'], +'bcmul' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], +'bcompiler_load' => ['bool', 'filename'=>'string'], +'bcompiler_load_exe' => ['bool', 'filename'=>'string'], +'bcompiler_parse_class' => ['bool', 'class'=>'string', 'callback'=>'string'], +'bcompiler_read' => ['bool', 'filehandle'=>'resource'], +'bcompiler_write_class' => ['bool', 'filehandle'=>'resource', 'classname'=>'string', 'extends='=>'string'], +'bcompiler_write_constant' => ['bool', 'filehandle'=>'resource', 'constantname'=>'string'], +'bcompiler_write_exe_footer' => ['bool', 'filehandle'=>'resource', 'startpos'=>'int'], +'bcompiler_write_file' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], +'bcompiler_write_footer' => ['bool', 'filehandle'=>'resource'], +'bcompiler_write_function' => ['bool', 'filehandle'=>'resource', 'functionname'=>'string'], +'bcompiler_write_functions_from_file' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], +'bcompiler_write_header' => ['bool', 'filehandle'=>'resource', 'write_ver='=>'string'], +'bcompiler_write_included_filename' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], +'bcpow' => ['numeric-string', 'num'=>'numeric-string', 'exponent'=>'numeric-string', 'scale='=>'int|null'], +'bcpowmod' => ['numeric-string|false', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'modulus'=>'numeric-string', 'scale='=>'int|null'], +'bcscale' => ['int', 'scale='=>'int|null'], +'bcsqrt' => ['numeric-string|null', 'num'=>'numeric-string', 'scale='=>'int|null'], +'bcsub' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], +'bin2hex' => ['string', 'string'=>'string'], +'bind_textdomain_codeset' => ['string', 'domain'=>'string', 'codeset'=>'string'], +'bindec' => ['float|int', 'binary_string'=>'string'], +'bindtextdomain' => ['string', 'domain'=>'string', 'directory'=>'string'], +'birdstep_autocommit' => ['bool', 'index'=>'int'], +'birdstep_close' => ['bool', 'id'=>'int'], +'birdstep_commit' => ['bool', 'index'=>'int'], +'birdstep_connect' => ['int', 'server'=>'string', 'user'=>'string', 'pass'=>'string'], +'birdstep_exec' => ['int', 'index'=>'int', 'exec_str'=>'string'], +'birdstep_fetch' => ['bool', 'index'=>'int'], +'birdstep_fieldname' => ['string', 'index'=>'int', 'col'=>'int'], +'birdstep_fieldnum' => ['int', 'index'=>'int'], +'birdstep_freeresult' => ['bool', 'index'=>'int'], +'birdstep_off_autocommit' => ['bool', 'index'=>'int'], +'birdstep_result' => ['', 'index'=>'int', 'col'=>''], +'birdstep_rollback' => ['bool', 'index'=>'int'], +'blenc_encrypt' => ['string', 'plaintext'=>'string', 'encodedfile'=>'string', 'encryption_key='=>'string'], +'boolval' => ['bool', 'value'=>'mixed'], +'bson_decode' => ['array', 'bson'=>'string'], +'bson_encode' => ['string', 'anything'=>'mixed'], +'bzclose' => ['bool', 'bz'=>'resource'], +'bzcompress' => ['string|int', 'data'=>'string', 'block_size='=>'int', 'work_factor='=>'int'], +'bzdecompress' => ['string|int', 'data'=>'string', 'use_less_memory='=>'int'], +'bzerrno' => ['int', 'bz'=>'resource'], +'bzerror' => ['array', 'bz'=>'resource'], +'bzerrstr' => ['string', 'bz'=>'resource'], +'bzflush' => ['bool', 'bz'=>'resource'], +'bzopen' => ['resource|false', 'file'=>'string|resource', 'mode'=>'string'], +'bzread' => ['string|false', 'bz'=>'resource', 'length='=>'int'], +'bzwrite' => ['int|false', 'bz'=>'resource', 'data'=>'string', 'length='=>'int'], +'CachingIterator::__construct' => ['void', 'iterator'=>'Iterator', 'flags='=>''], +'CachingIterator::__toString' => ['string'], +'CachingIterator::count' => ['int'], +'CachingIterator::current' => ['mixed'], +'CachingIterator::getCache' => ['array'], +'CachingIterator::getFlags' => ['int'], +'CachingIterator::getInnerIterator' => ['Iterator'], +'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::rewind' => ['void'], +'CachingIterator::setFlags' => ['void', 'flags'=>'int'], +'CachingIterator::valid' => ['bool'], +'Cairo::availableFonts' => ['array'], +'Cairo::availableSurfaces' => ['array'], +'Cairo::statusToString' => ['string', 'status'=>'int'], +'Cairo::version' => ['int'], +'Cairo::versionString' => ['string'], +'cairo_append_path' => ['', 'path'=>'cairopath', 'context'=>'cairocontext'], +'cairo_arc' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], +'cairo_arc_negative' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], +'cairo_available_fonts' => ['array'], +'cairo_available_surfaces' => ['array'], +'cairo_clip' => ['', 'context'=>'cairocontext'], +'cairo_clip_extents' => ['array', 'context'=>'cairocontext'], +'cairo_clip_preserve' => ['', 'context'=>'cairocontext'], +'cairo_clip_rectangle_list' => ['array', 'context'=>'cairocontext'], +'cairo_close_path' => ['', 'context'=>'cairocontext'], +'cairo_copy_page' => ['', 'context'=>'cairocontext'], +'cairo_copy_path' => ['CairoPath', 'context'=>'cairocontext'], +'cairo_copy_path_flat' => ['CairoPath', 'context'=>'cairocontext'], +'cairo_create' => ['CairoContext', 'surface'=>'cairosurface'], +'cairo_curve_to' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float', 'context'=>'cairocontext'], +'cairo_device_to_user' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], +'cairo_device_to_user_distance' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], +'cairo_fill' => ['', 'context'=>'cairocontext'], +'cairo_fill_extents' => ['array', 'context'=>'cairocontext'], +'cairo_fill_preserve' => ['', 'context'=>'cairocontext'], +'cairo_font_extents' => ['array', 'context'=>'cairocontext'], +'cairo_font_face_get_type' => ['int', 'fontface'=>'cairofontface'], +'cairo_font_face_status' => ['int', 'fontface'=>'cairofontface'], +'cairo_font_options_create' => ['CairoFontOptions'], +'cairo_font_options_equal' => ['bool', 'options'=>'cairofontoptions', 'other'=>'cairofontoptions'], +'cairo_font_options_get_antialias' => ['int', 'options'=>'cairofontoptions'], +'cairo_font_options_get_hint_metrics' => ['int', 'options'=>'cairofontoptions'], +'cairo_font_options_get_hint_style' => ['int', 'options'=>'cairofontoptions'], +'cairo_font_options_get_subpixel_order' => ['int', 'options'=>'cairofontoptions'], +'cairo_font_options_hash' => ['int', 'options'=>'cairofontoptions'], +'cairo_font_options_merge' => ['void', 'options'=>'cairofontoptions', 'other'=>'cairofontoptions'], +'cairo_font_options_set_antialias' => ['void', 'options'=>'cairofontoptions', 'antialias'=>'int'], +'cairo_font_options_set_hint_metrics' => ['void', 'options'=>'cairofontoptions', 'hint_metrics'=>'int'], +'cairo_font_options_set_hint_style' => ['void', 'options'=>'cairofontoptions', 'hint_style'=>'int'], +'cairo_font_options_set_subpixel_order' => ['void', 'options'=>'cairofontoptions', 'subpixel_order'=>'int'], +'cairo_font_options_status' => ['int', 'options'=>'cairofontoptions'], +'cairo_format_stride_for_width' => ['int', 'format'=>'int', 'width'=>'int'], +'cairo_get_antialias' => ['int', 'context'=>'cairocontext'], +'cairo_get_current_point' => ['array', 'context'=>'cairocontext'], +'cairo_get_dash' => ['array', 'context'=>'cairocontext'], +'cairo_get_dash_count' => ['int', 'context'=>'cairocontext'], +'cairo_get_fill_rule' => ['int', 'context'=>'cairocontext'], +'cairo_get_font_face' => ['', 'context'=>'cairocontext'], +'cairo_get_font_matrix' => ['', 'context'=>'cairocontext'], +'cairo_get_font_options' => ['', 'context'=>'cairocontext'], +'cairo_get_group_target' => ['', 'context'=>'cairocontext'], +'cairo_get_line_cap' => ['int', 'context'=>'cairocontext'], +'cairo_get_line_join' => ['int', 'context'=>'cairocontext'], +'cairo_get_line_width' => ['float', 'context'=>'cairocontext'], +'cairo_get_matrix' => ['', 'context'=>'cairocontext'], +'cairo_get_miter_limit' => ['float', 'context'=>'cairocontext'], +'cairo_get_operator' => ['int', 'context'=>'cairocontext'], +'cairo_get_scaled_font' => ['', 'context'=>'cairocontext'], +'cairo_get_source' => ['', 'context'=>'cairocontext'], +'cairo_get_target' => ['', 'context'=>'cairocontext'], +'cairo_get_tolerance' => ['float', 'context'=>'cairocontext'], +'cairo_glyph_path' => ['', 'glyphs'=>'array', 'context'=>'cairocontext'], +'cairo_has_current_point' => ['bool', 'context'=>'cairocontext'], +'cairo_identity_matrix' => ['', 'context'=>'cairocontext'], +'cairo_image_surface_create' => ['CairoImageSurface', 'format'=>'int', 'width'=>'int', 'height'=>'int'], +'cairo_image_surface_create_for_data' => ['CairoImageSurface', 'data'=>'string', 'format'=>'int', 'width'=>'int', 'height'=>'int', 'stride='=>'int'], +'cairo_image_surface_create_from_png' => ['CairoImageSurface', 'file'=>'string'], +'cairo_image_surface_get_data' => ['string', 'surface'=>'cairoimagesurface'], +'cairo_image_surface_get_format' => ['int', 'surface'=>'cairoimagesurface'], +'cairo_image_surface_get_height' => ['int', 'surface'=>'cairoimagesurface'], +'cairo_image_surface_get_stride' => ['int', 'surface'=>'cairoimagesurface'], +'cairo_image_surface_get_width' => ['int', 'surface'=>'cairoimagesurface'], +'cairo_in_fill' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'cairo_in_stroke' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'cairo_line_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'cairo_mask' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], +'cairo_mask_surface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], +'cairo_matrix_create_scale' => ['object', 'sx'=>'float', 'sy'=>'float'], +'cairo_matrix_init' => ['object', 'xx='=>'float', 'yx='=>'float', 'xy='=>'float', 'yy='=>'float', 'x0='=>'float', 'y0='=>'float'], +'cairo_matrix_init_identity' => ['object'], +'cairo_matrix_init_rotate' => ['object', 'radians'=>'float'], +'cairo_matrix_init_scale' => ['object', 'sx'=>'float', 'sy'=>'float'], +'cairo_matrix_init_translate' => ['object', 'tx'=>'float', 'ty'=>'float'], +'cairo_matrix_invert' => ['void', 'matrix'=>'cairomatrix'], +'cairo_matrix_multiply' => ['CairoMatrix', 'matrix1'=>'cairomatrix', 'matrix2'=>'cairomatrix'], +'cairo_matrix_rotate' => ['', 'matrix'=>'cairomatrix', 'radians'=>'float'], +'cairo_matrix_scale' => ['', 'sx'=>'float', 'sy'=>'float', 'context'=>'cairocontext'], +'cairo_matrix_transform_distance' => ['array', 'matrix'=>'cairomatrix', 'dx'=>'float', 'dy'=>'float'], +'cairo_matrix_transform_point' => ['array', 'matrix'=>'cairomatrix', 'dx'=>'float', 'dy'=>'float'], +'cairo_matrix_translate' => ['void', 'matrix'=>'cairomatrix', 'tx'=>'float', 'ty'=>'float'], +'cairo_move_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'cairo_new_path' => ['', 'context'=>'cairocontext'], +'cairo_new_sub_path' => ['', 'context'=>'cairocontext'], +'cairo_paint' => ['', 'context'=>'cairocontext'], +'cairo_paint_with_alpha' => ['', 'alpha'=>'string', 'context'=>'cairocontext'], +'cairo_path_extents' => ['array', 'context'=>'cairocontext'], +'cairo_pattern_add_color_stop_rgb' => ['void', 'pattern'=>'cairogradientpattern', 'offset'=>'float', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'cairo_pattern_add_color_stop_rgba' => ['void', 'pattern'=>'cairogradientpattern', 'offset'=>'float', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha'=>'float'], +'cairo_pattern_create_for_surface' => ['CairoPattern', 'surface'=>'cairosurface'], +'cairo_pattern_create_linear' => ['CairoPattern', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float'], +'cairo_pattern_create_radial' => ['CairoPattern', 'x0'=>'float', 'y0'=>'float', 'r0'=>'float', 'x1'=>'float', 'y1'=>'float', 'r1'=>'float'], +'cairo_pattern_create_rgb' => ['CairoPattern', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'cairo_pattern_create_rgba' => ['CairoPattern', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha'=>'float'], +'cairo_pattern_get_color_stop_count' => ['int', 'pattern'=>'cairogradientpattern'], +'cairo_pattern_get_color_stop_rgba' => ['array', 'pattern'=>'cairogradientpattern', 'index'=>'int'], +'cairo_pattern_get_extend' => ['int', 'pattern'=>'string'], +'cairo_pattern_get_filter' => ['int', 'pattern'=>'cairosurfacepattern'], +'cairo_pattern_get_linear_points' => ['array', 'pattern'=>'cairolineargradient'], +'cairo_pattern_get_matrix' => ['CairoMatrix', 'pattern'=>'cairopattern'], +'cairo_pattern_get_radial_circles' => ['array', 'pattern'=>'cairoradialgradient'], +'cairo_pattern_get_rgba' => ['array', 'pattern'=>'cairosolidpattern'], +'cairo_pattern_get_surface' => ['CairoSurface', 'pattern'=>'cairosurfacepattern'], +'cairo_pattern_get_type' => ['int', 'pattern'=>'cairopattern'], +'cairo_pattern_set_extend' => ['void', 'pattern'=>'string', 'extend'=>'string'], +'cairo_pattern_set_filter' => ['void', 'pattern'=>'cairosurfacepattern', 'filter'=>'int'], +'cairo_pattern_set_matrix' => ['void', 'pattern'=>'cairopattern', 'matrix'=>'cairomatrix'], +'cairo_pattern_status' => ['int', 'pattern'=>'cairopattern'], +'cairo_pdf_surface_create' => ['CairoPdfSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], +'cairo_pdf_surface_set_size' => ['void', 'surface'=>'cairopdfsurface', 'width'=>'float', 'height'=>'float'], +'cairo_pop_group' => ['', 'context'=>'cairocontext'], +'cairo_pop_group_to_source' => ['', 'context'=>'cairocontext'], +'cairo_ps_get_levels' => ['array'], +'cairo_ps_level_to_string' => ['string', 'level'=>'int'], +'cairo_ps_surface_create' => ['CairoPsSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], +'cairo_ps_surface_dsc_begin_page_setup' => ['void', 'surface'=>'cairopssurface'], +'cairo_ps_surface_dsc_begin_setup' => ['void', 'surface'=>'cairopssurface'], +'cairo_ps_surface_dsc_comment' => ['void', 'surface'=>'cairopssurface', 'comment'=>'string'], +'cairo_ps_surface_get_eps' => ['bool', 'surface'=>'cairopssurface'], +'cairo_ps_surface_restrict_to_level' => ['void', 'surface'=>'cairopssurface', 'level'=>'int'], +'cairo_ps_surface_set_eps' => ['void', 'surface'=>'cairopssurface', 'level'=>'bool'], +'cairo_ps_surface_set_size' => ['void', 'surface'=>'cairopssurface', 'width'=>'float', 'height'=>'float'], +'cairo_push_group' => ['', 'context'=>'cairocontext'], +'cairo_push_group_with_content' => ['', 'content'=>'string', 'context'=>'cairocontext'], +'cairo_rectangle' => ['', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string', 'context'=>'cairocontext'], +'cairo_rel_curve_to' => ['', 'x1'=>'string', 'y1'=>'string', 'x2'=>'string', 'y2'=>'string', 'x3'=>'string', 'y3'=>'string', 'context'=>'cairocontext'], +'cairo_rel_line_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'cairo_rel_move_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'cairo_reset_clip' => ['', 'context'=>'cairocontext'], +'cairo_restore' => ['', 'context'=>'cairocontext'], +'cairo_rotate' => ['', 'sx'=>'string', 'sy'=>'string', 'context'=>'cairocontext', 'angle'=>'string'], +'cairo_save' => ['', 'context'=>'cairocontext'], +'cairo_scale' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'cairo_scaled_font_create' => ['CairoScaledFont', 'fontface'=>'cairofontface', 'matrix'=>'cairomatrix', 'ctm'=>'cairomatrix', 'fontoptions'=>'cairofontoptions'], +'cairo_scaled_font_extents' => ['array', 'scaledfont'=>'cairoscaledfont'], +'cairo_scaled_font_get_ctm' => ['CairoMatrix', 'scaledfont'=>'cairoscaledfont'], +'cairo_scaled_font_get_font_face' => ['CairoFontFace', 'scaledfont'=>'cairoscaledfont'], +'cairo_scaled_font_get_font_matrix' => ['CairoFontOptions', 'scaledfont'=>'cairoscaledfont'], +'cairo_scaled_font_get_font_options' => ['CairoFontOptions', 'scaledfont'=>'cairoscaledfont'], +'cairo_scaled_font_get_scale_matrix' => ['CairoMatrix', 'scaledfont'=>'cairoscaledfont'], +'cairo_scaled_font_get_type' => ['int', 'scaledfont'=>'cairoscaledfont'], +'cairo_scaled_font_glyph_extents' => ['array', 'scaledfont'=>'cairoscaledfont', 'glyphs'=>'array'], +'cairo_scaled_font_status' => ['int', 'scaledfont'=>'cairoscaledfont'], +'cairo_scaled_font_text_extents' => ['array', 'scaledfont'=>'cairoscaledfont', 'text'=>'string'], +'cairo_select_font_face' => ['', 'family'=>'string', 'slant='=>'string', 'weight='=>'string', 'context='=>'cairocontext'], +'cairo_set_antialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], +'cairo_set_dash' => ['', 'dashes'=>'array', 'offset='=>'string', 'context='=>'cairocontext'], +'cairo_set_fill_rule' => ['', 'setting'=>'string', 'context'=>'cairocontext'], +'cairo_set_font_face' => ['', 'fontface'=>'cairofontface', 'context'=>'cairocontext'], +'cairo_set_font_matrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], +'cairo_set_font_options' => ['', 'fontoptions'=>'cairofontoptions', 'context'=>'cairocontext'], +'cairo_set_font_size' => ['', 'size'=>'string', 'context'=>'cairocontext'], +'cairo_set_line_cap' => ['', 'setting'=>'string', 'context'=>'cairocontext'], +'cairo_set_line_join' => ['', 'setting'=>'string', 'context'=>'cairocontext'], +'cairo_set_line_width' => ['', 'width'=>'string', 'context'=>'cairocontext'], +'cairo_set_matrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], +'cairo_set_miter_limit' => ['', 'limit'=>'string', 'context'=>'cairocontext'], +'cairo_set_operator' => ['', 'setting'=>'string', 'context'=>'cairocontext'], +'cairo_set_scaled_font' => ['', 'scaledfont'=>'cairoscaledfont', 'context'=>'cairocontext'], +'cairo_set_source' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], +'cairo_set_source_surface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], +'cairo_set_tolerance' => ['', 'tolerance'=>'string', 'context'=>'cairocontext'], +'cairo_show_page' => ['', 'context'=>'cairocontext'], +'cairo_show_text' => ['', 'text'=>'string', 'context'=>'cairocontext'], +'cairo_status' => ['int', 'context'=>'cairocontext'], +'cairo_status_to_string' => ['string', 'status'=>'int'], +'cairo_stroke' => ['', 'context'=>'cairocontext'], +'cairo_stroke_extents' => ['array', 'context'=>'cairocontext'], +'cairo_stroke_preserve' => ['', 'context'=>'cairocontext'], +'cairo_surface_copy_page' => ['void', 'surface'=>'cairosurface'], +'cairo_surface_create_similar' => ['CairoSurface', 'surface'=>'cairosurface', 'content'=>'int', 'width'=>'float', 'height'=>'float'], +'cairo_surface_finish' => ['void', 'surface'=>'cairosurface'], +'cairo_surface_flush' => ['void', 'surface'=>'cairosurface'], +'cairo_surface_get_content' => ['int', 'surface'=>'cairosurface'], +'cairo_surface_get_device_offset' => ['array', 'surface'=>'cairosurface'], +'cairo_surface_get_font_options' => ['CairoFontOptions', 'surface'=>'cairosurface'], +'cairo_surface_get_type' => ['int', 'surface'=>'cairosurface'], +'cairo_surface_mark_dirty' => ['void', 'surface'=>'cairosurface'], +'cairo_surface_mark_dirty_rectangle' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], +'cairo_surface_set_device_offset' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float'], +'cairo_surface_set_fallback_resolution' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float'], +'cairo_surface_show_page' => ['void', 'surface'=>'cairosurface'], +'cairo_surface_status' => ['int', 'surface'=>'cairosurface'], +'cairo_surface_write_to_png' => ['void', 'surface'=>'cairosurface', 'stream'=>'resource'], +'cairo_svg_get_versions' => ['array'], +'cairo_svg_surface_create' => ['CairoSvgSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], +'cairo_svg_surface_get_versions' => ['array'], +'cairo_svg_surface_restrict_to_version' => ['void', 'surface'=>'cairosvgsurface', 'version'=>'int'], +'cairo_svg_version_to_string' => ['string', 'version'=>'int'], +'cairo_text_extents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], +'cairo_text_path' => ['', 'string'=>'string', 'context'=>'cairocontext', 'text'=>'string'], +'cairo_transform' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], +'cairo_translate' => ['', 'tx'=>'string', 'ty'=>'string', 'context'=>'cairocontext', 'x'=>'string', 'y'=>'string'], +'cairo_user_to_device' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'cairo_user_to_device_distance' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'cairo_version' => ['int'], +'cairo_version_string' => ['string'], +'CairoContext::__construct' => ['void', 'surface'=>'CairoSurface'], +'CairoContext::appendPath' => ['', 'path'=>'cairopath', 'context'=>'cairocontext'], +'CairoContext::arc' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], +'CairoContext::arcNegative' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], +'CairoContext::clip' => ['', 'context'=>'cairocontext'], +'CairoContext::clipExtents' => ['array', 'context'=>'cairocontext'], +'CairoContext::clipPreserve' => ['', 'context'=>'cairocontext'], +'CairoContext::clipRectangleList' => ['array', 'context'=>'cairocontext'], +'CairoContext::closePath' => ['', 'context'=>'cairocontext'], +'CairoContext::copyPage' => ['', 'context'=>'cairocontext'], +'CairoContext::copyPath' => ['CairoPath', 'context'=>'cairocontext'], +'CairoContext::copyPathFlat' => ['CairoPath', 'context'=>'cairocontext'], +'CairoContext::curveTo' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float', 'context'=>'cairocontext'], +'CairoContext::deviceToUser' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], +'CairoContext::deviceToUserDistance' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], +'CairoContext::fill' => ['', 'context'=>'cairocontext'], +'CairoContext::fillExtents' => ['array', 'context'=>'cairocontext'], +'CairoContext::fillPreserve' => ['', 'context'=>'cairocontext'], +'CairoContext::fontExtents' => ['array', 'context'=>'cairocontext'], +'CairoContext::getAntialias' => ['int', 'context'=>'cairocontext'], +'CairoContext::getCurrentPoint' => ['array', 'context'=>'cairocontext'], +'CairoContext::getDash' => ['array', 'context'=>'cairocontext'], +'CairoContext::getDashCount' => ['int', 'context'=>'cairocontext'], +'CairoContext::getFillRule' => ['int', 'context'=>'cairocontext'], +'CairoContext::getFontFace' => ['', 'context'=>'cairocontext'], +'CairoContext::getFontMatrix' => ['', 'context'=>'cairocontext'], +'CairoContext::getFontOptions' => ['', 'context'=>'cairocontext'], +'CairoContext::getGroupTarget' => ['', 'context'=>'cairocontext'], +'CairoContext::getLineCap' => ['int', 'context'=>'cairocontext'], +'CairoContext::getLineJoin' => ['int', 'context'=>'cairocontext'], +'CairoContext::getLineWidth' => ['float', 'context'=>'cairocontext'], +'CairoContext::getMatrix' => ['', 'context'=>'cairocontext'], +'CairoContext::getMiterLimit' => ['float', 'context'=>'cairocontext'], +'CairoContext::getOperator' => ['int', 'context'=>'cairocontext'], +'CairoContext::getScaledFont' => ['', 'context'=>'cairocontext'], +'CairoContext::getSource' => ['', 'context'=>'cairocontext'], +'CairoContext::getTarget' => ['', 'context'=>'cairocontext'], +'CairoContext::getTolerance' => ['float', 'context'=>'cairocontext'], +'CairoContext::glyphPath' => ['', 'glyphs'=>'array', 'context'=>'cairocontext'], +'CairoContext::hasCurrentPoint' => ['bool', 'context'=>'cairocontext'], +'CairoContext::identityMatrix' => ['', 'context'=>'cairocontext'], +'CairoContext::inFill' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'CairoContext::inStroke' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'CairoContext::lineTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'CairoContext::mask' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], +'CairoContext::maskSurface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], +'CairoContext::moveTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'CairoContext::newPath' => ['', 'context'=>'cairocontext'], +'CairoContext::newSubPath' => ['', 'context'=>'cairocontext'], +'CairoContext::paint' => ['', 'context'=>'cairocontext'], +'CairoContext::paintWithAlpha' => ['', 'alpha'=>'string', 'context'=>'cairocontext'], +'CairoContext::pathExtents' => ['array', 'context'=>'cairocontext'], +'CairoContext::popGroup' => ['', 'context'=>'cairocontext'], +'CairoContext::popGroupToSource' => ['', 'context'=>'cairocontext'], +'CairoContext::pushGroup' => ['', 'context'=>'cairocontext'], +'CairoContext::pushGroupWithContent' => ['', 'content'=>'string', 'context'=>'cairocontext'], +'CairoContext::rectangle' => ['', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string', 'context'=>'cairocontext'], +'CairoContext::relCurveTo' => ['', 'x1'=>'string', 'y1'=>'string', 'x2'=>'string', 'y2'=>'string', 'x3'=>'string', 'y3'=>'string', 'context'=>'cairocontext'], +'CairoContext::relLineTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'CairoContext::relMoveTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'CairoContext::resetClip' => ['', 'context'=>'cairocontext'], +'CairoContext::restore' => ['', 'context'=>'cairocontext'], +'CairoContext::rotate' => ['', 'angle'=>'string', 'context'=>'cairocontext'], +'CairoContext::save' => ['', 'context'=>'cairocontext'], +'CairoContext::scale' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'CairoContext::selectFontFace' => ['', 'family'=>'string', 'slant='=>'string', 'weight='=>'string', 'context='=>'cairocontext'], +'CairoContext::setAntialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], +'CairoContext::setDash' => ['', 'dashes'=>'array', 'offset='=>'string', 'context='=>'cairocontext'], +'CairoContext::setFillRule' => ['', 'setting'=>'string', 'context'=>'cairocontext'], +'CairoContext::setFontFace' => ['', 'fontface'=>'cairofontface', 'context'=>'cairocontext'], +'CairoContext::setFontMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], +'CairoContext::setFontOptions' => ['', 'fontoptions'=>'cairofontoptions', 'context'=>'cairocontext'], +'CairoContext::setFontSize' => ['', 'size'=>'string', 'context'=>'cairocontext'], +'CairoContext::setLineCap' => ['', 'setting'=>'string', 'context'=>'cairocontext'], +'CairoContext::setLineJoin' => ['', 'setting'=>'string', 'context'=>'cairocontext'], +'CairoContext::setLineWidth' => ['', 'width'=>'string', 'context'=>'cairocontext'], +'CairoContext::setMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], +'CairoContext::setMiterLimit' => ['', 'limit'=>'string', 'context'=>'cairocontext'], +'CairoContext::setOperator' => ['', 'setting'=>'string', 'context'=>'cairocontext'], +'CairoContext::setScaledFont' => ['', 'scaledfont'=>'cairoscaledfont', 'context'=>'cairocontext'], +'CairoContext::setSource' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], +'CairoContext::setSourceRGB' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], +'CairoContext::setSourceRGBA' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], +'CairoContext::setSourceSurface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], +'CairoContext::setTolerance' => ['', 'tolerance'=>'string', 'context'=>'cairocontext'], +'CairoContext::showPage' => ['', 'context'=>'cairocontext'], +'CairoContext::showText' => ['', 'text'=>'string', 'context'=>'cairocontext'], +'CairoContext::status' => ['int', 'context'=>'cairocontext'], +'CairoContext::stroke' => ['', 'context'=>'cairocontext'], +'CairoContext::strokeExtents' => ['array', 'context'=>'cairocontext'], +'CairoContext::strokePreserve' => ['', 'context'=>'cairocontext'], +'CairoContext::textExtents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], +'CairoContext::textPath' => ['', 'string'=>'string', 'context'=>'cairocontext', 'text'=>'string'], +'CairoContext::transform' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], +'CairoContext::translate' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'CairoContext::userToDevice' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'CairoContext::userToDeviceDistance' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], +'CairoFontFace::__construct' => ['void'], +'CairoFontFace::getType' => ['int'], +'CairoFontFace::status' => ['int', 'fontface'=>'cairofontface'], +'CairoFontOptions::__construct' => ['void'], +'CairoFontOptions::equal' => ['bool', 'other'=>'string'], +'CairoFontOptions::getAntialias' => ['int', 'context'=>'cairocontext'], +'CairoFontOptions::getHintMetrics' => ['int'], +'CairoFontOptions::getHintStyle' => ['int'], +'CairoFontOptions::getSubpixelOrder' => ['int'], +'CairoFontOptions::hash' => ['int'], +'CairoFontOptions::merge' => ['void', 'other'=>'string'], +'CairoFontOptions::setAntialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], +'CairoFontOptions::setHintMetrics' => ['void', 'hint_metrics'=>'string'], +'CairoFontOptions::setHintStyle' => ['void', 'hint_style'=>'string'], +'CairoFontOptions::setSubpixelOrder' => ['void', 'subpixel_order'=>'string'], +'CairoFontOptions::status' => ['int', 'context'=>'cairocontext'], +'CairoFormat::strideForWidth' => ['int', 'format'=>'int', 'width'=>'int'], +'CairoGradientPattern::addColorStopRgb' => ['void', 'offset'=>'string', 'red'=>'string', 'green'=>'string', 'blue'=>'string'], +'CairoGradientPattern::addColorStopRgba' => ['void', 'offset'=>'string', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string'], +'CairoGradientPattern::getColorStopCount' => ['int'], +'CairoGradientPattern::getColorStopRgba' => ['array', 'index'=>'string'], +'CairoGradientPattern::getExtend' => ['int'], +'CairoGradientPattern::setExtend' => ['void', 'extend'=>'int'], +'CairoImageSurface::__construct' => ['void', 'format'=>'int', 'width'=>'int', 'height'=>'int'], +'CairoImageSurface::createForData' => ['void', 'data'=>'string', 'format'=>'int', 'width'=>'int', 'height'=>'int', 'stride='=>'int'], +'CairoImageSurface::createFromPng' => ['CairoImageSurface', 'file'=>'string'], +'CairoImageSurface::getData' => ['string'], +'CairoImageSurface::getFormat' => ['int'], +'CairoImageSurface::getHeight' => ['int'], +'CairoImageSurface::getStride' => ['int'], +'CairoImageSurface::getWidth' => ['int'], +'CairoLinearGradient::__construct' => ['void', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float'], +'CairoLinearGradient::getPoints' => ['array'], +'CairoMatrix::__construct' => ['void', 'xx='=>'float', 'yx='=>'float', 'xy='=>'float', 'yy='=>'float', 'x0='=>'float', 'y0='=>'float'], +'CairoMatrix::initIdentity' => ['object'], +'CairoMatrix::initRotate' => ['object', 'radians'=>'float'], +'CairoMatrix::initScale' => ['object', 'sx'=>'float', 'sy'=>'float'], +'CairoMatrix::initTranslate' => ['object', 'tx'=>'float', 'ty'=>'float'], +'CairoMatrix::invert' => ['void'], +'CairoMatrix::multiply' => ['CairoMatrix', 'matrix1'=>'cairomatrix', 'matrix2'=>'cairomatrix'], +'CairoMatrix::rotate' => ['', 'sx'=>'string', 'sy'=>'string', 'context'=>'cairocontext', 'angle'=>'string'], +'CairoMatrix::scale' => ['', 'sx'=>'float', 'sy'=>'float', 'context'=>'cairocontext'], +'CairoMatrix::transformDistance' => ['array', 'dx'=>'string', 'dy'=>'string'], +'CairoMatrix::transformPoint' => ['array', 'dx'=>'string', 'dy'=>'string'], +'CairoMatrix::translate' => ['', 'tx'=>'string', 'ty'=>'string', 'context'=>'cairocontext', 'x'=>'string', 'y'=>'string'], +'CairoPattern::__construct' => ['void'], +'CairoPattern::getMatrix' => ['', 'context'=>'cairocontext'], +'CairoPattern::getType' => ['int'], +'CairoPattern::setMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], +'CairoPattern::status' => ['int', 'context'=>'cairocontext'], +'CairoPdfSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], +'CairoPdfSurface::setSize' => ['void', 'width'=>'string', 'height'=>'string'], +'CairoPsSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], +'CairoPsSurface::dscBeginPageSetup' => ['void'], +'CairoPsSurface::dscBeginSetup' => ['void'], +'CairoPsSurface::dscComment' => ['void', 'comment'=>'string'], +'CairoPsSurface::getEps' => ['bool'], +'CairoPsSurface::getLevels' => ['array'], +'CairoPsSurface::levelToString' => ['string', 'level'=>'int'], +'CairoPsSurface::restrictToLevel' => ['void', 'level'=>'string'], +'CairoPsSurface::setEps' => ['void', 'level'=>'string'], +'CairoPsSurface::setSize' => ['void', 'width'=>'string', 'height'=>'string'], +'CairoRadialGradient::__construct' => ['void', 'x0'=>'float', 'y0'=>'float', 'r0'=>'float', 'x1'=>'float', 'y1'=>'float', 'r1'=>'float'], +'CairoRadialGradient::getCircles' => ['array'], +'CairoScaledFont::__construct' => ['void', 'font_face'=>'CairoFontFace', 'matrix'=>'CairoMatrix', 'ctm'=>'CairoMatrix', 'options'=>'CairoFontOptions'], +'CairoScaledFont::extents' => ['array'], +'CairoScaledFont::getCtm' => ['CairoMatrix'], +'CairoScaledFont::getFontFace' => ['', 'context'=>'cairocontext'], +'CairoScaledFont::getFontMatrix' => ['', 'context'=>'cairocontext'], +'CairoScaledFont::getFontOptions' => ['', 'context'=>'cairocontext'], +'CairoScaledFont::getScaleMatrix' => ['void'], +'CairoScaledFont::getType' => ['int'], +'CairoScaledFont::glyphExtents' => ['array', 'glyphs'=>'string'], +'CairoScaledFont::status' => ['int', 'context'=>'cairocontext'], +'CairoScaledFont::textExtents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], +'CairoSolidPattern::__construct' => ['void', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha='=>'float'], +'CairoSolidPattern::getRgba' => ['array'], +'CairoSurface::__construct' => ['void'], +'CairoSurface::copyPage' => ['', 'context'=>'cairocontext'], +'CairoSurface::createSimilar' => ['void', 'other'=>'cairosurface', 'content'=>'int', 'width'=>'string', 'height'=>'string'], +'CairoSurface::finish' => ['void'], +'CairoSurface::flush' => ['void'], +'CairoSurface::getContent' => ['int'], +'CairoSurface::getDeviceOffset' => ['array'], +'CairoSurface::getFontOptions' => ['', 'context'=>'cairocontext'], +'CairoSurface::getType' => ['int'], +'CairoSurface::markDirty' => ['void'], +'CairoSurface::markDirtyRectangle' => ['void', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string'], +'CairoSurface::setDeviceOffset' => ['void', 'x'=>'string', 'y'=>'string'], +'CairoSurface::setFallbackResolution' => ['void', 'x'=>'string', 'y'=>'string'], +'CairoSurface::showPage' => ['', 'context'=>'cairocontext'], +'CairoSurface::status' => ['int', 'context'=>'cairocontext'], +'CairoSurface::writeToPng' => ['void', 'file'=>'string'], +'CairoSurfacePattern::__construct' => ['void', 'surface'=>'CairoSurface'], +'CairoSurfacePattern::getExtend' => ['int'], +'CairoSurfacePattern::getFilter' => ['int'], +'CairoSurfacePattern::getSurface' => ['void'], +'CairoSurfacePattern::setExtend' => ['void', 'extend'=>'int'], +'CairoSurfacePattern::setFilter' => ['void', 'filter'=>'string'], +'CairoSvgSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], +'CairoSvgSurface::getVersions' => ['array'], +'CairoSvgSurface::restrictToVersion' => ['void', 'version'=>'string'], +'CairoSvgSurface::versionToString' => ['string', 'version'=>'int'], +'cal_days_in_month' => ['int', 'calendar'=>'int', 'month'=>'int', 'year'=>'int'], +'cal_from_jd' => ['false|array{date:string,month:int,day:int,year:int,dow:int,abbrevdayname:string,dayname:string,abbrevmonth:string,monthname:string}', 'julian_day'=>'int', 'calendar'=>'int'], +'cal_info' => ['array', 'calendar='=>'int'], +'cal_to_jd' => ['int', 'calendar'=>'int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], +'calcul_hmac' => ['string', 'clent'=>'string', 'siretcode'=>'string', 'price'=>'string', 'reference'=>'string', 'validity'=>'string', 'taxation'=>'string', 'devise'=>'string', 'language'=>'string'], +'calculhmac' => ['string', 'clent'=>'string', 'data'=>'string'], +'call_user_func' => ['mixed|false', 'callback'=>'callable', '...args='=>'mixed'], +'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::accept' => ['bool'], +'CallbackFilterIterator::current' => ['mixed'], +'CallbackFilterIterator::getInnerIterator' => ['Iterator'], +'CallbackFilterIterator::key' => ['mixed'], +'CallbackFilterIterator::next' => ['void'], +'CallbackFilterIterator::rewind' => ['void'], +'CallbackFilterIterator::valid' => ['bool'], +'ceil' => ['float', 'num'=>'float'], +'chdb::__construct' => ['void', 'pathname'=>'string'], +'chdb::get' => ['string', 'key'=>'string'], +'chdb_create' => ['bool', 'pathname'=>'string', 'data'=>'array'], +'chdir' => ['bool', 'directory'=>'string'], +'checkdate' => ['bool', 'month'=>'int', 'day'=>'int', 'year'=>'int'], +'checkdnsrr' => ['bool', 'hostname'=>'string', 'type='=>'string'], +'chgrp' => ['bool', 'filename'=>'string', 'group'=>'string|int'], +'chmod' => ['bool', 'filename'=>'string', 'permissions'=>'int'], +'chop' => ['string', 'string'=>'string', 'characters='=>'string'], +'chown' => ['bool', 'filename'=>'string', 'user'=>'string|int'], +'chr' => ['string', 'codepoint'=>'int'], +'chroot' => ['bool', 'directory'=>'string'], +'chunk_split' => ['string', 'string'=>'string', 'length='=>'int', 'separator='=>'string'], +'class_alias' => ['bool', 'class'=>'string', 'alias'=>'string', 'autoload='=>'bool'], +'class_exists' => ['bool', 'class'=>'string', 'autoload='=>'bool'], +'class_implements' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], +'class_parents' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], +'class_uses' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], +'classkit_import' => ['array', 'filename'=>'string'], +'classkit_method_add' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int'], +'classkit_method_copy' => ['bool', 'dclass'=>'string', 'dmethod'=>'string', 'sclass'=>'string', 'smethod='=>'string'], +'classkit_method_redefine' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int'], +'classkit_method_remove' => ['bool', 'classname'=>'string', 'methodname'=>'string'], +'classkit_method_rename' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'newname'=>'string'], +'classObj::__construct' => ['void', 'layer'=>'layerObj', 'class'=>'classObj'], +'classObj::addLabel' => ['int', 'label'=>'labelObj'], +'classObj::convertToString' => ['string'], +'classObj::createLegendIcon' => ['imageObj', 'width'=>'int', 'height'=>'int'], +'classObj::deletestyle' => ['int', 'index'=>'int'], +'classObj::drawLegendIcon' => ['int', 'width'=>'int', 'height'=>'int', 'im'=>'imageObj', 'dstX'=>'int', 'dstY'=>'int'], +'classObj::free' => ['void'], +'classObj::getExpressionString' => ['string'], +'classObj::getLabel' => ['labelObj', 'index'=>'int'], +'classObj::getMetaData' => ['int', 'name'=>'string'], +'classObj::getStyle' => ['styleObj', 'index'=>'int'], +'classObj::getTextString' => ['string'], +'classObj::movestyledown' => ['int', 'index'=>'int'], +'classObj::movestyleup' => ['int', 'index'=>'int'], +'classObj::ms_newClassObj' => ['classObj', 'layer'=>'layerObj', 'class'=>'classObj'], +'classObj::removeLabel' => ['labelObj', 'index'=>'int'], +'classObj::removeMetaData' => ['int', 'name'=>'string'], +'classObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'classObj::setExpression' => ['int', 'expression'=>'string'], +'classObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], +'classObj::settext' => ['int', 'text'=>'string'], +'classObj::updateFromString' => ['int', 'snippet'=>'string'], +'clearstatcache' => ['void', 'clear_realpath_cache='=>'bool', 'filename='=>'string'], +'cli_get_process_title' => ['?string'], +'cli_set_process_title' => ['bool', 'title'=>'string'], +'ClosedGeneratorException::__clone' => ['void'], +'ClosedGeneratorException::__toString' => ['string'], +'ClosedGeneratorException::getCode' => ['int'], +'ClosedGeneratorException::getFile' => ['string'], +'ClosedGeneratorException::getLine' => ['int'], +'ClosedGeneratorException::getMessage' => ['string'], +'ClosedGeneratorException::getPrevious' => ['Throwable|ClosedGeneratorException|null'], +'ClosedGeneratorException::getTrace' => ['list\',args?:array}>'], +'ClosedGeneratorException::getTraceAsString' => ['string'], +'closedir' => ['void', 'dir_handle='=>'resource'], +'closelog' => ['bool'], +'Closure::__construct' => ['void'], +'Closure::__invoke' => ['', '...args='=>''], +'Closure::bind' => ['Closure|false', 'old'=>'Closure', 'to'=>'?object', 'scope='=>'object|string'], +'Closure::bindTo' => ['Closure|false', 'new'=>'?object', 'newscope='=>'object|string'], +'Closure::call' => ['', 'to'=>'object', '...parameters='=>''], +'Closure::fromCallable' => ['Closure', 'callable'=>'callable'], +'clusterObj::convertToString' => ['string'], +'clusterObj::getFilterString' => ['string'], +'clusterObj::getGroupString' => ['string'], +'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::compare' => ['int|false', 'string1'=>'string', 'string2'=>'string'], +'Collator::create' => ['?Collator', 'locale'=>'string'], +'Collator::getAttribute' => ['int|false', 'attr'=>'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::setStrength' => ['bool', 'strength'=>'int'], +'Collator::sort' => ['bool', '&rw_arr'=>'array', 'sort_flags='=>'int'], +'Collator::sortWithSortKeys' => ['bool', '&rw_arr'=>'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'], +'collator_get_attribute' => ['int|false', 'object'=>'collator', 'attribute'=>'int'], +'collator_get_error_code' => ['int', 'object'=>'collator'], +'collator_get_error_message' => ['string', 'object'=>'collator'], +'collator_get_locale' => ['string', 'object'=>'collator', 'type'=>'int'], +'collator_get_sort_key' => ['string', 'object'=>'collator', 'string'=>'string'], +'collator_get_strength' => ['int|false', 'object'=>'collator'], +'collator_set_attribute' => ['bool', 'object'=>'collator', 'attribute'=>'int', 'value'=>'int'], +'collator_set_strength' => ['bool', 'object'=>'collator', 'strength'=>'int'], +'collator_sort' => ['bool', 'object'=>'collator', '&rw_array'=>'array', 'flags='=>'int'], +'collator_sort_with_sort_keys' => ['bool', 'object'=>'collator', '&rw_array'=>'array'], +'Collectable::isGarbage' => ['bool'], +'Collectable::setGarbage' => ['void'], +'colorObj::setHex' => ['int', 'hex'=>'string'], +'colorObj::toHex' => ['string'], +'COM::__call' => ['', 'name'=>'', 'args'=>''], +'COM::__construct' => ['void', 'module_name'=>'string', 'server_name='=>'mixed', 'codepage='=>'int', 'typelib='=>'string'], +'COM::__get' => ['', 'name'=>''], +'COM::__set' => ['void', 'name'=>'', 'value'=>''], +'com_addref' => [''], +'com_create_guid' => ['string'], +'com_event_sink' => ['bool', 'variant'=>'VARIANT', 'sink_object'=>'object', 'sink_interface='=>'mixed'], +'com_get_active_object' => ['VARIANT', 'prog_id'=>'string', 'codepage='=>'int'], +'com_isenum' => ['bool', 'com_module'=>'variant'], +'com_load_typelib' => ['bool', 'typelib_name'=>'string', 'case_insensitive='=>'true'], +'com_message_pump' => ['bool', 'timeout_milliseconds='=>'int'], +'com_print_typeinfo' => ['bool', 'variant'=>'object', 'dispatch_interface='=>'string', 'display_sink='=>'bool'], +'commonmark\cql::__invoke' => ['', 'root'=>'CommonMark\Node', 'handler'=>'callable'], +'commonmark\interfaces\ivisitable::accept' => ['void', 'visitor'=>'CommonMark\Interfaces\IVisitor'], +'commonmark\interfaces\ivisitor::enter' => ['?int|IVisitable', 'visitable'=>'IVisitable'], +'commonmark\interfaces\ivisitor::leave' => ['?int|IVisitable', 'visitable'=>'IVisitable'], +'commonmark\node::accept' => ['void', 'visitor'=>'CommonMark\Interfaces\IVisitor'], +'commonmark\node::appendChild' => ['CommonMark\Node', 'child'=>'CommonMark\Node'], +'commonmark\node::insertAfter' => ['CommonMark\Node', 'sibling'=>'CommonMark\Node'], +'commonmark\node::insertBefore' => ['CommonMark\Node', 'sibling'=>'CommonMark\Node'], +'commonmark\node::prependChild' => ['CommonMark\Node', 'child'=>'CommonMark\Node'], +'commonmark\node::replace' => ['CommonMark\Node', 'target'=>'CommonMark\Node'], +'commonmark\node::unlink' => ['void'], +'commonmark\parse' => ['CommonMark\Node', 'content'=>'string', 'options='=>'int'], +'commonmark\parser::finish' => ['CommonMark\Node'], +'commonmark\parser::parse' => ['void', 'buffer'=>'string'], +'commonmark\render' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], +'commonmark\render\html' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int'], +'commonmark\render\latex' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], +'commonmark\render\man' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], +'commonmark\render\xml' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int'], +'compact' => ['array', 'var_name'=>'string|array', '...var_names='=>'string|array'], +'COMPersistHelper::__construct' => ['void', 'variant'=>'object'], +'COMPersistHelper::GetCurFile' => ['string'], +'COMPersistHelper::GetCurFileName' => ['string'], +'COMPersistHelper::GetMaxStreamSize' => ['int'], +'COMPersistHelper::InitNew' => ['int'], +'COMPersistHelper::LoadFromFile' => ['bool', 'filename'=>'string', 'flags'=>'int'], +'COMPersistHelper::LoadFromStream' => ['', 'stream'=>''], +'COMPersistHelper::SaveToFile' => ['bool', 'filename'=>'string', 'remember'=>'bool'], +'COMPersistHelper::SaveToStream' => ['int', 'stream'=>''], +'componere\abstract\definition::addInterface' => ['Componere\Abstract\Definition', 'interface'=>'string'], +'componere\abstract\definition::addMethod' => ['Componere\Abstract\Definition', 'name'=>'string', 'method'=>'Componere\Method'], +'componere\abstract\definition::addTrait' => ['Componere\Abstract\Definition', 'trait'=>'string'], +'componere\abstract\definition::getReflector' => ['ReflectionClass'], +'componere\cast' => ['object', 'arg1'=>'string', 'object'=>'object'], +'componere\cast_by_ref' => ['object', 'arg1'=>'string', 'object'=>'object'], +'componere\definition::addConstant' => ['Componere\Definition', 'name'=>'string', 'value'=>'Componere\Value'], +'componere\definition::addProperty' => ['Componere\Definition', 'name'=>'string', 'value'=>'Componere\Value'], +'componere\definition::getClosure' => ['Closure', 'name'=>'string'], +'componere\definition::getClosures' => ['Closure[]'], +'componere\definition::isRegistered' => ['bool'], +'componere\definition::register' => ['void'], +'componere\method::getReflector' => ['ReflectionMethod'], +'componere\method::setPrivate' => ['Method'], +'componere\method::setProtected' => ['Method'], +'componere\method::setStatic' => ['Method'], +'componere\patch::apply' => ['void'], +'componere\patch::derive' => ['Componere\Patch', 'instance'=>'object'], +'componere\patch::getClosure' => ['Closure', 'name'=>'string'], +'componere\patch::getClosures' => ['Closure[]'], +'componere\patch::isApplied' => ['bool'], +'componere\patch::revert' => ['void'], +'componere\value::hasDefault' => ['bool'], +'componere\value::isPrivate' => ['bool'], +'componere\value::isProtected' => ['bool'], +'componere\value::isStatic' => ['bool'], +'componere\value::setPrivate' => ['Value'], +'componere\value::setProtected' => ['Value'], +'componere\value::setStatic' => ['Value'], +'Cond::broadcast' => ['bool', 'condition'=>'long'], +'Cond::create' => ['long'], +'Cond::destroy' => ['bool', 'condition'=>'long'], +'Cond::signal' => ['bool', 'condition'=>'long'], +'Cond::wait' => ['bool', 'condition'=>'long', 'mutex'=>'long', 'timeout='=>'long'], +'confirm_pdo_ibm_compiled' => [''], +'connection_aborted' => ['int'], +'connection_status' => ['int'], +'connection_timeout' => ['int'], +'constant' => ['mixed', 'name'=>'string'], +'convert_cyr_string' => ['string', 'string'=>'string', 'from'=>'string', 'to'=>'string'], +'convert_uudecode' => ['string', 'string'=>'string'], +'convert_uuencode' => ['string', 'string'=>'string'], +'copy' => ['bool', 'from'=>'string', 'to'=>'string', 'context='=>'resource'], +'cos' => ['float', 'num'=>'float'], +'cosh' => ['float', 'num'=>'float'], +'Couchbase\AnalyticsQuery::__construct' => ['void'], +'Couchbase\AnalyticsQuery::fromString' => ['Couchbase\AnalyticsQuery', 'statement'=>'string'], +'Couchbase\basicDecoderV1' => ['mixed', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int', 'options'=>'array'], +'Couchbase\basicEncoderV1' => ['array', 'value'=>'mixed', 'options'=>'array'], +'Couchbase\BooleanFieldSearchQuery::__construct' => ['void'], +'Couchbase\BooleanFieldSearchQuery::boost' => ['Couchbase\BooleanFieldSearchQuery', 'boost'=>'float'], +'Couchbase\BooleanFieldSearchQuery::field' => ['Couchbase\BooleanFieldSearchQuery', 'field'=>'string'], +'Couchbase\BooleanFieldSearchQuery::jsonSerialize' => ['array'], +'Couchbase\BooleanSearchQuery::__construct' => ['void'], +'Couchbase\BooleanSearchQuery::boost' => ['Couchbase\BooleanSearchQuery', 'boost'=>'float'], +'Couchbase\BooleanSearchQuery::jsonSerialize' => ['array'], +'Couchbase\BooleanSearchQuery::must' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], +'Couchbase\BooleanSearchQuery::mustNot' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], +'Couchbase\BooleanSearchQuery::should' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], +'Couchbase\Bucket::__construct' => ['void'], +'Couchbase\Bucket::__get' => ['int', 'name'=>'string'], +'Couchbase\Bucket::__set' => ['int', 'name'=>'string', 'value'=>'int'], +'Couchbase\Bucket::append' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], +'Couchbase\Bucket::counter' => ['Couchbase\Document|array', 'ids'=>'array|string', 'delta='=>'int', 'options='=>'array'], +'Couchbase\Bucket::decryptFields' => ['array', 'document'=>'array', 'fieldOptions'=>'', 'prefix='=>'string'], +'Couchbase\Bucket::diag' => ['array', 'reportId='=>'string'], +'Couchbase\Bucket::encryptFields' => ['array', 'document'=>'array', 'fieldOptions'=>'', 'prefix='=>'string'], +'Couchbase\Bucket::get' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], +'Couchbase\Bucket::getAndLock' => ['Couchbase\Document|array', 'ids'=>'array|string', 'lockTime'=>'int', 'options='=>'array'], +'Couchbase\Bucket::getAndTouch' => ['Couchbase\Document|array', 'ids'=>'array|string', 'expiry'=>'int', 'options='=>'array'], +'Couchbase\Bucket::getFromReplica' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], +'Couchbase\Bucket::getName' => ['string'], +'Couchbase\Bucket::insert' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], +'Couchbase\Bucket::listExists' => ['bool', 'id'=>'string', 'value'=>'mixed'], +'Couchbase\Bucket::listGet' => ['mixed', 'id'=>'string', 'index'=>'int'], +'Couchbase\Bucket::listPush' => ['', 'id'=>'string', 'value'=>'mixed'], +'Couchbase\Bucket::listRemove' => ['', 'id'=>'string', 'index'=>'int'], +'Couchbase\Bucket::listSet' => ['', 'id'=>'string', 'index'=>'int', 'value'=>'mixed'], +'Couchbase\Bucket::listShift' => ['', 'id'=>'string', 'value'=>'mixed'], +'Couchbase\Bucket::listSize' => ['int', 'id'=>'string'], +'Couchbase\Bucket::lookupIn' => ['Couchbase\LookupInBuilder', 'id'=>'string'], +'Couchbase\Bucket::manager' => ['Couchbase\BucketManager'], +'Couchbase\Bucket::mapAdd' => ['', 'id'=>'string', 'key'=>'string', 'value'=>'mixed'], +'Couchbase\Bucket::mapGet' => ['mixed', 'id'=>'string', 'key'=>'string'], +'Couchbase\Bucket::mapRemove' => ['', 'id'=>'string', 'key'=>'string'], +'Couchbase\Bucket::mapSize' => ['int', 'id'=>'string'], +'Couchbase\Bucket::mutateIn' => ['Couchbase\MutateInBuilder', 'id'=>'string', 'cas'=>'string'], +'Couchbase\Bucket::ping' => ['array', 'services='=>'int', 'reportId='=>'string'], +'Couchbase\Bucket::prepend' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], +'Couchbase\Bucket::query' => ['object', 'query'=>'Couchbase\AnalyticsQuery|Couchbase\N1qlQuery|Couchbase\SearchQuery|Couchbase\SpatialViewQuery|Couchbase\ViewQuery', 'jsonAsArray='=>'bool'], +'Couchbase\Bucket::queueAdd' => ['', 'id'=>'string', 'value'=>'mixed'], +'Couchbase\Bucket::queueExists' => ['bool', 'id'=>'string', 'value'=>'mixed'], +'Couchbase\Bucket::queueRemove' => ['mixed', 'id'=>'string'], +'Couchbase\Bucket::queueSize' => ['int', 'id'=>'string'], +'Couchbase\Bucket::remove' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], +'Couchbase\Bucket::replace' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], +'Couchbase\Bucket::retrieveIn' => ['Couchbase\DocumentFragment', 'id'=>'string', '...paths='=>'array'], +'Couchbase\Bucket::setAdd' => ['', 'id'=>'string', 'value'=>'bool|float|int|string'], +'Couchbase\Bucket::setExists' => ['bool', 'id'=>'string', 'value'=>'bool|float|int|string'], +'Couchbase\Bucket::setRemove' => ['', 'id'=>'string', 'value'=>'bool|float|int|string'], +'Couchbase\Bucket::setSize' => ['int', 'id'=>'string'], +'Couchbase\Bucket::setTranscoder' => ['', 'encoder'=>'callable', 'decoder'=>'callable'], +'Couchbase\Bucket::touch' => ['Couchbase\Document|array', 'ids'=>'array|string', 'expiry'=>'int', 'options='=>'array'], +'Couchbase\Bucket::unlock' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], +'Couchbase\Bucket::upsert' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], +'Couchbase\BucketManager::__construct' => ['void'], +'Couchbase\BucketManager::createN1qlIndex' => ['', 'name'=>'string', 'fields'=>'array', 'whereClause='=>'string', 'ignoreIfExist='=>'bool', 'defer='=>'bool'], +'Couchbase\BucketManager::createN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfExist='=>'bool', 'defer='=>'bool'], +'Couchbase\BucketManager::dropN1qlIndex' => ['', 'name'=>'string', 'ignoreIfNotExist='=>'bool'], +'Couchbase\BucketManager::dropN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfNotExist='=>'bool'], +'Couchbase\BucketManager::flush' => [''], +'Couchbase\BucketManager::getDesignDocument' => ['array', 'name'=>'string'], +'Couchbase\BucketManager::info' => ['array'], +'Couchbase\BucketManager::insertDesignDocument' => ['', 'name'=>'string', 'document'=>'array'], +'Couchbase\BucketManager::listDesignDocuments' => ['array'], +'Couchbase\BucketManager::listN1qlIndexes' => ['array'], +'Couchbase\BucketManager::removeDesignDocument' => ['', 'name'=>'string'], +'Couchbase\BucketManager::upsertDesignDocument' => ['', 'name'=>'string', 'document'=>'array'], +'Couchbase\ClassicAuthenticator::bucket' => ['', 'name'=>'string', 'password'=>'string'], +'Couchbase\ClassicAuthenticator::cluster' => ['', 'username'=>'string', 'password'=>'string'], +'Couchbase\Cluster::__construct' => ['void', 'connstr'=>'string'], +'Couchbase\Cluster::authenticate' => ['null', 'authenticator'=>'Couchbase\Authenticator'], +'Couchbase\Cluster::authenticateAs' => ['null', 'username'=>'string', 'password'=>'string'], +'Couchbase\Cluster::manager' => ['Couchbase\ClusterManager', 'username='=>'string', 'password='=>'string'], +'Couchbase\Cluster::openBucket' => ['Couchbase\Bucket', 'name='=>'string', 'password='=>'string'], +'Couchbase\ClusterManager::__construct' => ['void'], +'Couchbase\ClusterManager::createBucket' => ['', 'name'=>'string', 'options='=>'array'], +'Couchbase\ClusterManager::getUser' => ['array', 'username'=>'string', 'domain='=>'int'], +'Couchbase\ClusterManager::info' => ['array'], +'Couchbase\ClusterManager::listBuckets' => ['array'], +'Couchbase\ClusterManager::listUsers' => ['array', 'domain='=>'int'], +'Couchbase\ClusterManager::removeBucket' => ['', 'name'=>'string'], +'Couchbase\ClusterManager::removeUser' => ['', 'name'=>'string', 'domain='=>'int'], +'Couchbase\ClusterManager::upsertUser' => ['', 'name'=>'string', 'settings'=>'Couchbase\UserSettings', 'domain='=>'int'], +'Couchbase\ConjunctionSearchQuery::__construct' => ['void'], +'Couchbase\ConjunctionSearchQuery::boost' => ['Couchbase\ConjunctionSearchQuery', 'boost'=>'float'], +'Couchbase\ConjunctionSearchQuery::every' => ['Couchbase\ConjunctionSearchQuery', '...queries='=>'array'], +'Couchbase\ConjunctionSearchQuery::jsonSerialize' => ['array'], +'Couchbase\DateRangeSearchFacet::__construct' => ['void'], +'Couchbase\DateRangeSearchFacet::addRange' => ['Couchbase\DateRangeSearchFacet', 'name'=>'string', 'start'=>'int|string', 'end'=>'int|string'], +'Couchbase\DateRangeSearchFacet::jsonSerialize' => ['array'], +'Couchbase\DateRangeSearchQuery::__construct' => ['void'], +'Couchbase\DateRangeSearchQuery::boost' => ['Couchbase\DateRangeSearchQuery', 'boost'=>'float'], +'Couchbase\DateRangeSearchQuery::dateTimeParser' => ['Couchbase\DateRangeSearchQuery', 'dateTimeParser'=>'string'], +'Couchbase\DateRangeSearchQuery::end' => ['Couchbase\DateRangeSearchQuery', 'end'=>'int|string', 'inclusive='=>'bool'], +'Couchbase\DateRangeSearchQuery::field' => ['Couchbase\DateRangeSearchQuery', 'field'=>'string'], +'Couchbase\DateRangeSearchQuery::jsonSerialize' => ['array'], +'Couchbase\DateRangeSearchQuery::start' => ['Couchbase\DateRangeSearchQuery', 'start'=>'int|string', 'inclusive='=>'bool'], +'Couchbase\defaultDecoder' => ['mixed', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int'], +'Couchbase\defaultEncoder' => ['array', 'value'=>'mixed'], +'Couchbase\DisjunctionSearchQuery::__construct' => ['void'], +'Couchbase\DisjunctionSearchQuery::boost' => ['Couchbase\DisjunctionSearchQuery', 'boost'=>'float'], +'Couchbase\DisjunctionSearchQuery::either' => ['Couchbase\DisjunctionSearchQuery', '...queries='=>'array'], +'Couchbase\DisjunctionSearchQuery::jsonSerialize' => ['array'], +'Couchbase\DisjunctionSearchQuery::min' => ['Couchbase\DisjunctionSearchQuery', 'min'=>'int'], +'Couchbase\DocIdSearchQuery::__construct' => ['void'], +'Couchbase\DocIdSearchQuery::boost' => ['Couchbase\DocIdSearchQuery', 'boost'=>'float'], +'Couchbase\DocIdSearchQuery::docIds' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array'], +'Couchbase\DocIdSearchQuery::field' => ['Couchbase\DocIdSearchQuery', 'field'=>'string'], +'Couchbase\DocIdSearchQuery::jsonSerialize' => ['array'], +'Couchbase\fastlzCompress' => ['string', 'data'=>'string'], +'Couchbase\fastlzDecompress' => ['string', 'data'=>'string'], +'Couchbase\GeoBoundingBoxSearchQuery::__construct' => ['void'], +'Couchbase\GeoBoundingBoxSearchQuery::boost' => ['Couchbase\GeoBoundingBoxSearchQuery', 'boost'=>'float'], +'Couchbase\GeoBoundingBoxSearchQuery::field' => ['Couchbase\GeoBoundingBoxSearchQuery', 'field'=>'string'], +'Couchbase\GeoBoundingBoxSearchQuery::jsonSerialize' => ['array'], +'Couchbase\GeoDistanceSearchQuery::__construct' => ['void'], +'Couchbase\GeoDistanceSearchQuery::boost' => ['Couchbase\GeoDistanceSearchQuery', 'boost'=>'float'], +'Couchbase\GeoDistanceSearchQuery::field' => ['Couchbase\GeoDistanceSearchQuery', 'field'=>'string'], +'Couchbase\GeoDistanceSearchQuery::jsonSerialize' => ['array'], +'Couchbase\LookupInBuilder::__construct' => ['void'], +'Couchbase\LookupInBuilder::execute' => ['Couchbase\DocumentFragment'], +'Couchbase\LookupInBuilder::exists' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], +'Couchbase\LookupInBuilder::get' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], +'Couchbase\LookupInBuilder::getCount' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], +'Couchbase\MatchAllSearchQuery::__construct' => ['void'], +'Couchbase\MatchAllSearchQuery::boost' => ['Couchbase\MatchAllSearchQuery', 'boost'=>'float'], +'Couchbase\MatchAllSearchQuery::jsonSerialize' => ['array'], +'Couchbase\MatchNoneSearchQuery::__construct' => ['void'], +'Couchbase\MatchNoneSearchQuery::boost' => ['Couchbase\MatchNoneSearchQuery', 'boost'=>'float'], +'Couchbase\MatchNoneSearchQuery::jsonSerialize' => ['array'], +'Couchbase\MatchPhraseSearchQuery::__construct' => ['void'], +'Couchbase\MatchPhraseSearchQuery::analyzer' => ['Couchbase\MatchPhraseSearchQuery', 'analyzer'=>'string'], +'Couchbase\MatchPhraseSearchQuery::boost' => ['Couchbase\MatchPhraseSearchQuery', 'boost'=>'float'], +'Couchbase\MatchPhraseSearchQuery::field' => ['Couchbase\MatchPhraseSearchQuery', 'field'=>'string'], +'Couchbase\MatchPhraseSearchQuery::jsonSerialize' => ['array'], +'Couchbase\MatchSearchQuery::__construct' => ['void'], +'Couchbase\MatchSearchQuery::analyzer' => ['Couchbase\MatchSearchQuery', 'analyzer'=>'string'], +'Couchbase\MatchSearchQuery::boost' => ['Couchbase\MatchSearchQuery', 'boost'=>'float'], +'Couchbase\MatchSearchQuery::field' => ['Couchbase\MatchSearchQuery', 'field'=>'string'], +'Couchbase\MatchSearchQuery::fuzziness' => ['Couchbase\MatchSearchQuery', 'fuzziness'=>'int'], +'Couchbase\MatchSearchQuery::jsonSerialize' => ['array'], +'Couchbase\MatchSearchQuery::prefixLength' => ['Couchbase\MatchSearchQuery', 'prefixLength'=>'int'], +'Couchbase\MutateInBuilder::__construct' => ['void'], +'Couchbase\MutateInBuilder::arrayAddUnique' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], +'Couchbase\MutateInBuilder::arrayAppend' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], +'Couchbase\MutateInBuilder::arrayAppendAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array|bool'], +'Couchbase\MutateInBuilder::arrayInsert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array'], +'Couchbase\MutateInBuilder::arrayInsertAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array'], +'Couchbase\MutateInBuilder::arrayPrepend' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], +'Couchbase\MutateInBuilder::arrayPrependAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array|bool'], +'Couchbase\MutateInBuilder::counter' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'delta'=>'int', 'options='=>'array|bool'], +'Couchbase\MutateInBuilder::execute' => ['Couchbase\DocumentFragment'], +'Couchbase\MutateInBuilder::insert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], +'Couchbase\MutateInBuilder::modeDocument' => ['', 'mode'=>'int'], +'Couchbase\MutateInBuilder::remove' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'options='=>'array'], +'Couchbase\MutateInBuilder::replace' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array'], +'Couchbase\MutateInBuilder::upsert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], +'Couchbase\MutateInBuilder::withExpiry' => ['Couchbase\MutateInBuilder', 'expiry'=>'Couchbase\expiry'], +'Couchbase\MutationState::__construct' => ['void'], +'Couchbase\MutationState::add' => ['', 'source'=>'Couchbase\Document|Couchbase\DocumentFragment|array'], +'Couchbase\MutationState::from' => ['Couchbase\MutationState', 'source'=>'Couchbase\Document|Couchbase\DocumentFragment|array'], +'Couchbase\MutationToken::__construct' => ['void'], +'Couchbase\MutationToken::bucketName' => ['string'], +'Couchbase\MutationToken::from' => ['', 'bucketName'=>'string', 'vbucketId'=>'int', 'vbucketUuid'=>'string', 'sequenceNumber'=>'string'], +'Couchbase\MutationToken::sequenceNumber' => ['string'], +'Couchbase\MutationToken::vbucketId' => ['int'], +'Couchbase\MutationToken::vbucketUuid' => ['string'], +'Couchbase\N1qlIndex::__construct' => ['void'], +'Couchbase\N1qlQuery::__construct' => ['void'], +'Couchbase\N1qlQuery::adhoc' => ['Couchbase\N1qlQuery', 'adhoc'=>'bool'], +'Couchbase\N1qlQuery::consistency' => ['Couchbase\N1qlQuery', 'consistency'=>'int'], +'Couchbase\N1qlQuery::consistentWith' => ['Couchbase\N1qlQuery', 'state'=>'Couchbase\MutationState'], +'Couchbase\N1qlQuery::crossBucket' => ['Couchbase\N1qlQuery', 'crossBucket'=>'bool'], +'Couchbase\N1qlQuery::fromString' => ['Couchbase\N1qlQuery', 'statement'=>'string'], +'Couchbase\N1qlQuery::maxParallelism' => ['Couchbase\N1qlQuery', 'maxParallelism'=>'int'], +'Couchbase\N1qlQuery::namedParams' => ['Couchbase\N1qlQuery', 'params'=>'array'], +'Couchbase\N1qlQuery::pipelineBatch' => ['Couchbase\N1qlQuery', 'pipelineBatch'=>'int'], +'Couchbase\N1qlQuery::pipelineCap' => ['Couchbase\N1qlQuery', 'pipelineCap'=>'int'], +'Couchbase\N1qlQuery::positionalParams' => ['Couchbase\N1qlQuery', 'params'=>'array'], +'Couchbase\N1qlQuery::profile' => ['', 'profileType'=>'string'], +'Couchbase\N1qlQuery::readonly' => ['Couchbase\N1qlQuery', 'readonly'=>'bool'], +'Couchbase\N1qlQuery::scanCap' => ['Couchbase\N1qlQuery', 'scanCap'=>'int'], +'Couchbase\NumericRangeSearchFacet::__construct' => ['void'], +'Couchbase\NumericRangeSearchFacet::addRange' => ['Couchbase\NumericRangeSearchFacet', 'name'=>'string', 'min'=>'float', 'max'=>'float'], +'Couchbase\NumericRangeSearchFacet::jsonSerialize' => ['array'], +'Couchbase\NumericRangeSearchQuery::__construct' => ['void'], +'Couchbase\NumericRangeSearchQuery::boost' => ['Couchbase\NumericRangeSearchQuery', 'boost'=>'float'], +'Couchbase\NumericRangeSearchQuery::field' => ['Couchbase\NumericRangeSearchQuery', 'field'=>'string'], +'Couchbase\NumericRangeSearchQuery::jsonSerialize' => ['array'], +'Couchbase\NumericRangeSearchQuery::max' => ['Couchbase\NumericRangeSearchQuery', 'max'=>'float', 'inclusive='=>'bool'], +'Couchbase\NumericRangeSearchQuery::min' => ['Couchbase\NumericRangeSearchQuery', 'min'=>'float', 'inclusive='=>'bool'], +'Couchbase\passthruDecoder' => ['string', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int'], +'Couchbase\passthruEncoder' => ['array', 'value'=>'string'], +'Couchbase\PasswordAuthenticator::password' => ['Couchbase\PasswordAuthenticator', 'password'=>'string'], +'Couchbase\PasswordAuthenticator::username' => ['Couchbase\PasswordAuthenticator', 'username'=>'string'], +'Couchbase\PhraseSearchQuery::__construct' => ['void'], +'Couchbase\PhraseSearchQuery::boost' => ['Couchbase\PhraseSearchQuery', 'boost'=>'float'], +'Couchbase\PhraseSearchQuery::field' => ['Couchbase\PhraseSearchQuery', 'field'=>'string'], +'Couchbase\PhraseSearchQuery::jsonSerialize' => ['array'], +'Couchbase\PrefixSearchQuery::__construct' => ['void'], +'Couchbase\PrefixSearchQuery::boost' => ['Couchbase\PrefixSearchQuery', 'boost'=>'float'], +'Couchbase\PrefixSearchQuery::field' => ['Couchbase\PrefixSearchQuery', 'field'=>'string'], +'Couchbase\PrefixSearchQuery::jsonSerialize' => ['array'], +'Couchbase\QueryStringSearchQuery::__construct' => ['void'], +'Couchbase\QueryStringSearchQuery::boost' => ['Couchbase\QueryStringSearchQuery', 'boost'=>'float'], +'Couchbase\QueryStringSearchQuery::jsonSerialize' => ['array'], +'Couchbase\RegexpSearchQuery::__construct' => ['void'], +'Couchbase\RegexpSearchQuery::boost' => ['Couchbase\RegexpSearchQuery', 'boost'=>'float'], +'Couchbase\RegexpSearchQuery::field' => ['Couchbase\RegexpSearchQuery', 'field'=>'string'], +'Couchbase\RegexpSearchQuery::jsonSerialize' => ['array'], +'Couchbase\SearchQuery::__construct' => ['void', 'indexName'=>'string', 'queryPart'=>'Couchbase\SearchQueryPart'], +'Couchbase\SearchQuery::addFacet' => ['Couchbase\SearchQuery', 'name'=>'string', 'facet'=>'Couchbase\SearchFacet'], +'Couchbase\SearchQuery::boolean' => ['Couchbase\BooleanSearchQuery'], +'Couchbase\SearchQuery::booleanField' => ['Couchbase\BooleanFieldSearchQuery', 'value'=>'bool'], +'Couchbase\SearchQuery::conjuncts' => ['Couchbase\ConjunctionSearchQuery', '...queries='=>'array'], +'Couchbase\SearchQuery::consistentWith' => ['Couchbase\SearchQuery', 'state'=>'Couchbase\MutationState'], +'Couchbase\SearchQuery::dateRange' => ['Couchbase\DateRangeSearchQuery'], +'Couchbase\SearchQuery::dateRangeFacet' => ['Couchbase\DateRangeSearchFacet', 'field'=>'string', 'limit'=>'int'], +'Couchbase\SearchQuery::disjuncts' => ['Couchbase\DisjunctionSearchQuery', '...queries='=>'array'], +'Couchbase\SearchQuery::docId' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array'], +'Couchbase\SearchQuery::explain' => ['Couchbase\SearchQuery', 'explain'=>'bool'], +'Couchbase\SearchQuery::fields' => ['Couchbase\SearchQuery', '...fields='=>'array'], +'Couchbase\SearchQuery::geoBoundingBox' => ['Couchbase\GeoBoundingBoxSearchQuery', 'topLeftLongitude'=>'float', 'topLeftLatitude'=>'float', 'bottomRightLongitude'=>'float', 'bottomRightLatitude'=>'float'], +'Couchbase\SearchQuery::geoDistance' => ['Couchbase\GeoDistanceSearchQuery', 'longitude'=>'float', 'latitude'=>'float', 'distance'=>'string'], +'Couchbase\SearchQuery::highlight' => ['Couchbase\SearchQuery', 'style'=>'string', '...fields='=>'array'], +'Couchbase\SearchQuery::jsonSerialize' => ['array'], +'Couchbase\SearchQuery::limit' => ['Couchbase\SearchQuery', 'limit'=>'int'], +'Couchbase\SearchQuery::match' => ['Couchbase\MatchSearchQuery', 'match'=>'string'], +'Couchbase\SearchQuery::matchAll' => ['Couchbase\MatchAllSearchQuery'], +'Couchbase\SearchQuery::matchNone' => ['Couchbase\MatchNoneSearchQuery'], +'Couchbase\SearchQuery::matchPhrase' => ['Couchbase\MatchPhraseSearchQuery', '...terms='=>'array'], +'Couchbase\SearchQuery::numericRange' => ['Couchbase\NumericRangeSearchQuery'], +'Couchbase\SearchQuery::numericRangeFacet' => ['Couchbase\NumericRangeSearchFacet', 'field'=>'string', 'limit'=>'int'], +'Couchbase\SearchQuery::prefix' => ['Couchbase\PrefixSearchQuery', 'prefix'=>'string'], +'Couchbase\SearchQuery::queryString' => ['Couchbase\QueryStringSearchQuery', 'queryString'=>'string'], +'Couchbase\SearchQuery::regexp' => ['Couchbase\RegexpSearchQuery', 'regexp'=>'string'], +'Couchbase\SearchQuery::serverSideTimeout' => ['Couchbase\SearchQuery', 'serverSideTimeout'=>'int'], +'Couchbase\SearchQuery::skip' => ['Couchbase\SearchQuery', 'skip'=>'int'], +'Couchbase\SearchQuery::sort' => ['Couchbase\SearchQuery', '...sort='=>'array'], +'Couchbase\SearchQuery::term' => ['Couchbase\TermSearchQuery', 'term'=>'string'], +'Couchbase\SearchQuery::termFacet' => ['Couchbase\TermSearchFacet', 'field'=>'string', 'limit'=>'int'], +'Couchbase\SearchQuery::termRange' => ['Couchbase\TermRangeSearchQuery'], +'Couchbase\SearchQuery::wildcard' => ['Couchbase\WildcardSearchQuery', 'wildcard'=>'string'], +'Couchbase\SearchSort::__construct' => ['void'], +'Couchbase\SearchSort::field' => ['Couchbase\SearchSortField', 'field'=>'string'], +'Couchbase\SearchSort::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], +'Couchbase\SearchSort::id' => ['Couchbase\SearchSortId'], +'Couchbase\SearchSort::score' => ['Couchbase\SearchSortScore'], +'Couchbase\SearchSortField::__construct' => ['void'], +'Couchbase\SearchSortField::descending' => ['Couchbase\SearchSortField', 'descending'=>'bool'], +'Couchbase\SearchSortField::field' => ['Couchbase\SearchSortField', 'field'=>'string'], +'Couchbase\SearchSortField::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], +'Couchbase\SearchSortField::id' => ['Couchbase\SearchSortId'], +'Couchbase\SearchSortField::jsonSerialize' => ['mixed'], +'Couchbase\SearchSortField::missing' => ['', 'missing'=>'string'], +'Couchbase\SearchSortField::mode' => ['', 'mode'=>'string'], +'Couchbase\SearchSortField::score' => ['Couchbase\SearchSortScore'], +'Couchbase\SearchSortField::type' => ['', 'type'=>'string'], +'Couchbase\SearchSortGeoDistance::__construct' => ['void'], +'Couchbase\SearchSortGeoDistance::descending' => ['Couchbase\SearchSortGeoDistance', 'descending'=>'bool'], +'Couchbase\SearchSortGeoDistance::field' => ['Couchbase\SearchSortField', 'field'=>'string'], +'Couchbase\SearchSortGeoDistance::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], +'Couchbase\SearchSortGeoDistance::id' => ['Couchbase\SearchSortId'], +'Couchbase\SearchSortGeoDistance::jsonSerialize' => ['mixed'], +'Couchbase\SearchSortGeoDistance::score' => ['Couchbase\SearchSortScore'], +'Couchbase\SearchSortGeoDistance::unit' => ['Couchbase\SearchSortGeoDistance', 'unit'=>'string'], +'Couchbase\SearchSortId::__construct' => ['void'], +'Couchbase\SearchSortId::descending' => ['Couchbase\SearchSortId', 'descending'=>'bool'], +'Couchbase\SearchSortId::field' => ['Couchbase\SearchSortField', 'field'=>'string'], +'Couchbase\SearchSortId::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], +'Couchbase\SearchSortId::id' => ['Couchbase\SearchSortId'], +'Couchbase\SearchSortId::jsonSerialize' => ['mixed'], +'Couchbase\SearchSortId::score' => ['Couchbase\SearchSortScore'], +'Couchbase\SearchSortScore::__construct' => ['void'], +'Couchbase\SearchSortScore::descending' => ['Couchbase\SearchSortScore', 'descending'=>'bool'], +'Couchbase\SearchSortScore::field' => ['Couchbase\SearchSortField', 'field'=>'string'], +'Couchbase\SearchSortScore::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], +'Couchbase\SearchSortScore::id' => ['Couchbase\SearchSortId'], +'Couchbase\SearchSortScore::jsonSerialize' => ['mixed'], +'Couchbase\SearchSortScore::score' => ['Couchbase\SearchSortScore'], +'Couchbase\SpatialViewQuery::__construct' => ['void'], +'Couchbase\SpatialViewQuery::bbox' => ['Couchbase\SpatialViewQuery', 'bbox'=>'array'], +'Couchbase\SpatialViewQuery::consistency' => ['Couchbase\SpatialViewQuery', 'consistency'=>'int'], +'Couchbase\SpatialViewQuery::custom' => ['', 'customParameters'=>'array'], +'Couchbase\SpatialViewQuery::encode' => ['array'], +'Couchbase\SpatialViewQuery::endRange' => ['Couchbase\SpatialViewQuery', 'range'=>'array'], +'Couchbase\SpatialViewQuery::limit' => ['Couchbase\SpatialViewQuery', 'limit'=>'int'], +'Couchbase\SpatialViewQuery::order' => ['Couchbase\SpatialViewQuery', 'order'=>'int'], +'Couchbase\SpatialViewQuery::skip' => ['Couchbase\SpatialViewQuery', 'skip'=>'int'], +'Couchbase\SpatialViewQuery::startRange' => ['Couchbase\SpatialViewQuery', 'range'=>'array'], +'Couchbase\TermRangeSearchQuery::__construct' => ['void'], +'Couchbase\TermRangeSearchQuery::boost' => ['Couchbase\TermRangeSearchQuery', 'boost'=>'float'], +'Couchbase\TermRangeSearchQuery::field' => ['Couchbase\TermRangeSearchQuery', 'field'=>'string'], +'Couchbase\TermRangeSearchQuery::jsonSerialize' => ['array'], +'Couchbase\TermRangeSearchQuery::max' => ['Couchbase\TermRangeSearchQuery', 'max'=>'string', 'inclusive='=>'bool'], +'Couchbase\TermRangeSearchQuery::min' => ['Couchbase\TermRangeSearchQuery', 'min'=>'string', 'inclusive='=>'bool'], +'Couchbase\TermSearchFacet::__construct' => ['void'], +'Couchbase\TermSearchFacet::jsonSerialize' => ['array'], +'Couchbase\TermSearchQuery::__construct' => ['void'], +'Couchbase\TermSearchQuery::boost' => ['Couchbase\TermSearchQuery', 'boost'=>'float'], +'Couchbase\TermSearchQuery::field' => ['Couchbase\TermSearchQuery', 'field'=>'string'], +'Couchbase\TermSearchQuery::fuzziness' => ['Couchbase\TermSearchQuery', 'fuzziness'=>'int'], +'Couchbase\TermSearchQuery::jsonSerialize' => ['array'], +'Couchbase\TermSearchQuery::prefixLength' => ['Couchbase\TermSearchQuery', 'prefixLength'=>'int'], +'Couchbase\UserSettings::fullName' => ['Couchbase\UserSettings', 'fullName'=>'string'], +'Couchbase\UserSettings::password' => ['Couchbase\UserSettings', 'password'=>'string'], +'Couchbase\UserSettings::role' => ['Couchbase\UserSettings', 'role'=>'string', 'bucket='=>'string'], +'Couchbase\ViewQuery::__construct' => ['void'], +'Couchbase\ViewQuery::consistency' => ['Couchbase\ViewQuery', 'consistency'=>'int'], +'Couchbase\ViewQuery::custom' => ['Couchbase\ViewQuery', 'customParameters'=>'array'], +'Couchbase\ViewQuery::encode' => ['array'], +'Couchbase\ViewQuery::from' => ['Couchbase\ViewQuery', 'designDocumentName'=>'string', 'viewName'=>'string'], +'Couchbase\ViewQuery::fromSpatial' => ['Couchbase\SpatialViewQuery', 'designDocumentName'=>'string', 'viewName'=>'string'], +'Couchbase\ViewQuery::group' => ['Couchbase\ViewQuery', 'group'=>'bool'], +'Couchbase\ViewQuery::groupLevel' => ['Couchbase\ViewQuery', 'groupLevel'=>'int'], +'Couchbase\ViewQuery::idRange' => ['Couchbase\ViewQuery', 'startKeyDocumentId'=>'string', 'endKeyDocumentId'=>'string'], +'Couchbase\ViewQuery::key' => ['Couchbase\ViewQuery', 'key'=>'mixed'], +'Couchbase\ViewQuery::keys' => ['Couchbase\ViewQuery', 'keys'=>'array'], +'Couchbase\ViewQuery::limit' => ['Couchbase\ViewQuery', 'limit'=>'int'], +'Couchbase\ViewQuery::order' => ['Couchbase\ViewQuery', 'order'=>'int'], +'Couchbase\ViewQuery::range' => ['Couchbase\ViewQuery', 'startKey'=>'mixed', 'endKey'=>'mixed', 'inclusiveEnd='=>'bool'], +'Couchbase\ViewQuery::reduce' => ['Couchbase\ViewQuery', 'reduce'=>'bool'], +'Couchbase\ViewQuery::skip' => ['Couchbase\ViewQuery', 'skip'=>'int'], +'Couchbase\ViewQueryEncodable::encode' => ['array'], +'Couchbase\WildcardSearchQuery::__construct' => ['void'], +'Couchbase\WildcardSearchQuery::boost' => ['Couchbase\WildcardSearchQuery', 'boost'=>'float'], +'Couchbase\WildcardSearchQuery::field' => ['Couchbase\WildcardSearchQuery', 'field'=>'string'], +'Couchbase\WildcardSearchQuery::jsonSerialize' => ['array'], +'Couchbase\zlibCompress' => ['string', 'data'=>'string'], +'Couchbase\zlibDecompress' => ['string', 'data'=>'string'], +'count' => ['int', 'value'=>'Countable|array', 'mode='=>'int'], +'count_chars' => ['array', 'input'=>'string', 'mode='=>'0|1|2'], +'count_chars\'1' => ['string', 'input'=>'string', 'mode='=>'3|4'], +'Countable::count' => ['int'], +'crack_check' => ['bool', 'dictionary'=>'', 'password'=>'string'], +'crack_closedict' => ['bool', 'dictionary='=>'resource'], +'crack_getlastmessage' => ['string'], +'crack_opendict' => ['resource|false', 'dictionary'=>'string'], +'crash' => [''], +'crc32' => ['int', 'string'=>'string'], +'crypt' => ['string', 'string'=>'string', 'salt='=>'string'], +'ctype_alnum' => ['bool', 'text'=>'string|int'], +'ctype_alpha' => ['bool', 'text'=>'string|int'], +'ctype_cntrl' => ['bool', 'text'=>'string|int'], +'ctype_digit' => ['bool', 'text'=>'string|int'], +'ctype_graph' => ['bool', 'text'=>'string|int'], +'ctype_lower' => ['bool', 'text'=>'string|int'], +'ctype_print' => ['bool', 'text'=>'string|int'], +'ctype_punct' => ['bool', 'text'=>'string|int'], +'ctype_space' => ['bool', 'text'=>'string|int'], +'ctype_upper' => ['bool', 'text'=>'string|int'], +'ctype_xdigit' => ['bool', 'text'=>'string|int'], +'cubrid_affected_rows' => ['int', 'req_identifier='=>''], +'cubrid_bind' => ['bool', 'req_identifier'=>'resource', 'bind_param'=>'int', 'bind_value'=>'mixed', 'bind_value_type='=>'string'], +'cubrid_client_encoding' => ['string', 'conn_identifier='=>''], +'cubrid_close' => ['bool', 'conn_identifier='=>''], +'cubrid_close_prepare' => ['bool', 'req_identifier'=>'resource'], +'cubrid_close_request' => ['bool', 'req_identifier'=>'resource'], +'cubrid_col_get' => ['array', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string'], +'cubrid_col_size' => ['int', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string'], +'cubrid_column_names' => ['array', 'req_identifier'=>'resource'], +'cubrid_column_types' => ['array', 'req_identifier'=>'resource'], +'cubrid_commit' => ['bool', 'conn_identifier'=>'resource'], +'cubrid_connect' => ['resource', 'host'=>'string', 'port'=>'int', 'dbname'=>'string', 'userid='=>'string', 'passwd='=>'string'], +'cubrid_connect_with_url' => ['resource', 'conn_url'=>'string', 'userid='=>'string', 'passwd='=>'string'], +'cubrid_current_oid' => ['string', 'req_identifier'=>'resource'], +'cubrid_data_seek' => ['bool', 'req_identifier'=>'', 'row_number'=>'int'], +'cubrid_db_name' => ['string', 'result'=>'array', 'index'=>'int'], +'cubrid_db_parameter' => ['array', 'conn_identifier'=>'resource'], +'cubrid_disconnect' => ['bool', 'conn_identifier'=>'resource'], +'cubrid_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], +'cubrid_errno' => ['int', 'conn_identifier='=>''], +'cubrid_error' => ['string', 'connection='=>''], +'cubrid_error_code' => ['int'], +'cubrid_error_code_facility' => ['int'], +'cubrid_error_msg' => ['string'], +'cubrid_execute' => ['bool', 'conn_identifier'=>'', 'sql'=>'string', 'option='=>'int', 'request_identifier='=>''], +'cubrid_fetch' => ['mixed', 'result'=>'resource', 'type='=>'int'], +'cubrid_fetch_array' => ['array', 'result'=>'resource', 'type='=>'int'], +'cubrid_fetch_assoc' => ['array', 'result'=>'resource'], +'cubrid_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], +'cubrid_fetch_lengths' => ['array', 'result'=>'resource'], +'cubrid_fetch_object' => ['object', 'result'=>'resource', 'class_name='=>'string', 'params='=>'array'], +'cubrid_fetch_row' => ['array', 'result'=>'resource'], +'cubrid_field_flags' => ['string', 'result'=>'resource', 'field_offset'=>'int'], +'cubrid_field_len' => ['int', 'result'=>'resource', 'field_offset'=>'int'], +'cubrid_field_name' => ['string', 'result'=>'resource', 'field_offset'=>'int'], +'cubrid_field_seek' => ['bool', 'result'=>'resource', 'field_offset='=>'int'], +'cubrid_field_table' => ['string', 'result'=>'resource', 'field_offset'=>'int'], +'cubrid_field_type' => ['string', 'result'=>'resource', 'field_offset'=>'int'], +'cubrid_free_result' => ['bool', 'req_identifier'=>'resource'], +'cubrid_get' => ['mixed', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr='=>'mixed'], +'cubrid_get_autocommit' => ['bool', 'conn_identifier'=>'resource'], +'cubrid_get_charset' => ['string', 'conn_identifier'=>'resource'], +'cubrid_get_class_name' => ['string', 'conn_identifier'=>'resource', 'oid'=>'string'], +'cubrid_get_client_info' => ['string'], +'cubrid_get_db_parameter' => ['array', 'conn_identifier'=>'resource'], +'cubrid_get_query_timeout' => ['int', 'req_identifier'=>'resource'], +'cubrid_get_server_info' => ['string', 'conn_identifier'=>'resource'], +'cubrid_insert_id' => ['string', 'conn_identifier='=>'resource'], +'cubrid_is_instance' => ['int', 'conn_identifier'=>'resource', 'oid'=>'string'], +'cubrid_list_dbs' => ['array', 'conn_identifier'=>'resource'], +'cubrid_load_from_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string', 'file_name'=>'string'], +'cubrid_lob2_bind' => ['bool', 'req_identifier'=>'resource', 'bind_index'=>'int', 'bind_value'=>'mixed', 'bind_value_type='=>'string'], +'cubrid_lob2_close' => ['bool', 'lob_identifier'=>'resource'], +'cubrid_lob2_export' => ['bool', 'lob_identifier'=>'resource', 'file_name'=>'string'], +'cubrid_lob2_import' => ['bool', 'lob_identifier'=>'resource', 'file_name'=>'string'], +'cubrid_lob2_new' => ['resource', 'conn_identifier='=>'resource', 'type='=>'string'], +'cubrid_lob2_read' => ['string', 'lob_identifier'=>'resource', 'length'=>'int'], +'cubrid_lob2_seek' => ['bool', 'lob_identifier'=>'resource', 'offset'=>'int', 'origin='=>'int'], +'cubrid_lob2_seek64' => ['bool', 'lob_identifier'=>'resource', 'offset'=>'string', 'origin='=>'int'], +'cubrid_lob2_size' => ['int', 'lob_identifier'=>'resource'], +'cubrid_lob2_size64' => ['string', 'lob_identifier'=>'resource'], +'cubrid_lob2_tell' => ['int', 'lob_identifier'=>'resource'], +'cubrid_lob2_tell64' => ['string', 'lob_identifier'=>'resource'], +'cubrid_lob2_write' => ['bool', 'lob_identifier'=>'resource', 'buf'=>'string'], +'cubrid_lob_close' => ['bool', 'lob_identifier_array'=>'array'], +'cubrid_lob_export' => ['bool', 'conn_identifier'=>'resource', 'lob_identifier'=>'resource', 'path_name'=>'string'], +'cubrid_lob_get' => ['array', 'conn_identifier'=>'resource', 'sql'=>'string'], +'cubrid_lob_send' => ['bool', 'conn_identifier'=>'resource', 'lob_identifier'=>'resource'], +'cubrid_lob_size' => ['string', 'lob_identifier'=>'resource'], +'cubrid_lock_read' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], +'cubrid_lock_write' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], +'cubrid_move_cursor' => ['int', 'req_identifier'=>'resource', 'offset'=>'int', 'origin='=>'int'], +'cubrid_new_glo' => ['string', 'conn_identifier'=>'', 'class_name'=>'string', 'file_name'=>'string'], +'cubrid_next_result' => ['bool', 'result'=>'resource'], +'cubrid_num_cols' => ['int', 'req_identifier'=>'resource'], +'cubrid_num_fields' => ['int', 'result'=>'resource'], +'cubrid_num_rows' => ['int', 'req_identifier'=>'resource'], +'cubrid_pconnect' => ['resource', 'host'=>'string', 'port'=>'int', 'dbname'=>'string', 'userid='=>'string', 'passwd='=>'string'], +'cubrid_pconnect_with_url' => ['resource', 'conn_url'=>'string', 'userid='=>'string', 'passwd='=>'string'], +'cubrid_ping' => ['bool', 'conn_identifier='=>''], +'cubrid_prepare' => ['resource', 'conn_identifier'=>'resource', 'prepare_stmt'=>'string', 'option='=>'int'], +'cubrid_put' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr='=>'string', 'value='=>'mixed'], +'cubrid_query' => ['resource', 'query'=>'string', 'conn_identifier='=>''], +'cubrid_real_escape_string' => ['string', 'unescaped_string'=>'string', 'conn_identifier='=>''], +'cubrid_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field='=>''], +'cubrid_rollback' => ['bool', 'conn_identifier'=>'resource'], +'cubrid_save_to_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string', 'file_name'=>'string'], +'cubrid_schema' => ['array', 'conn_identifier'=>'resource', 'schema_type'=>'int', 'class_name='=>'string', 'attr_name='=>'string'], +'cubrid_send_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string'], +'cubrid_seq_add' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'seq_element'=>'string'], +'cubrid_seq_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int'], +'cubrid_seq_insert' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int', 'seq_element'=>'string'], +'cubrid_seq_put' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int', 'seq_element'=>'string'], +'cubrid_set_add' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'set_element'=>'string'], +'cubrid_set_autocommit' => ['bool', 'conn_identifier'=>'resource', 'mode'=>'bool'], +'cubrid_set_db_parameter' => ['bool', 'conn_identifier'=>'resource', 'param_type'=>'int', 'param_value'=>'int'], +'cubrid_set_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'set_element'=>'string'], +'cubrid_set_query_timeout' => ['bool', 'req_identifier'=>'resource', 'timeout'=>'int'], +'cubrid_unbuffered_query' => ['resource', 'query'=>'string', 'conn_identifier='=>''], +'cubrid_version' => ['string'], +'curl_close' => ['void', 'handle'=>'CurlHandle'], +'curl_copy_handle' => ['CurlHandle', 'handle'=>'CurlHandle'], +'curl_errno' => ['int', 'handle'=>'CurlHandle'], +'curl_error' => ['string', 'handle'=>'CurlHandle'], +'curl_escape' => ['string|false', 'handle'=>'CurlHandle', 'string'=>'string'], +'curl_exec' => ['bool|string', 'handle'=>'CurlHandle'], +'curl_file_create' => ['CURLFile', 'filename'=>'string', 'mime_type='=>'string|null', 'posted_filename='=>'string|null'], +'curl_getinfo' => ['mixed', 'handle'=>'CurlHandle', 'option='=>'int'], +'curl_init' => ['CurlHandle|false', 'url='=>'string'], +'curl_multi_add_handle' => ['int', 'multi_handle'=>'CurlMultiHandle', 'handle'=>'CurlHandle'], +'curl_multi_close' => ['void', 'multi_handle'=>'CurlMultiHandle'], +'curl_multi_errno' => ['int', 'multi_handle'=>'CurlMultiHandle'], +'curl_multi_exec' => ['int', 'multi_handle'=>'CurlMultiHandle', '&w_still_running'=>'int'], +'curl_multi_getcontent' => ['?string', 'handle'=>'CurlHandle'], +'curl_multi_info_read' => ['array|false', 'multi_handle'=>'CurlMultiHandle', '&w_queued_messages='=>'int'], +'curl_multi_init' => ['CurlMultiHandle|false'], +'curl_multi_remove_handle' => ['int', 'multi_handle'=>'CurlMultiHandle', 'handle'=>'CurlHandle'], +'curl_multi_select' => ['int', 'multi_handle'=>'CurlMultiHandle', 'timeout='=>'float'], +'curl_multi_setopt' => ['bool', 'multi_handle'=>'CurlMultiHandle', 'option'=>'int', 'value'=>'mixed'], +'curl_multi_strerror' => ['?string', 'error_code'=>'int'], +'curl_pause' => ['int', 'handle'=>'CurlHandle', 'flags'=>'int'], +'curl_reset' => ['void', 'handle'=>'CurlHandle'], +'curl_setopt' => ['bool', 'handle'=>'CurlHandle', 'option'=>'int', 'value'=>'callable|mixed'], +'curl_setopt_array' => ['bool', 'handle'=>'CurlHandle', 'options'=>'array'], +'curl_share_close' => ['void', 'share_handle'=>'CurlShareHandle'], +'curl_share_errno' => ['int', 'share_handle'=>'CurlShareHandle'], +'curl_share_init' => ['CurlShareHandle'], +'curl_share_setopt' => ['bool', 'share_handle'=>'CurlShareHandle', 'option'=>'int', 'value'=>'mixed'], +'curl_share_strerror' => ['?string', 'error_code'=>'int'], +'curl_strerror' => ['?string', 'error_code'=>'int'], +'curl_unescape' => ['string|false', 'handle'=>'CurlShareHandle', 'string'=>'string'], +'curl_version' => ['array', 'version='=>'int'], +'CURLFile::__construct' => ['void', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'], +'CURLFile::__wakeup' => ['void'], +'CURLFile::getFilename' => ['string'], +'CURLFile::getMimeType' => ['string'], +'CURLFile::getPostFilename' => ['string'], +'CURLFile::setMimeType' => ['void', 'mime'=>'string'], +'CURLFile::setPostFilename' => ['void', 'name'=>'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'], +'cyrus_bind' => ['bool', 'connection'=>'resource', 'callbacks'=>'array'], +'cyrus_close' => ['bool', 'connection'=>'resource'], +'cyrus_connect' => ['resource', 'host='=>'string', 'port='=>'string', 'flags='=>'int'], +'cyrus_query' => ['array', 'connection'=>'resource', 'query'=>'string'], +'cyrus_unbind' => ['bool', 'connection'=>'resource', 'trigger_name'=>'string'], +'date' => ['string', 'format'=>'string', 'timestamp='=>'?int'], +'date_add' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'], +'date_create' => ['DateTime|false', 'datetime='=>'string', 'timezone='=>'?DateTimeZone'], +'date_create_from_format' => ['DateTime|false', 'format'=>'string', 'datetime'=>'string', 'timezone='=>'?\DateTimeZone'], +'date_create_immutable' => ['DateTimeImmutable|false', 'datetime='=>'string', 'timezone='=>'?DateTimeZone'], +'date_create_immutable_from_format' => ['DateTimeImmutable|false', 'format'=>'string', 'datetime'=>'string', 'timezone='=>'?DateTimeZone'], +'date_date_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'month'=>'int', 'day'=>'int'], +'date_default_timezone_get' => ['string'], +'date_default_timezone_set' => ['bool', 'timezoneId'=>'string'], +'date_diff' => ['DateInterval|false', 'baseObject'=>'DateTimeInterface', 'targetObject'=>'DateTimeInterface', 'absolute='=>'bool'], +'date_format' => ['string', 'object'=>'DateTimeInterface', 'format'=>'string'], +'date_get_last_errors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], +'date_interval_create_from_date_string' => ['DateInterval', 'datetime'=>'string'], +'date_interval_format' => ['string', 'object'=>'DateInterval', 'format'=>'string'], +'date_isodate_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'week'=>'int', 'dayOfWeek='=>'int|mixed'], +'date_modify' => ['DateTime|false', 'object'=>'DateTime', 'modifier'=>'string'], +'date_offset_get' => ['int|false', 'object'=>'DateTimeInterface'], +'date_parse' => ['array|false', 'datetime'=>'string'], +'date_parse_from_format' => ['array', 'format'=>'string', 'datetime'=>'string'], +'date_sub' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'], +'date_sun_info' => ['array|false', 'timestamp'=>'int', 'latitude'=>'float', 'longitude'=>'float'], +'date_sunrise' => ['mixed', 'timestamp'=>'int', 'returnFormat='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'utcOffset='=>'float'], +'date_sunset' => ['mixed', 'timestamp'=>'int', 'returnFormat='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'utcOffset='=>'float'], +'date_time_set' => ['DateTime|false', 'object'=>'', 'hour'=>'', 'minute'=>'', 'second='=>'', 'microsecond='=>''], +'date_timestamp_get' => ['int', 'object'=>'DateTimeInterface'], +'date_timestamp_set' => ['DateTime|false', 'object'=>'DateTime', 'timestamp'=>'int'], +'date_timezone_get' => ['DateTimeZone|false', 'object'=>'DateTimeInterface'], +'date_timezone_set' => ['DateTime|false', 'object'=>'DateTime', 'timezone'=>'DateTimeZone'], +'datefmt_create' => ['?IntlDateFormatter', 'locale'=>'?string', 'dateType='=>'int', 'timeType='=>'int', 'timezone='=>'DateTimeZone|IntlTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'?string'], +'datefmt_format' => ['string|false', 'formatter'=>'IntlDateFormatter', 'datetime'=>'DateTime|IntlCalendar|array|int'], +'datefmt_format_object' => ['string|false', 'datetime'=>'object', 'format='=>'mixed', 'locale='=>'string'], +'datefmt_get_calendar' => ['int', 'formatter'=>'IntlDateFormatter'], +'datefmt_get_calendar_object' => ['IntlCalendar|false|null', 'formatter'=>'IntlDateFormatter'], +'datefmt_get_datetype' => ['int', 'formatter'=>'IntlDateFormatter'], +'datefmt_get_error_code' => ['int', 'formatter'=>'IntlDateFormatter'], +'datefmt_get_error_message' => ['string', 'formatter'=>'IntlDateFormatter'], +'datefmt_get_locale' => ['string|false', 'formatter'=>'IntlDateFormatter', 'type='=>'int'], +'datefmt_get_pattern' => ['string', 'formatter'=>'IntlDateFormatter'], +'datefmt_get_timetype' => ['int', 'formatter'=>'IntlDateFormatter'], +'datefmt_get_timezone' => ['IntlTimeZone|false', 'formatter'=>'IntlDateFormatter'], +'datefmt_get_timezone_id' => ['string|false', 'formatter'=>'IntlDateFormatter'], +'datefmt_is_lenient' => ['bool', 'formatter'=>'IntlDateFormatter'], +'datefmt_localtime' => ['array|false', 'formatter'=>'IntlDateFormatter', 'string'=>'string', '&rw_offset='=>'int'], +'datefmt_parse' => ['int|false', 'formatter'=>'IntlDateFormatter', 'string'=>'string', '&rw_offset='=>'int'], +'datefmt_set_calendar' => ['bool', 'formatter'=>'IntlDateFormatter', 'calendar'=>'int'], +'datefmt_set_lenient' => ['?bool', '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::__set_state' => ['DateInterval', 'array'=>'array'], +'DateInterval::__wakeup' => ['void'], +'DateInterval::createFromDateString' => ['DateInterval|false', 'time'=>'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'], +'DatePeriod::__construct\'2' => ['void', 'iso'=>'string', 'options='=>'int'], +'DatePeriod::__wakeup' => ['void'], +'DatePeriod::getDateInterval' => ['DateInterval'], +'DatePeriod::getEndDate' => ['?DateTimeInterface'], +'DatePeriod::getStartDate' => ['DateTimeInterface'], +'DateTime::__construct' => ['void', 'time='=>'string'], +'DateTime::__construct\'1' => ['void', 'time'=>'?string', 'timezone'=>'?DateTimeZone'], +'DateTime::__set_state' => ['static', 'array'=>'array'], +'DateTime::__wakeup' => ['void'], +'DateTime::add' => ['static', 'interval'=>'DateInterval'], +'DateTime::createFromFormat' => ['static|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'], +'DateTime::createFromImmutable' => ['static', 'object'=>'DateTimeImmutable'], +'DateTime::createFromInterface' => ['self', 'object' => 'DateTimeInterface'], +'DateTime::diff' => ['DateInterval|false', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], +'DateTime::format' => ['string', 'format'=>'string'], +'DateTime::getLastErrors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], +'DateTime::getOffset' => ['int'], +'DateTime::getTimestamp' => ['int|false'], +'DateTime::getTimezone' => ['DateTimeZone|false'], +'DateTime::modify' => ['static|false', 'modify'=>'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::setTimezone' => ['static', 'timezone'=>'DateTimeZone'], +'DateTime::sub' => ['static', 'interval'=>'DateInterval'], +'DateTimeImmutable::__construct' => ['void', 'time='=>'string'], +'DateTimeImmutable::__construct\'1' => ['void', 'time'=>'?string', 'timezone'=>'?DateTimeZone'], +'DateTimeImmutable::__set_state' => ['static', 'array'=>'array'], +'DateTimeImmutable::__wakeup' => ['void'], +'DateTimeImmutable::add' => ['static', 'interval'=>'DateInterval'], +'DateTimeImmutable::createFromFormat' => ['static|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'], +'DateTimeImmutable::createFromInterface' => ['self', 'object' => 'DateTimeInterface'], +'DateTimeImmutable::createFromMutable' => ['static', 'datetime'=>'DateTime'], +'DateTimeImmutable::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], +'DateTimeImmutable::format' => ['string', 'format'=>'string'], +'DateTimeImmutable::getLastErrors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], +'DateTimeImmutable::getOffset' => ['int'], +'DateTimeImmutable::getTimestamp' => ['int|false'], +'DateTimeImmutable::getTimezone' => ['DateTimeZone|false'], +'DateTimeImmutable::modify' => ['static', 'modify'=>'string'], +'DateTimeImmutable::setDate' => ['static|false', 'year'=>'int', 'month'=>'int', 'day'=>'int'], +'DateTimeImmutable::setISODate' => ['static|false', 'year'=>'int', 'week'=>'int', 'day='=>'int'], +'DateTimeImmutable::setTime' => ['static|false', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], +'DateTimeImmutable::setTimestamp' => ['static|false', 'unixtimestamp'=>'int'], +'DateTimeImmutable::setTimezone' => ['static|false', 'timezone'=>'DateTimeZone'], +'DateTimeImmutable::sub' => ['static|false', 'interval'=>'DateInterval'], +'DateTimeInterface::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], +'DateTimeInterface::format' => ['string', 'format'=>'string'], +'DateTimeInterface::getOffset' => ['int'], +'DateTimeInterface::getTimestamp' => ['int|false'], +'DateTimeInterface::getTimezone' => ['DateTimeZone|false'], +'DateTimeZone::__construct' => ['void', 'timezone'=>'string'], +'DateTimeZone::__set_state' => ['DateTimeZone', 'array'=>'array'], +'DateTimeZone::__wakeup' => ['void'], +'DateTimeZone::getLocation' => ['array|false'], +'DateTimeZone::getName' => ['string'], +'DateTimeZone::getOffset' => ['int|false', 'datetime'=>'DateTimeInterface'], +'DateTimeZone::getTransitions' => ['list|false', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'], +'DateTimeZone::listAbbreviations' => ['array>|false'], +'DateTimeZone::listIdentifiers' => ['list', 'timezoneGroup='=>'int', 'countryCode='=>'string|null'], +'db2_autocommit' => ['mixed', 'connection'=>'resource', 'value='=>'int'], +'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_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_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_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_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_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_pclose' => ['bool', 'resource'=>'resource'], +'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_primarykeys' => [''], +'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_rollback' => ['bool', 'connection'=>'resource'], +'db2_server_info' => ['object|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_specialcolumns' => [''], +'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_tableprivileges' => [''], +'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'], +'dba_fetch' => ['string|false', 'key'=>'string', 'skip'=>'int', 'dba'=>'resource'], +'dba_fetch\'1' => ['string|false', 'key'=>'string', 'skip'=>'resource'], +'dba_firstkey' => ['string', 'dba'=>'resource'], +'dba_handlers' => ['array', 'full_info='=>'bool'], +'dba_insert' => ['bool', 'key'=>'string', 'value'=>'string', 'dba'=>'resource'], +'dba_key_split' => ['array|false', 'key'=>'string'], +'dba_list' => ['array'], +'dba_nextkey' => ['string', 'dba'=>'resource'], +'dba_open' => ['resource', 'path'=>'string', 'mode'=>'string', 'handler='=>'string', '...handler_params='=>'string'], +'dba_optimize' => ['bool', 'dba'=>'resource'], +'dba_popen' => ['resource', 'path'=>'string', 'mode'=>'string', 'handler='=>'string', '...handler_params='=>'string'], +'dba_replace' => ['bool', 'key'=>'string', 'value'=>'string', 'dba'=>'resource'], +'dba_sync' => ['bool', 'dba'=>'resource'], +'dbase_add_record' => ['bool', 'dbase_identifier'=>'resource', 'record'=>'array'], +'dbase_close' => ['bool', 'dbase_identifier'=>'resource'], +'dbase_create' => ['resource|false', 'filename'=>'string', 'fields'=>'array'], +'dbase_delete_record' => ['bool', 'dbase_identifier'=>'resource', 'record_number'=>'int'], +'dbase_get_header_info' => ['array', 'dbase_identifier'=>'resource'], +'dbase_get_record' => ['array', 'dbase_identifier'=>'resource', 'record_number'=>'int'], +'dbase_get_record_with_names' => ['array', 'dbase_identifier'=>'resource', 'record_number'=>'int'], +'dbase_numfields' => ['int', 'dbase_identifier'=>'resource'], +'dbase_numrecords' => ['int', 'dbase_identifier'=>'resource'], +'dbase_open' => ['resource|false', 'filename'=>'string', 'mode'=>'int'], +'dbase_pack' => ['bool', 'dbase_identifier'=>'resource'], +'dbase_replace_record' => ['bool', 'dbase_identifier'=>'resource', 'record'=>'array', 'record_number'=>'int'], +'dbplus_add' => ['int', 'relation'=>'resource', 'tuple'=>'array'], +'dbplus_aql' => ['resource', 'query'=>'string', 'server='=>'string', 'dbpath='=>'string'], +'dbplus_chdir' => ['string', 'newdir='=>'string'], +'dbplus_close' => ['mixed', 'relation'=>'resource'], +'dbplus_curr' => ['int', 'relation'=>'resource', 'tuple'=>'array'], +'dbplus_errcode' => ['string', 'errno='=>'int'], +'dbplus_errno' => ['int'], +'dbplus_find' => ['int', 'relation'=>'resource', 'constraints'=>'array', 'tuple'=>'mixed'], +'dbplus_first' => ['int', 'relation'=>'resource', 'tuple'=>'array'], +'dbplus_flush' => ['int', 'relation'=>'resource'], +'dbplus_freealllocks' => ['int'], +'dbplus_freelock' => ['int', 'relation'=>'resource', 'tuple'=>'string'], +'dbplus_freerlocks' => ['int', 'relation'=>'resource'], +'dbplus_getlock' => ['int', 'relation'=>'resource', 'tuple'=>'string'], +'dbplus_getunique' => ['int', 'relation'=>'resource', 'uniqueid'=>'int'], +'dbplus_info' => ['int', 'relation'=>'resource', 'key'=>'string', 'result'=>'array'], +'dbplus_last' => ['int', 'relation'=>'resource', 'tuple'=>'array'], +'dbplus_lockrel' => ['int', 'relation'=>'resource'], +'dbplus_next' => ['int', 'relation'=>'resource', 'tuple'=>'array'], +'dbplus_open' => ['resource', 'name'=>'string'], +'dbplus_prev' => ['int', 'relation'=>'resource', 'tuple'=>'array'], +'dbplus_rchperm' => ['int', 'relation'=>'resource', 'mask'=>'int', 'user'=>'string', 'group'=>'string'], +'dbplus_rcreate' => ['resource', 'name'=>'string', 'domlist'=>'mixed', 'overwrite='=>'bool'], +'dbplus_rcrtexact' => ['mixed', 'name'=>'string', 'relation'=>'resource', 'overwrite='=>'bool'], +'dbplus_rcrtlike' => ['mixed', 'name'=>'string', 'relation'=>'resource', 'overwrite='=>'int'], +'dbplus_resolve' => ['array', 'relation_name'=>'string'], +'dbplus_restorepos' => ['int', 'relation'=>'resource', 'tuple'=>'array'], +'dbplus_rkeys' => ['mixed', 'relation'=>'resource', 'domlist'=>'mixed'], +'dbplus_ropen' => ['resource', 'name'=>'string'], +'dbplus_rquery' => ['resource', 'query'=>'string', 'dbpath='=>'string'], +'dbplus_rrename' => ['int', 'relation'=>'resource', 'name'=>'string'], +'dbplus_rsecindex' => ['mixed', 'relation'=>'resource', 'domlist'=>'mixed', 'type'=>'int'], +'dbplus_runlink' => ['int', 'relation'=>'resource'], +'dbplus_rzap' => ['int', 'relation'=>'resource'], +'dbplus_savepos' => ['int', 'relation'=>'resource'], +'dbplus_setindex' => ['int', 'relation'=>'resource', 'idx_name'=>'string'], +'dbplus_setindexbynumber' => ['int', 'relation'=>'resource', 'idx_number'=>'int'], +'dbplus_sql' => ['resource', 'query'=>'string', 'server='=>'string', 'dbpath='=>'string'], +'dbplus_tcl' => ['string', 'sid'=>'int', 'script'=>'string'], +'dbplus_tremove' => ['int', 'relation'=>'resource', 'tuple'=>'array', 'current='=>'array'], +'dbplus_undo' => ['int', 'relation'=>'resource'], +'dbplus_undoprepare' => ['int', 'relation'=>'resource'], +'dbplus_unlockrel' => ['int', 'relation'=>'resource'], +'dbplus_unselect' => ['int', 'relation'=>'resource'], +'dbplus_update' => ['int', 'relation'=>'resource', 'old'=>'array', 'new'=>'array'], +'dbplus_xlockrel' => ['int', 'relation'=>'resource'], +'dbplus_xunlockrel' => ['int', 'relation'=>'resource'], +'dbx_close' => ['int', 'link_identifier'=>'object'], +'dbx_compare' => ['int', 'row_a'=>'array', 'row_b'=>'array', 'column_key'=>'string', 'flags='=>'int'], +'dbx_connect' => ['object', 'module'=>'mixed', 'host'=>'string', 'database'=>'string', 'username'=>'string', 'password'=>'string', 'persistent='=>'int'], +'dbx_error' => ['string', 'link_identifier'=>'object'], +'dbx_escape_string' => ['string', 'link_identifier'=>'object', 'text'=>'string'], +'dbx_fetch_row' => ['mixed', 'result_identifier'=>'object'], +'dbx_query' => ['mixed', 'link_identifier'=>'object', 'sql_statement'=>'string', 'flags='=>'int'], +'dbx_sort' => ['bool', 'result'=>'object', 'user_compare_function'=>'string'], +'dcgettext' => ['string', 'domain'=>'string', 'message'=>'string', 'category'=>'int'], +'dcngettext' => ['string', 'domain'=>'string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int', 'category'=>'int'], +'deaggregate' => ['', 'object'=>'object', 'class_name='=>'string'], +'debug_backtrace' => ['list', 'options='=>'int', 'limit='=>'int'], +'debug_print_backtrace' => ['void', 'options='=>'int', 'limit='=>'int'], +'debug_zval_dump' => ['void', '...value'=>'mixed'], +'debugger_connect' => [''], +'debugger_connector_pid' => [''], +'debugger_get_server_start_time' => [''], +'debugger_print' => [''], +'debugger_start_debug' => [''], +'decbin' => ['string', 'num'=>'int'], +'dechex' => ['string', 'num'=>'int'], +'decoct' => ['string', 'num'=>'int'], +'define' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'case_insensitive='=>'bool'], +'define_syslog_variables' => ['void'], +'defined' => ['bool', 'constant_name'=>'string'], +'deflate_add' => ['string|false', 'context'=>'resource', 'data'=>'string', 'flush_mode='=>'int'], +'deflate_init' => ['resource|false', 'encoding'=>'int', 'options='=>'array'], +'deg2rad' => ['float', 'num'=>'float'], +'dgettext' => ['string', 'domain'=>'string', 'message'=>'string'], +'dio_close' => ['void', 'fd'=>'resource'], +'dio_fcntl' => ['mixed', 'fd'=>'resource', 'cmd'=>'int', 'args='=>'mixed'], +'dio_open' => ['resource|false', 'filename'=>'string', 'flags'=>'int', 'mode='=>'int'], +'dio_read' => ['string', 'fd'=>'resource', 'length='=>'int'], +'dio_seek' => ['int', 'fd'=>'resource', 'pos'=>'int', 'whence='=>'int'], +'dio_stat' => ['?array', 'fd'=>'resource'], +'dio_tcsetattr' => ['bool', 'fd'=>'resource', 'options'=>'array'], +'dio_truncate' => ['bool', 'fd'=>'resource', 'offset'=>'int'], +'dio_write' => ['int', 'fd'=>'resource', 'data'=>'string', 'length='=>'int'], +'dir' => ['Directory|false', 'directory'=>'string', 'context='=>'resource'], +'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::__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::getFilename' => ['string'], +'DirectoryIterator::getGroup' => ['int'], +'DirectoryIterator::getInode' => ['int'], +'DirectoryIterator::getLinkTarget' => ['string'], +'DirectoryIterator::getMTime' => ['int'], +'DirectoryIterator::getOwner' => ['int'], +'DirectoryIterator::getPath' => ['string'], +'DirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], +'DirectoryIterator::getPathname' => ['string'], +'DirectoryIterator::getPerms' => ['int'], +'DirectoryIterator::getRealPath' => ['string'], +'DirectoryIterator::getSize' => ['int'], +'DirectoryIterator::getType' => ['string'], +'DirectoryIterator::isDir' => ['bool'], +'DirectoryIterator::isDot' => ['bool'], +'DirectoryIterator::isExecutable' => ['bool'], +'DirectoryIterator::isFile' => ['bool'], +'DirectoryIterator::isLink' => ['bool'], +'DirectoryIterator::isReadable' => ['bool'], +'DirectoryIterator::isWritable' => ['bool'], +'DirectoryIterator::key' => ['string'], +'DirectoryIterator::next' => ['void'], +'DirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], +'DirectoryIterator::rewind' => ['void'], +'DirectoryIterator::seek' => ['void', 'position'=>'int'], +'DirectoryIterator::setFileClass' => ['void', 'class_name='=>'string'], +'DirectoryIterator::setInfoClass' => ['void', 'class_name='=>'string'], +'DirectoryIterator::valid' => ['bool'], +'dirname' => ['string', 'path'=>'string', 'levels='=>'int'], +'disk_free_space' => ['float|false', 'directory'=>'string'], +'disk_total_space' => ['float|false', 'directory'=>'string'], +'diskfreespace' => ['float|false', 'directory'=>'string'], +'display_disabled_function' => [''], +'dl' => ['bool', 'extension_filename'=>'string'], +'dngettext' => ['string', 'domain'=>'string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int'], +'dns_check_record' => ['bool', 'hostname'=>'string', 'type='=>'string'], +'dns_get_mx' => ['bool', 'hostname'=>'string', '&w_hosts'=>'array', '&w_weights'=>'array'], +'dns_get_record' => ['list|false', 'hostname'=>'string', 'type='=>'int', '&w_authoritative_name_servers='=>'array', '&w_additional_records='=>'array', 'raw='=>'bool'], +'dom_document_relaxNG_validate_file' => ['bool', 'filename'=>'string'], +'dom_document_relaxNG_validate_xml' => ['bool', 'source'=>'string'], +'dom_document_schema_validate' => ['bool', 'source'=>'string', 'flags'=>'int'], +'dom_document_schema_validate_file' => ['bool', 'filename'=>'string', 'flags'=>'int'], +'dom_document_xinclude' => ['int', 'options'=>'int'], +'dom_import_simplexml' => ['DOMElement', 'node'=>'SimpleXMLElement'], +'dom_xpath_evaluate' => ['', 'expr'=>'string', 'context'=>'DOMNode', 'registernodens'=>'bool'], +'dom_xpath_query' => ['DOMNodeList', 'expr'=>'string', 'context'=>'DOMNode', 'registernodens'=>'bool'], +'dom_xpath_register_ns' => ['bool', 'prefix'=>'string', 'uri'=>'string'], +'dom_xpath_register_php_functions' => [''], +'DomainException::__clone' => ['void'], +'DomainException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?DomainException'], +'DomainException::__toString' => ['string'], +'DomainException::__wakeup' => ['void'], +'DomainException::getCode' => ['int'], +'DomainException::getFile' => ['string'], +'DomainException::getLine' => ['int'], +'DomainException::getMessage' => ['string'], +'DomainException::getPrevious' => ['Throwable|DomainException|null'], +'DomainException::getTrace' => ['list\',args?:array}>'], +'DomainException::getTraceAsString' => ['string'], +'DOMAttr::__construct' => ['void', 'name'=>'string', 'value='=>'string'], +'DOMAttr::getLineNo' => ['int'], +'DOMAttr::getNodePath' => ['?string'], +'DOMAttr::hasAttributes' => ['bool'], +'DOMAttr::hasChildNodes' => ['bool'], +'DOMAttr::insertBefore' => ['DOMNode', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode'], +'DOMAttr::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'], +'DOMAttr::isId' => ['bool'], +'DOMAttr::isSameNode' => ['bool', 'node'=>'DOMNode'], +'DOMAttr::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], +'DOMAttr::lookupNamespaceUri' => ['string', 'prefix'=>'string'], +'DOMAttr::lookupPrefix' => ['string', 'namespaceuri'=>'string'], +'DOMAttr::normalize' => ['void'], +'DOMAttr::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], +'DOMAttr::replaceChild' => ['DOMNode', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], +'DomAttribute::name' => ['string'], +'DomAttribute::set_value' => ['bool', 'content'=>'string'], +'DomAttribute::specified' => ['bool'], +'DomAttribute::value' => ['string'], +'DOMCdataSection::__construct' => ['void', 'value'=>'string'], +'DOMCharacterData::appendData' => ['void', 'data'=>'string'], +'DOMCharacterData::deleteData' => ['void', 'offset'=>'int', 'count'=>'int'], +'DOMCharacterData::insertData' => ['void', 'offset'=>'int', 'data'=>'string'], +'DOMCharacterData::replaceData' => ['void', 'offset'=>'int', 'count'=>'int', 'data'=>'string'], +'DOMCharacterData::substringData' => ['string', 'offset'=>'int', 'count'=>'int'], +'DOMComment::__construct' => ['void', 'value='=>'string'], +'DOMDocument::__construct' => ['void', 'version='=>'string', 'encoding='=>'string'], +'DOMDocument::createAttribute' => ['DOMAttr|false', 'name'=>'string'], +'DOMDocument::createAttributeNS' => ['DOMAttr|false', 'namespaceuri'=>'string', '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', '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', 'localname'=>'string'], +'DOMDocument::importNode' => ['DOMNode|false', 'importednode'=>'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::relaxNGValidate' => ['bool', 'filename'=>'string'], +'DOMDocument::relaxNGValidateSource' => ['bool', 'source'=>'string'], +'DOMDocument::save' => ['int|false', 'filename'=>'string', 'options='=>'int'], +'DOMDocument::saveHTML' => ['string|false', 'node='=>'?DOMNode'], +'DOMDocument::saveHTMLFile' => ['int|false', 'filename'=>'string'], +'DOMDocument::saveXML' => ['string|false', 'node='=>'?DOMNode', 'options='=>'int'], +'DOMDocument::schemaValidate' => ['bool', 'filename'=>'string', 'flags='=>'int'], +'DOMDocument::schemaValidateSource' => ['bool', 'source'=>'string', 'flags='=>'int'], +'DOMDocument::validate' => ['bool'], +'DOMDocument::xinclude' => ['int', 'options='=>'int'], +'DOMDocumentFragment::__construct' => ['void'], +'DOMDocumentFragment::appendXML' => ['bool', 'data'=>'string'], +'DomDocumentType::entities' => ['array'], +'DomDocumentType::internal_subset' => ['bool'], +'DomDocumentType::name' => ['string'], +'DomDocumentType::notations' => ['array'], +'DomDocumentType::public_id' => ['string'], +'DomDocumentType::system_id' => ['string'], +'DOMElement::__construct' => ['void', 'name'=>'string', 'value='=>'string', 'uri='=>'string'], +'DOMElement::get_attribute' => ['string', 'name'=>'string'], +'DOMElement::get_attribute_node' => ['DomAttribute', 'name'=>'string'], +'DOMElement::get_elements_by_tagname' => ['array', 'name'=>'string'], +'DOMElement::getAttribute' => ['string', 'name'=>'string'], +'DOMElement::getAttributeNode' => ['DOMAttr', 'name'=>'string'], +'DOMElement::getAttributeNodeNS' => ['DOMAttr', 'namespaceuri'=>'string', 'localname'=>'string'], +'DOMElement::getAttributeNS' => ['string', 'namespaceuri'=>'string', 'localname'=>'string'], +'DOMElement::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'], +'DOMElement::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string', 'localname'=>'string'], +'DOMElement::has_attribute' => ['bool', 'name'=>'string'], +'DOMElement::hasAttribute' => ['bool', 'name'=>'string'], +'DOMElement::hasAttributeNS' => ['bool', 'namespaceuri'=>'string', 'localname'=>'string'], +'DOMElement::remove_attribute' => ['bool', 'name'=>'string'], +'DOMElement::removeAttribute' => ['bool', 'name'=>'string'], +'DOMElement::removeAttributeNode' => ['bool', 'oldnode'=>'DOMAttr'], +'DOMElement::removeAttributeNS' => ['bool', 'namespaceuri'=>'string', 'localname'=>'string'], +'DOMElement::set_attribute' => ['DomAttribute', 'name'=>'string', 'value'=>'string'], +'DOMElement::set_attribute_node' => ['DomNode', 'attr'=>'DOMNode'], +'DOMElement::setAttribute' => ['DOMAttr|false', 'name'=>'string', 'value'=>'string'], +'DOMElement::setAttributeNode' => ['?DOMAttr', 'attr'=>'DOMAttr'], +'DOMElement::setAttributeNodeNS' => ['DOMAttr', 'attr'=>'DOMAttr'], +'DOMElement::setAttributeNS' => ['void', 'namespaceuri'=>'string', '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::tagname' => ['string'], +'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::hasFeature' => ['bool', 'feature'=>'string', 'version'=>'string'], +'DOMNamedNodeMap::count' => ['int'], +'DOMNamedNodeMap::getNamedItem' => ['?DOMNode', 'name'=>'string'], +'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespaceuri'=>'string', 'localname'=>'string'], +'DOMNamedNodeMap::item' => ['?DOMNode', 'index'=>'int'], +'DomNode::add_namespace' => ['bool', 'uri'=>'string', 'prefix'=>'string'], +'DomNode::append_child' => ['DOMNode', 'newnode'=>'DOMNode'], +'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::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::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], +'DOMNode::lookupNamespaceURI' => ['string', 'prefix'=>'string'], +'DOMNode::lookupPrefix' => ['string', 'namespaceuri'=>'string'], +'DOMNode::normalize' => ['void'], +'DOMNode::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], +'DOMNode::replaceChild' => ['DOMNode|false', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], +'DOMNodeList::count' => ['int'], +'DOMNodeList::item' => ['?DOMNode', 'index'=>'int'], +'DOMProcessingInstruction::__construct' => ['void', 'name'=>'string', 'value'=>'string'], +'DomProcessingInstruction::data' => ['string'], +'DomProcessingInstruction::target' => ['string'], +'DOMText::__construct' => ['void', 'value='=>'string'], +'DOMText::isElementContentWhitespace' => ['bool'], +'DOMText::isWhitespaceInElementContent' => ['bool'], +'DOMText::splitText' => ['DOMText', 'offset'=>'int'], +'domxml_new_doc' => ['DomDocument', 'version'=>'string'], +'domxml_open_file' => ['DomDocument', 'filename'=>'string', 'mode='=>'int', 'error='=>'array'], +'domxml_open_mem' => ['DomDocument', 'string'=>'string', 'mode='=>'int', 'error='=>'array'], +'domxml_version' => ['string'], +'domxml_xmltree' => ['DomDocument', 'string'=>'string'], +'domxml_xslt_stylesheet' => ['DomXsltStylesheet', 'xsl_buf'=>'string'], +'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'], +'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'], +'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'=>''], +'dotnet_load' => ['int', 'assembly_name'=>'string', 'datatype_name='=>'string', 'codepage='=>'int'], +'doubleval' => ['float', 'value'=>'mixed'], +'Ds\Collection::clear' => ['void'], +'Ds\Collection::copy' => ['Ds\Collection'], +'Ds\Collection::isEmpty' => ['bool'], +'Ds\Collection::toArray' => ['array'], +'Ds\Deque::__construct' => ['void', 'values='=>'mixed'], +'Ds\Deque::allocate' => ['void', 'capacity'=>'int'], +'Ds\Deque::apply' => ['void', 'callback'=>'callable'], +'Ds\Deque::capacity' => ['int'], +'Ds\Deque::clear' => ['void'], +'Ds\Deque::contains' => ['bool', '...values='=>'mixed'], +'Ds\Deque::copy' => ['Ds\Deque'], +'Ds\Deque::count' => ['int'], +'Ds\Deque::filter' => ['Ds\Deque', 'callback='=>'callable'], +'Ds\Deque::find' => ['mixed', 'value'=>'mixed'], +'Ds\Deque::first' => ['mixed'], +'Ds\Deque::get' => ['void', 'index'=>'int'], +'Ds\Deque::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], +'Ds\Deque::isEmpty' => ['bool'], +'Ds\Deque::join' => ['string', 'glue='=>'string'], +'Ds\Deque::jsonSerialize' => ['array'], +'Ds\Deque::last' => ['mixed'], +'Ds\Deque::map' => ['Ds\Deque', 'callback'=>'callable'], +'Ds\Deque::merge' => ['Ds\Deque', 'values'=>'mixed'], +'Ds\Deque::pop' => ['mixed'], +'Ds\Deque::push' => ['void', '...values='=>'mixed'], +'Ds\Deque::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], +'Ds\Deque::remove' => ['mixed', 'index'=>'int'], +'Ds\Deque::reverse' => ['void'], +'Ds\Deque::reversed' => ['Ds\Deque'], +'Ds\Deque::rotate' => ['void', 'rotations'=>'int'], +'Ds\Deque::set' => ['void', 'index'=>'int', 'value'=>'mixed'], +'Ds\Deque::shift' => ['mixed'], +'Ds\Deque::slice' => ['Ds\Deque', 'index'=>'int', 'length='=>'?int'], +'Ds\Deque::sort' => ['void', 'comparator='=>'callable'], +'Ds\Deque::sorted' => ['Ds\Deque', 'comparator='=>'callable'], +'Ds\Deque::sum' => ['int|float'], +'Ds\Deque::toArray' => ['array'], +'Ds\Deque::unshift' => ['void', '...values='=>'mixed'], +'Ds\Hashable::equals' => ['bool', 'object'=>'mixed'], +'Ds\Hashable::hash' => ['mixed'], +'Ds\Map::__construct' => ['void', 'values='=>'mixed'], +'Ds\Map::allocate' => ['void', 'capacity'=>'int'], +'Ds\Map::apply' => ['void', 'callback'=>'callable'], +'Ds\Map::capacity' => ['int'], +'Ds\Map::clear' => ['void'], +'Ds\Map::copy' => ['Ds\Map'], +'Ds\Map::count' => ['int'], +'Ds\Map::diff' => ['Ds\Map', 'map'=>'Ds\Map'], +'Ds\Map::filter' => ['Ds\Map', 'callback='=>'callable'], +'Ds\Map::first' => ['Ds\Pair'], +'Ds\Map::get' => ['mixed', 'key'=>'mixed', 'default='=>'mixed'], +'Ds\Map::hasKey' => ['bool', 'key'=>'mixed'], +'Ds\Map::hasValue' => ['bool', 'value'=>'mixed'], +'Ds\Map::intersect' => ['Ds\Map', 'map'=>'Ds\Map'], +'Ds\Map::isEmpty' => ['bool'], +'Ds\Map::jsonSerialize' => ['array'], +'Ds\Map::keys' => ['Ds\Set'], +'Ds\Map::ksort' => ['void', 'comparator='=>'callable'], +'Ds\Map::ksorted' => ['Ds\Map', 'comparator='=>'callable'], +'Ds\Map::last' => ['Ds\Pair'], +'Ds\Map::map' => ['Ds\Map', 'callback'=>'callable'], +'Ds\Map::merge' => ['Ds\Map', 'values'=>'mixed'], +'Ds\Map::pairs' => ['Ds\Sequence'], +'Ds\Map::put' => ['void', 'key'=>'mixed', 'value'=>'mixed'], +'Ds\Map::putAll' => ['void', 'values'=>'mixed'], +'Ds\Map::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], +'Ds\Map::remove' => ['mixed', 'key'=>'mixed', 'default='=>'mixed'], +'Ds\Map::reverse' => ['void'], +'Ds\Map::reversed' => ['Ds\Map'], +'Ds\Map::skip' => ['Ds\Pair', 'position'=>'int'], +'Ds\Map::slice' => ['Ds\Map', 'index'=>'int', 'length='=>'?int'], +'Ds\Map::sort' => ['void', 'comparator='=>'callable'], +'Ds\Map::sorted' => ['Ds\Map', 'comparator='=>'callable'], +'Ds\Map::sum' => ['int|float'], +'Ds\Map::toArray' => ['array'], +'Ds\Map::union' => ['Ds\Map', 'map'=>'Ds\Map'], +'Ds\Map::values' => ['Ds\Sequence'], +'Ds\Map::xor' => ['Ds\Map', 'map'=>'Ds\Map'], +'Ds\Pair::__construct' => ['void', 'key='=>'mixed', 'value='=>'mixed'], +'Ds\Pair::clear' => ['void'], +'Ds\Pair::copy' => ['Ds\Pair'], +'Ds\Pair::isEmpty' => ['bool'], +'Ds\Pair::jsonSerialize' => ['array'], +'Ds\Pair::toArray' => ['array'], +'Ds\PriorityQueue::__construct' => ['void'], +'Ds\PriorityQueue::allocate' => ['void', 'capacity'=>'int'], +'Ds\PriorityQueue::capacity' => ['int'], +'Ds\PriorityQueue::clear' => ['void'], +'Ds\PriorityQueue::copy' => ['Ds\PriorityQueue'], +'Ds\PriorityQueue::count' => ['int'], +'Ds\PriorityQueue::isEmpty' => ['bool'], +'Ds\PriorityQueue::jsonSerialize' => ['array'], +'Ds\PriorityQueue::peek' => ['mixed'], +'Ds\PriorityQueue::pop' => ['mixed'], +'Ds\PriorityQueue::push' => ['void', 'value'=>'mixed', 'priority'=>'int'], +'Ds\PriorityQueue::toArray' => ['array'], +'Ds\Queue::__construct' => ['void', 'values='=>'mixed'], +'Ds\Queue::allocate' => ['void', 'capacity'=>'int'], +'Ds\Queue::capacity' => ['int'], +'Ds\Queue::clear' => ['void'], +'Ds\Queue::copy' => ['Ds\Queue'], +'Ds\Queue::count' => ['int'], +'Ds\Queue::isEmpty' => ['bool'], +'Ds\Queue::jsonSerialize' => ['array'], +'Ds\Queue::peek' => ['mixed'], +'Ds\Queue::pop' => ['mixed'], +'Ds\Queue::push' => ['void', '...values='=>'mixed'], +'Ds\Queue::toArray' => ['array'], +'Ds\Sequence::allocate' => ['void', 'capacity'=>'int'], +'Ds\Sequence::apply' => ['void', 'callback'=>'callable'], +'Ds\Sequence::capacity' => ['int'], +'Ds\Sequence::contains' => ['bool', '...values='=>'mixed'], +'Ds\Sequence::filter' => ['Ds\Sequence', 'callback='=>'callable'], +'Ds\Sequence::find' => ['mixed', 'value'=>'mixed'], +'Ds\Sequence::first' => ['mixed'], +'Ds\Sequence::get' => ['mixed', 'index'=>'int'], +'Ds\Sequence::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], +'Ds\Sequence::join' => ['string', 'glue='=>'string'], +'Ds\Sequence::last' => ['void'], +'Ds\Sequence::map' => ['Ds\Sequence', 'callback'=>'callable'], +'Ds\Sequence::merge' => ['Ds\Sequence', 'values'=>'mixed'], +'Ds\Sequence::pop' => ['mixed'], +'Ds\Sequence::push' => ['void', '...values='=>'mixed'], +'Ds\Sequence::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], +'Ds\Sequence::remove' => ['mixed', 'index'=>'int'], +'Ds\Sequence::reverse' => ['void'], +'Ds\Sequence::reversed' => ['Ds\Sequence'], +'Ds\Sequence::rotate' => ['void', 'rotations'=>'int'], +'Ds\Sequence::set' => ['void', 'index'=>'int', 'value'=>'mixed'], +'Ds\Sequence::shift' => ['mixed'], +'Ds\Sequence::slice' => ['Ds\Sequence', 'index'=>'int', 'length='=>'?int'], +'Ds\Sequence::sort' => ['void', 'comparator='=>'callable'], +'Ds\Sequence::sorted' => ['Ds\Sequence', 'comparator='=>'callable'], +'Ds\Sequence::sum' => ['int|float'], +'Ds\Sequence::unshift' => ['void', '...values='=>'mixed'], +'Ds\Set::__construct' => ['void', 'values='=>'mixed'], +'Ds\Set::add' => ['void', '...values='=>'mixed'], +'Ds\Set::allocate' => ['void', 'capacity'=>'int'], +'Ds\Set::capacity' => ['int'], +'Ds\Set::clear' => ['void'], +'Ds\Set::contains' => ['bool', '...values='=>'mixed'], +'Ds\Set::copy' => ['Ds\Set'], +'Ds\Set::count' => ['int'], +'Ds\Set::diff' => ['Ds\Set', 'set'=>'Ds\Set'], +'Ds\Set::filter' => ['Ds\Set', 'callback='=>'callable'], +'Ds\Set::first' => ['mixed'], +'Ds\Set::get' => ['mixed', 'index'=>'int'], +'Ds\Set::intersect' => ['Ds\Set', 'set'=>'Ds\Set'], +'Ds\Set::isEmpty' => ['bool'], +'Ds\Set::join' => ['string', 'glue='=>'string'], +'Ds\Set::jsonSerialize' => ['array'], +'Ds\Set::last' => ['mixed'], +'Ds\Set::merge' => ['Ds\Set', 'values'=>'mixed'], +'Ds\Set::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], +'Ds\Set::remove' => ['void', '...values='=>'mixed'], +'Ds\Set::reverse' => ['void'], +'Ds\Set::reversed' => ['Ds\Set'], +'Ds\Set::slice' => ['Ds\Set', 'index'=>'int', 'length='=>'?int'], +'Ds\Set::sort' => ['void', 'comparator='=>'callable'], +'Ds\Set::sorted' => ['Ds\Set', 'comparator='=>'callable'], +'Ds\Set::sum' => ['int|float'], +'Ds\Set::toArray' => ['array'], +'Ds\Set::union' => ['Ds\Set', 'set'=>'Ds\Set'], +'Ds\Set::xor' => ['Ds\Set', 'set'=>'Ds\Set'], +'Ds\Stack::__construct' => ['void', 'values='=>'mixed'], +'Ds\Stack::allocate' => ['void', 'capacity'=>'int'], +'Ds\Stack::capacity' => ['int'], +'Ds\Stack::clear' => ['void'], +'Ds\Stack::copy' => ['Ds\Stack'], +'Ds\Stack::count' => ['int'], +'Ds\Stack::isEmpty' => ['bool'], +'Ds\Stack::jsonSerialize' => ['array'], +'Ds\Stack::peek' => ['mixed'], +'Ds\Stack::pop' => ['mixed'], +'Ds\Stack::push' => ['void', '...values='=>'mixed'], +'Ds\Stack::toArray' => ['array'], +'Ds\Vector::__construct' => ['void', 'values='=>'mixed'], +'Ds\Vector::allocate' => ['void', 'capacity'=>'int'], +'Ds\Vector::apply' => ['void', 'callback'=>'callable'], +'Ds\Vector::capacity' => ['int'], +'Ds\Vector::clear' => ['void'], +'Ds\Vector::contains' => ['bool', '...values='=>'mixed'], +'Ds\Vector::copy' => ['Ds\Vector'], +'Ds\Vector::count' => ['int'], +'Ds\Vector::filter' => ['Ds\Vector', 'callback='=>'callable'], +'Ds\Vector::find' => ['mixed', 'value'=>'mixed'], +'Ds\Vector::first' => ['mixed'], +'Ds\Vector::get' => ['mixed', 'index'=>'int'], +'Ds\Vector::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], +'Ds\Vector::isEmpty' => ['bool'], +'Ds\Vector::join' => ['string', 'glue='=>'string'], +'Ds\Vector::jsonSerialize' => ['array'], +'Ds\Vector::last' => ['mixed'], +'Ds\Vector::map' => ['Ds\Vector', 'callback'=>'callable'], +'Ds\Vector::merge' => ['Ds\Vector', 'values'=>'mixed'], +'Ds\Vector::pop' => ['mixed'], +'Ds\Vector::push' => ['void', '...values='=>'mixed'], +'Ds\Vector::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], +'Ds\Vector::remove' => ['mixed', 'index'=>'int'], +'Ds\Vector::reverse' => ['void'], +'Ds\Vector::reversed' => ['Ds\Vector'], +'Ds\Vector::rotate' => ['void', 'rotations'=>'int'], +'Ds\Vector::set' => ['void', 'index'=>'int', 'value'=>'mixed'], +'Ds\Vector::shift' => ['mixed'], +'Ds\Vector::slice' => ['Ds\Vector', 'index'=>'int', 'length='=>'?int'], +'Ds\Vector::sort' => ['void', 'comparator='=>'callable'], +'Ds\Vector::sorted' => ['Ds\Vector', 'comparator='=>'callable'], +'Ds\Vector::sum' => ['int|float'], +'Ds\Vector::toArray' => ['array'], +'Ds\Vector::unshift' => ['void', '...values='=>'mixed'], +'easter_date' => ['int', 'year='=>'int'], +'easter_days' => ['int', 'year='=>'int', 'mode='=>'int'], +'echo' => ['void', 'arg1'=>'string', '...args='=>'string'], +'eio_busy' => ['resource', 'delay'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_cancel' => ['void', 'req'=>'resource'], +'eio_chmod' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_chown' => ['resource', 'path'=>'string', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_close' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_custom' => ['resource', 'execute'=>'callable', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], +'eio_dup2' => ['resource', 'fd'=>'mixed', 'fd2'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_event_loop' => ['bool'], +'eio_fallocate' => ['resource', 'fd'=>'mixed', 'mode'=>'int', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_fchmod' => ['resource', 'fd'=>'mixed', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_fchown' => ['resource', 'fd'=>'mixed', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_fdatasync' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_fstat' => ['resource', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], +'eio_fstatvfs' => ['resource', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], +'eio_fsync' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_ftruncate' => ['resource', 'fd'=>'mixed', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_futime' => ['resource', 'fd'=>'mixed', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_get_event_stream' => ['mixed'], +'eio_get_last_error' => ['string', 'req'=>'resource'], +'eio_grp' => ['resource', 'callback'=>'callable', 'data='=>'string'], +'eio_grp_add' => ['void', 'grp'=>'resource', 'req'=>'resource'], +'eio_grp_cancel' => ['void', 'grp'=>'resource'], +'eio_grp_limit' => ['void', 'grp'=>'resource', 'limit'=>'int'], +'eio_init' => ['void'], +'eio_link' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_lstat' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], +'eio_mkdir' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_mknod' => ['resource', 'path'=>'string', 'mode'=>'int', 'dev'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_nop' => ['resource', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_npending' => ['int'], +'eio_nready' => ['int'], +'eio_nreqs' => ['int'], +'eio_nthreads' => ['int'], +'eio_open' => ['resource', 'path'=>'string', 'flags'=>'int', 'mode'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], +'eio_poll' => ['int'], +'eio_read' => ['resource', 'fd'=>'mixed', 'length'=>'int', 'offset'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], +'eio_readahead' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_readdir' => ['resource', 'path'=>'string', 'flags'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], +'eio_readlink' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], +'eio_realpath' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], +'eio_rename' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_rmdir' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_seek' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'whence'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_sendfile' => ['resource', 'out_fd'=>'mixed', 'in_fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'string'], +'eio_set_max_idle' => ['void', 'nthreads'=>'int'], +'eio_set_max_parallel' => ['void', 'nthreads'=>'int'], +'eio_set_max_poll_reqs' => ['void', 'nreqs'=>'int'], +'eio_set_max_poll_time' => ['void', 'nseconds'=>'float'], +'eio_set_min_parallel' => ['void', 'nthreads'=>'string'], +'eio_stat' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], +'eio_statvfs' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], +'eio_symlink' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_sync' => ['resource', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_sync_file_range' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'nbytes'=>'int', 'flags'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_syncfs' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_truncate' => ['resource', 'path'=>'string', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_unlink' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_utime' => ['resource', 'path'=>'string', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'eio_write' => ['resource', 'fd'=>'mixed', 'string'=>'string', 'length='=>'int', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], +'empty' => ['bool', 'value'=>'mixed'], +'EmptyIterator::current' => ['mixed'], +'EmptyIterator::key' => ['mixed'], +'EmptyIterator::next' => ['void'], +'EmptyIterator::rewind' => ['void'], +'EmptyIterator::valid' => ['bool'], +'enchant_broker_describe' => ['array', 'broker'=>'resource'], +'enchant_broker_dict_exists' => ['bool', 'broker'=>'resource', 'tag'=>'string'], +'enchant_broker_free' => ['bool', 'broker'=>'resource'], +'enchant_broker_free_dict' => ['bool', 'dictionary'=>'resource'], +'enchant_broker_get_dict_path' => ['string', 'broker'=>'resource', 'type'=>'int'], +'enchant_broker_get_error' => ['string|false', 'broker'=>'resource'], +'enchant_broker_init' => ['resource|false'], +'enchant_broker_list_dicts' => ['array|false', 'broker'=>'resource'], +'enchant_broker_request_dict' => ['resource|false', 'broker'=>'resource', 'tag'=>'string'], +'enchant_broker_request_pwl_dict' => ['resource|false', 'broker'=>'resource', 'filename'=>'string'], +'enchant_broker_set_dict_path' => ['bool', 'broker'=>'resource', 'type'=>'int', 'path'=>'string'], +'enchant_broker_set_ordering' => ['bool', 'broker'=>'resource', 'tag'=>'string', 'ordering'=>'string'], +'enchant_dict_add_to_personal' => ['void', 'dictionary'=>'resource', 'word'=>'string'], +'enchant_dict_add_to_session' => ['void', 'dictionary'=>'resource', 'word'=>'string'], +'enchant_dict_check' => ['bool', 'dictionary'=>'resource', 'word'=>'string'], +'enchant_dict_describe' => ['array', 'dictionary'=>'resource'], +'enchant_dict_get_error' => ['string', 'dictionary'=>'resource'], +'enchant_dict_is_in_session' => ['bool', 'dictionary'=>'resource', 'word'=>'string'], +'enchant_dict_quick_check' => ['bool', 'dictionary'=>'resource', 'word'=>'string', '&w_suggestions='=>'array'], +'enchant_dict_store_replacement' => ['void', 'dictionary'=>'resource', 'misspelled'=>'string', 'correct'=>'string'], +'enchant_dict_suggest' => ['array', 'dictionary'=>'resource', 'word'=>'string'], +'end' => ['mixed|false', '&r_array'=>'array|object'], +'enum_exists' => ['bool', 'enum' => 'class-string', 'autoload=' => 'bool'], +'Error::__clone' => ['void'], +'Error::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], +'Error::__toString' => ['string'], +'Error::getCode' => ['int'], +'Error::getFile' => ['string'], +'Error::getLine' => ['int'], +'Error::getMessage' => ['string'], +'Error::getPrevious' => ['Throwable|Error|null'], +'Error::getTrace' => ['list\',args?:array}>'], +'Error::getTraceAsString' => ['string'], +'error_clear_last' => ['void'], +'error_get_last' => ['?array{type:int,message:string,file:string,line:int}'], +'error_log' => ['bool', 'message'=>'string', 'message_type='=>'int', 'destination='=>'string', 'additional_headers='=>'string'], +'error_reporting' => ['int', 'error_level='=>'int'], +'ErrorException::__clone' => ['void'], +'ErrorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'severity='=>'int', 'filename='=>'string', 'line='=>'int', 'previous='=>'?Throwable|?ErrorException'], +'ErrorException::__toString' => ['string'], +'ErrorException::getCode' => ['int'], +'ErrorException::getFile' => ['string'], +'ErrorException::getLine' => ['int'], +'ErrorException::getMessage' => ['string'], +'ErrorException::getPrevious' => ['Throwable|ErrorException|null'], +'ErrorException::getSeverity' => ['int'], +'ErrorException::getTrace' => ['list\',args?:array}>'], +'ErrorException::getTraceAsString' => ['string'], +'escapeshellarg' => ['string', 'arg'=>'string'], +'escapeshellcmd' => ['string', 'command'=>'string'], +'Ev::backend' => ['int'], +'Ev::depth' => ['int'], +'Ev::embeddableBackends' => ['int'], +'Ev::feedSignal' => ['void', 'signum'=>'int'], +'Ev::feedSignalEvent' => ['void', 'signum'=>'int'], +'Ev::iteration' => ['int'], +'Ev::now' => ['float'], +'Ev::nowUpdate' => ['void'], +'Ev::recommendedBackends' => ['int'], +'Ev::resume' => ['void'], +'Ev::run' => ['void', 'flags='=>'int'], +'Ev::sleep' => ['void', 'seconds'=>'float'], +'Ev::stop' => ['void', 'how='=>'int'], +'Ev::supportedBackends' => ['int'], +'Ev::suspend' => ['void'], +'Ev::time' => ['float'], +'Ev::verify' => ['void'], +'eval' => ['mixed', 'code_str'=>'string'], +'EvCheck::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvCheck::clear' => ['int'], +'EvCheck::createStopped' => ['EvCheck', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvCheck::feed' => ['void', 'events'=>'int'], +'EvCheck::getLoop' => ['EvLoop'], +'EvCheck::invoke' => ['void', 'events'=>'int'], +'EvCheck::keepAlive' => ['void', 'value'=>'bool'], +'EvCheck::setCallback' => ['void', 'callback'=>'callable'], +'EvCheck::start' => ['void'], +'EvCheck::stop' => ['void'], +'EvChild::__construct' => ['void', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvChild::clear' => ['int'], +'EvChild::createStopped' => ['EvChild', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvChild::feed' => ['void', 'events'=>'int'], +'EvChild::getLoop' => ['EvLoop'], +'EvChild::invoke' => ['void', 'events'=>'int'], +'EvChild::keepAlive' => ['void', 'value'=>'bool'], +'EvChild::set' => ['void', 'pid'=>'int', 'trace'=>'bool'], +'EvChild::setCallback' => ['void', 'callback'=>'callable'], +'EvChild::start' => ['void'], +'EvChild::stop' => ['void'], +'EvEmbed::__construct' => ['void', 'other'=>'object', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvEmbed::clear' => ['int'], +'EvEmbed::createStopped' => ['EvEmbed', 'other'=>'object', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvEmbed::feed' => ['void', 'events'=>'int'], +'EvEmbed::getLoop' => ['EvLoop'], +'EvEmbed::invoke' => ['void', 'events'=>'int'], +'EvEmbed::keepAlive' => ['void', 'value'=>'bool'], +'EvEmbed::set' => ['void', 'other'=>'object'], +'EvEmbed::setCallback' => ['void', 'callback'=>'callable'], +'EvEmbed::start' => ['void'], +'EvEmbed::stop' => ['void'], +'EvEmbed::sweep' => ['void'], +'Event::__construct' => ['void', 'base'=>'EventBase', 'fd'=>'mixed', 'what'=>'int', 'cb'=>'callable', 'arg='=>'mixed'], +'Event::add' => ['bool', 'timeout='=>'float'], +'Event::addSignal' => ['bool', 'timeout='=>'float'], +'Event::addTimer' => ['bool', 'timeout='=>'float'], +'Event::del' => ['bool'], +'Event::delSignal' => ['bool'], +'Event::delTimer' => ['bool'], +'Event::free' => ['void'], +'Event::getSupportedMethods' => ['array'], +'Event::pending' => ['bool', 'flags'=>'int'], +'Event::set' => ['bool', 'base'=>'EventBase', 'fd'=>'mixed', 'what='=>'int', 'cb='=>'callable', 'arg='=>'mixed'], +'Event::setPriority' => ['bool', 'priority'=>'int'], +'Event::setTimer' => ['bool', 'base'=>'EventBase', 'cb'=>'callable', 'arg='=>'mixed'], +'Event::signal' => ['Event', 'base'=>'EventBase', 'signum'=>'int', 'cb'=>'callable', 'arg='=>'mixed'], +'Event::timer' => ['Event', 'base'=>'EventBase', 'cb'=>'callable', 'arg='=>'mixed'], +'event_add' => ['bool', 'event'=>'resource', 'timeout='=>'int'], +'event_base_free' => ['void', 'event_base'=>'resource'], +'event_base_loop' => ['int', 'event_base'=>'resource', 'flags='=>'int'], +'event_base_loopbreak' => ['bool', 'event_base'=>'resource'], +'event_base_loopexit' => ['bool', 'event_base'=>'resource', 'timeout='=>'int'], +'event_base_new' => ['resource|false'], +'event_base_priority_init' => ['bool', 'event_base'=>'resource', 'npriorities'=>'int'], +'event_base_reinit' => ['bool', 'event_base'=>'resource'], +'event_base_set' => ['bool', 'event'=>'resource', 'event_base'=>'resource'], +'event_buffer_base_set' => ['bool', 'bevent'=>'resource', 'event_base'=>'resource'], +'event_buffer_disable' => ['bool', 'bevent'=>'resource', 'events'=>'int'], +'event_buffer_enable' => ['bool', 'bevent'=>'resource', 'events'=>'int'], +'event_buffer_fd_set' => ['void', 'bevent'=>'resource', 'fd'=>'resource'], +'event_buffer_free' => ['void', 'bevent'=>'resource'], +'event_buffer_new' => ['resource|false', 'stream'=>'resource', 'readcb'=>'callable|null', 'writecb'=>'callable|null', 'errorcb'=>'callable', 'arg='=>'mixed'], +'event_buffer_priority_set' => ['bool', 'bevent'=>'resource', 'priority'=>'int'], +'event_buffer_read' => ['string', 'bevent'=>'resource', 'data_size'=>'int'], +'event_buffer_set_callback' => ['bool', 'event'=>'resource', 'readcb'=>'mixed', 'writecb'=>'mixed', 'errorcb'=>'mixed', 'arg='=>'mixed'], +'event_buffer_timeout_set' => ['void', 'bevent'=>'resource', 'read_timeout'=>'int', 'write_timeout'=>'int'], +'event_buffer_watermark_set' => ['void', 'bevent'=>'resource', 'events'=>'int', 'lowmark'=>'int', 'highmark'=>'int'], +'event_buffer_write' => ['bool', 'bevent'=>'resource', 'data'=>'string', 'data_size='=>'int'], +'event_del' => ['bool', 'event'=>'resource'], +'event_free' => ['void', 'event'=>'resource'], +'event_new' => ['resource|false'], +'event_priority_set' => ['bool', 'event'=>'resource', 'priority'=>'int'], +'event_set' => ['bool', 'event'=>'resource', 'fd'=>'int|resource', 'events'=>'int', 'callback'=>'callable', 'arg='=>'mixed'], +'event_timer_add' => ['bool', 'event'=>'resource', 'timeout='=>'int'], +'event_timer_del' => ['bool', 'event'=>'resource'], +'event_timer_new' => ['resource|false'], +'event_timer_pending' => ['bool', 'event'=>'resource', 'timeout='=>'int'], +'event_timer_set' => ['bool', 'event'=>'resource', 'callback'=>'callable', 'arg='=>'mixed'], +'EventBase::__construct' => ['void', 'cfg='=>'EventConfig'], +'EventBase::dispatch' => ['void'], +'EventBase::exit' => ['bool', 'timeout='=>'float'], +'EventBase::free' => ['void'], +'EventBase::getFeatures' => ['int'], +'EventBase::getMethod' => ['string', 'cfg='=>'EventConfig'], +'EventBase::getTimeOfDayCached' => ['float'], +'EventBase::gotExit' => ['bool'], +'EventBase::gotStop' => ['bool'], +'EventBase::loop' => ['bool', 'flags='=>'int'], +'EventBase::priorityInit' => ['bool', 'n_priorities'=>'int'], +'EventBase::reInit' => ['bool'], +'EventBase::stop' => ['bool'], +'EventBuffer::__construct' => ['void'], +'EventBuffer::add' => ['bool', 'data'=>'string'], +'EventBuffer::addBuffer' => ['bool', 'buf'=>'EventBuffer'], +'EventBuffer::appendFrom' => ['int', 'buf'=>'EventBuffer', 'length'=>'int'], +'EventBuffer::copyout' => ['int', '&w_data'=>'string', 'max_bytes'=>'int'], +'EventBuffer::drain' => ['bool', 'length'=>'int'], +'EventBuffer::enableLocking' => ['void'], +'EventBuffer::expand' => ['bool', 'length'=>'int'], +'EventBuffer::freeze' => ['bool', 'at_front'=>'bool'], +'EventBuffer::lock' => ['void'], +'EventBuffer::prepend' => ['bool', 'data'=>'string'], +'EventBuffer::prependBuffer' => ['bool', 'buf'=>'EventBuffer'], +'EventBuffer::pullup' => ['string', 'size'=>'int'], +'EventBuffer::read' => ['string', 'max_bytes'=>'int'], +'EventBuffer::readFrom' => ['int', 'fd'=>'mixed', 'howmuch'=>'int'], +'EventBuffer::readLine' => ['string', 'eol_style'=>'int'], +'EventBuffer::search' => ['mixed', 'what'=>'string', 'start='=>'int', 'end='=>'int'], +'EventBuffer::searchEol' => ['mixed', 'start='=>'int', 'eol_style='=>'int'], +'EventBuffer::substr' => ['string', 'start'=>'int', 'length='=>'int'], +'EventBuffer::unfreeze' => ['bool', 'at_front'=>'bool'], +'EventBuffer::unlock' => ['bool'], +'EventBuffer::write' => ['int', 'fd'=>'mixed', 'howmuch='=>'int'], +'EventBufferEvent::__construct' => ['void', 'base'=>'EventBase', 'socket='=>'mixed', 'options='=>'int', 'readcb='=>'callable', 'writecb='=>'callable', 'eventcb='=>'callable'], +'EventBufferEvent::close' => ['void'], +'EventBufferEvent::connect' => ['bool', 'addr'=>'string'], +'EventBufferEvent::connectHost' => ['bool', 'dns_base'=>'EventDnsBase', 'hostname'=>'string', 'port'=>'int', 'family='=>'int'], +'EventBufferEvent::createPair' => ['array', 'base'=>'EventBase', 'options='=>'int'], +'EventBufferEvent::disable' => ['bool', 'events'=>'int'], +'EventBufferEvent::enable' => ['bool', 'events'=>'int'], +'EventBufferEvent::free' => ['void'], +'EventBufferEvent::getDnsErrorString' => ['string'], +'EventBufferEvent::getEnabled' => ['int'], +'EventBufferEvent::getInput' => ['EventBuffer'], +'EventBufferEvent::getOutput' => ['EventBuffer'], +'EventBufferEvent::read' => ['string', 'size'=>'int'], +'EventBufferEvent::readBuffer' => ['bool', 'buf'=>'EventBuffer'], +'EventBufferEvent::setCallbacks' => ['void', 'readcb'=>'callable', 'writecb'=>'callable', 'eventcb'=>'callable', 'arg='=>'string'], +'EventBufferEvent::setPriority' => ['bool', 'priority'=>'int'], +'EventBufferEvent::setTimeouts' => ['bool', 'timeout_read'=>'float', 'timeout_write'=>'float'], +'EventBufferEvent::setWatermark' => ['void', 'events'=>'int', 'lowmark'=>'int', 'highmark'=>'int'], +'EventBufferEvent::sslError' => ['string'], +'EventBufferEvent::sslFilter' => ['EventBufferEvent', 'base'=>'EventBase', 'underlying'=>'EventBufferEvent', 'ctx'=>'EventSslContext', 'state'=>'int', 'options='=>'int'], +'EventBufferEvent::sslGetCipherInfo' => ['string'], +'EventBufferEvent::sslGetCipherName' => ['string'], +'EventBufferEvent::sslGetCipherVersion' => ['string'], +'EventBufferEvent::sslGetProtocol' => ['string'], +'EventBufferEvent::sslRenegotiate' => ['void'], +'EventBufferEvent::sslSocket' => ['EventBufferEvent', 'base'=>'EventBase', 'socket'=>'mixed', 'ctx'=>'EventSslContext', 'state'=>'int', 'options='=>'int'], +'EventBufferEvent::write' => ['bool', 'data'=>'string'], +'EventBufferEvent::writeBuffer' => ['bool', 'buf'=>'EventBuffer'], +'EventConfig::__construct' => ['void'], +'EventConfig::avoidMethod' => ['bool', 'method'=>'string'], +'EventConfig::requireFeatures' => ['bool', 'feature'=>'int'], +'EventConfig::setMaxDispatchInterval' => ['void', 'max_interval'=>'int', 'max_callbacks'=>'int', 'min_priority'=>'int'], +'EventDnsBase::__construct' => ['void', 'base'=>'EventBase', 'initialize'=>'bool'], +'EventDnsBase::addNameserverIp' => ['bool', 'ip'=>'string'], +'EventDnsBase::addSearch' => ['void', 'domain'=>'string'], +'EventDnsBase::clearSearch' => ['void'], +'EventDnsBase::countNameservers' => ['int'], +'EventDnsBase::loadHosts' => ['bool', 'hosts'=>'string'], +'EventDnsBase::parseResolvConf' => ['bool', 'flags'=>'int', 'filename'=>'string'], +'EventDnsBase::setOption' => ['bool', 'option'=>'string', 'value'=>'string'], +'EventDnsBase::setSearchNdots' => ['bool', 'ndots'=>'int'], +'EventHttp::__construct' => ['void', 'base'=>'EventBase', 'ctx='=>'EventSslContext'], +'EventHttp::accept' => ['bool', 'socket'=>'mixed'], +'EventHttp::addServerAlias' => ['bool', 'alias'=>'string'], +'EventHttp::bind' => ['void', 'address'=>'string', 'port'=>'int'], +'EventHttp::removeServerAlias' => ['bool', 'alias'=>'string'], +'EventHttp::setAllowedMethods' => ['void', 'methods'=>'int'], +'EventHttp::setCallback' => ['void', 'path'=>'string', 'cb'=>'string', 'arg='=>'string'], +'EventHttp::setDefaultCallback' => ['void', 'cb'=>'string', 'arg='=>'string'], +'EventHttp::setMaxBodySize' => ['void', 'value'=>'int'], +'EventHttp::setMaxHeadersSize' => ['void', 'value'=>'int'], +'EventHttp::setTimeout' => ['void', 'value'=>'int'], +'EventHttpConnection::__construct' => ['void', 'base'=>'EventBase', 'dns_base'=>'EventDnsBase', 'address'=>'string', 'port'=>'int', 'ctx='=>'EventSslContext'], +'EventHttpConnection::getBase' => ['EventBase'], +'EventHttpConnection::getPeer' => ['void', '&w_address'=>'string', '&w_port'=>'int'], +'EventHttpConnection::makeRequest' => ['bool', 'req'=>'EventHttpRequest', 'type'=>'int', 'uri'=>'string'], +'EventHttpConnection::setCloseCallback' => ['void', 'callback'=>'callable', 'data='=>'mixed'], +'EventHttpConnection::setLocalAddress' => ['void', 'address'=>'string'], +'EventHttpConnection::setLocalPort' => ['void', 'port'=>'int'], +'EventHttpConnection::setMaxBodySize' => ['void', 'max_size'=>'string'], +'EventHttpConnection::setMaxHeadersSize' => ['void', 'max_size'=>'string'], +'EventHttpConnection::setRetries' => ['void', 'retries'=>'int'], +'EventHttpConnection::setTimeout' => ['void', 'timeout'=>'int'], +'EventHttpRequest::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed'], +'EventHttpRequest::addHeader' => ['bool', 'key'=>'string', 'value'=>'string', 'type'=>'int'], +'EventHttpRequest::cancel' => ['void'], +'EventHttpRequest::clearHeaders' => ['void'], +'EventHttpRequest::closeConnection' => ['void'], +'EventHttpRequest::findHeader' => ['void', 'key'=>'string', 'type'=>'string'], +'EventHttpRequest::free' => ['void'], +'EventHttpRequest::getBufferEvent' => ['EventBufferEvent'], +'EventHttpRequest::getCommand' => ['void'], +'EventHttpRequest::getConnection' => ['EventHttpConnection'], +'EventHttpRequest::getHost' => ['string'], +'EventHttpRequest::getInputBuffer' => ['EventBuffer'], +'EventHttpRequest::getInputHeaders' => ['array'], +'EventHttpRequest::getOutputBuffer' => ['EventBuffer'], +'EventHttpRequest::getOutputHeaders' => ['void'], +'EventHttpRequest::getResponseCode' => ['int'], +'EventHttpRequest::getUri' => ['string'], +'EventHttpRequest::removeHeader' => ['void', 'key'=>'string', 'type'=>'string'], +'EventHttpRequest::sendError' => ['void', 'error'=>'int', 'reason='=>'string'], +'EventHttpRequest::sendReply' => ['void', 'code'=>'int', 'reason'=>'string', 'buf='=>'EventBuffer'], +'EventHttpRequest::sendReplyChunk' => ['void', 'buf'=>'EventBuffer'], +'EventHttpRequest::sendReplyEnd' => ['void'], +'EventHttpRequest::sendReplyStart' => ['void', 'code'=>'int', 'reason'=>'string'], +'EventListener::__construct' => ['void', 'base'=>'EventBase', 'cb'=>'callable', 'data'=>'mixed', 'flags'=>'int', 'backlog'=>'int', 'target'=>'mixed'], +'EventListener::disable' => ['bool'], +'EventListener::enable' => ['bool'], +'EventListener::getBase' => ['void'], +'EventListener::getSocketName' => ['bool', '&w_address'=>'string', '&w_port='=>'mixed'], +'EventListener::setCallback' => ['void', 'cb'=>'callable', 'arg='=>'mixed'], +'EventListener::setErrorCallback' => ['void', 'cb'=>'string'], +'EventSslContext::__construct' => ['void', 'method'=>'string', 'options'=>'string'], +'EventUtil::__construct' => ['void'], +'EventUtil::getLastSocketErrno' => ['int', 'socket='=>'mixed'], +'EventUtil::getLastSocketError' => ['string', 'socket='=>'mixed'], +'EventUtil::getSocketFd' => ['int', 'socket'=>'mixed'], +'EventUtil::getSocketName' => ['bool', 'socket'=>'mixed', '&w_address'=>'string', '&w_port='=>'mixed'], +'EventUtil::setSocketOption' => ['bool', 'socket'=>'mixed', 'level'=>'int', 'optname'=>'int', 'optval'=>'mixed'], +'EventUtil::sslRandPoll' => ['void'], +'EvFork::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvFork::clear' => ['int'], +'EvFork::createStopped' => ['EvFork', 'callback'=>'callable', 'data='=>'string', 'priority='=>'string'], +'EvFork::feed' => ['void', 'events'=>'int'], +'EvFork::getLoop' => ['EvLoop'], +'EvFork::invoke' => ['void', 'events'=>'int'], +'EvFork::keepAlive' => ['void', 'value'=>'bool'], +'EvFork::setCallback' => ['void', 'callback'=>'callable'], +'EvFork::start' => ['void'], +'EvFork::stop' => ['void'], +'EvIdle::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvIdle::clear' => ['int'], +'EvIdle::createStopped' => ['EvIdle', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvIdle::feed' => ['void', 'events'=>'int'], +'EvIdle::getLoop' => ['EvLoop'], +'EvIdle::invoke' => ['void', 'events'=>'int'], +'EvIdle::keepAlive' => ['void', 'value'=>'bool'], +'EvIdle::setCallback' => ['void', 'callback'=>'callable'], +'EvIdle::start' => ['void'], +'EvIdle::stop' => ['void'], +'EvIo::__construct' => ['void', 'fd'=>'mixed', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvIo::clear' => ['int'], +'EvIo::createStopped' => ['EvIo', 'fd'=>'resource', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvIo::feed' => ['void', 'events'=>'int'], +'EvIo::getLoop' => ['EvLoop'], +'EvIo::invoke' => ['void', 'events'=>'int'], +'EvIo::keepAlive' => ['void', 'value'=>'bool'], +'EvIo::set' => ['void', 'fd'=>'resource', 'events'=>'int'], +'EvIo::setCallback' => ['void', 'callback'=>'callable'], +'EvIo::start' => ['void'], +'EvIo::stop' => ['void'], +'EvLoop::__construct' => ['void', 'flags='=>'int', 'data='=>'mixed', 'io_interval='=>'float', 'timeout_interval='=>'float'], +'EvLoop::backend' => ['int'], +'EvLoop::check' => ['EvCheck', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::child' => ['EvChild', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::defaultLoop' => ['EvLoop', 'flags='=>'int', 'data='=>'mixed', 'io_interval='=>'float', 'timeout_interval='=>'float'], +'EvLoop::embed' => ['EvEmbed', 'other'=>'EvLoop', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::fork' => ['EvFork', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::idle' => ['EvIdle', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::invokePending' => ['void'], +'EvLoop::io' => ['EvIo', 'fd'=>'resource', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::loopFork' => ['void'], +'EvLoop::now' => ['float'], +'EvLoop::nowUpdate' => ['void'], +'EvLoop::periodic' => ['EvPeriodic', 'offset'=>'float', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::prepare' => ['EvPrepare', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::resume' => ['void'], +'EvLoop::run' => ['void', 'flags='=>'int'], +'EvLoop::signal' => ['EvSignal', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::stat' => ['EvStat', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::stop' => ['void', 'how='=>'int'], +'EvLoop::suspend' => ['void'], +'EvLoop::timer' => ['EvTimer', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvLoop::verify' => ['void'], +'EvPeriodic::__construct' => ['void', 'offset'=>'float', 'interval'=>'string', 'reschedule_cb'=>'callable', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvPeriodic::again' => ['void'], +'EvPeriodic::at' => ['float'], +'EvPeriodic::clear' => ['int'], +'EvPeriodic::createStopped' => ['EvPeriodic', 'offset'=>'float', 'interval'=>'float', 'reschedule_cb'=>'callable', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvPeriodic::feed' => ['void', 'events'=>'int'], +'EvPeriodic::getLoop' => ['EvLoop'], +'EvPeriodic::invoke' => ['void', 'events'=>'int'], +'EvPeriodic::keepAlive' => ['void', 'value'=>'bool'], +'EvPeriodic::set' => ['void', 'offset'=>'float', 'interval'=>'float'], +'EvPeriodic::setCallback' => ['void', 'callback'=>'callable'], +'EvPeriodic::start' => ['void'], +'EvPeriodic::stop' => ['void'], +'EvPrepare::__construct' => ['void', 'callback'=>'string', 'data='=>'string', 'priority='=>'string'], +'EvPrepare::clear' => ['int'], +'EvPrepare::createStopped' => ['EvPrepare', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvPrepare::feed' => ['void', 'events'=>'int'], +'EvPrepare::getLoop' => ['EvLoop'], +'EvPrepare::invoke' => ['void', 'events'=>'int'], +'EvPrepare::keepAlive' => ['void', 'value'=>'bool'], +'EvPrepare::setCallback' => ['void', 'callback'=>'callable'], +'EvPrepare::start' => ['void'], +'EvPrepare::stop' => ['void'], +'EvSignal::__construct' => ['void', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvSignal::clear' => ['int'], +'EvSignal::createStopped' => ['EvSignal', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvSignal::feed' => ['void', 'events'=>'int'], +'EvSignal::getLoop' => ['EvLoop'], +'EvSignal::invoke' => ['void', 'events'=>'int'], +'EvSignal::keepAlive' => ['void', 'value'=>'bool'], +'EvSignal::set' => ['void', 'signum'=>'int'], +'EvSignal::setCallback' => ['void', 'callback'=>'callable'], +'EvSignal::start' => ['void'], +'EvSignal::stop' => ['void'], +'EvStat::__construct' => ['void', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvStat::attr' => ['array'], +'EvStat::clear' => ['int'], +'EvStat::createStopped' => ['EvStat', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvStat::feed' => ['void', 'events'=>'int'], +'EvStat::getLoop' => ['EvLoop'], +'EvStat::invoke' => ['void', 'events'=>'int'], +'EvStat::keepAlive' => ['void', 'value'=>'bool'], +'EvStat::prev' => ['array'], +'EvStat::set' => ['void', 'path'=>'string', 'interval'=>'float'], +'EvStat::setCallback' => ['void', 'callback'=>'callable'], +'EvStat::start' => ['void'], +'EvStat::stat' => ['bool'], +'EvStat::stop' => ['void'], +'EvTimer::__construct' => ['void', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvTimer::again' => ['void'], +'EvTimer::clear' => ['int'], +'EvTimer::createStopped' => ['EvTimer', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], +'EvTimer::feed' => ['void', 'events'=>'int'], +'EvTimer::getLoop' => ['EvLoop'], +'EvTimer::invoke' => ['void', 'events'=>'int'], +'EvTimer::keepAlive' => ['void', 'value'=>'bool'], +'EvTimer::set' => ['void', 'after'=>'float', 'repeat'=>'float'], +'EvTimer::setCallback' => ['void', 'callback'=>'callable'], +'EvTimer::start' => ['void'], +'EvTimer::stop' => ['void'], +'EvWatcher::__construct' => ['void'], +'EvWatcher::clear' => ['int'], +'EvWatcher::feed' => ['void', 'revents'=>'int'], +'EvWatcher::getLoop' => ['EvLoop'], +'EvWatcher::invoke' => ['void', 'revents'=>'int'], +'EvWatcher::keepalive' => ['bool', 'value='=>'bool'], +'EvWatcher::setCallback' => ['void', 'callback'=>'callable'], +'EvWatcher::start' => ['void'], +'EvWatcher::stop' => ['void'], +'Exception::__clone' => ['void'], +'Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Exception'], +'Exception::__toString' => ['string'], +'Exception::getCode' => ['int|string'], +'Exception::getFile' => ['string'], +'Exception::getLine' => ['int'], +'Exception::getMessage' => ['string'], +'Exception::getPrevious' => ['?Throwable|?Exception'], +'Exception::getTrace' => ['list\',args?:array}>'], +'Exception::getTraceAsString' => ['string'], +'exec' => ['string|false', 'command'=>'string', '&w_output='=>'array', '&w_result_code='=>'int'], +'exif_imagetype' => ['int|false', 'filename'=>'string'], +'exif_read_data' => ['array|false', 'file'=>'string|resource', 'required_sections='=>'string', 'as_arrays='=>'bool', 'read_thumbnail='=>'bool'], +'exif_tagname' => ['string|false', 'index'=>'int'], +'exif_thumbnail' => ['string|false', 'file'=>'string', '&w_width='=>'int', '&w_height='=>'int', '&w_image_type='=>'int'], +'exit' => ['', 'status'=>'string|int'], +'exp' => ['float', 'num'=>'float'], +'expect_expectl' => ['int', 'expect'=>'resource', 'cases'=>'array', 'match='=>'array'], +'expect_popen' => ['resource|false', 'command'=>'string'], +'explode' => ['list', 'separator'=>'string', 'string'=>'string', 'limit='=>'int'], +'expm1' => ['float', 'num'=>'float'], +'extension_loaded' => ['bool', 'extension'=>'string'], +'extract' => ['int', '&rw_array'=>'array', 'flags='=>'int', 'prefix='=>'string'], +'ezmlm_hash' => ['int', 'addr'=>'string'], +'fam_cancel_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], +'fam_close' => ['void', 'fam'=>'resource'], +'fam_monitor_collection' => ['resource', 'fam'=>'resource', 'dirname'=>'string', 'depth'=>'int', 'mask'=>'string'], +'fam_monitor_directory' => ['resource', 'fam'=>'resource', 'dirname'=>'string'], +'fam_monitor_file' => ['resource', 'fam'=>'resource', 'filename'=>'string'], +'fam_next_event' => ['array', 'fam'=>'resource'], +'fam_open' => ['resource|false', 'appname='=>'string'], +'fam_pending' => ['int', 'fam'=>'resource'], +'fam_resume_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], +'fam_suspend_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], +'fann_cascadetrain_on_data' => ['bool', 'ann'=>'resource', 'data'=>'resource', 'max_neurons'=>'int', 'neurons_between_reports'=>'int', 'desired_error'=>'float'], +'fann_cascadetrain_on_file' => ['bool', 'ann'=>'resource', 'filename'=>'string', 'max_neurons'=>'int', 'neurons_between_reports'=>'int', 'desired_error'=>'float'], +'fann_clear_scaling_params' => ['bool', 'ann'=>'resource'], +'fann_copy' => ['resource|false', 'ann'=>'resource'], +'fann_create_from_file' => ['resource', 'configuration_file'=>'string'], +'fann_create_shortcut' => ['resource|false', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], +'fann_create_shortcut_array' => ['resource|false', 'num_layers'=>'int', 'layers'=>'array'], +'fann_create_sparse' => ['resource|false', 'connection_rate'=>'float', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], +'fann_create_sparse_array' => ['resource|false', 'connection_rate'=>'float', 'num_layers'=>'int', 'layers'=>'array'], +'fann_create_standard' => ['resource|false', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], +'fann_create_standard_array' => ['resource|false', 'num_layers'=>'int', 'layers'=>'array'], +'fann_create_train' => ['resource', 'num_data'=>'int', 'num_input'=>'int', 'num_output'=>'int'], +'fann_create_train_from_callback' => ['resource', 'num_data'=>'int', 'num_input'=>'int', 'num_output'=>'int', 'user_function'=>'callable'], +'fann_descale_input' => ['bool', 'ann'=>'resource', 'input_vector'=>'array'], +'fann_descale_output' => ['bool', 'ann'=>'resource', 'output_vector'=>'array'], +'fann_descale_train' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], +'fann_destroy' => ['bool', 'ann'=>'resource'], +'fann_destroy_train' => ['bool', 'train_data'=>'resource'], +'fann_duplicate_train_data' => ['resource', 'data'=>'resource'], +'fann_get_activation_function' => ['int|false', 'ann'=>'resource', 'layer'=>'int', 'neuron'=>'int'], +'fann_get_activation_steepness' => ['float|false', 'ann'=>'resource', 'layer'=>'int', 'neuron'=>'int'], +'fann_get_bias_array' => ['array', 'ann'=>'resource'], +'fann_get_bit_fail' => ['int|false', 'ann'=>'resource'], +'fann_get_bit_fail_limit' => ['float|false', 'ann'=>'resource'], +'fann_get_cascade_activation_functions' => ['array|false', 'ann'=>'resource'], +'fann_get_cascade_activation_functions_count' => ['int|false', 'ann'=>'resource'], +'fann_get_cascade_activation_steepnesses' => ['array|false', 'ann'=>'resource'], +'fann_get_cascade_activation_steepnesses_count' => ['int|false', 'ann'=>'resource'], +'fann_get_cascade_candidate_change_fraction' => ['float|false', 'ann'=>'resource'], +'fann_get_cascade_candidate_limit' => ['float|false', 'ann'=>'resource'], +'fann_get_cascade_candidate_stagnation_epochs' => ['float|false', 'ann'=>'resource'], +'fann_get_cascade_max_cand_epochs' => ['int|false', 'ann'=>'resource'], +'fann_get_cascade_max_out_epochs' => ['int|false', 'ann'=>'resource'], +'fann_get_cascade_min_cand_epochs' => ['int|false', 'ann'=>'resource'], +'fann_get_cascade_min_out_epochs' => ['int|false', 'ann'=>'resource'], +'fann_get_cascade_num_candidate_groups' => ['int|false', 'ann'=>'resource'], +'fann_get_cascade_num_candidates' => ['int|false', 'ann'=>'resource'], +'fann_get_cascade_output_change_fraction' => ['float|false', 'ann'=>'resource'], +'fann_get_cascade_output_stagnation_epochs' => ['int|false', 'ann'=>'resource'], +'fann_get_cascade_weight_multiplier' => ['float|false', 'ann'=>'resource'], +'fann_get_connection_array' => ['array', 'ann'=>'resource'], +'fann_get_connection_rate' => ['float|false', 'ann'=>'resource'], +'fann_get_errno' => ['int|false', 'errdat'=>'resource'], +'fann_get_errstr' => ['string|false', 'errdat'=>'resource'], +'fann_get_layer_array' => ['array', 'ann'=>'resource'], +'fann_get_learning_momentum' => ['float|false', 'ann'=>'resource'], +'fann_get_learning_rate' => ['float|false', 'ann'=>'resource'], +'fann_get_MSE' => ['float|false', 'ann'=>'resource'], +'fann_get_network_type' => ['int|false', 'ann'=>'resource'], +'fann_get_num_input' => ['int|false', 'ann'=>'resource'], +'fann_get_num_layers' => ['int|false', 'ann'=>'resource'], +'fann_get_num_output' => ['int|false', 'ann'=>'resource'], +'fann_get_quickprop_decay' => ['float|false', 'ann'=>'resource'], +'fann_get_quickprop_mu' => ['float|false', 'ann'=>'resource'], +'fann_get_rprop_decrease_factor' => ['float|false', 'ann'=>'resource'], +'fann_get_rprop_delta_max' => ['float|false', 'ann'=>'resource'], +'fann_get_rprop_delta_min' => ['float|false', 'ann'=>'resource'], +'fann_get_rprop_delta_zero' => ['float|false', 'ann'=>'resource'], +'fann_get_rprop_increase_factor' => ['float|false', 'ann'=>'resource'], +'fann_get_sarprop_step_error_shift' => ['float|false', 'ann'=>'resource'], +'fann_get_sarprop_step_error_threshold_factor' => ['float|false', 'ann'=>'resource'], +'fann_get_sarprop_temperature' => ['float|false', 'ann'=>'resource'], +'fann_get_sarprop_weight_decay_shift' => ['float|false', 'ann'=>'resource'], +'fann_get_total_connections' => ['int|false', 'ann'=>'resource'], +'fann_get_total_neurons' => ['int|false', 'ann'=>'resource'], +'fann_get_train_error_function' => ['int|false', 'ann'=>'resource'], +'fann_get_train_stop_function' => ['int|false', 'ann'=>'resource'], +'fann_get_training_algorithm' => ['int|false', 'ann'=>'resource'], +'fann_init_weights' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], +'fann_length_train_data' => ['int|false', 'data'=>'resource'], +'fann_merge_train_data' => ['resource|false', 'data1'=>'resource', 'data2'=>'resource'], +'fann_num_input_train_data' => ['int|false', 'data'=>'resource'], +'fann_num_output_train_data' => ['int|false', 'data'=>'resource'], +'fann_print_error' => ['void', 'errdat'=>'string'], +'fann_randomize_weights' => ['bool', 'ann'=>'resource', 'min_weight'=>'float', 'max_weight'=>'float'], +'fann_read_train_from_file' => ['resource', 'filename'=>'string'], +'fann_reset_errno' => ['void', 'errdat'=>'resource'], +'fann_reset_errstr' => ['void', 'errdat'=>'resource'], +'fann_reset_MSE' => ['bool', 'ann'=>'string'], +'fann_run' => ['array|false', 'ann'=>'resource', 'input'=>'array'], +'fann_save' => ['bool', 'ann'=>'resource', 'configuration_file'=>'string'], +'fann_save_train' => ['bool', 'data'=>'resource', 'file_name'=>'string'], +'fann_scale_input' => ['bool', 'ann'=>'resource', 'input_vector'=>'array'], +'fann_scale_input_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], +'fann_scale_output' => ['bool', 'ann'=>'resource', 'output_vector'=>'array'], +'fann_scale_output_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], +'fann_scale_train' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], +'fann_scale_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], +'fann_set_activation_function' => ['bool', 'ann'=>'resource', 'activation_function'=>'int', 'layer'=>'int', 'neuron'=>'int'], +'fann_set_activation_function_hidden' => ['bool', 'ann'=>'resource', 'activation_function'=>'int'], +'fann_set_activation_function_layer' => ['bool', 'ann'=>'resource', 'activation_function'=>'int', 'layer'=>'int'], +'fann_set_activation_function_output' => ['bool', 'ann'=>'resource', 'activation_function'=>'int'], +'fann_set_activation_steepness' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float', 'layer'=>'int', 'neuron'=>'int'], +'fann_set_activation_steepness_hidden' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float'], +'fann_set_activation_steepness_layer' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float', 'layer'=>'int'], +'fann_set_activation_steepness_output' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float'], +'fann_set_bit_fail_limit' => ['bool', 'ann'=>'resource', 'bit_fail_limit'=>'float'], +'fann_set_callback' => ['bool', 'ann'=>'resource', 'callback'=>'callable'], +'fann_set_cascade_activation_functions' => ['bool', 'ann'=>'resource', 'cascade_activation_functions'=>'array'], +'fann_set_cascade_activation_steepnesses' => ['bool', 'ann'=>'resource', 'cascade_activation_steepnesses_count'=>'array'], +'fann_set_cascade_candidate_change_fraction' => ['bool', 'ann'=>'resource', 'cascade_candidate_change_fraction'=>'float'], +'fann_set_cascade_candidate_limit' => ['bool', 'ann'=>'resource', 'cascade_candidate_limit'=>'float'], +'fann_set_cascade_candidate_stagnation_epochs' => ['bool', 'ann'=>'resource', 'cascade_candidate_stagnation_epochs'=>'int'], +'fann_set_cascade_max_cand_epochs' => ['bool', 'ann'=>'resource', 'cascade_max_cand_epochs'=>'int'], +'fann_set_cascade_max_out_epochs' => ['bool', 'ann'=>'resource', 'cascade_max_out_epochs'=>'int'], +'fann_set_cascade_min_cand_epochs' => ['bool', 'ann'=>'resource', 'cascade_min_cand_epochs'=>'int'], +'fann_set_cascade_min_out_epochs' => ['bool', 'ann'=>'resource', 'cascade_min_out_epochs'=>'int'], +'fann_set_cascade_num_candidate_groups' => ['bool', 'ann'=>'resource', 'cascade_num_candidate_groups'=>'int'], +'fann_set_cascade_output_change_fraction' => ['bool', 'ann'=>'resource', 'cascade_output_change_fraction'=>'float'], +'fann_set_cascade_output_stagnation_epochs' => ['bool', 'ann'=>'resource', 'cascade_output_stagnation_epochs'=>'int'], +'fann_set_cascade_weight_multiplier' => ['bool', 'ann'=>'resource', 'cascade_weight_multiplier'=>'float'], +'fann_set_error_log' => ['void', 'errdat'=>'resource', 'log_file'=>'string'], +'fann_set_input_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_input_min'=>'float', 'new_input_max'=>'float'], +'fann_set_learning_momentum' => ['bool', 'ann'=>'resource', 'learning_momentum'=>'float'], +'fann_set_learning_rate' => ['bool', 'ann'=>'resource', 'learning_rate'=>'float'], +'fann_set_output_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_output_min'=>'float', 'new_output_max'=>'float'], +'fann_set_quickprop_decay' => ['bool', 'ann'=>'resource', 'quickprop_decay'=>'float'], +'fann_set_quickprop_mu' => ['bool', 'ann'=>'resource', 'quickprop_mu'=>'float'], +'fann_set_rprop_decrease_factor' => ['bool', 'ann'=>'resource', 'rprop_decrease_factor'=>'float'], +'fann_set_rprop_delta_max' => ['bool', 'ann'=>'resource', 'rprop_delta_max'=>'float'], +'fann_set_rprop_delta_min' => ['bool', 'ann'=>'resource', 'rprop_delta_min'=>'float'], +'fann_set_rprop_delta_zero' => ['bool', 'ann'=>'resource', 'rprop_delta_zero'=>'float'], +'fann_set_rprop_increase_factor' => ['bool', 'ann'=>'resource', 'rprop_increase_factor'=>'float'], +'fann_set_sarprop_step_error_shift' => ['bool', 'ann'=>'resource', 'sarprop_step_error_shift'=>'float'], +'fann_set_sarprop_step_error_threshold_factor' => ['bool', 'ann'=>'resource', 'sarprop_step_error_threshold_factor'=>'float'], +'fann_set_sarprop_temperature' => ['bool', 'ann'=>'resource', 'sarprop_temperature'=>'float'], +'fann_set_sarprop_weight_decay_shift' => ['bool', 'ann'=>'resource', 'sarprop_weight_decay_shift'=>'float'], +'fann_set_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_input_min'=>'float', 'new_input_max'=>'float', 'new_output_min'=>'float', 'new_output_max'=>'float'], +'fann_set_train_error_function' => ['bool', 'ann'=>'resource', 'error_function'=>'int'], +'fann_set_train_stop_function' => ['bool', 'ann'=>'resource', 'stop_function'=>'int'], +'fann_set_training_algorithm' => ['bool', 'ann'=>'resource', 'training_algorithm'=>'int'], +'fann_set_weight' => ['bool', 'ann'=>'resource', 'from_neuron'=>'int', 'to_neuron'=>'int', 'weight'=>'float'], +'fann_set_weight_array' => ['bool', 'ann'=>'resource', 'connections'=>'array'], +'fann_shuffle_train_data' => ['bool', 'train_data'=>'resource'], +'fann_subset_train_data' => ['resource', 'data'=>'resource', 'pos'=>'int', 'length'=>'int'], +'fann_test' => ['bool', 'ann'=>'resource', 'input'=>'array', 'desired_output'=>'array'], +'fann_test_data' => ['float|false', 'ann'=>'resource', 'data'=>'resource'], +'fann_train' => ['bool', 'ann'=>'resource', 'input'=>'array', 'desired_output'=>'array'], +'fann_train_epoch' => ['float|false', 'ann'=>'resource', 'data'=>'resource'], +'fann_train_on_data' => ['bool', 'ann'=>'resource', 'data'=>'resource', 'max_epochs'=>'int', 'epochs_between_reports'=>'int', 'desired_error'=>'float'], +'fann_train_on_file' => ['bool', 'ann'=>'resource', 'filename'=>'string', 'max_epochs'=>'int', 'epochs_between_reports'=>'int', 'desired_error'=>'float'], +'FANNConnection::__construct' => ['void', 'from_neuron'=>'int', 'to_neuron'=>'int', 'weight'=>'float'], +'FANNConnection::getFromNeuron' => ['int'], +'FANNConnection::getToNeuron' => ['int'], +'FANNConnection::getWeight' => ['void'], +'FANNConnection::setWeight' => ['bool', 'weight'=>'float'], +'fastcgi_finish_request' => ['bool'], +'fbsql_affected_rows' => ['int', 'link_identifier='=>'?resource'], +'fbsql_autocommit' => ['bool', 'link_identifier'=>'resource', 'onoff='=>'bool'], +'fbsql_blob_size' => ['int', 'blob_handle'=>'string', 'link_identifier='=>'?resource'], +'fbsql_change_user' => ['bool', 'user'=>'string', 'password'=>'string', 'database='=>'string', 'link_identifier='=>'?resource'], +'fbsql_clob_size' => ['int', 'clob_handle'=>'string', 'link_identifier='=>'?resource'], +'fbsql_close' => ['bool', 'link_identifier='=>'?resource'], +'fbsql_commit' => ['bool', 'link_identifier='=>'?resource'], +'fbsql_connect' => ['resource', 'hostname='=>'string', 'username='=>'string', 'password='=>'string'], +'fbsql_create_blob' => ['string', 'blob_data'=>'string', 'link_identifier='=>'?resource'], +'fbsql_create_clob' => ['string', 'clob_data'=>'string', 'link_identifier='=>'?resource'], +'fbsql_create_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource', 'database_options='=>'string'], +'fbsql_data_seek' => ['bool', 'result'=>'resource', 'row_number'=>'int'], +'fbsql_database' => ['string', 'link_identifier'=>'resource', 'database='=>'string'], +'fbsql_database_password' => ['string', 'link_identifier'=>'resource', 'database_password='=>'string'], +'fbsql_db_query' => ['resource', 'database'=>'string', 'query'=>'string', 'link_identifier='=>'?resource'], +'fbsql_db_status' => ['int', 'database_name'=>'string', 'link_identifier='=>'?resource'], +'fbsql_drop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], +'fbsql_errno' => ['int', 'link_identifier='=>'?resource'], +'fbsql_error' => ['string', 'link_identifier='=>'?resource'], +'fbsql_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], +'fbsql_fetch_assoc' => ['array', 'result'=>'resource'], +'fbsql_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], +'fbsql_fetch_lengths' => ['array', 'result'=>'resource'], +'fbsql_fetch_object' => ['object', 'result'=>'resource'], +'fbsql_fetch_row' => ['array', 'result'=>'resource'], +'fbsql_field_flags' => ['string', 'result'=>'resource', 'field_offset='=>'int'], +'fbsql_field_len' => ['int', 'result'=>'resource', 'field_offset='=>'int'], +'fbsql_field_name' => ['string', 'result'=>'resource', 'field_index='=>'int'], +'fbsql_field_seek' => ['bool', 'result'=>'resource', 'field_offset='=>'int'], +'fbsql_field_table' => ['string', 'result'=>'resource', 'field_offset='=>'int'], +'fbsql_field_type' => ['string', 'result'=>'resource', 'field_offset='=>'int'], +'fbsql_free_result' => ['bool', 'result'=>'resource'], +'fbsql_get_autostart_info' => ['array', 'link_identifier='=>'?resource'], +'fbsql_hostname' => ['string', 'link_identifier'=>'resource', 'host_name='=>'string'], +'fbsql_insert_id' => ['int', 'link_identifier='=>'?resource'], +'fbsql_list_dbs' => ['resource', 'link_identifier='=>'?resource'], +'fbsql_list_fields' => ['resource', 'database_name'=>'string', 'table_name'=>'string', 'link_identifier='=>'?resource'], +'fbsql_list_tables' => ['resource', 'database'=>'string', 'link_identifier='=>'?resource'], +'fbsql_next_result' => ['bool', 'result'=>'resource'], +'fbsql_num_fields' => ['int', 'result'=>'resource'], +'fbsql_num_rows' => ['int', 'result'=>'resource'], +'fbsql_password' => ['string', 'link_identifier'=>'resource', 'password='=>'string'], +'fbsql_pconnect' => ['resource', 'hostname='=>'string', 'username='=>'string', 'password='=>'string'], +'fbsql_query' => ['resource', 'query'=>'string', 'link_identifier='=>'?resource', 'batch_size='=>'int'], +'fbsql_read_blob' => ['string', 'blob_handle'=>'string', 'link_identifier='=>'?resource'], +'fbsql_read_clob' => ['string', 'clob_handle'=>'string', 'link_identifier='=>'?resource'], +'fbsql_result' => ['mixed', 'result'=>'resource', 'row='=>'int', 'field='=>'mixed'], +'fbsql_rollback' => ['bool', 'link_identifier='=>'?resource'], +'fbsql_rows_fetched' => ['int', 'result'=>'resource'], +'fbsql_select_db' => ['bool', 'database_name='=>'string', 'link_identifier='=>'?resource'], +'fbsql_set_characterset' => ['void', 'link_identifier'=>'resource', 'characterset'=>'int', 'in_out_both='=>'int'], +'fbsql_set_lob_mode' => ['bool', 'result'=>'resource', 'lob_mode'=>'int'], +'fbsql_set_password' => ['bool', 'link_identifier'=>'resource', 'user'=>'string', 'password'=>'string', 'old_password'=>'string'], +'fbsql_set_transaction' => ['void', 'link_identifier'=>'resource', 'locking'=>'int', 'isolation'=>'int'], +'fbsql_start_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource', 'database_options='=>'string'], +'fbsql_stop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], +'fbsql_table_name' => ['string', 'result'=>'resource', 'index'=>'int'], +'fbsql_username' => ['string', 'link_identifier'=>'resource', 'username='=>'string'], +'fbsql_warnings' => ['bool', 'onoff='=>'bool'], +'fclose' => ['bool', 'stream'=>'resource'], +'fdf_add_doc_javascript' => ['bool', 'fdf_document'=>'resource', 'script_name'=>'string', 'script_code'=>'string'], +'fdf_add_template' => ['bool', 'fdf_document'=>'resource', 'newpage'=>'int', 'filename'=>'string', 'template'=>'string', 'rename'=>'int'], +'fdf_close' => ['void', 'fdf_document'=>'resource'], +'fdf_create' => ['resource'], +'fdf_enum_values' => ['bool', 'fdf_document'=>'resource', 'function'=>'callable', 'userdata='=>'mixed'], +'fdf_errno' => ['int'], +'fdf_error' => ['string', 'error_code='=>'int'], +'fdf_get_ap' => ['bool', 'fdf_document'=>'resource', 'field'=>'string', 'face'=>'int', 'filename'=>'string'], +'fdf_get_attachment' => ['array', 'fdf_document'=>'resource', 'fieldname'=>'string', 'savepath'=>'string'], +'fdf_get_encoding' => ['string', 'fdf_document'=>'resource'], +'fdf_get_file' => ['string', 'fdf_document'=>'resource'], +'fdf_get_flags' => ['int', 'fdf_document'=>'resource', 'fieldname'=>'string', 'whichflags'=>'int'], +'fdf_get_opt' => ['mixed', 'fdf_document'=>'resource', 'fieldname'=>'string', 'element='=>'int'], +'fdf_get_status' => ['string', 'fdf_document'=>'resource'], +'fdf_get_value' => ['mixed', 'fdf_document'=>'resource', 'fieldname'=>'string', 'which='=>'int'], +'fdf_get_version' => ['string', 'fdf_document='=>'resource'], +'fdf_header' => ['void'], +'fdf_next_field_name' => ['string', 'fdf_document'=>'resource', 'fieldname='=>'string'], +'fdf_open' => ['resource|false', 'filename'=>'string'], +'fdf_open_string' => ['resource', 'fdf_data'=>'string'], +'fdf_remove_item' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'item'=>'int'], +'fdf_save' => ['bool', 'fdf_document'=>'resource', 'filename='=>'string'], +'fdf_save_string' => ['string', 'fdf_document'=>'resource'], +'fdf_set_ap' => ['bool', 'fdf_document'=>'resource', 'field_name'=>'string', 'face'=>'int', 'filename'=>'string', 'page_number'=>'int'], +'fdf_set_encoding' => ['bool', 'fdf_document'=>'resource', 'encoding'=>'string'], +'fdf_set_file' => ['bool', 'fdf_document'=>'resource', 'url'=>'string', 'target_frame='=>'string'], +'fdf_set_flags' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'whichflags'=>'int', 'newflags'=>'int'], +'fdf_set_javascript_action' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'trigger'=>'int', 'script'=>'string'], +'fdf_set_on_import_javascript' => ['bool', 'fdf_document'=>'resource', 'script'=>'string', 'before_data_import'=>'bool'], +'fdf_set_opt' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'element'=>'int', 'string1'=>'string', 'string2'=>'string'], +'fdf_set_status' => ['bool', 'fdf_document'=>'resource', 'status'=>'string'], +'fdf_set_submit_form_action' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'trigger'=>'int', 'script'=>'string', 'flags'=>'int'], +'fdf_set_target_frame' => ['bool', 'fdf_document'=>'resource', 'frame_name'=>'string'], +'fdf_set_value' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'value'=>'mixed', 'isname='=>'int'], +'fdf_set_version' => ['bool', 'fdf_document'=>'resource', 'version'=>'string'], +'fdiv' => ['float', 'num1'=>'float', 'num2'=>'float'], +'feof' => ['bool', 'stream'=>'resource'], +'fflush' => ['bool', 'stream'=>'resource'], +'fsync' => ['bool', 'stream'=>'resource'], +'fdatasync' => ['bool', 'stream'=>'resource'], +'ffmpeg_animated_gif::__construct' => ['void', 'output_file_path'=>'string', 'width'=>'int', 'height'=>'int', 'frame_rate'=>'int', 'loop_count='=>'int'], +'ffmpeg_animated_gif::addFrame' => ['', 'frame_to_add'=>'ffmpeg_frame'], +'ffmpeg_frame::__construct' => ['void', 'gd_image'=>'resource'], +'ffmpeg_frame::crop' => ['', 'crop_top'=>'int', 'crop_bottom='=>'int', 'crop_left='=>'int', 'crop_right='=>'int'], +'ffmpeg_frame::getHeight' => ['int'], +'ffmpeg_frame::getPresentationTimestamp' => ['int'], +'ffmpeg_frame::getPTS' => ['int'], +'ffmpeg_frame::getWidth' => ['int'], +'ffmpeg_frame::resize' => ['', 'width'=>'int', 'height'=>'int', 'crop_top='=>'int', 'crop_bottom='=>'int', 'crop_left='=>'int', 'crop_right='=>'int'], +'ffmpeg_frame::toGDImage' => ['resource'], +'ffmpeg_movie::__construct' => ['void', 'path_to_media'=>'string', 'persistent'=>'bool'], +'ffmpeg_movie::getArtist' => ['string'], +'ffmpeg_movie::getAudioBitRate' => ['int'], +'ffmpeg_movie::getAudioChannels' => ['int'], +'ffmpeg_movie::getAudioCodec' => ['string'], +'ffmpeg_movie::getAudioSampleRate' => ['int'], +'ffmpeg_movie::getAuthor' => ['string'], +'ffmpeg_movie::getBitRate' => ['int'], +'ffmpeg_movie::getComment' => ['string'], +'ffmpeg_movie::getCopyright' => ['string'], +'ffmpeg_movie::getDuration' => ['int'], +'ffmpeg_movie::getFilename' => ['string'], +'ffmpeg_movie::getFrame' => ['ffmpeg_frame|false', 'framenumber'=>'int'], +'ffmpeg_movie::getFrameCount' => ['int'], +'ffmpeg_movie::getFrameHeight' => ['int'], +'ffmpeg_movie::getFrameNumber' => ['int'], +'ffmpeg_movie::getFrameRate' => ['int'], +'ffmpeg_movie::getFrameWidth' => ['int'], +'ffmpeg_movie::getGenre' => ['string'], +'ffmpeg_movie::getNextKeyFrame' => ['ffmpeg_frame|false'], +'ffmpeg_movie::getPixelFormat' => [''], +'ffmpeg_movie::getTitle' => ['string'], +'ffmpeg_movie::getTrackNumber' => ['int|string'], +'ffmpeg_movie::getVideoBitRate' => ['int'], +'ffmpeg_movie::getVideoCodec' => ['string'], +'ffmpeg_movie::getYear' => ['int|string'], +'ffmpeg_movie::hasAudio' => ['bool'], +'ffmpeg_movie::hasVideo' => ['bool'], +'fgetc' => ['string|false', 'stream'=>'resource'], +'fgetcsv' => ['list|array{0: null}|false|null', 'stream'=>'resource', 'length='=>'int', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], +'fgets' => ['string|false', 'stream'=>'resource', 'length='=>'int'], +'fgetss' => ['string|false', 'fp'=>'resource', 'length='=>'int', 'allowable_tags='=>'string'], +'file' => ['list|false', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], +'file_exists' => ['bool', 'filename'=>'string'], +'file_get_contents' => ['string|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'?resource', 'offset='=>'int', 'length='=>'int'], +'file_put_contents' => ['int|false', 'filename'=>'string', 'data'=>'string|resource|array', 'flags='=>'int', 'context='=>'resource'], +'fileatime' => ['int|false', 'filename'=>'string'], +'filectime' => ['int|false', 'filename'=>'string'], +'filegroup' => ['int|false', 'filename'=>'string'], +'fileinode' => ['int|false', 'filename'=>'string'], +'filemtime' => ['int|false', 'filename'=>'string'], +'fileowner' => ['int|false', 'filename'=>'string'], +'fileperms' => ['int|false', 'filename'=>'string'], +'filepro' => ['bool', 'directory'=>'string'], +'filepro_fieldcount' => ['int'], +'filepro_fieldname' => ['string', 'field_number'=>'int'], +'filepro_fieldtype' => ['string', 'field_number'=>'int'], +'filepro_fieldwidth' => ['int', 'field_number'=>'int'], +'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::__toString' => ['string'], +'FilesystemIterator::_bad_state_ex' => [''], +'FilesystemIterator::current' => ['mixed'], +'FilesystemIterator::getATime' => ['int'], +'FilesystemIterator::getBasename' => ['string', 'suffix='=>'string'], +'FilesystemIterator::getCTime' => ['int'], +'FilesystemIterator::getExtension' => ['string'], +'FilesystemIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], +'FilesystemIterator::getFilename' => ['string'], +'FilesystemIterator::getFlags' => ['int'], +'FilesystemIterator::getGroup' => ['int'], +'FilesystemIterator::getInode' => ['int'], +'FilesystemIterator::getLinkTarget' => ['string'], +'FilesystemIterator::getMTime' => ['int'], +'FilesystemIterator::getOwner' => ['int'], +'FilesystemIterator::getPath' => ['string'], +'FilesystemIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], +'FilesystemIterator::getPathname' => ['string'], +'FilesystemIterator::getPerms' => ['int'], +'FilesystemIterator::getRealPath' => ['string'], +'FilesystemIterator::getSize' => ['int'], +'FilesystemIterator::getType' => ['string'], +'FilesystemIterator::isDir' => ['bool'], +'FilesystemIterator::isDot' => ['bool'], +'FilesystemIterator::isExecutable' => ['bool'], +'FilesystemIterator::isFile' => ['bool'], +'FilesystemIterator::isLink' => ['bool'], +'FilesystemIterator::isReadable' => ['bool'], +'FilesystemIterator::isWritable' => ['bool'], +'FilesystemIterator::key' => ['string'], +'FilesystemIterator::next' => ['void'], +'FilesystemIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'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::valid' => ['bool'], +'filetype' => ['string|false', 'filename'=>'string'], +'filter_has_var' => ['bool', 'input_type'=>'int', 'var_name'=>'string'], +'filter_id' => ['int|false', 'name'=>'string'], +'filter_input' => ['mixed|false', 'type'=>'int', 'var_name'=>'string', 'filter='=>'int', 'options='=>'array|int'], +'filter_input_array' => ['mixed|false', 'type'=>'int', 'options='=>'int|array', 'add_empty='=>'bool'], +'filter_list' => ['array'], +'filter_var' => ['mixed|false', 'value'=>'mixed', 'filter='=>'int', 'options='=>'array|int'], +'filter_var_array' => ['array|false|null', 'array'=>'array', 'options='=>'array|int', 'add_empty='=>'bool'], +'FilterIterator::__construct' => ['void', 'iterator'=>'Iterator'], +'FilterIterator::accept' => ['bool'], +'FilterIterator::current' => ['mixed'], +'FilterIterator::getInnerIterator' => ['Iterator'], +'FilterIterator::key' => ['mixed'], +'FilterIterator::next' => ['void'], +'FilterIterator::rewind' => ['void'], +'FilterIterator::valid' => ['bool'], +'finfo::__construct' => ['void', 'options='=>'int', 'magic_file='=>'string'], +'finfo::buffer' => ['string|false', 'string'=>'string', 'options='=>'int', 'context='=>'resource'], +'finfo::file' => ['string|false', 'file_name'=>'string', 'options='=>'int', 'context='=>'resource'], +'finfo::finfo' => ['void', 'options='=>'int', 'magic_file='=>'string'], +'finfo::set_flags' => ['bool', 'options'=>'int'], +'finfo_buffer' => ['string|false', 'finfo'=>'finfo', 'string'=>'string', 'flags='=>'int', 'context='=>'resource'], +'finfo_close' => ['bool', 'finfo'=>'finfo'], +'finfo_file' => ['string|false', 'finfo'=>'finfo', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], +'finfo_open' => ['finfo|false', 'flags='=>'int', 'magic_database='=>'string'], +'finfo_set_flags' => ['bool', 'finfo'=>'finfo', 'flags'=>'int'], +'floatval' => ['float', 'value'=>'mixed'], +'flock' => ['bool', 'stream'=>'resource', 'operation'=>'int', '&w_would_block='=>'int'], +'floor' => ['float', 'num'=>'float'], +'flush' => ['void'], +'fmod' => ['float', 'num1'=>'float', 'num2'=>'float'], +'fnmatch' => ['bool', 'pattern'=>'string', 'filename'=>'string', 'flags='=>'int'], +'fopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'bool', 'context='=>'resource|null'], +'forward_static_call' => ['mixed|false', 'callback'=>'callable', '...args='=>'mixed'], +'forward_static_call_array' => ['mixed|false', 'callback'=>'callable', 'args'=>'list'], +'fpassthru' => ['int|false', 'stream'=>'resource'], +'fpm_get_status' => ['array|false'], +'fprintf' => ['int', 'stream'=>'resource', 'format'=>'string', '...values='=>'string|int|float'], +'fputcsv' => ['int|false', 'stream'=>'resource', 'fields'=>'array', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string', 'eol='=>'string'], +'fputs' => ['int|false', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], +'fread' => ['string|false', 'stream'=>'resource', 'length'=>'int'], +'frenchtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], +'fribidi_log2vis' => ['string', 'string'=>'string', 'direction'=>'string', 'charset'=>'int'], +'fscanf' => ['list', 'stream'=>'resource', 'format'=>'string'], +'fscanf\'1' => ['int', 'stream'=>'resource', 'format'=>'string', '&...w_vars='=>'string|int|float'], +'fseek' => ['int', 'stream'=>'resource', 'offset'=>'int', 'whence='=>'int'], +'fsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float'], +'fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'stream'=>'resource'], +'ftell' => ['int|false', 'stream'=>'resource'], +'ftok' => ['int', 'filename'=>'string', 'project_id'=>'string'], +'ftp_alloc' => ['bool', 'ftp'=>'FTP\Connection', 'size'=>'int', '&w_response='=>'string'], +'ftp_append' => ['bool', 'ftp'=>'FTP\Connection', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int'], +'ftp_cdup' => ['bool', 'ftp'=>'FTP\Connection'], +'ftp_chdir' => ['bool', 'ftp'=>'FTP\Connection', 'directory'=>'string'], +'ftp_chmod' => ['int|false', 'ftp'=>'FTP\Connection', 'permissions'=>'int', 'filename'=>'string'], +'ftp_close' => ['bool', 'ftp'=>'FTP\Connection'], +'ftp_connect' => ['FTP\Connection|false', 'hostname'=>'string', 'port='=>'int', 'timeout='=>'int'], +'ftp_delete' => ['bool', 'ftp'=>'FTP\Connection', 'filename'=>'string'], +'ftp_exec' => ['bool', 'ftp'=>'FTP\Connection', 'command'=>'string'], +'ftp_fget' => ['bool', 'ftp'=>'FTP\Connection', 'stream'=>'resource', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], +'ftp_fput' => ['bool', 'ftp'=>'FTP\Connection', 'remote_filename'=>'string', 'stream'=>'resource', 'mode='=>'int', 'offset='=>'int'], +'ftp_get' => ['bool', 'ftp'=>'FTP\Connection', 'local_filename'=>'string', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], +'ftp_get_option' => ['mixed|false', 'ftp'=>'FTP\Connection', 'option'=>'int'], +'ftp_login' => ['bool', 'ftp'=>'FTP\Connection', 'username'=>'string', 'password'=>'string'], +'ftp_mdtm' => ['int', 'ftp'=>'FTP\Connection', 'filename'=>'string'], +'ftp_mkdir' => ['string|false', 'ftp'=>'FTP\Connection', 'directory'=>'string'], +'ftp_mlsd' => ['array|false', 'ftp'=>'FTP\Connection', 'directory'=>'string'], +'ftp_nb_continue' => ['int', 'ftp'=>'FTP\Connection'], +'ftp_nb_fget' => ['int', 'ftp'=>'FTP\Connection', 'stream'=>'resource', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], +'ftp_nb_fput' => ['int', 'ftp'=>'FTP\Connection', 'remote_filename'=>'string', 'stream'=>'resource', 'mode='=>'int', 'offset='=>'int'], +'ftp_nb_get' => ['int', 'ftp'=>'FTP\Connection', 'local_filename'=>'string', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], +'ftp_nb_put' => ['int', 'ftp'=>'FTP\Connection', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], +'ftp_nlist' => ['array|false', 'ftp'=>'FTP\Connection', 'directory'=>'string'], +'ftp_pasv' => ['bool', 'ftp'=>'FTP\Connection', 'enable'=>'bool'], +'ftp_put' => ['bool', 'ftp'=>'FTP\Connection', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], +'ftp_pwd' => ['string|false', 'ftp'=>'FTP\Connection'], +'ftp_quit' => ['bool', 'ftp'=>'FTP\Connection'], +'ftp_raw' => ['?array', 'ftp'=>'FTP\Connection', 'command'=>'string'], +'ftp_rawlist' => ['array|false', 'ftp'=>'FTP\Connection', 'directory'=>'string', 'recursive='=>'bool'], +'ftp_rename' => ['bool', 'ftp'=>'FTP\Connection', 'from'=>'string', 'to'=>'string'], +'ftp_rmdir' => ['bool', 'ftp'=>'FTP\Connection', 'directory'=>'string'], +'ftp_set_option' => ['bool', 'ftp'=>'FTP\Connection', 'option'=>'int', 'value'=>'mixed'], +'ftp_site' => ['bool', 'ftp'=>'FTP\Connection', 'command'=>'string'], +'ftp_size' => ['int', 'ftp'=>'FTP\Connection', 'filename'=>'string'], +'ftp_ssl_connect' => ['FTP\Connection|false', 'hostname'=>'string', 'port='=>'int', 'timeout='=>'int'], +'ftp_systype' => ['string|false', 'ftp'=>'FTP\Connection'], +'ftruncate' => ['bool', 'stream'=>'resource', 'size'=>'int'], +'func_get_arg' => ['mixed|false', 'position'=>'int'], +'func_get_args' => ['list'], +'func_num_args' => ['int'], +'function_exists' => ['bool', 'function'=>'string'], +'fwrite' => ['int|false', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], +'Fiber::__construct' => ['void', 'callback'=>'callable'], +'Fiber::start' => ['mixed', '...args'=>'mixed'], +'Fiber::resume' => ['mixed', 'value='=>'null|mixed'], +'Fiber::throw' => ['mixed', 'exception'=>'Throwable'], +'Fiber::isStarted' => ['bool'], +'Fiber::isSuspended' => ['bool'], +'Fiber::isRunning' => ['bool'], +'Fiber::isTerminated' => ['bool'], +'Fiber::getReturn' => ['mixed'], +'Fiber::getCurrent' => ['?self'], +'Fiber::suspend' => ['mixed', 'value='=>'null|mixed'], +'FiberError::__construct' => ['void'], +'gc_collect_cycles' => ['int'], +'gc_disable' => ['void'], +'gc_enable' => ['void'], +'gc_enabled' => ['bool'], +'gc_mem_caches' => ['int'], +'gc_status' => ['array{runs:int,collected:int,threshold:int,roots:int}'], +'gd_info' => ['array'], +'gearman_bugreport' => [''], +'gearman_client_add_options' => ['', 'client_object'=>'', 'option'=>''], +'gearman_client_add_server' => ['', 'client_object'=>'', 'host'=>'', 'port'=>''], +'gearman_client_add_servers' => ['', 'client_object'=>'', 'servers'=>''], +'gearman_client_add_task' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], +'gearman_client_add_task_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], +'gearman_client_add_task_high' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], +'gearman_client_add_task_high_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], +'gearman_client_add_task_low' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], +'gearman_client_add_task_low_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], +'gearman_client_add_task_status' => ['', 'client_object'=>'', 'job_handle'=>'', 'context'=>''], +'gearman_client_clear_fn' => ['', 'client_object'=>''], +'gearman_client_clone' => ['', 'client_object'=>''], +'gearman_client_context' => ['', 'client_object'=>''], +'gearman_client_create' => ['', 'client_object'=>''], +'gearman_client_do' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], +'gearman_client_do_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], +'gearman_client_do_high' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], +'gearman_client_do_high_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], +'gearman_client_do_job_handle' => ['', 'client_object'=>''], +'gearman_client_do_low' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], +'gearman_client_do_low_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], +'gearman_client_do_normal' => ['', 'client_object'=>'', 'function_name'=>'string', 'workload'=>'string', 'unique'=>'string'], +'gearman_client_do_status' => ['', 'client_object'=>''], +'gearman_client_echo' => ['', 'client_object'=>'', 'workload'=>''], +'gearman_client_errno' => ['', 'client_object'=>''], +'gearman_client_error' => ['', 'client_object'=>''], +'gearman_client_job_status' => ['', 'client_object'=>'', 'job_handle'=>''], +'gearman_client_options' => ['', 'client_object'=>''], +'gearman_client_remove_options' => ['', 'client_object'=>'', 'option'=>''], +'gearman_client_return_code' => ['', 'client_object'=>''], +'gearman_client_run_tasks' => ['', 'data'=>''], +'gearman_client_set_complete_fn' => ['', 'client_object'=>'', 'callback'=>''], +'gearman_client_set_context' => ['', 'client_object'=>'', 'context'=>''], +'gearman_client_set_created_fn' => ['', 'client_object'=>'', 'callback'=>''], +'gearman_client_set_data_fn' => ['', 'client_object'=>'', 'callback'=>''], +'gearman_client_set_exception_fn' => ['', 'client_object'=>'', 'callback'=>''], +'gearman_client_set_fail_fn' => ['', 'client_object'=>'', 'callback'=>''], +'gearman_client_set_options' => ['', 'client_object'=>'', 'option'=>''], +'gearman_client_set_status_fn' => ['', 'client_object'=>'', 'callback'=>''], +'gearman_client_set_timeout' => ['', 'client_object'=>'', 'timeout'=>''], +'gearman_client_set_warning_fn' => ['', 'client_object'=>'', 'callback'=>''], +'gearman_client_set_workload_fn' => ['', 'client_object'=>'', 'callback'=>''], +'gearman_client_timeout' => ['', 'client_object'=>''], +'gearman_client_wait' => ['', 'client_object'=>''], +'gearman_job_function_name' => ['', 'job_object'=>''], +'gearman_job_handle' => ['string'], +'gearman_job_return_code' => ['', 'job_object'=>''], +'gearman_job_send_complete' => ['', 'job_object'=>'', 'result'=>''], +'gearman_job_send_data' => ['', 'job_object'=>'', 'data'=>''], +'gearman_job_send_exception' => ['', 'job_object'=>'', 'exception'=>''], +'gearman_job_send_fail' => ['', 'job_object'=>''], +'gearman_job_send_status' => ['', 'job_object'=>'', 'numerator'=>'', 'denominator'=>''], +'gearman_job_send_warning' => ['', 'job_object'=>'', 'warning'=>''], +'gearman_job_status' => ['array', 'job_handle'=>'string'], +'gearman_job_unique' => ['', 'job_object'=>''], +'gearman_job_workload' => ['', 'job_object'=>''], +'gearman_job_workload_size' => ['', 'job_object'=>''], +'gearman_task_data' => ['', 'task_object'=>''], +'gearman_task_data_size' => ['', 'task_object'=>''], +'gearman_task_denominator' => ['', 'task_object'=>''], +'gearman_task_function_name' => ['', 'task_object'=>''], +'gearman_task_is_known' => ['', 'task_object'=>''], +'gearman_task_is_running' => ['', 'task_object'=>''], +'gearman_task_job_handle' => ['', 'task_object'=>''], +'gearman_task_numerator' => ['', 'task_object'=>''], +'gearman_task_recv_data' => ['', 'task_object'=>'', 'data_len'=>''], +'gearman_task_return_code' => ['', 'task_object'=>''], +'gearman_task_send_workload' => ['', 'task_object'=>'', 'data'=>''], +'gearman_task_unique' => ['', 'task_object'=>''], +'gearman_verbose_name' => ['', 'verbose'=>''], +'gearman_version' => [''], +'gearman_worker_add_function' => ['', 'worker_object'=>'', 'function_name'=>'', 'function'=>'', 'data'=>'', 'timeout'=>''], +'gearman_worker_add_options' => ['', 'worker_object'=>'', 'option'=>''], +'gearman_worker_add_server' => ['', 'worker_object'=>'', 'host'=>'', 'port'=>''], +'gearman_worker_add_servers' => ['', 'worker_object'=>'', 'servers'=>''], +'gearman_worker_clone' => ['', 'worker_object'=>''], +'gearman_worker_create' => [''], +'gearman_worker_echo' => ['', 'worker_object'=>'', 'workload'=>''], +'gearman_worker_errno' => ['', 'worker_object'=>''], +'gearman_worker_error' => ['', 'worker_object'=>''], +'gearman_worker_grab_job' => ['', 'worker_object'=>''], +'gearman_worker_options' => ['', 'worker_object'=>''], +'gearman_worker_register' => ['', 'worker_object'=>'', 'function_name'=>'', 'timeout'=>''], +'gearman_worker_remove_options' => ['', 'worker_object'=>'', 'option'=>''], +'gearman_worker_return_code' => ['', 'worker_object'=>''], +'gearman_worker_set_options' => ['', 'worker_object'=>'', 'option'=>''], +'gearman_worker_set_timeout' => ['', 'worker_object'=>'', 'timeout'=>''], +'gearman_worker_timeout' => ['', 'worker_object'=>''], +'gearman_worker_unregister' => ['', 'worker_object'=>'', 'function_name'=>''], +'gearman_worker_unregister_all' => ['', 'worker_object'=>''], +'gearman_worker_wait' => ['', 'worker_object'=>''], +'gearman_worker_work' => ['', 'worker_object'=>''], +'GearmanClient::__construct' => ['void'], +'GearmanClient::addOptions' => ['bool', 'options'=>'int'], +'GearmanClient::addServer' => ['bool', 'host='=>'string', 'port='=>'int'], +'GearmanClient::addServers' => ['bool', 'servers='=>'string'], +'GearmanClient::addTask' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], +'GearmanClient::addTaskBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], +'GearmanClient::addTaskHigh' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], +'GearmanClient::addTaskHighBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], +'GearmanClient::addTaskLow' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], +'GearmanClient::addTaskLowBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], +'GearmanClient::addTaskStatus' => ['GearmanTask', 'job_handle'=>'string', 'context='=>'string'], +'GearmanClient::clearCallbacks' => ['bool'], +'GearmanClient::clone' => ['GearmanClient'], +'GearmanClient::context' => ['string'], +'GearmanClient::data' => ['string'], +'GearmanClient::do' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], +'GearmanClient::doBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], +'GearmanClient::doHigh' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], +'GearmanClient::doHighBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], +'GearmanClient::doJobHandle' => ['string'], +'GearmanClient::doLow' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], +'GearmanClient::doLowBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], +'GearmanClient::doNormal' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], +'GearmanClient::doStatus' => ['array'], +'GearmanClient::echo' => ['bool', 'workload'=>'string'], +'GearmanClient::error' => ['string'], +'GearmanClient::getErrno' => ['int'], +'GearmanClient::jobStatus' => ['array', 'job_handle'=>'string'], +'GearmanClient::options' => [''], +'GearmanClient::ping' => ['bool', 'workload'=>'string'], +'GearmanClient::removeOptions' => ['bool', 'options'=>'int'], +'GearmanClient::returnCode' => ['int'], +'GearmanClient::runTasks' => ['bool'], +'GearmanClient::setClientCallback' => ['void', 'callback'=>'callable'], +'GearmanClient::setCompleteCallback' => ['bool', 'callback'=>'callable'], +'GearmanClient::setContext' => ['bool', 'context'=>'string'], +'GearmanClient::setCreatedCallback' => ['bool', 'callback'=>'string'], +'GearmanClient::setData' => ['bool', 'data'=>'string'], +'GearmanClient::setDataCallback' => ['bool', 'callback'=>'callable'], +'GearmanClient::setExceptionCallback' => ['bool', 'callback'=>'callable'], +'GearmanClient::setFailCallback' => ['bool', 'callback'=>'callable'], +'GearmanClient::setOptions' => ['bool', 'options'=>'int'], +'GearmanClient::setStatusCallback' => ['bool', 'callback'=>'callable'], +'GearmanClient::setTimeout' => ['bool', 'timeout'=>'int'], +'GearmanClient::setWarningCallback' => ['bool', 'callback'=>'callable'], +'GearmanClient::setWorkloadCallback' => ['bool', 'callback'=>'callable'], +'GearmanClient::timeout' => ['int'], +'GearmanClient::wait' => [''], +'GearmanJob::__construct' => ['void'], +'GearmanJob::complete' => ['bool', 'result'=>'string'], +'GearmanJob::data' => ['bool', 'data'=>'string'], +'GearmanJob::exception' => ['bool', 'exception'=>'string'], +'GearmanJob::fail' => ['bool'], +'GearmanJob::functionName' => ['string'], +'GearmanJob::handle' => ['string'], +'GearmanJob::returnCode' => ['int'], +'GearmanJob::sendComplete' => ['bool', 'result'=>'string'], +'GearmanJob::sendData' => ['bool', 'data'=>'string'], +'GearmanJob::sendException' => ['bool', 'exception'=>'string'], +'GearmanJob::sendFail' => ['bool'], +'GearmanJob::sendStatus' => ['bool', 'numerator'=>'int', 'denominator'=>'int'], +'GearmanJob::sendWarning' => ['bool', 'warning'=>'string'], +'GearmanJob::setReturn' => ['bool', 'gearman_return_t'=>'string'], +'GearmanJob::status' => ['bool', 'numerator'=>'int', 'denominator'=>'int'], +'GearmanJob::unique' => ['string'], +'GearmanJob::warning' => ['bool', 'warning'=>'string'], +'GearmanJob::workload' => ['string'], +'GearmanJob::workloadSize' => ['int'], +'GearmanTask::__construct' => ['void'], +'GearmanTask::create' => ['GearmanTask'], +'GearmanTask::data' => ['string|false'], +'GearmanTask::dataSize' => ['int|false'], +'GearmanTask::function' => ['string'], +'GearmanTask::functionName' => ['string'], +'GearmanTask::isKnown' => ['bool'], +'GearmanTask::isRunning' => ['bool'], +'GearmanTask::jobHandle' => ['string'], +'GearmanTask::recvData' => ['array|false', 'data_len'=>'int'], +'GearmanTask::returnCode' => ['int'], +'GearmanTask::sendData' => ['int', 'data'=>'string'], +'GearmanTask::sendWorkload' => ['int|false', 'data'=>'string'], +'GearmanTask::taskDenominator' => ['int|false'], +'GearmanTask::taskNumerator' => ['int|false'], +'GearmanTask::unique' => ['string|false'], +'GearmanTask::uuid' => ['string'], +'GearmanWorker::__construct' => ['void'], +'GearmanWorker::addFunction' => ['bool', 'function_name'=>'string', 'function'=>'callable', 'context='=>'mixed', 'timeout='=>'int'], +'GearmanWorker::addOptions' => ['bool', 'option'=>'int'], +'GearmanWorker::addServer' => ['bool', 'host='=>'string', 'port='=>'int'], +'GearmanWorker::addServers' => ['bool', 'servers'=>'string'], +'GearmanWorker::clone' => ['void'], +'GearmanWorker::echo' => ['bool', 'workload'=>'string'], +'GearmanWorker::error' => ['string'], +'GearmanWorker::getErrno' => ['int'], +'GearmanWorker::grabJob' => [''], +'GearmanWorker::options' => ['int'], +'GearmanWorker::register' => ['bool', 'function_name'=>'string', 'timeout='=>'int'], +'GearmanWorker::removeOptions' => ['bool', 'option'=>'int'], +'GearmanWorker::returnCode' => ['int'], +'GearmanWorker::setId' => ['bool', 'id'=>'string'], +'GearmanWorker::setOptions' => ['bool', 'option'=>'int'], +'GearmanWorker::setTimeout' => ['bool', 'timeout'=>'int'], +'GearmanWorker::timeout' => ['int'], +'GearmanWorker::unregister' => ['bool', 'function_name'=>'string'], +'GearmanWorker::unregisterAll' => ['bool'], +'GearmanWorker::wait' => ['bool'], +'GearmanWorker::work' => ['bool'], +'Gender\Gender::__construct' => ['void', 'dsn='=>'string'], +'Gender\Gender::connect' => ['bool', 'dsn'=>'string'], +'Gender\Gender::country' => ['array', 'country'=>'int'], +'Gender\Gender::get' => ['int', 'name'=>'string', 'country='=>'int'], +'Gender\Gender::isNick' => ['array', 'name0'=>'string', 'name1'=>'string', 'country='=>'int'], +'Gender\Gender::similarNames' => ['array', 'name'=>'string', 'country='=>'int'], +'Generator::__wakeup' => ['void'], +'Generator::current' => ['mixed'], +'Generator::getReturn' => ['mixed'], +'Generator::key' => ['mixed'], +'Generator::next' => ['void'], +'Generator::rewind' => ['void'], +'Generator::send' => ['mixed', 'value'=>'mixed'], +'Generator::throw' => ['mixed', 'exception'=>'Exception|Throwable'], +'Generator::valid' => ['bool'], +'geoip_asnum_by_name' => ['string|false', 'hostname'=>'string'], +'geoip_continent_code_by_name' => ['string|false', 'hostname'=>'string'], +'geoip_country_code3_by_name' => ['string|false', 'hostname'=>'string'], +'geoip_country_code_by_name' => ['string|false', 'hostname'=>'string'], +'geoip_country_name_by_name' => ['string|false', 'hostname'=>'string'], +'geoip_database_info' => ['string', 'database='=>'int'], +'geoip_db_avail' => ['bool', 'database'=>'int'], +'geoip_db_filename' => ['string', 'database'=>'int'], +'geoip_db_get_all_info' => ['array'], +'geoip_domain_by_name' => ['string', 'hostname'=>'string'], +'geoip_id_by_name' => ['int', 'hostname'=>'string'], +'geoip_isp_by_name' => ['string|false', 'hostname'=>'string'], +'geoip_netspeedcell_by_name' => ['string|false', 'hostname'=>'string'], +'geoip_org_by_name' => ['string|false', 'hostname'=>'string'], +'geoip_record_by_name' => ['array|false', 'hostname'=>'string'], +'geoip_region_by_name' => ['array|false', 'hostname'=>'string'], +'geoip_region_name_by_code' => ['string|false', 'country_code'=>'string', 'region_code'=>'string'], +'geoip_setup_custom_directory' => ['void', 'path'=>'string'], +'geoip_time_zone_by_country_and_region' => ['string|false', 'country_code'=>'string', 'region_code='=>'string'], +'GEOSGeometry::__toString' => ['string'], +'GEOSGeometry::project' => ['float', 'other'=>'GEOSGeometry', 'normalized'=>'bool'], +'GEOSGeometry::interpolate' => ['GEOSGeometry', 'dist'=>'float', 'normalized'=>'bool'], +'GEOSGeometry::buffer' => ['GEOSGeometry', 'dist'=>'float', 'styleArray='=>'array'], +'GEOSGeometry::offsetCurve' => ['GEOSGeometry', 'dist'=>'float', 'styleArray'=>'array'], +'GEOSGeometry::envelope' => ['GEOSGeometry'], +'GEOSGeometry::intersection' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::convexHull' => ['GEOSGeometry'], +'GEOSGeometry::difference' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::symDifference' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::boundary' => ['GEOSGeometry'], +'GEOSGeometry::union' => ['GEOSGeometry', 'otherGeom='=>'GEOSGeometry'], +'GEOSGeometry::pointOnSurface' => ['GEOSGeometry'], +'GEOSGeometry::centroid' => ['GEOSGeometry'], +'GEOSGeometry::relate' => ['string|bool', 'otherGeom'=>'GEOSGeometry', 'pattern'=>'string'], +'GEOSGeometry::relateBoundaryNodeRule' => ['string', 'otherGeom'=>'GEOSGeometry', 'rule'=>'int'], +'GEOSGeometry::simplify' => ['GEOSGeometry', 'tolerance'=>'float', 'preserveTopology='=>'bool'], +'GEOSGeometry::normalize' => ['GEOSGeometry'], +'GEOSGeometry::extractUniquePoints' => ['GEOSGeometry'], +'GEOSGeometry::disjoint' => ['bool', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::touches' => ['bool', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::intersects' => ['bool', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::crosses' => ['bool', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::within' => ['bool', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::contains' => ['bool', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::overlaps' => ['bool', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::covers' => ['bool', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::coveredBy' => ['bool', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::equals' => ['bool', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::equalsExact' => ['bool', 'geom'=>'GEOSGeometry', 'tolerance'=>'float'], +'GEOSGeometry::isEmpty' => ['bool'], +'GEOSGeometry::checkValidity' => ['array{valid: bool, reason?: string, location?: GEOSGeometry}'], +'GEOSGeometry::isSimple' => ['bool'], +'GEOSGeometry::isRing' => ['bool'], +'GEOSGeometry::hasZ' => ['bool'], +'GEOSGeometry::isClosed' => ['bool'], +'GEOSGeometry::typeName' => ['string'], +'GEOSGeometry::typeId' => ['int'], +'GEOSGeometry::getSRID' => ['int'], +'GEOSGeometry::setSRID' => ['void', 'srid'=>'int'], +'GEOSGeometry::numGeometries' => ['int'], +'GEOSGeometry::geometryN' => ['GEOSGeometry', 'num'=>'int'], +'GEOSGeometry::numInteriorRings' => ['int'], +'GEOSGeometry::numPoints' => ['int'], +'GEOSGeometry::getX' => ['float'], +'GEOSGeometry::getY' => ['float'], +'GEOSGeometry::interiorRingN' => ['GEOSGeometry', 'num'=>'int'], +'GEOSGeometry::exteriorRing' => ['GEOSGeometry'], +'GEOSGeometry::numCoordinates' => ['int'], +'GEOSGeometry::dimension' => ['int'], +'GEOSGeometry::coordinateDimension' => ['int'], +'GEOSGeometry::pointN' => ['GEOSGeometry', 'num'=>'int'], +'GEOSGeometry::startPoint' => ['GEOSGeometry'], +'GEOSGeometry::endPoint' => ['GEOSGeometry'], +'GEOSGeometry::area' => ['float'], +'GEOSGeometry::length' => ['float'], +'GEOSGeometry::distance' => ['float', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::hausdorffDistance' => ['float', 'geom'=>'GEOSGeometry'], +'GEOSGeometry::snapTo' => ['GEOSGeometry', 'geom'=>'GEOSGeometry', 'tolerance'=>'float'], +'GEOSGeometry::node' => ['GEOSGeometry'], +'GEOSGeometry::delaunayTriangulation' => ['GEOSGeometry', 'tolerance'=>'float', 'onlyEdges'=>'bool'], +'GEOSGeometry::voronoiDiagram' => ['GEOSGeometry', 'tolerance'=>'float', 'onlyEdges'=>'bool', 'extent'=>'GEOSGeometry|null'], +'GEOSLineMerge' => ['array', 'geom'=>'GEOSGeometry'], +'GEOSPolygonize' => ['array{rings: GEOSGeometry[], cut_edges?: GEOSGeometry[], dangles: GEOSGeometry[], invalid_rings: GEOSGeometry[]}', 'geom'=>'GEOSGeometry'], +'GEOSRelateMatch' => ['bool', 'matrix'=>'string', 'pattern'=>'string'], +'GEOSSharedPaths' => ['GEOSGeometry', 'geom1'=>'GEOSGeometry', 'geom2'=>'GEOSGeometry'], +'GEOSVersion' => ['string'], +'GEOSWKBReader::__construct' => ['void'], +'GEOSWKBReader::read' => ['GEOSGeometry', 'wkb'=>'string'], +'GEOSWKBReader::readHEX' => ['GEOSGeometry', 'wkb'=>'string'], +'GEOSWKBWriter::__construct' => ['void'], +'GEOSWKBWriter::getOutputDimension' => ['int'], +'GEOSWKBWriter::setOutputDimension' => ['void', 'dim'=>'int'], +'GEOSWKBWriter::getByteOrder' => ['int'], +'GEOSWKBWriter::setByteOrder' => ['void', 'byteOrder'=>'int'], +'GEOSWKBWriter::getIncludeSRID' => ['bool'], +'GEOSWKBWriter::setIncludeSRID' => ['void', 'inc'=>'bool'], +'GEOSWKBWriter::write' => ['string', 'geom'=>'GEOSGeometry'], +'GEOSWKBWriter::writeHEX' => ['string', 'geom'=>'GEOSGeometry'], +'GEOSWKTReader::__construct' => ['void'], +'GEOSWKTReader::read' => ['GEOSGeometry', 'wkt'=>'string'], +'GEOSWKTWriter::__construct' => ['void'], +'GEOSWKTWriter::write' => ['string', 'geom'=>'GEOSGeometry'], +'GEOSWKTWriter::setTrim' => ['void', 'trim'=>'bool'], +'GEOSWKTWriter::setRoundingPrecision' => ['void', 'prec'=>'int'], +'GEOSWKTWriter::setOutputDimension' => ['void', 'dim'=>'int'], +'GEOSWKTWriter::getOutputDimension' => ['int'], +'GEOSWKTWriter::setOld3D' => ['void', 'val'=>'bool'], +'get_browser' => ['array|object|false', 'user_agent='=>'?string', 'return_array='=>'bool'], +'get_call_stack' => [''], +'get_called_class' => ['class-string'], +'get_cfg_var' => ['string|false', 'option'=>'string'], +'get_class' => ['class-string', 'object='=>'object'], +'get_class_methods' => ['list', 'object_or_class'=>'object|class-string'], +'get_class_vars' => ['array', 'class'=>'string'], +'get_current_user' => ['string'], +'get_debug_type' => ['string', 'value'=>'mixed'], +'get_declared_classes' => ['list'], +'get_declared_interfaces' => ['list'], +'get_declared_traits' => ['list|null'], +'get_defined_constants' => ['array', 'categorize='=>'bool'], +'get_defined_functions' => ['array>', 'exclude_disabled='=>'bool'], +'get_defined_vars' => ['array'], +'get_extension_funcs' => ['list|false', 'extension'=>'string'], +'get_headers' => ['array|false', 'url'=>'string', 'associative='=>'int', 'context='=>'resource'], +'get_html_translation_table' => ['array', 'table='=>'int', 'flags='=>'int', 'encoding='=>'string'], +'get_include_path' => ['string'], +'get_included_files' => ['list'], +'get_loaded_extensions' => ['list', 'zend_extensions='=>'bool'], +'get_magic_quotes_gpc' => ['int|false'], +'get_magic_quotes_runtime' => ['int|false'], +'get_meta_tags' => ['array', 'filename'=>'string', 'use_include_path='=>'bool'], +'get_object_vars' => ['array', 'object'=>'object'], +'get_parent_class' => ['class-string|false', 'object_or_class='=>'object|class-string'], +'get_required_files' => ['list'], +'get_resource_id' => ['int', 'resource'=>'resource'], +'get_resource_type' => ['string', 'resource'=>'resource'], +'get_resources' => ['array', 'type='=>'string'], +'getallheaders' => ['array|false'], +'getcwd' => ['string|false'], +'getdate' => ['array{seconds: int<0, 59>, minutes: int<0, 59>, hours: int<0, 23>, mday: int<1, 31>, wday: int<0, 6>, mon: int<1, 12>, year: int, yday: int<0, 365>, weekday: "Monday"|"Tuesday"|"Wednesday"|"Thursday"|"Friday"|"Saturday"|"Sunday", month: "January"|"February"|"March"|"April"|"May"|"June"|"July"|"August"|"September"|"October"|"November"|"December", 0: int}', 'timestamp='=>'int'], +'getenv' => ['string|false', 'name'=>'string', 'local_only='=>'bool'], +'getenv\'1' => ['array'], +'gethostbyaddr' => ['string|false', 'ip'=>'string'], +'gethostbyname' => ['string', 'hostname'=>'string'], +'gethostbynamel' => ['list|false', 'hostname'=>'string'], +'gethostname' => ['string|false'], +'getimagesize' => ['array|false', 'filename'=>'string', '&w_image_info='=>'array'], +'getimagesizefromstring' => ['array|false', 'string'=>'string', '&w_image_info='=>'array'], +'getlastmod' => ['int|false'], +'getmxrr' => ['bool', 'hostname'=>'string', '&w_hosts'=>'array', '&w_weights='=>'array'], +'getmygid' => ['int|false'], +'getmyinode' => ['int|false'], +'getmypid' => ['int|false'], +'getmyuid' => ['int|false'], +'getopt' => ['array|array|array>|false', 'short_options'=>'string', 'long_options='=>'array', '&w_rest_index='=>'int'], +'getprotobyname' => ['int|false', 'protocol'=>'string'], +'getprotobynumber' => ['string', 'protocol'=>'int'], +'getrandmax' => ['int'], +'getrusage' => ['array', 'mode='=>'int'], +'getservbyname' => ['int|false', 'service'=>'string', 'protocol'=>'string'], +'getservbyport' => ['string|false', 'port'=>'int', 'protocol'=>'string'], +'gettext' => ['string', 'message'=>'string'], +'gettimeofday' => ['array'], +'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::count' => ['int'], +'GlobIterator::current' => ['FilesystemIterator|SplFileInfo|string'], +'GlobIterator::getATime' => [''], +'GlobIterator::getBasename' => ['', 'suffix='=>'string'], +'GlobIterator::getCTime' => [''], +'GlobIterator::getExtension' => [''], +'GlobIterator::getFileInfo' => [''], +'GlobIterator::getFilename' => [''], +'GlobIterator::getFlags' => ['int'], +'GlobIterator::getGroup' => [''], +'GlobIterator::getInode' => [''], +'GlobIterator::getLinkTarget' => [''], +'GlobIterator::getMTime' => [''], +'GlobIterator::getOwner' => [''], +'GlobIterator::getPath' => [''], +'GlobIterator::getPathInfo' => [''], +'GlobIterator::getPathname' => [''], +'GlobIterator::getPerms' => [''], +'GlobIterator::getRealPath' => [''], +'GlobIterator::getSize' => [''], +'GlobIterator::getType' => [''], +'GlobIterator::isDir' => [''], +'GlobIterator::isDot' => [''], +'GlobIterator::isExecutable' => [''], +'GlobIterator::isFile' => [''], +'GlobIterator::isLink' => [''], +'GlobIterator::isReadable' => [''], +'GlobIterator::isWritable' => [''], +'GlobIterator::key' => ['string'], +'GlobIterator::next' => ['void'], +'GlobIterator::openFile' => [''], +'GlobIterator::rewind' => ['void'], +'GlobIterator::seek' => ['void', 'position'=>'int'], +'GlobIterator::setFileClass' => [''], +'GlobIterator::setFlags' => ['void', 'flags='=>'int'], +'GlobIterator::setInfoClass' => [''], +'GlobIterator::valid' => [''], +'Gmagick::__construct' => ['void', 'filename='=>'string'], +'Gmagick::addimage' => ['Gmagick', 'gmagick'=>'gmagick'], +'Gmagick::addnoiseimage' => ['Gmagick', 'noise'=>'int'], +'Gmagick::annotateimage' => ['Gmagick', 'gmagickdraw'=>'gmagickdraw', 'x'=>'float', 'y'=>'float', 'angle'=>'float', 'text'=>'string'], +'Gmagick::blurimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], +'Gmagick::borderimage' => ['Gmagick', 'color'=>'gmagickpixel', 'width'=>'int', 'height'=>'int'], +'Gmagick::charcoalimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float'], +'Gmagick::chopimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], +'Gmagick::clear' => ['Gmagick'], +'Gmagick::commentimage' => ['Gmagick', 'comment'=>'string'], +'Gmagick::compositeimage' => ['Gmagick', 'source'=>'gmagick', 'compose'=>'int', 'x'=>'int', 'y'=>'int'], +'Gmagick::cropimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], +'Gmagick::cropthumbnailimage' => ['Gmagick', 'width'=>'int', 'height'=>'int'], +'Gmagick::current' => ['Gmagick'], +'Gmagick::cyclecolormapimage' => ['Gmagick', 'displace'=>'int'], +'Gmagick::deconstructimages' => ['Gmagick'], +'Gmagick::despeckleimage' => ['Gmagick'], +'Gmagick::destroy' => ['bool'], +'Gmagick::drawimage' => ['Gmagick', 'gmagickdraw'=>'gmagickdraw'], +'Gmagick::edgeimage' => ['Gmagick', 'radius'=>'float'], +'Gmagick::embossimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float'], +'Gmagick::enhanceimage' => ['Gmagick'], +'Gmagick::equalizeimage' => ['Gmagick'], +'Gmagick::flipimage' => ['Gmagick'], +'Gmagick::flopimage' => ['Gmagick'], +'Gmagick::frameimage' => ['Gmagick', 'color'=>'gmagickpixel', 'width'=>'int', 'height'=>'int', 'inner_bevel'=>'int', 'outer_bevel'=>'int'], +'Gmagick::gammaimage' => ['Gmagick', 'gamma'=>'float'], +'Gmagick::getcopyright' => ['string'], +'Gmagick::getfilename' => ['string'], +'Gmagick::getimagebackgroundcolor' => ['GmagickPixel'], +'Gmagick::getimageblueprimary' => ['array'], +'Gmagick::getimagebordercolor' => ['GmagickPixel'], +'Gmagick::getimagechanneldepth' => ['int', 'channel_type'=>'int'], +'Gmagick::getimagecolors' => ['int'], +'Gmagick::getimagecolorspace' => ['int'], +'Gmagick::getimagecompose' => ['int'], +'Gmagick::getimagedelay' => ['int'], +'Gmagick::getimagedepth' => ['int'], +'Gmagick::getimagedispose' => ['int'], +'Gmagick::getimageextrema' => ['array'], +'Gmagick::getimagefilename' => ['string'], +'Gmagick::getimageformat' => ['string'], +'Gmagick::getimagegamma' => ['float'], +'Gmagick::getimagegreenprimary' => ['array'], +'Gmagick::getimageheight' => ['int'], +'Gmagick::getimagehistogram' => ['array'], +'Gmagick::getimageindex' => ['int'], +'Gmagick::getimageinterlacescheme' => ['int'], +'Gmagick::getimageiterations' => ['int'], +'Gmagick::getimagematte' => ['int'], +'Gmagick::getimagemattecolor' => ['GmagickPixel'], +'Gmagick::getimageprofile' => ['string', 'name'=>'string'], +'Gmagick::getimageredprimary' => ['array'], +'Gmagick::getimagerenderingintent' => ['int'], +'Gmagick::getimageresolution' => ['array'], +'Gmagick::getimagescene' => ['int'], +'Gmagick::getimagesignature' => ['string'], +'Gmagick::getimagetype' => ['int'], +'Gmagick::getimageunits' => ['int'], +'Gmagick::getimagewhitepoint' => ['array'], +'Gmagick::getimagewidth' => ['int'], +'Gmagick::getpackagename' => ['string'], +'Gmagick::getquantumdepth' => ['array'], +'Gmagick::getreleasedate' => ['string'], +'Gmagick::getsamplingfactors' => ['array'], +'Gmagick::getsize' => ['array'], +'Gmagick::getversion' => ['array'], +'Gmagick::hasnextimage' => ['bool'], +'Gmagick::haspreviousimage' => ['bool'], +'Gmagick::implodeimage' => ['mixed', 'radius'=>'float'], +'Gmagick::labelimage' => ['mixed', 'label'=>'string'], +'Gmagick::levelimage' => ['mixed', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'int'], +'Gmagick::magnifyimage' => ['mixed'], +'Gmagick::mapimage' => ['Gmagick', 'gmagick'=>'gmagick', 'dither'=>'bool'], +'Gmagick::medianfilterimage' => ['void', 'radius'=>'float'], +'Gmagick::minifyimage' => ['Gmagick'], +'Gmagick::modulateimage' => ['Gmagick', 'brightness'=>'float', 'saturation'=>'float', 'hue'=>'float'], +'Gmagick::motionblurimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float'], +'Gmagick::newimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'background'=>'string', 'format='=>'string'], +'Gmagick::nextimage' => ['bool'], +'Gmagick::normalizeimage' => ['Gmagick', 'channel='=>'int'], +'Gmagick::oilpaintimage' => ['Gmagick', 'radius'=>'float'], +'Gmagick::previousimage' => ['bool'], +'Gmagick::profileimage' => ['Gmagick', 'name'=>'string', 'profile'=>'string'], +'Gmagick::quantizeimage' => ['Gmagick', 'numcolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], +'Gmagick::quantizeimages' => ['Gmagick', 'numcolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], +'Gmagick::queryfontmetrics' => ['array', 'draw'=>'gmagickdraw', 'text'=>'string'], +'Gmagick::queryfonts' => ['array', 'pattern='=>'string'], +'Gmagick::queryformats' => ['array', 'pattern='=>'string'], +'Gmagick::radialblurimage' => ['Gmagick', 'angle'=>'float', 'channel='=>'int'], +'Gmagick::raiseimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int', 'raise'=>'bool'], +'Gmagick::read' => ['Gmagick', 'filename'=>'string'], +'Gmagick::readimage' => ['Gmagick', 'filename'=>'string'], +'Gmagick::readimageblob' => ['Gmagick', 'imagecontents'=>'string', 'filename='=>'string'], +'Gmagick::readimagefile' => ['Gmagick', 'fp'=>'resource', 'filename='=>'string'], +'Gmagick::reducenoiseimage' => ['Gmagick', 'radius'=>'float'], +'Gmagick::removeimage' => ['Gmagick'], +'Gmagick::removeimageprofile' => ['string', 'name'=>'string'], +'Gmagick::resampleimage' => ['Gmagick', 'xresolution'=>'float', 'yresolution'=>'float', 'filter'=>'int', 'blur'=>'float'], +'Gmagick::resizeimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'filter'=>'int', 'blur'=>'float', 'fit='=>'bool'], +'Gmagick::rollimage' => ['Gmagick', 'x'=>'int', 'y'=>'int'], +'Gmagick::rotateimage' => ['Gmagick', 'color'=>'mixed', 'degrees'=>'float'], +'Gmagick::scaleimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'fit='=>'bool'], +'Gmagick::separateimagechannel' => ['Gmagick', 'channel'=>'int'], +'Gmagick::setCompressionQuality' => ['Gmagick', 'quality'=>'int'], +'Gmagick::setfilename' => ['Gmagick', 'filename'=>'string'], +'Gmagick::setimagebackgroundcolor' => ['Gmagick', 'color'=>'gmagickpixel'], +'Gmagick::setimageblueprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], +'Gmagick::setimagebordercolor' => ['Gmagick', 'color'=>'gmagickpixel'], +'Gmagick::setimagechanneldepth' => ['Gmagick', 'channel'=>'int', 'depth'=>'int'], +'Gmagick::setimagecolorspace' => ['Gmagick', 'colorspace'=>'int'], +'Gmagick::setimagecompose' => ['Gmagick', 'composite'=>'int'], +'Gmagick::setimagedelay' => ['Gmagick', 'delay'=>'int'], +'Gmagick::setimagedepth' => ['Gmagick', 'depth'=>'int'], +'Gmagick::setimagedispose' => ['Gmagick', 'disposetype'=>'int'], +'Gmagick::setimagefilename' => ['Gmagick', 'filename'=>'string'], +'Gmagick::setimageformat' => ['Gmagick', 'imageformat'=>'string'], +'Gmagick::setimagegamma' => ['Gmagick', 'gamma'=>'float'], +'Gmagick::setimagegreenprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], +'Gmagick::setimageindex' => ['Gmagick', 'index'=>'int'], +'Gmagick::setimageinterlacescheme' => ['Gmagick', 'interlace'=>'int'], +'Gmagick::setimageiterations' => ['Gmagick', 'iterations'=>'int'], +'Gmagick::setimageprofile' => ['Gmagick', 'name'=>'string', 'profile'=>'string'], +'Gmagick::setimageredprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], +'Gmagick::setimagerenderingintent' => ['Gmagick', 'rendering_intent'=>'int'], +'Gmagick::setimageresolution' => ['Gmagick', 'xresolution'=>'float', 'yresolution'=>'float'], +'Gmagick::setimagescene' => ['Gmagick', 'scene'=>'int'], +'Gmagick::setimagetype' => ['Gmagick', 'imgtype'=>'int'], +'Gmagick::setimageunits' => ['Gmagick', 'resolution'=>'int'], +'Gmagick::setimagewhitepoint' => ['Gmagick', 'x'=>'float', 'y'=>'float'], +'Gmagick::setsamplingfactors' => ['Gmagick', 'factors'=>'array'], +'Gmagick::setsize' => ['Gmagick', 'columns'=>'int', 'rows'=>'int'], +'Gmagick::shearimage' => ['Gmagick', 'color'=>'mixed', 'xshear'=>'float', 'yshear'=>'float'], +'Gmagick::solarizeimage' => ['Gmagick', 'threshold'=>'int'], +'Gmagick::spreadimage' => ['Gmagick', 'radius'=>'float'], +'Gmagick::stripimage' => ['Gmagick'], +'Gmagick::swirlimage' => ['Gmagick', 'degrees'=>'float'], +'Gmagick::thumbnailimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'fit='=>'bool'], +'Gmagick::trimimage' => ['Gmagick', 'fuzz'=>'float'], +'Gmagick::write' => ['Gmagick', 'filename'=>'string'], +'Gmagick::writeimage' => ['Gmagick', 'filename'=>'string', 'all_frames='=>'bool'], +'GmagickDraw::annotate' => ['GmagickDraw', 'x'=>'float', 'y'=>'float', 'text'=>'string'], +'GmagickDraw::arc' => ['GmagickDraw', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float', 'sd'=>'float', 'ed'=>'float'], +'GmagickDraw::bezier' => ['GmagickDraw', 'coordinate_array'=>'array'], +'GmagickDraw::ellipse' => ['GmagickDraw', 'ox'=>'float', 'oy'=>'float', 'rx'=>'float', 'ry'=>'float', 'start'=>'float', 'end'=>'float'], +'GmagickDraw::getfillcolor' => ['GmagickPixel'], +'GmagickDraw::getfillopacity' => ['float'], +'GmagickDraw::getfont' => ['string|false'], +'GmagickDraw::getfontsize' => ['float'], +'GmagickDraw::getfontstyle' => ['int'], +'GmagickDraw::getfontweight' => ['int'], +'GmagickDraw::getstrokecolor' => ['GmagickPixel'], +'GmagickDraw::getstrokeopacity' => ['float'], +'GmagickDraw::getstrokewidth' => ['float'], +'GmagickDraw::gettextdecoration' => ['int'], +'GmagickDraw::gettextencoding' => ['string|false'], +'GmagickDraw::line' => ['GmagickDraw', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float'], +'GmagickDraw::point' => ['GmagickDraw', 'x'=>'float', 'y'=>'float'], +'GmagickDraw::polygon' => ['GmagickDraw', 'coordinates'=>'array'], +'GmagickDraw::polyline' => ['GmagickDraw', 'coordinate_array'=>'array'], +'GmagickDraw::rectangle' => ['GmagickDraw', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], +'GmagickDraw::rotate' => ['GmagickDraw', 'degrees'=>'float'], +'GmagickDraw::roundrectangle' => ['GmagickDraw', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'rx'=>'float', 'ry'=>'float'], +'GmagickDraw::scale' => ['GmagickDraw', 'x'=>'float', 'y'=>'float'], +'GmagickDraw::setfillcolor' => ['GmagickDraw', 'color'=>'string'], +'GmagickDraw::setfillopacity' => ['GmagickDraw', 'fill_opacity'=>'float'], +'GmagickDraw::setfont' => ['GmagickDraw', 'font'=>'string'], +'GmagickDraw::setfontsize' => ['GmagickDraw', 'pointsize'=>'float'], +'GmagickDraw::setfontstyle' => ['GmagickDraw', 'style'=>'int'], +'GmagickDraw::setfontweight' => ['GmagickDraw', 'weight'=>'int'], +'GmagickDraw::setstrokecolor' => ['GmagickDraw', 'color'=>'gmagickpixel'], +'GmagickDraw::setstrokeopacity' => ['GmagickDraw', 'stroke_opacity'=>'float'], +'GmagickDraw::setstrokewidth' => ['GmagickDraw', 'width'=>'float'], +'GmagickDraw::settextdecoration' => ['GmagickDraw', 'decoration'=>'int'], +'GmagickDraw::settextencoding' => ['GmagickDraw', 'encoding'=>'string'], +'GmagickPixel::__construct' => ['void', 'color='=>'string'], +'GmagickPixel::getcolor' => ['mixed', 'as_array='=>'bool', 'normalize_array='=>'bool'], +'GmagickPixel::getcolorcount' => ['int'], +'GmagickPixel::getcolorvalue' => ['float', 'color'=>'int'], +'GmagickPixel::setcolor' => ['GmagickPixel', 'color'=>'string'], +'GmagickPixel::setcolorvalue' => ['GmagickPixel', 'color'=>'int', 'value'=>'float'], +'gmdate' => ['string', 'format'=>'string', 'timestamp='=>'int|null'], +'gmmktime' => ['int|false', 'hour'=>'int', 'minute='=>'int|null', 'second='=>'int|null', 'month='=>'int|null', 'day='=>'int|null', 'year='=>'int|null'], +'GMP::__construct' => ['void'], +'GMP::__toString' => ['numeric-string'], +'GMP::serialize' => ['string'], +'GMP::unserialize' => ['void', 'serialized'=>'string'], +'gmp_abs' => ['GMP', 'num'=>'GMP|string|int'], +'gmp_add' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_and' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_binomial' => ['GMP', 'n'=>'GMP|string|int', 'k'=>'int'], +'gmp_clrbit' => ['void', 'num'=>'GMP|string|int', 'index'=>'int'], +'gmp_cmp' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_com' => ['GMP', 'num'=>'GMP|string|int'], +'gmp_div' => ['GMP', 'num1'=>'GMP|resource|string', 'num2'=>'GMP|resource|string', 'rounding_mode='=>'int'], +'gmp_div_q' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], +'gmp_div_qr' => ['array{0: GMP, 1: GMP}', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], +'gmp_div_r' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], +'gmp_divexact' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_export' => ['string|false', 'num'=>'GMP|string|int', 'word_size='=>'int', 'flags='=>'int'], +'gmp_fact' => ['GMP', 'num'=>'int'], +'gmp_gcd' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_gcdext' => ['array', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_hamdist' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_import' => ['GMP|false', 'data'=>'string', 'word_size='=>'int', 'flags='=>'int'], +'gmp_init' => ['GMP', 'num'=>'int|string', 'base='=>'int'], +'gmp_intval' => ['int', 'num'=>'GMP|string|int'], +'gmp_invert' => ['GMP|false', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_jacobi' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_kronecker' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_lcm' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_legendre' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_mod' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_mul' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_neg' => ['GMP', 'num'=>'GMP|string|int'], +'gmp_nextprime' => ['GMP', 'num'=>'GMP|string|int'], +'gmp_or' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_perfect_power' => ['bool', 'num'=>'GMP|string|int'], +'gmp_perfect_square' => ['bool', 'num'=>'GMP|string|int'], +'gmp_popcount' => ['int', 'num'=>'GMP|string|int'], +'gmp_pow' => ['GMP', 'num'=>'GMP|string|int', 'exponent'=>'int'], +'gmp_powm' => ['GMP', 'num'=>'GMP|string|int', 'exponent'=>'GMP|string|int', 'modulus'=>'GMP|string|int'], +'gmp_prob_prime' => ['int', 'num'=>'GMP|string|int', 'repetitions='=>'int'], +'gmp_random_bits' => ['GMP', 'bits'=>'int'], +'gmp_random_range' => ['GMP', 'min'=>'GMP|string|int', 'max'=>'GMP|string|int'], +'gmp_random_seed' => ['void', 'seed'=>'GMP|string|int'], +'gmp_root' => ['GMP', 'num'=>'GMP|string|int', 'nth'=>'int'], +'gmp_rootrem' => ['array{0: GMP, 1: GMP}', 'num'=>'GMP|string|int', 'nth'=>'int'], +'gmp_scan0' => ['int', 'num1'=>'GMP|string|int', 'start'=>'int'], +'gmp_scan1' => ['int', 'num1'=>'GMP|string|int', 'start'=>'int'], +'gmp_setbit' => ['void', 'num'=>'GMP|string|int', 'index'=>'int', 'value='=>'bool'], +'gmp_sign' => ['int', 'num'=>'GMP|string|int'], +'gmp_sqrt' => ['GMP', 'num'=>'GMP|string|int'], +'gmp_sqrtrem' => ['array{0: GMP, 1: GMP}', 'num'=>'GMP|string|int'], +'gmp_strval' => ['numeric-string', 'num'=>'GMP|string|int', 'base='=>'int'], +'gmp_sub' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmp_testbit' => ['bool', 'num'=>'GMP|string|int', 'index'=>'int'], +'gmp_xor' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], +'gmstrftime' => ['string|false', 'format'=>'string', 'timestamp='=>'?int'], +'gnupg::adddecryptkey' => ['bool', 'fingerprint'=>'string', 'passphrase'=>'string'], +'gnupg::addencryptkey' => ['bool', 'fingerprint'=>'string'], +'gnupg::addsignkey' => ['bool', 'fingerprint'=>'string', 'passphrase='=>'string'], +'gnupg::cleardecryptkeys' => ['bool'], +'gnupg::clearencryptkeys' => ['bool'], +'gnupg::clearsignkeys' => ['bool'], +'gnupg::decrypt' => ['string|false', 'text'=>'string'], +'gnupg::decryptverify' => ['array|false', 'text'=>'string', '&plaintext'=>'string'], +'gnupg::encrypt' => ['string|false', 'plaintext'=>'string'], +'gnupg::encryptsign' => ['string|false', 'plaintext'=>'string'], +'gnupg::export' => ['string|false', 'fingerprint'=>'string'], +'gnupg::geterror' => ['string|false'], +'gnupg::getprotocol' => ['int'], +'gnupg::import' => ['array|false', 'keydata'=>'string'], +'gnupg::init' => ['resource'], +'gnupg::keyinfo' => ['array', 'pattern'=>'string'], +'gnupg::setarmor' => ['bool', 'armor'=>'int'], +'gnupg::seterrormode' => ['void', 'errormode'=>'int'], +'gnupg::setsignmode' => ['bool', 'signmode'=>'int'], +'gnupg::sign' => ['string|false', 'plaintext'=>'string'], +'gnupg::verify' => ['array|false', 'signed_text'=>'string', 'signature'=>'string', '&plaintext='=>'string'], +'gnupg_adddecryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase'=>'string'], +'gnupg_addencryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string'], +'gnupg_addsignkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase='=>'string'], +'gnupg_cleardecryptkeys' => ['bool', 'identifier'=>'resource'], +'gnupg_clearencryptkeys' => ['bool', 'identifier'=>'resource'], +'gnupg_clearsignkeys' => ['bool', 'identifier'=>'resource'], +'gnupg_decrypt' => ['string', 'identifier'=>'resource', 'text'=>'string'], +'gnupg_decryptverify' => ['array', 'identifier'=>'resource', 'text'=>'string', 'plaintext'=>'string'], +'gnupg_encrypt' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], +'gnupg_encryptsign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], +'gnupg_export' => ['string', 'identifier'=>'resource', 'fingerprint'=>'string'], +'gnupg_geterror' => ['string', 'identifier'=>'resource'], +'gnupg_getprotocol' => ['int', 'identifier'=>'resource'], +'gnupg_import' => ['array', 'identifier'=>'resource', 'keydata'=>'string'], +'gnupg_init' => ['resource'], +'gnupg_keyinfo' => ['array', 'identifier'=>'resource', 'pattern'=>'string'], +'gnupg_setarmor' => ['bool', 'identifier'=>'resource', 'armor'=>'int'], +'gnupg_seterrormode' => ['void', 'identifier'=>'resource', 'errormode'=>'int'], +'gnupg_setsignmode' => ['bool', 'identifier'=>'resource', 'signmode'=>'int'], +'gnupg_sign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], +'gnupg_verify' => ['array', 'identifier'=>'resource', 'signed_text'=>'string', 'signature'=>'string', 'plaintext='=>'string'], +'gopher_parsedir' => ['array', 'dirent'=>'string'], +'grapheme_extract' => ['string|false', 'haystack'=>'string', 'size'=>'int', 'type='=>'int', 'offset='=>'int', '&w_next='=>'int'], +'grapheme_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], +'grapheme_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'beforeNeedle='=>'bool'], +'grapheme_strlen' => ['0|positive-int|false|null', 'string'=>'string'], +'grapheme_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], +'grapheme_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], +'grapheme_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], +'grapheme_strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'beforeNeedle='=>'bool'], +'grapheme_substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int'], +'gregoriantojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], +'gridObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'Grpc\Call::__construct' => ['void', 'channel'=>'Grpc\Channel', 'method'=>'string', 'absolute_deadline'=>'Grpc\Timeval', 'host_override='=>'mixed'], +'Grpc\Call::cancel' => [''], +'Grpc\Call::getPeer' => ['string'], +'Grpc\Call::setCredentials' => ['int', 'creds_obj'=>'Grpc\CallCredentials'], +'Grpc\Call::startBatch' => ['object', 'batch'=>'array'], +'Grpc\CallCredentials::createComposite' => ['Grpc\CallCredentials', 'cred1'=>'Grpc\CallCredentials', 'cred2'=>'Grpc\CallCredentials'], +'Grpc\CallCredentials::createFromPlugin' => ['Grpc\CallCredentials', 'callback'=>'Closure'], +'Grpc\Channel::__construct' => ['void', 'target'=>'string', 'args='=>'array'], +'Grpc\Channel::close' => [''], +'Grpc\Channel::getConnectivityState' => ['int', 'try_to_connect='=>'bool'], +'Grpc\Channel::getTarget' => ['string'], +'Grpc\Channel::watchConnectivityState' => ['bool', 'last_state'=>'int', 'deadline_obj'=>'Grpc\Timeval'], +'Grpc\ChannelCredentials::createComposite' => ['Grpc\ChannelCredentials', 'cred1'=>'Grpc\ChannelCredentials', 'cred2'=>'Grpc\CallCredentials'], +'Grpc\ChannelCredentials::createDefault' => ['Grpc\ChannelCredentials'], +'Grpc\ChannelCredentials::createInsecure' => ['null'], +'Grpc\ChannelCredentials::createSsl' => ['Grpc\ChannelCredentials', 'pem_root_certs'=>'string', 'pem_private_key='=>'string', 'pem_cert_chain='=>'string'], +'Grpc\ChannelCredentials::setDefaultRootsPem' => ['', 'pem_roots'=>'string'], +'Grpc\Server::__construct' => ['void', 'args'=>'array'], +'Grpc\Server::addHttp2Port' => ['bool', 'addr'=>'string'], +'Grpc\Server::addSecureHttp2Port' => ['bool', 'addr'=>'string', 'creds_obj'=>'Grpc\ServerCredentials'], +'Grpc\Server::requestCall' => ['', 'tag_new'=>'int', 'tag_cancel'=>'int'], +'Grpc\Server::start' => [''], +'Grpc\ServerCredentials::createSsl' => ['object', 'pem_root_certs'=>'string', 'pem_private_key'=>'string', 'pem_cert_chain'=>'string'], +'Grpc\Timeval::__construct' => ['void', 'usec'=>'int'], +'Grpc\Timeval::add' => ['Grpc\Timeval', 'other'=>'Grpc\Timeval'], +'Grpc\Timeval::compare' => ['int', 'a'=>'Grpc\Timeval', 'b'=>'Grpc\Timeval'], +'Grpc\Timeval::infFuture' => ['Grpc\Timeval'], +'Grpc\Timeval::infPast' => ['Grpc\Timeval'], +'Grpc\Timeval::now' => ['Grpc\Timeval'], +'Grpc\Timeval::similar' => ['bool', 'a'=>'Grpc\Timeval', 'b'=>'Grpc\Timeval', 'threshold'=>'Grpc\Timeval'], +'Grpc\Timeval::sleepUntil' => [''], +'Grpc\Timeval::subtract' => ['Grpc\Timeval', 'other'=>'Grpc\Timeval'], +'Grpc\Timeval::zero' => ['Grpc\Timeval'], +'gupnp_context_get_host_ip' => ['string', 'context'=>'resource'], +'gupnp_context_get_port' => ['int', 'context'=>'resource'], +'gupnp_context_get_subscription_timeout' => ['int', 'context'=>'resource'], +'gupnp_context_host_path' => ['bool', 'context'=>'resource', 'local_path'=>'string', 'server_path'=>'string'], +'gupnp_context_new' => ['resource', 'host_ip='=>'string', 'port='=>'int'], +'gupnp_context_set_subscription_timeout' => ['void', 'context'=>'resource', 'timeout'=>'int'], +'gupnp_context_timeout_add' => ['bool', 'context'=>'resource', 'timeout'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], +'gupnp_context_unhost_path' => ['bool', 'context'=>'resource', 'server_path'=>'string'], +'gupnp_control_point_browse_start' => ['bool', 'cpoint'=>'resource'], +'gupnp_control_point_browse_stop' => ['bool', 'cpoint'=>'resource'], +'gupnp_control_point_callback_set' => ['bool', 'cpoint'=>'resource', 'signal'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], +'gupnp_control_point_new' => ['resource', 'context'=>'resource', 'target'=>'string'], +'gupnp_device_action_callback_set' => ['bool', 'root_device'=>'resource', 'signal'=>'int', 'action_name'=>'string', 'callback'=>'mixed', 'arg='=>'mixed'], +'gupnp_device_info_get' => ['array', 'root_device'=>'resource'], +'gupnp_device_info_get_service' => ['resource', 'root_device'=>'resource', 'type'=>'string'], +'gupnp_root_device_get_available' => ['bool', 'root_device'=>'resource'], +'gupnp_root_device_get_relative_location' => ['string', 'root_device'=>'resource'], +'gupnp_root_device_new' => ['resource', 'context'=>'resource', 'location'=>'string', 'description_dir'=>'string'], +'gupnp_root_device_set_available' => ['bool', 'root_device'=>'resource', 'available'=>'bool'], +'gupnp_root_device_start' => ['bool', 'root_device'=>'resource'], +'gupnp_root_device_stop' => ['bool', 'root_device'=>'resource'], +'gupnp_service_action_get' => ['mixed', 'action'=>'resource', 'name'=>'string', 'type'=>'int'], +'gupnp_service_action_return' => ['bool', 'action'=>'resource'], +'gupnp_service_action_return_error' => ['bool', 'action'=>'resource', 'error_code'=>'int', 'error_description='=>'string'], +'gupnp_service_action_set' => ['bool', 'action'=>'resource', 'name'=>'string', 'type'=>'int', 'value'=>'mixed'], +'gupnp_service_freeze_notify' => ['bool', 'service'=>'resource'], +'gupnp_service_info_get' => ['array', 'proxy'=>'resource'], +'gupnp_service_info_get_introspection' => ['mixed', 'proxy'=>'resource', 'callback='=>'mixed', 'arg='=>'mixed'], +'gupnp_service_introspection_get_state_variable' => ['array', 'introspection'=>'resource', 'variable_name'=>'string'], +'gupnp_service_notify' => ['bool', 'service'=>'resource', 'name'=>'string', 'type'=>'int', 'value'=>'mixed'], +'gupnp_service_proxy_action_get' => ['mixed', 'proxy'=>'resource', 'action'=>'string', 'name'=>'string', 'type'=>'int'], +'gupnp_service_proxy_action_set' => ['bool', 'proxy'=>'resource', 'action'=>'string', 'name'=>'string', 'value'=>'mixed', 'type'=>'int'], +'gupnp_service_proxy_add_notify' => ['bool', 'proxy'=>'resource', 'value'=>'string', 'type'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], +'gupnp_service_proxy_callback_set' => ['bool', 'proxy'=>'resource', 'signal'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], +'gupnp_service_proxy_get_subscribed' => ['bool', 'proxy'=>'resource'], +'gupnp_service_proxy_remove_notify' => ['bool', 'proxy'=>'resource', 'value'=>'string'], +'gupnp_service_proxy_send_action' => ['array', 'proxy'=>'resource', 'action'=>'string', 'in_params'=>'array', 'out_params'=>'array'], +'gupnp_service_proxy_set_subscribed' => ['bool', 'proxy'=>'resource', 'subscribed'=>'bool'], +'gupnp_service_thaw_notify' => ['bool', 'service'=>'resource'], +'gzclose' => ['bool', 'stream'=>'resource'], +'gzcompress' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], +'gzdecode' => ['string|false', 'data'=>'string', 'max_length='=>'int'], +'gzdeflate' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], +'gzencode' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], +'gzeof' => ['bool|int', 'stream'=>'resource'], +'gzfile' => ['list', 'filename'=>'string', 'use_include_path='=>'int'], +'gzgetc' => ['string|false', 'stream'=>'resource'], +'gzgets' => ['string|false', 'stream'=>'resource', 'length='=>'int'], +'gzinflate' => ['string|false', 'data'=>'string', 'max_length='=>'int'], +'gzopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'int'], +'gzpassthru' => ['int|false', 'stream'=>'resource'], +'gzputs' => ['int', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], +'gzread' => ['string|false', 'stream'=>'resource', 'length'=>'int'], +'gzrewind' => ['bool', 'stream'=>'resource'], +'gzseek' => ['int', 'stream'=>'resource', 'offset'=>'int', 'whence='=>'int'], +'gztell' => ['int|false', 'stream'=>'resource'], +'gzuncompress' => ['string|false', 'data'=>'string', 'max_length='=>'int'], +'gzwrite' => ['int', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], +'HaruAnnotation::setBorderStyle' => ['bool', 'width'=>'float', 'dash_on'=>'int', 'dash_off'=>'int'], +'HaruAnnotation::setHighlightMode' => ['bool', 'mode'=>'int'], +'HaruAnnotation::setIcon' => ['bool', 'icon'=>'int'], +'HaruAnnotation::setOpened' => ['bool', 'opened'=>'bool'], +'HaruDestination::setFit' => ['bool'], +'HaruDestination::setFitB' => ['bool'], +'HaruDestination::setFitBH' => ['bool', 'top'=>'float'], +'HaruDestination::setFitBV' => ['bool', 'left'=>'float'], +'HaruDestination::setFitH' => ['bool', 'top'=>'float'], +'HaruDestination::setFitR' => ['bool', 'left'=>'float', 'bottom'=>'float', 'right'=>'float', 'top'=>'float'], +'HaruDestination::setFitV' => ['bool', 'left'=>'float'], +'HaruDestination::setXYZ' => ['bool', 'left'=>'float', 'top'=>'float', 'zoom'=>'float'], +'HaruDoc::__construct' => ['void'], +'HaruDoc::addPage' => ['object'], +'HaruDoc::addPageLabel' => ['bool', 'first_page'=>'int', 'style'=>'int', 'first_num'=>'int', 'prefix='=>'string'], +'HaruDoc::createOutline' => ['object', 'title'=>'string', 'parent_outline='=>'object', 'encoder='=>'object'], +'HaruDoc::getCurrentEncoder' => ['object'], +'HaruDoc::getCurrentPage' => ['object'], +'HaruDoc::getEncoder' => ['object', 'encoding'=>'string'], +'HaruDoc::getFont' => ['object', 'fontname'=>'string', 'encoding='=>'string'], +'HaruDoc::getInfoAttr' => ['string', 'type'=>'int'], +'HaruDoc::getPageLayout' => ['int'], +'HaruDoc::getPageMode' => ['int'], +'HaruDoc::getStreamSize' => ['int'], +'HaruDoc::insertPage' => ['object', 'page'=>'object'], +'HaruDoc::loadJPEG' => ['object', 'filename'=>'string'], +'HaruDoc::loadPNG' => ['object', 'filename'=>'string', 'deferred='=>'bool'], +'HaruDoc::loadRaw' => ['object', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'color_space'=>'int'], +'HaruDoc::loadTTC' => ['string', 'fontfile'=>'string', 'index'=>'int', 'embed='=>'bool'], +'HaruDoc::loadTTF' => ['string', 'fontfile'=>'string', 'embed='=>'bool'], +'HaruDoc::loadType1' => ['string', 'afmfile'=>'string', 'pfmfile='=>'string'], +'HaruDoc::output' => ['bool'], +'HaruDoc::readFromStream' => ['string', 'bytes'=>'int'], +'HaruDoc::resetError' => ['bool'], +'HaruDoc::resetStream' => ['bool'], +'HaruDoc::save' => ['bool', 'file'=>'string'], +'HaruDoc::saveToStream' => ['bool'], +'HaruDoc::setCompressionMode' => ['bool', 'mode'=>'int'], +'HaruDoc::setCurrentEncoder' => ['bool', 'encoding'=>'string'], +'HaruDoc::setEncryptionMode' => ['bool', 'mode'=>'int', 'key_len='=>'int'], +'HaruDoc::setInfoAttr' => ['bool', 'type'=>'int', 'info'=>'string'], +'HaruDoc::setInfoDateAttr' => ['bool', 'type'=>'int', 'year'=>'int', 'month'=>'int', 'day'=>'int', 'hour'=>'int', 'min'=>'int', 'sec'=>'int', 'ind'=>'string', 'off_hour'=>'int', 'off_min'=>'int'], +'HaruDoc::setOpenAction' => ['bool', 'destination'=>'object'], +'HaruDoc::setPageLayout' => ['bool', 'layout'=>'int'], +'HaruDoc::setPageMode' => ['bool', 'mode'=>'int'], +'HaruDoc::setPagesConfiguration' => ['bool', 'page_per_pages'=>'int'], +'HaruDoc::setPassword' => ['bool', 'owner_password'=>'string', 'user_password'=>'string'], +'HaruDoc::setPermission' => ['bool', 'permission'=>'int'], +'HaruDoc::useCNSEncodings' => ['bool'], +'HaruDoc::useCNSFonts' => ['bool'], +'HaruDoc::useCNTEncodings' => ['bool'], +'HaruDoc::useCNTFonts' => ['bool'], +'HaruDoc::useJPEncodings' => ['bool'], +'HaruDoc::useJPFonts' => ['bool'], +'HaruDoc::useKREncodings' => ['bool'], +'HaruDoc::useKRFonts' => ['bool'], +'HaruEncoder::getByteType' => ['int', 'text'=>'string', 'index'=>'int'], +'HaruEncoder::getType' => ['int'], +'HaruEncoder::getUnicode' => ['int', 'character'=>'int'], +'HaruEncoder::getWritingMode' => ['int'], +'HaruFont::getAscent' => ['int'], +'HaruFont::getCapHeight' => ['int'], +'HaruFont::getDescent' => ['int'], +'HaruFont::getEncodingName' => ['string'], +'HaruFont::getFontName' => ['string'], +'HaruFont::getTextWidth' => ['array', 'text'=>'string'], +'HaruFont::getUnicodeWidth' => ['int', 'character'=>'int'], +'HaruFont::getXHeight' => ['int'], +'HaruFont::measureText' => ['int', 'text'=>'string', 'width'=>'float', 'font_size'=>'float', 'char_space'=>'float', 'word_space'=>'float', 'word_wrap='=>'bool'], +'HaruImage::getBitsPerComponent' => ['int'], +'HaruImage::getColorSpace' => ['string'], +'HaruImage::getHeight' => ['int'], +'HaruImage::getSize' => ['array'], +'HaruImage::getWidth' => ['int'], +'HaruImage::setColorMask' => ['bool', 'rmin'=>'int', 'rmax'=>'int', 'gmin'=>'int', 'gmax'=>'int', 'bmin'=>'int', 'bmax'=>'int'], +'HaruImage::setMaskImage' => ['bool', 'mask_image'=>'object'], +'HaruOutline::setDestination' => ['bool', 'destination'=>'object'], +'HaruOutline::setOpened' => ['bool', 'opened'=>'bool'], +'HaruPage::arc' => ['bool', 'x'=>'float', 'y'=>'float', 'ray'=>'float', 'ang1'=>'float', 'ang2'=>'float'], +'HaruPage::beginText' => ['bool'], +'HaruPage::circle' => ['bool', 'x'=>'float', 'y'=>'float', 'ray'=>'float'], +'HaruPage::closePath' => ['bool'], +'HaruPage::concat' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], +'HaruPage::createDestination' => ['object'], +'HaruPage::createLinkAnnotation' => ['object', 'rectangle'=>'array', 'destination'=>'object'], +'HaruPage::createTextAnnotation' => ['object', 'rectangle'=>'array', 'text'=>'string', 'encoder='=>'object'], +'HaruPage::createURLAnnotation' => ['object', 'rectangle'=>'array', 'url'=>'string'], +'HaruPage::curveTo' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], +'HaruPage::curveTo2' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], +'HaruPage::curveTo3' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x3'=>'float', 'y3'=>'float'], +'HaruPage::drawImage' => ['bool', 'image'=>'object', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], +'HaruPage::ellipse' => ['bool', 'x'=>'float', 'y'=>'float', 'xray'=>'float', 'yray'=>'float'], +'HaruPage::endPath' => ['bool'], +'HaruPage::endText' => ['bool'], +'HaruPage::eofill' => ['bool'], +'HaruPage::eoFillStroke' => ['bool', 'close_path='=>'bool'], +'HaruPage::fill' => ['bool'], +'HaruPage::fillStroke' => ['bool', 'close_path='=>'bool'], +'HaruPage::getCharSpace' => ['float'], +'HaruPage::getCMYKFill' => ['array'], +'HaruPage::getCMYKStroke' => ['array'], +'HaruPage::getCurrentFont' => ['object'], +'HaruPage::getCurrentFontSize' => ['float'], +'HaruPage::getCurrentPos' => ['array'], +'HaruPage::getCurrentTextPos' => ['array'], +'HaruPage::getDash' => ['array'], +'HaruPage::getFillingColorSpace' => ['int'], +'HaruPage::getFlatness' => ['float'], +'HaruPage::getGMode' => ['int'], +'HaruPage::getGrayFill' => ['float'], +'HaruPage::getGrayStroke' => ['float'], +'HaruPage::getHeight' => ['float'], +'HaruPage::getHorizontalScaling' => ['float'], +'HaruPage::getLineCap' => ['int'], +'HaruPage::getLineJoin' => ['int'], +'HaruPage::getLineWidth' => ['float'], +'HaruPage::getMiterLimit' => ['float'], +'HaruPage::getRGBFill' => ['array'], +'HaruPage::getRGBStroke' => ['array'], +'HaruPage::getStrokingColorSpace' => ['int'], +'HaruPage::getTextLeading' => ['float'], +'HaruPage::getTextMatrix' => ['array'], +'HaruPage::getTextRenderingMode' => ['int'], +'HaruPage::getTextRise' => ['float'], +'HaruPage::getTextWidth' => ['float', 'text'=>'string'], +'HaruPage::getTransMatrix' => ['array'], +'HaruPage::getWidth' => ['float'], +'HaruPage::getWordSpace' => ['float'], +'HaruPage::lineTo' => ['bool', 'x'=>'float', 'y'=>'float'], +'HaruPage::measureText' => ['int', 'text'=>'string', 'width'=>'float', 'wordwrap='=>'bool'], +'HaruPage::moveTextPos' => ['bool', 'x'=>'float', 'y'=>'float', 'set_leading='=>'bool'], +'HaruPage::moveTo' => ['bool', 'x'=>'float', 'y'=>'float'], +'HaruPage::moveToNextLine' => ['bool'], +'HaruPage::rectangle' => ['bool', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], +'HaruPage::setCharSpace' => ['bool', 'char_space'=>'float'], +'HaruPage::setCMYKFill' => ['bool', 'c'=>'float', 'm'=>'float', 'y'=>'float', 'k'=>'float'], +'HaruPage::setCMYKStroke' => ['bool', 'c'=>'float', 'm'=>'float', 'y'=>'float', 'k'=>'float'], +'HaruPage::setDash' => ['bool', 'pattern'=>'array', 'phase'=>'int'], +'HaruPage::setFlatness' => ['bool', 'flatness'=>'float'], +'HaruPage::setFontAndSize' => ['bool', 'font'=>'object', 'size'=>'float'], +'HaruPage::setGrayFill' => ['bool', 'value'=>'float'], +'HaruPage::setGrayStroke' => ['bool', 'value'=>'float'], +'HaruPage::setHeight' => ['bool', 'height'=>'float'], +'HaruPage::setHorizontalScaling' => ['bool', 'scaling'=>'float'], +'HaruPage::setLineCap' => ['bool', 'cap'=>'int'], +'HaruPage::setLineJoin' => ['bool', 'join'=>'int'], +'HaruPage::setLineWidth' => ['bool', 'width'=>'float'], +'HaruPage::setMiterLimit' => ['bool', 'limit'=>'float'], +'HaruPage::setRGBFill' => ['bool', 'r'=>'float', 'g'=>'float', 'b'=>'float'], +'HaruPage::setRGBStroke' => ['bool', 'r'=>'float', 'g'=>'float', 'b'=>'float'], +'HaruPage::setRotate' => ['bool', 'angle'=>'int'], +'HaruPage::setSize' => ['bool', 'size'=>'int', 'direction'=>'int'], +'HaruPage::setSlideShow' => ['bool', 'type'=>'int', 'disp_time'=>'float', 'trans_time'=>'float'], +'HaruPage::setTextLeading' => ['bool', 'text_leading'=>'float'], +'HaruPage::setTextMatrix' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], +'HaruPage::setTextRenderingMode' => ['bool', 'mode'=>'int'], +'HaruPage::setTextRise' => ['bool', 'rise'=>'float'], +'HaruPage::setWidth' => ['bool', 'width'=>'float'], +'HaruPage::setWordSpace' => ['bool', 'word_space'=>'float'], +'HaruPage::showText' => ['bool', 'text'=>'string'], +'HaruPage::showTextNextLine' => ['bool', 'text'=>'string', 'word_space='=>'float', 'char_space='=>'float'], +'HaruPage::stroke' => ['bool', 'close_path='=>'bool'], +'HaruPage::textOut' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'], +'HaruPage::textRect' => ['bool', 'left'=>'float', 'top'=>'float', 'right'=>'float', 'bottom'=>'float', 'text'=>'string', 'align='=>'int'], +'hash' => ['string|false', 'algo'=>'string', 'data'=>'string', 'binary='=>'bool', 'options='=>'array'], +'hash_algos' => ['list'], +'hash_copy' => ['HashContext', 'context'=>'HashContext'], +'hash_equals' => ['bool', 'known_string'=>'string', 'user_string'=>'string'], +'hash_file' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'binary='=>'bool', 'options='=>'array'], +'hash_final' => ['string', 'context'=>'HashContext', 'binary='=>'bool'], +'hash_hkdf' => ['string|false', 'algo'=>'string', 'key'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'], +'hash_hmac' => ['string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'binary='=>'bool'], +'hash_hmac_algos' => ['list'], +'hash_hmac_file' => ['string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'binary='=>'bool'], +'hash_init' => ['HashContext', 'algo'=>'string', 'flags='=>'int', 'key='=>'string', 'options='=>'array'], +'hash_pbkdf2' => ['string', 'algo'=>'string', 'password'=>'string', 'salt'=>'string', 'iterations'=>'int', 'length='=>'int', 'binary='=>'bool'], +'hash_update' => ['bool', 'context'=>'HashContext', 'data'=>'string'], +'hash_update_file' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'stream_context='=>'?resource'], +'hash_update_stream' => ['int', 'context'=>'HashContext', 'stream'=>'resource', 'length='=>'int'], +'hashTableObj::clear' => ['void'], +'hashTableObj::get' => ['string', 'key'=>'string'], +'hashTableObj::nextkey' => ['string', 'previousKey'=>'string'], +'hashTableObj::remove' => ['int', 'key'=>'string'], +'hashTableObj::set' => ['int', 'key'=>'string', 'value'=>'string'], +'header' => ['void', 'header'=>'string', 'replace='=>'bool', 'response_code='=>'int'], +'header_register_callback' => ['bool', 'callback'=>'callable():void'], +'header_remove' => ['void', 'name='=>'string'], +'headers_list' => ['list'], +'headers_sent' => ['bool', '&w_filename='=>'string', '&w_line='=>'int'], +'hebrev' => ['string', 'string'=>'string', 'max_chars_per_line='=>'int'], +'hebrevc' => ['string', 'string'=>'string', 'max_chars_per_line='=>'int'], +'hex2bin' => ['string|false', 'string'=>'string'], +'hexdec' => ['int|float', 'hex_string'=>'string'], +'highlight_file' => ['string|bool', 'filename'=>'string', 'return='=>'bool'], +'highlight_string' => ['string|bool', 'string'=>'string', 'return='=>'bool'], +'hrtime' => ['array{0:int,1:int}|false', 'as_number='=>'false'], +'hrtime\'1' => ['int|float|false', 'as_number='=>'true'], +'HRTime\PerformanceCounter::getElapsedTicks' => ['int'], +'HRTime\PerformanceCounter::getFrequency' => ['int'], +'HRTime\PerformanceCounter::getLastElapsedTicks' => ['int'], +'HRTime\PerformanceCounter::getTicks' => ['int'], +'HRTime\PerformanceCounter::getTicksSince' => ['int', 'start'=>'int'], +'HRTime\PerformanceCounter::isRunning' => ['bool'], +'HRTime\PerformanceCounter::start' => ['void'], +'HRTime\PerformanceCounter::stop' => ['void'], +'HRTime\StopWatch::getElapsedTicks' => ['int'], +'HRTime\StopWatch::getElapsedTime' => ['float', 'unit='=>'int'], +'HRTime\StopWatch::getLastElapsedTicks' => ['int'], +'HRTime\StopWatch::getLastElapsedTime' => ['float', 'unit='=>'int'], +'HRTime\StopWatch::isRunning' => ['bool'], +'HRTime\StopWatch::start' => ['void'], +'HRTime\StopWatch::stop' => ['void'], +'html_entity_decode' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string'], +'htmlentities' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string', 'double_encode='=>'bool'], +'htmlspecialchars' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string|null', 'double_encode='=>'bool'], +'htmlspecialchars_decode' => ['string', 'string'=>'string', 'flags='=>'int'], +'http\Client::__construct' => ['void', 'driver='=>'string', 'persistent_handle_id='=>'string'], +'http\Client::addCookies' => ['http\Client', 'cookies='=>'?array'], +'http\Client::addSslOptions' => ['http\Client', 'ssl_options='=>'?array'], +'http\Client::attach' => ['void', 'observer'=>'SplObserver'], +'http\Client::configure' => ['http\Client', 'settings'=>'array'], +'http\Client::count' => ['int'], +'http\Client::dequeue' => ['http\Client', 'request'=>'http\Client\Request'], +'http\Client::detach' => ['void', 'observer'=>'SplObserver'], +'http\Client::enableEvents' => ['http\Client', 'enable='=>'mixed'], +'http\Client::enablePipelining' => ['http\Client', 'enable='=>'mixed'], +'http\Client::enqueue' => ['http\Client', 'request'=>'http\Client\Request', 'callable='=>'mixed'], +'http\Client::getAvailableConfiguration' => ['array'], +'http\Client::getAvailableDrivers' => ['array'], +'http\Client::getAvailableOptions' => ['array'], +'http\Client::getCookies' => ['array'], +'http\Client::getHistory' => ['http\Message'], +'http\Client::getObservers' => ['SplObjectStorage'], +'http\Client::getOptions' => ['array'], +'http\Client::getProgressInfo' => ['null|object', 'request'=>'http\Client\Request'], +'http\Client::getResponse' => ['http\Client\Response|null', 'request='=>'?http\Client\Request'], +'http\Client::getSslOptions' => ['array'], +'http\Client::getTransferInfo' => ['object', 'request'=>'http\Client\Request'], +'http\Client::notify' => ['void', 'request='=>'?http\Client\Request'], +'http\Client::once' => ['bool'], +'http\Client::requeue' => ['http\Client', 'request'=>'http\Client\Request', 'callable='=>'mixed'], +'http\Client::reset' => ['http\Client'], +'http\Client::send' => ['http\Client'], +'http\Client::setCookies' => ['http\Client', 'cookies='=>'?array'], +'http\Client::setDebug' => ['http\Client', 'callback'=>'callable'], +'http\Client::setOptions' => ['http\Client', 'options='=>'?array'], +'http\Client::setSslOptions' => ['http\Client', 'ssl_option='=>'?array'], +'http\Client::wait' => ['bool', 'timeout='=>'mixed'], +'http\Client\Curl\User::init' => ['', 'run'=>'callable'], +'http\Client\Curl\User::once' => [''], +'http\Client\Curl\User::send' => [''], +'http\Client\Curl\User::socket' => ['', 'socket'=>'resource', 'action'=>'int'], +'http\Client\Curl\User::timer' => ['', 'timeout_ms'=>'int'], +'http\Client\Curl\User::wait' => ['', 'timeout_ms='=>'mixed'], +'http\Client\Request::__construct' => ['void', 'method='=>'mixed', 'url='=>'mixed', 'headers='=>'?array', 'body='=>'?http\Message\Body'], +'http\Client\Request::__toString' => ['string'], +'http\Client\Request::addBody' => ['http\Message', 'body'=>'http\Message\Body'], +'http\Client\Request::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], +'http\Client\Request::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], +'http\Client\Request::addQuery' => ['http\Client\Request', 'query_data'=>'mixed'], +'http\Client\Request::addSslOptions' => ['http\Client\Request', 'ssl_options='=>'?array'], +'http\Client\Request::count' => ['int'], +'http\Client\Request::current' => ['mixed'], +'http\Client\Request::detach' => ['http\Message'], +'http\Client\Request::getBody' => ['http\Message\Body'], +'http\Client\Request::getContentType' => ['null|string'], +'http\Client\Request::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], +'http\Client\Request::getHeaders' => ['array'], +'http\Client\Request::getHttpVersion' => ['string'], +'http\Client\Request::getInfo' => ['null|string'], +'http\Client\Request::getOptions' => ['array'], +'http\Client\Request::getParentMessage' => ['http\Message'], +'http\Client\Request::getQuery' => ['null|string'], +'http\Client\Request::getRequestMethod' => ['false|string'], +'http\Client\Request::getRequestUrl' => ['false|string'], +'http\Client\Request::getResponseCode' => ['false|int'], +'http\Client\Request::getResponseStatus' => ['false|string'], +'http\Client\Request::getSslOptions' => ['array'], +'http\Client\Request::getType' => ['int'], +'http\Client\Request::isMultipart' => ['bool', '&boundary='=>'mixed'], +'http\Client\Request::key' => ['int|string'], +'http\Client\Request::next' => ['void'], +'http\Client\Request::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], +'http\Client\Request::reverse' => ['http\Message'], +'http\Client\Request::rewind' => ['void'], +'http\Client\Request::serialize' => ['string'], +'http\Client\Request::setBody' => ['http\Message', 'body'=>'http\Message\Body'], +'http\Client\Request::setContentType' => ['http\Client\Request', 'content_type'=>'string'], +'http\Client\Request::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], +'http\Client\Request::setHeaders' => ['http\Message', 'headers'=>'array'], +'http\Client\Request::setHttpVersion' => ['http\Message', 'http_version'=>'string'], +'http\Client\Request::setInfo' => ['http\Message', 'http_info'=>'string'], +'http\Client\Request::setOptions' => ['http\Client\Request', 'options='=>'?array'], +'http\Client\Request::setQuery' => ['http\Client\Request', 'query_data='=>'mixed'], +'http\Client\Request::setRequestMethod' => ['http\Message', 'request_method'=>'string'], +'http\Client\Request::setRequestUrl' => ['http\Message', 'url'=>'string'], +'http\Client\Request::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], +'http\Client\Request::setResponseStatus' => ['http\Message', 'response_status'=>'string'], +'http\Client\Request::setSslOptions' => ['http\Client\Request', 'ssl_options='=>'?array'], +'http\Client\Request::setType' => ['http\Message', 'type'=>'int'], +'http\Client\Request::splitMultipartBody' => ['http\Message'], +'http\Client\Request::toCallback' => ['http\Message', 'callback'=>'callable'], +'http\Client\Request::toStream' => ['http\Message', 'stream'=>'resource'], +'http\Client\Request::toString' => ['string', 'include_parent='=>'mixed'], +'http\Client\Request::unserialize' => ['void', 'serialized'=>'string'], +'http\Client\Request::valid' => ['bool'], +'http\Client\Response::__construct' => ['Iterator'], +'http\Client\Response::__toString' => ['string'], +'http\Client\Response::addBody' => ['http\Message', 'body'=>'http\Message\Body'], +'http\Client\Response::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], +'http\Client\Response::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], +'http\Client\Response::count' => ['int'], +'http\Client\Response::current' => ['mixed'], +'http\Client\Response::detach' => ['http\Message'], +'http\Client\Response::getBody' => ['http\Message\Body'], +'http\Client\Response::getCookies' => ['array', 'flags='=>'mixed', 'allowed_extras='=>'mixed'], +'http\Client\Response::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], +'http\Client\Response::getHeaders' => ['array'], +'http\Client\Response::getHttpVersion' => ['string'], +'http\Client\Response::getInfo' => ['null|string'], +'http\Client\Response::getParentMessage' => ['http\Message'], +'http\Client\Response::getRequestMethod' => ['false|string'], +'http\Client\Response::getRequestUrl' => ['false|string'], +'http\Client\Response::getResponseCode' => ['false|int'], +'http\Client\Response::getResponseStatus' => ['false|string'], +'http\Client\Response::getTransferInfo' => ['mixed|object', 'element='=>'mixed'], +'http\Client\Response::getType' => ['int'], +'http\Client\Response::isMultipart' => ['bool', '&boundary='=>'mixed'], +'http\Client\Response::key' => ['int|string'], +'http\Client\Response::next' => ['void'], +'http\Client\Response::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], +'http\Client\Response::reverse' => ['http\Message'], +'http\Client\Response::rewind' => ['void'], +'http\Client\Response::serialize' => ['string'], +'http\Client\Response::setBody' => ['http\Message', 'body'=>'http\Message\Body'], +'http\Client\Response::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], +'http\Client\Response::setHeaders' => ['http\Message', 'headers'=>'array'], +'http\Client\Response::setHttpVersion' => ['http\Message', 'http_version'=>'string'], +'http\Client\Response::setInfo' => ['http\Message', 'http_info'=>'string'], +'http\Client\Response::setRequestMethod' => ['http\Message', 'request_method'=>'string'], +'http\Client\Response::setRequestUrl' => ['http\Message', 'url'=>'string'], +'http\Client\Response::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], +'http\Client\Response::setResponseStatus' => ['http\Message', 'response_status'=>'string'], +'http\Client\Response::setType' => ['http\Message', 'type'=>'int'], +'http\Client\Response::splitMultipartBody' => ['http\Message'], +'http\Client\Response::toCallback' => ['http\Message', 'callback'=>'callable'], +'http\Client\Response::toStream' => ['http\Message', 'stream'=>'resource'], +'http\Client\Response::toString' => ['string', 'include_parent='=>'mixed'], +'http\Client\Response::unserialize' => ['void', 'serialized'=>'string'], +'http\Client\Response::valid' => ['bool'], +'http\Cookie::__construct' => ['void', 'cookie_string='=>'mixed', 'parser_flags='=>'int', 'allowed_extras='=>'array'], +'http\Cookie::__toString' => ['string'], +'http\Cookie::addCookie' => ['http\Cookie', 'cookie_name'=>'string', 'cookie_value'=>'string'], +'http\Cookie::addCookies' => ['http\Cookie', 'cookies'=>'array'], +'http\Cookie::addExtra' => ['http\Cookie', 'extra_name'=>'string', 'extra_value'=>'string'], +'http\Cookie::addExtras' => ['http\Cookie', 'extras'=>'array'], +'http\Cookie::getCookie' => ['null|string', 'name'=>'string'], +'http\Cookie::getCookies' => ['array'], +'http\Cookie::getDomain' => ['string'], +'http\Cookie::getExpires' => ['int'], +'http\Cookie::getExtra' => ['string', 'name'=>'string'], +'http\Cookie::getExtras' => ['array'], +'http\Cookie::getFlags' => ['int'], +'http\Cookie::getMaxAge' => ['int'], +'http\Cookie::getPath' => ['string'], +'http\Cookie::setCookie' => ['http\Cookie', 'cookie_name'=>'string', 'cookie_value='=>'mixed'], +'http\Cookie::setCookies' => ['http\Cookie', 'cookies='=>'mixed'], +'http\Cookie::setDomain' => ['http\Cookie', 'value='=>'mixed'], +'http\Cookie::setExpires' => ['http\Cookie', 'value='=>'mixed'], +'http\Cookie::setExtra' => ['http\Cookie', 'extra_name'=>'string', 'extra_value='=>'mixed'], +'http\Cookie::setExtras' => ['http\Cookie', 'extras='=>'mixed'], +'http\Cookie::setFlags' => ['http\Cookie', 'value='=>'mixed'], +'http\Cookie::setMaxAge' => ['http\Cookie', 'value='=>'mixed'], +'http\Cookie::setPath' => ['http\Cookie', 'value='=>'mixed'], +'http\Cookie::toArray' => ['array'], +'http\Cookie::toString' => ['string'], +'http\Encoding\Stream::__construct' => ['void', 'flags='=>'mixed'], +'http\Encoding\Stream::done' => ['bool'], +'http\Encoding\Stream::finish' => ['string'], +'http\Encoding\Stream::flush' => ['string'], +'http\Encoding\Stream::update' => ['string', 'data'=>'string'], +'http\Encoding\Stream\Debrotli::__construct' => ['void', 'flags='=>'int'], +'http\Encoding\Stream\Debrotli::decode' => ['string', 'data'=>'string'], +'http\Encoding\Stream\Debrotli::done' => ['bool'], +'http\Encoding\Stream\Debrotli::finish' => ['string'], +'http\Encoding\Stream\Debrotli::flush' => ['string'], +'http\Encoding\Stream\Debrotli::update' => ['string', 'data'=>'string'], +'http\Encoding\Stream\Dechunk::__construct' => ['void', 'flags='=>'mixed'], +'http\Encoding\Stream\Dechunk::decode' => ['false|string', 'data'=>'string', '&decoded_len='=>'mixed'], +'http\Encoding\Stream\Dechunk::done' => ['bool'], +'http\Encoding\Stream\Dechunk::finish' => ['string'], +'http\Encoding\Stream\Dechunk::flush' => ['string'], +'http\Encoding\Stream\Dechunk::update' => ['string', 'data'=>'string'], +'http\Encoding\Stream\Deflate::__construct' => ['void', 'flags='=>'mixed'], +'http\Encoding\Stream\Deflate::done' => ['bool'], +'http\Encoding\Stream\Deflate::encode' => ['string', 'data'=>'string', 'flags='=>'mixed'], +'http\Encoding\Stream\Deflate::finish' => ['string'], +'http\Encoding\Stream\Deflate::flush' => ['string'], +'http\Encoding\Stream\Deflate::update' => ['string', 'data'=>'string'], +'http\Encoding\Stream\Enbrotli::__construct' => ['void', 'flags='=>'int'], +'http\Encoding\Stream\Enbrotli::done' => ['bool'], +'http\Encoding\Stream\Enbrotli::encode' => ['string', 'data'=>'string', 'flags='=>'int'], +'http\Encoding\Stream\Enbrotli::finish' => ['string'], +'http\Encoding\Stream\Enbrotli::flush' => ['string'], +'http\Encoding\Stream\Enbrotli::update' => ['string', 'data'=>'string'], +'http\Encoding\Stream\Inflate::__construct' => ['void', 'flags='=>'mixed'], +'http\Encoding\Stream\Inflate::decode' => ['string', 'data'=>'string'], +'http\Encoding\Stream\Inflate::done' => ['bool'], +'http\Encoding\Stream\Inflate::finish' => ['string'], +'http\Encoding\Stream\Inflate::flush' => ['string'], +'http\Encoding\Stream\Inflate::update' => ['string', 'data'=>'string'], +'http\Env::getRequestBody' => ['http\Message\Body', 'body_class_name='=>'mixed'], +'http\Env::getRequestHeader' => ['array|null|string', 'header_name='=>'mixed'], +'http\Env::getResponseCode' => ['int'], +'http\Env::getResponseHeader' => ['array|null|string', 'header_name='=>'mixed'], +'http\Env::getResponseStatusForAllCodes' => ['array'], +'http\Env::getResponseStatusForCode' => ['string', 'code'=>'int'], +'http\Env::negotiate' => ['null|string', 'params'=>'string', 'supported'=>'array', 'primary_type_separator='=>'mixed', '&result_array='=>'mixed'], +'http\Env::negotiateCharset' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], +'http\Env::negotiateContentType' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], +'http\Env::negotiateEncoding' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], +'http\Env::negotiateLanguage' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], +'http\Env::setResponseCode' => ['bool', 'code'=>'int'], +'http\Env::setResponseHeader' => ['bool', 'header_name'=>'string', 'header_value='=>'mixed', 'response_code='=>'mixed', 'replace_header='=>'mixed'], +'http\Env\Request::__construct' => ['void'], +'http\Env\Request::__toString' => ['string'], +'http\Env\Request::addBody' => ['http\Message', 'body'=>'http\Message\Body'], +'http\Env\Request::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], +'http\Env\Request::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], +'http\Env\Request::count' => ['int'], +'http\Env\Request::current' => ['mixed'], +'http\Env\Request::detach' => ['http\Message'], +'http\Env\Request::getBody' => ['http\Message\Body'], +'http\Env\Request::getCookie' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], +'http\Env\Request::getFiles' => ['array'], +'http\Env\Request::getForm' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], +'http\Env\Request::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], +'http\Env\Request::getHeaders' => ['array'], +'http\Env\Request::getHttpVersion' => ['string'], +'http\Env\Request::getInfo' => ['null|string'], +'http\Env\Request::getParentMessage' => ['http\Message'], +'http\Env\Request::getQuery' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], +'http\Env\Request::getRequestMethod' => ['false|string'], +'http\Env\Request::getRequestUrl' => ['false|string'], +'http\Env\Request::getResponseCode' => ['false|int'], +'http\Env\Request::getResponseStatus' => ['false|string'], +'http\Env\Request::getType' => ['int'], +'http\Env\Request::isMultipart' => ['bool', '&boundary='=>'mixed'], +'http\Env\Request::key' => ['int|string'], +'http\Env\Request::next' => ['void'], +'http\Env\Request::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], +'http\Env\Request::reverse' => ['http\Message'], +'http\Env\Request::rewind' => ['void'], +'http\Env\Request::serialize' => ['string'], +'http\Env\Request::setBody' => ['http\Message', 'body'=>'http\Message\Body'], +'http\Env\Request::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], +'http\Env\Request::setHeaders' => ['http\Message', 'headers'=>'array'], +'http\Env\Request::setHttpVersion' => ['http\Message', 'http_version'=>'string'], +'http\Env\Request::setInfo' => ['http\Message', 'http_info'=>'string'], +'http\Env\Request::setRequestMethod' => ['http\Message', 'request_method'=>'string'], +'http\Env\Request::setRequestUrl' => ['http\Message', 'url'=>'string'], +'http\Env\Request::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], +'http\Env\Request::setResponseStatus' => ['http\Message', 'response_status'=>'string'], +'http\Env\Request::setType' => ['http\Message', 'type'=>'int'], +'http\Env\Request::splitMultipartBody' => ['http\Message'], +'http\Env\Request::toCallback' => ['http\Message', 'callback'=>'callable'], +'http\Env\Request::toStream' => ['http\Message', 'stream'=>'resource'], +'http\Env\Request::toString' => ['string', 'include_parent='=>'mixed'], +'http\Env\Request::unserialize' => ['void', 'serialized'=>'string'], +'http\Env\Request::valid' => ['bool'], +'http\Env\Response::__construct' => ['void'], +'http\Env\Response::__invoke' => ['bool', 'data'=>'string', 'ob_flags='=>'int'], +'http\Env\Response::__toString' => ['string'], +'http\Env\Response::addBody' => ['http\Message', 'body'=>'http\Message\Body'], +'http\Env\Response::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], +'http\Env\Response::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], +'http\Env\Response::count' => ['int'], +'http\Env\Response::current' => ['mixed'], +'http\Env\Response::detach' => ['http\Message'], +'http\Env\Response::getBody' => ['http\Message\Body'], +'http\Env\Response::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], +'http\Env\Response::getHeaders' => ['array'], +'http\Env\Response::getHttpVersion' => ['string'], +'http\Env\Response::getInfo' => ['?string'], +'http\Env\Response::getParentMessage' => ['http\Message'], +'http\Env\Response::getRequestMethod' => ['false|string'], +'http\Env\Response::getRequestUrl' => ['false|string'], +'http\Env\Response::getResponseCode' => ['false|int'], +'http\Env\Response::getResponseStatus' => ['false|string'], +'http\Env\Response::getType' => ['int'], +'http\Env\Response::isCachedByETag' => ['int', 'header_name='=>'string'], +'http\Env\Response::isCachedByLastModified' => ['int', 'header_name='=>'string'], +'http\Env\Response::isMultipart' => ['bool', '&boundary='=>'mixed'], +'http\Env\Response::key' => ['int|string'], +'http\Env\Response::next' => ['void'], +'http\Env\Response::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], +'http\Env\Response::reverse' => ['http\Message'], +'http\Env\Response::rewind' => ['void'], +'http\Env\Response::send' => ['bool', 'stream='=>'resource'], +'http\Env\Response::serialize' => ['string'], +'http\Env\Response::setBody' => ['http\Message', 'body'=>'http\Message\Body'], +'http\Env\Response::setCacheControl' => ['http\Env\Response', 'cache_control'=>'string'], +'http\Env\Response::setContentDisposition' => ['http\Env\Response', 'disposition_params'=>'array'], +'http\Env\Response::setContentEncoding' => ['http\Env\Response', 'content_encoding'=>'int'], +'http\Env\Response::setContentType' => ['http\Env\Response', 'content_type'=>'string'], +'http\Env\Response::setCookie' => ['http\Env\Response', 'cookie'=>'mixed'], +'http\Env\Response::setEnvRequest' => ['http\Env\Response', 'env_request'=>'http\Message'], +'http\Env\Response::setEtag' => ['http\Env\Response', 'etag'=>'string'], +'http\Env\Response::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], +'http\Env\Response::setHeaders' => ['http\Message', 'headers'=>'array'], +'http\Env\Response::setHttpVersion' => ['http\Message', 'http_version'=>'string'], +'http\Env\Response::setInfo' => ['http\Message', 'http_info'=>'string'], +'http\Env\Response::setLastModified' => ['http\Env\Response', 'last_modified'=>'int'], +'http\Env\Response::setRequestMethod' => ['http\Message', 'request_method'=>'string'], +'http\Env\Response::setRequestUrl' => ['http\Message', 'url'=>'string'], +'http\Env\Response::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], +'http\Env\Response::setResponseStatus' => ['http\Message', 'response_status'=>'string'], +'http\Env\Response::setThrottleRate' => ['http\Env\Response', 'chunk_size'=>'int', 'delay='=>'float|int'], +'http\Env\Response::setType' => ['http\Message', 'type'=>'int'], +'http\Env\Response::splitMultipartBody' => ['http\Message'], +'http\Env\Response::toCallback' => ['http\Message', 'callback'=>'callable'], +'http\Env\Response::toStream' => ['http\Message', 'stream'=>'resource'], +'http\Env\Response::toString' => ['string', 'include_parent='=>'mixed'], +'http\Env\Response::unserialize' => ['void', 'serialized'=>'string'], +'http\Env\Response::valid' => ['bool'], +'http\Header::__construct' => ['void', 'name='=>'mixed', 'value='=>'mixed'], +'http\Header::__toString' => ['string'], +'http\Header::getParams' => ['http\Params', 'param_sep='=>'mixed', 'arg_sep='=>'mixed', 'val_sep='=>'mixed', 'flags='=>'mixed'], +'http\Header::match' => ['bool', 'value'=>'string', 'flags='=>'mixed'], +'http\Header::negotiate' => ['null|string', 'supported'=>'array', '&result='=>'mixed'], +'http\Header::parse' => ['array|false', 'string'=>'string', 'header_class='=>'mixed'], +'http\Header::serialize' => ['string'], +'http\Header::toString' => ['string'], +'http\Header::unserialize' => ['void', 'serialized'=>'string'], +'http\Header\Parser::getState' => ['int'], +'http\Header\Parser::parse' => ['int', 'data'=>'string', 'flags'=>'int', '&headers'=>'array'], +'http\Header\Parser::stream' => ['int', 'stream'=>'resource', 'flags'=>'int', '&headers'=>'array'], +'http\Message::__construct' => ['void', 'message='=>'mixed', 'greedy='=>'bool'], +'http\Message::__toString' => ['string'], +'http\Message::addBody' => ['http\Message', 'body'=>'http\Message\Body'], +'http\Message::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], +'http\Message::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], +'http\Message::count' => ['int'], +'http\Message::current' => ['mixed'], +'http\Message::detach' => ['http\Message'], +'http\Message::getBody' => ['http\Message\Body'], +'http\Message::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], +'http\Message::getHeaders' => ['array'], +'http\Message::getHttpVersion' => ['string'], +'http\Message::getInfo' => ['null|string'], +'http\Message::getParentMessage' => ['http\Message'], +'http\Message::getRequestMethod' => ['false|string'], +'http\Message::getRequestUrl' => ['false|string'], +'http\Message::getResponseCode' => ['false|int'], +'http\Message::getResponseStatus' => ['false|string'], +'http\Message::getType' => ['int'], +'http\Message::isMultipart' => ['bool', '&boundary='=>'mixed'], +'http\Message::key' => ['int|string'], +'http\Message::next' => ['void'], +'http\Message::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], +'http\Message::reverse' => ['http\Message'], +'http\Message::rewind' => ['void'], +'http\Message::serialize' => ['string'], +'http\Message::setBody' => ['http\Message', 'body'=>'http\Message\Body'], +'http\Message::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], +'http\Message::setHeaders' => ['http\Message', 'headers'=>'array'], +'http\Message::setHttpVersion' => ['http\Message', 'http_version'=>'string'], +'http\Message::setInfo' => ['http\Message', 'http_info'=>'string'], +'http\Message::setRequestMethod' => ['http\Message', 'request_method'=>'string'], +'http\Message::setRequestUrl' => ['http\Message', 'url'=>'string'], +'http\Message::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], +'http\Message::setResponseStatus' => ['http\Message', 'response_status'=>'string'], +'http\Message::setType' => ['http\Message', 'type'=>'int'], +'http\Message::splitMultipartBody' => ['http\Message'], +'http\Message::toCallback' => ['http\Message', 'callback'=>'callable'], +'http\Message::toStream' => ['http\Message', 'stream'=>'resource'], +'http\Message::toString' => ['string', 'include_parent='=>'mixed'], +'http\Message::unserialize' => ['void', 'serialized'=>'string'], +'http\Message::valid' => ['bool'], +'http\Message\Body::__construct' => ['void', 'stream='=>'resource'], +'http\Message\Body::__toString' => ['string'], +'http\Message\Body::addForm' => ['http\Message\Body', 'fields='=>'?array', 'files='=>'?array'], +'http\Message\Body::addPart' => ['http\Message\Body', 'message'=>'http\Message'], +'http\Message\Body::append' => ['http\Message\Body', 'string'=>'string'], +'http\Message\Body::etag' => ['false|string'], +'http\Message\Body::getBoundary' => ['null|string'], +'http\Message\Body::getResource' => ['resource'], +'http\Message\Body::serialize' => ['string'], +'http\Message\Body::stat' => ['int|object', 'field='=>'mixed'], +'http\Message\Body::toCallback' => ['http\Message\Body', 'callback'=>'callable', 'offset='=>'mixed', 'maxlen='=>'mixed'], +'http\Message\Body::toStream' => ['http\Message\Body', 'stream'=>'resource', 'offset='=>'mixed', 'maxlen='=>'mixed'], +'http\Message\Body::toString' => ['string'], +'http\Message\Body::unserialize' => ['void', 'serialized'=>'string'], +'http\Message\Parser::getState' => ['int'], +'http\Message\Parser::parse' => ['int', 'data'=>'string', 'flags'=>'int', '&message'=>'http\Message'], +'http\Message\Parser::stream' => ['int', 'stream'=>'resource', 'flags'=>'int', '&message'=>'http\Message'], +'http\Params::__construct' => ['void', 'params='=>'mixed', 'param_sep='=>'mixed', 'arg_sep='=>'mixed', 'val_sep='=>'mixed', 'flags='=>'mixed'], +'http\Params::__toString' => ['string'], +'http\Params::offsetExists' => ['bool', 'name'=>'mixed'], +'http\Params::offsetGet' => ['mixed', 'name'=>'mixed'], +'http\Params::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], +'http\Params::offsetUnset' => ['void', 'name'=>'mixed'], +'http\Params::toArray' => ['array'], +'http\Params::toString' => ['string'], +'http\QueryString::__construct' => ['void', 'querystring'=>'string'], +'http\QueryString::__toString' => ['string'], +'http\QueryString::get' => ['http\QueryString|string|mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool|false'], +'http\QueryString::getArray' => ['array|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], +'http\QueryString::getBool' => ['bool|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], +'http\QueryString::getFloat' => ['float|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], +'http\QueryString::getGlobalInstance' => ['http\QueryString'], +'http\QueryString::getInt' => ['int|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], +'http\QueryString::getIterator' => ['IteratorAggregate'], +'http\QueryString::getObject' => ['object|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], +'http\QueryString::getString' => ['string|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], +'http\QueryString::mod' => ['http\QueryString', 'params='=>'mixed'], +'http\QueryString::offsetExists' => ['bool', 'offset'=>'mixed'], +'http\QueryString::offsetGet' => ['mixed|null', 'offset'=>'mixed'], +'http\QueryString::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], +'http\QueryString::offsetUnset' => ['void', 'offset'=>'mixed'], +'http\QueryString::serialize' => ['string'], +'http\QueryString::set' => ['http\QueryString', 'params'=>'mixed'], +'http\QueryString::toArray' => ['array'], +'http\QueryString::toString' => ['string'], +'http\QueryString::unserialize' => ['void', 'serialized'=>'string'], +'http\QueryString::xlate' => ['http\QueryString'], +'http\Url::__construct' => ['void', 'old_url='=>'mixed', 'new_url='=>'mixed', 'flags='=>'int'], +'http\Url::__toString' => ['string'], +'http\Url::mod' => ['http\Url', 'parts'=>'mixed', 'flags='=>'float|int|mixed'], +'http\Url::toArray' => ['string[]'], +'http\Url::toString' => ['string'], +'http_build_cookie' => ['string', 'cookie'=>'array'], +'http_build_query' => ['string', 'data'=>'array|object', 'numeric_prefix='=>'string', 'arg_separator='=>'string', 'encoding_type='=>'int'], +'http_build_str' => ['string', 'query'=>'array', 'prefix='=>'?string', 'arg_separator='=>'string'], +'http_build_url' => ['string', 'url='=>'string|array', 'parts='=>'string|array', 'flags='=>'int', 'new_url='=>'array'], +'http_cache_etag' => ['bool', 'etag='=>'string'], +'http_cache_last_modified' => ['bool', 'timestamp_or_expires='=>'int'], +'http_chunked_decode' => ['string|false', 'encoded'=>'string'], +'http_date' => ['string', 'timestamp='=>'int'], +'http_deflate' => ['?string', 'data'=>'string', 'flags='=>'int'], +'http_get' => ['string', 'url'=>'string', 'options='=>'array', 'info='=>'array'], +'http_get_request_body' => ['?string'], +'http_get_request_body_stream' => ['?resource'], +'http_get_request_headers' => ['array'], +'http_head' => ['string', 'url'=>'string', 'options='=>'array', 'info='=>'array'], +'http_inflate' => ['?string', 'data'=>'string'], +'http_match_etag' => ['bool', 'etag'=>'string', 'for_range='=>'bool'], +'http_match_modified' => ['bool', 'timestamp='=>'int', 'for_range='=>'bool'], +'http_match_request_header' => ['bool', 'header'=>'string', 'value'=>'string', 'match_case='=>'bool'], +'http_negotiate_charset' => ['string', 'supported'=>'array', 'result='=>'array'], +'http_negotiate_content_type' => ['string', 'supported'=>'array', 'result='=>'array'], +'http_negotiate_language' => ['string', 'supported'=>'array', 'result='=>'array'], +'http_parse_cookie' => ['stdClass|false', 'cookie'=>'string', 'flags='=>'int', 'allowed_extras='=>'array'], +'http_parse_headers' => ['array|false', 'header'=>'string'], +'http_parse_message' => ['object', 'message'=>'string'], +'http_parse_params' => ['stdClass', 'param'=>'string', 'flags='=>'int'], +'http_persistent_handles_clean' => ['string', 'ident='=>'string'], +'http_persistent_handles_count' => ['stdClass|false'], +'http_persistent_handles_ident' => ['string|false', 'ident='=>'string'], +'http_post_data' => ['string', 'url'=>'string', 'data'=>'string', 'options='=>'array', 'info='=>'array'], +'http_post_fields' => ['string', 'url'=>'string', 'data'=>'array', 'files='=>'array', 'options='=>'array', 'info='=>'array'], +'http_put_data' => ['string', 'url'=>'string', 'data'=>'string', 'options='=>'array', 'info='=>'array'], +'http_put_file' => ['string', 'url'=>'string', 'file'=>'string', 'options='=>'array', 'info='=>'array'], +'http_put_stream' => ['string', 'url'=>'string', 'stream'=>'resource', 'options='=>'array', 'info='=>'array'], +'http_redirect' => ['int|false', 'url='=>'string', 'params='=>'array', 'session='=>'bool', 'status='=>'int'], +'http_request' => ['string', 'method'=>'int', 'url'=>'string', 'body='=>'string', 'options='=>'array', 'info='=>'array'], +'http_request_body_encode' => ['string|false', 'fields'=>'array', 'files'=>'array'], +'http_request_method_exists' => ['bool', 'method'=>'mixed'], +'http_request_method_name' => ['string|false', 'method'=>'int'], +'http_request_method_register' => ['int|false', 'method'=>'string'], +'http_request_method_unregister' => ['bool', 'method'=>'mixed'], +'http_response_code' => ['int|bool', 'response_code='=>'int'], +'http_send_content_disposition' => ['bool', 'filename'=>'string', 'inline='=>'bool'], +'http_send_content_type' => ['bool', 'content_type='=>'string'], +'http_send_data' => ['bool', 'data'=>'string'], +'http_send_file' => ['bool', 'file'=>'string'], +'http_send_last_modified' => ['bool', 'timestamp='=>'int'], +'http_send_status' => ['bool', 'status'=>'int'], +'http_send_stream' => ['bool', 'stream'=>'resource'], +'http_support' => ['int', 'feature='=>'int'], +'http_throttle' => ['void', 'sec'=>'float', 'bytes='=>'int'], +'HttpDeflateStream::__construct' => ['void', 'flags='=>'int'], +'HttpDeflateStream::factory' => ['HttpDeflateStream', 'flags='=>'int', 'class_name='=>'string'], +'HttpDeflateStream::finish' => ['string', 'data='=>'string'], +'HttpDeflateStream::flush' => ['string|false', 'data='=>'string'], +'HttpDeflateStream::update' => ['string|false', 'data'=>'string'], +'HttpInflateStream::__construct' => ['void', 'flags='=>'int'], +'HttpInflateStream::factory' => ['HttpInflateStream', 'flags='=>'int', 'class_name='=>'string'], +'HttpInflateStream::finish' => ['string', 'data='=>'string'], +'HttpInflateStream::flush' => ['string|false', 'data='=>'string'], +'HttpInflateStream::update' => ['string|false', 'data'=>'string'], +'HttpMessage::__construct' => ['void', 'message='=>'string'], +'HttpMessage::__toString' => ['string'], +'HttpMessage::addHeaders' => ['void', 'headers'=>'array', 'append='=>'bool'], +'HttpMessage::count' => ['int'], +'HttpMessage::current' => ['mixed'], +'HttpMessage::detach' => ['HttpMessage'], +'HttpMessage::factory' => ['?HttpMessage', 'raw_message='=>'string', 'class_name='=>'string'], +'HttpMessage::fromEnv' => ['?HttpMessage', 'message_type'=>'int', 'class_name='=>'string'], +'HttpMessage::fromString' => ['?HttpMessage', 'raw_message='=>'string', 'class_name='=>'string'], +'HttpMessage::getBody' => ['string'], +'HttpMessage::getHeader' => ['?string', 'header'=>'string'], +'HttpMessage::getHeaders' => ['array'], +'HttpMessage::getHttpVersion' => ['string'], +'HttpMessage::getInfo' => [''], +'HttpMessage::getParentMessage' => ['HttpMessage'], +'HttpMessage::getRequestMethod' => ['string|false'], +'HttpMessage::getRequestUrl' => ['string|false'], +'HttpMessage::getResponseCode' => ['int'], +'HttpMessage::getResponseStatus' => ['string'], +'HttpMessage::getType' => ['int'], +'HttpMessage::guessContentType' => ['string|false', 'magic_file'=>'string', 'magic_mode='=>'int'], +'HttpMessage::key' => ['int|string'], +'HttpMessage::next' => ['void'], +'HttpMessage::prepend' => ['void', 'message'=>'HttpMessage', 'top='=>'bool'], +'HttpMessage::reverse' => ['HttpMessage'], +'HttpMessage::rewind' => ['void'], +'HttpMessage::send' => ['bool'], +'HttpMessage::serialize' => ['string'], +'HttpMessage::setBody' => ['void', 'body'=>'string'], +'HttpMessage::setHeaders' => ['void', 'headers'=>'array'], +'HttpMessage::setHttpVersion' => ['bool', 'version'=>'string'], +'HttpMessage::setInfo' => ['', 'http_info'=>''], +'HttpMessage::setRequestMethod' => ['bool', 'method'=>'string'], +'HttpMessage::setRequestUrl' => ['bool', 'url'=>'string'], +'HttpMessage::setResponseCode' => ['bool', 'code'=>'int'], +'HttpMessage::setResponseStatus' => ['bool', 'status'=>'string'], +'HttpMessage::setType' => ['void', 'type'=>'int'], +'HttpMessage::toMessageTypeObject' => ['HttpRequest|HttpResponse|null'], +'HttpMessage::toString' => ['string', 'include_parent='=>'bool'], +'HttpMessage::unserialize' => ['void', 'serialized'=>'string'], +'HttpMessage::valid' => ['bool'], +'HttpQueryString::__construct' => ['void', 'global='=>'bool', 'add='=>'mixed'], +'HttpQueryString::__toString' => ['string'], +'HttpQueryString::factory' => ['', 'global'=>'', 'params'=>'', 'class_name'=>''], +'HttpQueryString::get' => ['mixed', 'key='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], +'HttpQueryString::getArray' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], +'HttpQueryString::getBool' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], +'HttpQueryString::getFloat' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], +'HttpQueryString::getInt' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], +'HttpQueryString::getObject' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], +'HttpQueryString::getString' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], +'HttpQueryString::mod' => ['HttpQueryString', 'params'=>'mixed'], +'HttpQueryString::offsetExists' => ['bool', 'offset'=>'mixed'], +'HttpQueryString::offsetGet' => ['mixed', 'offset'=>'mixed'], +'HttpQueryString::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], +'HttpQueryString::offsetUnset' => ['void', 'offset'=>'mixed'], +'HttpQueryString::serialize' => ['string'], +'HttpQueryString::set' => ['string', 'params'=>'mixed'], +'HttpQueryString::singleton' => ['HttpQueryString', 'global='=>'bool'], +'HttpQueryString::toArray' => ['array'], +'HttpQueryString::toString' => ['string'], +'HttpQueryString::unserialize' => ['void', 'serialized'=>'string'], +'HttpQueryString::xlate' => ['bool', 'ie'=>'string', 'oe'=>'string'], +'HttpRequest::__construct' => ['void', 'url='=>'string', 'request_method='=>'int', 'options='=>'array'], +'HttpRequest::addBody' => ['', 'request_body_data'=>''], +'HttpRequest::addCookies' => ['bool', 'cookies'=>'array'], +'HttpRequest::addHeaders' => ['bool', 'headers'=>'array'], +'HttpRequest::addPostFields' => ['bool', 'post_data'=>'array'], +'HttpRequest::addPostFile' => ['bool', 'name'=>'string', 'file'=>'string', 'content_type='=>'string'], +'HttpRequest::addPutData' => ['bool', 'put_data'=>'string'], +'HttpRequest::addQueryData' => ['bool', 'query_params'=>'array'], +'HttpRequest::addRawPostData' => ['bool', 'raw_post_data'=>'string'], +'HttpRequest::addSslOptions' => ['bool', 'options'=>'array'], +'HttpRequest::clearHistory' => ['void'], +'HttpRequest::enableCookies' => ['bool'], +'HttpRequest::encodeBody' => ['', 'fields'=>'', 'files'=>''], +'HttpRequest::factory' => ['', 'url'=>'', 'method'=>'', 'options'=>'', 'class_name'=>''], +'HttpRequest::flushCookies' => [''], +'HttpRequest::get' => ['', 'url'=>'', 'options'=>'', '&info'=>''], +'HttpRequest::getBody' => [''], +'HttpRequest::getContentType' => ['string'], +'HttpRequest::getCookies' => ['array'], +'HttpRequest::getHeaders' => ['array'], +'HttpRequest::getHistory' => ['HttpMessage'], +'HttpRequest::getMethod' => ['int'], +'HttpRequest::getOptions' => ['array'], +'HttpRequest::getPostFields' => ['array'], +'HttpRequest::getPostFiles' => ['array'], +'HttpRequest::getPutData' => ['string'], +'HttpRequest::getPutFile' => ['string'], +'HttpRequest::getQueryData' => ['string'], +'HttpRequest::getRawPostData' => ['string'], +'HttpRequest::getRawRequestMessage' => ['string'], +'HttpRequest::getRawResponseMessage' => ['string'], +'HttpRequest::getRequestMessage' => ['HttpMessage'], +'HttpRequest::getResponseBody' => ['string'], +'HttpRequest::getResponseCode' => ['int'], +'HttpRequest::getResponseCookies' => ['stdClass[]', 'flags='=>'int', 'allowed_extras='=>'array'], +'HttpRequest::getResponseData' => ['array'], +'HttpRequest::getResponseHeader' => ['mixed', 'name='=>'string'], +'HttpRequest::getResponseInfo' => ['mixed', 'name='=>'string'], +'HttpRequest::getResponseMessage' => ['HttpMessage'], +'HttpRequest::getResponseStatus' => ['string'], +'HttpRequest::getSslOptions' => ['array'], +'HttpRequest::getUrl' => ['string'], +'HttpRequest::head' => ['', 'url'=>'', 'options'=>'', '&info'=>''], +'HttpRequest::methodExists' => ['', 'method'=>''], +'HttpRequest::methodName' => ['', 'method_id'=>''], +'HttpRequest::methodRegister' => ['', 'method_name'=>''], +'HttpRequest::methodUnregister' => ['', 'method'=>''], +'HttpRequest::postData' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], +'HttpRequest::postFields' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], +'HttpRequest::putData' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], +'HttpRequest::putFile' => ['', 'url'=>'', 'file'=>'', 'options'=>'', '&info'=>''], +'HttpRequest::putStream' => ['', 'url'=>'', 'stream'=>'', 'options'=>'', '&info'=>''], +'HttpRequest::resetCookies' => ['bool', 'session_only='=>'bool'], +'HttpRequest::send' => ['HttpMessage'], +'HttpRequest::setBody' => ['bool', 'request_body_data='=>'string'], +'HttpRequest::setContentType' => ['bool', 'content_type'=>'string'], +'HttpRequest::setCookies' => ['bool', 'cookies='=>'array'], +'HttpRequest::setHeaders' => ['bool', 'headers='=>'array'], +'HttpRequest::setMethod' => ['bool', 'request_method'=>'int'], +'HttpRequest::setOptions' => ['bool', 'options='=>'array'], +'HttpRequest::setPostFields' => ['bool', 'post_data'=>'array'], +'HttpRequest::setPostFiles' => ['bool', 'post_files'=>'array'], +'HttpRequest::setPutData' => ['bool', 'put_data='=>'string'], +'HttpRequest::setPutFile' => ['bool', 'file='=>'string'], +'HttpRequest::setQueryData' => ['bool', 'query_data'=>'mixed'], +'HttpRequest::setRawPostData' => ['bool', 'raw_post_data='=>'string'], +'HttpRequest::setSslOptions' => ['bool', 'options='=>'array'], +'HttpRequest::setUrl' => ['bool', 'url'=>'string'], +'HttpRequestDataShare::__construct' => ['void'], +'HttpRequestDataShare::__destruct' => ['void'], +'HttpRequestDataShare::attach' => ['', 'request'=>'HttpRequest'], +'HttpRequestDataShare::count' => ['int'], +'HttpRequestDataShare::detach' => ['', 'request'=>'HttpRequest'], +'HttpRequestDataShare::factory' => ['', 'global'=>'', 'class_name'=>''], +'HttpRequestDataShare::reset' => [''], +'HttpRequestDataShare::singleton' => ['', 'global'=>''], +'HttpRequestPool::__construct' => ['void', 'request='=>'HttpRequest'], +'HttpRequestPool::__destruct' => ['void'], +'HttpRequestPool::attach' => ['bool', 'request'=>'HttpRequest'], +'HttpRequestPool::count' => ['int'], +'HttpRequestPool::current' => ['mixed'], +'HttpRequestPool::detach' => ['bool', 'request'=>'HttpRequest'], +'HttpRequestPool::enableEvents' => ['', 'enable'=>''], +'HttpRequestPool::enablePipelining' => ['', 'enable'=>''], +'HttpRequestPool::getAttachedRequests' => ['array'], +'HttpRequestPool::getFinishedRequests' => ['array'], +'HttpRequestPool::key' => ['int|string'], +'HttpRequestPool::next' => ['void'], +'HttpRequestPool::reset' => ['void'], +'HttpRequestPool::rewind' => ['void'], +'HttpRequestPool::send' => ['bool'], +'HttpRequestPool::socketPerform' => ['bool'], +'HttpRequestPool::socketSelect' => ['bool', 'timeout='=>'float'], +'HttpRequestPool::valid' => ['bool'], +'HttpResponse::capture' => ['void'], +'HttpResponse::getBufferSize' => ['int'], +'HttpResponse::getCache' => ['bool'], +'HttpResponse::getCacheControl' => ['string'], +'HttpResponse::getContentDisposition' => ['string'], +'HttpResponse::getContentType' => ['string'], +'HttpResponse::getData' => ['string'], +'HttpResponse::getETag' => ['string'], +'HttpResponse::getFile' => ['string'], +'HttpResponse::getGzip' => ['bool'], +'HttpResponse::getHeader' => ['mixed', 'name='=>'string'], +'HttpResponse::getLastModified' => ['int'], +'HttpResponse::getRequestBody' => ['string'], +'HttpResponse::getRequestBodyStream' => ['resource'], +'HttpResponse::getRequestHeaders' => ['array'], +'HttpResponse::getStream' => ['resource'], +'HttpResponse::getThrottleDelay' => ['float'], +'HttpResponse::guessContentType' => ['string|false', 'magic_file'=>'string', 'magic_mode='=>'int'], +'HttpResponse::redirect' => ['void', 'url='=>'string', 'params='=>'array', 'session='=>'bool', 'status='=>'int'], +'HttpResponse::send' => ['bool', 'clean_ob='=>'bool'], +'HttpResponse::setBufferSize' => ['bool', 'bytes'=>'int'], +'HttpResponse::setCache' => ['bool', 'cache'=>'bool'], +'HttpResponse::setCacheControl' => ['bool', 'control'=>'string', 'max_age='=>'int', 'must_revalidate='=>'bool'], +'HttpResponse::setContentDisposition' => ['bool', 'filename'=>'string', 'inline='=>'bool'], +'HttpResponse::setContentType' => ['bool', 'content_type'=>'string'], +'HttpResponse::setData' => ['bool', 'data'=>'mixed'], +'HttpResponse::setETag' => ['bool', 'etag'=>'string'], +'HttpResponse::setFile' => ['bool', 'file'=>'string'], +'HttpResponse::setGzip' => ['bool', 'gzip'=>'bool'], +'HttpResponse::setHeader' => ['bool', 'name'=>'string', 'value='=>'mixed', 'replace='=>'bool'], +'HttpResponse::setLastModified' => ['bool', 'timestamp'=>'int'], +'HttpResponse::setStream' => ['bool', 'stream'=>'resource'], +'HttpResponse::setThrottleDelay' => ['bool', 'seconds'=>'float'], +'HttpResponse::status' => ['bool', 'status'=>'int'], +'HttpUtil::buildCookie' => ['', 'cookie_array'=>''], +'HttpUtil::buildStr' => ['', 'query'=>'', 'prefix'=>'', 'arg_sep'=>''], +'HttpUtil::buildUrl' => ['', 'url'=>'', 'parts'=>'', 'flags'=>'', '&composed'=>''], +'HttpUtil::chunkedDecode' => ['', 'encoded_string'=>''], +'HttpUtil::date' => ['', 'timestamp'=>''], +'HttpUtil::deflate' => ['', 'plain'=>'', 'flags'=>''], +'HttpUtil::inflate' => ['', 'encoded'=>''], +'HttpUtil::matchEtag' => ['', 'plain_etag'=>'', 'for_range'=>''], +'HttpUtil::matchModified' => ['', 'last_modified'=>'', 'for_range'=>''], +'HttpUtil::matchRequestHeader' => ['', 'header_name'=>'', 'header_value'=>'', 'case_sensitive'=>''], +'HttpUtil::negotiateCharset' => ['', 'supported'=>'', '&result'=>''], +'HttpUtil::negotiateContentType' => ['', 'supported'=>'', '&result'=>''], +'HttpUtil::negotiateLanguage' => ['', 'supported'=>'', '&result'=>''], +'HttpUtil::parseCookie' => ['', 'cookie_string'=>''], +'HttpUtil::parseHeaders' => ['', 'headers_string'=>''], +'HttpUtil::parseMessage' => ['', 'message_string'=>''], +'HttpUtil::parseParams' => ['', 'param_string'=>'', 'flags'=>''], +'HttpUtil::support' => ['', 'feature'=>''], +'hw_api::checkin' => ['bool', 'parameter'=>'array'], +'hw_api::checkout' => ['bool', 'parameter'=>'array'], +'hw_api::children' => ['array', 'parameter'=>'array'], +'hw_api::content' => ['HW_API_Content', 'parameter'=>'array'], +'hw_api::copy' => ['hw_api_content', 'parameter'=>'array'], +'hw_api::dbstat' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::dcstat' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::dstanchors' => ['array', 'parameter'=>'array'], +'hw_api::dstofsrcanchor' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::find' => ['array', 'parameter'=>'array'], +'hw_api::ftstat' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::hwstat' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::identify' => ['bool', 'parameter'=>'array'], +'hw_api::info' => ['array', 'parameter'=>'array'], +'hw_api::insert' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::insertanchor' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::insertcollection' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::insertdocument' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::link' => ['bool', 'parameter'=>'array'], +'hw_api::lock' => ['bool', 'parameter'=>'array'], +'hw_api::move' => ['bool', 'parameter'=>'array'], +'hw_api::object' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::objectbyanchor' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::parents' => ['array', 'parameter'=>'array'], +'hw_api::remove' => ['bool', 'parameter'=>'array'], +'hw_api::replace' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::setcommittedversion' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::srcanchors' => ['array', 'parameter'=>'array'], +'hw_api::srcsofdst' => ['array', 'parameter'=>'array'], +'hw_api::unlock' => ['bool', 'parameter'=>'array'], +'hw_api::user' => ['hw_api_object', 'parameter'=>'array'], +'hw_api::userlist' => ['array', 'parameter'=>'array'], +'hw_api_attribute' => ['HW_API_Attribute', 'name='=>'string', 'value='=>'string'], +'hw_api_attribute::key' => ['string'], +'hw_api_attribute::langdepvalue' => ['string', 'language'=>'string'], +'hw_api_attribute::value' => ['string'], +'hw_api_attribute::values' => ['array'], +'hw_api_content' => ['HW_API_Content', 'content'=>'string', 'mimetype'=>'string'], +'hw_api_content::mimetype' => ['string'], +'hw_api_content::read' => ['string', 'buffer'=>'string', 'length'=>'int'], +'hw_api_error::count' => ['int'], +'hw_api_error::reason' => ['HW_API_Reason'], +'hw_api_object' => ['hw_api_object', 'parameter'=>'array'], +'hw_api_object::assign' => ['bool', 'parameter'=>'array'], +'hw_api_object::attreditable' => ['bool', 'parameter'=>'array'], +'hw_api_object::count' => ['int', 'parameter'=>'array'], +'hw_api_object::insert' => ['bool', 'attribute'=>'hw_api_attribute'], +'hw_api_object::remove' => ['bool', 'name'=>'string'], +'hw_api_object::title' => ['string', 'parameter'=>'array'], +'hw_api_object::value' => ['string', 'name'=>'string'], +'hw_api_reason::description' => ['string'], +'hw_api_reason::type' => ['HW_API_Reason'], +'hw_Array2Objrec' => ['string', 'object_array'=>'array'], +'hw_changeobject' => ['bool', 'link'=>'int', 'objid'=>'int', 'attributes'=>'array'], +'hw_Children' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_ChildrenObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_Close' => ['bool', 'connection'=>'int'], +'hw_Connect' => ['int', 'host'=>'string', 'port'=>'int', 'username='=>'string', 'password='=>'string'], +'hw_connection_info' => ['', 'link'=>'int'], +'hw_cp' => ['int', 'connection'=>'int', 'object_id_array'=>'array', 'destination_id'=>'int'], +'hw_Deleteobject' => ['bool', 'connection'=>'int', 'object_to_delete'=>'int'], +'hw_DocByAnchor' => ['int', 'connection'=>'int', 'anchorid'=>'int'], +'hw_DocByAnchorObj' => ['string', 'connection'=>'int', 'anchorid'=>'int'], +'hw_Document_Attributes' => ['string', 'hw_document'=>'int'], +'hw_Document_BodyTag' => ['string', 'hw_document'=>'int', 'prefix='=>'string'], +'hw_Document_Content' => ['string', 'hw_document'=>'int'], +'hw_Document_SetContent' => ['bool', 'hw_document'=>'int', 'content'=>'string'], +'hw_Document_Size' => ['int', 'hw_document'=>'int'], +'hw_dummy' => ['string', 'link'=>'int', 'id'=>'int', 'msgid'=>'int'], +'hw_EditText' => ['bool', 'connection'=>'int', 'hw_document'=>'int'], +'hw_Error' => ['int', 'connection'=>'int'], +'hw_ErrorMsg' => ['string', 'connection'=>'int'], +'hw_Free_Document' => ['bool', 'hw_document'=>'int'], +'hw_GetAnchors' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_GetAnchorsObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_GetAndLock' => ['string', 'connection'=>'int', 'objectid'=>'int'], +'hw_GetChildColl' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_GetChildCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_GetChildDocColl' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_GetChildDocCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_GetObject' => ['', 'connection'=>'int', 'objectid'=>'', 'query='=>'string'], +'hw_GetObjectByQuery' => ['array', 'connection'=>'int', 'query'=>'string', 'max_hits'=>'int'], +'hw_GetObjectByQueryColl' => ['array', 'connection'=>'int', 'objectid'=>'int', 'query'=>'string', 'max_hits'=>'int'], +'hw_GetObjectByQueryCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int', 'query'=>'string', 'max_hits'=>'int'], +'hw_GetObjectByQueryObj' => ['array', 'connection'=>'int', 'query'=>'string', 'max_hits'=>'int'], +'hw_GetParents' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_GetParentsObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_getrellink' => ['string', 'link'=>'int', 'rootid'=>'int', 'sourceid'=>'int', 'destid'=>'int'], +'hw_GetRemote' => ['int', 'connection'=>'int', 'objectid'=>'int'], +'hw_getremotechildren' => ['', 'connection'=>'int', 'object_record'=>'string'], +'hw_GetSrcByDestObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], +'hw_GetText' => ['int', 'connection'=>'int', 'objectid'=>'int', 'prefix='=>''], +'hw_getusername' => ['string', 'connection'=>'int'], +'hw_Identify' => ['string', 'link'=>'int', 'username'=>'string', 'password'=>'string'], +'hw_InCollections' => ['array', 'connection'=>'int', 'object_id_array'=>'array', 'collection_id_array'=>'array', 'return_collections'=>'int'], +'hw_Info' => ['string', 'connection'=>'int'], +'hw_InsColl' => ['int', 'connection'=>'int', 'objectid'=>'int', 'object_array'=>'array'], +'hw_InsDoc' => ['int', 'connection'=>'', 'parentid'=>'int', 'object_record'=>'string', 'text='=>'string'], +'hw_insertanchors' => ['bool', 'hwdoc'=>'int', 'anchorecs'=>'array', 'dest'=>'array', 'urlprefixes='=>'array'], +'hw_InsertDocument' => ['int', 'connection'=>'int', 'parent_id'=>'int', 'hw_document'=>'int'], +'hw_InsertObject' => ['int', 'connection'=>'int', 'object_rec'=>'string', 'parameter'=>'string'], +'hw_mapid' => ['int', 'connection'=>'int', 'server_id'=>'int', 'object_id'=>'int'], +'hw_Modifyobject' => ['bool', 'connection'=>'int', 'object_to_change'=>'int', 'remove'=>'array', 'add'=>'array', 'mode='=>'int'], +'hw_mv' => ['int', 'connection'=>'int', 'object_id_array'=>'array', 'source_id'=>'int', 'destination_id'=>'int'], +'hw_New_Document' => ['int', 'object_record'=>'string', 'document_data'=>'string', 'document_size'=>'int'], +'hw_objrec2array' => ['array', 'object_record'=>'string', 'format='=>'array'], +'hw_Output_Document' => ['bool', 'hw_document'=>'int'], +'hw_pConnect' => ['int', 'host'=>'string', 'port'=>'int', 'username='=>'string', 'password='=>'string'], +'hw_PipeDocument' => ['int', 'connection'=>'int', 'objectid'=>'int', 'url_prefixes='=>'array'], +'hw_Root' => ['int'], +'hw_setlinkroot' => ['int', 'link'=>'int', 'rootid'=>'int'], +'hw_stat' => ['string', 'link'=>'int'], +'hw_Unlock' => ['bool', 'connection'=>'int', 'objectid'=>'int'], +'hw_Who' => ['array', 'connection'=>'int'], +'hwapi_attribute_new' => ['HW_API_Attribute', 'name='=>'string', 'value='=>'string'], +'hwapi_content_new' => ['HW_API_Content', 'content'=>'string', 'mimetype'=>'string'], +'hwapi_hgcsp' => ['HW_API', 'hostname'=>'string', 'port='=>'int'], +'hwapi_object_new' => ['hw_api_object', 'parameter'=>'array'], +'hypot' => ['float', 'x'=>'float', 'y'=>'float'], +'ibase_add_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password'=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], +'ibase_affected_rows' => ['int', 'link_identifier='=>'resource'], +'ibase_backup' => ['mixed', 'service_handle'=>'resource', 'source_db'=>'string', 'dest_file'=>'string', 'options='=>'int', 'verbose='=>'bool'], +'ibase_blob_add' => ['void', 'blob_handle'=>'resource', 'data'=>'string'], +'ibase_blob_cancel' => ['bool', 'blob_handle'=>'resource'], +'ibase_blob_close' => ['string|bool', 'blob_handle'=>'resource'], +'ibase_blob_create' => ['resource', 'link_identifier='=>'resource'], +'ibase_blob_echo' => ['bool', 'link_identifier'=>'', 'blob_id'=>'string'], +'ibase_blob_echo\'1' => ['bool', 'blob_id'=>'string'], +'ibase_blob_get' => ['string|false', 'blob_handle'=>'resource', 'length'=>'int'], +'ibase_blob_import' => ['string|false', 'link_identifier'=>'resource', 'file_handle'=>'resource'], +'ibase_blob_info' => ['array', 'link_identifier'=>'resource', 'blob_id'=>'string'], +'ibase_blob_info\'1' => ['array', 'blob_id'=>'string'], +'ibase_blob_open' => ['resource|false', 'link_identifier'=>'', 'blob_id'=>'string'], +'ibase_blob_open\'1' => ['resource', 'blob_id'=>'string'], +'ibase_close' => ['bool', 'link_identifier='=>'resource'], +'ibase_commit' => ['bool', 'link_identifier='=>'resource'], +'ibase_commit_ret' => ['bool', 'link_identifier='=>'resource'], +'ibase_connect' => ['resource|false', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'buffers='=>'int', 'dialect='=>'int', 'role='=>'string'], +'ibase_db_info' => ['string', 'service_handle'=>'resource', 'db'=>'string', 'action'=>'int', 'argument='=>'int'], +'ibase_delete_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password='=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], +'ibase_drop_db' => ['bool', 'link_identifier='=>'resource'], +'ibase_errcode' => ['int|false'], +'ibase_errmsg' => ['string|false'], +'ibase_execute' => ['resource|false', 'query'=>'resource', 'bind_arg='=>'mixed', '...args='=>'mixed'], +'ibase_fetch_assoc' => ['array|false', 'result'=>'resource', 'fetch_flags='=>'int'], +'ibase_fetch_object' => ['object|false', 'result'=>'resource', 'fetch_flags='=>'int'], +'ibase_fetch_row' => ['array|false', 'result'=>'resource', 'fetch_flags='=>'int'], +'ibase_field_info' => ['array', 'query_result'=>'resource', 'field_number'=>'int'], +'ibase_free_event_handler' => ['bool', 'event'=>'resource'], +'ibase_free_query' => ['bool', 'query'=>'resource'], +'ibase_free_result' => ['bool', 'result'=>'resource'], +'ibase_gen_id' => ['int|string', 'generator'=>'string', 'increment='=>'int', 'link_identifier='=>'resource'], +'ibase_maintain_db' => ['bool', 'service_handle'=>'resource', 'db'=>'string', 'action'=>'int', 'argument='=>'int'], +'ibase_modify_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password'=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], +'ibase_name_result' => ['bool', 'result'=>'resource', 'name'=>'string'], +'ibase_num_fields' => ['int', 'query_result'=>'resource'], +'ibase_num_params' => ['int', 'query'=>'resource'], +'ibase_num_rows' => ['int', 'result_identifier'=>''], +'ibase_param_info' => ['array', 'query'=>'resource', 'field_number'=>'int'], +'ibase_pconnect' => ['resource|false', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'buffers='=>'int', 'dialect='=>'int', 'role='=>'string'], +'ibase_prepare' => ['resource|false', 'link_identifier'=>'', 'query'=>'string', 'trans_identifier'=>''], +'ibase_query' => ['resource|false', 'link_identifier='=>'resource', 'string='=>'string', 'bind_arg='=>'int', '...args='=>''], +'ibase_restore' => ['mixed', 'service_handle'=>'resource', 'source_file'=>'string', 'dest_db'=>'string', 'options='=>'int', 'verbose='=>'bool'], +'ibase_rollback' => ['bool', 'link_identifier='=>'resource'], +'ibase_rollback_ret' => ['bool', 'link_identifier='=>'resource'], +'ibase_server_info' => ['string', 'service_handle'=>'resource', 'action'=>'int'], +'ibase_service_attach' => ['resource', 'host'=>'string', 'dba_username'=>'string', 'dba_password'=>'string'], +'ibase_service_detach' => ['bool', 'service_handle'=>'resource'], +'ibase_set_event_handler' => ['resource', 'link_identifier'=>'', 'callback'=>'callable', 'event='=>'string', '...args='=>''], +'ibase_set_event_handler\'1' => ['resource', 'callback'=>'callable', 'event'=>'string', '...args'=>''], +'ibase_timefmt' => ['bool', 'format'=>'string', 'columntype='=>'int'], +'ibase_trans' => ['resource|false', 'trans_args='=>'int', 'link_identifier='=>'', '...args='=>''], +'ibase_wait_event' => ['string', 'link_identifier'=>'', 'event='=>'string', '...args='=>''], +'ibase_wait_event\'1' => ['string', 'event'=>'string', '...args'=>''], +'iconv' => ['string|false', 'from_encoding'=>'string', 'to_encoding'=>'string', 'string'=>'string'], +'iconv_get_encoding' => ['mixed', 'type='=>'string'], +'iconv_mime_decode' => ['string|false', 'string'=>'string', 'mode='=>'int', 'encoding='=>'string'], +'iconv_mime_decode_headers' => ['array|false', 'headers'=>'string', 'mode='=>'int', 'encoding='=>'string'], +'iconv_mime_encode' => ['string|false', 'field_name'=>'string', 'field_value'=>'string', 'options='=>'array'], +'iconv_set_encoding' => ['bool', 'type'=>'string', 'encoding'=>'string'], +'iconv_strlen' => ['0|positive-int|false', 'string'=>'string', 'encoding='=>'string'], +'iconv_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], +'iconv_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'], +'iconv_substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int', 'encoding='=>'string'], +'id3_get_frame_long_name' => ['string', 'frameid'=>'string'], +'id3_get_frame_short_name' => ['string', 'frameid'=>'string'], +'id3_get_genre_id' => ['int', 'genre'=>'string'], +'id3_get_genre_list' => ['array'], +'id3_get_genre_name' => ['string', 'genre_id'=>'int'], +'id3_get_tag' => ['array', 'filename'=>'string', 'version='=>'int'], +'id3_get_version' => ['int', 'filename'=>'string'], +'id3_remove_tag' => ['bool', 'filename'=>'string', 'version='=>'int'], +'id3_set_tag' => ['bool', 'filename'=>'string', 'tag'=>'array', 'version='=>'int'], +'idate' => ['int', 'format'=>'string', 'timestamp='=>'int'], +'idn_strerror' => ['string', 'errorcode'=>'int'], +'idn_to_ascii' => ['string|false', 'domain'=>'string', 'flags='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'], +'idn_to_utf8' => ['string|false', 'domain'=>'string', 'flags='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'], +'ifx_affected_rows' => ['int', 'result_id'=>'resource'], +'ifx_blobinfile_mode' => ['bool', 'mode'=>'int'], +'ifx_byteasvarchar' => ['bool', 'mode'=>'int'], +'ifx_close' => ['bool', 'link_identifier='=>'resource'], +'ifx_connect' => ['resource', 'database='=>'string', 'userid='=>'string', 'password='=>'string'], +'ifx_copy_blob' => ['int', 'bid'=>'int'], +'ifx_create_blob' => ['int', 'type'=>'int', 'mode'=>'int', 'param'=>'string'], +'ifx_create_char' => ['int', 'param'=>'string'], +'ifx_do' => ['bool', 'result_id'=>'resource'], +'ifx_error' => ['string', 'link_identifier='=>'resource'], +'ifx_errormsg' => ['string', 'errorcode='=>'int'], +'ifx_fetch_row' => ['array', 'result_id'=>'resource', 'position='=>'mixed'], +'ifx_fieldproperties' => ['array', 'result_id'=>'resource'], +'ifx_fieldtypes' => ['array', 'result_id'=>'resource'], +'ifx_free_blob' => ['bool', 'bid'=>'int'], +'ifx_free_char' => ['bool', 'bid'=>'int'], +'ifx_free_result' => ['bool', 'result_id'=>'resource'], +'ifx_get_blob' => ['string', 'bid'=>'int'], +'ifx_get_char' => ['string', 'bid'=>'int'], +'ifx_getsqlca' => ['array', 'result_id'=>'resource'], +'ifx_htmltbl_result' => ['int', 'result_id'=>'resource', 'html_table_options='=>'string'], +'ifx_nullformat' => ['bool', 'mode'=>'int'], +'ifx_num_fields' => ['int', 'result_id'=>'resource'], +'ifx_num_rows' => ['int', 'result_id'=>'resource'], +'ifx_pconnect' => ['resource', 'database='=>'string', 'userid='=>'string', 'password='=>'string'], +'ifx_prepare' => ['resource', 'query'=>'string', 'link_identifier'=>'resource', 'cursor_def='=>'int', 'blobidarray='=>'mixed'], +'ifx_query' => ['resource', 'query'=>'string', 'link_identifier'=>'resource', 'cursor_type='=>'int', 'blobidarray='=>'mixed'], +'ifx_textasvarchar' => ['bool', 'mode'=>'int'], +'ifx_update_blob' => ['bool', 'bid'=>'int', 'content'=>'string'], +'ifx_update_char' => ['bool', 'bid'=>'int', 'content'=>'string'], +'ifxus_close_slob' => ['bool', 'bid'=>'int'], +'ifxus_create_slob' => ['int', 'mode'=>'int'], +'ifxus_free_slob' => ['bool', 'bid'=>'int'], +'ifxus_open_slob' => ['int', 'bid'=>'int', 'mode'=>'int'], +'ifxus_read_slob' => ['string', 'bid'=>'int', 'nbytes'=>'int'], +'ifxus_seek_slob' => ['int', 'bid'=>'int', 'mode'=>'int', 'offset'=>'int'], +'ifxus_tell_slob' => ['int', 'bid'=>'int'], +'ifxus_write_slob' => ['int', 'bid'=>'int', 'content'=>'string'], +'igbinary_serialize' => ['string|false', 'value'=>'mixed'], +'igbinary_unserialize' => ['mixed', 'string'=>'string'], +'ignore_user_abort' => ['int', 'enable='=>'bool'], +'iis_add_server' => ['int', 'path'=>'string', 'comment'=>'string', 'server_ip'=>'string', 'port'=>'int', 'host_name'=>'string', 'rights'=>'int', 'start_server'=>'int'], +'iis_get_dir_security' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string'], +'iis_get_script_map' => ['string', 'server_instance'=>'int', 'virtual_path'=>'string', 'script_extension'=>'string'], +'iis_get_server_by_comment' => ['int', 'comment'=>'string'], +'iis_get_server_by_path' => ['int', 'path'=>'string'], +'iis_get_server_rights' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string'], +'iis_get_service_state' => ['int', 'service_id'=>'string'], +'iis_remove_server' => ['int', 'server_instance'=>'int'], +'iis_set_app_settings' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'application_scope'=>'string'], +'iis_set_dir_security' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'directory_flags'=>'int'], +'iis_set_script_map' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'script_extension'=>'string', 'engine_path'=>'string', 'allow_scripting'=>'int'], +'iis_set_server_rights' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'directory_flags'=>'int'], +'iis_start_server' => ['int', 'server_instance'=>'int'], +'iis_start_service' => ['int', 'service_id'=>'string'], +'iis_stop_server' => ['int', 'server_instance'=>'int'], +'iis_stop_service' => ['int', 'service_id'=>'string'], +'image_type_to_extension' => ['string', 'image_type'=>'int', 'include_dot='=>'bool'], +'image_type_to_mime_type' => ['string', 'image_type'=>'int'], +'imageaffine' => ['false|GdImage', 'image'=>'GdImage', 'affine'=>'array', 'clip='=>'?array'], +'imageaffinematrixconcat' => ['array{0:float,1:float,2:float,3:float,4:float,5:float}|false', 'matrix1'=>'array', 'matrix2'=>'array'], +'imageaffinematrixget' => ['array{0:float,1:float,2:float,3:float,4:float,5:float}|false', 'type'=>'int', 'options'=>'array|float'], +'imagealphablending' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], +'imageantialias' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], +'imagearc' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int'], +'imageavif' => ['bool', 'image'=>'GdImage', 'file='=>'resource|string|null', 'quality='=>'int', 'speed='=>'int'], +'imagebmp' => ['bool', 'image'=>'GdImage', 'file='=>'resource|string|null', 'compressed='=>'bool'], +'imagechar' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], +'imagecharup' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], +'imagecolorallocate' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], +'imagecolorallocatealpha' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], +'imagecolorat' => ['int|false', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int'], +'imagecolorclosest' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], +'imagecolorclosestalpha' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], +'imagecolorclosesthwb' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], +'imagecolordeallocate' => ['bool', 'image'=>'GdImage', 'color'=>'int'], +'imagecolorexact' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], +'imagecolorexactalpha' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], +'imagecolormatch' => ['bool', 'image1'=>'GdImage', 'image2'=>'GdImage'], +'imagecolorresolve' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], +'imagecolorresolvealpha' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], +'imagecolorset' => ['void', 'image'=>'GdImage', 'color'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], +'imagecolorsforindex' => ['array|false', 'image'=>'GdImage', 'color'=>'int'], +'imagecolorstotal' => ['int|false', 'image'=>'GdImage'], +'imagecolortransparent' => ['int|false', 'image'=>'GdImage', 'color='=>'int'], +'imageconvolution' => ['bool', 'image'=>'GdImage', 'matrix'=>'array', 'divisor'=>'float', 'offset'=>'float'], +'imagecopy' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int'], +'imagecopymerge' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], +'imagecopymergegray' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], +'imagecopyresampled' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], +'imagecopyresized' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], +'imagecreate' => ['false|GdImage', 'width'=>'int', 'height'=>'int'], +'imagecreatefromavif' => ['false|GdImage', 'filename'=>'string'], +'imagecreatefrombmp' => ['false|GdImage', 'filename'=>'string'], +'imagecreatefromgd' => ['false|GdImage', 'filename'=>'string'], +'imagecreatefromgd2' => ['false|GdImage', 'filename'=>'string'], +'imagecreatefromgd2part' => ['false|GdImage', 'filename'=>'string', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int'], +'imagecreatefromgif' => ['false|GdImage', 'filename'=>'string'], +'imagecreatefromjpeg' => ['false|GdImage', 'filename'=>'string'], +'imagecreatefrompng' => ['false|GdImage', 'filename'=>'string'], +'imagecreatefromstring' => ['false|GdImage', 'data'=>'string'], +'imagecreatefromwbmp' => ['false|GdImage', 'filename'=>'string'], +'imagecreatefromwebp' => ['false|GdImage', 'filename'=>'string'], +'imagecreatefromxbm' => ['false|GdImage', 'filename'=>'string'], +'imagecreatefromxpm' => ['false|GdImage', 'filename'=>'string'], +'imagecreatetruecolor' => ['false|GdImage', 'width'=>'int', 'height'=>'int'], +'imagecrop' => ['false|GdImage', 'image'=>'GdImage', 'rectangle'=>'array'], +'imagecropauto' => ['false|GdImage', 'image'=>'GdImage', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'], +'imagedashedline' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], +'imagedestroy' => ['bool', 'image'=>'GdImage'], +'imageellipse' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], +'imagefill' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'color'=>'int'], +'imagefilledarc' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int', 'style'=>'int'], +'imagefilledellipse' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], +'imagefilledpolygon' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], +'imagefilledrectangle' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], +'imagefilltoborder' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'border_color'=>'int', 'color'=>'int'], +'imagefilter' => ['bool', 'image'=>'GdImage', 'filter'=>'int', 'args='=>'int', 'arg2='=>'int', 'arg3='=>'int', 'arg4='=>'int'], +'imageflip' => ['bool', 'image'=>'GdImage', 'mode'=>'int'], +'imagefontheight' => ['int', 'font'=>'int'], +'imagefontwidth' => ['int', 'font'=>'int'], +'imageftbbox' => ['array|false', 'size'=>'float', 'angle'=>'float', 'font_filename'=>'string', 'string'=>'string', 'options='=>'array'], +'imagefttext' => ['array|false', 'image'=>'GdImage', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string', 'options='=>'array'], +'imagegammacorrect' => ['bool', 'image'=>'GdImage', 'input_gamma'=>'float', 'output_gamma'=>'float'], +'imagegd' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null'], +'imagegd2' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'chunk_size='=>'int', 'mode='=>'int'], +'imagegetclip' => ['array', 'image'=>'GdImage'], +'imagegetinterpolation' => ['int', 'image'=>'GdImage'], +'imagegif' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null'], +'imagegrabscreen' => ['false|GdImage'], +'imagegrabwindow' => ['false|GdImage', 'handle'=>'int', 'client_area='=>'int'], +'imageinterlace' => ['int|false', 'image'=>'GdImage', 'enable='=>'int'], +'imageistruecolor' => ['bool', 'image'=>'GdImage'], +'imagejpeg' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int'], +'imagelayereffect' => ['bool', 'image'=>'GdImage', 'effect'=>'int'], +'imageline' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], +'imageloadfont' => ['int|false', 'filename'=>'string'], +'imageObj::pasteImage' => ['void', 'srcImg'=>'imageObj', 'transparentColorHex'=>'int', 'dstX'=>'int', 'dstY'=>'int', 'angle'=>'int'], +'imageObj::saveImage' => ['int', 'filename'=>'string', 'oMap'=>'mapObj'], +'imageObj::saveWebImage' => ['string'], +'imageopenpolygon' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'], +'imagepalettecopy' => ['void', 'dst'=>'GdImage', 'src'=>'GdImage'], +'imagepalettetotruecolor' => ['bool', 'image'=>'GdImage'], +'imagepng' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int', 'filters='=>'int'], +'imagepolygon' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], +'imagerectangle' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], +'imageresolution' => ['array|bool', 'image'=>'GdImage', 'resolution_x='=>'int', 'resolution_y='=>'int'], +'imagerotate' => ['false|GdImage', 'image'=>'GdImage', 'angle'=>'float', 'background_color'=>'int', 'ignore_transparent='=>'int'], +'imagesavealpha' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], +'imagescale' => ['false|GdImage', 'image'=>'GdImage', 'width'=>'int', 'height='=>'int', 'mode='=>'int'], +'imagesetbrush' => ['bool', 'image'=>'GdImage', 'brush'=>'GdImage'], +'imagesetclip' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'x2'=>'int', 'y1'=>'int', 'y2'=>'int'], +'imagesetinterpolation' => ['bool', 'image'=>'GdImage', 'method'=>'int'], +'imagesetpixel' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'color'=>'int'], +'imagesetstyle' => ['bool', 'image'=>'GdImage', 'style'=>'non-empty-array'], +'imagesetthickness' => ['bool', 'image'=>'GdImage', 'thickness'=>'int'], +'imagesettile' => ['bool', 'image'=>'GdImage', 'tile'=>'GdImage'], +'imagestring' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], +'imagestringup' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], +'imagesx' => ['int|false', 'image'=>'GdImage'], +'imagesy' => ['int|false', 'image'=>'GdImage'], +'imagetruecolortopalette' => ['bool', 'image'=>'GdImage', 'dither'=>'bool', 'num_colors'=>'int'], +'imagettfbbox' => ['false|array', 'size'=>'float', 'angle'=>'float', 'font_filename'=>'string', 'string'=>'string'], +'imagettftext' => ['false|array', 'image'=>'GdImage', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string'], +'imagetypes' => ['int'], +'imagewbmp' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'foreground_color='=>'int'], +'imagewebp' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int'], +'imagexbm' => ['bool', 'image'=>'GdImage', 'filename='=>'?string', 'foreground_color='=>'int'], +'Imagick::__construct' => ['void', 'files='=>'string|string[]'], +'Imagick::__toString' => ['string'], +'Imagick::adaptiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], +'Imagick::adaptiveResizeImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool'], +'Imagick::adaptiveSharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], +'Imagick::adaptiveThresholdImage' => ['bool', 'width'=>'int', 'height'=>'int', 'offset'=>'int'], +'Imagick::addImage' => ['bool', 'source'=>'Imagick'], +'Imagick::addNoiseImage' => ['bool', 'noise_type'=>'int', 'channel='=>'int'], +'Imagick::affineTransformImage' => ['bool', 'matrix'=>'ImagickDraw'], +'Imagick::animateImages' => ['bool', 'x_server'=>'string'], +'Imagick::annotateImage' => ['bool', 'draw_settings'=>'ImagickDraw', 'x'=>'float', 'y'=>'float', 'angle'=>'float', 'text'=>'string'], +'Imagick::appendImages' => ['Imagick', 'stack'=>'bool'], +'Imagick::autoGammaImage' => ['bool', 'channel='=>'int'], +'Imagick::autoLevelImage' => ['void', 'CHANNEL='=>'string'], +'Imagick::autoOrient' => ['bool'], +'Imagick::averageImages' => ['Imagick'], +'Imagick::blackThresholdImage' => ['bool', 'threshold'=>'mixed'], +'Imagick::blueShiftImage' => ['void', 'factor='=>'float'], +'Imagick::blurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], +'Imagick::borderImage' => ['bool', 'bordercolor'=>'mixed', 'width'=>'int', 'height'=>'int'], +'Imagick::brightnessContrastImage' => ['void', 'brightness'=>'string', 'contrast'=>'string', 'CHANNEL='=>'string'], +'Imagick::charcoalImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'], +'Imagick::chopImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], +'Imagick::clampImage' => ['void', 'CHANNEL='=>'string'], +'Imagick::clear' => ['bool'], +'Imagick::clipImage' => ['bool'], +'Imagick::clipImagePath' => ['void', 'pathname'=>'string', 'inside'=>'string'], +'Imagick::clipPathImage' => ['bool', 'pathname'=>'string', 'inside'=>'bool'], +'Imagick::clone' => ['Imagick'], +'Imagick::clutImage' => ['bool', 'lookup_table'=>'Imagick', 'channel='=>'float'], +'Imagick::coalesceImages' => ['Imagick'], +'Imagick::colorFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'], +'Imagick::colorizeImage' => ['bool', 'colorize'=>'mixed', 'opacity'=>'mixed'], +'Imagick::colorMatrixImage' => ['void', 'color_matrix'=>'string'], +'Imagick::combineImages' => ['Imagick', 'channeltype'=>'int'], +'Imagick::commentImage' => ['bool', 'comment'=>'string'], +'Imagick::compareImageChannels' => ['array{Imagick, float}', 'image'=>'Imagick', 'channeltype'=>'int', 'metrictype'=>'int'], +'Imagick::compareImageLayers' => ['Imagick', 'method'=>'int'], +'Imagick::compareImages' => ['array{Imagick, float}', 'compare'=>'Imagick', 'metric'=>'int'], +'Imagick::compositeImage' => ['bool', 'composite_object'=>'Imagick', 'composite'=>'int', 'x'=>'int', 'y'=>'int', 'channel='=>'int'], +'Imagick::compositeImageGravity' => ['bool', 'Imagick'=>'Imagick', 'COMPOSITE_CONSTANT'=>'int', 'GRAVITY_CONSTANT'=>'int'], +'Imagick::contrastImage' => ['bool', 'sharpen'=>'bool'], +'Imagick::contrastStretchImage' => ['bool', 'black_point'=>'float', 'white_point'=>'float', 'channel='=>'int'], +'Imagick::convolveImage' => ['bool', 'kernel'=>'array', 'channel='=>'int'], +'Imagick::count' => ['void', 'mode='=>'string'], +'Imagick::cropImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], +'Imagick::cropThumbnailImage' => ['bool', 'width'=>'int', 'height'=>'int', 'legacy='=>'bool'], +'Imagick::current' => ['Imagick'], +'Imagick::cycleColormapImage' => ['bool', 'displace'=>'int'], +'Imagick::decipherImage' => ['bool', 'passphrase'=>'string'], +'Imagick::deconstructImages' => ['Imagick'], +'Imagick::deleteImageArtifact' => ['bool', 'artifact'=>'string'], +'Imagick::deleteImageProperty' => ['void', 'name'=>'string'], +'Imagick::deskewImage' => ['bool', 'threshold'=>'float'], +'Imagick::despeckleImage' => ['bool'], +'Imagick::destroy' => ['bool'], +'Imagick::displayImage' => ['bool', 'servername'=>'string'], +'Imagick::displayImages' => ['bool', 'servername'=>'string'], +'Imagick::distortImage' => ['bool', 'method'=>'int', 'arguments'=>'array', 'bestfit'=>'bool'], +'Imagick::drawImage' => ['bool', 'draw'=>'ImagickDraw'], +'Imagick::edgeImage' => ['bool', 'radius'=>'float'], +'Imagick::embossImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'], +'Imagick::encipherImage' => ['bool', 'passphrase'=>'string'], +'Imagick::enhanceImage' => ['bool'], +'Imagick::equalizeImage' => ['bool'], +'Imagick::evaluateImage' => ['bool', 'op'=>'int', 'constant'=>'float', 'channel='=>'int'], +'Imagick::evaluateImages' => ['bool', 'EVALUATE_CONSTANT'=>'int'], +'Imagick::exportImagePixels' => ['list', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int'], +'Imagick::extentImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], +'Imagick::filter' => ['void', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'int'], +'Imagick::flattenImages' => ['Imagick'], +'Imagick::flipImage' => ['bool'], +'Imagick::floodFillPaintImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'target'=>'mixed', 'x'=>'int', 'y'=>'int', 'invert'=>'bool', 'channel='=>'int'], +'Imagick::flopImage' => ['bool'], +'Imagick::forwardFourierTransformimage' => ['void', 'magnitude'=>'bool'], +'Imagick::frameImage' => ['bool', 'matte_color'=>'mixed', 'width'=>'int', 'height'=>'int', 'inner_bevel'=>'int', 'outer_bevel'=>'int'], +'Imagick::functionImage' => ['bool', 'function'=>'int', 'arguments'=>'array', 'channel='=>'int'], +'Imagick::fxImage' => ['Imagick', 'expression'=>'string', 'channel='=>'int'], +'Imagick::gammaImage' => ['bool', 'gamma'=>'float', 'channel='=>'int'], +'Imagick::gaussianBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], +'Imagick::getColorspace' => ['int'], +'Imagick::getCompression' => ['int'], +'Imagick::getCompressionQuality' => ['int'], +'Imagick::getConfigureOptions' => ['string'], +'Imagick::getCopyright' => ['string'], +'Imagick::getFeatures' => ['string'], +'Imagick::getFilename' => ['string'], +'Imagick::getFont' => ['string|false'], +'Imagick::getFormat' => ['string'], +'Imagick::getGravity' => ['int'], +'Imagick::getHDRIEnabled' => ['int'], +'Imagick::getHomeURL' => ['string'], +'Imagick::getImage' => ['Imagick'], +'Imagick::getImageAlphaChannel' => ['int'], +'Imagick::getImageArtifact' => ['string', 'artifact'=>'string'], +'Imagick::getImageAttribute' => ['string', 'key'=>'string'], +'Imagick::getImageBackgroundColor' => ['ImagickPixel'], +'Imagick::getImageBlob' => ['string'], +'Imagick::getImageBluePrimary' => ['array{x:float, y:float}'], +'Imagick::getImageBorderColor' => ['ImagickPixel'], +'Imagick::getImageChannelDepth' => ['int', 'channel'=>'int'], +'Imagick::getImageChannelDistortion' => ['float', 'reference'=>'Imagick', 'channel'=>'int', 'metric'=>'int'], +'Imagick::getImageChannelDistortions' => ['float', 'reference'=>'Imagick', 'metric'=>'int', 'channel='=>'int'], +'Imagick::getImageChannelExtrema' => ['array{minima:int, maxima:int}', 'channel'=>'int'], +'Imagick::getImageChannelKurtosis' => ['array{kurtosis:float, skewness:float}', 'channel='=>'int'], +'Imagick::getImageChannelMean' => ['array{mean:float, standardDeviation:float}', 'channel'=>'int'], +'Imagick::getImageChannelRange' => ['array{minima:float, maxima:float}', 'channel'=>'int'], +'Imagick::getImageChannelStatistics' => ['array'], +'Imagick::getImageClipMask' => ['Imagick'], +'Imagick::getImageColormapColor' => ['ImagickPixel', 'index'=>'int'], +'Imagick::getImageColors' => ['int'], +'Imagick::getImageColorspace' => ['int'], +'Imagick::getImageCompose' => ['int'], +'Imagick::getImageCompression' => ['int'], +'Imagick::getImageCompressionQuality' => ['int'], +'Imagick::getImageDelay' => ['int'], +'Imagick::getImageDepth' => ['int'], +'Imagick::getImageDispose' => ['int'], +'Imagick::getImageDistortion' => ['float', 'reference'=>'magickwand', 'metric'=>'int'], +'Imagick::getImageExtrema' => ['array{min:int, max:int}'], +'Imagick::getImageFilename' => ['string'], +'Imagick::getImageFormat' => ['string'], +'Imagick::getImageGamma' => ['float'], +'Imagick::getImageGeometry' => ['array{width:int, height:int}'], +'Imagick::getImageGravity' => ['int'], +'Imagick::getImageGreenPrimary' => ['array{x:float, y:float}'], +'Imagick::getImageHeight' => ['int'], +'Imagick::getImageHistogram' => ['list'], +'Imagick::getImageIndex' => ['int'], +'Imagick::getImageInterlaceScheme' => ['int'], +'Imagick::getImageInterpolateMethod' => ['int'], +'Imagick::getImageIterations' => ['int'], +'Imagick::getImageLength' => ['int'], +'Imagick::getImageMagickLicense' => ['string'], +'Imagick::getImageMatte' => ['bool'], +'Imagick::getImageMatteColor' => ['ImagickPixel'], +'Imagick::getImageMimeType' => ['string'], +'Imagick::getImageOrientation' => ['int'], +'Imagick::getImagePage' => ['array{width:int, height:int, x:int, y:int}'], +'Imagick::getImagePixelColor' => ['ImagickPixel', 'x'=>'int', 'y'=>'int'], +'Imagick::getImageProfile' => ['string', 'name'=>'string'], +'Imagick::getImageProfiles' => ['array', 'pattern='=>'string', 'only_names='=>'bool'], +'Imagick::getImageProperties' => ['array', 'pattern='=>'string', 'only_names='=>'bool'], +'Imagick::getImageProperty' => ['string|false', 'name'=>'string'], +'Imagick::getImageRedPrimary' => ['array{x:float, y:float}'], +'Imagick::getImageRegion' => ['Imagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], +'Imagick::getImageRenderingIntent' => ['int'], +'Imagick::getImageResolution' => ['array{x:float, y:float}'], +'Imagick::getImagesBlob' => ['string'], +'Imagick::getImageScene' => ['int'], +'Imagick::getImageSignature' => ['string'], +'Imagick::getImageSize' => ['int'], +'Imagick::getImageTicksPerSecond' => ['int'], +'Imagick::getImageTotalInkDensity' => ['float'], +'Imagick::getImageType' => ['int'], +'Imagick::getImageUnits' => ['int'], +'Imagick::getImageVirtualPixelMethod' => ['int'], +'Imagick::getImageWhitePoint' => ['array{x:float, y:float}'], +'Imagick::getImageWidth' => ['int'], +'Imagick::getInterlaceScheme' => ['int'], +'Imagick::getIteratorIndex' => ['int'], +'Imagick::getNumberImages' => ['int'], +'Imagick::getOption' => ['string', 'key'=>'string'], +'Imagick::getPackageName' => ['string'], +'Imagick::getPage' => ['array{width:int, height:int, x:int, y:int}'], +'Imagick::getPixelIterator' => ['ImagickPixelIterator'], +'Imagick::getPixelRegionIterator' => ['ImagickPixelIterator', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'], +'Imagick::getPointSize' => ['float'], +'Imagick::getQuantum' => ['int'], +'Imagick::getQuantumDepth' => ['array{quantumDepthLong:int, quantumDepthString:string}'], +'Imagick::getQuantumRange' => ['array{quantumRangeLong:int, quantumRangeString:string}'], +'Imagick::getRegistry' => ['string|false', 'key'=>'string'], +'Imagick::getReleaseDate' => ['string'], +'Imagick::getResource' => ['int', 'type'=>'int'], +'Imagick::getResourceLimit' => ['int', 'type'=>'int'], +'Imagick::getSamplingFactors' => ['array'], +'Imagick::getSize' => ['array{columns:int, rows: int}'], +'Imagick::getSizeOffset' => ['int'], +'Imagick::getVersion' => ['array{versionNumber: int, versionString:string}'], +'Imagick::haldClutImage' => ['bool', 'clut'=>'Imagick', 'channel='=>'int'], +'Imagick::hasNextImage' => ['bool'], +'Imagick::hasPreviousImage' => ['bool'], +'Imagick::identifyFormat' => ['string|false', 'embedText'=>'string'], +'Imagick::identifyImage' => ['array', 'appendrawoutput='=>'bool'], +'Imagick::identifyImageType' => ['int'], +'Imagick::implodeImage' => ['bool', 'radius'=>'float'], +'Imagick::importImagePixels' => ['bool', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int', 'pixels'=>'list'], +'Imagick::inverseFourierTransformImage' => ['void', 'complement'=>'string', 'magnitude'=>'string'], +'Imagick::key' => ['int|string'], +'Imagick::labelImage' => ['bool', 'label'=>'string'], +'Imagick::levelImage' => ['bool', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'int'], +'Imagick::linearStretchImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float'], +'Imagick::liquidRescaleImage' => ['bool', 'width'=>'int', 'height'=>'int', 'delta_x'=>'float', 'rigidity'=>'float'], +'Imagick::listRegistry' => ['array'], +'Imagick::localContrastImage' => ['bool', 'radius'=>'float', 'strength'=>'float'], +'Imagick::magnifyImage' => ['bool'], +'Imagick::mapImage' => ['bool', 'map'=>'Imagick', 'dither'=>'bool'], +'Imagick::matteFloodfillImage' => ['bool', 'alpha'=>'float', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'], +'Imagick::medianFilterImage' => ['bool', 'radius'=>'float'], +'Imagick::mergeImageLayers' => ['Imagick', 'layer_method'=>'int'], +'Imagick::minifyImage' => ['bool'], +'Imagick::modulateImage' => ['bool', 'brightness'=>'float', 'saturation'=>'float', 'hue'=>'float'], +'Imagick::montageImage' => ['Imagick', 'draw'=>'ImagickDraw', 'tile_geometry'=>'string', 'thumbnail_geometry'=>'string', 'mode'=>'int', 'frame'=>'string'], +'Imagick::morphImages' => ['Imagick', 'number_frames'=>'int'], +'Imagick::morphology' => ['void', 'morphologyMethod'=>'int', 'iterations'=>'int', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'string'], +'Imagick::mosaicImages' => ['Imagick'], +'Imagick::motionBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float', 'channel='=>'int'], +'Imagick::negateImage' => ['bool', 'gray'=>'bool', 'channel='=>'int'], +'Imagick::newImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'background'=>'mixed', 'format='=>'string'], +'Imagick::newPseudoImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'pseudostring'=>'string'], +'Imagick::next' => ['void'], +'Imagick::nextImage' => ['bool'], +'Imagick::normalizeImage' => ['bool', 'channel='=>'int'], +'Imagick::oilPaintImage' => ['bool', 'radius'=>'float'], +'Imagick::opaquePaintImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'invert'=>'bool', 'channel='=>'int'], +'Imagick::optimizeImageLayers' => ['bool'], +'Imagick::orderedPosterizeImage' => ['bool', 'threshold_map'=>'string', 'channel='=>'int'], +'Imagick::paintFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int', 'channel='=>'int'], +'Imagick::paintOpaqueImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'channel='=>'int'], +'Imagick::paintTransparentImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float'], +'Imagick::pingImage' => ['bool', 'filename'=>'string'], +'Imagick::pingImageBlob' => ['bool', 'image'=>'string'], +'Imagick::pingImageFile' => ['bool', 'filehandle'=>'resource', 'filename='=>'string'], +'Imagick::polaroidImage' => ['bool', 'properties'=>'ImagickDraw', 'angle'=>'float'], +'Imagick::posterizeImage' => ['bool', 'levels'=>'int', 'dither'=>'bool'], +'Imagick::previewImages' => ['bool', 'preview'=>'int'], +'Imagick::previousImage' => ['bool'], +'Imagick::profileImage' => ['bool', 'name'=>'string', 'profile'=>'string'], +'Imagick::quantizeImage' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], +'Imagick::quantizeImages' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], +'Imagick::queryFontMetrics' => ['array', 'properties'=>'ImagickDraw', 'text'=>'string', 'multiline='=>'bool'], +'Imagick::queryFonts' => ['array', 'pattern='=>'string'], +'Imagick::queryFormats' => ['list', 'pattern='=>'string'], +'Imagick::radialBlurImage' => ['bool', 'angle'=>'float', 'channel='=>'int'], +'Imagick::raiseImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int', 'raise'=>'bool'], +'Imagick::randomThresholdImage' => ['bool', 'low'=>'float', 'high'=>'float', 'channel='=>'int'], +'Imagick::readImage' => ['bool', 'filename'=>'string'], +'Imagick::readImageBlob' => ['bool', 'image'=>'string', 'filename='=>'string'], +'Imagick::readImageFile' => ['bool', 'filehandle'=>'resource', 'filename='=>'string'], +'Imagick::readImages' => ['Imagick', 'filenames'=>'string'], +'Imagick::recolorImage' => ['bool', 'matrix'=>'list'], +'Imagick::reduceNoiseImage' => ['bool', 'radius'=>'float'], +'Imagick::remapImage' => ['bool', 'replacement'=>'Imagick', 'dither'=>'int'], +'Imagick::removeImage' => ['bool'], +'Imagick::removeImageProfile' => ['string', 'name'=>'string'], +'Imagick::render' => ['bool'], +'Imagick::resampleImage' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float', 'filter'=>'int', 'blur'=>'float'], +'Imagick::resetImagePage' => ['bool', 'page'=>'string'], +'Imagick::resetIterator' => [''], +'Imagick::resizeImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'filter'=>'int', 'blur'=>'float', 'bestfit='=>'bool'], +'Imagick::rewind' => ['void'], +'Imagick::rollImage' => ['bool', 'x'=>'int', 'y'=>'int'], +'Imagick::rotateImage' => ['bool', 'background'=>'mixed', 'degrees'=>'float'], +'Imagick::rotationalBlurImage' => ['void', 'angle'=>'string', 'CHANNEL='=>'string'], +'Imagick::roundCorners' => ['bool', 'x_rounding'=>'float', 'y_rounding'=>'float', 'stroke_width='=>'float', 'displace='=>'float', 'size_correction='=>'float'], +'Imagick::roundCornersImage' => ['', 'xRounding'=>'', 'yRounding'=>'', 'strokeWidth'=>'', 'displace'=>'', 'sizeCorrection'=>''], +'Imagick::sampleImage' => ['bool', 'columns'=>'int', 'rows'=>'int'], +'Imagick::scaleImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'bestfit='=>'bool'], +'Imagick::segmentImage' => ['bool', 'colorspace'=>'int', 'cluster_threshold'=>'float', 'smooth_threshold'=>'float', 'verbose='=>'bool'], +'Imagick::selectiveBlurImage' => ['void', 'radius'=>'float', 'sigma'=>'float', 'threshold'=>'float', 'CHANNEL'=>'int'], +'Imagick::separateImageChannel' => ['bool', 'channel'=>'int'], +'Imagick::sepiaToneImage' => ['bool', 'threshold'=>'float'], +'Imagick::setAntiAlias' => ['int', 'antialias'=>'bool'], +'Imagick::setBackgroundColor' => ['bool', 'background'=>'mixed'], +'Imagick::setColorspace' => ['bool', 'colorspace'=>'int'], +'Imagick::setCompression' => ['bool', 'compression'=>'int'], +'Imagick::setCompressionQuality' => ['bool', 'quality'=>'int'], +'Imagick::setFilename' => ['bool', 'filename'=>'string'], +'Imagick::setFirstIterator' => ['bool'], +'Imagick::setFont' => ['bool', 'font'=>'string'], +'Imagick::setFormat' => ['bool', 'format'=>'string'], +'Imagick::setGravity' => ['bool', 'gravity'=>'int'], +'Imagick::setImage' => ['bool', 'replace'=>'Imagick'], +'Imagick::setImageAlpha' => ['bool', 'alpha'=>'float'], +'Imagick::setImageAlphaChannel' => ['bool', 'mode'=>'int'], +'Imagick::setImageArtifact' => ['bool', 'artifact'=>'string', 'value'=>'string'], +'Imagick::setImageAttribute' => ['void', 'key'=>'string', 'value'=>'string'], +'Imagick::setImageBackgroundColor' => ['bool', 'background'=>'mixed'], +'Imagick::setImageBias' => ['bool', 'bias'=>'float'], +'Imagick::setImageBiasQuantum' => ['void', 'bias'=>'string'], +'Imagick::setImageBluePrimary' => ['bool', 'x'=>'float', 'y'=>'float'], +'Imagick::setImageBorderColor' => ['bool', 'border'=>'mixed'], +'Imagick::setImageChannelDepth' => ['bool', 'channel'=>'int', 'depth'=>'int'], +'Imagick::setImageChannelMask' => ['', 'channel'=>'int'], +'Imagick::setImageClipMask' => ['bool', 'clip_mask'=>'Imagick'], +'Imagick::setImageColormapColor' => ['bool', 'index'=>'int', 'color'=>'ImagickPixel'], +'Imagick::setImageColorspace' => ['bool', 'colorspace'=>'int'], +'Imagick::setImageCompose' => ['bool', 'compose'=>'int'], +'Imagick::setImageCompression' => ['bool', 'compression'=>'int'], +'Imagick::setImageCompressionQuality' => ['bool', 'quality'=>'int'], +'Imagick::setImageDelay' => ['bool', 'delay'=>'int'], +'Imagick::setImageDepth' => ['bool', 'depth'=>'int'], +'Imagick::setImageDispose' => ['bool', 'dispose'=>'int'], +'Imagick::setImageExtent' => ['bool', 'columns'=>'int', 'rows'=>'int'], +'Imagick::setImageFilename' => ['bool', 'filename'=>'string'], +'Imagick::setImageFormat' => ['bool', 'format'=>'string'], +'Imagick::setImageGamma' => ['bool', 'gamma'=>'float'], +'Imagick::setImageGravity' => ['bool', 'gravity'=>'int'], +'Imagick::setImageGreenPrimary' => ['bool', 'x'=>'float', 'y'=>'float'], +'Imagick::setImageIndex' => ['bool', 'index'=>'int'], +'Imagick::setImageInterlaceScheme' => ['bool', 'interlace_scheme'=>'int'], +'Imagick::setImageInterpolateMethod' => ['bool', 'method'=>'int'], +'Imagick::setImageIterations' => ['bool', 'iterations'=>'int'], +'Imagick::setImageMatte' => ['bool', 'matte'=>'bool'], +'Imagick::setImageMatteColor' => ['bool', 'matte'=>'mixed'], +'Imagick::setImageOpacity' => ['bool', 'opacity'=>'float'], +'Imagick::setImageOrientation' => ['bool', 'orientation'=>'int'], +'Imagick::setImagePage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], +'Imagick::setImageProfile' => ['bool', 'name'=>'string', 'profile'=>'string'], +'Imagick::setImageProgressMonitor' => ['', 'filename'=>''], +'Imagick::setImageProperty' => ['bool', 'name'=>'string', 'value'=>'string'], +'Imagick::setImageRedPrimary' => ['bool', 'x'=>'float', 'y'=>'float'], +'Imagick::setImageRenderingIntent' => ['bool', 'rendering_intent'=>'int'], +'Imagick::setImageResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'], +'Imagick::setImageScene' => ['bool', 'scene'=>'int'], +'Imagick::setImageTicksPerSecond' => ['bool', 'ticks_per_second'=>'int'], +'Imagick::setImageType' => ['bool', 'image_type'=>'int'], +'Imagick::setImageUnits' => ['bool', 'units'=>'int'], +'Imagick::setImageVirtualPixelMethod' => ['bool', 'method'=>'int'], +'Imagick::setImageWhitePoint' => ['bool', 'x'=>'float', 'y'=>'float'], +'Imagick::setInterlaceScheme' => ['bool', 'interlace_scheme'=>'int'], +'Imagick::setIteratorIndex' => ['bool', 'index'=>'int'], +'Imagick::setLastIterator' => ['bool'], +'Imagick::setOption' => ['bool', 'key'=>'string', 'value'=>'string'], +'Imagick::setPage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], +'Imagick::setPointSize' => ['bool', 'point_size'=>'float'], +'Imagick::setProgressMonitor' => ['void', 'callback'=>'callable'], +'Imagick::setRegistry' => ['void', 'key'=>'string', 'value'=>'string'], +'Imagick::setResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'], +'Imagick::setResourceLimit' => ['bool', 'type'=>'int', 'limit'=>'int'], +'Imagick::setSamplingFactors' => ['bool', 'factors'=>'list'], +'Imagick::setSize' => ['bool', 'columns'=>'int', 'rows'=>'int'], +'Imagick::setSizeOffset' => ['bool', 'columns'=>'int', 'rows'=>'int', 'offset'=>'int'], +'Imagick::setType' => ['bool', 'image_type'=>'int'], +'Imagick::shadeImage' => ['bool', 'gray'=>'bool', 'azimuth'=>'float', 'elevation'=>'float'], +'Imagick::shadowImage' => ['bool', 'opacity'=>'float', 'sigma'=>'float', 'x'=>'int', 'y'=>'int'], +'Imagick::sharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], +'Imagick::shaveImage' => ['bool', 'columns'=>'int', 'rows'=>'int'], +'Imagick::shearImage' => ['bool', 'background'=>'mixed', 'x_shear'=>'float', 'y_shear'=>'float'], +'Imagick::sigmoidalContrastImage' => ['bool', 'sharpen'=>'bool', 'alpha'=>'float', 'beta'=>'float', 'channel='=>'int'], +'Imagick::similarityImage' => ['Imagick', 'Imagick'=>'Imagick', '&bestMatch'=>'array', '&similarity'=>'float', 'similarity_threshold'=>'float', 'metric'=>'int'], +'Imagick::sketchImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float'], +'Imagick::smushImages' => ['Imagick', 'stack'=>'string', 'offset'=>'string'], +'Imagick::solarizeImage' => ['bool', 'threshold'=>'int'], +'Imagick::sparseColorImage' => ['bool', 'sparse_method'=>'int', 'arguments'=>'array', 'channel='=>'int'], +'Imagick::spliceImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], +'Imagick::spreadImage' => ['bool', 'radius'=>'float'], +'Imagick::statisticImage' => ['void', 'type'=>'int', 'width'=>'int', 'height'=>'int', 'CHANNEL='=>'string'], +'Imagick::steganoImage' => ['Imagick', 'watermark_wand'=>'Imagick', 'offset'=>'int'], +'Imagick::stereoImage' => ['bool', 'offset_wand'=>'Imagick'], +'Imagick::stripImage' => ['bool'], +'Imagick::subImageMatch' => ['Imagick', 'Imagick'=>'Imagick', '&w_offset='=>'array', '&w_similarity='=>'float'], +'Imagick::swirlImage' => ['bool', 'degrees'=>'float'], +'Imagick::textureImage' => ['bool', 'texture_wand'=>'Imagick'], +'Imagick::thresholdImage' => ['bool', 'threshold'=>'float', 'channel='=>'int'], +'Imagick::thumbnailImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool', 'fill='=>'bool', 'legacy='=>'bool'], +'Imagick::tintImage' => ['bool', 'tint'=>'mixed', 'opacity'=>'mixed'], +'Imagick::transformImage' => ['Imagick', 'crop'=>'string', 'geometry'=>'string'], +'Imagick::transformImageColorspace' => ['bool', 'colorspace'=>'int'], +'Imagick::transparentPaintImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float', 'invert'=>'bool'], +'Imagick::transposeImage' => ['bool'], +'Imagick::transverseImage' => ['bool'], +'Imagick::trimImage' => ['bool', 'fuzz'=>'float'], +'Imagick::uniqueImageColors' => ['bool'], +'Imagick::unsharpMaskImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'amount'=>'float', 'threshold'=>'float', 'channel='=>'int'], +'Imagick::valid' => ['bool'], +'Imagick::vignetteImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float', 'x'=>'int', 'y'=>'int'], +'Imagick::waveImage' => ['bool', 'amplitude'=>'float', 'length'=>'float'], +'Imagick::whiteThresholdImage' => ['bool', 'threshold'=>'mixed'], +'Imagick::writeImage' => ['bool', 'filename='=>'string'], +'Imagick::writeImageFile' => ['bool', 'filehandle'=>'resource'], +'Imagick::writeImages' => ['bool', 'filename'=>'string', 'adjoin'=>'bool'], +'Imagick::writeImagesFile' => ['bool', 'filehandle'=>'resource'], +'ImagickDraw::__construct' => ['void'], +'ImagickDraw::affine' => ['bool', 'affine'=>'array'], +'ImagickDraw::annotation' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'], +'ImagickDraw::arc' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float', 'sd'=>'float', 'ed'=>'float'], +'ImagickDraw::bezier' => ['bool', 'coordinates'=>'list'], +'ImagickDraw::circle' => ['bool', 'ox'=>'float', 'oy'=>'float', 'px'=>'float', 'py'=>'float'], +'ImagickDraw::clear' => ['bool'], +'ImagickDraw::clone' => ['ImagickDraw'], +'ImagickDraw::color' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'], +'ImagickDraw::comment' => ['bool', 'comment'=>'string'], +'ImagickDraw::composite' => ['bool', 'compose'=>'int', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float', 'compositewand'=>'Imagick'], +'ImagickDraw::destroy' => ['bool'], +'ImagickDraw::ellipse' => ['bool', 'ox'=>'float', 'oy'=>'float', 'rx'=>'float', 'ry'=>'float', 'start'=>'float', 'end'=>'float'], +'ImagickDraw::getBorderColor' => ['ImagickPixel'], +'ImagickDraw::getClipPath' => ['string|false'], +'ImagickDraw::getClipRule' => ['int'], +'ImagickDraw::getClipUnits' => ['int'], +'ImagickDraw::getDensity' => ['?string'], +'ImagickDraw::getFillColor' => ['ImagickPixel'], +'ImagickDraw::getFillOpacity' => ['float'], +'ImagickDraw::getFillRule' => ['int'], +'ImagickDraw::getFont' => ['string|false'], +'ImagickDraw::getFontFamily' => ['string|false'], +'ImagickDraw::getFontResolution' => ['array'], +'ImagickDraw::getFontSize' => ['float'], +'ImagickDraw::getFontStretch' => ['int'], +'ImagickDraw::getFontStyle' => ['int'], +'ImagickDraw::getFontWeight' => ['int'], +'ImagickDraw::getGravity' => ['int'], +'ImagickDraw::getOpacity' => ['float'], +'ImagickDraw::getStrokeAntialias' => ['bool'], +'ImagickDraw::getStrokeColor' => ['ImagickPixel'], +'ImagickDraw::getStrokeDashArray' => ['array'], +'ImagickDraw::getStrokeDashOffset' => ['float'], +'ImagickDraw::getStrokeLineCap' => ['int'], +'ImagickDraw::getStrokeLineJoin' => ['int'], +'ImagickDraw::getStrokeMiterLimit' => ['int'], +'ImagickDraw::getStrokeOpacity' => ['float'], +'ImagickDraw::getStrokeWidth' => ['float'], +'ImagickDraw::getTextAlignment' => ['int'], +'ImagickDraw::getTextAntialias' => ['bool'], +'ImagickDraw::getTextDecoration' => ['int'], +'ImagickDraw::getTextDirection' => ['bool'], +'ImagickDraw::getTextEncoding' => ['string'], +'ImagickDraw::getTextInterlineSpacing' => ['float'], +'ImagickDraw::getTextInterwordSpacing' => ['float'], +'ImagickDraw::getTextKerning' => ['float'], +'ImagickDraw::getTextUnderColor' => ['ImagickPixel'], +'ImagickDraw::getVectorGraphics' => ['string'], +'ImagickDraw::line' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float'], +'ImagickDraw::matte' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'], +'ImagickDraw::pathClose' => ['bool'], +'ImagickDraw::pathCurveToAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathCurveToQuadraticBezierAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathCurveToQuadraticBezierRelative' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathCurveToQuadraticBezierSmoothRelative' => ['bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathCurveToRelative' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathCurveToSmoothAbsolute' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathCurveToSmoothRelative' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathEllipticArcAbsolute' => ['bool', 'rx'=>'float', 'ry'=>'float', 'x_axis_rotation'=>'float', 'large_arc_flag'=>'bool', 'sweep_flag'=>'bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathEllipticArcRelative' => ['bool', 'rx'=>'float', 'ry'=>'float', 'x_axis_rotation'=>'float', 'large_arc_flag'=>'bool', 'sweep_flag'=>'bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathFinish' => ['bool'], +'ImagickDraw::pathLineToAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathLineToHorizontalAbsolute' => ['bool', 'x'=>'float'], +'ImagickDraw::pathLineToHorizontalRelative' => ['bool', 'x'=>'float'], +'ImagickDraw::pathLineToRelative' => ['bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathLineToVerticalAbsolute' => ['bool', 'y'=>'float'], +'ImagickDraw::pathLineToVerticalRelative' => ['bool', 'y'=>'float'], +'ImagickDraw::pathMoveToAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathMoveToRelative' => ['bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::pathStart' => ['bool'], +'ImagickDraw::point' => ['bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::polygon' => ['bool', 'coordinates'=>'list'], +'ImagickDraw::polyline' => ['bool', 'coordinates'=>'list'], +'ImagickDraw::pop' => ['bool'], +'ImagickDraw::popClipPath' => ['bool'], +'ImagickDraw::popDefs' => ['bool'], +'ImagickDraw::popPattern' => ['bool'], +'ImagickDraw::push' => ['bool'], +'ImagickDraw::pushClipPath' => ['bool', 'clip_mask_id'=>'string'], +'ImagickDraw::pushDefs' => ['bool'], +'ImagickDraw::pushPattern' => ['bool', 'pattern_id'=>'string', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], +'ImagickDraw::rectangle' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], +'ImagickDraw::render' => ['bool'], +'ImagickDraw::resetVectorGraphics' => ['void'], +'ImagickDraw::rotate' => ['bool', 'degrees'=>'float'], +'ImagickDraw::roundRectangle' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'rx'=>'float', 'ry'=>'float'], +'ImagickDraw::scale' => ['bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::setBorderColor' => ['bool', 'color'=>'ImagickPixel|string'], +'ImagickDraw::setClipPath' => ['bool', 'clip_mask'=>'string'], +'ImagickDraw::setClipRule' => ['bool', 'fill_rule'=>'int'], +'ImagickDraw::setClipUnits' => ['bool', 'clip_units'=>'int'], +'ImagickDraw::setDensity' => ['bool', 'density_string'=>'string'], +'ImagickDraw::setFillAlpha' => ['bool', 'opacity'=>'float'], +'ImagickDraw::setFillColor' => ['bool', 'fill_pixel'=>'ImagickPixel|string'], +'ImagickDraw::setFillOpacity' => ['bool', 'fillopacity'=>'float'], +'ImagickDraw::setFillPatternURL' => ['bool', 'fill_url'=>'string'], +'ImagickDraw::setFillRule' => ['bool', 'fill_rule'=>'int'], +'ImagickDraw::setFont' => ['bool', 'font_name'=>'string'], +'ImagickDraw::setFontFamily' => ['bool', 'font_family'=>'string'], +'ImagickDraw::setFontResolution' => ['bool', 'x'=>'float', 'y'=>'float'], +'ImagickDraw::setFontSize' => ['bool', 'pointsize'=>'float'], +'ImagickDraw::setFontStretch' => ['bool', 'fontstretch'=>'int'], +'ImagickDraw::setFontStyle' => ['bool', 'style'=>'int'], +'ImagickDraw::setFontWeight' => ['bool', 'font_weight'=>'int'], +'ImagickDraw::setGravity' => ['bool', 'gravity'=>'int'], +'ImagickDraw::setOpacity' => ['void', 'opacity'=>'float'], +'ImagickDraw::setResolution' => ['void', 'x_resolution'=>'float', 'y_resolution'=>'float'], +'ImagickDraw::setStrokeAlpha' => ['bool', 'opacity'=>'float'], +'ImagickDraw::setStrokeAntialias' => ['bool', 'stroke_antialias'=>'bool'], +'ImagickDraw::setStrokeColor' => ['bool', 'stroke_pixel'=>'ImagickPixel|string'], +'ImagickDraw::setStrokeDashArray' => ['bool', 'dasharray'=>'list'], +'ImagickDraw::setStrokeDashOffset' => ['bool', 'dash_offset'=>'float'], +'ImagickDraw::setStrokeLineCap' => ['bool', 'linecap'=>'int'], +'ImagickDraw::setStrokeLineJoin' => ['bool', 'linejoin'=>'int'], +'ImagickDraw::setStrokeMiterLimit' => ['bool', 'miterlimit'=>'int'], +'ImagickDraw::setStrokeOpacity' => ['bool', 'stroke_opacity'=>'float'], +'ImagickDraw::setStrokePatternURL' => ['bool', 'stroke_url'=>'string'], +'ImagickDraw::setStrokeWidth' => ['bool', 'stroke_width'=>'float'], +'ImagickDraw::setTextAlignment' => ['bool', 'alignment'=>'int'], +'ImagickDraw::setTextAntialias' => ['bool', 'antialias'=>'bool'], +'ImagickDraw::setTextDecoration' => ['bool', 'decoration'=>'int'], +'ImagickDraw::setTextDirection' => ['bool', 'direction'=>'int'], +'ImagickDraw::setTextEncoding' => ['bool', 'encoding'=>'string'], +'ImagickDraw::setTextInterlineSpacing' => ['void', 'spacing'=>'float'], +'ImagickDraw::setTextInterwordSpacing' => ['void', 'spacing'=>'float'], +'ImagickDraw::setTextKerning' => ['void', 'kerning'=>'float'], +'ImagickDraw::setTextUnderColor' => ['bool', 'under_color'=>'ImagickPixel|string'], +'ImagickDraw::setVectorGraphics' => ['bool', 'xml'=>'string'], +'ImagickDraw::setViewbox' => ['bool', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int'], +'ImagickDraw::skewX' => ['bool', 'degrees'=>'float'], +'ImagickDraw::skewY' => ['bool', 'degrees'=>'float'], +'ImagickDraw::translate' => ['bool', 'x'=>'float', 'y'=>'float'], +'ImagickKernel::addKernel' => ['void', 'ImagickKernel'=>'ImagickKernel'], +'ImagickKernel::addUnityKernel' => ['void'], +'ImagickKernel::fromBuiltin' => ['ImagickKernel', 'kernelType'=>'string', 'kernelString'=>'string'], +'ImagickKernel::fromMatrix' => ['ImagickKernel', 'matrix'=>'list>', 'origin='=>'array'], +'ImagickKernel::getMatrix' => ['list>'], +'ImagickKernel::scale' => ['void'], +'ImagickKernel::separate' => ['ImagickKernel[]'], +'ImagickKernel::seperate' => ['void'], +'ImagickPixel::__construct' => ['void', 'color='=>'string'], +'ImagickPixel::clear' => ['bool'], +'ImagickPixel::clone' => ['void'], +'ImagickPixel::destroy' => ['bool'], +'ImagickPixel::getColor' => ['array{r: int|float, g: int|float, b: int|float, a: int|float}', 'normalized='=>'0|1|2'], +'ImagickPixel::getColorAsString' => ['string'], +'ImagickPixel::getColorCount' => ['int'], +'ImagickPixel::getColorQuantum' => ['mixed'], +'ImagickPixel::getColorValue' => ['float', 'color'=>'int'], +'ImagickPixel::getColorValueQuantum' => ['mixed'], +'ImagickPixel::getHSL' => ['array{hue: float, saturation: float, luminosity: float}'], +'ImagickPixel::getIndex' => ['int'], +'ImagickPixel::isPixelSimilar' => ['bool', 'color'=>'ImagickPixel', 'fuzz'=>'float'], +'ImagickPixel::isPixelSimilarQuantum' => ['bool', 'color'=>'string', 'fuzz='=>'string'], +'ImagickPixel::isSimilar' => ['bool', 'color'=>'ImagickPixel', 'fuzz'=>'float'], +'ImagickPixel::setColor' => ['bool', 'color'=>'string'], +'ImagickPixel::setcolorcount' => ['void', 'colorCount'=>'string'], +'ImagickPixel::setColorFromPixel' => ['bool', 'srcPixel'=>'ImagickPixel'], +'ImagickPixel::setColorValue' => ['bool', 'color'=>'int', 'value'=>'float'], +'ImagickPixel::setColorValueQuantum' => ['void', 'color'=>'int', 'value'=>'mixed'], +'ImagickPixel::setHSL' => ['bool', 'hue'=>'float', 'saturation'=>'float', 'luminosity'=>'float'], +'ImagickPixel::setIndex' => ['void', 'index'=>'int'], +'ImagickPixelIterator::__construct' => ['void', 'wand'=>'Imagick'], +'ImagickPixelIterator::clear' => ['bool'], +'ImagickPixelIterator::current' => ['mixed'], +'ImagickPixelIterator::destroy' => ['bool'], +'ImagickPixelIterator::getCurrentIteratorRow' => ['array'], +'ImagickPixelIterator::getIteratorRow' => ['int'], +'ImagickPixelIterator::getNextIteratorRow' => ['array'], +'ImagickPixelIterator::getpixeliterator' => ['', 'Imagick'=>'Imagick'], +'ImagickPixelIterator::getpixelregioniterator' => ['', 'Imagick'=>'Imagick', 'x'=>'', 'y'=>'', 'columns'=>'', 'rows'=>''], +'ImagickPixelIterator::getPreviousIteratorRow' => ['array'], +'ImagickPixelIterator::key' => ['int|string'], +'ImagickPixelIterator::newPixelIterator' => ['bool', 'wand'=>'Imagick'], +'ImagickPixelIterator::newPixelRegionIterator' => ['bool', 'wand'=>'Imagick', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'], +'ImagickPixelIterator::next' => ['void'], +'ImagickPixelIterator::resetIterator' => ['bool'], +'ImagickPixelIterator::rewind' => ['void'], +'ImagickPixelIterator::setIteratorFirstRow' => ['bool'], +'ImagickPixelIterator::setIteratorLastRow' => ['bool'], +'ImagickPixelIterator::setIteratorRow' => ['bool', 'row'=>'int'], +'ImagickPixelIterator::syncIterator' => ['bool'], +'ImagickPixelIterator::valid' => ['bool'], +'imap_8bit' => ['string|false', 'string'=>'string'], +'imap_alerts' => ['array|false'], +'imap_append' => ['bool', 'imap'=>'IMAP\Connection', 'folder'=>'string', 'message'=>'string', 'options='=>'string', 'internal_date='=>'string'], +'imap_base64' => ['string|false', 'string'=>'string'], +'imap_binary' => ['string|false', 'string'=>'string'], +'imap_body' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], +'imap_bodystruct' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string'], +'imap_check' => ['stdClass|false', 'imap'=>'IMAP\Connection'], +'imap_clearflag_full' => ['bool', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], +'imap_close' => ['bool', 'imap'=>'IMAP\Connection', 'flags='=>'int'], +'imap_create' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], +'imap_createmailbox' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], +'imap_delete' => ['bool', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], +'imap_deletemailbox' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], +'imap_errors' => ['array|false'], +'imap_expunge' => ['bool', 'imap'=>'IMAP\Connection'], +'imap_fetch_overview' => ['array|false', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flags='=>'int'], +'imap_fetchbody' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], +'imap_fetchheader' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], +'imap_fetchmime' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], +'imap_fetchstructure' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], +'imap_fetchtext' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], +'imap_gc' => ['bool', 'imap'=>'IMAP\Connection', 'flags'=>'int'], +'imap_get_quota' => ['array|false', 'imap'=>'IMAP\Connection', 'quota_root'=>'string'], +'imap_get_quotaroot' => ['array|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], +'imap_getacl' => ['array|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], +'imap_getmailboxes' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], +'imap_getsubscribed' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], +'imap_header' => ['stdClass|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string'], +'imap_headerinfo' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string|null'], +'imap_headers' => ['array|false', 'imap'=>'IMAP\Connection'], +'imap_last_error' => ['string|false'], +'imap_list' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], +'imap_listmailbox' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], +'imap_listscan' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], +'imap_listsubscribed' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], +'imap_lsub' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], +'imap_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string', 'cc='=>'string', 'bcc='=>'string', 'return_path='=>'string'], +'imap_mail_compose' => ['string|false', 'envelope'=>'array', 'bodies'=>'array'], +'imap_mail_copy' => ['bool', 'imap'=>'IMAP\Connection', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], +'imap_mail_move' => ['bool', 'imap'=>'IMAP\Connection', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], +'imap_mailboxmsginfo' => ['stdClass|false', 'imap'=>'IMAP\Connection'], +'imap_mime_header_decode' => ['array|false', 'string'=>'string'], +'imap_msgno' => ['int|false', 'imap'=>'IMAP\Connection', 'message_uid'=>'int'], +'imap_mutf7_to_utf8' => ['string|false', 'string'=>'string'], +'imap_num_msg' => ['int|false', 'imap'=>'IMAP\Connection'], +'imap_num_recent' => ['int|false', 'imap'=>'IMAP\Connection'], +'imap_open' => ['IMAP\Connection|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'flags='=>'int', 'retries='=>'int', 'options='=>'?array'], +'imap_ping' => ['bool', 'imap'=>'IMAP\Connection'], +'imap_qprint' => ['string|false', 'string'=>'string'], +'imap_rename' => ['bool', 'imap'=>'IMAP\Connection', 'from'=>'string', 'to'=>'string'], +'imap_renamemailbox' => ['bool', 'imap'=>'IMAP\Connection', 'from'=>'string', 'to'=>'string'], +'imap_reopen' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'flags='=>'int', 'retries='=>'int'], +'imap_rfc822_parse_adrlist' => ['array', 'string'=>'string', 'default_hostname'=>'string'], +'imap_rfc822_parse_headers' => ['stdClass', 'headers'=>'string', 'default_hostname='=>'string'], +'imap_rfc822_write_address' => ['string|false', 'mailbox'=>'?string', 'hostname'=>'?string', 'personal'=>'?string'], +'imap_savebody' => ['bool', 'imap'=>'IMAP\Connection', 'file'=>'string|resource', 'message_num'=>'int', 'section='=>'string', 'flags='=>'int'], +'imap_scan' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], +'imap_scanmailbox' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], +'imap_search' => ['array|false', 'imap'=>'IMAP\Connection', 'criteria'=>'string', 'flags='=>'int', 'charset='=>'string'], +'imap_set_quota' => ['bool', 'imap'=>'IMAP\Connection', 'quota_root'=>'string', 'mailbox_size'=>'int'], +'imap_setacl' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'user_id'=>'string', 'rights'=>'string'], +'imap_setflag_full' => ['bool', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], +'imap_sort' => ['array|false', 'imap'=>'IMAP\Connection', 'criteria'=>'int', 'reverse'=>'int', 'flags='=>'int', 'search_criteria='=>'string', 'charset='=>'string'], +'imap_status' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'flags'=>'int'], +'imap_subscribe' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], +'imap_thread' => ['array|false', 'imap'=>'IMAP\Connection', 'flags='=>'int'], +'imap_timeout' => ['int|bool', 'timeout_type'=>'int', 'timeout='=>'int'], +'imap_uid' => ['int|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int'], +'imap_undelete' => ['bool', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], +'imap_unsubscribe' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], +'imap_utf7_decode' => ['string|false', 'string'=>'string'], +'imap_utf7_encode' => ['string', 'string'=>'string'], +'imap_utf8' => ['string', 'mime_encoded_text'=>'string'], +'imap_utf8_to_mutf7' => ['string|false', 'string'=>'string'], +'implode' => ['string', 'separator'=>'string', 'array'=>'array'], +'implode\'1' => ['string', 'separator'=>'array'], +'import_request_variables' => ['bool', 'types'=>'string', 'prefix='=>'string'], +'in_array' => ['bool', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'], +'inclued_get_data' => ['array'], +'inet_ntop' => ['string|false', 'ip'=>'string'], +'inet_pton' => ['string|false', 'ip'=>'string'], +'InfiniteIterator::__construct' => ['void', 'iterator'=>'Iterator'], +'InfiniteIterator::current' => ['mixed'], +'InfiniteIterator::getInnerIterator' => ['Iterator'], +'InfiniteIterator::key' => ['bool|float|int|string'], +'InfiniteIterator::next' => ['void'], +'InfiniteIterator::rewind' => ['void'], +'InfiniteIterator::valid' => ['bool'], +'inflate_add' => ['string|false', 'context'=>'resource', 'data'=>'string', 'flush_mode='=>'int'], +'inflate_get_read_len' => ['int|false', 'context'=>'resource'], +'inflate_get_status' => ['int|false', 'context'=>'resource'], +'inflate_init' => ['resource|false', 'encoding'=>'int', 'options='=>'array'], +'ingres_autocommit' => ['bool', 'link'=>'resource'], +'ingres_autocommit_state' => ['bool', 'link'=>'resource'], +'ingres_charset' => ['string', 'link'=>'resource'], +'ingres_close' => ['bool', 'link'=>'resource'], +'ingres_commit' => ['bool', 'link'=>'resource'], +'ingres_connect' => ['resource', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'options='=>'array'], +'ingres_cursor' => ['string', 'result'=>'resource'], +'ingres_errno' => ['int', 'link='=>'resource'], +'ingres_error' => ['string', 'link='=>'resource'], +'ingres_errsqlstate' => ['string', 'link='=>'resource'], +'ingres_escape_string' => ['string', 'link'=>'resource', 'source_string'=>'string'], +'ingres_execute' => ['bool', 'result'=>'resource', 'params='=>'array', 'types='=>'string'], +'ingres_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], +'ingres_fetch_assoc' => ['array', 'result'=>'resource'], +'ingres_fetch_object' => ['object', 'result'=>'resource', 'result_type='=>'int'], +'ingres_fetch_proc_return' => ['int', 'result'=>'resource'], +'ingres_fetch_row' => ['array', 'result'=>'resource'], +'ingres_field_length' => ['int', 'result'=>'resource', 'index'=>'int'], +'ingres_field_name' => ['string', 'result'=>'resource', 'index'=>'int'], +'ingres_field_nullable' => ['bool', 'result'=>'resource', 'index'=>'int'], +'ingres_field_precision' => ['int', 'result'=>'resource', 'index'=>'int'], +'ingres_field_scale' => ['int', 'result'=>'resource', 'index'=>'int'], +'ingres_field_type' => ['string', 'result'=>'resource', 'index'=>'int'], +'ingres_free_result' => ['bool', 'result'=>'resource'], +'ingres_next_error' => ['bool', 'link='=>'resource'], +'ingres_num_fields' => ['int', 'result'=>'resource'], +'ingres_num_rows' => ['int', 'result'=>'resource'], +'ingres_pconnect' => ['resource', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'options='=>'array'], +'ingres_prepare' => ['mixed', 'link'=>'resource', 'query'=>'string'], +'ingres_query' => ['mixed', 'link'=>'resource', 'query'=>'string', 'params='=>'array', 'types='=>'string'], +'ingres_result_seek' => ['bool', 'result'=>'resource', 'position'=>'int'], +'ingres_rollback' => ['bool', 'link'=>'resource'], +'ingres_set_environment' => ['bool', 'link'=>'resource', 'options'=>'array'], +'ingres_unbuffered_query' => ['mixed', 'link'=>'resource', 'query'=>'string', 'params='=>'array', 'types='=>'string'], +'ini_alter' => ['string|false', 'option'=>'string', 'value'=>'string'], +'ini_get' => ['string|false', 'option'=>'string'], +'ini_get_all' => ['array|false', 'extension='=>'?string', 'details='=>'bool'], +'ini_restore' => ['void', 'option'=>'string'], +'ini_set' => ['string|false', 'option'=>'string', 'value'=>'string|int|float|bool|null'], +'inotify_add_watch' => ['int', 'inotify_instance'=>'resource', 'pathname'=>'string', 'mask'=>'int'], +'inotify_init' => ['resource|false'], +'inotify_queue_len' => ['int', 'inotify_instance'=>'resource'], +'inotify_read' => ['array|false', 'inotify_instance'=>'resource'], +'inotify_rm_watch' => ['bool', 'inotify_instance'=>'resource', 'watch_descriptor'=>'int'], +'intdiv' => ['int', 'num1'=>'int', 'num2'=>'int'], +'interface_exists' => ['bool', 'interface'=>'string', 'autoload='=>'bool'], +'intl_error_name' => ['string', 'errorCode'=>'int'], +'intl_get_error_code' => ['int'], +'intl_get_error_message' => ['string'], +'intl_is_failure' => ['bool', 'errorCode'=>'int'], +'IntlBreakIterator::__construct' => ['void'], +'IntlBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], +'IntlBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlBreakIterator::current' => ['int'], +'IntlBreakIterator::first' => ['int'], +'IntlBreakIterator::following' => ['int', 'offset'=>'int'], +'IntlBreakIterator::getErrorCode' => ['int'], +'IntlBreakIterator::getErrorMessage' => ['string'], +'IntlBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], +'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], +'IntlBreakIterator::getText' => ['string'], +'IntlBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], +'IntlBreakIterator::last' => ['int'], +'IntlBreakIterator::next' => ['int', 'offset='=>'int'], +'IntlBreakIterator::preceding' => ['int', 'offset'=>'int'], +'IntlBreakIterator::previous' => ['int'], +'IntlBreakIterator::setText' => ['bool', 'text'=>'string'], +'intlcal_add' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int', 'value'=>'int'], +'intlcal_after' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], +'intlcal_before' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], +'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_get' => ['mixed', 'calendar'=>'IntlCalendar', 'field'=>'int'], +'intlcal_get_actual_maximum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], +'intlcal_get_actual_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], +'intlcal_get_available_locales' => ['array'], +'intlcal_get_day_of_week_type' => ['int', 'calendar'=>'IntlCalendar', 'dayOfWeek'=>'int'], +'intlcal_get_first_day_of_week' => ['int', 'calendar'=>'IntlCalendar'], +'intlcal_get_greatest_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], +'intlcal_get_keyword_values_for_locale' => ['Iterator|false', 'keyword'=>'string', 'locale'=>'string', 'onlyCommon'=>'bool'], +'intlcal_get_least_maximum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], +'intlcal_get_locale' => ['string', 'calendar'=>'IntlCalendar', 'type'=>'int'], +'intlcal_get_maximum' => ['int|false', 'calendar'=>'IntlCalendar', 'field'=>'int'], +'intlcal_get_minimal_days_in_first_week' => ['int', 'calendar'=>'IntlCalendar'], +'intlcal_get_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], +'intlcal_get_now' => ['float'], +'intlcal_get_repeated_wall_time_option' => ['int', 'calendar'=>'IntlCalendar'], +'intlcal_get_skipped_wall_time_option' => ['int', 'calendar'=>'IntlCalendar'], +'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_in_daylight_time' => ['bool', 'calendar'=>'IntlCalendar'], +'intlcal_is_equivalent_to' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], +'intlcal_is_lenient' => ['bool', 'calendar'=>'IntlCalendar'], +'intlcal_is_set' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int'], +'intlcal_is_weekend' => ['bool', 'calendar'=>'IntlCalendar', 'timestamp='=>'float'], +'intlcal_roll' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int', 'value'=>'mixed'], +'intlcal_set' => ['bool', 'calendar'=>'IntlCalendar', 'year'=>'int', 'month'=>'int'], +'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_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::after' => ['bool', 'other'=>'IntlCalendar'], +'IntlCalendar::before' => ['bool', 'other'=>'IntlCalendar'], +'IntlCalendar::clear' => ['bool', 'field='=>'int'], +'IntlCalendar::createInstance' => ['IntlCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], +'IntlCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], +'IntlCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], +'IntlCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], +'IntlCalendar::get' => ['int', 'field'=>'int'], +'IntlCalendar::getActualMaximum' => ['int', 'field'=>'int'], +'IntlCalendar::getActualMinimum' => ['int', 'field'=>'int'], +'IntlCalendar::getAvailableLocales' => ['array'], +'IntlCalendar::getDayOfWeekType' => ['int', 'dayOfWeek'=>'int'], +'IntlCalendar::getErrorCode' => ['int'], +'IntlCalendar::getErrorMessage' => ['string'], +'IntlCalendar::getFirstDayOfWeek' => ['int'], +'IntlCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], +'IntlCalendar::getKeywordValuesForLocale' => ['Iterator|false', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], +'IntlCalendar::getLeastMaximum' => ['int', 'field'=>'int'], +'IntlCalendar::getLocale' => ['string', 'localeType'=>'int'], +'IntlCalendar::getMaximum' => ['int|false', 'field'=>'int'], +'IntlCalendar::getMinimalDaysInFirstWeek' => ['int'], +'IntlCalendar::getMinimum' => ['int', 'field'=>'int'], +'IntlCalendar::getNow' => ['float'], +'IntlCalendar::getRepeatedWallTimeOption' => ['int'], +'IntlCalendar::getSkippedWallTimeOption' => ['int'], +'IntlCalendar::getTime' => ['float'], +'IntlCalendar::getTimeZone' => ['IntlTimeZone'], +'IntlCalendar::getType' => ['string'], +'IntlCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], +'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::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::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::getIntPropertyMaxValue' => ['int', 'property'=>'int'], +'IntlChar::getIntPropertyMinValue' => ['int', 'property'=>'int'], +'IntlChar::getIntPropertyMxValue' => ['int', 'property'=>'int'], +'IntlChar::getIntPropertyValue' => ['int', 'char'=>'int|string', 'property'=>'int'], +'IntlChar::getNumericValue' => ['float', 'char'=>'int|string'], +'IntlChar::getPropertyEnum' => ['int', 'alias'=>'string'], +'IntlChar::getPropertyName' => ['string|false', 'property'=>'int', 'namechoice='=>'int'], +'IntlChar::getPropertyValueEnum' => ['int', 'property'=>'int', 'name'=>'string'], +'IntlChar::getPropertyValueName' => ['string|false', 'prop'=>'int', 'value'=>'int', 'namechoice='=>'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'], +'IntlCodePointBreakIterator::__construct' => ['void'], +'IntlCodePointBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlCodePointBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], +'IntlCodePointBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlCodePointBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlCodePointBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlCodePointBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlCodePointBreakIterator::current' => ['int'], +'IntlCodePointBreakIterator::first' => ['int'], +'IntlCodePointBreakIterator::following' => ['int', 'offset'=>'string'], +'IntlCodePointBreakIterator::getErrorCode' => ['int'], +'IntlCodePointBreakIterator::getErrorMessage' => ['string'], +'IntlCodePointBreakIterator::getLastCodePoint' => ['int'], +'IntlCodePointBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], +'IntlCodePointBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'string'], +'IntlCodePointBreakIterator::getText' => ['string'], +'IntlCodePointBreakIterator::isBoundary' => ['bool', 'offset'=>'string'], +'IntlCodePointBreakIterator::last' => ['int'], +'IntlCodePointBreakIterator::next' => ['int', 'offset='=>'string'], +'IntlCodePointBreakIterator::preceding' => ['int', 'offset'=>'string'], +'IntlCodePointBreakIterator::previous' => ['int'], +'IntlCodePointBreakIterator::setText' => ['bool', 'text'=>'string'], +'IntlDateFormatter::__construct' => ['void', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'null|int|IntlCalendar', 'pattern='=>'string'], +'IntlDateFormatter::create' => ['IntlDateFormatter|false', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'int|IntlCalendar', 'pattern='=>'string'], +'IntlDateFormatter::format' => ['string|false', 'args'=>''], +'IntlDateFormatter::formatObject' => ['string|false', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'], +'IntlDateFormatter::getCalendar' => ['int'], +'IntlDateFormatter::getCalendarObject' => ['IntlCalendar'], +'IntlDateFormatter::getDateType' => ['int'], +'IntlDateFormatter::getErrorCode' => ['int'], +'IntlDateFormatter::getErrorMessage' => ['string'], +'IntlDateFormatter::getLocale' => ['string|false'], +'IntlDateFormatter::getPattern' => ['string'], +'IntlDateFormatter::getTimeType' => ['int'], +'IntlDateFormatter::getTimeZone' => ['IntlTimeZone|false'], +'IntlDateFormatter::getTimeZoneId' => ['string'], +'IntlDateFormatter::isLenient' => ['bool'], +'IntlDateFormatter::localtime' => ['array', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'], +'IntlDateFormatter::parse' => ['int|false', 'text_to_parse'=>'string', '&rw_parse_pos='=>'int'], +'IntlDateFormatter::setCalendar' => ['bool', 'calendar'=>''], +'IntlDateFormatter::setLenient' => ['bool', 'lenient'=>'bool'], +'IntlDateFormatter::setPattern' => ['bool', 'pattern'=>'string'], +'IntlDateFormatter::setTimeZone' => ['bool', 'timezone'=>''], +'IntlDateFormatter::setTimeZoneId' => ['bool', 'zone'=>'string', 'fmt='=>'IntlDateFormatter'], +'IntlException::__clone' => ['void'], +'IntlException::__construct' => ['void'], +'IntlException::__toString' => ['string'], +'IntlException::__wakeup' => ['void'], +'IntlException::getCode' => ['int'], +'IntlException::getFile' => ['string'], +'IntlException::getLine' => ['int'], +'IntlException::getMessage' => ['string'], +'IntlException::getPrevious' => ['?Throwable'], +'IntlException::getTrace' => ['list\',args?:array}>'], +'IntlException::getTraceAsString' => ['string'], +'intlgregcal_create_instance' => ['IntlGregorianCalendar', 'timezoneOrYear='=>'mixed', 'localeOrMonth='=>'string'], +'intlgregcal_get_gregorian_change' => ['float', 'calendar'=>'IntlGregorianCalendar'], +'intlgregcal_is_leap_year' => ['bool', 'calendar'=>'int'], +'intlgregcal_set_gregorian_change' => ['void', 'calendar'=>'IntlGregorianCalendar', 'timestamp'=>'float'], +'IntlGregorianCalendar::__construct' => ['void'], +'IntlGregorianCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'], +'IntlGregorianCalendar::after' => ['bool', 'other'=>'IntlCalendar'], +'IntlGregorianCalendar::before' => ['bool', 'other'=>'IntlCalendar'], +'IntlGregorianCalendar::clear' => ['bool', 'field='=>'int'], +'IntlGregorianCalendar::createInstance' => ['IntlGregorianCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], +'IntlGregorianCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], +'IntlGregorianCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], +'IntlGregorianCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], +'IntlGregorianCalendar::get' => ['int', 'field'=>'int'], +'IntlGregorianCalendar::getActualMaximum' => ['int', 'field'=>'int'], +'IntlGregorianCalendar::getActualMinimum' => ['int', 'field'=>'int'], +'IntlGregorianCalendar::getAvailableLocales' => ['array'], +'IntlGregorianCalendar::getDayOfWeekType' => ['int', 'dayOfWeek'=>'int'], +'IntlGregorianCalendar::getErrorCode' => ['int'], +'IntlGregorianCalendar::getErrorMessage' => ['string'], +'IntlGregorianCalendar::getFirstDayOfWeek' => ['int'], +'IntlGregorianCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], +'IntlGregorianCalendar::getGregorianChange' => ['float'], +'IntlGregorianCalendar::getKeywordValuesForLocale' => ['Iterator', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], +'IntlGregorianCalendar::getLeastMaximum' => ['int', 'field'=>'int'], +'IntlGregorianCalendar::getLocale' => ['string', 'localeType'=>'int'], +'IntlGregorianCalendar::getMaximum' => ['int', 'field'=>'int'], +'IntlGregorianCalendar::getMinimalDaysInFirstWeek' => ['int'], +'IntlGregorianCalendar::getMinimum' => ['int', 'field'=>'int'], +'IntlGregorianCalendar::getNow' => ['float'], +'IntlGregorianCalendar::getRepeatedWallTimeOption' => ['int'], +'IntlGregorianCalendar::getSkippedWallTimeOption' => ['int'], +'IntlGregorianCalendar::getTime' => ['float'], +'IntlGregorianCalendar::getTimeZone' => ['IntlTimeZone'], +'IntlGregorianCalendar::getType' => ['string'], +'IntlGregorianCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], +'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::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::toDateTime' => ['DateTime'], +'IntlIterator::__construct' => ['void'], +'IntlIterator::current' => ['mixed'], +'IntlIterator::key' => ['string'], +'IntlIterator::next' => ['void'], +'IntlIterator::rewind' => ['void'], +'IntlIterator::valid' => ['bool'], +'IntlPartsIterator::getBreakIterator' => ['IntlBreakIterator'], +'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules'=>'string', 'areCompiled='=>'string'], +'IntlRuleBasedBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlRuleBasedBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], +'IntlRuleBasedBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlRuleBasedBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlRuleBasedBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlRuleBasedBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], +'IntlRuleBasedBreakIterator::current' => ['int'], +'IntlRuleBasedBreakIterator::first' => ['int'], +'IntlRuleBasedBreakIterator::following' => ['int', 'offset'=>'int'], +'IntlRuleBasedBreakIterator::getBinaryRules' => ['string'], +'IntlRuleBasedBreakIterator::getErrorCode' => ['int'], +'IntlRuleBasedBreakIterator::getErrorMessage' => ['string'], +'IntlRuleBasedBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], +'IntlRuleBasedBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], +'IntlRuleBasedBreakIterator::getRules' => ['string'], +'IntlRuleBasedBreakIterator::getRuleStatus' => ['int'], +'IntlRuleBasedBreakIterator::getRuleStatusVec' => ['array'], +'IntlRuleBasedBreakIterator::getText' => ['string'], +'IntlRuleBasedBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], +'IntlRuleBasedBreakIterator::last' => ['int'], +'IntlRuleBasedBreakIterator::next' => ['int', 'offset='=>'int'], +'IntlRuleBasedBreakIterator::preceding' => ['int', 'offset'=>'int'], +'IntlRuleBasedBreakIterator::previous' => ['int'], +'IntlRuleBasedBreakIterator::setText' => ['bool', 'text'=>'string'], +'IntlTimeZone::countEquivalentIDs' => ['int|false', 'zoneId'=>'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::getDSTSavings' => ['int'], +'IntlTimeZone::getEquivalentID' => ['string|false', 'zoneId'=>'string', 'index'=>'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::getRawOffset' => ['int'], +'IntlTimeZone::getRegion' => ['string|false', 'zoneId'=>'string'], +'IntlTimeZone::getTZDataVersion' => ['string'], +'IntlTimeZone::getUnknown' => ['IntlTimeZone'], +'IntlTimeZone::getWindowsID' => ['string|false', 'timezone'=>'string'], +'IntlTimeZone::hasSameRules' => ['bool', 'otherTimeZone'=>'IntlTimeZone'], +'IntlTimeZone::toDateTimeZone' => ['DateTimeZone|false'], +'IntlTimeZone::useDaylightTime' => ['bool'], +'intltz_count_equivalent_ids' => ['int', 'timezoneId'=>'string'], +'intltz_create_enumeration' => ['IntlIterator', 'countryOrRawOffset'=>'mixed'], +'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_dst_savings' => ['int', 'timezone'=>'IntlTimeZone'], +'intltz_get_equivalent_id' => ['string', 'timezoneId'=>'string', 'offset'=>'int'], +'intltz_get_error_code' => ['int', 'timezone'=>'IntlTimeZone'], +'intltz_get_error_message' => ['string', 'timezone'=>'IntlTimeZone'], +'intltz_get_id' => ['string', 'timezone'=>'IntlTimeZone'], +'intltz_get_offset' => ['int', 'timezone'=>'IntlTimeZone', 'timestamp'=>'float', 'local'=>'bool', '&rawOffset'=>'int', '&dstOffset'=>'int'], +'intltz_get_raw_offset' => ['int', 'timezone'=>'IntlTimeZone'], +'intltz_get_tz_data_version' => ['string', 'object'=>'IntlTimeZone'], +'intltz_getGMT' => ['IntlTimeZone'], +'intltz_has_same_rules' => ['bool', 'timezone'=>'IntlTimeZone', 'other'=>'IntlTimeZone'], +'intltz_to_date_time_zone' => ['DateTimeZone', 'timezone'=>'IntlTimeZone'], +'intltz_use_daylight_time' => ['bool', 'timezone'=>'IntlTimeZone'], +'intlz_create_default' => ['IntlTimeZone'], +'intval' => ['int', 'value'=>'mixed', 'base='=>'int'], +'InvalidArgumentException::__clone' => ['void'], +'InvalidArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?InvalidArgumentException'], +'InvalidArgumentException::__toString' => ['string'], +'InvalidArgumentException::getCode' => ['int'], +'InvalidArgumentException::getFile' => ['string'], +'InvalidArgumentException::getLine' => ['int'], +'InvalidArgumentException::getMessage' => ['string'], +'InvalidArgumentException::getPrevious' => ['Throwable|InvalidArgumentException|null'], +'InvalidArgumentException::getTrace' => ['list\',args?:array}>'], +'InvalidArgumentException::getTraceAsString' => ['string'], +'ip2long' => ['int|false', 'ip'=>'string'], +'iptcembed' => ['string|bool', 'iptc_data'=>'string', 'filename'=>'string', 'spool='=>'int'], +'iptcparse' => ['array|false', 'iptc_block'=>'string'], +'is_a' => ['bool', 'object_or_class'=>'mixed', 'class'=>'string', 'allow_string='=>'bool'], +'is_array' => ['bool', 'value'=>'mixed'], +'is_bool' => ['bool', 'value'=>'mixed'], +'is_callable' => ['bool', 'value'=>'callable|mixed', 'syntax_only='=>'bool', '&w_callable_name='=>'string'], +'is_countable' => ['bool', 'value'=>'mixed'], +'is_dir' => ['bool', 'filename'=>'string'], +'is_double' => ['bool', 'value'=>'mixed'], +'is_executable' => ['bool', 'filename'=>'string'], +'is_file' => ['bool', 'filename'=>'string'], +'is_finite' => ['bool', 'num'=>'float'], +'is_float' => ['bool', 'value'=>'mixed'], +'is_infinite' => ['bool', 'num'=>'float'], +'is_int' => ['bool', 'value'=>'mixed'], +'is_integer' => ['bool', 'value'=>'mixed'], +'is_iterable' => ['bool', 'value'=>'mixed'], +'is_link' => ['bool', 'filename'=>'string'], +'is_long' => ['bool', 'value'=>'mixed'], +'is_nan' => ['bool', 'num'=>'float'], +'is_null' => ['bool', 'value'=>'mixed'], +'is_numeric' => ['bool', 'value'=>'mixed'], +'is_object' => ['bool', 'value'=>'mixed'], +'is_readable' => ['bool', 'filename'=>'string'], +'is_real' => ['bool', 'value'=>'mixed'], +'is_resource' => ['bool', 'value'=>'mixed'], +'is_scalar' => ['bool', 'value'=>'mixed'], +'is_soap_fault' => ['bool', 'object'=>'mixed'], +'is_string' => ['bool', 'value'=>'mixed'], +'is_subclass_of' => ['bool', 'object_or_class'=>'object|string', 'class'=>'class-string', 'allow_string='=>'bool'], +'is_tainted' => ['bool', 'string'=>'string'], +'is_uploaded_file' => ['bool', 'filename'=>'string'], +'is_writable' => ['bool', 'filename'=>'string'], +'is_writeable' => ['bool', 'filename'=>'string'], +'isset' => ['bool', 'value'=>'mixed', '...rest='=>'mixed'], +'Iterator::current' => ['mixed'], +'Iterator::key' => ['mixed'], +'Iterator::next' => ['void'], +'Iterator::rewind' => ['void'], +'Iterator::valid' => ['bool'], +'iterator_apply' => ['0|positive-int', 'iterator'=>'Traversable', 'callback'=>'callable(mixed):bool', 'args='=>'array'], +'iterator_count' => ['0|positive-int', 'iterator'=>'Traversable'], +'iterator_to_array' => ['array', 'iterator'=>'Traversable', 'preserve_keys='=>'bool'], +'IteratorAggregate::getIterator' => ['Traversable'], +'IteratorIterator::__construct' => ['void', 'it'=>'Traversable'], +'IteratorIterator::current' => ['mixed'], +'IteratorIterator::getInnerIterator' => ['Iterator'], +'IteratorIterator::key' => ['mixed'], +'IteratorIterator::next' => ['void'], +'IteratorIterator::rewind' => ['void'], +'IteratorIterator::valid' => ['bool'], +'java_last_exception_clear' => ['void'], +'java_last_exception_get' => ['object'], +'java_reload' => ['array', 'new_jarpath'=>'string'], +'java_require' => ['array', 'new_classpath'=>'string'], +'java_set_encoding' => ['array', 'encoding'=>'string'], +'java_set_ignore_case' => ['void', 'ignore'=>'bool'], +'java_throw_exceptions' => ['void', 'throw'=>'bool'], +'JavaException::getCause' => ['object'], +'jddayofweek' => ['mixed', 'julian_day'=>'int', 'mode='=>'int'], +'jdmonthname' => ['string', 'julian_day'=>'int', 'mode'=>'int'], +'jdtofrench' => ['string', 'julian_day'=>'int'], +'jdtogregorian' => ['string', 'julian_day'=>'int'], +'jdtojewish' => ['string', 'julian_day'=>'int', 'hebrew='=>'bool', 'flags='=>'int'], +'jdtojulian' => ['string', 'julian_day'=>'int'], +'jdtounix' => ['int|false', 'julian_day'=>'int'], +'jewishtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], +'jobqueue_license_info' => ['array'], +'join' => ['string', 'separator'=>'string', 'array'=>'array'], +'join\'1' => ['string', 'separator'=>'array'], +'json_decode' => ['mixed', 'json'=>'string', 'associative='=>'bool', 'depth='=>'int', 'flags='=>'int'], +'json_encode' => ['string|false', 'value'=>'mixed', 'flags='=>'int', 'depth='=>'int'], +'json_last_error' => ['int'], +'json_last_error_msg' => ['string'], +'JsonException::__clone' => ['void'], +'JsonException::__construct' => ['void'], +'JsonException::__toString' => ['string'], +'JsonException::__wakeup' => ['void'], +'JsonException::getCode' => ['int'], +'JsonException::getFile' => ['string'], +'JsonException::getLine' => ['int'], +'JsonException::getMessage' => ['string'], +'JsonException::getPrevious' => ['?Throwable'], +'JsonException::getTrace' => ['list\',args?:array}>'], +'JsonException::getTraceAsString' => ['string'], +'JsonIncrementalParser::__construct' => ['void', 'depth'=>'', 'options'=>''], +'JsonIncrementalParser::get' => ['', 'options'=>''], +'JsonIncrementalParser::getError' => [''], +'JsonIncrementalParser::parse' => ['', 'json'=>''], +'JsonIncrementalParser::parseFile' => ['', 'filename'=>''], +'JsonIncrementalParser::reset' => [''], +'JsonSerializable::jsonSerialize' => ['mixed'], +'Judy::__construct' => ['void', 'judy_type'=>'int'], +'Judy::__destruct' => ['void'], +'Judy::byCount' => ['int', 'nth_index'=>'int'], +'Judy::count' => ['int', 'index_start='=>'int', 'index_end='=>'int'], +'Judy::first' => ['mixed', 'index='=>'mixed'], +'Judy::firstEmpty' => ['mixed', 'index='=>'mixed'], +'Judy::free' => ['int'], +'Judy::getType' => ['int'], +'Judy::last' => ['mixed', 'index='=>'string'], +'Judy::lastEmpty' => ['mixed', 'index='=>'int'], +'Judy::memoryUsage' => ['int'], +'Judy::next' => ['mixed', 'index'=>'mixed'], +'Judy::nextEmpty' => ['mixed', 'index'=>'mixed'], +'Judy::offsetExists' => ['bool', 'offset'=>'mixed'], +'Judy::offsetGet' => ['mixed', 'offset'=>'mixed'], +'Judy::offsetSet' => ['bool', 'offset'=>'mixed', 'value'=>'mixed'], +'Judy::offsetUnset' => ['bool', 'offset'=>'mixed'], +'Judy::prev' => ['mixed', 'index'=>'mixed'], +'Judy::prevEmpty' => ['mixed', 'index'=>'mixed'], +'Judy::size' => ['int'], +'judy_type' => ['int', 'array'=>'judy'], +'judy_version' => ['string'], +'juliantojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], +'kadm5_chpass_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'password'=>'string'], +'kadm5_create_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'password='=>'string', 'options='=>'array'], +'kadm5_delete_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string'], +'kadm5_destroy' => ['bool', 'handle'=>'resource'], +'kadm5_flush' => ['bool', 'handle'=>'resource'], +'kadm5_get_policies' => ['array', 'handle'=>'resource'], +'kadm5_get_principal' => ['array', 'handle'=>'resource', 'principal'=>'string'], +'kadm5_get_principals' => ['array', 'handle'=>'resource'], +'kadm5_init_with_password' => ['resource', 'admin_server'=>'string', 'realm'=>'string', 'principal'=>'string', 'password'=>'string'], +'kadm5_modify_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'options'=>'array'], +'key' => ['int|string|null', 'array'=>'array|object'], +'key_exists' => ['bool', 'key'=>'string|int', 'array'=>'array'], +'krsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], +'ksort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], +'KTaglib_ID3v2_AttachedPictureFrame::getDescription' => ['string'], +'KTaglib_ID3v2_AttachedPictureFrame::getMimeType' => ['string'], +'KTaglib_ID3v2_AttachedPictureFrame::getType' => ['int'], +'KTaglib_ID3v2_AttachedPictureFrame::savePicture' => ['bool', 'filename'=>'string'], +'KTaglib_ID3v2_AttachedPictureFrame::setMimeType' => ['string', 'type'=>'string'], +'KTaglib_ID3v2_AttachedPictureFrame::setPicture' => ['', 'filename'=>'string'], +'KTaglib_ID3v2_AttachedPictureFrame::setType' => ['', 'type'=>'int'], +'KTaglib_ID3v2_Frame::__toString' => ['string'], +'KTaglib_ID3v2_Frame::getDescription' => ['string'], +'KTaglib_ID3v2_Frame::getMimeType' => ['string'], +'KTaglib_ID3v2_Frame::getSize' => ['int'], +'KTaglib_ID3v2_Frame::getType' => ['int'], +'KTaglib_ID3v2_Frame::savePicture' => ['bool', 'filename'=>'string'], +'KTaglib_ID3v2_Frame::setMimeType' => ['string', 'type'=>'string'], +'KTaglib_ID3v2_Frame::setPicture' => ['void', 'filename'=>'string'], +'KTaglib_ID3v2_Frame::setType' => ['void', 'type'=>'int'], +'KTaglib_ID3v2_Tag::addFrame' => ['bool', 'frame'=>'KTaglib_ID3v2_Frame'], +'KTaglib_ID3v2_Tag::getFrameList' => ['array'], +'KTaglib_MPEG_AudioProperties::getBitrate' => ['int'], +'KTaglib_MPEG_AudioProperties::getChannels' => ['int'], +'KTaglib_MPEG_AudioProperties::getLayer' => ['int'], +'KTaglib_MPEG_AudioProperties::getLength' => ['int'], +'KTaglib_MPEG_AudioProperties::getSampleBitrate' => ['int'], +'KTaglib_MPEG_AudioProperties::getVersion' => ['int'], +'KTaglib_MPEG_AudioProperties::isCopyrighted' => ['bool'], +'KTaglib_MPEG_AudioProperties::isOriginal' => ['bool'], +'KTaglib_MPEG_AudioProperties::isProtectionEnabled' => ['bool'], +'KTaglib_MPEG_File::getAudioProperties' => ['KTaglib_MPEG_File'], +'KTaglib_MPEG_File::getID3v1Tag' => ['KTaglib_ID3v1_Tag', 'create='=>'bool'], +'KTaglib_MPEG_File::getID3v2Tag' => ['KTaglib_ID3v2_Tag', 'create='=>'bool'], +'KTaglib_Tag::getAlbum' => ['string'], +'KTaglib_Tag::getArtist' => ['string'], +'KTaglib_Tag::getComment' => ['string'], +'KTaglib_Tag::getGenre' => ['string'], +'KTaglib_Tag::getTitle' => ['string'], +'KTaglib_Tag::getTrack' => ['int'], +'KTaglib_Tag::getYear' => ['int'], +'KTaglib_Tag::isEmpty' => ['bool'], +'labelcacheObj::freeCache' => ['bool'], +'labelObj::__construct' => ['void'], +'labelObj::convertToString' => ['string'], +'labelObj::deleteStyle' => ['int', 'index'=>'int'], +'labelObj::free' => ['void'], +'labelObj::getBinding' => ['string', 'labelbinding'=>'mixed'], +'labelObj::getExpressionString' => ['string'], +'labelObj::getStyle' => ['styleObj', 'index'=>'int'], +'labelObj::getTextString' => ['string'], +'labelObj::moveStyleDown' => ['int', 'index'=>'int'], +'labelObj::moveStyleUp' => ['int', 'index'=>'int'], +'labelObj::removeBinding' => ['int', 'labelbinding'=>'mixed'], +'labelObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'labelObj::setBinding' => ['int', 'labelbinding'=>'mixed', 'value'=>'string'], +'labelObj::setExpression' => ['int', 'expression'=>'string'], +'labelObj::setText' => ['int', 'text'=>'string'], +'labelObj::updateFromString' => ['int', 'snippet'=>'string'], +'Lapack::eigenValues' => ['array', 'a'=>'array', 'left='=>'array', 'right='=>'array'], +'Lapack::identity' => ['array', 'n'=>'int'], +'Lapack::leastSquaresByFactorisation' => ['array', 'a'=>'array', 'b'=>'array'], +'Lapack::leastSquaresBySVD' => ['array', 'a'=>'array', 'b'=>'array'], +'Lapack::pseudoInverse' => ['array', 'a'=>'array'], +'Lapack::singularValues' => ['array', 'a'=>'array'], +'Lapack::solveLinearEquation' => ['array', 'a'=>'array', 'b'=>'array'], +'layerObj::addFeature' => ['int', 'shape'=>'shapeObj'], +'layerObj::applySLD' => ['int', 'sldxml'=>'string', 'namedlayer'=>'string'], +'layerObj::applySLDURL' => ['int', 'sldurl'=>'string', 'namedlayer'=>'string'], +'layerObj::clearProcessing' => ['void'], +'layerObj::close' => ['void'], +'layerObj::convertToString' => ['string'], +'layerObj::draw' => ['int', 'image'=>'imageObj'], +'layerObj::drawQuery' => ['int', 'image'=>'imageObj'], +'layerObj::free' => ['void'], +'layerObj::generateSLD' => ['string'], +'layerObj::getClass' => ['classObj', 'classIndex'=>'int'], +'layerObj::getClassIndex' => ['int', 'shape'=>'', 'classgroup'=>'', 'numclasses'=>''], +'layerObj::getExtent' => ['rectObj'], +'layerObj::getFilterString' => ['?string'], +'layerObj::getGridIntersectionCoordinates' => ['array'], +'layerObj::getItems' => ['array'], +'layerObj::getMetaData' => ['int', 'name'=>'string'], +'layerObj::getNumResults' => ['int'], +'layerObj::getProcessing' => ['array'], +'layerObj::getProjection' => ['string'], +'layerObj::getResult' => ['resultObj', 'index'=>'int'], +'layerObj::getResultsBounds' => ['rectObj'], +'layerObj::getShape' => ['shapeObj', 'result'=>'resultObj'], +'layerObj::getWMSFeatureInfoURL' => ['string', 'clickX'=>'int', 'clickY'=>'int', 'featureCount'=>'int', 'infoFormat'=>'string'], +'layerObj::isVisible' => ['bool'], +'layerObj::moveclassdown' => ['int', 'index'=>'int'], +'layerObj::moveclassup' => ['int', 'index'=>'int'], +'layerObj::ms_newLayerObj' => ['layerObj', 'map'=>'mapObj', 'layer'=>'layerObj'], +'layerObj::nextShape' => ['shapeObj'], +'layerObj::open' => ['int'], +'layerObj::queryByAttributes' => ['int', 'qitem'=>'string', 'qstring'=>'string', 'mode'=>'int'], +'layerObj::queryByFeatures' => ['int', 'slayer'=>'int'], +'layerObj::queryByPoint' => ['int', 'point'=>'pointObj', 'mode'=>'int', 'buffer'=>'float'], +'layerObj::queryByRect' => ['int', 'rect'=>'rectObj'], +'layerObj::queryByShape' => ['int', 'shape'=>'shapeObj'], +'layerObj::removeClass' => ['?classObj', 'index'=>'int'], +'layerObj::removeMetaData' => ['int', 'name'=>'string'], +'layerObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'layerObj::setConnectionType' => ['int', 'connectiontype'=>'int', 'plugin_library'=>'string'], +'layerObj::setFilter' => ['int', 'expression'=>'string'], +'layerObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], +'layerObj::setProjection' => ['int', 'proj_params'=>'string'], +'layerObj::setWKTProjection' => ['int', 'proj_params'=>'string'], +'layerObj::updateFromString' => ['int', 'snippet'=>'string'], +'lcfirst' => ['string', 'string'=>'string'], +'lcg_value' => ['float'], +'lchgrp' => ['bool', 'filename'=>'string', 'group'=>'string|int'], +'lchown' => ['bool', 'filename'=>'string', 'user'=>'string|int'], +'ldap_8859_to_t61' => ['string', 'value'=>'string'], +'ldap_add' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], +'ldap_add_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], +'ldap_bind' => ['bool', 'ldap'=>'LDAP\Connection', 'dn='=>'string|null', 'password='=>'string|null'], +'ldap_bind_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn='=>'string|null', 'password='=>'string|null', 'controls='=>'?array'], +'ldap_close' => ['bool', 'ldap'=>'LDAP\Connection'], +'ldap_compare' => ['bool|int', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'attribute'=>'string', 'value'=>'string', 'controls='=>'?array'], +'ldap_connect' => ['LDAP\Connection|false', 'uri='=>'string', 'port='=>'int', 'wallet='=>'string', 'password='=>'string', 'auth_mode='=>'int'], +'ldap_count_entries' => ['int|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], +'ldap_delete' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'controls='=>'?array'], +'ldap_delete_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'controls='=>'?array'], +'ldap_dn2ufn' => ['string', 'dn'=>'string'], +'ldap_err2str' => ['string', 'errno'=>'int'], +'ldap_errno' => ['int', 'ldap'=>'LDAP\Connection'], +'ldap_error' => ['string', 'ldap'=>'LDAP\Connection'], +'ldap_escape' => ['string', 'value'=>'string', 'ignore='=>'string', 'flags='=>'int'], +'ldap_exop' => ['mixed', 'ldap'=>'LDAP\Connection', 'request_oid'=>'string', 'request_data='=>'string', 'controls='=>'?array', '&w_response_data='=>'string', '&w_response_oid='=>'string'], +'ldap_exop_passwd' => ['bool|string', 'ldap'=>'LDAP\Connection', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array|null'], +'ldap_exop_refresh' => ['int|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'ttl'=>'int'], +'ldap_exop_whoami' => ['string|false', 'ldap'=>'LDAP\Connection'], +'ldap_explode_dn' => ['array|false', 'dn'=>'string', 'with_attrib'=>'int'], +'ldap_first_attribute' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], +'ldap_first_entry' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], +'ldap_first_reference' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], +'ldap_free_result' => ['bool', 'result'=>'LDAP\Result'], +'ldap_get_attributes' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], +'ldap_get_dn' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], +'ldap_get_entries' => ['array|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], +'ldap_get_option' => ['bool', 'ldap'=>'LDAP\Connection', 'option'=>'int', '&w_value='=>'array|string|int|null'], +'ldap_get_values' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', 'attribute'=>'string'], +'ldap_get_values_len' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', 'attribute'=>'string'], +'ldap_list' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], +'ldap_mod_add' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], +'ldap_mod_add_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], +'ldap_mod_del' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], +'ldap_mod_del_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], +'ldap_mod_replace' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], +'ldap_mod_replace_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], +'ldap_modify' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], +'ldap_modify_batch' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'modifications_info'=>'array', 'controls='=>'?array'], +'ldap_next_attribute' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], +'ldap_next_entry' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], +'ldap_next_reference' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], +'ldap_parse_exop' => ['bool', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result', '&w_response_data='=>'string', '&w_response_oid='=>'string'], +'ldap_parse_reference' => ['bool', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', '&w_referrals'=>'array'], +'ldap_parse_result' => ['bool', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result', '&w_error_code'=>'int', '&w_matched_dn='=>'string', '&w_error_message='=>'string', '&w_referrals='=>'array', '&w_controls='=>'array'], +'ldap_read' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], +'ldap_rename' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'?array'], +'ldap_rename_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'?array'], +'ldap_sasl_bind' => ['bool', 'ldap'=>'LDAP\Connection', 'dn='=>'string', 'password='=>'string', 'mech='=>'string', 'realm='=>'string', 'authc_id='=>'string', 'authz_id='=>'string', 'props='=>'string'], +'ldap_search' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], +'ldap_set_option' => ['bool', 'ldap'=>'LDAP\Connection|null', 'option'=>'int', 'value'=>'mixed'], +'ldap_set_rebind_proc' => ['bool', 'ldap'=>'LDAP\Connection', 'callback'=>'?callable'], +'ldap_start_tls' => ['bool', 'ldap'=>'LDAP\Connection'], +'ldap_t61_to_8859' => ['string', 'value'=>'string'], +'ldap_unbind' => ['bool', 'ldap'=>'LDAP\Connection'], +'leak' => ['', 'num_bytes'=>'int'], +'leak_variable' => ['', 'variable'=>'', 'leak_data'=>'bool'], +'legendObj::convertToString' => ['string'], +'legendObj::free' => ['void'], +'legendObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'legendObj::updateFromString' => ['int', 'snippet'=>'string'], +'LengthException::__clone' => ['void'], +'LengthException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?LengthException'], +'LengthException::__toString' => ['string'], +'LengthException::getCode' => ['int'], +'LengthException::getFile' => ['string'], +'LengthException::getLine' => ['int'], +'LengthException::getMessage' => ['string'], +'LengthException::getPrevious' => ['Throwable|LengthException|null'], +'LengthException::getTrace' => ['list\',args?:array}>'], +'LengthException::getTraceAsString' => ['string'], +'LevelDB::__construct' => ['void', 'name'=>'string', 'options='=>'array', 'read_options='=>'array', 'write_options='=>'array'], +'LevelDB::close' => [''], +'LevelDB::compactRange' => ['', 'start'=>'', 'limit'=>''], +'LevelDB::delete' => ['bool', 'key'=>'string', 'write_options='=>'array'], +'LevelDB::destroy' => ['', 'name'=>'', 'options='=>'array'], +'LevelDB::get' => ['bool|string', 'key'=>'string', 'read_options='=>'array'], +'LevelDB::getApproximateSizes' => ['', 'start'=>'', 'limit'=>''], +'LevelDB::getIterator' => ['LevelDBIterator', 'options='=>'array'], +'LevelDB::getProperty' => ['mixed', 'name'=>'string'], +'LevelDB::getSnapshot' => ['LevelDBSnapshot'], +'LevelDB::put' => ['', 'key'=>'string', 'value'=>'string', 'write_options='=>'array'], +'LevelDB::repair' => ['', 'name'=>'', 'options='=>'array'], +'LevelDB::set' => ['', 'key'=>'string', 'value'=>'string', 'write_options='=>'array'], +'LevelDB::write' => ['', 'batch'=>'LevelDBWriteBatch', 'write_options='=>'array'], +'LevelDBIterator::__construct' => ['void', 'db'=>'LevelDB', 'read_options='=>'array'], +'LevelDBIterator::current' => ['mixed'], +'LevelDBIterator::destroy' => [''], +'LevelDBIterator::getError' => [''], +'LevelDBIterator::key' => ['int|string'], +'LevelDBIterator::last' => [''], +'LevelDBIterator::next' => ['void'], +'LevelDBIterator::prev' => [''], +'LevelDBIterator::rewind' => ['void'], +'LevelDBIterator::seek' => ['', 'key'=>''], +'LevelDBIterator::valid' => ['bool'], +'LevelDBSnapshot::__construct' => ['void', 'db'=>'LevelDB'], +'LevelDBSnapshot::release' => [''], +'LevelDBWriteBatch::__construct' => ['void', 'name'=>'', 'options='=>'array', 'read_options='=>'array', 'write_options='=>'array'], +'LevelDBWriteBatch::clear' => [''], +'LevelDBWriteBatch::delete' => ['', 'key'=>'', 'write_options='=>'array'], +'LevelDBWriteBatch::put' => ['', 'key'=>'', 'value'=>'', 'write_options='=>'array'], +'LevelDBWriteBatch::set' => ['', 'key'=>'', 'value'=>'', 'write_options='=>'array'], +'levenshtein' => ['int', 'string1'=>'string', 'string2'=>'string'], +'levenshtein\'1' => ['int', 'string1'=>'string', 'string2'=>'string', 'insertion_cost'=>'int', 'repetition_cost'=>'int', 'deletion_cost'=>'int'], +'libxml_clear_errors' => ['void'], +'libxml_disable_entity_loader' => ['bool', 'disable='=>'bool'], +'libxml_get_errors' => ['array'], +'libxml_get_last_error' => ['LibXMLError|false'], +'libxml_set_external_entity_loader' => ['bool', 'resolver_function'=>'callable'], +'libxml_set_streams_context' => ['void', 'context'=>'resource'], +'libxml_use_internal_errors' => ['bool', 'use_errors='=>'bool'], +'LimitIterator::__construct' => ['void', 'iterator'=>'Iterator', 'offset='=>'int', 'count='=>'int'], +'LimitIterator::current' => ['mixed'], +'LimitIterator::getInnerIterator' => ['Iterator'], +'LimitIterator::getPosition' => ['int'], +'LimitIterator::key' => ['mixed'], +'LimitIterator::next' => ['void'], +'LimitIterator::rewind' => ['void'], +'LimitIterator::seek' => ['int', 'position'=>'int'], +'LimitIterator::valid' => ['bool'], +'lineObj::__construct' => ['void'], +'lineObj::add' => ['int', 'point'=>'pointObj'], +'lineObj::addXY' => ['int', 'x'=>'float', 'y'=>'float', 'm'=>'float'], +'lineObj::addXYZ' => ['int', 'x'=>'float', 'y'=>'float', 'z'=>'float', 'm'=>'float'], +'lineObj::ms_newLineObj' => ['lineObj'], +'lineObj::point' => ['pointObj', 'i'=>'int'], +'lineObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], +'link' => ['bool', 'target'=>'string', 'link'=>'string'], +'linkinfo' => ['int|false', 'path'=>'string'], +'litespeed_request_headers' => ['array'], +'litespeed_response_headers' => ['array'], +'Locale::acceptFromHttp' => ['string|false', 'header'=>'string'], +'Locale::canonicalize' => ['string', 'locale'=>'string'], +'Locale::composeLocale' => ['string', 'subtags'=>'array'], +'Locale::filterMatches' => ['bool', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'], +'Locale::getAllVariants' => ['array', 'locale'=>'string'], +'Locale::getDefault' => ['string'], +'Locale::getDisplayLanguage' => ['string', 'locale'=>'string', 'in_locale='=>'string'], +'Locale::getDisplayName' => ['string', 'locale'=>'string', 'in_locale='=>'string'], +'Locale::getDisplayRegion' => ['string', 'locale'=>'string', 'in_locale='=>'string'], +'Locale::getDisplayScript' => ['string', 'locale'=>'string', 'in_locale='=>'string'], +'Locale::getDisplayVariant' => ['string', 'locale'=>'string', 'in_locale='=>'string'], +'Locale::getKeywords' => ['array|false', 'locale'=>'string'], +'Locale::getPrimaryLanguage' => ['string', 'locale'=>'string'], +'Locale::getRegion' => ['string', 'locale'=>'string'], +'Locale::getScript' => ['string', 'locale'=>'string'], +'Locale::lookup' => ['string', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'default='=>'string'], +'Locale::parseLocale' => ['array', 'locale'=>'string'], +'Locale::setDefault' => ['bool', 'locale'=>'string'], +'locale_accept_from_http' => ['string|false', 'header'=>'string'], +'locale_canonicalize' => ['?string', 'locale'=>'string'], +'locale_compose' => ['string|false', 'subtags'=>'array'], +'locale_filter_matches' => ['?bool', 'languageTag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'], +'locale_get_all_variants' => ['?array', 'locale'=>'string'], +'locale_get_default' => ['string'], +'locale_get_display_language' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], +'locale_get_display_name' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], +'locale_get_display_region' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], +'locale_get_display_script' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], +'locale_get_display_variant' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], +'locale_get_keywords' => ['array|false|null', 'locale'=>'string'], +'locale_get_primary_language' => ['?string', 'locale'=>'string'], +'locale_get_region' => ['?string', 'locale'=>'string'], +'locale_get_script' => ['?string', 'locale'=>'string'], +'locale_lookup' => ['?string', 'languageTag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'defaultLocale='=>'string'], +'locale_parse' => ['?array', 'locale'=>'string'], +'locale_set_default' => ['bool', 'locale'=>'string'], +'localeconv' => ['array'], +'localtime' => ['array', 'timestamp='=>'int', 'associative='=>'bool'], +'log' => ['float', 'num'=>'float', 'base='=>'float'], +'log10' => ['float', 'num'=>'float'], +'log1p' => ['float', 'num'=>'float'], +'LogicException::__clone' => ['void'], +'LogicException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?LogicException'], +'LogicException::__toString' => ['string'], +'LogicException::getCode' => ['int'], +'LogicException::getFile' => ['string'], +'LogicException::getLine' => ['int'], +'LogicException::getMessage' => ['string'], +'LogicException::getPrevious' => ['Throwable|LogicException|null'], +'LogicException::getTrace' => ['list\',args?:array}>'], +'LogicException::getTraceAsString' => ['string'], +'long2ip' => ['string', 'ip'=>'string|int'], +'lstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'filename'=>'string'], +'ltrim' => ['string', 'string'=>'string', 'characters='=>'string'], +'Lua::__call' => ['mixed', 'lua_func'=>'callable', 'args='=>'array', 'use_self='=>'int'], +'Lua::__construct' => ['void', 'lua_script_file'=>'string'], +'Lua::assign' => ['?Lua', 'name'=>'string', 'value'=>'mixed'], +'Lua::call' => ['mixed', 'lua_func'=>'callable', 'args='=>'array', 'use_self='=>'int'], +'Lua::eval' => ['mixed', 'statements'=>'string'], +'Lua::getVersion' => ['string'], +'Lua::include' => ['mixed', 'file'=>'string'], +'Lua::registerCallback' => ['Lua|null|false', 'name'=>'string', 'function'=>'callable'], +'LuaClosure::__invoke' => ['void', 'arg'=>'mixed', '...args='=>'mixed'], +'lzf_compress' => ['string', 'data'=>'string'], +'lzf_decompress' => ['string', 'data'=>'string'], +'lzf_optimized_for' => ['int'], +'m_checkstatus' => ['int', 'conn'=>'resource', 'identifier'=>'int'], +'m_completeauthorizations' => ['int', 'conn'=>'resource', 'array'=>'int'], +'m_connect' => ['int', 'conn'=>'resource'], +'m_connectionerror' => ['string', 'conn'=>'resource'], +'m_deletetrans' => ['bool', 'conn'=>'resource', 'identifier'=>'int'], +'m_destroyconn' => ['bool', 'conn'=>'resource'], +'m_destroyengine' => ['void'], +'m_getcell' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column'=>'string', 'row'=>'int'], +'m_getcellbynum' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column'=>'int', 'row'=>'int'], +'m_getcommadelimited' => ['string', 'conn'=>'resource', 'identifier'=>'int'], +'m_getheader' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column_num'=>'int'], +'m_initconn' => ['resource'], +'m_initengine' => ['int', 'location'=>'string'], +'m_iscommadelimited' => ['int', 'conn'=>'resource', 'identifier'=>'int'], +'m_maxconntimeout' => ['bool', 'conn'=>'resource', 'secs'=>'int'], +'m_monitor' => ['int', 'conn'=>'resource'], +'m_numcolumns' => ['int', 'conn'=>'resource', 'identifier'=>'int'], +'m_numrows' => ['int', 'conn'=>'resource', 'identifier'=>'int'], +'m_parsecommadelimited' => ['int', 'conn'=>'resource', 'identifier'=>'int'], +'m_responsekeys' => ['array', 'conn'=>'resource', 'identifier'=>'int'], +'m_responseparam' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'key'=>'string'], +'m_returnstatus' => ['int', 'conn'=>'resource', 'identifier'=>'int'], +'m_setblocking' => ['int', 'conn'=>'resource', 'tf'=>'int'], +'m_setdropfile' => ['int', 'conn'=>'resource', 'directory'=>'string'], +'m_setip' => ['int', 'conn'=>'resource', 'host'=>'string', 'port'=>'int'], +'m_setssl' => ['int', 'conn'=>'resource', 'host'=>'string', 'port'=>'int'], +'m_setssl_cafile' => ['int', 'conn'=>'resource', 'cafile'=>'string'], +'m_setssl_files' => ['int', 'conn'=>'resource', 'sslkeyfile'=>'string', 'sslcertfile'=>'string'], +'m_settimeout' => ['int', 'conn'=>'resource', 'seconds'=>'int'], +'m_sslcert_gen_hash' => ['string', 'filename'=>'string'], +'m_transactionssent' => ['int', 'conn'=>'resource'], +'m_transinqueue' => ['int', 'conn'=>'resource'], +'m_transkeyval' => ['int', 'conn'=>'resource', 'identifier'=>'int', 'key'=>'string', 'value'=>'string'], +'m_transnew' => ['int', 'conn'=>'resource'], +'m_transsend' => ['int', 'conn'=>'resource', 'identifier'=>'int'], +'m_uwait' => ['int', 'microsecs'=>'int'], +'m_validateidentifier' => ['int', 'conn'=>'resource', 'tf'=>'int'], +'m_verifyconnection' => ['bool', 'conn'=>'resource', 'tf'=>'int'], +'m_verifysslcert' => ['bool', 'conn'=>'resource', 'tf'=>'int'], +'magic_quotes_runtime' => ['bool', 'new_setting'=>'bool'], +'mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array|null', 'additional_params='=>'string'], +'mailparse_determine_best_xfer_encoding' => ['string', 'fp'=>'resource'], +'mailparse_msg_create' => ['resource'], +'mailparse_msg_extract_part' => ['void', 'mimemail'=>'resource', 'msgbody'=>'string', 'callbackfunc='=>'callable'], +'mailparse_msg_extract_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'mixed', 'callbackfunc='=>'callable'], +'mailparse_msg_extract_whole_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'string', 'callbackfunc='=>'callable'], +'mailparse_msg_free' => ['bool', 'mimemail'=>'resource'], +'mailparse_msg_get_part' => ['resource', 'mimemail'=>'resource', 'mimesection'=>'string'], +'mailparse_msg_get_part_data' => ['array', 'mimemail'=>'resource'], +'mailparse_msg_get_structure' => ['array', 'mimemail'=>'resource'], +'mailparse_msg_parse' => ['bool', 'mimemail'=>'resource', 'data'=>'string'], +'mailparse_msg_parse_file' => ['resource|false', 'filename'=>'string'], +'mailparse_rfc822_parse_addresses' => ['array', 'addresses'=>'string'], +'mailparse_stream_encode' => ['bool', 'sourcefp'=>'resource', 'destfp'=>'resource', 'encoding'=>'string'], +'mailparse_uudecode_all' => ['array', 'fp'=>'resource'], +'mapObj::__construct' => ['void', 'map_file_name'=>'string', 'new_map_path'=>'string'], +'mapObj::appendOutputFormat' => ['int', 'outputFormat'=>'outputformatObj'], +'mapObj::applyconfigoptions' => ['int'], +'mapObj::applySLD' => ['int', 'sldxml'=>'string'], +'mapObj::applySLDURL' => ['int', 'sldurl'=>'string'], +'mapObj::convertToString' => ['string'], +'mapObj::draw' => ['?imageObj'], +'mapObj::drawLabelCache' => ['int', 'image'=>'imageObj'], +'mapObj::drawLegend' => ['imageObj'], +'mapObj::drawQuery' => ['?imageObj'], +'mapObj::drawReferenceMap' => ['imageObj'], +'mapObj::drawScaleBar' => ['imageObj'], +'mapObj::embedLegend' => ['int', 'image'=>'imageObj'], +'mapObj::embedScalebar' => ['int', 'image'=>'imageObj'], +'mapObj::free' => ['void'], +'mapObj::generateSLD' => ['string'], +'mapObj::getAllGroupNames' => ['array'], +'mapObj::getAllLayerNames' => ['array'], +'mapObj::getColorbyIndex' => ['colorObj', 'iCloIndex'=>'int'], +'mapObj::getConfigOption' => ['string', 'key'=>'string'], +'mapObj::getLabel' => ['labelcacheMemberObj', 'index'=>'int'], +'mapObj::getLayer' => ['layerObj', 'index'=>'int'], +'mapObj::getLayerByName' => ['layerObj', 'layer_name'=>'string'], +'mapObj::getLayersDrawingOrder' => ['array'], +'mapObj::getLayersIndexByGroup' => ['array', 'groupname'=>'string'], +'mapObj::getMetaData' => ['int', 'name'=>'string'], +'mapObj::getNumSymbols' => ['int'], +'mapObj::getOutputFormat' => ['?outputformatObj', 'index'=>'int'], +'mapObj::getProjection' => ['string'], +'mapObj::getSymbolByName' => ['int', 'symbol_name'=>'string'], +'mapObj::getSymbolObjectById' => ['symbolObj', 'symbolid'=>'int'], +'mapObj::loadMapContext' => ['int', 'filename'=>'string', 'unique_layer_name'=>'bool'], +'mapObj::loadOWSParameters' => ['int', 'request'=>'OwsrequestObj', 'version'=>'string'], +'mapObj::moveLayerDown' => ['int', 'layerindex'=>'int'], +'mapObj::moveLayerUp' => ['int', 'layerindex'=>'int'], +'mapObj::ms_newMapObjFromString' => ['mapObj', 'map_file_string'=>'string', 'new_map_path'=>'string'], +'mapObj::offsetExtent' => ['int', 'x'=>'float', 'y'=>'float'], +'mapObj::owsDispatch' => ['int', 'request'=>'OwsrequestObj'], +'mapObj::prepareImage' => ['imageObj'], +'mapObj::prepareQuery' => ['void'], +'mapObj::processLegendTemplate' => ['string', 'params'=>'array'], +'mapObj::processQueryTemplate' => ['string', 'params'=>'array', 'generateimages'=>'bool'], +'mapObj::processTemplate' => ['string', 'params'=>'array', 'generateimages'=>'bool'], +'mapObj::queryByFeatures' => ['int', 'slayer'=>'int'], +'mapObj::queryByIndex' => ['int', 'layerindex'=>'', 'tileindex'=>'', 'shapeindex'=>'', 'addtoquery'=>''], +'mapObj::queryByPoint' => ['int', 'point'=>'pointObj', 'mode'=>'int', 'buffer'=>'float'], +'mapObj::queryByRect' => ['int', 'rect'=>'rectObj'], +'mapObj::queryByShape' => ['int', 'shape'=>'shapeObj'], +'mapObj::removeLayer' => ['layerObj', 'nIndex'=>'int'], +'mapObj::removeMetaData' => ['int', 'name'=>'string'], +'mapObj::removeOutputFormat' => ['int', 'name'=>'string'], +'mapObj::save' => ['int', 'filename'=>'string'], +'mapObj::saveMapContext' => ['int', 'filename'=>'string'], +'mapObj::saveQuery' => ['int', 'filename'=>'string', 'results'=>'int'], +'mapObj::scaleExtent' => ['int', 'zoomfactor'=>'float', 'minscaledenom'=>'float', 'maxscaledenom'=>'float'], +'mapObj::selectOutputFormat' => ['int', 'type'=>'string'], +'mapObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'mapObj::setCenter' => ['int', 'center'=>'pointObj'], +'mapObj::setConfigOption' => ['int', 'key'=>'string', 'value'=>'string'], +'mapObj::setExtent' => ['void', 'minx'=>'float', 'miny'=>'float', 'maxx'=>'float', 'maxy'=>'float'], +'mapObj::setFontSet' => ['int', 'fileName'=>'string'], +'mapObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], +'mapObj::setProjection' => ['int', 'proj_params'=>'string', 'bSetUnitsAndExtents'=>'bool'], +'mapObj::setRotation' => ['int', 'rotation_angle'=>'float'], +'mapObj::setSize' => ['int', 'width'=>'int', 'height'=>'int'], +'mapObj::setSymbolSet' => ['int', 'fileName'=>'string'], +'mapObj::setWKTProjection' => ['int', 'proj_params'=>'string', 'bSetUnitsAndExtents'=>'bool'], +'mapObj::zoomPoint' => ['int', 'nZoomFactor'=>'int', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'], +'mapObj::zoomRectangle' => ['int', 'oPixelExt'=>'rectObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'], +'mapObj::zoomScale' => ['int', 'nScaleDenom'=>'float', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj', 'oMaxGeorefExt'=>'rectObj'], +'max' => ['mixed', 'value'=>'non-empty-array'], +'max\'1' => ['mixed', 'value'=>'', 'values'=>'', '...args='=>''], +'maxdb::__construct' => ['void', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], +'maxdb::affected_rows' => ['int', 'link'=>''], +'maxdb::auto_commit' => ['bool', 'link'=>'', 'mode'=>'bool'], +'maxdb::change_user' => ['bool', 'link'=>'', 'user'=>'string', 'password'=>'string', 'database'=>'string'], +'maxdb::character_set_name' => ['string', 'link'=>''], +'maxdb::close' => ['bool', 'link'=>''], +'maxdb::commit' => ['bool', 'link'=>''], +'maxdb::disable_reads_from_master' => ['', 'link'=>''], +'maxdb::errno' => ['int', 'link'=>''], +'maxdb::error' => ['string', 'link'=>''], +'maxdb::field_count' => ['int', 'link'=>''], +'maxdb::get_host_info' => ['string', 'link'=>''], +'maxdb::info' => ['string', 'link'=>''], +'maxdb::insert_id' => ['', 'link'=>''], +'maxdb::kill' => ['bool', 'link'=>'', 'processid'=>'int'], +'maxdb::more_results' => ['bool', 'link'=>''], +'maxdb::multi_query' => ['bool', 'link'=>'', 'query'=>'string'], +'maxdb::next_result' => ['bool', 'link'=>''], +'maxdb::num_rows' => ['int', 'result'=>''], +'maxdb::options' => ['bool', 'link'=>'', 'option'=>'int', 'value'=>''], +'maxdb::ping' => ['bool', 'link'=>''], +'maxdb::prepare' => ['maxdb_stmt', 'link'=>'', 'query'=>'string'], +'maxdb::protocol_version' => ['string', 'link'=>''], +'maxdb::query' => ['', 'link'=>'', 'query'=>'string', 'resultmode='=>'int'], +'maxdb::real_connect' => ['bool', 'link'=>'', 'hostname='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], +'maxdb::real_escape_string' => ['string', 'link'=>'', 'escapestr'=>'string'], +'maxdb::real_query' => ['bool', 'link'=>'', 'query'=>'string'], +'maxdb::rollback' => ['bool', 'link'=>''], +'maxdb::rpl_query_type' => ['int', 'link'=>''], +'maxdb::select_db' => ['bool', 'link'=>'', 'dbname'=>'string'], +'maxdb::send_query' => ['bool', 'link'=>'', 'query'=>'string'], +'maxdb::server_info' => ['string', 'link'=>''], +'maxdb::server_version' => ['int', 'link'=>''], +'maxdb::sqlstate' => ['string', 'link'=>''], +'maxdb::ssl_set' => ['bool', 'link'=>'', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], +'maxdb::stat' => ['string', 'link'=>''], +'maxdb::stmt_init' => ['object', 'link'=>''], +'maxdb::store_result' => ['bool', 'link'=>''], +'maxdb::thread_id' => ['int', 'link'=>''], +'maxdb::use_result' => ['resource', 'link'=>''], +'maxdb::warning_count' => ['int', 'link'=>''], +'maxdb_affected_rows' => ['int', 'link'=>'resource'], +'maxdb_autocommit' => ['bool', 'link'=>'', 'mode'=>'bool'], +'maxdb_change_user' => ['bool', 'link'=>'', 'user'=>'string', 'password'=>'string', 'database'=>'string'], +'maxdb_character_set_name' => ['string', 'link'=>''], +'maxdb_close' => ['bool', 'link'=>''], +'maxdb_commit' => ['bool', 'link'=>''], +'maxdb_connect' => ['resource', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], +'maxdb_connect_errno' => ['int'], +'maxdb_connect_error' => ['string'], +'maxdb_data_seek' => ['bool', 'result'=>'', 'offset'=>'int'], +'maxdb_debug' => ['void', 'debug'=>'string'], +'maxdb_disable_reads_from_master' => ['', 'link'=>''], +'maxdb_disable_rpl_parse' => ['bool', 'link'=>'resource'], +'maxdb_dump_debug_info' => ['bool', 'link'=>'resource'], +'maxdb_embedded_connect' => ['resource', 'dbname='=>'string'], +'maxdb_enable_reads_from_master' => ['bool', 'link'=>'resource'], +'maxdb_enable_rpl_parse' => ['bool', 'link'=>'resource'], +'maxdb_errno' => ['int', 'link'=>'resource'], +'maxdb_error' => ['string', 'link'=>'resource'], +'maxdb_fetch_array' => ['', 'result'=>'', 'resulttype='=>'int'], +'maxdb_fetch_assoc' => ['array', 'result'=>''], +'maxdb_fetch_field' => ['', 'result'=>''], +'maxdb_fetch_field_direct' => ['', 'result'=>'', 'fieldnr'=>'int'], +'maxdb_fetch_fields' => ['', 'result'=>''], +'maxdb_fetch_lengths' => ['array', 'result'=>'resource'], +'maxdb_fetch_object' => ['object', 'result'=>'object'], +'maxdb_fetch_row' => ['', 'result'=>''], +'maxdb_field_count' => ['int', 'link'=>''], +'maxdb_field_seek' => ['bool', 'result'=>'', 'fieldnr'=>'int'], +'maxdb_field_tell' => ['int', 'result'=>'resource'], +'maxdb_free_result' => ['', 'result'=>''], +'maxdb_get_client_info' => ['string'], +'maxdb_get_client_version' => ['int'], +'maxdb_get_host_info' => ['string', 'link'=>'resource'], +'maxdb_get_proto_info' => ['string', 'link'=>'resource'], +'maxdb_get_server_info' => ['string', 'link'=>'resource'], +'maxdb_get_server_version' => ['int', 'link'=>'resource'], +'maxdb_info' => ['string', 'link'=>'resource'], +'maxdb_init' => ['resource'], +'maxdb_insert_id' => ['mixed', 'link'=>'resource'], +'maxdb_kill' => ['bool', 'link'=>'', 'processid'=>'int'], +'maxdb_master_query' => ['bool', 'link'=>'resource', 'query'=>'string'], +'maxdb_more_results' => ['bool', 'link'=>'resource'], +'maxdb_multi_query' => ['bool', 'link'=>'', 'query'=>'string'], +'maxdb_next_result' => ['bool', 'link'=>'resource'], +'maxdb_num_fields' => ['int', 'result'=>'resource'], +'maxdb_num_rows' => ['int', 'result'=>'resource'], +'maxdb_options' => ['bool', 'link'=>'', 'option'=>'int', 'value'=>''], +'maxdb_ping' => ['bool', 'link'=>''], +'maxdb_prepare' => ['maxdb_stmt', 'link'=>'', 'query'=>'string'], +'maxdb_query' => ['', 'link'=>'', 'query'=>'string', 'resultmode='=>'int'], +'maxdb_real_connect' => ['bool', 'link'=>'', 'hostname='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], +'maxdb_real_escape_string' => ['string', 'link'=>'', 'escapestr'=>'string'], +'maxdb_real_query' => ['bool', 'link'=>'', 'query'=>'string'], +'maxdb_report' => ['bool', 'flags'=>'int'], +'maxdb_result::current_field' => ['int', 'result'=>''], +'maxdb_result::data_seek' => ['bool', 'result'=>'', 'offset'=>'int'], +'maxdb_result::fetch_array' => ['', 'result'=>'', 'resulttype='=>'int'], +'maxdb_result::fetch_assoc' => ['array', 'result'=>''], +'maxdb_result::fetch_field' => ['', 'result'=>''], +'maxdb_result::fetch_field_direct' => ['', 'result'=>'', 'fieldnr'=>'int'], +'maxdb_result::fetch_fields' => ['', 'result'=>''], +'maxdb_result::fetch_object' => ['object', 'result'=>'object'], +'maxdb_result::fetch_row' => ['', 'result'=>''], +'maxdb_result::field_count' => ['int', 'result'=>''], +'maxdb_result::field_seek' => ['bool', 'result'=>'', 'fieldnr'=>'int'], +'maxdb_result::free' => ['', 'result'=>''], +'maxdb_result::lengths' => ['array', 'result'=>''], +'maxdb_rollback' => ['bool', 'link'=>''], +'maxdb_rpl_parse_enabled' => ['int', 'link'=>'resource'], +'maxdb_rpl_probe' => ['bool', 'link'=>'resource'], +'maxdb_rpl_query_type' => ['int', 'link'=>''], +'maxdb_select_db' => ['bool', 'link'=>'resource', 'dbname'=>'string'], +'maxdb_send_query' => ['bool', 'link'=>'', 'query'=>'string'], +'maxdb_server_end' => ['void'], +'maxdb_server_init' => ['bool', 'server='=>'array', 'groups='=>'array'], +'maxdb_sqlstate' => ['string', 'link'=>'resource'], +'maxdb_ssl_set' => ['bool', 'link'=>'', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], +'maxdb_stat' => ['string', 'link'=>''], +'maxdb_stmt::affected_rows' => ['int', 'stmt'=>''], +'maxdb_stmt::bind_param' => ['bool', 'stmt'=>'', 'types'=>'string', '&...rw_var'=>''], +'maxdb_stmt::bind_param\'1' => ['bool', 'stmt'=>'', 'types'=>'string', '&rw_var'=>'array'], +'maxdb_stmt::bind_result' => ['bool', 'stmt'=>'', '&w_var1'=>'', '&...w_vars='=>''], +'maxdb_stmt::close' => ['bool', 'stmt'=>''], +'maxdb_stmt::close_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int'], +'maxdb_stmt::data_seek' => ['bool', 'statement'=>'', 'offset'=>'int'], +'maxdb_stmt::errno' => ['int', 'stmt'=>''], +'maxdb_stmt::error' => ['string', 'stmt'=>''], +'maxdb_stmt::execute' => ['bool', 'stmt'=>''], +'maxdb_stmt::fetch' => ['bool', 'stmt'=>''], +'maxdb_stmt::free_result' => ['', 'stmt'=>''], +'maxdb_stmt::num_rows' => ['int', 'stmt'=>''], +'maxdb_stmt::param_count' => ['int', 'stmt'=>''], +'maxdb_stmt::prepare' => ['', 'stmt'=>'', 'query'=>'string'], +'maxdb_stmt::reset' => ['bool', 'stmt'=>''], +'maxdb_stmt::result_metadata' => ['resource', 'stmt'=>''], +'maxdb_stmt::send_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int', 'data'=>'string'], +'maxdb_stmt::stmt_send_long_data' => ['bool', 'param_nr'=>'int', 'data'=>'string'], +'maxdb_stmt::store_result' => ['bool'], +'maxdb_stmt_affected_rows' => ['int', 'stmt'=>'resource'], +'maxdb_stmt_bind_param' => ['bool', 'stmt'=>'', 'types'=>'string', 'var1'=>'', '...args='=>'', 'var='=>'array'], +'maxdb_stmt_bind_result' => ['bool', 'stmt'=>'', '&w_var1'=>'', '&...w_vars='=>''], +'maxdb_stmt_close' => ['bool', 'stmt'=>''], +'maxdb_stmt_close_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int'], +'maxdb_stmt_data_seek' => ['bool', 'statement'=>'', 'offset'=>'int'], +'maxdb_stmt_errno' => ['int', 'stmt'=>'resource'], +'maxdb_stmt_error' => ['string', 'stmt'=>'resource'], +'maxdb_stmt_execute' => ['bool', 'stmt'=>''], +'maxdb_stmt_fetch' => ['bool', 'stmt'=>''], +'maxdb_stmt_free_result' => ['', 'stmt'=>''], +'maxdb_stmt_init' => ['object', 'link'=>''], +'maxdb_stmt_num_rows' => ['int', 'stmt'=>'resource'], +'maxdb_stmt_param_count' => ['int', 'stmt'=>'resource'], +'maxdb_stmt_prepare' => ['', 'stmt'=>'', 'query'=>'string'], +'maxdb_stmt_reset' => ['bool', 'stmt'=>''], +'maxdb_stmt_result_metadata' => ['resource', 'stmt'=>''], +'maxdb_stmt_send_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int', 'data'=>'string'], +'maxdb_stmt_sqlstate' => ['string', 'stmt'=>'resource'], +'maxdb_stmt_store_result' => ['bool', 'stmt'=>''], +'maxdb_store_result' => ['bool', 'link'=>''], +'maxdb_thread_id' => ['int', 'link'=>'resource'], +'maxdb_thread_safe' => ['bool'], +'maxdb_use_result' => ['resource', 'link'=>''], +'maxdb_warning_count' => ['int', 'link'=>'resource'], +'mb_check_encoding' => ['bool', 'value='=>'array|string|null', 'encoding='=>'string|null'], +'mb_chr' => ['string|false', 'codepoint'=>'int', 'encoding='=>'string|null'], +'mb_convert_case' => ['string', 'string'=>'string', 'mode'=>'int', 'encoding='=>'string|null'], +'mb_convert_encoding' => ['string|false', 'string'=>'string', 'to_encoding'=>'string', 'from_encoding='=>'array|string|null'], +'mb_convert_encoding\'1' => ['array', 'string'=>'array', 'to_encoding'=>'string', 'from_encoding='=>'array|string|null'], +'mb_convert_kana' => ['string', 'string'=>'string', 'mode='=>'string', 'encoding='=>'string|null'], +'mb_convert_variables' => ['string|false', 'to_encoding'=>'string', 'from_encoding'=>'array|string', '&rw_var'=>'string|array|object', '&...rw_vars='=>'string|array|object'], +'mb_decode_mimeheader' => ['string', 'string'=>'string'], +'mb_decode_numericentity' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string|null'], +'mb_detect_encoding' => ['string|false', 'string'=>'string', 'encodings='=>'array|string|null', 'strict='=>'bool'], +'mb_detect_order' => ['bool|list', 'encoding='=>'array|string|null'], +'mb_encode_mimeheader' => ['string', 'string'=>'string', 'charset='=>'string|null', 'transfer_encoding='=>'string|null', 'newline='=>'string', 'indent='=>'int'], +'mb_encode_numericentity' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string|null', 'hex='=>'bool'], +'mb_encoding_aliases' => ['list|false', 'encoding'=>'string'], +'mb_ereg' => ['bool', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], +'mb_ereg_match' => ['bool', 'pattern'=>'string', 'string'=>'string', 'options='=>'string|null'], +'mb_ereg_replace' => ['string|false|null', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string|null'], +'mb_ereg_replace_callback' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable', 'string'=>'string', 'options='=>'string|null'], +'mb_ereg_search' => ['bool', 'pattern='=>'string|null', 'options='=>'string|null'], +'mb_ereg_search_getpos' => ['int'], +'mb_ereg_search_getregs' => ['string[]|false'], +'mb_ereg_search_init' => ['bool', 'string'=>'string', 'pattern='=>'string|null', 'options='=>'string|null'], +'mb_ereg_search_pos' => ['int[]|false', 'pattern='=>'string|null', 'options='=>'string|null'], +'mb_ereg_search_regs' => ['string[]|false', 'pattern='=>'string|null', 'options='=>'string|null'], +'mb_ereg_search_setpos' => ['bool', 'offset'=>'int'], +'mb_eregi' => ['bool', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], +'mb_eregi_replace' => ['string|false|null', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string|null'], +'mb_get_info' => ['array|string|int|false', 'type='=>'string'], +'mb_http_input' => ['array|string|false', 'type='=>'string|null'], +'mb_http_output' => ['string|bool', 'encoding='=>'string|null'], +'mb_internal_encoding' => ['string|bool', 'encoding='=>'string|null'], +'mb_language' => ['string|bool', 'language='=>'string|null'], +'mb_list_encodings' => ['list'], +'mb_ord' => ['int|false', 'string'=>'string', 'encoding='=>'string|null'], +'mb_output_handler' => ['string', 'string'=>'string', 'status'=>'int'], +'mb_parse_str' => ['bool', 'string'=>'string', '&w_result'=>'array'], +'mb_preferred_mime_name' => ['string|false', 'encoding'=>'string'], +'mb_regex_encoding' => ['string|bool', 'encoding='=>'string|null'], +'mb_regex_set_options' => ['string', 'options='=>'string|null'], +'mb_scrub' => ['string', 'string'=>'string', 'encoding='=>'string|null'], +'mb_send_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array', 'additional_params='=>'string|null'], +'mb_split' => ['list|false', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'], +'mb_str_split' => ['list', 'string'=>'string', 'length='=>'positive-int', 'encoding='=>'string|null'], +'mb_strcut' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string|null'], +'mb_strimwidth' => ['string', 'string'=>'string', 'start'=>'int', 'width'=>'int', 'trim_marker='=>'string', 'encoding='=>'string|null'], +'mb_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], +'mb_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], +'mb_strlen' => ['0|positive-int', 'string'=>'string', 'encoding='=>'string|null'], +'mb_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], +'mb_strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], +'mb_strrichr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], +'mb_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], +'mb_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], +'mb_strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], +'mb_strtolower' => ['lowercase-string', 'string'=>'string', 'encoding='=>'string|null'], +'mb_strtoupper' => ['string', 'string'=>'string', 'encoding='=>'string|null'], +'mb_strwidth' => ['int', 'string'=>'string', 'encoding='=>'string|null'], +'mb_substitute_character' => ['bool|int|string', 'substitute_character='=>'int|string|null'], +'mb_substr' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string|null'], +'mb_substr_count' => ['int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string|null'], +'mcrypt_cbc' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], +'mcrypt_cfb' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], +'mcrypt_create_iv' => ['string|false', 'size'=>'int', 'source='=>'int'], +'mcrypt_decrypt' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'string', 'iv='=>'string'], +'mcrypt_ecb' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], +'mcrypt_enc_get_algorithms_name' => ['string', 'td'=>'resource'], +'mcrypt_enc_get_block_size' => ['int', 'td'=>'resource'], +'mcrypt_enc_get_iv_size' => ['int', 'td'=>'resource'], +'mcrypt_enc_get_key_size' => ['int', 'td'=>'resource'], +'mcrypt_enc_get_modes_name' => ['string', 'td'=>'resource'], +'mcrypt_enc_get_supported_key_sizes' => ['array', 'td'=>'resource'], +'mcrypt_enc_is_block_algorithm' => ['bool', 'td'=>'resource'], +'mcrypt_enc_is_block_algorithm_mode' => ['bool', 'td'=>'resource'], +'mcrypt_enc_is_block_mode' => ['bool', 'td'=>'resource'], +'mcrypt_enc_self_test' => ['int|false', 'td'=>'resource'], +'mcrypt_encrypt' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'string', 'iv='=>'string'], +'mcrypt_generic' => ['string', 'td'=>'resource', 'data'=>'string'], +'mcrypt_generic_deinit' => ['bool', 'td'=>'resource'], +'mcrypt_generic_end' => ['bool', 'td'=>'resource'], +'mcrypt_generic_init' => ['int|false', 'td'=>'resource', 'key'=>'string', 'iv'=>'string'], +'mcrypt_get_block_size' => ['int', 'cipher'=>'int|string', 'module'=>'string'], +'mcrypt_get_cipher_name' => ['string|false', 'cipher'=>'int|string'], +'mcrypt_get_iv_size' => ['int|false', 'cipher'=>'int|string', 'module'=>'string'], +'mcrypt_get_key_size' => ['int', 'cipher'=>'int|string', 'module'=>'string'], +'mcrypt_list_algorithms' => ['array', 'lib_dir='=>'string'], +'mcrypt_list_modes' => ['array', 'lib_dir='=>'string'], +'mcrypt_module_close' => ['bool', 'td'=>'resource'], +'mcrypt_module_get_algo_block_size' => ['int', 'algorithm'=>'string', 'lib_dir='=>'string'], +'mcrypt_module_get_algo_key_size' => ['int', 'algorithm'=>'string', 'lib_dir='=>'string'], +'mcrypt_module_get_supported_key_sizes' => ['array', 'algorithm'=>'string', 'lib_dir='=>'string'], +'mcrypt_module_is_block_algorithm' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'], +'mcrypt_module_is_block_algorithm_mode' => ['bool', 'mode'=>'string', 'lib_dir='=>'string'], +'mcrypt_module_is_block_mode' => ['bool', 'mode'=>'string', 'lib_dir='=>'string'], +'mcrypt_module_open' => ['resource|false', 'cipher'=>'string', 'cipher_directory'=>'string', 'mode'=>'string', 'mode_directory'=>'string'], +'mcrypt_module_self_test' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'], +'mcrypt_ofb' => ['string', 'cipher'=>'int|string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], +'md5' => ['string', 'string'=>'string', 'binary='=>'bool'], +'md5_file' => ['string|false', 'filename'=>'string', 'binary='=>'bool'], +'mdecrypt_generic' => ['string', 'td'=>'resource', 'data'=>'string'], +'Memcache::add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], +'Memcache::addServer' => ['bool', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable', 'timeoutms='=>'int'], +'Memcache::append' => [''], +'Memcache::cas' => [''], +'Memcache::close' => ['bool'], +'Memcache::connect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], +'Memcache::decrement' => ['int', 'key'=>'string', 'value='=>'int'], +'Memcache::delete' => ['bool', 'key'=>'string', 'timeout='=>'int'], +'Memcache::findServer' => [''], +'Memcache::flush' => ['bool'], +'Memcache::get' => ['string|array|false', 'key'=>'string', 'flags='=>'array', 'keys='=>'array'], +'Memcache::get\'1' => ['array', 'key'=>'string[]', 'flags='=>'int[]'], +'Memcache::getExtendedStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], +'Memcache::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'], +'Memcache::getStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], +'Memcache::getVersion' => ['string'], +'Memcache::increment' => ['int', 'key'=>'string', 'value='=>'int'], +'Memcache::pconnect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], +'Memcache::prepend' => ['string'], +'Memcache::replace' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], +'Memcache::set' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], +'Memcache::setCompressThreshold' => ['bool', 'threshold'=>'int', 'min_savings='=>'float'], +'Memcache::setFailureCallback' => [''], +'Memcache::setServerParams' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable'], +'memcache_add' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], +'memcache_add_server' => ['bool', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable', 'timeoutms='=>'int'], +'memcache_append' => ['', 'memcache_obj'=>'Memcache'], +'memcache_cas' => ['', 'memcache_obj'=>'Memcache'], +'memcache_close' => ['bool', 'memcache_obj'=>'Memcache'], +'memcache_connect' => ['Memcache|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], +'memcache_debug' => ['bool', 'on_off'=>'bool'], +'memcache_decrement' => ['int', 'memcache_obj'=>'Memcache', 'key'=>'string', 'value='=>'int'], +'memcache_delete' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'timeout='=>'int'], +'memcache_flush' => ['bool', 'memcache_obj'=>'Memcache'], +'memcache_get' => ['string', 'memcache_obj'=>'Memcache', 'key'=>'string', 'flags='=>'int'], +'memcache_get\'1' => ['array', 'memcache_obj'=>'Memcache', 'key'=>'string[]', 'flags='=>'int[]'], +'memcache_get_extended_stats' => ['array', 'memcache_obj'=>'Memcache', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], +'memcache_get_server_status' => ['int', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int'], +'memcache_get_stats' => ['array', 'memcache_obj'=>'Memcache', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], +'memcache_get_version' => ['string', 'memcache_obj'=>'Memcache'], +'memcache_increment' => ['int', 'memcache_obj'=>'Memcache', 'key'=>'string', 'value='=>'int'], +'memcache_pconnect' => ['Memcache|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], +'memcache_prepend' => ['string', 'memcache_obj'=>'Memcache'], +'memcache_replace' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], +'memcache_set' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], +'memcache_set_compress_threshold' => ['bool', 'memcache_obj'=>'Memcache', 'threshold'=>'int', 'min_savings='=>'float'], +'memcache_set_failure_callback' => ['', 'memcache_obj'=>'Memcache'], +'memcache_set_server_params' => ['bool', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable'], +'Memcached::__construct' => ['void', 'persistent_id='=>'mixed|string', 'on_new_object_cb='=>'mixed'], +'Memcached::add' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], +'Memcached::addByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], +'Memcached::addServer' => ['bool', 'host'=>'string', 'port'=>'int', 'weight='=>'int'], +'Memcached::addServers' => ['bool', 'servers'=>'array'], +'Memcached::append' => ['bool', 'key'=>'string', 'value'=>'string'], +'Memcached::appendByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'string'], +'Memcached::cas' => ['bool', 'cas_token'=>'float', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], +'Memcached::casByKey' => ['bool', 'cas_token'=>'float', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], +'Memcached::decrement' => ['int|false', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], +'Memcached::decrementByKey' => ['int|false', 'server_key'=>'string', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], +'Memcached::delete' => ['bool', 'key'=>'string', 'time='=>'int'], +'Memcached::deleteByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'time='=>'int'], +'Memcached::deleteMulti' => ['array', 'keys'=>'array', 'time='=>'int'], +'Memcached::deleteMultiByKey' => ['bool', 'server_key'=>'string', 'keys'=>'array', 'time='=>'int'], +'Memcached::fetch' => ['array|false'], +'Memcached::fetchAll' => ['array|false'], +'Memcached::flush' => ['bool', 'delay='=>'int'], +'Memcached::flushBuffers' => [''], +'Memcached::get' => ['mixed|false', 'key'=>'string', 'cache_cb='=>'?callable', 'flags='=>'int'], +'Memcached::getAllKeys' => ['array|false'], +'Memcached::getByKey' => ['mixed|false', 'server_key'=>'string', 'key'=>'string', 'value_cb='=>'?callable', 'flags='=>'int'], +'Memcached::getDelayed' => ['bool', 'keys'=>'array', 'with_cas='=>'bool', 'value_cb='=>'callable'], +'Memcached::getDelayedByKey' => ['bool', 'server_key'=>'string', 'keys'=>'array', 'with_cas='=>'bool', 'value_cb='=>'?callable'], +'Memcached::getLastDisconnectedServer' => [''], +'Memcached::getLastErrorCode' => [''], +'Memcached::getLastErrorErrno' => [''], +'Memcached::getLastErrorMessage' => [''], +'Memcached::getMulti' => ['array|false', 'keys'=>'array', 'flags='=>'int'], +'Memcached::getMultiByKey' => ['array|false', 'server_key'=>'string', 'keys'=>'array', 'flags='=>'int'], +'Memcached::getOption' => ['mixed|false', 'option'=>'int'], +'Memcached::getResultCode' => ['int'], +'Memcached::getResultMessage' => ['string'], +'Memcached::getServerByKey' => ['array', 'server_key'=>'string'], +'Memcached::getServerList' => ['array'], +'Memcached::getStats' => ['array', 'type='=>'?string'], +'Memcached::getVersion' => ['array'], +'Memcached::increment' => ['int|false', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], +'Memcached::incrementByKey' => ['int|false', 'server_key'=>'string', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], +'Memcached::isPersistent' => ['bool'], +'Memcached::isPristine' => ['bool'], +'Memcached::prepend' => ['bool', 'key'=>'string', 'value'=>'string'], +'Memcached::prependByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'string'], +'Memcached::quit' => ['bool'], +'Memcached::replace' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], +'Memcached::replaceByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], +'Memcached::resetServerList' => ['bool'], +'Memcached::set' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], +'Memcached::setBucket' => ['', 'host_map'=>'array', 'forward_map'=>'array', 'replicas'=>''], +'Memcached::setByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], +'Memcached::setEncodingKey' => ['', 'key'=>''], +'Memcached::setMulti' => ['bool', 'items'=>'array', 'expiration='=>'int'], +'Memcached::setMultiByKey' => ['bool', 'server_key'=>'string', 'items'=>'array', 'expiration='=>'int'], +'Memcached::setOption' => ['bool', 'option'=>'int', 'value'=>'mixed'], +'Memcached::setOptions' => ['bool', 'options'=>'array'], +'Memcached::setSaslAuthData' => ['void', 'username'=>'string', 'password'=>'string'], +'Memcached::touch' => ['bool', 'key'=>'string', 'expiration'=>'int'], +'Memcached::touchByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'expiration'=>'int'], +'MemcachePool::add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], +'MemcachePool::addServer' => ['bool', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'?callable', 'timeoutms='=>'int'], +'MemcachePool::append' => [''], +'MemcachePool::cas' => [''], +'MemcachePool::close' => ['bool'], +'MemcachePool::connect' => ['bool', 'host'=>'string', 'port'=>'int', 'timeout='=>'int'], +'MemcachePool::decrement' => ['int|false', 'key'=>'', 'value='=>'int|mixed'], +'MemcachePool::delete' => ['bool', 'key'=>'', 'timeout='=>'int|mixed'], +'MemcachePool::findServer' => [''], +'MemcachePool::flush' => ['bool'], +'MemcachePool::get' => ['array|string|false', 'key'=>'array|string', '&flags='=>'array|int'], +'MemcachePool::getExtendedStats' => ['array|false', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], +'MemcachePool::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'], +'MemcachePool::getStats' => ['array|false', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], +'MemcachePool::getVersion' => ['string|false'], +'MemcachePool::increment' => ['int|false', 'key'=>'', 'value='=>'int|mixed'], +'MemcachePool::prepend' => ['string'], +'MemcachePool::replace' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], +'MemcachePool::set' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], +'MemcachePool::setCompressThreshold' => ['bool', 'thresold'=>'int', 'min_saving='=>'float'], +'MemcachePool::setFailureCallback' => [''], +'MemcachePool::setServerParams' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'?callable'], +'memory_get_peak_usage' => ['int', 'real_usage='=>'bool'], +'memory_get_usage' => ['int', 'real_usage='=>'bool'], +'MessageFormatter::__construct' => ['void', 'locale'=>'string', 'pattern'=>'string'], +'MessageFormatter::create' => ['MessageFormatter', 'locale'=>'string', 'pattern'=>'string'], +'MessageFormatter::format' => ['false|string', 'args'=>'array'], +'MessageFormatter::formatMessage' => ['false|string', 'locale'=>'string', 'pattern'=>'string', 'args'=>'array'], +'MessageFormatter::getErrorCode' => ['int'], +'MessageFormatter::getErrorMessage' => ['string'], +'MessageFormatter::getLocale' => ['string'], +'MessageFormatter::getPattern' => ['string'], +'MessageFormatter::parse' => ['array|false', 'value'=>'string'], +'MessageFormatter::parseMessage' => ['array|false', 'locale'=>'string', 'pattern'=>'string', 'source'=>'string'], +'MessageFormatter::setPattern' => ['bool', 'pattern'=>'string'], +'metaphone' => ['string|false', 'string'=>'string', 'max_phonemes='=>'int'], +'method_exists' => ['bool', 'object_or_class'=>'object|class-string|interface-string', 'method'=>'string'], +'mhash' => ['string', 'algo'=>'int', 'data'=>'string', 'key='=>'string'], +'mhash_count' => ['int'], +'mhash_get_block_size' => ['int|false', 'algo'=>'int'], +'mhash_get_hash_name' => ['string|false', 'algo'=>'int'], +'mhash_keygen_s2k' => ['string|false', 'algo'=>'int', 'password'=>'string', 'salt'=>'string', 'length'=>'int'], +'microtime' => ['string', 'as_float='=>'false'], +'microtime\'1' => ['float', 'as_float='=>'true'], +'mime_content_type' => ['string|false', 'filename'=>'string|resource'], +'min' => ['mixed', 'value'=>'non-empty-array'], +'min\'1' => ['mixed', 'value'=>'', 'values'=>'', '...args='=>''], +'ming_keypress' => ['int', 'char'=>'string'], +'ming_setcubicthreshold' => ['void', 'threshold'=>'int'], +'ming_setscale' => ['void', 'scale'=>'float'], +'ming_setswfcompression' => ['void', 'level'=>'int'], +'ming_useconstants' => ['void', 'use'=>'int'], +'ming_useswfversion' => ['void', 'version'=>'int'], +'mkdir' => ['bool', 'directory'=>'string', 'permissions='=>'int', 'recursive='=>'bool', 'context='=>'resource'], +'mktime' => ['int|false', 'hour'=>'int', 'minute='=>'int|null', 'second='=>'int|null', 'month='=>'int|null', 'day='=>'int|null', 'year='=>'int|null'], +'money_format' => ['string', 'format'=>'string', 'value'=>'float'], +'Mongo::__construct' => ['void', 'server='=>'string', 'options='=>'array', 'driver_options='=>'array'], +'Mongo::__get' => ['MongoDB', 'dbname'=>'string'], +'Mongo::__toString' => ['string'], +'Mongo::close' => ['bool'], +'Mongo::connect' => ['bool'], +'Mongo::connectUtil' => ['bool'], +'Mongo::dropDB' => ['array', 'db'=>'mixed'], +'Mongo::forceError' => ['bool'], +'Mongo::getConnections' => ['array'], +'Mongo::getHosts' => ['array'], +'Mongo::getPoolSize' => ['int'], +'Mongo::getReadPreference' => ['array'], +'Mongo::getSlave' => ['?string'], +'Mongo::getSlaveOkay' => ['bool'], +'Mongo::getWriteConcern' => ['array'], +'Mongo::killCursor' => ['', 'server_hash'=>'string', 'id'=>'MongoInt64|int'], +'Mongo::lastError' => ['?array'], +'Mongo::listDBs' => ['array'], +'Mongo::pairConnect' => ['bool'], +'Mongo::pairPersistConnect' => ['bool', 'username='=>'string', 'password='=>'string'], +'Mongo::persistConnect' => ['bool', 'username='=>'string', 'password='=>'string'], +'Mongo::poolDebug' => ['array'], +'Mongo::prevError' => ['array'], +'Mongo::resetError' => ['array'], +'Mongo::selectCollection' => ['MongoCollection', 'db'=>'string', 'collection'=>'string'], +'Mongo::selectDB' => ['MongoDB', 'name'=>'string'], +'Mongo::setPoolSize' => ['bool', 'size'=>'int'], +'Mongo::setReadPreference' => ['bool', 'readPreference'=>'string', 'tags='=>'array'], +'Mongo::setSlaveOkay' => ['bool', 'ok='=>'bool'], +'Mongo::switchSlave' => ['string'], +'MongoBinData::__construct' => ['void', 'data'=>'string', 'type='=>'int'], +'MongoBinData::__toString' => ['string'], +'MongoClient::__construct' => ['void', 'server='=>'string', 'options='=>'array', 'driver_options='=>'array'], +'MongoClient::__get' => ['MongoDB', 'dbname'=>'string'], +'MongoClient::__toString' => ['string'], +'MongoClient::close' => ['bool', 'connection='=>'bool|string'], +'MongoClient::connect' => ['bool'], +'MongoClient::dropDB' => ['array', 'db'=>'mixed'], +'MongoClient::getConnections' => ['array'], +'MongoClient::getHosts' => ['array'], +'MongoClient::getReadPreference' => ['array'], +'MongoClient::getWriteConcern' => ['array'], +'MongoClient::killCursor' => ['bool', 'server_hash'=>'string', 'id'=>'int|MongoInt64'], +'MongoClient::listDBs' => ['array'], +'MongoClient::selectCollection' => ['MongoCollection', 'db'=>'string', 'collection'=>'string'], +'MongoClient::selectDB' => ['MongoDB', 'name'=>'string'], +'MongoClient::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], +'MongoClient::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], +'MongoClient::switchSlave' => ['string'], +'MongoCode::__construct' => ['void', 'code'=>'string', 'scope='=>'array'], +'MongoCode::__toString' => ['string'], +'MongoCollection::__construct' => ['void', 'db'=>'MongoDB', 'name'=>'string'], +'MongoCollection::__get' => ['MongoCollection', 'name'=>'string'], +'MongoCollection::__toString' => ['string'], +'MongoCollection::aggregate' => ['array', 'op'=>'array', 'op='=>'array', '...args='=>'array'], +'MongoCollection::aggregate\'1' => ['array', 'pipeline'=>'array', 'options='=>'array'], +'MongoCollection::aggregateCursor' => ['MongoCommandCursor', 'command'=>'array', 'options='=>'array'], +'MongoCollection::batchInsert' => ['array|bool', 'a'=>'array', 'options='=>'array'], +'MongoCollection::count' => ['int', 'query='=>'array', 'limit='=>'int', 'skip='=>'int'], +'MongoCollection::createDBRef' => ['array', 'a'=>'array'], +'MongoCollection::createIndex' => ['array', 'keys'=>'array', 'options='=>'array'], +'MongoCollection::deleteIndex' => ['array', 'keys'=>'string|array'], +'MongoCollection::deleteIndexes' => ['array'], +'MongoCollection::distinct' => ['array|false', 'key'=>'string', 'query='=>'array'], +'MongoCollection::drop' => ['array'], +'MongoCollection::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'], +'MongoCollection::find' => ['MongoCursor', 'query='=>'array', 'fields='=>'array'], +'MongoCollection::findAndModify' => ['array', 'query'=>'array', 'update='=>'array', 'fields='=>'array', 'options='=>'array'], +'MongoCollection::findOne' => ['?array', 'query='=>'array', 'fields='=>'array'], +'MongoCollection::getDBRef' => ['array', 'ref'=>'array'], +'MongoCollection::getIndexInfo' => ['array'], +'MongoCollection::getName' => ['string'], +'MongoCollection::getReadPreference' => ['array'], +'MongoCollection::getSlaveOkay' => ['bool'], +'MongoCollection::getWriteConcern' => ['array'], +'MongoCollection::group' => ['array', 'keys'=>'mixed', 'initial'=>'array', 'reduce'=>'MongoCode', 'options='=>'array'], +'MongoCollection::insert' => ['bool|array', 'a'=>'array|object', 'options='=>'array'], +'MongoCollection::parallelCollectionScan' => ['MongoCommandCursor[]', 'num_cursors'=>'int'], +'MongoCollection::remove' => ['bool|array', 'criteria='=>'array', 'options='=>'array'], +'MongoCollection::save' => ['bool|array', 'a'=>'array|object', 'options='=>'array'], +'MongoCollection::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], +'MongoCollection::setSlaveOkay' => ['bool', 'ok='=>'bool'], +'MongoCollection::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], +'MongoCollection::toIndexString' => ['string', 'keys'=>'mixed'], +'MongoCollection::update' => ['bool', 'criteria'=>'array', 'newobj'=>'array', 'options='=>'array'], +'MongoCollection::validate' => ['array', 'scan_data='=>'bool'], +'MongoCommandCursor::__construct' => ['void', 'connection'=>'MongoClient', 'ns'=>'string', 'command'=>'array'], +'MongoCommandCursor::batchSize' => ['MongoCommandCursor', 'batchSize'=>'int'], +'MongoCommandCursor::createFromDocument' => ['MongoCommandCursor', 'connection'=>'MongoClient', 'hash'=>'string', 'document'=>'array'], +'MongoCommandCursor::current' => ['array'], +'MongoCommandCursor::dead' => ['bool'], +'MongoCommandCursor::getReadPreference' => ['array'], +'MongoCommandCursor::info' => ['array'], +'MongoCommandCursor::key' => ['int'], +'MongoCommandCursor::next' => ['void'], +'MongoCommandCursor::rewind' => ['array'], +'MongoCommandCursor::setReadPreference' => ['MongoCommandCursor', 'read_preference'=>'string', 'tags='=>'array'], +'MongoCommandCursor::timeout' => ['MongoCommandCursor', 'ms'=>'int'], +'MongoCommandCursor::valid' => ['bool'], +'MongoCursor::__construct' => ['void', 'connection'=>'MongoClient', 'ns'=>'string', 'query='=>'array', 'fields='=>'array'], +'MongoCursor::addOption' => ['MongoCursor', 'key'=>'string', 'value'=>'mixed'], +'MongoCursor::awaitData' => ['MongoCursor', 'wait='=>'bool'], +'MongoCursor::batchSize' => ['MongoCursor', 'num'=>'int'], +'MongoCursor::count' => ['int', 'foundonly='=>'bool'], +'MongoCursor::current' => ['array'], +'MongoCursor::dead' => ['bool'], +'MongoCursor::doQuery' => ['void'], +'MongoCursor::explain' => ['array'], +'MongoCursor::fields' => ['MongoCursor', 'f'=>'array'], +'MongoCursor::getNext' => ['array'], +'MongoCursor::getReadPreference' => ['array'], +'MongoCursor::hasNext' => ['bool'], +'MongoCursor::hint' => ['MongoCursor', 'key_pattern'=>'string|array|object'], +'MongoCursor::immortal' => ['MongoCursor', 'liveforever='=>'bool'], +'MongoCursor::info' => ['array'], +'MongoCursor::key' => ['string'], +'MongoCursor::limit' => ['MongoCursor', 'num'=>'int'], +'MongoCursor::maxTimeMS' => ['MongoCursor', 'ms'=>'int'], +'MongoCursor::next' => ['array'], +'MongoCursor::partial' => ['MongoCursor', 'okay='=>'bool'], +'MongoCursor::reset' => ['void'], +'MongoCursor::rewind' => ['void'], +'MongoCursor::setFlag' => ['MongoCursor', 'flag'=>'int', 'set='=>'bool'], +'MongoCursor::setReadPreference' => ['MongoCursor', 'read_preference'=>'string', 'tags='=>'array'], +'MongoCursor::skip' => ['MongoCursor', 'num'=>'int'], +'MongoCursor::slaveOkay' => ['MongoCursor', 'okay='=>'bool'], +'MongoCursor::snapshot' => ['MongoCursor'], +'MongoCursor::sort' => ['MongoCursor', 'fields'=>'array'], +'MongoCursor::tailable' => ['MongoCursor', 'tail='=>'bool'], +'MongoCursor::timeout' => ['MongoCursor', 'ms'=>'int'], +'MongoCursor::valid' => ['bool'], +'MongoCursorException::__clone' => ['void'], +'MongoCursorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'MongoCursorException::__toString' => ['string'], +'MongoCursorException::__wakeup' => ['void'], +'MongoCursorException::getCode' => ['int'], +'MongoCursorException::getFile' => ['string'], +'MongoCursorException::getHost' => ['string'], +'MongoCursorException::getLine' => ['int'], +'MongoCursorException::getMessage' => ['string'], +'MongoCursorException::getPrevious' => ['Exception|Throwable'], +'MongoCursorException::getTrace' => ['list\',args?:array}>'], +'MongoCursorException::getTraceAsString' => ['string'], +'MongoCursorInterface::__construct' => ['void'], +'MongoCursorInterface::batchSize' => ['MongoCursorInterface', 'batchSize'=>'int'], +'MongoCursorInterface::current' => ['mixed'], +'MongoCursorInterface::dead' => ['bool'], +'MongoCursorInterface::getReadPreference' => ['array'], +'MongoCursorInterface::info' => ['array'], +'MongoCursorInterface::key' => ['int|string'], +'MongoCursorInterface::next' => ['void'], +'MongoCursorInterface::rewind' => ['void'], +'MongoCursorInterface::setReadPreference' => ['MongoCursorInterface', 'read_preference'=>'string', 'tags='=>'array'], +'MongoCursorInterface::timeout' => ['MongoCursorInterface', 'ms'=>'int'], +'MongoCursorInterface::valid' => ['bool'], +'MongoDate::__construct' => ['void', 'second='=>'int', 'usecond='=>'int'], +'MongoDate::__toString' => ['string'], +'MongoDate::toDateTime' => ['DateTime'], +'MongoDB::__construct' => ['void', 'conn'=>'MongoClient', 'name'=>'string'], +'MongoDB::__get' => ['MongoCollection', 'name'=>'string'], +'MongoDB::__toString' => ['string'], +'MongoDB::authenticate' => ['array', 'username'=>'string', 'password'=>'string'], +'MongoDB::command' => ['array', 'command'=>'array'], +'MongoDB::createCollection' => ['MongoCollection', 'name'=>'string', 'capped='=>'bool', 'size='=>'int', 'max='=>'int'], +'MongoDB::createDBRef' => ['array', 'collection'=>'string', 'a'=>'mixed'], +'MongoDB::drop' => ['array'], +'MongoDB::dropCollection' => ['array', 'coll'=>'MongoCollection|string'], +'MongoDB::execute' => ['array', 'code'=>'MongoCode|string', 'args='=>'array'], +'MongoDB::forceError' => ['bool'], +'MongoDB::getCollectionInfo' => ['array', 'options='=>'array'], +'MongoDB::getCollectionNames' => ['array', 'options='=>'array'], +'MongoDB::getDBRef' => ['array', 'ref'=>'array'], +'MongoDB::getGridFS' => ['MongoGridFS', 'prefix='=>'string'], +'MongoDB::getProfilingLevel' => ['int'], +'MongoDB::getReadPreference' => ['array'], +'MongoDB::getSlaveOkay' => ['bool'], +'MongoDB::getWriteConcern' => ['array'], +'MongoDB::lastError' => ['array'], +'MongoDB::listCollections' => ['array'], +'MongoDB::prevError' => ['array'], +'MongoDB::repair' => ['array', 'preserve_cloned_files='=>'bool', 'backup_original_files='=>'bool'], +'MongoDB::resetError' => ['array'], +'MongoDB::selectCollection' => ['MongoCollection', 'name'=>'string'], +'MongoDB::setProfilingLevel' => ['int', 'level'=>'int'], +'MongoDB::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], +'MongoDB::setSlaveOkay' => ['bool', 'ok='=>'bool'], +'MongoDB::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], +'MongoDB\BSON\Binary::__construct' => ['void', 'data'=>'string', 'type'=>'int'], +'MongoDB\BSON\Binary::__toString' => ['string'], +'MongoDB\BSON\Binary::getData' => ['string'], +'MongoDB\BSON\Binary::getType' => ['int'], +'MongoDB\BSON\binary::jsonSerialize' => ['mixed'], +'MongoDB\BSON\binary::serialize' => ['string'], +'MongoDB\BSON\binary::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\binaryinterface::__toString' => ['string'], +'MongoDB\BSON\binaryinterface::getData' => ['string'], +'MongoDB\BSON\binaryinterface::getType' => ['int'], +'MongoDB\BSON\dbpointer::__construct' => ['void'], +'MongoDB\BSON\dbpointer::__toString' => ['string'], +'MongoDB\BSON\dbpointer::jsonSerialize' => ['mixed'], +'MongoDB\BSON\dbpointer::serialize' => ['string'], +'MongoDB\BSON\dbpointer::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\Decimal128::__construct' => ['void', 'value='=>'string'], +'MongoDB\BSON\Decimal128::__toString' => ['string'], +'MongoDB\BSON\decimal128::jsonSerialize' => ['mixed'], +'MongoDB\BSON\decimal128::serialize' => ['string'], +'MongoDB\BSON\decimal128::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\decimal128interface::__toString' => ['string'], +'MongoDB\BSON\fromJSON' => ['string', 'json'=>'string'], +'MongoDB\BSON\fromPHP' => ['string', 'value'=>'array|object'], +'MongoDB\BSON\int64::__construct' => ['void'], +'MongoDB\BSON\int64::__toString' => ['string'], +'MongoDB\BSON\int64::jsonSerialize' => ['mixed'], +'MongoDB\BSON\int64::serialize' => ['string'], +'MongoDB\BSON\int64::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\Javascript::__construct' => ['void', 'code'=>'string', 'scope='=>'array|object'], +'MongoDB\BSON\javascript::__toString' => ['string'], +'MongoDB\BSON\javascript::getCode' => ['string'], +'MongoDB\BSON\javascript::getScope' => ['?object'], +'MongoDB\BSON\javascript::jsonSerialize' => ['mixed'], +'MongoDB\BSON\javascript::serialize' => ['string'], +'MongoDB\BSON\javascript::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\javascriptinterface::__toString' => ['string'], +'MongoDB\BSON\javascriptinterface::getCode' => ['string'], +'MongoDB\BSON\javascriptinterface::getScope' => ['?object'], +'MongoDB\BSON\maxkey::__construct' => ['void'], +'MongoDB\BSON\maxkey::jsonSerialize' => ['mixed'], +'MongoDB\BSON\maxkey::serialize' => ['string'], +'MongoDB\BSON\maxkey::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\minkey::__construct' => ['void'], +'MongoDB\BSON\minkey::jsonSerialize' => ['mixed'], +'MongoDB\BSON\minkey::serialize' => ['string'], +'MongoDB\BSON\minkey::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\ObjectId::__construct' => ['void', 'id='=>'string'], +'MongoDB\BSON\ObjectId::__toString' => ['string'], +'MongoDB\BSON\objectid::getTimestamp' => ['int'], +'MongoDB\BSON\objectid::jsonSerialize' => ['mixed'], +'MongoDB\BSON\objectid::serialize' => ['string'], +'MongoDB\BSON\objectid::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\objectidinterface::__toString' => ['string'], +'MongoDB\BSON\objectidinterface::getTimestamp' => ['int'], +'MongoDB\BSON\Regex::__construct' => ['void', 'pattern'=>'string', 'flags='=>'string'], +'MongoDB\BSON\Regex::__toString' => ['string'], +'MongoDB\BSON\Regex::getFlags' => ['string'], +'MongoDB\BSON\Regex::getPattern' => ['string'], +'MongoDB\BSON\regex::jsonSerialize' => ['mixed'], +'MongoDB\BSON\regex::serialize' => ['string'], +'MongoDB\BSON\regex::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\regexinterface::__toString' => ['string'], +'MongoDB\BSON\regexinterface::getFlags' => ['string'], +'MongoDB\BSON\regexinterface::getPattern' => ['string'], +'MongoDB\BSON\Serializable::bsonSerialize' => ['array|object'], +'MongoDB\BSON\symbol::__construct' => ['void'], +'MongoDB\BSON\symbol::__toString' => ['string'], +'MongoDB\BSON\symbol::jsonSerialize' => ['mixed'], +'MongoDB\BSON\symbol::serialize' => ['string'], +'MongoDB\BSON\symbol::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\Timestamp::__construct' => ['void', 'increment'=>'int', 'timestamp'=>'int'], +'MongoDB\BSON\Timestamp::__toString' => ['string'], +'MongoDB\BSON\timestamp::getIncrement' => ['int'], +'MongoDB\BSON\timestamp::getTimestamp' => ['int'], +'MongoDB\BSON\timestamp::jsonSerialize' => ['mixed'], +'MongoDB\BSON\timestamp::serialize' => ['string'], +'MongoDB\BSON\timestamp::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\timestampinterface::__toString' => ['string'], +'MongoDB\BSON\timestampinterface::getIncrement' => ['int'], +'MongoDB\BSON\timestampinterface::getTimestamp' => ['int'], +'MongoDB\BSON\toJSON' => ['string', 'bson'=>'string'], +'MongoDB\BSON\toPHP' => ['object', 'bson'=>'string', 'typeMap='=>'array'], +'MongoDB\BSON\undefined::__construct' => ['void'], +'MongoDB\BSON\undefined::__toString' => ['string'], +'MongoDB\BSON\undefined::jsonSerialize' => ['mixed'], +'MongoDB\BSON\undefined::serialize' => ['string'], +'MongoDB\BSON\undefined::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\Unserializable::bsonUnserialize' => ['void', 'data'=>'array'], +'MongoDB\BSON\UTCDateTime::__construct' => ['void', 'milliseconds='=>'int|DateTimeInterface'], +'MongoDB\BSON\UTCDateTime::__toString' => ['string'], +'MongoDB\BSON\utcdatetime::jsonSerialize' => ['mixed'], +'MongoDB\BSON\utcdatetime::serialize' => ['string'], +'MongoDB\BSON\UTCDateTime::toDateTime' => ['DateTime'], +'MongoDB\BSON\utcdatetime::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\BSON\utcdatetimeinterface::__toString' => ['string'], +'MongoDB\BSON\utcdatetimeinterface::toDateTime' => ['DateTime'], +'MongoDB\Driver\BulkWrite::__construct' => ['void', 'ordered='=>'bool'], +'MongoDB\Driver\BulkWrite::count' => ['int'], +'MongoDB\Driver\BulkWrite::delete' => ['void', 'filter'=>'array|object', 'deleteOptions='=>'array'], +'MongoDB\Driver\BulkWrite::insert' => ['void|MongoDB\BSON\ObjectId', 'document'=>'array|object'], +'MongoDB\Driver\BulkWrite::update' => ['void', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array'], +'MongoDB\Driver\Command::__construct' => ['void', 'document'=>'array|object'], +'MongoDB\Driver\Cursor::__construct' => ['void', 'server'=>'Server', 'responseDocument'=>'string'], +'MongoDB\Driver\Cursor::getId' => ['MongoDB\Driver\CursorId'], +'MongoDB\Driver\Cursor::getServer' => ['MongoDB\Driver\Server'], +'MongoDB\Driver\Cursor::isDead' => ['bool'], +'MongoDB\Driver\Cursor::setTypeMap' => ['void', 'typemap'=>'array'], +'MongoDB\Driver\Cursor::toArray' => ['array'], +'MongoDB\Driver\CursorId::__construct' => ['void', 'id'=>'string'], +'MongoDB\Driver\CursorId::__toString' => ['string'], +'MongoDB\Driver\CursorId::serialize' => ['string'], +'MongoDB\Driver\CursorId::unserialize' => ['void', 'serialized'=>'string'], +'mongodb\driver\exception\commandexception::getResultDocument' => ['object'], +'MongoDB\Driver\Exception\RuntimeException::__clone' => ['void'], +'MongoDB\Driver\Exception\RuntimeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?RuntimeException|?Throwable'], +'MongoDB\Driver\Exception\RuntimeException::__toString' => ['string'], +'MongoDB\Driver\Exception\RuntimeException::__wakeup' => ['void'], +'MongoDB\Driver\Exception\RuntimeException::getCode' => ['int'], +'MongoDB\Driver\Exception\RuntimeException::getFile' => ['string'], +'MongoDB\Driver\Exception\RuntimeException::getLine' => ['int'], +'MongoDB\Driver\Exception\RuntimeException::getMessage' => ['string'], +'MongoDB\Driver\Exception\RuntimeException::getPrevious' => ['RuntimeException|Throwable'], +'MongoDB\Driver\Exception\RuntimeException::getTrace' => ['list\',args?:array}>'], +'MongoDB\Driver\Exception\RuntimeException::getTraceAsString' => ['string'], +'mongodb\driver\exception\runtimeexception::hasErrorLabel' => ['bool', 'errorLabel'=>'string'], +'MongoDB\Driver\Exception\WriteException::__clone' => ['void'], +'MongoDB\Driver\Exception\WriteException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?RuntimeException|?Throwable'], +'MongoDB\Driver\Exception\WriteException::__toString' => ['string'], +'MongoDB\Driver\Exception\WriteException::__wakeup' => ['void'], +'MongoDB\Driver\Exception\WriteException::getCode' => ['int'], +'MongoDB\Driver\Exception\WriteException::getFile' => ['string'], +'MongoDB\Driver\Exception\WriteException::getLine' => ['int'], +'MongoDB\Driver\Exception\WriteException::getMessage' => ['string'], +'MongoDB\Driver\Exception\WriteException::getPrevious' => ['RuntimeException|Throwable'], +'MongoDB\Driver\Exception\WriteException::getTrace' => ['list\',args?:array}>'], +'MongoDB\Driver\Exception\WriteException::getTraceAsString' => ['string'], +'MongoDB\Driver\Exception\WriteException::getWriteResult' => ['MongoDB\Driver\WriteResult'], +'MongoDB\Driver\Manager::__construct' => ['void', 'uri'=>'string', 'options='=>'array', 'driverOptions='=>'array'], +'MongoDB\Driver\Manager::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'bulk'=>'MongoDB\Driver\BulkWrite', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], +'MongoDB\Driver\Manager::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'readPreference='=>'MongoDB\Driver\ReadPreference'], +'MongoDB\Driver\Manager::executeDelete' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'deleteOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], +'MongoDB\Driver\Manager::executeInsert' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'document'=>'array|object', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], +'MongoDB\Driver\Manager::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'query'=>'MongoDB\Driver\Query', 'readPreference='=>'MongoDB\Driver\ReadPreference'], +'mongodb\driver\manager::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], +'mongodb\driver\manager::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], +'MongoDB\Driver\Manager::executeUpdate' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], +'mongodb\driver\manager::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], +'MongoDB\Driver\Manager::getReadConcern' => ['MongoDB\Driver\ReadConcern'], +'MongoDB\Driver\Manager::getReadPreference' => ['MongoDB\Driver\ReadPreference'], +'MongoDB\Driver\Manager::getServers' => ['MongoDB\Driver\Server[]'], +'MongoDB\Driver\Manager::getWriteConcern' => ['MongoDB\Driver\WriteConcern'], +'MongoDB\Driver\Manager::selectServer' => ['MongoDB\Driver\Server', 'readPreference'=>'MongoDB\Driver\ReadPreference'], +'mongodb\driver\manager::startSession' => ['MongoDB\Driver\Session', 'options='=>'array'], +'mongodb\driver\monitoring\commandfailedevent::getCommandName' => ['string'], +'mongodb\driver\monitoring\commandfailedevent::getDurationMicros' => ['int'], +'mongodb\driver\monitoring\commandfailedevent::getError' => ['Exception'], +'mongodb\driver\monitoring\commandfailedevent::getOperationId' => ['string'], +'mongodb\driver\monitoring\commandfailedevent::getReply' => ['object'], +'mongodb\driver\monitoring\commandfailedevent::getRequestId' => ['string'], +'mongodb\driver\monitoring\commandfailedevent::getServer' => ['MongoDB\Driver\Server'], +'mongodb\driver\monitoring\commandstartedevent::getCommand' => ['object'], +'mongodb\driver\monitoring\commandstartedevent::getCommandName' => ['string'], +'mongodb\driver\monitoring\commandstartedevent::getDatabaseName' => ['string'], +'mongodb\driver\monitoring\commandstartedevent::getOperationId' => ['string'], +'mongodb\driver\monitoring\commandstartedevent::getRequestId' => ['string'], +'mongodb\driver\monitoring\commandstartedevent::getServer' => ['MongoDB\Driver\Server'], +'mongodb\driver\monitoring\commandsubscriber::commandFailed' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandFailedEvent'], +'mongodb\driver\monitoring\commandsubscriber::commandStarted' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandStartedEvent'], +'mongodb\driver\monitoring\commandsubscriber::commandSucceeded' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandSucceededEvent'], +'mongodb\driver\monitoring\commandsucceededevent::getCommandName' => ['string'], +'mongodb\driver\monitoring\commandsucceededevent::getDurationMicros' => ['int'], +'mongodb\driver\monitoring\commandsucceededevent::getOperationId' => ['string'], +'mongodb\driver\monitoring\commandsucceededevent::getReply' => ['object'], +'mongodb\driver\monitoring\commandsucceededevent::getRequestId' => ['string'], +'mongodb\driver\monitoring\commandsucceededevent::getServer' => ['MongoDB\Driver\Server'], +'MongoDB\Driver\Query::__construct' => ['void', 'filter'=>'array|object', 'queryOptions='=>'array'], +'MongoDB\Driver\ReadConcern::__construct' => ['void', 'level='=>'string'], +'MongoDB\Driver\ReadConcern::bsonSerialize' => ['object'], +'MongoDB\Driver\ReadConcern::getLevel' => ['?string'], +'MongoDB\Driver\ReadConcern::isDefault' => ['bool'], +'MongoDB\Driver\ReadConcern::serialize' => ['string'], +'MongoDB\Driver\ReadConcern::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\Driver\ReadPreference::__construct' => ['void', 'mode'=>'string|int', 'tagSets='=>'array', 'options='=>'array'], +'MongoDB\Driver\ReadPreference::bsonSerialize' => ['object'], +'MongoDB\Driver\ReadPreference::getHedge' => ['object|null'], +'MongoDB\Driver\ReadPreference::getMaxStalenessSeconds' => ['int'], +'MongoDB\Driver\ReadPreference::getMode' => ['int'], +'MongoDB\Driver\ReadPreference::getModeString' => ['string'], +'MongoDB\Driver\ReadPreference::getTagSets' => ['array'], +'MongoDB\Driver\ReadPreference::serialize' => ['string'], +'MongoDB\Driver\ReadPreference::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\Driver\Server::__construct' => ['void', 'host'=>'string', 'port'=>'string', 'options='=>'array', 'driverOptions='=>'array'], +'MongoDB\Driver\Server::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'zwrite'=>'BulkWrite'], +'MongoDB\Driver\Server::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command'], +'MongoDB\Driver\Server::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'zquery'=>'Query'], +'mongodb\driver\server::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], +'mongodb\driver\server::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], +'mongodb\driver\server::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], +'MongoDB\Driver\Server::getHost' => ['string'], +'MongoDB\Driver\Server::getInfo' => ['array'], +'MongoDB\Driver\Server::getLatency' => ['int'], +'MongoDB\Driver\Server::getPort' => ['int'], +'MongoDB\Driver\Server::getState' => [''], +'MongoDB\Driver\Server::getTags' => ['array'], +'MongoDB\Driver\Server::getType' => ['int'], +'MongoDB\Driver\Server::isArbiter' => ['bool'], +'MongoDB\Driver\Server::isDelayed' => [''], +'MongoDB\Driver\Server::isHidden' => ['bool'], +'MongoDB\Driver\Server::isPassive' => ['bool'], +'MongoDB\Driver\Server::isPrimary' => ['bool'], +'MongoDB\Driver\Server::isSecondary' => ['bool'], +'mongodb\driver\session::__construct' => ['void'], +'mongodb\driver\session::abortTransaction' => ['void'], +'mongodb\driver\session::advanceClusterTime' => ['void', 'clusterTime'=>'array|object'], +'mongodb\driver\session::advanceOperationTime' => ['void', 'operationTime'=>'MongoDB\BSON\TimestampInterface'], +'mongodb\driver\session::commitTransaction' => ['void'], +'mongodb\driver\session::endSession' => ['void'], +'mongodb\driver\session::getClusterTime' => ['?object'], +'mongodb\driver\session::getLogicalSessionId' => ['object'], +'mongodb\driver\session::getOperationTime' => ['MongoDB\BSON\Timestamp|null'], +'mongodb\driver\session::getTransactionOptions' => ['array|null'], +'mongodb\driver\session::getTransactionState' => ['string'], +'mongodb\driver\session::startTransaction' => ['void', 'options'=>'array|object'], +'MongoDB\Driver\WriteConcern::__construct' => ['void', 'wstring'=>'string|int', 'wtimeout='=>'int', 'journal='=>'bool'], +'MongoDB\Driver\WriteConcern::bsonSerialize' => ['object'], +'MongoDB\Driver\WriteConcern::getJournal' => ['?bool'], +'MongoDB\Driver\WriteConcern::getJurnal' => ['?bool'], +'MongoDB\Driver\WriteConcern::getW' => ['int|null|string'], +'MongoDB\Driver\WriteConcern::getWtimeout' => ['int'], +'MongoDB\Driver\WriteConcern::isDefault' => ['bool'], +'MongoDB\Driver\WriteConcern::serialize' => ['string'], +'MongoDB\Driver\WriteConcern::unserialize' => ['void', 'serialized'=>'string'], +'MongoDB\Driver\WriteConcernError::getCode' => ['int'], +'MongoDB\Driver\WriteConcernError::getInfo' => ['mixed'], +'MongoDB\Driver\WriteConcernError::getMessage' => ['string'], +'MongoDB\Driver\WriteError::getCode' => ['int'], +'MongoDB\Driver\WriteError::getIndex' => ['int'], +'MongoDB\Driver\WriteError::getInfo' => ['mixed'], +'MongoDB\Driver\WriteError::getMessage' => ['string'], +'MongoDB\Driver\WriteException::getWriteResult' => [''], +'MongoDB\Driver\WriteResult::getDeletedCount' => ['?int'], +'MongoDB\Driver\WriteResult::getInfo' => [''], +'MongoDB\Driver\WriteResult::getInsertedCount' => ['?int'], +'MongoDB\Driver\WriteResult::getMatchedCount' => ['?int'], +'MongoDB\Driver\WriteResult::getModifiedCount' => ['?int'], +'MongoDB\Driver\WriteResult::getServer' => ['MongoDB\Driver\Server'], +'MongoDB\Driver\WriteResult::getUpsertedCount' => ['?int'], +'MongoDB\Driver\WriteResult::getUpsertedIds' => ['array'], +'MongoDB\Driver\WriteResult::getWriteConcernError' => ['MongoDB\Driver\WriteConcernError|null'], +'MongoDB\Driver\WriteResult::getWriteErrors' => ['MongoDB\Driver\WriteError[]'], +'MongoDB\Driver\WriteResult::isAcknowledged' => ['bool'], +'MongoDBRef::create' => ['array', 'collection'=>'string', 'id'=>'mixed', 'database='=>'string'], +'MongoDBRef::get' => ['?array', 'db'=>'MongoDB', 'ref'=>'array'], +'MongoDBRef::isRef' => ['bool', 'ref'=>'mixed'], +'MongoDeleteBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], +'MongoException::__clone' => ['void'], +'MongoException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'MongoException::__toString' => ['string'], +'MongoException::__wakeup' => ['void'], +'MongoException::getCode' => ['int'], +'MongoException::getFile' => ['string'], +'MongoException::getLine' => ['int'], +'MongoException::getMessage' => ['string'], +'MongoException::getPrevious' => ['Exception|Throwable'], +'MongoException::getTrace' => ['list\',args?:array}>'], +'MongoException::getTraceAsString' => ['string'], +'MongoGridFS::__construct' => ['void', 'db'=>'MongoDB', 'prefix='=>'string', 'chunks='=>'mixed'], +'MongoGridFS::__get' => ['MongoCollection', 'name'=>'string'], +'MongoGridFS::__toString' => ['string'], +'MongoGridFS::aggregate' => ['array', 'pipeline'=>'array', 'op'=>'array', 'pipelineOperators'=>'array'], +'MongoGridFS::aggregateCursor' => ['MongoCommandCursor', 'pipeline'=>'array', 'options'=>'array'], +'MongoGridFS::batchInsert' => ['mixed', 'a'=>'array', 'options='=>'array'], +'MongoGridFS::count' => ['int', 'query='=>'stdClass|array'], +'MongoGridFS::createDBRef' => ['array', 'a'=>'array'], +'MongoGridFS::createIndex' => ['array', 'keys'=>'array', 'options='=>'array'], +'MongoGridFS::delete' => ['bool', 'id'=>'mixed'], +'MongoGridFS::deleteIndex' => ['array', 'keys'=>'array|string'], +'MongoGridFS::deleteIndexes' => ['array'], +'MongoGridFS::distinct' => ['array|bool', 'key'=>'string', 'query='=>'?array'], +'MongoGridFS::drop' => ['array'], +'MongoGridFS::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'], +'MongoGridFS::find' => ['MongoGridFSCursor', 'query='=>'array', 'fields='=>'array'], +'MongoGridFS::findAndModify' => ['array', 'query'=>'array', 'update='=>'?array', 'fields='=>'?array', 'options='=>'?array'], +'MongoGridFS::findOne' => ['?MongoGridFSFile', 'query='=>'mixed', 'fields='=>'mixed'], +'MongoGridFS::get' => ['?MongoGridFSFile', 'id'=>'mixed'], +'MongoGridFS::getDBRef' => ['array', 'ref'=>'array'], +'MongoGridFS::getIndexInfo' => ['array'], +'MongoGridFS::getName' => ['string'], +'MongoGridFS::getReadPreference' => ['array'], +'MongoGridFS::getSlaveOkay' => ['bool'], +'MongoGridFS::group' => ['array', 'keys'=>'mixed', 'initial'=>'array', 'reduce'=>'MongoCode', 'condition='=>'array'], +'MongoGridFS::insert' => ['array|bool', 'a'=>'array|object', 'options='=>'array'], +'MongoGridFS::put' => ['mixed', 'filename'=>'string', 'extra='=>'array'], +'MongoGridFS::remove' => ['bool', 'criteria='=>'array', 'options='=>'array'], +'MongoGridFS::save' => ['array|bool', 'a'=>'array|object', 'options='=>'array'], +'MongoGridFS::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags'=>'array'], +'MongoGridFS::setSlaveOkay' => ['bool', 'ok='=>'bool'], +'MongoGridFS::storeBytes' => ['mixed', 'bytes'=>'string', 'extra='=>'array', 'options='=>'array'], +'MongoGridFS::storeFile' => ['mixed', 'filename'=>'string', 'extra='=>'array', 'options='=>'array'], +'MongoGridFS::storeUpload' => ['mixed', 'name'=>'string', 'filename='=>'string'], +'MongoGridFS::toIndexString' => ['string', 'keys'=>'mixed'], +'MongoGridFS::update' => ['bool', 'criteria'=>'array', 'newobj'=>'array', 'options='=>'array'], +'MongoGridFS::validate' => ['array', 'scan_data='=>'bool'], +'MongoGridFSCursor::__construct' => ['void', 'gridfs'=>'MongoGridFS', 'connection'=>'resource', 'ns'=>'string', 'query'=>'array', 'fields'=>'array'], +'MongoGridFSCursor::addOption' => ['MongoCursor', 'key'=>'string', 'value'=>'mixed'], +'MongoGridFSCursor::awaitData' => ['MongoCursor', 'wait='=>'bool'], +'MongoGridFSCursor::batchSize' => ['MongoCursor', 'batchSize'=>'int'], +'MongoGridFSCursor::count' => ['int', 'all='=>'bool'], +'MongoGridFSCursor::current' => ['MongoGridFSFile'], +'MongoGridFSCursor::dead' => ['bool'], +'MongoGridFSCursor::doQuery' => ['void'], +'MongoGridFSCursor::explain' => ['array'], +'MongoGridFSCursor::fields' => ['MongoCursor', 'f'=>'array'], +'MongoGridFSCursor::getNext' => ['MongoGridFSFile'], +'MongoGridFSCursor::getReadPreference' => ['array'], +'MongoGridFSCursor::hasNext' => ['bool'], +'MongoGridFSCursor::hint' => ['MongoCursor', 'key_pattern'=>'mixed'], +'MongoGridFSCursor::immortal' => ['MongoCursor', 'liveForever='=>'bool'], +'MongoGridFSCursor::info' => ['array'], +'MongoGridFSCursor::key' => ['string'], +'MongoGridFSCursor::limit' => ['MongoCursor', 'num'=>'int'], +'MongoGridFSCursor::maxTimeMS' => ['MongoCursor', 'ms'=>'int'], +'MongoGridFSCursor::next' => ['void'], +'MongoGridFSCursor::partial' => ['MongoCursor', 'okay='=>'bool'], +'MongoGridFSCursor::reset' => ['void'], +'MongoGridFSCursor::rewind' => ['void'], +'MongoGridFSCursor::setFlag' => ['MongoCursor', 'flag'=>'int', 'set='=>'bool'], +'MongoGridFSCursor::setReadPreference' => ['MongoCursor', 'read_preference'=>'string', 'tags'=>'array'], +'MongoGridFSCursor::skip' => ['MongoCursor', 'num'=>'int'], +'MongoGridFSCursor::slaveOkay' => ['MongoCursor', 'okay='=>'bool'], +'MongoGridFSCursor::snapshot' => ['MongoCursor'], +'MongoGridFSCursor::sort' => ['MongoCursor', 'fields'=>'array'], +'MongoGridFSCursor::tailable' => ['MongoCursor', 'tail='=>'bool'], +'MongoGridFSCursor::timeout' => ['MongoCursor', 'ms'=>'int'], +'MongoGridFSCursor::valid' => ['bool'], +'MongoGridfsFile::__construct' => ['void', 'gridfs'=>'MongoGridFS', 'file'=>'array'], +'MongoGridFSFile::getBytes' => ['string'], +'MongoGridFSFile::getFilename' => ['string'], +'MongoGridFSFile::getResource' => ['resource'], +'MongoGridFSFile::getSize' => ['int'], +'MongoGridFSFile::write' => ['int', 'filename='=>'string'], +'MongoId::__construct' => ['void', 'id='=>'string|MongoId'], +'MongoId::__set_state' => ['MongoId', 'props'=>'array'], +'MongoId::__toString' => ['string'], +'MongoId::getHostname' => ['string'], +'MongoId::getInc' => ['int'], +'MongoId::getPID' => ['int'], +'MongoId::getTimestamp' => ['int'], +'MongoId::isValid' => ['bool', 'value'=>'mixed'], +'MongoInsertBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], +'MongoInt32::__construct' => ['void', 'value'=>'string'], +'MongoInt32::__toString' => ['string'], +'MongoInt64::__construct' => ['void', 'value'=>'string'], +'MongoInt64::__toString' => ['string'], +'MongoLog::getCallback' => ['callable'], +'MongoLog::getLevel' => ['int'], +'MongoLog::getModule' => ['int'], +'MongoLog::setCallback' => ['void', 'log_function'=>'callable'], +'MongoLog::setLevel' => ['void', 'level'=>'int'], +'MongoLog::setModule' => ['void', 'module'=>'int'], +'MongoPool::getSize' => ['int'], +'MongoPool::info' => ['array'], +'MongoPool::setSize' => ['bool', 'size'=>'int'], +'MongoRegex::__construct' => ['void', 'regex'=>'string'], +'MongoRegex::__toString' => ['string'], +'MongoResultException::__clone' => ['void'], +'MongoResultException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'MongoResultException::__toString' => ['string'], +'MongoResultException::__wakeup' => ['void'], +'MongoResultException::getCode' => ['int'], +'MongoResultException::getDocument' => ['array'], +'MongoResultException::getFile' => ['string'], +'MongoResultException::getLine' => ['int'], +'MongoResultException::getMessage' => ['string'], +'MongoResultException::getPrevious' => ['Exception|Throwable'], +'MongoResultException::getTrace' => ['list\',args?:array}>'], +'MongoResultException::getTraceAsString' => ['string'], +'MongoTimestamp::__construct' => ['void', 'second='=>'int', 'inc='=>'int'], +'MongoTimestamp::__toString' => ['string'], +'MongoUpdateBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], +'MongoUpdateBatch::add' => ['bool', 'item'=>'array'], +'MongoUpdateBatch::execute' => ['array', 'write_options'=>'array'], +'MongoWriteBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'batch_type'=>'string', 'write_options'=>'array'], +'MongoWriteBatch::add' => ['bool', 'item'=>'array'], +'MongoWriteBatch::execute' => ['array', 'write_options'=>'array'], +'MongoWriteConcernException::__clone' => ['void'], +'MongoWriteConcernException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'MongoWriteConcernException::__toString' => ['string'], +'MongoWriteConcernException::__wakeup' => ['void'], +'MongoWriteConcernException::getCode' => ['int'], +'MongoWriteConcernException::getDocument' => ['array'], +'MongoWriteConcernException::getFile' => ['string'], +'MongoWriteConcernException::getLine' => ['int'], +'MongoWriteConcernException::getMessage' => ['string'], +'MongoWriteConcernException::getPrevious' => ['Exception|Throwable'], +'MongoWriteConcernException::getTrace' => ['list\',args?:array}>'], +'MongoWriteConcernException::getTraceAsString' => ['string'], +'monitor_custom_event' => ['void', 'class'=>'string', 'text'=>'string', 'severe='=>'int', 'user_data='=>'mixed'], +'monitor_httperror_event' => ['void', 'error_code'=>'int', 'url'=>'string', 'severe='=>'int'], +'monitor_license_info' => ['array'], +'monitor_pass_error' => ['void', 'errno'=>'int', 'errstr'=>'string', 'errfile'=>'string', 'errline'=>'int'], +'monitor_set_aggregation_hint' => ['void', 'hint'=>'string'], +'move_uploaded_file' => ['bool', 'from'=>'string', 'to'=>'string'], +'mqseries_back' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_begin' => ['void', 'hconn'=>'resource', 'beginoptions'=>'array', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_close' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'options'=>'int', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_cmit' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_conn' => ['void', 'qmanagername'=>'string', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_connx' => ['void', 'qmanagername'=>'string', 'connoptions'=>'array', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_disc' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_get' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'md'=>'array', 'gmo'=>'array', 'bufferlength'=>'int', 'msg'=>'string', 'data_length'=>'int', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_inq' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'selectorcount'=>'int', 'selectors'=>'array', 'intattrcount'=>'int', 'intattr'=>'resource', 'charattrlength'=>'int', 'charattr'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_open' => ['void', 'hconn'=>'resource', 'objdesc'=>'array', 'option'=>'int', 'hobj'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_put' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'md'=>'array', 'pmo'=>'array', 'message'=>'string', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_put1' => ['void', 'hconn'=>'resource', 'objdesc'=>'resource', 'msgdesc'=>'resource', 'pmo'=>'resource', 'buffer'=>'string', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_set' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'selectorcount'=>'int', 'selectors'=>'array', 'intattrcount'=>'int', 'intattrs'=>'array', 'charattrlength'=>'int', 'charattrs'=>'array', 'compcode'=>'resource', 'reason'=>'resource'], +'mqseries_strerror' => ['string', 'reason'=>'int'], +'ms_GetErrorObj' => ['errorObj'], +'ms_GetVersion' => ['string'], +'ms_GetVersionInt' => ['int'], +'ms_iogetStdoutBufferBytes' => ['int'], +'ms_iogetstdoutbufferstring' => ['void'], +'ms_ioinstallstdinfrombuffer' => ['void'], +'ms_ioinstallstdouttobuffer' => ['void'], +'ms_ioresethandlers' => ['void'], +'ms_iostripstdoutbuffercontentheaders' => ['void'], +'ms_iostripstdoutbuffercontenttype' => ['string'], +'ms_ResetErrorList' => ['void'], +'ms_TokenizeMap' => ['array', 'map_file_name'=>'string'], +'msession_connect' => ['bool', 'host'=>'string', 'port'=>'string'], +'msession_count' => ['int'], +'msession_create' => ['bool', 'session'=>'string', 'classname='=>'string', 'data='=>'string'], +'msession_destroy' => ['bool', 'name'=>'string'], +'msession_disconnect' => ['void'], +'msession_find' => ['array', 'name'=>'string', 'value'=>'string'], +'msession_get' => ['string', 'session'=>'string', 'name'=>'string', 'value'=>'string'], +'msession_get_array' => ['array', 'session'=>'string'], +'msession_get_data' => ['string', 'session'=>'string'], +'msession_inc' => ['string', 'session'=>'string', 'name'=>'string'], +'msession_list' => ['array'], +'msession_listvar' => ['array', 'name'=>'string'], +'msession_lock' => ['int', 'name'=>'string'], +'msession_plugin' => ['string', 'session'=>'string', 'value'=>'string', 'param='=>'string'], +'msession_randstr' => ['string', 'param'=>'int'], +'msession_set' => ['bool', 'session'=>'string', 'name'=>'string', 'value'=>'string'], +'msession_set_array' => ['void', 'session'=>'string', 'tuples'=>'array'], +'msession_set_data' => ['bool', 'session'=>'string', 'value'=>'string'], +'msession_timeout' => ['int', 'session'=>'string', 'param='=>'int'], +'msession_uniq' => ['string', 'param'=>'int', 'classname='=>'string', 'data='=>'string'], +'msession_unlock' => ['int', 'session'=>'string', 'key'=>'int'], +'msg_get_queue' => ['resource', 'key'=>'int', 'permissions='=>'int'], +'msg_queue_exists' => ['bool', 'key'=>'int'], +'msg_receive' => ['bool', 'queue'=>'resource', 'desired_message_type'=>'int', '&w_received_message_type'=>'int', 'max_message_size'=>'int', '&w_message'=>'mixed', 'unserialize='=>'bool', 'flags='=>'int', '&w_error_code='=>'int'], +'msg_remove_queue' => ['bool', 'queue'=>'resource'], +'msg_send' => ['bool', 'queue'=>'resource', 'message_type'=>'int', 'message'=>'mixed', 'serialize='=>'bool', 'blocking='=>'bool', '&w_error_code='=>'int'], +'msg_set_queue' => ['bool', 'queue'=>'resource', 'data'=>'array'], +'msg_stat_queue' => ['array', 'queue'=>'resource'], +'msgfmt_create' => ['?MessageFormatter', 'locale'=>'string', 'pattern'=>'string'], +'msgfmt_format' => ['string|false', 'formatter'=>'MessageFormatter', 'values'=>'array'], +'msgfmt_format_message' => ['string|false', 'locale'=>'string', 'pattern'=>'string', 'values'=>'array'], +'msgfmt_get_error_code' => ['int', 'formatter'=>'MessageFormatter'], +'msgfmt_get_error_message' => ['string', 'formatter'=>'MessageFormatter'], +'msgfmt_get_locale' => ['string', 'formatter'=>'MessageFormatter'], +'msgfmt_get_pattern' => ['string', 'formatter'=>'MessageFormatter'], +'msgfmt_parse' => ['array|false', 'formatter'=>'MessageFormatter', 'string'=>'string'], +'msgfmt_parse_message' => ['array|false', 'locale'=>'string', 'pattern'=>'string', 'message'=>'string'], +'msgfmt_set_pattern' => ['bool', 'formatter'=>'MessageFormatter', 'pattern'=>'string'], +'msql_affected_rows' => ['int', 'result'=>'resource'], +'msql_close' => ['bool', 'link_identifier='=>'?resource'], +'msql_connect' => ['resource', 'hostname='=>'string'], +'msql_create_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], +'msql_data_seek' => ['bool', 'result'=>'resource', 'row_number'=>'int'], +'msql_db_query' => ['resource', 'database'=>'string', 'query'=>'string', 'link_identifier='=>'?resource'], +'msql_drop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], +'msql_error' => ['string'], +'msql_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], +'msql_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], +'msql_fetch_object' => ['object', 'result'=>'resource'], +'msql_fetch_row' => ['array', 'result'=>'resource'], +'msql_field_flags' => ['string', 'result'=>'resource', 'field_offset'=>'int'], +'msql_field_len' => ['int', 'result'=>'resource', 'field_offset'=>'int'], +'msql_field_name' => ['string', 'result'=>'resource', 'field_offset'=>'int'], +'msql_field_seek' => ['bool', 'result'=>'resource', 'field_offset'=>'int'], +'msql_field_table' => ['int', 'result'=>'resource', 'field_offset'=>'int'], +'msql_field_type' => ['string', 'result'=>'resource', 'field_offset'=>'int'], +'msql_free_result' => ['bool', 'result'=>'resource'], +'msql_list_dbs' => ['resource', 'link_identifier='=>'?resource'], +'msql_list_fields' => ['resource', 'database'=>'string', 'tablename'=>'string', 'link_identifier='=>'?resource'], +'msql_list_tables' => ['resource', 'database'=>'string', 'link_identifier='=>'?resource'], +'msql_num_fields' => ['int', 'result'=>'resource'], +'msql_num_rows' => ['int', 'query_identifier'=>'resource'], +'msql_pconnect' => ['resource', 'hostname='=>'string'], +'msql_query' => ['resource', 'query'=>'string', 'link_identifier='=>'?resource'], +'msql_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field='=>'mixed'], +'msql_select_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], +'mt_getrandmax' => ['int'], +'mt_rand' => ['int', 'min'=>'int', 'max'=>'int'], +'mt_rand\'1' => ['int'], +'mt_srand' => ['void', 'seed='=>'int', 'mode='=>'int'], +'MultipleIterator::__construct' => ['void', 'flags='=>'int'], +'MultipleIterator::attachIterator' => ['void', 'iterator'=>'Iterator', 'infos='=>'string'], +'MultipleIterator::containsIterator' => ['bool', 'iterator'=>'Iterator'], +'MultipleIterator::countIterators' => ['int'], +'MultipleIterator::current' => ['array|false'], +'MultipleIterator::detachIterator' => ['void', 'iterator'=>'Iterator'], +'MultipleIterator::getFlags' => ['int'], +'MultipleIterator::key' => ['array'], +'MultipleIterator::next' => ['void'], +'MultipleIterator::rewind' => ['void'], +'MultipleIterator::setFlags' => ['int', 'flags'=>'int'], +'MultipleIterator::valid' => ['bool'], +'Mutex::create' => ['long', 'lock='=>'bool'], +'Mutex::destroy' => ['bool', 'mutex'=>'long'], +'Mutex::lock' => ['bool', 'mutex'=>'long'], +'Mutex::trylock' => ['bool', 'mutex'=>'long'], +'Mutex::unlock' => ['bool', 'mutex'=>'long', 'destroy='=>'bool'], +'mysql_xdevapi\baseresult::getWarnings' => ['array'], +'mysql_xdevapi\baseresult::getWarningsCount' => ['integer'], +'mysql_xdevapi\collection::add' => ['mysql_xdevapi\CollectionAdd', 'document'=>'mixed'], +'mysql_xdevapi\collection::addOrReplaceOne' => ['mysql_xdevapi\Result', 'id'=>'string', 'doc'=>'string'], +'mysql_xdevapi\collection::count' => ['integer'], +'mysql_xdevapi\collection::createIndex' => ['void', 'index_name'=>'string', 'index_desc_json'=>'string'], +'mysql_xdevapi\collection::dropIndex' => ['bool', 'index_name'=>'string'], +'mysql_xdevapi\collection::existsInDatabase' => ['bool'], +'mysql_xdevapi\collection::find' => ['mysql_xdevapi\CollectionFind', 'search_condition='=>'string'], +'mysql_xdevapi\collection::getName' => ['string'], +'mysql_xdevapi\collection::getOne' => ['Document', 'id'=>'string'], +'mysql_xdevapi\collection::getSchema' => ['mysql_xdevapi\schema'], +'mysql_xdevapi\collection::getSession' => ['Session'], +'mysql_xdevapi\collection::modify' => ['mysql_xdevapi\CollectionModify', 'search_condition'=>'string'], +'mysql_xdevapi\collection::remove' => ['mysql_xdevapi\CollectionRemove', 'search_condition'=>'string'], +'mysql_xdevapi\collection::removeOne' => ['mysql_xdevapi\Result', 'id'=>'string'], +'mysql_xdevapi\collection::replaceOne' => ['mysql_xdevapi\Result', 'id'=>'string', 'doc'=>'string'], +'mysql_xdevapi\collectionadd::execute' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\collectionfind::bind' => ['mysql_xdevapi\CollectionFind', 'placeholder_values'=>'array'], +'mysql_xdevapi\collectionfind::execute' => ['mysql_xdevapi\DocResult'], +'mysql_xdevapi\collectionfind::fields' => ['mysql_xdevapi\CollectionFind', 'projection'=>'string'], +'mysql_xdevapi\collectionfind::groupBy' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], +'mysql_xdevapi\collectionfind::having' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], +'mysql_xdevapi\collectionfind::limit' => ['mysql_xdevapi\CollectionFind', 'rows'=>'integer'], +'mysql_xdevapi\collectionfind::lockExclusive' => ['mysql_xdevapi\CollectionFind', 'lock_waiting_option='=>'integer'], +'mysql_xdevapi\collectionfind::lockShared' => ['mysql_xdevapi\CollectionFind', 'lock_waiting_option='=>'integer'], +'mysql_xdevapi\collectionfind::offset' => ['mysql_xdevapi\CollectionFind', 'position'=>'integer'], +'mysql_xdevapi\collectionfind::sort' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], +'mysql_xdevapi\collectionmodify::arrayAppend' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], +'mysql_xdevapi\collectionmodify::arrayInsert' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], +'mysql_xdevapi\collectionmodify::bind' => ['mysql_xdevapi\CollectionModify', 'placeholder_values'=>'array'], +'mysql_xdevapi\collectionmodify::execute' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\collectionmodify::limit' => ['mysql_xdevapi\CollectionModify', 'rows'=>'integer'], +'mysql_xdevapi\collectionmodify::patch' => ['mysql_xdevapi\CollectionModify', 'document'=>'string'], +'mysql_xdevapi\collectionmodify::replace' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], +'mysql_xdevapi\collectionmodify::set' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], +'mysql_xdevapi\collectionmodify::skip' => ['mysql_xdevapi\CollectionModify', 'position'=>'integer'], +'mysql_xdevapi\collectionmodify::sort' => ['mysql_xdevapi\CollectionModify', 'sort_expr'=>'string'], +'mysql_xdevapi\collectionmodify::unset' => ['mysql_xdevapi\CollectionModify', 'fields'=>'array'], +'mysql_xdevapi\collectionremove::bind' => ['mysql_xdevapi\CollectionRemove', 'placeholder_values'=>'array'], +'mysql_xdevapi\collectionremove::execute' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\collectionremove::limit' => ['mysql_xdevapi\CollectionRemove', 'rows'=>'integer'], +'mysql_xdevapi\collectionremove::sort' => ['mysql_xdevapi\CollectionRemove', 'sort_expr'=>'string'], +'mysql_xdevapi\columnresult::getCharacterSetName' => ['string'], +'mysql_xdevapi\columnresult::getCollationName' => ['string'], +'mysql_xdevapi\columnresult::getColumnLabel' => ['string'], +'mysql_xdevapi\columnresult::getColumnName' => ['string'], +'mysql_xdevapi\columnresult::getFractionalDigits' => ['integer'], +'mysql_xdevapi\columnresult::getLength' => ['integer'], +'mysql_xdevapi\columnresult::getSchemaName' => ['string'], +'mysql_xdevapi\columnresult::getTableLabel' => ['string'], +'mysql_xdevapi\columnresult::getTableName' => ['string'], +'mysql_xdevapi\columnresult::getType' => ['integer'], +'mysql_xdevapi\columnresult::isNumberSigned' => ['integer'], +'mysql_xdevapi\columnresult::isPadded' => ['integer'], +'mysql_xdevapi\crudoperationbindable::bind' => ['mysql_xdevapi\CrudOperationBindable', 'placeholder_values'=>'array'], +'mysql_xdevapi\crudoperationlimitable::limit' => ['mysql_xdevapi\CrudOperationLimitable', 'rows'=>'integer'], +'mysql_xdevapi\crudoperationskippable::skip' => ['mysql_xdevapi\CrudOperationSkippable', 'skip'=>'integer'], +'mysql_xdevapi\crudoperationsortable::sort' => ['mysql_xdevapi\CrudOperationSortable', 'sort_expr'=>'string'], +'mysql_xdevapi\databaseobject::existsInDatabase' => ['bool'], +'mysql_xdevapi\databaseobject::getName' => ['string'], +'mysql_xdevapi\databaseobject::getSession' => ['mysql_xdevapi\Session'], +'mysql_xdevapi\docresult::fetchAll' => ['Array'], +'mysql_xdevapi\docresult::fetchOne' => ['Object'], +'mysql_xdevapi\docresult::getWarnings' => ['Array'], +'mysql_xdevapi\docresult::getWarningsCount' => ['integer'], +'mysql_xdevapi\executable::execute' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\getsession' => ['mysql_xdevapi\Session', 'uri'=>'string'], +'mysql_xdevapi\result::getAutoIncrementValue' => ['int'], +'mysql_xdevapi\result::getGeneratedIds' => ['ArrayOfInt'], +'mysql_xdevapi\result::getWarnings' => ['array'], +'mysql_xdevapi\result::getWarningsCount' => ['integer'], +'mysql_xdevapi\rowresult::fetchAll' => ['array'], +'mysql_xdevapi\rowresult::fetchOne' => ['object'], +'mysql_xdevapi\rowresult::getColumnCount' => ['integer'], +'mysql_xdevapi\rowresult::getColumnNames' => ['array'], +'mysql_xdevapi\rowresult::getColumns' => ['array'], +'mysql_xdevapi\rowresult::getWarnings' => ['array'], +'mysql_xdevapi\rowresult::getWarningsCount' => ['integer'], +'mysql_xdevapi\schema::createCollection' => ['mysql_xdevapi\Collection', 'name'=>'string'], +'mysql_xdevapi\schema::dropCollection' => ['bool', 'collection_name'=>'string'], +'mysql_xdevapi\schema::existsInDatabase' => ['bool'], +'mysql_xdevapi\schema::getCollection' => ['mysql_xdevapi\Collection', 'name'=>'string'], +'mysql_xdevapi\schema::getCollectionAsTable' => ['mysql_xdevapi\Table', 'name'=>'string'], +'mysql_xdevapi\schema::getCollections' => ['array'], +'mysql_xdevapi\schema::getName' => ['string'], +'mysql_xdevapi\schema::getSession' => ['mysql_xdevapi\Session'], +'mysql_xdevapi\schema::getTable' => ['mysql_xdevapi\Table', 'name'=>'string'], +'mysql_xdevapi\schema::getTables' => ['array'], +'mysql_xdevapi\schemaobject::getSchema' => ['mysql_xdevapi\Schema'], +'mysql_xdevapi\session::close' => ['bool'], +'mysql_xdevapi\session::commit' => ['Object'], +'mysql_xdevapi\session::createSchema' => ['mysql_xdevapi\Schema', 'schema_name'=>'string'], +'mysql_xdevapi\session::dropSchema' => ['bool', 'schema_name'=>'string'], +'mysql_xdevapi\session::executeSql' => ['Object', 'statement'=>'string'], +'mysql_xdevapi\session::generateUUID' => ['string'], +'mysql_xdevapi\session::getClientId' => ['integer'], +'mysql_xdevapi\session::getSchema' => ['mysql_xdevapi\Schema', 'schema_name'=>'string'], +'mysql_xdevapi\session::getSchemas' => ['array'], +'mysql_xdevapi\session::getServerVersion' => ['integer'], +'mysql_xdevapi\session::killClient' => ['object', 'client_id'=>'integer'], +'mysql_xdevapi\session::listClients' => ['array'], +'mysql_xdevapi\session::quoteName' => ['string', 'name'=>'string'], +'mysql_xdevapi\session::releaseSavepoint' => ['void', 'name'=>'string'], +'mysql_xdevapi\session::rollback' => ['void'], +'mysql_xdevapi\session::rollbackTo' => ['void', 'name'=>'string'], +'mysql_xdevapi\session::setSavepoint' => ['string', 'name='=>'string'], +'mysql_xdevapi\session::sql' => ['mysql_xdevapi\SqlStatement', 'query'=>'string'], +'mysql_xdevapi\session::startTransaction' => ['void'], +'mysql_xdevapi\sqlstatement::bind' => ['mysql_xdevapi\SqlStatement', 'param'=>'string'], +'mysql_xdevapi\sqlstatement::execute' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\sqlstatement::getNextResult' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\sqlstatement::getResult' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\sqlstatement::hasMoreResults' => ['bool'], +'mysql_xdevapi\sqlstatementresult::fetchAll' => ['array'], +'mysql_xdevapi\sqlstatementresult::fetchOne' => ['object'], +'mysql_xdevapi\sqlstatementresult::getAffectedItemsCount' => ['integer'], +'mysql_xdevapi\sqlstatementresult::getColumnCount' => ['integer'], +'mysql_xdevapi\sqlstatementresult::getColumnNames' => ['array'], +'mysql_xdevapi\sqlstatementresult::getColumns' => ['Array'], +'mysql_xdevapi\sqlstatementresult::getGeneratedIds' => ['array'], +'mysql_xdevapi\sqlstatementresult::getLastInsertId' => ['String'], +'mysql_xdevapi\sqlstatementresult::getWarnings' => ['array'], +'mysql_xdevapi\sqlstatementresult::getWarningsCount' => ['integer'], +'mysql_xdevapi\sqlstatementresult::hasData' => ['bool'], +'mysql_xdevapi\sqlstatementresult::nextResult' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\statement::getNextResult' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\statement::getResult' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\statement::hasMoreResults' => ['bool'], +'mysql_xdevapi\table::count' => ['integer'], +'mysql_xdevapi\table::delete' => ['mysql_xdevapi\TableDelete'], +'mysql_xdevapi\table::existsInDatabase' => ['bool'], +'mysql_xdevapi\table::getName' => ['string'], +'mysql_xdevapi\table::getSchema' => ['mysql_xdevapi\Schema'], +'mysql_xdevapi\table::getSession' => ['mysql_xdevapi\Session'], +'mysql_xdevapi\table::insert' => ['mysql_xdevapi\TableInsert', 'columns'=>'mixed', '...args='=>'mixed'], +'mysql_xdevapi\table::isView' => ['bool'], +'mysql_xdevapi\table::select' => ['mysql_xdevapi\TableSelect', 'columns'=>'mixed', '...args='=>'mixed'], +'mysql_xdevapi\table::update' => ['mysql_xdevapi\TableUpdate'], +'mysql_xdevapi\tabledelete::bind' => ['mysql_xdevapi\TableDelete', 'placeholder_values'=>'array'], +'mysql_xdevapi\tabledelete::execute' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\tabledelete::limit' => ['mysql_xdevapi\TableDelete', 'rows'=>'integer'], +'mysql_xdevapi\tabledelete::offset' => ['mysql_xdevapi\TableDelete', 'position'=>'integer'], +'mysql_xdevapi\tabledelete::orderby' => ['mysql_xdevapi\TableDelete', 'orderby_expr'=>'string'], +'mysql_xdevapi\tabledelete::where' => ['mysql_xdevapi\TableDelete', 'where_expr'=>'string'], +'mysql_xdevapi\tableinsert::execute' => ['mysql_xdevapi\Result'], +'mysql_xdevapi\tableinsert::values' => ['mysql_xdevapi\TableInsert', 'row_values'=>'array'], +'mysql_xdevapi\tableselect::bind' => ['mysql_xdevapi\TableSelect', 'placeholder_values'=>'array'], +'mysql_xdevapi\tableselect::execute' => ['mysql_xdevapi\RowResult'], +'mysql_xdevapi\tableselect::groupBy' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'mixed'], +'mysql_xdevapi\tableselect::having' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'string'], +'mysql_xdevapi\tableselect::limit' => ['mysql_xdevapi\TableSelect', 'rows'=>'integer'], +'mysql_xdevapi\tableselect::lockExclusive' => ['mysql_xdevapi\TableSelect', 'lock_waiting_option='=>'integer'], +'mysql_xdevapi\tableselect::lockShared' => ['mysql_xdevapi\TableSelect', 'lock_waiting_option='=>'integer'], +'mysql_xdevapi\tableselect::offset' => ['mysql_xdevapi\TableSelect', 'position'=>'integer'], +'mysql_xdevapi\tableselect::orderby' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'mixed', '...args='=>'mixed'], +'mysql_xdevapi\tableselect::where' => ['mysql_xdevapi\TableSelect', 'where_expr'=>'string'], +'mysql_xdevapi\tableupdate::bind' => ['mysql_xdevapi\TableUpdate', 'placeholder_values'=>'array'], +'mysql_xdevapi\tableupdate::execute' => ['mysql_xdevapi\TableUpdate'], +'mysql_xdevapi\tableupdate::limit' => ['mysql_xdevapi\TableUpdate', 'rows'=>'integer'], +'mysql_xdevapi\tableupdate::orderby' => ['mysql_xdevapi\TableUpdate', 'orderby_expr'=>'mixed', '...args='=>'mixed'], +'mysql_xdevapi\tableupdate::set' => ['mysql_xdevapi\TableUpdate', 'table_field'=>'string', 'expression_or_literal'=>'string'], +'mysql_xdevapi\tableupdate::where' => ['mysql_xdevapi\TableUpdate', 'where_expr'=>'string'], +'mysqli::__construct' => ['void', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], +'mysqli::autocommit' => ['bool', 'enable'=>'bool'], +'mysqli::begin_transaction' => ['bool', 'flags='=>'int', 'name='=>'?string'], +'mysqli::change_user' => ['bool', 'username'=>'string', 'password'=>'string', 'database'=>'?string'], +'mysqli::character_set_name' => ['string'], +'mysqli::close' => ['bool'], +'mysqli::commit' => ['bool', 'flags='=>'int', 'name='=>'?string'], +'mysqli::connect' => ['bool', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], +'mysqli::debug' => ['bool', 'options'=>'string'], +'mysqli::disable_reads_from_master' => ['bool'], +'mysqli::dump_debug_info' => ['bool'], +'mysqli::escape_string' => ['string', 'string'=>'string'], +'mysqli::get_charset' => ['object'], +'mysqli::get_client_info' => ['string'], +'mysqli::get_connection_stats' => ['array'], +'mysqli::get_warnings' => ['mysqli_warning'], +'mysqli::init' => ['false|null'], +'mysqli::kill' => ['bool', 'process_id'=>'int'], +'mysqli::more_results' => ['bool'], +'mysqli::multi_query' => ['bool', 'query'=>'string'], +'mysqli::next_result' => ['bool'], +'mysqli::options' => ['bool', 'option'=>'int', 'value'=>'string|int'], +'mysqli::ping' => ['bool'], +'mysqli::poll' => ['int|false', '&w_read'=>'array', '&w_write'=>'array', '&w_error'=>'array', 'seconds'=>'int', 'microseconds='=>'int'], +'mysqli::prepare' => ['mysqli_stmt|false', 'query'=>'string'], +'mysqli::query' => ['bool|mysqli_result', 'query'=>'string', 'result_mode='=>'int'], +'mysqli::real_connect' => ['bool', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null', 'flags='=>'int'], +'mysqli::real_escape_string' => ['string', 'string'=>'string'], +'mysqli::real_query' => ['bool', 'query'=>'string'], +'mysqli::reap_async_query' => ['mysqli_result|false'], +'mysqli::refresh' => ['bool', 'flags'=>'int'], +'mysqli::release_savepoint' => ['bool', 'name'=>'string'], +'mysqli::rollback' => ['bool', 'flags='=>'int', 'name='=>'?string'], +'mysqli::rpl_query_type' => ['int', 'query'=>'string'], +'mysqli::savepoint' => ['bool', 'name'=>'string'], +'mysqli::select_db' => ['bool', 'database'=>'string'], +'mysqli::send_query' => ['bool', 'query'=>'string'], +'mysqli::set_charset' => ['bool', 'charset'=>'string'], +'mysqli::set_local_infile_default' => ['void'], +'mysqli::set_local_infile_handler' => ['bool', 'read_func='=>'callable'], +'mysqli::set_opt' => ['bool', 'option'=>'int', 'value'=>'string|int'], +'mysqli::ssl_set' => ['bool', 'key'=>'?string', 'certificate'=>'?string', 'ca_certificate'=>'?string', 'ca_path'=>'?string', 'cipher_algos'=>'?string'], +'mysqli::stat' => ['string|false'], +'mysqli::stmt_init' => ['mysqli_stmt'], +'mysqli::store_result' => ['mysqli_result|false', 'mode='=>'int'], +'mysqli::thread_safe' => ['bool'], +'mysqli::use_result' => ['mysqli_result|false'], +'mysqli_affected_rows' => ['int', 'mysql'=>'mysqli'], +'mysqli_autocommit' => ['bool', 'mysql'=>'mysqli', 'enable'=>'bool'], +'mysqli_begin_transaction' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], +'mysqli_change_user' => ['bool', 'mysql'=>'mysqli', 'username'=>'string', 'password'=>'string', 'database'=>'?string'], +'mysqli_character_set_name' => ['string', 'mysql'=>'mysqli'], +'mysqli_close' => ['bool', 'mysql'=>'mysqli'], +'mysqli_commit' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], +'mysqli_connect' => ['mysqli|false', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], +'mysqli_connect_errno' => ['int'], +'mysqli_connect_error' => ['?string'], +'mysqli_data_seek' => ['bool', 'result'=>'mysqli_result', 'offset'=>'int'], +'mysqli_debug' => ['bool', 'options'=>'string'], +'mysqli_disable_reads_from_master' => ['bool', 'link'=>'mysqli'], +'mysqli_disable_rpl_parse' => ['bool', 'link'=>'mysqli'], +'mysqli_driver::embedded_server_end' => ['void'], +'mysqli_driver::embedded_server_start' => ['bool', 'start'=>'int', 'arguments'=>'array', 'groups'=>'array'], +'mysqli_dump_debug_info' => ['bool', 'mysql'=>'mysqli'], +'mysqli_embedded_server_end' => ['void'], +'mysqli_embedded_server_start' => ['bool', 'start'=>'int', 'arguments'=>'array', 'groups'=>'array'], +'mysqli_enable_reads_from_master' => ['bool', 'link'=>'mysqli'], +'mysqli_enable_rpl_parse' => ['bool', 'link'=>'mysqli'], +'mysqli_errno' => ['int', 'mysql'=>'mysqli'], +'mysqli_error' => ['string', 'mysql'=>'mysqli'], +'mysqli_error_list' => ['array', 'mysql'=>'mysqli'], +'mysqli_escape_string' => ['string', 'mysql'=>'mysqli', 'string'=>'string'], +'mysqli_execute' => ['bool', 'statement'=>'mysqli_stmt', 'params='=>'list|null'], +'mysqli_fetch_all' => ['list>', 'result'=>'mysqli_result', 'mode='=>'3'], +'mysqli_fetch_all\'1' => ['list>', 'result'=>'mysqli_result', 'mode='=>'1'], +'mysqli_fetch_all\'2' => ['list>', 'result'=>'mysqli_result', 'mode='=>'2'], +'mysqli_fetch_array' => ['array|false|null', 'result'=>'mysqli_result', 'mode='=>'3'], +'mysqli_fetch_array\'1' => ['array|false|null', 'result'=>'mysqli_result', 'mode='=>'1'], +'mysqli_fetch_array\'2' => ['list|false|null', 'result'=>'mysqli_result', 'mode='=>'2'], +'mysqli_fetch_assoc' => ['array|false|null', 'result'=>'mysqli_result'], +'mysqli_fetch_column' => ['null|int|float|string|false', 'result'=>'mysqli_result', 'column='=>'int'], +'mysqli_fetch_field' => ['object|false', 'result'=>'mysqli_result'], +'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_row' => ['list|false|null', 'result'=>'mysqli_result'], +'mysqli_field_count' => ['int', 'mysql'=>'mysqli'], +'mysqli_field_seek' => ['bool', 'result'=>'mysqli_result', 'index'=>'int'], +'mysqli_field_tell' => ['int', 'result'=>'mysqli_result'], +'mysqli_free_result' => ['void', 'result'=>'mysqli_result'], +'mysqli_get_cache_stats' => ['array|false'], +'mysqli_get_charset' => ['?object', 'mysql'=>'mysqli'], +'mysqli_get_client_info' => ['string', 'mysql='=>'?mysqli'], +'mysqli_get_client_stats' => ['array'], +'mysqli_get_client_version' => ['int', 'link'=>'mysqli'], +'mysqli_get_connection_stats' => ['array', 'mysql'=>'mysqli'], +'mysqli_get_host_info' => ['string', 'mysql'=>'mysqli'], +'mysqli_get_links_stats' => ['array'], +'mysqli_get_proto_info' => ['int', 'mysql'=>'mysqli'], +'mysqli_get_server_info' => ['string', 'mysql'=>'mysqli'], +'mysqli_get_server_version' => ['int', 'mysql'=>'mysqli'], +'mysqli_get_warnings' => ['mysqli_warning', 'mysql'=>'mysqli'], +'mysqli_info' => ['?string', 'mysql'=>'mysqli'], +'mysqli_init' => ['mysqli|false'], +'mysqli_insert_id' => ['int|string', 'mysql'=>'mysqli'], +'mysqli_kill' => ['bool', 'mysql'=>'mysqli', 'process_id'=>'int'], +'mysqli_link_construct' => ['object'], +'mysqli_master_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], +'mysqli_more_results' => ['bool', 'mysql'=>'mysqli'], +'mysqli_multi_query' => ['bool', 'mysql'=>'mysqli', 'query'=>'string'], +'mysqli_next_result' => ['bool', 'mysql'=>'mysqli'], +'mysqli_num_fields' => ['int', 'result'=>'mysqli_result'], +'mysqli_num_rows' => ['int', 'result'=>'mysqli_result'], +'mysqli_options' => ['bool', 'mysql'=>'mysqli', 'option'=>'int', 'value'=>'string|int'], +'mysqli_ping' => ['bool', 'mysql'=>'mysqli'], +'mysqli_poll' => ['int|false', 'read'=>'array', 'write'=>'array', 'error'=>'array', 'seconds'=>'int', 'microseconds='=>'int'], +'mysqli_prepare' => ['mysqli_stmt|false', 'mysql'=>'mysqli', 'query'=>'string'], +'mysqli_query' => ['mysqli_result|bool', 'mysql'=>'mysqli', 'query'=>'string', 'result_mode='=>'int'], +'mysqli_real_connect' => ['bool', 'mysql='=>'mysqli', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null', 'flags='=>'int'], +'mysqli_real_escape_string' => ['string', 'mysql'=>'mysqli', 'string'=>'string'], +'mysqli_real_query' => ['bool', 'mysql'=>'mysqli', 'query'=>'string'], +'mysqli_reap_async_query' => ['mysqli_result|false', 'mysql'=>'mysqli'], +'mysqli_refresh' => ['bool', 'mysql'=>'mysqli', 'flags'=>'int'], +'mysqli_release_savepoint' => ['bool', 'mysql'=>'mysqli', 'name'=>'string'], +'mysqli_report' => ['bool', 'flags'=>'int'], +'mysqli_result::__construct' => ['void', 'mysql'=>'mysqli', 'result_mode='=>'int'], +'mysqli_result::close' => ['void'], +'mysqli_result::data_seek' => ['bool', 'offset'=>'int'], +'mysqli_result::fetch_all' => ['list>', 'mode='=>'3'], +'mysqli_result::fetch_all\'1' => ['list>', 'mode='=>'1'], +'mysqli_result::fetch_all\'2' => ['list>', 'mode='=>'2'], +'mysqli_result::fetch_array' => ['array|false|null', 'mode='=>'3'], +'mysqli_result::fetch_array\'1' => ['array|false|null', 'mode='=>'1'], +'mysqli_result::fetch_array\'2' => ['list|false|null', 'mode='=>'2'], +'mysqli_result::fetch_assoc' => ['array|false|null'], +'mysqli_result::fetch_column' => ['null|int|float|string|false', 'column='=>'int'], +'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_row' => ['list|false|null'], +'mysqli_result::field_seek' => ['bool', 'index'=>'int'], +'mysqli_result::free' => ['void'], +'mysqli_result::free_result' => ['void'], +'mysqli_rollback' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], +'mysqli_rpl_parse_enabled' => ['int', 'link'=>'mysqli'], +'mysqli_rpl_probe' => ['bool', 'link'=>'mysqli'], +'mysqli_rpl_query_type' => ['int', 'link'=>'mysqli', 'query'=>'string'], +'mysqli_savepoint' => ['bool', 'mysql'=>'mysqli', 'name'=>'string'], +'mysqli_savepoint_libmysql' => ['bool'], +'mysqli_select_db' => ['bool', 'mysql'=>'mysqli', 'database'=>'string'], +'mysqli_send_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], +'mysqli_set_charset' => ['bool', 'mysql'=>'mysqli', 'charset'=>'string'], +'mysqli_set_local_infile_default' => ['void', 'link'=>'mysqli'], +'mysqli_set_local_infile_handler' => ['bool', 'link'=>'mysqli', 'read_func'=>'callable'], +'mysqli_set_opt' => ['bool', 'mysql'=>'mysqli', 'option'=>'int', 'value'=>'string|int'], +'mysqli_slave_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], +'mysqli_sqlstate' => ['string', 'mysql'=>'mysqli'], +'mysqli_ssl_set' => ['bool', 'mysql'=>'mysqli', 'key'=>'?string', 'certificate'=>'?string', 'ca_certificate'=>'?string', 'ca_path'=>'?string', 'cipher_algos'=>'?string'], +'mysqli_stat' => ['string|false', 'mysql'=>'mysqli'], +'mysqli_stmt::__construct' => ['void', 'mysql'=>'mysqli', 'query'=>'string'], +'mysqli_stmt::attr_get' => ['int', 'attribute'=>'int'], +'mysqli_stmt::attr_set' => ['bool', 'attribute'=>'int', 'value'=>'int'], +'mysqli_stmt::bind_param' => ['bool', 'types'=>'string', '&vars'=>'mixed', '&...args='=>'mixed'], +'mysqli_stmt::bind_result' => ['bool', '&w_var1'=>'', '&...w_vars='=>''], +'mysqli_stmt::close' => ['bool'], +'mysqli_stmt::data_seek' => ['void', 'offset'=>'int'], +'mysqli_stmt::execute' => ['bool', 'params='=>'list|null'], +'mysqli_stmt::fetch' => ['bool|null'], +'mysqli_stmt::free_result' => ['void'], +'mysqli_stmt::get_result' => ['mysqli_result|false'], +'mysqli_stmt::get_warnings' => ['object'], +'mysqli_stmt::more_results' => ['bool'], +'mysqli_stmt::next_result' => ['bool'], +'mysqli_stmt::num_rows' => ['int'], +'mysqli_stmt::prepare' => ['bool', 'query'=>'string'], +'mysqli_stmt::reset' => ['bool'], +'mysqli_stmt::result_metadata' => ['mysqli_result|false'], +'mysqli_stmt::send_long_data' => ['bool', 'param_num'=>'int', 'data'=>'string'], +'mysqli_stmt::store_result' => ['bool'], +'mysqli_stmt_affected_rows' => ['int|string', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_attr_get' => ['int', 'statement'=>'mysqli_stmt', 'attribute'=>'int'], +'mysqli_stmt_attr_set' => ['bool', 'statement'=>'mysqli_stmt', 'attribute'=>'int', 'value'=>'int'], +'mysqli_stmt_bind_param' => ['bool', 'statement'=>'mysqli_stmt', 'types'=>'string', '&vars'=>'mixed', '&...args='=>'mixed'], +'mysqli_stmt_bind_result' => ['bool', 'statement'=>'mysqli_stmt', '&w_var1'=>'', '&...w_vars='=>''], +'mysqli_stmt_close' => ['bool', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_data_seek' => ['void', 'statement'=>'mysqli_stmt', 'offset'=>'int'], +'mysqli_stmt_errno' => ['int', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_error' => ['string', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_error_list' => ['array', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_execute' => ['bool', 'statement'=>'mysqli_stmt', 'params='=>'list|null'], +'mysqli_stmt_fetch' => ['bool|null', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_field_count' => ['int', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_free_result' => ['void', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_get_result' => ['mysqli_result|false', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_get_warnings' => ['object', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_init' => ['mysqli_stmt', 'mysql'=>'mysqli'], +'mysqli_stmt_insert_id' => ['mixed', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_more_results' => ['bool', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_next_result' => ['bool', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_num_rows' => ['int', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_param_count' => ['int', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_prepare' => ['bool', 'statement'=>'mysqli_stmt', 'query'=>'string'], +'mysqli_stmt_reset' => ['bool', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_result_metadata' => ['mysqli_result|false', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_send_long_data' => ['bool', 'statement'=>'mysqli_stmt', 'param_num'=>'int', 'data'=>'string'], +'mysqli_stmt_sqlstate' => ['string', 'statement'=>'mysqli_stmt'], +'mysqli_stmt_store_result' => ['bool', 'statement'=>'mysqli_stmt'], +'mysqli_store_result' => ['mysqli_result|false', 'mysql'=>'mysqli', 'mode='=>'int'], +'mysqli_thread_id' => ['int', 'mysql'=>'mysqli'], +'mysqli_thread_safe' => ['bool'], +'mysqli_use_result' => ['mysqli_result|false', 'mysql'=>'mysqli'], +'mysqli_warning::__construct' => ['void'], +'mysqli_warning::next' => ['bool'], +'mysqli_warning_count' => ['int', 'mysql'=>'mysqli'], +'mysqlnd_memcache_get_config' => ['array', 'connection'=>'mixed'], +'mysqlnd_memcache_set' => ['bool', 'mysql_connection'=>'mixed', 'memcache_connection='=>'Memcached', 'pattern='=>'string', 'callback='=>'callable'], +'mysqlnd_ms_dump_servers' => ['array', 'connection'=>'mixed'], +'mysqlnd_ms_fabric_select_global' => ['array', 'connection'=>'mixed', 'table_name'=>'mixed'], +'mysqlnd_ms_fabric_select_shard' => ['array', 'connection'=>'mixed', 'table_name'=>'mixed', 'shard_key'=>'mixed'], +'mysqlnd_ms_get_last_gtid' => ['string', 'connection'=>'mixed'], +'mysqlnd_ms_get_last_used_connection' => ['array', 'connection'=>'mixed'], +'mysqlnd_ms_get_stats' => ['array'], +'mysqlnd_ms_match_wild' => ['bool', 'table_name'=>'string', 'wildcard'=>'string'], +'mysqlnd_ms_query_is_select' => ['int', 'query'=>'string'], +'mysqlnd_ms_set_qos' => ['bool', 'connection'=>'mixed', 'service_level'=>'int', 'service_level_option='=>'int', 'option_value='=>'mixed'], +'mysqlnd_ms_set_user_pick_server' => ['bool', 'function'=>'string'], +'mysqlnd_ms_xa_begin' => ['int', 'connection'=>'mixed', 'gtrid'=>'string', 'timeout='=>'int'], +'mysqlnd_ms_xa_commit' => ['int', 'connection'=>'mixed', 'gtrid'=>'string'], +'mysqlnd_ms_xa_gc' => ['int', 'connection'=>'mixed', 'gtrid='=>'string', 'ignore_max_retries='=>'bool'], +'mysqlnd_ms_xa_rollback' => ['int', 'connection'=>'mixed', 'gtrid'=>'string'], +'mysqlnd_qc_change_handler' => ['bool', 'handler'=>''], +'mysqlnd_qc_clear_cache' => ['bool'], +'mysqlnd_qc_get_available_handlers' => ['array'], +'mysqlnd_qc_get_cache_info' => ['array'], +'mysqlnd_qc_get_core_stats' => ['array'], +'mysqlnd_qc_get_handler' => ['array'], +'mysqlnd_qc_get_normalized_query_trace_log' => ['array'], +'mysqlnd_qc_get_query_trace_log' => ['array'], +'mysqlnd_qc_set_cache_condition' => ['bool', 'condition_type'=>'int', 'condition'=>'mixed', 'condition_option'=>'mixed'], +'mysqlnd_qc_set_is_select' => ['mixed', 'callback'=>'string'], +'mysqlnd_qc_set_storage_handler' => ['bool', 'handler'=>'string'], +'mysqlnd_qc_set_user_handlers' => ['bool', 'get_hash'=>'string', 'find_query_in_cache'=>'string', 'return_to_cache'=>'string', 'add_query_to_cache_if_not_exists'=>'string', 'query_is_select'=>'string', 'update_query_run_time_stats'=>'string', 'get_stats'=>'string', 'clear_cache'=>'string'], +'mysqlnd_uh_convert_to_mysqlnd' => ['resource', '&rw_mysql_connection'=>'mysqli'], +'mysqlnd_uh_set_connection_proxy' => ['bool', '&rw_connection_proxy'=>'MysqlndUhConnection', '&rw_mysqli_connection='=>'mysqli'], +'mysqlnd_uh_set_statement_proxy' => ['bool', '&rw_statement_proxy'=>'MysqlndUhStatement'], +'MysqlndUhConnection::__construct' => ['void'], +'MysqlndUhConnection::changeUser' => ['bool', 'connection'=>'mysqlnd_connection', 'user'=>'string', 'password'=>'string', 'database'=>'string', 'silent'=>'bool', 'passwd_len'=>'int'], +'MysqlndUhConnection::charsetName' => ['string', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::close' => ['bool', 'connection'=>'mysqlnd_connection', 'close_type'=>'int'], +'MysqlndUhConnection::connect' => ['bool', 'connection'=>'mysqlnd_connection', 'host'=>'string', 'use'=>'string', 'password'=>'string', 'database'=>'string', 'port'=>'int', 'socket'=>'string', 'mysql_flags'=>'int'], +'MysqlndUhConnection::endPSession' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::escapeString' => ['string', 'connection'=>'mysqlnd_connection', 'escape_string'=>'string'], +'MysqlndUhConnection::getAffectedRows' => ['int', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getErrorNumber' => ['int', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getErrorString' => ['string', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getFieldCount' => ['int', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getHostInformation' => ['string', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getLastInsertId' => ['int', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getLastMessage' => ['void', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getProtocolInformation' => ['string', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getServerInformation' => ['string', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getServerStatistics' => ['string', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getServerVersion' => ['int', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getSqlstate' => ['string', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getStatistics' => ['array', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getThreadId' => ['int', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::getWarningCount' => ['int', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::init' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::killConnection' => ['bool', 'connection'=>'mysqlnd_connection', 'pid'=>'int'], +'MysqlndUhConnection::listFields' => ['array', 'connection'=>'mysqlnd_connection', 'table'=>'string', 'achtung_wild'=>'string'], +'MysqlndUhConnection::listMethod' => ['void', 'connection'=>'mysqlnd_connection', 'query'=>'string', 'achtung_wild'=>'string', 'par1'=>'string'], +'MysqlndUhConnection::moreResults' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::nextResult' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::ping' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::query' => ['bool', 'connection'=>'mysqlnd_connection', 'query'=>'string'], +'MysqlndUhConnection::queryReadResultsetHeader' => ['bool', 'connection'=>'mysqlnd_connection', 'mysqlnd_stmt'=>'mysqlnd_statement'], +'MysqlndUhConnection::reapQuery' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::refreshServer' => ['bool', 'connection'=>'mysqlnd_connection', 'options'=>'int'], +'MysqlndUhConnection::restartPSession' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::selectDb' => ['bool', 'connection'=>'mysqlnd_connection', 'database'=>'string'], +'MysqlndUhConnection::sendClose' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::sendQuery' => ['bool', 'connection'=>'mysqlnd_connection', 'query'=>'string'], +'MysqlndUhConnection::serverDumpDebugInformation' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::setAutocommit' => ['bool', 'connection'=>'mysqlnd_connection', 'mode'=>'int'], +'MysqlndUhConnection::setCharset' => ['bool', 'connection'=>'mysqlnd_connection', 'charset'=>'string'], +'MysqlndUhConnection::setClientOption' => ['bool', 'connection'=>'mysqlnd_connection', 'option'=>'int', 'value'=>'int'], +'MysqlndUhConnection::setServerOption' => ['void', 'connection'=>'mysqlnd_connection', 'option'=>'int'], +'MysqlndUhConnection::shutdownServer' => ['void', 'MYSQLND_UH_RES_MYSQLND_NAME'=>'string', 'level'=>'string'], +'MysqlndUhConnection::simpleCommand' => ['bool', 'connection'=>'mysqlnd_connection', 'command'=>'int', 'arg'=>'string', 'ok_packet'=>'int', 'silent'=>'bool', 'ignore_upsert_status'=>'bool'], +'MysqlndUhConnection::simpleCommandHandleResponse' => ['bool', 'connection'=>'mysqlnd_connection', 'ok_packet'=>'int', 'silent'=>'bool', 'command'=>'int', 'ignore_upsert_status'=>'bool'], +'MysqlndUhConnection::sslSet' => ['bool', 'connection'=>'mysqlnd_connection', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], +'MysqlndUhConnection::stmtInit' => ['resource', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::storeResult' => ['resource', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::txCommit' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::txRollback' => ['bool', 'connection'=>'mysqlnd_connection'], +'MysqlndUhConnection::useResult' => ['resource', 'connection'=>'mysqlnd_connection'], +'MysqlndUhPreparedStatement::__construct' => ['void'], +'MysqlndUhPreparedStatement::execute' => ['bool', 'statement'=>'mysqlnd_prepared_statement'], +'MysqlndUhPreparedStatement::prepare' => ['bool', 'statement'=>'mysqlnd_prepared_statement', 'query'=>'string'], +'natcasesort' => ['bool', '&rw_array'=>'array'], +'natsort' => ['bool', '&rw_array'=>'array'], +'ncurses_addch' => ['int', 'ch'=>'int'], +'ncurses_addchnstr' => ['int', 's'=>'string', 'n'=>'int'], +'ncurses_addchstr' => ['int', 's'=>'string'], +'ncurses_addnstr' => ['int', 's'=>'string', 'n'=>'int'], +'ncurses_addstr' => ['int', 'text'=>'string'], +'ncurses_assume_default_colors' => ['int', 'fg'=>'int', 'bg'=>'int'], +'ncurses_attroff' => ['int', 'attributes'=>'int'], +'ncurses_attron' => ['int', 'attributes'=>'int'], +'ncurses_attrset' => ['int', 'attributes'=>'int'], +'ncurses_baudrate' => ['int'], +'ncurses_beep' => ['int'], +'ncurses_bkgd' => ['int', 'attrchar'=>'int'], +'ncurses_bkgdset' => ['void', 'attrchar'=>'int'], +'ncurses_border' => ['int', 'left'=>'int', 'right'=>'int', 'top'=>'int', 'bottom'=>'int', 'tl_corner'=>'int', 'tr_corner'=>'int', 'bl_corner'=>'int', 'br_corner'=>'int'], +'ncurses_bottom_panel' => ['int', 'panel'=>'resource'], +'ncurses_can_change_color' => ['bool'], +'ncurses_cbreak' => ['bool'], +'ncurses_clear' => ['bool'], +'ncurses_clrtobot' => ['bool'], +'ncurses_clrtoeol' => ['bool'], +'ncurses_color_content' => ['int', 'color'=>'int', 'r'=>'int', 'g'=>'int', 'b'=>'int'], +'ncurses_color_set' => ['int', 'pair'=>'int'], +'ncurses_curs_set' => ['int', 'visibility'=>'int'], +'ncurses_def_prog_mode' => ['bool'], +'ncurses_def_shell_mode' => ['bool'], +'ncurses_define_key' => ['int', 'definition'=>'string', 'keycode'=>'int'], +'ncurses_del_panel' => ['bool', 'panel'=>'resource'], +'ncurses_delay_output' => ['int', 'milliseconds'=>'int'], +'ncurses_delch' => ['bool'], +'ncurses_deleteln' => ['bool'], +'ncurses_delwin' => ['bool', 'window'=>'resource'], +'ncurses_doupdate' => ['bool'], +'ncurses_echo' => ['bool'], +'ncurses_echochar' => ['int', 'character'=>'int'], +'ncurses_end' => ['int'], +'ncurses_erase' => ['bool'], +'ncurses_erasechar' => ['string'], +'ncurses_filter' => ['void'], +'ncurses_flash' => ['bool'], +'ncurses_flushinp' => ['bool'], +'ncurses_getch' => ['int'], +'ncurses_getmaxyx' => ['void', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], +'ncurses_getmouse' => ['bool', 'mevent'=>'array'], +'ncurses_getyx' => ['void', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], +'ncurses_halfdelay' => ['int', 'tenth'=>'int'], +'ncurses_has_colors' => ['bool'], +'ncurses_has_ic' => ['bool'], +'ncurses_has_il' => ['bool'], +'ncurses_has_key' => ['int', 'keycode'=>'int'], +'ncurses_hide_panel' => ['int', 'panel'=>'resource'], +'ncurses_hline' => ['int', 'charattr'=>'int', 'n'=>'int'], +'ncurses_inch' => ['string'], +'ncurses_init' => ['void'], +'ncurses_init_color' => ['int', 'color'=>'int', 'r'=>'int', 'g'=>'int', 'b'=>'int'], +'ncurses_init_pair' => ['int', 'pair'=>'int', 'fg'=>'int', 'bg'=>'int'], +'ncurses_insch' => ['int', 'character'=>'int'], +'ncurses_insdelln' => ['int', 'count'=>'int'], +'ncurses_insertln' => ['int'], +'ncurses_insstr' => ['int', 'text'=>'string'], +'ncurses_instr' => ['int', 'buffer'=>'string'], +'ncurses_isendwin' => ['bool'], +'ncurses_keyok' => ['int', 'keycode'=>'int', 'enable'=>'bool'], +'ncurses_keypad' => ['int', 'window'=>'resource', 'bf'=>'bool'], +'ncurses_killchar' => ['string'], +'ncurses_longname' => ['string'], +'ncurses_meta' => ['int', 'window'=>'resource', '_8bit'=>'bool'], +'ncurses_mouse_trafo' => ['bool', 'y'=>'int', 'x'=>'int', 'toscreen'=>'bool'], +'ncurses_mouseinterval' => ['int', 'milliseconds'=>'int'], +'ncurses_mousemask' => ['int', 'newmask'=>'int', 'oldmask'=>'int'], +'ncurses_move' => ['int', 'y'=>'int', 'x'=>'int'], +'ncurses_move_panel' => ['int', 'panel'=>'resource', 'startx'=>'int', 'starty'=>'int'], +'ncurses_mvaddch' => ['int', 'y'=>'int', 'x'=>'int', 'c'=>'int'], +'ncurses_mvaddchnstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string', 'n'=>'int'], +'ncurses_mvaddchstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string'], +'ncurses_mvaddnstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string', 'n'=>'int'], +'ncurses_mvaddstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string'], +'ncurses_mvcur' => ['int', 'old_y'=>'int', 'old_x'=>'int', 'new_y'=>'int', 'new_x'=>'int'], +'ncurses_mvdelch' => ['int', 'y'=>'int', 'x'=>'int'], +'ncurses_mvgetch' => ['int', 'y'=>'int', 'x'=>'int'], +'ncurses_mvhline' => ['int', 'y'=>'int', 'x'=>'int', 'attrchar'=>'int', 'n'=>'int'], +'ncurses_mvinch' => ['int', 'y'=>'int', 'x'=>'int'], +'ncurses_mvvline' => ['int', 'y'=>'int', 'x'=>'int', 'attrchar'=>'int', 'n'=>'int'], +'ncurses_mvwaddstr' => ['int', 'window'=>'resource', 'y'=>'int', 'x'=>'int', 'text'=>'string'], +'ncurses_napms' => ['int', 'milliseconds'=>'int'], +'ncurses_new_panel' => ['resource', 'window'=>'resource'], +'ncurses_newpad' => ['resource', 'rows'=>'int', 'cols'=>'int'], +'ncurses_newwin' => ['resource', 'rows'=>'int', 'cols'=>'int', 'y'=>'int', 'x'=>'int'], +'ncurses_nl' => ['bool'], +'ncurses_nocbreak' => ['bool'], +'ncurses_noecho' => ['bool'], +'ncurses_nonl' => ['bool'], +'ncurses_noqiflush' => ['void'], +'ncurses_noraw' => ['bool'], +'ncurses_pair_content' => ['int', 'pair'=>'int', 'f'=>'int', 'b'=>'int'], +'ncurses_panel_above' => ['resource', 'panel'=>'resource'], +'ncurses_panel_below' => ['resource', 'panel'=>'resource'], +'ncurses_panel_window' => ['resource', 'panel'=>'resource'], +'ncurses_pnoutrefresh' => ['int', 'pad'=>'resource', 'pminrow'=>'int', 'pmincol'=>'int', 'sminrow'=>'int', 'smincol'=>'int', 'smaxrow'=>'int', 'smaxcol'=>'int'], +'ncurses_prefresh' => ['int', 'pad'=>'resource', 'pminrow'=>'int', 'pmincol'=>'int', 'sminrow'=>'int', 'smincol'=>'int', 'smaxrow'=>'int', 'smaxcol'=>'int'], +'ncurses_putp' => ['int', 'text'=>'string'], +'ncurses_qiflush' => ['void'], +'ncurses_raw' => ['bool'], +'ncurses_refresh' => ['int', 'ch'=>'int'], +'ncurses_replace_panel' => ['int', 'panel'=>'resource', 'window'=>'resource'], +'ncurses_reset_prog_mode' => ['int'], +'ncurses_reset_shell_mode' => ['int'], +'ncurses_resetty' => ['bool'], +'ncurses_savetty' => ['bool'], +'ncurses_scr_dump' => ['int', 'filename'=>'string'], +'ncurses_scr_init' => ['int', 'filename'=>'string'], +'ncurses_scr_restore' => ['int', 'filename'=>'string'], +'ncurses_scr_set' => ['int', 'filename'=>'string'], +'ncurses_scrl' => ['int', 'count'=>'int'], +'ncurses_show_panel' => ['int', 'panel'=>'resource'], +'ncurses_slk_attr' => ['int'], +'ncurses_slk_attroff' => ['int', 'intarg'=>'int'], +'ncurses_slk_attron' => ['int', 'intarg'=>'int'], +'ncurses_slk_attrset' => ['int', 'intarg'=>'int'], +'ncurses_slk_clear' => ['bool'], +'ncurses_slk_color' => ['int', 'intarg'=>'int'], +'ncurses_slk_init' => ['bool', 'format'=>'int'], +'ncurses_slk_noutrefresh' => ['bool'], +'ncurses_slk_refresh' => ['int'], +'ncurses_slk_restore' => ['int'], +'ncurses_slk_set' => ['bool', 'labelnr'=>'int', 'label'=>'string', 'format'=>'int'], +'ncurses_slk_touch' => ['int'], +'ncurses_standend' => ['int'], +'ncurses_standout' => ['int'], +'ncurses_start_color' => ['int'], +'ncurses_termattrs' => ['bool'], +'ncurses_termname' => ['string'], +'ncurses_timeout' => ['void', 'millisec'=>'int'], +'ncurses_top_panel' => ['int', 'panel'=>'resource'], +'ncurses_typeahead' => ['int', 'fd'=>'int'], +'ncurses_ungetch' => ['int', 'keycode'=>'int'], +'ncurses_ungetmouse' => ['bool', 'mevent'=>'array'], +'ncurses_update_panels' => ['void'], +'ncurses_use_default_colors' => ['bool'], +'ncurses_use_env' => ['void', 'flag'=>'bool'], +'ncurses_use_extended_names' => ['int', 'flag'=>'bool'], +'ncurses_vidattr' => ['int', 'intarg'=>'int'], +'ncurses_vline' => ['int', 'charattr'=>'int', 'n'=>'int'], +'ncurses_waddch' => ['int', 'window'=>'resource', 'ch'=>'int'], +'ncurses_waddstr' => ['int', 'window'=>'resource', 'string'=>'string', 'n='=>'int'], +'ncurses_wattroff' => ['int', 'window'=>'resource', 'attrs'=>'int'], +'ncurses_wattron' => ['int', 'window'=>'resource', 'attrs'=>'int'], +'ncurses_wattrset' => ['int', 'window'=>'resource', 'attrs'=>'int'], +'ncurses_wborder' => ['int', 'window'=>'resource', 'left'=>'int', 'right'=>'int', 'top'=>'int', 'bottom'=>'int', 'tl_corner'=>'int', 'tr_corner'=>'int', 'bl_corner'=>'int', 'br_corner'=>'int'], +'ncurses_wclear' => ['int', 'window'=>'resource'], +'ncurses_wcolor_set' => ['int', 'window'=>'resource', 'color_pair'=>'int'], +'ncurses_werase' => ['int', 'window'=>'resource'], +'ncurses_wgetch' => ['int', 'window'=>'resource'], +'ncurses_whline' => ['int', 'window'=>'resource', 'charattr'=>'int', 'n'=>'int'], +'ncurses_wmouse_trafo' => ['bool', 'window'=>'resource', 'y'=>'int', 'x'=>'int', 'toscreen'=>'bool'], +'ncurses_wmove' => ['int', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], +'ncurses_wnoutrefresh' => ['int', 'window'=>'resource'], +'ncurses_wrefresh' => ['int', 'window'=>'resource'], +'ncurses_wstandend' => ['int', 'window'=>'resource'], +'ncurses_wstandout' => ['int', 'window'=>'resource'], +'ncurses_wvline' => ['int', 'window'=>'resource', 'charattr'=>'int', 'n'=>'int'], +'net_get_interfaces' => ['array>|false'], +'newrelic_add_custom_parameter' => ['bool', 'key'=>'string', 'value'=>'bool|float|int|string'], +'newrelic_add_custom_tracer' => ['bool', 'function_name'=>'string'], +'newrelic_background_job' => ['void', 'flag='=>'bool'], +'newrelic_capture_params' => ['void', 'enable='=>'bool'], +'newrelic_custom_metric' => ['bool', 'metric_name'=>'string', 'value'=>'float'], +'newrelic_disable_autorum' => ['true'], +'newrelic_end_of_transaction' => ['void'], +'newrelic_end_transaction' => ['bool', 'ignore='=>'bool'], +'newrelic_get_browser_timing_footer' => ['string', 'include_tags='=>'bool'], +'newrelic_get_browser_timing_header' => ['string', 'include_tags='=>'bool'], +'newrelic_ignore_apdex' => ['void'], +'newrelic_ignore_transaction' => ['void'], +'newrelic_name_transaction' => ['bool', 'name'=>'string'], +'newrelic_notice_error' => ['void', 'message'=>'string', 'exception='=>'Exception|Throwable'], +'newrelic_notice_error\'1' => ['void', 'unused_1'=>'string', 'message'=>'string', 'unused_2'=>'string', 'unused_3'=>'int', 'unused_4='=>''], +'newrelic_record_custom_event' => ['void', 'name'=>'string', 'attributes'=>'array'], +'newrelic_record_datastore_segment' => ['mixed', 'func'=>'callable', 'parameters'=>'array'], +'newrelic_set_appname' => ['bool', 'name'=>'string', 'license='=>'string', 'xmit='=>'bool'], +'newrelic_set_user_attributes' => ['bool', 'user'=>'string', 'account'=>'string', 'product'=>'string'], +'newrelic_start_transaction' => ['bool', 'appname'=>'string', 'license='=>'string'], +'newt_bell' => ['void'], +'newt_button' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], +'newt_button_bar' => ['resource', 'buttons'=>'array'], +'newt_centered_window' => ['int', 'width'=>'int', 'height'=>'int', 'title='=>'string'], +'newt_checkbox' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'def_value'=>'string', 'seq='=>'string'], +'newt_checkbox_get_value' => ['string', 'checkbox'=>'resource'], +'newt_checkbox_set_flags' => ['void', 'checkbox'=>'resource', 'flags'=>'int', 'sense'=>'int'], +'newt_checkbox_set_value' => ['void', 'checkbox'=>'resource', 'value'=>'string'], +'newt_checkbox_tree' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'flags='=>'int'], +'newt_checkbox_tree_add_item' => ['void', 'checkboxtree'=>'resource', 'text'=>'string', 'data'=>'mixed', 'flags'=>'int', 'index'=>'int', '...args='=>'int'], +'newt_checkbox_tree_find_item' => ['array', 'checkboxtree'=>'resource', 'data'=>'mixed'], +'newt_checkbox_tree_get_current' => ['mixed', 'checkboxtree'=>'resource'], +'newt_checkbox_tree_get_entry_value' => ['string', 'checkboxtree'=>'resource', 'data'=>'mixed'], +'newt_checkbox_tree_get_multi_selection' => ['array', 'checkboxtree'=>'resource', 'seqnum'=>'string'], +'newt_checkbox_tree_get_selection' => ['array', 'checkboxtree'=>'resource'], +'newt_checkbox_tree_multi' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'seq'=>'string', 'flags='=>'int'], +'newt_checkbox_tree_set_current' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed'], +'newt_checkbox_tree_set_entry' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed', 'text'=>'string'], +'newt_checkbox_tree_set_entry_value' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed', 'value'=>'string'], +'newt_checkbox_tree_set_width' => ['void', 'checkbox_tree'=>'resource', 'width'=>'int'], +'newt_clear_key_buffer' => ['void'], +'newt_cls' => ['void'], +'newt_compact_button' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], +'newt_component_add_callback' => ['void', 'component'=>'resource', 'func_name'=>'mixed', 'data'=>'mixed'], +'newt_component_takes_focus' => ['void', 'component'=>'resource', 'takes_focus'=>'bool'], +'newt_create_grid' => ['resource', 'cols'=>'int', 'rows'=>'int'], +'newt_cursor_off' => ['void'], +'newt_cursor_on' => ['void'], +'newt_delay' => ['void', 'microseconds'=>'int'], +'newt_draw_form' => ['void', 'form'=>'resource'], +'newt_draw_root_text' => ['void', 'left'=>'int', 'top'=>'int', 'text'=>'string'], +'newt_entry' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'init_value='=>'string', 'flags='=>'int'], +'newt_entry_get_value' => ['string', 'entry'=>'resource'], +'newt_entry_set' => ['void', 'entry'=>'resource', 'value'=>'string', 'cursor_at_end='=>'bool'], +'newt_entry_set_filter' => ['void', 'entry'=>'resource', 'filter'=>'callable', 'data'=>'mixed'], +'newt_entry_set_flags' => ['void', 'entry'=>'resource', 'flags'=>'int', 'sense'=>'int'], +'newt_finished' => ['int'], +'newt_form' => ['resource', 'vert_bar='=>'resource', 'help='=>'string', 'flags='=>'int'], +'newt_form_add_component' => ['void', 'form'=>'resource', 'component'=>'resource'], +'newt_form_add_components' => ['void', 'form'=>'resource', 'components'=>'array'], +'newt_form_add_hot_key' => ['void', 'form'=>'resource', 'key'=>'int'], +'newt_form_destroy' => ['void', 'form'=>'resource'], +'newt_form_get_current' => ['resource', 'form'=>'resource'], +'newt_form_run' => ['void', 'form'=>'resource', 'exit_struct'=>'array'], +'newt_form_set_background' => ['void', 'from'=>'resource', 'background'=>'int'], +'newt_form_set_height' => ['void', 'form'=>'resource', 'height'=>'int'], +'newt_form_set_size' => ['void', 'form'=>'resource'], +'newt_form_set_timer' => ['void', 'form'=>'resource', 'milliseconds'=>'int'], +'newt_form_set_width' => ['void', 'form'=>'resource', 'width'=>'int'], +'newt_form_watch_fd' => ['void', 'form'=>'resource', 'stream'=>'resource', 'flags='=>'int'], +'newt_get_screen_size' => ['void', 'cols'=>'int', 'rows'=>'int'], +'newt_grid_add_components_to_form' => ['void', 'grid'=>'resource', 'form'=>'resource', 'recurse'=>'bool'], +'newt_grid_basic_window' => ['resource', 'text'=>'resource', 'middle'=>'resource', 'buttons'=>'resource'], +'newt_grid_free' => ['void', 'grid'=>'resource', 'recurse'=>'bool'], +'newt_grid_get_size' => ['void', 'grid'=>'resource', 'width'=>'int', 'height'=>'int'], +'newt_grid_h_close_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], +'newt_grid_h_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], +'newt_grid_place' => ['void', 'grid'=>'resource', 'left'=>'int', 'top'=>'int'], +'newt_grid_set_field' => ['void', 'grid'=>'resource', 'col'=>'int', 'row'=>'int', 'type'=>'int', 'value'=>'resource', 'pad_left'=>'int', 'pad_top'=>'int', 'pad_right'=>'int', 'pad_bottom'=>'int', 'anchor'=>'int', 'flags='=>'int'], +'newt_grid_simple_window' => ['resource', 'text'=>'resource', 'middle'=>'resource', 'buttons'=>'resource'], +'newt_grid_v_close_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], +'newt_grid_v_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], +'newt_grid_wrapped_window' => ['void', 'grid'=>'resource', 'title'=>'string'], +'newt_grid_wrapped_window_at' => ['void', 'grid'=>'resource', 'title'=>'string', 'left'=>'int', 'top'=>'int'], +'newt_init' => ['int'], +'newt_label' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], +'newt_label_set_text' => ['void', 'label'=>'resource', 'text'=>'string'], +'newt_listbox' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'flags='=>'int'], +'newt_listbox_append_entry' => ['void', 'listbox'=>'resource', 'text'=>'string', 'data'=>'mixed'], +'newt_listbox_clear' => ['void', 'listobx'=>'resource'], +'newt_listbox_clear_selection' => ['void', 'listbox'=>'resource'], +'newt_listbox_delete_entry' => ['void', 'listbox'=>'resource', 'key'=>'mixed'], +'newt_listbox_get_current' => ['string', 'listbox'=>'resource'], +'newt_listbox_get_selection' => ['array', 'listbox'=>'resource'], +'newt_listbox_insert_entry' => ['void', 'listbox'=>'resource', 'text'=>'string', 'data'=>'mixed', 'key'=>'mixed'], +'newt_listbox_item_count' => ['int', 'listbox'=>'resource'], +'newt_listbox_select_item' => ['void', 'listbox'=>'resource', 'key'=>'mixed', 'sense'=>'int'], +'newt_listbox_set_current' => ['void', 'listbox'=>'resource', 'num'=>'int'], +'newt_listbox_set_current_by_key' => ['void', 'listbox'=>'resource', 'key'=>'mixed'], +'newt_listbox_set_data' => ['void', 'listbox'=>'resource', 'num'=>'int', 'data'=>'mixed'], +'newt_listbox_set_entry' => ['void', 'listbox'=>'resource', 'num'=>'int', 'text'=>'string'], +'newt_listbox_set_width' => ['void', 'listbox'=>'resource', 'width'=>'int'], +'newt_listitem' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'is_default'=>'bool', 'prev_item'=>'resource', 'data'=>'mixed', 'flags='=>'int'], +'newt_listitem_get_data' => ['mixed', 'item'=>'resource'], +'newt_listitem_set' => ['void', 'item'=>'resource', 'text'=>'string'], +'newt_open_window' => ['int', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'height'=>'int', 'title='=>'string'], +'newt_pop_help_line' => ['void'], +'newt_pop_window' => ['void'], +'newt_push_help_line' => ['void', 'text='=>'string'], +'newt_radio_get_current' => ['resource', 'set_member'=>'resource'], +'newt_radiobutton' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'is_default'=>'bool', 'prev_button='=>'resource'], +'newt_redraw_help_line' => ['void'], +'newt_reflow_text' => ['string', 'text'=>'string', 'width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'actual_width'=>'int', 'actual_height'=>'int'], +'newt_refresh' => ['void'], +'newt_resize_screen' => ['void', 'redraw='=>'bool'], +'newt_resume' => ['void'], +'newt_run_form' => ['resource', 'form'=>'resource'], +'newt_scale' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'full_value'=>'int'], +'newt_scale_set' => ['void', 'scale'=>'resource', 'amount'=>'int'], +'newt_scrollbar_set' => ['void', 'scrollbar'=>'resource', 'where'=>'int', 'total'=>'int'], +'newt_set_help_callback' => ['void', 'function'=>'mixed'], +'newt_set_suspend_callback' => ['void', 'function'=>'callable', 'data'=>'mixed'], +'newt_suspend' => ['void'], +'newt_textbox' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'height'=>'int', 'flags='=>'int'], +'newt_textbox_get_num_lines' => ['int', 'textbox'=>'resource'], +'newt_textbox_reflowed' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'char', 'width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'flags='=>'int'], +'newt_textbox_set_height' => ['void', 'textbox'=>'resource', 'height'=>'int'], +'newt_textbox_set_text' => ['void', 'textbox'=>'resource', 'text'=>'string'], +'newt_vertical_scrollbar' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'normal_colorset='=>'int', 'thumb_colorset='=>'int'], +'newt_wait_for_key' => ['void'], +'newt_win_choice' => ['int', 'title'=>'string', 'button1_text'=>'string', 'button2_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], +'newt_win_entries' => ['int', 'title'=>'string', 'text'=>'string', 'suggested_width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'data_width'=>'int', 'items'=>'array', 'button1'=>'string', '...args='=>'string'], +'newt_win_menu' => ['int', 'title'=>'string', 'text'=>'string', 'suggestedwidth'=>'int', 'flexdown'=>'int', 'flexup'=>'int', 'maxlistheight'=>'int', 'items'=>'array', 'listitem'=>'int', 'button1='=>'string', '...args='=>'string'], +'newt_win_message' => ['void', 'title'=>'string', 'button_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], +'newt_win_messagev' => ['void', 'title'=>'string', 'button_text'=>'string', 'format'=>'string', 'args'=>'array'], +'newt_win_ternary' => ['int', 'title'=>'string', 'button1_text'=>'string', 'button2_text'=>'string', 'button3_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], +'next' => ['mixed', '&r_array'=>'array|object'], +'ngettext' => ['string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int'], +'nl2br' => ['string', 'string'=>'string', 'use_xhtml='=>'bool'], +'nl_langinfo' => ['string|false', 'item'=>'int'], +'NoRewindIterator::__construct' => ['void', 'iterator'=>'Iterator'], +'NoRewindIterator::current' => ['mixed'], +'NoRewindIterator::getInnerIterator' => ['Iterator'], +'NoRewindIterator::key' => ['mixed'], +'NoRewindIterator::next' => ['void'], +'NoRewindIterator::rewind' => ['void'], +'NoRewindIterator::valid' => ['bool'], +'Normalizer::getRawDecomposition' => ['string|null', 'input'=>'string'], +'Normalizer::isNormalized' => ['bool', 'input'=>'string', 'form='=>'int'], +'Normalizer::normalize' => ['string', 'input'=>'string', 'form='=>'int'], +'normalizer_get_raw_decomposition' => ['string|null', 'string'=>'string'], +'normalizer_is_normalized' => ['bool', 'string'=>'string', 'form='=>'int'], +'normalizer_normalize' => ['string', 'string'=>'string', 'form='=>'int'], +'notes_body' => ['array', 'server'=>'string', 'mailbox'=>'string', 'msg_number'=>'int'], +'notes_copy_db' => ['bool', 'from_database_name'=>'string', 'to_database_name'=>'string'], +'notes_create_db' => ['bool', 'database_name'=>'string'], +'notes_create_note' => ['bool', 'database_name'=>'string', 'form_name'=>'string'], +'notes_drop_db' => ['bool', 'database_name'=>'string'], +'notes_find_note' => ['int', 'database_name'=>'string', 'name'=>'string', 'type='=>'string'], +'notes_header_info' => ['object', 'server'=>'string', 'mailbox'=>'string', 'msg_number'=>'int'], +'notes_list_msgs' => ['bool', 'db'=>'string'], +'notes_mark_read' => ['bool', 'database_name'=>'string', 'user_name'=>'string', 'note_id'=>'string'], +'notes_mark_unread' => ['bool', 'database_name'=>'string', 'user_name'=>'string', 'note_id'=>'string'], +'notes_nav_create' => ['bool', 'database_name'=>'string', 'name'=>'string'], +'notes_search' => ['array', 'database_name'=>'string', 'keywords'=>'string'], +'notes_unread' => ['array', 'database_name'=>'string', 'user_name'=>'string'], +'notes_version' => ['float', 'database_name'=>'string'], +'nsapi_request_headers' => ['array'], +'nsapi_response_headers' => ['array'], +'nsapi_virtual' => ['bool', 'uri'=>'string'], +'nthmac' => ['string', 'clent'=>'string', 'data'=>'string'], +'number_format' => ['string', 'num'=>'float|int', 'decimals='=>'int', 'decimal_separator='=>'?string', 'thousands_separator='=>'?string'], +'NumberFormatter::__construct' => ['void', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], +'NumberFormatter::create' => ['NumberFormatter|false', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], +'NumberFormatter::format' => ['string|false', 'num'=>'', 'type='=>'int'], +'NumberFormatter::formatCurrency' => ['string|false', 'num'=>'float', 'currency'=>'string'], +'NumberFormatter::getAttribute' => ['int|false', 'attr'=>'int'], +'NumberFormatter::getErrorCode' => ['int'], +'NumberFormatter::getErrorMessage' => ['string'], +'NumberFormatter::getLocale' => ['string', 'type='=>'int'], +'NumberFormatter::getPattern' => ['string|false'], +'NumberFormatter::getSymbol' => ['string|false', 'attr'=>'int'], +'NumberFormatter::getTextAttribute' => ['string|false', 'attr'=>'int'], +'NumberFormatter::parse' => ['float|false', 'string'=>'string', 'type='=>'int', '&rw_position='=>'int'], +'NumberFormatter::parseCurrency' => ['float|false', 'string'=>'string', '&w_currency'=>'string', '&rw_position='=>'int'], +'NumberFormatter::setAttribute' => ['bool', 'attr'=>'int', 'value'=>''], +'NumberFormatter::setPattern' => ['bool', 'pattern'=>'string'], +'NumberFormatter::setSymbol' => ['bool', 'attr'=>'int', 'symbol'=>'string'], +'NumberFormatter::setTextAttribute' => ['bool', 'attr'=>'int', 'value'=>'string'], +'numfmt_create' => ['NumberFormatter|false', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], +'numfmt_format' => ['string|false', 'formatter'=>'NumberFormatter', 'num'=>'int|float', 'type='=>'int'], +'numfmt_format_currency' => ['string|false', 'formatter'=>'NumberFormatter', 'amount'=>'float', 'currency'=>'string'], +'numfmt_get_attribute' => ['int|false', 'formatter'=>'NumberFormatter', 'attribute'=>'int'], +'numfmt_get_error_code' => ['int', 'formatter'=>'NumberFormatter'], +'numfmt_get_error_message' => ['string', 'formatter'=>'NumberFormatter'], +'numfmt_get_locale' => ['string', 'formatter'=>'NumberFormatter', 'type='=>'int'], +'numfmt_get_pattern' => ['string|false', 'formatter'=>'NumberFormatter'], +'numfmt_get_symbol' => ['string|false', 'formatter'=>'NumberFormatter', 'symbol'=>'int'], +'numfmt_get_text_attribute' => ['string|false', 'formatter'=>'NumberFormatter', 'attribute'=>'int'], +'numfmt_parse' => ['float|int|false', 'formatter'=>'NumberFormatter', 'string'=>'string', 'type='=>'int', '&rw_offset='=>'int'], +'numfmt_parse_currency' => ['float|false', 'formatter'=>'NumberFormatter', 'string'=>'string', '&w_currency'=>'string', '&rw_offset='=>'int'], +'numfmt_set_attribute' => ['bool', 'formatter'=>'NumberFormatter', 'attribute'=>'int', 'value'=>'int'], +'numfmt_set_pattern' => ['bool', 'formatter'=>'NumberFormatter', 'pattern'=>'string'], +'numfmt_set_symbol' => ['bool', 'formatter'=>'NumberFormatter', 'symbol'=>'int', 'value'=>'string'], +'numfmt_set_text_attribute' => ['bool', 'formatter'=>'NumberFormatter', 'attribute'=>'int', 'value'=>'string'], +'OAuth::__construct' => ['void', 'consumer_key'=>'string', 'consumer_secret'=>'string', 'signature_method='=>'string', 'auth_type='=>'int'], +'OAuth::__destruct' => ['void'], +'OAuth::disableDebug' => ['bool'], +'OAuth::disableRedirects' => ['bool'], +'OAuth::disableSSLChecks' => ['bool'], +'OAuth::enableDebug' => ['bool'], +'OAuth::enableRedirects' => ['bool'], +'OAuth::enableSSLChecks' => ['bool'], +'OAuth::fetch' => ['mixed', 'protected_resource_url'=>'string', 'extra_parameters='=>'array', 'http_method='=>'string', 'http_headers='=>'array'], +'OAuth::generateSignature' => ['string', 'http_method'=>'string', 'url'=>'string', 'extra_parameters='=>'mixed'], +'OAuth::getAccessToken' => ['array|false', 'access_token_url'=>'string', 'auth_session_handle='=>'string', 'verifier_token='=>'string', 'http_method='=>'string'], +'OAuth::getCAPath' => ['array'], +'OAuth::getLastResponse' => ['string'], +'OAuth::getLastResponseHeaders' => ['string|false'], +'OAuth::getLastResponseInfo' => ['array'], +'OAuth::getRequestHeader' => ['string|false', 'http_method'=>'string', 'url'=>'string', 'extra_parameters='=>'mixed'], +'OAuth::getRequestToken' => ['array|false', 'request_token_url'=>'string', 'callback_url='=>'string', 'http_method='=>'string'], +'OAuth::setAuthType' => ['bool', 'auth_type'=>'int'], +'OAuth::setCAPath' => ['mixed', 'ca_path='=>'string', 'ca_info='=>'string'], +'OAuth::setNonce' => ['mixed', 'nonce'=>'string'], +'OAuth::setRequestEngine' => ['void', 'reqengine'=>'int'], +'OAuth::setRSACertificate' => ['mixed', 'cert'=>'string'], +'OAuth::setSSLChecks' => ['bool', 'sslcheck'=>'int'], +'OAuth::setTimeout' => ['void', 'timeout'=>'int'], +'OAuth::setTimestamp' => ['mixed', 'timestamp'=>'string'], +'OAuth::setToken' => ['bool', 'token'=>'string', 'token_secret'=>'string'], +'OAuth::setVersion' => ['bool', 'version'=>'string'], +'oauth_get_sbs' => ['string', 'http_method'=>'string', 'uri'=>'string', 'request_parameters='=>'array'], +'oauth_urlencode' => ['string', 'uri'=>'string'], +'OAuthProvider::__construct' => ['void', 'params_array='=>'array'], +'OAuthProvider::addRequiredParameter' => ['bool', 'req_params'=>'string'], +'OAuthProvider::callconsumerHandler' => ['void'], +'OAuthProvider::callTimestampNonceHandler' => ['void'], +'OAuthProvider::calltokenHandler' => ['void'], +'OAuthProvider::checkOAuthRequest' => ['void', 'uri='=>'string', 'method='=>'string'], +'OAuthProvider::consumerHandler' => ['void', 'callback_function'=>'callable'], +'OAuthProvider::generateToken' => ['string', 'size'=>'int', 'strong='=>'bool'], +'OAuthProvider::is2LeggedEndpoint' => ['void', 'params_array'=>'mixed'], +'OAuthProvider::isRequestTokenEndpoint' => ['void', 'will_issue_request_token'=>'bool'], +'OAuthProvider::removeRequiredParameter' => ['bool', 'req_params'=>'string'], +'OAuthProvider::reportProblem' => ['string', 'oauthexception'=>'string', 'send_headers='=>'bool'], +'OAuthProvider::setParam' => ['bool', 'param_key'=>'string', 'param_val='=>'mixed'], +'OAuthProvider::setRequestTokenPath' => ['bool', 'path'=>'string'], +'OAuthProvider::timestampNonceHandler' => ['void', 'callback_function'=>'callable'], +'OAuthProvider::tokenHandler' => ['void', 'callback_function'=>'callable'], +'ob_clean' => ['bool'], +'ob_deflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'], +'ob_end_clean' => ['bool'], +'ob_end_flush' => ['bool'], +'ob_etaghandler' => ['string', 'data'=>'string', 'mode'=>'int'], +'ob_flush' => ['bool'], +'ob_get_clean' => ['string|false'], +'ob_get_contents' => ['string|false'], +'ob_get_flush' => ['string|false'], +'ob_get_length' => ['int|false'], +'ob_get_level' => ['int'], +'ob_get_status' => ['array', 'full_status='=>'bool'], +'ob_gzhandler' => ['string|false', 'data'=>'string', 'flags'=>'int'], +'ob_iconv_handler' => ['string', 'contents'=>'string', 'status'=>'int'], +'ob_implicit_flush' => ['void', 'enable='=>'bool'], +'ob_inflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'], +'ob_list_handlers' => ['false|list'], +'ob_start' => ['bool', 'callback='=>'string|array|?callable', 'chunk_size='=>'int', 'flags='=>'int'], +'ob_tidyhandler' => ['string', 'input'=>'string', 'mode='=>'int'], +'oci_bind_array_by_name' => ['bool', 'statement'=>'resource', 'param'=>'string', '&rw_var'=>'array', 'max_array_length'=>'int', 'max_item_length='=>'int', 'type='=>'int'], +'oci_bind_by_name' => ['bool', 'statement'=>'resource', 'param'=>'string', '&rw_var'=>'mixed', 'max_length='=>'int', 'type='=>'int'], +'oci_cancel' => ['bool', 'statement'=>'resource'], +'oci_client_version' => ['string'], +'oci_close' => ['bool', 'connection'=>'resource'], +'OCICollection::append' => ['bool', 'value'=>'mixed'], +'OCICollection::assign' => ['bool', 'from'=>'OCI_Collection'], +'OCICollection::assignElem' => ['bool', 'index'=>'int', 'value'=>'mixed'], +'OCICollection::free' => ['bool'], +'OCICollection::getElem' => ['mixed', 'index'=>'int'], +'OCICollection::max' => ['int|false'], +'OCICollection::size' => ['int|false'], +'OCICollection::trim' => ['bool', 'num'=>'int'], +'oci_collection_append' => ['bool', 'collection'=>'string'], +'oci_collection_assign' => ['bool', 'to'=>'object'], +'oci_collection_element_assign' => ['bool', 'collection'=>'int', 'index'=>'string'], +'oci_collection_element_get' => ['string', 'collection'=>'int'], +'oci_collection_max' => ['int'], +'oci_collection_size' => ['int'], +'oci_collection_trim' => ['bool', 'collection'=>'int'], +'oci_commit' => ['bool', 'connection'=>'resource'], +'oci_connect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], +'oci_define_by_name' => ['bool', 'statement'=>'resource', 'column'=>'string', '&w_var'=>'mixed', 'type='=>'int'], +'oci_error' => ['array|false', 'connection_or_statement='=>'resource'], +'oci_execute' => ['bool', 'statement'=>'resource', 'mode='=>'int'], +'oci_fetch' => ['bool', 'statement'=>'resource'], +'oci_fetch_all' => ['int|false', 'statement'=>'resource', '&w_output'=>'array', 'offset='=>'int', 'limit='=>'int', 'flags='=>'int'], +'oci_fetch_array' => ['array|false', 'statement'=>'resource', 'mode='=>'int'], +'oci_fetch_assoc' => ['array|false', 'statement'=>'resource'], +'oci_fetch_object' => ['object|false', 'statement'=>'resource'], +'oci_fetch_row' => ['array|false', 'statement'=>'resource'], +'oci_field_is_null' => ['bool', 'statement'=>'resource', 'column'=>'mixed'], +'oci_field_name' => ['string|false', 'statement'=>'resource', 'column'=>'mixed'], +'oci_field_precision' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], +'oci_field_scale' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], +'oci_field_size' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], +'oci_field_type' => ['mixed|false', 'statement'=>'resource', 'column'=>'mixed'], +'oci_field_type_raw' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], +'oci_free_collection' => ['bool'], +'oci_free_cursor' => ['bool', 'statement'=>'resource'], +'oci_free_descriptor' => ['bool'], +'oci_free_statement' => ['bool', 'statement'=>'resource'], +'oci_get_implicit' => ['bool', 'stmt'=>''], +'oci_get_implicit_resultset' => ['resource|false', 'statement'=>'resource'], +'oci_internal_debug' => ['void', 'onoff'=>'bool'], +'OCILob::append' => ['bool', 'lob_from'=>'OCILob'], +'OCILob::close' => ['bool'], +'OCILob::eof' => ['bool'], +'OCILob::erase' => ['int|false', 'offset='=>'int', 'length='=>'int'], +'OCILob::export' => ['bool', 'filename'=>'string', 'start='=>'int', 'length='=>'int'], +'OCILob::flush' => ['bool', 'flag='=>'int'], +'OCILob::free' => ['bool'], +'OCILob::getbuffering' => ['bool'], +'OCILob::import' => ['bool', 'filename'=>'string'], +'OCILob::load' => ['string|false'], +'OCILob::read' => ['string|false', 'length'=>'int'], +'OCILob::rewind' => ['bool'], +'OCILob::save' => ['bool', 'data'=>'string', 'offset='=>'int'], +'OCILob::savefile' => ['bool', 'filename'=>''], +'OCILob::seek' => ['bool', 'offset'=>'int', 'whence='=>'int'], +'OCILob::setbuffering' => ['bool', 'on_off'=>'bool'], +'OCILob::size' => ['int|false'], +'OCILob::tell' => ['int|false'], +'OCILob::truncate' => ['bool', 'length='=>'int'], +'OCILob::write' => ['int|false', 'data'=>'string', 'length='=>'int'], +'OCILob::writeTemporary' => ['bool', 'data'=>'string', 'lob_type='=>'int'], +'OCILob::writetofile' => ['bool', 'filename'=>'', 'start'=>'', 'length'=>''], +'oci_lob_append' => ['bool', 'to'=>'object'], +'oci_lob_close' => ['bool'], +'oci_lob_copy' => ['bool', 'to'=>'OCILob', 'from'=>'OCILob', 'length='=>'int'], +'oci_lob_eof' => ['bool'], +'oci_lob_erase' => ['int', 'lob'=>'int', 'offset'=>'int'], +'oci_lob_export' => ['bool', 'lob'=>'string', 'filename'=>'int', 'offset'=>'int'], +'oci_lob_flush' => ['bool', 'lob'=>'int'], +'oci_lob_import' => ['bool', 'lob'=>'string'], +'oci_lob_is_equal' => ['bool', 'lob1'=>'OCILob', 'lob2'=>'OCILob'], +'oci_lob_load' => ['string'], +'oci_lob_read' => ['string', 'lob'=>'int'], +'oci_lob_rewind' => ['bool'], +'oci_lob_save' => ['bool', 'lob'=>'string', 'data'=>'int'], +'oci_lob_seek' => ['bool', 'lob'=>'int', 'offset'=>'int'], +'oci_lob_size' => ['int'], +'oci_lob_tell' => ['int'], +'oci_lob_truncate' => ['bool', 'lob'=>'int'], +'oci_lob_write' => ['int', 'lob'=>'string', 'data'=>'int'], +'oci_lob_write_temporary' => ['bool', 'value'=>'string', 'lob_type'=>'int'], +'oci_new_collection' => ['OCICollection|false', 'connection'=>'resource', 'type_name'=>'string', 'schema='=>'string'], +'oci_new_connect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], +'oci_new_cursor' => ['resource|false', 'connection'=>'resource'], +'oci_new_descriptor' => ['OCILob|false', 'connection'=>'resource', 'type='=>'int'], +'oci_num_fields' => ['int|false', 'statement'=>'resource'], +'oci_num_rows' => ['int|false', 'statement'=>'resource'], +'oci_parse' => ['resource|false', 'connection'=>'resource', 'sql'=>'string'], +'oci_password_change' => ['bool', 'connection'=>'resource', 'username'=>'string', 'old_password'=>'string', 'new_password'=>'string'], +'oci_pconnect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], +'oci_register_taf_callback' => ['bool', 'connection'=>'resource', 'callback='=>'callable'], +'oci_result' => ['mixed|false', 'statement'=>'resource', 'column'=>'mixed'], +'oci_rollback' => ['bool', 'connection'=>'resource'], +'oci_server_version' => ['string|false', 'connection'=>'resource'], +'oci_set_action' => ['bool', 'connection'=>'resource', 'action'=>'string'], +'oci_set_call_timeout' => ['bool', 'connection'=>'resource', 'timeout'=>'int'], +'oci_set_client_identifier' => ['bool', 'connection'=>'resource', 'client_id'=>'string'], +'oci_set_client_info' => ['bool', 'connection'=>'resource', 'client_info'=>'string'], +'oci_set_db_operation' => ['bool', 'connection'=>'resource', 'action'=>'string'], +'oci_set_edition' => ['bool', 'edition'=>'string'], +'oci_set_module_name' => ['bool', 'connection'=>'resource', 'name'=>'string'], +'oci_set_prefetch' => ['bool', 'statement'=>'resource', 'rows'=>'int'], +'oci_statement_type' => ['string|false', 'statement'=>'resource'], +'oci_unregister_taf_callback' => ['bool', 'connection'=>'resource'], +'ocifetchinto' => ['int|bool', 'statement'=>'resource', '&w_result'=>'array', 'mode='=>'int'], +'ocigetbufferinglob' => ['bool'], +'ocisetbufferinglob' => ['bool', 'lob'=>'bool'], +'octdec' => ['int|float', 'octal_string'=>'string'], +'odbc_autocommit' => ['mixed', 'odbc'=>'resource', 'enable='=>'bool'], +'odbc_binmode' => ['bool', 'statement'=>'resource', 'mode'=>'int'], +'odbc_close' => ['void', 'odbc'=>'resource'], +'odbc_close_all' => ['void'], +'odbc_columnprivileges' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'column'=>'string'], +'odbc_columns' => ['resource|false', 'odbc'=>'resource', 'catalog='=>'string', 'schema='=>'string', 'table='=>'string', 'column='=>'string'], +'odbc_commit' => ['bool', 'odbc'=>'resource'], +'odbc_connect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'], +'odbc_cursor' => ['string', 'statement'=>'resource'], +'odbc_data_source' => ['array|false', 'odbc'=>'resource', 'fetch_type'=>'int'], +'odbc_do' => ['resource', 'odbc'=>'resource', 'query'=>'string', 'flags='=>'int'], +'odbc_error' => ['string', 'odbc='=>'resource'], +'odbc_errormsg' => ['string', 'odbc='=>'resource'], +'odbc_exec' => ['resource', 'odbc'=>'resource', 'query'=>'string', 'flags='=>'int'], +'odbc_execute' => ['bool', 'statement'=>'resource', 'params='=>'array'], +'odbc_fetch_array' => ['array|false', 'statement'=>'resource', 'row='=>'int'], +'odbc_fetch_into' => ['int', 'statement'=>'resource', '&w_array'=>'array', 'row='=>'int'], +'odbc_fetch_object' => ['object|false', 'statement'=>'resource', 'row='=>'int'], +'odbc_fetch_row' => ['bool', 'statement'=>'resource', 'row='=>'int'], +'odbc_field_len' => ['int|false', 'statement'=>'resource', 'field'=>'int'], +'odbc_field_name' => ['string|false', 'statement'=>'resource', 'field'=>'int'], +'odbc_field_num' => ['int|false', 'statement'=>'resource', 'field'=>'string'], +'odbc_field_precision' => ['int', 'statement'=>'resource', 'field'=>'int'], +'odbc_field_scale' => ['int|false', 'statement'=>'resource', 'field'=>'int'], +'odbc_field_type' => ['string|false', 'statement'=>'resource', 'field'=>'int'], +'odbc_foreignkeys' => ['resource|false', 'odbc'=>'resource', 'pk_catalog'=>'string', 'pk_schema'=>'string', 'pk_table'=>'string', 'fk_catalog'=>'string', 'fk_schema'=>'string', 'fk_table'=>'string'], +'odbc_free_result' => ['bool', 'statement'=>'resource'], +'odbc_gettypeinfo' => ['resource', 'odbc'=>'resource', 'data_type='=>'int'], +'odbc_longreadlen' => ['bool', 'statement'=>'resource', 'length'=>'int'], +'odbc_next_result' => ['bool', 'statement'=>'resource'], +'odbc_num_fields' => ['int', 'statement'=>'resource'], +'odbc_num_rows' => ['int', 'statement'=>'resource'], +'odbc_pconnect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'], +'odbc_prepare' => ['resource|false', 'odbc'=>'resource', 'query'=>'string'], +'odbc_primarykeys' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string'], +'odbc_procedurecolumns' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'procedure'=>'string', 'column'=>'string'], +'odbc_procedures' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'procedure'=>'string'], +'odbc_result' => ['mixed|false', 'statement'=>'resource', 'field'=>'mixed'], +'odbc_result_all' => ['int|false', 'statement'=>'resource', 'format='=>'string'], +'odbc_rollback' => ['bool', 'odbc'=>'resource'], +'odbc_setoption' => ['bool', 'odbc'=>'resource', 'which'=>'int', 'option'=>'int', 'value'=>'int'], +'odbc_specialcolumns' => ['resource|false', 'odbc'=>'resource', 'type'=>'int', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'scope'=>'int', 'nullable'=>'int'], +'odbc_statistics' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'unique'=>'int', 'accuracy'=>'int'], +'odbc_tableprivileges' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string'], +'odbc_tables' => ['resource|false', 'odbc'=>'resource', 'catalog='=>'string', 'schema='=>'string', 'table='=>'string', 'types='=>'string'], +'opcache_compile_file' => ['bool', 'filename'=>'string'], +'opcache_get_configuration' => ['array'], +'opcache_get_status' => ['array|false', 'include_scripts='=>'bool'], +'opcache_invalidate' => ['bool', 'filename'=>'string', 'force='=>'bool'], +'opcache_is_script_cached' => ['bool', 'filename'=>'string'], +'opcache_reset' => ['bool'], +'openal_buffer_create' => ['resource'], +'openal_buffer_data' => ['bool', 'buffer'=>'resource', 'format'=>'int', 'data'=>'string', 'freq'=>'int'], +'openal_buffer_destroy' => ['bool', 'buffer'=>'resource'], +'openal_buffer_get' => ['int', 'buffer'=>'resource', 'property'=>'int'], +'openal_buffer_loadwav' => ['bool', 'buffer'=>'resource', 'wavfile'=>'string'], +'openal_context_create' => ['resource', 'device'=>'resource'], +'openal_context_current' => ['bool', 'context'=>'resource'], +'openal_context_destroy' => ['bool', 'context'=>'resource'], +'openal_context_process' => ['bool', 'context'=>'resource'], +'openal_context_suspend' => ['bool', 'context'=>'resource'], +'openal_device_close' => ['bool', 'device'=>'resource'], +'openal_device_open' => ['resource|false', 'device_desc='=>'string'], +'openal_listener_get' => ['mixed', 'property'=>'int'], +'openal_listener_set' => ['bool', 'property'=>'int', 'setting'=>'mixed'], +'openal_source_create' => ['resource'], +'openal_source_destroy' => ['bool', 'source'=>'resource'], +'openal_source_get' => ['mixed', 'source'=>'resource', 'property'=>'int'], +'openal_source_pause' => ['bool', 'source'=>'resource'], +'openal_source_play' => ['bool', 'source'=>'resource'], +'openal_source_rewind' => ['bool', 'source'=>'resource'], +'openal_source_set' => ['bool', 'source'=>'resource', 'property'=>'int', 'setting'=>'mixed'], +'openal_source_stop' => ['bool', 'source'=>'resource'], +'openal_stream' => ['resource', 'source'=>'resource', 'format'=>'int', 'rate'=>'int'], +'opendir' => ['resource|false', 'directory'=>'string', 'context='=>'resource'], +'openlog' => ['bool', 'prefix'=>'string', 'flags'=>'int', 'facility'=>'int'], +'openssl_cipher_iv_length' => ['int|false', 'cipher_algo'=>'string'], +'openssl_csr_export' => ['bool', 'csr'=>'OpenSSLCertificateSigningRequest|string', '&w_output'=>'string', 'no_text='=>'bool'], +'openssl_csr_export_to_file' => ['bool', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'output_filename'=>'string', 'no_text='=>'bool'], +'openssl_csr_get_public_key' => ['OpenSSLAsymmetricKey|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'short_names='=>'bool'], +'openssl_csr_get_subject' => ['array|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'short_names='=>'bool'], +'openssl_csr_new' => ['OpenSSLCertificateSigningRequest|false', 'distinguished_names'=>'array', '&w_private_key'=>'OpenSSLAsymmetricKey', 'options='=>'array|null', 'extra_attributes='=>'array|null'], +'openssl_csr_sign' => ['OpenSSLCertificate|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'ca_certificate'=>'OpenSSLCertificate|string|null', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'days'=>'int', 'options='=>'array|null', 'serial='=>'int'], +'openssl_decrypt' => ['string|false', 'data'=>'string', 'cipher_algo'=>'string', 'passphrase'=>'string', 'options='=>'int', 'iv='=>'string', 'tag='=>'string', 'aad='=>'string'], +'openssl_dh_compute_key' => ['string|false', 'public_key'=>'string', 'private_key'=>'OpenSSLAsymmetricKey'], +'openssl_digest' => ['string|false', 'data'=>'string', 'digest_algo'=>'string', 'binary='=>'bool'], +'openssl_encrypt' => ['string|false', 'data'=>'string', 'cipher_algo'=>'string', 'passphrase'=>'string', 'options='=>'int', 'iv='=>'string', '&w_tag='=>'string', 'aad='=>'string', 'tag_length='=>'int'], +'openssl_error_string' => ['string|false'], +'openssl_free_key' => ['void', 'key'=>'OpenSSLAsymmetricKey'], +'openssl_get_cert_locations' => ['array'], +'openssl_get_cipher_methods' => ['array', 'aliases='=>'bool'], +'openssl_get_curve_names' => ['list'], +'openssl_get_md_methods' => ['array', 'aliases='=>'bool'], +'openssl_get_privatekey' => ['OpenSSLAsymmetricKey|false', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase='=>'?string'], +'openssl_get_publickey' => ['OpenSSLAsymmetricKey|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], +'openssl_open' => ['bool', 'data'=>'string', '&w_output'=>'string', 'encrypted_key'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'cipher_algo'=>'string', 'iv='=>'string|null'], +'openssl_pbkdf2' => ['string|false', 'password'=>'string', 'salt'=>'string', 'key_length'=>'int', 'iterations'=>'int', 'digest_algo='=>'string'], +'openssl_pkcs12_export' => ['bool', 'certificate'=>'OpenSSLCertificate|string', '&w_output'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase'=>'string', 'options='=>'array'], +'openssl_pkcs12_export_to_file' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'output_filename'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase'=>'string', 'options='=>'array'], +'openssl_pkcs12_read' => ['bool', 'pkcs12'=>'string', '&w_certificates'=>'array', 'passphrase'=>'string'], +'openssl_pkcs7_decrypt' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|string', 'private_key='=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string|null'], +'openssl_pkcs7_encrypt' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|list|string', 'headers'=>'array|null', 'flags='=>'int', 'cipher_algo='=>'int'], +'openssl_pkcs7_read' => ['bool', 'input_filename'=>'string', '&w_certificates'=>'array'], +'openssl_pkcs7_sign' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'headers'=>'array|null', 'flags='=>'int', 'untrusted_certificates_filename='=>'string|null'], +'openssl_pkcs7_verify' => ['bool|int', 'input_filename'=>'string', 'flags'=>'int', 'signers_certificates_filename='=>'string', 'ca_info='=>'array', 'untrusted_certificates_filename='=>'string', 'content='=>'string', 'output_filename='=>'string'], +'openssl_pkey_derive' => ['string|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'key_length='=>'int'], +'openssl_pkey_export' => ['bool', 'key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', '&w_output'=>'string', 'passphrase='=>'string|null', 'options='=>'array|null'], +'openssl_pkey_export_to_file' => ['bool', 'key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'output_filename'=>'string', 'passphrase='=>'string|null', 'options='=>'array|null'], +'openssl_pkey_free' => ['void', 'key'=>'OpenSSLAsymmetricKey'], +'openssl_pkey_get_details' => ['array|false', 'key'=>'OpenSSLAsymmetricKey'], +'openssl_pkey_get_private' => ['OpenSSLAsymmetricKey|false', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string', 'passphrase='=>'?string'], +'openssl_pkey_get_public' => ['OpenSSLAsymmetricKey|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], +'openssl_pkey_new' => ['OpenSSLAsymmetricKey|false', 'options='=>'array|null'], +'openssl_private_decrypt' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], +'openssl_private_encrypt' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], +'openssl_public_decrypt' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], +'openssl_public_encrypt' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], +'openssl_random_pseudo_bytes' => ['string|false', 'length'=>'int', '&w_strong_result='=>'bool'], +'openssl_seal' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&w_encrypted_keys'=>'array', 'public_key'=>'list', 'cipher_algo'=>'string', '&rw_iv='=>'string'], +'openssl_sign' => ['bool', 'data'=>'string', '&w_signature'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'algorithm='=>'int|string'], +'openssl_spki_export' => ['?string', 'spki'=>'string'], +'openssl_spki_export_challenge' => ['?string', 'spki'=>'string'], +'openssl_spki_new' => ['string|false', 'private_key'=>'OpenSSLAsymmetricKey', 'challenge'=>'string', 'digest_algo='=>'int'], +'openssl_spki_verify' => ['bool', 'spki'=>'string'], +'openssl_verify' => ['-1|0|1|false', 'data'=>'string', 'signature'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'algorithm='=>'int|string'], +'openssl_x509_check_private_key' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], +'openssl_x509_checkpurpose' => ['bool|int', 'certificate'=>'OpenSSLCertificate|string', 'purpose'=>'int', 'ca_info='=>'array', 'untrusted_certificates_file='=>'string|null'], +'openssl_x509_export' => ['bool', 'certificate'=>'OpenSSLCertificate|string', '&w_output'=>'string', 'no_text='=>'bool'], +'openssl_x509_export_to_file' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'output_filename'=>'string', 'no_text='=>'bool'], +'openssl_x509_fingerprint' => ['string|false', 'certificate'=>'OpenSSLCertificate|string', 'digest_algo='=>'string', 'binary='=>'bool'], +'openssl_x509_free' => ['void', 'certificate'=>'OpenSSLCertificate'], +'openssl_x509_parse' => ['array|false', 'certificate'=>'OpenSSLCertificate|string', 'short_names='=>'bool'], +'openssl_x509_read' => ['OpenSSLCertificate|false', 'certificate'=>'OpenSSLCertificate|string'], +'ord' => ['int', 'character'=>'string'], +'OuterIterator::current' => ['mixed'], +'OuterIterator::getInnerIterator' => ['Iterator'], +'OuterIterator::key' => ['int|string'], +'OuterIterator::next' => ['void'], +'OuterIterator::rewind' => ['void'], +'OuterIterator::valid' => ['bool'], +'OutOfBoundsException::__clone' => ['void'], +'OutOfBoundsException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OutOfBoundsException'], +'OutOfBoundsException::__toString' => ['string'], +'OutOfBoundsException::getCode' => ['int'], +'OutOfBoundsException::getFile' => ['string'], +'OutOfBoundsException::getLine' => ['int'], +'OutOfBoundsException::getMessage' => ['string'], +'OutOfBoundsException::getPrevious' => ['Throwable|OutOfBoundsException|null'], +'OutOfBoundsException::getTrace' => ['list\',args?:array}>'], +'OutOfBoundsException::getTraceAsString' => ['string'], +'OutOfRangeException::__clone' => ['void'], +'OutOfRangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OutOfRangeException'], +'OutOfRangeException::__toString' => ['string'], +'OutOfRangeException::getCode' => ['int'], +'OutOfRangeException::getFile' => ['string'], +'OutOfRangeException::getLine' => ['int'], +'OutOfRangeException::getMessage' => ['string'], +'OutOfRangeException::getPrevious' => ['Throwable|OutOfRangeException|null'], +'OutOfRangeException::getTrace' => ['list\',args?:array}>'], +'OutOfRangeException::getTraceAsString' => ['string'], +'output_add_rewrite_var' => ['bool', 'name'=>'string', 'value'=>'string'], +'output_cache_disable' => ['void'], +'output_cache_disable_compression' => ['void'], +'output_cache_exists' => ['bool', 'key'=>'string', 'lifetime'=>'int'], +'output_cache_fetch' => ['string', 'key'=>'string', 'function'=>'', 'lifetime'=>'int'], +'output_cache_get' => ['mixed|false', 'key'=>'string', 'lifetime'=>'int'], +'output_cache_output' => ['string', 'key'=>'string', 'function'=>'', 'lifetime'=>'int'], +'output_cache_put' => ['bool', 'key'=>'string', 'data'=>'mixed'], +'output_cache_remove' => ['bool', 'filename'=>''], +'output_cache_remove_key' => ['bool', 'key'=>'string'], +'output_cache_remove_url' => ['bool', 'url'=>'string'], +'output_cache_stop' => ['void'], +'output_reset_rewrite_vars' => ['bool'], +'outputformatObj::getOption' => ['string', 'property_name'=>'string'], +'outputformatObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'outputformatObj::setOption' => ['void', 'property_name'=>'string', 'new_value'=>'string'], +'outputformatObj::validate' => ['int'], +'OverflowException::__clone' => ['void'], +'OverflowException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OverflowException'], +'OverflowException::__toString' => ['string'], +'OverflowException::getCode' => ['int'], +'OverflowException::getFile' => ['string'], +'OverflowException::getLine' => ['int'], +'OverflowException::getMessage' => ['string'], +'OverflowException::getPrevious' => ['Throwable|OverflowException|null'], +'OverflowException::getTrace' => ['list\',args?:array}>'], +'OverflowException::getTraceAsString' => ['string'], +'overload' => ['', 'class_name'=>'string'], +'override_function' => ['bool', 'function_name'=>'string', 'function_args'=>'string', 'function_code'=>'string'], +'OwsrequestObj::__construct' => ['void'], +'OwsrequestObj::addParameter' => ['int', 'name'=>'string', 'value'=>'string'], +'OwsrequestObj::getName' => ['string', 'index'=>'int'], +'OwsrequestObj::getValue' => ['string', 'index'=>'int'], +'OwsrequestObj::getValueByName' => ['string', 'name'=>'string'], +'OwsrequestObj::loadParams' => ['int'], +'OwsrequestObj::setParameter' => ['int', 'name'=>'string', 'value'=>'string'], +'pack' => ['string|false', 'format'=>'string', '...values='=>'mixed'], +'parallel\Future::done' => ['bool'], +'parallel\Future::select' => ['mixed', '&resolving'=>'parallel\Future[]', '&w_resolved'=>'parallel\Future[]', '&w_errored'=>'parallel\Future[]', '&w_timedout='=>'parallel\Future[]', 'timeout='=>'int'], +'parallel\Future::value' => ['mixed', 'timeout='=>'int'], +'parallel\Runtime::__construct' => ['void', 'arg'=>'string|array'], +'parallel\Runtime::__construct\'1' => ['void', 'bootstrap'=>'string', 'configuration'=>'array'], +'parallel\Runtime::close' => ['void'], +'parallel\Runtime::kill' => ['void'], +'parallel\Runtime::run' => ['?parallel\Future', 'closure'=>'Closure', 'args='=>'array'], +'ParentIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'], +'ParentIterator::accept' => ['bool'], +'ParentIterator::getChildren' => ['ParentIterator'], +'ParentIterator::hasChildren' => ['bool'], +'ParentIterator::next' => ['void'], +'ParentIterator::rewind' => ['void'], +'ParentIterator::valid' => [''], +'Parle\Lexer::advance' => ['void'], +'Parle\Lexer::build' => ['void'], +'Parle\Lexer::callout' => ['void', 'id'=>'int', 'callback'=>'callable'], +'Parle\Lexer::consume' => ['void', 'data'=>'string'], +'Parle\Lexer::dump' => ['void'], +'Parle\Lexer::getToken' => ['Parle\Token'], +'Parle\Lexer::insertMacro' => ['void', 'name'=>'string', 'regex'=>'string'], +'Parle\Lexer::push' => ['void', 'regex'=>'string', 'id'=>'int'], +'Parle\Lexer::reset' => ['void', 'pos'=>'int'], +'Parle\Parser::advance' => ['void'], +'Parle\Parser::build' => ['void'], +'Parle\Parser::consume' => ['void', 'data'=>'string', 'lexer'=>'Parle\Lexer'], +'Parle\Parser::dump' => ['void'], +'Parle\Parser::errorInfo' => ['Parle\ErrorInfo'], +'Parle\Parser::left' => ['void', 'token'=>'string'], +'Parle\Parser::nonassoc' => ['void', 'token'=>'string'], +'Parle\Parser::precedence' => ['void', 'token'=>'string'], +'Parle\Parser::push' => ['int', 'name'=>'string', 'rule'=>'string'], +'Parle\Parser::reset' => ['void', 'tokenId'=>'int'], +'Parle\Parser::right' => ['void', 'token'=>'string'], +'Parle\Parser::sigil' => ['string', 'idx'=>'array'], +'Parle\Parser::token' => ['void', 'token'=>'string'], +'Parle\Parser::tokenId' => ['int', 'token'=>'string'], +'Parle\Parser::trace' => ['string'], +'Parle\Parser::validate' => ['bool', 'data'=>'string', 'lexer'=>'Parle\Lexer'], +'Parle\RLexer::advance' => ['void'], +'Parle\RLexer::build' => ['void'], +'Parle\RLexer::callout' => ['void', 'id'=>'int', 'callback'=>'callable'], +'Parle\RLexer::consume' => ['void', 'data'=>'string'], +'Parle\RLexer::dump' => ['void'], +'Parle\RLexer::getToken' => ['Parle\Token'], +'parle\rlexer::insertMacro' => ['void', 'name'=>'string', 'regex'=>'string'], +'Parle\RLexer::push' => ['void', 'state'=>'string', 'regex'=>'string', 'newState'=>'string'], +'Parle\RLexer::pushState' => ['int', 'state'=>'string'], +'Parle\RLexer::reset' => ['void', 'pos'=>'int'], +'Parle\RParser::advance' => ['void'], +'Parle\RParser::build' => ['void'], +'Parle\RParser::consume' => ['void', 'data'=>'string', 'lexer'=>'Parle\Lexer'], +'Parle\RParser::dump' => ['void'], +'Parle\RParser::errorInfo' => ['Parle\ErrorInfo'], +'Parle\RParser::left' => ['void', 'token'=>'string'], +'Parle\RParser::nonassoc' => ['void', 'token'=>'string'], +'Parle\RParser::precedence' => ['void', 'token'=>'string'], +'Parle\RParser::push' => ['int', 'name'=>'string', 'rule'=>'string'], +'Parle\RParser::reset' => ['void', 'tokenId'=>'int'], +'Parle\RParser::right' => ['void', 'token'=>'string'], +'Parle\RParser::sigil' => ['string', 'idx'=>'array'], +'Parle\RParser::token' => ['void', 'token'=>'string'], +'Parle\RParser::tokenId' => ['int', 'token'=>'string'], +'Parle\RParser::trace' => ['string'], +'Parle\RParser::validate' => ['bool', 'data'=>'string', 'lexer'=>'Parle\Lexer'], +'Parle\Stack::pop' => ['void'], +'Parle\Stack::push' => ['void', 'item'=>'mixed'], +'parse_ini_file' => ['array|false', 'filename'=>'string', 'process_sections='=>'bool', 'scanner_mode='=>'int'], +'parse_ini_string' => ['array|false', 'ini_string'=>'string', 'process_sections='=>'bool', 'scanner_mode='=>'int'], +'parse_str' => ['void', 'string'=>'string', '&w_result'=>'array'], +'parse_url' => ['mixed|false', 'url'=>'string', 'component='=>'int'], +'ParseError::__clone' => ['void'], +'ParseError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?ParseError'], +'ParseError::__toString' => ['string'], +'ParseError::getCode' => ['int'], +'ParseError::getFile' => ['string'], +'ParseError::getLine' => ['int'], +'ParseError::getMessage' => ['string'], +'ParseError::getPrevious' => ['Throwable|ParseError|null'], +'ParseError::getTrace' => ['list\',args?:array}>'], +'ParseError::getTraceAsString' => ['string'], +'parsekit_compile_file' => ['array', 'filename'=>'string', 'errors='=>'array', 'options='=>'int'], +'parsekit_compile_string' => ['array', 'phpcode'=>'string', 'errors='=>'array', 'options='=>'int'], +'parsekit_func_arginfo' => ['array', 'function'=>'mixed'], +'passthru' => ['void', 'command'=>'string', '&w_result_code='=>'int'], +'password_get_info' => ['array', 'hash'=>'string'], +'password_hash' => ['string', 'password'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], +'password_make_salt' => ['bool', 'password'=>'string', 'hash'=>'string'], +'password_needs_rehash' => ['bool', 'hash'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], +'password_verify' => ['bool', 'password'=>'string', 'hash'=>'string'], +'pathinfo' => ['array|string', 'path'=>'string', 'flags='=>'int'], +'pclose' => ['int', 'handle'=>'resource'], +'pcnlt_sigwaitinfo' => ['int', 'set'=>'array', '&w_siginfo'=>'array'], +'pcntl_alarm' => ['int', 'seconds'=>'int'], +'pcntl_async_signals' => ['bool', 'enable='=>'bool'], +'pcntl_errno' => ['int'], +'pcntl_exec' => ['null|false', 'path'=>'string', 'args='=>'array', 'env_vars='=>'array'], +'pcntl_fork' => ['int'], +'pcntl_get_last_error' => ['int'], +'pcntl_getpriority' => ['int', 'process_id='=>'int', 'mode='=>'int'], +'pcntl_setpriority' => ['bool', 'priority'=>'int', 'process_id='=>'int', 'mode='=>'int'], +'pcntl_signal' => ['bool', 'signal'=>'int', 'handler'=>'callable():void|callable(int):void|callable(int,array):void|int', 'restart_syscalls='=>'bool'], +'pcntl_signal_dispatch' => ['bool'], +'pcntl_signal_get_handler' => ['int|string', 'signal'=>'int'], +'pcntl_sigprocmask' => ['bool', 'mode'=>'int', 'signals'=>'array', '&w_old_signals='=>'array'], +'pcntl_sigtimedwait' => ['int', 'signals'=>'array', '&w_info='=>'array', 'seconds='=>'int', 'nanoseconds='=>'int'], +'pcntl_sigwaitinfo' => ['int', 'signals'=>'array', '&w_info='=>'array'], +'pcntl_strerror' => ['string|false', 'error_code'=>'int'], +'pcntl_wait' => ['int', '&w_status'=>'int', 'flags='=>'int', '&w_resource_usage='=>'array'], +'pcntl_waitpid' => ['int', 'process_id'=>'int', '&w_status'=>'int', 'flags='=>'int', '&w_resource_usage='=>'array'], +'pcntl_wexitstatus' => ['int', 'status'=>'int'], +'pcntl_wifcontinued' => ['bool', 'status'=>'int'], +'pcntl_wifexited' => ['bool', 'status'=>'int'], +'pcntl_wifsignaled' => ['bool', 'status'=>'int'], +'pcntl_wifstopped' => ['bool', 'status'=>'int'], +'pcntl_wstopsig' => ['int', 'status'=>'int'], +'pcntl_wtermsig' => ['int', 'status'=>'int'], +'PDF_activate_item' => ['bool', 'pdfdoc'=>'resource', 'id'=>'int'], +'PDF_add_launchlink' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], +'PDF_add_locallink' => ['bool', 'pdfdoc'=>'resource', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'page'=>'int', 'dest'=>'string'], +'PDF_add_nameddest' => ['bool', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], +'PDF_add_note' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], +'PDF_add_pdflink' => ['bool', 'pdfdoc'=>'resource', 'bottom_left_x'=>'float', 'bottom_left_y'=>'float', 'up_right_x'=>'float', 'up_right_y'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], +'PDF_add_table_cell' => ['int', 'pdfdoc'=>'resource', 'table'=>'int', 'column'=>'int', 'row'=>'int', 'text'=>'string', 'optlist'=>'string'], +'PDF_add_textflow' => ['int', 'pdfdoc'=>'resource', 'textflow'=>'int', 'text'=>'string', 'optlist'=>'string'], +'PDF_add_thumbnail' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int'], +'PDF_add_weblink' => ['bool', 'pdfdoc'=>'resource', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'url'=>'string'], +'PDF_arc' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], +'PDF_arcn' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], +'PDF_attach_file' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'description'=>'string', 'author'=>'string', 'mimetype'=>'string', 'icon'=>'string'], +'PDF_begin_document' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string'], +'PDF_begin_font' => ['bool', 'pdfdoc'=>'resource', 'filename'=>'string', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float', 'optlist'=>'string'], +'PDF_begin_glyph' => ['bool', 'pdfdoc'=>'resource', 'glyphname'=>'string', 'wx'=>'float', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float'], +'PDF_begin_item' => ['int', 'pdfdoc'=>'resource', 'tag'=>'string', 'optlist'=>'string'], +'PDF_begin_layer' => ['bool', 'pdfdoc'=>'resource', 'layer'=>'int'], +'PDF_begin_page' => ['bool', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float'], +'PDF_begin_page_ext' => ['bool', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], +'PDF_begin_pattern' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], +'PDF_begin_template' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float'], +'PDF_begin_template_ext' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], +'PDF_circle' => ['bool', 'pdfdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float'], +'PDF_clip' => ['bool', 'p'=>'resource'], +'PDF_close' => ['bool', 'p'=>'resource'], +'PDF_close_image' => ['bool', 'p'=>'resource', 'image'=>'int'], +'PDF_close_pdi' => ['bool', 'p'=>'resource', 'doc'=>'int'], +'PDF_close_pdi_page' => ['bool', 'p'=>'resource', 'page'=>'int'], +'PDF_closepath' => ['bool', 'p'=>'resource'], +'PDF_closepath_fill_stroke' => ['bool', 'p'=>'resource'], +'PDF_closepath_stroke' => ['bool', 'p'=>'resource'], +'PDF_concat' => ['bool', 'p'=>'resource', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], +'PDF_continue_text' => ['bool', 'p'=>'resource', 'text'=>'string'], +'PDF_create_3dview' => ['int', 'pdfdoc'=>'resource', 'username'=>'string', 'optlist'=>'string'], +'PDF_create_action' => ['int', 'pdfdoc'=>'resource', 'type'=>'string', 'optlist'=>'string'], +'PDF_create_annotation' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'type'=>'string', 'optlist'=>'string'], +'PDF_create_bookmark' => ['int', 'pdfdoc'=>'resource', 'text'=>'string', 'optlist'=>'string'], +'PDF_create_field' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'name'=>'string', 'type'=>'string', 'optlist'=>'string'], +'PDF_create_fieldgroup' => ['bool', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], +'PDF_create_gstate' => ['int', 'pdfdoc'=>'resource', 'optlist'=>'string'], +'PDF_create_pvf' => ['bool', 'pdfdoc'=>'resource', 'filename'=>'string', 'data'=>'string', 'optlist'=>'string'], +'PDF_create_textflow' => ['int', 'pdfdoc'=>'resource', 'text'=>'string', 'optlist'=>'string'], +'PDF_curveto' => ['bool', 'p'=>'resource', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], +'PDF_define_layer' => ['int', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], +'PDF_delete' => ['bool', 'pdfdoc'=>'resource'], +'PDF_delete_pvf' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string'], +'PDF_delete_table' => ['bool', 'pdfdoc'=>'resource', 'table'=>'int', 'optlist'=>'string'], +'PDF_delete_textflow' => ['bool', 'pdfdoc'=>'resource', 'textflow'=>'int'], +'PDF_encoding_set_char' => ['bool', 'pdfdoc'=>'resource', 'encoding'=>'string', 'slot'=>'int', 'glyphname'=>'string', 'uv'=>'int'], +'PDF_end_document' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], +'PDF_end_font' => ['bool', 'pdfdoc'=>'resource'], +'PDF_end_glyph' => ['bool', 'pdfdoc'=>'resource'], +'PDF_end_item' => ['bool', 'pdfdoc'=>'resource', 'id'=>'int'], +'PDF_end_layer' => ['bool', 'pdfdoc'=>'resource'], +'PDF_end_page' => ['bool', 'p'=>'resource'], +'PDF_end_page_ext' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], +'PDF_end_pattern' => ['bool', 'p'=>'resource'], +'PDF_end_template' => ['bool', 'p'=>'resource'], +'PDF_endpath' => ['bool', 'p'=>'resource'], +'PDF_fill' => ['bool', 'p'=>'resource'], +'PDF_fill_imageblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'image'=>'int', 'optlist'=>'string'], +'PDF_fill_pdfblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'contents'=>'int', 'optlist'=>'string'], +'PDF_fill_stroke' => ['bool', 'p'=>'resource'], +'PDF_fill_textblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'text'=>'string', 'optlist'=>'string'], +'PDF_findfont' => ['int', 'p'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'embed'=>'int'], +'PDF_fit_image' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], +'PDF_fit_pdi_page' => ['bool', 'pdfdoc'=>'resource', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], +'PDF_fit_table' => ['string', 'pdfdoc'=>'resource', 'table'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], +'PDF_fit_textflow' => ['string', 'pdfdoc'=>'resource', 'textflow'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], +'PDF_fit_textline' => ['bool', 'pdfdoc'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], +'PDF_get_apiname' => ['string', 'pdfdoc'=>'resource'], +'PDF_get_buffer' => ['string', 'p'=>'resource'], +'PDF_get_errmsg' => ['string', 'pdfdoc'=>'resource'], +'PDF_get_errnum' => ['int', 'pdfdoc'=>'resource'], +'PDF_get_majorversion' => ['int'], +'PDF_get_minorversion' => ['int'], +'PDF_get_parameter' => ['string', 'p'=>'resource', 'key'=>'string', 'modifier'=>'float'], +'PDF_get_pdi_parameter' => ['string', 'p'=>'resource', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], +'PDF_get_pdi_value' => ['float', 'p'=>'resource', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], +'PDF_get_value' => ['float', 'p'=>'resource', 'key'=>'string', 'modifier'=>'float'], +'PDF_info_font' => ['float', 'pdfdoc'=>'resource', 'font'=>'int', 'keyword'=>'string', 'optlist'=>'string'], +'PDF_info_matchbox' => ['float', 'pdfdoc'=>'resource', 'boxname'=>'string', 'num'=>'int', 'keyword'=>'string'], +'PDF_info_table' => ['float', 'pdfdoc'=>'resource', 'table'=>'int', 'keyword'=>'string'], +'PDF_info_textflow' => ['float', 'pdfdoc'=>'resource', 'textflow'=>'int', 'keyword'=>'string'], +'PDF_info_textline' => ['float', 'pdfdoc'=>'resource', 'text'=>'string', 'keyword'=>'string', 'optlist'=>'string'], +'PDF_initgraphics' => ['bool', 'p'=>'resource'], +'PDF_lineto' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], +'PDF_load_3ddata' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string'], +'PDF_load_font' => ['int', 'pdfdoc'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'optlist'=>'string'], +'PDF_load_iccprofile' => ['int', 'pdfdoc'=>'resource', 'profilename'=>'string', 'optlist'=>'string'], +'PDF_load_image' => ['int', 'pdfdoc'=>'resource', 'imagetype'=>'string', 'filename'=>'string', 'optlist'=>'string'], +'PDF_makespotcolor' => ['int', 'p'=>'resource', 'spotname'=>'string'], +'PDF_moveto' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], +'PDF_new' => ['resource'], +'PDF_open_ccitt' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'bitreverse'=>'int', 'k'=>'int', 'blackls1'=>'int'], +'PDF_open_file' => ['bool', 'p'=>'resource', 'filename'=>'string'], +'PDF_open_image' => ['int', 'p'=>'resource', 'imagetype'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], +'PDF_open_image_file' => ['int', 'p'=>'resource', 'imagetype'=>'string', 'filename'=>'string', 'stringparam'=>'string', 'intparam'=>'int'], +'PDF_open_memory_image' => ['int', 'p'=>'resource', 'image'=>'resource'], +'PDF_open_pdi' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string', 'length'=>'int'], +'PDF_open_pdi_document' => ['int', 'p'=>'resource', 'filename'=>'string', 'optlist'=>'string'], +'PDF_open_pdi_page' => ['int', 'p'=>'resource', 'doc'=>'int', 'pagenumber'=>'int', 'optlist'=>'string'], +'PDF_pcos_get_number' => ['float', 'p'=>'resource', 'doc'=>'int', 'path'=>'string'], +'PDF_pcos_get_stream' => ['string', 'p'=>'resource', 'doc'=>'int', 'optlist'=>'string', 'path'=>'string'], +'PDF_pcos_get_string' => ['string', 'p'=>'resource', 'doc'=>'int', 'path'=>'string'], +'PDF_place_image' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], +'PDF_place_pdi_page' => ['bool', 'pdfdoc'=>'resource', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'sx'=>'float', 'sy'=>'float'], +'PDF_process_pdi' => ['int', 'pdfdoc'=>'resource', 'doc'=>'int', 'page'=>'int', 'optlist'=>'string'], +'PDF_rect' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], +'PDF_restore' => ['bool', 'p'=>'resource'], +'PDF_resume_page' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], +'PDF_rotate' => ['bool', 'p'=>'resource', 'phi'=>'float'], +'PDF_save' => ['bool', 'p'=>'resource'], +'PDF_scale' => ['bool', 'p'=>'resource', 'sx'=>'float', 'sy'=>'float'], +'PDF_set_border_color' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'PDF_set_border_dash' => ['bool', 'pdfdoc'=>'resource', 'black'=>'float', 'white'=>'float'], +'PDF_set_border_style' => ['bool', 'pdfdoc'=>'resource', 'style'=>'string', 'width'=>'float'], +'PDF_set_gstate' => ['bool', 'pdfdoc'=>'resource', 'gstate'=>'int'], +'PDF_set_info' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], +'PDF_set_layer_dependency' => ['bool', 'pdfdoc'=>'resource', 'type'=>'string', 'optlist'=>'string'], +'PDF_set_parameter' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], +'PDF_set_text_pos' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], +'PDF_set_value' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'float'], +'PDF_setcolor' => ['bool', 'p'=>'resource', 'fstype'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], +'PDF_setdash' => ['bool', 'pdfdoc'=>'resource', 'b'=>'float', 'w'=>'float'], +'PDF_setdashpattern' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], +'PDF_setflat' => ['bool', 'pdfdoc'=>'resource', 'flatness'=>'float'], +'PDF_setfont' => ['bool', 'pdfdoc'=>'resource', 'font'=>'int', 'fontsize'=>'float'], +'PDF_setgray' => ['bool', 'p'=>'resource', 'g'=>'float'], +'PDF_setgray_fill' => ['bool', 'p'=>'resource', 'g'=>'float'], +'PDF_setgray_stroke' => ['bool', 'p'=>'resource', 'g'=>'float'], +'PDF_setlinecap' => ['bool', 'p'=>'resource', 'linecap'=>'int'], +'PDF_setlinejoin' => ['bool', 'p'=>'resource', 'value'=>'int'], +'PDF_setlinewidth' => ['bool', 'p'=>'resource', 'width'=>'float'], +'PDF_setmatrix' => ['bool', 'p'=>'resource', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], +'PDF_setmiterlimit' => ['bool', 'pdfdoc'=>'resource', 'miter'=>'float'], +'PDF_setrgbcolor' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'PDF_setrgbcolor_fill' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'PDF_setrgbcolor_stroke' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'PDF_shading' => ['int', 'pdfdoc'=>'resource', 'shtype'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], +'PDF_shading_pattern' => ['int', 'pdfdoc'=>'resource', 'shading'=>'int', 'optlist'=>'string'], +'PDF_shfill' => ['bool', 'pdfdoc'=>'resource', 'shading'=>'int'], +'PDF_show' => ['bool', 'pdfdoc'=>'resource', 'text'=>'string'], +'PDF_show_boxed' => ['int', 'p'=>'resource', 'text'=>'string', 'left'=>'float', 'top'=>'float', 'width'=>'float', 'height'=>'float', 'mode'=>'string', 'feature'=>'string'], +'PDF_show_xy' => ['bool', 'p'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float'], +'PDF_skew' => ['bool', 'p'=>'resource', 'alpha'=>'float', 'beta'=>'float'], +'PDF_stringwidth' => ['float', 'p'=>'resource', 'text'=>'string', 'font'=>'int', 'fontsize'=>'float'], +'PDF_stroke' => ['bool', 'p'=>'resource'], +'PDF_suspend_page' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], +'PDF_translate' => ['bool', 'p'=>'resource', 'tx'=>'float', 'ty'=>'float'], +'PDF_utf16_to_utf8' => ['string', 'pdfdoc'=>'resource', 'utf16string'=>'string'], +'PDF_utf32_to_utf16' => ['string', 'pdfdoc'=>'resource', 'utf32string'=>'string', 'ordering'=>'string'], +'PDF_utf8_to_utf16' => ['string', 'pdfdoc'=>'resource', 'utf8string'=>'string', 'ordering'=>'string'], +'PDFlib::activate_item' => ['bool', 'id'=>''], +'PDFlib::add_launchlink' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], +'PDFlib::add_locallink' => ['bool', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'page'=>'int', 'dest'=>'string'], +'PDFlib::add_nameddest' => ['bool', 'name'=>'string', 'optlist'=>'string'], +'PDFlib::add_note' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], +'PDFlib::add_pdflink' => ['bool', 'bottom_left_x'=>'float', 'bottom_left_y'=>'float', 'up_right_x'=>'float', 'up_right_y'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], +'PDFlib::add_table_cell' => ['int', 'table'=>'int', 'column'=>'int', 'row'=>'int', 'text'=>'string', 'optlist'=>'string'], +'PDFlib::add_textflow' => ['int', 'textflow'=>'int', 'text'=>'string', 'optlist'=>'string'], +'PDFlib::add_thumbnail' => ['bool', 'image'=>'int'], +'PDFlib::add_weblink' => ['bool', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'url'=>'string'], +'PDFlib::arc' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], +'PDFlib::arcn' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], +'PDFlib::attach_file' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'description'=>'string', 'author'=>'string', 'mimetype'=>'string', 'icon'=>'string'], +'PDFlib::begin_document' => ['int', 'filename'=>'string', 'optlist'=>'string'], +'PDFlib::begin_font' => ['bool', 'filename'=>'string', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float', 'optlist'=>'string'], +'PDFlib::begin_glyph' => ['bool', 'glyphname'=>'string', 'wx'=>'float', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float'], +'PDFlib::begin_item' => ['int', 'tag'=>'string', 'optlist'=>'string'], +'PDFlib::begin_layer' => ['bool', 'layer'=>'int'], +'PDFlib::begin_page' => ['bool', 'width'=>'float', 'height'=>'float'], +'PDFlib::begin_page_ext' => ['bool', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], +'PDFlib::begin_pattern' => ['int', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], +'PDFlib::begin_template' => ['int', 'width'=>'float', 'height'=>'float'], +'PDFlib::begin_template_ext' => ['int', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], +'PDFlib::circle' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float'], +'PDFlib::clip' => ['bool'], +'PDFlib::close' => ['bool'], +'PDFlib::close_image' => ['bool', 'image'=>'int'], +'PDFlib::close_pdi' => ['bool', 'doc'=>'int'], +'PDFlib::close_pdi_page' => ['bool', 'page'=>'int'], +'PDFlib::closepath' => ['bool'], +'PDFlib::closepath_fill_stroke' => ['bool'], +'PDFlib::closepath_stroke' => ['bool'], +'PDFlib::concat' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], +'PDFlib::continue_text' => ['bool', 'text'=>'string'], +'PDFlib::create_3dview' => ['int', 'username'=>'string', 'optlist'=>'string'], +'PDFlib::create_action' => ['int', 'type'=>'string', 'optlist'=>'string'], +'PDFlib::create_annotation' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'type'=>'string', 'optlist'=>'string'], +'PDFlib::create_bookmark' => ['int', 'text'=>'string', 'optlist'=>'string'], +'PDFlib::create_field' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'name'=>'string', 'type'=>'string', 'optlist'=>'string'], +'PDFlib::create_fieldgroup' => ['bool', 'name'=>'string', 'optlist'=>'string'], +'PDFlib::create_gstate' => ['int', 'optlist'=>'string'], +'PDFlib::create_pvf' => ['bool', 'filename'=>'string', 'data'=>'string', 'optlist'=>'string'], +'PDFlib::create_textflow' => ['int', 'text'=>'string', 'optlist'=>'string'], +'PDFlib::curveto' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], +'PDFlib::define_layer' => ['int', 'name'=>'string', 'optlist'=>'string'], +'PDFlib::delete' => ['bool'], +'PDFlib::delete_pvf' => ['int', 'filename'=>'string'], +'PDFlib::delete_table' => ['bool', 'table'=>'int', 'optlist'=>'string'], +'PDFlib::delete_textflow' => ['bool', 'textflow'=>'int'], +'PDFlib::encoding_set_char' => ['bool', 'encoding'=>'string', 'slot'=>'int', 'glyphname'=>'string', 'uv'=>'int'], +'PDFlib::end_document' => ['bool', 'optlist'=>'string'], +'PDFlib::end_font' => ['bool'], +'PDFlib::end_glyph' => ['bool'], +'PDFlib::end_item' => ['bool', 'id'=>'int'], +'PDFlib::end_layer' => ['bool'], +'PDFlib::end_page' => ['bool', 'p'=>''], +'PDFlib::end_page_ext' => ['bool', 'optlist'=>'string'], +'PDFlib::end_pattern' => ['bool', 'p'=>''], +'PDFlib::end_template' => ['bool', 'p'=>''], +'PDFlib::endpath' => ['bool', 'p'=>''], +'PDFlib::fill' => ['bool'], +'PDFlib::fill_imageblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'image'=>'int', 'optlist'=>'string'], +'PDFlib::fill_pdfblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'contents'=>'int', 'optlist'=>'string'], +'PDFlib::fill_stroke' => ['bool'], +'PDFlib::fill_textblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'text'=>'string', 'optlist'=>'string'], +'PDFlib::findfont' => ['int', 'fontname'=>'string', 'encoding'=>'string', 'embed'=>'int'], +'PDFlib::fit_image' => ['bool', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], +'PDFlib::fit_pdi_page' => ['bool', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], +'PDFlib::fit_table' => ['string', 'table'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], +'PDFlib::fit_textflow' => ['string', 'textflow'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], +'PDFlib::fit_textline' => ['bool', 'text'=>'string', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], +'PDFlib::get_apiname' => ['string'], +'PDFlib::get_buffer' => ['string'], +'PDFlib::get_errmsg' => ['string'], +'PDFlib::get_errnum' => ['int'], +'PDFlib::get_majorversion' => ['int'], +'PDFlib::get_minorversion' => ['int'], +'PDFlib::get_parameter' => ['string', 'key'=>'string', 'modifier'=>'float'], +'PDFlib::get_pdi_parameter' => ['string', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], +'PDFlib::get_pdi_value' => ['float', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], +'PDFlib::get_value' => ['float', 'key'=>'string', 'modifier'=>'float'], +'PDFlib::info_font' => ['float', 'font'=>'int', 'keyword'=>'string', 'optlist'=>'string'], +'PDFlib::info_matchbox' => ['float', 'boxname'=>'string', 'num'=>'int', 'keyword'=>'string'], +'PDFlib::info_table' => ['float', 'table'=>'int', 'keyword'=>'string'], +'PDFlib::info_textflow' => ['float', 'textflow'=>'int', 'keyword'=>'string'], +'PDFlib::info_textline' => ['float', 'text'=>'string', 'keyword'=>'string', 'optlist'=>'string'], +'PDFlib::initgraphics' => ['bool'], +'PDFlib::lineto' => ['bool', 'x'=>'float', 'y'=>'float'], +'PDFlib::load_3ddata' => ['int', 'filename'=>'string', 'optlist'=>'string'], +'PDFlib::load_font' => ['int', 'fontname'=>'string', 'encoding'=>'string', 'optlist'=>'string'], +'PDFlib::load_iccprofile' => ['int', 'profilename'=>'string', 'optlist'=>'string'], +'PDFlib::load_image' => ['int', 'imagetype'=>'string', 'filename'=>'string', 'optlist'=>'string'], +'PDFlib::makespotcolor' => ['int', 'spotname'=>'string'], +'PDFlib::moveto' => ['bool', 'x'=>'float', 'y'=>'float'], +'PDFlib::open_ccitt' => ['int', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'BitReverse'=>'int', 'k'=>'int', 'Blackls1'=>'int'], +'PDFlib::open_file' => ['bool', 'filename'=>'string'], +'PDFlib::open_image' => ['int', 'imagetype'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], +'PDFlib::open_image_file' => ['int', 'imagetype'=>'string', 'filename'=>'string', 'stringparam'=>'string', 'intparam'=>'int'], +'PDFlib::open_memory_image' => ['int', 'image'=>'resource'], +'PDFlib::open_pdi' => ['int', 'filename'=>'string', 'optlist'=>'string', 'length'=>'int'], +'PDFlib::open_pdi_document' => ['int', 'filename'=>'string', 'optlist'=>'string'], +'PDFlib::open_pdi_page' => ['int', 'doc'=>'int', 'pagenumber'=>'int', 'optlist'=>'string'], +'PDFlib::pcos_get_number' => ['float', 'doc'=>'int', 'path'=>'string'], +'PDFlib::pcos_get_stream' => ['string', 'doc'=>'int', 'optlist'=>'string', 'path'=>'string'], +'PDFlib::pcos_get_string' => ['string', 'doc'=>'int', 'path'=>'string'], +'PDFlib::place_image' => ['bool', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], +'PDFlib::place_pdi_page' => ['bool', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'sx'=>'float', 'sy'=>'float'], +'PDFlib::process_pdi' => ['int', 'doc'=>'int', 'page'=>'int', 'optlist'=>'string'], +'PDFlib::rect' => ['bool', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], +'PDFlib::restore' => ['bool', 'p'=>''], +'PDFlib::resume_page' => ['bool', 'optlist'=>'string'], +'PDFlib::rotate' => ['bool', 'phi'=>'float'], +'PDFlib::save' => ['bool', 'p'=>''], +'PDFlib::scale' => ['bool', 'sx'=>'float', 'sy'=>'float'], +'PDFlib::set_border_color' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'PDFlib::set_border_dash' => ['bool', 'black'=>'float', 'white'=>'float'], +'PDFlib::set_border_style' => ['bool', 'style'=>'string', 'width'=>'float'], +'PDFlib::set_gstate' => ['bool', 'gstate'=>'int'], +'PDFlib::set_info' => ['bool', 'key'=>'string', 'value'=>'string'], +'PDFlib::set_layer_dependency' => ['bool', 'type'=>'string', 'optlist'=>'string'], +'PDFlib::set_parameter' => ['bool', 'key'=>'string', 'value'=>'string'], +'PDFlib::set_text_pos' => ['bool', 'x'=>'float', 'y'=>'float'], +'PDFlib::set_value' => ['bool', 'key'=>'string', 'value'=>'float'], +'PDFlib::setcolor' => ['bool', 'fstype'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], +'PDFlib::setdash' => ['bool', 'b'=>'float', 'w'=>'float'], +'PDFlib::setdashpattern' => ['bool', 'optlist'=>'string'], +'PDFlib::setflat' => ['bool', 'flatness'=>'float'], +'PDFlib::setfont' => ['bool', 'font'=>'int', 'fontsize'=>'float'], +'PDFlib::setgray' => ['bool', 'g'=>'float'], +'PDFlib::setgray_fill' => ['bool', 'g'=>'float'], +'PDFlib::setgray_stroke' => ['bool', 'g'=>'float'], +'PDFlib::setlinecap' => ['bool', 'linecap'=>'int'], +'PDFlib::setlinejoin' => ['bool', 'value'=>'int'], +'PDFlib::setlinewidth' => ['bool', 'width'=>'float'], +'PDFlib::setmatrix' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], +'PDFlib::setmiterlimit' => ['bool', 'miter'=>'float'], +'PDFlib::setrgbcolor' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'PDFlib::setrgbcolor_fill' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'PDFlib::setrgbcolor_stroke' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'PDFlib::shading' => ['int', 'shtype'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], +'PDFlib::shading_pattern' => ['int', 'shading'=>'int', 'optlist'=>'string'], +'PDFlib::shfill' => ['bool', 'shading'=>'int'], +'PDFlib::show' => ['bool', 'text'=>'string'], +'PDFlib::show_boxed' => ['int', 'text'=>'string', 'left'=>'float', 'top'=>'float', 'width'=>'float', 'height'=>'float', 'mode'=>'string', 'feature'=>'string'], +'PDFlib::show_xy' => ['bool', 'text'=>'string', 'x'=>'float', 'y'=>'float'], +'PDFlib::skew' => ['bool', 'alpha'=>'float', 'beta'=>'float'], +'PDFlib::stringwidth' => ['float', 'text'=>'string', 'font'=>'int', 'fontsize'=>'float'], +'PDFlib::stroke' => ['bool', 'p'=>''], +'PDFlib::suspend_page' => ['bool', 'optlist'=>'string'], +'PDFlib::translate' => ['bool', 'tx'=>'float', 'ty'=>'float'], +'PDFlib::utf16_to_utf8' => ['string', 'utf16string'=>'string'], +'PDFlib::utf32_to_utf16' => ['string', 'utf32string'=>'string', 'ordering'=>'string'], +'PDFlib::utf8_to_utf16' => ['string', 'utf8string'=>'string', 'ordering'=>'string'], +'PDO::__construct' => ['void', 'dsn'=>'string', 'username='=>'?string', 'passwd='=>'?string', 'options='=>'?array'], +'PDO::__sleep' => ['list'], +'PDO::__wakeup' => ['void'], +'PDO::beginTransaction' => ['bool'], +'PDO::commit' => ['bool'], +'PDO::cubrid_schema' => ['array', 'schema_type'=>'int', 'table_name='=>'string', 'col_name='=>'string'], +'PDO::errorCode' => ['?string'], +'PDO::errorInfo' => ['array{0: ?string, 1: ?int, 2: ?string, 3?: mixed, 4?: mixed}'], +'PDO::exec' => ['int|false', 'query'=>'string'], +'PDO::getAttribute' => ['', 'attribute'=>'int'], +'PDO::getAvailableDrivers' => ['array'], +'PDO::inTransaction' => ['bool'], +'PDO::lastInsertId' => ['string', 'name='=>'string|null'], +'PDO::pgsqlCopyFromArray' => ['bool', 'table_name'=>'string', 'rows'=>'array', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], +'PDO::pgsqlCopyFromFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], +'PDO::pgsqlCopyToArray' => ['array', 'table_name'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], +'PDO::pgsqlCopyToFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], +'PDO::pgsqlGetNotify' => ['array{message:string,pid:int,payload?:string}|false', 'result_type='=>'PDO::FETCH_*', 'ms_timeout='=>'int'], +'PDO::pgsqlGetPid' => ['int'], +'PDO::pgsqlLOBCreate' => ['string'], +'PDO::pgsqlLOBOpen' => ['resource', 'oid'=>'string', 'mode='=>'string'], +'PDO::pgsqlLOBUnlink' => ['bool', 'oid'=>'string'], +'PDO::prepare' => ['PDOStatement|false', 'statement'=>'string', 'options='=>'array'], +'PDO::query' => ['PDOStatement|false', 'sql'=>'string'], +'PDO::query\'1' => ['PDOStatement|false', 'sql'=>'string', 'fetch_column'=>'int', 'colno='=>'int'], +'PDO::query\'2' => ['PDOStatement|false', 'sql'=>'string', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs'=>'array'], +'PDO::query\'3' => ['PDOStatement|false', 'sql'=>'string', 'fetch_into'=>'int', 'object'=>'object'], +'PDO::quote' => ['string|false', 'string'=>'string', 'paramtype='=>'int'], +'PDO::rollBack' => ['bool'], +'PDO::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>''], +'PDO::sqliteCreateAggregate' => ['bool', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], +'PDO::sqliteCreateCollation' => ['bool', 'name'=>'string', 'callback'=>'callable'], +'PDO::sqliteCreateFunction' => ['bool', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], +'pdo_drivers' => ['array'], +'PDOException::getCode' => ['int|string'], +'PDOException::getFile' => ['string'], +'PDOException::getLine' => ['int'], +'PDOException::getMessage' => ['string'], +'PDOException::getPrevious' => ['?Throwable'], +'PDOException::getTrace' => ['list\',args?:array}>'], +'PDOException::getTraceAsString' => ['string'], +'PDOStatement::__sleep' => ['list'], +'PDOStatement::__wakeup' => ['void'], +'PDOStatement::bindColumn' => ['bool', 'column'=>'mixed', '&rw_var'=>'mixed', 'type='=>'int', 'maxLength='=>'int', 'driverOptions='=>'mixed'], +'PDOStatement::bindParam' => ['bool', 'param,'=>'string|int', '&rw_var'=>'mixed', 'type='=>'int', 'maxLength='=>'int', 'driverOptions='=>'mixed'], +'PDOStatement::bindValue' => ['bool', 'param'=>'string|int', 'value'=>'mixed', 'type='=>'int'], +'PDOStatement::closeCursor' => ['bool'], +'PDOStatement::columnCount' => ['int'], +'PDOStatement::debugDumpParams' => ['bool|null'], +'PDOStatement::errorCode' => ['string|null'], +'PDOStatement::errorInfo' => ['array{0: ?string, 1: ?int, 2: ?string, 3?: mixed, 4?: mixed}'], +'PDOStatement::execute' => ['bool', 'params='=>'?array'], +'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', 'ctorArgs='=>'?array'], +'PDOStatement::getAttribute' => ['mixed', 'attribute'=>'int'], +'PDOStatement::getColumnMeta' => ['array|false', 'column'=>'int'], +'PDOStatement::nextRowset' => ['bool'], +'PDOStatement::rowCount' => ['int'], +'PDOStatement::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>'mixed'], +'PDOStatement::setFetchMode' => ['bool', 'mode'=>'int', '...args='=> 'mixed'], +'pfsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float'], +'pg_affected_rows' => ['int', 'result'=>'\PgSql\Result'], +'pg_cancel_query' => ['bool', 'connection'=>'\PgSql\Connection'], +'pg_client_encoding' => ['string', 'connection='=>'\PgSql\Connection'], +'pg_close' => ['bool', 'connection='=>'\PgSql\Connection'], +'pg_connect' => ['\PgSql\Connection|false', 'connection_string'=>'string', 'flags='=>'int'], +'pg_connect_poll' => ['int', 'connection'=>'\PgSql\Connection'], +'pg_connection_busy' => ['bool', 'connection'=>'\PgSql\Connection'], +'pg_connection_reset' => ['bool', 'connection'=>'\PgSql\Connection'], +'pg_connection_status' => ['int', 'connection'=>'\PgSql\Connection'], +'pg_consume_input' => ['bool', 'connection'=>'\PgSql\Connection'], +'pg_convert' => ['array|false', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'values'=>'array', 'flags='=>'int'], +'pg_copy_from' => ['bool', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'rows'=>'array', 'separator='=>'string', 'null_as='=>'string'], +'pg_copy_to' => ['array|false', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'separator='=>'string', 'null_as='=>'string'], +'pg_dbname' => ['string', 'connection='=>'\PgSql\Connection'], +'pg_delete' => ['string|bool', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'conditions'=>'array', 'flags='=>'int'], +'pg_end_copy' => ['bool', 'connection='=>'\PgSql\Connection'], +'pg_escape_bytea' => ['string', 'connection'=>'\PgSql\Connection', 'string'=>'string'], +'pg_escape_bytea\'1' => ['string', 'connection'=>'string'], +'pg_escape_identifier' => ['string|false', 'connection'=>'\PgSql\Connection', 'string'=>'string'], +'pg_escape_identifier\'1' => ['string|false', 'connection'=>'string'], +'pg_escape_literal' => ['string|false', 'connection'=>'\PgSql\Connection', 'string'=>'string'], +'pg_escape_literal\'1' => ['string|false', 'connection'=>'string'], +'pg_escape_string' => ['string', 'connection'=>'\PgSql\Connection', 'string'=>'string'], +'pg_escape_string\'1' => ['string', 'connection'=>'string'], +'pg_exec' => ['\PgSql\Result|false', 'connection'=>'\PgSql\Connection', 'query'=>'string'], +'pg_execute' => ['\PgSql\Result|false', 'connection'=>'\PgSql\Connection', 'statement_name'=>'string', 'params'=>'array'], +'pg_execute\'1' => ['\PgSql\Result|false', 'connection'=>'string', 'statement_name'=>'array'], +'pg_fetch_all' => ['array', 'result'=>'\PgSql\Result', 'result_type='=>'int'], +'pg_fetch_all_columns' => ['array', 'result'=>'\PgSql\Result', 'field='=>'int'], +'pg_fetch_array' => ['array|false', 'result'=>'\PgSql\Result', 'row='=>'?int', 'mode='=>'int'], +'pg_fetch_assoc' => ['array|false', 'result'=>'\PgSql\Result', 'row='=>'?int'], +'pg_fetch_object' => ['object|false', 'result'=>'\PgSql\Result', 'row='=>'?int', 'class='=>'string', 'constructor_args='=>'array'], +'pg_fetch_result' => ['string|false|null', 'result'=>'\PgSql\Result', 'row'=>'string|int'], +'pg_fetch_result\'1' => ['string|false|null', 'result'=>'\PgSql\Result', 'row'=>'?int', 'field'=>'string|int'], +'pg_fetch_row' => ['array|false', 'result'=>'\PgSql\Result', 'row='=>'?int', 'mode='=>'int'], +'pg_field_is_null' => ['int|false', 'result'=>'\PgSql\Result', 'row'=>'string|int'], +'pg_field_is_null\'1' => ['int|false', 'result'=>'\PgSql\Result', 'row'=>'int', 'field'=>'string|int'], +'pg_field_name' => ['string', 'result'=>'\PgSql\Result', 'field'=>'int'], +'pg_field_num' => ['int', 'result'=>'\PgSql\Result', 'field'=>'string'], +'pg_field_prtlen' => ['int|false', 'result'=>'\PgSql\Result', 'row'=>'string|int'], +'pg_field_prtlen\'1' => ['int|false', 'result'=>'\PgSql\Result', 'row'=>'int', 'field'=>'string|int'], +'pg_field_size' => ['int', 'result'=>'\PgSql\Result', 'field'=>'int'], +'pg_field_table' => ['string|int|false', 'result'=>'\PgSql\Result', 'field'=>'int', 'oid_only='=>'bool'], +'pg_field_type' => ['string', 'result'=>'\PgSql\Result', 'field'=>'int'], +'pg_field_type_oid' => ['int|string', 'result'=>'\PgSql\Result', 'field'=>'int'], +'pg_flush' => ['int|bool', 'connection'=>'\PgSql\Connection'], +'pg_free_result' => ['bool', 'result'=>'\PgSql\Result'], +'pg_get_notify' => ['array|false', 'result'=>'\PgSql\Result', 'mode='=>'int'], +'pg_get_pid' => ['int', 'connection'=>'\PgSql\Connection'], +'pg_get_result' => ['\PgSql\Result|false', 'connection='=>'\PgSql\Connection'], +'pg_host' => ['string', 'connection='=>'\PgSql\Connection'], +'pg_insert' => ['\PgSql\Result|string|false', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'values'=>'array', 'flags='=>'int'], +'pg_last_error' => ['string', 'connection='=>'\PgSql\Connection', 'operation='=>'int'], +'pg_last_notice' => ['string|array|bool', 'connection'=>'\PgSql\Connection', 'mode='=>'int'], +'pg_last_oid' => ['string|int|false', 'result'=>'\PgSql\Result'], +'pg_lo_close' => ['bool', 'lob'=>'\PgSql\Lob'], +'pg_lo_create' => ['int|string|false', 'connection='=>'\PgSql\Connection', 'oid='=>'int|string'], +'pg_lo_export' => ['bool', 'connection'=>'\PgSql\Connection', 'oid'=>'int|string', 'filename'=>'string'], +'pg_lo_export\'1' => ['bool', 'connection'=>'int|string', 'oid'=>'string'], +'pg_lo_import' => ['int|string|false', 'connection'=>'\PgSql\Connection', 'filename'=>'string', 'oid'=>'string|int'], +'pg_lo_import\'1' => ['int|string|false', 'connection'=>'string', 'filename'=>'string|int'], +'pg_lo_open' => ['\PgSql\Lob|false', 'connection'=>'\PgSql\Connection', 'oid'=>'int|string', 'mode'=>'string'], +'pg_lo_open\'1' => ['\PgSql\Lob|false', 'connection'=>'int|string', 'oid'=>'string'], +'pg_lo_read' => ['string|false', 'lob'=>'\PgSql\Lob', 'length='=>'int'], +'pg_lo_read_all' => ['int', 'lob'=>'\PgSql\Lob'], +'pg_lo_seek' => ['bool', 'lob'=>'\PgSql\Lob', 'offset'=>'int', 'whence='=>'int'], +'pg_lo_tell' => ['int', 'lob'=>'\PgSql\Lob'], +'pg_lo_truncate' => ['bool', 'lob'=>'\PgSql\Lob', 'size'=>'int'], +'pg_lo_unlink' => ['bool', 'connection'=>'\PgSql\Connection', 'oid'=>'int|string'], +'pg_lo_unlink\'1' => ['bool', 'connection'=>'int|string'], +'pg_lo_write' => ['int|false', 'lob'=>'\PgSql\Lob', 'data'=>'string', 'length='=>'int'], +'pg_meta_data' => ['array|false', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'extended='=>'bool'], +'pg_num_fields' => ['int', 'result'=>'\PgSql\Result'], +'pg_num_rows' => ['int', 'result'=>'\PgSql\Result'], +'pg_options' => ['string', 'connection='=>'\PgSql\Connection'], +'pg_parameter_status' => ['string|false', 'connection'=>'\PgSql\Connection', 'name'=>'string'], +'pg_parameter_status\'1' => ['string|false', 'connection'=>'string'], +'pg_pconnect' => ['\PgSql\Connection|false', 'connection_string'=>'string', 'flags='=>'string', 'port='=>'string|int', 'options='=>'string', 'tty='=>'string', 'database='=>'string'], +'pg_ping' => ['bool', 'connection='=>'\PgSql\Connection'], +'pg_port' => ['int', 'connection='=>'\PgSql\Connection'], +'pg_prepare' => ['\PgSql\Result|false', 'connection'=>'\PgSql\Connection', 'statement_name'=>'string', 'query'=>'string'], +'pg_prepare\'1' => ['\PgSql\Result|false', 'connection'=>'string', 'statement_name'=>'string'], +'pg_put_line' => ['bool', 'connection'=>'\PgSql\Connection', 'data'=>'string'], +'pg_put_line\'1' => ['bool', 'connection'=>'string'], +'pg_query' => ['\PgSql\Result|false', 'connection'=>'\PgSql\Connection', 'query'=>'string'], +'pg_query\'1' => ['\PgSql\Result|false', 'connection'=>'string'], +'pg_query_params' => ['\PgSql\Result|false', 'connection'=>'\PgSql\Connection', 'query'=>'string', 'params'=>'array'], +'pg_query_params\'1' => ['\PgSql\Result|false', 'connection'=>'string', 'query'=>'array'], +'pg_result_error' => ['string|false', 'result'=>'\PgSql\Result'], +'pg_result_error_field' => ['string|false|null', 'result'=>'\PgSql\Result', 'field_code'=>'int'], +'pg_result_seek' => ['bool', 'result'=>'\PgSql\Result', 'row'=>'int'], +'pg_result_status' => ['string|int', 'result'=>'\PgSql\Result', 'mode='=>'int'], +'pg_select' => ['string|array|false', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'assoc_array'=>'array', 'options='=>'int', 'result_type='=>'int'], +'pg_send_execute' => ['bool|int', 'connection'=>'\PgSql\Connection', 'query'=>'string', 'params'=>'array'], +'pg_send_prepare' => ['bool|int', 'connection'=>'\PgSql\Connection', 'statement_name'=>'string', 'query'=>'string'], +'pg_send_query' => ['bool|int', 'connection'=>'\PgSql\Connection', 'query'=>'string'], +'pg_send_query_params' => ['bool|int', 'connection'=>'\PgSql\Connection', 'query'=>'string', 'params'=>'array'], +'pg_set_client_encoding' => ['int', 'connection'=>'\PgSql\Connection', 'encoding'=>'string'], +'pg_set_client_encoding\'1' => ['int', 'connection'=>'string'], +'pg_set_error_verbosity' => ['int|false', 'connection'=>'\PgSql\Connection', 'verbosity'=>'int'], +'pg_set_error_verbosity\'1' => ['int|false', 'connection'=>'int'], +'pg_socket' => ['resource|false', 'connection'=>'\PgSql\Connection'], +'pg_trace' => ['bool', 'filename'=>'string', 'mode='=>'string', 'connection='=>'\PgSql\Connection'], +'pg_transaction_status' => ['int', 'connection'=>'\PgSql\Connection'], +'pg_tty' => ['string', 'connection='=>'\PgSql\Connection'], +'pg_unescape_bytea' => ['string', 'string'=>'string'], +'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::apiVersion' => ['string'], +'Phar::buildFromDirectory' => ['array', 'base_dir'=>'string', 'regex='=>'string'], +'Phar::buildFromIterator' => ['array', 'iter'=>'Iterator', 'base_directory='=>'string'], +'Phar::canCompress' => ['bool', 'method='=>'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::decompress' => ['Phar', 'extension='=>'string'], +'Phar::decompressFiles' => ['bool'], +'Phar::delete' => ['bool', 'entry'=>'string'], +'Phar::delMetadata' => ['bool'], +'Phar::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'], +'Phar::getAlias' => ['string'], +'Phar::getMetadata' => ['mixed', 'unserializeOptions='=>'array'], +'Phar::getModified' => ['bool'], +'Phar::getPath' => ['string'], +'Phar::getSignature' => ['array{hash:string, hash_type:string}'], +'Phar::getStub' => ['string'], +'Phar::getSupportedCompression' => ['array'], +'Phar::getSupportedSignatures' => ['array'], +'Phar::getVersion' => ['string'], +'Phar::hasMetadata' => ['bool'], +'Phar::interceptFileFuncs' => ['void'], +'Phar::isBuffering' => ['bool'], +'Phar::isCompressed' => ['mixed|false'], +'Phar::isFileFormat' => ['bool', 'format'=>'int'], +'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::setAlias' => ['bool', 'alias'=>'string'], +'Phar::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], +'Phar::setMetadata' => ['void', 'metadata'=>''], +'Phar::setSignatureAlgorithm' => ['void', 'sigtype'=>'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'], +'PharData::compress' => ['PharData', 'compression'=>'int', 'extension='=>'string'], +'PharData::compressFiles' => ['bool', '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::decompress' => ['PharData', 'extension='=>'string'], +'PharData::decompressFiles' => ['bool'], +'PharData::delete' => ['bool', 'entry'=>'string'], +'PharData::delMetadata' => ['bool'], +'PharData::extractTo' => ['bool', 'pathto'=>'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::setAlias' => ['bool', 'alias'=>'string'], +'PharData::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], +'phardata::setMetadata' => ['void', 'metadata'=>'mixed'], +'phardata::setSignatureAlgorithm' => ['void', 'sigtype'=>'int'], +'PharData::setStub' => ['bool', 'stub'=>'string', 'length='=>'int'], +'PharFileInfo::__construct' => ['void', 'entry'=>'string'], +'PharFileInfo::chmod' => ['void', 'permissions'=>'int'], +'PharFileInfo::compress' => ['bool', 'compression'=>'int'], +'PharFileInfo::decompress' => ['bool'], +'PharFileInfo::delMetadata' => ['bool'], +'PharFileInfo::getCompressedSize' => ['int'], +'PharFileInfo::getContent' => ['string'], +'PharFileInfo::getCRC32' => ['int'], +'PharFileInfo::getMetadata' => ['mixed', 'unserializeOptions='=>'array'], +'PharFileInfo::getPharFlags' => ['int'], +'PharFileInfo::hasMetadata' => ['bool'], +'PharFileInfo::isCompressed' => ['bool', 'compression_type='=>'int'], +'PharFileInfo::isCompressedBZIP2' => ['bool'], +'PharFileInfo::isCompressedGZ' => ['bool'], +'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'], +'phdfs::copy' => ['bool', 'source_file'=>'string', 'destination_file'=>'string'], +'phdfs::create_directory' => ['bool', 'path'=>'string'], +'phdfs::delete' => ['bool', 'path'=>'string'], +'phdfs::disconnect' => ['bool'], +'phdfs::exists' => ['bool', 'path'=>'string'], +'phdfs::file_info' => ['array', 'path'=>'string'], +'phdfs::list_directory' => ['array', 'path'=>'string'], +'phdfs::read' => ['string', 'path'=>'string', 'length='=>'string'], +'phdfs::rename' => ['bool', 'old_path'=>'string', 'new_path'=>'string'], +'phdfs::tell' => ['int', 'path'=>'string'], +'phdfs::write' => ['bool', 'path'=>'string', 'buffer'=>'string', 'mode='=>'string'], +'php_check_syntax' => ['bool', 'filename'=>'string', 'error_message='=>'string'], +'php_ini_loaded_file' => ['string|false'], +'php_ini_scanned_files' => ['string|false'], +'php_logo_guid' => ['string'], +'php_sapi_name' => ['string'], +'php_strip_whitespace' => ['string', 'filename'=>'string'], +'php_uname' => ['string', 'mode='=>'string'], +'php_user_filter::filter' => ['int', 'in'=>'resource', 'out'=>'resource', '&rw_consumed'=>'int', 'closing'=>'bool'], +'php_user_filter::onClose' => ['void'], +'php_user_filter::onCreate' => ['bool'], +'phpcredits' => ['bool', 'flags='=>'int'], +'phpdbg_break_file' => ['void', 'file'=>'string', 'line'=>'int'], +'phpdbg_break_function' => ['void', 'function'=>'string'], +'phpdbg_break_method' => ['void', 'class'=>'string', 'method'=>'string'], +'phpdbg_break_next' => ['void'], +'phpdbg_clear' => ['void'], +'phpdbg_color' => ['void', 'element'=>'int', 'color'=>'string'], +'phpdbg_end_oplog' => ['array', 'options='=>'array'], +'phpdbg_exec' => ['mixed', 'context='=>'string'], +'phpdbg_get_executable' => ['array', 'options='=>'array'], +'phpdbg_prompt' => ['void', 'string'=>'string'], +'phpdbg_start_oplog' => ['void'], +'phpinfo' => ['bool', 'flags='=>'int'], +'PhpToken::tokenize' => ['list', 'code'=>'string', 'flags='=>'int'], +'PhpToken::is' => ['bool', 'kind'=>'string|int|string[]|int[]'], +'PhpToken::isIgnorable' => ['bool'], +'PhpToken::getTokenName' => ['string'], +'phpversion' => ['string|false', 'extension='=>'string'], +'pht\AtomicInteger::__construct' => ['void', 'value='=>'int'], +'pht\AtomicInteger::dec' => ['void'], +'pht\AtomicInteger::get' => ['int'], +'pht\AtomicInteger::inc' => ['void'], +'pht\AtomicInteger::lock' => ['void'], +'pht\AtomicInteger::set' => ['void', 'value'=>'int'], +'pht\AtomicInteger::unlock' => ['void'], +'pht\HashTable::lock' => ['void'], +'pht\HashTable::size' => ['int'], +'pht\HashTable::unlock' => ['void'], +'pht\Queue::front' => ['mixed'], +'pht\Queue::lock' => ['void'], +'pht\Queue::pop' => ['mixed'], +'pht\Queue::push' => ['void', 'value'=>'mixed'], +'pht\Queue::size' => ['int'], +'pht\Queue::unlock' => ['void'], +'pht\Runnable::run' => ['void'], +'pht\thread::addClassTask' => ['void', 'className'=>'string', '...ctorArgs='=>'mixed'], +'pht\thread::addFileTask' => ['void', 'fileName'=>'string', '...globals='=>'mixed'], +'pht\thread::addFunctionTask' => ['void', 'func'=>'callable', '...funcArgs='=>'mixed'], +'pht\thread::join' => ['void'], +'pht\thread::start' => ['void'], +'pht\thread::taskCount' => ['int'], +'pht\threaded::lock' => ['void'], +'pht\threaded::unlock' => ['void'], +'pht\Vector::__construct' => ['void', 'size='=>'int', 'value='=>'mixed'], +'pht\Vector::deleteAt' => ['void', 'offset'=>'int'], +'pht\Vector::insertAt' => ['void', 'value'=>'mixed', 'offset'=>'int'], +'pht\Vector::lock' => ['void'], +'pht\Vector::pop' => ['mixed'], +'pht\Vector::push' => ['void', 'value'=>'mixed'], +'pht\Vector::resize' => ['void', 'size'=>'int', 'value='=>'mixed'], +'pht\Vector::shift' => ['mixed'], +'pht\Vector::size' => ['int'], +'pht\Vector::unlock' => ['void'], +'pht\Vector::unshift' => ['void', 'value'=>'mixed'], +'pht\Vector::updateAt' => ['void', 'value'=>'mixed', 'offset'=>'int'], +'pi' => ['float'], +'pointObj::__construct' => ['void'], +'pointObj::distanceToLine' => ['float', 'p1'=>'pointObj', 'p2'=>'pointObj'], +'pointObj::distanceToPoint' => ['float', 'poPoint'=>'pointObj'], +'pointObj::distanceToShape' => ['float', 'shape'=>'shapeObj'], +'pointObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'], +'pointObj::ms_newPointObj' => ['pointObj'], +'pointObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], +'pointObj::setXY' => ['int', 'x'=>'float', 'y'=>'float', 'm'=>'float'], +'pointObj::setXYZ' => ['int', 'x'=>'float', 'y'=>'float', 'z'=>'float', 'm'=>'float'], +'Pool::__construct' => ['void', 'size'=>'int', 'class'=>'string', 'ctor='=>'array'], +'Pool::collect' => ['int', 'collector='=>'Callable'], +'Pool::resize' => ['void', 'size'=>'int'], +'Pool::shutdown' => ['void'], +'Pool::submit' => ['int', 'task'=>'Threaded'], +'Pool::submitTo' => ['int', 'worker'=>'int', 'task'=>'Threaded'], +'popen' => ['resource|false', 'command'=>'string', 'mode'=>'string'], +'pos' => ['mixed', 'array'=>'array'], +'posix_access' => ['bool', 'filename'=>'string', 'flags='=>'int'], +'posix_ctermid' => ['string|false'], +'posix_errno' => ['int'], +'posix_get_last_error' => ['int'], +'posix_getcwd' => ['string|false'], +'posix_getegid' => ['int'], +'posix_geteuid' => ['int'], +'posix_getgid' => ['int'], +'posix_getgrgid' => ['array{name: string, passwd: string, gid: int, members: list}|false', 'group_id'=>'int'], +'posix_getgrnam' => ['array{name: string, passwd: string, gid: int, members: list}|false', 'name'=>'string'], +'posix_getgroups' => ['list|false'], +'posix_getlogin' => ['string|false'], +'posix_getpgid' => ['int|false', 'process_id'=>'int'], +'posix_getpgrp' => ['int'], +'posix_getpid' => ['int'], +'posix_getppid' => ['int'], +'posix_getpwnam' => ['array{name: string, passwd: string, uid: int, gid: int, gecos: string, dir: string, shell: string}|false', 'username'=>'string'], +'posix_getpwuid' => ['array{name: string, passwd: string, uid: int, gid: int, gecos: string, dir: string, shell: string}|false', 'user_id'=>'int'], +'posix_getrlimit' => ['array{"soft core": string, "hard core": string, "soft data": string, "hard data": string, "soft stack": integer, "hard stack": string, "soft totalmem": string, "hard totalmem": string, "soft rss": string, "hard rss": string, "soft maxproc": integer, "hard maxproc": integer, "soft memlock": integer, "hard memlock": integer, "soft cpu": string, "hard cpu": string, "soft filesize": string, "hard filesize": string, "soft openfiles": integer, "hard openfiles": integer}|false'], +'posix_getsid' => ['int|false', 'process_id'=>'int'], +'posix_getuid' => ['int'], +'posix_initgroups' => ['bool', 'username'=>'string', 'group_id'=>'int'], +'posix_isatty' => ['bool', 'file_descriptor'=>'resource|int'], +'posix_kill' => ['bool', 'process_id'=>'int', 'signal'=>'int'], +'posix_mkfifo' => ['bool', 'filename'=>'string', 'permissions'=>'int'], +'posix_mknod' => ['bool', 'filename'=>'string', 'flags'=>'int', 'major='=>'int', 'minor='=>'int'], +'posix_setegid' => ['bool', 'group_id'=>'int'], +'posix_seteuid' => ['bool', 'user_id'=>'int'], +'posix_setgid' => ['bool', 'group_id'=>'int'], +'posix_setpgid' => ['bool', 'process_id'=>'int', 'process_group_id'=>'int'], +'posix_setrlimit' => ['bool', 'resource'=>'int', 'soft_limit'=>'int', 'hard_limit'=>'int'], +'posix_setsid' => ['int'], +'posix_setuid' => ['bool', 'user_id'=>'int'], +'posix_strerror' => ['string', 'error_code'=>'int'], +'posix_times' => ['array{ticks: int, utime: int, stime: int, cutime: int, cstime: int}|false'], +'posix_ttyname' => ['string|false', 'file_descriptor'=>'resource|int'], +'posix_uname' => ['array{sysname: string, nodename: string, release: string, version: string, machine: string, domainname: string}|false'], +'Postal\Expand::expand_address' => ['string[]', 'address'=>'string', 'options='=>'array'], +'Postal\Parser::parse_address' => ['array', 'address'=>'string', 'options='=>'array'], +'pow' => ['float|int', 'num'=>'int|float', 'exponent'=>'int|float'], +'preg_filter' => ['null|string|string[]', 'pattern'=>'mixed', 'replacement'=>'mixed', 'subject'=>'mixed', 'limit='=>'int', '&w_count='=>'int'], +'preg_grep' => ['array|false', 'pattern'=>'string', 'array'=>'array', 'flags='=>'int'], +'preg_last_error' => ['int'], +'preg_match' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'string[]', 'flags='=>'0', 'offset='=>'int'], +'preg_match\'1' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'array', 'flags='=>'int', 'offset='=>'int'], +'preg_match_all' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'array', 'flags='=>'int', 'offset='=>'int'], +'preg_quote' => ['string', 'str'=>'string', 'delimiter='=>'string'], +'preg_replace' => ['string|string[]|null', 'pattern'=>'string|array', 'replacement'=>'string|array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], +'preg_replace_callback' => ['string|null', 'pattern'=>'string|array', 'callback'=>'callable(string[]):string', 'subject'=>'string', 'limit='=>'int', '&w_count='=>'int'], +'preg_replace_callback\'1' => ['string[]|null', 'pattern'=>'string|array', 'callback'=>'callable(string[]):string', 'subject'=>'string[]', 'limit='=>'int', '&w_count='=>'int'], +'preg_replace_callback_array' => ['string|string[]|null', 'pattern'=>'array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], +'preg_split' => ['list|false', 'pattern'=>'string', 'subject'=>'string', 'limit'=>'int', 'flags='=>'null'], +'preg_split\'1' => ['list|list>|false', 'pattern'=>'string', 'subject'=>'string', 'limit='=>'int', 'flags='=>'int'], +'prev' => ['mixed', '&r_array'=>'array|object'], +'print' => ['int', 'arg'=>'string'], +'print_r' => ['string', 'value'=>'mixed'], +'print_r\'1' => ['true', 'value'=>'mixed', 'return='=>'bool'], +'printf' => ['int', 'format'=>'string', '...values='=>'string|int|float'], +'proc_close' => ['int', 'process'=>'resource'], +'proc_get_status' => ['array{command: string, pid: int, running: bool, signaled: bool, stopped: bool, exitcode: int, termsig: int, stopsig: int}', 'process'=>'resource'], +'proc_nice' => ['bool', 'priority'=>'int'], +'proc_open' => ['resource|false', 'command'=>'string|array', 'descriptor_spec'=>'array', '&pipes'=>'resource[]', 'cwd='=>'?string', 'env_vars='=>'?array', 'options='=>'?array'], +'proc_terminate' => ['bool', 'process'=>'resource', 'signal='=>'int'], +'projectionObj::__construct' => ['void', 'projectionString'=>'string'], +'projectionObj::getUnits' => ['int'], +'projectionObj::ms_newProjectionObj' => ['projectionObj', 'projectionString'=>'string'], +'property_exists' => ['bool', 'object_or_class'=>'object|string', 'property'=>'string'], +'ps_add_bookmark' => ['int', 'psdoc'=>'resource', 'text'=>'string', 'parent='=>'int', 'open='=>'int'], +'ps_add_launchlink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], +'ps_add_locallink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'page'=>'int', 'dest'=>'string'], +'ps_add_note' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], +'ps_add_pdflink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], +'ps_add_weblink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'url'=>'string'], +'ps_arc' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'alpha'=>'float', 'beta'=>'float'], +'ps_arcn' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'alpha'=>'float', 'beta'=>'float'], +'ps_begin_page' => ['bool', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float'], +'ps_begin_pattern' => ['int', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], +'ps_begin_template' => ['int', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float'], +'ps_circle' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float'], +'ps_clip' => ['bool', 'psdoc'=>'resource'], +'ps_close' => ['bool', 'psdoc'=>'resource'], +'ps_close_image' => ['void', 'psdoc'=>'resource', 'imageid'=>'int'], +'ps_closepath' => ['bool', 'psdoc'=>'resource'], +'ps_closepath_stroke' => ['bool', 'psdoc'=>'resource'], +'ps_continue_text' => ['bool', 'psdoc'=>'resource', 'text'=>'string'], +'ps_curveto' => ['bool', 'psdoc'=>'resource', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], +'ps_delete' => ['bool', 'psdoc'=>'resource'], +'ps_end_page' => ['bool', 'psdoc'=>'resource'], +'ps_end_pattern' => ['bool', 'psdoc'=>'resource'], +'ps_end_template' => ['bool', 'psdoc'=>'resource'], +'ps_fill' => ['bool', 'psdoc'=>'resource'], +'ps_fill_stroke' => ['bool', 'psdoc'=>'resource'], +'ps_findfont' => ['int', 'psdoc'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'embed='=>'bool'], +'ps_get_buffer' => ['string', 'psdoc'=>'resource'], +'ps_get_parameter' => ['string', 'psdoc'=>'resource', 'name'=>'string', 'modifier='=>'float'], +'ps_get_value' => ['float', 'psdoc'=>'resource', 'name'=>'string', 'modifier='=>'float'], +'ps_hyphenate' => ['array', 'psdoc'=>'resource', 'text'=>'string'], +'ps_include_file' => ['bool', 'psdoc'=>'resource', 'file'=>'string'], +'ps_lineto' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], +'ps_makespotcolor' => ['int', 'psdoc'=>'resource', 'name'=>'string', 'reserved='=>'int'], +'ps_moveto' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], +'ps_new' => ['resource'], +'ps_open_file' => ['bool', 'psdoc'=>'resource', 'filename='=>'string'], +'ps_open_image' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], +'ps_open_image_file' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'filename'=>'string', 'stringparam='=>'string', 'intparam='=>'int'], +'ps_open_memory_image' => ['int', 'psdoc'=>'resource', 'gd'=>'int'], +'ps_place_image' => ['bool', 'psdoc'=>'resource', 'imageid'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], +'ps_rect' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], +'ps_restore' => ['bool', 'psdoc'=>'resource'], +'ps_rotate' => ['bool', 'psdoc'=>'resource', 'rot'=>'float'], +'ps_save' => ['bool', 'psdoc'=>'resource'], +'ps_scale' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], +'ps_set_border_color' => ['bool', 'psdoc'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], +'ps_set_border_dash' => ['bool', 'psdoc'=>'resource', 'black'=>'float', 'white'=>'float'], +'ps_set_border_style' => ['bool', 'psdoc'=>'resource', 'style'=>'string', 'width'=>'float'], +'ps_set_info' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], +'ps_set_parameter' => ['bool', 'psdoc'=>'resource', 'name'=>'string', 'value'=>'string'], +'ps_set_text_pos' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], +'ps_set_value' => ['bool', 'psdoc'=>'resource', 'name'=>'string', 'value'=>'float'], +'ps_setcolor' => ['bool', 'psdoc'=>'resource', 'type'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], +'ps_setdash' => ['bool', 'psdoc'=>'resource', 'on'=>'float', 'off'=>'float'], +'ps_setflat' => ['bool', 'psdoc'=>'resource', 'value'=>'float'], +'ps_setfont' => ['bool', 'psdoc'=>'resource', 'fontid'=>'int', 'size'=>'float'], +'ps_setgray' => ['bool', 'psdoc'=>'resource', 'gray'=>'float'], +'ps_setlinecap' => ['bool', 'psdoc'=>'resource', 'type'=>'int'], +'ps_setlinejoin' => ['bool', 'psdoc'=>'resource', 'type'=>'int'], +'ps_setlinewidth' => ['bool', 'psdoc'=>'resource', 'width'=>'float'], +'ps_setmiterlimit' => ['bool', 'psdoc'=>'resource', 'value'=>'float'], +'ps_setoverprintmode' => ['bool', 'psdoc'=>'resource', 'mode'=>'int'], +'ps_setpolydash' => ['bool', 'psdoc'=>'resource', 'arr'=>'float'], +'ps_shading' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], +'ps_shading_pattern' => ['int', 'psdoc'=>'resource', 'shadingid'=>'int', 'optlist'=>'string'], +'ps_shfill' => ['bool', 'psdoc'=>'resource', 'shadingid'=>'int'], +'ps_show' => ['bool', 'psdoc'=>'resource', 'text'=>'string'], +'ps_show2' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'length'=>'int'], +'ps_show_boxed' => ['int', 'psdoc'=>'resource', 'text'=>'string', 'left'=>'float', 'bottom'=>'float', 'width'=>'float', 'height'=>'float', 'hmode'=>'string', 'feature='=>'string'], +'ps_show_xy' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float'], +'ps_show_xy2' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'length'=>'int', 'xcoor'=>'float', 'ycoor'=>'float'], +'ps_string_geometry' => ['array', 'psdoc'=>'resource', 'text'=>'string', 'fontid='=>'int', 'size='=>'float'], +'ps_stringwidth' => ['float', 'psdoc'=>'resource', 'text'=>'string', 'fontid='=>'int', 'size='=>'float'], +'ps_stroke' => ['bool', 'psdoc'=>'resource'], +'ps_symbol' => ['bool', 'psdoc'=>'resource', 'ord'=>'int'], +'ps_symbol_name' => ['string', 'psdoc'=>'resource', 'ord'=>'int', 'fontid='=>'int'], +'ps_symbol_width' => ['float', 'psdoc'=>'resource', 'ord'=>'int', 'fontid='=>'int', 'size='=>'float'], +'ps_translate' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], +'pspell_add_to_personal' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], +'pspell_add_to_session' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], +'pspell_check' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], +'pspell_clear_session' => ['bool', 'dictionary'=>'PSpell\Dictionary'], +'pspell_config_create' => ['int|false', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string'], +'pspell_config_data_dir' => ['bool', 'config'=>'PSpell\Config', 'directory'=>'string'], +'pspell_config_dict_dir' => ['bool', 'config'=>'PSpell\Config', 'directory'=>'string'], +'pspell_config_ignore' => ['bool', 'config'=>'PSpell\Config', 'min_length'=>'int'], +'pspell_config_mode' => ['bool', 'config'=>'PSpell\Config', 'mode'=>'int'], +'pspell_config_personal' => ['bool', 'config'=>'PSpell\Config', 'filename'=>'string'], +'pspell_config_repl' => ['bool', 'config'=>'PSpell\Config', 'filename'=>'string'], +'pspell_config_runtogether' => ['bool', 'config'=>'PSpell\Config', 'allow'=>'bool'], +'pspell_config_save_repl' => ['bool', 'config'=>'PSpell\Config', 'save'=>'bool'], +'pspell_new' => ['int|false', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string', 'mode='=>'int'], +'pspell_new_config' => ['int|false', 'config'=>'PSpell\Config'], +'pspell_new_personal' => ['int|false', 'filename'=>'string', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string', 'mode='=>'int'], +'pspell_save_wordlist' => ['bool', 'dictionary'=>'PSpell\Dictionary'], +'pspell_store_replacement' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'misspelled'=>'string', 'correct'=>'string'], +'pspell_suggest' => ['array', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], +'putenv' => ['bool', 'assignment'=>'string'], +'px_close' => ['bool', 'pxdoc'=>'resource'], +'px_create_fp' => ['bool', 'pxdoc'=>'resource', 'file'=>'resource', 'fielddesc'=>'array'], +'px_date2string' => ['string', 'pxdoc'=>'resource', 'value'=>'int', 'format'=>'string'], +'px_delete' => ['bool', 'pxdoc'=>'resource'], +'px_delete_record' => ['bool', 'pxdoc'=>'resource', 'num'=>'int'], +'px_get_field' => ['array', 'pxdoc'=>'resource', 'fieldno'=>'int'], +'px_get_info' => ['array', 'pxdoc'=>'resource'], +'px_get_parameter' => ['string', 'pxdoc'=>'resource', 'name'=>'string'], +'px_get_record' => ['array', 'pxdoc'=>'resource', 'num'=>'int', 'mode='=>'int'], +'px_get_schema' => ['array', 'pxdoc'=>'resource', 'mode='=>'int'], +'px_get_value' => ['float', 'pxdoc'=>'resource', 'name'=>'string'], +'px_insert_record' => ['int', 'pxdoc'=>'resource', 'data'=>'array'], +'px_new' => ['resource'], +'px_numfields' => ['int', 'pxdoc'=>'resource'], +'px_numrecords' => ['int', 'pxdoc'=>'resource'], +'px_open_fp' => ['bool', 'pxdoc'=>'resource', 'file'=>'resource'], +'px_put_record' => ['bool', 'pxdoc'=>'resource', 'record'=>'array', 'recpos='=>'int'], +'px_retrieve_record' => ['array', 'pxdoc'=>'resource', 'num'=>'int', 'mode='=>'int'], +'px_set_blob_file' => ['bool', 'pxdoc'=>'resource', 'filename'=>'string'], +'px_set_parameter' => ['bool', 'pxdoc'=>'resource', 'name'=>'string', 'value'=>'string'], +'px_set_tablename' => ['void', 'pxdoc'=>'resource', 'name'=>'string'], +'px_set_targetencoding' => ['bool', 'pxdoc'=>'resource', 'encoding'=>'string'], +'px_set_value' => ['bool', 'pxdoc'=>'resource', 'name'=>'string', 'value'=>'float'], +'px_timestamp2string' => ['string', 'pxdoc'=>'resource', 'value'=>'float', 'format'=>'string'], +'px_update_record' => ['bool', 'pxdoc'=>'resource', 'data'=>'array', 'num'=>'int'], +'qdom_error' => ['string'], +'qdom_tree' => ['QDomDocument', 'doc'=>'string'], +'querymapObj::convertToString' => ['string'], +'querymapObj::free' => ['void'], +'querymapObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'querymapObj::updateFromString' => ['int', 'snippet'=>'string'], +'QuickHashIntHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], +'QuickHashIntHash::add' => ['bool', 'key'=>'int', 'value='=>'int'], +'QuickHashIntHash::delete' => ['bool', 'key'=>'int'], +'QuickHashIntHash::exists' => ['bool', 'key'=>'int'], +'QuickHashIntHash::get' => ['int', 'key'=>'int'], +'QuickHashIntHash::getSize' => ['int'], +'QuickHashIntHash::loadFromFile' => ['QuickHashIntHash', 'filename'=>'string', 'options='=>'int'], +'QuickHashIntHash::loadFromString' => ['QuickHashIntHash', 'contents'=>'string', 'options='=>'int'], +'QuickHashIntHash::saveToFile' => ['void', 'filename'=>'string'], +'QuickHashIntHash::saveToString' => ['string'], +'QuickHashIntHash::set' => ['bool', 'key'=>'int', 'value'=>'int'], +'QuickHashIntHash::update' => ['bool', 'key'=>'int', 'value'=>'int'], +'QuickHashIntSet::__construct' => ['void', 'size'=>'int', 'options='=>'int'], +'QuickHashIntSet::add' => ['bool', 'key'=>'int'], +'QuickHashIntSet::delete' => ['bool', 'key'=>'int'], +'QuickHashIntSet::exists' => ['bool', 'key'=>'int'], +'QuickHashIntSet::getSize' => ['int'], +'QuickHashIntSet::loadFromFile' => ['QuickHashIntSet', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], +'QuickHashIntSet::loadFromString' => ['QuickHashIntSet', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], +'QuickHashIntSet::saveToFile' => ['void', 'filename'=>'string'], +'QuickHashIntSet::saveToString' => ['string'], +'QuickHashIntStringHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], +'QuickHashIntStringHash::add' => ['bool', 'key'=>'int', 'value'=>'string'], +'QuickHashIntStringHash::delete' => ['bool', 'key'=>'int'], +'QuickHashIntStringHash::exists' => ['bool', 'key'=>'int'], +'QuickHashIntStringHash::get' => ['mixed', 'key'=>'int'], +'QuickHashIntStringHash::getSize' => ['int'], +'QuickHashIntStringHash::loadFromFile' => ['QuickHashIntStringHash', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], +'QuickHashIntStringHash::loadFromString' => ['QuickHashIntStringHash', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], +'QuickHashIntStringHash::saveToFile' => ['void', 'filename'=>'string'], +'QuickHashIntStringHash::saveToString' => ['string'], +'QuickHashIntStringHash::set' => ['int', 'key'=>'int', 'value'=>'string'], +'QuickHashIntStringHash::update' => ['bool', 'key'=>'int', 'value'=>'string'], +'QuickHashStringIntHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], +'QuickHashStringIntHash::add' => ['bool', 'key'=>'string', 'value'=>'int'], +'QuickHashStringIntHash::delete' => ['bool', 'key'=>'string'], +'QuickHashStringIntHash::exists' => ['bool', 'key'=>'string'], +'QuickHashStringIntHash::get' => ['mixed', 'key'=>'string'], +'QuickHashStringIntHash::getSize' => ['int'], +'QuickHashStringIntHash::loadFromFile' => ['QuickHashStringIntHash', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], +'QuickHashStringIntHash::loadFromString' => ['QuickHashStringIntHash', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], +'QuickHashStringIntHash::saveToFile' => ['void', 'filename'=>'string'], +'QuickHashStringIntHash::saveToString' => ['string'], +'QuickHashStringIntHash::set' => ['int', 'key'=>'string', 'value'=>'int'], +'QuickHashStringIntHash::update' => ['bool', 'key'=>'string', 'value'=>'int'], +'quoted_printable_decode' => ['string', 'string'=>'string'], +'quoted_printable_encode' => ['string', 'string'=>'string'], +'quotemeta' => ['string', 'string'=>'string'], +'rad2deg' => ['float', 'num'=>'float'], +'radius_acct_open' => ['resource|false'], +'radius_add_server' => ['bool', 'radius_handle'=>'resource', 'hostname'=>'string', 'port'=>'int', 'secret'=>'string', 'timeout'=>'int', 'max_tries'=>'int'], +'radius_auth_open' => ['resource|false'], +'radius_close' => ['bool', 'radius_handle'=>'resource'], +'radius_config' => ['bool', 'radius_handle'=>'resource', 'file'=>'string'], +'radius_create_request' => ['bool', 'radius_handle'=>'resource', 'type'=>'int'], +'radius_cvt_addr' => ['string', 'data'=>'string'], +'radius_cvt_int' => ['int', 'data'=>'string'], +'radius_cvt_string' => ['string', 'data'=>'string'], +'radius_demangle' => ['string', 'radius_handle'=>'resource', 'mangled'=>'string'], +'radius_demangle_mppe_key' => ['string', 'radius_handle'=>'resource', 'mangled'=>'string'], +'radius_get_attr' => ['mixed', 'radius_handle'=>'resource'], +'radius_get_tagged_attr_data' => ['string', 'data'=>'string'], +'radius_get_tagged_attr_tag' => ['int', 'data'=>'string'], +'radius_get_vendor_attr' => ['array', 'data'=>'string'], +'radius_put_addr' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'addr'=>'string'], +'radius_put_attr' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'string'], +'radius_put_int' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'int'], +'radius_put_string' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'string'], +'radius_put_vendor_addr' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'addr'=>'string'], +'radius_put_vendor_attr' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'string'], +'radius_put_vendor_int' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'int'], +'radius_put_vendor_string' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'string'], +'radius_request_authenticator' => ['string', 'radius_handle'=>'resource'], +'radius_salt_encrypt_attr' => ['string', 'radius_handle'=>'resource', 'data'=>'string'], +'radius_send_request' => ['int|false', 'radius_handle'=>'resource'], +'radius_server_secret' => ['string', 'radius_handle'=>'resource'], +'radius_strerror' => ['string', 'radius_handle'=>'resource'], +'rand' => ['int', 'min'=>'int', 'max'=>'int'], +'rand\'1' => ['int'], +'random_bytes' => ['non-empty-string', 'length'=>'positive-int'], +'random_int' => ['int', 'min'=>'int', 'max'=>'int'], +'range' => ['array', 'start'=>'mixed', 'end'=>'mixed', 'step='=>'int|float'], +'RangeException::__clone' => ['void'], +'RangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?RangeException'], +'RangeException::__toString' => ['string'], +'RangeException::getCode' => ['int'], +'RangeException::getFile' => ['string'], +'RangeException::getLine' => ['int'], +'RangeException::getMessage' => ['string'], +'RangeException::getPrevious' => ['Throwable|RangeException|null'], +'RangeException::getTrace' => ['list\',args?:array}>'], +'RangeException::getTraceAsString' => ['string'], +'rar_allow_broken_set' => ['bool', 'rarfile'=>'RarArchive', 'allow_broken'=>'bool'], +'rar_broken_is' => ['bool', 'rarfile'=>'rararchive'], +'rar_close' => ['bool', 'rarfile'=>'rararchive'], +'rar_comment_get' => ['string', 'rarfile'=>'rararchive'], +'rar_entry_get' => ['RarEntry', 'rarfile'=>'RarArchive', 'entryname'=>'string'], +'rar_list' => ['RarArchive', 'rarfile'=>'rararchive'], +'rar_open' => ['RarArchive', 'filename'=>'string', 'password='=>'string', 'volume_callback='=>'callable'], +'rar_solid_is' => ['bool', 'rarfile'=>'rararchive'], +'rar_wrapper_cache_stats' => ['string'], +'RarArchive::__toString' => ['string'], +'RarArchive::close' => ['bool'], +'RarArchive::getComment' => ['string|null'], +'RarArchive::getEntries' => ['RarEntry[]|false'], +'RarArchive::getEntry' => ['RarEntry|false', 'entryname'=>'string'], +'RarArchive::isBroken' => ['bool'], +'RarArchive::isSolid' => ['bool'], +'RarArchive::open' => ['RarArchive|false', 'filename'=>'string', 'password='=>'string', 'volume_callback='=>'callable'], +'RarArchive::setAllowBroken' => ['bool', 'allow_broken'=>'bool'], +'RarEntry::__toString' => ['string'], +'RarEntry::extract' => ['bool', 'dir'=>'string', 'filepath='=>'string', 'password='=>'string', 'extended_data='=>'bool'], +'RarEntry::getAttr' => ['int|false'], +'RarEntry::getCrc' => ['string|false'], +'RarEntry::getFileTime' => ['string|false'], +'RarEntry::getHostOs' => ['int|false'], +'RarEntry::getMethod' => ['int|false'], +'RarEntry::getName' => ['string|false'], +'RarEntry::getPackedSize' => ['int|false'], +'RarEntry::getStream' => ['resource|false', 'password='=>'string'], +'RarEntry::getUnpackedSize' => ['int|false'], +'RarEntry::getVersion' => ['int|false'], +'RarEntry::isDirectory' => ['bool'], +'RarEntry::isEncrypted' => ['bool'], +'RarException::getCode' => ['int'], +'RarException::getFile' => ['string'], +'RarException::getLine' => ['int'], +'RarException::getMessage' => ['string'], +'RarException::getPrevious' => ['Exception|Throwable'], +'RarException::getTrace' => ['list\',args?:array}>'], +'RarException::getTraceAsString' => ['string'], +'RarException::isUsingExceptions' => ['bool'], +'RarException::setUsingExceptions' => ['RarEntry', 'using_exceptions'=>'bool'], +'rawurldecode' => ['string', 'string'=>'string'], +'rawurlencode' => ['string', 'string'=>'string'], +'rd_kafka_err2str' => ['string', 'err'=>'int'], +'rd_kafka_errno' => ['int'], +'rd_kafka_errno2err' => ['int', 'errnox'=>'int'], +'rd_kafka_offset_tail' => ['int', 'cnt'=>'int'], +'RdKafka::addBrokers' => ['int', 'broker_list'=>'string'], +'RdKafka::flush' => ['int', 'timeout_ms'=>'int'], +'RdKafka::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], +'RdKafka::getOutQLen' => ['int'], +'RdKafka::newQueue' => ['RdKafka\Queue'], +'RdKafka::newTopic' => ['RdKafka\Topic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], +'RdKafka::poll' => ['void', 'timeout_ms'=>'int'], +'RdKafka::setLogLevel' => ['void', 'level'=>'int'], +'RdKafka\Conf::dump' => ['array'], +'RdKafka\Conf::set' => ['void', 'name'=>'string', 'value'=>'string'], +'RdKafka\Conf::setDefaultTopicConf' => ['void', 'topic_conf'=>'RdKafka\TopicConf'], +'RdKafka\Conf::setDrMsgCb' => ['void', 'callback'=>'callable'], +'RdKafka\Conf::setErrorCb' => ['void', 'callback'=>'callable'], +'RdKafka\Conf::setRebalanceCb' => ['void', 'callback'=>'callable'], +'RdKafka\Conf::setStatsCb' => ['void', 'callback'=>'callable'], +'RdKafka\Consumer::__construct' => ['void', 'conf='=>'?RdKafka\Conf'], +'RdKafka\Consumer::addBrokers' => ['int', 'broker_list'=>'string'], +'RdKafka\Consumer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], +'RdKafka\Consumer::getOutQLen' => ['int'], +'RdKafka\Consumer::newQueue' => ['RdKafka\Queue'], +'RdKafka\Consumer::newTopic' => ['RdKafka\ConsumerTopic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], +'RdKafka\Consumer::poll' => ['void', 'timeout_ms'=>'int'], +'RdKafka\Consumer::setLogLevel' => ['void', 'level'=>'int'], +'RdKafka\ConsumerTopic::__construct' => ['void'], +'RdKafka\ConsumerTopic::consume' => ['RdKafka\Message', 'partition'=>'int', 'timeout_ms'=>'int'], +'RdKafka\ConsumerTopic::consumeQueueStart' => ['void', 'partition'=>'int', 'offset'=>'int', 'queue'=>'RdKafka\Queue'], +'RdKafka\ConsumerTopic::consumeStart' => ['void', 'partition'=>'int', 'offset'=>'int'], +'RdKafka\ConsumerTopic::consumeStop' => ['void', 'partition'=>'int'], +'RdKafka\ConsumerTopic::getName' => ['string'], +'RdKafka\ConsumerTopic::offsetStore' => ['void', 'partition'=>'int', 'offset'=>'int'], +'RdKafka\KafkaConsumer::__construct' => ['void', 'conf'=>'RdKafka\Conf'], +'RdKafka\KafkaConsumer::assign' => ['void', 'topic_partitions='=>'RdKafka\TopicPartition[]|null'], +'RdKafka\KafkaConsumer::commit' => ['void', 'message_or_offsets='=>'RdKafka\Message|RdKafka\TopicPartition[]|null'], +'RdKafka\KafkaConsumer::commitAsync' => ['void', 'message_or_offsets='=>'RdKafka\Message|RdKafka\TopicPartition[]|null'], +'RdKafka\KafkaConsumer::consume' => ['RdKafka\Message', 'timeout_ms'=>'int'], +'RdKafka\KafkaConsumer::getAssignment' => ['RdKafka\TopicPartition[]'], +'RdKafka\KafkaConsumer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\KafkaConsumerTopic', 'timeout_ms'=>'int'], +'RdKafka\KafkaConsumer::getSubscription' => ['array'], +'RdKafka\KafkaConsumer::subscribe' => ['void', 'topics'=>'array'], +'RdKafka\KafkaConsumer::unsubscribe' => ['void'], +'RdKafka\KafkaConsumerTopic::getName' => ['string'], +'RdKafka\KafkaConsumerTopic::offsetStore' => ['void', 'partition'=>'int', 'offset'=>'int'], +'RdKafka\Message::errstr' => ['string'], +'RdKafka\Metadata::getBrokers' => ['RdKafka\Metadata\Collection'], +'RdKafka\Metadata::getOrigBrokerId' => ['int'], +'RdKafka\Metadata::getOrigBrokerName' => ['string'], +'RdKafka\Metadata::getTopics' => ['RdKafka\Metadata\Collection|RdKafka\Metadata\Topic[]'], +'RdKafka\Metadata\Collection::__construct' => ['void'], +'RdKafka\Metadata\Collection::count' => ['int'], +'RdKafka\Metadata\Collection::current' => ['mixed'], +'RdKafka\Metadata\Collection::key' => ['mixed'], +'RdKafka\Metadata\Collection::next' => ['void'], +'RdKafka\Metadata\Collection::rewind' => ['void'], +'RdKafka\Metadata\Collection::valid' => ['bool'], +'RdKafka\Metadata\Partition::getErr' => ['mixed'], +'RdKafka\Metadata\Partition::getId' => ['int'], +'RdKafka\Metadata\Partition::getIsrs' => ['mixed'], +'RdKafka\Metadata\Partition::getLeader' => ['mixed'], +'RdKafka\Metadata\Partition::getReplicas' => ['mixed'], +'RdKafka\Metadata\Topic::getErr' => ['mixed'], +'RdKafka\Metadata\Topic::getPartitions' => ['RdKafka\Metadata\Partition[]'], +'RdKafka\Metadata\Topic::getTopic' => ['string'], +'RdKafka\Producer::__construct' => ['void', 'conf='=>'?RdKafka\Conf'], +'RdKafka\Producer::addBrokers' => ['int', 'broker_list'=>'string'], +'RdKafka\Producer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], +'RdKafka\Producer::getOutQLen' => ['int'], +'RdKafka\Producer::newQueue' => ['RdKafka\Queue'], +'RdKafka\Producer::newTopic' => ['RdKafka\ProducerTopic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], +'RdKafka\Producer::poll' => ['void', 'timeout_ms'=>'int'], +'RdKafka\Producer::setLogLevel' => ['void', 'level'=>'int'], +'RdKafka\ProducerTopic::__construct' => ['void'], +'RdKafka\ProducerTopic::getName' => ['string'], +'RdKafka\ProducerTopic::produce' => ['void', 'partition'=>'int', 'msgflags'=>'int', 'payload'=>'string', 'key='=>'?string'], +'RdKafka\ProducerTopic::producev' => ['void', 'partition'=>'int', 'msgflags'=>'int', 'payload'=>'string', 'key='=>'?string', 'headers='=>'?array', 'timestamp_ms='=>'?int', 'opaque='=>'?string'], +'RdKafka\Queue::__construct' => ['void'], +'RdKafka\Queue::consume' => ['?RdKafka\Message', 'timeout_ms'=>'string'], +'RdKafka\Topic::getName' => ['string'], +'RdKafka\TopicConf::dump' => ['array'], +'RdKafka\TopicConf::set' => ['void', 'name'=>'string', 'value'=>'string'], +'RdKafka\TopicConf::setPartitioner' => ['void', 'partitioner'=>'int'], +'RdKafka\TopicPartition::__construct' => ['void', 'topic'=>'string', 'partition'=>'int', 'offset='=>'int'], +'RdKafka\TopicPartition::getOffset' => ['int'], +'RdKafka\TopicPartition::getPartition' => ['int'], +'RdKafka\TopicPartition::getTopic' => ['string'], +'RdKafka\TopicPartition::setOffset' => ['void', 'offset'=>'string'], +'RdKafka\TopicPartition::setPartition' => ['void', 'partition'=>'string'], +'RdKafka\TopicPartition::setTopic' => ['void', 'topic_name'=>'string'], +'readdir' => ['string|false', 'dir_handle='=>'resource'], +'readfile' => ['int|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], +'readgzfile' => ['int|false', 'filename'=>'string', 'use_include_path='=>'int'], +'readline' => ['string|false', 'prompt='=>'?string'], +'readline_add_history' => ['bool', 'prompt'=>'string'], +'readline_callback_handler_install' => ['bool', 'prompt'=>'string', 'callback'=>'callable'], +'readline_callback_handler_remove' => ['bool'], +'readline_callback_read_char' => ['void'], +'readline_clear_history' => ['bool'], +'readline_completion_function' => ['bool', 'callback'=>'callable'], +'readline_info' => ['mixed', 'var_name='=>'string', 'value='=>'string|int|bool'], +'readline_list_history' => ['array'], +'readline_on_new_line' => ['void'], +'readline_read_history' => ['bool', 'filename='=>'string'], +'readline_redisplay' => ['void'], +'readline_write_history' => ['bool', 'filename='=>'string'], +'readlink' => ['string|false', 'path'=>'string'], +'realpath' => ['string|false', 'path'=>'string'], +'realpath_cache_get' => ['array'], +'realpath_cache_size' => ['int'], +'recode' => ['string', 'request'=>'string', 'string'=>'string'], +'recode_file' => ['bool', 'request'=>'string', 'input'=>'resource', 'output'=>'resource'], +'recode_string' => ['string|false', 'request'=>'string', 'string'=>'string'], +'rectObj::__construct' => ['void'], +'rectObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'], +'rectObj::fit' => ['float', 'width'=>'int', 'height'=>'int'], +'rectObj::ms_newRectObj' => ['rectObj'], +'rectObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], +'rectObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'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::count' => ['int'], +'RecursiveArrayIterator::current' => ['mixed'], +'RecursiveArrayIterator::getArrayCopy' => ['array'], +'RecursiveArrayIterator::getChildren' => ['RecursiveArrayIterator'], +'RecursiveArrayIterator::getFlags' => ['void'], +'RecursiveArrayIterator::hasChildren' => ['bool'], +'RecursiveArrayIterator::key' => ['false|int|string'], +'RecursiveArrayIterator::ksort' => ['void'], +'RecursiveArrayIterator::natcasesort' => ['void'], +'RecursiveArrayIterator::natsort' => ['void'], +'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::rewind' => ['void'], +'RecursiveArrayIterator::seek' => ['void', 'position'=>'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::valid' => ['bool'], +'RecursiveCachingIterator::__construct' => ['void', 'it'=>'Iterator', 'flags='=>'int'], +'RecursiveCachingIterator::__toString' => ['string'], +'RecursiveCachingIterator::count' => ['int'], +'RecursiveCachingIterator::current' => ['void'], +'RecursiveCachingIterator::getCache' => ['array'], +'RecursiveCachingIterator::getChildren' => ['RecursiveCachingIterator'], +'RecursiveCachingIterator::getFlags' => ['int'], +'RecursiveCachingIterator::getInnerIterator' => ['Iterator'], +'RecursiveCachingIterator::hasChildren' => ['bool'], +'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::rewind' => ['void'], +'RecursiveCachingIterator::setFlags' => ['void', 'flags'=>'int'], +'RecursiveCachingIterator::valid' => ['bool'], +'RecursiveCallbackFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'func'=>'callable'], +'RecursiveCallbackFilterIterator::accept' => ['bool'], +'RecursiveCallbackFilterIterator::current' => ['mixed'], +'RecursiveCallbackFilterIterator::getChildren' => ['RecursiveCallbackFilterIterator'], +'RecursiveCallbackFilterIterator::getInnerIterator' => ['Iterator'], +'RecursiveCallbackFilterIterator::hasChildren' => ['bool'], +'RecursiveCallbackFilterIterator::key' => ['bool|float|int|string'], +'RecursiveCallbackFilterIterator::next' => ['void'], +'RecursiveCallbackFilterIterator::rewind' => ['void'], +'RecursiveCallbackFilterIterator::valid' => ['bool'], +'RecursiveDirectoryIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], +'RecursiveDirectoryIterator::__toString' => ['string'], +'RecursiveDirectoryIterator::_bad_state_ex' => [''], +'RecursiveDirectoryIterator::current' => ['string|SplFileInfo|FilesystemIterator'], +'RecursiveDirectoryIterator::getATime' => ['int'], +'RecursiveDirectoryIterator::getBasename' => ['string', 'suffix='=>'string'], +'RecursiveDirectoryIterator::getChildren' => ['RecursiveDirectoryIterator'], +'RecursiveDirectoryIterator::getCTime' => ['int'], +'RecursiveDirectoryIterator::getExtension' => ['string'], +'RecursiveDirectoryIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], +'RecursiveDirectoryIterator::getFilename' => ['string'], +'RecursiveDirectoryIterator::getFlags' => ['int'], +'RecursiveDirectoryIterator::getGroup' => ['int'], +'RecursiveDirectoryIterator::getInode' => ['int'], +'RecursiveDirectoryIterator::getLinkTarget' => ['string'], +'RecursiveDirectoryIterator::getMTime' => ['int'], +'RecursiveDirectoryIterator::getOwner' => ['int'], +'RecursiveDirectoryIterator::getPath' => ['string'], +'RecursiveDirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], +'RecursiveDirectoryIterator::getPathname' => ['string'], +'RecursiveDirectoryIterator::getPerms' => ['int'], +'RecursiveDirectoryIterator::getRealPath' => ['string'], +'RecursiveDirectoryIterator::getSize' => ['int'], +'RecursiveDirectoryIterator::getSubPath' => ['string'], +'RecursiveDirectoryIterator::getSubPathname' => ['string'], +'RecursiveDirectoryIterator::getType' => ['string'], +'RecursiveDirectoryIterator::hasChildren' => ['bool', 'allow_links='=>'bool'], +'RecursiveDirectoryIterator::isDir' => ['bool'], +'RecursiveDirectoryIterator::isDot' => ['bool'], +'RecursiveDirectoryIterator::isExecutable' => ['bool'], +'RecursiveDirectoryIterator::isFile' => ['bool'], +'RecursiveDirectoryIterator::isLink' => ['bool'], +'RecursiveDirectoryIterator::isReadable' => ['bool'], +'RecursiveDirectoryIterator::isWritable' => ['bool'], +'RecursiveDirectoryIterator::key' => ['string'], +'RecursiveDirectoryIterator::next' => ['void'], +'RecursiveDirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'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::valid' => ['bool'], +'RecursiveFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'], +'RecursiveFilterIterator::accept' => ['bool'], +'RecursiveFilterIterator::current' => ['mixed'], +'RecursiveFilterIterator::getChildren' => ['RecursiveFilterIterator'], +'RecursiveFilterIterator::getInnerIterator' => ['Iterator'], +'RecursiveFilterIterator::hasChildren' => ['bool'], +'RecursiveFilterIterator::key' => ['mixed'], +'RecursiveFilterIterator::next' => ['void'], +'RecursiveFilterIterator::rewind' => ['void'], +'RecursiveFilterIterator::valid' => ['bool'], +'RecursiveIterator::__construct' => ['void'], +'RecursiveIterator::current' => ['mixed'], +'RecursiveIterator::getChildren' => ['RecursiveIterator'], +'RecursiveIterator::hasChildren' => ['bool'], +'RecursiveIterator::key' => ['int|string'], +'RecursiveIterator::next' => ['void'], +'RecursiveIterator::rewind' => ['void'], +'RecursiveIterator::valid' => ['bool'], +'RecursiveIteratorIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'mode='=>'int', 'flags='=>'int'], +'RecursiveIteratorIterator::beginChildren' => ['void'], +'RecursiveIteratorIterator::beginIteration' => ['RecursiveIterator'], +'RecursiveIteratorIterator::callGetChildren' => ['RecursiveIterator'], +'RecursiveIteratorIterator::callHasChildren' => ['bool'], +'RecursiveIteratorIterator::current' => ['mixed'], +'RecursiveIteratorIterator::endChildren' => ['void'], +'RecursiveIteratorIterator::endIteration' => ['RecursiveIterator'], +'RecursiveIteratorIterator::getDepth' => ['int'], +'RecursiveIteratorIterator::getInnerIterator' => ['RecursiveIterator'], +'RecursiveIteratorIterator::getMaxDepth' => ['int|false'], +'RecursiveIteratorIterator::getSubIterator' => ['RecursiveIterator', 'level='=>'int'], +'RecursiveIteratorIterator::key' => ['mixed'], +'RecursiveIteratorIterator::next' => ['void'], +'RecursiveIteratorIterator::nextElement' => ['void'], +'RecursiveIteratorIterator::rewind' => ['void'], +'RecursiveIteratorIterator::setMaxDepth' => ['void', 'max_depth='=>'int'], +'RecursiveIteratorIterator::valid' => ['bool'], +'RecursiveRegexIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], +'RecursiveRegexIterator::accept' => ['bool'], +'RecursiveRegexIterator::current' => [''], +'RecursiveRegexIterator::getChildren' => ['RecursiveRegexIterator'], +'RecursiveRegexIterator::getFlags' => ['int'], +'RecursiveRegexIterator::getInnerIterator' => ['Iterator'], +'RecursiveRegexIterator::getMode' => ['int'], +'RecursiveRegexIterator::getPregFlags' => ['int'], +'RecursiveRegexIterator::getRegex' => ['string'], +'RecursiveRegexIterator::hasChildren' => ['bool'], +'RecursiveRegexIterator::key' => [''], +'RecursiveRegexIterator::next' => [''], +'RecursiveRegexIterator::rewind' => [''], +'RecursiveRegexIterator::setFlags' => ['void', 'new_flags'=>'int'], +'RecursiveRegexIterator::setMode' => ['void', 'new_mode'=>'int'], +'RecursiveRegexIterator::setPregFlags' => ['void', 'new_flags'=>'int'], +'RecursiveRegexIterator::valid' => [''], +'RecursiveTreeIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'flags='=>'int', 'cit_flags='=>'int', 'mode'=>'int'], +'RecursiveTreeIterator::beginChildren' => ['void'], +'RecursiveTreeIterator::beginIteration' => ['RecursiveIterator'], +'RecursiveTreeIterator::callGetChildren' => ['RecursiveIterator'], +'RecursiveTreeIterator::callHasChildren' => ['bool'], +'RecursiveTreeIterator::current' => ['string'], +'RecursiveTreeIterator::endChildren' => ['void'], +'RecursiveTreeIterator::endIteration' => ['void'], +'RecursiveTreeIterator::getDepth' => ['int'], +'RecursiveTreeIterator::getEntry' => ['string'], +'RecursiveTreeIterator::getInnerIterator' => ['RecursiveIterator'], +'RecursiveTreeIterator::getMaxDepth' => ['false|int'], +'RecursiveTreeIterator::getPostfix' => ['string'], +'RecursiveTreeIterator::getPrefix' => ['string'], +'RecursiveTreeIterator::getSubIterator' => ['RecursiveIterator', 'level='=>'int'], +'RecursiveTreeIterator::key' => ['string'], +'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::valid' => ['bool'], +'Redis::__construct' => ['void'], +'Redis::__destruct' => ['void'], +'Redis::_prefix' => ['string', 'value'=>'mixed'], +'Redis::_serialize' => ['mixed', 'value'=>'mixed'], +'Redis::_unserialize' => ['mixed', 'value'=>'string'], +'Redis::append' => ['int', 'key'=>'string', 'value'=>'string'], +'Redis::auth' => ['bool', 'password'=>'string'], +'Redis::bgRewriteAOF' => ['bool'], +'Redis::bgSave' => ['bool'], +'Redis::bitCount' => ['int', 'key'=>'string'], +'Redis::bitOp' => ['int', 'operation'=>'string', 'ret_key'=>'string', 'key'=>'string', '...other_keys='=>'string'], +'Redis::bitpos' => ['int', 'key'=>'string', 'bit'=>'int', 'start='=>'int', 'end='=>'int'], +'Redis::blPop' => ['array', 'keys'=>'string[]', 'timeout'=>'int'], +'Redis::blPop\'1' => ['array', 'key'=>'string', 'timeout_or_key'=>'int|string', '...extra_args'=>'int|string'], +'Redis::brPop' => ['array', 'keys'=>'string[]', 'timeout'=>'int'], +'Redis::brPop\'1' => ['array', 'key'=>'string', 'timeout_or_key'=>'int|string', '...extra_args'=>'int|string'], +'Redis::brpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'], +'Redis::clearLastError' => ['bool'], +'Redis::client' => ['mixed', 'command'=>'string', 'arg='=>'string'], +'Redis::close' => ['bool'], +'Redis::command' => ['', '...args'=>''], +'Redis::config' => ['string', 'operation'=>'string', 'key'=>'string', 'value='=>'string'], +'Redis::connect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'reserved='=>'null', 'retry_interval='=>'?int', 'read_timeout='=>'float'], +'Redis::dbSize' => ['int'], +'Redis::debug' => ['', 'key'=>''], +'Redis::decr' => ['int', 'key'=>'string'], +'Redis::decrBy' => ['int', 'key'=>'string', 'value'=>'int'], +'Redis::decrByFloat' => ['float', 'key'=>'string', 'value'=>'float'], +'Redis::del' => ['int', 'key'=>'string', '...args'=>'string'], +'Redis::del\'1' => ['int', 'key'=>'string[]'], +'Redis::delete' => ['int', 'key'=>'string', '...args'=>'string'], +'Redis::delete\'1' => ['int', 'key'=>'string[]'], +'Redis::discard' => [''], +'Redis::dump' => ['string|false', 'key'=>'string'], +'Redis::echo' => ['string', 'message'=>'string'], +'Redis::eval' => ['mixed', 'script'=>'', 'args='=>'', 'numKeys='=>''], +'Redis::evalSha' => ['mixed', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], +'Redis::evaluate' => ['mixed', 'script'=>'string', 'args='=>'array', 'numKeys='=>'int'], +'Redis::evaluateSha' => ['', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], +'Redis::exec' => ['array'], +'Redis::exists' => ['int', 'keys'=>'string|string[]'], +'Redis::exists\'1' => ['int', '...keys'=>'string'], +'Redis::expire' => ['bool', 'key'=>'string', 'ttl'=>'int'], +'Redis::expireAt' => ['bool', 'key'=>'string', 'expiry'=>'int'], +'Redis::flushAll' => ['bool', 'async='=>'bool'], +'Redis::flushDb' => ['bool', 'async='=>'bool'], +'Redis::geoAdd' => ['int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'member'=>'string', '...other_triples='=>'string|int|float'], +'Redis::geoDist' => ['float', 'key'=>'string', 'member1'=>'string', 'member2'=>'string', 'unit='=>'string'], +'Redis::geoHash' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], +'Redis::geoPos' => ['array', 'key'=>'string', 'member'=>'string', '...members='=>'string'], +'Redis::geoRadius' => ['array|int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'unit'=>'float', 'options='=>'array'], +'Redis::geoRadiusByMember' => ['array|int', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'units'=>'string', 'options='=>'array'], +'Redis::get' => ['string|false', 'key'=>'string'], +'Redis::getAuth' => ['string|false|null'], +'Redis::getBit' => ['int', 'key'=>'string', 'offset'=>'int'], +'Redis::getDBNum' => ['int|false'], +'Redis::getHost' => ['string|false'], +'Redis::getKeys' => ['array', 'pattern'=>'string'], +'Redis::getLastError' => ['?string'], +'Redis::getMode' => ['int'], +'Redis::getMultiple' => ['array', 'keys'=>'string[]'], +'Redis::getOption' => ['int', 'name'=>'int'], +'Redis::getPersistentID' => ['string|false|null'], +'Redis::getPort' => ['int|false'], +'Redis::getRange' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], +'Redis::getReadTimeout' => ['float|false'], +'Redis::getSet' => ['string', 'key'=>'string', 'string'=>'string'], +'Redis::getTimeout' => ['float|false'], +'Redis::hDel' => ['int|false', 'key'=>'string', 'hashKey1'=>'string', '...otherHashKeys='=>'string'], +'Redis::hExists' => ['bool', 'key'=>'string', 'hashKey'=>'string'], +'Redis::hGet' => ['string|false', 'key'=>'string', 'hashKey'=>'string'], +'Redis::hGetAll' => ['array', 'key'=>'string'], +'Redis::hIncrBy' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'int'], +'Redis::hIncrByFloat' => ['float', 'key'=>'string', 'field'=>'string', 'increment'=>'float'], +'Redis::hKeys' => ['array', 'key'=>'string'], +'Redis::hLen' => ['int|false', 'key'=>'string'], +'Redis::hMGet' => ['array', 'key'=>'string', 'hashKeys'=>'array'], +'Redis::hMSet' => ['bool', 'key'=>'string', 'hashKeys'=>'array'], +'Redis::hScan' => ['array', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], +'Redis::hSet' => ['int|false', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], +'Redis::hSetNx' => ['bool', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], +'Redis::hStrLen' => ['', 'key'=>'', 'member'=>''], +'Redis::hVals' => ['array', 'key'=>'string'], +'Redis::incr' => ['int', 'key'=>'string'], +'Redis::incrBy' => ['int', 'key'=>'string', 'value'=>'int'], +'Redis::incrByFloat' => ['float', 'key'=>'string', 'value'=>'float'], +'Redis::info' => ['array', 'option='=>'string'], +'Redis::isConnected' => ['bool'], +'Redis::keys' => ['array', 'pattern'=>'string'], +'Redis::lastSave' => ['int'], +'Redis::lGet' => ['string', 'key'=>'string', 'index'=>'int'], +'Redis::lGetRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], +'Redis::lIndex' => ['string|false', 'key'=>'string', 'index'=>'int'], +'Redis::lInsert' => ['int', 'key'=>'string', 'position'=>'int', 'pivot'=>'string', 'value'=>'string'], +'Redis::listTrim' => ['', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], +'Redis::lLen' => ['int|false', 'key'=>'string'], +'Redis::lPop' => ['string|false', 'key'=>'string'], +'Redis::lPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], +'Redis::lPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], +'Redis::lRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], +'Redis::lRem' => ['int|false', 'key'=>'string', 'value'=>'string', 'count'=>'int'], +'Redis::lRemove' => ['int', 'key'=>'string', 'value'=>'string', 'count'=>'int'], +'Redis::lSet' => ['bool', 'key'=>'string', 'index'=>'int', 'value'=>'string'], +'Redis::lSize' => ['int', 'key'=>'string'], +'Redis::lTrim' => ['array|false', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], +'Redis::mGet' => ['array', 'keys'=>'string[]'], +'Redis::migrate' => ['bool', 'host'=>'string', 'port'=>'int', 'key'=>'string|string[]', 'db'=>'int', 'timeout'=>'int', 'copy='=>'bool', 'replace='=>'bool'], +'Redis::move' => ['bool', 'key'=>'string', 'dbindex'=>'int'], +'Redis::mSet' => ['bool', 'pairs'=>'array'], +'Redis::mSetNx' => ['bool', 'pairs'=>'array'], +'Redis::multi' => ['Redis', 'mode='=>'int'], +'Redis::object' => ['string|long|false', 'info'=>'string', 'key'=>'string'], +'Redis::open' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'reserved='=>'null', 'retry_interval='=>'?int', 'read_timeout='=>'float'], +'Redis::pconnect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'persistent_id='=>'string', 'retry_interval='=>'?int'], +'Redis::persist' => ['bool', 'key'=>'string'], +'Redis::pExpire' => ['bool', 'key'=>'string', 'ttl'=>'int'], +'Redis::pexpireAt' => ['bool', 'key'=>'string', 'expiry'=>'int'], +'Redis::pfAdd' => ['bool', 'key'=>'string', 'elements'=>'array'], +'Redis::pfCount' => ['int', 'key'=>'array|string'], +'Redis::pfMerge' => ['bool', 'destkey'=>'string', 'sourcekeys'=>'array'], +'Redis::ping' => ['string'], +'Redis::pipeline' => ['Redis'], +'Redis::popen' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'persistent_id='=>'string', 'retry_interval='=>'?int'], +'Redis::psetex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], +'Redis::psubscribe' => ['', 'patterns'=>'array', 'callback'=>'array|string'], +'Redis::pttl' => ['int|false', 'key'=>'string'], +'Redis::publish' => ['int', 'channel'=>'string', 'message'=>'string'], +'Redis::pubsub' => ['array|int', 'keyword'=>'string', 'argument='=>'array|string'], +'Redis::punsubscribe' => ['', 'pattern'=>'string', '...other_patterns='=>'string'], +'Redis::randomKey' => ['string'], +'Redis::rawCommand' => ['mixed', 'command'=>'string', '...arguments='=>'mixed'], +'Redis::rename' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], +'Redis::renameKey' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], +'Redis::renameNx' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], +'Redis::resetStat' => ['bool'], +'Redis::restore' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], +'Redis::role' => ['array', 'nodeParams'=>'string|array{0:string,1:int}'], +'Redis::rPop' => ['string|false', 'key'=>'string'], +'Redis::rpoplpush' => ['string', 'srcKey'=>'string', 'dstKey'=>'string'], +'Redis::rPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], +'Redis::rPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], +'Redis::sAdd' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], +'Redis::sAddArray' => ['bool', 'key'=>'string', 'values'=>'array'], +'Redis::save' => ['bool'], +'Redis::scan' => ['array|false', '&rw_iterator'=>'?int', 'pattern='=>'?string', 'count='=>'?int'], +'Redis::sCard' => ['int', 'key'=>'string'], +'Redis::sContains' => ['', 'key'=>'string', 'value'=>'string'], +'Redis::script' => ['mixed', 'command'=>'string', '...args='=>'mixed'], +'Redis::sDiff' => ['array', 'key1'=>'string', '...other_keys='=>'string'], +'Redis::sDiffStore' => ['int|false', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], +'Redis::select' => ['bool', 'dbindex'=>'int'], +'Redis::sendEcho' => ['string', 'msg'=>'string'], +'Redis::set' => ['bool', 'key'=>'string', 'value'=>'mixed', 'options='=>'array'], +'Redis::set\'1' => ['bool', 'key'=>'string', 'value'=>'mixed', 'timeout='=>'int'], +'Redis::setBit' => ['int', 'key'=>'string', 'offset'=>'int', 'value'=>'int'], +'Redis::setEx' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], +'Redis::setNx' => ['bool', 'key'=>'string', 'value'=>'string'], +'Redis::setOption' => ['bool', 'name'=>'int', 'value'=>'mixed'], +'Redis::setRange' => ['int', 'key'=>'string', 'offset'=>'int', 'end'=>'int'], +'Redis::setTimeout' => ['', 'key'=>'string', 'ttl'=>'int'], +'Redis::sGetMembers' => ['', 'key'=>'string'], +'Redis::sInter' => ['array|false', 'key'=>'string', '...other_keys='=>'string'], +'Redis::sInterStore' => ['int|false', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], +'Redis::sIsMember' => ['bool', 'key'=>'string', 'value'=>'string'], +'Redis::slave' => ['bool', 'host'=>'string', 'port'=>'int'], +'Redis::slave\'1' => ['bool', 'host'=>'string', 'port'=>'int'], +'Redis::slaveof' => ['bool', 'host='=>'string', 'port='=>'int'], +'Redis::slowLog' => ['mixed', 'operation'=>'string', 'length='=>'int'], +'Redis::sMembers' => ['array', 'key'=>'string'], +'Redis::sMove' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string', 'member'=>'string'], +'Redis::sort' => ['array|int', 'key'=>'string', 'options='=>'array'], +'Redis::sortAsc' => ['array', 'key'=>'string', 'pattern='=>'string', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], +'Redis::sortAscAlpha' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], +'Redis::sortDesc' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], +'Redis::sortDescAlpha' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], +'Redis::sPop' => ['string|false', 'key'=>'string'], +'Redis::sRandMember' => ['array|string|false', 'key'=>'string', 'count='=>'int'], +'Redis::sRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], +'Redis::sRemove' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], +'Redis::sScan' => ['array|bool', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], +'Redis::sSize' => ['int', 'key'=>'string'], +'Redis::strLen' => ['int', 'key'=>'string'], +'Redis::subscribe' => ['mixed|null', 'channels'=>'array', 'callback'=>'string|array'], +'Redis::substr' => ['', 'key'=>'string', 'start'=>'int', 'end'=>'int'], +'Redis::sUnion' => ['array', 'key'=>'string', '...other_keys='=>'string'], +'Redis::sUnionStore' => ['int', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], +'Redis::swapdb' => ['bool', 'srcdb'=>'int', 'dstdb'=>'int'], +'Redis::time' => ['array'], +'Redis::ttl' => ['int|false', 'key'=>'string'], +'Redis::type' => ['int', 'key'=>'string'], +'Redis::unlink' => ['int', 'key'=>'string', '...args'=>'string'], +'Redis::unlink\'1' => ['int', 'key'=>'string[]'], +'Redis::unsubscribe' => ['', 'channel'=>'string', '...other_channels='=>'string'], +'Redis::unwatch' => [''], +'Redis::wait' => ['int', 'numSlaves'=>'int', 'timeout'=>'int'], +'Redis::watch' => ['void', 'key'=>'string', '...other_keys='=>'string'], +'Redis::xack' => ['', 'str_key'=>'string', 'str_group'=>'string', 'arr_ids'=>'array'], +'Redis::xadd' => ['', 'str_key'=>'string', 'str_id'=>'string', 'arr_fields'=>'array', 'i_maxlen='=>'', 'boo_approximate='=>''], +'Redis::xclaim' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_consumer'=>'string', 'i_min_idle'=>'', 'arr_ids'=>'array', 'arr_opts='=>'array'], +'Redis::xdel' => ['', 'str_key'=>'string', 'arr_ids'=>'array'], +'Redis::xgroup' => ['', 'str_operation'=>'string', 'str_key='=>'string', 'str_arg1='=>'', 'str_arg2='=>'', 'str_arg3='=>''], +'Redis::xinfo' => ['', 'str_cmd'=>'string', 'str_key='=>'string', 'str_group='=>'string'], +'Redis::xlen' => ['', 'key'=>''], +'Redis::xpending' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_start='=>'', 'str_end='=>'', 'i_count='=>'', 'str_consumer='=>'string'], +'Redis::xrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], +'Redis::xread' => ['', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], +'Redis::xreadgroup' => ['', 'str_group'=>'string', 'str_consumer'=>'string', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], +'Redis::xrevrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], +'Redis::xtrim' => ['', 'str_key'=>'string', 'i_maxlen'=>'', 'boo_approximate='=>''], +'Redis::zAdd' => ['int', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], +'Redis::zAdd\'1' => ['int', 'options'=>'array', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], +'Redis::zCard' => ['int', 'key'=>'string'], +'Redis::zCount' => ['int', 'key'=>'string', 'start'=>'string', 'end'=>'string'], +'Redis::zDelete' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], +'Redis::zDeleteRangeByRank' => ['', 'key'=>'string', 'start'=>'int', 'end'=>'int'], +'Redis::zDeleteRangeByScore' => ['', 'key'=>'string', 'start'=>'float', 'end'=>'float'], +'Redis::zIncrBy' => ['float', 'key'=>'string', 'value'=>'float', 'member'=>'string'], +'Redis::zInter' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], +'Redis::zInterStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], +'Redis::zLexCount' => ['int', 'key'=>'string', 'min'=>'string', 'max'=>'string'], +'Redis::zRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscores='=>'bool'], +'Redis::zRangeByLex' => ['array|false', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], +'Redis::zRangeByScore' => ['array', 'key'=>'string', 'start'=>'int|string', 'end'=>'int|string', 'options='=>'array'], +'Redis::zRank' => ['int', 'key'=>'string', 'member'=>'string'], +'Redis::zRem' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], +'Redis::zRemove' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], +'Redis::zRemoveRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], +'Redis::zRemoveRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], +'Redis::zRemRangeByLex' => ['int', 'key'=>'string', 'min'=>'string', 'max'=>'string'], +'Redis::zRemRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], +'Redis::zRemRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], +'Redis::zReverseRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], +'Redis::zRevRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], +'Redis::zRevRangeByLex' => ['array', 'key'=>'string', 'min'=>'string', 'max'=>'string', 'offset='=>'int', 'limit='=>'int'], +'Redis::zRevRangeByScore' => ['array', 'key'=>'string', 'start'=>'string', 'end'=>'string', 'options='=>'array'], +'Redis::zRevRank' => ['int', 'key'=>'string', 'member'=>'string'], +'Redis::zScan' => ['array|bool', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], +'Redis::zScore' => ['float|false', 'key'=>'string', 'member'=>'string'], +'Redis::zSize' => ['', 'key'=>'string'], +'Redis::zUnion' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], +'Redis::zUnionStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], +'RedisArray::__call' => ['mixed', 'function_name'=>'string', 'arguments'=>'array'], +'RedisArray::__construct' => ['void', 'name='=>'string', 'hosts='=>'?array', 'opts='=>'?array'], +'RedisArray::_continuum' => [''], +'RedisArray::_distributor' => [''], +'RedisArray::_function' => ['string'], +'RedisArray::_hosts' => ['array'], +'RedisArray::_instance' => ['', 'host'=>''], +'RedisArray::_rehash' => ['', 'callable='=>'callable'], +'RedisArray::_target' => ['string', 'key'=>'string'], +'RedisArray::bgsave' => [''], +'RedisArray::del' => ['bool', 'key'=>'string', '...args'=>'string'], +'RedisArray::delete' => ['bool', 'key'=>'string', '...args'=>'string'], +'RedisArray::delete\'1' => ['bool', 'key'=>'string[]'], +'RedisArray::discard' => [''], +'RedisArray::exec' => ['array'], +'RedisArray::flushAll' => ['bool', 'async='=>'bool'], +'RedisArray::flushDb' => ['bool', 'async='=>'bool'], +'RedisArray::getMultiple' => ['', 'keys'=>''], +'RedisArray::getOption' => ['', 'opt'=>''], +'RedisArray::info' => ['array'], +'RedisArray::keys' => ['array', 'pattern'=>''], +'RedisArray::mGet' => ['array', 'keys'=>'string[]'], +'RedisArray::mSet' => ['bool', 'pairs'=>'array'], +'RedisArray::multi' => ['RedisArray', 'host'=>'string', 'mode='=>'int'], +'RedisArray::ping' => ['string'], +'RedisArray::save' => ['bool'], +'RedisArray::select' => ['', 'index'=>''], +'RedisArray::setOption' => ['', 'opt'=>'', 'value'=>''], +'RedisArray::unlink' => ['int', 'key'=>'string', '...other_keys='=>'string'], +'RedisArray::unlink\'1' => ['int', 'key'=>'string[]'], +'RedisArray::unwatch' => [''], +'RedisCluster::__construct' => ['void', 'name'=>'?string', 'seeds='=>'string[]', 'timeout='=>'float', 'readTimeout='=>'float', 'persistent='=>'bool', 'auth='=>'?string'], +'RedisCluster::_masters' => ['array'], +'RedisCluster::_prefix' => ['string', 'value'=>'mixed'], +'RedisCluster::_redir' => [''], +'RedisCluster::_serialize' => ['mixed', 'value'=>'mixed'], +'RedisCluster::_unserialize' => ['mixed', 'value'=>'string'], +'RedisCluster::append' => ['int', 'key'=>'string', 'value'=>'string'], +'RedisCluster::bgrewriteaof' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], +'RedisCluster::bgsave' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], +'RedisCluster::bitCount' => ['int', 'key'=>'string'], +'RedisCluster::bitOp' => ['int', 'operation'=>'string', 'retKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], +'RedisCluster::bitpos' => ['int', 'key'=>'string', 'bit'=>'int', 'start='=>'int', 'end='=>'int'], +'RedisCluster::blPop' => ['array', 'keys'=>'array', 'timeout'=>'int'], +'RedisCluster::brPop' => ['array', 'keys'=>'array', 'timeout'=>'int'], +'RedisCluster::brpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'], +'RedisCluster::clearLastError' => ['bool'], +'RedisCluster::client' => ['', 'nodeParams'=>'string|array{0:string,1:int}', 'subCmd='=>'string', '...args='=>''], +'RedisCluster::close' => [''], +'RedisCluster::cluster' => ['mixed', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'arguments='=>'mixed'], +'RedisCluster::command' => ['array|bool'], +'RedisCluster::config' => ['array|bool', 'nodeParams'=>'string|array{0:string,1:int}', 'operation'=>'string', 'key'=>'string', 'value='=>'string'], +'RedisCluster::dbSize' => ['int', 'nodeParams'=>'string|array{0:string,1:int}'], +'RedisCluster::decr' => ['int', 'key'=>'string'], +'RedisCluster::decrBy' => ['int', 'key'=>'string', 'value'=>'int'], +'RedisCluster::del' => ['int', 'key'=>'string', '...other_keys='=>'string'], +'RedisCluster::del\'1' => ['int', 'key'=>'string[]'], +'RedisCluster::discard' => [''], +'RedisCluster::dump' => ['string|false', 'key'=>'string'], +'RedisCluster::echo' => ['string', 'nodeParams'=>'string|array{0:string,1:int}', 'msg'=>'string'], +'RedisCluster::eval' => ['mixed', 'script'=>'', 'args='=>'', 'numKeys='=>''], +'RedisCluster::evalSha' => ['mixed', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], +'RedisCluster::exec' => ['array|void'], +'RedisCluster::exists' => ['bool', 'key'=>'string'], +'RedisCluster::expire' => ['bool', 'key'=>'string', 'ttl'=>'int'], +'RedisCluster::expireAt' => ['bool', 'key'=>'string', 'timestamp'=>'int'], +'RedisCluster::flushAll' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}', 'async='=>'bool'], +'RedisCluster::flushDB' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}', 'async='=>'bool'], +'RedisCluster::geoAdd' => ['int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'member'=>'string', '...other_members='=>'float|string'], +'RedisCluster::geoDist' => ['', 'key'=>'string', 'member1'=>'string', 'member2'=>'string', 'unit='=>'string'], +'RedisCluster::geohash' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], +'RedisCluster::geopos' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], +'RedisCluster::geoRadius' => ['', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'radiusUnit'=>'string', 'options='=>'array'], +'RedisCluster::geoRadiusByMember' => ['string[]', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'radiusUnit'=>'string', 'options='=>'array'], +'RedisCluster::get' => ['string|false', 'key'=>'string'], +'RedisCluster::getBit' => ['int', 'key'=>'string', 'offset'=>'int'], +'RedisCluster::getLastError' => ['?string'], +'RedisCluster::getMode' => ['int'], +'RedisCluster::getOption' => ['int', 'option'=>'int'], +'RedisCluster::getRange' => ['string', 'key'=>'string', 'start'=>'int', 'end'=>'int'], +'RedisCluster::getSet' => ['string', 'key'=>'string', 'value'=>'string'], +'RedisCluster::hDel' => ['int|false', 'key'=>'string', 'hashKey'=>'string', '...other_hashKeys='=>'string[]'], +'RedisCluster::hExists' => ['bool', 'key'=>'string', 'hashKey'=>'string'], +'RedisCluster::hGet' => ['string|false', 'key'=>'string', 'hashKey'=>'string'], +'RedisCluster::hGetAll' => ['array', 'key'=>'string'], +'RedisCluster::hIncrBy' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'int'], +'RedisCluster::hIncrByFloat' => ['float', 'key'=>'string', 'field'=>'string', 'increment'=>'float'], +'RedisCluster::hKeys' => ['array', 'key'=>'string'], +'RedisCluster::hLen' => ['int|false', 'key'=>'string'], +'RedisCluster::hMGet' => ['array', 'key'=>'string', 'hashKeys'=>'array'], +'RedisCluster::hMSet' => ['bool', 'key'=>'string', 'hashKeys'=>'array'], +'RedisCluster::hScan' => ['array', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], +'RedisCluster::hSet' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], +'RedisCluster::hSetNx' => ['bool', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], +'RedisCluster::hStrlen' => ['int', 'key'=>'string', 'member'=>'string'], +'RedisCluster::hVals' => ['array', 'key'=>'string'], +'RedisCluster::incr' => ['int', 'key'=>'string'], +'RedisCluster::incrBy' => ['int', 'key'=>'string', 'value'=>'int'], +'RedisCluster::incrByFloat' => ['float', 'key'=>'string', 'increment'=>'float'], +'RedisCluster::info' => ['array', 'nodeParams'=>'string|array{0:string,1:int}', 'option='=>'string'], +'RedisCluster::keys' => ['array', 'pattern'=>'string'], +'RedisCluster::lastSave' => ['int', 'nodeParams'=>'string|array{0:string,1:int}'], +'RedisCluster::lGet' => ['', 'key'=>'string', 'index'=>'int'], +'RedisCluster::lIndex' => ['string|false', 'key'=>'string', 'index'=>'int'], +'RedisCluster::lInsert' => ['int', 'key'=>'string', 'position'=>'int', 'pivot'=>'string', 'value'=>'string'], +'RedisCluster::lLen' => ['int', 'key'=>'string'], +'RedisCluster::lPop' => ['string|false', 'key'=>'string'], +'RedisCluster::lPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], +'RedisCluster::lPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], +'RedisCluster::lRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], +'RedisCluster::lRem' => ['int|false', 'key'=>'string', 'value'=>'string', 'count'=>'int'], +'RedisCluster::lSet' => ['bool', 'key'=>'string', 'index'=>'int', 'value'=>'string'], +'RedisCluster::lTrim' => ['array|false', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], +'RedisCluster::mget' => ['array', 'array'=>'array'], +'RedisCluster::mset' => ['bool', 'array'=>'array'], +'RedisCluster::msetnx' => ['int', 'array'=>'array'], +'RedisCluster::multi' => ['Redis', 'mode='=>'int'], +'RedisCluster::object' => ['string|int|false', 'string'=>'string', 'key'=>'string'], +'RedisCluster::persist' => ['bool', 'key'=>'string'], +'RedisCluster::pExpire' => ['bool', 'key'=>'string', 'ttl'=>'int'], +'RedisCluster::pExpireAt' => ['bool', 'key'=>'string', 'timestamp'=>'int'], +'RedisCluster::pfAdd' => ['bool', 'key'=>'string', 'elements'=>'array'], +'RedisCluster::pfCount' => ['int', 'key'=>'string'], +'RedisCluster::pfMerge' => ['bool', 'destKey'=>'string', 'sourceKeys'=>'array'], +'RedisCluster::ping' => ['string', 'nodeParams'=>'string|array{0:string,1:int}'], +'RedisCluster::psetex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], +'RedisCluster::psubscribe' => ['mixed', 'patterns'=>'array', 'callback'=>'string'], +'RedisCluster::pttl' => ['int', 'key'=>'string'], +'RedisCluster::publish' => ['int', 'channel'=>'string', 'message'=>'string'], +'RedisCluster::pubsub' => ['array', 'nodeParams'=>'string', 'keyword'=>'string', '...argument='=>'string'], +'RedisCluster::punSubscribe' => ['', 'channels'=>'', 'callback'=>''], +'RedisCluster::randomKey' => ['string', 'nodeParams'=>'string|array{0:string,1:int}'], +'RedisCluster::rawCommand' => ['mixed', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'arguments='=>'mixed'], +'RedisCluster::rename' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string'], +'RedisCluster::renameNx' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string'], +'RedisCluster::restore' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], +'RedisCluster::role' => ['array'], +'RedisCluster::rPop' => ['string|false', 'key'=>'string'], +'RedisCluster::rpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string'], +'RedisCluster::rPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], +'RedisCluster::rPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], +'RedisCluster::sAdd' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], +'RedisCluster::sAddArray' => ['int|false', 'key'=>'string', 'valueArray'=>'array'], +'RedisCluster::save' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], +'RedisCluster::scan' => ['array|false', '&iterator'=>'int', 'nodeParams'=>'string|array{0:string,1:int}', 'pattern='=>'string', 'count='=>'int'], +'RedisCluster::sCard' => ['int', 'key'=>'string'], +'RedisCluster::script' => ['string|bool|array', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'script='=>'string', '...other_scripts='=>'string[]'], +'RedisCluster::sDiff' => ['list', 'key1'=>'string', 'key2'=>'string', '...other_keys='=>'string'], +'RedisCluster::sDiffStore' => ['int', 'dstKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], +'RedisCluster::set' => ['bool', 'key'=>'string', 'value'=>'string', 'timeout='=>'array|int'], +'RedisCluster::setBit' => ['int', 'key'=>'string', 'offset'=>'int', 'value'=>'bool|int'], +'RedisCluster::setex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], +'RedisCluster::setnx' => ['bool', 'key'=>'string', 'value'=>'string'], +'RedisCluster::setOption' => ['bool', 'option'=>'int', 'value'=>'string|int'], +'RedisCluster::setRange' => ['string', 'key'=>'string', 'offset'=>'int', 'value'=>'string'], +'RedisCluster::sInter' => ['list', 'key'=>'string', '...other_keys='=>'string'], +'RedisCluster::sInterStore' => ['int', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], +'RedisCluster::sIsMember' => ['bool', 'key'=>'string', 'value'=>'string'], +'RedisCluster::slowLog' => ['array|int|bool', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'length='=>'int'], +'RedisCluster::sMembers' => ['list', 'key'=>'string'], +'RedisCluster::sMove' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string', 'member'=>'string'], +'RedisCluster::sort' => ['array', 'key'=>'string', 'option='=>'array'], +'RedisCluster::sPop' => ['string', 'key'=>'string'], +'RedisCluster::sRandMember' => ['array|string', 'key'=>'string', 'count='=>'int'], +'RedisCluster::sRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], +'RedisCluster::sScan' => ['array|false', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'null', 'count='=>'int'], +'RedisCluster::strlen' => ['int', 'key'=>'string'], +'RedisCluster::subscribe' => ['mixed', 'channels'=>'array', 'callback'=>'string'], +'RedisCluster::sUnion' => ['list', 'key1'=>'string', '...other_keys='=>'string'], +'RedisCluster::sUnion\'1' => ['list', 'keys'=>'string[]'], +'RedisCluster::sUnionStore' => ['int', 'dstKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], +'RedisCluster::time' => ['array'], +'RedisCluster::ttl' => ['int', 'key'=>'string'], +'RedisCluster::type' => ['int', 'key'=>'string'], +'RedisCluster::unlink' => ['int', 'key'=>'string', '...other_keys='=>'string'], +'RedisCluster::unSubscribe' => ['', 'channels'=>'', '...other_channels='=>''], +'RedisCluster::unwatch' => [''], +'RedisCluster::watch' => ['void', 'key'=>'string', '...other_keys='=>'string'], +'RedisCluster::xack' => ['', 'str_key'=>'string', 'str_group'=>'string', 'arr_ids'=>'array'], +'RedisCluster::xadd' => ['', 'str_key'=>'string', 'str_id'=>'string', 'arr_fields'=>'array', 'i_maxlen='=>'', 'boo_approximate='=>''], +'RedisCluster::xclaim' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_consumer'=>'string', 'i_min_idle'=>'', 'arr_ids'=>'array', 'arr_opts='=>'array'], +'RedisCluster::xdel' => ['', 'str_key'=>'string', 'arr_ids'=>'array'], +'RedisCluster::xgroup' => ['', 'str_operation'=>'string', 'str_key='=>'string', 'str_arg1='=>'', 'str_arg2='=>'', 'str_arg3='=>''], +'RedisCluster::xinfo' => ['', 'str_cmd'=>'string', 'str_key='=>'string', 'str_group='=>'string'], +'RedisCluster::xlen' => ['', 'key'=>''], +'RedisCluster::xpending' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_start='=>'', 'str_end='=>'', 'i_count='=>'', 'str_consumer='=>'string'], +'RedisCluster::xrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], +'RedisCluster::xread' => ['', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], +'RedisCluster::xreadgroup' => ['', 'str_group'=>'string', 'str_consumer'=>'string', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], +'RedisCluster::xrevrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], +'RedisCluster::xtrim' => ['', 'str_key'=>'string', 'i_maxlen'=>'', 'boo_approximate='=>''], +'RedisCluster::zAdd' => ['int', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], +'RedisCluster::zCard' => ['int', 'key'=>'string'], +'RedisCluster::zCount' => ['int', 'key'=>'string', 'start'=>'string', 'end'=>'string'], +'RedisCluster::zIncrBy' => ['float', 'key'=>'string', 'value'=>'float', 'member'=>'string'], +'RedisCluster::zInterStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], +'RedisCluster::zLexCount' => ['int', 'key'=>'string', 'min'=>'int', 'max'=>'int'], +'RedisCluster::zRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscores='=>'bool'], +'RedisCluster::zRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], +'RedisCluster::zRangeByScore' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'options='=>'array'], +'RedisCluster::zRank' => ['int', 'key'=>'string', 'member'=>'string'], +'RedisCluster::zRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], +'RedisCluster::zRemRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int'], +'RedisCluster::zRemRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], +'RedisCluster::zRemRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], +'RedisCluster::zRevRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], +'RedisCluster::zRevRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], +'RedisCluster::zRevRangeByScore' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'options='=>'array'], +'RedisCluster::zRevRank' => ['int', 'key'=>'string', 'member'=>'string'], +'RedisCluster::zScan' => ['array|false', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], +'RedisCluster::zScore' => ['float', 'key'=>'string', 'member'=>'string'], +'RedisCluster::zUnionStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], +'Reflection::export' => ['?string', 'r'=>'reflector', 'return='=>'bool'], +'Reflection::getModifierNames' => ['array', 'modifiers'=>'int'], +'ReflectionClass::__clone' => ['void'], +'ReflectionClass::__construct' => ['void', 'argument'=>'object|class-string'], +'ReflectionClass::__toString' => ['string'], +'ReflectionClass::export' => ['?string', 'argument'=>'string|object', 'return='=>'bool'], +'ReflectionClass::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], +'ReflectionClass::getConstant' => ['mixed', 'name'=>'string'], +'ReflectionClass::getConstants' => ['array', 'filter=' => '?int'], +'ReflectionClass::getConstructor' => ['?ReflectionMethod'], +'ReflectionClass::getDefaultProperties' => ['array'], +'ReflectionClass::getDocComment' => ['string|false'], +'ReflectionClass::getEndLine' => ['int|false'], +'ReflectionClass::getExtension' => ['?ReflectionExtension'], +'ReflectionClass::getExtensionName' => ['string|false'], +'ReflectionClass::getFileName' => ['string|false'], +'ReflectionClass::getInterfaceNames' => ['list'], +'ReflectionClass::getInterfaces' => ['array'], +'ReflectionClass::getMethod' => ['ReflectionMethod', 'name'=>'string'], +'ReflectionClass::getMethods' => ['list', 'filter='=>'int'], +'ReflectionClass::getModifiers' => ['int'], +'ReflectionClass::getName' => ['class-string'], +'ReflectionClass::getNamespaceName' => ['string'], +'ReflectionClass::getParentClass' => ['ReflectionClass|false'], +'ReflectionClass::getProperties' => ['list', 'filter='=>'int'], +'ReflectionClass::getProperty' => ['ReflectionProperty', 'name'=>'string'], +'ReflectionClass::getReflectionConstant' => ['ReflectionClassConstant|false', 'name'=>'string'], +'ReflectionClass::getReflectionConstants' => ['list', 'filter='=>'?int'], +'ReflectionClass::getShortName' => ['string'], +'ReflectionClass::getStartLine' => ['int|false'], +'ReflectionClass::getStaticProperties' => ['array'], +'ReflectionClass::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'], +'ReflectionClass::getTraitAliases' => ['array|null'], +'ReflectionClass::getTraitNames' => ['list|null'], +'ReflectionClass::getTraits' => ['array'], +'ReflectionClass::hasConstant' => ['bool', 'name'=>'string'], +'ReflectionClass::hasMethod' => ['bool', 'name'=>'string'], +'ReflectionClass::hasProperty' => ['bool', 'name'=>'string'], +'ReflectionClass::implementsInterface' => ['bool', 'interface_name'=>'interface-string|ReflectionClass'], +'ReflectionClass::inNamespace' => ['bool'], +'ReflectionClass::isAbstract' => ['bool'], +'ReflectionClass::isAnonymous' => ['bool'], +'ReflectionClass::isCloneable' => ['bool'], +'ReflectionClass::isEnum' => ['bool'], +'ReflectionClass::isFinal' => ['bool'], +'ReflectionClass::isInstance' => ['bool', 'object'=>'object'], +'ReflectionClass::isInstantiable' => ['bool'], +'ReflectionClass::isInterface' => ['bool'], +'ReflectionClass::isInternal' => ['bool'], +'ReflectionClass::isIterable' => ['bool'], +'ReflectionClass::isIterateable' => ['bool'], +'ReflectionClass::isSubclassOf' => ['bool', 'class'=>'class-string|ReflectionClass'], +'ReflectionClass::isTrait' => ['bool'], +'ReflectionClass::isUserDefined' => ['bool'], +'ReflectionClass::newInstance' => ['object', '...args='=>'mixed'], +'ReflectionClass::newInstanceArgs' => ['object', 'args='=>'array'], +'ReflectionClass::newInstanceWithoutConstructor' => ['object'], +'ReflectionClass::setStaticPropertyValue' => ['void', 'name'=>'string', 'value'=>'mixed'], +'ReflectionClassConstant::__construct' => ['void', 'class'=>'mixed', 'name'=>'string'], +'ReflectionClassConstant::__toString' => ['string'], +'ReflectionClassConstant::export' => ['string', 'class'=>'mixed', 'name'=>'string', 'return='=>'bool'], +'ReflectionClassConstant::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], +'ReflectionClassConstant::getDeclaringClass' => ['ReflectionClass'], +'ReflectionClassConstant::getDocComment' => ['string|false'], +'ReflectionClassConstant::getModifiers' => ['int'], +'ReflectionClassConstant::getName' => ['string'], +'ReflectionClassConstant::getValue' => ['scalar|array|null'], +'ReflectionClassConstant::isPrivate' => ['bool'], +'ReflectionClassConstant::isProtected' => ['bool'], +'ReflectionClassConstant::isPublic' => ['bool'], +'ReflectionEnum::getBackingType' => ['?ReflectionType'], +'ReflectionEnum::getCase' => ['ReflectionEnumUnitCase', 'name' => 'string'], +'ReflectionEnum::getCases' => ['list'], +'ReflectionEnum::hasCase' => ['bool', 'name' => 'string'], +'ReflectionEnum::isBacked' => ['bool'], +'ReflectionEnumUnitCase::getEnum' => ['ReflectionEnum'], +'ReflectionEnumUnitCase::getValue' => ['UnitEnum'], +'ReflectionEnumBackedCase::getBackingValue' => ['string|int'], +'ReflectionExtension::__clone' => ['void'], +'ReflectionExtension::__construct' => ['void', 'name'=>'string'], +'ReflectionExtension::__toString' => ['string'], +'ReflectionExtension::export' => ['?string', 'name'=>'string', 'return='=>'bool'], +'ReflectionExtension::getClasses' => ['array'], +'ReflectionExtension::getClassNames' => ['list'], +'ReflectionExtension::getConstants' => ['array'], +'ReflectionExtension::getDependencies' => ['array'], +'ReflectionExtension::getFunctions' => ['array'], +'ReflectionExtension::getINIEntries' => ['array'], +'ReflectionExtension::getName' => ['string'], +'ReflectionExtension::getVersion' => ['string'], +'ReflectionExtension::info' => ['void'], +'ReflectionExtension::isPersistent' => ['bool'], +'ReflectionExtension::isTemporary' => ['bool'], +'ReflectionFunction::__construct' => ['void', 'name'=>'callable-string|Closure'], +'ReflectionFunction::__toString' => ['string'], +'ReflectionFunction::export' => ['?string', 'name'=>'string', 'return='=>'bool'], +'ReflectionFunction::getClosure' => ['?Closure'], +'ReflectionFunction::getClosureScopeClass' => ['ReflectionClass'], +'ReflectionFunction::getClosureThis' => ['bool'], +'ReflectionFunction::getDocComment' => ['string|false'], +'ReflectionFunction::getEndLine' => ['int|false'], +'ReflectionFunction::getExtension' => ['?ReflectionExtension'], +'ReflectionFunction::getExtensionName' => ['string|false'], +'ReflectionFunction::getFileName' => ['string|false'], +'ReflectionFunction::getName' => ['callable-string'], +'ReflectionFunction::getNamespaceName' => ['string'], +'ReflectionFunction::getNumberOfParameters' => ['int'], +'ReflectionFunction::getNumberOfRequiredParameters' => ['int'], +'ReflectionFunction::getParameters' => ['list'], +'ReflectionFunction::getReturnType' => ['?ReflectionType'], +'ReflectionFunction::getShortName' => ['string'], +'ReflectionFunction::getStartLine' => ['int|false'], +'ReflectionFunction::getStaticVariables' => ['array'], +'ReflectionFunction::hasReturnType' => ['bool'], +'ReflectionFunction::inNamespace' => ['bool'], +'ReflectionFunction::invoke' => ['mixed', '...args='=>'mixed'], +'ReflectionFunction::invokeArgs' => ['mixed', 'args'=>'array'], +'ReflectionFunction::isClosure' => ['bool'], +'ReflectionFunction::isDeprecated' => ['bool'], +'ReflectionFunction::isDisabled' => ['bool'], +'ReflectionFunction::isGenerator' => ['bool'], +'ReflectionFunction::isInternal' => ['bool'], +'ReflectionFunction::isUserDefined' => ['bool'], +'ReflectionFunction::isVariadic' => ['bool'], +'ReflectionFunction::returnsReference' => ['bool'], +'ReflectionFunctionAbstract::__clone' => ['void'], +'ReflectionFunctionAbstract::__toString' => ['string'], +'ReflectionFunctionAbstract::export' => ['?string'], +'ReflectionFunctionAbstract::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], +'ReflectionFunctionAbstract::getClosureScopeClass' => ['ReflectionClass|null'], +'ReflectionFunctionAbstract::getClosureThis' => ['object|null'], +'ReflectionFunctionAbstract::getDocComment' => ['string|false'], +'ReflectionFunctionAbstract::getEndLine' => ['int|false'], +'ReflectionFunctionAbstract::getExtension' => ['ReflectionExtension'], +'ReflectionFunctionAbstract::getExtensionName' => ['string'], +'ReflectionFunctionAbstract::getFileName' => ['string|false'], +'ReflectionFunctionAbstract::getName' => ['string'], +'ReflectionFunctionAbstract::getNamespaceName' => ['string'], +'ReflectionFunctionAbstract::getNumberOfParameters' => ['int'], +'ReflectionFunctionAbstract::getNumberOfRequiredParameters' => ['int'], +'ReflectionFunctionAbstract::getParameters' => ['list'], +'ReflectionFunctionAbstract::getReturnType' => ['?ReflectionType'], +'ReflectionFunctionAbstract::getShortName' => ['string'], +'ReflectionFunctionAbstract::getStartLine' => ['int|false'], +'ReflectionFunctionAbstract::getStaticVariables' => ['array'], +'ReflectionFunctionAbstract::getTentativeReturnType' => ['?ReflectionType'], +'ReflectionFunctionAbstract::hasReturnType' => ['bool'], +'ReflectionFunctionAbstract::hasTentativeReturnType' => ['bool'], +'ReflectionFunctionAbstract::inNamespace' => ['bool'], +'ReflectionFunctionAbstract::isClosure' => ['bool'], +'ReflectionFunctionAbstract::isDeprecated' => ['bool'], +'ReflectionFunctionAbstract::isGenerator' => ['bool'], +'ReflectionFunctionAbstract::isInternal' => ['bool'], +'ReflectionFunctionAbstract::isStatic' => ['bool'], +'ReflectionFunctionAbstract::isUserDefined' => ['bool'], +'ReflectionFunctionAbstract::isVariadic' => ['bool'], +'ReflectionFunctionAbstract::returnsReference' => ['bool'], +'ReflectionGenerator::__construct' => ['void', 'generator'=>'object'], +'ReflectionGenerator::getExecutingFile' => ['string'], +'ReflectionGenerator::getExecutingGenerator' => ['Generator'], +'ReflectionGenerator::getExecutingLine' => ['int'], +'ReflectionGenerator::getFunction' => ['ReflectionFunctionAbstract'], +'ReflectionGenerator::getThis' => ['?object'], +'ReflectionGenerator::getTrace' => ['array', 'options='=>'int'], +'ReflectionMethod::__construct' => ['void', 'class'=>'class-string|object', 'name'=>'string'], +'ReflectionMethod::__construct\'1' => ['void', 'class_method'=>'string'], +'ReflectionMethod::__toString' => ['string'], +'ReflectionMethod::export' => ['?string', 'class'=>'string', 'name'=>'string', 'return='=>'bool'], +'ReflectionMethod::getClosure' => ['?Closure', 'object='=>'object'], +'ReflectionMethod::getClosureScopeClass' => ['ReflectionClass'], +'ReflectionMethod::getClosureThis' => ['object'], +'ReflectionMethod::getDeclaringClass' => ['ReflectionClass'], +'ReflectionMethod::getDocComment' => ['false|string'], +'ReflectionMethod::getEndLine' => ['false|int'], +'ReflectionMethod::getExtension' => ['ReflectionExtension'], +'ReflectionMethod::getExtensionName' => ['string'], +'ReflectionMethod::getFileName' => ['false|string'], +'ReflectionMethod::getModifiers' => ['int'], +'ReflectionMethod::getName' => ['string'], +'ReflectionMethod::getNamespaceName' => ['string'], +'ReflectionMethod::getNumberOfParameters' => ['int'], +'ReflectionMethod::getNumberOfRequiredParameters' => ['int'], +'ReflectionMethod::getParameters' => ['list<\ReflectionParameter>'], +'ReflectionMethod::getPrototype' => ['ReflectionMethod'], +'ReflectionMethod::getReturnType' => ['?ReflectionType'], +'ReflectionMethod::getShortName' => ['string'], +'ReflectionMethod::getStartLine' => ['false|int'], +'ReflectionMethod::getStaticVariables' => ['array'], +'ReflectionMethod::hasReturnType' => ['bool'], +'ReflectionMethod::inNamespace' => ['bool'], +'ReflectionMethod::invoke' => ['mixed', 'object'=>'?object', '...args='=>'mixed'], +'ReflectionMethod::invokeArgs' => ['mixed', 'object'=>'?object', 'args'=>'array'], +'ReflectionMethod::isAbstract' => ['bool'], +'ReflectionMethod::isClosure' => ['bool'], +'ReflectionMethod::isConstructor' => ['bool'], +'ReflectionMethod::isDeprecated' => ['bool'], +'ReflectionMethod::isDestructor' => ['bool'], +'ReflectionMethod::isFinal' => ['bool'], +'ReflectionMethod::isGenerator' => ['bool'], +'ReflectionMethod::isInternal' => ['bool'], +'ReflectionMethod::isPrivate' => ['bool'], +'ReflectionMethod::isProtected' => ['bool'], +'ReflectionMethod::isPublic' => ['bool'], +'ReflectionMethod::isUserDefined' => ['bool'], +'ReflectionMethod::isVariadic' => ['bool'], +'ReflectionMethod::returnsReference' => ['bool'], +'ReflectionMethod::setAccessible' => ['void', 'visible'=>'bool'], +'ReflectionNamedType::__clone' => ['void'], +'ReflectionNamedType::__toString' => ['string'], +'ReflectionNamedType::allowsNull' => ['bool'], +'ReflectionNamedType::getName' => ['string'], +'ReflectionNamedType::isBuiltin' => ['bool'], +'ReflectionObject::__clone' => ['void'], +'ReflectionObject::__construct' => ['void', 'argument'=>'object'], +'ReflectionObject::__toString' => ['string'], +'ReflectionObject::export' => ['?string', 'argument'=>'object', 'return='=>'bool'], +'ReflectionObject::getConstant' => ['mixed', 'name'=>'string'], +'ReflectionObject::getConstants' => ['array'], +'ReflectionObject::getConstructor' => ['?ReflectionMethod'], +'ReflectionObject::getDefaultProperties' => ['array'], +'ReflectionObject::getDocComment' => ['false|string'], +'ReflectionObject::getEndLine' => ['false|int'], +'ReflectionObject::getExtension' => ['?ReflectionExtension'], +'ReflectionObject::getExtensionName' => ['false|string'], +'ReflectionObject::getFileName' => ['false|string'], +'ReflectionObject::getInterfaceNames' => ['class-string[]'], +'ReflectionObject::getInterfaces' => ['array'], +'ReflectionObject::getMethod' => ['ReflectionMethod', 'name'=>'string'], +'ReflectionObject::getMethods' => ['ReflectionMethod[]', 'filter='=>'int'], +'ReflectionObject::getModifiers' => ['int'], +'ReflectionObject::getName' => ['string'], +'ReflectionObject::getNamespaceName' => ['string'], +'ReflectionObject::getParentClass' => ['ReflectionClass|false'], +'ReflectionObject::getProperties' => ['ReflectionProperty[]', 'filter='=>'int'], +'ReflectionObject::getProperty' => ['ReflectionProperty', 'name'=>'string'], +'ReflectionObject::getReflectionConstant' => ['ReflectionClassConstant', 'name'=>'string'], +'ReflectionObject::getReflectionConstants' => ['list<\ReflectionClassConstant>'], +'ReflectionObject::getShortName' => ['string'], +'ReflectionObject::getStartLine' => ['false|int'], +'ReflectionObject::getStaticProperties' => ['ReflectionProperty[]'], +'ReflectionObject::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'], +'ReflectionObject::getTraitAliases' => ['array'], +'ReflectionObject::getTraitNames' => ['list'], +'ReflectionObject::getTraits' => ['array'], +'ReflectionObject::hasConstant' => ['bool', 'name'=>'string'], +'ReflectionObject::hasMethod' => ['bool', 'name'=>'string'], +'ReflectionObject::hasProperty' => ['bool', 'name'=>'string'], +'ReflectionObject::implementsInterface' => ['bool', 'interface_name'=>'ReflectionClass|string'], +'ReflectionObject::inNamespace' => ['bool'], +'ReflectionObject::isAbstract' => ['bool'], +'ReflectionObject::isAnonymous' => ['bool'], +'ReflectionObject::isCloneable' => ['bool'], +'ReflectionObject::isEnum' => ['bool'], +'ReflectionObject::isFinal' => ['bool'], +'ReflectionObject::isInstance' => ['bool', 'object'=>'object'], +'ReflectionObject::isInstantiable' => ['bool'], +'ReflectionObject::isInterface' => ['bool'], +'ReflectionObject::isInternal' => ['bool'], +'ReflectionObject::isIterable' => ['bool'], +'ReflectionObject::isIterateable' => ['bool'], +'ReflectionObject::isSubclassOf' => ['bool', 'class'=>'ReflectionClass|string'], +'ReflectionObject::isTrait' => ['bool'], +'ReflectionObject::isUserDefined' => ['bool'], +'ReflectionObject::newInstance' => ['object', 'args='=>'mixed', '...args='=>'array'], +'ReflectionObject::newInstanceArgs' => ['object', 'args='=>'array'], +'ReflectionObject::newInstanceWithoutConstructor' => ['object'], +'ReflectionObject::setStaticPropertyValue' => ['void', 'name'=>'string', 'value'=>'string'], +'ReflectionParameter::__clone' => ['void'], +'ReflectionParameter::__construct' => ['void', 'function'=>'', 'parameter'=>''], +'ReflectionParameter::__toString' => ['string'], +'ReflectionParameter::allowsNull' => ['bool'], +'ReflectionParameter::canBePassedByValue' => ['bool'], +'ReflectionParameter::export' => ['?string', 'function'=>'string', 'parameter'=>'string', 'return='=>'bool'], +'ReflectionParameter::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], +'ReflectionParameter::getClass' => ['?ReflectionClass'], +'ReflectionParameter::getDeclaringClass' => ['?ReflectionClass'], +'ReflectionParameter::getDeclaringFunction' => ['ReflectionFunctionAbstract'], +'ReflectionParameter::getDefaultValue' => ['mixed'], +'ReflectionParameter::getDefaultValueConstantName' => ['?string'], +'ReflectionParameter::getName' => ['string'], +'ReflectionParameter::getPosition' => ['int'], +'ReflectionParameter::getType' => ['?ReflectionType'], +'ReflectionParameter::hasType' => ['bool'], +'ReflectionParameter::isArray' => ['bool'], +'ReflectionParameter::isCallable' => ['?bool'], +'ReflectionParameter::isDefaultValueAvailable' => ['bool'], +'ReflectionParameter::isDefaultValueConstant' => ['bool'], +'ReflectionParameter::isOptional' => ['bool'], +'ReflectionParameter::isPassedByReference' => ['bool'], +'ReflectionParameter::isVariadic' => ['bool'], +'ReflectionProperty::__clone' => ['void'], +'ReflectionProperty::__construct' => ['void', 'class'=>'', 'name'=>'string'], +'ReflectionProperty::__toString' => ['string'], +'ReflectionProperty::export' => ['?string', 'class'=>'mixed', 'name'=>'string', 'return='=>'bool'], +'ReflectionProperty::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], +'ReflectionProperty::getDeclaringClass' => ['ReflectionClass'], +'ReflectionProperty::getDocComment' => ['string|false'], +'ReflectionProperty::getModifiers' => ['int'], +'ReflectionProperty::getName' => ['string'], +'ReflectionProperty::getType' => ['?ReflectionType'], +'ReflectionProperty::getValue' => ['mixed', 'object='=>'null|object'], +'ReflectionProperty::hasType' => ['bool'], +'ReflectionProperty::isDefault' => ['bool'], +'ReflectionProperty::isPrivate' => ['bool'], +'ReflectionProperty::isProtected' => ['bool'], +'ReflectionProperty::isPublic' => ['bool'], +'ReflectionProperty::isStatic' => ['bool'], +'ReflectionProperty::setAccessible' => ['void', 'visible'=>'bool'], +'ReflectionProperty::setValue' => ['void', 'object'=>'null|object', 'value'=>''], +'ReflectionProperty::setValue\'1' => ['void', 'value'=>''], +'ReflectionType::__clone' => ['void'], +'ReflectionType::__toString' => ['string'], +'ReflectionType::allowsNull' => ['bool'], +'ReflectionUnionType::getTypes' => ['list'], +'ReflectionZendExtension::__clone' => ['void'], +'ReflectionZendExtension::__construct' => ['void', 'name'=>'string'], +'ReflectionZendExtension::__toString' => ['string'], +'ReflectionZendExtension::export' => ['?string', 'name'=>'string', 'return='=>'bool'], +'ReflectionZendExtension::getAuthor' => ['string'], +'ReflectionZendExtension::getCopyright' => ['string'], +'ReflectionZendExtension::getName' => ['string'], +'ReflectionZendExtension::getURL' => ['string'], +'ReflectionZendExtension::getVersion' => ['string'], +'Reflector::__toString' => ['string'], +'Reflector::export' => ['?string'], +'RegexIterator::__construct' => ['void', 'iterator'=>'Iterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], +'RegexIterator::accept' => ['bool'], +'RegexIterator::current' => ['mixed'], +'RegexIterator::getFlags' => ['int'], +'RegexIterator::getInnerIterator' => ['Iterator'], +'RegexIterator::getMode' => ['int'], +'RegexIterator::getPregFlags' => ['int'], +'RegexIterator::getRegex' => ['string'], +'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::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'], +'register_tick_function' => ['bool', 'callback'=>'callable():void', '...args='=>'mixed'], +'rename' => ['bool', 'from'=>'string', 'to'=>'string', 'context='=>'resource'], +'rename_function' => ['bool', 'original_name'=>'string', 'new_name'=>'string'], +'reset' => ['mixed|false', '&r_array'=>'array|object'], +'ResourceBundle::__construct' => ['void', 'locale'=>'string', 'bundlename'=>'string', 'fallback='=>'bool'], +'ResourceBundle::count' => ['int'], +'ResourceBundle::create' => ['?ResourceBundle', 'locale'=>'string', 'bundlename'=>'string', 'fallback='=>'bool'], +'ResourceBundle::get' => ['', 'index'=>'string|int', 'fallback='=>'bool'], +'ResourceBundle::getErrorCode' => ['int'], +'ResourceBundle::getErrorMessage' => ['string'], +'ResourceBundle::getLocales' => ['array', 'bundlename'=>'string'], +'resourcebundle_count' => ['int', 'bundle'=>'ResourceBundle'], +'resourcebundle_create' => ['?ResourceBundle', 'locale'=>'string', 'bundle'=>'string', 'fallback='=>'bool'], +'resourcebundle_get' => ['mixed|null', 'bundle'=>'ResourceBundle', 'index'=>'string|int', 'fallback='=>'bool'], +'resourcebundle_get_error_code' => ['int', 'bundle'=>'ResourceBundle'], +'resourcebundle_get_error_message' => ['string', 'bundle'=>'ResourceBundle'], +'resourcebundle_locales' => ['array', 'bundle'=>'string'], +'restore_error_handler' => ['true'], +'restore_exception_handler' => ['bool'], +'restore_include_path' => ['void'], +'rewind' => ['bool', 'stream'=>'resource'], +'rewinddir' => ['null|false', 'dir_handle='=>'resource'], +'rmdir' => ['bool', 'directory'=>'string', 'context='=>'resource'], +'round' => ['float', 'num'=>'float', 'precision='=>'int', 'mode='=>'int'], +'rpm_close' => ['bool', 'rpmr'=>'resource'], +'rpm_get_tag' => ['mixed', 'rpmr'=>'resource', 'tagnum'=>'int'], +'rpm_is_valid' => ['bool', 'filename'=>'string'], +'rpm_open' => ['resource|false', 'filename'=>'string'], +'rpm_version' => ['string'], +'rpmaddtag' => ['bool', 'tag'=>'int'], +'rpmdbinfo' => ['array', 'nevr'=>'string', 'full='=>'bool'], +'rpmdbsearch' => ['array', 'pattern'=>'string', 'rpmtag='=>'int', 'rpmmire='=>'int', 'full='=>'bool'], +'rpminfo' => ['array', 'path'=>'string', 'full='=>'bool', 'error='=>'string'], +'rpmvercmp' => ['int', 'evr1'=>'string', 'evr2'=>'string'], +'rrd_create' => ['bool', 'filename'=>'string', 'options'=>'array'], +'rrd_disconnect' => ['void'], +'rrd_error' => ['string'], +'rrd_fetch' => ['array', 'filename'=>'string', 'options'=>'array'], +'rrd_first' => ['int|false', 'file'=>'string', 'raaindex='=>'int'], +'rrd_graph' => ['array|false', 'filename'=>'string', 'options'=>'array'], +'rrd_info' => ['array|false', 'filename'=>'string'], +'rrd_last' => ['int', 'filename'=>'string'], +'rrd_lastupdate' => ['array|false', 'filename'=>'string'], +'rrd_restore' => ['bool', 'xml_file'=>'string', 'rrd_file'=>'string', 'options='=>'array'], +'rrd_tune' => ['bool', 'filename'=>'string', 'options'=>'array'], +'rrd_update' => ['bool', 'filename'=>'string', 'options'=>'array'], +'rrd_version' => ['string'], +'rrd_xport' => ['array|false', 'options'=>'array'], +'rrdc_disconnect' => ['void'], +'RRDCreator::__construct' => ['void', 'path'=>'string', 'starttime='=>'string', 'step='=>'int'], +'RRDCreator::addArchive' => ['void', 'description'=>'string'], +'RRDCreator::addDataSource' => ['void', 'description'=>'string'], +'RRDCreator::save' => ['bool'], +'RRDGraph::__construct' => ['void', 'path'=>'string'], +'RRDGraph::save' => ['array|false'], +'RRDGraph::saveVerbose' => ['array|false'], +'RRDGraph::setOptions' => ['void', 'options'=>'array'], +'RRDUpdater::__construct' => ['void', 'path'=>'string'], +'RRDUpdater::update' => ['bool', 'values'=>'array', 'time='=>'string'], +'rsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], +'rtrim' => ['string', 'string'=>'string', 'characters='=>'string'], +'runkit7_constant_add' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'new_visibility='=>'int'], +'runkit7_constant_redefine' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'new_visibility='=>'?int'], +'runkit7_constant_remove' => ['bool', 'constant_name'=>'string'], +'runkit7_function_add' => ['bool', 'function_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_doc_comment='=>'?string', 'return_by_reference='=>'?bool', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], +'runkit7_function_copy' => ['bool', 'source_name'=>'string', 'target_name'=>'string'], +'runkit7_function_redefine' => ['bool', 'function_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_doc_comment='=>'?string', 'return_by_reference='=>'?bool', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], +'runkit7_function_remove' => ['bool', 'function_name'=>'string'], +'runkit7_function_rename' => ['bool', 'source_name'=>'string', 'target_name'=>'string'], +'runkit7_import' => ['bool', 'filename'=>'string', 'flags='=>'?int'], +'runkit7_method_add' => ['bool', 'class_name'=>'string', 'method_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_flags='=>'int|null|string', 'flags_or_doc_comment='=>'int|null|string', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], +'runkit7_method_copy' => ['bool', 'destination_class'=>'string', 'destination_method'=>'string', 'source_class'=>'string', 'source_method='=>'?string'], +'runkit7_method_redefine' => ['bool', 'class_name'=>'string', 'method_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_flags='=>'int|null|string', 'flags_or_doc_comment='=>'int|null|string', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], +'runkit7_method_remove' => ['bool', 'class_name'=>'string', 'method_name'=>'string'], +'runkit7_method_rename' => ['bool', 'class_name'=>'string', 'source_method_name'=>'string', 'source_target_name'=>'string'], +'runkit7_superglobals' => ['array'], +'runkit7_zval_inspect' => ['array', 'value'=>'mixed'], +'runkit_class_adopt' => ['bool', 'classname'=>'string', 'parentname'=>'string'], +'runkit_class_emancipate' => ['bool', 'classname'=>'string'], +'runkit_constant_add' => ['bool', 'constname'=>'string', 'value'=>'mixed'], +'runkit_constant_redefine' => ['bool', 'constname'=>'string', 'newvalue'=>'mixed'], +'runkit_constant_remove' => ['bool', 'constname'=>'string'], +'runkit_function_add' => ['bool', 'funcname'=>'string', 'arglist'=>'string', 'code'=>'string', 'doccomment='=>'?string'], +'runkit_function_add\'1' => ['bool', 'funcname'=>'string', 'closure'=>'Closure', 'doccomment='=>'?string'], +'runkit_function_copy' => ['bool', 'funcname'=>'string', 'targetname'=>'string'], +'runkit_function_redefine' => ['bool', 'funcname'=>'string', 'arglist'=>'string', 'code'=>'string', 'doccomment='=>'?string'], +'runkit_function_redefine\'1' => ['bool', 'funcname'=>'string', 'closure'=>'Closure', 'doccomment='=>'?string'], +'runkit_function_remove' => ['bool', 'funcname'=>'string'], +'runkit_function_rename' => ['bool', 'funcname'=>'string', 'newname'=>'string'], +'runkit_import' => ['bool', 'filename'=>'string', 'flags='=>'int'], +'runkit_lint' => ['bool', 'code'=>'string'], +'runkit_lint_file' => ['bool', 'filename'=>'string'], +'runkit_method_add' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int', 'doccomment='=>'?string'], +'runkit_method_add\'1' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'closure'=>'Closure', 'flags='=>'int', 'doccomment='=>'?string'], +'runkit_method_copy' => ['bool', 'dclass'=>'string', 'dmethod'=>'string', 'sclass'=>'string', 'smethod='=>'string'], +'runkit_method_redefine' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int', 'doccomment='=>'?string'], +'runkit_method_redefine\'1' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'closure'=>'Closure', 'flags='=>'int', 'doccomment='=>'?string'], +'runkit_method_remove' => ['bool', 'classname'=>'string', 'methodname'=>'string'], +'runkit_method_rename' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'newname'=>'string'], +'runkit_return_value_used' => ['bool'], +'Runkit_Sandbox::__construct' => ['void', 'options='=>'array'], +'runkit_sandbox_output_handler' => ['mixed', 'sandbox'=>'object', 'callback='=>'mixed'], +'Runkit_Sandbox_Parent' => [''], +'Runkit_Sandbox_Parent::__construct' => ['void'], +'runkit_superglobals' => ['array'], +'runkit_zval_inspect' => ['array', 'value'=>'mixed'], +'RuntimeException::__clone' => ['void'], +'RuntimeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?RuntimeException'], +'RuntimeException::__toString' => ['string'], +'RuntimeException::getCode' => ['int'], +'RuntimeException::getFile' => ['string'], +'RuntimeException::getLine' => ['int'], +'RuntimeException::getMessage' => ['string'], +'RuntimeException::getPrevious' => ['Throwable|RuntimeException|null'], +'RuntimeException::getTrace' => ['list\',args?:array}>'], +'RuntimeException::getTraceAsString' => ['string'], +'SAMConnection::commit' => ['bool'], +'SAMConnection::connect' => ['bool', 'protocol'=>'string', 'properties='=>'array'], +'SAMConnection::disconnect' => ['bool'], +'SAMConnection::errno' => ['int'], +'SAMConnection::error' => ['string'], +'SAMConnection::isConnected' => ['bool'], +'SAMConnection::peek' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], +'SAMConnection::peekAll' => ['array', 'target'=>'string', 'properties='=>'array'], +'SAMConnection::receive' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], +'SAMConnection::remove' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], +'SAMConnection::rollback' => ['bool'], +'SAMConnection::send' => ['string', 'target'=>'string', 'msg'=>'sammessage', 'properties='=>'array'], +'SAMConnection::setDebug' => ['', 'switch'=>'bool'], +'SAMConnection::subscribe' => ['string', 'targettopic'=>'string'], +'SAMConnection::unsubscribe' => ['bool', 'subscriptionid'=>'string', 'targettopic='=>'string'], +'SAMMessage::body' => ['string'], +'SAMMessage::header' => ['object'], +'sapi_windows_cp_conv' => ['?string', 'in_codepage'=>'int|string', 'out_codepage'=>'int|string', 'subject'=>'string'], +'sapi_windows_cp_get' => ['int'], +'sapi_windows_cp_is_utf8' => ['bool'], +'sapi_windows_cp_set' => ['bool', 'codepage'=>'int'], +'sapi_windows_vt100_support' => ['bool', 'stream'=>'resource', 'enable='=>'bool'], +'Saxon\SaxonProcessor::__construct' => ['void', 'license='=>'bool', 'cwd='=>'string'], +'Saxon\SaxonProcessor::createAtomicValue' => ['Saxon\XdmValue', 'primitive_type_val'=>'bool|float|int|string'], +'Saxon\SaxonProcessor::newSchemaValidator' => ['Saxon\SchemaValidator'], +'Saxon\SaxonProcessor::newXPathProcessor' => ['Saxon\XPathProcessor'], +'Saxon\SaxonProcessor::newXQueryProcessor' => ['Saxon\XQueryProcessor'], +'Saxon\SaxonProcessor::newXsltProcessor' => ['Saxon\XsltProcessor'], +'Saxon\SaxonProcessor::parseXmlFromFile' => ['Saxon\XdmNode', 'fileName'=>'string'], +'Saxon\SaxonProcessor::parseXmlFromString' => ['Saxon\XdmNode', 'value'=>'string'], +'Saxon\SaxonProcessor::registerPHPFunctions' => ['void', 'library'=>'string'], +'Saxon\SaxonProcessor::setConfigurationProperty' => ['void', 'name'=>'string', 'value'=>'string'], +'Saxon\SaxonProcessor::setcwd' => ['void', 'cwd'=>'string'], +'Saxon\SaxonProcessor::setResourceDirectory' => ['void', 'dir'=>'string'], +'Saxon\SaxonProcessor::version' => ['string'], +'Saxon\SchemaValidator::clearParameters' => ['void'], +'Saxon\SchemaValidator::clearProperties' => ['void'], +'Saxon\SchemaValidator::exceptionClear' => ['void'], +'Saxon\SchemaValidator::getErrorCode' => ['string', 'i'=>'int'], +'Saxon\SchemaValidator::getErrorMessage' => ['string', 'i'=>'int'], +'Saxon\SchemaValidator::getExceptionCount' => ['int'], +'Saxon\SchemaValidator::getValidationReport' => ['Saxon\XdmNode'], +'Saxon\SchemaValidator::registerSchemaFromFile' => ['void', 'fileName'=>'string'], +'Saxon\SchemaValidator::registerSchemaFromString' => ['void', 'schemaStr'=>'string'], +'Saxon\SchemaValidator::setOutputFile' => ['void', 'fileName'=>'string'], +'Saxon\SchemaValidator::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], +'Saxon\SchemaValidator::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], +'Saxon\SchemaValidator::setSourceNode' => ['void', 'node'=>'Saxon\XdmNode'], +'Saxon\SchemaValidator::validate' => ['void', 'filename='=>'?string'], +'Saxon\SchemaValidator::validateToNode' => ['Saxon\XdmNode', 'filename='=>'?string'], +'Saxon\XdmAtomicValue::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], +'Saxon\XdmAtomicValue::getAtomicValue' => ['?Saxon\XdmAtomicValue'], +'Saxon\XdmAtomicValue::getBooleanValue' => ['bool'], +'Saxon\XdmAtomicValue::getDoubleValue' => ['float'], +'Saxon\XdmAtomicValue::getHead' => ['Saxon\XdmItem'], +'Saxon\XdmAtomicValue::getLongValue' => ['int'], +'Saxon\XdmAtomicValue::getNodeValue' => ['?Saxon\XdmNode'], +'Saxon\XdmAtomicValue::getStringValue' => ['string'], +'Saxon\XdmAtomicValue::isAtomic' => ['true'], +'Saxon\XdmAtomicValue::isNode' => ['bool'], +'Saxon\XdmAtomicValue::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], +'Saxon\XdmAtomicValue::size' => ['int'], +'Saxon\XdmItem::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], +'Saxon\XdmItem::getAtomicValue' => ['?Saxon\XdmAtomicValue'], +'Saxon\XdmItem::getHead' => ['Saxon\XdmItem'], +'Saxon\XdmItem::getNodeValue' => ['?Saxon\XdmNode'], +'Saxon\XdmItem::getStringValue' => ['string'], +'Saxon\XdmItem::isAtomic' => ['bool'], +'Saxon\XdmItem::isNode' => ['bool'], +'Saxon\XdmItem::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], +'Saxon\XdmItem::size' => ['int'], +'Saxon\XdmNode::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], +'Saxon\XdmNode::getAtomicValue' => ['?Saxon\XdmAtomicValue'], +'Saxon\XdmNode::getAttributeCount' => ['int'], +'Saxon\XdmNode::getAttributeNode' => ['?Saxon\XdmNode', 'index'=>'int'], +'Saxon\XdmNode::getAttributeValue' => ['?string', 'index'=>'int'], +'Saxon\XdmNode::getChildCount' => ['int'], +'Saxon\XdmNode::getChildNode' => ['?Saxon\XdmNode', 'index'=>'int'], +'Saxon\XdmNode::getHead' => ['Saxon\XdmItem'], +'Saxon\XdmNode::getNodeKind' => ['int'], +'Saxon\XdmNode::getNodeName' => ['string'], +'Saxon\XdmNode::getNodeValue' => ['?Saxon\XdmNode'], +'Saxon\XdmNode::getParent' => ['?Saxon\XdmNode'], +'Saxon\XdmNode::getStringValue' => ['string'], +'Saxon\XdmNode::isAtomic' => ['false'], +'Saxon\XdmNode::isNode' => ['bool'], +'Saxon\XdmNode::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], +'Saxon\XdmNode::size' => ['int'], +'Saxon\XdmValue::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], +'Saxon\XdmValue::getHead' => ['Saxon\XdmItem'], +'Saxon\XdmValue::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], +'Saxon\XdmValue::size' => ['int'], +'Saxon\XPathProcessor::clearParameters' => ['void'], +'Saxon\XPathProcessor::clearProperties' => ['void'], +'Saxon\XPathProcessor::declareNamespace' => ['void', 'prefix'=>'', 'namespace'=>''], +'Saxon\XPathProcessor::effectiveBooleanValue' => ['bool', 'xpathStr'=>'string'], +'Saxon\XPathProcessor::evaluate' => ['Saxon\XdmValue', 'xpathStr'=>'string'], +'Saxon\XPathProcessor::evaluateSingle' => ['Saxon\XdmItem', 'xpathStr'=>'string'], +'Saxon\XPathProcessor::exceptionClear' => ['void'], +'Saxon\XPathProcessor::getErrorCode' => ['string', 'i'=>'int'], +'Saxon\XPathProcessor::getErrorMessage' => ['string', 'i'=>'int'], +'Saxon\XPathProcessor::getExceptionCount' => ['int'], +'Saxon\XPathProcessor::setBaseURI' => ['void', 'uri'=>'string'], +'Saxon\XPathProcessor::setContextFile' => ['void', 'fileName'=>'string'], +'Saxon\XPathProcessor::setContextItem' => ['void', 'item'=>'Saxon\XdmItem'], +'Saxon\XPathProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], +'Saxon\XPathProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], +'Saxon\XQueryProcessor::clearParameters' => ['void'], +'Saxon\XQueryProcessor::clearProperties' => ['void'], +'Saxon\XQueryProcessor::declareNamespace' => ['void', 'prefix'=>'string', 'namespace'=>'string'], +'Saxon\XQueryProcessor::exceptionClear' => ['void'], +'Saxon\XQueryProcessor::getErrorCode' => ['string', 'i'=>'int'], +'Saxon\XQueryProcessor::getErrorMessage' => ['string', 'i'=>'int'], +'Saxon\XQueryProcessor::getExceptionCount' => ['int'], +'Saxon\XQueryProcessor::runQueryToFile' => ['void', 'outfilename'=>'string'], +'Saxon\XQueryProcessor::runQueryToString' => ['?string'], +'Saxon\XQueryProcessor::runQueryToValue' => ['?Saxon\XdmValue'], +'Saxon\XQueryProcessor::setContextItem' => ['void', 'object'=>'Saxon\XdmAtomicValue|Saxon\XdmItem|Saxon\XdmNode|Saxon\XdmValue'], +'Saxon\XQueryProcessor::setContextItemFromFile' => ['void', 'fileName'=>'string'], +'Saxon\XQueryProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], +'Saxon\XQueryProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], +'Saxon\XQueryProcessor::setQueryBaseURI' => ['void', 'uri'=>'string'], +'Saxon\XQueryProcessor::setQueryContent' => ['void', 'string'=>'string'], +'Saxon\XQueryProcessor::setQueryFile' => ['void', 'filename'=>'string'], +'Saxon\XQueryProcessor::setQueryItem' => ['void', 'item'=>'Saxon\XdmItem'], +'Saxon\XsltProcessor::clearParameters' => ['void'], +'Saxon\XsltProcessor::clearProperties' => ['void'], +'Saxon\XsltProcessor::compileFromFile' => ['void', 'fileName'=>'string'], +'Saxon\XsltProcessor::compileFromString' => ['void', 'string'=>'string'], +'Saxon\XsltProcessor::compileFromValue' => ['void', 'node'=>'Saxon\XdmNode'], +'Saxon\XsltProcessor::exceptionClear' => ['void'], +'Saxon\XsltProcessor::getErrorCode' => ['string', 'i'=>'int'], +'Saxon\XsltProcessor::getErrorMessage' => ['string', 'i'=>'int'], +'Saxon\XsltProcessor::getExceptionCount' => ['int'], +'Saxon\XsltProcessor::setOutputFile' => ['void', 'fileName'=>'string'], +'Saxon\XsltProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], +'Saxon\XsltProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], +'Saxon\XsltProcessor::setSourceFromFile' => ['void', 'filename'=>'string'], +'Saxon\XsltProcessor::setSourceFromXdmValue' => ['void', 'value'=>'Saxon\XdmValue'], +'Saxon\XsltProcessor::transformFileToFile' => ['void', 'sourceFileName'=>'string', 'stylesheetFileName'=>'string', 'outputfileName'=>'string'], +'Saxon\XsltProcessor::transformFileToString' => ['?string', 'sourceFileName'=>'string', 'stylesheetFileName'=>'string'], +'Saxon\XsltProcessor::transformFileToValue' => ['Saxon\XdmValue', 'fileName'=>'string'], +'Saxon\XsltProcessor::transformToFile' => ['void'], +'Saxon\XsltProcessor::transformToString' => ['string'], +'Saxon\XsltProcessor::transformToValue' => ['?Saxon\XdmValue'], +'SCA::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], +'SCA::getService' => ['', 'target'=>'string', 'binding='=>'string', 'config='=>'array'], +'SCA_LocalProxy::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], +'SCA_SoapProxy::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], +'scalebarObj::convertToString' => ['string'], +'scalebarObj::free' => ['void'], +'scalebarObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'scalebarObj::setImageColor' => ['int', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], +'scalebarObj::updateFromString' => ['int', 'snippet'=>'string'], +'scandir' => ['list|false', 'directory'=>'string', 'sorting_order='=>'int', 'context='=>'resource'], +'SDO_DAS_ChangeSummary::beginLogging' => [''], +'SDO_DAS_ChangeSummary::endLogging' => [''], +'SDO_DAS_ChangeSummary::getChangedDataObjects' => ['SDO_List'], +'SDO_DAS_ChangeSummary::getChangeType' => ['int', 'dataobject'=>'sdo_dataobject'], +'SDO_DAS_ChangeSummary::getOldContainer' => ['SDO_DataObject', 'data_object'=>'sdo_dataobject'], +'SDO_DAS_ChangeSummary::getOldValues' => ['SDO_List', 'data_object'=>'sdo_dataobject'], +'SDO_DAS_ChangeSummary::isLogging' => ['bool'], +'SDO_DAS_DataFactory::addPropertyToType' => ['', 'parent_type_namespace_uri'=>'string', 'parent_type_name'=>'string', 'property_name'=>'string', 'type_namespace_uri'=>'string', 'type_name'=>'string', 'options='=>'array'], +'SDO_DAS_DataFactory::addType' => ['', 'type_namespace_uri'=>'string', 'type_name'=>'string', 'options='=>'array'], +'SDO_DAS_DataFactory::getDataFactory' => ['SDO_DAS_DataFactory'], +'SDO_DAS_DataObject::getChangeSummary' => ['SDO_DAS_ChangeSummary'], +'SDO_DAS_Relational::__construct' => ['void', 'database_metadata'=>'array', 'application_root_type='=>'string', 'sdo_containment_references_metadata='=>'array'], +'SDO_DAS_Relational::applyChanges' => ['', 'database_handle'=>'pdo', 'root_data_object'=>'sdodataobject'], +'SDO_DAS_Relational::createRootDataObject' => ['SDODataObject'], +'SDO_DAS_Relational::executePreparedQuery' => ['SDODataObject', 'database_handle'=>'pdo', 'prepared_statement'=>'pdostatement', 'value_list'=>'array', 'column_specifier='=>'array'], +'SDO_DAS_Relational::executeQuery' => ['SDODataObject', 'database_handle'=>'pdo', 'sql_statement'=>'string', 'column_specifier='=>'array'], +'SDO_DAS_Setting::getListIndex' => ['int'], +'SDO_DAS_Setting::getPropertyIndex' => ['int'], +'SDO_DAS_Setting::getPropertyName' => ['string'], +'SDO_DAS_Setting::getValue' => [''], +'SDO_DAS_Setting::isSet' => ['bool'], +'SDO_DAS_XML::addTypes' => ['', 'xsd_file'=>'string'], +'SDO_DAS_XML::create' => ['SDO_DAS_XML', 'xsd_file='=>'mixed', 'key='=>'string'], +'SDO_DAS_XML::createDataObject' => ['SDO_DataObject', 'namespace_uri'=>'string', 'type_name'=>'string'], +'SDO_DAS_XML::createDocument' => ['SDO_DAS_XML_Document', 'document_element_name'=>'string', 'document_element_namespace_uri'=>'string', 'dataobject='=>'sdo_dataobject'], +'SDO_DAS_XML::loadFile' => ['SDO_XMLDocument', 'xml_file'=>'string'], +'SDO_DAS_XML::loadString' => ['SDO_DAS_XML_Document', 'xml_string'=>'string'], +'SDO_DAS_XML::saveFile' => ['', 'xdoc'=>'sdo_xmldocument', 'xml_file'=>'string', 'indent='=>'int'], +'SDO_DAS_XML::saveString' => ['string', 'xdoc'=>'sdo_xmldocument', 'indent='=>'int'], +'SDO_DAS_XML_Document::getRootDataObject' => ['SDO_DataObject'], +'SDO_DAS_XML_Document::getRootElementName' => ['string'], +'SDO_DAS_XML_Document::getRootElementURI' => ['string'], +'SDO_DAS_XML_Document::setEncoding' => ['', 'encoding'=>'string'], +'SDO_DAS_XML_Document::setXMLDeclaration' => ['', 'xmldeclatation'=>'bool'], +'SDO_DAS_XML_Document::setXMLVersion' => ['', 'xmlversion'=>'string'], +'SDO_DataFactory::create' => ['void', 'type_namespace_uri'=>'string', 'type_name'=>'string'], +'SDO_DataObject::clear' => ['void'], +'SDO_DataObject::createDataObject' => ['SDO_DataObject', 'identifier'=>''], +'SDO_DataObject::getContainer' => ['SDO_DataObject'], +'SDO_DataObject::getSequence' => ['SDO_Sequence'], +'SDO_DataObject::getTypeName' => ['string'], +'SDO_DataObject::getTypeNamespaceURI' => ['string'], +'SDO_Exception::getCause' => [''], +'SDO_List::insert' => ['void', 'value'=>'mixed', 'index='=>'int'], +'SDO_Model_Property::getContainingType' => ['SDO_Model_Type'], +'SDO_Model_Property::getDefault' => [''], +'SDO_Model_Property::getName' => ['string'], +'SDO_Model_Property::getType' => ['SDO_Model_Type'], +'SDO_Model_Property::isContainment' => ['bool'], +'SDO_Model_Property::isMany' => ['bool'], +'SDO_Model_ReflectionDataObject::__construct' => ['void', 'data_object'=>'sdo_dataobject'], +'SDO_Model_ReflectionDataObject::export' => ['mixed', 'rdo'=>'sdo_model_reflectiondataobject', 'return='=>'bool'], +'SDO_Model_ReflectionDataObject::getContainmentProperty' => ['SDO_Model_Property'], +'SDO_Model_ReflectionDataObject::getInstanceProperties' => ['array'], +'SDO_Model_ReflectionDataObject::getType' => ['SDO_Model_Type'], +'SDO_Model_Type::getBaseType' => ['SDO_Model_Type'], +'SDO_Model_Type::getName' => ['string'], +'SDO_Model_Type::getNamespaceURI' => ['string'], +'SDO_Model_Type::getProperties' => ['array'], +'SDO_Model_Type::getProperty' => ['SDO_Model_Property', 'identifier'=>''], +'SDO_Model_Type::isAbstractType' => ['bool'], +'SDO_Model_Type::isDataType' => ['bool'], +'SDO_Model_Type::isInstance' => ['bool', 'data_object'=>'sdo_dataobject'], +'SDO_Model_Type::isOpenType' => ['bool'], +'SDO_Model_Type::isSequencedType' => ['bool'], +'SDO_Sequence::getProperty' => ['SDO_Model_Property', 'sequence_index'=>'int'], +'SDO_Sequence::insert' => ['void', 'value'=>'mixed', 'sequenceindex='=>'int', 'propertyidentifier='=>'mixed'], +'SDO_Sequence::move' => ['void', 'toindex'=>'int', 'fromindex'=>'int'], +'SeasLog::__destruct' => ['void'], +'SeasLog::alert' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], +'SeasLog::analyzerCount' => ['mixed', 'level'=>'string', 'log_path='=>'string', 'key_word='=>'string'], +'SeasLog::analyzerDetail' => ['mixed', 'level'=>'string', 'log_path='=>'string', 'key_word='=>'string', 'start='=>'int', 'limit='=>'int', 'order='=>'int'], +'SeasLog::closeLoggerStream' => ['bool', 'model'=>'int', 'logger'=>'string'], +'SeasLog::critical' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], +'SeasLog::debug' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], +'SeasLog::emergency' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], +'SeasLog::error' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], +'SeasLog::flushBuffer' => ['bool'], +'SeasLog::getBasePath' => ['string'], +'SeasLog::getBuffer' => ['array'], +'SeasLog::getBufferEnabled' => ['bool'], +'SeasLog::getDatetimeFormat' => ['string'], +'SeasLog::getLastLogger' => ['string'], +'SeasLog::getRequestID' => ['string'], +'SeasLog::getRequestVariable' => ['bool', 'key'=>'int'], +'SeasLog::info' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], +'SeasLog::log' => ['bool', 'level'=>'string', 'message='=>'string', 'content='=>'array', 'logger='=>'string'], +'SeasLog::notice' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], +'SeasLog::setBasePath' => ['bool', 'base_path'=>'string'], +'SeasLog::setDatetimeFormat' => ['bool', 'format'=>'string'], +'SeasLog::setLogger' => ['bool', 'logger'=>'string'], +'SeasLog::setRequestID' => ['bool', 'request_id'=>'string'], +'SeasLog::setRequestVariable' => ['bool', 'key'=>'int', 'value'=>'string'], +'SeasLog::warning' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], +'seaslog_get_author' => ['string'], +'seaslog_get_version' => ['string'], +'SeekableIterator::__construct' => ['void'], +'SeekableIterator::current' => ['mixed'], +'SeekableIterator::key' => ['int|string'], +'SeekableIterator::next' => ['void'], +'SeekableIterator::rewind' => ['void'], +'SeekableIterator::seek' => ['void', 'position'=>'int'], +'SeekableIterator::valid' => ['bool'], +'sem_acquire' => ['bool', 'semaphore'=>'resource', 'non_blocking='=>'bool'], +'sem_get' => ['resource|false', 'key'=>'int', 'max_acquire='=>'int', 'permissions='=>'int', 'auto_release='=>'int'], +'sem_release' => ['bool', 'semaphore'=>'resource'], +'sem_remove' => ['bool', 'semaphore'=>'resource'], +'Serializable::__construct' => ['void'], +'Serializable::serialize' => ['?string'], +'Serializable::unserialize' => ['void', 'serialized'=>'string'], +'serialize' => ['string', 'value'=>'mixed'], +'ServerRequest::withInput' => ['ServerRequest', 'input'=>'mixed'], +'ServerRequest::withoutParams' => ['ServerRequest', 'params'=>'int|string'], +'ServerRequest::withParam' => ['ServerRequest', 'key'=>'int|string', 'value'=>'mixed'], +'ServerRequest::withParams' => ['ServerRequest', 'params'=>'mixed'], +'ServerRequest::withUrl' => ['ServerRequest', 'url'=>'array'], +'ServerResponse::addHeader' => ['void', 'label'=>'string', 'value'=>'string'], +'ServerResponse::date' => ['string', 'date'=>'string|DateTimeInterface'], +'ServerResponse::getHeader' => ['string', 'label'=>'string'], +'ServerResponse::getHeaders' => ['string[]'], +'ServerResponse::getStatus' => ['int'], +'ServerResponse::getVersion' => ['string'], +'ServerResponse::setHeader' => ['void', 'label'=>'string', 'value'=>'string'], +'ServerResponse::setStatus' => ['void', 'status'=>'int'], +'ServerResponse::setVersion' => ['void', 'version'=>'string'], +'session_abort' => ['bool'], +'session_cache_expire' => ['int', 'value='=>'int'], +'session_cache_limiter' => ['string', 'value='=>'string'], +'session_commit' => ['bool'], +'session_create_id' => ['string', 'prefix='=>'string'], +'session_decode' => ['bool', 'data'=>'string'], +'session_destroy' => ['bool'], +'session_encode' => ['string'], +'session_gc' => ['int|false'], +'session_get_cookie_params' => ['array'], +'session_id' => ['string|false', 'id='=>'string'], +'session_is_registered' => ['bool', 'name'=>'string'], +'session_module_name' => ['string', 'module='=>'string'], +'session_name' => ['string|false', 'name='=>'string'], +'session_pgsql_add_error' => ['bool', 'error_level'=>'int', 'error_message='=>'string'], +'session_pgsql_get_error' => ['array', 'with_error_message='=>'bool'], +'session_pgsql_get_field' => ['string'], +'session_pgsql_reset' => ['bool'], +'session_pgsql_set_field' => ['bool', 'value'=>'string'], +'session_pgsql_status' => ['array'], +'session_regenerate_id' => ['bool', 'delete_old_session='=>'bool'], +'session_register' => ['bool', 'name'=>'mixed', '...args='=>'mixed'], +'session_register_shutdown' => ['void'], +'session_reset' => ['bool'], +'session_save_path' => ['string', 'path='=>'string'], +'session_set_cookie_params' => ['bool', 'lifetime'=>'int', 'path='=>'?string', 'domain='=>'?string', 'secure='=>'?bool', 'httponly='=>'?bool'], +'session_set_cookie_params\'1' => ['bool', 'options'=>'array{lifetime?:?int,path?:?string,domain?:?string,secure?:?bool,httponly?:?bool,samesite?:?string}'], +'session_set_save_handler' => ['bool', 'open'=>'callable(string,string):bool', 'close'=>'callable():bool', 'read'=>'callable(string):string', 'write'=>'callable(string,string):bool', 'destroy'=>'callable(string):bool', 'gc'=>'callable(string):bool', 'create_sid='=>'callable():string', 'validate_sid='=>'callable(string):bool', 'update_timestamp='=>'callable(string):bool'], +'session_set_save_handler\'1' => ['bool', 'open'=>'SessionHandlerInterface', 'close='=>'bool'], +'session_start' => ['bool', 'options='=>'array'], +'session_status' => ['int'], +'session_unregister' => ['bool', 'name'=>'string'], +'session_unset' => ['bool'], +'session_write_close' => ['bool'], +'SessionHandler::close' => ['bool'], +'SessionHandler::create_sid' => ['char'], +'SessionHandler::destroy' => ['bool', 'id'=>'string'], +'SessionHandler::gc' => ['bool', 'maxlifetime'=>'int'], +'SessionHandler::open' => ['bool', 'save_path'=>'string', 'session_name'=>'string'], +'SessionHandler::read' => ['string', 'id'=>'string'], +'SessionHandler::updateTimestamp' => ['bool', 'session_id'=>'string', 'session_data'=>'string'], +'SessionHandler::validateId' => ['bool', 'session_id'=>'string'], +'SessionHandler::write' => ['bool', 'id'=>'string', 'data'=>'string'], +'SessionHandlerInterface::close' => ['bool'], +'SessionHandlerInterface::destroy' => ['bool', 'id'=>'string'], +'SessionHandlerInterface::gc' => ['int|false', 'max_lifetime'=>'int'], +'SessionHandlerInterface::open' => ['bool', 'path'=>'string', 'name'=>'string'], +'SessionHandlerInterface::read' => ['string|false', 'id'=>'string'], +'SessionHandlerInterface::write' => ['bool', 'id'=>'string', 'data'=>'string'], +'SessionIdInterface::create_sid' => ['string'], +'SessionUpdateTimestampHandler::updateTimestamp' => ['bool', 'id'=>'string', 'data'=>'string'], +'SessionUpdateTimestampHandler::validateId' => ['char', 'id'=>'string'], +'SessionUpdateTimestampHandlerInterface::updateTimestamp' => ['bool', 'key'=>'string', 'value'=>'string'], +'SessionUpdateTimestampHandlerInterface::validateId' => ['bool', 'key'=>'string'], +'set_error_handler' => ['null|callable(int,string,string=,int=,array=):bool', 'callback'=>'null|callable(int,string,string=,int=,array=):bool', 'error_levels='=>'int'], +'set_exception_handler' => ['null|callable(Throwable):void', 'callback'=>'null|callable(Throwable):void'], +'set_file_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], +'set_include_path' => ['string|false', 'include_path'=>'string'], +'set_magic_quotes_runtime' => ['bool', 'new_setting'=>'bool'], +'set_time_limit' => ['bool', 'seconds'=>'int'], +'setcookie' => ['bool', 'name'=>'string', 'value='=>'string', 'expires='=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool', 'samesite='=>'string', 'url_encode='=>'int'], +'setcookie\'1' => ['bool', 'name'=>'string', 'value='=>'string', 'options='=>'array'], +'setLeftFill' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], +'setLine' => ['void', 'width'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], +'setlocale' => ['string|false', 'category'=>'int', 'locales'=>'string|0|null', '...rest='=>'string'], +'setlocale\'1' => ['string|false', 'category'=>'int', 'locales'=>'?array'], +'setproctitle' => ['void', 'title'=>'string'], +'setrawcookie' => ['bool', 'name'=>'string', 'value='=>'string', 'expires='=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool'], +'setrawcookie\'1' => ['bool', 'name'=>'string', 'value='=>'string', 'options='=>'array'], +'setRightFill' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], +'setthreadtitle' => ['bool', 'title'=>'string'], +'settype' => ['bool', '&rw_var'=>'mixed', 'type'=>'string'], +'sha1' => ['string', 'string'=>'string', 'binary='=>'bool'], +'sha1_file' => ['string|false', 'filename'=>'string', 'binary='=>'bool'], +'sha256' => ['string', 'string'=>'string', 'raw_output='=>'bool'], +'sha256_file' => ['string', 'filename'=>'string', 'raw_output='=>'bool'], +'shapefileObj::__construct' => ['void', 'filename'=>'string', 'type'=>'int'], +'shapefileObj::addPoint' => ['int', 'point'=>'pointObj'], +'shapefileObj::addShape' => ['int', 'shape'=>'shapeObj'], +'shapefileObj::free' => ['void'], +'shapefileObj::getExtent' => ['rectObj', 'i'=>'int'], +'shapefileObj::getPoint' => ['shapeObj', 'i'=>'int'], +'shapefileObj::getShape' => ['shapeObj', 'i'=>'int'], +'shapefileObj::getTransformed' => ['shapeObj', 'map'=>'mapObj', 'i'=>'int'], +'shapefileObj::ms_newShapefileObj' => ['shapefileObj', 'filename'=>'string', 'type'=>'int'], +'shapeObj::__construct' => ['void', 'type'=>'int'], +'shapeObj::add' => ['int', 'line'=>'lineObj'], +'shapeObj::boundary' => ['shapeObj'], +'shapeObj::contains' => ['bool', 'point'=>'pointObj'], +'shapeObj::containsShape' => ['int', 'shape2'=>'shapeObj'], +'shapeObj::convexhull' => ['shapeObj'], +'shapeObj::crosses' => ['int', 'shape'=>'shapeObj'], +'shapeObj::difference' => ['shapeObj', 'shape'=>'shapeObj'], +'shapeObj::disjoint' => ['int', 'shape'=>'shapeObj'], +'shapeObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj'], +'shapeObj::equals' => ['int', 'shape'=>'shapeObj'], +'shapeObj::free' => ['void'], +'shapeObj::getArea' => ['float'], +'shapeObj::getCentroid' => ['pointObj'], +'shapeObj::getLabelPoint' => ['pointObj'], +'shapeObj::getLength' => ['float'], +'shapeObj::getPointUsingMeasure' => ['pointObj', 'm'=>'float'], +'shapeObj::getValue' => ['string', 'layer'=>'layerObj', 'filedname'=>'string'], +'shapeObj::intersection' => ['shapeObj', 'shape'=>'shapeObj'], +'shapeObj::intersects' => ['bool', 'shape'=>'shapeObj'], +'shapeObj::line' => ['lineObj', 'i'=>'int'], +'shapeObj::ms_shapeObjFromWkt' => ['shapeObj', 'wkt'=>'string'], +'shapeObj::overlaps' => ['int', 'shape'=>'shapeObj'], +'shapeObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], +'shapeObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'shapeObj::setBounds' => ['int'], +'shapeObj::simplify' => ['shapeObj|null', 'tolerance'=>'float'], +'shapeObj::symdifference' => ['shapeObj', 'shape'=>'shapeObj'], +'shapeObj::topologyPreservingSimplify' => ['shapeObj|null', 'tolerance'=>'float'], +'shapeObj::touches' => ['int', 'shape'=>'shapeObj'], +'shapeObj::toWkt' => ['string'], +'shapeObj::union' => ['shapeObj', 'shape'=>'shapeObj'], +'shapeObj::within' => ['int', 'shape2'=>'shapeObj'], +'shell_exec' => ['string|false|null', 'command'=>'string'], +'shm_attach' => ['resource', 'key'=>'int', 'size='=>'int', 'permissions='=>'int'], +'shm_detach' => ['bool', 'shm'=>'resource'], +'shm_get_var' => ['mixed', 'shm'=>'resource', 'key'=>'int'], +'shm_has_var' => ['bool', 'shm'=>'resource', 'key'=>'int'], +'shm_put_var' => ['bool', 'shm'=>'resource', 'key'=>'int', 'value'=>'mixed'], +'shm_remove' => ['bool', 'shm'=>'resource'], +'shm_remove_var' => ['bool', 'shm'=>'resource', 'key'=>'int'], +'shmop_close' => ['void', 'shmop'=>'resource'], +'shmop_delete' => ['bool', 'shmop'=>'resource'], +'shmop_open' => ['resource|false', 'key'=>'int', 'mode'=>'string', 'permissions'=>'int', 'size'=>'int'], +'shmop_read' => ['string|false', 'shmop'=>'resource', 'offset'=>'int', 'size'=>'int'], +'shmop_size' => ['int', 'shmop'=>'resource'], +'shmop_write' => ['int|false', 'shmop'=>'resource', 'data'=>'string', 'offset'=>'int'], +'show_source' => ['string|bool', 'filename'=>'string', 'return='=>'bool'], +'shuffle' => ['bool', '&rw_array'=>'array'], +'signeurlpaiement' => ['string', 'clent'=>'string', 'data'=>'string'], +'similar_text' => ['int', 'string1'=>'string', 'string2'=>'string', '&w_percent='=>'float'], +'simplexml_import_dom' => ['SimpleXMLElement|false', 'node'=>'DOMNode', 'class_name='=>'string'], +'simplexml_load_file' => ['SimpleXMLElement|false', 'filename'=>'string', 'class_name='=>'string', 'options='=>'int', 'namespace_or_prefix='=>'string', 'is_prefix='=>'bool'], +'simplexml_load_string' => ['SimpleXMLElement|false', 'data'=>'string', 'class_name='=>'string', 'options='=>'int', 'namespace_or_prefix='=>'string', 'is_prefix='=>'bool'], +'SimpleXMLElement::__construct' => ['void', 'data'=>'string', 'options='=>'int', 'data_is_url='=>'bool', 'ns='=>'string', 'is_prefix='=>'bool'], +'SimpleXMLElement::__get' => ['SimpleXMLElement', 'name'=>'string'], +'SimpleXMLElement::__toString' => ['string'], +'SimpleXMLElement::addAttribute' => ['void', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], +'SimpleXMLElement::addChild' => ['SimpleXMLElement', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], +'SimpleXMLElement::asXML' => ['bool', 'filename'=>'string'], +'SimpleXMLElement::asXML\'1' => ['string|false'], +'SimpleXMLElement::attributes' => ['?SimpleXMLElement', 'ns='=>'string', 'is_prefix='=>'bool'], +'SimpleXMLElement::children' => ['SimpleXMLElement', 'ns='=>'string', 'is_prefix='=>'bool'], +'SimpleXMLElement::count' => ['int'], +'SimpleXMLElement::getDocNamespaces' => ['string[]', 'recursive='=>'bool', 'from_root='=>'bool'], +'SimpleXMLElement::getName' => ['string'], +'SimpleXMLElement::getNamespaces' => ['string[]', 'recursive='=>'bool'], +'SimpleXMLElement::offsetExists' => ['bool', 'offset'=>'int|string'], +'SimpleXMLElement::offsetGet' => ['SimpleXMLElement', 'offset'=>'int|string'], +'SimpleXMLElement::offsetSet' => ['void', 'offset'=>'int|string', 'value'=>'mixed'], +'SimpleXMLElement::offsetUnset' => ['void', 'offset'=>'int|string'], +'SimpleXMLElement::registerXPathNamespace' => ['bool', 'prefix'=>'string', 'ns'=>'string'], +'SimpleXMLElement::saveXML' => ['mixed', 'filename='=>'string'], +'SimpleXMLElement::xpath' => ['SimpleXMLElement[]|false', 'path'=>'string'], +'sin' => ['float', 'num'=>'float'], +'sinh' => ['float', 'num'=>'float'], +'sizeof' => ['int', 'value'=>'Countable|array', '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'], +'snmp2_real_walk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmp2_set' => ['bool', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmp2_walk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmp3_get' => ['string|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmp3_getnext' => ['string|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmp3_real_walk' => ['array|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmp3_set' => ['bool', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmp3_walk' => ['array|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'SNMP::__construct' => ['void', 'version'=>'int', 'hostname'=>'string', 'community'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'SNMP::close' => ['bool'], +'SNMP::get' => ['array|string|false', 'objectId'=>'string|array', 'preserveKeys='=>'bool'], +'SNMP::getErrno' => ['int'], +'SNMP::getError' => ['string'], +'SNMP::getnext' => ['string|array|false', 'objectId'=>'string|array'], +'SNMP::set' => ['bool', 'objectId'=>'string|array', 'type'=>'string|array', 'value'=>'mixed'], +'SNMP::setSecurity' => ['bool', 'securityLevel'=>'string', 'authProtocol='=>'string', 'authPassphrase='=>'string', 'privacyProtocol='=>'string', 'privacyPassphrase='=>'string', 'contextName='=>'string', 'contextEngineId='=>'string'], +'SNMP::walk' => ['array|false', 'objectId'=>'string', 'suffixAsKey='=>'bool', 'maxRepetitions='=>'int', 'nonRepeaters='=>'int'], +'snmp_get_quick_print' => ['bool'], +'snmp_get_valueretrieval' => ['int'], +'snmp_read_mib' => ['bool', 'filename'=>'string'], +'snmp_set_enum_print' => ['bool', 'enable'=>'int'], +'snmp_set_oid_numeric_print' => ['void', 'format'=>'int'], +'snmp_set_oid_output_format' => ['bool', 'format'=>'int'], +'snmp_set_quick_print' => ['bool', 'enable'=>'bool'], +'snmp_set_valueretrieval' => ['bool', 'method='=>'int'], +'snmpget' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmpgetnext' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmprealwalk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmpset' => ['bool', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'mixed', 'timeout='=>'int', 'retries='=>'int'], +'snmpwalk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'snmpwalkoid' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], +'SoapClient::__call' => ['', 'function_name'=>'string', 'arguments'=>'array'], +'SoapClient::__construct' => ['void', 'wsdl'=>'mixed', 'options='=>'array|null'], +'SoapClient::__doRequest' => ['?string', 'request'=>'string', 'location'=>'string', 'action'=>'string', 'version'=>'int', 'one_way='=>'bool'], +'SoapClient::__getCookies' => ['array'], +'SoapClient::__getFunctions' => ['?array'], +'SoapClient::__getLastRequest' => ['?string'], +'SoapClient::__getLastRequestHeaders' => ['?string'], +'SoapClient::__getLastResponse' => ['?string'], +'SoapClient::__getLastResponseHeaders' => ['?string'], +'SoapClient::__getTypes' => ['?array'], +'SoapClient::__setCookie' => ['', 'name'=>'string', 'value='=>'string'], +'SoapClient::__setLocation' => ['string', 'new_location='=>'string'], +'SoapClient::__setSoapHeaders' => ['bool', 'soapheaders='=>''], +'SoapClient::__soapCall' => ['', 'function_name'=>'string', 'arguments'=>'array', 'options='=>'array', 'input_headers='=>'SoapHeader|array', '&w_output_headers='=>'array'], +'SoapClient::SoapClient' => ['object', 'wsdl'=>'mixed', 'options='=>'array|null'], +'SoapFault::__clone' => ['void'], +'SoapFault::__construct' => ['void', 'code'=>'array|string|null', 'string'=>'string', 'actor='=>'?string', 'details='=>'?mixed', 'name='=>'?string', 'headerFault='=>'?mixed'], +'SoapFault::__toString' => ['string'], +'SoapFault::__wakeup' => ['void'], +'SoapFault::getCode' => ['int'], +'SoapFault::getFile' => ['string'], +'SoapFault::getLine' => ['int'], +'SoapFault::getMessage' => ['string'], +'SoapFault::getPrevious' => ['?Exception|?Throwable'], +'SoapFault::getTrace' => ['list\',args?:array}>'], +'SoapFault::getTraceAsString' => ['string'], +'SoapFault::SoapFault' => ['object', 'faultcode'=>'string', 'faultstring'=>'string', 'faultactor='=>'?string', 'detail='=>'?mixed', 'faultname='=>'?string', 'headerfault='=>'?mixed'], +'SoapHeader::__construct' => ['void', 'namespace'=>'string', 'name'=>'string', 'data='=>'mixed', 'mustunderstand='=>'bool', 'actor='=>'string'], +'SoapHeader::SoapHeader' => ['object', 'namespace'=>'string', 'name'=>'string', 'data='=>'mixed', 'mustunderstand='=>'bool', 'actor='=>'string'], +'SoapParam::__construct' => ['void', 'data'=>'mixed', 'name'=>'string'], +'SoapParam::SoapParam' => ['object', 'data'=>'mixed', 'name'=>'string'], +'SoapServer::__construct' => ['void', 'wsdl'=>'?string', 'options='=>'array'], +'SoapServer::addFunction' => ['void', 'functions'=>'mixed'], +'SoapServer::addSoapHeader' => ['void', 'object'=>'SoapHeader'], +'SoapServer::fault' => ['void', 'code'=>'string', 'string'=>'string', 'actor='=>'string', 'details='=>'string', 'name='=>'string'], +'SoapServer::getFunctions' => ['array'], +'SoapServer::handle' => ['void', 'soap_request='=>'string'], +'SoapServer::setClass' => ['void', 'class_name'=>'string', '...args='=>'mixed'], +'SoapServer::setObject' => ['void', 'object'=>'object'], +'SoapServer::setPersistence' => ['void', 'mode'=>'int'], +'SoapServer::SoapServer' => ['object', 'wsdl'=>'?string', 'options='=>'array'], +'SoapVar::__construct' => ['void', 'data'=>'mixed', 'encoding'=>'int', 'type_name='=>'string|null', 'type_namespace='=>'string|null', 'node_name='=>'string|null', 'node_namespace='=>'string|null'], +'SoapVar::SoapVar' => ['object', 'data'=>'mixed', 'encoding'=>'int', 'type_name='=>'string|null', 'type_namespace='=>'string|null', 'node_name='=>'string|null', 'node_namespace='=>'string|null'], +'socket_accept' => ['Socket|false', 'socket'=>'Socket'], +'socket_addrinfo_bind' => ['Socket|false', 'address'=>'AddressInfo'], +'socket_addrinfo_connect' => ['Socket|false', 'address'=>'AddressInfo'], +'socket_addrinfo_explain' => ['array', 'address'=>'AddressInfo'], +'socket_addrinfo_lookup' => ['false|AddressInfo[]', 'host='=>'string|null', 'service='=>'mixed', 'hints='=>'array'], +'socket_bind' => ['bool', 'socket'=>'Socket', 'addr'=>'string', 'port='=>'int'], +'socket_clear_error' => ['void', 'socket='=>'Socket'], +'socket_close' => ['void', 'socket'=>'Socket'], +'socket_cmsg_space' => ['int', 'level'=>'int', 'type'=>'int'], +'socket_connect' => ['bool', 'socket'=>'Socket', 'addr'=>'string', 'port='=>'int'], +'socket_create' => ['Socket|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], +'socket_create_listen' => ['Socket|false', 'port'=>'int', 'backlog='=>'int'], +'socket_create_pair' => ['bool', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int', '&w_fd'=>'Socket[]'], +'socket_export_stream' => ['resource|false', 'socket'=>'Socket'], +'socket_get_option' => ['mixed|false', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int'], +'socket_get_status' => ['array', 'stream'=>'Socket'], +'socket_getopt' => ['mixed', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int'], +'socket_getpeername' => ['bool', 'socket'=>'Socket', '&w_addr'=>'string', '&w_port='=>'int'], +'socket_getsockname' => ['bool', 'socket'=>'Socket', '&w_addr'=>'string', '&w_port='=>'int'], +'socket_import_stream' => ['Socket|false|null', 'stream'=>'resource'], +'socket_last_error' => ['int', 'socket='=>'Socket'], +'socket_listen' => ['bool', 'socket'=>'Socket', 'backlog='=>'int'], +'socket_read' => ['string|false', 'socket'=>'Socket', 'length'=>'int', 'type='=>'int'], +'socket_recv' => ['int|false', 'socket'=>'Socket', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int'], +'socket_recvfrom' => ['int|false', 'socket'=>'Socket', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int', '&w_name'=>'string', '&w_port='=>'int'], +'socket_recvmsg' => ['int|false', 'socket'=>'Socket', '&w_message'=>'string', 'flags='=>'int'], +'socket_select' => ['int|false', '&rw_read_fds'=>'Socket[]|null', '&rw_write_fds'=>'Socket[]|null', '&rw_except_fds'=>'Socket[]|null', 'tv_sec'=>'int|null', 'tv_usec='=>'int'], +'socket_send' => ['int|false', 'socket'=>'Socket', 'buf'=>'string', 'length'=>'int', 'flags'=>'int'], +'socket_sendmsg' => ['int|false', 'socket'=>'Socket', 'message'=>'array', 'flags'=>'int'], +'socket_sendto' => ['int|false', 'socket'=>'Socket', 'buf'=>'string', 'length'=>'int', 'flags'=>'int', 'addr'=>'string', 'port='=>'int'], +'socket_set_block' => ['bool', 'socket'=>'Socket'], +'socket_set_blocking' => ['bool', 'socket'=>'Socket', 'mode'=>'int'], +'socket_set_nonblock' => ['bool', 'socket'=>'Socket'], +'socket_set_option' => ['bool', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], +'socket_set_timeout' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], +'socket_setopt' => ['void', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], +'socket_shutdown' => ['bool', 'socket'=>'Socket', 'how='=>'int'], +'socket_strerror' => ['string', 'errno'=>'int'], +'socket_write' => ['int|false', 'socket'=>'Socket', 'data'=>'string', 'length='=>'int|null'], +'socket_wsaprotocol_info_export' => ['string|false', 'socket'=>'Socket', 'process_id'=>'int'], +'socket_wsaprotocol_info_import' => ['Socket|false', 'info_id'=>'string'], +'socket_wsaprotocol_info_release' => ['bool', 'info_id'=>'string'], +'sodium_add' => ['void', '&rw_string1'=>'string', 'string2'=>'string'], +'sodium_base642bin' => ['string', 'string'=>'string', 'id'=>'int', 'ignore='=>'string'], +'sodium_bin2base64' => ['string', 'string'=>'string', 'id'=>'int'], +'sodium_bin2hex' => ['string', 'string'=>'string'], +'sodium_compare' => ['int', 'string1'=>'string', 'string2'=>'string'], +'sodium_crypto_aead_aes256gcm_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_aead_aes256gcm_encrypt' => ['string', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_aead_aes256gcm_is_available' => ['bool'], +'sodium_crypto_aead_aes256gcm_keygen' => ['string'], +'sodium_crypto_aead_chacha20poly1305_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_aead_chacha20poly1305_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_aead_chacha20poly1305_ietf_keygen' => ['string'], +'sodium_crypto_aead_chacha20poly1305_keygen' => ['string'], +'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_aead_xchacha20poly1305_ietf_keygen' => ['string'], +'sodium_crypto_auth' => ['string', 'message'=>'string', 'key'=>'string'], +'sodium_crypto_auth_keygen' => ['string'], +'sodium_crypto_auth_verify' => ['bool', 'mac'=>'string', 'message'=>'string', 'key'=>'string'], +'sodium_crypto_box' => ['string', 'message'=>'string', 'nonce'=>'string', 'key_pair'=>'string'], +'sodium_crypto_box_keypair' => ['string'], +'sodium_crypto_box_keypair_from_secretkey_and_publickey' => ['string', 'secret_key'=>'string', 'public_key'=>'string'], +'sodium_crypto_box_open' => ['string|false', 'ciphertext'=>'string', 'nonce'=>'string', 'key_pair'=>'string'], +'sodium_crypto_box_publickey' => ['string', 'key_pair'=>'string'], +'sodium_crypto_box_publickey_from_secretkey' => ['string', 'secret_key'=>'string'], +'sodium_crypto_box_seal' => ['string', 'message'=>'string', 'public_key'=>'string'], +'sodium_crypto_box_seal_open' => ['string|false', 'ciphertext'=>'string', 'key_pair'=>'string'], +'sodium_crypto_box_secretkey' => ['string', 'key_pair'=>'string'], +'sodium_crypto_box_seed_keypair' => ['string', 'seed'=>'string'], +'sodium_crypto_generichash' => ['string', 'message'=>'string', 'key='=>'?string', 'length='=>'?int'], +'sodium_crypto_generichash_final' => ['string', '&state'=>'string', 'length='=>'?int'], +'sodium_crypto_generichash_init' => ['string', 'key='=>'?string', 'length='=>'?int'], +'sodium_crypto_generichash_keygen' => ['string'], +'sodium_crypto_generichash_update' => ['bool', '&rw_state'=>'string', 'string'=>'string'], +'sodium_crypto_kdf_derive_from_key' => ['string', 'subkey_length'=>'int', 'subkey_id'=>'int', 'context'=>'string', 'key'=>'string'], +'sodium_crypto_kdf_keygen' => ['string'], +'sodium_crypto_kx_client_session_keys' => ['array', 'client_keypair'=>'string', 'server_key'=>'string'], +'sodium_crypto_kx_keypair' => ['string'], +'sodium_crypto_kx_publickey' => ['string', 'key_pair'=>'string'], +'sodium_crypto_kx_secretkey' => ['string', 'key_pair'=>'string'], +'sodium_crypto_kx_seed_keypair' => ['string', 'seed'=>'string'], +'sodium_crypto_kx_server_session_keys' => ['array', 'server_key_pair'=>'string', 'client_key'=>'string'], +'sodium_crypto_pwhash' => ['string', 'length'=>'int', 'password'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int', 'algo='=>'int'], +'sodium_crypto_pwhash_scryptsalsa208sha256' => ['string', 'length'=>'int', 'password'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], +'sodium_crypto_pwhash_scryptsalsa208sha256_str' => ['string', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], +'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify' => ['bool', 'hash'=>'string', 'password'=>'string'], +'sodium_crypto_pwhash_str' => ['string', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], +'sodium_crypto_pwhash_str_needs_rehash' => ['bool', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], +'sodium_crypto_pwhash_str_verify' => ['bool', 'hash'=>'string', 'password'=>'string'], +'sodium_crypto_scalarmult' => ['string', 'n'=>'string', 'p'=>'string'], +'sodium_crypto_scalarmult_base' => ['string', 'secret_key'=>'string'], +'sodium_crypto_secretbox' => ['string', 'message'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_secretbox_keygen' => ['string'], +'sodium_crypto_secretbox_open' => ['string|false', 'ciphertext'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_secretstream_xchacha20poly1305_init_pull' => ['string', 'header'=>'string', 'key'=>'string'], +'sodium_crypto_secretstream_xchacha20poly1305_init_push' => ['array', 'key'=>'string'], +'sodium_crypto_secretstream_xchacha20poly1305_keygen' => ['string'], +'sodium_crypto_secretstream_xchacha20poly1305_pull' => ['array', '&r_state'=>'string', 'ciphertext'=>'string', 'additional_data='=>'string'], +'sodium_crypto_secretstream_xchacha20poly1305_push' => ['string', '&w_state'=>'string', 'message'=>'string', 'additional_data='=>'string', 'tag='=>'int'], +'sodium_crypto_secretstream_xchacha20poly1305_rekey' => ['void', 'state'=>'string'], +'sodium_crypto_shorthash' => ['string', 'message'=>'string', 'key'=>'string'], +'sodium_crypto_shorthash_keygen' => ['string'], +'sodium_crypto_sign' => ['string', 'message'=>'string', 'secret_key'=>'string'], +'sodium_crypto_sign_detached' => ['string', 'message'=>'string', 'secret_key'=>'string'], +'sodium_crypto_sign_ed25519_pk_to_curve25519' => ['string', 'public_key'=>'string'], +'sodium_crypto_sign_ed25519_sk_to_curve25519' => ['string', 'secret_key'=>'string'], +'sodium_crypto_sign_keypair' => ['string'], +'sodium_crypto_sign_keypair_from_secretkey_and_publickey' => ['string', 'secret_key'=>'string', 'public_key'=>'string'], +'sodium_crypto_sign_open' => ['string|false', 'signed_message'=>'string', 'public_key'=>'string'], +'sodium_crypto_sign_publickey' => ['string', 'key_pair'=>'string'], +'sodium_crypto_sign_publickey_from_secretkey' => ['string', 'secret_key'=>'string'], +'sodium_crypto_sign_secretkey' => ['string', 'key_pair'=>'string'], +'sodium_crypto_sign_seed_keypair' => ['string', 'seed'=>'string'], +'sodium_crypto_sign_verify_detached' => ['bool', 'signature'=>'string', 'message'=>'string', 'public_key'=>'string'], +'sodium_crypto_stream' => ['string', 'length'=>'int', 'nonce'=>'string', 'key'=>'string'], +'sodium_crypto_stream_keygen' => ['string'], +'sodium_crypto_stream_xor' => ['string', 'message'=>'string', 'nonce'=>'string', 'key'=>'string'], +'sodium_hex2bin' => ['string', 'string'=>'string', 'ignore='=>'string'], +'sodium_increment' => ['void', '&rw_string'=>'string'], +'sodium_memcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], +'sodium_memzero' => ['void', '&w_string'=>'string'], +'sodium_pad' => ['string', 'string'=>'string', 'block_size'=>'int'], +'sodium_unpad' => ['string', 'string'=>'string', 'block_size'=>'int'], +'solid_fetch_prev' => ['bool', 'result_id'=>''], +'solr_get_version' => ['string|false'], +'SolrClient::__construct' => ['void', 'clientOptions'=>'array'], +'SolrClient::__destruct' => ['void'], +'SolrClient::addDocument' => ['SolrUpdateResponse', 'doc'=>'SolrInputDocument', 'allowdups='=>'bool', 'commitwithin='=>'int'], +'SolrClient::addDocuments' => ['SolrUpdateResponse', 'docs'=>'array', 'allowdups='=>'bool', 'commitwithin='=>'int'], +'SolrClient::commit' => ['SolrUpdateResponse', 'maxsegments='=>'int', 'waitflush='=>'bool', 'waitsearcher='=>'bool'], +'SolrClient::deleteById' => ['SolrUpdateResponse', 'id'=>'string'], +'SolrClient::deleteByIds' => ['SolrUpdateResponse', 'ids'=>'array'], +'SolrClient::deleteByQueries' => ['SolrUpdateResponse', 'queries'=>'array'], +'SolrClient::deleteByQuery' => ['SolrUpdateResponse', 'query'=>'string'], +'SolrClient::getById' => ['SolrQueryResponse', 'id'=>'string'], +'SolrClient::getByIds' => ['SolrQueryResponse', 'ids'=>'array'], +'SolrClient::getDebug' => ['string'], +'SolrClient::getOptions' => ['array'], +'SolrClient::optimize' => ['SolrUpdateResponse', 'maxsegments='=>'int', 'waitflush='=>'bool', 'waitsearcher='=>'bool'], +'SolrClient::ping' => ['SolrPingResponse'], +'SolrClient::query' => ['SolrQueryResponse', 'query'=>'SolrParams'], +'SolrClient::request' => ['SolrUpdateResponse', 'raw_request'=>'string'], +'SolrClient::rollback' => ['SolrUpdateResponse'], +'SolrClient::setResponseWriter' => ['void', 'responsewriter'=>'string'], +'SolrClient::setServlet' => ['bool', 'type'=>'int', 'value'=>'string'], +'SolrClient::system' => ['SolrGenericResponse'], +'SolrClient::threads' => ['SolrGenericResponse'], +'SolrClientException::__clone' => ['void'], +'SolrClientException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'SolrClientException::__toString' => ['string'], +'SolrClientException::__wakeup' => ['void'], +'SolrClientException::getCode' => ['int'], +'SolrClientException::getFile' => ['string'], +'SolrClientException::getInternalInfo' => ['array'], +'SolrClientException::getLine' => ['int'], +'SolrClientException::getMessage' => ['string'], +'SolrClientException::getPrevious' => ['?Exception|?Throwable'], +'SolrClientException::getTrace' => ['list\',args?:array}>'], +'SolrClientException::getTraceAsString' => ['string'], +'SolrCollapseFunction::__construct' => ['void', 'field'=>'string'], +'SolrCollapseFunction::__toString' => ['string'], +'SolrCollapseFunction::getField' => ['string'], +'SolrCollapseFunction::getHint' => ['string'], +'SolrCollapseFunction::getMax' => ['string'], +'SolrCollapseFunction::getMin' => ['string'], +'SolrCollapseFunction::getNullPolicy' => ['string'], +'SolrCollapseFunction::getSize' => ['int'], +'SolrCollapseFunction::setField' => ['SolrCollapseFunction', 'fieldName'=>'string'], +'SolrCollapseFunction::setHint' => ['SolrCollapseFunction', 'hint'=>'string'], +'SolrCollapseFunction::setMax' => ['SolrCollapseFunction', 'max'=>'string'], +'SolrCollapseFunction::setMin' => ['SolrCollapseFunction', 'min'=>'string'], +'SolrCollapseFunction::setNullPolicy' => ['SolrCollapseFunction', 'nullPolicy'=>'string'], +'SolrCollapseFunction::setSize' => ['SolrCollapseFunction', 'size'=>'int'], +'SolrDisMaxQuery::__construct' => ['void', 'q='=>'string'], +'SolrDisMaxQuery::__destruct' => ['void'], +'SolrDisMaxQuery::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], +'SolrDisMaxQuery::addBigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], +'SolrDisMaxQuery::addBoostQuery' => ['SolrDisMaxQuery', 'field'=>'string', 'value'=>'string', 'boost='=>'string'], +'SolrDisMaxQuery::addExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], +'SolrDisMaxQuery::addExpandSortField' => ['SolrQuery', 'field'=>'string', 'order'=>'string'], +'SolrDisMaxQuery::addFacetDateField' => ['SolrQuery', 'dateField'=>'string'], +'SolrDisMaxQuery::addFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::addFacetField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::addFacetQuery' => ['SolrQuery', 'facetQuery'=>'string'], +'SolrDisMaxQuery::addField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::addFilterQuery' => ['SolrQuery', 'fq'=>'string'], +'SolrDisMaxQuery::addGroupField' => ['SolrQuery', 'value'=>'string'], +'SolrDisMaxQuery::addGroupFunction' => ['SolrQuery', 'value'=>'string'], +'SolrDisMaxQuery::addGroupQuery' => ['SolrQuery', 'value'=>'string'], +'SolrDisMaxQuery::addGroupSortField' => ['SolrQuery', 'field'=>'string', 'order'=>'int'], +'SolrDisMaxQuery::addHighlightField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::addMltField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::addMltQueryField' => ['SolrQuery', 'field'=>'string', 'boost'=>'float'], +'SolrDisMaxQuery::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], +'SolrDisMaxQuery::addPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], +'SolrDisMaxQuery::addQueryField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost='=>'string'], +'SolrDisMaxQuery::addSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], +'SolrDisMaxQuery::addStatsFacet' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::addStatsField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::addTrigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], +'SolrDisMaxQuery::addUserField' => ['SolrDisMaxQuery', 'field'=>'string'], +'SolrDisMaxQuery::collapse' => ['SolrQuery', 'collapseFunction'=>'SolrCollapseFunction'], +'SolrDisMaxQuery::get' => ['mixed', 'param_name'=>'string'], +'SolrDisMaxQuery::getExpand' => ['bool'], +'SolrDisMaxQuery::getExpandFilterQueries' => ['array'], +'SolrDisMaxQuery::getExpandQuery' => ['array'], +'SolrDisMaxQuery::getExpandRows' => ['int'], +'SolrDisMaxQuery::getExpandSortFields' => ['array'], +'SolrDisMaxQuery::getFacet' => ['bool'], +'SolrDisMaxQuery::getFacetDateEnd' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetDateFields' => ['array'], +'SolrDisMaxQuery::getFacetDateGap' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetDateHardEnd' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetDateOther' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetDateStart' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetFields' => ['array'], +'SolrDisMaxQuery::getFacetLimit' => ['int', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetMethod' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetMinCount' => ['int', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetMissing' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetOffset' => ['int', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetPrefix' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getFacetQueries' => ['string'], +'SolrDisMaxQuery::getFacetSort' => ['int', 'field_override'=>'string'], +'SolrDisMaxQuery::getFields' => ['string'], +'SolrDisMaxQuery::getFilterQueries' => ['string'], +'SolrDisMaxQuery::getGroup' => ['bool'], +'SolrDisMaxQuery::getGroupCachePercent' => ['int'], +'SolrDisMaxQuery::getGroupFacet' => ['bool'], +'SolrDisMaxQuery::getGroupFields' => ['array'], +'SolrDisMaxQuery::getGroupFormat' => ['string'], +'SolrDisMaxQuery::getGroupFunctions' => ['array'], +'SolrDisMaxQuery::getGroupLimit' => ['int'], +'SolrDisMaxQuery::getGroupMain' => ['bool'], +'SolrDisMaxQuery::getGroupNGroups' => ['bool'], +'SolrDisMaxQuery::getGroupOffset' => ['bool'], +'SolrDisMaxQuery::getGroupQueries' => ['array'], +'SolrDisMaxQuery::getGroupSortFields' => ['array'], +'SolrDisMaxQuery::getGroupTruncate' => ['bool'], +'SolrDisMaxQuery::getHighlight' => ['bool'], +'SolrDisMaxQuery::getHighlightAlternateField' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getHighlightFields' => ['array'], +'SolrDisMaxQuery::getHighlightFormatter' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getHighlightFragmenter' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getHighlightFragsize' => ['int', 'field_override'=>'string'], +'SolrDisMaxQuery::getHighlightHighlightMultiTerm' => ['bool'], +'SolrDisMaxQuery::getHighlightMaxAlternateFieldLength' => ['int', 'field_override'=>'string'], +'SolrDisMaxQuery::getHighlightMaxAnalyzedChars' => ['int'], +'SolrDisMaxQuery::getHighlightMergeContiguous' => ['bool', 'field_override'=>'string'], +'SolrDisMaxQuery::getHighlightRegexMaxAnalyzedChars' => ['int'], +'SolrDisMaxQuery::getHighlightRegexPattern' => ['string'], +'SolrDisMaxQuery::getHighlightRegexSlop' => ['float'], +'SolrDisMaxQuery::getHighlightRequireFieldMatch' => ['bool'], +'SolrDisMaxQuery::getHighlightSimplePost' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getHighlightSimplePre' => ['string', 'field_override'=>'string'], +'SolrDisMaxQuery::getHighlightSnippets' => ['int', 'field_override'=>'string'], +'SolrDisMaxQuery::getHighlightUsePhraseHighlighter' => ['bool'], +'SolrDisMaxQuery::getMlt' => ['bool'], +'SolrDisMaxQuery::getMltBoost' => ['bool'], +'SolrDisMaxQuery::getMltCount' => ['int'], +'SolrDisMaxQuery::getMltFields' => ['array'], +'SolrDisMaxQuery::getMltMaxNumQueryTerms' => ['int'], +'SolrDisMaxQuery::getMltMaxNumTokens' => ['int'], +'SolrDisMaxQuery::getMltMaxWordLength' => ['int'], +'SolrDisMaxQuery::getMltMinDocFrequency' => ['int'], +'SolrDisMaxQuery::getMltMinTermFrequency' => ['int'], +'SolrDisMaxQuery::getMltMinWordLength' => ['int'], +'SolrDisMaxQuery::getMltQueryFields' => ['array'], +'SolrDisMaxQuery::getParam' => ['mixed', 'param_name'=>'string'], +'SolrDisMaxQuery::getParams' => ['array'], +'SolrDisMaxQuery::getPreparedParams' => ['array'], +'SolrDisMaxQuery::getQuery' => ['string'], +'SolrDisMaxQuery::getRows' => ['int'], +'SolrDisMaxQuery::getSortFields' => ['array'], +'SolrDisMaxQuery::getStart' => ['int'], +'SolrDisMaxQuery::getStats' => ['bool'], +'SolrDisMaxQuery::getStatsFacets' => ['array'], +'SolrDisMaxQuery::getStatsFields' => ['array'], +'SolrDisMaxQuery::getTerms' => ['bool'], +'SolrDisMaxQuery::getTermsField' => ['string'], +'SolrDisMaxQuery::getTermsIncludeLowerBound' => ['bool'], +'SolrDisMaxQuery::getTermsIncludeUpperBound' => ['bool'], +'SolrDisMaxQuery::getTermsLimit' => ['int'], +'SolrDisMaxQuery::getTermsLowerBound' => ['string'], +'SolrDisMaxQuery::getTermsMaxCount' => ['int'], +'SolrDisMaxQuery::getTermsMinCount' => ['int'], +'SolrDisMaxQuery::getTermsPrefix' => ['string'], +'SolrDisMaxQuery::getTermsReturnRaw' => ['bool'], +'SolrDisMaxQuery::getTermsSort' => ['int'], +'SolrDisMaxQuery::getTermsUpperBound' => ['string'], +'SolrDisMaxQuery::getTimeAllowed' => ['int'], +'SolrDisMaxQuery::removeBigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeBoostQuery' => ['SolrDisMaxQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], +'SolrDisMaxQuery::removeExpandSortField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeFacetDateField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::removeFacetField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeFacetQuery' => ['SolrQuery', 'value'=>'string'], +'SolrDisMaxQuery::removeField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeFilterQuery' => ['SolrQuery', 'fq'=>'string'], +'SolrDisMaxQuery::removeHighlightField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeMltField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeMltQueryField' => ['SolrQuery', 'queryField'=>'string'], +'SolrDisMaxQuery::removePhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeQueryField' => ['SolrDisMaxQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeSortField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeStatsFacet' => ['SolrQuery', 'value'=>'string'], +'SolrDisMaxQuery::removeStatsField' => ['SolrQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeTrigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], +'SolrDisMaxQuery::removeUserField' => ['SolrDisMaxQuery', 'field'=>'string'], +'SolrDisMaxQuery::serialize' => ['string'], +'SolrDisMaxQuery::set' => ['SolrParams', 'name'=>'string', 'value'=>''], +'SolrDisMaxQuery::setBigramPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], +'SolrDisMaxQuery::setBigramPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], +'SolrDisMaxQuery::setBoostFunction' => ['SolrDisMaxQuery', 'function'=>'string'], +'SolrDisMaxQuery::setBoostQuery' => ['SolrDisMaxQuery', 'q'=>'string'], +'SolrDisMaxQuery::setEchoHandler' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setEchoParams' => ['SolrQuery', 'type'=>'string'], +'SolrDisMaxQuery::setExpand' => ['SolrQuery', 'value'=>'bool'], +'SolrDisMaxQuery::setExpandQuery' => ['SolrQuery', 'q'=>'string'], +'SolrDisMaxQuery::setExpandRows' => ['SolrQuery', 'value'=>'int'], +'SolrDisMaxQuery::setExplainOther' => ['SolrQuery', 'query'=>'string'], +'SolrDisMaxQuery::setFacet' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setFacetDateEnd' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetDateGap' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetDateHardEnd' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetDateStart' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency'=>'int', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetLimit' => ['SolrQuery', 'limit'=>'int', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetMethod' => ['SolrQuery', 'method'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetMinCount' => ['SolrQuery', 'mincount'=>'int', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetMissing' => ['SolrQuery', 'flag'=>'bool', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetOffset' => ['SolrQuery', 'offset'=>'int', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetPrefix' => ['SolrQuery', 'prefix'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setFacetSort' => ['SolrQuery', 'facetSort'=>'int', 'field_override'=>'string'], +'SolrDisMaxQuery::setGroup' => ['SolrQuery', 'value'=>'bool'], +'SolrDisMaxQuery::setGroupCachePercent' => ['SolrQuery', 'percent'=>'int'], +'SolrDisMaxQuery::setGroupFacet' => ['SolrQuery', 'value'=>'bool'], +'SolrDisMaxQuery::setGroupFormat' => ['SolrQuery', 'value'=>'string'], +'SolrDisMaxQuery::setGroupLimit' => ['SolrQuery', 'value'=>'int'], +'SolrDisMaxQuery::setGroupMain' => ['SolrQuery', 'value'=>'string'], +'SolrDisMaxQuery::setGroupNGroups' => ['SolrQuery', 'value'=>'bool'], +'SolrDisMaxQuery::setGroupOffset' => ['SolrQuery', 'value'=>'int'], +'SolrDisMaxQuery::setGroupTruncate' => ['SolrQuery', 'value'=>'bool'], +'SolrDisMaxQuery::setHighlight' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setHighlightAlternateField' => ['SolrQuery', 'field'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setHighlightFormatter' => ['SolrQuery', 'formatter'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setHighlightFragsize' => ['SolrQuery', 'size'=>'int', 'field_override'=>'string'], +'SolrDisMaxQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldLength'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value'=>'int'], +'SolrDisMaxQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag'=>'bool', 'field_override'=>'string'], +'SolrDisMaxQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxAnalyzedChars'=>'int'], +'SolrDisMaxQuery::setHighlightRegexPattern' => ['SolrQuery', 'value'=>'string'], +'SolrDisMaxQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor'=>'float'], +'SolrDisMaxQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setHighlightSimplePost' => ['SolrQuery', 'simplePost'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setHighlightSimplePre' => ['SolrQuery', 'simplePre'=>'string', 'field_override'=>'string'], +'SolrDisMaxQuery::setHighlightSnippets' => ['SolrQuery', 'value'=>'int', 'field_override'=>'string'], +'SolrDisMaxQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setMinimumMatch' => ['SolrDisMaxQuery', 'value'=>'string'], +'SolrDisMaxQuery::setMlt' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setMltBoost' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setMltCount' => ['SolrQuery', 'count'=>'int'], +'SolrDisMaxQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value'=>'int'], +'SolrDisMaxQuery::setMltMaxNumTokens' => ['SolrQuery', 'value'=>'int'], +'SolrDisMaxQuery::setMltMaxWordLength' => ['SolrQuery', 'maxWordLength'=>'int'], +'SolrDisMaxQuery::setMltMinDocFrequency' => ['SolrQuery', 'minDocFrequency'=>'int'], +'SolrDisMaxQuery::setMltMinTermFrequency' => ['SolrQuery', 'minTermFrequency'=>'int'], +'SolrDisMaxQuery::setMltMinWordLength' => ['SolrQuery', 'minWordLength'=>'int'], +'SolrDisMaxQuery::setOmitHeader' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], +'SolrDisMaxQuery::setPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], +'SolrDisMaxQuery::setPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], +'SolrDisMaxQuery::setQuery' => ['SolrQuery', 'query'=>'string'], +'SolrDisMaxQuery::setQueryAlt' => ['SolrDisMaxQuery', 'q'=>'string'], +'SolrDisMaxQuery::setQueryPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], +'SolrDisMaxQuery::setRows' => ['SolrQuery', 'rows'=>'int'], +'SolrDisMaxQuery::setShowDebugInfo' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setStart' => ['SolrQuery', 'start'=>'int'], +'SolrDisMaxQuery::setStats' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setTerms' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setTermsField' => ['SolrQuery', 'fieldname'=>'string'], +'SolrDisMaxQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setTermsLimit' => ['SolrQuery', 'limit'=>'int'], +'SolrDisMaxQuery::setTermsLowerBound' => ['SolrQuery', 'lowerBound'=>'string'], +'SolrDisMaxQuery::setTermsMaxCount' => ['SolrQuery', 'frequency'=>'int'], +'SolrDisMaxQuery::setTermsMinCount' => ['SolrQuery', 'frequency'=>'int'], +'SolrDisMaxQuery::setTermsPrefix' => ['SolrQuery', 'prefix'=>'string'], +'SolrDisMaxQuery::setTermsReturnRaw' => ['SolrQuery', 'flag'=>'bool'], +'SolrDisMaxQuery::setTermsSort' => ['SolrQuery', 'sortType'=>'int'], +'SolrDisMaxQuery::setTermsUpperBound' => ['SolrQuery', 'upperBound'=>'string'], +'SolrDisMaxQuery::setTieBreaker' => ['SolrDisMaxQuery', 'tieBreaker'=>'string'], +'SolrDisMaxQuery::setTimeAllowed' => ['SolrQuery', 'timeAllowed'=>'int'], +'SolrDisMaxQuery::setTrigramPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], +'SolrDisMaxQuery::setTrigramPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], +'SolrDisMaxQuery::setUserFields' => ['SolrDisMaxQuery', 'fields'=>'string'], +'SolrDisMaxQuery::toString' => ['string', 'url_encode='=>'bool'], +'SolrDisMaxQuery::unserialize' => ['void', 'serialized'=>'string'], +'SolrDisMaxQuery::useDisMaxQueryParser' => ['SolrDisMaxQuery'], +'SolrDisMaxQuery::useEDisMaxQueryParser' => ['SolrDisMaxQuery'], +'SolrDocument::__clone' => ['void'], +'SolrDocument::__construct' => ['void'], +'SolrDocument::__destruct' => ['void'], +'SolrDocument::__get' => ['SolrDocumentField', 'fieldname'=>'string'], +'SolrDocument::__isset' => ['bool', 'fieldname'=>'string'], +'SolrDocument::__set' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string'], +'SolrDocument::__unset' => ['bool', 'fieldname'=>'string'], +'SolrDocument::addField' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string'], +'SolrDocument::clear' => ['bool'], +'SolrDocument::current' => ['SolrDocumentField'], +'SolrDocument::deleteField' => ['bool', 'fieldname'=>'string'], +'SolrDocument::fieldExists' => ['bool', 'fieldname'=>'string'], +'SolrDocument::getChildDocuments' => ['SolrInputDocument[]'], +'SolrDocument::getChildDocumentsCount' => ['int'], +'SolrDocument::getField' => ['SolrDocumentField|false', 'fieldname'=>'string'], +'SolrDocument::getFieldCount' => ['int|false'], +'SolrDocument::getFieldNames' => ['array|false'], +'SolrDocument::getInputDocument' => ['SolrInputDocument'], +'SolrDocument::hasChildDocuments' => ['bool'], +'SolrDocument::key' => ['string'], +'SolrDocument::merge' => ['bool', 'sourcedoc'=>'solrdocument', 'overwrite='=>'bool'], +'SolrDocument::next' => ['void'], +'SolrDocument::offsetExists' => ['bool', 'fieldname'=>'string'], +'SolrDocument::offsetGet' => ['SolrDocumentField', 'fieldname'=>'string'], +'SolrDocument::offsetSet' => ['void', 'fieldname'=>'string', 'fieldvalue'=>'string'], +'SolrDocument::offsetUnset' => ['void', 'fieldname'=>'string'], +'SolrDocument::reset' => ['bool'], +'SolrDocument::rewind' => ['void'], +'SolrDocument::serialize' => ['string'], +'SolrDocument::sort' => ['bool', 'sortorderby'=>'int', 'sortdirection='=>'int'], +'SolrDocument::toArray' => ['array'], +'SolrDocument::unserialize' => ['void', 'serialized'=>'string'], +'SolrDocument::valid' => ['bool'], +'SolrDocumentField::__construct' => ['void'], +'SolrDocumentField::__destruct' => ['void'], +'SolrException::__clone' => ['void'], +'SolrException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'SolrException::__toString' => ['string'], +'SolrException::__wakeup' => ['void'], +'SolrException::getCode' => ['int'], +'SolrException::getFile' => ['string'], +'SolrException::getInternalInfo' => ['array'], +'SolrException::getLine' => ['int'], +'SolrException::getMessage' => ['string'], +'SolrException::getPrevious' => ['Exception|Throwable'], +'SolrException::getTrace' => ['list\',args?:array}>'], +'SolrException::getTraceAsString' => ['string'], +'SolrGenericResponse::__construct' => ['void'], +'SolrGenericResponse::__destruct' => ['void'], +'SolrGenericResponse::getDigestedResponse' => ['string'], +'SolrGenericResponse::getHttpStatus' => ['int'], +'SolrGenericResponse::getHttpStatusMessage' => ['string'], +'SolrGenericResponse::getRawRequest' => ['string'], +'SolrGenericResponse::getRawRequestHeaders' => ['string'], +'SolrGenericResponse::getRawResponse' => ['string'], +'SolrGenericResponse::getRawResponseHeaders' => ['string'], +'SolrGenericResponse::getRequestUrl' => ['string'], +'SolrGenericResponse::getResponse' => ['SolrObject'], +'SolrGenericResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], +'SolrGenericResponse::success' => ['bool'], +'SolrIllegalArgumentException::__clone' => ['void'], +'SolrIllegalArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'SolrIllegalArgumentException::__toString' => ['string'], +'SolrIllegalArgumentException::__wakeup' => ['void'], +'SolrIllegalArgumentException::getCode' => ['int'], +'SolrIllegalArgumentException::getFile' => ['string'], +'SolrIllegalArgumentException::getInternalInfo' => ['array'], +'SolrIllegalArgumentException::getLine' => ['int'], +'SolrIllegalArgumentException::getMessage' => ['string'], +'SolrIllegalArgumentException::getPrevious' => ['Exception|Throwable'], +'SolrIllegalArgumentException::getTrace' => ['list\',args?:array}>'], +'SolrIllegalArgumentException::getTraceAsString' => ['string'], +'SolrIllegalOperationException::__clone' => ['void'], +'SolrIllegalOperationException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'SolrIllegalOperationException::__toString' => ['string'], +'SolrIllegalOperationException::__wakeup' => ['void'], +'SolrIllegalOperationException::getCode' => ['int'], +'SolrIllegalOperationException::getFile' => ['string'], +'SolrIllegalOperationException::getInternalInfo' => ['array'], +'SolrIllegalOperationException::getLine' => ['int'], +'SolrIllegalOperationException::getMessage' => ['string'], +'SolrIllegalOperationException::getPrevious' => ['Exception|Throwable'], +'SolrIllegalOperationException::getTrace' => ['list\',args?:array}>'], +'SolrIllegalOperationException::getTraceAsString' => ['string'], +'SolrInputDocument::__clone' => ['void'], +'SolrInputDocument::__construct' => ['void'], +'SolrInputDocument::__destruct' => ['void'], +'SolrInputDocument::addChildDocument' => ['void', 'child'=>'SolrInputDocument'], +'SolrInputDocument::addChildDocuments' => ['void', 'docs'=>'array'], +'SolrInputDocument::addField' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string', 'fieldboostvalue='=>'float'], +'SolrInputDocument::clear' => ['bool'], +'SolrInputDocument::deleteField' => ['bool', 'fieldname'=>'string'], +'SolrInputDocument::fieldExists' => ['bool', 'fieldname'=>'string'], +'SolrInputDocument::getBoost' => ['float|false'], +'SolrInputDocument::getChildDocuments' => ['SolrInputDocument[]'], +'SolrInputDocument::getChildDocumentsCount' => ['int'], +'SolrInputDocument::getField' => ['SolrDocumentField|false', 'fieldname'=>'string'], +'SolrInputDocument::getFieldBoost' => ['float|false', 'fieldname'=>'string'], +'SolrInputDocument::getFieldCount' => ['int|false'], +'SolrInputDocument::getFieldNames' => ['array|false'], +'SolrInputDocument::hasChildDocuments' => ['bool'], +'SolrInputDocument::merge' => ['bool', 'sourcedoc'=>'SolrInputDocument', 'overwrite='=>'bool'], +'SolrInputDocument::reset' => ['bool'], +'SolrInputDocument::setBoost' => ['bool', 'documentboostvalue'=>'float'], +'SolrInputDocument::setFieldBoost' => ['bool', 'fieldname'=>'string', 'fieldboostvalue'=>'float'], +'SolrInputDocument::sort' => ['bool', 'sortorderby'=>'int', 'sortdirection='=>'int'], +'SolrInputDocument::toArray' => ['array|false'], +'SolrModifiableParams::__construct' => ['void'], +'SolrModifiableParams::__destruct' => ['void'], +'SolrModifiableParams::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], +'SolrModifiableParams::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], +'SolrModifiableParams::get' => ['mixed', 'param_name'=>'string'], +'SolrModifiableParams::getParam' => ['mixed', 'param_name'=>'string'], +'SolrModifiableParams::getParams' => ['array'], +'SolrModifiableParams::getPreparedParams' => ['array'], +'SolrModifiableParams::serialize' => ['string'], +'SolrModifiableParams::set' => ['SolrParams', 'name'=>'string', 'value'=>''], +'SolrModifiableParams::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], +'SolrModifiableParams::toString' => ['string', 'url_encode='=>'bool'], +'SolrModifiableParams::unserialize' => ['void', 'serialized'=>'string'], +'SolrObject::__construct' => ['void'], +'SolrObject::__destruct' => ['void'], +'SolrObject::getPropertyNames' => ['array'], +'SolrObject::offsetExists' => ['bool', 'property_name'=>'string'], +'SolrObject::offsetGet' => ['SolrDocumentField', 'property_name'=>'string'], +'SolrObject::offsetSet' => ['void', 'property_name'=>'string', 'property_value'=>'string'], +'SolrObject::offsetUnset' => ['void', 'property_name'=>'string'], +'SolrParams::__construct' => ['void'], +'SolrParams::add' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], +'SolrParams::addParam' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], +'SolrParams::get' => ['mixed', 'param_name'=>'string'], +'SolrParams::getParam' => ['mixed', 'param_name='=>'string'], +'SolrParams::getParams' => ['array'], +'SolrParams::getPreparedParams' => ['array'], +'SolrParams::serialize' => ['string'], +'SolrParams::set' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], +'SolrParams::setParam' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], +'SolrParams::toString' => ['string|false', 'url_encode='=>'bool'], +'SolrParams::unserialize' => ['void', 'serialized'=>'string'], +'SolrPingResponse::__construct' => ['void'], +'SolrPingResponse::__destruct' => ['void'], +'SolrPingResponse::getDigestedResponse' => ['string'], +'SolrPingResponse::getHttpStatus' => ['int'], +'SolrPingResponse::getHttpStatusMessage' => ['string'], +'SolrPingResponse::getRawRequest' => ['string'], +'SolrPingResponse::getRawRequestHeaders' => ['string'], +'SolrPingResponse::getRawResponse' => ['string'], +'SolrPingResponse::getRawResponseHeaders' => ['string'], +'SolrPingResponse::getRequestUrl' => ['string'], +'SolrPingResponse::getResponse' => ['string'], +'SolrPingResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], +'SolrPingResponse::success' => ['bool'], +'SolrQuery::__construct' => ['void', 'q='=>'string'], +'SolrQuery::__destruct' => ['void'], +'SolrQuery::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], +'SolrQuery::addExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], +'SolrQuery::addExpandSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'string'], +'SolrQuery::addFacetDateField' => ['SolrQuery', 'datefield'=>'string'], +'SolrQuery::addFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], +'SolrQuery::addFacetField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::addFacetQuery' => ['SolrQuery', 'facetquery'=>'string'], +'SolrQuery::addField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::addFilterQuery' => ['SolrQuery', 'fq'=>'string'], +'SolrQuery::addGroupField' => ['SolrQuery', 'value'=>'string'], +'SolrQuery::addGroupFunction' => ['SolrQuery', 'value'=>'string'], +'SolrQuery::addGroupQuery' => ['SolrQuery', 'value'=>'string'], +'SolrQuery::addGroupSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], +'SolrQuery::addHighlightField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::addMltField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::addMltQueryField' => ['SolrQuery', 'field'=>'string', 'boost'=>'float'], +'SolrQuery::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], +'SolrQuery::addSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], +'SolrQuery::addStatsFacet' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::addStatsField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::collapse' => ['SolrQuery', 'collapseFunction'=>'SolrCollapseFunction'], +'SolrQuery::get' => ['mixed', 'param_name'=>'string'], +'SolrQuery::getExpand' => ['bool'], +'SolrQuery::getExpandFilterQueries' => ['array'], +'SolrQuery::getExpandQuery' => ['array'], +'SolrQuery::getExpandRows' => ['int'], +'SolrQuery::getExpandSortFields' => ['array'], +'SolrQuery::getFacet' => ['?bool'], +'SolrQuery::getFacetDateEnd' => ['?string', 'field_override='=>'string'], +'SolrQuery::getFacetDateFields' => ['array'], +'SolrQuery::getFacetDateGap' => ['?string', 'field_override='=>'string'], +'SolrQuery::getFacetDateHardEnd' => ['?string', 'field_override='=>'string'], +'SolrQuery::getFacetDateOther' => ['?string', 'field_override='=>'string'], +'SolrQuery::getFacetDateStart' => ['?string', 'field_override='=>'string'], +'SolrQuery::getFacetFields' => ['array'], +'SolrQuery::getFacetLimit' => ['?int', 'field_override='=>'string'], +'SolrQuery::getFacetMethod' => ['?string', 'field_override='=>'string'], +'SolrQuery::getFacetMinCount' => ['?int', 'field_override='=>'string'], +'SolrQuery::getFacetMissing' => ['?bool', 'field_override='=>'string'], +'SolrQuery::getFacetOffset' => ['?int', 'field_override='=>'string'], +'SolrQuery::getFacetPrefix' => ['?string', 'field_override='=>'string'], +'SolrQuery::getFacetQueries' => ['?array'], +'SolrQuery::getFacetSort' => ['int', 'field_override='=>'string'], +'SolrQuery::getFields' => ['?array'], +'SolrQuery::getFilterQueries' => ['?array'], +'SolrQuery::getGroup' => ['bool'], +'SolrQuery::getGroupCachePercent' => ['int'], +'SolrQuery::getGroupFacet' => ['bool'], +'SolrQuery::getGroupFields' => ['array'], +'SolrQuery::getGroupFormat' => ['string'], +'SolrQuery::getGroupFunctions' => ['array'], +'SolrQuery::getGroupLimit' => ['int'], +'SolrQuery::getGroupMain' => ['bool'], +'SolrQuery::getGroupNGroups' => ['bool'], +'SolrQuery::getGroupOffset' => ['int'], +'SolrQuery::getGroupQueries' => ['array'], +'SolrQuery::getGroupSortFields' => ['array'], +'SolrQuery::getGroupTruncate' => ['bool'], +'SolrQuery::getHighlight' => ['bool'], +'SolrQuery::getHighlightAlternateField' => ['?string', 'field_override='=>'string'], +'SolrQuery::getHighlightFields' => ['?array'], +'SolrQuery::getHighlightFormatter' => ['?string', 'field_override='=>'string'], +'SolrQuery::getHighlightFragmenter' => ['?string', 'field_override='=>'string'], +'SolrQuery::getHighlightFragsize' => ['?int', 'field_override='=>'string'], +'SolrQuery::getHighlightHighlightMultiTerm' => ['?bool'], +'SolrQuery::getHighlightMaxAlternateFieldLength' => ['?int', 'field_override='=>'string'], +'SolrQuery::getHighlightMaxAnalyzedChars' => ['?int'], +'SolrQuery::getHighlightMergeContiguous' => ['?bool', 'field_override='=>'string'], +'SolrQuery::getHighlightRegexMaxAnalyzedChars' => ['?int'], +'SolrQuery::getHighlightRegexPattern' => ['?string'], +'SolrQuery::getHighlightRegexSlop' => ['?float'], +'SolrQuery::getHighlightRequireFieldMatch' => ['?bool'], +'SolrQuery::getHighlightSimplePost' => ['?string', 'field_override='=>'string'], +'SolrQuery::getHighlightSimplePre' => ['?string', 'field_override='=>'string'], +'SolrQuery::getHighlightSnippets' => ['?int', 'field_override='=>'string'], +'SolrQuery::getHighlightUsePhraseHighlighter' => ['?bool'], +'SolrQuery::getMlt' => ['?bool'], +'SolrQuery::getMltBoost' => ['?bool'], +'SolrQuery::getMltCount' => ['?int'], +'SolrQuery::getMltFields' => ['?array'], +'SolrQuery::getMltMaxNumQueryTerms' => ['?int'], +'SolrQuery::getMltMaxNumTokens' => ['?int'], +'SolrQuery::getMltMaxWordLength' => ['?int'], +'SolrQuery::getMltMinDocFrequency' => ['?int'], +'SolrQuery::getMltMinTermFrequency' => ['?int'], +'SolrQuery::getMltMinWordLength' => ['?int'], +'SolrQuery::getMltQueryFields' => ['?array'], +'SolrQuery::getParam' => ['?mixed', 'param_name'=>'string'], +'SolrQuery::getParams' => ['?array'], +'SolrQuery::getPreparedParams' => ['?array'], +'SolrQuery::getQuery' => ['?string'], +'SolrQuery::getRows' => ['?int'], +'SolrQuery::getSortFields' => ['?array'], +'SolrQuery::getStart' => ['?int'], +'SolrQuery::getStats' => ['?bool'], +'SolrQuery::getStatsFacets' => ['?array'], +'SolrQuery::getStatsFields' => ['?array'], +'SolrQuery::getTerms' => ['?bool'], +'SolrQuery::getTermsField' => ['?string'], +'SolrQuery::getTermsIncludeLowerBound' => ['?bool'], +'SolrQuery::getTermsIncludeUpperBound' => ['?bool'], +'SolrQuery::getTermsLimit' => ['?int'], +'SolrQuery::getTermsLowerBound' => ['?string'], +'SolrQuery::getTermsMaxCount' => ['?int'], +'SolrQuery::getTermsMinCount' => ['?int'], +'SolrQuery::getTermsPrefix' => ['?string'], +'SolrQuery::getTermsReturnRaw' => ['?bool'], +'SolrQuery::getTermsSort' => ['?int'], +'SolrQuery::getTermsUpperBound' => ['?string'], +'SolrQuery::getTimeAllowed' => ['?int'], +'SolrQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], +'SolrQuery::removeExpandSortField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::removeFacetDateField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::removeFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], +'SolrQuery::removeFacetField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::removeFacetQuery' => ['SolrQuery', 'value'=>'string'], +'SolrQuery::removeField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::removeFilterQuery' => ['SolrQuery', 'fq'=>'string'], +'SolrQuery::removeHighlightField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::removeMltField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::removeMltQueryField' => ['SolrQuery', 'queryfield'=>'string'], +'SolrQuery::removeSortField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::removeStatsFacet' => ['SolrQuery', 'value'=>'string'], +'SolrQuery::removeStatsField' => ['SolrQuery', 'field'=>'string'], +'SolrQuery::serialize' => ['string'], +'SolrQuery::set' => ['SolrParams', 'name'=>'string', 'value'=>''], +'SolrQuery::setEchoHandler' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setEchoParams' => ['SolrQuery', 'type'=>'string'], +'SolrQuery::setExpand' => ['SolrQuery', 'value'=>'bool'], +'SolrQuery::setExpandQuery' => ['SolrQuery', 'q'=>'string'], +'SolrQuery::setExpandRows' => ['SolrQuery', 'value'=>'int'], +'SolrQuery::setExplainOther' => ['SolrQuery', 'query'=>'string'], +'SolrQuery::setFacet' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setFacetDateEnd' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], +'SolrQuery::setFacetDateGap' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], +'SolrQuery::setFacetDateHardEnd' => ['SolrQuery', 'value'=>'bool', 'field_override='=>'string'], +'SolrQuery::setFacetDateStart' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], +'SolrQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency'=>'int', 'field_override='=>'string'], +'SolrQuery::setFacetLimit' => ['SolrQuery', 'limit'=>'int', 'field_override='=>'string'], +'SolrQuery::setFacetMethod' => ['SolrQuery', 'method'=>'string', 'field_override='=>'string'], +'SolrQuery::setFacetMinCount' => ['SolrQuery', 'mincount'=>'int', 'field_override='=>'string'], +'SolrQuery::setFacetMissing' => ['SolrQuery', 'flag'=>'bool', 'field_override='=>'string'], +'SolrQuery::setFacetOffset' => ['SolrQuery', 'offset'=>'int', 'field_override='=>'string'], +'SolrQuery::setFacetPrefix' => ['SolrQuery', 'prefix'=>'string', 'field_override='=>'string'], +'SolrQuery::setFacetSort' => ['SolrQuery', 'facetsort'=>'int', 'field_override='=>'string'], +'SolrQuery::setGroup' => ['SolrQuery', 'value'=>'bool'], +'SolrQuery::setGroupCachePercent' => ['SolrQuery', 'percent'=>'int'], +'SolrQuery::setGroupFacet' => ['SolrQuery', 'value'=>'bool'], +'SolrQuery::setGroupFormat' => ['SolrQuery', 'value'=>'string'], +'SolrQuery::setGroupLimit' => ['SolrQuery', 'value'=>'int'], +'SolrQuery::setGroupMain' => ['SolrQuery', 'value'=>'string'], +'SolrQuery::setGroupNGroups' => ['SolrQuery', 'value'=>'bool'], +'SolrQuery::setGroupOffset' => ['SolrQuery', 'value'=>'int'], +'SolrQuery::setGroupTruncate' => ['SolrQuery', 'value'=>'bool'], +'SolrQuery::setHighlight' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setHighlightAlternateField' => ['SolrQuery', 'field'=>'string', 'field_override='=>'string'], +'SolrQuery::setHighlightFormatter' => ['SolrQuery', 'formatter'=>'string', 'field_override='=>'string'], +'SolrQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter'=>'string', 'field_override='=>'string'], +'SolrQuery::setHighlightFragsize' => ['SolrQuery', 'size'=>'int', 'field_override='=>'string'], +'SolrQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldlength'=>'int', 'field_override='=>'string'], +'SolrQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value'=>'int'], +'SolrQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag'=>'bool', 'field_override='=>'string'], +'SolrQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxanalyzedchars'=>'int'], +'SolrQuery::setHighlightRegexPattern' => ['SolrQuery', 'value'=>'string'], +'SolrQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor'=>'float'], +'SolrQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setHighlightSimplePost' => ['SolrQuery', 'simplepost'=>'string', 'field_override='=>'string'], +'SolrQuery::setHighlightSimplePre' => ['SolrQuery', 'simplepre'=>'string', 'field_override='=>'string'], +'SolrQuery::setHighlightSnippets' => ['SolrQuery', 'value'=>'int', 'field_override='=>'string'], +'SolrQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setMlt' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setMltBoost' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setMltCount' => ['SolrQuery', 'count'=>'int'], +'SolrQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value'=>'int'], +'SolrQuery::setMltMaxNumTokens' => ['SolrQuery', 'value'=>'int'], +'SolrQuery::setMltMaxWordLength' => ['SolrQuery', 'maxwordlength'=>'int'], +'SolrQuery::setMltMinDocFrequency' => ['SolrQuery', 'mindocfrequency'=>'int'], +'SolrQuery::setMltMinTermFrequency' => ['SolrQuery', 'mintermfrequency'=>'int'], +'SolrQuery::setMltMinWordLength' => ['SolrQuery', 'minwordlength'=>'int'], +'SolrQuery::setOmitHeader' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], +'SolrQuery::setQuery' => ['SolrQuery', 'query'=>'string'], +'SolrQuery::setRows' => ['SolrQuery', 'rows'=>'int'], +'SolrQuery::setShowDebugInfo' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setStart' => ['SolrQuery', 'start'=>'int'], +'SolrQuery::setStats' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setTerms' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setTermsField' => ['SolrQuery', 'fieldname'=>'string'], +'SolrQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setTermsLimit' => ['SolrQuery', 'limit'=>'int'], +'SolrQuery::setTermsLowerBound' => ['SolrQuery', 'lowerbound'=>'string'], +'SolrQuery::setTermsMaxCount' => ['SolrQuery', 'frequency'=>'int'], +'SolrQuery::setTermsMinCount' => ['SolrQuery', 'frequency'=>'int'], +'SolrQuery::setTermsPrefix' => ['SolrQuery', 'prefix'=>'string'], +'SolrQuery::setTermsReturnRaw' => ['SolrQuery', 'flag'=>'bool'], +'SolrQuery::setTermsSort' => ['SolrQuery', 'sorttype'=>'int'], +'SolrQuery::setTermsUpperBound' => ['SolrQuery', 'upperbound'=>'string'], +'SolrQuery::setTimeAllowed' => ['SolrQuery', 'timeallowed'=>'int'], +'SolrQuery::toString' => ['string', 'url_encode='=>'bool'], +'SolrQuery::unserialize' => ['void', 'serialized'=>'string'], +'SolrQueryResponse::__construct' => ['void'], +'SolrQueryResponse::__destruct' => ['void'], +'SolrQueryResponse::getDigestedResponse' => ['string'], +'SolrQueryResponse::getHttpStatus' => ['int'], +'SolrQueryResponse::getHttpStatusMessage' => ['string'], +'SolrQueryResponse::getRawRequest' => ['string'], +'SolrQueryResponse::getRawRequestHeaders' => ['string'], +'SolrQueryResponse::getRawResponse' => ['string'], +'SolrQueryResponse::getRawResponseHeaders' => ['string'], +'SolrQueryResponse::getRequestUrl' => ['string'], +'SolrQueryResponse::getResponse' => ['SolrObject'], +'SolrQueryResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], +'SolrQueryResponse::success' => ['bool'], +'SolrResponse::getDigestedResponse' => ['string'], +'SolrResponse::getHttpStatus' => ['int'], +'SolrResponse::getHttpStatusMessage' => ['string'], +'SolrResponse::getRawRequest' => ['string'], +'SolrResponse::getRawRequestHeaders' => ['string'], +'SolrResponse::getRawResponse' => ['string'], +'SolrResponse::getRawResponseHeaders' => ['string'], +'SolrResponse::getRequestUrl' => ['string'], +'SolrResponse::getResponse' => ['SolrObject'], +'SolrResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], +'SolrResponse::success' => ['bool'], +'SolrServerException::__clone' => ['void'], +'SolrServerException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'SolrServerException::__toString' => ['string'], +'SolrServerException::__wakeup' => ['void'], +'SolrServerException::getCode' => ['int'], +'SolrServerException::getFile' => ['string'], +'SolrServerException::getInternalInfo' => ['array'], +'SolrServerException::getLine' => ['int'], +'SolrServerException::getMessage' => ['string'], +'SolrServerException::getPrevious' => ['Exception|Throwable'], +'SolrServerException::getTrace' => ['list\',args?:array}>'], +'SolrServerException::getTraceAsString' => ['string'], +'SolrUpdateResponse::__construct' => ['void'], +'SolrUpdateResponse::__destruct' => ['void'], +'SolrUpdateResponse::getDigestedResponse' => ['string'], +'SolrUpdateResponse::getHttpStatus' => ['int'], +'SolrUpdateResponse::getHttpStatusMessage' => ['string'], +'SolrUpdateResponse::getRawRequest' => ['string'], +'SolrUpdateResponse::getRawRequestHeaders' => ['string'], +'SolrUpdateResponse::getRawResponse' => ['string'], +'SolrUpdateResponse::getRawResponseHeaders' => ['string'], +'SolrUpdateResponse::getRequestUrl' => ['string'], +'SolrUpdateResponse::getResponse' => ['SolrObject'], +'SolrUpdateResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], +'SolrUpdateResponse::success' => ['bool'], +'SolrUtils::digestXmlResponse' => ['SolrObject', 'xmlresponse'=>'string', 'parse_mode='=>'int'], +'SolrUtils::escapeQueryChars' => ['string|false', 'string'=>'string'], +'SolrUtils::getSolrVersion' => ['string'], +'SolrUtils::queryPhrase' => ['string', 'string'=>'string'], +'sort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], +'soundex' => ['string', 'string'=>'string'], +'SphinxClient::__construct' => ['void'], +'SphinxClient::addQuery' => ['int', 'query'=>'string', 'index='=>'string', 'comment='=>'string'], +'SphinxClient::buildExcerpts' => ['array', 'docs'=>'array', 'index'=>'string', 'words'=>'string', 'opts='=>'array'], +'SphinxClient::buildKeywords' => ['array', 'query'=>'string', 'index'=>'string', 'hits'=>'bool'], +'SphinxClient::close' => ['bool'], +'SphinxClient::escapeString' => ['string', 'string'=>'string'], +'SphinxClient::getLastError' => ['string'], +'SphinxClient::getLastWarning' => ['string'], +'SphinxClient::open' => ['bool'], +'SphinxClient::query' => ['array', 'query'=>'string', 'index='=>'string', 'comment='=>'string'], +'SphinxClient::resetFilters' => ['void'], +'SphinxClient::resetGroupBy' => ['void'], +'SphinxClient::runQueries' => ['array'], +'SphinxClient::setArrayResult' => ['bool', 'array_result'=>'bool'], +'SphinxClient::setConnectTimeout' => ['bool', 'timeout'=>'float'], +'SphinxClient::setFieldWeights' => ['bool', 'weights'=>'array'], +'SphinxClient::setFilter' => ['bool', 'attribute'=>'string', 'values'=>'array', 'exclude='=>'bool'], +'SphinxClient::setFilterFloatRange' => ['bool', 'attribute'=>'string', 'min'=>'float', 'max'=>'float', 'exclude='=>'bool'], +'SphinxClient::setFilterRange' => ['bool', 'attribute'=>'string', 'min'=>'int', 'max'=>'int', 'exclude='=>'bool'], +'SphinxClient::setGeoAnchor' => ['bool', 'attrlat'=>'string', 'attrlong'=>'string', 'latitude'=>'float', 'longitude'=>'float'], +'SphinxClient::setGroupBy' => ['bool', 'attribute'=>'string', 'func'=>'int', 'groupsort='=>'string'], +'SphinxClient::setGroupDistinct' => ['bool', 'attribute'=>'string'], +'SphinxClient::setIDRange' => ['bool', 'min'=>'int', 'max'=>'int'], +'SphinxClient::setIndexWeights' => ['bool', 'weights'=>'array'], +'SphinxClient::setLimits' => ['bool', 'offset'=>'int', 'limit'=>'int', 'max_matches='=>'int', 'cutoff='=>'int'], +'SphinxClient::setMatchMode' => ['bool', 'mode'=>'int'], +'SphinxClient::setMaxQueryTime' => ['bool', 'qtime'=>'int'], +'SphinxClient::setOverride' => ['bool', 'attribute'=>'string', 'type'=>'int', 'values'=>'array'], +'SphinxClient::setRankingMode' => ['bool', 'ranker'=>'int'], +'SphinxClient::setRetries' => ['bool', 'count'=>'int', 'delay='=>'int'], +'SphinxClient::setSelect' => ['bool', 'clause'=>'string'], +'SphinxClient::setServer' => ['bool', 'server'=>'string', 'port'=>'int'], +'SphinxClient::setSortMode' => ['bool', 'mode'=>'int', 'sortby='=>'string'], +'SphinxClient::status' => ['array'], +'SphinxClient::updateAttributes' => ['int', 'index'=>'string', 'attributes'=>'array', 'values'=>'array', 'mva='=>'bool'], +'spl_autoload' => ['void', 'class'=>'string', 'file_extensions='=>'string'], +'spl_autoload_call' => ['void', 'class'=>'string'], +'spl_autoload_extensions' => ['string', 'file_extensions='=>'string'], +'spl_autoload_functions' => ['false|list'], +'spl_autoload_register' => ['bool', 'callback='=>'callable(string):void', 'throw='=>'bool', 'prepend='=>'bool'], +'spl_autoload_unregister' => ['bool', 'callback'=>'callable(string):void'], +'spl_classes' => ['array'], +'spl_object_hash' => ['string', 'object'=>'object'], +'spl_object_id' => ['int', 'object'=>'object'], +'SplDoublyLinkedList::__construct' => ['void'], +'SplDoublyLinkedList::add' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], +'SplDoublyLinkedList::bottom' => ['mixed'], +'SplDoublyLinkedList::count' => ['int'], +'SplDoublyLinkedList::current' => ['mixed'], +'SplDoublyLinkedList::getIteratorMode' => ['int'], +'SplDoublyLinkedList::isEmpty' => ['bool'], +'SplDoublyLinkedList::key' => ['mixed'], +'SplDoublyLinkedList::next' => ['void'], +'SplDoublyLinkedList::offsetExists' => ['bool', 'index'=>'mixed'], +'SplDoublyLinkedList::offsetGet' => ['mixed', 'index'=>'mixed'], +'SplDoublyLinkedList::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'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::shift' => ['mixed'], +'SplDoublyLinkedList::top' => ['mixed'], +'SplDoublyLinkedList::unserialize' => ['void', 'serialized'=>'string'], +'SplDoublyLinkedList::unshift' => ['bool', 'value'=>'mixed'], +'SplDoublyLinkedList::valid' => ['bool'], +'SplEnum::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], +'SplEnum::getConstList' => ['array', 'include_default='=>'bool'], +'SplFileInfo::__construct' => ['void', 'file_name'=>'string'], +'SplFileInfo::__toString' => ['string'], +'SplFileInfo::__wakeup' => ['void'], +'SplFileInfo::getATime' => ['int'], +'SplFileInfo::getBasename' => ['string', 'suffix='=>'string'], +'SplFileInfo::getCTime' => ['int'], +'SplFileInfo::getExtension' => ['string'], +'SplFileInfo::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], +'SplFileInfo::getFilename' => ['string'], +'SplFileInfo::getGroup' => ['int'], +'SplFileInfo::getInode' => ['int'], +'SplFileInfo::getLinkTarget' => ['string'], +'SplFileInfo::getMTime' => ['int'], +'SplFileInfo::getOwner' => ['int'], +'SplFileInfo::getPath' => ['string'], +'SplFileInfo::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], +'SplFileInfo::getPathname' => ['string'], +'SplFileInfo::getPerms' => ['int'], +'SplFileInfo::getRealPath' => ['string|false'], +'SplFileInfo::getSize' => ['int'], +'SplFileInfo::getType' => ['string'], +'SplFileInfo::isDir' => ['bool'], +'SplFileInfo::isExecutable' => ['bool'], +'SplFileInfo::isFile' => ['bool'], +'SplFileInfo::isLink' => ['bool'], +'SplFileInfo::isReadable' => ['bool'], +'SplFileInfo::isWritable' => ['bool'], +'SplFileInfo::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], +'SplFileInfo::setFileClass' => ['void', 'class_name='=>'string'], +'SplFileInfo::setInfoClass' => ['void', 'class_name='=>'string'], +'SplFileObject::__construct' => ['void', 'filename'=>'string', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>''], +'SplFileObject::__toString' => ['string'], +'SplFileObject::current' => ['string|array|false'], +'SplFileObject::eof' => ['bool'], +'SplFileObject::fflush' => ['bool'], +'SplFileObject::fgetc' => ['string|false'], +'SplFileObject::fgetcsv' => ['list|array{0: null}|false|null', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], +'SplFileObject::fgets' => ['string|false'], +'SplFileObject::flock' => ['bool', 'operation'=>'int', '&w_wouldblock='=>'int'], +'SplFileObject::fpassthru' => ['int|false'], +'SplFileObject::fputcsv' => ['int|false', 'fields'=>'array', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], +'SplFileObject::fread' => ['string|false', 'length'=>'int'], +'SplFileObject::fscanf' => ['array|int', 'format'=>'string', '&...w_vars='=>'string|int|float'], +'SplFileObject::fseek' => ['int', 'pos'=>'int', 'whence='=>'int'], +'SplFileObject::fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}'], +'SplFileObject::ftell' => ['int|false'], +'SplFileObject::ftruncate' => ['bool', 'size'=>'int'], +'SplFileObject::fwrite' => ['int', 'string'=>'string', 'length='=>'int'], +'SplFileObject::getATime' => ['int'], +'SplFileObject::getBasename' => ['string', 'suffix='=>'string'], +'SplFileObject::getChildren' => ['null'], +'SplFileObject::getCsvControl' => ['array'], +'SplFileObject::getCTime' => ['int'], +'SplFileObject::getCurrentLine' => ['string|false'], +'SplFileObject::getExtension' => ['string'], +'SplFileObject::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], +'SplFileObject::getFilename' => ['string'], +'SplFileObject::getFlags' => ['int'], +'SplFileObject::getGroup' => ['int'], +'SplFileObject::getInode' => ['int'], +'SplFileObject::getLinkTarget' => ['string'], +'SplFileObject::getMaxLineLen' => ['int'], +'SplFileObject::getMTime' => ['int'], +'SplFileObject::getOwner' => ['int'], +'SplFileObject::getPath' => ['string'], +'SplFileObject::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], +'SplFileObject::getPathname' => ['string'], +'SplFileObject::getPerms' => ['int'], +'SplFileObject::getRealPath' => ['false|string'], +'SplFileObject::getSize' => ['int'], +'SplFileObject::getType' => ['string'], +'SplFileObject::hasChildren' => ['false'], +'SplFileObject::isDir' => ['bool'], +'SplFileObject::isExecutable' => ['bool'], +'SplFileObject::isFile' => ['bool'], +'SplFileObject::isLink' => ['bool'], +'SplFileObject::isReadable' => ['bool'], +'SplFileObject::isWritable' => ['bool'], +'SplFileObject::key' => ['int'], +'SplFileObject::next' => ['void'], +'SplFileObject::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], +'SplFileObject::rewind' => ['void'], +'SplFileObject::seek' => ['void', 'line_pos'=>'int'], +'SplFileObject::setCsvControl' => ['void', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], +'SplFileObject::setFileClass' => ['void', 'class_name='=>'string'], +'SplFileObject::setFlags' => ['void', 'flags'=>'int'], +'SplFileObject::setInfoClass' => ['void', 'class_name='=>'string'], +'SplFileObject::setMaxLineLen' => ['void', 'max_len'=>'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::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::offsetUnset' => ['void', 'index'=>'int'], +'SplFixedArray::rewind' => ['void'], +'SplFixedArray::setSize' => ['bool', 'size'=>'int'], +'SplFixedArray::toArray' => ['array'], +'SplFixedArray::valid' => ['bool'], +'SplHeap::__construct' => ['void'], +'SplHeap::compare' => ['int', 'value1'=>'mixed', 'value2'=>'mixed'], +'SplHeap::count' => ['int'], +'SplHeap::current' => ['mixed'], +'SplHeap::extract' => ['mixed'], +'SplHeap::insert' => ['bool', 'value'=>'mixed'], +'SplHeap::isCorrupted' => ['bool'], +'SplHeap::isEmpty' => ['bool'], +'SplHeap::key' => ['int'], +'SplHeap::next' => ['void'], +'SplHeap::recoverFromCorruption' => ['int'], +'SplHeap::rewind' => ['void'], +'SplHeap::top' => ['mixed'], +'SplHeap::valid' => ['bool'], +'SplMaxHeap::__construct' => ['void'], +'SplMaxHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], +'SplMinHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], +'SplMinHeap::count' => ['int'], +'SplMinHeap::current' => ['mixed'], +'SplMinHeap::extract' => ['mixed'], +'SplMinHeap::insert' => ['void', 'value'=>'mixed'], +'SplMinHeap::isCorrupted' => ['int'], +'SplMinHeap::isEmpty' => ['bool'], +'SplMinHeap::key' => ['mixed'], +'SplMinHeap::next' => ['void'], +'SplMinHeap::recoverFromCorruption' => ['void'], +'SplMinHeap::rewind' => ['void'], +'SplMinHeap::top' => ['mixed'], +'SplMinHeap::valid' => ['bool'], +'SplObjectStorage::__construct' => ['void'], +'SplObjectStorage::addAll' => ['void', 'os'=>'splobjectstorage'], +'SplObjectStorage::attach' => ['void', 'object'=>'object', 'inf='=>'mixed'], +'SplObjectStorage::contains' => ['bool', 'object'=>'object'], +'SplObjectStorage::count' => ['int'], +'SplObjectStorage::current' => ['object'], +'SplObjectStorage::detach' => ['void', 'object'=>'object'], +'SplObjectStorage::getHash' => ['string', 'object'=>'object'], +'SplObjectStorage::getInfo' => ['mixed'], +'SplObjectStorage::key' => ['int'], +'SplObjectStorage::next' => ['void'], +'SplObjectStorage::offsetExists' => ['bool', 'object'=>'object'], +'SplObjectStorage::offsetGet' => ['mixed', 'object'=>'object'], +'SplObjectStorage::offsetSet' => ['object', 'object'=>'object', 'data='=>'mixed'], +'SplObjectStorage::offsetUnset' => ['object', 'object'=>'object'], +'SplObjectStorage::removeAll' => ['void', 'os'=>'splobjectstorage'], +'SplObjectStorage::removeAllExcept' => ['void', 'os'=>'splobjectstorage'], +'SplObjectStorage::rewind' => ['void'], +'SplObjectStorage::serialize' => ['string'], +'SplObjectStorage::setInfo' => ['void', 'inf'=>'mixed'], +'SplObjectStorage::unserialize' => ['void', 'serialized'=>'string'], +'SplObjectStorage::valid' => ['bool'], +'SplObserver::update' => ['void', 'subject'=>'SplSubject'], +'SplPriorityQueue::__construct' => ['void'], +'SplPriorityQueue::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], +'SplPriorityQueue::count' => ['int'], +'SplPriorityQueue::current' => ['mixed'], +'SplPriorityQueue::extract' => ['mixed'], +'SplPriorityQueue::getExtractFlags' => ['int'], +'SplPriorityQueue::insert' => ['bool', 'value'=>'mixed', 'priority'=>'mixed'], +'SplPriorityQueue::isCorrupted' => ['bool'], +'SplPriorityQueue::isEmpty' => ['bool'], +'SplPriorityQueue::key' => ['mixed'], +'SplPriorityQueue::next' => ['void'], +'SplPriorityQueue::recoverFromCorruption' => ['void'], +'SplPriorityQueue::rewind' => ['void'], +'SplPriorityQueue::setExtractFlags' => ['void', 'flags'=>'int'], +'SplPriorityQueue::top' => ['mixed'], +'SplPriorityQueue::valid' => ['bool'], +'SplQueue::dequeue' => ['mixed'], +'SplQueue::enqueue' => ['void', 'value'=>'mixed'], +'SplQueue::getIteratorMode' => ['int'], +'SplQueue::isEmpty' => ['bool'], +'SplQueue::key' => ['mixed'], +'SplQueue::next' => ['void'], +'SplQueue::offsetExists' => ['bool', 'index'=>'mixed'], +'SplQueue::offsetGet' => ['mixed', 'index'=>'mixed'], +'SplQueue::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], +'SplQueue::offsetUnset' => ['void', 'index'=>'mixed'], +'SplQueue::pop' => ['mixed'], +'SplQueue::prev' => ['void'], +'SplQueue::push' => ['void', 'value'=>'mixed'], +'SplQueue::rewind' => ['void'], +'SplQueue::serialize' => ['string'], +'SplQueue::setIteratorMode' => ['void', 'mode'=>'int'], +'SplQueue::shift' => ['mixed'], +'SplQueue::top' => ['mixed'], +'SplQueue::unserialize' => ['void', 'serialized'=>'string'], +'SplQueue::unshift' => ['bool', 'value'=>'mixed'], +'SplQueue::valid' => ['bool'], +'SplStack::__construct' => ['void'], +'SplStack::add' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], +'SplStack::bottom' => ['mixed'], +'SplStack::count' => ['int'], +'SplStack::current' => ['mixed'], +'SplStack::getIteratorMode' => ['int'], +'SplStack::isEmpty' => ['bool'], +'SplStack::key' => ['mixed'], +'SplStack::next' => ['void'], +'SplStack::offsetExists' => ['bool', 'index'=>'mixed'], +'SplStack::offsetGet' => ['mixed', 'index'=>'mixed'], +'SplStack::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], +'SplStack::offsetUnset' => ['void', 'index'=>'mixed'], +'SplStack::pop' => ['mixed'], +'SplStack::prev' => ['void'], +'SplStack::push' => ['void', 'value'=>'mixed'], +'SplStack::rewind' => ['void'], +'SplStack::serialize' => ['string'], +'SplStack::setIteratorMode' => ['void', 'mode'=>'int'], +'SplStack::shift' => ['mixed'], +'SplStack::top' => ['mixed'], +'SplStack::unserialize' => ['void', 'serialized'=>'string'], +'SplStack::unshift' => ['bool', 'value'=>'mixed'], +'SplStack::valid' => ['bool'], +'SplSubject::attach' => ['void', 'observer'=>'SplObserver'], +'SplSubject::detach' => ['void', 'observer'=>'SplObserver'], +'SplSubject::notify' => ['void'], +'SplTempFileObject::__construct' => ['void', 'max_memory='=>'int'], +'SplTempFileObject::__toString' => ['string'], +'SplTempFileObject::_bad_state_ex' => [''], +'SplTempFileObject::current' => ['array|false|string'], +'SplTempFileObject::eof' => ['bool'], +'SplTempFileObject::fflush' => ['bool'], +'SplTempFileObject::fgetc' => ['false|string'], +'SplTempFileObject::fgetcsv' => ['list|array{0: null}|false|null', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], +'SplTempFileObject::fgets' => ['string'], +'SplTempFileObject::fgetss' => ['string', 'allowable_tags='=>'string'], +'SplTempFileObject::flock' => ['bool', 'operation'=>'int', '&wouldblock='=>'int'], +'SplTempFileObject::fpassthru' => ['int|false'], +'SplTempFileObject::fputcsv' => ['false|int', 'fields'=>'array', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], +'SplTempFileObject::fread' => ['false|string', 'length'=>'int'], +'SplTempFileObject::fscanf' => ['bool', 'format'=>'string', '&...w_vars='=>'array|array|array'], +'SplTempFileObject::fseek' => ['int', 'pos'=>'int', 'whence='=>'int'], +'SplTempFileObject::fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}'], +'SplTempFileObject::ftell' => ['int'], +'SplTempFileObject::ftruncate' => ['bool', 'size'=>'int'], +'SplTempFileObject::fwrite' => ['int', 'string'=>'string', 'length='=>'int'], +'SplTempFileObject::getATime' => ['int'], +'SplTempFileObject::getBasename' => ['string', 'suffix='=>'string'], +'SplTempFileObject::getChildren' => ['null'], +'SplTempFileObject::getCsvControl' => ['array'], +'SplTempFileObject::getCTime' => ['int'], +'SplTempFileObject::getCurrentLine' => ['string'], +'SplTempFileObject::getExtension' => ['string'], +'SplTempFileObject::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], +'SplTempFileObject::getFilename' => ['string'], +'SplTempFileObject::getFlags' => ['int'], +'SplTempFileObject::getGroup' => ['int'], +'SplTempFileObject::getInode' => ['int'], +'SplTempFileObject::getLinkTarget' => ['string'], +'SplTempFileObject::getMaxLineLen' => ['int'], +'SplTempFileObject::getMTime' => ['int'], +'SplTempFileObject::getOwner' => ['int'], +'SplTempFileObject::getPath' => ['string'], +'SplTempFileObject::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], +'SplTempFileObject::getPathname' => ['string'], +'SplTempFileObject::getPerms' => ['int'], +'SplTempFileObject::getRealPath' => ['string'], +'SplTempFileObject::getSize' => ['int'], +'SplTempFileObject::getType' => ['string'], +'SplTempFileObject::hasChildren' => ['bool'], +'SplTempFileObject::isDir' => ['bool'], +'SplTempFileObject::isExecutable' => ['bool'], +'SplTempFileObject::isFile' => ['bool'], +'SplTempFileObject::isLink' => ['bool'], +'SplTempFileObject::isReadable' => ['bool'], +'SplTempFileObject::isWritable' => ['bool'], +'SplTempFileObject::key' => ['int'], +'SplTempFileObject::next' => ['void'], +'SplTempFileObject::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], +'SplTempFileObject::rewind' => ['void'], +'SplTempFileObject::seek' => ['void', 'line_pos'=>'int'], +'SplTempFileObject::setCsvControl' => ['void', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], +'SplTempFileObject::setFileClass' => ['void', 'class_name='=>'string'], +'SplTempFileObject::setFlags' => ['void', 'flags'=>'int'], +'SplTempFileObject::setInfoClass' => ['void', 'class_name='=>'string'], +'SplTempFileObject::setMaxLineLen' => ['void', 'max_len'=>'int'], +'SplTempFileObject::valid' => ['bool'], +'SplType::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], +'Spoofchecker::__construct' => ['void'], +'Spoofchecker::areConfusable' => ['bool', 's1'=>'string', 's2'=>'string', '&w_error='=>'string'], +'Spoofchecker::isSuspicious' => ['bool', 'text'=>'string', '&w_error='=>'string'], +'Spoofchecker::setAllowedLocales' => ['void', 'locale_list'=>'string'], +'Spoofchecker::setChecks' => ['void', 'checks'=>'long'], +'Spoofchecker::setRestrictionLevel' => ['void', 'restriction_level'=>'int'], +'sprintf' => ['string', 'format'=>'string', '...values='=>'string|int|float'], +'SQLite3::__construct' => ['void', 'filename'=>'string', 'flags='=>'int', 'encryptionKey='=>'?string'], +'SQLite3::busyTimeout' => ['bool', 'milliseconds'=>'int'], +'SQLite3::changes' => ['int'], +'SQLite3::close' => ['bool'], +'SQLite3::createAggregate' => ['bool', 'name'=>'string', 'stepCallback'=>'callable', 'finalCallback'=>'callable', 'argCount='=>'int'], +'SQLite3::createCollation' => ['bool', 'name'=>'string', 'callback'=>'callable'], +'SQLite3::createFunction' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argCount='=>'int', 'flags='=>'int'], +'SQLite3::enableExceptions' => ['bool', 'enable='=>'bool'], +'SQLite3::escapeString' => ['string', 'string'=>'string'], +'SQLite3::exec' => ['bool', 'query'=>'string'], +'SQLite3::lastErrorCode' => ['int'], +'SQLite3::lastErrorMsg' => ['string'], +'SQLite3::lastInsertRowID' => ['int'], +'SQLite3::loadExtension' => ['bool', 'name'=>'string'], +'SQLite3::open' => ['void', 'filename'=>'string', 'flags='=>'int', 'encryptionKey='=>'?string'], +'SQLite3::openBlob' => ['resource|false', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'database='=>'string', 'flags='=>'int'], +'SQLite3::prepare' => ['SQLite3Stmt|false', 'query'=>'string'], +'SQLite3::query' => ['SQLite3Result|false', 'query'=>'string'], +'SQLite3::querySingle' => ['array|int|string|bool|float|null|false', 'query'=>'string', 'entireRow='=>'bool'], +'SQLite3::version' => ['array'], +'SQLite3Result::__construct' => ['void'], +'SQLite3Result::columnName' => ['string', 'column'=>'int'], +'SQLite3Result::columnType' => ['int', 'column'=>'int'], +'SQLite3Result::fetchArray' => ['array|false', 'mode='=>'int'], +'SQLite3Result::finalize' => ['bool'], +'SQLite3Result::numColumns' => ['int'], +'SQLite3Result::reset' => ['bool'], +'SQLite3Stmt::__construct' => ['void', 'sqlite3'=>'sqlite3', 'query'=>'string'], +'SQLite3Stmt::bindParam' => ['bool', 'param'=>'string|int', '&rw_var'=>'mixed', 'type='=>'int'], +'SQLite3Stmt::bindValue' => ['bool', 'param'=>'string|int', 'value'=>'mixed', 'type='=>'int'], +'SQLite3Stmt::clear' => ['bool'], +'SQLite3Stmt::close' => ['bool'], +'SQLite3Stmt::execute' => ['false|SQLite3Result'], +'SQLite3Stmt::getSQL' => ['string', 'expand='=>'bool'], +'SQLite3Stmt::paramCount' => ['int'], +'SQLite3Stmt::readOnly' => ['bool'], +'SQLite3Stmt::reset' => ['bool'], +'sqlite_array_query' => ['array|false', 'dbhandle'=>'resource', 'query'=>'string', 'result_type='=>'int', 'decode_binary='=>'bool'], +'sqlite_busy_timeout' => ['void', 'dbhandle'=>'resource', 'milliseconds'=>'int'], +'sqlite_changes' => ['int', 'dbhandle'=>'resource'], +'sqlite_close' => ['void', 'dbhandle'=>'resource'], +'sqlite_column' => ['mixed', 'result'=>'resource', 'index_or_name'=>'mixed', 'decode_binary='=>'bool'], +'sqlite_create_aggregate' => ['void', 'dbhandle'=>'resource', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], +'sqlite_create_function' => ['void', 'dbhandle'=>'resource', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], +'sqlite_current' => ['array|false', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], +'sqlite_error_string' => ['string', 'error_code'=>'int'], +'sqlite_escape_string' => ['string', 'item'=>'string'], +'sqlite_exec' => ['bool', 'dbhandle'=>'resource', 'query'=>'string', 'error_msg='=>'string'], +'sqlite_factory' => ['SQLiteDatabase', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], +'sqlite_fetch_all' => ['array', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], +'sqlite_fetch_array' => ['array|false', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], +'sqlite_fetch_column_types' => ['array|false', 'table_name'=>'string', 'dbhandle'=>'resource', 'result_type='=>'int'], +'sqlite_fetch_object' => ['object', 'result'=>'resource', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], +'sqlite_fetch_single' => ['string', 'result'=>'resource', 'decode_binary='=>'bool'], +'sqlite_fetch_string' => ['string', 'result'=>'resource', 'decode_binary'=>'bool'], +'sqlite_field_name' => ['string', 'result'=>'resource', 'field_index'=>'int'], +'sqlite_has_more' => ['bool', 'result'=>'resource'], +'sqlite_has_prev' => ['bool', 'result'=>'resource'], +'sqlite_key' => ['int', 'result'=>'resource'], +'sqlite_last_error' => ['int', 'dbhandle'=>'resource'], +'sqlite_last_insert_rowid' => ['int', 'dbhandle'=>'resource'], +'sqlite_libencoding' => ['string'], +'sqlite_libversion' => ['string'], +'sqlite_next' => ['bool', 'result'=>'resource'], +'sqlite_num_fields' => ['int', 'result'=>'resource'], +'sqlite_num_rows' => ['int', 'result'=>'resource'], +'sqlite_open' => ['resource|false', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], +'sqlite_popen' => ['resource|false', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], +'sqlite_prev' => ['bool', 'result'=>'resource'], +'sqlite_query' => ['resource|false', 'dbhandle'=>'resource', 'query'=>'resource|string', 'result_type='=>'int', 'error_msg='=>'string'], +'sqlite_rewind' => ['bool', 'result'=>'resource'], +'sqlite_seek' => ['bool', 'result'=>'resource', 'rownum'=>'int'], +'sqlite_single_query' => ['array', 'db'=>'resource', 'query'=>'string', 'first_row_only='=>'bool', 'decode_binary='=>'bool'], +'sqlite_udf_decode_binary' => ['string', 'data'=>'string'], +'sqlite_udf_encode_binary' => ['string', 'data'=>'string'], +'sqlite_unbuffered_query' => ['SQLiteUnbuffered|false', 'dbhandle'=>'resource', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], +'sqlite_valid' => ['bool', 'result'=>'resource'], +'SQLiteDatabase::__construct' => ['void', 'filename'=>'', 'mode='=>'int|mixed', '&error_message'=>''], +'SQLiteDatabase::arrayQuery' => ['array', 'query'=>'string', 'result_type='=>'int', 'decode_binary='=>'bool'], +'SQLiteDatabase::busyTimeout' => ['int', 'milliseconds'=>'int'], +'SQLiteDatabase::changes' => ['int'], +'SQLiteDatabase::createAggregate' => ['', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], +'SQLiteDatabase::createFunction' => ['', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], +'SQLiteDatabase::exec' => ['bool', 'query'=>'string', 'error_msg='=>'string'], +'SQLiteDatabase::fetchColumnTypes' => ['array', 'table_name'=>'string', 'result_type='=>'int'], +'SQLiteDatabase::lastError' => ['int'], +'SQLiteDatabase::lastInsertRowid' => ['int'], +'SQLiteDatabase::query' => ['SQLiteResult|false', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], +'SQLiteDatabase::queryExec' => ['bool', 'query'=>'string', '&w_error_msg='=>'string'], +'SQLiteDatabase::singleQuery' => ['array', 'query'=>'string', 'first_row_only='=>'bool', 'decode_binary='=>'bool'], +'SQLiteDatabase::unbufferedQuery' => ['SQLiteUnbuffered|false', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], +'SQLiteException::__clone' => ['void'], +'SQLiteException::__construct' => ['void', 'message'=>'', 'code'=>'', 'previous'=>''], +'SQLiteException::__toString' => ['string'], +'SQLiteException::__wakeup' => ['void'], +'SQLiteException::getCode' => ['int'], +'SQLiteException::getFile' => ['string'], +'SQLiteException::getLine' => ['int'], +'SQLiteException::getMessage' => ['string'], +'SQLiteException::getPrevious' => ['RuntimeException|Throwable|null'], +'SQLiteException::getTrace' => ['list\',args?:array}>'], +'SQLiteException::getTraceAsString' => ['string'], +'SQLiteResult::__construct' => ['void'], +'SQLiteResult::column' => ['mixed', 'index_or_name'=>'', 'decode_binary='=>'bool'], +'SQLiteResult::count' => ['int'], +'SQLiteResult::current' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], +'SQLiteResult::fetch' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], +'SQLiteResult::fetchAll' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], +'SQLiteResult::fetchObject' => ['object', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], +'SQLiteResult::fetchSingle' => ['string', 'decode_binary='=>'bool'], +'SQLiteResult::fieldName' => ['string', 'field_index'=>'int'], +'SQLiteResult::hasPrev' => ['bool'], +'SQLiteResult::key' => ['mixed|null'], +'SQLiteResult::next' => ['bool'], +'SQLiteResult::numFields' => ['int'], +'SQLiteResult::numRows' => ['int'], +'SQLiteResult::prev' => ['bool'], +'SQLiteResult::rewind' => ['bool'], +'SQLiteResult::seek' => ['bool', 'rownum'=>'int'], +'SQLiteResult::valid' => ['bool'], +'SQLiteUnbuffered::column' => ['void', 'index_or_name'=>'', 'decode_binary='=>'bool'], +'SQLiteUnbuffered::current' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], +'SQLiteUnbuffered::fetch' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], +'SQLiteUnbuffered::fetchAll' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], +'SQLiteUnbuffered::fetchObject' => ['object', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], +'SQLiteUnbuffered::fetchSingle' => ['string', 'decode_binary='=>'bool'], +'SQLiteUnbuffered::fieldName' => ['string', 'field_index'=>'int'], +'SQLiteUnbuffered::next' => ['bool'], +'SQLiteUnbuffered::numFields' => ['int'], +'SQLiteUnbuffered::valid' => ['bool'], +'sqlsrv_begin_transaction' => ['bool', 'conn'=>'resource'], +'sqlsrv_cancel' => ['bool', 'stmt'=>'resource'], +'sqlsrv_client_info' => ['array|false', 'conn'=>'resource'], +'sqlsrv_close' => ['bool', 'conn'=>'?resource'], +'sqlsrv_commit' => ['bool', 'conn'=>'resource'], +'sqlsrv_configure' => ['bool', 'setting'=>'string', 'value'=>'mixed'], +'sqlsrv_connect' => ['resource|false', 'serverName'=>'string', 'connectionInfo='=>'array'], +'sqlsrv_errors' => ['?array', 'errorsOrWarnings='=>'int'], +'sqlsrv_execute' => ['bool', 'stmt'=>'resource'], +'sqlsrv_fetch' => ['?bool', 'stmt'=>'resource', 'row='=>'int', 'offset='=>'int'], +'sqlsrv_fetch_array' => ['array|null|false', 'stmt'=>'resource', 'fetchType='=>'int', 'row='=>'int', 'offset='=>'int'], +'sqlsrv_fetch_object' => ['object|null|false', 'stmt'=>'resource', 'className='=>'string', 'ctorParams='=>'array', 'row='=>'int', 'offset='=>'int'], +'sqlsrv_field_metadata' => ['array|false', 'stmt'=>'resource'], +'sqlsrv_free_stmt' => ['bool', 'stmt'=>'resource'], +'sqlsrv_get_config' => ['mixed', 'setting'=>'string'], +'sqlsrv_get_field' => ['mixed', 'stmt'=>'resource', 'fieldIndex'=>'int', 'getAsType='=>'int'], +'sqlsrv_has_rows' => ['bool', 'stmt'=>'resource'], +'sqlsrv_next_result' => ['?bool', 'stmt'=>'resource'], +'sqlsrv_num_fields' => ['int|false', 'stmt'=>'resource'], +'sqlsrv_num_rows' => ['int|false', 'stmt'=>'resource'], +'sqlsrv_prepare' => ['resource|false', 'conn'=>'resource', 'sql'=>'string', 'params='=>'array', 'options='=>'array'], +'sqlsrv_query' => ['resource|false', 'conn'=>'resource', 'sql'=>'string', 'params='=>'array', 'options='=>'array'], +'sqlsrv_rollback' => ['bool', 'conn'=>'resource'], +'sqlsrv_rows_affected' => ['int|false', 'stmt'=>'resource'], +'sqlsrv_send_stream_data' => ['bool', 'stmt'=>'resource'], +'sqlsrv_server_info' => ['array', 'conn'=>'resource'], +'sqrt' => ['float', 'num'=>'float'], +'srand' => ['void', 'seed='=>'int', 'mode='=>'int'], +'sscanf' => ['list|int|null', 'string'=>'string', 'format'=>'string', '&...w_vars='=>'string|int|float|null'], +'ssdeep_fuzzy_compare' => ['int', 'signature1'=>'string', 'signature2'=>'string'], +'ssdeep_fuzzy_hash' => ['string', 'to_hash'=>'string'], +'ssdeep_fuzzy_hash_filename' => ['string', 'file_name'=>'string'], +'ssh2_auth_agent' => ['bool', 'session'=>'resource', 'username'=>'string'], +'ssh2_auth_hostbased_file' => ['bool', 'session'=>'resource', 'username'=>'string', 'hostname'=>'string', 'pubkeyfile'=>'string', 'privkeyfile'=>'string', 'passphrase='=>'string', 'local_username='=>'string'], +'ssh2_auth_none' => ['bool|string[]', 'session'=>'resource', 'username'=>'string'], +'ssh2_auth_password' => ['bool', 'session'=>'resource', 'username'=>'string', 'password'=>'string'], +'ssh2_auth_pubkey_file' => ['bool', 'session'=>'resource', 'username'=>'string', 'pubkeyfile'=>'string', 'privkeyfile'=>'string', 'passphrase='=>'string'], +'ssh2_connect' => ['resource|false', 'host'=>'string', 'port='=>'int', 'methods='=>'array', 'callbacks='=>'array'], +'ssh2_disconnect' => ['bool', 'session'=>'resource'], +'ssh2_exec' => ['resource|false', 'session'=>'resource', 'command'=>'string', 'pty='=>'string', 'env='=>'array', 'width='=>'int', 'height='=>'int', 'width_height_type='=>'int'], +'ssh2_fetch_stream' => ['resource|false', 'channel'=>'resource', 'streamid'=>'int'], +'ssh2_fingerprint' => ['string|false', 'session'=>'resource', 'flags='=>'int'], +'ssh2_forward_accept' => ['resource|false', 'session'=>'resource'], +'ssh2_forward_listen' => ['resource|false', 'session'=>'resource', 'port'=>'int', 'host='=>'string', 'max_connections='=>'string'], +'ssh2_methods_negotiated' => ['array|false', 'session'=>'resource'], +'ssh2_poll' => ['int', '&polldes'=>'array', 'timeout='=>'int'], +'ssh2_publickey_add' => ['bool', 'pkey'=>'resource', 'algoname'=>'string', 'blob'=>'string', 'overwrite='=>'bool', 'attributes='=>'array'], +'ssh2_publickey_init' => ['resource|false', 'session'=>'resource'], +'ssh2_publickey_list' => ['array|false', 'pkey'=>'resource'], +'ssh2_publickey_remove' => ['bool', 'pkey'=>'resource', 'algoname'=>'string', 'blob'=>'string'], +'ssh2_scp_recv' => ['bool', 'session'=>'resource', 'remote_file'=>'string', 'local_file'=>'string'], +'ssh2_scp_send' => ['bool', 'session'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'create_mode='=>'int'], +'ssh2_sftp' => ['resource|false', 'session'=>'resource'], +'ssh2_sftp_chmod' => ['bool', 'sftp'=>'resource', 'filename'=>'string', 'mode'=>'int'], +'ssh2_sftp_lstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'sftp'=>'resource', 'path'=>'string'], +'ssh2_sftp_mkdir' => ['bool', 'sftp'=>'resource', 'dirname'=>'string', 'mode='=>'int', 'recursive='=>'bool'], +'ssh2_sftp_readlink' => ['string|false', 'sftp'=>'resource', 'link'=>'string'], +'ssh2_sftp_realpath' => ['string|false', 'sftp'=>'resource', 'filename'=>'string'], +'ssh2_sftp_rename' => ['bool', 'sftp'=>'resource', 'from'=>'string', 'to'=>'string'], +'ssh2_sftp_rmdir' => ['bool', 'sftp'=>'resource', 'dirname'=>'string'], +'ssh2_sftp_stat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'sftp'=>'resource', 'path'=>'string'], +'ssh2_sftp_symlink' => ['bool', 'sftp'=>'resource', 'target'=>'string', 'link'=>'string'], +'ssh2_sftp_unlink' => ['bool', 'sftp'=>'resource', 'filename'=>'string'], +'ssh2_shell' => ['resource|false', 'session'=>'resource', 'term_type='=>'string', 'env='=>'array', 'width='=>'int', 'height='=>'int', 'width_height_type='=>'int'], +'ssh2_tunnel' => ['resource|false', 'session'=>'resource', 'host'=>'string', 'port'=>'int'], +'stat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'filename'=>'string'], +'stats_absolute_deviation' => ['float', 'a'=>'array'], +'stats_cdf_beta' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_binomial' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_cauchy' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_chisquare' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], +'stats_cdf_exponential' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], +'stats_cdf_f' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_gamma' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_laplace' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_logistic' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_negative_binomial' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_noncentral_chisquare' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_noncentral_f' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'par4'=>'float', 'which'=>'int'], +'stats_cdf_noncentral_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_normal' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_poisson' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], +'stats_cdf_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], +'stats_cdf_uniform' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_cdf_weibull' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_covariance' => ['float', 'a'=>'array', 'b'=>'array'], +'stats_den_uniform' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], +'stats_dens_beta' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], +'stats_dens_cauchy' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], +'stats_dens_chisquare' => ['float', 'x'=>'float', 'dfr'=>'float'], +'stats_dens_exponential' => ['float', 'x'=>'float', 'scale'=>'float'], +'stats_dens_f' => ['float', 'x'=>'float', 'dfr1'=>'float', 'dfr2'=>'float'], +'stats_dens_gamma' => ['float', 'x'=>'float', 'shape'=>'float', 'scale'=>'float'], +'stats_dens_laplace' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], +'stats_dens_logistic' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], +'stats_dens_negative_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], +'stats_dens_normal' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], +'stats_dens_pmf_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], +'stats_dens_pmf_hypergeometric' => ['float', 'n1'=>'float', 'n2'=>'float', 'N1'=>'float', 'N2'=>'float'], +'stats_dens_pmf_negative_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], +'stats_dens_pmf_poisson' => ['float', 'x'=>'float', 'lb'=>'float'], +'stats_dens_t' => ['float', 'x'=>'float', 'dfr'=>'float'], +'stats_dens_uniform' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], +'stats_dens_weibull' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], +'stats_harmonic_mean' => ['float', 'a'=>'array'], +'stats_kurtosis' => ['float', 'a'=>'array'], +'stats_rand_gen_beta' => ['float', 'a'=>'float', 'b'=>'float'], +'stats_rand_gen_chisquare' => ['float', 'df'=>'float'], +'stats_rand_gen_exponential' => ['float', 'av'=>'float'], +'stats_rand_gen_f' => ['float', 'dfn'=>'float', 'dfd'=>'float'], +'stats_rand_gen_funiform' => ['float', 'low'=>'float', 'high'=>'float'], +'stats_rand_gen_gamma' => ['float', 'a'=>'float', 'r'=>'float'], +'stats_rand_gen_ibinomial' => ['int', 'n'=>'int', 'pp'=>'float'], +'stats_rand_gen_ibinomial_negative' => ['int', 'n'=>'int', 'p'=>'float'], +'stats_rand_gen_int' => ['int'], +'stats_rand_gen_ipoisson' => ['int', 'mu'=>'float'], +'stats_rand_gen_iuniform' => ['int', 'low'=>'int', 'high'=>'int'], +'stats_rand_gen_noncenral_chisquare' => ['float', 'df'=>'float', 'xnonc'=>'float'], +'stats_rand_gen_noncentral_chisquare' => ['float', 'df'=>'float', 'xnonc'=>'float'], +'stats_rand_gen_noncentral_f' => ['float', 'dfn'=>'float', 'dfd'=>'float', 'xnonc'=>'float'], +'stats_rand_gen_noncentral_t' => ['float', 'df'=>'float', 'xnonc'=>'float'], +'stats_rand_gen_normal' => ['float', 'av'=>'float', 'sd'=>'float'], +'stats_rand_gen_t' => ['float', 'df'=>'float'], +'stats_rand_get_seeds' => ['array'], +'stats_rand_phrase_to_seeds' => ['array', 'phrase'=>'string'], +'stats_rand_ranf' => ['float'], +'stats_rand_setall' => ['void', 'iseed1'=>'int', 'iseed2'=>'int'], +'stats_skew' => ['float', 'a'=>'array'], +'stats_standard_deviation' => ['float', 'a'=>'array', 'sample='=>'bool'], +'stats_stat_binomial_coef' => ['float', 'x'=>'int', 'n'=>'int'], +'stats_stat_correlation' => ['float', 'array1'=>'array', 'array2'=>'array'], +'stats_stat_factorial' => ['float', 'n'=>'int'], +'stats_stat_gennch' => ['float', 'n'=>'int'], +'stats_stat_independent_t' => ['float', 'array1'=>'array', 'array2'=>'array'], +'stats_stat_innerproduct' => ['float', 'array1'=>'array', 'array2'=>'array'], +'stats_stat_noncentral_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], +'stats_stat_paired_t' => ['float', 'array1'=>'array', 'array2'=>'array'], +'stats_stat_percentile' => ['float', 'arr'=>'array', 'perc'=>'float'], +'stats_stat_powersum' => ['float', 'arr'=>'array', 'power'=>'float'], +'stats_variance' => ['float', 'a'=>'array', 'sample='=>'bool'], +'Stomp::__construct' => ['void', 'broker='=>'string', 'username='=>'string', 'password='=>'string', 'headers='=>'array'], +'Stomp::__destruct' => ['bool', 'link'=>''], +'Stomp::abort' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], +'Stomp::ack' => ['bool', 'msg'=>'', 'headers='=>'array', 'link='=>''], +'Stomp::begin' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], +'Stomp::commit' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], +'Stomp::error' => ['string', 'link'=>''], +'Stomp::getReadTimeout' => ['array', 'link'=>''], +'Stomp::getSessionId' => ['string', 'link'=>''], +'Stomp::hasFrame' => ['bool', 'link'=>''], +'Stomp::readFrame' => ['array', 'class_name='=>'string', 'link='=>''], +'Stomp::send' => ['bool', 'destination'=>'string', 'msg'=>'', 'headers='=>'array', 'link='=>''], +'Stomp::setReadTimeout' => ['', 'seconds'=>'int', 'microseconds='=>'int', 'link='=>''], +'Stomp::subscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], +'Stomp::unsubscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], +'stomp_abort' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], +'stomp_ack' => ['bool', 'msg'=>'', 'headers='=>'array', 'link='=>''], +'stomp_begin' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], +'stomp_close' => ['bool', 'link'=>''], +'stomp_commit' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], +'stomp_connect' => ['resource', 'broker='=>'string', 'username='=>'string', 'password='=>'string', 'headers='=>'array'], +'stomp_connect_error' => ['string'], +'stomp_error' => ['string', 'link'=>''], +'stomp_get_read_timeout' => ['array', 'link'=>''], +'stomp_get_session_id' => ['string', 'link'=>''], +'stomp_has_frame' => ['bool', 'link'=>''], +'stomp_read_frame' => ['array', 'class_name='=>'string', 'link='=>''], +'stomp_send' => ['bool', 'destination'=>'string', 'msg'=>'', 'headers='=>'array', 'link='=>''], +'stomp_set_read_timeout' => ['', 'seconds'=>'int', 'microseconds='=>'int', 'link='=>''], +'stomp_subscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], +'stomp_unsubscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], +'stomp_version' => ['string'], +'StompException::getDetails' => ['string'], +'StompFrame::__construct' => ['void', 'command='=>'string', 'headers='=>'array', 'body='=>'string'], +'str_contains' => ['bool', 'haystack'=>'string', 'needle'=>'string'], +'str_ends_with' => ['bool', 'haystack'=>'string', 'needle'=>'string'], +'str_getcsv' => ['non-empty-list', 'string'=>'string', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], +'str_ireplace' => ['string|string[]', 'search'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', '&w_count='=>'int'], +'str_pad' => ['string', 'string'=>'string', 'length'=>'int', 'pad_string='=>'string', 'pad_type='=>'int'], +'str_repeat' => ['string', 'string'=>'string', 'times'=>'int'], +'str_replace' => ['string|string[]', 'search'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', '&w_count='=>'int'], +'str_rot13' => ['string', 'string'=>'string'], +'str_shuffle' => ['string', 'string'=>'string'], +'str_split' => ['non-empty-list', 'string'=>'string', 'length='=>'positive-int'], +'str_starts_with' => ['bool', 'haystack'=>'string', 'needle'=>'string'], +'str_word_count' => ['array|int', 'string'=>'string', 'format='=>'int', 'characters='=>'string'], +'strcasecmp' => ['int', 'string1'=>'string', 'string2'=>'string'], +'strchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], +'strcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], +'strcoll' => ['int', 'string1'=>'string', 'string2'=>'string'], +'strcspn' => ['int', 'string'=>'string', 'characters'=>'string', 'offset='=>'int', 'length='=>'int'], +'stream_bucket_append' => ['void', 'brigade'=>'resource', 'bucket'=>'object'], +'stream_bucket_make_writeable' => ['?object', 'brigade'=>'resource'], +'stream_bucket_new' => ['object|false', 'stream'=>'resource', 'buffer'=>'string'], +'stream_bucket_prepend' => ['void', 'brigade'=>'resource', 'bucket'=>'object'], +'stream_context_create' => ['resource', 'options='=>'array', 'params='=>'array'], +'stream_context_get_default' => ['resource', 'options='=>'array'], +'stream_context_get_options' => ['array', 'stream_or_context'=>'resource'], +'stream_context_get_params' => ['array', 'context'=>'resource'], +'stream_context_set_default' => ['resource', 'options'=>'array'], +'stream_context_set_option' => ['bool', 'context'=>'', 'wrapper_or_options'=>'string', 'option_name'=>'string', 'value'=>''], +'stream_context_set_option\'1' => ['bool', 'context'=>'', 'wrapper_or_options'=>'array'], +'stream_context_set_params' => ['bool', 'context'=>'resource', 'params'=>'array'], +'stream_copy_to_stream' => ['int|false', 'from'=>'resource', 'to'=>'resource', 'length='=>'int', 'offset='=>'int'], +'stream_encoding' => ['bool', 'stream'=>'resource', 'encoding='=>'string'], +'stream_filter_append' => ['resource|false', 'stream'=>'resource', 'filter_name'=>'string', 'mode='=>'int', 'params='=>'mixed'], +'stream_filter_prepend' => ['resource|false', 'stream'=>'resource', 'filter_name'=>'string', 'mode='=>'int', 'params='=>'mixed'], +'stream_filter_register' => ['bool', 'filter_name'=>'string', 'class'=>'string'], +'stream_filter_remove' => ['bool', 'stream_filter'=>'resource'], +'stream_get_contents' => ['string|false', 'stream'=>'resource', 'length='=>'int', 'offset='=>'int'], +'stream_get_filters' => ['array'], +'stream_get_line' => ['string|false', 'stream'=>'resource', 'length'=>'int', 'ending='=>'string'], +'stream_get_meta_data' => ['array{timed_out:bool,blocked:bool,eof:bool,unread_bytes:int,stream_type:string,wrapper_type:string,wrapper_data:mixed,mode:string,seekable:bool,uri:string,mediatype:string,crypto?:array{protocol:string,cipher_name:string,cipher_bits:int,cipher_version:string}}', 'stream'=>'resource'], +'stream_get_transports' => ['list'], +'stream_get_wrappers' => ['list'], +'stream_is_local' => ['bool', 'stream'=>'resource|string'], +'stream_isatty' => ['bool', 'stream'=>'resource'], +'stream_notification_callback' => ['callback', 'notification_code'=>'int', 'severity'=>'int', 'message'=>'string', 'message_code'=>'int', 'bytes_transferred'=>'int', 'bytes_max'=>'int'], +'stream_register_wrapper' => ['bool', 'protocol'=>'string', 'class'=>'string', 'flags='=>'int'], +'stream_resolve_include_path' => ['string|false', 'filename'=>'string'], +'stream_select' => ['int|false', '&rw_read'=>'resource[]', '&rw_write'=>'?resource[]', '&rw_except'=>'?resource[]', 'seconds'=>'?int', 'microseconds='=>'?int'], +'stream_set_blocking' => ['bool', 'stream'=>'resource', 'enable'=>'bool'], +'stream_set_chunk_size' => ['int|false', 'stream'=>'resource', 'size'=>'int'], +'stream_set_read_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], +'stream_set_timeout' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], +'stream_set_write_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], +'stream_socket_accept' => ['resource|false', 'socket'=>'resource', 'timeout='=>'float', '&w_peer_name='=>'string'], +'stream_socket_client' => ['resource|false', 'address'=>'string', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float', 'flags='=>'int', 'context='=>'resource'], +'stream_socket_enable_crypto' => ['int|bool', 'stream'=>'resource', 'enable'=>'bool', 'crypto_method='=>'int', 'session_stream='=>'resource'], +'stream_socket_get_name' => ['string', 'socket'=>'resource', 'remote'=>'bool'], +'stream_socket_pair' => ['resource[]|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], +'stream_socket_recvfrom' => ['string', 'socket'=>'resource', 'length'=>'int', 'flags='=>'int', '&w_address='=>'string'], +'stream_socket_sendto' => ['int', 'socket'=>'resource', 'data'=>'string', 'flags='=>'int', 'address='=>'string'], +'stream_socket_server' => ['resource|false', 'address'=>'string', '&w_error_code='=>'int', '&w_error_message='=>'string', 'flags='=>'int', 'context='=>'resource'], +'stream_socket_shutdown' => ['bool', 'stream'=>'resource', 'mode'=>'int'], +'stream_supports_lock' => ['bool', 'stream'=>'resource'], +'stream_wrapper_register' => ['bool', 'protocol'=>'string', 'class'=>'string', 'flags='=>'int'], +'stream_wrapper_restore' => ['bool', 'protocol'=>'string'], +'stream_wrapper_unregister' => ['bool', 'protocol'=>'string'], +'streamWrapper::__construct' => ['void'], +'streamWrapper::__destruct' => ['void'], +'streamWrapper::dir_closedir' => ['bool'], +'streamWrapper::dir_opendir' => ['bool', 'path'=>'string', 'options'=>'int'], +'streamWrapper::dir_readdir' => ['string'], +'streamWrapper::dir_rewinddir' => ['bool'], +'streamWrapper::mkdir' => ['bool', 'path'=>'string', 'mode'=>'int', 'options'=>'int'], +'streamWrapper::rename' => ['bool', 'path_from'=>'string', 'path_to'=>'string'], +'streamWrapper::rmdir' => ['bool', 'path'=>'string', 'options'=>'int'], +'streamWrapper::stream_cast' => ['resource', 'cast_as'=>'int'], +'streamWrapper::stream_close' => ['void'], +'streamWrapper::stream_eof' => ['bool'], +'streamWrapper::stream_flush' => ['bool'], +'streamWrapper::stream_lock' => ['bool', 'operation'=>'mode'], +'streamWrapper::stream_metadata' => ['bool', 'path'=>'string', 'option'=>'int', 'value'=>'mixed'], +'streamWrapper::stream_open' => ['bool', 'path'=>'string', 'mode'=>'string', 'options'=>'int', 'opened_path'=>'string'], +'streamWrapper::stream_read' => ['string', 'count'=>'int'], +'streamWrapper::stream_seek' => ['bool', 'offset'=>'int', 'whence'=>'int'], +'streamWrapper::stream_set_option' => ['bool', 'option'=>'int', 'arg1'=>'int', 'arg2'=>'int'], +'streamWrapper::stream_stat' => ['array'], +'streamWrapper::stream_tell' => ['int'], +'streamWrapper::stream_truncate' => ['bool', 'new_size'=>'int'], +'streamWrapper::stream_write' => ['int', 'data'=>'string'], +'streamWrapper::unlink' => ['bool', 'path'=>'string'], +'streamWrapper::url_stat' => ['array', 'path'=>'string', 'flags'=>'int'], +'strftime' => ['string|false', 'format'=>'string', 'timestamp='=>'?int'], +'strip_tags' => ['string', 'string'=>'string', 'allowed_tags='=>'string'], +'stripcslashes' => ['string', 'string'=>'string'], +'stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], +'stripslashes' => ['string', 'string'=>'string'], +'stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], +'strlen' => ['0|positive-int', 'string'=>'string'], +'strnatcasecmp' => ['int', 'string1'=>'string', 'string2'=>'string'], +'strnatcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], +'strncasecmp' => ['int', 'string1'=>'string', 'string2'=>'string', 'length'=>'int'], +'strncmp' => ['int', 'string1'=>'string', 'string2'=>'string', 'length'=>'int'], +'strpbrk' => ['string|false', 'string'=>'string', 'characters'=>'string'], +'strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], +'strptime' => ['array|false', 'timestamp'=>'string', 'format'=>'string'], +'strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string'], +'strrev' => ['string', 'string'=>'string'], +'strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], +'strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], +'strspn' => ['int', 'string'=>'string', 'characters'=>'string', 'offset='=>'int', 'length='=>'int'], +'strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], +'strtok' => ['string|false', 'string'=>'string', 'token'=>'string'], +'strtok\'1' => ['string|false', 'string'=>'string'], +'strtolower' => ['lowercase-string', 'string'=>'string'], +'strtotime' => ['int|false', 'datetime'=>'string', 'baseTimestamp='=>'int'], +'strtoupper' => ['string', 'string'=>'string'], +'strtr' => ['string', 'string'=>'string', 'from'=>'string', 'to'=>'string'], +'strtr\'1' => ['string', 'string'=>'string', 'from'=>'array'], +'strval' => ['string', 'value'=>'mixed'], +'styleObj::__construct' => ['void', 'label'=>'labelObj', 'style'=>'styleObj'], +'styleObj::convertToString' => ['string'], +'styleObj::free' => ['void'], +'styleObj::getBinding' => ['string', 'stylebinding'=>'mixed'], +'styleObj::getGeomTransform' => ['string'], +'styleObj::ms_newStyleObj' => ['styleObj', 'class'=>'classObj', 'style'=>'styleObj'], +'styleObj::removeBinding' => ['int', 'stylebinding'=>'mixed'], +'styleObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'styleObj::setBinding' => ['int', 'stylebinding'=>'mixed', 'value'=>'string'], +'styleObj::setGeomTransform' => ['int', 'value'=>'string'], +'styleObj::updateFromString' => ['int', 'snippet'=>'string'], +'substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int'], +'substr_compare' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset'=>'int', 'length='=>'int', 'case_insensitive='=>'bool'], +'substr_count' => ['int', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'length='=>'int'], +'substr_replace' => ['string|string[]', 'string'=>'string|string[]', 'replace'=>'mixed', 'offset'=>'mixed', 'length='=>'mixed'], +'suhosin_encrypt_cookie' => ['string|false', 'name'=>'string', 'value'=>'string'], +'suhosin_get_raw_cookies' => ['array'], +'SVM::__construct' => ['void'], +'svm::crossvalidate' => ['float', 'problem'=>'array', 'number_of_folds'=>'int'], +'SVM::getOptions' => ['array'], +'SVM::setOptions' => ['bool', 'params'=>'array'], +'svm::train' => ['SVMModel', 'problem'=>'array', 'weights='=>'array'], +'SVMModel::__construct' => ['void', 'filename='=>'string'], +'SVMModel::checkProbabilityModel' => ['bool'], +'SVMModel::getLabels' => ['array'], +'SVMModel::getNrClass' => ['int'], +'SVMModel::getSvmType' => ['int'], +'SVMModel::getSvrProbability' => ['float'], +'SVMModel::load' => ['bool', 'filename'=>'string'], +'SVMModel::predict' => ['float', 'data'=>'array'], +'SVMModel::predict_probability' => ['float', 'data'=>'array'], +'SVMModel::save' => ['bool', 'filename'=>'string'], +'svn_add' => ['bool', 'path'=>'string', 'recursive='=>'bool', 'force='=>'bool'], +'svn_auth_get_parameter' => ['?string', 'key'=>'string'], +'svn_auth_set_parameter' => ['void', 'key'=>'string', 'value'=>'string'], +'svn_blame' => ['array', 'repository_url'=>'string', 'revision_no='=>'int'], +'svn_cat' => ['string', 'repos_url'=>'string', 'revision_no='=>'int'], +'svn_checkout' => ['bool', 'repos'=>'string', 'targetpath'=>'string', 'revision='=>'int', 'flags='=>'int'], +'svn_cleanup' => ['bool', 'workingdir'=>'string'], +'svn_client_version' => ['string'], +'svn_commit' => ['array', 'log'=>'string', 'targets'=>'array', 'dontrecurse='=>'bool'], +'svn_delete' => ['bool', 'path'=>'string', 'force='=>'bool'], +'svn_diff' => ['array', 'path1'=>'string', 'rev1'=>'int', 'path2'=>'string', 'rev2'=>'int'], +'svn_export' => ['bool', 'frompath'=>'string', 'topath'=>'string', 'working_copy='=>'bool', 'revision_no='=>'int'], +'svn_fs_abort_txn' => ['bool', 'txn'=>'resource'], +'svn_fs_apply_text' => ['resource', 'root'=>'resource', 'path'=>'string'], +'svn_fs_begin_txn2' => ['resource', 'repos'=>'resource', 'rev'=>'int'], +'svn_fs_change_node_prop' => ['bool', 'root'=>'resource', 'path'=>'string', 'name'=>'string', 'value'=>'string'], +'svn_fs_check_path' => ['int', 'fsroot'=>'resource', 'path'=>'string'], +'svn_fs_contents_changed' => ['bool', 'root1'=>'resource', 'path1'=>'string', 'root2'=>'resource', 'path2'=>'string'], +'svn_fs_copy' => ['bool', 'from_root'=>'resource', 'from_path'=>'string', 'to_root'=>'resource', 'to_path'=>'string'], +'svn_fs_delete' => ['bool', 'root'=>'resource', 'path'=>'string'], +'svn_fs_dir_entries' => ['array', 'fsroot'=>'resource', 'path'=>'string'], +'svn_fs_file_contents' => ['resource', 'fsroot'=>'resource', 'path'=>'string'], +'svn_fs_file_length' => ['int', 'fsroot'=>'resource', 'path'=>'string'], +'svn_fs_is_dir' => ['bool', 'root'=>'resource', 'path'=>'string'], +'svn_fs_is_file' => ['bool', 'root'=>'resource', 'path'=>'string'], +'svn_fs_make_dir' => ['bool', 'root'=>'resource', 'path'=>'string'], +'svn_fs_make_file' => ['bool', 'root'=>'resource', 'path'=>'string'], +'svn_fs_node_created_rev' => ['int', 'fsroot'=>'resource', 'path'=>'string'], +'svn_fs_node_prop' => ['string', 'fsroot'=>'resource', 'path'=>'string', 'propname'=>'string'], +'svn_fs_props_changed' => ['bool', 'root1'=>'resource', 'path1'=>'string', 'root2'=>'resource', 'path2'=>'string'], +'svn_fs_revision_prop' => ['string', 'fs'=>'resource', 'revnum'=>'int', 'propname'=>'string'], +'svn_fs_revision_root' => ['resource', 'fs'=>'resource', 'revnum'=>'int'], +'svn_fs_txn_root' => ['resource', 'txn'=>'resource'], +'svn_fs_youngest_rev' => ['int', 'fs'=>'resource'], +'svn_import' => ['bool', 'path'=>'string', 'url'=>'string', 'nonrecursive'=>'bool'], +'svn_log' => ['array', 'repos_url'=>'string', 'start_revision='=>'int', 'end_revision='=>'int', 'limit='=>'int', 'flags='=>'int'], +'svn_ls' => ['array', 'repos_url'=>'string', 'revision_no='=>'int', 'recurse='=>'bool', 'peg='=>'bool'], +'svn_mkdir' => ['bool', 'path'=>'string', 'log_message='=>'string'], +'svn_move' => ['mixed', 'src_path'=>'string', 'dst_path'=>'string', 'force='=>'bool'], +'svn_propget' => ['mixed', 'path'=>'string', 'property_name'=>'string', 'recurse='=>'bool', 'revision'=>'int'], +'svn_proplist' => ['mixed', 'path'=>'string', 'recurse='=>'bool', 'revision'=>'int'], +'svn_repos_create' => ['resource', 'path'=>'string', 'config='=>'array', 'fsconfig='=>'array'], +'svn_repos_fs' => ['resource', 'repos'=>'resource'], +'svn_repos_fs_begin_txn_for_commit' => ['resource', 'repos'=>'resource', 'rev'=>'int', 'author'=>'string', 'log_msg'=>'string'], +'svn_repos_fs_commit_txn' => ['int', 'txn'=>'resource'], +'svn_repos_hotcopy' => ['bool', 'repospath'=>'string', 'destpath'=>'string', 'cleanlogs'=>'bool'], +'svn_repos_open' => ['resource', 'path'=>'string'], +'svn_repos_recover' => ['bool', 'path'=>'string'], +'svn_revert' => ['bool', 'path'=>'string', 'recursive='=>'bool'], +'svn_status' => ['array', 'path'=>'string', 'flags='=>'int'], +'svn_update' => ['int|false', 'path'=>'string', 'revno='=>'int', 'recurse='=>'bool'], +'swf_actiongeturl' => ['', 'url'=>'string', 'target'=>'string'], +'swf_actiongotoframe' => ['', 'framenumber'=>'int'], +'swf_actiongotolabel' => ['', 'label'=>'string'], +'swf_actionnextframe' => [''], +'swf_actionplay' => [''], +'swf_actionprevframe' => [''], +'swf_actionsettarget' => ['', 'target'=>'string'], +'swf_actionstop' => [''], +'swf_actiontogglequality' => [''], +'swf_actionwaitforframe' => ['', 'framenumber'=>'int', 'skipcount'=>'int'], +'swf_addbuttonrecord' => ['', 'states'=>'int', 'shapeid'=>'int', 'depth'=>'int'], +'swf_addcolor' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], +'swf_closefile' => ['', 'return_file='=>'int'], +'swf_definebitmap' => ['', 'objid'=>'int', 'image_name'=>'string'], +'swf_definefont' => ['', 'fontid'=>'int', 'fontname'=>'string'], +'swf_defineline' => ['', 'objid'=>'int', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'width'=>'float'], +'swf_definepoly' => ['', 'objid'=>'int', 'coords'=>'array', 'npoints'=>'int', 'width'=>'float'], +'swf_definerect' => ['', 'objid'=>'int', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'width'=>'float'], +'swf_definetext' => ['', 'objid'=>'int', 'string'=>'string', 'docenter'=>'int'], +'swf_endbutton' => [''], +'swf_enddoaction' => [''], +'swf_endshape' => [''], +'swf_endsymbol' => [''], +'swf_fontsize' => ['', 'size'=>'float'], +'swf_fontslant' => ['', 'slant'=>'float'], +'swf_fonttracking' => ['', 'tracking'=>'float'], +'swf_getbitmapinfo' => ['array', 'bitmapid'=>'int'], +'swf_getfontinfo' => ['array'], +'swf_getframe' => ['int'], +'swf_labelframe' => ['', 'name'=>'string'], +'swf_lookat' => ['', 'view_x'=>'float', 'view_y'=>'float', 'view_z'=>'float', 'reference_x'=>'float', 'reference_y'=>'float', 'reference_z'=>'float', 'twist'=>'float'], +'swf_modifyobject' => ['', 'depth'=>'int', 'how'=>'int'], +'swf_mulcolor' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], +'swf_nextid' => ['int'], +'swf_oncondition' => ['', 'transition'=>'int'], +'swf_openfile' => ['', 'filename'=>'string', 'width'=>'float', 'height'=>'float', 'framerate'=>'float', 'r'=>'float', 'g'=>'float', 'b'=>'float'], +'swf_ortho' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float', 'zmin'=>'float', 'zmax'=>'float'], +'swf_ortho2' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float'], +'swf_perspective' => ['', 'fovy'=>'float', 'aspect'=>'float', 'near'=>'float', 'far'=>'float'], +'swf_placeobject' => ['', 'objid'=>'int', 'depth'=>'int'], +'swf_polarview' => ['', 'dist'=>'float', 'azimuth'=>'float', 'incidence'=>'float', 'twist'=>'float'], +'swf_popmatrix' => [''], +'swf_posround' => ['', 'round'=>'int'], +'swf_pushmatrix' => [''], +'swf_removeobject' => ['', 'depth'=>'int'], +'swf_rotate' => ['', 'angle'=>'float', 'axis'=>'string'], +'swf_scale' => ['', 'x'=>'float', 'y'=>'float', 'z'=>'float'], +'swf_setfont' => ['', 'fontid'=>'int'], +'swf_setframe' => ['', 'framenumber'=>'int'], +'swf_shapearc' => ['', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'ang1'=>'float', 'ang2'=>'float'], +'swf_shapecurveto' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], +'swf_shapecurveto3' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], +'swf_shapefillbitmapclip' => ['', 'bitmapid'=>'int'], +'swf_shapefillbitmaptile' => ['', 'bitmapid'=>'int'], +'swf_shapefilloff' => [''], +'swf_shapefillsolid' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], +'swf_shapelinesolid' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float', 'width'=>'float'], +'swf_shapelineto' => ['', 'x'=>'float', 'y'=>'float'], +'swf_shapemoveto' => ['', 'x'=>'float', 'y'=>'float'], +'swf_showframe' => [''], +'swf_startbutton' => ['', 'objid'=>'int', 'type'=>'int'], +'swf_startdoaction' => [''], +'swf_startshape' => ['', 'objid'=>'int'], +'swf_startsymbol' => ['', 'objid'=>'int'], +'swf_textwidth' => ['float', 'string'=>'string'], +'swf_translate' => ['', 'x'=>'float', 'y'=>'float', 'z'=>'float'], +'swf_viewport' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float'], +'SWFAction::__construct' => ['void', 'script'=>'string'], +'SWFBitmap::__construct' => ['void', 'file'=>'', 'alphafile='=>''], +'SWFBitmap::getHeight' => ['float'], +'SWFBitmap::getWidth' => ['float'], +'SWFButton::__construct' => ['void'], +'SWFButton::addAction' => ['void', 'action'=>'swfaction', 'flags'=>'int'], +'SWFButton::addASound' => ['SWFSoundInstance', 'sound'=>'swfsound', 'flags'=>'int'], +'SWFButton::addShape' => ['void', 'shape'=>'swfshape', 'flags'=>'int'], +'SWFButton::setAction' => ['void', 'action'=>'swfaction'], +'SWFButton::setDown' => ['void', 'shape'=>'swfshape'], +'SWFButton::setHit' => ['void', 'shape'=>'swfshape'], +'SWFButton::setMenu' => ['void', 'flag'=>'int'], +'SWFButton::setOver' => ['void', 'shape'=>'swfshape'], +'SWFButton::setUp' => ['void', 'shape'=>'swfshape'], +'SWFDisplayItem::addAction' => ['void', 'action'=>'swfaction', 'flags'=>'int'], +'SWFDisplayItem::addColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], +'SWFDisplayItem::endMask' => ['void'], +'SWFDisplayItem::getRot' => ['float'], +'SWFDisplayItem::getX' => ['float'], +'SWFDisplayItem::getXScale' => ['float'], +'SWFDisplayItem::getXSkew' => ['float'], +'SWFDisplayItem::getY' => ['float'], +'SWFDisplayItem::getYScale' => ['float'], +'SWFDisplayItem::getYSkew' => ['float'], +'SWFDisplayItem::move' => ['void', 'dx'=>'float', 'dy'=>'float'], +'SWFDisplayItem::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], +'SWFDisplayItem::multColor' => ['void', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'a='=>'float'], +'SWFDisplayItem::remove' => ['void'], +'SWFDisplayItem::rotate' => ['void', 'angle'=>'float'], +'SWFDisplayItem::rotateTo' => ['void', 'angle'=>'float'], +'SWFDisplayItem::scale' => ['void', 'dx'=>'float', 'dy'=>'float'], +'SWFDisplayItem::scaleTo' => ['void', 'x'=>'float', 'y='=>'float'], +'SWFDisplayItem::setDepth' => ['void', 'depth'=>'int'], +'SWFDisplayItem::setMaskLevel' => ['void', 'level'=>'int'], +'SWFDisplayItem::setMatrix' => ['void', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], +'SWFDisplayItem::setName' => ['void', 'name'=>'string'], +'SWFDisplayItem::setRatio' => ['void', 'ratio'=>'float'], +'SWFDisplayItem::skewX' => ['void', 'ddegrees'=>'float'], +'SWFDisplayItem::skewXTo' => ['void', 'degrees'=>'float'], +'SWFDisplayItem::skewY' => ['void', 'ddegrees'=>'float'], +'SWFDisplayItem::skewYTo' => ['void', 'degrees'=>'float'], +'SWFFill::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], +'SWFFill::rotateTo' => ['void', 'angle'=>'float'], +'SWFFill::scaleTo' => ['void', 'x'=>'float', 'y='=>'float'], +'SWFFill::skewXTo' => ['void', 'x'=>'float'], +'SWFFill::skewYTo' => ['void', 'y'=>'float'], +'SWFFont::__construct' => ['void', 'filename'=>'string'], +'SWFFont::getAscent' => ['float'], +'SWFFont::getDescent' => ['float'], +'SWFFont::getLeading' => ['float'], +'SWFFont::getShape' => ['string', 'code'=>'int'], +'SWFFont::getUTF8Width' => ['float', 'string'=>'string'], +'SWFFont::getWidth' => ['float', 'string'=>'string'], +'SWFFontChar::addChars' => ['void', 'char'=>'string'], +'SWFFontChar::addUTF8Chars' => ['void', 'char'=>'string'], +'SWFGradient::__construct' => ['void'], +'SWFGradient::addEntry' => ['void', 'ratio'=>'float', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], +'SWFMorph::__construct' => ['void'], +'SWFMorph::getShape1' => ['SWFShape'], +'SWFMorph::getShape2' => ['SWFShape'], +'SWFMovie::__construct' => ['void', 'version='=>'int'], +'SWFMovie::add' => ['mixed', 'instance'=>'object'], +'SWFMovie::addExport' => ['void', 'char'=>'swfcharacter', 'name'=>'string'], +'SWFMovie::addFont' => ['mixed', 'font'=>'swffont'], +'SWFMovie::importChar' => ['SWFSprite', 'libswf'=>'string', 'name'=>'string'], +'SWFMovie::importFont' => ['SWFFontChar', 'libswf'=>'string', 'name'=>'string'], +'SWFMovie::labelFrame' => ['void', 'label'=>'string'], +'SWFMovie::namedAnchor' => [''], +'SWFMovie::nextFrame' => ['void'], +'SWFMovie::output' => ['int', 'compression='=>'int'], +'SWFMovie::protect' => [''], +'SWFMovie::remove' => ['void', 'instance'=>'object'], +'SWFMovie::save' => ['int', 'filename'=>'string', 'compression='=>'int'], +'SWFMovie::saveToFile' => ['int', 'x'=>'resource', 'compression='=>'int'], +'SWFMovie::setbackground' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], +'SWFMovie::setDimension' => ['void', 'width'=>'float', 'height'=>'float'], +'SWFMovie::setFrames' => ['void', 'number'=>'int'], +'SWFMovie::setRate' => ['void', 'rate'=>'float'], +'SWFMovie::startSound' => ['SWFSoundInstance', 'sound'=>'swfsound'], +'SWFMovie::stopSound' => ['void', 'sound'=>'swfsound'], +'SWFMovie::streamMP3' => ['int', 'mp3file'=>'mixed', 'skip='=>'float'], +'SWFMovie::writeExports' => ['void'], +'SWFPrebuiltClip::__construct' => ['void', 'file'=>''], +'SWFShape::__construct' => ['void'], +'SWFShape::addFill' => ['SWFFill', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int', 'bitmap='=>'swfbitmap', 'flags='=>'int', 'gradient='=>'swfgradient'], +'SWFShape::addFill\'1' => ['SWFFill', 'bitmap'=>'SWFBitmap', 'flags='=>'int'], +'SWFShape::addFill\'2' => ['SWFFill', 'gradient'=>'SWFGradient', 'flags='=>'int'], +'SWFShape::drawArc' => ['void', 'r'=>'float', 'startangle'=>'float', 'endangle'=>'float'], +'SWFShape::drawCircle' => ['void', 'r'=>'float'], +'SWFShape::drawCubic' => ['int', 'bx'=>'float', 'by'=>'float', 'cx'=>'float', 'cy'=>'float', 'dx'=>'float', 'dy'=>'float'], +'SWFShape::drawCubicTo' => ['int', 'bx'=>'float', 'by'=>'float', 'cx'=>'float', 'cy'=>'float', 'dx'=>'float', 'dy'=>'float'], +'SWFShape::drawCurve' => ['int', 'controldx'=>'float', 'controldy'=>'float', 'anchordx'=>'float', 'anchordy'=>'float', 'targetdx='=>'float', 'targetdy='=>'float'], +'SWFShape::drawCurveTo' => ['int', 'controlx'=>'float', 'controly'=>'float', 'anchorx'=>'float', 'anchory'=>'float', 'targetx='=>'float', 'targety='=>'float'], +'SWFShape::drawGlyph' => ['void', 'font'=>'swffont', 'character'=>'string', 'size='=>'int'], +'SWFShape::drawLine' => ['void', 'dx'=>'float', 'dy'=>'float'], +'SWFShape::drawLineTo' => ['void', 'x'=>'float', 'y'=>'float'], +'SWFShape::movePen' => ['void', 'dx'=>'float', 'dy'=>'float'], +'SWFShape::movePenTo' => ['void', 'x'=>'float', 'y'=>'float'], +'SWFShape::setLeftFill' => ['', 'fill'=>'swfgradient', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], +'SWFShape::setLine' => ['', 'shape'=>'swfshape', 'width'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], +'SWFShape::setRightFill' => ['', 'fill'=>'swfgradient', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], +'SWFSound' => ['SWFSound', 'filename'=>'string', 'flags='=>'int'], +'SWFSound::__construct' => ['void', 'filename'=>'string', 'flags='=>'int'], +'SWFSoundInstance::loopCount' => ['void', 'point'=>'int'], +'SWFSoundInstance::loopInPoint' => ['void', 'point'=>'int'], +'SWFSoundInstance::loopOutPoint' => ['void', 'point'=>'int'], +'SWFSoundInstance::noMultiple' => ['void'], +'SWFSprite::__construct' => ['void'], +'SWFSprite::add' => ['void', 'object'=>'object'], +'SWFSprite::labelFrame' => ['void', 'label'=>'string'], +'SWFSprite::nextFrame' => ['void'], +'SWFSprite::remove' => ['void', 'object'=>'object'], +'SWFSprite::setFrames' => ['void', 'number'=>'int'], +'SWFSprite::startSound' => ['SWFSoundInstance', 'sount'=>'swfsound'], +'SWFSprite::stopSound' => ['void', 'sount'=>'swfsound'], +'SWFText::__construct' => ['void'], +'SWFText::addString' => ['void', 'string'=>'string'], +'SWFText::addUTF8String' => ['void', 'text'=>'string'], +'SWFText::getAscent' => ['float'], +'SWFText::getDescent' => ['float'], +'SWFText::getLeading' => ['float'], +'SWFText::getUTF8Width' => ['float', 'string'=>'string'], +'SWFText::getWidth' => ['float', 'string'=>'string'], +'SWFText::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], +'SWFText::setColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], +'SWFText::setFont' => ['void', 'font'=>'swffont'], +'SWFText::setHeight' => ['void', 'height'=>'float'], +'SWFText::setSpacing' => ['void', 'spacing'=>'float'], +'SWFTextField::__construct' => ['void', 'flags='=>'int'], +'SWFTextField::addChars' => ['void', 'chars'=>'string'], +'SWFTextField::addString' => ['void', 'string'=>'string'], +'SWFTextField::align' => ['void', 'alignement'=>'int'], +'SWFTextField::setBounds' => ['void', 'width'=>'float', 'height'=>'float'], +'SWFTextField::setColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], +'SWFTextField::setFont' => ['void', 'font'=>'swffont'], +'SWFTextField::setHeight' => ['void', 'height'=>'float'], +'SWFTextField::setIndentation' => ['void', 'width'=>'float'], +'SWFTextField::setLeftMargin' => ['void', 'width'=>'float'], +'SWFTextField::setLineSpacing' => ['void', 'height'=>'float'], +'SWFTextField::setMargins' => ['void', 'left'=>'float', 'right'=>'float'], +'SWFTextField::setName' => ['void', 'name'=>'string'], +'SWFTextField::setPadding' => ['void', 'padding'=>'float'], +'SWFTextField::setRightMargin' => ['void', 'width'=>'float'], +'SWFVideoStream::__construct' => ['void', 'file='=>'string'], +'SWFVideoStream::getNumFrames' => ['int'], +'SWFVideoStream::setDimension' => ['void', 'x'=>'int', 'y'=>'int'], +'Swish::__construct' => ['void', 'index_names'=>'string'], +'Swish::getMetaList' => ['array', 'index_name'=>'string'], +'Swish::getPropertyList' => ['array', 'index_name'=>'string'], +'Swish::prepare' => ['object', 'query='=>'string'], +'Swish::query' => ['object', 'query'=>'string'], +'SwishResult::getMetaList' => ['array'], +'SwishResult::stem' => ['array', 'word'=>'string'], +'SwishResults::getParsedWords' => ['array', 'index_name'=>'string'], +'SwishResults::getRemovedStopwords' => ['array', 'index_name'=>'string'], +'SwishResults::nextResult' => ['object'], +'SwishResults::seekResult' => ['int', 'position'=>'int'], +'SwishSearch::execute' => ['object', 'query='=>'string'], +'SwishSearch::resetLimit' => [''], +'SwishSearch::setLimit' => ['', 'property'=>'string', 'low'=>'string', 'high'=>'string'], +'SwishSearch::setPhraseDelimiter' => ['', 'delimiter'=>'string'], +'SwishSearch::setSort' => ['', 'sort'=>'string'], +'SwishSearch::setStructure' => ['', 'structure'=>'int'], +'swoole\async::dnsLookup' => ['void', 'hostname'=>'string', 'callback'=>'callable'], +'swoole\async::read' => ['bool', 'filename'=>'string', 'callback'=>'callable', 'chunk_size='=>'integer', 'offset='=>'integer'], +'swoole\async::readFile' => ['void', 'filename'=>'string', 'callback'=>'callable'], +'swoole\async::set' => ['void', 'settings'=>'array'], +'swoole\async::write' => ['void', 'filename'=>'string', 'content'=>'string', 'offset='=>'integer', 'callback='=>'callable'], +'swoole\async::writeFile' => ['void', 'filename'=>'string', 'content'=>'string', 'callback='=>'callable', 'flags='=>'string'], +'swoole\atomic::add' => ['integer', 'add_value='=>'integer'], +'swoole\atomic::cmpset' => ['integer', 'cmp_value'=>'integer', 'new_value'=>'integer'], +'swoole\atomic::get' => ['integer'], +'swoole\atomic::set' => ['integer', 'value'=>'integer'], +'swoole\atomic::sub' => ['integer', 'sub_value='=>'integer'], +'swoole\buffer::__destruct' => ['void'], +'swoole\buffer::__toString' => ['string'], +'swoole\buffer::append' => ['integer', 'data'=>'string'], +'swoole\buffer::clear' => ['void'], +'swoole\buffer::expand' => ['integer', 'size'=>'integer'], +'swoole\buffer::read' => ['string', 'offset'=>'integer', 'length'=>'integer'], +'swoole\buffer::recycle' => ['void'], +'swoole\buffer::substr' => ['string', 'offset'=>'integer', 'length='=>'integer', 'remove='=>'bool'], +'swoole\buffer::write' => ['void', 'offset'=>'integer', 'data'=>'string'], +'swoole\channel::__destruct' => ['void'], +'swoole\channel::pop' => ['mixed'], +'swoole\channel::push' => ['bool', 'data'=>'string'], +'swoole\channel::stats' => ['array'], +'swoole\client::__destruct' => ['void'], +'swoole\client::close' => ['bool', 'force='=>'bool'], +'swoole\client::connect' => ['bool', 'host'=>'string', 'port='=>'integer', 'timeout='=>'integer', 'flag='=>'integer'], +'swoole\client::getpeername' => ['array'], +'swoole\client::getsockname' => ['array'], +'swoole\client::isConnected' => ['bool'], +'swoole\client::on' => ['void', 'event'=>'string', 'callback'=>'callable'], +'swoole\client::pause' => ['void'], +'swoole\client::pipe' => ['void', 'socket'=>'string'], +'swoole\client::recv' => ['void', 'size='=>'string', 'flag='=>'string'], +'swoole\client::resume' => ['void'], +'swoole\client::send' => ['integer', 'data'=>'string', 'flag='=>'string'], +'swoole\client::sendfile' => ['bool', 'filename'=>'string', 'offset='=>'int'], +'swoole\client::sendto' => ['bool', 'ip'=>'string', 'port'=>'integer', 'data'=>'string'], +'swoole\client::set' => ['void', 'settings'=>'array'], +'swoole\client::sleep' => ['void'], +'swoole\client::wakeup' => ['void'], +'swoole\connection\iterator::count' => ['int'], +'swoole\connection\iterator::current' => ['Connection'], +'swoole\connection\iterator::key' => ['int'], +'swoole\connection\iterator::next' => ['Connection'], +'swoole\connection\iterator::offsetExists' => ['bool', 'index'=>'int'], +'swoole\connection\iterator::offsetGet' => ['Connection', 'index'=>'string'], +'swoole\connection\iterator::offsetSet' => ['void', 'offset'=>'int', 'connection'=>'mixed'], +'swoole\connection\iterator::offsetUnset' => ['void', 'offset'=>'int'], +'swoole\connection\iterator::rewind' => ['void'], +'swoole\connection\iterator::valid' => ['bool'], +'swoole\coroutine::call_user_func' => ['mixed', 'callback'=>'callable', 'parameter='=>'mixed', '...args='=>'mixed'], +'swoole\coroutine::call_user_func_array' => ['mixed', 'callback'=>'callable', 'param_array'=>'array'], +'swoole\coroutine::cli_wait' => ['ReturnType'], +'swoole\coroutine::create' => ['ReturnType'], +'swoole\coroutine::getuid' => ['ReturnType'], +'swoole\coroutine::resume' => ['ReturnType'], +'swoole\coroutine::suspend' => ['ReturnType'], +'swoole\coroutine\client::__destruct' => ['ReturnType'], +'swoole\coroutine\client::close' => ['ReturnType'], +'swoole\coroutine\client::connect' => ['ReturnType'], +'swoole\coroutine\client::getpeername' => ['ReturnType'], +'swoole\coroutine\client::getsockname' => ['ReturnType'], +'swoole\coroutine\client::isConnected' => ['ReturnType'], +'swoole\coroutine\client::recv' => ['ReturnType'], +'swoole\coroutine\client::send' => ['ReturnType'], +'swoole\coroutine\client::sendfile' => ['ReturnType'], +'swoole\coroutine\client::sendto' => ['ReturnType'], +'swoole\coroutine\client::set' => ['ReturnType'], +'swoole\coroutine\http\client::__destruct' => ['ReturnType'], +'swoole\coroutine\http\client::addFile' => ['ReturnType'], +'swoole\coroutine\http\client::close' => ['ReturnType'], +'swoole\coroutine\http\client::execute' => ['ReturnType'], +'swoole\coroutine\http\client::get' => ['ReturnType'], +'swoole\coroutine\http\client::getDefer' => ['ReturnType'], +'swoole\coroutine\http\client::isConnected' => ['ReturnType'], +'swoole\coroutine\http\client::post' => ['ReturnType'], +'swoole\coroutine\http\client::recv' => ['ReturnType'], +'swoole\coroutine\http\client::set' => ['ReturnType'], +'swoole\coroutine\http\client::setCookies' => ['ReturnType'], +'swoole\coroutine\http\client::setData' => ['ReturnType'], +'swoole\coroutine\http\client::setDefer' => ['ReturnType'], +'swoole\coroutine\http\client::setHeaders' => ['ReturnType'], +'swoole\coroutine\http\client::setMethod' => ['ReturnType'], +'swoole\coroutine\mysql::__destruct' => ['ReturnType'], +'swoole\coroutine\mysql::close' => ['ReturnType'], +'swoole\coroutine\mysql::connect' => ['ReturnType'], +'swoole\coroutine\mysql::getDefer' => ['ReturnType'], +'swoole\coroutine\mysql::query' => ['ReturnType'], +'swoole\coroutine\mysql::recv' => ['ReturnType'], +'swoole\coroutine\mysql::setDefer' => ['ReturnType'], +'swoole\event::add' => ['bool', 'fd'=>'int', 'read_callback'=>'callable', 'write_callback='=>'callable', 'events='=>'string'], +'swoole\event::defer' => ['void', 'callback'=>'mixed'], +'swoole\event::del' => ['bool', 'fd'=>'string'], +'swoole\event::exit' => ['void'], +'swoole\event::set' => ['bool', 'fd'=>'int', 'read_callback='=>'string', 'write_callback='=>'string', 'events='=>'string'], +'swoole\event::wait' => ['void'], +'swoole\event::write' => ['void', 'fd'=>'string', 'data'=>'string'], +'swoole\http\client::__destruct' => ['void'], +'swoole\http\client::addFile' => ['void', 'path'=>'string', 'name'=>'string', 'type='=>'string', 'filename='=>'string', 'offset='=>'string'], +'swoole\http\client::close' => ['void'], +'swoole\http\client::download' => ['void', 'path'=>'string', 'file'=>'string', 'callback'=>'callable', 'offset='=>'integer'], +'swoole\http\client::execute' => ['void', 'path'=>'string', 'callback'=>'string'], +'swoole\http\client::get' => ['void', 'path'=>'string', 'callback'=>'callable'], +'swoole\http\client::isConnected' => ['bool'], +'swoole\http\client::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], +'swoole\http\client::post' => ['void', 'path'=>'string', 'data'=>'string', 'callback'=>'callable'], +'swoole\http\client::push' => ['void', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string'], +'swoole\http\client::set' => ['void', 'settings'=>'array'], +'swoole\http\client::setCookies' => ['void', 'cookies'=>'array'], +'swoole\http\client::setData' => ['ReturnType', 'data'=>'string'], +'swoole\http\client::setHeaders' => ['void', 'headers'=>'array'], +'swoole\http\client::setMethod' => ['void', 'method'=>'string'], +'swoole\http\client::upgrade' => ['void', 'path'=>'string', 'callback'=>'string'], +'swoole\http\request::__destruct' => ['void'], +'swoole\http\request::rawcontent' => ['string'], +'swoole\http\response::__destruct' => ['void'], +'swoole\http\response::cookie' => ['string', 'name'=>'string', 'value='=>'string', 'expires='=>'string', 'path='=>'string', 'domain='=>'string', 'secure='=>'string', 'httponly='=>'string'], +'swoole\http\response::end' => ['void', 'content='=>'string'], +'swoole\http\response::gzip' => ['ReturnType', 'compress_level='=>'string'], +'swoole\http\response::header' => ['void', 'key'=>'string', 'value'=>'string', 'ucwords='=>'string'], +'swoole\http\response::initHeader' => ['ReturnType'], +'swoole\http\response::rawcookie' => ['ReturnType', 'name'=>'string', 'value='=>'string', 'expires='=>'string', 'path='=>'string', 'domain='=>'string', 'secure='=>'string', 'httponly='=>'string'], +'swoole\http\response::sendfile' => ['ReturnType', 'filename'=>'string', 'offset='=>'int'], +'swoole\http\response::status' => ['ReturnType', 'http_code'=>'string'], +'swoole\http\response::write' => ['void', 'content'=>'string'], +'swoole\http\server::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], +'swoole\http\server::start' => ['void'], +'swoole\lock::__destruct' => ['void'], +'swoole\lock::lock' => ['void'], +'swoole\lock::lock_read' => ['void'], +'swoole\lock::trylock' => ['void'], +'swoole\lock::trylock_read' => ['void'], +'swoole\lock::unlock' => ['void'], +'swoole\mmap::open' => ['ReturnType', 'filename'=>'string', 'size='=>'string', 'offset='=>'string'], +'swoole\mysql::__destruct' => ['void'], +'swoole\mysql::close' => ['void'], +'swoole\mysql::connect' => ['void', 'server_config'=>'array', 'callback'=>'callable'], +'swoole\mysql::getBuffer' => ['ReturnType'], +'swoole\mysql::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], +'swoole\mysql::query' => ['ReturnType', 'sql'=>'string', 'callback'=>'callable'], +'swoole\process::__destruct' => ['void'], +'swoole\process::alarm' => ['void', 'interval_usec'=>'integer'], +'swoole\process::close' => ['void'], +'swoole\process::daemon' => ['void', 'nochdir='=>'bool', 'noclose='=>'bool'], +'swoole\process::exec' => ['ReturnType', 'exec_file'=>'string', 'args'=>'string'], +'swoole\process::exit' => ['void', 'exit_code='=>'string'], +'swoole\process::freeQueue' => ['void'], +'swoole\process::kill' => ['void', 'pid'=>'integer', 'signal_no='=>'string'], +'swoole\process::name' => ['void', 'process_name'=>'string'], +'swoole\process::pop' => ['mixed', 'maxsize='=>'integer'], +'swoole\process::push' => ['bool', 'data'=>'string'], +'swoole\process::read' => ['string', 'maxsize='=>'integer'], +'swoole\process::signal' => ['void', 'signal_no'=>'string', 'callback'=>'callable'], +'swoole\process::start' => ['void'], +'swoole\process::statQueue' => ['array'], +'swoole\process::useQueue' => ['bool', 'key'=>'integer', 'mode='=>'integer'], +'swoole\process::wait' => ['array', 'blocking='=>'bool'], +'swoole\process::write' => ['integer', 'data'=>'string'], +'swoole\redis\server::format' => ['ReturnType', 'type'=>'string', 'value='=>'string'], +'swoole\redis\server::setHandler' => ['ReturnType', 'command'=>'string', 'callback'=>'string', 'number_of_string_param='=>'string', 'type_of_array_param='=>'string'], +'swoole\redis\server::start' => ['ReturnType'], +'swoole\serialize::pack' => ['ReturnType', 'data'=>'string', 'is_fast='=>'int'], +'swoole\serialize::unpack' => ['ReturnType', 'data'=>'string', 'args='=>'string'], +'swoole\server::addlistener' => ['void', 'host'=>'string', 'port'=>'integer', 'socket_type'=>'string'], +'swoole\server::addProcess' => ['bool', 'process'=>'swoole_process'], +'swoole\server::after' => ['ReturnType', 'after_time_ms'=>'integer', 'callback'=>'callable', 'param='=>'string'], +'swoole\server::bind' => ['bool', 'fd'=>'integer', 'uid'=>'integer'], +'swoole\server::close' => ['bool', 'fd'=>'integer', 'reset='=>'bool'], +'swoole\server::confirm' => ['bool', 'fd'=>'integer'], +'swoole\server::connection_info' => ['array', 'fd'=>'integer', 'reactor_id='=>'integer'], +'swoole\server::connection_list' => ['array', 'start_fd'=>'integer', 'pagesize='=>'integer'], +'swoole\server::defer' => ['void', 'callback'=>'callable'], +'swoole\server::exist' => ['bool', 'fd'=>'integer'], +'swoole\server::finish' => ['void', 'data'=>'string'], +'swoole\server::getClientInfo' => ['ReturnType', 'fd'=>'integer', 'reactor_id='=>'integer'], +'swoole\server::getClientList' => ['array', 'start_fd'=>'integer', 'pagesize='=>'integer'], +'swoole\server::getLastError' => ['integer'], +'swoole\server::heartbeat' => ['mixed', 'if_close_connection'=>'bool'], +'swoole\server::listen' => ['bool', 'host'=>'string', 'port'=>'integer', 'socket_type'=>'string'], +'swoole\server::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], +'swoole\server::pause' => ['void', 'fd'=>'integer'], +'swoole\server::protect' => ['void', 'fd'=>'integer', 'is_protected='=>'bool'], +'swoole\server::reload' => ['bool'], +'swoole\server::resume' => ['void', 'fd'=>'integer'], +'swoole\server::send' => ['bool', 'fd'=>'integer', 'data'=>'string', 'reactor_id='=>'integer'], +'swoole\server::sendfile' => ['bool', 'fd'=>'integer', 'filename'=>'string', 'offset='=>'integer'], +'swoole\server::sendMessage' => ['bool', 'worker_id'=>'integer', 'data'=>'string'], +'swoole\server::sendto' => ['bool', 'ip'=>'string', 'port'=>'integer', 'data'=>'string', 'server_socket='=>'string'], +'swoole\server::sendwait' => ['bool', 'fd'=>'integer', 'data'=>'string'], +'swoole\server::set' => ['ReturnType', 'settings'=>'array'], +'swoole\server::shutdown' => ['void'], +'swoole\server::start' => ['void'], +'swoole\server::stats' => ['array'], +'swoole\server::stop' => ['bool', 'worker_id='=>'integer'], +'swoole\server::task' => ['mixed', 'data'=>'string', 'dst_worker_id='=>'integer', 'callback='=>'callable'], +'swoole\server::taskwait' => ['void', 'data'=>'string', 'timeout='=>'float', 'worker_id='=>'integer'], +'swoole\server::taskWaitMulti' => ['void', 'tasks'=>'array', 'timeout_ms='=>'double'], +'swoole\server::tick' => ['void', 'interval_ms'=>'integer', 'callback'=>'callable'], +'swoole\server\port::__destruct' => ['void'], +'swoole\server\port::on' => ['ReturnType', 'event_name'=>'string', 'callback'=>'callable'], +'swoole\server\port::set' => ['void', 'settings'=>'array'], +'swoole\table::column' => ['ReturnType', 'name'=>'string', 'type'=>'string', 'size='=>'integer'], +'swoole\table::count' => ['integer'], +'swoole\table::create' => ['void'], +'swoole\table::current' => ['array'], +'swoole\table::decr' => ['ReturnType', 'key'=>'string', 'column'=>'string', 'decrby='=>'integer'], +'swoole\table::del' => ['void', 'key'=>'string'], +'swoole\table::destroy' => ['void'], +'swoole\table::exist' => ['bool', 'key'=>'string'], +'swoole\table::get' => ['integer', 'row_key'=>'string', 'column_key'=>'string'], +'swoole\table::incr' => ['void', 'key'=>'string', 'column'=>'string', 'incrby='=>'integer'], +'swoole\table::key' => ['string'], +'swoole\table::next' => ['ReturnType'], +'swoole\table::rewind' => ['void'], +'swoole\table::set' => ['VOID', 'key'=>'string', 'value'=>'array'], +'swoole\table::valid' => ['bool'], +'swoole\timer::after' => ['void', 'after_time_ms'=>'int', 'callback'=>'callable'], +'swoole\timer::clear' => ['void', 'timer_id'=>'integer'], +'swoole\timer::exists' => ['bool', 'timer_id'=>'integer'], +'swoole\timer::tick' => ['void', 'interval_ms'=>'integer', 'callback'=>'callable', 'param='=>'string'], +'swoole\websocket\server::exist' => ['bool', 'fd'=>'integer'], +'swoole\websocket\server::on' => ['ReturnType', 'event_name'=>'string', 'callback'=>'callable'], +'swoole\websocket\server::pack' => ['binary', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string', 'mask='=>'string'], +'swoole\websocket\server::push' => ['void', 'fd'=>'string', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string'], +'swoole\websocket\server::unpack' => ['string', 'data'=>'binary'], +'swoole_async_dns_lookup' => ['bool', 'hostname'=>'string', 'callback'=>'callable'], +'swoole_async_read' => ['bool', 'filename'=>'string', 'callback'=>'callable', 'chunk_size='=>'int', 'offset='=>'int'], +'swoole_async_readfile' => ['bool', 'filename'=>'string', 'callback'=>'string'], +'swoole_async_set' => ['void', 'settings'=>'array'], +'swoole_async_write' => ['bool', 'filename'=>'string', 'content'=>'string', 'offset='=>'int', 'callback='=>'callable'], +'swoole_async_writefile' => ['bool', 'filename'=>'string', 'content'=>'string', 'callback='=>'callable', 'flags='=>'int'], +'swoole_client_select' => ['int', 'read_array'=>'array', 'write_array'=>'array', 'error_array'=>'array', 'timeout='=>'float'], +'swoole_cpu_num' => ['int'], +'swoole_errno' => ['int'], +'swoole_event_add' => ['int', 'fd'=>'int', 'read_callback='=>'callable', 'write_callback='=>'callable', 'events='=>'int'], +'swoole_event_defer' => ['bool', 'callback'=>'callable'], +'swoole_event_del' => ['bool', 'fd'=>'int'], +'swoole_event_exit' => ['void'], +'swoole_event_set' => ['bool', 'fd'=>'int', 'read_callback='=>'callable', 'write_callback='=>'callable', 'events='=>'int'], +'swoole_event_wait' => ['void'], +'swoole_event_write' => ['bool', 'fd'=>'int', 'data'=>'string'], +'swoole_get_local_ip' => ['array'], +'swoole_last_error' => ['int'], +'swoole_load_module' => ['mixed', 'filename'=>'string'], +'swoole_select' => ['int', 'read_array'=>'array', 'write_array'=>'array', 'error_array'=>'array', 'timeout='=>'float'], +'swoole_set_process_name' => ['void', 'process_name'=>'string', 'size='=>'int'], +'swoole_strerror' => ['string', 'errno'=>'int', 'error_type='=>'int'], +'swoole_timer_after' => ['int', 'ms'=>'int', 'callback'=>'callable', 'param='=>'mixed'], +'swoole_timer_exists' => ['bool', 'timer_id'=>'int'], +'swoole_timer_tick' => ['int', 'ms'=>'int', 'callback'=>'callable', 'param='=>'mixed'], +'swoole_version' => ['string'], +'symbolObj::__construct' => ['void', 'map'=>'mapObj', 'symbolname'=>'string'], +'symbolObj::free' => ['void'], +'symbolObj::getPatternArray' => ['array'], +'symbolObj::getPointsArray' => ['array'], +'symbolObj::ms_newSymbolObj' => ['int', 'map'=>'mapObj', 'symbolname'=>'string'], +'symbolObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'symbolObj::setImagePath' => ['int', 'filename'=>'string'], +'symbolObj::setPattern' => ['int', 'int'=>'array'], +'symbolObj::setPoints' => ['int', 'double'=>'array'], +'symlink' => ['bool', 'target'=>'string', 'link'=>'string'], +'SyncEvent::__construct' => ['void', 'name='=>'string', 'manual='=>'bool'], +'SyncEvent::fire' => ['bool'], +'SyncEvent::reset' => ['bool'], +'SyncEvent::wait' => ['bool', 'wait='=>'int'], +'SyncMutex::__construct' => ['void', 'name='=>'string'], +'SyncMutex::lock' => ['bool', 'wait='=>'int'], +'SyncMutex::unlock' => ['bool', 'all='=>'bool'], +'SyncReaderWriter::__construct' => ['void', 'name='=>'string', 'autounlock='=>'bool'], +'SyncReaderWriter::readlock' => ['bool', 'wait='=>'int'], +'SyncReaderWriter::readunlock' => ['bool'], +'SyncReaderWriter::writelock' => ['bool', 'wait='=>'int'], +'SyncReaderWriter::writeunlock' => ['bool'], +'SyncSemaphore::__construct' => ['void', 'name='=>'string', 'initialval='=>'int', 'autounlock='=>'bool'], +'SyncSemaphore::lock' => ['bool', 'wait='=>'int'], +'SyncSemaphore::unlock' => ['bool', '&w_prevcount='=>'int'], +'SyncSharedMemory::__construct' => ['void', 'name'=>'string', 'size'=>'int'], +'SyncSharedMemory::first' => ['bool'], +'SyncSharedMemory::read' => ['string', 'start='=>'int', 'length='=>'int'], +'SyncSharedMemory::size' => ['int'], +'SyncSharedMemory::write' => ['int', 'string='=>'string', 'start='=>'int'], +'sys_get_temp_dir' => ['string'], +'sys_getloadavg' => ['array'], +'syslog' => ['bool', 'priority'=>'int', 'message'=>'string'], +'system' => ['string|false', 'command'=>'string', '&w_result_code='=>'int'], +'taint' => ['bool', '&rw_string'=>'string', '&...w_other_strings='=>'string'], +'tan' => ['float', 'num'=>'float'], +'tanh' => ['float', 'num'=>'float'], +'tcpwrap_check' => ['bool', 'daemon'=>'string', 'address'=>'string', 'user='=>'string', 'nodns='=>'bool'], +'tempnam' => ['string|false', 'directory'=>'string', 'prefix'=>'string'], +'textdomain' => ['string', 'domain'=>'string'], +'Thread::__construct' => ['void'], +'Thread::addRef' => ['void'], +'Thread::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], +'Thread::count' => ['int'], +'Thread::delRef' => ['void'], +'Thread::detach' => ['void'], +'Thread::extend' => ['bool', 'class'=>'string'], +'Thread::getCreatorId' => ['int'], +'Thread::getCurrentThread' => ['Thread'], +'Thread::getCurrentThreadId' => ['int'], +'Thread::getRefCount' => ['int'], +'Thread::getTerminationInfo' => ['array'], +'Thread::getThreadId' => ['int'], +'Thread::globally' => ['mixed'], +'Thread::isGarbage' => ['bool'], +'Thread::isJoined' => ['bool'], +'Thread::isRunning' => ['bool'], +'Thread::isStarted' => ['bool'], +'Thread::isTerminated' => ['bool'], +'Thread::isWaiting' => ['bool'], +'Thread::join' => ['bool'], +'Thread::kill' => ['void'], +'Thread::lock' => ['bool'], +'Thread::merge' => ['bool', 'from'=>'', 'overwrite='=>'mixed'], +'Thread::notify' => ['bool'], +'Thread::notifyOne' => ['bool'], +'Thread::offsetExists' => ['bool', 'offset'=>'mixed'], +'Thread::offsetGet' => ['mixed', 'offset'=>'mixed'], +'Thread::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], +'Thread::offsetUnset' => ['void', 'offset'=>'mixed'], +'Thread::pop' => ['bool'], +'Thread::run' => ['void'], +'Thread::setGarbage' => ['void'], +'Thread::shift' => ['bool'], +'Thread::start' => ['bool', 'options='=>'int'], +'Thread::synchronized' => ['mixed', 'block'=>'Closure', '_='=>'mixed'], +'Thread::unlock' => ['bool'], +'Thread::wait' => ['bool', 'timeout='=>'int'], +'Threaded::__construct' => ['void'], +'Threaded::addRef' => ['void'], +'Threaded::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], +'Threaded::count' => ['int'], +'Threaded::delRef' => ['void'], +'Threaded::extend' => ['bool', 'class'=>'string'], +'Threaded::from' => ['Threaded', 'run'=>'Closure', 'construct='=>'Closure', 'args='=>'array'], +'Threaded::getRefCount' => ['int'], +'Threaded::getTerminationInfo' => ['array'], +'Threaded::isGarbage' => ['bool'], +'Threaded::isRunning' => ['bool'], +'Threaded::isTerminated' => ['bool'], +'Threaded::isWaiting' => ['bool'], +'Threaded::lock' => ['bool'], +'Threaded::merge' => ['bool', 'from'=>'mixed', 'overwrite='=>'bool'], +'Threaded::notify' => ['bool'], +'Threaded::notifyOne' => ['bool'], +'Threaded::offsetExists' => ['bool', 'offset'=>'mixed'], +'Threaded::offsetGet' => ['mixed', 'offset'=>'mixed'], +'Threaded::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], +'Threaded::offsetUnset' => ['void', 'offset'=>'mixed'], +'Threaded::pop' => ['bool'], +'Threaded::run' => ['void'], +'Threaded::setGarbage' => ['void'], +'Threaded::shift' => ['mixed'], +'Threaded::synchronized' => ['mixed', 'block'=>'Closure', '...args='=>'mixed'], +'Threaded::unlock' => ['bool'], +'Threaded::wait' => ['bool', 'timeout='=>'int'], +'Throwable::__toString' => ['string'], +'Throwable::getCode' => ['int|string'], +'Throwable::getFile' => ['string'], +'Throwable::getLine' => ['int'], +'Throwable::getMessage' => ['string'], +'Throwable::getPrevious' => ['?Throwable'], +'Throwable::getTrace' => ['list\',args?:array}>'], +'Throwable::getTraceAsString' => ['string'], +'tidy::__construct' => ['void', 'filename='=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], +'tidy::body' => ['tidyNode'], +'tidy::cleanRepair' => ['bool'], +'tidy::diagnose' => ['bool'], +'tidy::getConfig' => ['array'], +'tidy::getHtmlVer' => ['int'], +'tidy::getOpt' => ['mixed', 'option'=>'string'], +'tidy::getOptDoc' => ['string', 'option'=>'string'], +'tidy::getRelease' => ['string'], +'tidy::getStatus' => ['int'], +'tidy::head' => ['tidyNode'], +'tidy::html' => ['tidyNode'], +'tidy::htmlver' => ['int'], +'tidy::isXhtml' => ['bool'], +'tidy::isXml' => ['bool'], +'tidy::parseFile' => ['bool', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], +'tidy::parseString' => ['bool', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], +'tidy::repairFile' => ['string', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], +'tidy::repairString' => ['string', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], +'tidy::root' => ['tidyNode'], +'tidy_access_count' => ['int', 'tidy'=>'tidy'], +'tidy_clean_repair' => ['bool', 'tidy'=>'tidy'], +'tidy_config_count' => ['int', 'tidy'=>'tidy'], +'tidy_diagnose' => ['bool', 'tidy'=>'tidy'], +'tidy_error_count' => ['int', 'tidy'=>'tidy'], +'tidy_get_body' => ['?tidyNode', 'tidy'=>'tidy'], +'tidy_get_config' => ['array', 'tidy'=>'tidy'], +'tidy_get_error_buffer' => ['string', 'tidy'=>'tidy'], +'tidy_get_head' => ['?tidyNode', 'tidy'=>'tidy'], +'tidy_get_html' => ['?tidyNode', 'tidy'=>'tidy'], +'tidy_get_html_ver' => ['int', 'tidy'=>'tidy'], +'tidy_get_opt_doc' => ['string', 'tidy'=>'tidy', 'option'=>'string'], +'tidy_get_output' => ['string', 'tidy'=>'tidy'], +'tidy_get_release' => ['string'], +'tidy_get_root' => ['?tidyNode', 'tidy'=>'tidy'], +'tidy_get_status' => ['int', 'tidy'=>'tidy'], +'tidy_getopt' => ['mixed', 'tidy'=>'string', 'option'=>'tidy'], +'tidy_is_xhtml' => ['bool', 'tidy'=>'tidy'], +'tidy_is_xml' => ['bool', 'tidy'=>'tidy'], +'tidy_load_config' => ['void', 'filename'=>'string', 'encoding'=>'string'], +'tidy_parse_file' => ['tidy', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], +'tidy_parse_string' => ['tidy', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], +'tidy_repair_file' => ['string', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], +'tidy_repair_string' => ['string', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], +'tidy_reset_config' => ['bool'], +'tidy_save_config' => ['bool', 'filename'=>'string'], +'tidy_set_encoding' => ['bool', 'encoding'=>'string'], +'tidy_setopt' => ['bool', 'option'=>'string', 'value'=>'mixed'], +'tidy_warning_count' => ['int', 'tidy'=>'tidy'], +'tidyNode::__construct' => ['void'], +'tidyNode::getParent' => ['tidyNode'], +'tidyNode::hasChildren' => ['bool'], +'tidyNode::hasSiblings' => ['bool'], +'tidyNode::isAsp' => ['bool'], +'tidyNode::isComment' => ['bool'], +'tidyNode::isHtml' => ['bool'], +'tidyNode::isJste' => ['bool'], +'tidyNode::isPhp' => ['bool'], +'tidyNode::isText' => ['bool'], +'time' => ['positive-int'], +'time_nanosleep' => ['array{0:0|positive-int,1:0|positive-int}|bool', 'seconds'=>'positive-int', 'nanoseconds'=>'positive-int'], +'time_sleep_until' => ['bool', 'timestamp'=>'float'], +'timezone_abbreviations_list' => ['array>|false'], +'timezone_identifiers_list' => ['list', 'timezoneGroup='=>'int', 'countryCode='=>'?string'], +'timezone_location_get' => ['array|false', 'object'=>'DateTimeZone'], +'timezone_name_from_abbr' => ['string|false', 'abbr'=>'string', 'utcOffset='=>'int', 'isDST='=>'int'], +'timezone_name_get' => ['string', 'object'=>'DateTimeZone'], +'timezone_offset_get' => ['int|false', 'object'=>'DateTimeZone', 'datetime'=>'DateTimeInterface'], +'timezone_open' => ['DateTimeZone|false', 'timezone'=>'string'], +'timezone_transitions_get' => ['list|false', 'object'=>'DateTimeZone', 'timestampBegin='=>'int', 'timestampEnd='=>'int'], +'timezone_version_get' => ['string'], +'tmpfile' => ['resource|false'], +'token_get_all' => ['list', 'code'=>'string', 'flags='=>'int'], +'token_name' => ['string', 'id'=>'int'], +'TokyoTyrant::__construct' => ['void', 'host='=>'string', 'port='=>'int', 'options='=>'array'], +'TokyoTyrant::add' => ['int|float', 'key'=>'string', 'increment'=>'float', 'type='=>'int'], +'TokyoTyrant::connect' => ['TokyoTyrant', 'host'=>'string', 'port='=>'int', 'options='=>'array'], +'TokyoTyrant::connectUri' => ['TokyoTyrant', 'uri'=>'string'], +'TokyoTyrant::copy' => ['TokyoTyrant', 'path'=>'string'], +'TokyoTyrant::ext' => ['string', 'name'=>'string', 'options'=>'int', 'key'=>'string', 'value'=>'string'], +'TokyoTyrant::fwmKeys' => ['array', 'prefix'=>'string', 'max_recs'=>'int'], +'TokyoTyrant::get' => ['array', 'keys'=>'mixed'], +'TokyoTyrant::getIterator' => ['TokyoTyrantIterator'], +'TokyoTyrant::num' => ['int'], +'TokyoTyrant::out' => ['string', 'keys'=>'mixed'], +'TokyoTyrant::put' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], +'TokyoTyrant::putCat' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], +'TokyoTyrant::putKeep' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], +'TokyoTyrant::putNr' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], +'TokyoTyrant::putShl' => ['mixed', 'key'=>'string', 'value'=>'string', 'width'=>'int'], +'TokyoTyrant::restore' => ['mixed', 'log_dir'=>'string', 'timestamp'=>'int', 'check_consistency='=>'bool'], +'TokyoTyrant::setMaster' => ['mixed', 'host'=>'string', 'port'=>'int', 'timestamp'=>'int', 'check_consistency='=>'bool'], +'TokyoTyrant::size' => ['int', 'key'=>'string'], +'TokyoTyrant::stat' => ['array'], +'TokyoTyrant::sync' => ['mixed'], +'TokyoTyrant::tune' => ['TokyoTyrant', 'timeout'=>'float', 'options='=>'int'], +'TokyoTyrant::vanish' => ['mixed'], +'TokyoTyrantIterator::__construct' => ['void', 'object'=>'mixed'], +'TokyoTyrantIterator::current' => ['mixed'], +'TokyoTyrantIterator::key' => ['mixed'], +'TokyoTyrantIterator::next' => ['mixed'], +'TokyoTyrantIterator::rewind' => ['void'], +'TokyoTyrantIterator::valid' => ['bool'], +'TokyoTyrantQuery::__construct' => ['void', 'table'=>'TokyoTyrantTable'], +'TokyoTyrantQuery::addCond' => ['mixed', 'name'=>'string', 'op'=>'int', 'expr'=>'string'], +'TokyoTyrantQuery::count' => ['int'], +'TokyoTyrantQuery::current' => ['array'], +'TokyoTyrantQuery::hint' => ['string'], +'TokyoTyrantQuery::key' => ['string'], +'TokyoTyrantQuery::metaSearch' => ['array', 'queries'=>'array', 'type'=>'int'], +'TokyoTyrantQuery::next' => ['array'], +'TokyoTyrantQuery::out' => ['TokyoTyrantQuery'], +'TokyoTyrantQuery::rewind' => ['bool'], +'TokyoTyrantQuery::search' => ['array'], +'TokyoTyrantQuery::setLimit' => ['mixed', 'max='=>'int', 'skip='=>'int'], +'TokyoTyrantQuery::setOrder' => ['mixed', 'name'=>'string', 'type'=>'int'], +'TokyoTyrantQuery::valid' => ['bool'], +'TokyoTyrantTable::add' => ['void', 'key'=>'string', 'increment'=>'mixed', 'type='=>'string'], +'TokyoTyrantTable::genUid' => ['int'], +'TokyoTyrantTable::get' => ['array', 'keys'=>'mixed'], +'TokyoTyrantTable::getIterator' => ['TokyoTyrantIterator'], +'TokyoTyrantTable::getQuery' => ['TokyoTyrantQuery'], +'TokyoTyrantTable::out' => ['void', 'keys'=>'mixed'], +'TokyoTyrantTable::put' => ['int', 'key'=>'string', 'columns'=>'array'], +'TokyoTyrantTable::putCat' => ['void', 'key'=>'string', 'columns'=>'array'], +'TokyoTyrantTable::putKeep' => ['void', 'key'=>'string', 'columns'=>'array'], +'TokyoTyrantTable::putNr' => ['void', 'keys'=>'mixed', 'value='=>'string'], +'TokyoTyrantTable::putShl' => ['void', 'key'=>'string', 'value'=>'string', 'width'=>'int'], +'TokyoTyrantTable::setIndex' => ['mixed', 'column'=>'string', 'type'=>'int'], +'touch' => ['bool', 'filename'=>'string', 'mtime='=>'int', 'atime='=>'int'], +'trader_acos' => ['array', 'real'=>'array'], +'trader_ad' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array'], +'trader_add' => ['array', 'real0'=>'array', 'real1'=>'array'], +'trader_adosc' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int'], +'trader_adx' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], +'trader_adxr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], +'trader_apo' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'mAType='=>'int'], +'trader_aroon' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], +'trader_aroonosc' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], +'trader_asin' => ['array', 'real'=>'array'], +'trader_atan' => ['array', 'real'=>'array'], +'trader_atr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], +'trader_avgprice' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_bbands' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDevUp='=>'float', 'nbDevDn='=>'float', 'mAType='=>'int'], +'trader_beta' => ['array', 'real0'=>'array', 'real1'=>'array', 'timePeriod='=>'int'], +'trader_bop' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cci' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], +'trader_cdl2crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdl3blackcrows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdl3inside' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdl3linestrike' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdl3outside' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdl3starsinsouth' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdl3whitesoldiers' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlabandonedbaby' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], +'trader_cdladvanceblock' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlbelthold' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlbreakaway' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlclosingmarubozu' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlconcealbabyswall' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlcounterattack' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdldarkcloudcover' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], +'trader_cdldoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdldojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdldragonflydoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlengulfing' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdleveningdojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], +'trader_cdleveningstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], +'trader_cdlgapsidesidewhite' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlgravestonedoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlhammer' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlhangingman' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlharami' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlharamicross' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlhighwave' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlhikkake' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlhikkakemod' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlhomingpigeon' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlidentical3crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlinneck' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlinvertedhammer' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlkicking' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlkickingbylength' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlladderbottom' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdllongleggeddoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdllongline' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlmarubozu' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlmatchinglow' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlmathold' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], +'trader_cdlmorningdojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], +'trader_cdlmorningstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], +'trader_cdlonneck' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlpiercing' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlrickshawman' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlrisefall3methods' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlseparatinglines' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlshootingstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlshortline' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlspinningtop' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlstalledpattern' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlsticksandwich' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdltakuri' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdltasukigap' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlthrusting' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdltristar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlunique3river' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlupsidegap2crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_cdlxsidegap3methods' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_ceil' => ['array', 'real'=>'array'], +'trader_cmo' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_correl' => ['array', 'real0'=>'array', 'real1'=>'array', 'timePeriod='=>'int'], +'trader_cos' => ['array', 'real'=>'array'], +'trader_cosh' => ['array', 'real'=>'array'], +'trader_dema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_div' => ['array', 'real0'=>'array', 'real1'=>'array'], +'trader_dx' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], +'trader_ema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_errno' => ['int'], +'trader_exp' => ['array', 'real'=>'array'], +'trader_floor' => ['array', 'real'=>'array'], +'trader_get_compat' => ['int'], +'trader_get_unstable_period' => ['int', 'functionId'=>'int'], +'trader_ht_dcperiod' => ['array', 'real'=>'array'], +'trader_ht_dcphase' => ['array', 'real'=>'array'], +'trader_ht_phasor' => ['array', 'real'=>'array'], +'trader_ht_sine' => ['array', 'real'=>'array'], +'trader_ht_trendline' => ['array', 'real'=>'array'], +'trader_ht_trendmode' => ['array', 'real'=>'array'], +'trader_kama' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_linearreg' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_linearreg_angle' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_linearreg_intercept' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_linearreg_slope' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_ln' => ['array', 'real'=>'array'], +'trader_log10' => ['array', 'real'=>'array'], +'trader_ma' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'mAType='=>'int'], +'trader_macd' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'signalPeriod='=>'int'], +'trader_macdext' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'fastMAType='=>'int', 'slowPeriod='=>'int', 'slowMAType='=>'int', 'signalPeriod='=>'int', 'signalMAType='=>'int'], +'trader_macdfix' => ['array', 'real'=>'array', 'signalPeriod='=>'int'], +'trader_mama' => ['array', 'real'=>'array', 'fastLimit='=>'float', 'slowLimit='=>'float'], +'trader_mavp' => ['array', 'real'=>'array', 'periods'=>'array', 'minPeriod='=>'int', 'maxPeriod='=>'int', 'mAType='=>'int'], +'trader_max' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_maxindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_medprice' => ['array', 'high'=>'array', 'low'=>'array'], +'trader_mfi' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array', 'timePeriod='=>'int'], +'trader_midpoint' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_midprice' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], +'trader_min' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_minindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_minmax' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_minmaxindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_minus_di' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], +'trader_minus_dm' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], +'trader_mom' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_mult' => ['array', 'real0'=>'array', 'real1'=>'array'], +'trader_natr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], +'trader_obv' => ['array', 'real'=>'array', 'volume'=>'array'], +'trader_plus_di' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], +'trader_plus_dm' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], +'trader_ppo' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'mAType='=>'int'], +'trader_roc' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_rocp' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_rocr' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_rocr100' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_rsi' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_sar' => ['array', 'high'=>'array', 'low'=>'array', 'acceleration='=>'float', 'maximum='=>'float'], +'trader_sarext' => ['array', 'high'=>'array', 'low'=>'array', 'startValue='=>'float', 'offsetOnReverse='=>'float', 'accelerationInitLong='=>'float', 'accelerationLong='=>'float', 'accelerationMaxLong='=>'float', 'accelerationInitShort='=>'float', 'accelerationShort='=>'float', 'accelerationMaxShort='=>'float'], +'trader_set_compat' => ['void', 'compatId'=>'int'], +'trader_set_unstable_period' => ['void', 'functionId'=>'int', 'timePeriod'=>'int'], +'trader_sin' => ['array', 'real'=>'array'], +'trader_sinh' => ['array', 'real'=>'array'], +'trader_sma' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_sqrt' => ['array', 'real'=>'array'], +'trader_stddev' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDev='=>'float'], +'trader_stoch' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'fastK_Period='=>'int', 'slowK_Period='=>'int', 'slowK_MAType='=>'int', 'slowD_Period='=>'int', 'slowD_MAType='=>'int'], +'trader_stochf' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'fastK_Period='=>'int', 'fastD_Period='=>'int', 'fastD_MAType='=>'int'], +'trader_stochrsi' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'fastK_Period='=>'int', 'fastD_Period='=>'int', 'fastD_MAType='=>'int'], +'trader_sub' => ['array', 'real0'=>'array', 'real1'=>'array'], +'trader_sum' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_t3' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'vFactor='=>'float'], +'trader_tan' => ['array', 'real'=>'array'], +'trader_tanh' => ['array', 'real'=>'array'], +'trader_tema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_trange' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_trima' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_trix' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_tsf' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trader_typprice' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_ultosc' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod1='=>'int', 'timePeriod2='=>'int', 'timePeriod3='=>'int'], +'trader_var' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDev='=>'float'], +'trader_wclprice' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], +'trader_willr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], +'trader_wma' => ['array', 'real'=>'array', 'timePeriod='=>'int'], +'trait_exists' => ['bool', 'trait'=>'string', 'autoload='=>'bool'], +'Transliterator::create' => ['?Transliterator', 'id'=>'string', 'direction='=>'int'], +'Transliterator::createFromRules' => ['?Transliterator', 'rules'=>'string', 'direction='=>'int'], +'Transliterator::createInverse' => ['Transliterator'], +'Transliterator::getErrorCode' => ['int'], +'Transliterator::getErrorMessage' => ['string'], +'Transliterator::listIDs' => ['array'], +'Transliterator::transliterate' => ['string|false', 'subject'=>'string', 'start='=>'int', 'end='=>'int'], +'transliterator_create' => ['?Transliterator', 'id'=>'string', 'direction='=>'int'], +'transliterator_create_from_rules' => ['?Transliterator', 'rules'=>'string', 'direction='=>'int'], +'transliterator_create_inverse' => ['?Transliterator', 'transliterator'=>'Transliterator'], +'transliterator_get_error_code' => ['int', 'transliterator'=>'Transliterator'], +'transliterator_get_error_message' => ['string', 'transliterator'=>'Transliterator'], +'transliterator_list_ids' => ['array'], +'transliterator_transliterate' => ['string|false', 'transliterator'=>'Transliterator|string', 'string'=>'string', 'start='=>'int', 'end='=>'int'], +'trigger_error' => ['bool', 'message'=>'string', 'error_level='=>'256|512|1024|16384'], +'trim' => ['string', 'string'=>'string', 'characters='=>'string'], +'TypeError::__clone' => ['void'], +'TypeError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?TypeError'], +'TypeError::__toString' => ['string'], +'TypeError::getCode' => ['int'], +'TypeError::getFile' => ['string'], +'TypeError::getLine' => ['int'], +'TypeError::getMessage' => ['string'], +'TypeError::getPrevious' => ['Throwable|TypeError|null'], +'TypeError::getTrace' => ['list\',args?:array}>'], +'TypeError::getTraceAsString' => ['string'], +'uasort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], +'ucfirst' => ['string', 'string'=>'string'], +'UConverter::__construct' => ['void', 'destination_encoding='=>'string', 'source_encoding='=>'string'], +'UConverter::convert' => ['string', 'string'=>'string', 'reverse='=>'bool'], +'UConverter::fromUCallback' => ['mixed', 'reason'=>'int', 'source'=>'string', 'codePoint'=>'string', '&w_error'=>'int'], +'UConverter::getAliases' => ['array', 'name'=>'string'], +'UConverter::getAvailable' => ['array'], +'UConverter::getDestinationEncoding' => ['string'], +'UConverter::getDestinationType' => ['int'], +'UConverter::getErrorCode' => ['int'], +'UConverter::getErrorMessage' => ['string'], +'UConverter::getSourceEncoding' => ['string'], +'UConverter::getSourceType' => ['int'], +'UConverter::getStandards' => ['array'], +'UConverter::getSubstChars' => ['string'], +'UConverter::reasonText' => ['string', 'reason='=>'int'], +'UConverter::setDestinationEncoding' => ['bool', 'encoding'=>'string'], +'UConverter::setSourceEncoding' => ['bool', 'encoding'=>'string'], +'UConverter::setSubstChars' => ['bool', 'chars'=>'string'], +'UConverter::toUCallback' => ['mixed', 'reason'=>'int', 'source'=>'string', 'codeUnits'=>'string', '&w_error'=>'int'], +'UConverter::transcode' => ['string', 'string'=>'string', 'toEncoding'=>'string', 'fromEncoding'=>'string', 'options='=>'?array'], +'ucwords' => ['string', 'string'=>'string', 'separators='=>'string'], +'udm_add_search_limit' => ['bool', 'agent'=>'resource', 'var'=>'int', 'value'=>'string'], +'udm_alloc_agent' => ['resource', 'dbaddr'=>'string', 'dbmode='=>'string'], +'udm_alloc_agent_array' => ['resource', 'databases'=>'array'], +'udm_api_version' => ['int'], +'udm_cat_list' => ['array', 'agent'=>'resource', 'category'=>'string'], +'udm_cat_path' => ['array', 'agent'=>'resource', 'category'=>'string'], +'udm_check_charset' => ['bool', 'agent'=>'resource', 'charset'=>'string'], +'udm_check_stored' => ['int', 'agent'=>'', 'link'=>'int', 'doc_id'=>'string'], +'udm_clear_search_limits' => ['bool', 'agent'=>'resource'], +'udm_close_stored' => ['int', 'agent'=>'', 'link'=>'int'], +'udm_crc32' => ['int', 'agent'=>'resource', 'string'=>'string'], +'udm_errno' => ['int', 'agent'=>'resource'], +'udm_error' => ['string', 'agent'=>'resource'], +'udm_find' => ['resource', 'agent'=>'resource', 'query'=>'string'], +'udm_free_agent' => ['int', 'agent'=>'resource'], +'udm_free_ispell_data' => ['bool', 'agent'=>'int'], +'udm_free_res' => ['bool', 'res'=>'resource'], +'udm_get_doc_count' => ['int', 'agent'=>'resource'], +'udm_get_res_field' => ['string', 'res'=>'resource', 'row'=>'int', 'field'=>'int'], +'udm_get_res_param' => ['string', 'res'=>'resource', 'param'=>'int'], +'udm_hash32' => ['int', 'agent'=>'resource', 'string'=>'string'], +'udm_load_ispell_data' => ['bool', 'agent'=>'resource', 'var'=>'int', 'val1'=>'string', 'val2'=>'string', 'flag'=>'int'], +'udm_open_stored' => ['int', 'agent'=>'', 'storedaddr'=>'string'], +'udm_set_agent_param' => ['bool', 'agent'=>'resource', 'var'=>'int', 'val'=>'string'], +'ui\area::onDraw' => ['', 'pen'=>'UI\Draw\Pen', 'areaSize'=>'UI\Size', 'clipPoint'=>'UI\Point', 'clipSize'=>'UI\Size'], +'ui\area::onKey' => ['', 'key'=>'string', 'ext'=>'int', 'flags'=>'int'], +'ui\area::onMouse' => ['', 'areaPoint'=>'UI\Point', 'areaSize'=>'UI\Size', 'flags'=>'int'], +'ui\area::redraw' => [''], +'ui\area::scrollTo' => ['', 'point'=>'UI\Point', 'size'=>'UI\Size'], +'ui\area::setSize' => ['', 'size'=>'UI\Size'], +'ui\control::destroy' => [''], +'ui\control::disable' => [''], +'ui\control::enable' => [''], +'ui\control::getParent' => ['UI\Control'], +'ui\control::getTopLevel' => ['int'], +'ui\control::hide' => [''], +'ui\control::isEnabled' => ['bool'], +'ui\control::isVisible' => ['bool'], +'ui\control::setParent' => ['', 'parent'=>'UI\Control'], +'ui\control::show' => [''], +'ui\controls\box::append' => ['int', 'control'=>'Control', 'stretchy='=>'bool'], +'ui\controls\box::delete' => ['bool', 'index'=>'int'], +'ui\controls\box::getOrientation' => ['int'], +'ui\controls\box::isPadded' => ['bool'], +'ui\controls\box::setPadded' => ['', 'padded'=>'bool'], +'ui\controls\button::getText' => ['string'], +'ui\controls\button::onClick' => [''], +'ui\controls\button::setText' => ['', 'text'=>'string'], +'ui\controls\check::getText' => ['string'], +'ui\controls\check::isChecked' => ['bool'], +'ui\controls\check::onToggle' => [''], +'ui\controls\check::setChecked' => ['', 'checked'=>'bool'], +'ui\controls\check::setText' => ['', 'text'=>'string'], +'ui\controls\colorbutton::getColor' => ['UI\Color'], +'ui\controls\colorbutton::onChange' => [''], +'ui\controls\combo::append' => ['', 'text'=>'string'], +'ui\controls\combo::getSelected' => ['int'], +'ui\controls\combo::onSelected' => [''], +'ui\controls\combo::setSelected' => ['', 'index'=>'int'], +'ui\controls\editablecombo::append' => ['', 'text'=>'string'], +'ui\controls\editablecombo::getText' => ['string'], +'ui\controls\editablecombo::onChange' => [''], +'ui\controls\editablecombo::setText' => ['', 'text'=>'string'], +'ui\controls\entry::getText' => ['string'], +'ui\controls\entry::isReadOnly' => ['bool'], +'ui\controls\entry::onChange' => [''], +'ui\controls\entry::setReadOnly' => ['', 'readOnly'=>'bool'], +'ui\controls\entry::setText' => ['', 'text'=>'string'], +'ui\controls\form::append' => ['int', 'label'=>'string', 'control'=>'UI\Control', 'stretchy='=>'bool'], +'ui\controls\form::delete' => ['bool', 'index'=>'int'], +'ui\controls\form::isPadded' => ['bool'], +'ui\controls\form::setPadded' => ['', 'padded'=>'bool'], +'ui\controls\grid::append' => ['', 'control'=>'UI\Control', 'left'=>'int', 'top'=>'int', 'xspan'=>'int', 'yspan'=>'int', 'hexpand'=>'bool', 'halign'=>'int', 'vexpand'=>'bool', 'valign'=>'int'], +'ui\controls\grid::isPadded' => ['bool'], +'ui\controls\grid::setPadded' => ['', 'padding'=>'bool'], +'ui\controls\group::append' => ['', 'control'=>'UI\Control'], +'ui\controls\group::getTitle' => ['string'], +'ui\controls\group::hasMargin' => ['bool'], +'ui\controls\group::setMargin' => ['', 'margin'=>'bool'], +'ui\controls\group::setTitle' => ['', 'title'=>'string'], +'ui\controls\label::getText' => ['string'], +'ui\controls\label::setText' => ['', 'text'=>'string'], +'ui\controls\multilineentry::append' => ['', 'text'=>'string'], +'ui\controls\multilineentry::getText' => ['string'], +'ui\controls\multilineentry::isReadOnly' => ['bool'], +'ui\controls\multilineentry::onChange' => [''], +'ui\controls\multilineentry::setReadOnly' => ['', 'readOnly'=>'bool'], +'ui\controls\multilineentry::setText' => ['', 'text'=>'string'], +'ui\controls\progress::getValue' => ['int'], +'ui\controls\progress::setValue' => ['', 'value'=>'int'], +'ui\controls\radio::append' => ['', 'text'=>'string'], +'ui\controls\radio::getSelected' => ['int'], +'ui\controls\radio::onSelected' => [''], +'ui\controls\radio::setSelected' => ['', 'index'=>'int'], +'ui\controls\slider::getValue' => ['int'], +'ui\controls\slider::onChange' => [''], +'ui\controls\slider::setValue' => ['', 'value'=>'int'], +'ui\controls\spin::getValue' => ['int'], +'ui\controls\spin::onChange' => [''], +'ui\controls\spin::setValue' => ['', 'value'=>'int'], +'ui\controls\tab::append' => ['int', 'name'=>'string', 'control'=>'UI\Control'], +'ui\controls\tab::delete' => ['bool', 'index'=>'int'], +'ui\controls\tab::hasMargin' => ['bool', 'page'=>'int'], +'ui\controls\tab::insertAt' => ['', 'name'=>'string', 'page'=>'int', 'control'=>'UI\Control'], +'ui\controls\tab::pages' => ['int'], +'ui\controls\tab::setMargin' => ['', 'page'=>'int', 'margin'=>'bool'], +'ui\draw\brush::getColor' => ['UI\Draw\Color'], +'ui\draw\brush\gradient::delStop' => ['int', 'index'=>'int'], +'ui\draw\color::getChannel' => ['float', 'channel'=>'int'], +'ui\draw\color::setChannel' => ['void', 'channel'=>'int', 'value'=>'float'], +'ui\draw\matrix::invert' => [''], +'ui\draw\matrix::isInvertible' => ['bool'], +'ui\draw\matrix::multiply' => ['UI\Draw\Matrix', 'matrix'=>'UI\Draw\Matrix'], +'ui\draw\matrix::rotate' => ['', 'point'=>'UI\Point', 'amount'=>'float'], +'ui\draw\matrix::scale' => ['', 'center'=>'UI\Point', 'point'=>'UI\Point'], +'ui\draw\matrix::skew' => ['', 'point'=>'UI\Point', 'amount'=>'UI\Point'], +'ui\draw\matrix::translate' => ['', 'point'=>'UI\Point'], +'ui\draw\path::addRectangle' => ['', 'point'=>'UI\Point', 'size'=>'UI\Size'], +'ui\draw\path::arcTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], +'ui\draw\path::bezierTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], +'ui\draw\path::closeFigure' => [''], +'ui\draw\path::end' => [''], +'ui\draw\path::lineTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], +'ui\draw\path::newFigure' => ['', 'point'=>'UI\Point'], +'ui\draw\path::newFigureWithArc' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], +'ui\draw\pen::clip' => ['', 'path'=>'UI\Draw\Path'], +'ui\draw\pen::restore' => [''], +'ui\draw\pen::save' => [''], +'ui\draw\pen::transform' => ['', 'matrix'=>'UI\Draw\Matrix'], +'ui\draw\pen::write' => ['', 'point'=>'UI\Point', 'layout'=>'UI\Draw\Text\Layout'], +'ui\draw\stroke::getCap' => ['int'], +'ui\draw\stroke::getJoin' => ['int'], +'ui\draw\stroke::getMiterLimit' => ['float'], +'ui\draw\stroke::getThickness' => ['float'], +'ui\draw\stroke::setCap' => ['', 'cap'=>'int'], +'ui\draw\stroke::setJoin' => ['', 'join'=>'int'], +'ui\draw\stroke::setMiterLimit' => ['', 'limit'=>'float'], +'ui\draw\stroke::setThickness' => ['', 'thickness'=>'float'], +'ui\draw\text\font::getAscent' => ['float'], +'ui\draw\text\font::getDescent' => ['float'], +'ui\draw\text\font::getLeading' => ['float'], +'ui\draw\text\font::getUnderlinePosition' => ['float'], +'ui\draw\text\font::getUnderlineThickness' => ['float'], +'ui\draw\text\font\descriptor::getFamily' => ['string'], +'ui\draw\text\font\descriptor::getItalic' => ['int'], +'ui\draw\text\font\descriptor::getSize' => ['float'], +'ui\draw\text\font\descriptor::getStretch' => ['int'], +'ui\draw\text\font\descriptor::getWeight' => ['int'], +'ui\draw\text\font\fontfamilies' => ['array'], +'ui\draw\text\layout::setWidth' => ['', 'width'=>'float'], +'ui\executor::kill' => ['void'], +'ui\executor::onExecute' => ['void'], +'ui\menu::append' => ['UI\MenuItem', 'name'=>'string', 'type='=>'string'], +'ui\menu::appendAbout' => ['UI\MenuItem', 'type='=>'string'], +'ui\menu::appendCheck' => ['UI\MenuItem', 'name'=>'string', 'type='=>'string'], +'ui\menu::appendPreferences' => ['UI\MenuItem', 'type='=>'string'], +'ui\menu::appendQuit' => ['UI\MenuItem', 'type='=>'string'], +'ui\menu::appendSeparator' => [''], +'ui\menuitem::disable' => [''], +'ui\menuitem::enable' => [''], +'ui\menuitem::isChecked' => ['bool'], +'ui\menuitem::onClick' => [''], +'ui\menuitem::setChecked' => ['', 'checked'=>'bool'], +'ui\point::getX' => ['float'], +'ui\point::getY' => ['float'], +'ui\point::setX' => ['', 'point'=>'float'], +'ui\point::setY' => ['', 'point'=>'float'], +'ui\quit' => ['void'], +'ui\run' => ['void', 'flags='=>'int'], +'ui\size::getHeight' => ['float'], +'ui\size::getWidth' => ['float'], +'ui\size::setHeight' => ['', 'size'=>'float'], +'ui\size::setWidth' => ['', 'size'=>'float'], +'ui\window::add' => ['', 'control'=>'UI\Control'], +'ui\window::error' => ['', 'title'=>'string', 'msg'=>'string'], +'ui\window::getSize' => ['UI\Size'], +'ui\window::getTitle' => ['string'], +'ui\window::hasBorders' => ['bool'], +'ui\window::hasMargin' => ['bool'], +'ui\window::isFullScreen' => ['bool'], +'ui\window::msg' => ['', 'title'=>'string', 'msg'=>'string'], +'ui\window::onClosing' => ['int'], +'ui\window::open' => ['string'], +'ui\window::save' => ['string'], +'ui\window::setBorders' => ['', 'borders'=>'bool'], +'ui\window::setFullScreen' => ['', 'full'=>'bool'], +'ui\window::setMargin' => ['', 'margin'=>'bool'], +'ui\window::setSize' => ['', 'size'=>'UI\Size'], +'ui\window::setTitle' => ['', 'title'=>'string'], +'uksort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], +'umask' => ['int', 'mask='=>'int'], +'UnderflowException::__clone' => ['void'], +'UnderflowException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?UnderflowException'], +'UnderflowException::__toString' => ['string'], +'UnderflowException::getCode' => ['int'], +'UnderflowException::getFile' => ['string'], +'UnderflowException::getLine' => ['int'], +'UnderflowException::getMessage' => ['string'], +'UnderflowException::getPrevious' => ['Throwable|UnderflowException|null'], +'UnderflowException::getTrace' => ['list\',args?:array}>'], +'UnderflowException::getTraceAsString' => ['string'], +'UnexpectedValueException::__clone' => ['void'], +'UnexpectedValueException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?UnexpectedValueException'], +'UnexpectedValueException::__toString' => ['string'], +'UnexpectedValueException::getCode' => ['int'], +'UnexpectedValueException::getFile' => ['string'], +'UnexpectedValueException::getLine' => ['int'], +'UnexpectedValueException::getMessage' => ['string'], +'UnexpectedValueException::getPrevious' => ['Throwable|UnexpectedValueException|null'], +'UnexpectedValueException::getTrace' => ['list\',args?:array}>'], +'UnexpectedValueException::getTraceAsString' => ['string'], +'uniqid' => ['non-empty-string', 'prefix='=>'string', 'more_entropy='=>'bool'], +'unixtojd' => ['int', 'timestamp='=>'int'], +'unlink' => ['bool', 'filename'=>'string', 'context='=>'resource'], +'unpack' => ['array|false', 'format'=>'string', 'string'=>'string', 'offset='=>'int'], +'unregister_tick_function' => ['void', 'callback'=>'callable'], +'unserialize' => ['mixed', 'data'=>'string', 'options='=>'array{allowed_classes?:string[]|bool}'], +'unset' => ['void', 'var='=>'mixed', '...args='=>'mixed'], +'untaint' => ['bool', '&rw_string'=>'string', '&...rw_strings='=>'string'], +'uopz_allow_exit' => ['void', 'allow'=>'bool'], +'uopz_backup' => ['void', 'class'=>'string', 'function'=>'string'], +'uopz_backup\'1' => ['void', 'function'=>'string'], +'uopz_compose' => ['void', 'name'=>'string', 'classes'=>'array', 'methods='=>'array', 'properties='=>'array', 'flags='=>'int'], +'uopz_copy' => ['Closure', 'class'=>'string', 'function'=>'string'], +'uopz_copy\'1' => ['Closure', 'function'=>'string'], +'uopz_delete' => ['void', 'class'=>'string', 'function'=>'string'], +'uopz_delete\'1' => ['void', 'function'=>'string'], +'uopz_extend' => ['bool', 'class'=>'string', 'parent'=>'string'], +'uopz_flags' => ['int', 'class'=>'string', 'function'=>'string', 'flags'=>'int'], +'uopz_flags\'1' => ['int', 'function'=>'string', 'flags'=>'int'], +'uopz_function' => ['void', 'class'=>'string', 'function'=>'string', 'handler'=>'Closure', 'modifiers='=>'int'], +'uopz_function\'1' => ['void', 'function'=>'string', 'handler'=>'Closure', 'modifiers='=>'int'], +'uopz_get_exit_status' => ['?int'], +'uopz_get_hook' => ['?Closure', 'class'=>'string', 'function'=>'string'], +'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_static' => ['?array', 'class'=>'string', 'function'=>'string'], +'uopz_implement' => ['bool', 'class'=>'string', 'interface'=>'string'], +'uopz_overload' => ['void', 'opcode'=>'int', 'callable'=>'Callable'], +'uopz_redefine' => ['bool', 'class'=>'string', 'constant'=>'string', 'value'=>'mixed'], +'uopz_redefine\'1' => ['bool', 'constant'=>'string', 'value'=>'mixed'], +'uopz_rename' => ['void', 'class'=>'string', 'function'=>'string', 'rename'=>'string'], +'uopz_rename\'1' => ['void', 'function'=>'string', 'rename'=>'string'], +'uopz_restore' => ['void', 'class'=>'string', 'function'=>'string'], +'uopz_restore\'1' => ['void', 'function'=>'string'], +'uopz_set_hook' => ['bool', 'class'=>'string', 'function'=>'string', 'hook'=>'Closure'], +'uopz_set_hook\'1' => ['bool', 'function'=>'string', 'hook'=>'Closure'], +'uopz_set_mock' => ['void', 'class'=>'string', 'mock'=>'object|string'], +'uopz_set_property' => ['void', 'class'=>'object|string', 'property'=>'string', 'value'=>'mixed'], +'uopz_set_return' => ['bool', 'class'=>'string', 'function'=>'string', 'value'=>'mixed', 'execute='=>'bool'], +'uopz_set_return\'1' => ['bool', 'function'=>'string', 'value'=>'mixed', 'execute='=>'bool'], +'uopz_set_static' => ['void', 'class'=>'string', 'function'=>'string', 'static'=>'array'], +'uopz_undefine' => ['bool', 'class'=>'string', 'constant'=>'string'], +'uopz_undefine\'1' => ['bool', 'constant'=>'string'], +'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\'1' => ['bool', 'function'=>'string'], +'urldecode' => ['string', 'string'=>'string'], +'urlencode' => ['string', 'string'=>'string'], +'use_soap_error_handler' => ['bool', 'enable='=>'bool'], +'user_error' => ['void', 'message'=>'string', 'error_level='=>'int'], +'usleep' => ['void', 'microseconds'=>'positive-int|0'], +'usort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], +'utf8_decode' => ['string', 'string'=>'string'], +'utf8_encode' => ['string', 'string'=>'string'], +'V8Js::__construct' => ['void', 'object_name='=>'string', 'variables='=>'array', 'extensions='=>'array', 'report_uncaught_exceptions='=>'bool', 'snapshot_blob='=>'string'], +'V8Js::clearPendingException' => [''], +'V8Js::compileString' => ['resource', 'script'=>'', 'identifier='=>'string'], +'V8Js::createSnapshot' => ['false|string', 'embed_source'=>'string'], +'V8Js::executeScript' => ['', 'script'=>'resource', 'flags='=>'int', 'time_limit='=>'int', 'memory_limit='=>'int'], +'V8Js::executeString' => ['mixed', 'script'=>'string', 'identifier='=>'string', 'flags='=>'int'], +'V8Js::getExtensions' => ['string[]'], +'V8Js::getPendingException' => ['?V8JsException'], +'V8Js::registerExtension' => ['bool', 'extension_name'=>'string', 'script'=>'string', 'dependencies='=>'array', 'auto_enable='=>'bool'], +'V8Js::setAverageObjectSize' => ['', 'average_object_size'=>'int'], +'V8Js::setMemoryLimit' => ['', 'limit'=>'int'], +'V8Js::setModuleLoader' => ['', 'loader'=>'callable'], +'V8Js::setModuleNormaliser' => ['', 'normaliser'=>'callable'], +'V8Js::setTimeLimit' => ['', 'limit'=>'int'], +'V8JsException::getJsFileName' => ['string'], +'V8JsException::getJsLineNumber' => ['int'], +'V8JsException::getJsSourceLine' => ['int'], +'V8JsException::getJsTrace' => ['string'], +'V8JsScriptException::__clone' => ['void'], +'V8JsScriptException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'V8JsScriptException::__toString' => ['string'], +'V8JsScriptException::__wakeup' => ['void'], +'V8JsScriptException::getCode' => ['int'], +'V8JsScriptException::getFile' => ['string'], +'V8JsScriptException::getJsEndColumn' => ['int'], +'V8JsScriptException::getJsFileName' => ['string'], +'V8JsScriptException::getJsLineNumber' => ['int'], +'V8JsScriptException::getJsSourceLine' => ['string'], +'V8JsScriptException::getJsStartColumn' => ['int'], +'V8JsScriptException::getJsTrace' => ['string'], +'V8JsScriptException::getLine' => ['int'], +'V8JsScriptException::getMessage' => ['string'], +'V8JsScriptException::getPrevious' => ['Exception|Throwable'], +'V8JsScriptException::getTrace' => ['list\',args?:array}>'], +'V8JsScriptException::getTraceAsString' => ['string'], +'var_dump' => ['void', 'value'=>'mixed', '...values='=>'mixed'], +'var_export' => ['?string', 'value'=>'mixed', 'return='=>'bool'], +'VARIANT::__construct' => ['void', 'value='=>'mixed', 'type='=>'int', 'codepage='=>'int'], +'variant_abs' => ['mixed', 'value'=>'mixed'], +'variant_add' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_and' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_cast' => ['VARIANT', 'variant'=>'VARIANT', 'type'=>'int'], +'variant_cat' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_cmp' => ['int', 'left'=>'mixed', 'right'=>'mixed', 'locale_id='=>'int', 'flags='=>'int'], +'variant_date_from_timestamp' => ['VARIANT', 'timestamp'=>'int'], +'variant_date_to_timestamp' => ['int', 'variant'=>'VARIANT'], +'variant_div' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_eqv' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_fix' => ['mixed', 'value'=>'mixed'], +'variant_get_type' => ['int', 'variant'=>'VARIANT'], +'variant_idiv' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_imp' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_int' => ['mixed', 'value'=>'mixed'], +'variant_mod' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_mul' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_neg' => ['mixed', 'value'=>'mixed'], +'variant_not' => ['mixed', 'value'=>'mixed'], +'variant_or' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_pow' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_round' => ['mixed', 'value'=>'mixed', 'decimals'=>'int'], +'variant_set' => ['void', 'variant'=>'object', 'value'=>'mixed'], +'variant_set_type' => ['void', 'variant'=>'object', 'type'=>'int'], +'variant_sub' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'variant_xor' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], +'VarnishAdmin::__construct' => ['void', 'args='=>'array'], +'VarnishAdmin::auth' => ['bool'], +'VarnishAdmin::ban' => ['int', 'vcl_regex'=>'string'], +'VarnishAdmin::banUrl' => ['int', 'vcl_regex'=>'string'], +'VarnishAdmin::clearPanic' => ['int'], +'VarnishAdmin::connect' => ['bool'], +'VarnishAdmin::disconnect' => ['bool'], +'VarnishAdmin::getPanic' => ['string'], +'VarnishAdmin::getParams' => ['array'], +'VarnishAdmin::isRunning' => ['bool'], +'VarnishAdmin::setCompat' => ['void', 'compat'=>'int'], +'VarnishAdmin::setHost' => ['void', 'host'=>'string'], +'VarnishAdmin::setIdent' => ['void', 'ident'=>'string'], +'VarnishAdmin::setParam' => ['int', 'name'=>'string', 'value'=>'string|int'], +'VarnishAdmin::setPort' => ['void', 'port'=>'int'], +'VarnishAdmin::setSecret' => ['void', 'secret'=>'string'], +'VarnishAdmin::setTimeout' => ['void', 'timeout'=>'int'], +'VarnishAdmin::start' => ['int'], +'VarnishAdmin::stop' => ['int'], +'VarnishLog::__construct' => ['void', 'args='=>'array'], +'VarnishLog::getLine' => ['array'], +'VarnishLog::getTagName' => ['string', 'index'=>'int'], +'VarnishStat::__construct' => ['void', 'args='=>'array'], +'VarnishStat::getSnapshot' => ['array'], +'version_compare' => ['bool', 'version1'=>'string', 'version2'=>'string', 'operator'=>'\'<\'|\'lt\'|\'<=\'|\'le\'|\'>\'|\'gt\'|\'>=\'|\'ge\'|\'==\'|\'=\'|\'eq\'|\'!=\'|\'<>\'|\'ne\''], +'version_compare\'1' => ['int', 'version1'=>'string', 'version2'=>'string'], +'vfprintf' => ['int', 'stream'=>'resource', 'format'=>'string', 'values'=>'array'], +'virtual' => ['bool', 'uri'=>'string'], +'vpopmail_add_alias_domain' => ['bool', 'domain'=>'string', 'aliasdomain'=>'string'], +'vpopmail_add_alias_domain_ex' => ['bool', 'olddomain'=>'string', 'newdomain'=>'string'], +'vpopmail_add_domain' => ['bool', 'domain'=>'string', 'dir'=>'string', 'uid'=>'int', 'gid'=>'int'], +'vpopmail_add_domain_ex' => ['bool', 'domain'=>'string', 'passwd'=>'string', 'quota='=>'string', 'bounce='=>'string', 'apop='=>'bool'], +'vpopmail_add_user' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'gecos='=>'string', 'apop='=>'bool'], +'vpopmail_alias_add' => ['bool', 'user'=>'string', 'domain'=>'string', 'alias'=>'string'], +'vpopmail_alias_del' => ['bool', 'user'=>'string', 'domain'=>'string'], +'vpopmail_alias_del_domain' => ['bool', 'domain'=>'string'], +'vpopmail_alias_get' => ['array', 'alias'=>'string', 'domain'=>'string'], +'vpopmail_alias_get_all' => ['array', 'domain'=>'string'], +'vpopmail_auth_user' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'apop='=>'string'], +'vpopmail_del_domain' => ['bool', 'domain'=>'string'], +'vpopmail_del_domain_ex' => ['bool', 'domain'=>'string'], +'vpopmail_del_user' => ['bool', 'user'=>'string', 'domain'=>'string'], +'vpopmail_error' => ['string'], +'vpopmail_passwd' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'apop='=>'bool'], +'vpopmail_set_user_quota' => ['bool', 'user'=>'string', 'domain'=>'string', 'quota'=>'string'], +'vprintf' => ['int', 'format'=>'string', 'values'=>'array'], +'vsprintf' => ['string', 'format'=>'string', 'values'=>'array'], +'Vtiful\Kernel\Chart::__construct' => ['void', 'handle'=>'resource', 'type'=>'int'], +'Vtiful\Kernel\Chart::axisNameX' => ['Vtiful\Kernel\Chart', 'name'=>'string'], +'Vtiful\Kernel\Chart::axisNameY' => ['Vtiful\Kernel\Chart', 'name'=>'string'], +'Vtiful\Kernel\Chart::legendSetPosition' => ['Vtiful\Kernel\Chart', 'type'=>'int'], +'Vtiful\Kernel\Chart::series' => ['Vtiful\Kernel\Chart', 'value'=>'string', 'categories='=>'string'], +'Vtiful\Kernel\Chart::seriesName' => ['Vtiful\Kernel\Chart', 'value'=>'string'], +'Vtiful\Kernel\Chart::style' => ['Vtiful\Kernel\Chart', 'style'=>'int'], +'Vtiful\Kernel\Chart::title' => ['Vtiful\Kernel\Chart', 'title'=>'string'], +'Vtiful\Kernel\Chart::toResource' => ['resource'], +'Vtiful\Kernel\Excel::__construct' => ['void', 'config'=>'array'], +'Vtiful\Kernel\Excel::activateSheet' => ['bool', 'sheet_name'=>'string'], +'Vtiful\Kernel\Excel::addSheet' => ['Vtiful\Kernel\Excel', 'sheet_name='=>'?string'], +'Vtiful\Kernel\Excel::autoFilter' => ['Vtiful\Kernel\Excel', 'range'=>'string'], +'Vtiful\Kernel\Excel::checkoutSheet' => ['Vtiful\Kernel\Excel', 'sheet_name'=>'string'], +'Vtiful\Kernel\Excel::close' => ['Vtiful\Kernel\Excel'], +'Vtiful\Kernel\Excel::columnIndexFromString' => ['int', 'index'=>'string'], +'Vtiful\Kernel\Excel::constMemory' => ['Vtiful\Kernel\Excel', 'file_name'=>'string', 'sheet_name='=>'?string'], +'Vtiful\Kernel\Excel::data' => ['Vtiful\Kernel\Excel', 'data'=>'array'], +'Vtiful\Kernel\Excel::defaultFormat' => ['Vtiful\Kernel\Excel', 'format_handle'=>'resource'], +'Vtiful\Kernel\Excel::existSheet' => ['bool', 'sheet_name'=>'string'], +'Vtiful\Kernel\Excel::fileName' => ['Vtiful\Kernel\Excel', 'file_name'=>'string', 'sheet_name='=>'?string'], +'Vtiful\Kernel\Excel::freezePanes' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int'], +'Vtiful\Kernel\Excel::getHandle' => ['resource'], +'Vtiful\Kernel\Excel::getSheetData' => ['array|false'], +'Vtiful\Kernel\Excel::gridline' => ['Vtiful\Kernel\Excel', 'option='=>'int'], +'Vtiful\Kernel\Excel::header' => ['Vtiful\Kernel\Excel', 'header'=>'array', 'format_handle='=>'?resource'], +'Vtiful\Kernel\Excel::insertChart' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'chart_resource'=>'resource'], +'Vtiful\Kernel\Excel::insertComment' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'comment'=>'string'], +'Vtiful\Kernel\Excel::insertDate' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'timestamp'=>'int', 'format='=>'?string', 'format_handle='=>'?resource'], +'Vtiful\Kernel\Excel::insertFormula' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'formula'=>'string', 'format_handle='=>'?resource'], +'Vtiful\Kernel\Excel::insertImage' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'image'=>'string', 'width='=>'?float', 'height='=>'?float'], +'Vtiful\Kernel\Excel::insertText' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'data'=>'int|string|double', 'format='=>'?string', 'format_handle='=>'?resource'], +'Vtiful\Kernel\Excel::insertUrl' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'url'=>'string', 'text='=>'?string', 'tool_tip='=>'?string', 'format='=>'?resource'], +'Vtiful\Kernel\Excel::mergeCells' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'data'=>'string', 'format_handle='=>'?resource'], +'Vtiful\Kernel\Excel::nextCellCallback' => ['void', 'fci'=>'callable(int,int,mixed)', 'sheet_name='=>'?string'], +'Vtiful\Kernel\Excel::nextRow' => ['array|false', 'zv_type_t='=>'?array'], +'Vtiful\Kernel\Excel::openFile' => ['Vtiful\Kernel\Excel', 'zs_file_name'=>'string'], +'Vtiful\Kernel\Excel::openSheet' => ['Vtiful\Kernel\Excel', 'zs_sheet_name='=>'?string', 'zl_flag='=>'?int'], +'Vtiful\Kernel\Excel::output' => ['string'], +'Vtiful\Kernel\Excel::protection' => ['Vtiful\Kernel\Excel', 'password='=>'?string'], +'Vtiful\Kernel\Excel::putCSV' => ['bool', 'fp'=>'resource', 'delimiter_str='=>'?string', 'enclosure_str='=>'?string', 'escape_str='=>'?string'], +'Vtiful\Kernel\Excel::putCSVCallback' => ['bool', 'callback'=>'callable(array):array', 'fp'=>'resource', 'delimiter_str='=>'?string', 'enclosure_str='=>'?string', 'escape_str='=>'?string'], +'Vtiful\Kernel\Excel::setColumn' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'width'=>'float', 'format_handle='=>'?resource'], +'Vtiful\Kernel\Excel::setCurrentSheetHide' => ['Vtiful\Kernel\Excel'], +'Vtiful\Kernel\Excel::setCurrentSheetIsFirst' => ['Vtiful\Kernel\Excel'], +'Vtiful\Kernel\Excel::setGlobalType' => ['Vtiful\Kernel\Excel', 'zv_type_t'=>'int'], +'Vtiful\Kernel\Excel::setLandscape' => ['Vtiful\Kernel\Excel'], +'Vtiful\Kernel\Excel::setMargins' => ['Vtiful\Kernel\Excel', 'left='=>'?float', 'right='=>'?float', 'top='=>'?float', 'bottom='=>'?float'], +'Vtiful\Kernel\Excel::setPaper' => ['Vtiful\Kernel\Excel', 'paper'=>'int'], +'Vtiful\Kernel\Excel::setPortrait' => ['Vtiful\Kernel\Excel'], +'Vtiful\Kernel\Excel::setRow' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'height'=>'float', 'format_handle='=>'?resource'], +'Vtiful\Kernel\Excel::setSkipRows' => ['Vtiful\Kernel\Excel', 'zv_skip_t'=>'int'], +'Vtiful\Kernel\Excel::setType' => ['Vtiful\Kernel\Excel', 'zv_type_t'=>'array'], +'Vtiful\Kernel\Excel::sheetList' => ['array'], +'Vtiful\Kernel\Excel::showComment' => ['Vtiful\Kernel\Excel'], +'Vtiful\Kernel\Excel::stringFromColumnIndex' => ['string', 'index'=>'int'], +'Vtiful\Kernel\Excel::timestampFromDateDouble' => ['int', 'index'=>'?float'], +'Vtiful\Kernel\Excel::validation' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'validation_resource'=>'resource'], +'Vtiful\Kernel\Excel::zoom' => ['Vtiful\Kernel\Excel', 'scale'=>'int'], +'Vtiful\Kernel\Format::__construct' => ['void', 'handle'=>'resource'], +'Vtiful\Kernel\Format::align' => ['Vtiful\Kernel\Format', '...style'=>'int'], +'Vtiful\Kernel\Format::background' => ['Vtiful\Kernel\Format', 'color'=>'int', 'pattern='=>'int'], +'Vtiful\Kernel\Format::bold' => ['Vtiful\Kernel\Format'], +'Vtiful\Kernel\Format::border' => ['Vtiful\Kernel\Format', 'style'=>'int'], +'Vtiful\Kernel\Format::font' => ['Vtiful\Kernel\Format', 'font'=>'string'], +'Vtiful\Kernel\Format::fontColor' => ['Vtiful\Kernel\Format', 'color'=>'int'], +'Vtiful\Kernel\Format::fontSize' => ['Vtiful\Kernel\Format', 'size'=>'float'], +'Vtiful\Kernel\Format::italic' => ['Vtiful\Kernel\Format'], +'Vtiful\Kernel\Format::number' => ['Vtiful\Kernel\Format', 'format'=>'string'], +'Vtiful\Kernel\Format::strikeout' => ['Vtiful\Kernel\Format'], +'Vtiful\Kernel\Format::toResource' => ['resource'], +'Vtiful\Kernel\Format::underline' => ['Vtiful\Kernel\Format', 'style'=>'int'], +'Vtiful\Kernel\Format::unlocked' => ['Vtiful\Kernel\Format'], +'Vtiful\Kernel\Format::wrap' => ['Vtiful\Kernel\Format'], +'Vtiful\Kernel\Validation::__construct' => ['void'], +'Vtiful\Kernel\Validation::criteriaType' => ['?Vtiful\Kernel\Validation', 'type'=>'int'], +'Vtiful\Kernel\Validation::maximumFormula' => ['?Vtiful\Kernel\Validation', 'maximum_formula'=>'string'], +'Vtiful\Kernel\Validation::maximumNumber' => ['?Vtiful\Kernel\Validation', 'maximum_number'=>'float'], +'Vtiful\Kernel\Validation::minimumFormula' => ['?Vtiful\Kernel\Validation', 'minimum_formula'=>'string'], +'Vtiful\Kernel\Validation::minimumNumber' => ['?Vtiful\Kernel\Validation', 'minimum_number'=>'float'], +'Vtiful\Kernel\Validation::toResource' => ['resource'], +'Vtiful\Kernel\Validation::validationType' => ['?Vtiful\Kernel\Validation', 'type'=>'int'], +'Vtiful\Kernel\Validation::valueList' => ['?Vtiful\Kernel\Validation', 'value_list'=>'array'], +'Vtiful\Kernel\Validation::valueNumber' => ['?Vtiful\Kernel\Validation', 'value_number'=>'int'], +'w32api_deftype' => ['bool', 'typename'=>'string', 'member1_type'=>'string', 'member1_name'=>'string', '...args='=>'string'], +'w32api_init_dtype' => ['resource', 'typename'=>'string', 'value'=>'', '...args='=>''], +'w32api_invoke_function' => ['', 'funcname'=>'string', 'argument'=>'', '...args='=>''], +'w32api_register_function' => ['bool', 'library'=>'string', 'function_name'=>'string', 'return_type'=>'string'], +'w32api_set_call_method' => ['', 'method'=>'int'], +'wddx_add_vars' => ['bool', 'packet_id'=>'resource', 'var_names'=>'mixed', '...vars='=>'mixed'], +'wddx_deserialize' => ['mixed', 'packet'=>'string'], +'wddx_packet_end' => ['string', 'packet_id'=>'resource'], +'wddx_packet_start' => ['resource|false', 'comment='=>'string'], +'wddx_serialize_value' => ['string|false', 'value'=>'mixed', 'comment='=>'string'], +'wddx_serialize_vars' => ['string|false', 'var_name'=>'mixed', '...vars='=>'mixed'], +'WeakMap::__construct' => ['void'], +'WeakMap::count' => ['int'], +'WeakMap::current' => ['mixed'], +'WeakMap::key' => ['object'], +'WeakMap::next' => ['void'], +'WeakMap::offsetExists' => ['bool', 'object'=>'object'], +'WeakMap::offsetGet' => ['mixed', 'object'=>'object'], +'WeakMap::offsetSet' => ['void', 'object'=>'object', 'value'=>'mixed'], +'WeakMap::offsetUnset' => ['void', 'object'=>'object'], +'WeakMap::rewind' => ['void'], +'WeakMap::valid' => ['bool'], +'Weakref::acquire' => ['bool'], +'Weakref::get' => ['object'], +'Weakref::release' => ['bool'], +'Weakref::valid' => ['bool'], +'webObj::convertToString' => ['string'], +'webObj::free' => ['void'], +'webObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], +'webObj::updateFromString' => ['int', 'snippet'=>'string'], +'win32_continue_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], +'win32_create_service' => ['int|false', 'details'=>'array', 'machine='=>'string'], +'win32_delete_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], +'win32_get_last_control_message' => ['int'], +'win32_pause_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], +'win32_ps_list_procs' => ['array'], +'win32_ps_stat_mem' => ['array'], +'win32_ps_stat_proc' => ['array', 'pid='=>'int'], +'win32_query_service_status' => ['array|false|int', 'servicename'=>'string', 'machine='=>'string'], +'win32_send_custom_control' => ['int', 'servicename'=>'string', 'control'=>'int', 'machine='=>'string'], +'win32_set_service_exit_code' => ['int', 'exitCode='=>'int'], +'win32_set_service_exit_mode' => ['bool', 'gracefulMode='=>'bool'], +'win32_set_service_status' => ['bool|int', 'status'=>'int', 'checkpoint='=>'int'], +'win32_start_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], +'win32_start_service_ctrl_dispatcher' => ['bool|int', 'name'=>'string'], +'win32_stop_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], +'wincache_fcache_fileinfo' => ['array|false', 'summaryonly='=>'bool'], +'wincache_fcache_meminfo' => ['array|false'], +'wincache_lock' => ['bool', 'key'=>'string', 'isglobal='=>'bool'], +'wincache_ocache_fileinfo' => ['array|false', 'summaryonly='=>'bool'], +'wincache_ocache_meminfo' => ['array|false'], +'wincache_refresh_if_changed' => ['bool', 'files='=>'array'], +'wincache_rplist_fileinfo' => ['array|false', 'summaryonly='=>'bool'], +'wincache_rplist_meminfo' => ['array|false'], +'wincache_scache_info' => ['array|false', 'summaryonly='=>'bool'], +'wincache_scache_meminfo' => ['array|false'], +'wincache_ucache_add' => ['bool', 'key'=>'string', 'value'=>'mixed', 'ttl='=>'int'], +'wincache_ucache_add\'1' => ['bool', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], +'wincache_ucache_cas' => ['bool', 'key'=>'string', 'old_value'=>'int', 'new_value'=>'int'], +'wincache_ucache_clear' => ['bool'], +'wincache_ucache_dec' => ['int|false', 'key'=>'string', 'dec_by='=>'int', 'success='=>'bool'], +'wincache_ucache_delete' => ['bool', 'key'=>'mixed'], +'wincache_ucache_exists' => ['bool', 'key'=>'string'], +'wincache_ucache_get' => ['mixed', 'key'=>'mixed', '&w_success='=>'bool'], +'wincache_ucache_inc' => ['int|false', 'key'=>'string', 'inc_by='=>'int', 'success='=>'bool'], +'wincache_ucache_info' => ['array|false', 'summaryonly='=>'bool', 'key='=>'string'], +'wincache_ucache_meminfo' => ['array|false'], +'wincache_ucache_set' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int'], +'wincache_ucache_set\'1' => ['bool', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], +'wincache_unlock' => ['bool', 'key'=>'string'], +'wkhtmltox\image\converter::convert' => ['?string'], +'wkhtmltox\image\converter::getVersion' => ['string'], +'wkhtmltox\pdf\converter::add' => ['void', 'object'=>'wkhtmltox\PDF\Object'], +'wkhtmltox\pdf\converter::convert' => ['?string'], +'wkhtmltox\pdf\converter::getVersion' => ['string'], +'wordwrap' => ['string', 'string'=>'string', 'width='=>'int', 'break='=>'string', 'cut_long_words='=>'bool'], +'Worker::__construct' => ['void'], +'Worker::addRef' => ['void'], +'Worker::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], +'Worker::collect' => ['int', 'collector='=>'Callable'], +'Worker::count' => ['int'], +'Worker::delRef' => ['void'], +'Worker::detach' => ['void'], +'Worker::extend' => ['bool', 'class'=>'string'], +'Worker::getCreatorId' => ['int'], +'Worker::getCurrentThread' => ['Thread'], +'Worker::getCurrentThreadId' => ['int'], +'Worker::getRefCount' => ['int'], +'Worker::getStacked' => ['int'], +'Worker::getTerminationInfo' => ['array'], +'Worker::getThreadId' => ['int'], +'Worker::globally' => ['mixed'], +'Worker::isGarbage' => ['bool'], +'Worker::isJoined' => ['bool'], +'Worker::isRunning' => ['bool'], +'Worker::isShutdown' => ['bool'], +'Worker::isStarted' => ['bool'], +'Worker::isTerminated' => ['bool'], +'Worker::isWaiting' => ['bool'], +'Worker::isWorking' => ['bool'], +'Worker::join' => ['bool'], +'Worker::kill' => ['bool'], +'Worker::lock' => ['bool'], +'Worker::merge' => ['bool', 'from'=>'', 'overwrite='=>'mixed'], +'Worker::notify' => ['bool'], +'Worker::notifyOne' => ['bool'], +'Worker::offsetExists' => ['bool', 'offset'=>'mixed'], +'Worker::offsetGet' => ['mixed', 'offset'=>'mixed'], +'Worker::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], +'Worker::offsetUnset' => ['void', 'offset'=>'mixed'], +'Worker::pop' => ['bool'], +'Worker::run' => ['void'], +'Worker::setGarbage' => ['void'], +'Worker::shift' => ['bool'], +'Worker::shutdown' => ['bool'], +'Worker::stack' => ['int', '&rw_work'=>'Threaded'], +'Worker::start' => ['bool', 'options='=>'int'], +'Worker::synchronized' => ['mixed', 'block'=>'Closure', '_='=>'mixed'], +'Worker::unlock' => ['bool'], +'Worker::unstack' => ['int', '&rw_work='=>'Threaded'], +'Worker::wait' => ['bool', 'timeout='=>'int'], +'xattr_get' => ['string', 'filename'=>'string', 'name'=>'string', 'flags='=>'int'], +'xattr_list' => ['array', 'filename'=>'string', 'flags='=>'int'], +'xattr_remove' => ['bool', 'filename'=>'string', 'name'=>'string', 'flags='=>'int'], +'xattr_set' => ['bool', 'filename'=>'string', 'name'=>'string', 'value'=>'string', 'flags='=>'int'], +'xattr_supported' => ['bool', 'filename'=>'string', 'flags='=>'int'], +'xcache_asm' => ['string', 'filename'=>'string'], +'xcache_clear_cache' => ['void', 'type'=>'int', 'id='=>'int'], +'xcache_coredump' => ['string', 'op_type'=>'int'], +'xcache_count' => ['int', 'type'=>'int'], +'xcache_coverager_decode' => ['array', 'data'=>'string'], +'xcache_coverager_get' => ['array', 'clean='=>'bool'], +'xcache_coverager_start' => ['void', 'clean='=>'bool'], +'xcache_coverager_stop' => ['void', 'clean='=>'bool'], +'xcache_dasm_file' => ['string', 'filename'=>'string'], +'xcache_dasm_string' => ['string', 'code'=>'string'], +'xcache_dec' => ['int', 'name'=>'string', 'value='=>'int|mixed', 'ttl='=>'int'], +'xcache_decode' => ['bool', 'filename'=>'string'], +'xcache_encode' => ['string', 'filename'=>'string'], +'xcache_get' => ['mixed', 'name'=>'string'], +'xcache_get_data_type' => ['string', 'type'=>'int'], +'xcache_get_op_spec' => ['string', 'op_type'=>'int'], +'xcache_get_op_type' => ['string', 'op_type'=>'int'], +'xcache_get_opcode' => ['string', 'opcode'=>'int'], +'xcache_get_opcode_spec' => ['string', 'opcode'=>'int'], +'xcache_inc' => ['int', 'name'=>'string', 'value='=>'int|mixed', 'ttl='=>'int'], +'xcache_info' => ['array', 'type'=>'int', 'id'=>'int'], +'xcache_is_autoglobal' => ['string', 'name'=>'string'], +'xcache_isset' => ['bool', 'name'=>'string'], +'xcache_list' => ['array', 'type'=>'int', 'id'=>'int'], +'xcache_set' => ['bool', 'name'=>'string', 'value'=>'mixed', 'ttl='=>'int'], +'xcache_unset' => ['bool', 'name'=>'string'], +'xcache_unset_by_prefix' => ['bool', 'prefix'=>'string'], +'Xcom::__construct' => ['void', 'fabric_url='=>'string', 'fabric_token='=>'string', 'capability_token='=>'string'], +'Xcom::decode' => ['object', 'avro_msg'=>'string', 'json_schema'=>'string'], +'Xcom::encode' => ['string', 'data'=>'stdClass', 'avro_schema'=>'string'], +'Xcom::getDebugOutput' => ['string'], +'Xcom::getLastResponse' => ['string'], +'Xcom::getLastResponseInfo' => ['array'], +'Xcom::getOnboardingURL' => ['string', 'capability_name'=>'string', 'agreement_url'=>'string'], +'Xcom::send' => ['int', 'topic'=>'string', 'data'=>'mixed', 'json_schema='=>'string', 'http_headers='=>'array'], +'Xcom::sendAsync' => ['int', 'topic'=>'string', 'data'=>'mixed', 'json_schema='=>'string', 'http_headers='=>'array'], +'xdebug_break' => ['bool'], +'xdebug_call_class' => ['string', 'depth='=>'int'], +'xdebug_call_file' => ['string', 'depth='=>'int'], +'xdebug_call_function' => ['string', 'depth='=>'int'], +'xdebug_call_line' => ['int', 'depth='=>'int'], +'xdebug_clear_aggr_profiling_data' => ['bool'], +'xdebug_code_coverage_started' => ['bool'], +'xdebug_debug_zval' => ['void', '...varName'=>'string'], +'xdebug_debug_zval_stdout' => ['void', '...varName'=>'string'], +'xdebug_disable' => ['void'], +'xdebug_dump_aggr_profiling_data' => ['bool'], +'xdebug_dump_superglobals' => ['void'], +'xdebug_enable' => ['void'], +'xdebug_get_code_coverage' => ['array'], +'xdebug_get_collected_errors' => ['string', 'clean='=>'bool'], +'xdebug_get_declared_vars' => ['array'], +'xdebug_get_formatted_function_stack' => [''], +'xdebug_get_function_count' => ['int'], +'xdebug_get_function_stack' => ['array', 'message='=>'string', 'options='=>'int'], +'xdebug_get_headers' => ['array'], +'xdebug_get_monitored_functions' => ['array'], +'xdebug_get_profiler_filename' => ['string|false'], +'xdebug_get_stack_depth' => ['int'], +'xdebug_get_tracefile_name' => ['string'], +'xdebug_is_debugger_active' => ['bool'], +'xdebug_is_enabled' => ['bool'], +'xdebug_memory_usage' => ['int'], +'xdebug_peak_memory_usage' => ['int'], +'xdebug_print_function_stack' => ['array', 'message='=>'string', 'options='=>'int'], +'xdebug_set_filter' => ['void', 'group'=>'int', 'list_type'=>'int', 'configuration'=>'array'], +'xdebug_start_code_coverage' => ['void', 'options='=>'int'], +'xdebug_start_error_collection' => ['void'], +'xdebug_start_function_monitor' => ['void', 'list_of_functions_to_monitor'=>'string[]'], +'xdebug_start_trace' => ['void', 'trace_file'=>'', 'options='=>'int|mixed'], +'xdebug_stop_code_coverage' => ['void', 'cleanup='=>'bool'], +'xdebug_stop_error_collection' => ['void'], +'xdebug_stop_function_monitor' => ['void'], +'xdebug_stop_trace' => ['void'], +'xdebug_time_index' => ['float'], +'xdebug_var_dump' => ['void', '...var'=>''], +'xdiff_file_bdiff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], +'xdiff_file_bdiff_size' => ['int', 'file'=>'string'], +'xdiff_file_bpatch' => ['bool', 'file'=>'string', 'patch'=>'string', 'dest'=>'string'], +'xdiff_file_diff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string', 'context='=>'int', 'minimal='=>'bool'], +'xdiff_file_diff_binary' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], +'xdiff_file_merge3' => ['mixed', 'old_file'=>'string', 'new_file1'=>'string', 'new_file2'=>'string', 'dest'=>'string'], +'xdiff_file_patch' => ['mixed', 'file'=>'string', 'patch'=>'string', 'dest'=>'string', 'flags='=>'int'], +'xdiff_file_patch_binary' => ['bool', 'file'=>'string', 'patch'=>'string', 'dest'=>'string'], +'xdiff_file_rabdiff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], +'xdiff_string_bdiff' => ['string', 'old_data'=>'string', 'new_data'=>'string'], +'xdiff_string_bdiff_size' => ['int', 'patch'=>'string'], +'xdiff_string_bpatch' => ['string', 'string'=>'string', 'patch'=>'string'], +'xdiff_string_diff' => ['string', 'old_data'=>'string', 'new_data'=>'string', 'context='=>'int', 'minimal='=>'bool'], +'xdiff_string_diff_binary' => ['string', 'old_data'=>'string', 'new_data'=>'string'], +'xdiff_string_merge3' => ['mixed', 'old_data'=>'string', 'new_data1'=>'string', 'new_data2'=>'string', 'error='=>'string'], +'xdiff_string_patch' => ['string', 'string'=>'string', 'patch'=>'string', 'flags='=>'int', '&w_error='=>'string'], +'xdiff_string_patch_binary' => ['string', 'string'=>'string', 'patch'=>'string'], +'xdiff_string_rabdiff' => ['string', 'old_data'=>'string', 'new_data'=>'string'], +'xhprof_disable' => ['array'], +'xhprof_enable' => ['void', 'flags='=>'int', 'options='=>'array'], +'xhprof_sample_disable' => ['array'], +'xhprof_sample_enable' => ['void'], +'xlswriter_get_author' => ['string'], +'xlswriter_get_version' => ['string'], +'xml_error_string' => ['?string', 'error_code'=>'int'], +'xml_get_current_byte_index' => ['int|false', 'parser'=>'XMLParser'], +'xml_get_current_column_number' => ['int|false', 'parser'=>'XMLParser'], +'xml_get_current_line_number' => ['int|false', 'parser'=>'XMLParser'], +'xml_get_error_code' => ['int|false', 'parser'=>'XMLParser'], +'xml_parse' => ['int', 'parser'=>'XMLParser', 'data'=>'string', 'is_final='=>'bool'], +'xml_parse_into_struct' => ['int', 'parser'=>'XMLParser', 'data'=>'string', '&w_values'=>'array', '&w_index='=>'array'], +'xml_parser_create' => ['XMLParser', 'encoding='=>'string'], +'xml_parser_create_ns' => ['XMLParser', 'encoding='=>'string', 'separator='=>'string'], +'xml_parser_free' => ['bool', 'parser'=>'XMLParser'], +'xml_parser_get_option' => ['mixed|false', 'parser'=>'XMLParser', 'option'=>'int'], +'xml_parser_set_option' => ['bool', 'parser'=>'XMLParser', 'option'=>'int', 'value'=>'mixed'], +'xml_set_character_data_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], +'xml_set_default_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], +'xml_set_element_handler' => ['bool', 'parser'=>'XMLParser', 'start_handler'=>'callable', 'end_handler'=>'callable'], +'xml_set_end_namespace_decl_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], +'xml_set_external_entity_ref_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], +'xml_set_notation_decl_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], +'xml_set_object' => ['bool', 'parser'=>'XMLParser', 'object'=>'object'], +'xml_set_processing_instruction_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], +'xml_set_start_namespace_decl_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], +'xml_set_unparsed_entity_decl_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], +'XMLDiff\Base::__construct' => ['void', 'nsname'=>'string'], +'XMLDiff\Base::diff' => ['mixed', 'from'=>'mixed', 'to'=>'mixed'], +'XMLDiff\Base::merge' => ['mixed', 'src'=>'mixed', 'diff'=>'mixed'], +'XMLDiff\DOM::diff' => ['DOMDocument', 'from'=>'DOMDocument', 'to'=>'DOMDocument'], +'XMLDiff\DOM::merge' => ['DOMDocument', 'src'=>'DOMDocument', 'diff'=>'DOMDocument'], +'XMLDiff\File::diff' => ['string', 'from'=>'string', 'to'=>'string'], +'XMLDiff\File::merge' => ['string', 'src'=>'string', 'diff'=>'string'], +'XMLDiff\Memory::diff' => ['string', 'from'=>'string', 'to'=>'string'], +'XMLDiff\Memory::merge' => ['string', 'src'=>'string', 'diff'=>'string'], +'XMLReader::close' => ['bool'], +'XMLReader::expand' => ['DOMNode|false', 'basenode='=>'DOMNode'], +'XMLReader::getAttribute' => ['?string', 'name'=>'string'], +'XMLReader::getAttributeNo' => ['?string', 'index'=>'int'], +'XMLReader::getAttributeNs' => ['?string', 'name'=>'string', 'namespaceuri'=>'string'], +'XMLReader::getParserProperty' => ['bool', 'property'=>'int'], +'XMLReader::isValid' => ['bool'], +'XMLReader::lookupNamespace' => ['?string', 'prefix'=>'string'], +'XMLReader::moveToAttribute' => ['bool', 'name'=>'string'], +'XMLReader::moveToAttributeNo' => ['bool', 'index'=>'int'], +'XMLReader::moveToAttributeNs' => ['bool', 'localname'=>'string', 'namespaceuri'=>'string'], +'XMLReader::moveToElement' => ['bool'], +'XMLReader::moveToFirstAttribute' => ['bool'], +'XMLReader::moveToNextAttribute' => ['bool'], +'XMLReader::next' => ['bool', 'localname='=>'string'], +'XMLReader::open' => ['bool', 'uri'=>'string', 'encoding='=>'?string', 'options='=>'int'], +'XMLReader::read' => ['bool'], +'XMLReader::readInnerXML' => ['string'], +'XMLReader::readOuterXML' => ['string'], +'XMLReader::readString' => ['string'], +'XMLReader::setParserProperty' => ['bool', 'property'=>'int', 'value'=>'bool'], +'XMLReader::setRelaxNGSchema' => ['bool', 'filename'=>'string'], +'XMLReader::setRelaxNGSchemaSource' => ['bool', 'source'=>'string'], +'XMLReader::setSchema' => ['bool', 'filename'=>'string'], +'XMLReader::XML' => ['bool', 'source'=>'string', 'encoding='=>'?string', 'options='=>'int'], +'xmlrpc_decode' => ['mixed', 'xml'=>'string', 'encoding='=>'string'], +'xmlrpc_decode_request' => ['?array', 'xml'=>'string', '&w_method'=>'string', 'encoding='=>'string'], +'xmlrpc_encode' => ['string', 'value'=>'mixed'], +'xmlrpc_encode_request' => ['string', 'method'=>'string', 'params'=>'mixed', 'output_options='=>'array'], +'xmlrpc_get_type' => ['string', 'value'=>'mixed'], +'xmlrpc_is_fault' => ['bool', 'arg'=>'array'], +'xmlrpc_parse_method_descriptions' => ['array', 'xml'=>'string'], +'xmlrpc_server_add_introspection_data' => ['int', 'server'=>'resource', 'desc'=>'array'], +'xmlrpc_server_call_method' => ['string', 'server'=>'resource', 'xml'=>'string', 'user_data'=>'mixed', 'output_options='=>'array'], +'xmlrpc_server_create' => ['resource'], +'xmlrpc_server_destroy' => ['int', 'server'=>'resource'], +'xmlrpc_server_register_introspection_callback' => ['bool', 'server'=>'resource', 'function'=>'string'], +'xmlrpc_server_register_method' => ['bool', 'server'=>'resource', 'method_name'=>'string', 'function'=>'string'], +'xmlrpc_set_type' => ['bool', '&rw_value'=>'string|DateTime', 'type'=>'string'], +'XMLWriter::endAttribute' => ['bool'], +'XMLWriter::endCdata' => ['bool'], +'XMLWriter::endComment' => ['bool'], +'XMLWriter::endDocument' => ['bool'], +'XMLWriter::endDtd' => ['bool'], +'XMLWriter::endDtdAttlist' => ['bool'], +'XMLWriter::endDtdElement' => ['bool'], +'XMLWriter::endDtdEntity' => ['bool'], +'XMLWriter::endElement' => ['bool'], +'XMLWriter::endPi' => ['bool'], +'XMLWriter::flush' => ['string|int', 'empty='=>'bool'], +'XMLWriter::fullEndElement' => ['bool'], +'XMLWriter::openMemory' => ['bool'], +'XMLWriter::openUri' => ['bool', 'uri'=>'string'], +'XMLWriter::outputMemory' => ['string', 'flush='=>'bool'], +'XMLWriter::setIndent' => ['bool', 'enable'=>'bool'], +'XMLWriter::setIndentString' => ['bool', 'indentation'=>'string'], +'XMLWriter::startAttribute' => ['bool', 'name'=>'string'], +'XMLWriter::startAttributeNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], +'XMLWriter::startCdata' => ['bool'], +'XMLWriter::startComment' => ['bool'], +'XMLWriter::startDocument' => ['bool', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], +'XMLWriter::startDtd' => ['bool', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], +'XMLWriter::startDtdAttlist' => ['bool', 'name'=>'string'], +'XMLWriter::startDtdElement' => ['bool', 'qualifiedName'=>'string'], +'XMLWriter::startDtdEntity' => ['bool', 'name'=>'string', 'isParam'=>'bool'], +'XMLWriter::startElement' => ['bool', 'name'=>'string'], +'XMLWriter::startElementNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], +'XMLWriter::startPi' => ['bool', 'target'=>'string'], +'XMLWriter::text' => ['bool', 'content'=>'string'], +'XMLWriter::writeAttribute' => ['bool', 'name'=>'string', 'value'=>'string'], +'XMLWriter::writeAttributeNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], +'XMLWriter::writeCdata' => ['bool', 'content'=>'string'], +'XMLWriter::writeComment' => ['bool', 'content'=>'string'], +'XMLWriter::writeDtd' => ['bool', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], +'XMLWriter::writeDtdAttlist' => ['bool', 'name'=>'string', 'content'=>'string'], +'XMLWriter::writeDtdElement' => ['bool', 'name'=>'string', 'content'=>'string'], +'XMLWriter::writeDtdEntity' => ['bool', 'name'=>'string', 'content'=>'string', 'isParam='=>'bool', 'publicId='=>'?string', 'systemId='=>'?string', 'notationData='=>'?string'], +'XMLWriter::writeElement' => ['bool', 'name'=>'string', 'content='=>'?string'], +'XMLWriter::writeElementNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'content='=>'?string'], +'XMLWriter::writePi' => ['bool', 'target'=>'string', 'content'=>'string'], +'XMLWriter::writeRaw' => ['bool', 'content'=>'string'], +'xmlwriter_end_attribute' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_end_cdata' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_end_comment' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_end_document' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_end_dtd' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_end_dtd_attlist' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_end_dtd_element' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_end_dtd_entity' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_end_element' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_end_pi' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_flush' => ['string|int', 'writer'=>'XMLWriter', 'empty='=>'bool'], +'xmlwriter_full_end_element' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_open_memory' => ['XMLWriter|false'], +'xmlwriter_open_uri' => ['XMLWriter|false', 'uri'=>'string'], +'xmlwriter_output_memory' => ['string', 'writer'=>'XMLWriter', 'flush='=>'bool'], +'xmlwriter_set_indent' => ['bool', 'writer'=>'XMLWriter', 'enable'=>'bool'], +'xmlwriter_set_indent_string' => ['bool', 'writer'=>'XMLWriter', 'indentation'=>'string'], +'xmlwriter_start_attribute' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], +'xmlwriter_start_attribute_ns' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], +'xmlwriter_start_cdata' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_start_comment' => ['bool', 'writer'=>'XMLWriter'], +'xmlwriter_start_document' => ['bool', 'writer'=>'XMLWriter', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], +'xmlwriter_start_dtd' => ['bool', 'writer'=>'XMLWriter', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], +'xmlwriter_start_dtd_attlist' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], +'xmlwriter_start_dtd_element' => ['bool', 'writer'=>'XMLWriter', 'qualifiedName'=>'string'], +'xmlwriter_start_dtd_entity' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'isParam'=>'bool'], +'xmlwriter_start_element' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], +'xmlwriter_start_element_ns' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], +'xmlwriter_start_pi' => ['bool', 'writer'=>'XMLWriter', 'target'=>'string'], +'xmlwriter_text' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], +'xmlwriter_write_attribute' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'value'=>'string'], +'xmlwriter_write_attribute_ns' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], +'xmlwriter_write_cdata' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], +'xmlwriter_write_comment' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], +'xmlwriter_write_dtd' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], +'xmlwriter_write_dtd_attlist' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string'], +'xmlwriter_write_dtd_element' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string'], +'xmlwriter_write_dtd_entity' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string', 'isParam='=>'bool', 'publicId='=>'?string', 'systemId='=>'?string', 'notationData='=>'?string'], +'xmlwriter_write_element' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content='=>'?string'], +'xmlwriter_write_element_ns' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'content='=>'?string'], +'xmlwriter_write_pi' => ['bool', 'writer'=>'XMLWriter', 'target'=>'string', 'content'=>'string'], +'xmlwriter_write_raw' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], +'xpath_new_context' => ['XPathContext', 'dom_document'=>'DOMDocument'], +'xpath_register_ns' => ['bool', 'xpath_context'=>'xpathcontext', 'prefix'=>'string', 'uri'=>'string'], +'xpath_register_ns_auto' => ['bool', 'xpath_context'=>'xpathcontext', 'context_node='=>'object'], +'xptr_new_context' => ['XPathContext'], +'xsl_xsltprocessor_get_parameter' => ['string', 'namespace'=>'string', 'name'=>'string'], +'xsl_xsltprocessor_get_security_prefs' => ['int'], +'xsl_xsltprocessor_has_exslt_support' => ['bool'], +'xsl_xsltprocessor_register_php_functions' => ['', 'restrict'=>''], +'xsl_xsltprocessor_remove_parameter' => ['bool', 'namespace'=>'string', 'name'=>'string'], +'xsl_xsltprocessor_set_parameter' => ['bool', 'namespace'=>'string', 'name'=>'', 'value'=>'string'], +'xsl_xsltprocessor_set_profiling' => ['bool', 'filename'=>'string'], +'xsl_xsltprocessor_set_security_prefs' => ['int', 'securityprefs'=>'int'], +'xsl_xsltprocessor_transform_to_uri' => ['int', 'doc'=>'DOMDocument', 'uri'=>'string'], +'xsl_xsltprocessor_transform_to_xml' => ['string', 'doc'=>'DOMDocument'], +'xslt_backend_info' => ['string'], +'xslt_backend_name' => ['string'], +'xslt_backend_version' => ['string'], +'xslt_create' => ['resource'], +'xslt_errno' => ['int', 'xh'=>''], +'xslt_error' => ['string', 'xh'=>''], +'xslt_free' => ['', 'xh'=>''], +'xslt_getopt' => ['int', 'processor'=>''], +'xslt_process' => ['', 'xh'=>'', 'xmlcontainer'=>'string', 'xslcontainer'=>'string', 'resultcontainer='=>'string', 'arguments='=>'array', 'parameters='=>'array'], +'xslt_set_base' => ['', 'xh'=>'', 'uri'=>'string'], +'xslt_set_encoding' => ['', 'xh'=>'', 'encoding'=>'string'], +'xslt_set_error_handler' => ['', 'xh'=>'', 'handler'=>''], +'xslt_set_log' => ['', 'xh'=>'', 'log='=>''], +'xslt_set_object' => ['bool', 'processor'=>'', 'object'=>'object'], +'xslt_set_sax_handler' => ['', 'xh'=>'', 'handlers'=>'array'], +'xslt_set_sax_handlers' => ['', 'processor'=>'', 'handlers'=>'array'], +'xslt_set_scheme_handler' => ['', 'xh'=>'', 'handlers'=>'array'], +'xslt_set_scheme_handlers' => ['', 'xh'=>'', 'handlers'=>'array'], +'xslt_setopt' => ['', 'processor'=>'', 'newmask'=>'int'], +'XSLTProcessor::getParameter' => ['string|false', 'namespace'=>'string', 'name'=>'string'], +'XsltProcessor::getSecurityPrefs' => ['int'], +'XSLTProcessor::hasExsltSupport' => ['bool'], +'XSLTProcessor::importStylesheet' => ['bool', 'stylesheet'=>'object'], +'XSLTProcessor::registerPHPFunctions' => ['void', 'functions='=>'mixed'], +'XSLTProcessor::removeParameter' => ['bool', 'namespace'=>'string', 'name'=>'string'], +'XSLTProcessor::setParameter' => ['bool', 'namespace'=>'string', 'name'=>'string', 'value'=>'string'], +'XSLTProcessor::setParameter\'1' => ['bool', 'namespace'=>'string', 'options'=>'array'], +'XSLTProcessor::setProfiling' => ['bool', 'filename'=>'string'], +'XsltProcessor::setSecurityPrefs' => ['int', 'preferences'=>'int'], +'XSLTProcessor::transformToDoc' => ['DOMDocument|false', 'document'=>'DOMNode'], +'XSLTProcessor::transformToURI' => ['int', 'document'=>'DOMDocument', 'uri'=>'string'], +'XSLTProcessor::transformToXML' => ['string|false', 'document'=>'DOMDocument'], +'yac::__construct' => ['void', 'prefix='=>'string'], +'yac::__get' => ['mixed', 'key'=>'string'], +'yac::__set' => ['mixed', 'key'=>'string', 'value'=>'mixed'], +'yac::delete' => ['bool', 'keys'=>'string|array', 'ttl='=>'int'], +'yac::dump' => ['mixed', 'num'=>'int'], +'yac::flush' => ['bool'], +'yac::get' => ['mixed', 'key'=>'string|array', 'cas='=>'int'], +'yac::info' => ['array'], +'Yaconf::get' => ['mixed', 'name'=>'string', 'default_value='=>'mixed'], +'Yaconf::has' => ['bool', 'name'=>'string'], +'Yaf\Action_Abstract::__clone' => ['void'], +'Yaf\Action_Abstract::__construct' => ['void', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract', 'view'=>'Yaf\View_Interface', 'invokeArgs='=>'?array'], +'Yaf\Action_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], +'Yaf\Action_Abstract::execute' => ['mixed'], +'Yaf\Action_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], +'Yaf\Action_Abstract::getController' => ['Yaf\Controller_Abstract'], +'Yaf\Action_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], +'Yaf\Action_Abstract::getInvokeArgs' => ['array'], +'Yaf\Action_Abstract::getModuleName' => ['string'], +'Yaf\Action_Abstract::getRequest' => ['Yaf\Request_Abstract'], +'Yaf\Action_Abstract::getResponse' => ['Yaf\Response_Abstract'], +'Yaf\Action_Abstract::getView' => ['Yaf\View_Interface'], +'Yaf\Action_Abstract::getViewpath' => ['string'], +'Yaf\Action_Abstract::init' => [''], +'Yaf\Action_Abstract::initView' => ['Yaf\Response_Abstract', 'options='=>'?array'], +'Yaf\Action_Abstract::redirect' => ['bool', 'url'=>'string'], +'Yaf\Action_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], +'Yaf\Action_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], +'Yaf\Application::__clone' => ['void'], +'Yaf\Application::__construct' => ['void', 'config'=>'array|string', 'envrion='=>'string'], +'Yaf\Application::__destruct' => ['void'], +'Yaf\Application::__sleep' => ['string[]'], +'Yaf\Application::__wakeup' => ['void'], +'Yaf\Application::app' => ['?Yaf\Application'], +'Yaf\Application::bootstrap' => ['Yaf\Application', 'bootstrap='=>'?Yaf\Bootstrap_Abstract'], +'Yaf\Application::clearLastError' => ['void'], +'Yaf\Application::environ' => ['string'], +'Yaf\Application::execute' => ['void', 'entry'=>'callable', '_='=>'string'], +'Yaf\Application::getAppDirectory' => ['string'], +'Yaf\Application::getConfig' => ['Yaf\Config_Abstract'], +'Yaf\Application::getDispatcher' => ['Yaf\Dispatcher'], +'Yaf\Application::getLastErrorMsg' => ['string'], +'Yaf\Application::getLastErrorNo' => ['int'], +'Yaf\Application::getModules' => ['array'], +'Yaf\Application::run' => ['void'], +'Yaf\Application::setAppDirectory' => ['Yaf\Application', 'directory'=>'string'], +'Yaf\Config\Ini::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], +'Yaf\Config\Ini::__get' => ['', 'name='=>'mixed'], +'Yaf\Config\Ini::__isset' => ['', 'name'=>'string'], +'Yaf\Config\Ini::__set' => ['void', 'name'=>'', 'value'=>''], +'Yaf\Config\Ini::count' => ['int'], +'Yaf\Config\Ini::current' => ['mixed'], +'Yaf\Config\Ini::get' => ['mixed', 'name='=>'mixed'], +'Yaf\Config\Ini::key' => ['int|string'], +'Yaf\Config\Ini::next' => ['void'], +'Yaf\Config\Ini::offsetExists' => ['bool', 'name'=>'mixed'], +'Yaf\Config\Ini::offsetGet' => ['mixed', 'name'=>'mixed'], +'Yaf\Config\Ini::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], +'Yaf\Config\Ini::offsetUnset' => ['void', 'name'=>'mixed'], +'Yaf\Config\Ini::readonly' => ['bool'], +'Yaf\Config\Ini::rewind' => ['void'], +'Yaf\Config\Ini::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], +'Yaf\Config\Ini::toArray' => ['array'], +'Yaf\Config\Ini::valid' => ['bool'], +'Yaf\Config\Simple::__construct' => ['void', 'array'=>'array', 'readonly='=>'string'], +'Yaf\Config\Simple::__get' => ['', 'name='=>'mixed'], +'Yaf\Config\Simple::__isset' => ['', 'name'=>'string'], +'Yaf\Config\Simple::__set' => ['void', 'name'=>'', 'value'=>''], +'Yaf\Config\Simple::count' => ['int'], +'Yaf\Config\Simple::current' => ['mixed'], +'Yaf\Config\Simple::get' => ['mixed', 'name='=>'mixed'], +'Yaf\Config\Simple::key' => ['int|string'], +'Yaf\Config\Simple::next' => ['void'], +'Yaf\Config\Simple::offsetExists' => ['bool', 'name'=>'mixed'], +'Yaf\Config\Simple::offsetGet' => ['mixed', 'name'=>'mixed'], +'Yaf\Config\Simple::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], +'Yaf\Config\Simple::offsetUnset' => ['void', 'name'=>'mixed'], +'Yaf\Config\Simple::readonly' => ['bool'], +'Yaf\Config\Simple::rewind' => ['void'], +'Yaf\Config\Simple::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], +'Yaf\Config\Simple::toArray' => ['array'], +'Yaf\Config\Simple::valid' => ['bool'], +'Yaf\Config_Abstract::__construct' => ['void'], +'Yaf\Config_Abstract::get' => ['mixed', 'name='=>'string'], +'Yaf\Config_Abstract::readonly' => ['bool'], +'Yaf\Config_Abstract::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], +'Yaf\Config_Abstract::toArray' => ['array'], +'Yaf\Controller_Abstract::__clone' => ['void'], +'Yaf\Controller_Abstract::__construct' => ['void', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract', 'view'=>'Yaf\View_Interface', 'invokeArgs='=>'?array'], +'Yaf\Controller_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], +'Yaf\Controller_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], +'Yaf\Controller_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], +'Yaf\Controller_Abstract::getInvokeArgs' => ['array'], +'Yaf\Controller_Abstract::getModuleName' => ['string'], +'Yaf\Controller_Abstract::getRequest' => ['Yaf\Request_Abstract'], +'Yaf\Controller_Abstract::getResponse' => ['Yaf\Response_Abstract'], +'Yaf\Controller_Abstract::getView' => ['Yaf\View_Interface'], +'Yaf\Controller_Abstract::getViewpath' => ['string'], +'Yaf\Controller_Abstract::init' => [''], +'Yaf\Controller_Abstract::initView' => ['Yaf\Response_Abstract', 'options='=>'?array'], +'Yaf\Controller_Abstract::redirect' => ['bool', 'url'=>'string'], +'Yaf\Controller_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], +'Yaf\Controller_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], +'Yaf\Dispatcher::__clone' => ['void'], +'Yaf\Dispatcher::__construct' => ['void'], +'Yaf\Dispatcher::__sleep' => ['list'], +'Yaf\Dispatcher::__wakeup' => ['void'], +'Yaf\Dispatcher::autoRender' => ['Yaf\Dispatcher', 'flag='=>'bool'], +'Yaf\Dispatcher::catchException' => ['Yaf\Dispatcher', 'flag='=>'bool'], +'Yaf\Dispatcher::disableView' => ['bool'], +'Yaf\Dispatcher::dispatch' => ['Yaf\Response_Abstract', 'request'=>'Yaf\Request_Abstract'], +'Yaf\Dispatcher::enableView' => ['Yaf\Dispatcher'], +'Yaf\Dispatcher::flushInstantly' => ['Yaf\Dispatcher', 'flag='=>'bool'], +'Yaf\Dispatcher::getApplication' => ['Yaf\Application'], +'Yaf\Dispatcher::getInstance' => ['Yaf\Dispatcher'], +'Yaf\Dispatcher::getRequest' => ['Yaf\Request_Abstract'], +'Yaf\Dispatcher::getRouter' => ['Yaf\Router'], +'Yaf\Dispatcher::initView' => ['Yaf\View_Interface', 'templates_dir'=>'string', 'options='=>'?array'], +'Yaf\Dispatcher::registerPlugin' => ['Yaf\Dispatcher', 'plugin'=>'Yaf\Plugin_Abstract'], +'Yaf\Dispatcher::returnResponse' => ['Yaf\Dispatcher', 'flag'=>'bool'], +'Yaf\Dispatcher::setDefaultAction' => ['Yaf\Dispatcher', 'action'=>'string'], +'Yaf\Dispatcher::setDefaultController' => ['Yaf\Dispatcher', 'controller'=>'string'], +'Yaf\Dispatcher::setDefaultModule' => ['Yaf\Dispatcher', 'module'=>'string'], +'Yaf\Dispatcher::setErrorHandler' => ['Yaf\Dispatcher', 'callback'=>'callable', 'error_types'=>'int'], +'Yaf\Dispatcher::setRequest' => ['Yaf\Dispatcher', 'request'=>'Yaf\Request_Abstract'], +'Yaf\Dispatcher::setView' => ['Yaf\Dispatcher', 'view'=>'Yaf\View_Interface'], +'Yaf\Dispatcher::throwException' => ['Yaf\Dispatcher', 'flag='=>'bool'], +'Yaf\Loader::__clone' => ['void'], +'Yaf\Loader::__construct' => ['void'], +'Yaf\Loader::__sleep' => ['list'], +'Yaf\Loader::__wakeup' => ['void'], +'Yaf\Loader::autoload' => ['bool', 'class_name'=>'string'], +'Yaf\Loader::clearLocalNamespace' => [''], +'Yaf\Loader::getInstance' => ['Yaf\Loader', 'local_library_path='=>'string', 'global_library_path='=>'string'], +'Yaf\Loader::getLibraryPath' => ['string', 'is_global='=>'bool'], +'Yaf\Loader::getLocalNamespace' => ['string'], +'Yaf\Loader::import' => ['bool', 'file'=>'string'], +'Yaf\Loader::isLocalName' => ['bool', 'class_name'=>'string'], +'Yaf\Loader::registerLocalNamespace' => ['bool', 'name_prefix'=>'string|string[]'], +'Yaf\Loader::setLibraryPath' => ['Yaf\Loader', 'directory'=>'string', 'global='=>'bool'], +'Yaf\Plugin_Abstract::dispatchLoopShutdown' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], +'Yaf\Plugin_Abstract::dispatchLoopStartup' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], +'Yaf\Plugin_Abstract::postDispatch' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], +'Yaf\Plugin_Abstract::preDispatch' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], +'Yaf\Plugin_Abstract::preResponse' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], +'Yaf\Plugin_Abstract::routerShutdown' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], +'Yaf\Plugin_Abstract::routerStartup' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], +'Yaf\Registry::__clone' => ['void'], +'Yaf\Registry::__construct' => ['void'], +'Yaf\Registry::del' => ['bool|void', 'name'=>'string'], +'Yaf\Registry::get' => ['mixed', 'name'=>'string'], +'Yaf\Registry::has' => ['bool', 'name'=>'string'], +'Yaf\Registry::set' => ['bool', 'name'=>'string', 'value'=>'mixed'], +'Yaf\Request\Http::__clone' => ['void'], +'Yaf\Request\Http::__construct' => ['void', 'request_uri'=>'string', 'base_uri'=>'string'], +'Yaf\Request\Http::get' => ['mixed', 'name'=>'string', 'default='=>'string'], +'Yaf\Request\Http::getActionName' => ['string'], +'Yaf\Request\Http::getBaseUri' => ['string'], +'Yaf\Request\Http::getControllerName' => ['string'], +'Yaf\Request\Http::getCookie' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request\Http::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request\Http::getException' => ['Yaf\Exception'], +'Yaf\Request\Http::getFiles' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request\Http::getLanguage' => ['string'], +'Yaf\Request\Http::getMethod' => ['string'], +'Yaf\Request\Http::getModuleName' => ['string'], +'Yaf\Request\Http::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], +'Yaf\Request\Http::getParams' => ['array'], +'Yaf\Request\Http::getPost' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request\Http::getQuery' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request\Http::getRequest' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request\Http::getRequestUri' => ['string'], +'Yaf\Request\Http::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request\Http::isCli' => ['bool'], +'Yaf\Request\Http::isDispatched' => ['bool'], +'Yaf\Request\Http::isGet' => ['bool'], +'Yaf\Request\Http::isHead' => ['bool'], +'Yaf\Request\Http::isOptions' => ['bool'], +'Yaf\Request\Http::isPost' => ['bool'], +'Yaf\Request\Http::isPut' => ['bool'], +'Yaf\Request\Http::isRouted' => ['bool'], +'Yaf\Request\Http::isXmlHttpRequest' => ['bool'], +'Yaf\Request\Http::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], +'Yaf\Request\Http::setBaseUri' => ['bool', 'uri'=>'string'], +'Yaf\Request\Http::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], +'Yaf\Request\Http::setDispatched' => ['bool'], +'Yaf\Request\Http::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], +'Yaf\Request\Http::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], +'Yaf\Request\Http::setRequestUri' => ['', 'uri'=>'string'], +'Yaf\Request\Http::setRouted' => ['Yaf\Request_Abstract|bool'], +'Yaf\Request\Simple::__clone' => ['void'], +'Yaf\Request\Simple::__construct' => ['void', 'method'=>'string', 'controller'=>'string', 'action'=>'string', 'params='=>'string'], +'Yaf\Request\Simple::get' => ['mixed', 'name'=>'string', 'default='=>'string'], +'Yaf\Request\Simple::getActionName' => ['string'], +'Yaf\Request\Simple::getBaseUri' => ['string'], +'Yaf\Request\Simple::getControllerName' => ['string'], +'Yaf\Request\Simple::getCookie' => ['mixed', 'name='=>'string', 'default='=>'string'], +'Yaf\Request\Simple::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request\Simple::getException' => ['Yaf\Exception'], +'Yaf\Request\Simple::getFiles' => ['array', 'name='=>'mixed', 'default='=>'null'], +'Yaf\Request\Simple::getLanguage' => ['string'], +'Yaf\Request\Simple::getMethod' => ['string'], +'Yaf\Request\Simple::getModuleName' => ['string'], +'Yaf\Request\Simple::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], +'Yaf\Request\Simple::getParams' => ['array'], +'Yaf\Request\Simple::getPost' => ['mixed', 'name='=>'string', 'default='=>'string'], +'Yaf\Request\Simple::getQuery' => ['mixed', 'name='=>'string', 'default='=>'string'], +'Yaf\Request\Simple::getRequest' => ['mixed', 'name='=>'string', 'default='=>'string'], +'Yaf\Request\Simple::getRequestUri' => ['string'], +'Yaf\Request\Simple::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request\Simple::isCli' => ['bool'], +'Yaf\Request\Simple::isDispatched' => ['bool'], +'Yaf\Request\Simple::isGet' => ['bool'], +'Yaf\Request\Simple::isHead' => ['bool'], +'Yaf\Request\Simple::isOptions' => ['bool'], +'Yaf\Request\Simple::isPost' => ['bool'], +'Yaf\Request\Simple::isPut' => ['bool'], +'Yaf\Request\Simple::isRouted' => ['bool'], +'Yaf\Request\Simple::isXmlHttpRequest' => ['bool'], +'Yaf\Request\Simple::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], +'Yaf\Request\Simple::setBaseUri' => ['bool', 'uri'=>'string'], +'Yaf\Request\Simple::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], +'Yaf\Request\Simple::setDispatched' => ['bool'], +'Yaf\Request\Simple::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], +'Yaf\Request\Simple::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], +'Yaf\Request\Simple::setRequestUri' => ['', 'uri'=>'string'], +'Yaf\Request\Simple::setRouted' => ['Yaf\Request_Abstract|bool'], +'Yaf\Request_Abstract::getActionName' => ['string'], +'Yaf\Request_Abstract::getBaseUri' => ['string'], +'Yaf\Request_Abstract::getControllerName' => ['string'], +'Yaf\Request_Abstract::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request_Abstract::getException' => ['Yaf\Exception'], +'Yaf\Request_Abstract::getLanguage' => ['string'], +'Yaf\Request_Abstract::getMethod' => ['string'], +'Yaf\Request_Abstract::getModuleName' => ['string'], +'Yaf\Request_Abstract::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], +'Yaf\Request_Abstract::getParams' => ['array'], +'Yaf\Request_Abstract::getRequestUri' => ['string'], +'Yaf\Request_Abstract::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf\Request_Abstract::isCli' => ['bool'], +'Yaf\Request_Abstract::isDispatched' => ['bool'], +'Yaf\Request_Abstract::isGet' => ['bool'], +'Yaf\Request_Abstract::isHead' => ['bool'], +'Yaf\Request_Abstract::isOptions' => ['bool'], +'Yaf\Request_Abstract::isPost' => ['bool'], +'Yaf\Request_Abstract::isPut' => ['bool'], +'Yaf\Request_Abstract::isRouted' => ['bool'], +'Yaf\Request_Abstract::isXmlHttpRequest' => ['bool'], +'Yaf\Request_Abstract::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], +'Yaf\Request_Abstract::setBaseUri' => ['bool', 'uri'=>'string'], +'Yaf\Request_Abstract::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], +'Yaf\Request_Abstract::setDispatched' => ['bool'], +'Yaf\Request_Abstract::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], +'Yaf\Request_Abstract::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], +'Yaf\Request_Abstract::setRequestUri' => ['', 'uri'=>'string'], +'Yaf\Request_Abstract::setRouted' => ['Yaf\Request_Abstract|bool'], +'Yaf\Response\Cli::__clone' => ['void'], +'Yaf\Response\Cli::__construct' => ['void'], +'Yaf\Response\Cli::__destruct' => ['void'], +'Yaf\Response\Cli::__toString' => ['string'], +'Yaf\Response\Cli::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf\Response\Cli::clearBody' => ['bool', 'key='=>'string'], +'Yaf\Response\Cli::getBody' => ['mixed', 'key='=>'?string'], +'Yaf\Response\Cli::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf\Response\Cli::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf\Response\Http::__clone' => ['void'], +'Yaf\Response\Http::__construct' => ['void'], +'Yaf\Response\Http::__destruct' => ['void'], +'Yaf\Response\Http::__toString' => ['string'], +'Yaf\Response\Http::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf\Response\Http::clearBody' => ['bool', 'key='=>'string'], +'Yaf\Response\Http::clearHeaders' => ['Yaf\Response_Abstract|false', 'name='=>'string'], +'Yaf\Response\Http::getBody' => ['mixed', 'key='=>'?string'], +'Yaf\Response\Http::getHeader' => ['mixed', 'name='=>'string'], +'Yaf\Response\Http::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf\Response\Http::response' => ['bool'], +'Yaf\Response\Http::setAllHeaders' => ['bool', 'headers'=>'array'], +'Yaf\Response\Http::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf\Response\Http::setHeader' => ['bool', 'name'=>'string', 'value'=>'string', 'replace='=>'bool', 'response_code='=>'int'], +'Yaf\Response\Http::setRedirect' => ['bool', 'url'=>'string'], +'Yaf\Response_Abstract::__clone' => ['void'], +'Yaf\Response_Abstract::__construct' => ['void'], +'Yaf\Response_Abstract::__destruct' => ['void'], +'Yaf\Response_Abstract::__toString' => ['void'], +'Yaf\Response_Abstract::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf\Response_Abstract::clearBody' => ['bool', 'key='=>'string'], +'Yaf\Response_Abstract::getBody' => ['mixed', 'key='=>'?string'], +'Yaf\Response_Abstract::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf\Response_Abstract::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf\Route\Map::__construct' => ['void', 'controller_prefer='=>'bool', 'delimiter='=>'string'], +'Yaf\Route\Map::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], +'Yaf\Route\Map::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], +'Yaf\Route\Regex::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'map='=>'?array', 'verify='=>'?array', 'reverse='=>'string'], +'Yaf\Route\Regex::addConfig' => ['Yaf\Router|bool', 'config'=>'Yaf\Config_Abstract'], +'Yaf\Route\Regex::addRoute' => ['Yaf\Router|bool', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], +'Yaf\Route\Regex::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], +'Yaf\Route\Regex::getCurrentRoute' => ['string'], +'Yaf\Route\Regex::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], +'Yaf\Route\Regex::getRoutes' => ['Yaf\Route_Interface[]'], +'Yaf\Route\Regex::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], +'Yaf\Route\Rewrite::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'verify='=>'?array', 'reverse='=>'string'], +'Yaf\Route\Rewrite::addConfig' => ['Yaf\Router|bool', 'config'=>'Yaf\Config_Abstract'], +'Yaf\Route\Rewrite::addRoute' => ['Yaf\Router|bool', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], +'Yaf\Route\Rewrite::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], +'Yaf\Route\Rewrite::getCurrentRoute' => ['string'], +'Yaf\Route\Rewrite::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], +'Yaf\Route\Rewrite::getRoutes' => ['Yaf\Route_Interface[]'], +'Yaf\Route\Rewrite::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], +'Yaf\Route\Simple::__construct' => ['void', 'module_name'=>'string', 'controller_name'=>'string', 'action_name'=>'string'], +'Yaf\Route\Simple::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], +'Yaf\Route\Simple::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], +'Yaf\Route\Supervar::__construct' => ['void', 'supervar_name'=>'string'], +'Yaf\Route\Supervar::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], +'Yaf\Route\Supervar::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], +'Yaf\Route_Interface::__construct' => ['Yaf\Route_Interface'], +'Yaf\Route_Interface::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], +'Yaf\Route_Interface::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], +'Yaf\Route_Static::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], +'Yaf\Route_Static::match' => ['bool', 'uri'=>'string'], +'Yaf\Route_Static::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], +'Yaf\Router::__construct' => ['void'], +'Yaf\Router::addConfig' => ['Yaf\Router|false', 'config'=>'Yaf\Config_Abstract'], +'Yaf\Router::addRoute' => ['Yaf\Router|false', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], +'Yaf\Router::getCurrentRoute' => ['string'], +'Yaf\Router::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], +'Yaf\Router::getRoutes' => ['Yaf\Route_Interface[]'], +'Yaf\Router::route' => ['Yaf\Router|false', 'request'=>'Yaf\Request_Abstract'], +'Yaf\Session::__clone' => ['void'], +'Yaf\Session::__construct' => ['void'], +'Yaf\Session::__get' => ['void', 'name'=>''], +'Yaf\Session::__isset' => ['void', 'name'=>''], +'Yaf\Session::__set' => ['void', 'name'=>'', 'value'=>''], +'Yaf\Session::__sleep' => ['list'], +'Yaf\Session::__unset' => ['void', 'name'=>''], +'Yaf\Session::__wakeup' => ['void'], +'Yaf\Session::count' => ['int'], +'Yaf\Session::current' => ['mixed'], +'Yaf\Session::del' => ['Yaf\Session|false', 'name'=>'string'], +'Yaf\Session::get' => ['mixed', 'name'=>'string'], +'Yaf\Session::getInstance' => ['Yaf\Session'], +'Yaf\Session::has' => ['bool', 'name'=>'string'], +'Yaf\Session::key' => ['int|string'], +'Yaf\Session::next' => ['void'], +'Yaf\Session::offsetExists' => ['bool', 'name'=>'mixed'], +'Yaf\Session::offsetGet' => ['mixed', 'name'=>'mixed'], +'Yaf\Session::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], +'Yaf\Session::offsetUnset' => ['void', 'name'=>'mixed'], +'Yaf\Session::rewind' => ['void'], +'Yaf\Session::set' => ['Yaf\Session|false', 'name'=>'string', 'value'=>'mixed'], +'Yaf\Session::start' => ['Yaf\Session'], +'Yaf\Session::valid' => ['bool'], +'Yaf\View\Simple::__construct' => ['void', 'template_dir'=>'string', 'options='=>'?array'], +'Yaf\View\Simple::__get' => ['mixed', 'name='=>'null'], +'Yaf\View\Simple::__isset' => ['', 'name'=>'string'], +'Yaf\View\Simple::__set' => ['void', 'name'=>'string', 'value='=>'mixed'], +'Yaf\View\Simple::assign' => ['Yaf\View\Simple', 'name'=>'array|string', 'value='=>'mixed'], +'Yaf\View\Simple::assignRef' => ['Yaf\View\Simple', 'name'=>'string', '&value'=>'mixed'], +'Yaf\View\Simple::clear' => ['Yaf\View\Simple', 'name='=>'string'], +'Yaf\View\Simple::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'?array'], +'Yaf\View\Simple::eval' => ['bool|void', 'tpl_str'=>'string', 'vars='=>'?array'], +'Yaf\View\Simple::getScriptPath' => ['string'], +'Yaf\View\Simple::render' => ['string|void', 'tpl'=>'string', 'tpl_vars='=>'?array'], +'Yaf\View\Simple::setScriptPath' => ['Yaf\View\Simple', 'template_dir'=>'string'], +'Yaf\View_Interface::assign' => ['bool', 'name'=>'array|string', 'value'=>'mixed'], +'Yaf\View_Interface::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'?array'], +'Yaf\View_Interface::getScriptPath' => ['string'], +'Yaf\View_Interface::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'?array'], +'Yaf\View_Interface::setScriptPath' => ['void', 'template_dir'=>'string'], +'Yaf_Action_Abstract::__clone' => ['void'], +'Yaf_Action_Abstract::__construct' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract', 'view'=>'Yaf_View_Interface', 'invokeArgs='=>'?array'], +'Yaf_Action_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], +'Yaf_Action_Abstract::execute' => ['mixed', 'arg='=>'mixed', '...args='=>'mixed'], +'Yaf_Action_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], +'Yaf_Action_Abstract::getController' => ['Yaf_Controller_Abstract'], +'Yaf_Action_Abstract::getControllerName' => ['string'], +'Yaf_Action_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], +'Yaf_Action_Abstract::getInvokeArgs' => ['array'], +'Yaf_Action_Abstract::getModuleName' => ['string'], +'Yaf_Action_Abstract::getRequest' => ['Yaf_Request_Abstract'], +'Yaf_Action_Abstract::getResponse' => ['Yaf_Response_Abstract'], +'Yaf_Action_Abstract::getView' => ['Yaf_View_Interface'], +'Yaf_Action_Abstract::getViewpath' => ['string'], +'Yaf_Action_Abstract::init' => [''], +'Yaf_Action_Abstract::initView' => ['Yaf_Response_Abstract', 'options='=>'?array'], +'Yaf_Action_Abstract::redirect' => ['bool', 'url'=>'string'], +'Yaf_Action_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], +'Yaf_Action_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], +'Yaf_Application::__clone' => ['void'], +'Yaf_Application::__construct' => ['void', 'config'=>'mixed', 'envrion='=>'string'], +'Yaf_Application::__destruct' => ['void'], +'Yaf_Application::__sleep' => ['list'], +'Yaf_Application::__wakeup' => ['void'], +'Yaf_Application::app' => ['?Yaf_Application'], +'Yaf_Application::bootstrap' => ['Yaf_Application', 'bootstrap='=>'Yaf_Bootstrap_Abstract'], +'Yaf_Application::clearLastError' => ['Yaf_Application'], +'Yaf_Application::environ' => ['string'], +'Yaf_Application::execute' => ['void', 'entry'=>'callable', '...args'=>'string'], +'Yaf_Application::getAppDirectory' => ['Yaf_Application'], +'Yaf_Application::getConfig' => ['Yaf_Config_Abstract'], +'Yaf_Application::getDispatcher' => ['Yaf_Dispatcher'], +'Yaf_Application::getLastErrorMsg' => ['string'], +'Yaf_Application::getLastErrorNo' => ['int'], +'Yaf_Application::getModules' => ['array'], +'Yaf_Application::run' => ['void'], +'Yaf_Application::setAppDirectory' => ['Yaf_Application', 'directory'=>'string'], +'Yaf_Config_Abstract::__construct' => ['void'], +'Yaf_Config_Abstract::get' => ['mixed', 'name'=>'string', 'value'=>'mixed'], +'Yaf_Config_Abstract::readonly' => ['bool'], +'Yaf_Config_Abstract::set' => ['Yaf_Config_Abstract'], +'Yaf_Config_Abstract::toArray' => ['array'], +'Yaf_Config_Ini::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], +'Yaf_Config_Ini::__get' => ['void', 'name='=>'string'], +'Yaf_Config_Ini::__isset' => ['void', 'name'=>'string'], +'Yaf_Config_Ini::__set' => ['void', 'name'=>'string', 'value'=>'mixed'], +'Yaf_Config_Ini::count' => ['void'], +'Yaf_Config_Ini::current' => ['void'], +'Yaf_Config_Ini::get' => ['mixed', 'name='=>'mixed'], +'Yaf_Config_Ini::key' => ['void'], +'Yaf_Config_Ini::next' => ['void'], +'Yaf_Config_Ini::offsetExists' => ['void', 'name'=>'string'], +'Yaf_Config_Ini::offsetGet' => ['void', 'name'=>'string'], +'Yaf_Config_Ini::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], +'Yaf_Config_Ini::offsetUnset' => ['void', 'name'=>'string'], +'Yaf_Config_Ini::readonly' => ['void'], +'Yaf_Config_Ini::rewind' => ['void'], +'Yaf_Config_Ini::set' => ['Yaf_Config_Abstract', 'name'=>'string', 'value'=>'mixed'], +'Yaf_Config_Ini::toArray' => ['array'], +'Yaf_Config_Ini::valid' => ['void'], +'Yaf_Config_Simple::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], +'Yaf_Config_Simple::__get' => ['void', 'name='=>'string'], +'Yaf_Config_Simple::__isset' => ['void', 'name'=>'string'], +'Yaf_Config_Simple::__set' => ['void', 'name'=>'string', 'value'=>'string'], +'Yaf_Config_Simple::count' => ['void'], +'Yaf_Config_Simple::current' => ['void'], +'Yaf_Config_Simple::get' => ['mixed', 'name='=>'mixed'], +'Yaf_Config_Simple::key' => ['void'], +'Yaf_Config_Simple::next' => ['void'], +'Yaf_Config_Simple::offsetExists' => ['void', 'name'=>'string'], +'Yaf_Config_Simple::offsetGet' => ['void', 'name'=>'string'], +'Yaf_Config_Simple::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], +'Yaf_Config_Simple::offsetUnset' => ['void', 'name'=>'string'], +'Yaf_Config_Simple::readonly' => ['void'], +'Yaf_Config_Simple::rewind' => ['void'], +'Yaf_Config_Simple::set' => ['Yaf_Config_Abstract', 'name'=>'string', 'value'=>'mixed'], +'Yaf_Config_Simple::toArray' => ['array'], +'Yaf_Config_Simple::valid' => ['void'], +'Yaf_Controller_Abstract::__clone' => ['void'], +'Yaf_Controller_Abstract::__construct' => ['void'], +'Yaf_Controller_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'array'], +'Yaf_Controller_Abstract::forward' => ['void', 'action'=>'string', 'parameters='=>'array'], +'Yaf_Controller_Abstract::forward\'1' => ['void', 'controller'=>'string', 'action'=>'string', 'parameters='=>'array'], +'Yaf_Controller_Abstract::forward\'2' => ['void', 'module'=>'string', 'controller'=>'string', 'action'=>'string', 'parameters='=>'array'], +'Yaf_Controller_Abstract::getInvokeArg' => ['void', 'name'=>'string'], +'Yaf_Controller_Abstract::getInvokeArgs' => ['void'], +'Yaf_Controller_Abstract::getModuleName' => ['string'], +'Yaf_Controller_Abstract::getName' => ['string'], +'Yaf_Controller_Abstract::getRequest' => ['Yaf_Request_Abstract'], +'Yaf_Controller_Abstract::getResponse' => ['Yaf_Response_Abstract'], +'Yaf_Controller_Abstract::getView' => ['Yaf_View_Interface'], +'Yaf_Controller_Abstract::getViewpath' => ['void'], +'Yaf_Controller_Abstract::init' => ['void'], +'Yaf_Controller_Abstract::initView' => ['void', 'options='=>'array'], +'Yaf_Controller_Abstract::redirect' => ['bool', 'url'=>'string'], +'Yaf_Controller_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'array'], +'Yaf_Controller_Abstract::setViewpath' => ['void', 'view_directory'=>'string'], +'Yaf_Dispatcher::__clone' => ['void'], +'Yaf_Dispatcher::__construct' => ['void'], +'Yaf_Dispatcher::__sleep' => ['list'], +'Yaf_Dispatcher::__wakeup' => ['void'], +'Yaf_Dispatcher::autoRender' => ['Yaf_Dispatcher', 'flag='=>'bool'], +'Yaf_Dispatcher::catchException' => ['Yaf_Dispatcher', 'flag='=>'bool'], +'Yaf_Dispatcher::disableView' => ['bool'], +'Yaf_Dispatcher::dispatch' => ['Yaf_Response_Abstract', 'request'=>'Yaf_Request_Abstract'], +'Yaf_Dispatcher::enableView' => ['Yaf_Dispatcher'], +'Yaf_Dispatcher::flushInstantly' => ['Yaf_Dispatcher', 'flag='=>'bool'], +'Yaf_Dispatcher::getApplication' => ['Yaf_Application'], +'Yaf_Dispatcher::getDefaultAction' => ['string'], +'Yaf_Dispatcher::getDefaultController' => ['string'], +'Yaf_Dispatcher::getDefaultModule' => ['string'], +'Yaf_Dispatcher::getInstance' => ['Yaf_Dispatcher'], +'Yaf_Dispatcher::getRequest' => ['Yaf_Request_Abstract'], +'Yaf_Dispatcher::getRouter' => ['Yaf_Router'], +'Yaf_Dispatcher::initView' => ['Yaf_View_Interface', 'templates_dir'=>'string', 'options='=>'array'], +'Yaf_Dispatcher::registerPlugin' => ['Yaf_Dispatcher', 'plugin'=>'Yaf_Plugin_Abstract'], +'Yaf_Dispatcher::returnResponse' => ['Yaf_Dispatcher', 'flag'=>'bool'], +'Yaf_Dispatcher::setDefaultAction' => ['Yaf_Dispatcher', 'action'=>'string'], +'Yaf_Dispatcher::setDefaultController' => ['Yaf_Dispatcher', 'controller'=>'string'], +'Yaf_Dispatcher::setDefaultModule' => ['Yaf_Dispatcher', 'module'=>'string'], +'Yaf_Dispatcher::setErrorHandler' => ['Yaf_Dispatcher', 'callback'=>'callable', 'error_types'=>'int'], +'Yaf_Dispatcher::setRequest' => ['Yaf_Dispatcher', 'request'=>'Yaf_Request_Abstract'], +'Yaf_Dispatcher::setView' => ['Yaf_Dispatcher', 'view'=>'Yaf_View_Interface'], +'Yaf_Dispatcher::throwException' => ['Yaf_Dispatcher', 'flag='=>'bool'], +'Yaf_Exception::__construct' => ['void'], +'Yaf_Exception::getPrevious' => ['void'], +'Yaf_Loader::__clone' => ['void'], +'Yaf_Loader::__construct' => ['void'], +'Yaf_Loader::__sleep' => ['list'], +'Yaf_Loader::__wakeup' => ['void'], +'Yaf_Loader::autoload' => ['void'], +'Yaf_Loader::clearLocalNamespace' => ['void'], +'Yaf_Loader::getInstance' => ['Yaf_Loader'], +'Yaf_Loader::getLibraryPath' => ['Yaf_Loader', 'is_global='=>'bool'], +'Yaf_Loader::getLocalNamespace' => ['void'], +'Yaf_Loader::getNamespacePath' => ['string', 'namespaces'=>'string'], +'Yaf_Loader::import' => ['bool'], +'Yaf_Loader::isLocalName' => ['bool'], +'Yaf_Loader::registerLocalNamespace' => ['void', 'prefix'=>'mixed'], +'Yaf_Loader::registerNamespace' => ['bool', 'namespaces'=>'string|array', 'path='=>'string'], +'Yaf_Loader::setLibraryPath' => ['Yaf_Loader', 'directory'=>'string', 'is_global='=>'bool'], +'Yaf_Plugin_Abstract::dispatchLoopShutdown' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], +'Yaf_Plugin_Abstract::dispatchLoopStartup' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], +'Yaf_Plugin_Abstract::postDispatch' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], +'Yaf_Plugin_Abstract::preDispatch' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], +'Yaf_Plugin_Abstract::preResponse' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], +'Yaf_Plugin_Abstract::routerShutdown' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], +'Yaf_Plugin_Abstract::routerStartup' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], +'Yaf_Registry::__clone' => ['void'], +'Yaf_Registry::__construct' => ['void'], +'Yaf_Registry::del' => ['void', 'name'=>'string'], +'Yaf_Registry::get' => ['mixed', 'name'=>'string'], +'Yaf_Registry::has' => ['bool', 'name'=>'string'], +'Yaf_Registry::set' => ['bool', 'name'=>'string', 'value'=>'string'], +'Yaf_Request_Abstract::clearParams' => ['bool'], +'Yaf_Request_Abstract::getActionName' => ['void'], +'Yaf_Request_Abstract::getBaseUri' => ['void'], +'Yaf_Request_Abstract::getControllerName' => ['void'], +'Yaf_Request_Abstract::getEnv' => ['void', 'name'=>'string', 'default='=>'string'], +'Yaf_Request_Abstract::getException' => ['void'], +'Yaf_Request_Abstract::getLanguage' => ['void'], +'Yaf_Request_Abstract::getMethod' => ['void'], +'Yaf_Request_Abstract::getModuleName' => ['void'], +'Yaf_Request_Abstract::getParam' => ['void', 'name'=>'string', 'default='=>'string'], +'Yaf_Request_Abstract::getParams' => ['void'], +'Yaf_Request_Abstract::getRequestUri' => ['void'], +'Yaf_Request_Abstract::getServer' => ['void', 'name'=>'string', 'default='=>'string'], +'Yaf_Request_Abstract::isCli' => ['void'], +'Yaf_Request_Abstract::isDispatched' => ['void'], +'Yaf_Request_Abstract::isGet' => ['void'], +'Yaf_Request_Abstract::isHead' => ['void'], +'Yaf_Request_Abstract::isOptions' => ['void'], +'Yaf_Request_Abstract::isPost' => ['void'], +'Yaf_Request_Abstract::isPut' => ['void'], +'Yaf_Request_Abstract::isRouted' => ['void'], +'Yaf_Request_Abstract::isXmlHttpRequest' => ['void'], +'Yaf_Request_Abstract::setActionName' => ['void', 'action'=>'string'], +'Yaf_Request_Abstract::setBaseUri' => ['bool', 'uir'=>'string'], +'Yaf_Request_Abstract::setControllerName' => ['void', 'controller'=>'string'], +'Yaf_Request_Abstract::setDispatched' => ['void'], +'Yaf_Request_Abstract::setModuleName' => ['void', 'module'=>'string'], +'Yaf_Request_Abstract::setParam' => ['void', 'name'=>'string', 'value='=>'string'], +'Yaf_Request_Abstract::setRequestUri' => ['void', 'uir'=>'string'], +'Yaf_Request_Abstract::setRouted' => ['void', 'flag='=>'string'], +'Yaf_Request_Http::__clone' => ['void'], +'Yaf_Request_Http::__construct' => ['void'], +'Yaf_Request_Http::get' => ['mixed', 'name'=>'string', 'default='=>'string'], +'Yaf_Request_Http::getActionName' => ['string'], +'Yaf_Request_Http::getBaseUri' => ['string'], +'Yaf_Request_Http::getControllerName' => ['string'], +'Yaf_Request_Http::getCookie' => ['mixed', 'name'=>'string', 'default='=>'string'], +'Yaf_Request_Http::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf_Request_Http::getException' => ['Yaf_Exception'], +'Yaf_Request_Http::getFiles' => ['void'], +'Yaf_Request_Http::getLanguage' => ['string'], +'Yaf_Request_Http::getMethod' => ['string'], +'Yaf_Request_Http::getModuleName' => ['string'], +'Yaf_Request_Http::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], +'Yaf_Request_Http::getParams' => ['array'], +'Yaf_Request_Http::getPost' => ['mixed', 'name'=>'string', 'default='=>'string'], +'Yaf_Request_Http::getQuery' => ['mixed', 'name'=>'string', 'default='=>'string'], +'Yaf_Request_Http::getRaw' => ['mixed'], +'Yaf_Request_Http::getRequest' => ['void'], +'Yaf_Request_Http::getRequestUri' => ['string'], +'Yaf_Request_Http::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf_Request_Http::isCli' => ['bool'], +'Yaf_Request_Http::isDispatched' => ['bool'], +'Yaf_Request_Http::isGet' => ['bool'], +'Yaf_Request_Http::isHead' => ['bool'], +'Yaf_Request_Http::isOptions' => ['bool'], +'Yaf_Request_Http::isPost' => ['bool'], +'Yaf_Request_Http::isPut' => ['bool'], +'Yaf_Request_Http::isRouted' => ['bool'], +'Yaf_Request_Http::isXmlHttpRequest' => ['bool'], +'Yaf_Request_Http::setActionName' => ['Yaf_Request_Abstract|bool', 'action'=>'string'], +'Yaf_Request_Http::setBaseUri' => ['bool', 'uri'=>'string'], +'Yaf_Request_Http::setControllerName' => ['Yaf_Request_Abstract|bool', 'controller'=>'string'], +'Yaf_Request_Http::setDispatched' => ['bool'], +'Yaf_Request_Http::setModuleName' => ['Yaf_Request_Abstract|bool', 'module'=>'string'], +'Yaf_Request_Http::setParam' => ['Yaf_Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], +'Yaf_Request_Http::setRequestUri' => ['', 'uri'=>'string'], +'Yaf_Request_Http::setRouted' => ['Yaf_Request_Abstract|bool'], +'Yaf_Request_Simple::__clone' => ['void'], +'Yaf_Request_Simple::__construct' => ['void'], +'Yaf_Request_Simple::get' => ['void'], +'Yaf_Request_Simple::getActionName' => ['string'], +'Yaf_Request_Simple::getBaseUri' => ['string'], +'Yaf_Request_Simple::getControllerName' => ['string'], +'Yaf_Request_Simple::getCookie' => ['void'], +'Yaf_Request_Simple::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf_Request_Simple::getException' => ['Yaf_Exception'], +'Yaf_Request_Simple::getFiles' => ['void'], +'Yaf_Request_Simple::getLanguage' => ['string'], +'Yaf_Request_Simple::getMethod' => ['string'], +'Yaf_Request_Simple::getModuleName' => ['string'], +'Yaf_Request_Simple::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], +'Yaf_Request_Simple::getParams' => ['array'], +'Yaf_Request_Simple::getPost' => ['void'], +'Yaf_Request_Simple::getQuery' => ['void'], +'Yaf_Request_Simple::getRequest' => ['void'], +'Yaf_Request_Simple::getRequestUri' => ['string'], +'Yaf_Request_Simple::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], +'Yaf_Request_Simple::isCli' => ['bool'], +'Yaf_Request_Simple::isDispatched' => ['bool'], +'Yaf_Request_Simple::isGet' => ['bool'], +'Yaf_Request_Simple::isHead' => ['bool'], +'Yaf_Request_Simple::isOptions' => ['bool'], +'Yaf_Request_Simple::isPost' => ['bool'], +'Yaf_Request_Simple::isPut' => ['bool'], +'Yaf_Request_Simple::isRouted' => ['bool'], +'Yaf_Request_Simple::isXmlHttpRequest' => ['void'], +'Yaf_Request_Simple::setActionName' => ['Yaf_Request_Abstract|bool', 'action'=>'string'], +'Yaf_Request_Simple::setBaseUri' => ['bool', 'uri'=>'string'], +'Yaf_Request_Simple::setControllerName' => ['Yaf_Request_Abstract|bool', 'controller'=>'string'], +'Yaf_Request_Simple::setDispatched' => ['bool'], +'Yaf_Request_Simple::setModuleName' => ['Yaf_Request_Abstract|bool', 'module'=>'string'], +'Yaf_Request_Simple::setParam' => ['Yaf_Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], +'Yaf_Request_Simple::setRequestUri' => ['', 'uri'=>'string'], +'Yaf_Request_Simple::setRouted' => ['Yaf_Request_Abstract|bool'], +'Yaf_Response_Abstract::__clone' => ['void'], +'Yaf_Response_Abstract::__construct' => ['void'], +'Yaf_Response_Abstract::__destruct' => ['void'], +'Yaf_Response_Abstract::__toString' => ['string'], +'Yaf_Response_Abstract::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf_Response_Abstract::clearBody' => ['bool', 'key='=>'string'], +'Yaf_Response_Abstract::clearHeaders' => ['void'], +'Yaf_Response_Abstract::getBody' => ['mixed', 'key='=>'string'], +'Yaf_Response_Abstract::getHeader' => ['void'], +'Yaf_Response_Abstract::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf_Response_Abstract::response' => ['void'], +'Yaf_Response_Abstract::setAllHeaders' => ['void'], +'Yaf_Response_Abstract::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf_Response_Abstract::setHeader' => ['void'], +'Yaf_Response_Abstract::setRedirect' => ['void'], +'Yaf_Response_Cli::__clone' => ['void'], +'Yaf_Response_Cli::__construct' => ['void'], +'Yaf_Response_Cli::__destruct' => ['void'], +'Yaf_Response_Cli::__toString' => ['string'], +'Yaf_Response_Cli::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf_Response_Cli::clearBody' => ['bool', 'key='=>'string'], +'Yaf_Response_Cli::getBody' => ['mixed', 'key='=>'?string'], +'Yaf_Response_Cli::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf_Response_Cli::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf_Response_Http::__clone' => ['void'], +'Yaf_Response_Http::__construct' => ['void'], +'Yaf_Response_Http::__destruct' => ['void'], +'Yaf_Response_Http::__toString' => ['string'], +'Yaf_Response_Http::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf_Response_Http::clearBody' => ['bool', 'key='=>'string'], +'Yaf_Response_Http::clearHeaders' => ['Yaf_Response_Abstract|false', 'name='=>'string'], +'Yaf_Response_Http::getBody' => ['mixed', 'key='=>'?string'], +'Yaf_Response_Http::getHeader' => ['mixed', 'name='=>'string'], +'Yaf_Response_Http::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf_Response_Http::response' => ['bool'], +'Yaf_Response_Http::setAllHeaders' => ['bool', 'headers'=>'array'], +'Yaf_Response_Http::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], +'Yaf_Response_Http::setHeader' => ['bool', 'name'=>'string', 'value'=>'string', 'replace='=>'bool', 'response_code='=>'int'], +'Yaf_Response_Http::setRedirect' => ['bool', 'url'=>'string'], +'Yaf_Route_Interface::__construct' => ['void'], +'Yaf_Route_Interface::assemble' => ['string', 'info'=>'array', 'query='=>'array'], +'Yaf_Route_Interface::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], +'Yaf_Route_Map::__construct' => ['void', 'controller_prefer='=>'string', 'delimiter='=>'string'], +'Yaf_Route_Map::assemble' => ['string', 'info'=>'array', 'query='=>'array'], +'Yaf_Route_Map::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], +'Yaf_Route_Regex::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'map='=>'array', 'verify='=>'array', 'reverse='=>'string'], +'Yaf_Route_Regex::addConfig' => ['Yaf_Router|bool', 'config'=>'Yaf_Config_Abstract'], +'Yaf_Route_Regex::addRoute' => ['Yaf_Router|bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], +'Yaf_Route_Regex::assemble' => ['string', 'info'=>'array', 'query='=>'array'], +'Yaf_Route_Regex::getCurrentRoute' => ['string'], +'Yaf_Route_Regex::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], +'Yaf_Route_Regex::getRoutes' => ['Yaf_Route_Interface[]'], +'Yaf_Route_Regex::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], +'Yaf_Route_Rewrite::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'verify='=>'array'], +'Yaf_Route_Rewrite::addConfig' => ['Yaf_Router|bool', 'config'=>'Yaf_Config_Abstract'], +'Yaf_Route_Rewrite::addRoute' => ['Yaf_Router|bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], +'Yaf_Route_Rewrite::assemble' => ['string', 'info'=>'array', 'query='=>'array'], +'Yaf_Route_Rewrite::getCurrentRoute' => ['string'], +'Yaf_Route_Rewrite::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], +'Yaf_Route_Rewrite::getRoutes' => ['Yaf_Route_Interface[]'], +'Yaf_Route_Rewrite::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], +'Yaf_Route_Simple::__construct' => ['void', 'module_name'=>'string', 'controller_name'=>'string', 'action_name'=>'string'], +'Yaf_Route_Simple::assemble' => ['string', 'info'=>'array', 'query='=>'array'], +'Yaf_Route_Simple::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], +'Yaf_Route_Static::assemble' => ['string', 'info'=>'array', 'query='=>'array'], +'Yaf_Route_Static::match' => ['void', 'uri'=>'string'], +'Yaf_Route_Static::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], +'Yaf_Route_Supervar::__construct' => ['void', 'supervar_name'=>'string'], +'Yaf_Route_Supervar::assemble' => ['string', 'info'=>'array', 'query='=>'array'], +'Yaf_Route_Supervar::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], +'Yaf_Router::__construct' => ['void'], +'Yaf_Router::addConfig' => ['bool', 'config'=>'Yaf_Config_Abstract'], +'Yaf_Router::addRoute' => ['bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], +'Yaf_Router::getCurrentRoute' => ['string'], +'Yaf_Router::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], +'Yaf_Router::getRoutes' => ['mixed'], +'Yaf_Router::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], +'Yaf_Session::__clone' => ['void'], +'Yaf_Session::__construct' => ['void'], +'Yaf_Session::__get' => ['void', 'name'=>'string'], +'Yaf_Session::__isset' => ['void', 'name'=>'string'], +'Yaf_Session::__set' => ['void', 'name'=>'string', 'value'=>'string'], +'Yaf_Session::__sleep' => ['list'], +'Yaf_Session::__unset' => ['void', 'name'=>'string'], +'Yaf_Session::__wakeup' => ['void'], +'Yaf_Session::count' => ['void'], +'Yaf_Session::current' => ['void'], +'Yaf_Session::del' => ['void', 'name'=>'string'], +'Yaf_Session::get' => ['mixed', 'name'=>'string'], +'Yaf_Session::getInstance' => ['void'], +'Yaf_Session::has' => ['void', 'name'=>'string'], +'Yaf_Session::key' => ['void'], +'Yaf_Session::next' => ['void'], +'Yaf_Session::offsetExists' => ['void', 'name'=>'string'], +'Yaf_Session::offsetGet' => ['void', 'name'=>'string'], +'Yaf_Session::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], +'Yaf_Session::offsetUnset' => ['void', 'name'=>'string'], +'Yaf_Session::rewind' => ['void'], +'Yaf_Session::set' => ['Yaf_Session|bool', 'name'=>'string', 'value'=>'mixed'], +'Yaf_Session::start' => ['void'], +'Yaf_Session::valid' => ['void'], +'Yaf_View_Interface::assign' => ['bool', 'name'=>'string', 'value='=>'string'], +'Yaf_View_Interface::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'array'], +'Yaf_View_Interface::getScriptPath' => ['string'], +'Yaf_View_Interface::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'array'], +'Yaf_View_Interface::setScriptPath' => ['void', 'template_dir'=>'string'], +'Yaf_View_Simple::__construct' => ['void', 'tempalte_dir'=>'string', 'options='=>'array'], +'Yaf_View_Simple::__get' => ['void', 'name='=>'string'], +'Yaf_View_Simple::__isset' => ['void', 'name'=>'string'], +'Yaf_View_Simple::__set' => ['void', 'name'=>'string', 'value'=>'mixed'], +'Yaf_View_Simple::assign' => ['bool', 'name'=>'string', 'value='=>'mixed'], +'Yaf_View_Simple::assignRef' => ['bool', 'name'=>'string', '&rw_value'=>'mixed'], +'Yaf_View_Simple::clear' => ['bool', 'name='=>'string'], +'Yaf_View_Simple::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'array'], +'Yaf_View_Simple::eval' => ['string', 'tpl_content'=>'string', 'tpl_vars='=>'array'], +'Yaf_View_Simple::getScriptPath' => ['string'], +'Yaf_View_Simple::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'array'], +'Yaf_View_Simple::setScriptPath' => ['bool', 'template_dir'=>'string'], +'yaml_emit' => ['string', 'data'=>'mixed', 'encoding='=>'int', 'linebreak='=>'int'], +'yaml_emit_file' => ['bool', 'filename'=>'string', 'data'=>'mixed', 'encoding='=>'int', 'linebreak='=>'int'], +'yaml_parse' => ['mixed|false', 'input'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], +'yaml_parse_file' => ['mixed|false', 'filename'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], +'yaml_parse_url' => ['mixed|false', 'url'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], +'Yar_Client::__call' => ['void', 'method'=>'string', 'parameters'=>'array'], +'Yar_Client::__construct' => ['void', 'url'=>'string'], +'Yar_Client::setOpt' => ['Yar_Client|false', 'name'=>'int', 'value'=>'mixed'], +'Yar_Client_Exception::__clone' => ['void'], +'Yar_Client_Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'Yar_Client_Exception::__toString' => ['string'], +'Yar_Client_Exception::__wakeup' => ['void'], +'Yar_Client_Exception::getCode' => ['int'], +'Yar_Client_Exception::getFile' => ['string'], +'Yar_Client_Exception::getLine' => ['int'], +'Yar_Client_Exception::getMessage' => ['string'], +'Yar_Client_Exception::getPrevious' => ['?Exception|?Throwable'], +'Yar_Client_Exception::getTrace' => ['list\',args?:array}>'], +'Yar_Client_Exception::getTraceAsString' => ['string'], +'Yar_Client_Exception::getType' => ['string'], +'Yar_Concurrent_Client::call' => ['int', 'uri'=>'string', 'method'=>'string', 'parameters'=>'array', 'callback='=>'callable'], +'Yar_Concurrent_Client::loop' => ['bool', 'callback='=>'callable', 'error_callback='=>'callable'], +'Yar_Concurrent_Client::reset' => ['bool'], +'Yar_Server::__construct' => ['void', 'object'=>'Object'], +'Yar_Server::handle' => ['bool'], +'Yar_Server_Exception::__clone' => ['void'], +'Yar_Server_Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], +'Yar_Server_Exception::__toString' => ['string'], +'Yar_Server_Exception::__wakeup' => ['void'], +'Yar_Server_Exception::getCode' => ['int'], +'Yar_Server_Exception::getFile' => ['string'], +'Yar_Server_Exception::getLine' => ['int'], +'Yar_Server_Exception::getMessage' => ['string'], +'Yar_Server_Exception::getPrevious' => ['?Exception|?Throwable'], +'Yar_Server_Exception::getTrace' => ['list\',args?:array}>'], +'Yar_Server_Exception::getTraceAsString' => ['string'], +'Yar_Server_Exception::getType' => ['string'], +'yaz_addinfo' => ['string', 'id'=>'resource'], +'yaz_ccl_conf' => ['void', 'id'=>'resource', 'config'=>'array'], +'yaz_ccl_parse' => ['bool', 'id'=>'resource', 'query'=>'string', '&w_result'=>'array'], +'yaz_close' => ['bool', 'id'=>'resource'], +'yaz_connect' => ['mixed', 'zurl'=>'string', 'options='=>'mixed'], +'yaz_database' => ['bool', 'id'=>'resource', 'databases'=>'string'], +'yaz_element' => ['bool', 'id'=>'resource', 'elementset'=>'string'], +'yaz_errno' => ['int', 'id'=>'resource'], +'yaz_error' => ['string', 'id'=>'resource'], +'yaz_es' => ['void', 'id'=>'resource', 'type'=>'string', 'args'=>'array'], +'yaz_es_result' => ['array', 'id'=>'resource'], +'yaz_get_option' => ['string', 'id'=>'resource', 'name'=>'string'], +'yaz_hits' => ['int', 'id'=>'resource', 'searchresult='=>'array'], +'yaz_itemorder' => ['void', 'id'=>'resource', 'args'=>'array'], +'yaz_present' => ['bool', 'id'=>'resource'], +'yaz_range' => ['void', 'id'=>'resource', 'start'=>'int', 'number'=>'int'], +'yaz_record' => ['string', 'id'=>'resource', 'pos'=>'int', 'type'=>'string'], +'yaz_scan' => ['void', 'id'=>'resource', 'type'=>'string', 'startterm'=>'string', 'flags='=>'array'], +'yaz_scan_result' => ['array', 'id'=>'resource', 'result='=>'array'], +'yaz_schema' => ['void', 'id'=>'resource', 'schema'=>'string'], +'yaz_search' => ['bool', 'id'=>'resource', 'type'=>'string', 'query'=>'string'], +'yaz_set_option' => ['', 'id'=>'', 'name'=>'string', 'value'=>'string', 'options'=>'array'], +'yaz_sort' => ['void', 'id'=>'resource', 'criteria'=>'string'], +'yaz_syntax' => ['void', 'id'=>'resource', 'syntax'=>'string'], +'yaz_wait' => ['mixed', '&rw_options='=>'array'], +'yp_all' => ['void', 'domain'=>'string', 'map'=>'string', 'callback'=>'string'], +'yp_cat' => ['array', 'domain'=>'string', 'map'=>'string'], +'yp_err_string' => ['string', 'errorcode'=>'int'], +'yp_errno' => ['int'], +'yp_first' => ['array', 'domain'=>'string', 'map'=>'string'], +'yp_get_default_domain' => ['string'], +'yp_master' => ['string', 'domain'=>'string', 'map'=>'string'], +'yp_match' => ['string', 'domain'=>'string', 'map'=>'string', 'key'=>'string'], +'yp_next' => ['array', 'domain'=>'string', 'map'=>'string', 'key'=>'string'], +'yp_order' => ['int', 'domain'=>'string', 'map'=>'string'], +'zem_get_extension_info_by_id' => [''], +'zem_get_extension_info_by_name' => [''], +'zem_get_extensions_info' => [''], +'zem_get_license_info' => [''], +'zend_current_obfuscation_level' => ['int'], +'zend_disk_cache_clear' => ['bool', 'namespace='=>'mixed|string'], +'zend_disk_cache_delete' => ['mixed|null', 'key'=>'string'], +'zend_disk_cache_fetch' => ['mixed|null', 'key'=>'string'], +'zend_disk_cache_store' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int|mixed'], +'zend_get_id' => ['array', 'all_ids='=>'all_ids|false'], +'zend_is_configuration_changed' => [''], +'zend_loader_current_file' => ['string'], +'zend_loader_enabled' => ['bool'], +'zend_loader_file_encoded' => ['bool'], +'zend_loader_file_licensed' => ['array'], +'zend_loader_install_license' => ['bool', 'license_file'=>'string', 'override'=>'bool'], +'zend_logo_guid' => ['string'], +'zend_obfuscate_class_name' => ['string', 'class_name'=>'string'], +'zend_obfuscate_function_name' => ['string', 'function_name'=>'string'], +'zend_optimizer_version' => ['string'], +'zend_runtime_obfuscate' => ['void'], +'zend_send_buffer' => ['null|false', 'buffer'=>'string', 'mime_type='=>'string', 'custom_headers='=>'string'], +'zend_send_file' => ['null|false', 'filename'=>'string', 'mime_type='=>'string', 'custom_headers='=>'string'], +'zend_set_configuration_changed' => [''], +'zend_shm_cache_clear' => ['bool', 'namespace='=>'mixed|string'], +'zend_shm_cache_delete' => ['mixed|null', 'key'=>'string'], +'zend_shm_cache_fetch' => ['mixed|null', 'key'=>'string'], +'zend_shm_cache_store' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int|mixed'], +'zend_thread_id' => ['int'], +'zend_version' => ['string'], +'ZendAPI_Job::addJobToQueue' => ['int', 'jobqueue_url'=>'string', 'password'=>'string'], +'ZendAPI_Job::getApplicationID' => [''], +'ZendAPI_Job::getEndTime' => [''], +'ZendAPI_Job::getGlobalVariables' => [''], +'ZendAPI_Job::getHost' => [''], +'ZendAPI_Job::getID' => [''], +'ZendAPI_Job::getInterval' => [''], +'ZendAPI_Job::getJobDependency' => [''], +'ZendAPI_Job::getJobName' => [''], +'ZendAPI_Job::getJobPriority' => [''], +'ZendAPI_Job::getJobStatus' => ['int'], +'ZendAPI_Job::getLastPerformedStatus' => ['int'], +'ZendAPI_Job::getOutput' => ['An'], +'ZendAPI_Job::getPreserved' => [''], +'ZendAPI_Job::getProperties' => ['array'], +'ZendAPI_Job::getScheduledTime' => [''], +'ZendAPI_Job::getScript' => [''], +'ZendAPI_Job::getTimeToNextRepeat' => ['int'], +'ZendAPI_Job::getUserVariables' => [''], +'ZendAPI_Job::setApplicationID' => ['', 'app_id'=>''], +'ZendAPI_Job::setGlobalVariables' => ['', 'vars'=>''], +'ZendAPI_Job::setJobDependency' => ['', 'job_id'=>''], +'ZendAPI_Job::setJobName' => ['', 'name'=>''], +'ZendAPI_Job::setJobPriority' => ['', 'priority'=>'int'], +'ZendAPI_Job::setPreserved' => ['', 'preserved'=>''], +'ZendAPI_Job::setRecurrenceData' => ['', 'interval'=>'', 'end_time='=>'mixed'], +'ZendAPI_Job::setScheduledTime' => ['', 'timestamp'=>''], +'ZendAPI_Job::setScript' => ['', 'script'=>''], +'ZendAPI_Job::setUserVariables' => ['', 'vars'=>''], +'ZendAPI_Job::ZendAPI_Job' => ['Job', 'script'=>'script'], +'ZendAPI_Queue::addJob' => ['int', '&job'=>'Job'], +'ZendAPI_Queue::getAllApplicationIDs' => ['array'], +'ZendAPI_Queue::getAllhosts' => ['array'], +'ZendAPI_Queue::getHistoricJobs' => ['array', 'status'=>'int', 'start_time'=>'', 'end_time'=>'', 'index'=>'int', 'count'=>'int', '&total'=>'int'], +'ZendAPI_Queue::getJob' => ['Job', 'job_id'=>'int'], +'ZendAPI_Queue::getJobsInQueue' => ['array', 'filter_options='=>'array', 'max_jobs='=>'int', 'with_globals_and_output='=>'bool'], +'ZendAPI_Queue::getLastError' => ['string'], +'ZendAPI_Queue::getNumOfJobsInQueue' => ['int', 'filter_options='=>'array'], +'ZendAPI_Queue::getStatistics' => ['array'], +'ZendAPI_Queue::isScriptExists' => ['bool', 'path'=>'string'], +'ZendAPI_Queue::isSuspend' => ['bool'], +'ZendAPI_Queue::login' => ['bool', 'password'=>'string', 'application_id='=>'int'], +'ZendAPI_Queue::removeJob' => ['bool', 'job_id'=>'array|int'], +'ZendAPI_Queue::requeueJob' => ['bool', 'job'=>'Job'], +'ZendAPI_Queue::resumeJob' => ['bool', 'job_id'=>'array|int'], +'ZendAPI_Queue::resumeQueue' => ['bool'], +'ZendAPI_Queue::setMaxHistoryTime' => ['bool'], +'ZendAPI_Queue::suspendJob' => ['bool', 'job_id'=>'array|int'], +'ZendAPI_Queue::suspendQueue' => ['bool'], +'ZendAPI_Queue::updateJob' => ['int', '&job'=>'Job'], +'ZendAPI_Queue::zendapi_queue' => ['ZendAPI_Queue', 'queue_url'=>'string'], +'zip_close' => ['void', 'zip'=>'resource'], +'zip_entry_close' => ['bool', 'zip_ent'=>'resource'], +'zip_entry_compressedsize' => ['int', 'zip_entry'=>'resource'], +'zip_entry_compressionmethod' => ['string', 'zip_entry'=>'resource'], +'zip_entry_filesize' => ['int', 'zip_entry'=>'resource'], +'zip_entry_name' => ['string', 'zip_entry'=>'resource'], +'zip_entry_open' => ['bool', 'zip_dp'=>'resource', 'zip_entry'=>'resource', 'mode='=>'string'], +'zip_entry_read' => ['string|false', 'zip_entry'=>'resource', 'len='=>'int'], +'zip_open' => ['resource|int|false', 'filename'=>'string'], +'zip_read' => ['resource', 'zip'=>'resource'], +'ZipArchive::addEmptyDir' => ['bool', 'dirname'=>'string'], +'ZipArchive::addFile' => ['bool', 'filepath'=>'string', 'entryname='=>'string', 'start='=>'int', 'length='=>'int'], +'ZipArchive::addFromString' => ['bool', 'entryname'=>'string', 'content'=>'string'], +'ZipArchive::addGlob' => ['bool', 'pattern'=>'string', 'flags='=>'int', 'options='=>'array'], +'ZipArchive::addPattern' => ['bool', 'pattern'=>'string', 'path='=>'string', 'options='=>'array'], +'ZipArchive::close' => ['bool'], +'ZipArchive::count' => ['int'], +'ZipArchive::createEmptyDir' => ['bool', 'dirname'=>'string'], +'ZipArchive::deleteIndex' => ['bool', 'index'=>'int'], +'ZipArchive::deleteName' => ['bool', 'name'=>'string'], +'ZipArchive::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string[]|string'], +'ZipArchive::getArchiveComment' => ['string|false', 'flags='=>'int'], +'ZipArchive::getCommentIndex' => ['string|false', 'index'=>'int', 'flags='=>'int'], +'ZipArchive::getCommentName' => ['string|false', 'name'=>'string', 'flags='=>'int'], +'ZipArchive::getExternalAttributesIndex' => ['bool', 'index'=>'int', '&w_opsys'=>'int', '&w_attr'=>'int', 'flags='=>'int'], +'ZipArchive::getExternalAttributesName' => ['bool', 'name'=>'string', '&w_opsys'=>'int', '&w_attr'=>'int', 'flags='=>'int'], +'ZipArchive::getFromIndex' => ['string|false', 'index'=>'int', 'length='=>'int', 'flags='=>'int'], +'ZipArchive::getFromName' => ['string|false', 'entryname'=>'string', 'length='=>'int', 'flags='=>'int'], +'ZipArchive::getNameIndex' => ['string|false', 'index'=>'int', 'flags='=>'int'], +'ZipArchive::getStatusString' => ['string|false'], +'ZipArchive::getStream' => ['resource|false', 'entryname'=>'string'], +'ZipArchive::isCompressionMethodSupported' => ['bool', 'method'=>'int', 'encode='=>'bool'], +'ZipArchive::isEncryptionMethodSupported' => ['bool', 'method'=>'int', 'encode='=>'bool'], +'ZipArchive::locateName' => ['int|false', 'filename'=>'string', 'flags='=>'int'], +'ZipArchive::open' => ['int|bool', 'source'=>'string', 'flags='=>'int'], +'ZipArchive::registerCancelCallback' => ['bool', 'callback'=>'callable'], +'ZipArchive::registerProgressCallback' => ['bool', 'rate'=>'float', 'callback'=>'callable'], +'ZipArchive::renameIndex' => ['bool', 'index'=>'int', 'new_name'=>'string'], +'ZipArchive::renameName' => ['bool', 'name'=>'string', 'new_name'=>'string'], +'ZipArchive::replaceFile' => ['bool', 'filename'=>'string', 'index'=>'int', 'start='=>'int', 'length='=>'int', 'flags='=>'int'], +'ZipArchive::setArchiveComment' => ['bool', 'comment'=>'string'], +'ZipArchive::setCommentIndex' => ['bool', 'index'=>'int', 'comment'=>'string'], +'ZipArchive::setCommentName' => ['bool', 'name'=>'string', 'comment'=>'string'], +'ZipArchive::setCompressionIndex' => ['bool', 'index'=>'int', 'comp_method'=>'int', 'comp_flags='=>'int'], +'ZipArchive::setCompressionName' => ['bool', 'name'=>'string', 'comp_method'=>'int', 'comp_flags='=>'int'], +'ZipArchive::setEncryptionIndex' => ['bool', 'index'=>'int', 'method'=>'string', 'password='=>'string'], +'ZipArchive::setEncryptionName' => ['bool', 'name'=>'string', 'method'=>'int', 'password='=>'string'], +'ZipArchive::setExternalAttributesIndex' => ['bool', 'index'=>'int', 'opsys'=>'int', 'attr'=>'int', 'flags='=>'int'], +'ZipArchive::setExternalAttributesName' => ['bool', 'name'=>'string', 'opsys'=>'int', 'attr'=>'int', 'flags='=>'int'], +'ZipArchive::setMtimeIndex' => ['bool', 'index'=>'int', 'timestamp'=>'int', 'flags='=>'int'], +'ZipArchive::setMtimeName' => ['bool', 'name'=>'string', 'timestamp'=>'int', 'flags='=>'int'], +'ZipArchive::setPassword' => ['bool', 'password'=>'string'], +'ZipArchive::statIndex' => ['array|false', 'index'=>'int', 'flags='=>'int'], +'ZipArchive::statName' => ['array|false', 'filename'=>'string', 'flags='=>'int'], +'ZipArchive::unchangeAll' => ['bool'], +'ZipArchive::unchangeArchive' => ['bool'], +'ZipArchive::unchangeIndex' => ['bool', 'index'=>'int'], +'ZipArchive::unchangeName' => ['bool', 'name'=>'string'], +'zlib_decode' => ['string|false', 'data'=>'string', 'max_length='=>'int'], +'zlib_encode' => ['string', 'data'=>'string', 'encoding'=>'int', 'level='=>'string|int'], +'zlib_get_coding_type' => ['string|false'], +'ZMQ::__construct' => ['void'], +'ZMQContext::__construct' => ['void', 'io_threads='=>'int', 'is_persistent='=>'bool'], +'ZMQContext::getOpt' => ['int|string', 'key'=>'string'], +'ZMQContext::getSocket' => ['ZMQSocket', 'type'=>'int', 'persistent_id='=>'string', 'on_new_socket='=>'callable'], +'ZMQContext::isPersistent' => ['bool'], +'ZMQContext::setOpt' => ['ZMQContext', 'key'=>'int', 'value'=>'mixed'], +'ZMQDevice::__construct' => ['void', 'frontend'=>'ZMQSocket', 'backend'=>'ZMQSocket', 'listener='=>'ZMQSocket'], +'ZMQDevice::getIdleTimeout' => ['ZMQDevice'], +'ZMQDevice::getTimerTimeout' => ['ZMQDevice'], +'ZMQDevice::run' => ['void'], +'ZMQDevice::setIdleCallback' => ['ZMQDevice', 'cb_func'=>'callable', 'timeout'=>'int', 'user_data='=>'mixed'], +'ZMQDevice::setIdleTimeout' => ['ZMQDevice', 'timeout'=>'int'], +'ZMQDevice::setTimerCallback' => ['ZMQDevice', 'cb_func'=>'callable', 'timeout'=>'int', 'user_data='=>'mixed'], +'ZMQDevice::setTimerTimeout' => ['ZMQDevice', 'timeout'=>'int'], +'ZMQPoll::add' => ['string', 'entry'=>'mixed', 'type'=>'int'], +'ZMQPoll::clear' => ['ZMQPoll'], +'ZMQPoll::count' => ['int'], +'ZMQPoll::getLastErrors' => ['array'], +'ZMQPoll::poll' => ['int', '&w_readable'=>'array', '&w_writable'=>'array', 'timeout='=>'int'], +'ZMQPoll::remove' => ['bool', 'item'=>'mixed'], +'ZMQSocket::__construct' => ['void', 'context'=>'ZMQContext', 'type'=>'int', 'persistent_id='=>'string', 'on_new_socket='=>'callable'], +'ZMQSocket::bind' => ['ZMQSocket', 'dsn'=>'string', 'force='=>'bool'], +'ZMQSocket::connect' => ['ZMQSocket', 'dsn'=>'string', 'force='=>'bool'], +'ZMQSocket::disconnect' => ['ZMQSocket', 'dsn'=>'string'], +'ZMQSocket::getEndpoints' => ['array'], +'ZMQSocket::getPersistentId' => ['?string'], +'ZMQSocket::getSocketType' => ['int'], +'ZMQSocket::getSockOpt' => ['int|string', 'key'=>'string'], +'ZMQSocket::isPersistent' => ['bool'], +'ZMQSocket::recv' => ['string', 'mode='=>'int'], +'ZMQSocket::recvMulti' => ['string[]', 'mode='=>'int'], +'ZMQSocket::send' => ['ZMQSocket', 'message'=>'array', 'mode='=>'int'], +'ZMQSocket::send\'1' => ['ZMQSocket', 'message'=>'string', 'mode='=>'int'], +'ZMQSocket::sendmulti' => ['ZMQSocket', 'message'=>'array', 'mode='=>'int'], +'ZMQSocket::setSockOpt' => ['ZMQSocket', 'key'=>'int', 'value'=>'mixed'], +'ZMQSocket::unbind' => ['ZMQSocket', 'dsn'=>'string'], +'Zookeeper::addAuth' => ['bool', 'scheme'=>'string', 'cert'=>'string', 'completion_cb='=>'callable'], +'Zookeeper::close' => ['void'], +'Zookeeper::connect' => ['void', 'host'=>'string', 'watcher_cb='=>'callable', 'recv_timeout='=>'int'], +'Zookeeper::create' => ['string', 'path'=>'string', 'value'=>'string', 'acls'=>'array', 'flags='=>'int'], +'Zookeeper::delete' => ['bool', 'path'=>'string', 'version='=>'int'], +'Zookeeper::exists' => ['bool', 'path'=>'string', 'watcher_cb='=>'callable'], +'Zookeeper::get' => ['string', 'path'=>'string', 'watcher_cb='=>'callable', 'stat='=>'array', 'max_size='=>'int'], +'Zookeeper::getAcl' => ['array', 'path'=>'string'], +'Zookeeper::getChildren' => ['array|false', 'path'=>'string', 'watcher_cb='=>'callable'], +'Zookeeper::getClientId' => ['int'], +'Zookeeper::getConfig' => ['ZookeeperConfig'], +'Zookeeper::getRecvTimeout' => ['int'], +'Zookeeper::getState' => ['int'], +'Zookeeper::isRecoverable' => ['bool'], +'Zookeeper::set' => ['bool', 'path'=>'string', 'value'=>'string', 'version='=>'int', 'stat='=>'array'], +'Zookeeper::setAcl' => ['bool', 'path'=>'string', 'version'=>'int', 'acl'=>'array'], +'Zookeeper::setDebugLevel' => ['bool', 'logLevel'=>'int'], +'Zookeeper::setDeterministicConnOrder' => ['bool', 'yesOrNo'=>'bool'], +'Zookeeper::setLogStream' => ['bool', 'stream'=>'resource'], +'Zookeeper::setWatcher' => ['bool', 'watcher_cb'=>'callable'], +'zookeeper_dispatch' => ['void'], +'ZookeeperConfig::add' => ['void', 'members'=>'string', 'version='=>'int', 'stat='=>'array'], +'ZookeeperConfig::get' => ['string', 'watcher_cb='=>'callable', 'stat='=>'array'], +'ZookeeperConfig::remove' => ['void', 'id_list'=>'string', 'version='=>'int', 'stat='=>'array'], +'ZookeeperConfig::set' => ['void', 'members'=>'string', 'version='=>'int', 'stat='=>'array'], +]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_71_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_71_delta.php new file mode 100644 index 00000000..89451449 --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/CallMap_71_delta.php @@ -0,0 +1,76 @@ + [ + 'Closure::fromCallable' => ['Closure', 'callable'=>'callable'], + 'curl_multi_errno' => ['int|false', 'mh'=>'resource'], + 'curl_share_errno' => ['int|false', 'sh'=>'resource'], + 'curl_share_strerror' => ['?string', 'error_code'=>'int'], + 'getenv\'1' => ['array'], + 'hash_hkdf' => ['string|false', 'algo'=>'string', 'key'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'], + 'is_iterable' => ['bool', 'value'=>'mixed'], + 'openssl_get_curve_names' => ['list'], + 'pcntl_async_signals' => ['bool', 'enable='=>'bool'], + 'pcntl_signal_get_handler' => ['int|string', 'signal'=>'int'], + 'sapi_windows_cp_conv' => ['?string', 'in_codepage'=>'int|string', 'out_codepage'=>'int|string', 'subject'=>'string'], + 'sapi_windows_cp_get' => ['int'], + 'sapi_windows_cp_is_utf8' => ['bool'], + 'sapi_windows_cp_set' => ['bool', 'codepage'=>'int'], + 'session_create_id' => ['string', 'prefix='=>'string'], + 'session_gc' => ['int|false'], + ], + 'changed' => [ + 'DateTimeZone::listIdentifiers' => [ + 'old' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string'], + 'new' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string|null'], + ], + 'SQLite3::createFunction' => [ + 'old' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argCount='=>'int'], + 'new' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argCount='=>'int', 'flags='=>'int'], + ], + 'get_headers' => [ + 'old' => ['array|false', 'url'=>'string', 'associative='=>'int'], + 'new' => ['array|false', 'url'=>'string', 'associative='=>'int', 'context='=>'resource'], + ], + 'getopt' => [ + 'old' => ['array|array|array>|false', 'short_options'=>'string', 'long_options='=>'array'], + 'new' => ['array|array|array>|false', 'short_options'=>'string', 'long_options='=>'array', '&w_rest_index='=>'int'], + ], + 'pg_fetch_all' => [ + 'old' => ['array', 'result'=>'resource'], + 'new' => ['array', 'result'=>'resource', 'result_type='=>'int'], + ], + 'pg_last_error' => [ + 'old' => ['string', 'connection='=>'resource'], + 'new' => ['string', 'connection='=>'resource', 'operation='=>'int'], + ], + 'pg_select' => [ + 'old' => ['string|array|false', 'connection'=>'resource', 'table_name'=>'string', 'assoc_array'=>'array', 'options='=>'int'], + 'new' => ['string|array|false', 'connection'=>'resource', 'table_name'=>'string', 'assoc_array'=>'array', 'options='=>'int', 'result_type='=>'int'], + ], + 'timezone_identifiers_list' => [ + 'old' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string'], + 'new' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'?string'], + ], + 'unpack' => [ + 'old' => ['array', 'format'=>'string', 'string'=>'string'], + 'new' => ['array|false', 'format'=>'string', 'string'=>'string', 'offset='=>'int'], + ], + ], + 'removed' => [ + ], +]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_72_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_72_delta.php new file mode 100644 index 00000000..fe0b3b24 --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/CallMap_72_delta.php @@ -0,0 +1,230 @@ + [ + 'DOMNodeList::count' => ['int'], + 'ReflectionClass::isIterable' => ['bool'], + 'ZipArchive::count' => ['int'], + 'ZipArchive::setEncryptionIndex' => ['bool', 'index'=>'int', 'method'=>'string', 'password='=>'string'], + 'ZipArchive::setEncryptionName' => ['bool', 'name'=>'string', 'method'=>'int', 'password='=>'string'], + 'ftp_append' => ['bool', 'ftp'=>'resource', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int'], + 'hash_hmac_algos' => ['list'], + 'imagebmp' => ['bool', 'image'=>'resource', 'file='=>'resource|string|null', 'compressed='=>'int'], + 'imagecreatefrombmp' => ['resource|false', 'filename'=>'string'], + 'imageopenpolygon' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'], + 'imageresolution' => ['array|bool', 'image'=>'resource', 'resolution_x='=>'int', 'resolution_y='=>'int'], + 'imagesetclip' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int'], + 'ldap_exop' => ['mixed', 'ldap'=>'resource', 'reqoid'=>'string', 'reqdata='=>'string', 'serverctrls='=>'array|null', '&w_response_data='=>'string', '&w_response_oid='=>'string'], + 'ldap_exop_passwd' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string'], + 'ldap_exop_refresh' => ['int|false', 'ldap'=>'resource', 'dn'=>'string', 'ttl'=>'int'], + 'ldap_exop_whoami' => ['string|false', 'ldap'=>'resource'], + 'ldap_parse_exop' => ['bool', 'ldap'=>'resource', 'result'=>'resource', '&w_response_data='=>'string', '&w_response_oid='=>'string'], + 'mb_chr' => ['string|false', 'codepoint'=>'int', 'encoding='=>'string'], + 'mb_convert_encoding\'1' => ['array', 'string'=>'array', 'to_encoding'=>'string', 'from_encoding='=>'mixed'], + 'mb_ord' => ['int|false', 'string'=>'string', 'encoding='=>'string'], + 'mb_scrub' => ['string', 'string'=>'string', 'encoding='=>'string'], + 'oci_register_taf_callback' => ['bool', 'connection'=>'resource', 'callback='=>'callable'], + 'oci_unregister_taf_callback' => ['bool', 'connection'=>'resource'], + 'sapi_windows_vt100_support' => ['bool', 'stream'=>'resource', 'enable='=>'bool'], + 'socket_addrinfo_bind' => ['?resource', 'addrinfo'=>'resource'], + 'socket_addrinfo_connect' => ['resource', 'addrinfo'=>'resource'], + 'socket_addrinfo_explain' => ['array', 'addrinfo'=>'resource'], + 'socket_addrinfo_lookup' => ['resource[]', 'node'=>'string', 'service='=>'mixed', 'hints='=>'array'], + 'sodium_add' => ['void', '&rw_string1'=>'string', 'string2'=>'string'], + 'sodium_base642bin' => ['string', 'string'=>'string', 'id'=>'int', 'ignore='=>'string'], + 'sodium_bin2base64' => ['string', 'string'=>'string', 'id'=>'int'], + 'sodium_bin2hex' => ['string', 'string'=>'string'], + 'sodium_compare' => ['int', 'string1'=>'string', 'string2'=>'string'], + 'sodium_crypto_aead_aes256gcm_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_aead_aes256gcm_encrypt' => ['string', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_aead_aes256gcm_is_available' => ['bool'], + 'sodium_crypto_aead_aes256gcm_keygen' => ['string'], + 'sodium_crypto_aead_chacha20poly1305_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_aead_chacha20poly1305_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_aead_chacha20poly1305_ietf_keygen' => ['string'], + 'sodium_crypto_aead_chacha20poly1305_keygen' => ['string'], + 'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_aead_xchacha20poly1305_ietf_keygen' => ['string'], + 'sodium_crypto_auth' => ['string', 'message'=>'string', 'key'=>'string'], + 'sodium_crypto_auth_keygen' => ['string'], + 'sodium_crypto_auth_verify' => ['bool', 'mac'=>'string', 'message'=>'string', 'key'=>'string'], + 'sodium_crypto_box' => ['string', 'message'=>'string', 'nonce'=>'string', 'key_pair'=>'string'], + 'sodium_crypto_box_keypair' => ['string'], + 'sodium_crypto_box_keypair_from_secretkey_and_publickey' => ['string', 'secret_key'=>'string', 'public_key'=>'string'], + 'sodium_crypto_box_open' => ['string|false', 'ciphertext'=>'string', 'nonce'=>'string', 'key_pair'=>'string'], + 'sodium_crypto_box_publickey' => ['string', 'key_pair'=>'string'], + 'sodium_crypto_box_publickey_from_secretkey' => ['string', 'secret_key'=>'string'], + 'sodium_crypto_box_seal' => ['string', 'message'=>'string', 'public_key'=>'string'], + 'sodium_crypto_box_seal_open' => ['string|false', 'ciphertext'=>'string', 'key_pair'=>'string'], + 'sodium_crypto_box_secretkey' => ['string', 'key_pair'=>'string'], + 'sodium_crypto_box_seed_keypair' => ['string', 'seed'=>'string'], + 'sodium_crypto_generichash' => ['string', 'message'=>'string', 'key='=>'?string', 'length='=>'?int'], + 'sodium_crypto_generichash_final' => ['string', '&state'=>'string', 'length='=>'?int'], + 'sodium_crypto_generichash_init' => ['string', 'key='=>'?string', 'length='=>'?int'], + 'sodium_crypto_generichash_keygen' => ['string'], + 'sodium_crypto_generichash_update' => ['bool', '&rw_state'=>'string', 'string'=>'string'], + 'sodium_crypto_kdf_derive_from_key' => ['string', 'subkey_length'=>'int', 'subkey_id'=>'int', 'context'=>'string', 'key'=>'string'], + 'sodium_crypto_kdf_keygen' => ['string'], + 'sodium_crypto_kx_client_session_keys' => ['array', 'client_keypair'=>'string', 'server_key'=>'string'], + 'sodium_crypto_kx_keypair' => ['string'], + 'sodium_crypto_kx_publickey' => ['string', 'key_pair'=>'string'], + 'sodium_crypto_kx_secretkey' => ['string', 'key_pair'=>'string'], + 'sodium_crypto_kx_seed_keypair' => ['string', 'seed'=>'string'], + 'sodium_crypto_kx_server_session_keys' => ['array', 'server_key_pair'=>'string', 'client_key'=>'string'], + 'sodium_crypto_pwhash' => ['string', 'length'=>'int', 'password'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int', 'algo='=>'int'], + 'sodium_crypto_pwhash_scryptsalsa208sha256' => ['string', 'length'=>'int', 'password'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'sodium_crypto_pwhash_scryptsalsa208sha256_str' => ['string', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify' => ['bool', 'hash'=>'string', 'password'=>'string'], + 'sodium_crypto_pwhash_str' => ['string', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'sodium_crypto_pwhash_str_needs_rehash' => ['bool', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'sodium_crypto_pwhash_str_verify' => ['bool', 'hash'=>'string', 'password'=>'string'], + 'sodium_crypto_scalarmult' => ['string', 'n'=>'string', 'p'=>'string'], + 'sodium_crypto_scalarmult_base' => ['string', 'secret_key'=>'string'], + 'sodium_crypto_secretbox' => ['string', 'message'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_secretbox_keygen' => ['string'], + 'sodium_crypto_secretbox_open' => ['string|false', 'ciphertext'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_secretstream_xchacha20poly1305_init_pull' => ['string', 'header'=>'string', 'key'=>'string'], + 'sodium_crypto_secretstream_xchacha20poly1305_init_push' => ['array', 'key'=>'string'], + 'sodium_crypto_secretstream_xchacha20poly1305_keygen' => ['string'], + 'sodium_crypto_secretstream_xchacha20poly1305_pull' => ['array', '&r_state'=>'string', 'ciphertext'=>'string', 'additional_data='=>'string'], + 'sodium_crypto_secretstream_xchacha20poly1305_push' => ['string', '&w_state'=>'string', 'message'=>'string', 'additional_data='=>'string', 'tag='=>'int'], + 'sodium_crypto_secretstream_xchacha20poly1305_rekey' => ['void', 'state'=>'string'], + 'sodium_crypto_shorthash' => ['string', 'message'=>'string', 'key'=>'string'], + 'sodium_crypto_shorthash_keygen' => ['string'], + 'sodium_crypto_sign' => ['string', 'message'=>'string', 'secret_key'=>'string'], + 'sodium_crypto_sign_detached' => ['string', 'message'=>'string', 'secret_key'=>'string'], + 'sodium_crypto_sign_ed25519_pk_to_curve25519' => ['string', 'public_key'=>'string'], + 'sodium_crypto_sign_ed25519_sk_to_curve25519' => ['string', 'secret_key'=>'string'], + 'sodium_crypto_sign_keypair' => ['string'], + 'sodium_crypto_sign_keypair_from_secretkey_and_publickey' => ['string', 'secret_key'=>'string', 'public_key'=>'string'], + 'sodium_crypto_sign_open' => ['string|false', 'signed_message'=>'string', 'public_key'=>'string'], + 'sodium_crypto_sign_publickey' => ['string', 'key_pair'=>'string'], + 'sodium_crypto_sign_publickey_from_secretkey' => ['string', 'secret_key'=>'string'], + 'sodium_crypto_sign_secretkey' => ['string', 'key_pair'=>'string'], + 'sodium_crypto_sign_seed_keypair' => ['string', 'seed'=>'string'], + 'sodium_crypto_sign_verify_detached' => ['bool', 'signature'=>'string', 'message'=>'string', 'public_key'=>'string'], + 'sodium_crypto_stream' => ['string', 'length'=>'int', 'nonce'=>'string', 'key'=>'string'], + 'sodium_crypto_stream_keygen' => ['string'], + 'sodium_crypto_stream_xor' => ['string', 'message'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'sodium_hex2bin' => ['string', 'string'=>'string', 'ignore='=>'string'], + 'sodium_increment' => ['void', '&rw_string'=>'string'], + 'sodium_memcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], + 'sodium_memzero' => ['void', '&w_string'=>'string'], + 'sodium_pad' => ['string', 'string'=>'string', 'block_size'=>'int'], + 'sodium_unpad' => ['string', 'string'=>'string', 'block_size'=>'int'], + 'stream_isatty' => ['bool', 'stream'=>'resource'], + ], + 'changed' => [ + 'SQLite3::openBlob' => [ + 'old' => ['resource|false', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'dbname='=>'string'], + 'new' => ['resource|false', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'database='=>'string', 'flags='=>'int'], + ], + 'hash_copy' => [ + 'old' => ['resource', 'context'=>'resource'], + 'new' => ['HashContext', 'context'=>'HashContext'], + ], + 'hash_final' => [ + 'old' => ['string', 'context'=>'resource', 'raw_output='=>'bool'], + 'new' => ['string', 'context'=>'HashContext', 'binary='=>'bool'], + ], + 'hash_init' => [ + 'old' => ['resource', 'algo'=>'string', 'options='=>'int', 'key='=>'string'], + 'new' => ['HashContext|false', 'algo'=>'string', 'flags='=>'int', 'key='=>'string'], + ], + 'hash_update' => [ + 'old' => ['bool', 'context'=>'resource', 'data'=>'string'], + 'new' => ['bool', 'context'=>'HashContext', 'data'=>'string'], + ], + 'hash_update_file' => [ + 'old' => ['bool', 'hcontext'=>'resource', 'filename'=>'string', 'scontext='=>'resource'], + 'new' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'stream_context='=>'resource'], + ], + 'hash_update_stream' => [ + 'old' => ['int', 'context'=>'resource', 'handle'=>'resource', 'length='=>'int'], + 'new' => ['int', 'context'=>'HashContext', 'stream'=>'resource', 'length='=>'int'], + ], + 'mb_check_encoding' => [ + 'old' => ['bool', 'value='=>'string', 'encoding='=>'string'], + 'new' => ['bool', 'value='=>'array|string', 'encoding='=>'string'], + ], + ], + 'removed' => [ + 'Sodium\add' => ['void', '&left'=>'string', 'right'=>'string'], + 'Sodium\bin2hex' => ['string', 'binary'=>'string'], + 'Sodium\compare' => ['int', 'left'=>'string', 'right'=>'string'], + 'Sodium\crypto_aead_aes256gcm_decrypt' => ['string|false', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], + 'Sodium\crypto_aead_aes256gcm_encrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], + 'Sodium\crypto_aead_aes256gcm_is_available' => ['bool'], + 'Sodium\crypto_aead_chacha20poly1305_decrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], + 'Sodium\crypto_aead_chacha20poly1305_encrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], + 'Sodium\crypto_auth' => ['string', 'msg'=>'string', 'key'=>'string'], + 'Sodium\crypto_auth_verify' => ['bool', 'mac'=>'string', 'msg'=>'string', 'key'=>'string'], + 'Sodium\crypto_box' => ['string', 'msg'=>'string', 'nonce'=>'string', 'keypair'=>'string'], + 'Sodium\crypto_box_keypair' => ['string'], + 'Sodium\crypto_box_keypair_from_secretkey_and_publickey' => ['string', 'secretkey'=>'string', 'publickey'=>'string'], + 'Sodium\crypto_box_open' => ['string', 'msg'=>'string', 'nonce'=>'string', 'keypair'=>'string'], + 'Sodium\crypto_box_publickey' => ['string', 'keypair'=>'string'], + 'Sodium\crypto_box_publickey_from_secretkey' => ['string', 'secretkey'=>'string'], + 'Sodium\crypto_box_seal' => ['string', 'message'=>'string', 'publickey'=>'string'], + 'Sodium\crypto_box_seal_open' => ['string', 'encrypted'=>'string', 'keypair'=>'string'], + 'Sodium\crypto_box_secretkey' => ['string', 'keypair'=>'string'], + 'Sodium\crypto_box_seed_keypair' => ['string', 'seed'=>'string'], + 'Sodium\crypto_generichash' => ['string', 'input'=>'string', 'key='=>'string', 'length='=>'int'], + 'Sodium\crypto_generichash_final' => ['string', 'state'=>'string', 'length='=>'int'], + 'Sodium\crypto_generichash_init' => ['string', 'key='=>'string', 'length='=>'int'], + 'Sodium\crypto_generichash_update' => ['bool', '&hashState'=>'string', 'append'=>'string'], + 'Sodium\crypto_kx' => ['string', 'secretkey'=>'string', 'publickey'=>'string', 'client_publickey'=>'string', 'server_publickey'=>'string'], + 'Sodium\crypto_pwhash' => ['string', 'out_len'=>'int', 'passwd'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'Sodium\crypto_pwhash_scryptsalsa208sha256' => ['string', 'out_len'=>'int', 'passwd'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'Sodium\crypto_pwhash_scryptsalsa208sha256_str' => ['string', 'passwd'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'Sodium\crypto_pwhash_scryptsalsa208sha256_str_verify' => ['bool', 'hash'=>'string', 'passwd'=>'string'], + 'Sodium\crypto_pwhash_str' => ['string', 'passwd'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'Sodium\crypto_pwhash_str_verify' => ['bool', 'hash'=>'string', 'passwd'=>'string'], + 'Sodium\crypto_scalarmult' => ['string', 'ecdhA'=>'string', 'ecdhB'=>'string'], + 'Sodium\crypto_scalarmult_base' => ['string', 'sk'=>'string'], + 'Sodium\crypto_secretbox' => ['string', 'plaintext'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'Sodium\crypto_secretbox_open' => ['string', 'ciphertext'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'Sodium\crypto_shorthash' => ['string', 'message'=>'string', 'key'=>'string'], + 'Sodium\crypto_sign' => ['string', 'message'=>'string', 'secretkey'=>'string'], + 'Sodium\crypto_sign_detached' => ['string', 'message'=>'string', 'secretkey'=>'string'], + 'Sodium\crypto_sign_ed25519_pk_to_curve25519' => ['string', 'sign_pk'=>'string'], + 'Sodium\crypto_sign_ed25519_sk_to_curve25519' => ['string', 'sign_sk'=>'string'], + 'Sodium\crypto_sign_keypair' => ['string'], + 'Sodium\crypto_sign_keypair_from_secretkey_and_publickey' => ['string', 'secretkey'=>'string', 'publickey'=>'string'], + 'Sodium\crypto_sign_open' => ['string|false', 'signed_message'=>'string', 'publickey'=>'string'], + 'Sodium\crypto_sign_publickey' => ['string', 'keypair'=>'string'], + 'Sodium\crypto_sign_publickey_from_secretkey' => ['string', 'secretkey'=>'string'], + 'Sodium\crypto_sign_secretkey' => ['string', 'keypair'=>'string'], + 'Sodium\crypto_sign_seed_keypair' => ['string', 'seed'=>'string'], + 'Sodium\crypto_sign_verify_detached' => ['bool', 'signature'=>'string', 'msg'=>'string', 'publickey'=>'string'], + 'Sodium\crypto_stream' => ['string', 'length'=>'int', 'nonce'=>'string', 'key'=>'string'], + 'Sodium\crypto_stream_xor' => ['string', 'plaintext'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'Sodium\hex2bin' => ['string', 'hex'=>'string'], + 'Sodium\increment' => ['string', '&nonce'=>'string'], + 'Sodium\library_version_major' => ['int'], + 'Sodium\library_version_minor' => ['int'], + 'Sodium\memcmp' => ['int', 'left'=>'string', 'right'=>'string'], + 'Sodium\memzero' => ['void', '&target'=>'string'], + 'Sodium\randombytes_buf' => ['string', 'length'=>'int'], + 'Sodium\randombytes_random16' => ['int|string'], + 'Sodium\randombytes_uniform' => ['int', 'upperBoundNonInclusive'=>'int'], + 'Sodium\version_string' => ['string'], + ], +]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_73_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_73_delta.php new file mode 100644 index 00000000..91002d47 --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/CallMap_73_delta.php @@ -0,0 +1,72 @@ + [ + 'DateTime::createFromImmutable' => ['static', 'object'=>'DateTimeImmutable'], + 'JsonException::__clone' => ['void'], + 'JsonException::__construct' => ['void'], + 'JsonException::__toString' => ['string'], + 'JsonException::__wakeup' => ['void'], + 'JsonException::getCode' => ['int'], + 'JsonException::getFile' => ['string'], + 'JsonException::getLine' => ['int'], + 'JsonException::getMessage' => ['string'], + 'JsonException::getPrevious' => ['?Throwable'], + 'JsonException::getTrace' => ['list\',args?:array}>'], + 'JsonException::getTraceAsString' => ['string'], + 'SplPriorityQueue::isCorrupted' => ['bool'], + 'array_key_first' => ['int|string|null', 'array'=>'array'], + 'array_key_last' => ['int|string|null', 'array'=>'array'], + 'fpm_get_status' => ['array|false'], + 'gc_status' => ['array{runs:int,collected:int,threshold:int,roots:int}'], + 'gmp_binomial' => ['GMP|false', 'n'=>'GMP|string|int', 'k'=>'int'], + 'gmp_kronecker' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_lcm' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_perfect_power' => ['bool', 'num'=>'GMP|string|int'], + 'hrtime' => ['array{0:int,1:int}|false', 'as_number='=>'false'], + 'hrtime\'1' => ['int|float|false', 'as_number='=>'true'], + 'is_countable' => ['bool', 'value'=>'mixed'], + 'net_get_interfaces' => ['array>|false'], + 'openssl_pkey_derive' => ['string|false', 'public_key'=>'mixed', 'private_key'=>'mixed', 'key_length='=>'?int'], + 'session_set_cookie_params\'1' => ['bool', 'options'=>'array{lifetime?:?int,path?:?string,domain?:?string,secure?:?bool,httponly?:?bool,samesite?:?string}'], + 'setcookie\'1' => ['bool', 'name'=>'string', 'value='=>'string', 'options='=>'array'], + 'setrawcookie\'1' => ['bool', 'name'=>'string', 'value='=>'string', 'options='=>'array'], + 'socket_wsaprotocol_info_export' => ['string|false', 'socket'=>'resource', 'process_id'=>'int'], + 'socket_wsaprotocol_info_import' => ['resource|false', 'info_id'=>'string'], + 'socket_wsaprotocol_info_release' => ['bool', 'info_id'=>'string'], + ], + 'changed' => [ + 'array_push' => [ + 'old' => ['int', '&rw_array'=>'array', '...values'=>'mixed'], + 'new' => ['int', '&rw_array'=>'array', '...values='=>'mixed'], + ], + 'array_unshift' => [ + 'old' => ['int', '&rw_array'=>'array', '...values'=>'mixed'], + 'new' => ['int', '&rw_array'=>'array', '...values='=>'mixed'], + ], + 'bcscale' => [ + 'old' => ['int', 'scale'=>'int'], + 'new' => ['int', 'scale='=>'int'], + ], + 'ldap_exop_passwd' => [ + 'old' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string'], + 'new' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array'], + ], + ], + 'removed' => [ + ], +]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_74_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_74_delta.php new file mode 100644 index 00000000..af5e0d97 --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/CallMap_74_delta.php @@ -0,0 +1,50 @@ + [ + 'ReflectionProperty::getType' => ['?ReflectionType'], + 'mb_str_split' => ['list|false', 'string'=>'string', 'length='=>'positive-int', 'encoding='=>'string'], + ], + 'changed' => [ + 'array_merge' => [ + 'old' => ['array', '...arrays'=>'array'], + 'new' => ['array', '...arrays='=>'array'], + ], + 'array_merge_recursive' => [ + 'old' => ['array', '...arrays'=>'array'], + 'new' => ['array', '...arrays='=>'array'], + ], + 'gzread' => [ + 'old' => ['string|0', 'stream'=>'resource', 'length'=>'int'], + 'new' => ['string|false', 'stream'=>'resource', 'length'=>'int'], + ], + 'password_hash' => [ + 'old' => ['string|false', 'password'=>'string', 'algo'=>'int', 'options='=>'array'], + 'new' => ['string|false', 'password'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], + ], + 'password_needs_rehash' => [ + 'old' => ['bool', 'hash'=>'string', 'algo'=>'int', 'options='=>'array'], + 'new' => ['bool', 'hash'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], + ], + 'proc_open' => [ + 'old' => ['resource|false', 'command'=>'string', 'descriptor_spec'=>'array', '&pipes'=>'resource[]', 'cwd='=>'?string', 'env_vars='=>'?array', 'options='=>'?array'], + 'new' => ['resource|false', 'command'=>'string|array', 'descriptor_spec'=>'array', '&pipes'=>'resource[]', 'cwd='=>'?string', 'env_vars='=>'?array', 'options='=>'?array'], + ], + ], + 'removed' => [ + ], +]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php new file mode 100644 index 00000000..afeb1bc4 --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php @@ -0,0 +1,1683 @@ + [ + 'DateTime::createFromInterface' => ['self', 'object'=>'DateTimeInterface'], + 'DateTimeImmutable::createFromInterface' => ['self', 'object'=>'DateTimeInterface'], + 'PhpToken::getTokenName' => ['string'], + 'PhpToken::is' => ['bool', 'kind'=>'string|int|string[]|int[]'], + 'PhpToken::isIgnorable' => ['bool'], + 'PhpToken::tokenize' => ['list', 'code'=>'string', 'flags='=>'int'], + 'ReflectionClass::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], + 'ReflectionClassConstant::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], + 'ReflectionFunctionAbstract::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], + 'ReflectionParameter::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], + 'ReflectionProperty::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], + 'ReflectionUnionType::getTypes' => ['list'], + 'fdiv' => ['float', 'num1'=>'float', 'num2'=>'float'], + 'get_debug_type' => ['string', 'value'=>'mixed'], + 'get_resource_id' => ['int', 'resource'=>'resource'], + 'imagegetinterpolation' => ['int', 'image'=>'GdImage'], + 'str_contains' => ['bool', 'haystack'=>'string', 'needle'=>'string'], + 'str_ends_with' => ['bool', 'haystack'=>'string', 'needle'=>'string'], + 'str_starts_with' => ['bool', 'haystack'=>'string', 'needle'=>'string'], + ], + 'changed' => [ + 'DateTime::format' => [ + 'old' => ['string|false', 'format'=>'string'], + 'new' => ['string', 'format'=>'string'], + ], + 'DateTimeImmutable::format' => [ + 'old' => ['string|false', 'format'=>'string'], + 'new' => ['string', 'format'=>'string'], + ], + 'DateTimeZone::listIdentifiers' => [ + 'old' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string|null'], + 'new' => ['list', 'timezoneGroup='=>'int', 'countryCode='=>'string|null'], + ], + 'PDOStatement::bindColumn' => [ + 'old' => ['bool', 'column'=>'mixed', '&rw_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'], + 'new' => ['bool', 'column'=>'mixed', '&rw_var'=>'mixed', 'type='=>'int', 'maxLength='=>'int', 'driverOptions='=>'mixed'], + ], + 'PDOStatement::bindParam' => [ + 'old' => ['bool', 'paramno'=>'mixed', '&rw_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'], + 'new' => ['bool', 'param,'=>'string|int', '&rw_var'=>'mixed', 'type='=>'int', 'maxLength='=>'int', 'driverOptions='=>'mixed'], + ], + 'PDOStatement::bindValue' => [ + 'old' => ['bool', 'paramno'=>'mixed', 'param'=>'mixed', 'type='=>'int'], + 'new' => ['bool', 'param'=>'string|int', 'value'=>'mixed', 'type='=>'int'], + ], + 'PDOStatement::debugDumpParams' => [ + 'old' => ['void'], + 'new' => ['bool|null'], + ], + 'PDOStatement::errorCode' => [ + 'old' => ['string'], + 'new' => ['string|null'], + ], + 'PDOStatement::execute' => [ + 'old' => ['bool', 'bound_input_params='=>'?array'], + 'new' => ['bool', 'params='=>'?array'], + ], + 'PDOStatement::fetch' => [ + 'old' => ['mixed', 'how='=>'int', 'orientation='=>'int', 'offset='=>'int'], + 'new' => ['mixed', 'mode='=>'int', 'cursorOrientation='=>'int', 'cursorOffset='=>'int'], + ], + 'PDOStatement::fetchAll' => [ + 'old' => ['array|false', 'how='=>'int', 'fetch_argument='=>'int|string|callable', 'ctor_args='=>'?array'], + 'new' => ['array', 'mode='=>'int', '...args='=>'mixed'], + ], + 'PDOStatement::fetchColumn' => [ + 'old' => ['string|int|float|bool|null', 'column_number='=>'int'], + 'new' => ['mixed', 'column='=>'int'], + ], + 'PDOStatement::fetchObject' => [ + 'old' => ['object|false', 'class_name='=>'string', 'ctor_args='=>'array'], + 'new' => ['object|false', 'class='=>'?string', 'ctorArgs='=>'?array'], + ], + 'PDOStatement::setFetchMode' => [ + 'old' => ['bool', 'mode'=>'int'], + 'new' => ['bool', 'mode'=>'int', '...args='=>'mixed'], + ], + 'Phar::getMetadata' => [ + 'old' => ['mixed'], + 'new' => ['mixed', 'unserializeOptions='=>'array'], + ], + 'PharFileInfo::getMetadata' => [ + 'old' => ['mixed'], + 'new' => ['mixed', 'unserializeOptions='=>'array'], + ], + 'ReflectionClass::getConstants' => [ + 'old' => ['array'], + 'new' => ['array', 'filter='=>'?int'], + ], + 'ReflectionClass::getReflectionConstants' => [ + 'old' => ['list'], + 'new' => ['list', 'filter='=>'?int'], + ], + 'ReflectionClass::newInstanceArgs' => [ + 'old' => ['object', 'args='=>'list'], + 'new' => ['object', 'args='=>'array'], + ], + 'ReflectionProperty::getValue' => [ + 'old' => ['mixed', 'object='=>'object'], + 'new' => ['mixed', 'object='=>'null|object'], + ], + 'XMLWriter::flush' => [ + 'old' => ['string|int|false', 'empty='=>'bool'], + 'new' => ['string|int', 'empty='=>'bool'], + ], + 'SoapClient::__doRequest' => [ + 'old' => ['?string', 'request'=>'string', 'location'=>'string', 'action'=>'string', 'version'=>'int', 'one_way='=>'int'], + 'new' => ['?string', 'request'=>'string', 'location'=>'string', 'action'=>'string', 'version'=>'int', 'one_way='=>'bool'], + ], + 'XMLWriter::startAttributeNs' => [ + 'old' => ['bool', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string'], + 'new' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], + ], + 'XMLWriter::writeAttributeNs' => [ + 'old' => ['bool', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], + 'new' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], + ], + 'XMLWriter::writeDtdEntity' => [ + 'old' => ['bool', 'name'=>'string', 'content'=>'string', 'isParam'=>'bool', 'publicId'=>'string', 'systemId'=>'string', 'notationData'=>'string'], + 'new' => ['bool', 'name'=>'string', 'content'=>'string', 'isParam='=>'bool', 'publicId='=>'?string', 'systemId='=>'?string', 'notationData='=>'?string'], + ], + 'array_column' => [ + 'old' => ['array', 'array'=>'array', 'column_key'=>'mixed', 'index_key='=>'mixed'], + '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'], + ], + 'array_diff' => [ + 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + ], + 'array_diff_assoc' => [ + 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + ], + 'array_diff_key' => [ + 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + ], + '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'], + ], + 'array_intersect_assoc' => [ + 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + ], + 'array_intersect_key' => [ + 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + ], + 'bcadd' => [ + 'old' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], + 'new' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], + ], + 'bccomp' => [ + 'old' => ['int', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], + 'new' => ['int', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], + ], + 'bcdiv' => [ + 'old' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int'], + 'new' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int|null'], + ], + 'bcmod' => [ + 'old' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int'], + 'new' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int|null'], + ], + 'bcmul' => [ + 'old' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], + 'new' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], + ], + 'bcpow' => [ + 'old' => ['numeric-string', 'num'=>'numeric-string', 'exponent'=>'numeric-string', 'scale='=>'int'], + 'new' => ['numeric-string', 'num'=>'numeric-string', 'exponent'=>'numeric-string', 'scale='=>'int|null'], + ], + 'bcpowmod' => [ + 'old' => ['numeric-string|false', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'modulus'=>'numeric-string', 'scale='=>'int'], + 'new' => ['numeric-string|false', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'modulus'=>'numeric-string', 'scale='=>'int|null'], + ], + 'bcscale' => [ + 'old' => ['int', 'scale='=>'int'], + 'new' => ['int', 'scale='=>'int|null'], + ], + 'bcsqrt' => [ + 'old' => ['numeric-string', 'num'=>'numeric-string', 'scale='=>'int'], + 'new' => ['numeric-string|null', 'num'=>'numeric-string', 'scale='=>'int|null'], + ], + 'bcsub' => [ + 'old' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], + 'new' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], + ], + 'com_load_typelib' => [ + 'old' => ['bool', 'typelib_name'=>'string', 'case_insensitive='=>'bool'], + 'new' => ['bool', 'typelib_name'=>'string', 'case_insensitive='=>'true'], + ], + 'count' => [ + 'old' => ['int', 'value'=>'Countable|array|SimpleXMLElement|ResourceBundle', 'mode='=>'int'], + 'new' => ['int', 'value'=>'Countable|array', 'mode='=>'int'], + ], + 'count_chars' => [ + 'old' => ['array|false', 'input'=>'string', 'mode='=>'0|1|2'], + 'new' => ['array', 'input'=>'string', 'mode='=>'0|1|2'], + ], + 'count_chars\'1' => [ + 'old' => ['string|false', 'input'=>'string', 'mode='=>'3|4'], + 'new' => ['string', 'input'=>'string', 'mode='=>'3|4'], + ], + 'curl_close' => [ + 'old' => ['void', 'ch'=>'resource'], + 'new' => ['void', 'handle'=>'CurlHandle'], + ], + 'curl_copy_handle' => [ + 'old' => ['resource', 'ch'=>'resource'], + 'new' => ['CurlHandle', 'handle'=>'CurlHandle'], + ], + 'curl_errno' => [ + 'old' => ['int', 'ch'=>'resource'], + 'new' => ['int', 'handle'=>'CurlHandle'], + ], + 'curl_error' => [ + 'old' => ['string', 'ch'=>'resource'], + 'new' => ['string', 'handle'=>'CurlHandle'], + ], + 'curl_escape' => [ + 'old' => ['string|false', 'ch'=>'resource', 'string'=>'string'], + 'new' => ['string|false', 'handle'=>'CurlHandle', 'string'=>'string'], + ], + 'curl_exec' => [ + 'old' => ['bool|string', 'ch'=>'resource'], + 'new' => ['bool|string', 'handle'=>'CurlHandle'], + ], + 'curl_file_create' => [ + 'old' => ['CURLFile', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'], + 'new' => ['CURLFile', 'filename'=>'string', 'mime_type='=>'string|null', 'posted_filename='=>'string|null'], + ], + 'curl_getinfo' => [ + 'old' => ['mixed', 'ch'=>'resource', 'option='=>'int'], + 'new' => ['mixed', 'handle'=>'CurlHandle', 'option='=>'int'], + ], + 'curl_init' => [ + 'old' => ['resource|false', 'url='=>'string'], + 'new' => ['CurlHandle|false', 'url='=>'string'], + ], + 'curl_multi_add_handle' => [ + 'old' => ['int', 'mh'=>'resource', 'ch'=>'resource'], + 'new' => ['int', 'multi_handle'=>'CurlMultiHandle', 'handle'=>'CurlHandle'], + ], + 'curl_multi_close' => [ + 'old' => ['void', 'mh'=>'resource'], + 'new' => ['void', 'multi_handle'=>'CurlMultiHandle'], + ], + 'curl_multi_errno' => [ + 'old' => ['int|false', 'mh'=>'resource'], + 'new' => ['int', 'multi_handle'=>'CurlMultiHandle'], + ], + 'curl_multi_exec' => [ + 'old' => ['int', 'mh'=>'resource', '&w_still_running'=>'int'], + 'new' => ['int', 'multi_handle'=>'CurlMultiHandle', '&w_still_running'=>'int'], + ], + 'curl_multi_getcontent' => [ + 'old' => ['?string', 'ch'=>'resource'], + 'new' => ['?string', 'handle'=>'CurlHandle'], + ], + 'curl_multi_info_read' => [ + 'old' => ['array|false', 'mh'=>'resource', '&w_msgs_in_queue='=>'int'], + 'new' => ['array|false', 'multi_handle'=>'CurlMultiHandle', '&w_queued_messages='=>'int'], + ], + 'curl_multi_init' => [ + 'old' => ['resource|false'], + 'new' => ['CurlMultiHandle|false'], + ], + 'curl_multi_remove_handle' => [ + 'old' => ['int', 'mh'=>'resource', 'ch'=>'resource'], + 'new' => ['int', 'multi_handle'=>'CurlMultiHandle', 'handle'=>'CurlHandle'], + ], + 'curl_multi_select' => [ + 'old' => ['int', 'mh'=>'resource', 'timeout='=>'float'], + 'new' => ['int', 'multi_handle'=>'CurlMultiHandle', 'timeout='=>'float'], + ], + 'curl_multi_setopt' => [ + 'old' => ['bool', 'mh'=>'resource', 'option'=>'int', 'value'=>'mixed'], + 'new' => ['bool', 'multi_handle'=>'CurlMultiHandle', 'option'=>'int', 'value'=>'mixed'], + ], + 'curl_pause' => [ + 'old' => ['int', 'ch'=>'resource', 'bitmask'=>'int'], + 'new' => ['int', 'handle'=>'CurlHandle', 'flags'=>'int'], + ], + 'curl_reset' => [ + 'old' => ['void', 'ch'=>'resource'], + 'new' => ['void', 'handle'=>'CurlHandle'], + ], + 'curl_setopt' => [ + 'old' => ['bool', 'ch'=>'resource', 'option'=>'int', 'value'=>'callable|mixed'], + 'new' => ['bool', 'handle'=>'CurlHandle', 'option'=>'int', 'value'=>'callable|mixed'], + ], + 'curl_setopt_array' => [ + 'old' => ['bool', 'ch'=>'resource', 'options'=>'array'], + 'new' => ['bool', 'handle'=>'CurlHandle', 'options'=>'array'], + ], + 'curl_share_close' => [ + 'old' => ['void', 'sh'=>'resource'], + 'new' => ['void', 'share_handle'=>'CurlShareHandle'], + ], + 'curl_share_errno' => [ + 'old' => ['int|false', 'sh'=>'resource'], + 'new' => ['int', 'share_handle'=>'CurlShareHandle'], + ], + 'curl_share_init' => [ + 'old' => ['resource'], + 'new' => ['CurlShareHandle'], + ], + 'curl_share_setopt' => [ + 'old' => ['bool', 'sh'=>'resource', 'option'=>'int', 'value'=>'mixed'], + 'new' => ['bool', 'share_handle'=>'CurlShareHandle', 'option'=>'int', 'value'=>'mixed'], + ], + 'curl_unescape' => [ + 'old' => ['string|false', 'ch'=>'resource', 'string'=>'string'], + 'new' => ['string|false', 'handle'=>'CurlShareHandle', 'string'=>'string'], + ], + 'date' => [ + 'old' => ['string', 'format'=>'string', 'timestamp='=>'int'], + 'new' => ['string', 'format'=>'string', 'timestamp='=>'?int'], + ], + 'date_format' => [ + 'old' => ['string|false', 'object'=>'DateTimeInterface', 'format'=>'string'], + 'new' => ['string', 'object'=>'DateTimeInterface', 'format'=>'string'], + ], + 'datefmt_create' => [ + 'old' => ['?IntlDateFormatter', 'locale'=>'?string', 'dateType'=>'int', 'timeType'=>'int', 'timezone='=>'DateTimeZone|IntlTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'string'], + 'new' => ['?IntlDateFormatter', 'locale'=>'?string', 'dateType='=>'int', 'timeType='=>'int', 'timezone='=>'DateTimeZone|IntlTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'?string'], + ], + 'dom_import_simplexml' => [ + 'old' => ['DOMElement|null', 'node'=>'SimpleXMLElement'], + 'new' => ['DOMElement', 'node'=>'SimpleXMLElement'], + ], + 'explode' => [ + 'old' => ['list|false', 'separator'=>'string', 'string'=>'string', 'limit='=>'int'], + 'new' => ['list', 'separator'=>'string', 'string'=>'string', 'limit='=>'int'], + ], + 'get_class_methods' => [ + 'old' => ['list|null', 'object_or_class'=>'mixed'], + 'new' => ['list', 'object_or_class'=>'object|class-string'], + ], + 'get_parent_class' => [ + 'old' => ['class-string|false', 'object_or_class='=>'mixed'], + 'new' => ['class-string|false', 'object_or_class='=>'object|class-string'], + ], + 'gmdate' => [ + 'old' => ['string', 'format'=>'string', 'timestamp='=>'int'], + 'new' => ['string', 'format'=>'string', 'timestamp='=>'int|null'], + ], + 'gmmktime' => [ + 'old' => ['int|false', 'hour='=>'int', 'minute='=>'int', 'second='=>'int', 'month='=>'int', 'day='=>'int', 'year='=>'int'], + 'new' => ['int|false', 'hour'=>'int', 'minute='=>'int|null', 'second='=>'int|null', 'month='=>'int|null', 'day='=>'int|null', 'year='=>'int|null'], + ], + 'gmp_binomial' => [ + 'old' => ['GMP|false', 'n'=>'GMP|string|int', 'k'=>'int'], + 'new' => ['GMP', 'n'=>'GMP|string|int', 'k'=>'int'], + ], + 'gmstrftime' => [ + 'old' => ['string|false', 'format'=>'string', 'timestamp='=>'int'], + 'new' => ['string|false', 'format'=>'string', 'timestamp='=>'?int'], + ], + 'hash_init' => [ + 'old' => ['HashContext|false', 'algo'=>'string', 'flags='=>'int', 'key='=>'string'], + 'new' => ['HashContext', 'algo'=>'string', 'flags='=>'int', 'key='=>'string'], + ], + 'hash_update_file' => [ + 'old' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'stream_context='=>'resource'], + 'new' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'stream_context='=>'?resource'], + ], + 'imageaffine' => [ + 'old' => ['resource|false', 'src'=>'resource', 'affine'=>'array', 'clip='=>'array'], + 'new' => ['false|GdImage', 'image'=>'GdImage', 'affine'=>'array', 'clip='=>'?array'], + ], + 'imagealphablending' => [ + 'old' => ['bool', 'image'=>'resource', 'enable'=>'bool'], + 'new' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], + ], + 'imageantialias' => [ + 'old' => ['bool', 'image'=>'resource', 'enable'=>'bool'], + 'new' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], + ], + 'imagearc' => [ + 'old' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int'], + ], + 'imagebmp' => [ + 'old' => ['bool', 'image'=>'resource', 'file='=>'resource|string|null', 'compressed='=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'file='=>'resource|string|null', 'compressed='=>'bool'], + ], + 'imagechar' => [ + 'old' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], + ], + 'imagecharup' => [ + 'old' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], + ], + 'imagecolorallocate' => [ + 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + ], + 'imagecolorallocatealpha' => [ + 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + ], + 'imagecolorat' => [ + 'old' => ['int|false', 'image'=>'resource', 'x'=>'int', 'y'=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int'], + ], + 'imagecolorclosest' => [ + 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + ], + 'imagecolorclosestalpha' => [ + 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + ], + 'imagecolorclosesthwb' => [ + 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + ], + 'imagecolordeallocate' => [ + 'old' => ['bool', 'image'=>'resource', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'color'=>'int'], + ], + 'imagecolorexact' => [ + 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + ], + 'imagecolorexactalpha' => [ + 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + ], + 'imagecolormatch' => [ + 'old' => ['bool', 'image1'=>'resource', 'image2'=>'resource'], + 'new' => ['bool', 'image1'=>'GdImage', 'image2'=>'GdImage'], + ], + 'imagecolorresolve' => [ + 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + ], + 'imagecolorresolvealpha' => [ + 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + ], + 'imagecolorset' => [ + 'old' => ['void', 'image'=>'resource', 'color'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], + 'new' => ['void', 'image'=>'GdImage', 'color'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], + ], + 'imagecolorsforindex' => [ + 'old' => ['array|false', 'image'=>'resource', 'color'=>'int'], + 'new' => ['array|false', 'image'=>'GdImage', 'color'=>'int'], + ], + 'imagecolorstotal' => [ + 'old' => ['int|false', 'image'=>'resource'], + 'new' => ['int|false', 'image'=>'GdImage'], + ], + 'imagecolortransparent' => [ + 'old' => ['int|false', 'image'=>'resource', 'color='=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'color='=>'int'], + ], + 'imageconvolution' => [ + 'old' => ['bool', 'image'=>'resource', 'matrix'=>'array', 'divisor'=>'float', 'offset'=>'float'], + 'new' => ['bool', 'image'=>'GdImage', 'matrix'=>'array', 'divisor'=>'float', 'offset'=>'float'], + ], + 'imagecopy' => [ + 'old' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int'], + 'new' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int'], + ], + 'imagecopymerge' => [ + 'old' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], + 'new' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], + ], + 'imagecopymergegray' => [ + 'old' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], + 'new' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], + ], + 'imagecopyresampled' => [ + 'old' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], + 'new' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], + ], + 'imagecopyresized' => [ + 'old' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], + 'new' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], + ], + 'imagecreate' => [ + 'old' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'], + 'new' => ['false|GdImage', 'width'=>'int', 'height'=>'int'], + ], + 'imagecreatefrombmp' => [ + 'old' => ['resource|false', 'filename'=>'string'], + 'new' => ['false|GdImage', 'filename'=>'string'], + ], + 'imagecreatefromgd' => [ + 'old' => ['resource|false', 'filename'=>'string'], + 'new' => ['false|GdImage', 'filename'=>'string'], + ], + 'imagecreatefromgd2' => [ + 'old' => ['resource|false', 'filename'=>'string'], + 'new' => ['false|GdImage', 'filename'=>'string'], + ], + 'imagecreatefromgd2part' => [ + 'old' => ['resource|false', 'filename'=>'string', 'srcx'=>'int', 'srcy'=>'int', 'width'=>'int', 'height'=>'int'], + 'new' => ['false|GdImage', 'filename'=>'string', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int'], + ], + 'imagecreatefromgif' => [ + 'old' => ['resource|false', 'filename'=>'string'], + 'new' => ['false|GdImage', 'filename'=>'string'], + ], + 'imagecreatefromjpeg' => [ + 'old' => ['resource|false', 'filename'=>'string'], + 'new' => ['false|GdImage', 'filename'=>'string'], + ], + 'imagecreatefrompng' => [ + 'old' => ['resource|false', 'filename'=>'string'], + 'new' => ['false|GdImage', 'filename'=>'string'], + ], + 'imagecreatefromstring' => [ + 'old' => ['resource|false', 'image'=>'string'], + 'new' => ['false|GdImage', 'data'=>'string'], + ], + 'imagecreatefromwbmp' => [ + 'old' => ['resource|false', 'filename'=>'string'], + 'new' => ['false|GdImage', 'filename'=>'string'], + ], + 'imagecreatefromwebp' => [ + 'old' => ['resource|false', 'filename'=>'string'], + 'new' => ['false|GdImage', 'filename'=>'string'], + ], + 'imagecreatefromxbm' => [ + 'old' => ['resource|false', 'filename'=>'string'], + 'new' => ['false|GdImage', 'filename'=>'string'], + ], + 'imagecreatefromxpm' => [ + 'old' => ['resource|false', 'filename'=>'string'], + 'new' => ['false|GdImage', 'filename'=>'string'], + ], + 'imagecreatetruecolor' => [ + 'old' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'], + 'new' => ['false|GdImage', 'width'=>'int', 'height'=>'int'], + ], + 'imagecrop' => [ + 'old' => ['resource|false', 'im'=>'resource', 'rect'=>'array'], + 'new' => ['false|GdImage', 'image'=>'GdImage', 'rectangle'=>'array'], + ], + 'imagecropauto' => [ + 'old' => ['resource|false', 'im'=>'resource', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'], + 'new' => ['false|GdImage', 'image'=>'GdImage', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'], + ], + 'imagedashedline' => [ + 'old' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + ], + 'imagedestroy' => [ + 'old' => ['bool', 'image'=>'resource'], + 'new' => ['bool', 'image'=>'GdImage'], + ], + 'imageellipse' => [ + 'old' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], + ], + 'imagefill' => [ + 'old' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'color'=>'int'], + ], + 'imagefilledarc' => [ + 'old' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int', 'style'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int', 'style'=>'int'], + ], + 'imagefilledellipse' => [ + 'old' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], + ], + 'imagefilledpolygon' => [ + 'old' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], + ], + 'imagefilledrectangle' => [ + 'old' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + ], + 'imagefilltoborder' => [ + 'old' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'border_color'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'border_color'=>'int', 'color'=>'int'], + ], + 'imagefilter' => [ + 'old' => ['bool', 'image'=>'resource', 'filter'=>'int', 'args='=>'int', 'arg2='=>'int', 'arg3='=>'int', 'arg4='=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'filter'=>'int', 'args='=>'int', 'arg2='=>'int', 'arg3='=>'int', 'arg4='=>'int'], + ], + 'imageflip' => [ + 'old' => ['bool', 'image'=>'resource', 'mode'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'mode'=>'int'], + ], + 'imagefttext' => [ + 'old' => ['array|false', 'image'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string', 'options='=>'array'], + 'new' => ['array|false', 'image'=>'GdImage', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string', 'options='=>'array'], + ], + 'imagegammacorrect' => [ + 'old' => ['bool', 'image'=>'resource', 'input_gamma'=>'float', 'output_gamma'=>'float'], + 'new' => ['bool', 'image'=>'GdImage', 'input_gamma'=>'float', 'output_gamma'=>'float'], + ], + 'imagegd' => [ + 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null'], + 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null'], + ], + 'imagegd2' => [ + 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'chunk_size='=>'int', 'mode='=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'chunk_size='=>'int', 'mode='=>'int'], + ], + 'imagegetclip' => [ + 'old' => ['array|false', 'im'=>'resource'], + 'new' => ['array', 'image'=>'GdImage'], + ], + 'imagegif' => [ + 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null'], + 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null'], + ], + 'imagegrabscreen' => [ + 'old' => ['false|resource'], + 'new' => ['false|GdImage'], + ], + 'imagegrabwindow' => [ + 'old' => ['false|resource', 'window_handle'=>'int', 'client_area='=>'int'], + 'new' => ['false|GdImage', 'handle'=>'int', 'client_area='=>'int'], + ], + 'imageinterlace' => [ + 'old' => ['int|false', 'image'=>'resource', 'enable='=>'int'], + 'new' => ['int|false', 'image'=>'GdImage', 'enable='=>'int'], + ], + 'imageistruecolor' => [ + 'old' => ['bool', 'image'=>'resource'], + 'new' => ['bool', 'image'=>'GdImage'], + ], + 'imagejpeg' => [ + 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int'], + ], + 'imagelayereffect' => [ + 'old' => ['bool', 'image'=>'resource', 'effect'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'effect'=>'int'], + ], + 'imageline' => [ + 'old' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + ], + 'imageopenpolygon' => [ + 'old' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'], + ], + 'imagepalettecopy' => [ + 'old' => ['void', 'dst'=>'resource', 'src'=>'resource'], + 'new' => ['void', 'dst'=>'GdImage', 'src'=>'GdImage'], + ], + 'imagepalettetotruecolor' => [ + 'old' => ['bool', 'image'=>'resource'], + 'new' => ['bool', 'image'=>'GdImage'], + ], + 'imagepng' => [ + 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int', 'filters='=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int', 'filters='=>'int'], + ], + 'imagepolygon' => [ + 'old' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], + ], + 'imagerectangle' => [ + 'old' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + ], + 'imageresolution' => [ + 'old' => ['array|bool', 'image'=>'resource', 'resolution_x='=>'int', 'resolution_y='=>'int'], + 'new' => ['array|bool', 'image'=>'GdImage', 'resolution_x='=>'int', 'resolution_y='=>'int'], + ], + 'imagerotate' => [ + 'old' => ['resource|false', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'], + 'new' => ['false|GdImage', 'image'=>'GdImage', 'angle'=>'float', 'background_color'=>'int', 'ignore_transparent='=>'int'], + ], + 'imagesavealpha' => [ + 'old' => ['bool', 'image'=>'resource', 'enable'=>'bool'], + 'new' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], + ], + 'imagescale' => [ + 'old' => ['resource|false', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'], + 'new' => ['false|GdImage', 'image'=>'GdImage', 'width'=>'int', 'height='=>'int', 'mode='=>'int'], + ], + 'imagesetbrush' => [ + 'old' => ['bool', 'image'=>'resource', 'brush'=>'resource'], + 'new' => ['bool', 'image'=>'GdImage', 'brush'=>'GdImage'], + ], + 'imagesetclip' => [ + 'old' => ['bool', 'image'=>'resource', 'x1'=>'int', 'x2'=>'int', 'y1'=>'int', 'y2'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'x2'=>'int', 'y1'=>'int', 'y2'=>'int'], + ], + 'imagesetinterpolation' => [ + 'old' => ['bool', 'image'=>'resource', 'method'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'method'=>'int'], + ], + 'imagesetpixel' => [ + 'old' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'color'=>'int'], + ], + 'imagesetstyle' => [ + 'old' => ['bool', 'image'=>'resource', 'style'=>'non-empty-array'], + 'new' => ['bool', 'image'=>'GdImage', 'style'=>'non-empty-array'], + ], + 'imagesetthickness' => [ + 'old' => ['bool', 'image'=>'resource', 'thickness'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'thickness'=>'int'], + ], + 'imagesettile' => [ + 'old' => ['bool', 'image'=>'resource', 'tile'=>'resource'], + 'new' => ['bool', 'image'=>'GdImage', 'tile'=>'GdImage'], + ], + 'imagestring' => [ + 'old' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], + ], + 'imagestringup' => [ + 'old' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], + ], + 'imagesx' => [ + 'old' => ['int|false', 'image'=>'resource'], + 'new' => ['int|false', 'image'=>'GdImage'], + ], + 'imagesy' => [ + 'old' => ['int|false', 'image'=>'resource'], + 'new' => ['int|false', 'image'=>'GdImage'], + ], + 'imagetruecolortopalette' => [ + 'old' => ['bool', 'image'=>'resource', 'dither'=>'bool', 'num_colors'=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'dither'=>'bool', 'num_colors'=>'int'], + ], + 'imagettftext' => [ + 'old' => ['false|array', 'image'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string'], + 'new' => ['false|array', 'image'=>'GdImage', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string'], + ], + 'imagewbmp' => [ + 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'foreground_color='=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'foreground_color='=>'int'], + ], + 'imagewebp' => [ + 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int'], + ], + 'imagexbm' => [ + 'old' => ['bool', 'image'=>'resource', 'filename='=>'?string', 'foreground_color='=>'int'], + 'new' => ['bool', 'image'=>'GdImage', 'filename='=>'?string', 'foreground_color='=>'int'], + ], + 'ldap_exop_passwd' => [ + 'old' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array'], + 'new' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array|null'], + ], + 'ldap_set_rebind_proc' => [ + 'old' => ['bool', 'ldap'=>'resource', 'callback'=>'callable'], + 'new' => ['bool', 'ldap'=>'resource', 'callback'=>'?callable'], + ], + 'mb_check_encoding' => [ + 'old' => ['bool', 'value='=>'array|string', 'encoding='=>'string'], + 'new' => ['bool', 'value='=>'array|string|null', 'encoding='=>'string|null'], + ], + 'mb_chr' => [ + 'old' => ['string|false', 'codepoint'=>'int', 'encoding='=>'string'], + 'new' => ['string|false', 'codepoint'=>'int', 'encoding='=>'string|null'], + ], + 'mb_convert_case' => [ + 'old' => ['string', 'string'=>'string', 'mode'=>'int', 'encoding='=>'string'], + 'new' => ['string', 'string'=>'string', 'mode'=>'int', 'encoding='=>'string|null'], + ], + 'mb_convert_encoding' => [ + 'old' => ['string|false', 'string'=>'string', 'to_encoding'=>'string', 'from_encoding='=>'mixed'], + 'new' => ['string|false', 'string'=>'string', 'to_encoding'=>'string', 'from_encoding='=>'array|string|null'], + ], + 'mb_convert_encoding\'1' => [ + 'old' => ['array', 'string'=>'array', 'to_encoding'=>'string', 'from_encoding='=>'mixed'], + 'new' => ['array', 'string'=>'array', 'to_encoding'=>'string', 'from_encoding='=>'array|string|null'], + ], + 'mb_convert_kana' => [ + 'old' => ['string', 'string'=>'string', 'mode='=>'string', 'encoding='=>'string'], + 'new' => ['string', 'string'=>'string', 'mode='=>'string', 'encoding='=>'string|null'], + ], + 'mb_decode_numericentity' => [ + 'old' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string'], + 'new' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string|null'], + ], + 'mb_detect_encoding' => [ + 'old' => ['string|false', 'string'=>'string', 'encodings='=>'mixed', 'strict='=>'bool'], + 'new' => ['string|false', 'string'=>'string', 'encodings='=>'array|string|null', 'strict='=>'bool'], + ], + 'mb_detect_order' => [ + 'old' => ['bool|list', 'encoding='=>'mixed'], + 'new' => ['bool|list', 'encoding='=>'array|string|null'], + ], + 'mb_encode_mimeheader' => [ + 'old' => ['string', 'string'=>'string', 'charset='=>'string', 'transfer_encoding='=>'string', 'newline='=>'string', 'indent='=>'int'], + 'new' => ['string', 'string'=>'string', 'charset='=>'string|null', 'transfer_encoding='=>'string|null', 'newline='=>'string', 'indent='=>'int'], + ], + 'mb_encode_numericentity' => [ + 'old' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string', 'hex='=>'bool'], + 'new' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string|null', 'hex='=>'bool'], + ], + 'mb_ereg' => [ + 'old' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], + 'new' => ['bool', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], + ], + 'mb_ereg_match' => [ + 'old' => ['bool', 'pattern'=>'string', 'string'=>'string', 'options='=>'string'], + 'new' => ['bool', 'pattern'=>'string', 'string'=>'string', 'options='=>'string|null'], + ], + 'mb_ereg_replace' => [ + 'old' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string'], + 'new' => ['string|false|null', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string|null'], + ], + 'mb_ereg_replace_callback' => [ + 'old' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable', 'string'=>'string', 'options='=>'string'], + 'new' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable', 'string'=>'string', 'options='=>'string|null'], + ], + 'mb_ereg_search' => [ + 'old' => ['bool', 'pattern='=>'string', 'options='=>'string'], + 'new' => ['bool', 'pattern='=>'string|null', 'options='=>'string|null'], + ], + 'mb_ereg_search_init' => [ + 'old' => ['bool', 'string'=>'string', 'pattern='=>'string', 'options='=>'string'], + 'new' => ['bool', 'string'=>'string', 'pattern='=>'string|null', 'options='=>'string|null'], + ], + 'mb_ereg_search_pos' => [ + 'old' => ['int[]|false', 'pattern='=>'string', 'options='=>'string'], + 'new' => ['int[]|false', 'pattern='=>'string|null', 'options='=>'string|null'], + ], + 'mb_ereg_search_regs' => [ + 'old' => ['string[]|false', 'pattern='=>'string', 'options='=>'string'], + 'new' => ['string[]|false', 'pattern='=>'string|null', 'options='=>'string|null'], + ], + 'mb_eregi' => [ + 'old' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array'], + 'new' => ['bool', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], + ], + 'mb_eregi_replace' => [ + 'old' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string'], + 'new' => ['string|false|null', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string|null'], + ], + 'mb_http_input' => [ + 'old' => ['string|false', 'type='=>'string'], + 'new' => ['array|string|false', 'type='=>'string|null'], + ], + 'mb_http_output' => [ + 'old' => ['string|bool', 'encoding='=>'string'], + 'new' => ['string|bool', 'encoding='=>'string|null'], + ], + 'mb_internal_encoding' => [ + 'old' => ['string|bool', 'encoding='=>'string'], + 'new' => ['string|bool', 'encoding='=>'string|null'], + ], + 'mb_language' => [ + 'old' => ['string|bool', 'language='=>'string'], + 'new' => ['string|bool', 'language='=>'string|null'], + ], + 'mb_ord' => [ + 'old' => ['int|false', 'string'=>'string', 'encoding='=>'string'], + 'new' => ['int|false', 'string'=>'string', 'encoding='=>'string|null'], + ], + 'mb_parse_str' => [ + 'old' => ['bool', 'string'=>'string', '&w_result='=>'array'], + 'new' => ['bool', 'string'=>'string', '&w_result'=>'array'], + ], + 'mb_regex_encoding' => [ + 'old' => ['string|bool', 'encoding='=>'string'], + 'new' => ['string|bool', 'encoding='=>'string|null'], + ], + 'mb_regex_set_options' => [ + 'old' => ['string', 'options='=>'string'], + 'new' => ['string', 'options='=>'string|null'], + ], + 'mb_scrub' => [ + 'old' => ['string', 'string'=>'string', 'encoding='=>'string'], + 'new' => ['string', 'string'=>'string', 'encoding='=>'string|null'], + ], + 'mb_send_mail' => [ + 'old' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array', 'additional_params='=>'string'], + 'new' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array', 'additional_params='=>'string|null'], + ], + 'mb_str_split' => [ + 'old' => ['list|false', 'string'=>'string', 'length='=>'positive-int', 'encoding='=>'string'], + 'new' => ['list', 'string'=>'string', 'length='=>'positive-int', 'encoding='=>'string|null'], + ], + 'mb_strcut' => [ + 'old' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'], + 'new' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string|null'], + ], + 'mb_strimwidth' => [ + 'old' => ['string', 'string'=>'string', 'start'=>'int', 'width'=>'int', 'trim_marker='=>'string', 'encoding='=>'string'], + 'new' => ['string', 'string'=>'string', 'start'=>'int', 'width'=>'int', 'trim_marker='=>'string', 'encoding='=>'string|null'], + ], + 'mb_stripos' => [ + 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], + 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], + ], + 'mb_stristr' => [ + 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], + 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], + ], + 'mb_strlen' => [ + 'old' => ['0|positive-int', 'string'=>'string', 'encoding='=>'string'], + 'new' => ['0|positive-int', 'string'=>'string', 'encoding='=>'string|null'], + ], + 'mb_strpos' => [ + 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], + 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], + ], + 'mb_strrchr' => [ + 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], + 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], + ], + 'mb_strrichr' => [ + 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], + 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], + ], + 'mb_strripos' => [ + 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], + 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], + ], + 'mb_strrpos' => [ + 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], + 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], + ], + 'mb_strstr' => [ + 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], + 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], + ], + 'mb_strtolower' => [ + 'old' => ['lowercase-string', 'string'=>'string', 'encoding='=>'string'], + 'new' => ['lowercase-string', 'string'=>'string', 'encoding='=>'string|null'], + ], + 'mb_strtoupper' => [ + 'old' => ['string', 'string'=>'string', 'encoding='=>'string'], + 'new' => ['string', 'string'=>'string', 'encoding='=>'string|null'], + ], + 'mb_strwidth' => [ + 'old' => ['int', 'string'=>'string', 'encoding='=>'string'], + 'new' => ['int', 'string'=>'string', 'encoding='=>'string|null'], + ], + 'mb_substitute_character' => [ + 'old' => ['bool|int|string', 'substitute_character='=>'mixed'], + 'new' => ['bool|int|string', 'substitute_character='=>'int|string|null'], + ], + 'mb_substr' => [ + 'old' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'], + 'new' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string|null'], + ], + 'mb_substr_count' => [ + 'old' => ['int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'], + 'new' => ['int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string|null'], + ], + 'mktime' => [ + 'old' => ['int|false', 'hour='=>'int', 'minute='=>'int', 'second='=>'int', 'month='=>'int', 'day='=>'int', 'year='=>'int'], + 'new' => ['int|false', 'hour'=>'int', 'minute='=>'int|null', 'second='=>'int|null', 'month='=>'int|null', 'day='=>'int|null', 'year='=>'int|null'], + ], + 'mysqli::__construct' => [ + 'old' => ['void', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], + 'new' => ['void', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], + ], + 'mysqli::begin_transaction' => [ + 'old' => ['bool', 'flags='=>'int', 'name='=>'string'], + 'new' => ['bool', 'flags='=>'int', 'name='=>'?string'], + ], + 'mysqli::commit' => [ + 'old' => ['bool', 'flags='=>'int', 'name='=>'string'], + 'new' => ['bool', 'flags='=>'int', 'name='=>'?string'], + ], + 'mysqli::connect' => [ + 'old' => ['null|false', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], + 'new' => ['null|false', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], + ], + 'mysqli::rollback' => [ + 'old' => ['bool', 'flags='=>'int', 'name='=>'string'], + 'new' => ['bool', 'flags='=>'int', 'name='=>'?string'], + ], + 'mysqli_begin_transaction' => [ + 'old' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], + 'new' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], + ], + 'mysqli_commit' => [ + 'old' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], + 'new' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], + ], + 'mysqli_connect' => [ + 'old' => ['mysqli|false', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], + 'new' => ['mysqli|false', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], + ], + 'mysqli_rollback' => [ + 'old' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], + 'new' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], + ], + 'number_format' => [ + 'old' => ['string', 'num'=>'float|int', 'decimals='=>'int'], + 'new' => ['string', 'num'=>'float|int', 'decimals='=>'int', 'decimal_separator='=>'?string', 'thousands_separator='=>'?string'], + ], + 'ob_implicit_flush' => [ + 'old' => ['void', 'enable='=>'int'], + 'new' => ['void', 'enable='=>'bool'], + ], + 'openssl_csr_export' => [ + 'old' => ['bool', 'csr'=>'string|resource', '&w_output'=>'string', 'no_text='=>'bool'], + 'new' => ['bool', 'csr'=>'OpenSSLCertificateSigningRequest|string', '&w_output'=>'string', 'no_text='=>'bool'], + ], + 'openssl_csr_export_to_file' => [ + 'old' => ['bool', 'csr'=>'string|resource', 'output_filename'=>'string', 'no_text='=>'bool'], + 'new' => ['bool', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'output_filename'=>'string', 'no_text='=>'bool'], + ], + 'openssl_csr_get_public_key' => [ + 'old' => ['resource|false', 'csr'=>'string|resource', 'short_names='=>'bool'], + 'new' => ['OpenSSLAsymmetricKey|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'short_names='=>'bool'], + ], + 'openssl_csr_get_subject' => [ + 'old' => ['array|false', 'csr'=>'string|resource', 'short_names='=>'bool'], + 'new' => ['array|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'short_names='=>'bool'], + ], + 'openssl_csr_new' => [ + 'old' => ['resource|false', 'distinguished_names'=>'array', '&w_private_key'=>'resource', 'options='=>'array', 'extra_attributes='=>'array'], + 'new' => ['OpenSSLCertificateSigningRequest|false', 'distinguished_names'=>'array', '&w_private_key'=>'OpenSSLAsymmetricKey', 'options='=>'array|null', 'extra_attributes='=>'array|null'], + ], + 'openssl_csr_sign' => [ + 'old' => ['resource|false', 'csr'=>'string|resource', 'ca_certificate'=>'string|resource|null', 'private_key'=>'string|resource|array', 'days'=>'int', 'options='=>'array', 'serial='=>'int'], + 'new' => ['OpenSSLCertificate|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'ca_certificate'=>'OpenSSLCertificate|string|null', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'days'=>'int', 'options='=>'array|null', 'serial='=>'int'], + ], + 'openssl_dh_compute_key' => [ + 'old' => ['string|false', 'public_key'=>'string', 'private_key'=>'resource'], + 'new' => ['string|false', 'public_key'=>'string', 'private_key'=>'OpenSSLAsymmetricKey'], + ], + 'openssl_free_key' => [ + 'old' => ['void', 'key'=>'resource'], + 'new' => ['void', 'key'=>'OpenSSLAsymmetricKey'], + ], + 'openssl_get_privatekey' => [ + 'old' => ['resource|false', 'private_key'=>'string', 'passphrase='=>'string'], + 'new' => ['OpenSSLAsymmetricKey|false', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase='=>'?string'], + ], + 'openssl_get_publickey' => [ + 'old' => ['resource|false', 'public_key'=>'resource|string'], + 'new' => ['OpenSSLAsymmetricKey|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], + ], + 'openssl_open' => [ + 'old' => ['bool', 'data'=>'string', '&w_output'=>'string', 'encrypted_key'=>'string', 'private_key'=>'string|array|resource', 'cipher_algo='=>'string', 'iv='=>'string'], + 'new' => ['bool', 'data'=>'string', '&w_output'=>'string', 'encrypted_key'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'cipher_algo'=>'string', 'iv='=>'string|null'], + ], + 'openssl_pkcs12_export' => [ + 'old' => ['bool', 'certificate'=>'string|resource', '&w_output'=>'string', 'private_key'=>'string|array|resource', 'passphrase'=>'string', 'options='=>'array'], + 'new' => ['bool', 'certificate'=>'OpenSSLCertificate|string', '&w_output'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase'=>'string', 'options='=>'array'], + ], + 'openssl_pkcs12_export_to_file' => [ + 'old' => ['bool', 'certificate'=>'string|resource', 'output_filename'=>'string', 'private_key'=>'string|array|resource', 'passphrase'=>'string', 'options='=>'array'], + 'new' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'output_filename'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase'=>'string', 'options='=>'array'], + ], + 'openssl_pkcs7_decrypt' => [ + 'old' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource', 'private_key='=>'string|resource|array'], + 'new' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|string', 'private_key='=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string|null'], + ], + 'openssl_pkcs7_encrypt' => [ + 'old' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'cipher_algo='=>'int'], + 'new' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|list|string', 'headers'=>'array|null', 'flags='=>'int', 'cipher_algo='=>'int'], + ], + 'openssl_pkcs7_sign' => [ + 'old' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource', 'private_key'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'untrusted_certificates_filename='=>'string'], + 'new' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'headers'=>'array|null', 'flags='=>'int', 'untrusted_certificates_filename='=>'string|null'], + ], + 'openssl_pkey_derive' => [ + 'old' => ['string|false', 'public_key'=>'mixed', 'private_key'=>'mixed', 'key_length='=>'?int'], + 'new' => ['string|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'key_length='=>'int'], + ], + 'openssl_pkey_export' => [ + 'old' => ['bool', 'key'=>'resource', '&w_output'=>'string', 'passphrase='=>'string|null', 'options='=>'array'], + 'new' => ['bool', 'key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', '&w_output'=>'string', 'passphrase='=>'string|null', 'options='=>'array|null'], + ], + 'openssl_pkey_export_to_file' => [ + 'old' => ['bool', 'key'=>'resource|string|array', 'output_filename'=>'string', 'passphrase='=>'string|null', 'options='=>'array'], + 'new' => ['bool', 'key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'output_filename'=>'string', 'passphrase='=>'string|null', 'options='=>'array|null'], + ], + 'openssl_pkey_free' => [ + 'old' => ['void', 'key'=>'resource'], + 'new' => ['void', 'key'=>'OpenSSLAsymmetricKey'], + ], + 'openssl_pkey_get_details' => [ + 'old' => ['array|false', 'key'=>'resource'], + 'new' => ['array|false', 'key'=>'OpenSSLAsymmetricKey'], + ], + 'openssl_pkey_get_private' => [ + 'old' => ['resource|false', 'private_key'=>'string', 'passphrase='=>'string'], + 'new' => ['OpenSSLAsymmetricKey|false', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string', 'passphrase='=>'?string'], + ], + 'openssl_pkey_get_public' => [ + 'old' => ['resource|false', 'public_key'=>'resource|string'], + 'new' => ['OpenSSLAsymmetricKey|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], + ], + 'openssl_pkey_new' => [ + 'old' => ['resource|false', 'options='=>'array'], + 'new' => ['OpenSSLAsymmetricKey|false', 'options='=>'array|null'], + ], + 'openssl_private_decrypt' => [ + 'old' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'private_key'=>'string|resource|array', 'padding='=>'int'], + 'new' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], + ], + 'openssl_private_encrypt' => [ + 'old' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'private_key'=>'string|resource|array', 'padding='=>'int'], + 'new' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], + ], + 'openssl_public_decrypt' => [ + 'old' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'public_key'=>'string|resource', 'padding='=>'int'], + 'new' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], + ], + 'openssl_public_encrypt' => [ + 'old' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'public_key'=>'string|resource', 'padding='=>'int'], + 'new' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], + ], + 'openssl_seal' => [ + 'old' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&w_encrypted_keys'=>'array', 'public_key'=>'array', 'cipher_algo='=>'string', '&rw_iv='=>'string'], + 'new' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&w_encrypted_keys'=>'array', 'public_key'=>'list', 'cipher_algo'=>'string', '&rw_iv='=>'string'], + ], + 'openssl_sign' => [ + 'old' => ['bool', 'data'=>'string', '&w_signature'=>'string', 'private_key'=>'resource|string', 'algorithm='=>'int|string'], + 'new' => ['bool', 'data'=>'string', '&w_signature'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'algorithm='=>'int|string'], + ], + 'openssl_spki_new' => [ + 'old' => ['?string', 'private_key'=>'resource', 'challenge'=>'string', 'digest_algo='=>'int'], + 'new' => ['string|false', 'private_key'=>'OpenSSLAsymmetricKey', 'challenge'=>'string', 'digest_algo='=>'int'], + ], + 'openssl_verify' => [ + 'old' => ['-1|0|1', 'data'=>'string', 'signature'=>'string', 'public_key'=>'resource|string', 'algorithm='=>'int|string'], + 'new' => ['-1|0|1|false', 'data'=>'string', 'signature'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'algorithm='=>'int|string'], + ], + 'openssl_x509_check_private_key' => [ + 'old' => ['bool', 'certificate'=>'string|resource', 'private_key'=>'string|resource|array'], + 'new' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], + ], + 'openssl_x509_checkpurpose' => [ + 'old' => ['bool|int', 'certificate'=>'string|resource', 'purpose'=>'int', 'ca_info='=>'array', 'untrusted_certificates_file='=>'string'], + 'new' => ['bool|int', 'certificate'=>'OpenSSLCertificate|string', 'purpose'=>'int', 'ca_info='=>'array', 'untrusted_certificates_file='=>'string|null'], + ], + 'openssl_x509_export' => [ + 'old' => ['bool', 'certificate'=>'string|resource', '&w_output'=>'string', 'no_text='=>'bool'], + 'new' => ['bool', 'certificate'=>'OpenSSLCertificate|string', '&w_output'=>'string', 'no_text='=>'bool'], + ], + 'openssl_x509_export_to_file' => [ + 'old' => ['bool', 'certificate'=>'string|resource', 'output_filename'=>'string', 'no_text='=>'bool'], + 'new' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'output_filename'=>'string', 'no_text='=>'bool'], + ], + 'openssl_x509_fingerprint' => [ + 'old' => ['string|false', 'certificate'=>'string|resource', 'digest_algo='=>'string', 'binary='=>'bool'], + 'new' => ['string|false', 'certificate'=>'OpenSSLCertificate|string', 'digest_algo='=>'string', 'binary='=>'bool'], + ], + 'openssl_x509_free' => [ + 'old' => ['void', 'certificate'=>'resource'], + 'new' => ['void', 'certificate'=>'OpenSSLCertificate'], + ], + 'openssl_x509_parse' => [ + 'old' => ['array|false', 'certificate'=>'string|resource', 'short_names='=>'bool'], + 'new' => ['array|false', 'certificate'=>'OpenSSLCertificate|string', 'short_names='=>'bool'], + ], + 'openssl_x509_read' => [ + 'old' => ['resource|false', 'certificate'=>'string|resource'], + 'new' => ['OpenSSLCertificate|false', 'certificate'=>'OpenSSLCertificate|string'], + ], + 'parse_str' => [ + 'old' => ['void', 'string'=>'string', '&w_result='=>'array'], + 'new' => ['void', 'string'=>'string', '&w_result'=>'array'], + ], + 'password_hash' => [ + 'old' => ['string|false', 'password'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], + 'new' => ['string', 'password'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], + ], + 'proc_get_status' => [ + 'old' => ['array{command: string, pid: int, running: bool, signaled: bool, stopped: bool, exitcode: int, termsig: int, stopsig: int}|false', 'process'=>'resource'], + 'new' => ['array{command: string, pid: int, running: bool, signaled: bool, stopped: bool, exitcode: int, termsig: int, stopsig: int}', 'process'=>'resource'], + ], + 'session_set_cookie_params' => [ + 'old' => ['bool', 'lifetime'=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool'], + 'new' => ['bool', 'lifetime'=>'int', 'path='=>'?string', 'domain='=>'?string', 'secure='=>'?bool', 'httponly='=>'?bool'], + ], + 'socket_accept' => [ + 'old' => ['resource|false', 'socket'=>'resource'], + 'new' => ['Socket|false', 'socket'=>'Socket'], + ], + 'socket_addrinfo_bind' => [ + 'old' => ['?resource', 'addrinfo'=>'resource'], + 'new' => ['Socket|false', 'address'=>'AddressInfo'], + ], + 'socket_addrinfo_connect' => [ + 'old' => ['resource', 'addrinfo'=>'resource'], + 'new' => ['Socket|false', 'address'=>'AddressInfo'], + ], + 'socket_addrinfo_explain' => [ + 'old' => ['array', 'addrinfo'=>'resource'], + 'new' => ['array', 'address'=>'AddressInfo'], + ], + 'socket_addrinfo_lookup' => [ + 'old' => ['resource[]', 'node'=>'string', 'service='=>'mixed', 'hints='=>'array'], + 'new' => ['false|AddressInfo[]', 'host='=>'string|null', 'service='=>'mixed', 'hints='=>'array'], + ], + 'socket_bind' => [ + 'old' => ['bool', 'socket'=>'resource', 'addr'=>'string', 'port='=>'int'], + 'new' => ['bool', 'socket'=>'Socket', 'addr'=>'string', 'port='=>'int'], + ], + 'socket_clear_error' => [ + 'old' => ['void', 'socket='=>'resource'], + 'new' => ['void', 'socket='=>'Socket'], + ], + 'socket_close' => [ + 'old' => ['void', 'socket'=>'resource'], + 'new' => ['void', 'socket'=>'Socket'], + ], + 'socket_connect' => [ + 'old' => ['bool', 'socket'=>'resource', 'addr'=>'string', 'port='=>'int'], + 'new' => ['bool', 'socket'=>'Socket', 'addr'=>'string', 'port='=>'int'], + ], + 'socket_create' => [ + 'old' => ['resource|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], + 'new' => ['Socket|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], + ], + 'socket_create_listen' => [ + 'old' => ['resource|false', 'port'=>'int', 'backlog='=>'int'], + 'new' => ['Socket|false', 'port'=>'int', 'backlog='=>'int'], + ], + 'socket_create_pair' => [ + 'old' => ['bool', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int', '&w_fd'=>'resource[]'], + 'new' => ['bool', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int', '&w_fd'=>'Socket[]'], + ], + 'socket_export_stream' => [ + 'old' => ['resource|false', 'socket'=>'resource'], + 'new' => ['resource|false', 'socket'=>'Socket'], + ], + 'socket_get_option' => [ + 'old' => ['mixed|false', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int'], + 'new' => ['mixed|false', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int'], + ], + 'socket_get_status' => [ + 'old' => ['array', 'stream'=>'resource'], + 'new' => ['array', 'stream'=>'Socket'], + ], + 'socket_getopt' => [ + 'old' => ['mixed', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int'], + 'new' => ['mixed', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int'], + ], + 'socket_getpeername' => [ + 'old' => ['bool', 'socket'=>'resource', '&w_addr'=>'string', '&w_port='=>'int'], + 'new' => ['bool', 'socket'=>'Socket', '&w_addr'=>'string', '&w_port='=>'int'], + ], + 'socket_getsockname' => [ + 'old' => ['bool', 'socket'=>'resource', '&w_addr'=>'string', '&w_port='=>'int'], + 'new' => ['bool', 'socket'=>'Socket', '&w_addr'=>'string', '&w_port='=>'int'], + ], + 'socket_import_stream' => [ + 'old' => ['resource|false|null', 'stream'=>'resource'], + 'new' => ['Socket|false|null', 'stream'=>'resource'], + ], + 'socket_last_error' => [ + 'old' => ['int', 'socket='=>'resource'], + 'new' => ['int', 'socket='=>'Socket'], + ], + 'socket_listen' => [ + 'old' => ['bool', 'socket'=>'resource', 'backlog='=>'int'], + 'new' => ['bool', 'socket'=>'Socket', 'backlog='=>'int'], + ], + 'socket_read' => [ + 'old' => ['string|false', 'socket'=>'resource', 'length'=>'int', 'type='=>'int'], + 'new' => ['string|false', 'socket'=>'Socket', 'length'=>'int', 'type='=>'int'], + ], + 'socket_recv' => [ + 'old' => ['int|false', 'socket'=>'resource', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int'], + 'new' => ['int|false', 'socket'=>'Socket', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int'], + ], + 'socket_recvfrom' => [ + 'old' => ['int|false', 'socket'=>'resource', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int', '&w_name'=>'string', '&w_port='=>'int'], + 'new' => ['int|false', 'socket'=>'Socket', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int', '&w_name'=>'string', '&w_port='=>'int'], + ], + 'socket_recvmsg' => [ + 'old' => ['int|false', 'socket'=>'resource', '&w_message'=>'string', 'flags='=>'int'], + 'new' => ['int|false', 'socket'=>'Socket', '&w_message'=>'string', 'flags='=>'int'], + ], + 'socket_select' => [ + 'old' => ['int|false', '&rw_read_fds'=>'resource[]|null', '&rw_write_fds'=>'resource[]|null', '&rw_except_fds'=>'resource[]|null', 'tv_sec'=>'int|null', 'tv_usec='=>'int'], + 'new' => ['int|false', '&rw_read_fds'=>'Socket[]|null', '&rw_write_fds'=>'Socket[]|null', '&rw_except_fds'=>'Socket[]|null', 'tv_sec'=>'int|null', 'tv_usec='=>'int'], + ], + 'socket_send' => [ + 'old' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'length'=>'int', 'flags'=>'int'], + 'new' => ['int|false', 'socket'=>'Socket', 'buf'=>'string', 'length'=>'int', 'flags'=>'int'], + ], + 'socket_sendmsg' => [ + 'old' => ['int|false', 'socket'=>'resource', 'message'=>'array', 'flags'=>'int'], + 'new' => ['int|false', 'socket'=>'Socket', 'message'=>'array', 'flags'=>'int'], + ], + 'socket_sendto' => [ + 'old' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'length'=>'int', 'flags'=>'int', 'addr'=>'string', 'port='=>'int'], + 'new' => ['int|false', 'socket'=>'Socket', 'buf'=>'string', 'length'=>'int', 'flags'=>'int', 'addr'=>'string', 'port='=>'int'], + ], + 'socket_set_block' => [ + 'old' => ['bool', 'socket'=>'resource'], + 'new' => ['bool', 'socket'=>'Socket'], + ], + 'socket_set_blocking' => [ + 'old' => ['bool', 'socket'=>'resource', 'mode'=>'int'], + 'new' => ['bool', 'socket'=>'Socket', 'mode'=>'int'], + ], + 'socket_set_nonblock' => [ + 'old' => ['bool', 'socket'=>'resource'], + 'new' => ['bool', 'socket'=>'Socket'], + ], + 'socket_set_option' => [ + 'old' => ['bool', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], + 'new' => ['bool', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], + ], + 'socket_set_timeout' => [ + 'old' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], + 'new' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], + ], + 'socket_setopt' => [ + 'old' => ['void', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], + 'new' => ['void', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], + ], + 'socket_shutdown' => [ + 'old' => ['bool', 'socket'=>'resource', 'how='=>'int'], + 'new' => ['bool', 'socket'=>'Socket', 'how='=>'int'], + ], + 'socket_strerror' => [ + 'old' => ['string', 'errno'=>'int'], + 'new' => ['string', 'errno'=>'int'], + ], + 'socket_write' => [ + 'old' => ['int|false', 'socket'=>'resource', 'data'=>'string', 'length='=>'int'], + 'new' => ['int|false', 'socket'=>'Socket', 'data'=>'string', 'length='=>'int|null'], + ], + 'socket_wsaprotocol_info_export' => [ + 'old' => ['string|false', 'socket'=>'resource', 'process_id'=>'int'], + 'new' => ['string|false', 'socket'=>'Socket', 'process_id'=>'int'], + ], + 'socket_wsaprotocol_info_import' => [ + 'old' => ['resource|false', 'info_id'=>'string'], + 'new' => ['Socket|false', 'info_id'=>'string'], + ], + 'strchr' => [ + 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], + 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], + ], + 'strftime' => [ + 'old' => ['string|false', 'format'=>'string', 'timestamp='=>'int'], + 'new' => ['string|false', 'format'=>'string', 'timestamp='=>'?int'], + ], + 'stripos' => [ + 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], + 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], + ], + 'stristr' => [ + 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], + 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], + ], + 'strpos' => [ + 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], + 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], + ], + 'strrchr' => [ + 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int'], + 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string'], + ], + 'strripos' => [ + 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], + 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], + ], + 'strrpos' => [ + 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], + 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], + ], + 'strstr' => [ + 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], + 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], + ], + 'timezone_identifiers_list' => [ + 'old' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'?string'], + 'new' => ['list', 'timezoneGroup='=>'int', 'countryCode='=>'?string'], + ], + 'xml_get_current_byte_index' => [ + 'old' => ['int|false', 'parser'=>'resource'], + 'new' => ['int|false', 'parser'=>'XMLParser'], + ], + 'xml_get_current_column_number' => [ + 'old' => ['int|false', 'parser'=>'resource'], + 'new' => ['int|false', 'parser'=>'XMLParser'], + ], + 'xml_get_current_line_number' => [ + 'old' => ['int|false', 'parser'=>'resource'], + 'new' => ['int|false', 'parser'=>'XMLParser'], + ], + 'xml_get_error_code' => [ + 'old' => ['int|false', 'parser'=>'resource'], + 'new' => ['int|false', 'parser'=>'XMLParser'], + ], + 'xml_parse' => [ + 'old' => ['int', 'parser'=>'resource', 'data'=>'string', 'is_final='=>'bool'], + 'new' => ['int', 'parser'=>'XMLParser', 'data'=>'string', 'is_final='=>'bool'], + ], + 'xml_parse_into_struct' => [ + 'old' => ['int', 'parser'=>'resource', 'data'=>'string', '&w_values'=>'array', '&w_index='=>'array'], + 'new' => ['int', 'parser'=>'XMLParser', 'data'=>'string', '&w_values'=>'array', '&w_index='=>'array'], + ], + 'xml_parser_create' => [ + 'old' => ['resource', 'encoding='=>'string'], + 'new' => ['XMLParser', 'encoding='=>'string'], + ], + 'xml_parser_create_ns' => [ + 'old' => ['resource', 'encoding='=>'string', 'separator='=>'string'], + 'new' => ['XMLParser', 'encoding='=>'string', 'separator='=>'string'], + ], + 'xml_parser_free' => [ + 'old' => ['bool', 'parser'=>'resource'], + 'new' => ['bool', 'parser'=>'XMLParser'], + ], + 'xml_parser_get_option' => [ + 'old' => ['mixed|false', 'parser'=>'resource', 'option'=>'int'], + 'new' => ['mixed|false', 'parser'=>'XMLParser', 'option'=>'int'], + ], + 'xml_parser_set_option' => [ + 'old' => ['bool', 'parser'=>'resource', 'option'=>'int', 'value'=>'mixed'], + 'new' => ['bool', 'parser'=>'XMLParser', 'option'=>'int', 'value'=>'mixed'], + ], + 'xml_set_character_data_handler' => [ + 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], + ], + 'xml_set_default_handler' => [ + 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], + ], + 'xml_set_element_handler' => [ + 'old' => ['bool', 'parser'=>'resource', 'start_handler'=>'callable', 'end_handler'=>'callable'], + 'new' => ['bool', 'parser'=>'XMLParser', 'start_handler'=>'callable', 'end_handler'=>'callable'], + ], + 'xml_set_end_namespace_decl_handler' => [ + 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], + ], + 'xml_set_external_entity_ref_handler' => [ + 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], + ], + 'xml_set_notation_decl_handler' => [ + 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], + ], + 'xml_set_object' => [ + 'old' => ['bool', 'parser'=>'resource', 'object'=>'object'], + 'new' => ['bool', 'parser'=>'XMLParser', 'object'=>'object'], + ], + 'xml_set_processing_instruction_handler' => [ + 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], + ], + 'xml_set_start_namespace_decl_handler' => [ + 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], + ], + 'xml_set_unparsed_entity_decl_handler' => [ + 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], + ], + 'xmlwriter_end_attribute' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_end_cdata' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_end_comment' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_end_document' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_end_dtd' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_end_dtd_attlist' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_end_dtd_element' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_end_dtd_entity' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_end_element' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_end_pi' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_flush' => [ + 'old' => ['string|int|false', 'writer'=>'resource', 'empty='=>'bool'], + 'new' => ['string|int', 'writer'=>'XMLWriter', 'empty='=>'bool'], + ], + 'xmlwriter_full_end_element' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_open_memory' => [ + 'old' => ['resource|false'], + 'new' => ['XMLWriter|false'], + ], + 'xmlwriter_open_uri' => [ + 'old' => ['resource|false', 'uri'=>'string'], + 'new' => ['XMLWriter|false', 'uri'=>'string'], + ], + 'xmlwriter_output_memory' => [ + 'old' => ['string', 'writer'=>'resource', 'flush='=>'bool'], + 'new' => ['string', 'writer'=>'XMLWriter', 'flush='=>'bool'], + ], + 'xmlwriter_set_indent' => [ + 'old' => ['bool', 'writer'=>'resource', 'enable'=>'bool'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'enable'=>'bool'], + ], + 'xmlwriter_set_indent_string' => [ + 'old' => ['bool', 'writer'=>'resource', 'indentation'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'indentation'=>'string'], + ], + 'xmlwriter_start_attribute' => [ + 'old' => ['bool', 'writer'=>'resource', 'name'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], + ], + 'xmlwriter_start_attribute_ns' => [ + 'old' => ['bool', 'writer'=>'resource', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], + ], + 'xmlwriter_start_cdata' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_start_comment' => [ + 'old' => ['bool', 'writer'=>'resource'], + 'new' => ['bool', 'writer'=>'XMLWriter'], + ], + 'xmlwriter_start_document' => [ + 'old' => ['bool', 'writer'=>'resource', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], + ], + 'xmlwriter_start_dtd' => [ + 'old' => ['bool', 'writer'=>'resource', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], + ], + 'xmlwriter_start_dtd_attlist' => [ + 'old' => ['bool', 'writer'=>'resource', 'name'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], + ], + 'xmlwriter_start_dtd_element' => [ + 'old' => ['bool', 'writer'=>'resource', 'qualifiedName'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'qualifiedName'=>'string'], + ], + 'xmlwriter_start_dtd_entity' => [ + 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'isParam'=>'bool'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'isParam'=>'bool'], + ], + 'xmlwriter_start_element' => [ + 'old' => ['bool', 'writer'=>'resource', 'name'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], + ], + 'xmlwriter_start_element_ns' => [ + 'old' => ['bool', 'writer'=>'resource', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], + ], + 'xmlwriter_start_pi' => [ + 'old' => ['bool', 'writer'=>'resource', 'target'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'target'=>'string'], + ], + 'xmlwriter_text' => [ + 'old' => ['bool', 'writer'=>'resource', 'content'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], + ], + 'xmlwriter_write_attribute' => [ + 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'value'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'value'=>'string'], + ], + 'xmlwriter_write_attribute_ns' => [ + 'old' => ['bool', 'writer'=>'resource', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], + ], + 'xmlwriter_write_cdata' => [ + 'old' => ['bool', 'writer'=>'resource', 'content'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], + ], + 'xmlwriter_write_comment' => [ + 'old' => ['bool', 'writer'=>'resource', 'content'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], + ], + 'xmlwriter_write_dtd' => [ + 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], + ], + 'xmlwriter_write_dtd_attlist' => [ + 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string'], + ], + 'xmlwriter_write_dtd_element' => [ + 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string'], + ], + 'xmlwriter_write_dtd_entity' => [ + 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string', 'isParam'=>'bool', 'publicId'=>'string', 'systemId'=>'string', 'notationData'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string', 'isParam='=>'bool', 'publicId='=>'?string', 'systemId='=>'?string', 'notationData='=>'?string'], + ], + 'xmlwriter_write_element' => [ + 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'?string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content='=>'?string'], + ], + 'xmlwriter_write_element_ns' => [ + 'old' => ['bool', 'writer'=>'resource', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'string', 'content'=>'?string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'content='=>'?string'], + ], + 'xmlwriter_write_pi' => [ + 'old' => ['bool', 'writer'=>'resource', 'target'=>'string', 'content'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'target'=>'string', 'content'=>'string'], + ], + 'xmlwriter_write_raw' => [ + 'old' => ['bool', 'writer'=>'resource', 'content'=>'string'], + 'new' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], + ], + ], + 'removed' => [ + 'PDOStatement::setFetchMode\'1' => ['bool', 'fetch_column'=>'int', 'colno'=>'int'], + 'PDOStatement::setFetchMode\'2' => ['bool', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs'=>'array'], + 'PDOStatement::setFetchMode\'3' => ['bool', 'fetch_into'=>'int', 'object'=>'object'], + 'ReflectionType::isBuiltin' => ['bool'], + 'SplFileObject::fgetss' => ['string|false', 'allowable_tags='=>'string'], + 'create_function' => ['string', 'args'=>'string', 'code'=>'string'], + 'each' => ['array{0:int|string,key:int|string,1:mixed,value:mixed}', '&r_arr'=>'array'], + 'gmp_random' => ['GMP', 'limiter='=>'int'], + 'gzgetss' => ['string|false', 'zp'=>'resource', 'length'=>'int', 'allowable_tags='=>'string'], + 'image2wbmp' => ['bool', 'im'=>'resource', 'filename='=>'?string', 'threshold='=>'int'], + 'jpeg2wbmp' => ['bool', 'jpegname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'], + 'ldap_control_paged_result' => ['bool', 'link_identifier'=>'resource', 'pagesize'=>'int', 'iscritical='=>'bool', 'cookie='=>'string'], + 'ldap_control_paged_result_response' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', '&w_cookie'=>'string', '&w_estimated'=>'int'], + 'ldap_sort' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', 'sortfilter'=>'string'], + 'number_format\'1' => ['string', 'num'=>'float|int', 'decimals'=>'int', 'decimal_separator'=>'?string', 'thousands_separator'=>'?string'], + 'png2wbmp' => ['bool', 'pngname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'], + 'read_exif_data' => ['array', 'filename'=>'string', 'sections_needed='=>'string', 'sub_arrays='=>'bool', 'read_thumbnail='=>'bool'], + 'SimpleXMLIterator::rewind' => ['void'], + 'SimpleXMLIterator::valid' => ['bool'], + 'SimpleXMLIterator::current' => ['?SimpleXMLIterator'], + 'SimpleXMLIterator::key' => ['string|false'], + 'SimpleXMLIterator::next' => ['void'], + 'SimpleXMLIterator::hasChildren' => ['bool'], + 'SimpleXMLIterator::getChildren' => ['SimpleXMLIterator'], + ], +]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php new file mode 100644 index 00000000..b6cae16f --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php @@ -0,0 +1,1133 @@ + [ + 'array_is_list' => ['bool', 'array' => 'array'], + 'enum_exists' => ['bool', 'enum' => 'class-string', 'autoload=' => 'bool'], + 'fsync' => ['bool', 'stream' => 'resource'], + 'fdatasync' => ['bool', 'stream' => 'resource'], + 'imageavif' => ['bool', 'image'=>'GdImage', 'file='=>'resource|string|null', 'quality='=>'int', 'speed='=>'int'], + 'imagecreatefromavif' => ['false|GdImage', 'filename'=>'string'], + 'mysqli_fetch_column' => ['null|int|float|string|false', 'result'=>'mysqli_result', 'column='=>'int'], + 'mysqli_result::fetch_column' => ['null|int|float|string|false', 'column='=>'int'], + 'CURLStringFile::__construct' => ['void', 'data'=>'string', 'postname'=>'string', 'mime='=>'string'], + 'Fiber::__construct' => ['void', 'callback'=>'callable'], + 'Fiber::start' => ['mixed', '...args'=>'mixed'], + 'Fiber::resume' => ['mixed', 'value='=>'null|mixed'], + 'Fiber::throw' => ['mixed', 'exception'=>'Throwable'], + 'Fiber::isStarted' => ['bool'], + 'Fiber::isSuspended' => ['bool'], + 'Fiber::isRunning' => ['bool'], + 'Fiber::isTerminated' => ['bool'], + 'Fiber::getReturn' => ['mixed'], + 'Fiber::getCurrent' => ['?self'], + 'Fiber::suspend' => ['mixed', 'value='=>'null|mixed'], + 'FiberError::__construct' => ['void'], + 'ReflectionClass::isEnum' => ['bool'], + 'ReflectionEnum::getBackingType' => ['?ReflectionType'], + 'ReflectionEnum::getCase' => ['ReflectionEnumUnitCase', 'name' => 'string'], + 'ReflectionEnum::getCases' => ['list'], + 'ReflectionEnum::hasCase' => ['bool', 'name' => 'string'], + 'ReflectionEnum::isBacked' => ['bool'], + 'ReflectionEnumUnitCase::getEnum' => ['ReflectionEnum'], + 'ReflectionEnumUnitCase::getValue' => ['UnitEnum'], + 'ReflectionEnumBackedCase::getBackingValue' => ['string|int'], + 'ReflectionFunctionAbstract::getTentativeReturnType' => ['?ReflectionType'], + 'ReflectionFunctionAbstract::hasTentativeReturnType' => ['bool'], + 'ReflectionFunctionAbstract::isStatic' => ['bool'], + 'ReflectionObject::isEnum' => ['bool'], + ], + + 'changed' => [ + 'finfo_buffer' => [ + 'old' => ['string|false', 'finfo'=>'resource', 'string'=>'string', 'flags='=>'int', 'context='=>'resource'], + 'new' => ['string|false', 'finfo'=>'finfo', 'string'=>'string', 'flags='=>'int', 'context='=>'resource'], + ], + 'finfo_close' => [ + 'old' => ['bool', 'finfo'=>'resource'], + 'new' => ['bool', 'finfo'=>'finfo'], + ], + 'finfo_file' => [ + 'old' => ['string|false', 'finfo'=>'resource', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], + 'new' => ['string|false', 'finfo'=>'finfo', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], + ], + 'finfo_open' => [ + 'old' => ['resource|false', 'flags='=>'int', 'magic_database='=>'string'], + 'new' => ['finfo|false', 'flags='=>'int', 'magic_database='=>'string'], + ], + 'finfo_set_flags' => [ + 'old' => ['bool', 'finfo'=>'resource', 'flags'=>'int'], + 'new' => ['bool', 'finfo'=>'finfo', 'flags'=>'int'], + ], + 'fputcsv' => [ + 'old' => ['int|false', 'stream'=>'resource', 'fields'=>'array', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], + 'new' => ['int|false', 'stream'=>'resource', 'fields'=>'array', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string', 'eol='=>'string'], + ], + 'ftp_connect' => [ + 'old' => ['resource|false', 'hostname' => 'string', 'port=' => 'int', 'timeout=' => 'int'], + 'new' => ['FTP\Connection|false', 'hostname' => 'string', 'port=' => 'int', 'timeout=' => 'int'], + ], + 'ftp_ssl_connect' => [ + 'old' => ['resource|false', 'hostname' => 'string', 'port=' => 'int', 'timeout=' => 'int'], + 'new' => ['FTP\Connection|false', 'hostname' => 'string', 'port=' => 'int', 'timeout=' => 'int'], + ], + 'ftp_login' => [ + 'old' => ['bool', 'ftp' => 'resource', 'username' => 'string', 'password' => 'string'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'username' => 'string', 'password' => 'string'], + ], + 'ftp_pwd' => [ + 'old' => ['string|false', 'ftp' => 'resource'], + 'new' => ['string|false', 'ftp' => 'FTP\Connection'], + ], + 'ftp_cdup' => [ + 'old' => ['bool', 'ftp' => 'resource'], + 'new' => ['bool', 'ftp' => 'FTP\Connection'], + ], + 'ftp_chdir' => [ + 'old' => ['bool', 'ftp' => 'resource', 'directory' => 'string'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'directory' => 'string'], + ], + 'ftp_exec' => [ + 'old' => ['bool', 'ftp' => 'resource', 'command' => 'string'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'command' => 'string'], + ], + 'ftp_raw' => [ + 'old' => ['?array', 'ftp' => 'resource', 'command' => 'string'], + 'new' => ['?array', 'ftp' => 'FTP\Connection', 'command' => 'string'], + ], + 'ftp_mkdir' => [ + 'old' => ['string|false', 'ftp' => 'resource', 'directory' => 'string'], + 'new' => ['string|false', 'ftp' => 'FTP\Connection', 'directory' => 'string'], + ], + 'ftp_rmdir' => [ + 'old' => ['bool', 'ftp' => 'resource', 'directory' => 'string'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'directory' => 'string'], + ], + 'ftp_chmod' => [ + 'old' => ['int|false', 'ftp' => 'resource', 'permissions' => 'int', 'filename' => 'string'], + 'new' => ['int|false', 'ftp' => 'FTP\Connection', 'permissions' => 'int', 'filename' => 'string'], + ], + 'ftp_alloc' => [ + 'old' => ['bool', 'ftp' => 'resource', 'size' => 'int', '&w_response=' => 'string'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'size' => 'int', '&w_response=' => 'string'], + ], + 'ftp_nlist' => [ + 'old' => ['array|false', 'ftp' => 'resource', 'directory' => 'string'], + 'new' => ['array|false', 'ftp' => 'FTP\Connection', 'directory' => 'string'], + ], + 'ftp_rawlist' => [ + 'old' => ['array|false', 'ftp' => 'resource', 'directory' => 'string', 'recursive=' => 'bool'], + 'new' => ['array|false', 'ftp' => 'FTP\Connection', 'directory' => 'string', 'recursive=' => 'bool'], + ], + 'ftp_mlsd' => [ + 'old' => ['array|false', 'ftp' => 'resource', 'directory' => 'string'], + 'new' => ['array|false', 'ftp' => 'FTP\Connection', 'directory' => 'string'], + ], + 'ftp_systype' => [ + 'old' => ['string|false', 'ftp' => 'resource'], + 'new' => ['string|false', 'ftp' => 'FTP\Connection'], + ], + 'ftp_fget' => [ + 'old' => ['bool', 'ftp' => 'resource', 'stream' => 'resource', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'stream' => 'resource', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + ], + 'ftp_nb_fget' => [ + 'old' => ['int', 'ftp' => 'resource', 'stream' => 'resource', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + 'new' => ['int', 'ftp' => 'FTP\Connection', 'stream' => 'resource', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + ], + 'ftp_pasv' => [ + 'old' => ['bool', 'ftp' => 'resource', 'enable' => 'bool'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'enable' => 'bool'], + ], + 'ftp_get' => [ + 'old' => ['bool', 'ftp' => 'resource', 'local_filename' => 'string', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'local_filename' => 'string', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + ], + 'ftp_nb_get' => [ + 'old' => ['int', 'ftp' => 'resource', 'local_filename' => 'string', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + 'new' => ['int', 'ftp' => 'FTP\Connection', 'local_filename' => 'string', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + ], + 'ftp_nb_continue' => [ + 'old' => ['int', 'ftp' => 'resource'], + 'new' => ['int', 'ftp' => 'FTP\Connection'], + ], + 'ftp_fput' => [ + 'old' => ['bool', 'ftp' => 'resource', 'remote_filename' => 'string', 'stream' => 'resource', 'mode=' => 'int', 'offset=' => 'int'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'remote_filename' => 'string', 'stream' => 'resource', 'mode=' => 'int', 'offset=' => 'int'], + ], + 'ftp_nb_fput' => [ + 'old' => ['int', 'ftp' => 'resource', 'remote_filename' => 'string', 'stream' => 'resource', 'mode=' => 'int', 'offset=' => 'int'], + 'new' => ['int', 'ftp' => 'FTP\Connection', 'remote_filename' => 'string', 'stream' => 'resource', 'mode=' => 'int', 'offset=' => 'int'], + ], + 'ftp_put' => [ + 'old' => ['bool', 'ftp' => 'resource', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + ], + 'ftp_append' => [ + 'old' => ['bool', 'ftp' => 'resource', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int'], + ], + 'ftp_nb_put' => [ + 'old' => ['int', 'ftp' => 'resource', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + 'new' => ['int', 'ftp' => 'FTP\Connection', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], + ], + 'ftp_size' => [ + 'old' => ['int', 'ftp' => 'resource', 'filename' => 'string'], + 'new' => ['int', 'ftp' => 'FTP\Connection', 'filename' => 'string'], + ], + 'ftp_mdtm' => [ + 'old' => ['int', 'ftp' => 'resource', 'filename' => 'string'], + 'new' => ['int', 'ftp' => 'FTP\Connection', 'filename' => 'string'], + ], + 'ftp_rename' => [ + 'old' => ['bool', 'ftp' => 'resource', 'from' => 'string', 'to' => 'string'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'from' => 'string', 'to' => 'string'], + ], + 'ftp_delete' => [ + 'old' => ['bool', 'ftp' => 'resource', 'filename' => 'string'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'filename' => 'string'], + ], + 'ftp_site' => [ + 'old' => ['bool', 'ftp' => 'resource', 'command' => 'string'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'command' => 'string'], + ], + 'ftp_close' => [ + 'old' => ['bool', 'ftp' => 'resource'], + 'new' => ['bool', 'ftp' => 'FTP\Connection'], + ], + 'ftp_quit' => [ + 'old' => ['bool', 'ftp' => 'resource'], + 'new' => ['bool', 'ftp' => 'FTP\Connection'], + ], + 'ftp_set_option' => [ + 'old' => ['bool', 'ftp' => 'resource', 'option' => 'int', 'value' => 'mixed'], + 'new' => ['bool', 'ftp' => 'FTP\Connection', 'option' => 'int', 'value' => 'mixed'], + ], + 'ftp_get_option' => [ + 'old' => ['mixed|false', 'ftp' => 'resource', 'option' => 'int'], + 'new' => ['mixed|false', 'ftp' => 'FTP\Connection', 'option' => 'int'], + ], + 'hash' => [ + 'old' => ['string|false', 'algo'=>'string', 'data'=>'string', 'binary='=>'bool'], + 'new' => ['string|false', 'algo'=>'string', 'data'=>'string', 'binary='=>'bool', 'options='=>'array'], + ], + 'hash_file' => [ + 'old' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'binary='=>'bool'], + 'new' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'binary='=>'bool', 'options='=>'array'], + ], + 'hash_init' => [ + 'old' => ['HashContext', 'algo'=>'string', 'flags='=>'int', 'key='=>'string'], + 'new' => ['HashContext', 'algo'=>'string', 'flags='=>'int', 'key='=>'string', 'options='=>'array'], + ], + 'imap_append' => [ + 'old' => ['bool', 'imap'=>'resource', 'folder'=>'string', 'message'=>'string', 'options='=>'string', 'internal_date='=>'string'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'folder'=>'string', 'message'=>'string', 'options='=>'string', 'internal_date='=>'string'], + ], + 'imap_body' => [ + 'old' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'new' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], + ], + 'imap_bodystruct' => [ + 'old' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string'], + 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string'], + ], + 'imap_check' => [ + 'old' => ['stdClass|false', 'imap'=>'resource'], + 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection'], + ], + 'imap_clearflag_full' => [ + 'old' => ['bool', 'imap'=>'resource', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], + ], + 'imap_close' => [ + 'old' => ['bool', 'imap'=>'resource', 'flags='=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'flags='=>'int'], + ], + 'imap_create' => [ + 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], + ], + 'imap_createmailbox' => [ + 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], + ], + 'imap_delete' => [ + 'old' => ['bool', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], + ], + 'imap_deletemailbox' => [ + 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], + ], + 'imap_expunge' => [ + 'old' => ['bool', 'imap'=>'resource'], + 'new' => ['bool', 'imap'=>'IMAP\Connection'], + ], + 'imap_fetch_overview' => [ + 'old' => ['array|false', 'imap'=>'resource', 'sequence'=>'string', 'flags='=>'int'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flags='=>'int'], + ], + 'imap_fetchbody' => [ + 'old' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], + 'new' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], + ], + 'imap_fetchheader' => [ + 'old' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'new' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], + ], + 'imap_fetchmime' => [ + 'old' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], + 'new' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], + ], + 'imap_fetchstructure' => [ + 'old' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], + ], + 'imap_fetchtext' => [ + 'old' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'new' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], + ], + 'imap_gc' => [ + 'old' => ['bool', 'imap'=>'resource', 'flags'=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'flags'=>'int'], + ], + 'imap_get_quota' => [ + 'old' => ['array|false', 'imap'=>'resource', 'quota_root'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'quota_root'=>'string'], + ], + 'imap_get_quotaroot' => [ + 'old' => ['array|false', 'imap'=>'resource', 'mailbox'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], + ], + 'imap_getacl' => [ + 'old' => ['array|false', 'imap'=>'resource', 'mailbox'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], + ], + 'imap_getmailboxes' => [ + 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], + ], + 'imap_getsubscribed' => [ + 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], + ], + 'imap_headerinfo' => [ + 'old' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string|null'], + 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string|null'], + ], + 'imap_headers' => [ + 'old' => ['array|false', 'imap'=>'resource'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection'], + ], + 'imap_list' => [ + 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], + ], + 'imap_listmailbox' => [ + 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], + ], + 'imap_listscan' => [ + 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], + ], + 'imap_listsubscribed' => [ + 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], + ], + 'imap_lsub' => [ + 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], + ], + 'imap_mail_copy' => [ + 'old' => ['bool', 'imap'=>'resource', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], + ], + 'imap_mail_move' => [ + 'old' => ['bool', 'imap'=>'resource', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], + ], + 'imap_mailboxmsginfo' => [ + 'old' => ['stdClass|false', 'imap'=>'resource'], + 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection'], + ], + 'imap_msgno' => [ + 'old' => ['int|false', 'imap'=>'resource', 'message_uid'=>'int'], + 'new' => ['int|false', 'imap'=>'IMAP\Connection', 'message_uid'=>'int'], + ], + 'imap_num_msg' => [ + 'old' => ['int|false', 'imap'=>'resource'], + 'new' => ['int|false', 'imap'=>'IMAP\Connection'], + ], + 'imap_num_recent' => [ + 'old' => ['int|false', 'imap'=>'resource'], + 'new' => ['int|false', 'imap'=>'IMAP\Connection'], + ], + 'imap_open' => [ + 'old' => ['resource|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'flags='=>'int', 'retries='=>'int', 'options='=>'?array'], + 'new' => ['IMAP\Connection|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'flags='=>'int', 'retries='=>'int', 'options='=>'?array'], + ], + 'imap_ping' => [ + 'old' => ['bool', 'imap'=>'resource'], + 'new' => ['bool', 'imap'=>'IMAP\Connection'], + ], + 'imap_rename' => [ + 'old' => ['bool', 'imap'=>'resource', 'from'=>'string', 'to'=>'string'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'from'=>'string', 'to'=>'string'], + ], + 'imap_renamemailbox' => [ + 'old' => ['bool', 'imap'=>'resource', 'from'=>'string', 'to'=>'string'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'from'=>'string', 'to'=>'string'], + ], + 'imap_reopen' => [ + 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string', 'flags='=>'int', 'retries='=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'flags='=>'int', 'retries='=>'int'], + ], + 'imap_savebody' => [ + 'old' => ['bool', 'imap'=>'resource', 'file'=>'string|resource', 'message_num'=>'int', 'section='=>'string', 'flags='=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'file'=>'string|resource', 'message_num'=>'int', 'section='=>'string', 'flags='=>'int'], + ], + 'imap_scan' => [ + 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], + ], + 'imap_scanmailbox' => [ + 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], + ], + 'imap_search' => [ + 'old' => ['array|false', 'imap'=>'resource', 'criteria'=>'string', 'flags='=>'int', 'charset='=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'criteria'=>'string', 'flags='=>'int', 'charset='=>'string'], + ], + 'imap_set_quota' => [ + 'old' => ['bool', 'imap'=>'resource', 'quota_root'=>'string', 'mailbox_size'=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'quota_root'=>'string', 'mailbox_size'=>'int'], + ], + 'imap_setacl' => [ + 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string', 'user_id'=>'string', 'rights'=>'string'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'user_id'=>'string', 'rights'=>'string'], + ], + 'imap_setflag_full' => [ + 'old' => ['bool', 'imap'=>'resource', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], + ], + 'imap_sort' => [ + 'old' => ['array|false', 'imap'=>'resource', 'criteria'=>'int', 'reverse'=>'int', 'flags='=>'int', 'search_criteria='=>'string', 'charset='=>'string'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'criteria'=>'int', 'reverse'=>'int', 'flags='=>'int', 'search_criteria='=>'string', 'charset='=>'string'], + ], + 'imap_status' => [ + 'old' => ['stdClass|false', 'imap'=>'resource', 'mailbox'=>'string', 'flags'=>'int'], + 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'flags'=>'int'], + ], + 'imap_subscribe' => [ + 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], + ], + 'imap_thread' => [ + 'old' => ['array|false', 'imap'=>'resource', 'flags='=>'int'], + 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'flags='=>'int'], + ], + 'imap_uid' => [ + 'old' => ['int|false', 'imap'=>'resource', 'message_num'=>'int'], + 'new' => ['int|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int'], + ], + 'imap_undelete' => [ + 'old' => ['bool', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], + ], + 'imap_unsubscribe' => [ + 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], + 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], + ], + 'ini_set' => [ + 'old' => ['string|false', 'option'=>'string', 'value'=>'string'], + 'new' => ['string|false', 'option'=>'string', 'value'=>'string|int|float|bool|null'], + ], + 'ldap_add' => [ + 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], + ], + 'ldap_add_ext' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], + 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], + ], + 'ldap_bind' => [ + 'old' => ['bool', 'ldap'=>'resource', 'dn='=>'string|null', 'password='=>'string|null'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn='=>'string|null', 'password='=>'string|null'], + ], + 'ldap_bind_ext' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'dn='=>'string|null', 'password='=>'string|null', 'controls='=>'array'], + 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn='=>'string|null', 'password='=>'string|null', 'controls='=>'?array'], + ], + 'ldap_close' => [ + 'old' => ['bool', 'ldap'=>'resource'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection'], + ], + 'ldap_compare' => [ + 'old' => ['bool|int', 'ldap'=>'resource', 'dn'=>'string', 'attribute'=>'string', 'value'=>'string'], + 'new' => ['bool|int', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'attribute'=>'string', 'value'=>'string', 'controls='=>'?array'], + ], + 'ldap_connect' => [ + 'old' => ['resource|false', 'uri='=>'string', 'port='=>'int', 'wallet='=>'string', 'password='=>'string', 'auth_mode='=>'int'], + 'new' => ['LDAP\Connection|false', 'uri='=>'string', 'port='=>'int', 'wallet='=>'string', 'password='=>'string', 'auth_mode='=>'int'], + ], + 'ldap_count_entries' => [ + 'old' => ['int|false', 'ldap'=>'resource', 'result'=>'resource'], + 'new' => ['int|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], + ], + 'ldap_delete' => [ + 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'controls='=>'?array'], + ], + 'ldap_delete_ext' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'controls='=>'array'], + 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'controls='=>'?array'], + ], + 'ldap_errno' => [ + 'old' => ['int', 'ldap'=>'resource'], + 'new' => ['int', 'ldap'=>'LDAP\Connection'], + ], + 'ldap_error' => [ + 'old' => ['string', 'ldap'=>'resource'], + 'new' => ['string', 'ldap'=>'LDAP\Connection'], + ], + 'ldap_exop' => [ + 'old' => ['mixed', 'ldap'=>'resource', 'reqoid'=>'string', 'reqdata='=>'string', 'serverctrls='=>'array|null', '&w_response_data='=>'string', '&w_response_oid='=>'string'], + 'new' => ['mixed', 'ldap'=>'LDAP\Connection', 'request_oid'=>'string', 'request_data='=>'string', 'controls='=>'?array', '&w_response_data='=>'string', '&w_response_oid='=>'string'], + ], + 'ldap_exop_passwd' => [ + 'old' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array|null'], + 'new' => ['bool|string', 'ldap'=>'LDAP\Connection', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array|null'], + ], + 'ldap_exop_refresh' => [ + 'old' => ['int|false', 'ldap'=>'resource', 'dn'=>'string', 'ttl'=>'int'], + 'new' => ['int|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'ttl'=>'int'], + ], + 'ldap_exop_whoami' => [ + 'old' => ['string|false', 'ldap'=>'resource'], + 'new' => ['string|false', 'ldap'=>'LDAP\Connection'], + ], + 'ldap_first_attribute' => [ + 'old' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], + 'new' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], + ], + 'ldap_first_entry' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], + 'new' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], + ], + 'ldap_first_reference' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], + 'new' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], + ], + 'ldap_free_result' => [ + 'old' => ['bool', 'ldap'=>'resource'], + 'new' => ['bool', 'result'=>'LDAP\Result'], + ], + 'ldap_get_attributes' => [ + 'old' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource'], + 'new' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], + ], + 'ldap_get_dn' => [ + 'old' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], + 'new' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], + ], + 'ldap_get_entries' => [ + 'old' => ['array|false', 'ldap'=>'resource', 'result'=>'resource'], + 'new' => ['array|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], + ], + 'ldap_get_option' => [ + 'old' => ['bool', 'ldap'=>'resource', 'option'=>'int', '&w_value'=>'mixed'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'option'=>'int', '&w_value='=>'array|string|int|null'], + ], + 'ldap_get_values' => [ + 'old' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource', 'attribute'=>'string'], + 'new' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', 'attribute'=>'string'], + ], + 'ldap_get_values_len' => [ + 'old' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource', 'attribute'=>'string'], + 'new' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', 'attribute'=>'string'], + ], + 'ldap_list' => [ + 'old' => ['resource|false', 'ldap'=>'resource|array', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], + 'new' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], + ], + 'ldap_mod_add' => [ + 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], + ], + 'ldap_mod_add_ext' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], + 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], + ], + 'ldap_mod_del' => [ + 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], + ], + 'ldap_mod_del_ext' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], + 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], + ], + 'ldap_mod_replace' => [ + 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], + ], + 'ldap_mod_replace_ext' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], + 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], + ], + 'ldap_modify' => [ + 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], + ], + 'ldap_modify_batch' => [ + 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'modifications_info'=>'array'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'modifications_info'=>'array', 'controls='=>'?array'], + ], + 'ldap_next_attribute' => [ + 'old' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], + 'new' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], + ], + 'ldap_next_entry' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], + 'new' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], + ], + 'ldap_next_reference' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'entry'=>'resource'], + 'new' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], + ], + 'ldap_parse_exop' => [ + 'old' => ['bool', 'ldap'=>'resource', 'result'=>'resource', '&w_response_data='=>'string', '&w_response_oid='=>'string'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result', '&w_response_data='=>'string', '&w_response_oid='=>'string'], + ], + 'ldap_parse_reference' => [ + 'old' => ['bool', 'ldap'=>'resource', 'entry'=>'resource', 'referrals'=>'array'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', '&w_referrals'=>'array'], + ], + 'ldap_parse_result' => [ + 'old' => ['bool', 'ldap'=>'resource', 'result'=>'resource', '&w_error_code'=>'int', '&w_matched_dn='=>'string', '&w_error_message='=>'string', '&w_referrals='=>'array', '&w_controls='=>'array'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result', '&w_error_code'=>'int', '&w_matched_dn='=>'string', '&w_error_message='=>'string', '&w_referrals='=>'array', '&w_controls='=>'array'], + ], + 'ldap_read' => [ + 'old' => ['resource|false', 'ldap'=>'resource|array', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], + 'new' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], + ], + 'ldap_rename' => [ + 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'?array'], + ], + 'ldap_rename_ext' => [ + 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'array'], + 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'?array'], + ], + 'ldap_sasl_bind' => [ + 'old' => ['bool', 'ldap'=>'resource', 'dn='=>'string', 'password='=>'string', 'mech='=>'string', 'realm='=>'string', 'authc_id='=>'string', 'authz_id='=>'string', 'props='=>'string'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn='=>'string', 'password='=>'string', 'mech='=>'string', 'realm='=>'string', 'authc_id='=>'string', 'authz_id='=>'string', 'props='=>'string'], + ], + 'ldap_search' => [ + 'old' => ['resource|false', 'ldap'=>'resource|resource[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], + 'new' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], + ], + 'ldap_set_option' => [ + 'old' => ['bool', 'ldap'=>'resource|null', 'option'=>'int', 'value'=>'mixed'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection|null', 'option'=>'int', 'value'=>'mixed'], + ], + 'ldap_set_rebind_proc' => [ + 'old' => ['bool', 'ldap'=>'resource', 'callback'=>'?callable'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'callback'=>'?callable'], + ], + 'ldap_start_tls' => [ + 'old' => ['bool', 'ldap'=>'resource'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection'], + ], + 'ldap_unbind' => [ + 'old' => ['bool', 'ldap'=>'resource'], + 'new' => ['bool', 'ldap'=>'LDAP\Connection'], + ], + 'mysqli::connect' => [ + 'old' => ['null|false', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], + 'new' => ['bool', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], + ], + 'mysqli_execute' => [ + 'old' => ['bool', 'statement' => 'mysqli_stmt'], + 'new' => ['bool', 'statement' => 'mysqli_stmt', 'params=' => 'list|null'], + ], + 'mysqli_stmt_execute' => [ + 'old' => ['bool', 'statement' => 'mysqli_stmt'], + 'new' => ['bool', 'statement' => 'mysqli_stmt', 'params=' => 'list|null'], + ], + 'mysqli_stmt::execute' => [ + 'old' => ['bool'], + 'new' => ['bool', 'params=' => 'list|null'], + ], + 'pg_affected_rows' => [ + 'old' => ['int', 'result' => 'resource'], + 'new' => ['int', 'result' => '\PgSql\Result'], + ], + 'pg_cancel_query' => [ + 'old' => ['bool', 'connection' => 'resource'], + 'new' => ['bool', 'connection' => '\PgSql\Connection'], + ], + 'pg_client_encoding' => [ + 'old' => ['string', 'connection=' => 'resource'], + 'new' => ['string', 'connection=' => '\PgSql\Connection'], + ], + 'pg_close' => [ + 'old' => ['bool', 'connection=' => 'resource'], + 'new' => ['bool', 'connection=' => '\PgSql\Connection'], + ], + 'pg_connect' => [ + 'old' => ['resource|false', 'connection_string' => 'string', 'flags=' => 'int'], + 'new' => ['\PgSql\Connection|false', 'connection_string' => 'string', 'flags=' => 'int'], + ], + 'pg_connect_poll' => [ + 'old' => ['int', 'connection' => 'resource'], + 'new' => ['int', 'connection' => '\PgSql\Connection'], + ], + 'pg_connection_busy' => [ + 'old' => ['bool', 'connection' => 'resource'], + 'new' => ['bool', 'connection' => '\PgSql\Connection'], + ], + 'pg_connection_reset' => [ + 'old' => ['bool', 'connection' => 'resource'], + 'new' => ['bool', 'connection' => '\PgSql\Connection'], + ], + 'pg_connection_status' => [ + 'old' => ['int', 'connection' => 'resource'], + 'new' => ['int', 'connection' => '\PgSql\Connection'], + ], + 'pg_consume_input' => [ + 'old' => ['bool', 'connection' => 'resource'], + 'new' => ['bool', 'connection' => '\PgSql\Connection'], + ], + 'pg_convert' => [ + 'old' => ['array|false', 'connection' => 'resource', 'table_name' => 'string', 'values' => 'array', 'flags=' => 'int'], + 'new' => ['array|false', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'values' => 'array', 'flags=' => 'int'], + ], + 'pg_copy_from' => [ + 'old' => ['bool', 'connection' => 'resource', 'table_name' => 'string', 'rows' => 'array', 'separator=' => 'string', 'null_as=' => 'string'], + 'new' => ['bool', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'rows' => 'array', 'separator=' => 'string', 'null_as=' => 'string'], + ], + 'pg_copy_to' => [ + 'old' => ['array|false', 'connection' => 'resource', 'table_name' => 'string', 'separator=' => 'string', 'null_as=' => 'string'], + 'new' => ['array|false', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'separator=' => 'string', 'null_as=' => 'string'], + ], + 'pg_dbname' => [ + 'old' => ['string', 'connection=' => 'resource'], + 'new' => ['string', 'connection=' => '\PgSql\Connection'], + ], + 'pg_delete' => [ + 'old' => ['string|bool', 'connection' => 'resource', 'table_name' => 'string', 'conditions' => 'array', 'flags=' => 'int'], + 'new' => ['string|bool', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'conditions' => 'array', 'flags=' => 'int'], + ], + 'pg_end_copy' => [ + 'old' => ['bool', 'connection=' => 'resource'], + 'new' => ['bool', 'connection=' => '\PgSql\Connection'], + ], + 'pg_escape_bytea' => [ + 'old' => ['string', 'connection' => 'resource', 'string' => 'string'], + 'new' => ['string', 'connection' => '\PgSql\Connection', 'string' => 'string'], + ], + 'pg_escape_identifier' => [ + 'old' => ['string|false', 'connection' => 'resource', 'string' => 'string'], + 'new' => ['string|false', 'connection' => '\PgSql\Connection', 'string' => 'string'], + ], + 'pg_escape_literal' => [ + 'old' => ['string|false', 'connection' => 'resource', 'string' => 'string'], + 'new' => ['string|false', 'connection' => '\PgSql\Connection', 'string' => 'string'], + ], + 'pg_escape_string' => [ + 'old' => ['string', 'connection' => 'resource', 'string' => 'string'], + 'new' => ['string', 'connection' => '\PgSql\Connection', 'string' => 'string'], + ], + 'pg_exec' => [ + 'old' => ['resource|false', 'connection' => 'resource', 'query' => 'string'], + 'new' => ['\PgSql\Result|false', 'connection' => '\PgSql\Connection', 'query' => 'string'], + ], + 'pg_execute' => [ + 'old' => ['resource|false', 'connection' => 'resource', 'statement_name' => 'string', 'params' => 'array'], + 'new' => ['\PgSql\Result|false', 'connection' => '\PgSql\Connection', 'statement_name' => 'string', 'params' => 'array'], + ], + 'pg_execute\'1' => [ + 'old' => ['resource|false', 'connection' => 'string', 'statement_name' => 'array'], + 'new' => ['\PgSql\Result|false', 'connection' => 'string', 'statement_name' => 'array'], + ], + 'pg_fetch_all' => [ + 'old' => ['array', 'result' => 'resource', 'result_type=' => 'int'], + 'new' => ['array', 'result' => '\PgSql\Result', 'result_type=' => 'int'], + ], + 'pg_fetch_all_columns' => [ + 'old' => ['array', 'result' => 'resource', 'field=' => 'int'], + 'new' => ['array', 'result' => '\PgSql\Result', 'field=' => 'int'], + ], + 'pg_fetch_array' => [ + 'old' => ['array|false', 'result' => 'resource', 'row=' => '?int', 'mode=' => 'int'], + 'new' => ['array|false', 'result' => '\PgSql\Result', 'row=' => '?int', 'mode=' => 'int'], + ], + 'pg_fetch_assoc' => [ + 'old' => ['array|false', 'result' => 'resource', 'row=' => '?int'], + 'new' => ['array|false', 'result' => '\PgSql\Result', 'row=' => '?int'], + ], + 'pg_fetch_object' => [ + 'old' => ['object|false', 'result' => 'resource', 'row=' => '?int', 'class=' => 'string', 'constructor_args=' => 'array'], + 'new' => ['object|false', 'result' => '\PgSql\Result', 'row=' => '?int', 'class=' => 'string', 'constructor_args=' => 'array'], + ], + 'pg_fetch_result' => [ + 'old' => ['string|false|null', 'result' => 'resource', 'row' => 'string|int'], + 'new' => ['string|false|null', 'result' => '\PgSql\Result', 'row' => 'string|int'], + ], + 'pg_fetch_result\'1' => [ + 'old' => ['string|false|null', 'result' => 'resource', 'row' => '?int', 'field' => 'string|int'], + 'new' => ['string|false|null', 'result' => '\PgSql\Result', 'row' => '?int', 'field' => 'string|int'], + ], + 'pg_fetch_row' => [ + 'old' => ['array|false', 'result' => 'resource', 'row=' => '?int', 'mode=' => 'int'], + 'new' => ['array|false', 'result' => '\PgSql\Result', 'row=' => '?int', 'mode=' => 'int'], + ], + 'pg_field_is_null' => [ + 'old' => ['int|false', 'result' => 'resource', 'row'=>'string|int'], + 'new' => ['int|false', 'result' => '\PgSql\Result', 'row'=>'string|int'], + ], + 'pg_field_is_null\'1' => [ + 'old' => ['int|false', 'result' => 'resource', 'row' => 'int', 'field' => 'string|int'], + 'new' => ['int|false', 'result' => '\PgSql\Result', 'row' => 'int', 'field' => 'string|int'], + ], + 'pg_field_name' => [ + 'old' => ['string', 'result' => 'resource', 'field' => 'int'], + 'new' => ['string', 'result' => '\PgSql\Result', 'field' => 'int'], + ], + 'pg_field_num' => [ + 'old' => ['int', 'result' => 'resource', 'field' => 'string'], + 'new' => ['int', 'result' => '\PgSql\Result', 'field' => 'string'], + ], + 'pg_field_prtlen' => [ + 'old' => ['int|false', 'result' => 'resource', 'row' => 'string|int'], + 'new' => ['int|false', 'result' => '\PgSql\Result', 'row' => 'string|int'], + ], + 'pg_field_prtlen\'1' => [ + 'old' => ['int|false', 'result' => 'resource', 'row' => 'int', 'field' => 'string|int'], + 'new' => ['int|false', 'result' => '\PgSql\Result', 'row' => 'int', 'field' => 'string|int'], + ], + 'pg_field_size' => [ + 'old' => ['int', 'result' => 'resource', 'field' => 'int'], + 'new' => ['int', 'result' => '\PgSql\Result', 'field' => 'int'], + ], + 'pg_field_table' => [ + 'old' => ['string|int|false', 'result' => 'resource', 'field' => 'int', 'oid_only=' => 'bool'], + 'new' => ['string|int|false', 'result' => '\PgSql\Result', 'field' => 'int', 'oid_only=' => 'bool'], + ], + 'pg_field_type' => [ + 'old' => ['string', 'result' => 'resource', 'field' => 'int'], + 'new' => ['string', 'result' => '\PgSql\Result', 'field' => 'int'], + ], + 'pg_field_type_oid' => [ + 'old' => ['int|string', 'result' => 'resource', 'field' => 'int'], + 'new' => ['int|string', 'result' => '\PgSql\Result', 'field' => 'int'], + ], + 'pg_flush' => [ + 'old' => ['int|bool', 'connection' => 'resource'], + 'new' => ['int|bool', 'connection' => '\PgSql\Connection'], + ], + 'pg_free_result' => [ + 'old' => ['bool', 'result' => 'resource'], + 'new' => ['bool', 'result' => '\PgSql\Result'], + ], + 'pg_get_notify' => [ + 'old' => ['array|false', 'result' => 'resource', 'mode=' => 'int'], + 'new' => ['array|false', 'result' => '\PgSql\Result', 'mode=' => 'int'], + ], + 'pg_get_pid' => [ + 'old' => ['int', 'connection' => 'resource'], + 'new' => ['int', 'connection' => '\PgSql\Connection'], + ], + 'pg_get_result' => [ + 'old' => ['resource|false', 'connection=' => 'resource'], + 'new' => ['\PgSql\Result|false', 'connection=' => '\PgSql\Connection'], + ], + 'pg_host' => [ + 'old' => ['string', 'connection=' => 'resource'], + 'new' => ['string', 'connection=' => '\PgSql\Connection'], + ], + 'pg_insert' => [ + 'old' => ['resource|string|false', 'connection' => 'resource', 'table_name' => 'string', 'values' => 'array', 'flags=' => 'int'], + 'new' => ['\PgSql\Result|string|false', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'values' => 'array', 'flags=' => 'int'], + ], + 'pg_last_error' => [ + 'old' => ['string', 'connection=' => 'resource', 'operation=' => 'int'], + 'new' => ['string', 'connection=' => '\PgSql\Connection', 'operation=' => 'int'], + ], + 'pg_last_notice' => [ + 'old' => ['string|array|bool', 'connection' => 'resource', 'mode=' => 'int'], + 'new' => ['string|array|bool', 'connection' => '\PgSql\Connection', 'mode=' => 'int'], + ], + 'pg_last_oid' => [ + 'old' => ['string|int|false', 'result' => 'resource'], + 'new' => ['string|int|false', 'result' => '\PgSql\Result'], + ], + 'pg_lo_close' => [ + 'old' => ['bool', 'lob' => 'resource'], + 'new' => ['bool', 'lob' => '\PgSql\Lob'], + ], + 'pg_lo_create' => [ + 'old' => ['int|string|false', 'connection=' => 'resource', 'oid=' => 'int|string'], + 'new' => ['int|string|false', 'connection=' => '\PgSql\Connection', 'oid=' => 'int|string'], + ], + 'pg_lo_export' => [ + 'old' => ['bool', 'connection' => 'resource', 'oid' => 'int|string', 'filename' => 'string'], + 'new' => ['bool', 'connection' => '\PgSql\Connection', 'oid' => 'int|string', 'filename' => 'string'], + ], + 'pg_lo_import' => [ + 'old' => ['int|string|false', 'connection' => 'resource', 'filename' => 'string', 'oid' => 'string|int'], + 'new' => ['int|string|false', 'connection' => '\PgSql\Connection', 'filename' => 'string', 'oid' => 'string|int'], + ], + 'pg_lo_open' => [ + 'old' => ['resource|false', 'connection' => 'resource', 'oid' => 'int|string', 'mode' => 'string'], + 'new' => ['\PgSql\Lob|false', 'connection' => '\PgSql\Connection', 'oid' => 'int|string', 'mode' => 'string'], + ], + 'pg_lo_open\'1' => [ + 'old' => ['resource|false', 'connection' => 'int|string', 'oid' => 'string'], + 'new' => ['\PgSql\Lob|false', 'connection' => 'int|string', 'oid' => 'string'], + ], + 'pg_lo_read' => [ + 'old' => ['string|false', 'lob' => 'resource', 'length=' => 'int'], + 'new' => ['string|false', 'lob' => '\PgSql\Lob', 'length=' => 'int'], + ], + 'pg_lo_read_all' => [ + 'old' => ['int', 'lob' => 'resource'], + 'new' => ['int', 'lob' => '\PgSql\Lob'], + ], + 'pg_lo_seek' => [ + 'old' => ['bool', 'lob' => 'resource', 'offset' => 'int', 'whence=' => 'int'], + 'new' => ['bool', 'lob' => '\PgSql\Lob', 'offset' => 'int', 'whence=' => 'int'], + ], + 'pg_lo_tell' => [ + 'old' => ['int', 'lob' => 'resource'], + 'new' => ['int', 'lob' => '\PgSql\Lob'], + ], + 'pg_lo_truncate' => [ + 'old' => ['bool', 'lob' => 'resource', 'size' => 'int'], + 'new' => ['bool', 'lob' => '\PgSql\Lob', 'size' => 'int'], + ], + 'pg_lo_unlink' => [ + 'old' => ['bool', 'connection' => 'resource', 'oid' => 'int|string'], + 'new' => ['bool', 'connection' => '\PgSql\Connection', 'oid' => 'int|string'], + ], + 'pg_lo_write' => [ + 'old' => ['int|false', 'lob' => 'resource', 'data' => 'string', 'length=' => 'int'], + 'new' => ['int|false', 'lob' => '\PgSql\Lob', 'data' => 'string', 'length=' => 'int'], + ], + 'pg_meta_data' => [ + 'old' => ['array|false', 'connection' => 'resource', 'table_name' => 'string', 'extended=' => 'bool'], + 'new' => ['array|false', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'extended=' => 'bool'], + ], + 'pg_num_fields' => [ + 'old' => ['int', 'result' => 'resource'], + 'new' => ['int', 'result' => '\PgSql\Result'], + ], + 'pg_num_rows' => [ + 'old' => ['int', 'result' => 'resource'], + 'new' => ['int', 'result' => '\PgSql\Result'], + ], + 'pg_options' => [ + 'old' => ['string', 'connection=' => 'resource'], + 'new' => ['string', 'connection=' => '\PgSql\Connection'], + ], + 'pg_parameter_status' => [ + 'old' => ['string|false', 'connection' => 'resource', 'name' => 'string'], + 'new' => ['string|false', 'connection' => '\PgSql\Connection', 'name' => 'string'], + ], + 'pg_pconnect' => [ + 'old' => ['resource|false', 'connection_string' => 'string', 'flags=' => 'string', 'port=' => 'string|int', 'options=' => 'string', 'tty=' => 'string', 'database=' => 'string'], + 'new' => ['\PgSql\Connection|false', 'connection_string' => 'string', 'flags=' => 'string', 'port=' => 'string|int', 'options=' => 'string', 'tty=' => 'string', 'database=' => 'string'], + ], + 'pg_ping' => [ + 'old' => ['bool', 'connection=' => 'resource'], + 'new' => ['bool', 'connection=' => '\PgSql\Connection'], + ], + 'pg_port' => [ + 'old' => ['int', 'connection=' => 'resource'], + 'new' => ['int', 'connection=' => '\PgSql\Connection'], + ], + 'pg_prepare' => [ + 'old' => ['resource|false', 'connection' => 'resource', 'statement_name' => 'string', 'query' => 'string'], + 'new' => ['\PgSql\Result|false', 'connection' => '\PgSql\Connection', 'statement_name' => 'string', 'query' => 'string'], + ], + 'pg_prepare\'1' => [ + 'old' => ['resource|false', 'connection' => 'string', 'statement_name' => 'string'], + 'new' => ['\PgSql\Result|false', 'connection' => 'string', 'statement_name' => 'string'], + ], + 'pg_put_line' => [ + 'old' => ['bool', 'connection' => 'resource', 'data' => 'string'], + 'new' => ['bool', 'connection' => '\PgSql\Connection', 'data' => 'string'], + ], + 'pg_query' => [ + 'old' => ['resource|false', 'connection' => 'resource', 'query' => 'string'], + 'new' => ['\PgSql\Result|false', 'connection' => '\PgSql\Connection', 'query' => 'string'], + ], + 'pg_query\'1' => [ + 'old' => ['resource|false', 'connection' => 'string'], + 'new' => ['\PgSql\Result|false', 'connection' => 'string'], + ], + 'pg_query_params' => [ + 'old' => ['resource|false', 'connection' => 'resource', 'query' => 'string', 'params' => 'array'], + 'new' => ['\PgSql\Result|false', 'connection' => '\PgSql\Connection', 'query' => 'string', 'params' => 'array'], + ], + 'pg_query_params\'1' => [ + 'old' => ['resource|false', 'connection' => 'string', 'query' => 'array'], + 'new' => ['\PgSql\Result|false', 'connection' => 'string', 'query' => 'array'], + ], + 'pg_result_error' => [ + 'old' => ['string|false', 'result' => 'resource'], + 'new' => ['string|false', 'result' => '\PgSql\Result'], + ], + 'pg_result_error_field' => [ + 'old' => ['string|false|null', 'result' => 'resource', 'field_code' => 'int'], + 'new' => ['string|false|null', 'result' => '\PgSql\Result', 'field_code' => 'int'], + ], + 'pg_result_seek' => [ + 'old' => ['bool', 'result' => 'resource', 'row' => 'int'], + 'new' => ['bool', 'result' => '\PgSql\Result', 'row' => 'int'], + ], + 'pg_result_status' => [ + 'old' => ['string|int', 'result' => 'resource', 'mode=' => 'int'], + 'new' => ['string|int', 'result' => '\PgSql\Result', 'mode=' => 'int'], + ], + 'pg_select' => [ + 'old' => ['string|array|false', 'connection' => 'resource', 'table_name' => 'string', 'assoc_array' => 'array', 'options=' => 'int', 'result_type=' => 'int'], + 'new' => ['string|array|false', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'assoc_array' => 'array', 'options=' => 'int', 'result_type=' => 'int'], + ], + 'pg_send_execute' => [ + 'old' => ['bool|int', 'connection' => 'resource', 'query' => 'string', 'params' => 'array'], + 'new' => ['bool|int', 'connection' => '\PgSql\Connection', 'query' => 'string', 'params' => 'array'], + ], + 'pg_send_prepare' => [ + 'old' => ['bool|int', 'connection' => 'resource', 'statement_name' => 'string', 'query' => 'string'], + 'new' => ['bool|int', 'connection' => '\PgSql\Connection', 'statement_name' => 'string', 'query' => 'string'], + ], + 'pg_send_query' => [ + 'old' => ['bool|int', 'connection' => 'resource', 'query' => 'string'], + 'new' => ['bool|int', 'connection' => '\PgSql\Connection', 'query' => 'string'], + ], + 'pg_send_query_params' => [ + 'old' => ['bool|int', 'connection' => 'resource', 'query' => 'string', 'params' => 'array'], + 'new' => ['bool|int', 'connection' => '\PgSql\Connection', 'query' => 'string', 'params' => 'array'], + ], + 'pg_set_client_encoding' => [ + 'old' => ['int', 'connection' => 'resource', 'encoding' => 'string'], + 'new' => ['int', 'connection' => '\PgSql\Connection', 'encoding' => 'string'], + ], + 'pg_set_error_verbosity' => [ + 'old' => ['int|false', 'connection' => 'resource', 'verbosity' => 'int'], + 'new' => ['int|false', 'connection' => '\PgSql\Connection', 'verbosity' => 'int'], + ], + 'pg_socket' => [ + 'old' => ['resource|false', 'connection' => 'resource'], + 'new' => ['resource|false', 'connection' => '\PgSql\Connection'], + ], + 'pg_trace' => [ + 'old' => ['bool', 'filename' => 'string', 'mode=' => 'string', 'connection=' => 'resource'], + 'new' => ['bool', 'filename' => 'string', 'mode=' => 'string', 'connection=' => '\PgSql\Connection'], + ], + 'pg_transaction_status' => [ + 'old' => ['int', 'connection' => 'resource'], + 'new' => ['int', 'connection' => '\PgSql\Connection'], + ], + 'pg_tty' => [ + 'old' => ['string', 'connection=' => 'resource'], + 'new' => ['string', 'connection=' => '\PgSql\Connection'], + ], + 'pg_untrace' => [ + 'old' => ['bool', 'connection=' => 'resource'], + 'new' => ['bool', 'connection=' => '\PgSql\Connection'], + ], + 'pg_update' => [ + 'old' => ['string|bool', 'connection' => 'resource', 'table_name' => 'string', 'values' => 'array', 'conditions' => 'array', 'flags=' => 'int'], + 'new' => ['string|bool', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'values' => 'array', 'conditions' => 'array', 'flags=' => 'int'], + ], + 'pg_version' => [ + 'old' => ['array', 'connection=' => 'resource'], + 'new' => ['array', 'connection=' => '\PgSql\Connection'], + ], + 'pspell_add_to_personal' => [ + 'old' => ['bool', 'dictionary'=>'int', 'word'=>'string'], + 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], + ], + 'pspell_add_to_session' => [ + 'old' => ['bool', 'dictionary'=>'int', 'word'=>'string'], + 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], + ], + 'pspell_check' => [ + 'old' => ['bool', 'dictionary'=>'int', 'word'=>'string'], + 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], + ], + 'pspell_clear_session' => [ + 'old' => ['bool', 'dictionary'=>'int'], + 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary'], + ], + 'pspell_config_data_dir' => [ + 'old' => ['bool', 'config'=>'int', 'directory'=>'string'], + 'new' => ['bool', 'config'=>'PSpell\Config', 'directory'=>'string'], + ], + 'pspell_config_dict_dir' => [ + 'old' => ['bool', 'config'=>'int', 'directory'=>'string'], + 'new' => ['bool', 'config'=>'PSpell\Config', 'directory'=>'string'], + ], + 'pspell_config_ignore' => [ + 'old' => ['bool', 'config'=>'int', 'min_length'=>'int'], + 'new' => ['bool', 'config'=>'PSpell\Config', 'min_length'=>'int'], + ], + 'pspell_config_mode' => [ + 'old' => ['bool', 'config'=>'int', 'mode'=>'int'], + 'new' => ['bool', 'config'=>'PSpell\Config', 'mode'=>'int'], + ], + 'pspell_config_personal' => [ + 'old' => ['bool', 'config'=>'int', 'filename'=>'string'], + 'new' => ['bool', 'config'=>'PSpell\Config', 'filename'=>'string'], + ], + 'pspell_config_repl' => [ + 'old' => ['bool', 'config'=>'int', 'filename'=>'string'], + 'new' => ['bool', 'config'=>'PSpell\Config', 'filename'=>'string'], + ], + 'pspell_config_runtogether' => [ + 'old' => ['bool', 'config'=>'int', 'allow'=>'bool'], + 'new' => ['bool', 'config'=>'PSpell\Config', 'allow'=>'bool'], + ], + 'pspell_config_save_repl' => [ + 'old' => ['bool', 'config'=>'int', 'save'=>'bool'], + 'new' => ['bool', 'config'=>'PSpell\Config', 'save'=>'bool'], + ], + 'pspell_new_config' => [ + 'old' => ['int|false', 'config'=>'int'], + 'new' => ['int|false', 'config'=>'PSpell\Config'], + ], + 'pspell_save_wordlist' => [ + 'old' => ['bool', 'dictionary'=>'int'], + 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary'], + ], + 'pspell_store_replacement' => [ + 'old' => ['bool', 'dictionary'=>'int', 'misspelled'=>'string', 'correct'=>'string'], + 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'misspelled'=>'string', 'correct'=>'string'], + ], + 'pspell_suggest' => [ + 'old' => ['array', 'dictionary'=>'int', 'word'=>'string'], + 'new' => ['array', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], + ], + ], + + 'removed' => [ + 'ReflectionMethod::isStatic' => ['bool'], + ], +]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_historical.php b/vendor/vimeo/psalm/dictionaries/CallMap_historical.php new file mode 100644 index 00000000..a5c4875a --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/CallMap_historical.php @@ -0,0 +1,16618 @@ + ['void', 'content_type='=>'string', 'content_encoding='=>'string', 'headers='=>'array', 'delivery_mode='=>'int', 'priority='=>'int', 'correlation_id='=>'string', 'reply_to='=>'string', 'expiration='=>'string', 'message_id='=>'string', 'timestamp='=>'int', 'type='=>'string', 'user_id='=>'string', 'app_id='=>'string', 'cluster_id='=>'string'], + 'AMQPBasicProperties::getAppId' => ['string'], + 'AMQPBasicProperties::getClusterId' => ['string'], + 'AMQPBasicProperties::getContentEncoding' => ['string'], + 'AMQPBasicProperties::getContentType' => ['string'], + 'AMQPBasicProperties::getCorrelationId' => ['string'], + 'AMQPBasicProperties::getDeliveryMode' => ['int'], + 'AMQPBasicProperties::getExpiration' => ['string'], + 'AMQPBasicProperties::getHeaders' => ['array'], + 'AMQPBasicProperties::getMessageId' => ['string'], + 'AMQPBasicProperties::getPriority' => ['int'], + 'AMQPBasicProperties::getReplyTo' => ['string'], + 'AMQPBasicProperties::getTimestamp' => ['string'], + 'AMQPBasicProperties::getType' => ['string'], + 'AMQPBasicProperties::getUserId' => ['string'], + 'AMQPChannel::__construct' => ['void', 'amqp_connection'=>'AMQPConnection'], + 'AMQPChannel::basicRecover' => ['', 'requeue='=>'bool'], + 'AMQPChannel::close' => [''], + 'AMQPChannel::commitTransaction' => ['bool'], + 'AMQPChannel::confirmSelect' => [''], + 'AMQPChannel::getChannelId' => ['int'], + 'AMQPChannel::getConnection' => ['AMQPConnection'], + 'AMQPChannel::getConsumers' => ['AMQPQueue[]'], + 'AMQPChannel::getPrefetchCount' => ['int'], + 'AMQPChannel::getPrefetchSize' => ['int'], + 'AMQPChannel::isConnected' => ['bool'], + 'AMQPChannel::qos' => ['bool', 'size'=>'int', 'count'=>'int'], + 'AMQPChannel::rollbackTransaction' => ['bool'], + 'AMQPChannel::setConfirmCallback' => ['', 'ack_callback='=>'?callable', 'nack_callback='=>'?callable'], + 'AMQPChannel::setPrefetchCount' => ['bool', 'count'=>'int'], + 'AMQPChannel::setPrefetchSize' => ['bool', 'size'=>'int'], + 'AMQPChannel::setReturnCallback' => ['', 'return_callback='=>'?callable'], + 'AMQPChannel::startTransaction' => ['bool'], + 'AMQPChannel::waitForBasicReturn' => ['', 'timeout='=>'float'], + 'AMQPChannel::waitForConfirm' => ['', 'timeout='=>'float'], + 'AMQPConnection::__construct' => ['void', 'credentials='=>'array'], + 'AMQPConnection::connect' => ['bool'], + 'AMQPConnection::disconnect' => ['bool'], + 'AMQPConnection::getCACert' => ['string'], + 'AMQPConnection::getCert' => ['string'], + 'AMQPConnection::getHeartbeatInterval' => ['int'], + 'AMQPConnection::getHost' => ['string'], + 'AMQPConnection::getKey' => ['string'], + 'AMQPConnection::getLogin' => ['string'], + 'AMQPConnection::getMaxChannels' => ['?int'], + 'AMQPConnection::getMaxFrameSize' => ['int'], + 'AMQPConnection::getPassword' => ['string'], + 'AMQPConnection::getPort' => ['int'], + 'AMQPConnection::getReadTimeout' => ['float'], + 'AMQPConnection::getTimeout' => ['float'], + 'AMQPConnection::getUsedChannels' => ['int'], + 'AMQPConnection::getVerify' => ['bool'], + 'AMQPConnection::getVhost' => ['string'], + 'AMQPConnection::getWriteTimeout' => ['float'], + 'AMQPConnection::isConnected' => ['bool'], + 'AMQPConnection::isPersistent' => ['?bool'], + 'AMQPConnection::pconnect' => ['bool'], + 'AMQPConnection::pdisconnect' => ['bool'], + 'AMQPConnection::preconnect' => ['bool'], + 'AMQPConnection::reconnect' => ['bool'], + 'AMQPConnection::setCACert' => ['', 'cacert'=>'string'], + 'AMQPConnection::setCert' => ['', 'cert'=>'string'], + 'AMQPConnection::setHost' => ['bool', 'host'=>'string'], + 'AMQPConnection::setKey' => ['', 'key'=>'string'], + 'AMQPConnection::setLogin' => ['bool', 'login'=>'string'], + 'AMQPConnection::setPassword' => ['bool', 'password'=>'string'], + 'AMQPConnection::setPort' => ['bool', 'port'=>'int'], + 'AMQPConnection::setReadTimeout' => ['bool', 'timeout'=>'int'], + 'AMQPConnection::setTimeout' => ['bool', 'timeout'=>'int'], + 'AMQPConnection::setVerify' => ['', 'verify'=>'bool'], + 'AMQPConnection::setVhost' => ['bool', 'vhost'=>'string'], + 'AMQPConnection::setWriteTimeout' => ['bool', 'timeout'=>'int'], + 'AMQPDecimal::__construct' => ['void', 'exponent'=>'', 'significand'=>''], + 'AMQPDecimal::getExponent' => ['int'], + 'AMQPDecimal::getSignificand' => ['int'], + 'AMQPEnvelope::__construct' => ['void'], + 'AMQPEnvelope::getAppId' => ['string'], + 'AMQPEnvelope::getBody' => ['string'], + 'AMQPEnvelope::getClusterId' => ['string'], + 'AMQPEnvelope::getConsumerTag' => ['string'], + 'AMQPEnvelope::getContentEncoding' => ['string'], + 'AMQPEnvelope::getContentType' => ['string'], + 'AMQPEnvelope::getCorrelationId' => ['string'], + 'AMQPEnvelope::getDeliveryMode' => ['int'], + 'AMQPEnvelope::getDeliveryTag' => ['string'], + 'AMQPEnvelope::getExchangeName' => ['string'], + 'AMQPEnvelope::getExpiration' => ['string'], + 'AMQPEnvelope::getHeader' => ['string|false', 'header_key'=>'string'], + 'AMQPEnvelope::getHeaders' => ['array'], + 'AMQPEnvelope::getMessageId' => ['string'], + 'AMQPEnvelope::getPriority' => ['int'], + 'AMQPEnvelope::getReplyTo' => ['string'], + 'AMQPEnvelope::getRoutingKey' => ['string'], + 'AMQPEnvelope::getTimeStamp' => ['string'], + 'AMQPEnvelope::getType' => ['string'], + 'AMQPEnvelope::getUserId' => ['string'], + 'AMQPEnvelope::hasHeader' => ['bool', 'header_key'=>'string'], + 'AMQPEnvelope::isRedelivery' => ['bool'], + 'AMQPExchange::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'], + 'AMQPExchange::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], + 'AMQPExchange::declareExchange' => ['bool'], + 'AMQPExchange::delete' => ['bool', 'exchangeName='=>'string', 'flags='=>'int'], + 'AMQPExchange::getArgument' => ['int|string|false', 'key'=>'string'], + 'AMQPExchange::getArguments' => ['array'], + 'AMQPExchange::getChannel' => ['AMQPChannel'], + 'AMQPExchange::getConnection' => ['AMQPConnection'], + 'AMQPExchange::getFlags' => ['int'], + 'AMQPExchange::getName' => ['string'], + 'AMQPExchange::getType' => ['string'], + 'AMQPExchange::hasArgument' => ['bool', 'key'=>'string'], + 'AMQPExchange::publish' => ['bool', 'message'=>'string', 'routing_key='=>'string', 'flags='=>'int', 'attributes='=>'array'], + 'AMQPExchange::setArgument' => ['bool', 'key'=>'string', 'value'=>'int|string'], + 'AMQPExchange::setArguments' => ['bool', 'arguments'=>'array'], + 'AMQPExchange::setFlags' => ['bool', 'flags'=>'int'], + 'AMQPExchange::setName' => ['bool', 'exchange_name'=>'string'], + 'AMQPExchange::setType' => ['bool', 'exchange_type'=>'string'], + 'AMQPExchange::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], + 'AMQPQueue::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'], + 'AMQPQueue::ack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], + 'AMQPQueue::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], + 'AMQPQueue::cancel' => ['bool', 'consumer_tag='=>'string'], + 'AMQPQueue::consume' => ['void', 'callback='=>'?callable', 'flags='=>'int', 'consumerTag='=>'string'], + 'AMQPQueue::declareQueue' => ['int'], + 'AMQPQueue::delete' => ['int', 'flags='=>'int'], + 'AMQPQueue::get' => ['AMQPEnvelope|false', 'flags='=>'int'], + 'AMQPQueue::getArgument' => ['int|string|false', 'key'=>'string'], + 'AMQPQueue::getArguments' => ['array'], + 'AMQPQueue::getChannel' => ['AMQPChannel'], + 'AMQPQueue::getConnection' => ['AMQPConnection'], + 'AMQPQueue::getConsumerTag' => ['?string'], + 'AMQPQueue::getFlags' => ['int'], + 'AMQPQueue::getName' => ['string'], + 'AMQPQueue::hasArgument' => ['bool', 'key'=>'string'], + 'AMQPQueue::nack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], + 'AMQPQueue::purge' => ['bool'], + 'AMQPQueue::reject' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], + 'AMQPQueue::setArgument' => ['bool', 'key'=>'string', 'value'=>'mixed'], + 'AMQPQueue::setArguments' => ['bool', 'arguments'=>'array'], + 'AMQPQueue::setFlags' => ['bool', 'flags'=>'int'], + 'AMQPQueue::setName' => ['bool', 'queue_name'=>'string'], + 'AMQPQueue::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], + 'AMQPTimestamp::__construct' => ['void', 'timestamp'=>'string'], + 'AMQPTimestamp::__toString' => ['string'], + 'AMQPTimestamp::getTimestamp' => ['string'], + 'APCIterator::__construct' => ['void', 'cache'=>'string', 'search='=>'null|string|string[]', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'], + 'APCIterator::current' => ['mixed|false'], + 'APCIterator::getTotalCount' => ['int|false'], + 'APCIterator::getTotalHits' => ['int|false'], + 'APCIterator::getTotalSize' => ['int|false'], + 'APCIterator::key' => ['string'], + 'APCIterator::next' => ['void'], + 'APCIterator::rewind' => ['void'], + 'APCIterator::valid' => ['bool'], + 'APCuIterator::__construct' => ['void', 'search='=>'string|string[]|null', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'], + 'APCuIterator::current' => ['mixed'], + 'APCuIterator::getTotalCount' => ['int'], + 'APCuIterator::getTotalHits' => ['int'], + 'APCuIterator::getTotalSize' => ['int'], + 'APCuIterator::key' => ['string'], + 'APCuIterator::next' => ['void'], + 'APCuIterator::rewind' => ['void'], + 'APCuIterator::valid' => ['bool'], + 'AppendIterator::__construct' => ['void'], + 'AppendIterator::append' => ['void', 'iterator'=>'Iterator'], + 'AppendIterator::current' => ['mixed'], + 'AppendIterator::getArrayIterator' => ['ArrayIterator'], + 'AppendIterator::getInnerIterator' => ['Iterator'], + 'AppendIterator::getIteratorIndex' => ['int'], + 'AppendIterator::key' => ['int|string|float|bool'], + 'AppendIterator::next' => ['void'], + 'AppendIterator::rewind' => ['void'], + 'AppendIterator::valid' => ['bool'], + 'ArgumentCountError::__clone' => ['void'], + 'ArgumentCountError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], + 'ArgumentCountError::__toString' => ['string'], + 'ArgumentCountError::__wakeup' => ['void'], + 'ArgumentCountError::getCode' => ['int'], + 'ArgumentCountError::getFile' => ['string'], + 'ArgumentCountError::getLine' => ['int'], + 'ArgumentCountError::getMessage' => ['string'], + 'ArgumentCountError::getPrevious' => ['?Throwable'], + 'ArgumentCountError::getTrace' => ['list\',args?:array}>'], + 'ArgumentCountError::getTraceAsString' => ['string'], + 'ArithmeticError::__clone' => ['void'], + 'ArithmeticError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], + 'ArithmeticError::__toString' => ['string'], + 'ArithmeticError::__wakeup' => ['void'], + 'ArithmeticError::getCode' => ['int'], + 'ArithmeticError::getFile' => ['string'], + 'ArithmeticError::getLine' => ['int'], + 'ArithmeticError::getMessage' => ['string'], + 'ArithmeticError::getPrevious' => ['?Throwable'], + 'ArithmeticError::getTrace' => ['list\',args?:array}>'], + 'ArithmeticError::getTraceAsString' => ['string'], + 'ArrayAccess::offsetExists' => ['bool', 'offset'=>'mixed'], + 'ArrayAccess::offsetGet' => ['mixed', 'offset'=>'mixed'], + 'ArrayAccess::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], + 'ArrayAccess::offsetUnset' => ['void', 'offset'=>'mixed'], + 'ArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'], + 'ArrayIterator::append' => ['void', 'value'=>'mixed'], + 'ArrayIterator::asort' => ['void'], + 'ArrayIterator::count' => ['int'], + 'ArrayIterator::current' => ['mixed'], + 'ArrayIterator::getArrayCopy' => ['array'], + 'ArrayIterator::getFlags' => ['int'], + 'ArrayIterator::key' => ['int|string|false'], + 'ArrayIterator::ksort' => ['void'], + 'ArrayIterator::natcasesort' => ['void'], + 'ArrayIterator::natsort' => ['void'], + '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::rewind' => ['void'], + 'ArrayIterator::seek' => ['void', 'position'=>'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::valid' => ['bool'], + 'ArrayObject::__construct' => ['void', 'input='=>'array|object', 'flags='=>'int', 'iterator_class='=>'string'], + 'ArrayObject::append' => ['void', 'value'=>'mixed'], + 'ArrayObject::asort' => ['void'], + 'ArrayObject::count' => ['int'], + 'ArrayObject::exchangeArray' => ['array', 'ar'=>'mixed'], + 'ArrayObject::getArrayCopy' => ['array'], + 'ArrayObject::getFlags' => ['int'], + 'ArrayObject::getIterator' => ['ArrayIterator'], + 'ArrayObject::getIteratorClass' => ['string'], + 'ArrayObject::ksort' => ['void'], + 'ArrayObject::natcasesort' => ['void'], + 'ArrayObject::natsort' => ['void'], + '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::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'], + 'BadFunctionCallException::__clone' => ['void'], + 'BadFunctionCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?BadFunctionCallException'], + 'BadFunctionCallException::__toString' => ['string'], + 'BadFunctionCallException::getCode' => ['int'], + 'BadFunctionCallException::getFile' => ['string'], + 'BadFunctionCallException::getLine' => ['int'], + 'BadFunctionCallException::getMessage' => ['string'], + 'BadFunctionCallException::getPrevious' => ['?Throwable|?BadFunctionCallException'], + 'BadFunctionCallException::getTrace' => ['list\',args?:array}>'], + 'BadFunctionCallException::getTraceAsString' => ['string'], + 'BadMethodCallException::__clone' => ['void'], + 'BadMethodCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?BadMethodCallException'], + 'BadMethodCallException::__toString' => ['string'], + 'BadMethodCallException::getCode' => ['int'], + 'BadMethodCallException::getFile' => ['string'], + 'BadMethodCallException::getLine' => ['int'], + 'BadMethodCallException::getMessage' => ['string'], + 'BadMethodCallException::getPrevious' => ['?Throwable|?BadMethodCallException'], + 'BadMethodCallException::getTrace' => ['list\',args?:array}>'], + 'BadMethodCallException::getTraceAsString' => ['string'], + 'COM::__call' => ['', 'name'=>'', 'args'=>''], + 'COM::__construct' => ['void', 'module_name'=>'string', 'server_name='=>'mixed', 'codepage='=>'int', 'typelib='=>'string'], + 'COM::__get' => ['', 'name'=>''], + 'COM::__set' => ['void', 'name'=>'', 'value'=>''], + 'COMPersistHelper::GetCurFile' => ['string'], + 'COMPersistHelper::GetCurFileName' => ['string'], + 'COMPersistHelper::GetMaxStreamSize' => ['int'], + 'COMPersistHelper::InitNew' => ['int'], + 'COMPersistHelper::LoadFromFile' => ['bool', 'filename'=>'string', 'flags'=>'int'], + 'COMPersistHelper::LoadFromStream' => ['', 'stream'=>''], + '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::__wakeup' => ['void'], + 'CURLFile::getFilename' => ['string'], + 'CURLFile::getMimeType' => ['string'], + 'CURLFile::getPostFilename' => ['string'], + 'CURLFile::setMimeType' => ['void', 'mime'=>'string'], + 'CURLFile::setPostFilename' => ['void', 'name'=>'string'], + 'CachingIterator::__construct' => ['void', 'iterator'=>'Iterator', 'flags='=>''], + 'CachingIterator::__toString' => ['string'], + 'CachingIterator::count' => ['int'], + 'CachingIterator::current' => ['mixed'], + 'CachingIterator::getCache' => ['array'], + 'CachingIterator::getFlags' => ['int'], + 'CachingIterator::getInnerIterator' => ['Iterator'], + '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::rewind' => ['void'], + 'CachingIterator::setFlags' => ['void', 'flags'=>'int'], + 'CachingIterator::valid' => ['bool'], + 'Cairo::availableFonts' => ['array'], + 'Cairo::availableSurfaces' => ['array'], + 'Cairo::statusToString' => ['string', 'status'=>'int'], + 'Cairo::version' => ['int'], + 'Cairo::versionString' => ['string'], + 'CairoContext::__construct' => ['void', 'surface'=>'CairoSurface'], + 'CairoContext::appendPath' => ['', 'path'=>'cairopath', 'context'=>'cairocontext'], + 'CairoContext::arc' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], + 'CairoContext::arcNegative' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], + 'CairoContext::clip' => ['', 'context'=>'cairocontext'], + 'CairoContext::clipExtents' => ['array', 'context'=>'cairocontext'], + 'CairoContext::clipPreserve' => ['', 'context'=>'cairocontext'], + 'CairoContext::clipRectangleList' => ['array', 'context'=>'cairocontext'], + 'CairoContext::closePath' => ['', 'context'=>'cairocontext'], + 'CairoContext::copyPage' => ['', 'context'=>'cairocontext'], + 'CairoContext::copyPath' => ['CairoPath', 'context'=>'cairocontext'], + 'CairoContext::copyPathFlat' => ['CairoPath', 'context'=>'cairocontext'], + 'CairoContext::curveTo' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float', 'context'=>'cairocontext'], + 'CairoContext::deviceToUser' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], + 'CairoContext::deviceToUserDistance' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], + 'CairoContext::fill' => ['', 'context'=>'cairocontext'], + 'CairoContext::fillExtents' => ['array', 'context'=>'cairocontext'], + 'CairoContext::fillPreserve' => ['', 'context'=>'cairocontext'], + 'CairoContext::fontExtents' => ['array', 'context'=>'cairocontext'], + 'CairoContext::getAntialias' => ['int', 'context'=>'cairocontext'], + 'CairoContext::getCurrentPoint' => ['array', 'context'=>'cairocontext'], + 'CairoContext::getDash' => ['array', 'context'=>'cairocontext'], + 'CairoContext::getDashCount' => ['int', 'context'=>'cairocontext'], + 'CairoContext::getFillRule' => ['int', 'context'=>'cairocontext'], + 'CairoContext::getFontFace' => ['', 'context'=>'cairocontext'], + 'CairoContext::getFontMatrix' => ['', 'context'=>'cairocontext'], + 'CairoContext::getFontOptions' => ['', 'context'=>'cairocontext'], + 'CairoContext::getGroupTarget' => ['', 'context'=>'cairocontext'], + 'CairoContext::getLineCap' => ['int', 'context'=>'cairocontext'], + 'CairoContext::getLineJoin' => ['int', 'context'=>'cairocontext'], + 'CairoContext::getLineWidth' => ['float', 'context'=>'cairocontext'], + 'CairoContext::getMatrix' => ['', 'context'=>'cairocontext'], + 'CairoContext::getMiterLimit' => ['float', 'context'=>'cairocontext'], + 'CairoContext::getOperator' => ['int', 'context'=>'cairocontext'], + 'CairoContext::getScaledFont' => ['', 'context'=>'cairocontext'], + 'CairoContext::getSource' => ['', 'context'=>'cairocontext'], + 'CairoContext::getTarget' => ['', 'context'=>'cairocontext'], + 'CairoContext::getTolerance' => ['float', 'context'=>'cairocontext'], + 'CairoContext::glyphPath' => ['', 'glyphs'=>'array', 'context'=>'cairocontext'], + 'CairoContext::hasCurrentPoint' => ['bool', 'context'=>'cairocontext'], + 'CairoContext::identityMatrix' => ['', 'context'=>'cairocontext'], + 'CairoContext::inFill' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'CairoContext::inStroke' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'CairoContext::lineTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'CairoContext::mask' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], + 'CairoContext::maskSurface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], + 'CairoContext::moveTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'CairoContext::newPath' => ['', 'context'=>'cairocontext'], + 'CairoContext::newSubPath' => ['', 'context'=>'cairocontext'], + 'CairoContext::paint' => ['', 'context'=>'cairocontext'], + 'CairoContext::paintWithAlpha' => ['', 'alpha'=>'string', 'context'=>'cairocontext'], + 'CairoContext::pathExtents' => ['array', 'context'=>'cairocontext'], + 'CairoContext::popGroup' => ['', 'context'=>'cairocontext'], + 'CairoContext::popGroupToSource' => ['', 'context'=>'cairocontext'], + 'CairoContext::pushGroup' => ['', 'context'=>'cairocontext'], + 'CairoContext::pushGroupWithContent' => ['', 'content'=>'string', 'context'=>'cairocontext'], + 'CairoContext::rectangle' => ['', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string', 'context'=>'cairocontext'], + 'CairoContext::relCurveTo' => ['', 'x1'=>'string', 'y1'=>'string', 'x2'=>'string', 'y2'=>'string', 'x3'=>'string', 'y3'=>'string', 'context'=>'cairocontext'], + 'CairoContext::relLineTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'CairoContext::relMoveTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'CairoContext::resetClip' => ['', 'context'=>'cairocontext'], + 'CairoContext::restore' => ['', 'context'=>'cairocontext'], + 'CairoContext::rotate' => ['', 'angle'=>'string', 'context'=>'cairocontext'], + 'CairoContext::save' => ['', 'context'=>'cairocontext'], + 'CairoContext::scale' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'CairoContext::selectFontFace' => ['', 'family'=>'string', 'slant='=>'string', 'weight='=>'string', 'context='=>'cairocontext'], + 'CairoContext::setAntialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], + 'CairoContext::setDash' => ['', 'dashes'=>'array', 'offset='=>'string', 'context='=>'cairocontext'], + 'CairoContext::setFillRule' => ['', 'setting'=>'string', 'context'=>'cairocontext'], + 'CairoContext::setFontFace' => ['', 'fontface'=>'cairofontface', 'context'=>'cairocontext'], + 'CairoContext::setFontMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], + 'CairoContext::setFontOptions' => ['', 'fontoptions'=>'cairofontoptions', 'context'=>'cairocontext'], + 'CairoContext::setFontSize' => ['', 'size'=>'string', 'context'=>'cairocontext'], + 'CairoContext::setLineCap' => ['', 'setting'=>'string', 'context'=>'cairocontext'], + 'CairoContext::setLineJoin' => ['', 'setting'=>'string', 'context'=>'cairocontext'], + 'CairoContext::setLineWidth' => ['', 'width'=>'string', 'context'=>'cairocontext'], + 'CairoContext::setMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], + 'CairoContext::setMiterLimit' => ['', 'limit'=>'string', 'context'=>'cairocontext'], + 'CairoContext::setOperator' => ['', 'setting'=>'string', 'context'=>'cairocontext'], + 'CairoContext::setScaledFont' => ['', 'scaledfont'=>'cairoscaledfont', 'context'=>'cairocontext'], + 'CairoContext::setSource' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], + 'CairoContext::setSourceRGB' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], + 'CairoContext::setSourceRGBA' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], + 'CairoContext::setSourceSurface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], + 'CairoContext::setTolerance' => ['', 'tolerance'=>'string', 'context'=>'cairocontext'], + 'CairoContext::showPage' => ['', 'context'=>'cairocontext'], + 'CairoContext::showText' => ['', 'text'=>'string', 'context'=>'cairocontext'], + 'CairoContext::status' => ['int', 'context'=>'cairocontext'], + 'CairoContext::stroke' => ['', 'context'=>'cairocontext'], + 'CairoContext::strokeExtents' => ['array', 'context'=>'cairocontext'], + 'CairoContext::strokePreserve' => ['', 'context'=>'cairocontext'], + 'CairoContext::textExtents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], + 'CairoContext::textPath' => ['', 'string'=>'string', 'context'=>'cairocontext', 'text'=>'string'], + 'CairoContext::transform' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], + 'CairoContext::translate' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'CairoContext::userToDevice' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'CairoContext::userToDeviceDistance' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'CairoFontFace::__construct' => ['void'], + 'CairoFontFace::getType' => ['int'], + 'CairoFontFace::status' => ['int', 'fontface'=>'cairofontface'], + 'CairoFontOptions::__construct' => ['void'], + 'CairoFontOptions::equal' => ['bool', 'other'=>'string'], + 'CairoFontOptions::getAntialias' => ['int', 'context'=>'cairocontext'], + 'CairoFontOptions::getHintMetrics' => ['int'], + 'CairoFontOptions::getHintStyle' => ['int'], + 'CairoFontOptions::getSubpixelOrder' => ['int'], + 'CairoFontOptions::hash' => ['int'], + 'CairoFontOptions::merge' => ['void', 'other'=>'string'], + 'CairoFontOptions::setAntialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], + 'CairoFontOptions::setHintMetrics' => ['void', 'hint_metrics'=>'string'], + 'CairoFontOptions::setHintStyle' => ['void', 'hint_style'=>'string'], + 'CairoFontOptions::setSubpixelOrder' => ['void', 'subpixel_order'=>'string'], + 'CairoFontOptions::status' => ['int', 'context'=>'cairocontext'], + 'CairoFormat::strideForWidth' => ['int', 'format'=>'int', 'width'=>'int'], + 'CairoGradientPattern::addColorStopRgb' => ['void', 'offset'=>'string', 'red'=>'string', 'green'=>'string', 'blue'=>'string'], + 'CairoGradientPattern::addColorStopRgba' => ['void', 'offset'=>'string', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string'], + 'CairoGradientPattern::getColorStopCount' => ['int'], + 'CairoGradientPattern::getColorStopRgba' => ['array', 'index'=>'string'], + 'CairoGradientPattern::getExtend' => ['int'], + 'CairoGradientPattern::setExtend' => ['void', 'extend'=>'int'], + 'CairoImageSurface::__construct' => ['void', 'format'=>'int', 'width'=>'int', 'height'=>'int'], + 'CairoImageSurface::createForData' => ['void', 'data'=>'string', 'format'=>'int', 'width'=>'int', 'height'=>'int', 'stride='=>'int'], + 'CairoImageSurface::createFromPng' => ['CairoImageSurface', 'file'=>'string'], + 'CairoImageSurface::getData' => ['string'], + 'CairoImageSurface::getFormat' => ['int'], + 'CairoImageSurface::getHeight' => ['int'], + 'CairoImageSurface::getStride' => ['int'], + 'CairoImageSurface::getWidth' => ['int'], + 'CairoLinearGradient::__construct' => ['void', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float'], + 'CairoLinearGradient::getPoints' => ['array'], + 'CairoMatrix::__construct' => ['void', 'xx='=>'float', 'yx='=>'float', 'xy='=>'float', 'yy='=>'float', 'x0='=>'float', 'y0='=>'float'], + 'CairoMatrix::initIdentity' => ['object'], + 'CairoMatrix::initRotate' => ['object', 'radians'=>'float'], + 'CairoMatrix::initScale' => ['object', 'sx'=>'float', 'sy'=>'float'], + 'CairoMatrix::initTranslate' => ['object', 'tx'=>'float', 'ty'=>'float'], + 'CairoMatrix::invert' => ['void'], + 'CairoMatrix::multiply' => ['CairoMatrix', 'matrix1'=>'cairomatrix', 'matrix2'=>'cairomatrix'], + 'CairoMatrix::rotate' => ['', 'sx'=>'string', 'sy'=>'string', 'context'=>'cairocontext', 'angle'=>'string'], + 'CairoMatrix::scale' => ['', 'sx'=>'float', 'sy'=>'float', 'context'=>'cairocontext'], + 'CairoMatrix::transformDistance' => ['array', 'dx'=>'string', 'dy'=>'string'], + 'CairoMatrix::transformPoint' => ['array', 'dx'=>'string', 'dy'=>'string'], + 'CairoMatrix::translate' => ['', 'tx'=>'string', 'ty'=>'string', 'context'=>'cairocontext', 'x'=>'string', 'y'=>'string'], + 'CairoPattern::__construct' => ['void'], + 'CairoPattern::getMatrix' => ['', 'context'=>'cairocontext'], + 'CairoPattern::getType' => ['int'], + 'CairoPattern::setMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], + 'CairoPattern::status' => ['int', 'context'=>'cairocontext'], + 'CairoPdfSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], + 'CairoPdfSurface::setSize' => ['void', 'width'=>'string', 'height'=>'string'], + 'CairoPsSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], + 'CairoPsSurface::dscBeginPageSetup' => ['void'], + 'CairoPsSurface::dscBeginSetup' => ['void'], + 'CairoPsSurface::dscComment' => ['void', 'comment'=>'string'], + 'CairoPsSurface::getEps' => ['bool'], + 'CairoPsSurface::getLevels' => ['array'], + 'CairoPsSurface::levelToString' => ['string', 'level'=>'int'], + 'CairoPsSurface::restrictToLevel' => ['void', 'level'=>'string'], + 'CairoPsSurface::setEps' => ['void', 'level'=>'string'], + 'CairoPsSurface::setSize' => ['void', 'width'=>'string', 'height'=>'string'], + 'CairoRadialGradient::__construct' => ['void', 'x0'=>'float', 'y0'=>'float', 'r0'=>'float', 'x1'=>'float', 'y1'=>'float', 'r1'=>'float'], + 'CairoRadialGradient::getCircles' => ['array'], + 'CairoScaledFont::__construct' => ['void', 'font_face'=>'CairoFontFace', 'matrix'=>'CairoMatrix', 'ctm'=>'CairoMatrix', 'options'=>'CairoFontOptions'], + 'CairoScaledFont::extents' => ['array'], + 'CairoScaledFont::getCtm' => ['CairoMatrix'], + 'CairoScaledFont::getFontFace' => ['', 'context'=>'cairocontext'], + 'CairoScaledFont::getFontMatrix' => ['', 'context'=>'cairocontext'], + 'CairoScaledFont::getFontOptions' => ['', 'context'=>'cairocontext'], + 'CairoScaledFont::getScaleMatrix' => ['void'], + 'CairoScaledFont::getType' => ['int'], + 'CairoScaledFont::glyphExtents' => ['array', 'glyphs'=>'string'], + 'CairoScaledFont::status' => ['int', 'context'=>'cairocontext'], + 'CairoScaledFont::textExtents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], + 'CairoSolidPattern::__construct' => ['void', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha='=>'float'], + 'CairoSolidPattern::getRgba' => ['array'], + 'CairoSurface::__construct' => ['void'], + 'CairoSurface::copyPage' => ['', 'context'=>'cairocontext'], + 'CairoSurface::createSimilar' => ['void', 'other'=>'cairosurface', 'content'=>'int', 'width'=>'string', 'height'=>'string'], + 'CairoSurface::finish' => ['void'], + 'CairoSurface::flush' => ['void'], + 'CairoSurface::getContent' => ['int'], + 'CairoSurface::getDeviceOffset' => ['array'], + 'CairoSurface::getFontOptions' => ['', 'context'=>'cairocontext'], + 'CairoSurface::getType' => ['int'], + 'CairoSurface::markDirty' => ['void'], + 'CairoSurface::markDirtyRectangle' => ['void', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string'], + 'CairoSurface::setDeviceOffset' => ['void', 'x'=>'string', 'y'=>'string'], + 'CairoSurface::setFallbackResolution' => ['void', 'x'=>'string', 'y'=>'string'], + 'CairoSurface::showPage' => ['', 'context'=>'cairocontext'], + 'CairoSurface::status' => ['int', 'context'=>'cairocontext'], + 'CairoSurface::writeToPng' => ['void', 'file'=>'string'], + 'CairoSurfacePattern::__construct' => ['void', 'surface'=>'CairoSurface'], + 'CairoSurfacePattern::getExtend' => ['int'], + 'CairoSurfacePattern::getFilter' => ['int'], + 'CairoSurfacePattern::getSurface' => ['void'], + 'CairoSurfacePattern::setExtend' => ['void', 'extend'=>'int'], + 'CairoSurfacePattern::setFilter' => ['void', 'filter'=>'string'], + 'CairoSvgSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], + 'CairoSvgSurface::getVersions' => ['array'], + 'CairoSvgSurface::restrictToVersion' => ['void', 'version'=>'string'], + 'CairoSvgSurface::versionToString' => ['string', 'version'=>'int'], + 'CallbackFilterIterator::__construct' => ['void', 'iterator'=>'Iterator', 'func'=>'callable(mixed):bool|callable(mixed,mixed):bool|callable(mixed,mixed,mixed):bool'], + 'CallbackFilterIterator::accept' => ['bool'], + 'CallbackFilterIterator::current' => ['mixed'], + 'CallbackFilterIterator::getInnerIterator' => ['Iterator'], + 'CallbackFilterIterator::key' => ['mixed'], + 'CallbackFilterIterator::next' => ['void'], + 'CallbackFilterIterator::rewind' => ['void'], + 'CallbackFilterIterator::valid' => ['bool'], + 'ClosedGeneratorException::__clone' => ['void'], + 'ClosedGeneratorException::__toString' => ['string'], + 'ClosedGeneratorException::getCode' => ['int'], + 'ClosedGeneratorException::getFile' => ['string'], + 'ClosedGeneratorException::getLine' => ['int'], + 'ClosedGeneratorException::getMessage' => ['string'], + 'ClosedGeneratorException::getPrevious' => ['Throwable|ClosedGeneratorException|null'], + 'ClosedGeneratorException::getTrace' => ['list\',args?:array}>'], + 'ClosedGeneratorException::getTraceAsString' => ['string'], + 'Closure::__construct' => ['void'], + 'Closure::__invoke' => ['', '...args='=>''], + 'Closure::bind' => ['Closure|false', 'old'=>'Closure', 'to'=>'?object', 'scope='=>'object|string'], + 'Closure::bindTo' => ['Closure|false', 'new'=>'?object', 'newscope='=>'object|string'], + 'Closure::call' => ['', 'to'=>'object', '...parameters='=>''], + 'Collator::__construct' => ['void', 'locale'=>'string'], + 'Collator::asort' => ['bool', '&rw_arr'=>'array', 'sort_flag='=>'int'], + 'Collator::compare' => ['int|false', 'string1'=>'string', 'string2'=>'string'], + 'Collator::create' => ['?Collator', 'locale'=>'string'], + 'Collator::getAttribute' => ['int|false', 'attr'=>'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::setStrength' => ['bool', 'strength'=>'int'], + 'Collator::sort' => ['bool', '&rw_arr'=>'array', 'sort_flags='=>'int'], + 'Collator::sortWithSortKeys' => ['bool', '&rw_arr'=>'array'], + 'Collectable::isGarbage' => ['bool'], + 'Collectable::setGarbage' => ['void'], + 'Cond::broadcast' => ['bool', 'condition'=>'long'], + 'Cond::create' => ['long'], + 'Cond::destroy' => ['bool', 'condition'=>'long'], + 'Cond::signal' => ['bool', 'condition'=>'long'], + 'Cond::wait' => ['bool', 'condition'=>'long', 'mutex'=>'long', 'timeout='=>'long'], + 'Couchbase\AnalyticsQuery::__construct' => ['void'], + 'Couchbase\AnalyticsQuery::fromString' => ['Couchbase\AnalyticsQuery', 'statement'=>'string'], + 'Couchbase\BooleanFieldSearchQuery::__construct' => ['void'], + 'Couchbase\BooleanFieldSearchQuery::boost' => ['Couchbase\BooleanFieldSearchQuery', 'boost'=>'float'], + 'Couchbase\BooleanFieldSearchQuery::field' => ['Couchbase\BooleanFieldSearchQuery', 'field'=>'string'], + 'Couchbase\BooleanFieldSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\BooleanSearchQuery::__construct' => ['void'], + 'Couchbase\BooleanSearchQuery::boost' => ['Couchbase\BooleanSearchQuery', 'boost'=>'float'], + 'Couchbase\BooleanSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\BooleanSearchQuery::must' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], + 'Couchbase\BooleanSearchQuery::mustNot' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], + 'Couchbase\BooleanSearchQuery::should' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], + 'Couchbase\Bucket::__construct' => ['void'], + 'Couchbase\Bucket::__get' => ['int', 'name'=>'string'], + 'Couchbase\Bucket::__set' => ['int', 'name'=>'string', 'value'=>'int'], + 'Couchbase\Bucket::append' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], + 'Couchbase\Bucket::counter' => ['Couchbase\Document|array', 'ids'=>'array|string', 'delta='=>'int', 'options='=>'array'], + 'Couchbase\Bucket::decryptFields' => ['array', 'document'=>'array', 'fieldOptions'=>'', 'prefix='=>'string'], + 'Couchbase\Bucket::diag' => ['array', 'reportId='=>'string'], + 'Couchbase\Bucket::encryptFields' => ['array', 'document'=>'array', 'fieldOptions'=>'', 'prefix='=>'string'], + 'Couchbase\Bucket::get' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], + 'Couchbase\Bucket::getAndLock' => ['Couchbase\Document|array', 'ids'=>'array|string', 'lockTime'=>'int', 'options='=>'array'], + 'Couchbase\Bucket::getAndTouch' => ['Couchbase\Document|array', 'ids'=>'array|string', 'expiry'=>'int', 'options='=>'array'], + 'Couchbase\Bucket::getFromReplica' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], + 'Couchbase\Bucket::getName' => ['string'], + 'Couchbase\Bucket::insert' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], + 'Couchbase\Bucket::listExists' => ['bool', 'id'=>'string', 'value'=>'mixed'], + 'Couchbase\Bucket::listGet' => ['mixed', 'id'=>'string', 'index'=>'int'], + 'Couchbase\Bucket::listPush' => ['', 'id'=>'string', 'value'=>'mixed'], + 'Couchbase\Bucket::listRemove' => ['', 'id'=>'string', 'index'=>'int'], + 'Couchbase\Bucket::listSet' => ['', 'id'=>'string', 'index'=>'int', 'value'=>'mixed'], + 'Couchbase\Bucket::listShift' => ['', 'id'=>'string', 'value'=>'mixed'], + 'Couchbase\Bucket::listSize' => ['int', 'id'=>'string'], + 'Couchbase\Bucket::lookupIn' => ['Couchbase\LookupInBuilder', 'id'=>'string'], + 'Couchbase\Bucket::manager' => ['Couchbase\BucketManager'], + 'Couchbase\Bucket::mapAdd' => ['', 'id'=>'string', 'key'=>'string', 'value'=>'mixed'], + 'Couchbase\Bucket::mapGet' => ['mixed', 'id'=>'string', 'key'=>'string'], + 'Couchbase\Bucket::mapRemove' => ['', 'id'=>'string', 'key'=>'string'], + 'Couchbase\Bucket::mapSize' => ['int', 'id'=>'string'], + 'Couchbase\Bucket::mutateIn' => ['Couchbase\MutateInBuilder', 'id'=>'string', 'cas'=>'string'], + 'Couchbase\Bucket::ping' => ['array', 'services='=>'int', 'reportId='=>'string'], + 'Couchbase\Bucket::prepend' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], + 'Couchbase\Bucket::query' => ['object', 'query'=>'Couchbase\AnalyticsQuery|Couchbase\N1qlQuery|Couchbase\SearchQuery|Couchbase\SpatialViewQuery|Couchbase\ViewQuery', 'jsonAsArray='=>'bool'], + 'Couchbase\Bucket::queueAdd' => ['', 'id'=>'string', 'value'=>'mixed'], + 'Couchbase\Bucket::queueExists' => ['bool', 'id'=>'string', 'value'=>'mixed'], + 'Couchbase\Bucket::queueRemove' => ['mixed', 'id'=>'string'], + 'Couchbase\Bucket::queueSize' => ['int', 'id'=>'string'], + 'Couchbase\Bucket::remove' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], + 'Couchbase\Bucket::replace' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], + 'Couchbase\Bucket::retrieveIn' => ['Couchbase\DocumentFragment', 'id'=>'string', '...paths='=>'array'], + 'Couchbase\Bucket::setAdd' => ['', 'id'=>'string', 'value'=>'bool|float|int|string'], + 'Couchbase\Bucket::setExists' => ['bool', 'id'=>'string', 'value'=>'bool|float|int|string'], + 'Couchbase\Bucket::setRemove' => ['', 'id'=>'string', 'value'=>'bool|float|int|string'], + 'Couchbase\Bucket::setSize' => ['int', 'id'=>'string'], + 'Couchbase\Bucket::setTranscoder' => ['', 'encoder'=>'callable', 'decoder'=>'callable'], + 'Couchbase\Bucket::touch' => ['Couchbase\Document|array', 'ids'=>'array|string', 'expiry'=>'int', 'options='=>'array'], + 'Couchbase\Bucket::unlock' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], + 'Couchbase\Bucket::upsert' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], + 'Couchbase\BucketManager::__construct' => ['void'], + 'Couchbase\BucketManager::createN1qlIndex' => ['', 'name'=>'string', 'fields'=>'array', 'whereClause='=>'string', 'ignoreIfExist='=>'bool', 'defer='=>'bool'], + 'Couchbase\BucketManager::createN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfExist='=>'bool', 'defer='=>'bool'], + 'Couchbase\BucketManager::dropN1qlIndex' => ['', 'name'=>'string', 'ignoreIfNotExist='=>'bool'], + 'Couchbase\BucketManager::dropN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfNotExist='=>'bool'], + 'Couchbase\BucketManager::flush' => [''], + 'Couchbase\BucketManager::getDesignDocument' => ['array', 'name'=>'string'], + 'Couchbase\BucketManager::info' => ['array'], + 'Couchbase\BucketManager::insertDesignDocument' => ['', 'name'=>'string', 'document'=>'array'], + 'Couchbase\BucketManager::listDesignDocuments' => ['array'], + 'Couchbase\BucketManager::listN1qlIndexes' => ['array'], + 'Couchbase\BucketManager::removeDesignDocument' => ['', 'name'=>'string'], + 'Couchbase\BucketManager::upsertDesignDocument' => ['', 'name'=>'string', 'document'=>'array'], + 'Couchbase\ClassicAuthenticator::bucket' => ['', 'name'=>'string', 'password'=>'string'], + 'Couchbase\ClassicAuthenticator::cluster' => ['', 'username'=>'string', 'password'=>'string'], + 'Couchbase\Cluster::__construct' => ['void', 'connstr'=>'string'], + 'Couchbase\Cluster::authenticate' => ['null', 'authenticator'=>'Couchbase\Authenticator'], + 'Couchbase\Cluster::authenticateAs' => ['null', 'username'=>'string', 'password'=>'string'], + 'Couchbase\Cluster::manager' => ['Couchbase\ClusterManager', 'username='=>'string', 'password='=>'string'], + 'Couchbase\Cluster::openBucket' => ['Couchbase\Bucket', 'name='=>'string', 'password='=>'string'], + 'Couchbase\ClusterManager::__construct' => ['void'], + 'Couchbase\ClusterManager::createBucket' => ['', 'name'=>'string', 'options='=>'array'], + 'Couchbase\ClusterManager::getUser' => ['array', 'username'=>'string', 'domain='=>'int'], + 'Couchbase\ClusterManager::info' => ['array'], + 'Couchbase\ClusterManager::listBuckets' => ['array'], + 'Couchbase\ClusterManager::listUsers' => ['array', 'domain='=>'int'], + 'Couchbase\ClusterManager::removeBucket' => ['', 'name'=>'string'], + 'Couchbase\ClusterManager::removeUser' => ['', 'name'=>'string', 'domain='=>'int'], + 'Couchbase\ClusterManager::upsertUser' => ['', 'name'=>'string', 'settings'=>'Couchbase\UserSettings', 'domain='=>'int'], + 'Couchbase\ConjunctionSearchQuery::__construct' => ['void'], + 'Couchbase\ConjunctionSearchQuery::boost' => ['Couchbase\ConjunctionSearchQuery', 'boost'=>'float'], + 'Couchbase\ConjunctionSearchQuery::every' => ['Couchbase\ConjunctionSearchQuery', '...queries='=>'array'], + 'Couchbase\ConjunctionSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\DateRangeSearchFacet::__construct' => ['void'], + 'Couchbase\DateRangeSearchFacet::addRange' => ['Couchbase\DateRangeSearchFacet', 'name'=>'string', 'start'=>'int|string', 'end'=>'int|string'], + 'Couchbase\DateRangeSearchFacet::jsonSerialize' => ['array'], + 'Couchbase\DateRangeSearchQuery::__construct' => ['void'], + 'Couchbase\DateRangeSearchQuery::boost' => ['Couchbase\DateRangeSearchQuery', 'boost'=>'float'], + 'Couchbase\DateRangeSearchQuery::dateTimeParser' => ['Couchbase\DateRangeSearchQuery', 'dateTimeParser'=>'string'], + 'Couchbase\DateRangeSearchQuery::end' => ['Couchbase\DateRangeSearchQuery', 'end'=>'int|string', 'inclusive='=>'bool'], + 'Couchbase\DateRangeSearchQuery::field' => ['Couchbase\DateRangeSearchQuery', 'field'=>'string'], + 'Couchbase\DateRangeSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\DateRangeSearchQuery::start' => ['Couchbase\DateRangeSearchQuery', 'start'=>'int|string', 'inclusive='=>'bool'], + 'Couchbase\DisjunctionSearchQuery::__construct' => ['void'], + 'Couchbase\DisjunctionSearchQuery::boost' => ['Couchbase\DisjunctionSearchQuery', 'boost'=>'float'], + 'Couchbase\DisjunctionSearchQuery::either' => ['Couchbase\DisjunctionSearchQuery', '...queries='=>'array'], + 'Couchbase\DisjunctionSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\DisjunctionSearchQuery::min' => ['Couchbase\DisjunctionSearchQuery', 'min'=>'int'], + 'Couchbase\DocIdSearchQuery::__construct' => ['void'], + 'Couchbase\DocIdSearchQuery::boost' => ['Couchbase\DocIdSearchQuery', 'boost'=>'float'], + 'Couchbase\DocIdSearchQuery::docIds' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array'], + 'Couchbase\DocIdSearchQuery::field' => ['Couchbase\DocIdSearchQuery', 'field'=>'string'], + 'Couchbase\DocIdSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\GeoBoundingBoxSearchQuery::__construct' => ['void'], + 'Couchbase\GeoBoundingBoxSearchQuery::boost' => ['Couchbase\GeoBoundingBoxSearchQuery', 'boost'=>'float'], + 'Couchbase\GeoBoundingBoxSearchQuery::field' => ['Couchbase\GeoBoundingBoxSearchQuery', 'field'=>'string'], + 'Couchbase\GeoBoundingBoxSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\GeoDistanceSearchQuery::__construct' => ['void'], + 'Couchbase\GeoDistanceSearchQuery::boost' => ['Couchbase\GeoDistanceSearchQuery', 'boost'=>'float'], + 'Couchbase\GeoDistanceSearchQuery::field' => ['Couchbase\GeoDistanceSearchQuery', 'field'=>'string'], + 'Couchbase\GeoDistanceSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\LookupInBuilder::__construct' => ['void'], + 'Couchbase\LookupInBuilder::execute' => ['Couchbase\DocumentFragment'], + 'Couchbase\LookupInBuilder::exists' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], + 'Couchbase\LookupInBuilder::get' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], + 'Couchbase\LookupInBuilder::getCount' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], + 'Couchbase\MatchAllSearchQuery::__construct' => ['void'], + 'Couchbase\MatchAllSearchQuery::boost' => ['Couchbase\MatchAllSearchQuery', 'boost'=>'float'], + 'Couchbase\MatchAllSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\MatchNoneSearchQuery::__construct' => ['void'], + 'Couchbase\MatchNoneSearchQuery::boost' => ['Couchbase\MatchNoneSearchQuery', 'boost'=>'float'], + 'Couchbase\MatchNoneSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\MatchPhraseSearchQuery::__construct' => ['void'], + 'Couchbase\MatchPhraseSearchQuery::analyzer' => ['Couchbase\MatchPhraseSearchQuery', 'analyzer'=>'string'], + 'Couchbase\MatchPhraseSearchQuery::boost' => ['Couchbase\MatchPhraseSearchQuery', 'boost'=>'float'], + 'Couchbase\MatchPhraseSearchQuery::field' => ['Couchbase\MatchPhraseSearchQuery', 'field'=>'string'], + 'Couchbase\MatchPhraseSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\MatchSearchQuery::__construct' => ['void'], + 'Couchbase\MatchSearchQuery::analyzer' => ['Couchbase\MatchSearchQuery', 'analyzer'=>'string'], + 'Couchbase\MatchSearchQuery::boost' => ['Couchbase\MatchSearchQuery', 'boost'=>'float'], + 'Couchbase\MatchSearchQuery::field' => ['Couchbase\MatchSearchQuery', 'field'=>'string'], + 'Couchbase\MatchSearchQuery::fuzziness' => ['Couchbase\MatchSearchQuery', 'fuzziness'=>'int'], + 'Couchbase\MatchSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\MatchSearchQuery::prefixLength' => ['Couchbase\MatchSearchQuery', 'prefixLength'=>'int'], + 'Couchbase\MutateInBuilder::__construct' => ['void'], + 'Couchbase\MutateInBuilder::arrayAddUnique' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], + 'Couchbase\MutateInBuilder::arrayAppend' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], + 'Couchbase\MutateInBuilder::arrayAppendAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array|bool'], + 'Couchbase\MutateInBuilder::arrayInsert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array'], + 'Couchbase\MutateInBuilder::arrayInsertAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array'], + 'Couchbase\MutateInBuilder::arrayPrepend' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], + 'Couchbase\MutateInBuilder::arrayPrependAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array|bool'], + 'Couchbase\MutateInBuilder::counter' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'delta'=>'int', 'options='=>'array|bool'], + 'Couchbase\MutateInBuilder::execute' => ['Couchbase\DocumentFragment'], + 'Couchbase\MutateInBuilder::insert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], + 'Couchbase\MutateInBuilder::modeDocument' => ['', 'mode'=>'int'], + 'Couchbase\MutateInBuilder::remove' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'options='=>'array'], + 'Couchbase\MutateInBuilder::replace' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array'], + 'Couchbase\MutateInBuilder::upsert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], + 'Couchbase\MutateInBuilder::withExpiry' => ['Couchbase\MutateInBuilder', 'expiry'=>'Couchbase\expiry'], + 'Couchbase\MutationState::__construct' => ['void'], + 'Couchbase\MutationState::add' => ['', 'source'=>'Couchbase\Document|Couchbase\DocumentFragment|array'], + 'Couchbase\MutationState::from' => ['Couchbase\MutationState', 'source'=>'Couchbase\Document|Couchbase\DocumentFragment|array'], + 'Couchbase\MutationToken::__construct' => ['void'], + 'Couchbase\MutationToken::bucketName' => ['string'], + 'Couchbase\MutationToken::from' => ['', 'bucketName'=>'string', 'vbucketId'=>'int', 'vbucketUuid'=>'string', 'sequenceNumber'=>'string'], + 'Couchbase\MutationToken::sequenceNumber' => ['string'], + 'Couchbase\MutationToken::vbucketId' => ['int'], + 'Couchbase\MutationToken::vbucketUuid' => ['string'], + 'Couchbase\N1qlIndex::__construct' => ['void'], + 'Couchbase\N1qlQuery::__construct' => ['void'], + 'Couchbase\N1qlQuery::adhoc' => ['Couchbase\N1qlQuery', 'adhoc'=>'bool'], + 'Couchbase\N1qlQuery::consistency' => ['Couchbase\N1qlQuery', 'consistency'=>'int'], + 'Couchbase\N1qlQuery::consistentWith' => ['Couchbase\N1qlQuery', 'state'=>'Couchbase\MutationState'], + 'Couchbase\N1qlQuery::crossBucket' => ['Couchbase\N1qlQuery', 'crossBucket'=>'bool'], + 'Couchbase\N1qlQuery::fromString' => ['Couchbase\N1qlQuery', 'statement'=>'string'], + 'Couchbase\N1qlQuery::maxParallelism' => ['Couchbase\N1qlQuery', 'maxParallelism'=>'int'], + 'Couchbase\N1qlQuery::namedParams' => ['Couchbase\N1qlQuery', 'params'=>'array'], + 'Couchbase\N1qlQuery::pipelineBatch' => ['Couchbase\N1qlQuery', 'pipelineBatch'=>'int'], + 'Couchbase\N1qlQuery::pipelineCap' => ['Couchbase\N1qlQuery', 'pipelineCap'=>'int'], + 'Couchbase\N1qlQuery::positionalParams' => ['Couchbase\N1qlQuery', 'params'=>'array'], + 'Couchbase\N1qlQuery::profile' => ['', 'profileType'=>'string'], + 'Couchbase\N1qlQuery::readonly' => ['Couchbase\N1qlQuery', 'readonly'=>'bool'], + 'Couchbase\N1qlQuery::scanCap' => ['Couchbase\N1qlQuery', 'scanCap'=>'int'], + 'Couchbase\NumericRangeSearchFacet::__construct' => ['void'], + 'Couchbase\NumericRangeSearchFacet::addRange' => ['Couchbase\NumericRangeSearchFacet', 'name'=>'string', 'min'=>'float', 'max'=>'float'], + 'Couchbase\NumericRangeSearchFacet::jsonSerialize' => ['array'], + 'Couchbase\NumericRangeSearchQuery::__construct' => ['void'], + 'Couchbase\NumericRangeSearchQuery::boost' => ['Couchbase\NumericRangeSearchQuery', 'boost'=>'float'], + 'Couchbase\NumericRangeSearchQuery::field' => ['Couchbase\NumericRangeSearchQuery', 'field'=>'string'], + 'Couchbase\NumericRangeSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\NumericRangeSearchQuery::max' => ['Couchbase\NumericRangeSearchQuery', 'max'=>'float', 'inclusive='=>'bool'], + 'Couchbase\NumericRangeSearchQuery::min' => ['Couchbase\NumericRangeSearchQuery', 'min'=>'float', 'inclusive='=>'bool'], + 'Couchbase\PasswordAuthenticator::password' => ['Couchbase\PasswordAuthenticator', 'password'=>'string'], + 'Couchbase\PasswordAuthenticator::username' => ['Couchbase\PasswordAuthenticator', 'username'=>'string'], + 'Couchbase\PhraseSearchQuery::__construct' => ['void'], + 'Couchbase\PhraseSearchQuery::boost' => ['Couchbase\PhraseSearchQuery', 'boost'=>'float'], + 'Couchbase\PhraseSearchQuery::field' => ['Couchbase\PhraseSearchQuery', 'field'=>'string'], + 'Couchbase\PhraseSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\PrefixSearchQuery::__construct' => ['void'], + 'Couchbase\PrefixSearchQuery::boost' => ['Couchbase\PrefixSearchQuery', 'boost'=>'float'], + 'Couchbase\PrefixSearchQuery::field' => ['Couchbase\PrefixSearchQuery', 'field'=>'string'], + 'Couchbase\PrefixSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\QueryStringSearchQuery::__construct' => ['void'], + 'Couchbase\QueryStringSearchQuery::boost' => ['Couchbase\QueryStringSearchQuery', 'boost'=>'float'], + 'Couchbase\QueryStringSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\RegexpSearchQuery::__construct' => ['void'], + 'Couchbase\RegexpSearchQuery::boost' => ['Couchbase\RegexpSearchQuery', 'boost'=>'float'], + 'Couchbase\RegexpSearchQuery::field' => ['Couchbase\RegexpSearchQuery', 'field'=>'string'], + 'Couchbase\RegexpSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\SearchQuery::__construct' => ['void', 'indexName'=>'string', 'queryPart'=>'Couchbase\SearchQueryPart'], + 'Couchbase\SearchQuery::addFacet' => ['Couchbase\SearchQuery', 'name'=>'string', 'facet'=>'Couchbase\SearchFacet'], + 'Couchbase\SearchQuery::boolean' => ['Couchbase\BooleanSearchQuery'], + 'Couchbase\SearchQuery::booleanField' => ['Couchbase\BooleanFieldSearchQuery', 'value'=>'bool'], + 'Couchbase\SearchQuery::conjuncts' => ['Couchbase\ConjunctionSearchQuery', '...queries='=>'array'], + 'Couchbase\SearchQuery::consistentWith' => ['Couchbase\SearchQuery', 'state'=>'Couchbase\MutationState'], + 'Couchbase\SearchQuery::dateRange' => ['Couchbase\DateRangeSearchQuery'], + 'Couchbase\SearchQuery::dateRangeFacet' => ['Couchbase\DateRangeSearchFacet', 'field'=>'string', 'limit'=>'int'], + 'Couchbase\SearchQuery::disjuncts' => ['Couchbase\DisjunctionSearchQuery', '...queries='=>'array'], + 'Couchbase\SearchQuery::docId' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array'], + 'Couchbase\SearchQuery::explain' => ['Couchbase\SearchQuery', 'explain'=>'bool'], + 'Couchbase\SearchQuery::fields' => ['Couchbase\SearchQuery', '...fields='=>'array'], + 'Couchbase\SearchQuery::geoBoundingBox' => ['Couchbase\GeoBoundingBoxSearchQuery', 'topLeftLongitude'=>'float', 'topLeftLatitude'=>'float', 'bottomRightLongitude'=>'float', 'bottomRightLatitude'=>'float'], + 'Couchbase\SearchQuery::geoDistance' => ['Couchbase\GeoDistanceSearchQuery', 'longitude'=>'float', 'latitude'=>'float', 'distance'=>'string'], + 'Couchbase\SearchQuery::highlight' => ['Couchbase\SearchQuery', 'style'=>'string', '...fields='=>'array'], + 'Couchbase\SearchQuery::jsonSerialize' => ['array'], + 'Couchbase\SearchQuery::limit' => ['Couchbase\SearchQuery', 'limit'=>'int'], + 'Couchbase\SearchQuery::match' => ['Couchbase\MatchSearchQuery', 'match'=>'string'], + 'Couchbase\SearchQuery::matchAll' => ['Couchbase\MatchAllSearchQuery'], + 'Couchbase\SearchQuery::matchNone' => ['Couchbase\MatchNoneSearchQuery'], + 'Couchbase\SearchQuery::matchPhrase' => ['Couchbase\MatchPhraseSearchQuery', '...terms='=>'array'], + 'Couchbase\SearchQuery::numericRange' => ['Couchbase\NumericRangeSearchQuery'], + 'Couchbase\SearchQuery::numericRangeFacet' => ['Couchbase\NumericRangeSearchFacet', 'field'=>'string', 'limit'=>'int'], + 'Couchbase\SearchQuery::prefix' => ['Couchbase\PrefixSearchQuery', 'prefix'=>'string'], + 'Couchbase\SearchQuery::queryString' => ['Couchbase\QueryStringSearchQuery', 'queryString'=>'string'], + 'Couchbase\SearchQuery::regexp' => ['Couchbase\RegexpSearchQuery', 'regexp'=>'string'], + 'Couchbase\SearchQuery::serverSideTimeout' => ['Couchbase\SearchQuery', 'serverSideTimeout'=>'int'], + 'Couchbase\SearchQuery::skip' => ['Couchbase\SearchQuery', 'skip'=>'int'], + 'Couchbase\SearchQuery::sort' => ['Couchbase\SearchQuery', '...sort='=>'array'], + 'Couchbase\SearchQuery::term' => ['Couchbase\TermSearchQuery', 'term'=>'string'], + 'Couchbase\SearchQuery::termFacet' => ['Couchbase\TermSearchFacet', 'field'=>'string', 'limit'=>'int'], + 'Couchbase\SearchQuery::termRange' => ['Couchbase\TermRangeSearchQuery'], + 'Couchbase\SearchQuery::wildcard' => ['Couchbase\WildcardSearchQuery', 'wildcard'=>'string'], + 'Couchbase\SearchSort::__construct' => ['void'], + 'Couchbase\SearchSort::field' => ['Couchbase\SearchSortField', 'field'=>'string'], + 'Couchbase\SearchSort::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], + 'Couchbase\SearchSort::id' => ['Couchbase\SearchSortId'], + 'Couchbase\SearchSort::score' => ['Couchbase\SearchSortScore'], + 'Couchbase\SearchSortField::__construct' => ['void'], + 'Couchbase\SearchSortField::descending' => ['Couchbase\SearchSortField', 'descending'=>'bool'], + 'Couchbase\SearchSortField::field' => ['Couchbase\SearchSortField', 'field'=>'string'], + 'Couchbase\SearchSortField::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], + 'Couchbase\SearchSortField::id' => ['Couchbase\SearchSortId'], + 'Couchbase\SearchSortField::jsonSerialize' => ['mixed'], + 'Couchbase\SearchSortField::missing' => ['', 'missing'=>'string'], + 'Couchbase\SearchSortField::mode' => ['', 'mode'=>'string'], + 'Couchbase\SearchSortField::score' => ['Couchbase\SearchSortScore'], + 'Couchbase\SearchSortField::type' => ['', 'type'=>'string'], + 'Couchbase\SearchSortGeoDistance::__construct' => ['void'], + 'Couchbase\SearchSortGeoDistance::descending' => ['Couchbase\SearchSortGeoDistance', 'descending'=>'bool'], + 'Couchbase\SearchSortGeoDistance::field' => ['Couchbase\SearchSortField', 'field'=>'string'], + 'Couchbase\SearchSortGeoDistance::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], + 'Couchbase\SearchSortGeoDistance::id' => ['Couchbase\SearchSortId'], + 'Couchbase\SearchSortGeoDistance::jsonSerialize' => ['mixed'], + 'Couchbase\SearchSortGeoDistance::score' => ['Couchbase\SearchSortScore'], + 'Couchbase\SearchSortGeoDistance::unit' => ['Couchbase\SearchSortGeoDistance', 'unit'=>'string'], + 'Couchbase\SearchSortId::__construct' => ['void'], + 'Couchbase\SearchSortId::descending' => ['Couchbase\SearchSortId', 'descending'=>'bool'], + 'Couchbase\SearchSortId::field' => ['Couchbase\SearchSortField', 'field'=>'string'], + 'Couchbase\SearchSortId::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], + 'Couchbase\SearchSortId::id' => ['Couchbase\SearchSortId'], + 'Couchbase\SearchSortId::jsonSerialize' => ['mixed'], + 'Couchbase\SearchSortId::score' => ['Couchbase\SearchSortScore'], + 'Couchbase\SearchSortScore::__construct' => ['void'], + 'Couchbase\SearchSortScore::descending' => ['Couchbase\SearchSortScore', 'descending'=>'bool'], + 'Couchbase\SearchSortScore::field' => ['Couchbase\SearchSortField', 'field'=>'string'], + 'Couchbase\SearchSortScore::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], + 'Couchbase\SearchSortScore::id' => ['Couchbase\SearchSortId'], + 'Couchbase\SearchSortScore::jsonSerialize' => ['mixed'], + 'Couchbase\SearchSortScore::score' => ['Couchbase\SearchSortScore'], + 'Couchbase\SpatialViewQuery::__construct' => ['void'], + 'Couchbase\SpatialViewQuery::bbox' => ['Couchbase\SpatialViewQuery', 'bbox'=>'array'], + 'Couchbase\SpatialViewQuery::consistency' => ['Couchbase\SpatialViewQuery', 'consistency'=>'int'], + 'Couchbase\SpatialViewQuery::custom' => ['', 'customParameters'=>'array'], + 'Couchbase\SpatialViewQuery::encode' => ['array'], + 'Couchbase\SpatialViewQuery::endRange' => ['Couchbase\SpatialViewQuery', 'range'=>'array'], + 'Couchbase\SpatialViewQuery::limit' => ['Couchbase\SpatialViewQuery', 'limit'=>'int'], + 'Couchbase\SpatialViewQuery::order' => ['Couchbase\SpatialViewQuery', 'order'=>'int'], + 'Couchbase\SpatialViewQuery::skip' => ['Couchbase\SpatialViewQuery', 'skip'=>'int'], + 'Couchbase\SpatialViewQuery::startRange' => ['Couchbase\SpatialViewQuery', 'range'=>'array'], + 'Couchbase\TermRangeSearchQuery::__construct' => ['void'], + 'Couchbase\TermRangeSearchQuery::boost' => ['Couchbase\TermRangeSearchQuery', 'boost'=>'float'], + 'Couchbase\TermRangeSearchQuery::field' => ['Couchbase\TermRangeSearchQuery', 'field'=>'string'], + 'Couchbase\TermRangeSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\TermRangeSearchQuery::max' => ['Couchbase\TermRangeSearchQuery', 'max'=>'string', 'inclusive='=>'bool'], + 'Couchbase\TermRangeSearchQuery::min' => ['Couchbase\TermRangeSearchQuery', 'min'=>'string', 'inclusive='=>'bool'], + 'Couchbase\TermSearchFacet::__construct' => ['void'], + 'Couchbase\TermSearchFacet::jsonSerialize' => ['array'], + 'Couchbase\TermSearchQuery::__construct' => ['void'], + 'Couchbase\TermSearchQuery::boost' => ['Couchbase\TermSearchQuery', 'boost'=>'float'], + 'Couchbase\TermSearchQuery::field' => ['Couchbase\TermSearchQuery', 'field'=>'string'], + 'Couchbase\TermSearchQuery::fuzziness' => ['Couchbase\TermSearchQuery', 'fuzziness'=>'int'], + 'Couchbase\TermSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\TermSearchQuery::prefixLength' => ['Couchbase\TermSearchQuery', 'prefixLength'=>'int'], + 'Couchbase\UserSettings::fullName' => ['Couchbase\UserSettings', 'fullName'=>'string'], + 'Couchbase\UserSettings::password' => ['Couchbase\UserSettings', 'password'=>'string'], + 'Couchbase\UserSettings::role' => ['Couchbase\UserSettings', 'role'=>'string', 'bucket='=>'string'], + 'Couchbase\ViewQuery::__construct' => ['void'], + 'Couchbase\ViewQuery::consistency' => ['Couchbase\ViewQuery', 'consistency'=>'int'], + 'Couchbase\ViewQuery::custom' => ['Couchbase\ViewQuery', 'customParameters'=>'array'], + 'Couchbase\ViewQuery::encode' => ['array'], + 'Couchbase\ViewQuery::from' => ['Couchbase\ViewQuery', 'designDocumentName'=>'string', 'viewName'=>'string'], + 'Couchbase\ViewQuery::fromSpatial' => ['Couchbase\SpatialViewQuery', 'designDocumentName'=>'string', 'viewName'=>'string'], + 'Couchbase\ViewQuery::group' => ['Couchbase\ViewQuery', 'group'=>'bool'], + 'Couchbase\ViewQuery::groupLevel' => ['Couchbase\ViewQuery', 'groupLevel'=>'int'], + 'Couchbase\ViewQuery::idRange' => ['Couchbase\ViewQuery', 'startKeyDocumentId'=>'string', 'endKeyDocumentId'=>'string'], + 'Couchbase\ViewQuery::key' => ['Couchbase\ViewQuery', 'key'=>'mixed'], + 'Couchbase\ViewQuery::keys' => ['Couchbase\ViewQuery', 'keys'=>'array'], + 'Couchbase\ViewQuery::limit' => ['Couchbase\ViewQuery', 'limit'=>'int'], + 'Couchbase\ViewQuery::order' => ['Couchbase\ViewQuery', 'order'=>'int'], + 'Couchbase\ViewQuery::range' => ['Couchbase\ViewQuery', 'startKey'=>'mixed', 'endKey'=>'mixed', 'inclusiveEnd='=>'bool'], + 'Couchbase\ViewQuery::reduce' => ['Couchbase\ViewQuery', 'reduce'=>'bool'], + 'Couchbase\ViewQuery::skip' => ['Couchbase\ViewQuery', 'skip'=>'int'], + 'Couchbase\ViewQueryEncodable::encode' => ['array'], + 'Couchbase\WildcardSearchQuery::__construct' => ['void'], + 'Couchbase\WildcardSearchQuery::boost' => ['Couchbase\WildcardSearchQuery', 'boost'=>'float'], + 'Couchbase\WildcardSearchQuery::field' => ['Couchbase\WildcardSearchQuery', 'field'=>'string'], + 'Couchbase\WildcardSearchQuery::jsonSerialize' => ['array'], + 'Couchbase\basicDecoderV1' => ['mixed', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int', 'options'=>'array'], + 'Couchbase\basicEncoderV1' => ['array', 'value'=>'mixed', 'options'=>'array'], + 'Couchbase\defaultDecoder' => ['mixed', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int'], + 'Couchbase\defaultEncoder' => ['array', 'value'=>'mixed'], + 'Couchbase\fastlzCompress' => ['string', 'data'=>'string'], + 'Couchbase\fastlzDecompress' => ['string', 'data'=>'string'], + 'Couchbase\passthruDecoder' => ['string', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int'], + 'Couchbase\passthruEncoder' => ['array', 'value'=>'string'], + 'Couchbase\zlibCompress' => ['string', 'data'=>'string'], + 'Couchbase\zlibDecompress' => ['string', 'data'=>'string'], + 'Countable::count' => ['int'], + 'DOMAttr::__construct' => ['void', 'name'=>'string', 'value='=>'string'], + 'DOMAttr::getLineNo' => ['int'], + 'DOMAttr::getNodePath' => ['?string'], + 'DOMAttr::hasAttributes' => ['bool'], + 'DOMAttr::hasChildNodes' => ['bool'], + 'DOMAttr::insertBefore' => ['DOMNode', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode'], + 'DOMAttr::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'], + 'DOMAttr::isId' => ['bool'], + 'DOMAttr::isSameNode' => ['bool', 'node'=>'DOMNode'], + 'DOMAttr::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], + 'DOMAttr::lookupNamespaceUri' => ['string', 'prefix'=>'string'], + 'DOMAttr::lookupPrefix' => ['string', 'namespaceuri'=>'string'], + 'DOMAttr::normalize' => ['void'], + 'DOMAttr::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], + 'DOMAttr::replaceChild' => ['DOMNode', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], + 'DOMCdataSection::__construct' => ['void', 'value'=>'string'], + 'DOMCharacterData::appendData' => ['void', 'data'=>'string'], + 'DOMCharacterData::deleteData' => ['void', 'offset'=>'int', 'count'=>'int'], + 'DOMCharacterData::insertData' => ['void', 'offset'=>'int', 'data'=>'string'], + 'DOMCharacterData::replaceData' => ['void', 'offset'=>'int', 'count'=>'int', 'data'=>'string'], + 'DOMCharacterData::substringData' => ['string', 'offset'=>'int', 'count'=>'int'], + 'DOMComment::__construct' => ['void', 'value='=>'string'], + 'DOMDocument::__construct' => ['void', 'version='=>'string', 'encoding='=>'string'], + 'DOMDocument::createAttribute' => ['DOMAttr|false', 'name'=>'string'], + 'DOMDocument::createAttributeNS' => ['DOMAttr|false', 'namespaceuri'=>'string', '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', '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', 'localname'=>'string'], + 'DOMDocument::importNode' => ['DOMNode|false', 'importednode'=>'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::relaxNGValidate' => ['bool', 'filename'=>'string'], + 'DOMDocument::relaxNGValidateSource' => ['bool', 'source'=>'string'], + 'DOMDocument::save' => ['int|false', 'filename'=>'string', 'options='=>'int'], + 'DOMDocument::saveHTML' => ['string|false', 'node='=>'?DOMNode'], + 'DOMDocument::saveHTMLFile' => ['int|false', 'filename'=>'string'], + 'DOMDocument::saveXML' => ['string|false', 'node='=>'?DOMNode', 'options='=>'int'], + 'DOMDocument::schemaValidate' => ['bool', 'filename'=>'string', 'flags='=>'int'], + 'DOMDocument::schemaValidateSource' => ['bool', 'source'=>'string', 'flags='=>'int'], + 'DOMDocument::validate' => ['bool'], + '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', 'localname'=>'string'], + 'DOMElement::getAttributeNode' => ['DOMAttr', 'name'=>'string'], + 'DOMElement::getAttributeNodeNS' => ['DOMAttr', 'namespaceuri'=>'string', 'localname'=>'string'], + 'DOMElement::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'], + 'DOMElement::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string', 'localname'=>'string'], + 'DOMElement::get_attribute' => ['string', 'name'=>'string'], + 'DOMElement::get_attribute_node' => ['DomAttribute', 'name'=>'string'], + 'DOMElement::get_elements_by_tagname' => ['array', 'name'=>'string'], + 'DOMElement::hasAttribute' => ['bool', 'name'=>'string'], + 'DOMElement::hasAttributeNS' => ['bool', 'namespaceuri'=>'string', 'localname'=>'string'], + 'DOMElement::has_attribute' => ['bool', 'name'=>'string'], + 'DOMElement::removeAttribute' => ['bool', 'name'=>'string'], + 'DOMElement::removeAttributeNS' => ['bool', 'namespaceuri'=>'string', 'localname'=>'string'], + 'DOMElement::removeAttributeNode' => ['bool', 'oldnode'=>'DOMAttr'], + 'DOMElement::remove_attribute' => ['bool', 'name'=>'string'], + 'DOMElement::setAttribute' => ['DOMAttr|false', 'name'=>'string', 'value'=>'string'], + 'DOMElement::setAttributeNS' => ['void', 'namespaceuri'=>'string', '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::set_attribute' => ['DomAttribute', 'name'=>'string', 'value'=>'string'], + 'DOMElement::set_attribute_node' => ['DomNode', 'attr'=>'DOMNode'], + 'DOMElement::tagname' => ['string'], + '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::hasFeature' => ['bool', 'feature'=>'string', 'version'=>'string'], + 'DOMNamedNodeMap::count' => ['int'], + 'DOMNamedNodeMap::getNamedItem' => ['?DOMNode', 'name'=>'string'], + 'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespaceuri'=>'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::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::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], + 'DOMNode::lookupNamespaceURI' => ['string', 'prefix'=>'string'], + 'DOMNode::lookupPrefix' => ['string', 'namespaceuri'=>'string'], + 'DOMNode::normalize' => ['void'], + 'DOMNode::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], + 'DOMNode::replaceChild' => ['DOMNode|false', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], + 'DOMNodeList::item' => ['?DOMNode', 'index'=>'int'], + 'DOMProcessingInstruction::__construct' => ['void', 'name'=>'string', 'value'=>'string'], + 'DOMText::__construct' => ['void', 'value='=>'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'], + '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::__set_state' => ['DateInterval', 'array'=>'array'], + 'DateInterval::__wakeup' => ['void'], + 'DateInterval::createFromDateString' => ['DateInterval|false', 'time'=>'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'], + 'DatePeriod::__construct\'2' => ['void', 'iso'=>'string', 'options='=>'int'], + 'DatePeriod::__wakeup' => ['void'], + 'DatePeriod::getDateInterval' => ['DateInterval'], + 'DatePeriod::getEndDate' => ['?DateTimeInterface'], + 'DatePeriod::getStartDate' => ['DateTimeInterface'], + 'DateTime::__construct' => ['void', 'time='=>'string'], + 'DateTime::__construct\'1' => ['void', 'time'=>'?string', 'timezone'=>'?DateTimeZone'], + 'DateTime::__set_state' => ['static', 'array'=>'array'], + '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::format' => ['string|false', 'format'=>'string'], + 'DateTime::getLastErrors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], + 'DateTime::getOffset' => ['int'], + 'DateTime::getTimestamp' => ['int|false'], + 'DateTime::getTimezone' => ['DateTimeZone|false'], + 'DateTime::modify' => ['static|false', 'modify'=>'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::setTimezone' => ['static', 'timezone'=>'DateTimeZone'], + 'DateTime::sub' => ['static', 'interval'=>'DateInterval'], + 'DateTimeImmutable::__construct' => ['void', 'time='=>'string'], + 'DateTimeImmutable::__construct\'1' => ['void', 'time'=>'?string', 'timezone'=>'?DateTimeZone'], + 'DateTimeImmutable::__set_state' => ['static', 'array'=>'array'], + 'DateTimeImmutable::__wakeup' => ['void'], + 'DateTimeImmutable::add' => ['static', 'interval'=>'DateInterval'], + 'DateTimeImmutable::createFromFormat' => ['static|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'], + 'DateTimeImmutable::createFromMutable' => ['static', 'datetime'=>'DateTime'], + 'DateTimeImmutable::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], + 'DateTimeImmutable::format' => ['string|false', 'format'=>'string'], + 'DateTimeImmutable::getLastErrors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], + 'DateTimeImmutable::getOffset' => ['int'], + 'DateTimeImmutable::getTimestamp' => ['int|false'], + 'DateTimeImmutable::getTimezone' => ['DateTimeZone|false'], + 'DateTimeImmutable::modify' => ['static', 'modify'=>'string'], + 'DateTimeImmutable::setDate' => ['static|false', 'year'=>'int', 'month'=>'int', 'day'=>'int'], + 'DateTimeImmutable::setISODate' => ['static|false', 'year'=>'int', 'week'=>'int', 'day='=>'int'], + 'DateTimeImmutable::setTime' => ['static|false', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], + 'DateTimeImmutable::setTimestamp' => ['static|false', 'unixtimestamp'=>'int'], + 'DateTimeImmutable::setTimezone' => ['static|false', 'timezone'=>'DateTimeZone'], + 'DateTimeImmutable::sub' => ['static|false', 'interval'=>'DateInterval'], + 'DateTimeInterface::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], + 'DateTimeInterface::format' => ['string', 'format'=>'string'], + 'DateTimeInterface::getOffset' => ['int'], + 'DateTimeInterface::getTimestamp' => ['int|false'], + 'DateTimeInterface::getTimezone' => ['DateTimeZone|false'], + 'DateTimeZone::__construct' => ['void', 'timezone'=>'string'], + 'DateTimeZone::__set_state' => ['DateTimeZone', 'array'=>'array'], + 'DateTimeZone::__wakeup' => ['void'], + 'DateTimeZone::getLocation' => ['array|false'], + 'DateTimeZone::getName' => ['string'], + 'DateTimeZone::getOffset' => ['int|false', 'datetime'=>'DateTimeInterface'], + 'DateTimeZone::getTransitions' => ['list|false', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'], + 'DateTimeZone::listAbbreviations' => ['array>|false'], + '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::__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::getFilename' => ['string'], + 'DirectoryIterator::getGroup' => ['int'], + 'DirectoryIterator::getInode' => ['int'], + 'DirectoryIterator::getLinkTarget' => ['string'], + 'DirectoryIterator::getMTime' => ['int'], + 'DirectoryIterator::getOwner' => ['int'], + 'DirectoryIterator::getPath' => ['string'], + 'DirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'DirectoryIterator::getPathname' => ['string'], + 'DirectoryIterator::getPerms' => ['int'], + 'DirectoryIterator::getRealPath' => ['string'], + 'DirectoryIterator::getSize' => ['int'], + 'DirectoryIterator::getType' => ['string'], + 'DirectoryIterator::isDir' => ['bool'], + 'DirectoryIterator::isDot' => ['bool'], + 'DirectoryIterator::isExecutable' => ['bool'], + 'DirectoryIterator::isFile' => ['bool'], + 'DirectoryIterator::isLink' => ['bool'], + 'DirectoryIterator::isReadable' => ['bool'], + 'DirectoryIterator::isWritable' => ['bool'], + 'DirectoryIterator::key' => ['string'], + 'DirectoryIterator::next' => ['void'], + 'DirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], + 'DirectoryIterator::rewind' => ['void'], + 'DirectoryIterator::seek' => ['void', 'position'=>'int'], + 'DirectoryIterator::setFileClass' => ['void', 'class_name='=>'string'], + 'DirectoryIterator::setInfoClass' => ['void', 'class_name='=>'string'], + 'DirectoryIterator::valid' => ['bool'], + 'DomAttribute::name' => ['string'], + 'DomAttribute::set_value' => ['bool', 'content'=>'string'], + 'DomAttribute::specified' => ['bool'], + 'DomAttribute::value' => ['string'], + 'DomDocumentType::entities' => ['array'], + 'DomDocumentType::internal_subset' => ['bool'], + 'DomDocumentType::name' => ['string'], + 'DomDocumentType::notations' => ['array'], + 'DomDocumentType::public_id' => ['string'], + 'DomDocumentType::system_id' => ['string'], + 'DomNode::add_namespace' => ['bool', 'uri'=>'string', 'prefix'=>'string'], + 'DomNode::append_child' => ['DOMNode', 'newnode'=>'DOMNode'], + 'DomProcessingInstruction::data' => ['string'], + 'DomProcessingInstruction::target' => ['string'], + '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'], + 'DomainException::__clone' => ['void'], + 'DomainException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?DomainException'], + 'DomainException::__toString' => ['string'], + 'DomainException::__wakeup' => ['void'], + 'DomainException::getCode' => ['int'], + 'DomainException::getFile' => ['string'], + 'DomainException::getLine' => ['int'], + 'DomainException::getMessage' => ['string'], + 'DomainException::getPrevious' => ['Throwable|DomainException|null'], + 'DomainException::getTrace' => ['list\',args?:array}>'], + 'DomainException::getTraceAsString' => ['string'], + 'Ds\Collection::clear' => ['void'], + 'Ds\Collection::copy' => ['Ds\Collection'], + 'Ds\Collection::isEmpty' => ['bool'], + 'Ds\Collection::toArray' => ['array'], + 'Ds\Deque::__construct' => ['void', 'values='=>'mixed'], + 'Ds\Deque::allocate' => ['void', 'capacity'=>'int'], + 'Ds\Deque::apply' => ['void', 'callback'=>'callable'], + 'Ds\Deque::capacity' => ['int'], + 'Ds\Deque::clear' => ['void'], + 'Ds\Deque::contains' => ['bool', '...values='=>'mixed'], + 'Ds\Deque::copy' => ['Ds\Deque'], + 'Ds\Deque::count' => ['int'], + 'Ds\Deque::filter' => ['Ds\Deque', 'callback='=>'callable'], + 'Ds\Deque::find' => ['mixed', 'value'=>'mixed'], + 'Ds\Deque::first' => ['mixed'], + 'Ds\Deque::get' => ['void', 'index'=>'int'], + 'Ds\Deque::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], + 'Ds\Deque::isEmpty' => ['bool'], + 'Ds\Deque::join' => ['string', 'glue='=>'string'], + 'Ds\Deque::jsonSerialize' => ['array'], + 'Ds\Deque::last' => ['mixed'], + 'Ds\Deque::map' => ['Ds\Deque', 'callback'=>'callable'], + 'Ds\Deque::merge' => ['Ds\Deque', 'values'=>'mixed'], + 'Ds\Deque::pop' => ['mixed'], + 'Ds\Deque::push' => ['void', '...values='=>'mixed'], + 'Ds\Deque::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], + 'Ds\Deque::remove' => ['mixed', 'index'=>'int'], + 'Ds\Deque::reverse' => ['void'], + 'Ds\Deque::reversed' => ['Ds\Deque'], + 'Ds\Deque::rotate' => ['void', 'rotations'=>'int'], + 'Ds\Deque::set' => ['void', 'index'=>'int', 'value'=>'mixed'], + 'Ds\Deque::shift' => ['mixed'], + 'Ds\Deque::slice' => ['Ds\Deque', 'index'=>'int', 'length='=>'?int'], + 'Ds\Deque::sort' => ['void', 'comparator='=>'callable'], + 'Ds\Deque::sorted' => ['Ds\Deque', 'comparator='=>'callable'], + 'Ds\Deque::sum' => ['int|float'], + 'Ds\Deque::toArray' => ['array'], + 'Ds\Deque::unshift' => ['void', '...values='=>'mixed'], + 'Ds\Hashable::equals' => ['bool', 'object'=>'mixed'], + 'Ds\Hashable::hash' => ['mixed'], + 'Ds\Map::__construct' => ['void', 'values='=>'mixed'], + 'Ds\Map::allocate' => ['void', 'capacity'=>'int'], + 'Ds\Map::apply' => ['void', 'callback'=>'callable'], + 'Ds\Map::capacity' => ['int'], + 'Ds\Map::clear' => ['void'], + 'Ds\Map::copy' => ['Ds\Map'], + 'Ds\Map::count' => ['int'], + 'Ds\Map::diff' => ['Ds\Map', 'map'=>'Ds\Map'], + 'Ds\Map::filter' => ['Ds\Map', 'callback='=>'callable'], + 'Ds\Map::first' => ['Ds\Pair'], + 'Ds\Map::get' => ['mixed', 'key'=>'mixed', 'default='=>'mixed'], + 'Ds\Map::hasKey' => ['bool', 'key'=>'mixed'], + 'Ds\Map::hasValue' => ['bool', 'value'=>'mixed'], + 'Ds\Map::intersect' => ['Ds\Map', 'map'=>'Ds\Map'], + 'Ds\Map::isEmpty' => ['bool'], + 'Ds\Map::jsonSerialize' => ['array'], + 'Ds\Map::keys' => ['Ds\Set'], + 'Ds\Map::ksort' => ['void', 'comparator='=>'callable'], + 'Ds\Map::ksorted' => ['Ds\Map', 'comparator='=>'callable'], + 'Ds\Map::last' => ['Ds\Pair'], + 'Ds\Map::map' => ['Ds\Map', 'callback'=>'callable'], + 'Ds\Map::merge' => ['Ds\Map', 'values'=>'mixed'], + 'Ds\Map::pairs' => ['Ds\Sequence'], + 'Ds\Map::put' => ['void', 'key'=>'mixed', 'value'=>'mixed'], + 'Ds\Map::putAll' => ['void', 'values'=>'mixed'], + 'Ds\Map::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], + 'Ds\Map::remove' => ['mixed', 'key'=>'mixed', 'default='=>'mixed'], + 'Ds\Map::reverse' => ['void'], + 'Ds\Map::reversed' => ['Ds\Map'], + 'Ds\Map::skip' => ['Ds\Pair', 'position'=>'int'], + 'Ds\Map::slice' => ['Ds\Map', 'index'=>'int', 'length='=>'?int'], + 'Ds\Map::sort' => ['void', 'comparator='=>'callable'], + 'Ds\Map::sorted' => ['Ds\Map', 'comparator='=>'callable'], + 'Ds\Map::sum' => ['int|float'], + 'Ds\Map::toArray' => ['array'], + 'Ds\Map::union' => ['Ds\Map', 'map'=>'Ds\Map'], + 'Ds\Map::values' => ['Ds\Sequence'], + 'Ds\Map::xor' => ['Ds\Map', 'map'=>'Ds\Map'], + 'Ds\Pair::__construct' => ['void', 'key='=>'mixed', 'value='=>'mixed'], + 'Ds\Pair::clear' => ['void'], + 'Ds\Pair::copy' => ['Ds\Pair'], + 'Ds\Pair::isEmpty' => ['bool'], + 'Ds\Pair::jsonSerialize' => ['array'], + 'Ds\Pair::toArray' => ['array'], + 'Ds\PriorityQueue::__construct' => ['void'], + 'Ds\PriorityQueue::allocate' => ['void', 'capacity'=>'int'], + 'Ds\PriorityQueue::capacity' => ['int'], + 'Ds\PriorityQueue::clear' => ['void'], + 'Ds\PriorityQueue::copy' => ['Ds\PriorityQueue'], + 'Ds\PriorityQueue::count' => ['int'], + 'Ds\PriorityQueue::isEmpty' => ['bool'], + 'Ds\PriorityQueue::jsonSerialize' => ['array'], + 'Ds\PriorityQueue::peek' => ['mixed'], + 'Ds\PriorityQueue::pop' => ['mixed'], + 'Ds\PriorityQueue::push' => ['void', 'value'=>'mixed', 'priority'=>'int'], + 'Ds\PriorityQueue::toArray' => ['array'], + 'Ds\Queue::__construct' => ['void', 'values='=>'mixed'], + 'Ds\Queue::allocate' => ['void', 'capacity'=>'int'], + 'Ds\Queue::capacity' => ['int'], + 'Ds\Queue::clear' => ['void'], + 'Ds\Queue::copy' => ['Ds\Queue'], + 'Ds\Queue::count' => ['int'], + 'Ds\Queue::isEmpty' => ['bool'], + 'Ds\Queue::jsonSerialize' => ['array'], + 'Ds\Queue::peek' => ['mixed'], + 'Ds\Queue::pop' => ['mixed'], + 'Ds\Queue::push' => ['void', '...values='=>'mixed'], + 'Ds\Queue::toArray' => ['array'], + 'Ds\Sequence::allocate' => ['void', 'capacity'=>'int'], + 'Ds\Sequence::apply' => ['void', 'callback'=>'callable'], + 'Ds\Sequence::capacity' => ['int'], + 'Ds\Sequence::contains' => ['bool', '...values='=>'mixed'], + 'Ds\Sequence::filter' => ['Ds\Sequence', 'callback='=>'callable'], + 'Ds\Sequence::find' => ['mixed', 'value'=>'mixed'], + 'Ds\Sequence::first' => ['mixed'], + 'Ds\Sequence::get' => ['mixed', 'index'=>'int'], + 'Ds\Sequence::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], + 'Ds\Sequence::join' => ['string', 'glue='=>'string'], + 'Ds\Sequence::last' => ['void'], + 'Ds\Sequence::map' => ['Ds\Sequence', 'callback'=>'callable'], + 'Ds\Sequence::merge' => ['Ds\Sequence', 'values'=>'mixed'], + 'Ds\Sequence::pop' => ['mixed'], + 'Ds\Sequence::push' => ['void', '...values='=>'mixed'], + 'Ds\Sequence::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], + 'Ds\Sequence::remove' => ['mixed', 'index'=>'int'], + 'Ds\Sequence::reverse' => ['void'], + 'Ds\Sequence::reversed' => ['Ds\Sequence'], + 'Ds\Sequence::rotate' => ['void', 'rotations'=>'int'], + 'Ds\Sequence::set' => ['void', 'index'=>'int', 'value'=>'mixed'], + 'Ds\Sequence::shift' => ['mixed'], + 'Ds\Sequence::slice' => ['Ds\Sequence', 'index'=>'int', 'length='=>'?int'], + 'Ds\Sequence::sort' => ['void', 'comparator='=>'callable'], + 'Ds\Sequence::sorted' => ['Ds\Sequence', 'comparator='=>'callable'], + 'Ds\Sequence::sum' => ['int|float'], + 'Ds\Sequence::unshift' => ['void', '...values='=>'mixed'], + 'Ds\Set::__construct' => ['void', 'values='=>'mixed'], + 'Ds\Set::add' => ['void', '...values='=>'mixed'], + 'Ds\Set::allocate' => ['void', 'capacity'=>'int'], + 'Ds\Set::capacity' => ['int'], + 'Ds\Set::clear' => ['void'], + 'Ds\Set::contains' => ['bool', '...values='=>'mixed'], + 'Ds\Set::copy' => ['Ds\Set'], + 'Ds\Set::count' => ['int'], + 'Ds\Set::diff' => ['Ds\Set', 'set'=>'Ds\Set'], + 'Ds\Set::filter' => ['Ds\Set', 'callback='=>'callable'], + 'Ds\Set::first' => ['mixed'], + 'Ds\Set::get' => ['mixed', 'index'=>'int'], + 'Ds\Set::intersect' => ['Ds\Set', 'set'=>'Ds\Set'], + 'Ds\Set::isEmpty' => ['bool'], + 'Ds\Set::join' => ['string', 'glue='=>'string'], + 'Ds\Set::jsonSerialize' => ['array'], + 'Ds\Set::last' => ['mixed'], + 'Ds\Set::merge' => ['Ds\Set', 'values'=>'mixed'], + 'Ds\Set::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], + 'Ds\Set::remove' => ['void', '...values='=>'mixed'], + 'Ds\Set::reverse' => ['void'], + 'Ds\Set::reversed' => ['Ds\Set'], + 'Ds\Set::slice' => ['Ds\Set', 'index'=>'int', 'length='=>'?int'], + 'Ds\Set::sort' => ['void', 'comparator='=>'callable'], + 'Ds\Set::sorted' => ['Ds\Set', 'comparator='=>'callable'], + 'Ds\Set::sum' => ['int|float'], + 'Ds\Set::toArray' => ['array'], + 'Ds\Set::union' => ['Ds\Set', 'set'=>'Ds\Set'], + 'Ds\Set::xor' => ['Ds\Set', 'set'=>'Ds\Set'], + 'Ds\Stack::__construct' => ['void', 'values='=>'mixed'], + 'Ds\Stack::allocate' => ['void', 'capacity'=>'int'], + 'Ds\Stack::capacity' => ['int'], + 'Ds\Stack::clear' => ['void'], + 'Ds\Stack::copy' => ['Ds\Stack'], + 'Ds\Stack::count' => ['int'], + 'Ds\Stack::isEmpty' => ['bool'], + 'Ds\Stack::jsonSerialize' => ['array'], + 'Ds\Stack::peek' => ['mixed'], + 'Ds\Stack::pop' => ['mixed'], + 'Ds\Stack::push' => ['void', '...values='=>'mixed'], + 'Ds\Stack::toArray' => ['array'], + 'Ds\Vector::__construct' => ['void', 'values='=>'mixed'], + 'Ds\Vector::allocate' => ['void', 'capacity'=>'int'], + 'Ds\Vector::apply' => ['void', 'callback'=>'callable'], + 'Ds\Vector::capacity' => ['int'], + 'Ds\Vector::clear' => ['void'], + 'Ds\Vector::contains' => ['bool', '...values='=>'mixed'], + 'Ds\Vector::copy' => ['Ds\Vector'], + 'Ds\Vector::count' => ['int'], + 'Ds\Vector::filter' => ['Ds\Vector', 'callback='=>'callable'], + 'Ds\Vector::find' => ['mixed', 'value'=>'mixed'], + 'Ds\Vector::first' => ['mixed'], + 'Ds\Vector::get' => ['mixed', 'index'=>'int'], + 'Ds\Vector::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], + 'Ds\Vector::isEmpty' => ['bool'], + 'Ds\Vector::join' => ['string', 'glue='=>'string'], + 'Ds\Vector::jsonSerialize' => ['array'], + 'Ds\Vector::last' => ['mixed'], + 'Ds\Vector::map' => ['Ds\Vector', 'callback'=>'callable'], + 'Ds\Vector::merge' => ['Ds\Vector', 'values'=>'mixed'], + 'Ds\Vector::pop' => ['mixed'], + 'Ds\Vector::push' => ['void', '...values='=>'mixed'], + 'Ds\Vector::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], + 'Ds\Vector::remove' => ['mixed', 'index'=>'int'], + 'Ds\Vector::reverse' => ['void'], + 'Ds\Vector::reversed' => ['Ds\Vector'], + 'Ds\Vector::rotate' => ['void', 'rotations'=>'int'], + 'Ds\Vector::set' => ['void', 'index'=>'int', 'value'=>'mixed'], + 'Ds\Vector::shift' => ['mixed'], + 'Ds\Vector::slice' => ['Ds\Vector', 'index'=>'int', 'length='=>'?int'], + 'Ds\Vector::sort' => ['void', 'comparator='=>'callable'], + 'Ds\Vector::sorted' => ['Ds\Vector', 'comparator='=>'callable'], + 'Ds\Vector::sum' => ['int|float'], + 'Ds\Vector::toArray' => ['array'], + 'Ds\Vector::unshift' => ['void', '...values='=>'mixed'], + 'EmptyIterator::current' => ['mixed'], + 'EmptyIterator::key' => ['mixed'], + 'EmptyIterator::next' => ['void'], + 'EmptyIterator::rewind' => ['void'], + 'EmptyIterator::valid' => ['bool'], + 'Error::__clone' => ['void'], + 'Error::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], + 'Error::__toString' => ['string'], + 'Error::getCode' => ['int'], + 'Error::getFile' => ['string'], + 'Error::getLine' => ['int'], + 'Error::getMessage' => ['string'], + 'Error::getPrevious' => ['Throwable|Error|null'], + 'Error::getTrace' => ['list\',args?:array}>'], + 'Error::getTraceAsString' => ['string'], + 'ErrorException::__clone' => ['void'], + 'ErrorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'severity='=>'int', 'filename='=>'string', 'line='=>'int', 'previous='=>'?Throwable|?ErrorException'], + 'ErrorException::__toString' => ['string'], + 'ErrorException::getCode' => ['int'], + 'ErrorException::getFile' => ['string'], + 'ErrorException::getLine' => ['int'], + 'ErrorException::getMessage' => ['string'], + 'ErrorException::getPrevious' => ['Throwable|ErrorException|null'], + 'ErrorException::getSeverity' => ['int'], + 'ErrorException::getTrace' => ['list\',args?:array}>'], + 'ErrorException::getTraceAsString' => ['string'], + 'Ev::backend' => ['int'], + 'Ev::depth' => ['int'], + 'Ev::embeddableBackends' => ['int'], + 'Ev::feedSignal' => ['void', 'signum'=>'int'], + 'Ev::feedSignalEvent' => ['void', 'signum'=>'int'], + 'Ev::iteration' => ['int'], + 'Ev::now' => ['float'], + 'Ev::nowUpdate' => ['void'], + 'Ev::recommendedBackends' => ['int'], + 'Ev::resume' => ['void'], + 'Ev::run' => ['void', 'flags='=>'int'], + 'Ev::sleep' => ['void', 'seconds'=>'float'], + 'Ev::stop' => ['void', 'how='=>'int'], + 'Ev::supportedBackends' => ['int'], + 'Ev::suspend' => ['void'], + 'Ev::time' => ['float'], + 'Ev::verify' => ['void'], + 'EvCheck::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvCheck::clear' => ['int'], + 'EvCheck::createStopped' => ['EvCheck', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvCheck::feed' => ['void', 'events'=>'int'], + 'EvCheck::getLoop' => ['EvLoop'], + 'EvCheck::invoke' => ['void', 'events'=>'int'], + 'EvCheck::keepAlive' => ['void', 'value'=>'bool'], + 'EvCheck::setCallback' => ['void', 'callback'=>'callable'], + 'EvCheck::start' => ['void'], + 'EvCheck::stop' => ['void'], + 'EvChild::__construct' => ['void', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvChild::clear' => ['int'], + 'EvChild::createStopped' => ['EvChild', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvChild::feed' => ['void', 'events'=>'int'], + 'EvChild::getLoop' => ['EvLoop'], + 'EvChild::invoke' => ['void', 'events'=>'int'], + 'EvChild::keepAlive' => ['void', 'value'=>'bool'], + 'EvChild::set' => ['void', 'pid'=>'int', 'trace'=>'bool'], + 'EvChild::setCallback' => ['void', 'callback'=>'callable'], + 'EvChild::start' => ['void'], + 'EvChild::stop' => ['void'], + 'EvEmbed::__construct' => ['void', 'other'=>'object', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvEmbed::clear' => ['int'], + 'EvEmbed::createStopped' => ['EvEmbed', 'other'=>'object', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvEmbed::feed' => ['void', 'events'=>'int'], + 'EvEmbed::getLoop' => ['EvLoop'], + 'EvEmbed::invoke' => ['void', 'events'=>'int'], + 'EvEmbed::keepAlive' => ['void', 'value'=>'bool'], + 'EvEmbed::set' => ['void', 'other'=>'object'], + 'EvEmbed::setCallback' => ['void', 'callback'=>'callable'], + 'EvEmbed::start' => ['void'], + 'EvEmbed::stop' => ['void'], + 'EvEmbed::sweep' => ['void'], + 'EvFork::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvFork::clear' => ['int'], + 'EvFork::createStopped' => ['EvFork', 'callback'=>'callable', 'data='=>'string', 'priority='=>'string'], + 'EvFork::feed' => ['void', 'events'=>'int'], + 'EvFork::getLoop' => ['EvLoop'], + 'EvFork::invoke' => ['void', 'events'=>'int'], + 'EvFork::keepAlive' => ['void', 'value'=>'bool'], + 'EvFork::setCallback' => ['void', 'callback'=>'callable'], + 'EvFork::start' => ['void'], + 'EvFork::stop' => ['void'], + 'EvIdle::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvIdle::clear' => ['int'], + 'EvIdle::createStopped' => ['EvIdle', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvIdle::feed' => ['void', 'events'=>'int'], + 'EvIdle::getLoop' => ['EvLoop'], + 'EvIdle::invoke' => ['void', 'events'=>'int'], + 'EvIdle::keepAlive' => ['void', 'value'=>'bool'], + 'EvIdle::setCallback' => ['void', 'callback'=>'callable'], + 'EvIdle::start' => ['void'], + 'EvIdle::stop' => ['void'], + 'EvIo::__construct' => ['void', 'fd'=>'mixed', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvIo::clear' => ['int'], + 'EvIo::createStopped' => ['EvIo', 'fd'=>'resource', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvIo::feed' => ['void', 'events'=>'int'], + 'EvIo::getLoop' => ['EvLoop'], + 'EvIo::invoke' => ['void', 'events'=>'int'], + 'EvIo::keepAlive' => ['void', 'value'=>'bool'], + 'EvIo::set' => ['void', 'fd'=>'resource', 'events'=>'int'], + 'EvIo::setCallback' => ['void', 'callback'=>'callable'], + 'EvIo::start' => ['void'], + 'EvIo::stop' => ['void'], + 'EvLoop::__construct' => ['void', 'flags='=>'int', 'data='=>'mixed', 'io_interval='=>'float', 'timeout_interval='=>'float'], + 'EvLoop::backend' => ['int'], + 'EvLoop::check' => ['EvCheck', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::child' => ['EvChild', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::defaultLoop' => ['EvLoop', 'flags='=>'int', 'data='=>'mixed', 'io_interval='=>'float', 'timeout_interval='=>'float'], + 'EvLoop::embed' => ['EvEmbed', 'other'=>'EvLoop', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::fork' => ['EvFork', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::idle' => ['EvIdle', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::invokePending' => ['void'], + 'EvLoop::io' => ['EvIo', 'fd'=>'resource', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::loopFork' => ['void'], + 'EvLoop::now' => ['float'], + 'EvLoop::nowUpdate' => ['void'], + 'EvLoop::periodic' => ['EvPeriodic', 'offset'=>'float', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::prepare' => ['EvPrepare', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::resume' => ['void'], + 'EvLoop::run' => ['void', 'flags='=>'int'], + 'EvLoop::signal' => ['EvSignal', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::stat' => ['EvStat', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::stop' => ['void', 'how='=>'int'], + 'EvLoop::suspend' => ['void'], + 'EvLoop::timer' => ['EvTimer', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvLoop::verify' => ['void'], + 'EvPeriodic::__construct' => ['void', 'offset'=>'float', 'interval'=>'string', 'reschedule_cb'=>'callable', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvPeriodic::again' => ['void'], + 'EvPeriodic::at' => ['float'], + 'EvPeriodic::clear' => ['int'], + 'EvPeriodic::createStopped' => ['EvPeriodic', 'offset'=>'float', 'interval'=>'float', 'reschedule_cb'=>'callable', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvPeriodic::feed' => ['void', 'events'=>'int'], + 'EvPeriodic::getLoop' => ['EvLoop'], + 'EvPeriodic::invoke' => ['void', 'events'=>'int'], + 'EvPeriodic::keepAlive' => ['void', 'value'=>'bool'], + 'EvPeriodic::set' => ['void', 'offset'=>'float', 'interval'=>'float'], + 'EvPeriodic::setCallback' => ['void', 'callback'=>'callable'], + 'EvPeriodic::start' => ['void'], + 'EvPeriodic::stop' => ['void'], + 'EvPrepare::__construct' => ['void', 'callback'=>'string', 'data='=>'string', 'priority='=>'string'], + 'EvPrepare::clear' => ['int'], + 'EvPrepare::createStopped' => ['EvPrepare', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvPrepare::feed' => ['void', 'events'=>'int'], + 'EvPrepare::getLoop' => ['EvLoop'], + 'EvPrepare::invoke' => ['void', 'events'=>'int'], + 'EvPrepare::keepAlive' => ['void', 'value'=>'bool'], + 'EvPrepare::setCallback' => ['void', 'callback'=>'callable'], + 'EvPrepare::start' => ['void'], + 'EvPrepare::stop' => ['void'], + 'EvSignal::__construct' => ['void', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvSignal::clear' => ['int'], + 'EvSignal::createStopped' => ['EvSignal', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvSignal::feed' => ['void', 'events'=>'int'], + 'EvSignal::getLoop' => ['EvLoop'], + 'EvSignal::invoke' => ['void', 'events'=>'int'], + 'EvSignal::keepAlive' => ['void', 'value'=>'bool'], + 'EvSignal::set' => ['void', 'signum'=>'int'], + 'EvSignal::setCallback' => ['void', 'callback'=>'callable'], + 'EvSignal::start' => ['void'], + 'EvSignal::stop' => ['void'], + 'EvStat::__construct' => ['void', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvStat::attr' => ['array'], + 'EvStat::clear' => ['int'], + 'EvStat::createStopped' => ['EvStat', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvStat::feed' => ['void', 'events'=>'int'], + 'EvStat::getLoop' => ['EvLoop'], + 'EvStat::invoke' => ['void', 'events'=>'int'], + 'EvStat::keepAlive' => ['void', 'value'=>'bool'], + 'EvStat::prev' => ['array'], + 'EvStat::set' => ['void', 'path'=>'string', 'interval'=>'float'], + 'EvStat::setCallback' => ['void', 'callback'=>'callable'], + 'EvStat::start' => ['void'], + 'EvStat::stat' => ['bool'], + 'EvStat::stop' => ['void'], + 'EvTimer::__construct' => ['void', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvTimer::again' => ['void'], + 'EvTimer::clear' => ['int'], + 'EvTimer::createStopped' => ['EvTimer', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], + 'EvTimer::feed' => ['void', 'events'=>'int'], + 'EvTimer::getLoop' => ['EvLoop'], + 'EvTimer::invoke' => ['void', 'events'=>'int'], + 'EvTimer::keepAlive' => ['void', 'value'=>'bool'], + 'EvTimer::set' => ['void', 'after'=>'float', 'repeat'=>'float'], + 'EvTimer::setCallback' => ['void', 'callback'=>'callable'], + 'EvTimer::start' => ['void'], + 'EvTimer::stop' => ['void'], + 'EvWatcher::__construct' => ['void'], + 'EvWatcher::clear' => ['int'], + 'EvWatcher::feed' => ['void', 'revents'=>'int'], + 'EvWatcher::getLoop' => ['EvLoop'], + 'EvWatcher::invoke' => ['void', 'revents'=>'int'], + 'EvWatcher::keepalive' => ['bool', 'value='=>'bool'], + 'EvWatcher::setCallback' => ['void', 'callback'=>'callable'], + 'EvWatcher::start' => ['void'], + 'EvWatcher::stop' => ['void'], + 'Event::__construct' => ['void', 'base'=>'EventBase', 'fd'=>'mixed', 'what'=>'int', 'cb'=>'callable', 'arg='=>'mixed'], + 'Event::add' => ['bool', 'timeout='=>'float'], + 'Event::addSignal' => ['bool', 'timeout='=>'float'], + 'Event::addTimer' => ['bool', 'timeout='=>'float'], + 'Event::del' => ['bool'], + 'Event::delSignal' => ['bool'], + 'Event::delTimer' => ['bool'], + 'Event::free' => ['void'], + 'Event::getSupportedMethods' => ['array'], + 'Event::pending' => ['bool', 'flags'=>'int'], + 'Event::set' => ['bool', 'base'=>'EventBase', 'fd'=>'mixed', 'what='=>'int', 'cb='=>'callable', 'arg='=>'mixed'], + 'Event::setPriority' => ['bool', 'priority'=>'int'], + 'Event::setTimer' => ['bool', 'base'=>'EventBase', 'cb'=>'callable', 'arg='=>'mixed'], + 'Event::signal' => ['Event', 'base'=>'EventBase', 'signum'=>'int', 'cb'=>'callable', 'arg='=>'mixed'], + 'Event::timer' => ['Event', 'base'=>'EventBase', 'cb'=>'callable', 'arg='=>'mixed'], + 'EventBase::__construct' => ['void', 'cfg='=>'EventConfig'], + 'EventBase::dispatch' => ['void'], + 'EventBase::exit' => ['bool', 'timeout='=>'float'], + 'EventBase::free' => ['void'], + 'EventBase::getFeatures' => ['int'], + 'EventBase::getMethod' => ['string', 'cfg='=>'EventConfig'], + 'EventBase::getTimeOfDayCached' => ['float'], + 'EventBase::gotExit' => ['bool'], + 'EventBase::gotStop' => ['bool'], + 'EventBase::loop' => ['bool', 'flags='=>'int'], + 'EventBase::priorityInit' => ['bool', 'n_priorities'=>'int'], + 'EventBase::reInit' => ['bool'], + 'EventBase::stop' => ['bool'], + 'EventBuffer::__construct' => ['void'], + 'EventBuffer::add' => ['bool', 'data'=>'string'], + 'EventBuffer::addBuffer' => ['bool', 'buf'=>'EventBuffer'], + 'EventBuffer::appendFrom' => ['int', 'buf'=>'EventBuffer', 'length'=>'int'], + 'EventBuffer::copyout' => ['int', '&w_data'=>'string', 'max_bytes'=>'int'], + 'EventBuffer::drain' => ['bool', 'length'=>'int'], + 'EventBuffer::enableLocking' => ['void'], + 'EventBuffer::expand' => ['bool', 'length'=>'int'], + 'EventBuffer::freeze' => ['bool', 'at_front'=>'bool'], + 'EventBuffer::lock' => ['void'], + 'EventBuffer::prepend' => ['bool', 'data'=>'string'], + 'EventBuffer::prependBuffer' => ['bool', 'buf'=>'EventBuffer'], + 'EventBuffer::pullup' => ['string', 'size'=>'int'], + 'EventBuffer::read' => ['string', 'max_bytes'=>'int'], + 'EventBuffer::readFrom' => ['int', 'fd'=>'mixed', 'howmuch'=>'int'], + 'EventBuffer::readLine' => ['string', 'eol_style'=>'int'], + 'EventBuffer::search' => ['mixed', 'what'=>'string', 'start='=>'int', 'end='=>'int'], + 'EventBuffer::searchEol' => ['mixed', 'start='=>'int', 'eol_style='=>'int'], + 'EventBuffer::substr' => ['string', 'start'=>'int', 'length='=>'int'], + 'EventBuffer::unfreeze' => ['bool', 'at_front'=>'bool'], + 'EventBuffer::unlock' => ['bool'], + 'EventBuffer::write' => ['int', 'fd'=>'mixed', 'howmuch='=>'int'], + 'EventBufferEvent::__construct' => ['void', 'base'=>'EventBase', 'socket='=>'mixed', 'options='=>'int', 'readcb='=>'callable', 'writecb='=>'callable', 'eventcb='=>'callable'], + 'EventBufferEvent::close' => ['void'], + 'EventBufferEvent::connect' => ['bool', 'addr'=>'string'], + 'EventBufferEvent::connectHost' => ['bool', 'dns_base'=>'EventDnsBase', 'hostname'=>'string', 'port'=>'int', 'family='=>'int'], + 'EventBufferEvent::createPair' => ['array', 'base'=>'EventBase', 'options='=>'int'], + 'EventBufferEvent::disable' => ['bool', 'events'=>'int'], + 'EventBufferEvent::enable' => ['bool', 'events'=>'int'], + 'EventBufferEvent::free' => ['void'], + 'EventBufferEvent::getDnsErrorString' => ['string'], + 'EventBufferEvent::getEnabled' => ['int'], + 'EventBufferEvent::getInput' => ['EventBuffer'], + 'EventBufferEvent::getOutput' => ['EventBuffer'], + 'EventBufferEvent::read' => ['string', 'size'=>'int'], + 'EventBufferEvent::readBuffer' => ['bool', 'buf'=>'EventBuffer'], + 'EventBufferEvent::setCallbacks' => ['void', 'readcb'=>'callable', 'writecb'=>'callable', 'eventcb'=>'callable', 'arg='=>'string'], + 'EventBufferEvent::setPriority' => ['bool', 'priority'=>'int'], + 'EventBufferEvent::setTimeouts' => ['bool', 'timeout_read'=>'float', 'timeout_write'=>'float'], + 'EventBufferEvent::setWatermark' => ['void', 'events'=>'int', 'lowmark'=>'int', 'highmark'=>'int'], + 'EventBufferEvent::sslError' => ['string'], + 'EventBufferEvent::sslFilter' => ['EventBufferEvent', 'base'=>'EventBase', 'underlying'=>'EventBufferEvent', 'ctx'=>'EventSslContext', 'state'=>'int', 'options='=>'int'], + 'EventBufferEvent::sslGetCipherInfo' => ['string'], + 'EventBufferEvent::sslGetCipherName' => ['string'], + 'EventBufferEvent::sslGetCipherVersion' => ['string'], + 'EventBufferEvent::sslGetProtocol' => ['string'], + 'EventBufferEvent::sslRenegotiate' => ['void'], + 'EventBufferEvent::sslSocket' => ['EventBufferEvent', 'base'=>'EventBase', 'socket'=>'mixed', 'ctx'=>'EventSslContext', 'state'=>'int', 'options='=>'int'], + 'EventBufferEvent::write' => ['bool', 'data'=>'string'], + 'EventBufferEvent::writeBuffer' => ['bool', 'buf'=>'EventBuffer'], + 'EventConfig::__construct' => ['void'], + 'EventConfig::avoidMethod' => ['bool', 'method'=>'string'], + 'EventConfig::requireFeatures' => ['bool', 'feature'=>'int'], + 'EventConfig::setMaxDispatchInterval' => ['void', 'max_interval'=>'int', 'max_callbacks'=>'int', 'min_priority'=>'int'], + 'EventDnsBase::__construct' => ['void', 'base'=>'EventBase', 'initialize'=>'bool'], + 'EventDnsBase::addNameserverIp' => ['bool', 'ip'=>'string'], + 'EventDnsBase::addSearch' => ['void', 'domain'=>'string'], + 'EventDnsBase::clearSearch' => ['void'], + 'EventDnsBase::countNameservers' => ['int'], + 'EventDnsBase::loadHosts' => ['bool', 'hosts'=>'string'], + 'EventDnsBase::parseResolvConf' => ['bool', 'flags'=>'int', 'filename'=>'string'], + 'EventDnsBase::setOption' => ['bool', 'option'=>'string', 'value'=>'string'], + 'EventDnsBase::setSearchNdots' => ['bool', 'ndots'=>'int'], + 'EventHttp::__construct' => ['void', 'base'=>'EventBase', 'ctx='=>'EventSslContext'], + 'EventHttp::accept' => ['bool', 'socket'=>'mixed'], + 'EventHttp::addServerAlias' => ['bool', 'alias'=>'string'], + 'EventHttp::bind' => ['void', 'address'=>'string', 'port'=>'int'], + 'EventHttp::removeServerAlias' => ['bool', 'alias'=>'string'], + 'EventHttp::setAllowedMethods' => ['void', 'methods'=>'int'], + 'EventHttp::setCallback' => ['void', 'path'=>'string', 'cb'=>'string', 'arg='=>'string'], + 'EventHttp::setDefaultCallback' => ['void', 'cb'=>'string', 'arg='=>'string'], + 'EventHttp::setMaxBodySize' => ['void', 'value'=>'int'], + 'EventHttp::setMaxHeadersSize' => ['void', 'value'=>'int'], + 'EventHttp::setTimeout' => ['void', 'value'=>'int'], + 'EventHttpConnection::__construct' => ['void', 'base'=>'EventBase', 'dns_base'=>'EventDnsBase', 'address'=>'string', 'port'=>'int', 'ctx='=>'EventSslContext'], + 'EventHttpConnection::getBase' => ['EventBase'], + 'EventHttpConnection::getPeer' => ['void', '&w_address'=>'string', '&w_port'=>'int'], + 'EventHttpConnection::makeRequest' => ['bool', 'req'=>'EventHttpRequest', 'type'=>'int', 'uri'=>'string'], + 'EventHttpConnection::setCloseCallback' => ['void', 'callback'=>'callable', 'data='=>'mixed'], + 'EventHttpConnection::setLocalAddress' => ['void', 'address'=>'string'], + 'EventHttpConnection::setLocalPort' => ['void', 'port'=>'int'], + 'EventHttpConnection::setMaxBodySize' => ['void', 'max_size'=>'string'], + 'EventHttpConnection::setMaxHeadersSize' => ['void', 'max_size'=>'string'], + 'EventHttpConnection::setRetries' => ['void', 'retries'=>'int'], + 'EventHttpConnection::setTimeout' => ['void', 'timeout'=>'int'], + 'EventHttpRequest::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed'], + 'EventHttpRequest::addHeader' => ['bool', 'key'=>'string', 'value'=>'string', 'type'=>'int'], + 'EventHttpRequest::cancel' => ['void'], + 'EventHttpRequest::clearHeaders' => ['void'], + 'EventHttpRequest::closeConnection' => ['void'], + 'EventHttpRequest::findHeader' => ['void', 'key'=>'string', 'type'=>'string'], + 'EventHttpRequest::free' => ['void'], + 'EventHttpRequest::getBufferEvent' => ['EventBufferEvent'], + 'EventHttpRequest::getCommand' => ['void'], + 'EventHttpRequest::getConnection' => ['EventHttpConnection'], + 'EventHttpRequest::getHost' => ['string'], + 'EventHttpRequest::getInputBuffer' => ['EventBuffer'], + 'EventHttpRequest::getInputHeaders' => ['array'], + 'EventHttpRequest::getOutputBuffer' => ['EventBuffer'], + 'EventHttpRequest::getOutputHeaders' => ['void'], + 'EventHttpRequest::getResponseCode' => ['int'], + 'EventHttpRequest::getUri' => ['string'], + 'EventHttpRequest::removeHeader' => ['void', 'key'=>'string', 'type'=>'string'], + 'EventHttpRequest::sendError' => ['void', 'error'=>'int', 'reason='=>'string'], + 'EventHttpRequest::sendReply' => ['void', 'code'=>'int', 'reason'=>'string', 'buf='=>'EventBuffer'], + 'EventHttpRequest::sendReplyChunk' => ['void', 'buf'=>'EventBuffer'], + 'EventHttpRequest::sendReplyEnd' => ['void'], + 'EventHttpRequest::sendReplyStart' => ['void', 'code'=>'int', 'reason'=>'string'], + 'EventListener::__construct' => ['void', 'base'=>'EventBase', 'cb'=>'callable', 'data'=>'mixed', 'flags'=>'int', 'backlog'=>'int', 'target'=>'mixed'], + 'EventListener::disable' => ['bool'], + 'EventListener::enable' => ['bool'], + 'EventListener::getBase' => ['void'], + 'EventListener::getSocketName' => ['bool', '&w_address'=>'string', '&w_port='=>'mixed'], + 'EventListener::setCallback' => ['void', 'cb'=>'callable', 'arg='=>'mixed'], + 'EventListener::setErrorCallback' => ['void', 'cb'=>'string'], + 'EventSslContext::__construct' => ['void', 'method'=>'string', 'options'=>'string'], + 'EventUtil::__construct' => ['void'], + 'EventUtil::getLastSocketErrno' => ['int', 'socket='=>'mixed'], + 'EventUtil::getLastSocketError' => ['string', 'socket='=>'mixed'], + 'EventUtil::getSocketFd' => ['int', 'socket'=>'mixed'], + 'EventUtil::getSocketName' => ['bool', 'socket'=>'mixed', '&w_address'=>'string', '&w_port='=>'mixed'], + 'EventUtil::setSocketOption' => ['bool', 'socket'=>'mixed', 'level'=>'int', 'optname'=>'int', 'optval'=>'mixed'], + 'EventUtil::sslRandPoll' => ['void'], + 'Exception::__clone' => ['void'], + 'Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Exception'], + 'Exception::__toString' => ['string'], + 'Exception::getCode' => ['int|string'], + 'Exception::getFile' => ['string'], + 'Exception::getLine' => ['int'], + 'Exception::getMessage' => ['string'], + 'Exception::getPrevious' => ['?Throwable|?Exception'], + 'Exception::getTrace' => ['list\',args?:array}>'], + 'Exception::getTraceAsString' => ['string'], + 'FANNConnection::__construct' => ['void', 'from_neuron'=>'int', 'to_neuron'=>'int', 'weight'=>'float'], + 'FANNConnection::getFromNeuron' => ['int'], + 'FANNConnection::getToNeuron' => ['int'], + 'FANNConnection::getWeight' => ['void'], + 'FANNConnection::setWeight' => ['bool', 'weight'=>'float'], + 'FilesystemIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], + 'FilesystemIterator::__toString' => ['string'], + 'FilesystemIterator::_bad_state_ex' => [''], + 'FilesystemIterator::current' => ['mixed'], + 'FilesystemIterator::getATime' => ['int'], + 'FilesystemIterator::getBasename' => ['string', 'suffix='=>'string'], + 'FilesystemIterator::getCTime' => ['int'], + 'FilesystemIterator::getExtension' => ['string'], + 'FilesystemIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'FilesystemIterator::getFilename' => ['string'], + 'FilesystemIterator::getFlags' => ['int'], + 'FilesystemIterator::getGroup' => ['int'], + 'FilesystemIterator::getInode' => ['int'], + 'FilesystemIterator::getLinkTarget' => ['string'], + 'FilesystemIterator::getMTime' => ['int'], + 'FilesystemIterator::getOwner' => ['int'], + 'FilesystemIterator::getPath' => ['string'], + 'FilesystemIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'FilesystemIterator::getPathname' => ['string'], + 'FilesystemIterator::getPerms' => ['int'], + 'FilesystemIterator::getRealPath' => ['string'], + 'FilesystemIterator::getSize' => ['int'], + 'FilesystemIterator::getType' => ['string'], + 'FilesystemIterator::isDir' => ['bool'], + 'FilesystemIterator::isDot' => ['bool'], + 'FilesystemIterator::isExecutable' => ['bool'], + 'FilesystemIterator::isFile' => ['bool'], + 'FilesystemIterator::isLink' => ['bool'], + 'FilesystemIterator::isReadable' => ['bool'], + 'FilesystemIterator::isWritable' => ['bool'], + 'FilesystemIterator::key' => ['string'], + 'FilesystemIterator::next' => ['void'], + 'FilesystemIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'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::valid' => ['bool'], + 'FilterIterator::__construct' => ['void', 'iterator'=>'Iterator'], + 'FilterIterator::accept' => ['bool'], + 'FilterIterator::current' => ['mixed'], + 'FilterIterator::getInnerIterator' => ['Iterator'], + 'FilterIterator::key' => ['mixed'], + 'FilterIterator::next' => ['void'], + 'FilterIterator::rewind' => ['void'], + 'FilterIterator::valid' => ['bool'], + 'GEOSGeometry::__toString' => ['string'], + 'GEOSGeometry::area' => ['float'], + 'GEOSGeometry::boundary' => ['GEOSGeometry'], + 'GEOSGeometry::buffer' => ['GEOSGeometry', 'dist'=>'float', 'styleArray='=>'array'], + 'GEOSGeometry::centroid' => ['GEOSGeometry'], + 'GEOSGeometry::checkValidity' => ['array{valid: bool, reason?: string, location?: GEOSGeometry}'], + 'GEOSGeometry::contains' => ['bool', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::convexHull' => ['GEOSGeometry'], + 'GEOSGeometry::coordinateDimension' => ['int'], + 'GEOSGeometry::coveredBy' => ['bool', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::covers' => ['bool', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::crosses' => ['bool', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::delaunayTriangulation' => ['GEOSGeometry', 'tolerance'=>'float', 'onlyEdges'=>'bool'], + 'GEOSGeometry::difference' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::dimension' => ['int'], + 'GEOSGeometry::disjoint' => ['bool', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::distance' => ['float', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::endPoint' => ['GEOSGeometry'], + 'GEOSGeometry::envelope' => ['GEOSGeometry'], + 'GEOSGeometry::equals' => ['bool', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::equalsExact' => ['bool', 'geom'=>'GEOSGeometry', 'tolerance'=>'float'], + 'GEOSGeometry::exteriorRing' => ['GEOSGeometry'], + 'GEOSGeometry::extractUniquePoints' => ['GEOSGeometry'], + 'GEOSGeometry::geometryN' => ['GEOSGeometry', 'num'=>'int'], + 'GEOSGeometry::getSRID' => ['int'], + 'GEOSGeometry::getX' => ['float'], + 'GEOSGeometry::getY' => ['float'], + 'GEOSGeometry::hasZ' => ['bool'], + 'GEOSGeometry::hausdorffDistance' => ['float', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::interiorRingN' => ['GEOSGeometry', 'num'=>'int'], + 'GEOSGeometry::interpolate' => ['GEOSGeometry', 'dist'=>'float', 'normalized'=>'bool'], + 'GEOSGeometry::intersection' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::intersects' => ['bool', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::isClosed' => ['bool'], + 'GEOSGeometry::isEmpty' => ['bool'], + 'GEOSGeometry::isRing' => ['bool'], + 'GEOSGeometry::isSimple' => ['bool'], + 'GEOSGeometry::length' => ['float'], + 'GEOSGeometry::node' => ['GEOSGeometry'], + 'GEOSGeometry::normalize' => ['GEOSGeometry'], + 'GEOSGeometry::numCoordinates' => ['int'], + 'GEOSGeometry::numGeometries' => ['int'], + 'GEOSGeometry::numInteriorRings' => ['int'], + 'GEOSGeometry::numPoints' => ['int'], + 'GEOSGeometry::offsetCurve' => ['GEOSGeometry', 'dist'=>'float', 'styleArray'=>'array'], + 'GEOSGeometry::overlaps' => ['bool', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::pointN' => ['GEOSGeometry', 'num'=>'int'], + 'GEOSGeometry::pointOnSurface' => ['GEOSGeometry'], + 'GEOSGeometry::project' => ['float', 'other'=>'GEOSGeometry', 'normalized'=>'bool'], + 'GEOSGeometry::relate' => ['string|bool', 'otherGeom'=>'GEOSGeometry', 'pattern'=>'string'], + 'GEOSGeometry::relateBoundaryNodeRule' => ['string', 'otherGeom'=>'GEOSGeometry', 'rule'=>'int'], + 'GEOSGeometry::setSRID' => ['void', 'srid'=>'int'], + 'GEOSGeometry::simplify' => ['GEOSGeometry', 'tolerance'=>'float', 'preserveTopology='=>'bool'], + 'GEOSGeometry::snapTo' => ['GEOSGeometry', 'geom'=>'GEOSGeometry', 'tolerance'=>'float'], + 'GEOSGeometry::startPoint' => ['GEOSGeometry'], + 'GEOSGeometry::symDifference' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::touches' => ['bool', 'geom'=>'GEOSGeometry'], + 'GEOSGeometry::typeId' => ['int'], + 'GEOSGeometry::typeName' => ['string'], + 'GEOSGeometry::union' => ['GEOSGeometry', 'otherGeom='=>'GEOSGeometry'], + 'GEOSGeometry::voronoiDiagram' => ['GEOSGeometry', 'tolerance'=>'float', 'onlyEdges'=>'bool', 'extent'=>'GEOSGeometry|null'], + 'GEOSGeometry::within' => ['bool', 'geom'=>'GEOSGeometry'], + 'GEOSLineMerge' => ['array', 'geom'=>'GEOSGeometry'], + 'GEOSPolygonize' => ['array{rings: GEOSGeometry[], cut_edges?: GEOSGeometry[], dangles: GEOSGeometry[], invalid_rings: GEOSGeometry[]}', 'geom'=>'GEOSGeometry'], + 'GEOSRelateMatch' => ['bool', 'matrix'=>'string', 'pattern'=>'string'], + 'GEOSSharedPaths' => ['GEOSGeometry', 'geom1'=>'GEOSGeometry', 'geom2'=>'GEOSGeometry'], + 'GEOSVersion' => ['string'], + 'GEOSWKBReader::__construct' => ['void'], + 'GEOSWKBReader::read' => ['GEOSGeometry', 'wkb'=>'string'], + 'GEOSWKBReader::readHEX' => ['GEOSGeometry', 'wkb'=>'string'], + 'GEOSWKBWriter::__construct' => ['void'], + 'GEOSWKBWriter::getByteOrder' => ['int'], + 'GEOSWKBWriter::getIncludeSRID' => ['bool'], + 'GEOSWKBWriter::getOutputDimension' => ['int'], + 'GEOSWKBWriter::setByteOrder' => ['void', 'byteOrder'=>'int'], + 'GEOSWKBWriter::setIncludeSRID' => ['void', 'inc'=>'bool'], + 'GEOSWKBWriter::setOutputDimension' => ['void', 'dim'=>'int'], + 'GEOSWKBWriter::write' => ['string', 'geom'=>'GEOSGeometry'], + 'GEOSWKBWriter::writeHEX' => ['string', 'geom'=>'GEOSGeometry'], + 'GEOSWKTReader::__construct' => ['void'], + 'GEOSWKTReader::read' => ['GEOSGeometry', 'wkt'=>'string'], + 'GEOSWKTWriter::__construct' => ['void'], + 'GEOSWKTWriter::getOutputDimension' => ['int'], + 'GEOSWKTWriter::setOld3D' => ['void', 'val'=>'bool'], + 'GEOSWKTWriter::setOutputDimension' => ['void', 'dim'=>'int'], + 'GEOSWKTWriter::setRoundingPrecision' => ['void', 'prec'=>'int'], + 'GEOSWKTWriter::setTrim' => ['void', 'trim'=>'bool'], + 'GEOSWKTWriter::write' => ['string', 'geom'=>'GEOSGeometry'], + 'GMP::__construct' => ['void'], + 'GMP::__toString' => ['numeric-string'], + 'GMP::serialize' => ['string'], + 'GMP::unserialize' => ['void', 'serialized'=>'string'], + 'GearmanClient::__construct' => ['void'], + 'GearmanClient::addOptions' => ['bool', 'options'=>'int'], + 'GearmanClient::addServer' => ['bool', 'host='=>'string', 'port='=>'int'], + 'GearmanClient::addServers' => ['bool', 'servers='=>'string'], + 'GearmanClient::addTask' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], + 'GearmanClient::addTaskBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], + 'GearmanClient::addTaskHigh' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], + 'GearmanClient::addTaskHighBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], + 'GearmanClient::addTaskLow' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], + 'GearmanClient::addTaskLowBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], + 'GearmanClient::addTaskStatus' => ['GearmanTask', 'job_handle'=>'string', 'context='=>'string'], + 'GearmanClient::clearCallbacks' => ['bool'], + 'GearmanClient::clone' => ['GearmanClient'], + 'GearmanClient::context' => ['string'], + 'GearmanClient::data' => ['string'], + 'GearmanClient::do' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], + 'GearmanClient::doBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], + 'GearmanClient::doHigh' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], + 'GearmanClient::doHighBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], + 'GearmanClient::doJobHandle' => ['string'], + 'GearmanClient::doLow' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], + 'GearmanClient::doLowBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], + 'GearmanClient::doNormal' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], + 'GearmanClient::doStatus' => ['array'], + 'GearmanClient::echo' => ['bool', 'workload'=>'string'], + 'GearmanClient::error' => ['string'], + 'GearmanClient::getErrno' => ['int'], + 'GearmanClient::jobStatus' => ['array', 'job_handle'=>'string'], + 'GearmanClient::options' => [''], + 'GearmanClient::ping' => ['bool', 'workload'=>'string'], + 'GearmanClient::removeOptions' => ['bool', 'options'=>'int'], + 'GearmanClient::returnCode' => ['int'], + 'GearmanClient::runTasks' => ['bool'], + 'GearmanClient::setClientCallback' => ['void', 'callback'=>'callable'], + 'GearmanClient::setCompleteCallback' => ['bool', 'callback'=>'callable'], + 'GearmanClient::setContext' => ['bool', 'context'=>'string'], + 'GearmanClient::setCreatedCallback' => ['bool', 'callback'=>'string'], + 'GearmanClient::setData' => ['bool', 'data'=>'string'], + 'GearmanClient::setDataCallback' => ['bool', 'callback'=>'callable'], + 'GearmanClient::setExceptionCallback' => ['bool', 'callback'=>'callable'], + 'GearmanClient::setFailCallback' => ['bool', 'callback'=>'callable'], + 'GearmanClient::setOptions' => ['bool', 'options'=>'int'], + 'GearmanClient::setStatusCallback' => ['bool', 'callback'=>'callable'], + 'GearmanClient::setTimeout' => ['bool', 'timeout'=>'int'], + 'GearmanClient::setWarningCallback' => ['bool', 'callback'=>'callable'], + 'GearmanClient::setWorkloadCallback' => ['bool', 'callback'=>'callable'], + 'GearmanClient::timeout' => ['int'], + 'GearmanClient::wait' => [''], + 'GearmanJob::__construct' => ['void'], + 'GearmanJob::complete' => ['bool', 'result'=>'string'], + 'GearmanJob::data' => ['bool', 'data'=>'string'], + 'GearmanJob::exception' => ['bool', 'exception'=>'string'], + 'GearmanJob::fail' => ['bool'], + 'GearmanJob::functionName' => ['string'], + 'GearmanJob::handle' => ['string'], + 'GearmanJob::returnCode' => ['int'], + 'GearmanJob::sendComplete' => ['bool', 'result'=>'string'], + 'GearmanJob::sendData' => ['bool', 'data'=>'string'], + 'GearmanJob::sendException' => ['bool', 'exception'=>'string'], + 'GearmanJob::sendFail' => ['bool'], + 'GearmanJob::sendStatus' => ['bool', 'numerator'=>'int', 'denominator'=>'int'], + 'GearmanJob::sendWarning' => ['bool', 'warning'=>'string'], + 'GearmanJob::setReturn' => ['bool', 'gearman_return_t'=>'string'], + 'GearmanJob::status' => ['bool', 'numerator'=>'int', 'denominator'=>'int'], + 'GearmanJob::unique' => ['string'], + 'GearmanJob::warning' => ['bool', 'warning'=>'string'], + 'GearmanJob::workload' => ['string'], + 'GearmanJob::workloadSize' => ['int'], + 'GearmanTask::__construct' => ['void'], + 'GearmanTask::create' => ['GearmanTask'], + 'GearmanTask::data' => ['string|false'], + 'GearmanTask::dataSize' => ['int|false'], + 'GearmanTask::function' => ['string'], + 'GearmanTask::functionName' => ['string'], + 'GearmanTask::isKnown' => ['bool'], + 'GearmanTask::isRunning' => ['bool'], + 'GearmanTask::jobHandle' => ['string'], + 'GearmanTask::recvData' => ['array|false', 'data_len'=>'int'], + 'GearmanTask::returnCode' => ['int'], + 'GearmanTask::sendData' => ['int', 'data'=>'string'], + 'GearmanTask::sendWorkload' => ['int|false', 'data'=>'string'], + 'GearmanTask::taskDenominator' => ['int|false'], + 'GearmanTask::taskNumerator' => ['int|false'], + 'GearmanTask::unique' => ['string|false'], + 'GearmanTask::uuid' => ['string'], + 'GearmanWorker::__construct' => ['void'], + 'GearmanWorker::addFunction' => ['bool', 'function_name'=>'string', 'function'=>'callable', 'context='=>'mixed', 'timeout='=>'int'], + 'GearmanWorker::addOptions' => ['bool', 'option'=>'int'], + 'GearmanWorker::addServer' => ['bool', 'host='=>'string', 'port='=>'int'], + 'GearmanWorker::addServers' => ['bool', 'servers'=>'string'], + 'GearmanWorker::clone' => ['void'], + 'GearmanWorker::echo' => ['bool', 'workload'=>'string'], + 'GearmanWorker::error' => ['string'], + 'GearmanWorker::getErrno' => ['int'], + 'GearmanWorker::grabJob' => [''], + 'GearmanWorker::options' => ['int'], + 'GearmanWorker::register' => ['bool', 'function_name'=>'string', 'timeout='=>'int'], + 'GearmanWorker::removeOptions' => ['bool', 'option'=>'int'], + 'GearmanWorker::returnCode' => ['int'], + 'GearmanWorker::setId' => ['bool', 'id'=>'string'], + 'GearmanWorker::setOptions' => ['bool', 'option'=>'int'], + 'GearmanWorker::setTimeout' => ['bool', 'timeout'=>'int'], + 'GearmanWorker::timeout' => ['int'], + 'GearmanWorker::unregister' => ['bool', 'function_name'=>'string'], + 'GearmanWorker::unregisterAll' => ['bool'], + 'GearmanWorker::wait' => ['bool'], + 'GearmanWorker::work' => ['bool'], + 'Gender\Gender::__construct' => ['void', 'dsn='=>'string'], + 'Gender\Gender::connect' => ['bool', 'dsn'=>'string'], + 'Gender\Gender::country' => ['array', 'country'=>'int'], + 'Gender\Gender::get' => ['int', 'name'=>'string', 'country='=>'int'], + 'Gender\Gender::isNick' => ['array', 'name0'=>'string', 'name1'=>'string', 'country='=>'int'], + 'Gender\Gender::similarNames' => ['array', 'name'=>'string', 'country='=>'int'], + 'Generator::__wakeup' => ['void'], + 'Generator::current' => ['mixed'], + 'Generator::getReturn' => ['mixed'], + 'Generator::key' => ['mixed'], + 'Generator::next' => ['void'], + 'Generator::rewind' => ['void'], + 'Generator::send' => ['mixed', 'value'=>'mixed'], + 'Generator::throw' => ['mixed', 'exception'=>'Exception|Throwable'], + 'Generator::valid' => ['bool'], + 'GlobIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], + 'GlobIterator::count' => ['int'], + 'GlobIterator::current' => ['FilesystemIterator|SplFileInfo|string'], + 'GlobIterator::getATime' => [''], + 'GlobIterator::getBasename' => ['', 'suffix='=>'string'], + 'GlobIterator::getCTime' => [''], + 'GlobIterator::getExtension' => [''], + 'GlobIterator::getFileInfo' => [''], + 'GlobIterator::getFilename' => [''], + 'GlobIterator::getFlags' => ['int'], + 'GlobIterator::getGroup' => [''], + 'GlobIterator::getInode' => [''], + 'GlobIterator::getLinkTarget' => [''], + 'GlobIterator::getMTime' => [''], + 'GlobIterator::getOwner' => [''], + 'GlobIterator::getPath' => [''], + 'GlobIterator::getPathInfo' => [''], + 'GlobIterator::getPathname' => [''], + 'GlobIterator::getPerms' => [''], + 'GlobIterator::getRealPath' => [''], + 'GlobIterator::getSize' => [''], + 'GlobIterator::getType' => [''], + 'GlobIterator::isDir' => [''], + 'GlobIterator::isDot' => [''], + 'GlobIterator::isExecutable' => [''], + 'GlobIterator::isFile' => [''], + 'GlobIterator::isLink' => [''], + 'GlobIterator::isReadable' => [''], + 'GlobIterator::isWritable' => [''], + 'GlobIterator::key' => ['string'], + 'GlobIterator::next' => ['void'], + 'GlobIterator::openFile' => [''], + 'GlobIterator::rewind' => ['void'], + 'GlobIterator::seek' => ['void', 'position'=>'int'], + 'GlobIterator::setFileClass' => [''], + 'GlobIterator::setFlags' => ['void', 'flags='=>'int'], + 'GlobIterator::setInfoClass' => [''], + 'GlobIterator::valid' => [''], + 'Gmagick::__construct' => ['void', 'filename='=>'string'], + 'Gmagick::addimage' => ['Gmagick', 'gmagick'=>'gmagick'], + 'Gmagick::addnoiseimage' => ['Gmagick', 'noise'=>'int'], + 'Gmagick::annotateimage' => ['Gmagick', 'gmagickdraw'=>'gmagickdraw', 'x'=>'float', 'y'=>'float', 'angle'=>'float', 'text'=>'string'], + 'Gmagick::blurimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], + 'Gmagick::borderimage' => ['Gmagick', 'color'=>'gmagickpixel', 'width'=>'int', 'height'=>'int'], + 'Gmagick::charcoalimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float'], + 'Gmagick::chopimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], + 'Gmagick::clear' => ['Gmagick'], + 'Gmagick::commentimage' => ['Gmagick', 'comment'=>'string'], + 'Gmagick::compositeimage' => ['Gmagick', 'source'=>'gmagick', 'compose'=>'int', 'x'=>'int', 'y'=>'int'], + 'Gmagick::cropimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], + 'Gmagick::cropthumbnailimage' => ['Gmagick', 'width'=>'int', 'height'=>'int'], + 'Gmagick::current' => ['Gmagick'], + 'Gmagick::cyclecolormapimage' => ['Gmagick', 'displace'=>'int'], + 'Gmagick::deconstructimages' => ['Gmagick'], + 'Gmagick::despeckleimage' => ['Gmagick'], + 'Gmagick::destroy' => ['bool'], + 'Gmagick::drawimage' => ['Gmagick', 'gmagickdraw'=>'gmagickdraw'], + 'Gmagick::edgeimage' => ['Gmagick', 'radius'=>'float'], + 'Gmagick::embossimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float'], + 'Gmagick::enhanceimage' => ['Gmagick'], + 'Gmagick::equalizeimage' => ['Gmagick'], + 'Gmagick::flipimage' => ['Gmagick'], + 'Gmagick::flopimage' => ['Gmagick'], + 'Gmagick::frameimage' => ['Gmagick', 'color'=>'gmagickpixel', 'width'=>'int', 'height'=>'int', 'inner_bevel'=>'int', 'outer_bevel'=>'int'], + 'Gmagick::gammaimage' => ['Gmagick', 'gamma'=>'float'], + 'Gmagick::getcopyright' => ['string'], + 'Gmagick::getfilename' => ['string'], + 'Gmagick::getimagebackgroundcolor' => ['GmagickPixel'], + 'Gmagick::getimageblueprimary' => ['array'], + 'Gmagick::getimagebordercolor' => ['GmagickPixel'], + 'Gmagick::getimagechanneldepth' => ['int', 'channel_type'=>'int'], + 'Gmagick::getimagecolors' => ['int'], + 'Gmagick::getimagecolorspace' => ['int'], + 'Gmagick::getimagecompose' => ['int'], + 'Gmagick::getimagedelay' => ['int'], + 'Gmagick::getimagedepth' => ['int'], + 'Gmagick::getimagedispose' => ['int'], + 'Gmagick::getimageextrema' => ['array'], + 'Gmagick::getimagefilename' => ['string'], + 'Gmagick::getimageformat' => ['string'], + 'Gmagick::getimagegamma' => ['float'], + 'Gmagick::getimagegreenprimary' => ['array'], + 'Gmagick::getimageheight' => ['int'], + 'Gmagick::getimagehistogram' => ['array'], + 'Gmagick::getimageindex' => ['int'], + 'Gmagick::getimageinterlacescheme' => ['int'], + 'Gmagick::getimageiterations' => ['int'], + 'Gmagick::getimagematte' => ['int'], + 'Gmagick::getimagemattecolor' => ['GmagickPixel'], + 'Gmagick::getimageprofile' => ['string', 'name'=>'string'], + 'Gmagick::getimageredprimary' => ['array'], + 'Gmagick::getimagerenderingintent' => ['int'], + 'Gmagick::getimageresolution' => ['array'], + 'Gmagick::getimagescene' => ['int'], + 'Gmagick::getimagesignature' => ['string'], + 'Gmagick::getimagetype' => ['int'], + 'Gmagick::getimageunits' => ['int'], + 'Gmagick::getimagewhitepoint' => ['array'], + 'Gmagick::getimagewidth' => ['int'], + 'Gmagick::getpackagename' => ['string'], + 'Gmagick::getquantumdepth' => ['array'], + 'Gmagick::getreleasedate' => ['string'], + 'Gmagick::getsamplingfactors' => ['array'], + 'Gmagick::getsize' => ['array'], + 'Gmagick::getversion' => ['array'], + 'Gmagick::hasnextimage' => ['bool'], + 'Gmagick::haspreviousimage' => ['bool'], + 'Gmagick::implodeimage' => ['mixed', 'radius'=>'float'], + 'Gmagick::labelimage' => ['mixed', 'label'=>'string'], + 'Gmagick::levelimage' => ['mixed', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'int'], + 'Gmagick::magnifyimage' => ['mixed'], + 'Gmagick::mapimage' => ['Gmagick', 'gmagick'=>'gmagick', 'dither'=>'bool'], + 'Gmagick::medianfilterimage' => ['void', 'radius'=>'float'], + 'Gmagick::minifyimage' => ['Gmagick'], + 'Gmagick::modulateimage' => ['Gmagick', 'brightness'=>'float', 'saturation'=>'float', 'hue'=>'float'], + 'Gmagick::motionblurimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float'], + 'Gmagick::newimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'background'=>'string', 'format='=>'string'], + 'Gmagick::nextimage' => ['bool'], + 'Gmagick::normalizeimage' => ['Gmagick', 'channel='=>'int'], + 'Gmagick::oilpaintimage' => ['Gmagick', 'radius'=>'float'], + 'Gmagick::previousimage' => ['bool'], + 'Gmagick::profileimage' => ['Gmagick', 'name'=>'string', 'profile'=>'string'], + 'Gmagick::quantizeimage' => ['Gmagick', 'numcolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], + 'Gmagick::quantizeimages' => ['Gmagick', 'numcolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], + 'Gmagick::queryfontmetrics' => ['array', 'draw'=>'gmagickdraw', 'text'=>'string'], + 'Gmagick::queryfonts' => ['array', 'pattern='=>'string'], + 'Gmagick::queryformats' => ['array', 'pattern='=>'string'], + 'Gmagick::radialblurimage' => ['Gmagick', 'angle'=>'float', 'channel='=>'int'], + 'Gmagick::raiseimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int', 'raise'=>'bool'], + 'Gmagick::read' => ['Gmagick', 'filename'=>'string'], + 'Gmagick::readimage' => ['Gmagick', 'filename'=>'string'], + 'Gmagick::readimageblob' => ['Gmagick', 'imagecontents'=>'string', 'filename='=>'string'], + 'Gmagick::readimagefile' => ['Gmagick', 'fp'=>'resource', 'filename='=>'string'], + 'Gmagick::reducenoiseimage' => ['Gmagick', 'radius'=>'float'], + 'Gmagick::removeimage' => ['Gmagick'], + 'Gmagick::removeimageprofile' => ['string', 'name'=>'string'], + 'Gmagick::resampleimage' => ['Gmagick', 'xresolution'=>'float', 'yresolution'=>'float', 'filter'=>'int', 'blur'=>'float'], + 'Gmagick::resizeimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'filter'=>'int', 'blur'=>'float', 'fit='=>'bool'], + 'Gmagick::rollimage' => ['Gmagick', 'x'=>'int', 'y'=>'int'], + 'Gmagick::rotateimage' => ['Gmagick', 'color'=>'mixed', 'degrees'=>'float'], + 'Gmagick::scaleimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'fit='=>'bool'], + 'Gmagick::separateimagechannel' => ['Gmagick', 'channel'=>'int'], + 'Gmagick::setCompressionQuality' => ['Gmagick', 'quality'=>'int'], + 'Gmagick::setfilename' => ['Gmagick', 'filename'=>'string'], + 'Gmagick::setimagebackgroundcolor' => ['Gmagick', 'color'=>'gmagickpixel'], + 'Gmagick::setimageblueprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], + 'Gmagick::setimagebordercolor' => ['Gmagick', 'color'=>'gmagickpixel'], + 'Gmagick::setimagechanneldepth' => ['Gmagick', 'channel'=>'int', 'depth'=>'int'], + 'Gmagick::setimagecolorspace' => ['Gmagick', 'colorspace'=>'int'], + 'Gmagick::setimagecompose' => ['Gmagick', 'composite'=>'int'], + 'Gmagick::setimagedelay' => ['Gmagick', 'delay'=>'int'], + 'Gmagick::setimagedepth' => ['Gmagick', 'depth'=>'int'], + 'Gmagick::setimagedispose' => ['Gmagick', 'disposetype'=>'int'], + 'Gmagick::setimagefilename' => ['Gmagick', 'filename'=>'string'], + 'Gmagick::setimageformat' => ['Gmagick', 'imageformat'=>'string'], + 'Gmagick::setimagegamma' => ['Gmagick', 'gamma'=>'float'], + 'Gmagick::setimagegreenprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], + 'Gmagick::setimageindex' => ['Gmagick', 'index'=>'int'], + 'Gmagick::setimageinterlacescheme' => ['Gmagick', 'interlace'=>'int'], + 'Gmagick::setimageiterations' => ['Gmagick', 'iterations'=>'int'], + 'Gmagick::setimageprofile' => ['Gmagick', 'name'=>'string', 'profile'=>'string'], + 'Gmagick::setimageredprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], + 'Gmagick::setimagerenderingintent' => ['Gmagick', 'rendering_intent'=>'int'], + 'Gmagick::setimageresolution' => ['Gmagick', 'xresolution'=>'float', 'yresolution'=>'float'], + 'Gmagick::setimagescene' => ['Gmagick', 'scene'=>'int'], + 'Gmagick::setimagetype' => ['Gmagick', 'imgtype'=>'int'], + 'Gmagick::setimageunits' => ['Gmagick', 'resolution'=>'int'], + 'Gmagick::setimagewhitepoint' => ['Gmagick', 'x'=>'float', 'y'=>'float'], + 'Gmagick::setsamplingfactors' => ['Gmagick', 'factors'=>'array'], + 'Gmagick::setsize' => ['Gmagick', 'columns'=>'int', 'rows'=>'int'], + 'Gmagick::shearimage' => ['Gmagick', 'color'=>'mixed', 'xshear'=>'float', 'yshear'=>'float'], + 'Gmagick::solarizeimage' => ['Gmagick', 'threshold'=>'int'], + 'Gmagick::spreadimage' => ['Gmagick', 'radius'=>'float'], + 'Gmagick::stripimage' => ['Gmagick'], + 'Gmagick::swirlimage' => ['Gmagick', 'degrees'=>'float'], + 'Gmagick::thumbnailimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'fit='=>'bool'], + 'Gmagick::trimimage' => ['Gmagick', 'fuzz'=>'float'], + 'Gmagick::write' => ['Gmagick', 'filename'=>'string'], + 'Gmagick::writeimage' => ['Gmagick', 'filename'=>'string', 'all_frames='=>'bool'], + 'GmagickDraw::annotate' => ['GmagickDraw', 'x'=>'float', 'y'=>'float', 'text'=>'string'], + 'GmagickDraw::arc' => ['GmagickDraw', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float', 'sd'=>'float', 'ed'=>'float'], + 'GmagickDraw::bezier' => ['GmagickDraw', 'coordinate_array'=>'array'], + 'GmagickDraw::ellipse' => ['GmagickDraw', 'ox'=>'float', 'oy'=>'float', 'rx'=>'float', 'ry'=>'float', 'start'=>'float', 'end'=>'float'], + 'GmagickDraw::getfillcolor' => ['GmagickPixel'], + 'GmagickDraw::getfillopacity' => ['float'], + 'GmagickDraw::getfont' => ['string|false'], + 'GmagickDraw::getfontsize' => ['float'], + 'GmagickDraw::getfontstyle' => ['int'], + 'GmagickDraw::getfontweight' => ['int'], + 'GmagickDraw::getstrokecolor' => ['GmagickPixel'], + 'GmagickDraw::getstrokeopacity' => ['float'], + 'GmagickDraw::getstrokewidth' => ['float'], + 'GmagickDraw::gettextdecoration' => ['int'], + 'GmagickDraw::gettextencoding' => ['string|false'], + 'GmagickDraw::line' => ['GmagickDraw', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float'], + 'GmagickDraw::point' => ['GmagickDraw', 'x'=>'float', 'y'=>'float'], + 'GmagickDraw::polygon' => ['GmagickDraw', 'coordinates'=>'array'], + 'GmagickDraw::polyline' => ['GmagickDraw', 'coordinate_array'=>'array'], + 'GmagickDraw::rectangle' => ['GmagickDraw', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], + 'GmagickDraw::rotate' => ['GmagickDraw', 'degrees'=>'float'], + 'GmagickDraw::roundrectangle' => ['GmagickDraw', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'rx'=>'float', 'ry'=>'float'], + 'GmagickDraw::scale' => ['GmagickDraw', 'x'=>'float', 'y'=>'float'], + 'GmagickDraw::setfillcolor' => ['GmagickDraw', 'color'=>'string'], + 'GmagickDraw::setfillopacity' => ['GmagickDraw', 'fill_opacity'=>'float'], + 'GmagickDraw::setfont' => ['GmagickDraw', 'font'=>'string'], + 'GmagickDraw::setfontsize' => ['GmagickDraw', 'pointsize'=>'float'], + 'GmagickDraw::setfontstyle' => ['GmagickDraw', 'style'=>'int'], + 'GmagickDraw::setfontweight' => ['GmagickDraw', 'weight'=>'int'], + 'GmagickDraw::setstrokecolor' => ['GmagickDraw', 'color'=>'gmagickpixel'], + 'GmagickDraw::setstrokeopacity' => ['GmagickDraw', 'stroke_opacity'=>'float'], + 'GmagickDraw::setstrokewidth' => ['GmagickDraw', 'width'=>'float'], + 'GmagickDraw::settextdecoration' => ['GmagickDraw', 'decoration'=>'int'], + 'GmagickDraw::settextencoding' => ['GmagickDraw', 'encoding'=>'string'], + 'GmagickPixel::__construct' => ['void', 'color='=>'string'], + 'GmagickPixel::getcolor' => ['mixed', 'as_array='=>'bool', 'normalize_array='=>'bool'], + 'GmagickPixel::getcolorcount' => ['int'], + 'GmagickPixel::getcolorvalue' => ['float', 'color'=>'int'], + 'GmagickPixel::setcolor' => ['GmagickPixel', 'color'=>'string'], + 'GmagickPixel::setcolorvalue' => ['GmagickPixel', 'color'=>'int', 'value'=>'float'], + 'Grpc\Call::__construct' => ['void', 'channel'=>'Grpc\Channel', 'method'=>'string', 'absolute_deadline'=>'Grpc\Timeval', 'host_override='=>'mixed'], + 'Grpc\Call::cancel' => [''], + 'Grpc\Call::getPeer' => ['string'], + 'Grpc\Call::setCredentials' => ['int', 'creds_obj'=>'Grpc\CallCredentials'], + 'Grpc\Call::startBatch' => ['object', 'batch'=>'array'], + 'Grpc\CallCredentials::createComposite' => ['Grpc\CallCredentials', 'cred1'=>'Grpc\CallCredentials', 'cred2'=>'Grpc\CallCredentials'], + 'Grpc\CallCredentials::createFromPlugin' => ['Grpc\CallCredentials', 'callback'=>'Closure'], + 'Grpc\Channel::__construct' => ['void', 'target'=>'string', 'args='=>'array'], + 'Grpc\Channel::close' => [''], + 'Grpc\Channel::getConnectivityState' => ['int', 'try_to_connect='=>'bool'], + 'Grpc\Channel::getTarget' => ['string'], + 'Grpc\Channel::watchConnectivityState' => ['bool', 'last_state'=>'int', 'deadline_obj'=>'Grpc\Timeval'], + 'Grpc\ChannelCredentials::createComposite' => ['Grpc\ChannelCredentials', 'cred1'=>'Grpc\ChannelCredentials', 'cred2'=>'Grpc\CallCredentials'], + 'Grpc\ChannelCredentials::createDefault' => ['Grpc\ChannelCredentials'], + 'Grpc\ChannelCredentials::createInsecure' => ['null'], + 'Grpc\ChannelCredentials::createSsl' => ['Grpc\ChannelCredentials', 'pem_root_certs'=>'string', 'pem_private_key='=>'string', 'pem_cert_chain='=>'string'], + 'Grpc\ChannelCredentials::setDefaultRootsPem' => ['', 'pem_roots'=>'string'], + 'Grpc\Server::__construct' => ['void', 'args'=>'array'], + 'Grpc\Server::addHttp2Port' => ['bool', 'addr'=>'string'], + 'Grpc\Server::addSecureHttp2Port' => ['bool', 'addr'=>'string', 'creds_obj'=>'Grpc\ServerCredentials'], + 'Grpc\Server::requestCall' => ['', 'tag_new'=>'int', 'tag_cancel'=>'int'], + 'Grpc\Server::start' => [''], + 'Grpc\ServerCredentials::createSsl' => ['object', 'pem_root_certs'=>'string', 'pem_private_key'=>'string', 'pem_cert_chain'=>'string'], + 'Grpc\Timeval::__construct' => ['void', 'usec'=>'int'], + 'Grpc\Timeval::add' => ['Grpc\Timeval', 'other'=>'Grpc\Timeval'], + 'Grpc\Timeval::compare' => ['int', 'a'=>'Grpc\Timeval', 'b'=>'Grpc\Timeval'], + 'Grpc\Timeval::infFuture' => ['Grpc\Timeval'], + 'Grpc\Timeval::infPast' => ['Grpc\Timeval'], + 'Grpc\Timeval::now' => ['Grpc\Timeval'], + 'Grpc\Timeval::similar' => ['bool', 'a'=>'Grpc\Timeval', 'b'=>'Grpc\Timeval', 'threshold'=>'Grpc\Timeval'], + 'Grpc\Timeval::sleepUntil' => [''], + 'Grpc\Timeval::subtract' => ['Grpc\Timeval', 'other'=>'Grpc\Timeval'], + 'Grpc\Timeval::zero' => ['Grpc\Timeval'], + 'HRTime\PerformanceCounter::getElapsedTicks' => ['int'], + 'HRTime\PerformanceCounter::getFrequency' => ['int'], + 'HRTime\PerformanceCounter::getLastElapsedTicks' => ['int'], + 'HRTime\PerformanceCounter::getTicks' => ['int'], + 'HRTime\PerformanceCounter::getTicksSince' => ['int', 'start'=>'int'], + 'HRTime\PerformanceCounter::isRunning' => ['bool'], + 'HRTime\PerformanceCounter::start' => ['void'], + 'HRTime\PerformanceCounter::stop' => ['void'], + 'HRTime\StopWatch::getElapsedTicks' => ['int'], + 'HRTime\StopWatch::getElapsedTime' => ['float', 'unit='=>'int'], + 'HRTime\StopWatch::getLastElapsedTicks' => ['int'], + 'HRTime\StopWatch::getLastElapsedTime' => ['float', 'unit='=>'int'], + 'HRTime\StopWatch::isRunning' => ['bool'], + 'HRTime\StopWatch::start' => ['void'], + 'HRTime\StopWatch::stop' => ['void'], + 'HaruAnnotation::setBorderStyle' => ['bool', 'width'=>'float', 'dash_on'=>'int', 'dash_off'=>'int'], + 'HaruAnnotation::setHighlightMode' => ['bool', 'mode'=>'int'], + 'HaruAnnotation::setIcon' => ['bool', 'icon'=>'int'], + 'HaruAnnotation::setOpened' => ['bool', 'opened'=>'bool'], + 'HaruDestination::setFit' => ['bool'], + 'HaruDestination::setFitB' => ['bool'], + 'HaruDestination::setFitBH' => ['bool', 'top'=>'float'], + 'HaruDestination::setFitBV' => ['bool', 'left'=>'float'], + 'HaruDestination::setFitH' => ['bool', 'top'=>'float'], + 'HaruDestination::setFitR' => ['bool', 'left'=>'float', 'bottom'=>'float', 'right'=>'float', 'top'=>'float'], + 'HaruDestination::setFitV' => ['bool', 'left'=>'float'], + 'HaruDestination::setXYZ' => ['bool', 'left'=>'float', 'top'=>'float', 'zoom'=>'float'], + 'HaruDoc::__construct' => ['void'], + 'HaruDoc::addPage' => ['object'], + 'HaruDoc::addPageLabel' => ['bool', 'first_page'=>'int', 'style'=>'int', 'first_num'=>'int', 'prefix='=>'string'], + 'HaruDoc::createOutline' => ['object', 'title'=>'string', 'parent_outline='=>'object', 'encoder='=>'object'], + 'HaruDoc::getCurrentEncoder' => ['object'], + 'HaruDoc::getCurrentPage' => ['object'], + 'HaruDoc::getEncoder' => ['object', 'encoding'=>'string'], + 'HaruDoc::getFont' => ['object', 'fontname'=>'string', 'encoding='=>'string'], + 'HaruDoc::getInfoAttr' => ['string', 'type'=>'int'], + 'HaruDoc::getPageLayout' => ['int'], + 'HaruDoc::getPageMode' => ['int'], + 'HaruDoc::getStreamSize' => ['int'], + 'HaruDoc::insertPage' => ['object', 'page'=>'object'], + 'HaruDoc::loadJPEG' => ['object', 'filename'=>'string'], + 'HaruDoc::loadPNG' => ['object', 'filename'=>'string', 'deferred='=>'bool'], + 'HaruDoc::loadRaw' => ['object', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'color_space'=>'int'], + 'HaruDoc::loadTTC' => ['string', 'fontfile'=>'string', 'index'=>'int', 'embed='=>'bool'], + 'HaruDoc::loadTTF' => ['string', 'fontfile'=>'string', 'embed='=>'bool'], + 'HaruDoc::loadType1' => ['string', 'afmfile'=>'string', 'pfmfile='=>'string'], + 'HaruDoc::output' => ['bool'], + 'HaruDoc::readFromStream' => ['string', 'bytes'=>'int'], + 'HaruDoc::resetError' => ['bool'], + 'HaruDoc::resetStream' => ['bool'], + 'HaruDoc::save' => ['bool', 'file'=>'string'], + 'HaruDoc::saveToStream' => ['bool'], + 'HaruDoc::setCompressionMode' => ['bool', 'mode'=>'int'], + 'HaruDoc::setCurrentEncoder' => ['bool', 'encoding'=>'string'], + 'HaruDoc::setEncryptionMode' => ['bool', 'mode'=>'int', 'key_len='=>'int'], + 'HaruDoc::setInfoAttr' => ['bool', 'type'=>'int', 'info'=>'string'], + 'HaruDoc::setInfoDateAttr' => ['bool', 'type'=>'int', 'year'=>'int', 'month'=>'int', 'day'=>'int', 'hour'=>'int', 'min'=>'int', 'sec'=>'int', 'ind'=>'string', 'off_hour'=>'int', 'off_min'=>'int'], + 'HaruDoc::setOpenAction' => ['bool', 'destination'=>'object'], + 'HaruDoc::setPageLayout' => ['bool', 'layout'=>'int'], + 'HaruDoc::setPageMode' => ['bool', 'mode'=>'int'], + 'HaruDoc::setPagesConfiguration' => ['bool', 'page_per_pages'=>'int'], + 'HaruDoc::setPassword' => ['bool', 'owner_password'=>'string', 'user_password'=>'string'], + 'HaruDoc::setPermission' => ['bool', 'permission'=>'int'], + 'HaruDoc::useCNSEncodings' => ['bool'], + 'HaruDoc::useCNSFonts' => ['bool'], + 'HaruDoc::useCNTEncodings' => ['bool'], + 'HaruDoc::useCNTFonts' => ['bool'], + 'HaruDoc::useJPEncodings' => ['bool'], + 'HaruDoc::useJPFonts' => ['bool'], + 'HaruDoc::useKREncodings' => ['bool'], + 'HaruDoc::useKRFonts' => ['bool'], + 'HaruEncoder::getByteType' => ['int', 'text'=>'string', 'index'=>'int'], + 'HaruEncoder::getType' => ['int'], + 'HaruEncoder::getUnicode' => ['int', 'character'=>'int'], + 'HaruEncoder::getWritingMode' => ['int'], + 'HaruFont::getAscent' => ['int'], + 'HaruFont::getCapHeight' => ['int'], + 'HaruFont::getDescent' => ['int'], + 'HaruFont::getEncodingName' => ['string'], + 'HaruFont::getFontName' => ['string'], + 'HaruFont::getTextWidth' => ['array', 'text'=>'string'], + 'HaruFont::getUnicodeWidth' => ['int', 'character'=>'int'], + 'HaruFont::getXHeight' => ['int'], + 'HaruFont::measureText' => ['int', 'text'=>'string', 'width'=>'float', 'font_size'=>'float', 'char_space'=>'float', 'word_space'=>'float', 'word_wrap='=>'bool'], + 'HaruImage::getBitsPerComponent' => ['int'], + 'HaruImage::getColorSpace' => ['string'], + 'HaruImage::getHeight' => ['int'], + 'HaruImage::getSize' => ['array'], + 'HaruImage::getWidth' => ['int'], + 'HaruImage::setColorMask' => ['bool', 'rmin'=>'int', 'rmax'=>'int', 'gmin'=>'int', 'gmax'=>'int', 'bmin'=>'int', 'bmax'=>'int'], + 'HaruImage::setMaskImage' => ['bool', 'mask_image'=>'object'], + 'HaruOutline::setDestination' => ['bool', 'destination'=>'object'], + 'HaruOutline::setOpened' => ['bool', 'opened'=>'bool'], + 'HaruPage::arc' => ['bool', 'x'=>'float', 'y'=>'float', 'ray'=>'float', 'ang1'=>'float', 'ang2'=>'float'], + 'HaruPage::beginText' => ['bool'], + 'HaruPage::circle' => ['bool', 'x'=>'float', 'y'=>'float', 'ray'=>'float'], + 'HaruPage::closePath' => ['bool'], + 'HaruPage::concat' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], + 'HaruPage::createDestination' => ['object'], + 'HaruPage::createLinkAnnotation' => ['object', 'rectangle'=>'array', 'destination'=>'object'], + 'HaruPage::createTextAnnotation' => ['object', 'rectangle'=>'array', 'text'=>'string', 'encoder='=>'object'], + 'HaruPage::createURLAnnotation' => ['object', 'rectangle'=>'array', 'url'=>'string'], + 'HaruPage::curveTo' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], + 'HaruPage::curveTo2' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], + 'HaruPage::curveTo3' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x3'=>'float', 'y3'=>'float'], + 'HaruPage::drawImage' => ['bool', 'image'=>'object', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], + 'HaruPage::ellipse' => ['bool', 'x'=>'float', 'y'=>'float', 'xray'=>'float', 'yray'=>'float'], + 'HaruPage::endPath' => ['bool'], + 'HaruPage::endText' => ['bool'], + 'HaruPage::eoFillStroke' => ['bool', 'close_path='=>'bool'], + 'HaruPage::eofill' => ['bool'], + 'HaruPage::fill' => ['bool'], + 'HaruPage::fillStroke' => ['bool', 'close_path='=>'bool'], + 'HaruPage::getCMYKFill' => ['array'], + 'HaruPage::getCMYKStroke' => ['array'], + 'HaruPage::getCharSpace' => ['float'], + 'HaruPage::getCurrentFont' => ['object'], + 'HaruPage::getCurrentFontSize' => ['float'], + 'HaruPage::getCurrentPos' => ['array'], + 'HaruPage::getCurrentTextPos' => ['array'], + 'HaruPage::getDash' => ['array'], + 'HaruPage::getFillingColorSpace' => ['int'], + 'HaruPage::getFlatness' => ['float'], + 'HaruPage::getGMode' => ['int'], + 'HaruPage::getGrayFill' => ['float'], + 'HaruPage::getGrayStroke' => ['float'], + 'HaruPage::getHeight' => ['float'], + 'HaruPage::getHorizontalScaling' => ['float'], + 'HaruPage::getLineCap' => ['int'], + 'HaruPage::getLineJoin' => ['int'], + 'HaruPage::getLineWidth' => ['float'], + 'HaruPage::getMiterLimit' => ['float'], + 'HaruPage::getRGBFill' => ['array'], + 'HaruPage::getRGBStroke' => ['array'], + 'HaruPage::getStrokingColorSpace' => ['int'], + 'HaruPage::getTextLeading' => ['float'], + 'HaruPage::getTextMatrix' => ['array'], + 'HaruPage::getTextRenderingMode' => ['int'], + 'HaruPage::getTextRise' => ['float'], + 'HaruPage::getTextWidth' => ['float', 'text'=>'string'], + 'HaruPage::getTransMatrix' => ['array'], + 'HaruPage::getWidth' => ['float'], + 'HaruPage::getWordSpace' => ['float'], + 'HaruPage::lineTo' => ['bool', 'x'=>'float', 'y'=>'float'], + 'HaruPage::measureText' => ['int', 'text'=>'string', 'width'=>'float', 'wordwrap='=>'bool'], + 'HaruPage::moveTextPos' => ['bool', 'x'=>'float', 'y'=>'float', 'set_leading='=>'bool'], + 'HaruPage::moveTo' => ['bool', 'x'=>'float', 'y'=>'float'], + 'HaruPage::moveToNextLine' => ['bool'], + 'HaruPage::rectangle' => ['bool', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], + 'HaruPage::setCMYKFill' => ['bool', 'c'=>'float', 'm'=>'float', 'y'=>'float', 'k'=>'float'], + 'HaruPage::setCMYKStroke' => ['bool', 'c'=>'float', 'm'=>'float', 'y'=>'float', 'k'=>'float'], + 'HaruPage::setCharSpace' => ['bool', 'char_space'=>'float'], + 'HaruPage::setDash' => ['bool', 'pattern'=>'array', 'phase'=>'int'], + 'HaruPage::setFlatness' => ['bool', 'flatness'=>'float'], + 'HaruPage::setFontAndSize' => ['bool', 'font'=>'object', 'size'=>'float'], + 'HaruPage::setGrayFill' => ['bool', 'value'=>'float'], + 'HaruPage::setGrayStroke' => ['bool', 'value'=>'float'], + 'HaruPage::setHeight' => ['bool', 'height'=>'float'], + 'HaruPage::setHorizontalScaling' => ['bool', 'scaling'=>'float'], + 'HaruPage::setLineCap' => ['bool', 'cap'=>'int'], + 'HaruPage::setLineJoin' => ['bool', 'join'=>'int'], + 'HaruPage::setLineWidth' => ['bool', 'width'=>'float'], + 'HaruPage::setMiterLimit' => ['bool', 'limit'=>'float'], + 'HaruPage::setRGBFill' => ['bool', 'r'=>'float', 'g'=>'float', 'b'=>'float'], + 'HaruPage::setRGBStroke' => ['bool', 'r'=>'float', 'g'=>'float', 'b'=>'float'], + 'HaruPage::setRotate' => ['bool', 'angle'=>'int'], + 'HaruPage::setSize' => ['bool', 'size'=>'int', 'direction'=>'int'], + 'HaruPage::setSlideShow' => ['bool', 'type'=>'int', 'disp_time'=>'float', 'trans_time'=>'float'], + 'HaruPage::setTextLeading' => ['bool', 'text_leading'=>'float'], + 'HaruPage::setTextMatrix' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], + 'HaruPage::setTextRenderingMode' => ['bool', 'mode'=>'int'], + 'HaruPage::setTextRise' => ['bool', 'rise'=>'float'], + 'HaruPage::setWidth' => ['bool', 'width'=>'float'], + 'HaruPage::setWordSpace' => ['bool', 'word_space'=>'float'], + 'HaruPage::showText' => ['bool', 'text'=>'string'], + 'HaruPage::showTextNextLine' => ['bool', 'text'=>'string', 'word_space='=>'float', 'char_space='=>'float'], + 'HaruPage::stroke' => ['bool', 'close_path='=>'bool'], + 'HaruPage::textOut' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'], + 'HaruPage::textRect' => ['bool', 'left'=>'float', 'top'=>'float', 'right'=>'float', 'bottom'=>'float', 'text'=>'string', 'align='=>'int'], + 'HttpDeflateStream::__construct' => ['void', 'flags='=>'int'], + 'HttpDeflateStream::factory' => ['HttpDeflateStream', 'flags='=>'int', 'class_name='=>'string'], + 'HttpDeflateStream::finish' => ['string', 'data='=>'string'], + 'HttpDeflateStream::flush' => ['string|false', 'data='=>'string'], + 'HttpDeflateStream::update' => ['string|false', 'data'=>'string'], + 'HttpInflateStream::__construct' => ['void', 'flags='=>'int'], + 'HttpInflateStream::factory' => ['HttpInflateStream', 'flags='=>'int', 'class_name='=>'string'], + 'HttpInflateStream::finish' => ['string', 'data='=>'string'], + 'HttpInflateStream::flush' => ['string|false', 'data='=>'string'], + 'HttpInflateStream::update' => ['string|false', 'data'=>'string'], + 'HttpMessage::__construct' => ['void', 'message='=>'string'], + 'HttpMessage::__toString' => ['string'], + 'HttpMessage::addHeaders' => ['void', 'headers'=>'array', 'append='=>'bool'], + 'HttpMessage::count' => ['int'], + 'HttpMessage::current' => ['mixed'], + 'HttpMessage::detach' => ['HttpMessage'], + 'HttpMessage::factory' => ['?HttpMessage', 'raw_message='=>'string', 'class_name='=>'string'], + 'HttpMessage::fromEnv' => ['?HttpMessage', 'message_type'=>'int', 'class_name='=>'string'], + 'HttpMessage::fromString' => ['?HttpMessage', 'raw_message='=>'string', 'class_name='=>'string'], + 'HttpMessage::getBody' => ['string'], + 'HttpMessage::getHeader' => ['?string', 'header'=>'string'], + 'HttpMessage::getHeaders' => ['array'], + 'HttpMessage::getHttpVersion' => ['string'], + 'HttpMessage::getInfo' => [''], + 'HttpMessage::getParentMessage' => ['HttpMessage'], + 'HttpMessage::getRequestMethod' => ['string|false'], + 'HttpMessage::getRequestUrl' => ['string|false'], + 'HttpMessage::getResponseCode' => ['int'], + 'HttpMessage::getResponseStatus' => ['string'], + 'HttpMessage::getType' => ['int'], + 'HttpMessage::guessContentType' => ['string|false', 'magic_file'=>'string', 'magic_mode='=>'int'], + 'HttpMessage::key' => ['int|string'], + 'HttpMessage::next' => ['void'], + 'HttpMessage::prepend' => ['void', 'message'=>'HttpMessage', 'top='=>'bool'], + 'HttpMessage::reverse' => ['HttpMessage'], + 'HttpMessage::rewind' => ['void'], + 'HttpMessage::send' => ['bool'], + 'HttpMessage::serialize' => ['string'], + 'HttpMessage::setBody' => ['void', 'body'=>'string'], + 'HttpMessage::setHeaders' => ['void', 'headers'=>'array'], + 'HttpMessage::setHttpVersion' => ['bool', 'version'=>'string'], + 'HttpMessage::setInfo' => ['', 'http_info'=>''], + 'HttpMessage::setRequestMethod' => ['bool', 'method'=>'string'], + 'HttpMessage::setRequestUrl' => ['bool', 'url'=>'string'], + 'HttpMessage::setResponseCode' => ['bool', 'code'=>'int'], + 'HttpMessage::setResponseStatus' => ['bool', 'status'=>'string'], + 'HttpMessage::setType' => ['void', 'type'=>'int'], + 'HttpMessage::toMessageTypeObject' => ['HttpRequest|HttpResponse|null'], + 'HttpMessage::toString' => ['string', 'include_parent='=>'bool'], + 'HttpMessage::unserialize' => ['void', 'serialized'=>'string'], + 'HttpMessage::valid' => ['bool'], + 'HttpQueryString::__construct' => ['void', 'global='=>'bool', 'add='=>'mixed'], + 'HttpQueryString::__toString' => ['string'], + 'HttpQueryString::factory' => ['', 'global'=>'', 'params'=>'', 'class_name'=>''], + 'HttpQueryString::get' => ['mixed', 'key='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], + 'HttpQueryString::getArray' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], + 'HttpQueryString::getBool' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], + 'HttpQueryString::getFloat' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], + 'HttpQueryString::getInt' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], + 'HttpQueryString::getObject' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], + 'HttpQueryString::getString' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], + 'HttpQueryString::mod' => ['HttpQueryString', 'params'=>'mixed'], + 'HttpQueryString::offsetExists' => ['bool', 'offset'=>'mixed'], + 'HttpQueryString::offsetGet' => ['mixed', 'offset'=>'mixed'], + 'HttpQueryString::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], + 'HttpQueryString::offsetUnset' => ['void', 'offset'=>'mixed'], + 'HttpQueryString::serialize' => ['string'], + 'HttpQueryString::set' => ['string', 'params'=>'mixed'], + 'HttpQueryString::singleton' => ['HttpQueryString', 'global='=>'bool'], + 'HttpQueryString::toArray' => ['array'], + 'HttpQueryString::toString' => ['string'], + 'HttpQueryString::unserialize' => ['void', 'serialized'=>'string'], + 'HttpQueryString::xlate' => ['bool', 'ie'=>'string', 'oe'=>'string'], + 'HttpRequest::__construct' => ['void', 'url='=>'string', 'request_method='=>'int', 'options='=>'array'], + 'HttpRequest::addBody' => ['', 'request_body_data'=>''], + 'HttpRequest::addCookies' => ['bool', 'cookies'=>'array'], + 'HttpRequest::addHeaders' => ['bool', 'headers'=>'array'], + 'HttpRequest::addPostFields' => ['bool', 'post_data'=>'array'], + 'HttpRequest::addPostFile' => ['bool', 'name'=>'string', 'file'=>'string', 'content_type='=>'string'], + 'HttpRequest::addPutData' => ['bool', 'put_data'=>'string'], + 'HttpRequest::addQueryData' => ['bool', 'query_params'=>'array'], + 'HttpRequest::addRawPostData' => ['bool', 'raw_post_data'=>'string'], + 'HttpRequest::addSslOptions' => ['bool', 'options'=>'array'], + 'HttpRequest::clearHistory' => ['void'], + 'HttpRequest::enableCookies' => ['bool'], + 'HttpRequest::encodeBody' => ['', 'fields'=>'', 'files'=>''], + 'HttpRequest::factory' => ['', 'url'=>'', 'method'=>'', 'options'=>'', 'class_name'=>''], + 'HttpRequest::flushCookies' => [''], + 'HttpRequest::get' => ['', 'url'=>'', 'options'=>'', '&info'=>''], + 'HttpRequest::getBody' => [''], + 'HttpRequest::getContentType' => ['string'], + 'HttpRequest::getCookies' => ['array'], + 'HttpRequest::getHeaders' => ['array'], + 'HttpRequest::getHistory' => ['HttpMessage'], + 'HttpRequest::getMethod' => ['int'], + 'HttpRequest::getOptions' => ['array'], + 'HttpRequest::getPostFields' => ['array'], + 'HttpRequest::getPostFiles' => ['array'], + 'HttpRequest::getPutData' => ['string'], + 'HttpRequest::getPutFile' => ['string'], + 'HttpRequest::getQueryData' => ['string'], + 'HttpRequest::getRawPostData' => ['string'], + 'HttpRequest::getRawRequestMessage' => ['string'], + 'HttpRequest::getRawResponseMessage' => ['string'], + 'HttpRequest::getRequestMessage' => ['HttpMessage'], + 'HttpRequest::getResponseBody' => ['string'], + 'HttpRequest::getResponseCode' => ['int'], + 'HttpRequest::getResponseCookies' => ['stdClass[]', 'flags='=>'int', 'allowed_extras='=>'array'], + 'HttpRequest::getResponseData' => ['array'], + 'HttpRequest::getResponseHeader' => ['mixed', 'name='=>'string'], + 'HttpRequest::getResponseInfo' => ['mixed', 'name='=>'string'], + 'HttpRequest::getResponseMessage' => ['HttpMessage'], + 'HttpRequest::getResponseStatus' => ['string'], + 'HttpRequest::getSslOptions' => ['array'], + 'HttpRequest::getUrl' => ['string'], + 'HttpRequest::head' => ['', 'url'=>'', 'options'=>'', '&info'=>''], + 'HttpRequest::methodExists' => ['', 'method'=>''], + 'HttpRequest::methodName' => ['', 'method_id'=>''], + 'HttpRequest::methodRegister' => ['', 'method_name'=>''], + 'HttpRequest::methodUnregister' => ['', 'method'=>''], + 'HttpRequest::postData' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], + 'HttpRequest::postFields' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], + 'HttpRequest::putData' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], + 'HttpRequest::putFile' => ['', 'url'=>'', 'file'=>'', 'options'=>'', '&info'=>''], + 'HttpRequest::putStream' => ['', 'url'=>'', 'stream'=>'', 'options'=>'', '&info'=>''], + 'HttpRequest::resetCookies' => ['bool', 'session_only='=>'bool'], + 'HttpRequest::send' => ['HttpMessage'], + 'HttpRequest::setBody' => ['bool', 'request_body_data='=>'string'], + 'HttpRequest::setContentType' => ['bool', 'content_type'=>'string'], + 'HttpRequest::setCookies' => ['bool', 'cookies='=>'array'], + 'HttpRequest::setHeaders' => ['bool', 'headers='=>'array'], + 'HttpRequest::setMethod' => ['bool', 'request_method'=>'int'], + 'HttpRequest::setOptions' => ['bool', 'options='=>'array'], + 'HttpRequest::setPostFields' => ['bool', 'post_data'=>'array'], + 'HttpRequest::setPostFiles' => ['bool', 'post_files'=>'array'], + 'HttpRequest::setPutData' => ['bool', 'put_data='=>'string'], + 'HttpRequest::setPutFile' => ['bool', 'file='=>'string'], + 'HttpRequest::setQueryData' => ['bool', 'query_data'=>'mixed'], + 'HttpRequest::setRawPostData' => ['bool', 'raw_post_data='=>'string'], + 'HttpRequest::setSslOptions' => ['bool', 'options='=>'array'], + 'HttpRequest::setUrl' => ['bool', 'url'=>'string'], + 'HttpRequestDataShare::__construct' => ['void'], + 'HttpRequestDataShare::__destruct' => ['void'], + 'HttpRequestDataShare::attach' => ['', 'request'=>'HttpRequest'], + 'HttpRequestDataShare::count' => ['int'], + 'HttpRequestDataShare::detach' => ['', 'request'=>'HttpRequest'], + 'HttpRequestDataShare::factory' => ['', 'global'=>'', 'class_name'=>''], + 'HttpRequestDataShare::reset' => [''], + 'HttpRequestDataShare::singleton' => ['', 'global'=>''], + 'HttpRequestPool::__construct' => ['void', 'request='=>'HttpRequest'], + 'HttpRequestPool::__destruct' => ['void'], + 'HttpRequestPool::attach' => ['bool', 'request'=>'HttpRequest'], + 'HttpRequestPool::count' => ['int'], + 'HttpRequestPool::current' => ['mixed'], + 'HttpRequestPool::detach' => ['bool', 'request'=>'HttpRequest'], + 'HttpRequestPool::enableEvents' => ['', 'enable'=>''], + 'HttpRequestPool::enablePipelining' => ['', 'enable'=>''], + 'HttpRequestPool::getAttachedRequests' => ['array'], + 'HttpRequestPool::getFinishedRequests' => ['array'], + 'HttpRequestPool::key' => ['int|string'], + 'HttpRequestPool::next' => ['void'], + 'HttpRequestPool::reset' => ['void'], + 'HttpRequestPool::rewind' => ['void'], + 'HttpRequestPool::send' => ['bool'], + 'HttpRequestPool::socketPerform' => ['bool'], + 'HttpRequestPool::socketSelect' => ['bool', 'timeout='=>'float'], + 'HttpRequestPool::valid' => ['bool'], + 'HttpResponse::capture' => ['void'], + 'HttpResponse::getBufferSize' => ['int'], + 'HttpResponse::getCache' => ['bool'], + 'HttpResponse::getCacheControl' => ['string'], + 'HttpResponse::getContentDisposition' => ['string'], + 'HttpResponse::getContentType' => ['string'], + 'HttpResponse::getData' => ['string'], + 'HttpResponse::getETag' => ['string'], + 'HttpResponse::getFile' => ['string'], + 'HttpResponse::getGzip' => ['bool'], + 'HttpResponse::getHeader' => ['mixed', 'name='=>'string'], + 'HttpResponse::getLastModified' => ['int'], + 'HttpResponse::getRequestBody' => ['string'], + 'HttpResponse::getRequestBodyStream' => ['resource'], + 'HttpResponse::getRequestHeaders' => ['array'], + 'HttpResponse::getStream' => ['resource'], + 'HttpResponse::getThrottleDelay' => ['float'], + 'HttpResponse::guessContentType' => ['string|false', 'magic_file'=>'string', 'magic_mode='=>'int'], + 'HttpResponse::redirect' => ['void', 'url='=>'string', 'params='=>'array', 'session='=>'bool', 'status='=>'int'], + 'HttpResponse::send' => ['bool', 'clean_ob='=>'bool'], + 'HttpResponse::setBufferSize' => ['bool', 'bytes'=>'int'], + 'HttpResponse::setCache' => ['bool', 'cache'=>'bool'], + 'HttpResponse::setCacheControl' => ['bool', 'control'=>'string', 'max_age='=>'int', 'must_revalidate='=>'bool'], + 'HttpResponse::setContentDisposition' => ['bool', 'filename'=>'string', 'inline='=>'bool'], + 'HttpResponse::setContentType' => ['bool', 'content_type'=>'string'], + 'HttpResponse::setData' => ['bool', 'data'=>'mixed'], + 'HttpResponse::setETag' => ['bool', 'etag'=>'string'], + 'HttpResponse::setFile' => ['bool', 'file'=>'string'], + 'HttpResponse::setGzip' => ['bool', 'gzip'=>'bool'], + 'HttpResponse::setHeader' => ['bool', 'name'=>'string', 'value='=>'mixed', 'replace='=>'bool'], + 'HttpResponse::setLastModified' => ['bool', 'timestamp'=>'int'], + 'HttpResponse::setStream' => ['bool', 'stream'=>'resource'], + 'HttpResponse::setThrottleDelay' => ['bool', 'seconds'=>'float'], + 'HttpResponse::status' => ['bool', 'status'=>'int'], + 'HttpUtil::buildCookie' => ['', 'cookie_array'=>''], + 'HttpUtil::buildStr' => ['', 'query'=>'', 'prefix'=>'', 'arg_sep'=>''], + 'HttpUtil::buildUrl' => ['', 'url'=>'', 'parts'=>'', 'flags'=>'', '&composed'=>''], + 'HttpUtil::chunkedDecode' => ['', 'encoded_string'=>''], + 'HttpUtil::date' => ['', 'timestamp'=>''], + 'HttpUtil::deflate' => ['', 'plain'=>'', 'flags'=>''], + 'HttpUtil::inflate' => ['', 'encoded'=>''], + 'HttpUtil::matchEtag' => ['', 'plain_etag'=>'', 'for_range'=>''], + 'HttpUtil::matchModified' => ['', 'last_modified'=>'', 'for_range'=>''], + 'HttpUtil::matchRequestHeader' => ['', 'header_name'=>'', 'header_value'=>'', 'case_sensitive'=>''], + 'HttpUtil::negotiateCharset' => ['', 'supported'=>'', '&result'=>''], + 'HttpUtil::negotiateContentType' => ['', 'supported'=>'', '&result'=>''], + 'HttpUtil::negotiateLanguage' => ['', 'supported'=>'', '&result'=>''], + 'HttpUtil::parseCookie' => ['', 'cookie_string'=>''], + 'HttpUtil::parseHeaders' => ['', 'headers_string'=>''], + 'HttpUtil::parseMessage' => ['', 'message_string'=>''], + 'HttpUtil::parseParams' => ['', 'param_string'=>'', 'flags'=>''], + 'HttpUtil::support' => ['', 'feature'=>''], + 'Imagick::__construct' => ['void', 'files='=>'string|string[]'], + 'Imagick::__toString' => ['string'], + 'Imagick::adaptiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], + 'Imagick::adaptiveResizeImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool'], + 'Imagick::adaptiveSharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], + 'Imagick::adaptiveThresholdImage' => ['bool', 'width'=>'int', 'height'=>'int', 'offset'=>'int'], + 'Imagick::addImage' => ['bool', 'source'=>'Imagick'], + 'Imagick::addNoiseImage' => ['bool', 'noise_type'=>'int', 'channel='=>'int'], + 'Imagick::affineTransformImage' => ['bool', 'matrix'=>'ImagickDraw'], + 'Imagick::animateImages' => ['bool', 'x_server'=>'string'], + 'Imagick::annotateImage' => ['bool', 'draw_settings'=>'ImagickDraw', 'x'=>'float', 'y'=>'float', 'angle'=>'float', 'text'=>'string'], + 'Imagick::appendImages' => ['Imagick', 'stack'=>'bool'], + 'Imagick::autoGammaImage' => ['bool', 'channel='=>'int'], + 'Imagick::autoLevelImage' => ['void', 'CHANNEL='=>'string'], + 'Imagick::autoOrient' => ['bool'], + 'Imagick::averageImages' => ['Imagick'], + 'Imagick::blackThresholdImage' => ['bool', 'threshold'=>'mixed'], + 'Imagick::blueShiftImage' => ['void', 'factor='=>'float'], + 'Imagick::blurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], + 'Imagick::borderImage' => ['bool', 'bordercolor'=>'mixed', 'width'=>'int', 'height'=>'int'], + 'Imagick::brightnessContrastImage' => ['void', 'brightness'=>'string', 'contrast'=>'string', 'CHANNEL='=>'string'], + 'Imagick::charcoalImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'], + 'Imagick::chopImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], + 'Imagick::clampImage' => ['void', 'CHANNEL='=>'string'], + 'Imagick::clear' => ['bool'], + 'Imagick::clipImage' => ['bool'], + 'Imagick::clipImagePath' => ['void', 'pathname'=>'string', 'inside'=>'string'], + 'Imagick::clipPathImage' => ['bool', 'pathname'=>'string', 'inside'=>'bool'], + 'Imagick::clone' => ['Imagick'], + 'Imagick::clutImage' => ['bool', 'lookup_table'=>'Imagick', 'channel='=>'float'], + 'Imagick::coalesceImages' => ['Imagick'], + 'Imagick::colorFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'], + 'Imagick::colorMatrixImage' => ['void', 'color_matrix'=>'string'], + 'Imagick::colorizeImage' => ['bool', 'colorize'=>'mixed', 'opacity'=>'mixed'], + 'Imagick::combineImages' => ['Imagick', 'channeltype'=>'int'], + 'Imagick::commentImage' => ['bool', 'comment'=>'string'], + 'Imagick::compareImageChannels' => ['array{Imagick, float}', 'image'=>'Imagick', 'channeltype'=>'int', 'metrictype'=>'int'], + 'Imagick::compareImageLayers' => ['Imagick', 'method'=>'int'], + 'Imagick::compareImages' => ['array{Imagick, float}', 'compare'=>'Imagick', 'metric'=>'int'], + 'Imagick::compositeImage' => ['bool', 'composite_object'=>'Imagick', 'composite'=>'int', 'x'=>'int', 'y'=>'int', 'channel='=>'int'], + 'Imagick::compositeImageGravity' => ['bool', 'Imagick'=>'Imagick', 'COMPOSITE_CONSTANT'=>'int', 'GRAVITY_CONSTANT'=>'int'], + 'Imagick::contrastImage' => ['bool', 'sharpen'=>'bool'], + 'Imagick::contrastStretchImage' => ['bool', 'black_point'=>'float', 'white_point'=>'float', 'channel='=>'int'], + 'Imagick::convolveImage' => ['bool', 'kernel'=>'array', 'channel='=>'int'], + 'Imagick::count' => ['void', 'mode='=>'string'], + 'Imagick::cropImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], + 'Imagick::cropThumbnailImage' => ['bool', 'width'=>'int', 'height'=>'int', 'legacy='=>'bool'], + 'Imagick::current' => ['Imagick'], + 'Imagick::cycleColormapImage' => ['bool', 'displace'=>'int'], + 'Imagick::decipherImage' => ['bool', 'passphrase'=>'string'], + 'Imagick::deconstructImages' => ['Imagick'], + 'Imagick::deleteImageArtifact' => ['bool', 'artifact'=>'string'], + 'Imagick::deleteImageProperty' => ['void', 'name'=>'string'], + 'Imagick::deskewImage' => ['bool', 'threshold'=>'float'], + 'Imagick::despeckleImage' => ['bool'], + 'Imagick::destroy' => ['bool'], + 'Imagick::displayImage' => ['bool', 'servername'=>'string'], + 'Imagick::displayImages' => ['bool', 'servername'=>'string'], + 'Imagick::distortImage' => ['bool', 'method'=>'int', 'arguments'=>'array', 'bestfit'=>'bool'], + 'Imagick::drawImage' => ['bool', 'draw'=>'ImagickDraw'], + 'Imagick::edgeImage' => ['bool', 'radius'=>'float'], + 'Imagick::embossImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'], + 'Imagick::encipherImage' => ['bool', 'passphrase'=>'string'], + 'Imagick::enhanceImage' => ['bool'], + 'Imagick::equalizeImage' => ['bool'], + 'Imagick::evaluateImage' => ['bool', 'op'=>'int', 'constant'=>'float', 'channel='=>'int'], + 'Imagick::evaluateImages' => ['bool', 'EVALUATE_CONSTANT'=>'int'], + 'Imagick::exportImagePixels' => ['list', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int'], + 'Imagick::extentImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], + 'Imagick::filter' => ['void', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'int'], + 'Imagick::flattenImages' => ['Imagick'], + 'Imagick::flipImage' => ['bool'], + 'Imagick::floodFillPaintImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'target'=>'mixed', 'x'=>'int', 'y'=>'int', 'invert'=>'bool', 'channel='=>'int'], + 'Imagick::flopImage' => ['bool'], + 'Imagick::forwardFourierTransformimage' => ['void', 'magnitude'=>'bool'], + 'Imagick::frameImage' => ['bool', 'matte_color'=>'mixed', 'width'=>'int', 'height'=>'int', 'inner_bevel'=>'int', 'outer_bevel'=>'int'], + 'Imagick::functionImage' => ['bool', 'function'=>'int', 'arguments'=>'array', 'channel='=>'int'], + 'Imagick::fxImage' => ['Imagick', 'expression'=>'string', 'channel='=>'int'], + 'Imagick::gammaImage' => ['bool', 'gamma'=>'float', 'channel='=>'int'], + 'Imagick::gaussianBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], + 'Imagick::getColorspace' => ['int'], + 'Imagick::getCompression' => ['int'], + 'Imagick::getCompressionQuality' => ['int'], + 'Imagick::getConfigureOptions' => ['string'], + 'Imagick::getCopyright' => ['string'], + 'Imagick::getFeatures' => ['string'], + 'Imagick::getFilename' => ['string'], + 'Imagick::getFont' => ['string|false'], + 'Imagick::getFormat' => ['string'], + 'Imagick::getGravity' => ['int'], + 'Imagick::getHDRIEnabled' => ['int'], + 'Imagick::getHomeURL' => ['string'], + 'Imagick::getImage' => ['Imagick'], + 'Imagick::getImageAlphaChannel' => ['int'], + 'Imagick::getImageArtifact' => ['string', 'artifact'=>'string'], + 'Imagick::getImageAttribute' => ['string', 'key'=>'string'], + 'Imagick::getImageBackgroundColor' => ['ImagickPixel'], + 'Imagick::getImageBlob' => ['string'], + 'Imagick::getImageBluePrimary' => ['array{x:float, y:float}'], + 'Imagick::getImageBorderColor' => ['ImagickPixel'], + 'Imagick::getImageChannelDepth' => ['int', 'channel'=>'int'], + 'Imagick::getImageChannelDistortion' => ['float', 'reference'=>'Imagick', 'channel'=>'int', 'metric'=>'int'], + 'Imagick::getImageChannelDistortions' => ['float', 'reference'=>'Imagick', 'metric'=>'int', 'channel='=>'int'], + 'Imagick::getImageChannelExtrema' => ['array{minima:int, maxima:int}', 'channel'=>'int'], + 'Imagick::getImageChannelKurtosis' => ['array{kurtosis:float, skewness:float}', 'channel='=>'int'], + 'Imagick::getImageChannelMean' => ['array{mean:float, standardDeviation:float}', 'channel'=>'int'], + 'Imagick::getImageChannelRange' => ['array{minima:float, maxima:float}', 'channel'=>'int'], + 'Imagick::getImageChannelStatistics' => ['array'], + 'Imagick::getImageClipMask' => ['Imagick'], + 'Imagick::getImageColormapColor' => ['ImagickPixel', 'index'=>'int'], + 'Imagick::getImageColors' => ['int'], + 'Imagick::getImageColorspace' => ['int'], + 'Imagick::getImageCompose' => ['int'], + 'Imagick::getImageCompression' => ['int'], + 'Imagick::getImageCompressionQuality' => ['int'], + 'Imagick::getImageDelay' => ['int'], + 'Imagick::getImageDepth' => ['int'], + 'Imagick::getImageDispose' => ['int'], + 'Imagick::getImageDistortion' => ['float', 'reference'=>'magickwand', 'metric'=>'int'], + 'Imagick::getImageExtrema' => ['array{min:int, max:int}'], + 'Imagick::getImageFilename' => ['string'], + 'Imagick::getImageFormat' => ['string'], + 'Imagick::getImageGamma' => ['float'], + 'Imagick::getImageGeometry' => ['array{width:int, height:int}'], + 'Imagick::getImageGravity' => ['int'], + 'Imagick::getImageGreenPrimary' => ['array{x:float, y:float}'], + 'Imagick::getImageHeight' => ['int'], + 'Imagick::getImageHistogram' => ['list'], + 'Imagick::getImageIndex' => ['int'], + 'Imagick::getImageInterlaceScheme' => ['int'], + 'Imagick::getImageInterpolateMethod' => ['int'], + 'Imagick::getImageIterations' => ['int'], + 'Imagick::getImageLength' => ['int'], + 'Imagick::getImageMagickLicense' => ['string'], + 'Imagick::getImageMatte' => ['bool'], + 'Imagick::getImageMatteColor' => ['ImagickPixel'], + 'Imagick::getImageMimeType' => ['string'], + 'Imagick::getImageOrientation' => ['int'], + 'Imagick::getImagePage' => ['array{width:int, height:int, x:int, y:int}'], + 'Imagick::getImagePixelColor' => ['ImagickPixel', 'x'=>'int', 'y'=>'int'], + 'Imagick::getImageProfile' => ['string', 'name'=>'string'], + 'Imagick::getImageProfiles' => ['array', 'pattern='=>'string', 'only_names='=>'bool'], + 'Imagick::getImageProperties' => ['array', 'pattern='=>'string', 'only_names='=>'bool'], + 'Imagick::getImageProperty' => ['string|false', 'name'=>'string'], + 'Imagick::getImageRedPrimary' => ['array{x:float, y:float}'], + 'Imagick::getImageRegion' => ['Imagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], + 'Imagick::getImageRenderingIntent' => ['int'], + 'Imagick::getImageResolution' => ['array{x:float, y:float}'], + 'Imagick::getImageScene' => ['int'], + 'Imagick::getImageSignature' => ['string'], + 'Imagick::getImageSize' => ['int'], + 'Imagick::getImageTicksPerSecond' => ['int'], + 'Imagick::getImageTotalInkDensity' => ['float'], + 'Imagick::getImageType' => ['int'], + 'Imagick::getImageUnits' => ['int'], + 'Imagick::getImageVirtualPixelMethod' => ['int'], + 'Imagick::getImageWhitePoint' => ['array{x:float, y:float}'], + 'Imagick::getImageWidth' => ['int'], + 'Imagick::getImagesBlob' => ['string'], + 'Imagick::getInterlaceScheme' => ['int'], + 'Imagick::getIteratorIndex' => ['int'], + 'Imagick::getNumberImages' => ['int'], + 'Imagick::getOption' => ['string', 'key'=>'string'], + 'Imagick::getPackageName' => ['string'], + 'Imagick::getPage' => ['array{width:int, height:int, x:int, y:int}'], + 'Imagick::getPixelIterator' => ['ImagickPixelIterator'], + 'Imagick::getPixelRegionIterator' => ['ImagickPixelIterator', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'], + 'Imagick::getPointSize' => ['float'], + 'Imagick::getQuantum' => ['int'], + 'Imagick::getQuantumDepth' => ['array{quantumDepthLong:int, quantumDepthString:string}'], + 'Imagick::getQuantumRange' => ['array{quantumRangeLong:int, quantumRangeString:string}'], + 'Imagick::getRegistry' => ['string|false', 'key'=>'string'], + 'Imagick::getReleaseDate' => ['string'], + 'Imagick::getResource' => ['int', 'type'=>'int'], + 'Imagick::getResourceLimit' => ['int', 'type'=>'int'], + 'Imagick::getSamplingFactors' => ['array'], + 'Imagick::getSize' => ['array{columns:int, rows: int}'], + 'Imagick::getSizeOffset' => ['int'], + 'Imagick::getVersion' => ['array{versionNumber: int, versionString:string}'], + 'Imagick::haldClutImage' => ['bool', 'clut'=>'Imagick', 'channel='=>'int'], + 'Imagick::hasNextImage' => ['bool'], + 'Imagick::hasPreviousImage' => ['bool'], + 'Imagick::identifyFormat' => ['string|false', 'embedText'=>'string'], + 'Imagick::identifyImage' => ['array', 'appendrawoutput='=>'bool'], + 'Imagick::identifyImageType' => ['int'], + 'Imagick::implodeImage' => ['bool', 'radius'=>'float'], + 'Imagick::importImagePixels' => ['bool', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int', 'pixels'=>'list'], + 'Imagick::inverseFourierTransformImage' => ['void', 'complement'=>'string', 'magnitude'=>'string'], + 'Imagick::key' => ['int|string'], + 'Imagick::labelImage' => ['bool', 'label'=>'string'], + 'Imagick::levelImage' => ['bool', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'int'], + 'Imagick::linearStretchImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float'], + 'Imagick::liquidRescaleImage' => ['bool', 'width'=>'int', 'height'=>'int', 'delta_x'=>'float', 'rigidity'=>'float'], + 'Imagick::listRegistry' => ['array'], + 'Imagick::localContrastImage' => ['bool', 'radius'=>'float', 'strength'=>'float'], + 'Imagick::magnifyImage' => ['bool'], + 'Imagick::mapImage' => ['bool', 'map'=>'Imagick', 'dither'=>'bool'], + 'Imagick::matteFloodfillImage' => ['bool', 'alpha'=>'float', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'], + 'Imagick::medianFilterImage' => ['bool', 'radius'=>'float'], + 'Imagick::mergeImageLayers' => ['Imagick', 'layer_method'=>'int'], + 'Imagick::minifyImage' => ['bool'], + 'Imagick::modulateImage' => ['bool', 'brightness'=>'float', 'saturation'=>'float', 'hue'=>'float'], + 'Imagick::montageImage' => ['Imagick', 'draw'=>'ImagickDraw', 'tile_geometry'=>'string', 'thumbnail_geometry'=>'string', 'mode'=>'int', 'frame'=>'string'], + 'Imagick::morphImages' => ['Imagick', 'number_frames'=>'int'], + 'Imagick::morphology' => ['void', 'morphologyMethod'=>'int', 'iterations'=>'int', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'string'], + 'Imagick::mosaicImages' => ['Imagick'], + 'Imagick::motionBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float', 'channel='=>'int'], + 'Imagick::negateImage' => ['bool', 'gray'=>'bool', 'channel='=>'int'], + 'Imagick::newImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'background'=>'mixed', 'format='=>'string'], + 'Imagick::newPseudoImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'pseudostring'=>'string'], + 'Imagick::next' => ['void'], + 'Imagick::nextImage' => ['bool'], + 'Imagick::normalizeImage' => ['bool', 'channel='=>'int'], + 'Imagick::oilPaintImage' => ['bool', 'radius'=>'float'], + 'Imagick::opaquePaintImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'invert'=>'bool', 'channel='=>'int'], + 'Imagick::optimizeImageLayers' => ['bool'], + 'Imagick::orderedPosterizeImage' => ['bool', 'threshold_map'=>'string', 'channel='=>'int'], + 'Imagick::paintFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int', 'channel='=>'int'], + 'Imagick::paintOpaqueImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'channel='=>'int'], + 'Imagick::paintTransparentImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float'], + 'Imagick::pingImage' => ['bool', 'filename'=>'string'], + 'Imagick::pingImageBlob' => ['bool', 'image'=>'string'], + 'Imagick::pingImageFile' => ['bool', 'filehandle'=>'resource', 'filename='=>'string'], + 'Imagick::polaroidImage' => ['bool', 'properties'=>'ImagickDraw', 'angle'=>'float'], + 'Imagick::posterizeImage' => ['bool', 'levels'=>'int', 'dither'=>'bool'], + 'Imagick::previewImages' => ['bool', 'preview'=>'int'], + 'Imagick::previousImage' => ['bool'], + 'Imagick::profileImage' => ['bool', 'name'=>'string', 'profile'=>'string'], + 'Imagick::quantizeImage' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], + 'Imagick::quantizeImages' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], + 'Imagick::queryFontMetrics' => ['array', 'properties'=>'ImagickDraw', 'text'=>'string', 'multiline='=>'bool'], + 'Imagick::queryFonts' => ['array', 'pattern='=>'string'], + 'Imagick::queryFormats' => ['list', 'pattern='=>'string'], + 'Imagick::radialBlurImage' => ['bool', 'angle'=>'float', 'channel='=>'int'], + 'Imagick::raiseImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int', 'raise'=>'bool'], + 'Imagick::randomThresholdImage' => ['bool', 'low'=>'float', 'high'=>'float', 'channel='=>'int'], + 'Imagick::readImage' => ['bool', 'filename'=>'string'], + 'Imagick::readImageBlob' => ['bool', 'image'=>'string', 'filename='=>'string'], + 'Imagick::readImageFile' => ['bool', 'filehandle'=>'resource', 'filename='=>'string'], + 'Imagick::readImages' => ['Imagick', 'filenames'=>'string'], + 'Imagick::recolorImage' => ['bool', 'matrix'=>'list'], + 'Imagick::reduceNoiseImage' => ['bool', 'radius'=>'float'], + 'Imagick::remapImage' => ['bool', 'replacement'=>'Imagick', 'dither'=>'int'], + 'Imagick::removeImage' => ['bool'], + 'Imagick::removeImageProfile' => ['string', 'name'=>'string'], + 'Imagick::render' => ['bool'], + 'Imagick::resampleImage' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float', 'filter'=>'int', 'blur'=>'float'], + 'Imagick::resetImagePage' => ['bool', 'page'=>'string'], + 'Imagick::resetIterator' => [''], + 'Imagick::resizeImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'filter'=>'int', 'blur'=>'float', 'bestfit='=>'bool'], + 'Imagick::rewind' => ['void'], + 'Imagick::rollImage' => ['bool', 'x'=>'int', 'y'=>'int'], + 'Imagick::rotateImage' => ['bool', 'background'=>'mixed', 'degrees'=>'float'], + 'Imagick::rotationalBlurImage' => ['void', 'angle'=>'string', 'CHANNEL='=>'string'], + 'Imagick::roundCorners' => ['bool', 'x_rounding'=>'float', 'y_rounding'=>'float', 'stroke_width='=>'float', 'displace='=>'float', 'size_correction='=>'float'], + 'Imagick::roundCornersImage' => ['', 'xRounding'=>'', 'yRounding'=>'', 'strokeWidth'=>'', 'displace'=>'', 'sizeCorrection'=>''], + 'Imagick::sampleImage' => ['bool', 'columns'=>'int', 'rows'=>'int'], + 'Imagick::scaleImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'bestfit='=>'bool'], + 'Imagick::segmentImage' => ['bool', 'colorspace'=>'int', 'cluster_threshold'=>'float', 'smooth_threshold'=>'float', 'verbose='=>'bool'], + 'Imagick::selectiveBlurImage' => ['void', 'radius'=>'float', 'sigma'=>'float', 'threshold'=>'float', 'CHANNEL'=>'int'], + 'Imagick::separateImageChannel' => ['bool', 'channel'=>'int'], + 'Imagick::sepiaToneImage' => ['bool', 'threshold'=>'float'], + 'Imagick::setAntiAlias' => ['int', 'antialias'=>'bool'], + 'Imagick::setBackgroundColor' => ['bool', 'background'=>'mixed'], + 'Imagick::setColorspace' => ['bool', 'colorspace'=>'int'], + 'Imagick::setCompression' => ['bool', 'compression'=>'int'], + 'Imagick::setCompressionQuality' => ['bool', 'quality'=>'int'], + 'Imagick::setFilename' => ['bool', 'filename'=>'string'], + 'Imagick::setFirstIterator' => ['bool'], + 'Imagick::setFont' => ['bool', 'font'=>'string'], + 'Imagick::setFormat' => ['bool', 'format'=>'string'], + 'Imagick::setGravity' => ['bool', 'gravity'=>'int'], + 'Imagick::setImage' => ['bool', 'replace'=>'Imagick'], + 'Imagick::setImageAlpha' => ['bool', 'alpha'=>'float'], + 'Imagick::setImageAlphaChannel' => ['bool', 'mode'=>'int'], + 'Imagick::setImageArtifact' => ['bool', 'artifact'=>'string', 'value'=>'string'], + 'Imagick::setImageAttribute' => ['void', 'key'=>'string', 'value'=>'string'], + 'Imagick::setImageBackgroundColor' => ['bool', 'background'=>'mixed'], + 'Imagick::setImageBias' => ['bool', 'bias'=>'float'], + 'Imagick::setImageBiasQuantum' => ['void', 'bias'=>'string'], + 'Imagick::setImageBluePrimary' => ['bool', 'x'=>'float', 'y'=>'float'], + 'Imagick::setImageBorderColor' => ['bool', 'border'=>'mixed'], + 'Imagick::setImageChannelDepth' => ['bool', 'channel'=>'int', 'depth'=>'int'], + 'Imagick::setImageChannelMask' => ['', 'channel'=>'int'], + 'Imagick::setImageClipMask' => ['bool', 'clip_mask'=>'Imagick'], + 'Imagick::setImageColormapColor' => ['bool', 'index'=>'int', 'color'=>'ImagickPixel'], + 'Imagick::setImageColorspace' => ['bool', 'colorspace'=>'int'], + 'Imagick::setImageCompose' => ['bool', 'compose'=>'int'], + 'Imagick::setImageCompression' => ['bool', 'compression'=>'int'], + 'Imagick::setImageCompressionQuality' => ['bool', 'quality'=>'int'], + 'Imagick::setImageDelay' => ['bool', 'delay'=>'int'], + 'Imagick::setImageDepth' => ['bool', 'depth'=>'int'], + 'Imagick::setImageDispose' => ['bool', 'dispose'=>'int'], + 'Imagick::setImageExtent' => ['bool', 'columns'=>'int', 'rows'=>'int'], + 'Imagick::setImageFilename' => ['bool', 'filename'=>'string'], + 'Imagick::setImageFormat' => ['bool', 'format'=>'string'], + 'Imagick::setImageGamma' => ['bool', 'gamma'=>'float'], + 'Imagick::setImageGravity' => ['bool', 'gravity'=>'int'], + 'Imagick::setImageGreenPrimary' => ['bool', 'x'=>'float', 'y'=>'float'], + 'Imagick::setImageIndex' => ['bool', 'index'=>'int'], + 'Imagick::setImageInterlaceScheme' => ['bool', 'interlace_scheme'=>'int'], + 'Imagick::setImageInterpolateMethod' => ['bool', 'method'=>'int'], + 'Imagick::setImageIterations' => ['bool', 'iterations'=>'int'], + 'Imagick::setImageMatte' => ['bool', 'matte'=>'bool'], + 'Imagick::setImageMatteColor' => ['bool', 'matte'=>'mixed'], + 'Imagick::setImageOpacity' => ['bool', 'opacity'=>'float'], + 'Imagick::setImageOrientation' => ['bool', 'orientation'=>'int'], + 'Imagick::setImagePage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], + 'Imagick::setImageProfile' => ['bool', 'name'=>'string', 'profile'=>'string'], + 'Imagick::setImageProgressMonitor' => ['', 'filename'=>''], + 'Imagick::setImageProperty' => ['bool', 'name'=>'string', 'value'=>'string'], + 'Imagick::setImageRedPrimary' => ['bool', 'x'=>'float', 'y'=>'float'], + 'Imagick::setImageRenderingIntent' => ['bool', 'rendering_intent'=>'int'], + 'Imagick::setImageResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'], + 'Imagick::setImageScene' => ['bool', 'scene'=>'int'], + 'Imagick::setImageTicksPerSecond' => ['bool', 'ticks_per_second'=>'int'], + 'Imagick::setImageType' => ['bool', 'image_type'=>'int'], + 'Imagick::setImageUnits' => ['bool', 'units'=>'int'], + 'Imagick::setImageVirtualPixelMethod' => ['bool', 'method'=>'int'], + 'Imagick::setImageWhitePoint' => ['bool', 'x'=>'float', 'y'=>'float'], + 'Imagick::setInterlaceScheme' => ['bool', 'interlace_scheme'=>'int'], + 'Imagick::setIteratorIndex' => ['bool', 'index'=>'int'], + 'Imagick::setLastIterator' => ['bool'], + 'Imagick::setOption' => ['bool', 'key'=>'string', 'value'=>'string'], + 'Imagick::setPage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], + 'Imagick::setPointSize' => ['bool', 'point_size'=>'float'], + 'Imagick::setProgressMonitor' => ['void', 'callback'=>'callable'], + 'Imagick::setRegistry' => ['void', 'key'=>'string', 'value'=>'string'], + 'Imagick::setResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'], + 'Imagick::setResourceLimit' => ['bool', 'type'=>'int', 'limit'=>'int'], + 'Imagick::setSamplingFactors' => ['bool', 'factors'=>'list'], + 'Imagick::setSize' => ['bool', 'columns'=>'int', 'rows'=>'int'], + 'Imagick::setSizeOffset' => ['bool', 'columns'=>'int', 'rows'=>'int', 'offset'=>'int'], + 'Imagick::setType' => ['bool', 'image_type'=>'int'], + 'Imagick::shadeImage' => ['bool', 'gray'=>'bool', 'azimuth'=>'float', 'elevation'=>'float'], + 'Imagick::shadowImage' => ['bool', 'opacity'=>'float', 'sigma'=>'float', 'x'=>'int', 'y'=>'int'], + 'Imagick::sharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], + 'Imagick::shaveImage' => ['bool', 'columns'=>'int', 'rows'=>'int'], + 'Imagick::shearImage' => ['bool', 'background'=>'mixed', 'x_shear'=>'float', 'y_shear'=>'float'], + 'Imagick::sigmoidalContrastImage' => ['bool', 'sharpen'=>'bool', 'alpha'=>'float', 'beta'=>'float', 'channel='=>'int'], + 'Imagick::similarityImage' => ['Imagick', 'Imagick'=>'Imagick', '&bestMatch'=>'array', '&similarity'=>'float', 'similarity_threshold'=>'float', 'metric'=>'int'], + 'Imagick::sketchImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float'], + 'Imagick::smushImages' => ['Imagick', 'stack'=>'string', 'offset'=>'string'], + 'Imagick::solarizeImage' => ['bool', 'threshold'=>'int'], + 'Imagick::sparseColorImage' => ['bool', 'sparse_method'=>'int', 'arguments'=>'array', 'channel='=>'int'], + 'Imagick::spliceImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], + 'Imagick::spreadImage' => ['bool', 'radius'=>'float'], + 'Imagick::statisticImage' => ['void', 'type'=>'int', 'width'=>'int', 'height'=>'int', 'CHANNEL='=>'string'], + 'Imagick::steganoImage' => ['Imagick', 'watermark_wand'=>'Imagick', 'offset'=>'int'], + 'Imagick::stereoImage' => ['bool', 'offset_wand'=>'Imagick'], + 'Imagick::stripImage' => ['bool'], + 'Imagick::subImageMatch' => ['Imagick', 'Imagick'=>'Imagick', '&w_offset='=>'array', '&w_similarity='=>'float'], + 'Imagick::swirlImage' => ['bool', 'degrees'=>'float'], + 'Imagick::textureImage' => ['bool', 'texture_wand'=>'Imagick'], + 'Imagick::thresholdImage' => ['bool', 'threshold'=>'float', 'channel='=>'int'], + 'Imagick::thumbnailImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool', 'fill='=>'bool', 'legacy='=>'bool'], + 'Imagick::tintImage' => ['bool', 'tint'=>'mixed', 'opacity'=>'mixed'], + 'Imagick::transformImage' => ['Imagick', 'crop'=>'string', 'geometry'=>'string'], + 'Imagick::transformImageColorspace' => ['bool', 'colorspace'=>'int'], + 'Imagick::transparentPaintImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float', 'invert'=>'bool'], + 'Imagick::transposeImage' => ['bool'], + 'Imagick::transverseImage' => ['bool'], + 'Imagick::trimImage' => ['bool', 'fuzz'=>'float'], + 'Imagick::uniqueImageColors' => ['bool'], + 'Imagick::unsharpMaskImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'amount'=>'float', 'threshold'=>'float', 'channel='=>'int'], + 'Imagick::valid' => ['bool'], + 'Imagick::vignetteImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float', 'x'=>'int', 'y'=>'int'], + 'Imagick::waveImage' => ['bool', 'amplitude'=>'float', 'length'=>'float'], + 'Imagick::whiteThresholdImage' => ['bool', 'threshold'=>'mixed'], + 'Imagick::writeImage' => ['bool', 'filename='=>'string'], + 'Imagick::writeImageFile' => ['bool', 'filehandle'=>'resource'], + 'Imagick::writeImages' => ['bool', 'filename'=>'string', 'adjoin'=>'bool'], + 'Imagick::writeImagesFile' => ['bool', 'filehandle'=>'resource'], + 'ImagickDraw::__construct' => ['void'], + 'ImagickDraw::affine' => ['bool', 'affine'=>'array'], + 'ImagickDraw::annotation' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'], + 'ImagickDraw::arc' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float', 'sd'=>'float', 'ed'=>'float'], + 'ImagickDraw::bezier' => ['bool', 'coordinates'=>'list'], + 'ImagickDraw::circle' => ['bool', 'ox'=>'float', 'oy'=>'float', 'px'=>'float', 'py'=>'float'], + 'ImagickDraw::clear' => ['bool'], + 'ImagickDraw::clone' => ['ImagickDraw'], + 'ImagickDraw::color' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'], + 'ImagickDraw::comment' => ['bool', 'comment'=>'string'], + 'ImagickDraw::composite' => ['bool', 'compose'=>'int', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float', 'compositewand'=>'Imagick'], + 'ImagickDraw::destroy' => ['bool'], + 'ImagickDraw::ellipse' => ['bool', 'ox'=>'float', 'oy'=>'float', 'rx'=>'float', 'ry'=>'float', 'start'=>'float', 'end'=>'float'], + 'ImagickDraw::getBorderColor' => ['ImagickPixel'], + 'ImagickDraw::getClipPath' => ['string|false'], + 'ImagickDraw::getClipRule' => ['int'], + 'ImagickDraw::getClipUnits' => ['int'], + 'ImagickDraw::getDensity' => ['?string'], + 'ImagickDraw::getFillColor' => ['ImagickPixel'], + 'ImagickDraw::getFillOpacity' => ['float'], + 'ImagickDraw::getFillRule' => ['int'], + 'ImagickDraw::getFont' => ['string|false'], + 'ImagickDraw::getFontFamily' => ['string|false'], + 'ImagickDraw::getFontResolution' => ['array'], + 'ImagickDraw::getFontSize' => ['float'], + 'ImagickDraw::getFontStretch' => ['int'], + 'ImagickDraw::getFontStyle' => ['int'], + 'ImagickDraw::getFontWeight' => ['int'], + 'ImagickDraw::getGravity' => ['int'], + 'ImagickDraw::getOpacity' => ['float'], + 'ImagickDraw::getStrokeAntialias' => ['bool'], + 'ImagickDraw::getStrokeColor' => ['ImagickPixel'], + 'ImagickDraw::getStrokeDashArray' => ['array'], + 'ImagickDraw::getStrokeDashOffset' => ['float'], + 'ImagickDraw::getStrokeLineCap' => ['int'], + 'ImagickDraw::getStrokeLineJoin' => ['int'], + 'ImagickDraw::getStrokeMiterLimit' => ['int'], + 'ImagickDraw::getStrokeOpacity' => ['float'], + 'ImagickDraw::getStrokeWidth' => ['float'], + 'ImagickDraw::getTextAlignment' => ['int'], + 'ImagickDraw::getTextAntialias' => ['bool'], + 'ImagickDraw::getTextDecoration' => ['int'], + 'ImagickDraw::getTextDirection' => ['bool'], + 'ImagickDraw::getTextEncoding' => ['string'], + 'ImagickDraw::getTextInterlineSpacing' => ['float'], + 'ImagickDraw::getTextInterwordSpacing' => ['float'], + 'ImagickDraw::getTextKerning' => ['float'], + 'ImagickDraw::getTextUnderColor' => ['ImagickPixel'], + 'ImagickDraw::getVectorGraphics' => ['string'], + 'ImagickDraw::line' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float'], + 'ImagickDraw::matte' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'], + 'ImagickDraw::pathClose' => ['bool'], + 'ImagickDraw::pathCurveToAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathCurveToQuadraticBezierAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathCurveToQuadraticBezierRelative' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathCurveToQuadraticBezierSmoothRelative' => ['bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathCurveToRelative' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathCurveToSmoothAbsolute' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathCurveToSmoothRelative' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathEllipticArcAbsolute' => ['bool', 'rx'=>'float', 'ry'=>'float', 'x_axis_rotation'=>'float', 'large_arc_flag'=>'bool', 'sweep_flag'=>'bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathEllipticArcRelative' => ['bool', 'rx'=>'float', 'ry'=>'float', 'x_axis_rotation'=>'float', 'large_arc_flag'=>'bool', 'sweep_flag'=>'bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathFinish' => ['bool'], + 'ImagickDraw::pathLineToAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathLineToHorizontalAbsolute' => ['bool', 'x'=>'float'], + 'ImagickDraw::pathLineToHorizontalRelative' => ['bool', 'x'=>'float'], + 'ImagickDraw::pathLineToRelative' => ['bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathLineToVerticalAbsolute' => ['bool', 'y'=>'float'], + 'ImagickDraw::pathLineToVerticalRelative' => ['bool', 'y'=>'float'], + 'ImagickDraw::pathMoveToAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathMoveToRelative' => ['bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::pathStart' => ['bool'], + 'ImagickDraw::point' => ['bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::polygon' => ['bool', 'coordinates'=>'list'], + 'ImagickDraw::polyline' => ['bool', 'coordinates'=>'list'], + 'ImagickDraw::pop' => ['bool'], + 'ImagickDraw::popClipPath' => ['bool'], + 'ImagickDraw::popDefs' => ['bool'], + 'ImagickDraw::popPattern' => ['bool'], + 'ImagickDraw::push' => ['bool'], + 'ImagickDraw::pushClipPath' => ['bool', 'clip_mask_id'=>'string'], + 'ImagickDraw::pushDefs' => ['bool'], + 'ImagickDraw::pushPattern' => ['bool', 'pattern_id'=>'string', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], + 'ImagickDraw::rectangle' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], + 'ImagickDraw::render' => ['bool'], + 'ImagickDraw::resetVectorGraphics' => ['void'], + 'ImagickDraw::rotate' => ['bool', 'degrees'=>'float'], + 'ImagickDraw::roundRectangle' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'rx'=>'float', 'ry'=>'float'], + 'ImagickDraw::scale' => ['bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::setBorderColor' => ['bool', 'color'=>'ImagickPixel|string'], + 'ImagickDraw::setClipPath' => ['bool', 'clip_mask'=>'string'], + 'ImagickDraw::setClipRule' => ['bool', 'fill_rule'=>'int'], + 'ImagickDraw::setClipUnits' => ['bool', 'clip_units'=>'int'], + 'ImagickDraw::setDensity' => ['bool', 'density_string'=>'string'], + 'ImagickDraw::setFillAlpha' => ['bool', 'opacity'=>'float'], + 'ImagickDraw::setFillColor' => ['bool', 'fill_pixel'=>'ImagickPixel|string'], + 'ImagickDraw::setFillOpacity' => ['bool', 'fillopacity'=>'float'], + 'ImagickDraw::setFillPatternURL' => ['bool', 'fill_url'=>'string'], + 'ImagickDraw::setFillRule' => ['bool', 'fill_rule'=>'int'], + 'ImagickDraw::setFont' => ['bool', 'font_name'=>'string'], + 'ImagickDraw::setFontFamily' => ['bool', 'font_family'=>'string'], + 'ImagickDraw::setFontResolution' => ['bool', 'x'=>'float', 'y'=>'float'], + 'ImagickDraw::setFontSize' => ['bool', 'pointsize'=>'float'], + 'ImagickDraw::setFontStretch' => ['bool', 'fontstretch'=>'int'], + 'ImagickDraw::setFontStyle' => ['bool', 'style'=>'int'], + 'ImagickDraw::setFontWeight' => ['bool', 'font_weight'=>'int'], + 'ImagickDraw::setGravity' => ['bool', 'gravity'=>'int'], + 'ImagickDraw::setOpacity' => ['void', 'opacity'=>'float'], + 'ImagickDraw::setResolution' => ['void', 'x_resolution'=>'float', 'y_resolution'=>'float'], + 'ImagickDraw::setStrokeAlpha' => ['bool', 'opacity'=>'float'], + 'ImagickDraw::setStrokeAntialias' => ['bool', 'stroke_antialias'=>'bool'], + 'ImagickDraw::setStrokeColor' => ['bool', 'stroke_pixel'=>'ImagickPixel|string'], + 'ImagickDraw::setStrokeDashArray' => ['bool', 'dasharray'=>'list'], + 'ImagickDraw::setStrokeDashOffset' => ['bool', 'dash_offset'=>'float'], + 'ImagickDraw::setStrokeLineCap' => ['bool', 'linecap'=>'int'], + 'ImagickDraw::setStrokeLineJoin' => ['bool', 'linejoin'=>'int'], + 'ImagickDraw::setStrokeMiterLimit' => ['bool', 'miterlimit'=>'int'], + 'ImagickDraw::setStrokeOpacity' => ['bool', 'stroke_opacity'=>'float'], + 'ImagickDraw::setStrokePatternURL' => ['bool', 'stroke_url'=>'string'], + 'ImagickDraw::setStrokeWidth' => ['bool', 'stroke_width'=>'float'], + 'ImagickDraw::setTextAlignment' => ['bool', 'alignment'=>'int'], + 'ImagickDraw::setTextAntialias' => ['bool', 'antialias'=>'bool'], + 'ImagickDraw::setTextDecoration' => ['bool', 'decoration'=>'int'], + 'ImagickDraw::setTextDirection' => ['bool', 'direction'=>'int'], + 'ImagickDraw::setTextEncoding' => ['bool', 'encoding'=>'string'], + 'ImagickDraw::setTextInterlineSpacing' => ['void', 'spacing'=>'float'], + 'ImagickDraw::setTextInterwordSpacing' => ['void', 'spacing'=>'float'], + 'ImagickDraw::setTextKerning' => ['void', 'kerning'=>'float'], + 'ImagickDraw::setTextUnderColor' => ['bool', 'under_color'=>'ImagickPixel|string'], + 'ImagickDraw::setVectorGraphics' => ['bool', 'xml'=>'string'], + 'ImagickDraw::setViewbox' => ['bool', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int'], + 'ImagickDraw::skewX' => ['bool', 'degrees'=>'float'], + 'ImagickDraw::skewY' => ['bool', 'degrees'=>'float'], + 'ImagickDraw::translate' => ['bool', 'x'=>'float', 'y'=>'float'], + 'ImagickKernel::addKernel' => ['void', 'ImagickKernel'=>'ImagickKernel'], + 'ImagickKernel::addUnityKernel' => ['void'], + 'ImagickKernel::fromBuiltin' => ['ImagickKernel', 'kernelType'=>'string', 'kernelString'=>'string'], + 'ImagickKernel::fromMatrix' => ['ImagickKernel', 'matrix'=>'list>', 'origin='=>'array'], + 'ImagickKernel::getMatrix' => ['list>'], + 'ImagickKernel::scale' => ['void'], + 'ImagickKernel::separate' => ['ImagickKernel[]'], + 'ImagickKernel::seperate' => ['void'], + 'ImagickPixel::__construct' => ['void', 'color='=>'string'], + 'ImagickPixel::clear' => ['bool'], + 'ImagickPixel::clone' => ['void'], + 'ImagickPixel::destroy' => ['bool'], + 'ImagickPixel::getColor' => ['array{r: int|float, g: int|float, b: int|float, a: int|float}', 'normalized='=>'0|1|2'], + 'ImagickPixel::getColorAsString' => ['string'], + 'ImagickPixel::getColorCount' => ['int'], + 'ImagickPixel::getColorQuantum' => ['mixed'], + 'ImagickPixel::getColorValue' => ['float', 'color'=>'int'], + 'ImagickPixel::getColorValueQuantum' => ['mixed'], + 'ImagickPixel::getHSL' => ['array{hue: float, saturation: float, luminosity: float}'], + 'ImagickPixel::getIndex' => ['int'], + 'ImagickPixel::isPixelSimilar' => ['bool', 'color'=>'ImagickPixel', 'fuzz'=>'float'], + 'ImagickPixel::isPixelSimilarQuantum' => ['bool', 'color'=>'string', 'fuzz='=>'string'], + 'ImagickPixel::isSimilar' => ['bool', 'color'=>'ImagickPixel', 'fuzz'=>'float'], + 'ImagickPixel::setColor' => ['bool', 'color'=>'string'], + 'ImagickPixel::setColorFromPixel' => ['bool', 'srcPixel'=>'ImagickPixel'], + 'ImagickPixel::setColorValue' => ['bool', 'color'=>'int', 'value'=>'float'], + 'ImagickPixel::setColorValueQuantum' => ['void', 'color'=>'int', 'value'=>'mixed'], + 'ImagickPixel::setHSL' => ['bool', 'hue'=>'float', 'saturation'=>'float', 'luminosity'=>'float'], + 'ImagickPixel::setIndex' => ['void', 'index'=>'int'], + 'ImagickPixel::setcolorcount' => ['void', 'colorCount'=>'string'], + 'ImagickPixelIterator::__construct' => ['void', 'wand'=>'Imagick'], + 'ImagickPixelIterator::clear' => ['bool'], + 'ImagickPixelIterator::current' => ['mixed'], + 'ImagickPixelIterator::destroy' => ['bool'], + 'ImagickPixelIterator::getCurrentIteratorRow' => ['array'], + 'ImagickPixelIterator::getIteratorRow' => ['int'], + 'ImagickPixelIterator::getNextIteratorRow' => ['array'], + 'ImagickPixelIterator::getPreviousIteratorRow' => ['array'], + 'ImagickPixelIterator::getpixeliterator' => ['', 'Imagick'=>'Imagick'], + 'ImagickPixelIterator::getpixelregioniterator' => ['', 'Imagick'=>'Imagick', 'x'=>'', 'y'=>'', 'columns'=>'', 'rows'=>''], + 'ImagickPixelIterator::key' => ['int|string'], + 'ImagickPixelIterator::newPixelIterator' => ['bool', 'wand'=>'Imagick'], + 'ImagickPixelIterator::newPixelRegionIterator' => ['bool', 'wand'=>'Imagick', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'], + 'ImagickPixelIterator::next' => ['void'], + 'ImagickPixelIterator::resetIterator' => ['bool'], + 'ImagickPixelIterator::rewind' => ['void'], + 'ImagickPixelIterator::setIteratorFirstRow' => ['bool'], + 'ImagickPixelIterator::setIteratorLastRow' => ['bool'], + 'ImagickPixelIterator::setIteratorRow' => ['bool', 'row'=>'int'], + 'ImagickPixelIterator::syncIterator' => ['bool'], + 'ImagickPixelIterator::valid' => ['bool'], + 'InfiniteIterator::__construct' => ['void', 'iterator'=>'Iterator'], + 'InfiniteIterator::current' => ['mixed'], + 'InfiniteIterator::getInnerIterator' => ['Iterator'], + 'InfiniteIterator::key' => ['bool|float|int|string'], + 'InfiniteIterator::next' => ['void'], + 'InfiniteIterator::rewind' => ['void'], + 'InfiniteIterator::valid' => ['bool'], + 'IntlBreakIterator::__construct' => ['void'], + 'IntlBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], + 'IntlBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlBreakIterator::current' => ['int'], + 'IntlBreakIterator::first' => ['int'], + 'IntlBreakIterator::following' => ['int', 'offset'=>'int'], + 'IntlBreakIterator::getErrorCode' => ['int'], + 'IntlBreakIterator::getErrorMessage' => ['string'], + 'IntlBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], + 'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], + 'IntlBreakIterator::getText' => ['string'], + 'IntlBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], + 'IntlBreakIterator::last' => ['int'], + 'IntlBreakIterator::next' => ['int', 'offset='=>'int'], + 'IntlBreakIterator::preceding' => ['int', 'offset'=>'int'], + 'IntlBreakIterator::previous' => ['int'], + 'IntlBreakIterator::setText' => ['bool', 'text'=>'string'], + 'IntlCalendar::__construct' => ['void'], + 'IntlCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'], + 'IntlCalendar::after' => ['bool', 'other'=>'IntlCalendar'], + 'IntlCalendar::before' => ['bool', 'other'=>'IntlCalendar'], + 'IntlCalendar::clear' => ['bool', 'field='=>'int'], + 'IntlCalendar::createInstance' => ['IntlCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], + 'IntlCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], + 'IntlCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], + 'IntlCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], + 'IntlCalendar::get' => ['int', 'field'=>'int'], + 'IntlCalendar::getActualMaximum' => ['int', 'field'=>'int'], + 'IntlCalendar::getActualMinimum' => ['int', 'field'=>'int'], + 'IntlCalendar::getAvailableLocales' => ['array'], + 'IntlCalendar::getDayOfWeekType' => ['int', 'dayOfWeek'=>'int'], + 'IntlCalendar::getErrorCode' => ['int'], + 'IntlCalendar::getErrorMessage' => ['string'], + 'IntlCalendar::getFirstDayOfWeek' => ['int'], + 'IntlCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], + 'IntlCalendar::getKeywordValuesForLocale' => ['Iterator|false', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], + 'IntlCalendar::getLeastMaximum' => ['int', 'field'=>'int'], + 'IntlCalendar::getLocale' => ['string', 'localeType'=>'int'], + 'IntlCalendar::getMaximum' => ['int|false', 'field'=>'int'], + 'IntlCalendar::getMinimalDaysInFirstWeek' => ['int'], + 'IntlCalendar::getMinimum' => ['int', 'field'=>'int'], + 'IntlCalendar::getNow' => ['float'], + 'IntlCalendar::getRepeatedWallTimeOption' => ['int'], + 'IntlCalendar::getSkippedWallTimeOption' => ['int'], + 'IntlCalendar::getTime' => ['float'], + 'IntlCalendar::getTimeZone' => ['IntlTimeZone'], + 'IntlCalendar::getType' => ['string'], + 'IntlCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], + '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::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::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::getIntPropertyMaxValue' => ['int', 'property'=>'int'], + 'IntlChar::getIntPropertyMinValue' => ['int', 'property'=>'int'], + 'IntlChar::getIntPropertyMxValue' => ['int', 'property'=>'int'], + 'IntlChar::getIntPropertyValue' => ['int', 'char'=>'int|string', 'property'=>'int'], + 'IntlChar::getNumericValue' => ['float', 'char'=>'int|string'], + 'IntlChar::getPropertyEnum' => ['int', 'alias'=>'string'], + 'IntlChar::getPropertyName' => ['string|false', 'property'=>'int', 'namechoice='=>'int'], + 'IntlChar::getPropertyValueEnum' => ['int', 'property'=>'int', 'name'=>'string'], + 'IntlChar::getPropertyValueName' => ['string|false', 'prop'=>'int', 'value'=>'int', 'namechoice='=>'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'], + 'IntlCodePointBreakIterator::__construct' => ['void'], + 'IntlCodePointBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlCodePointBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], + 'IntlCodePointBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlCodePointBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlCodePointBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlCodePointBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlCodePointBreakIterator::current' => ['int'], + 'IntlCodePointBreakIterator::first' => ['int'], + 'IntlCodePointBreakIterator::following' => ['int', 'offset'=>'string'], + 'IntlCodePointBreakIterator::getErrorCode' => ['int'], + 'IntlCodePointBreakIterator::getErrorMessage' => ['string'], + 'IntlCodePointBreakIterator::getLastCodePoint' => ['int'], + 'IntlCodePointBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], + 'IntlCodePointBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'string'], + 'IntlCodePointBreakIterator::getText' => ['string'], + 'IntlCodePointBreakIterator::isBoundary' => ['bool', 'offset'=>'string'], + 'IntlCodePointBreakIterator::last' => ['int'], + 'IntlCodePointBreakIterator::next' => ['int', 'offset='=>'string'], + 'IntlCodePointBreakIterator::preceding' => ['int', 'offset'=>'string'], + 'IntlCodePointBreakIterator::previous' => ['int'], + 'IntlCodePointBreakIterator::setText' => ['bool', 'text'=>'string'], + 'IntlDateFormatter::__construct' => ['void', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'null|int|IntlCalendar', 'pattern='=>'string'], + 'IntlDateFormatter::create' => ['IntlDateFormatter|false', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'int|IntlCalendar', 'pattern='=>'string'], + 'IntlDateFormatter::format' => ['string|false', 'args'=>''], + 'IntlDateFormatter::formatObject' => ['string|false', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'], + 'IntlDateFormatter::getCalendar' => ['int'], + 'IntlDateFormatter::getCalendarObject' => ['IntlCalendar'], + 'IntlDateFormatter::getDateType' => ['int'], + 'IntlDateFormatter::getErrorCode' => ['int'], + 'IntlDateFormatter::getErrorMessage' => ['string'], + 'IntlDateFormatter::getLocale' => ['string|false'], + 'IntlDateFormatter::getPattern' => ['string'], + 'IntlDateFormatter::getTimeType' => ['int'], + 'IntlDateFormatter::getTimeZone' => ['IntlTimeZone|false'], + 'IntlDateFormatter::getTimeZoneId' => ['string'], + 'IntlDateFormatter::isLenient' => ['bool'], + 'IntlDateFormatter::localtime' => ['array', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'], + 'IntlDateFormatter::parse' => ['int|false', 'text_to_parse'=>'string', '&rw_parse_pos='=>'int'], + 'IntlDateFormatter::setCalendar' => ['bool', 'calendar'=>''], + 'IntlDateFormatter::setLenient' => ['bool', 'lenient'=>'bool'], + 'IntlDateFormatter::setPattern' => ['bool', 'pattern'=>'string'], + 'IntlDateFormatter::setTimeZone' => ['bool', 'timezone'=>''], + 'IntlDateFormatter::setTimeZoneId' => ['bool', 'zone'=>'string', 'fmt='=>'IntlDateFormatter'], + 'IntlException::__clone' => ['void'], + 'IntlException::__construct' => ['void'], + 'IntlException::__toString' => ['string'], + 'IntlException::__wakeup' => ['void'], + 'IntlException::getCode' => ['int'], + 'IntlException::getFile' => ['string'], + 'IntlException::getLine' => ['int'], + 'IntlException::getMessage' => ['string'], + 'IntlException::getPrevious' => ['?Throwable'], + 'IntlException::getTrace' => ['list\',args?:array}>'], + 'IntlException::getTraceAsString' => ['string'], + 'IntlGregorianCalendar::__construct' => ['void'], + 'IntlGregorianCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'], + 'IntlGregorianCalendar::after' => ['bool', 'other'=>'IntlCalendar'], + 'IntlGregorianCalendar::before' => ['bool', 'other'=>'IntlCalendar'], + 'IntlGregorianCalendar::clear' => ['bool', 'field='=>'int'], + 'IntlGregorianCalendar::createInstance' => ['IntlGregorianCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], + 'IntlGregorianCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], + 'IntlGregorianCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], + 'IntlGregorianCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], + 'IntlGregorianCalendar::get' => ['int', 'field'=>'int'], + 'IntlGregorianCalendar::getActualMaximum' => ['int', 'field'=>'int'], + 'IntlGregorianCalendar::getActualMinimum' => ['int', 'field'=>'int'], + 'IntlGregorianCalendar::getAvailableLocales' => ['array'], + 'IntlGregorianCalendar::getDayOfWeekType' => ['int', 'dayOfWeek'=>'int'], + 'IntlGregorianCalendar::getErrorCode' => ['int'], + 'IntlGregorianCalendar::getErrorMessage' => ['string'], + 'IntlGregorianCalendar::getFirstDayOfWeek' => ['int'], + 'IntlGregorianCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], + 'IntlGregorianCalendar::getGregorianChange' => ['float'], + 'IntlGregorianCalendar::getKeywordValuesForLocale' => ['Iterator', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], + 'IntlGregorianCalendar::getLeastMaximum' => ['int', 'field'=>'int'], + 'IntlGregorianCalendar::getLocale' => ['string', 'localeType'=>'int'], + 'IntlGregorianCalendar::getMaximum' => ['int', 'field'=>'int'], + 'IntlGregorianCalendar::getMinimalDaysInFirstWeek' => ['int'], + 'IntlGregorianCalendar::getMinimum' => ['int', 'field'=>'int'], + 'IntlGregorianCalendar::getNow' => ['float'], + 'IntlGregorianCalendar::getRepeatedWallTimeOption' => ['int'], + 'IntlGregorianCalendar::getSkippedWallTimeOption' => ['int'], + 'IntlGregorianCalendar::getTime' => ['float'], + 'IntlGregorianCalendar::getTimeZone' => ['IntlTimeZone'], + 'IntlGregorianCalendar::getType' => ['string'], + 'IntlGregorianCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], + '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::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::toDateTime' => ['DateTime'], + 'IntlIterator::__construct' => ['void'], + 'IntlIterator::current' => ['mixed'], + 'IntlIterator::key' => ['string'], + 'IntlIterator::next' => ['void'], + 'IntlIterator::rewind' => ['void'], + 'IntlIterator::valid' => ['bool'], + 'IntlPartsIterator::getBreakIterator' => ['IntlBreakIterator'], + 'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules'=>'string', 'areCompiled='=>'string'], + 'IntlRuleBasedBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlRuleBasedBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], + 'IntlRuleBasedBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlRuleBasedBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlRuleBasedBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlRuleBasedBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], + 'IntlRuleBasedBreakIterator::current' => ['int'], + 'IntlRuleBasedBreakIterator::first' => ['int'], + 'IntlRuleBasedBreakIterator::following' => ['int', 'offset'=>'int'], + 'IntlRuleBasedBreakIterator::getBinaryRules' => ['string'], + 'IntlRuleBasedBreakIterator::getErrorCode' => ['int'], + 'IntlRuleBasedBreakIterator::getErrorMessage' => ['string'], + 'IntlRuleBasedBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], + 'IntlRuleBasedBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], + 'IntlRuleBasedBreakIterator::getRuleStatus' => ['int'], + 'IntlRuleBasedBreakIterator::getRuleStatusVec' => ['array'], + 'IntlRuleBasedBreakIterator::getRules' => ['string'], + 'IntlRuleBasedBreakIterator::getText' => ['string'], + 'IntlRuleBasedBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], + 'IntlRuleBasedBreakIterator::last' => ['int'], + 'IntlRuleBasedBreakIterator::next' => ['int', 'offset='=>'int'], + 'IntlRuleBasedBreakIterator::preceding' => ['int', 'offset'=>'int'], + 'IntlRuleBasedBreakIterator::previous' => ['int'], + 'IntlRuleBasedBreakIterator::setText' => ['bool', 'text'=>'string'], + 'IntlTimeZone::countEquivalentIDs' => ['int|false', 'zoneId'=>'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::getDSTSavings' => ['int'], + 'IntlTimeZone::getDisplayName' => ['string|false', 'isDaylight='=>'bool', 'style='=>'int', 'locale='=>'string'], + 'IntlTimeZone::getEquivalentID' => ['string|false', 'zoneId'=>'string', 'index'=>'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::getRawOffset' => ['int'], + 'IntlTimeZone::getRegion' => ['string|false', 'zoneId'=>'string'], + 'IntlTimeZone::getTZDataVersion' => ['string'], + 'IntlTimeZone::getUnknown' => ['IntlTimeZone'], + 'IntlTimeZone::getWindowsID' => ['string|false', 'timezone'=>'string'], + 'IntlTimeZone::hasSameRules' => ['bool', 'otherTimeZone'=>'IntlTimeZone'], + 'IntlTimeZone::toDateTimeZone' => ['DateTimeZone|false'], + 'IntlTimeZone::useDaylightTime' => ['bool'], + 'InvalidArgumentException::__clone' => ['void'], + 'InvalidArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?InvalidArgumentException'], + 'InvalidArgumentException::__toString' => ['string'], + 'InvalidArgumentException::getCode' => ['int'], + 'InvalidArgumentException::getFile' => ['string'], + 'InvalidArgumentException::getLine' => ['int'], + 'InvalidArgumentException::getMessage' => ['string'], + 'InvalidArgumentException::getPrevious' => ['Throwable|InvalidArgumentException|null'], + 'InvalidArgumentException::getTrace' => ['list\',args?:array}>'], + 'InvalidArgumentException::getTraceAsString' => ['string'], + 'Iterator::current' => ['mixed'], + 'Iterator::key' => ['mixed'], + 'Iterator::next' => ['void'], + 'Iterator::rewind' => ['void'], + 'Iterator::valid' => ['bool'], + 'IteratorAggregate::getIterator' => ['Traversable'], + 'IteratorIterator::__construct' => ['void', 'it'=>'Traversable'], + 'IteratorIterator::current' => ['mixed'], + 'IteratorIterator::getInnerIterator' => ['Iterator'], + 'IteratorIterator::key' => ['mixed'], + 'IteratorIterator::next' => ['void'], + 'IteratorIterator::rewind' => ['void'], + 'IteratorIterator::valid' => ['bool'], + 'JavaException::getCause' => ['object'], + 'JsonIncrementalParser::__construct' => ['void', 'depth'=>'', 'options'=>''], + 'JsonIncrementalParser::get' => ['', 'options'=>''], + 'JsonIncrementalParser::getError' => [''], + 'JsonIncrementalParser::parse' => ['', 'json'=>''], + 'JsonIncrementalParser::parseFile' => ['', 'filename'=>''], + 'JsonIncrementalParser::reset' => [''], + 'JsonSerializable::jsonSerialize' => ['mixed'], + 'Judy::__construct' => ['void', 'judy_type'=>'int'], + 'Judy::__destruct' => ['void'], + 'Judy::byCount' => ['int', 'nth_index'=>'int'], + 'Judy::count' => ['int', 'index_start='=>'int', 'index_end='=>'int'], + 'Judy::first' => ['mixed', 'index='=>'mixed'], + 'Judy::firstEmpty' => ['mixed', 'index='=>'mixed'], + 'Judy::free' => ['int'], + 'Judy::getType' => ['int'], + 'Judy::last' => ['mixed', 'index='=>'string'], + 'Judy::lastEmpty' => ['mixed', 'index='=>'int'], + 'Judy::memoryUsage' => ['int'], + 'Judy::next' => ['mixed', 'index'=>'mixed'], + 'Judy::nextEmpty' => ['mixed', 'index'=>'mixed'], + 'Judy::offsetExists' => ['bool', 'offset'=>'mixed'], + 'Judy::offsetGet' => ['mixed', 'offset'=>'mixed'], + 'Judy::offsetSet' => ['bool', 'offset'=>'mixed', 'value'=>'mixed'], + 'Judy::offsetUnset' => ['bool', 'offset'=>'mixed'], + 'Judy::prev' => ['mixed', 'index'=>'mixed'], + 'Judy::prevEmpty' => ['mixed', 'index'=>'mixed'], + 'Judy::size' => ['int'], + 'KTaglib_ID3v2_AttachedPictureFrame::getDescription' => ['string'], + 'KTaglib_ID3v2_AttachedPictureFrame::getMimeType' => ['string'], + 'KTaglib_ID3v2_AttachedPictureFrame::getType' => ['int'], + 'KTaglib_ID3v2_AttachedPictureFrame::savePicture' => ['bool', 'filename'=>'string'], + 'KTaglib_ID3v2_AttachedPictureFrame::setMimeType' => ['string', 'type'=>'string'], + 'KTaglib_ID3v2_AttachedPictureFrame::setPicture' => ['', 'filename'=>'string'], + 'KTaglib_ID3v2_AttachedPictureFrame::setType' => ['', 'type'=>'int'], + 'KTaglib_ID3v2_Frame::__toString' => ['string'], + 'KTaglib_ID3v2_Frame::getDescription' => ['string'], + 'KTaglib_ID3v2_Frame::getMimeType' => ['string'], + 'KTaglib_ID3v2_Frame::getSize' => ['int'], + 'KTaglib_ID3v2_Frame::getType' => ['int'], + 'KTaglib_ID3v2_Frame::savePicture' => ['bool', 'filename'=>'string'], + 'KTaglib_ID3v2_Frame::setMimeType' => ['string', 'type'=>'string'], + 'KTaglib_ID3v2_Frame::setPicture' => ['void', 'filename'=>'string'], + 'KTaglib_ID3v2_Frame::setType' => ['void', 'type'=>'int'], + 'KTaglib_ID3v2_Tag::addFrame' => ['bool', 'frame'=>'KTaglib_ID3v2_Frame'], + 'KTaglib_ID3v2_Tag::getFrameList' => ['array'], + 'KTaglib_MPEG_AudioProperties::getBitrate' => ['int'], + 'KTaglib_MPEG_AudioProperties::getChannels' => ['int'], + 'KTaglib_MPEG_AudioProperties::getLayer' => ['int'], + 'KTaglib_MPEG_AudioProperties::getLength' => ['int'], + 'KTaglib_MPEG_AudioProperties::getSampleBitrate' => ['int'], + 'KTaglib_MPEG_AudioProperties::getVersion' => ['int'], + 'KTaglib_MPEG_AudioProperties::isCopyrighted' => ['bool'], + 'KTaglib_MPEG_AudioProperties::isOriginal' => ['bool'], + 'KTaglib_MPEG_AudioProperties::isProtectionEnabled' => ['bool'], + 'KTaglib_MPEG_File::getAudioProperties' => ['KTaglib_MPEG_File'], + 'KTaglib_MPEG_File::getID3v1Tag' => ['KTaglib_ID3v1_Tag', 'create='=>'bool'], + 'KTaglib_MPEG_File::getID3v2Tag' => ['KTaglib_ID3v2_Tag', 'create='=>'bool'], + 'KTaglib_Tag::getAlbum' => ['string'], + 'KTaglib_Tag::getArtist' => ['string'], + 'KTaglib_Tag::getComment' => ['string'], + 'KTaglib_Tag::getGenre' => ['string'], + 'KTaglib_Tag::getTitle' => ['string'], + 'KTaglib_Tag::getTrack' => ['int'], + 'KTaglib_Tag::getYear' => ['int'], + 'KTaglib_Tag::isEmpty' => ['bool'], + 'Lapack::eigenValues' => ['array', 'a'=>'array', 'left='=>'array', 'right='=>'array'], + 'Lapack::identity' => ['array', 'n'=>'int'], + 'Lapack::leastSquaresByFactorisation' => ['array', 'a'=>'array', 'b'=>'array'], + 'Lapack::leastSquaresBySVD' => ['array', 'a'=>'array', 'b'=>'array'], + 'Lapack::pseudoInverse' => ['array', 'a'=>'array'], + 'Lapack::singularValues' => ['array', 'a'=>'array'], + 'Lapack::solveLinearEquation' => ['array', 'a'=>'array', 'b'=>'array'], + 'LengthException::__clone' => ['void'], + 'LengthException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?LengthException'], + 'LengthException::__toString' => ['string'], + 'LengthException::getCode' => ['int'], + 'LengthException::getFile' => ['string'], + 'LengthException::getLine' => ['int'], + 'LengthException::getMessage' => ['string'], + 'LengthException::getPrevious' => ['Throwable|LengthException|null'], + 'LengthException::getTrace' => ['list\',args?:array}>'], + 'LengthException::getTraceAsString' => ['string'], + 'LevelDB::__construct' => ['void', 'name'=>'string', 'options='=>'array', 'read_options='=>'array', 'write_options='=>'array'], + 'LevelDB::close' => [''], + 'LevelDB::compactRange' => ['', 'start'=>'', 'limit'=>''], + 'LevelDB::delete' => ['bool', 'key'=>'string', 'write_options='=>'array'], + 'LevelDB::destroy' => ['', 'name'=>'', 'options='=>'array'], + 'LevelDB::get' => ['bool|string', 'key'=>'string', 'read_options='=>'array'], + 'LevelDB::getApproximateSizes' => ['', 'start'=>'', 'limit'=>''], + 'LevelDB::getIterator' => ['LevelDBIterator', 'options='=>'array'], + 'LevelDB::getProperty' => ['mixed', 'name'=>'string'], + 'LevelDB::getSnapshot' => ['LevelDBSnapshot'], + 'LevelDB::put' => ['', 'key'=>'string', 'value'=>'string', 'write_options='=>'array'], + 'LevelDB::repair' => ['', 'name'=>'', 'options='=>'array'], + 'LevelDB::set' => ['', 'key'=>'string', 'value'=>'string', 'write_options='=>'array'], + 'LevelDB::write' => ['', 'batch'=>'LevelDBWriteBatch', 'write_options='=>'array'], + 'LevelDBIterator::__construct' => ['void', 'db'=>'LevelDB', 'read_options='=>'array'], + 'LevelDBIterator::current' => ['mixed'], + 'LevelDBIterator::destroy' => [''], + 'LevelDBIterator::getError' => [''], + 'LevelDBIterator::key' => ['int|string'], + 'LevelDBIterator::last' => [''], + 'LevelDBIterator::next' => ['void'], + 'LevelDBIterator::prev' => [''], + 'LevelDBIterator::rewind' => ['void'], + 'LevelDBIterator::seek' => ['', 'key'=>''], + 'LevelDBIterator::valid' => ['bool'], + 'LevelDBSnapshot::__construct' => ['void', 'db'=>'LevelDB'], + 'LevelDBSnapshot::release' => [''], + 'LevelDBWriteBatch::__construct' => ['void', 'name'=>'', 'options='=>'array', 'read_options='=>'array', 'write_options='=>'array'], + 'LevelDBWriteBatch::clear' => [''], + 'LevelDBWriteBatch::delete' => ['', 'key'=>'', 'write_options='=>'array'], + 'LevelDBWriteBatch::put' => ['', 'key'=>'', 'value'=>'', 'write_options='=>'array'], + 'LevelDBWriteBatch::set' => ['', 'key'=>'', 'value'=>'', 'write_options='=>'array'], + 'LimitIterator::__construct' => ['void', 'iterator'=>'Iterator', 'offset='=>'int', 'count='=>'int'], + 'LimitIterator::current' => ['mixed'], + 'LimitIterator::getInnerIterator' => ['Iterator'], + 'LimitIterator::getPosition' => ['int'], + 'LimitIterator::key' => ['mixed'], + 'LimitIterator::next' => ['void'], + 'LimitIterator::rewind' => ['void'], + 'LimitIterator::seek' => ['int', 'position'=>'int'], + 'LimitIterator::valid' => ['bool'], + 'Locale::acceptFromHttp' => ['string|false', 'header'=>'string'], + 'Locale::canonicalize' => ['string', 'locale'=>'string'], + 'Locale::composeLocale' => ['string', 'subtags'=>'array'], + 'Locale::filterMatches' => ['bool', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'], + 'Locale::getAllVariants' => ['array', 'locale'=>'string'], + 'Locale::getDefault' => ['string'], + 'Locale::getDisplayLanguage' => ['string', 'locale'=>'string', 'in_locale='=>'string'], + 'Locale::getDisplayName' => ['string', 'locale'=>'string', 'in_locale='=>'string'], + 'Locale::getDisplayRegion' => ['string', 'locale'=>'string', 'in_locale='=>'string'], + 'Locale::getDisplayScript' => ['string', 'locale'=>'string', 'in_locale='=>'string'], + 'Locale::getDisplayVariant' => ['string', 'locale'=>'string', 'in_locale='=>'string'], + 'Locale::getKeywords' => ['array|false', 'locale'=>'string'], + 'Locale::getPrimaryLanguage' => ['string', 'locale'=>'string'], + 'Locale::getRegion' => ['string', 'locale'=>'string'], + 'Locale::getScript' => ['string', 'locale'=>'string'], + 'Locale::lookup' => ['string', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'default='=>'string'], + 'Locale::parseLocale' => ['array', 'locale'=>'string'], + 'Locale::setDefault' => ['bool', 'locale'=>'string'], + 'LogicException::__clone' => ['void'], + 'LogicException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?LogicException'], + 'LogicException::__toString' => ['string'], + 'LogicException::getCode' => ['int'], + 'LogicException::getFile' => ['string'], + 'LogicException::getLine' => ['int'], + 'LogicException::getMessage' => ['string'], + 'LogicException::getPrevious' => ['Throwable|LogicException|null'], + 'LogicException::getTrace' => ['list\',args?:array}>'], + 'LogicException::getTraceAsString' => ['string'], + 'Lua::__call' => ['mixed', 'lua_func'=>'callable', 'args='=>'array', 'use_self='=>'int'], + 'Lua::__construct' => ['void', 'lua_script_file'=>'string'], + 'Lua::assign' => ['?Lua', 'name'=>'string', 'value'=>'mixed'], + 'Lua::call' => ['mixed', 'lua_func'=>'callable', 'args='=>'array', 'use_self='=>'int'], + 'Lua::eval' => ['mixed', 'statements'=>'string'], + 'Lua::getVersion' => ['string'], + 'Lua::include' => ['mixed', 'file'=>'string'], + 'Lua::registerCallback' => ['Lua|null|false', 'name'=>'string', 'function'=>'callable'], + 'LuaClosure::__invoke' => ['void', 'arg'=>'mixed', '...args='=>'mixed'], + 'Memcache::add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], + 'Memcache::addServer' => ['bool', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable', 'timeoutms='=>'int'], + 'Memcache::append' => [''], + 'Memcache::cas' => [''], + 'Memcache::close' => ['bool'], + 'Memcache::connect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], + 'Memcache::decrement' => ['int', 'key'=>'string', 'value='=>'int'], + 'Memcache::delete' => ['bool', 'key'=>'string', 'timeout='=>'int'], + 'Memcache::findServer' => [''], + 'Memcache::flush' => ['bool'], + 'Memcache::get' => ['string|array|false', 'key'=>'string', 'flags='=>'array', 'keys='=>'array'], + 'Memcache::get\'1' => ['array', 'key'=>'string[]', 'flags='=>'int[]'], + 'Memcache::getExtendedStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], + 'Memcache::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'], + 'Memcache::getStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], + 'Memcache::getVersion' => ['string'], + 'Memcache::increment' => ['int', 'key'=>'string', 'value='=>'int'], + 'Memcache::pconnect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], + 'Memcache::prepend' => ['string'], + 'Memcache::replace' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], + 'Memcache::set' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], + 'Memcache::setCompressThreshold' => ['bool', 'threshold'=>'int', 'min_savings='=>'float'], + 'Memcache::setFailureCallback' => [''], + 'Memcache::setServerParams' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable'], + 'MemcachePool::add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], + 'MemcachePool::addServer' => ['bool', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'?callable', 'timeoutms='=>'int'], + 'MemcachePool::append' => [''], + 'MemcachePool::cas' => [''], + 'MemcachePool::close' => ['bool'], + 'MemcachePool::connect' => ['bool', 'host'=>'string', 'port'=>'int', 'timeout='=>'int'], + 'MemcachePool::decrement' => ['int|false', 'key'=>'', 'value='=>'int|mixed'], + 'MemcachePool::delete' => ['bool', 'key'=>'', 'timeout='=>'int|mixed'], + 'MemcachePool::findServer' => [''], + 'MemcachePool::flush' => ['bool'], + 'MemcachePool::get' => ['array|string|false', 'key'=>'array|string', '&flags='=>'array|int'], + 'MemcachePool::getExtendedStats' => ['array|false', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], + 'MemcachePool::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'], + 'MemcachePool::getStats' => ['array|false', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], + 'MemcachePool::getVersion' => ['string|false'], + 'MemcachePool::increment' => ['int|false', 'key'=>'', 'value='=>'int|mixed'], + 'MemcachePool::prepend' => ['string'], + 'MemcachePool::replace' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], + 'MemcachePool::set' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], + 'MemcachePool::setCompressThreshold' => ['bool', 'thresold'=>'int', 'min_saving='=>'float'], + 'MemcachePool::setFailureCallback' => [''], + 'MemcachePool::setServerParams' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'?callable'], + 'Memcached::__construct' => ['void', 'persistent_id='=>'mixed|string', 'on_new_object_cb='=>'mixed'], + 'Memcached::add' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], + 'Memcached::addByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], + 'Memcached::addServer' => ['bool', 'host'=>'string', 'port'=>'int', 'weight='=>'int'], + 'Memcached::addServers' => ['bool', 'servers'=>'array'], + 'Memcached::append' => ['bool', 'key'=>'string', 'value'=>'string'], + 'Memcached::appendByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'string'], + 'Memcached::cas' => ['bool', 'cas_token'=>'float', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], + 'Memcached::casByKey' => ['bool', 'cas_token'=>'float', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], + 'Memcached::decrement' => ['int|false', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], + 'Memcached::decrementByKey' => ['int|false', 'server_key'=>'string', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], + 'Memcached::delete' => ['bool', 'key'=>'string', 'time='=>'int'], + 'Memcached::deleteByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'time='=>'int'], + 'Memcached::deleteMulti' => ['array', 'keys'=>'array', 'time='=>'int'], + 'Memcached::deleteMultiByKey' => ['bool', 'server_key'=>'string', 'keys'=>'array', 'time='=>'int'], + 'Memcached::fetch' => ['array|false'], + 'Memcached::fetchAll' => ['array|false'], + 'Memcached::flush' => ['bool', 'delay='=>'int'], + 'Memcached::flushBuffers' => [''], + 'Memcached::get' => ['mixed|false', 'key'=>'string', 'cache_cb='=>'?callable', 'flags='=>'int'], + 'Memcached::getAllKeys' => ['array|false'], + 'Memcached::getByKey' => ['mixed|false', 'server_key'=>'string', 'key'=>'string', 'value_cb='=>'?callable', 'flags='=>'int'], + 'Memcached::getDelayed' => ['bool', 'keys'=>'array', 'with_cas='=>'bool', 'value_cb='=>'callable'], + 'Memcached::getDelayedByKey' => ['bool', 'server_key'=>'string', 'keys'=>'array', 'with_cas='=>'bool', 'value_cb='=>'?callable'], + 'Memcached::getLastDisconnectedServer' => [''], + 'Memcached::getLastErrorCode' => [''], + 'Memcached::getLastErrorErrno' => [''], + 'Memcached::getLastErrorMessage' => [''], + 'Memcached::getMulti' => ['array|false', 'keys'=>'array', 'flags='=>'int'], + 'Memcached::getMultiByKey' => ['array|false', 'server_key'=>'string', 'keys'=>'array', 'flags='=>'int'], + 'Memcached::getOption' => ['mixed|false', 'option'=>'int'], + 'Memcached::getResultCode' => ['int'], + 'Memcached::getResultMessage' => ['string'], + 'Memcached::getServerByKey' => ['array', 'server_key'=>'string'], + 'Memcached::getServerList' => ['array'], + 'Memcached::getStats' => ['array', 'type='=>'?string'], + 'Memcached::getVersion' => ['array'], + 'Memcached::increment' => ['int|false', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], + 'Memcached::incrementByKey' => ['int|false', 'server_key'=>'string', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], + 'Memcached::isPersistent' => ['bool'], + 'Memcached::isPristine' => ['bool'], + 'Memcached::prepend' => ['bool', 'key'=>'string', 'value'=>'string'], + 'Memcached::prependByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'string'], + 'Memcached::quit' => ['bool'], + 'Memcached::replace' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], + 'Memcached::replaceByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], + 'Memcached::resetServerList' => ['bool'], + 'Memcached::set' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], + 'Memcached::setBucket' => ['', 'host_map'=>'array', 'forward_map'=>'array', 'replicas'=>''], + 'Memcached::setByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], + 'Memcached::setEncodingKey' => ['', 'key'=>''], + 'Memcached::setMulti' => ['bool', 'items'=>'array', 'expiration='=>'int'], + 'Memcached::setMultiByKey' => ['bool', 'server_key'=>'string', 'items'=>'array', 'expiration='=>'int'], + 'Memcached::setOption' => ['bool', 'option'=>'int', 'value'=>'mixed'], + 'Memcached::setOptions' => ['bool', 'options'=>'array'], + 'Memcached::setSaslAuthData' => ['void', 'username'=>'string', 'password'=>'string'], + 'Memcached::touch' => ['bool', 'key'=>'string', 'expiration'=>'int'], + 'Memcached::touchByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'expiration'=>'int'], + 'MessageFormatter::__construct' => ['void', 'locale'=>'string', 'pattern'=>'string'], + 'MessageFormatter::create' => ['MessageFormatter', 'locale'=>'string', 'pattern'=>'string'], + 'MessageFormatter::format' => ['false|string', 'args'=>'array'], + 'MessageFormatter::formatMessage' => ['false|string', 'locale'=>'string', 'pattern'=>'string', 'args'=>'array'], + 'MessageFormatter::getErrorCode' => ['int'], + 'MessageFormatter::getErrorMessage' => ['string'], + 'MessageFormatter::getLocale' => ['string'], + 'MessageFormatter::getPattern' => ['string'], + 'MessageFormatter::parse' => ['array|false', 'value'=>'string'], + 'MessageFormatter::parseMessage' => ['array|false', 'locale'=>'string', 'pattern'=>'string', 'source'=>'string'], + 'MessageFormatter::setPattern' => ['bool', 'pattern'=>'string'], + 'Mongo::__construct' => ['void', 'server='=>'string', 'options='=>'array', 'driver_options='=>'array'], + 'Mongo::__get' => ['MongoDB', 'dbname'=>'string'], + 'Mongo::__toString' => ['string'], + 'Mongo::close' => ['bool'], + 'Mongo::connect' => ['bool'], + 'Mongo::connectUtil' => ['bool'], + 'Mongo::dropDB' => ['array', 'db'=>'mixed'], + 'Mongo::forceError' => ['bool'], + 'Mongo::getConnections' => ['array'], + 'Mongo::getHosts' => ['array'], + 'Mongo::getPoolSize' => ['int'], + 'Mongo::getReadPreference' => ['array'], + 'Mongo::getSlave' => ['?string'], + 'Mongo::getSlaveOkay' => ['bool'], + 'Mongo::getWriteConcern' => ['array'], + 'Mongo::killCursor' => ['', 'server_hash'=>'string', 'id'=>'MongoInt64|int'], + 'Mongo::lastError' => ['?array'], + 'Mongo::listDBs' => ['array'], + 'Mongo::pairConnect' => ['bool'], + 'Mongo::pairPersistConnect' => ['bool', 'username='=>'string', 'password='=>'string'], + 'Mongo::persistConnect' => ['bool', 'username='=>'string', 'password='=>'string'], + 'Mongo::poolDebug' => ['array'], + 'Mongo::prevError' => ['array'], + 'Mongo::resetError' => ['array'], + 'Mongo::selectCollection' => ['MongoCollection', 'db'=>'string', 'collection'=>'string'], + 'Mongo::selectDB' => ['MongoDB', 'name'=>'string'], + 'Mongo::setPoolSize' => ['bool', 'size'=>'int'], + 'Mongo::setReadPreference' => ['bool', 'readPreference'=>'string', 'tags='=>'array'], + 'Mongo::setSlaveOkay' => ['bool', 'ok='=>'bool'], + 'Mongo::switchSlave' => ['string'], + 'MongoBinData::__construct' => ['void', 'data'=>'string', 'type='=>'int'], + 'MongoBinData::__toString' => ['string'], + 'MongoClient::__construct' => ['void', 'server='=>'string', 'options='=>'array', 'driver_options='=>'array'], + 'MongoClient::__get' => ['MongoDB', 'dbname'=>'string'], + 'MongoClient::__toString' => ['string'], + 'MongoClient::close' => ['bool', 'connection='=>'bool|string'], + 'MongoClient::connect' => ['bool'], + 'MongoClient::dropDB' => ['array', 'db'=>'mixed'], + 'MongoClient::getConnections' => ['array'], + 'MongoClient::getHosts' => ['array'], + 'MongoClient::getReadPreference' => ['array'], + 'MongoClient::getWriteConcern' => ['array'], + 'MongoClient::killCursor' => ['bool', 'server_hash'=>'string', 'id'=>'int|MongoInt64'], + 'MongoClient::listDBs' => ['array'], + 'MongoClient::selectCollection' => ['MongoCollection', 'db'=>'string', 'collection'=>'string'], + 'MongoClient::selectDB' => ['MongoDB', 'name'=>'string'], + 'MongoClient::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], + 'MongoClient::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], + 'MongoClient::switchSlave' => ['string'], + 'MongoCode::__construct' => ['void', 'code'=>'string', 'scope='=>'array'], + 'MongoCode::__toString' => ['string'], + 'MongoCollection::__construct' => ['void', 'db'=>'MongoDB', 'name'=>'string'], + 'MongoCollection::__get' => ['MongoCollection', 'name'=>'string'], + 'MongoCollection::__toString' => ['string'], + 'MongoCollection::aggregate' => ['array', 'op'=>'array', 'op='=>'array', '...args='=>'array'], + 'MongoCollection::aggregate\'1' => ['array', 'pipeline'=>'array', 'options='=>'array'], + 'MongoCollection::aggregateCursor' => ['MongoCommandCursor', 'command'=>'array', 'options='=>'array'], + 'MongoCollection::batchInsert' => ['array|bool', 'a'=>'array', 'options='=>'array'], + 'MongoCollection::count' => ['int', 'query='=>'array', 'limit='=>'int', 'skip='=>'int'], + 'MongoCollection::createDBRef' => ['array', 'a'=>'array'], + 'MongoCollection::createIndex' => ['array', 'keys'=>'array', 'options='=>'array'], + 'MongoCollection::deleteIndex' => ['array', 'keys'=>'string|array'], + 'MongoCollection::deleteIndexes' => ['array'], + 'MongoCollection::distinct' => ['array|false', 'key'=>'string', 'query='=>'array'], + 'MongoCollection::drop' => ['array'], + 'MongoCollection::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'], + 'MongoCollection::find' => ['MongoCursor', 'query='=>'array', 'fields='=>'array'], + 'MongoCollection::findAndModify' => ['array', 'query'=>'array', 'update='=>'array', 'fields='=>'array', 'options='=>'array'], + 'MongoCollection::findOne' => ['?array', 'query='=>'array', 'fields='=>'array'], + 'MongoCollection::getDBRef' => ['array', 'ref'=>'array'], + 'MongoCollection::getIndexInfo' => ['array'], + 'MongoCollection::getName' => ['string'], + 'MongoCollection::getReadPreference' => ['array'], + 'MongoCollection::getSlaveOkay' => ['bool'], + 'MongoCollection::getWriteConcern' => ['array'], + 'MongoCollection::group' => ['array', 'keys'=>'mixed', 'initial'=>'array', 'reduce'=>'MongoCode', 'options='=>'array'], + 'MongoCollection::insert' => ['bool|array', 'a'=>'array|object', 'options='=>'array'], + 'MongoCollection::parallelCollectionScan' => ['MongoCommandCursor[]', 'num_cursors'=>'int'], + 'MongoCollection::remove' => ['bool|array', 'criteria='=>'array', 'options='=>'array'], + 'MongoCollection::save' => ['bool|array', 'a'=>'array|object', 'options='=>'array'], + 'MongoCollection::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], + 'MongoCollection::setSlaveOkay' => ['bool', 'ok='=>'bool'], + 'MongoCollection::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], + 'MongoCollection::toIndexString' => ['string', 'keys'=>'mixed'], + 'MongoCollection::update' => ['bool', 'criteria'=>'array', 'newobj'=>'array', 'options='=>'array'], + 'MongoCollection::validate' => ['array', 'scan_data='=>'bool'], + 'MongoCommandCursor::__construct' => ['void', 'connection'=>'MongoClient', 'ns'=>'string', 'command'=>'array'], + 'MongoCommandCursor::batchSize' => ['MongoCommandCursor', 'batchSize'=>'int'], + 'MongoCommandCursor::createFromDocument' => ['MongoCommandCursor', 'connection'=>'MongoClient', 'hash'=>'string', 'document'=>'array'], + 'MongoCommandCursor::current' => ['array'], + 'MongoCommandCursor::dead' => ['bool'], + 'MongoCommandCursor::getReadPreference' => ['array'], + 'MongoCommandCursor::info' => ['array'], + 'MongoCommandCursor::key' => ['int'], + 'MongoCommandCursor::next' => ['void'], + 'MongoCommandCursor::rewind' => ['array'], + 'MongoCommandCursor::setReadPreference' => ['MongoCommandCursor', 'read_preference'=>'string', 'tags='=>'array'], + 'MongoCommandCursor::timeout' => ['MongoCommandCursor', 'ms'=>'int'], + 'MongoCommandCursor::valid' => ['bool'], + 'MongoCursor::__construct' => ['void', 'connection'=>'MongoClient', 'ns'=>'string', 'query='=>'array', 'fields='=>'array'], + 'MongoCursor::addOption' => ['MongoCursor', 'key'=>'string', 'value'=>'mixed'], + 'MongoCursor::awaitData' => ['MongoCursor', 'wait='=>'bool'], + 'MongoCursor::batchSize' => ['MongoCursor', 'num'=>'int'], + 'MongoCursor::count' => ['int', 'foundonly='=>'bool'], + 'MongoCursor::current' => ['array'], + 'MongoCursor::dead' => ['bool'], + 'MongoCursor::doQuery' => ['void'], + 'MongoCursor::explain' => ['array'], + 'MongoCursor::fields' => ['MongoCursor', 'f'=>'array'], + 'MongoCursor::getNext' => ['array'], + 'MongoCursor::getReadPreference' => ['array'], + 'MongoCursor::hasNext' => ['bool'], + 'MongoCursor::hint' => ['MongoCursor', 'key_pattern'=>'string|array|object'], + 'MongoCursor::immortal' => ['MongoCursor', 'liveforever='=>'bool'], + 'MongoCursor::info' => ['array'], + 'MongoCursor::key' => ['string'], + 'MongoCursor::limit' => ['MongoCursor', 'num'=>'int'], + 'MongoCursor::maxTimeMS' => ['MongoCursor', 'ms'=>'int'], + 'MongoCursor::next' => ['array'], + 'MongoCursor::partial' => ['MongoCursor', 'okay='=>'bool'], + 'MongoCursor::reset' => ['void'], + 'MongoCursor::rewind' => ['void'], + 'MongoCursor::setFlag' => ['MongoCursor', 'flag'=>'int', 'set='=>'bool'], + 'MongoCursor::setReadPreference' => ['MongoCursor', 'read_preference'=>'string', 'tags='=>'array'], + 'MongoCursor::skip' => ['MongoCursor', 'num'=>'int'], + 'MongoCursor::slaveOkay' => ['MongoCursor', 'okay='=>'bool'], + 'MongoCursor::snapshot' => ['MongoCursor'], + 'MongoCursor::sort' => ['MongoCursor', 'fields'=>'array'], + 'MongoCursor::tailable' => ['MongoCursor', 'tail='=>'bool'], + 'MongoCursor::timeout' => ['MongoCursor', 'ms'=>'int'], + 'MongoCursor::valid' => ['bool'], + 'MongoCursorException::__clone' => ['void'], + 'MongoCursorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'MongoCursorException::__toString' => ['string'], + 'MongoCursorException::__wakeup' => ['void'], + 'MongoCursorException::getCode' => ['int'], + 'MongoCursorException::getFile' => ['string'], + 'MongoCursorException::getHost' => ['string'], + 'MongoCursorException::getLine' => ['int'], + 'MongoCursorException::getMessage' => ['string'], + 'MongoCursorException::getPrevious' => ['Exception|Throwable'], + 'MongoCursorException::getTrace' => ['list\',args?:array}>'], + 'MongoCursorException::getTraceAsString' => ['string'], + 'MongoCursorInterface::__construct' => ['void'], + 'MongoCursorInterface::batchSize' => ['MongoCursorInterface', 'batchSize'=>'int'], + 'MongoCursorInterface::current' => ['mixed'], + 'MongoCursorInterface::dead' => ['bool'], + 'MongoCursorInterface::getReadPreference' => ['array'], + 'MongoCursorInterface::info' => ['array'], + 'MongoCursorInterface::key' => ['int|string'], + 'MongoCursorInterface::next' => ['void'], + 'MongoCursorInterface::rewind' => ['void'], + 'MongoCursorInterface::setReadPreference' => ['MongoCursorInterface', 'read_preference'=>'string', 'tags='=>'array'], + 'MongoCursorInterface::timeout' => ['MongoCursorInterface', 'ms'=>'int'], + 'MongoCursorInterface::valid' => ['bool'], + 'MongoDB::__construct' => ['void', 'conn'=>'MongoClient', 'name'=>'string'], + 'MongoDB::__get' => ['MongoCollection', 'name'=>'string'], + 'MongoDB::__toString' => ['string'], + 'MongoDB::authenticate' => ['array', 'username'=>'string', 'password'=>'string'], + 'MongoDB::command' => ['array', 'command'=>'array'], + 'MongoDB::createCollection' => ['MongoCollection', 'name'=>'string', 'capped='=>'bool', 'size='=>'int', 'max='=>'int'], + 'MongoDB::createDBRef' => ['array', 'collection'=>'string', 'a'=>'mixed'], + 'MongoDB::drop' => ['array'], + 'MongoDB::dropCollection' => ['array', 'coll'=>'MongoCollection|string'], + 'MongoDB::execute' => ['array', 'code'=>'MongoCode|string', 'args='=>'array'], + 'MongoDB::forceError' => ['bool'], + 'MongoDB::getCollectionInfo' => ['array', 'options='=>'array'], + 'MongoDB::getCollectionNames' => ['array', 'options='=>'array'], + 'MongoDB::getDBRef' => ['array', 'ref'=>'array'], + 'MongoDB::getGridFS' => ['MongoGridFS', 'prefix='=>'string'], + 'MongoDB::getProfilingLevel' => ['int'], + 'MongoDB::getReadPreference' => ['array'], + 'MongoDB::getSlaveOkay' => ['bool'], + 'MongoDB::getWriteConcern' => ['array'], + 'MongoDB::lastError' => ['array'], + 'MongoDB::listCollections' => ['array'], + 'MongoDB::prevError' => ['array'], + 'MongoDB::repair' => ['array', 'preserve_cloned_files='=>'bool', 'backup_original_files='=>'bool'], + 'MongoDB::resetError' => ['array'], + 'MongoDB::selectCollection' => ['MongoCollection', 'name'=>'string'], + 'MongoDB::setProfilingLevel' => ['int', 'level'=>'int'], + 'MongoDB::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], + 'MongoDB::setSlaveOkay' => ['bool', 'ok='=>'bool'], + 'MongoDB::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], + 'MongoDBRef::create' => ['array', 'collection'=>'string', 'id'=>'mixed', 'database='=>'string'], + 'MongoDBRef::get' => ['?array', 'db'=>'MongoDB', 'ref'=>'array'], + 'MongoDBRef::isRef' => ['bool', 'ref'=>'mixed'], + 'MongoDB\BSON\Binary::__construct' => ['void', 'data'=>'string', 'type'=>'int'], + 'MongoDB\BSON\Binary::__toString' => ['string'], + 'MongoDB\BSON\Binary::getData' => ['string'], + 'MongoDB\BSON\Binary::getType' => ['int'], + 'MongoDB\BSON\Decimal128::__construct' => ['void', 'value='=>'string'], + 'MongoDB\BSON\Decimal128::__toString' => ['string'], + 'MongoDB\BSON\Javascript::__construct' => ['void', 'code'=>'string', 'scope='=>'array|object'], + 'MongoDB\BSON\ObjectId::__construct' => ['void', 'id='=>'string'], + 'MongoDB\BSON\ObjectId::__toString' => ['string'], + 'MongoDB\BSON\Regex::__construct' => ['void', 'pattern'=>'string', 'flags='=>'string'], + 'MongoDB\BSON\Regex::__toString' => ['string'], + 'MongoDB\BSON\Regex::getFlags' => ['string'], + 'MongoDB\BSON\Regex::getPattern' => ['string'], + 'MongoDB\BSON\Serializable::bsonSerialize' => ['array|object'], + 'MongoDB\BSON\Timestamp::__construct' => ['void', 'increment'=>'int', 'timestamp'=>'int'], + 'MongoDB\BSON\Timestamp::__toString' => ['string'], + 'MongoDB\BSON\UTCDateTime::__construct' => ['void', 'milliseconds='=>'int|DateTimeInterface'], + 'MongoDB\BSON\UTCDateTime::__toString' => ['string'], + 'MongoDB\BSON\UTCDateTime::toDateTime' => ['DateTime'], + 'MongoDB\BSON\Unserializable::bsonUnserialize' => ['void', 'data'=>'array'], + 'MongoDB\BSON\binary::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\binary::serialize' => ['string'], + 'MongoDB\BSON\binary::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\binaryinterface::__toString' => ['string'], + 'MongoDB\BSON\binaryinterface::getData' => ['string'], + 'MongoDB\BSON\binaryinterface::getType' => ['int'], + 'MongoDB\BSON\dbpointer::__construct' => ['void'], + 'MongoDB\BSON\dbpointer::__toString' => ['string'], + 'MongoDB\BSON\dbpointer::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\dbpointer::serialize' => ['string'], + 'MongoDB\BSON\dbpointer::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\decimal128::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\decimal128::serialize' => ['string'], + 'MongoDB\BSON\decimal128::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\decimal128interface::__toString' => ['string'], + 'MongoDB\BSON\fromJSON' => ['string', 'json'=>'string'], + 'MongoDB\BSON\fromPHP' => ['string', 'value'=>'array|object'], + 'MongoDB\BSON\int64::__construct' => ['void'], + 'MongoDB\BSON\int64::__toString' => ['string'], + 'MongoDB\BSON\int64::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\int64::serialize' => ['string'], + 'MongoDB\BSON\int64::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\javascript::__toString' => ['string'], + 'MongoDB\BSON\javascript::getCode' => ['string'], + 'MongoDB\BSON\javascript::getScope' => ['?object'], + 'MongoDB\BSON\javascript::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\javascript::serialize' => ['string'], + 'MongoDB\BSON\javascript::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\javascriptinterface::__toString' => ['string'], + 'MongoDB\BSON\javascriptinterface::getCode' => ['string'], + 'MongoDB\BSON\javascriptinterface::getScope' => ['?object'], + 'MongoDB\BSON\maxkey::__construct' => ['void'], + 'MongoDB\BSON\maxkey::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\maxkey::serialize' => ['string'], + 'MongoDB\BSON\maxkey::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\minkey::__construct' => ['void'], + 'MongoDB\BSON\minkey::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\minkey::serialize' => ['string'], + 'MongoDB\BSON\minkey::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\objectid::getTimestamp' => ['int'], + 'MongoDB\BSON\objectid::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\objectid::serialize' => ['string'], + 'MongoDB\BSON\objectid::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\objectidinterface::__toString' => ['string'], + 'MongoDB\BSON\objectidinterface::getTimestamp' => ['int'], + 'MongoDB\BSON\regex::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\regex::serialize' => ['string'], + 'MongoDB\BSON\regex::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\regexinterface::__toString' => ['string'], + 'MongoDB\BSON\regexinterface::getFlags' => ['string'], + 'MongoDB\BSON\regexinterface::getPattern' => ['string'], + 'MongoDB\BSON\symbol::__construct' => ['void'], + 'MongoDB\BSON\symbol::__toString' => ['string'], + 'MongoDB\BSON\symbol::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\symbol::serialize' => ['string'], + 'MongoDB\BSON\symbol::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\timestamp::getIncrement' => ['int'], + 'MongoDB\BSON\timestamp::getTimestamp' => ['int'], + 'MongoDB\BSON\timestamp::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\timestamp::serialize' => ['string'], + 'MongoDB\BSON\timestamp::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\timestampinterface::__toString' => ['string'], + 'MongoDB\BSON\timestampinterface::getIncrement' => ['int'], + 'MongoDB\BSON\timestampinterface::getTimestamp' => ['int'], + 'MongoDB\BSON\toJSON' => ['string', 'bson'=>'string'], + 'MongoDB\BSON\toPHP' => ['object', 'bson'=>'string', 'typeMap='=>'array'], + 'MongoDB\BSON\undefined::__construct' => ['void'], + 'MongoDB\BSON\undefined::__toString' => ['string'], + 'MongoDB\BSON\undefined::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\undefined::serialize' => ['string'], + 'MongoDB\BSON\undefined::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\utcdatetime::jsonSerialize' => ['mixed'], + 'MongoDB\BSON\utcdatetime::serialize' => ['string'], + 'MongoDB\BSON\utcdatetime::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\BSON\utcdatetimeinterface::__toString' => ['string'], + 'MongoDB\BSON\utcdatetimeinterface::toDateTime' => ['DateTime'], + 'MongoDB\Driver\BulkWrite::__construct' => ['void', 'ordered='=>'bool'], + 'MongoDB\Driver\BulkWrite::count' => ['int'], + 'MongoDB\Driver\BulkWrite::delete' => ['void', 'filter'=>'array|object', 'deleteOptions='=>'array'], + 'MongoDB\Driver\BulkWrite::insert' => ['void|MongoDB\BSON\ObjectId', 'document'=>'array|object'], + 'MongoDB\Driver\BulkWrite::update' => ['void', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array'], + 'MongoDB\Driver\Command::__construct' => ['void', 'document'=>'array|object'], + 'MongoDB\Driver\Cursor::__construct' => ['void', 'server'=>'Server', 'responseDocument'=>'string'], + 'MongoDB\Driver\Cursor::getId' => ['MongoDB\Driver\CursorId'], + 'MongoDB\Driver\Cursor::getServer' => ['MongoDB\Driver\Server'], + 'MongoDB\Driver\Cursor::isDead' => ['bool'], + 'MongoDB\Driver\Cursor::setTypeMap' => ['void', 'typemap'=>'array'], + 'MongoDB\Driver\Cursor::toArray' => ['array'], + 'MongoDB\Driver\CursorId::__construct' => ['void', 'id'=>'string'], + 'MongoDB\Driver\CursorId::__toString' => ['string'], + 'MongoDB\Driver\CursorId::serialize' => ['string'], + 'MongoDB\Driver\CursorId::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\Driver\Exception\RuntimeException::__clone' => ['void'], + 'MongoDB\Driver\Exception\RuntimeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?RuntimeException|?Throwable'], + 'MongoDB\Driver\Exception\RuntimeException::__toString' => ['string'], + 'MongoDB\Driver\Exception\RuntimeException::__wakeup' => ['void'], + 'MongoDB\Driver\Exception\RuntimeException::getCode' => ['int'], + 'MongoDB\Driver\Exception\RuntimeException::getFile' => ['string'], + 'MongoDB\Driver\Exception\RuntimeException::getLine' => ['int'], + 'MongoDB\Driver\Exception\RuntimeException::getMessage' => ['string'], + 'MongoDB\Driver\Exception\RuntimeException::getPrevious' => ['RuntimeException|Throwable'], + 'MongoDB\Driver\Exception\RuntimeException::getTrace' => ['list\',args?:array}>'], + 'MongoDB\Driver\Exception\RuntimeException::getTraceAsString' => ['string'], + 'MongoDB\Driver\Exception\WriteException::__clone' => ['void'], + 'MongoDB\Driver\Exception\WriteException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?RuntimeException|?Throwable'], + 'MongoDB\Driver\Exception\WriteException::__toString' => ['string'], + 'MongoDB\Driver\Exception\WriteException::__wakeup' => ['void'], + 'MongoDB\Driver\Exception\WriteException::getCode' => ['int'], + 'MongoDB\Driver\Exception\WriteException::getFile' => ['string'], + 'MongoDB\Driver\Exception\WriteException::getLine' => ['int'], + 'MongoDB\Driver\Exception\WriteException::getMessage' => ['string'], + 'MongoDB\Driver\Exception\WriteException::getPrevious' => ['RuntimeException|Throwable'], + 'MongoDB\Driver\Exception\WriteException::getTrace' => ['list\',args?:array}>'], + 'MongoDB\Driver\Exception\WriteException::getTraceAsString' => ['string'], + 'MongoDB\Driver\Exception\WriteException::getWriteResult' => ['MongoDB\Driver\WriteResult'], + 'MongoDB\Driver\Manager::__construct' => ['void', 'uri'=>'string', 'options='=>'array', 'driverOptions='=>'array'], + 'MongoDB\Driver\Manager::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'bulk'=>'MongoDB\Driver\BulkWrite', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], + 'MongoDB\Driver\Manager::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'readPreference='=>'MongoDB\Driver\ReadPreference'], + 'MongoDB\Driver\Manager::executeDelete' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'deleteOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], + 'MongoDB\Driver\Manager::executeInsert' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'document'=>'array|object', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], + 'MongoDB\Driver\Manager::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'query'=>'MongoDB\Driver\Query', 'readPreference='=>'MongoDB\Driver\ReadPreference'], + 'MongoDB\Driver\Manager::executeUpdate' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], + 'MongoDB\Driver\Manager::getReadConcern' => ['MongoDB\Driver\ReadConcern'], + 'MongoDB\Driver\Manager::getReadPreference' => ['MongoDB\Driver\ReadPreference'], + 'MongoDB\Driver\Manager::getServers' => ['MongoDB\Driver\Server[]'], + 'MongoDB\Driver\Manager::getWriteConcern' => ['MongoDB\Driver\WriteConcern'], + 'MongoDB\Driver\Manager::selectServer' => ['MongoDB\Driver\Server', 'readPreference'=>'MongoDB\Driver\ReadPreference'], + 'MongoDB\Driver\Query::__construct' => ['void', 'filter'=>'array|object', 'queryOptions='=>'array'], + 'MongoDB\Driver\ReadConcern::__construct' => ['void', 'level='=>'string'], + 'MongoDB\Driver\ReadConcern::bsonSerialize' => ['object'], + 'MongoDB\Driver\ReadConcern::getLevel' => ['?string'], + 'MongoDB\Driver\ReadConcern::isDefault' => ['bool'], + 'MongoDB\Driver\ReadConcern::serialize' => ['string'], + 'MongoDB\Driver\ReadConcern::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\Driver\ReadPreference::__construct' => ['void', 'mode'=>'string|int', 'tagSets='=>'array', 'options='=>'array'], + 'MongoDB\Driver\ReadPreference::bsonSerialize' => ['object'], + 'MongoDB\Driver\ReadPreference::getHedge' => ['object|null'], + 'MongoDB\Driver\ReadPreference::getMaxStalenessSeconds' => ['int'], + 'MongoDB\Driver\ReadPreference::getMode' => ['int'], + 'MongoDB\Driver\ReadPreference::getModeString' => ['string'], + 'MongoDB\Driver\ReadPreference::getTagSets' => ['array'], + 'MongoDB\Driver\ReadPreference::serialize' => ['string'], + 'MongoDB\Driver\ReadPreference::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\Driver\Server::__construct' => ['void', 'host'=>'string', 'port'=>'string', 'options='=>'array', 'driverOptions='=>'array'], + 'MongoDB\Driver\Server::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'zwrite'=>'BulkWrite'], + 'MongoDB\Driver\Server::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command'], + 'MongoDB\Driver\Server::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'zquery'=>'Query'], + 'MongoDB\Driver\Server::getHost' => ['string'], + 'MongoDB\Driver\Server::getInfo' => ['array'], + 'MongoDB\Driver\Server::getLatency' => ['int'], + 'MongoDB\Driver\Server::getPort' => ['int'], + 'MongoDB\Driver\Server::getState' => [''], + 'MongoDB\Driver\Server::getTags' => ['array'], + 'MongoDB\Driver\Server::getType' => ['int'], + 'MongoDB\Driver\Server::isArbiter' => ['bool'], + 'MongoDB\Driver\Server::isDelayed' => [''], + 'MongoDB\Driver\Server::isHidden' => ['bool'], + 'MongoDB\Driver\Server::isPassive' => ['bool'], + 'MongoDB\Driver\Server::isPrimary' => ['bool'], + 'MongoDB\Driver\Server::isSecondary' => ['bool'], + 'MongoDB\Driver\WriteConcern::__construct' => ['void', 'wstring'=>'string|int', 'wtimeout='=>'int', 'journal='=>'bool'], + 'MongoDB\Driver\WriteConcern::bsonSerialize' => ['object'], + 'MongoDB\Driver\WriteConcern::getJournal' => ['?bool'], + 'MongoDB\Driver\WriteConcern::getJurnal' => ['?bool'], + 'MongoDB\Driver\WriteConcern::getW' => ['int|null|string'], + 'MongoDB\Driver\WriteConcern::getWtimeout' => ['int'], + 'MongoDB\Driver\WriteConcern::isDefault' => ['bool'], + 'MongoDB\Driver\WriteConcern::serialize' => ['string'], + 'MongoDB\Driver\WriteConcern::unserialize' => ['void', 'serialized'=>'string'], + 'MongoDB\Driver\WriteConcernError::getCode' => ['int'], + 'MongoDB\Driver\WriteConcernError::getInfo' => ['mixed'], + 'MongoDB\Driver\WriteConcernError::getMessage' => ['string'], + 'MongoDB\Driver\WriteError::getCode' => ['int'], + 'MongoDB\Driver\WriteError::getIndex' => ['int'], + 'MongoDB\Driver\WriteError::getInfo' => ['mixed'], + 'MongoDB\Driver\WriteError::getMessage' => ['string'], + 'MongoDB\Driver\WriteException::getWriteResult' => [''], + 'MongoDB\Driver\WriteResult::getDeletedCount' => ['?int'], + 'MongoDB\Driver\WriteResult::getInfo' => [''], + 'MongoDB\Driver\WriteResult::getInsertedCount' => ['?int'], + 'MongoDB\Driver\WriteResult::getMatchedCount' => ['?int'], + 'MongoDB\Driver\WriteResult::getModifiedCount' => ['?int'], + 'MongoDB\Driver\WriteResult::getServer' => ['MongoDB\Driver\Server'], + 'MongoDB\Driver\WriteResult::getUpsertedCount' => ['?int'], + 'MongoDB\Driver\WriteResult::getUpsertedIds' => ['array'], + 'MongoDB\Driver\WriteResult::getWriteConcernError' => ['MongoDB\Driver\WriteConcernError|null'], + 'MongoDB\Driver\WriteResult::getWriteErrors' => ['MongoDB\Driver\WriteError[]'], + 'MongoDB\Driver\WriteResult::isAcknowledged' => ['bool'], + 'MongoDate::__construct' => ['void', 'second='=>'int', 'usecond='=>'int'], + 'MongoDate::__toString' => ['string'], + 'MongoDate::toDateTime' => ['DateTime'], + 'MongoDeleteBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], + 'MongoException::__clone' => ['void'], + 'MongoException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'MongoException::__toString' => ['string'], + 'MongoException::__wakeup' => ['void'], + 'MongoException::getCode' => ['int'], + 'MongoException::getFile' => ['string'], + 'MongoException::getLine' => ['int'], + 'MongoException::getMessage' => ['string'], + 'MongoException::getPrevious' => ['Exception|Throwable'], + 'MongoException::getTrace' => ['list\',args?:array}>'], + 'MongoException::getTraceAsString' => ['string'], + 'MongoGridFS::__construct' => ['void', 'db'=>'MongoDB', 'prefix='=>'string', 'chunks='=>'mixed'], + 'MongoGridFS::__get' => ['MongoCollection', 'name'=>'string'], + 'MongoGridFS::__toString' => ['string'], + 'MongoGridFS::aggregate' => ['array', 'pipeline'=>'array', 'op'=>'array', 'pipelineOperators'=>'array'], + 'MongoGridFS::aggregateCursor' => ['MongoCommandCursor', 'pipeline'=>'array', 'options'=>'array'], + 'MongoGridFS::batchInsert' => ['mixed', 'a'=>'array', 'options='=>'array'], + 'MongoGridFS::count' => ['int', 'query='=>'stdClass|array'], + 'MongoGridFS::createDBRef' => ['array', 'a'=>'array'], + 'MongoGridFS::createIndex' => ['array', 'keys'=>'array', 'options='=>'array'], + 'MongoGridFS::delete' => ['bool', 'id'=>'mixed'], + 'MongoGridFS::deleteIndex' => ['array', 'keys'=>'array|string'], + 'MongoGridFS::deleteIndexes' => ['array'], + 'MongoGridFS::distinct' => ['array|bool', 'key'=>'string', 'query='=>'?array'], + 'MongoGridFS::drop' => ['array'], + 'MongoGridFS::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'], + 'MongoGridFS::find' => ['MongoGridFSCursor', 'query='=>'array', 'fields='=>'array'], + 'MongoGridFS::findAndModify' => ['array', 'query'=>'array', 'update='=>'?array', 'fields='=>'?array', 'options='=>'?array'], + 'MongoGridFS::findOne' => ['?MongoGridFSFile', 'query='=>'mixed', 'fields='=>'mixed'], + 'MongoGridFS::get' => ['?MongoGridFSFile', 'id'=>'mixed'], + 'MongoGridFS::getDBRef' => ['array', 'ref'=>'array'], + 'MongoGridFS::getIndexInfo' => ['array'], + 'MongoGridFS::getName' => ['string'], + 'MongoGridFS::getReadPreference' => ['array'], + 'MongoGridFS::getSlaveOkay' => ['bool'], + 'MongoGridFS::group' => ['array', 'keys'=>'mixed', 'initial'=>'array', 'reduce'=>'MongoCode', 'condition='=>'array'], + 'MongoGridFS::insert' => ['array|bool', 'a'=>'array|object', 'options='=>'array'], + 'MongoGridFS::put' => ['mixed', 'filename'=>'string', 'extra='=>'array'], + 'MongoGridFS::remove' => ['bool', 'criteria='=>'array', 'options='=>'array'], + 'MongoGridFS::save' => ['array|bool', 'a'=>'array|object', 'options='=>'array'], + 'MongoGridFS::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags'=>'array'], + 'MongoGridFS::setSlaveOkay' => ['bool', 'ok='=>'bool'], + 'MongoGridFS::storeBytes' => ['mixed', 'bytes'=>'string', 'extra='=>'array', 'options='=>'array'], + 'MongoGridFS::storeFile' => ['mixed', 'filename'=>'string', 'extra='=>'array', 'options='=>'array'], + 'MongoGridFS::storeUpload' => ['mixed', 'name'=>'string', 'filename='=>'string'], + 'MongoGridFS::toIndexString' => ['string', 'keys'=>'mixed'], + 'MongoGridFS::update' => ['bool', 'criteria'=>'array', 'newobj'=>'array', 'options='=>'array'], + 'MongoGridFS::validate' => ['array', 'scan_data='=>'bool'], + 'MongoGridFSCursor::__construct' => ['void', 'gridfs'=>'MongoGridFS', 'connection'=>'resource', 'ns'=>'string', 'query'=>'array', 'fields'=>'array'], + 'MongoGridFSCursor::addOption' => ['MongoCursor', 'key'=>'string', 'value'=>'mixed'], + 'MongoGridFSCursor::awaitData' => ['MongoCursor', 'wait='=>'bool'], + 'MongoGridFSCursor::batchSize' => ['MongoCursor', 'batchSize'=>'int'], + 'MongoGridFSCursor::count' => ['int', 'all='=>'bool'], + 'MongoGridFSCursor::current' => ['MongoGridFSFile'], + 'MongoGridFSCursor::dead' => ['bool'], + 'MongoGridFSCursor::doQuery' => ['void'], + 'MongoGridFSCursor::explain' => ['array'], + 'MongoGridFSCursor::fields' => ['MongoCursor', 'f'=>'array'], + 'MongoGridFSCursor::getNext' => ['MongoGridFSFile'], + 'MongoGridFSCursor::getReadPreference' => ['array'], + 'MongoGridFSCursor::hasNext' => ['bool'], + 'MongoGridFSCursor::hint' => ['MongoCursor', 'key_pattern'=>'mixed'], + 'MongoGridFSCursor::immortal' => ['MongoCursor', 'liveForever='=>'bool'], + 'MongoGridFSCursor::info' => ['array'], + 'MongoGridFSCursor::key' => ['string'], + 'MongoGridFSCursor::limit' => ['MongoCursor', 'num'=>'int'], + 'MongoGridFSCursor::maxTimeMS' => ['MongoCursor', 'ms'=>'int'], + 'MongoGridFSCursor::next' => ['void'], + 'MongoGridFSCursor::partial' => ['MongoCursor', 'okay='=>'bool'], + 'MongoGridFSCursor::reset' => ['void'], + 'MongoGridFSCursor::rewind' => ['void'], + 'MongoGridFSCursor::setFlag' => ['MongoCursor', 'flag'=>'int', 'set='=>'bool'], + 'MongoGridFSCursor::setReadPreference' => ['MongoCursor', 'read_preference'=>'string', 'tags'=>'array'], + 'MongoGridFSCursor::skip' => ['MongoCursor', 'num'=>'int'], + 'MongoGridFSCursor::slaveOkay' => ['MongoCursor', 'okay='=>'bool'], + 'MongoGridFSCursor::snapshot' => ['MongoCursor'], + 'MongoGridFSCursor::sort' => ['MongoCursor', 'fields'=>'array'], + 'MongoGridFSCursor::tailable' => ['MongoCursor', 'tail='=>'bool'], + 'MongoGridFSCursor::timeout' => ['MongoCursor', 'ms'=>'int'], + 'MongoGridFSCursor::valid' => ['bool'], + 'MongoGridFSFile::getBytes' => ['string'], + 'MongoGridFSFile::getFilename' => ['string'], + 'MongoGridFSFile::getResource' => ['resource'], + 'MongoGridFSFile::getSize' => ['int'], + 'MongoGridFSFile::write' => ['int', 'filename='=>'string'], + 'MongoGridfsFile::__construct' => ['void', 'gridfs'=>'MongoGridFS', 'file'=>'array'], + 'MongoId::__construct' => ['void', 'id='=>'string|MongoId'], + 'MongoId::__set_state' => ['MongoId', 'props'=>'array'], + 'MongoId::__toString' => ['string'], + 'MongoId::getHostname' => ['string'], + 'MongoId::getInc' => ['int'], + 'MongoId::getPID' => ['int'], + 'MongoId::getTimestamp' => ['int'], + 'MongoId::isValid' => ['bool', 'value'=>'mixed'], + 'MongoInsertBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], + 'MongoInt32::__construct' => ['void', 'value'=>'string'], + 'MongoInt32::__toString' => ['string'], + 'MongoInt64::__construct' => ['void', 'value'=>'string'], + 'MongoInt64::__toString' => ['string'], + 'MongoLog::getCallback' => ['callable'], + 'MongoLog::getLevel' => ['int'], + 'MongoLog::getModule' => ['int'], + 'MongoLog::setCallback' => ['void', 'log_function'=>'callable'], + 'MongoLog::setLevel' => ['void', 'level'=>'int'], + 'MongoLog::setModule' => ['void', 'module'=>'int'], + 'MongoPool::getSize' => ['int'], + 'MongoPool::info' => ['array'], + 'MongoPool::setSize' => ['bool', 'size'=>'int'], + 'MongoRegex::__construct' => ['void', 'regex'=>'string'], + 'MongoRegex::__toString' => ['string'], + 'MongoResultException::__clone' => ['void'], + 'MongoResultException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'MongoResultException::__toString' => ['string'], + 'MongoResultException::__wakeup' => ['void'], + 'MongoResultException::getCode' => ['int'], + 'MongoResultException::getDocument' => ['array'], + 'MongoResultException::getFile' => ['string'], + 'MongoResultException::getLine' => ['int'], + 'MongoResultException::getMessage' => ['string'], + 'MongoResultException::getPrevious' => ['Exception|Throwable'], + 'MongoResultException::getTrace' => ['list\',args?:array}>'], + 'MongoResultException::getTraceAsString' => ['string'], + 'MongoTimestamp::__construct' => ['void', 'second='=>'int', 'inc='=>'int'], + 'MongoTimestamp::__toString' => ['string'], + 'MongoUpdateBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], + 'MongoUpdateBatch::add' => ['bool', 'item'=>'array'], + 'MongoUpdateBatch::execute' => ['array', 'write_options'=>'array'], + 'MongoWriteBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'batch_type'=>'string', 'write_options'=>'array'], + 'MongoWriteBatch::add' => ['bool', 'item'=>'array'], + 'MongoWriteBatch::execute' => ['array', 'write_options'=>'array'], + 'MongoWriteConcernException::__clone' => ['void'], + 'MongoWriteConcernException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'MongoWriteConcernException::__toString' => ['string'], + 'MongoWriteConcernException::__wakeup' => ['void'], + 'MongoWriteConcernException::getCode' => ['int'], + 'MongoWriteConcernException::getDocument' => ['array'], + 'MongoWriteConcernException::getFile' => ['string'], + 'MongoWriteConcernException::getLine' => ['int'], + 'MongoWriteConcernException::getMessage' => ['string'], + 'MongoWriteConcernException::getPrevious' => ['Exception|Throwable'], + 'MongoWriteConcernException::getTrace' => ['list\',args?:array}>'], + 'MongoWriteConcernException::getTraceAsString' => ['string'], + 'MultipleIterator::__construct' => ['void', 'flags='=>'int'], + 'MultipleIterator::attachIterator' => ['void', 'iterator'=>'Iterator', 'infos='=>'string'], + 'MultipleIterator::containsIterator' => ['bool', 'iterator'=>'Iterator'], + 'MultipleIterator::countIterators' => ['int'], + 'MultipleIterator::current' => ['array|false'], + 'MultipleIterator::detachIterator' => ['void', 'iterator'=>'Iterator'], + 'MultipleIterator::getFlags' => ['int'], + 'MultipleIterator::key' => ['array'], + 'MultipleIterator::next' => ['void'], + 'MultipleIterator::rewind' => ['void'], + 'MultipleIterator::setFlags' => ['int', 'flags'=>'int'], + 'MultipleIterator::valid' => ['bool'], + 'Mutex::create' => ['long', 'lock='=>'bool'], + 'Mutex::destroy' => ['bool', 'mutex'=>'long'], + 'Mutex::lock' => ['bool', 'mutex'=>'long'], + 'Mutex::trylock' => ['bool', 'mutex'=>'long'], + 'Mutex::unlock' => ['bool', 'mutex'=>'long', 'destroy='=>'bool'], + 'MysqlndUhConnection::__construct' => ['void'], + 'MysqlndUhConnection::changeUser' => ['bool', 'connection'=>'mysqlnd_connection', 'user'=>'string', 'password'=>'string', 'database'=>'string', 'silent'=>'bool', 'passwd_len'=>'int'], + 'MysqlndUhConnection::charsetName' => ['string', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::close' => ['bool', 'connection'=>'mysqlnd_connection', 'close_type'=>'int'], + 'MysqlndUhConnection::connect' => ['bool', 'connection'=>'mysqlnd_connection', 'host'=>'string', 'use'=>'string', 'password'=>'string', 'database'=>'string', 'port'=>'int', 'socket'=>'string', 'mysql_flags'=>'int'], + 'MysqlndUhConnection::endPSession' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::escapeString' => ['string', 'connection'=>'mysqlnd_connection', 'escape_string'=>'string'], + 'MysqlndUhConnection::getAffectedRows' => ['int', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getErrorNumber' => ['int', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getErrorString' => ['string', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getFieldCount' => ['int', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getHostInformation' => ['string', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getLastInsertId' => ['int', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getLastMessage' => ['void', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getProtocolInformation' => ['string', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getServerInformation' => ['string', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getServerStatistics' => ['string', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getServerVersion' => ['int', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getSqlstate' => ['string', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getStatistics' => ['array', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getThreadId' => ['int', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::getWarningCount' => ['int', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::init' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::killConnection' => ['bool', 'connection'=>'mysqlnd_connection', 'pid'=>'int'], + 'MysqlndUhConnection::listFields' => ['array', 'connection'=>'mysqlnd_connection', 'table'=>'string', 'achtung_wild'=>'string'], + 'MysqlndUhConnection::listMethod' => ['void', 'connection'=>'mysqlnd_connection', 'query'=>'string', 'achtung_wild'=>'string', 'par1'=>'string'], + 'MysqlndUhConnection::moreResults' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::nextResult' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::ping' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::query' => ['bool', 'connection'=>'mysqlnd_connection', 'query'=>'string'], + 'MysqlndUhConnection::queryReadResultsetHeader' => ['bool', 'connection'=>'mysqlnd_connection', 'mysqlnd_stmt'=>'mysqlnd_statement'], + 'MysqlndUhConnection::reapQuery' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::refreshServer' => ['bool', 'connection'=>'mysqlnd_connection', 'options'=>'int'], + 'MysqlndUhConnection::restartPSession' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::selectDb' => ['bool', 'connection'=>'mysqlnd_connection', 'database'=>'string'], + 'MysqlndUhConnection::sendClose' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::sendQuery' => ['bool', 'connection'=>'mysqlnd_connection', 'query'=>'string'], + 'MysqlndUhConnection::serverDumpDebugInformation' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::setAutocommit' => ['bool', 'connection'=>'mysqlnd_connection', 'mode'=>'int'], + 'MysqlndUhConnection::setCharset' => ['bool', 'connection'=>'mysqlnd_connection', 'charset'=>'string'], + 'MysqlndUhConnection::setClientOption' => ['bool', 'connection'=>'mysqlnd_connection', 'option'=>'int', 'value'=>'int'], + 'MysqlndUhConnection::setServerOption' => ['void', 'connection'=>'mysqlnd_connection', 'option'=>'int'], + 'MysqlndUhConnection::shutdownServer' => ['void', 'MYSQLND_UH_RES_MYSQLND_NAME'=>'string', 'level'=>'string'], + 'MysqlndUhConnection::simpleCommand' => ['bool', 'connection'=>'mysqlnd_connection', 'command'=>'int', 'arg'=>'string', 'ok_packet'=>'int', 'silent'=>'bool', 'ignore_upsert_status'=>'bool'], + 'MysqlndUhConnection::simpleCommandHandleResponse' => ['bool', 'connection'=>'mysqlnd_connection', 'ok_packet'=>'int', 'silent'=>'bool', 'command'=>'int', 'ignore_upsert_status'=>'bool'], + 'MysqlndUhConnection::sslSet' => ['bool', 'connection'=>'mysqlnd_connection', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], + 'MysqlndUhConnection::stmtInit' => ['resource', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::storeResult' => ['resource', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::txCommit' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::txRollback' => ['bool', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhConnection::useResult' => ['resource', 'connection'=>'mysqlnd_connection'], + 'MysqlndUhPreparedStatement::__construct' => ['void'], + 'MysqlndUhPreparedStatement::execute' => ['bool', 'statement'=>'mysqlnd_prepared_statement'], + 'MysqlndUhPreparedStatement::prepare' => ['bool', 'statement'=>'mysqlnd_prepared_statement', 'query'=>'string'], + 'NoRewindIterator::__construct' => ['void', 'iterator'=>'Iterator'], + 'NoRewindIterator::current' => ['mixed'], + 'NoRewindIterator::getInnerIterator' => ['Iterator'], + 'NoRewindIterator::key' => ['mixed'], + 'NoRewindIterator::next' => ['void'], + 'NoRewindIterator::rewind' => ['void'], + 'NoRewindIterator::valid' => ['bool'], + 'Normalizer::getRawDecomposition' => ['string|null', 'input'=>'string'], + 'Normalizer::isNormalized' => ['bool', 'input'=>'string', 'form='=>'int'], + 'Normalizer::normalize' => ['string', 'input'=>'string', 'form='=>'int'], + 'NumberFormatter::__construct' => ['void', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], + 'NumberFormatter::create' => ['NumberFormatter|false', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], + 'NumberFormatter::format' => ['string|false', 'num'=>'', 'type='=>'int'], + 'NumberFormatter::formatCurrency' => ['string|false', 'num'=>'float', 'currency'=>'string'], + 'NumberFormatter::getAttribute' => ['int|false', 'attr'=>'int'], + 'NumberFormatter::getErrorCode' => ['int'], + 'NumberFormatter::getErrorMessage' => ['string'], + 'NumberFormatter::getLocale' => ['string', 'type='=>'int'], + 'NumberFormatter::getPattern' => ['string|false'], + 'NumberFormatter::getSymbol' => ['string|false', 'attr'=>'int'], + 'NumberFormatter::getTextAttribute' => ['string|false', 'attr'=>'int'], + 'NumberFormatter::parse' => ['float|false', 'string'=>'string', 'type='=>'int', '&rw_position='=>'int'], + 'NumberFormatter::parseCurrency' => ['float|false', 'string'=>'string', '&w_currency'=>'string', '&rw_position='=>'int'], + 'NumberFormatter::setAttribute' => ['bool', 'attr'=>'int', 'value'=>''], + 'NumberFormatter::setPattern' => ['bool', 'pattern'=>'string'], + 'NumberFormatter::setSymbol' => ['bool', 'attr'=>'int', 'symbol'=>'string'], + 'NumberFormatter::setTextAttribute' => ['bool', 'attr'=>'int', 'value'=>'string'], + 'OAuth::__construct' => ['void', 'consumer_key'=>'string', 'consumer_secret'=>'string', 'signature_method='=>'string', 'auth_type='=>'int'], + 'OAuth::__destruct' => ['void'], + 'OAuth::disableDebug' => ['bool'], + 'OAuth::disableRedirects' => ['bool'], + 'OAuth::disableSSLChecks' => ['bool'], + 'OAuth::enableDebug' => ['bool'], + 'OAuth::enableRedirects' => ['bool'], + 'OAuth::enableSSLChecks' => ['bool'], + 'OAuth::fetch' => ['mixed', 'protected_resource_url'=>'string', 'extra_parameters='=>'array', 'http_method='=>'string', 'http_headers='=>'array'], + 'OAuth::generateSignature' => ['string', 'http_method'=>'string', 'url'=>'string', 'extra_parameters='=>'mixed'], + 'OAuth::getAccessToken' => ['array|false', 'access_token_url'=>'string', 'auth_session_handle='=>'string', 'verifier_token='=>'string', 'http_method='=>'string'], + 'OAuth::getCAPath' => ['array'], + 'OAuth::getLastResponse' => ['string'], + 'OAuth::getLastResponseHeaders' => ['string|false'], + 'OAuth::getLastResponseInfo' => ['array'], + 'OAuth::getRequestHeader' => ['string|false', 'http_method'=>'string', 'url'=>'string', 'extra_parameters='=>'mixed'], + 'OAuth::getRequestToken' => ['array|false', 'request_token_url'=>'string', 'callback_url='=>'string', 'http_method='=>'string'], + 'OAuth::setAuthType' => ['bool', 'auth_type'=>'int'], + 'OAuth::setCAPath' => ['mixed', 'ca_path='=>'string', 'ca_info='=>'string'], + 'OAuth::setNonce' => ['mixed', 'nonce'=>'string'], + 'OAuth::setRSACertificate' => ['mixed', 'cert'=>'string'], + 'OAuth::setRequestEngine' => ['void', 'reqengine'=>'int'], + 'OAuth::setSSLChecks' => ['bool', 'sslcheck'=>'int'], + 'OAuth::setTimeout' => ['void', 'timeout'=>'int'], + 'OAuth::setTimestamp' => ['mixed', 'timestamp'=>'string'], + 'OAuth::setToken' => ['bool', 'token'=>'string', 'token_secret'=>'string'], + 'OAuth::setVersion' => ['bool', 'version'=>'string'], + 'OAuthProvider::__construct' => ['void', 'params_array='=>'array'], + 'OAuthProvider::addRequiredParameter' => ['bool', 'req_params'=>'string'], + 'OAuthProvider::callTimestampNonceHandler' => ['void'], + 'OAuthProvider::callconsumerHandler' => ['void'], + 'OAuthProvider::calltokenHandler' => ['void'], + 'OAuthProvider::checkOAuthRequest' => ['void', 'uri='=>'string', 'method='=>'string'], + 'OAuthProvider::consumerHandler' => ['void', 'callback_function'=>'callable'], + 'OAuthProvider::generateToken' => ['string', 'size'=>'int', 'strong='=>'bool'], + 'OAuthProvider::is2LeggedEndpoint' => ['void', 'params_array'=>'mixed'], + 'OAuthProvider::isRequestTokenEndpoint' => ['void', 'will_issue_request_token'=>'bool'], + 'OAuthProvider::removeRequiredParameter' => ['bool', 'req_params'=>'string'], + 'OAuthProvider::reportProblem' => ['string', 'oauthexception'=>'string', 'send_headers='=>'bool'], + 'OAuthProvider::setParam' => ['bool', 'param_key'=>'string', 'param_val='=>'mixed'], + 'OAuthProvider::setRequestTokenPath' => ['bool', 'path'=>'string'], + 'OAuthProvider::timestampNonceHandler' => ['void', 'callback_function'=>'callable'], + 'OAuthProvider::tokenHandler' => ['void', 'callback_function'=>'callable'], + 'OCICollection::append' => ['bool', 'value'=>'mixed'], + 'OCICollection::assign' => ['bool', 'from'=>'OCI_Collection'], + 'OCICollection::assignElem' => ['bool', 'index'=>'int', 'value'=>'mixed'], + 'OCICollection::free' => ['bool'], + 'OCICollection::getElem' => ['mixed', 'index'=>'int'], + 'OCICollection::max' => ['int|false'], + 'OCICollection::size' => ['int|false'], + 'OCICollection::trim' => ['bool', 'num'=>'int'], + 'OCILob::append' => ['bool', 'lob_from'=>'OCILob'], + 'OCILob::close' => ['bool'], + 'OCILob::eof' => ['bool'], + 'OCILob::erase' => ['int|false', 'offset='=>'int', 'length='=>'int'], + 'OCILob::export' => ['bool', 'filename'=>'string', 'start='=>'int', 'length='=>'int'], + 'OCILob::flush' => ['bool', 'flag='=>'int'], + 'OCILob::free' => ['bool'], + 'OCILob::getbuffering' => ['bool'], + 'OCILob::import' => ['bool', 'filename'=>'string'], + 'OCILob::load' => ['string|false'], + 'OCILob::read' => ['string|false', 'length'=>'int'], + 'OCILob::rewind' => ['bool'], + 'OCILob::save' => ['bool', 'data'=>'string', 'offset='=>'int'], + 'OCILob::savefile' => ['bool', 'filename'=>''], + 'OCILob::seek' => ['bool', 'offset'=>'int', 'whence='=>'int'], + 'OCILob::setbuffering' => ['bool', 'on_off'=>'bool'], + 'OCILob::size' => ['int|false'], + 'OCILob::tell' => ['int|false'], + 'OCILob::truncate' => ['bool', 'length='=>'int'], + 'OCILob::write' => ['int|false', 'data'=>'string', 'length='=>'int'], + 'OCILob::writeTemporary' => ['bool', 'data'=>'string', 'lob_type='=>'int'], + 'OCILob::writetofile' => ['bool', 'filename'=>'', 'start'=>'', 'length'=>''], + 'OutOfBoundsException::__clone' => ['void'], + 'OutOfBoundsException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OutOfBoundsException'], + 'OutOfBoundsException::__toString' => ['string'], + 'OutOfBoundsException::getCode' => ['int'], + 'OutOfBoundsException::getFile' => ['string'], + 'OutOfBoundsException::getLine' => ['int'], + 'OutOfBoundsException::getMessage' => ['string'], + 'OutOfBoundsException::getPrevious' => ['Throwable|OutOfBoundsException|null'], + 'OutOfBoundsException::getTrace' => ['list\',args?:array}>'], + 'OutOfBoundsException::getTraceAsString' => ['string'], + 'OutOfRangeException::__clone' => ['void'], + 'OutOfRangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OutOfRangeException'], + 'OutOfRangeException::__toString' => ['string'], + 'OutOfRangeException::getCode' => ['int'], + 'OutOfRangeException::getFile' => ['string'], + 'OutOfRangeException::getLine' => ['int'], + 'OutOfRangeException::getMessage' => ['string'], + 'OutOfRangeException::getPrevious' => ['Throwable|OutOfRangeException|null'], + 'OutOfRangeException::getTrace' => ['list\',args?:array}>'], + 'OutOfRangeException::getTraceAsString' => ['string'], + 'OuterIterator::current' => ['mixed'], + 'OuterIterator::getInnerIterator' => ['Iterator'], + 'OuterIterator::key' => ['int|string'], + 'OuterIterator::next' => ['void'], + 'OuterIterator::rewind' => ['void'], + 'OuterIterator::valid' => ['bool'], + 'OverflowException::__clone' => ['void'], + 'OverflowException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OverflowException'], + 'OverflowException::__toString' => ['string'], + 'OverflowException::getCode' => ['int'], + 'OverflowException::getFile' => ['string'], + 'OverflowException::getLine' => ['int'], + 'OverflowException::getMessage' => ['string'], + 'OverflowException::getPrevious' => ['Throwable|OverflowException|null'], + 'OverflowException::getTrace' => ['list\',args?:array}>'], + 'OverflowException::getTraceAsString' => ['string'], + 'OwsrequestObj::__construct' => ['void'], + 'OwsrequestObj::addParameter' => ['int', 'name'=>'string', 'value'=>'string'], + 'OwsrequestObj::getName' => ['string', 'index'=>'int'], + 'OwsrequestObj::getValue' => ['string', 'index'=>'int'], + 'OwsrequestObj::getValueByName' => ['string', 'name'=>'string'], + 'OwsrequestObj::loadParams' => ['int'], + 'OwsrequestObj::setParameter' => ['int', 'name'=>'string', 'value'=>'string'], + 'PDF_activate_item' => ['bool', 'pdfdoc'=>'resource', 'id'=>'int'], + 'PDF_add_launchlink' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], + 'PDF_add_locallink' => ['bool', 'pdfdoc'=>'resource', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'page'=>'int', 'dest'=>'string'], + 'PDF_add_nameddest' => ['bool', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], + 'PDF_add_note' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], + 'PDF_add_pdflink' => ['bool', 'pdfdoc'=>'resource', 'bottom_left_x'=>'float', 'bottom_left_y'=>'float', 'up_right_x'=>'float', 'up_right_y'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], + 'PDF_add_table_cell' => ['int', 'pdfdoc'=>'resource', 'table'=>'int', 'column'=>'int', 'row'=>'int', 'text'=>'string', 'optlist'=>'string'], + 'PDF_add_textflow' => ['int', 'pdfdoc'=>'resource', 'textflow'=>'int', 'text'=>'string', 'optlist'=>'string'], + 'PDF_add_thumbnail' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int'], + 'PDF_add_weblink' => ['bool', 'pdfdoc'=>'resource', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'url'=>'string'], + 'PDF_arc' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], + 'PDF_arcn' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], + 'PDF_attach_file' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'description'=>'string', 'author'=>'string', 'mimetype'=>'string', 'icon'=>'string'], + 'PDF_begin_document' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string'], + 'PDF_begin_font' => ['bool', 'pdfdoc'=>'resource', 'filename'=>'string', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float', 'optlist'=>'string'], + 'PDF_begin_glyph' => ['bool', 'pdfdoc'=>'resource', 'glyphname'=>'string', 'wx'=>'float', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float'], + 'PDF_begin_item' => ['int', 'pdfdoc'=>'resource', 'tag'=>'string', 'optlist'=>'string'], + 'PDF_begin_layer' => ['bool', 'pdfdoc'=>'resource', 'layer'=>'int'], + 'PDF_begin_page' => ['bool', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float'], + 'PDF_begin_page_ext' => ['bool', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], + 'PDF_begin_pattern' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], + 'PDF_begin_template' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float'], + 'PDF_begin_template_ext' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], + 'PDF_circle' => ['bool', 'pdfdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float'], + 'PDF_clip' => ['bool', 'p'=>'resource'], + 'PDF_close' => ['bool', 'p'=>'resource'], + 'PDF_close_image' => ['bool', 'p'=>'resource', 'image'=>'int'], + 'PDF_close_pdi' => ['bool', 'p'=>'resource', 'doc'=>'int'], + 'PDF_close_pdi_page' => ['bool', 'p'=>'resource', 'page'=>'int'], + 'PDF_closepath' => ['bool', 'p'=>'resource'], + 'PDF_closepath_fill_stroke' => ['bool', 'p'=>'resource'], + 'PDF_closepath_stroke' => ['bool', 'p'=>'resource'], + 'PDF_concat' => ['bool', 'p'=>'resource', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], + 'PDF_continue_text' => ['bool', 'p'=>'resource', 'text'=>'string'], + 'PDF_create_3dview' => ['int', 'pdfdoc'=>'resource', 'username'=>'string', 'optlist'=>'string'], + 'PDF_create_action' => ['int', 'pdfdoc'=>'resource', 'type'=>'string', 'optlist'=>'string'], + 'PDF_create_annotation' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'type'=>'string', 'optlist'=>'string'], + 'PDF_create_bookmark' => ['int', 'pdfdoc'=>'resource', 'text'=>'string', 'optlist'=>'string'], + 'PDF_create_field' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'name'=>'string', 'type'=>'string', 'optlist'=>'string'], + 'PDF_create_fieldgroup' => ['bool', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], + 'PDF_create_gstate' => ['int', 'pdfdoc'=>'resource', 'optlist'=>'string'], + 'PDF_create_pvf' => ['bool', 'pdfdoc'=>'resource', 'filename'=>'string', 'data'=>'string', 'optlist'=>'string'], + 'PDF_create_textflow' => ['int', 'pdfdoc'=>'resource', 'text'=>'string', 'optlist'=>'string'], + 'PDF_curveto' => ['bool', 'p'=>'resource', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], + 'PDF_define_layer' => ['int', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], + 'PDF_delete' => ['bool', 'pdfdoc'=>'resource'], + 'PDF_delete_pvf' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string'], + 'PDF_delete_table' => ['bool', 'pdfdoc'=>'resource', 'table'=>'int', 'optlist'=>'string'], + 'PDF_delete_textflow' => ['bool', 'pdfdoc'=>'resource', 'textflow'=>'int'], + 'PDF_encoding_set_char' => ['bool', 'pdfdoc'=>'resource', 'encoding'=>'string', 'slot'=>'int', 'glyphname'=>'string', 'uv'=>'int'], + 'PDF_end_document' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], + 'PDF_end_font' => ['bool', 'pdfdoc'=>'resource'], + 'PDF_end_glyph' => ['bool', 'pdfdoc'=>'resource'], + 'PDF_end_item' => ['bool', 'pdfdoc'=>'resource', 'id'=>'int'], + 'PDF_end_layer' => ['bool', 'pdfdoc'=>'resource'], + 'PDF_end_page' => ['bool', 'p'=>'resource'], + 'PDF_end_page_ext' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], + 'PDF_end_pattern' => ['bool', 'p'=>'resource'], + 'PDF_end_template' => ['bool', 'p'=>'resource'], + 'PDF_endpath' => ['bool', 'p'=>'resource'], + 'PDF_fill' => ['bool', 'p'=>'resource'], + 'PDF_fill_imageblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'image'=>'int', 'optlist'=>'string'], + 'PDF_fill_pdfblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'contents'=>'int', 'optlist'=>'string'], + 'PDF_fill_stroke' => ['bool', 'p'=>'resource'], + 'PDF_fill_textblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'text'=>'string', 'optlist'=>'string'], + 'PDF_findfont' => ['int', 'p'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'embed'=>'int'], + 'PDF_fit_image' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], + 'PDF_fit_pdi_page' => ['bool', 'pdfdoc'=>'resource', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], + 'PDF_fit_table' => ['string', 'pdfdoc'=>'resource', 'table'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], + 'PDF_fit_textflow' => ['string', 'pdfdoc'=>'resource', 'textflow'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], + 'PDF_fit_textline' => ['bool', 'pdfdoc'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], + 'PDF_get_apiname' => ['string', 'pdfdoc'=>'resource'], + 'PDF_get_buffer' => ['string', 'p'=>'resource'], + 'PDF_get_errmsg' => ['string', 'pdfdoc'=>'resource'], + 'PDF_get_errnum' => ['int', 'pdfdoc'=>'resource'], + 'PDF_get_majorversion' => ['int'], + 'PDF_get_minorversion' => ['int'], + 'PDF_get_parameter' => ['string', 'p'=>'resource', 'key'=>'string', 'modifier'=>'float'], + 'PDF_get_pdi_parameter' => ['string', 'p'=>'resource', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], + 'PDF_get_pdi_value' => ['float', 'p'=>'resource', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], + 'PDF_get_value' => ['float', 'p'=>'resource', 'key'=>'string', 'modifier'=>'float'], + 'PDF_info_font' => ['float', 'pdfdoc'=>'resource', 'font'=>'int', 'keyword'=>'string', 'optlist'=>'string'], + 'PDF_info_matchbox' => ['float', 'pdfdoc'=>'resource', 'boxname'=>'string', 'num'=>'int', 'keyword'=>'string'], + 'PDF_info_table' => ['float', 'pdfdoc'=>'resource', 'table'=>'int', 'keyword'=>'string'], + 'PDF_info_textflow' => ['float', 'pdfdoc'=>'resource', 'textflow'=>'int', 'keyword'=>'string'], + 'PDF_info_textline' => ['float', 'pdfdoc'=>'resource', 'text'=>'string', 'keyword'=>'string', 'optlist'=>'string'], + 'PDF_initgraphics' => ['bool', 'p'=>'resource'], + 'PDF_lineto' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], + 'PDF_load_3ddata' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string'], + 'PDF_load_font' => ['int', 'pdfdoc'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'optlist'=>'string'], + 'PDF_load_iccprofile' => ['int', 'pdfdoc'=>'resource', 'profilename'=>'string', 'optlist'=>'string'], + 'PDF_load_image' => ['int', 'pdfdoc'=>'resource', 'imagetype'=>'string', 'filename'=>'string', 'optlist'=>'string'], + 'PDF_makespotcolor' => ['int', 'p'=>'resource', 'spotname'=>'string'], + 'PDF_moveto' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], + 'PDF_new' => ['resource'], + 'PDF_open_ccitt' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'bitreverse'=>'int', 'k'=>'int', 'blackls1'=>'int'], + 'PDF_open_file' => ['bool', 'p'=>'resource', 'filename'=>'string'], + 'PDF_open_image' => ['int', 'p'=>'resource', 'imagetype'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], + 'PDF_open_image_file' => ['int', 'p'=>'resource', 'imagetype'=>'string', 'filename'=>'string', 'stringparam'=>'string', 'intparam'=>'int'], + 'PDF_open_memory_image' => ['int', 'p'=>'resource', 'image'=>'resource'], + 'PDF_open_pdi' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string', 'length'=>'int'], + 'PDF_open_pdi_document' => ['int', 'p'=>'resource', 'filename'=>'string', 'optlist'=>'string'], + 'PDF_open_pdi_page' => ['int', 'p'=>'resource', 'doc'=>'int', 'pagenumber'=>'int', 'optlist'=>'string'], + 'PDF_pcos_get_number' => ['float', 'p'=>'resource', 'doc'=>'int', 'path'=>'string'], + 'PDF_pcos_get_stream' => ['string', 'p'=>'resource', 'doc'=>'int', 'optlist'=>'string', 'path'=>'string'], + 'PDF_pcos_get_string' => ['string', 'p'=>'resource', 'doc'=>'int', 'path'=>'string'], + 'PDF_place_image' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], + 'PDF_place_pdi_page' => ['bool', 'pdfdoc'=>'resource', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'sx'=>'float', 'sy'=>'float'], + 'PDF_process_pdi' => ['int', 'pdfdoc'=>'resource', 'doc'=>'int', 'page'=>'int', 'optlist'=>'string'], + 'PDF_rect' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], + 'PDF_restore' => ['bool', 'p'=>'resource'], + 'PDF_resume_page' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], + 'PDF_rotate' => ['bool', 'p'=>'resource', 'phi'=>'float'], + 'PDF_save' => ['bool', 'p'=>'resource'], + 'PDF_scale' => ['bool', 'p'=>'resource', 'sx'=>'float', 'sy'=>'float'], + 'PDF_set_border_color' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'PDF_set_border_dash' => ['bool', 'pdfdoc'=>'resource', 'black'=>'float', 'white'=>'float'], + 'PDF_set_border_style' => ['bool', 'pdfdoc'=>'resource', 'style'=>'string', 'width'=>'float'], + 'PDF_set_gstate' => ['bool', 'pdfdoc'=>'resource', 'gstate'=>'int'], + 'PDF_set_info' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], + 'PDF_set_layer_dependency' => ['bool', 'pdfdoc'=>'resource', 'type'=>'string', 'optlist'=>'string'], + 'PDF_set_parameter' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], + 'PDF_set_text_pos' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], + 'PDF_set_value' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'float'], + 'PDF_setcolor' => ['bool', 'p'=>'resource', 'fstype'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], + 'PDF_setdash' => ['bool', 'pdfdoc'=>'resource', 'b'=>'float', 'w'=>'float'], + 'PDF_setdashpattern' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], + 'PDF_setflat' => ['bool', 'pdfdoc'=>'resource', 'flatness'=>'float'], + 'PDF_setfont' => ['bool', 'pdfdoc'=>'resource', 'font'=>'int', 'fontsize'=>'float'], + 'PDF_setgray' => ['bool', 'p'=>'resource', 'g'=>'float'], + 'PDF_setgray_fill' => ['bool', 'p'=>'resource', 'g'=>'float'], + 'PDF_setgray_stroke' => ['bool', 'p'=>'resource', 'g'=>'float'], + 'PDF_setlinecap' => ['bool', 'p'=>'resource', 'linecap'=>'int'], + 'PDF_setlinejoin' => ['bool', 'p'=>'resource', 'value'=>'int'], + 'PDF_setlinewidth' => ['bool', 'p'=>'resource', 'width'=>'float'], + 'PDF_setmatrix' => ['bool', 'p'=>'resource', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], + 'PDF_setmiterlimit' => ['bool', 'pdfdoc'=>'resource', 'miter'=>'float'], + 'PDF_setrgbcolor' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'PDF_setrgbcolor_fill' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'PDF_setrgbcolor_stroke' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'PDF_shading' => ['int', 'pdfdoc'=>'resource', 'shtype'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], + 'PDF_shading_pattern' => ['int', 'pdfdoc'=>'resource', 'shading'=>'int', 'optlist'=>'string'], + 'PDF_shfill' => ['bool', 'pdfdoc'=>'resource', 'shading'=>'int'], + 'PDF_show' => ['bool', 'pdfdoc'=>'resource', 'text'=>'string'], + 'PDF_show_boxed' => ['int', 'p'=>'resource', 'text'=>'string', 'left'=>'float', 'top'=>'float', 'width'=>'float', 'height'=>'float', 'mode'=>'string', 'feature'=>'string'], + 'PDF_show_xy' => ['bool', 'p'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float'], + 'PDF_skew' => ['bool', 'p'=>'resource', 'alpha'=>'float', 'beta'=>'float'], + 'PDF_stringwidth' => ['float', 'p'=>'resource', 'text'=>'string', 'font'=>'int', 'fontsize'=>'float'], + 'PDF_stroke' => ['bool', 'p'=>'resource'], + 'PDF_suspend_page' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], + 'PDF_translate' => ['bool', 'p'=>'resource', 'tx'=>'float', 'ty'=>'float'], + 'PDF_utf16_to_utf8' => ['string', 'pdfdoc'=>'resource', 'utf16string'=>'string'], + 'PDF_utf32_to_utf16' => ['string', 'pdfdoc'=>'resource', 'utf32string'=>'string', 'ordering'=>'string'], + 'PDF_utf8_to_utf16' => ['string', 'pdfdoc'=>'resource', 'utf8string'=>'string', 'ordering'=>'string'], + 'PDFlib::activate_item' => ['bool', 'id'=>''], + 'PDFlib::add_launchlink' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], + 'PDFlib::add_locallink' => ['bool', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'page'=>'int', 'dest'=>'string'], + 'PDFlib::add_nameddest' => ['bool', 'name'=>'string', 'optlist'=>'string'], + 'PDFlib::add_note' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], + 'PDFlib::add_pdflink' => ['bool', 'bottom_left_x'=>'float', 'bottom_left_y'=>'float', 'up_right_x'=>'float', 'up_right_y'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], + 'PDFlib::add_table_cell' => ['int', 'table'=>'int', 'column'=>'int', 'row'=>'int', 'text'=>'string', 'optlist'=>'string'], + 'PDFlib::add_textflow' => ['int', 'textflow'=>'int', 'text'=>'string', 'optlist'=>'string'], + 'PDFlib::add_thumbnail' => ['bool', 'image'=>'int'], + 'PDFlib::add_weblink' => ['bool', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'url'=>'string'], + 'PDFlib::arc' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], + 'PDFlib::arcn' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], + 'PDFlib::attach_file' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'description'=>'string', 'author'=>'string', 'mimetype'=>'string', 'icon'=>'string'], + 'PDFlib::begin_document' => ['int', 'filename'=>'string', 'optlist'=>'string'], + 'PDFlib::begin_font' => ['bool', 'filename'=>'string', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float', 'optlist'=>'string'], + 'PDFlib::begin_glyph' => ['bool', 'glyphname'=>'string', 'wx'=>'float', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float'], + 'PDFlib::begin_item' => ['int', 'tag'=>'string', 'optlist'=>'string'], + 'PDFlib::begin_layer' => ['bool', 'layer'=>'int'], + 'PDFlib::begin_page' => ['bool', 'width'=>'float', 'height'=>'float'], + 'PDFlib::begin_page_ext' => ['bool', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], + 'PDFlib::begin_pattern' => ['int', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], + 'PDFlib::begin_template' => ['int', 'width'=>'float', 'height'=>'float'], + 'PDFlib::begin_template_ext' => ['int', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], + 'PDFlib::circle' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float'], + 'PDFlib::clip' => ['bool'], + 'PDFlib::close' => ['bool'], + 'PDFlib::close_image' => ['bool', 'image'=>'int'], + 'PDFlib::close_pdi' => ['bool', 'doc'=>'int'], + 'PDFlib::close_pdi_page' => ['bool', 'page'=>'int'], + 'PDFlib::closepath' => ['bool'], + 'PDFlib::closepath_fill_stroke' => ['bool'], + 'PDFlib::closepath_stroke' => ['bool'], + 'PDFlib::concat' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], + 'PDFlib::continue_text' => ['bool', 'text'=>'string'], + 'PDFlib::create_3dview' => ['int', 'username'=>'string', 'optlist'=>'string'], + 'PDFlib::create_action' => ['int', 'type'=>'string', 'optlist'=>'string'], + 'PDFlib::create_annotation' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'type'=>'string', 'optlist'=>'string'], + 'PDFlib::create_bookmark' => ['int', 'text'=>'string', 'optlist'=>'string'], + 'PDFlib::create_field' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'name'=>'string', 'type'=>'string', 'optlist'=>'string'], + 'PDFlib::create_fieldgroup' => ['bool', 'name'=>'string', 'optlist'=>'string'], + 'PDFlib::create_gstate' => ['int', 'optlist'=>'string'], + 'PDFlib::create_pvf' => ['bool', 'filename'=>'string', 'data'=>'string', 'optlist'=>'string'], + 'PDFlib::create_textflow' => ['int', 'text'=>'string', 'optlist'=>'string'], + 'PDFlib::curveto' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], + 'PDFlib::define_layer' => ['int', 'name'=>'string', 'optlist'=>'string'], + 'PDFlib::delete' => ['bool'], + 'PDFlib::delete_pvf' => ['int', 'filename'=>'string'], + 'PDFlib::delete_table' => ['bool', 'table'=>'int', 'optlist'=>'string'], + 'PDFlib::delete_textflow' => ['bool', 'textflow'=>'int'], + 'PDFlib::encoding_set_char' => ['bool', 'encoding'=>'string', 'slot'=>'int', 'glyphname'=>'string', 'uv'=>'int'], + 'PDFlib::end_document' => ['bool', 'optlist'=>'string'], + 'PDFlib::end_font' => ['bool'], + 'PDFlib::end_glyph' => ['bool'], + 'PDFlib::end_item' => ['bool', 'id'=>'int'], + 'PDFlib::end_layer' => ['bool'], + 'PDFlib::end_page' => ['bool', 'p'=>''], + 'PDFlib::end_page_ext' => ['bool', 'optlist'=>'string'], + 'PDFlib::end_pattern' => ['bool', 'p'=>''], + 'PDFlib::end_template' => ['bool', 'p'=>''], + 'PDFlib::endpath' => ['bool', 'p'=>''], + 'PDFlib::fill' => ['bool'], + 'PDFlib::fill_imageblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'image'=>'int', 'optlist'=>'string'], + 'PDFlib::fill_pdfblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'contents'=>'int', 'optlist'=>'string'], + 'PDFlib::fill_stroke' => ['bool'], + 'PDFlib::fill_textblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'text'=>'string', 'optlist'=>'string'], + 'PDFlib::findfont' => ['int', 'fontname'=>'string', 'encoding'=>'string', 'embed'=>'int'], + 'PDFlib::fit_image' => ['bool', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], + 'PDFlib::fit_pdi_page' => ['bool', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], + 'PDFlib::fit_table' => ['string', 'table'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], + 'PDFlib::fit_textflow' => ['string', 'textflow'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], + 'PDFlib::fit_textline' => ['bool', 'text'=>'string', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], + 'PDFlib::get_apiname' => ['string'], + 'PDFlib::get_buffer' => ['string'], + 'PDFlib::get_errmsg' => ['string'], + 'PDFlib::get_errnum' => ['int'], + 'PDFlib::get_majorversion' => ['int'], + 'PDFlib::get_minorversion' => ['int'], + 'PDFlib::get_parameter' => ['string', 'key'=>'string', 'modifier'=>'float'], + 'PDFlib::get_pdi_parameter' => ['string', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], + 'PDFlib::get_pdi_value' => ['float', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], + 'PDFlib::get_value' => ['float', 'key'=>'string', 'modifier'=>'float'], + 'PDFlib::info_font' => ['float', 'font'=>'int', 'keyword'=>'string', 'optlist'=>'string'], + 'PDFlib::info_matchbox' => ['float', 'boxname'=>'string', 'num'=>'int', 'keyword'=>'string'], + 'PDFlib::info_table' => ['float', 'table'=>'int', 'keyword'=>'string'], + 'PDFlib::info_textflow' => ['float', 'textflow'=>'int', 'keyword'=>'string'], + 'PDFlib::info_textline' => ['float', 'text'=>'string', 'keyword'=>'string', 'optlist'=>'string'], + 'PDFlib::initgraphics' => ['bool'], + 'PDFlib::lineto' => ['bool', 'x'=>'float', 'y'=>'float'], + 'PDFlib::load_3ddata' => ['int', 'filename'=>'string', 'optlist'=>'string'], + 'PDFlib::load_font' => ['int', 'fontname'=>'string', 'encoding'=>'string', 'optlist'=>'string'], + 'PDFlib::load_iccprofile' => ['int', 'profilename'=>'string', 'optlist'=>'string'], + 'PDFlib::load_image' => ['int', 'imagetype'=>'string', 'filename'=>'string', 'optlist'=>'string'], + 'PDFlib::makespotcolor' => ['int', 'spotname'=>'string'], + 'PDFlib::moveto' => ['bool', 'x'=>'float', 'y'=>'float'], + 'PDFlib::open_ccitt' => ['int', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'BitReverse'=>'int', 'k'=>'int', 'Blackls1'=>'int'], + 'PDFlib::open_file' => ['bool', 'filename'=>'string'], + 'PDFlib::open_image' => ['int', 'imagetype'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], + 'PDFlib::open_image_file' => ['int', 'imagetype'=>'string', 'filename'=>'string', 'stringparam'=>'string', 'intparam'=>'int'], + 'PDFlib::open_memory_image' => ['int', 'image'=>'resource'], + 'PDFlib::open_pdi' => ['int', 'filename'=>'string', 'optlist'=>'string', 'length'=>'int'], + 'PDFlib::open_pdi_document' => ['int', 'filename'=>'string', 'optlist'=>'string'], + 'PDFlib::open_pdi_page' => ['int', 'doc'=>'int', 'pagenumber'=>'int', 'optlist'=>'string'], + 'PDFlib::pcos_get_number' => ['float', 'doc'=>'int', 'path'=>'string'], + 'PDFlib::pcos_get_stream' => ['string', 'doc'=>'int', 'optlist'=>'string', 'path'=>'string'], + 'PDFlib::pcos_get_string' => ['string', 'doc'=>'int', 'path'=>'string'], + 'PDFlib::place_image' => ['bool', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], + 'PDFlib::place_pdi_page' => ['bool', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'sx'=>'float', 'sy'=>'float'], + 'PDFlib::process_pdi' => ['int', 'doc'=>'int', 'page'=>'int', 'optlist'=>'string'], + 'PDFlib::rect' => ['bool', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], + 'PDFlib::restore' => ['bool', 'p'=>''], + 'PDFlib::resume_page' => ['bool', 'optlist'=>'string'], + 'PDFlib::rotate' => ['bool', 'phi'=>'float'], + 'PDFlib::save' => ['bool', 'p'=>''], + 'PDFlib::scale' => ['bool', 'sx'=>'float', 'sy'=>'float'], + 'PDFlib::set_border_color' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'PDFlib::set_border_dash' => ['bool', 'black'=>'float', 'white'=>'float'], + 'PDFlib::set_border_style' => ['bool', 'style'=>'string', 'width'=>'float'], + 'PDFlib::set_gstate' => ['bool', 'gstate'=>'int'], + 'PDFlib::set_info' => ['bool', 'key'=>'string', 'value'=>'string'], + 'PDFlib::set_layer_dependency' => ['bool', 'type'=>'string', 'optlist'=>'string'], + 'PDFlib::set_parameter' => ['bool', 'key'=>'string', 'value'=>'string'], + 'PDFlib::set_text_pos' => ['bool', 'x'=>'float', 'y'=>'float'], + 'PDFlib::set_value' => ['bool', 'key'=>'string', 'value'=>'float'], + 'PDFlib::setcolor' => ['bool', 'fstype'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], + 'PDFlib::setdash' => ['bool', 'b'=>'float', 'w'=>'float'], + 'PDFlib::setdashpattern' => ['bool', 'optlist'=>'string'], + 'PDFlib::setflat' => ['bool', 'flatness'=>'float'], + 'PDFlib::setfont' => ['bool', 'font'=>'int', 'fontsize'=>'float'], + 'PDFlib::setgray' => ['bool', 'g'=>'float'], + 'PDFlib::setgray_fill' => ['bool', 'g'=>'float'], + 'PDFlib::setgray_stroke' => ['bool', 'g'=>'float'], + 'PDFlib::setlinecap' => ['bool', 'linecap'=>'int'], + 'PDFlib::setlinejoin' => ['bool', 'value'=>'int'], + 'PDFlib::setlinewidth' => ['bool', 'width'=>'float'], + 'PDFlib::setmatrix' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], + 'PDFlib::setmiterlimit' => ['bool', 'miter'=>'float'], + 'PDFlib::setrgbcolor' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'PDFlib::setrgbcolor_fill' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'PDFlib::setrgbcolor_stroke' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'PDFlib::shading' => ['int', 'shtype'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], + 'PDFlib::shading_pattern' => ['int', 'shading'=>'int', 'optlist'=>'string'], + 'PDFlib::shfill' => ['bool', 'shading'=>'int'], + 'PDFlib::show' => ['bool', 'text'=>'string'], + 'PDFlib::show_boxed' => ['int', 'text'=>'string', 'left'=>'float', 'top'=>'float', 'width'=>'float', 'height'=>'float', 'mode'=>'string', 'feature'=>'string'], + 'PDFlib::show_xy' => ['bool', 'text'=>'string', 'x'=>'float', 'y'=>'float'], + 'PDFlib::skew' => ['bool', 'alpha'=>'float', 'beta'=>'float'], + 'PDFlib::stringwidth' => ['float', 'text'=>'string', 'font'=>'int', 'fontsize'=>'float'], + 'PDFlib::stroke' => ['bool', 'p'=>''], + 'PDFlib::suspend_page' => ['bool', 'optlist'=>'string'], + 'PDFlib::translate' => ['bool', 'tx'=>'float', 'ty'=>'float'], + 'PDFlib::utf16_to_utf8' => ['string', 'utf16string'=>'string'], + 'PDFlib::utf32_to_utf16' => ['string', 'utf32string'=>'string', 'ordering'=>'string'], + 'PDFlib::utf8_to_utf16' => ['string', 'utf8string'=>'string', 'ordering'=>'string'], + 'PDO::__construct' => ['void', 'dsn'=>'string', 'username='=>'?string', 'passwd='=>'?string', 'options='=>'?array'], + 'PDO::__sleep' => ['list'], + 'PDO::__wakeup' => ['void'], + 'PDO::beginTransaction' => ['bool'], + 'PDO::commit' => ['bool'], + 'PDO::cubrid_schema' => ['array', 'schema_type'=>'int', 'table_name='=>'string', 'col_name='=>'string'], + 'PDO::errorCode' => ['?string'], + 'PDO::errorInfo' => ['array{0: ?string, 1: ?int, 2: ?string, 3?: mixed, 4?: mixed}'], + 'PDO::exec' => ['int|false', 'query'=>'string'], + 'PDO::getAttribute' => ['', 'attribute'=>'int'], + 'PDO::getAvailableDrivers' => ['array'], + 'PDO::inTransaction' => ['bool'], + 'PDO::lastInsertId' => ['string', 'name='=>'string|null'], + 'PDO::pgsqlCopyFromArray' => ['bool', 'table_name'=>'string', 'rows'=>'array', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], + 'PDO::pgsqlCopyFromFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], + 'PDO::pgsqlCopyToArray' => ['array', 'table_name'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], + 'PDO::pgsqlCopyToFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], + 'PDO::pgsqlGetNotify' => ['array{message:string,pid:int,payload?:string}|false', 'result_type='=>'PDO::FETCH_*', 'ms_timeout='=>'int'], + 'PDO::pgsqlGetPid' => ['int'], + 'PDO::pgsqlLOBCreate' => ['string'], + 'PDO::pgsqlLOBOpen' => ['resource', 'oid'=>'string', 'mode='=>'string'], + 'PDO::pgsqlLOBUnlink' => ['bool', 'oid'=>'string'], + 'PDO::prepare' => ['PDOStatement|false', 'statement'=>'string', 'options='=>'array'], + 'PDO::query' => ['PDOStatement|false', 'sql'=>'string'], + 'PDO::query\'1' => ['PDOStatement|false', 'sql'=>'string', 'fetch_column'=>'int', 'colno='=>'int'], + 'PDO::query\'2' => ['PDOStatement|false', 'sql'=>'string', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs'=>'array'], + 'PDO::query\'3' => ['PDOStatement|false', 'sql'=>'string', 'fetch_into'=>'int', 'object'=>'object'], + 'PDO::quote' => ['string|false', 'string'=>'string', 'paramtype='=>'int'], + 'PDO::rollBack' => ['bool'], + 'PDO::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>''], + 'PDO::sqliteCreateAggregate' => ['bool', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], + 'PDO::sqliteCreateCollation' => ['bool', 'name'=>'string', 'callback'=>'callable'], + 'PDO::sqliteCreateFunction' => ['bool', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], + 'PDOException::getCode' => ['int|string'], + 'PDOException::getFile' => ['string'], + 'PDOException::getLine' => ['int'], + 'PDOException::getMessage' => ['string'], + 'PDOException::getPrevious' => ['?Throwable'], + 'PDOException::getTrace' => ['list\',args?:array}>'], + 'PDOException::getTraceAsString' => ['string'], + 'PDOStatement::__sleep' => ['list'], + 'PDOStatement::__wakeup' => ['void'], + 'PDOStatement::bindColumn' => ['bool', 'column'=>'mixed', '&rw_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'], + 'PDOStatement::bindParam' => ['bool', 'paramno'=>'mixed', '&rw_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'], + 'PDOStatement::bindValue' => ['bool', 'paramno'=>'mixed', 'param'=>'mixed', 'type='=>'int'], + 'PDOStatement::closeCursor' => ['bool'], + 'PDOStatement::columnCount' => ['int'], + 'PDOStatement::debugDumpParams' => ['void'], + 'PDOStatement::errorCode' => ['string'], + 'PDOStatement::errorInfo' => ['array{0: ?string, 1: ?int, 2: ?string, 3?: mixed, 4?: mixed}'], + 'PDOStatement::execute' => ['bool', 'bound_input_params='=>'?array'], + '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_name='=>'string', 'ctor_args='=>'array'], + 'PDOStatement::getAttribute' => ['mixed', 'attribute'=>'int'], + 'PDOStatement::getColumnMeta' => ['array|false', 'column'=>'int'], + 'PDOStatement::nextRowset' => ['bool'], + 'PDOStatement::rowCount' => ['int'], + 'PDOStatement::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>'mixed'], + 'PDOStatement::setFetchMode' => ['bool', 'mode'=>'int'], + 'PDOStatement::setFetchMode\'1' => ['bool', 'fetch_column'=>'int', 'colno'=>'int'], + 'PDOStatement::setFetchMode\'2' => ['bool', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs'=>'array'], + 'PDOStatement::setFetchMode\'3' => ['bool', 'fetch_into'=>'int', 'object'=>'object'], + 'ParentIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'], + 'ParentIterator::accept' => ['bool'], + 'ParentIterator::getChildren' => ['ParentIterator'], + 'ParentIterator::hasChildren' => ['bool'], + 'ParentIterator::next' => ['void'], + 'ParentIterator::rewind' => ['void'], + 'ParentIterator::valid' => [''], + 'Parle\Lexer::advance' => ['void'], + 'Parle\Lexer::build' => ['void'], + 'Parle\Lexer::callout' => ['void', 'id'=>'int', 'callback'=>'callable'], + 'Parle\Lexer::consume' => ['void', 'data'=>'string'], + 'Parle\Lexer::dump' => ['void'], + 'Parle\Lexer::getToken' => ['Parle\Token'], + 'Parle\Lexer::insertMacro' => ['void', 'name'=>'string', 'regex'=>'string'], + 'Parle\Lexer::push' => ['void', 'regex'=>'string', 'id'=>'int'], + 'Parle\Lexer::reset' => ['void', 'pos'=>'int'], + 'Parle\Parser::advance' => ['void'], + 'Parle\Parser::build' => ['void'], + 'Parle\Parser::consume' => ['void', 'data'=>'string', 'lexer'=>'Parle\Lexer'], + 'Parle\Parser::dump' => ['void'], + 'Parle\Parser::errorInfo' => ['Parle\ErrorInfo'], + 'Parle\Parser::left' => ['void', 'token'=>'string'], + 'Parle\Parser::nonassoc' => ['void', 'token'=>'string'], + 'Parle\Parser::precedence' => ['void', 'token'=>'string'], + 'Parle\Parser::push' => ['int', 'name'=>'string', 'rule'=>'string'], + 'Parle\Parser::reset' => ['void', 'tokenId'=>'int'], + 'Parle\Parser::right' => ['void', 'token'=>'string'], + 'Parle\Parser::sigil' => ['string', 'idx'=>'array'], + 'Parle\Parser::token' => ['void', 'token'=>'string'], + 'Parle\Parser::tokenId' => ['int', 'token'=>'string'], + 'Parle\Parser::trace' => ['string'], + 'Parle\Parser::validate' => ['bool', 'data'=>'string', 'lexer'=>'Parle\Lexer'], + 'Parle\RLexer::advance' => ['void'], + 'Parle\RLexer::build' => ['void'], + 'Parle\RLexer::callout' => ['void', 'id'=>'int', 'callback'=>'callable'], + 'Parle\RLexer::consume' => ['void', 'data'=>'string'], + 'Parle\RLexer::dump' => ['void'], + 'Parle\RLexer::getToken' => ['Parle\Token'], + 'Parle\RLexer::push' => ['void', 'state'=>'string', 'regex'=>'string', 'newState'=>'string'], + 'Parle\RLexer::pushState' => ['int', 'state'=>'string'], + 'Parle\RLexer::reset' => ['void', 'pos'=>'int'], + 'Parle\RParser::advance' => ['void'], + 'Parle\RParser::build' => ['void'], + 'Parle\RParser::consume' => ['void', 'data'=>'string', 'lexer'=>'Parle\Lexer'], + 'Parle\RParser::dump' => ['void'], + 'Parle\RParser::errorInfo' => ['Parle\ErrorInfo'], + 'Parle\RParser::left' => ['void', 'token'=>'string'], + 'Parle\RParser::nonassoc' => ['void', 'token'=>'string'], + 'Parle\RParser::precedence' => ['void', 'token'=>'string'], + 'Parle\RParser::push' => ['int', 'name'=>'string', 'rule'=>'string'], + 'Parle\RParser::reset' => ['void', 'tokenId'=>'int'], + 'Parle\RParser::right' => ['void', 'token'=>'string'], + 'Parle\RParser::sigil' => ['string', 'idx'=>'array'], + 'Parle\RParser::token' => ['void', 'token'=>'string'], + 'Parle\RParser::tokenId' => ['int', 'token'=>'string'], + 'Parle\RParser::trace' => ['string'], + 'Parle\RParser::validate' => ['bool', 'data'=>'string', 'lexer'=>'Parle\Lexer'], + 'Parle\Stack::pop' => ['void'], + 'Parle\Stack::push' => ['void', 'item'=>'mixed'], + 'ParseError::__clone' => ['void'], + 'ParseError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?ParseError'], + 'ParseError::__toString' => ['string'], + 'ParseError::getCode' => ['int'], + 'ParseError::getFile' => ['string'], + 'ParseError::getLine' => ['int'], + 'ParseError::getMessage' => ['string'], + 'ParseError::getPrevious' => ['Throwable|ParseError|null'], + '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::apiVersion' => ['string'], + 'Phar::buildFromDirectory' => ['array', 'base_dir'=>'string', 'regex='=>'string'], + 'Phar::buildFromIterator' => ['array', 'iter'=>'Iterator', 'base_directory='=>'string'], + 'Phar::canCompress' => ['bool', 'method='=>'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::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::getAlias' => ['string'], + 'Phar::getMetadata' => ['mixed'], + 'Phar::getModified' => ['bool'], + 'Phar::getPath' => ['string'], + 'Phar::getSignature' => ['array{hash:string, hash_type:string}'], + 'Phar::getStub' => ['string'], + 'Phar::getSupportedCompression' => ['array'], + 'Phar::getSupportedSignatures' => ['array'], + 'Phar::getVersion' => ['string'], + 'Phar::hasMetadata' => ['bool'], + 'Phar::interceptFileFuncs' => ['void'], + 'Phar::isBuffering' => ['bool'], + 'Phar::isCompressed' => ['mixed|false'], + 'Phar::isFileFormat' => ['bool', 'format'=>'int'], + '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::setAlias' => ['bool', 'alias'=>'string'], + 'Phar::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], + 'Phar::setMetadata' => ['void', 'metadata'=>''], + 'Phar::setSignatureAlgorithm' => ['void', 'sigtype'=>'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'], + 'PharData::compress' => ['PharData', 'compression'=>'int', 'extension='=>'string'], + 'PharData::compressFiles' => ['bool', '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::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::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::setAlias' => ['bool', 'alias'=>'string'], + 'PharData::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], + 'PharData::setStub' => ['bool', 'stub'=>'string', 'length='=>'int'], + 'PharFileInfo::__construct' => ['void', 'entry'=>'string'], + 'PharFileInfo::chmod' => ['void', 'permissions'=>'int'], + 'PharFileInfo::compress' => ['bool', 'compression'=>'int'], + 'PharFileInfo::decompress' => ['bool'], + 'PharFileInfo::delMetadata' => ['bool'], + 'PharFileInfo::getCRC32' => ['int'], + 'PharFileInfo::getCompressedSize' => ['int'], + 'PharFileInfo::getContent' => ['string'], + 'PharFileInfo::getMetadata' => ['mixed'], + '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::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'], + 'Pool::shutdown' => ['void'], + 'Pool::submit' => ['int', 'task'=>'Threaded'], + 'Pool::submitTo' => ['int', 'worker'=>'int', 'task'=>'Threaded'], + 'Postal\Expand::expand_address' => ['string[]', 'address'=>'string', 'options='=>'array'], + 'Postal\Parser::parse_address' => ['array', 'address'=>'string', 'options='=>'array'], + 'QuickHashIntHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], + 'QuickHashIntHash::add' => ['bool', 'key'=>'int', 'value='=>'int'], + 'QuickHashIntHash::delete' => ['bool', 'key'=>'int'], + 'QuickHashIntHash::exists' => ['bool', 'key'=>'int'], + 'QuickHashIntHash::get' => ['int', 'key'=>'int'], + 'QuickHashIntHash::getSize' => ['int'], + 'QuickHashIntHash::loadFromFile' => ['QuickHashIntHash', 'filename'=>'string', 'options='=>'int'], + 'QuickHashIntHash::loadFromString' => ['QuickHashIntHash', 'contents'=>'string', 'options='=>'int'], + 'QuickHashIntHash::saveToFile' => ['void', 'filename'=>'string'], + 'QuickHashIntHash::saveToString' => ['string'], + 'QuickHashIntHash::set' => ['bool', 'key'=>'int', 'value'=>'int'], + 'QuickHashIntHash::update' => ['bool', 'key'=>'int', 'value'=>'int'], + 'QuickHashIntSet::__construct' => ['void', 'size'=>'int', 'options='=>'int'], + 'QuickHashIntSet::add' => ['bool', 'key'=>'int'], + 'QuickHashIntSet::delete' => ['bool', 'key'=>'int'], + 'QuickHashIntSet::exists' => ['bool', 'key'=>'int'], + 'QuickHashIntSet::getSize' => ['int'], + 'QuickHashIntSet::loadFromFile' => ['QuickHashIntSet', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], + 'QuickHashIntSet::loadFromString' => ['QuickHashIntSet', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], + 'QuickHashIntSet::saveToFile' => ['void', 'filename'=>'string'], + 'QuickHashIntSet::saveToString' => ['string'], + 'QuickHashIntStringHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], + 'QuickHashIntStringHash::add' => ['bool', 'key'=>'int', 'value'=>'string'], + 'QuickHashIntStringHash::delete' => ['bool', 'key'=>'int'], + 'QuickHashIntStringHash::exists' => ['bool', 'key'=>'int'], + 'QuickHashIntStringHash::get' => ['mixed', 'key'=>'int'], + 'QuickHashIntStringHash::getSize' => ['int'], + 'QuickHashIntStringHash::loadFromFile' => ['QuickHashIntStringHash', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], + 'QuickHashIntStringHash::loadFromString' => ['QuickHashIntStringHash', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], + 'QuickHashIntStringHash::saveToFile' => ['void', 'filename'=>'string'], + 'QuickHashIntStringHash::saveToString' => ['string'], + 'QuickHashIntStringHash::set' => ['int', 'key'=>'int', 'value'=>'string'], + 'QuickHashIntStringHash::update' => ['bool', 'key'=>'int', 'value'=>'string'], + 'QuickHashStringIntHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], + 'QuickHashStringIntHash::add' => ['bool', 'key'=>'string', 'value'=>'int'], + 'QuickHashStringIntHash::delete' => ['bool', 'key'=>'string'], + 'QuickHashStringIntHash::exists' => ['bool', 'key'=>'string'], + 'QuickHashStringIntHash::get' => ['mixed', 'key'=>'string'], + 'QuickHashStringIntHash::getSize' => ['int'], + 'QuickHashStringIntHash::loadFromFile' => ['QuickHashStringIntHash', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], + 'QuickHashStringIntHash::loadFromString' => ['QuickHashStringIntHash', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], + 'QuickHashStringIntHash::saveToFile' => ['void', 'filename'=>'string'], + 'QuickHashStringIntHash::saveToString' => ['string'], + 'QuickHashStringIntHash::set' => ['int', 'key'=>'string', 'value'=>'int'], + 'QuickHashStringIntHash::update' => ['bool', 'key'=>'string', 'value'=>'int'], + 'RRDCreator::__construct' => ['void', 'path'=>'string', 'starttime='=>'string', 'step='=>'int'], + 'RRDCreator::addArchive' => ['void', 'description'=>'string'], + 'RRDCreator::addDataSource' => ['void', 'description'=>'string'], + 'RRDCreator::save' => ['bool'], + 'RRDGraph::__construct' => ['void', 'path'=>'string'], + 'RRDGraph::save' => ['array|false'], + 'RRDGraph::saveVerbose' => ['array|false'], + 'RRDGraph::setOptions' => ['void', 'options'=>'array'], + 'RRDUpdater::__construct' => ['void', 'path'=>'string'], + 'RRDUpdater::update' => ['bool', 'values'=>'array', 'time='=>'string'], + 'RangeException::__clone' => ['void'], + 'RangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?RangeException'], + 'RangeException::__toString' => ['string'], + 'RangeException::getCode' => ['int'], + 'RangeException::getFile' => ['string'], + 'RangeException::getLine' => ['int'], + 'RangeException::getMessage' => ['string'], + 'RangeException::getPrevious' => ['Throwable|RangeException|null'], + 'RangeException::getTrace' => ['list\',args?:array}>'], + 'RangeException::getTraceAsString' => ['string'], + 'RarArchive::__toString' => ['string'], + 'RarArchive::close' => ['bool'], + 'RarArchive::getComment' => ['string|null'], + 'RarArchive::getEntries' => ['RarEntry[]|false'], + 'RarArchive::getEntry' => ['RarEntry|false', 'entryname'=>'string'], + 'RarArchive::isBroken' => ['bool'], + 'RarArchive::isSolid' => ['bool'], + 'RarArchive::open' => ['RarArchive|false', 'filename'=>'string', 'password='=>'string', 'volume_callback='=>'callable'], + 'RarArchive::setAllowBroken' => ['bool', 'allow_broken'=>'bool'], + 'RarEntry::__toString' => ['string'], + 'RarEntry::extract' => ['bool', 'dir'=>'string', 'filepath='=>'string', 'password='=>'string', 'extended_data='=>'bool'], + 'RarEntry::getAttr' => ['int|false'], + 'RarEntry::getCrc' => ['string|false'], + 'RarEntry::getFileTime' => ['string|false'], + 'RarEntry::getHostOs' => ['int|false'], + 'RarEntry::getMethod' => ['int|false'], + 'RarEntry::getName' => ['string|false'], + 'RarEntry::getPackedSize' => ['int|false'], + 'RarEntry::getStream' => ['resource|false', 'password='=>'string'], + 'RarEntry::getUnpackedSize' => ['int|false'], + 'RarEntry::getVersion' => ['int|false'], + 'RarEntry::isDirectory' => ['bool'], + 'RarEntry::isEncrypted' => ['bool'], + 'RarException::getCode' => ['int'], + 'RarException::getFile' => ['string'], + 'RarException::getLine' => ['int'], + 'RarException::getMessage' => ['string'], + 'RarException::getPrevious' => ['Exception|Throwable'], + 'RarException::getTrace' => ['list\',args?:array}>'], + 'RarException::getTraceAsString' => ['string'], + 'RarException::isUsingExceptions' => ['bool'], + 'RarException::setUsingExceptions' => ['RarEntry', 'using_exceptions'=>'bool'], + 'RdKafka::addBrokers' => ['int', 'broker_list'=>'string'], + 'RdKafka::flush' => ['int', 'timeout_ms'=>'int'], + 'RdKafka::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], + 'RdKafka::getOutQLen' => ['int'], + 'RdKafka::newQueue' => ['RdKafka\Queue'], + 'RdKafka::newTopic' => ['RdKafka\Topic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], + 'RdKafka::poll' => ['void', 'timeout_ms'=>'int'], + 'RdKafka::setLogLevel' => ['void', 'level'=>'int'], + 'RdKafka\Conf::dump' => ['array'], + 'RdKafka\Conf::set' => ['void', 'name'=>'string', 'value'=>'string'], + 'RdKafka\Conf::setDefaultTopicConf' => ['void', 'topic_conf'=>'RdKafka\TopicConf'], + 'RdKafka\Conf::setDrMsgCb' => ['void', 'callback'=>'callable'], + 'RdKafka\Conf::setErrorCb' => ['void', 'callback'=>'callable'], + 'RdKafka\Conf::setRebalanceCb' => ['void', 'callback'=>'callable'], + 'RdKafka\Conf::setStatsCb' => ['void', 'callback'=>'callable'], + 'RdKafka\Consumer::__construct' => ['void', 'conf='=>'?RdKafka\Conf'], + 'RdKafka\Consumer::addBrokers' => ['int', 'broker_list'=>'string'], + 'RdKafka\Consumer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], + 'RdKafka\Consumer::getOutQLen' => ['int'], + 'RdKafka\Consumer::newQueue' => ['RdKafka\Queue'], + 'RdKafka\Consumer::newTopic' => ['RdKafka\ConsumerTopic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], + 'RdKafka\Consumer::poll' => ['void', 'timeout_ms'=>'int'], + 'RdKafka\Consumer::setLogLevel' => ['void', 'level'=>'int'], + 'RdKafka\ConsumerTopic::__construct' => ['void'], + 'RdKafka\ConsumerTopic::consume' => ['RdKafka\Message', 'partition'=>'int', 'timeout_ms'=>'int'], + 'RdKafka\ConsumerTopic::consumeQueueStart' => ['void', 'partition'=>'int', 'offset'=>'int', 'queue'=>'RdKafka\Queue'], + 'RdKafka\ConsumerTopic::consumeStart' => ['void', 'partition'=>'int', 'offset'=>'int'], + 'RdKafka\ConsumerTopic::consumeStop' => ['void', 'partition'=>'int'], + 'RdKafka\ConsumerTopic::getName' => ['string'], + 'RdKafka\ConsumerTopic::offsetStore' => ['void', 'partition'=>'int', 'offset'=>'int'], + 'RdKafka\KafkaConsumer::__construct' => ['void', 'conf'=>'RdKafka\Conf'], + 'RdKafka\KafkaConsumer::assign' => ['void', 'topic_partitions='=>'RdKafka\TopicPartition[]|null'], + 'RdKafka\KafkaConsumer::commit' => ['void', 'message_or_offsets='=>'RdKafka\Message|RdKafka\TopicPartition[]|null'], + 'RdKafka\KafkaConsumer::commitAsync' => ['void', 'message_or_offsets='=>'RdKafka\Message|RdKafka\TopicPartition[]|null'], + 'RdKafka\KafkaConsumer::consume' => ['RdKafka\Message', 'timeout_ms'=>'int'], + 'RdKafka\KafkaConsumer::getAssignment' => ['RdKafka\TopicPartition[]'], + 'RdKafka\KafkaConsumer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\KafkaConsumerTopic', 'timeout_ms'=>'int'], + 'RdKafka\KafkaConsumer::getSubscription' => ['array'], + 'RdKafka\KafkaConsumer::subscribe' => ['void', 'topics'=>'array'], + 'RdKafka\KafkaConsumer::unsubscribe' => ['void'], + 'RdKafka\KafkaConsumerTopic::getName' => ['string'], + 'RdKafka\KafkaConsumerTopic::offsetStore' => ['void', 'partition'=>'int', 'offset'=>'int'], + 'RdKafka\Message::errstr' => ['string'], + 'RdKafka\Metadata::getBrokers' => ['RdKafka\Metadata\Collection'], + 'RdKafka\Metadata::getOrigBrokerId' => ['int'], + 'RdKafka\Metadata::getOrigBrokerName' => ['string'], + 'RdKafka\Metadata::getTopics' => ['RdKafka\Metadata\Collection|RdKafka\Metadata\Topic[]'], + 'RdKafka\Metadata\Collection::__construct' => ['void'], + 'RdKafka\Metadata\Collection::count' => ['int'], + 'RdKafka\Metadata\Collection::current' => ['mixed'], + 'RdKafka\Metadata\Collection::key' => ['mixed'], + 'RdKafka\Metadata\Collection::next' => ['void'], + 'RdKafka\Metadata\Collection::rewind' => ['void'], + 'RdKafka\Metadata\Collection::valid' => ['bool'], + 'RdKafka\Metadata\Partition::getErr' => ['mixed'], + 'RdKafka\Metadata\Partition::getId' => ['int'], + 'RdKafka\Metadata\Partition::getIsrs' => ['mixed'], + 'RdKafka\Metadata\Partition::getLeader' => ['mixed'], + 'RdKafka\Metadata\Partition::getReplicas' => ['mixed'], + 'RdKafka\Metadata\Topic::getErr' => ['mixed'], + 'RdKafka\Metadata\Topic::getPartitions' => ['RdKafka\Metadata\Partition[]'], + 'RdKafka\Metadata\Topic::getTopic' => ['string'], + 'RdKafka\Producer::__construct' => ['void', 'conf='=>'?RdKafka\Conf'], + 'RdKafka\Producer::addBrokers' => ['int', 'broker_list'=>'string'], + 'RdKafka\Producer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], + 'RdKafka\Producer::getOutQLen' => ['int'], + 'RdKafka\Producer::newQueue' => ['RdKafka\Queue'], + 'RdKafka\Producer::newTopic' => ['RdKafka\ProducerTopic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], + 'RdKafka\Producer::poll' => ['void', 'timeout_ms'=>'int'], + 'RdKafka\Producer::setLogLevel' => ['void', 'level'=>'int'], + 'RdKafka\ProducerTopic::__construct' => ['void'], + 'RdKafka\ProducerTopic::getName' => ['string'], + 'RdKafka\ProducerTopic::produce' => ['void', 'partition'=>'int', 'msgflags'=>'int', 'payload'=>'string', 'key='=>'?string'], + 'RdKafka\ProducerTopic::producev' => ['void', 'partition'=>'int', 'msgflags'=>'int', 'payload'=>'string', 'key='=>'?string', 'headers='=>'?array', 'timestamp_ms='=>'?int', 'opaque='=>'?string'], + 'RdKafka\Queue::__construct' => ['void'], + 'RdKafka\Queue::consume' => ['?RdKafka\Message', 'timeout_ms'=>'string'], + 'RdKafka\Topic::getName' => ['string'], + 'RdKafka\TopicConf::dump' => ['array'], + 'RdKafka\TopicConf::set' => ['void', 'name'=>'string', 'value'=>'string'], + 'RdKafka\TopicConf::setPartitioner' => ['void', 'partitioner'=>'int'], + 'RdKafka\TopicPartition::__construct' => ['void', 'topic'=>'string', 'partition'=>'int', 'offset='=>'int'], + 'RdKafka\TopicPartition::getOffset' => ['int'], + 'RdKafka\TopicPartition::getPartition' => ['int'], + 'RdKafka\TopicPartition::getTopic' => ['string'], + 'RdKafka\TopicPartition::setOffset' => ['void', 'offset'=>'string'], + 'RdKafka\TopicPartition::setPartition' => ['void', 'partition'=>'string'], + 'RdKafka\TopicPartition::setTopic' => ['void', 'topic_name'=>'string'], + 'RecursiveArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'], + 'RecursiveArrayIterator::append' => ['void', 'value'=>'mixed'], + 'RecursiveArrayIterator::asort' => ['void'], + 'RecursiveArrayIterator::count' => ['int'], + 'RecursiveArrayIterator::current' => ['mixed'], + 'RecursiveArrayIterator::getArrayCopy' => ['array'], + 'RecursiveArrayIterator::getChildren' => ['RecursiveArrayIterator'], + 'RecursiveArrayIterator::getFlags' => ['void'], + 'RecursiveArrayIterator::hasChildren' => ['bool'], + 'RecursiveArrayIterator::key' => ['false|int|string'], + 'RecursiveArrayIterator::ksort' => ['void'], + 'RecursiveArrayIterator::natcasesort' => ['void'], + 'RecursiveArrayIterator::natsort' => ['void'], + '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::rewind' => ['void'], + 'RecursiveArrayIterator::seek' => ['void', 'position'=>'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::valid' => ['bool'], + 'RecursiveCachingIterator::__construct' => ['void', 'it'=>'Iterator', 'flags='=>'int'], + 'RecursiveCachingIterator::__toString' => ['string'], + 'RecursiveCachingIterator::count' => ['int'], + 'RecursiveCachingIterator::current' => ['void'], + 'RecursiveCachingIterator::getCache' => ['array'], + 'RecursiveCachingIterator::getChildren' => ['RecursiveCachingIterator'], + 'RecursiveCachingIterator::getFlags' => ['int'], + 'RecursiveCachingIterator::getInnerIterator' => ['Iterator'], + 'RecursiveCachingIterator::hasChildren' => ['bool'], + '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::rewind' => ['void'], + 'RecursiveCachingIterator::setFlags' => ['void', 'flags'=>'int'], + 'RecursiveCachingIterator::valid' => ['bool'], + 'RecursiveCallbackFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'func'=>'callable'], + 'RecursiveCallbackFilterIterator::accept' => ['bool'], + 'RecursiveCallbackFilterIterator::current' => ['mixed'], + 'RecursiveCallbackFilterIterator::getChildren' => ['RecursiveCallbackFilterIterator'], + 'RecursiveCallbackFilterIterator::getInnerIterator' => ['Iterator'], + 'RecursiveCallbackFilterIterator::hasChildren' => ['bool'], + 'RecursiveCallbackFilterIterator::key' => ['bool|float|int|string'], + 'RecursiveCallbackFilterIterator::next' => ['void'], + 'RecursiveCallbackFilterIterator::rewind' => ['void'], + 'RecursiveCallbackFilterIterator::valid' => ['bool'], + 'RecursiveDirectoryIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], + 'RecursiveDirectoryIterator::__toString' => ['string'], + 'RecursiveDirectoryIterator::_bad_state_ex' => [''], + 'RecursiveDirectoryIterator::current' => ['string|SplFileInfo|FilesystemIterator'], + 'RecursiveDirectoryIterator::getATime' => ['int'], + 'RecursiveDirectoryIterator::getBasename' => ['string', 'suffix='=>'string'], + 'RecursiveDirectoryIterator::getCTime' => ['int'], + 'RecursiveDirectoryIterator::getChildren' => ['RecursiveDirectoryIterator'], + 'RecursiveDirectoryIterator::getExtension' => ['string'], + 'RecursiveDirectoryIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'RecursiveDirectoryIterator::getFilename' => ['string'], + 'RecursiveDirectoryIterator::getFlags' => ['int'], + 'RecursiveDirectoryIterator::getGroup' => ['int'], + 'RecursiveDirectoryIterator::getInode' => ['int'], + 'RecursiveDirectoryIterator::getLinkTarget' => ['string'], + 'RecursiveDirectoryIterator::getMTime' => ['int'], + 'RecursiveDirectoryIterator::getOwner' => ['int'], + 'RecursiveDirectoryIterator::getPath' => ['string'], + 'RecursiveDirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'RecursiveDirectoryIterator::getPathname' => ['string'], + 'RecursiveDirectoryIterator::getPerms' => ['int'], + 'RecursiveDirectoryIterator::getRealPath' => ['string'], + 'RecursiveDirectoryIterator::getSize' => ['int'], + 'RecursiveDirectoryIterator::getSubPath' => ['string'], + 'RecursiveDirectoryIterator::getSubPathname' => ['string'], + 'RecursiveDirectoryIterator::getType' => ['string'], + 'RecursiveDirectoryIterator::hasChildren' => ['bool', 'allow_links='=>'bool'], + 'RecursiveDirectoryIterator::isDir' => ['bool'], + 'RecursiveDirectoryIterator::isDot' => ['bool'], + 'RecursiveDirectoryIterator::isExecutable' => ['bool'], + 'RecursiveDirectoryIterator::isFile' => ['bool'], + 'RecursiveDirectoryIterator::isLink' => ['bool'], + 'RecursiveDirectoryIterator::isReadable' => ['bool'], + 'RecursiveDirectoryIterator::isWritable' => ['bool'], + 'RecursiveDirectoryIterator::key' => ['string'], + 'RecursiveDirectoryIterator::next' => ['void'], + 'RecursiveDirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'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::valid' => ['bool'], + 'RecursiveFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'], + 'RecursiveFilterIterator::accept' => ['bool'], + 'RecursiveFilterIterator::current' => ['mixed'], + 'RecursiveFilterIterator::getChildren' => ['RecursiveFilterIterator'], + 'RecursiveFilterIterator::getInnerIterator' => ['Iterator'], + 'RecursiveFilterIterator::hasChildren' => ['bool'], + 'RecursiveFilterIterator::key' => ['mixed'], + 'RecursiveFilterIterator::next' => ['void'], + 'RecursiveFilterIterator::rewind' => ['void'], + 'RecursiveFilterIterator::valid' => ['bool'], + 'RecursiveIterator::__construct' => ['void'], + 'RecursiveIterator::current' => ['mixed'], + 'RecursiveIterator::getChildren' => ['RecursiveIterator'], + 'RecursiveIterator::hasChildren' => ['bool'], + 'RecursiveIterator::key' => ['int|string'], + 'RecursiveIterator::next' => ['void'], + 'RecursiveIterator::rewind' => ['void'], + 'RecursiveIterator::valid' => ['bool'], + 'RecursiveIteratorIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'mode='=>'int', 'flags='=>'int'], + 'RecursiveIteratorIterator::beginChildren' => ['void'], + 'RecursiveIteratorIterator::beginIteration' => ['RecursiveIterator'], + 'RecursiveIteratorIterator::callGetChildren' => ['RecursiveIterator'], + 'RecursiveIteratorIterator::callHasChildren' => ['bool'], + 'RecursiveIteratorIterator::current' => ['mixed'], + 'RecursiveIteratorIterator::endChildren' => ['void'], + 'RecursiveIteratorIterator::endIteration' => ['RecursiveIterator'], + 'RecursiveIteratorIterator::getDepth' => ['int'], + 'RecursiveIteratorIterator::getInnerIterator' => ['RecursiveIterator'], + 'RecursiveIteratorIterator::getMaxDepth' => ['int|false'], + 'RecursiveIteratorIterator::getSubIterator' => ['RecursiveIterator', 'level='=>'int'], + 'RecursiveIteratorIterator::key' => ['mixed'], + 'RecursiveIteratorIterator::next' => ['void'], + 'RecursiveIteratorIterator::nextElement' => ['void'], + 'RecursiveIteratorIterator::rewind' => ['void'], + 'RecursiveIteratorIterator::setMaxDepth' => ['void', 'max_depth='=>'int'], + 'RecursiveIteratorIterator::valid' => ['bool'], + 'RecursiveRegexIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], + 'RecursiveRegexIterator::accept' => ['bool'], + 'RecursiveRegexIterator::current' => [''], + 'RecursiveRegexIterator::getChildren' => ['RecursiveRegexIterator'], + 'RecursiveRegexIterator::getFlags' => ['int'], + 'RecursiveRegexIterator::getInnerIterator' => ['Iterator'], + 'RecursiveRegexIterator::getMode' => ['int'], + 'RecursiveRegexIterator::getPregFlags' => ['int'], + 'RecursiveRegexIterator::getRegex' => ['string'], + 'RecursiveRegexIterator::hasChildren' => ['bool'], + 'RecursiveRegexIterator::key' => [''], + 'RecursiveRegexIterator::next' => [''], + 'RecursiveRegexIterator::rewind' => [''], + 'RecursiveRegexIterator::setFlags' => ['void', 'new_flags'=>'int'], + 'RecursiveRegexIterator::setMode' => ['void', 'new_mode'=>'int'], + 'RecursiveRegexIterator::setPregFlags' => ['void', 'new_flags'=>'int'], + 'RecursiveRegexIterator::valid' => [''], + 'RecursiveTreeIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'flags='=>'int', 'cit_flags='=>'int', 'mode'=>'int'], + 'RecursiveTreeIterator::beginChildren' => ['void'], + 'RecursiveTreeIterator::beginIteration' => ['RecursiveIterator'], + 'RecursiveTreeIterator::callGetChildren' => ['RecursiveIterator'], + 'RecursiveTreeIterator::callHasChildren' => ['bool'], + 'RecursiveTreeIterator::current' => ['string'], + 'RecursiveTreeIterator::endChildren' => ['void'], + 'RecursiveTreeIterator::endIteration' => ['void'], + 'RecursiveTreeIterator::getDepth' => ['int'], + 'RecursiveTreeIterator::getEntry' => ['string'], + 'RecursiveTreeIterator::getInnerIterator' => ['RecursiveIterator'], + 'RecursiveTreeIterator::getMaxDepth' => ['false|int'], + 'RecursiveTreeIterator::getPostfix' => ['string'], + 'RecursiveTreeIterator::getPrefix' => ['string'], + 'RecursiveTreeIterator::getSubIterator' => ['RecursiveIterator', 'level='=>'int'], + 'RecursiveTreeIterator::key' => ['string'], + '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::valid' => ['bool'], + 'Redis::__construct' => ['void'], + 'Redis::__destruct' => ['void'], + 'Redis::_prefix' => ['string', 'value'=>'mixed'], + 'Redis::_serialize' => ['mixed', 'value'=>'mixed'], + 'Redis::_unserialize' => ['mixed', 'value'=>'string'], + 'Redis::append' => ['int', 'key'=>'string', 'value'=>'string'], + 'Redis::auth' => ['bool', 'password'=>'string'], + 'Redis::bgRewriteAOF' => ['bool'], + 'Redis::bgSave' => ['bool'], + 'Redis::bitCount' => ['int', 'key'=>'string'], + 'Redis::bitOp' => ['int', 'operation'=>'string', 'ret_key'=>'string', 'key'=>'string', '...other_keys='=>'string'], + 'Redis::bitpos' => ['int', 'key'=>'string', 'bit'=>'int', 'start='=>'int', 'end='=>'int'], + 'Redis::blPop' => ['array', 'keys'=>'string[]', 'timeout'=>'int'], + 'Redis::blPop\'1' => ['array', 'key'=>'string', 'timeout_or_key'=>'int|string', '...extra_args'=>'int|string'], + 'Redis::brPop' => ['array', 'keys'=>'string[]', 'timeout'=>'int'], + 'Redis::brPop\'1' => ['array', 'key'=>'string', 'timeout_or_key'=>'int|string', '...extra_args'=>'int|string'], + 'Redis::brpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'], + 'Redis::clearLastError' => ['bool'], + 'Redis::client' => ['mixed', 'command'=>'string', 'arg='=>'string'], + 'Redis::close' => ['bool'], + 'Redis::command' => ['', '...args'=>''], + 'Redis::config' => ['string', 'operation'=>'string', 'key'=>'string', 'value='=>'string'], + 'Redis::connect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'reserved='=>'null', 'retry_interval='=>'?int', 'read_timeout='=>'float'], + 'Redis::dbSize' => ['int'], + 'Redis::debug' => ['', 'key'=>''], + 'Redis::decr' => ['int', 'key'=>'string'], + 'Redis::decrBy' => ['int', 'key'=>'string', 'value'=>'int'], + 'Redis::decrByFloat' => ['float', 'key'=>'string', 'value'=>'float'], + 'Redis::del' => ['int', 'key'=>'string', '...args'=>'string'], + 'Redis::del\'1' => ['int', 'key'=>'string[]'], + 'Redis::delete' => ['int', 'key'=>'string', '...args'=>'string'], + 'Redis::delete\'1' => ['int', 'key'=>'string[]'], + 'Redis::discard' => [''], + 'Redis::dump' => ['string|false', 'key'=>'string'], + 'Redis::echo' => ['string', 'message'=>'string'], + 'Redis::eval' => ['mixed', 'script'=>'', 'args='=>'', 'numKeys='=>''], + 'Redis::evalSha' => ['mixed', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], + 'Redis::evaluate' => ['mixed', 'script'=>'string', 'args='=>'array', 'numKeys='=>'int'], + 'Redis::evaluateSha' => ['', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], + 'Redis::exec' => ['array'], + 'Redis::exists' => ['int', 'keys'=>'string|string[]'], + 'Redis::exists\'1' => ['int', '...keys'=>'string'], + 'Redis::expire' => ['bool', 'key'=>'string', 'ttl'=>'int'], + 'Redis::expireAt' => ['bool', 'key'=>'string', 'expiry'=>'int'], + 'Redis::flushAll' => ['bool', 'async='=>'bool'], + 'Redis::flushDb' => ['bool', 'async='=>'bool'], + 'Redis::geoAdd' => ['int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'member'=>'string', '...other_triples='=>'string|int|float'], + 'Redis::geoDist' => ['float', 'key'=>'string', 'member1'=>'string', 'member2'=>'string', 'unit='=>'string'], + 'Redis::geoHash' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], + 'Redis::geoPos' => ['array', 'key'=>'string', 'member'=>'string', '...members='=>'string'], + 'Redis::geoRadius' => ['array|int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'unit'=>'float', 'options='=>'array'], + 'Redis::geoRadiusByMember' => ['array|int', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'units'=>'string', 'options='=>'array'], + 'Redis::get' => ['string|false', 'key'=>'string'], + 'Redis::getAuth' => ['string|false|null'], + 'Redis::getBit' => ['int', 'key'=>'string', 'offset'=>'int'], + 'Redis::getDBNum' => ['int|false'], + 'Redis::getHost' => ['string|false'], + 'Redis::getKeys' => ['array', 'pattern'=>'string'], + 'Redis::getLastError' => ['?string'], + 'Redis::getMode' => ['int'], + 'Redis::getMultiple' => ['array', 'keys'=>'string[]'], + 'Redis::getOption' => ['int', 'name'=>'int'], + 'Redis::getPersistentID' => ['string|false|null'], + 'Redis::getPort' => ['int|false'], + 'Redis::getRange' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], + 'Redis::getReadTimeout' => ['float|false'], + 'Redis::getSet' => ['string', 'key'=>'string', 'string'=>'string'], + 'Redis::getTimeout' => ['float|false'], + 'Redis::hDel' => ['int|false', 'key'=>'string', 'hashKey1'=>'string', '...otherHashKeys='=>'string'], + 'Redis::hExists' => ['bool', 'key'=>'string', 'hashKey'=>'string'], + 'Redis::hGet' => ['string|false', 'key'=>'string', 'hashKey'=>'string'], + 'Redis::hGetAll' => ['array', 'key'=>'string'], + 'Redis::hIncrBy' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'int'], + 'Redis::hIncrByFloat' => ['float', 'key'=>'string', 'field'=>'string', 'increment'=>'float'], + 'Redis::hKeys' => ['array', 'key'=>'string'], + 'Redis::hLen' => ['int|false', 'key'=>'string'], + 'Redis::hMGet' => ['array', 'key'=>'string', 'hashKeys'=>'array'], + 'Redis::hMSet' => ['bool', 'key'=>'string', 'hashKeys'=>'array'], + 'Redis::hScan' => ['array', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], + 'Redis::hSet' => ['int|false', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], + 'Redis::hSetNx' => ['bool', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], + 'Redis::hStrLen' => ['', 'key'=>'', 'member'=>''], + 'Redis::hVals' => ['array', 'key'=>'string'], + 'Redis::incr' => ['int', 'key'=>'string'], + 'Redis::incrBy' => ['int', 'key'=>'string', 'value'=>'int'], + 'Redis::incrByFloat' => ['float', 'key'=>'string', 'value'=>'float'], + 'Redis::info' => ['array', 'option='=>'string'], + 'Redis::isConnected' => ['bool'], + 'Redis::keys' => ['array', 'pattern'=>'string'], + 'Redis::lGet' => ['string', 'key'=>'string', 'index'=>'int'], + 'Redis::lGetRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], + 'Redis::lIndex' => ['string|false', 'key'=>'string', 'index'=>'int'], + 'Redis::lInsert' => ['int', 'key'=>'string', 'position'=>'int', 'pivot'=>'string', 'value'=>'string'], + 'Redis::lLen' => ['int|false', 'key'=>'string'], + 'Redis::lPop' => ['string|false', 'key'=>'string'], + 'Redis::lPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], + 'Redis::lPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], + 'Redis::lRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], + 'Redis::lRem' => ['int|false', 'key'=>'string', 'value'=>'string', 'count'=>'int'], + 'Redis::lRemove' => ['int', 'key'=>'string', 'value'=>'string', 'count'=>'int'], + 'Redis::lSet' => ['bool', 'key'=>'string', 'index'=>'int', 'value'=>'string'], + 'Redis::lSize' => ['int', 'key'=>'string'], + 'Redis::lTrim' => ['array|false', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], + 'Redis::lastSave' => ['int'], + 'Redis::listTrim' => ['', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], + 'Redis::mGet' => ['array', 'keys'=>'string[]'], + 'Redis::mSet' => ['bool', 'pairs'=>'array'], + 'Redis::mSetNx' => ['bool', 'pairs'=>'array'], + 'Redis::migrate' => ['bool', 'host'=>'string', 'port'=>'int', 'key'=>'string|string[]', 'db'=>'int', 'timeout'=>'int', 'copy='=>'bool', 'replace='=>'bool'], + 'Redis::move' => ['bool', 'key'=>'string', 'dbindex'=>'int'], + 'Redis::multi' => ['Redis', 'mode='=>'int'], + 'Redis::object' => ['string|long|false', 'info'=>'string', 'key'=>'string'], + 'Redis::open' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'reserved='=>'null', 'retry_interval='=>'?int', 'read_timeout='=>'float'], + 'Redis::pExpire' => ['bool', 'key'=>'string', 'ttl'=>'int'], + 'Redis::pconnect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'persistent_id='=>'string', 'retry_interval='=>'?int'], + 'Redis::persist' => ['bool', 'key'=>'string'], + 'Redis::pexpireAt' => ['bool', 'key'=>'string', 'expiry'=>'int'], + 'Redis::pfAdd' => ['bool', 'key'=>'string', 'elements'=>'array'], + 'Redis::pfCount' => ['int', 'key'=>'array|string'], + 'Redis::pfMerge' => ['bool', 'destkey'=>'string', 'sourcekeys'=>'array'], + 'Redis::ping' => ['string'], + 'Redis::pipeline' => ['Redis'], + 'Redis::popen' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'persistent_id='=>'string', 'retry_interval='=>'?int'], + 'Redis::psetex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], + 'Redis::psubscribe' => ['', 'patterns'=>'array', 'callback'=>'array|string'], + 'Redis::pttl' => ['int|false', 'key'=>'string'], + 'Redis::publish' => ['int', 'channel'=>'string', 'message'=>'string'], + 'Redis::pubsub' => ['array|int', 'keyword'=>'string', 'argument='=>'array|string'], + 'Redis::punsubscribe' => ['', 'pattern'=>'string', '...other_patterns='=>'string'], + 'Redis::rPop' => ['string|false', 'key'=>'string'], + 'Redis::rPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], + 'Redis::rPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], + 'Redis::randomKey' => ['string'], + 'Redis::rawCommand' => ['mixed', 'command'=>'string', '...arguments='=>'mixed'], + 'Redis::rename' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], + 'Redis::renameKey' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], + 'Redis::renameNx' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], + 'Redis::resetStat' => ['bool'], + 'Redis::restore' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], + 'Redis::role' => ['array', 'nodeParams'=>'string|array{0:string,1:int}'], + 'Redis::rpoplpush' => ['string', 'srcKey'=>'string', 'dstKey'=>'string'], + 'Redis::sAdd' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], + 'Redis::sAddArray' => ['bool', 'key'=>'string', 'values'=>'array'], + 'Redis::sCard' => ['int', 'key'=>'string'], + 'Redis::sContains' => ['', 'key'=>'string', 'value'=>'string'], + 'Redis::sDiff' => ['array', 'key1'=>'string', '...other_keys='=>'string'], + 'Redis::sDiffStore' => ['int|false', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], + 'Redis::sGetMembers' => ['', 'key'=>'string'], + 'Redis::sInter' => ['array|false', 'key'=>'string', '...other_keys='=>'string'], + 'Redis::sInterStore' => ['int|false', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], + 'Redis::sIsMember' => ['bool', 'key'=>'string', 'value'=>'string'], + 'Redis::sMembers' => ['array', 'key'=>'string'], + 'Redis::sMove' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string', 'member'=>'string'], + 'Redis::sPop' => ['string|false', 'key'=>'string'], + 'Redis::sRandMember' => ['array|string|false', 'key'=>'string', 'count='=>'int'], + 'Redis::sRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], + 'Redis::sRemove' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], + 'Redis::sScan' => ['array|bool', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], + 'Redis::sSize' => ['int', 'key'=>'string'], + 'Redis::sUnion' => ['array', 'key'=>'string', '...other_keys='=>'string'], + 'Redis::sUnionStore' => ['int', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], + 'Redis::save' => ['bool'], + 'Redis::scan' => ['array|false', '&rw_iterator'=>'?int', 'pattern='=>'?string', 'count='=>'?int'], + 'Redis::script' => ['mixed', 'command'=>'string', '...args='=>'mixed'], + 'Redis::select' => ['bool', 'dbindex'=>'int'], + 'Redis::sendEcho' => ['string', 'msg'=>'string'], + 'Redis::set' => ['bool', 'key'=>'string', 'value'=>'mixed', 'options='=>'array'], + 'Redis::set\'1' => ['bool', 'key'=>'string', 'value'=>'mixed', 'timeout='=>'int'], + 'Redis::setBit' => ['int', 'key'=>'string', 'offset'=>'int', 'value'=>'int'], + 'Redis::setEx' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], + 'Redis::setNx' => ['bool', 'key'=>'string', 'value'=>'string'], + 'Redis::setOption' => ['bool', 'name'=>'int', 'value'=>'mixed'], + 'Redis::setRange' => ['int', 'key'=>'string', 'offset'=>'int', 'end'=>'int'], + 'Redis::setTimeout' => ['', 'key'=>'string', 'ttl'=>'int'], + 'Redis::slave' => ['bool', 'host'=>'string', 'port'=>'int'], + 'Redis::slave\'1' => ['bool', 'host'=>'string', 'port'=>'int'], + 'Redis::slaveof' => ['bool', 'host='=>'string', 'port='=>'int'], + 'Redis::slowLog' => ['mixed', 'operation'=>'string', 'length='=>'int'], + 'Redis::sort' => ['array|int', 'key'=>'string', 'options='=>'array'], + 'Redis::sortAsc' => ['array', 'key'=>'string', 'pattern='=>'string', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], + 'Redis::sortAscAlpha' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], + 'Redis::sortDesc' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], + 'Redis::sortDescAlpha' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], + 'Redis::strLen' => ['int', 'key'=>'string'], + 'Redis::subscribe' => ['mixed|null', 'channels'=>'array', 'callback'=>'string|array'], + 'Redis::substr' => ['', 'key'=>'string', 'start'=>'int', 'end'=>'int'], + 'Redis::swapdb' => ['bool', 'srcdb'=>'int', 'dstdb'=>'int'], + 'Redis::time' => ['array'], + 'Redis::ttl' => ['int|false', 'key'=>'string'], + 'Redis::type' => ['int', 'key'=>'string'], + 'Redis::unlink' => ['int', 'key'=>'string', '...args'=>'string'], + 'Redis::unlink\'1' => ['int', 'key'=>'string[]'], + 'Redis::unsubscribe' => ['', 'channel'=>'string', '...other_channels='=>'string'], + 'Redis::unwatch' => [''], + 'Redis::wait' => ['int', 'numSlaves'=>'int', 'timeout'=>'int'], + 'Redis::watch' => ['void', 'key'=>'string', '...other_keys='=>'string'], + 'Redis::xack' => ['', 'str_key'=>'string', 'str_group'=>'string', 'arr_ids'=>'array'], + 'Redis::xadd' => ['', 'str_key'=>'string', 'str_id'=>'string', 'arr_fields'=>'array', 'i_maxlen='=>'', 'boo_approximate='=>''], + 'Redis::xclaim' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_consumer'=>'string', 'i_min_idle'=>'', 'arr_ids'=>'array', 'arr_opts='=>'array'], + 'Redis::xdel' => ['', 'str_key'=>'string', 'arr_ids'=>'array'], + 'Redis::xgroup' => ['', 'str_operation'=>'string', 'str_key='=>'string', 'str_arg1='=>'', 'str_arg2='=>'', 'str_arg3='=>''], + 'Redis::xinfo' => ['', 'str_cmd'=>'string', 'str_key='=>'string', 'str_group='=>'string'], + 'Redis::xlen' => ['', 'key'=>''], + 'Redis::xpending' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_start='=>'', 'str_end='=>'', 'i_count='=>'', 'str_consumer='=>'string'], + 'Redis::xrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], + 'Redis::xread' => ['', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], + 'Redis::xreadgroup' => ['', 'str_group'=>'string', 'str_consumer'=>'string', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], + 'Redis::xrevrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], + 'Redis::xtrim' => ['', 'str_key'=>'string', 'i_maxlen'=>'', 'boo_approximate='=>''], + 'Redis::zAdd' => ['int', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], + 'Redis::zAdd\'1' => ['int', 'options'=>'array', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], + 'Redis::zCard' => ['int', 'key'=>'string'], + 'Redis::zCount' => ['int', 'key'=>'string', 'start'=>'string', 'end'=>'string'], + 'Redis::zDelete' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], + 'Redis::zDeleteRangeByRank' => ['', 'key'=>'string', 'start'=>'int', 'end'=>'int'], + 'Redis::zDeleteRangeByScore' => ['', 'key'=>'string', 'start'=>'float', 'end'=>'float'], + 'Redis::zIncrBy' => ['float', 'key'=>'string', 'value'=>'float', 'member'=>'string'], + 'Redis::zInter' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], + 'Redis::zInterStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], + 'Redis::zLexCount' => ['int', 'key'=>'string', 'min'=>'string', 'max'=>'string'], + 'Redis::zRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscores='=>'bool'], + 'Redis::zRangeByLex' => ['array|false', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], + 'Redis::zRangeByScore' => ['array', 'key'=>'string', 'start'=>'int|string', 'end'=>'int|string', 'options='=>'array'], + 'Redis::zRank' => ['int', 'key'=>'string', 'member'=>'string'], + 'Redis::zRem' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], + 'Redis::zRemRangeByLex' => ['int', 'key'=>'string', 'min'=>'string', 'max'=>'string'], + 'Redis::zRemRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], + 'Redis::zRemRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], + 'Redis::zRemove' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], + 'Redis::zRemoveRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], + 'Redis::zRemoveRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], + 'Redis::zRevRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], + 'Redis::zRevRangeByLex' => ['array', 'key'=>'string', 'min'=>'string', 'max'=>'string', 'offset='=>'int', 'limit='=>'int'], + 'Redis::zRevRangeByScore' => ['array', 'key'=>'string', 'start'=>'string', 'end'=>'string', 'options='=>'array'], + 'Redis::zRevRank' => ['int', 'key'=>'string', 'member'=>'string'], + 'Redis::zReverseRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], + 'Redis::zScan' => ['array|bool', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], + 'Redis::zScore' => ['float|false', 'key'=>'string', 'member'=>'string'], + 'Redis::zSize' => ['', 'key'=>'string'], + 'Redis::zUnion' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], + 'Redis::zUnionStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], + 'RedisArray::__call' => ['mixed', 'function_name'=>'string', 'arguments'=>'array'], + 'RedisArray::__construct' => ['void', 'name='=>'string', 'hosts='=>'?array', 'opts='=>'?array'], + 'RedisArray::_continuum' => [''], + 'RedisArray::_distributor' => [''], + 'RedisArray::_function' => ['string'], + 'RedisArray::_hosts' => ['array'], + 'RedisArray::_instance' => ['', 'host'=>''], + 'RedisArray::_rehash' => ['', 'callable='=>'callable'], + 'RedisArray::_target' => ['string', 'key'=>'string'], + 'RedisArray::bgsave' => [''], + 'RedisArray::del' => ['bool', 'key'=>'string', '...args'=>'string'], + 'RedisArray::delete' => ['bool', 'key'=>'string', '...args'=>'string'], + 'RedisArray::delete\'1' => ['bool', 'key'=>'string[]'], + 'RedisArray::discard' => [''], + 'RedisArray::exec' => ['array'], + 'RedisArray::flushAll' => ['bool', 'async='=>'bool'], + 'RedisArray::flushDb' => ['bool', 'async='=>'bool'], + 'RedisArray::getMultiple' => ['', 'keys'=>''], + 'RedisArray::getOption' => ['', 'opt'=>''], + 'RedisArray::info' => ['array'], + 'RedisArray::keys' => ['array', 'pattern'=>''], + 'RedisArray::mGet' => ['array', 'keys'=>'string[]'], + 'RedisArray::mSet' => ['bool', 'pairs'=>'array'], + 'RedisArray::multi' => ['RedisArray', 'host'=>'string', 'mode='=>'int'], + 'RedisArray::ping' => ['string'], + 'RedisArray::save' => ['bool'], + 'RedisArray::select' => ['', 'index'=>''], + 'RedisArray::setOption' => ['', 'opt'=>'', 'value'=>''], + 'RedisArray::unlink' => ['int', 'key'=>'string', '...other_keys='=>'string'], + 'RedisArray::unlink\'1' => ['int', 'key'=>'string[]'], + 'RedisArray::unwatch' => [''], + 'RedisCluster::__construct' => ['void', 'name'=>'?string', 'seeds='=>'string[]', 'timeout='=>'float', 'readTimeout='=>'float', 'persistent='=>'bool', 'auth='=>'?string'], + 'RedisCluster::_masters' => ['array'], + 'RedisCluster::_prefix' => ['string', 'value'=>'mixed'], + 'RedisCluster::_redir' => [''], + 'RedisCluster::_serialize' => ['mixed', 'value'=>'mixed'], + 'RedisCluster::_unserialize' => ['mixed', 'value'=>'string'], + 'RedisCluster::append' => ['int', 'key'=>'string', 'value'=>'string'], + 'RedisCluster::bgrewriteaof' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], + 'RedisCluster::bgsave' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], + 'RedisCluster::bitCount' => ['int', 'key'=>'string'], + 'RedisCluster::bitOp' => ['int', 'operation'=>'string', 'retKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], + 'RedisCluster::bitpos' => ['int', 'key'=>'string', 'bit'=>'int', 'start='=>'int', 'end='=>'int'], + 'RedisCluster::blPop' => ['array', 'keys'=>'array', 'timeout'=>'int'], + 'RedisCluster::brPop' => ['array', 'keys'=>'array', 'timeout'=>'int'], + 'RedisCluster::brpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'], + 'RedisCluster::clearLastError' => ['bool'], + 'RedisCluster::client' => ['', 'nodeParams'=>'string|array{0:string,1:int}', 'subCmd='=>'string', '...args='=>''], + 'RedisCluster::close' => [''], + 'RedisCluster::cluster' => ['mixed', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'arguments='=>'mixed'], + 'RedisCluster::command' => ['array|bool'], + 'RedisCluster::config' => ['array|bool', 'nodeParams'=>'string|array{0:string,1:int}', 'operation'=>'string', 'key'=>'string', 'value='=>'string'], + 'RedisCluster::dbSize' => ['int', 'nodeParams'=>'string|array{0:string,1:int}'], + 'RedisCluster::decr' => ['int', 'key'=>'string'], + 'RedisCluster::decrBy' => ['int', 'key'=>'string', 'value'=>'int'], + 'RedisCluster::del' => ['int', 'key'=>'string', '...other_keys='=>'string'], + 'RedisCluster::del\'1' => ['int', 'key'=>'string[]'], + 'RedisCluster::discard' => [''], + 'RedisCluster::dump' => ['string|false', 'key'=>'string'], + 'RedisCluster::echo' => ['string', 'nodeParams'=>'string|array{0:string,1:int}', 'msg'=>'string'], + 'RedisCluster::eval' => ['mixed', 'script'=>'', 'args='=>'', 'numKeys='=>''], + 'RedisCluster::evalSha' => ['mixed', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], + 'RedisCluster::exec' => ['array|void'], + 'RedisCluster::exists' => ['bool', 'key'=>'string'], + 'RedisCluster::expire' => ['bool', 'key'=>'string', 'ttl'=>'int'], + 'RedisCluster::expireAt' => ['bool', 'key'=>'string', 'timestamp'=>'int'], + 'RedisCluster::flushAll' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}', 'async='=>'bool'], + 'RedisCluster::flushDB' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}', 'async='=>'bool'], + 'RedisCluster::geoAdd' => ['int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'member'=>'string', '...other_members='=>'float|string'], + 'RedisCluster::geoDist' => ['', 'key'=>'string', 'member1'=>'string', 'member2'=>'string', 'unit='=>'string'], + 'RedisCluster::geoRadius' => ['', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'radiusUnit'=>'string', 'options='=>'array'], + 'RedisCluster::geoRadiusByMember' => ['string[]', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'radiusUnit'=>'string', 'options='=>'array'], + 'RedisCluster::geohash' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], + 'RedisCluster::geopos' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], + 'RedisCluster::get' => ['string|false', 'key'=>'string'], + 'RedisCluster::getBit' => ['int', 'key'=>'string', 'offset'=>'int'], + 'RedisCluster::getLastError' => ['?string'], + 'RedisCluster::getMode' => ['int'], + 'RedisCluster::getOption' => ['int', 'option'=>'int'], + 'RedisCluster::getRange' => ['string', 'key'=>'string', 'start'=>'int', 'end'=>'int'], + 'RedisCluster::getSet' => ['string', 'key'=>'string', 'value'=>'string'], + 'RedisCluster::hDel' => ['int|false', 'key'=>'string', 'hashKey'=>'string', '...other_hashKeys='=>'string[]'], + 'RedisCluster::hExists' => ['bool', 'key'=>'string', 'hashKey'=>'string'], + 'RedisCluster::hGet' => ['string|false', 'key'=>'string', 'hashKey'=>'string'], + 'RedisCluster::hGetAll' => ['array', 'key'=>'string'], + 'RedisCluster::hIncrBy' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'int'], + 'RedisCluster::hIncrByFloat' => ['float', 'key'=>'string', 'field'=>'string', 'increment'=>'float'], + 'RedisCluster::hKeys' => ['array', 'key'=>'string'], + 'RedisCluster::hLen' => ['int|false', 'key'=>'string'], + 'RedisCluster::hMGet' => ['array', 'key'=>'string', 'hashKeys'=>'array'], + 'RedisCluster::hMSet' => ['bool', 'key'=>'string', 'hashKeys'=>'array'], + 'RedisCluster::hScan' => ['array', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], + 'RedisCluster::hSet' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], + 'RedisCluster::hSetNx' => ['bool', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], + 'RedisCluster::hStrlen' => ['int', 'key'=>'string', 'member'=>'string'], + 'RedisCluster::hVals' => ['array', 'key'=>'string'], + 'RedisCluster::incr' => ['int', 'key'=>'string'], + 'RedisCluster::incrBy' => ['int', 'key'=>'string', 'value'=>'int'], + 'RedisCluster::incrByFloat' => ['float', 'key'=>'string', 'increment'=>'float'], + 'RedisCluster::info' => ['array', 'nodeParams'=>'string|array{0:string,1:int}', 'option='=>'string'], + 'RedisCluster::keys' => ['array', 'pattern'=>'string'], + 'RedisCluster::lGet' => ['', 'key'=>'string', 'index'=>'int'], + 'RedisCluster::lIndex' => ['string|false', 'key'=>'string', 'index'=>'int'], + 'RedisCluster::lInsert' => ['int', 'key'=>'string', 'position'=>'int', 'pivot'=>'string', 'value'=>'string'], + 'RedisCluster::lLen' => ['int', 'key'=>'string'], + 'RedisCluster::lPop' => ['string|false', 'key'=>'string'], + 'RedisCluster::lPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], + 'RedisCluster::lPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], + 'RedisCluster::lRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], + 'RedisCluster::lRem' => ['int|false', 'key'=>'string', 'value'=>'string', 'count'=>'int'], + 'RedisCluster::lSet' => ['bool', 'key'=>'string', 'index'=>'int', 'value'=>'string'], + 'RedisCluster::lTrim' => ['array|false', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], + 'RedisCluster::lastSave' => ['int', 'nodeParams'=>'string|array{0:string,1:int}'], + 'RedisCluster::mget' => ['array', 'array'=>'array'], + 'RedisCluster::mset' => ['bool', 'array'=>'array'], + 'RedisCluster::msetnx' => ['int', 'array'=>'array'], + 'RedisCluster::multi' => ['Redis', 'mode='=>'int'], + 'RedisCluster::object' => ['string|int|false', 'string'=>'string', 'key'=>'string'], + 'RedisCluster::pExpire' => ['bool', 'key'=>'string', 'ttl'=>'int'], + 'RedisCluster::pExpireAt' => ['bool', 'key'=>'string', 'timestamp'=>'int'], + 'RedisCluster::persist' => ['bool', 'key'=>'string'], + 'RedisCluster::pfAdd' => ['bool', 'key'=>'string', 'elements'=>'array'], + 'RedisCluster::pfCount' => ['int', 'key'=>'string'], + 'RedisCluster::pfMerge' => ['bool', 'destKey'=>'string', 'sourceKeys'=>'array'], + 'RedisCluster::ping' => ['string', 'nodeParams'=>'string|array{0:string,1:int}'], + 'RedisCluster::psetex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], + 'RedisCluster::psubscribe' => ['mixed', 'patterns'=>'array', 'callback'=>'string'], + 'RedisCluster::pttl' => ['int', 'key'=>'string'], + 'RedisCluster::publish' => ['int', 'channel'=>'string', 'message'=>'string'], + 'RedisCluster::pubsub' => ['array', 'nodeParams'=>'string', 'keyword'=>'string', '...argument='=>'string'], + 'RedisCluster::punSubscribe' => ['', 'channels'=>'', 'callback'=>''], + 'RedisCluster::rPop' => ['string|false', 'key'=>'string'], + 'RedisCluster::rPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], + 'RedisCluster::rPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], + 'RedisCluster::randomKey' => ['string', 'nodeParams'=>'string|array{0:string,1:int}'], + 'RedisCluster::rawCommand' => ['mixed', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'arguments='=>'mixed'], + 'RedisCluster::rename' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string'], + 'RedisCluster::renameNx' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string'], + 'RedisCluster::restore' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], + 'RedisCluster::role' => ['array'], + 'RedisCluster::rpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string'], + 'RedisCluster::sAdd' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], + 'RedisCluster::sAddArray' => ['int|false', 'key'=>'string', 'valueArray'=>'array'], + 'RedisCluster::sCard' => ['int', 'key'=>'string'], + 'RedisCluster::sDiff' => ['list', 'key1'=>'string', 'key2'=>'string', '...other_keys='=>'string'], + 'RedisCluster::sDiffStore' => ['int', 'dstKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], + 'RedisCluster::sInter' => ['list', 'key'=>'string', '...other_keys='=>'string'], + 'RedisCluster::sInterStore' => ['int', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], + 'RedisCluster::sIsMember' => ['bool', 'key'=>'string', 'value'=>'string'], + 'RedisCluster::sMembers' => ['list', 'key'=>'string'], + 'RedisCluster::sMove' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string', 'member'=>'string'], + 'RedisCluster::sPop' => ['string', 'key'=>'string'], + 'RedisCluster::sRandMember' => ['array|string', 'key'=>'string', 'count='=>'int'], + 'RedisCluster::sRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], + 'RedisCluster::sScan' => ['array|false', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'null', 'count='=>'int'], + 'RedisCluster::sUnion' => ['list', 'key1'=>'string', '...other_keys='=>'string'], + 'RedisCluster::sUnion\'1' => ['list', 'keys'=>'string[]'], + 'RedisCluster::sUnionStore' => ['int', 'dstKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], + 'RedisCluster::save' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], + 'RedisCluster::scan' => ['array|false', '&iterator'=>'int', 'nodeParams'=>'string|array{0:string,1:int}', 'pattern='=>'string', 'count='=>'int'], + 'RedisCluster::script' => ['string|bool|array', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'script='=>'string', '...other_scripts='=>'string[]'], + 'RedisCluster::set' => ['bool', 'key'=>'string', 'value'=>'string', 'timeout='=>'array|int'], + 'RedisCluster::setBit' => ['int', 'key'=>'string', 'offset'=>'int', 'value'=>'bool|int'], + 'RedisCluster::setOption' => ['bool', 'option'=>'int', 'value'=>'string|int'], + 'RedisCluster::setRange' => ['string', 'key'=>'string', 'offset'=>'int', 'value'=>'string'], + 'RedisCluster::setex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], + 'RedisCluster::setnx' => ['bool', 'key'=>'string', 'value'=>'string'], + 'RedisCluster::slowLog' => ['array|int|bool', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'length='=>'int'], + 'RedisCluster::sort' => ['array', 'key'=>'string', 'option='=>'array'], + 'RedisCluster::strlen' => ['int', 'key'=>'string'], + 'RedisCluster::subscribe' => ['mixed', 'channels'=>'array', 'callback'=>'string'], + 'RedisCluster::time' => ['array'], + 'RedisCluster::ttl' => ['int', 'key'=>'string'], + 'RedisCluster::type' => ['int', 'key'=>'string'], + 'RedisCluster::unSubscribe' => ['', 'channels'=>'', '...other_channels='=>''], + 'RedisCluster::unlink' => ['int', 'key'=>'string', '...other_keys='=>'string'], + 'RedisCluster::unwatch' => [''], + 'RedisCluster::watch' => ['void', 'key'=>'string', '...other_keys='=>'string'], + 'RedisCluster::xack' => ['', 'str_key'=>'string', 'str_group'=>'string', 'arr_ids'=>'array'], + 'RedisCluster::xadd' => ['', 'str_key'=>'string', 'str_id'=>'string', 'arr_fields'=>'array', 'i_maxlen='=>'', 'boo_approximate='=>''], + 'RedisCluster::xclaim' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_consumer'=>'string', 'i_min_idle'=>'', 'arr_ids'=>'array', 'arr_opts='=>'array'], + 'RedisCluster::xdel' => ['', 'str_key'=>'string', 'arr_ids'=>'array'], + 'RedisCluster::xgroup' => ['', 'str_operation'=>'string', 'str_key='=>'string', 'str_arg1='=>'', 'str_arg2='=>'', 'str_arg3='=>''], + 'RedisCluster::xinfo' => ['', 'str_cmd'=>'string', 'str_key='=>'string', 'str_group='=>'string'], + 'RedisCluster::xlen' => ['', 'key'=>''], + 'RedisCluster::xpending' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_start='=>'', 'str_end='=>'', 'i_count='=>'', 'str_consumer='=>'string'], + 'RedisCluster::xrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], + 'RedisCluster::xread' => ['', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], + 'RedisCluster::xreadgroup' => ['', 'str_group'=>'string', 'str_consumer'=>'string', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], + 'RedisCluster::xrevrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], + 'RedisCluster::xtrim' => ['', 'str_key'=>'string', 'i_maxlen'=>'', 'boo_approximate='=>''], + 'RedisCluster::zAdd' => ['int', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], + 'RedisCluster::zCard' => ['int', 'key'=>'string'], + 'RedisCluster::zCount' => ['int', 'key'=>'string', 'start'=>'string', 'end'=>'string'], + 'RedisCluster::zIncrBy' => ['float', 'key'=>'string', 'value'=>'float', 'member'=>'string'], + 'RedisCluster::zInterStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], + 'RedisCluster::zLexCount' => ['int', 'key'=>'string', 'min'=>'int', 'max'=>'int'], + 'RedisCluster::zRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscores='=>'bool'], + 'RedisCluster::zRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], + 'RedisCluster::zRangeByScore' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'options='=>'array'], + 'RedisCluster::zRank' => ['int', 'key'=>'string', 'member'=>'string'], + 'RedisCluster::zRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], + 'RedisCluster::zRemRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int'], + 'RedisCluster::zRemRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], + 'RedisCluster::zRemRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], + 'RedisCluster::zRevRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], + 'RedisCluster::zRevRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], + 'RedisCluster::zRevRangeByScore' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'options='=>'array'], + 'RedisCluster::zRevRank' => ['int', 'key'=>'string', 'member'=>'string'], + 'RedisCluster::zScan' => ['array|false', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], + 'RedisCluster::zScore' => ['float', 'key'=>'string', 'member'=>'string'], + 'RedisCluster::zUnionStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], + 'Reflection::export' => ['?string', 'r'=>'reflector', 'return='=>'bool'], + 'Reflection::getModifierNames' => ['array', 'modifiers'=>'int'], + 'ReflectionClass::__clone' => ['void'], + 'ReflectionClass::__construct' => ['void', 'argument'=>'object|class-string'], + 'ReflectionClass::__toString' => ['string'], + 'ReflectionClass::export' => ['?string', 'argument'=>'string|object', 'return='=>'bool'], + 'ReflectionClass::getConstant' => ['mixed', 'name'=>'string'], + 'ReflectionClass::getConstants' => ['array'], + 'ReflectionClass::getConstructor' => ['?ReflectionMethod'], + 'ReflectionClass::getDefaultProperties' => ['array'], + 'ReflectionClass::getDocComment' => ['string|false'], + 'ReflectionClass::getEndLine' => ['int|false'], + 'ReflectionClass::getExtension' => ['?ReflectionExtension'], + 'ReflectionClass::getExtensionName' => ['string|false'], + 'ReflectionClass::getFileName' => ['string|false'], + 'ReflectionClass::getInterfaceNames' => ['list'], + 'ReflectionClass::getInterfaces' => ['array'], + 'ReflectionClass::getMethod' => ['ReflectionMethod', 'name'=>'string'], + 'ReflectionClass::getMethods' => ['list', 'filter='=>'int'], + 'ReflectionClass::getModifiers' => ['int'], + 'ReflectionClass::getName' => ['class-string'], + 'ReflectionClass::getNamespaceName' => ['string'], + 'ReflectionClass::getParentClass' => ['ReflectionClass|false'], + 'ReflectionClass::getProperties' => ['list', 'filter='=>'int'], + 'ReflectionClass::getProperty' => ['ReflectionProperty', 'name'=>'string'], + 'ReflectionClass::getReflectionConstant' => ['ReflectionClassConstant|false', 'name'=>'string'], + 'ReflectionClass::getReflectionConstants' => ['list'], + 'ReflectionClass::getShortName' => ['string'], + 'ReflectionClass::getStartLine' => ['int|false'], + 'ReflectionClass::getStaticProperties' => ['array'], + 'ReflectionClass::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'], + 'ReflectionClass::getTraitAliases' => ['array|null'], + 'ReflectionClass::getTraitNames' => ['list|null'], + 'ReflectionClass::getTraits' => ['array'], + 'ReflectionClass::hasConstant' => ['bool', 'name'=>'string'], + 'ReflectionClass::hasMethod' => ['bool', 'name'=>'string'], + 'ReflectionClass::hasProperty' => ['bool', 'name'=>'string'], + 'ReflectionClass::implementsInterface' => ['bool', 'interface_name'=>'interface-string|ReflectionClass'], + 'ReflectionClass::inNamespace' => ['bool'], + 'ReflectionClass::isAbstract' => ['bool'], + 'ReflectionClass::isAnonymous' => ['bool'], + 'ReflectionClass::isCloneable' => ['bool'], + 'ReflectionClass::isFinal' => ['bool'], + 'ReflectionClass::isInstance' => ['bool', 'object'=>'object'], + 'ReflectionClass::isInstantiable' => ['bool'], + 'ReflectionClass::isInterface' => ['bool'], + 'ReflectionClass::isInternal' => ['bool'], + 'ReflectionClass::isIterateable' => ['bool'], + 'ReflectionClass::isSubclassOf' => ['bool', 'class'=>'class-string|ReflectionClass'], + 'ReflectionClass::isTrait' => ['bool'], + 'ReflectionClass::isUserDefined' => ['bool'], + 'ReflectionClass::newInstance' => ['object', '...args='=>'mixed'], + 'ReflectionClass::newInstanceArgs' => ['object', 'args='=>'list'], + 'ReflectionClass::newInstanceWithoutConstructor' => ['object'], + 'ReflectionClass::setStaticPropertyValue' => ['void', 'name'=>'string', 'value'=>'mixed'], + 'ReflectionClassConstant::__construct' => ['void', 'class'=>'mixed', 'name'=>'string'], + 'ReflectionClassConstant::__toString' => ['string'], + 'ReflectionClassConstant::export' => ['string', 'class'=>'mixed', 'name'=>'string', 'return='=>'bool'], + 'ReflectionClassConstant::getDeclaringClass' => ['ReflectionClass'], + 'ReflectionClassConstant::getDocComment' => ['string|false'], + 'ReflectionClassConstant::getModifiers' => ['int'], + 'ReflectionClassConstant::getName' => ['string'], + 'ReflectionClassConstant::getValue' => ['scalar|array|null'], + 'ReflectionClassConstant::isPrivate' => ['bool'], + 'ReflectionClassConstant::isProtected' => ['bool'], + 'ReflectionClassConstant::isPublic' => ['bool'], + 'ReflectionExtension::__clone' => ['void'], + 'ReflectionExtension::__construct' => ['void', 'name'=>'string'], + 'ReflectionExtension::__toString' => ['string'], + 'ReflectionExtension::export' => ['?string', 'name'=>'string', 'return='=>'bool'], + 'ReflectionExtension::getClassNames' => ['list'], + 'ReflectionExtension::getClasses' => ['array'], + 'ReflectionExtension::getConstants' => ['array'], + 'ReflectionExtension::getDependencies' => ['array'], + 'ReflectionExtension::getFunctions' => ['array'], + 'ReflectionExtension::getINIEntries' => ['array'], + 'ReflectionExtension::getName' => ['string'], + 'ReflectionExtension::getVersion' => ['string'], + 'ReflectionExtension::info' => ['void'], + 'ReflectionExtension::isPersistent' => ['bool'], + 'ReflectionExtension::isTemporary' => ['bool'], + 'ReflectionFunction::__construct' => ['void', 'name'=>'callable-string|Closure'], + 'ReflectionFunction::__toString' => ['string'], + 'ReflectionFunction::export' => ['?string', 'name'=>'string', 'return='=>'bool'], + 'ReflectionFunction::getClosure' => ['?Closure'], + 'ReflectionFunction::getClosureScopeClass' => ['ReflectionClass'], + 'ReflectionFunction::getClosureThis' => ['bool'], + 'ReflectionFunction::getDocComment' => ['string|false'], + 'ReflectionFunction::getEndLine' => ['int|false'], + 'ReflectionFunction::getExtension' => ['?ReflectionExtension'], + 'ReflectionFunction::getExtensionName' => ['string|false'], + 'ReflectionFunction::getFileName' => ['string|false'], + 'ReflectionFunction::getName' => ['callable-string'], + 'ReflectionFunction::getNamespaceName' => ['string'], + 'ReflectionFunction::getNumberOfParameters' => ['int'], + 'ReflectionFunction::getNumberOfRequiredParameters' => ['int'], + 'ReflectionFunction::getParameters' => ['list'], + 'ReflectionFunction::getReturnType' => ['?ReflectionType'], + 'ReflectionFunction::getShortName' => ['string'], + 'ReflectionFunction::getStartLine' => ['int|false'], + 'ReflectionFunction::getStaticVariables' => ['array'], + 'ReflectionFunction::hasReturnType' => ['bool'], + 'ReflectionFunction::inNamespace' => ['bool'], + 'ReflectionFunction::invoke' => ['mixed', '...args='=>'mixed'], + 'ReflectionFunction::invokeArgs' => ['mixed', 'args'=>'array'], + 'ReflectionFunction::isClosure' => ['bool'], + 'ReflectionFunction::isDeprecated' => ['bool'], + 'ReflectionFunction::isDisabled' => ['bool'], + 'ReflectionFunction::isGenerator' => ['bool'], + 'ReflectionFunction::isInternal' => ['bool'], + 'ReflectionFunction::isUserDefined' => ['bool'], + 'ReflectionFunction::isVariadic' => ['bool'], + 'ReflectionFunction::returnsReference' => ['bool'], + 'ReflectionFunctionAbstract::__clone' => ['void'], + 'ReflectionFunctionAbstract::__toString' => ['string'], + 'ReflectionFunctionAbstract::export' => ['?string'], + 'ReflectionFunctionAbstract::getClosureScopeClass' => ['ReflectionClass|null'], + 'ReflectionFunctionAbstract::getClosureThis' => ['object|null'], + 'ReflectionFunctionAbstract::getDocComment' => ['string|false'], + 'ReflectionFunctionAbstract::getEndLine' => ['int|false'], + 'ReflectionFunctionAbstract::getExtension' => ['ReflectionExtension'], + 'ReflectionFunctionAbstract::getExtensionName' => ['string'], + 'ReflectionFunctionAbstract::getFileName' => ['string|false'], + 'ReflectionFunctionAbstract::getName' => ['string'], + 'ReflectionFunctionAbstract::getNamespaceName' => ['string'], + 'ReflectionFunctionAbstract::getNumberOfParameters' => ['int'], + 'ReflectionFunctionAbstract::getNumberOfRequiredParameters' => ['int'], + 'ReflectionFunctionAbstract::getParameters' => ['list'], + 'ReflectionFunctionAbstract::getReturnType' => ['?ReflectionType'], + 'ReflectionFunctionAbstract::getShortName' => ['string'], + 'ReflectionFunctionAbstract::getStartLine' => ['int|false'], + 'ReflectionFunctionAbstract::getStaticVariables' => ['array'], + 'ReflectionFunctionAbstract::hasReturnType' => ['bool'], + 'ReflectionFunctionAbstract::inNamespace' => ['bool'], + 'ReflectionFunctionAbstract::isClosure' => ['bool'], + 'ReflectionFunctionAbstract::isDeprecated' => ['bool'], + 'ReflectionFunctionAbstract::isGenerator' => ['bool'], + 'ReflectionFunctionAbstract::isInternal' => ['bool'], + 'ReflectionFunctionAbstract::isUserDefined' => ['bool'], + 'ReflectionFunctionAbstract::isVariadic' => ['bool'], + 'ReflectionFunctionAbstract::returnsReference' => ['bool'], + 'ReflectionGenerator::__construct' => ['void', 'generator'=>'object'], + 'ReflectionGenerator::getExecutingFile' => ['string'], + 'ReflectionGenerator::getExecutingGenerator' => ['Generator'], + 'ReflectionGenerator::getExecutingLine' => ['int'], + 'ReflectionGenerator::getFunction' => ['ReflectionFunctionAbstract'], + 'ReflectionGenerator::getThis' => ['?object'], + 'ReflectionGenerator::getTrace' => ['array', 'options='=>'int'], + 'ReflectionMethod::__construct' => ['void', 'class'=>'class-string|object', 'name'=>'string'], + 'ReflectionMethod::__construct\'1' => ['void', 'class_method'=>'string'], + 'ReflectionMethod::__toString' => ['string'], + 'ReflectionMethod::export' => ['?string', 'class'=>'string', 'name'=>'string', 'return='=>'bool'], + 'ReflectionMethod::getClosure' => ['?Closure', 'object='=>'object'], + 'ReflectionMethod::getClosureScopeClass' => ['ReflectionClass'], + 'ReflectionMethod::getClosureThis' => ['object'], + 'ReflectionMethod::getDeclaringClass' => ['ReflectionClass'], + 'ReflectionMethod::getDocComment' => ['false|string'], + 'ReflectionMethod::getEndLine' => ['false|int'], + 'ReflectionMethod::getExtension' => ['ReflectionExtension'], + 'ReflectionMethod::getExtensionName' => ['string'], + 'ReflectionMethod::getFileName' => ['false|string'], + 'ReflectionMethod::getModifiers' => ['int'], + 'ReflectionMethod::getName' => ['string'], + 'ReflectionMethod::getNamespaceName' => ['string'], + 'ReflectionMethod::getNumberOfParameters' => ['int'], + 'ReflectionMethod::getNumberOfRequiredParameters' => ['int'], + 'ReflectionMethod::getParameters' => ['list<\ReflectionParameter>'], + 'ReflectionMethod::getPrototype' => ['ReflectionMethod'], + 'ReflectionMethod::getReturnType' => ['?ReflectionType'], + 'ReflectionMethod::getShortName' => ['string'], + 'ReflectionMethod::getStartLine' => ['false|int'], + 'ReflectionMethod::getStaticVariables' => ['array'], + 'ReflectionMethod::hasReturnType' => ['bool'], + 'ReflectionMethod::inNamespace' => ['bool'], + 'ReflectionMethod::invoke' => ['mixed', 'object'=>'?object', '...args='=>'mixed'], + 'ReflectionMethod::invokeArgs' => ['mixed', 'object'=>'?object', 'args'=>'array'], + 'ReflectionMethod::isAbstract' => ['bool'], + 'ReflectionMethod::isClosure' => ['bool'], + 'ReflectionMethod::isConstructor' => ['bool'], + 'ReflectionMethod::isDeprecated' => ['bool'], + 'ReflectionMethod::isDestructor' => ['bool'], + 'ReflectionMethod::isFinal' => ['bool'], + 'ReflectionMethod::isGenerator' => ['bool'], + 'ReflectionMethod::isInternal' => ['bool'], + 'ReflectionMethod::isPrivate' => ['bool'], + 'ReflectionMethod::isProtected' => ['bool'], + 'ReflectionMethod::isPublic' => ['bool'], + 'ReflectionMethod::isStatic' => ['bool'], + 'ReflectionMethod::isUserDefined' => ['bool'], + 'ReflectionMethod::isVariadic' => ['bool'], + 'ReflectionMethod::returnsReference' => ['bool'], + 'ReflectionMethod::setAccessible' => ['void', 'visible'=>'bool'], + 'ReflectionNamedType::__clone' => ['void'], + 'ReflectionNamedType::__toString' => ['string'], + 'ReflectionNamedType::allowsNull' => ['bool'], + 'ReflectionNamedType::getName' => ['string'], + 'ReflectionNamedType::isBuiltin' => ['bool'], + 'ReflectionObject::__clone' => ['void'], + 'ReflectionObject::__construct' => ['void', 'argument'=>'object'], + 'ReflectionObject::__toString' => ['string'], + 'ReflectionObject::export' => ['?string', 'argument'=>'object', 'return='=>'bool'], + 'ReflectionObject::getConstant' => ['mixed', 'name'=>'string'], + 'ReflectionObject::getConstants' => ['array'], + 'ReflectionObject::getConstructor' => ['?ReflectionMethod'], + 'ReflectionObject::getDefaultProperties' => ['array'], + 'ReflectionObject::getDocComment' => ['false|string'], + 'ReflectionObject::getEndLine' => ['false|int'], + 'ReflectionObject::getExtension' => ['?ReflectionExtension'], + 'ReflectionObject::getExtensionName' => ['false|string'], + 'ReflectionObject::getFileName' => ['false|string'], + 'ReflectionObject::getInterfaceNames' => ['class-string[]'], + 'ReflectionObject::getInterfaces' => ['array'], + 'ReflectionObject::getMethod' => ['ReflectionMethod', 'name'=>'string'], + 'ReflectionObject::getMethods' => ['ReflectionMethod[]', 'filter='=>'int'], + 'ReflectionObject::getModifiers' => ['int'], + 'ReflectionObject::getName' => ['string'], + 'ReflectionObject::getNamespaceName' => ['string'], + 'ReflectionObject::getParentClass' => ['ReflectionClass|false'], + 'ReflectionObject::getProperties' => ['ReflectionProperty[]', 'filter='=>'int'], + 'ReflectionObject::getProperty' => ['ReflectionProperty', 'name'=>'string'], + 'ReflectionObject::getReflectionConstant' => ['ReflectionClassConstant', 'name'=>'string'], + 'ReflectionObject::getReflectionConstants' => ['list<\ReflectionClassConstant>'], + 'ReflectionObject::getShortName' => ['string'], + 'ReflectionObject::getStartLine' => ['false|int'], + 'ReflectionObject::getStaticProperties' => ['ReflectionProperty[]'], + 'ReflectionObject::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'], + 'ReflectionObject::getTraitAliases' => ['array'], + 'ReflectionObject::getTraitNames' => ['list'], + 'ReflectionObject::getTraits' => ['array'], + 'ReflectionObject::hasConstant' => ['bool', 'name'=>'string'], + 'ReflectionObject::hasMethod' => ['bool', 'name'=>'string'], + 'ReflectionObject::hasProperty' => ['bool', 'name'=>'string'], + 'ReflectionObject::implementsInterface' => ['bool', 'interface_name'=>'ReflectionClass|string'], + 'ReflectionObject::inNamespace' => ['bool'], + 'ReflectionObject::isAbstract' => ['bool'], + 'ReflectionObject::isAnonymous' => ['bool'], + 'ReflectionObject::isCloneable' => ['bool'], + 'ReflectionObject::isFinal' => ['bool'], + 'ReflectionObject::isInstance' => ['bool', 'object'=>'object'], + 'ReflectionObject::isInstantiable' => ['bool'], + 'ReflectionObject::isInterface' => ['bool'], + 'ReflectionObject::isInternal' => ['bool'], + 'ReflectionObject::isIterable' => ['bool'], + 'ReflectionObject::isIterateable' => ['bool'], + 'ReflectionObject::isSubclassOf' => ['bool', 'class'=>'ReflectionClass|string'], + 'ReflectionObject::isTrait' => ['bool'], + 'ReflectionObject::isUserDefined' => ['bool'], + 'ReflectionObject::newInstance' => ['object', 'args='=>'mixed', '...args='=>'array'], + 'ReflectionObject::newInstanceArgs' => ['object', 'args='=>'array'], + 'ReflectionObject::newInstanceWithoutConstructor' => ['object'], + 'ReflectionObject::setStaticPropertyValue' => ['void', 'name'=>'string', 'value'=>'string'], + 'ReflectionParameter::__clone' => ['void'], + 'ReflectionParameter::__construct' => ['void', 'function'=>'', 'parameter'=>''], + 'ReflectionParameter::__toString' => ['string'], + 'ReflectionParameter::allowsNull' => ['bool'], + 'ReflectionParameter::canBePassedByValue' => ['bool'], + 'ReflectionParameter::export' => ['?string', 'function'=>'string', 'parameter'=>'string', 'return='=>'bool'], + 'ReflectionParameter::getClass' => ['?ReflectionClass'], + 'ReflectionParameter::getDeclaringClass' => ['?ReflectionClass'], + 'ReflectionParameter::getDeclaringFunction' => ['ReflectionFunctionAbstract'], + 'ReflectionParameter::getDefaultValue' => ['mixed'], + 'ReflectionParameter::getDefaultValueConstantName' => ['?string'], + 'ReflectionParameter::getName' => ['string'], + 'ReflectionParameter::getPosition' => ['int'], + 'ReflectionParameter::getType' => ['?ReflectionType'], + 'ReflectionParameter::hasType' => ['bool'], + 'ReflectionParameter::isArray' => ['bool'], + 'ReflectionParameter::isCallable' => ['?bool'], + 'ReflectionParameter::isDefaultValueAvailable' => ['bool'], + 'ReflectionParameter::isDefaultValueConstant' => ['bool'], + 'ReflectionParameter::isOptional' => ['bool'], + 'ReflectionParameter::isPassedByReference' => ['bool'], + 'ReflectionParameter::isVariadic' => ['bool'], + 'ReflectionProperty::__clone' => ['void'], + 'ReflectionProperty::__construct' => ['void', 'class'=>'', 'name'=>'string'], + 'ReflectionProperty::__toString' => ['string'], + 'ReflectionProperty::export' => ['?string', 'class'=>'mixed', 'name'=>'string', 'return='=>'bool'], + 'ReflectionProperty::getDeclaringClass' => ['ReflectionClass'], + 'ReflectionProperty::getDocComment' => ['string|false'], + 'ReflectionProperty::getModifiers' => ['int'], + 'ReflectionProperty::getName' => ['string'], + 'ReflectionProperty::getValue' => ['mixed', 'object='=>'object'], + 'ReflectionProperty::hasType' => ['bool'], + 'ReflectionProperty::isDefault' => ['bool'], + 'ReflectionProperty::isPrivate' => ['bool'], + 'ReflectionProperty::isProtected' => ['bool'], + 'ReflectionProperty::isPublic' => ['bool'], + 'ReflectionProperty::isStatic' => ['bool'], + 'ReflectionProperty::setAccessible' => ['void', 'visible'=>'bool'], + 'ReflectionProperty::setValue' => ['void', 'object'=>'null|object', 'value'=>''], + 'ReflectionProperty::setValue\'1' => ['void', 'value'=>''], + 'ReflectionType::__clone' => ['void'], + 'ReflectionType::__toString' => ['string'], + 'ReflectionType::allowsNull' => ['bool'], + 'ReflectionType::isBuiltin' => ['bool'], + 'ReflectionZendExtension::__clone' => ['void'], + 'ReflectionZendExtension::__construct' => ['void', 'name'=>'string'], + 'ReflectionZendExtension::__toString' => ['string'], + 'ReflectionZendExtension::export' => ['?string', 'name'=>'string', 'return='=>'bool'], + 'ReflectionZendExtension::getAuthor' => ['string'], + 'ReflectionZendExtension::getCopyright' => ['string'], + 'ReflectionZendExtension::getName' => ['string'], + 'ReflectionZendExtension::getURL' => ['string'], + 'ReflectionZendExtension::getVersion' => ['string'], + 'Reflector::__toString' => ['string'], + 'Reflector::export' => ['?string'], + 'RegexIterator::__construct' => ['void', 'iterator'=>'Iterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], + 'RegexIterator::accept' => ['bool'], + 'RegexIterator::current' => ['mixed'], + 'RegexIterator::getFlags' => ['int'], + 'RegexIterator::getInnerIterator' => ['Iterator'], + 'RegexIterator::getMode' => ['int'], + 'RegexIterator::getPregFlags' => ['int'], + 'RegexIterator::getRegex' => ['string'], + '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::valid' => ['bool'], + 'ResourceBundle::__construct' => ['void', 'locale'=>'string', 'bundlename'=>'string', 'fallback='=>'bool'], + 'ResourceBundle::count' => ['int'], + 'ResourceBundle::create' => ['?ResourceBundle', 'locale'=>'string', 'bundlename'=>'string', 'fallback='=>'bool'], + 'ResourceBundle::get' => ['', 'index'=>'string|int', 'fallback='=>'bool'], + 'ResourceBundle::getErrorCode' => ['int'], + 'ResourceBundle::getErrorMessage' => ['string'], + 'ResourceBundle::getLocales' => ['array', 'bundlename'=>'string'], + 'Runkit_Sandbox::__construct' => ['void', 'options='=>'array'], + 'Runkit_Sandbox_Parent' => [''], + 'Runkit_Sandbox_Parent::__construct' => ['void'], + 'RuntimeException::__clone' => ['void'], + 'RuntimeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?RuntimeException'], + 'RuntimeException::__toString' => ['string'], + 'RuntimeException::getCode' => ['int'], + 'RuntimeException::getFile' => ['string'], + 'RuntimeException::getLine' => ['int'], + 'RuntimeException::getMessage' => ['string'], + 'RuntimeException::getPrevious' => ['Throwable|RuntimeException|null'], + 'RuntimeException::getTrace' => ['list\',args?:array}>'], + 'RuntimeException::getTraceAsString' => ['string'], + 'SAMConnection::commit' => ['bool'], + 'SAMConnection::connect' => ['bool', 'protocol'=>'string', 'properties='=>'array'], + 'SAMConnection::disconnect' => ['bool'], + 'SAMConnection::errno' => ['int'], + 'SAMConnection::error' => ['string'], + 'SAMConnection::isConnected' => ['bool'], + 'SAMConnection::peek' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], + 'SAMConnection::peekAll' => ['array', 'target'=>'string', 'properties='=>'array'], + 'SAMConnection::receive' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], + 'SAMConnection::remove' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], + 'SAMConnection::rollback' => ['bool'], + 'SAMConnection::send' => ['string', 'target'=>'string', 'msg'=>'sammessage', 'properties='=>'array'], + 'SAMConnection::setDebug' => ['', 'switch'=>'bool'], + 'SAMConnection::subscribe' => ['string', 'targettopic'=>'string'], + 'SAMConnection::unsubscribe' => ['bool', 'subscriptionid'=>'string', 'targettopic='=>'string'], + 'SAMMessage::body' => ['string'], + 'SAMMessage::header' => ['object'], + 'SCA::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], + 'SCA::getService' => ['', 'target'=>'string', 'binding='=>'string', 'config='=>'array'], + 'SCA_LocalProxy::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], + 'SCA_SoapProxy::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], + 'SDO_DAS_ChangeSummary::beginLogging' => [''], + 'SDO_DAS_ChangeSummary::endLogging' => [''], + 'SDO_DAS_ChangeSummary::getChangeType' => ['int', 'dataobject'=>'sdo_dataobject'], + 'SDO_DAS_ChangeSummary::getChangedDataObjects' => ['SDO_List'], + 'SDO_DAS_ChangeSummary::getOldContainer' => ['SDO_DataObject', 'data_object'=>'sdo_dataobject'], + 'SDO_DAS_ChangeSummary::getOldValues' => ['SDO_List', 'data_object'=>'sdo_dataobject'], + 'SDO_DAS_ChangeSummary::isLogging' => ['bool'], + 'SDO_DAS_DataFactory::addPropertyToType' => ['', 'parent_type_namespace_uri'=>'string', 'parent_type_name'=>'string', 'property_name'=>'string', 'type_namespace_uri'=>'string', 'type_name'=>'string', 'options='=>'array'], + 'SDO_DAS_DataFactory::addType' => ['', 'type_namespace_uri'=>'string', 'type_name'=>'string', 'options='=>'array'], + 'SDO_DAS_DataFactory::getDataFactory' => ['SDO_DAS_DataFactory'], + 'SDO_DAS_DataObject::getChangeSummary' => ['SDO_DAS_ChangeSummary'], + 'SDO_DAS_Relational::__construct' => ['void', 'database_metadata'=>'array', 'application_root_type='=>'string', 'sdo_containment_references_metadata='=>'array'], + 'SDO_DAS_Relational::applyChanges' => ['', 'database_handle'=>'pdo', 'root_data_object'=>'sdodataobject'], + 'SDO_DAS_Relational::createRootDataObject' => ['SDODataObject'], + 'SDO_DAS_Relational::executePreparedQuery' => ['SDODataObject', 'database_handle'=>'pdo', 'prepared_statement'=>'pdostatement', 'value_list'=>'array', 'column_specifier='=>'array'], + 'SDO_DAS_Relational::executeQuery' => ['SDODataObject', 'database_handle'=>'pdo', 'sql_statement'=>'string', 'column_specifier='=>'array'], + 'SDO_DAS_Setting::getListIndex' => ['int'], + 'SDO_DAS_Setting::getPropertyIndex' => ['int'], + 'SDO_DAS_Setting::getPropertyName' => ['string'], + 'SDO_DAS_Setting::getValue' => [''], + 'SDO_DAS_Setting::isSet' => ['bool'], + 'SDO_DAS_XML::addTypes' => ['', 'xsd_file'=>'string'], + 'SDO_DAS_XML::create' => ['SDO_DAS_XML', 'xsd_file='=>'mixed', 'key='=>'string'], + 'SDO_DAS_XML::createDataObject' => ['SDO_DataObject', 'namespace_uri'=>'string', 'type_name'=>'string'], + 'SDO_DAS_XML::createDocument' => ['SDO_DAS_XML_Document', 'document_element_name'=>'string', 'document_element_namespace_uri'=>'string', 'dataobject='=>'sdo_dataobject'], + 'SDO_DAS_XML::loadFile' => ['SDO_XMLDocument', 'xml_file'=>'string'], + 'SDO_DAS_XML::loadString' => ['SDO_DAS_XML_Document', 'xml_string'=>'string'], + 'SDO_DAS_XML::saveFile' => ['', 'xdoc'=>'sdo_xmldocument', 'xml_file'=>'string', 'indent='=>'int'], + 'SDO_DAS_XML::saveString' => ['string', 'xdoc'=>'sdo_xmldocument', 'indent='=>'int'], + 'SDO_DAS_XML_Document::getRootDataObject' => ['SDO_DataObject'], + 'SDO_DAS_XML_Document::getRootElementName' => ['string'], + 'SDO_DAS_XML_Document::getRootElementURI' => ['string'], + 'SDO_DAS_XML_Document::setEncoding' => ['', 'encoding'=>'string'], + 'SDO_DAS_XML_Document::setXMLDeclaration' => ['', 'xmldeclatation'=>'bool'], + 'SDO_DAS_XML_Document::setXMLVersion' => ['', 'xmlversion'=>'string'], + 'SDO_DataFactory::create' => ['void', 'type_namespace_uri'=>'string', 'type_name'=>'string'], + 'SDO_DataObject::clear' => ['void'], + 'SDO_DataObject::createDataObject' => ['SDO_DataObject', 'identifier'=>''], + 'SDO_DataObject::getContainer' => ['SDO_DataObject'], + 'SDO_DataObject::getSequence' => ['SDO_Sequence'], + 'SDO_DataObject::getTypeName' => ['string'], + 'SDO_DataObject::getTypeNamespaceURI' => ['string'], + 'SDO_Exception::getCause' => [''], + 'SDO_List::insert' => ['void', 'value'=>'mixed', 'index='=>'int'], + 'SDO_Model_Property::getContainingType' => ['SDO_Model_Type'], + 'SDO_Model_Property::getDefault' => [''], + 'SDO_Model_Property::getName' => ['string'], + 'SDO_Model_Property::getType' => ['SDO_Model_Type'], + 'SDO_Model_Property::isContainment' => ['bool'], + 'SDO_Model_Property::isMany' => ['bool'], + 'SDO_Model_ReflectionDataObject::__construct' => ['void', 'data_object'=>'sdo_dataobject'], + 'SDO_Model_ReflectionDataObject::export' => ['mixed', 'rdo'=>'sdo_model_reflectiondataobject', 'return='=>'bool'], + 'SDO_Model_ReflectionDataObject::getContainmentProperty' => ['SDO_Model_Property'], + 'SDO_Model_ReflectionDataObject::getInstanceProperties' => ['array'], + 'SDO_Model_ReflectionDataObject::getType' => ['SDO_Model_Type'], + 'SDO_Model_Type::getBaseType' => ['SDO_Model_Type'], + 'SDO_Model_Type::getName' => ['string'], + 'SDO_Model_Type::getNamespaceURI' => ['string'], + 'SDO_Model_Type::getProperties' => ['array'], + 'SDO_Model_Type::getProperty' => ['SDO_Model_Property', 'identifier'=>''], + 'SDO_Model_Type::isAbstractType' => ['bool'], + 'SDO_Model_Type::isDataType' => ['bool'], + 'SDO_Model_Type::isInstance' => ['bool', 'data_object'=>'sdo_dataobject'], + 'SDO_Model_Type::isOpenType' => ['bool'], + 'SDO_Model_Type::isSequencedType' => ['bool'], + 'SDO_Sequence::getProperty' => ['SDO_Model_Property', 'sequence_index'=>'int'], + 'SDO_Sequence::insert' => ['void', 'value'=>'mixed', 'sequenceindex='=>'int', 'propertyidentifier='=>'mixed'], + 'SDO_Sequence::move' => ['void', 'toindex'=>'int', 'fromindex'=>'int'], + 'SNMP::__construct' => ['void', 'version'=>'int', 'hostname'=>'string', 'community'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'SNMP::close' => ['bool'], + 'SNMP::get' => ['array|string|false', 'objectId'=>'string|array', 'preserveKeys='=>'bool'], + 'SNMP::getErrno' => ['int'], + 'SNMP::getError' => ['string'], + 'SNMP::getnext' => ['string|array|false', 'objectId'=>'string|array'], + 'SNMP::set' => ['bool', 'objectId'=>'string|array', 'type'=>'string|array', 'value'=>'mixed'], + 'SNMP::setSecurity' => ['bool', 'securityLevel'=>'string', 'authProtocol='=>'string', 'authPassphrase='=>'string', 'privacyProtocol='=>'string', 'privacyPassphrase='=>'string', 'contextName='=>'string', 'contextEngineId='=>'string'], + 'SNMP::walk' => ['array|false', 'objectId'=>'string', 'suffixAsKey='=>'bool', 'maxRepetitions='=>'int', 'nonRepeaters='=>'int'], + 'SQLite3::__construct' => ['void', 'filename'=>'string', 'flags='=>'int', 'encryptionKey='=>'?string'], + 'SQLite3::busyTimeout' => ['bool', 'milliseconds'=>'int'], + 'SQLite3::changes' => ['int'], + 'SQLite3::close' => ['bool'], + 'SQLite3::createAggregate' => ['bool', 'name'=>'string', 'stepCallback'=>'callable', 'finalCallback'=>'callable', 'argCount='=>'int'], + 'SQLite3::createCollation' => ['bool', 'name'=>'string', 'callback'=>'callable'], + 'SQLite3::createFunction' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argCount='=>'int'], + 'SQLite3::enableExceptions' => ['bool', 'enable='=>'bool'], + 'SQLite3::escapeString' => ['string', 'string'=>'string'], + 'SQLite3::exec' => ['bool', 'query'=>'string'], + 'SQLite3::lastErrorCode' => ['int'], + 'SQLite3::lastErrorMsg' => ['string'], + 'SQLite3::lastInsertRowID' => ['int'], + 'SQLite3::loadExtension' => ['bool', 'name'=>'string'], + 'SQLite3::open' => ['void', 'filename'=>'string', 'flags='=>'int', 'encryptionKey='=>'?string'], + 'SQLite3::openBlob' => ['resource|false', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'dbname='=>'string'], + 'SQLite3::prepare' => ['SQLite3Stmt|false', 'query'=>'string'], + 'SQLite3::query' => ['SQLite3Result|false', 'query'=>'string'], + 'SQLite3::querySingle' => ['array|int|string|bool|float|null|false', 'query'=>'string', 'entireRow='=>'bool'], + 'SQLite3::version' => ['array'], + 'SQLite3Result::__construct' => ['void'], + 'SQLite3Result::columnName' => ['string', 'column'=>'int'], + 'SQLite3Result::columnType' => ['int', 'column'=>'int'], + 'SQLite3Result::fetchArray' => ['array|false', 'mode='=>'int'], + 'SQLite3Result::finalize' => ['bool'], + 'SQLite3Result::numColumns' => ['int'], + 'SQLite3Result::reset' => ['bool'], + 'SQLite3Stmt::__construct' => ['void', 'sqlite3'=>'sqlite3', 'query'=>'string'], + 'SQLite3Stmt::bindParam' => ['bool', 'param'=>'string|int', '&rw_var'=>'mixed', 'type='=>'int'], + 'SQLite3Stmt::bindValue' => ['bool', 'param'=>'string|int', 'value'=>'mixed', 'type='=>'int'], + 'SQLite3Stmt::clear' => ['bool'], + 'SQLite3Stmt::close' => ['bool'], + 'SQLite3Stmt::execute' => ['false|SQLite3Result'], + 'SQLite3Stmt::getSQL' => ['string', 'expand='=>'bool'], + 'SQLite3Stmt::paramCount' => ['int'], + 'SQLite3Stmt::readOnly' => ['bool'], + 'SQLite3Stmt::reset' => ['bool'], + 'SQLiteDatabase::__construct' => ['void', 'filename'=>'', 'mode='=>'int|mixed', '&error_message'=>''], + 'SQLiteDatabase::arrayQuery' => ['array', 'query'=>'string', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'SQLiteDatabase::busyTimeout' => ['int', 'milliseconds'=>'int'], + 'SQLiteDatabase::changes' => ['int'], + 'SQLiteDatabase::createAggregate' => ['', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], + 'SQLiteDatabase::createFunction' => ['', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], + 'SQLiteDatabase::exec' => ['bool', 'query'=>'string', 'error_msg='=>'string'], + 'SQLiteDatabase::fetchColumnTypes' => ['array', 'table_name'=>'string', 'result_type='=>'int'], + 'SQLiteDatabase::lastError' => ['int'], + 'SQLiteDatabase::lastInsertRowid' => ['int'], + 'SQLiteDatabase::query' => ['SQLiteResult|false', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], + 'SQLiteDatabase::queryExec' => ['bool', 'query'=>'string', '&w_error_msg='=>'string'], + 'SQLiteDatabase::singleQuery' => ['array', 'query'=>'string', 'first_row_only='=>'bool', 'decode_binary='=>'bool'], + 'SQLiteDatabase::unbufferedQuery' => ['SQLiteUnbuffered|false', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], + 'SQLiteException::__clone' => ['void'], + 'SQLiteException::__construct' => ['void', 'message'=>'', 'code'=>'', 'previous'=>''], + 'SQLiteException::__toString' => ['string'], + 'SQLiteException::__wakeup' => ['void'], + 'SQLiteException::getCode' => ['int'], + 'SQLiteException::getFile' => ['string'], + 'SQLiteException::getLine' => ['int'], + 'SQLiteException::getMessage' => ['string'], + 'SQLiteException::getPrevious' => ['RuntimeException|Throwable|null'], + 'SQLiteException::getTrace' => ['list\',args?:array}>'], + 'SQLiteException::getTraceAsString' => ['string'], + 'SQLiteResult::__construct' => ['void'], + 'SQLiteResult::column' => ['mixed', 'index_or_name'=>'', 'decode_binary='=>'bool'], + 'SQLiteResult::count' => ['int'], + 'SQLiteResult::current' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'SQLiteResult::fetch' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'SQLiteResult::fetchAll' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'SQLiteResult::fetchObject' => ['object', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], + 'SQLiteResult::fetchSingle' => ['string', 'decode_binary='=>'bool'], + 'SQLiteResult::fieldName' => ['string', 'field_index'=>'int'], + 'SQLiteResult::hasPrev' => ['bool'], + 'SQLiteResult::key' => ['mixed|null'], + 'SQLiteResult::next' => ['bool'], + 'SQLiteResult::numFields' => ['int'], + 'SQLiteResult::numRows' => ['int'], + 'SQLiteResult::prev' => ['bool'], + 'SQLiteResult::rewind' => ['bool'], + 'SQLiteResult::seek' => ['bool', 'rownum'=>'int'], + 'SQLiteResult::valid' => ['bool'], + 'SQLiteUnbuffered::column' => ['void', 'index_or_name'=>'', 'decode_binary='=>'bool'], + 'SQLiteUnbuffered::current' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'SQLiteUnbuffered::fetch' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'SQLiteUnbuffered::fetchAll' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'SQLiteUnbuffered::fetchObject' => ['object', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], + 'SQLiteUnbuffered::fetchSingle' => ['string', 'decode_binary='=>'bool'], + 'SQLiteUnbuffered::fieldName' => ['string', 'field_index'=>'int'], + 'SQLiteUnbuffered::next' => ['bool'], + 'SQLiteUnbuffered::numFields' => ['int'], + 'SQLiteUnbuffered::valid' => ['bool'], + 'SVM::__construct' => ['void'], + 'SVM::getOptions' => ['array'], + 'SVM::setOptions' => ['bool', 'params'=>'array'], + 'SVMModel::__construct' => ['void', 'filename='=>'string'], + 'SVMModel::checkProbabilityModel' => ['bool'], + 'SVMModel::getLabels' => ['array'], + 'SVMModel::getNrClass' => ['int'], + 'SVMModel::getSvmType' => ['int'], + 'SVMModel::getSvrProbability' => ['float'], + 'SVMModel::load' => ['bool', 'filename'=>'string'], + 'SVMModel::predict' => ['float', 'data'=>'array'], + 'SVMModel::predict_probability' => ['float', 'data'=>'array'], + 'SVMModel::save' => ['bool', 'filename'=>'string'], + 'SWFAction::__construct' => ['void', 'script'=>'string'], + 'SWFBitmap::__construct' => ['void', 'file'=>'', 'alphafile='=>''], + 'SWFBitmap::getHeight' => ['float'], + 'SWFBitmap::getWidth' => ['float'], + 'SWFButton::__construct' => ['void'], + 'SWFButton::addASound' => ['SWFSoundInstance', 'sound'=>'swfsound', 'flags'=>'int'], + 'SWFButton::addAction' => ['void', 'action'=>'swfaction', 'flags'=>'int'], + 'SWFButton::addShape' => ['void', 'shape'=>'swfshape', 'flags'=>'int'], + 'SWFButton::setAction' => ['void', 'action'=>'swfaction'], + 'SWFButton::setDown' => ['void', 'shape'=>'swfshape'], + 'SWFButton::setHit' => ['void', 'shape'=>'swfshape'], + 'SWFButton::setMenu' => ['void', 'flag'=>'int'], + 'SWFButton::setOver' => ['void', 'shape'=>'swfshape'], + 'SWFButton::setUp' => ['void', 'shape'=>'swfshape'], + 'SWFDisplayItem::addAction' => ['void', 'action'=>'swfaction', 'flags'=>'int'], + 'SWFDisplayItem::addColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], + 'SWFDisplayItem::endMask' => ['void'], + 'SWFDisplayItem::getRot' => ['float'], + 'SWFDisplayItem::getX' => ['float'], + 'SWFDisplayItem::getXScale' => ['float'], + 'SWFDisplayItem::getXSkew' => ['float'], + 'SWFDisplayItem::getY' => ['float'], + 'SWFDisplayItem::getYScale' => ['float'], + 'SWFDisplayItem::getYSkew' => ['float'], + 'SWFDisplayItem::move' => ['void', 'dx'=>'float', 'dy'=>'float'], + 'SWFDisplayItem::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], + 'SWFDisplayItem::multColor' => ['void', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'a='=>'float'], + 'SWFDisplayItem::remove' => ['void'], + 'SWFDisplayItem::rotate' => ['void', 'angle'=>'float'], + 'SWFDisplayItem::rotateTo' => ['void', 'angle'=>'float'], + 'SWFDisplayItem::scale' => ['void', 'dx'=>'float', 'dy'=>'float'], + 'SWFDisplayItem::scaleTo' => ['void', 'x'=>'float', 'y='=>'float'], + 'SWFDisplayItem::setDepth' => ['void', 'depth'=>'int'], + 'SWFDisplayItem::setMaskLevel' => ['void', 'level'=>'int'], + 'SWFDisplayItem::setMatrix' => ['void', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], + 'SWFDisplayItem::setName' => ['void', 'name'=>'string'], + 'SWFDisplayItem::setRatio' => ['void', 'ratio'=>'float'], + 'SWFDisplayItem::skewX' => ['void', 'ddegrees'=>'float'], + 'SWFDisplayItem::skewXTo' => ['void', 'degrees'=>'float'], + 'SWFDisplayItem::skewY' => ['void', 'ddegrees'=>'float'], + 'SWFDisplayItem::skewYTo' => ['void', 'degrees'=>'float'], + 'SWFFill::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], + 'SWFFill::rotateTo' => ['void', 'angle'=>'float'], + 'SWFFill::scaleTo' => ['void', 'x'=>'float', 'y='=>'float'], + 'SWFFill::skewXTo' => ['void', 'x'=>'float'], + 'SWFFill::skewYTo' => ['void', 'y'=>'float'], + 'SWFFont::__construct' => ['void', 'filename'=>'string'], + 'SWFFont::getAscent' => ['float'], + 'SWFFont::getDescent' => ['float'], + 'SWFFont::getLeading' => ['float'], + 'SWFFont::getShape' => ['string', 'code'=>'int'], + 'SWFFont::getUTF8Width' => ['float', 'string'=>'string'], + 'SWFFont::getWidth' => ['float', 'string'=>'string'], + 'SWFFontChar::addChars' => ['void', 'char'=>'string'], + 'SWFFontChar::addUTF8Chars' => ['void', 'char'=>'string'], + 'SWFGradient::__construct' => ['void'], + 'SWFGradient::addEntry' => ['void', 'ratio'=>'float', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], + 'SWFMorph::__construct' => ['void'], + 'SWFMorph::getShape1' => ['SWFShape'], + 'SWFMorph::getShape2' => ['SWFShape'], + 'SWFMovie::__construct' => ['void', 'version='=>'int'], + 'SWFMovie::add' => ['mixed', 'instance'=>'object'], + 'SWFMovie::addExport' => ['void', 'char'=>'swfcharacter', 'name'=>'string'], + 'SWFMovie::addFont' => ['mixed', 'font'=>'swffont'], + 'SWFMovie::importChar' => ['SWFSprite', 'libswf'=>'string', 'name'=>'string'], + 'SWFMovie::importFont' => ['SWFFontChar', 'libswf'=>'string', 'name'=>'string'], + 'SWFMovie::labelFrame' => ['void', 'label'=>'string'], + 'SWFMovie::namedAnchor' => [''], + 'SWFMovie::nextFrame' => ['void'], + 'SWFMovie::output' => ['int', 'compression='=>'int'], + 'SWFMovie::protect' => [''], + 'SWFMovie::remove' => ['void', 'instance'=>'object'], + 'SWFMovie::save' => ['int', 'filename'=>'string', 'compression='=>'int'], + 'SWFMovie::saveToFile' => ['int', 'x'=>'resource', 'compression='=>'int'], + 'SWFMovie::setDimension' => ['void', 'width'=>'float', 'height'=>'float'], + 'SWFMovie::setFrames' => ['void', 'number'=>'int'], + 'SWFMovie::setRate' => ['void', 'rate'=>'float'], + 'SWFMovie::setbackground' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'SWFMovie::startSound' => ['SWFSoundInstance', 'sound'=>'swfsound'], + 'SWFMovie::stopSound' => ['void', 'sound'=>'swfsound'], + 'SWFMovie::streamMP3' => ['int', 'mp3file'=>'mixed', 'skip='=>'float'], + 'SWFMovie::writeExports' => ['void'], + 'SWFPrebuiltClip::__construct' => ['void', 'file'=>''], + 'SWFShape::__construct' => ['void'], + 'SWFShape::addFill' => ['SWFFill', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int', 'bitmap='=>'swfbitmap', 'flags='=>'int', 'gradient='=>'swfgradient'], + 'SWFShape::addFill\'1' => ['SWFFill', 'bitmap'=>'SWFBitmap', 'flags='=>'int'], + 'SWFShape::addFill\'2' => ['SWFFill', 'gradient'=>'SWFGradient', 'flags='=>'int'], + 'SWFShape::drawArc' => ['void', 'r'=>'float', 'startangle'=>'float', 'endangle'=>'float'], + 'SWFShape::drawCircle' => ['void', 'r'=>'float'], + 'SWFShape::drawCubic' => ['int', 'bx'=>'float', 'by'=>'float', 'cx'=>'float', 'cy'=>'float', 'dx'=>'float', 'dy'=>'float'], + 'SWFShape::drawCubicTo' => ['int', 'bx'=>'float', 'by'=>'float', 'cx'=>'float', 'cy'=>'float', 'dx'=>'float', 'dy'=>'float'], + 'SWFShape::drawCurve' => ['int', 'controldx'=>'float', 'controldy'=>'float', 'anchordx'=>'float', 'anchordy'=>'float', 'targetdx='=>'float', 'targetdy='=>'float'], + 'SWFShape::drawCurveTo' => ['int', 'controlx'=>'float', 'controly'=>'float', 'anchorx'=>'float', 'anchory'=>'float', 'targetx='=>'float', 'targety='=>'float'], + 'SWFShape::drawGlyph' => ['void', 'font'=>'swffont', 'character'=>'string', 'size='=>'int'], + 'SWFShape::drawLine' => ['void', 'dx'=>'float', 'dy'=>'float'], + 'SWFShape::drawLineTo' => ['void', 'x'=>'float', 'y'=>'float'], + 'SWFShape::movePen' => ['void', 'dx'=>'float', 'dy'=>'float'], + 'SWFShape::movePenTo' => ['void', 'x'=>'float', 'y'=>'float'], + 'SWFShape::setLeftFill' => ['', 'fill'=>'swfgradient', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], + 'SWFShape::setLine' => ['', 'shape'=>'swfshape', 'width'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], + 'SWFShape::setRightFill' => ['', 'fill'=>'swfgradient', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], + 'SWFSound' => ['SWFSound', 'filename'=>'string', 'flags='=>'int'], + 'SWFSound::__construct' => ['void', 'filename'=>'string', 'flags='=>'int'], + 'SWFSoundInstance::loopCount' => ['void', 'point'=>'int'], + 'SWFSoundInstance::loopInPoint' => ['void', 'point'=>'int'], + 'SWFSoundInstance::loopOutPoint' => ['void', 'point'=>'int'], + 'SWFSoundInstance::noMultiple' => ['void'], + 'SWFSprite::__construct' => ['void'], + 'SWFSprite::add' => ['void', 'object'=>'object'], + 'SWFSprite::labelFrame' => ['void', 'label'=>'string'], + 'SWFSprite::nextFrame' => ['void'], + 'SWFSprite::remove' => ['void', 'object'=>'object'], + 'SWFSprite::setFrames' => ['void', 'number'=>'int'], + 'SWFSprite::startSound' => ['SWFSoundInstance', 'sount'=>'swfsound'], + 'SWFSprite::stopSound' => ['void', 'sount'=>'swfsound'], + 'SWFText::__construct' => ['void'], + 'SWFText::addString' => ['void', 'string'=>'string'], + 'SWFText::addUTF8String' => ['void', 'text'=>'string'], + 'SWFText::getAscent' => ['float'], + 'SWFText::getDescent' => ['float'], + 'SWFText::getLeading' => ['float'], + 'SWFText::getUTF8Width' => ['float', 'string'=>'string'], + 'SWFText::getWidth' => ['float', 'string'=>'string'], + 'SWFText::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], + 'SWFText::setColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], + 'SWFText::setFont' => ['void', 'font'=>'swffont'], + 'SWFText::setHeight' => ['void', 'height'=>'float'], + 'SWFText::setSpacing' => ['void', 'spacing'=>'float'], + 'SWFTextField::__construct' => ['void', 'flags='=>'int'], + 'SWFTextField::addChars' => ['void', 'chars'=>'string'], + 'SWFTextField::addString' => ['void', 'string'=>'string'], + 'SWFTextField::align' => ['void', 'alignement'=>'int'], + 'SWFTextField::setBounds' => ['void', 'width'=>'float', 'height'=>'float'], + 'SWFTextField::setColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], + 'SWFTextField::setFont' => ['void', 'font'=>'swffont'], + 'SWFTextField::setHeight' => ['void', 'height'=>'float'], + 'SWFTextField::setIndentation' => ['void', 'width'=>'float'], + 'SWFTextField::setLeftMargin' => ['void', 'width'=>'float'], + 'SWFTextField::setLineSpacing' => ['void', 'height'=>'float'], + 'SWFTextField::setMargins' => ['void', 'left'=>'float', 'right'=>'float'], + 'SWFTextField::setName' => ['void', 'name'=>'string'], + 'SWFTextField::setPadding' => ['void', 'padding'=>'float'], + 'SWFTextField::setRightMargin' => ['void', 'width'=>'float'], + 'SWFVideoStream::__construct' => ['void', 'file='=>'string'], + 'SWFVideoStream::getNumFrames' => ['int'], + 'SWFVideoStream::setDimension' => ['void', 'x'=>'int', 'y'=>'int'], + 'Saxon\SaxonProcessor::__construct' => ['void', 'license='=>'bool', 'cwd='=>'string'], + 'Saxon\SaxonProcessor::createAtomicValue' => ['Saxon\XdmValue', 'primitive_type_val'=>'bool|float|int|string'], + 'Saxon\SaxonProcessor::newSchemaValidator' => ['Saxon\SchemaValidator'], + 'Saxon\SaxonProcessor::newXPathProcessor' => ['Saxon\XPathProcessor'], + 'Saxon\SaxonProcessor::newXQueryProcessor' => ['Saxon\XQueryProcessor'], + 'Saxon\SaxonProcessor::newXsltProcessor' => ['Saxon\XsltProcessor'], + 'Saxon\SaxonProcessor::parseXmlFromFile' => ['Saxon\XdmNode', 'fileName'=>'string'], + 'Saxon\SaxonProcessor::parseXmlFromString' => ['Saxon\XdmNode', 'value'=>'string'], + 'Saxon\SaxonProcessor::registerPHPFunctions' => ['void', 'library'=>'string'], + 'Saxon\SaxonProcessor::setConfigurationProperty' => ['void', 'name'=>'string', 'value'=>'string'], + 'Saxon\SaxonProcessor::setResourceDirectory' => ['void', 'dir'=>'string'], + 'Saxon\SaxonProcessor::setcwd' => ['void', 'cwd'=>'string'], + 'Saxon\SaxonProcessor::version' => ['string'], + 'Saxon\SchemaValidator::clearParameters' => ['void'], + 'Saxon\SchemaValidator::clearProperties' => ['void'], + 'Saxon\SchemaValidator::exceptionClear' => ['void'], + 'Saxon\SchemaValidator::getErrorCode' => ['string', 'i'=>'int'], + 'Saxon\SchemaValidator::getErrorMessage' => ['string', 'i'=>'int'], + 'Saxon\SchemaValidator::getExceptionCount' => ['int'], + 'Saxon\SchemaValidator::getValidationReport' => ['Saxon\XdmNode'], + 'Saxon\SchemaValidator::registerSchemaFromFile' => ['void', 'fileName'=>'string'], + 'Saxon\SchemaValidator::registerSchemaFromString' => ['void', 'schemaStr'=>'string'], + 'Saxon\SchemaValidator::setOutputFile' => ['void', 'fileName'=>'string'], + 'Saxon\SchemaValidator::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], + 'Saxon\SchemaValidator::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], + 'Saxon\SchemaValidator::setSourceNode' => ['void', 'node'=>'Saxon\XdmNode'], + 'Saxon\SchemaValidator::validate' => ['void', 'filename='=>'?string'], + 'Saxon\SchemaValidator::validateToNode' => ['Saxon\XdmNode', 'filename='=>'?string'], + 'Saxon\XPathProcessor::clearParameters' => ['void'], + 'Saxon\XPathProcessor::clearProperties' => ['void'], + 'Saxon\XPathProcessor::declareNamespace' => ['void', 'prefix'=>'', 'namespace'=>''], + 'Saxon\XPathProcessor::effectiveBooleanValue' => ['bool', 'xpathStr'=>'string'], + 'Saxon\XPathProcessor::evaluate' => ['Saxon\XdmValue', 'xpathStr'=>'string'], + 'Saxon\XPathProcessor::evaluateSingle' => ['Saxon\XdmItem', 'xpathStr'=>'string'], + 'Saxon\XPathProcessor::exceptionClear' => ['void'], + 'Saxon\XPathProcessor::getErrorCode' => ['string', 'i'=>'int'], + 'Saxon\XPathProcessor::getErrorMessage' => ['string', 'i'=>'int'], + 'Saxon\XPathProcessor::getExceptionCount' => ['int'], + 'Saxon\XPathProcessor::setBaseURI' => ['void', 'uri'=>'string'], + 'Saxon\XPathProcessor::setContextFile' => ['void', 'fileName'=>'string'], + 'Saxon\XPathProcessor::setContextItem' => ['void', 'item'=>'Saxon\XdmItem'], + 'Saxon\XPathProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], + 'Saxon\XPathProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], + 'Saxon\XQueryProcessor::clearParameters' => ['void'], + 'Saxon\XQueryProcessor::clearProperties' => ['void'], + 'Saxon\XQueryProcessor::declareNamespace' => ['void', 'prefix'=>'string', 'namespace'=>'string'], + 'Saxon\XQueryProcessor::exceptionClear' => ['void'], + 'Saxon\XQueryProcessor::getErrorCode' => ['string', 'i'=>'int'], + 'Saxon\XQueryProcessor::getErrorMessage' => ['string', 'i'=>'int'], + 'Saxon\XQueryProcessor::getExceptionCount' => ['int'], + 'Saxon\XQueryProcessor::runQueryToFile' => ['void', 'outfilename'=>'string'], + 'Saxon\XQueryProcessor::runQueryToString' => ['?string'], + 'Saxon\XQueryProcessor::runQueryToValue' => ['?Saxon\XdmValue'], + 'Saxon\XQueryProcessor::setContextItem' => ['void', 'object'=>'Saxon\XdmAtomicValue|Saxon\XdmItem|Saxon\XdmNode|Saxon\XdmValue'], + 'Saxon\XQueryProcessor::setContextItemFromFile' => ['void', 'fileName'=>'string'], + 'Saxon\XQueryProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], + 'Saxon\XQueryProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], + 'Saxon\XQueryProcessor::setQueryBaseURI' => ['void', 'uri'=>'string'], + 'Saxon\XQueryProcessor::setQueryContent' => ['void', 'string'=>'string'], + 'Saxon\XQueryProcessor::setQueryFile' => ['void', 'filename'=>'string'], + 'Saxon\XQueryProcessor::setQueryItem' => ['void', 'item'=>'Saxon\XdmItem'], + 'Saxon\XdmAtomicValue::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], + 'Saxon\XdmAtomicValue::getAtomicValue' => ['?Saxon\XdmAtomicValue'], + 'Saxon\XdmAtomicValue::getBooleanValue' => ['bool'], + 'Saxon\XdmAtomicValue::getDoubleValue' => ['float'], + 'Saxon\XdmAtomicValue::getHead' => ['Saxon\XdmItem'], + 'Saxon\XdmAtomicValue::getLongValue' => ['int'], + 'Saxon\XdmAtomicValue::getNodeValue' => ['?Saxon\XdmNode'], + 'Saxon\XdmAtomicValue::getStringValue' => ['string'], + 'Saxon\XdmAtomicValue::isAtomic' => ['true'], + 'Saxon\XdmAtomicValue::isNode' => ['bool'], + 'Saxon\XdmAtomicValue::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], + 'Saxon\XdmAtomicValue::size' => ['int'], + 'Saxon\XdmItem::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], + 'Saxon\XdmItem::getAtomicValue' => ['?Saxon\XdmAtomicValue'], + 'Saxon\XdmItem::getHead' => ['Saxon\XdmItem'], + 'Saxon\XdmItem::getNodeValue' => ['?Saxon\XdmNode'], + 'Saxon\XdmItem::getStringValue' => ['string'], + 'Saxon\XdmItem::isAtomic' => ['bool'], + 'Saxon\XdmItem::isNode' => ['bool'], + 'Saxon\XdmItem::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], + 'Saxon\XdmItem::size' => ['int'], + 'Saxon\XdmNode::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], + 'Saxon\XdmNode::getAtomicValue' => ['?Saxon\XdmAtomicValue'], + 'Saxon\XdmNode::getAttributeCount' => ['int'], + 'Saxon\XdmNode::getAttributeNode' => ['?Saxon\XdmNode', 'index'=>'int'], + 'Saxon\XdmNode::getAttributeValue' => ['?string', 'index'=>'int'], + 'Saxon\XdmNode::getChildCount' => ['int'], + 'Saxon\XdmNode::getChildNode' => ['?Saxon\XdmNode', 'index'=>'int'], + 'Saxon\XdmNode::getHead' => ['Saxon\XdmItem'], + 'Saxon\XdmNode::getNodeKind' => ['int'], + 'Saxon\XdmNode::getNodeName' => ['string'], + 'Saxon\XdmNode::getNodeValue' => ['?Saxon\XdmNode'], + 'Saxon\XdmNode::getParent' => ['?Saxon\XdmNode'], + 'Saxon\XdmNode::getStringValue' => ['string'], + 'Saxon\XdmNode::isAtomic' => ['false'], + 'Saxon\XdmNode::isNode' => ['bool'], + 'Saxon\XdmNode::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], + 'Saxon\XdmNode::size' => ['int'], + 'Saxon\XdmValue::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], + 'Saxon\XdmValue::getHead' => ['Saxon\XdmItem'], + 'Saxon\XdmValue::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], + 'Saxon\XdmValue::size' => ['int'], + 'Saxon\XsltProcessor::clearParameters' => ['void'], + 'Saxon\XsltProcessor::clearProperties' => ['void'], + 'Saxon\XsltProcessor::compileFromFile' => ['void', 'fileName'=>'string'], + 'Saxon\XsltProcessor::compileFromString' => ['void', 'string'=>'string'], + 'Saxon\XsltProcessor::compileFromValue' => ['void', 'node'=>'Saxon\XdmNode'], + 'Saxon\XsltProcessor::exceptionClear' => ['void'], + 'Saxon\XsltProcessor::getErrorCode' => ['string', 'i'=>'int'], + 'Saxon\XsltProcessor::getErrorMessage' => ['string', 'i'=>'int'], + 'Saxon\XsltProcessor::getExceptionCount' => ['int'], + 'Saxon\XsltProcessor::setOutputFile' => ['void', 'fileName'=>'string'], + 'Saxon\XsltProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], + 'Saxon\XsltProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], + 'Saxon\XsltProcessor::setSourceFromFile' => ['void', 'filename'=>'string'], + 'Saxon\XsltProcessor::setSourceFromXdmValue' => ['void', 'value'=>'Saxon\XdmValue'], + 'Saxon\XsltProcessor::transformFileToFile' => ['void', 'sourceFileName'=>'string', 'stylesheetFileName'=>'string', 'outputfileName'=>'string'], + 'Saxon\XsltProcessor::transformFileToString' => ['?string', 'sourceFileName'=>'string', 'stylesheetFileName'=>'string'], + 'Saxon\XsltProcessor::transformFileToValue' => ['Saxon\XdmValue', 'fileName'=>'string'], + 'Saxon\XsltProcessor::transformToFile' => ['void'], + 'Saxon\XsltProcessor::transformToString' => ['string'], + 'Saxon\XsltProcessor::transformToValue' => ['?Saxon\XdmValue'], + 'SeasLog::__destruct' => ['void'], + 'SeasLog::alert' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], + 'SeasLog::analyzerCount' => ['mixed', 'level'=>'string', 'log_path='=>'string', 'key_word='=>'string'], + 'SeasLog::analyzerDetail' => ['mixed', 'level'=>'string', 'log_path='=>'string', 'key_word='=>'string', 'start='=>'int', 'limit='=>'int', 'order='=>'int'], + 'SeasLog::closeLoggerStream' => ['bool', 'model'=>'int', 'logger'=>'string'], + 'SeasLog::critical' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], + 'SeasLog::debug' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], + 'SeasLog::emergency' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], + 'SeasLog::error' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], + 'SeasLog::flushBuffer' => ['bool'], + 'SeasLog::getBasePath' => ['string'], + 'SeasLog::getBuffer' => ['array'], + 'SeasLog::getBufferEnabled' => ['bool'], + 'SeasLog::getDatetimeFormat' => ['string'], + 'SeasLog::getLastLogger' => ['string'], + 'SeasLog::getRequestID' => ['string'], + 'SeasLog::getRequestVariable' => ['bool', 'key'=>'int'], + 'SeasLog::info' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], + 'SeasLog::log' => ['bool', 'level'=>'string', 'message='=>'string', 'content='=>'array', 'logger='=>'string'], + 'SeasLog::notice' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], + 'SeasLog::setBasePath' => ['bool', 'base_path'=>'string'], + 'SeasLog::setDatetimeFormat' => ['bool', 'format'=>'string'], + 'SeasLog::setLogger' => ['bool', 'logger'=>'string'], + 'SeasLog::setRequestID' => ['bool', 'request_id'=>'string'], + 'SeasLog::setRequestVariable' => ['bool', 'key'=>'int', 'value'=>'string'], + 'SeasLog::warning' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], + 'SeekableIterator::__construct' => ['void'], + 'SeekableIterator::current' => ['mixed'], + 'SeekableIterator::key' => ['int|string'], + 'SeekableIterator::next' => ['void'], + 'SeekableIterator::rewind' => ['void'], + 'SeekableIterator::seek' => ['void', 'position'=>'int'], + 'SeekableIterator::valid' => ['bool'], + 'Serializable::__construct' => ['void'], + 'Serializable::serialize' => ['?string'], + 'Serializable::unserialize' => ['void', 'serialized'=>'string'], + 'ServerRequest::withInput' => ['ServerRequest', 'input'=>'mixed'], + 'ServerRequest::withParam' => ['ServerRequest', 'key'=>'int|string', 'value'=>'mixed'], + 'ServerRequest::withParams' => ['ServerRequest', 'params'=>'mixed'], + 'ServerRequest::withUrl' => ['ServerRequest', 'url'=>'array'], + 'ServerRequest::withoutParams' => ['ServerRequest', 'params'=>'int|string'], + 'ServerResponse::addHeader' => ['void', 'label'=>'string', 'value'=>'string'], + 'ServerResponse::date' => ['string', 'date'=>'string|DateTimeInterface'], + 'ServerResponse::getHeader' => ['string', 'label'=>'string'], + 'ServerResponse::getHeaders' => ['string[]'], + 'ServerResponse::getStatus' => ['int'], + 'ServerResponse::getVersion' => ['string'], + 'ServerResponse::setHeader' => ['void', 'label'=>'string', 'value'=>'string'], + 'ServerResponse::setStatus' => ['void', 'status'=>'int'], + 'ServerResponse::setVersion' => ['void', 'version'=>'string'], + 'SessionHandler::close' => ['bool'], + 'SessionHandler::create_sid' => ['char'], + 'SessionHandler::destroy' => ['bool', 'id'=>'string'], + 'SessionHandler::gc' => ['bool', 'maxlifetime'=>'int'], + 'SessionHandler::open' => ['bool', 'save_path'=>'string', 'session_name'=>'string'], + 'SessionHandler::read' => ['string', 'id'=>'string'], + 'SessionHandler::updateTimestamp' => ['bool', 'session_id'=>'string', 'session_data'=>'string'], + 'SessionHandler::validateId' => ['bool', 'session_id'=>'string'], + 'SessionHandler::write' => ['bool', 'id'=>'string', 'data'=>'string'], + 'SessionHandlerInterface::close' => ['bool'], + 'SessionHandlerInterface::destroy' => ['bool', 'id'=>'string'], + 'SessionHandlerInterface::gc' => ['int|false', 'max_lifetime'=>'int'], + 'SessionHandlerInterface::open' => ['bool', 'path'=>'string', 'name'=>'string'], + 'SessionHandlerInterface::read' => ['string|false', 'id'=>'string'], + 'SessionHandlerInterface::write' => ['bool', 'id'=>'string', 'data'=>'string'], + 'SessionIdInterface::create_sid' => ['string'], + 'SessionUpdateTimestampHandler::updateTimestamp' => ['bool', 'id'=>'string', 'data'=>'string'], + 'SessionUpdateTimestampHandler::validateId' => ['char', 'id'=>'string'], + 'SessionUpdateTimestampHandlerInterface::updateTimestamp' => ['bool', 'key'=>'string', 'value'=>'string'], + 'SessionUpdateTimestampHandlerInterface::validateId' => ['bool', 'key'=>'string'], + 'SimpleXMLElement::__construct' => ['void', 'data'=>'string', 'options='=>'int', 'data_is_url='=>'bool', 'ns='=>'string', 'is_prefix='=>'bool'], + 'SimpleXMLElement::__get' => ['SimpleXMLElement', 'name'=>'string'], + 'SimpleXMLElement::__toString' => ['string'], + 'SimpleXMLElement::addAttribute' => ['void', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], + 'SimpleXMLElement::addChild' => ['SimpleXMLElement', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], + 'SimpleXMLElement::asXML' => ['bool', 'filename'=>'string'], + 'SimpleXMLElement::asXML\'1' => ['string|false'], + 'SimpleXMLElement::attributes' => ['?SimpleXMLElement', 'ns='=>'string', 'is_prefix='=>'bool'], + 'SimpleXMLElement::children' => ['SimpleXMLElement', 'ns='=>'string', 'is_prefix='=>'bool'], + 'SimpleXMLElement::count' => ['int'], + 'SimpleXMLElement::getDocNamespaces' => ['string[]', 'recursive='=>'bool', 'from_root='=>'bool'], + 'SimpleXMLElement::getName' => ['string'], + 'SimpleXMLElement::getNamespaces' => ['string[]', 'recursive='=>'bool'], + 'SimpleXMLElement::offsetExists' => ['bool', 'offset'=>'int|string'], + 'SimpleXMLElement::offsetGet' => ['SimpleXMLElement', 'offset'=>'int|string'], + 'SimpleXMLElement::offsetSet' => ['void', 'offset'=>'int|string', 'value'=>'mixed'], + 'SimpleXMLElement::offsetUnset' => ['void', 'offset'=>'int|string'], + 'SimpleXMLElement::registerXPathNamespace' => ['bool', 'prefix'=>'string', 'ns'=>'string'], + 'SimpleXMLElement::saveXML' => ['mixed', 'filename='=>'string'], + 'SimpleXMLElement::xpath' => ['SimpleXMLElement[]|false', 'path'=>'string'], + 'SimpleXMLIterator::current' => ['?SimpleXMLIterator'], + 'SimpleXMLIterator::getChildren' => ['SimpleXMLIterator'], + 'SimpleXMLIterator::hasChildren' => ['bool'], + 'SimpleXMLIterator::key' => ['string|false'], + 'SimpleXMLIterator::next' => ['void'], + 'SimpleXMLIterator::rewind' => ['void'], + 'SimpleXMLIterator::valid' => ['bool'], + 'SoapClient::SoapClient' => ['object', 'wsdl'=>'mixed', 'options='=>'array|null'], + 'SoapClient::__call' => ['', 'function_name'=>'string', 'arguments'=>'array'], + 'SoapClient::__construct' => ['void', 'wsdl'=>'mixed', 'options='=>'array|null'], + 'SoapClient::__doRequest' => ['?string', 'request'=>'string', 'location'=>'string', 'action'=>'string', 'version'=>'int', 'one_way='=>'int'], + 'SoapClient::__getCookies' => ['array'], + 'SoapClient::__getFunctions' => ['?array'], + 'SoapClient::__getLastRequest' => ['?string'], + 'SoapClient::__getLastRequestHeaders' => ['?string'], + 'SoapClient::__getLastResponse' => ['?string'], + 'SoapClient::__getLastResponseHeaders' => ['?string'], + 'SoapClient::__getTypes' => ['?array'], + 'SoapClient::__setCookie' => ['', 'name'=>'string', 'value='=>'string'], + 'SoapClient::__setLocation' => ['string', 'new_location='=>'string'], + 'SoapClient::__setSoapHeaders' => ['bool', 'soapheaders='=>''], + 'SoapClient::__soapCall' => ['', 'function_name'=>'string', 'arguments'=>'array', 'options='=>'array', 'input_headers='=>'SoapHeader|array', '&w_output_headers='=>'array'], + 'SoapFault::SoapFault' => ['object', 'faultcode'=>'string', 'faultstring'=>'string', 'faultactor='=>'?string', 'detail='=>'?mixed', 'faultname='=>'?string', 'headerfault='=>'?mixed'], + 'SoapFault::__clone' => ['void'], + 'SoapFault::__construct' => ['void', 'code'=>'array|string|null', 'string'=>'string', 'actor='=>'?string', 'details='=>'?mixed', 'name='=>'?string', 'headerFault='=>'?mixed'], + 'SoapFault::__toString' => ['string'], + 'SoapFault::__wakeup' => ['void'], + 'SoapFault::getCode' => ['int'], + 'SoapFault::getFile' => ['string'], + 'SoapFault::getLine' => ['int'], + 'SoapFault::getMessage' => ['string'], + 'SoapFault::getPrevious' => ['?Exception|?Throwable'], + 'SoapFault::getTrace' => ['list\',args?:array}>'], + 'SoapFault::getTraceAsString' => ['string'], + 'SoapHeader::SoapHeader' => ['object', 'namespace'=>'string', 'name'=>'string', 'data='=>'mixed', 'mustunderstand='=>'bool', 'actor='=>'string'], + 'SoapHeader::__construct' => ['void', 'namespace'=>'string', 'name'=>'string', 'data='=>'mixed', 'mustunderstand='=>'bool', 'actor='=>'string'], + 'SoapParam::SoapParam' => ['object', 'data'=>'mixed', 'name'=>'string'], + 'SoapParam::__construct' => ['void', 'data'=>'mixed', 'name'=>'string'], + 'SoapServer::SoapServer' => ['object', 'wsdl'=>'?string', 'options='=>'array'], + 'SoapServer::__construct' => ['void', 'wsdl'=>'?string', 'options='=>'array'], + 'SoapServer::addFunction' => ['void', 'functions'=>'mixed'], + 'SoapServer::addSoapHeader' => ['void', 'object'=>'SoapHeader'], + 'SoapServer::fault' => ['void', 'code'=>'string', 'string'=>'string', 'actor='=>'string', 'details='=>'string', 'name='=>'string'], + 'SoapServer::getFunctions' => ['array'], + 'SoapServer::handle' => ['void', 'soap_request='=>'string'], + 'SoapServer::setClass' => ['void', 'class_name'=>'string', '...args='=>'mixed'], + 'SoapServer::setObject' => ['void', 'object'=>'object'], + 'SoapServer::setPersistence' => ['void', 'mode'=>'int'], + 'SoapVar::SoapVar' => ['object', 'data'=>'mixed', 'encoding'=>'int', 'type_name='=>'string|null', 'type_namespace='=>'string|null', 'node_name='=>'string|null', 'node_namespace='=>'string|null'], + 'SoapVar::__construct' => ['void', 'data'=>'mixed', 'encoding'=>'int', 'type_name='=>'string|null', 'type_namespace='=>'string|null', 'node_name='=>'string|null', 'node_namespace='=>'string|null'], + 'Sodium\add' => ['void', '&left'=>'string', 'right'=>'string'], + 'Sodium\bin2hex' => ['string', 'binary'=>'string'], + 'Sodium\compare' => ['int', 'left'=>'string', 'right'=>'string'], + 'Sodium\crypto_aead_aes256gcm_decrypt' => ['string|false', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], + 'Sodium\crypto_aead_aes256gcm_encrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], + 'Sodium\crypto_aead_aes256gcm_is_available' => ['bool'], + 'Sodium\crypto_aead_chacha20poly1305_decrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], + 'Sodium\crypto_aead_chacha20poly1305_encrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], + 'Sodium\crypto_auth' => ['string', 'msg'=>'string', 'key'=>'string'], + 'Sodium\crypto_auth_verify' => ['bool', 'mac'=>'string', 'msg'=>'string', 'key'=>'string'], + 'Sodium\crypto_box' => ['string', 'msg'=>'string', 'nonce'=>'string', 'keypair'=>'string'], + 'Sodium\crypto_box_keypair' => ['string'], + 'Sodium\crypto_box_keypair_from_secretkey_and_publickey' => ['string', 'secretkey'=>'string', 'publickey'=>'string'], + 'Sodium\crypto_box_open' => ['string', 'msg'=>'string', 'nonce'=>'string', 'keypair'=>'string'], + 'Sodium\crypto_box_publickey' => ['string', 'keypair'=>'string'], + 'Sodium\crypto_box_publickey_from_secretkey' => ['string', 'secretkey'=>'string'], + 'Sodium\crypto_box_seal' => ['string', 'message'=>'string', 'publickey'=>'string'], + 'Sodium\crypto_box_seal_open' => ['string', 'encrypted'=>'string', 'keypair'=>'string'], + 'Sodium\crypto_box_secretkey' => ['string', 'keypair'=>'string'], + 'Sodium\crypto_box_seed_keypair' => ['string', 'seed'=>'string'], + 'Sodium\crypto_generichash' => ['string', 'input'=>'string', 'key='=>'string', 'length='=>'int'], + 'Sodium\crypto_generichash_final' => ['string', 'state'=>'string', 'length='=>'int'], + 'Sodium\crypto_generichash_init' => ['string', 'key='=>'string', 'length='=>'int'], + 'Sodium\crypto_generichash_update' => ['bool', '&hashState'=>'string', 'append'=>'string'], + 'Sodium\crypto_kx' => ['string', 'secretkey'=>'string', 'publickey'=>'string', 'client_publickey'=>'string', 'server_publickey'=>'string'], + 'Sodium\crypto_pwhash' => ['string', 'out_len'=>'int', 'passwd'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'Sodium\crypto_pwhash_scryptsalsa208sha256' => ['string', 'out_len'=>'int', 'passwd'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'Sodium\crypto_pwhash_scryptsalsa208sha256_str' => ['string', 'passwd'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'Sodium\crypto_pwhash_scryptsalsa208sha256_str_verify' => ['bool', 'hash'=>'string', 'passwd'=>'string'], + 'Sodium\crypto_pwhash_str' => ['string', 'passwd'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], + 'Sodium\crypto_pwhash_str_verify' => ['bool', 'hash'=>'string', 'passwd'=>'string'], + 'Sodium\crypto_scalarmult' => ['string', 'ecdhA'=>'string', 'ecdhB'=>'string'], + 'Sodium\crypto_scalarmult_base' => ['string', 'sk'=>'string'], + 'Sodium\crypto_secretbox' => ['string', 'plaintext'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'Sodium\crypto_secretbox_open' => ['string', 'ciphertext'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'Sodium\crypto_shorthash' => ['string', 'message'=>'string', 'key'=>'string'], + 'Sodium\crypto_sign' => ['string', 'message'=>'string', 'secretkey'=>'string'], + 'Sodium\crypto_sign_detached' => ['string', 'message'=>'string', 'secretkey'=>'string'], + 'Sodium\crypto_sign_ed25519_pk_to_curve25519' => ['string', 'sign_pk'=>'string'], + 'Sodium\crypto_sign_ed25519_sk_to_curve25519' => ['string', 'sign_sk'=>'string'], + 'Sodium\crypto_sign_keypair' => ['string'], + 'Sodium\crypto_sign_keypair_from_secretkey_and_publickey' => ['string', 'secretkey'=>'string', 'publickey'=>'string'], + 'Sodium\crypto_sign_open' => ['string|false', 'signed_message'=>'string', 'publickey'=>'string'], + 'Sodium\crypto_sign_publickey' => ['string', 'keypair'=>'string'], + 'Sodium\crypto_sign_publickey_from_secretkey' => ['string', 'secretkey'=>'string'], + 'Sodium\crypto_sign_secretkey' => ['string', 'keypair'=>'string'], + 'Sodium\crypto_sign_seed_keypair' => ['string', 'seed'=>'string'], + 'Sodium\crypto_sign_verify_detached' => ['bool', 'signature'=>'string', 'msg'=>'string', 'publickey'=>'string'], + 'Sodium\crypto_stream' => ['string', 'length'=>'int', 'nonce'=>'string', 'key'=>'string'], + 'Sodium\crypto_stream_xor' => ['string', 'plaintext'=>'string', 'nonce'=>'string', 'key'=>'string'], + 'Sodium\hex2bin' => ['string', 'hex'=>'string'], + 'Sodium\increment' => ['string', '&nonce'=>'string'], + 'Sodium\library_version_major' => ['int'], + 'Sodium\library_version_minor' => ['int'], + 'Sodium\memcmp' => ['int', 'left'=>'string', 'right'=>'string'], + 'Sodium\memzero' => ['void', '&target'=>'string'], + 'Sodium\randombytes_buf' => ['string', 'length'=>'int'], + 'Sodium\randombytes_random16' => ['int|string'], + 'Sodium\randombytes_uniform' => ['int', 'upperBoundNonInclusive'=>'int'], + 'Sodium\version_string' => ['string'], + 'SolrClient::__construct' => ['void', 'clientOptions'=>'array'], + 'SolrClient::__destruct' => ['void'], + 'SolrClient::addDocument' => ['SolrUpdateResponse', 'doc'=>'SolrInputDocument', 'allowdups='=>'bool', 'commitwithin='=>'int'], + 'SolrClient::addDocuments' => ['SolrUpdateResponse', 'docs'=>'array', 'allowdups='=>'bool', 'commitwithin='=>'int'], + 'SolrClient::commit' => ['SolrUpdateResponse', 'maxsegments='=>'int', 'waitflush='=>'bool', 'waitsearcher='=>'bool'], + 'SolrClient::deleteById' => ['SolrUpdateResponse', 'id'=>'string'], + 'SolrClient::deleteByIds' => ['SolrUpdateResponse', 'ids'=>'array'], + 'SolrClient::deleteByQueries' => ['SolrUpdateResponse', 'queries'=>'array'], + 'SolrClient::deleteByQuery' => ['SolrUpdateResponse', 'query'=>'string'], + 'SolrClient::getById' => ['SolrQueryResponse', 'id'=>'string'], + 'SolrClient::getByIds' => ['SolrQueryResponse', 'ids'=>'array'], + 'SolrClient::getDebug' => ['string'], + 'SolrClient::getOptions' => ['array'], + 'SolrClient::optimize' => ['SolrUpdateResponse', 'maxsegments='=>'int', 'waitflush='=>'bool', 'waitsearcher='=>'bool'], + 'SolrClient::ping' => ['SolrPingResponse'], + 'SolrClient::query' => ['SolrQueryResponse', 'query'=>'SolrParams'], + 'SolrClient::request' => ['SolrUpdateResponse', 'raw_request'=>'string'], + 'SolrClient::rollback' => ['SolrUpdateResponse'], + 'SolrClient::setResponseWriter' => ['void', 'responsewriter'=>'string'], + 'SolrClient::setServlet' => ['bool', 'type'=>'int', 'value'=>'string'], + 'SolrClient::system' => ['SolrGenericResponse'], + 'SolrClient::threads' => ['SolrGenericResponse'], + 'SolrClientException::__clone' => ['void'], + 'SolrClientException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'SolrClientException::__toString' => ['string'], + 'SolrClientException::__wakeup' => ['void'], + 'SolrClientException::getCode' => ['int'], + 'SolrClientException::getFile' => ['string'], + 'SolrClientException::getInternalInfo' => ['array'], + 'SolrClientException::getLine' => ['int'], + 'SolrClientException::getMessage' => ['string'], + 'SolrClientException::getPrevious' => ['?Exception|?Throwable'], + 'SolrClientException::getTrace' => ['list\',args?:array}>'], + 'SolrClientException::getTraceAsString' => ['string'], + 'SolrCollapseFunction::__construct' => ['void', 'field'=>'string'], + 'SolrCollapseFunction::__toString' => ['string'], + 'SolrCollapseFunction::getField' => ['string'], + 'SolrCollapseFunction::getHint' => ['string'], + 'SolrCollapseFunction::getMax' => ['string'], + 'SolrCollapseFunction::getMin' => ['string'], + 'SolrCollapseFunction::getNullPolicy' => ['string'], + 'SolrCollapseFunction::getSize' => ['int'], + 'SolrCollapseFunction::setField' => ['SolrCollapseFunction', 'fieldName'=>'string'], + 'SolrCollapseFunction::setHint' => ['SolrCollapseFunction', 'hint'=>'string'], + 'SolrCollapseFunction::setMax' => ['SolrCollapseFunction', 'max'=>'string'], + 'SolrCollapseFunction::setMin' => ['SolrCollapseFunction', 'min'=>'string'], + 'SolrCollapseFunction::setNullPolicy' => ['SolrCollapseFunction', 'nullPolicy'=>'string'], + 'SolrCollapseFunction::setSize' => ['SolrCollapseFunction', 'size'=>'int'], + 'SolrDisMaxQuery::__construct' => ['void', 'q='=>'string'], + 'SolrDisMaxQuery::__destruct' => ['void'], + 'SolrDisMaxQuery::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], + 'SolrDisMaxQuery::addBigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], + 'SolrDisMaxQuery::addBoostQuery' => ['SolrDisMaxQuery', 'field'=>'string', 'value'=>'string', 'boost='=>'string'], + 'SolrDisMaxQuery::addExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], + 'SolrDisMaxQuery::addExpandSortField' => ['SolrQuery', 'field'=>'string', 'order'=>'string'], + 'SolrDisMaxQuery::addFacetDateField' => ['SolrQuery', 'dateField'=>'string'], + 'SolrDisMaxQuery::addFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::addFacetField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::addFacetQuery' => ['SolrQuery', 'facetQuery'=>'string'], + 'SolrDisMaxQuery::addField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::addFilterQuery' => ['SolrQuery', 'fq'=>'string'], + 'SolrDisMaxQuery::addGroupField' => ['SolrQuery', 'value'=>'string'], + 'SolrDisMaxQuery::addGroupFunction' => ['SolrQuery', 'value'=>'string'], + 'SolrDisMaxQuery::addGroupQuery' => ['SolrQuery', 'value'=>'string'], + 'SolrDisMaxQuery::addGroupSortField' => ['SolrQuery', 'field'=>'string', 'order'=>'int'], + 'SolrDisMaxQuery::addHighlightField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::addMltField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::addMltQueryField' => ['SolrQuery', 'field'=>'string', 'boost'=>'float'], + 'SolrDisMaxQuery::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], + 'SolrDisMaxQuery::addPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], + 'SolrDisMaxQuery::addQueryField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost='=>'string'], + 'SolrDisMaxQuery::addSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], + 'SolrDisMaxQuery::addStatsFacet' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::addStatsField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::addTrigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], + 'SolrDisMaxQuery::addUserField' => ['SolrDisMaxQuery', 'field'=>'string'], + 'SolrDisMaxQuery::collapse' => ['SolrQuery', 'collapseFunction'=>'SolrCollapseFunction'], + 'SolrDisMaxQuery::get' => ['mixed', 'param_name'=>'string'], + 'SolrDisMaxQuery::getExpand' => ['bool'], + 'SolrDisMaxQuery::getExpandFilterQueries' => ['array'], + 'SolrDisMaxQuery::getExpandQuery' => ['array'], + 'SolrDisMaxQuery::getExpandRows' => ['int'], + 'SolrDisMaxQuery::getExpandSortFields' => ['array'], + 'SolrDisMaxQuery::getFacet' => ['bool'], + 'SolrDisMaxQuery::getFacetDateEnd' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetDateFields' => ['array'], + 'SolrDisMaxQuery::getFacetDateGap' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetDateHardEnd' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetDateOther' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetDateStart' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetFields' => ['array'], + 'SolrDisMaxQuery::getFacetLimit' => ['int', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetMethod' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetMinCount' => ['int', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetMissing' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetOffset' => ['int', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetPrefix' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFacetQueries' => ['string'], + 'SolrDisMaxQuery::getFacetSort' => ['int', 'field_override'=>'string'], + 'SolrDisMaxQuery::getFields' => ['string'], + 'SolrDisMaxQuery::getFilterQueries' => ['string'], + 'SolrDisMaxQuery::getGroup' => ['bool'], + 'SolrDisMaxQuery::getGroupCachePercent' => ['int'], + 'SolrDisMaxQuery::getGroupFacet' => ['bool'], + 'SolrDisMaxQuery::getGroupFields' => ['array'], + 'SolrDisMaxQuery::getGroupFormat' => ['string'], + 'SolrDisMaxQuery::getGroupFunctions' => ['array'], + 'SolrDisMaxQuery::getGroupLimit' => ['int'], + 'SolrDisMaxQuery::getGroupMain' => ['bool'], + 'SolrDisMaxQuery::getGroupNGroups' => ['bool'], + 'SolrDisMaxQuery::getGroupOffset' => ['bool'], + 'SolrDisMaxQuery::getGroupQueries' => ['array'], + 'SolrDisMaxQuery::getGroupSortFields' => ['array'], + 'SolrDisMaxQuery::getGroupTruncate' => ['bool'], + 'SolrDisMaxQuery::getHighlight' => ['bool'], + 'SolrDisMaxQuery::getHighlightAlternateField' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getHighlightFields' => ['array'], + 'SolrDisMaxQuery::getHighlightFormatter' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getHighlightFragmenter' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getHighlightFragsize' => ['int', 'field_override'=>'string'], + 'SolrDisMaxQuery::getHighlightHighlightMultiTerm' => ['bool'], + 'SolrDisMaxQuery::getHighlightMaxAlternateFieldLength' => ['int', 'field_override'=>'string'], + 'SolrDisMaxQuery::getHighlightMaxAnalyzedChars' => ['int'], + 'SolrDisMaxQuery::getHighlightMergeContiguous' => ['bool', 'field_override'=>'string'], + 'SolrDisMaxQuery::getHighlightRegexMaxAnalyzedChars' => ['int'], + 'SolrDisMaxQuery::getHighlightRegexPattern' => ['string'], + 'SolrDisMaxQuery::getHighlightRegexSlop' => ['float'], + 'SolrDisMaxQuery::getHighlightRequireFieldMatch' => ['bool'], + 'SolrDisMaxQuery::getHighlightSimplePost' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getHighlightSimplePre' => ['string', 'field_override'=>'string'], + 'SolrDisMaxQuery::getHighlightSnippets' => ['int', 'field_override'=>'string'], + 'SolrDisMaxQuery::getHighlightUsePhraseHighlighter' => ['bool'], + 'SolrDisMaxQuery::getMlt' => ['bool'], + 'SolrDisMaxQuery::getMltBoost' => ['bool'], + 'SolrDisMaxQuery::getMltCount' => ['int'], + 'SolrDisMaxQuery::getMltFields' => ['array'], + 'SolrDisMaxQuery::getMltMaxNumQueryTerms' => ['int'], + 'SolrDisMaxQuery::getMltMaxNumTokens' => ['int'], + 'SolrDisMaxQuery::getMltMaxWordLength' => ['int'], + 'SolrDisMaxQuery::getMltMinDocFrequency' => ['int'], + 'SolrDisMaxQuery::getMltMinTermFrequency' => ['int'], + 'SolrDisMaxQuery::getMltMinWordLength' => ['int'], + 'SolrDisMaxQuery::getMltQueryFields' => ['array'], + 'SolrDisMaxQuery::getParam' => ['mixed', 'param_name'=>'string'], + 'SolrDisMaxQuery::getParams' => ['array'], + 'SolrDisMaxQuery::getPreparedParams' => ['array'], + 'SolrDisMaxQuery::getQuery' => ['string'], + 'SolrDisMaxQuery::getRows' => ['int'], + 'SolrDisMaxQuery::getSortFields' => ['array'], + 'SolrDisMaxQuery::getStart' => ['int'], + 'SolrDisMaxQuery::getStats' => ['bool'], + 'SolrDisMaxQuery::getStatsFacets' => ['array'], + 'SolrDisMaxQuery::getStatsFields' => ['array'], + 'SolrDisMaxQuery::getTerms' => ['bool'], + 'SolrDisMaxQuery::getTermsField' => ['string'], + 'SolrDisMaxQuery::getTermsIncludeLowerBound' => ['bool'], + 'SolrDisMaxQuery::getTermsIncludeUpperBound' => ['bool'], + 'SolrDisMaxQuery::getTermsLimit' => ['int'], + 'SolrDisMaxQuery::getTermsLowerBound' => ['string'], + 'SolrDisMaxQuery::getTermsMaxCount' => ['int'], + 'SolrDisMaxQuery::getTermsMinCount' => ['int'], + 'SolrDisMaxQuery::getTermsPrefix' => ['string'], + 'SolrDisMaxQuery::getTermsReturnRaw' => ['bool'], + 'SolrDisMaxQuery::getTermsSort' => ['int'], + 'SolrDisMaxQuery::getTermsUpperBound' => ['string'], + 'SolrDisMaxQuery::getTimeAllowed' => ['int'], + 'SolrDisMaxQuery::removeBigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeBoostQuery' => ['SolrDisMaxQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], + 'SolrDisMaxQuery::removeExpandSortField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeFacetDateField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::removeFacetField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeFacetQuery' => ['SolrQuery', 'value'=>'string'], + 'SolrDisMaxQuery::removeField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeFilterQuery' => ['SolrQuery', 'fq'=>'string'], + 'SolrDisMaxQuery::removeHighlightField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeMltField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeMltQueryField' => ['SolrQuery', 'queryField'=>'string'], + 'SolrDisMaxQuery::removePhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeQueryField' => ['SolrDisMaxQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeSortField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeStatsFacet' => ['SolrQuery', 'value'=>'string'], + 'SolrDisMaxQuery::removeStatsField' => ['SolrQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeTrigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], + 'SolrDisMaxQuery::removeUserField' => ['SolrDisMaxQuery', 'field'=>'string'], + 'SolrDisMaxQuery::serialize' => ['string'], + 'SolrDisMaxQuery::set' => ['SolrParams', 'name'=>'string', 'value'=>''], + 'SolrDisMaxQuery::setBigramPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], + 'SolrDisMaxQuery::setBigramPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], + 'SolrDisMaxQuery::setBoostFunction' => ['SolrDisMaxQuery', 'function'=>'string'], + 'SolrDisMaxQuery::setBoostQuery' => ['SolrDisMaxQuery', 'q'=>'string'], + 'SolrDisMaxQuery::setEchoHandler' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setEchoParams' => ['SolrQuery', 'type'=>'string'], + 'SolrDisMaxQuery::setExpand' => ['SolrQuery', 'value'=>'bool'], + 'SolrDisMaxQuery::setExpandQuery' => ['SolrQuery', 'q'=>'string'], + 'SolrDisMaxQuery::setExpandRows' => ['SolrQuery', 'value'=>'int'], + 'SolrDisMaxQuery::setExplainOther' => ['SolrQuery', 'query'=>'string'], + 'SolrDisMaxQuery::setFacet' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setFacetDateEnd' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetDateGap' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetDateHardEnd' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetDateStart' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency'=>'int', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetLimit' => ['SolrQuery', 'limit'=>'int', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetMethod' => ['SolrQuery', 'method'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetMinCount' => ['SolrQuery', 'mincount'=>'int', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetMissing' => ['SolrQuery', 'flag'=>'bool', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetOffset' => ['SolrQuery', 'offset'=>'int', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetPrefix' => ['SolrQuery', 'prefix'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setFacetSort' => ['SolrQuery', 'facetSort'=>'int', 'field_override'=>'string'], + 'SolrDisMaxQuery::setGroup' => ['SolrQuery', 'value'=>'bool'], + 'SolrDisMaxQuery::setGroupCachePercent' => ['SolrQuery', 'percent'=>'int'], + 'SolrDisMaxQuery::setGroupFacet' => ['SolrQuery', 'value'=>'bool'], + 'SolrDisMaxQuery::setGroupFormat' => ['SolrQuery', 'value'=>'string'], + 'SolrDisMaxQuery::setGroupLimit' => ['SolrQuery', 'value'=>'int'], + 'SolrDisMaxQuery::setGroupMain' => ['SolrQuery', 'value'=>'string'], + 'SolrDisMaxQuery::setGroupNGroups' => ['SolrQuery', 'value'=>'bool'], + 'SolrDisMaxQuery::setGroupOffset' => ['SolrQuery', 'value'=>'int'], + 'SolrDisMaxQuery::setGroupTruncate' => ['SolrQuery', 'value'=>'bool'], + 'SolrDisMaxQuery::setHighlight' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setHighlightAlternateField' => ['SolrQuery', 'field'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setHighlightFormatter' => ['SolrQuery', 'formatter'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setHighlightFragsize' => ['SolrQuery', 'size'=>'int', 'field_override'=>'string'], + 'SolrDisMaxQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldLength'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value'=>'int'], + 'SolrDisMaxQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag'=>'bool', 'field_override'=>'string'], + 'SolrDisMaxQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxAnalyzedChars'=>'int'], + 'SolrDisMaxQuery::setHighlightRegexPattern' => ['SolrQuery', 'value'=>'string'], + 'SolrDisMaxQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor'=>'float'], + 'SolrDisMaxQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setHighlightSimplePost' => ['SolrQuery', 'simplePost'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setHighlightSimplePre' => ['SolrQuery', 'simplePre'=>'string', 'field_override'=>'string'], + 'SolrDisMaxQuery::setHighlightSnippets' => ['SolrQuery', 'value'=>'int', 'field_override'=>'string'], + 'SolrDisMaxQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setMinimumMatch' => ['SolrDisMaxQuery', 'value'=>'string'], + 'SolrDisMaxQuery::setMlt' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setMltBoost' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setMltCount' => ['SolrQuery', 'count'=>'int'], + 'SolrDisMaxQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value'=>'int'], + 'SolrDisMaxQuery::setMltMaxNumTokens' => ['SolrQuery', 'value'=>'int'], + 'SolrDisMaxQuery::setMltMaxWordLength' => ['SolrQuery', 'maxWordLength'=>'int'], + 'SolrDisMaxQuery::setMltMinDocFrequency' => ['SolrQuery', 'minDocFrequency'=>'int'], + 'SolrDisMaxQuery::setMltMinTermFrequency' => ['SolrQuery', 'minTermFrequency'=>'int'], + 'SolrDisMaxQuery::setMltMinWordLength' => ['SolrQuery', 'minWordLength'=>'int'], + 'SolrDisMaxQuery::setOmitHeader' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], + 'SolrDisMaxQuery::setPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], + 'SolrDisMaxQuery::setPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], + 'SolrDisMaxQuery::setQuery' => ['SolrQuery', 'query'=>'string'], + 'SolrDisMaxQuery::setQueryAlt' => ['SolrDisMaxQuery', 'q'=>'string'], + 'SolrDisMaxQuery::setQueryPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], + 'SolrDisMaxQuery::setRows' => ['SolrQuery', 'rows'=>'int'], + 'SolrDisMaxQuery::setShowDebugInfo' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setStart' => ['SolrQuery', 'start'=>'int'], + 'SolrDisMaxQuery::setStats' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setTerms' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setTermsField' => ['SolrQuery', 'fieldname'=>'string'], + 'SolrDisMaxQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setTermsLimit' => ['SolrQuery', 'limit'=>'int'], + 'SolrDisMaxQuery::setTermsLowerBound' => ['SolrQuery', 'lowerBound'=>'string'], + 'SolrDisMaxQuery::setTermsMaxCount' => ['SolrQuery', 'frequency'=>'int'], + 'SolrDisMaxQuery::setTermsMinCount' => ['SolrQuery', 'frequency'=>'int'], + 'SolrDisMaxQuery::setTermsPrefix' => ['SolrQuery', 'prefix'=>'string'], + 'SolrDisMaxQuery::setTermsReturnRaw' => ['SolrQuery', 'flag'=>'bool'], + 'SolrDisMaxQuery::setTermsSort' => ['SolrQuery', 'sortType'=>'int'], + 'SolrDisMaxQuery::setTermsUpperBound' => ['SolrQuery', 'upperBound'=>'string'], + 'SolrDisMaxQuery::setTieBreaker' => ['SolrDisMaxQuery', 'tieBreaker'=>'string'], + 'SolrDisMaxQuery::setTimeAllowed' => ['SolrQuery', 'timeAllowed'=>'int'], + 'SolrDisMaxQuery::setTrigramPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], + 'SolrDisMaxQuery::setTrigramPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], + 'SolrDisMaxQuery::setUserFields' => ['SolrDisMaxQuery', 'fields'=>'string'], + 'SolrDisMaxQuery::toString' => ['string', 'url_encode='=>'bool'], + 'SolrDisMaxQuery::unserialize' => ['void', 'serialized'=>'string'], + 'SolrDisMaxQuery::useDisMaxQueryParser' => ['SolrDisMaxQuery'], + 'SolrDisMaxQuery::useEDisMaxQueryParser' => ['SolrDisMaxQuery'], + 'SolrDocument::__clone' => ['void'], + 'SolrDocument::__construct' => ['void'], + 'SolrDocument::__destruct' => ['void'], + 'SolrDocument::__get' => ['SolrDocumentField', 'fieldname'=>'string'], + 'SolrDocument::__isset' => ['bool', 'fieldname'=>'string'], + 'SolrDocument::__set' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string'], + 'SolrDocument::__unset' => ['bool', 'fieldname'=>'string'], + 'SolrDocument::addField' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string'], + 'SolrDocument::clear' => ['bool'], + 'SolrDocument::current' => ['SolrDocumentField'], + 'SolrDocument::deleteField' => ['bool', 'fieldname'=>'string'], + 'SolrDocument::fieldExists' => ['bool', 'fieldname'=>'string'], + 'SolrDocument::getChildDocuments' => ['SolrInputDocument[]'], + 'SolrDocument::getChildDocumentsCount' => ['int'], + 'SolrDocument::getField' => ['SolrDocumentField|false', 'fieldname'=>'string'], + 'SolrDocument::getFieldCount' => ['int|false'], + 'SolrDocument::getFieldNames' => ['array|false'], + 'SolrDocument::getInputDocument' => ['SolrInputDocument'], + 'SolrDocument::hasChildDocuments' => ['bool'], + 'SolrDocument::key' => ['string'], + 'SolrDocument::merge' => ['bool', 'sourcedoc'=>'solrdocument', 'overwrite='=>'bool'], + 'SolrDocument::next' => ['void'], + 'SolrDocument::offsetExists' => ['bool', 'fieldname'=>'string'], + 'SolrDocument::offsetGet' => ['SolrDocumentField', 'fieldname'=>'string'], + 'SolrDocument::offsetSet' => ['void', 'fieldname'=>'string', 'fieldvalue'=>'string'], + 'SolrDocument::offsetUnset' => ['void', 'fieldname'=>'string'], + 'SolrDocument::reset' => ['bool'], + 'SolrDocument::rewind' => ['void'], + 'SolrDocument::serialize' => ['string'], + 'SolrDocument::sort' => ['bool', 'sortorderby'=>'int', 'sortdirection='=>'int'], + 'SolrDocument::toArray' => ['array'], + 'SolrDocument::unserialize' => ['void', 'serialized'=>'string'], + 'SolrDocument::valid' => ['bool'], + 'SolrDocumentField::__construct' => ['void'], + 'SolrDocumentField::__destruct' => ['void'], + 'SolrException::__clone' => ['void'], + 'SolrException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'SolrException::__toString' => ['string'], + 'SolrException::__wakeup' => ['void'], + 'SolrException::getCode' => ['int'], + 'SolrException::getFile' => ['string'], + 'SolrException::getInternalInfo' => ['array'], + 'SolrException::getLine' => ['int'], + 'SolrException::getMessage' => ['string'], + 'SolrException::getPrevious' => ['Exception|Throwable'], + 'SolrException::getTrace' => ['list\',args?:array}>'], + 'SolrException::getTraceAsString' => ['string'], + 'SolrGenericResponse::__construct' => ['void'], + 'SolrGenericResponse::__destruct' => ['void'], + 'SolrGenericResponse::getDigestedResponse' => ['string'], + 'SolrGenericResponse::getHttpStatus' => ['int'], + 'SolrGenericResponse::getHttpStatusMessage' => ['string'], + 'SolrGenericResponse::getRawRequest' => ['string'], + 'SolrGenericResponse::getRawRequestHeaders' => ['string'], + 'SolrGenericResponse::getRawResponse' => ['string'], + 'SolrGenericResponse::getRawResponseHeaders' => ['string'], + 'SolrGenericResponse::getRequestUrl' => ['string'], + 'SolrGenericResponse::getResponse' => ['SolrObject'], + 'SolrGenericResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], + 'SolrGenericResponse::success' => ['bool'], + 'SolrIllegalArgumentException::__clone' => ['void'], + 'SolrIllegalArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'SolrIllegalArgumentException::__toString' => ['string'], + 'SolrIllegalArgumentException::__wakeup' => ['void'], + 'SolrIllegalArgumentException::getCode' => ['int'], + 'SolrIllegalArgumentException::getFile' => ['string'], + 'SolrIllegalArgumentException::getInternalInfo' => ['array'], + 'SolrIllegalArgumentException::getLine' => ['int'], + 'SolrIllegalArgumentException::getMessage' => ['string'], + 'SolrIllegalArgumentException::getPrevious' => ['Exception|Throwable'], + 'SolrIllegalArgumentException::getTrace' => ['list\',args?:array}>'], + 'SolrIllegalArgumentException::getTraceAsString' => ['string'], + 'SolrIllegalOperationException::__clone' => ['void'], + 'SolrIllegalOperationException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'SolrIllegalOperationException::__toString' => ['string'], + 'SolrIllegalOperationException::__wakeup' => ['void'], + 'SolrIllegalOperationException::getCode' => ['int'], + 'SolrIllegalOperationException::getFile' => ['string'], + 'SolrIllegalOperationException::getInternalInfo' => ['array'], + 'SolrIllegalOperationException::getLine' => ['int'], + 'SolrIllegalOperationException::getMessage' => ['string'], + 'SolrIllegalOperationException::getPrevious' => ['Exception|Throwable'], + 'SolrIllegalOperationException::getTrace' => ['list\',args?:array}>'], + 'SolrIllegalOperationException::getTraceAsString' => ['string'], + 'SolrInputDocument::__clone' => ['void'], + 'SolrInputDocument::__construct' => ['void'], + 'SolrInputDocument::__destruct' => ['void'], + 'SolrInputDocument::addChildDocument' => ['void', 'child'=>'SolrInputDocument'], + 'SolrInputDocument::addChildDocuments' => ['void', 'docs'=>'array'], + 'SolrInputDocument::addField' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string', 'fieldboostvalue='=>'float'], + 'SolrInputDocument::clear' => ['bool'], + 'SolrInputDocument::deleteField' => ['bool', 'fieldname'=>'string'], + 'SolrInputDocument::fieldExists' => ['bool', 'fieldname'=>'string'], + 'SolrInputDocument::getBoost' => ['float|false'], + 'SolrInputDocument::getChildDocuments' => ['SolrInputDocument[]'], + 'SolrInputDocument::getChildDocumentsCount' => ['int'], + 'SolrInputDocument::getField' => ['SolrDocumentField|false', 'fieldname'=>'string'], + 'SolrInputDocument::getFieldBoost' => ['float|false', 'fieldname'=>'string'], + 'SolrInputDocument::getFieldCount' => ['int|false'], + 'SolrInputDocument::getFieldNames' => ['array|false'], + 'SolrInputDocument::hasChildDocuments' => ['bool'], + 'SolrInputDocument::merge' => ['bool', 'sourcedoc'=>'SolrInputDocument', 'overwrite='=>'bool'], + 'SolrInputDocument::reset' => ['bool'], + 'SolrInputDocument::setBoost' => ['bool', 'documentboostvalue'=>'float'], + 'SolrInputDocument::setFieldBoost' => ['bool', 'fieldname'=>'string', 'fieldboostvalue'=>'float'], + 'SolrInputDocument::sort' => ['bool', 'sortorderby'=>'int', 'sortdirection='=>'int'], + 'SolrInputDocument::toArray' => ['array|false'], + 'SolrModifiableParams::__construct' => ['void'], + 'SolrModifiableParams::__destruct' => ['void'], + 'SolrModifiableParams::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], + 'SolrModifiableParams::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], + 'SolrModifiableParams::get' => ['mixed', 'param_name'=>'string'], + 'SolrModifiableParams::getParam' => ['mixed', 'param_name'=>'string'], + 'SolrModifiableParams::getParams' => ['array'], + 'SolrModifiableParams::getPreparedParams' => ['array'], + 'SolrModifiableParams::serialize' => ['string'], + 'SolrModifiableParams::set' => ['SolrParams', 'name'=>'string', 'value'=>''], + 'SolrModifiableParams::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], + 'SolrModifiableParams::toString' => ['string', 'url_encode='=>'bool'], + 'SolrModifiableParams::unserialize' => ['void', 'serialized'=>'string'], + 'SolrObject::__construct' => ['void'], + 'SolrObject::__destruct' => ['void'], + 'SolrObject::getPropertyNames' => ['array'], + 'SolrObject::offsetExists' => ['bool', 'property_name'=>'string'], + 'SolrObject::offsetGet' => ['SolrDocumentField', 'property_name'=>'string'], + 'SolrObject::offsetSet' => ['void', 'property_name'=>'string', 'property_value'=>'string'], + 'SolrObject::offsetUnset' => ['void', 'property_name'=>'string'], + 'SolrParams::__construct' => ['void'], + 'SolrParams::add' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], + 'SolrParams::addParam' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], + 'SolrParams::get' => ['mixed', 'param_name'=>'string'], + 'SolrParams::getParam' => ['mixed', 'param_name='=>'string'], + 'SolrParams::getParams' => ['array'], + 'SolrParams::getPreparedParams' => ['array'], + 'SolrParams::serialize' => ['string'], + 'SolrParams::set' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], + 'SolrParams::setParam' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], + 'SolrParams::toString' => ['string|false', 'url_encode='=>'bool'], + 'SolrParams::unserialize' => ['void', 'serialized'=>'string'], + 'SolrPingResponse::__construct' => ['void'], + 'SolrPingResponse::__destruct' => ['void'], + 'SolrPingResponse::getDigestedResponse' => ['string'], + 'SolrPingResponse::getHttpStatus' => ['int'], + 'SolrPingResponse::getHttpStatusMessage' => ['string'], + 'SolrPingResponse::getRawRequest' => ['string'], + 'SolrPingResponse::getRawRequestHeaders' => ['string'], + 'SolrPingResponse::getRawResponse' => ['string'], + 'SolrPingResponse::getRawResponseHeaders' => ['string'], + 'SolrPingResponse::getRequestUrl' => ['string'], + 'SolrPingResponse::getResponse' => ['string'], + 'SolrPingResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], + 'SolrPingResponse::success' => ['bool'], + 'SolrQuery::__construct' => ['void', 'q='=>'string'], + 'SolrQuery::__destruct' => ['void'], + 'SolrQuery::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], + 'SolrQuery::addExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], + 'SolrQuery::addExpandSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'string'], + 'SolrQuery::addFacetDateField' => ['SolrQuery', 'datefield'=>'string'], + 'SolrQuery::addFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], + 'SolrQuery::addFacetField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::addFacetQuery' => ['SolrQuery', 'facetquery'=>'string'], + 'SolrQuery::addField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::addFilterQuery' => ['SolrQuery', 'fq'=>'string'], + 'SolrQuery::addGroupField' => ['SolrQuery', 'value'=>'string'], + 'SolrQuery::addGroupFunction' => ['SolrQuery', 'value'=>'string'], + 'SolrQuery::addGroupQuery' => ['SolrQuery', 'value'=>'string'], + 'SolrQuery::addGroupSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], + 'SolrQuery::addHighlightField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::addMltField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::addMltQueryField' => ['SolrQuery', 'field'=>'string', 'boost'=>'float'], + 'SolrQuery::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], + 'SolrQuery::addSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], + 'SolrQuery::addStatsFacet' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::addStatsField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::collapse' => ['SolrQuery', 'collapseFunction'=>'SolrCollapseFunction'], + 'SolrQuery::get' => ['mixed', 'param_name'=>'string'], + 'SolrQuery::getExpand' => ['bool'], + 'SolrQuery::getExpandFilterQueries' => ['array'], + 'SolrQuery::getExpandQuery' => ['array'], + 'SolrQuery::getExpandRows' => ['int'], + 'SolrQuery::getExpandSortFields' => ['array'], + 'SolrQuery::getFacet' => ['?bool'], + 'SolrQuery::getFacetDateEnd' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getFacetDateFields' => ['array'], + 'SolrQuery::getFacetDateGap' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getFacetDateHardEnd' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getFacetDateOther' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getFacetDateStart' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getFacetFields' => ['array'], + 'SolrQuery::getFacetLimit' => ['?int', 'field_override='=>'string'], + 'SolrQuery::getFacetMethod' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getFacetMinCount' => ['?int', 'field_override='=>'string'], + 'SolrQuery::getFacetMissing' => ['?bool', 'field_override='=>'string'], + 'SolrQuery::getFacetOffset' => ['?int', 'field_override='=>'string'], + 'SolrQuery::getFacetPrefix' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getFacetQueries' => ['?array'], + 'SolrQuery::getFacetSort' => ['int', 'field_override='=>'string'], + 'SolrQuery::getFields' => ['?array'], + 'SolrQuery::getFilterQueries' => ['?array'], + 'SolrQuery::getGroup' => ['bool'], + 'SolrQuery::getGroupCachePercent' => ['int'], + 'SolrQuery::getGroupFacet' => ['bool'], + 'SolrQuery::getGroupFields' => ['array'], + 'SolrQuery::getGroupFormat' => ['string'], + 'SolrQuery::getGroupFunctions' => ['array'], + 'SolrQuery::getGroupLimit' => ['int'], + 'SolrQuery::getGroupMain' => ['bool'], + 'SolrQuery::getGroupNGroups' => ['bool'], + 'SolrQuery::getGroupOffset' => ['int'], + 'SolrQuery::getGroupQueries' => ['array'], + 'SolrQuery::getGroupSortFields' => ['array'], + 'SolrQuery::getGroupTruncate' => ['bool'], + 'SolrQuery::getHighlight' => ['bool'], + 'SolrQuery::getHighlightAlternateField' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getHighlightFields' => ['?array'], + 'SolrQuery::getHighlightFormatter' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getHighlightFragmenter' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getHighlightFragsize' => ['?int', 'field_override='=>'string'], + 'SolrQuery::getHighlightHighlightMultiTerm' => ['?bool'], + 'SolrQuery::getHighlightMaxAlternateFieldLength' => ['?int', 'field_override='=>'string'], + 'SolrQuery::getHighlightMaxAnalyzedChars' => ['?int'], + 'SolrQuery::getHighlightMergeContiguous' => ['?bool', 'field_override='=>'string'], + 'SolrQuery::getHighlightRegexMaxAnalyzedChars' => ['?int'], + 'SolrQuery::getHighlightRegexPattern' => ['?string'], + 'SolrQuery::getHighlightRegexSlop' => ['?float'], + 'SolrQuery::getHighlightRequireFieldMatch' => ['?bool'], + 'SolrQuery::getHighlightSimplePost' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getHighlightSimplePre' => ['?string', 'field_override='=>'string'], + 'SolrQuery::getHighlightSnippets' => ['?int', 'field_override='=>'string'], + 'SolrQuery::getHighlightUsePhraseHighlighter' => ['?bool'], + 'SolrQuery::getMlt' => ['?bool'], + 'SolrQuery::getMltBoost' => ['?bool'], + 'SolrQuery::getMltCount' => ['?int'], + 'SolrQuery::getMltFields' => ['?array'], + 'SolrQuery::getMltMaxNumQueryTerms' => ['?int'], + 'SolrQuery::getMltMaxNumTokens' => ['?int'], + 'SolrQuery::getMltMaxWordLength' => ['?int'], + 'SolrQuery::getMltMinDocFrequency' => ['?int'], + 'SolrQuery::getMltMinTermFrequency' => ['?int'], + 'SolrQuery::getMltMinWordLength' => ['?int'], + 'SolrQuery::getMltQueryFields' => ['?array'], + 'SolrQuery::getParam' => ['?mixed', 'param_name'=>'string'], + 'SolrQuery::getParams' => ['?array'], + 'SolrQuery::getPreparedParams' => ['?array'], + 'SolrQuery::getQuery' => ['?string'], + 'SolrQuery::getRows' => ['?int'], + 'SolrQuery::getSortFields' => ['?array'], + 'SolrQuery::getStart' => ['?int'], + 'SolrQuery::getStats' => ['?bool'], + 'SolrQuery::getStatsFacets' => ['?array'], + 'SolrQuery::getStatsFields' => ['?array'], + 'SolrQuery::getTerms' => ['?bool'], + 'SolrQuery::getTermsField' => ['?string'], + 'SolrQuery::getTermsIncludeLowerBound' => ['?bool'], + 'SolrQuery::getTermsIncludeUpperBound' => ['?bool'], + 'SolrQuery::getTermsLimit' => ['?int'], + 'SolrQuery::getTermsLowerBound' => ['?string'], + 'SolrQuery::getTermsMaxCount' => ['?int'], + 'SolrQuery::getTermsMinCount' => ['?int'], + 'SolrQuery::getTermsPrefix' => ['?string'], + 'SolrQuery::getTermsReturnRaw' => ['?bool'], + 'SolrQuery::getTermsSort' => ['?int'], + 'SolrQuery::getTermsUpperBound' => ['?string'], + 'SolrQuery::getTimeAllowed' => ['?int'], + 'SolrQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], + 'SolrQuery::removeExpandSortField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::removeFacetDateField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::removeFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], + 'SolrQuery::removeFacetField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::removeFacetQuery' => ['SolrQuery', 'value'=>'string'], + 'SolrQuery::removeField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::removeFilterQuery' => ['SolrQuery', 'fq'=>'string'], + 'SolrQuery::removeHighlightField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::removeMltField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::removeMltQueryField' => ['SolrQuery', 'queryfield'=>'string'], + 'SolrQuery::removeSortField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::removeStatsFacet' => ['SolrQuery', 'value'=>'string'], + 'SolrQuery::removeStatsField' => ['SolrQuery', 'field'=>'string'], + 'SolrQuery::serialize' => ['string'], + 'SolrQuery::set' => ['SolrParams', 'name'=>'string', 'value'=>''], + 'SolrQuery::setEchoHandler' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setEchoParams' => ['SolrQuery', 'type'=>'string'], + 'SolrQuery::setExpand' => ['SolrQuery', 'value'=>'bool'], + 'SolrQuery::setExpandQuery' => ['SolrQuery', 'q'=>'string'], + 'SolrQuery::setExpandRows' => ['SolrQuery', 'value'=>'int'], + 'SolrQuery::setExplainOther' => ['SolrQuery', 'query'=>'string'], + 'SolrQuery::setFacet' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setFacetDateEnd' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], + 'SolrQuery::setFacetDateGap' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], + 'SolrQuery::setFacetDateHardEnd' => ['SolrQuery', 'value'=>'bool', 'field_override='=>'string'], + 'SolrQuery::setFacetDateStart' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], + 'SolrQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency'=>'int', 'field_override='=>'string'], + 'SolrQuery::setFacetLimit' => ['SolrQuery', 'limit'=>'int', 'field_override='=>'string'], + 'SolrQuery::setFacetMethod' => ['SolrQuery', 'method'=>'string', 'field_override='=>'string'], + 'SolrQuery::setFacetMinCount' => ['SolrQuery', 'mincount'=>'int', 'field_override='=>'string'], + 'SolrQuery::setFacetMissing' => ['SolrQuery', 'flag'=>'bool', 'field_override='=>'string'], + 'SolrQuery::setFacetOffset' => ['SolrQuery', 'offset'=>'int', 'field_override='=>'string'], + 'SolrQuery::setFacetPrefix' => ['SolrQuery', 'prefix'=>'string', 'field_override='=>'string'], + 'SolrQuery::setFacetSort' => ['SolrQuery', 'facetsort'=>'int', 'field_override='=>'string'], + 'SolrQuery::setGroup' => ['SolrQuery', 'value'=>'bool'], + 'SolrQuery::setGroupCachePercent' => ['SolrQuery', 'percent'=>'int'], + 'SolrQuery::setGroupFacet' => ['SolrQuery', 'value'=>'bool'], + 'SolrQuery::setGroupFormat' => ['SolrQuery', 'value'=>'string'], + 'SolrQuery::setGroupLimit' => ['SolrQuery', 'value'=>'int'], + 'SolrQuery::setGroupMain' => ['SolrQuery', 'value'=>'string'], + 'SolrQuery::setGroupNGroups' => ['SolrQuery', 'value'=>'bool'], + 'SolrQuery::setGroupOffset' => ['SolrQuery', 'value'=>'int'], + 'SolrQuery::setGroupTruncate' => ['SolrQuery', 'value'=>'bool'], + 'SolrQuery::setHighlight' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setHighlightAlternateField' => ['SolrQuery', 'field'=>'string', 'field_override='=>'string'], + 'SolrQuery::setHighlightFormatter' => ['SolrQuery', 'formatter'=>'string', 'field_override='=>'string'], + 'SolrQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter'=>'string', 'field_override='=>'string'], + 'SolrQuery::setHighlightFragsize' => ['SolrQuery', 'size'=>'int', 'field_override='=>'string'], + 'SolrQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldlength'=>'int', 'field_override='=>'string'], + 'SolrQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value'=>'int'], + 'SolrQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag'=>'bool', 'field_override='=>'string'], + 'SolrQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxanalyzedchars'=>'int'], + 'SolrQuery::setHighlightRegexPattern' => ['SolrQuery', 'value'=>'string'], + 'SolrQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor'=>'float'], + 'SolrQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setHighlightSimplePost' => ['SolrQuery', 'simplepost'=>'string', 'field_override='=>'string'], + 'SolrQuery::setHighlightSimplePre' => ['SolrQuery', 'simplepre'=>'string', 'field_override='=>'string'], + 'SolrQuery::setHighlightSnippets' => ['SolrQuery', 'value'=>'int', 'field_override='=>'string'], + 'SolrQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setMlt' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setMltBoost' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setMltCount' => ['SolrQuery', 'count'=>'int'], + 'SolrQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value'=>'int'], + 'SolrQuery::setMltMaxNumTokens' => ['SolrQuery', 'value'=>'int'], + 'SolrQuery::setMltMaxWordLength' => ['SolrQuery', 'maxwordlength'=>'int'], + 'SolrQuery::setMltMinDocFrequency' => ['SolrQuery', 'mindocfrequency'=>'int'], + 'SolrQuery::setMltMinTermFrequency' => ['SolrQuery', 'mintermfrequency'=>'int'], + 'SolrQuery::setMltMinWordLength' => ['SolrQuery', 'minwordlength'=>'int'], + 'SolrQuery::setOmitHeader' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], + 'SolrQuery::setQuery' => ['SolrQuery', 'query'=>'string'], + 'SolrQuery::setRows' => ['SolrQuery', 'rows'=>'int'], + 'SolrQuery::setShowDebugInfo' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setStart' => ['SolrQuery', 'start'=>'int'], + 'SolrQuery::setStats' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setTerms' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setTermsField' => ['SolrQuery', 'fieldname'=>'string'], + 'SolrQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setTermsLimit' => ['SolrQuery', 'limit'=>'int'], + 'SolrQuery::setTermsLowerBound' => ['SolrQuery', 'lowerbound'=>'string'], + 'SolrQuery::setTermsMaxCount' => ['SolrQuery', 'frequency'=>'int'], + 'SolrQuery::setTermsMinCount' => ['SolrQuery', 'frequency'=>'int'], + 'SolrQuery::setTermsPrefix' => ['SolrQuery', 'prefix'=>'string'], + 'SolrQuery::setTermsReturnRaw' => ['SolrQuery', 'flag'=>'bool'], + 'SolrQuery::setTermsSort' => ['SolrQuery', 'sorttype'=>'int'], + 'SolrQuery::setTermsUpperBound' => ['SolrQuery', 'upperbound'=>'string'], + 'SolrQuery::setTimeAllowed' => ['SolrQuery', 'timeallowed'=>'int'], + 'SolrQuery::toString' => ['string', 'url_encode='=>'bool'], + 'SolrQuery::unserialize' => ['void', 'serialized'=>'string'], + 'SolrQueryResponse::__construct' => ['void'], + 'SolrQueryResponse::__destruct' => ['void'], + 'SolrQueryResponse::getDigestedResponse' => ['string'], + 'SolrQueryResponse::getHttpStatus' => ['int'], + 'SolrQueryResponse::getHttpStatusMessage' => ['string'], + 'SolrQueryResponse::getRawRequest' => ['string'], + 'SolrQueryResponse::getRawRequestHeaders' => ['string'], + 'SolrQueryResponse::getRawResponse' => ['string'], + 'SolrQueryResponse::getRawResponseHeaders' => ['string'], + 'SolrQueryResponse::getRequestUrl' => ['string'], + 'SolrQueryResponse::getResponse' => ['SolrObject'], + 'SolrQueryResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], + 'SolrQueryResponse::success' => ['bool'], + 'SolrResponse::getDigestedResponse' => ['string'], + 'SolrResponse::getHttpStatus' => ['int'], + 'SolrResponse::getHttpStatusMessage' => ['string'], + 'SolrResponse::getRawRequest' => ['string'], + 'SolrResponse::getRawRequestHeaders' => ['string'], + 'SolrResponse::getRawResponse' => ['string'], + 'SolrResponse::getRawResponseHeaders' => ['string'], + 'SolrResponse::getRequestUrl' => ['string'], + 'SolrResponse::getResponse' => ['SolrObject'], + 'SolrResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], + 'SolrResponse::success' => ['bool'], + 'SolrServerException::__clone' => ['void'], + 'SolrServerException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'SolrServerException::__toString' => ['string'], + 'SolrServerException::__wakeup' => ['void'], + 'SolrServerException::getCode' => ['int'], + 'SolrServerException::getFile' => ['string'], + 'SolrServerException::getInternalInfo' => ['array'], + 'SolrServerException::getLine' => ['int'], + 'SolrServerException::getMessage' => ['string'], + 'SolrServerException::getPrevious' => ['Exception|Throwable'], + 'SolrServerException::getTrace' => ['list\',args?:array}>'], + 'SolrServerException::getTraceAsString' => ['string'], + 'SolrUpdateResponse::__construct' => ['void'], + 'SolrUpdateResponse::__destruct' => ['void'], + 'SolrUpdateResponse::getDigestedResponse' => ['string'], + 'SolrUpdateResponse::getHttpStatus' => ['int'], + 'SolrUpdateResponse::getHttpStatusMessage' => ['string'], + 'SolrUpdateResponse::getRawRequest' => ['string'], + 'SolrUpdateResponse::getRawRequestHeaders' => ['string'], + 'SolrUpdateResponse::getRawResponse' => ['string'], + 'SolrUpdateResponse::getRawResponseHeaders' => ['string'], + 'SolrUpdateResponse::getRequestUrl' => ['string'], + 'SolrUpdateResponse::getResponse' => ['SolrObject'], + 'SolrUpdateResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], + 'SolrUpdateResponse::success' => ['bool'], + 'SolrUtils::digestXmlResponse' => ['SolrObject', 'xmlresponse'=>'string', 'parse_mode='=>'int'], + 'SolrUtils::escapeQueryChars' => ['string|false', 'string'=>'string'], + 'SolrUtils::getSolrVersion' => ['string'], + 'SolrUtils::queryPhrase' => ['string', 'string'=>'string'], + 'SphinxClient::__construct' => ['void'], + 'SphinxClient::addQuery' => ['int', 'query'=>'string', 'index='=>'string', 'comment='=>'string'], + 'SphinxClient::buildExcerpts' => ['array', 'docs'=>'array', 'index'=>'string', 'words'=>'string', 'opts='=>'array'], + 'SphinxClient::buildKeywords' => ['array', 'query'=>'string', 'index'=>'string', 'hits'=>'bool'], + 'SphinxClient::close' => ['bool'], + 'SphinxClient::escapeString' => ['string', 'string'=>'string'], + 'SphinxClient::getLastError' => ['string'], + 'SphinxClient::getLastWarning' => ['string'], + 'SphinxClient::open' => ['bool'], + 'SphinxClient::query' => ['array', 'query'=>'string', 'index='=>'string', 'comment='=>'string'], + 'SphinxClient::resetFilters' => ['void'], + 'SphinxClient::resetGroupBy' => ['void'], + 'SphinxClient::runQueries' => ['array'], + 'SphinxClient::setArrayResult' => ['bool', 'array_result'=>'bool'], + 'SphinxClient::setConnectTimeout' => ['bool', 'timeout'=>'float'], + 'SphinxClient::setFieldWeights' => ['bool', 'weights'=>'array'], + 'SphinxClient::setFilter' => ['bool', 'attribute'=>'string', 'values'=>'array', 'exclude='=>'bool'], + 'SphinxClient::setFilterFloatRange' => ['bool', 'attribute'=>'string', 'min'=>'float', 'max'=>'float', 'exclude='=>'bool'], + 'SphinxClient::setFilterRange' => ['bool', 'attribute'=>'string', 'min'=>'int', 'max'=>'int', 'exclude='=>'bool'], + 'SphinxClient::setGeoAnchor' => ['bool', 'attrlat'=>'string', 'attrlong'=>'string', 'latitude'=>'float', 'longitude'=>'float'], + 'SphinxClient::setGroupBy' => ['bool', 'attribute'=>'string', 'func'=>'int', 'groupsort='=>'string'], + 'SphinxClient::setGroupDistinct' => ['bool', 'attribute'=>'string'], + 'SphinxClient::setIDRange' => ['bool', 'min'=>'int', 'max'=>'int'], + 'SphinxClient::setIndexWeights' => ['bool', 'weights'=>'array'], + 'SphinxClient::setLimits' => ['bool', 'offset'=>'int', 'limit'=>'int', 'max_matches='=>'int', 'cutoff='=>'int'], + 'SphinxClient::setMatchMode' => ['bool', 'mode'=>'int'], + 'SphinxClient::setMaxQueryTime' => ['bool', 'qtime'=>'int'], + 'SphinxClient::setOverride' => ['bool', 'attribute'=>'string', 'type'=>'int', 'values'=>'array'], + 'SphinxClient::setRankingMode' => ['bool', 'ranker'=>'int'], + 'SphinxClient::setRetries' => ['bool', 'count'=>'int', 'delay='=>'int'], + 'SphinxClient::setSelect' => ['bool', 'clause'=>'string'], + 'SphinxClient::setServer' => ['bool', 'server'=>'string', 'port'=>'int'], + 'SphinxClient::setSortMode' => ['bool', 'mode'=>'int', 'sortby='=>'string'], + '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::bottom' => ['mixed'], + 'SplDoublyLinkedList::count' => ['int'], + 'SplDoublyLinkedList::current' => ['mixed'], + 'SplDoublyLinkedList::getIteratorMode' => ['int'], + 'SplDoublyLinkedList::isEmpty' => ['bool'], + 'SplDoublyLinkedList::key' => ['mixed'], + 'SplDoublyLinkedList::next' => ['void'], + 'SplDoublyLinkedList::offsetExists' => ['bool', 'index'=>'mixed'], + 'SplDoublyLinkedList::offsetGet' => ['mixed', 'index'=>'mixed'], + 'SplDoublyLinkedList::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'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::shift' => ['mixed'], + 'SplDoublyLinkedList::top' => ['mixed'], + 'SplDoublyLinkedList::unserialize' => ['void', 'serialized'=>'string'], + 'SplDoublyLinkedList::unshift' => ['bool', 'value'=>'mixed'], + 'SplDoublyLinkedList::valid' => ['bool'], + 'SplEnum::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], + 'SplEnum::getConstList' => ['array', 'include_default='=>'bool'], + 'SplFileInfo::__construct' => ['void', 'file_name'=>'string'], + 'SplFileInfo::__toString' => ['string'], + 'SplFileInfo::__wakeup' => ['void'], + 'SplFileInfo::getATime' => ['int'], + 'SplFileInfo::getBasename' => ['string', 'suffix='=>'string'], + 'SplFileInfo::getCTime' => ['int'], + 'SplFileInfo::getExtension' => ['string'], + 'SplFileInfo::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'SplFileInfo::getFilename' => ['string'], + 'SplFileInfo::getGroup' => ['int'], + 'SplFileInfo::getInode' => ['int'], + 'SplFileInfo::getLinkTarget' => ['string'], + 'SplFileInfo::getMTime' => ['int'], + 'SplFileInfo::getOwner' => ['int'], + 'SplFileInfo::getPath' => ['string'], + 'SplFileInfo::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'SplFileInfo::getPathname' => ['string'], + 'SplFileInfo::getPerms' => ['int'], + 'SplFileInfo::getRealPath' => ['string|false'], + 'SplFileInfo::getSize' => ['int'], + 'SplFileInfo::getType' => ['string'], + 'SplFileInfo::isDir' => ['bool'], + 'SplFileInfo::isExecutable' => ['bool'], + 'SplFileInfo::isFile' => ['bool'], + 'SplFileInfo::isLink' => ['bool'], + 'SplFileInfo::isReadable' => ['bool'], + 'SplFileInfo::isWritable' => ['bool'], + 'SplFileInfo::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], + 'SplFileInfo::setFileClass' => ['void', 'class_name='=>'string'], + 'SplFileInfo::setInfoClass' => ['void', 'class_name='=>'string'], + 'SplFileObject::__construct' => ['void', 'filename'=>'string', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>''], + 'SplFileObject::__toString' => ['string'], + 'SplFileObject::current' => ['string|array|false'], + 'SplFileObject::eof' => ['bool'], + 'SplFileObject::fflush' => ['bool'], + 'SplFileObject::fgetc' => ['string|false'], + 'SplFileObject::fgetcsv' => ['list|array{0: null}|false|null', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], + 'SplFileObject::fgets' => ['string|false'], + 'SplFileObject::fgetss' => ['string|false', 'allowable_tags='=>'string'], + 'SplFileObject::flock' => ['bool', 'operation'=>'int', '&w_wouldblock='=>'int'], + 'SplFileObject::fpassthru' => ['int|false'], + 'SplFileObject::fputcsv' => ['int|false', 'fields'=>'array', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], + 'SplFileObject::fread' => ['string|false', 'length'=>'int'], + 'SplFileObject::fscanf' => ['array|int', 'format'=>'string', '&...w_vars='=>'string|int|float'], + 'SplFileObject::fseek' => ['int', 'pos'=>'int', 'whence='=>'int'], + 'SplFileObject::fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}'], + 'SplFileObject::ftell' => ['int|false'], + 'SplFileObject::ftruncate' => ['bool', 'size'=>'int'], + 'SplFileObject::fwrite' => ['int', 'string'=>'string', 'length='=>'int'], + 'SplFileObject::getATime' => ['int'], + 'SplFileObject::getBasename' => ['string', 'suffix='=>'string'], + 'SplFileObject::getCTime' => ['int'], + 'SplFileObject::getChildren' => ['null'], + 'SplFileObject::getCsvControl' => ['array'], + 'SplFileObject::getCurrentLine' => ['string|false'], + 'SplFileObject::getExtension' => ['string'], + 'SplFileObject::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'SplFileObject::getFilename' => ['string'], + 'SplFileObject::getFlags' => ['int'], + 'SplFileObject::getGroup' => ['int'], + 'SplFileObject::getInode' => ['int'], + 'SplFileObject::getLinkTarget' => ['string'], + 'SplFileObject::getMTime' => ['int'], + 'SplFileObject::getMaxLineLen' => ['int'], + 'SplFileObject::getOwner' => ['int'], + 'SplFileObject::getPath' => ['string'], + 'SplFileObject::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'SplFileObject::getPathname' => ['string'], + 'SplFileObject::getPerms' => ['int'], + 'SplFileObject::getRealPath' => ['false|string'], + 'SplFileObject::getSize' => ['int'], + 'SplFileObject::getType' => ['string'], + 'SplFileObject::hasChildren' => ['false'], + 'SplFileObject::isDir' => ['bool'], + 'SplFileObject::isExecutable' => ['bool'], + 'SplFileObject::isFile' => ['bool'], + 'SplFileObject::isLink' => ['bool'], + 'SplFileObject::isReadable' => ['bool'], + 'SplFileObject::isWritable' => ['bool'], + 'SplFileObject::key' => ['int'], + 'SplFileObject::next' => ['void'], + 'SplFileObject::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], + 'SplFileObject::rewind' => ['void'], + 'SplFileObject::seek' => ['void', 'line_pos'=>'int'], + 'SplFileObject::setCsvControl' => ['void', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], + 'SplFileObject::setFileClass' => ['void', 'class_name='=>'string'], + 'SplFileObject::setFlags' => ['void', 'flags'=>'int'], + 'SplFileObject::setInfoClass' => ['void', 'class_name='=>'string'], + 'SplFileObject::setMaxLineLen' => ['void', 'max_len'=>'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::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::offsetUnset' => ['void', 'index'=>'int'], + 'SplFixedArray::rewind' => ['void'], + 'SplFixedArray::setSize' => ['bool', 'size'=>'int'], + 'SplFixedArray::toArray' => ['array'], + 'SplFixedArray::valid' => ['bool'], + 'SplHeap::__construct' => ['void'], + 'SplHeap::compare' => ['int', 'value1'=>'mixed', 'value2'=>'mixed'], + 'SplHeap::count' => ['int'], + 'SplHeap::current' => ['mixed'], + 'SplHeap::extract' => ['mixed'], + 'SplHeap::insert' => ['bool', 'value'=>'mixed'], + 'SplHeap::isCorrupted' => ['bool'], + 'SplHeap::isEmpty' => ['bool'], + 'SplHeap::key' => ['int'], + 'SplHeap::next' => ['void'], + 'SplHeap::recoverFromCorruption' => ['int'], + 'SplHeap::rewind' => ['void'], + 'SplHeap::top' => ['mixed'], + 'SplHeap::valid' => ['bool'], + 'SplMaxHeap::__construct' => ['void'], + 'SplMaxHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], + 'SplMinHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], + 'SplMinHeap::count' => ['int'], + 'SplMinHeap::current' => ['mixed'], + 'SplMinHeap::extract' => ['mixed'], + 'SplMinHeap::insert' => ['void', 'value'=>'mixed'], + 'SplMinHeap::isCorrupted' => ['int'], + 'SplMinHeap::isEmpty' => ['bool'], + 'SplMinHeap::key' => ['mixed'], + 'SplMinHeap::next' => ['void'], + 'SplMinHeap::recoverFromCorruption' => ['void'], + 'SplMinHeap::rewind' => ['void'], + 'SplMinHeap::top' => ['mixed'], + 'SplMinHeap::valid' => ['bool'], + 'SplObjectStorage::__construct' => ['void'], + 'SplObjectStorage::addAll' => ['void', 'os'=>'splobjectstorage'], + 'SplObjectStorage::attach' => ['void', 'object'=>'object', 'inf='=>'mixed'], + 'SplObjectStorage::contains' => ['bool', 'object'=>'object'], + 'SplObjectStorage::count' => ['int'], + 'SplObjectStorage::current' => ['object'], + 'SplObjectStorage::detach' => ['void', 'object'=>'object'], + 'SplObjectStorage::getHash' => ['string', 'object'=>'object'], + 'SplObjectStorage::getInfo' => ['mixed'], + 'SplObjectStorage::key' => ['int'], + 'SplObjectStorage::next' => ['void'], + 'SplObjectStorage::offsetExists' => ['bool', 'object'=>'object'], + 'SplObjectStorage::offsetGet' => ['mixed', 'object'=>'object'], + 'SplObjectStorage::offsetSet' => ['object', 'object'=>'object', 'data='=>'mixed'], + 'SplObjectStorage::offsetUnset' => ['object', 'object'=>'object'], + 'SplObjectStorage::removeAll' => ['void', 'os'=>'splobjectstorage'], + 'SplObjectStorage::removeAllExcept' => ['void', 'os'=>'splobjectstorage'], + 'SplObjectStorage::rewind' => ['void'], + 'SplObjectStorage::serialize' => ['string'], + 'SplObjectStorage::setInfo' => ['void', 'inf'=>'mixed'], + 'SplObjectStorage::unserialize' => ['void', 'serialized'=>'string'], + 'SplObjectStorage::valid' => ['bool'], + 'SplObserver::update' => ['void', 'subject'=>'SplSubject'], + 'SplPriorityQueue::__construct' => ['void'], + 'SplPriorityQueue::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], + 'SplPriorityQueue::count' => ['int'], + 'SplPriorityQueue::current' => ['mixed'], + 'SplPriorityQueue::extract' => ['mixed'], + 'SplPriorityQueue::getExtractFlags' => ['int'], + 'SplPriorityQueue::insert' => ['bool', 'value'=>'mixed', 'priority'=>'mixed'], + 'SplPriorityQueue::isEmpty' => ['bool'], + 'SplPriorityQueue::key' => ['mixed'], + 'SplPriorityQueue::next' => ['void'], + 'SplPriorityQueue::recoverFromCorruption' => ['void'], + 'SplPriorityQueue::rewind' => ['void'], + 'SplPriorityQueue::setExtractFlags' => ['void', 'flags'=>'int'], + 'SplPriorityQueue::top' => ['mixed'], + 'SplPriorityQueue::valid' => ['bool'], + 'SplQueue::dequeue' => ['mixed'], + 'SplQueue::enqueue' => ['void', 'value'=>'mixed'], + 'SplQueue::getIteratorMode' => ['int'], + 'SplQueue::isEmpty' => ['bool'], + 'SplQueue::key' => ['mixed'], + 'SplQueue::next' => ['void'], + 'SplQueue::offsetExists' => ['bool', 'index'=>'mixed'], + 'SplQueue::offsetGet' => ['mixed', 'index'=>'mixed'], + 'SplQueue::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], + 'SplQueue::offsetUnset' => ['void', 'index'=>'mixed'], + 'SplQueue::pop' => ['mixed'], + 'SplQueue::prev' => ['void'], + 'SplQueue::push' => ['void', 'value'=>'mixed'], + 'SplQueue::rewind' => ['void'], + 'SplQueue::serialize' => ['string'], + 'SplQueue::setIteratorMode' => ['void', 'mode'=>'int'], + 'SplQueue::shift' => ['mixed'], + 'SplQueue::top' => ['mixed'], + 'SplQueue::unserialize' => ['void', 'serialized'=>'string'], + 'SplQueue::unshift' => ['bool', 'value'=>'mixed'], + 'SplQueue::valid' => ['bool'], + 'SplStack::__construct' => ['void'], + 'SplStack::add' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], + 'SplStack::bottom' => ['mixed'], + 'SplStack::count' => ['int'], + 'SplStack::current' => ['mixed'], + 'SplStack::getIteratorMode' => ['int'], + 'SplStack::isEmpty' => ['bool'], + 'SplStack::key' => ['mixed'], + 'SplStack::next' => ['void'], + 'SplStack::offsetExists' => ['bool', 'index'=>'mixed'], + 'SplStack::offsetGet' => ['mixed', 'index'=>'mixed'], + 'SplStack::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], + 'SplStack::offsetUnset' => ['void', 'index'=>'mixed'], + 'SplStack::pop' => ['mixed'], + 'SplStack::prev' => ['void'], + 'SplStack::push' => ['void', 'value'=>'mixed'], + 'SplStack::rewind' => ['void'], + 'SplStack::serialize' => ['string'], + 'SplStack::setIteratorMode' => ['void', 'mode'=>'int'], + 'SplStack::shift' => ['mixed'], + 'SplStack::top' => ['mixed'], + 'SplStack::unserialize' => ['void', 'serialized'=>'string'], + 'SplStack::unshift' => ['bool', 'value'=>'mixed'], + 'SplStack::valid' => ['bool'], + 'SplSubject::attach' => ['void', 'observer'=>'SplObserver'], + 'SplSubject::detach' => ['void', 'observer'=>'SplObserver'], + 'SplSubject::notify' => ['void'], + 'SplTempFileObject::__construct' => ['void', 'max_memory='=>'int'], + 'SplTempFileObject::__toString' => ['string'], + 'SplTempFileObject::_bad_state_ex' => [''], + 'SplTempFileObject::current' => ['array|false|string'], + 'SplTempFileObject::eof' => ['bool'], + 'SplTempFileObject::fflush' => ['bool'], + 'SplTempFileObject::fgetc' => ['false|string'], + 'SplTempFileObject::fgetcsv' => ['list|array{0: null}|false|null', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], + 'SplTempFileObject::fgets' => ['string'], + 'SplTempFileObject::fgetss' => ['string', 'allowable_tags='=>'string'], + 'SplTempFileObject::flock' => ['bool', 'operation'=>'int', '&wouldblock='=>'int'], + 'SplTempFileObject::fpassthru' => ['int|false'], + 'SplTempFileObject::fputcsv' => ['false|int', 'fields'=>'array', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], + 'SplTempFileObject::fread' => ['false|string', 'length'=>'int'], + 'SplTempFileObject::fscanf' => ['bool', 'format'=>'string', '&...w_vars='=>'array|array|array'], + 'SplTempFileObject::fseek' => ['int', 'pos'=>'int', 'whence='=>'int'], + 'SplTempFileObject::fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}'], + 'SplTempFileObject::ftell' => ['int'], + 'SplTempFileObject::ftruncate' => ['bool', 'size'=>'int'], + 'SplTempFileObject::fwrite' => ['int', 'string'=>'string', 'length='=>'int'], + 'SplTempFileObject::getATime' => ['int'], + 'SplTempFileObject::getBasename' => ['string', 'suffix='=>'string'], + 'SplTempFileObject::getCTime' => ['int'], + 'SplTempFileObject::getChildren' => ['null'], + 'SplTempFileObject::getCsvControl' => ['array'], + 'SplTempFileObject::getCurrentLine' => ['string'], + 'SplTempFileObject::getExtension' => ['string'], + 'SplTempFileObject::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'SplTempFileObject::getFilename' => ['string'], + 'SplTempFileObject::getFlags' => ['int'], + 'SplTempFileObject::getGroup' => ['int'], + 'SplTempFileObject::getInode' => ['int'], + 'SplTempFileObject::getLinkTarget' => ['string'], + 'SplTempFileObject::getMTime' => ['int'], + 'SplTempFileObject::getMaxLineLen' => ['int'], + 'SplTempFileObject::getOwner' => ['int'], + 'SplTempFileObject::getPath' => ['string'], + 'SplTempFileObject::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'SplTempFileObject::getPathname' => ['string'], + 'SplTempFileObject::getPerms' => ['int'], + 'SplTempFileObject::getRealPath' => ['string'], + 'SplTempFileObject::getSize' => ['int'], + 'SplTempFileObject::getType' => ['string'], + 'SplTempFileObject::hasChildren' => ['bool'], + 'SplTempFileObject::isDir' => ['bool'], + 'SplTempFileObject::isExecutable' => ['bool'], + 'SplTempFileObject::isFile' => ['bool'], + 'SplTempFileObject::isLink' => ['bool'], + 'SplTempFileObject::isReadable' => ['bool'], + 'SplTempFileObject::isWritable' => ['bool'], + 'SplTempFileObject::key' => ['int'], + 'SplTempFileObject::next' => ['void'], + 'SplTempFileObject::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], + 'SplTempFileObject::rewind' => ['void'], + 'SplTempFileObject::seek' => ['void', 'line_pos'=>'int'], + 'SplTempFileObject::setCsvControl' => ['void', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], + 'SplTempFileObject::setFileClass' => ['void', 'class_name='=>'string'], + 'SplTempFileObject::setFlags' => ['void', 'flags'=>'int'], + 'SplTempFileObject::setInfoClass' => ['void', 'class_name='=>'string'], + 'SplTempFileObject::setMaxLineLen' => ['void', 'max_len'=>'int'], + 'SplTempFileObject::valid' => ['bool'], + 'SplType::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], + 'Spoofchecker::__construct' => ['void'], + 'Spoofchecker::areConfusable' => ['bool', 's1'=>'string', 's2'=>'string', '&w_error='=>'string'], + 'Spoofchecker::isSuspicious' => ['bool', 'text'=>'string', '&w_error='=>'string'], + 'Spoofchecker::setAllowedLocales' => ['void', 'locale_list'=>'string'], + 'Spoofchecker::setChecks' => ['void', 'checks'=>'long'], + 'Spoofchecker::setRestrictionLevel' => ['void', 'restriction_level'=>'int'], + 'Stomp::__construct' => ['void', 'broker='=>'string', 'username='=>'string', 'password='=>'string', 'headers='=>'array'], + 'Stomp::__destruct' => ['bool', 'link'=>''], + 'Stomp::abort' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], + 'Stomp::ack' => ['bool', 'msg'=>'', 'headers='=>'array', 'link='=>''], + 'Stomp::begin' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], + 'Stomp::commit' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], + 'Stomp::error' => ['string', 'link'=>''], + 'Stomp::getReadTimeout' => ['array', 'link'=>''], + 'Stomp::getSessionId' => ['string', 'link'=>''], + 'Stomp::hasFrame' => ['bool', 'link'=>''], + 'Stomp::readFrame' => ['array', 'class_name='=>'string', 'link='=>''], + 'Stomp::send' => ['bool', 'destination'=>'string', 'msg'=>'', 'headers='=>'array', 'link='=>''], + 'Stomp::setReadTimeout' => ['', 'seconds'=>'int', 'microseconds='=>'int', 'link='=>''], + 'Stomp::subscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], + 'Stomp::unsubscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], + 'StompException::getDetails' => ['string'], + 'StompFrame::__construct' => ['void', 'command='=>'string', 'headers='=>'array', 'body='=>'string'], + 'Swish::__construct' => ['void', 'index_names'=>'string'], + 'Swish::getMetaList' => ['array', 'index_name'=>'string'], + 'Swish::getPropertyList' => ['array', 'index_name'=>'string'], + 'Swish::prepare' => ['object', 'query='=>'string'], + 'Swish::query' => ['object', 'query'=>'string'], + 'SwishResult::getMetaList' => ['array'], + 'SwishResult::stem' => ['array', 'word'=>'string'], + 'SwishResults::getParsedWords' => ['array', 'index_name'=>'string'], + 'SwishResults::getRemovedStopwords' => ['array', 'index_name'=>'string'], + 'SwishResults::nextResult' => ['object'], + 'SwishResults::seekResult' => ['int', 'position'=>'int'], + 'SwishSearch::execute' => ['object', 'query='=>'string'], + 'SwishSearch::resetLimit' => [''], + 'SwishSearch::setLimit' => ['', 'property'=>'string', 'low'=>'string', 'high'=>'string'], + 'SwishSearch::setPhraseDelimiter' => ['', 'delimiter'=>'string'], + 'SwishSearch::setSort' => ['', 'sort'=>'string'], + 'SwishSearch::setStructure' => ['', 'structure'=>'int'], + 'SyncEvent::__construct' => ['void', 'name='=>'string', 'manual='=>'bool'], + 'SyncEvent::fire' => ['bool'], + 'SyncEvent::reset' => ['bool'], + 'SyncEvent::wait' => ['bool', 'wait='=>'int'], + 'SyncMutex::__construct' => ['void', 'name='=>'string'], + 'SyncMutex::lock' => ['bool', 'wait='=>'int'], + 'SyncMutex::unlock' => ['bool', 'all='=>'bool'], + 'SyncReaderWriter::__construct' => ['void', 'name='=>'string', 'autounlock='=>'bool'], + 'SyncReaderWriter::readlock' => ['bool', 'wait='=>'int'], + 'SyncReaderWriter::readunlock' => ['bool'], + 'SyncReaderWriter::writelock' => ['bool', 'wait='=>'int'], + 'SyncReaderWriter::writeunlock' => ['bool'], + 'SyncSemaphore::__construct' => ['void', 'name='=>'string', 'initialval='=>'int', 'autounlock='=>'bool'], + 'SyncSemaphore::lock' => ['bool', 'wait='=>'int'], + 'SyncSemaphore::unlock' => ['bool', '&w_prevcount='=>'int'], + 'SyncSharedMemory::__construct' => ['void', 'name'=>'string', 'size'=>'int'], + 'SyncSharedMemory::first' => ['bool'], + 'SyncSharedMemory::read' => ['string', 'start='=>'int', 'length='=>'int'], + 'SyncSharedMemory::size' => ['int'], + 'SyncSharedMemory::write' => ['int', 'string='=>'string', 'start='=>'int'], + 'Thread::__construct' => ['void'], + 'Thread::addRef' => ['void'], + 'Thread::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], + 'Thread::count' => ['int'], + 'Thread::delRef' => ['void'], + 'Thread::detach' => ['void'], + 'Thread::extend' => ['bool', 'class'=>'string'], + 'Thread::getCreatorId' => ['int'], + 'Thread::getCurrentThread' => ['Thread'], + 'Thread::getCurrentThreadId' => ['int'], + 'Thread::getRefCount' => ['int'], + 'Thread::getTerminationInfo' => ['array'], + 'Thread::getThreadId' => ['int'], + 'Thread::globally' => ['mixed'], + 'Thread::isGarbage' => ['bool'], + 'Thread::isJoined' => ['bool'], + 'Thread::isRunning' => ['bool'], + 'Thread::isStarted' => ['bool'], + 'Thread::isTerminated' => ['bool'], + 'Thread::isWaiting' => ['bool'], + 'Thread::join' => ['bool'], + 'Thread::kill' => ['void'], + 'Thread::lock' => ['bool'], + 'Thread::merge' => ['bool', 'from'=>'', 'overwrite='=>'mixed'], + 'Thread::notify' => ['bool'], + 'Thread::notifyOne' => ['bool'], + 'Thread::offsetExists' => ['bool', 'offset'=>'mixed'], + 'Thread::offsetGet' => ['mixed', 'offset'=>'mixed'], + 'Thread::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], + 'Thread::offsetUnset' => ['void', 'offset'=>'mixed'], + 'Thread::pop' => ['bool'], + 'Thread::run' => ['void'], + 'Thread::setGarbage' => ['void'], + 'Thread::shift' => ['bool'], + 'Thread::start' => ['bool', 'options='=>'int'], + 'Thread::synchronized' => ['mixed', 'block'=>'Closure', '_='=>'mixed'], + 'Thread::unlock' => ['bool'], + 'Thread::wait' => ['bool', 'timeout='=>'int'], + 'Threaded::__construct' => ['void'], + 'Threaded::addRef' => ['void'], + 'Threaded::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], + 'Threaded::count' => ['int'], + 'Threaded::delRef' => ['void'], + 'Threaded::extend' => ['bool', 'class'=>'string'], + 'Threaded::from' => ['Threaded', 'run'=>'Closure', 'construct='=>'Closure', 'args='=>'array'], + 'Threaded::getRefCount' => ['int'], + 'Threaded::getTerminationInfo' => ['array'], + 'Threaded::isGarbage' => ['bool'], + 'Threaded::isRunning' => ['bool'], + 'Threaded::isTerminated' => ['bool'], + 'Threaded::isWaiting' => ['bool'], + 'Threaded::lock' => ['bool'], + 'Threaded::merge' => ['bool', 'from'=>'mixed', 'overwrite='=>'bool'], + 'Threaded::notify' => ['bool'], + 'Threaded::notifyOne' => ['bool'], + 'Threaded::offsetExists' => ['bool', 'offset'=>'mixed'], + 'Threaded::offsetGet' => ['mixed', 'offset'=>'mixed'], + 'Threaded::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], + 'Threaded::offsetUnset' => ['void', 'offset'=>'mixed'], + 'Threaded::pop' => ['bool'], + 'Threaded::run' => ['void'], + 'Threaded::setGarbage' => ['void'], + 'Threaded::shift' => ['mixed'], + 'Threaded::synchronized' => ['mixed', 'block'=>'Closure', '...args='=>'mixed'], + 'Threaded::unlock' => ['bool'], + 'Threaded::wait' => ['bool', 'timeout='=>'int'], + 'Throwable::__toString' => ['string'], + 'Throwable::getCode' => ['int|string'], + 'Throwable::getFile' => ['string'], + 'Throwable::getLine' => ['int'], + 'Throwable::getMessage' => ['string'], + 'Throwable::getPrevious' => ['?Throwable'], + 'Throwable::getTrace' => ['list\',args?:array}>'], + 'Throwable::getTraceAsString' => ['string'], + 'TokyoTyrant::__construct' => ['void', 'host='=>'string', 'port='=>'int', 'options='=>'array'], + 'TokyoTyrant::add' => ['int|float', 'key'=>'string', 'increment'=>'float', 'type='=>'int'], + 'TokyoTyrant::connect' => ['TokyoTyrant', 'host'=>'string', 'port='=>'int', 'options='=>'array'], + 'TokyoTyrant::connectUri' => ['TokyoTyrant', 'uri'=>'string'], + 'TokyoTyrant::copy' => ['TokyoTyrant', 'path'=>'string'], + 'TokyoTyrant::ext' => ['string', 'name'=>'string', 'options'=>'int', 'key'=>'string', 'value'=>'string'], + 'TokyoTyrant::fwmKeys' => ['array', 'prefix'=>'string', 'max_recs'=>'int'], + 'TokyoTyrant::get' => ['array', 'keys'=>'mixed'], + 'TokyoTyrant::getIterator' => ['TokyoTyrantIterator'], + 'TokyoTyrant::num' => ['int'], + 'TokyoTyrant::out' => ['string', 'keys'=>'mixed'], + 'TokyoTyrant::put' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], + 'TokyoTyrant::putCat' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], + 'TokyoTyrant::putKeep' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], + 'TokyoTyrant::putNr' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], + 'TokyoTyrant::putShl' => ['mixed', 'key'=>'string', 'value'=>'string', 'width'=>'int'], + 'TokyoTyrant::restore' => ['mixed', 'log_dir'=>'string', 'timestamp'=>'int', 'check_consistency='=>'bool'], + 'TokyoTyrant::setMaster' => ['mixed', 'host'=>'string', 'port'=>'int', 'timestamp'=>'int', 'check_consistency='=>'bool'], + 'TokyoTyrant::size' => ['int', 'key'=>'string'], + 'TokyoTyrant::stat' => ['array'], + 'TokyoTyrant::sync' => ['mixed'], + 'TokyoTyrant::tune' => ['TokyoTyrant', 'timeout'=>'float', 'options='=>'int'], + 'TokyoTyrant::vanish' => ['mixed'], + 'TokyoTyrantIterator::__construct' => ['void', 'object'=>'mixed'], + 'TokyoTyrantIterator::current' => ['mixed'], + 'TokyoTyrantIterator::key' => ['mixed'], + 'TokyoTyrantIterator::next' => ['mixed'], + 'TokyoTyrantIterator::rewind' => ['void'], + 'TokyoTyrantIterator::valid' => ['bool'], + 'TokyoTyrantQuery::__construct' => ['void', 'table'=>'TokyoTyrantTable'], + 'TokyoTyrantQuery::addCond' => ['mixed', 'name'=>'string', 'op'=>'int', 'expr'=>'string'], + 'TokyoTyrantQuery::count' => ['int'], + 'TokyoTyrantQuery::current' => ['array'], + 'TokyoTyrantQuery::hint' => ['string'], + 'TokyoTyrantQuery::key' => ['string'], + 'TokyoTyrantQuery::metaSearch' => ['array', 'queries'=>'array', 'type'=>'int'], + 'TokyoTyrantQuery::next' => ['array'], + 'TokyoTyrantQuery::out' => ['TokyoTyrantQuery'], + 'TokyoTyrantQuery::rewind' => ['bool'], + 'TokyoTyrantQuery::search' => ['array'], + 'TokyoTyrantQuery::setLimit' => ['mixed', 'max='=>'int', 'skip='=>'int'], + 'TokyoTyrantQuery::setOrder' => ['mixed', 'name'=>'string', 'type'=>'int'], + 'TokyoTyrantQuery::valid' => ['bool'], + 'TokyoTyrantTable::add' => ['void', 'key'=>'string', 'increment'=>'mixed', 'type='=>'string'], + 'TokyoTyrantTable::genUid' => ['int'], + 'TokyoTyrantTable::get' => ['array', 'keys'=>'mixed'], + 'TokyoTyrantTable::getIterator' => ['TokyoTyrantIterator'], + 'TokyoTyrantTable::getQuery' => ['TokyoTyrantQuery'], + 'TokyoTyrantTable::out' => ['void', 'keys'=>'mixed'], + 'TokyoTyrantTable::put' => ['int', 'key'=>'string', 'columns'=>'array'], + 'TokyoTyrantTable::putCat' => ['void', 'key'=>'string', 'columns'=>'array'], + 'TokyoTyrantTable::putKeep' => ['void', 'key'=>'string', 'columns'=>'array'], + 'TokyoTyrantTable::putNr' => ['void', 'keys'=>'mixed', 'value='=>'string'], + 'TokyoTyrantTable::putShl' => ['void', 'key'=>'string', 'value'=>'string', 'width'=>'int'], + 'TokyoTyrantTable::setIndex' => ['mixed', 'column'=>'string', 'type'=>'int'], + 'Transliterator::create' => ['?Transliterator', 'id'=>'string', 'direction='=>'int'], + 'Transliterator::createFromRules' => ['?Transliterator', 'rules'=>'string', 'direction='=>'int'], + 'Transliterator::createInverse' => ['Transliterator'], + 'Transliterator::getErrorCode' => ['int'], + 'Transliterator::getErrorMessage' => ['string'], + 'Transliterator::listIDs' => ['array'], + 'Transliterator::transliterate' => ['string|false', 'subject'=>'string', 'start='=>'int', 'end='=>'int'], + 'TypeError::__clone' => ['void'], + 'TypeError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?TypeError'], + 'TypeError::__toString' => ['string'], + 'TypeError::getCode' => ['int'], + 'TypeError::getFile' => ['string'], + 'TypeError::getLine' => ['int'], + 'TypeError::getMessage' => ['string'], + 'TypeError::getPrevious' => ['Throwable|TypeError|null'], + 'TypeError::getTrace' => ['list\',args?:array}>'], + 'TypeError::getTraceAsString' => ['string'], + 'UConverter::__construct' => ['void', 'destination_encoding='=>'string', 'source_encoding='=>'string'], + 'UConverter::convert' => ['string', 'string'=>'string', 'reverse='=>'bool'], + 'UConverter::fromUCallback' => ['mixed', 'reason'=>'int', 'source'=>'string', 'codePoint'=>'string', '&w_error'=>'int'], + 'UConverter::getAliases' => ['array', 'name'=>'string'], + 'UConverter::getAvailable' => ['array'], + 'UConverter::getDestinationEncoding' => ['string'], + 'UConverter::getDestinationType' => ['int'], + 'UConverter::getErrorCode' => ['int'], + 'UConverter::getErrorMessage' => ['string'], + 'UConverter::getSourceEncoding' => ['string'], + 'UConverter::getSourceType' => ['int'], + 'UConverter::getStandards' => ['array'], + 'UConverter::getSubstChars' => ['string'], + 'UConverter::reasonText' => ['string', 'reason='=>'int'], + 'UConverter::setDestinationEncoding' => ['bool', 'encoding'=>'string'], + 'UConverter::setSourceEncoding' => ['bool', 'encoding'=>'string'], + 'UConverter::setSubstChars' => ['bool', 'chars'=>'string'], + 'UConverter::toUCallback' => ['mixed', 'reason'=>'int', 'source'=>'string', 'codeUnits'=>'string', '&w_error'=>'int'], + 'UConverter::transcode' => ['string', 'string'=>'string', 'toEncoding'=>'string', 'fromEncoding'=>'string', 'options='=>'?array'], + 'UnderflowException::__clone' => ['void'], + 'UnderflowException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?UnderflowException'], + 'UnderflowException::__toString' => ['string'], + 'UnderflowException::getCode' => ['int'], + 'UnderflowException::getFile' => ['string'], + 'UnderflowException::getLine' => ['int'], + 'UnderflowException::getMessage' => ['string'], + 'UnderflowException::getPrevious' => ['Throwable|UnderflowException|null'], + 'UnderflowException::getTrace' => ['list\',args?:array}>'], + 'UnderflowException::getTraceAsString' => ['string'], + 'UnexpectedValueException::__clone' => ['void'], + 'UnexpectedValueException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?UnexpectedValueException'], + 'UnexpectedValueException::__toString' => ['string'], + 'UnexpectedValueException::getCode' => ['int'], + 'UnexpectedValueException::getFile' => ['string'], + 'UnexpectedValueException::getLine' => ['int'], + 'UnexpectedValueException::getMessage' => ['string'], + 'UnexpectedValueException::getPrevious' => ['Throwable|UnexpectedValueException|null'], + 'UnexpectedValueException::getTrace' => ['list\',args?:array}>'], + 'UnexpectedValueException::getTraceAsString' => ['string'], + 'V8Js::__construct' => ['void', 'object_name='=>'string', 'variables='=>'array', 'extensions='=>'array', 'report_uncaught_exceptions='=>'bool', 'snapshot_blob='=>'string'], + 'V8Js::clearPendingException' => [''], + 'V8Js::compileString' => ['resource', 'script'=>'', 'identifier='=>'string'], + 'V8Js::createSnapshot' => ['false|string', 'embed_source'=>'string'], + 'V8Js::executeScript' => ['', 'script'=>'resource', 'flags='=>'int', 'time_limit='=>'int', 'memory_limit='=>'int'], + 'V8Js::executeString' => ['mixed', 'script'=>'string', 'identifier='=>'string', 'flags='=>'int'], + 'V8Js::getExtensions' => ['string[]'], + 'V8Js::getPendingException' => ['?V8JsException'], + 'V8Js::registerExtension' => ['bool', 'extension_name'=>'string', 'script'=>'string', 'dependencies='=>'array', 'auto_enable='=>'bool'], + 'V8Js::setAverageObjectSize' => ['', 'average_object_size'=>'int'], + 'V8Js::setMemoryLimit' => ['', 'limit'=>'int'], + 'V8Js::setModuleLoader' => ['', 'loader'=>'callable'], + 'V8Js::setModuleNormaliser' => ['', 'normaliser'=>'callable'], + 'V8Js::setTimeLimit' => ['', 'limit'=>'int'], + 'V8JsException::getJsFileName' => ['string'], + 'V8JsException::getJsLineNumber' => ['int'], + 'V8JsException::getJsSourceLine' => ['int'], + 'V8JsException::getJsTrace' => ['string'], + 'V8JsScriptException::__clone' => ['void'], + 'V8JsScriptException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'V8JsScriptException::__toString' => ['string'], + 'V8JsScriptException::__wakeup' => ['void'], + 'V8JsScriptException::getCode' => ['int'], + 'V8JsScriptException::getFile' => ['string'], + 'V8JsScriptException::getJsEndColumn' => ['int'], + 'V8JsScriptException::getJsFileName' => ['string'], + 'V8JsScriptException::getJsLineNumber' => ['int'], + 'V8JsScriptException::getJsSourceLine' => ['string'], + 'V8JsScriptException::getJsStartColumn' => ['int'], + 'V8JsScriptException::getJsTrace' => ['string'], + 'V8JsScriptException::getLine' => ['int'], + 'V8JsScriptException::getMessage' => ['string'], + 'V8JsScriptException::getPrevious' => ['Exception|Throwable'], + 'V8JsScriptException::getTrace' => ['list\',args?:array}>'], + 'V8JsScriptException::getTraceAsString' => ['string'], + 'VARIANT::__construct' => ['void', 'value='=>'mixed', 'type='=>'int', 'codepage='=>'int'], + 'VarnishAdmin::__construct' => ['void', 'args='=>'array'], + 'VarnishAdmin::auth' => ['bool'], + 'VarnishAdmin::ban' => ['int', 'vcl_regex'=>'string'], + 'VarnishAdmin::banUrl' => ['int', 'vcl_regex'=>'string'], + 'VarnishAdmin::clearPanic' => ['int'], + 'VarnishAdmin::connect' => ['bool'], + 'VarnishAdmin::disconnect' => ['bool'], + 'VarnishAdmin::getPanic' => ['string'], + 'VarnishAdmin::getParams' => ['array'], + 'VarnishAdmin::isRunning' => ['bool'], + 'VarnishAdmin::setCompat' => ['void', 'compat'=>'int'], + 'VarnishAdmin::setHost' => ['void', 'host'=>'string'], + 'VarnishAdmin::setIdent' => ['void', 'ident'=>'string'], + 'VarnishAdmin::setParam' => ['int', 'name'=>'string', 'value'=>'string|int'], + 'VarnishAdmin::setPort' => ['void', 'port'=>'int'], + 'VarnishAdmin::setSecret' => ['void', 'secret'=>'string'], + 'VarnishAdmin::setTimeout' => ['void', 'timeout'=>'int'], + 'VarnishAdmin::start' => ['int'], + 'VarnishAdmin::stop' => ['int'], + 'VarnishLog::__construct' => ['void', 'args='=>'array'], + 'VarnishLog::getLine' => ['array'], + 'VarnishLog::getTagName' => ['string', 'index'=>'int'], + 'VarnishStat::__construct' => ['void', 'args='=>'array'], + 'VarnishStat::getSnapshot' => ['array'], + 'Vtiful\Kernel\Chart::__construct' => ['void', 'handle'=>'resource', 'type'=>'int'], + 'Vtiful\Kernel\Chart::axisNameX' => ['Vtiful\Kernel\Chart', 'name'=>'string'], + 'Vtiful\Kernel\Chart::axisNameY' => ['Vtiful\Kernel\Chart', 'name'=>'string'], + 'Vtiful\Kernel\Chart::legendSetPosition' => ['Vtiful\Kernel\Chart', 'type'=>'int'], + 'Vtiful\Kernel\Chart::series' => ['Vtiful\Kernel\Chart', 'value'=>'string', 'categories='=>'string'], + 'Vtiful\Kernel\Chart::seriesName' => ['Vtiful\Kernel\Chart', 'value'=>'string'], + 'Vtiful\Kernel\Chart::style' => ['Vtiful\Kernel\Chart', 'style'=>'int'], + 'Vtiful\Kernel\Chart::title' => ['Vtiful\Kernel\Chart', 'title'=>'string'], + 'Vtiful\Kernel\Chart::toResource' => ['resource'], + 'Vtiful\Kernel\Excel::__construct' => ['void', 'config'=>'array'], + 'Vtiful\Kernel\Excel::activateSheet' => ['bool', 'sheet_name'=>'string'], + 'Vtiful\Kernel\Excel::addSheet' => ['Vtiful\Kernel\Excel', 'sheet_name='=>'?string'], + 'Vtiful\Kernel\Excel::autoFilter' => ['Vtiful\Kernel\Excel', 'range'=>'string'], + 'Vtiful\Kernel\Excel::checkoutSheet' => ['Vtiful\Kernel\Excel', 'sheet_name'=>'string'], + 'Vtiful\Kernel\Excel::close' => ['Vtiful\Kernel\Excel'], + 'Vtiful\Kernel\Excel::columnIndexFromString' => ['int', 'index'=>'string'], + 'Vtiful\Kernel\Excel::constMemory' => ['Vtiful\Kernel\Excel', 'file_name'=>'string', 'sheet_name='=>'?string'], + 'Vtiful\Kernel\Excel::data' => ['Vtiful\Kernel\Excel', 'data'=>'array'], + 'Vtiful\Kernel\Excel::defaultFormat' => ['Vtiful\Kernel\Excel', 'format_handle'=>'resource'], + 'Vtiful\Kernel\Excel::existSheet' => ['bool', 'sheet_name'=>'string'], + 'Vtiful\Kernel\Excel::fileName' => ['Vtiful\Kernel\Excel', 'file_name'=>'string', 'sheet_name='=>'?string'], + 'Vtiful\Kernel\Excel::freezePanes' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int'], + 'Vtiful\Kernel\Excel::getHandle' => ['resource'], + 'Vtiful\Kernel\Excel::getSheetData' => ['array|false'], + 'Vtiful\Kernel\Excel::gridline' => ['Vtiful\Kernel\Excel', 'option='=>'int'], + 'Vtiful\Kernel\Excel::header' => ['Vtiful\Kernel\Excel', 'header'=>'array', 'format_handle='=>'?resource'], + 'Vtiful\Kernel\Excel::insertChart' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'chart_resource'=>'resource'], + 'Vtiful\Kernel\Excel::insertComment' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'comment'=>'string'], + 'Vtiful\Kernel\Excel::insertDate' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'timestamp'=>'int', 'format='=>'?string', 'format_handle='=>'?resource'], + 'Vtiful\Kernel\Excel::insertFormula' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'formula'=>'string', 'format_handle='=>'?resource'], + 'Vtiful\Kernel\Excel::insertImage' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'image'=>'string', 'width='=>'?float', 'height='=>'?float'], + 'Vtiful\Kernel\Excel::insertText' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'data'=>'int|string|double', 'format='=>'?string', 'format_handle='=>'?resource'], + 'Vtiful\Kernel\Excel::insertUrl' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'url'=>'string', 'text='=>'?string', 'tool_tip='=>'?string', 'format='=>'?resource'], + 'Vtiful\Kernel\Excel::mergeCells' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'data'=>'string', 'format_handle='=>'?resource'], + 'Vtiful\Kernel\Excel::nextCellCallback' => ['void', 'fci'=>'callable(int,int,mixed)', 'sheet_name='=>'?string'], + 'Vtiful\Kernel\Excel::nextRow' => ['array|false', 'zv_type_t='=>'?array'], + 'Vtiful\Kernel\Excel::openFile' => ['Vtiful\Kernel\Excel', 'zs_file_name'=>'string'], + 'Vtiful\Kernel\Excel::openSheet' => ['Vtiful\Kernel\Excel', 'zs_sheet_name='=>'?string', 'zl_flag='=>'?int'], + 'Vtiful\Kernel\Excel::output' => ['string'], + 'Vtiful\Kernel\Excel::protection' => ['Vtiful\Kernel\Excel', 'password='=>'?string'], + 'Vtiful\Kernel\Excel::putCSV' => ['bool', 'fp'=>'resource', 'delimiter_str='=>'?string', 'enclosure_str='=>'?string', 'escape_str='=>'?string'], + 'Vtiful\Kernel\Excel::putCSVCallback' => ['bool', 'callback'=>'callable(array):array', 'fp'=>'resource', 'delimiter_str='=>'?string', 'enclosure_str='=>'?string', 'escape_str='=>'?string'], + 'Vtiful\Kernel\Excel::setColumn' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'width'=>'float', 'format_handle='=>'?resource'], + 'Vtiful\Kernel\Excel::setCurrentSheetHide' => ['Vtiful\Kernel\Excel'], + 'Vtiful\Kernel\Excel::setCurrentSheetIsFirst' => ['Vtiful\Kernel\Excel'], + 'Vtiful\Kernel\Excel::setGlobalType' => ['Vtiful\Kernel\Excel', 'zv_type_t'=>'int'], + 'Vtiful\Kernel\Excel::setLandscape' => ['Vtiful\Kernel\Excel'], + 'Vtiful\Kernel\Excel::setMargins' => ['Vtiful\Kernel\Excel', 'left='=>'?float', 'right='=>'?float', 'top='=>'?float', 'bottom='=>'?float'], + 'Vtiful\Kernel\Excel::setPaper' => ['Vtiful\Kernel\Excel', 'paper'=>'int'], + 'Vtiful\Kernel\Excel::setPortrait' => ['Vtiful\Kernel\Excel'], + 'Vtiful\Kernel\Excel::setRow' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'height'=>'float', 'format_handle='=>'?resource'], + 'Vtiful\Kernel\Excel::setSkipRows' => ['Vtiful\Kernel\Excel', 'zv_skip_t'=>'int'], + 'Vtiful\Kernel\Excel::setType' => ['Vtiful\Kernel\Excel', 'zv_type_t'=>'array'], + 'Vtiful\Kernel\Excel::sheetList' => ['array'], + 'Vtiful\Kernel\Excel::showComment' => ['Vtiful\Kernel\Excel'], + 'Vtiful\Kernel\Excel::stringFromColumnIndex' => ['string', 'index'=>'int'], + 'Vtiful\Kernel\Excel::timestampFromDateDouble' => ['int', 'index'=>'?float'], + 'Vtiful\Kernel\Excel::validation' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'validation_resource'=>'resource'], + 'Vtiful\Kernel\Excel::zoom' => ['Vtiful\Kernel\Excel', 'scale'=>'int'], + 'Vtiful\Kernel\Format::__construct' => ['void', 'handle'=>'resource'], + 'Vtiful\Kernel\Format::align' => ['Vtiful\Kernel\Format', '...style'=>'int'], + 'Vtiful\Kernel\Format::background' => ['Vtiful\Kernel\Format', 'color'=>'int', 'pattern='=>'int'], + 'Vtiful\Kernel\Format::bold' => ['Vtiful\Kernel\Format'], + 'Vtiful\Kernel\Format::border' => ['Vtiful\Kernel\Format', 'style'=>'int'], + 'Vtiful\Kernel\Format::font' => ['Vtiful\Kernel\Format', 'font'=>'string'], + 'Vtiful\Kernel\Format::fontColor' => ['Vtiful\Kernel\Format', 'color'=>'int'], + 'Vtiful\Kernel\Format::fontSize' => ['Vtiful\Kernel\Format', 'size'=>'float'], + 'Vtiful\Kernel\Format::italic' => ['Vtiful\Kernel\Format'], + 'Vtiful\Kernel\Format::number' => ['Vtiful\Kernel\Format', 'format'=>'string'], + 'Vtiful\Kernel\Format::strikeout' => ['Vtiful\Kernel\Format'], + 'Vtiful\Kernel\Format::toResource' => ['resource'], + 'Vtiful\Kernel\Format::underline' => ['Vtiful\Kernel\Format', 'style'=>'int'], + 'Vtiful\Kernel\Format::unlocked' => ['Vtiful\Kernel\Format'], + 'Vtiful\Kernel\Format::wrap' => ['Vtiful\Kernel\Format'], + 'Vtiful\Kernel\Validation::__construct' => ['void'], + 'Vtiful\Kernel\Validation::criteriaType' => ['?Vtiful\Kernel\Validation', 'type'=>'int'], + 'Vtiful\Kernel\Validation::maximumFormula' => ['?Vtiful\Kernel\Validation', 'maximum_formula'=>'string'], + 'Vtiful\Kernel\Validation::maximumNumber' => ['?Vtiful\Kernel\Validation', 'maximum_number'=>'float'], + 'Vtiful\Kernel\Validation::minimumFormula' => ['?Vtiful\Kernel\Validation', 'minimum_formula'=>'string'], + 'Vtiful\Kernel\Validation::minimumNumber' => ['?Vtiful\Kernel\Validation', 'minimum_number'=>'float'], + 'Vtiful\Kernel\Validation::toResource' => ['resource'], + 'Vtiful\Kernel\Validation::validationType' => ['?Vtiful\Kernel\Validation', 'type'=>'int'], + 'Vtiful\Kernel\Validation::valueList' => ['?Vtiful\Kernel\Validation', 'value_list'=>'array'], + 'Vtiful\Kernel\Validation::valueNumber' => ['?Vtiful\Kernel\Validation', 'value_number'=>'int'], + 'WeakMap::__construct' => ['void'], + 'WeakMap::count' => ['int'], + 'WeakMap::current' => ['mixed'], + 'WeakMap::key' => ['object'], + 'WeakMap::next' => ['void'], + 'WeakMap::offsetExists' => ['bool', 'object'=>'object'], + 'WeakMap::offsetGet' => ['mixed', 'object'=>'object'], + 'WeakMap::offsetSet' => ['void', 'object'=>'object', 'value'=>'mixed'], + 'WeakMap::offsetUnset' => ['void', 'object'=>'object'], + 'WeakMap::rewind' => ['void'], + 'WeakMap::valid' => ['bool'], + 'Weakref::acquire' => ['bool'], + 'Weakref::get' => ['object'], + 'Weakref::release' => ['bool'], + 'Weakref::valid' => ['bool'], + 'Worker::__construct' => ['void'], + 'Worker::addRef' => ['void'], + 'Worker::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], + 'Worker::collect' => ['int', 'collector='=>'Callable'], + 'Worker::count' => ['int'], + 'Worker::delRef' => ['void'], + 'Worker::detach' => ['void'], + 'Worker::extend' => ['bool', 'class'=>'string'], + 'Worker::getCreatorId' => ['int'], + 'Worker::getCurrentThread' => ['Thread'], + 'Worker::getCurrentThreadId' => ['int'], + 'Worker::getRefCount' => ['int'], + 'Worker::getStacked' => ['int'], + 'Worker::getTerminationInfo' => ['array'], + 'Worker::getThreadId' => ['int'], + 'Worker::globally' => ['mixed'], + 'Worker::isGarbage' => ['bool'], + 'Worker::isJoined' => ['bool'], + 'Worker::isRunning' => ['bool'], + 'Worker::isShutdown' => ['bool'], + 'Worker::isStarted' => ['bool'], + 'Worker::isTerminated' => ['bool'], + 'Worker::isWaiting' => ['bool'], + 'Worker::isWorking' => ['bool'], + 'Worker::join' => ['bool'], + 'Worker::kill' => ['bool'], + 'Worker::lock' => ['bool'], + 'Worker::merge' => ['bool', 'from'=>'', 'overwrite='=>'mixed'], + 'Worker::notify' => ['bool'], + 'Worker::notifyOne' => ['bool'], + 'Worker::offsetExists' => ['bool', 'offset'=>'mixed'], + 'Worker::offsetGet' => ['mixed', 'offset'=>'mixed'], + 'Worker::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], + 'Worker::offsetUnset' => ['void', 'offset'=>'mixed'], + 'Worker::pop' => ['bool'], + 'Worker::run' => ['void'], + 'Worker::setGarbage' => ['void'], + 'Worker::shift' => ['bool'], + 'Worker::shutdown' => ['bool'], + 'Worker::stack' => ['int', '&rw_work'=>'Threaded'], + 'Worker::start' => ['bool', 'options='=>'int'], + 'Worker::synchronized' => ['mixed', 'block'=>'Closure', '_='=>'mixed'], + 'Worker::unlock' => ['bool'], + 'Worker::unstack' => ['int', '&rw_work='=>'Threaded'], + 'Worker::wait' => ['bool', 'timeout='=>'int'], + 'XMLDiff\Base::__construct' => ['void', 'nsname'=>'string'], + 'XMLDiff\Base::diff' => ['mixed', 'from'=>'mixed', 'to'=>'mixed'], + 'XMLDiff\Base::merge' => ['mixed', 'src'=>'mixed', 'diff'=>'mixed'], + 'XMLDiff\DOM::diff' => ['DOMDocument', 'from'=>'DOMDocument', 'to'=>'DOMDocument'], + 'XMLDiff\DOM::merge' => ['DOMDocument', 'src'=>'DOMDocument', 'diff'=>'DOMDocument'], + 'XMLDiff\File::diff' => ['string', 'from'=>'string', 'to'=>'string'], + 'XMLDiff\File::merge' => ['string', 'src'=>'string', 'diff'=>'string'], + 'XMLDiff\Memory::diff' => ['string', 'from'=>'string', 'to'=>'string'], + 'XMLDiff\Memory::merge' => ['string', 'src'=>'string', 'diff'=>'string'], + 'XMLReader::XML' => ['bool', 'source'=>'string', 'encoding='=>'?string', 'options='=>'int'], + 'XMLReader::close' => ['bool'], + 'XMLReader::expand' => ['DOMNode|false', 'basenode='=>'DOMNode'], + 'XMLReader::getAttribute' => ['?string', 'name'=>'string'], + 'XMLReader::getAttributeNo' => ['?string', 'index'=>'int'], + 'XMLReader::getAttributeNs' => ['?string', 'name'=>'string', 'namespaceuri'=>'string'], + 'XMLReader::getParserProperty' => ['bool', 'property'=>'int'], + 'XMLReader::isValid' => ['bool'], + 'XMLReader::lookupNamespace' => ['?string', 'prefix'=>'string'], + 'XMLReader::moveToAttribute' => ['bool', 'name'=>'string'], + 'XMLReader::moveToAttributeNo' => ['bool', 'index'=>'int'], + 'XMLReader::moveToAttributeNs' => ['bool', 'localname'=>'string', 'namespaceuri'=>'string'], + 'XMLReader::moveToElement' => ['bool'], + 'XMLReader::moveToFirstAttribute' => ['bool'], + 'XMLReader::moveToNextAttribute' => ['bool'], + 'XMLReader::next' => ['bool', 'localname='=>'string'], + 'XMLReader::open' => ['bool', 'uri'=>'string', 'encoding='=>'?string', 'options='=>'int'], + 'XMLReader::read' => ['bool'], + 'XMLReader::readInnerXML' => ['string'], + 'XMLReader::readOuterXML' => ['string'], + 'XMLReader::readString' => ['string'], + 'XMLReader::setParserProperty' => ['bool', 'property'=>'int', 'value'=>'bool'], + 'XMLReader::setRelaxNGSchema' => ['bool', 'filename'=>'string'], + 'XMLReader::setRelaxNGSchemaSource' => ['bool', 'source'=>'string'], + 'XMLReader::setSchema' => ['bool', 'filename'=>'string'], + 'XMLWriter::endAttribute' => ['bool'], + 'XMLWriter::endCdata' => ['bool'], + 'XMLWriter::endComment' => ['bool'], + 'XMLWriter::endDocument' => ['bool'], + 'XMLWriter::endDtd' => ['bool'], + 'XMLWriter::endDtdAttlist' => ['bool'], + 'XMLWriter::endDtdElement' => ['bool'], + 'XMLWriter::endDtdEntity' => ['bool'], + 'XMLWriter::endElement' => ['bool'], + 'XMLWriter::endPi' => ['bool'], + 'XMLWriter::flush' => ['string|int|false', 'empty='=>'bool'], + 'XMLWriter::fullEndElement' => ['bool'], + 'XMLWriter::openMemory' => ['bool'], + 'XMLWriter::openUri' => ['bool', 'uri'=>'string'], + 'XMLWriter::outputMemory' => ['string', 'flush='=>'bool'], + 'XMLWriter::setIndent' => ['bool', 'enable'=>'bool'], + 'XMLWriter::setIndentString' => ['bool', 'indentation'=>'string'], + 'XMLWriter::startAttribute' => ['bool', 'name'=>'string'], + 'XMLWriter::startAttributeNs' => ['bool', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string'], + 'XMLWriter::startCdata' => ['bool'], + 'XMLWriter::startComment' => ['bool'], + 'XMLWriter::startDocument' => ['bool', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], + 'XMLWriter::startDtd' => ['bool', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], + 'XMLWriter::startDtdAttlist' => ['bool', 'name'=>'string'], + 'XMLWriter::startDtdElement' => ['bool', 'qualifiedName'=>'string'], + 'XMLWriter::startDtdEntity' => ['bool', 'name'=>'string', 'isParam'=>'bool'], + 'XMLWriter::startElement' => ['bool', 'name'=>'string'], + 'XMLWriter::startElementNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], + 'XMLWriter::startPi' => ['bool', 'target'=>'string'], + 'XMLWriter::text' => ['bool', 'content'=>'string'], + 'XMLWriter::writeAttribute' => ['bool', 'name'=>'string', 'value'=>'string'], + 'XMLWriter::writeAttributeNs' => ['bool', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], + 'XMLWriter::writeCdata' => ['bool', 'content'=>'string'], + 'XMLWriter::writeComment' => ['bool', 'content'=>'string'], + 'XMLWriter::writeDtd' => ['bool', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], + 'XMLWriter::writeDtdAttlist' => ['bool', 'name'=>'string', 'content'=>'string'], + 'XMLWriter::writeDtdElement' => ['bool', 'name'=>'string', 'content'=>'string'], + 'XMLWriter::writeDtdEntity' => ['bool', 'name'=>'string', 'content'=>'string', 'isParam'=>'bool', 'publicId'=>'string', 'systemId'=>'string', 'notationData'=>'string'], + 'XMLWriter::writeElement' => ['bool', 'name'=>'string', 'content='=>'?string'], + 'XMLWriter::writeElementNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'content='=>'?string'], + 'XMLWriter::writePi' => ['bool', 'target'=>'string', 'content'=>'string'], + 'XMLWriter::writeRaw' => ['bool', 'content'=>'string'], + 'XSLTProcessor::getParameter' => ['string|false', 'namespace'=>'string', 'name'=>'string'], + 'XSLTProcessor::hasExsltSupport' => ['bool'], + 'XSLTProcessor::importStylesheet' => ['bool', 'stylesheet'=>'object'], + 'XSLTProcessor::registerPHPFunctions' => ['void', 'functions='=>'mixed'], + 'XSLTProcessor::removeParameter' => ['bool', 'namespace'=>'string', 'name'=>'string'], + 'XSLTProcessor::setParameter' => ['bool', 'namespace'=>'string', 'name'=>'string', 'value'=>'string'], + 'XSLTProcessor::setParameter\'1' => ['bool', 'namespace'=>'string', 'options'=>'array'], + 'XSLTProcessor::setProfiling' => ['bool', 'filename'=>'string'], + 'XSLTProcessor::transformToDoc' => ['DOMDocument|false', 'document'=>'DOMNode'], + 'XSLTProcessor::transformToURI' => ['int', 'document'=>'DOMDocument', 'uri'=>'string'], + 'XSLTProcessor::transformToXML' => ['string|false', 'document'=>'DOMDocument'], + 'Xcom::__construct' => ['void', 'fabric_url='=>'string', 'fabric_token='=>'string', 'capability_token='=>'string'], + 'Xcom::decode' => ['object', 'avro_msg'=>'string', 'json_schema'=>'string'], + 'Xcom::encode' => ['string', 'data'=>'stdClass', 'avro_schema'=>'string'], + 'Xcom::getDebugOutput' => ['string'], + 'Xcom::getLastResponse' => ['string'], + 'Xcom::getLastResponseInfo' => ['array'], + 'Xcom::getOnboardingURL' => ['string', 'capability_name'=>'string', 'agreement_url'=>'string'], + 'Xcom::send' => ['int', 'topic'=>'string', 'data'=>'mixed', 'json_schema='=>'string', 'http_headers='=>'array'], + 'Xcom::sendAsync' => ['int', 'topic'=>'string', 'data'=>'mixed', 'json_schema='=>'string', 'http_headers='=>'array'], + 'XsltProcessor::getSecurityPrefs' => ['int'], + 'XsltProcessor::setSecurityPrefs' => ['int', 'preferences'=>'int'], + 'Yaconf::get' => ['mixed', 'name'=>'string', 'default_value='=>'mixed'], + 'Yaconf::has' => ['bool', 'name'=>'string'], + 'Yaf\Action_Abstract::__clone' => ['void'], + 'Yaf\Action_Abstract::__construct' => ['void', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract', 'view'=>'Yaf\View_Interface', 'invokeArgs='=>'?array'], + 'Yaf\Action_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], + 'Yaf\Action_Abstract::execute' => ['mixed'], + 'Yaf\Action_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], + 'Yaf\Action_Abstract::getController' => ['Yaf\Controller_Abstract'], + 'Yaf\Action_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], + 'Yaf\Action_Abstract::getInvokeArgs' => ['array'], + 'Yaf\Action_Abstract::getModuleName' => ['string'], + 'Yaf\Action_Abstract::getRequest' => ['Yaf\Request_Abstract'], + 'Yaf\Action_Abstract::getResponse' => ['Yaf\Response_Abstract'], + 'Yaf\Action_Abstract::getView' => ['Yaf\View_Interface'], + 'Yaf\Action_Abstract::getViewpath' => ['string'], + 'Yaf\Action_Abstract::init' => [''], + 'Yaf\Action_Abstract::initView' => ['Yaf\Response_Abstract', 'options='=>'?array'], + 'Yaf\Action_Abstract::redirect' => ['bool', 'url'=>'string'], + 'Yaf\Action_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], + 'Yaf\Action_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], + 'Yaf\Application::__clone' => ['void'], + 'Yaf\Application::__construct' => ['void', 'config'=>'array|string', 'envrion='=>'string'], + 'Yaf\Application::__destruct' => ['void'], + 'Yaf\Application::__sleep' => ['string[]'], + 'Yaf\Application::__wakeup' => ['void'], + 'Yaf\Application::app' => ['?Yaf\Application'], + 'Yaf\Application::bootstrap' => ['Yaf\Application', 'bootstrap='=>'?Yaf\Bootstrap_Abstract'], + 'Yaf\Application::clearLastError' => ['void'], + 'Yaf\Application::environ' => ['string'], + 'Yaf\Application::execute' => ['void', 'entry'=>'callable', '_='=>'string'], + 'Yaf\Application::getAppDirectory' => ['string'], + 'Yaf\Application::getConfig' => ['Yaf\Config_Abstract'], + 'Yaf\Application::getDispatcher' => ['Yaf\Dispatcher'], + 'Yaf\Application::getLastErrorMsg' => ['string'], + 'Yaf\Application::getLastErrorNo' => ['int'], + 'Yaf\Application::getModules' => ['array'], + 'Yaf\Application::run' => ['void'], + 'Yaf\Application::setAppDirectory' => ['Yaf\Application', 'directory'=>'string'], + 'Yaf\Config\Ini::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], + 'Yaf\Config\Ini::__get' => ['', 'name='=>'mixed'], + 'Yaf\Config\Ini::__isset' => ['', 'name'=>'string'], + 'Yaf\Config\Ini::__set' => ['void', 'name'=>'', 'value'=>''], + 'Yaf\Config\Ini::count' => ['int'], + 'Yaf\Config\Ini::current' => ['mixed'], + 'Yaf\Config\Ini::get' => ['mixed', 'name='=>'mixed'], + 'Yaf\Config\Ini::key' => ['int|string'], + 'Yaf\Config\Ini::next' => ['void'], + 'Yaf\Config\Ini::offsetExists' => ['bool', 'name'=>'mixed'], + 'Yaf\Config\Ini::offsetGet' => ['mixed', 'name'=>'mixed'], + 'Yaf\Config\Ini::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], + 'Yaf\Config\Ini::offsetUnset' => ['void', 'name'=>'mixed'], + 'Yaf\Config\Ini::readonly' => ['bool'], + 'Yaf\Config\Ini::rewind' => ['void'], + 'Yaf\Config\Ini::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], + 'Yaf\Config\Ini::toArray' => ['array'], + 'Yaf\Config\Ini::valid' => ['bool'], + 'Yaf\Config\Simple::__construct' => ['void', 'array'=>'array', 'readonly='=>'string'], + 'Yaf\Config\Simple::__get' => ['', 'name='=>'mixed'], + 'Yaf\Config\Simple::__isset' => ['', 'name'=>'string'], + 'Yaf\Config\Simple::__set' => ['void', 'name'=>'', 'value'=>''], + 'Yaf\Config\Simple::count' => ['int'], + 'Yaf\Config\Simple::current' => ['mixed'], + 'Yaf\Config\Simple::get' => ['mixed', 'name='=>'mixed'], + 'Yaf\Config\Simple::key' => ['int|string'], + 'Yaf\Config\Simple::next' => ['void'], + 'Yaf\Config\Simple::offsetExists' => ['bool', 'name'=>'mixed'], + 'Yaf\Config\Simple::offsetGet' => ['mixed', 'name'=>'mixed'], + 'Yaf\Config\Simple::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], + 'Yaf\Config\Simple::offsetUnset' => ['void', 'name'=>'mixed'], + 'Yaf\Config\Simple::readonly' => ['bool'], + 'Yaf\Config\Simple::rewind' => ['void'], + 'Yaf\Config\Simple::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], + 'Yaf\Config\Simple::toArray' => ['array'], + 'Yaf\Config\Simple::valid' => ['bool'], + 'Yaf\Config_Abstract::__construct' => ['void'], + 'Yaf\Config_Abstract::get' => ['mixed', 'name='=>'string'], + 'Yaf\Config_Abstract::readonly' => ['bool'], + 'Yaf\Config_Abstract::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], + 'Yaf\Config_Abstract::toArray' => ['array'], + 'Yaf\Controller_Abstract::__clone' => ['void'], + 'Yaf\Controller_Abstract::__construct' => ['void', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract', 'view'=>'Yaf\View_Interface', 'invokeArgs='=>'?array'], + 'Yaf\Controller_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], + 'Yaf\Controller_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], + 'Yaf\Controller_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], + 'Yaf\Controller_Abstract::getInvokeArgs' => ['array'], + 'Yaf\Controller_Abstract::getModuleName' => ['string'], + 'Yaf\Controller_Abstract::getRequest' => ['Yaf\Request_Abstract'], + 'Yaf\Controller_Abstract::getResponse' => ['Yaf\Response_Abstract'], + 'Yaf\Controller_Abstract::getView' => ['Yaf\View_Interface'], + 'Yaf\Controller_Abstract::getViewpath' => ['string'], + 'Yaf\Controller_Abstract::init' => [''], + 'Yaf\Controller_Abstract::initView' => ['Yaf\Response_Abstract', 'options='=>'?array'], + 'Yaf\Controller_Abstract::redirect' => ['bool', 'url'=>'string'], + 'Yaf\Controller_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], + 'Yaf\Controller_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], + 'Yaf\Dispatcher::__clone' => ['void'], + 'Yaf\Dispatcher::__construct' => ['void'], + 'Yaf\Dispatcher::__sleep' => ['list'], + 'Yaf\Dispatcher::__wakeup' => ['void'], + 'Yaf\Dispatcher::autoRender' => ['Yaf\Dispatcher', 'flag='=>'bool'], + 'Yaf\Dispatcher::catchException' => ['Yaf\Dispatcher', 'flag='=>'bool'], + 'Yaf\Dispatcher::disableView' => ['bool'], + 'Yaf\Dispatcher::dispatch' => ['Yaf\Response_Abstract', 'request'=>'Yaf\Request_Abstract'], + 'Yaf\Dispatcher::enableView' => ['Yaf\Dispatcher'], + 'Yaf\Dispatcher::flushInstantly' => ['Yaf\Dispatcher', 'flag='=>'bool'], + 'Yaf\Dispatcher::getApplication' => ['Yaf\Application'], + 'Yaf\Dispatcher::getInstance' => ['Yaf\Dispatcher'], + 'Yaf\Dispatcher::getRequest' => ['Yaf\Request_Abstract'], + 'Yaf\Dispatcher::getRouter' => ['Yaf\Router'], + 'Yaf\Dispatcher::initView' => ['Yaf\View_Interface', 'templates_dir'=>'string', 'options='=>'?array'], + 'Yaf\Dispatcher::registerPlugin' => ['Yaf\Dispatcher', 'plugin'=>'Yaf\Plugin_Abstract'], + 'Yaf\Dispatcher::returnResponse' => ['Yaf\Dispatcher', 'flag'=>'bool'], + 'Yaf\Dispatcher::setDefaultAction' => ['Yaf\Dispatcher', 'action'=>'string'], + 'Yaf\Dispatcher::setDefaultController' => ['Yaf\Dispatcher', 'controller'=>'string'], + 'Yaf\Dispatcher::setDefaultModule' => ['Yaf\Dispatcher', 'module'=>'string'], + 'Yaf\Dispatcher::setErrorHandler' => ['Yaf\Dispatcher', 'callback'=>'callable', 'error_types'=>'int'], + 'Yaf\Dispatcher::setRequest' => ['Yaf\Dispatcher', 'request'=>'Yaf\Request_Abstract'], + 'Yaf\Dispatcher::setView' => ['Yaf\Dispatcher', 'view'=>'Yaf\View_Interface'], + 'Yaf\Dispatcher::throwException' => ['Yaf\Dispatcher', 'flag='=>'bool'], + 'Yaf\Loader::__clone' => ['void'], + 'Yaf\Loader::__construct' => ['void'], + 'Yaf\Loader::__sleep' => ['list'], + 'Yaf\Loader::__wakeup' => ['void'], + 'Yaf\Loader::autoload' => ['bool', 'class_name'=>'string'], + 'Yaf\Loader::clearLocalNamespace' => [''], + 'Yaf\Loader::getInstance' => ['Yaf\Loader', 'local_library_path='=>'string', 'global_library_path='=>'string'], + 'Yaf\Loader::getLibraryPath' => ['string', 'is_global='=>'bool'], + 'Yaf\Loader::getLocalNamespace' => ['string'], + 'Yaf\Loader::import' => ['bool', 'file'=>'string'], + 'Yaf\Loader::isLocalName' => ['bool', 'class_name'=>'string'], + 'Yaf\Loader::registerLocalNamespace' => ['bool', 'name_prefix'=>'string|string[]'], + 'Yaf\Loader::setLibraryPath' => ['Yaf\Loader', 'directory'=>'string', 'global='=>'bool'], + 'Yaf\Plugin_Abstract::dispatchLoopShutdown' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], + 'Yaf\Plugin_Abstract::dispatchLoopStartup' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], + 'Yaf\Plugin_Abstract::postDispatch' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], + 'Yaf\Plugin_Abstract::preDispatch' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], + 'Yaf\Plugin_Abstract::preResponse' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], + 'Yaf\Plugin_Abstract::routerShutdown' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], + 'Yaf\Plugin_Abstract::routerStartup' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], + 'Yaf\Registry::__clone' => ['void'], + 'Yaf\Registry::__construct' => ['void'], + 'Yaf\Registry::del' => ['bool|void', 'name'=>'string'], + 'Yaf\Registry::get' => ['mixed', 'name'=>'string'], + 'Yaf\Registry::has' => ['bool', 'name'=>'string'], + 'Yaf\Registry::set' => ['bool', 'name'=>'string', 'value'=>'mixed'], + 'Yaf\Request\Http::__clone' => ['void'], + 'Yaf\Request\Http::__construct' => ['void', 'request_uri'=>'string', 'base_uri'=>'string'], + 'Yaf\Request\Http::get' => ['mixed', 'name'=>'string', 'default='=>'string'], + 'Yaf\Request\Http::getActionName' => ['string'], + 'Yaf\Request\Http::getBaseUri' => ['string'], + 'Yaf\Request\Http::getControllerName' => ['string'], + 'Yaf\Request\Http::getCookie' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request\Http::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request\Http::getException' => ['Yaf\Exception'], + 'Yaf\Request\Http::getFiles' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request\Http::getLanguage' => ['string'], + 'Yaf\Request\Http::getMethod' => ['string'], + 'Yaf\Request\Http::getModuleName' => ['string'], + 'Yaf\Request\Http::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], + 'Yaf\Request\Http::getParams' => ['array'], + 'Yaf\Request\Http::getPost' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request\Http::getQuery' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request\Http::getRequest' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request\Http::getRequestUri' => ['string'], + 'Yaf\Request\Http::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request\Http::isCli' => ['bool'], + 'Yaf\Request\Http::isDispatched' => ['bool'], + 'Yaf\Request\Http::isGet' => ['bool'], + 'Yaf\Request\Http::isHead' => ['bool'], + 'Yaf\Request\Http::isOptions' => ['bool'], + 'Yaf\Request\Http::isPost' => ['bool'], + 'Yaf\Request\Http::isPut' => ['bool'], + 'Yaf\Request\Http::isRouted' => ['bool'], + 'Yaf\Request\Http::isXmlHttpRequest' => ['bool'], + 'Yaf\Request\Http::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], + 'Yaf\Request\Http::setBaseUri' => ['bool', 'uri'=>'string'], + 'Yaf\Request\Http::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], + 'Yaf\Request\Http::setDispatched' => ['bool'], + 'Yaf\Request\Http::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], + 'Yaf\Request\Http::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], + 'Yaf\Request\Http::setRequestUri' => ['', 'uri'=>'string'], + 'Yaf\Request\Http::setRouted' => ['Yaf\Request_Abstract|bool'], + 'Yaf\Request\Simple::__clone' => ['void'], + 'Yaf\Request\Simple::__construct' => ['void', 'method'=>'string', 'controller'=>'string', 'action'=>'string', 'params='=>'string'], + 'Yaf\Request\Simple::get' => ['mixed', 'name'=>'string', 'default='=>'string'], + 'Yaf\Request\Simple::getActionName' => ['string'], + 'Yaf\Request\Simple::getBaseUri' => ['string'], + 'Yaf\Request\Simple::getControllerName' => ['string'], + 'Yaf\Request\Simple::getCookie' => ['mixed', 'name='=>'string', 'default='=>'string'], + 'Yaf\Request\Simple::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request\Simple::getException' => ['Yaf\Exception'], + 'Yaf\Request\Simple::getFiles' => ['array', 'name='=>'mixed', 'default='=>'null'], + 'Yaf\Request\Simple::getLanguage' => ['string'], + 'Yaf\Request\Simple::getMethod' => ['string'], + 'Yaf\Request\Simple::getModuleName' => ['string'], + 'Yaf\Request\Simple::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], + 'Yaf\Request\Simple::getParams' => ['array'], + 'Yaf\Request\Simple::getPost' => ['mixed', 'name='=>'string', 'default='=>'string'], + 'Yaf\Request\Simple::getQuery' => ['mixed', 'name='=>'string', 'default='=>'string'], + 'Yaf\Request\Simple::getRequest' => ['mixed', 'name='=>'string', 'default='=>'string'], + 'Yaf\Request\Simple::getRequestUri' => ['string'], + 'Yaf\Request\Simple::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request\Simple::isCli' => ['bool'], + 'Yaf\Request\Simple::isDispatched' => ['bool'], + 'Yaf\Request\Simple::isGet' => ['bool'], + 'Yaf\Request\Simple::isHead' => ['bool'], + 'Yaf\Request\Simple::isOptions' => ['bool'], + 'Yaf\Request\Simple::isPost' => ['bool'], + 'Yaf\Request\Simple::isPut' => ['bool'], + 'Yaf\Request\Simple::isRouted' => ['bool'], + 'Yaf\Request\Simple::isXmlHttpRequest' => ['bool'], + 'Yaf\Request\Simple::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], + 'Yaf\Request\Simple::setBaseUri' => ['bool', 'uri'=>'string'], + 'Yaf\Request\Simple::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], + 'Yaf\Request\Simple::setDispatched' => ['bool'], + 'Yaf\Request\Simple::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], + 'Yaf\Request\Simple::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], + 'Yaf\Request\Simple::setRequestUri' => ['', 'uri'=>'string'], + 'Yaf\Request\Simple::setRouted' => ['Yaf\Request_Abstract|bool'], + 'Yaf\Request_Abstract::getActionName' => ['string'], + 'Yaf\Request_Abstract::getBaseUri' => ['string'], + 'Yaf\Request_Abstract::getControllerName' => ['string'], + 'Yaf\Request_Abstract::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request_Abstract::getException' => ['Yaf\Exception'], + 'Yaf\Request_Abstract::getLanguage' => ['string'], + 'Yaf\Request_Abstract::getMethod' => ['string'], + 'Yaf\Request_Abstract::getModuleName' => ['string'], + 'Yaf\Request_Abstract::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], + 'Yaf\Request_Abstract::getParams' => ['array'], + 'Yaf\Request_Abstract::getRequestUri' => ['string'], + 'Yaf\Request_Abstract::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf\Request_Abstract::isCli' => ['bool'], + 'Yaf\Request_Abstract::isDispatched' => ['bool'], + 'Yaf\Request_Abstract::isGet' => ['bool'], + 'Yaf\Request_Abstract::isHead' => ['bool'], + 'Yaf\Request_Abstract::isOptions' => ['bool'], + 'Yaf\Request_Abstract::isPost' => ['bool'], + 'Yaf\Request_Abstract::isPut' => ['bool'], + 'Yaf\Request_Abstract::isRouted' => ['bool'], + 'Yaf\Request_Abstract::isXmlHttpRequest' => ['bool'], + 'Yaf\Request_Abstract::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], + 'Yaf\Request_Abstract::setBaseUri' => ['bool', 'uri'=>'string'], + 'Yaf\Request_Abstract::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], + 'Yaf\Request_Abstract::setDispatched' => ['bool'], + 'Yaf\Request_Abstract::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], + 'Yaf\Request_Abstract::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], + 'Yaf\Request_Abstract::setRequestUri' => ['', 'uri'=>'string'], + 'Yaf\Request_Abstract::setRouted' => ['Yaf\Request_Abstract|bool'], + 'Yaf\Response\Cli::__clone' => ['void'], + 'Yaf\Response\Cli::__construct' => ['void'], + 'Yaf\Response\Cli::__destruct' => ['void'], + 'Yaf\Response\Cli::__toString' => ['string'], + 'Yaf\Response\Cli::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf\Response\Cli::clearBody' => ['bool', 'key='=>'string'], + 'Yaf\Response\Cli::getBody' => ['mixed', 'key='=>'?string'], + 'Yaf\Response\Cli::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf\Response\Cli::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf\Response\Http::__clone' => ['void'], + 'Yaf\Response\Http::__construct' => ['void'], + 'Yaf\Response\Http::__destruct' => ['void'], + 'Yaf\Response\Http::__toString' => ['string'], + 'Yaf\Response\Http::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf\Response\Http::clearBody' => ['bool', 'key='=>'string'], + 'Yaf\Response\Http::clearHeaders' => ['Yaf\Response_Abstract|false', 'name='=>'string'], + 'Yaf\Response\Http::getBody' => ['mixed', 'key='=>'?string'], + 'Yaf\Response\Http::getHeader' => ['mixed', 'name='=>'string'], + 'Yaf\Response\Http::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf\Response\Http::response' => ['bool'], + 'Yaf\Response\Http::setAllHeaders' => ['bool', 'headers'=>'array'], + 'Yaf\Response\Http::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf\Response\Http::setHeader' => ['bool', 'name'=>'string', 'value'=>'string', 'replace='=>'bool', 'response_code='=>'int'], + 'Yaf\Response\Http::setRedirect' => ['bool', 'url'=>'string'], + 'Yaf\Response_Abstract::__clone' => ['void'], + 'Yaf\Response_Abstract::__construct' => ['void'], + 'Yaf\Response_Abstract::__destruct' => ['void'], + 'Yaf\Response_Abstract::__toString' => ['void'], + 'Yaf\Response_Abstract::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf\Response_Abstract::clearBody' => ['bool', 'key='=>'string'], + 'Yaf\Response_Abstract::getBody' => ['mixed', 'key='=>'?string'], + 'Yaf\Response_Abstract::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf\Response_Abstract::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf\Route\Map::__construct' => ['void', 'controller_prefer='=>'bool', 'delimiter='=>'string'], + 'Yaf\Route\Map::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], + 'Yaf\Route\Map::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], + 'Yaf\Route\Regex::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'map='=>'?array', 'verify='=>'?array', 'reverse='=>'string'], + 'Yaf\Route\Regex::addConfig' => ['Yaf\Router|bool', 'config'=>'Yaf\Config_Abstract'], + 'Yaf\Route\Regex::addRoute' => ['Yaf\Router|bool', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], + 'Yaf\Route\Regex::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], + 'Yaf\Route\Regex::getCurrentRoute' => ['string'], + 'Yaf\Route\Regex::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], + 'Yaf\Route\Regex::getRoutes' => ['Yaf\Route_Interface[]'], + 'Yaf\Route\Regex::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], + 'Yaf\Route\Rewrite::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'verify='=>'?array', 'reverse='=>'string'], + 'Yaf\Route\Rewrite::addConfig' => ['Yaf\Router|bool', 'config'=>'Yaf\Config_Abstract'], + 'Yaf\Route\Rewrite::addRoute' => ['Yaf\Router|bool', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], + 'Yaf\Route\Rewrite::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], + 'Yaf\Route\Rewrite::getCurrentRoute' => ['string'], + 'Yaf\Route\Rewrite::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], + 'Yaf\Route\Rewrite::getRoutes' => ['Yaf\Route_Interface[]'], + 'Yaf\Route\Rewrite::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], + 'Yaf\Route\Simple::__construct' => ['void', 'module_name'=>'string', 'controller_name'=>'string', 'action_name'=>'string'], + 'Yaf\Route\Simple::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], + 'Yaf\Route\Simple::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], + 'Yaf\Route\Supervar::__construct' => ['void', 'supervar_name'=>'string'], + 'Yaf\Route\Supervar::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], + 'Yaf\Route\Supervar::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], + 'Yaf\Route_Interface::__construct' => ['Yaf\Route_Interface'], + 'Yaf\Route_Interface::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], + 'Yaf\Route_Interface::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], + 'Yaf\Route_Static::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], + 'Yaf\Route_Static::match' => ['bool', 'uri'=>'string'], + 'Yaf\Route_Static::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], + 'Yaf\Router::__construct' => ['void'], + 'Yaf\Router::addConfig' => ['Yaf\Router|false', 'config'=>'Yaf\Config_Abstract'], + 'Yaf\Router::addRoute' => ['Yaf\Router|false', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], + 'Yaf\Router::getCurrentRoute' => ['string'], + 'Yaf\Router::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], + 'Yaf\Router::getRoutes' => ['Yaf\Route_Interface[]'], + 'Yaf\Router::route' => ['Yaf\Router|false', 'request'=>'Yaf\Request_Abstract'], + 'Yaf\Session::__clone' => ['void'], + 'Yaf\Session::__construct' => ['void'], + 'Yaf\Session::__get' => ['void', 'name'=>''], + 'Yaf\Session::__isset' => ['void', 'name'=>''], + 'Yaf\Session::__set' => ['void', 'name'=>'', 'value'=>''], + 'Yaf\Session::__sleep' => ['list'], + 'Yaf\Session::__unset' => ['void', 'name'=>''], + 'Yaf\Session::__wakeup' => ['void'], + 'Yaf\Session::count' => ['int'], + 'Yaf\Session::current' => ['mixed'], + 'Yaf\Session::del' => ['Yaf\Session|false', 'name'=>'string'], + 'Yaf\Session::get' => ['mixed', 'name'=>'string'], + 'Yaf\Session::getInstance' => ['Yaf\Session'], + 'Yaf\Session::has' => ['bool', 'name'=>'string'], + 'Yaf\Session::key' => ['int|string'], + 'Yaf\Session::next' => ['void'], + 'Yaf\Session::offsetExists' => ['bool', 'name'=>'mixed'], + 'Yaf\Session::offsetGet' => ['mixed', 'name'=>'mixed'], + 'Yaf\Session::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], + 'Yaf\Session::offsetUnset' => ['void', 'name'=>'mixed'], + 'Yaf\Session::rewind' => ['void'], + 'Yaf\Session::set' => ['Yaf\Session|false', 'name'=>'string', 'value'=>'mixed'], + 'Yaf\Session::start' => ['Yaf\Session'], + 'Yaf\Session::valid' => ['bool'], + 'Yaf\View\Simple::__construct' => ['void', 'template_dir'=>'string', 'options='=>'?array'], + 'Yaf\View\Simple::__get' => ['mixed', 'name='=>'null'], + 'Yaf\View\Simple::__isset' => ['', 'name'=>'string'], + 'Yaf\View\Simple::__set' => ['void', 'name'=>'string', 'value='=>'mixed'], + 'Yaf\View\Simple::assign' => ['Yaf\View\Simple', 'name'=>'array|string', 'value='=>'mixed'], + 'Yaf\View\Simple::assignRef' => ['Yaf\View\Simple', 'name'=>'string', '&value'=>'mixed'], + 'Yaf\View\Simple::clear' => ['Yaf\View\Simple', 'name='=>'string'], + 'Yaf\View\Simple::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'?array'], + 'Yaf\View\Simple::eval' => ['bool|void', 'tpl_str'=>'string', 'vars='=>'?array'], + 'Yaf\View\Simple::getScriptPath' => ['string'], + 'Yaf\View\Simple::render' => ['string|void', 'tpl'=>'string', 'tpl_vars='=>'?array'], + 'Yaf\View\Simple::setScriptPath' => ['Yaf\View\Simple', 'template_dir'=>'string'], + 'Yaf\View_Interface::assign' => ['bool', 'name'=>'array|string', 'value'=>'mixed'], + 'Yaf\View_Interface::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'?array'], + 'Yaf\View_Interface::getScriptPath' => ['string'], + 'Yaf\View_Interface::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'?array'], + 'Yaf\View_Interface::setScriptPath' => ['void', 'template_dir'=>'string'], + 'Yaf_Action_Abstract::__clone' => ['void'], + 'Yaf_Action_Abstract::__construct' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract', 'view'=>'Yaf_View_Interface', 'invokeArgs='=>'?array'], + 'Yaf_Action_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], + 'Yaf_Action_Abstract::execute' => ['mixed', 'arg='=>'mixed', '...args='=>'mixed'], + 'Yaf_Action_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], + 'Yaf_Action_Abstract::getController' => ['Yaf_Controller_Abstract'], + 'Yaf_Action_Abstract::getControllerName' => ['string'], + 'Yaf_Action_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], + 'Yaf_Action_Abstract::getInvokeArgs' => ['array'], + 'Yaf_Action_Abstract::getModuleName' => ['string'], + 'Yaf_Action_Abstract::getRequest' => ['Yaf_Request_Abstract'], + 'Yaf_Action_Abstract::getResponse' => ['Yaf_Response_Abstract'], + 'Yaf_Action_Abstract::getView' => ['Yaf_View_Interface'], + 'Yaf_Action_Abstract::getViewpath' => ['string'], + 'Yaf_Action_Abstract::init' => [''], + 'Yaf_Action_Abstract::initView' => ['Yaf_Response_Abstract', 'options='=>'?array'], + 'Yaf_Action_Abstract::redirect' => ['bool', 'url'=>'string'], + 'Yaf_Action_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], + 'Yaf_Action_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], + 'Yaf_Application::__clone' => ['void'], + 'Yaf_Application::__construct' => ['void', 'config'=>'mixed', 'envrion='=>'string'], + 'Yaf_Application::__destruct' => ['void'], + 'Yaf_Application::__sleep' => ['list'], + 'Yaf_Application::__wakeup' => ['void'], + 'Yaf_Application::app' => ['?Yaf_Application'], + 'Yaf_Application::bootstrap' => ['Yaf_Application', 'bootstrap='=>'Yaf_Bootstrap_Abstract'], + 'Yaf_Application::clearLastError' => ['Yaf_Application'], + 'Yaf_Application::environ' => ['string'], + 'Yaf_Application::execute' => ['void', 'entry'=>'callable', '...args'=>'string'], + 'Yaf_Application::getAppDirectory' => ['Yaf_Application'], + 'Yaf_Application::getConfig' => ['Yaf_Config_Abstract'], + 'Yaf_Application::getDispatcher' => ['Yaf_Dispatcher'], + 'Yaf_Application::getLastErrorMsg' => ['string'], + 'Yaf_Application::getLastErrorNo' => ['int'], + 'Yaf_Application::getModules' => ['array'], + 'Yaf_Application::run' => ['void'], + 'Yaf_Application::setAppDirectory' => ['Yaf_Application', 'directory'=>'string'], + 'Yaf_Config_Abstract::__construct' => ['void'], + 'Yaf_Config_Abstract::get' => ['mixed', 'name'=>'string', 'value'=>'mixed'], + 'Yaf_Config_Abstract::readonly' => ['bool'], + 'Yaf_Config_Abstract::set' => ['Yaf_Config_Abstract'], + 'Yaf_Config_Abstract::toArray' => ['array'], + 'Yaf_Config_Ini::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], + 'Yaf_Config_Ini::__get' => ['void', 'name='=>'string'], + 'Yaf_Config_Ini::__isset' => ['void', 'name'=>'string'], + 'Yaf_Config_Ini::__set' => ['void', 'name'=>'string', 'value'=>'mixed'], + 'Yaf_Config_Ini::count' => ['void'], + 'Yaf_Config_Ini::current' => ['void'], + 'Yaf_Config_Ini::get' => ['mixed', 'name='=>'mixed'], + 'Yaf_Config_Ini::key' => ['void'], + 'Yaf_Config_Ini::next' => ['void'], + 'Yaf_Config_Ini::offsetExists' => ['void', 'name'=>'string'], + 'Yaf_Config_Ini::offsetGet' => ['void', 'name'=>'string'], + 'Yaf_Config_Ini::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], + 'Yaf_Config_Ini::offsetUnset' => ['void', 'name'=>'string'], + 'Yaf_Config_Ini::readonly' => ['void'], + 'Yaf_Config_Ini::rewind' => ['void'], + 'Yaf_Config_Ini::set' => ['Yaf_Config_Abstract', 'name'=>'string', 'value'=>'mixed'], + 'Yaf_Config_Ini::toArray' => ['array'], + 'Yaf_Config_Ini::valid' => ['void'], + 'Yaf_Config_Simple::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], + 'Yaf_Config_Simple::__get' => ['void', 'name='=>'string'], + 'Yaf_Config_Simple::__isset' => ['void', 'name'=>'string'], + 'Yaf_Config_Simple::__set' => ['void', 'name'=>'string', 'value'=>'string'], + 'Yaf_Config_Simple::count' => ['void'], + 'Yaf_Config_Simple::current' => ['void'], + 'Yaf_Config_Simple::get' => ['mixed', 'name='=>'mixed'], + 'Yaf_Config_Simple::key' => ['void'], + 'Yaf_Config_Simple::next' => ['void'], + 'Yaf_Config_Simple::offsetExists' => ['void', 'name'=>'string'], + 'Yaf_Config_Simple::offsetGet' => ['void', 'name'=>'string'], + 'Yaf_Config_Simple::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], + 'Yaf_Config_Simple::offsetUnset' => ['void', 'name'=>'string'], + 'Yaf_Config_Simple::readonly' => ['void'], + 'Yaf_Config_Simple::rewind' => ['void'], + 'Yaf_Config_Simple::set' => ['Yaf_Config_Abstract', 'name'=>'string', 'value'=>'mixed'], + 'Yaf_Config_Simple::toArray' => ['array'], + 'Yaf_Config_Simple::valid' => ['void'], + 'Yaf_Controller_Abstract::__clone' => ['void'], + 'Yaf_Controller_Abstract::__construct' => ['void'], + 'Yaf_Controller_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'array'], + 'Yaf_Controller_Abstract::forward' => ['void', 'action'=>'string', 'parameters='=>'array'], + 'Yaf_Controller_Abstract::forward\'1' => ['void', 'controller'=>'string', 'action'=>'string', 'parameters='=>'array'], + 'Yaf_Controller_Abstract::forward\'2' => ['void', 'module'=>'string', 'controller'=>'string', 'action'=>'string', 'parameters='=>'array'], + 'Yaf_Controller_Abstract::getInvokeArg' => ['void', 'name'=>'string'], + 'Yaf_Controller_Abstract::getInvokeArgs' => ['void'], + 'Yaf_Controller_Abstract::getModuleName' => ['string'], + 'Yaf_Controller_Abstract::getName' => ['string'], + 'Yaf_Controller_Abstract::getRequest' => ['Yaf_Request_Abstract'], + 'Yaf_Controller_Abstract::getResponse' => ['Yaf_Response_Abstract'], + 'Yaf_Controller_Abstract::getView' => ['Yaf_View_Interface'], + 'Yaf_Controller_Abstract::getViewpath' => ['void'], + 'Yaf_Controller_Abstract::init' => ['void'], + 'Yaf_Controller_Abstract::initView' => ['void', 'options='=>'array'], + 'Yaf_Controller_Abstract::redirect' => ['bool', 'url'=>'string'], + 'Yaf_Controller_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'array'], + 'Yaf_Controller_Abstract::setViewpath' => ['void', 'view_directory'=>'string'], + 'Yaf_Dispatcher::__clone' => ['void'], + 'Yaf_Dispatcher::__construct' => ['void'], + 'Yaf_Dispatcher::__sleep' => ['list'], + 'Yaf_Dispatcher::__wakeup' => ['void'], + 'Yaf_Dispatcher::autoRender' => ['Yaf_Dispatcher', 'flag='=>'bool'], + 'Yaf_Dispatcher::catchException' => ['Yaf_Dispatcher', 'flag='=>'bool'], + 'Yaf_Dispatcher::disableView' => ['bool'], + 'Yaf_Dispatcher::dispatch' => ['Yaf_Response_Abstract', 'request'=>'Yaf_Request_Abstract'], + 'Yaf_Dispatcher::enableView' => ['Yaf_Dispatcher'], + 'Yaf_Dispatcher::flushInstantly' => ['Yaf_Dispatcher', 'flag='=>'bool'], + 'Yaf_Dispatcher::getApplication' => ['Yaf_Application'], + 'Yaf_Dispatcher::getDefaultAction' => ['string'], + 'Yaf_Dispatcher::getDefaultController' => ['string'], + 'Yaf_Dispatcher::getDefaultModule' => ['string'], + 'Yaf_Dispatcher::getInstance' => ['Yaf_Dispatcher'], + 'Yaf_Dispatcher::getRequest' => ['Yaf_Request_Abstract'], + 'Yaf_Dispatcher::getRouter' => ['Yaf_Router'], + 'Yaf_Dispatcher::initView' => ['Yaf_View_Interface', 'templates_dir'=>'string', 'options='=>'array'], + 'Yaf_Dispatcher::registerPlugin' => ['Yaf_Dispatcher', 'plugin'=>'Yaf_Plugin_Abstract'], + 'Yaf_Dispatcher::returnResponse' => ['Yaf_Dispatcher', 'flag'=>'bool'], + 'Yaf_Dispatcher::setDefaultAction' => ['Yaf_Dispatcher', 'action'=>'string'], + 'Yaf_Dispatcher::setDefaultController' => ['Yaf_Dispatcher', 'controller'=>'string'], + 'Yaf_Dispatcher::setDefaultModule' => ['Yaf_Dispatcher', 'module'=>'string'], + 'Yaf_Dispatcher::setErrorHandler' => ['Yaf_Dispatcher', 'callback'=>'callable', 'error_types'=>'int'], + 'Yaf_Dispatcher::setRequest' => ['Yaf_Dispatcher', 'request'=>'Yaf_Request_Abstract'], + 'Yaf_Dispatcher::setView' => ['Yaf_Dispatcher', 'view'=>'Yaf_View_Interface'], + 'Yaf_Dispatcher::throwException' => ['Yaf_Dispatcher', 'flag='=>'bool'], + 'Yaf_Exception::__construct' => ['void'], + 'Yaf_Exception::getPrevious' => ['void'], + 'Yaf_Loader::__clone' => ['void'], + 'Yaf_Loader::__construct' => ['void'], + 'Yaf_Loader::__sleep' => ['list'], + 'Yaf_Loader::__wakeup' => ['void'], + 'Yaf_Loader::autoload' => ['void'], + 'Yaf_Loader::clearLocalNamespace' => ['void'], + 'Yaf_Loader::getInstance' => ['Yaf_Loader'], + 'Yaf_Loader::getLibraryPath' => ['Yaf_Loader', 'is_global='=>'bool'], + 'Yaf_Loader::getLocalNamespace' => ['void'], + 'Yaf_Loader::getNamespacePath' => ['string', 'namespaces'=>'string'], + 'Yaf_Loader::import' => ['bool'], + 'Yaf_Loader::isLocalName' => ['bool'], + 'Yaf_Loader::registerLocalNamespace' => ['void', 'prefix'=>'mixed'], + 'Yaf_Loader::registerNamespace' => ['bool', 'namespaces'=>'string|array', 'path='=>'string'], + 'Yaf_Loader::setLibraryPath' => ['Yaf_Loader', 'directory'=>'string', 'is_global='=>'bool'], + 'Yaf_Plugin_Abstract::dispatchLoopShutdown' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], + 'Yaf_Plugin_Abstract::dispatchLoopStartup' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], + 'Yaf_Plugin_Abstract::postDispatch' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], + 'Yaf_Plugin_Abstract::preDispatch' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], + 'Yaf_Plugin_Abstract::preResponse' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], + 'Yaf_Plugin_Abstract::routerShutdown' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], + 'Yaf_Plugin_Abstract::routerStartup' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], + 'Yaf_Registry::__clone' => ['void'], + 'Yaf_Registry::__construct' => ['void'], + 'Yaf_Registry::del' => ['void', 'name'=>'string'], + 'Yaf_Registry::get' => ['mixed', 'name'=>'string'], + 'Yaf_Registry::has' => ['bool', 'name'=>'string'], + 'Yaf_Registry::set' => ['bool', 'name'=>'string', 'value'=>'string'], + 'Yaf_Request_Abstract::clearParams' => ['bool'], + 'Yaf_Request_Abstract::getActionName' => ['void'], + 'Yaf_Request_Abstract::getBaseUri' => ['void'], + 'Yaf_Request_Abstract::getControllerName' => ['void'], + 'Yaf_Request_Abstract::getEnv' => ['void', 'name'=>'string', 'default='=>'string'], + 'Yaf_Request_Abstract::getException' => ['void'], + 'Yaf_Request_Abstract::getLanguage' => ['void'], + 'Yaf_Request_Abstract::getMethod' => ['void'], + 'Yaf_Request_Abstract::getModuleName' => ['void'], + 'Yaf_Request_Abstract::getParam' => ['void', 'name'=>'string', 'default='=>'string'], + 'Yaf_Request_Abstract::getParams' => ['void'], + 'Yaf_Request_Abstract::getRequestUri' => ['void'], + 'Yaf_Request_Abstract::getServer' => ['void', 'name'=>'string', 'default='=>'string'], + 'Yaf_Request_Abstract::isCli' => ['void'], + 'Yaf_Request_Abstract::isDispatched' => ['void'], + 'Yaf_Request_Abstract::isGet' => ['void'], + 'Yaf_Request_Abstract::isHead' => ['void'], + 'Yaf_Request_Abstract::isOptions' => ['void'], + 'Yaf_Request_Abstract::isPost' => ['void'], + 'Yaf_Request_Abstract::isPut' => ['void'], + 'Yaf_Request_Abstract::isRouted' => ['void'], + 'Yaf_Request_Abstract::isXmlHttpRequest' => ['void'], + 'Yaf_Request_Abstract::setActionName' => ['void', 'action'=>'string'], + 'Yaf_Request_Abstract::setBaseUri' => ['bool', 'uir'=>'string'], + 'Yaf_Request_Abstract::setControllerName' => ['void', 'controller'=>'string'], + 'Yaf_Request_Abstract::setDispatched' => ['void'], + 'Yaf_Request_Abstract::setModuleName' => ['void', 'module'=>'string'], + 'Yaf_Request_Abstract::setParam' => ['void', 'name'=>'string', 'value='=>'string'], + 'Yaf_Request_Abstract::setRequestUri' => ['void', 'uir'=>'string'], + 'Yaf_Request_Abstract::setRouted' => ['void', 'flag='=>'string'], + 'Yaf_Request_Http::__clone' => ['void'], + 'Yaf_Request_Http::__construct' => ['void'], + 'Yaf_Request_Http::get' => ['mixed', 'name'=>'string', 'default='=>'string'], + 'Yaf_Request_Http::getActionName' => ['string'], + 'Yaf_Request_Http::getBaseUri' => ['string'], + 'Yaf_Request_Http::getControllerName' => ['string'], + 'Yaf_Request_Http::getCookie' => ['mixed', 'name'=>'string', 'default='=>'string'], + 'Yaf_Request_Http::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf_Request_Http::getException' => ['Yaf_Exception'], + 'Yaf_Request_Http::getFiles' => ['void'], + 'Yaf_Request_Http::getLanguage' => ['string'], + 'Yaf_Request_Http::getMethod' => ['string'], + 'Yaf_Request_Http::getModuleName' => ['string'], + 'Yaf_Request_Http::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], + 'Yaf_Request_Http::getParams' => ['array'], + 'Yaf_Request_Http::getPost' => ['mixed', 'name'=>'string', 'default='=>'string'], + 'Yaf_Request_Http::getQuery' => ['mixed', 'name'=>'string', 'default='=>'string'], + 'Yaf_Request_Http::getRaw' => ['mixed'], + 'Yaf_Request_Http::getRequest' => ['void'], + 'Yaf_Request_Http::getRequestUri' => ['string'], + 'Yaf_Request_Http::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf_Request_Http::isCli' => ['bool'], + 'Yaf_Request_Http::isDispatched' => ['bool'], + 'Yaf_Request_Http::isGet' => ['bool'], + 'Yaf_Request_Http::isHead' => ['bool'], + 'Yaf_Request_Http::isOptions' => ['bool'], + 'Yaf_Request_Http::isPost' => ['bool'], + 'Yaf_Request_Http::isPut' => ['bool'], + 'Yaf_Request_Http::isRouted' => ['bool'], + 'Yaf_Request_Http::isXmlHttpRequest' => ['bool'], + 'Yaf_Request_Http::setActionName' => ['Yaf_Request_Abstract|bool', 'action'=>'string'], + 'Yaf_Request_Http::setBaseUri' => ['bool', 'uri'=>'string'], + 'Yaf_Request_Http::setControllerName' => ['Yaf_Request_Abstract|bool', 'controller'=>'string'], + 'Yaf_Request_Http::setDispatched' => ['bool'], + 'Yaf_Request_Http::setModuleName' => ['Yaf_Request_Abstract|bool', 'module'=>'string'], + 'Yaf_Request_Http::setParam' => ['Yaf_Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], + 'Yaf_Request_Http::setRequestUri' => ['', 'uri'=>'string'], + 'Yaf_Request_Http::setRouted' => ['Yaf_Request_Abstract|bool'], + 'Yaf_Request_Simple::__clone' => ['void'], + 'Yaf_Request_Simple::__construct' => ['void'], + 'Yaf_Request_Simple::get' => ['void'], + 'Yaf_Request_Simple::getActionName' => ['string'], + 'Yaf_Request_Simple::getBaseUri' => ['string'], + 'Yaf_Request_Simple::getControllerName' => ['string'], + 'Yaf_Request_Simple::getCookie' => ['void'], + 'Yaf_Request_Simple::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf_Request_Simple::getException' => ['Yaf_Exception'], + 'Yaf_Request_Simple::getFiles' => ['void'], + 'Yaf_Request_Simple::getLanguage' => ['string'], + 'Yaf_Request_Simple::getMethod' => ['string'], + 'Yaf_Request_Simple::getModuleName' => ['string'], + 'Yaf_Request_Simple::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], + 'Yaf_Request_Simple::getParams' => ['array'], + 'Yaf_Request_Simple::getPost' => ['void'], + 'Yaf_Request_Simple::getQuery' => ['void'], + 'Yaf_Request_Simple::getRequest' => ['void'], + 'Yaf_Request_Simple::getRequestUri' => ['string'], + 'Yaf_Request_Simple::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], + 'Yaf_Request_Simple::isCli' => ['bool'], + 'Yaf_Request_Simple::isDispatched' => ['bool'], + 'Yaf_Request_Simple::isGet' => ['bool'], + 'Yaf_Request_Simple::isHead' => ['bool'], + 'Yaf_Request_Simple::isOptions' => ['bool'], + 'Yaf_Request_Simple::isPost' => ['bool'], + 'Yaf_Request_Simple::isPut' => ['bool'], + 'Yaf_Request_Simple::isRouted' => ['bool'], + 'Yaf_Request_Simple::isXmlHttpRequest' => ['void'], + 'Yaf_Request_Simple::setActionName' => ['Yaf_Request_Abstract|bool', 'action'=>'string'], + 'Yaf_Request_Simple::setBaseUri' => ['bool', 'uri'=>'string'], + 'Yaf_Request_Simple::setControllerName' => ['Yaf_Request_Abstract|bool', 'controller'=>'string'], + 'Yaf_Request_Simple::setDispatched' => ['bool'], + 'Yaf_Request_Simple::setModuleName' => ['Yaf_Request_Abstract|bool', 'module'=>'string'], + 'Yaf_Request_Simple::setParam' => ['Yaf_Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], + 'Yaf_Request_Simple::setRequestUri' => ['', 'uri'=>'string'], + 'Yaf_Request_Simple::setRouted' => ['Yaf_Request_Abstract|bool'], + 'Yaf_Response_Abstract::__clone' => ['void'], + 'Yaf_Response_Abstract::__construct' => ['void'], + 'Yaf_Response_Abstract::__destruct' => ['void'], + 'Yaf_Response_Abstract::__toString' => ['string'], + 'Yaf_Response_Abstract::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf_Response_Abstract::clearBody' => ['bool', 'key='=>'string'], + 'Yaf_Response_Abstract::clearHeaders' => ['void'], + 'Yaf_Response_Abstract::getBody' => ['mixed', 'key='=>'string'], + 'Yaf_Response_Abstract::getHeader' => ['void'], + 'Yaf_Response_Abstract::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf_Response_Abstract::response' => ['void'], + 'Yaf_Response_Abstract::setAllHeaders' => ['void'], + 'Yaf_Response_Abstract::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf_Response_Abstract::setHeader' => ['void'], + 'Yaf_Response_Abstract::setRedirect' => ['void'], + 'Yaf_Response_Cli::__clone' => ['void'], + 'Yaf_Response_Cli::__construct' => ['void'], + 'Yaf_Response_Cli::__destruct' => ['void'], + 'Yaf_Response_Cli::__toString' => ['string'], + 'Yaf_Response_Cli::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf_Response_Cli::clearBody' => ['bool', 'key='=>'string'], + 'Yaf_Response_Cli::getBody' => ['mixed', 'key='=>'?string'], + 'Yaf_Response_Cli::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf_Response_Cli::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf_Response_Http::__clone' => ['void'], + 'Yaf_Response_Http::__construct' => ['void'], + 'Yaf_Response_Http::__destruct' => ['void'], + 'Yaf_Response_Http::__toString' => ['string'], + 'Yaf_Response_Http::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf_Response_Http::clearBody' => ['bool', 'key='=>'string'], + 'Yaf_Response_Http::clearHeaders' => ['Yaf_Response_Abstract|false', 'name='=>'string'], + 'Yaf_Response_Http::getBody' => ['mixed', 'key='=>'?string'], + 'Yaf_Response_Http::getHeader' => ['mixed', 'name='=>'string'], + 'Yaf_Response_Http::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf_Response_Http::response' => ['bool'], + 'Yaf_Response_Http::setAllHeaders' => ['bool', 'headers'=>'array'], + 'Yaf_Response_Http::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], + 'Yaf_Response_Http::setHeader' => ['bool', 'name'=>'string', 'value'=>'string', 'replace='=>'bool', 'response_code='=>'int'], + 'Yaf_Response_Http::setRedirect' => ['bool', 'url'=>'string'], + 'Yaf_Route_Interface::__construct' => ['void'], + 'Yaf_Route_Interface::assemble' => ['string', 'info'=>'array', 'query='=>'array'], + 'Yaf_Route_Interface::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], + 'Yaf_Route_Map::__construct' => ['void', 'controller_prefer='=>'string', 'delimiter='=>'string'], + 'Yaf_Route_Map::assemble' => ['string', 'info'=>'array', 'query='=>'array'], + 'Yaf_Route_Map::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], + 'Yaf_Route_Regex::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'map='=>'array', 'verify='=>'array', 'reverse='=>'string'], + 'Yaf_Route_Regex::addConfig' => ['Yaf_Router|bool', 'config'=>'Yaf_Config_Abstract'], + 'Yaf_Route_Regex::addRoute' => ['Yaf_Router|bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], + 'Yaf_Route_Regex::assemble' => ['string', 'info'=>'array', 'query='=>'array'], + 'Yaf_Route_Regex::getCurrentRoute' => ['string'], + 'Yaf_Route_Regex::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], + 'Yaf_Route_Regex::getRoutes' => ['Yaf_Route_Interface[]'], + 'Yaf_Route_Regex::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], + 'Yaf_Route_Rewrite::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'verify='=>'array'], + 'Yaf_Route_Rewrite::addConfig' => ['Yaf_Router|bool', 'config'=>'Yaf_Config_Abstract'], + 'Yaf_Route_Rewrite::addRoute' => ['Yaf_Router|bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], + 'Yaf_Route_Rewrite::assemble' => ['string', 'info'=>'array', 'query='=>'array'], + 'Yaf_Route_Rewrite::getCurrentRoute' => ['string'], + 'Yaf_Route_Rewrite::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], + 'Yaf_Route_Rewrite::getRoutes' => ['Yaf_Route_Interface[]'], + 'Yaf_Route_Rewrite::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], + 'Yaf_Route_Simple::__construct' => ['void', 'module_name'=>'string', 'controller_name'=>'string', 'action_name'=>'string'], + 'Yaf_Route_Simple::assemble' => ['string', 'info'=>'array', 'query='=>'array'], + 'Yaf_Route_Simple::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], + 'Yaf_Route_Static::assemble' => ['string', 'info'=>'array', 'query='=>'array'], + 'Yaf_Route_Static::match' => ['void', 'uri'=>'string'], + 'Yaf_Route_Static::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], + 'Yaf_Route_Supervar::__construct' => ['void', 'supervar_name'=>'string'], + 'Yaf_Route_Supervar::assemble' => ['string', 'info'=>'array', 'query='=>'array'], + 'Yaf_Route_Supervar::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], + 'Yaf_Router::__construct' => ['void'], + 'Yaf_Router::addConfig' => ['bool', 'config'=>'Yaf_Config_Abstract'], + 'Yaf_Router::addRoute' => ['bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], + 'Yaf_Router::getCurrentRoute' => ['string'], + 'Yaf_Router::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], + 'Yaf_Router::getRoutes' => ['mixed'], + 'Yaf_Router::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], + 'Yaf_Session::__clone' => ['void'], + 'Yaf_Session::__construct' => ['void'], + 'Yaf_Session::__get' => ['void', 'name'=>'string'], + 'Yaf_Session::__isset' => ['void', 'name'=>'string'], + 'Yaf_Session::__set' => ['void', 'name'=>'string', 'value'=>'string'], + 'Yaf_Session::__sleep' => ['list'], + 'Yaf_Session::__unset' => ['void', 'name'=>'string'], + 'Yaf_Session::__wakeup' => ['void'], + 'Yaf_Session::count' => ['void'], + 'Yaf_Session::current' => ['void'], + 'Yaf_Session::del' => ['void', 'name'=>'string'], + 'Yaf_Session::get' => ['mixed', 'name'=>'string'], + 'Yaf_Session::getInstance' => ['void'], + 'Yaf_Session::has' => ['void', 'name'=>'string'], + 'Yaf_Session::key' => ['void'], + 'Yaf_Session::next' => ['void'], + 'Yaf_Session::offsetExists' => ['void', 'name'=>'string'], + 'Yaf_Session::offsetGet' => ['void', 'name'=>'string'], + 'Yaf_Session::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], + 'Yaf_Session::offsetUnset' => ['void', 'name'=>'string'], + 'Yaf_Session::rewind' => ['void'], + 'Yaf_Session::set' => ['Yaf_Session|bool', 'name'=>'string', 'value'=>'mixed'], + 'Yaf_Session::start' => ['void'], + 'Yaf_Session::valid' => ['void'], + 'Yaf_View_Interface::assign' => ['bool', 'name'=>'string', 'value='=>'string'], + 'Yaf_View_Interface::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'array'], + 'Yaf_View_Interface::getScriptPath' => ['string'], + 'Yaf_View_Interface::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'array'], + 'Yaf_View_Interface::setScriptPath' => ['void', 'template_dir'=>'string'], + 'Yaf_View_Simple::__construct' => ['void', 'tempalte_dir'=>'string', 'options='=>'array'], + 'Yaf_View_Simple::__get' => ['void', 'name='=>'string'], + 'Yaf_View_Simple::__isset' => ['void', 'name'=>'string'], + 'Yaf_View_Simple::__set' => ['void', 'name'=>'string', 'value'=>'mixed'], + 'Yaf_View_Simple::assign' => ['bool', 'name'=>'string', 'value='=>'mixed'], + 'Yaf_View_Simple::assignRef' => ['bool', 'name'=>'string', '&rw_value'=>'mixed'], + 'Yaf_View_Simple::clear' => ['bool', 'name='=>'string'], + 'Yaf_View_Simple::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'array'], + 'Yaf_View_Simple::eval' => ['string', 'tpl_content'=>'string', 'tpl_vars='=>'array'], + 'Yaf_View_Simple::getScriptPath' => ['string'], + 'Yaf_View_Simple::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'array'], + 'Yaf_View_Simple::setScriptPath' => ['bool', 'template_dir'=>'string'], + 'Yar_Client::__call' => ['void', 'method'=>'string', 'parameters'=>'array'], + 'Yar_Client::__construct' => ['void', 'url'=>'string'], + 'Yar_Client::setOpt' => ['Yar_Client|false', 'name'=>'int', 'value'=>'mixed'], + 'Yar_Client_Exception::__clone' => ['void'], + 'Yar_Client_Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'Yar_Client_Exception::__toString' => ['string'], + 'Yar_Client_Exception::__wakeup' => ['void'], + 'Yar_Client_Exception::getCode' => ['int'], + 'Yar_Client_Exception::getFile' => ['string'], + 'Yar_Client_Exception::getLine' => ['int'], + 'Yar_Client_Exception::getMessage' => ['string'], + 'Yar_Client_Exception::getPrevious' => ['?Exception|?Throwable'], + 'Yar_Client_Exception::getTrace' => ['list\',args?:array}>'], + 'Yar_Client_Exception::getTraceAsString' => ['string'], + 'Yar_Client_Exception::getType' => ['string'], + 'Yar_Concurrent_Client::call' => ['int', 'uri'=>'string', 'method'=>'string', 'parameters'=>'array', 'callback='=>'callable'], + 'Yar_Concurrent_Client::loop' => ['bool', 'callback='=>'callable', 'error_callback='=>'callable'], + 'Yar_Concurrent_Client::reset' => ['bool'], + 'Yar_Server::__construct' => ['void', 'object'=>'Object'], + 'Yar_Server::handle' => ['bool'], + 'Yar_Server_Exception::__clone' => ['void'], + 'Yar_Server_Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], + 'Yar_Server_Exception::__toString' => ['string'], + 'Yar_Server_Exception::__wakeup' => ['void'], + 'Yar_Server_Exception::getCode' => ['int'], + 'Yar_Server_Exception::getFile' => ['string'], + 'Yar_Server_Exception::getLine' => ['int'], + 'Yar_Server_Exception::getMessage' => ['string'], + 'Yar_Server_Exception::getPrevious' => ['?Exception|?Throwable'], + 'Yar_Server_Exception::getTrace' => ['list\',args?:array}>'], + 'Yar_Server_Exception::getTraceAsString' => ['string'], + 'Yar_Server_Exception::getType' => ['string'], + 'ZMQ::__construct' => ['void'], + 'ZMQContext::__construct' => ['void', 'io_threads='=>'int', 'is_persistent='=>'bool'], + 'ZMQContext::getOpt' => ['int|string', 'key'=>'string'], + 'ZMQContext::getSocket' => ['ZMQSocket', 'type'=>'int', 'persistent_id='=>'string', 'on_new_socket='=>'callable'], + 'ZMQContext::isPersistent' => ['bool'], + 'ZMQContext::setOpt' => ['ZMQContext', 'key'=>'int', 'value'=>'mixed'], + 'ZMQDevice::__construct' => ['void', 'frontend'=>'ZMQSocket', 'backend'=>'ZMQSocket', 'listener='=>'ZMQSocket'], + 'ZMQDevice::getIdleTimeout' => ['ZMQDevice'], + 'ZMQDevice::getTimerTimeout' => ['ZMQDevice'], + 'ZMQDevice::run' => ['void'], + 'ZMQDevice::setIdleCallback' => ['ZMQDevice', 'cb_func'=>'callable', 'timeout'=>'int', 'user_data='=>'mixed'], + 'ZMQDevice::setIdleTimeout' => ['ZMQDevice', 'timeout'=>'int'], + 'ZMQDevice::setTimerCallback' => ['ZMQDevice', 'cb_func'=>'callable', 'timeout'=>'int', 'user_data='=>'mixed'], + 'ZMQDevice::setTimerTimeout' => ['ZMQDevice', 'timeout'=>'int'], + 'ZMQPoll::add' => ['string', 'entry'=>'mixed', 'type'=>'int'], + 'ZMQPoll::clear' => ['ZMQPoll'], + 'ZMQPoll::count' => ['int'], + 'ZMQPoll::getLastErrors' => ['array'], + 'ZMQPoll::poll' => ['int', '&w_readable'=>'array', '&w_writable'=>'array', 'timeout='=>'int'], + 'ZMQPoll::remove' => ['bool', 'item'=>'mixed'], + 'ZMQSocket::__construct' => ['void', 'context'=>'ZMQContext', 'type'=>'int', 'persistent_id='=>'string', 'on_new_socket='=>'callable'], + 'ZMQSocket::bind' => ['ZMQSocket', 'dsn'=>'string', 'force='=>'bool'], + 'ZMQSocket::connect' => ['ZMQSocket', 'dsn'=>'string', 'force='=>'bool'], + 'ZMQSocket::disconnect' => ['ZMQSocket', 'dsn'=>'string'], + 'ZMQSocket::getEndpoints' => ['array'], + 'ZMQSocket::getPersistentId' => ['?string'], + 'ZMQSocket::getSockOpt' => ['int|string', 'key'=>'string'], + 'ZMQSocket::getSocketType' => ['int'], + 'ZMQSocket::isPersistent' => ['bool'], + 'ZMQSocket::recv' => ['string', 'mode='=>'int'], + 'ZMQSocket::recvMulti' => ['string[]', 'mode='=>'int'], + 'ZMQSocket::send' => ['ZMQSocket', 'message'=>'array', 'mode='=>'int'], + 'ZMQSocket::send\'1' => ['ZMQSocket', 'message'=>'string', 'mode='=>'int'], + 'ZMQSocket::sendmulti' => ['ZMQSocket', 'message'=>'array', 'mode='=>'int'], + 'ZMQSocket::setSockOpt' => ['ZMQSocket', 'key'=>'int', 'value'=>'mixed'], + 'ZMQSocket::unbind' => ['ZMQSocket', 'dsn'=>'string'], + 'ZendAPI_Job::ZendAPI_Job' => ['Job', 'script'=>'script'], + 'ZendAPI_Job::addJobToQueue' => ['int', 'jobqueue_url'=>'string', 'password'=>'string'], + 'ZendAPI_Job::getApplicationID' => [''], + 'ZendAPI_Job::getEndTime' => [''], + 'ZendAPI_Job::getGlobalVariables' => [''], + 'ZendAPI_Job::getHost' => [''], + 'ZendAPI_Job::getID' => [''], + 'ZendAPI_Job::getInterval' => [''], + 'ZendAPI_Job::getJobDependency' => [''], + 'ZendAPI_Job::getJobName' => [''], + 'ZendAPI_Job::getJobPriority' => [''], + 'ZendAPI_Job::getJobStatus' => ['int'], + 'ZendAPI_Job::getLastPerformedStatus' => ['int'], + 'ZendAPI_Job::getOutput' => ['An'], + 'ZendAPI_Job::getPreserved' => [''], + 'ZendAPI_Job::getProperties' => ['array'], + 'ZendAPI_Job::getScheduledTime' => [''], + 'ZendAPI_Job::getScript' => [''], + 'ZendAPI_Job::getTimeToNextRepeat' => ['int'], + 'ZendAPI_Job::getUserVariables' => [''], + 'ZendAPI_Job::setApplicationID' => ['', 'app_id'=>''], + 'ZendAPI_Job::setGlobalVariables' => ['', 'vars'=>''], + 'ZendAPI_Job::setJobDependency' => ['', 'job_id'=>''], + 'ZendAPI_Job::setJobName' => ['', 'name'=>''], + 'ZendAPI_Job::setJobPriority' => ['', 'priority'=>'int'], + 'ZendAPI_Job::setPreserved' => ['', 'preserved'=>''], + 'ZendAPI_Job::setRecurrenceData' => ['', 'interval'=>'', 'end_time='=>'mixed'], + 'ZendAPI_Job::setScheduledTime' => ['', 'timestamp'=>''], + 'ZendAPI_Job::setScript' => ['', 'script'=>''], + 'ZendAPI_Job::setUserVariables' => ['', 'vars'=>''], + 'ZendAPI_Queue::addJob' => ['int', '&job'=>'Job'], + 'ZendAPI_Queue::getAllApplicationIDs' => ['array'], + 'ZendAPI_Queue::getAllhosts' => ['array'], + 'ZendAPI_Queue::getHistoricJobs' => ['array', 'status'=>'int', 'start_time'=>'', 'end_time'=>'', 'index'=>'int', 'count'=>'int', '&total'=>'int'], + 'ZendAPI_Queue::getJob' => ['Job', 'job_id'=>'int'], + 'ZendAPI_Queue::getJobsInQueue' => ['array', 'filter_options='=>'array', 'max_jobs='=>'int', 'with_globals_and_output='=>'bool'], + 'ZendAPI_Queue::getLastError' => ['string'], + 'ZendAPI_Queue::getNumOfJobsInQueue' => ['int', 'filter_options='=>'array'], + 'ZendAPI_Queue::getStatistics' => ['array'], + 'ZendAPI_Queue::isScriptExists' => ['bool', 'path'=>'string'], + 'ZendAPI_Queue::isSuspend' => ['bool'], + 'ZendAPI_Queue::login' => ['bool', 'password'=>'string', 'application_id='=>'int'], + 'ZendAPI_Queue::removeJob' => ['bool', 'job_id'=>'array|int'], + 'ZendAPI_Queue::requeueJob' => ['bool', 'job'=>'Job'], + 'ZendAPI_Queue::resumeJob' => ['bool', 'job_id'=>'array|int'], + 'ZendAPI_Queue::resumeQueue' => ['bool'], + 'ZendAPI_Queue::setMaxHistoryTime' => ['bool'], + 'ZendAPI_Queue::suspendJob' => ['bool', 'job_id'=>'array|int'], + 'ZendAPI_Queue::suspendQueue' => ['bool'], + 'ZendAPI_Queue::updateJob' => ['int', '&job'=>'Job'], + 'ZendAPI_Queue::zendapi_queue' => ['ZendAPI_Queue', 'queue_url'=>'string'], + 'ZipArchive::addEmptyDir' => ['bool', 'dirname'=>'string'], + 'ZipArchive::addFile' => ['bool', 'filepath'=>'string', 'entryname='=>'string', 'start='=>'int', 'length='=>'int'], + 'ZipArchive::addFromString' => ['bool', 'entryname'=>'string', 'content'=>'string'], + 'ZipArchive::addGlob' => ['bool', 'pattern'=>'string', 'flags='=>'int', 'options='=>'array'], + 'ZipArchive::addPattern' => ['bool', 'pattern'=>'string', 'path='=>'string', 'options='=>'array'], + 'ZipArchive::close' => ['bool'], + 'ZipArchive::createEmptyDir' => ['bool', 'dirname'=>'string'], + 'ZipArchive::deleteIndex' => ['bool', 'index'=>'int'], + 'ZipArchive::deleteName' => ['bool', 'name'=>'string'], + 'ZipArchive::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string[]|string'], + 'ZipArchive::getArchiveComment' => ['string|false', 'flags='=>'int'], + 'ZipArchive::getCommentIndex' => ['string|false', 'index'=>'int', 'flags='=>'int'], + 'ZipArchive::getCommentName' => ['string|false', 'name'=>'string', 'flags='=>'int'], + 'ZipArchive::getExternalAttributesIndex' => ['bool', 'index'=>'int', '&w_opsys'=>'int', '&w_attr'=>'int', 'flags='=>'int'], + 'ZipArchive::getExternalAttributesName' => ['bool', 'name'=>'string', '&w_opsys'=>'int', '&w_attr'=>'int', 'flags='=>'int'], + 'ZipArchive::getFromIndex' => ['string|false', 'index'=>'int', 'length='=>'int', 'flags='=>'int'], + 'ZipArchive::getFromName' => ['string|false', 'entryname'=>'string', 'length='=>'int', 'flags='=>'int'], + 'ZipArchive::getNameIndex' => ['string|false', 'index'=>'int', 'flags='=>'int'], + 'ZipArchive::getStatusString' => ['string|false'], + 'ZipArchive::getStream' => ['resource|false', 'entryname'=>'string'], + 'ZipArchive::isCompressionMethodSupported' => ['bool', 'method'=>'int', 'encode='=>'bool'], + 'ZipArchive::isEncryptionMethodSupported' => ['bool', 'method'=>'int', 'encode='=>'bool'], + 'ZipArchive::locateName' => ['int|false', 'filename'=>'string', 'flags='=>'int'], + 'ZipArchive::open' => ['int|bool', 'source'=>'string', 'flags='=>'int'], + 'ZipArchive::registerCancelCallback' => ['bool', 'callback'=>'callable'], + 'ZipArchive::registerProgressCallback' => ['bool', 'rate'=>'float', 'callback'=>'callable'], + 'ZipArchive::renameIndex' => ['bool', 'index'=>'int', 'new_name'=>'string'], + 'ZipArchive::renameName' => ['bool', 'name'=>'string', 'new_name'=>'string'], + 'ZipArchive::replaceFile' => ['bool', 'filename'=>'string', 'index'=>'int', 'start='=>'int', 'length='=>'int', 'flags='=>'int'], + 'ZipArchive::setArchiveComment' => ['bool', 'comment'=>'string'], + 'ZipArchive::setCommentIndex' => ['bool', 'index'=>'int', 'comment'=>'string'], + 'ZipArchive::setCommentName' => ['bool', 'name'=>'string', 'comment'=>'string'], + 'ZipArchive::setCompressionIndex' => ['bool', 'index'=>'int', 'comp_method'=>'int', 'comp_flags='=>'int'], + 'ZipArchive::setCompressionName' => ['bool', 'name'=>'string', 'comp_method'=>'int', 'comp_flags='=>'int'], + 'ZipArchive::setExternalAttributesIndex' => ['bool', 'index'=>'int', 'opsys'=>'int', 'attr'=>'int', 'flags='=>'int'], + 'ZipArchive::setExternalAttributesName' => ['bool', 'name'=>'string', 'opsys'=>'int', 'attr'=>'int', 'flags='=>'int'], + 'ZipArchive::setMtimeIndex' => ['bool', 'index'=>'int', 'timestamp'=>'int', 'flags='=>'int'], + 'ZipArchive::setMtimeName' => ['bool', 'name'=>'string', 'timestamp'=>'int', 'flags='=>'int'], + 'ZipArchive::setPassword' => ['bool', 'password'=>'string'], + 'ZipArchive::statIndex' => ['array|false', 'index'=>'int', 'flags='=>'int'], + 'ZipArchive::statName' => ['array|false', 'filename'=>'string', 'flags='=>'int'], + 'ZipArchive::unchangeAll' => ['bool'], + 'ZipArchive::unchangeArchive' => ['bool'], + 'ZipArchive::unchangeIndex' => ['bool', 'index'=>'int'], + 'ZipArchive::unchangeName' => ['bool', 'name'=>'string'], + 'Zookeeper::addAuth' => ['bool', 'scheme'=>'string', 'cert'=>'string', 'completion_cb='=>'callable'], + 'Zookeeper::close' => ['void'], + 'Zookeeper::connect' => ['void', 'host'=>'string', 'watcher_cb='=>'callable', 'recv_timeout='=>'int'], + 'Zookeeper::create' => ['string', 'path'=>'string', 'value'=>'string', 'acls'=>'array', 'flags='=>'int'], + 'Zookeeper::delete' => ['bool', 'path'=>'string', 'version='=>'int'], + 'Zookeeper::exists' => ['bool', 'path'=>'string', 'watcher_cb='=>'callable'], + 'Zookeeper::get' => ['string', 'path'=>'string', 'watcher_cb='=>'callable', 'stat='=>'array', 'max_size='=>'int'], + 'Zookeeper::getAcl' => ['array', 'path'=>'string'], + 'Zookeeper::getChildren' => ['array|false', 'path'=>'string', 'watcher_cb='=>'callable'], + 'Zookeeper::getClientId' => ['int'], + 'Zookeeper::getConfig' => ['ZookeeperConfig'], + 'Zookeeper::getRecvTimeout' => ['int'], + 'Zookeeper::getState' => ['int'], + 'Zookeeper::isRecoverable' => ['bool'], + 'Zookeeper::set' => ['bool', 'path'=>'string', 'value'=>'string', 'version='=>'int', 'stat='=>'array'], + 'Zookeeper::setAcl' => ['bool', 'path'=>'string', 'version'=>'int', 'acl'=>'array'], + 'Zookeeper::setDebugLevel' => ['bool', 'logLevel'=>'int'], + 'Zookeeper::setDeterministicConnOrder' => ['bool', 'yesOrNo'=>'bool'], + 'Zookeeper::setLogStream' => ['bool', 'stream'=>'resource'], + 'Zookeeper::setWatcher' => ['bool', 'watcher_cb'=>'callable'], + 'ZookeeperConfig::add' => ['void', 'members'=>'string', 'version='=>'int', 'stat='=>'array'], + 'ZookeeperConfig::get' => ['string', 'watcher_cb='=>'callable', 'stat='=>'array'], + 'ZookeeperConfig::remove' => ['void', 'id_list'=>'string', 'version='=>'int', 'stat='=>'array'], + 'ZookeeperConfig::set' => ['void', 'members'=>'string', 'version='=>'int', 'stat='=>'array'], + '_' => ['string', 'message'=>'string'], + '__halt_compiler' => ['void'], + 'abs' => ['0|positive-int', 'num'=>'int'], + 'abs\'1' => ['float', 'num'=>'float'], + 'abs\'2' => ['numeric', 'num'=>'numeric'], + 'accelerator_get_configuration' => ['array'], + 'accelerator_get_scripts' => ['array'], + 'accelerator_get_status' => ['array', 'fetch_scripts'=>'bool'], + 'accelerator_reset' => [''], + 'accelerator_set_status' => ['void', 'status'=>'bool'], + 'acos' => ['float', 'num'=>'float'], + 'acosh' => ['float', 'num'=>'float'], + 'addcslashes' => ['string', 'string'=>'string', 'characters'=>'string'], + 'addslashes' => ['string', 'string'=>'string'], + 'apache_child_terminate' => ['bool'], + 'apache_get_modules' => ['array'], + 'apache_get_version' => ['string|false'], + 'apache_getenv' => ['string|false', 'variable'=>'string', 'walk_to_top='=>'bool'], + 'apache_lookup_uri' => ['object', 'filename'=>'string'], + 'apache_note' => ['string|false', 'note_name'=>'string', 'note_value='=>'string'], + 'apache_request_headers' => ['array|false'], + 'apache_reset_timeout' => ['bool'], + 'apache_response_headers' => ['array|false'], + 'apache_setenv' => ['bool', 'variable'=>'string', 'value'=>'string', 'walk_to_top='=>'bool'], + 'apc_add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'ttl='=>'int'], + 'apc_add\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], + 'apc_bin_dump' => ['string|false|null', 'files='=>'array', 'user_vars='=>'array'], + 'apc_bin_dumpfile' => ['int|false', 'files'=>'array', 'user_vars'=>'array', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], + 'apc_bin_load' => ['bool', 'data'=>'string', 'flags='=>'int'], + 'apc_bin_loadfile' => ['bool', 'filename'=>'string', 'context='=>'resource', 'flags='=>'int'], + 'apc_cache_info' => ['array|false', 'cache_type='=>'string', 'limited='=>'bool'], + 'apc_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'], + 'apc_clear_cache' => ['bool', 'cache_type='=>'string'], + 'apc_compile_file' => ['bool', 'filename'=>'string', 'atomic='=>'bool'], + 'apc_dec' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool'], + 'apc_define_constants' => ['bool', 'key'=>'string', 'constants'=>'array', 'case_sensitive='=>'bool'], + 'apc_delete' => ['bool', 'key'=>'string|string[]|APCIterator'], + 'apc_delete_file' => ['bool|string[]', 'keys'=>'mixed'], + 'apc_exists' => ['bool', 'keys'=>'string'], + 'apc_exists\'1' => ['array', 'keys'=>'string[]'], + 'apc_fetch' => ['mixed|false', 'key'=>'string', '&w_success='=>'bool'], + 'apc_fetch\'1' => ['array|false', 'key'=>'string[]', '&w_success='=>'bool'], + 'apc_inc' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool'], + 'apc_load_constants' => ['bool', 'key'=>'string', 'case_sensitive='=>'bool'], + 'apc_sma_info' => ['array|false', 'limited='=>'bool'], + 'apc_store' => ['bool', 'key'=>'string', 'var'=>'', 'ttl='=>'int'], + 'apc_store\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], + 'apcu_add' => ['bool', 'key'=>'string', 'var'=>'', 'ttl='=>'int'], + 'apcu_add\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], + 'apcu_cache_info' => ['array|false', 'limited='=>'bool'], + 'apcu_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'], + 'apcu_clear_cache' => ['bool'], + 'apcu_dec' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'], + 'apcu_delete' => ['bool', 'key'=>'string|APCuIterator'], + 'apcu_delete\'1' => ['list', 'key'=>'string[]'], + 'apcu_enabled' => ['bool'], + 'apcu_entry' => ['mixed', 'key'=>'string', 'generator'=>'callable', 'ttl='=>'int'], + 'apcu_exists' => ['bool', 'keys'=>'string'], + 'apcu_exists\'1' => ['array', 'keys'=>'string[]'], + 'apcu_fetch' => ['mixed|false', 'key'=>'string', '&w_success='=>'bool'], + 'apcu_fetch\'1' => ['array|false', 'key'=>'string[]', '&w_success='=>'bool'], + 'apcu_inc' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'], + 'apcu_key_info' => ['?array', 'key'=>'string'], + 'apcu_sma_info' => ['array|false', 'limited='=>'bool'], + 'apcu_store' => ['bool', 'key'=>'string', 'var='=>'', 'ttl='=>'int'], + 'apcu_store\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], + 'apd_breakpoint' => ['bool', 'debug_level'=>'int'], + 'apd_callstack' => ['array'], + 'apd_clunk' => ['void', 'warning'=>'string', 'delimiter='=>'string'], + 'apd_continue' => ['bool', 'debug_level'=>'int'], + 'apd_croak' => ['void', 'warning'=>'string', 'delimiter='=>'string'], + 'apd_dump_function_table' => ['void'], + 'apd_dump_persistent_resources' => ['array'], + 'apd_dump_regular_resources' => ['array'], + 'apd_echo' => ['bool', 'output'=>'string'], + 'apd_get_active_symbols' => ['array'], + 'apd_set_pprof_trace' => ['string', 'dump_directory='=>'string', 'fragment='=>'string'], + '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_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_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_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'], + 'array_merge' => ['array', '...arrays'=>'array'], + 'array_merge_recursive' => ['array', '...arrays'=>'array'], + 'array_multisort' => ['bool', '&rw_array'=>'array', 'rest='=>'array|int', 'array1_sort_flags='=>'array|int', '...args='=>'array|int'], + 'array_pad' => ['array', 'array'=>'array', 'length'=>'int', 'value'=>'mixed'], + 'array_pop' => ['mixed', '&rw_array'=>'array'], + 'array_product' => ['int|float', 'array'=>'array'], + 'array_push' => ['int', '&rw_array'=>'array', '...values'=>'mixed'], + 'array_rand' => ['int|string|array|array', 'array'=>'non-empty-array', 'num'=>'int'], + 'array_rand\'1' => ['int|string', 'array'=>'array'], + 'array_reduce' => ['mixed', 'array'=>'array', 'callback'=>'callable(mixed,mixed):mixed', 'initial='=>'mixed'], + 'array_replace' => ['array', 'array'=>'array', '...replacements='=>'array'], + 'array_replace_recursive' => ['array', 'array'=>'array', '...replacements='=>'array'], + 'array_reverse' => ['array', 'array'=>'array', 'preserve_keys='=>'bool'], + 'array_search' => ['int|string|false', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'], + 'array_shift' => ['mixed|null', '&rw_array'=>'array'], + '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_unique' => ['array', 'array'=>'array', 'flags='=>'0'], + 'array_unique\'1' => ['array', 'array'=>'array', 'flags='=>'1'], + 'array_unique\'2' => ['array', 'array'=>'array', 'flags='=>'2|5'], + 'array_unshift' => ['int', '&rw_array'=>'array', '...values'=>'mixed'], + 'array_values' => ['list', 'array'=>'array'], + 'array_walk' => ['bool', '&rw_array'=>'array', 'callback'=>'callable', 'arg='=>'mixed'], + 'array_walk\'1' => ['bool', '&rw_array'=>'object', 'callback'=>'callable', 'arg='=>'mixed'], + 'array_walk_recursive' => ['bool', '&rw_array'=>'array', 'callback'=>'callable', 'arg='=>'mixed'], + 'array_walk_recursive\'1' => ['bool', '&rw_array'=>'object', 'callback'=>'callable', 'arg='=>'mixed'], + 'arsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], + 'asin' => ['float', 'num'=>'float'], + 'asinh' => ['float', 'num'=>'float'], + 'asort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], + 'assert' => ['bool', 'assertion'=>'string|bool|int', 'description='=>'string|Throwable|null'], + 'assert_options' => ['mixed|false', 'option'=>'int', 'value='=>'mixed'], + 'ast\Node::__construct' => ['void', 'kind='=>'int', 'flags='=>'int', 'children='=>'ast\Node\Decl[]|ast\Node[]|int[]|string[]|float[]|bool[]|null[]', 'start_line='=>'int'], + 'ast\get_kind_name' => ['string', 'kind'=>'int'], + 'ast\get_metadata' => ['array'], + 'ast\get_supported_versions' => ['array', 'exclude_deprecated='=>'bool'], + 'ast\kind_uses_flags' => ['bool', 'kind'=>'int'], + 'ast\parse_code' => ['ast\Node', 'code'=>'string', 'version'=>'int', 'filename='=>'string'], + 'ast\parse_file' => ['ast\Node', 'filename'=>'string', 'version'=>'int'], + 'atan' => ['float', 'num'=>'float'], + 'atan2' => ['float', 'y'=>'float', 'x'=>'float'], + 'atanh' => ['float', 'num'=>'float'], + 'base64_decode' => ['string|false', 'string'=>'string', 'strict='=>'bool'], + 'base64_encode' => ['string', 'string'=>'string'], + 'base_convert' => ['string', 'num'=>'string', 'from_base'=>'int', 'to_base'=>'int'], + 'basename' => ['string', 'path'=>'string', 'suffix='=>'string'], + 'bbcode_add_element' => ['bool', 'bbcode_container'=>'resource', 'tag_name'=>'string', 'tag_rules'=>'array'], + 'bbcode_add_smiley' => ['bool', 'bbcode_container'=>'resource', 'smiley'=>'string', 'replace_by'=>'string'], + 'bbcode_create' => ['resource', 'bbcode_initial_tags='=>'array'], + 'bbcode_destroy' => ['bool', 'bbcode_container'=>'resource'], + 'bbcode_parse' => ['string', 'bbcode_container'=>'resource', 'to_parse'=>'string'], + 'bbcode_set_arg_parser' => ['bool', 'bbcode_container'=>'resource', 'bbcode_arg_parser'=>'resource'], + 'bbcode_set_flags' => ['bool', 'bbcode_container'=>'resource', 'flags'=>'int', 'mode='=>'int'], + 'bcadd' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], + 'bccomp' => ['int', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], + 'bcdiv' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int'], + 'bcmod' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int'], + 'bcmul' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], + 'bcompiler_load' => ['bool', 'filename'=>'string'], + 'bcompiler_load_exe' => ['bool', 'filename'=>'string'], + 'bcompiler_parse_class' => ['bool', 'class'=>'string', 'callback'=>'string'], + 'bcompiler_read' => ['bool', 'filehandle'=>'resource'], + 'bcompiler_write_class' => ['bool', 'filehandle'=>'resource', 'classname'=>'string', 'extends='=>'string'], + 'bcompiler_write_constant' => ['bool', 'filehandle'=>'resource', 'constantname'=>'string'], + 'bcompiler_write_exe_footer' => ['bool', 'filehandle'=>'resource', 'startpos'=>'int'], + 'bcompiler_write_file' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], + 'bcompiler_write_footer' => ['bool', 'filehandle'=>'resource'], + 'bcompiler_write_function' => ['bool', 'filehandle'=>'resource', 'functionname'=>'string'], + 'bcompiler_write_functions_from_file' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], + 'bcompiler_write_header' => ['bool', 'filehandle'=>'resource', 'write_ver='=>'string'], + 'bcompiler_write_included_filename' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], + 'bcpow' => ['numeric-string', 'num'=>'numeric-string', 'exponent'=>'numeric-string', 'scale='=>'int'], + 'bcpowmod' => ['numeric-string|false', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'modulus'=>'numeric-string', 'scale='=>'int'], + 'bcscale' => ['int', 'scale'=>'int'], + 'bcsqrt' => ['numeric-string', 'num'=>'numeric-string', 'scale='=>'int'], + 'bcsub' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], + 'bin2hex' => ['string', 'string'=>'string'], + 'bind_textdomain_codeset' => ['string', 'domain'=>'string', 'codeset'=>'string'], + 'bindec' => ['float|int', 'binary_string'=>'string'], + 'bindtextdomain' => ['string', 'domain'=>'string', 'directory'=>'string'], + 'birdstep_autocommit' => ['bool', 'index'=>'int'], + 'birdstep_close' => ['bool', 'id'=>'int'], + 'birdstep_commit' => ['bool', 'index'=>'int'], + 'birdstep_connect' => ['int', 'server'=>'string', 'user'=>'string', 'pass'=>'string'], + 'birdstep_exec' => ['int', 'index'=>'int', 'exec_str'=>'string'], + 'birdstep_fetch' => ['bool', 'index'=>'int'], + 'birdstep_fieldname' => ['string', 'index'=>'int', 'col'=>'int'], + 'birdstep_fieldnum' => ['int', 'index'=>'int'], + 'birdstep_freeresult' => ['bool', 'index'=>'int'], + 'birdstep_off_autocommit' => ['bool', 'index'=>'int'], + 'birdstep_result' => ['', 'index'=>'int', 'col'=>''], + 'birdstep_rollback' => ['bool', 'index'=>'int'], + 'blenc_encrypt' => ['string', 'plaintext'=>'string', 'encodedfile'=>'string', 'encryption_key='=>'string'], + 'boolval' => ['bool', 'value'=>'mixed'], + 'bson_decode' => ['array', 'bson'=>'string'], + 'bson_encode' => ['string', 'anything'=>'mixed'], + 'bzclose' => ['bool', 'bz'=>'resource'], + 'bzcompress' => ['string|int', 'data'=>'string', 'block_size='=>'int', 'work_factor='=>'int'], + 'bzdecompress' => ['string|int', 'data'=>'string', 'use_less_memory='=>'int'], + 'bzerrno' => ['int', 'bz'=>'resource'], + 'bzerror' => ['array', 'bz'=>'resource'], + 'bzerrstr' => ['string', 'bz'=>'resource'], + 'bzflush' => ['bool', 'bz'=>'resource'], + 'bzopen' => ['resource|false', 'file'=>'string|resource', 'mode'=>'string'], + 'bzread' => ['string|false', 'bz'=>'resource', 'length='=>'int'], + 'bzwrite' => ['int|false', 'bz'=>'resource', 'data'=>'string', 'length='=>'int'], + 'cairo_append_path' => ['', 'path'=>'cairopath', 'context'=>'cairocontext'], + 'cairo_arc' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], + 'cairo_arc_negative' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], + 'cairo_available_fonts' => ['array'], + 'cairo_available_surfaces' => ['array'], + 'cairo_clip' => ['', 'context'=>'cairocontext'], + 'cairo_clip_extents' => ['array', 'context'=>'cairocontext'], + 'cairo_clip_preserve' => ['', 'context'=>'cairocontext'], + 'cairo_clip_rectangle_list' => ['array', 'context'=>'cairocontext'], + 'cairo_close_path' => ['', 'context'=>'cairocontext'], + 'cairo_copy_page' => ['', 'context'=>'cairocontext'], + 'cairo_copy_path' => ['CairoPath', 'context'=>'cairocontext'], + 'cairo_copy_path_flat' => ['CairoPath', 'context'=>'cairocontext'], + 'cairo_create' => ['CairoContext', 'surface'=>'cairosurface'], + 'cairo_curve_to' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float', 'context'=>'cairocontext'], + 'cairo_device_to_user' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], + 'cairo_device_to_user_distance' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], + 'cairo_fill' => ['', 'context'=>'cairocontext'], + 'cairo_fill_extents' => ['array', 'context'=>'cairocontext'], + 'cairo_fill_preserve' => ['', 'context'=>'cairocontext'], + 'cairo_font_extents' => ['array', 'context'=>'cairocontext'], + 'cairo_font_face_get_type' => ['int', 'fontface'=>'cairofontface'], + 'cairo_font_face_status' => ['int', 'fontface'=>'cairofontface'], + 'cairo_font_options_create' => ['CairoFontOptions'], + 'cairo_font_options_equal' => ['bool', 'options'=>'cairofontoptions', 'other'=>'cairofontoptions'], + 'cairo_font_options_get_antialias' => ['int', 'options'=>'cairofontoptions'], + 'cairo_font_options_get_hint_metrics' => ['int', 'options'=>'cairofontoptions'], + 'cairo_font_options_get_hint_style' => ['int', 'options'=>'cairofontoptions'], + 'cairo_font_options_get_subpixel_order' => ['int', 'options'=>'cairofontoptions'], + 'cairo_font_options_hash' => ['int', 'options'=>'cairofontoptions'], + 'cairo_font_options_merge' => ['void', 'options'=>'cairofontoptions', 'other'=>'cairofontoptions'], + 'cairo_font_options_set_antialias' => ['void', 'options'=>'cairofontoptions', 'antialias'=>'int'], + 'cairo_font_options_set_hint_metrics' => ['void', 'options'=>'cairofontoptions', 'hint_metrics'=>'int'], + 'cairo_font_options_set_hint_style' => ['void', 'options'=>'cairofontoptions', 'hint_style'=>'int'], + 'cairo_font_options_set_subpixel_order' => ['void', 'options'=>'cairofontoptions', 'subpixel_order'=>'int'], + 'cairo_font_options_status' => ['int', 'options'=>'cairofontoptions'], + 'cairo_format_stride_for_width' => ['int', 'format'=>'int', 'width'=>'int'], + 'cairo_get_antialias' => ['int', 'context'=>'cairocontext'], + 'cairo_get_current_point' => ['array', 'context'=>'cairocontext'], + 'cairo_get_dash' => ['array', 'context'=>'cairocontext'], + 'cairo_get_dash_count' => ['int', 'context'=>'cairocontext'], + 'cairo_get_fill_rule' => ['int', 'context'=>'cairocontext'], + 'cairo_get_font_face' => ['', 'context'=>'cairocontext'], + 'cairo_get_font_matrix' => ['', 'context'=>'cairocontext'], + 'cairo_get_font_options' => ['', 'context'=>'cairocontext'], + 'cairo_get_group_target' => ['', 'context'=>'cairocontext'], + 'cairo_get_line_cap' => ['int', 'context'=>'cairocontext'], + 'cairo_get_line_join' => ['int', 'context'=>'cairocontext'], + 'cairo_get_line_width' => ['float', 'context'=>'cairocontext'], + 'cairo_get_matrix' => ['', 'context'=>'cairocontext'], + 'cairo_get_miter_limit' => ['float', 'context'=>'cairocontext'], + 'cairo_get_operator' => ['int', 'context'=>'cairocontext'], + 'cairo_get_scaled_font' => ['', 'context'=>'cairocontext'], + 'cairo_get_source' => ['', 'context'=>'cairocontext'], + 'cairo_get_target' => ['', 'context'=>'cairocontext'], + 'cairo_get_tolerance' => ['float', 'context'=>'cairocontext'], + 'cairo_glyph_path' => ['', 'glyphs'=>'array', 'context'=>'cairocontext'], + 'cairo_has_current_point' => ['bool', 'context'=>'cairocontext'], + 'cairo_identity_matrix' => ['', 'context'=>'cairocontext'], + 'cairo_image_surface_create' => ['CairoImageSurface', 'format'=>'int', 'width'=>'int', 'height'=>'int'], + 'cairo_image_surface_create_for_data' => ['CairoImageSurface', 'data'=>'string', 'format'=>'int', 'width'=>'int', 'height'=>'int', 'stride='=>'int'], + 'cairo_image_surface_create_from_png' => ['CairoImageSurface', 'file'=>'string'], + 'cairo_image_surface_get_data' => ['string', 'surface'=>'cairoimagesurface'], + 'cairo_image_surface_get_format' => ['int', 'surface'=>'cairoimagesurface'], + 'cairo_image_surface_get_height' => ['int', 'surface'=>'cairoimagesurface'], + 'cairo_image_surface_get_stride' => ['int', 'surface'=>'cairoimagesurface'], + 'cairo_image_surface_get_width' => ['int', 'surface'=>'cairoimagesurface'], + 'cairo_in_fill' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'cairo_in_stroke' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'cairo_line_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'cairo_mask' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], + 'cairo_mask_surface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], + 'cairo_matrix_create_scale' => ['object', 'sx'=>'float', 'sy'=>'float'], + 'cairo_matrix_init' => ['object', 'xx='=>'float', 'yx='=>'float', 'xy='=>'float', 'yy='=>'float', 'x0='=>'float', 'y0='=>'float'], + 'cairo_matrix_init_identity' => ['object'], + 'cairo_matrix_init_rotate' => ['object', 'radians'=>'float'], + 'cairo_matrix_init_scale' => ['object', 'sx'=>'float', 'sy'=>'float'], + 'cairo_matrix_init_translate' => ['object', 'tx'=>'float', 'ty'=>'float'], + 'cairo_matrix_invert' => ['void', 'matrix'=>'cairomatrix'], + 'cairo_matrix_multiply' => ['CairoMatrix', 'matrix1'=>'cairomatrix', 'matrix2'=>'cairomatrix'], + 'cairo_matrix_rotate' => ['', 'matrix'=>'cairomatrix', 'radians'=>'float'], + 'cairo_matrix_scale' => ['', 'sx'=>'float', 'sy'=>'float', 'context'=>'cairocontext'], + 'cairo_matrix_transform_distance' => ['array', 'matrix'=>'cairomatrix', 'dx'=>'float', 'dy'=>'float'], + 'cairo_matrix_transform_point' => ['array', 'matrix'=>'cairomatrix', 'dx'=>'float', 'dy'=>'float'], + 'cairo_matrix_translate' => ['void', 'matrix'=>'cairomatrix', 'tx'=>'float', 'ty'=>'float'], + 'cairo_move_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'cairo_new_path' => ['', 'context'=>'cairocontext'], + 'cairo_new_sub_path' => ['', 'context'=>'cairocontext'], + 'cairo_paint' => ['', 'context'=>'cairocontext'], + 'cairo_paint_with_alpha' => ['', 'alpha'=>'string', 'context'=>'cairocontext'], + 'cairo_path_extents' => ['array', 'context'=>'cairocontext'], + 'cairo_pattern_add_color_stop_rgb' => ['void', 'pattern'=>'cairogradientpattern', 'offset'=>'float', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'cairo_pattern_add_color_stop_rgba' => ['void', 'pattern'=>'cairogradientpattern', 'offset'=>'float', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha'=>'float'], + 'cairo_pattern_create_for_surface' => ['CairoPattern', 'surface'=>'cairosurface'], + 'cairo_pattern_create_linear' => ['CairoPattern', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float'], + 'cairo_pattern_create_radial' => ['CairoPattern', 'x0'=>'float', 'y0'=>'float', 'r0'=>'float', 'x1'=>'float', 'y1'=>'float', 'r1'=>'float'], + 'cairo_pattern_create_rgb' => ['CairoPattern', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'cairo_pattern_create_rgba' => ['CairoPattern', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha'=>'float'], + 'cairo_pattern_get_color_stop_count' => ['int', 'pattern'=>'cairogradientpattern'], + 'cairo_pattern_get_color_stop_rgba' => ['array', 'pattern'=>'cairogradientpattern', 'index'=>'int'], + 'cairo_pattern_get_extend' => ['int', 'pattern'=>'string'], + 'cairo_pattern_get_filter' => ['int', 'pattern'=>'cairosurfacepattern'], + 'cairo_pattern_get_linear_points' => ['array', 'pattern'=>'cairolineargradient'], + 'cairo_pattern_get_matrix' => ['CairoMatrix', 'pattern'=>'cairopattern'], + 'cairo_pattern_get_radial_circles' => ['array', 'pattern'=>'cairoradialgradient'], + 'cairo_pattern_get_rgba' => ['array', 'pattern'=>'cairosolidpattern'], + 'cairo_pattern_get_surface' => ['CairoSurface', 'pattern'=>'cairosurfacepattern'], + 'cairo_pattern_get_type' => ['int', 'pattern'=>'cairopattern'], + 'cairo_pattern_set_extend' => ['void', 'pattern'=>'string', 'extend'=>'string'], + 'cairo_pattern_set_filter' => ['void', 'pattern'=>'cairosurfacepattern', 'filter'=>'int'], + 'cairo_pattern_set_matrix' => ['void', 'pattern'=>'cairopattern', 'matrix'=>'cairomatrix'], + 'cairo_pattern_status' => ['int', 'pattern'=>'cairopattern'], + 'cairo_pdf_surface_create' => ['CairoPdfSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], + 'cairo_pdf_surface_set_size' => ['void', 'surface'=>'cairopdfsurface', 'width'=>'float', 'height'=>'float'], + 'cairo_pop_group' => ['', 'context'=>'cairocontext'], + 'cairo_pop_group_to_source' => ['', 'context'=>'cairocontext'], + 'cairo_ps_get_levels' => ['array'], + 'cairo_ps_level_to_string' => ['string', 'level'=>'int'], + 'cairo_ps_surface_create' => ['CairoPsSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], + 'cairo_ps_surface_dsc_begin_page_setup' => ['void', 'surface'=>'cairopssurface'], + 'cairo_ps_surface_dsc_begin_setup' => ['void', 'surface'=>'cairopssurface'], + 'cairo_ps_surface_dsc_comment' => ['void', 'surface'=>'cairopssurface', 'comment'=>'string'], + 'cairo_ps_surface_get_eps' => ['bool', 'surface'=>'cairopssurface'], + 'cairo_ps_surface_restrict_to_level' => ['void', 'surface'=>'cairopssurface', 'level'=>'int'], + 'cairo_ps_surface_set_eps' => ['void', 'surface'=>'cairopssurface', 'level'=>'bool'], + 'cairo_ps_surface_set_size' => ['void', 'surface'=>'cairopssurface', 'width'=>'float', 'height'=>'float'], + 'cairo_push_group' => ['', 'context'=>'cairocontext'], + 'cairo_push_group_with_content' => ['', 'content'=>'string', 'context'=>'cairocontext'], + 'cairo_rectangle' => ['', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string', 'context'=>'cairocontext'], + 'cairo_rel_curve_to' => ['', 'x1'=>'string', 'y1'=>'string', 'x2'=>'string', 'y2'=>'string', 'x3'=>'string', 'y3'=>'string', 'context'=>'cairocontext'], + 'cairo_rel_line_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'cairo_rel_move_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'cairo_reset_clip' => ['', 'context'=>'cairocontext'], + 'cairo_restore' => ['', 'context'=>'cairocontext'], + 'cairo_rotate' => ['', 'sx'=>'string', 'sy'=>'string', 'context'=>'cairocontext', 'angle'=>'string'], + 'cairo_save' => ['', 'context'=>'cairocontext'], + 'cairo_scale' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'cairo_scaled_font_create' => ['CairoScaledFont', 'fontface'=>'cairofontface', 'matrix'=>'cairomatrix', 'ctm'=>'cairomatrix', 'fontoptions'=>'cairofontoptions'], + 'cairo_scaled_font_extents' => ['array', 'scaledfont'=>'cairoscaledfont'], + 'cairo_scaled_font_get_ctm' => ['CairoMatrix', 'scaledfont'=>'cairoscaledfont'], + 'cairo_scaled_font_get_font_face' => ['CairoFontFace', 'scaledfont'=>'cairoscaledfont'], + 'cairo_scaled_font_get_font_matrix' => ['CairoFontOptions', 'scaledfont'=>'cairoscaledfont'], + 'cairo_scaled_font_get_font_options' => ['CairoFontOptions', 'scaledfont'=>'cairoscaledfont'], + 'cairo_scaled_font_get_scale_matrix' => ['CairoMatrix', 'scaledfont'=>'cairoscaledfont'], + 'cairo_scaled_font_get_type' => ['int', 'scaledfont'=>'cairoscaledfont'], + 'cairo_scaled_font_glyph_extents' => ['array', 'scaledfont'=>'cairoscaledfont', 'glyphs'=>'array'], + 'cairo_scaled_font_status' => ['int', 'scaledfont'=>'cairoscaledfont'], + 'cairo_scaled_font_text_extents' => ['array', 'scaledfont'=>'cairoscaledfont', 'text'=>'string'], + 'cairo_select_font_face' => ['', 'family'=>'string', 'slant='=>'string', 'weight='=>'string', 'context='=>'cairocontext'], + 'cairo_set_antialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], + 'cairo_set_dash' => ['', 'dashes'=>'array', 'offset='=>'string', 'context='=>'cairocontext'], + 'cairo_set_fill_rule' => ['', 'setting'=>'string', 'context'=>'cairocontext'], + 'cairo_set_font_face' => ['', 'fontface'=>'cairofontface', 'context'=>'cairocontext'], + 'cairo_set_font_matrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], + 'cairo_set_font_options' => ['', 'fontoptions'=>'cairofontoptions', 'context'=>'cairocontext'], + 'cairo_set_font_size' => ['', 'size'=>'string', 'context'=>'cairocontext'], + 'cairo_set_line_cap' => ['', 'setting'=>'string', 'context'=>'cairocontext'], + 'cairo_set_line_join' => ['', 'setting'=>'string', 'context'=>'cairocontext'], + 'cairo_set_line_width' => ['', 'width'=>'string', 'context'=>'cairocontext'], + 'cairo_set_matrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], + 'cairo_set_miter_limit' => ['', 'limit'=>'string', 'context'=>'cairocontext'], + 'cairo_set_operator' => ['', 'setting'=>'string', 'context'=>'cairocontext'], + 'cairo_set_scaled_font' => ['', 'scaledfont'=>'cairoscaledfont', 'context'=>'cairocontext'], + 'cairo_set_source' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], + 'cairo_set_source_surface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], + 'cairo_set_tolerance' => ['', 'tolerance'=>'string', 'context'=>'cairocontext'], + 'cairo_show_page' => ['', 'context'=>'cairocontext'], + 'cairo_show_text' => ['', 'text'=>'string', 'context'=>'cairocontext'], + 'cairo_status' => ['int', 'context'=>'cairocontext'], + 'cairo_status_to_string' => ['string', 'status'=>'int'], + 'cairo_stroke' => ['', 'context'=>'cairocontext'], + 'cairo_stroke_extents' => ['array', 'context'=>'cairocontext'], + 'cairo_stroke_preserve' => ['', 'context'=>'cairocontext'], + 'cairo_surface_copy_page' => ['void', 'surface'=>'cairosurface'], + 'cairo_surface_create_similar' => ['CairoSurface', 'surface'=>'cairosurface', 'content'=>'int', 'width'=>'float', 'height'=>'float'], + 'cairo_surface_finish' => ['void', 'surface'=>'cairosurface'], + 'cairo_surface_flush' => ['void', 'surface'=>'cairosurface'], + 'cairo_surface_get_content' => ['int', 'surface'=>'cairosurface'], + 'cairo_surface_get_device_offset' => ['array', 'surface'=>'cairosurface'], + 'cairo_surface_get_font_options' => ['CairoFontOptions', 'surface'=>'cairosurface'], + 'cairo_surface_get_type' => ['int', 'surface'=>'cairosurface'], + 'cairo_surface_mark_dirty' => ['void', 'surface'=>'cairosurface'], + 'cairo_surface_mark_dirty_rectangle' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], + 'cairo_surface_set_device_offset' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float'], + 'cairo_surface_set_fallback_resolution' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float'], + 'cairo_surface_show_page' => ['void', 'surface'=>'cairosurface'], + 'cairo_surface_status' => ['int', 'surface'=>'cairosurface'], + 'cairo_surface_write_to_png' => ['void', 'surface'=>'cairosurface', 'stream'=>'resource'], + 'cairo_svg_get_versions' => ['array'], + 'cairo_svg_surface_create' => ['CairoSvgSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], + 'cairo_svg_surface_get_versions' => ['array'], + 'cairo_svg_surface_restrict_to_version' => ['void', 'surface'=>'cairosvgsurface', 'version'=>'int'], + 'cairo_svg_version_to_string' => ['string', 'version'=>'int'], + 'cairo_text_extents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], + 'cairo_text_path' => ['', 'string'=>'string', 'context'=>'cairocontext', 'text'=>'string'], + 'cairo_transform' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], + 'cairo_translate' => ['', 'tx'=>'string', 'ty'=>'string', 'context'=>'cairocontext', 'x'=>'string', 'y'=>'string'], + 'cairo_user_to_device' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'cairo_user_to_device_distance' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], + 'cairo_version' => ['int'], + 'cairo_version_string' => ['string'], + 'cal_days_in_month' => ['int', 'calendar'=>'int', 'month'=>'int', 'year'=>'int'], + 'cal_from_jd' => ['false|array{date:string,month:int,day:int,year:int,dow:int,abbrevdayname:string,dayname:string,abbrevmonth:string,monthname:string}', 'julian_day'=>'int', 'calendar'=>'int'], + 'cal_info' => ['array', 'calendar='=>'int'], + 'cal_to_jd' => ['int', 'calendar'=>'int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], + 'calcul_hmac' => ['string', 'clent'=>'string', 'siretcode'=>'string', 'price'=>'string', 'reference'=>'string', 'validity'=>'string', 'taxation'=>'string', 'devise'=>'string', 'language'=>'string'], + 'calculhmac' => ['string', 'clent'=>'string', 'data'=>'string'], + 'call_user_func' => ['mixed|false', 'callback'=>'callable', '...args='=>'mixed'], + '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'], + 'ceil' => ['float', 'num'=>'float'], + 'chdb::__construct' => ['void', 'pathname'=>'string'], + 'chdb::get' => ['string', 'key'=>'string'], + 'chdb_create' => ['bool', 'pathname'=>'string', 'data'=>'array'], + 'chdir' => ['bool', 'directory'=>'string'], + 'checkdate' => ['bool', 'month'=>'int', 'day'=>'int', 'year'=>'int'], + 'checkdnsrr' => ['bool', 'hostname'=>'string', 'type='=>'string'], + 'chgrp' => ['bool', 'filename'=>'string', 'group'=>'string|int'], + 'chmod' => ['bool', 'filename'=>'string', 'permissions'=>'int'], + 'chop' => ['string', 'string'=>'string', 'characters='=>'string'], + 'chown' => ['bool', 'filename'=>'string', 'user'=>'string|int'], + 'chr' => ['string', 'codepoint'=>'int'], + 'chroot' => ['bool', 'directory'=>'string'], + 'chunk_split' => ['string', 'string'=>'string', 'length='=>'int', 'separator='=>'string'], + 'classObj::__construct' => ['void', 'layer'=>'layerObj', 'class'=>'classObj'], + 'classObj::addLabel' => ['int', 'label'=>'labelObj'], + 'classObj::convertToString' => ['string'], + 'classObj::createLegendIcon' => ['imageObj', 'width'=>'int', 'height'=>'int'], + 'classObj::deletestyle' => ['int', 'index'=>'int'], + 'classObj::drawLegendIcon' => ['int', 'width'=>'int', 'height'=>'int', 'im'=>'imageObj', 'dstX'=>'int', 'dstY'=>'int'], + 'classObj::free' => ['void'], + 'classObj::getExpressionString' => ['string'], + 'classObj::getLabel' => ['labelObj', 'index'=>'int'], + 'classObj::getMetaData' => ['int', 'name'=>'string'], + 'classObj::getStyle' => ['styleObj', 'index'=>'int'], + 'classObj::getTextString' => ['string'], + 'classObj::movestyledown' => ['int', 'index'=>'int'], + 'classObj::movestyleup' => ['int', 'index'=>'int'], + 'classObj::ms_newClassObj' => ['classObj', 'layer'=>'layerObj', 'class'=>'classObj'], + 'classObj::removeLabel' => ['labelObj', 'index'=>'int'], + 'classObj::removeMetaData' => ['int', 'name'=>'string'], + 'classObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'classObj::setExpression' => ['int', 'expression'=>'string'], + 'classObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], + 'classObj::settext' => ['int', 'text'=>'string'], + 'classObj::updateFromString' => ['int', 'snippet'=>'string'], + 'class_alias' => ['bool', 'class'=>'string', 'alias'=>'string', 'autoload='=>'bool'], + 'class_exists' => ['bool', 'class'=>'string', 'autoload='=>'bool'], + 'class_implements' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], + 'class_parents' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], + 'class_uses' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], + 'classkit_import' => ['array', 'filename'=>'string'], + 'classkit_method_add' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int'], + 'classkit_method_copy' => ['bool', 'dclass'=>'string', 'dmethod'=>'string', 'sclass'=>'string', 'smethod='=>'string'], + 'classkit_method_redefine' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int'], + 'classkit_method_remove' => ['bool', 'classname'=>'string', 'methodname'=>'string'], + 'classkit_method_rename' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'newname'=>'string'], + 'clearstatcache' => ['void', 'clear_realpath_cache='=>'bool', 'filename='=>'string'], + 'cli_get_process_title' => ['?string'], + 'cli_set_process_title' => ['bool', 'title'=>'string'], + 'closedir' => ['void', 'dir_handle='=>'resource'], + 'closelog' => ['bool'], + 'clusterObj::convertToString' => ['string'], + 'clusterObj::getFilterString' => ['string'], + 'clusterObj::getGroupString' => ['string'], + 'clusterObj::setFilter' => ['int', 'expression'=>'string'], + 'clusterObj::setGroup' => ['int', 'expression'=>'string'], + 'collator_asort' => ['bool', 'object'=>'collator', '&rw_array'=>'array', 'flags='=>'int'], + 'collator_compare' => ['int', 'object'=>'collator', 'string1'=>'string', 'string2'=>'string'], + 'collator_create' => ['?Collator', 'locale'=>'string'], + 'collator_get_attribute' => ['int|false', 'object'=>'collator', 'attribute'=>'int'], + 'collator_get_error_code' => ['int', 'object'=>'collator'], + 'collator_get_error_message' => ['string', 'object'=>'collator'], + 'collator_get_locale' => ['string', 'object'=>'collator', 'type'=>'int'], + 'collator_get_sort_key' => ['string', 'object'=>'collator', 'string'=>'string'], + 'collator_get_strength' => ['int|false', 'object'=>'collator'], + 'collator_set_attribute' => ['bool', 'object'=>'collator', 'attribute'=>'int', 'value'=>'int'], + 'collator_set_strength' => ['bool', 'object'=>'collator', 'strength'=>'int'], + 'collator_sort' => ['bool', 'object'=>'collator', '&rw_array'=>'array', 'flags='=>'int'], + 'collator_sort_with_sort_keys' => ['bool', 'object'=>'collator', '&rw_array'=>'array'], + 'colorObj::setHex' => ['int', 'hex'=>'string'], + 'colorObj::toHex' => ['string'], + 'com_addref' => [''], + 'com_create_guid' => ['string'], + 'com_event_sink' => ['bool', 'variant'=>'VARIANT', 'sink_object'=>'object', 'sink_interface='=>'mixed'], + 'com_get_active_object' => ['VARIANT', 'prog_id'=>'string', 'codepage='=>'int'], + 'com_isenum' => ['bool', 'com_module'=>'variant'], + 'com_load_typelib' => ['bool', 'typelib_name'=>'string', 'case_insensitive='=>'bool'], + 'com_message_pump' => ['bool', 'timeout_milliseconds='=>'int'], + 'com_print_typeinfo' => ['bool', 'variant'=>'object', 'dispatch_interface='=>'string', 'display_sink='=>'bool'], + 'commonmark\cql::__invoke' => ['', 'root'=>'CommonMark\Node', 'handler'=>'callable'], + 'commonmark\interfaces\ivisitable::accept' => ['void', 'visitor'=>'CommonMark\Interfaces\IVisitor'], + 'commonmark\interfaces\ivisitor::enter' => ['?int|IVisitable', 'visitable'=>'IVisitable'], + 'commonmark\interfaces\ivisitor::leave' => ['?int|IVisitable', 'visitable'=>'IVisitable'], + 'commonmark\node::accept' => ['void', 'visitor'=>'CommonMark\Interfaces\IVisitor'], + 'commonmark\node::appendChild' => ['CommonMark\Node', 'child'=>'CommonMark\Node'], + 'commonmark\node::insertAfter' => ['CommonMark\Node', 'sibling'=>'CommonMark\Node'], + 'commonmark\node::insertBefore' => ['CommonMark\Node', 'sibling'=>'CommonMark\Node'], + 'commonmark\node::prependChild' => ['CommonMark\Node', 'child'=>'CommonMark\Node'], + 'commonmark\node::replace' => ['CommonMark\Node', 'target'=>'CommonMark\Node'], + 'commonmark\node::unlink' => ['void'], + 'commonmark\parse' => ['CommonMark\Node', 'content'=>'string', 'options='=>'int'], + 'commonmark\parser::finish' => ['CommonMark\Node'], + 'commonmark\parser::parse' => ['void', 'buffer'=>'string'], + 'commonmark\render' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], + 'commonmark\render\html' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int'], + 'commonmark\render\latex' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], + 'commonmark\render\man' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], + 'commonmark\render\xml' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int'], + 'compact' => ['array', 'var_name'=>'string|array', '...var_names='=>'string|array'], + 'componere\abstract\definition::addInterface' => ['Componere\Abstract\Definition', 'interface'=>'string'], + 'componere\abstract\definition::addMethod' => ['Componere\Abstract\Definition', 'name'=>'string', 'method'=>'Componere\Method'], + 'componere\abstract\definition::addTrait' => ['Componere\Abstract\Definition', 'trait'=>'string'], + 'componere\abstract\definition::getReflector' => ['ReflectionClass'], + 'componere\cast' => ['object', 'arg1'=>'string', 'object'=>'object'], + 'componere\cast_by_ref' => ['object', 'arg1'=>'string', 'object'=>'object'], + 'componere\definition::addConstant' => ['Componere\Definition', 'name'=>'string', 'value'=>'Componere\Value'], + 'componere\definition::addProperty' => ['Componere\Definition', 'name'=>'string', 'value'=>'Componere\Value'], + 'componere\definition::getClosure' => ['Closure', 'name'=>'string'], + 'componere\definition::getClosures' => ['Closure[]'], + 'componere\definition::isRegistered' => ['bool'], + 'componere\definition::register' => ['void'], + 'componere\method::getReflector' => ['ReflectionMethod'], + 'componere\method::setPrivate' => ['Method'], + 'componere\method::setProtected' => ['Method'], + 'componere\method::setStatic' => ['Method'], + 'componere\patch::apply' => ['void'], + 'componere\patch::derive' => ['Componere\Patch', 'instance'=>'object'], + 'componere\patch::getClosure' => ['Closure', 'name'=>'string'], + 'componere\patch::getClosures' => ['Closure[]'], + 'componere\patch::isApplied' => ['bool'], + 'componere\patch::revert' => ['void'], + 'componere\value::hasDefault' => ['bool'], + 'componere\value::isPrivate' => ['bool'], + 'componere\value::isProtected' => ['bool'], + 'componere\value::isStatic' => ['bool'], + 'componere\value::setPrivate' => ['Value'], + 'componere\value::setProtected' => ['Value'], + 'componere\value::setStatic' => ['Value'], + 'confirm_pdo_ibm_compiled' => [''], + 'connection_aborted' => ['int'], + 'connection_status' => ['int'], + 'connection_timeout' => ['int'], + 'constant' => ['mixed', 'name'=>'string'], + 'convert_cyr_string' => ['string', 'string'=>'string', 'from'=>'string', 'to'=>'string'], + 'convert_uudecode' => ['string', 'string'=>'string'], + 'convert_uuencode' => ['string', 'string'=>'string'], + 'copy' => ['bool', 'from'=>'string', 'to'=>'string', 'context='=>'resource'], + 'cos' => ['float', 'num'=>'float'], + 'cosh' => ['float', 'num'=>'float'], + 'count' => ['int', 'value'=>'Countable|array|SimpleXMLElement|ResourceBundle', 'mode='=>'int'], + 'count_chars' => ['array|false', 'input'=>'string', 'mode='=>'0|1|2'], + 'count_chars\'1' => ['string|false', 'input'=>'string', 'mode='=>'3|4'], + 'crack_check' => ['bool', 'dictionary'=>'', 'password'=>'string'], + 'crack_closedict' => ['bool', 'dictionary='=>'resource'], + 'crack_getlastmessage' => ['string'], + 'crack_opendict' => ['resource|false', 'dictionary'=>'string'], + 'crash' => [''], + 'crc32' => ['int', 'string'=>'string'], + 'create_function' => ['string', 'args'=>'string', 'code'=>'string'], + 'crypt' => ['string', 'string'=>'string', 'salt='=>'string'], + 'ctype_alnum' => ['bool', 'text'=>'string|int'], + 'ctype_alpha' => ['bool', 'text'=>'string|int'], + 'ctype_cntrl' => ['bool', 'text'=>'string|int'], + 'ctype_digit' => ['bool', 'text'=>'string|int'], + 'ctype_graph' => ['bool', 'text'=>'string|int'], + 'ctype_lower' => ['bool', 'text'=>'string|int'], + 'ctype_print' => ['bool', 'text'=>'string|int'], + 'ctype_punct' => ['bool', 'text'=>'string|int'], + 'ctype_space' => ['bool', 'text'=>'string|int'], + 'ctype_upper' => ['bool', 'text'=>'string|int'], + 'ctype_xdigit' => ['bool', 'text'=>'string|int'], + 'cubrid_affected_rows' => ['int', 'req_identifier='=>''], + 'cubrid_bind' => ['bool', 'req_identifier'=>'resource', 'bind_param'=>'int', 'bind_value'=>'mixed', 'bind_value_type='=>'string'], + 'cubrid_client_encoding' => ['string', 'conn_identifier='=>''], + 'cubrid_close' => ['bool', 'conn_identifier='=>''], + 'cubrid_close_prepare' => ['bool', 'req_identifier'=>'resource'], + 'cubrid_close_request' => ['bool', 'req_identifier'=>'resource'], + 'cubrid_col_get' => ['array', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string'], + 'cubrid_col_size' => ['int', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string'], + 'cubrid_column_names' => ['array', 'req_identifier'=>'resource'], + 'cubrid_column_types' => ['array', 'req_identifier'=>'resource'], + 'cubrid_commit' => ['bool', 'conn_identifier'=>'resource'], + 'cubrid_connect' => ['resource', 'host'=>'string', 'port'=>'int', 'dbname'=>'string', 'userid='=>'string', 'passwd='=>'string'], + 'cubrid_connect_with_url' => ['resource', 'conn_url'=>'string', 'userid='=>'string', 'passwd='=>'string'], + 'cubrid_current_oid' => ['string', 'req_identifier'=>'resource'], + 'cubrid_data_seek' => ['bool', 'req_identifier'=>'', 'row_number'=>'int'], + 'cubrid_db_name' => ['string', 'result'=>'array', 'index'=>'int'], + 'cubrid_db_parameter' => ['array', 'conn_identifier'=>'resource'], + 'cubrid_disconnect' => ['bool', 'conn_identifier'=>'resource'], + 'cubrid_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], + 'cubrid_errno' => ['int', 'conn_identifier='=>''], + 'cubrid_error' => ['string', 'connection='=>''], + 'cubrid_error_code' => ['int'], + 'cubrid_error_code_facility' => ['int'], + 'cubrid_error_msg' => ['string'], + 'cubrid_execute' => ['bool', 'conn_identifier'=>'', 'sql'=>'string', 'option='=>'int', 'request_identifier='=>''], + 'cubrid_fetch' => ['mixed', 'result'=>'resource', 'type='=>'int'], + 'cubrid_fetch_array' => ['array', 'result'=>'resource', 'type='=>'int'], + 'cubrid_fetch_assoc' => ['array', 'result'=>'resource'], + 'cubrid_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], + 'cubrid_fetch_lengths' => ['array', 'result'=>'resource'], + 'cubrid_fetch_object' => ['object', 'result'=>'resource', 'class_name='=>'string', 'params='=>'array'], + 'cubrid_fetch_row' => ['array', 'result'=>'resource'], + 'cubrid_field_flags' => ['string', 'result'=>'resource', 'field_offset'=>'int'], + 'cubrid_field_len' => ['int', 'result'=>'resource', 'field_offset'=>'int'], + 'cubrid_field_name' => ['string', 'result'=>'resource', 'field_offset'=>'int'], + 'cubrid_field_seek' => ['bool', 'result'=>'resource', 'field_offset='=>'int'], + 'cubrid_field_table' => ['string', 'result'=>'resource', 'field_offset'=>'int'], + 'cubrid_field_type' => ['string', 'result'=>'resource', 'field_offset'=>'int'], + 'cubrid_free_result' => ['bool', 'req_identifier'=>'resource'], + 'cubrid_get' => ['mixed', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr='=>'mixed'], + 'cubrid_get_autocommit' => ['bool', 'conn_identifier'=>'resource'], + 'cubrid_get_charset' => ['string', 'conn_identifier'=>'resource'], + 'cubrid_get_class_name' => ['string', 'conn_identifier'=>'resource', 'oid'=>'string'], + 'cubrid_get_client_info' => ['string'], + 'cubrid_get_db_parameter' => ['array', 'conn_identifier'=>'resource'], + 'cubrid_get_query_timeout' => ['int', 'req_identifier'=>'resource'], + 'cubrid_get_server_info' => ['string', 'conn_identifier'=>'resource'], + 'cubrid_insert_id' => ['string', 'conn_identifier='=>'resource'], + 'cubrid_is_instance' => ['int', 'conn_identifier'=>'resource', 'oid'=>'string'], + 'cubrid_list_dbs' => ['array', 'conn_identifier'=>'resource'], + 'cubrid_load_from_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string', 'file_name'=>'string'], + 'cubrid_lob2_bind' => ['bool', 'req_identifier'=>'resource', 'bind_index'=>'int', 'bind_value'=>'mixed', 'bind_value_type='=>'string'], + 'cubrid_lob2_close' => ['bool', 'lob_identifier'=>'resource'], + 'cubrid_lob2_export' => ['bool', 'lob_identifier'=>'resource', 'file_name'=>'string'], + 'cubrid_lob2_import' => ['bool', 'lob_identifier'=>'resource', 'file_name'=>'string'], + 'cubrid_lob2_new' => ['resource', 'conn_identifier='=>'resource', 'type='=>'string'], + 'cubrid_lob2_read' => ['string', 'lob_identifier'=>'resource', 'length'=>'int'], + 'cubrid_lob2_seek' => ['bool', 'lob_identifier'=>'resource', 'offset'=>'int', 'origin='=>'int'], + 'cubrid_lob2_seek64' => ['bool', 'lob_identifier'=>'resource', 'offset'=>'string', 'origin='=>'int'], + 'cubrid_lob2_size' => ['int', 'lob_identifier'=>'resource'], + 'cubrid_lob2_size64' => ['string', 'lob_identifier'=>'resource'], + 'cubrid_lob2_tell' => ['int', 'lob_identifier'=>'resource'], + 'cubrid_lob2_tell64' => ['string', 'lob_identifier'=>'resource'], + 'cubrid_lob2_write' => ['bool', 'lob_identifier'=>'resource', 'buf'=>'string'], + 'cubrid_lob_close' => ['bool', 'lob_identifier_array'=>'array'], + 'cubrid_lob_export' => ['bool', 'conn_identifier'=>'resource', 'lob_identifier'=>'resource', 'path_name'=>'string'], + 'cubrid_lob_get' => ['array', 'conn_identifier'=>'resource', 'sql'=>'string'], + 'cubrid_lob_send' => ['bool', 'conn_identifier'=>'resource', 'lob_identifier'=>'resource'], + 'cubrid_lob_size' => ['string', 'lob_identifier'=>'resource'], + 'cubrid_lock_read' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], + 'cubrid_lock_write' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], + 'cubrid_move_cursor' => ['int', 'req_identifier'=>'resource', 'offset'=>'int', 'origin='=>'int'], + 'cubrid_new_glo' => ['string', 'conn_identifier'=>'', 'class_name'=>'string', 'file_name'=>'string'], + 'cubrid_next_result' => ['bool', 'result'=>'resource'], + 'cubrid_num_cols' => ['int', 'req_identifier'=>'resource'], + 'cubrid_num_fields' => ['int', 'result'=>'resource'], + 'cubrid_num_rows' => ['int', 'req_identifier'=>'resource'], + 'cubrid_pconnect' => ['resource', 'host'=>'string', 'port'=>'int', 'dbname'=>'string', 'userid='=>'string', 'passwd='=>'string'], + 'cubrid_pconnect_with_url' => ['resource', 'conn_url'=>'string', 'userid='=>'string', 'passwd='=>'string'], + 'cubrid_ping' => ['bool', 'conn_identifier='=>''], + 'cubrid_prepare' => ['resource', 'conn_identifier'=>'resource', 'prepare_stmt'=>'string', 'option='=>'int'], + 'cubrid_put' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr='=>'string', 'value='=>'mixed'], + 'cubrid_query' => ['resource', 'query'=>'string', 'conn_identifier='=>''], + 'cubrid_real_escape_string' => ['string', 'unescaped_string'=>'string', 'conn_identifier='=>''], + 'cubrid_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field='=>''], + 'cubrid_rollback' => ['bool', 'conn_identifier'=>'resource'], + 'cubrid_save_to_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string', 'file_name'=>'string'], + 'cubrid_schema' => ['array', 'conn_identifier'=>'resource', 'schema_type'=>'int', 'class_name='=>'string', 'attr_name='=>'string'], + 'cubrid_send_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string'], + 'cubrid_seq_add' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'seq_element'=>'string'], + 'cubrid_seq_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int'], + 'cubrid_seq_insert' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int', 'seq_element'=>'string'], + 'cubrid_seq_put' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int', 'seq_element'=>'string'], + 'cubrid_set_add' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'set_element'=>'string'], + 'cubrid_set_autocommit' => ['bool', 'conn_identifier'=>'resource', 'mode'=>'bool'], + 'cubrid_set_db_parameter' => ['bool', 'conn_identifier'=>'resource', 'param_type'=>'int', 'param_value'=>'int'], + 'cubrid_set_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'set_element'=>'string'], + 'cubrid_set_query_timeout' => ['bool', 'req_identifier'=>'resource', 'timeout'=>'int'], + 'cubrid_unbuffered_query' => ['resource', 'query'=>'string', 'conn_identifier='=>''], + 'cubrid_version' => ['string'], + 'curl_close' => ['void', 'ch'=>'resource'], + 'curl_copy_handle' => ['resource', 'ch'=>'resource'], + 'curl_errno' => ['int', 'ch'=>'resource'], + 'curl_error' => ['string', 'ch'=>'resource'], + 'curl_escape' => ['string|false', 'ch'=>'resource', 'string'=>'string'], + 'curl_exec' => ['bool|string', 'ch'=>'resource'], + 'curl_file_create' => ['CURLFile', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'], + 'curl_getinfo' => ['mixed', 'ch'=>'resource', 'option='=>'int'], + 'curl_init' => ['resource|false', 'url='=>'string'], + 'curl_multi_add_handle' => ['int', 'mh'=>'resource', 'ch'=>'resource'], + 'curl_multi_close' => ['void', 'mh'=>'resource'], + 'curl_multi_exec' => ['int', 'mh'=>'resource', '&w_still_running'=>'int'], + 'curl_multi_getcontent' => ['?string', 'ch'=>'resource'], + 'curl_multi_info_read' => ['array|false', 'mh'=>'resource', '&w_msgs_in_queue='=>'int'], + 'curl_multi_init' => ['resource|false'], + 'curl_multi_remove_handle' => ['int', 'mh'=>'resource', 'ch'=>'resource'], + 'curl_multi_select' => ['int', 'mh'=>'resource', 'timeout='=>'float'], + 'curl_multi_setopt' => ['bool', 'mh'=>'resource', 'option'=>'int', 'value'=>'mixed'], + 'curl_multi_strerror' => ['?string', 'error_code'=>'int'], + 'curl_pause' => ['int', 'ch'=>'resource', 'bitmask'=>'int'], + 'curl_reset' => ['void', 'ch'=>'resource'], + 'curl_setopt' => ['bool', 'ch'=>'resource', 'option'=>'int', 'value'=>'callable|mixed'], + 'curl_setopt_array' => ['bool', 'ch'=>'resource', 'options'=>'array'], + 'curl_share_close' => ['void', 'sh'=>'resource'], + 'curl_share_init' => ['resource'], + 'curl_share_setopt' => ['bool', 'sh'=>'resource', 'option'=>'int', 'value'=>'mixed'], + 'curl_strerror' => ['?string', 'error_code'=>'int'], + 'curl_unescape' => ['string|false', 'ch'=>'resource', 'string'=>'string'], + 'curl_version' => ['array', 'version='=>'int'], + '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'], + 'cyrus_bind' => ['bool', 'connection'=>'resource', 'callbacks'=>'array'], + 'cyrus_close' => ['bool', 'connection'=>'resource'], + 'cyrus_connect' => ['resource', 'host='=>'string', 'port='=>'string', 'flags='=>'int'], + 'cyrus_query' => ['array', 'connection'=>'resource', 'query'=>'string'], + 'cyrus_unbind' => ['bool', 'connection'=>'resource', 'trigger_name'=>'string'], + 'date' => ['string', 'format'=>'string', 'timestamp='=>'int'], + 'date_add' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'], + 'date_create' => ['DateTime|false', 'datetime='=>'string', 'timezone='=>'?DateTimeZone'], + 'date_create_from_format' => ['DateTime|false', 'format'=>'string', 'datetime'=>'string', 'timezone='=>'?\DateTimeZone'], + 'date_create_immutable' => ['DateTimeImmutable|false', 'datetime='=>'string', 'timezone='=>'?DateTimeZone'], + 'date_create_immutable_from_format' => ['DateTimeImmutable|false', 'format'=>'string', 'datetime'=>'string', 'timezone='=>'?DateTimeZone'], + 'date_date_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'month'=>'int', 'day'=>'int'], + 'date_default_timezone_get' => ['string'], + 'date_default_timezone_set' => ['bool', 'timezoneId'=>'string'], + 'date_diff' => ['DateInterval|false', 'baseObject'=>'DateTimeInterface', 'targetObject'=>'DateTimeInterface', 'absolute='=>'bool'], + 'date_format' => ['string|false', 'object'=>'DateTimeInterface', 'format'=>'string'], + 'date_get_last_errors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], + 'date_interval_create_from_date_string' => ['DateInterval', 'datetime'=>'string'], + 'date_interval_format' => ['string', 'object'=>'DateInterval', 'format'=>'string'], + 'date_isodate_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'week'=>'int', 'dayOfWeek='=>'int|mixed'], + 'date_modify' => ['DateTime|false', 'object'=>'DateTime', 'modifier'=>'string'], + 'date_offset_get' => ['int|false', 'object'=>'DateTimeInterface'], + 'date_parse' => ['array|false', 'datetime'=>'string'], + 'date_parse_from_format' => ['array', 'format'=>'string', 'datetime'=>'string'], + 'date_sub' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'], + 'date_sun_info' => ['array|false', 'timestamp'=>'int', 'latitude'=>'float', 'longitude'=>'float'], + 'date_sunrise' => ['mixed', 'timestamp'=>'int', 'returnFormat='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'utcOffset='=>'float'], + 'date_sunset' => ['mixed', 'timestamp'=>'int', 'returnFormat='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'utcOffset='=>'float'], + 'date_time_set' => ['DateTime|false', 'object'=>'', 'hour'=>'', 'minute'=>'', 'second='=>'', 'microsecond='=>''], + 'date_timestamp_get' => ['int', 'object'=>'DateTimeInterface'], + 'date_timestamp_set' => ['DateTime|false', 'object'=>'DateTime', 'timestamp'=>'int'], + 'date_timezone_get' => ['DateTimeZone|false', 'object'=>'DateTimeInterface'], + 'date_timezone_set' => ['DateTime|false', 'object'=>'DateTime', 'timezone'=>'DateTimeZone'], + 'datefmt_create' => ['?IntlDateFormatter', 'locale'=>'?string', 'dateType'=>'int', 'timeType'=>'int', 'timezone='=>'DateTimeZone|IntlTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'string'], + 'datefmt_format' => ['string|false', 'formatter'=>'IntlDateFormatter', 'datetime'=>'DateTime|IntlCalendar|array|int'], + 'datefmt_format_object' => ['string|false', 'datetime'=>'object', 'format='=>'mixed', 'locale='=>'string'], + 'datefmt_get_calendar' => ['int', 'formatter'=>'IntlDateFormatter'], + 'datefmt_get_calendar_object' => ['IntlCalendar|false|null', 'formatter'=>'IntlDateFormatter'], + 'datefmt_get_datetype' => ['int', 'formatter'=>'IntlDateFormatter'], + 'datefmt_get_error_code' => ['int', 'formatter'=>'IntlDateFormatter'], + 'datefmt_get_error_message' => ['string', 'formatter'=>'IntlDateFormatter'], + 'datefmt_get_locale' => ['string|false', 'formatter'=>'IntlDateFormatter', 'type='=>'int'], + 'datefmt_get_pattern' => ['string', 'formatter'=>'IntlDateFormatter'], + 'datefmt_get_timetype' => ['int', 'formatter'=>'IntlDateFormatter'], + 'datefmt_get_timezone' => ['IntlTimeZone|false', 'formatter'=>'IntlDateFormatter'], + 'datefmt_get_timezone_id' => ['string|false', 'formatter'=>'IntlDateFormatter'], + 'datefmt_is_lenient' => ['bool', 'formatter'=>'IntlDateFormatter'], + 'datefmt_localtime' => ['array|false', 'formatter'=>'IntlDateFormatter', 'string'=>'string', '&rw_offset='=>'int'], + 'datefmt_parse' => ['int|false', 'formatter'=>'IntlDateFormatter', 'string'=>'string', '&rw_offset='=>'int'], + 'datefmt_set_calendar' => ['bool', 'formatter'=>'IntlDateFormatter', 'calendar'=>'int'], + 'datefmt_set_lenient' => ['?bool', '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_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_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_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_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_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_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_pclose' => ['bool', 'resource'=>'resource'], + '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_primarykeys' => [''], + '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_rollback' => ['bool', 'connection'=>'resource'], + 'db2_server_info' => ['object|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_specialcolumns' => [''], + '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_tableprivileges' => [''], + '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'], + 'dba_fetch' => ['string|false', 'key'=>'string', 'skip'=>'int', 'dba'=>'resource'], + 'dba_fetch\'1' => ['string|false', 'key'=>'string', 'skip'=>'resource'], + 'dba_firstkey' => ['string', 'dba'=>'resource'], + 'dba_handlers' => ['array', 'full_info='=>'bool'], + 'dba_insert' => ['bool', 'key'=>'string', 'value'=>'string', 'dba'=>'resource'], + 'dba_key_split' => ['array|false', 'key'=>'string'], + 'dba_list' => ['array'], + 'dba_nextkey' => ['string', 'dba'=>'resource'], + 'dba_open' => ['resource', 'path'=>'string', 'mode'=>'string', 'handler='=>'string', '...handler_params='=>'string'], + 'dba_optimize' => ['bool', 'dba'=>'resource'], + 'dba_popen' => ['resource', 'path'=>'string', 'mode'=>'string', 'handler='=>'string', '...handler_params='=>'string'], + 'dba_replace' => ['bool', 'key'=>'string', 'value'=>'string', 'dba'=>'resource'], + 'dba_sync' => ['bool', 'dba'=>'resource'], + 'dbase_add_record' => ['bool', 'dbase_identifier'=>'resource', 'record'=>'array'], + 'dbase_close' => ['bool', 'dbase_identifier'=>'resource'], + 'dbase_create' => ['resource|false', 'filename'=>'string', 'fields'=>'array'], + 'dbase_delete_record' => ['bool', 'dbase_identifier'=>'resource', 'record_number'=>'int'], + 'dbase_get_header_info' => ['array', 'dbase_identifier'=>'resource'], + 'dbase_get_record' => ['array', 'dbase_identifier'=>'resource', 'record_number'=>'int'], + 'dbase_get_record_with_names' => ['array', 'dbase_identifier'=>'resource', 'record_number'=>'int'], + 'dbase_numfields' => ['int', 'dbase_identifier'=>'resource'], + 'dbase_numrecords' => ['int', 'dbase_identifier'=>'resource'], + 'dbase_open' => ['resource|false', 'filename'=>'string', 'mode'=>'int'], + 'dbase_pack' => ['bool', 'dbase_identifier'=>'resource'], + 'dbase_replace_record' => ['bool', 'dbase_identifier'=>'resource', 'record'=>'array', 'record_number'=>'int'], + 'dbplus_add' => ['int', 'relation'=>'resource', 'tuple'=>'array'], + 'dbplus_aql' => ['resource', 'query'=>'string', 'server='=>'string', 'dbpath='=>'string'], + 'dbplus_chdir' => ['string', 'newdir='=>'string'], + 'dbplus_close' => ['mixed', 'relation'=>'resource'], + 'dbplus_curr' => ['int', 'relation'=>'resource', 'tuple'=>'array'], + 'dbplus_errcode' => ['string', 'errno='=>'int'], + 'dbplus_errno' => ['int'], + 'dbplus_find' => ['int', 'relation'=>'resource', 'constraints'=>'array', 'tuple'=>'mixed'], + 'dbplus_first' => ['int', 'relation'=>'resource', 'tuple'=>'array'], + 'dbplus_flush' => ['int', 'relation'=>'resource'], + 'dbplus_freealllocks' => ['int'], + 'dbplus_freelock' => ['int', 'relation'=>'resource', 'tuple'=>'string'], + 'dbplus_freerlocks' => ['int', 'relation'=>'resource'], + 'dbplus_getlock' => ['int', 'relation'=>'resource', 'tuple'=>'string'], + 'dbplus_getunique' => ['int', 'relation'=>'resource', 'uniqueid'=>'int'], + 'dbplus_info' => ['int', 'relation'=>'resource', 'key'=>'string', 'result'=>'array'], + 'dbplus_last' => ['int', 'relation'=>'resource', 'tuple'=>'array'], + 'dbplus_lockrel' => ['int', 'relation'=>'resource'], + 'dbplus_next' => ['int', 'relation'=>'resource', 'tuple'=>'array'], + 'dbplus_open' => ['resource', 'name'=>'string'], + 'dbplus_prev' => ['int', 'relation'=>'resource', 'tuple'=>'array'], + 'dbplus_rchperm' => ['int', 'relation'=>'resource', 'mask'=>'int', 'user'=>'string', 'group'=>'string'], + 'dbplus_rcreate' => ['resource', 'name'=>'string', 'domlist'=>'mixed', 'overwrite='=>'bool'], + 'dbplus_rcrtexact' => ['mixed', 'name'=>'string', 'relation'=>'resource', 'overwrite='=>'bool'], + 'dbplus_rcrtlike' => ['mixed', 'name'=>'string', 'relation'=>'resource', 'overwrite='=>'int'], + 'dbplus_resolve' => ['array', 'relation_name'=>'string'], + 'dbplus_restorepos' => ['int', 'relation'=>'resource', 'tuple'=>'array'], + 'dbplus_rkeys' => ['mixed', 'relation'=>'resource', 'domlist'=>'mixed'], + 'dbplus_ropen' => ['resource', 'name'=>'string'], + 'dbplus_rquery' => ['resource', 'query'=>'string', 'dbpath='=>'string'], + 'dbplus_rrename' => ['int', 'relation'=>'resource', 'name'=>'string'], + 'dbplus_rsecindex' => ['mixed', 'relation'=>'resource', 'domlist'=>'mixed', 'type'=>'int'], + 'dbplus_runlink' => ['int', 'relation'=>'resource'], + 'dbplus_rzap' => ['int', 'relation'=>'resource'], + 'dbplus_savepos' => ['int', 'relation'=>'resource'], + 'dbplus_setindex' => ['int', 'relation'=>'resource', 'idx_name'=>'string'], + 'dbplus_setindexbynumber' => ['int', 'relation'=>'resource', 'idx_number'=>'int'], + 'dbplus_sql' => ['resource', 'query'=>'string', 'server='=>'string', 'dbpath='=>'string'], + 'dbplus_tcl' => ['string', 'sid'=>'int', 'script'=>'string'], + 'dbplus_tremove' => ['int', 'relation'=>'resource', 'tuple'=>'array', 'current='=>'array'], + 'dbplus_undo' => ['int', 'relation'=>'resource'], + 'dbplus_undoprepare' => ['int', 'relation'=>'resource'], + 'dbplus_unlockrel' => ['int', 'relation'=>'resource'], + 'dbplus_unselect' => ['int', 'relation'=>'resource'], + 'dbplus_update' => ['int', 'relation'=>'resource', 'old'=>'array', 'new'=>'array'], + 'dbplus_xlockrel' => ['int', 'relation'=>'resource'], + 'dbplus_xunlockrel' => ['int', 'relation'=>'resource'], + 'dbx_close' => ['int', 'link_identifier'=>'object'], + 'dbx_compare' => ['int', 'row_a'=>'array', 'row_b'=>'array', 'column_key'=>'string', 'flags='=>'int'], + 'dbx_connect' => ['object', 'module'=>'mixed', 'host'=>'string', 'database'=>'string', 'username'=>'string', 'password'=>'string', 'persistent='=>'int'], + 'dbx_error' => ['string', 'link_identifier'=>'object'], + 'dbx_escape_string' => ['string', 'link_identifier'=>'object', 'text'=>'string'], + 'dbx_fetch_row' => ['mixed', 'result_identifier'=>'object'], + 'dbx_query' => ['mixed', 'link_identifier'=>'object', 'sql_statement'=>'string', 'flags='=>'int'], + 'dbx_sort' => ['bool', 'result'=>'object', 'user_compare_function'=>'string'], + 'dcgettext' => ['string', 'domain'=>'string', 'message'=>'string', 'category'=>'int'], + 'dcngettext' => ['string', 'domain'=>'string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int', 'category'=>'int'], + 'deaggregate' => ['', 'object'=>'object', 'class_name='=>'string'], + 'debug_backtrace' => ['list', 'options='=>'int', 'limit='=>'int'], + 'debug_print_backtrace' => ['void', 'options='=>'int', 'limit='=>'int'], + 'debug_zval_dump' => ['void', '...value'=>'mixed'], + 'debugger_connect' => [''], + 'debugger_connector_pid' => [''], + 'debugger_get_server_start_time' => [''], + 'debugger_print' => [''], + 'debugger_start_debug' => [''], + 'decbin' => ['string', 'num'=>'int'], + 'dechex' => ['string', 'num'=>'int'], + 'decoct' => ['string', 'num'=>'int'], + 'define' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'case_insensitive='=>'bool'], + 'define_syslog_variables' => ['void'], + 'defined' => ['bool', 'constant_name'=>'string'], + 'deflate_add' => ['string|false', 'context'=>'resource', 'data'=>'string', 'flush_mode='=>'int'], + 'deflate_init' => ['resource|false', 'encoding'=>'int', 'options='=>'array'], + 'deg2rad' => ['float', 'num'=>'float'], + 'dgettext' => ['string', 'domain'=>'string', 'message'=>'string'], + 'dio_close' => ['void', 'fd'=>'resource'], + 'dio_fcntl' => ['mixed', 'fd'=>'resource', 'cmd'=>'int', 'args='=>'mixed'], + 'dio_open' => ['resource|false', 'filename'=>'string', 'flags'=>'int', 'mode='=>'int'], + 'dio_read' => ['string', 'fd'=>'resource', 'length='=>'int'], + 'dio_seek' => ['int', 'fd'=>'resource', 'pos'=>'int', 'whence='=>'int'], + 'dio_stat' => ['?array', 'fd'=>'resource'], + 'dio_tcsetattr' => ['bool', 'fd'=>'resource', 'options'=>'array'], + 'dio_truncate' => ['bool', 'fd'=>'resource', 'offset'=>'int'], + 'dio_write' => ['int', 'fd'=>'resource', 'data'=>'string', 'length='=>'int'], + 'dir' => ['Directory|false', 'directory'=>'string', 'context='=>'resource'], + 'dirname' => ['string', 'path'=>'string', 'levels='=>'int'], + 'disk_free_space' => ['float|false', 'directory'=>'string'], + 'disk_total_space' => ['float|false', 'directory'=>'string'], + 'diskfreespace' => ['float|false', 'directory'=>'string'], + 'display_disabled_function' => [''], + 'dl' => ['bool', 'extension_filename'=>'string'], + 'dngettext' => ['string', 'domain'=>'string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int'], + 'dns_check_record' => ['bool', 'hostname'=>'string', 'type='=>'string'], + 'dns_get_mx' => ['bool', 'hostname'=>'string', '&w_hosts'=>'array', '&w_weights'=>'array'], + 'dns_get_record' => ['list|false', 'hostname'=>'string', 'type='=>'int', '&w_authoritative_name_servers='=>'array', '&w_additional_records='=>'array', 'raw='=>'bool'], + 'dom_document_relaxNG_validate_file' => ['bool', 'filename'=>'string'], + 'dom_document_relaxNG_validate_xml' => ['bool', 'source'=>'string'], + 'dom_document_schema_validate' => ['bool', 'source'=>'string', 'flags'=>'int'], + 'dom_document_schema_validate_file' => ['bool', 'filename'=>'string', 'flags'=>'int'], + 'dom_document_xinclude' => ['int', 'options'=>'int'], + 'dom_import_simplexml' => ['DOMElement|null', 'node'=>'SimpleXMLElement'], + 'dom_xpath_evaluate' => ['', 'expr'=>'string', 'context'=>'DOMNode', 'registernodens'=>'bool'], + 'dom_xpath_query' => ['DOMNodeList', 'expr'=>'string', 'context'=>'DOMNode', 'registernodens'=>'bool'], + 'dom_xpath_register_ns' => ['bool', 'prefix'=>'string', 'uri'=>'string'], + 'dom_xpath_register_php_functions' => [''], + 'domxml_new_doc' => ['DomDocument', 'version'=>'string'], + 'domxml_open_file' => ['DomDocument', 'filename'=>'string', 'mode='=>'int', 'error='=>'array'], + 'domxml_open_mem' => ['DomDocument', 'string'=>'string', 'mode='=>'int', 'error='=>'array'], + 'domxml_version' => ['string'], + 'domxml_xmltree' => ['DomDocument', 'string'=>'string'], + 'domxml_xslt_stylesheet' => ['DomXsltStylesheet', 'xsl_buf'=>'string'], + 'domxml_xslt_stylesheet_doc' => ['DomXsltStylesheet', 'xsl_doc'=>'DOMDocument'], + 'domxml_xslt_stylesheet_file' => ['DomXsltStylesheet', 'xsl_file'=>'string'], + 'domxml_xslt_version' => ['int'], + 'dotnet_load' => ['int', 'assembly_name'=>'string', 'datatype_name='=>'string', 'codepage='=>'int'], + 'doubleval' => ['float', 'value'=>'mixed'], + 'each' => ['array{0:int|string,key:int|string,1:mixed,value:mixed}', '&r_arr'=>'array'], + 'easter_date' => ['int', 'year='=>'int'], + 'easter_days' => ['int', 'year='=>'int', 'mode='=>'int'], + 'echo' => ['void', 'arg1'=>'string', '...args='=>'string'], + 'eio_busy' => ['resource', 'delay'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_cancel' => ['void', 'req'=>'resource'], + 'eio_chmod' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_chown' => ['resource', 'path'=>'string', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_close' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_custom' => ['resource', 'execute'=>'callable', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], + 'eio_dup2' => ['resource', 'fd'=>'mixed', 'fd2'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_event_loop' => ['bool'], + 'eio_fallocate' => ['resource', 'fd'=>'mixed', 'mode'=>'int', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_fchmod' => ['resource', 'fd'=>'mixed', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_fchown' => ['resource', 'fd'=>'mixed', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_fdatasync' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_fstat' => ['resource', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], + 'eio_fstatvfs' => ['resource', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], + 'eio_fsync' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_ftruncate' => ['resource', 'fd'=>'mixed', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_futime' => ['resource', 'fd'=>'mixed', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_get_event_stream' => ['mixed'], + 'eio_get_last_error' => ['string', 'req'=>'resource'], + 'eio_grp' => ['resource', 'callback'=>'callable', 'data='=>'string'], + 'eio_grp_add' => ['void', 'grp'=>'resource', 'req'=>'resource'], + 'eio_grp_cancel' => ['void', 'grp'=>'resource'], + 'eio_grp_limit' => ['void', 'grp'=>'resource', 'limit'=>'int'], + 'eio_init' => ['void'], + 'eio_link' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_lstat' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], + 'eio_mkdir' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_mknod' => ['resource', 'path'=>'string', 'mode'=>'int', 'dev'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_nop' => ['resource', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_npending' => ['int'], + 'eio_nready' => ['int'], + 'eio_nreqs' => ['int'], + 'eio_nthreads' => ['int'], + 'eio_open' => ['resource', 'path'=>'string', 'flags'=>'int', 'mode'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], + 'eio_poll' => ['int'], + 'eio_read' => ['resource', 'fd'=>'mixed', 'length'=>'int', 'offset'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], + 'eio_readahead' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_readdir' => ['resource', 'path'=>'string', 'flags'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], + 'eio_readlink' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], + 'eio_realpath' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], + 'eio_rename' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_rmdir' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_seek' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'whence'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_sendfile' => ['resource', 'out_fd'=>'mixed', 'in_fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'string'], + 'eio_set_max_idle' => ['void', 'nthreads'=>'int'], + 'eio_set_max_parallel' => ['void', 'nthreads'=>'int'], + 'eio_set_max_poll_reqs' => ['void', 'nreqs'=>'int'], + 'eio_set_max_poll_time' => ['void', 'nseconds'=>'float'], + 'eio_set_min_parallel' => ['void', 'nthreads'=>'string'], + 'eio_stat' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], + 'eio_statvfs' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], + 'eio_symlink' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_sync' => ['resource', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_sync_file_range' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'nbytes'=>'int', 'flags'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_syncfs' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_truncate' => ['resource', 'path'=>'string', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_unlink' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_utime' => ['resource', 'path'=>'string', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'eio_write' => ['resource', 'fd'=>'mixed', 'string'=>'string', 'length='=>'int', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], + 'empty' => ['bool', 'value'=>'mixed'], + 'enchant_broker_describe' => ['array', 'broker'=>'resource'], + 'enchant_broker_dict_exists' => ['bool', 'broker'=>'resource', 'tag'=>'string'], + 'enchant_broker_free' => ['bool', 'broker'=>'resource'], + 'enchant_broker_free_dict' => ['bool', 'dictionary'=>'resource'], + 'enchant_broker_get_dict_path' => ['string', 'broker'=>'resource', 'type'=>'int'], + 'enchant_broker_get_error' => ['string|false', 'broker'=>'resource'], + 'enchant_broker_init' => ['resource|false'], + 'enchant_broker_list_dicts' => ['array|false', 'broker'=>'resource'], + 'enchant_broker_request_dict' => ['resource|false', 'broker'=>'resource', 'tag'=>'string'], + 'enchant_broker_request_pwl_dict' => ['resource|false', 'broker'=>'resource', 'filename'=>'string'], + 'enchant_broker_set_dict_path' => ['bool', 'broker'=>'resource', 'type'=>'int', 'path'=>'string'], + 'enchant_broker_set_ordering' => ['bool', 'broker'=>'resource', 'tag'=>'string', 'ordering'=>'string'], + 'enchant_dict_add_to_personal' => ['void', 'dictionary'=>'resource', 'word'=>'string'], + 'enchant_dict_add_to_session' => ['void', 'dictionary'=>'resource', 'word'=>'string'], + 'enchant_dict_check' => ['bool', 'dictionary'=>'resource', 'word'=>'string'], + 'enchant_dict_describe' => ['array', 'dictionary'=>'resource'], + 'enchant_dict_get_error' => ['string', 'dictionary'=>'resource'], + 'enchant_dict_is_in_session' => ['bool', 'dictionary'=>'resource', 'word'=>'string'], + 'enchant_dict_quick_check' => ['bool', 'dictionary'=>'resource', 'word'=>'string', '&w_suggestions='=>'array'], + 'enchant_dict_store_replacement' => ['void', 'dictionary'=>'resource', 'misspelled'=>'string', 'correct'=>'string'], + 'enchant_dict_suggest' => ['array', 'dictionary'=>'resource', 'word'=>'string'], + 'end' => ['mixed|false', '&r_array'=>'array|object'], + 'error_clear_last' => ['void'], + 'error_get_last' => ['?array{type:int,message:string,file:string,line:int}'], + 'error_log' => ['bool', 'message'=>'string', 'message_type='=>'int', 'destination='=>'string', 'additional_headers='=>'string'], + 'error_reporting' => ['int', 'error_level='=>'int'], + 'escapeshellarg' => ['string', 'arg'=>'string'], + 'escapeshellcmd' => ['string', 'command'=>'string'], + 'eval' => ['mixed', 'code_str'=>'string'], + 'event_add' => ['bool', 'event'=>'resource', 'timeout='=>'int'], + 'event_base_free' => ['void', 'event_base'=>'resource'], + 'event_base_loop' => ['int', 'event_base'=>'resource', 'flags='=>'int'], + 'event_base_loopbreak' => ['bool', 'event_base'=>'resource'], + 'event_base_loopexit' => ['bool', 'event_base'=>'resource', 'timeout='=>'int'], + 'event_base_new' => ['resource|false'], + 'event_base_priority_init' => ['bool', 'event_base'=>'resource', 'npriorities'=>'int'], + 'event_base_reinit' => ['bool', 'event_base'=>'resource'], + 'event_base_set' => ['bool', 'event'=>'resource', 'event_base'=>'resource'], + 'event_buffer_base_set' => ['bool', 'bevent'=>'resource', 'event_base'=>'resource'], + 'event_buffer_disable' => ['bool', 'bevent'=>'resource', 'events'=>'int'], + 'event_buffer_enable' => ['bool', 'bevent'=>'resource', 'events'=>'int'], + 'event_buffer_fd_set' => ['void', 'bevent'=>'resource', 'fd'=>'resource'], + 'event_buffer_free' => ['void', 'bevent'=>'resource'], + 'event_buffer_new' => ['resource|false', 'stream'=>'resource', 'readcb'=>'callable|null', 'writecb'=>'callable|null', 'errorcb'=>'callable', 'arg='=>'mixed'], + 'event_buffer_priority_set' => ['bool', 'bevent'=>'resource', 'priority'=>'int'], + 'event_buffer_read' => ['string', 'bevent'=>'resource', 'data_size'=>'int'], + 'event_buffer_set_callback' => ['bool', 'event'=>'resource', 'readcb'=>'mixed', 'writecb'=>'mixed', 'errorcb'=>'mixed', 'arg='=>'mixed'], + 'event_buffer_timeout_set' => ['void', 'bevent'=>'resource', 'read_timeout'=>'int', 'write_timeout'=>'int'], + 'event_buffer_watermark_set' => ['void', 'bevent'=>'resource', 'events'=>'int', 'lowmark'=>'int', 'highmark'=>'int'], + 'event_buffer_write' => ['bool', 'bevent'=>'resource', 'data'=>'string', 'data_size='=>'int'], + 'event_del' => ['bool', 'event'=>'resource'], + 'event_free' => ['void', 'event'=>'resource'], + 'event_new' => ['resource|false'], + 'event_priority_set' => ['bool', 'event'=>'resource', 'priority'=>'int'], + 'event_set' => ['bool', 'event'=>'resource', 'fd'=>'int|resource', 'events'=>'int', 'callback'=>'callable', 'arg='=>'mixed'], + 'event_timer_add' => ['bool', 'event'=>'resource', 'timeout='=>'int'], + 'event_timer_del' => ['bool', 'event'=>'resource'], + 'event_timer_new' => ['resource|false'], + 'event_timer_pending' => ['bool', 'event'=>'resource', 'timeout='=>'int'], + 'event_timer_set' => ['bool', 'event'=>'resource', 'callback'=>'callable', 'arg='=>'mixed'], + 'exec' => ['string|false', 'command'=>'string', '&w_output='=>'array', '&w_result_code='=>'int'], + 'exif_imagetype' => ['int|false', 'filename'=>'string'], + 'exif_read_data' => ['array|false', 'file'=>'string|resource', 'required_sections='=>'string', 'as_arrays='=>'bool', 'read_thumbnail='=>'bool'], + 'exif_tagname' => ['string|false', 'index'=>'int'], + 'exif_thumbnail' => ['string|false', 'file'=>'string', '&w_width='=>'int', '&w_height='=>'int', '&w_image_type='=>'int'], + 'exit' => ['', 'status'=>'string|int'], + 'exp' => ['float', 'num'=>'float'], + 'expect_expectl' => ['int', 'expect'=>'resource', 'cases'=>'array', 'match='=>'array'], + 'expect_popen' => ['resource|false', 'command'=>'string'], + 'explode' => ['list|false', 'separator'=>'string', 'string'=>'string', 'limit='=>'int'], + 'expm1' => ['float', 'num'=>'float'], + 'extension_loaded' => ['bool', 'extension'=>'string'], + 'extract' => ['int', '&rw_array'=>'array', 'flags='=>'int', 'prefix='=>'string'], + 'ezmlm_hash' => ['int', 'addr'=>'string'], + 'fam_cancel_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], + 'fam_close' => ['void', 'fam'=>'resource'], + 'fam_monitor_collection' => ['resource', 'fam'=>'resource', 'dirname'=>'string', 'depth'=>'int', 'mask'=>'string'], + 'fam_monitor_directory' => ['resource', 'fam'=>'resource', 'dirname'=>'string'], + 'fam_monitor_file' => ['resource', 'fam'=>'resource', 'filename'=>'string'], + 'fam_next_event' => ['array', 'fam'=>'resource'], + 'fam_open' => ['resource|false', 'appname='=>'string'], + 'fam_pending' => ['int', 'fam'=>'resource'], + 'fam_resume_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], + 'fam_suspend_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], + 'fann_cascadetrain_on_data' => ['bool', 'ann'=>'resource', 'data'=>'resource', 'max_neurons'=>'int', 'neurons_between_reports'=>'int', 'desired_error'=>'float'], + 'fann_cascadetrain_on_file' => ['bool', 'ann'=>'resource', 'filename'=>'string', 'max_neurons'=>'int', 'neurons_between_reports'=>'int', 'desired_error'=>'float'], + 'fann_clear_scaling_params' => ['bool', 'ann'=>'resource'], + 'fann_copy' => ['resource|false', 'ann'=>'resource'], + 'fann_create_from_file' => ['resource', 'configuration_file'=>'string'], + 'fann_create_shortcut' => ['resource|false', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], + 'fann_create_shortcut_array' => ['resource|false', 'num_layers'=>'int', 'layers'=>'array'], + 'fann_create_sparse' => ['resource|false', 'connection_rate'=>'float', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], + 'fann_create_sparse_array' => ['resource|false', 'connection_rate'=>'float', 'num_layers'=>'int', 'layers'=>'array'], + 'fann_create_standard' => ['resource|false', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], + 'fann_create_standard_array' => ['resource|false', 'num_layers'=>'int', 'layers'=>'array'], + 'fann_create_train' => ['resource', 'num_data'=>'int', 'num_input'=>'int', 'num_output'=>'int'], + 'fann_create_train_from_callback' => ['resource', 'num_data'=>'int', 'num_input'=>'int', 'num_output'=>'int', 'user_function'=>'callable'], + 'fann_descale_input' => ['bool', 'ann'=>'resource', 'input_vector'=>'array'], + 'fann_descale_output' => ['bool', 'ann'=>'resource', 'output_vector'=>'array'], + 'fann_descale_train' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], + 'fann_destroy' => ['bool', 'ann'=>'resource'], + 'fann_destroy_train' => ['bool', 'train_data'=>'resource'], + 'fann_duplicate_train_data' => ['resource', 'data'=>'resource'], + 'fann_get_MSE' => ['float|false', 'ann'=>'resource'], + 'fann_get_activation_function' => ['int|false', 'ann'=>'resource', 'layer'=>'int', 'neuron'=>'int'], + 'fann_get_activation_steepness' => ['float|false', 'ann'=>'resource', 'layer'=>'int', 'neuron'=>'int'], + 'fann_get_bias_array' => ['array', 'ann'=>'resource'], + 'fann_get_bit_fail' => ['int|false', 'ann'=>'resource'], + 'fann_get_bit_fail_limit' => ['float|false', 'ann'=>'resource'], + 'fann_get_cascade_activation_functions' => ['array|false', 'ann'=>'resource'], + 'fann_get_cascade_activation_functions_count' => ['int|false', 'ann'=>'resource'], + 'fann_get_cascade_activation_steepnesses' => ['array|false', 'ann'=>'resource'], + 'fann_get_cascade_activation_steepnesses_count' => ['int|false', 'ann'=>'resource'], + 'fann_get_cascade_candidate_change_fraction' => ['float|false', 'ann'=>'resource'], + 'fann_get_cascade_candidate_limit' => ['float|false', 'ann'=>'resource'], + 'fann_get_cascade_candidate_stagnation_epochs' => ['float|false', 'ann'=>'resource'], + 'fann_get_cascade_max_cand_epochs' => ['int|false', 'ann'=>'resource'], + 'fann_get_cascade_max_out_epochs' => ['int|false', 'ann'=>'resource'], + 'fann_get_cascade_min_cand_epochs' => ['int|false', 'ann'=>'resource'], + 'fann_get_cascade_min_out_epochs' => ['int|false', 'ann'=>'resource'], + 'fann_get_cascade_num_candidate_groups' => ['int|false', 'ann'=>'resource'], + 'fann_get_cascade_num_candidates' => ['int|false', 'ann'=>'resource'], + 'fann_get_cascade_output_change_fraction' => ['float|false', 'ann'=>'resource'], + 'fann_get_cascade_output_stagnation_epochs' => ['int|false', 'ann'=>'resource'], + 'fann_get_cascade_weight_multiplier' => ['float|false', 'ann'=>'resource'], + 'fann_get_connection_array' => ['array', 'ann'=>'resource'], + 'fann_get_connection_rate' => ['float|false', 'ann'=>'resource'], + 'fann_get_errno' => ['int|false', 'errdat'=>'resource'], + 'fann_get_errstr' => ['string|false', 'errdat'=>'resource'], + 'fann_get_layer_array' => ['array', 'ann'=>'resource'], + 'fann_get_learning_momentum' => ['float|false', 'ann'=>'resource'], + 'fann_get_learning_rate' => ['float|false', 'ann'=>'resource'], + 'fann_get_network_type' => ['int|false', 'ann'=>'resource'], + 'fann_get_num_input' => ['int|false', 'ann'=>'resource'], + 'fann_get_num_layers' => ['int|false', 'ann'=>'resource'], + 'fann_get_num_output' => ['int|false', 'ann'=>'resource'], + 'fann_get_quickprop_decay' => ['float|false', 'ann'=>'resource'], + 'fann_get_quickprop_mu' => ['float|false', 'ann'=>'resource'], + 'fann_get_rprop_decrease_factor' => ['float|false', 'ann'=>'resource'], + 'fann_get_rprop_delta_max' => ['float|false', 'ann'=>'resource'], + 'fann_get_rprop_delta_min' => ['float|false', 'ann'=>'resource'], + 'fann_get_rprop_delta_zero' => ['float|false', 'ann'=>'resource'], + 'fann_get_rprop_increase_factor' => ['float|false', 'ann'=>'resource'], + 'fann_get_sarprop_step_error_shift' => ['float|false', 'ann'=>'resource'], + 'fann_get_sarprop_step_error_threshold_factor' => ['float|false', 'ann'=>'resource'], + 'fann_get_sarprop_temperature' => ['float|false', 'ann'=>'resource'], + 'fann_get_sarprop_weight_decay_shift' => ['float|false', 'ann'=>'resource'], + 'fann_get_total_connections' => ['int|false', 'ann'=>'resource'], + 'fann_get_total_neurons' => ['int|false', 'ann'=>'resource'], + 'fann_get_train_error_function' => ['int|false', 'ann'=>'resource'], + 'fann_get_train_stop_function' => ['int|false', 'ann'=>'resource'], + 'fann_get_training_algorithm' => ['int|false', 'ann'=>'resource'], + 'fann_init_weights' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], + 'fann_length_train_data' => ['int|false', 'data'=>'resource'], + 'fann_merge_train_data' => ['resource|false', 'data1'=>'resource', 'data2'=>'resource'], + 'fann_num_input_train_data' => ['int|false', 'data'=>'resource'], + 'fann_num_output_train_data' => ['int|false', 'data'=>'resource'], + 'fann_print_error' => ['void', 'errdat'=>'string'], + 'fann_randomize_weights' => ['bool', 'ann'=>'resource', 'min_weight'=>'float', 'max_weight'=>'float'], + 'fann_read_train_from_file' => ['resource', 'filename'=>'string'], + 'fann_reset_MSE' => ['bool', 'ann'=>'string'], + 'fann_reset_errno' => ['void', 'errdat'=>'resource'], + 'fann_reset_errstr' => ['void', 'errdat'=>'resource'], + 'fann_run' => ['array|false', 'ann'=>'resource', 'input'=>'array'], + 'fann_save' => ['bool', 'ann'=>'resource', 'configuration_file'=>'string'], + 'fann_save_train' => ['bool', 'data'=>'resource', 'file_name'=>'string'], + 'fann_scale_input' => ['bool', 'ann'=>'resource', 'input_vector'=>'array'], + 'fann_scale_input_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], + 'fann_scale_output' => ['bool', 'ann'=>'resource', 'output_vector'=>'array'], + 'fann_scale_output_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], + 'fann_scale_train' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], + 'fann_scale_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], + 'fann_set_activation_function' => ['bool', 'ann'=>'resource', 'activation_function'=>'int', 'layer'=>'int', 'neuron'=>'int'], + 'fann_set_activation_function_hidden' => ['bool', 'ann'=>'resource', 'activation_function'=>'int'], + 'fann_set_activation_function_layer' => ['bool', 'ann'=>'resource', 'activation_function'=>'int', 'layer'=>'int'], + 'fann_set_activation_function_output' => ['bool', 'ann'=>'resource', 'activation_function'=>'int'], + 'fann_set_activation_steepness' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float', 'layer'=>'int', 'neuron'=>'int'], + 'fann_set_activation_steepness_hidden' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float'], + 'fann_set_activation_steepness_layer' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float', 'layer'=>'int'], + 'fann_set_activation_steepness_output' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float'], + 'fann_set_bit_fail_limit' => ['bool', 'ann'=>'resource', 'bit_fail_limit'=>'float'], + 'fann_set_callback' => ['bool', 'ann'=>'resource', 'callback'=>'callable'], + 'fann_set_cascade_activation_functions' => ['bool', 'ann'=>'resource', 'cascade_activation_functions'=>'array'], + 'fann_set_cascade_activation_steepnesses' => ['bool', 'ann'=>'resource', 'cascade_activation_steepnesses_count'=>'array'], + 'fann_set_cascade_candidate_change_fraction' => ['bool', 'ann'=>'resource', 'cascade_candidate_change_fraction'=>'float'], + 'fann_set_cascade_candidate_limit' => ['bool', 'ann'=>'resource', 'cascade_candidate_limit'=>'float'], + 'fann_set_cascade_candidate_stagnation_epochs' => ['bool', 'ann'=>'resource', 'cascade_candidate_stagnation_epochs'=>'int'], + 'fann_set_cascade_max_cand_epochs' => ['bool', 'ann'=>'resource', 'cascade_max_cand_epochs'=>'int'], + 'fann_set_cascade_max_out_epochs' => ['bool', 'ann'=>'resource', 'cascade_max_out_epochs'=>'int'], + 'fann_set_cascade_min_cand_epochs' => ['bool', 'ann'=>'resource', 'cascade_min_cand_epochs'=>'int'], + 'fann_set_cascade_min_out_epochs' => ['bool', 'ann'=>'resource', 'cascade_min_out_epochs'=>'int'], + 'fann_set_cascade_num_candidate_groups' => ['bool', 'ann'=>'resource', 'cascade_num_candidate_groups'=>'int'], + 'fann_set_cascade_output_change_fraction' => ['bool', 'ann'=>'resource', 'cascade_output_change_fraction'=>'float'], + 'fann_set_cascade_output_stagnation_epochs' => ['bool', 'ann'=>'resource', 'cascade_output_stagnation_epochs'=>'int'], + 'fann_set_cascade_weight_multiplier' => ['bool', 'ann'=>'resource', 'cascade_weight_multiplier'=>'float'], + 'fann_set_error_log' => ['void', 'errdat'=>'resource', 'log_file'=>'string'], + 'fann_set_input_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_input_min'=>'float', 'new_input_max'=>'float'], + 'fann_set_learning_momentum' => ['bool', 'ann'=>'resource', 'learning_momentum'=>'float'], + 'fann_set_learning_rate' => ['bool', 'ann'=>'resource', 'learning_rate'=>'float'], + 'fann_set_output_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_output_min'=>'float', 'new_output_max'=>'float'], + 'fann_set_quickprop_decay' => ['bool', 'ann'=>'resource', 'quickprop_decay'=>'float'], + 'fann_set_quickprop_mu' => ['bool', 'ann'=>'resource', 'quickprop_mu'=>'float'], + 'fann_set_rprop_decrease_factor' => ['bool', 'ann'=>'resource', 'rprop_decrease_factor'=>'float'], + 'fann_set_rprop_delta_max' => ['bool', 'ann'=>'resource', 'rprop_delta_max'=>'float'], + 'fann_set_rprop_delta_min' => ['bool', 'ann'=>'resource', 'rprop_delta_min'=>'float'], + 'fann_set_rprop_delta_zero' => ['bool', 'ann'=>'resource', 'rprop_delta_zero'=>'float'], + 'fann_set_rprop_increase_factor' => ['bool', 'ann'=>'resource', 'rprop_increase_factor'=>'float'], + 'fann_set_sarprop_step_error_shift' => ['bool', 'ann'=>'resource', 'sarprop_step_error_shift'=>'float'], + 'fann_set_sarprop_step_error_threshold_factor' => ['bool', 'ann'=>'resource', 'sarprop_step_error_threshold_factor'=>'float'], + 'fann_set_sarprop_temperature' => ['bool', 'ann'=>'resource', 'sarprop_temperature'=>'float'], + 'fann_set_sarprop_weight_decay_shift' => ['bool', 'ann'=>'resource', 'sarprop_weight_decay_shift'=>'float'], + 'fann_set_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_input_min'=>'float', 'new_input_max'=>'float', 'new_output_min'=>'float', 'new_output_max'=>'float'], + 'fann_set_train_error_function' => ['bool', 'ann'=>'resource', 'error_function'=>'int'], + 'fann_set_train_stop_function' => ['bool', 'ann'=>'resource', 'stop_function'=>'int'], + 'fann_set_training_algorithm' => ['bool', 'ann'=>'resource', 'training_algorithm'=>'int'], + 'fann_set_weight' => ['bool', 'ann'=>'resource', 'from_neuron'=>'int', 'to_neuron'=>'int', 'weight'=>'float'], + 'fann_set_weight_array' => ['bool', 'ann'=>'resource', 'connections'=>'array'], + 'fann_shuffle_train_data' => ['bool', 'train_data'=>'resource'], + 'fann_subset_train_data' => ['resource', 'data'=>'resource', 'pos'=>'int', 'length'=>'int'], + 'fann_test' => ['bool', 'ann'=>'resource', 'input'=>'array', 'desired_output'=>'array'], + 'fann_test_data' => ['float|false', 'ann'=>'resource', 'data'=>'resource'], + 'fann_train' => ['bool', 'ann'=>'resource', 'input'=>'array', 'desired_output'=>'array'], + 'fann_train_epoch' => ['float|false', 'ann'=>'resource', 'data'=>'resource'], + 'fann_train_on_data' => ['bool', 'ann'=>'resource', 'data'=>'resource', 'max_epochs'=>'int', 'epochs_between_reports'=>'int', 'desired_error'=>'float'], + 'fann_train_on_file' => ['bool', 'ann'=>'resource', 'filename'=>'string', 'max_epochs'=>'int', 'epochs_between_reports'=>'int', 'desired_error'=>'float'], + 'fastcgi_finish_request' => ['bool'], + 'fbsql_affected_rows' => ['int', 'link_identifier='=>'?resource'], + 'fbsql_autocommit' => ['bool', 'link_identifier'=>'resource', 'onoff='=>'bool'], + 'fbsql_blob_size' => ['int', 'blob_handle'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_change_user' => ['bool', 'user'=>'string', 'password'=>'string', 'database='=>'string', 'link_identifier='=>'?resource'], + 'fbsql_clob_size' => ['int', 'clob_handle'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_close' => ['bool', 'link_identifier='=>'?resource'], + 'fbsql_commit' => ['bool', 'link_identifier='=>'?resource'], + 'fbsql_connect' => ['resource', 'hostname='=>'string', 'username='=>'string', 'password='=>'string'], + 'fbsql_create_blob' => ['string', 'blob_data'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_create_clob' => ['string', 'clob_data'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_create_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource', 'database_options='=>'string'], + 'fbsql_data_seek' => ['bool', 'result'=>'resource', 'row_number'=>'int'], + 'fbsql_database' => ['string', 'link_identifier'=>'resource', 'database='=>'string'], + 'fbsql_database_password' => ['string', 'link_identifier'=>'resource', 'database_password='=>'string'], + 'fbsql_db_query' => ['resource', 'database'=>'string', 'query'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_db_status' => ['int', 'database_name'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_drop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_errno' => ['int', 'link_identifier='=>'?resource'], + 'fbsql_error' => ['string', 'link_identifier='=>'?resource'], + 'fbsql_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], + 'fbsql_fetch_assoc' => ['array', 'result'=>'resource'], + 'fbsql_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], + 'fbsql_fetch_lengths' => ['array', 'result'=>'resource'], + 'fbsql_fetch_object' => ['object', 'result'=>'resource'], + 'fbsql_fetch_row' => ['array', 'result'=>'resource'], + 'fbsql_field_flags' => ['string', 'result'=>'resource', 'field_offset='=>'int'], + 'fbsql_field_len' => ['int', 'result'=>'resource', 'field_offset='=>'int'], + 'fbsql_field_name' => ['string', 'result'=>'resource', 'field_index='=>'int'], + 'fbsql_field_seek' => ['bool', 'result'=>'resource', 'field_offset='=>'int'], + 'fbsql_field_table' => ['string', 'result'=>'resource', 'field_offset='=>'int'], + 'fbsql_field_type' => ['string', 'result'=>'resource', 'field_offset='=>'int'], + 'fbsql_free_result' => ['bool', 'result'=>'resource'], + 'fbsql_get_autostart_info' => ['array', 'link_identifier='=>'?resource'], + 'fbsql_hostname' => ['string', 'link_identifier'=>'resource', 'host_name='=>'string'], + 'fbsql_insert_id' => ['int', 'link_identifier='=>'?resource'], + 'fbsql_list_dbs' => ['resource', 'link_identifier='=>'?resource'], + 'fbsql_list_fields' => ['resource', 'database_name'=>'string', 'table_name'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_list_tables' => ['resource', 'database'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_next_result' => ['bool', 'result'=>'resource'], + 'fbsql_num_fields' => ['int', 'result'=>'resource'], + 'fbsql_num_rows' => ['int', 'result'=>'resource'], + 'fbsql_password' => ['string', 'link_identifier'=>'resource', 'password='=>'string'], + 'fbsql_pconnect' => ['resource', 'hostname='=>'string', 'username='=>'string', 'password='=>'string'], + 'fbsql_query' => ['resource', 'query'=>'string', 'link_identifier='=>'?resource', 'batch_size='=>'int'], + 'fbsql_read_blob' => ['string', 'blob_handle'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_read_clob' => ['string', 'clob_handle'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_result' => ['mixed', 'result'=>'resource', 'row='=>'int', 'field='=>'mixed'], + 'fbsql_rollback' => ['bool', 'link_identifier='=>'?resource'], + 'fbsql_rows_fetched' => ['int', 'result'=>'resource'], + 'fbsql_select_db' => ['bool', 'database_name='=>'string', 'link_identifier='=>'?resource'], + 'fbsql_set_characterset' => ['void', 'link_identifier'=>'resource', 'characterset'=>'int', 'in_out_both='=>'int'], + 'fbsql_set_lob_mode' => ['bool', 'result'=>'resource', 'lob_mode'=>'int'], + 'fbsql_set_password' => ['bool', 'link_identifier'=>'resource', 'user'=>'string', 'password'=>'string', 'old_password'=>'string'], + 'fbsql_set_transaction' => ['void', 'link_identifier'=>'resource', 'locking'=>'int', 'isolation'=>'int'], + 'fbsql_start_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource', 'database_options='=>'string'], + 'fbsql_stop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], + 'fbsql_table_name' => ['string', 'result'=>'resource', 'index'=>'int'], + 'fbsql_username' => ['string', 'link_identifier'=>'resource', 'username='=>'string'], + 'fbsql_warnings' => ['bool', 'onoff='=>'bool'], + 'fclose' => ['bool', 'stream'=>'resource'], + 'fdf_add_doc_javascript' => ['bool', 'fdf_document'=>'resource', 'script_name'=>'string', 'script_code'=>'string'], + 'fdf_add_template' => ['bool', 'fdf_document'=>'resource', 'newpage'=>'int', 'filename'=>'string', 'template'=>'string', 'rename'=>'int'], + 'fdf_close' => ['void', 'fdf_document'=>'resource'], + 'fdf_create' => ['resource'], + 'fdf_enum_values' => ['bool', 'fdf_document'=>'resource', 'function'=>'callable', 'userdata='=>'mixed'], + 'fdf_errno' => ['int'], + 'fdf_error' => ['string', 'error_code='=>'int'], + 'fdf_get_ap' => ['bool', 'fdf_document'=>'resource', 'field'=>'string', 'face'=>'int', 'filename'=>'string'], + 'fdf_get_attachment' => ['array', 'fdf_document'=>'resource', 'fieldname'=>'string', 'savepath'=>'string'], + 'fdf_get_encoding' => ['string', 'fdf_document'=>'resource'], + 'fdf_get_file' => ['string', 'fdf_document'=>'resource'], + 'fdf_get_flags' => ['int', 'fdf_document'=>'resource', 'fieldname'=>'string', 'whichflags'=>'int'], + 'fdf_get_opt' => ['mixed', 'fdf_document'=>'resource', 'fieldname'=>'string', 'element='=>'int'], + 'fdf_get_status' => ['string', 'fdf_document'=>'resource'], + 'fdf_get_value' => ['mixed', 'fdf_document'=>'resource', 'fieldname'=>'string', 'which='=>'int'], + 'fdf_get_version' => ['string', 'fdf_document='=>'resource'], + 'fdf_header' => ['void'], + 'fdf_next_field_name' => ['string', 'fdf_document'=>'resource', 'fieldname='=>'string'], + 'fdf_open' => ['resource|false', 'filename'=>'string'], + 'fdf_open_string' => ['resource', 'fdf_data'=>'string'], + 'fdf_remove_item' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'item'=>'int'], + 'fdf_save' => ['bool', 'fdf_document'=>'resource', 'filename='=>'string'], + 'fdf_save_string' => ['string', 'fdf_document'=>'resource'], + 'fdf_set_ap' => ['bool', 'fdf_document'=>'resource', 'field_name'=>'string', 'face'=>'int', 'filename'=>'string', 'page_number'=>'int'], + 'fdf_set_encoding' => ['bool', 'fdf_document'=>'resource', 'encoding'=>'string'], + 'fdf_set_file' => ['bool', 'fdf_document'=>'resource', 'url'=>'string', 'target_frame='=>'string'], + 'fdf_set_flags' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'whichflags'=>'int', 'newflags'=>'int'], + 'fdf_set_javascript_action' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'trigger'=>'int', 'script'=>'string'], + 'fdf_set_on_import_javascript' => ['bool', 'fdf_document'=>'resource', 'script'=>'string', 'before_data_import'=>'bool'], + 'fdf_set_opt' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'element'=>'int', 'string1'=>'string', 'string2'=>'string'], + 'fdf_set_status' => ['bool', 'fdf_document'=>'resource', 'status'=>'string'], + 'fdf_set_submit_form_action' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'trigger'=>'int', 'script'=>'string', 'flags'=>'int'], + 'fdf_set_target_frame' => ['bool', 'fdf_document'=>'resource', 'frame_name'=>'string'], + 'fdf_set_value' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'value'=>'mixed', 'isname='=>'int'], + 'fdf_set_version' => ['bool', 'fdf_document'=>'resource', 'version'=>'string'], + 'feof' => ['bool', 'stream'=>'resource'], + 'fflush' => ['bool', 'stream'=>'resource'], + 'ffmpeg_animated_gif::__construct' => ['void', 'output_file_path'=>'string', 'width'=>'int', 'height'=>'int', 'frame_rate'=>'int', 'loop_count='=>'int'], + 'ffmpeg_animated_gif::addFrame' => ['', 'frame_to_add'=>'ffmpeg_frame'], + 'ffmpeg_frame::__construct' => ['void', 'gd_image'=>'resource'], + 'ffmpeg_frame::crop' => ['', 'crop_top'=>'int', 'crop_bottom='=>'int', 'crop_left='=>'int', 'crop_right='=>'int'], + 'ffmpeg_frame::getHeight' => ['int'], + 'ffmpeg_frame::getPTS' => ['int'], + 'ffmpeg_frame::getPresentationTimestamp' => ['int'], + 'ffmpeg_frame::getWidth' => ['int'], + 'ffmpeg_frame::resize' => ['', 'width'=>'int', 'height'=>'int', 'crop_top='=>'int', 'crop_bottom='=>'int', 'crop_left='=>'int', 'crop_right='=>'int'], + 'ffmpeg_frame::toGDImage' => ['resource'], + 'ffmpeg_movie::__construct' => ['void', 'path_to_media'=>'string', 'persistent'=>'bool'], + 'ffmpeg_movie::getArtist' => ['string'], + 'ffmpeg_movie::getAudioBitRate' => ['int'], + 'ffmpeg_movie::getAudioChannels' => ['int'], + 'ffmpeg_movie::getAudioCodec' => ['string'], + 'ffmpeg_movie::getAudioSampleRate' => ['int'], + 'ffmpeg_movie::getAuthor' => ['string'], + 'ffmpeg_movie::getBitRate' => ['int'], + 'ffmpeg_movie::getComment' => ['string'], + 'ffmpeg_movie::getCopyright' => ['string'], + 'ffmpeg_movie::getDuration' => ['int'], + 'ffmpeg_movie::getFilename' => ['string'], + 'ffmpeg_movie::getFrame' => ['ffmpeg_frame|false', 'framenumber'=>'int'], + 'ffmpeg_movie::getFrameCount' => ['int'], + 'ffmpeg_movie::getFrameHeight' => ['int'], + 'ffmpeg_movie::getFrameNumber' => ['int'], + 'ffmpeg_movie::getFrameRate' => ['int'], + 'ffmpeg_movie::getFrameWidth' => ['int'], + 'ffmpeg_movie::getGenre' => ['string'], + 'ffmpeg_movie::getNextKeyFrame' => ['ffmpeg_frame|false'], + 'ffmpeg_movie::getPixelFormat' => [''], + 'ffmpeg_movie::getTitle' => ['string'], + 'ffmpeg_movie::getTrackNumber' => ['int|string'], + 'ffmpeg_movie::getVideoBitRate' => ['int'], + 'ffmpeg_movie::getVideoCodec' => ['string'], + 'ffmpeg_movie::getYear' => ['int|string'], + 'ffmpeg_movie::hasAudio' => ['bool'], + 'ffmpeg_movie::hasVideo' => ['bool'], + 'fgetc' => ['string|false', 'stream'=>'resource'], + 'fgetcsv' => ['list|array{0: null}|false|null', 'stream'=>'resource', 'length='=>'int', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], + 'fgets' => ['string|false', 'stream'=>'resource', 'length='=>'int'], + 'fgetss' => ['string|false', 'fp'=>'resource', 'length='=>'int', 'allowable_tags='=>'string'], + 'file' => ['list|false', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], + 'file_exists' => ['bool', 'filename'=>'string'], + 'file_get_contents' => ['string|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'?resource', 'offset='=>'int', 'length='=>'int'], + 'file_put_contents' => ['int|false', 'filename'=>'string', 'data'=>'string|resource|array', 'flags='=>'int', 'context='=>'resource'], + 'fileatime' => ['int|false', 'filename'=>'string'], + 'filectime' => ['int|false', 'filename'=>'string'], + 'filegroup' => ['int|false', 'filename'=>'string'], + 'fileinode' => ['int|false', 'filename'=>'string'], + 'filemtime' => ['int|false', 'filename'=>'string'], + 'fileowner' => ['int|false', 'filename'=>'string'], + 'fileperms' => ['int|false', 'filename'=>'string'], + 'filepro' => ['bool', 'directory'=>'string'], + 'filepro_fieldcount' => ['int'], + 'filepro_fieldname' => ['string', 'field_number'=>'int'], + 'filepro_fieldtype' => ['string', 'field_number'=>'int'], + 'filepro_fieldwidth' => ['int', 'field_number'=>'int'], + 'filepro_retrieve' => ['string', 'row_number'=>'int', 'field_number'=>'int'], + 'filepro_rowcount' => ['int'], + 'filesize' => ['int|false', 'filename'=>'string'], + 'filetype' => ['string|false', 'filename'=>'string'], + 'filter_has_var' => ['bool', 'input_type'=>'int', 'var_name'=>'string'], + 'filter_id' => ['int|false', 'name'=>'string'], + 'filter_input' => ['mixed|false', 'type'=>'int', 'var_name'=>'string', 'filter='=>'int', 'options='=>'array|int'], + 'filter_input_array' => ['mixed|false', 'type'=>'int', 'options='=>'int|array', 'add_empty='=>'bool'], + 'filter_list' => ['array'], + 'filter_var' => ['mixed|false', 'value'=>'mixed', 'filter='=>'int', 'options='=>'array|int'], + 'filter_var_array' => ['array|false|null', 'array'=>'array', 'options='=>'array|int', 'add_empty='=>'bool'], + 'finfo::__construct' => ['void', 'options='=>'int', 'magic_file='=>'string'], + 'finfo::buffer' => ['string|false', 'string'=>'string', 'options='=>'int', 'context='=>'resource'], + 'finfo::file' => ['string|false', 'file_name'=>'string', 'options='=>'int', 'context='=>'resource'], + 'finfo::finfo' => ['void', 'options='=>'int', 'magic_file='=>'string'], + 'finfo::set_flags' => ['bool', 'options'=>'int'], + 'finfo_buffer' => ['string|false', 'finfo'=>'resource', 'string'=>'string', 'flags='=>'int', 'context='=>'resource'], + 'finfo_close' => ['bool', 'finfo'=>'resource'], + 'finfo_file' => ['string|false', 'finfo'=>'resource', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], + 'finfo_open' => ['resource|false', 'flags='=>'int', 'magic_database='=>'string'], + 'finfo_set_flags' => ['bool', 'finfo'=>'resource', 'flags'=>'int'], + 'floatval' => ['float', 'value'=>'mixed'], + 'flock' => ['bool', 'stream'=>'resource', 'operation'=>'int', '&w_would_block='=>'int'], + 'floor' => ['float', 'num'=>'float'], + 'flush' => ['void'], + 'fmod' => ['float', 'num1'=>'float', 'num2'=>'float'], + 'fnmatch' => ['bool', 'pattern'=>'string', 'filename'=>'string', 'flags='=>'int'], + 'fopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'bool', 'context='=>'resource|null'], + 'forward_static_call' => ['mixed|false', 'callback'=>'callable', '...args='=>'mixed'], + 'forward_static_call_array' => ['mixed|false', 'callback'=>'callable', 'args'=>'list'], + 'fpassthru' => ['int|false', 'stream'=>'resource'], + 'fprintf' => ['int', 'stream'=>'resource', 'format'=>'string', '...values='=>'string|int|float'], + 'fputcsv' => ['int|false', 'stream'=>'resource', 'fields'=>'array', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], + 'fputs' => ['int|false', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], + 'fread' => ['string|false', 'stream'=>'resource', 'length'=>'int'], + 'frenchtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], + 'fribidi_log2vis' => ['string', 'string'=>'string', 'direction'=>'string', 'charset'=>'int'], + 'fscanf' => ['list', 'stream'=>'resource', 'format'=>'string'], + 'fscanf\'1' => ['int', 'stream'=>'resource', 'format'=>'string', '&...w_vars='=>'string|int|float'], + 'fseek' => ['int', 'stream'=>'resource', 'offset'=>'int', 'whence='=>'int'], + 'fsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float'], + 'fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'stream'=>'resource'], + 'ftell' => ['int|false', 'stream'=>'resource'], + 'ftok' => ['int', 'filename'=>'string', 'project_id'=>'string'], + 'ftp_alloc' => ['bool', 'ftp'=>'resource', 'size'=>'int', '&w_response='=>'string'], + 'ftp_cdup' => ['bool', 'ftp'=>'resource'], + 'ftp_chdir' => ['bool', 'ftp'=>'resource', 'directory'=>'string'], + 'ftp_chmod' => ['int|false', 'ftp'=>'resource', 'permissions'=>'int', 'filename'=>'string'], + 'ftp_close' => ['bool', 'ftp'=>'resource'], + 'ftp_connect' => ['resource|false', 'hostname'=>'string', 'port='=>'int', 'timeout='=>'int'], + 'ftp_delete' => ['bool', 'ftp'=>'resource', 'filename'=>'string'], + 'ftp_exec' => ['bool', 'ftp'=>'resource', 'command'=>'string'], + 'ftp_fget' => ['bool', 'ftp'=>'resource', 'stream'=>'resource', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], + 'ftp_fput' => ['bool', 'ftp'=>'resource', 'remote_filename'=>'string', 'stream'=>'resource', 'mode='=>'int', 'offset='=>'int'], + 'ftp_get' => ['bool', 'ftp'=>'resource', 'local_filename'=>'string', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], + 'ftp_get_option' => ['mixed|false', 'ftp'=>'resource', 'option'=>'int'], + 'ftp_login' => ['bool', 'ftp'=>'resource', 'username'=>'string', 'password'=>'string'], + 'ftp_mdtm' => ['int', 'ftp'=>'resource', 'filename'=>'string'], + 'ftp_mkdir' => ['string|false', 'ftp'=>'resource', 'directory'=>'string'], + 'ftp_mlsd' => ['array|false', 'ftp'=>'resource', 'directory'=>'string'], + 'ftp_nb_continue' => ['int', 'ftp'=>'resource'], + 'ftp_nb_fget' => ['int', 'ftp'=>'resource', 'stream'=>'resource', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], + 'ftp_nb_fput' => ['int', 'ftp'=>'resource', 'remote_filename'=>'string', 'stream'=>'resource', 'mode='=>'int', 'offset='=>'int'], + 'ftp_nb_get' => ['int', 'ftp'=>'resource', 'local_filename'=>'string', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], + 'ftp_nb_put' => ['int', 'ftp'=>'resource', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], + 'ftp_nlist' => ['array|false', 'ftp'=>'resource', 'directory'=>'string'], + 'ftp_pasv' => ['bool', 'ftp'=>'resource', 'enable'=>'bool'], + 'ftp_put' => ['bool', 'ftp'=>'resource', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], + 'ftp_pwd' => ['string|false', 'ftp'=>'resource'], + 'ftp_quit' => ['bool', 'ftp'=>'resource'], + 'ftp_raw' => ['?array', 'ftp'=>'resource', 'command'=>'string'], + 'ftp_rawlist' => ['array|false', 'ftp'=>'resource', 'directory'=>'string', 'recursive='=>'bool'], + 'ftp_rename' => ['bool', 'ftp'=>'resource', 'from'=>'string', 'to'=>'string'], + 'ftp_rmdir' => ['bool', 'ftp'=>'resource', 'directory'=>'string'], + 'ftp_set_option' => ['bool', 'ftp'=>'resource', 'option'=>'int', 'value'=>'mixed'], + 'ftp_site' => ['bool', 'ftp'=>'resource', 'command'=>'string'], + 'ftp_size' => ['int', 'ftp'=>'resource', 'filename'=>'string'], + 'ftp_ssl_connect' => ['resource|false', 'hostname'=>'string', 'port='=>'int', 'timeout='=>'int'], + 'ftp_systype' => ['string|false', 'ftp'=>'resource'], + 'ftruncate' => ['bool', 'stream'=>'resource', 'size'=>'int'], + 'func_get_arg' => ['mixed|false', 'position'=>'int'], + 'func_get_args' => ['list'], + 'func_num_args' => ['int'], + 'function_exists' => ['bool', 'function'=>'string'], + 'fwrite' => ['int|false', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], + 'gc_collect_cycles' => ['int'], + 'gc_disable' => ['void'], + 'gc_enable' => ['void'], + 'gc_enabled' => ['bool'], + 'gc_mem_caches' => ['int'], + 'gd_info' => ['array'], + 'gearman_bugreport' => [''], + 'gearman_client_add_options' => ['', 'client_object'=>'', 'option'=>''], + 'gearman_client_add_server' => ['', 'client_object'=>'', 'host'=>'', 'port'=>''], + 'gearman_client_add_servers' => ['', 'client_object'=>'', 'servers'=>''], + 'gearman_client_add_task' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], + 'gearman_client_add_task_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], + 'gearman_client_add_task_high' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], + 'gearman_client_add_task_high_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], + 'gearman_client_add_task_low' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], + 'gearman_client_add_task_low_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], + 'gearman_client_add_task_status' => ['', 'client_object'=>'', 'job_handle'=>'', 'context'=>''], + 'gearman_client_clear_fn' => ['', 'client_object'=>''], + 'gearman_client_clone' => ['', 'client_object'=>''], + 'gearman_client_context' => ['', 'client_object'=>''], + 'gearman_client_create' => ['', 'client_object'=>''], + 'gearman_client_do' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], + 'gearman_client_do_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], + 'gearman_client_do_high' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], + 'gearman_client_do_high_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], + 'gearman_client_do_job_handle' => ['', 'client_object'=>''], + 'gearman_client_do_low' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], + 'gearman_client_do_low_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], + 'gearman_client_do_normal' => ['', 'client_object'=>'', 'function_name'=>'string', 'workload'=>'string', 'unique'=>'string'], + 'gearman_client_do_status' => ['', 'client_object'=>''], + 'gearman_client_echo' => ['', 'client_object'=>'', 'workload'=>''], + 'gearman_client_errno' => ['', 'client_object'=>''], + 'gearman_client_error' => ['', 'client_object'=>''], + 'gearman_client_job_status' => ['', 'client_object'=>'', 'job_handle'=>''], + 'gearman_client_options' => ['', 'client_object'=>''], + 'gearman_client_remove_options' => ['', 'client_object'=>'', 'option'=>''], + 'gearman_client_return_code' => ['', 'client_object'=>''], + 'gearman_client_run_tasks' => ['', 'data'=>''], + 'gearman_client_set_complete_fn' => ['', 'client_object'=>'', 'callback'=>''], + 'gearman_client_set_context' => ['', 'client_object'=>'', 'context'=>''], + 'gearman_client_set_created_fn' => ['', 'client_object'=>'', 'callback'=>''], + 'gearman_client_set_data_fn' => ['', 'client_object'=>'', 'callback'=>''], + 'gearman_client_set_exception_fn' => ['', 'client_object'=>'', 'callback'=>''], + 'gearman_client_set_fail_fn' => ['', 'client_object'=>'', 'callback'=>''], + 'gearman_client_set_options' => ['', 'client_object'=>'', 'option'=>''], + 'gearman_client_set_status_fn' => ['', 'client_object'=>'', 'callback'=>''], + 'gearman_client_set_timeout' => ['', 'client_object'=>'', 'timeout'=>''], + 'gearman_client_set_warning_fn' => ['', 'client_object'=>'', 'callback'=>''], + 'gearman_client_set_workload_fn' => ['', 'client_object'=>'', 'callback'=>''], + 'gearman_client_timeout' => ['', 'client_object'=>''], + 'gearman_client_wait' => ['', 'client_object'=>''], + 'gearman_job_function_name' => ['', 'job_object'=>''], + 'gearman_job_handle' => ['string'], + 'gearman_job_return_code' => ['', 'job_object'=>''], + 'gearman_job_send_complete' => ['', 'job_object'=>'', 'result'=>''], + 'gearman_job_send_data' => ['', 'job_object'=>'', 'data'=>''], + 'gearman_job_send_exception' => ['', 'job_object'=>'', 'exception'=>''], + 'gearman_job_send_fail' => ['', 'job_object'=>''], + 'gearman_job_send_status' => ['', 'job_object'=>'', 'numerator'=>'', 'denominator'=>''], + 'gearman_job_send_warning' => ['', 'job_object'=>'', 'warning'=>''], + 'gearman_job_status' => ['array', 'job_handle'=>'string'], + 'gearman_job_unique' => ['', 'job_object'=>''], + 'gearman_job_workload' => ['', 'job_object'=>''], + 'gearman_job_workload_size' => ['', 'job_object'=>''], + 'gearman_task_data' => ['', 'task_object'=>''], + 'gearman_task_data_size' => ['', 'task_object'=>''], + 'gearman_task_denominator' => ['', 'task_object'=>''], + 'gearman_task_function_name' => ['', 'task_object'=>''], + 'gearman_task_is_known' => ['', 'task_object'=>''], + 'gearman_task_is_running' => ['', 'task_object'=>''], + 'gearman_task_job_handle' => ['', 'task_object'=>''], + 'gearman_task_numerator' => ['', 'task_object'=>''], + 'gearman_task_recv_data' => ['', 'task_object'=>'', 'data_len'=>''], + 'gearman_task_return_code' => ['', 'task_object'=>''], + 'gearman_task_send_workload' => ['', 'task_object'=>'', 'data'=>''], + 'gearman_task_unique' => ['', 'task_object'=>''], + 'gearman_verbose_name' => ['', 'verbose'=>''], + 'gearman_version' => [''], + 'gearman_worker_add_function' => ['', 'worker_object'=>'', 'function_name'=>'', 'function'=>'', 'data'=>'', 'timeout'=>''], + 'gearman_worker_add_options' => ['', 'worker_object'=>'', 'option'=>''], + 'gearman_worker_add_server' => ['', 'worker_object'=>'', 'host'=>'', 'port'=>''], + 'gearman_worker_add_servers' => ['', 'worker_object'=>'', 'servers'=>''], + 'gearman_worker_clone' => ['', 'worker_object'=>''], + 'gearman_worker_create' => [''], + 'gearman_worker_echo' => ['', 'worker_object'=>'', 'workload'=>''], + 'gearman_worker_errno' => ['', 'worker_object'=>''], + 'gearman_worker_error' => ['', 'worker_object'=>''], + 'gearman_worker_grab_job' => ['', 'worker_object'=>''], + 'gearman_worker_options' => ['', 'worker_object'=>''], + 'gearman_worker_register' => ['', 'worker_object'=>'', 'function_name'=>'', 'timeout'=>''], + 'gearman_worker_remove_options' => ['', 'worker_object'=>'', 'option'=>''], + 'gearman_worker_return_code' => ['', 'worker_object'=>''], + 'gearman_worker_set_options' => ['', 'worker_object'=>'', 'option'=>''], + 'gearman_worker_set_timeout' => ['', 'worker_object'=>'', 'timeout'=>''], + 'gearman_worker_timeout' => ['', 'worker_object'=>''], + 'gearman_worker_unregister' => ['', 'worker_object'=>'', 'function_name'=>''], + 'gearman_worker_unregister_all' => ['', 'worker_object'=>''], + 'gearman_worker_wait' => ['', 'worker_object'=>''], + 'gearman_worker_work' => ['', 'worker_object'=>''], + 'geoip_asnum_by_name' => ['string|false', 'hostname'=>'string'], + 'geoip_continent_code_by_name' => ['string|false', 'hostname'=>'string'], + 'geoip_country_code3_by_name' => ['string|false', 'hostname'=>'string'], + 'geoip_country_code_by_name' => ['string|false', 'hostname'=>'string'], + 'geoip_country_name_by_name' => ['string|false', 'hostname'=>'string'], + 'geoip_database_info' => ['string', 'database='=>'int'], + 'geoip_db_avail' => ['bool', 'database'=>'int'], + 'geoip_db_filename' => ['string', 'database'=>'int'], + 'geoip_db_get_all_info' => ['array'], + 'geoip_domain_by_name' => ['string', 'hostname'=>'string'], + 'geoip_id_by_name' => ['int', 'hostname'=>'string'], + 'geoip_isp_by_name' => ['string|false', 'hostname'=>'string'], + 'geoip_netspeedcell_by_name' => ['string|false', 'hostname'=>'string'], + 'geoip_org_by_name' => ['string|false', 'hostname'=>'string'], + 'geoip_record_by_name' => ['array|false', 'hostname'=>'string'], + 'geoip_region_by_name' => ['array|false', 'hostname'=>'string'], + 'geoip_region_name_by_code' => ['string|false', 'country_code'=>'string', 'region_code'=>'string'], + 'geoip_setup_custom_directory' => ['void', 'path'=>'string'], + 'geoip_time_zone_by_country_and_region' => ['string|false', 'country_code'=>'string', 'region_code='=>'string'], + 'get_browser' => ['array|object|false', 'user_agent='=>'?string', 'return_array='=>'bool'], + 'get_call_stack' => [''], + 'get_called_class' => ['class-string'], + 'get_cfg_var' => ['string|false', 'option'=>'string'], + 'get_class' => ['class-string', 'object='=>'object'], + 'get_class_methods' => ['list|null', 'object_or_class'=>'mixed'], + 'get_class_vars' => ['array', 'class'=>'string'], + 'get_current_user' => ['string'], + 'get_declared_classes' => ['list'], + 'get_declared_interfaces' => ['list'], + 'get_declared_traits' => ['list|null'], + 'get_defined_constants' => ['array', 'categorize='=>'bool'], + 'get_defined_functions' => ['array>', 'exclude_disabled='=>'bool'], + 'get_defined_vars' => ['array'], + 'get_extension_funcs' => ['list|false', 'extension'=>'string'], + 'get_headers' => ['array|false', 'url'=>'string', 'associative='=>'int'], + 'get_html_translation_table' => ['array', 'table='=>'int', 'flags='=>'int', 'encoding='=>'string'], + 'get_include_path' => ['string'], + 'get_included_files' => ['list'], + 'get_loaded_extensions' => ['list', 'zend_extensions='=>'bool'], + 'get_magic_quotes_gpc' => ['int|false'], + 'get_magic_quotes_runtime' => ['int|false'], + 'get_meta_tags' => ['array', 'filename'=>'string', 'use_include_path='=>'bool'], + 'get_object_vars' => ['array', 'object'=>'object'], + 'get_parent_class' => ['class-string|false', 'object_or_class='=>'mixed'], + 'get_required_files' => ['list'], + 'get_resource_type' => ['string', 'resource'=>'resource'], + 'get_resources' => ['array', 'type='=>'string'], + 'getallheaders' => ['array|false'], + 'getcwd' => ['string|false'], + 'getdate' => ['array{seconds: int<0, 59>, minutes: int<0, 59>, hours: int<0, 23>, mday: int<1, 31>, wday: int<0, 6>, mon: int<1, 12>, year: int, yday: int<0, 365>, weekday: "Monday"|"Tuesday"|"Wednesday"|"Thursday"|"Friday"|"Saturday"|"Sunday", month: "January"|"February"|"March"|"April"|"May"|"June"|"July"|"August"|"September"|"October"|"November"|"December", 0: int}', 'timestamp='=>'int'], + 'getenv' => ['string|false', 'name'=>'string', 'local_only='=>'bool'], + 'gethostbyaddr' => ['string|false', 'ip'=>'string'], + 'gethostbyname' => ['string', 'hostname'=>'string'], + 'gethostbynamel' => ['list|false', 'hostname'=>'string'], + 'gethostname' => ['string|false'], + 'getimagesize' => ['array|false', 'filename'=>'string', '&w_image_info='=>'array'], + 'getimagesizefromstring' => ['array|false', 'string'=>'string', '&w_image_info='=>'array'], + 'getlastmod' => ['int|false'], + 'getmxrr' => ['bool', 'hostname'=>'string', '&w_hosts'=>'array', '&w_weights='=>'array'], + 'getmygid' => ['int|false'], + 'getmyinode' => ['int|false'], + 'getmypid' => ['int|false'], + 'getmyuid' => ['int|false'], + 'getopt' => ['array|array|array>|false', 'short_options'=>'string', 'long_options='=>'array'], + 'getprotobyname' => ['int|false', 'protocol'=>'string'], + 'getprotobynumber' => ['string', 'protocol'=>'int'], + 'getrandmax' => ['int'], + 'getrusage' => ['array', 'mode='=>'int'], + 'getservbyname' => ['int|false', 'service'=>'string', 'protocol'=>'string'], + 'getservbyport' => ['string|false', 'port'=>'int', 'protocol'=>'string'], + 'gettext' => ['string', 'message'=>'string'], + 'gettimeofday' => ['array'], + 'gettimeofday\'1' => ['float', 'as_float='=>'true'], + 'gettype' => ['string', 'value'=>'mixed'], + 'glob' => ['list|false', 'pattern'=>'string', 'flags='=>'int'], + 'gmdate' => ['string', 'format'=>'string', 'timestamp='=>'int'], + 'gmmktime' => ['int|false', 'hour='=>'int', 'minute='=>'int', 'second='=>'int', 'month='=>'int', 'day='=>'int', 'year='=>'int'], + 'gmp_abs' => ['GMP', 'num'=>'GMP|string|int'], + 'gmp_add' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_and' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_clrbit' => ['void', 'num'=>'GMP|string|int', 'index'=>'int'], + 'gmp_cmp' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_com' => ['GMP', 'num'=>'GMP|string|int'], + 'gmp_div' => ['GMP', 'num1'=>'GMP|resource|string', 'num2'=>'GMP|resource|string', 'rounding_mode='=>'int'], + 'gmp_div_q' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], + 'gmp_div_qr' => ['array{0: GMP, 1: GMP}', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], + 'gmp_div_r' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], + 'gmp_divexact' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_export' => ['string|false', 'num'=>'GMP|string|int', 'word_size='=>'int', 'flags='=>'int'], + 'gmp_fact' => ['GMP', 'num'=>'int'], + 'gmp_gcd' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_gcdext' => ['array', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_hamdist' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_import' => ['GMP|false', 'data'=>'string', 'word_size='=>'int', 'flags='=>'int'], + 'gmp_init' => ['GMP', 'num'=>'int|string', 'base='=>'int'], + 'gmp_intval' => ['int', 'num'=>'GMP|string|int'], + 'gmp_invert' => ['GMP|false', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_jacobi' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_legendre' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_mod' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_mul' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_neg' => ['GMP', 'num'=>'GMP|string|int'], + 'gmp_nextprime' => ['GMP', 'num'=>'GMP|string|int'], + 'gmp_or' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_perfect_square' => ['bool', 'num'=>'GMP|string|int'], + 'gmp_popcount' => ['int', 'num'=>'GMP|string|int'], + 'gmp_pow' => ['GMP', 'num'=>'GMP|string|int', 'exponent'=>'int'], + 'gmp_powm' => ['GMP', 'num'=>'GMP|string|int', 'exponent'=>'GMP|string|int', 'modulus'=>'GMP|string|int'], + 'gmp_prob_prime' => ['int', 'num'=>'GMP|string|int', 'repetitions='=>'int'], + 'gmp_random' => ['GMP', 'limiter='=>'int'], + 'gmp_random_bits' => ['GMP', 'bits'=>'int'], + 'gmp_random_range' => ['GMP', 'min'=>'GMP|string|int', 'max'=>'GMP|string|int'], + 'gmp_random_seed' => ['void', 'seed'=>'GMP|string|int'], + 'gmp_root' => ['GMP', 'num'=>'GMP|string|int', 'nth'=>'int'], + 'gmp_rootrem' => ['array{0: GMP, 1: GMP}', 'num'=>'GMP|string|int', 'nth'=>'int'], + 'gmp_scan0' => ['int', 'num1'=>'GMP|string|int', 'start'=>'int'], + 'gmp_scan1' => ['int', 'num1'=>'GMP|string|int', 'start'=>'int'], + 'gmp_setbit' => ['void', 'num'=>'GMP|string|int', 'index'=>'int', 'value='=>'bool'], + 'gmp_sign' => ['int', 'num'=>'GMP|string|int'], + 'gmp_sqrt' => ['GMP', 'num'=>'GMP|string|int'], + 'gmp_sqrtrem' => ['array{0: GMP, 1: GMP}', 'num'=>'GMP|string|int'], + 'gmp_strval' => ['numeric-string', 'num'=>'GMP|string|int', 'base='=>'int'], + 'gmp_sub' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmp_testbit' => ['bool', 'num'=>'GMP|string|int', 'index'=>'int'], + 'gmp_xor' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], + 'gmstrftime' => ['string|false', 'format'=>'string', 'timestamp='=>'int'], + 'gnupg::adddecryptkey' => ['bool', 'fingerprint'=>'string', 'passphrase'=>'string'], + 'gnupg::addencryptkey' => ['bool', 'fingerprint'=>'string'], + 'gnupg::addsignkey' => ['bool', 'fingerprint'=>'string', 'passphrase='=>'string'], + 'gnupg::cleardecryptkeys' => ['bool'], + 'gnupg::clearencryptkeys' => ['bool'], + 'gnupg::clearsignkeys' => ['bool'], + 'gnupg::decrypt' => ['string|false', 'text'=>'string'], + 'gnupg::decryptverify' => ['array|false', 'text'=>'string', '&plaintext'=>'string'], + 'gnupg::encrypt' => ['string|false', 'plaintext'=>'string'], + 'gnupg::encryptsign' => ['string|false', 'plaintext'=>'string'], + 'gnupg::export' => ['string|false', 'fingerprint'=>'string'], + 'gnupg::geterror' => ['string|false'], + 'gnupg::getprotocol' => ['int'], + 'gnupg::import' => ['array|false', 'keydata'=>'string'], + 'gnupg::init' => ['resource'], + 'gnupg::keyinfo' => ['array', 'pattern'=>'string'], + 'gnupg::setarmor' => ['bool', 'armor'=>'int'], + 'gnupg::seterrormode' => ['void', 'errormode'=>'int'], + 'gnupg::setsignmode' => ['bool', 'signmode'=>'int'], + 'gnupg::sign' => ['string|false', 'plaintext'=>'string'], + 'gnupg::verify' => ['array|false', 'signed_text'=>'string', 'signature'=>'string', '&plaintext='=>'string'], + 'gnupg_adddecryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase'=>'string'], + 'gnupg_addencryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string'], + 'gnupg_addsignkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase='=>'string'], + 'gnupg_cleardecryptkeys' => ['bool', 'identifier'=>'resource'], + 'gnupg_clearencryptkeys' => ['bool', 'identifier'=>'resource'], + 'gnupg_clearsignkeys' => ['bool', 'identifier'=>'resource'], + 'gnupg_decrypt' => ['string', 'identifier'=>'resource', 'text'=>'string'], + 'gnupg_decryptverify' => ['array', 'identifier'=>'resource', 'text'=>'string', 'plaintext'=>'string'], + 'gnupg_encrypt' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], + 'gnupg_encryptsign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], + 'gnupg_export' => ['string', 'identifier'=>'resource', 'fingerprint'=>'string'], + 'gnupg_geterror' => ['string', 'identifier'=>'resource'], + 'gnupg_getprotocol' => ['int', 'identifier'=>'resource'], + 'gnupg_import' => ['array', 'identifier'=>'resource', 'keydata'=>'string'], + 'gnupg_init' => ['resource'], + 'gnupg_keyinfo' => ['array', 'identifier'=>'resource', 'pattern'=>'string'], + 'gnupg_setarmor' => ['bool', 'identifier'=>'resource', 'armor'=>'int'], + 'gnupg_seterrormode' => ['void', 'identifier'=>'resource', 'errormode'=>'int'], + 'gnupg_setsignmode' => ['bool', 'identifier'=>'resource', 'signmode'=>'int'], + 'gnupg_sign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], + 'gnupg_verify' => ['array', 'identifier'=>'resource', 'signed_text'=>'string', 'signature'=>'string', 'plaintext='=>'string'], + 'gopher_parsedir' => ['array', 'dirent'=>'string'], + 'grapheme_extract' => ['string|false', 'haystack'=>'string', 'size'=>'int', 'type='=>'int', 'offset='=>'int', '&w_next='=>'int'], + 'grapheme_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], + 'grapheme_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'beforeNeedle='=>'bool'], + 'grapheme_strlen' => ['0|positive-int|false|null', 'string'=>'string'], + 'grapheme_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], + 'grapheme_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], + 'grapheme_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], + 'grapheme_strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'beforeNeedle='=>'bool'], + 'grapheme_substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int'], + 'gregoriantojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], + 'gridObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'gupnp_context_get_host_ip' => ['string', 'context'=>'resource'], + 'gupnp_context_get_port' => ['int', 'context'=>'resource'], + 'gupnp_context_get_subscription_timeout' => ['int', 'context'=>'resource'], + 'gupnp_context_host_path' => ['bool', 'context'=>'resource', 'local_path'=>'string', 'server_path'=>'string'], + 'gupnp_context_new' => ['resource', 'host_ip='=>'string', 'port='=>'int'], + 'gupnp_context_set_subscription_timeout' => ['void', 'context'=>'resource', 'timeout'=>'int'], + 'gupnp_context_timeout_add' => ['bool', 'context'=>'resource', 'timeout'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], + 'gupnp_context_unhost_path' => ['bool', 'context'=>'resource', 'server_path'=>'string'], + 'gupnp_control_point_browse_start' => ['bool', 'cpoint'=>'resource'], + 'gupnp_control_point_browse_stop' => ['bool', 'cpoint'=>'resource'], + 'gupnp_control_point_callback_set' => ['bool', 'cpoint'=>'resource', 'signal'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], + 'gupnp_control_point_new' => ['resource', 'context'=>'resource', 'target'=>'string'], + 'gupnp_device_action_callback_set' => ['bool', 'root_device'=>'resource', 'signal'=>'int', 'action_name'=>'string', 'callback'=>'mixed', 'arg='=>'mixed'], + 'gupnp_device_info_get' => ['array', 'root_device'=>'resource'], + 'gupnp_device_info_get_service' => ['resource', 'root_device'=>'resource', 'type'=>'string'], + 'gupnp_root_device_get_available' => ['bool', 'root_device'=>'resource'], + 'gupnp_root_device_get_relative_location' => ['string', 'root_device'=>'resource'], + 'gupnp_root_device_new' => ['resource', 'context'=>'resource', 'location'=>'string', 'description_dir'=>'string'], + 'gupnp_root_device_set_available' => ['bool', 'root_device'=>'resource', 'available'=>'bool'], + 'gupnp_root_device_start' => ['bool', 'root_device'=>'resource'], + 'gupnp_root_device_stop' => ['bool', 'root_device'=>'resource'], + 'gupnp_service_action_get' => ['mixed', 'action'=>'resource', 'name'=>'string', 'type'=>'int'], + 'gupnp_service_action_return' => ['bool', 'action'=>'resource'], + 'gupnp_service_action_return_error' => ['bool', 'action'=>'resource', 'error_code'=>'int', 'error_description='=>'string'], + 'gupnp_service_action_set' => ['bool', 'action'=>'resource', 'name'=>'string', 'type'=>'int', 'value'=>'mixed'], + 'gupnp_service_freeze_notify' => ['bool', 'service'=>'resource'], + 'gupnp_service_info_get' => ['array', 'proxy'=>'resource'], + 'gupnp_service_info_get_introspection' => ['mixed', 'proxy'=>'resource', 'callback='=>'mixed', 'arg='=>'mixed'], + 'gupnp_service_introspection_get_state_variable' => ['array', 'introspection'=>'resource', 'variable_name'=>'string'], + 'gupnp_service_notify' => ['bool', 'service'=>'resource', 'name'=>'string', 'type'=>'int', 'value'=>'mixed'], + 'gupnp_service_proxy_action_get' => ['mixed', 'proxy'=>'resource', 'action'=>'string', 'name'=>'string', 'type'=>'int'], + 'gupnp_service_proxy_action_set' => ['bool', 'proxy'=>'resource', 'action'=>'string', 'name'=>'string', 'value'=>'mixed', 'type'=>'int'], + 'gupnp_service_proxy_add_notify' => ['bool', 'proxy'=>'resource', 'value'=>'string', 'type'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], + 'gupnp_service_proxy_callback_set' => ['bool', 'proxy'=>'resource', 'signal'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], + 'gupnp_service_proxy_get_subscribed' => ['bool', 'proxy'=>'resource'], + 'gupnp_service_proxy_remove_notify' => ['bool', 'proxy'=>'resource', 'value'=>'string'], + 'gupnp_service_proxy_send_action' => ['array', 'proxy'=>'resource', 'action'=>'string', 'in_params'=>'array', 'out_params'=>'array'], + 'gupnp_service_proxy_set_subscribed' => ['bool', 'proxy'=>'resource', 'subscribed'=>'bool'], + 'gupnp_service_thaw_notify' => ['bool', 'service'=>'resource'], + 'gzclose' => ['bool', 'stream'=>'resource'], + 'gzcompress' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], + 'gzdecode' => ['string|false', 'data'=>'string', 'max_length='=>'int'], + 'gzdeflate' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], + 'gzencode' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], + 'gzeof' => ['bool|int', 'stream'=>'resource'], + 'gzfile' => ['list', 'filename'=>'string', 'use_include_path='=>'int'], + 'gzgetc' => ['string|false', 'stream'=>'resource'], + 'gzgets' => ['string|false', 'stream'=>'resource', 'length='=>'int'], + 'gzgetss' => ['string|false', 'zp'=>'resource', 'length'=>'int', 'allowable_tags='=>'string'], + 'gzinflate' => ['string|false', 'data'=>'string', 'max_length='=>'int'], + 'gzopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'int'], + 'gzpassthru' => ['int|false', 'stream'=>'resource'], + 'gzputs' => ['int', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], + 'gzread' => ['string|0', 'stream'=>'resource', 'length'=>'int'], + 'gzrewind' => ['bool', 'stream'=>'resource'], + 'gzseek' => ['int', 'stream'=>'resource', 'offset'=>'int', 'whence='=>'int'], + 'gztell' => ['int|false', 'stream'=>'resource'], + 'gzuncompress' => ['string|false', 'data'=>'string', 'max_length='=>'int'], + 'gzwrite' => ['int', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], + 'hash' => ['string|false', 'algo'=>'string', 'data'=>'string', 'binary='=>'bool'], + 'hashTableObj::clear' => ['void'], + 'hashTableObj::get' => ['string', 'key'=>'string'], + 'hashTableObj::nextkey' => ['string', 'previousKey'=>'string'], + 'hashTableObj::remove' => ['int', 'key'=>'string'], + 'hashTableObj::set' => ['int', 'key'=>'string', 'value'=>'string'], + 'hash_algos' => ['list'], + 'hash_copy' => ['resource', 'context'=>'resource'], + 'hash_equals' => ['bool', 'known_string'=>'string', 'user_string'=>'string'], + 'hash_file' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'binary='=>'bool'], + 'hash_final' => ['string', 'context'=>'resource', 'raw_output='=>'bool'], + 'hash_hmac' => ['string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'binary='=>'bool'], + 'hash_hmac_file' => ['string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'binary='=>'bool'], + 'hash_init' => ['resource', 'algo'=>'string', 'options='=>'int', 'key='=>'string'], + 'hash_pbkdf2' => ['string', 'algo'=>'string', 'password'=>'string', 'salt'=>'string', 'iterations'=>'int', 'length='=>'int', 'binary='=>'bool'], + 'hash_update' => ['bool', 'context'=>'resource', 'data'=>'string'], + 'hash_update_file' => ['bool', 'hcontext'=>'resource', 'filename'=>'string', 'scontext='=>'resource'], + 'hash_update_stream' => ['int', 'context'=>'resource', 'handle'=>'resource', 'length='=>'int'], + 'header' => ['void', 'header'=>'string', 'replace='=>'bool', 'response_code='=>'int'], + 'header_register_callback' => ['bool', 'callback'=>'callable():void'], + 'header_remove' => ['void', 'name='=>'string'], + 'headers_list' => ['list'], + 'headers_sent' => ['bool', '&w_filename='=>'string', '&w_line='=>'int'], + 'hebrev' => ['string', 'string'=>'string', 'max_chars_per_line='=>'int'], + 'hebrevc' => ['string', 'string'=>'string', 'max_chars_per_line='=>'int'], + 'hex2bin' => ['string|false', 'string'=>'string'], + 'hexdec' => ['int|float', 'hex_string'=>'string'], + 'highlight_file' => ['string|bool', 'filename'=>'string', 'return='=>'bool'], + 'highlight_string' => ['string|bool', 'string'=>'string', 'return='=>'bool'], + 'html_entity_decode' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string'], + 'htmlentities' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string', 'double_encode='=>'bool'], + 'htmlspecialchars' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string|null', 'double_encode='=>'bool'], + 'htmlspecialchars_decode' => ['string', 'string'=>'string', 'flags='=>'int'], + 'http\Client::__construct' => ['void', 'driver='=>'string', 'persistent_handle_id='=>'string'], + 'http\Client::addCookies' => ['http\Client', 'cookies='=>'?array'], + 'http\Client::addSslOptions' => ['http\Client', 'ssl_options='=>'?array'], + 'http\Client::attach' => ['void', 'observer'=>'SplObserver'], + 'http\Client::configure' => ['http\Client', 'settings'=>'array'], + 'http\Client::count' => ['int'], + 'http\Client::dequeue' => ['http\Client', 'request'=>'http\Client\Request'], + 'http\Client::detach' => ['void', 'observer'=>'SplObserver'], + 'http\Client::enableEvents' => ['http\Client', 'enable='=>'mixed'], + 'http\Client::enablePipelining' => ['http\Client', 'enable='=>'mixed'], + 'http\Client::enqueue' => ['http\Client', 'request'=>'http\Client\Request', 'callable='=>'mixed'], + 'http\Client::getAvailableConfiguration' => ['array'], + 'http\Client::getAvailableDrivers' => ['array'], + 'http\Client::getAvailableOptions' => ['array'], + 'http\Client::getCookies' => ['array'], + 'http\Client::getHistory' => ['http\Message'], + 'http\Client::getObservers' => ['SplObjectStorage'], + 'http\Client::getOptions' => ['array'], + 'http\Client::getProgressInfo' => ['null|object', 'request'=>'http\Client\Request'], + 'http\Client::getResponse' => ['http\Client\Response|null', 'request='=>'?http\Client\Request'], + 'http\Client::getSslOptions' => ['array'], + 'http\Client::getTransferInfo' => ['object', 'request'=>'http\Client\Request'], + 'http\Client::notify' => ['void', 'request='=>'?http\Client\Request'], + 'http\Client::once' => ['bool'], + 'http\Client::requeue' => ['http\Client', 'request'=>'http\Client\Request', 'callable='=>'mixed'], + 'http\Client::reset' => ['http\Client'], + 'http\Client::send' => ['http\Client'], + 'http\Client::setCookies' => ['http\Client', 'cookies='=>'?array'], + 'http\Client::setDebug' => ['http\Client', 'callback'=>'callable'], + 'http\Client::setOptions' => ['http\Client', 'options='=>'?array'], + 'http\Client::setSslOptions' => ['http\Client', 'ssl_option='=>'?array'], + 'http\Client::wait' => ['bool', 'timeout='=>'mixed'], + 'http\Client\Curl\User::init' => ['', 'run'=>'callable'], + 'http\Client\Curl\User::once' => [''], + 'http\Client\Curl\User::send' => [''], + 'http\Client\Curl\User::socket' => ['', 'socket'=>'resource', 'action'=>'int'], + 'http\Client\Curl\User::timer' => ['', 'timeout_ms'=>'int'], + 'http\Client\Curl\User::wait' => ['', 'timeout_ms='=>'mixed'], + 'http\Client\Request::__construct' => ['void', 'method='=>'mixed', 'url='=>'mixed', 'headers='=>'?array', 'body='=>'?http\Message\Body'], + 'http\Client\Request::__toString' => ['string'], + 'http\Client\Request::addBody' => ['http\Message', 'body'=>'http\Message\Body'], + 'http\Client\Request::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], + 'http\Client\Request::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], + 'http\Client\Request::addQuery' => ['http\Client\Request', 'query_data'=>'mixed'], + 'http\Client\Request::addSslOptions' => ['http\Client\Request', 'ssl_options='=>'?array'], + 'http\Client\Request::count' => ['int'], + 'http\Client\Request::current' => ['mixed'], + 'http\Client\Request::detach' => ['http\Message'], + 'http\Client\Request::getBody' => ['http\Message\Body'], + 'http\Client\Request::getContentType' => ['null|string'], + 'http\Client\Request::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], + 'http\Client\Request::getHeaders' => ['array'], + 'http\Client\Request::getHttpVersion' => ['string'], + 'http\Client\Request::getInfo' => ['null|string'], + 'http\Client\Request::getOptions' => ['array'], + 'http\Client\Request::getParentMessage' => ['http\Message'], + 'http\Client\Request::getQuery' => ['null|string'], + 'http\Client\Request::getRequestMethod' => ['false|string'], + 'http\Client\Request::getRequestUrl' => ['false|string'], + 'http\Client\Request::getResponseCode' => ['false|int'], + 'http\Client\Request::getResponseStatus' => ['false|string'], + 'http\Client\Request::getSslOptions' => ['array'], + 'http\Client\Request::getType' => ['int'], + 'http\Client\Request::isMultipart' => ['bool', '&boundary='=>'mixed'], + 'http\Client\Request::key' => ['int|string'], + 'http\Client\Request::next' => ['void'], + 'http\Client\Request::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], + 'http\Client\Request::reverse' => ['http\Message'], + 'http\Client\Request::rewind' => ['void'], + 'http\Client\Request::serialize' => ['string'], + 'http\Client\Request::setBody' => ['http\Message', 'body'=>'http\Message\Body'], + 'http\Client\Request::setContentType' => ['http\Client\Request', 'content_type'=>'string'], + 'http\Client\Request::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], + 'http\Client\Request::setHeaders' => ['http\Message', 'headers'=>'array'], + 'http\Client\Request::setHttpVersion' => ['http\Message', 'http_version'=>'string'], + 'http\Client\Request::setInfo' => ['http\Message', 'http_info'=>'string'], + 'http\Client\Request::setOptions' => ['http\Client\Request', 'options='=>'?array'], + 'http\Client\Request::setQuery' => ['http\Client\Request', 'query_data='=>'mixed'], + 'http\Client\Request::setRequestMethod' => ['http\Message', 'request_method'=>'string'], + 'http\Client\Request::setRequestUrl' => ['http\Message', 'url'=>'string'], + 'http\Client\Request::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], + 'http\Client\Request::setResponseStatus' => ['http\Message', 'response_status'=>'string'], + 'http\Client\Request::setSslOptions' => ['http\Client\Request', 'ssl_options='=>'?array'], + 'http\Client\Request::setType' => ['http\Message', 'type'=>'int'], + 'http\Client\Request::splitMultipartBody' => ['http\Message'], + 'http\Client\Request::toCallback' => ['http\Message', 'callback'=>'callable'], + 'http\Client\Request::toStream' => ['http\Message', 'stream'=>'resource'], + 'http\Client\Request::toString' => ['string', 'include_parent='=>'mixed'], + 'http\Client\Request::unserialize' => ['void', 'serialized'=>'string'], + 'http\Client\Request::valid' => ['bool'], + 'http\Client\Response::__construct' => ['Iterator'], + 'http\Client\Response::__toString' => ['string'], + 'http\Client\Response::addBody' => ['http\Message', 'body'=>'http\Message\Body'], + 'http\Client\Response::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], + 'http\Client\Response::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], + 'http\Client\Response::count' => ['int'], + 'http\Client\Response::current' => ['mixed'], + 'http\Client\Response::detach' => ['http\Message'], + 'http\Client\Response::getBody' => ['http\Message\Body'], + 'http\Client\Response::getCookies' => ['array', 'flags='=>'mixed', 'allowed_extras='=>'mixed'], + 'http\Client\Response::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], + 'http\Client\Response::getHeaders' => ['array'], + 'http\Client\Response::getHttpVersion' => ['string'], + 'http\Client\Response::getInfo' => ['null|string'], + 'http\Client\Response::getParentMessage' => ['http\Message'], + 'http\Client\Response::getRequestMethod' => ['false|string'], + 'http\Client\Response::getRequestUrl' => ['false|string'], + 'http\Client\Response::getResponseCode' => ['false|int'], + 'http\Client\Response::getResponseStatus' => ['false|string'], + 'http\Client\Response::getTransferInfo' => ['mixed|object', 'element='=>'mixed'], + 'http\Client\Response::getType' => ['int'], + 'http\Client\Response::isMultipart' => ['bool', '&boundary='=>'mixed'], + 'http\Client\Response::key' => ['int|string'], + 'http\Client\Response::next' => ['void'], + 'http\Client\Response::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], + 'http\Client\Response::reverse' => ['http\Message'], + 'http\Client\Response::rewind' => ['void'], + 'http\Client\Response::serialize' => ['string'], + 'http\Client\Response::setBody' => ['http\Message', 'body'=>'http\Message\Body'], + 'http\Client\Response::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], + 'http\Client\Response::setHeaders' => ['http\Message', 'headers'=>'array'], + 'http\Client\Response::setHttpVersion' => ['http\Message', 'http_version'=>'string'], + 'http\Client\Response::setInfo' => ['http\Message', 'http_info'=>'string'], + 'http\Client\Response::setRequestMethod' => ['http\Message', 'request_method'=>'string'], + 'http\Client\Response::setRequestUrl' => ['http\Message', 'url'=>'string'], + 'http\Client\Response::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], + 'http\Client\Response::setResponseStatus' => ['http\Message', 'response_status'=>'string'], + 'http\Client\Response::setType' => ['http\Message', 'type'=>'int'], + 'http\Client\Response::splitMultipartBody' => ['http\Message'], + 'http\Client\Response::toCallback' => ['http\Message', 'callback'=>'callable'], + 'http\Client\Response::toStream' => ['http\Message', 'stream'=>'resource'], + 'http\Client\Response::toString' => ['string', 'include_parent='=>'mixed'], + 'http\Client\Response::unserialize' => ['void', 'serialized'=>'string'], + 'http\Client\Response::valid' => ['bool'], + 'http\Cookie::__construct' => ['void', 'cookie_string='=>'mixed', 'parser_flags='=>'int', 'allowed_extras='=>'array'], + 'http\Cookie::__toString' => ['string'], + 'http\Cookie::addCookie' => ['http\Cookie', 'cookie_name'=>'string', 'cookie_value'=>'string'], + 'http\Cookie::addCookies' => ['http\Cookie', 'cookies'=>'array'], + 'http\Cookie::addExtra' => ['http\Cookie', 'extra_name'=>'string', 'extra_value'=>'string'], + 'http\Cookie::addExtras' => ['http\Cookie', 'extras'=>'array'], + 'http\Cookie::getCookie' => ['null|string', 'name'=>'string'], + 'http\Cookie::getCookies' => ['array'], + 'http\Cookie::getDomain' => ['string'], + 'http\Cookie::getExpires' => ['int'], + 'http\Cookie::getExtra' => ['string', 'name'=>'string'], + 'http\Cookie::getExtras' => ['array'], + 'http\Cookie::getFlags' => ['int'], + 'http\Cookie::getMaxAge' => ['int'], + 'http\Cookie::getPath' => ['string'], + 'http\Cookie::setCookie' => ['http\Cookie', 'cookie_name'=>'string', 'cookie_value='=>'mixed'], + 'http\Cookie::setCookies' => ['http\Cookie', 'cookies='=>'mixed'], + 'http\Cookie::setDomain' => ['http\Cookie', 'value='=>'mixed'], + 'http\Cookie::setExpires' => ['http\Cookie', 'value='=>'mixed'], + 'http\Cookie::setExtra' => ['http\Cookie', 'extra_name'=>'string', 'extra_value='=>'mixed'], + 'http\Cookie::setExtras' => ['http\Cookie', 'extras='=>'mixed'], + 'http\Cookie::setFlags' => ['http\Cookie', 'value='=>'mixed'], + 'http\Cookie::setMaxAge' => ['http\Cookie', 'value='=>'mixed'], + 'http\Cookie::setPath' => ['http\Cookie', 'value='=>'mixed'], + 'http\Cookie::toArray' => ['array'], + 'http\Cookie::toString' => ['string'], + 'http\Encoding\Stream::__construct' => ['void', 'flags='=>'mixed'], + 'http\Encoding\Stream::done' => ['bool'], + 'http\Encoding\Stream::finish' => ['string'], + 'http\Encoding\Stream::flush' => ['string'], + 'http\Encoding\Stream::update' => ['string', 'data'=>'string'], + 'http\Encoding\Stream\Debrotli::__construct' => ['void', 'flags='=>'int'], + 'http\Encoding\Stream\Debrotli::decode' => ['string', 'data'=>'string'], + 'http\Encoding\Stream\Debrotli::done' => ['bool'], + 'http\Encoding\Stream\Debrotli::finish' => ['string'], + 'http\Encoding\Stream\Debrotli::flush' => ['string'], + 'http\Encoding\Stream\Debrotli::update' => ['string', 'data'=>'string'], + 'http\Encoding\Stream\Dechunk::__construct' => ['void', 'flags='=>'mixed'], + 'http\Encoding\Stream\Dechunk::decode' => ['false|string', 'data'=>'string', '&decoded_len='=>'mixed'], + 'http\Encoding\Stream\Dechunk::done' => ['bool'], + 'http\Encoding\Stream\Dechunk::finish' => ['string'], + 'http\Encoding\Stream\Dechunk::flush' => ['string'], + 'http\Encoding\Stream\Dechunk::update' => ['string', 'data'=>'string'], + 'http\Encoding\Stream\Deflate::__construct' => ['void', 'flags='=>'mixed'], + 'http\Encoding\Stream\Deflate::done' => ['bool'], + 'http\Encoding\Stream\Deflate::encode' => ['string', 'data'=>'string', 'flags='=>'mixed'], + 'http\Encoding\Stream\Deflate::finish' => ['string'], + 'http\Encoding\Stream\Deflate::flush' => ['string'], + 'http\Encoding\Stream\Deflate::update' => ['string', 'data'=>'string'], + 'http\Encoding\Stream\Enbrotli::__construct' => ['void', 'flags='=>'int'], + 'http\Encoding\Stream\Enbrotli::done' => ['bool'], + 'http\Encoding\Stream\Enbrotli::encode' => ['string', 'data'=>'string', 'flags='=>'int'], + 'http\Encoding\Stream\Enbrotli::finish' => ['string'], + 'http\Encoding\Stream\Enbrotli::flush' => ['string'], + 'http\Encoding\Stream\Enbrotli::update' => ['string', 'data'=>'string'], + 'http\Encoding\Stream\Inflate::__construct' => ['void', 'flags='=>'mixed'], + 'http\Encoding\Stream\Inflate::decode' => ['string', 'data'=>'string'], + 'http\Encoding\Stream\Inflate::done' => ['bool'], + 'http\Encoding\Stream\Inflate::finish' => ['string'], + 'http\Encoding\Stream\Inflate::flush' => ['string'], + 'http\Encoding\Stream\Inflate::update' => ['string', 'data'=>'string'], + 'http\Env::getRequestBody' => ['http\Message\Body', 'body_class_name='=>'mixed'], + 'http\Env::getRequestHeader' => ['array|null|string', 'header_name='=>'mixed'], + 'http\Env::getResponseCode' => ['int'], + 'http\Env::getResponseHeader' => ['array|null|string', 'header_name='=>'mixed'], + 'http\Env::getResponseStatusForAllCodes' => ['array'], + 'http\Env::getResponseStatusForCode' => ['string', 'code'=>'int'], + 'http\Env::negotiate' => ['null|string', 'params'=>'string', 'supported'=>'array', 'primary_type_separator='=>'mixed', '&result_array='=>'mixed'], + 'http\Env::negotiateCharset' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], + 'http\Env::negotiateContentType' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], + 'http\Env::negotiateEncoding' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], + 'http\Env::negotiateLanguage' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], + 'http\Env::setResponseCode' => ['bool', 'code'=>'int'], + 'http\Env::setResponseHeader' => ['bool', 'header_name'=>'string', 'header_value='=>'mixed', 'response_code='=>'mixed', 'replace_header='=>'mixed'], + 'http\Env\Request::__construct' => ['void'], + 'http\Env\Request::__toString' => ['string'], + 'http\Env\Request::addBody' => ['http\Message', 'body'=>'http\Message\Body'], + 'http\Env\Request::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], + 'http\Env\Request::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], + 'http\Env\Request::count' => ['int'], + 'http\Env\Request::current' => ['mixed'], + 'http\Env\Request::detach' => ['http\Message'], + 'http\Env\Request::getBody' => ['http\Message\Body'], + 'http\Env\Request::getCookie' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], + 'http\Env\Request::getFiles' => ['array'], + 'http\Env\Request::getForm' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], + 'http\Env\Request::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], + 'http\Env\Request::getHeaders' => ['array'], + 'http\Env\Request::getHttpVersion' => ['string'], + 'http\Env\Request::getInfo' => ['null|string'], + 'http\Env\Request::getParentMessage' => ['http\Message'], + 'http\Env\Request::getQuery' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], + 'http\Env\Request::getRequestMethod' => ['false|string'], + 'http\Env\Request::getRequestUrl' => ['false|string'], + 'http\Env\Request::getResponseCode' => ['false|int'], + 'http\Env\Request::getResponseStatus' => ['false|string'], + 'http\Env\Request::getType' => ['int'], + 'http\Env\Request::isMultipart' => ['bool', '&boundary='=>'mixed'], + 'http\Env\Request::key' => ['int|string'], + 'http\Env\Request::next' => ['void'], + 'http\Env\Request::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], + 'http\Env\Request::reverse' => ['http\Message'], + 'http\Env\Request::rewind' => ['void'], + 'http\Env\Request::serialize' => ['string'], + 'http\Env\Request::setBody' => ['http\Message', 'body'=>'http\Message\Body'], + 'http\Env\Request::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], + 'http\Env\Request::setHeaders' => ['http\Message', 'headers'=>'array'], + 'http\Env\Request::setHttpVersion' => ['http\Message', 'http_version'=>'string'], + 'http\Env\Request::setInfo' => ['http\Message', 'http_info'=>'string'], + 'http\Env\Request::setRequestMethod' => ['http\Message', 'request_method'=>'string'], + 'http\Env\Request::setRequestUrl' => ['http\Message', 'url'=>'string'], + 'http\Env\Request::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], + 'http\Env\Request::setResponseStatus' => ['http\Message', 'response_status'=>'string'], + 'http\Env\Request::setType' => ['http\Message', 'type'=>'int'], + 'http\Env\Request::splitMultipartBody' => ['http\Message'], + 'http\Env\Request::toCallback' => ['http\Message', 'callback'=>'callable'], + 'http\Env\Request::toStream' => ['http\Message', 'stream'=>'resource'], + 'http\Env\Request::toString' => ['string', 'include_parent='=>'mixed'], + 'http\Env\Request::unserialize' => ['void', 'serialized'=>'string'], + 'http\Env\Request::valid' => ['bool'], + 'http\Env\Response::__construct' => ['void'], + 'http\Env\Response::__invoke' => ['bool', 'data'=>'string', 'ob_flags='=>'int'], + 'http\Env\Response::__toString' => ['string'], + 'http\Env\Response::addBody' => ['http\Message', 'body'=>'http\Message\Body'], + 'http\Env\Response::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], + 'http\Env\Response::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], + 'http\Env\Response::count' => ['int'], + 'http\Env\Response::current' => ['mixed'], + 'http\Env\Response::detach' => ['http\Message'], + 'http\Env\Response::getBody' => ['http\Message\Body'], + 'http\Env\Response::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], + 'http\Env\Response::getHeaders' => ['array'], + 'http\Env\Response::getHttpVersion' => ['string'], + 'http\Env\Response::getInfo' => ['?string'], + 'http\Env\Response::getParentMessage' => ['http\Message'], + 'http\Env\Response::getRequestMethod' => ['false|string'], + 'http\Env\Response::getRequestUrl' => ['false|string'], + 'http\Env\Response::getResponseCode' => ['false|int'], + 'http\Env\Response::getResponseStatus' => ['false|string'], + 'http\Env\Response::getType' => ['int'], + 'http\Env\Response::isCachedByETag' => ['int', 'header_name='=>'string'], + 'http\Env\Response::isCachedByLastModified' => ['int', 'header_name='=>'string'], + 'http\Env\Response::isMultipart' => ['bool', '&boundary='=>'mixed'], + 'http\Env\Response::key' => ['int|string'], + 'http\Env\Response::next' => ['void'], + 'http\Env\Response::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], + 'http\Env\Response::reverse' => ['http\Message'], + 'http\Env\Response::rewind' => ['void'], + 'http\Env\Response::send' => ['bool', 'stream='=>'resource'], + 'http\Env\Response::serialize' => ['string'], + 'http\Env\Response::setBody' => ['http\Message', 'body'=>'http\Message\Body'], + 'http\Env\Response::setCacheControl' => ['http\Env\Response', 'cache_control'=>'string'], + 'http\Env\Response::setContentDisposition' => ['http\Env\Response', 'disposition_params'=>'array'], + 'http\Env\Response::setContentEncoding' => ['http\Env\Response', 'content_encoding'=>'int'], + 'http\Env\Response::setContentType' => ['http\Env\Response', 'content_type'=>'string'], + 'http\Env\Response::setCookie' => ['http\Env\Response', 'cookie'=>'mixed'], + 'http\Env\Response::setEnvRequest' => ['http\Env\Response', 'env_request'=>'http\Message'], + 'http\Env\Response::setEtag' => ['http\Env\Response', 'etag'=>'string'], + 'http\Env\Response::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], + 'http\Env\Response::setHeaders' => ['http\Message', 'headers'=>'array'], + 'http\Env\Response::setHttpVersion' => ['http\Message', 'http_version'=>'string'], + 'http\Env\Response::setInfo' => ['http\Message', 'http_info'=>'string'], + 'http\Env\Response::setLastModified' => ['http\Env\Response', 'last_modified'=>'int'], + 'http\Env\Response::setRequestMethod' => ['http\Message', 'request_method'=>'string'], + 'http\Env\Response::setRequestUrl' => ['http\Message', 'url'=>'string'], + 'http\Env\Response::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], + 'http\Env\Response::setResponseStatus' => ['http\Message', 'response_status'=>'string'], + 'http\Env\Response::setThrottleRate' => ['http\Env\Response', 'chunk_size'=>'int', 'delay='=>'float|int'], + 'http\Env\Response::setType' => ['http\Message', 'type'=>'int'], + 'http\Env\Response::splitMultipartBody' => ['http\Message'], + 'http\Env\Response::toCallback' => ['http\Message', 'callback'=>'callable'], + 'http\Env\Response::toStream' => ['http\Message', 'stream'=>'resource'], + 'http\Env\Response::toString' => ['string', 'include_parent='=>'mixed'], + 'http\Env\Response::unserialize' => ['void', 'serialized'=>'string'], + 'http\Env\Response::valid' => ['bool'], + 'http\Header::__construct' => ['void', 'name='=>'mixed', 'value='=>'mixed'], + 'http\Header::__toString' => ['string'], + 'http\Header::getParams' => ['http\Params', 'param_sep='=>'mixed', 'arg_sep='=>'mixed', 'val_sep='=>'mixed', 'flags='=>'mixed'], + 'http\Header::match' => ['bool', 'value'=>'string', 'flags='=>'mixed'], + 'http\Header::negotiate' => ['null|string', 'supported'=>'array', '&result='=>'mixed'], + 'http\Header::parse' => ['array|false', 'string'=>'string', 'header_class='=>'mixed'], + 'http\Header::serialize' => ['string'], + 'http\Header::toString' => ['string'], + 'http\Header::unserialize' => ['void', 'serialized'=>'string'], + 'http\Header\Parser::getState' => ['int'], + 'http\Header\Parser::parse' => ['int', 'data'=>'string', 'flags'=>'int', '&headers'=>'array'], + 'http\Header\Parser::stream' => ['int', 'stream'=>'resource', 'flags'=>'int', '&headers'=>'array'], + 'http\Message::__construct' => ['void', 'message='=>'mixed', 'greedy='=>'bool'], + 'http\Message::__toString' => ['string'], + 'http\Message::addBody' => ['http\Message', 'body'=>'http\Message\Body'], + 'http\Message::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], + 'http\Message::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], + 'http\Message::count' => ['int'], + 'http\Message::current' => ['mixed'], + 'http\Message::detach' => ['http\Message'], + 'http\Message::getBody' => ['http\Message\Body'], + 'http\Message::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], + 'http\Message::getHeaders' => ['array'], + 'http\Message::getHttpVersion' => ['string'], + 'http\Message::getInfo' => ['null|string'], + 'http\Message::getParentMessage' => ['http\Message'], + 'http\Message::getRequestMethod' => ['false|string'], + 'http\Message::getRequestUrl' => ['false|string'], + 'http\Message::getResponseCode' => ['false|int'], + 'http\Message::getResponseStatus' => ['false|string'], + 'http\Message::getType' => ['int'], + 'http\Message::isMultipart' => ['bool', '&boundary='=>'mixed'], + 'http\Message::key' => ['int|string'], + 'http\Message::next' => ['void'], + 'http\Message::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], + 'http\Message::reverse' => ['http\Message'], + 'http\Message::rewind' => ['void'], + 'http\Message::serialize' => ['string'], + 'http\Message::setBody' => ['http\Message', 'body'=>'http\Message\Body'], + 'http\Message::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], + 'http\Message::setHeaders' => ['http\Message', 'headers'=>'array'], + 'http\Message::setHttpVersion' => ['http\Message', 'http_version'=>'string'], + 'http\Message::setInfo' => ['http\Message', 'http_info'=>'string'], + 'http\Message::setRequestMethod' => ['http\Message', 'request_method'=>'string'], + 'http\Message::setRequestUrl' => ['http\Message', 'url'=>'string'], + 'http\Message::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], + 'http\Message::setResponseStatus' => ['http\Message', 'response_status'=>'string'], + 'http\Message::setType' => ['http\Message', 'type'=>'int'], + 'http\Message::splitMultipartBody' => ['http\Message'], + 'http\Message::toCallback' => ['http\Message', 'callback'=>'callable'], + 'http\Message::toStream' => ['http\Message', 'stream'=>'resource'], + 'http\Message::toString' => ['string', 'include_parent='=>'mixed'], + 'http\Message::unserialize' => ['void', 'serialized'=>'string'], + 'http\Message::valid' => ['bool'], + 'http\Message\Body::__construct' => ['void', 'stream='=>'resource'], + 'http\Message\Body::__toString' => ['string'], + 'http\Message\Body::addForm' => ['http\Message\Body', 'fields='=>'?array', 'files='=>'?array'], + 'http\Message\Body::addPart' => ['http\Message\Body', 'message'=>'http\Message'], + 'http\Message\Body::append' => ['http\Message\Body', 'string'=>'string'], + 'http\Message\Body::etag' => ['false|string'], + 'http\Message\Body::getBoundary' => ['null|string'], + 'http\Message\Body::getResource' => ['resource'], + 'http\Message\Body::serialize' => ['string'], + 'http\Message\Body::stat' => ['int|object', 'field='=>'mixed'], + 'http\Message\Body::toCallback' => ['http\Message\Body', 'callback'=>'callable', 'offset='=>'mixed', 'maxlen='=>'mixed'], + 'http\Message\Body::toStream' => ['http\Message\Body', 'stream'=>'resource', 'offset='=>'mixed', 'maxlen='=>'mixed'], + 'http\Message\Body::toString' => ['string'], + 'http\Message\Body::unserialize' => ['void', 'serialized'=>'string'], + 'http\Message\Parser::getState' => ['int'], + 'http\Message\Parser::parse' => ['int', 'data'=>'string', 'flags'=>'int', '&message'=>'http\Message'], + 'http\Message\Parser::stream' => ['int', 'stream'=>'resource', 'flags'=>'int', '&message'=>'http\Message'], + 'http\Params::__construct' => ['void', 'params='=>'mixed', 'param_sep='=>'mixed', 'arg_sep='=>'mixed', 'val_sep='=>'mixed', 'flags='=>'mixed'], + 'http\Params::__toString' => ['string'], + 'http\Params::offsetExists' => ['bool', 'name'=>'mixed'], + 'http\Params::offsetGet' => ['mixed', 'name'=>'mixed'], + 'http\Params::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], + 'http\Params::offsetUnset' => ['void', 'name'=>'mixed'], + 'http\Params::toArray' => ['array'], + 'http\Params::toString' => ['string'], + 'http\QueryString::__construct' => ['void', 'querystring'=>'string'], + 'http\QueryString::__toString' => ['string'], + 'http\QueryString::get' => ['http\QueryString|string|mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool|false'], + 'http\QueryString::getArray' => ['array|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], + 'http\QueryString::getBool' => ['bool|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], + 'http\QueryString::getFloat' => ['float|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], + 'http\QueryString::getGlobalInstance' => ['http\QueryString'], + 'http\QueryString::getInt' => ['int|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], + 'http\QueryString::getIterator' => ['IteratorAggregate'], + 'http\QueryString::getObject' => ['object|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], + 'http\QueryString::getString' => ['string|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], + 'http\QueryString::mod' => ['http\QueryString', 'params='=>'mixed'], + 'http\QueryString::offsetExists' => ['bool', 'offset'=>'mixed'], + 'http\QueryString::offsetGet' => ['mixed|null', 'offset'=>'mixed'], + 'http\QueryString::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], + 'http\QueryString::offsetUnset' => ['void', 'offset'=>'mixed'], + 'http\QueryString::serialize' => ['string'], + 'http\QueryString::set' => ['http\QueryString', 'params'=>'mixed'], + 'http\QueryString::toArray' => ['array'], + 'http\QueryString::toString' => ['string'], + 'http\QueryString::unserialize' => ['void', 'serialized'=>'string'], + 'http\QueryString::xlate' => ['http\QueryString'], + 'http\Url::__construct' => ['void', 'old_url='=>'mixed', 'new_url='=>'mixed', 'flags='=>'int'], + 'http\Url::__toString' => ['string'], + 'http\Url::mod' => ['http\Url', 'parts'=>'mixed', 'flags='=>'float|int|mixed'], + 'http\Url::toArray' => ['string[]'], + 'http\Url::toString' => ['string'], + 'http_build_cookie' => ['string', 'cookie'=>'array'], + 'http_build_query' => ['string', 'data'=>'array|object', 'numeric_prefix='=>'string', 'arg_separator='=>'string', 'encoding_type='=>'int'], + 'http_build_str' => ['string', 'query'=>'array', 'prefix='=>'?string', 'arg_separator='=>'string'], + 'http_build_url' => ['string', 'url='=>'string|array', 'parts='=>'string|array', 'flags='=>'int', 'new_url='=>'array'], + 'http_cache_etag' => ['bool', 'etag='=>'string'], + 'http_cache_last_modified' => ['bool', 'timestamp_or_expires='=>'int'], + 'http_chunked_decode' => ['string|false', 'encoded'=>'string'], + 'http_date' => ['string', 'timestamp='=>'int'], + 'http_deflate' => ['?string', 'data'=>'string', 'flags='=>'int'], + 'http_get' => ['string', 'url'=>'string', 'options='=>'array', 'info='=>'array'], + 'http_get_request_body' => ['?string'], + 'http_get_request_body_stream' => ['?resource'], + 'http_get_request_headers' => ['array'], + 'http_head' => ['string', 'url'=>'string', 'options='=>'array', 'info='=>'array'], + 'http_inflate' => ['?string', 'data'=>'string'], + 'http_match_etag' => ['bool', 'etag'=>'string', 'for_range='=>'bool'], + 'http_match_modified' => ['bool', 'timestamp='=>'int', 'for_range='=>'bool'], + 'http_match_request_header' => ['bool', 'header'=>'string', 'value'=>'string', 'match_case='=>'bool'], + 'http_negotiate_charset' => ['string', 'supported'=>'array', 'result='=>'array'], + 'http_negotiate_content_type' => ['string', 'supported'=>'array', 'result='=>'array'], + 'http_negotiate_language' => ['string', 'supported'=>'array', 'result='=>'array'], + 'http_parse_cookie' => ['stdClass|false', 'cookie'=>'string', 'flags='=>'int', 'allowed_extras='=>'array'], + 'http_parse_headers' => ['array|false', 'header'=>'string'], + 'http_parse_message' => ['object', 'message'=>'string'], + 'http_parse_params' => ['stdClass', 'param'=>'string', 'flags='=>'int'], + 'http_persistent_handles_clean' => ['string', 'ident='=>'string'], + 'http_persistent_handles_count' => ['stdClass|false'], + 'http_persistent_handles_ident' => ['string|false', 'ident='=>'string'], + 'http_post_data' => ['string', 'url'=>'string', 'data'=>'string', 'options='=>'array', 'info='=>'array'], + 'http_post_fields' => ['string', 'url'=>'string', 'data'=>'array', 'files='=>'array', 'options='=>'array', 'info='=>'array'], + 'http_put_data' => ['string', 'url'=>'string', 'data'=>'string', 'options='=>'array', 'info='=>'array'], + 'http_put_file' => ['string', 'url'=>'string', 'file'=>'string', 'options='=>'array', 'info='=>'array'], + 'http_put_stream' => ['string', 'url'=>'string', 'stream'=>'resource', 'options='=>'array', 'info='=>'array'], + 'http_redirect' => ['int|false', 'url='=>'string', 'params='=>'array', 'session='=>'bool', 'status='=>'int'], + 'http_request' => ['string', 'method'=>'int', 'url'=>'string', 'body='=>'string', 'options='=>'array', 'info='=>'array'], + 'http_request_body_encode' => ['string|false', 'fields'=>'array', 'files'=>'array'], + 'http_request_method_exists' => ['bool', 'method'=>'mixed'], + 'http_request_method_name' => ['string|false', 'method'=>'int'], + 'http_request_method_register' => ['int|false', 'method'=>'string'], + 'http_request_method_unregister' => ['bool', 'method'=>'mixed'], + 'http_response_code' => ['int|bool', 'response_code='=>'int'], + 'http_send_content_disposition' => ['bool', 'filename'=>'string', 'inline='=>'bool'], + 'http_send_content_type' => ['bool', 'content_type='=>'string'], + 'http_send_data' => ['bool', 'data'=>'string'], + 'http_send_file' => ['bool', 'file'=>'string'], + 'http_send_last_modified' => ['bool', 'timestamp='=>'int'], + 'http_send_status' => ['bool', 'status'=>'int'], + 'http_send_stream' => ['bool', 'stream'=>'resource'], + 'http_support' => ['int', 'feature='=>'int'], + 'http_throttle' => ['void', 'sec'=>'float', 'bytes='=>'int'], + 'hw_Array2Objrec' => ['string', 'object_array'=>'array'], + 'hw_Children' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_ChildrenObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_Close' => ['bool', 'connection'=>'int'], + 'hw_Connect' => ['int', 'host'=>'string', 'port'=>'int', 'username='=>'string', 'password='=>'string'], + 'hw_Deleteobject' => ['bool', 'connection'=>'int', 'object_to_delete'=>'int'], + 'hw_DocByAnchor' => ['int', 'connection'=>'int', 'anchorid'=>'int'], + 'hw_DocByAnchorObj' => ['string', 'connection'=>'int', 'anchorid'=>'int'], + 'hw_Document_Attributes' => ['string', 'hw_document'=>'int'], + 'hw_Document_BodyTag' => ['string', 'hw_document'=>'int', 'prefix='=>'string'], + 'hw_Document_Content' => ['string', 'hw_document'=>'int'], + 'hw_Document_SetContent' => ['bool', 'hw_document'=>'int', 'content'=>'string'], + 'hw_Document_Size' => ['int', 'hw_document'=>'int'], + 'hw_EditText' => ['bool', 'connection'=>'int', 'hw_document'=>'int'], + 'hw_Error' => ['int', 'connection'=>'int'], + 'hw_ErrorMsg' => ['string', 'connection'=>'int'], + 'hw_Free_Document' => ['bool', 'hw_document'=>'int'], + 'hw_GetAnchors' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetAnchorsObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetAndLock' => ['string', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetChildColl' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetChildCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetChildDocColl' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetChildDocCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetObject' => ['', 'connection'=>'int', 'objectid'=>'', 'query='=>'string'], + 'hw_GetObjectByQuery' => ['array', 'connection'=>'int', 'query'=>'string', 'max_hits'=>'int'], + 'hw_GetObjectByQueryColl' => ['array', 'connection'=>'int', 'objectid'=>'int', 'query'=>'string', 'max_hits'=>'int'], + 'hw_GetObjectByQueryCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int', 'query'=>'string', 'max_hits'=>'int'], + 'hw_GetObjectByQueryObj' => ['array', 'connection'=>'int', 'query'=>'string', 'max_hits'=>'int'], + 'hw_GetParents' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetParentsObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetRemote' => ['int', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetSrcByDestObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], + 'hw_GetText' => ['int', 'connection'=>'int', 'objectid'=>'int', 'prefix='=>''], + 'hw_Identify' => ['string', 'link'=>'int', 'username'=>'string', 'password'=>'string'], + 'hw_InCollections' => ['array', 'connection'=>'int', 'object_id_array'=>'array', 'collection_id_array'=>'array', 'return_collections'=>'int'], + 'hw_Info' => ['string', 'connection'=>'int'], + 'hw_InsColl' => ['int', 'connection'=>'int', 'objectid'=>'int', 'object_array'=>'array'], + 'hw_InsDoc' => ['int', 'connection'=>'', 'parentid'=>'int', 'object_record'=>'string', 'text='=>'string'], + 'hw_InsertDocument' => ['int', 'connection'=>'int', 'parent_id'=>'int', 'hw_document'=>'int'], + 'hw_InsertObject' => ['int', 'connection'=>'int', 'object_rec'=>'string', 'parameter'=>'string'], + 'hw_Modifyobject' => ['bool', 'connection'=>'int', 'object_to_change'=>'int', 'remove'=>'array', 'add'=>'array', 'mode='=>'int'], + 'hw_New_Document' => ['int', 'object_record'=>'string', 'document_data'=>'string', 'document_size'=>'int'], + 'hw_Output_Document' => ['bool', 'hw_document'=>'int'], + 'hw_PipeDocument' => ['int', 'connection'=>'int', 'objectid'=>'int', 'url_prefixes='=>'array'], + 'hw_Root' => ['int'], + 'hw_Unlock' => ['bool', 'connection'=>'int', 'objectid'=>'int'], + 'hw_Who' => ['array', 'connection'=>'int'], + 'hw_api::checkin' => ['bool', 'parameter'=>'array'], + 'hw_api::checkout' => ['bool', 'parameter'=>'array'], + 'hw_api::children' => ['array', 'parameter'=>'array'], + 'hw_api::content' => ['HW_API_Content', 'parameter'=>'array'], + 'hw_api::copy' => ['hw_api_content', 'parameter'=>'array'], + 'hw_api::dbstat' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::dcstat' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::dstanchors' => ['array', 'parameter'=>'array'], + 'hw_api::dstofsrcanchor' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::find' => ['array', 'parameter'=>'array'], + 'hw_api::ftstat' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::hwstat' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::identify' => ['bool', 'parameter'=>'array'], + 'hw_api::info' => ['array', 'parameter'=>'array'], + 'hw_api::insert' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::insertanchor' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::insertcollection' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::insertdocument' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::link' => ['bool', 'parameter'=>'array'], + 'hw_api::lock' => ['bool', 'parameter'=>'array'], + 'hw_api::move' => ['bool', 'parameter'=>'array'], + 'hw_api::object' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::objectbyanchor' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::parents' => ['array', 'parameter'=>'array'], + 'hw_api::remove' => ['bool', 'parameter'=>'array'], + 'hw_api::replace' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::setcommittedversion' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::srcanchors' => ['array', 'parameter'=>'array'], + 'hw_api::srcsofdst' => ['array', 'parameter'=>'array'], + 'hw_api::unlock' => ['bool', 'parameter'=>'array'], + 'hw_api::user' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api::userlist' => ['array', 'parameter'=>'array'], + 'hw_api_attribute' => ['HW_API_Attribute', 'name='=>'string', 'value='=>'string'], + 'hw_api_attribute::key' => ['string'], + 'hw_api_attribute::langdepvalue' => ['string', 'language'=>'string'], + 'hw_api_attribute::value' => ['string'], + 'hw_api_attribute::values' => ['array'], + 'hw_api_content' => ['HW_API_Content', 'content'=>'string', 'mimetype'=>'string'], + 'hw_api_content::mimetype' => ['string'], + 'hw_api_content::read' => ['string', 'buffer'=>'string', 'length'=>'int'], + 'hw_api_error::count' => ['int'], + 'hw_api_error::reason' => ['HW_API_Reason'], + 'hw_api_object' => ['hw_api_object', 'parameter'=>'array'], + 'hw_api_object::assign' => ['bool', 'parameter'=>'array'], + 'hw_api_object::attreditable' => ['bool', 'parameter'=>'array'], + 'hw_api_object::count' => ['int', 'parameter'=>'array'], + 'hw_api_object::insert' => ['bool', 'attribute'=>'hw_api_attribute'], + 'hw_api_object::remove' => ['bool', 'name'=>'string'], + 'hw_api_object::title' => ['string', 'parameter'=>'array'], + 'hw_api_object::value' => ['string', 'name'=>'string'], + 'hw_api_reason::description' => ['string'], + 'hw_api_reason::type' => ['HW_API_Reason'], + 'hw_changeobject' => ['bool', 'link'=>'int', 'objid'=>'int', 'attributes'=>'array'], + 'hw_connection_info' => ['', 'link'=>'int'], + 'hw_cp' => ['int', 'connection'=>'int', 'object_id_array'=>'array', 'destination_id'=>'int'], + 'hw_dummy' => ['string', 'link'=>'int', 'id'=>'int', 'msgid'=>'int'], + 'hw_getrellink' => ['string', 'link'=>'int', 'rootid'=>'int', 'sourceid'=>'int', 'destid'=>'int'], + 'hw_getremotechildren' => ['', 'connection'=>'int', 'object_record'=>'string'], + 'hw_getusername' => ['string', 'connection'=>'int'], + 'hw_insertanchors' => ['bool', 'hwdoc'=>'int', 'anchorecs'=>'array', 'dest'=>'array', 'urlprefixes='=>'array'], + 'hw_mapid' => ['int', 'connection'=>'int', 'server_id'=>'int', 'object_id'=>'int'], + 'hw_mv' => ['int', 'connection'=>'int', 'object_id_array'=>'array', 'source_id'=>'int', 'destination_id'=>'int'], + 'hw_objrec2array' => ['array', 'object_record'=>'string', 'format='=>'array'], + 'hw_pConnect' => ['int', 'host'=>'string', 'port'=>'int', 'username='=>'string', 'password='=>'string'], + 'hw_setlinkroot' => ['int', 'link'=>'int', 'rootid'=>'int'], + 'hw_stat' => ['string', 'link'=>'int'], + 'hwapi_attribute_new' => ['HW_API_Attribute', 'name='=>'string', 'value='=>'string'], + 'hwapi_content_new' => ['HW_API_Content', 'content'=>'string', 'mimetype'=>'string'], + 'hwapi_hgcsp' => ['HW_API', 'hostname'=>'string', 'port='=>'int'], + 'hwapi_object_new' => ['hw_api_object', 'parameter'=>'array'], + 'hypot' => ['float', 'x'=>'float', 'y'=>'float'], + 'ibase_add_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password'=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], + 'ibase_affected_rows' => ['int', 'link_identifier='=>'resource'], + 'ibase_backup' => ['mixed', 'service_handle'=>'resource', 'source_db'=>'string', 'dest_file'=>'string', 'options='=>'int', 'verbose='=>'bool'], + 'ibase_blob_add' => ['void', 'blob_handle'=>'resource', 'data'=>'string'], + 'ibase_blob_cancel' => ['bool', 'blob_handle'=>'resource'], + 'ibase_blob_close' => ['string|bool', 'blob_handle'=>'resource'], + 'ibase_blob_create' => ['resource', 'link_identifier='=>'resource'], + 'ibase_blob_echo' => ['bool', 'link_identifier'=>'', 'blob_id'=>'string'], + 'ibase_blob_echo\'1' => ['bool', 'blob_id'=>'string'], + 'ibase_blob_get' => ['string|false', 'blob_handle'=>'resource', 'length'=>'int'], + 'ibase_blob_import' => ['string|false', 'link_identifier'=>'resource', 'file_handle'=>'resource'], + 'ibase_blob_info' => ['array', 'link_identifier'=>'resource', 'blob_id'=>'string'], + 'ibase_blob_info\'1' => ['array', 'blob_id'=>'string'], + 'ibase_blob_open' => ['resource|false', 'link_identifier'=>'', 'blob_id'=>'string'], + 'ibase_blob_open\'1' => ['resource', 'blob_id'=>'string'], + 'ibase_close' => ['bool', 'link_identifier='=>'resource'], + 'ibase_commit' => ['bool', 'link_identifier='=>'resource'], + 'ibase_commit_ret' => ['bool', 'link_identifier='=>'resource'], + 'ibase_connect' => ['resource|false', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'buffers='=>'int', 'dialect='=>'int', 'role='=>'string'], + 'ibase_db_info' => ['string', 'service_handle'=>'resource', 'db'=>'string', 'action'=>'int', 'argument='=>'int'], + 'ibase_delete_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password='=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], + 'ibase_drop_db' => ['bool', 'link_identifier='=>'resource'], + 'ibase_errcode' => ['int|false'], + 'ibase_errmsg' => ['string|false'], + 'ibase_execute' => ['resource|false', 'query'=>'resource', 'bind_arg='=>'mixed', '...args='=>'mixed'], + 'ibase_fetch_assoc' => ['array|false', 'result'=>'resource', 'fetch_flags='=>'int'], + 'ibase_fetch_object' => ['object|false', 'result'=>'resource', 'fetch_flags='=>'int'], + 'ibase_fetch_row' => ['array|false', 'result'=>'resource', 'fetch_flags='=>'int'], + 'ibase_field_info' => ['array', 'query_result'=>'resource', 'field_number'=>'int'], + 'ibase_free_event_handler' => ['bool', 'event'=>'resource'], + 'ibase_free_query' => ['bool', 'query'=>'resource'], + 'ibase_free_result' => ['bool', 'result'=>'resource'], + 'ibase_gen_id' => ['int|string', 'generator'=>'string', 'increment='=>'int', 'link_identifier='=>'resource'], + 'ibase_maintain_db' => ['bool', 'service_handle'=>'resource', 'db'=>'string', 'action'=>'int', 'argument='=>'int'], + 'ibase_modify_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password'=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], + 'ibase_name_result' => ['bool', 'result'=>'resource', 'name'=>'string'], + 'ibase_num_fields' => ['int', 'query_result'=>'resource'], + 'ibase_num_params' => ['int', 'query'=>'resource'], + 'ibase_num_rows' => ['int', 'result_identifier'=>''], + 'ibase_param_info' => ['array', 'query'=>'resource', 'field_number'=>'int'], + 'ibase_pconnect' => ['resource|false', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'buffers='=>'int', 'dialect='=>'int', 'role='=>'string'], + 'ibase_prepare' => ['resource|false', 'link_identifier'=>'', 'query'=>'string', 'trans_identifier'=>''], + 'ibase_query' => ['resource|false', 'link_identifier='=>'resource', 'string='=>'string', 'bind_arg='=>'int', '...args='=>''], + 'ibase_restore' => ['mixed', 'service_handle'=>'resource', 'source_file'=>'string', 'dest_db'=>'string', 'options='=>'int', 'verbose='=>'bool'], + 'ibase_rollback' => ['bool', 'link_identifier='=>'resource'], + 'ibase_rollback_ret' => ['bool', 'link_identifier='=>'resource'], + 'ibase_server_info' => ['string', 'service_handle'=>'resource', 'action'=>'int'], + 'ibase_service_attach' => ['resource', 'host'=>'string', 'dba_username'=>'string', 'dba_password'=>'string'], + 'ibase_service_detach' => ['bool', 'service_handle'=>'resource'], + 'ibase_set_event_handler' => ['resource', 'link_identifier'=>'', 'callback'=>'callable', 'event='=>'string', '...args='=>''], + 'ibase_set_event_handler\'1' => ['resource', 'callback'=>'callable', 'event'=>'string', '...args'=>''], + 'ibase_timefmt' => ['bool', 'format'=>'string', 'columntype='=>'int'], + 'ibase_trans' => ['resource|false', 'trans_args='=>'int', 'link_identifier='=>'', '...args='=>''], + 'ibase_wait_event' => ['string', 'link_identifier'=>'', 'event='=>'string', '...args='=>''], + 'ibase_wait_event\'1' => ['string', 'event'=>'string', '...args'=>''], + 'iconv' => ['string|false', 'from_encoding'=>'string', 'to_encoding'=>'string', 'string'=>'string'], + 'iconv_get_encoding' => ['mixed', 'type='=>'string'], + 'iconv_mime_decode' => ['string|false', 'string'=>'string', 'mode='=>'int', 'encoding='=>'string'], + 'iconv_mime_decode_headers' => ['array|false', 'headers'=>'string', 'mode='=>'int', 'encoding='=>'string'], + 'iconv_mime_encode' => ['string|false', 'field_name'=>'string', 'field_value'=>'string', 'options='=>'array'], + 'iconv_set_encoding' => ['bool', 'type'=>'string', 'encoding'=>'string'], + 'iconv_strlen' => ['0|positive-int|false', 'string'=>'string', 'encoding='=>'string'], + 'iconv_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], + 'iconv_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'], + 'iconv_substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int', 'encoding='=>'string'], + 'id3_get_frame_long_name' => ['string', 'frameid'=>'string'], + 'id3_get_frame_short_name' => ['string', 'frameid'=>'string'], + 'id3_get_genre_id' => ['int', 'genre'=>'string'], + 'id3_get_genre_list' => ['array'], + 'id3_get_genre_name' => ['string', 'genre_id'=>'int'], + 'id3_get_tag' => ['array', 'filename'=>'string', 'version='=>'int'], + 'id3_get_version' => ['int', 'filename'=>'string'], + 'id3_remove_tag' => ['bool', 'filename'=>'string', 'version='=>'int'], + 'id3_set_tag' => ['bool', 'filename'=>'string', 'tag'=>'array', 'version='=>'int'], + 'idate' => ['int', 'format'=>'string', 'timestamp='=>'int'], + 'idn_strerror' => ['string', 'errorcode'=>'int'], + 'idn_to_ascii' => ['string|false', 'domain'=>'string', 'flags='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'], + 'idn_to_utf8' => ['string|false', 'domain'=>'string', 'flags='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'], + 'ifx_affected_rows' => ['int', 'result_id'=>'resource'], + 'ifx_blobinfile_mode' => ['bool', 'mode'=>'int'], + 'ifx_byteasvarchar' => ['bool', 'mode'=>'int'], + 'ifx_close' => ['bool', 'link_identifier='=>'resource'], + 'ifx_connect' => ['resource', 'database='=>'string', 'userid='=>'string', 'password='=>'string'], + 'ifx_copy_blob' => ['int', 'bid'=>'int'], + 'ifx_create_blob' => ['int', 'type'=>'int', 'mode'=>'int', 'param'=>'string'], + 'ifx_create_char' => ['int', 'param'=>'string'], + 'ifx_do' => ['bool', 'result_id'=>'resource'], + 'ifx_error' => ['string', 'link_identifier='=>'resource'], + 'ifx_errormsg' => ['string', 'errorcode='=>'int'], + 'ifx_fetch_row' => ['array', 'result_id'=>'resource', 'position='=>'mixed'], + 'ifx_fieldproperties' => ['array', 'result_id'=>'resource'], + 'ifx_fieldtypes' => ['array', 'result_id'=>'resource'], + 'ifx_free_blob' => ['bool', 'bid'=>'int'], + 'ifx_free_char' => ['bool', 'bid'=>'int'], + 'ifx_free_result' => ['bool', 'result_id'=>'resource'], + 'ifx_get_blob' => ['string', 'bid'=>'int'], + 'ifx_get_char' => ['string', 'bid'=>'int'], + 'ifx_getsqlca' => ['array', 'result_id'=>'resource'], + 'ifx_htmltbl_result' => ['int', 'result_id'=>'resource', 'html_table_options='=>'string'], + 'ifx_nullformat' => ['bool', 'mode'=>'int'], + 'ifx_num_fields' => ['int', 'result_id'=>'resource'], + 'ifx_num_rows' => ['int', 'result_id'=>'resource'], + 'ifx_pconnect' => ['resource', 'database='=>'string', 'userid='=>'string', 'password='=>'string'], + 'ifx_prepare' => ['resource', 'query'=>'string', 'link_identifier'=>'resource', 'cursor_def='=>'int', 'blobidarray='=>'mixed'], + 'ifx_query' => ['resource', 'query'=>'string', 'link_identifier'=>'resource', 'cursor_type='=>'int', 'blobidarray='=>'mixed'], + 'ifx_textasvarchar' => ['bool', 'mode'=>'int'], + 'ifx_update_blob' => ['bool', 'bid'=>'int', 'content'=>'string'], + 'ifx_update_char' => ['bool', 'bid'=>'int', 'content'=>'string'], + 'ifxus_close_slob' => ['bool', 'bid'=>'int'], + 'ifxus_create_slob' => ['int', 'mode'=>'int'], + 'ifxus_free_slob' => ['bool', 'bid'=>'int'], + 'ifxus_open_slob' => ['int', 'bid'=>'int', 'mode'=>'int'], + 'ifxus_read_slob' => ['string', 'bid'=>'int', 'nbytes'=>'int'], + 'ifxus_seek_slob' => ['int', 'bid'=>'int', 'mode'=>'int', 'offset'=>'int'], + 'ifxus_tell_slob' => ['int', 'bid'=>'int'], + 'ifxus_write_slob' => ['int', 'bid'=>'int', 'content'=>'string'], + 'igbinary_serialize' => ['string|false', 'value'=>'mixed'], + 'igbinary_unserialize' => ['mixed', 'string'=>'string'], + 'ignore_user_abort' => ['int', 'enable='=>'bool'], + 'iis_add_server' => ['int', 'path'=>'string', 'comment'=>'string', 'server_ip'=>'string', 'port'=>'int', 'host_name'=>'string', 'rights'=>'int', 'start_server'=>'int'], + 'iis_get_dir_security' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string'], + 'iis_get_script_map' => ['string', 'server_instance'=>'int', 'virtual_path'=>'string', 'script_extension'=>'string'], + 'iis_get_server_by_comment' => ['int', 'comment'=>'string'], + 'iis_get_server_by_path' => ['int', 'path'=>'string'], + 'iis_get_server_rights' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string'], + 'iis_get_service_state' => ['int', 'service_id'=>'string'], + 'iis_remove_server' => ['int', 'server_instance'=>'int'], + 'iis_set_app_settings' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'application_scope'=>'string'], + 'iis_set_dir_security' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'directory_flags'=>'int'], + 'iis_set_script_map' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'script_extension'=>'string', 'engine_path'=>'string', 'allow_scripting'=>'int'], + 'iis_set_server_rights' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'directory_flags'=>'int'], + 'iis_start_server' => ['int', 'server_instance'=>'int'], + 'iis_start_service' => ['int', 'service_id'=>'string'], + 'iis_stop_server' => ['int', 'server_instance'=>'int'], + 'iis_stop_service' => ['int', 'service_id'=>'string'], + 'image2wbmp' => ['bool', 'im'=>'resource', 'filename='=>'?string', 'threshold='=>'int'], + 'imageObj::pasteImage' => ['void', 'srcImg'=>'imageObj', 'transparentColorHex'=>'int', 'dstX'=>'int', 'dstY'=>'int', 'angle'=>'int'], + 'imageObj::saveImage' => ['int', 'filename'=>'string', 'oMap'=>'mapObj'], + 'imageObj::saveWebImage' => ['string'], + 'image_type_to_extension' => ['string', 'image_type'=>'int', 'include_dot='=>'bool'], + 'image_type_to_mime_type' => ['string', 'image_type'=>'int'], + 'imageaffine' => ['resource|false', 'src'=>'resource', 'affine'=>'array', 'clip='=>'array'], + 'imageaffinematrixconcat' => ['array{0:float,1:float,2:float,3:float,4:float,5:float}|false', 'matrix1'=>'array', 'matrix2'=>'array'], + 'imageaffinematrixget' => ['array{0:float,1:float,2:float,3:float,4:float,5:float}|false', 'type'=>'int', 'options'=>'array|float'], + 'imagealphablending' => ['bool', 'image'=>'resource', 'enable'=>'bool'], + 'imageantialias' => ['bool', 'image'=>'resource', 'enable'=>'bool'], + 'imagearc' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int'], + 'imagechar' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], + 'imagecharup' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], + 'imagecolorallocate' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'imagecolorallocatealpha' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + 'imagecolorat' => ['int|false', 'image'=>'resource', 'x'=>'int', 'y'=>'int'], + 'imagecolorclosest' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'imagecolorclosestalpha' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + 'imagecolorclosesthwb' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'imagecolordeallocate' => ['bool', 'image'=>'resource', 'color'=>'int'], + 'imagecolorexact' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'imagecolorexactalpha' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + 'imagecolormatch' => ['bool', 'image1'=>'resource', 'image2'=>'resource'], + 'imagecolorresolve' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'imagecolorresolvealpha' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], + 'imagecolorset' => ['void', 'image'=>'resource', 'color'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], + 'imagecolorsforindex' => ['array|false', 'image'=>'resource', 'color'=>'int'], + 'imagecolorstotal' => ['int|false', 'image'=>'resource'], + 'imagecolortransparent' => ['int|false', 'image'=>'resource', 'color='=>'int'], + 'imageconvolution' => ['bool', 'image'=>'resource', 'matrix'=>'array', 'divisor'=>'float', 'offset'=>'float'], + 'imagecopy' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int'], + 'imagecopymerge' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], + 'imagecopymergegray' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], + 'imagecopyresampled' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], + 'imagecopyresized' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], + 'imagecreate' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'], + 'imagecreatefromgd' => ['resource|false', 'filename'=>'string'], + 'imagecreatefromgd2' => ['resource|false', 'filename'=>'string'], + 'imagecreatefromgd2part' => ['resource|false', 'filename'=>'string', 'srcx'=>'int', 'srcy'=>'int', 'width'=>'int', 'height'=>'int'], + 'imagecreatefromgif' => ['resource|false', 'filename'=>'string'], + 'imagecreatefromjpeg' => ['resource|false', 'filename'=>'string'], + 'imagecreatefrompng' => ['resource|false', 'filename'=>'string'], + 'imagecreatefromstring' => ['resource|false', 'image'=>'string'], + 'imagecreatefromwbmp' => ['resource|false', 'filename'=>'string'], + 'imagecreatefromwebp' => ['resource|false', 'filename'=>'string'], + 'imagecreatefromxbm' => ['resource|false', 'filename'=>'string'], + 'imagecreatefromxpm' => ['resource|false', 'filename'=>'string'], + 'imagecreatetruecolor' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'], + 'imagecrop' => ['resource|false', 'im'=>'resource', 'rect'=>'array'], + 'imagecropauto' => ['resource|false', 'im'=>'resource', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'], + 'imagedashedline' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + 'imagedestroy' => ['bool', 'image'=>'resource'], + 'imageellipse' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], + 'imagefill' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'color'=>'int'], + 'imagefilledarc' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int', 'style'=>'int'], + 'imagefilledellipse' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], + 'imagefilledpolygon' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], + 'imagefilledrectangle' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + 'imagefilltoborder' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'border_color'=>'int', 'color'=>'int'], + 'imagefilter' => ['bool', 'image'=>'resource', 'filter'=>'int', 'args='=>'int', 'arg2='=>'int', 'arg3='=>'int', 'arg4='=>'int'], + 'imageflip' => ['bool', 'image'=>'resource', 'mode'=>'int'], + 'imagefontheight' => ['int', 'font'=>'int'], + 'imagefontwidth' => ['int', 'font'=>'int'], + 'imageftbbox' => ['array|false', 'size'=>'float', 'angle'=>'float', 'font_filename'=>'string', 'string'=>'string', 'options='=>'array'], + 'imagefttext' => ['array|false', 'image'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string', 'options='=>'array'], + 'imagegammacorrect' => ['bool', 'image'=>'resource', 'input_gamma'=>'float', 'output_gamma'=>'float'], + 'imagegd' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null'], + 'imagegd2' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'chunk_size='=>'int', 'mode='=>'int'], + 'imagegetclip' => ['array|false', 'im'=>'resource'], + 'imagegif' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null'], + 'imagegrabscreen' => ['false|resource'], + 'imagegrabwindow' => ['false|resource', 'window_handle'=>'int', 'client_area='=>'int'], + 'imageinterlace' => ['int|false', 'image'=>'resource', 'enable='=>'int'], + 'imageistruecolor' => ['bool', 'image'=>'resource'], + 'imagejpeg' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int'], + 'imagelayereffect' => ['bool', 'image'=>'resource', 'effect'=>'int'], + 'imageline' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + 'imageloadfont' => ['int|false', 'filename'=>'string'], + 'imagepalettecopy' => ['void', 'dst'=>'resource', 'src'=>'resource'], + 'imagepalettetotruecolor' => ['bool', 'image'=>'resource'], + 'imagepng' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int', 'filters='=>'int'], + 'imagepolygon' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], + 'imagerectangle' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], + 'imagerotate' => ['resource|false', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'], + 'imagesavealpha' => ['bool', 'image'=>'resource', 'enable'=>'bool'], + 'imagescale' => ['resource|false', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'], + 'imagesetbrush' => ['bool', 'image'=>'resource', 'brush'=>'resource'], + 'imagesetinterpolation' => ['bool', 'image'=>'resource', 'method'=>'int'], + 'imagesetpixel' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'color'=>'int'], + 'imagesetstyle' => ['bool', 'image'=>'resource', 'style'=>'non-empty-array'], + 'imagesetthickness' => ['bool', 'image'=>'resource', 'thickness'=>'int'], + 'imagesettile' => ['bool', 'image'=>'resource', 'tile'=>'resource'], + 'imagestring' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], + 'imagestringup' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], + 'imagesx' => ['int|false', 'image'=>'resource'], + 'imagesy' => ['int|false', 'image'=>'resource'], + 'imagetruecolortopalette' => ['bool', 'image'=>'resource', 'dither'=>'bool', 'num_colors'=>'int'], + 'imagettfbbox' => ['false|array', 'size'=>'float', 'angle'=>'float', 'font_filename'=>'string', 'string'=>'string'], + 'imagettftext' => ['false|array', 'image'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string'], + 'imagetypes' => ['int'], + 'imagewbmp' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'foreground_color='=>'int'], + 'imagewebp' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int'], + 'imagexbm' => ['bool', 'image'=>'resource', 'filename='=>'?string', 'foreground_color='=>'int'], + 'imap_8bit' => ['string|false', 'string'=>'string'], + 'imap_alerts' => ['array|false'], + 'imap_append' => ['bool', 'imap'=>'resource', 'folder'=>'string', 'message'=>'string', 'options='=>'string', 'internal_date='=>'string'], + 'imap_base64' => ['string|false', 'string'=>'string'], + 'imap_binary' => ['string|false', 'string'=>'string'], + 'imap_body' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'imap_bodystruct' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string'], + 'imap_check' => ['stdClass|false', 'imap'=>'resource'], + 'imap_clearflag_full' => ['bool', 'imap'=>'resource', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], + 'imap_close' => ['bool', 'imap'=>'resource', 'flags='=>'int'], + 'imap_create' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], + 'imap_createmailbox' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], + 'imap_delete' => ['bool', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'imap_deletemailbox' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], + 'imap_errors' => ['array|false'], + 'imap_expunge' => ['bool', 'imap'=>'resource'], + 'imap_fetch_overview' => ['array|false', 'imap'=>'resource', 'sequence'=>'string', 'flags='=>'int'], + 'imap_fetchbody' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], + 'imap_fetchheader' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'imap_fetchmime' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], + 'imap_fetchstructure' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'imap_fetchtext' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'imap_gc' => ['bool', 'imap'=>'resource', 'flags'=>'int'], + 'imap_get_quota' => ['array|false', 'imap'=>'resource', 'quota_root'=>'string'], + 'imap_get_quotaroot' => ['array|false', 'imap'=>'resource', 'mailbox'=>'string'], + 'imap_getacl' => ['array|false', 'imap'=>'resource', 'mailbox'=>'string'], + 'imap_getmailboxes' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'imap_getsubscribed' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'imap_header' => ['stdClass|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string'], + 'imap_headerinfo' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string|null'], + 'imap_headers' => ['array|false', 'imap'=>'resource'], + 'imap_last_error' => ['string|false'], + 'imap_list' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'imap_listmailbox' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'imap_listscan' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], + 'imap_listsubscribed' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'imap_lsub' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], + 'imap_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string', 'cc='=>'string', 'bcc='=>'string', 'return_path='=>'string'], + 'imap_mail_compose' => ['string|false', 'envelope'=>'array', 'bodies'=>'array'], + 'imap_mail_copy' => ['bool', 'imap'=>'resource', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], + 'imap_mail_move' => ['bool', 'imap'=>'resource', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], + 'imap_mailboxmsginfo' => ['stdClass|false', 'imap'=>'resource'], + 'imap_mime_header_decode' => ['array|false', 'string'=>'string'], + 'imap_msgno' => ['int|false', 'imap'=>'resource', 'message_uid'=>'int'], + 'imap_mutf7_to_utf8' => ['string|false', 'string'=>'string'], + 'imap_num_msg' => ['int|false', 'imap'=>'resource'], + 'imap_num_recent' => ['int|false', 'imap'=>'resource'], + 'imap_open' => ['resource|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'flags='=>'int', 'retries='=>'int', 'options='=>'?array'], + 'imap_ping' => ['bool', 'imap'=>'resource'], + 'imap_qprint' => ['string|false', 'string'=>'string'], + 'imap_rename' => ['bool', 'imap'=>'resource', 'from'=>'string', 'to'=>'string'], + 'imap_renamemailbox' => ['bool', 'imap'=>'resource', 'from'=>'string', 'to'=>'string'], + 'imap_reopen' => ['bool', 'imap'=>'resource', 'mailbox'=>'string', 'flags='=>'int', 'retries='=>'int'], + 'imap_rfc822_parse_adrlist' => ['array', 'string'=>'string', 'default_hostname'=>'string'], + 'imap_rfc822_parse_headers' => ['stdClass', 'headers'=>'string', 'default_hostname='=>'string'], + 'imap_rfc822_write_address' => ['string|false', 'mailbox'=>'?string', 'hostname'=>'?string', 'personal'=>'?string'], + 'imap_savebody' => ['bool', 'imap'=>'resource', 'file'=>'string|resource', 'message_num'=>'int', 'section='=>'string', 'flags='=>'int'], + 'imap_scan' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], + 'imap_scanmailbox' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], + 'imap_search' => ['array|false', 'imap'=>'resource', 'criteria'=>'string', 'flags='=>'int', 'charset='=>'string'], + 'imap_set_quota' => ['bool', 'imap'=>'resource', 'quota_root'=>'string', 'mailbox_size'=>'int'], + 'imap_setacl' => ['bool', 'imap'=>'resource', 'mailbox'=>'string', 'user_id'=>'string', 'rights'=>'string'], + 'imap_setflag_full' => ['bool', 'imap'=>'resource', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], + 'imap_sort' => ['array|false', 'imap'=>'resource', 'criteria'=>'int', 'reverse'=>'int', 'flags='=>'int', 'search_criteria='=>'string', 'charset='=>'string'], + 'imap_status' => ['stdClass|false', 'imap'=>'resource', 'mailbox'=>'string', 'flags'=>'int'], + 'imap_subscribe' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], + 'imap_thread' => ['array|false', 'imap'=>'resource', 'flags='=>'int'], + 'imap_timeout' => ['int|bool', 'timeout_type'=>'int', 'timeout='=>'int'], + 'imap_uid' => ['int|false', 'imap'=>'resource', 'message_num'=>'int'], + 'imap_undelete' => ['bool', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], + 'imap_unsubscribe' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], + 'imap_utf7_decode' => ['string|false', 'string'=>'string'], + 'imap_utf7_encode' => ['string', 'string'=>'string'], + 'imap_utf8' => ['string', 'mime_encoded_text'=>'string'], + 'imap_utf8_to_mutf7' => ['string|false', 'string'=>'string'], + 'implode' => ['string', 'separator'=>'string', 'array'=>'array'], + 'implode\'1' => ['string', 'separator'=>'array'], + 'import_request_variables' => ['bool', 'types'=>'string', 'prefix='=>'string'], + 'in_array' => ['bool', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'], + 'inclued_get_data' => ['array'], + 'inet_ntop' => ['string|false', 'ip'=>'string'], + 'inet_pton' => ['string|false', 'ip'=>'string'], + 'inflate_add' => ['string|false', 'context'=>'resource', 'data'=>'string', 'flush_mode='=>'int'], + 'inflate_get_read_len' => ['int|false', 'context'=>'resource'], + 'inflate_get_status' => ['int|false', 'context'=>'resource'], + 'inflate_init' => ['resource|false', 'encoding'=>'int', 'options='=>'array'], + 'ingres_autocommit' => ['bool', 'link'=>'resource'], + 'ingres_autocommit_state' => ['bool', 'link'=>'resource'], + 'ingres_charset' => ['string', 'link'=>'resource'], + 'ingres_close' => ['bool', 'link'=>'resource'], + 'ingres_commit' => ['bool', 'link'=>'resource'], + 'ingres_connect' => ['resource', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'options='=>'array'], + 'ingres_cursor' => ['string', 'result'=>'resource'], + 'ingres_errno' => ['int', 'link='=>'resource'], + 'ingres_error' => ['string', 'link='=>'resource'], + 'ingres_errsqlstate' => ['string', 'link='=>'resource'], + 'ingres_escape_string' => ['string', 'link'=>'resource', 'source_string'=>'string'], + 'ingres_execute' => ['bool', 'result'=>'resource', 'params='=>'array', 'types='=>'string'], + 'ingres_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], + 'ingres_fetch_assoc' => ['array', 'result'=>'resource'], + 'ingres_fetch_object' => ['object', 'result'=>'resource', 'result_type='=>'int'], + 'ingres_fetch_proc_return' => ['int', 'result'=>'resource'], + 'ingres_fetch_row' => ['array', 'result'=>'resource'], + 'ingres_field_length' => ['int', 'result'=>'resource', 'index'=>'int'], + 'ingres_field_name' => ['string', 'result'=>'resource', 'index'=>'int'], + 'ingres_field_nullable' => ['bool', 'result'=>'resource', 'index'=>'int'], + 'ingres_field_precision' => ['int', 'result'=>'resource', 'index'=>'int'], + 'ingres_field_scale' => ['int', 'result'=>'resource', 'index'=>'int'], + 'ingres_field_type' => ['string', 'result'=>'resource', 'index'=>'int'], + 'ingres_free_result' => ['bool', 'result'=>'resource'], + 'ingres_next_error' => ['bool', 'link='=>'resource'], + 'ingres_num_fields' => ['int', 'result'=>'resource'], + 'ingres_num_rows' => ['int', 'result'=>'resource'], + 'ingres_pconnect' => ['resource', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'options='=>'array'], + 'ingres_prepare' => ['mixed', 'link'=>'resource', 'query'=>'string'], + 'ingres_query' => ['mixed', 'link'=>'resource', 'query'=>'string', 'params='=>'array', 'types='=>'string'], + 'ingres_result_seek' => ['bool', 'result'=>'resource', 'position'=>'int'], + 'ingres_rollback' => ['bool', 'link'=>'resource'], + 'ingres_set_environment' => ['bool', 'link'=>'resource', 'options'=>'array'], + 'ingres_unbuffered_query' => ['mixed', 'link'=>'resource', 'query'=>'string', 'params='=>'array', 'types='=>'string'], + 'ini_alter' => ['string|false', 'option'=>'string', 'value'=>'string'], + 'ini_get' => ['string|false', 'option'=>'string'], + 'ini_get_all' => ['array|false', 'extension='=>'?string', 'details='=>'bool'], + 'ini_restore' => ['void', 'option'=>'string'], + 'ini_set' => ['string|false', 'option'=>'string', 'value'=>'string'], + 'inotify_add_watch' => ['int', 'inotify_instance'=>'resource', 'pathname'=>'string', 'mask'=>'int'], + 'inotify_init' => ['resource|false'], + 'inotify_queue_len' => ['int', 'inotify_instance'=>'resource'], + 'inotify_read' => ['array|false', 'inotify_instance'=>'resource'], + 'inotify_rm_watch' => ['bool', 'inotify_instance'=>'resource', 'watch_descriptor'=>'int'], + 'intdiv' => ['int', 'num1'=>'int', 'num2'=>'int'], + 'interface_exists' => ['bool', 'interface'=>'string', 'autoload='=>'bool'], + 'intl_error_name' => ['string', 'errorCode'=>'int'], + 'intl_get_error_code' => ['int'], + 'intl_get_error_message' => ['string'], + 'intl_is_failure' => ['bool', 'errorCode'=>'int'], + 'intlcal_add' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int', 'value'=>'int'], + 'intlcal_after' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], + 'intlcal_before' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], + '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_get' => ['mixed', 'calendar'=>'IntlCalendar', 'field'=>'int'], + 'intlcal_get_actual_maximum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], + 'intlcal_get_actual_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], + 'intlcal_get_available_locales' => ['array'], + 'intlcal_get_day_of_week_type' => ['int', 'calendar'=>'IntlCalendar', 'dayOfWeek'=>'int'], + 'intlcal_get_first_day_of_week' => ['int', 'calendar'=>'IntlCalendar'], + 'intlcal_get_greatest_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], + 'intlcal_get_keyword_values_for_locale' => ['Iterator|false', 'keyword'=>'string', 'locale'=>'string', 'onlyCommon'=>'bool'], + 'intlcal_get_least_maximum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], + 'intlcal_get_locale' => ['string', 'calendar'=>'IntlCalendar', 'type'=>'int'], + 'intlcal_get_maximum' => ['int|false', 'calendar'=>'IntlCalendar', 'field'=>'int'], + 'intlcal_get_minimal_days_in_first_week' => ['int', 'calendar'=>'IntlCalendar'], + 'intlcal_get_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], + 'intlcal_get_now' => ['float'], + 'intlcal_get_repeated_wall_time_option' => ['int', 'calendar'=>'IntlCalendar'], + 'intlcal_get_skipped_wall_time_option' => ['int', 'calendar'=>'IntlCalendar'], + '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_in_daylight_time' => ['bool', 'calendar'=>'IntlCalendar'], + 'intlcal_is_equivalent_to' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], + 'intlcal_is_lenient' => ['bool', 'calendar'=>'IntlCalendar'], + 'intlcal_is_set' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int'], + 'intlcal_is_weekend' => ['bool', 'calendar'=>'IntlCalendar', 'timestamp='=>'float'], + 'intlcal_roll' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int', 'value'=>'mixed'], + 'intlcal_set' => ['bool', 'calendar'=>'IntlCalendar', 'year'=>'int', 'month'=>'int'], + '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_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_get_gregorian_change' => ['float', 'calendar'=>'IntlGregorianCalendar'], + 'intlgregcal_is_leap_year' => ['bool', 'calendar'=>'int'], + 'intlgregcal_set_gregorian_change' => ['void', 'calendar'=>'IntlGregorianCalendar', 'timestamp'=>'float'], + 'intltz_count_equivalent_ids' => ['int', 'timezoneId'=>'string'], + 'intltz_create_enumeration' => ['IntlIterator', 'countryOrRawOffset'=>'mixed'], + '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_dst_savings' => ['int', 'timezone'=>'IntlTimeZone'], + 'intltz_get_equivalent_id' => ['string', 'timezoneId'=>'string', 'offset'=>'int'], + 'intltz_get_error_code' => ['int', 'timezone'=>'IntlTimeZone'], + 'intltz_get_error_message' => ['string', 'timezone'=>'IntlTimeZone'], + 'intltz_get_id' => ['string', 'timezone'=>'IntlTimeZone'], + 'intltz_get_offset' => ['int', 'timezone'=>'IntlTimeZone', 'timestamp'=>'float', 'local'=>'bool', '&rawOffset'=>'int', '&dstOffset'=>'int'], + 'intltz_get_raw_offset' => ['int', 'timezone'=>'IntlTimeZone'], + 'intltz_get_tz_data_version' => ['string', 'object'=>'IntlTimeZone'], + 'intltz_has_same_rules' => ['bool', 'timezone'=>'IntlTimeZone', 'other'=>'IntlTimeZone'], + 'intltz_to_date_time_zone' => ['DateTimeZone', 'timezone'=>'IntlTimeZone'], + 'intltz_use_daylight_time' => ['bool', 'timezone'=>'IntlTimeZone'], + 'intlz_create_default' => ['IntlTimeZone'], + 'intval' => ['int', 'value'=>'mixed', 'base='=>'int'], + 'ip2long' => ['int|false', 'ip'=>'string'], + 'iptcembed' => ['string|bool', 'iptc_data'=>'string', 'filename'=>'string', 'spool='=>'int'], + 'iptcparse' => ['array|false', 'iptc_block'=>'string'], + 'is_a' => ['bool', 'object_or_class'=>'mixed', 'class'=>'string', 'allow_string='=>'bool'], + 'is_array' => ['bool', 'value'=>'mixed'], + 'is_bool' => ['bool', 'value'=>'mixed'], + 'is_callable' => ['bool', 'value'=>'callable|mixed', 'syntax_only='=>'bool', '&w_callable_name='=>'string'], + 'is_dir' => ['bool', 'filename'=>'string'], + 'is_double' => ['bool', 'value'=>'mixed'], + 'is_executable' => ['bool', 'filename'=>'string'], + 'is_file' => ['bool', 'filename'=>'string'], + 'is_finite' => ['bool', 'num'=>'float'], + 'is_float' => ['bool', 'value'=>'mixed'], + 'is_infinite' => ['bool', 'num'=>'float'], + 'is_int' => ['bool', 'value'=>'mixed'], + 'is_integer' => ['bool', 'value'=>'mixed'], + 'is_link' => ['bool', 'filename'=>'string'], + 'is_long' => ['bool', 'value'=>'mixed'], + 'is_nan' => ['bool', 'num'=>'float'], + 'is_null' => ['bool', 'value'=>'mixed'], + 'is_numeric' => ['bool', 'value'=>'mixed'], + 'is_object' => ['bool', 'value'=>'mixed'], + 'is_readable' => ['bool', 'filename'=>'string'], + 'is_real' => ['bool', 'value'=>'mixed'], + 'is_resource' => ['bool', 'value'=>'mixed'], + 'is_scalar' => ['bool', 'value'=>'mixed'], + 'is_soap_fault' => ['bool', 'object'=>'mixed'], + 'is_string' => ['bool', 'value'=>'mixed'], + 'is_subclass_of' => ['bool', 'object_or_class'=>'object|string', 'class'=>'class-string', 'allow_string='=>'bool'], + 'is_tainted' => ['bool', 'string'=>'string'], + 'is_uploaded_file' => ['bool', 'filename'=>'string'], + 'is_writable' => ['bool', 'filename'=>'string'], + 'is_writeable' => ['bool', 'filename'=>'string'], + 'isset' => ['bool', 'value'=>'mixed', '...rest='=>'mixed'], + 'iterator_apply' => ['0|positive-int', 'iterator'=>'Traversable', 'callback'=>'callable(mixed):bool', 'args='=>'array'], + 'iterator_count' => ['0|positive-int', 'iterator'=>'Traversable'], + 'iterator_to_array' => ['array', 'iterator'=>'Traversable', 'preserve_keys='=>'bool'], + 'java_last_exception_clear' => ['void'], + 'java_last_exception_get' => ['object'], + 'java_reload' => ['array', 'new_jarpath'=>'string'], + 'java_require' => ['array', 'new_classpath'=>'string'], + 'java_set_encoding' => ['array', 'encoding'=>'string'], + 'java_set_ignore_case' => ['void', 'ignore'=>'bool'], + 'java_throw_exceptions' => ['void', 'throw'=>'bool'], + 'jddayofweek' => ['mixed', 'julian_day'=>'int', 'mode='=>'int'], + 'jdmonthname' => ['string', 'julian_day'=>'int', 'mode'=>'int'], + 'jdtofrench' => ['string', 'julian_day'=>'int'], + 'jdtogregorian' => ['string', 'julian_day'=>'int'], + 'jdtojewish' => ['string', 'julian_day'=>'int', 'hebrew='=>'bool', 'flags='=>'int'], + 'jdtojulian' => ['string', 'julian_day'=>'int'], + 'jdtounix' => ['int|false', 'julian_day'=>'int'], + 'jewishtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], + 'jobqueue_license_info' => ['array'], + 'join' => ['string', 'separator'=>'string', 'array'=>'array'], + 'join\'1' => ['string', 'separator'=>'array'], + 'jpeg2wbmp' => ['bool', 'jpegname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'], + 'json_decode' => ['mixed', 'json'=>'string', 'associative='=>'bool', 'depth='=>'int', 'flags='=>'int'], + 'json_encode' => ['string|false', 'value'=>'mixed', 'flags='=>'int', 'depth='=>'int'], + 'json_last_error' => ['int'], + 'json_last_error_msg' => ['string'], + 'judy_type' => ['int', 'array'=>'judy'], + 'judy_version' => ['string'], + 'juliantojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], + 'kadm5_chpass_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'password'=>'string'], + 'kadm5_create_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'password='=>'string', 'options='=>'array'], + 'kadm5_delete_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string'], + 'kadm5_destroy' => ['bool', 'handle'=>'resource'], + 'kadm5_flush' => ['bool', 'handle'=>'resource'], + 'kadm5_get_policies' => ['array', 'handle'=>'resource'], + 'kadm5_get_principal' => ['array', 'handle'=>'resource', 'principal'=>'string'], + 'kadm5_get_principals' => ['array', 'handle'=>'resource'], + 'kadm5_init_with_password' => ['resource', 'admin_server'=>'string', 'realm'=>'string', 'principal'=>'string', 'password'=>'string'], + 'kadm5_modify_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'options'=>'array'], + 'key' => ['int|string|null', 'array'=>'array|object'], + 'key_exists' => ['bool', 'key'=>'string|int', 'array'=>'array'], + 'krsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], + 'ksort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], + 'labelObj::__construct' => ['void'], + 'labelObj::convertToString' => ['string'], + 'labelObj::deleteStyle' => ['int', 'index'=>'int'], + 'labelObj::free' => ['void'], + 'labelObj::getBinding' => ['string', 'labelbinding'=>'mixed'], + 'labelObj::getExpressionString' => ['string'], + 'labelObj::getStyle' => ['styleObj', 'index'=>'int'], + 'labelObj::getTextString' => ['string'], + 'labelObj::moveStyleDown' => ['int', 'index'=>'int'], + 'labelObj::moveStyleUp' => ['int', 'index'=>'int'], + 'labelObj::removeBinding' => ['int', 'labelbinding'=>'mixed'], + 'labelObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'labelObj::setBinding' => ['int', 'labelbinding'=>'mixed', 'value'=>'string'], + 'labelObj::setExpression' => ['int', 'expression'=>'string'], + 'labelObj::setText' => ['int', 'text'=>'string'], + 'labelObj::updateFromString' => ['int', 'snippet'=>'string'], + 'labelcacheObj::freeCache' => ['bool'], + 'layerObj::addFeature' => ['int', 'shape'=>'shapeObj'], + 'layerObj::applySLD' => ['int', 'sldxml'=>'string', 'namedlayer'=>'string'], + 'layerObj::applySLDURL' => ['int', 'sldurl'=>'string', 'namedlayer'=>'string'], + 'layerObj::clearProcessing' => ['void'], + 'layerObj::close' => ['void'], + 'layerObj::convertToString' => ['string'], + 'layerObj::draw' => ['int', 'image'=>'imageObj'], + 'layerObj::drawQuery' => ['int', 'image'=>'imageObj'], + 'layerObj::free' => ['void'], + 'layerObj::generateSLD' => ['string'], + 'layerObj::getClass' => ['classObj', 'classIndex'=>'int'], + 'layerObj::getClassIndex' => ['int', 'shape'=>'', 'classgroup'=>'', 'numclasses'=>''], + 'layerObj::getExtent' => ['rectObj'], + 'layerObj::getFilterString' => ['?string'], + 'layerObj::getGridIntersectionCoordinates' => ['array'], + 'layerObj::getItems' => ['array'], + 'layerObj::getMetaData' => ['int', 'name'=>'string'], + 'layerObj::getNumResults' => ['int'], + 'layerObj::getProcessing' => ['array'], + 'layerObj::getProjection' => ['string'], + 'layerObj::getResult' => ['resultObj', 'index'=>'int'], + 'layerObj::getResultsBounds' => ['rectObj'], + 'layerObj::getShape' => ['shapeObj', 'result'=>'resultObj'], + 'layerObj::getWMSFeatureInfoURL' => ['string', 'clickX'=>'int', 'clickY'=>'int', 'featureCount'=>'int', 'infoFormat'=>'string'], + 'layerObj::isVisible' => ['bool'], + 'layerObj::moveclassdown' => ['int', 'index'=>'int'], + 'layerObj::moveclassup' => ['int', 'index'=>'int'], + 'layerObj::ms_newLayerObj' => ['layerObj', 'map'=>'mapObj', 'layer'=>'layerObj'], + 'layerObj::nextShape' => ['shapeObj'], + 'layerObj::open' => ['int'], + 'layerObj::queryByAttributes' => ['int', 'qitem'=>'string', 'qstring'=>'string', 'mode'=>'int'], + 'layerObj::queryByFeatures' => ['int', 'slayer'=>'int'], + 'layerObj::queryByPoint' => ['int', 'point'=>'pointObj', 'mode'=>'int', 'buffer'=>'float'], + 'layerObj::queryByRect' => ['int', 'rect'=>'rectObj'], + 'layerObj::queryByShape' => ['int', 'shape'=>'shapeObj'], + 'layerObj::removeClass' => ['?classObj', 'index'=>'int'], + 'layerObj::removeMetaData' => ['int', 'name'=>'string'], + 'layerObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'layerObj::setConnectionType' => ['int', 'connectiontype'=>'int', 'plugin_library'=>'string'], + 'layerObj::setFilter' => ['int', 'expression'=>'string'], + 'layerObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], + 'layerObj::setProjection' => ['int', 'proj_params'=>'string'], + 'layerObj::setWKTProjection' => ['int', 'proj_params'=>'string'], + 'layerObj::updateFromString' => ['int', 'snippet'=>'string'], + 'lcfirst' => ['string', 'string'=>'string'], + 'lcg_value' => ['float'], + 'lchgrp' => ['bool', 'filename'=>'string', 'group'=>'string|int'], + 'lchown' => ['bool', 'filename'=>'string', 'user'=>'string|int'], + 'ldap_8859_to_t61' => ['string', 'value'=>'string'], + 'ldap_add' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], + 'ldap_add_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], + 'ldap_bind' => ['bool', 'ldap'=>'resource', 'dn='=>'string|null', 'password='=>'string|null'], + 'ldap_bind_ext' => ['resource|false', 'ldap'=>'resource', 'dn='=>'string|null', 'password='=>'string|null', 'controls='=>'array'], + 'ldap_close' => ['bool', 'ldap'=>'resource'], + 'ldap_compare' => ['bool|int', 'ldap'=>'resource', 'dn'=>'string', 'attribute'=>'string', 'value'=>'string'], + 'ldap_connect' => ['resource|false', 'uri='=>'string', 'port='=>'int', 'wallet='=>'string', 'password='=>'string', 'auth_mode='=>'int'], + 'ldap_control_paged_result' => ['bool', 'link_identifier'=>'resource', 'pagesize'=>'int', 'iscritical='=>'bool', 'cookie='=>'string'], + 'ldap_control_paged_result_response' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', '&w_cookie'=>'string', '&w_estimated'=>'int'], + 'ldap_count_entries' => ['int|false', 'ldap'=>'resource', 'result'=>'resource'], + 'ldap_delete' => ['bool', 'ldap'=>'resource', 'dn'=>'string'], + 'ldap_delete_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'controls='=>'array'], + 'ldap_dn2ufn' => ['string', 'dn'=>'string'], + 'ldap_err2str' => ['string', 'errno'=>'int'], + 'ldap_errno' => ['int', 'ldap'=>'resource'], + 'ldap_error' => ['string', 'ldap'=>'resource'], + 'ldap_escape' => ['string', 'value'=>'string', 'ignore='=>'string', 'flags='=>'int'], + 'ldap_explode_dn' => ['array|false', 'dn'=>'string', 'with_attrib'=>'int'], + 'ldap_first_attribute' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], + 'ldap_first_entry' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], + 'ldap_first_reference' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], + 'ldap_free_result' => ['bool', 'ldap'=>'resource'], + 'ldap_get_attributes' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource'], + 'ldap_get_dn' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], + 'ldap_get_entries' => ['array|false', 'ldap'=>'resource', 'result'=>'resource'], + 'ldap_get_option' => ['bool', 'ldap'=>'resource', 'option'=>'int', '&w_value'=>'mixed'], + 'ldap_get_values' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource', 'attribute'=>'string'], + 'ldap_get_values_len' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource', 'attribute'=>'string'], + 'ldap_list' => ['resource|false', 'ldap'=>'resource|array', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], + 'ldap_mod_add' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], + 'ldap_mod_add_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], + 'ldap_mod_del' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], + 'ldap_mod_del_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], + 'ldap_mod_replace' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], + 'ldap_mod_replace_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], + 'ldap_modify' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], + 'ldap_modify_batch' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'modifications_info'=>'array'], + 'ldap_next_attribute' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], + 'ldap_next_entry' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], + 'ldap_next_reference' => ['resource|false', 'ldap'=>'resource', 'entry'=>'resource'], + 'ldap_parse_reference' => ['bool', 'ldap'=>'resource', 'entry'=>'resource', 'referrals'=>'array'], + 'ldap_parse_result' => ['bool', 'ldap'=>'resource', 'result'=>'resource', '&w_error_code'=>'int', '&w_matched_dn='=>'string', '&w_error_message='=>'string', '&w_referrals='=>'array', '&w_controls='=>'array'], + 'ldap_read' => ['resource|false', 'ldap'=>'resource|array', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], + 'ldap_rename' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool'], + 'ldap_rename_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'array'], + 'ldap_sasl_bind' => ['bool', 'ldap'=>'resource', 'dn='=>'string', 'password='=>'string', 'mech='=>'string', 'realm='=>'string', 'authc_id='=>'string', 'authz_id='=>'string', 'props='=>'string'], + 'ldap_search' => ['resource|false', 'ldap'=>'resource|resource[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], + 'ldap_set_option' => ['bool', 'ldap'=>'resource|null', 'option'=>'int', 'value'=>'mixed'], + 'ldap_set_rebind_proc' => ['bool', 'ldap'=>'resource', 'callback'=>'callable'], + 'ldap_sort' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', 'sortfilter'=>'string'], + 'ldap_start_tls' => ['bool', 'ldap'=>'resource'], + 'ldap_t61_to_8859' => ['string', 'value'=>'string'], + 'ldap_unbind' => ['bool', 'ldap'=>'resource'], + 'leak' => ['', 'num_bytes'=>'int'], + 'leak_variable' => ['', 'variable'=>'', 'leak_data'=>'bool'], + 'legendObj::convertToString' => ['string'], + 'legendObj::free' => ['void'], + 'legendObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'legendObj::updateFromString' => ['int', 'snippet'=>'string'], + 'levenshtein' => ['int', 'string1'=>'string', 'string2'=>'string'], + 'levenshtein\'1' => ['int', 'string1'=>'string', 'string2'=>'string', 'insertion_cost'=>'int', 'repetition_cost'=>'int', 'deletion_cost'=>'int'], + 'libxml_clear_errors' => ['void'], + 'libxml_disable_entity_loader' => ['bool', 'disable='=>'bool'], + 'libxml_get_errors' => ['array'], + 'libxml_get_last_error' => ['LibXMLError|false'], + 'libxml_set_external_entity_loader' => ['bool', 'resolver_function'=>'callable'], + 'libxml_set_streams_context' => ['void', 'context'=>'resource'], + 'libxml_use_internal_errors' => ['bool', 'use_errors='=>'bool'], + 'lineObj::__construct' => ['void'], + 'lineObj::add' => ['int', 'point'=>'pointObj'], + 'lineObj::addXY' => ['int', 'x'=>'float', 'y'=>'float', 'm'=>'float'], + 'lineObj::addXYZ' => ['int', 'x'=>'float', 'y'=>'float', 'z'=>'float', 'm'=>'float'], + 'lineObj::ms_newLineObj' => ['lineObj'], + 'lineObj::point' => ['pointObj', 'i'=>'int'], + 'lineObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], + 'link' => ['bool', 'target'=>'string', 'link'=>'string'], + 'linkinfo' => ['int|false', 'path'=>'string'], + 'litespeed_request_headers' => ['array'], + 'litespeed_response_headers' => ['array'], + 'locale_accept_from_http' => ['string|false', 'header'=>'string'], + 'locale_canonicalize' => ['?string', 'locale'=>'string'], + 'locale_compose' => ['string|false', 'subtags'=>'array'], + 'locale_filter_matches' => ['?bool', 'languageTag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'], + 'locale_get_all_variants' => ['?array', 'locale'=>'string'], + 'locale_get_default' => ['string'], + 'locale_get_display_language' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], + 'locale_get_display_name' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], + 'locale_get_display_region' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], + 'locale_get_display_script' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], + 'locale_get_display_variant' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], + 'locale_get_keywords' => ['array|false|null', 'locale'=>'string'], + 'locale_get_primary_language' => ['?string', 'locale'=>'string'], + 'locale_get_region' => ['?string', 'locale'=>'string'], + 'locale_get_script' => ['?string', 'locale'=>'string'], + 'locale_lookup' => ['?string', 'languageTag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'defaultLocale='=>'string'], + 'locale_parse' => ['?array', 'locale'=>'string'], + 'locale_set_default' => ['bool', 'locale'=>'string'], + 'localeconv' => ['array'], + 'localtime' => ['array', 'timestamp='=>'int', 'associative='=>'bool'], + 'log' => ['float', 'num'=>'float', 'base='=>'float'], + 'log10' => ['float', 'num'=>'float'], + 'log1p' => ['float', 'num'=>'float'], + 'long2ip' => ['string', 'ip'=>'string|int'], + 'lstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'filename'=>'string'], + 'ltrim' => ['string', 'string'=>'string', 'characters='=>'string'], + 'lzf_compress' => ['string', 'data'=>'string'], + 'lzf_decompress' => ['string', 'data'=>'string'], + 'lzf_optimized_for' => ['int'], + 'm_checkstatus' => ['int', 'conn'=>'resource', 'identifier'=>'int'], + 'm_completeauthorizations' => ['int', 'conn'=>'resource', 'array'=>'int'], + 'm_connect' => ['int', 'conn'=>'resource'], + 'm_connectionerror' => ['string', 'conn'=>'resource'], + 'm_deletetrans' => ['bool', 'conn'=>'resource', 'identifier'=>'int'], + 'm_destroyconn' => ['bool', 'conn'=>'resource'], + 'm_destroyengine' => ['void'], + 'm_getcell' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column'=>'string', 'row'=>'int'], + 'm_getcellbynum' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column'=>'int', 'row'=>'int'], + 'm_getcommadelimited' => ['string', 'conn'=>'resource', 'identifier'=>'int'], + 'm_getheader' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column_num'=>'int'], + 'm_initconn' => ['resource'], + 'm_initengine' => ['int', 'location'=>'string'], + 'm_iscommadelimited' => ['int', 'conn'=>'resource', 'identifier'=>'int'], + 'm_maxconntimeout' => ['bool', 'conn'=>'resource', 'secs'=>'int'], + 'm_monitor' => ['int', 'conn'=>'resource'], + 'm_numcolumns' => ['int', 'conn'=>'resource', 'identifier'=>'int'], + 'm_numrows' => ['int', 'conn'=>'resource', 'identifier'=>'int'], + 'm_parsecommadelimited' => ['int', 'conn'=>'resource', 'identifier'=>'int'], + 'm_responsekeys' => ['array', 'conn'=>'resource', 'identifier'=>'int'], + 'm_responseparam' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'key'=>'string'], + 'm_returnstatus' => ['int', 'conn'=>'resource', 'identifier'=>'int'], + 'm_setblocking' => ['int', 'conn'=>'resource', 'tf'=>'int'], + 'm_setdropfile' => ['int', 'conn'=>'resource', 'directory'=>'string'], + 'm_setip' => ['int', 'conn'=>'resource', 'host'=>'string', 'port'=>'int'], + 'm_setssl' => ['int', 'conn'=>'resource', 'host'=>'string', 'port'=>'int'], + 'm_setssl_cafile' => ['int', 'conn'=>'resource', 'cafile'=>'string'], + 'm_setssl_files' => ['int', 'conn'=>'resource', 'sslkeyfile'=>'string', 'sslcertfile'=>'string'], + 'm_settimeout' => ['int', 'conn'=>'resource', 'seconds'=>'int'], + 'm_sslcert_gen_hash' => ['string', 'filename'=>'string'], + 'm_transactionssent' => ['int', 'conn'=>'resource'], + 'm_transinqueue' => ['int', 'conn'=>'resource'], + 'm_transkeyval' => ['int', 'conn'=>'resource', 'identifier'=>'int', 'key'=>'string', 'value'=>'string'], + 'm_transnew' => ['int', 'conn'=>'resource'], + 'm_transsend' => ['int', 'conn'=>'resource', 'identifier'=>'int'], + 'm_uwait' => ['int', 'microsecs'=>'int'], + 'm_validateidentifier' => ['int', 'conn'=>'resource', 'tf'=>'int'], + 'm_verifyconnection' => ['bool', 'conn'=>'resource', 'tf'=>'int'], + 'm_verifysslcert' => ['bool', 'conn'=>'resource', 'tf'=>'int'], + 'magic_quotes_runtime' => ['bool', 'new_setting'=>'bool'], + 'mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array|null', 'additional_params='=>'string'], + 'mailparse_determine_best_xfer_encoding' => ['string', 'fp'=>'resource'], + 'mailparse_msg_create' => ['resource'], + 'mailparse_msg_extract_part' => ['void', 'mimemail'=>'resource', 'msgbody'=>'string', 'callbackfunc='=>'callable'], + 'mailparse_msg_extract_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'mixed', 'callbackfunc='=>'callable'], + 'mailparse_msg_extract_whole_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'string', 'callbackfunc='=>'callable'], + 'mailparse_msg_free' => ['bool', 'mimemail'=>'resource'], + 'mailparse_msg_get_part' => ['resource', 'mimemail'=>'resource', 'mimesection'=>'string'], + 'mailparse_msg_get_part_data' => ['array', 'mimemail'=>'resource'], + 'mailparse_msg_get_structure' => ['array', 'mimemail'=>'resource'], + 'mailparse_msg_parse' => ['bool', 'mimemail'=>'resource', 'data'=>'string'], + 'mailparse_msg_parse_file' => ['resource|false', 'filename'=>'string'], + 'mailparse_rfc822_parse_addresses' => ['array', 'addresses'=>'string'], + 'mailparse_stream_encode' => ['bool', 'sourcefp'=>'resource', 'destfp'=>'resource', 'encoding'=>'string'], + 'mailparse_uudecode_all' => ['array', 'fp'=>'resource'], + 'mapObj::__construct' => ['void', 'map_file_name'=>'string', 'new_map_path'=>'string'], + 'mapObj::appendOutputFormat' => ['int', 'outputFormat'=>'outputformatObj'], + 'mapObj::applySLD' => ['int', 'sldxml'=>'string'], + 'mapObj::applySLDURL' => ['int', 'sldurl'=>'string'], + 'mapObj::applyconfigoptions' => ['int'], + 'mapObj::convertToString' => ['string'], + 'mapObj::draw' => ['?imageObj'], + 'mapObj::drawLabelCache' => ['int', 'image'=>'imageObj'], + 'mapObj::drawLegend' => ['imageObj'], + 'mapObj::drawQuery' => ['?imageObj'], + 'mapObj::drawReferenceMap' => ['imageObj'], + 'mapObj::drawScaleBar' => ['imageObj'], + 'mapObj::embedLegend' => ['int', 'image'=>'imageObj'], + 'mapObj::embedScalebar' => ['int', 'image'=>'imageObj'], + 'mapObj::free' => ['void'], + 'mapObj::generateSLD' => ['string'], + 'mapObj::getAllGroupNames' => ['array'], + 'mapObj::getAllLayerNames' => ['array'], + 'mapObj::getColorbyIndex' => ['colorObj', 'iCloIndex'=>'int'], + 'mapObj::getConfigOption' => ['string', 'key'=>'string'], + 'mapObj::getLabel' => ['labelcacheMemberObj', 'index'=>'int'], + 'mapObj::getLayer' => ['layerObj', 'index'=>'int'], + 'mapObj::getLayerByName' => ['layerObj', 'layer_name'=>'string'], + 'mapObj::getLayersDrawingOrder' => ['array'], + 'mapObj::getLayersIndexByGroup' => ['array', 'groupname'=>'string'], + 'mapObj::getMetaData' => ['int', 'name'=>'string'], + 'mapObj::getNumSymbols' => ['int'], + 'mapObj::getOutputFormat' => ['?outputformatObj', 'index'=>'int'], + 'mapObj::getProjection' => ['string'], + 'mapObj::getSymbolByName' => ['int', 'symbol_name'=>'string'], + 'mapObj::getSymbolObjectById' => ['symbolObj', 'symbolid'=>'int'], + 'mapObj::loadMapContext' => ['int', 'filename'=>'string', 'unique_layer_name'=>'bool'], + 'mapObj::loadOWSParameters' => ['int', 'request'=>'OwsrequestObj', 'version'=>'string'], + 'mapObj::moveLayerDown' => ['int', 'layerindex'=>'int'], + 'mapObj::moveLayerUp' => ['int', 'layerindex'=>'int'], + 'mapObj::ms_newMapObjFromString' => ['mapObj', 'map_file_string'=>'string', 'new_map_path'=>'string'], + 'mapObj::offsetExtent' => ['int', 'x'=>'float', 'y'=>'float'], + 'mapObj::owsDispatch' => ['int', 'request'=>'OwsrequestObj'], + 'mapObj::prepareImage' => ['imageObj'], + 'mapObj::prepareQuery' => ['void'], + 'mapObj::processLegendTemplate' => ['string', 'params'=>'array'], + 'mapObj::processQueryTemplate' => ['string', 'params'=>'array', 'generateimages'=>'bool'], + 'mapObj::processTemplate' => ['string', 'params'=>'array', 'generateimages'=>'bool'], + 'mapObj::queryByFeatures' => ['int', 'slayer'=>'int'], + 'mapObj::queryByIndex' => ['int', 'layerindex'=>'', 'tileindex'=>'', 'shapeindex'=>'', 'addtoquery'=>''], + 'mapObj::queryByPoint' => ['int', 'point'=>'pointObj', 'mode'=>'int', 'buffer'=>'float'], + 'mapObj::queryByRect' => ['int', 'rect'=>'rectObj'], + 'mapObj::queryByShape' => ['int', 'shape'=>'shapeObj'], + 'mapObj::removeLayer' => ['layerObj', 'nIndex'=>'int'], + 'mapObj::removeMetaData' => ['int', 'name'=>'string'], + 'mapObj::removeOutputFormat' => ['int', 'name'=>'string'], + 'mapObj::save' => ['int', 'filename'=>'string'], + 'mapObj::saveMapContext' => ['int', 'filename'=>'string'], + 'mapObj::saveQuery' => ['int', 'filename'=>'string', 'results'=>'int'], + 'mapObj::scaleExtent' => ['int', 'zoomfactor'=>'float', 'minscaledenom'=>'float', 'maxscaledenom'=>'float'], + 'mapObj::selectOutputFormat' => ['int', 'type'=>'string'], + 'mapObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'mapObj::setCenter' => ['int', 'center'=>'pointObj'], + 'mapObj::setConfigOption' => ['int', 'key'=>'string', 'value'=>'string'], + 'mapObj::setExtent' => ['void', 'minx'=>'float', 'miny'=>'float', 'maxx'=>'float', 'maxy'=>'float'], + 'mapObj::setFontSet' => ['int', 'fileName'=>'string'], + 'mapObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], + 'mapObj::setProjection' => ['int', 'proj_params'=>'string', 'bSetUnitsAndExtents'=>'bool'], + 'mapObj::setRotation' => ['int', 'rotation_angle'=>'float'], + 'mapObj::setSize' => ['int', 'width'=>'int', 'height'=>'int'], + 'mapObj::setSymbolSet' => ['int', 'fileName'=>'string'], + 'mapObj::setWKTProjection' => ['int', 'proj_params'=>'string', 'bSetUnitsAndExtents'=>'bool'], + 'mapObj::zoomPoint' => ['int', 'nZoomFactor'=>'int', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'], + 'mapObj::zoomRectangle' => ['int', 'oPixelExt'=>'rectObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'], + 'mapObj::zoomScale' => ['int', 'nScaleDenom'=>'float', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj', 'oMaxGeorefExt'=>'rectObj'], + 'max' => ['mixed', 'value'=>'non-empty-array'], + 'max\'1' => ['mixed', 'value'=>'', 'values'=>'', '...args='=>''], + 'maxdb::__construct' => ['void', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], + 'maxdb::affected_rows' => ['int', 'link'=>''], + 'maxdb::auto_commit' => ['bool', 'link'=>'', 'mode'=>'bool'], + 'maxdb::change_user' => ['bool', 'link'=>'', 'user'=>'string', 'password'=>'string', 'database'=>'string'], + 'maxdb::character_set_name' => ['string', 'link'=>''], + 'maxdb::close' => ['bool', 'link'=>''], + 'maxdb::commit' => ['bool', 'link'=>''], + 'maxdb::disable_reads_from_master' => ['', 'link'=>''], + 'maxdb::errno' => ['int', 'link'=>''], + 'maxdb::error' => ['string', 'link'=>''], + 'maxdb::field_count' => ['int', 'link'=>''], + 'maxdb::get_host_info' => ['string', 'link'=>''], + 'maxdb::info' => ['string', 'link'=>''], + 'maxdb::insert_id' => ['', 'link'=>''], + 'maxdb::kill' => ['bool', 'link'=>'', 'processid'=>'int'], + 'maxdb::more_results' => ['bool', 'link'=>''], + 'maxdb::multi_query' => ['bool', 'link'=>'', 'query'=>'string'], + 'maxdb::next_result' => ['bool', 'link'=>''], + 'maxdb::num_rows' => ['int', 'result'=>''], + 'maxdb::options' => ['bool', 'link'=>'', 'option'=>'int', 'value'=>''], + 'maxdb::ping' => ['bool', 'link'=>''], + 'maxdb::prepare' => ['maxdb_stmt', 'link'=>'', 'query'=>'string'], + 'maxdb::protocol_version' => ['string', 'link'=>''], + 'maxdb::query' => ['', 'link'=>'', 'query'=>'string', 'resultmode='=>'int'], + 'maxdb::real_connect' => ['bool', 'link'=>'', 'hostname='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], + 'maxdb::real_escape_string' => ['string', 'link'=>'', 'escapestr'=>'string'], + 'maxdb::real_query' => ['bool', 'link'=>'', 'query'=>'string'], + 'maxdb::rollback' => ['bool', 'link'=>''], + 'maxdb::rpl_query_type' => ['int', 'link'=>''], + 'maxdb::select_db' => ['bool', 'link'=>'', 'dbname'=>'string'], + 'maxdb::send_query' => ['bool', 'link'=>'', 'query'=>'string'], + 'maxdb::server_info' => ['string', 'link'=>''], + 'maxdb::server_version' => ['int', 'link'=>''], + 'maxdb::sqlstate' => ['string', 'link'=>''], + 'maxdb::ssl_set' => ['bool', 'link'=>'', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], + 'maxdb::stat' => ['string', 'link'=>''], + 'maxdb::stmt_init' => ['object', 'link'=>''], + 'maxdb::store_result' => ['bool', 'link'=>''], + 'maxdb::thread_id' => ['int', 'link'=>''], + 'maxdb::use_result' => ['resource', 'link'=>''], + 'maxdb::warning_count' => ['int', 'link'=>''], + 'maxdb_affected_rows' => ['int', 'link'=>'resource'], + 'maxdb_autocommit' => ['bool', 'link'=>'', 'mode'=>'bool'], + 'maxdb_change_user' => ['bool', 'link'=>'', 'user'=>'string', 'password'=>'string', 'database'=>'string'], + 'maxdb_character_set_name' => ['string', 'link'=>''], + 'maxdb_close' => ['bool', 'link'=>''], + 'maxdb_commit' => ['bool', 'link'=>''], + 'maxdb_connect' => ['resource', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], + 'maxdb_connect_errno' => ['int'], + 'maxdb_connect_error' => ['string'], + 'maxdb_data_seek' => ['bool', 'result'=>'', 'offset'=>'int'], + 'maxdb_debug' => ['void', 'debug'=>'string'], + 'maxdb_disable_reads_from_master' => ['', 'link'=>''], + 'maxdb_disable_rpl_parse' => ['bool', 'link'=>'resource'], + 'maxdb_dump_debug_info' => ['bool', 'link'=>'resource'], + 'maxdb_embedded_connect' => ['resource', 'dbname='=>'string'], + 'maxdb_enable_reads_from_master' => ['bool', 'link'=>'resource'], + 'maxdb_enable_rpl_parse' => ['bool', 'link'=>'resource'], + 'maxdb_errno' => ['int', 'link'=>'resource'], + 'maxdb_error' => ['string', 'link'=>'resource'], + 'maxdb_fetch_array' => ['', 'result'=>'', 'resulttype='=>'int'], + 'maxdb_fetch_assoc' => ['array', 'result'=>''], + 'maxdb_fetch_field' => ['', 'result'=>''], + 'maxdb_fetch_field_direct' => ['', 'result'=>'', 'fieldnr'=>'int'], + 'maxdb_fetch_fields' => ['', 'result'=>''], + 'maxdb_fetch_lengths' => ['array', 'result'=>'resource'], + 'maxdb_fetch_object' => ['object', 'result'=>'object'], + 'maxdb_fetch_row' => ['', 'result'=>''], + 'maxdb_field_count' => ['int', 'link'=>''], + 'maxdb_field_seek' => ['bool', 'result'=>'', 'fieldnr'=>'int'], + 'maxdb_field_tell' => ['int', 'result'=>'resource'], + 'maxdb_free_result' => ['', 'result'=>''], + 'maxdb_get_client_info' => ['string'], + 'maxdb_get_client_version' => ['int'], + 'maxdb_get_host_info' => ['string', 'link'=>'resource'], + 'maxdb_get_proto_info' => ['string', 'link'=>'resource'], + 'maxdb_get_server_info' => ['string', 'link'=>'resource'], + 'maxdb_get_server_version' => ['int', 'link'=>'resource'], + 'maxdb_info' => ['string', 'link'=>'resource'], + 'maxdb_init' => ['resource'], + 'maxdb_insert_id' => ['mixed', 'link'=>'resource'], + 'maxdb_kill' => ['bool', 'link'=>'', 'processid'=>'int'], + 'maxdb_master_query' => ['bool', 'link'=>'resource', 'query'=>'string'], + 'maxdb_more_results' => ['bool', 'link'=>'resource'], + 'maxdb_multi_query' => ['bool', 'link'=>'', 'query'=>'string'], + 'maxdb_next_result' => ['bool', 'link'=>'resource'], + 'maxdb_num_fields' => ['int', 'result'=>'resource'], + 'maxdb_num_rows' => ['int', 'result'=>'resource'], + 'maxdb_options' => ['bool', 'link'=>'', 'option'=>'int', 'value'=>''], + 'maxdb_ping' => ['bool', 'link'=>''], + 'maxdb_prepare' => ['maxdb_stmt', 'link'=>'', 'query'=>'string'], + 'maxdb_query' => ['', 'link'=>'', 'query'=>'string', 'resultmode='=>'int'], + 'maxdb_real_connect' => ['bool', 'link'=>'', 'hostname='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], + 'maxdb_real_escape_string' => ['string', 'link'=>'', 'escapestr'=>'string'], + 'maxdb_real_query' => ['bool', 'link'=>'', 'query'=>'string'], + 'maxdb_report' => ['bool', 'flags'=>'int'], + 'maxdb_result::current_field' => ['int', 'result'=>''], + 'maxdb_result::data_seek' => ['bool', 'result'=>'', 'offset'=>'int'], + 'maxdb_result::fetch_array' => ['', 'result'=>'', 'resulttype='=>'int'], + 'maxdb_result::fetch_assoc' => ['array', 'result'=>''], + 'maxdb_result::fetch_field' => ['', 'result'=>''], + 'maxdb_result::fetch_field_direct' => ['', 'result'=>'', 'fieldnr'=>'int'], + 'maxdb_result::fetch_fields' => ['', 'result'=>''], + 'maxdb_result::fetch_object' => ['object', 'result'=>'object'], + 'maxdb_result::fetch_row' => ['', 'result'=>''], + 'maxdb_result::field_count' => ['int', 'result'=>''], + 'maxdb_result::field_seek' => ['bool', 'result'=>'', 'fieldnr'=>'int'], + 'maxdb_result::free' => ['', 'result'=>''], + 'maxdb_result::lengths' => ['array', 'result'=>''], + 'maxdb_rollback' => ['bool', 'link'=>''], + 'maxdb_rpl_parse_enabled' => ['int', 'link'=>'resource'], + 'maxdb_rpl_probe' => ['bool', 'link'=>'resource'], + 'maxdb_rpl_query_type' => ['int', 'link'=>''], + 'maxdb_select_db' => ['bool', 'link'=>'resource', 'dbname'=>'string'], + 'maxdb_send_query' => ['bool', 'link'=>'', 'query'=>'string'], + 'maxdb_server_end' => ['void'], + 'maxdb_server_init' => ['bool', 'server='=>'array', 'groups='=>'array'], + 'maxdb_sqlstate' => ['string', 'link'=>'resource'], + 'maxdb_ssl_set' => ['bool', 'link'=>'', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], + 'maxdb_stat' => ['string', 'link'=>''], + 'maxdb_stmt::affected_rows' => ['int', 'stmt'=>''], + 'maxdb_stmt::bind_param' => ['bool', 'stmt'=>'', 'types'=>'string', '&...rw_var'=>''], + 'maxdb_stmt::bind_param\'1' => ['bool', 'stmt'=>'', 'types'=>'string', '&rw_var'=>'array'], + 'maxdb_stmt::bind_result' => ['bool', 'stmt'=>'', '&w_var1'=>'', '&...w_vars='=>''], + 'maxdb_stmt::close' => ['bool', 'stmt'=>''], + 'maxdb_stmt::close_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int'], + 'maxdb_stmt::data_seek' => ['bool', 'statement'=>'', 'offset'=>'int'], + 'maxdb_stmt::errno' => ['int', 'stmt'=>''], + 'maxdb_stmt::error' => ['string', 'stmt'=>''], + 'maxdb_stmt::execute' => ['bool', 'stmt'=>''], + 'maxdb_stmt::fetch' => ['bool', 'stmt'=>''], + 'maxdb_stmt::free_result' => ['', 'stmt'=>''], + 'maxdb_stmt::num_rows' => ['int', 'stmt'=>''], + 'maxdb_stmt::param_count' => ['int', 'stmt'=>''], + 'maxdb_stmt::prepare' => ['', 'stmt'=>'', 'query'=>'string'], + 'maxdb_stmt::reset' => ['bool', 'stmt'=>''], + 'maxdb_stmt::result_metadata' => ['resource', 'stmt'=>''], + 'maxdb_stmt::send_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int', 'data'=>'string'], + 'maxdb_stmt::stmt_send_long_data' => ['bool', 'param_nr'=>'int', 'data'=>'string'], + 'maxdb_stmt::store_result' => ['bool'], + 'maxdb_stmt_affected_rows' => ['int', 'stmt'=>'resource'], + 'maxdb_stmt_bind_param' => ['bool', 'stmt'=>'', 'types'=>'string', 'var1'=>'', '...args='=>'', 'var='=>'array'], + 'maxdb_stmt_bind_result' => ['bool', 'stmt'=>'', '&w_var1'=>'', '&...w_vars='=>''], + 'maxdb_stmt_close' => ['bool', 'stmt'=>''], + 'maxdb_stmt_close_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int'], + 'maxdb_stmt_data_seek' => ['bool', 'statement'=>'', 'offset'=>'int'], + 'maxdb_stmt_errno' => ['int', 'stmt'=>'resource'], + 'maxdb_stmt_error' => ['string', 'stmt'=>'resource'], + 'maxdb_stmt_execute' => ['bool', 'stmt'=>''], + 'maxdb_stmt_fetch' => ['bool', 'stmt'=>''], + 'maxdb_stmt_free_result' => ['', 'stmt'=>''], + 'maxdb_stmt_init' => ['object', 'link'=>''], + 'maxdb_stmt_num_rows' => ['int', 'stmt'=>'resource'], + 'maxdb_stmt_param_count' => ['int', 'stmt'=>'resource'], + 'maxdb_stmt_prepare' => ['', 'stmt'=>'', 'query'=>'string'], + 'maxdb_stmt_reset' => ['bool', 'stmt'=>''], + 'maxdb_stmt_result_metadata' => ['resource', 'stmt'=>''], + 'maxdb_stmt_send_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int', 'data'=>'string'], + 'maxdb_stmt_sqlstate' => ['string', 'stmt'=>'resource'], + 'maxdb_stmt_store_result' => ['bool', 'stmt'=>''], + 'maxdb_store_result' => ['bool', 'link'=>''], + 'maxdb_thread_id' => ['int', 'link'=>'resource'], + 'maxdb_thread_safe' => ['bool'], + 'maxdb_use_result' => ['resource', 'link'=>''], + 'maxdb_warning_count' => ['int', 'link'=>'resource'], + 'mb_check_encoding' => ['bool', 'value='=>'string', 'encoding='=>'string'], + 'mb_convert_case' => ['string', 'string'=>'string', 'mode'=>'int', 'encoding='=>'string'], + 'mb_convert_encoding' => ['string|false', 'string'=>'string', 'to_encoding'=>'string', 'from_encoding='=>'mixed'], + 'mb_convert_kana' => ['string', 'string'=>'string', 'mode='=>'string', 'encoding='=>'string'], + 'mb_convert_variables' => ['string|false', 'to_encoding'=>'string', 'from_encoding'=>'array|string', '&rw_var'=>'string|array|object', '&...rw_vars='=>'string|array|object'], + 'mb_decode_mimeheader' => ['string', 'string'=>'string'], + 'mb_decode_numericentity' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string'], + 'mb_detect_encoding' => ['string|false', 'string'=>'string', 'encodings='=>'mixed', 'strict='=>'bool'], + 'mb_detect_order' => ['bool|list', 'encoding='=>'mixed'], + 'mb_encode_mimeheader' => ['string', 'string'=>'string', 'charset='=>'string', 'transfer_encoding='=>'string', 'newline='=>'string', 'indent='=>'int'], + 'mb_encode_numericentity' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string', 'hex='=>'bool'], + 'mb_encoding_aliases' => ['list|false', 'encoding'=>'string'], + 'mb_ereg' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], + 'mb_ereg_match' => ['bool', 'pattern'=>'string', 'string'=>'string', 'options='=>'string'], + 'mb_ereg_replace' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string'], + 'mb_ereg_replace_callback' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable', 'string'=>'string', 'options='=>'string'], + 'mb_ereg_search' => ['bool', 'pattern='=>'string', 'options='=>'string'], + 'mb_ereg_search_getpos' => ['int'], + 'mb_ereg_search_getregs' => ['string[]|false'], + 'mb_ereg_search_init' => ['bool', 'string'=>'string', 'pattern='=>'string', 'options='=>'string'], + 'mb_ereg_search_pos' => ['int[]|false', 'pattern='=>'string', 'options='=>'string'], + 'mb_ereg_search_regs' => ['string[]|false', 'pattern='=>'string', 'options='=>'string'], + 'mb_ereg_search_setpos' => ['bool', 'offset'=>'int'], + 'mb_eregi' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array'], + 'mb_eregi_replace' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string'], + 'mb_get_info' => ['array|string|int|false', 'type='=>'string'], + 'mb_http_input' => ['string|false', 'type='=>'string'], + 'mb_http_output' => ['string|bool', 'encoding='=>'string'], + 'mb_internal_encoding' => ['string|bool', 'encoding='=>'string'], + 'mb_language' => ['string|bool', 'language='=>'string'], + 'mb_list_encodings' => ['list'], + 'mb_output_handler' => ['string', 'string'=>'string', 'status'=>'int'], + 'mb_parse_str' => ['bool', 'string'=>'string', '&w_result='=>'array'], + 'mb_preferred_mime_name' => ['string|false', 'encoding'=>'string'], + 'mb_regex_encoding' => ['string|bool', 'encoding='=>'string'], + 'mb_regex_set_options' => ['string', 'options='=>'string'], + 'mb_send_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array', 'additional_params='=>'string'], + 'mb_split' => ['list|false', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'], + 'mb_strcut' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'], + 'mb_strimwidth' => ['string', 'string'=>'string', 'start'=>'int', 'width'=>'int', 'trim_marker='=>'string', 'encoding='=>'string'], + 'mb_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], + 'mb_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], + 'mb_strlen' => ['0|positive-int', 'string'=>'string', 'encoding='=>'string'], + 'mb_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], + 'mb_strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], + 'mb_strrichr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], + 'mb_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], + 'mb_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], + 'mb_strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], + 'mb_strtolower' => ['lowercase-string', 'string'=>'string', 'encoding='=>'string'], + 'mb_strtoupper' => ['string', 'string'=>'string', 'encoding='=>'string'], + 'mb_strwidth' => ['int', 'string'=>'string', 'encoding='=>'string'], + 'mb_substitute_character' => ['bool|int|string', 'substitute_character='=>'mixed'], + 'mb_substr' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'], + 'mb_substr_count' => ['int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'], + 'mcrypt_cbc' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], + 'mcrypt_cfb' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], + 'mcrypt_create_iv' => ['string|false', 'size'=>'int', 'source='=>'int'], + 'mcrypt_decrypt' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'string', 'iv='=>'string'], + 'mcrypt_ecb' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], + 'mcrypt_enc_get_algorithms_name' => ['string', 'td'=>'resource'], + 'mcrypt_enc_get_block_size' => ['int', 'td'=>'resource'], + 'mcrypt_enc_get_iv_size' => ['int', 'td'=>'resource'], + 'mcrypt_enc_get_key_size' => ['int', 'td'=>'resource'], + 'mcrypt_enc_get_modes_name' => ['string', 'td'=>'resource'], + 'mcrypt_enc_get_supported_key_sizes' => ['array', 'td'=>'resource'], + 'mcrypt_enc_is_block_algorithm' => ['bool', 'td'=>'resource'], + 'mcrypt_enc_is_block_algorithm_mode' => ['bool', 'td'=>'resource'], + 'mcrypt_enc_is_block_mode' => ['bool', 'td'=>'resource'], + 'mcrypt_enc_self_test' => ['int|false', 'td'=>'resource'], + 'mcrypt_encrypt' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'string', 'iv='=>'string'], + 'mcrypt_generic' => ['string', 'td'=>'resource', 'data'=>'string'], + 'mcrypt_generic_deinit' => ['bool', 'td'=>'resource'], + 'mcrypt_generic_end' => ['bool', 'td'=>'resource'], + 'mcrypt_generic_init' => ['int|false', 'td'=>'resource', 'key'=>'string', 'iv'=>'string'], + 'mcrypt_get_block_size' => ['int', 'cipher'=>'int|string', 'module'=>'string'], + 'mcrypt_get_cipher_name' => ['string|false', 'cipher'=>'int|string'], + 'mcrypt_get_iv_size' => ['int|false', 'cipher'=>'int|string', 'module'=>'string'], + 'mcrypt_get_key_size' => ['int', 'cipher'=>'int|string', 'module'=>'string'], + 'mcrypt_list_algorithms' => ['array', 'lib_dir='=>'string'], + 'mcrypt_list_modes' => ['array', 'lib_dir='=>'string'], + 'mcrypt_module_close' => ['bool', 'td'=>'resource'], + 'mcrypt_module_get_algo_block_size' => ['int', 'algorithm'=>'string', 'lib_dir='=>'string'], + 'mcrypt_module_get_algo_key_size' => ['int', 'algorithm'=>'string', 'lib_dir='=>'string'], + 'mcrypt_module_get_supported_key_sizes' => ['array', 'algorithm'=>'string', 'lib_dir='=>'string'], + 'mcrypt_module_is_block_algorithm' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'], + 'mcrypt_module_is_block_algorithm_mode' => ['bool', 'mode'=>'string', 'lib_dir='=>'string'], + 'mcrypt_module_is_block_mode' => ['bool', 'mode'=>'string', 'lib_dir='=>'string'], + 'mcrypt_module_open' => ['resource|false', 'cipher'=>'string', 'cipher_directory'=>'string', 'mode'=>'string', 'mode_directory'=>'string'], + 'mcrypt_module_self_test' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'], + 'mcrypt_ofb' => ['string', 'cipher'=>'int|string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], + 'md5' => ['string', 'string'=>'string', 'binary='=>'bool'], + 'md5_file' => ['string|false', 'filename'=>'string', 'binary='=>'bool'], + 'mdecrypt_generic' => ['string', 'td'=>'resource', 'data'=>'string'], + 'memcache_add' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], + 'memcache_add_server' => ['bool', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable', 'timeoutms='=>'int'], + 'memcache_append' => ['', 'memcache_obj'=>'Memcache'], + 'memcache_cas' => ['', 'memcache_obj'=>'Memcache'], + 'memcache_close' => ['bool', 'memcache_obj'=>'Memcache'], + 'memcache_connect' => ['Memcache|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], + 'memcache_debug' => ['bool', 'on_off'=>'bool'], + 'memcache_decrement' => ['int', 'memcache_obj'=>'Memcache', 'key'=>'string', 'value='=>'int'], + 'memcache_delete' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'timeout='=>'int'], + 'memcache_flush' => ['bool', 'memcache_obj'=>'Memcache'], + 'memcache_get' => ['string', 'memcache_obj'=>'Memcache', 'key'=>'string', 'flags='=>'int'], + 'memcache_get\'1' => ['array', 'memcache_obj'=>'Memcache', 'key'=>'string[]', 'flags='=>'int[]'], + 'memcache_get_extended_stats' => ['array', 'memcache_obj'=>'Memcache', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], + 'memcache_get_server_status' => ['int', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int'], + 'memcache_get_stats' => ['array', 'memcache_obj'=>'Memcache', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], + 'memcache_get_version' => ['string', 'memcache_obj'=>'Memcache'], + 'memcache_increment' => ['int', 'memcache_obj'=>'Memcache', 'key'=>'string', 'value='=>'int'], + 'memcache_pconnect' => ['Memcache|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], + 'memcache_prepend' => ['string', 'memcache_obj'=>'Memcache'], + 'memcache_replace' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], + 'memcache_set' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], + 'memcache_set_compress_threshold' => ['bool', 'memcache_obj'=>'Memcache', 'threshold'=>'int', 'min_savings='=>'float'], + 'memcache_set_failure_callback' => ['', 'memcache_obj'=>'Memcache'], + 'memcache_set_server_params' => ['bool', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable'], + 'memory_get_peak_usage' => ['int', 'real_usage='=>'bool'], + 'memory_get_usage' => ['int', 'real_usage='=>'bool'], + 'metaphone' => ['string|false', 'string'=>'string', 'max_phonemes='=>'int'], + 'method_exists' => ['bool', 'object_or_class'=>'object|class-string|interface-string', 'method'=>'string'], + 'mhash' => ['string', 'algo'=>'int', 'data'=>'string', 'key='=>'string'], + 'mhash_count' => ['int'], + 'mhash_get_block_size' => ['int|false', 'algo'=>'int'], + 'mhash_get_hash_name' => ['string|false', 'algo'=>'int'], + 'mhash_keygen_s2k' => ['string|false', 'algo'=>'int', 'password'=>'string', 'salt'=>'string', 'length'=>'int'], + 'microtime' => ['string', 'as_float='=>'false'], + 'microtime\'1' => ['float', 'as_float='=>'true'], + 'mime_content_type' => ['string|false', 'filename'=>'string|resource'], + 'min' => ['mixed', 'value'=>'non-empty-array'], + 'min\'1' => ['mixed', 'value'=>'', 'values'=>'', '...args='=>''], + 'ming_keypress' => ['int', 'char'=>'string'], + 'ming_setcubicthreshold' => ['void', 'threshold'=>'int'], + 'ming_setscale' => ['void', 'scale'=>'float'], + 'ming_setswfcompression' => ['void', 'level'=>'int'], + 'ming_useconstants' => ['void', 'use'=>'int'], + 'ming_useswfversion' => ['void', 'version'=>'int'], + 'mkdir' => ['bool', 'directory'=>'string', 'permissions='=>'int', 'recursive='=>'bool', 'context='=>'resource'], + 'mktime' => ['int|false', 'hour='=>'int', 'minute='=>'int', 'second='=>'int', 'month='=>'int', 'day='=>'int', 'year='=>'int'], + 'money_format' => ['string', 'format'=>'string', 'value'=>'float'], + 'mongodb\driver\exception\commandexception::getResultDocument' => ['object'], + 'mongodb\driver\exception\runtimeexception::hasErrorLabel' => ['bool', 'errorLabel'=>'string'], + 'mongodb\driver\manager::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], + 'mongodb\driver\manager::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], + 'mongodb\driver\manager::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], + 'mongodb\driver\manager::startSession' => ['MongoDB\Driver\Session', 'options='=>'array'], + 'mongodb\driver\monitoring\commandfailedevent::getCommandName' => ['string'], + 'mongodb\driver\monitoring\commandfailedevent::getDurationMicros' => ['int'], + 'mongodb\driver\monitoring\commandfailedevent::getError' => ['Exception'], + 'mongodb\driver\monitoring\commandfailedevent::getOperationId' => ['string'], + 'mongodb\driver\monitoring\commandfailedevent::getReply' => ['object'], + 'mongodb\driver\monitoring\commandfailedevent::getRequestId' => ['string'], + 'mongodb\driver\monitoring\commandfailedevent::getServer' => ['MongoDB\Driver\Server'], + 'mongodb\driver\monitoring\commandstartedevent::getCommand' => ['object'], + 'mongodb\driver\monitoring\commandstartedevent::getCommandName' => ['string'], + 'mongodb\driver\monitoring\commandstartedevent::getDatabaseName' => ['string'], + 'mongodb\driver\monitoring\commandstartedevent::getOperationId' => ['string'], + 'mongodb\driver\monitoring\commandstartedevent::getRequestId' => ['string'], + 'mongodb\driver\monitoring\commandstartedevent::getServer' => ['MongoDB\Driver\Server'], + 'mongodb\driver\monitoring\commandsubscriber::commandFailed' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandFailedEvent'], + 'mongodb\driver\monitoring\commandsubscriber::commandStarted' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandStartedEvent'], + 'mongodb\driver\monitoring\commandsubscriber::commandSucceeded' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandSucceededEvent'], + 'mongodb\driver\monitoring\commandsucceededevent::getCommandName' => ['string'], + 'mongodb\driver\monitoring\commandsucceededevent::getDurationMicros' => ['int'], + 'mongodb\driver\monitoring\commandsucceededevent::getOperationId' => ['string'], + 'mongodb\driver\monitoring\commandsucceededevent::getReply' => ['object'], + 'mongodb\driver\monitoring\commandsucceededevent::getRequestId' => ['string'], + 'mongodb\driver\monitoring\commandsucceededevent::getServer' => ['MongoDB\Driver\Server'], + 'mongodb\driver\server::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], + 'mongodb\driver\server::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], + 'mongodb\driver\server::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], + 'mongodb\driver\session::__construct' => ['void'], + 'mongodb\driver\session::abortTransaction' => ['void'], + 'mongodb\driver\session::advanceClusterTime' => ['void', 'clusterTime'=>'array|object'], + 'mongodb\driver\session::advanceOperationTime' => ['void', 'operationTime'=>'MongoDB\BSON\TimestampInterface'], + 'mongodb\driver\session::commitTransaction' => ['void'], + 'mongodb\driver\session::endSession' => ['void'], + 'mongodb\driver\session::getClusterTime' => ['?object'], + 'mongodb\driver\session::getLogicalSessionId' => ['object'], + 'mongodb\driver\session::getOperationTime' => ['MongoDB\BSON\Timestamp|null'], + 'mongodb\driver\session::getTransactionOptions' => ['array|null'], + 'mongodb\driver\session::getTransactionState' => ['string'], + 'mongodb\driver\session::startTransaction' => ['void', 'options'=>'array|object'], + 'monitor_custom_event' => ['void', 'class'=>'string', 'text'=>'string', 'severe='=>'int', 'user_data='=>'mixed'], + 'monitor_httperror_event' => ['void', 'error_code'=>'int', 'url'=>'string', 'severe='=>'int'], + 'monitor_license_info' => ['array'], + 'monitor_pass_error' => ['void', 'errno'=>'int', 'errstr'=>'string', 'errfile'=>'string', 'errline'=>'int'], + 'monitor_set_aggregation_hint' => ['void', 'hint'=>'string'], + 'move_uploaded_file' => ['bool', 'from'=>'string', 'to'=>'string'], + 'mqseries_back' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_begin' => ['void', 'hconn'=>'resource', 'beginoptions'=>'array', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_close' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'options'=>'int', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_cmit' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_conn' => ['void', 'qmanagername'=>'string', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_connx' => ['void', 'qmanagername'=>'string', 'connoptions'=>'array', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_disc' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_get' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'md'=>'array', 'gmo'=>'array', 'bufferlength'=>'int', 'msg'=>'string', 'data_length'=>'int', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_inq' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'selectorcount'=>'int', 'selectors'=>'array', 'intattrcount'=>'int', 'intattr'=>'resource', 'charattrlength'=>'int', 'charattr'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_open' => ['void', 'hconn'=>'resource', 'objdesc'=>'array', 'option'=>'int', 'hobj'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_put' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'md'=>'array', 'pmo'=>'array', 'message'=>'string', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_put1' => ['void', 'hconn'=>'resource', 'objdesc'=>'resource', 'msgdesc'=>'resource', 'pmo'=>'resource', 'buffer'=>'string', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_set' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'selectorcount'=>'int', 'selectors'=>'array', 'intattrcount'=>'int', 'intattrs'=>'array', 'charattrlength'=>'int', 'charattrs'=>'array', 'compcode'=>'resource', 'reason'=>'resource'], + 'mqseries_strerror' => ['string', 'reason'=>'int'], + 'ms_GetErrorObj' => ['errorObj'], + 'ms_GetVersion' => ['string'], + 'ms_GetVersionInt' => ['int'], + 'ms_ResetErrorList' => ['void'], + 'ms_TokenizeMap' => ['array', 'map_file_name'=>'string'], + 'ms_iogetStdoutBufferBytes' => ['int'], + 'ms_iogetstdoutbufferstring' => ['void'], + 'ms_ioinstallstdinfrombuffer' => ['void'], + 'ms_ioinstallstdouttobuffer' => ['void'], + 'ms_ioresethandlers' => ['void'], + 'ms_iostripstdoutbuffercontentheaders' => ['void'], + 'ms_iostripstdoutbuffercontenttype' => ['string'], + 'msession_connect' => ['bool', 'host'=>'string', 'port'=>'string'], + 'msession_count' => ['int'], + 'msession_create' => ['bool', 'session'=>'string', 'classname='=>'string', 'data='=>'string'], + 'msession_destroy' => ['bool', 'name'=>'string'], + 'msession_disconnect' => ['void'], + 'msession_find' => ['array', 'name'=>'string', 'value'=>'string'], + 'msession_get' => ['string', 'session'=>'string', 'name'=>'string', 'value'=>'string'], + 'msession_get_array' => ['array', 'session'=>'string'], + 'msession_get_data' => ['string', 'session'=>'string'], + 'msession_inc' => ['string', 'session'=>'string', 'name'=>'string'], + 'msession_list' => ['array'], + 'msession_listvar' => ['array', 'name'=>'string'], + 'msession_lock' => ['int', 'name'=>'string'], + 'msession_plugin' => ['string', 'session'=>'string', 'value'=>'string', 'param='=>'string'], + 'msession_randstr' => ['string', 'param'=>'int'], + 'msession_set' => ['bool', 'session'=>'string', 'name'=>'string', 'value'=>'string'], + 'msession_set_array' => ['void', 'session'=>'string', 'tuples'=>'array'], + 'msession_set_data' => ['bool', 'session'=>'string', 'value'=>'string'], + 'msession_timeout' => ['int', 'session'=>'string', 'param='=>'int'], + 'msession_uniq' => ['string', 'param'=>'int', 'classname='=>'string', 'data='=>'string'], + 'msession_unlock' => ['int', 'session'=>'string', 'key'=>'int'], + 'msg_get_queue' => ['resource', 'key'=>'int', 'permissions='=>'int'], + 'msg_queue_exists' => ['bool', 'key'=>'int'], + 'msg_receive' => ['bool', 'queue'=>'resource', 'desired_message_type'=>'int', '&w_received_message_type'=>'int', 'max_message_size'=>'int', '&w_message'=>'mixed', 'unserialize='=>'bool', 'flags='=>'int', '&w_error_code='=>'int'], + 'msg_remove_queue' => ['bool', 'queue'=>'resource'], + 'msg_send' => ['bool', 'queue'=>'resource', 'message_type'=>'int', 'message'=>'mixed', 'serialize='=>'bool', 'blocking='=>'bool', '&w_error_code='=>'int'], + 'msg_set_queue' => ['bool', 'queue'=>'resource', 'data'=>'array'], + 'msg_stat_queue' => ['array', 'queue'=>'resource'], + 'msgfmt_create' => ['?MessageFormatter', 'locale'=>'string', 'pattern'=>'string'], + 'msgfmt_format' => ['string|false', 'formatter'=>'MessageFormatter', 'values'=>'array'], + 'msgfmt_format_message' => ['string|false', 'locale'=>'string', 'pattern'=>'string', 'values'=>'array'], + 'msgfmt_get_error_code' => ['int', 'formatter'=>'MessageFormatter'], + 'msgfmt_get_error_message' => ['string', 'formatter'=>'MessageFormatter'], + 'msgfmt_get_locale' => ['string', 'formatter'=>'MessageFormatter'], + 'msgfmt_get_pattern' => ['string', 'formatter'=>'MessageFormatter'], + 'msgfmt_parse' => ['array|false', 'formatter'=>'MessageFormatter', 'string'=>'string'], + 'msgfmt_parse_message' => ['array|false', 'locale'=>'string', 'pattern'=>'string', 'message'=>'string'], + 'msgfmt_set_pattern' => ['bool', 'formatter'=>'MessageFormatter', 'pattern'=>'string'], + 'msql_affected_rows' => ['int', 'result'=>'resource'], + 'msql_close' => ['bool', 'link_identifier='=>'?resource'], + 'msql_connect' => ['resource', 'hostname='=>'string'], + 'msql_create_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], + 'msql_data_seek' => ['bool', 'result'=>'resource', 'row_number'=>'int'], + 'msql_db_query' => ['resource', 'database'=>'string', 'query'=>'string', 'link_identifier='=>'?resource'], + 'msql_drop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], + 'msql_error' => ['string'], + 'msql_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], + 'msql_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], + 'msql_fetch_object' => ['object', 'result'=>'resource'], + 'msql_fetch_row' => ['array', 'result'=>'resource'], + 'msql_field_flags' => ['string', 'result'=>'resource', 'field_offset'=>'int'], + 'msql_field_len' => ['int', 'result'=>'resource', 'field_offset'=>'int'], + 'msql_field_name' => ['string', 'result'=>'resource', 'field_offset'=>'int'], + 'msql_field_seek' => ['bool', 'result'=>'resource', 'field_offset'=>'int'], + 'msql_field_table' => ['int', 'result'=>'resource', 'field_offset'=>'int'], + 'msql_field_type' => ['string', 'result'=>'resource', 'field_offset'=>'int'], + 'msql_free_result' => ['bool', 'result'=>'resource'], + 'msql_list_dbs' => ['resource', 'link_identifier='=>'?resource'], + 'msql_list_fields' => ['resource', 'database'=>'string', 'tablename'=>'string', 'link_identifier='=>'?resource'], + 'msql_list_tables' => ['resource', 'database'=>'string', 'link_identifier='=>'?resource'], + 'msql_num_fields' => ['int', 'result'=>'resource'], + 'msql_num_rows' => ['int', 'query_identifier'=>'resource'], + 'msql_pconnect' => ['resource', 'hostname='=>'string'], + 'msql_query' => ['resource', 'query'=>'string', 'link_identifier='=>'?resource'], + 'msql_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field='=>'mixed'], + 'msql_select_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], + 'mt_getrandmax' => ['int'], + 'mt_rand' => ['int', 'min'=>'int', 'max'=>'int'], + 'mt_rand\'1' => ['int'], + 'mt_srand' => ['void', 'seed='=>'int', 'mode='=>'int'], + 'mysql_xdevapi\baseresult::getWarnings' => ['array'], + 'mysql_xdevapi\baseresult::getWarningsCount' => ['integer'], + 'mysql_xdevapi\collection::add' => ['mysql_xdevapi\CollectionAdd', 'document'=>'mixed'], + 'mysql_xdevapi\collection::addOrReplaceOne' => ['mysql_xdevapi\Result', 'id'=>'string', 'doc'=>'string'], + 'mysql_xdevapi\collection::count' => ['integer'], + 'mysql_xdevapi\collection::createIndex' => ['void', 'index_name'=>'string', 'index_desc_json'=>'string'], + 'mysql_xdevapi\collection::dropIndex' => ['bool', 'index_name'=>'string'], + 'mysql_xdevapi\collection::existsInDatabase' => ['bool'], + 'mysql_xdevapi\collection::find' => ['mysql_xdevapi\CollectionFind', 'search_condition='=>'string'], + 'mysql_xdevapi\collection::getName' => ['string'], + 'mysql_xdevapi\collection::getOne' => ['Document', 'id'=>'string'], + 'mysql_xdevapi\collection::getSchema' => ['mysql_xdevapi\schema'], + 'mysql_xdevapi\collection::getSession' => ['Session'], + 'mysql_xdevapi\collection::modify' => ['mysql_xdevapi\CollectionModify', 'search_condition'=>'string'], + 'mysql_xdevapi\collection::remove' => ['mysql_xdevapi\CollectionRemove', 'search_condition'=>'string'], + 'mysql_xdevapi\collection::removeOne' => ['mysql_xdevapi\Result', 'id'=>'string'], + 'mysql_xdevapi\collection::replaceOne' => ['mysql_xdevapi\Result', 'id'=>'string', 'doc'=>'string'], + 'mysql_xdevapi\collectionadd::execute' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\collectionfind::bind' => ['mysql_xdevapi\CollectionFind', 'placeholder_values'=>'array'], + 'mysql_xdevapi\collectionfind::execute' => ['mysql_xdevapi\DocResult'], + 'mysql_xdevapi\collectionfind::fields' => ['mysql_xdevapi\CollectionFind', 'projection'=>'string'], + 'mysql_xdevapi\collectionfind::groupBy' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], + 'mysql_xdevapi\collectionfind::having' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], + 'mysql_xdevapi\collectionfind::limit' => ['mysql_xdevapi\CollectionFind', 'rows'=>'integer'], + 'mysql_xdevapi\collectionfind::lockExclusive' => ['mysql_xdevapi\CollectionFind', 'lock_waiting_option='=>'integer'], + 'mysql_xdevapi\collectionfind::lockShared' => ['mysql_xdevapi\CollectionFind', 'lock_waiting_option='=>'integer'], + 'mysql_xdevapi\collectionfind::offset' => ['mysql_xdevapi\CollectionFind', 'position'=>'integer'], + 'mysql_xdevapi\collectionfind::sort' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], + 'mysql_xdevapi\collectionmodify::arrayAppend' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], + 'mysql_xdevapi\collectionmodify::arrayInsert' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], + 'mysql_xdevapi\collectionmodify::bind' => ['mysql_xdevapi\CollectionModify', 'placeholder_values'=>'array'], + 'mysql_xdevapi\collectionmodify::execute' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\collectionmodify::limit' => ['mysql_xdevapi\CollectionModify', 'rows'=>'integer'], + 'mysql_xdevapi\collectionmodify::patch' => ['mysql_xdevapi\CollectionModify', 'document'=>'string'], + 'mysql_xdevapi\collectionmodify::replace' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], + 'mysql_xdevapi\collectionmodify::set' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], + 'mysql_xdevapi\collectionmodify::skip' => ['mysql_xdevapi\CollectionModify', 'position'=>'integer'], + 'mysql_xdevapi\collectionmodify::sort' => ['mysql_xdevapi\CollectionModify', 'sort_expr'=>'string'], + 'mysql_xdevapi\collectionmodify::unset' => ['mysql_xdevapi\CollectionModify', 'fields'=>'array'], + 'mysql_xdevapi\collectionremove::bind' => ['mysql_xdevapi\CollectionRemove', 'placeholder_values'=>'array'], + 'mysql_xdevapi\collectionremove::execute' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\collectionremove::limit' => ['mysql_xdevapi\CollectionRemove', 'rows'=>'integer'], + 'mysql_xdevapi\collectionremove::sort' => ['mysql_xdevapi\CollectionRemove', 'sort_expr'=>'string'], + 'mysql_xdevapi\columnresult::getCharacterSetName' => ['string'], + 'mysql_xdevapi\columnresult::getCollationName' => ['string'], + 'mysql_xdevapi\columnresult::getColumnLabel' => ['string'], + 'mysql_xdevapi\columnresult::getColumnName' => ['string'], + 'mysql_xdevapi\columnresult::getFractionalDigits' => ['integer'], + 'mysql_xdevapi\columnresult::getLength' => ['integer'], + 'mysql_xdevapi\columnresult::getSchemaName' => ['string'], + 'mysql_xdevapi\columnresult::getTableLabel' => ['string'], + 'mysql_xdevapi\columnresult::getTableName' => ['string'], + 'mysql_xdevapi\columnresult::getType' => ['integer'], + 'mysql_xdevapi\columnresult::isNumberSigned' => ['integer'], + 'mysql_xdevapi\columnresult::isPadded' => ['integer'], + 'mysql_xdevapi\crudoperationbindable::bind' => ['mysql_xdevapi\CrudOperationBindable', 'placeholder_values'=>'array'], + 'mysql_xdevapi\crudoperationlimitable::limit' => ['mysql_xdevapi\CrudOperationLimitable', 'rows'=>'integer'], + 'mysql_xdevapi\crudoperationskippable::skip' => ['mysql_xdevapi\CrudOperationSkippable', 'skip'=>'integer'], + 'mysql_xdevapi\crudoperationsortable::sort' => ['mysql_xdevapi\CrudOperationSortable', 'sort_expr'=>'string'], + 'mysql_xdevapi\databaseobject::existsInDatabase' => ['bool'], + 'mysql_xdevapi\databaseobject::getName' => ['string'], + 'mysql_xdevapi\databaseobject::getSession' => ['mysql_xdevapi\Session'], + 'mysql_xdevapi\docresult::fetchAll' => ['Array'], + 'mysql_xdevapi\docresult::fetchOne' => ['Object'], + 'mysql_xdevapi\docresult::getWarnings' => ['Array'], + 'mysql_xdevapi\docresult::getWarningsCount' => ['integer'], + 'mysql_xdevapi\executable::execute' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\getsession' => ['mysql_xdevapi\Session', 'uri'=>'string'], + 'mysql_xdevapi\result::getAutoIncrementValue' => ['int'], + 'mysql_xdevapi\result::getGeneratedIds' => ['ArrayOfInt'], + 'mysql_xdevapi\result::getWarnings' => ['array'], + 'mysql_xdevapi\result::getWarningsCount' => ['integer'], + 'mysql_xdevapi\rowresult::fetchAll' => ['array'], + 'mysql_xdevapi\rowresult::fetchOne' => ['object'], + 'mysql_xdevapi\rowresult::getColumnCount' => ['integer'], + 'mysql_xdevapi\rowresult::getColumnNames' => ['array'], + 'mysql_xdevapi\rowresult::getColumns' => ['array'], + 'mysql_xdevapi\rowresult::getWarnings' => ['array'], + 'mysql_xdevapi\rowresult::getWarningsCount' => ['integer'], + 'mysql_xdevapi\schema::createCollection' => ['mysql_xdevapi\Collection', 'name'=>'string'], + 'mysql_xdevapi\schema::dropCollection' => ['bool', 'collection_name'=>'string'], + 'mysql_xdevapi\schema::existsInDatabase' => ['bool'], + 'mysql_xdevapi\schema::getCollection' => ['mysql_xdevapi\Collection', 'name'=>'string'], + 'mysql_xdevapi\schema::getCollectionAsTable' => ['mysql_xdevapi\Table', 'name'=>'string'], + 'mysql_xdevapi\schema::getCollections' => ['array'], + 'mysql_xdevapi\schema::getName' => ['string'], + 'mysql_xdevapi\schema::getSession' => ['mysql_xdevapi\Session'], + 'mysql_xdevapi\schema::getTable' => ['mysql_xdevapi\Table', 'name'=>'string'], + 'mysql_xdevapi\schema::getTables' => ['array'], + 'mysql_xdevapi\schemaobject::getSchema' => ['mysql_xdevapi\Schema'], + 'mysql_xdevapi\session::close' => ['bool'], + 'mysql_xdevapi\session::commit' => ['Object'], + 'mysql_xdevapi\session::createSchema' => ['mysql_xdevapi\Schema', 'schema_name'=>'string'], + 'mysql_xdevapi\session::dropSchema' => ['bool', 'schema_name'=>'string'], + 'mysql_xdevapi\session::executeSql' => ['Object', 'statement'=>'string'], + 'mysql_xdevapi\session::generateUUID' => ['string'], + 'mysql_xdevapi\session::getClientId' => ['integer'], + 'mysql_xdevapi\session::getSchema' => ['mysql_xdevapi\Schema', 'schema_name'=>'string'], + 'mysql_xdevapi\session::getSchemas' => ['array'], + 'mysql_xdevapi\session::getServerVersion' => ['integer'], + 'mysql_xdevapi\session::killClient' => ['object', 'client_id'=>'integer'], + 'mysql_xdevapi\session::listClients' => ['array'], + 'mysql_xdevapi\session::quoteName' => ['string', 'name'=>'string'], + 'mysql_xdevapi\session::releaseSavepoint' => ['void', 'name'=>'string'], + 'mysql_xdevapi\session::rollback' => ['void'], + 'mysql_xdevapi\session::rollbackTo' => ['void', 'name'=>'string'], + 'mysql_xdevapi\session::setSavepoint' => ['string', 'name='=>'string'], + 'mysql_xdevapi\session::sql' => ['mysql_xdevapi\SqlStatement', 'query'=>'string'], + 'mysql_xdevapi\session::startTransaction' => ['void'], + 'mysql_xdevapi\sqlstatement::bind' => ['mysql_xdevapi\SqlStatement', 'param'=>'string'], + 'mysql_xdevapi\sqlstatement::execute' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\sqlstatement::getNextResult' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\sqlstatement::getResult' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\sqlstatement::hasMoreResults' => ['bool'], + 'mysql_xdevapi\sqlstatementresult::fetchAll' => ['array'], + 'mysql_xdevapi\sqlstatementresult::fetchOne' => ['object'], + 'mysql_xdevapi\sqlstatementresult::getAffectedItemsCount' => ['integer'], + 'mysql_xdevapi\sqlstatementresult::getColumnCount' => ['integer'], + 'mysql_xdevapi\sqlstatementresult::getColumnNames' => ['array'], + 'mysql_xdevapi\sqlstatementresult::getColumns' => ['Array'], + 'mysql_xdevapi\sqlstatementresult::getGeneratedIds' => ['array'], + 'mysql_xdevapi\sqlstatementresult::getLastInsertId' => ['String'], + 'mysql_xdevapi\sqlstatementresult::getWarnings' => ['array'], + 'mysql_xdevapi\sqlstatementresult::getWarningsCount' => ['integer'], + 'mysql_xdevapi\sqlstatementresult::hasData' => ['bool'], + 'mysql_xdevapi\sqlstatementresult::nextResult' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\statement::getNextResult' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\statement::getResult' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\statement::hasMoreResults' => ['bool'], + 'mysql_xdevapi\table::count' => ['integer'], + 'mysql_xdevapi\table::delete' => ['mysql_xdevapi\TableDelete'], + 'mysql_xdevapi\table::existsInDatabase' => ['bool'], + 'mysql_xdevapi\table::getName' => ['string'], + 'mysql_xdevapi\table::getSchema' => ['mysql_xdevapi\Schema'], + 'mysql_xdevapi\table::getSession' => ['mysql_xdevapi\Session'], + 'mysql_xdevapi\table::insert' => ['mysql_xdevapi\TableInsert', 'columns'=>'mixed', '...args='=>'mixed'], + 'mysql_xdevapi\table::isView' => ['bool'], + 'mysql_xdevapi\table::select' => ['mysql_xdevapi\TableSelect', 'columns'=>'mixed', '...args='=>'mixed'], + 'mysql_xdevapi\table::update' => ['mysql_xdevapi\TableUpdate'], + 'mysql_xdevapi\tabledelete::bind' => ['mysql_xdevapi\TableDelete', 'placeholder_values'=>'array'], + 'mysql_xdevapi\tabledelete::execute' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\tabledelete::limit' => ['mysql_xdevapi\TableDelete', 'rows'=>'integer'], + 'mysql_xdevapi\tabledelete::offset' => ['mysql_xdevapi\TableDelete', 'position'=>'integer'], + 'mysql_xdevapi\tabledelete::orderby' => ['mysql_xdevapi\TableDelete', 'orderby_expr'=>'string'], + 'mysql_xdevapi\tabledelete::where' => ['mysql_xdevapi\TableDelete', 'where_expr'=>'string'], + 'mysql_xdevapi\tableinsert::execute' => ['mysql_xdevapi\Result'], + 'mysql_xdevapi\tableinsert::values' => ['mysql_xdevapi\TableInsert', 'row_values'=>'array'], + 'mysql_xdevapi\tableselect::bind' => ['mysql_xdevapi\TableSelect', 'placeholder_values'=>'array'], + 'mysql_xdevapi\tableselect::execute' => ['mysql_xdevapi\RowResult'], + 'mysql_xdevapi\tableselect::groupBy' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'mixed'], + 'mysql_xdevapi\tableselect::having' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'string'], + 'mysql_xdevapi\tableselect::limit' => ['mysql_xdevapi\TableSelect', 'rows'=>'integer'], + 'mysql_xdevapi\tableselect::lockExclusive' => ['mysql_xdevapi\TableSelect', 'lock_waiting_option='=>'integer'], + 'mysql_xdevapi\tableselect::lockShared' => ['mysql_xdevapi\TableSelect', 'lock_waiting_option='=>'integer'], + 'mysql_xdevapi\tableselect::offset' => ['mysql_xdevapi\TableSelect', 'position'=>'integer'], + 'mysql_xdevapi\tableselect::orderby' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'mixed', '...args='=>'mixed'], + 'mysql_xdevapi\tableselect::where' => ['mysql_xdevapi\TableSelect', 'where_expr'=>'string'], + 'mysql_xdevapi\tableupdate::bind' => ['mysql_xdevapi\TableUpdate', 'placeholder_values'=>'array'], + 'mysql_xdevapi\tableupdate::execute' => ['mysql_xdevapi\TableUpdate'], + 'mysql_xdevapi\tableupdate::limit' => ['mysql_xdevapi\TableUpdate', 'rows'=>'integer'], + 'mysql_xdevapi\tableupdate::orderby' => ['mysql_xdevapi\TableUpdate', 'orderby_expr'=>'mixed', '...args='=>'mixed'], + 'mysql_xdevapi\tableupdate::set' => ['mysql_xdevapi\TableUpdate', 'table_field'=>'string', 'expression_or_literal'=>'string'], + 'mysql_xdevapi\tableupdate::where' => ['mysql_xdevapi\TableUpdate', 'where_expr'=>'string'], + 'mysqli::__construct' => ['void', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], + 'mysqli::autocommit' => ['bool', 'enable'=>'bool'], + 'mysqli::begin_transaction' => ['bool', 'flags='=>'int', 'name='=>'string'], + 'mysqli::change_user' => ['bool', 'username'=>'string', 'password'=>'string', 'database'=>'?string'], + 'mysqli::character_set_name' => ['string'], + 'mysqli::close' => ['bool'], + 'mysqli::commit' => ['bool', 'flags='=>'int', 'name='=>'string'], + 'mysqli::connect' => ['null|false', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], + 'mysqli::debug' => ['bool', 'options'=>'string'], + 'mysqli::disable_reads_from_master' => ['bool'], + 'mysqli::dump_debug_info' => ['bool'], + 'mysqli::escape_string' => ['string', 'string'=>'string'], + 'mysqli::get_charset' => ['object'], + 'mysqli::get_client_info' => ['string'], + 'mysqli::get_connection_stats' => ['array'], + 'mysqli::get_warnings' => ['mysqli_warning'], + 'mysqli::init' => ['false|null'], + 'mysqli::kill' => ['bool', 'process_id'=>'int'], + 'mysqli::more_results' => ['bool'], + 'mysqli::multi_query' => ['bool', 'query'=>'string'], + 'mysqli::next_result' => ['bool'], + 'mysqli::options' => ['bool', 'option'=>'int', 'value'=>'string|int'], + 'mysqli::ping' => ['bool'], + 'mysqli::poll' => ['int|false', '&w_read'=>'array', '&w_write'=>'array', '&w_error'=>'array', 'seconds'=>'int', 'microseconds='=>'int'], + 'mysqli::prepare' => ['mysqli_stmt|false', 'query'=>'string'], + 'mysqli::query' => ['bool|mysqli_result', 'query'=>'string', 'result_mode='=>'int'], + 'mysqli::real_connect' => ['bool', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null', 'flags='=>'int'], + 'mysqli::real_escape_string' => ['string', 'string'=>'string'], + 'mysqli::real_query' => ['bool', 'query'=>'string'], + 'mysqli::reap_async_query' => ['mysqli_result|false'], + 'mysqli::refresh' => ['bool', 'flags'=>'int'], + 'mysqli::release_savepoint' => ['bool', 'name'=>'string'], + 'mysqli::rollback' => ['bool', 'flags='=>'int', 'name='=>'string'], + 'mysqli::rpl_query_type' => ['int', 'query'=>'string'], + 'mysqli::savepoint' => ['bool', 'name'=>'string'], + 'mysqli::select_db' => ['bool', 'database'=>'string'], + 'mysqli::send_query' => ['bool', 'query'=>'string'], + 'mysqli::set_charset' => ['bool', 'charset'=>'string'], + 'mysqli::set_local_infile_default' => ['void'], + 'mysqli::set_local_infile_handler' => ['bool', 'read_func='=>'callable'], + 'mysqli::set_opt' => ['bool', 'option'=>'int', 'value'=>'string|int'], + 'mysqli::ssl_set' => ['bool', 'key'=>'?string', 'certificate'=>'?string', 'ca_certificate'=>'?string', 'ca_path'=>'?string', 'cipher_algos'=>'?string'], + 'mysqli::stat' => ['string|false'], + 'mysqli::stmt_init' => ['mysqli_stmt'], + 'mysqli::store_result' => ['mysqli_result|false', 'mode='=>'int'], + 'mysqli::thread_safe' => ['bool'], + 'mysqli::use_result' => ['mysqli_result|false'], + 'mysqli_affected_rows' => ['int', 'mysql'=>'mysqli'], + 'mysqli_autocommit' => ['bool', 'mysql'=>'mysqli', 'enable'=>'bool'], + 'mysqli_begin_transaction' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], + 'mysqli_change_user' => ['bool', 'mysql'=>'mysqli', 'username'=>'string', 'password'=>'string', 'database'=>'?string'], + 'mysqli_character_set_name' => ['string', 'mysql'=>'mysqli'], + 'mysqli_close' => ['bool', 'mysql'=>'mysqli'], + 'mysqli_commit' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], + 'mysqli_connect' => ['mysqli|false', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], + 'mysqli_connect_errno' => ['int'], + 'mysqli_connect_error' => ['?string'], + 'mysqli_data_seek' => ['bool', 'result'=>'mysqli_result', 'offset'=>'int'], + 'mysqli_debug' => ['bool', 'options'=>'string'], + 'mysqli_disable_reads_from_master' => ['bool', 'link'=>'mysqli'], + 'mysqli_disable_rpl_parse' => ['bool', 'link'=>'mysqli'], + 'mysqli_driver::embedded_server_end' => ['void'], + 'mysqli_driver::embedded_server_start' => ['bool', 'start'=>'int', 'arguments'=>'array', 'groups'=>'array'], + 'mysqli_dump_debug_info' => ['bool', 'mysql'=>'mysqli'], + 'mysqli_embedded_server_end' => ['void'], + 'mysqli_embedded_server_start' => ['bool', 'start'=>'int', 'arguments'=>'array', 'groups'=>'array'], + 'mysqli_enable_reads_from_master' => ['bool', 'link'=>'mysqli'], + 'mysqli_enable_rpl_parse' => ['bool', 'link'=>'mysqli'], + 'mysqli_errno' => ['int', 'mysql'=>'mysqli'], + 'mysqli_error' => ['string', 'mysql'=>'mysqli'], + 'mysqli_error_list' => ['array', 'mysql'=>'mysqli'], + 'mysqli_escape_string' => ['string', 'mysql'=>'mysqli', 'string'=>'string'], + 'mysqli_execute' => ['bool', 'statement'=>'mysqli_stmt'], + 'mysqli_fetch_all' => ['list>', 'result'=>'mysqli_result', 'mode='=>'3'], + 'mysqli_fetch_all\'1' => ['list>', 'result'=>'mysqli_result', 'mode='=>'1'], + 'mysqli_fetch_all\'2' => ['list>', 'result'=>'mysqli_result', 'mode='=>'2'], + 'mysqli_fetch_array' => ['array|false|null', 'result'=>'mysqli_result', 'mode='=>'3'], + 'mysqli_fetch_array\'1' => ['array|false|null', 'result'=>'mysqli_result', 'mode='=>'1'], + 'mysqli_fetch_array\'2' => ['list|false|null', 'result'=>'mysqli_result', 'mode='=>'2'], + 'mysqli_fetch_assoc' => ['array|false|null', 'result'=>'mysqli_result'], + 'mysqli_fetch_field' => ['object|false', 'result'=>'mysqli_result'], + '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_row' => ['list|false|null', 'result'=>'mysqli_result'], + 'mysqli_field_count' => ['int', 'mysql'=>'mysqli'], + 'mysqli_field_seek' => ['bool', 'result'=>'mysqli_result', 'index'=>'int'], + 'mysqli_field_tell' => ['int', 'result'=>'mysqli_result'], + 'mysqli_free_result' => ['void', 'result'=>'mysqli_result'], + 'mysqli_get_cache_stats' => ['array|false'], + 'mysqli_get_charset' => ['?object', 'mysql'=>'mysqli'], + 'mysqli_get_client_info' => ['string', 'mysql='=>'?mysqli'], + 'mysqli_get_client_stats' => ['array'], + 'mysqli_get_client_version' => ['int', 'link'=>'mysqli'], + 'mysqli_get_connection_stats' => ['array', 'mysql'=>'mysqli'], + 'mysqli_get_host_info' => ['string', 'mysql'=>'mysqli'], + 'mysqli_get_links_stats' => ['array'], + 'mysqli_get_proto_info' => ['int', 'mysql'=>'mysqli'], + 'mysqli_get_server_info' => ['string', 'mysql'=>'mysqli'], + 'mysqli_get_server_version' => ['int', 'mysql'=>'mysqli'], + 'mysqli_get_warnings' => ['mysqli_warning', 'mysql'=>'mysqli'], + 'mysqli_info' => ['?string', 'mysql'=>'mysqli'], + 'mysqli_init' => ['mysqli|false'], + 'mysqli_insert_id' => ['int|string', 'mysql'=>'mysqli'], + 'mysqli_kill' => ['bool', 'mysql'=>'mysqli', 'process_id'=>'int'], + 'mysqli_link_construct' => ['object'], + 'mysqli_master_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], + 'mysqli_more_results' => ['bool', 'mysql'=>'mysqli'], + 'mysqli_multi_query' => ['bool', 'mysql'=>'mysqli', 'query'=>'string'], + 'mysqli_next_result' => ['bool', 'mysql'=>'mysqli'], + 'mysqli_num_fields' => ['int', 'result'=>'mysqli_result'], + 'mysqli_num_rows' => ['int', 'result'=>'mysqli_result'], + 'mysqli_options' => ['bool', 'mysql'=>'mysqli', 'option'=>'int', 'value'=>'string|int'], + 'mysqli_ping' => ['bool', 'mysql'=>'mysqli'], + 'mysqli_poll' => ['int|false', 'read'=>'array', 'write'=>'array', 'error'=>'array', 'seconds'=>'int', 'microseconds='=>'int'], + 'mysqli_prepare' => ['mysqli_stmt|false', 'mysql'=>'mysqli', 'query'=>'string'], + 'mysqli_query' => ['mysqli_result|bool', 'mysql'=>'mysqli', 'query'=>'string', 'result_mode='=>'int'], + 'mysqli_real_connect' => ['bool', 'mysql='=>'mysqli', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null', 'flags='=>'int'], + 'mysqli_real_escape_string' => ['string', 'mysql'=>'mysqli', 'string'=>'string'], + 'mysqli_real_query' => ['bool', 'mysql'=>'mysqli', 'query'=>'string'], + 'mysqli_reap_async_query' => ['mysqli_result|false', 'mysql'=>'mysqli'], + 'mysqli_refresh' => ['bool', 'mysql'=>'mysqli', 'flags'=>'int'], + 'mysqli_release_savepoint' => ['bool', 'mysql'=>'mysqli', 'name'=>'string'], + 'mysqli_report' => ['bool', 'flags'=>'int'], + 'mysqli_result::__construct' => ['void', 'mysql'=>'mysqli', 'result_mode='=>'int'], + 'mysqli_result::close' => ['void'], + 'mysqli_result::data_seek' => ['bool', 'offset'=>'int'], + 'mysqli_result::fetch_all' => ['list>', 'mode='=>'3'], + 'mysqli_result::fetch_all\'1' => ['list>', 'mode='=>'1'], + 'mysqli_result::fetch_all\'2' => ['list>', 'mode='=>'2'], + 'mysqli_result::fetch_array' => ['array|false|null', 'mode='=>'3'], + 'mysqli_result::fetch_array\'1' => ['array|false|null', 'mode='=>'1'], + 'mysqli_result::fetch_array\'2' => ['list|false|null', 'mode='=>'2'], + 'mysqli_result::fetch_assoc' => ['array|false|null'], + '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_row' => ['list|false|null'], + 'mysqli_result::field_seek' => ['bool', 'index'=>'int'], + 'mysqli_result::free' => ['void'], + 'mysqli_result::free_result' => ['void'], + 'mysqli_rollback' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], + 'mysqli_rpl_parse_enabled' => ['int', 'link'=>'mysqli'], + 'mysqli_rpl_probe' => ['bool', 'link'=>'mysqli'], + 'mysqli_rpl_query_type' => ['int', 'link'=>'mysqli', 'query'=>'string'], + 'mysqli_savepoint' => ['bool', 'mysql'=>'mysqli', 'name'=>'string'], + 'mysqli_savepoint_libmysql' => ['bool'], + 'mysqli_select_db' => ['bool', 'mysql'=>'mysqli', 'database'=>'string'], + 'mysqli_send_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], + 'mysqli_set_charset' => ['bool', 'mysql'=>'mysqli', 'charset'=>'string'], + 'mysqli_set_local_infile_default' => ['void', 'link'=>'mysqli'], + 'mysqli_set_local_infile_handler' => ['bool', 'link'=>'mysqli', 'read_func'=>'callable'], + 'mysqli_set_opt' => ['bool', 'mysql'=>'mysqli', 'option'=>'int', 'value'=>'string|int'], + 'mysqli_slave_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], + 'mysqli_sqlstate' => ['string', 'mysql'=>'mysqli'], + 'mysqli_ssl_set' => ['bool', 'mysql'=>'mysqli', 'key'=>'?string', 'certificate'=>'?string', 'ca_certificate'=>'?string', 'ca_path'=>'?string', 'cipher_algos'=>'?string'], + 'mysqli_stat' => ['string|false', 'mysql'=>'mysqli'], + 'mysqli_stmt::__construct' => ['void', 'mysql'=>'mysqli', 'query'=>'string'], + 'mysqli_stmt::attr_get' => ['int', 'attribute'=>'int'], + 'mysqli_stmt::attr_set' => ['bool', 'attribute'=>'int', 'value'=>'int'], + 'mysqli_stmt::bind_param' => ['bool', 'types'=>'string', '&vars'=>'mixed', '&...args='=>'mixed'], + 'mysqli_stmt::bind_result' => ['bool', '&w_var1'=>'', '&...w_vars='=>''], + 'mysqli_stmt::close' => ['bool'], + 'mysqli_stmt::data_seek' => ['void', 'offset'=>'int'], + 'mysqli_stmt::execute' => ['bool'], + 'mysqli_stmt::fetch' => ['bool|null'], + 'mysqli_stmt::free_result' => ['void'], + 'mysqli_stmt::get_result' => ['mysqli_result|false'], + 'mysqli_stmt::get_warnings' => ['object'], + 'mysqli_stmt::more_results' => ['bool'], + 'mysqli_stmt::next_result' => ['bool'], + 'mysqli_stmt::num_rows' => ['int'], + 'mysqli_stmt::prepare' => ['bool', 'query'=>'string'], + 'mysqli_stmt::reset' => ['bool'], + 'mysqli_stmt::result_metadata' => ['mysqli_result|false'], + 'mysqli_stmt::send_long_data' => ['bool', 'param_num'=>'int', 'data'=>'string'], + 'mysqli_stmt::store_result' => ['bool'], + 'mysqli_stmt_affected_rows' => ['int|string', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_attr_get' => ['int', 'statement'=>'mysqli_stmt', 'attribute'=>'int'], + 'mysqli_stmt_attr_set' => ['bool', 'statement'=>'mysqli_stmt', 'attribute'=>'int', 'value'=>'int'], + 'mysqli_stmt_bind_param' => ['bool', 'statement'=>'mysqli_stmt', 'types'=>'string', '&vars'=>'mixed', '&...args='=>'mixed'], + 'mysqli_stmt_bind_result' => ['bool', 'statement'=>'mysqli_stmt', '&w_var1'=>'', '&...w_vars='=>''], + 'mysqli_stmt_close' => ['bool', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_data_seek' => ['void', 'statement'=>'mysqli_stmt', 'offset'=>'int'], + 'mysqli_stmt_errno' => ['int', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_error' => ['string', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_error_list' => ['array', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_execute' => ['bool', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_fetch' => ['bool|null', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_field_count' => ['int', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_free_result' => ['void', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_get_result' => ['mysqli_result|false', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_get_warnings' => ['object', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_init' => ['mysqli_stmt', 'mysql'=>'mysqli'], + 'mysqli_stmt_insert_id' => ['mixed', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_more_results' => ['bool', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_next_result' => ['bool', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_num_rows' => ['int', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_param_count' => ['int', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_prepare' => ['bool', 'statement'=>'mysqli_stmt', 'query'=>'string'], + 'mysqli_stmt_reset' => ['bool', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_result_metadata' => ['mysqli_result|false', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_send_long_data' => ['bool', 'statement'=>'mysqli_stmt', 'param_num'=>'int', 'data'=>'string'], + 'mysqli_stmt_sqlstate' => ['string', 'statement'=>'mysqli_stmt'], + 'mysqli_stmt_store_result' => ['bool', 'statement'=>'mysqli_stmt'], + 'mysqli_store_result' => ['mysqli_result|false', 'mysql'=>'mysqli', 'mode='=>'int'], + 'mysqli_thread_id' => ['int', 'mysql'=>'mysqli'], + 'mysqli_thread_safe' => ['bool'], + 'mysqli_use_result' => ['mysqli_result|false', 'mysql'=>'mysqli'], + 'mysqli_warning::__construct' => ['void'], + 'mysqli_warning::next' => ['bool'], + 'mysqli_warning_count' => ['int', 'mysql'=>'mysqli'], + 'mysqlnd_memcache_get_config' => ['array', 'connection'=>'mixed'], + 'mysqlnd_memcache_set' => ['bool', 'mysql_connection'=>'mixed', 'memcache_connection='=>'Memcached', 'pattern='=>'string', 'callback='=>'callable'], + 'mysqlnd_ms_dump_servers' => ['array', 'connection'=>'mixed'], + 'mysqlnd_ms_fabric_select_global' => ['array', 'connection'=>'mixed', 'table_name'=>'mixed'], + 'mysqlnd_ms_fabric_select_shard' => ['array', 'connection'=>'mixed', 'table_name'=>'mixed', 'shard_key'=>'mixed'], + 'mysqlnd_ms_get_last_gtid' => ['string', 'connection'=>'mixed'], + 'mysqlnd_ms_get_last_used_connection' => ['array', 'connection'=>'mixed'], + 'mysqlnd_ms_get_stats' => ['array'], + 'mysqlnd_ms_match_wild' => ['bool', 'table_name'=>'string', 'wildcard'=>'string'], + 'mysqlnd_ms_query_is_select' => ['int', 'query'=>'string'], + 'mysqlnd_ms_set_qos' => ['bool', 'connection'=>'mixed', 'service_level'=>'int', 'service_level_option='=>'int', 'option_value='=>'mixed'], + 'mysqlnd_ms_set_user_pick_server' => ['bool', 'function'=>'string'], + 'mysqlnd_ms_xa_begin' => ['int', 'connection'=>'mixed', 'gtrid'=>'string', 'timeout='=>'int'], + 'mysqlnd_ms_xa_commit' => ['int', 'connection'=>'mixed', 'gtrid'=>'string'], + 'mysqlnd_ms_xa_gc' => ['int', 'connection'=>'mixed', 'gtrid='=>'string', 'ignore_max_retries='=>'bool'], + 'mysqlnd_ms_xa_rollback' => ['int', 'connection'=>'mixed', 'gtrid'=>'string'], + 'mysqlnd_qc_change_handler' => ['bool', 'handler'=>''], + 'mysqlnd_qc_clear_cache' => ['bool'], + 'mysqlnd_qc_get_available_handlers' => ['array'], + 'mysqlnd_qc_get_cache_info' => ['array'], + 'mysqlnd_qc_get_core_stats' => ['array'], + 'mysqlnd_qc_get_handler' => ['array'], + 'mysqlnd_qc_get_normalized_query_trace_log' => ['array'], + 'mysqlnd_qc_get_query_trace_log' => ['array'], + 'mysqlnd_qc_set_cache_condition' => ['bool', 'condition_type'=>'int', 'condition'=>'mixed', 'condition_option'=>'mixed'], + 'mysqlnd_qc_set_is_select' => ['mixed', 'callback'=>'string'], + 'mysqlnd_qc_set_storage_handler' => ['bool', 'handler'=>'string'], + 'mysqlnd_qc_set_user_handlers' => ['bool', 'get_hash'=>'string', 'find_query_in_cache'=>'string', 'return_to_cache'=>'string', 'add_query_to_cache_if_not_exists'=>'string', 'query_is_select'=>'string', 'update_query_run_time_stats'=>'string', 'get_stats'=>'string', 'clear_cache'=>'string'], + 'mysqlnd_uh_convert_to_mysqlnd' => ['resource', '&rw_mysql_connection'=>'mysqli'], + 'mysqlnd_uh_set_connection_proxy' => ['bool', '&rw_connection_proxy'=>'MysqlndUhConnection', '&rw_mysqli_connection='=>'mysqli'], + 'mysqlnd_uh_set_statement_proxy' => ['bool', '&rw_statement_proxy'=>'MysqlndUhStatement'], + 'natcasesort' => ['bool', '&rw_array'=>'array'], + 'natsort' => ['bool', '&rw_array'=>'array'], + 'ncurses_addch' => ['int', 'ch'=>'int'], + 'ncurses_addchnstr' => ['int', 's'=>'string', 'n'=>'int'], + 'ncurses_addchstr' => ['int', 's'=>'string'], + 'ncurses_addnstr' => ['int', 's'=>'string', 'n'=>'int'], + 'ncurses_addstr' => ['int', 'text'=>'string'], + 'ncurses_assume_default_colors' => ['int', 'fg'=>'int', 'bg'=>'int'], + 'ncurses_attroff' => ['int', 'attributes'=>'int'], + 'ncurses_attron' => ['int', 'attributes'=>'int'], + 'ncurses_attrset' => ['int', 'attributes'=>'int'], + 'ncurses_baudrate' => ['int'], + 'ncurses_beep' => ['int'], + 'ncurses_bkgd' => ['int', 'attrchar'=>'int'], + 'ncurses_bkgdset' => ['void', 'attrchar'=>'int'], + 'ncurses_border' => ['int', 'left'=>'int', 'right'=>'int', 'top'=>'int', 'bottom'=>'int', 'tl_corner'=>'int', 'tr_corner'=>'int', 'bl_corner'=>'int', 'br_corner'=>'int'], + 'ncurses_bottom_panel' => ['int', 'panel'=>'resource'], + 'ncurses_can_change_color' => ['bool'], + 'ncurses_cbreak' => ['bool'], + 'ncurses_clear' => ['bool'], + 'ncurses_clrtobot' => ['bool'], + 'ncurses_clrtoeol' => ['bool'], + 'ncurses_color_content' => ['int', 'color'=>'int', 'r'=>'int', 'g'=>'int', 'b'=>'int'], + 'ncurses_color_set' => ['int', 'pair'=>'int'], + 'ncurses_curs_set' => ['int', 'visibility'=>'int'], + 'ncurses_def_prog_mode' => ['bool'], + 'ncurses_def_shell_mode' => ['bool'], + 'ncurses_define_key' => ['int', 'definition'=>'string', 'keycode'=>'int'], + 'ncurses_del_panel' => ['bool', 'panel'=>'resource'], + 'ncurses_delay_output' => ['int', 'milliseconds'=>'int'], + 'ncurses_delch' => ['bool'], + 'ncurses_deleteln' => ['bool'], + 'ncurses_delwin' => ['bool', 'window'=>'resource'], + 'ncurses_doupdate' => ['bool'], + 'ncurses_echo' => ['bool'], + 'ncurses_echochar' => ['int', 'character'=>'int'], + 'ncurses_end' => ['int'], + 'ncurses_erase' => ['bool'], + 'ncurses_erasechar' => ['string'], + 'ncurses_filter' => ['void'], + 'ncurses_flash' => ['bool'], + 'ncurses_flushinp' => ['bool'], + 'ncurses_getch' => ['int'], + 'ncurses_getmaxyx' => ['void', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], + 'ncurses_getmouse' => ['bool', 'mevent'=>'array'], + 'ncurses_getyx' => ['void', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], + 'ncurses_halfdelay' => ['int', 'tenth'=>'int'], + 'ncurses_has_colors' => ['bool'], + 'ncurses_has_ic' => ['bool'], + 'ncurses_has_il' => ['bool'], + 'ncurses_has_key' => ['int', 'keycode'=>'int'], + 'ncurses_hide_panel' => ['int', 'panel'=>'resource'], + 'ncurses_hline' => ['int', 'charattr'=>'int', 'n'=>'int'], + 'ncurses_inch' => ['string'], + 'ncurses_init' => ['void'], + 'ncurses_init_color' => ['int', 'color'=>'int', 'r'=>'int', 'g'=>'int', 'b'=>'int'], + 'ncurses_init_pair' => ['int', 'pair'=>'int', 'fg'=>'int', 'bg'=>'int'], + 'ncurses_insch' => ['int', 'character'=>'int'], + 'ncurses_insdelln' => ['int', 'count'=>'int'], + 'ncurses_insertln' => ['int'], + 'ncurses_insstr' => ['int', 'text'=>'string'], + 'ncurses_instr' => ['int', 'buffer'=>'string'], + 'ncurses_isendwin' => ['bool'], + 'ncurses_keyok' => ['int', 'keycode'=>'int', 'enable'=>'bool'], + 'ncurses_keypad' => ['int', 'window'=>'resource', 'bf'=>'bool'], + 'ncurses_killchar' => ['string'], + 'ncurses_longname' => ['string'], + 'ncurses_meta' => ['int', 'window'=>'resource', '_8bit'=>'bool'], + 'ncurses_mouse_trafo' => ['bool', 'y'=>'int', 'x'=>'int', 'toscreen'=>'bool'], + 'ncurses_mouseinterval' => ['int', 'milliseconds'=>'int'], + 'ncurses_mousemask' => ['int', 'newmask'=>'int', 'oldmask'=>'int'], + 'ncurses_move' => ['int', 'y'=>'int', 'x'=>'int'], + 'ncurses_move_panel' => ['int', 'panel'=>'resource', 'startx'=>'int', 'starty'=>'int'], + 'ncurses_mvaddch' => ['int', 'y'=>'int', 'x'=>'int', 'c'=>'int'], + 'ncurses_mvaddchnstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string', 'n'=>'int'], + 'ncurses_mvaddchstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string'], + 'ncurses_mvaddnstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string', 'n'=>'int'], + 'ncurses_mvaddstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string'], + 'ncurses_mvcur' => ['int', 'old_y'=>'int', 'old_x'=>'int', 'new_y'=>'int', 'new_x'=>'int'], + 'ncurses_mvdelch' => ['int', 'y'=>'int', 'x'=>'int'], + 'ncurses_mvgetch' => ['int', 'y'=>'int', 'x'=>'int'], + 'ncurses_mvhline' => ['int', 'y'=>'int', 'x'=>'int', 'attrchar'=>'int', 'n'=>'int'], + 'ncurses_mvinch' => ['int', 'y'=>'int', 'x'=>'int'], + 'ncurses_mvvline' => ['int', 'y'=>'int', 'x'=>'int', 'attrchar'=>'int', 'n'=>'int'], + 'ncurses_mvwaddstr' => ['int', 'window'=>'resource', 'y'=>'int', 'x'=>'int', 'text'=>'string'], + 'ncurses_napms' => ['int', 'milliseconds'=>'int'], + 'ncurses_new_panel' => ['resource', 'window'=>'resource'], + 'ncurses_newpad' => ['resource', 'rows'=>'int', 'cols'=>'int'], + 'ncurses_newwin' => ['resource', 'rows'=>'int', 'cols'=>'int', 'y'=>'int', 'x'=>'int'], + 'ncurses_nl' => ['bool'], + 'ncurses_nocbreak' => ['bool'], + 'ncurses_noecho' => ['bool'], + 'ncurses_nonl' => ['bool'], + 'ncurses_noqiflush' => ['void'], + 'ncurses_noraw' => ['bool'], + 'ncurses_pair_content' => ['int', 'pair'=>'int', 'f'=>'int', 'b'=>'int'], + 'ncurses_panel_above' => ['resource', 'panel'=>'resource'], + 'ncurses_panel_below' => ['resource', 'panel'=>'resource'], + 'ncurses_panel_window' => ['resource', 'panel'=>'resource'], + 'ncurses_pnoutrefresh' => ['int', 'pad'=>'resource', 'pminrow'=>'int', 'pmincol'=>'int', 'sminrow'=>'int', 'smincol'=>'int', 'smaxrow'=>'int', 'smaxcol'=>'int'], + 'ncurses_prefresh' => ['int', 'pad'=>'resource', 'pminrow'=>'int', 'pmincol'=>'int', 'sminrow'=>'int', 'smincol'=>'int', 'smaxrow'=>'int', 'smaxcol'=>'int'], + 'ncurses_putp' => ['int', 'text'=>'string'], + 'ncurses_qiflush' => ['void'], + 'ncurses_raw' => ['bool'], + 'ncurses_refresh' => ['int', 'ch'=>'int'], + 'ncurses_replace_panel' => ['int', 'panel'=>'resource', 'window'=>'resource'], + 'ncurses_reset_prog_mode' => ['int'], + 'ncurses_reset_shell_mode' => ['int'], + 'ncurses_resetty' => ['bool'], + 'ncurses_savetty' => ['bool'], + 'ncurses_scr_dump' => ['int', 'filename'=>'string'], + 'ncurses_scr_init' => ['int', 'filename'=>'string'], + 'ncurses_scr_restore' => ['int', 'filename'=>'string'], + 'ncurses_scr_set' => ['int', 'filename'=>'string'], + 'ncurses_scrl' => ['int', 'count'=>'int'], + 'ncurses_show_panel' => ['int', 'panel'=>'resource'], + 'ncurses_slk_attr' => ['int'], + 'ncurses_slk_attroff' => ['int', 'intarg'=>'int'], + 'ncurses_slk_attron' => ['int', 'intarg'=>'int'], + 'ncurses_slk_attrset' => ['int', 'intarg'=>'int'], + 'ncurses_slk_clear' => ['bool'], + 'ncurses_slk_color' => ['int', 'intarg'=>'int'], + 'ncurses_slk_init' => ['bool', 'format'=>'int'], + 'ncurses_slk_noutrefresh' => ['bool'], + 'ncurses_slk_refresh' => ['int'], + 'ncurses_slk_restore' => ['int'], + 'ncurses_slk_set' => ['bool', 'labelnr'=>'int', 'label'=>'string', 'format'=>'int'], + 'ncurses_slk_touch' => ['int'], + 'ncurses_standend' => ['int'], + 'ncurses_standout' => ['int'], + 'ncurses_start_color' => ['int'], + 'ncurses_termattrs' => ['bool'], + 'ncurses_termname' => ['string'], + 'ncurses_timeout' => ['void', 'millisec'=>'int'], + 'ncurses_top_panel' => ['int', 'panel'=>'resource'], + 'ncurses_typeahead' => ['int', 'fd'=>'int'], + 'ncurses_ungetch' => ['int', 'keycode'=>'int'], + 'ncurses_ungetmouse' => ['bool', 'mevent'=>'array'], + 'ncurses_update_panels' => ['void'], + 'ncurses_use_default_colors' => ['bool'], + 'ncurses_use_env' => ['void', 'flag'=>'bool'], + 'ncurses_use_extended_names' => ['int', 'flag'=>'bool'], + 'ncurses_vidattr' => ['int', 'intarg'=>'int'], + 'ncurses_vline' => ['int', 'charattr'=>'int', 'n'=>'int'], + 'ncurses_waddch' => ['int', 'window'=>'resource', 'ch'=>'int'], + 'ncurses_waddstr' => ['int', 'window'=>'resource', 'string'=>'string', 'n='=>'int'], + 'ncurses_wattroff' => ['int', 'window'=>'resource', 'attrs'=>'int'], + 'ncurses_wattron' => ['int', 'window'=>'resource', 'attrs'=>'int'], + 'ncurses_wattrset' => ['int', 'window'=>'resource', 'attrs'=>'int'], + 'ncurses_wborder' => ['int', 'window'=>'resource', 'left'=>'int', 'right'=>'int', 'top'=>'int', 'bottom'=>'int', 'tl_corner'=>'int', 'tr_corner'=>'int', 'bl_corner'=>'int', 'br_corner'=>'int'], + 'ncurses_wclear' => ['int', 'window'=>'resource'], + 'ncurses_wcolor_set' => ['int', 'window'=>'resource', 'color_pair'=>'int'], + 'ncurses_werase' => ['int', 'window'=>'resource'], + 'ncurses_wgetch' => ['int', 'window'=>'resource'], + 'ncurses_whline' => ['int', 'window'=>'resource', 'charattr'=>'int', 'n'=>'int'], + 'ncurses_wmouse_trafo' => ['bool', 'window'=>'resource', 'y'=>'int', 'x'=>'int', 'toscreen'=>'bool'], + 'ncurses_wmove' => ['int', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], + 'ncurses_wnoutrefresh' => ['int', 'window'=>'resource'], + 'ncurses_wrefresh' => ['int', 'window'=>'resource'], + 'ncurses_wstandend' => ['int', 'window'=>'resource'], + 'ncurses_wstandout' => ['int', 'window'=>'resource'], + 'ncurses_wvline' => ['int', 'window'=>'resource', 'charattr'=>'int', 'n'=>'int'], + 'newrelic_add_custom_parameter' => ['bool', 'key'=>'string', 'value'=>'bool|float|int|string'], + 'newrelic_add_custom_tracer' => ['bool', 'function_name'=>'string'], + 'newrelic_background_job' => ['void', 'flag='=>'bool'], + 'newrelic_capture_params' => ['void', 'enable='=>'bool'], + 'newrelic_custom_metric' => ['bool', 'metric_name'=>'string', 'value'=>'float'], + 'newrelic_disable_autorum' => ['true'], + 'newrelic_end_of_transaction' => ['void'], + 'newrelic_end_transaction' => ['bool', 'ignore='=>'bool'], + 'newrelic_get_browser_timing_footer' => ['string', 'include_tags='=>'bool'], + 'newrelic_get_browser_timing_header' => ['string', 'include_tags='=>'bool'], + 'newrelic_ignore_apdex' => ['void'], + 'newrelic_ignore_transaction' => ['void'], + 'newrelic_name_transaction' => ['bool', 'name'=>'string'], + 'newrelic_notice_error' => ['void', 'message'=>'string', 'exception='=>'Exception|Throwable'], + 'newrelic_notice_error\'1' => ['void', 'unused_1'=>'string', 'message'=>'string', 'unused_2'=>'string', 'unused_3'=>'int', 'unused_4='=>''], + 'newrelic_record_custom_event' => ['void', 'name'=>'string', 'attributes'=>'array'], + 'newrelic_record_datastore_segment' => ['mixed', 'func'=>'callable', 'parameters'=>'array'], + 'newrelic_set_appname' => ['bool', 'name'=>'string', 'license='=>'string', 'xmit='=>'bool'], + 'newrelic_set_user_attributes' => ['bool', 'user'=>'string', 'account'=>'string', 'product'=>'string'], + 'newrelic_start_transaction' => ['bool', 'appname'=>'string', 'license='=>'string'], + 'newt_bell' => ['void'], + 'newt_button' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], + 'newt_button_bar' => ['resource', 'buttons'=>'array'], + 'newt_centered_window' => ['int', 'width'=>'int', 'height'=>'int', 'title='=>'string'], + 'newt_checkbox' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'def_value'=>'string', 'seq='=>'string'], + 'newt_checkbox_get_value' => ['string', 'checkbox'=>'resource'], + 'newt_checkbox_set_flags' => ['void', 'checkbox'=>'resource', 'flags'=>'int', 'sense'=>'int'], + 'newt_checkbox_set_value' => ['void', 'checkbox'=>'resource', 'value'=>'string'], + 'newt_checkbox_tree' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'flags='=>'int'], + 'newt_checkbox_tree_add_item' => ['void', 'checkboxtree'=>'resource', 'text'=>'string', 'data'=>'mixed', 'flags'=>'int', 'index'=>'int', '...args='=>'int'], + 'newt_checkbox_tree_find_item' => ['array', 'checkboxtree'=>'resource', 'data'=>'mixed'], + 'newt_checkbox_tree_get_current' => ['mixed', 'checkboxtree'=>'resource'], + 'newt_checkbox_tree_get_entry_value' => ['string', 'checkboxtree'=>'resource', 'data'=>'mixed'], + 'newt_checkbox_tree_get_multi_selection' => ['array', 'checkboxtree'=>'resource', 'seqnum'=>'string'], + 'newt_checkbox_tree_get_selection' => ['array', 'checkboxtree'=>'resource'], + 'newt_checkbox_tree_multi' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'seq'=>'string', 'flags='=>'int'], + 'newt_checkbox_tree_set_current' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed'], + 'newt_checkbox_tree_set_entry' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed', 'text'=>'string'], + 'newt_checkbox_tree_set_entry_value' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed', 'value'=>'string'], + 'newt_checkbox_tree_set_width' => ['void', 'checkbox_tree'=>'resource', 'width'=>'int'], + 'newt_clear_key_buffer' => ['void'], + 'newt_cls' => ['void'], + 'newt_compact_button' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], + 'newt_component_add_callback' => ['void', 'component'=>'resource', 'func_name'=>'mixed', 'data'=>'mixed'], + 'newt_component_takes_focus' => ['void', 'component'=>'resource', 'takes_focus'=>'bool'], + 'newt_create_grid' => ['resource', 'cols'=>'int', 'rows'=>'int'], + 'newt_cursor_off' => ['void'], + 'newt_cursor_on' => ['void'], + 'newt_delay' => ['void', 'microseconds'=>'int'], + 'newt_draw_form' => ['void', 'form'=>'resource'], + 'newt_draw_root_text' => ['void', 'left'=>'int', 'top'=>'int', 'text'=>'string'], + 'newt_entry' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'init_value='=>'string', 'flags='=>'int'], + 'newt_entry_get_value' => ['string', 'entry'=>'resource'], + 'newt_entry_set' => ['void', 'entry'=>'resource', 'value'=>'string', 'cursor_at_end='=>'bool'], + 'newt_entry_set_filter' => ['void', 'entry'=>'resource', 'filter'=>'callable', 'data'=>'mixed'], + 'newt_entry_set_flags' => ['void', 'entry'=>'resource', 'flags'=>'int', 'sense'=>'int'], + 'newt_finished' => ['int'], + 'newt_form' => ['resource', 'vert_bar='=>'resource', 'help='=>'string', 'flags='=>'int'], + 'newt_form_add_component' => ['void', 'form'=>'resource', 'component'=>'resource'], + 'newt_form_add_components' => ['void', 'form'=>'resource', 'components'=>'array'], + 'newt_form_add_hot_key' => ['void', 'form'=>'resource', 'key'=>'int'], + 'newt_form_destroy' => ['void', 'form'=>'resource'], + 'newt_form_get_current' => ['resource', 'form'=>'resource'], + 'newt_form_run' => ['void', 'form'=>'resource', 'exit_struct'=>'array'], + 'newt_form_set_background' => ['void', 'from'=>'resource', 'background'=>'int'], + 'newt_form_set_height' => ['void', 'form'=>'resource', 'height'=>'int'], + 'newt_form_set_size' => ['void', 'form'=>'resource'], + 'newt_form_set_timer' => ['void', 'form'=>'resource', 'milliseconds'=>'int'], + 'newt_form_set_width' => ['void', 'form'=>'resource', 'width'=>'int'], + 'newt_form_watch_fd' => ['void', 'form'=>'resource', 'stream'=>'resource', 'flags='=>'int'], + 'newt_get_screen_size' => ['void', 'cols'=>'int', 'rows'=>'int'], + 'newt_grid_add_components_to_form' => ['void', 'grid'=>'resource', 'form'=>'resource', 'recurse'=>'bool'], + 'newt_grid_basic_window' => ['resource', 'text'=>'resource', 'middle'=>'resource', 'buttons'=>'resource'], + 'newt_grid_free' => ['void', 'grid'=>'resource', 'recurse'=>'bool'], + 'newt_grid_get_size' => ['void', 'grid'=>'resource', 'width'=>'int', 'height'=>'int'], + 'newt_grid_h_close_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], + 'newt_grid_h_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], + 'newt_grid_place' => ['void', 'grid'=>'resource', 'left'=>'int', 'top'=>'int'], + 'newt_grid_set_field' => ['void', 'grid'=>'resource', 'col'=>'int', 'row'=>'int', 'type'=>'int', 'value'=>'resource', 'pad_left'=>'int', 'pad_top'=>'int', 'pad_right'=>'int', 'pad_bottom'=>'int', 'anchor'=>'int', 'flags='=>'int'], + 'newt_grid_simple_window' => ['resource', 'text'=>'resource', 'middle'=>'resource', 'buttons'=>'resource'], + 'newt_grid_v_close_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], + 'newt_grid_v_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], + 'newt_grid_wrapped_window' => ['void', 'grid'=>'resource', 'title'=>'string'], + 'newt_grid_wrapped_window_at' => ['void', 'grid'=>'resource', 'title'=>'string', 'left'=>'int', 'top'=>'int'], + 'newt_init' => ['int'], + 'newt_label' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], + 'newt_label_set_text' => ['void', 'label'=>'resource', 'text'=>'string'], + 'newt_listbox' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'flags='=>'int'], + 'newt_listbox_append_entry' => ['void', 'listbox'=>'resource', 'text'=>'string', 'data'=>'mixed'], + 'newt_listbox_clear' => ['void', 'listobx'=>'resource'], + 'newt_listbox_clear_selection' => ['void', 'listbox'=>'resource'], + 'newt_listbox_delete_entry' => ['void', 'listbox'=>'resource', 'key'=>'mixed'], + 'newt_listbox_get_current' => ['string', 'listbox'=>'resource'], + 'newt_listbox_get_selection' => ['array', 'listbox'=>'resource'], + 'newt_listbox_insert_entry' => ['void', 'listbox'=>'resource', 'text'=>'string', 'data'=>'mixed', 'key'=>'mixed'], + 'newt_listbox_item_count' => ['int', 'listbox'=>'resource'], + 'newt_listbox_select_item' => ['void', 'listbox'=>'resource', 'key'=>'mixed', 'sense'=>'int'], + 'newt_listbox_set_current' => ['void', 'listbox'=>'resource', 'num'=>'int'], + 'newt_listbox_set_current_by_key' => ['void', 'listbox'=>'resource', 'key'=>'mixed'], + 'newt_listbox_set_data' => ['void', 'listbox'=>'resource', 'num'=>'int', 'data'=>'mixed'], + 'newt_listbox_set_entry' => ['void', 'listbox'=>'resource', 'num'=>'int', 'text'=>'string'], + 'newt_listbox_set_width' => ['void', 'listbox'=>'resource', 'width'=>'int'], + 'newt_listitem' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'is_default'=>'bool', 'prev_item'=>'resource', 'data'=>'mixed', 'flags='=>'int'], + 'newt_listitem_get_data' => ['mixed', 'item'=>'resource'], + 'newt_listitem_set' => ['void', 'item'=>'resource', 'text'=>'string'], + 'newt_open_window' => ['int', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'height'=>'int', 'title='=>'string'], + 'newt_pop_help_line' => ['void'], + 'newt_pop_window' => ['void'], + 'newt_push_help_line' => ['void', 'text='=>'string'], + 'newt_radio_get_current' => ['resource', 'set_member'=>'resource'], + 'newt_radiobutton' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'is_default'=>'bool', 'prev_button='=>'resource'], + 'newt_redraw_help_line' => ['void'], + 'newt_reflow_text' => ['string', 'text'=>'string', 'width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'actual_width'=>'int', 'actual_height'=>'int'], + 'newt_refresh' => ['void'], + 'newt_resize_screen' => ['void', 'redraw='=>'bool'], + 'newt_resume' => ['void'], + 'newt_run_form' => ['resource', 'form'=>'resource'], + 'newt_scale' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'full_value'=>'int'], + 'newt_scale_set' => ['void', 'scale'=>'resource', 'amount'=>'int'], + 'newt_scrollbar_set' => ['void', 'scrollbar'=>'resource', 'where'=>'int', 'total'=>'int'], + 'newt_set_help_callback' => ['void', 'function'=>'mixed'], + 'newt_set_suspend_callback' => ['void', 'function'=>'callable', 'data'=>'mixed'], + 'newt_suspend' => ['void'], + 'newt_textbox' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'height'=>'int', 'flags='=>'int'], + 'newt_textbox_get_num_lines' => ['int', 'textbox'=>'resource'], + 'newt_textbox_reflowed' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'char', 'width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'flags='=>'int'], + 'newt_textbox_set_height' => ['void', 'textbox'=>'resource', 'height'=>'int'], + 'newt_textbox_set_text' => ['void', 'textbox'=>'resource', 'text'=>'string'], + 'newt_vertical_scrollbar' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'normal_colorset='=>'int', 'thumb_colorset='=>'int'], + 'newt_wait_for_key' => ['void'], + 'newt_win_choice' => ['int', 'title'=>'string', 'button1_text'=>'string', 'button2_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], + 'newt_win_entries' => ['int', 'title'=>'string', 'text'=>'string', 'suggested_width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'data_width'=>'int', 'items'=>'array', 'button1'=>'string', '...args='=>'string'], + 'newt_win_menu' => ['int', 'title'=>'string', 'text'=>'string', 'suggestedwidth'=>'int', 'flexdown'=>'int', 'flexup'=>'int', 'maxlistheight'=>'int', 'items'=>'array', 'listitem'=>'int', 'button1='=>'string', '...args='=>'string'], + 'newt_win_message' => ['void', 'title'=>'string', 'button_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], + 'newt_win_messagev' => ['void', 'title'=>'string', 'button_text'=>'string', 'format'=>'string', 'args'=>'array'], + 'newt_win_ternary' => ['int', 'title'=>'string', 'button1_text'=>'string', 'button2_text'=>'string', 'button3_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], + 'next' => ['mixed', '&r_array'=>'array|object'], + 'ngettext' => ['string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int'], + 'nl2br' => ['string', 'string'=>'string', 'use_xhtml='=>'bool'], + 'nl_langinfo' => ['string|false', 'item'=>'int'], + 'normalizer_get_raw_decomposition' => ['string|null', 'string'=>'string'], + 'normalizer_is_normalized' => ['bool', 'string'=>'string', 'form='=>'int'], + 'normalizer_normalize' => ['string', 'string'=>'string', 'form='=>'int'], + 'notes_body' => ['array', 'server'=>'string', 'mailbox'=>'string', 'msg_number'=>'int'], + 'notes_copy_db' => ['bool', 'from_database_name'=>'string', 'to_database_name'=>'string'], + 'notes_create_db' => ['bool', 'database_name'=>'string'], + 'notes_create_note' => ['bool', 'database_name'=>'string', 'form_name'=>'string'], + 'notes_drop_db' => ['bool', 'database_name'=>'string'], + 'notes_find_note' => ['int', 'database_name'=>'string', 'name'=>'string', 'type='=>'string'], + 'notes_header_info' => ['object', 'server'=>'string', 'mailbox'=>'string', 'msg_number'=>'int'], + 'notes_list_msgs' => ['bool', 'db'=>'string'], + 'notes_mark_read' => ['bool', 'database_name'=>'string', 'user_name'=>'string', 'note_id'=>'string'], + 'notes_mark_unread' => ['bool', 'database_name'=>'string', 'user_name'=>'string', 'note_id'=>'string'], + 'notes_nav_create' => ['bool', 'database_name'=>'string', 'name'=>'string'], + 'notes_search' => ['array', 'database_name'=>'string', 'keywords'=>'string'], + 'notes_unread' => ['array', 'database_name'=>'string', 'user_name'=>'string'], + 'notes_version' => ['float', 'database_name'=>'string'], + 'nsapi_request_headers' => ['array'], + 'nsapi_response_headers' => ['array'], + 'nsapi_virtual' => ['bool', 'uri'=>'string'], + 'nthmac' => ['string', 'clent'=>'string', 'data'=>'string'], + 'number_format' => ['string', 'num'=>'float|int', 'decimals='=>'int'], + 'number_format\'1' => ['string', 'num'=>'float|int', 'decimals'=>'int', 'decimal_separator'=>'?string', 'thousands_separator'=>'?string'], + 'numfmt_create' => ['NumberFormatter|false', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], + 'numfmt_format' => ['string|false', 'formatter'=>'NumberFormatter', 'num'=>'int|float', 'type='=>'int'], + 'numfmt_format_currency' => ['string|false', 'formatter'=>'NumberFormatter', 'amount'=>'float', 'currency'=>'string'], + 'numfmt_get_attribute' => ['int|false', 'formatter'=>'NumberFormatter', 'attribute'=>'int'], + 'numfmt_get_error_code' => ['int', 'formatter'=>'NumberFormatter'], + 'numfmt_get_error_message' => ['string', 'formatter'=>'NumberFormatter'], + 'numfmt_get_locale' => ['string', 'formatter'=>'NumberFormatter', 'type='=>'int'], + 'numfmt_get_pattern' => ['string|false', 'formatter'=>'NumberFormatter'], + 'numfmt_get_symbol' => ['string|false', 'formatter'=>'NumberFormatter', 'symbol'=>'int'], + 'numfmt_get_text_attribute' => ['string|false', 'formatter'=>'NumberFormatter', 'attribute'=>'int'], + 'numfmt_parse' => ['float|int|false', 'formatter'=>'NumberFormatter', 'string'=>'string', 'type='=>'int', '&rw_offset='=>'int'], + 'numfmt_parse_currency' => ['float|false', 'formatter'=>'NumberFormatter', 'string'=>'string', '&w_currency'=>'string', '&rw_offset='=>'int'], + 'numfmt_set_attribute' => ['bool', 'formatter'=>'NumberFormatter', 'attribute'=>'int', 'value'=>'int'], + 'numfmt_set_pattern' => ['bool', 'formatter'=>'NumberFormatter', 'pattern'=>'string'], + 'numfmt_set_symbol' => ['bool', 'formatter'=>'NumberFormatter', 'symbol'=>'int', 'value'=>'string'], + 'numfmt_set_text_attribute' => ['bool', 'formatter'=>'NumberFormatter', 'attribute'=>'int', 'value'=>'string'], + 'oauth_get_sbs' => ['string', 'http_method'=>'string', 'uri'=>'string', 'request_parameters='=>'array'], + 'oauth_urlencode' => ['string', 'uri'=>'string'], + 'ob_clean' => ['bool'], + 'ob_deflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'], + 'ob_end_clean' => ['bool'], + 'ob_end_flush' => ['bool'], + 'ob_etaghandler' => ['string', 'data'=>'string', 'mode'=>'int'], + 'ob_flush' => ['bool'], + 'ob_get_clean' => ['string|false'], + 'ob_get_contents' => ['string|false'], + 'ob_get_flush' => ['string|false'], + 'ob_get_length' => ['int|false'], + 'ob_get_level' => ['int'], + 'ob_get_status' => ['array', 'full_status='=>'bool'], + 'ob_gzhandler' => ['string|false', 'data'=>'string', 'flags'=>'int'], + 'ob_iconv_handler' => ['string', 'contents'=>'string', 'status'=>'int'], + 'ob_implicit_flush' => ['void', 'enable='=>'int'], + 'ob_inflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'], + 'ob_list_handlers' => ['false|list'], + 'ob_start' => ['bool', 'callback='=>'string|array|?callable', 'chunk_size='=>'int', 'flags='=>'int'], + 'ob_tidyhandler' => ['string', 'input'=>'string', 'mode='=>'int'], + 'oci_bind_array_by_name' => ['bool', 'statement'=>'resource', 'param'=>'string', '&rw_var'=>'array', 'max_array_length'=>'int', 'max_item_length='=>'int', 'type='=>'int'], + 'oci_bind_by_name' => ['bool', 'statement'=>'resource', 'param'=>'string', '&rw_var'=>'mixed', 'max_length='=>'int', 'type='=>'int'], + 'oci_cancel' => ['bool', 'statement'=>'resource'], + 'oci_client_version' => ['string'], + 'oci_close' => ['bool', 'connection'=>'resource'], + 'oci_collection_append' => ['bool', 'collection'=>'string'], + 'oci_collection_assign' => ['bool', 'to'=>'object'], + 'oci_collection_element_assign' => ['bool', 'collection'=>'int', 'index'=>'string'], + 'oci_collection_element_get' => ['string', 'collection'=>'int'], + 'oci_collection_max' => ['int'], + 'oci_collection_size' => ['int'], + 'oci_collection_trim' => ['bool', 'collection'=>'int'], + 'oci_commit' => ['bool', 'connection'=>'resource'], + 'oci_connect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], + 'oci_define_by_name' => ['bool', 'statement'=>'resource', 'column'=>'string', '&w_var'=>'mixed', 'type='=>'int'], + 'oci_error' => ['array|false', 'connection_or_statement='=>'resource'], + 'oci_execute' => ['bool', 'statement'=>'resource', 'mode='=>'int'], + 'oci_fetch' => ['bool', 'statement'=>'resource'], + 'oci_fetch_all' => ['int|false', 'statement'=>'resource', '&w_output'=>'array', 'offset='=>'int', 'limit='=>'int', 'flags='=>'int'], + 'oci_fetch_array' => ['array|false', 'statement'=>'resource', 'mode='=>'int'], + 'oci_fetch_assoc' => ['array|false', 'statement'=>'resource'], + 'oci_fetch_object' => ['object|false', 'statement'=>'resource'], + 'oci_fetch_row' => ['array|false', 'statement'=>'resource'], + 'oci_field_is_null' => ['bool', 'statement'=>'resource', 'column'=>'mixed'], + 'oci_field_name' => ['string|false', 'statement'=>'resource', 'column'=>'mixed'], + 'oci_field_precision' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], + 'oci_field_scale' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], + 'oci_field_size' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], + 'oci_field_type' => ['mixed|false', 'statement'=>'resource', 'column'=>'mixed'], + 'oci_field_type_raw' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], + 'oci_free_collection' => ['bool'], + 'oci_free_cursor' => ['bool', 'statement'=>'resource'], + 'oci_free_descriptor' => ['bool'], + 'oci_free_statement' => ['bool', 'statement'=>'resource'], + 'oci_get_implicit' => ['bool', 'stmt'=>''], + 'oci_get_implicit_resultset' => ['resource|false', 'statement'=>'resource'], + 'oci_internal_debug' => ['void', 'onoff'=>'bool'], + 'oci_lob_append' => ['bool', 'to'=>'object'], + 'oci_lob_close' => ['bool'], + 'oci_lob_copy' => ['bool', 'to'=>'OCILob', 'from'=>'OCILob', 'length='=>'int'], + 'oci_lob_eof' => ['bool'], + 'oci_lob_erase' => ['int', 'lob'=>'int', 'offset'=>'int'], + 'oci_lob_export' => ['bool', 'lob'=>'string', 'filename'=>'int', 'offset'=>'int'], + 'oci_lob_flush' => ['bool', 'lob'=>'int'], + 'oci_lob_import' => ['bool', 'lob'=>'string'], + 'oci_lob_is_equal' => ['bool', 'lob1'=>'OCILob', 'lob2'=>'OCILob'], + 'oci_lob_load' => ['string'], + 'oci_lob_read' => ['string', 'lob'=>'int'], + 'oci_lob_rewind' => ['bool'], + 'oci_lob_save' => ['bool', 'lob'=>'string', 'data'=>'int'], + 'oci_lob_seek' => ['bool', 'lob'=>'int', 'offset'=>'int'], + 'oci_lob_size' => ['int'], + 'oci_lob_tell' => ['int'], + 'oci_lob_truncate' => ['bool', 'lob'=>'int'], + 'oci_lob_write' => ['int', 'lob'=>'string', 'data'=>'int'], + 'oci_lob_write_temporary' => ['bool', 'value'=>'string', 'lob_type'=>'int'], + 'oci_new_collection' => ['OCICollection|false', 'connection'=>'resource', 'type_name'=>'string', 'schema='=>'string'], + 'oci_new_connect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], + 'oci_new_cursor' => ['resource|false', 'connection'=>'resource'], + 'oci_new_descriptor' => ['OCILob|false', 'connection'=>'resource', 'type='=>'int'], + 'oci_num_fields' => ['int|false', 'statement'=>'resource'], + 'oci_num_rows' => ['int|false', 'statement'=>'resource'], + 'oci_parse' => ['resource|false', 'connection'=>'resource', 'sql'=>'string'], + 'oci_password_change' => ['bool', 'connection'=>'resource', 'username'=>'string', 'old_password'=>'string', 'new_password'=>'string'], + 'oci_pconnect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], + 'oci_result' => ['mixed|false', 'statement'=>'resource', 'column'=>'mixed'], + 'oci_rollback' => ['bool', 'connection'=>'resource'], + 'oci_server_version' => ['string|false', 'connection'=>'resource'], + 'oci_set_action' => ['bool', 'connection'=>'resource', 'action'=>'string'], + 'oci_set_call_timeout' => ['bool', 'connection'=>'resource', 'timeout'=>'int'], + 'oci_set_client_identifier' => ['bool', 'connection'=>'resource', 'client_id'=>'string'], + 'oci_set_client_info' => ['bool', 'connection'=>'resource', 'client_info'=>'string'], + 'oci_set_db_operation' => ['bool', 'connection'=>'resource', 'action'=>'string'], + 'oci_set_edition' => ['bool', 'edition'=>'string'], + 'oci_set_module_name' => ['bool', 'connection'=>'resource', 'name'=>'string'], + 'oci_set_prefetch' => ['bool', 'statement'=>'resource', 'rows'=>'int'], + 'oci_statement_type' => ['string|false', 'statement'=>'resource'], + 'ocifetchinto' => ['int|bool', 'statement'=>'resource', '&w_result'=>'array', 'mode='=>'int'], + 'ocigetbufferinglob' => ['bool'], + 'ocisetbufferinglob' => ['bool', 'lob'=>'bool'], + 'octdec' => ['int|float', 'octal_string'=>'string'], + 'odbc_autocommit' => ['mixed', 'odbc'=>'resource', 'enable='=>'bool'], + 'odbc_binmode' => ['bool', 'statement'=>'resource', 'mode'=>'int'], + 'odbc_close' => ['void', 'odbc'=>'resource'], + 'odbc_close_all' => ['void'], + 'odbc_columnprivileges' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'column'=>'string'], + 'odbc_columns' => ['resource|false', 'odbc'=>'resource', 'catalog='=>'string', 'schema='=>'string', 'table='=>'string', 'column='=>'string'], + 'odbc_commit' => ['bool', 'odbc'=>'resource'], + 'odbc_connect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'], + 'odbc_cursor' => ['string', 'statement'=>'resource'], + 'odbc_data_source' => ['array|false', 'odbc'=>'resource', 'fetch_type'=>'int'], + 'odbc_do' => ['resource', 'odbc'=>'resource', 'query'=>'string', 'flags='=>'int'], + 'odbc_error' => ['string', 'odbc='=>'resource'], + 'odbc_errormsg' => ['string', 'odbc='=>'resource'], + 'odbc_exec' => ['resource', 'odbc'=>'resource', 'query'=>'string', 'flags='=>'int'], + 'odbc_execute' => ['bool', 'statement'=>'resource', 'params='=>'array'], + 'odbc_fetch_array' => ['array|false', 'statement'=>'resource', 'row='=>'int'], + 'odbc_fetch_into' => ['int', 'statement'=>'resource', '&w_array'=>'array', 'row='=>'int'], + 'odbc_fetch_object' => ['object|false', 'statement'=>'resource', 'row='=>'int'], + 'odbc_fetch_row' => ['bool', 'statement'=>'resource', 'row='=>'int'], + 'odbc_field_len' => ['int|false', 'statement'=>'resource', 'field'=>'int'], + 'odbc_field_name' => ['string|false', 'statement'=>'resource', 'field'=>'int'], + 'odbc_field_num' => ['int|false', 'statement'=>'resource', 'field'=>'string'], + 'odbc_field_precision' => ['int', 'statement'=>'resource', 'field'=>'int'], + 'odbc_field_scale' => ['int|false', 'statement'=>'resource', 'field'=>'int'], + 'odbc_field_type' => ['string|false', 'statement'=>'resource', 'field'=>'int'], + 'odbc_foreignkeys' => ['resource|false', 'odbc'=>'resource', 'pk_catalog'=>'string', 'pk_schema'=>'string', 'pk_table'=>'string', 'fk_catalog'=>'string', 'fk_schema'=>'string', 'fk_table'=>'string'], + 'odbc_free_result' => ['bool', 'statement'=>'resource'], + 'odbc_gettypeinfo' => ['resource', 'odbc'=>'resource', 'data_type='=>'int'], + 'odbc_longreadlen' => ['bool', 'statement'=>'resource', 'length'=>'int'], + 'odbc_next_result' => ['bool', 'statement'=>'resource'], + 'odbc_num_fields' => ['int', 'statement'=>'resource'], + 'odbc_num_rows' => ['int', 'statement'=>'resource'], + 'odbc_pconnect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'], + 'odbc_prepare' => ['resource|false', 'odbc'=>'resource', 'query'=>'string'], + 'odbc_primarykeys' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string'], + 'odbc_procedurecolumns' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'procedure'=>'string', 'column'=>'string'], + 'odbc_procedures' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'procedure'=>'string'], + 'odbc_result' => ['mixed|false', 'statement'=>'resource', 'field'=>'mixed'], + 'odbc_result_all' => ['int|false', 'statement'=>'resource', 'format='=>'string'], + 'odbc_rollback' => ['bool', 'odbc'=>'resource'], + 'odbc_setoption' => ['bool', 'odbc'=>'resource', 'which'=>'int', 'option'=>'int', 'value'=>'int'], + 'odbc_specialcolumns' => ['resource|false', 'odbc'=>'resource', 'type'=>'int', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'scope'=>'int', 'nullable'=>'int'], + 'odbc_statistics' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'unique'=>'int', 'accuracy'=>'int'], + 'odbc_tableprivileges' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string'], + 'odbc_tables' => ['resource|false', 'odbc'=>'resource', 'catalog='=>'string', 'schema='=>'string', 'table='=>'string', 'types='=>'string'], + 'opcache_compile_file' => ['bool', 'filename'=>'string'], + 'opcache_get_configuration' => ['array'], + 'opcache_get_status' => ['array|false', 'include_scripts='=>'bool'], + 'opcache_invalidate' => ['bool', 'filename'=>'string', 'force='=>'bool'], + 'opcache_is_script_cached' => ['bool', 'filename'=>'string'], + 'opcache_reset' => ['bool'], + 'openal_buffer_create' => ['resource'], + 'openal_buffer_data' => ['bool', 'buffer'=>'resource', 'format'=>'int', 'data'=>'string', 'freq'=>'int'], + 'openal_buffer_destroy' => ['bool', 'buffer'=>'resource'], + 'openal_buffer_get' => ['int', 'buffer'=>'resource', 'property'=>'int'], + 'openal_buffer_loadwav' => ['bool', 'buffer'=>'resource', 'wavfile'=>'string'], + 'openal_context_create' => ['resource', 'device'=>'resource'], + 'openal_context_current' => ['bool', 'context'=>'resource'], + 'openal_context_destroy' => ['bool', 'context'=>'resource'], + 'openal_context_process' => ['bool', 'context'=>'resource'], + 'openal_context_suspend' => ['bool', 'context'=>'resource'], + 'openal_device_close' => ['bool', 'device'=>'resource'], + 'openal_device_open' => ['resource|false', 'device_desc='=>'string'], + 'openal_listener_get' => ['mixed', 'property'=>'int'], + 'openal_listener_set' => ['bool', 'property'=>'int', 'setting'=>'mixed'], + 'openal_source_create' => ['resource'], + 'openal_source_destroy' => ['bool', 'source'=>'resource'], + 'openal_source_get' => ['mixed', 'source'=>'resource', 'property'=>'int'], + 'openal_source_pause' => ['bool', 'source'=>'resource'], + 'openal_source_play' => ['bool', 'source'=>'resource'], + 'openal_source_rewind' => ['bool', 'source'=>'resource'], + 'openal_source_set' => ['bool', 'source'=>'resource', 'property'=>'int', 'setting'=>'mixed'], + 'openal_source_stop' => ['bool', 'source'=>'resource'], + 'openal_stream' => ['resource', 'source'=>'resource', 'format'=>'int', 'rate'=>'int'], + 'opendir' => ['resource|false', 'directory'=>'string', 'context='=>'resource'], + 'openlog' => ['bool', 'prefix'=>'string', 'flags'=>'int', 'facility'=>'int'], + 'openssl_cipher_iv_length' => ['int|false', 'cipher_algo'=>'string'], + 'openssl_csr_export' => ['bool', 'csr'=>'string|resource', '&w_output'=>'string', 'no_text='=>'bool'], + 'openssl_csr_export_to_file' => ['bool', 'csr'=>'string|resource', 'output_filename'=>'string', 'no_text='=>'bool'], + 'openssl_csr_get_public_key' => ['resource|false', 'csr'=>'string|resource', 'short_names='=>'bool'], + 'openssl_csr_get_subject' => ['array|false', 'csr'=>'string|resource', 'short_names='=>'bool'], + 'openssl_csr_new' => ['resource|false', 'distinguished_names'=>'array', '&w_private_key'=>'resource', 'options='=>'array', 'extra_attributes='=>'array'], + 'openssl_csr_sign' => ['resource|false', 'csr'=>'string|resource', 'ca_certificate'=>'string|resource|null', 'private_key'=>'string|resource|array', 'days'=>'int', 'options='=>'array', 'serial='=>'int'], + 'openssl_decrypt' => ['string|false', 'data'=>'string', 'cipher_algo'=>'string', 'passphrase'=>'string', 'options='=>'int', 'iv='=>'string', 'tag='=>'string', 'aad='=>'string'], + 'openssl_dh_compute_key' => ['string|false', 'public_key'=>'string', 'private_key'=>'resource'], + 'openssl_digest' => ['string|false', 'data'=>'string', 'digest_algo'=>'string', 'binary='=>'bool'], + 'openssl_encrypt' => ['string|false', 'data'=>'string', 'cipher_algo'=>'string', 'passphrase'=>'string', 'options='=>'int', 'iv='=>'string', '&w_tag='=>'string', 'aad='=>'string', 'tag_length='=>'int'], + 'openssl_error_string' => ['string|false'], + 'openssl_free_key' => ['void', 'key'=>'resource'], + 'openssl_get_cert_locations' => ['array'], + 'openssl_get_cipher_methods' => ['array', 'aliases='=>'bool'], + 'openssl_get_md_methods' => ['array', 'aliases='=>'bool'], + 'openssl_get_privatekey' => ['resource|false', 'private_key'=>'string', 'passphrase='=>'string'], + 'openssl_get_publickey' => ['resource|false', 'public_key'=>'resource|string'], + 'openssl_open' => ['bool', 'data'=>'string', '&w_output'=>'string', 'encrypted_key'=>'string', 'private_key'=>'string|array|resource', 'cipher_algo='=>'string', 'iv='=>'string'], + 'openssl_pbkdf2' => ['string|false', 'password'=>'string', 'salt'=>'string', 'key_length'=>'int', 'iterations'=>'int', 'digest_algo='=>'string'], + 'openssl_pkcs12_export' => ['bool', 'certificate'=>'string|resource', '&w_output'=>'string', 'private_key'=>'string|array|resource', 'passphrase'=>'string', 'options='=>'array'], + 'openssl_pkcs12_export_to_file' => ['bool', 'certificate'=>'string|resource', 'output_filename'=>'string', 'private_key'=>'string|array|resource', 'passphrase'=>'string', 'options='=>'array'], + 'openssl_pkcs12_read' => ['bool', 'pkcs12'=>'string', '&w_certificates'=>'array', 'passphrase'=>'string'], + 'openssl_pkcs7_decrypt' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource', 'private_key='=>'string|resource|array'], + 'openssl_pkcs7_encrypt' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'cipher_algo='=>'int'], + 'openssl_pkcs7_read' => ['bool', 'input_filename'=>'string', '&w_certificates'=>'array'], + 'openssl_pkcs7_sign' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource', 'private_key'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'untrusted_certificates_filename='=>'string'], + 'openssl_pkcs7_verify' => ['bool|int', 'input_filename'=>'string', 'flags'=>'int', 'signers_certificates_filename='=>'string', 'ca_info='=>'array', 'untrusted_certificates_filename='=>'string', 'content='=>'string', 'output_filename='=>'string'], + 'openssl_pkey_export' => ['bool', 'key'=>'resource', '&w_output'=>'string', 'passphrase='=>'string|null', 'options='=>'array'], + 'openssl_pkey_export_to_file' => ['bool', 'key'=>'resource|string|array', 'output_filename'=>'string', 'passphrase='=>'string|null', 'options='=>'array'], + 'openssl_pkey_free' => ['void', 'key'=>'resource'], + 'openssl_pkey_get_details' => ['array|false', 'key'=>'resource'], + 'openssl_pkey_get_private' => ['resource|false', 'private_key'=>'string', 'passphrase='=>'string'], + 'openssl_pkey_get_public' => ['resource|false', 'public_key'=>'resource|string'], + 'openssl_pkey_new' => ['resource|false', 'options='=>'array'], + 'openssl_private_decrypt' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'private_key'=>'string|resource|array', 'padding='=>'int'], + 'openssl_private_encrypt' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'private_key'=>'string|resource|array', 'padding='=>'int'], + 'openssl_public_decrypt' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'public_key'=>'string|resource', 'padding='=>'int'], + 'openssl_public_encrypt' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'public_key'=>'string|resource', 'padding='=>'int'], + 'openssl_random_pseudo_bytes' => ['string|false', 'length'=>'int', '&w_strong_result='=>'bool'], + 'openssl_seal' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&w_encrypted_keys'=>'array', 'public_key'=>'array', 'cipher_algo='=>'string', '&rw_iv='=>'string'], + 'openssl_sign' => ['bool', 'data'=>'string', '&w_signature'=>'string', 'private_key'=>'resource|string', 'algorithm='=>'int|string'], + 'openssl_spki_export' => ['?string', 'spki'=>'string'], + 'openssl_spki_export_challenge' => ['?string', 'spki'=>'string'], + 'openssl_spki_new' => ['?string', 'private_key'=>'resource', 'challenge'=>'string', 'digest_algo='=>'int'], + 'openssl_spki_verify' => ['bool', 'spki'=>'string'], + 'openssl_verify' => ['-1|0|1', 'data'=>'string', 'signature'=>'string', 'public_key'=>'resource|string', 'algorithm='=>'int|string'], + 'openssl_x509_check_private_key' => ['bool', 'certificate'=>'string|resource', 'private_key'=>'string|resource|array'], + 'openssl_x509_checkpurpose' => ['bool|int', 'certificate'=>'string|resource', 'purpose'=>'int', 'ca_info='=>'array', 'untrusted_certificates_file='=>'string'], + 'openssl_x509_export' => ['bool', 'certificate'=>'string|resource', '&w_output'=>'string', 'no_text='=>'bool'], + 'openssl_x509_export_to_file' => ['bool', 'certificate'=>'string|resource', 'output_filename'=>'string', 'no_text='=>'bool'], + 'openssl_x509_fingerprint' => ['string|false', 'certificate'=>'string|resource', 'digest_algo='=>'string', 'binary='=>'bool'], + 'openssl_x509_free' => ['void', 'certificate'=>'resource'], + 'openssl_x509_parse' => ['array|false', 'certificate'=>'string|resource', 'short_names='=>'bool'], + 'openssl_x509_read' => ['resource|false', 'certificate'=>'string|resource'], + 'ord' => ['int', 'character'=>'string'], + 'output_add_rewrite_var' => ['bool', 'name'=>'string', 'value'=>'string'], + 'output_cache_disable' => ['void'], + 'output_cache_disable_compression' => ['void'], + 'output_cache_exists' => ['bool', 'key'=>'string', 'lifetime'=>'int'], + 'output_cache_fetch' => ['string', 'key'=>'string', 'function'=>'', 'lifetime'=>'int'], + 'output_cache_get' => ['mixed|false', 'key'=>'string', 'lifetime'=>'int'], + 'output_cache_output' => ['string', 'key'=>'string', 'function'=>'', 'lifetime'=>'int'], + 'output_cache_put' => ['bool', 'key'=>'string', 'data'=>'mixed'], + 'output_cache_remove' => ['bool', 'filename'=>''], + 'output_cache_remove_key' => ['bool', 'key'=>'string'], + 'output_cache_remove_url' => ['bool', 'url'=>'string'], + 'output_cache_stop' => ['void'], + 'output_reset_rewrite_vars' => ['bool'], + 'outputformatObj::getOption' => ['string', 'property_name'=>'string'], + 'outputformatObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'outputformatObj::setOption' => ['void', 'property_name'=>'string', 'new_value'=>'string'], + 'outputformatObj::validate' => ['int'], + 'overload' => ['', 'class_name'=>'string'], + 'override_function' => ['bool', 'function_name'=>'string', 'function_args'=>'string', 'function_code'=>'string'], + 'pack' => ['string|false', 'format'=>'string', '...values='=>'mixed'], + 'parallel\Future::done' => ['bool'], + 'parallel\Future::select' => ['mixed', '&resolving'=>'parallel\Future[]', '&w_resolved'=>'parallel\Future[]', '&w_errored'=>'parallel\Future[]', '&w_timedout='=>'parallel\Future[]', 'timeout='=>'int'], + 'parallel\Future::value' => ['mixed', 'timeout='=>'int'], + 'parallel\Runtime::__construct' => ['void', 'arg'=>'string|array'], + 'parallel\Runtime::__construct\'1' => ['void', 'bootstrap'=>'string', 'configuration'=>'array'], + 'parallel\Runtime::close' => ['void'], + 'parallel\Runtime::kill' => ['void'], + 'parallel\Runtime::run' => ['?parallel\Future', 'closure'=>'Closure', 'args='=>'array'], + 'parle\rlexer::insertMacro' => ['void', 'name'=>'string', 'regex'=>'string'], + 'parse_ini_file' => ['array|false', 'filename'=>'string', 'process_sections='=>'bool', 'scanner_mode='=>'int'], + 'parse_ini_string' => ['array|false', 'ini_string'=>'string', 'process_sections='=>'bool', 'scanner_mode='=>'int'], + 'parse_str' => ['void', 'string'=>'string', '&w_result='=>'array'], + 'parse_url' => ['mixed|false', 'url'=>'string', 'component='=>'int'], + 'parsekit_compile_file' => ['array', 'filename'=>'string', 'errors='=>'array', 'options='=>'int'], + 'parsekit_compile_string' => ['array', 'phpcode'=>'string', 'errors='=>'array', 'options='=>'int'], + 'parsekit_func_arginfo' => ['array', 'function'=>'mixed'], + 'passthru' => ['void', 'command'=>'string', '&w_result_code='=>'int'], + 'password_get_info' => ['array', 'hash'=>'string'], + 'password_hash' => ['string|false', 'password'=>'string', 'algo'=>'int', 'options='=>'array'], + 'password_make_salt' => ['bool', 'password'=>'string', 'hash'=>'string'], + 'password_needs_rehash' => ['bool', 'hash'=>'string', 'algo'=>'int', 'options='=>'array'], + 'password_verify' => ['bool', 'password'=>'string', 'hash'=>'string'], + 'pathinfo' => ['array|string', 'path'=>'string', 'flags='=>'int'], + 'pclose' => ['int', 'handle'=>'resource'], + 'pcnlt_sigwaitinfo' => ['int', 'set'=>'array', '&w_siginfo'=>'array'], + 'pcntl_alarm' => ['int', 'seconds'=>'int'], + 'pcntl_errno' => ['int'], + 'pcntl_exec' => ['null|false', 'path'=>'string', 'args='=>'array', 'env_vars='=>'array'], + 'pcntl_fork' => ['int'], + 'pcntl_get_last_error' => ['int'], + 'pcntl_getpriority' => ['int', 'process_id='=>'int', 'mode='=>'int'], + 'pcntl_setpriority' => ['bool', 'priority'=>'int', 'process_id='=>'int', 'mode='=>'int'], + 'pcntl_signal' => ['bool', 'signal'=>'int', 'handler'=>'callable():void|callable(int):void|callable(int,array):void|int', 'restart_syscalls='=>'bool'], + 'pcntl_signal_dispatch' => ['bool'], + 'pcntl_sigprocmask' => ['bool', 'mode'=>'int', 'signals'=>'array', '&w_old_signals='=>'array'], + 'pcntl_sigtimedwait' => ['int', 'signals'=>'array', '&w_info='=>'array', 'seconds='=>'int', 'nanoseconds='=>'int'], + 'pcntl_sigwaitinfo' => ['int', 'signals'=>'array', '&w_info='=>'array'], + 'pcntl_strerror' => ['string|false', 'error_code'=>'int'], + 'pcntl_wait' => ['int', '&w_status'=>'int', 'flags='=>'int', '&w_resource_usage='=>'array'], + 'pcntl_waitpid' => ['int', 'process_id'=>'int', '&w_status'=>'int', 'flags='=>'int', '&w_resource_usage='=>'array'], + 'pcntl_wexitstatus' => ['int', 'status'=>'int'], + 'pcntl_wifcontinued' => ['bool', 'status'=>'int'], + 'pcntl_wifexited' => ['bool', 'status'=>'int'], + 'pcntl_wifsignaled' => ['bool', 'status'=>'int'], + 'pcntl_wifstopped' => ['bool', 'status'=>'int'], + 'pcntl_wstopsig' => ['int', 'status'=>'int'], + 'pcntl_wtermsig' => ['int', 'status'=>'int'], + 'pdo_drivers' => ['array'], + 'pfsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float'], + 'pg_affected_rows' => ['int', 'result'=>'resource'], + 'pg_cancel_query' => ['bool', 'connection'=>'resource'], + 'pg_client_encoding' => ['string', 'connection='=>'resource'], + 'pg_close' => ['bool', 'connection='=>'resource'], + 'pg_connect' => ['resource|false', 'connection_string'=>'string', 'flags='=>'int'], + 'pg_connect_poll' => ['int', 'connection'=>'resource'], + 'pg_connection_busy' => ['bool', 'connection'=>'resource'], + 'pg_connection_reset' => ['bool', 'connection'=>'resource'], + 'pg_connection_status' => ['int', 'connection'=>'resource'], + 'pg_consume_input' => ['bool', 'connection'=>'resource'], + 'pg_convert' => ['array|false', 'connection'=>'resource', 'table_name'=>'string', 'values'=>'array', 'flags='=>'int'], + 'pg_copy_from' => ['bool', 'connection'=>'resource', 'table_name'=>'string', 'rows'=>'array', 'separator='=>'string', 'null_as='=>'string'], + 'pg_copy_to' => ['array|false', 'connection'=>'resource', 'table_name'=>'string', 'separator='=>'string', 'null_as='=>'string'], + 'pg_dbname' => ['string', 'connection='=>'resource'], + 'pg_delete' => ['string|bool', 'connection'=>'resource', 'table_name'=>'string', 'conditions'=>'array', 'flags='=>'int'], + 'pg_end_copy' => ['bool', 'connection='=>'resource'], + 'pg_escape_bytea' => ['string', 'connection'=>'resource', 'string'=>'string'], + 'pg_escape_bytea\'1' => ['string', 'connection'=>'string'], + 'pg_escape_identifier' => ['string|false', 'connection'=>'resource', 'string'=>'string'], + 'pg_escape_identifier\'1' => ['string|false', 'connection'=>'string'], + 'pg_escape_literal' => ['string|false', 'connection'=>'resource', 'string'=>'string'], + 'pg_escape_literal\'1' => ['string|false', 'connection'=>'string'], + 'pg_escape_string' => ['string', 'connection'=>'resource', 'string'=>'string'], + 'pg_escape_string\'1' => ['string', 'connection'=>'string'], + 'pg_exec' => ['resource|false', 'connection'=>'resource', 'query'=>'string'], + 'pg_execute' => ['resource|false', 'connection'=>'resource', 'statement_name'=>'string', 'params'=>'array'], + 'pg_execute\'1' => ['resource|false', 'connection'=>'string', 'statement_name'=>'array'], + 'pg_fetch_all' => ['array', 'result'=>'resource'], + 'pg_fetch_all_columns' => ['array', 'result'=>'resource', 'field='=>'int'], + 'pg_fetch_array' => ['array|false', 'result'=>'resource', 'row='=>'?int', 'mode='=>'int'], + 'pg_fetch_assoc' => ['array|false', 'result'=>'resource', 'row='=>'?int'], + 'pg_fetch_object' => ['object|false', 'result'=>'resource', 'row='=>'?int', 'class='=>'string', 'constructor_args='=>'array'], + 'pg_fetch_result' => ['string|false|null', 'result'=>'resource', 'row'=>'string|int'], + 'pg_fetch_result\'1' => ['string|false|null', 'result'=>'resource', 'row'=>'?int', 'field'=>'string|int'], + 'pg_fetch_row' => ['array|false', 'result'=>'resource', 'row='=>'?int', 'mode='=>'int'], + 'pg_field_is_null' => ['int|false', 'result'=>'resource', 'row'=>'string|int'], + 'pg_field_is_null\'1' => ['int|false', 'result'=>'resource', 'row'=>'int', 'field'=>'string|int'], + 'pg_field_name' => ['string', 'result'=>'resource', 'field'=>'int'], + 'pg_field_num' => ['int', 'result'=>'resource', 'field'=>'string'], + 'pg_field_prtlen' => ['int|false', 'result'=>'resource', 'row'=>'string|int'], + 'pg_field_prtlen\'1' => ['int|false', 'result'=>'resource', 'row'=>'int', 'field'=>'string|int'], + 'pg_field_size' => ['int', 'result'=>'resource', 'field'=>'int'], + 'pg_field_table' => ['string|int|false', 'result'=>'resource', 'field'=>'int', 'oid_only='=>'bool'], + 'pg_field_type' => ['string', 'result'=>'resource', 'field'=>'int'], + 'pg_field_type_oid' => ['int|string', 'result'=>'resource', 'field'=>'int'], + 'pg_flush' => ['int|bool', 'connection'=>'resource'], + 'pg_free_result' => ['bool', 'result'=>'resource'], + 'pg_get_notify' => ['array|false', 'result'=>'resource', 'mode='=>'int'], + 'pg_get_pid' => ['int', 'connection'=>'resource'], + 'pg_get_result' => ['resource|false', 'connection='=>'resource'], + 'pg_host' => ['string', 'connection='=>'resource'], + 'pg_insert' => ['resource|string|false', 'connection'=>'resource', 'table_name'=>'string', 'values'=>'array', 'flags='=>'int'], + 'pg_last_error' => ['string', 'connection='=>'resource'], + 'pg_last_notice' => ['string|array|bool', 'connection'=>'resource', 'mode='=>'int'], + 'pg_last_oid' => ['string|int|false', 'result'=>'resource'], + 'pg_lo_close' => ['bool', 'lob'=>'resource'], + 'pg_lo_create' => ['int|string|false', 'connection='=>'resource', 'oid='=>'int|string'], + 'pg_lo_export' => ['bool', 'connection'=>'resource', 'oid'=>'int|string', 'filename'=>'string'], + 'pg_lo_export\'1' => ['bool', 'connection'=>'int|string', 'oid'=>'string'], + 'pg_lo_import' => ['int|string|false', 'connection'=>'resource', 'filename'=>'string', 'oid'=>'string|int'], + 'pg_lo_import\'1' => ['int|string|false', 'connection'=>'string', 'filename'=>'string|int'], + 'pg_lo_open' => ['resource|false', 'connection'=>'resource', 'oid'=>'int|string', 'mode'=>'string'], + 'pg_lo_open\'1' => ['resource|false', 'connection'=>'int|string', 'oid'=>'string'], + 'pg_lo_read' => ['string|false', 'lob'=>'resource', 'length='=>'int'], + 'pg_lo_read_all' => ['int', 'lob'=>'resource'], + 'pg_lo_seek' => ['bool', 'lob'=>'resource', 'offset'=>'int', 'whence='=>'int'], + 'pg_lo_tell' => ['int', 'lob'=>'resource'], + 'pg_lo_truncate' => ['bool', 'lob'=>'resource', 'size'=>'int'], + 'pg_lo_unlink' => ['bool', 'connection'=>'resource', 'oid'=>'int|string'], + 'pg_lo_unlink\'1' => ['bool', 'connection'=>'int|string'], + 'pg_lo_write' => ['int|false', 'lob'=>'resource', 'data'=>'string', 'length='=>'int'], + 'pg_meta_data' => ['array|false', 'connection'=>'resource', 'table_name'=>'string', 'extended='=>'bool'], + 'pg_num_fields' => ['int', 'result'=>'resource'], + 'pg_num_rows' => ['int', 'result'=>'resource'], + 'pg_options' => ['string', 'connection='=>'resource'], + 'pg_parameter_status' => ['string|false', 'connection'=>'resource', 'name'=>'string'], + 'pg_parameter_status\'1' => ['string|false', 'connection'=>'string'], + 'pg_pconnect' => ['resource|false', 'connection_string'=>'string', 'flags='=>'string', 'port='=>'string|int', 'options='=>'string', 'tty='=>'string', 'database='=>'string'], + 'pg_ping' => ['bool', 'connection='=>'resource'], + 'pg_port' => ['int', 'connection='=>'resource'], + 'pg_prepare' => ['resource|false', 'connection'=>'resource', 'statement_name'=>'string', 'query'=>'string'], + 'pg_prepare\'1' => ['resource|false', 'connection'=>'string', 'statement_name'=>'string'], + 'pg_put_line' => ['bool', 'connection'=>'resource', 'data'=>'string'], + 'pg_put_line\'1' => ['bool', 'connection'=>'string'], + 'pg_query' => ['resource|false', 'connection'=>'resource', 'query'=>'string'], + 'pg_query\'1' => ['resource|false', 'connection'=>'string'], + 'pg_query_params' => ['resource|false', 'connection'=>'resource', 'query'=>'string', 'params'=>'array'], + 'pg_query_params\'1' => ['resource|false', 'connection'=>'string', 'query'=>'array'], + 'pg_result_error' => ['string|false', 'result'=>'resource'], + 'pg_result_error_field' => ['string|false|null', 'result'=>'resource', 'field_code'=>'int'], + 'pg_result_seek' => ['bool', 'result'=>'resource', 'row'=>'int'], + 'pg_result_status' => ['string|int', 'result'=>'resource', 'mode='=>'int'], + 'pg_select' => ['string|array|false', 'connection'=>'resource', 'table_name'=>'string', 'assoc_array'=>'array', 'options='=>'int'], + 'pg_send_execute' => ['bool|int', 'connection'=>'resource', 'query'=>'string', 'params'=>'array'], + 'pg_send_prepare' => ['bool|int', 'connection'=>'resource', 'statement_name'=>'string', 'query'=>'string'], + 'pg_send_query' => ['bool|int', 'connection'=>'resource', 'query'=>'string'], + 'pg_send_query_params' => ['bool|int', 'connection'=>'resource', 'query'=>'string', 'params'=>'array'], + 'pg_set_client_encoding' => ['int', 'connection'=>'resource', 'encoding'=>'string'], + 'pg_set_client_encoding\'1' => ['int', 'connection'=>'string'], + 'pg_set_error_verbosity' => ['int|false', 'connection'=>'resource', 'verbosity'=>'int'], + 'pg_set_error_verbosity\'1' => ['int|false', 'connection'=>'int'], + 'pg_socket' => ['resource|false', 'connection'=>'resource'], + 'pg_trace' => ['bool', 'filename'=>'string', 'mode='=>'string', 'connection='=>'resource'], + 'pg_transaction_status' => ['int', 'connection'=>'resource'], + 'pg_tty' => ['string', 'connection='=>'resource'], + 'pg_unescape_bytea' => ['string', 'string'=>'string'], + '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'], + 'phdfs::copy' => ['bool', 'source_file'=>'string', 'destination_file'=>'string'], + 'phdfs::create_directory' => ['bool', 'path'=>'string'], + 'phdfs::delete' => ['bool', 'path'=>'string'], + 'phdfs::disconnect' => ['bool'], + 'phdfs::exists' => ['bool', 'path'=>'string'], + 'phdfs::file_info' => ['array', 'path'=>'string'], + 'phdfs::list_directory' => ['array', 'path'=>'string'], + 'phdfs::read' => ['string', 'path'=>'string', 'length='=>'string'], + 'phdfs::rename' => ['bool', 'old_path'=>'string', 'new_path'=>'string'], + 'phdfs::tell' => ['int', 'path'=>'string'], + 'phdfs::write' => ['bool', 'path'=>'string', 'buffer'=>'string', 'mode='=>'string'], + 'php_check_syntax' => ['bool', 'filename'=>'string', 'error_message='=>'string'], + 'php_ini_loaded_file' => ['string|false'], + 'php_ini_scanned_files' => ['string|false'], + 'php_logo_guid' => ['string'], + 'php_sapi_name' => ['string'], + 'php_strip_whitespace' => ['string', 'filename'=>'string'], + 'php_uname' => ['string', 'mode='=>'string'], + 'php_user_filter::filter' => ['int', 'in'=>'resource', 'out'=>'resource', '&rw_consumed'=>'int', 'closing'=>'bool'], + 'php_user_filter::onClose' => ['void'], + 'php_user_filter::onCreate' => ['bool'], + 'phpcredits' => ['bool', 'flags='=>'int'], + 'phpdbg_break_file' => ['void', 'file'=>'string', 'line'=>'int'], + 'phpdbg_break_function' => ['void', 'function'=>'string'], + 'phpdbg_break_method' => ['void', 'class'=>'string', 'method'=>'string'], + 'phpdbg_break_next' => ['void'], + 'phpdbg_clear' => ['void'], + 'phpdbg_color' => ['void', 'element'=>'int', 'color'=>'string'], + 'phpdbg_end_oplog' => ['array', 'options='=>'array'], + 'phpdbg_exec' => ['mixed', 'context='=>'string'], + 'phpdbg_get_executable' => ['array', 'options='=>'array'], + 'phpdbg_prompt' => ['void', 'string'=>'string'], + 'phpdbg_start_oplog' => ['void'], + 'phpinfo' => ['bool', 'flags='=>'int'], + 'phpversion' => ['string|false', 'extension='=>'string'], + 'pht\AtomicInteger::__construct' => ['void', 'value='=>'int'], + 'pht\AtomicInteger::dec' => ['void'], + 'pht\AtomicInteger::get' => ['int'], + 'pht\AtomicInteger::inc' => ['void'], + 'pht\AtomicInteger::lock' => ['void'], + 'pht\AtomicInteger::set' => ['void', 'value'=>'int'], + 'pht\AtomicInteger::unlock' => ['void'], + 'pht\HashTable::lock' => ['void'], + 'pht\HashTable::size' => ['int'], + 'pht\HashTable::unlock' => ['void'], + 'pht\Queue::front' => ['mixed'], + 'pht\Queue::lock' => ['void'], + 'pht\Queue::pop' => ['mixed'], + 'pht\Queue::push' => ['void', 'value'=>'mixed'], + 'pht\Queue::size' => ['int'], + 'pht\Queue::unlock' => ['void'], + 'pht\Runnable::run' => ['void'], + 'pht\Vector::__construct' => ['void', 'size='=>'int', 'value='=>'mixed'], + 'pht\Vector::deleteAt' => ['void', 'offset'=>'int'], + 'pht\Vector::insertAt' => ['void', 'value'=>'mixed', 'offset'=>'int'], + 'pht\Vector::lock' => ['void'], + 'pht\Vector::pop' => ['mixed'], + 'pht\Vector::push' => ['void', 'value'=>'mixed'], + 'pht\Vector::resize' => ['void', 'size'=>'int', 'value='=>'mixed'], + 'pht\Vector::shift' => ['mixed'], + 'pht\Vector::size' => ['int'], + 'pht\Vector::unlock' => ['void'], + 'pht\Vector::unshift' => ['void', 'value'=>'mixed'], + 'pht\Vector::updateAt' => ['void', 'value'=>'mixed', 'offset'=>'int'], + 'pht\thread::addClassTask' => ['void', 'className'=>'string', '...ctorArgs='=>'mixed'], + 'pht\thread::addFileTask' => ['void', 'fileName'=>'string', '...globals='=>'mixed'], + 'pht\thread::addFunctionTask' => ['void', 'func'=>'callable', '...funcArgs='=>'mixed'], + 'pht\thread::join' => ['void'], + 'pht\thread::start' => ['void'], + 'pht\thread::taskCount' => ['int'], + 'pht\threaded::lock' => ['void'], + 'pht\threaded::unlock' => ['void'], + 'pi' => ['float'], + 'png2wbmp' => ['bool', 'pngname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'], + 'pointObj::__construct' => ['void'], + 'pointObj::distanceToLine' => ['float', 'p1'=>'pointObj', 'p2'=>'pointObj'], + 'pointObj::distanceToPoint' => ['float', 'poPoint'=>'pointObj'], + 'pointObj::distanceToShape' => ['float', 'shape'=>'shapeObj'], + 'pointObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'], + 'pointObj::ms_newPointObj' => ['pointObj'], + 'pointObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], + 'pointObj::setXY' => ['int', 'x'=>'float', 'y'=>'float', 'm'=>'float'], + 'pointObj::setXYZ' => ['int', 'x'=>'float', 'y'=>'float', 'z'=>'float', 'm'=>'float'], + 'popen' => ['resource|false', 'command'=>'string', 'mode'=>'string'], + 'pos' => ['mixed', 'array'=>'array'], + 'posix_access' => ['bool', 'filename'=>'string', 'flags='=>'int'], + 'posix_ctermid' => ['string|false'], + 'posix_errno' => ['int'], + 'posix_get_last_error' => ['int'], + 'posix_getcwd' => ['string|false'], + 'posix_getegid' => ['int'], + 'posix_geteuid' => ['int'], + 'posix_getgid' => ['int'], + 'posix_getgrgid' => ['array{name: string, passwd: string, gid: int, members: list}|false', 'group_id'=>'int'], + 'posix_getgrnam' => ['array{name: string, passwd: string, gid: int, members: list}|false', 'name'=>'string'], + 'posix_getgroups' => ['list|false'], + 'posix_getlogin' => ['string|false'], + 'posix_getpgid' => ['int|false', 'process_id'=>'int'], + 'posix_getpgrp' => ['int'], + 'posix_getpid' => ['int'], + 'posix_getppid' => ['int'], + 'posix_getpwnam' => ['array{name: string, passwd: string, uid: int, gid: int, gecos: string, dir: string, shell: string}|false', 'username'=>'string'], + 'posix_getpwuid' => ['array{name: string, passwd: string, uid: int, gid: int, gecos: string, dir: string, shell: string}|false', 'user_id'=>'int'], + 'posix_getrlimit' => ['array{"soft core": string, "hard core": string, "soft data": string, "hard data": string, "soft stack": integer, "hard stack": string, "soft totalmem": string, "hard totalmem": string, "soft rss": string, "hard rss": string, "soft maxproc": integer, "hard maxproc": integer, "soft memlock": integer, "hard memlock": integer, "soft cpu": string, "hard cpu": string, "soft filesize": string, "hard filesize": string, "soft openfiles": integer, "hard openfiles": integer}|false'], + 'posix_getsid' => ['int|false', 'process_id'=>'int'], + 'posix_getuid' => ['int'], + 'posix_initgroups' => ['bool', 'username'=>'string', 'group_id'=>'int'], + 'posix_isatty' => ['bool', 'file_descriptor'=>'resource|int'], + 'posix_kill' => ['bool', 'process_id'=>'int', 'signal'=>'int'], + 'posix_mkfifo' => ['bool', 'filename'=>'string', 'permissions'=>'int'], + 'posix_mknod' => ['bool', 'filename'=>'string', 'flags'=>'int', 'major='=>'int', 'minor='=>'int'], + 'posix_setegid' => ['bool', 'group_id'=>'int'], + 'posix_seteuid' => ['bool', 'user_id'=>'int'], + 'posix_setgid' => ['bool', 'group_id'=>'int'], + 'posix_setpgid' => ['bool', 'process_id'=>'int', 'process_group_id'=>'int'], + 'posix_setrlimit' => ['bool', 'resource'=>'int', 'soft_limit'=>'int', 'hard_limit'=>'int'], + 'posix_setsid' => ['int'], + 'posix_setuid' => ['bool', 'user_id'=>'int'], + 'posix_strerror' => ['string', 'error_code'=>'int'], + 'posix_times' => ['array{ticks: int, utime: int, stime: int, cutime: int, cstime: int}|false'], + 'posix_ttyname' => ['string|false', 'file_descriptor'=>'resource|int'], + 'posix_uname' => ['array{sysname: string, nodename: string, release: string, version: string, machine: string, domainname: string}|false'], + 'pow' => ['float|int', 'num'=>'int|float', 'exponent'=>'int|float'], + 'preg_filter' => ['null|string|string[]', 'pattern'=>'mixed', 'replacement'=>'mixed', 'subject'=>'mixed', 'limit='=>'int', '&w_count='=>'int'], + 'preg_grep' => ['array|false', 'pattern'=>'string', 'array'=>'array', 'flags='=>'int'], + 'preg_last_error' => ['int'], + 'preg_match' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'string[]', 'flags='=>'0', 'offset='=>'int'], + 'preg_match\'1' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'array', 'flags='=>'int', 'offset='=>'int'], + 'preg_match_all' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'array', 'flags='=>'int', 'offset='=>'int'], + 'preg_quote' => ['string', 'str'=>'string', 'delimiter='=>'string'], + 'preg_replace' => ['string|string[]|null', 'pattern'=>'string|array', 'replacement'=>'string|array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], + 'preg_replace_callback' => ['string|null', 'pattern'=>'string|array', 'callback'=>'callable(string[]):string', 'subject'=>'string', 'limit='=>'int', '&w_count='=>'int'], + 'preg_replace_callback\'1' => ['string[]|null', 'pattern'=>'string|array', 'callback'=>'callable(string[]):string', 'subject'=>'string[]', 'limit='=>'int', '&w_count='=>'int'], + 'preg_replace_callback_array' => ['string|string[]|null', 'pattern'=>'array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], + 'preg_split' => ['list|false', 'pattern'=>'string', 'subject'=>'string', 'limit'=>'int', 'flags='=>'null'], + 'preg_split\'1' => ['list|list>|false', 'pattern'=>'string', 'subject'=>'string', 'limit='=>'int', 'flags='=>'int'], + 'prev' => ['mixed', '&r_array'=>'array|object'], + 'print' => ['int', 'arg'=>'string'], + 'print_r' => ['string', 'value'=>'mixed'], + 'print_r\'1' => ['true', 'value'=>'mixed', 'return='=>'bool'], + 'printf' => ['int', 'format'=>'string', '...values='=>'string|int|float'], + 'proc_close' => ['int', 'process'=>'resource'], + 'proc_get_status' => ['array{command: string, pid: int, running: bool, signaled: bool, stopped: bool, exitcode: int, termsig: int, stopsig: int}|false', 'process'=>'resource'], + 'proc_nice' => ['bool', 'priority'=>'int'], + 'proc_open' => ['resource|false', 'command'=>'string', 'descriptor_spec'=>'array', '&pipes'=>'resource[]', 'cwd='=>'?string', 'env_vars='=>'?array', 'options='=>'?array'], + 'proc_terminate' => ['bool', 'process'=>'resource', 'signal='=>'int'], + 'projectionObj::__construct' => ['void', 'projectionString'=>'string'], + 'projectionObj::getUnits' => ['int'], + 'projectionObj::ms_newProjectionObj' => ['projectionObj', 'projectionString'=>'string'], + 'property_exists' => ['bool', 'object_or_class'=>'object|string', 'property'=>'string'], + 'ps_add_bookmark' => ['int', 'psdoc'=>'resource', 'text'=>'string', 'parent='=>'int', 'open='=>'int'], + 'ps_add_launchlink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], + 'ps_add_locallink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'page'=>'int', 'dest'=>'string'], + 'ps_add_note' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], + 'ps_add_pdflink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], + 'ps_add_weblink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'url'=>'string'], + 'ps_arc' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'alpha'=>'float', 'beta'=>'float'], + 'ps_arcn' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'alpha'=>'float', 'beta'=>'float'], + 'ps_begin_page' => ['bool', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float'], + 'ps_begin_pattern' => ['int', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], + 'ps_begin_template' => ['int', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float'], + 'ps_circle' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float'], + 'ps_clip' => ['bool', 'psdoc'=>'resource'], + 'ps_close' => ['bool', 'psdoc'=>'resource'], + 'ps_close_image' => ['void', 'psdoc'=>'resource', 'imageid'=>'int'], + 'ps_closepath' => ['bool', 'psdoc'=>'resource'], + 'ps_closepath_stroke' => ['bool', 'psdoc'=>'resource'], + 'ps_continue_text' => ['bool', 'psdoc'=>'resource', 'text'=>'string'], + 'ps_curveto' => ['bool', 'psdoc'=>'resource', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], + 'ps_delete' => ['bool', 'psdoc'=>'resource'], + 'ps_end_page' => ['bool', 'psdoc'=>'resource'], + 'ps_end_pattern' => ['bool', 'psdoc'=>'resource'], + 'ps_end_template' => ['bool', 'psdoc'=>'resource'], + 'ps_fill' => ['bool', 'psdoc'=>'resource'], + 'ps_fill_stroke' => ['bool', 'psdoc'=>'resource'], + 'ps_findfont' => ['int', 'psdoc'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'embed='=>'bool'], + 'ps_get_buffer' => ['string', 'psdoc'=>'resource'], + 'ps_get_parameter' => ['string', 'psdoc'=>'resource', 'name'=>'string', 'modifier='=>'float'], + 'ps_get_value' => ['float', 'psdoc'=>'resource', 'name'=>'string', 'modifier='=>'float'], + 'ps_hyphenate' => ['array', 'psdoc'=>'resource', 'text'=>'string'], + 'ps_include_file' => ['bool', 'psdoc'=>'resource', 'file'=>'string'], + 'ps_lineto' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], + 'ps_makespotcolor' => ['int', 'psdoc'=>'resource', 'name'=>'string', 'reserved='=>'int'], + 'ps_moveto' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], + 'ps_new' => ['resource'], + 'ps_open_file' => ['bool', 'psdoc'=>'resource', 'filename='=>'string'], + 'ps_open_image' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], + 'ps_open_image_file' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'filename'=>'string', 'stringparam='=>'string', 'intparam='=>'int'], + 'ps_open_memory_image' => ['int', 'psdoc'=>'resource', 'gd'=>'int'], + 'ps_place_image' => ['bool', 'psdoc'=>'resource', 'imageid'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], + 'ps_rect' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], + 'ps_restore' => ['bool', 'psdoc'=>'resource'], + 'ps_rotate' => ['bool', 'psdoc'=>'resource', 'rot'=>'float'], + 'ps_save' => ['bool', 'psdoc'=>'resource'], + 'ps_scale' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], + 'ps_set_border_color' => ['bool', 'psdoc'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], + 'ps_set_border_dash' => ['bool', 'psdoc'=>'resource', 'black'=>'float', 'white'=>'float'], + 'ps_set_border_style' => ['bool', 'psdoc'=>'resource', 'style'=>'string', 'width'=>'float'], + 'ps_set_info' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], + 'ps_set_parameter' => ['bool', 'psdoc'=>'resource', 'name'=>'string', 'value'=>'string'], + 'ps_set_text_pos' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], + 'ps_set_value' => ['bool', 'psdoc'=>'resource', 'name'=>'string', 'value'=>'float'], + 'ps_setcolor' => ['bool', 'psdoc'=>'resource', 'type'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], + 'ps_setdash' => ['bool', 'psdoc'=>'resource', 'on'=>'float', 'off'=>'float'], + 'ps_setflat' => ['bool', 'psdoc'=>'resource', 'value'=>'float'], + 'ps_setfont' => ['bool', 'psdoc'=>'resource', 'fontid'=>'int', 'size'=>'float'], + 'ps_setgray' => ['bool', 'psdoc'=>'resource', 'gray'=>'float'], + 'ps_setlinecap' => ['bool', 'psdoc'=>'resource', 'type'=>'int'], + 'ps_setlinejoin' => ['bool', 'psdoc'=>'resource', 'type'=>'int'], + 'ps_setlinewidth' => ['bool', 'psdoc'=>'resource', 'width'=>'float'], + 'ps_setmiterlimit' => ['bool', 'psdoc'=>'resource', 'value'=>'float'], + 'ps_setoverprintmode' => ['bool', 'psdoc'=>'resource', 'mode'=>'int'], + 'ps_setpolydash' => ['bool', 'psdoc'=>'resource', 'arr'=>'float'], + 'ps_shading' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], + 'ps_shading_pattern' => ['int', 'psdoc'=>'resource', 'shadingid'=>'int', 'optlist'=>'string'], + 'ps_shfill' => ['bool', 'psdoc'=>'resource', 'shadingid'=>'int'], + 'ps_show' => ['bool', 'psdoc'=>'resource', 'text'=>'string'], + 'ps_show2' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'length'=>'int'], + 'ps_show_boxed' => ['int', 'psdoc'=>'resource', 'text'=>'string', 'left'=>'float', 'bottom'=>'float', 'width'=>'float', 'height'=>'float', 'hmode'=>'string', 'feature='=>'string'], + 'ps_show_xy' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float'], + 'ps_show_xy2' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'length'=>'int', 'xcoor'=>'float', 'ycoor'=>'float'], + 'ps_string_geometry' => ['array', 'psdoc'=>'resource', 'text'=>'string', 'fontid='=>'int', 'size='=>'float'], + 'ps_stringwidth' => ['float', 'psdoc'=>'resource', 'text'=>'string', 'fontid='=>'int', 'size='=>'float'], + 'ps_stroke' => ['bool', 'psdoc'=>'resource'], + 'ps_symbol' => ['bool', 'psdoc'=>'resource', 'ord'=>'int'], + 'ps_symbol_name' => ['string', 'psdoc'=>'resource', 'ord'=>'int', 'fontid='=>'int'], + 'ps_symbol_width' => ['float', 'psdoc'=>'resource', 'ord'=>'int', 'fontid='=>'int', 'size='=>'float'], + 'ps_translate' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], + 'pspell_add_to_personal' => ['bool', 'dictionary'=>'int', 'word'=>'string'], + 'pspell_add_to_session' => ['bool', 'dictionary'=>'int', 'word'=>'string'], + 'pspell_check' => ['bool', 'dictionary'=>'int', 'word'=>'string'], + 'pspell_clear_session' => ['bool', 'dictionary'=>'int'], + 'pspell_config_create' => ['int|false', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string'], + 'pspell_config_data_dir' => ['bool', 'config'=>'int', 'directory'=>'string'], + 'pspell_config_dict_dir' => ['bool', 'config'=>'int', 'directory'=>'string'], + 'pspell_config_ignore' => ['bool', 'config'=>'int', 'min_length'=>'int'], + 'pspell_config_mode' => ['bool', 'config'=>'int', 'mode'=>'int'], + 'pspell_config_personal' => ['bool', 'config'=>'int', 'filename'=>'string'], + 'pspell_config_repl' => ['bool', 'config'=>'int', 'filename'=>'string'], + 'pspell_config_runtogether' => ['bool', 'config'=>'int', 'allow'=>'bool'], + 'pspell_config_save_repl' => ['bool', 'config'=>'int', 'save'=>'bool'], + 'pspell_new' => ['int|false', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string', 'mode='=>'int'], + 'pspell_new_config' => ['int|false', 'config'=>'int'], + 'pspell_new_personal' => ['int|false', 'filename'=>'string', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string', 'mode='=>'int'], + 'pspell_save_wordlist' => ['bool', 'dictionary'=>'int'], + 'pspell_store_replacement' => ['bool', 'dictionary'=>'int', 'misspelled'=>'string', 'correct'=>'string'], + 'pspell_suggest' => ['array', 'dictionary'=>'int', 'word'=>'string'], + 'putenv' => ['bool', 'assignment'=>'string'], + 'px_close' => ['bool', 'pxdoc'=>'resource'], + 'px_create_fp' => ['bool', 'pxdoc'=>'resource', 'file'=>'resource', 'fielddesc'=>'array'], + 'px_date2string' => ['string', 'pxdoc'=>'resource', 'value'=>'int', 'format'=>'string'], + 'px_delete' => ['bool', 'pxdoc'=>'resource'], + 'px_delete_record' => ['bool', 'pxdoc'=>'resource', 'num'=>'int'], + 'px_get_field' => ['array', 'pxdoc'=>'resource', 'fieldno'=>'int'], + 'px_get_info' => ['array', 'pxdoc'=>'resource'], + 'px_get_parameter' => ['string', 'pxdoc'=>'resource', 'name'=>'string'], + 'px_get_record' => ['array', 'pxdoc'=>'resource', 'num'=>'int', 'mode='=>'int'], + 'px_get_schema' => ['array', 'pxdoc'=>'resource', 'mode='=>'int'], + 'px_get_value' => ['float', 'pxdoc'=>'resource', 'name'=>'string'], + 'px_insert_record' => ['int', 'pxdoc'=>'resource', 'data'=>'array'], + 'px_new' => ['resource'], + 'px_numfields' => ['int', 'pxdoc'=>'resource'], + 'px_numrecords' => ['int', 'pxdoc'=>'resource'], + 'px_open_fp' => ['bool', 'pxdoc'=>'resource', 'file'=>'resource'], + 'px_put_record' => ['bool', 'pxdoc'=>'resource', 'record'=>'array', 'recpos='=>'int'], + 'px_retrieve_record' => ['array', 'pxdoc'=>'resource', 'num'=>'int', 'mode='=>'int'], + 'px_set_blob_file' => ['bool', 'pxdoc'=>'resource', 'filename'=>'string'], + 'px_set_parameter' => ['bool', 'pxdoc'=>'resource', 'name'=>'string', 'value'=>'string'], + 'px_set_tablename' => ['void', 'pxdoc'=>'resource', 'name'=>'string'], + 'px_set_targetencoding' => ['bool', 'pxdoc'=>'resource', 'encoding'=>'string'], + 'px_set_value' => ['bool', 'pxdoc'=>'resource', 'name'=>'string', 'value'=>'float'], + 'px_timestamp2string' => ['string', 'pxdoc'=>'resource', 'value'=>'float', 'format'=>'string'], + 'px_update_record' => ['bool', 'pxdoc'=>'resource', 'data'=>'array', 'num'=>'int'], + 'qdom_error' => ['string'], + 'qdom_tree' => ['QDomDocument', 'doc'=>'string'], + 'querymapObj::convertToString' => ['string'], + 'querymapObj::free' => ['void'], + 'querymapObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'querymapObj::updateFromString' => ['int', 'snippet'=>'string'], + 'quoted_printable_decode' => ['string', 'string'=>'string'], + 'quoted_printable_encode' => ['string', 'string'=>'string'], + 'quotemeta' => ['string', 'string'=>'string'], + 'rad2deg' => ['float', 'num'=>'float'], + 'radius_acct_open' => ['resource|false'], + 'radius_add_server' => ['bool', 'radius_handle'=>'resource', 'hostname'=>'string', 'port'=>'int', 'secret'=>'string', 'timeout'=>'int', 'max_tries'=>'int'], + 'radius_auth_open' => ['resource|false'], + 'radius_close' => ['bool', 'radius_handle'=>'resource'], + 'radius_config' => ['bool', 'radius_handle'=>'resource', 'file'=>'string'], + 'radius_create_request' => ['bool', 'radius_handle'=>'resource', 'type'=>'int'], + 'radius_cvt_addr' => ['string', 'data'=>'string'], + 'radius_cvt_int' => ['int', 'data'=>'string'], + 'radius_cvt_string' => ['string', 'data'=>'string'], + 'radius_demangle' => ['string', 'radius_handle'=>'resource', 'mangled'=>'string'], + 'radius_demangle_mppe_key' => ['string', 'radius_handle'=>'resource', 'mangled'=>'string'], + 'radius_get_attr' => ['mixed', 'radius_handle'=>'resource'], + 'radius_get_tagged_attr_data' => ['string', 'data'=>'string'], + 'radius_get_tagged_attr_tag' => ['int', 'data'=>'string'], + 'radius_get_vendor_attr' => ['array', 'data'=>'string'], + 'radius_put_addr' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'addr'=>'string'], + 'radius_put_attr' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'string'], + 'radius_put_int' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'int'], + 'radius_put_string' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'string'], + 'radius_put_vendor_addr' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'addr'=>'string'], + 'radius_put_vendor_attr' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'string'], + 'radius_put_vendor_int' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'int'], + 'radius_put_vendor_string' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'string'], + 'radius_request_authenticator' => ['string', 'radius_handle'=>'resource'], + 'radius_salt_encrypt_attr' => ['string', 'radius_handle'=>'resource', 'data'=>'string'], + 'radius_send_request' => ['int|false', 'radius_handle'=>'resource'], + 'radius_server_secret' => ['string', 'radius_handle'=>'resource'], + 'radius_strerror' => ['string', 'radius_handle'=>'resource'], + 'rand' => ['int', 'min'=>'int', 'max'=>'int'], + 'rand\'1' => ['int'], + 'random_bytes' => ['non-empty-string', 'length'=>'positive-int'], + 'random_int' => ['int', 'min'=>'int', 'max'=>'int'], + 'range' => ['array', 'start'=>'mixed', 'end'=>'mixed', 'step='=>'int|float'], + 'rar_allow_broken_set' => ['bool', 'rarfile'=>'RarArchive', 'allow_broken'=>'bool'], + 'rar_broken_is' => ['bool', 'rarfile'=>'rararchive'], + 'rar_close' => ['bool', 'rarfile'=>'rararchive'], + 'rar_comment_get' => ['string', 'rarfile'=>'rararchive'], + 'rar_entry_get' => ['RarEntry', 'rarfile'=>'RarArchive', 'entryname'=>'string'], + 'rar_list' => ['RarArchive', 'rarfile'=>'rararchive'], + 'rar_open' => ['RarArchive', 'filename'=>'string', 'password='=>'string', 'volume_callback='=>'callable'], + 'rar_solid_is' => ['bool', 'rarfile'=>'rararchive'], + 'rar_wrapper_cache_stats' => ['string'], + 'rawurldecode' => ['string', 'string'=>'string'], + 'rawurlencode' => ['string', 'string'=>'string'], + 'rd_kafka_err2str' => ['string', 'err'=>'int'], + 'rd_kafka_errno' => ['int'], + 'rd_kafka_errno2err' => ['int', 'errnox'=>'int'], + 'rd_kafka_offset_tail' => ['int', 'cnt'=>'int'], + 'read_exif_data' => ['array', 'filename'=>'string', 'sections_needed='=>'string', 'sub_arrays='=>'bool', 'read_thumbnail='=>'bool'], + 'readdir' => ['string|false', 'dir_handle='=>'resource'], + 'readfile' => ['int|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], + 'readgzfile' => ['int|false', 'filename'=>'string', 'use_include_path='=>'int'], + 'readline' => ['string|false', 'prompt='=>'?string'], + 'readline_add_history' => ['bool', 'prompt'=>'string'], + 'readline_callback_handler_install' => ['bool', 'prompt'=>'string', 'callback'=>'callable'], + 'readline_callback_handler_remove' => ['bool'], + 'readline_callback_read_char' => ['void'], + 'readline_clear_history' => ['bool'], + 'readline_completion_function' => ['bool', 'callback'=>'callable'], + 'readline_info' => ['mixed', 'var_name='=>'string', 'value='=>'string|int|bool'], + 'readline_list_history' => ['array'], + 'readline_on_new_line' => ['void'], + 'readline_read_history' => ['bool', 'filename='=>'string'], + 'readline_redisplay' => ['void'], + 'readline_write_history' => ['bool', 'filename='=>'string'], + 'readlink' => ['string|false', 'path'=>'string'], + 'realpath' => ['string|false', 'path'=>'string'], + 'realpath_cache_get' => ['array'], + 'realpath_cache_size' => ['int'], + 'recode' => ['string', 'request'=>'string', 'string'=>'string'], + 'recode_file' => ['bool', 'request'=>'string', 'input'=>'resource', 'output'=>'resource'], + 'recode_string' => ['string|false', 'request'=>'string', 'string'=>'string'], + 'rectObj::__construct' => ['void'], + 'rectObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'], + 'rectObj::fit' => ['float', 'width'=>'int', 'height'=>'int'], + 'rectObj::ms_newRectObj' => ['rectObj'], + 'rectObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], + 'rectObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'rectObj::setextent' => ['void', 'minx'=>'float', 'miny'=>'float', 'maxx'=>'float', 'maxy'=>'float'], + 'register_event_handler' => ['bool', 'event_handler_func'=>'string', 'handler_register_name'=>'string', 'event_type_mask'=>'int'], + 'register_shutdown_function' => ['void', 'callback'=>'callable', '...args='=>'mixed'], + 'register_tick_function' => ['bool', 'callback'=>'callable():void', '...args='=>'mixed'], + 'rename' => ['bool', 'from'=>'string', 'to'=>'string', 'context='=>'resource'], + 'rename_function' => ['bool', 'original_name'=>'string', 'new_name'=>'string'], + 'reset' => ['mixed|false', '&r_array'=>'array|object'], + 'resourcebundle_count' => ['int', 'bundle'=>'ResourceBundle'], + 'resourcebundle_create' => ['?ResourceBundle', 'locale'=>'string', 'bundle'=>'string', 'fallback='=>'bool'], + 'resourcebundle_get' => ['mixed|null', 'bundle'=>'ResourceBundle', 'index'=>'string|int', 'fallback='=>'bool'], + 'resourcebundle_get_error_code' => ['int', 'bundle'=>'ResourceBundle'], + 'resourcebundle_get_error_message' => ['string', 'bundle'=>'ResourceBundle'], + 'resourcebundle_locales' => ['array', 'bundle'=>'string'], + 'restore_error_handler' => ['true'], + 'restore_exception_handler' => ['bool'], + 'restore_include_path' => ['void'], + 'rewind' => ['bool', 'stream'=>'resource'], + 'rewinddir' => ['null|false', 'dir_handle='=>'resource'], + 'rmdir' => ['bool', 'directory'=>'string', 'context='=>'resource'], + 'round' => ['float', 'num'=>'float', 'precision='=>'int', 'mode='=>'int'], + 'rpm_close' => ['bool', 'rpmr'=>'resource'], + 'rpm_get_tag' => ['mixed', 'rpmr'=>'resource', 'tagnum'=>'int'], + 'rpm_is_valid' => ['bool', 'filename'=>'string'], + 'rpm_open' => ['resource|false', 'filename'=>'string'], + 'rpm_version' => ['string'], + 'rpmaddtag' => ['bool', 'tag'=>'int'], + 'rpmdbinfo' => ['array', 'nevr'=>'string', 'full='=>'bool'], + 'rpmdbsearch' => ['array', 'pattern'=>'string', 'rpmtag='=>'int', 'rpmmire='=>'int', 'full='=>'bool'], + 'rpminfo' => ['array', 'path'=>'string', 'full='=>'bool', 'error='=>'string'], + 'rpmvercmp' => ['int', 'evr1'=>'string', 'evr2'=>'string'], + 'rrd_create' => ['bool', 'filename'=>'string', 'options'=>'array'], + 'rrd_disconnect' => ['void'], + 'rrd_error' => ['string'], + 'rrd_fetch' => ['array', 'filename'=>'string', 'options'=>'array'], + 'rrd_first' => ['int|false', 'file'=>'string', 'raaindex='=>'int'], + 'rrd_graph' => ['array|false', 'filename'=>'string', 'options'=>'array'], + 'rrd_info' => ['array|false', 'filename'=>'string'], + 'rrd_last' => ['int', 'filename'=>'string'], + 'rrd_lastupdate' => ['array|false', 'filename'=>'string'], + 'rrd_restore' => ['bool', 'xml_file'=>'string', 'rrd_file'=>'string', 'options='=>'array'], + 'rrd_tune' => ['bool', 'filename'=>'string', 'options'=>'array'], + 'rrd_update' => ['bool', 'filename'=>'string', 'options'=>'array'], + 'rrd_version' => ['string'], + 'rrd_xport' => ['array|false', 'options'=>'array'], + 'rrdc_disconnect' => ['void'], + 'rsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], + 'rtrim' => ['string', 'string'=>'string', 'characters='=>'string'], + 'runkit7_constant_add' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'new_visibility='=>'int'], + 'runkit7_constant_redefine' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'new_visibility='=>'?int'], + 'runkit7_constant_remove' => ['bool', 'constant_name'=>'string'], + 'runkit7_function_add' => ['bool', 'function_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_doc_comment='=>'?string', 'return_by_reference='=>'?bool', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], + 'runkit7_function_copy' => ['bool', 'source_name'=>'string', 'target_name'=>'string'], + 'runkit7_function_redefine' => ['bool', 'function_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_doc_comment='=>'?string', 'return_by_reference='=>'?bool', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], + 'runkit7_function_remove' => ['bool', 'function_name'=>'string'], + 'runkit7_function_rename' => ['bool', 'source_name'=>'string', 'target_name'=>'string'], + 'runkit7_import' => ['bool', 'filename'=>'string', 'flags='=>'?int'], + 'runkit7_method_add' => ['bool', 'class_name'=>'string', 'method_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_flags='=>'int|null|string', 'flags_or_doc_comment='=>'int|null|string', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], + 'runkit7_method_copy' => ['bool', 'destination_class'=>'string', 'destination_method'=>'string', 'source_class'=>'string', 'source_method='=>'?string'], + 'runkit7_method_redefine' => ['bool', 'class_name'=>'string', 'method_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_flags='=>'int|null|string', 'flags_or_doc_comment='=>'int|null|string', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], + 'runkit7_method_remove' => ['bool', 'class_name'=>'string', 'method_name'=>'string'], + 'runkit7_method_rename' => ['bool', 'class_name'=>'string', 'source_method_name'=>'string', 'source_target_name'=>'string'], + 'runkit7_superglobals' => ['array'], + 'runkit7_zval_inspect' => ['array', 'value'=>'mixed'], + 'runkit_class_adopt' => ['bool', 'classname'=>'string', 'parentname'=>'string'], + 'runkit_class_emancipate' => ['bool', 'classname'=>'string'], + 'runkit_constant_add' => ['bool', 'constname'=>'string', 'value'=>'mixed'], + 'runkit_constant_redefine' => ['bool', 'constname'=>'string', 'newvalue'=>'mixed'], + 'runkit_constant_remove' => ['bool', 'constname'=>'string'], + 'runkit_function_add' => ['bool', 'funcname'=>'string', 'arglist'=>'string', 'code'=>'string', 'doccomment='=>'?string'], + 'runkit_function_add\'1' => ['bool', 'funcname'=>'string', 'closure'=>'Closure', 'doccomment='=>'?string'], + 'runkit_function_copy' => ['bool', 'funcname'=>'string', 'targetname'=>'string'], + 'runkit_function_redefine' => ['bool', 'funcname'=>'string', 'arglist'=>'string', 'code'=>'string', 'doccomment='=>'?string'], + 'runkit_function_redefine\'1' => ['bool', 'funcname'=>'string', 'closure'=>'Closure', 'doccomment='=>'?string'], + 'runkit_function_remove' => ['bool', 'funcname'=>'string'], + 'runkit_function_rename' => ['bool', 'funcname'=>'string', 'newname'=>'string'], + 'runkit_import' => ['bool', 'filename'=>'string', 'flags='=>'int'], + 'runkit_lint' => ['bool', 'code'=>'string'], + 'runkit_lint_file' => ['bool', 'filename'=>'string'], + 'runkit_method_add' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int', 'doccomment='=>'?string'], + 'runkit_method_add\'1' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'closure'=>'Closure', 'flags='=>'int', 'doccomment='=>'?string'], + 'runkit_method_copy' => ['bool', 'dclass'=>'string', 'dmethod'=>'string', 'sclass'=>'string', 'smethod='=>'string'], + 'runkit_method_redefine' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int', 'doccomment='=>'?string'], + 'runkit_method_redefine\'1' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'closure'=>'Closure', 'flags='=>'int', 'doccomment='=>'?string'], + 'runkit_method_remove' => ['bool', 'classname'=>'string', 'methodname'=>'string'], + 'runkit_method_rename' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'newname'=>'string'], + 'runkit_return_value_used' => ['bool'], + 'runkit_sandbox_output_handler' => ['mixed', 'sandbox'=>'object', 'callback='=>'mixed'], + 'runkit_superglobals' => ['array'], + 'runkit_zval_inspect' => ['array', 'value'=>'mixed'], + 'scalebarObj::convertToString' => ['string'], + 'scalebarObj::free' => ['void'], + 'scalebarObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'scalebarObj::setImageColor' => ['int', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], + 'scalebarObj::updateFromString' => ['int', 'snippet'=>'string'], + 'scandir' => ['list|false', 'directory'=>'string', 'sorting_order='=>'int', 'context='=>'resource'], + 'seaslog_get_author' => ['string'], + 'seaslog_get_version' => ['string'], + 'sem_acquire' => ['bool', 'semaphore'=>'resource', 'non_blocking='=>'bool'], + 'sem_get' => ['resource|false', 'key'=>'int', 'max_acquire='=>'int', 'permissions='=>'int', 'auto_release='=>'int'], + 'sem_release' => ['bool', 'semaphore'=>'resource'], + 'sem_remove' => ['bool', 'semaphore'=>'resource'], + 'serialize' => ['string', 'value'=>'mixed'], + 'session_abort' => ['bool'], + 'session_cache_expire' => ['int', 'value='=>'int'], + 'session_cache_limiter' => ['string', 'value='=>'string'], + 'session_commit' => ['bool'], + 'session_decode' => ['bool', 'data'=>'string'], + 'session_destroy' => ['bool'], + 'session_encode' => ['string'], + 'session_get_cookie_params' => ['array'], + 'session_id' => ['string|false', 'id='=>'string'], + 'session_is_registered' => ['bool', 'name'=>'string'], + 'session_module_name' => ['string', 'module='=>'string'], + 'session_name' => ['string|false', 'name='=>'string'], + 'session_pgsql_add_error' => ['bool', 'error_level'=>'int', 'error_message='=>'string'], + 'session_pgsql_get_error' => ['array', 'with_error_message='=>'bool'], + 'session_pgsql_get_field' => ['string'], + 'session_pgsql_reset' => ['bool'], + 'session_pgsql_set_field' => ['bool', 'value'=>'string'], + 'session_pgsql_status' => ['array'], + 'session_regenerate_id' => ['bool', 'delete_old_session='=>'bool'], + 'session_register' => ['bool', 'name'=>'mixed', '...args='=>'mixed'], + 'session_register_shutdown' => ['void'], + 'session_reset' => ['bool'], + 'session_save_path' => ['string', 'path='=>'string'], + 'session_set_cookie_params' => ['bool', 'lifetime'=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool'], + 'session_set_save_handler' => ['bool', 'open'=>'callable(string,string):bool', 'close'=>'callable():bool', 'read'=>'callable(string):string', 'write'=>'callable(string,string):bool', 'destroy'=>'callable(string):bool', 'gc'=>'callable(string):bool', 'create_sid='=>'callable():string', 'validate_sid='=>'callable(string):bool', 'update_timestamp='=>'callable(string):bool'], + 'session_set_save_handler\'1' => ['bool', 'open'=>'SessionHandlerInterface', 'close='=>'bool'], + 'session_start' => ['bool', 'options='=>'array'], + 'session_status' => ['int'], + 'session_unregister' => ['bool', 'name'=>'string'], + 'session_unset' => ['bool'], + 'session_write_close' => ['bool'], + 'setLeftFill' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], + 'setLine' => ['void', 'width'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], + 'setRightFill' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], + 'set_error_handler' => ['null|callable(int,string,string=,int=,array=):bool', 'callback'=>'null|callable(int,string,string=,int=,array=):bool', 'error_levels='=>'int'], + 'set_exception_handler' => ['null|callable(Throwable):void', 'callback'=>'null|callable(Throwable):void'], + 'set_file_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], + 'set_include_path' => ['string|false', 'include_path'=>'string'], + 'set_magic_quotes_runtime' => ['bool', 'new_setting'=>'bool'], + 'set_time_limit' => ['bool', 'seconds'=>'int'], + 'setcookie' => ['bool', 'name'=>'string', 'value='=>'string', 'expires='=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool', 'samesite='=>'string', 'url_encode='=>'int'], + 'setlocale' => ['string|false', 'category'=>'int', 'locales'=>'string|0|null', '...rest='=>'string'], + 'setlocale\'1' => ['string|false', 'category'=>'int', 'locales'=>'?array'], + 'setproctitle' => ['void', 'title'=>'string'], + 'setrawcookie' => ['bool', 'name'=>'string', 'value='=>'string', 'expires='=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool'], + 'setthreadtitle' => ['bool', 'title'=>'string'], + 'settype' => ['bool', '&rw_var'=>'mixed', 'type'=>'string'], + 'sha1' => ['string', 'string'=>'string', 'binary='=>'bool'], + 'sha1_file' => ['string|false', 'filename'=>'string', 'binary='=>'bool'], + 'sha256' => ['string', 'string'=>'string', 'raw_output='=>'bool'], + 'sha256_file' => ['string', 'filename'=>'string', 'raw_output='=>'bool'], + 'shapeObj::__construct' => ['void', 'type'=>'int'], + 'shapeObj::add' => ['int', 'line'=>'lineObj'], + 'shapeObj::boundary' => ['shapeObj'], + 'shapeObj::contains' => ['bool', 'point'=>'pointObj'], + 'shapeObj::containsShape' => ['int', 'shape2'=>'shapeObj'], + 'shapeObj::convexhull' => ['shapeObj'], + 'shapeObj::crosses' => ['int', 'shape'=>'shapeObj'], + 'shapeObj::difference' => ['shapeObj', 'shape'=>'shapeObj'], + 'shapeObj::disjoint' => ['int', 'shape'=>'shapeObj'], + 'shapeObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj'], + 'shapeObj::equals' => ['int', 'shape'=>'shapeObj'], + 'shapeObj::free' => ['void'], + 'shapeObj::getArea' => ['float'], + 'shapeObj::getCentroid' => ['pointObj'], + 'shapeObj::getLabelPoint' => ['pointObj'], + 'shapeObj::getLength' => ['float'], + 'shapeObj::getPointUsingMeasure' => ['pointObj', 'm'=>'float'], + 'shapeObj::getValue' => ['string', 'layer'=>'layerObj', 'filedname'=>'string'], + 'shapeObj::intersection' => ['shapeObj', 'shape'=>'shapeObj'], + 'shapeObj::intersects' => ['bool', 'shape'=>'shapeObj'], + 'shapeObj::line' => ['lineObj', 'i'=>'int'], + 'shapeObj::ms_shapeObjFromWkt' => ['shapeObj', 'wkt'=>'string'], + 'shapeObj::overlaps' => ['int', 'shape'=>'shapeObj'], + 'shapeObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], + 'shapeObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'shapeObj::setBounds' => ['int'], + 'shapeObj::simplify' => ['shapeObj|null', 'tolerance'=>'float'], + 'shapeObj::symdifference' => ['shapeObj', 'shape'=>'shapeObj'], + 'shapeObj::toWkt' => ['string'], + 'shapeObj::topologyPreservingSimplify' => ['shapeObj|null', 'tolerance'=>'float'], + 'shapeObj::touches' => ['int', 'shape'=>'shapeObj'], + 'shapeObj::union' => ['shapeObj', 'shape'=>'shapeObj'], + 'shapeObj::within' => ['int', 'shape2'=>'shapeObj'], + 'shapefileObj::__construct' => ['void', 'filename'=>'string', 'type'=>'int'], + 'shapefileObj::addPoint' => ['int', 'point'=>'pointObj'], + 'shapefileObj::addShape' => ['int', 'shape'=>'shapeObj'], + 'shapefileObj::free' => ['void'], + 'shapefileObj::getExtent' => ['rectObj', 'i'=>'int'], + 'shapefileObj::getPoint' => ['shapeObj', 'i'=>'int'], + 'shapefileObj::getShape' => ['shapeObj', 'i'=>'int'], + 'shapefileObj::getTransformed' => ['shapeObj', 'map'=>'mapObj', 'i'=>'int'], + 'shapefileObj::ms_newShapefileObj' => ['shapefileObj', 'filename'=>'string', 'type'=>'int'], + 'shell_exec' => ['string|false|null', 'command'=>'string'], + 'shm_attach' => ['resource', 'key'=>'int', 'size='=>'int', 'permissions='=>'int'], + 'shm_detach' => ['bool', 'shm'=>'resource'], + 'shm_get_var' => ['mixed', 'shm'=>'resource', 'key'=>'int'], + 'shm_has_var' => ['bool', 'shm'=>'resource', 'key'=>'int'], + 'shm_put_var' => ['bool', 'shm'=>'resource', 'key'=>'int', 'value'=>'mixed'], + 'shm_remove' => ['bool', 'shm'=>'resource'], + 'shm_remove_var' => ['bool', 'shm'=>'resource', 'key'=>'int'], + 'shmop_close' => ['void', 'shmop'=>'resource'], + 'shmop_delete' => ['bool', 'shmop'=>'resource'], + 'shmop_open' => ['resource|false', 'key'=>'int', 'mode'=>'string', 'permissions'=>'int', 'size'=>'int'], + 'shmop_read' => ['string|false', 'shmop'=>'resource', 'offset'=>'int', 'size'=>'int'], + 'shmop_size' => ['int', 'shmop'=>'resource'], + 'shmop_write' => ['int|false', 'shmop'=>'resource', 'data'=>'string', 'offset'=>'int'], + 'show_source' => ['string|bool', 'filename'=>'string', 'return='=>'bool'], + 'shuffle' => ['bool', '&rw_array'=>'array'], + 'signeurlpaiement' => ['string', 'clent'=>'string', 'data'=>'string'], + 'similar_text' => ['int', 'string1'=>'string', 'string2'=>'string', '&w_percent='=>'float'], + 'simplexml_import_dom' => ['SimpleXMLElement|false', 'node'=>'DOMNode', 'class_name='=>'string'], + 'simplexml_load_file' => ['SimpleXMLElement|false', 'filename'=>'string', 'class_name='=>'string', 'options='=>'int', 'namespace_or_prefix='=>'string', 'is_prefix='=>'bool'], + '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'], + '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'], + 'snmp2_real_walk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmp2_set' => ['bool', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmp2_walk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmp3_get' => ['string|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmp3_getnext' => ['string|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmp3_real_walk' => ['array|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmp3_set' => ['bool', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmp3_walk' => ['array|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmp_get_quick_print' => ['bool'], + 'snmp_get_valueretrieval' => ['int'], + 'snmp_read_mib' => ['bool', 'filename'=>'string'], + 'snmp_set_enum_print' => ['bool', 'enable'=>'int'], + 'snmp_set_oid_numeric_print' => ['void', 'format'=>'int'], + 'snmp_set_oid_output_format' => ['bool', 'format'=>'int'], + 'snmp_set_quick_print' => ['bool', 'enable'=>'bool'], + 'snmp_set_valueretrieval' => ['bool', 'method='=>'int'], + 'snmpget' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmpgetnext' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmprealwalk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmpset' => ['bool', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'mixed', 'timeout='=>'int', 'retries='=>'int'], + 'snmpwalk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'snmpwalkoid' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], + 'socket_accept' => ['resource|false', 'socket'=>'resource'], + 'socket_bind' => ['bool', 'socket'=>'resource', 'addr'=>'string', 'port='=>'int'], + 'socket_clear_error' => ['void', 'socket='=>'resource'], + 'socket_close' => ['void', 'socket'=>'resource'], + 'socket_cmsg_space' => ['int', 'level'=>'int', 'type'=>'int'], + 'socket_connect' => ['bool', 'socket'=>'resource', 'addr'=>'string', 'port='=>'int'], + 'socket_create' => ['resource|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], + 'socket_create_listen' => ['resource|false', 'port'=>'int', 'backlog='=>'int'], + 'socket_create_pair' => ['bool', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int', '&w_fd'=>'resource[]'], + 'socket_export_stream' => ['resource|false', 'socket'=>'resource'], + 'socket_get_option' => ['mixed|false', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int'], + 'socket_get_status' => ['array', 'stream'=>'resource'], + 'socket_getopt' => ['mixed', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int'], + 'socket_getpeername' => ['bool', 'socket'=>'resource', '&w_addr'=>'string', '&w_port='=>'int'], + 'socket_getsockname' => ['bool', 'socket'=>'resource', '&w_addr'=>'string', '&w_port='=>'int'], + 'socket_import_stream' => ['resource|false|null', 'stream'=>'resource'], + 'socket_last_error' => ['int', 'socket='=>'resource'], + 'socket_listen' => ['bool', 'socket'=>'resource', 'backlog='=>'int'], + 'socket_read' => ['string|false', 'socket'=>'resource', 'length'=>'int', 'type='=>'int'], + 'socket_recv' => ['int|false', 'socket'=>'resource', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int'], + 'socket_recvfrom' => ['int|false', 'socket'=>'resource', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int', '&w_name'=>'string', '&w_port='=>'int'], + 'socket_recvmsg' => ['int|false', 'socket'=>'resource', '&w_message'=>'string', 'flags='=>'int'], + 'socket_select' => ['int|false', '&rw_read_fds'=>'resource[]|null', '&rw_write_fds'=>'resource[]|null', '&rw_except_fds'=>'resource[]|null', 'tv_sec'=>'int|null', 'tv_usec='=>'int'], + 'socket_send' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'length'=>'int', 'flags'=>'int'], + 'socket_sendmsg' => ['int|false', 'socket'=>'resource', 'message'=>'array', 'flags'=>'int'], + 'socket_sendto' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'length'=>'int', 'flags'=>'int', 'addr'=>'string', 'port='=>'int'], + 'socket_set_block' => ['bool', 'socket'=>'resource'], + 'socket_set_blocking' => ['bool', 'socket'=>'resource', 'mode'=>'int'], + 'socket_set_nonblock' => ['bool', 'socket'=>'resource'], + 'socket_set_option' => ['bool', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], + 'socket_set_timeout' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], + 'socket_setopt' => ['void', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], + 'socket_shutdown' => ['bool', 'socket'=>'resource', 'how='=>'int'], + 'socket_strerror' => ['string', 'errno'=>'int'], + 'socket_write' => ['int|false', 'socket'=>'resource', 'data'=>'string', 'length='=>'int'], + 'solid_fetch_prev' => ['bool', 'result_id'=>''], + 'solr_get_version' => ['string|false'], + 'sort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], + 'soundex' => ['string', 'string'=>'string'], + 'spl_autoload' => ['void', 'class'=>'string', 'file_extensions='=>'string'], + 'spl_autoload_call' => ['void', 'class'=>'string'], + 'spl_autoload_extensions' => ['string', 'file_extensions='=>'string'], + 'spl_autoload_functions' => ['false|list'], + 'spl_autoload_register' => ['bool', 'callback='=>'callable(string):void', 'throw='=>'bool', 'prepend='=>'bool'], + 'spl_autoload_unregister' => ['bool', 'callback'=>'callable(string):void'], + 'spl_classes' => ['array'], + 'spl_object_hash' => ['string', 'object'=>'object'], + 'spl_object_id' => ['int', 'object'=>'object'], + 'sprintf' => ['string', 'format'=>'string', '...values='=>'string|int|float'], + 'sqlite_array_query' => ['array|false', 'dbhandle'=>'resource', 'query'=>'string', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'sqlite_busy_timeout' => ['void', 'dbhandle'=>'resource', 'milliseconds'=>'int'], + 'sqlite_changes' => ['int', 'dbhandle'=>'resource'], + 'sqlite_close' => ['void', 'dbhandle'=>'resource'], + 'sqlite_column' => ['mixed', 'result'=>'resource', 'index_or_name'=>'mixed', 'decode_binary='=>'bool'], + 'sqlite_create_aggregate' => ['void', 'dbhandle'=>'resource', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], + 'sqlite_create_function' => ['void', 'dbhandle'=>'resource', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], + 'sqlite_current' => ['array|false', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'sqlite_error_string' => ['string', 'error_code'=>'int'], + 'sqlite_escape_string' => ['string', 'item'=>'string'], + 'sqlite_exec' => ['bool', 'dbhandle'=>'resource', 'query'=>'string', 'error_msg='=>'string'], + 'sqlite_factory' => ['SQLiteDatabase', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], + 'sqlite_fetch_all' => ['array', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'sqlite_fetch_array' => ['array|false', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], + 'sqlite_fetch_column_types' => ['array|false', 'table_name'=>'string', 'dbhandle'=>'resource', 'result_type='=>'int'], + 'sqlite_fetch_object' => ['object', 'result'=>'resource', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], + 'sqlite_fetch_single' => ['string', 'result'=>'resource', 'decode_binary='=>'bool'], + 'sqlite_fetch_string' => ['string', 'result'=>'resource', 'decode_binary'=>'bool'], + 'sqlite_field_name' => ['string', 'result'=>'resource', 'field_index'=>'int'], + 'sqlite_has_more' => ['bool', 'result'=>'resource'], + 'sqlite_has_prev' => ['bool', 'result'=>'resource'], + 'sqlite_key' => ['int', 'result'=>'resource'], + 'sqlite_last_error' => ['int', 'dbhandle'=>'resource'], + 'sqlite_last_insert_rowid' => ['int', 'dbhandle'=>'resource'], + 'sqlite_libencoding' => ['string'], + 'sqlite_libversion' => ['string'], + 'sqlite_next' => ['bool', 'result'=>'resource'], + 'sqlite_num_fields' => ['int', 'result'=>'resource'], + 'sqlite_num_rows' => ['int', 'result'=>'resource'], + 'sqlite_open' => ['resource|false', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], + 'sqlite_popen' => ['resource|false', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], + 'sqlite_prev' => ['bool', 'result'=>'resource'], + 'sqlite_query' => ['resource|false', 'dbhandle'=>'resource', 'query'=>'resource|string', 'result_type='=>'int', 'error_msg='=>'string'], + 'sqlite_rewind' => ['bool', 'result'=>'resource'], + 'sqlite_seek' => ['bool', 'result'=>'resource', 'rownum'=>'int'], + 'sqlite_single_query' => ['array', 'db'=>'resource', 'query'=>'string', 'first_row_only='=>'bool', 'decode_binary='=>'bool'], + 'sqlite_udf_decode_binary' => ['string', 'data'=>'string'], + 'sqlite_udf_encode_binary' => ['string', 'data'=>'string'], + 'sqlite_unbuffered_query' => ['SQLiteUnbuffered|false', 'dbhandle'=>'resource', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], + 'sqlite_valid' => ['bool', 'result'=>'resource'], + 'sqlsrv_begin_transaction' => ['bool', 'conn'=>'resource'], + 'sqlsrv_cancel' => ['bool', 'stmt'=>'resource'], + 'sqlsrv_client_info' => ['array|false', 'conn'=>'resource'], + 'sqlsrv_close' => ['bool', 'conn'=>'?resource'], + 'sqlsrv_commit' => ['bool', 'conn'=>'resource'], + 'sqlsrv_configure' => ['bool', 'setting'=>'string', 'value'=>'mixed'], + 'sqlsrv_connect' => ['resource|false', 'serverName'=>'string', 'connectionInfo='=>'array'], + 'sqlsrv_errors' => ['?array', 'errorsOrWarnings='=>'int'], + 'sqlsrv_execute' => ['bool', 'stmt'=>'resource'], + 'sqlsrv_fetch' => ['?bool', 'stmt'=>'resource', 'row='=>'int', 'offset='=>'int'], + 'sqlsrv_fetch_array' => ['array|null|false', 'stmt'=>'resource', 'fetchType='=>'int', 'row='=>'int', 'offset='=>'int'], + 'sqlsrv_fetch_object' => ['object|null|false', 'stmt'=>'resource', 'className='=>'string', 'ctorParams='=>'array', 'row='=>'int', 'offset='=>'int'], + 'sqlsrv_field_metadata' => ['array|false', 'stmt'=>'resource'], + 'sqlsrv_free_stmt' => ['bool', 'stmt'=>'resource'], + 'sqlsrv_get_config' => ['mixed', 'setting'=>'string'], + 'sqlsrv_get_field' => ['mixed', 'stmt'=>'resource', 'fieldIndex'=>'int', 'getAsType='=>'int'], + 'sqlsrv_has_rows' => ['bool', 'stmt'=>'resource'], + 'sqlsrv_next_result' => ['?bool', 'stmt'=>'resource'], + 'sqlsrv_num_fields' => ['int|false', 'stmt'=>'resource'], + 'sqlsrv_num_rows' => ['int|false', 'stmt'=>'resource'], + 'sqlsrv_prepare' => ['resource|false', 'conn'=>'resource', 'sql'=>'string', 'params='=>'array', 'options='=>'array'], + 'sqlsrv_query' => ['resource|false', 'conn'=>'resource', 'sql'=>'string', 'params='=>'array', 'options='=>'array'], + 'sqlsrv_rollback' => ['bool', 'conn'=>'resource'], + 'sqlsrv_rows_affected' => ['int|false', 'stmt'=>'resource'], + 'sqlsrv_send_stream_data' => ['bool', 'stmt'=>'resource'], + 'sqlsrv_server_info' => ['array', 'conn'=>'resource'], + 'sqrt' => ['float', 'num'=>'float'], + 'srand' => ['void', 'seed='=>'int', 'mode='=>'int'], + 'sscanf' => ['list|int|null', 'string'=>'string', 'format'=>'string', '&...w_vars='=>'string|int|float|null'], + 'ssdeep_fuzzy_compare' => ['int', 'signature1'=>'string', 'signature2'=>'string'], + 'ssdeep_fuzzy_hash' => ['string', 'to_hash'=>'string'], + 'ssdeep_fuzzy_hash_filename' => ['string', 'file_name'=>'string'], + 'ssh2_auth_agent' => ['bool', 'session'=>'resource', 'username'=>'string'], + 'ssh2_auth_hostbased_file' => ['bool', 'session'=>'resource', 'username'=>'string', 'hostname'=>'string', 'pubkeyfile'=>'string', 'privkeyfile'=>'string', 'passphrase='=>'string', 'local_username='=>'string'], + 'ssh2_auth_none' => ['bool|string[]', 'session'=>'resource', 'username'=>'string'], + 'ssh2_auth_password' => ['bool', 'session'=>'resource', 'username'=>'string', 'password'=>'string'], + 'ssh2_auth_pubkey_file' => ['bool', 'session'=>'resource', 'username'=>'string', 'pubkeyfile'=>'string', 'privkeyfile'=>'string', 'passphrase='=>'string'], + 'ssh2_connect' => ['resource|false', 'host'=>'string', 'port='=>'int', 'methods='=>'array', 'callbacks='=>'array'], + 'ssh2_disconnect' => ['bool', 'session'=>'resource'], + 'ssh2_exec' => ['resource|false', 'session'=>'resource', 'command'=>'string', 'pty='=>'string', 'env='=>'array', 'width='=>'int', 'height='=>'int', 'width_height_type='=>'int'], + 'ssh2_fetch_stream' => ['resource|false', 'channel'=>'resource', 'streamid'=>'int'], + 'ssh2_fingerprint' => ['string|false', 'session'=>'resource', 'flags='=>'int'], + 'ssh2_forward_accept' => ['resource|false', 'session'=>'resource'], + 'ssh2_forward_listen' => ['resource|false', 'session'=>'resource', 'port'=>'int', 'host='=>'string', 'max_connections='=>'string'], + 'ssh2_methods_negotiated' => ['array|false', 'session'=>'resource'], + 'ssh2_poll' => ['int', '&polldes'=>'array', 'timeout='=>'int'], + 'ssh2_publickey_add' => ['bool', 'pkey'=>'resource', 'algoname'=>'string', 'blob'=>'string', 'overwrite='=>'bool', 'attributes='=>'array'], + 'ssh2_publickey_init' => ['resource|false', 'session'=>'resource'], + 'ssh2_publickey_list' => ['array|false', 'pkey'=>'resource'], + 'ssh2_publickey_remove' => ['bool', 'pkey'=>'resource', 'algoname'=>'string', 'blob'=>'string'], + 'ssh2_scp_recv' => ['bool', 'session'=>'resource', 'remote_file'=>'string', 'local_file'=>'string'], + 'ssh2_scp_send' => ['bool', 'session'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'create_mode='=>'int'], + 'ssh2_sftp' => ['resource|false', 'session'=>'resource'], + 'ssh2_sftp_chmod' => ['bool', 'sftp'=>'resource', 'filename'=>'string', 'mode'=>'int'], + 'ssh2_sftp_lstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'sftp'=>'resource', 'path'=>'string'], + 'ssh2_sftp_mkdir' => ['bool', 'sftp'=>'resource', 'dirname'=>'string', 'mode='=>'int', 'recursive='=>'bool'], + 'ssh2_sftp_readlink' => ['string|false', 'sftp'=>'resource', 'link'=>'string'], + 'ssh2_sftp_realpath' => ['string|false', 'sftp'=>'resource', 'filename'=>'string'], + 'ssh2_sftp_rename' => ['bool', 'sftp'=>'resource', 'from'=>'string', 'to'=>'string'], + 'ssh2_sftp_rmdir' => ['bool', 'sftp'=>'resource', 'dirname'=>'string'], + 'ssh2_sftp_stat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'sftp'=>'resource', 'path'=>'string'], + 'ssh2_sftp_symlink' => ['bool', 'sftp'=>'resource', 'target'=>'string', 'link'=>'string'], + 'ssh2_sftp_unlink' => ['bool', 'sftp'=>'resource', 'filename'=>'string'], + 'ssh2_shell' => ['resource|false', 'session'=>'resource', 'term_type='=>'string', 'env='=>'array', 'width='=>'int', 'height='=>'int', 'width_height_type='=>'int'], + 'ssh2_tunnel' => ['resource|false', 'session'=>'resource', 'host'=>'string', 'port'=>'int'], + 'stat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'filename'=>'string'], + 'stats_absolute_deviation' => ['float', 'a'=>'array'], + 'stats_cdf_beta' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_binomial' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_cauchy' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_chisquare' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], + 'stats_cdf_exponential' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], + 'stats_cdf_f' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_gamma' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_laplace' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_logistic' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_negative_binomial' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_noncentral_chisquare' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_noncentral_f' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'par4'=>'float', 'which'=>'int'], + 'stats_cdf_noncentral_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_normal' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_poisson' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], + 'stats_cdf_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], + 'stats_cdf_uniform' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_cdf_weibull' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_covariance' => ['float', 'a'=>'array', 'b'=>'array'], + 'stats_den_uniform' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], + 'stats_dens_beta' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], + 'stats_dens_cauchy' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], + 'stats_dens_chisquare' => ['float', 'x'=>'float', 'dfr'=>'float'], + 'stats_dens_exponential' => ['float', 'x'=>'float', 'scale'=>'float'], + 'stats_dens_f' => ['float', 'x'=>'float', 'dfr1'=>'float', 'dfr2'=>'float'], + 'stats_dens_gamma' => ['float', 'x'=>'float', 'shape'=>'float', 'scale'=>'float'], + 'stats_dens_laplace' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], + 'stats_dens_logistic' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], + 'stats_dens_negative_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], + 'stats_dens_normal' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], + 'stats_dens_pmf_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], + 'stats_dens_pmf_hypergeometric' => ['float', 'n1'=>'float', 'n2'=>'float', 'N1'=>'float', 'N2'=>'float'], + 'stats_dens_pmf_negative_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], + 'stats_dens_pmf_poisson' => ['float', 'x'=>'float', 'lb'=>'float'], + 'stats_dens_t' => ['float', 'x'=>'float', 'dfr'=>'float'], + 'stats_dens_uniform' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], + 'stats_dens_weibull' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], + 'stats_harmonic_mean' => ['float', 'a'=>'array'], + 'stats_kurtosis' => ['float', 'a'=>'array'], + 'stats_rand_gen_beta' => ['float', 'a'=>'float', 'b'=>'float'], + 'stats_rand_gen_chisquare' => ['float', 'df'=>'float'], + 'stats_rand_gen_exponential' => ['float', 'av'=>'float'], + 'stats_rand_gen_f' => ['float', 'dfn'=>'float', 'dfd'=>'float'], + 'stats_rand_gen_funiform' => ['float', 'low'=>'float', 'high'=>'float'], + 'stats_rand_gen_gamma' => ['float', 'a'=>'float', 'r'=>'float'], + 'stats_rand_gen_ibinomial' => ['int', 'n'=>'int', 'pp'=>'float'], + 'stats_rand_gen_ibinomial_negative' => ['int', 'n'=>'int', 'p'=>'float'], + 'stats_rand_gen_int' => ['int'], + 'stats_rand_gen_ipoisson' => ['int', 'mu'=>'float'], + 'stats_rand_gen_iuniform' => ['int', 'low'=>'int', 'high'=>'int'], + 'stats_rand_gen_noncenral_chisquare' => ['float', 'df'=>'float', 'xnonc'=>'float'], + 'stats_rand_gen_noncentral_chisquare' => ['float', 'df'=>'float', 'xnonc'=>'float'], + 'stats_rand_gen_noncentral_f' => ['float', 'dfn'=>'float', 'dfd'=>'float', 'xnonc'=>'float'], + 'stats_rand_gen_noncentral_t' => ['float', 'df'=>'float', 'xnonc'=>'float'], + 'stats_rand_gen_normal' => ['float', 'av'=>'float', 'sd'=>'float'], + 'stats_rand_gen_t' => ['float', 'df'=>'float'], + 'stats_rand_get_seeds' => ['array'], + 'stats_rand_phrase_to_seeds' => ['array', 'phrase'=>'string'], + 'stats_rand_ranf' => ['float'], + 'stats_rand_setall' => ['void', 'iseed1'=>'int', 'iseed2'=>'int'], + 'stats_skew' => ['float', 'a'=>'array'], + 'stats_standard_deviation' => ['float', 'a'=>'array', 'sample='=>'bool'], + 'stats_stat_binomial_coef' => ['float', 'x'=>'int', 'n'=>'int'], + 'stats_stat_correlation' => ['float', 'array1'=>'array', 'array2'=>'array'], + 'stats_stat_factorial' => ['float', 'n'=>'int'], + 'stats_stat_gennch' => ['float', 'n'=>'int'], + 'stats_stat_independent_t' => ['float', 'array1'=>'array', 'array2'=>'array'], + 'stats_stat_innerproduct' => ['float', 'array1'=>'array', 'array2'=>'array'], + 'stats_stat_noncentral_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], + 'stats_stat_paired_t' => ['float', 'array1'=>'array', 'array2'=>'array'], + 'stats_stat_percentile' => ['float', 'arr'=>'array', 'perc'=>'float'], + 'stats_stat_powersum' => ['float', 'arr'=>'array', 'power'=>'float'], + 'stats_variance' => ['float', 'a'=>'array', 'sample='=>'bool'], + 'stomp_abort' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], + 'stomp_ack' => ['bool', 'msg'=>'', 'headers='=>'array', 'link='=>''], + 'stomp_begin' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], + 'stomp_close' => ['bool', 'link'=>''], + 'stomp_commit' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], + 'stomp_connect' => ['resource', 'broker='=>'string', 'username='=>'string', 'password='=>'string', 'headers='=>'array'], + 'stomp_connect_error' => ['string'], + 'stomp_error' => ['string', 'link'=>''], + 'stomp_get_read_timeout' => ['array', 'link'=>''], + 'stomp_get_session_id' => ['string', 'link'=>''], + 'stomp_has_frame' => ['bool', 'link'=>''], + 'stomp_read_frame' => ['array', 'class_name='=>'string', 'link='=>''], + 'stomp_send' => ['bool', 'destination'=>'string', 'msg'=>'', 'headers='=>'array', 'link='=>''], + 'stomp_set_read_timeout' => ['', 'seconds'=>'int', 'microseconds='=>'int', 'link='=>''], + 'stomp_subscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], + 'stomp_unsubscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], + 'stomp_version' => ['string'], + 'str_getcsv' => ['non-empty-list', 'string'=>'string', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], + 'str_ireplace' => ['string|string[]', 'search'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', '&w_count='=>'int'], + 'str_pad' => ['string', 'string'=>'string', 'length'=>'int', 'pad_string='=>'string', 'pad_type='=>'int'], + 'str_repeat' => ['string', 'string'=>'string', 'times'=>'int'], + 'str_replace' => ['string|string[]', 'search'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', '&w_count='=>'int'], + 'str_rot13' => ['string', 'string'=>'string'], + 'str_shuffle' => ['string', 'string'=>'string'], + 'str_split' => ['non-empty-list', 'string'=>'string', 'length='=>'positive-int'], + 'str_word_count' => ['array|int', 'string'=>'string', 'format='=>'int', 'characters='=>'string'], + 'strcasecmp' => ['int', 'string1'=>'string', 'string2'=>'string'], + 'strchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], + 'strcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], + 'strcoll' => ['int', 'string1'=>'string', 'string2'=>'string'], + 'strcspn' => ['int', 'string'=>'string', 'characters'=>'string', 'offset='=>'int', 'length='=>'int'], + 'streamWrapper::__construct' => ['void'], + 'streamWrapper::__destruct' => ['void'], + 'streamWrapper::dir_closedir' => ['bool'], + 'streamWrapper::dir_opendir' => ['bool', 'path'=>'string', 'options'=>'int'], + 'streamWrapper::dir_readdir' => ['string'], + 'streamWrapper::dir_rewinddir' => ['bool'], + 'streamWrapper::mkdir' => ['bool', 'path'=>'string', 'mode'=>'int', 'options'=>'int'], + 'streamWrapper::rename' => ['bool', 'path_from'=>'string', 'path_to'=>'string'], + 'streamWrapper::rmdir' => ['bool', 'path'=>'string', 'options'=>'int'], + 'streamWrapper::stream_cast' => ['resource', 'cast_as'=>'int'], + 'streamWrapper::stream_close' => ['void'], + 'streamWrapper::stream_eof' => ['bool'], + 'streamWrapper::stream_flush' => ['bool'], + 'streamWrapper::stream_lock' => ['bool', 'operation'=>'mode'], + 'streamWrapper::stream_metadata' => ['bool', 'path'=>'string', 'option'=>'int', 'value'=>'mixed'], + 'streamWrapper::stream_open' => ['bool', 'path'=>'string', 'mode'=>'string', 'options'=>'int', 'opened_path'=>'string'], + 'streamWrapper::stream_read' => ['string', 'count'=>'int'], + 'streamWrapper::stream_seek' => ['bool', 'offset'=>'int', 'whence'=>'int'], + 'streamWrapper::stream_set_option' => ['bool', 'option'=>'int', 'arg1'=>'int', 'arg2'=>'int'], + 'streamWrapper::stream_stat' => ['array'], + 'streamWrapper::stream_tell' => ['int'], + 'streamWrapper::stream_truncate' => ['bool', 'new_size'=>'int'], + 'streamWrapper::stream_write' => ['int', 'data'=>'string'], + 'streamWrapper::unlink' => ['bool', 'path'=>'string'], + 'streamWrapper::url_stat' => ['array', 'path'=>'string', 'flags'=>'int'], + 'stream_bucket_append' => ['void', 'brigade'=>'resource', 'bucket'=>'object'], + 'stream_bucket_make_writeable' => ['?object', 'brigade'=>'resource'], + 'stream_bucket_new' => ['object|false', 'stream'=>'resource', 'buffer'=>'string'], + 'stream_bucket_prepend' => ['void', 'brigade'=>'resource', 'bucket'=>'object'], + 'stream_context_create' => ['resource', 'options='=>'array', 'params='=>'array'], + 'stream_context_get_default' => ['resource', 'options='=>'array'], + 'stream_context_get_options' => ['array', 'stream_or_context'=>'resource'], + 'stream_context_get_params' => ['array', 'context'=>'resource'], + 'stream_context_set_default' => ['resource', 'options'=>'array'], + 'stream_context_set_option' => ['bool', 'context'=>'', 'wrapper_or_options'=>'string', 'option_name'=>'string', 'value'=>''], + 'stream_context_set_option\'1' => ['bool', 'context'=>'', 'wrapper_or_options'=>'array'], + 'stream_context_set_params' => ['bool', 'context'=>'resource', 'params'=>'array'], + 'stream_copy_to_stream' => ['int|false', 'from'=>'resource', 'to'=>'resource', 'length='=>'int', 'offset='=>'int'], + 'stream_encoding' => ['bool', 'stream'=>'resource', 'encoding='=>'string'], + 'stream_filter_append' => ['resource|false', 'stream'=>'resource', 'filter_name'=>'string', 'mode='=>'int', 'params='=>'mixed'], + 'stream_filter_prepend' => ['resource|false', 'stream'=>'resource', 'filter_name'=>'string', 'mode='=>'int', 'params='=>'mixed'], + 'stream_filter_register' => ['bool', 'filter_name'=>'string', 'class'=>'string'], + 'stream_filter_remove' => ['bool', 'stream_filter'=>'resource'], + 'stream_get_contents' => ['string|false', 'stream'=>'resource', 'length='=>'int', 'offset='=>'int'], + 'stream_get_filters' => ['array'], + 'stream_get_line' => ['string|false', 'stream'=>'resource', 'length'=>'int', 'ending='=>'string'], + 'stream_get_meta_data' => ['array{timed_out:bool,blocked:bool,eof:bool,unread_bytes:int,stream_type:string,wrapper_type:string,wrapper_data:mixed,mode:string,seekable:bool,uri:string,mediatype:string,crypto?:array{protocol:string,cipher_name:string,cipher_bits:int,cipher_version:string}}', 'stream'=>'resource'], + 'stream_get_transports' => ['list'], + 'stream_get_wrappers' => ['list'], + 'stream_is_local' => ['bool', 'stream'=>'resource|string'], + 'stream_notification_callback' => ['callback', 'notification_code'=>'int', 'severity'=>'int', 'message'=>'string', 'message_code'=>'int', 'bytes_transferred'=>'int', 'bytes_max'=>'int'], + 'stream_register_wrapper' => ['bool', 'protocol'=>'string', 'class'=>'string', 'flags='=>'int'], + 'stream_resolve_include_path' => ['string|false', 'filename'=>'string'], + 'stream_select' => ['int|false', '&rw_read'=>'resource[]', '&rw_write'=>'?resource[]', '&rw_except'=>'?resource[]', 'seconds'=>'?int', 'microseconds='=>'?int'], + 'stream_set_blocking' => ['bool', 'stream'=>'resource', 'enable'=>'bool'], + 'stream_set_chunk_size' => ['int|false', 'stream'=>'resource', 'size'=>'int'], + 'stream_set_read_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], + 'stream_set_timeout' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], + 'stream_set_write_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], + 'stream_socket_accept' => ['resource|false', 'socket'=>'resource', 'timeout='=>'float', '&w_peer_name='=>'string'], + 'stream_socket_client' => ['resource|false', 'address'=>'string', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float', 'flags='=>'int', 'context='=>'resource'], + 'stream_socket_enable_crypto' => ['int|bool', 'stream'=>'resource', 'enable'=>'bool', 'crypto_method='=>'int', 'session_stream='=>'resource'], + 'stream_socket_get_name' => ['string', 'socket'=>'resource', 'remote'=>'bool'], + 'stream_socket_pair' => ['resource[]|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], + 'stream_socket_recvfrom' => ['string', 'socket'=>'resource', 'length'=>'int', 'flags='=>'int', '&w_address='=>'string'], + 'stream_socket_sendto' => ['int', 'socket'=>'resource', 'data'=>'string', 'flags='=>'int', 'address='=>'string'], + 'stream_socket_server' => ['resource|false', 'address'=>'string', '&w_error_code='=>'int', '&w_error_message='=>'string', 'flags='=>'int', 'context='=>'resource'], + 'stream_socket_shutdown' => ['bool', 'stream'=>'resource', 'mode'=>'int'], + 'stream_supports_lock' => ['bool', 'stream'=>'resource'], + 'stream_wrapper_register' => ['bool', 'protocol'=>'string', 'class'=>'string', 'flags='=>'int'], + 'stream_wrapper_restore' => ['bool', 'protocol'=>'string'], + 'stream_wrapper_unregister' => ['bool', 'protocol'=>'string'], + 'strftime' => ['string|false', 'format'=>'string', 'timestamp='=>'int'], + 'strip_tags' => ['string', 'string'=>'string', 'allowed_tags='=>'string'], + 'stripcslashes' => ['string', 'string'=>'string'], + 'stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], + 'stripslashes' => ['string', 'string'=>'string'], + 'stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], + 'strlen' => ['0|positive-int', 'string'=>'string'], + 'strnatcasecmp' => ['int', 'string1'=>'string', 'string2'=>'string'], + 'strnatcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], + 'strncasecmp' => ['int', 'string1'=>'string', 'string2'=>'string', 'length'=>'int'], + 'strncmp' => ['int', 'string1'=>'string', 'string2'=>'string', 'length'=>'int'], + 'strpbrk' => ['string|false', 'string'=>'string', 'characters'=>'string'], + 'strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], + 'strptime' => ['array|false', 'timestamp'=>'string', 'format'=>'string'], + 'strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int'], + 'strrev' => ['string', 'string'=>'string'], + 'strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], + 'strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], + 'strspn' => ['int', 'string'=>'string', 'characters'=>'string', 'offset='=>'int', 'length='=>'int'], + 'strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], + 'strtok' => ['string|false', 'string'=>'string', 'token'=>'string'], + 'strtok\'1' => ['string|false', 'string'=>'string'], + 'strtolower' => ['lowercase-string', 'string'=>'string'], + 'strtotime' => ['int|false', 'datetime'=>'string', 'baseTimestamp='=>'int'], + 'strtoupper' => ['string', 'string'=>'string'], + 'strtr' => ['string', 'string'=>'string', 'from'=>'string', 'to'=>'string'], + 'strtr\'1' => ['string', 'string'=>'string', 'from'=>'array'], + 'strval' => ['string', 'value'=>'mixed'], + 'styleObj::__construct' => ['void', 'label'=>'labelObj', 'style'=>'styleObj'], + 'styleObj::convertToString' => ['string'], + 'styleObj::free' => ['void'], + 'styleObj::getBinding' => ['string', 'stylebinding'=>'mixed'], + 'styleObj::getGeomTransform' => ['string'], + 'styleObj::ms_newStyleObj' => ['styleObj', 'class'=>'classObj', 'style'=>'styleObj'], + 'styleObj::removeBinding' => ['int', 'stylebinding'=>'mixed'], + 'styleObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'styleObj::setBinding' => ['int', 'stylebinding'=>'mixed', 'value'=>'string'], + 'styleObj::setGeomTransform' => ['int', 'value'=>'string'], + 'styleObj::updateFromString' => ['int', 'snippet'=>'string'], + 'substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int'], + 'substr_compare' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset'=>'int', 'length='=>'int', 'case_insensitive='=>'bool'], + 'substr_count' => ['int', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'length='=>'int'], + 'substr_replace' => ['string|string[]', 'string'=>'string|string[]', 'replace'=>'mixed', 'offset'=>'mixed', 'length='=>'mixed'], + 'suhosin_encrypt_cookie' => ['string|false', 'name'=>'string', 'value'=>'string'], + 'suhosin_get_raw_cookies' => ['array'], + 'svm::crossvalidate' => ['float', 'problem'=>'array', 'number_of_folds'=>'int'], + 'svm::train' => ['SVMModel', 'problem'=>'array', 'weights='=>'array'], + 'svn_add' => ['bool', 'path'=>'string', 'recursive='=>'bool', 'force='=>'bool'], + 'svn_auth_get_parameter' => ['?string', 'key'=>'string'], + 'svn_auth_set_parameter' => ['void', 'key'=>'string', 'value'=>'string'], + 'svn_blame' => ['array', 'repository_url'=>'string', 'revision_no='=>'int'], + 'svn_cat' => ['string', 'repos_url'=>'string', 'revision_no='=>'int'], + 'svn_checkout' => ['bool', 'repos'=>'string', 'targetpath'=>'string', 'revision='=>'int', 'flags='=>'int'], + 'svn_cleanup' => ['bool', 'workingdir'=>'string'], + 'svn_client_version' => ['string'], + 'svn_commit' => ['array', 'log'=>'string', 'targets'=>'array', 'dontrecurse='=>'bool'], + 'svn_delete' => ['bool', 'path'=>'string', 'force='=>'bool'], + 'svn_diff' => ['array', 'path1'=>'string', 'rev1'=>'int', 'path2'=>'string', 'rev2'=>'int'], + 'svn_export' => ['bool', 'frompath'=>'string', 'topath'=>'string', 'working_copy='=>'bool', 'revision_no='=>'int'], + 'svn_fs_abort_txn' => ['bool', 'txn'=>'resource'], + 'svn_fs_apply_text' => ['resource', 'root'=>'resource', 'path'=>'string'], + 'svn_fs_begin_txn2' => ['resource', 'repos'=>'resource', 'rev'=>'int'], + 'svn_fs_change_node_prop' => ['bool', 'root'=>'resource', 'path'=>'string', 'name'=>'string', 'value'=>'string'], + 'svn_fs_check_path' => ['int', 'fsroot'=>'resource', 'path'=>'string'], + 'svn_fs_contents_changed' => ['bool', 'root1'=>'resource', 'path1'=>'string', 'root2'=>'resource', 'path2'=>'string'], + 'svn_fs_copy' => ['bool', 'from_root'=>'resource', 'from_path'=>'string', 'to_root'=>'resource', 'to_path'=>'string'], + 'svn_fs_delete' => ['bool', 'root'=>'resource', 'path'=>'string'], + 'svn_fs_dir_entries' => ['array', 'fsroot'=>'resource', 'path'=>'string'], + 'svn_fs_file_contents' => ['resource', 'fsroot'=>'resource', 'path'=>'string'], + 'svn_fs_file_length' => ['int', 'fsroot'=>'resource', 'path'=>'string'], + 'svn_fs_is_dir' => ['bool', 'root'=>'resource', 'path'=>'string'], + 'svn_fs_is_file' => ['bool', 'root'=>'resource', 'path'=>'string'], + 'svn_fs_make_dir' => ['bool', 'root'=>'resource', 'path'=>'string'], + 'svn_fs_make_file' => ['bool', 'root'=>'resource', 'path'=>'string'], + 'svn_fs_node_created_rev' => ['int', 'fsroot'=>'resource', 'path'=>'string'], + 'svn_fs_node_prop' => ['string', 'fsroot'=>'resource', 'path'=>'string', 'propname'=>'string'], + 'svn_fs_props_changed' => ['bool', 'root1'=>'resource', 'path1'=>'string', 'root2'=>'resource', 'path2'=>'string'], + 'svn_fs_revision_prop' => ['string', 'fs'=>'resource', 'revnum'=>'int', 'propname'=>'string'], + 'svn_fs_revision_root' => ['resource', 'fs'=>'resource', 'revnum'=>'int'], + 'svn_fs_txn_root' => ['resource', 'txn'=>'resource'], + 'svn_fs_youngest_rev' => ['int', 'fs'=>'resource'], + 'svn_import' => ['bool', 'path'=>'string', 'url'=>'string', 'nonrecursive'=>'bool'], + 'svn_log' => ['array', 'repos_url'=>'string', 'start_revision='=>'int', 'end_revision='=>'int', 'limit='=>'int', 'flags='=>'int'], + 'svn_ls' => ['array', 'repos_url'=>'string', 'revision_no='=>'int', 'recurse='=>'bool', 'peg='=>'bool'], + 'svn_mkdir' => ['bool', 'path'=>'string', 'log_message='=>'string'], + 'svn_move' => ['mixed', 'src_path'=>'string', 'dst_path'=>'string', 'force='=>'bool'], + 'svn_propget' => ['mixed', 'path'=>'string', 'property_name'=>'string', 'recurse='=>'bool', 'revision'=>'int'], + 'svn_proplist' => ['mixed', 'path'=>'string', 'recurse='=>'bool', 'revision'=>'int'], + 'svn_repos_create' => ['resource', 'path'=>'string', 'config='=>'array', 'fsconfig='=>'array'], + 'svn_repos_fs' => ['resource', 'repos'=>'resource'], + 'svn_repos_fs_begin_txn_for_commit' => ['resource', 'repos'=>'resource', 'rev'=>'int', 'author'=>'string', 'log_msg'=>'string'], + 'svn_repos_fs_commit_txn' => ['int', 'txn'=>'resource'], + 'svn_repos_hotcopy' => ['bool', 'repospath'=>'string', 'destpath'=>'string', 'cleanlogs'=>'bool'], + 'svn_repos_open' => ['resource', 'path'=>'string'], + 'svn_repos_recover' => ['bool', 'path'=>'string'], + 'svn_revert' => ['bool', 'path'=>'string', 'recursive='=>'bool'], + 'svn_status' => ['array', 'path'=>'string', 'flags='=>'int'], + 'svn_update' => ['int|false', 'path'=>'string', 'revno='=>'int', 'recurse='=>'bool'], + 'swf_actiongeturl' => ['', 'url'=>'string', 'target'=>'string'], + 'swf_actiongotoframe' => ['', 'framenumber'=>'int'], + 'swf_actiongotolabel' => ['', 'label'=>'string'], + 'swf_actionnextframe' => [''], + 'swf_actionplay' => [''], + 'swf_actionprevframe' => [''], + 'swf_actionsettarget' => ['', 'target'=>'string'], + 'swf_actionstop' => [''], + 'swf_actiontogglequality' => [''], + 'swf_actionwaitforframe' => ['', 'framenumber'=>'int', 'skipcount'=>'int'], + 'swf_addbuttonrecord' => ['', 'states'=>'int', 'shapeid'=>'int', 'depth'=>'int'], + 'swf_addcolor' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], + 'swf_closefile' => ['', 'return_file='=>'int'], + 'swf_definebitmap' => ['', 'objid'=>'int', 'image_name'=>'string'], + 'swf_definefont' => ['', 'fontid'=>'int', 'fontname'=>'string'], + 'swf_defineline' => ['', 'objid'=>'int', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'width'=>'float'], + 'swf_definepoly' => ['', 'objid'=>'int', 'coords'=>'array', 'npoints'=>'int', 'width'=>'float'], + 'swf_definerect' => ['', 'objid'=>'int', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'width'=>'float'], + 'swf_definetext' => ['', 'objid'=>'int', 'string'=>'string', 'docenter'=>'int'], + 'swf_endbutton' => [''], + 'swf_enddoaction' => [''], + 'swf_endshape' => [''], + 'swf_endsymbol' => [''], + 'swf_fontsize' => ['', 'size'=>'float'], + 'swf_fontslant' => ['', 'slant'=>'float'], + 'swf_fonttracking' => ['', 'tracking'=>'float'], + 'swf_getbitmapinfo' => ['array', 'bitmapid'=>'int'], + 'swf_getfontinfo' => ['array'], + 'swf_getframe' => ['int'], + 'swf_labelframe' => ['', 'name'=>'string'], + 'swf_lookat' => ['', 'view_x'=>'float', 'view_y'=>'float', 'view_z'=>'float', 'reference_x'=>'float', 'reference_y'=>'float', 'reference_z'=>'float', 'twist'=>'float'], + 'swf_modifyobject' => ['', 'depth'=>'int', 'how'=>'int'], + 'swf_mulcolor' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], + 'swf_nextid' => ['int'], + 'swf_oncondition' => ['', 'transition'=>'int'], + 'swf_openfile' => ['', 'filename'=>'string', 'width'=>'float', 'height'=>'float', 'framerate'=>'float', 'r'=>'float', 'g'=>'float', 'b'=>'float'], + 'swf_ortho' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float', 'zmin'=>'float', 'zmax'=>'float'], + 'swf_ortho2' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float'], + 'swf_perspective' => ['', 'fovy'=>'float', 'aspect'=>'float', 'near'=>'float', 'far'=>'float'], + 'swf_placeobject' => ['', 'objid'=>'int', 'depth'=>'int'], + 'swf_polarview' => ['', 'dist'=>'float', 'azimuth'=>'float', 'incidence'=>'float', 'twist'=>'float'], + 'swf_popmatrix' => [''], + 'swf_posround' => ['', 'round'=>'int'], + 'swf_pushmatrix' => [''], + 'swf_removeobject' => ['', 'depth'=>'int'], + 'swf_rotate' => ['', 'angle'=>'float', 'axis'=>'string'], + 'swf_scale' => ['', 'x'=>'float', 'y'=>'float', 'z'=>'float'], + 'swf_setfont' => ['', 'fontid'=>'int'], + 'swf_setframe' => ['', 'framenumber'=>'int'], + 'swf_shapearc' => ['', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'ang1'=>'float', 'ang2'=>'float'], + 'swf_shapecurveto' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], + 'swf_shapecurveto3' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], + 'swf_shapefillbitmapclip' => ['', 'bitmapid'=>'int'], + 'swf_shapefillbitmaptile' => ['', 'bitmapid'=>'int'], + 'swf_shapefilloff' => [''], + 'swf_shapefillsolid' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], + 'swf_shapelinesolid' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float', 'width'=>'float'], + 'swf_shapelineto' => ['', 'x'=>'float', 'y'=>'float'], + 'swf_shapemoveto' => ['', 'x'=>'float', 'y'=>'float'], + 'swf_showframe' => [''], + 'swf_startbutton' => ['', 'objid'=>'int', 'type'=>'int'], + 'swf_startdoaction' => [''], + 'swf_startshape' => ['', 'objid'=>'int'], + 'swf_startsymbol' => ['', 'objid'=>'int'], + 'swf_textwidth' => ['float', 'string'=>'string'], + 'swf_translate' => ['', 'x'=>'float', 'y'=>'float', 'z'=>'float'], + 'swf_viewport' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float'], + 'swoole\async::dnsLookup' => ['void', 'hostname'=>'string', 'callback'=>'callable'], + 'swoole\async::read' => ['bool', 'filename'=>'string', 'callback'=>'callable', 'chunk_size='=>'integer', 'offset='=>'integer'], + 'swoole\async::readFile' => ['void', 'filename'=>'string', 'callback'=>'callable'], + 'swoole\async::set' => ['void', 'settings'=>'array'], + 'swoole\async::write' => ['void', 'filename'=>'string', 'content'=>'string', 'offset='=>'integer', 'callback='=>'callable'], + 'swoole\async::writeFile' => ['void', 'filename'=>'string', 'content'=>'string', 'callback='=>'callable', 'flags='=>'string'], + 'swoole\atomic::add' => ['integer', 'add_value='=>'integer'], + 'swoole\atomic::cmpset' => ['integer', 'cmp_value'=>'integer', 'new_value'=>'integer'], + 'swoole\atomic::get' => ['integer'], + 'swoole\atomic::set' => ['integer', 'value'=>'integer'], + 'swoole\atomic::sub' => ['integer', 'sub_value='=>'integer'], + 'swoole\buffer::__destruct' => ['void'], + 'swoole\buffer::__toString' => ['string'], + 'swoole\buffer::append' => ['integer', 'data'=>'string'], + 'swoole\buffer::clear' => ['void'], + 'swoole\buffer::expand' => ['integer', 'size'=>'integer'], + 'swoole\buffer::read' => ['string', 'offset'=>'integer', 'length'=>'integer'], + 'swoole\buffer::recycle' => ['void'], + 'swoole\buffer::substr' => ['string', 'offset'=>'integer', 'length='=>'integer', 'remove='=>'bool'], + 'swoole\buffer::write' => ['void', 'offset'=>'integer', 'data'=>'string'], + 'swoole\channel::__destruct' => ['void'], + 'swoole\channel::pop' => ['mixed'], + 'swoole\channel::push' => ['bool', 'data'=>'string'], + 'swoole\channel::stats' => ['array'], + 'swoole\client::__destruct' => ['void'], + 'swoole\client::close' => ['bool', 'force='=>'bool'], + 'swoole\client::connect' => ['bool', 'host'=>'string', 'port='=>'integer', 'timeout='=>'integer', 'flag='=>'integer'], + 'swoole\client::getpeername' => ['array'], + 'swoole\client::getsockname' => ['array'], + 'swoole\client::isConnected' => ['bool'], + 'swoole\client::on' => ['void', 'event'=>'string', 'callback'=>'callable'], + 'swoole\client::pause' => ['void'], + 'swoole\client::pipe' => ['void', 'socket'=>'string'], + 'swoole\client::recv' => ['void', 'size='=>'string', 'flag='=>'string'], + 'swoole\client::resume' => ['void'], + 'swoole\client::send' => ['integer', 'data'=>'string', 'flag='=>'string'], + 'swoole\client::sendfile' => ['bool', 'filename'=>'string', 'offset='=>'int'], + 'swoole\client::sendto' => ['bool', 'ip'=>'string', 'port'=>'integer', 'data'=>'string'], + 'swoole\client::set' => ['void', 'settings'=>'array'], + 'swoole\client::sleep' => ['void'], + 'swoole\client::wakeup' => ['void'], + 'swoole\connection\iterator::count' => ['int'], + 'swoole\connection\iterator::current' => ['Connection'], + 'swoole\connection\iterator::key' => ['int'], + 'swoole\connection\iterator::next' => ['Connection'], + 'swoole\connection\iterator::offsetExists' => ['bool', 'index'=>'int'], + 'swoole\connection\iterator::offsetGet' => ['Connection', 'index'=>'string'], + 'swoole\connection\iterator::offsetSet' => ['void', 'offset'=>'int', 'connection'=>'mixed'], + 'swoole\connection\iterator::offsetUnset' => ['void', 'offset'=>'int'], + 'swoole\connection\iterator::rewind' => ['void'], + 'swoole\connection\iterator::valid' => ['bool'], + 'swoole\coroutine::call_user_func' => ['mixed', 'callback'=>'callable', 'parameter='=>'mixed', '...args='=>'mixed'], + 'swoole\coroutine::call_user_func_array' => ['mixed', 'callback'=>'callable', 'param_array'=>'array'], + 'swoole\coroutine::cli_wait' => ['ReturnType'], + 'swoole\coroutine::create' => ['ReturnType'], + 'swoole\coroutine::getuid' => ['ReturnType'], + 'swoole\coroutine::resume' => ['ReturnType'], + 'swoole\coroutine::suspend' => ['ReturnType'], + 'swoole\coroutine\client::__destruct' => ['ReturnType'], + 'swoole\coroutine\client::close' => ['ReturnType'], + 'swoole\coroutine\client::connect' => ['ReturnType'], + 'swoole\coroutine\client::getpeername' => ['ReturnType'], + 'swoole\coroutine\client::getsockname' => ['ReturnType'], + 'swoole\coroutine\client::isConnected' => ['ReturnType'], + 'swoole\coroutine\client::recv' => ['ReturnType'], + 'swoole\coroutine\client::send' => ['ReturnType'], + 'swoole\coroutine\client::sendfile' => ['ReturnType'], + 'swoole\coroutine\client::sendto' => ['ReturnType'], + 'swoole\coroutine\client::set' => ['ReturnType'], + 'swoole\coroutine\http\client::__destruct' => ['ReturnType'], + 'swoole\coroutine\http\client::addFile' => ['ReturnType'], + 'swoole\coroutine\http\client::close' => ['ReturnType'], + 'swoole\coroutine\http\client::execute' => ['ReturnType'], + 'swoole\coroutine\http\client::get' => ['ReturnType'], + 'swoole\coroutine\http\client::getDefer' => ['ReturnType'], + 'swoole\coroutine\http\client::isConnected' => ['ReturnType'], + 'swoole\coroutine\http\client::post' => ['ReturnType'], + 'swoole\coroutine\http\client::recv' => ['ReturnType'], + 'swoole\coroutine\http\client::set' => ['ReturnType'], + 'swoole\coroutine\http\client::setCookies' => ['ReturnType'], + 'swoole\coroutine\http\client::setData' => ['ReturnType'], + 'swoole\coroutine\http\client::setDefer' => ['ReturnType'], + 'swoole\coroutine\http\client::setHeaders' => ['ReturnType'], + 'swoole\coroutine\http\client::setMethod' => ['ReturnType'], + 'swoole\coroutine\mysql::__destruct' => ['ReturnType'], + 'swoole\coroutine\mysql::close' => ['ReturnType'], + 'swoole\coroutine\mysql::connect' => ['ReturnType'], + 'swoole\coroutine\mysql::getDefer' => ['ReturnType'], + 'swoole\coroutine\mysql::query' => ['ReturnType'], + 'swoole\coroutine\mysql::recv' => ['ReturnType'], + 'swoole\coroutine\mysql::setDefer' => ['ReturnType'], + 'swoole\event::add' => ['bool', 'fd'=>'int', 'read_callback'=>'callable', 'write_callback='=>'callable', 'events='=>'string'], + 'swoole\event::defer' => ['void', 'callback'=>'mixed'], + 'swoole\event::del' => ['bool', 'fd'=>'string'], + 'swoole\event::exit' => ['void'], + 'swoole\event::set' => ['bool', 'fd'=>'int', 'read_callback='=>'string', 'write_callback='=>'string', 'events='=>'string'], + 'swoole\event::wait' => ['void'], + 'swoole\event::write' => ['void', 'fd'=>'string', 'data'=>'string'], + 'swoole\http\client::__destruct' => ['void'], + 'swoole\http\client::addFile' => ['void', 'path'=>'string', 'name'=>'string', 'type='=>'string', 'filename='=>'string', 'offset='=>'string'], + 'swoole\http\client::close' => ['void'], + 'swoole\http\client::download' => ['void', 'path'=>'string', 'file'=>'string', 'callback'=>'callable', 'offset='=>'integer'], + 'swoole\http\client::execute' => ['void', 'path'=>'string', 'callback'=>'string'], + 'swoole\http\client::get' => ['void', 'path'=>'string', 'callback'=>'callable'], + 'swoole\http\client::isConnected' => ['bool'], + 'swoole\http\client::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], + 'swoole\http\client::post' => ['void', 'path'=>'string', 'data'=>'string', 'callback'=>'callable'], + 'swoole\http\client::push' => ['void', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string'], + 'swoole\http\client::set' => ['void', 'settings'=>'array'], + 'swoole\http\client::setCookies' => ['void', 'cookies'=>'array'], + 'swoole\http\client::setData' => ['ReturnType', 'data'=>'string'], + 'swoole\http\client::setHeaders' => ['void', 'headers'=>'array'], + 'swoole\http\client::setMethod' => ['void', 'method'=>'string'], + 'swoole\http\client::upgrade' => ['void', 'path'=>'string', 'callback'=>'string'], + 'swoole\http\request::__destruct' => ['void'], + 'swoole\http\request::rawcontent' => ['string'], + 'swoole\http\response::__destruct' => ['void'], + 'swoole\http\response::cookie' => ['string', 'name'=>'string', 'value='=>'string', 'expires='=>'string', 'path='=>'string', 'domain='=>'string', 'secure='=>'string', 'httponly='=>'string'], + 'swoole\http\response::end' => ['void', 'content='=>'string'], + 'swoole\http\response::gzip' => ['ReturnType', 'compress_level='=>'string'], + 'swoole\http\response::header' => ['void', 'key'=>'string', 'value'=>'string', 'ucwords='=>'string'], + 'swoole\http\response::initHeader' => ['ReturnType'], + 'swoole\http\response::rawcookie' => ['ReturnType', 'name'=>'string', 'value='=>'string', 'expires='=>'string', 'path='=>'string', 'domain='=>'string', 'secure='=>'string', 'httponly='=>'string'], + 'swoole\http\response::sendfile' => ['ReturnType', 'filename'=>'string', 'offset='=>'int'], + 'swoole\http\response::status' => ['ReturnType', 'http_code'=>'string'], + 'swoole\http\response::write' => ['void', 'content'=>'string'], + 'swoole\http\server::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], + 'swoole\http\server::start' => ['void'], + 'swoole\lock::__destruct' => ['void'], + 'swoole\lock::lock' => ['void'], + 'swoole\lock::lock_read' => ['void'], + 'swoole\lock::trylock' => ['void'], + 'swoole\lock::trylock_read' => ['void'], + 'swoole\lock::unlock' => ['void'], + 'swoole\mmap::open' => ['ReturnType', 'filename'=>'string', 'size='=>'string', 'offset='=>'string'], + 'swoole\mysql::__destruct' => ['void'], + 'swoole\mysql::close' => ['void'], + 'swoole\mysql::connect' => ['void', 'server_config'=>'array', 'callback'=>'callable'], + 'swoole\mysql::getBuffer' => ['ReturnType'], + 'swoole\mysql::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], + 'swoole\mysql::query' => ['ReturnType', 'sql'=>'string', 'callback'=>'callable'], + 'swoole\process::__destruct' => ['void'], + 'swoole\process::alarm' => ['void', 'interval_usec'=>'integer'], + 'swoole\process::close' => ['void'], + 'swoole\process::daemon' => ['void', 'nochdir='=>'bool', 'noclose='=>'bool'], + 'swoole\process::exec' => ['ReturnType', 'exec_file'=>'string', 'args'=>'string'], + 'swoole\process::exit' => ['void', 'exit_code='=>'string'], + 'swoole\process::freeQueue' => ['void'], + 'swoole\process::kill' => ['void', 'pid'=>'integer', 'signal_no='=>'string'], + 'swoole\process::name' => ['void', 'process_name'=>'string'], + 'swoole\process::pop' => ['mixed', 'maxsize='=>'integer'], + 'swoole\process::push' => ['bool', 'data'=>'string'], + 'swoole\process::read' => ['string', 'maxsize='=>'integer'], + 'swoole\process::signal' => ['void', 'signal_no'=>'string', 'callback'=>'callable'], + 'swoole\process::start' => ['void'], + 'swoole\process::statQueue' => ['array'], + 'swoole\process::useQueue' => ['bool', 'key'=>'integer', 'mode='=>'integer'], + 'swoole\process::wait' => ['array', 'blocking='=>'bool'], + 'swoole\process::write' => ['integer', 'data'=>'string'], + 'swoole\redis\server::format' => ['ReturnType', 'type'=>'string', 'value='=>'string'], + 'swoole\redis\server::setHandler' => ['ReturnType', 'command'=>'string', 'callback'=>'string', 'number_of_string_param='=>'string', 'type_of_array_param='=>'string'], + 'swoole\redis\server::start' => ['ReturnType'], + 'swoole\serialize::pack' => ['ReturnType', 'data'=>'string', 'is_fast='=>'int'], + 'swoole\serialize::unpack' => ['ReturnType', 'data'=>'string', 'args='=>'string'], + 'swoole\server::addProcess' => ['bool', 'process'=>'swoole_process'], + 'swoole\server::addlistener' => ['void', 'host'=>'string', 'port'=>'integer', 'socket_type'=>'string'], + 'swoole\server::after' => ['ReturnType', 'after_time_ms'=>'integer', 'callback'=>'callable', 'param='=>'string'], + 'swoole\server::bind' => ['bool', 'fd'=>'integer', 'uid'=>'integer'], + 'swoole\server::close' => ['bool', 'fd'=>'integer', 'reset='=>'bool'], + 'swoole\server::confirm' => ['bool', 'fd'=>'integer'], + 'swoole\server::connection_info' => ['array', 'fd'=>'integer', 'reactor_id='=>'integer'], + 'swoole\server::connection_list' => ['array', 'start_fd'=>'integer', 'pagesize='=>'integer'], + 'swoole\server::defer' => ['void', 'callback'=>'callable'], + 'swoole\server::exist' => ['bool', 'fd'=>'integer'], + 'swoole\server::finish' => ['void', 'data'=>'string'], + 'swoole\server::getClientInfo' => ['ReturnType', 'fd'=>'integer', 'reactor_id='=>'integer'], + 'swoole\server::getClientList' => ['array', 'start_fd'=>'integer', 'pagesize='=>'integer'], + 'swoole\server::getLastError' => ['integer'], + 'swoole\server::heartbeat' => ['mixed', 'if_close_connection'=>'bool'], + 'swoole\server::listen' => ['bool', 'host'=>'string', 'port'=>'integer', 'socket_type'=>'string'], + 'swoole\server::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], + 'swoole\server::pause' => ['void', 'fd'=>'integer'], + 'swoole\server::protect' => ['void', 'fd'=>'integer', 'is_protected='=>'bool'], + 'swoole\server::reload' => ['bool'], + 'swoole\server::resume' => ['void', 'fd'=>'integer'], + 'swoole\server::send' => ['bool', 'fd'=>'integer', 'data'=>'string', 'reactor_id='=>'integer'], + 'swoole\server::sendMessage' => ['bool', 'worker_id'=>'integer', 'data'=>'string'], + 'swoole\server::sendfile' => ['bool', 'fd'=>'integer', 'filename'=>'string', 'offset='=>'integer'], + 'swoole\server::sendto' => ['bool', 'ip'=>'string', 'port'=>'integer', 'data'=>'string', 'server_socket='=>'string'], + 'swoole\server::sendwait' => ['bool', 'fd'=>'integer', 'data'=>'string'], + 'swoole\server::set' => ['ReturnType', 'settings'=>'array'], + 'swoole\server::shutdown' => ['void'], + 'swoole\server::start' => ['void'], + 'swoole\server::stats' => ['array'], + 'swoole\server::stop' => ['bool', 'worker_id='=>'integer'], + 'swoole\server::task' => ['mixed', 'data'=>'string', 'dst_worker_id='=>'integer', 'callback='=>'callable'], + 'swoole\server::taskWaitMulti' => ['void', 'tasks'=>'array', 'timeout_ms='=>'double'], + 'swoole\server::taskwait' => ['void', 'data'=>'string', 'timeout='=>'float', 'worker_id='=>'integer'], + 'swoole\server::tick' => ['void', 'interval_ms'=>'integer', 'callback'=>'callable'], + 'swoole\server\port::__destruct' => ['void'], + 'swoole\server\port::on' => ['ReturnType', 'event_name'=>'string', 'callback'=>'callable'], + 'swoole\server\port::set' => ['void', 'settings'=>'array'], + 'swoole\table::column' => ['ReturnType', 'name'=>'string', 'type'=>'string', 'size='=>'integer'], + 'swoole\table::count' => ['integer'], + 'swoole\table::create' => ['void'], + 'swoole\table::current' => ['array'], + 'swoole\table::decr' => ['ReturnType', 'key'=>'string', 'column'=>'string', 'decrby='=>'integer'], + 'swoole\table::del' => ['void', 'key'=>'string'], + 'swoole\table::destroy' => ['void'], + 'swoole\table::exist' => ['bool', 'key'=>'string'], + 'swoole\table::get' => ['integer', 'row_key'=>'string', 'column_key'=>'string'], + 'swoole\table::incr' => ['void', 'key'=>'string', 'column'=>'string', 'incrby='=>'integer'], + 'swoole\table::key' => ['string'], + 'swoole\table::next' => ['ReturnType'], + 'swoole\table::rewind' => ['void'], + 'swoole\table::set' => ['VOID', 'key'=>'string', 'value'=>'array'], + 'swoole\table::valid' => ['bool'], + 'swoole\timer::after' => ['void', 'after_time_ms'=>'int', 'callback'=>'callable'], + 'swoole\timer::clear' => ['void', 'timer_id'=>'integer'], + 'swoole\timer::exists' => ['bool', 'timer_id'=>'integer'], + 'swoole\timer::tick' => ['void', 'interval_ms'=>'integer', 'callback'=>'callable', 'param='=>'string'], + 'swoole\websocket\server::exist' => ['bool', 'fd'=>'integer'], + 'swoole\websocket\server::on' => ['ReturnType', 'event_name'=>'string', 'callback'=>'callable'], + 'swoole\websocket\server::pack' => ['binary', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string', 'mask='=>'string'], + 'swoole\websocket\server::push' => ['void', 'fd'=>'string', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string'], + 'swoole\websocket\server::unpack' => ['string', 'data'=>'binary'], + 'swoole_async_dns_lookup' => ['bool', 'hostname'=>'string', 'callback'=>'callable'], + 'swoole_async_read' => ['bool', 'filename'=>'string', 'callback'=>'callable', 'chunk_size='=>'int', 'offset='=>'int'], + 'swoole_async_readfile' => ['bool', 'filename'=>'string', 'callback'=>'string'], + 'swoole_async_set' => ['void', 'settings'=>'array'], + 'swoole_async_write' => ['bool', 'filename'=>'string', 'content'=>'string', 'offset='=>'int', 'callback='=>'callable'], + 'swoole_async_writefile' => ['bool', 'filename'=>'string', 'content'=>'string', 'callback='=>'callable', 'flags='=>'int'], + 'swoole_client_select' => ['int', 'read_array'=>'array', 'write_array'=>'array', 'error_array'=>'array', 'timeout='=>'float'], + 'swoole_cpu_num' => ['int'], + 'swoole_errno' => ['int'], + 'swoole_event_add' => ['int', 'fd'=>'int', 'read_callback='=>'callable', 'write_callback='=>'callable', 'events='=>'int'], + 'swoole_event_defer' => ['bool', 'callback'=>'callable'], + 'swoole_event_del' => ['bool', 'fd'=>'int'], + 'swoole_event_exit' => ['void'], + 'swoole_event_set' => ['bool', 'fd'=>'int', 'read_callback='=>'callable', 'write_callback='=>'callable', 'events='=>'int'], + 'swoole_event_wait' => ['void'], + 'swoole_event_write' => ['bool', 'fd'=>'int', 'data'=>'string'], + 'swoole_get_local_ip' => ['array'], + 'swoole_last_error' => ['int'], + 'swoole_load_module' => ['mixed', 'filename'=>'string'], + 'swoole_select' => ['int', 'read_array'=>'array', 'write_array'=>'array', 'error_array'=>'array', 'timeout='=>'float'], + 'swoole_set_process_name' => ['void', 'process_name'=>'string', 'size='=>'int'], + 'swoole_strerror' => ['string', 'errno'=>'int', 'error_type='=>'int'], + 'swoole_timer_after' => ['int', 'ms'=>'int', 'callback'=>'callable', 'param='=>'mixed'], + 'swoole_timer_exists' => ['bool', 'timer_id'=>'int'], + 'swoole_timer_tick' => ['int', 'ms'=>'int', 'callback'=>'callable', 'param='=>'mixed'], + 'swoole_version' => ['string'], + 'symbolObj::__construct' => ['void', 'map'=>'mapObj', 'symbolname'=>'string'], + 'symbolObj::free' => ['void'], + 'symbolObj::getPatternArray' => ['array'], + 'symbolObj::getPointsArray' => ['array'], + 'symbolObj::ms_newSymbolObj' => ['int', 'map'=>'mapObj', 'symbolname'=>'string'], + 'symbolObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'symbolObj::setImagePath' => ['int', 'filename'=>'string'], + 'symbolObj::setPattern' => ['int', 'int'=>'array'], + 'symbolObj::setPoints' => ['int', 'double'=>'array'], + 'symlink' => ['bool', 'target'=>'string', 'link'=>'string'], + 'sys_get_temp_dir' => ['string'], + 'sys_getloadavg' => ['array'], + 'syslog' => ['bool', 'priority'=>'int', 'message'=>'string'], + 'system' => ['string|false', 'command'=>'string', '&w_result_code='=>'int'], + 'taint' => ['bool', '&rw_string'=>'string', '&...w_other_strings='=>'string'], + 'tan' => ['float', 'num'=>'float'], + 'tanh' => ['float', 'num'=>'float'], + 'tcpwrap_check' => ['bool', 'daemon'=>'string', 'address'=>'string', 'user='=>'string', 'nodns='=>'bool'], + 'tempnam' => ['string|false', 'directory'=>'string', 'prefix'=>'string'], + 'textdomain' => ['string', 'domain'=>'string'], + 'tidy::__construct' => ['void', 'filename='=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], + 'tidy::body' => ['tidyNode'], + 'tidy::cleanRepair' => ['bool'], + 'tidy::diagnose' => ['bool'], + 'tidy::getConfig' => ['array'], + 'tidy::getHtmlVer' => ['int'], + 'tidy::getOpt' => ['mixed', 'option'=>'string'], + 'tidy::getOptDoc' => ['string', 'option'=>'string'], + 'tidy::getRelease' => ['string'], + 'tidy::getStatus' => ['int'], + 'tidy::head' => ['tidyNode'], + 'tidy::html' => ['tidyNode'], + 'tidy::htmlver' => ['int'], + 'tidy::isXhtml' => ['bool'], + 'tidy::isXml' => ['bool'], + 'tidy::parseFile' => ['bool', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], + 'tidy::parseString' => ['bool', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], + 'tidy::repairFile' => ['string', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], + 'tidy::repairString' => ['string', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], + 'tidy::root' => ['tidyNode'], + 'tidyNode::__construct' => ['void'], + 'tidyNode::getParent' => ['tidyNode'], + 'tidyNode::hasChildren' => ['bool'], + 'tidyNode::hasSiblings' => ['bool'], + 'tidyNode::isAsp' => ['bool'], + 'tidyNode::isComment' => ['bool'], + 'tidyNode::isHtml' => ['bool'], + 'tidyNode::isJste' => ['bool'], + 'tidyNode::isPhp' => ['bool'], + 'tidyNode::isText' => ['bool'], + 'tidy_access_count' => ['int', 'tidy'=>'tidy'], + 'tidy_clean_repair' => ['bool', 'tidy'=>'tidy'], + 'tidy_config_count' => ['int', 'tidy'=>'tidy'], + 'tidy_diagnose' => ['bool', 'tidy'=>'tidy'], + 'tidy_error_count' => ['int', 'tidy'=>'tidy'], + 'tidy_get_body' => ['?tidyNode', 'tidy'=>'tidy'], + 'tidy_get_config' => ['array', 'tidy'=>'tidy'], + 'tidy_get_error_buffer' => ['string', 'tidy'=>'tidy'], + 'tidy_get_head' => ['?tidyNode', 'tidy'=>'tidy'], + 'tidy_get_html' => ['?tidyNode', 'tidy'=>'tidy'], + 'tidy_get_html_ver' => ['int', 'tidy'=>'tidy'], + 'tidy_get_opt_doc' => ['string', 'tidy'=>'tidy', 'option'=>'string'], + 'tidy_get_output' => ['string', 'tidy'=>'tidy'], + 'tidy_get_release' => ['string'], + 'tidy_get_root' => ['?tidyNode', 'tidy'=>'tidy'], + 'tidy_get_status' => ['int', 'tidy'=>'tidy'], + 'tidy_getopt' => ['mixed', 'tidy'=>'string', 'option'=>'tidy'], + 'tidy_is_xhtml' => ['bool', 'tidy'=>'tidy'], + 'tidy_is_xml' => ['bool', 'tidy'=>'tidy'], + 'tidy_load_config' => ['void', 'filename'=>'string', 'encoding'=>'string'], + 'tidy_parse_file' => ['tidy', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], + 'tidy_parse_string' => ['tidy', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], + 'tidy_repair_file' => ['string', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], + 'tidy_repair_string' => ['string', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], + 'tidy_reset_config' => ['bool'], + 'tidy_save_config' => ['bool', 'filename'=>'string'], + 'tidy_set_encoding' => ['bool', 'encoding'=>'string'], + 'tidy_setopt' => ['bool', 'option'=>'string', 'value'=>'mixed'], + 'tidy_warning_count' => ['int', 'tidy'=>'tidy'], + 'time' => ['positive-int'], + 'time_nanosleep' => ['array{0:0|positive-int,1:0|positive-int}|bool', 'seconds'=>'positive-int', 'nanoseconds'=>'positive-int'], + 'time_sleep_until' => ['bool', 'timestamp'=>'float'], + 'timezone_abbreviations_list' => ['array>|false'], + 'timezone_identifiers_list' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string'], + 'timezone_location_get' => ['array|false', 'object'=>'DateTimeZone'], + 'timezone_name_from_abbr' => ['string|false', 'abbr'=>'string', 'utcOffset='=>'int', 'isDST='=>'int'], + 'timezone_name_get' => ['string', 'object'=>'DateTimeZone'], + 'timezone_offset_get' => ['int|false', 'object'=>'DateTimeZone', 'datetime'=>'DateTimeInterface'], + 'timezone_open' => ['DateTimeZone|false', 'timezone'=>'string'], + 'timezone_transitions_get' => ['list|false', 'object'=>'DateTimeZone', 'timestampBegin='=>'int', 'timestampEnd='=>'int'], + 'timezone_version_get' => ['string'], + 'tmpfile' => ['resource|false'], + 'token_get_all' => ['list', 'code'=>'string', 'flags='=>'int'], + 'token_name' => ['string', 'id'=>'int'], + 'touch' => ['bool', 'filename'=>'string', 'mtime='=>'int', 'atime='=>'int'], + 'trader_acos' => ['array', 'real'=>'array'], + 'trader_ad' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array'], + 'trader_add' => ['array', 'real0'=>'array', 'real1'=>'array'], + 'trader_adosc' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int'], + 'trader_adx' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], + 'trader_adxr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], + 'trader_apo' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'mAType='=>'int'], + 'trader_aroon' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], + 'trader_aroonosc' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], + 'trader_asin' => ['array', 'real'=>'array'], + 'trader_atan' => ['array', 'real'=>'array'], + 'trader_atr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], + 'trader_avgprice' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_bbands' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDevUp='=>'float', 'nbDevDn='=>'float', 'mAType='=>'int'], + 'trader_beta' => ['array', 'real0'=>'array', 'real1'=>'array', 'timePeriod='=>'int'], + 'trader_bop' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cci' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], + 'trader_cdl2crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdl3blackcrows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdl3inside' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdl3linestrike' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdl3outside' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdl3starsinsouth' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdl3whitesoldiers' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlabandonedbaby' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], + 'trader_cdladvanceblock' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlbelthold' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlbreakaway' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlclosingmarubozu' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlconcealbabyswall' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlcounterattack' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdldarkcloudcover' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], + 'trader_cdldoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdldojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdldragonflydoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlengulfing' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdleveningdojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], + 'trader_cdleveningstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], + 'trader_cdlgapsidesidewhite' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlgravestonedoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlhammer' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlhangingman' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlharami' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlharamicross' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlhighwave' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlhikkake' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlhikkakemod' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlhomingpigeon' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlidentical3crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlinneck' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlinvertedhammer' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlkicking' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlkickingbylength' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlladderbottom' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdllongleggeddoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdllongline' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlmarubozu' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlmatchinglow' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlmathold' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], + 'trader_cdlmorningdojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], + 'trader_cdlmorningstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], + 'trader_cdlonneck' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlpiercing' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlrickshawman' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlrisefall3methods' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlseparatinglines' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlshootingstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlshortline' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlspinningtop' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlstalledpattern' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlsticksandwich' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdltakuri' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdltasukigap' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlthrusting' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdltristar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlunique3river' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlupsidegap2crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_cdlxsidegap3methods' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_ceil' => ['array', 'real'=>'array'], + 'trader_cmo' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_correl' => ['array', 'real0'=>'array', 'real1'=>'array', 'timePeriod='=>'int'], + 'trader_cos' => ['array', 'real'=>'array'], + 'trader_cosh' => ['array', 'real'=>'array'], + 'trader_dema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_div' => ['array', 'real0'=>'array', 'real1'=>'array'], + 'trader_dx' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], + 'trader_ema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_errno' => ['int'], + 'trader_exp' => ['array', 'real'=>'array'], + 'trader_floor' => ['array', 'real'=>'array'], + 'trader_get_compat' => ['int'], + 'trader_get_unstable_period' => ['int', 'functionId'=>'int'], + 'trader_ht_dcperiod' => ['array', 'real'=>'array'], + 'trader_ht_dcphase' => ['array', 'real'=>'array'], + 'trader_ht_phasor' => ['array', 'real'=>'array'], + 'trader_ht_sine' => ['array', 'real'=>'array'], + 'trader_ht_trendline' => ['array', 'real'=>'array'], + 'trader_ht_trendmode' => ['array', 'real'=>'array'], + 'trader_kama' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_linearreg' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_linearreg_angle' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_linearreg_intercept' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_linearreg_slope' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_ln' => ['array', 'real'=>'array'], + 'trader_log10' => ['array', 'real'=>'array'], + 'trader_ma' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'mAType='=>'int'], + 'trader_macd' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'signalPeriod='=>'int'], + 'trader_macdext' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'fastMAType='=>'int', 'slowPeriod='=>'int', 'slowMAType='=>'int', 'signalPeriod='=>'int', 'signalMAType='=>'int'], + 'trader_macdfix' => ['array', 'real'=>'array', 'signalPeriod='=>'int'], + 'trader_mama' => ['array', 'real'=>'array', 'fastLimit='=>'float', 'slowLimit='=>'float'], + 'trader_mavp' => ['array', 'real'=>'array', 'periods'=>'array', 'minPeriod='=>'int', 'maxPeriod='=>'int', 'mAType='=>'int'], + 'trader_max' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_maxindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_medprice' => ['array', 'high'=>'array', 'low'=>'array'], + 'trader_mfi' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array', 'timePeriod='=>'int'], + 'trader_midpoint' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_midprice' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], + 'trader_min' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_minindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_minmax' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_minmaxindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_minus_di' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], + 'trader_minus_dm' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], + 'trader_mom' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_mult' => ['array', 'real0'=>'array', 'real1'=>'array'], + 'trader_natr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], + 'trader_obv' => ['array', 'real'=>'array', 'volume'=>'array'], + 'trader_plus_di' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], + 'trader_plus_dm' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], + 'trader_ppo' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'mAType='=>'int'], + 'trader_roc' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_rocp' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_rocr' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_rocr100' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_rsi' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_sar' => ['array', 'high'=>'array', 'low'=>'array', 'acceleration='=>'float', 'maximum='=>'float'], + 'trader_sarext' => ['array', 'high'=>'array', 'low'=>'array', 'startValue='=>'float', 'offsetOnReverse='=>'float', 'accelerationInitLong='=>'float', 'accelerationLong='=>'float', 'accelerationMaxLong='=>'float', 'accelerationInitShort='=>'float', 'accelerationShort='=>'float', 'accelerationMaxShort='=>'float'], + 'trader_set_compat' => ['void', 'compatId'=>'int'], + 'trader_set_unstable_period' => ['void', 'functionId'=>'int', 'timePeriod'=>'int'], + 'trader_sin' => ['array', 'real'=>'array'], + 'trader_sinh' => ['array', 'real'=>'array'], + 'trader_sma' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_sqrt' => ['array', 'real'=>'array'], + 'trader_stddev' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDev='=>'float'], + 'trader_stoch' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'fastK_Period='=>'int', 'slowK_Period='=>'int', 'slowK_MAType='=>'int', 'slowD_Period='=>'int', 'slowD_MAType='=>'int'], + 'trader_stochf' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'fastK_Period='=>'int', 'fastD_Period='=>'int', 'fastD_MAType='=>'int'], + 'trader_stochrsi' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'fastK_Period='=>'int', 'fastD_Period='=>'int', 'fastD_MAType='=>'int'], + 'trader_sub' => ['array', 'real0'=>'array', 'real1'=>'array'], + 'trader_sum' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_t3' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'vFactor='=>'float'], + 'trader_tan' => ['array', 'real'=>'array'], + 'trader_tanh' => ['array', 'real'=>'array'], + 'trader_tema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_trange' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_trima' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_trix' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_tsf' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trader_typprice' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_ultosc' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod1='=>'int', 'timePeriod2='=>'int', 'timePeriod3='=>'int'], + 'trader_var' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDev='=>'float'], + 'trader_wclprice' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], + 'trader_willr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], + 'trader_wma' => ['array', 'real'=>'array', 'timePeriod='=>'int'], + 'trait_exists' => ['bool', 'trait'=>'string', 'autoload='=>'bool'], + 'transliterator_create' => ['?Transliterator', 'id'=>'string', 'direction='=>'int'], + 'transliterator_create_from_rules' => ['?Transliterator', 'rules'=>'string', 'direction='=>'int'], + 'transliterator_create_inverse' => ['?Transliterator', 'transliterator'=>'Transliterator'], + 'transliterator_get_error_code' => ['int', 'transliterator'=>'Transliterator'], + 'transliterator_get_error_message' => ['string', 'transliterator'=>'Transliterator'], + 'transliterator_list_ids' => ['array'], + 'transliterator_transliterate' => ['string|false', 'transliterator'=>'Transliterator|string', 'string'=>'string', 'start='=>'int', 'end='=>'int'], + 'trigger_error' => ['bool', 'message'=>'string', 'error_level='=>'256|512|1024|16384'], + 'trim' => ['string', 'string'=>'string', 'characters='=>'string'], + 'uasort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], + 'ucfirst' => ['string', 'string'=>'string'], + 'ucwords' => ['string', 'string'=>'string', 'separators='=>'string'], + 'udm_add_search_limit' => ['bool', 'agent'=>'resource', 'var'=>'int', 'value'=>'string'], + 'udm_alloc_agent' => ['resource', 'dbaddr'=>'string', 'dbmode='=>'string'], + 'udm_alloc_agent_array' => ['resource', 'databases'=>'array'], + 'udm_api_version' => ['int'], + 'udm_cat_list' => ['array', 'agent'=>'resource', 'category'=>'string'], + 'udm_cat_path' => ['array', 'agent'=>'resource', 'category'=>'string'], + 'udm_check_charset' => ['bool', 'agent'=>'resource', 'charset'=>'string'], + 'udm_check_stored' => ['int', 'agent'=>'', 'link'=>'int', 'doc_id'=>'string'], + 'udm_clear_search_limits' => ['bool', 'agent'=>'resource'], + 'udm_close_stored' => ['int', 'agent'=>'', 'link'=>'int'], + 'udm_crc32' => ['int', 'agent'=>'resource', 'string'=>'string'], + 'udm_errno' => ['int', 'agent'=>'resource'], + 'udm_error' => ['string', 'agent'=>'resource'], + 'udm_find' => ['resource', 'agent'=>'resource', 'query'=>'string'], + 'udm_free_agent' => ['int', 'agent'=>'resource'], + 'udm_free_ispell_data' => ['bool', 'agent'=>'int'], + 'udm_free_res' => ['bool', 'res'=>'resource'], + 'udm_get_doc_count' => ['int', 'agent'=>'resource'], + 'udm_get_res_field' => ['string', 'res'=>'resource', 'row'=>'int', 'field'=>'int'], + 'udm_get_res_param' => ['string', 'res'=>'resource', 'param'=>'int'], + 'udm_hash32' => ['int', 'agent'=>'resource', 'string'=>'string'], + 'udm_load_ispell_data' => ['bool', 'agent'=>'resource', 'var'=>'int', 'val1'=>'string', 'val2'=>'string', 'flag'=>'int'], + 'udm_open_stored' => ['int', 'agent'=>'', 'storedaddr'=>'string'], + 'udm_set_agent_param' => ['bool', 'agent'=>'resource', 'var'=>'int', 'val'=>'string'], + 'ui\area::onDraw' => ['', 'pen'=>'UI\Draw\Pen', 'areaSize'=>'UI\Size', 'clipPoint'=>'UI\Point', 'clipSize'=>'UI\Size'], + 'ui\area::onKey' => ['', 'key'=>'string', 'ext'=>'int', 'flags'=>'int'], + 'ui\area::onMouse' => ['', 'areaPoint'=>'UI\Point', 'areaSize'=>'UI\Size', 'flags'=>'int'], + 'ui\area::redraw' => [''], + 'ui\area::scrollTo' => ['', 'point'=>'UI\Point', 'size'=>'UI\Size'], + 'ui\area::setSize' => ['', 'size'=>'UI\Size'], + 'ui\control::destroy' => [''], + 'ui\control::disable' => [''], + 'ui\control::enable' => [''], + 'ui\control::getParent' => ['UI\Control'], + 'ui\control::getTopLevel' => ['int'], + 'ui\control::hide' => [''], + 'ui\control::isEnabled' => ['bool'], + 'ui\control::isVisible' => ['bool'], + 'ui\control::setParent' => ['', 'parent'=>'UI\Control'], + 'ui\control::show' => [''], + 'ui\controls\box::append' => ['int', 'control'=>'Control', 'stretchy='=>'bool'], + 'ui\controls\box::delete' => ['bool', 'index'=>'int'], + 'ui\controls\box::getOrientation' => ['int'], + 'ui\controls\box::isPadded' => ['bool'], + 'ui\controls\box::setPadded' => ['', 'padded'=>'bool'], + 'ui\controls\button::getText' => ['string'], + 'ui\controls\button::onClick' => [''], + 'ui\controls\button::setText' => ['', 'text'=>'string'], + 'ui\controls\check::getText' => ['string'], + 'ui\controls\check::isChecked' => ['bool'], + 'ui\controls\check::onToggle' => [''], + 'ui\controls\check::setChecked' => ['', 'checked'=>'bool'], + 'ui\controls\check::setText' => ['', 'text'=>'string'], + 'ui\controls\colorbutton::getColor' => ['UI\Color'], + 'ui\controls\colorbutton::onChange' => [''], + 'ui\controls\combo::append' => ['', 'text'=>'string'], + 'ui\controls\combo::getSelected' => ['int'], + 'ui\controls\combo::onSelected' => [''], + 'ui\controls\combo::setSelected' => ['', 'index'=>'int'], + 'ui\controls\editablecombo::append' => ['', 'text'=>'string'], + 'ui\controls\editablecombo::getText' => ['string'], + 'ui\controls\editablecombo::onChange' => [''], + 'ui\controls\editablecombo::setText' => ['', 'text'=>'string'], + 'ui\controls\entry::getText' => ['string'], + 'ui\controls\entry::isReadOnly' => ['bool'], + 'ui\controls\entry::onChange' => [''], + 'ui\controls\entry::setReadOnly' => ['', 'readOnly'=>'bool'], + 'ui\controls\entry::setText' => ['', 'text'=>'string'], + 'ui\controls\form::append' => ['int', 'label'=>'string', 'control'=>'UI\Control', 'stretchy='=>'bool'], + 'ui\controls\form::delete' => ['bool', 'index'=>'int'], + 'ui\controls\form::isPadded' => ['bool'], + 'ui\controls\form::setPadded' => ['', 'padded'=>'bool'], + 'ui\controls\grid::append' => ['', 'control'=>'UI\Control', 'left'=>'int', 'top'=>'int', 'xspan'=>'int', 'yspan'=>'int', 'hexpand'=>'bool', 'halign'=>'int', 'vexpand'=>'bool', 'valign'=>'int'], + 'ui\controls\grid::isPadded' => ['bool'], + 'ui\controls\grid::setPadded' => ['', 'padding'=>'bool'], + 'ui\controls\group::append' => ['', 'control'=>'UI\Control'], + 'ui\controls\group::getTitle' => ['string'], + 'ui\controls\group::hasMargin' => ['bool'], + 'ui\controls\group::setMargin' => ['', 'margin'=>'bool'], + 'ui\controls\group::setTitle' => ['', 'title'=>'string'], + 'ui\controls\label::getText' => ['string'], + 'ui\controls\label::setText' => ['', 'text'=>'string'], + 'ui\controls\multilineentry::append' => ['', 'text'=>'string'], + 'ui\controls\multilineentry::getText' => ['string'], + 'ui\controls\multilineentry::isReadOnly' => ['bool'], + 'ui\controls\multilineentry::onChange' => [''], + 'ui\controls\multilineentry::setReadOnly' => ['', 'readOnly'=>'bool'], + 'ui\controls\multilineentry::setText' => ['', 'text'=>'string'], + 'ui\controls\progress::getValue' => ['int'], + 'ui\controls\progress::setValue' => ['', 'value'=>'int'], + 'ui\controls\radio::append' => ['', 'text'=>'string'], + 'ui\controls\radio::getSelected' => ['int'], + 'ui\controls\radio::onSelected' => [''], + 'ui\controls\radio::setSelected' => ['', 'index'=>'int'], + 'ui\controls\slider::getValue' => ['int'], + 'ui\controls\slider::onChange' => [''], + 'ui\controls\slider::setValue' => ['', 'value'=>'int'], + 'ui\controls\spin::getValue' => ['int'], + 'ui\controls\spin::onChange' => [''], + 'ui\controls\spin::setValue' => ['', 'value'=>'int'], + 'ui\controls\tab::append' => ['int', 'name'=>'string', 'control'=>'UI\Control'], + 'ui\controls\tab::delete' => ['bool', 'index'=>'int'], + 'ui\controls\tab::hasMargin' => ['bool', 'page'=>'int'], + 'ui\controls\tab::insertAt' => ['', 'name'=>'string', 'page'=>'int', 'control'=>'UI\Control'], + 'ui\controls\tab::pages' => ['int'], + 'ui\controls\tab::setMargin' => ['', 'page'=>'int', 'margin'=>'bool'], + 'ui\draw\brush::getColor' => ['UI\Draw\Color'], + 'ui\draw\brush\gradient::delStop' => ['int', 'index'=>'int'], + 'ui\draw\color::getChannel' => ['float', 'channel'=>'int'], + 'ui\draw\color::setChannel' => ['void', 'channel'=>'int', 'value'=>'float'], + 'ui\draw\matrix::invert' => [''], + 'ui\draw\matrix::isInvertible' => ['bool'], + 'ui\draw\matrix::multiply' => ['UI\Draw\Matrix', 'matrix'=>'UI\Draw\Matrix'], + 'ui\draw\matrix::rotate' => ['', 'point'=>'UI\Point', 'amount'=>'float'], + 'ui\draw\matrix::scale' => ['', 'center'=>'UI\Point', 'point'=>'UI\Point'], + 'ui\draw\matrix::skew' => ['', 'point'=>'UI\Point', 'amount'=>'UI\Point'], + 'ui\draw\matrix::translate' => ['', 'point'=>'UI\Point'], + 'ui\draw\path::addRectangle' => ['', 'point'=>'UI\Point', 'size'=>'UI\Size'], + 'ui\draw\path::arcTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], + 'ui\draw\path::bezierTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], + 'ui\draw\path::closeFigure' => [''], + 'ui\draw\path::end' => [''], + 'ui\draw\path::lineTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], + 'ui\draw\path::newFigure' => ['', 'point'=>'UI\Point'], + 'ui\draw\path::newFigureWithArc' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], + 'ui\draw\pen::clip' => ['', 'path'=>'UI\Draw\Path'], + 'ui\draw\pen::restore' => [''], + 'ui\draw\pen::save' => [''], + 'ui\draw\pen::transform' => ['', 'matrix'=>'UI\Draw\Matrix'], + 'ui\draw\pen::write' => ['', 'point'=>'UI\Point', 'layout'=>'UI\Draw\Text\Layout'], + 'ui\draw\stroke::getCap' => ['int'], + 'ui\draw\stroke::getJoin' => ['int'], + 'ui\draw\stroke::getMiterLimit' => ['float'], + 'ui\draw\stroke::getThickness' => ['float'], + 'ui\draw\stroke::setCap' => ['', 'cap'=>'int'], + 'ui\draw\stroke::setJoin' => ['', 'join'=>'int'], + 'ui\draw\stroke::setMiterLimit' => ['', 'limit'=>'float'], + 'ui\draw\stroke::setThickness' => ['', 'thickness'=>'float'], + 'ui\draw\text\font::getAscent' => ['float'], + 'ui\draw\text\font::getDescent' => ['float'], + 'ui\draw\text\font::getLeading' => ['float'], + 'ui\draw\text\font::getUnderlinePosition' => ['float'], + 'ui\draw\text\font::getUnderlineThickness' => ['float'], + 'ui\draw\text\font\descriptor::getFamily' => ['string'], + 'ui\draw\text\font\descriptor::getItalic' => ['int'], + 'ui\draw\text\font\descriptor::getSize' => ['float'], + 'ui\draw\text\font\descriptor::getStretch' => ['int'], + 'ui\draw\text\font\descriptor::getWeight' => ['int'], + 'ui\draw\text\font\fontfamilies' => ['array'], + 'ui\draw\text\layout::setWidth' => ['', 'width'=>'float'], + 'ui\executor::kill' => ['void'], + 'ui\executor::onExecute' => ['void'], + 'ui\menu::append' => ['UI\MenuItem', 'name'=>'string', 'type='=>'string'], + 'ui\menu::appendAbout' => ['UI\MenuItem', 'type='=>'string'], + 'ui\menu::appendCheck' => ['UI\MenuItem', 'name'=>'string', 'type='=>'string'], + 'ui\menu::appendPreferences' => ['UI\MenuItem', 'type='=>'string'], + 'ui\menu::appendQuit' => ['UI\MenuItem', 'type='=>'string'], + 'ui\menu::appendSeparator' => [''], + 'ui\menuitem::disable' => [''], + 'ui\menuitem::enable' => [''], + 'ui\menuitem::isChecked' => ['bool'], + 'ui\menuitem::onClick' => [''], + 'ui\menuitem::setChecked' => ['', 'checked'=>'bool'], + 'ui\point::getX' => ['float'], + 'ui\point::getY' => ['float'], + 'ui\point::setX' => ['', 'point'=>'float'], + 'ui\point::setY' => ['', 'point'=>'float'], + 'ui\quit' => ['void'], + 'ui\run' => ['void', 'flags='=>'int'], + 'ui\size::getHeight' => ['float'], + 'ui\size::getWidth' => ['float'], + 'ui\size::setHeight' => ['', 'size'=>'float'], + 'ui\size::setWidth' => ['', 'size'=>'float'], + 'ui\window::add' => ['', 'control'=>'UI\Control'], + 'ui\window::error' => ['', 'title'=>'string', 'msg'=>'string'], + 'ui\window::getSize' => ['UI\Size'], + 'ui\window::getTitle' => ['string'], + 'ui\window::hasBorders' => ['bool'], + 'ui\window::hasMargin' => ['bool'], + 'ui\window::isFullScreen' => ['bool'], + 'ui\window::msg' => ['', 'title'=>'string', 'msg'=>'string'], + 'ui\window::onClosing' => ['int'], + 'ui\window::open' => ['string'], + 'ui\window::save' => ['string'], + 'ui\window::setBorders' => ['', 'borders'=>'bool'], + 'ui\window::setFullScreen' => ['', 'full'=>'bool'], + 'ui\window::setMargin' => ['', 'margin'=>'bool'], + 'ui\window::setSize' => ['', 'size'=>'UI\Size'], + 'ui\window::setTitle' => ['', 'title'=>'string'], + 'uksort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], + 'umask' => ['int', 'mask='=>'int'], + 'uniqid' => ['non-empty-string', 'prefix='=>'string', 'more_entropy='=>'bool'], + 'unixtojd' => ['int', 'timestamp='=>'int'], + 'unlink' => ['bool', 'filename'=>'string', 'context='=>'resource'], + 'unpack' => ['array', 'format'=>'string', 'string'=>'string'], + 'unregister_tick_function' => ['void', 'callback'=>'callable'], + 'unserialize' => ['mixed', 'data'=>'string', 'options='=>'array{allowed_classes?:string[]|bool}'], + 'unset' => ['void', 'var='=>'mixed', '...args='=>'mixed'], + 'untaint' => ['bool', '&rw_string'=>'string', '&...rw_strings='=>'string'], + 'uopz_allow_exit' => ['void', 'allow'=>'bool'], + 'uopz_backup' => ['void', 'class'=>'string', 'function'=>'string'], + 'uopz_backup\'1' => ['void', 'function'=>'string'], + 'uopz_compose' => ['void', 'name'=>'string', 'classes'=>'array', 'methods='=>'array', 'properties='=>'array', 'flags='=>'int'], + 'uopz_copy' => ['Closure', 'class'=>'string', 'function'=>'string'], + 'uopz_copy\'1' => ['Closure', 'function'=>'string'], + 'uopz_delete' => ['void', 'class'=>'string', 'function'=>'string'], + 'uopz_delete\'1' => ['void', 'function'=>'string'], + 'uopz_extend' => ['bool', 'class'=>'string', 'parent'=>'string'], + 'uopz_flags' => ['int', 'class'=>'string', 'function'=>'string', 'flags'=>'int'], + 'uopz_flags\'1' => ['int', 'function'=>'string', 'flags'=>'int'], + 'uopz_function' => ['void', 'class'=>'string', 'function'=>'string', 'handler'=>'Closure', 'modifiers='=>'int'], + 'uopz_function\'1' => ['void', 'function'=>'string', 'handler'=>'Closure', 'modifiers='=>'int'], + 'uopz_get_exit_status' => ['?int'], + 'uopz_get_hook' => ['?Closure', 'class'=>'string', 'function'=>'string'], + '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_static' => ['?array', 'class'=>'string', 'function'=>'string'], + 'uopz_implement' => ['bool', 'class'=>'string', 'interface'=>'string'], + 'uopz_overload' => ['void', 'opcode'=>'int', 'callable'=>'Callable'], + 'uopz_redefine' => ['bool', 'class'=>'string', 'constant'=>'string', 'value'=>'mixed'], + 'uopz_redefine\'1' => ['bool', 'constant'=>'string', 'value'=>'mixed'], + 'uopz_rename' => ['void', 'class'=>'string', 'function'=>'string', 'rename'=>'string'], + 'uopz_rename\'1' => ['void', 'function'=>'string', 'rename'=>'string'], + 'uopz_restore' => ['void', 'class'=>'string', 'function'=>'string'], + 'uopz_restore\'1' => ['void', 'function'=>'string'], + 'uopz_set_hook' => ['bool', 'class'=>'string', 'function'=>'string', 'hook'=>'Closure'], + 'uopz_set_hook\'1' => ['bool', 'function'=>'string', 'hook'=>'Closure'], + 'uopz_set_mock' => ['void', 'class'=>'string', 'mock'=>'object|string'], + 'uopz_set_property' => ['void', 'class'=>'object|string', 'property'=>'string', 'value'=>'mixed'], + 'uopz_set_return' => ['bool', 'class'=>'string', 'function'=>'string', 'value'=>'mixed', 'execute='=>'bool'], + 'uopz_set_return\'1' => ['bool', 'function'=>'string', 'value'=>'mixed', 'execute='=>'bool'], + 'uopz_set_static' => ['void', 'class'=>'string', 'function'=>'string', 'static'=>'array'], + 'uopz_undefine' => ['bool', 'class'=>'string', 'constant'=>'string'], + 'uopz_undefine\'1' => ['bool', 'constant'=>'string'], + '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\'1' => ['bool', 'function'=>'string'], + 'urldecode' => ['string', 'string'=>'string'], + 'urlencode' => ['string', 'string'=>'string'], + 'use_soap_error_handler' => ['bool', 'enable='=>'bool'], + 'user_error' => ['void', 'message'=>'string', 'error_level='=>'int'], + 'usleep' => ['void', 'microseconds'=>'positive-int|0'], + 'usort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], + 'utf8_decode' => ['string', 'string'=>'string'], + 'utf8_encode' => ['string', 'string'=>'string'], + 'var_dump' => ['void', 'value'=>'mixed', '...values='=>'mixed'], + 'var_export' => ['?string', 'value'=>'mixed', 'return='=>'bool'], + 'variant_abs' => ['mixed', 'value'=>'mixed'], + 'variant_add' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_and' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_cast' => ['VARIANT', 'variant'=>'VARIANT', 'type'=>'int'], + 'variant_cat' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_cmp' => ['int', 'left'=>'mixed', 'right'=>'mixed', 'locale_id='=>'int', 'flags='=>'int'], + 'variant_date_from_timestamp' => ['VARIANT', 'timestamp'=>'int'], + 'variant_date_to_timestamp' => ['int', 'variant'=>'VARIANT'], + 'variant_div' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_eqv' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_fix' => ['mixed', 'value'=>'mixed'], + 'variant_get_type' => ['int', 'variant'=>'VARIANT'], + 'variant_idiv' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_imp' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_int' => ['mixed', 'value'=>'mixed'], + 'variant_mod' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_mul' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_neg' => ['mixed', 'value'=>'mixed'], + 'variant_not' => ['mixed', 'value'=>'mixed'], + 'variant_or' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_pow' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_round' => ['mixed', 'value'=>'mixed', 'decimals'=>'int'], + 'variant_set' => ['void', 'variant'=>'object', 'value'=>'mixed'], + 'variant_set_type' => ['void', 'variant'=>'object', 'type'=>'int'], + 'variant_sub' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'variant_xor' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], + 'version_compare' => ['bool', 'version1'=>'string', 'version2'=>'string', 'operator'=>'\'<\'|\'lt\'|\'<=\'|\'le\'|\'>\'|\'gt\'|\'>=\'|\'ge\'|\'==\'|\'=\'|\'eq\'|\'!=\'|\'<>\'|\'ne\''], + 'version_compare\'1' => ['int', 'version1'=>'string', 'version2'=>'string'], + 'vfprintf' => ['int', 'stream'=>'resource', 'format'=>'string', 'values'=>'array'], + 'virtual' => ['bool', 'uri'=>'string'], + 'vpopmail_add_alias_domain' => ['bool', 'domain'=>'string', 'aliasdomain'=>'string'], + 'vpopmail_add_alias_domain_ex' => ['bool', 'olddomain'=>'string', 'newdomain'=>'string'], + 'vpopmail_add_domain' => ['bool', 'domain'=>'string', 'dir'=>'string', 'uid'=>'int', 'gid'=>'int'], + 'vpopmail_add_domain_ex' => ['bool', 'domain'=>'string', 'passwd'=>'string', 'quota='=>'string', 'bounce='=>'string', 'apop='=>'bool'], + 'vpopmail_add_user' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'gecos='=>'string', 'apop='=>'bool'], + 'vpopmail_alias_add' => ['bool', 'user'=>'string', 'domain'=>'string', 'alias'=>'string'], + 'vpopmail_alias_del' => ['bool', 'user'=>'string', 'domain'=>'string'], + 'vpopmail_alias_del_domain' => ['bool', 'domain'=>'string'], + 'vpopmail_alias_get' => ['array', 'alias'=>'string', 'domain'=>'string'], + 'vpopmail_alias_get_all' => ['array', 'domain'=>'string'], + 'vpopmail_auth_user' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'apop='=>'string'], + 'vpopmail_del_domain' => ['bool', 'domain'=>'string'], + 'vpopmail_del_domain_ex' => ['bool', 'domain'=>'string'], + 'vpopmail_del_user' => ['bool', 'user'=>'string', 'domain'=>'string'], + 'vpopmail_error' => ['string'], + 'vpopmail_passwd' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'apop='=>'bool'], + 'vpopmail_set_user_quota' => ['bool', 'user'=>'string', 'domain'=>'string', 'quota'=>'string'], + 'vprintf' => ['int', 'format'=>'string', 'values'=>'array'], + 'vsprintf' => ['string', 'format'=>'string', 'values'=>'array'], + 'w32api_deftype' => ['bool', 'typename'=>'string', 'member1_type'=>'string', 'member1_name'=>'string', '...args='=>'string'], + 'w32api_init_dtype' => ['resource', 'typename'=>'string', 'value'=>'', '...args='=>''], + 'w32api_invoke_function' => ['', 'funcname'=>'string', 'argument'=>'', '...args='=>''], + 'w32api_register_function' => ['bool', 'library'=>'string', 'function_name'=>'string', 'return_type'=>'string'], + 'w32api_set_call_method' => ['', 'method'=>'int'], + 'wddx_add_vars' => ['bool', 'packet_id'=>'resource', 'var_names'=>'mixed', '...vars='=>'mixed'], + 'wddx_deserialize' => ['mixed', 'packet'=>'string'], + 'wddx_packet_end' => ['string', 'packet_id'=>'resource'], + 'wddx_packet_start' => ['resource|false', 'comment='=>'string'], + 'wddx_serialize_value' => ['string|false', 'value'=>'mixed', 'comment='=>'string'], + 'wddx_serialize_vars' => ['string|false', 'var_name'=>'mixed', '...vars='=>'mixed'], + 'webObj::convertToString' => ['string'], + 'webObj::free' => ['void'], + 'webObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], + 'webObj::updateFromString' => ['int', 'snippet'=>'string'], + 'win32_continue_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], + 'win32_create_service' => ['int|false', 'details'=>'array', 'machine='=>'string'], + 'win32_delete_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], + 'win32_get_last_control_message' => ['int'], + 'win32_pause_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], + 'win32_ps_list_procs' => ['array'], + 'win32_ps_stat_mem' => ['array'], + 'win32_ps_stat_proc' => ['array', 'pid='=>'int'], + 'win32_query_service_status' => ['array|false|int', 'servicename'=>'string', 'machine='=>'string'], + 'win32_send_custom_control' => ['int', 'servicename'=>'string', 'control'=>'int', 'machine='=>'string'], + 'win32_set_service_exit_code' => ['int', 'exitCode='=>'int'], + 'win32_set_service_exit_mode' => ['bool', 'gracefulMode='=>'bool'], + 'win32_set_service_status' => ['bool|int', 'status'=>'int', 'checkpoint='=>'int'], + 'win32_start_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], + 'win32_start_service_ctrl_dispatcher' => ['bool|int', 'name'=>'string'], + 'win32_stop_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], + 'wincache_fcache_fileinfo' => ['array|false', 'summaryonly='=>'bool'], + 'wincache_fcache_meminfo' => ['array|false'], + 'wincache_lock' => ['bool', 'key'=>'string', 'isglobal='=>'bool'], + 'wincache_ocache_fileinfo' => ['array|false', 'summaryonly='=>'bool'], + 'wincache_ocache_meminfo' => ['array|false'], + 'wincache_refresh_if_changed' => ['bool', 'files='=>'array'], + 'wincache_rplist_fileinfo' => ['array|false', 'summaryonly='=>'bool'], + 'wincache_rplist_meminfo' => ['array|false'], + 'wincache_scache_info' => ['array|false', 'summaryonly='=>'bool'], + 'wincache_scache_meminfo' => ['array|false'], + 'wincache_ucache_add' => ['bool', 'key'=>'string', 'value'=>'mixed', 'ttl='=>'int'], + 'wincache_ucache_add\'1' => ['bool', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], + 'wincache_ucache_cas' => ['bool', 'key'=>'string', 'old_value'=>'int', 'new_value'=>'int'], + 'wincache_ucache_clear' => ['bool'], + 'wincache_ucache_dec' => ['int|false', 'key'=>'string', 'dec_by='=>'int', 'success='=>'bool'], + 'wincache_ucache_delete' => ['bool', 'key'=>'mixed'], + 'wincache_ucache_exists' => ['bool', 'key'=>'string'], + 'wincache_ucache_get' => ['mixed', 'key'=>'mixed', '&w_success='=>'bool'], + 'wincache_ucache_inc' => ['int|false', 'key'=>'string', 'inc_by='=>'int', 'success='=>'bool'], + 'wincache_ucache_info' => ['array|false', 'summaryonly='=>'bool', 'key='=>'string'], + 'wincache_ucache_meminfo' => ['array|false'], + 'wincache_ucache_set' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int'], + 'wincache_ucache_set\'1' => ['bool', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], + 'wincache_unlock' => ['bool', 'key'=>'string'], + 'wkhtmltox\image\converter::convert' => ['?string'], + 'wkhtmltox\image\converter::getVersion' => ['string'], + 'wkhtmltox\pdf\converter::add' => ['void', 'object'=>'wkhtmltox\PDF\Object'], + 'wkhtmltox\pdf\converter::convert' => ['?string'], + 'wkhtmltox\pdf\converter::getVersion' => ['string'], + 'wordwrap' => ['string', 'string'=>'string', 'width='=>'int', 'break='=>'string', 'cut_long_words='=>'bool'], + 'xattr_get' => ['string', 'filename'=>'string', 'name'=>'string', 'flags='=>'int'], + 'xattr_list' => ['array', 'filename'=>'string', 'flags='=>'int'], + 'xattr_remove' => ['bool', 'filename'=>'string', 'name'=>'string', 'flags='=>'int'], + 'xattr_set' => ['bool', 'filename'=>'string', 'name'=>'string', 'value'=>'string', 'flags='=>'int'], + 'xattr_supported' => ['bool', 'filename'=>'string', 'flags='=>'int'], + 'xcache_asm' => ['string', 'filename'=>'string'], + 'xcache_clear_cache' => ['void', 'type'=>'int', 'id='=>'int'], + 'xcache_coredump' => ['string', 'op_type'=>'int'], + 'xcache_count' => ['int', 'type'=>'int'], + 'xcache_coverager_decode' => ['array', 'data'=>'string'], + 'xcache_coverager_get' => ['array', 'clean='=>'bool'], + 'xcache_coverager_start' => ['void', 'clean='=>'bool'], + 'xcache_coverager_stop' => ['void', 'clean='=>'bool'], + 'xcache_dasm_file' => ['string', 'filename'=>'string'], + 'xcache_dasm_string' => ['string', 'code'=>'string'], + 'xcache_dec' => ['int', 'name'=>'string', 'value='=>'int|mixed', 'ttl='=>'int'], + 'xcache_decode' => ['bool', 'filename'=>'string'], + 'xcache_encode' => ['string', 'filename'=>'string'], + 'xcache_get' => ['mixed', 'name'=>'string'], + 'xcache_get_data_type' => ['string', 'type'=>'int'], + 'xcache_get_op_spec' => ['string', 'op_type'=>'int'], + 'xcache_get_op_type' => ['string', 'op_type'=>'int'], + 'xcache_get_opcode' => ['string', 'opcode'=>'int'], + 'xcache_get_opcode_spec' => ['string', 'opcode'=>'int'], + 'xcache_inc' => ['int', 'name'=>'string', 'value='=>'int|mixed', 'ttl='=>'int'], + 'xcache_info' => ['array', 'type'=>'int', 'id'=>'int'], + 'xcache_is_autoglobal' => ['string', 'name'=>'string'], + 'xcache_isset' => ['bool', 'name'=>'string'], + 'xcache_list' => ['array', 'type'=>'int', 'id'=>'int'], + 'xcache_set' => ['bool', 'name'=>'string', 'value'=>'mixed', 'ttl='=>'int'], + 'xcache_unset' => ['bool', 'name'=>'string'], + 'xcache_unset_by_prefix' => ['bool', 'prefix'=>'string'], + 'xdebug_break' => ['bool'], + 'xdebug_call_class' => ['string', 'depth='=>'int'], + 'xdebug_call_file' => ['string', 'depth='=>'int'], + 'xdebug_call_function' => ['string', 'depth='=>'int'], + 'xdebug_call_line' => ['int', 'depth='=>'int'], + 'xdebug_clear_aggr_profiling_data' => ['bool'], + 'xdebug_code_coverage_started' => ['bool'], + 'xdebug_debug_zval' => ['void', '...varName'=>'string'], + 'xdebug_debug_zval_stdout' => ['void', '...varName'=>'string'], + 'xdebug_disable' => ['void'], + 'xdebug_dump_aggr_profiling_data' => ['bool'], + 'xdebug_dump_superglobals' => ['void'], + 'xdebug_enable' => ['void'], + 'xdebug_get_code_coverage' => ['array'], + 'xdebug_get_collected_errors' => ['string', 'clean='=>'bool'], + 'xdebug_get_declared_vars' => ['array'], + 'xdebug_get_formatted_function_stack' => [''], + 'xdebug_get_function_count' => ['int'], + 'xdebug_get_function_stack' => ['array', 'message='=>'string', 'options='=>'int'], + 'xdebug_get_headers' => ['array'], + 'xdebug_get_monitored_functions' => ['array'], + 'xdebug_get_profiler_filename' => ['string|false'], + 'xdebug_get_stack_depth' => ['int'], + 'xdebug_get_tracefile_name' => ['string'], + 'xdebug_is_debugger_active' => ['bool'], + 'xdebug_is_enabled' => ['bool'], + 'xdebug_memory_usage' => ['int'], + 'xdebug_peak_memory_usage' => ['int'], + 'xdebug_print_function_stack' => ['array', 'message='=>'string', 'options='=>'int'], + 'xdebug_set_filter' => ['void', 'group'=>'int', 'list_type'=>'int', 'configuration'=>'array'], + 'xdebug_start_code_coverage' => ['void', 'options='=>'int'], + 'xdebug_start_error_collection' => ['void'], + 'xdebug_start_function_monitor' => ['void', 'list_of_functions_to_monitor'=>'string[]'], + 'xdebug_start_trace' => ['void', 'trace_file'=>'', 'options='=>'int|mixed'], + 'xdebug_stop_code_coverage' => ['void', 'cleanup='=>'bool'], + 'xdebug_stop_error_collection' => ['void'], + 'xdebug_stop_function_monitor' => ['void'], + 'xdebug_stop_trace' => ['void'], + 'xdebug_time_index' => ['float'], + 'xdebug_var_dump' => ['void', '...var'=>''], + 'xdiff_file_bdiff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], + 'xdiff_file_bdiff_size' => ['int', 'file'=>'string'], + 'xdiff_file_bpatch' => ['bool', 'file'=>'string', 'patch'=>'string', 'dest'=>'string'], + 'xdiff_file_diff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string', 'context='=>'int', 'minimal='=>'bool'], + 'xdiff_file_diff_binary' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], + 'xdiff_file_merge3' => ['mixed', 'old_file'=>'string', 'new_file1'=>'string', 'new_file2'=>'string', 'dest'=>'string'], + 'xdiff_file_patch' => ['mixed', 'file'=>'string', 'patch'=>'string', 'dest'=>'string', 'flags='=>'int'], + 'xdiff_file_patch_binary' => ['bool', 'file'=>'string', 'patch'=>'string', 'dest'=>'string'], + 'xdiff_file_rabdiff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], + 'xdiff_string_bdiff' => ['string', 'old_data'=>'string', 'new_data'=>'string'], + 'xdiff_string_bdiff_size' => ['int', 'patch'=>'string'], + 'xdiff_string_bpatch' => ['string', 'string'=>'string', 'patch'=>'string'], + 'xdiff_string_diff' => ['string', 'old_data'=>'string', 'new_data'=>'string', 'context='=>'int', 'minimal='=>'bool'], + 'xdiff_string_diff_binary' => ['string', 'old_data'=>'string', 'new_data'=>'string'], + 'xdiff_string_merge3' => ['mixed', 'old_data'=>'string', 'new_data1'=>'string', 'new_data2'=>'string', 'error='=>'string'], + 'xdiff_string_patch' => ['string', 'string'=>'string', 'patch'=>'string', 'flags='=>'int', '&w_error='=>'string'], + 'xdiff_string_patch_binary' => ['string', 'string'=>'string', 'patch'=>'string'], + 'xdiff_string_rabdiff' => ['string', 'old_data'=>'string', 'new_data'=>'string'], + 'xhprof_disable' => ['array'], + 'xhprof_enable' => ['void', 'flags='=>'int', 'options='=>'array'], + 'xhprof_sample_disable' => ['array'], + 'xhprof_sample_enable' => ['void'], + 'xlswriter_get_author' => ['string'], + 'xlswriter_get_version' => ['string'], + 'xml_error_string' => ['?string', 'error_code'=>'int'], + 'xml_get_current_byte_index' => ['int|false', 'parser'=>'resource'], + 'xml_get_current_column_number' => ['int|false', 'parser'=>'resource'], + 'xml_get_current_line_number' => ['int|false', 'parser'=>'resource'], + 'xml_get_error_code' => ['int|false', 'parser'=>'resource'], + 'xml_parse' => ['int', 'parser'=>'resource', 'data'=>'string', 'is_final='=>'bool'], + 'xml_parse_into_struct' => ['int', 'parser'=>'resource', 'data'=>'string', '&w_values'=>'array', '&w_index='=>'array'], + 'xml_parser_create' => ['resource', 'encoding='=>'string'], + 'xml_parser_create_ns' => ['resource', 'encoding='=>'string', 'separator='=>'string'], + 'xml_parser_free' => ['bool', 'parser'=>'resource'], + 'xml_parser_get_option' => ['mixed|false', 'parser'=>'resource', 'option'=>'int'], + 'xml_parser_set_option' => ['bool', 'parser'=>'resource', 'option'=>'int', 'value'=>'mixed'], + 'xml_set_character_data_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'xml_set_default_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'xml_set_element_handler' => ['bool', 'parser'=>'resource', 'start_handler'=>'callable', 'end_handler'=>'callable'], + 'xml_set_end_namespace_decl_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'xml_set_external_entity_ref_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'xml_set_notation_decl_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'xml_set_object' => ['bool', 'parser'=>'resource', 'object'=>'object'], + 'xml_set_processing_instruction_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'xml_set_start_namespace_decl_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'xml_set_unparsed_entity_decl_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], + 'xmlrpc_decode' => ['mixed', 'xml'=>'string', 'encoding='=>'string'], + 'xmlrpc_decode_request' => ['?array', 'xml'=>'string', '&w_method'=>'string', 'encoding='=>'string'], + 'xmlrpc_encode' => ['string', 'value'=>'mixed'], + 'xmlrpc_encode_request' => ['string', 'method'=>'string', 'params'=>'mixed', 'output_options='=>'array'], + 'xmlrpc_get_type' => ['string', 'value'=>'mixed'], + 'xmlrpc_is_fault' => ['bool', 'arg'=>'array'], + 'xmlrpc_parse_method_descriptions' => ['array', 'xml'=>'string'], + 'xmlrpc_server_add_introspection_data' => ['int', 'server'=>'resource', 'desc'=>'array'], + 'xmlrpc_server_call_method' => ['string', 'server'=>'resource', 'xml'=>'string', 'user_data'=>'mixed', 'output_options='=>'array'], + 'xmlrpc_server_create' => ['resource'], + 'xmlrpc_server_destroy' => ['int', 'server'=>'resource'], + 'xmlrpc_server_register_introspection_callback' => ['bool', 'server'=>'resource', 'function'=>'string'], + 'xmlrpc_server_register_method' => ['bool', 'server'=>'resource', 'method_name'=>'string', 'function'=>'string'], + 'xmlrpc_set_type' => ['bool', '&rw_value'=>'string|DateTime', 'type'=>'string'], + 'xmlwriter_end_attribute' => ['bool', 'writer'=>'resource'], + 'xmlwriter_end_cdata' => ['bool', 'writer'=>'resource'], + 'xmlwriter_end_comment' => ['bool', 'writer'=>'resource'], + 'xmlwriter_end_document' => ['bool', 'writer'=>'resource'], + 'xmlwriter_end_dtd' => ['bool', 'writer'=>'resource'], + 'xmlwriter_end_dtd_attlist' => ['bool', 'writer'=>'resource'], + 'xmlwriter_end_dtd_element' => ['bool', 'writer'=>'resource'], + 'xmlwriter_end_dtd_entity' => ['bool', 'writer'=>'resource'], + 'xmlwriter_end_element' => ['bool', 'writer'=>'resource'], + 'xmlwriter_end_pi' => ['bool', 'writer'=>'resource'], + 'xmlwriter_flush' => ['string|int|false', 'writer'=>'resource', 'empty='=>'bool'], + 'xmlwriter_full_end_element' => ['bool', 'writer'=>'resource'], + 'xmlwriter_open_memory' => ['resource|false'], + 'xmlwriter_open_uri' => ['resource|false', 'uri'=>'string'], + 'xmlwriter_output_memory' => ['string', 'writer'=>'resource', 'flush='=>'bool'], + 'xmlwriter_set_indent' => ['bool', 'writer'=>'resource', 'enable'=>'bool'], + 'xmlwriter_set_indent_string' => ['bool', 'writer'=>'resource', 'indentation'=>'string'], + 'xmlwriter_start_attribute' => ['bool', 'writer'=>'resource', 'name'=>'string'], + 'xmlwriter_start_attribute_ns' => ['bool', 'writer'=>'resource', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string'], + 'xmlwriter_start_cdata' => ['bool', 'writer'=>'resource'], + 'xmlwriter_start_comment' => ['bool', 'writer'=>'resource'], + 'xmlwriter_start_document' => ['bool', 'writer'=>'resource', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], + 'xmlwriter_start_dtd' => ['bool', 'writer'=>'resource', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], + 'xmlwriter_start_dtd_attlist' => ['bool', 'writer'=>'resource', 'name'=>'string'], + 'xmlwriter_start_dtd_element' => ['bool', 'writer'=>'resource', 'qualifiedName'=>'string'], + 'xmlwriter_start_dtd_entity' => ['bool', 'writer'=>'resource', 'name'=>'string', 'isParam'=>'bool'], + 'xmlwriter_start_element' => ['bool', 'writer'=>'resource', 'name'=>'string'], + 'xmlwriter_start_element_ns' => ['bool', 'writer'=>'resource', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], + 'xmlwriter_start_pi' => ['bool', 'writer'=>'resource', 'target'=>'string'], + 'xmlwriter_text' => ['bool', 'writer'=>'resource', 'content'=>'string'], + 'xmlwriter_write_attribute' => ['bool', 'writer'=>'resource', 'name'=>'string', 'value'=>'string'], + 'xmlwriter_write_attribute_ns' => ['bool', 'writer'=>'resource', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], + 'xmlwriter_write_cdata' => ['bool', 'writer'=>'resource', 'content'=>'string'], + 'xmlwriter_write_comment' => ['bool', 'writer'=>'resource', 'content'=>'string'], + 'xmlwriter_write_dtd' => ['bool', 'writer'=>'resource', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], + 'xmlwriter_write_dtd_attlist' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string'], + 'xmlwriter_write_dtd_element' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string'], + 'xmlwriter_write_dtd_entity' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string', 'isParam'=>'bool', 'publicId'=>'string', 'systemId'=>'string', 'notationData'=>'string'], + 'xmlwriter_write_element' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'?string'], + 'xmlwriter_write_element_ns' => ['bool', 'writer'=>'resource', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'string', 'content'=>'?string'], + 'xmlwriter_write_pi' => ['bool', 'writer'=>'resource', 'target'=>'string', 'content'=>'string'], + 'xmlwriter_write_raw' => ['bool', 'writer'=>'resource', 'content'=>'string'], + 'xpath_new_context' => ['XPathContext', 'dom_document'=>'DOMDocument'], + 'xpath_register_ns' => ['bool', 'xpath_context'=>'xpathcontext', 'prefix'=>'string', 'uri'=>'string'], + 'xpath_register_ns_auto' => ['bool', 'xpath_context'=>'xpathcontext', 'context_node='=>'object'], + 'xptr_new_context' => ['XPathContext'], + 'xsl_xsltprocessor_get_parameter' => ['string', 'namespace'=>'string', 'name'=>'string'], + 'xsl_xsltprocessor_get_security_prefs' => ['int'], + 'xsl_xsltprocessor_has_exslt_support' => ['bool'], + 'xsl_xsltprocessor_register_php_functions' => ['', 'restrict'=>''], + 'xsl_xsltprocessor_remove_parameter' => ['bool', 'namespace'=>'string', 'name'=>'string'], + 'xsl_xsltprocessor_set_parameter' => ['bool', 'namespace'=>'string', 'name'=>'', 'value'=>'string'], + 'xsl_xsltprocessor_set_profiling' => ['bool', 'filename'=>'string'], + 'xsl_xsltprocessor_set_security_prefs' => ['int', 'securityprefs'=>'int'], + 'xsl_xsltprocessor_transform_to_uri' => ['int', 'doc'=>'DOMDocument', 'uri'=>'string'], + 'xsl_xsltprocessor_transform_to_xml' => ['string', 'doc'=>'DOMDocument'], + 'xslt_backend_info' => ['string'], + 'xslt_backend_name' => ['string'], + 'xslt_backend_version' => ['string'], + 'xslt_create' => ['resource'], + 'xslt_errno' => ['int', 'xh'=>''], + 'xslt_error' => ['string', 'xh'=>''], + 'xslt_free' => ['', 'xh'=>''], + 'xslt_getopt' => ['int', 'processor'=>''], + 'xslt_process' => ['', 'xh'=>'', 'xmlcontainer'=>'string', 'xslcontainer'=>'string', 'resultcontainer='=>'string', 'arguments='=>'array', 'parameters='=>'array'], + 'xslt_set_base' => ['', 'xh'=>'', 'uri'=>'string'], + 'xslt_set_encoding' => ['', 'xh'=>'', 'encoding'=>'string'], + 'xslt_set_error_handler' => ['', 'xh'=>'', 'handler'=>''], + 'xslt_set_log' => ['', 'xh'=>'', 'log='=>''], + 'xslt_set_object' => ['bool', 'processor'=>'', 'object'=>'object'], + 'xslt_set_sax_handler' => ['', 'xh'=>'', 'handlers'=>'array'], + 'xslt_set_sax_handlers' => ['', 'processor'=>'', 'handlers'=>'array'], + 'xslt_set_scheme_handler' => ['', 'xh'=>'', 'handlers'=>'array'], + 'xslt_set_scheme_handlers' => ['', 'xh'=>'', 'handlers'=>'array'], + 'xslt_setopt' => ['', 'processor'=>'', 'newmask'=>'int'], + 'yac::__construct' => ['void', 'prefix='=>'string'], + 'yac::__get' => ['mixed', 'key'=>'string'], + 'yac::__set' => ['mixed', 'key'=>'string', 'value'=>'mixed'], + 'yac::delete' => ['bool', 'keys'=>'string|array', 'ttl='=>'int'], + 'yac::dump' => ['mixed', 'num'=>'int'], + 'yac::flush' => ['bool'], + 'yac::get' => ['mixed', 'key'=>'string|array', 'cas='=>'int'], + 'yac::info' => ['array'], + 'yaml_emit' => ['string', 'data'=>'mixed', 'encoding='=>'int', 'linebreak='=>'int'], + 'yaml_emit_file' => ['bool', 'filename'=>'string', 'data'=>'mixed', 'encoding='=>'int', 'linebreak='=>'int'], + 'yaml_parse' => ['mixed|false', 'input'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], + 'yaml_parse_file' => ['mixed|false', 'filename'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], + 'yaml_parse_url' => ['mixed|false', 'url'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], + 'yaz_addinfo' => ['string', 'id'=>'resource'], + 'yaz_ccl_conf' => ['void', 'id'=>'resource', 'config'=>'array'], + 'yaz_ccl_parse' => ['bool', 'id'=>'resource', 'query'=>'string', '&w_result'=>'array'], + 'yaz_close' => ['bool', 'id'=>'resource'], + 'yaz_connect' => ['mixed', 'zurl'=>'string', 'options='=>'mixed'], + 'yaz_database' => ['bool', 'id'=>'resource', 'databases'=>'string'], + 'yaz_element' => ['bool', 'id'=>'resource', 'elementset'=>'string'], + 'yaz_errno' => ['int', 'id'=>'resource'], + 'yaz_error' => ['string', 'id'=>'resource'], + 'yaz_es' => ['void', 'id'=>'resource', 'type'=>'string', 'args'=>'array'], + 'yaz_es_result' => ['array', 'id'=>'resource'], + 'yaz_get_option' => ['string', 'id'=>'resource', 'name'=>'string'], + 'yaz_hits' => ['int', 'id'=>'resource', 'searchresult='=>'array'], + 'yaz_itemorder' => ['void', 'id'=>'resource', 'args'=>'array'], + 'yaz_present' => ['bool', 'id'=>'resource'], + 'yaz_range' => ['void', 'id'=>'resource', 'start'=>'int', 'number'=>'int'], + 'yaz_record' => ['string', 'id'=>'resource', 'pos'=>'int', 'type'=>'string'], + 'yaz_scan' => ['void', 'id'=>'resource', 'type'=>'string', 'startterm'=>'string', 'flags='=>'array'], + 'yaz_scan_result' => ['array', 'id'=>'resource', 'result='=>'array'], + 'yaz_schema' => ['void', 'id'=>'resource', 'schema'=>'string'], + 'yaz_search' => ['bool', 'id'=>'resource', 'type'=>'string', 'query'=>'string'], + 'yaz_set_option' => ['', 'id'=>'', 'name'=>'string', 'value'=>'string', 'options'=>'array'], + 'yaz_sort' => ['void', 'id'=>'resource', 'criteria'=>'string'], + 'yaz_syntax' => ['void', 'id'=>'resource', 'syntax'=>'string'], + 'yaz_wait' => ['mixed', '&rw_options='=>'array'], + 'yp_all' => ['void', 'domain'=>'string', 'map'=>'string', 'callback'=>'string'], + 'yp_cat' => ['array', 'domain'=>'string', 'map'=>'string'], + 'yp_err_string' => ['string', 'errorcode'=>'int'], + 'yp_errno' => ['int'], + 'yp_first' => ['array', 'domain'=>'string', 'map'=>'string'], + 'yp_get_default_domain' => ['string'], + 'yp_master' => ['string', 'domain'=>'string', 'map'=>'string'], + 'yp_match' => ['string', 'domain'=>'string', 'map'=>'string', 'key'=>'string'], + 'yp_next' => ['array', 'domain'=>'string', 'map'=>'string', 'key'=>'string'], + 'yp_order' => ['int', 'domain'=>'string', 'map'=>'string'], + 'zem_get_extension_info_by_id' => [''], + 'zem_get_extension_info_by_name' => [''], + 'zem_get_extensions_info' => [''], + 'zem_get_license_info' => [''], + 'zend_current_obfuscation_level' => ['int'], + 'zend_disk_cache_clear' => ['bool', 'namespace='=>'mixed|string'], + 'zend_disk_cache_delete' => ['mixed|null', 'key'=>'string'], + 'zend_disk_cache_fetch' => ['mixed|null', 'key'=>'string'], + 'zend_disk_cache_store' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int|mixed'], + 'zend_get_id' => ['array', 'all_ids='=>'all_ids|false'], + 'zend_is_configuration_changed' => [''], + 'zend_loader_current_file' => ['string'], + 'zend_loader_enabled' => ['bool'], + 'zend_loader_file_encoded' => ['bool'], + 'zend_loader_file_licensed' => ['array'], + 'zend_loader_install_license' => ['bool', 'license_file'=>'string', 'override'=>'bool'], + 'zend_logo_guid' => ['string'], + 'zend_obfuscate_class_name' => ['string', 'class_name'=>'string'], + 'zend_obfuscate_function_name' => ['string', 'function_name'=>'string'], + 'zend_optimizer_version' => ['string'], + 'zend_runtime_obfuscate' => ['void'], + 'zend_send_buffer' => ['null|false', 'buffer'=>'string', 'mime_type='=>'string', 'custom_headers='=>'string'], + 'zend_send_file' => ['null|false', 'filename'=>'string', 'mime_type='=>'string', 'custom_headers='=>'string'], + 'zend_set_configuration_changed' => [''], + 'zend_shm_cache_clear' => ['bool', 'namespace='=>'mixed|string'], + 'zend_shm_cache_delete' => ['mixed|null', 'key'=>'string'], + 'zend_shm_cache_fetch' => ['mixed|null', 'key'=>'string'], + 'zend_shm_cache_store' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int|mixed'], + 'zend_thread_id' => ['int'], + 'zend_version' => ['string'], + 'zip_close' => ['void', 'zip'=>'resource'], + 'zip_entry_close' => ['bool', 'zip_ent'=>'resource'], + 'zip_entry_compressedsize' => ['int', 'zip_entry'=>'resource'], + 'zip_entry_compressionmethod' => ['string', 'zip_entry'=>'resource'], + 'zip_entry_filesize' => ['int', 'zip_entry'=>'resource'], + 'zip_entry_name' => ['string', 'zip_entry'=>'resource'], + 'zip_entry_open' => ['bool', 'zip_dp'=>'resource', 'zip_entry'=>'resource', 'mode='=>'string'], + 'zip_entry_read' => ['string|false', 'zip_entry'=>'resource', 'len='=>'int'], + 'zip_open' => ['resource|int|false', 'filename'=>'string'], + 'zip_read' => ['resource', 'zip'=>'resource'], + 'zlib_decode' => ['string|false', 'data'=>'string', 'max_length='=>'int'], + 'zlib_encode' => ['string', 'data'=>'string', 'encoding'=>'int', 'level='=>'string|int'], + 'zlib_get_coding_type' => ['string|false'], + 'zookeeper_dispatch' => ['void'], +]; diff --git a/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php b/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php new file mode 100644 index 00000000..3838720a --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php @@ -0,0 +1,65 @@ +>> + */ +return [ +'exec' => [['shell']], +'create_function' => [[], ['eval']], +'file_get_contents' => [['file']], +'file_put_contents' => [['file']], +'fopen' => [['file']], +'unlink' => [['file']], +'copy' => [['file'], ['file']], +'file' => [['file']], +'link' => [['file'], ['file']], +'mkdir' => [['file']], +'move_uploaded_file' => [['file'], ['file']], +'parse_ini_file' => [['file']], +'chown' => [['file']], +'lchown' => [['file']], +'readfile' => [['file']], +'rename' => [['file'], ['file']], +'rmdir' => [['file']], +'header' => [['header']], +'symlink' => [['file']], +'tempnam' => [['file']], +'igbinary_unserialize' => [['unserialize']], +'ldap_search' => [[], ['ldap'], ['ldap']], +'mysqli_query' => [[], ['sql']], +'mysqli::query' => [['sql']], +'mysqli_real_query' => [[], ['sql']], +'mysqli::real_query' => [['sql']], +'mysqli_multi_query' => [[], ['sql']], +'mysqli::multi_query' => [['sql']], +'mysqli_prepare' => [[], ['sql']], +'mysqli::prepare' => [['sql']], +'mysqli_stmt::__construct' => [[], ['sql']], +'mysqli_stmt_prepare' => [[], ['sql']], +'mysqli_stmt::prepare' => [['sql']], +'passthru' => [['shell']], +'pcntl_exec' => [['shell']], +'PDO::prepare' => [['sql']], +'PDO::query' => [['sql']], +'PDO::exec' => [['sql']], +'pg_exec' => [[], ['sql']], +'pg_prepare' => [[], [], ['sql']], +'pg_put_line' => [[], ['sql']], +'pg_query' => [[], ['sql']], +'pg_query_params' => [[], ['sql']], +'pg_send_prepare' => [[], [], ['sql']], +'pg_send_query' => [[], ['sql']], +'pg_send_query_params' => [[], ['sql'], []], +'setcookie' => [['cookie'], ['cookie']], +'shell_exec' => [['shell']], +'system' => [['shell']], +'unserialize' => [['unserialize']], +'popen' => [['shell']], +'proc_open' => [['shell']], +'curl_init' => [['ssrf']], +'curl_setopt' => [[], [], ['ssrf']], +]; diff --git a/vendor/vimeo/psalm/dictionaries/PropertyMap.php b/vendor/vimeo/psalm/dictionaries/PropertyMap.php new file mode 100644 index 00000000..f769b171 --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/PropertyMap.php @@ -0,0 +1,542 @@ + [ + 'name' => 'string', + ], + 'limititerator' => [ + 'name' => 'string', + ], + 'solrdocumentfield' => [ + 'name' => 'string', + 'boost' => 'float', + 'values' => 'array', + ], + 'domprocessinginstruction' => [ + 'target' => 'string', + 'data' => 'string', + ], + 'recursivearrayiterator' => [ + 'name' => 'string', + ], + 'eventbuffer' => [ + 'length' => 'int', + 'contiguous-space' => 'int', + ], + 'mongocursor' => [ + 'slaveokay' => 'boolean', + 'timeout' => 'integer', + ], + 'domxpath' => [ + 'document' => 'DOMDocument', + ], + 'domentity' => [ + 'publicId' => 'string', + 'systemId' => 'string', + 'notationName' => 'string', + 'actualEncoding' => 'string', + 'encoding' => 'string', + 'version' => 'string', + ], + 'splminheap' => [ + 'name' => 'string', + ], + 'mongodb-driver-exception-writeexception' => [ + 'writeresult' => 'MongoDBDriverWriteResult', + ], + 'ziparchive' => [ + 'status' => 'int', + 'statusSys' => 'int', + 'numFiles' => 'int', + 'filename' => 'string', + 'comment' => 'string', + ], + 'solrexception' => [ + 'sourceline' => 'integer', + 'sourcefile' => 'string', + 'zif-name' => 'string', + ], + 'arrayiterator' => [ + 'name' => 'string', + ], + 'mongoid' => [ + 'id' => 'string', + ], + 'dateinterval' => [ + 'y' => 'integer', + 'm' => 'integer', + 'd' => 'integer', + 'h' => 'integer', + 'i' => 'integer', + 's' => 'integer', + 'f' => 'float', // only present from 7.1 onwards + 'invert' => 'integer', + 'days' => 'false|int', + ], + 'tokyotyrantexception' => [ + 'code' => 'int', + ], + 'tidy' => [ + 'errorbuffer' => 'string', + ], + 'filteriterator' => [ + 'name' => 'string', + ], + 'parentiterator' => [ + 'name' => 'string', + ], + 'recursiveregexiterator' => [ + 'name' => 'string', + ], + 'error' => [ + 'message' => 'string', + 'code' => 'int', + 'file' => 'string', + 'line' => 'int', + ], + 'domexception' => [ + 'code' => 'int', + ], + 'domentityreference' => [ + 'name' => 'string', + ], + 'spldoublylinkedlist' => [ + 'name' => 'string', + ], + 'domdocumentfragment' => [ + 'name' => 'string', + ], + 'collator' => [ + 'name' => 'string', + ], + 'streamwrapper' => [ + 'context' => 'resource', + ], + 'pdostatement' => [ + 'querystring' => 'string', + ], + 'domnotation' => [ + 'publicId' => 'string', + 'systemId' => 'string', + ], + 'snmpexception' => [ + 'code' => 'string', + ], + 'directoryiterator' => [ + 'name' => 'string', + ], + 'splqueue' => [ + 'name' => 'string', + ], + 'locale' => [ + 'name' => 'string', + ], + 'directory' => [ + 'path' => 'string', + 'handle' => 'resource', + ], + 'splheap' => [ + 'name' => 'string', + ], + 'domnodelist' => [ + 'length' => 'int', + ], + 'mongodb' => [ + 'w' => 'integer', + 'wtimeout' => 'integer', + ], + 'splpriorityqueue' => [ + 'name' => 'string', + ], + 'mongoclient' => [ + 'connected' => 'boolean', + 'status' => 'string', + ], + 'domdocument' => [ + 'actualEncoding' => 'string', + 'config' => 'null', + 'doctype' => 'DOMDocumentType', + 'documentElement' => 'DOMElement', + 'documentURI' => 'string', + 'encoding' => 'string', + 'firstElementChild' => 'DOMElement|null', + 'formatOutput' => 'bool', + 'childElementCount' => 'int', + 'implementation' => 'DOMImplementation', + 'lastElementChild' => 'DOMElement|null', + 'preserveWhiteSpace' => 'bool', + 'recover' => 'bool', + 'resolveExternals' => 'bool', + 'standalone' => 'bool', + 'strictErrorChecking' => 'bool', + 'substituteEntities' => 'bool', + 'validateOnParse' => 'bool', + 'version' => 'string', + 'xmlEncoding' => 'string', + 'xmlStandalone' => 'bool', + 'xmlVersion' => 'string', + 'ownerDocument' => 'null', + 'parentNode' => 'null', + ], + 'libxmlerror' => [ + 'level' => 'int', + 'code' => 'int', + 'column' => 'int', + 'message' => 'string', + 'file' => 'string', + 'line' => 'int', + ], + 'domimplementation' => [ + 'name' => 'string', + ], + 'normalizer' => [ + 'name' => 'string', + ], + 'norewinditerator' => [ + 'name' => 'string', + ], + 'event' => [ + 'pending' => 'bool', + ], + 'domdocumenttype' => [ + 'publicId' => 'string', + 'systemId' => 'string', + 'name' => 'string', + 'entities' => 'DOMNamedNodeMap', + 'notations' => 'DOMNamedNodeMap', + 'internalSubset' => 'string', + ], + 'errorexception' => [ + 'severity' => 'int', + ], + 'recursivedirectoryiterator' => [ + 'name' => 'string', + ], + 'domcharacterdata' => [ + 'data' => 'string', + 'length' => 'int', + ], + 'mongocollection' => [ + 'db' => 'MongoDB', + 'w' => 'integer', + 'wtimeout' => 'integer', + ], + 'mongoint64' => [ + 'value' => 'string', + ], + 'mysqli' => [ + 'affected_rows' => 'int', + 'client_info' => 'string', + 'client_version' => 'int', + 'connect_errno' => 'int', + 'connect_error' => '?string', + 'errno' => 'int', + 'error' => 'string', + 'error_list' => 'array', + 'field_count' => 'int', + 'host_info' => 'string', + 'info' => 'string', + 'insert_id' => 'int|string', + 'protocol_version' => 'string', + 'server_info' => 'string', + 'server_version' => 'int', + 'sqlstate' => 'string', + 'thread_id' => 'int', + 'warning_count' => 'int', + ], + 'mysqli_driver' => [ + 'client_info' => 'string', + 'client_version' => 'string', + 'driver_version' => 'string', + 'embedded' => 'string', + 'reconnect' => 'bool', + 'report_mode' => 'int' + ], + 'mysqli_result' => [ + 'current_field' => 'int', + 'field_count' => 'int', + 'lengths' => 'array|null', + 'num_rows' => 'int', + 'type' => 'mixed', + ], + 'mysqli_sql_exception' => [ + 'sqlstate' => 'string' + ], + 'mysqli_stmt' => [ + 'affected_rows' => 'int', + 'errno' => 'int', + 'error' => 'string', + 'error_list' => 'array', + 'field_count' => 'int', + 'id' => 'mixed', + 'insert_id' => 'int', + 'num_rows' => 'int', + 'param_count' => 'int', + 'sqlstate' => 'string', + ], + 'mysqli_warning' => [ + 'errno' => 'int', + 'message' => 'string', + 'sqlstate' => 'string', + ], + 'eventlistener' => [ + 'fd' => 'int', + ], + 'splmaxheap' => [ + 'name' => 'string', + ], + 'regexiterator' => [ + 'name' => 'string', + ], + 'domelement' => [ + 'schemaTypeInfo' => 'bool', + 'tagName' => 'string', + 'attributes' => 'DOMNamedNodeMap', + 'childElementCount' => 'int', + 'firstElementChild' => 'DOMElement|null', + 'lastElementChild' => 'DOMElement|null', + 'nextElementSibling' => 'DOMElement|null', + 'previousElementSibling' => 'DOMElement|null', + ], + 'tidynode' => [ + 'value' => 'string', + 'name' => 'string', + 'type' => 'int', + 'line' => 'int', + 'column' => 'int', + 'proprietary' => 'bool', + 'id' => 'int', + 'attribute' => 'array', + 'child' => '?array', + ], + 'recursivecachingiterator' => [ + 'name' => 'string', + ], + 'solrresponse' => [ + 'http-status' => 'integer', + 'parser-mode' => 'integer', + 'success' => 'bool', + 'http-status-message' => 'string', + 'http-request-url' => 'string', + 'http-raw-request-headers' => 'string', + 'http-raw-request' => 'string', + 'http-raw-response-headers' => 'string', + 'http-raw-response' => 'string', + 'http-digested-response' => 'string', + ], + 'domnamednodemap' => [ + 'length' => 'int', + ], + 'splstack' => [ + 'name' => 'string', + ], + 'numberformatter' => [ + 'name' => 'string', + ], + 'eventsslcontext' => [ + 'local-cert' => 'string', + 'local-pk' => 'string', + ], + 'pdoexception' => [ + 'errorinfo' => 'array', + 'code' => 'int|string', + ], + 'domnode' => [ + 'nodeName' => 'string', + 'nodeValue' => 'string|null', + 'nodeType' => 'int', + 'parentNode' => 'DOMNode|null', + 'childNodes' => 'DomNodeList', + 'firstChild' => 'DOMNode|null', + 'lastChild' => 'DOMNode|null', + 'previousSibling' => 'DOMNode|null', + 'nextSibling' => 'DOMNode|null', + 'attributes' => 'null', + 'ownerDocument' => 'DOMDocument|null', + 'namespaceURI' => 'string|null', + 'prefix' => 'string', + 'localName' => 'string', + 'baseURI' => 'string|null', + 'textContent' => 'string', + ], + 'domattr' => [ + 'name' => 'string', + 'ownerElement' => 'DOMElement', + 'schemaTypeInfo' => 'bool', + 'specified' => 'bool', + 'value' => 'string', + ], + 'simplexmliterator' => [ + 'name' => 'string', + ], + 'snmp' => [ + 'max-oids' => 'int', + 'valueretrieval' => 'int', + 'quick-print' => 'bool', + 'enum-print' => 'bool', + 'oid-output-format' => 'int', + 'oid-increasing-check' => 'bool', + 'exceptions-enabled' => 'int', + 'info' => 'array', + ], + 'mongoint32' => [ + 'value' => 'string', + ], + 'xmlreader' => [ + 'attributeCount' => 'int', + 'baseURI' => 'string', + 'depth' => 'int', + 'hasAttributes' => 'bool', + 'hasValue' => 'bool', + 'isDefault' => 'bool', + 'isEmptyElement' => 'bool', + 'localName' => 'string', + 'name' => 'string', + 'namespaceURI' => 'string', + 'nodeType' => 'int', + 'prefix' => 'string', + 'value' => 'string', + 'xmlLang' => 'string', + ], + 'eventbufferevent' => [ + 'fd' => 'integer', + 'priority' => 'integer', + 'input' => 'EventBuffer', + 'output' => 'EventBuffer', + ], + 'domtext' => [ + 'wholeText' => 'string', + ], + 'exception' => [ + 'message' => 'string', + 'code' => 'int', + 'file' => 'string', + 'line' => 'int', + ], + 'reflectionclass' => [ + 'name' => 'string', + ], + 'reflectionmethod' => [ + 'class' => 'string', + 'name' => 'string', + ], + 'reflectionparameter' => [ + 'name' => 'string', + ], + 'reflectionproperty' => [ + 'name' => 'string', + 'class' => 'string', + ], + 'phpparser\\node\\expr\\array_' => [ + 'items' => 'array', + ], + 'phpparser\\node\\expr\\list_' => [ + 'items' => 'array', + ], + 'phpparser\\node\\expr\\arrowfunction' => [ + 'params' => 'list', + ], + 'phpparser\\node\\expr\\closure' => [ + 'params' => 'list', + ], + 'phpparser\\node\\name' => [ + 'parts' => 'non-empty-list', + ], + 'phpparser\\node\\stmt\\namespace_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\if_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\elseif_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\else_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\for_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\foreach_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\trycatch' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\catch_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\finally_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\case_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\while_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\do_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\class_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\trait_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\stmt\\interface_' => [ + 'stmts' => 'list', + ], + 'phpparser\\node\\matcharm' => [ + 'conds' => 'null|non-empty-list', + ], + 'phpparser\\node\\expr\\shellexec' => [ + 'parts' => 'list', + ], + 'rdkafka\\message' => [ + 'err' => 'int', + 'topic_name' => 'string', + 'partition' => 'int', + 'payload' => 'string', + 'key' => 'string|null', + 'offset' => 'int', + 'timestamp' => 'int', + 'headers' => 'array|null', + ], + 'soapfault' => [ + 'faultcode' => 'string|null', + 'faultcodens' => 'string|null', + 'faultstring' => 'string', + 'faultactor' => 'string|null', + 'detail' => 'mixed|null', + '_name' => 'string', + 'headerfault' => 'mixed|null', + ], +]; diff --git a/vendor/vimeo/psalm/psalm b/vendor/vimeo/psalm/psalm new file mode 100755 index 00000000..a633cb87 --- /dev/null +++ b/vendor/vimeo/psalm/psalm @@ -0,0 +1,7 @@ +#!/usr/bin/env php + + */ + public $uses; + + /** + * @var array + */ + public $uses_flipped; + + /** + * @var array + */ + public $functions; + + /** + * @var array + */ + public $functions_flipped; + + /** + * @var array + */ + public $constants; + + /** + * @var array + */ + public $constants_flipped; + + /** @var string|null */ + public $namespace; + + /** @var ?int */ + public $namespace_first_stmt_start; + + /** @var ?int */ + public $uses_start; + + /** @var ?int */ + public $uses_end; + + /** + * @param array $uses + * @param array $functions + * @param array $constants + * @param array $uses_flipped + * @param array $functions_flipped + * @param array $constants_flipped + */ + public function __construct( + ?string $namespace = null, + array $uses = [], + array $functions = [], + array $constants = [], + array $uses_flipped = [], + array $functions_flipped = [], + array $constants_flipped = [] + ) { + $this->namespace = $namespace; + $this->uses = $uses; + $this->functions = $functions; + $this->constants = $constants; + $this->uses_flipped = $uses_flipped; + $this->functions_flipped = $functions_flipped; + $this->constants_flipped = $constants_flipped; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/CodeLocation.php b/vendor/vimeo/psalm/src/Psalm/CodeLocation.php new file mode 100644 index 00000000..82c6bdad --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/CodeLocation.php @@ -0,0 +1,392 @@ +file_start = (int)$stmt->getAttribute('startFilePos'); + $this->file_end = (int)$stmt->getAttribute('endFilePos'); + $this->raw_file_start = $this->file_start; + $this->raw_file_end = $this->file_end; + $this->file_path = $file_source->getFilePath(); + $this->file_name = $file_source->getFileName(); + $this->single_line = $single_line; + $this->regex_type = $regex_type; + $this->previous_location = $previous_location; + $this->text = $selected_text; + + $doc_comment = $stmt->getDocComment(); + + $this->docblock_start = $doc_comment ? $doc_comment->getStartFilePos() : null; + $this->docblock_start_line_number = $doc_comment ? $doc_comment->getStartLine() : null; + + $this->preview_start = $this->docblock_start ?: $this->file_start; + + $this->raw_line_number = $stmt->getLine(); + } + + public function setCommentLine(int $line): void + { + $this->docblock_line_number = $line; + } + + private function calculateRealLocation(): void + { + if ($this->have_recalculated) { + return; + } + + $this->have_recalculated = true; + + $this->selection_start = $this->file_start; + $this->selection_end = $this->file_end + 1; + + $project_analyzer = ProjectAnalyzer::getInstance(); + + $codebase = $project_analyzer->getCodebase(); + + $file_contents = $codebase->getFileContents($this->file_path); + + $file_length = strlen($file_contents); + + $search_limit = $this->single_line ? $this->selection_start : $this->selection_end; + + if ($search_limit <= $file_length) { + $preview_end = strpos( + $file_contents, + "\n", + $search_limit + ); + } else { + $preview_end = false; + } + + // if the string didn't contain a newline + if ($preview_end === false) { + $preview_end = $this->selection_end; + } + + $this->preview_end = $preview_end; + + if ($this->docblock_line_number && + $this->docblock_start_line_number && + $this->preview_start < $this->selection_start + ) { + $preview_lines = explode( + "\n", + mb_strcut( + $file_contents, + $this->preview_start, + $this->selection_start - $this->preview_start - 1 + ) + ); + + $preview_offset = 0; + + $comment_line_offset = $this->docblock_line_number - $this->docblock_start_line_number; + + for ($i = 0; $i < $comment_line_offset; ++$i) { + $preview_offset += strlen($preview_lines[$i]) + 1; + } + + if (!isset($preview_lines[$i])) { + throw new Exception('Should have offset'); + } + + $key_line = $preview_lines[$i]; + + $indentation = (int)strpos($key_line, '@'); + + $key_line = trim(preg_replace('@\**/\s*@', '', mb_strcut($key_line, $indentation))); + + $this->selection_start = $preview_offset + $indentation + $this->preview_start; + $this->selection_end = $this->selection_start + strlen($key_line); + } + + if ($this->regex_type !== null) { + switch ($this->regex_type) { + case self::VAR_TYPE: + $regex = '/@(?:psalm-)?var[ \t]+' . CommentAnalyzer::TYPE_REGEX . '/'; + break; + + case self::FUNCTION_RETURN_TYPE: + $regex = '/\\:\s+(\\??\s*[A-Za-z0-9_\\\\\[\]]+)/'; + break; + + case self::FUNCTION_PARAM_TYPE: + $regex = '/^(\\??\s*[A-Za-z0-9_\\\\\[\]]+)\s/'; + break; + + case self::FUNCTION_PHPDOC_RETURN_TYPE: + $regex = '/@(?:psalm-)?return[ \t]+' . CommentAnalyzer::TYPE_REGEX . '/'; + break; + + case self::FUNCTION_PHPDOC_METHOD: + $regex = '/@(?:psalm-)?method[ \t]+(.*)/'; + break; + + case self::FUNCTION_PHPDOC_PARAM_TYPE: + $regex = '/@(?:psalm-)?param[ \t]+' . CommentAnalyzer::TYPE_REGEX . '/'; + break; + + case self::FUNCTION_PARAM_VAR: + $regex = '/(\$[^ ]*)/'; + break; + + case self::CATCH_VAR: + $regex = '/(\$[^ ^\)]*)/'; + break; + + default: + throw new UnexpectedValueException('Unrecognised regex type ' . $this->regex_type); + } + + $preview_snippet = mb_strcut( + $file_contents, + $this->selection_start, + $this->selection_end - $this->selection_start + ); + + if ($this->text) { + $regex = '/(' . str_replace(',', ',[ ]*', preg_quote($this->text, '/')) . ')/'; + } + + if (preg_match($regex, $preview_snippet, $matches, PREG_OFFSET_CAPTURE)) { + if (!isset($matches[1]) || $matches[1][1] === -1) { + throw new LogicException( + "Failed to match anything to 1st capturing group, " + . "or regex doesn't contain 1st capturing group, regex type " . $this->regex_type + ); + } + $this->selection_start = $this->selection_start + $matches[1][1]; + $this->selection_end = $this->selection_start + strlen($matches[1][0]); + } + } + + // reset preview start to beginning of line + $this->preview_start = (int)strrpos( + $file_contents, + "\n", + min($this->preview_start, $this->selection_start) - strlen($file_contents) + ) + 1; + + $this->selection_start = max($this->preview_start, $this->selection_start); + $this->selection_end = min($this->preview_end, $this->selection_end); + + if ($this->preview_end - $this->selection_end > 200) { + $this->preview_end = (int)strrpos( + $file_contents, + "\n", + $this->selection_end + 200 - strlen($file_contents) + ); + + // if the line is over 200 characters long + if ($this->preview_end < $this->selection_end) { + $this->preview_end = $this->selection_end + 50; + } + } + + $this->snippet = mb_strcut($file_contents, $this->preview_start, $this->preview_end - $this->preview_start); + // text is within snippet. It's 50% faster to cut it from the snippet than from the full text + $selection_length = $this->selection_end - $this->selection_start; + $this->text = mb_strcut($this->snippet, $this->selection_start - $this->preview_start, $selection_length); + + // reset preview start to beginning of line + if ($file_contents !== '') { + $this->column_from = $this->selection_start - + (int)strrpos($file_contents, "\n", $this->selection_start - strlen($file_contents)); + } else { + $this->column_from = $this->selection_start; + } + + $newlines = substr_count($this->text, "\n"); + + if ($newlines) { + $last_newline_pos = strrpos($file_contents, "\n", $this->selection_end - strlen($file_contents) - 1); + $this->column_to = $this->selection_end - (int)$last_newline_pos; + } else { + $this->column_to = $this->column_from + strlen($this->text); + } + + $this->end_line_number = $this->getLineNumber() + $newlines; + } + + public function getLineNumber(): int + { + return $this->docblock_line_number ?: $this->raw_line_number; + } + + public function getEndLineNumber(): int + { + $this->calculateRealLocation(); + + return $this->end_line_number; + } + + public function getSnippet(): string + { + $this->calculateRealLocation(); + + return $this->snippet; + } + + public function getSelectedText(): string + { + $this->calculateRealLocation(); + + return (string)$this->text; + } + + public function getColumn(): int + { + $this->calculateRealLocation(); + + return $this->column_from; + } + + public function getEndColumn(): int + { + $this->calculateRealLocation(); + + return $this->column_to; + } + + /** + * @return array{0: int, 1: int} + */ + public function getSelectionBounds(): array + { + $this->calculateRealLocation(); + + return [$this->selection_start, $this->selection_end]; + } + + /** + * @return array{0: int, 1: int} + */ + public function getSnippetBounds(): array + { + $this->calculateRealLocation(); + + return [$this->preview_start, $this->preview_end]; + } + + public function getHash(): string + { + return $this->file_name . ' ' . $this->raw_file_start . $this->raw_file_end; + } + + public function getShortSummary(): string + { + return $this->file_name . ':' . $this->getLineNumber() . ':' . $this->getColumn(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php b/vendor/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php new file mode 100644 index 00000000..224b740a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php @@ -0,0 +1,30 @@ +file_start = $file_start; + // matches how CodeLocation works + $this->file_end = $file_end - 1; + + $this->raw_file_start = $file_start; + $this->raw_file_end = $file_end; + $this->raw_line_number = $line_number; + + $this->file_path = $file_source->getFilePath(); + $this->file_name = $file_source->getFileName(); + $this->single_line = false; + + $this->preview_start = $this->file_start; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php b/vendor/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php new file mode 100644 index 00000000..eedae0bb --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php @@ -0,0 +1,35 @@ +file_start = (int)$error->getAttributes()['startFilePos']; + /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ + $this->file_end = (int)$error->getAttributes()['endFilePos']; + $this->raw_file_start = $this->file_start; + $this->raw_file_end = $this->file_end; + $this->file_path = $file_path; + $this->file_name = $file_name; + $this->single_line = false; + + $this->preview_start = $this->file_start; + $this->raw_line_number = substr_count( + substr($file_contents, 0, $this->file_start), + "\n" + ) + 1; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/CodeLocation/Raw.php b/vendor/vimeo/psalm/src/Psalm/CodeLocation/Raw.php new file mode 100644 index 00000000..f75a5d38 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/CodeLocation/Raw.php @@ -0,0 +1,33 @@ +file_start = $file_start; + $this->file_end = $file_end; + $this->raw_file_start = $this->file_start; + $this->raw_file_end = $this->file_end; + $this->file_path = $file_path; + $this->file_name = $file_name; + $this->single_line = false; + + $this->preview_start = $this->file_start; + $this->raw_line_number = substr_count( + substr($file_contents, 0, $this->file_start), + "\n" + ) + 1; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Codebase.php b/vendor/vimeo/psalm/src/Psalm/Codebase.php new file mode 100644 index 00000000..cb72efa8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Codebase.php @@ -0,0 +1,2013 @@ +> + */ + public $use_referencing_locations = []; + + /** + * @var FileStorageProvider + */ + public $file_storage_provider; + + /** + * @var ClassLikeStorageProvider + */ + public $classlike_storage_provider; + + /** + * @var bool + */ + public $collect_references = false; + + /** + * @var bool + */ + public $collect_locations = false; + + /** + * @var null|'always'|'auto' + */ + public $find_unused_code; + + /** + * @var FileProvider + */ + public $file_provider; + + /** + * @var FileReferenceProvider + */ + public $file_reference_provider; + + /** + * @var StatementsProvider + */ + public $statements_provider; + + /** + * @var Progress + */ + private $progress; + + /** + * @var array + */ + private static $stubbed_constants = []; + + /** + * Whether to register autoloaded information + * + * @var bool + */ + public $register_autoload_files = false; + + /** + * Whether to log functions just at the file level or globally (for stubs) + * + * @var bool + */ + public $register_stub_files = false; + + /** + * @var bool + */ + public $find_unused_variables = false; + + /** + * @var Scanner + */ + public $scanner; + + /** + * @var Analyzer + */ + public $analyzer; + + /** + * @var Functions + */ + public $functions; + + /** + * @var ClassLikes + */ + public $classlikes; + + /** + * @var Methods + */ + public $methods; + + /** + * @var Properties + */ + public $properties; + + /** + * @var Populator + */ + public $populator; + + /** + * @var ?TaintFlowGraph + */ + public $taint_flow_graph; + + /** + * @var bool + */ + public $server_mode = false; + + /** + * @var bool + */ + public $store_node_types = false; + + /** + * Whether or not to infer types from usage. Computationally expensive, so turned off by default + * + * @var bool + */ + public $infer_types_from_usage = false; + + /** + * @var bool + */ + public $alter_code = false; + + /** + * @var bool + */ + public $diff_methods = false; + + /** + * @var array + */ + public $methods_to_move = []; + + /** + * @var array + */ + public $methods_to_rename = []; + + /** + * @var array + */ + public $properties_to_move = []; + + /** + * @var array + */ + public $properties_to_rename = []; + + /** + * @var array + */ + public $class_constants_to_move = []; + + /** + * @var array + */ + public $class_constants_to_rename = []; + + /** + * @var array + */ + public $classes_to_move = []; + + /** + * @var array + */ + public $call_transforms = []; + + /** + * @var array + */ + public $property_transforms = []; + + /** + * @var array + */ + public $class_constant_transforms = []; + + /** + * @var array + */ + public $class_transforms = []; + + /** + * @var bool + */ + public $allow_backwards_incompatible_changes = true; + + /** + * @var int + * @deprecated Removed in Psalm 5, use Codebase::$analysis_php_version_id + */ + public $php_major_version = PHP_MAJOR_VERSION; + + /** + * @var int + * @deprecated Removed in Psalm 5, use Codebase::$analysis_php_version_id + */ + public $php_minor_version = PHP_MINOR_VERSION; + + /** @var int */ + public $analysis_php_version_id = PHP_VERSION_ID; + + /** @var 'cli'|'config'|'composer'|'tests'|'runtime' */ + public $php_version_source = 'runtime'; + + /** + * @var bool + */ + public $track_unused_suppressions = false; + + public function __construct( + Config $config, + Providers $providers, + ?Progress $progress = null + ) { + if ($progress === null) { + $progress = new VoidProgress(); + } + + $this->config = $config; + $this->file_storage_provider = $providers->file_storage_provider; + $this->classlike_storage_provider = $providers->classlike_storage_provider; + $this->progress = $progress; + $this->file_provider = $providers->file_provider; + $this->file_reference_provider = $providers->file_reference_provider; + $this->statements_provider = $providers->statements_provider; + + self::$stubbed_constants = []; + + $reflection = new Reflection($providers->classlike_storage_provider, $this); + + $this->scanner = new Scanner( + $this, + $config, + $providers->file_storage_provider, + $providers->file_provider, + $reflection, + $providers->file_reference_provider, + $progress + ); + + $this->loadAnalyzer(); + + $this->functions = new Functions($providers->file_storage_provider, $reflection); + + $this->classlikes = new ClassLikes( + $this->config, + $providers->classlike_storage_provider, + $providers->file_reference_provider, + $providers->statements_provider, + $this->scanner + ); + + $this->properties = new Properties( + $providers->classlike_storage_provider, + $providers->file_reference_provider, + $this->classlikes + ); + + $this->methods = new Methods( + $providers->classlike_storage_provider, + $providers->file_reference_provider, + $this->classlikes + ); + + $this->populator = new Populator( + $config, + $providers->classlike_storage_provider, + $providers->file_storage_provider, + $this->classlikes, + $providers->file_reference_provider, + $progress + ); + + $this->loadAnalyzer(); + } + + private function loadAnalyzer(): void + { + $this->analyzer = new Analyzer( + $this->config, + $this->file_provider, + $this->file_storage_provider, + $this->progress + ); + } + + /** + * @param array $candidate_files + * + */ + public function reloadFiles(ProjectAnalyzer $project_analyzer, array $candidate_files): void + { + $this->loadAnalyzer(); + + $this->file_reference_provider->loadReferenceCache(false); + + FunctionLikeAnalyzer::clearCache(); + + if (!$this->statements_provider->parser_cache_provider) { + $diff_files = $candidate_files; + } else { + $diff_files = []; + + $parser_cache_provider = $this->statements_provider->parser_cache_provider; + + foreach ($candidate_files as $candidate_file_path) { + if ($parser_cache_provider->loadExistingFileContentsFromCache($candidate_file_path) + !== $this->file_provider->getContents($candidate_file_path) + ) { + $diff_files[] = $candidate_file_path; + } + } + } + + $referenced_files = $project_analyzer->getReferencedFilesFromDiff($diff_files, false); + + foreach ($diff_files as $diff_file_path) { + $this->invalidateInformationForFile($diff_file_path); + } + + foreach ($referenced_files as $referenced_file_path) { + if (in_array($referenced_file_path, $diff_files, true)) { + continue; + } + + $file_storage = $this->file_storage_provider->get($referenced_file_path); + + foreach ($file_storage->classlikes_in_file as $fq_classlike_name) { + $this->classlike_storage_provider->remove($fq_classlike_name); + $this->classlikes->removeClassLike($fq_classlike_name); + } + + $this->file_storage_provider->remove($referenced_file_path); + $this->scanner->removeFile($referenced_file_path); + } + + $referenced_files = array_combine($referenced_files, $referenced_files); + + $this->scanner->addFilesToDeepScan($referenced_files); + $this->addFilesToAnalyze(array_combine($candidate_files, $candidate_files)); + + $this->scanner->scanFiles($this->classlikes); + + $this->file_reference_provider->updateReferenceCache($this, $referenced_files); + + $this->populator->populateCodebase(); + } + + public function enterServerMode(): void + { + $this->server_mode = true; + $this->store_node_types = true; + } + + public function collectLocations(): void + { + $this->collect_locations = true; + $this->classlikes->collect_locations = true; + $this->methods->collect_locations = true; + $this->properties->collect_locations = true; + } + + /** + * @param 'always'|'auto' $find_unused_code + * + */ + public function reportUnusedCode(string $find_unused_code = 'auto'): void + { + $this->collect_references = true; + $this->classlikes->collect_references = true; + $this->find_unused_code = $find_unused_code; + $this->find_unused_variables = true; + } + + public function reportUnusedVariables(): void + { + $this->collect_references = true; + $this->find_unused_variables = true; + } + + /** + * @param array $files_to_analyze + * + */ + public function addFilesToAnalyze(array $files_to_analyze): void + { + $this->scanner->addFilesToDeepScan($files_to_analyze); + $this->analyzer->addFilesToAnalyze($files_to_analyze); + } + + /** + * Scans all files their related files + * + */ + public function scanFiles(int $threads = 1): void + { + $has_changes = $this->scanner->scanFiles($this->classlikes, $threads); + + if ($has_changes) { + $this->populator->populateCodebase(); + } + } + + public function getFileContents(string $file_path): string + { + return $this->file_provider->getContents($file_path); + } + + /** + * @return list + */ + public function getStatementsForFile(string $file_path): array + { + return $this->statements_provider->getStatementsForFile( + $file_path, + $this->php_major_version . '.' . $this->php_minor_version, + $this->progress + ); + } + + public function createClassLikeStorage(string $fq_classlike_name): ClassLikeStorage + { + return $this->classlike_storage_provider->create($fq_classlike_name); + } + + public function cacheClassLikeStorage(ClassLikeStorage $classlike_storage, string $file_path): void + { + $file_contents = $this->file_provider->getContents($file_path); + + if ($this->classlike_storage_provider->cache) { + $this->classlike_storage_provider->cache->writeToCache($classlike_storage, $file_path, $file_contents); + } + } + + public function exhumeClassLikeStorage(string $fq_classlike_name, string $file_path): void + { + $file_contents = $this->file_provider->getContents($file_path); + $storage = $this->classlike_storage_provider->exhume( + $fq_classlike_name, + $file_path, + $file_contents + ); + + if ($storage->is_trait) { + $this->classlikes->addFullyQualifiedTraitName($storage->name, $file_path); + } elseif ($storage->is_interface) { + $this->classlikes->addFullyQualifiedInterfaceName($storage->name, $file_path); + } else { + $this->classlikes->addFullyQualifiedClassName($storage->name, $file_path); + } + } + + public static function getPsalmTypeFromReflection(?ReflectionType $type): Union + { + return Reflection::getPsalmTypeFromReflectionType($type); + } + + public function createFileStorageForPath(string $file_path): FileStorage + { + return $this->file_storage_provider->create($file_path); + } + + /** + * @return array + */ + public function findReferencesToSymbol(string $symbol): array + { + if (!$this->collect_locations) { + throw new UnexpectedValueException('Should not be checking references'); + } + + if (strpos($symbol, '::$') !== false) { + return $this->findReferencesToProperty($symbol); + } + + if (strpos($symbol, '::') !== false) { + return $this->findReferencesToMethod($symbol); + } + + return $this->findReferencesToClassLike($symbol); + } + + /** + * @return array + */ + public function findReferencesToMethod(string $method_id): array + { + return $this->file_reference_provider->getClassMethodLocations(strtolower($method_id)); + } + + /** + * @return array + */ + public function findReferencesToProperty(string $property_id): array + { + [$fq_class_name, $property_name] = explode('::', $property_id); + + return $this->file_reference_provider->getClassPropertyLocations( + strtolower($fq_class_name) . '::' . $property_name + ); + } + + /** + * @return CodeLocation[] + * + * @psalm-return array + */ + public function findReferencesToClassLike(string $fq_class_name): array + { + $fq_class_name_lc = strtolower($fq_class_name); + $locations = $this->file_reference_provider->getClassLocations($fq_class_name_lc); + + if (isset($this->use_referencing_locations[$fq_class_name_lc])) { + $locations = array_merge($locations, $this->use_referencing_locations[$fq_class_name_lc]); + } + + return $locations; + } + + public function getClosureStorage(string $file_path, string $closure_id): FunctionStorage + { + $file_storage = $this->file_storage_provider->get($file_path); + + // closures can be returned here + if (isset($file_storage->functions[$closure_id])) { + return $file_storage->functions[$closure_id]; + } + + throw new UnexpectedValueException( + 'Expecting ' . $closure_id . ' to have storage in ' . $file_path + ); + } + + public function addGlobalConstantType(string $const_id, Union $type): void + { + self::$stubbed_constants[$const_id] = $type; + } + + public function getStubbedConstantType(string $const_id): ?Union + { + return self::$stubbed_constants[$const_id] ?? null; + } + + /** + * @return array + */ + public function getAllStubbedConstants(): array + { + return self::$stubbed_constants; + } + + public function fileExists(string $file_path): bool + { + return $this->file_provider->fileExists($file_path); + } + + /** + * Check whether a class/interface exists + */ + public function classOrInterfaceExists( + string $fq_class_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + return $this->classlikes->classOrInterfaceExists( + $fq_class_name, + $code_location, + $calling_fq_class_name, + $calling_method_id + ); + } + + /** + * Check whether a class/interface exists + */ + public function classOrInterfaceOrEnumExists( + string $fq_class_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + return $this->classlikes->classOrInterfaceOrEnumExists( + $fq_class_name, + $code_location, + $calling_fq_class_name, + $calling_method_id + ); + } + + public function classExtendsOrImplements(string $fq_class_name, string $possible_parent): bool + { + return $this->classlikes->classExtends($fq_class_name, $possible_parent) + || $this->classlikes->classImplements($fq_class_name, $possible_parent); + } + + /** + * Determine whether or not a given class exists + */ + public function classExists( + string $fq_class_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + return $this->classlikes->classExists( + $fq_class_name, + $code_location, + $calling_fq_class_name, + $calling_method_id + ); + } + + /** + * Determine whether or not a class extends a parent + * + * @throws UnpopulatedClasslikeException when called on unpopulated class + * @throws InvalidArgumentException when class does not exist + */ + public function classExtends(string $fq_class_name, string $possible_parent): bool + { + return $this->classlikes->classExtends($fq_class_name, $possible_parent, true); + } + + /** + * Check whether a class implements an interface + */ + public function classImplements(string $fq_class_name, string $interface): bool + { + return $this->classlikes->classImplements($fq_class_name, $interface); + } + + public function interfaceExists( + string $fq_interface_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + return $this->classlikes->interfaceExists( + $fq_interface_name, + $code_location, + $calling_fq_class_name, + $calling_method_id + ); + } + + public function interfaceExtends(string $interface_name, string $possible_parent): bool + { + return $this->classlikes->interfaceExtends($interface_name, $possible_parent); + } + + /** + * @return array all interfaces extended by $interface_name + */ + public function getParentInterfaces(string $fq_interface_name): array + { + return $this->classlikes->getParentInterfaces( + $this->classlikes->getUnAliasedName($fq_interface_name) + ); + } + + /** + * Determine whether or not a class has the correct casing + */ + public function classHasCorrectCasing(string $fq_class_name): bool + { + return $this->classlikes->classHasCorrectCasing($fq_class_name); + } + + public function interfaceHasCorrectCasing(string $fq_interface_name): bool + { + return $this->classlikes->interfaceHasCorrectCasing($fq_interface_name); + } + + public function traitHasCorrectCase(string $fq_trait_name): bool + { + return $this->classlikes->traitHasCorrectCase($fq_trait_name); + } + + /** + * Given a function id, return the function like storage for + * a method, closure, or function. + * + * @param non-empty-string $function_id + * + * @return FunctionStorage|MethodStorage + */ + public function getFunctionLikeStorage( + StatementsAnalyzer $statements_analyzer, + string $function_id + ): FunctionLikeStorage { + $doesMethodExist = + MethodIdentifier::isValidMethodIdReference($function_id) + && $this->methodExists($function_id); + + if ($doesMethodExist) { + $method_id = MethodIdentifier::wrap($function_id); + + $declaring_method_id = $this->methods->getDeclaringMethodId($method_id); + + if (!$declaring_method_id) { + throw new UnexpectedValueException('Declaring method for ' . $method_id . ' cannot be found'); + } + + return $this->methods->getStorage($declaring_method_id); + } + + return $this->functions->getStorage($statements_analyzer, strtolower($function_id)); + } + + /** + * Whether or not a given method exists + * + * @param string|MethodIdentifier $method_id + * @param string|MethodIdentifier|null $calling_method_id + */ + public function methodExists( + $method_id, + ?CodeLocation $code_location = null, + $calling_method_id = null, + ?string $file_path = null, + bool $is_used = true + ): bool { + return $this->methods->methodExists( + MethodIdentifier::wrap($method_id), + is_string($calling_method_id) ? strtolower($calling_method_id) : strtolower((string) $calling_method_id), + $code_location, + null, + $file_path, + true, + $is_used + ); + } + + /** + * @param string|MethodIdentifier $method_id + * + * @return array + */ + public function getMethodParams($method_id): array + { + return $this->methods->getMethodParams(MethodIdentifier::wrap($method_id)); + } + + /** + * @param string|MethodIdentifier $method_id + * + */ + public function isVariadic($method_id): bool + { + return $this->methods->isVariadic(MethodIdentifier::wrap($method_id)); + } + + /** + * @param string|MethodIdentifier $method_id + * @param list $call_args + * + */ + public function getMethodReturnType($method_id, ?string &$self_class, array $call_args = []): ?Union + { + return $this->methods->getMethodReturnType( + MethodIdentifier::wrap($method_id), + $self_class, + null, + $call_args + ); + } + + /** + * @param string|MethodIdentifier $method_id + * + */ + public function getMethodReturnsByRef($method_id): bool + { + return $this->methods->getMethodReturnsByRef(MethodIdentifier::wrap($method_id)); + } + + /** + * @param string|MethodIdentifier $method_id + * @param CodeLocation|null $defined_location + * + */ + public function getMethodReturnTypeLocation( + $method_id, + CodeLocation &$defined_location = null + ): ?CodeLocation { + return $this->methods->getMethodReturnTypeLocation( + MethodIdentifier::wrap($method_id), + $defined_location + ); + } + + /** + * @param string|MethodIdentifier $method_id + * + */ + public function getDeclaringMethodId($method_id): ?string + { + $new_method_id = $this->methods->getDeclaringMethodId(MethodIdentifier::wrap($method_id)); + + return $new_method_id ? (string) $new_method_id : null; + } + + /** + * Get the class this method appears in (vs is declared in, which could give a trait) + * + * @param string|MethodIdentifier $method_id + * + */ + public function getAppearingMethodId($method_id): ?string + { + $new_method_id = $this->methods->getAppearingMethodId(MethodIdentifier::wrap($method_id)); + + return $new_method_id ? (string) $new_method_id : null; + } + + /** + * @param string|MethodIdentifier $method_id + * + * @return array + */ + public function getOverriddenMethodIds($method_id): array + { + return $this->methods->getOverriddenMethodIds(MethodIdentifier::wrap($method_id)); + } + + /** + * @param string|MethodIdentifier $method_id + * + */ + public function getCasedMethodId($method_id): string + { + return $this->methods->getCasedMethodId(MethodIdentifier::wrap($method_id)); + } + + public function invalidateInformationForFile(string $file_path): void + { + $this->scanner->removeFile($file_path); + + try { + $file_storage = $this->file_storage_provider->get($file_path); + } catch (InvalidArgumentException $e) { + return; + } + + foreach ($file_storage->classlikes_in_file as $fq_classlike_name) { + $this->classlike_storage_provider->remove($fq_classlike_name); + $this->classlikes->removeClassLike($fq_classlike_name); + } + + $this->file_storage_provider->remove($file_path); + } + + public function getFunctionStorageForSymbol(string $file_path, string $symbol): ?FunctionLikeStorage + { + if (strpos($symbol, '::')) { + $symbol = substr($symbol, 0, -2); + /** @psalm-suppress ArgumentTypeCoercion */ + $method_id = new MethodIdentifier(...explode('::', $symbol)); + + $declaring_method_id = $this->methods->getDeclaringMethodId($method_id); + + if (!$declaring_method_id) { + return null; + } + + return $this->methods->getStorage($declaring_method_id); + } + + $function_id = strtolower(substr($symbol, 0, -2)); + $file_storage = $this->file_storage_provider->get($file_path); + + if (isset($file_storage->functions[$function_id])) { + return $file_storage->functions[$function_id]; + } + + if (!$function_id) { + return null; + } + + return $this->functions->getStorage(null, $function_id); + } + + /** + * @param string $file_path + * @param string $symbol + * @return array{ type: string, description?: string|null}|null + */ + public function getSymbolInformation(string $file_path, string $symbol): ?array + { + if (is_numeric($symbol[0])) { + return ['type' => preg_replace('/^[^:]*:/', '', $symbol)]; + } + + try { + if (strpos($symbol, '::')) { + if (strpos($symbol, '()')) { + $symbol = substr($symbol, 0, -2); + + /** @psalm-suppress ArgumentTypeCoercion */ + $method_id = new MethodIdentifier(...explode('::', $symbol)); + + $declaring_method_id = $this->methods->getDeclaringMethodId($method_id); + + if (!$declaring_method_id) { + return null; + } + + $storage = $this->methods->getStorage($declaring_method_id); + + return [ + 'type' => 'getSignature(true), + 'description' => $storage->description, + ]; + } + + [, $symbol_name] = explode('::', $symbol); + + if (strpos($symbol, '$') !== false) { + $storage = $this->properties->getStorage($symbol); + + return [ + 'type' => 'getInfo() . ' ' . $symbol_name, + 'description' => $storage->description, + ]; + } + + [$fq_classlike_name, $const_name] = explode('::', $symbol); + + $class_constants = $this->classlikes->getConstantsForClass( + $fq_classlike_name, + ReflectionProperty::IS_PRIVATE + ); + + if (!isset($class_constants[$const_name])) { + return null; + } + + return [ + 'type' => ' $class_constants[$const_name]->description, + ]; + } + + if (strpos($symbol, '()')) { + $function_id = strtolower(substr($symbol, 0, -2)); + $file_storage = $this->file_storage_provider->get($file_path); + + if (isset($file_storage->functions[$function_id])) { + $function_storage = $file_storage->functions[$function_id]; + + return [ + 'type' => 'getSignature(true), + 'description' => $function_storage->description, + ]; + } + + if (!$function_id) { + return null; + } + + $function = $this->functions->getStorage(null, $function_id); + return [ + 'type' => 'getSignature(true), + 'description' => $function->description, + ]; + } + + if (strpos($symbol, '$') === 0) { + $type = VariableFetchAnalyzer::getGlobalType($symbol); + if (!$type->isMixed()) { + return ['type' => 'classlike_storage_provider->get($symbol); + return [ + 'type' => 'abstract ? 'abstract ' : '') . 'class ' . $storage->name, + 'description' => $storage->description, + ]; + } catch (InvalidArgumentException $e) { + } + + if (strpos($symbol, '\\')) { + $const_name_parts = explode('\\', $symbol); + $const_name = array_pop($const_name_parts); + $namespace_name = implode('\\', $const_name_parts); + + $namespace_constants = NamespaceAnalyzer::getConstantsForNamespace( + $namespace_name, + ReflectionProperty::IS_PUBLIC + ); + if (isset($namespace_constants[$const_name])) { + $type = $namespace_constants[$const_name]; + return ['type' => 'file_storage_provider->get($file_path); + if (isset($file_storage->constants[$symbol])) { + return ['type' => 'constants[$symbol]]; + } + $constant = ConstFetchAnalyzer::getGlobalConstType($this, $symbol, $symbol); + + if ($constant) { + return ['type' => 'getMessage()); + + return null; + } + } + + public function getSymbolLocation(string $file_path, string $symbol): ?CodeLocation + { + if (is_numeric($symbol[0])) { + $symbol = preg_replace('/:.*/', '', $symbol); + $symbol_parts = explode('-', $symbol); + + $file_contents = $this->getFileContents($file_path); + + return new Raw( + $file_contents, + $file_path, + $this->config->shortenFileName($file_path), + (int) $symbol_parts[0], + (int) $symbol_parts[1] + ); + } + + try { + if (strpos($symbol, '::')) { + if (strpos($symbol, '()')) { + $symbol = substr($symbol, 0, -2); + + /** @psalm-suppress ArgumentTypeCoercion */ + $method_id = new MethodIdentifier(...explode('::', $symbol)); + + $declaring_method_id = $this->methods->getDeclaringMethodId($method_id); + + if (!$declaring_method_id) { + return null; + } + + $storage = $this->methods->getStorage($declaring_method_id); + + return $storage->location; + } + + if (strpos($symbol, '$') !== false) { + $storage = $this->properties->getStorage($symbol); + + return $storage->location; + } + + [$fq_classlike_name, $const_name] = explode('::', $symbol); + + $class_constants = $this->classlikes->getConstantsForClass( + $fq_classlike_name, + ReflectionProperty::IS_PRIVATE + ); + + if (!isset($class_constants[$const_name])) { + return null; + } + + return $class_constants[$const_name]->location; + } + + if (strpos($symbol, '()')) { + $file_storage = $this->file_storage_provider->get($file_path); + + $function_id = strtolower(substr($symbol, 0, -2)); + + if (isset($file_storage->functions[$function_id])) { + return $file_storage->functions[$function_id]->location; + } + + if (!$function_id) { + return null; + } + + return $this->functions->getStorage(null, $function_id)->location; + } + + return $this->classlike_storage_provider->get($symbol)->location; + } catch (UnexpectedValueException $e) { + error_log($e->getMessage()); + + return null; + } catch (InvalidArgumentException $e) { + return null; + } + } + + /** + * @return array{0: string, 1: Range}|null + */ + public function getReferenceAtPosition(string $file_path, Position $position): ?array + { + $is_open = $this->file_provider->isOpen($file_path); + + if (!$is_open) { + throw new UnanalyzedFileException($file_path . ' is not open'); + } + + $file_contents = $this->getFileContents($file_path); + + $offset = $position->toOffset($file_contents); + + [$reference_map, $type_map] = $this->analyzer->getMapsForFile($file_path); + + $reference = null; + + if (!$reference_map && !$type_map) { + return null; + } + + $reference_start_pos = null; + $reference_end_pos = null; + + ksort($reference_map); + + foreach ($reference_map as $start_pos => [$end_pos, $possible_reference]) { + if ($offset < $start_pos) { + break; + } + + if ($offset > $end_pos) { + continue; + } + $reference_start_pos = $start_pos; + $reference_end_pos = $end_pos; + $reference = $possible_reference; + } + + if ($reference === null || $reference_start_pos === null || $reference_end_pos === null) { + return null; + } + + $range = new Range( + self::getPositionFromOffset($reference_start_pos, $file_contents), + self::getPositionFromOffset($reference_end_pos, $file_contents) + ); + + return [$reference, $range]; + } + + /** + * @return array{0: non-empty-string, 1: int, 2: Range}|null + */ + public function getFunctionArgumentAtPosition(string $file_path, Position $position): ?array + { + $is_open = $this->file_provider->isOpen($file_path); + + if (!$is_open) { + throw new UnanalyzedFileException($file_path . ' is not open'); + } + + $file_contents = $this->getFileContents($file_path); + + $offset = $position->toOffset($file_contents); + + [, , $argument_map] = $this->analyzer->getMapsForFile($file_path); + + $reference = null; + $argument_number = null; + + if (!$argument_map) { + return null; + } + + $start_pos = null; + $end_pos = null; + + ksort($argument_map); + + foreach ($argument_map as $start_pos => [$end_pos, $possible_reference, $possible_argument_number]) { + if ($offset < $start_pos) { + break; + } + + if ($offset > $end_pos) { + continue; + } + + $reference = $possible_reference; + $argument_number = $possible_argument_number; + } + + if ($reference === null || $start_pos === null || $end_pos === null || $argument_number === null) { + return null; + } + + $range = new Range( + self::getPositionFromOffset($start_pos, $file_contents), + self::getPositionFromOffset($end_pos, $file_contents) + ); + + return [$reference, $argument_number, $range]; + } + + /** + * @param non-empty-string $function_symbol + */ + public function getSignatureInformation( + string $function_symbol, + string $file_path = null + ): ?SignatureInformation { + $signature_label = ''; + $signature_documentation = null; + if (strpos($function_symbol, '::') !== false) { + /** @psalm-suppress ArgumentTypeCoercion */ + $method_id = new MethodIdentifier(...explode('::', $function_symbol)); + + $declaring_method_id = $this->methods->getDeclaringMethodId($method_id); + + if ($declaring_method_id === null) { + return null; + } + + $method_storage = $this->methods->getStorage($declaring_method_id); + $params = $method_storage->params; + $signature_label = $method_storage->cased_name; + $signature_documentation = $method_storage->description; + } else { + try { + if ($file_path) { + $function_storage = $this->functions->getStorage( + null, + strtolower($function_symbol), + dirname($file_path), + $file_path + ); + } else { + $function_storage = $this->functions->getStorage(null, strtolower($function_symbol)); + } + $params = $function_storage->params; + $signature_label = $function_storage->cased_name; + $signature_documentation = $function_storage->description; + } catch (Exception $exception) { + if (InternalCallMapHandler::inCallMap($function_symbol)) { + $callables = InternalCallMapHandler::getCallablesFromCallMap($function_symbol); + + if (!$callables || !$callables[0]->params) { + return null; + } + + $params = $callables[0]->params; + } else { + return null; + } + } + } + + $signature_label .= '('; + $parameters = []; + + foreach ($params as $i => $param) { + $parameter_label = ($param->type ?: 'mixed') . ' $' . $param->name; + $parameters[] = new ParameterInformation( + [ + strlen($signature_label), + strlen($signature_label) + strlen($parameter_label), + ], + $param->description ?? null + ); + + $signature_label .= $parameter_label; + + if ($i < (count($params) - 1)) { + $signature_label .= ', '; + } + } + + $signature_label .= ')'; + + return new SignatureInformation( + $signature_label, + $parameters, + $signature_documentation + ); + } + + /** + * @return array{0: string, 1: '->'|'::'|'['|'symbol', 2: int}|null + */ + public function getCompletionDataAtPosition(string $file_path, Position $position): ?array + { + $is_open = $this->file_provider->isOpen($file_path); + + if (!$is_open) { + throw new UnanalyzedFileException($file_path . ' is not open'); + } + + $file_contents = $this->getFileContents($file_path); + + $offset = $position->toOffset($file_contents); + + [$reference_map, $type_map] = $this->analyzer->getMapsForFile($file_path); + + if (!$reference_map && !$type_map) { + return null; + } + + krsort($type_map); + + foreach ($type_map as $start_pos => [$end_pos_excluding_whitespace, $possible_type]) { + if ($offset < $start_pos) { + continue; + } + + $num_whitespace_bytes = preg_match('/\G\s+/', $file_contents, $matches, 0, $end_pos_excluding_whitespace) + ? strlen($matches[0]) + : 0; + $end_pos = $end_pos_excluding_whitespace + $num_whitespace_bytes; + + if ($offset - $end_pos === 1) { + $candidate_gap = substr($file_contents, $end_pos, 1); + + if ($candidate_gap === '[') { + $gap = $candidate_gap; + $recent_type = $possible_type; + + if ($recent_type === 'mixed') { + return null; + } + + return [$recent_type, $gap, $offset]; + } + } + + if ($offset - $end_pos === 2 || $offset - $end_pos === 3) { + $candidate_gap = substr($file_contents, $end_pos, 2); + + if ($candidate_gap === '->' || $candidate_gap === '::') { + $gap = $candidate_gap; + $recent_type = $possible_type; + + if ($recent_type === 'mixed') { + return null; + } + + return [$recent_type, $gap, $offset]; + } + } + } + + foreach ($reference_map as $start_pos => [$end_pos, $possible_reference]) { + if ($offset < $start_pos) { + continue; + } + // If the reference precedes a "::" then treat it as a class reference. + if ($offset - $end_pos === 2 && substr($file_contents, $end_pos, 2) === '::') { + return [$possible_reference, '::', $offset]; + } + + // Only continue for references that are partial / don't exist. + if ($possible_reference[0] !== '*') { + continue; + } + + if ($offset - $end_pos === 0) { + $recent_type = $possible_reference; + + return [$recent_type, 'symbol', $offset]; + } + } + + return null; + } + + public function getTypeContextAtPosition(string $file_path, Position $position): ?Union + { + $file_contents = $this->getFileContents($file_path); + $offset = $position->toOffset($file_contents); + + [$reference_map, $type_map, $argument_map] = $this->analyzer->getMapsForFile($file_path); + if (!$reference_map && !$type_map && !$argument_map) { + return null; + } + foreach ($argument_map as $start_pos => [$end_pos, $function, $argument_num]) { + if ($offset < $start_pos || $offset > $end_pos) { + continue; + } + // First parameter to a function-like + $function_storage = $this->getFunctionStorageForSymbol($file_path, $function . '()'); + if (!$function_storage || !$function_storage->params || !isset($function_storage->params[$argument_num])) { + return null; + } + + return $function_storage->params[$argument_num]->type; + } + + return null; + } + + /** + * @return list + */ + public function getCompletionItemsForClassishThing(string $type_string, string $gap): array + { + $completion_items = []; + + $type = Type::parseString($type_string); + + foreach ($type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TNamedObject) { + try { + $class_storage = $this->classlike_storage_provider->get($atomic_type->value); + + foreach ($class_storage->appearing_method_ids as $declaring_method_id) { + $method_storage = $this->methods->getStorage($declaring_method_id); + + if ($method_storage->is_static || $gap === '->') { + $completion_item = new CompletionItem( + $method_storage->cased_name, + CompletionItemKind::METHOD, + (string)$method_storage, + $method_storage->description, + (string)$method_storage->visibility, + $method_storage->cased_name, + $method_storage->cased_name . (count($method_storage->params) !== 0 ? '($0)' : '()'), + null, + null, + new Command('Trigger parameter hints', 'editor.action.triggerParameterHints'), + null, + 2 + ); + + $completion_item->insertTextFormat = InsertTextFormat::SNIPPET; + + $completion_items[] = $completion_item; + } + } + + foreach ($class_storage->declaring_property_ids as $property_name => $declaring_class) { + $property_storage = $this->properties->getStorage( + $declaring_class . '::$' . $property_name + ); + + if ($property_storage->is_static || $gap === '->') { + $completion_items[] = new CompletionItem( + '$' . $property_name, + CompletionItemKind::PROPERTY, + $property_storage->getInfo(), + $property_storage->description, + (string)$property_storage->visibility, + $property_name, + ($gap === '::' ? '$' : '') . $property_name + ); + } + } + + foreach ($class_storage->constants as $const_name => $const) { + $completion_items[] = new CompletionItem( + $const_name, + CompletionItemKind::VARIABLE, + 'const ' . $const_name, + $const->description, + null, + $const_name, + $const_name + ); + } + } catch (Exception $e) { + error_log($e->getMessage()); + continue; + } + } + } + + return $completion_items; + } + + /** + * @return list + */ + public function getCompletionItemsForPartialSymbol( + string $type_string, + int $offset, + string $file_path + ): array { + $fq_suggestion = false; + + if (($type_string[1] ?? '') === '\\') { + $fq_suggestion = true; + } + + $matching_classlike_names = $this->classlikes->getMatchingClassLikeNames($type_string); + + $completion_items = []; + + $file_storage = $this->file_storage_provider->get($file_path); + + $aliases = null; + + foreach ($file_storage->classlikes_in_file as $fq_class_name => $_) { + try { + $class_storage = $this->classlike_storage_provider->get($fq_class_name); + } catch (Exception $e) { + continue; + } + + if (!$class_storage->stmt_location) { + continue; + } + + if ($offset > $class_storage->stmt_location->raw_file_start + && $offset < $class_storage->stmt_location->raw_file_end + ) { + $aliases = $class_storage->aliases; + break; + } + } + + if (!$aliases) { + foreach ($file_storage->namespace_aliases as $namespace_start => $namespace_aliases) { + if ($namespace_start < $offset) { + $aliases = $namespace_aliases; + break; + } + } + + if (!$aliases) { + $aliases = $file_storage->aliases; + } + } + + foreach ($matching_classlike_names as $fq_class_name) { + $extra_edits = []; + + $insertion_text = Type::getStringFromFQCLN( + $fq_class_name, + $aliases && $aliases->namespace ? $aliases->namespace : null, + $aliases->uses_flipped ?? [], + null + ); + + if ($aliases + && !$fq_suggestion + && $aliases->namespace + && $insertion_text === '\\' . $fq_class_name + && $aliases->namespace_first_stmt_start + ) { + $file_contents = $this->getFileContents($file_path); + + $class_name = preg_replace('/^.*\\\/', '', $fq_class_name); + + if ($aliases->uses_end) { + $position = self::getPositionFromOffset($aliases->uses_end, $file_contents); + $extra_edits[] = new TextEdit( + new Range( + $position, + $position + ), + "\n" . 'use ' . $fq_class_name . ';' + ); + } else { + $position = self::getPositionFromOffset($aliases->namespace_first_stmt_start, $file_contents); + $extra_edits[] = new TextEdit( + new Range( + $position, + $position + ), + 'use ' . $fq_class_name . ';' . "\n" . "\n" + ); + } + + $insertion_text = $class_name; + } + + try { + $class_storage = $this->classlike_storage_provider->get($fq_class_name); + $description = $class_storage->description; + } catch (Exception $e) { + $description = null; + } + + $completion_items[] = new CompletionItem( + $fq_class_name, + CompletionItemKind::CLASS_, + null, + $description, + null, + $fq_class_name, + $insertion_text, + null, + $extra_edits + ); + } + + $functions = $this->functions->getMatchingFunctionNames($type_string, $offset, $file_path, $this); + + $namespace_map = []; + if ($aliases) { + $namespace_map += $aliases->uses_flipped; + if ($aliases->namespace) { + $namespace_map[$aliases->namespace] = ''; + } + } + + // Sort the map by longest first, so we replace most specific + // used namespaces first. + ksort($namespace_map); + $namespace_map = array_reverse($namespace_map); + + foreach ($functions as $function_lowercase => $function) { + // Transform FQFN relative to all uses namespaces + $function_name = $function->cased_name; + if (!$function_name) { + continue; + } + $in_namespace_map = false; + foreach ($namespace_map as $namespace_name => $namespace_alias) { + if (strpos($function_lowercase, $namespace_name . '\\') === 0) { + $function_name = $namespace_alias . '\\' . substr($function_name, strlen($namespace_name) + 1); + $in_namespace_map = true; + } + } + // If the function is not use'd, and it's not a global function + // prepend it with a backslash. + if (!$in_namespace_map && strpos($function_name, '\\') !== false) { + $function_name = '\\' . $function_name; + } + $completion_items[] = new CompletionItem( + $function_name, + CompletionItemKind::FUNCTION, + $function->getSignature(false), + $function->description, + null, + $function_name, + $function_name . (count($function->params) !== 0 ? '($0)' : '()'), + null, + null, + new Command('Trigger parameter hints', 'editor.action.triggerParameterHints'), + null, + 2 + ); + } + + return $completion_items; + } + + /** + * @return list + */ + public function getCompletionItemsForType(Union $type): array + { + $completion_items = []; + foreach ($type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TBool) { + $bools = (string) $atomic_type === 'bool' ? ['true', 'false'] : [(string) $atomic_type]; + foreach ($bools as $property_name) { + $completion_items[] = new CompletionItem( + $property_name, + CompletionItemKind::VALUE, + 'bool', + null, + null, + null, + $property_name + ); + } + } elseif ($atomic_type instanceof TLiteralString) { + $completion_items[] = new CompletionItem( + $atomic_type->value, + CompletionItemKind::VALUE, + $atomic_type->getId(), + null, + null, + null, + "'$atomic_type->value'" + ); + } elseif ($atomic_type instanceof TLiteralInt) { + $completion_items[] = new CompletionItem( + (string) $atomic_type->value, + CompletionItemKind::VALUE, + $atomic_type->getId(), + null, + null, + null, + (string) $atomic_type->value + ); + } elseif ($atomic_type instanceof TClassConstant) { + $const = $atomic_type->fq_classlike_name . '::' . $atomic_type->const_name; + $completion_items[] = new CompletionItem( + $const, + CompletionItemKind::VALUE, + $atomic_type->getId(), + null, + null, + null, + $const + ); + } + } + return $completion_items; + } + + /** + * @return list + */ + public function getCompletionItemsForArrayKeys( + string $type_string + ): array { + $completion_items = []; + $type = Type::parseString($type_string); + foreach ($type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TKeyedArray) { + foreach ($atomic_type->properties as $property_name => $property) { + $completion_items[] = new CompletionItem( + (string) $property_name, + CompletionItemKind::PROPERTY, + (string) $property, + null, + null, + null, + "'$property_name'" + ); + } + } + } + return $completion_items; + } + + private static function getPositionFromOffset(int $offset, string $file_contents): Position + { + $file_contents = substr($file_contents, 0, $offset); + + $offsetLength = $offset - strlen($file_contents); + + //PHP 8.0: Argument #3 ($offset) must be contained in argument #1 ($haystack) + if (($textlen = strlen($file_contents)) < $offsetLength) { + $offsetLength = $textlen; + } + + $before_newline_count = strrpos($file_contents, "\n", $offsetLength); + + return new Position( + substr_count($file_contents, "\n"), + $offset - (int)$before_newline_count - 1 + ); + } + + public function addTemporaryFileChanges(string $file_path, string $new_content): void + { + $this->file_provider->addTemporaryFileChanges($file_path, $new_content); + } + + public function removeTemporaryFileChanges(string $file_path): void + { + $this->file_provider->removeTemporaryFileChanges($file_path); + } + + /** + * Checks if type is a subtype of other + * + * Given two types, checks if `$input_type` is a subtype of `$container_type`. + * If you consider `Union` as a set of types, this will tell you + * if `$input_type` is fully contained in `$container_type`, + * + * $input_type ⊆ $container_type + * + * Useful for emitting issues like InvalidArgument, where argument at the call site + * should be a subset of the function parameter type. + */ + public function isTypeContainedByType( + Union $input_type, + Union $container_type + ): bool { + return UnionTypeComparator::isContainedBy($this, $input_type, $container_type); + } + + /** + * Checks if type has any part that is a subtype of other + * + * Given two types, checks if *any part* of `$input_type` is a subtype of `$container_type`. + * If you consider `Union` as a set of types, this will tell you if intersection + * of `$input_type` with `$container_type` is not empty. + * + * $input_type ∩ $container_type ≠ ∅ , e.g. they are not disjoint. + * + * Useful for emitting issues like PossiblyInvalidArgument, where argument at the call + * site should be a subtype of the function parameter type, but it's has some types that are + * not a subtype of the required type. + */ + public function canTypeBeContainedByType( + Union $input_type, + Union $container_type + ): bool { + return UnionTypeComparator::canBeContainedBy($this, $input_type, $container_type); + } + + /** + * Extracts key and value types from a traversable object (or iterable) + * + * Given an iterable type (*but not TArray*) returns a tuple of it's key/value types. + * First element of the tuple holds key type, second has the value type. + * + * Example: + * ```php + * $codebase->getKeyValueParamsForTraversableObject(Type::parseString('iterable')) + * // returns [Union(TInt), Union(TString)] + * ``` + * + * @return array{Union, Union} + */ + public function getKeyValueParamsForTraversableObject(Atomic $type): array + { + $key_type = null; + $value_type = null; + + ForeachAnalyzer::getKeyValueParamsForTraversableObject($type, $this, $key_type, $value_type); + + return [ + $key_type ?? Type::getMixed(), + $value_type ?? Type::getMixed(), + ]; + } + + /** + * @param array $phantom_classes + * @psalm-suppress PossiblyUnusedMethod part of the public API + */ + public function queueClassLikeForScanning( + string $fq_classlike_name, + bool $analyze_too = false, + bool $store_failure = true, + array $phantom_classes = [] + ): void { + $this->scanner->queueClassLikeForScanning($fq_classlike_name, $analyze_too, $store_failure, $phantom_classes); + } + + /** + * @param array $taints + * + * @psalm-suppress PossiblyUnusedMethod + */ + public function addTaintSource( + Union $expr_type, + string $taint_id, + array $taints = TaintKindGroup::ALL_INPUT, + ?CodeLocation $code_location = null + ): void { + if (!$this->taint_flow_graph) { + return; + } + + $source = new TaintSource( + $taint_id, + $taint_id, + $code_location, + null, + $taints + ); + + $this->taint_flow_graph->addSource($source); + + $expr_type->parent_nodes = [ + $source->id => $source, + ]; + } + + /** + * @param array $taints + * + * @psalm-suppress PossiblyUnusedMethod + */ + public function addTaintSink( + string $taint_id, + array $taints = TaintKindGroup::ALL_INPUT, + ?CodeLocation $code_location = null + ): void { + if (!$this->taint_flow_graph) { + return; + } + + $sink = new TaintSink( + $taint_id, + $taint_id, + $code_location, + null, + $taints + ); + + $this->taint_flow_graph->addSink($sink); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Config.php b/vendor/vimeo/psalm/src/Psalm/Config.php new file mode 100644 index 00000000..d9d81bfd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Config.php @@ -0,0 +1,2403 @@ + + */ + public static $ERROR_LEVELS = [ + self::REPORT_INFO, + self::REPORT_ERROR, + self::REPORT_SUPPRESS, + ]; + + /** + * @var array + */ + private const MIXED_ISSUES = [ + 'MixedArgument', + 'MixedArrayAccess', + 'MixedArrayAssignment', + 'MixedArrayOffset', + 'MixedArrayTypeCoercion', + 'MixedAssignment', + 'MixedFunctionCall', + 'MixedInferredReturnType', + 'MixedMethodCall', + 'MixedOperand', + 'MixedPropertyFetch', + 'MixedPropertyAssignment', + 'MixedReturnStatement', + 'MixedStringOffsetAssignment', + 'MixedArgumentTypeCoercion', + 'MixedPropertyTypeCoercion', + 'MixedReturnTypeCoercion', + ]; + + /** + * These are special object classes that allow any and all properties to be get/set on them + * @var array + */ + protected $universal_object_crates = [ + stdClass::class, + SimpleXMLElement::class, + SimpleXMLIterator::class, + ]; + + /** + * @var static|null + */ + private static $instance; + + /** + * Whether or not to use types as defined in docblocks + * + * @var bool + */ + public $use_docblock_types = true; + + /** + * Whether or not to use types as defined in property docblocks. + * This is distinct from the above because you may want to use + * property docblocks, but not function docblocks. + * + * @var bool + */ + public $use_docblock_property_types = false; + + /** + * Whether or not to throw an exception on first error + * + * @var bool + */ + public $throw_exception = false; + + /** + * Whether or not to load Xdebug stub + * + * @deprecated going to be removed in Psalm 5 + * + * @var bool|null + */ + public $load_xdebug_stub; + + /** + * The directory to store PHP Parser (and other) caches + * + * @var string|null + */ + public $cache_directory; + + /** + * The directory to store all Psalm project caches + * + * @var string|null + */ + public $global_cache_directory; + + /** + * Path to the autoader + * + * @var string|null + */ + public $autoloader; + + /** + * @var ProjectFileFilter|null + */ + protected $project_files; + + /** + * @var ProjectFileFilter|null + */ + protected $extra_files; + + /** + * The base directory of this config file + * + * @var string + */ + public $base_dir; + + /** + * The PHP version to assume as declared in the config file + * + * @var string|null + */ + private $configured_php_version; + + /** + * @var array + */ + private $file_extensions = ['php']; + + /** + * @var array> + */ + private $filetype_scanners = []; + + /** + * @var array> + */ + private $filetype_analyzers = []; + + /** + * @var array + */ + private $filetype_scanner_paths = []; + + /** + * @var array + */ + private $filetype_analyzer_paths = []; + + /** + * @var array + */ + private $issue_handlers = []; + + /** + * @var array + */ + private $mock_classes = []; + + /** + * @var array + */ + private $preloaded_stub_files = []; + + /** + * @var array + */ + private $stub_files = []; + + /** + * @var bool + */ + public $hide_external_errors = false; + + /** @var bool */ + public $allow_includes = true; + + /** @var 1|2|3|4|5|6|7|8 */ + public $level = 1; + + /** + * @var ?bool + */ + public $show_mixed_issues; + + /** @var bool */ + public $strict_binary_operands = false; + + /** + * @var bool + */ + public $remember_property_assignments_after_call = true; + + /** @var bool */ + public $use_igbinary = false; + + /** + * @var bool + */ + public $allow_phpstorm_generics = false; + + /** + * @var bool + */ + public $allow_string_standin_for_class = false; + + /** + * @var bool + */ + public $disable_suppress_all = false; + + /** + * @var bool + */ + public $use_phpdoc_method_without_magic_or_parent = false; + + /** + * @var bool + */ + public $use_phpdoc_property_without_magic_or_parent = false; + + /** + * @var bool + */ + public $skip_checks_on_unresolvable_includes = false; + + /** + * @var bool + */ + public $seal_all_methods = false; + + /** + * @var bool + */ + public $seal_all_properties = false; + + /** + * @var bool + */ + public $memoize_method_calls = false; + + /** + * @var bool + */ + public $hoist_constants = false; + + /** + * @var bool + */ + public $add_param_default_to_docblock_type = false; + + /** + * @var bool + */ + public $disable_var_parsing = false; + + /** + * @var bool + */ + public $check_for_throws_docblock = false; + + /** + * @var bool + */ + public $check_for_throws_in_global_scope = false; + + /** + * @var bool + */ + public $ignore_internal_falsable_issues = true; + + /** + * @var bool + */ + public $ignore_internal_nullable_issues = true; + + /** + * @var array + */ + public $ignored_exceptions = []; + + /** + * @var array + */ + public $ignored_exceptions_in_global_scope = []; + + /** + * @var array + */ + public $ignored_exceptions_and_descendants = []; + + /** + * @var array + */ + public $ignored_exceptions_and_descendants_in_global_scope = []; + + /** + * @var bool + */ + public $infer_property_types_from_constructor = true; + + /** + * @var bool + */ + public $ensure_array_string_offsets_exist = false; + + /** + * @var bool + */ + public $ensure_array_int_offsets_exist = false; + + /** + * @var array + */ + public $forbidden_functions = []; + + /** + * @var bool + */ + public $forbid_echo = false; + + /** + * @var bool + */ + public $find_unused_code = false; + + /** + * @var bool + */ + public $find_unused_variables = false; + + /** + * @var bool + */ + public $find_unused_psalm_suppress = false; + + /** + * @var bool + */ + public $run_taint_analysis = false; + + /** @var bool */ + public $use_phpstorm_meta_path = true; + + /** + * @var bool + */ + public $resolve_from_config_file = true; + + /** + * @var bool + */ + public $restrict_return_types = false; + + /** + * @var bool + */ + public $limit_method_complexity = false; + + /** + * @var int + */ + public $max_graph_size = 200; + + /** + * @var int + */ + public $max_avg_path_length = 70; + + /** + * @var int + */ + public $max_shaped_array_size = 100; + + /** + * @var string[] + */ + public $plugin_paths = []; + + /** + * @var array + */ + private $plugin_classes = []; + + /** + * @var bool + */ + public $allow_internal_named_arg_calls = true; + + /** + * @var bool + */ + public $allow_named_arg_calls = true; + + /** @var array */ + private $predefined_constants = []; + + /** @var array */ + private $predefined_functions = []; + + /** @var ClassLoader|null */ + private $composer_class_loader; + + /** + * Custom functions that always exit + * + * @var array + */ + public $exit_functions = []; + + /** + * @var string + */ + public $hash = ''; + + /** @var string|null */ + public $error_baseline; + + /** + * @var bool + */ + public $include_php_versions_in_error_baseline = false; + + /** @var string */ + public $shepherd_host = 'shepherd.dev'; + + /** + * @var array + */ + public $globals = []; + + /** + * @var int + */ + public $max_string_length = 1000; + + /** @var ?IncludeCollector */ + private $include_collector; + + /** + * @var TaintAnalysisFileFilter|null + */ + protected $taint_analysis_ignored_files; + + /** + * @var bool whether to emit a backtrace of emitted issues to stderr + */ + public $debug_emitted_issues = false; + + /** + * @var bool + */ + private $report_info = true; + + /** + * @var EventDispatcher + */ + public $eventDispatcher; + + /** @var list */ + public $config_issues = []; + + /** + * @var 'default'|'never'|'always' + */ + public $trigger_error_exits = 'default'; + + /** + * @var string[] + */ + public $internal_stubs = []; + + /** @var ?int */ + public $threads; + + protected function __construct() + { + self::$instance = $this; + $this->eventDispatcher = new EventDispatcher(); + } + + /** + * Gets a Config object from an XML file. + * + * Searches up a folder hierarchy for the most immediate config. + * + * @throws ConfigException if a config path is not found + * + */ + public static function getConfigForPath(string $path, string $current_dir): Config + { + $config_path = self::locateConfigFile($path); + + if (!$config_path) { + throw new ConfigNotFoundException('Config not found for path ' . $path); + } + + return self::loadFromXMLFile($config_path, $current_dir); + } + + /** + * Searches up a folder hierarchy for the most immediate config. + * + * @throws ConfigException + * + */ + public static function locateConfigFile(string $path): ?string + { + $dir_path = realpath($path); + + if ($dir_path === false) { + throw new ConfigNotFoundException('Config not found for path ' . $path); + } + + if (!is_dir($dir_path)) { + $dir_path = dirname($dir_path); + } + + do { + $maybe_path = $dir_path . DIRECTORY_SEPARATOR . self::DEFAULT_FILE_NAME; + + if (file_exists($maybe_path) || file_exists($maybe_path .= '.dist')) { + return $maybe_path; + } + + $dir_path = dirname($dir_path); + } while (dirname($dir_path) !== $dir_path); + + return null; + } + + /** + * Creates a new config object from the file + */ + public static function loadFromXMLFile(string $file_path, string $current_dir): Config + { + $file_contents = file_get_contents($file_path); + + $base_dir = dirname($file_path) . DIRECTORY_SEPARATOR; + + if ($file_contents === false) { + throw new InvalidArgumentException('Cannot open ' . $file_path); + } + + if ($file_contents === '') { + throw new InvalidArgumentException('Invalid empty file ' . $file_path); + } + + try { + $config = self::loadFromXML($base_dir, $file_contents, $current_dir, $file_path); + $config->hash = sha1($file_contents . PSALM_VERSION); + } catch (ConfigException $e) { + throw new ConfigException( + 'Problem parsing ' . $file_path . ":\n" . ' ' . $e->getMessage() + ); + } + + return $config; + } + + /** + * Computes the hash to use for a cache folder from CLI flags and from the config file's xml contents + */ + public function computeHash(): string + { + return sha1($this->hash . ':' . $this->level); + } + + /** + * Creates a new config object from an XML string + * @param string|null $current_dir Current working directory, if different to $base_dir + * @param non-empty-string $file_contents + * + * @throws ConfigException + */ + public static function loadFromXML( + string $base_dir, + string $file_contents, + ?string $current_dir = null, + ?string $file_path = null + ): Config { + if ($current_dir === null) { + $current_dir = $base_dir; + } + + self::validateXmlConfig($base_dir, $file_contents); + + return self::fromXmlAndPaths($base_dir, $file_contents, $current_dir, $file_path); + } + + /** + * @param non-empty-string $file_contents + */ + private static function loadDomDocument(string $base_dir, string $file_contents): DOMDocument + { + $dom_document = new DOMDocument(); + + // there's no obvious way to set xml:base for a document when loading it from string + // so instead we're changing the current directory instead to be able to process XIncludes + $oldpwd = getcwd(); + chdir($base_dir); + + $dom_document->loadXML($file_contents, LIBXML_NONET); + $dom_document->xinclude(LIBXML_NOWARNING | LIBXML_NONET); + + chdir($oldpwd); + return $dom_document; + } + + /** + * @param non-empty-string $file_contents + * + * @throws ConfigException + */ + private static function validateXmlConfig(string $base_dir, string $file_contents): void + { + $schema_path = dirname(__DIR__, 2). '/config.xsd'; + + if (!file_exists($schema_path)) { + throw new ConfigException('Cannot locate config schema'); + } + + // Enable user error handling + $prev_xml_internal_errors = libxml_use_internal_errors(true); + libxml_clear_errors(); + + $dom_document = self::loadDomDocument($base_dir, $file_contents); + + $psalm_nodes = $dom_document->getElementsByTagName('psalm'); + + /** @var DomElement|null */ + $psalm_node = $psalm_nodes->item(0); + + if (!$psalm_node) { + throw new ConfigException( + 'Missing psalm node' + ); + } + + if (!$psalm_node->hasAttribute('xmlns')) { + $psalm_node->setAttribute('xmlns', self::CONFIG_NAMESPACE); + + $old_dom_document = $dom_document; + $old_file_contents = $old_dom_document->saveXML(); + assert($old_file_contents !== false && $old_file_contents !== ''); + $dom_document = self::loadDomDocument($base_dir, $old_file_contents); + } + + $dom_document->schemaValidate($schema_path); // If it returns false it will generate errors handled below + + $errors = libxml_get_errors(); + libxml_clear_errors(); + libxml_use_internal_errors($prev_xml_internal_errors); + foreach ($errors as $error) { + if ($error->level === LIBXML_ERR_FATAL || $error->level === LIBXML_ERR_ERROR) { + throw new ConfigException( + 'Error on line ' . $error->line . ":\n" . ' ' . $error->message + ); + } + } + } + + /** + * @param positive-int $line_number 1-based line number + * @return int 0-based byte offset + * @throws OutOfBoundsException + */ + private static function lineNumberToByteOffset(string $string, int $line_number): int + { + if ($line_number === 1) { + return 0; + } + + $offset = 0; + + for ($i = 0; $i < $line_number - 1; $i++) { + $newline_offset = strpos($string, "\n", $offset); + if (false === $newline_offset) { + throw new OutOfBoundsException( + 'Line ' . $line_number . ' is not found in a string with ' . ($i + 1) . ' lines' + ); + } + $offset = $newline_offset + 1; + } + + if ($offset > strlen($string)) { + throw new OutOfBoundsException('Line ' . $line_number . ' is not found'); + } + + return $offset; + } + + private static function processConfigDeprecations( + self $config, + DOMDocument $dom_document, + string $file_contents, + string $config_path + ): void { + $config->config_issues = []; + + // Attributes to be removed in Psalm 5 + $deprecated_attributes = [ + 'allowCoercionFromStringToClassConst', + 'allowPhpStormGenerics', + 'forbidEcho', + 'loadXdebugStub', + 'totallyTyped' + ]; + + $deprecated_elements = [ + 'exitFunctions', + ]; + + $psalm_element_item = $dom_document->getElementsByTagName('psalm')->item(0); + assert($psalm_element_item !== null); + $attributes = $psalm_element_item->attributes; + + foreach ($attributes as $attribute) { + if (in_array($attribute->name, $deprecated_attributes, true)) { + $line = $attribute->getLineNo(); + assert($line > 0); // getLineNo() always returns non-zero for nodes loaded from file + + $offset = self::lineNumberToByteOffset($file_contents, $line); + $attribute_start = strrpos($file_contents, $attribute->name, $offset - strlen($file_contents)) ?: 0; + $attribute_end = $attribute_start + strlen($attribute->name) - 1; + + $config->config_issues[] = new ConfigIssue( + 'Attribute "' . $attribute->name . '" is deprecated ' + . 'and is going to be removed in the next major version', + new Raw( + $file_contents, + $config_path, + basename($config_path), + $attribute_start, + $attribute_end + ) + ); + } + } + + foreach ($deprecated_elements as $deprecated_element) { + $deprecated_elements_xml = $dom_document->getElementsByTagNameNS( + self::CONFIG_NAMESPACE, + $deprecated_element + ); + if ($deprecated_elements_xml->length) { + $deprecated_element_xml = $deprecated_elements_xml->item(0); + assert($deprecated_element_xml !== null); + $line = $deprecated_element_xml->getLineNo(); + assert($line > 0); + + $offset = self::lineNumberToByteOffset($file_contents, $line); + $element_start = strpos($file_contents, $deprecated_element, $offset) ?: 0; + $element_end = $element_start + strlen($deprecated_element) - 1; + + $config->config_issues[] = new ConfigIssue( + 'Element "' . $deprecated_element . '" is deprecated ' + . 'and is going to be removed in the next major version', + new Raw( + $file_contents, + $config_path, + basename($config_path), + $element_start, + $element_end + ) + ); + } + } + } + + /** + * @param non-empty-string $file_contents + * + * @psalm-suppress MixedMethodCall + * @psalm-suppress MixedAssignment + * @psalm-suppress MixedArgument + * @psalm-suppress MixedPropertyFetch + * + * @throws ConfigException + */ + private static function fromXmlAndPaths( + string $base_dir, + string $file_contents, + string $current_dir, + ?string $config_path + ): self { + $config = new static(); + + $dom_document = self::loadDomDocument($base_dir, $file_contents); + + if (null !== $config_path) { + self::processConfigDeprecations( + $config, + $dom_document, + $file_contents, + $config_path + ); + } + + $config_xml = simplexml_import_dom($dom_document); + + $booleanAttributes = [ + 'useDocblockTypes' => 'use_docblock_types', + 'useDocblockPropertyTypes' => 'use_docblock_property_types', + 'throwExceptionOnError' => 'throw_exception', + 'hideExternalErrors' => 'hide_external_errors', + 'resolveFromConfigFile' => 'resolve_from_config_file', + 'allowFileIncludes' => 'allow_includes', + 'strictBinaryOperands' => 'strict_binary_operands', + 'rememberPropertyAssignmentsAfterCall' => 'remember_property_assignments_after_call', + 'disableVarParsing' => 'disable_var_parsing', + 'allowPhpStormGenerics' => 'allow_phpstorm_generics', + 'allowStringToStandInForClass' => 'allow_string_standin_for_class', + 'disableSuppressAll' => 'disable_suppress_all', + 'usePhpDocMethodsWithoutMagicCall' => 'use_phpdoc_method_without_magic_or_parent', + 'usePhpDocPropertiesWithoutMagicCall' => 'use_phpdoc_property_without_magic_or_parent', + 'memoizeMethodCallResults' => 'memoize_method_calls', + 'hoistConstants' => 'hoist_constants', + 'addParamDefaultToDocblockType' => 'add_param_default_to_docblock_type', + 'checkForThrowsDocblock' => 'check_for_throws_docblock', + 'checkForThrowsInGlobalScope' => 'check_for_throws_in_global_scope', + 'forbidEcho' => 'forbid_echo', + 'ignoreInternalFunctionFalseReturn' => 'ignore_internal_falsable_issues', + 'ignoreInternalFunctionNullReturn' => 'ignore_internal_nullable_issues', + 'includePhpVersionsInErrorBaseline' => 'include_php_versions_in_error_baseline', + 'loadXdebugStub' => 'load_xdebug_stub', + 'ensureArrayStringOffsetsExist' => 'ensure_array_string_offsets_exist', + 'ensureArrayIntOffsetsExist' => 'ensure_array_int_offsets_exist', + 'reportMixedIssues' => 'show_mixed_issues', + 'skipChecksOnUnresolvableIncludes' => 'skip_checks_on_unresolvable_includes', + 'sealAllMethods' => 'seal_all_methods', + 'sealAllProperties' => 'seal_all_properties', + 'runTaintAnalysis' => 'run_taint_analysis', + 'usePhpStormMetaPath' => 'use_phpstorm_meta_path', + 'allowInternalNamedArgumentsCalls' => 'allow_internal_named_arg_calls', + 'allowNamedArgumentCalls' => 'allow_named_arg_calls', + 'findUnusedPsalmSuppress' => 'find_unused_psalm_suppress', + 'reportInfo' => 'report_info', + 'restrictReturnTypes' => 'restrict_return_types', + 'limitMethodComplexity' => 'limit_method_complexity', + ]; + + foreach ($booleanAttributes as $xmlName => $internalName) { + if (isset($config_xml[$xmlName])) { + $attribute_text = (string) $config_xml[$xmlName]; + $config->setBooleanAttribute( + $internalName, + $attribute_text === 'true' || $attribute_text === '1' + ); + } + } + + if ($config->resolve_from_config_file) { + $config->base_dir = $base_dir; + } else { + $config->base_dir = $current_dir; + $base_dir = $current_dir; + } + + if (isset($config_xml['phpVersion'])) { + $config->configured_php_version = (string) $config_xml['phpVersion']; + } + + if (isset($config_xml['autoloader'])) { + $autoloader_path = $config->base_dir . DIRECTORY_SEPARATOR . $config_xml['autoloader']; + + if (!file_exists($autoloader_path)) { + throw new ConfigException('Cannot locate autoloader'); + } + + $config->autoloader = realpath($autoloader_path); + } + + if (isset($config_xml['cacheDirectory'])) { + $config->cache_directory = (string)$config_xml['cacheDirectory']; + } elseif ($user_cache_dir = (new Xdg())->getHomeCacheDir()) { + $config->cache_directory = $user_cache_dir . '/psalm'; + } else { + $config->cache_directory = sys_get_temp_dir() . '/psalm'; + } + + $config->global_cache_directory = $config->cache_directory; + + $config->cache_directory .= DIRECTORY_SEPARATOR . sha1($base_dir); + + $cwd = null; + + if ($config->resolve_from_config_file) { + $cwd = getcwd(); + chdir($config->base_dir); + } + + if (is_dir($config->cache_directory) === false && @mkdir($config->cache_directory, 0777, true) === false) { + error_log('Could not create cache directory: ' . $config->cache_directory); + } + + if ($cwd) { + chdir($cwd); + } + + if (isset($config_xml['serializer'])) { + $attribute_text = (string) $config_xml['serializer']; + $config->use_igbinary = $attribute_text === 'igbinary'; + } elseif ($igbinary_version = phpversion('igbinary')) { + $config->use_igbinary = version_compare($igbinary_version, '2.0.5') >= 0; + } + + + if (isset($config_xml['findUnusedCode'])) { + $attribute_text = (string) $config_xml['findUnusedCode']; + $config->find_unused_code = $attribute_text === 'true' || $attribute_text === '1'; + $config->find_unused_variables = $config->find_unused_code; + } + + if (isset($config_xml['findUnusedVariablesAndParams'])) { + $attribute_text = (string) $config_xml['findUnusedVariablesAndParams']; + $config->find_unused_variables = $attribute_text === 'true' || $attribute_text === '1'; + } + + if (isset($config_xml['errorLevel'])) { + $attribute_text = (int) $config_xml['errorLevel']; + + if (!in_array($attribute_text, [1, 2, 3, 4, 5, 6, 7, 8], true)) { + throw new ConfigException( + 'Invalid error level ' . $config_xml['errorLevel'] + ); + } + + $config->level = $attribute_text; + } elseif (isset($config_xml['totallyTyped'])) { + $totally_typed = (string) $config_xml['totallyTyped']; + + if ($totally_typed === 'true' || $totally_typed === '1') { + $config->level = 1; + } else { + $config->level = 2; + + if ($config->show_mixed_issues === null) { + $config->show_mixed_issues = false; + } + } + } else { + $config->level = 2; + } + + // turn on unused variable detection in level 1 + if (!isset($config_xml['findUnusedCode']) + && !isset($config_xml['findUnusedVariablesAndParams']) + && $config->level === 1 + && $config->show_mixed_issues !== false + ) { + $config->find_unused_variables = true; + } + + if (isset($config_xml['errorBaseline'])) { + $attribute_text = (string) $config_xml['errorBaseline']; + $config->error_baseline = $attribute_text; + } + + if (isset($config_xml['maxStringLength'])) { + $attribute_text = (int)$config_xml['maxStringLength']; + $config->max_string_length = $attribute_text; + } + + if (isset($config_xml['maxShapedArraySize'])) { + $attribute_text = (int)$config_xml['maxShapedArraySize']; + $config->max_shaped_array_size = $attribute_text; + } + + if (isset($config_xml['inferPropertyTypesFromConstructor'])) { + $attribute_text = (string) $config_xml['inferPropertyTypesFromConstructor']; + $config->infer_property_types_from_constructor = $attribute_text === 'true' || $attribute_text === '1'; + } + + if (isset($config_xml['triggerErrorExits'])) { + $attribute_text = (string) $config_xml['triggerErrorExits']; + if ($attribute_text === 'always' || $attribute_text === 'never') { + $config->trigger_error_exits = $attribute_text; + } + } + + if (isset($config_xml->projectFiles)) { + $config->project_files = ProjectFileFilter::loadFromXMLElement($config_xml->projectFiles, $base_dir, true); + } + + if (isset($config_xml->extraFiles)) { + $config->extra_files = ProjectFileFilter::loadFromXMLElement($config_xml->extraFiles, $base_dir, true); + } + + if (isset($config_xml->taintAnalysis->ignoreFiles)) { + $config->taint_analysis_ignored_files = TaintAnalysisFileFilter::loadFromXMLElement( + $config_xml->taintAnalysis->ignoreFiles, + $base_dir, + false + ); + } + + if (isset($config_xml->fileExtensions)) { + $config->file_extensions = []; + + $config->loadFileExtensions($config_xml->fileExtensions->extension); + } + + if (isset($config_xml->mockClasses) && isset($config_xml->mockClasses->class)) { + /** @var SimpleXMLElement $mock_class */ + foreach ($config_xml->mockClasses->class as $mock_class) { + $config->mock_classes[] = strtolower((string)$mock_class['name']); + } + } + + if (isset($config_xml->universalObjectCrates) && isset($config_xml->universalObjectCrates->class)) { + /** @var SimpleXMLElement $universal_object_crate */ + foreach ($config_xml->universalObjectCrates->class as $universal_object_crate) { + /** @var string $classString */ + $classString = $universal_object_crate['name']; + $config->addUniversalObjectCrate($classString); + } + } + + if (isset($config_xml->ignoreExceptions)) { + if (isset($config_xml->ignoreExceptions->class)) { + /** @var SimpleXMLElement $exception_class */ + foreach ($config_xml->ignoreExceptions->class as $exception_class) { + $exception_name = (string) $exception_class['name']; + $global_attribute_text = (string) $exception_class['onlyGlobalScope']; + if ($global_attribute_text !== 'true' && $global_attribute_text !== '1') { + $config->ignored_exceptions[$exception_name] = true; + } + $config->ignored_exceptions_in_global_scope[$exception_name] = true; + } + } + if (isset($config_xml->ignoreExceptions->classAndDescendants)) { + /** @var SimpleXMLElement $exception_class */ + foreach ($config_xml->ignoreExceptions->classAndDescendants as $exception_class) { + $exception_name = (string) $exception_class['name']; + $global_attribute_text = (string) $exception_class['onlyGlobalScope']; + if ($global_attribute_text !== 'true' && $global_attribute_text !== '1') { + $config->ignored_exceptions_and_descendants[$exception_name] = true; + } + $config->ignored_exceptions_and_descendants_in_global_scope[$exception_name] = true; + } + } + } + + if (isset($config_xml->forbiddenFunctions) && isset($config_xml->forbiddenFunctions->function)) { + /** @var SimpleXMLElement $forbidden_function */ + foreach ($config_xml->forbiddenFunctions->function as $forbidden_function) { + $config->forbidden_functions[strtolower((string) $forbidden_function['name'])] = true; + } + } + + if (isset($config_xml->exitFunctions) && isset($config_xml->exitFunctions->function)) { + /** @var SimpleXMLElement $exit_function */ + foreach ($config_xml->exitFunctions->function as $exit_function) { + $config->exit_functions[strtolower((string) $exit_function['name'])] = true; + } + } + + if (isset($config_xml->stubs) && isset($config_xml->stubs->file)) { + /** @var SimpleXMLElement $stub_file */ + foreach ($config_xml->stubs->file as $stub_file) { + $stub_file_name = (string)$stub_file['name']; + if (!Path::isAbsolute($stub_file_name)) { + $stub_file_name = $config->base_dir . DIRECTORY_SEPARATOR . $stub_file_name; + } + $file_path = realpath($stub_file_name); + + if (!$file_path) { + throw new ConfigException( + 'Cannot resolve stubfile path ' + . rtrim($config->base_dir, DIRECTORY_SEPARATOR) + . DIRECTORY_SEPARATOR + . $stub_file['name'] + ); + } + + if (isset($stub_file['preloadClasses'])) { + $preload_classes = (string)$stub_file['preloadClasses']; + + if ($preload_classes === 'true' || $preload_classes === '1') { + $config->addPreloadedStubFile($file_path); + } else { + $config->addStubFile($file_path); + } + } else { + $config->addStubFile($file_path); + } + } + } + + // this plugin loading system borrows heavily from etsy/phan + if (isset($config_xml->plugins)) { + if (isset($config_xml->plugins->plugin)) { + /** @var SimpleXMLElement $plugin */ + foreach ($config_xml->plugins->plugin as $plugin) { + $plugin_file_name = (string) $plugin['filename']; + + $path = Path::isAbsolute($plugin_file_name) + ? $plugin_file_name + : $config->base_dir . $plugin_file_name; + + $config->addPluginPath($path); + } + } + if (isset($config_xml->plugins->pluginClass)) { + /** @var SimpleXMLElement $plugin */ + foreach ($config_xml->plugins->pluginClass as $plugin) { + $plugin_class_name = $plugin['class']; + // any child elements are used as plugin configuration + $plugin_config = null; + if ($plugin->count()) { + $plugin_config = $plugin->children(); + } + + $config->addPluginClass((string) $plugin_class_name, $plugin_config); + } + } + } + + if (isset($config_xml->issueHandlers)) { + foreach ($config_xml->issueHandlers as $issue_handlers) { + /** @var SimpleXMLElement $issue_handler */ + foreach ($issue_handlers->children() as $key => $issue_handler) { + if ($key === 'PluginIssue') { + $custom_class_name = (string) $issue_handler['name']; + /** @var string $key */ + $config->issue_handlers[$custom_class_name] = IssueHandler::loadFromXMLElement( + $issue_handler, + $base_dir + ); + } else { + /** @var string $key */ + $config->issue_handlers[$key] = IssueHandler::loadFromXMLElement( + $issue_handler, + $base_dir + ); + } + } + } + } + + if (isset($config_xml->globals) && isset($config_xml->globals->var)) { + /** @var SimpleXMLElement $var */ + foreach ($config_xml->globals->var as $var) { + $config->globals['$' . (string) $var['name']] = (string) $var['type']; + } + } + + if (isset($config_xml['threads'])) { + $config->threads = (int)$config_xml['threads']; + } + + return $config; + } + + public static function getInstance(): Config + { + if (self::$instance) { + return self::$instance; + } + + throw new UnexpectedValueException('No config initialized'); + } + + public function setComposerClassLoader(?ClassLoader $loader = null): void + { + $this->composer_class_loader = $loader; + } + + public function setAdvancedErrorLevel(string $issue_key, array $config, ?string $default_error_level = null): void + { + $this->issue_handlers[$issue_key] = new IssueHandler(); + if ($default_error_level !== null) { + $this->issue_handlers[$issue_key]->setErrorLevel($default_error_level); + } + $this->issue_handlers[$issue_key]->setCustomLevels($config, $this->base_dir); + } + + public function setCustomErrorLevel(string $issue_key, string $error_level): void + { + $this->issue_handlers[$issue_key] = new IssueHandler(); + $this->issue_handlers[$issue_key]->setErrorLevel($error_level); + } + + /** + * @throws ConfigException if a Config file could not be found + * + */ + private function loadFileExtensions(SimpleXMLElement $extensions): void + { + foreach ($extensions as $extension) { + $extension_name = preg_replace('/^\.?/', '', (string)$extension['name']); + $this->file_extensions[] = $extension_name; + + if (isset($extension['scanner'])) { + $path = $this->base_dir . (string)$extension['scanner']; + + if (!file_exists($path)) { + throw new ConfigException('Error parsing config: cannot find file ' . $path); + } + + $this->filetype_scanner_paths[$extension_name] = $path; + } + + if (isset($extension['checker'])) { + $path = $this->base_dir . (string)$extension['checker']; + + if (!file_exists($path)) { + throw new ConfigException('Error parsing config: cannot find file ' . $path); + } + + $this->filetype_analyzer_paths[$extension_name] = $path; + } + } + } + + public function addPluginPath(string $path): void + { + if (!file_exists($path)) { + throw new InvalidArgumentException('Cannot find plugin file ' . $path); + } + + $this->plugin_paths[] = $path; + } + + public function addPluginClass(string $class_name, ?SimpleXMLElement $plugin_config = null): void + { + $this->plugin_classes[] = ['class' => $class_name, 'config' => $plugin_config]; + } + + /** @return array */ + public function getPluginClasses(): array + { + return $this->plugin_classes; + } + + /** + * Initialises all the plugins (done once the config is fully loaded) + */ + public function initializePlugins(ProjectAnalyzer $project_analyzer): void + { + $codebase = $project_analyzer->getCodebase(); + + $project_analyzer->progress->debug('Initializing plugins...' . PHP_EOL); + + $socket = new PluginRegistrationSocket($this, $codebase); + // initialize plugin classes earlier to let them hook into subsequent load process + foreach ($this->plugin_classes as $plugin_class_entry) { + $plugin_class_name = $plugin_class_entry['class']; + $plugin_config = $plugin_class_entry['config']; + + try { + // Below will attempt to load plugins from the project directory first. + // Failing that, it will use registered autoload chain, which will load + // plugins from Psalm directory or phar file. If that fails as well, it + // will fall back to project autoloader. It may seem that the last step + // will always fail, but it's only true if project uses Composer autoloader + if ($this->composer_class_loader + && ($plugin_class_path = $this->composer_class_loader->findFile($plugin_class_name)) + ) { + $project_analyzer->progress->debug( + 'Loading plugin ' . $plugin_class_name . ' via require' . PHP_EOL + ); + + self::requirePath($plugin_class_path); + } else { + if (!class_exists($plugin_class_name)) { + throw new UnexpectedValueException($plugin_class_name . ' is not a known class'); + } + } + + /** + * @psalm-suppress InvalidStringClass + * + * @var PluginEntryPointInterface + */ + $plugin_object = new $plugin_class_name; + $plugin_object($socket, $plugin_config); + } catch (Throwable $e) { + throw new ConfigException('Failed to load plugin ' . $plugin_class_name, 0, $e); + } + + $project_analyzer->progress->debug('Loaded plugin ' . $plugin_class_name . ' successfully' . PHP_EOL); + } + + foreach ($this->filetype_scanner_paths as $extension => $path) { + $fq_class_name = $this->getPluginClassForPath( + $codebase, + $path, + FileScanner::class + ); + + self::requirePath($path); + + $this->filetype_scanners[$extension] = $fq_class_name; + } + + foreach ($this->filetype_analyzer_paths as $extension => $path) { + $fq_class_name = $this->getPluginClassForPath( + $codebase, + $path, + FileAnalyzer::class + ); + + self::requirePath($path); + + $this->filetype_analyzers[$extension] = $fq_class_name; + } + + foreach ($this->plugin_paths as $path) { + try { + $plugin_object = new FileBasedPluginAdapter($path, $this, $codebase); + $plugin_object($socket); + } catch (Throwable $e) { + throw new ConfigException('Failed to load plugin ' . $path, 0, $e); + } + } + // populate additional aspects after plugins have been initialized + foreach ($socket->getAdditionalFileExtensions() as $fileExtension) { + $this->file_extensions[] = $fileExtension; + } + foreach ($socket->getAdditionalFileTypeScanners() as $extension => $className) { + $this->filetype_scanners[$extension] = $className; + } + foreach ($socket->getAdditionalFileTypeAnalyzers() as $extension => $className) { + $this->filetype_analyzers[$extension] = $className; + } + + new HtmlFunctionTainter(); + + $socket->registerHooksFromClass(HtmlFunctionTainter::class); + } + + private static function requirePath(string $path): void + { + /** @psalm-suppress UnresolvableInclude */ + require_once($path); + } + + /** + * @template T + * + * @param T::class $must_extend + * + * @return class-string + */ + private function getPluginClassForPath(Codebase $codebase, string $path, string $must_extend): string + { + $file_storage = $codebase->createFileStorageForPath($path); + $file_to_scan = new FileScanner($path, $this->shortenFileName($path), true); + $file_to_scan->scan( + $codebase, + $file_storage + ); + + $declared_classes = ClassLikeAnalyzer::getClassesForFile($codebase, $path); + + if (!count($declared_classes)) { + throw new InvalidArgumentException( + 'Plugins must have at least one class in the file - ' . $path . ' has ' . + count($declared_classes) + ); + } + + $fq_class_name = reset($declared_classes); + + if (!$codebase->classlikes->classExtends( + $fq_class_name, + $must_extend + ) + ) { + throw new InvalidArgumentException( + 'This plugin must extend ' . $must_extend . ' - ' . $path . ' does not' + ); + } + + /** + * @var class-string + */ + return $fq_class_name; + } + + public function shortenFileName(string $to): string + { + if (!is_file($to)) { + return preg_replace('/^' . preg_quote($this->base_dir, '/') . '/', '', $to); + } + + $from = $this->base_dir; + + // some compatibility fixes for Windows paths + $from = is_dir($from) ? rtrim($from, '\/') . '/' : $from; + $to = is_dir($to) ? rtrim($to, '\/') . '/' : $to; + $from = str_replace('\\', '/', $from); + $to = str_replace('\\', '/', $to); + + $from = explode('/', $from); + $to = explode('/', $to); + $relPath = $to; + + foreach ($from as $depth => $dir) { + // find first non-matching dir + if ($dir === $to[$depth]) { + // ignore this directory + array_shift($relPath); + } else { + // get number of remaining dirs to $from + $remaining = count($from) - $depth; + if ($remaining > 1) { + // add traversals up to first matching dir + $padLength = (count($relPath) + $remaining - 1) * -1; + $relPath = array_pad($relPath, $padLength, '..'); + break; + } + } + } + + return implode('/', $relPath); + } + + public function reportIssueInFile(string $issue_type, string $file_path): bool + { + if (($this->show_mixed_issues === false || $this->level > 2) + && in_array($issue_type, self::MIXED_ISSUES, true) + ) { + return false; + } + + if ($this->mustBeIgnored($file_path)) { + return false; + } + + $dependent_files = [strtolower($file_path) => $file_path]; + + $project_analyzer = ProjectAnalyzer::getInstance(); + + $codebase = $project_analyzer->getCodebase(); + + if (!$this->hide_external_errors) { + try { + $file_storage = $codebase->file_storage_provider->get($file_path); + $dependent_files += $file_storage->required_by_file_paths; + } catch (InvalidArgumentException $e) { + // do nothing + } + } + + $any_file_path_matched = false; + + foreach ($dependent_files as $dependent_file_path) { + if (((!$project_analyzer->full_run && $codebase->analyzer->canReportIssues($dependent_file_path)) + || $project_analyzer->canReportIssues($dependent_file_path)) + && ($file_path === $dependent_file_path || !$this->mustBeIgnored($dependent_file_path)) + ) { + $any_file_path_matched = true; + break; + } + } + + if (!$any_file_path_matched) { + return false; + } + + if ($this->getReportingLevelForFile($issue_type, $file_path) === self::REPORT_SUPPRESS) { + return false; + } + + return true; + } + + public function isInProjectDirs(string $file_path): bool + { + return $this->project_files && $this->project_files->allows($file_path); + } + + public function isInExtraDirs(string $file_path): bool + { + return $this->extra_files && $this->extra_files->allows($file_path); + } + + public function mustBeIgnored(string $file_path): bool + { + return $this->project_files && $this->project_files->forbids($file_path); + } + + public function trackTaintsInPath(string $file_path): bool + { + return !$this->taint_analysis_ignored_files + || $this->taint_analysis_ignored_files->allows($file_path); + } + + public function getReportingLevelForIssue(CodeIssue $e): string + { + $fqcn_parts = explode('\\', get_class($e)); + $issue_type = array_pop($fqcn_parts); + + $reporting_level = null; + + if ($e instanceof ClassIssue) { + $reporting_level = $this->getReportingLevelForClass($issue_type, $e->fq_classlike_name); + } elseif ($e instanceof MethodIssue) { + $reporting_level = $this->getReportingLevelForMethod($issue_type, $e->method_id); + } elseif ($e instanceof FunctionIssue) { + $reporting_level = $this->getReportingLevelForFunction($issue_type, $e->function_id); + } elseif ($e instanceof PropertyIssue) { + $reporting_level = $this->getReportingLevelForProperty($issue_type, $e->property_id); + } elseif ($e instanceof ArgumentIssue && $e->function_id) { + $reporting_level = $this->getReportingLevelForArgument($issue_type, $e->function_id); + } elseif ($e instanceof VariableIssue) { + $reporting_level = $this->getReportingLevelForVariable($issue_type, $e->var_name); + } + + if ($reporting_level === null) { + $reporting_level = $this->getReportingLevelForFile($issue_type, $e->getFilePath()); + } + + if (!$this->report_info && $reporting_level === self::REPORT_INFO) { + $reporting_level = self::REPORT_SUPPRESS; + } + + $parent_issue_type = self::getParentIssueType($issue_type); + + if ($parent_issue_type && $reporting_level === self::REPORT_ERROR) { + $parent_reporting_level = $this->getReportingLevelForFile($parent_issue_type, $e->getFilePath()); + + if ($parent_reporting_level !== $reporting_level) { + return $parent_reporting_level; + } + } + + return $reporting_level; + } + + /** + * @psalm-pure + */ + public static function getParentIssueType(string $issue_type): ?string + { + if ($issue_type === 'PossiblyUndefinedIntArrayOffset' + || $issue_type === 'PossiblyUndefinedStringArrayOffset' + ) { + return 'PossiblyUndefinedArrayOffset'; + } + + if ($issue_type === 'PossiblyNullReference') { + return 'NullReference'; + } + + if ($issue_type === 'PossiblyFalseReference') { + return null; + } + + if ($issue_type === 'PossiblyUndefinedArrayOffset') { + return null; + } + + if (strpos($issue_type, 'Possibly') === 0) { + $stripped_issue_type = preg_replace('/^Possibly(False|Null)?/', '', $issue_type); + + if (strpos($stripped_issue_type, 'Invalid') === false && strpos($stripped_issue_type, 'Un') !== 0) { + $stripped_issue_type = 'Invalid' . $stripped_issue_type; + } + + return $stripped_issue_type; + } + + if (strpos($issue_type, 'Tainted') === 0) { + return 'TaintedInput'; + } + + if (preg_match('/^(False|Null)[A-Z]/', $issue_type) && !strpos($issue_type, 'Reference')) { + return preg_replace('/^(False|Null)/', 'Invalid', $issue_type); + } + + if ($issue_type === 'UndefinedInterfaceMethod') { + return 'UndefinedMethod'; + } + + if ($issue_type === 'UndefinedMagicPropertyFetch') { + return 'UndefinedPropertyFetch'; + } + + if ($issue_type === 'UndefinedMagicPropertyAssignment') { + return 'UndefinedPropertyAssignment'; + } + + if ($issue_type === 'UndefinedMagicMethod') { + return 'UndefinedMethod'; + } + + if ($issue_type === 'PossibleRawObjectIteration') { + return 'RawObjectIteration'; + } + + if ($issue_type === 'UninitializedProperty') { + return 'PropertyNotSetInConstructor'; + } + + if ($issue_type === 'InvalidDocblockParamName') { + return 'InvalidDocblock'; + } + + if ($issue_type === 'UnusedClosureParam') { + return 'UnusedParam'; + } + + if ($issue_type === 'UnusedConstructor') { + return 'UnusedMethod'; + } + + if ($issue_type === 'StringIncrement') { + return 'InvalidOperand'; + } + + if ($issue_type === 'InvalidLiteralArgument') { + return 'InvalidArgument'; + } + + if ($issue_type === 'RedundantConditionGivenDocblockType') { + return 'RedundantCondition'; + } + + if ($issue_type === 'RedundantFunctionCallGivenDocblockType') { + return 'RedundantFunctionCall'; + } + + if ($issue_type === 'RedundantCastGivenDocblockType') { + return 'RedundantCast'; + } + + if ($issue_type === 'TraitMethodSignatureMismatch') { + return 'MethodSignatureMismatch'; + } + + if ($issue_type === 'ImplementedParamTypeMismatch') { + return 'MoreSpecificImplementedParamType'; + } + + if ($issue_type === 'UndefinedDocblockClass') { + return 'UndefinedClass'; + } + + if ($issue_type === 'UnusedForeachValue') { + return 'UnusedVariable'; + } + + return null; + } + + public function getReportingLevelForFile(string $issue_type, string $file_path): string + { + if (isset($this->issue_handlers[$issue_type])) { + return $this->issue_handlers[$issue_type]->getReportingLevelForFile($file_path); + } + + // this string is replaced by scoper for Phars, so be careful + $issue_class = 'Psalm\\Issue\\' . $issue_type; + + if (!class_exists($issue_class) || !is_a($issue_class, CodeIssue::class, true)) { + return self::REPORT_ERROR; + } + + /** @var int */ + $issue_level = $issue_class::ERROR_LEVEL; + + if ($issue_level > 0 && $issue_level < $this->level) { + return self::REPORT_INFO; + } + + return self::REPORT_ERROR; + } + + public function getReportingLevelForClass(string $issue_type, string $fq_classlike_name): ?string + { + if (isset($this->issue_handlers[$issue_type])) { + return $this->issue_handlers[$issue_type]->getReportingLevelForClass($fq_classlike_name); + } + + return null; + } + + public function getReportingLevelForMethod(string $issue_type, string $method_id): ?string + { + if (isset($this->issue_handlers[$issue_type])) { + return $this->issue_handlers[$issue_type]->getReportingLevelForMethod($method_id); + } + + return null; + } + + public function getReportingLevelForFunction(string $issue_type, string $function_id): ?string + { + $level = null; + if (isset($this->issue_handlers[$issue_type])) { + $level = $this->issue_handlers[$issue_type]->getReportingLevelForFunction($function_id); + + if ($level === null && $issue_type === 'UndefinedFunction') { + // undefined functions trigger global namespace fallback + // so we should also check reporting levels for the symbol in global scope + $root_function_id = preg_replace('/.*\\\/', '', $function_id); + if ($root_function_id !== $function_id) { + /** @psalm-suppress PossiblyUndefinedStringArrayOffset https://github.com/vimeo/psalm/issues/7656 */ + $level = $this->issue_handlers[$issue_type]->getReportingLevelForFunction($root_function_id); + } + } + } + + return $level; + } + + public function getReportingLevelForArgument(string $issue_type, string $function_id): ?string + { + if (isset($this->issue_handlers[$issue_type])) { + return $this->issue_handlers[$issue_type]->getReportingLevelForArgument($function_id); + } + + return null; + } + + public function getReportingLevelForProperty(string $issue_type, string $property_id): ?string + { + if (isset($this->issue_handlers[$issue_type])) { + return $this->issue_handlers[$issue_type]->getReportingLevelForProperty($property_id); + } + + return null; + } + + public function getReportingLevelForVariable(string $issue_type, string $var_name): ?string + { + if (isset($this->issue_handlers[$issue_type])) { + return $this->issue_handlers[$issue_type]->getReportingLevelForVariable($var_name); + } + + return null; + } + + /** + * @return array + */ + public function getProjectDirectories(): array + { + if (!$this->project_files) { + return []; + } + + return $this->project_files->getDirectories(); + } + + /** + * @return array + */ + public function getProjectFiles(): array + { + if (!$this->project_files) { + return []; + } + + return $this->project_files->getFiles(); + } + + /** + * @return array + */ + public function getExtraDirectories(): array + { + if (!$this->extra_files) { + return []; + } + + return $this->extra_files->getDirectories(); + } + + public function reportTypeStatsForFile(string $file_path): bool + { + return $this->project_files + && $this->project_files->allows($file_path) + && $this->project_files->reportTypeStats($file_path); + } + + public function useStrictTypesForFile(string $file_path): bool + { + return $this->project_files && $this->project_files->useStrictTypes($file_path); + } + + /** + * @return array + */ + public function getFileExtensions(): array + { + return $this->file_extensions; + } + + /** + * @return array> + */ + public function getFiletypeScanners(): array + { + return $this->filetype_scanners; + } + + /** + * @return array> + */ + public function getFiletypeAnalyzers(): array + { + return $this->filetype_analyzers; + } + + /** + * @return array + */ + public function getMockClasses(): array + { + return $this->mock_classes; + } + + public function visitPreloadedStubFiles(Codebase $codebase, ?Progress $progress = null): void + { + if ($progress === null) { + $progress = new VoidProgress(); + } + + $core_generic_files = []; + + if (PHP_VERSION_ID < 80000 && $codebase->php_major_version >= 8) { + $stringable_path = dirname(__DIR__, 2) . '/stubs/Php80.phpstub'; + + if (!file_exists($stringable_path)) { + throw new UnexpectedValueException('Cannot locate PHP 8.0 classes'); + } + + $core_generic_files[] = $stringable_path; + } + + if (PHP_VERSION_ID < 80100 && $codebase->php_major_version >= 8 && $codebase->php_minor_version >= 1) { + $stringable_path = dirname(__DIR__, 2) . '/stubs/Php81.phpstub'; + + if (!file_exists($stringable_path)) { + throw new UnexpectedValueException('Cannot locate PHP 8.1 classes'); + } + + $core_generic_files[] = $stringable_path; + } + + $stub_files = array_merge($core_generic_files, $this->preloaded_stub_files); + + if (!$stub_files) { + return; + } + + foreach ($stub_files as $file_path) { + $file_path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $file_path); + $codebase->scanner->addFileToDeepScan($file_path); + } + + $progress->debug('Registering preloaded stub files' . "\n"); + + $codebase->register_stub_files = true; + + $codebase->scanFiles(); + + $codebase->register_stub_files = false; + + $progress->debug('Finished registering preloaded stub files' . "\n"); + } + + public function visitStubFiles(Codebase $codebase, ?Progress $progress = null): void + { + if ($progress === null) { + $progress = new VoidProgress(); + } + + $codebase->register_stub_files = true; + + $dir_lvl_2 = dirname(__DIR__, 2); + $this->internal_stubs = [ + $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'CoreGenericFunctions.phpstub', + $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'CoreGenericClasses.phpstub', + $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'CoreGenericIterators.phpstub', + $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'CoreImmutableClasses.phpstub', + $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'DOM.phpstub', + $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'Reflection.phpstub', + $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'SPL.phpstub', + ]; + + if (PHP_VERSION_ID >= 80000 && $codebase->php_major_version >= 8) { + $stringable_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'Php80.phpstub'; + $this->internal_stubs[] = $stringable_path; + } + + if (PHP_VERSION_ID >= 80100 && $codebase->php_major_version >= 8 && $codebase->php_minor_version >= 1) { + $stringable_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'Php81.phpstub'; + $this->internal_stubs[] = $stringable_path; + } + + if (extension_loaded('PDO')) { + $ext_pdo_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'pdo.phpstub'; + $this->internal_stubs[] = $ext_pdo_path; + } + + if (extension_loaded('soap')) { + $ext_soap_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'soap.phpstub'; + $this->internal_stubs[] = $ext_soap_path; + } + + if (extension_loaded('ds')) { + $ext_ds_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'ext-ds.phpstub'; + $this->internal_stubs[] = $ext_ds_path; + } + + if (extension_loaded('mongodb')) { + $ext_mongodb_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'mongodb.phpstub'; + $this->internal_stubs[] = $ext_mongodb_path; + } + + if ($this->load_xdebug_stub) { + $xdebug_stub_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'Xdebug.phpstub'; + $this->internal_stubs[] = $xdebug_stub_path; + } + + if (extension_loaded('mysqli')) { + $ext_mysqli_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'mysqli.phpstub'; + $this->internal_stubs[] = $ext_mysqli_path; + } + + if (extension_loaded('decimal')) { + $ext_decimal_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'decimal.phpstub'; + $this->internal_stubs[] = $ext_decimal_path; + } + + // phpredis + if (extension_loaded('redis')) { + $ext_phpredis_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'phpredis.phpstub'; + $this->internal_stubs[] = $ext_phpredis_path; + } + + if (extension_loaded('apcu')) { + $ext_apcu_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'ext-apcu.phpstub'; + $this->internal_stubs[] = $ext_apcu_path; + } + + foreach ($this->internal_stubs as $stub_path) { + if (!file_exists($stub_path)) { + throw new UnexpectedValueException('Cannot locate ' . $stub_path); + } + } + + $stub_files = array_merge($this->internal_stubs, $this->stub_files); + + $phpstorm_meta_path = $this->base_dir . DIRECTORY_SEPARATOR . '.phpstorm.meta.php'; + + if ($this->use_phpstorm_meta_path) { + if (is_file($phpstorm_meta_path)) { + $stub_files[] = $phpstorm_meta_path; + } elseif (is_dir($phpstorm_meta_path)) { + $phpstorm_meta_path = realpath($phpstorm_meta_path); + + foreach (glob($phpstorm_meta_path . '/*.meta.php', GLOB_NOSORT) as $glob) { + if (is_file($glob) && realpath(dirname($glob)) === $phpstorm_meta_path) { + $stub_files[] = $glob; + } + } + } + } + + foreach ($stub_files as $file_path) { + $file_path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $file_path); + $codebase->scanner->addFileToDeepScan($file_path); + } + + $progress->debug('Registering stub files' . "\n"); + + $codebase->scanFiles(); + + $progress->debug('Finished registering stub files' . "\n"); + + $codebase->register_stub_files = false; + } + + public function getCacheDirectory(): ?string + { + return $this->cache_directory; + } + + public function getGlobalCacheDirectory(): ?string + { + return $this->global_cache_directory; + } + + /** + * @return array + */ + public function getPredefinedConstants(): array + { + return $this->predefined_constants; + } + + public function collectPredefinedConstants(): void + { + $this->predefined_constants = get_defined_constants(); + } + + /** + * @return array + */ + public function getPredefinedFunctions(): array + { + return $this->predefined_functions; + } + + public function collectPredefinedFunctions(): void + { + $defined_functions = get_defined_functions(); + + if (isset($defined_functions['user'])) { + foreach ($defined_functions['user'] as $function_name) { + $this->predefined_functions[$function_name] = true; + } + } + + if (isset($defined_functions['internal'])) { + foreach ($defined_functions['internal'] as $function_name) { + $this->predefined_functions[$function_name] = true; + } + } + } + + public function setIncludeCollector(IncludeCollector $include_collector): void + { + $this->include_collector = $include_collector; + } + + public function visitComposerAutoloadFiles(ProjectAnalyzer $project_analyzer, ?Progress $progress = null): void + { + if ($progress === null) { + $progress = new VoidProgress(); + } + + if (!$this->include_collector) { + throw new LogicException("IncludeCollector should be set at this point"); + } + + $vendor_autoload_files_path + = $this->base_dir . DIRECTORY_SEPARATOR . 'vendor' + . DIRECTORY_SEPARATOR . 'composer' . DIRECTORY_SEPARATOR . 'autoload_files.php'; + + if (file_exists($vendor_autoload_files_path)) { + $this->include_collector->runAndCollect( + function () use ($vendor_autoload_files_path) { + /** + * @psalm-suppress UnresolvableInclude + * @var string[] + */ + return require $vendor_autoload_files_path; + } + ); + } + + $codebase = $project_analyzer->getCodebase(); + + $this->collectPredefinedFunctions(); + + if ($this->autoloader) { + // somee classes that we think are missing may not actually be missing + // as they might be autoloadable once we require the autoloader below + $codebase->classlikes->forgetMissingClassLikes(); + + $this->include_collector->runAndCollect( + function (): void { + // do this in a separate method so scope does not leak + /** @psalm-suppress UnresolvableInclude */ + require $this->autoloader; + } + ); + } + + $this->collectPredefinedConstants(); + + $autoload_included_files = $this->include_collector->getFilteredIncludedFiles(); + + if ($autoload_included_files) { + $codebase->register_autoload_files = true; + + $progress->debug('Registering autoloaded files' . "\n"); + foreach ($autoload_included_files as $file_path) { + $file_path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $file_path); + $progress->debug(' ' . $file_path . "\n"); + $codebase->scanner->addFileToDeepScan($file_path); + } + + $codebase->scanner->scanFiles($codebase->classlikes); + + $progress->debug('Finished registering autoloaded files' . "\n"); + + $codebase->register_autoload_files = false; + } + } + + /** + * @return string|false + */ + public function getComposerFilePathForClassLike(string $fq_classlike_name) + { + if (!$this->composer_class_loader) { + return false; + } + + return $this->composer_class_loader->findFile($fq_classlike_name); + } + + public function getPotentialComposerFilePathForClassLike(string $class): ?string + { + if (!$this->composer_class_loader) { + return null; + } + + $psr4_prefixes = $this->composer_class_loader->getPrefixesPsr4(); + + // PSR-4 lookup + $logicalPathPsr4 = str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php'; + + $candidate_path = null; + + $maxDepth = 0; + + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($psr4_prefixes[$search])) { + $depth = substr_count($search, '\\'); + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + + foreach ($psr4_prefixes[$search] as $dir) { + $dir = realpath($dir); + + if ($dir + && $depth > $maxDepth + && $this->isInProjectDirs($dir . DIRECTORY_SEPARATOR . 'testdummy.php') + ) { + $maxDepth = $depth; + $candidate_path = realpath($dir) . $pathEnd; + } + } + } + } + + return $candidate_path; + } + + public static function removeCacheDirectory(string $dir): void + { + clearstatcache(true, $dir); + if (is_dir($dir)) { + $objects = scandir($dir, SCANDIR_SORT_NONE); + + if ($objects === false) { + throw new UnexpectedValueException('Not expecting false here'); + } + + foreach ($objects as $object) { + if ($object === '.' || $object === '..') { + continue; + } + + // if it was deleted in the meantime/race condition with other psalm process + if (!file_exists($dir . '/' . $object)) { + continue; + } + + if (filetype($dir . '/' . $object) === 'dir') { + self::removeCacheDirectory($dir . '/' . $object); + } else { + unlink($dir . '/' . $object); + } + } + + reset($objects); + + // may have been removed in the meantime + clearstatcache(true, $dir); + if (is_dir($dir)) { + rmdir($dir); + } + } + } + + public function setServerMode(): void + { + $this->cache_directory .= '-s'; + } + + public function addStubFile(string $stub_file): void + { + $this->stub_files[$stub_file] = $stub_file; + } + + public function hasStubFile(string $stub_file): bool + { + return isset($this->stub_files[$stub_file]); + } + + /** + * @return array + */ + public function getStubFiles(): array + { + return $this->stub_files; + } + + public function addPreloadedStubFile(string $stub_file): void + { + $this->preloaded_stub_files[$stub_file] = $stub_file; + } + + public function getPhpVersion(): ?string + { + return $this->getPhpVersionFromConfig() ?? $this->getPHPVersionFromComposerJson(); + } + + public function getPhpVersionFromConfig(): ?string + { + return $this->configured_php_version; + } + + private function setBooleanAttribute(string $name, bool $value): void + { + $this->$name = $value; + } + + /** + * @psalm-suppress MixedAssignment + * @psalm-suppress MixedArrayAccess + */ + public function getPHPVersionFromComposerJson(): ?string + { + $composer_json_path = Composer::getJsonFilePath($this->base_dir); + + if (file_exists($composer_json_path)) { + if (!$composer_json = json_decode(file_get_contents($composer_json_path), true)) { + throw new UnexpectedValueException('Invalid composer.json at ' . $composer_json_path); + } + $php_version = $composer_json['require']['php'] ?? null; + + if (is_string($php_version)) { + $version_parser = new VersionParser(); + + $constraint = $version_parser->parseConstraints($php_version); + + foreach (['5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1'] as $candidate) { + if ($constraint->matches(new Constraint('<=', "$candidate.0.0-dev")) + || $constraint->matches(new Constraint('<=', "$candidate.999")) + ) { + return $candidate; + } + } + } + } + + return null; + } + + public function addUniversalObjectCrate(string $class): void + { + if (!class_exists($class)) { + throw new UnexpectedValueException($class . ' is not a known class'); + } + $this->universal_object_crates[] = $class; + } + + /** + * @return array + */ + public function getUniversalObjectCrates(): array + { + return array_map('strtolower', $this->universal_object_crates); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/Creator.php b/vendor/vimeo/psalm/src/Psalm/Config/Creator.php new file mode 100644 index 00000000..f67eb5cf --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Config/Creator.php @@ -0,0 +1,296 @@ + + + + + + + + + +'; + + /** + * @return non-empty-string + */ + public static function getContents( + string $current_dir, + ?string $suggested_dir, + int $level, + string $vendor_dir + ): string { + $paths = self::getPaths($current_dir, $suggested_dir); + + $template = str_replace( + '', + implode("\n ", $paths), + self::TEMPLATE + ); + + if (is_dir($current_dir . DIRECTORY_SEPARATOR . $vendor_dir)) { + $template = str_replace( + '', + '', + $template + ); + } else { + $template = str_replace( + '', + '', + $template + ); + } + + /** @var non-empty-string */ + return str_replace( + 'errorLevel="1"', + 'errorLevel="' . $level . '"', + $template + ); + } + + public static function createBareConfig( + string $current_dir, + ?string $suggested_dir, + string $vendor_dir + ): Config { + $config_contents = self::getContents($current_dir, $suggested_dir, 1, $vendor_dir); + + return Config::loadFromXML($current_dir, $config_contents); + } + + /** + * @param array $issues + */ + public static function getLevel(array $issues, int $counted_types): int + { + if ($counted_types === 0) { + $counted_types = 1; + } + + $issues_at_level = []; + + foreach ($issues as $issue) { + $issue_type = $issue->type; + $issue_level = $issue->error_level; + + if ($issue_level < 1) { + continue; + } + + // exclude some directories that are probably ignorable + if (strpos($issue->file_path, 'vendor') || strpos($issue->file_path, 'stub')) { + continue; + } + + if (!isset($issues_at_level[$issue_level][$issue_type])) { + $issues_at_level[$issue_level][$issue_type] = 0; + } + + $issues_at_level[$issue_level][$issue_type] += 100/$counted_types; + } + + foreach ($issues_at_level as $level => $issues) { + ksort($issues); + + // remove any issues where < 0.1% of expressions are affected + $filtered_issues = array_filter( + $issues, + function ($amount): bool { + return $amount > 0.1; + } + ); + + if (array_sum($filtered_issues) > 0.5) { + $issues_at_level[$level] = $filtered_issues; + } else { + unset($issues_at_level[$level]); + } + } + + if (!$issues_at_level) { + return 1; + } + + if (count($issues_at_level) === 1) { + return array_keys($issues_at_level)[0] + 1; + } + + return max(...array_keys($issues_at_level)) + 1; + } + + /** + * @return non-empty-list + */ + public static function getPaths(string $current_dir, ?string $suggested_dir): array + { + $replacements = []; + + if ($suggested_dir) { + if (is_dir($current_dir . DIRECTORY_SEPARATOR . $suggested_dir)) { + $replacements[] = ''; + } else { + $bad_dir_path = $current_dir . DIRECTORY_SEPARATOR . $suggested_dir; + + throw new ConfigCreationException( + 'The given path "' . $bad_dir_path . '" does not appear to be a directory' + ); + } + } elseif (is_dir($current_dir . DIRECTORY_SEPARATOR . 'src')) { + $replacements[] = ''; + } else { + $composer_json_location = Composer::getJsonFilePath($current_dir); + + if (!file_exists($composer_json_location)) { + throw new ConfigCreationException( + 'Problem during config autodiscovery - could not find composer.json during initialization.' + ); + } + + if (!$composer_json = json_decode(file_get_contents($composer_json_location), true)) { + throw new ConfigCreationException('Invalid composer.json at ' . $composer_json_location); + } + + if (!is_array($composer_json)) { + throw new ConfigCreationException('Invalid composer.json at ' . $composer_json_location); + } + + $replacements = self::getPsr4Or0Paths($current_dir, $composer_json); + + if (!$replacements) { + throw new ConfigCreationException( + 'Could not located any PSR-0 or PSR-4-compatible paths in ' . $composer_json_location + ); + } + } + + return $replacements; + } + + /** + * @return list + * @psalm-suppress MixedAssignment + * @psalm-suppress MixedArgument + */ + private static function getPsr4Or0Paths(string $current_dir, array $composer_json): array + { + $psr_paths = array_merge( + $composer_json['autoload']['psr-4'] ?? [], + $composer_json['autoload']['psr-0'] ?? [] + ); + + if (!$psr_paths) { + return self::guessPhpFileDirs($current_dir); + } + + $nodes = []; + + foreach ($psr_paths as $paths) { + if (!is_array($paths)) { + $paths = [$paths]; + } + + foreach ($paths as $path) { + if ($path === '') { + $nodes = array_merge( + $nodes, + self::guessPhpFileDirs($current_dir) + ); + + continue; + } + + $path = preg_replace('@[\\\\/]$@', '', $path); + + if ($path !== 'tests') { + $nodes[] = ''; + } + } + } + + $nodes = array_unique($nodes); + + sort($nodes); + + return $nodes; + } + + /** + * @return list + */ + private static function guessPhpFileDirs(string $current_dir): array + { + $nodes = []; + + /** @var string[] */ + $php_files = array_merge( + glob($current_dir . DIRECTORY_SEPARATOR . '*.php', GLOB_NOSORT), + glob($current_dir . DIRECTORY_SEPARATOR . '**/*.php', GLOB_NOSORT), + glob($current_dir . DIRECTORY_SEPARATOR . '**/**/*.php', GLOB_NOSORT) + ); + + foreach ($php_files as $php_file) { + $php_file = str_replace($current_dir . DIRECTORY_SEPARATOR, '', $php_file); + + $parts = explode(DIRECTORY_SEPARATOR, $php_file); + + if (!$parts[0]) { + array_shift($parts); + } + + if ($parts[0] === 'vendor' || $parts[0] === 'tests') { + continue; + } + + if (count($parts) === 1) { + $nodes[] = ''; + } else { + $nodes[] = ''; + } + } + + return array_values(array_unique($nodes)); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php b/vendor/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php new file mode 100644 index 00000000..7d226a21 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php @@ -0,0 +1,68 @@ +error_level = (string) $config['type']; + + if (!in_array($filter->error_level, Config::$ERROR_LEVELS, true)) { + throw new ConfigException('Unexpected error level ' . $filter->error_level); + } + } else { + throw new ConfigException(' element expects a level'); + } + + return $filter; + } + + /** + * @return static + */ + public static function loadFromXMLElement( + SimpleXMLElement $e, + string $base_dir, + bool $inclusive + ): ErrorLevelFileFilter { + $filter = parent::loadFromXMLElement($e, $base_dir, $inclusive); + + if (isset($e['type'])) { + $filter->error_level = (string) $e['type']; + + if (!in_array($filter->error_level, Config::$ERROR_LEVELS, true)) { + throw new ConfigException('Unexpected error level ' . $filter->error_level); + } + } else { + throw new ConfigException(' element expects a level'); + } + + return $filter; + } + + public function getErrorLevel(): string + { + return $this->error_level; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/FileFilter.php b/vendor/vimeo/psalm/src/Psalm/Config/FileFilter.php new file mode 100644 index 00000000..76f53d6b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Config/FileFilter.php @@ -0,0 +1,559 @@ + + */ + protected $directories = []; + + /** + * @var array + */ + protected $files = []; + + /** + * @var array + */ + protected $fq_classlike_names = []; + + /** + * @var array + */ + protected $fq_classlike_patterns = []; + + /** + * @var array + */ + protected $method_ids = []; + + /** + * @var array + */ + protected $property_ids = []; + + /** + * @var array + */ + protected $var_names = []; + + /** + * @var array + */ + protected $files_lowercase = []; + + /** + * @var bool + */ + protected $inclusive; + + /** + * @var array + */ + protected $ignore_type_stats = []; + + /** + * @var array + */ + protected $declare_strict_types = []; + + public function __construct(bool $inclusive) + { + $this->inclusive = $inclusive; + } + + /** + * @return static + */ + public static function loadFromArray( + array $config, + string $base_dir, + bool $inclusive + ) { + $allow_missing_files = ($config['allowMissingFiles'] ?? false) === true; + + $filter = new static($inclusive); + + if (isset($config['directory']) && is_iterable($config['directory'])) { + /** @var array $directory */ + foreach ($config['directory'] as $directory) { + $directory_path = (string) ($directory['name'] ?? ''); + $ignore_type_stats = (bool) ($directory['ignoreTypeStats'] ?? false); + $declare_strict_types = (bool) ($directory['useStrictTypes'] ?? false); + + if ($directory_path[0] === '/' && DIRECTORY_SEPARATOR === '/') { + $prospective_directory_path = $directory_path; + } else { + $prospective_directory_path = $base_dir . DIRECTORY_SEPARATOR . $directory_path; + } + + if (strpos($prospective_directory_path, '*') !== false) { + $globs = array_map( + 'realpath', + glob($prospective_directory_path, GLOB_ONLYDIR) + ); + + if (empty($globs)) { + if ($allow_missing_files) { + continue; + } + + throw new ConfigException( + 'Could not resolve config path to ' . $base_dir + . DIRECTORY_SEPARATOR . $directory_path + ); + } + + foreach ($globs as $glob_index => $directory_path) { + if (!$directory_path) { + if ($allow_missing_files) { + continue; + } + + throw new ConfigException( + 'Could not resolve config path to ' . $base_dir + . DIRECTORY_SEPARATOR . $directory_path . ':' . $glob_index + ); + } + + if ($ignore_type_stats && $filter instanceof ProjectFileFilter) { + $filter->ignore_type_stats[$directory_path] = true; + } + + if ($declare_strict_types && $filter instanceof ProjectFileFilter) { + $filter->declare_strict_types[$directory_path] = true; + } + + $filter->addDirectory($directory_path); + } + continue; + } + + $directory_path = realpath($prospective_directory_path); + + if (!$directory_path) { + if ($allow_missing_files) { + continue; + } + + throw new ConfigException( + 'Could not resolve config path to ' . $prospective_directory_path + ); + } + + if (!is_dir($directory_path)) { + throw new ConfigException( + $base_dir . DIRECTORY_SEPARATOR . $directory_path + . ' is not a directory' + ); + } + + /** @var RecursiveDirectoryIterator */ + $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory_path)); + $iterator->rewind(); + + while ($iterator->valid()) { + if (!$iterator->isDot() && $iterator->isLink()) { + $linked_path = readlink($iterator->getPathname()); + + if (stripos($linked_path, $directory_path) !== 0) { + if ($ignore_type_stats && $filter instanceof ProjectFileFilter) { + $filter->ignore_type_stats[$directory_path] = true; + } + + if ($declare_strict_types && $filter instanceof ProjectFileFilter) { + $filter->declare_strict_types[$directory_path] = true; + } + + if (is_dir($linked_path)) { + $filter->addDirectory($linked_path); + } + } + } + + $iterator->next(); + } + + if ($ignore_type_stats && $filter instanceof ProjectFileFilter) { + $filter->ignore_type_stats[$directory_path] = true; + } + + if ($declare_strict_types && $filter instanceof ProjectFileFilter) { + $filter->declare_strict_types[$directory_path] = true; + } + + $filter->addDirectory($directory_path); + } + } + + if (isset($config['file']) && is_iterable($config['file'])) { + /** @var array $file */ + foreach ($config['file'] as $file) { + $file_path = (string) ($file['name'] ?? ''); + + if ($file_path[0] === '/' && DIRECTORY_SEPARATOR === '/') { + $prospective_file_path = $file_path; + } else { + $prospective_file_path = $base_dir . DIRECTORY_SEPARATOR . $file_path; + } + + if (strpos($prospective_file_path, '*') !== false) { + $globs = array_map( + 'realpath', + array_filter( + glob($prospective_file_path, GLOB_NOSORT), + 'file_exists' + ) + ); + + if (empty($globs)) { + if ($allow_missing_files) { + continue; + } + + throw new ConfigException( + 'Could not resolve config path to ' . $base_dir . DIRECTORY_SEPARATOR . + $file_path + ); + } + + foreach ($globs as $glob_index => $file_path) { + if (!$file_path && !$allow_missing_files) { + throw new ConfigException( + 'Could not resolve config path to ' . $base_dir . DIRECTORY_SEPARATOR . + $file_path . ':' . $glob_index + ); + } + $filter->addFile($file_path); + } + continue; + } + + $file_path = realpath($prospective_file_path); + + if (!$file_path && !$allow_missing_files) { + throw new ConfigException( + 'Could not resolve config path to ' . $prospective_file_path + ); + } + + $filter->addFile($file_path); + } + } + + if (isset($config['referencedClass']) && is_iterable($config['referencedClass'])) { + /** @var array $referenced_class */ + foreach ($config['referencedClass'] as $referenced_class) { + $class_name = strtolower((string) ($referenced_class['name'] ?? '')); + + if (strpos($class_name, '*') !== false) { + $regex = '/' . str_replace('*', '.*', str_replace('\\', '\\\\', $class_name)) . '/i'; + $filter->fq_classlike_patterns[] = $regex; + } else { + $filter->fq_classlike_names[] = $class_name; + } + } + } + + if (isset($config['referencedMethod']) && is_iterable($config['referencedMethod'])) { + /** @var array $referenced_method */ + foreach ($config['referencedMethod'] as $referenced_method) { + $method_id = (string) ($referenced_method['name'] ?? ''); + + if (!preg_match('/^[^:]+::[^:]+$/', $method_id) && !static::isRegularExpression($method_id)) { + throw new ConfigException( + 'Invalid referencedMethod ' . $method_id + ); + } + + $filter->method_ids[] = strtolower($method_id); + } + } + + if (isset($config['referencedFunction']) && is_iterable($config['referencedFunction'])) { + /** @var array $referenced_function */ + foreach ($config['referencedFunction'] as $referenced_function) { + $filter->method_ids[] = strtolower((string) ($referenced_function['name'] ?? '')); + } + } + + if (isset($config['referencedProperty']) && is_iterable($config['referencedProperty'])) { + /** @var array $referenced_property */ + foreach ($config['referencedProperty'] as $referenced_property) { + $filter->property_ids[] = strtolower((string) ($referenced_property['name'] ?? '')); + } + } + + if (isset($config['referencedVariable']) && is_iterable($config['referencedVariable'])) { + /** @var array $referenced_variable */ + foreach ($config['referencedVariable'] as $referenced_variable) { + $filter->var_names[] = strtolower((string) ($referenced_variable['name'] ?? '')); + } + } + + return $filter; + } + + /** + * @return static + */ + public static function loadFromXMLElement( + SimpleXMLElement $e, + string $base_dir, + bool $inclusive + ) { + $config = []; + $config['allowMissingFiles'] = ((string) $e['allowMissingFiles']) === 'true'; + + if ($e->directory) { + $config['directory'] = []; + /** @var SimpleXMLElement $directory */ + foreach ($e->directory as $directory) { + $config['directory'][] = [ + 'name' => (string) $directory['name'], + 'ignoreTypeStats' => strtolower((string) ($directory['ignoreTypeStats'] ?? '')) === 'true', + 'useStrictTypes' => strtolower((string) ($directory['useStrictTypes'] ?? '')) === 'true', + ]; + } + } + + if ($e->file) { + $config['file'] = []; + /** @var SimpleXMLElement $file */ + foreach ($e->file as $file) { + $config['file'][]['name'] = (string) $file['name']; + } + } + + if ($e->referencedClass) { + $config['referencedClass'] = []; + /** @var SimpleXMLElement $referenced_class */ + foreach ($e->referencedClass as $referenced_class) { + $config['referencedClass'][]['name'] = strtolower((string)$referenced_class['name']); + } + } + + if ($e->referencedMethod) { + $config['referencedMethod'] = []; + /** @var SimpleXMLElement $referenced_method */ + foreach ($e->referencedMethod as $referenced_method) { + $config['referencedMethod'][]['name'] = (string)$referenced_method['name']; + } + } + + if ($e->referencedFunction) { + $config['referencedFunction'] = []; + /** @var SimpleXMLElement $referenced_function */ + foreach ($e->referencedFunction as $referenced_function) { + $config['referencedFunction'][]['name'] = strtolower((string)$referenced_function['name']); + } + } + + if ($e->referencedProperty) { + $config['referencedProperty'] = []; + /** @var SimpleXMLElement $referenced_property */ + foreach ($e->referencedProperty as $referenced_property) { + $config['referencedProperty'][]['name'] = strtolower((string)$referenced_property['name']); + } + } + + if ($e->referencedVariable) { + $config['referencedVariable'] = []; + + /** @var SimpleXMLElement $referenced_variable */ + foreach ($e->referencedVariable as $referenced_variable) { + $config['referencedVariable'][]['name'] = strtolower((string)$referenced_variable['name']); + } + } + + return self::loadFromArray($config, $base_dir, $inclusive); + } + + private static function isRegularExpression(string $string): bool + { + set_error_handler( + function (): bool { + return false; + }, + E_WARNING + ); + $is_regexp = preg_match($string, '') !== false; + restore_error_handler(); + + return $is_regexp; + } + + /** + * @psalm-pure + */ + protected static function slashify(string $str): string + { + return preg_replace('/\/?$/', DIRECTORY_SEPARATOR, $str); + } + + public function allows(string $file_name, bool $case_sensitive = false): bool + { + if ($this->inclusive) { + foreach ($this->directories as $include_dir) { + if ($case_sensitive) { + if (strpos($file_name, $include_dir) === 0) { + return true; + } + } else { + if (stripos($file_name, $include_dir) === 0) { + return true; + } + } + } + + if ($case_sensitive) { + if (in_array($file_name, $this->files, true)) { + return true; + } + } else { + if (in_array(strtolower($file_name), $this->files_lowercase, true)) { + return true; + } + } + + return false; + } + + // exclusive + foreach ($this->directories as $exclude_dir) { + if ($case_sensitive) { + if (strpos($file_name, $exclude_dir) === 0) { + return false; + } + } else { + if (stripos($file_name, $exclude_dir) === 0) { + return false; + } + } + } + + if ($case_sensitive) { + if (in_array($file_name, $this->files, true)) { + return false; + } + } else { + if (in_array(strtolower($file_name), $this->files_lowercase, true)) { + return false; + } + } + + return true; + } + + public function allowsClass(string $fq_classlike_name): bool + { + if ($this->fq_classlike_patterns) { + foreach ($this->fq_classlike_patterns as $pattern) { + if (preg_match($pattern, $fq_classlike_name)) { + return true; + } + } + } + + return in_array(strtolower($fq_classlike_name), $this->fq_classlike_names, true); + } + + public function allowsMethod(string $method_id): bool + { + if (!$this->method_ids) { + return false; + } + + if (preg_match('/^[^:]+::[^:]+$/', $method_id)) { + $method_stub = '*::' . explode('::', $method_id)[1]; + + foreach ($this->method_ids as $config_method_id) { + if ($config_method_id === $method_id) { + return true; + } + + if ($config_method_id === $method_stub) { + return true; + } + + if ($config_method_id[0] === '/' && preg_match($config_method_id, $method_id)) { + return true; + } + } + + return false; + } + + return in_array($method_id, $this->method_ids, true); + } + + public function allowsProperty(string $property_id): bool + { + return in_array(strtolower($property_id), $this->property_ids, true); + } + + public function allowsVariable(string $var_name): bool + { + return in_array(strtolower($var_name), $this->var_names, true); + } + + /** + * @return array + */ + public function getDirectories(): array + { + return $this->directories; + } + + /** + * @return array + */ + public function getFiles(): array + { + return $this->files; + } + + public function addFile(string $file_name): void + { + $this->files[] = $file_name; + $this->files_lowercase[] = strtolower($file_name); + } + + public function addDirectory(string $dir_name): void + { + $this->directories[] = self::slashify($dir_name); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/IssueHandler.php b/vendor/vimeo/psalm/src/Psalm/Config/IssueHandler.php new file mode 100644 index 00000000..cdc2c288 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Config/IssueHandler.php @@ -0,0 +1,174 @@ + + */ + private $custom_levels = []; + + public static function loadFromXMLElement(SimpleXMLElement $e, string $base_dir): IssueHandler + { + $handler = new self(); + + if (isset($e['errorLevel'])) { + $handler->error_level = (string) $e['errorLevel']; + + if (!in_array($handler->error_level, Config::$ERROR_LEVELS, true)) { + throw new ConfigException('Unexpected error level ' . $handler->error_level); + } + } + + /** @var SimpleXMLElement $error_level */ + foreach ($e->errorLevel as $error_level) { + $handler->custom_levels[] = ErrorLevelFileFilter::loadFromXMLElement($error_level, $base_dir, true); + } + + return $handler; + } + + public function setCustomLevels(array $customLevels, string $base_dir): void + { + /** @var array $customLevel */ + foreach ($customLevels as $customLevel) { + $this->custom_levels[] = ErrorLevelFileFilter::loadFromArray($customLevel, $base_dir, true); + } + } + + public function setErrorLevel(string $error_level): void + { + if (!in_array($error_level, Config::$ERROR_LEVELS, true)) { + throw new ConfigException('Unexpected error level ' . $error_level); + } + + $this->error_level = $error_level; + } + + public function getReportingLevelForFile(string $file_path): string + { + foreach ($this->custom_levels as $custom_level) { + if ($custom_level->allows($file_path)) { + return $custom_level->getErrorLevel(); + } + } + + return $this->error_level; + } + + public function getReportingLevelForClass(string $fq_classlike_name): ?string + { + foreach ($this->custom_levels as $custom_level) { + if ($custom_level->allowsClass($fq_classlike_name)) { + return $custom_level->getErrorLevel(); + } + } + + return null; + } + + public function getReportingLevelForMethod(string $method_id): ?string + { + foreach ($this->custom_levels as $custom_level) { + if ($custom_level->allowsMethod(strtolower($method_id))) { + return $custom_level->getErrorLevel(); + } + } + + return null; + } + + public function getReportingLevelForFunction(string $function_id): ?string + { + foreach ($this->custom_levels as $custom_level) { + if ($custom_level->allowsMethod(strtolower($function_id))) { + return $custom_level->getErrorLevel(); + } + } + + return null; + } + + public function getReportingLevelForArgument(string $function_id): ?string + { + foreach ($this->custom_levels as $custom_level) { + if ($custom_level->allowsMethod(strtolower($function_id))) { + return $custom_level->getErrorLevel(); + } + } + + return null; + } + + public function getReportingLevelForProperty(string $property_id): ?string + { + foreach ($this->custom_levels as $custom_level) { + if ($custom_level->allowsProperty($property_id)) { + return $custom_level->getErrorLevel(); + } + } + + return null; + } + + public function getReportingLevelForVariable(string $var_name): ?string + { + foreach ($this->custom_levels as $custom_level) { + if ($custom_level->allowsVariable($var_name)) { + return $custom_level->getErrorLevel(); + } + } + + return null; + } + + /** + * @return array + */ + public static function getAllIssueTypes(): array + { + return array_filter( + array_map( + function (string $file_name): string { + return substr($file_name, 0, -4); + }, + scandir(dirname(__DIR__) . '/Issue', SCANDIR_SORT_NONE) + ), + function (string $issue_name): bool { + return $issue_name !== '' + && $issue_name !== 'MethodIssue' + && $issue_name !== 'PropertyIssue' + && $issue_name !== 'FunctionIssue' + && $issue_name !== 'ArgumentIssue' + && $issue_name !== 'VariableIssue' + && $issue_name !== 'ClassIssue' + && $issue_name !== 'CodeIssue' + && $issue_name !== 'PsalmInternalError' + && $issue_name !== 'ParseError' + && $issue_name !== 'PluginIssue' + && $issue_name !== 'MixedIssue' + && $issue_name !== 'MixedIssueTrait'; + } + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php b/vendor/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php new file mode 100644 index 00000000..9afa3d6b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php @@ -0,0 +1,95 @@ +ignoreFiles)) { + if (!$inclusive) { + throw new ConfigException('Cannot nest ignoreFiles inside itself'); + } + + /** @var SimpleXMLElement $e->ignoreFiles */ + $filter->file_filter = static::loadFromXMLElement($e->ignoreFiles, $base_dir, false); + } + + return $filter; + } + + public function allows(string $file_name, bool $case_sensitive = false): bool + { + if ($this->inclusive && $this->file_filter) { + if (!$this->file_filter->allows($file_name, $case_sensitive)) { + return false; + } + } + + return parent::allows($file_name, $case_sensitive); + } + + public function forbids(string $file_name, bool $case_sensitive = false): bool + { + if ($this->inclusive && $this->file_filter) { + if (!$this->file_filter->allows($file_name, $case_sensitive)) { + return true; + } + } + + return false; + } + + public function reportTypeStats(string $file_name, bool $case_sensitive = false): bool + { + foreach ($this->ignore_type_stats as $exclude_dir => $_) { + if ($case_sensitive) { + if (strpos($file_name, $exclude_dir) === 0) { + return false; + } + } else { + if (stripos($file_name, $exclude_dir) === 0) { + return false; + } + } + } + + return true; + } + + public function useStrictTypes(string $file_name, bool $case_sensitive = false): bool + { + foreach ($this->declare_strict_types as $exclude_dir => $_) { + if ($case_sensitive) { + if (strpos($file_name, $exclude_dir) === 0) { + return true; + } + } else { + if (stripos($file_name, $exclude_dir) === 0) { + return true; + } + } + } + + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php b/vendor/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php new file mode 100644 index 00000000..61a9d0fe --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php @@ -0,0 +1,7 @@ + + */ + public $vars_in_scope = []; + + /** + * @var array + */ + public $vars_possibly_in_scope = []; + + /** + * Whether or not we're inside the conditional of an if/where etc. + * + * This changes whether or not the context is cloned + * + * @var bool + */ + public $inside_conditional = false; + + /** + * Whether or not we're inside an isset call + * + * Inside issets Psalm is more lenient about certain things + * + * @var bool + */ + public $inside_isset = false; + + /** + * Whether or not we're inside an unset call, where + * we don't care about possibly undefined variables + * + * @var bool + */ + public $inside_unset = false; + + /** + * Whether or not we're inside an class_exists call, where + * we don't care about possibly undefined classes + * + * @var bool + */ + public $inside_class_exists = false; + + /** + * Whether or not we're inside a function/method call + * + * @var bool + */ + public $inside_call = false; + + /** + * Whether or not we're inside any other situation that treats a variable as used + * + * @var bool + */ + public $inside_general_use = false; + + /** + * Whether or not we're inside a return expression + * + * @var bool + */ + public $inside_return = false; + + /** + * Whether or not we're inside a throw + * + * @var bool + */ + public $inside_throw = false; + + /** + * Whether or not we're inside an assignment + * + * @var bool + */ + public $inside_assignment = false; + + /** + * Whether or not we're inside a try block. + * + * @var bool + */ + public $inside_try = false; + + /** + * @var null|CodeLocation + */ + public $include_location; + + /** + * @var string|null + * The name of the current class. Null if outside a class. + */ + public $self; + + /** + * @var string|null + */ + public $parent; + + /** + * @var bool + */ + public $check_classes = true; + + /** + * @var bool + */ + public $check_variables = true; + + /** + * @var bool + */ + public $check_methods = true; + + /** + * @var bool + */ + public $check_consts = true; + + /** + * @var bool + */ + public $check_functions = true; + + /** + * A list of classes checked with class_exists + * + * @var array + */ + public $phantom_classes = []; + + /** + * A list of files checked with file_exists + * + * @var array + */ + public $phantom_files = []; + + /** + * A list of clauses in Conjunctive Normal Form + * + * @var list + */ + public $clauses = []; + + /** + * A list of hashed clauses that have already been factored in + * + * @var list + */ + public $reconciled_expression_clauses = []; + + /** + * Whether or not to do a deep analysis and collect mutations to this context + * + * @var bool + */ + public $collect_mutations = false; + + /** + * Whether or not to do a deep analysis and collect initializations from private or final methods + * + * @var bool + */ + public $collect_initializations = false; + + /** + * Whether or not to do a deep analysis and collect initializations from public non-final methods + * + * @var bool + */ + public $collect_nonprivate_initializations = false; + + /** + * Stored to prevent re-analysing methods when checking for initialised properties + * + * @var array|null + */ + public $initialized_methods; + + /** + * @var array + */ + public $constants = []; + + /** + * Whether or not to track exceptions + * + * @var bool + */ + public $collect_exceptions = false; + + /** + * A list of variables that have been referenced + * + * @var array + */ + public $referenced_var_ids = []; + + /** + * A list of variables that have been passed by reference (where we know their type) + * + * @var array + */ + public $byref_constraints = []; + + /** + * If this context inherits from a context, it is here + * + * @var Context|null + */ + public $parent_context; + + /** + * A list of vars that have been assigned to + * + * @var array + */ + public $assigned_var_ids = []; + + /** + * A list of vars that have been may have been assigned to + * + * @var array + */ + public $possibly_assigned_var_ids = []; + + /** + * A list of classes or interfaces that may have been thrown + * + * @var array> + */ + public $possibly_thrown_exceptions = []; + + /** + * @var bool + */ + public $is_global = false; + + /** + * @var array + */ + public $protected_var_ids = []; + + /** + * If we've branched from the main scope, a byte offset for where that branch happened + * + * @var int|null + */ + public $branch_point; + + /** + * What does break mean in this context? + * + * 'loop' means we're breaking out of a loop, + * 'switch' means we're breaking out of a switch + * + * @var list<'loop'|'switch'> + */ + public $break_types = []; + + /** + * @var bool + */ + public $inside_loop = false; + + /** + * @var LoopScope|null + */ + public $loop_scope; + + /** + * @var CaseScope|null + */ + public $case_scope; + + /** + * @var FinallyScope|null + */ + public $finally_scope; + + /** + * @var Context|null + */ + public $if_context; + + /** + * @var IfScope|null + */ + public $if_scope; + + /** + * @var bool + */ + public $strict_types = false; + + /** + * @var string|null + */ + public $calling_function_id; + + /** + * @var lowercase-string|null + */ + public $calling_method_id; + + /** + * @var bool + */ + public $inside_negation = false; + + /** + * @var bool + */ + public $ignore_variable_property = false; + + /** + * @var bool + */ + public $ignore_variable_method = false; + + /** + * @var bool + */ + public $pure = false; + + /** + * @var bool + * Set by @psalm-immutable + */ + public $mutation_free = false; + + /** + * @var bool + * Set by @psalm-external-mutation-free + */ + public $external_mutation_free = false; + + /** + * @var bool + */ + public $error_suppressing = false; + + /** + * @var bool + */ + public $has_returned = false; + + /** + * @var array + */ + public $vars_from_global = []; + + public function __construct(?string $self = null) + { + $this->self = $self; + } + + public function __destruct() + { + $this->case_scope = null; + $this->parent_context = null; + } + + public function __clone() + { + foreach ($this->clauses as &$clause) { + $clause = clone $clause; + } + + foreach ($this->constants as &$constant) { + $constant = clone $constant; + } + } + + /** + * Updates the parent context, looking at the changes within a block and then applying those changes, where + * necessary, to the parent context + * + * @param bool $has_leaving_statements whether or not the parent scope is abandoned between + * $start_context and $end_context + * @param array $updated_vars + * + */ + public function update( + Context $start_context, + Context $end_context, + bool $has_leaving_statements, + array $vars_to_update, + array &$updated_vars + ): void { + foreach ($start_context->vars_in_scope as $var_id => $old_type) { + // this is only true if there was some sort of type negation + if (in_array($var_id, $vars_to_update, true)) { + // if we're leaving, we're effectively deleting the possibility of the if types + $new_type = !$has_leaving_statements && $end_context->hasVariable($var_id) + ? $end_context->vars_in_scope[$var_id] + : null; + + $existing_type = $this->vars_in_scope[$var_id] ?? null; + + if (!$existing_type) { + if ($new_type) { + $this->vars_in_scope[$var_id] = clone $new_type; + $updated_vars[$var_id] = true; + } + + continue; + } + + $existing_type = clone $existing_type; + + // if the type changed within the block of statements, process the replacement + // also never allow ourselves to remove all types from a union + if ((!$new_type || !$old_type->equals($new_type)) + && ($new_type || count($existing_type->getAtomicTypes()) > 1) + ) { + $existing_type->substitute($old_type, $new_type); + + if ($new_type && $new_type->from_docblock) { + $existing_type->setFromDocblock(); + } + + $updated_vars[$var_id] = true; + } + + $this->vars_in_scope[$var_id] = $existing_type; + } + } + } + + /** + * @param array $new_vars_in_scope + * + * @return array + */ + public function getRedefinedVars(array $new_vars_in_scope, bool $include_new_vars = false): array + { + $redefined_vars = []; + + foreach ($this->vars_in_scope as $var_id => $this_type) { + if (!isset($new_vars_in_scope[$var_id])) { + if ($include_new_vars) { + $redefined_vars[$var_id] = $this_type; + } + continue; + } + + $new_type = $new_vars_in_scope[$var_id]; + + if (!$this_type->equals($new_type)) { + $redefined_vars[$var_id] = $this_type; + } + } + + return $redefined_vars; + } + + /** + * @return list + */ + public static function getNewOrUpdatedVarIds(Context $original_context, Context $new_context): array + { + $redefined_var_ids = []; + + foreach ($new_context->vars_in_scope as $var_id => $context_type) { + if (!isset($original_context->vars_in_scope[$var_id]) + || ($original_context->assigned_var_ids[$var_id] ?? 0) + !== ($new_context->assigned_var_ids[$var_id] ?? 0) + || !$original_context->vars_in_scope[$var_id]->equals($context_type) + ) { + $redefined_var_ids[] = $var_id; + } + } + + return $redefined_var_ids; + } + + public function remove(string $remove_var_id): void + { + unset( + $this->referenced_var_ids[$remove_var_id], + $this->vars_possibly_in_scope[$remove_var_id] + ); + + if (isset($this->vars_in_scope[$remove_var_id])) { + $existing_type = $this->vars_in_scope[$remove_var_id]; + unset($this->vars_in_scope[$remove_var_id]); + + $this->removeDescendents($remove_var_id, $existing_type); + } + } + + /** + * @param Clause[] $clauses + * @param array $changed_var_ids + * + * @return array{list, list} + * + * @psalm-pure + */ + public static function removeReconciledClauses(array $clauses, array $changed_var_ids): array + { + $included_clauses = []; + $rejected_clauses = []; + + foreach ($clauses as $c) { + if ($c->wedge) { + $included_clauses[] = $c; + continue; + } + + foreach ($c->possibilities as $key => $_) { + if (isset($changed_var_ids[$key])) { + $rejected_clauses[] = $c; + continue 2; + } + } + + $included_clauses[] = $c; + } + + return [$included_clauses, $rejected_clauses]; + } + + /** + * @param Clause[] $clauses + * + * @return list + */ + public static function filterClauses( + string $remove_var_id, + array $clauses, + ?Union $new_type = null, + ?StatementsAnalyzer $statements_analyzer = null + ): array { + $new_type_string = $new_type ? $new_type->getId() : ''; + + $clauses_to_keep = []; + + foreach ($clauses as $clause) { + $clause = $clause->calculateNegation(); + + $quoted_remove_var_id = preg_quote($remove_var_id, '/'); + + foreach ($clause->possibilities as $var_id => $_) { + if (preg_match('/' . $quoted_remove_var_id . '[\]\[\-]/', $var_id)) { + break 2; + } + } + + if (!isset($clause->possibilities[$remove_var_id]) || + $clause->possibilities[$remove_var_id] === [$new_type_string] + ) { + $clauses_to_keep[] = $clause; + } elseif ($statements_analyzer && + $new_type && + !$new_type->hasMixed() + ) { + $type_changed = false; + + // if the clause contains any possibilities that would be altered + // by the new type + foreach ($clause->possibilities[$remove_var_id] as $type) { + // if we're negating a type, we generally don't need the clause anymore + if ($type[0] === '!' && $type !== '!falsy' && $type !== '!empty') { + $type_changed = true; + break; + } + + $result_type = AssertionReconciler::reconcile( + $type, + clone $new_type, + null, + $statements_analyzer, + false, + [], + null, + [], + $failed_reconciliation + ); + + if ($result_type->getId() !== $new_type_string) { + $type_changed = true; + break; + } + } + + if (!$type_changed) { + $clauses_to_keep[] = $clause; + } + } + } + + return $clauses_to_keep; + } + + public function removeVarFromConflictingClauses( + string $remove_var_id, + ?Union $new_type = null, + ?StatementsAnalyzer $statements_analyzer = null + ): void { + $this->clauses = self::filterClauses($remove_var_id, $this->clauses, $new_type, $statements_analyzer); + + if ($this->parent_context) { + $this->parent_context->removeVarFromConflictingClauses($remove_var_id); + } + } + + /** + * This method is used after assignments to variables to remove any existing + * items in $vars_in_scope that are now made redundant by an update to some data + */ + public function removeDescendents( + string $remove_var_id, + ?Union $existing_type = null, + ?Union $new_type = null, + ?StatementsAnalyzer $statements_analyzer = null + ): void { + if (!$existing_type && isset($this->vars_in_scope[$remove_var_id])) { + $existing_type = $this->vars_in_scope[$remove_var_id]; + } + + if (!$existing_type) { + return; + } + + $existing_type->allow_mutations = true; + + $this->removeVarFromConflictingClauses( + $remove_var_id, + $existing_type->hasMixed() + || ($new_type && $existing_type->from_docblock !== $new_type->from_docblock) + ? null + : $new_type, + $statements_analyzer + ); + + foreach ($this->vars_in_scope as $var_id => $type) { + if (preg_match('/' . preg_quote($remove_var_id, '/') . '[\]\[\-]/', $var_id)) { + unset($this->vars_in_scope[$var_id]); + } + + foreach ($type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof DependentType + && $atomic_type->getVarId() === $remove_var_id + ) { + $type->addType($atomic_type->getReplacement()); + } + } + } + } + + public function removeMutableObjectVars(bool $methods_only = false): void + { + $vars_to_remove = []; + + foreach ($this->vars_in_scope as $var_id => $type) { + if ($type->has_mutations + && (strpos($var_id, '->') !== false || strpos($var_id, '::') !== false) + && (!$methods_only || strpos($var_id, '()')) + ) { + $vars_to_remove[] = $var_id; + } + } + + if (!$vars_to_remove) { + return; + } + + foreach ($vars_to_remove as $var_id) { + unset($this->vars_in_scope[$var_id], $this->vars_possibly_in_scope[$var_id]); + } + + $clauses_to_keep = []; + + foreach ($this->clauses as $clause) { + $abandon_clause = false; + + foreach (array_keys($clause->possibilities) as $key) { + if ((strpos($key, '->') !== false || strpos($key, '::') !== false) + && (!$methods_only || strpos($key, '()')) + ) { + $abandon_clause = true; + break; + } + } + + if (!$abandon_clause) { + $clauses_to_keep[] = $clause; + } + } + + $this->clauses = $clauses_to_keep; + + if ($this->parent_context) { + $this->parent_context->removeMutableObjectVars($methods_only); + } + } + + public function updateChecks(Context $op_context): void + { + $this->check_classes = $this->check_classes && $op_context->check_classes; + $this->check_variables = $this->check_variables && $op_context->check_variables; + $this->check_methods = $this->check_methods && $op_context->check_methods; + $this->check_functions = $this->check_functions && $op_context->check_functions; + $this->check_consts = $this->check_consts && $op_context->check_consts; + } + + public function isPhantomClass(string $class_name): bool + { + return isset($this->phantom_classes[strtolower($class_name)]); + } + + public function hasVariable(string $var_name): bool + { + if (!$var_name) { + return false; + } + + $stripped_var = preg_replace('/(->|\[).*$/', '', $var_name); + + if ($stripped_var !== '$this' || $var_name !== $stripped_var) { + $this->referenced_var_ids[$var_name] = true; + + if (!isset($this->vars_possibly_in_scope[$var_name]) + && !isset($this->vars_in_scope[$var_name]) + ) { + return false; + } + } + + return isset($this->vars_in_scope[$var_name]); + } + + public function getScopeSummary(): string + { + $summary = []; + foreach ($this->vars_possibly_in_scope as $k => $_) { + $summary[$k] = true; + } + foreach ($this->vars_in_scope as $k => $v) { + $summary[$k] = $v->getId(); + } + + return json_encode($summary); + } + + public function defineGlobals(): void + { + $globals = [ + '$argv' => new Union([ + new TArray([Type::getInt(), Type::getString()]), + ]), + '$argc' => Type::getInt(), + ]; + + $config = Config::getInstance(); + + foreach ($config->globals as $global_id => $type_string) { + $globals[$global_id] = Type::parseString($type_string); + } + + foreach ($globals as $global_id => $type) { + $this->vars_in_scope[$global_id] = $type; + $this->vars_possibly_in_scope[$global_id] = true; + } + } + + public function mergeExceptions(Context $other_context): void + { + foreach ($other_context->possibly_thrown_exceptions as $possibly_thrown_exception => $codelocations) { + foreach ($codelocations as $hash => $codelocation) { + $this->possibly_thrown_exceptions[$possibly_thrown_exception][$hash] = $codelocation; + } + } + } + + public function isSuppressingExceptions(StatementsAnalyzer $statements_analyzer): bool + { + if (!$this->collect_exceptions) { + return true; + } + + $issue_type = $this->is_global ? 'UncaughtThrowInGlobalScope' : 'MissingThrowsDocblock'; + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + $suppressed_issue_position = array_search($issue_type, $suppressed_issues, true); + if ($suppressed_issue_position !== false) { + if (is_int($suppressed_issue_position)) { + $file = $statements_analyzer->getFileAnalyzer()->getFilePath(); + IssueBuffer::addUsedSuppressions([ + $file => [$suppressed_issue_position => true], + ]); + } + return true; + } + + return false; + } + + public function mergeFunctionExceptions( + FunctionLikeStorage $function_storage, + CodeLocation $codelocation + ): void { + $hash = $codelocation->getHash(); + foreach ($function_storage->throws as $possibly_thrown_exception => $_) { + $this->possibly_thrown_exceptions[$possibly_thrown_exception][$hash] = $codelocation; + } + } + + public function insideUse(): bool + { + return $this->inside_assignment + || $this->inside_return + || $this->inside_call + || $this->inside_general_use + || $this->inside_conditional + || $this->inside_throw + || $this->inside_isset; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/DocComment.php b/vendor/vimeo/psalm/src/Psalm/DocComment.php new file mode 100644 index 00000000..ae3cd6ca --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/DocComment.php @@ -0,0 +1,245 @@ +>} + * @psalm-suppress PossiblyUnusedMethod + * + * @deprecated use parsePreservingLength instead, going to be removed in Psalm 5 + * + * @psalm-pure + */ + public static function parse(string $docblock, ?int $line_number = null, bool $preserve_format = false): array + { + // Strip off comments. + $docblock = trim($docblock); + $docblock = preg_replace('@^/\*\*@', '', $docblock); + $docblock = preg_replace('@\*/$@', '', $docblock); + $docblock = preg_replace('@^[ \t]*\*@m', '', $docblock); + + // Normalize multi-line @specials. + $lines = explode("\n", $docblock); + + $line_map = []; + + $last = false; + foreach ($lines as $k => $line) { + if (preg_match('/^\s?@\w/i', $line)) { + $last = $k; + } elseif (preg_match('/^\s*$/', $line)) { + $last = false; + } elseif ($last !== false) { + $old_last_line = $lines[$last]; + $lines[$last] = rtrim($old_last_line) + . ($preserve_format || trim($old_last_line) === '@return' ? "\n" . $line : ' ' . trim($line)); + + if ($line_number) { + $old_line_number = $line_map[$old_last_line]; + unset($line_map[$old_last_line]); + $line_map[$lines[$last]] = $old_line_number; + } + + unset($lines[$k]); + } + + if ($line_number) { + $line_map[$line] = $line_number++; + } + } + + $special = []; + + if ($preserve_format) { + foreach ($lines as $m => $line) { + if (preg_match('/^\s?@([\w\-:]+)[\t ]*(.*)$/sm', $line, $matches)) { + [$full_match, $type, $data] = $matches; + + $docblock = str_replace($full_match, '', $docblock); + + if (empty($special[$type])) { + $special[$type] = []; + } + + $line_number = $line_map && isset($line_map[$full_match]) ? $line_map[$full_match] : $m; + + $special[$type][$line_number] = rtrim($data); + } + } + } else { + $docblock = implode("\n", $lines); + + // Parse @specials. + if (preg_match_all('/^\s?@([\w\-:]+)[\t ]*([^\n]*)/m', $docblock, $matches, PREG_SET_ORDER)) { + $docblock = preg_replace('/^\s?@([\w\-:]+)\s*([^\n]*)/m', '', $docblock); + foreach ($matches as $m => $match) { + [$_, $type, $data] = $match; + + if (empty($special[$type])) { + $special[$type] = []; + } + + $line_number = $line_map && isset($line_map[$_]) ? $line_map[$_] : $m; + + $special[$type][$line_number] = $data; + } + } + } + + $docblock = str_replace("\t", ' ', $docblock); + + // Smush the whole docblock to the left edge. + $min_indent = 80; + $indent = 0; + foreach (array_filter(explode("\n", $docblock)) as $line) { + for ($ii = 0, $iiMax = strlen($line); $ii < $iiMax; ++$ii) { + if ($line[$ii] !== ' ') { + break; + } + ++$indent; + } + + $min_indent = min($indent, $min_indent); + } + + $docblock = preg_replace('/^' . str_repeat(' ', $min_indent) . '/m', '', $docblock); + $docblock = rtrim($docblock); + + // Trim any empty lines off the front, but leave the indent level if there + // is one. + $docblock = preg_replace('/^\s*\n/', '', $docblock); + + foreach ($special as $special_key => $_) { + if (strpos($special_key, 'psalm-') === 0) { + $special_key = substr($special_key, 6); + + if (!in_array( + $special_key, + self::PSALM_ANNOTATIONS, + true + )) { + throw new DocblockParseException('Unrecognised annotation @psalm-' . $special_key); + } + } + } + + return [ + 'description' => $docblock, + 'specials' => $special, + ]; + } + + /** + * Parse a docblock comment into its parts. + */ + public static function parsePreservingLength(Doc $docblock): ParsedDocblock + { + $parsed_docblock = DocblockParser::parse( + $docblock->getText(), + $docblock->getStartFilePos() + ); + + foreach ($parsed_docblock->tags as $special_key => $_) { + if (strpos($special_key, 'psalm-') === 0) { + $special_key = substr($special_key, 6); + + if (!in_array( + $special_key, + self::PSALM_ANNOTATIONS, + true + )) { + throw new DocblockParseException('Unrecognised annotation @psalm-' . $special_key); + } + } + } + + return $parsed_docblock; + } + + /** + * @psalm-pure + * @return array + */ + public static function parseSuppressList(string $suppress_entry): array + { + preg_match( + '/ + (?(DEFINE) + # either a single issue or comma separated list of issues + (? (?&issue) \s* , \s* (?&issue_list) | (?&issue) ) + + # definition of a single issue + (? [A-Za-z0-9_-]+ ) + ) + ^ (?P (?&issue_list) ) (?P .* ) $ + /xm', + $suppress_entry, + $matches + ); + + if (!isset($matches['issues'])) { + return []; + } + + $issue_offset = 0; + $ret = []; + + foreach (explode(',', $matches['issues']) as $suppressed_issue) { + $issue_offset += strspn($suppressed_issue, "\t\n\f\r "); + $ret[$issue_offset] = trim($suppressed_issue); + $issue_offset += strlen($suppressed_issue) + 1; + } + + return $ret; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/ErrorBaseline.php b/vendor/vimeo/psalm/src/Psalm/ErrorBaseline.php new file mode 100644 index 00000000..9759ab94 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/ErrorBaseline.php @@ -0,0 +1,331 @@ +}>> $existingIssues + * + * + * @psalm-pure + */ + public static function countTotalIssues(array $existingIssues): int + { + $totalIssues = 0; + + foreach ($existingIssues as $existingIssue) { + $totalIssues += array_reduce( + $existingIssue, + /** + * @param array{o:int, s:array} $existingIssue + */ + function (int $carry, array $existingIssue): int { + return $carry + $existingIssue['o']; + }, + 0 + ); + } + + return $totalIssues; + } + + /** + * @param array> $issues + * + */ + public static function create( + FileProvider $fileProvider, + string $baselineFile, + array $issues, + bool $include_php_versions + ): void { + $groupedIssues = self::countIssueTypesByFile($issues); + + self::writeToFile($fileProvider, $baselineFile, $groupedIssues, $include_php_versions); + } + + /** + * @return array}>> + * + * @throws ConfigException + */ + public static function read(FileProvider $fileProvider, string $baselineFile): array + { + if (!$fileProvider->fileExists($baselineFile)) { + throw new ConfigException("{$baselineFile} does not exist or is not readable"); + } + + $xmlSource = $fileProvider->getContents($baselineFile); + + if ($xmlSource === '') { + throw new ConfigException('Baseline file is empty'); + } + + $baselineDoc = new DOMDocument(); + $baselineDoc->loadXML($xmlSource, LIBXML_NOBLANKS); + + $filesElement = $baselineDoc->getElementsByTagName('files'); + + if ($filesElement->length === 0) { + throw new ConfigException('Baseline file does not contain '); + } + + $files = []; + + /** @var DOMElement $filesElement */ + $filesElement = $filesElement[0]; + + foreach ($filesElement->getElementsByTagName('file') as $file) { + $fileName = $file->getAttribute('src'); + + $fileName = str_replace('\\', '/', $fileName); + + $files[$fileName] = []; + + foreach ($file->childNodes as $issue) { + if (!$issue instanceof DOMElement) { + continue; + } + + $issueType = $issue->tagName; + + $files[$fileName][$issueType] = [ + 'o' => (int)$issue->getAttribute('occurrences'), + 's' => [], + ]; + $codeSamples = $issue->getElementsByTagName('code'); + + foreach ($codeSamples as $codeSample) { + $files[$fileName][$issueType]['s'][] = trim($codeSample->textContent); + } + } + } + + return $files; + } + + /** + * @param array> $issues + * + * @return array}>> + * + * @throws ConfigException + */ + public static function update( + FileProvider $fileProvider, + string $baselineFile, + array $issues, + bool $include_php_versions + ): array { + $existingIssues = self::read($fileProvider, $baselineFile); + $newIssues = self::countIssueTypesByFile($issues); + + foreach ($existingIssues as $file => &$existingIssuesCount) { + if (!isset($newIssues[$file])) { + unset($existingIssues[$file]); + + continue; + } + + foreach ($existingIssuesCount as $issueType => $existingIssueType) { + if (!isset($newIssues[$file][$issueType])) { + unset($existingIssuesCount[$issueType]); + + continue; + } + + $existingIssuesCount[$issueType]['o'] = min( + $existingIssueType['o'], + $newIssues[$file][$issueType]['o'] + ); + $existingIssuesCount[$issueType]['s'] = array_intersect( + $existingIssueType['s'], + $newIssues[$file][$issueType]['s'] + ); + } + } + + $groupedIssues = array_filter($existingIssues); + + self::writeToFile($fileProvider, $baselineFile, $groupedIssues, $include_php_versions); + + return $groupedIssues; + } + + /** + * @param array> $issues + * + * @return array}>> + */ + private static function countIssueTypesByFile(array $issues): array + { + if ($issues === []) { + return []; + } + $groupedIssues = array_reduce( + array_merge(...array_values($issues)), + /** + * @param array}>> $carry + * + * @return array}>> + */ + function (array $carry, IssueData $issue): array { + if ($issue->severity !== Config::REPORT_ERROR) { + return $carry; + } + + $fileName = $issue->file_name; + $fileName = str_replace('\\', '/', $fileName); + $issueType = $issue->type; + + if (!isset($carry[$fileName])) { + $carry[$fileName] = []; + } + + if (!isset($carry[$fileName][$issueType])) { + $carry[$fileName][$issueType] = ['o' => 0, 's' => []]; + } + + ++$carry[$fileName][$issueType]['o']; + + if (!strpos($issue->selected_text, "\n")) { + $carry[$fileName][$issueType]['s'][] = $issue->selected_text; + } + + return $carry; + }, + [] + ); + + // Sort files first + ksort($groupedIssues); + + foreach ($groupedIssues as &$issues) { + ksort($issues); + } + + return $groupedIssues; + } + + /** + * @param array}>> $groupedIssues + * + */ + private static function writeToFile( + FileProvider $fileProvider, + string $baselineFile, + array $groupedIssues, + bool $include_php_versions + ): void { + $baselineDoc = new DOMDocument('1.0', 'UTF-8'); + $filesNode = $baselineDoc->createElement('files'); + $filesNode->setAttribute('psalm-version', PSALM_VERSION); + + if ($include_php_versions) { + $extensions = array_merge(get_loaded_extensions(), get_loaded_extensions(true)); + + usort($extensions, 'strnatcasecmp'); + + $filesNode->setAttribute('php-version', implode(';' . "\n\t", array_merge( + [ + ('php:' . PHP_VERSION), + ], + array_map( + function (string $extension): string { + return $extension . ':' . phpversion($extension); + }, + $extensions + ) + ))); + } + + foreach ($groupedIssues as $file => $issueTypes) { + $fileNode = $baselineDoc->createElement('file'); + + $fileNode->setAttribute('src', $file); + + foreach ($issueTypes as $issueType => $existingIssueType) { + $issueNode = $baselineDoc->createElement($issueType); + + $issueNode->setAttribute('occurrences', (string)$existingIssueType['o']); + + sort($existingIssueType['s']); + + foreach ($existingIssueType['s'] as $selection) { + $codeNode = $baselineDoc->createElement('code'); + + /** @todo in major version release (e.g. Psalm 5) replace $selection with trim($selection) + * This will be a minor BC break as baselines generated will then not be compatible with Psalm + * versions from before PR https://github.com/vimeo/psalm/pull/6000 + */ + $codeNode->textContent = $selection; + $issueNode->appendChild($codeNode); + } + $fileNode->appendChild($issueNode); + } + + $filesNode->appendChild($fileNode); + } + + $baselineDoc->appendChild($filesNode); + $baselineDoc->formatOutput = true; + + $xml = preg_replace_callback( + '/)\n)/', + /** + * @param string[] $matches + */ + function (array $matches): string { + return + 'saveXML() + ); + + if ($xml === null) { + throw new RuntimeException('Failed to reformat opening attributes!'); + } + + $fileProvider->setContents($baselineFile, $xml); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php b/vendor/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php new file mode 100644 index 00000000..2056b1a3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php @@ -0,0 +1,9 @@ +path = $path; + $this->config = $config; + $this->codebase = $codebase; + } + + public function __invoke(RegistrationInterface $registration, ?SimpleXMLElement $config = null): void + { + $fq_class_name = $this->getPluginClassForPath($this->path); + + /** @psalm-suppress UnresolvableInclude */ + require_once($this->path); + + assert(class_exists($fq_class_name)); + + $registration->registerHooksFromClass($fq_class_name); + } + + private function getPluginClassForPath(string $path): string + { + $codebase = $this->codebase; + + $path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $path); + + $file_storage = $codebase->createFileStorageForPath($path); + $file_to_scan = new FileScanner($path, $this->config->shortenFileName($path), true); + $file_to_scan->scan( + $codebase, + $file_storage + ); + + $declared_classes = ClassLikeAnalyzer::getClassesForFile($codebase, $path); + + return reset($declared_classes); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/FileManipulation.php b/vendor/vimeo/psalm/src/Psalm/FileManipulation.php new file mode 100644 index 00000000..d9e7884d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/FileManipulation.php @@ -0,0 +1,83 @@ +start = $start; + $this->end = $end; + $this->insertion_text = $insertion_text; + $this->preserve_indentation = $preserve_indentation; + $this->remove_trailing_newline = $remove_trailing_newline; + } + + public function getKey(): string + { + return $this->start === $this->end + ? ($this->start . ':' . sha1($this->insertion_text)) + : ($this->start . ':' . $this->end); + } + + public function transform(string $existing_contents): string + { + if ($this->preserve_indentation) { + $newline_pos = strrpos($existing_contents, "\n", $this->start - strlen($existing_contents)); + + $newline_pos = $newline_pos !== false ? $newline_pos + 1 : 0; + + $indentation = substr($existing_contents, $newline_pos, $this->start - $newline_pos); + + if (trim($indentation) === '') { + $this->insertion_text .= $indentation; + } + } + + if ($this->remove_trailing_newline + && strlen($existing_contents) > $this->end + && $existing_contents[$this->end] === "\n" + ) { + $newline_pos = strrpos($existing_contents, "\n", $this->start - strlen($existing_contents)); + + $newline_pos = $newline_pos !== false ? $newline_pos + 1 : 0; + + $indentation = substr($existing_contents, $newline_pos, $this->start - $newline_pos); + + if (trim($indentation) === '') { + $this->start -= strlen($indentation); + $this->end++; + } + } + + return substr($existing_contents, 0, $this->start) + . $this->insertion_text + . substr($existing_contents, $this->end); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/FileSource.php b/vendor/vimeo/psalm/src/Psalm/FileSource.php new file mode 100644 index 00000000..9d1c5ff9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/FileSource.php @@ -0,0 +1,16 @@ +>> $all_types + * + * @return array>> + * + * @psalm-pure + */ + public static function negateTypes(array $all_types): array + { + return array_filter( + array_map( + /** + * @param non-empty-list> $anded_types + * + * @return list> + */ + function (array $anded_types): array { + if (count($anded_types) > 1) { + $new_anded_types = []; + + foreach ($anded_types as $orred_types) { + if (count($orred_types) > 1) { + return []; + } + + $new_anded_types[] = self::negateType($orred_types[0]); + } + + return [$new_anded_types]; + } + + $new_orred_types = []; + + foreach ($anded_types[0] as $orred_type) { + $new_orred_types[] = [self::negateType($orred_type)]; + } + + return $new_orred_types; + }, + $all_types + ) + ); + } + + /** + * @psalm-pure + */ + public static function negateType(string $type): string + { + if ($type === 'mixed') { + return $type; + } + + return $type[0] === '!' ? substr($type, 1) : '!' . $type; + } + + /** + * This is a very simple simplification heuristic + * for CNF formulae. + * + * It simplifies formulae: + * ($a) && ($a || $b) => $a + * (!$a) && (!$b) && ($a || $b || $c) => $c + * + * @param list $clauses + * + * @return list + * + * @psalm-pure + */ + public static function simplifyCNF(array $clauses): array + { + $clause_count = count($clauses); + + //65536 seems to be a significant threshold, when put at 65537, the code https://psalm.dev/r/216f362ea6 goes + //from seconds in analysis to many minutes + if ($clause_count > 65536) { + return []; + } + + if ($clause_count > 50) { + $all_has_unknown = true; + + foreach ($clauses as $clause) { + $clause_has_unknown = false; + foreach ($clause->possibilities as $key => $_) { + if ($key[0] === '*') { + $clause_has_unknown = true; + break; + } + } + + if (!$clause_has_unknown) { + $all_has_unknown = false; + break; + } + } + + if ($all_has_unknown) { + return $clauses; + } + } + + $cloned_clauses = []; + + // avoid strict duplicates + foreach ($clauses as $clause) { + $unique_clause = $clause->makeUnique(); + $cloned_clauses[$unique_clause->hash] = $unique_clause; + } + + // remove impossible types + foreach ($cloned_clauses as $clause_a_hash => $clause_a) { + if (!$clause_a->reconcilable || $clause_a->wedge) { + continue; + } + $clause_a_keys = array_keys($clause_a->possibilities); + + if (count($clause_a->possibilities) !== 1 || count(array_values($clause_a->possibilities)[0]) !== 1) { + foreach ($cloned_clauses as $clause_b) { + if ($clause_a === $clause_b || !$clause_b->reconcilable || $clause_b->wedge) { + continue; + } + + if ($clause_a_keys === array_keys($clause_b->possibilities)) { + $opposing_keys = []; + + foreach ($clause_a->possibilities as $key => $a_possibilities) { + $b_possibilities = $clause_b->possibilities[$key]; + + if ($a_possibilities === $b_possibilities) { + continue; + } + + if (count($a_possibilities) === 1 && count($b_possibilities) === 1) { + if ($a_possibilities[0] === '!' . $b_possibilities[0] + || $b_possibilities[0] === '!' . $a_possibilities[0] + ) { + $opposing_keys[] = $key; + continue; + } + } + + continue 2; + } + + if (count($opposing_keys) === 1) { + unset($cloned_clauses[$clause_a_hash]); + + $clause_a = $clause_a->removePossibilities($opposing_keys[0]); + + if (!$clause_a) { + continue 2; + } + + $cloned_clauses[$clause_a->hash] = $clause_a; + } + } + } + + continue; + } + + $clause_var = array_keys($clause_a->possibilities)[0]; + $only_type = array_pop(array_values($clause_a->possibilities)[0]); + $negated_clause_type = self::negateType($only_type); + + foreach ($cloned_clauses as $clause_b_hash => $clause_b) { + if ($clause_a === $clause_b || !$clause_b->reconcilable || $clause_b->wedge) { + continue; + } + + if (isset($clause_b->possibilities[$clause_var]) && + in_array($negated_clause_type, $clause_b->possibilities[$clause_var], true) + ) { + $clause_var_possibilities = array_values( + array_filter( + $clause_b->possibilities[$clause_var], + function (string $possible_type) use ($negated_clause_type): bool { + return $possible_type !== $negated_clause_type; + } + ) + ); + + unset($cloned_clauses[$clause_b_hash]); + + if (!$clause_var_possibilities) { + $updated_clause = $clause_b->removePossibilities($clause_var); + + if ($updated_clause) { + $cloned_clauses[$updated_clause->hash] = $updated_clause; + } + } else { + $updated_clause = $clause_b->addPossibilities( + $clause_var, + $clause_var_possibilities + ); + + $cloned_clauses[$updated_clause->hash] = $updated_clause; + } + } + } + } + + $simplified_clauses = []; + + foreach ($cloned_clauses as $clause_a) { + $is_redundant = false; + + foreach ($cloned_clauses as $clause_b) { + if ($clause_a === $clause_b + || !$clause_b->reconcilable + || $clause_b->wedge + || $clause_a->wedge + ) { + continue; + } + + if ($clause_a->contains($clause_b)) { + $is_redundant = true; + break; + } + } + + if (!$is_redundant) { + $simplified_clauses[] = $clause_a; + } + } + + return $simplified_clauses; + } + + /** + * Look for clauses with only one possible value + * + * @param list $clauses + * @param array $cond_referenced_var_ids + * @param array>> $active_truths + * + * @return array>> + */ + public static function getTruthsFromFormula( + array $clauses, + ?int $creating_conditional_id = null, + array &$cond_referenced_var_ids = [], + array &$active_truths = [] + ): array { + $truths = []; + $active_truths = []; + + if ($clauses === []) { + return []; + } + + foreach ($clauses as $clause) { + if (!$clause->reconcilable || count($clause->possibilities) !== 1) { + continue; + } + + foreach ($clause->possibilities as $var => $possible_types) { + if ($var[0] === '*') { + continue; + } + + // if there's only one possible type, return it + if (count($possible_types) === 1) { + $possible_type = array_pop($possible_types); + + if (isset($truths[$var]) && !isset($clause->redefined_vars[$var])) { + $truths[$var][] = [$possible_type]; + } else { + $truths[$var] = [[$possible_type]]; + } + + if ($creating_conditional_id && $creating_conditional_id === $clause->creating_conditional_id) { + if (!isset($active_truths[$var])) { + $active_truths[$var] = []; + } + + $active_truths[$var][count($truths[$var]) - 1] = [$possible_type]; + } + } else { + // if there's only one active clause, return all the non-negation clause members ORed together + $things_that_can_be_said = array_filter( + $possible_types, + function (string $possible_type): bool { + return $possible_type[0] !== '!'; + } + ); + + if ($things_that_can_be_said && count($things_that_can_be_said) === count($possible_types)) { + $things_that_can_be_said = array_unique($things_that_can_be_said); + + if ($clause->generated && count($possible_types) > 1) { + unset($cond_referenced_var_ids[$var]); + } + + /** @var array $things_that_can_be_said */ + $truths[$var] = [$things_that_can_be_said]; + + if ($creating_conditional_id && $creating_conditional_id === $clause->creating_conditional_id) { + $active_truths[$var] = [$things_that_can_be_said]; + } + } + } + } + } + + return $truths; + } + + /** + * @param non-empty-list $clauses + * + * @return list + * + * @psalm-pure + */ + public static function groupImpossibilities(array $clauses): array + { + $complexity = 1; + + $seed_clauses = []; + + $clause = array_pop($clauses); + + if (!$clause->wedge) { + if ($clause->impossibilities === null) { + throw new UnexpectedValueException('$clause->impossibilities should not be null'); + } + + foreach ($clause->impossibilities as $var => $impossible_types) { + foreach ($impossible_types as $impossible_type) { + $seed_clause = new Clause( + [$var => [$impossible_type]], + $clause->creating_conditional_id, + $clause->creating_object_id + ); + + $seed_clauses[] = $seed_clause; + + ++$complexity; + } + } + } + + if (!$clauses || !$seed_clauses) { + return $seed_clauses; + } + + while ($clauses) { + $clause = array_pop($clauses); + + $new_clauses = []; + + foreach ($seed_clauses as $grouped_clause) { + if ($clause->impossibilities === null) { + throw new UnexpectedValueException('$clause->impossibilities should not be null'); + } + + foreach ($clause->impossibilities as $var => $impossible_types) { + foreach ($impossible_types as $impossible_type) { + $new_clause_possibilities = $grouped_clause->possibilities; + + if (isset($grouped_clause->possibilities[$var])) { + $new_clause_possibilities[$var] = array_values( + array_unique( + array_merge([$impossible_type], $new_clause_possibilities[$var]) + ) + ); + + $removed_indexes = []; + + for ($i = 0, $l = count($new_clause_possibilities[$var]); $i < $l; $i++) { + for ($j = $i + 1; $j < $l; $j++) { + $ith = $new_clause_possibilities[$var][$i]; + $jth = $new_clause_possibilities[$var][$j]; + + if ($ith === '!' . $jth || $jth === '!' . $ith) { + $removed_indexes[$i] = true; + $removed_indexes[$j] = true; + } + } + } + + if ($removed_indexes) { + $new_possibilities = array_values( + array_diff_key( + $new_clause_possibilities[$var], + $removed_indexes + ) + ); + + if (!$new_possibilities) { + unset($new_clause_possibilities[$var]); + } else { + $new_clause_possibilities[$var] = $new_possibilities; + } + } + } else { + $new_clause_possibilities[$var] = [$impossible_type]; + } + + if (!$new_clause_possibilities) { + continue; + } + + $new_clause = new Clause( + $new_clause_possibilities, + $grouped_clause->creating_conditional_id, + $clause->creating_object_id, + false, + true, + true, + [] + ); + + $new_clauses[] = $new_clause; + + ++$complexity; + + if ($complexity > 20000) { + throw new ComplicatedExpressionException(); + } + } + } + } + + $seed_clauses = $new_clauses; + } + + return $seed_clauses; + } + + /** + * @param list $left_clauses + * @param list $right_clauses + * + * @return list + * + * @psalm-pure + */ + public static function combineOredClauses( + array $left_clauses, + array $right_clauses, + int $conditional_object_id + ): array { + if (count($left_clauses) > 60000 || count($right_clauses) > 60000) { + return []; + } + + $clauses = []; + + $all_wedges = true; + $has_wedge = false; + + foreach ($left_clauses as $left_clause) { + foreach ($right_clauses as $right_clause) { + $all_wedges = $all_wedges && ($left_clause->wedge && $right_clause->wedge); + $has_wedge = $has_wedge || ($left_clause->wedge && $right_clause->wedge); + } + } + + if ($all_wedges) { + return [new Clause([], $conditional_object_id, $conditional_object_id, true)]; + } + + foreach ($left_clauses as $left_clause) { + foreach ($right_clauses as $right_clause) { + if ($left_clause->wedge && $right_clause->wedge) { + // handled below + continue; + } + + /** @var array> */ + $possibilities = []; + + $can_reconcile = true; + + if ($left_clause->wedge || + $right_clause->wedge || + !$left_clause->reconcilable || + !$right_clause->reconcilable + ) { + $can_reconcile = false; + } + + foreach ($left_clause->possibilities as $var => $possible_types) { + if (isset($right_clause->redefined_vars[$var])) { + continue; + } + + if (isset($possibilities[$var])) { + $possibilities[$var] = array_merge($possibilities[$var], $possible_types); + } else { + $possibilities[$var] = $possible_types; + } + } + + foreach ($right_clause->possibilities as $var => $possible_types) { + if (isset($possibilities[$var])) { + $possibilities[$var] = array_merge($possibilities[$var], $possible_types); + } else { + $possibilities[$var] = $possible_types; + } + } + + if (count($left_clauses) > 1 || count($right_clauses) > 1) { + foreach ($possibilities as $var => $p) { + $possibilities[$var] = array_values(array_unique($p)); + } + } + + foreach ($possibilities as $var_possibilities) { + if (count($var_possibilities) === 2) { + if ($var_possibilities[0] === '!' . $var_possibilities[1] + || $var_possibilities[1] === '!' . $var_possibilities[0] + ) { + continue 2; + } + } + } + + $creating_conditional_id = + $right_clause->creating_conditional_id === $left_clause->creating_conditional_id + ? $right_clause->creating_conditional_id + : $conditional_object_id; + + $clauses[] = new Clause( + $possibilities, + $creating_conditional_id, + $creating_conditional_id, + false, + $can_reconcile, + $right_clause->generated + || $left_clause->generated + || count($left_clauses) > 1 + || count($right_clauses) > 1, + [] + ); + } + } + + if ($has_wedge) { + $clauses[] = new Clause([], $conditional_object_id, $conditional_object_id, true); + } + + return $clauses; + } + + /** + * Negates a set of clauses + * negateClauses([$a || $b]) => !$a && !$b + * negateClauses([$a, $b]) => !$a || !$b + * negateClauses([$a, $b || $c]) => + * (!$a || !$b) && + * (!$a || !$c) + * negateClauses([$a, $b || $c, $d || $e || $f]) => + * (!$a || !$b || !$d) && + * (!$a || !$b || !$e) && + * (!$a || !$b || !$f) && + * (!$a || !$c || !$d) && + * (!$a || !$c || !$e) && + * (!$a || !$c || !$f) + * + * @param list $clauses + * + * @return non-empty-list + */ + public static function negateFormula(array $clauses): array + { + $clauses = array_filter( + $clauses, + function ($clause) { + return $clause->reconcilable; + } + ); + + if (!$clauses) { + $cond_id = mt_rand(0, 100000000); + return [new Clause([], $cond_id, $cond_id, true)]; + } + + $clauses_with_impossibilities = []; + + foreach ($clauses as $clause) { + $clauses_with_impossibilities[] = $clause->calculateNegation(); + } + + unset($clauses); + + $impossible_clauses = self::groupImpossibilities($clauses_with_impossibilities); + + if (!$impossible_clauses) { + $cond_id = mt_rand(0, 100000000); + return [new Clause([], $cond_id, $cond_id, true)]; + } + + $negated = self::simplifyCNF($impossible_clauses); + + if (!$negated) { + $cond_id = mt_rand(0, 100000000); + return [new Clause([], $cond_id, $cond_id, true)]; + } + + return $negated; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php new file mode 100644 index 00000000..b6504af7 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php @@ -0,0 +1,457 @@ + + */ + public static function getFormula( + int $conditional_object_id, + int $creating_object_id, + PhpParser\Node\Expr $conditional, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase = null, + bool $inside_negation = false, + bool $cache = true + ): array { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd || + $conditional instanceof PhpParser\Node\Expr\BinaryOp\LogicalAnd + ) { + $left_assertions = self::getFormula( + $conditional_object_id, + spl_object_id($conditional->left), + $conditional->left, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + + $right_assertions = self::getFormula( + $conditional_object_id, + spl_object_id($conditional->right), + $conditional->right, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + + return array_merge( + $left_assertions, + $right_assertions + ); + } + + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr || + $conditional instanceof PhpParser\Node\Expr\BinaryOp\LogicalOr + ) { + $left_clauses = self::getFormula( + $conditional_object_id, + spl_object_id($conditional->left), + $conditional->left, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + + $right_clauses = self::getFormula( + $conditional_object_id, + spl_object_id($conditional->right), + $conditional->right, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + + return Algebra::combineOredClauses($left_clauses, $right_clauses, $conditional_object_id); + } + + if ($conditional instanceof PhpParser\Node\Expr\BooleanNot) { + if ($conditional->expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr) { + $and_expr = new VirtualBooleanAnd( + new VirtualBooleanNot( + $conditional->expr->left, + $conditional->getAttributes() + ), + new VirtualBooleanNot( + $conditional->expr->right, + $conditional->getAttributes() + ), + $conditional->expr->getAttributes() + ); + + return self::getFormula( + $conditional_object_id, + $conditional_object_id, + $and_expr, + $this_class_name, + $source, + $codebase, + $inside_negation, + false + ); + } + + if ($conditional->expr instanceof PhpParser\Node\Expr\Isset_ + && count($conditional->expr->vars) > 1 + ) { + $anded_assertions = null; + + if ($cache && $source instanceof StatementsAnalyzer) { + $anded_assertions = $source->node_data->getAssertions($conditional->expr); + } + + if ($anded_assertions === null) { + $anded_assertions = AssertionFinder::scrapeAssertions( + $conditional->expr, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + + if ($cache && $source instanceof StatementsAnalyzer) { + $source->node_data->setAssertions($conditional->expr, $anded_assertions); + } + } + + $clauses = []; + + foreach ($anded_assertions as $assertions) { + foreach ($assertions as $var => $anded_types) { + $redefined = false; + + if ($var[0] === '=') { + /** @var string */ + $var = substr($var, 1); + $redefined = true; + } + + foreach ($anded_types as $orred_types) { + $clauses[] = new Clause( + [$var => $orred_types], + $conditional_object_id, + spl_object_id($conditional->expr), + false, + true, + $orred_types[0][0] === '=' + || $orred_types[0][0] === '~' + || (strlen($orred_types[0]) > 1 + && ($orred_types[0][1] === '=' + || $orred_types[0][1] === '~')), + $redefined ? [$var => true] : [] + ); + } + } + } + + return Algebra::negateFormula($clauses); + } + + if ($conditional->expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd) { + $and_expr = new VirtualBooleanOr( + new VirtualBooleanNot( + $conditional->expr->left, + $conditional->getAttributes() + ), + new VirtualBooleanNot( + $conditional->expr->right, + $conditional->getAttributes() + ), + $conditional->expr->getAttributes() + ); + + return self::getFormula( + $conditional_object_id, + spl_object_id($conditional->expr), + $and_expr, + $this_class_name, + $source, + $codebase, + $inside_negation, + false + ); + } + + return Algebra::negateFormula( + self::getFormula( + $conditional_object_id, + spl_object_id($conditional->expr), + $conditional->expr, + $this_class_name, + $source, + $codebase, + !$inside_negation + ) + ); + } + + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical + || $conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal + ) { + $false_pos = AssertionFinder::hasFalseVariable($conditional); + $true_pos = AssertionFinder::hasTrueVariable($conditional); + + if ($false_pos === AssertionFinder::ASSIGNMENT_TO_RIGHT + && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal + || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd + || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $conditional->left instanceof PhpParser\Node\Expr\BooleanNot) + ) { + return Algebra::negateFormula( + self::getFormula( + $conditional_object_id, + spl_object_id($conditional->left), + $conditional->left, + $this_class_name, + $source, + $codebase, + !$inside_negation, + $cache + ) + ); + } + + if ($false_pos === AssertionFinder::ASSIGNMENT_TO_LEFT + && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal + || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd + || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $conditional->right instanceof PhpParser\Node\Expr\BooleanNot) + ) { + return Algebra::negateFormula( + self::getFormula( + $conditional_object_id, + spl_object_id($conditional->right), + $conditional->right, + $this_class_name, + $source, + $codebase, + !$inside_negation, + $cache + ) + ); + } + + if ($true_pos === AssertionFinder::ASSIGNMENT_TO_RIGHT + && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal + || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd + || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $conditional->left instanceof PhpParser\Node\Expr\BooleanNot) + ) { + return self::getFormula( + $conditional_object_id, + spl_object_id($conditional->left), + $conditional->left, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + } + + if ($true_pos === AssertionFinder::ASSIGNMENT_TO_LEFT + && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal + || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd + || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $conditional->right instanceof PhpParser\Node\Expr\BooleanNot) + ) { + return self::getFormula( + $conditional_object_id, + spl_object_id($conditional->right), + $conditional->right, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + } + } + + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical + || $conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual + ) { + $false_pos = AssertionFinder::hasFalseVariable($conditional); + $true_pos = AssertionFinder::hasTrueVariable($conditional); + + if ($true_pos === AssertionFinder::ASSIGNMENT_TO_RIGHT + && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual + || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd + || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $conditional->left instanceof PhpParser\Node\Expr\BooleanNot) + ) { + return Algebra::negateFormula( + self::getFormula( + $conditional_object_id, + spl_object_id($conditional->left), + $conditional->left, + $this_class_name, + $source, + $codebase, + !$inside_negation, + $cache + ) + ); + } + + if ($true_pos === AssertionFinder::ASSIGNMENT_TO_LEFT + && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual + || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd + || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $conditional->right instanceof PhpParser\Node\Expr\BooleanNot) + ) { + return Algebra::negateFormula( + self::getFormula( + $conditional_object_id, + spl_object_id($conditional->right), + $conditional->right, + $this_class_name, + $source, + $codebase, + !$inside_negation, + $cache + ) + ); + } + + if ($false_pos === AssertionFinder::ASSIGNMENT_TO_RIGHT + && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual + || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd + || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $conditional->left instanceof PhpParser\Node\Expr\BooleanNot) + ) { + return self::getFormula( + $conditional_object_id, + spl_object_id($conditional->left), + $conditional->left, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + } + + if ($false_pos === AssertionFinder::ASSIGNMENT_TO_LEFT + && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual + || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd + || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $conditional->right instanceof PhpParser\Node\Expr\BooleanNot) + ) { + return self::getFormula( + $conditional_object_id, + spl_object_id($conditional->right), + $conditional->right, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + } + } + + if ($conditional instanceof PhpParser\Node\Expr\Cast\Bool_) { + return self::getFormula( + $conditional_object_id, + spl_object_id($conditional->expr), + $conditional->expr, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + } + + $anded_assertions = null; + + if ($cache && $source instanceof StatementsAnalyzer) { + $anded_assertions = $source->node_data->getAssertions($conditional); + } + + if ($anded_assertions === null) { + $anded_assertions = AssertionFinder::scrapeAssertions( + $conditional, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache + ); + + if ($cache && $source instanceof StatementsAnalyzer) { + $source->node_data->setAssertions($conditional, $anded_assertions); + } + } + + $clauses = []; + + foreach ($anded_assertions as $assertions) { + foreach ($assertions as $var => $anded_types) { + $redefined = false; + + if ($var[0] === '=') { + /** @var string */ + $var = substr($var, 1); + $redefined = true; + } + + foreach ($anded_types as $orred_types) { + $clauses[] = new Clause( + [$var => $orred_types], + $conditional_object_id, + $creating_object_id, + false, + true, + $orred_types[0][0] === '=' + || $orred_types[0][0] === '~' + || (strlen($orred_types[0]) > 1 + && ($orred_types[0][1] === '=' + || $orred_types[0][1] === '~')), + $redefined ? [$var => true] : [] + ); + } + } + } + + if ($clauses) { + return $clauses; + } + + /** @psalm-suppress MixedOperand */ + $conditional_ref = '*' . $conditional->getAttribute('startFilePos') + . ':' . $conditional->getAttribute('endFilePos'); + + return [new Clause([$conditional_ref => ['!falsy']], $conditional_object_id, $creating_object_id)]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php new file mode 100644 index 00000000..a7f2a543 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php @@ -0,0 +1,174 @@ + $formula_1 + * @param list $formula_2 + * @param array $new_assigned_var_ids + */ + public static function checkForParadox( + array $formula_1, + array $formula_2, + StatementsAnalyzer $statements_analyzer, + PhpParser\Node $stmt, + array $new_assigned_var_ids + ): void { + try { + $negated_formula2 = Algebra::negateFormula($formula_2); + } catch (ComplicatedExpressionException $e) { + return; + } + + $formula_1_hashes = []; + + foreach ($formula_1 as $formula_1_clause) { + $formula_1_hashes[$formula_1_clause->hash] = true; + } + + $formula_2_hashes = []; + + foreach ($formula_2 as $formula_2_clause) { + $hash = $formula_2_clause->hash; + + if (!$formula_2_clause->generated + && !$formula_2_clause->wedge + && $formula_2_clause->reconcilable + && (isset($formula_1_hashes[$hash]) || isset($formula_2_hashes[$hash])) + && !array_intersect_key($new_assigned_var_ids, $formula_2_clause->possibilities) + ) { + IssueBuffer::maybeAdd( + new RedundantCondition( + $formula_2_clause . ' has already been asserted', + new CodeLocation($statements_analyzer, $stmt), + null + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + foreach ($formula_2_clause->possibilities as $key => $values) { + if (!$formula_2_clause->generated + && count($values) > 1 + && !isset($new_assigned_var_ids[$key]) + && count(array_unique($values)) < count($values) + ) { + IssueBuffer::maybeAdd( + new ParadoxicalCondition( + 'Found a redundant condition when evaluating assertion (' . $formula_2_clause . ')', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + $formula_2_hashes[$hash] = true; + } + + // remove impossible types + foreach ($negated_formula2 as $negated_clause_2) { + if (count($negated_formula2) === 1) { + foreach ($negated_clause_2->possibilities as $key => $values) { + if (count($values) > 1 + && !isset($new_assigned_var_ids[$key]) + && count(array_unique($values)) < count($values) + ) { + IssueBuffer::maybeAdd( + new RedundantCondition( + 'Found a redundant condition when evaluating ' . $key, + new CodeLocation($statements_analyzer, $stmt), + null + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + if (!$negated_clause_2->reconcilable || $negated_clause_2->wedge) { + continue; + } + + foreach ($formula_1 as $clause_1) { + if ($negated_clause_2 === $clause_1 || !$clause_1->reconcilable || $clause_1->wedge) { + continue; + } + + $negated_clause_2_contains_1_possibilities = true; + + foreach ($clause_1->possibilities as $key => $keyed_possibilities) { + if (!isset($negated_clause_2->possibilities[$key])) { + $negated_clause_2_contains_1_possibilities = false; + break; + } + + if ($negated_clause_2->possibilities[$key] != $keyed_possibilities) { + $negated_clause_2_contains_1_possibilities = false; + break; + } + foreach ($keyed_possibilities as $possibility) { + if (preg_match('@^!?in-array-@', $possibility)) { + $negated_clause_2_contains_1_possibilities = false; + break; + } + } + } + + if ($negated_clause_2_contains_1_possibilities) { + $mini_formula_2 = Algebra::negateFormula([$negated_clause_2]); + + if (!$mini_formula_2[0]->wedge) { + if (count($mini_formula_2) > 1) { + $paradox_message = 'Condition ((' . implode(') && (', $mini_formula_2) . '))' + . ' contradicts a previously-established condition (' . $clause_1 . ')'; + } else { + $paradox_message = 'Condition (' . $mini_formula_2[0] . ')' + . ' contradicts a previously-established condition (' . $clause_1 . ')'; + } + } else { + $paradox_message = 'Condition not(' . $negated_clause_2 . ')' + . ' contradicts a previously-established condition (' . $clause_1 . ')'; + } + + IssueBuffer::maybeAdd( + new ParadoxicalCondition( + $paradox_message, + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php new file mode 100644 index 00000000..3ce5ca40 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php @@ -0,0 +1,394 @@ + 'class', + 2 => 'function', + 4 => 'method', + 8 => 'property', + 16 => 'class constant', + 32 => 'function/method parameter', + 40 => 'promoted property', + ]; + + // Copied from Attribute class since that class might not exist at runtime + public const TARGET_CLASS = 1; + public const TARGET_FUNCTION = 2; + public const TARGET_METHOD = 4; + public const TARGET_PROPERTY = 8; + public const TARGET_CLASS_CONSTANT = 16; + public const TARGET_PARAMETER = 32; + public const TARGET_ALL = 63; + public const IS_REPEATABLE = 64; + + /** + * @param array $attribute_groups + * @param key-of $target + * @param array $suppressed_issues + */ + public static function analyze( + SourceAnalyzer $source, + Context $context, + HasAttributesInterface $storage, + array $attribute_groups, + int $target, + array $suppressed_issues + ): void { + $codebase = $source->getCodebase(); + $appearing_non_repeatable_attributes = []; + foreach (self::iterateAttributeNodes($attribute_groups) as $attribute) { + if ($attribute->name instanceof FullyQualified) { + $fq_attribute_name = (string) $attribute->name; + } else { + $fq_attribute_name = ClassLikeAnalyzer::getFQCLNFromNameObject($attribute->name, $source->getAliases()); + } + + $attribute_name = (string) $attribute->name; + $attribute_name_location = new CodeLocation($source, $attribute->name); + + $attribute_class_storage = $codebase->classlikes->classExists($fq_attribute_name) + ? $codebase->classlike_storage_provider->get($fq_attribute_name) + : null; + + $attribute_class_flags = self::getAttributeClassFlags( + $source, + $attribute_name, + $fq_attribute_name, + $attribute_name_location, + $attribute_class_storage, + $suppressed_issues + ); + + self::analyzeAttributeConstruction( + $source, + $context, + $fq_attribute_name, + $attribute, + $suppressed_issues, + $storage instanceof ClassLikeStorage ? $storage : null + ); + + if (($attribute_class_flags & self::IS_REPEATABLE) === 0) { + // Not IS_REPEATABLE + if (isset($appearing_non_repeatable_attributes[$fq_attribute_name])) { + IssueBuffer::maybeAdd( + new InvalidAttribute( + "Attribute {$attribute_name} is not repeatable", + $attribute_name_location + ), + $suppressed_issues + ); + } + $appearing_non_repeatable_attributes[$fq_attribute_name] = true; + } + + if (($attribute_class_flags & $target) === 0) { + IssueBuffer::maybeAdd( + new InvalidAttribute( + "Attribute {$attribute_name} cannot be used on a " + . self::TARGET_DESCRIPTIONS[$target], + $attribute_name_location + ), + $suppressed_issues + ); + } + } + } + + /** + * @param array $suppressed_issues + */ + private static function analyzeAttributeConstruction( + SourceAnalyzer $source, + Context $context, + string $fq_attribute_name, + Attribute $attribute, + array $suppressed_issues, + ?ClassLikeStorage $classlike_storage = null + ): void { + $attribute_name_location = new CodeLocation($source, $attribute->name); + + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $source, + $fq_attribute_name, + $attribute_name_location, + null, + null, + $suppressed_issues, + new ClassLikeNameOptions( + false, + false, + false, + false, + false, + true + ) + ) === false) { + return; + } + + if (strtolower($fq_attribute_name) === 'attribute' && $classlike_storage) { + if ($classlike_storage->is_trait) { + IssueBuffer::maybeAdd( + new InvalidAttribute( + 'Traits cannot act as attribute classes', + $attribute_name_location + ), + $suppressed_issues + ); + } elseif ($classlike_storage->is_interface) { + IssueBuffer::maybeAdd( + new InvalidAttribute( + 'Interfaces cannot act as attribute classes', + $attribute_name_location + ), + $suppressed_issues + ); + } elseif ($classlike_storage->abstract) { + IssueBuffer::maybeAdd( + new InvalidAttribute( + 'Abstract classes cannot act as attribute classes', + $attribute_name_location + ), + $suppressed_issues + ); + } elseif (isset($classlike_storage->methods['__construct']) + && $classlike_storage->methods['__construct']->visibility !== ClassLikeAnalyzer::VISIBILITY_PUBLIC + ) { + IssueBuffer::maybeAdd( + new InvalidAttribute( + 'Classes with protected/private constructors cannot act as attribute classes', + $attribute_name_location + ), + $suppressed_issues + ); + } elseif ($classlike_storage->is_enum) { + IssueBuffer::maybeAdd( + new InvalidAttribute( + 'Enums cannot act as attribute classes', + $attribute_name_location + ), + $suppressed_issues + ); + } + } + + $statements_analyzer = new StatementsAnalyzer( + $source, + new NodeDataProvider() + ); + $statements_analyzer->addSuppressedIssues(array_values($suppressed_issues)); + + $had_returned = $context->has_returned; + $context->has_returned = false; + + IssueBuffer::startRecording(); + $statements_analyzer->analyze( + [new Expression(new New_($attribute->name, $attribute->args, $attribute->getAttributes()))], + // Use a new Context for the Attribute attribute so that it can't access `self` + strtolower($fq_attribute_name) === "attribute" ? new Context() : $context + ); + $context->has_returned = $had_returned; + + $issues = IssueBuffer::clearRecordingLevel(); + IssueBuffer::stopRecording(); + foreach ($issues as $issue) { + if ($issue instanceof UndefinedClass && $issue->fq_classlike_name === $fq_attribute_name) { + // Remove UndefinedClass for the attribute, since we already added UndefinedAttribute + continue; + } + IssueBuffer::bubbleUp($issue); + } + } + + /** + * @param array $suppressed_issues + */ + private static function getAttributeClassFlags( + SourceAnalyzer $source, + string $attribute_name, + string $fq_attribute_name, + CodeLocation $attribute_name_location, + ?ClassLikeStorage $attribute_class_storage, + array $suppressed_issues + ): int { + if (strtolower($fq_attribute_name) === "attribute") { + // We override this here because we still want to analyze attributes + // for PHP 7.4 when the Attribute class doesn't yet exist. + return self::TARGET_CLASS; + } + + if ($attribute_class_storage === null) { + return self::TARGET_ALL; // Defaults to TARGET_ALL + } + + foreach ($attribute_class_storage->attributes as $attribute_attribute) { + if ($attribute_attribute->fq_class_name === 'Attribute') { + if (!$attribute_attribute->args) { + return self::TARGET_ALL; // Defaults to TARGET_ALL + } + + $first_arg = reset($attribute_attribute->args); + + $first_arg_type = $first_arg->type; + + if ($first_arg_type instanceof UnresolvedConstantComponent) { + $first_arg_type = new Union([ + ConstantTypeResolver::resolve( + $source->getCodebase()->classlikes, + $first_arg_type, + $source instanceof StatementsAnalyzer ? $source : null + ) + ]); + } + + if (!$first_arg_type->isSingleIntLiteral()) { + return self::TARGET_ALL; // Fall back to default if it's invalid + } + + return $first_arg_type->getSingleIntLiteral()->value; + } + } + + IssueBuffer::maybeAdd( + new InvalidAttribute( + "The class {$attribute_name} doesn't have the Attribute attribute", + $attribute_name_location + ), + $suppressed_issues + ); + + return self::TARGET_ALL; // Fall back to default if it's invalid + } + + /** + * @param iterable $attribute_groups + * + * @return Generator + */ + private static function iterateAttributeNodes(iterable $attribute_groups): Generator + { + foreach ($attribute_groups as $attribute_group) { + foreach ($attribute_group->attrs as $attribute) { + yield $attribute; + } + } + } + + /** + * Analyze Reflection getAttributes method calls. + + * @param list $args + */ + public static function analyzeGetAttributes( + StatementsAnalyzer $statements_analyzer, + string $method_id, + array $args + ): void { + if (count($args) !== 1) { + // We skip this analysis if $flags is specified on getAttributes, since the only option + // is ReflectionAttribute::IS_INSTANCEOF, which causes getAttributes to return children. + // When returning children we don't want to limit this since a child could add a target. + return; + } + + switch ($method_id) { + case "ReflectionClass::getattributes": + $target = self::TARGET_CLASS; + break; + case "ReflectionFunction::getattributes": + $target = self::TARGET_FUNCTION; + break; + case "ReflectionMethod::getattributes": + $target = self::TARGET_METHOD; + break; + case "ReflectionProperty::getattributes": + $target = self::TARGET_PROPERTY; + break; + case "ReflectionClassConstant::getattributes": + $target = self::TARGET_CLASS_CONSTANT; + break; + case "ReflectionParameter::getattributes": + $target = self::TARGET_PARAMETER; + break; + default: + return; + } + + $arg = $args[0]; + if ($arg->name !== null) { + for (; !empty($args) && ($arg->name->name ?? null) !== "name"; $arg = array_shift($args)); + if ($arg->name->name ?? null !== "name") { + // No named argument for "name" parameter + return; + } + } + + $arg_type = $statements_analyzer->getNodeTypeProvider()->getType($arg->value); + if ($arg_type === null || !$arg_type->isSingle() || !$arg_type->hasLiteralString()) { + return; + } + + $class_string = $arg_type->getSingleAtomic(); + assert($class_string instanceof TLiteralString); + + $codebase = $statements_analyzer->getCodebase(); + + if (!$codebase->classExists($class_string->value)) { + return; + } + + $class_storage = $codebase->classlike_storage_provider->get($class_string->value); + $arg_location = new CodeLocation($statements_analyzer, $arg); + $class_attribute_target = self::getAttributeClassFlags( + $statements_analyzer, + $class_string->value, + $class_string->value, + $arg_location, + $class_storage, + $statements_analyzer->getSuppressedIssues() + ); + + if (($class_attribute_target & $target) === 0) { + IssueBuffer::maybeAdd( + new InvalidAttribute( + "Attribute {$class_string->value} cannot be used on a " + . self::TARGET_DESCRIPTIONS[$target], + $arg_location + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php new file mode 100644 index 00000000..8f2ca0ee --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php @@ -0,0 +1,162 @@ + + */ + private $aliased_classes = []; + + /** + * @var array + */ + private $aliased_class_locations = []; + + /** + * @var array + */ + private $aliased_classes_flipped = []; + + /** + * @var array + */ + private $aliased_classes_flipped_replaceable = []; + + /** + * @var array + */ + private $aliased_functions = []; + + /** + * @var array + */ + private $aliased_constants = []; + + public function visitUse(PhpParser\Node\Stmt\Use_ $stmt): void + { + $codebase = $this->getCodebase(); + + foreach ($stmt->uses as $use) { + $use_path = implode('\\', $use->name->parts); + $use_path_lc = strtolower($use_path); + $use_alias = $use->alias->name ?? $use->name->getLast(); + $use_alias_lc = strtolower($use_alias); + + switch ($use->type !== PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN ? $use->type : $stmt->type) { + case PhpParser\Node\Stmt\Use_::TYPE_FUNCTION: + $this->aliased_functions[$use_alias_lc] = $use_path; + break; + + case PhpParser\Node\Stmt\Use_::TYPE_CONSTANT: + $this->aliased_constants[$use_alias] = $use_path; + break; + + case PhpParser\Node\Stmt\Use_::TYPE_NORMAL: + $codebase->analyzer->addOffsetReference( + $this->getFilePath(), + (int) $use->getAttribute('startFilePos'), + (int) $use->getAttribute('endFilePos'), + $use_path + ); + if ($codebase->collect_locations) { + // register the path + $codebase->use_referencing_locations[$use_path_lc][] = + new CodeLocation($this, $use); + } + + if ($codebase->alter_code) { + if (isset($codebase->class_transforms[$use_path_lc])) { + $new_fq_class_name = $codebase->class_transforms[$use_path_lc]; + + $file_manipulations = []; + + $file_manipulations[] = new FileManipulation( + (int) $use->getAttribute('startFilePos'), + (int) $use->getAttribute('endFilePos') + 1, + $new_fq_class_name . ($use->alias ? ' as ' . $use_alias : '') + ); + + FileManipulationBuffer::add($this->getFilePath(), $file_manipulations); + } + + $this->aliased_classes_flipped_replaceable[$use_path_lc] = $use_alias; + } + + $this->aliased_classes[$use_alias_lc] = $use_path; + $this->aliased_class_locations[$use_alias_lc] = new CodeLocation($this, $stmt); + $this->aliased_classes_flipped[$use_path_lc] = $use_alias; + break; + } + } + } + + public function visitGroupUse(PhpParser\Node\Stmt\GroupUse $stmt): void + { + $use_prefix = implode('\\', $stmt->prefix->parts); + + $codebase = $this->getCodebase(); + + foreach ($stmt->uses as $use) { + $use_path = $use_prefix . '\\' . implode('\\', $use->name->parts); + $use_alias = $use->alias->name ?? $use->name->getLast(); + + switch ($use->type !== PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN ? $use->type : $stmt->type) { + case PhpParser\Node\Stmt\Use_::TYPE_FUNCTION: + $this->aliased_functions[strtolower($use_alias)] = $use_path; + break; + + case PhpParser\Node\Stmt\Use_::TYPE_CONSTANT: + $this->aliased_constants[$use_alias] = $use_path; + break; + + case PhpParser\Node\Stmt\Use_::TYPE_NORMAL: + if ($codebase->collect_locations) { + // register the path + $codebase->use_referencing_locations[strtolower($use_path)][] = + new CodeLocation($this, $use); + } + + $this->aliased_classes[strtolower($use_alias)] = $use_path; + $this->aliased_classes_flipped[strtolower($use_path)] = $use_alias; + break; + } + } + } + + /** + * @return array + */ + public function getAliasedClassesFlipped(): array + { + return $this->aliased_classes_flipped; + } + + /** + * @return array + */ + public function getAliasedClassesFlippedReplaceable(): array + { + return $this->aliased_classes_flipped_replaceable; + } + + public function getAliases(): Aliases + { + return new Aliases( + $this->getNamespace(), + $this->aliased_classes, + $this->aliased_functions, + $this->aliased_constants + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php new file mode 100644 index 00000000..cb4e6349 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php @@ -0,0 +1,2638 @@ + + */ + public $inferred_property_types = []; + + /** + * @param PhpParser\Node\Stmt\Class_|PhpParser\Node\Stmt\Enum_ $class + */ + public function __construct(PhpParser\Node\Stmt $class, SourceAnalyzer $source, ?string $fq_class_name) + { + if (!$fq_class_name) { + if (!$class instanceof PhpParser\Node\Stmt\Class_) { + throw new UnexpectedValueException('Anonymous enums are not allowed'); + } + + $fq_class_name = self::getAnonymousClassName($class, $source->getFilePath()); + } + + parent::__construct($class, $source, $fq_class_name); + + if ($this->class instanceof PhpParser\Node\Stmt\Class_ && $this->class->extends) { + $this->parent_fq_class_name = self::getFQCLNFromNameObject( + $this->class->extends, + $this->source->getAliases() + ); + } + } + + /** @return non-empty-string */ + public static function getAnonymousClassName(PhpParser\Node\Stmt\Class_ $class, string $file_path): string + { + return preg_replace('/[^A-Za-z0-9]/', '_', $file_path) + . '_' . $class->getLine() . '_' . (int)$class->getAttribute('startFilePos'); + } + + public function analyze( + ?Context $class_context = null, + ?Context $global_context = null + ): void { + $class = $this->class; + + if (!$class instanceof PhpParser\Node\Stmt\Class_ && !$class instanceof PhpParser\Node\Stmt\Enum_) { + throw new LogicException('Something went badly wrong'); + } + + $fq_class_name = $class_context && $class_context->self ? $class_context->self : $this->fq_class_name; + + $storage = $this->storage; + + if ($storage->has_visitor_issues) { + return; + } + + if ($class->name + && (preg_match( + '/(^|\\\)(int|float|bool|string|void|null|false|true|object|mixed)$/i', + $fq_class_name + ) || strtolower($fq_class_name) === 'resource') + ) { + $class_name_parts = explode('\\', $fq_class_name); + $class_name = array_pop($class_name_parts); + + IssueBuffer::maybeAdd( + new ReservedWord( + $class_name . ' is a reserved word', + new CodeLocation( + $this, + $class->name, + null, + true + ), + $class_name + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + + return; + } + + $project_analyzer = $this->file_analyzer->project_analyzer; + $codebase = $this->getCodebase(); + + if ($codebase->alter_code && $class->name && $codebase->classes_to_move) { + if (isset($codebase->classes_to_move[strtolower($this->fq_class_name)])) { + $destination_class = $codebase->classes_to_move[strtolower($this->fq_class_name)]; + + $source_class_parts = explode('\\', $this->fq_class_name); + $destination_class_parts = explode('\\', $destination_class); + + array_pop($source_class_parts); + array_pop($destination_class_parts); + + $source_ns = implode('\\', $source_class_parts); + $destination_ns = implode('\\', $destination_class_parts); + + if (strtolower($source_ns) !== strtolower($destination_ns)) { + if ($storage->namespace_name_location) { + $bounds = $storage->namespace_name_location->getSelectionBounds(); + + $file_manipulations = [ + new FileManipulation( + $bounds[0], + $bounds[1], + $destination_ns + ) + ]; + + FileManipulationBuffer::add( + $this->getFilePath(), + $file_manipulations + ); + } elseif (!$source_ns) { + $first_statement_pos = $this->getFileAnalyzer()->getFirstStatementOffset(); + + if ($first_statement_pos === -1) { + $first_statement_pos = (int) $class->getAttribute('startFilePos'); + } + + $file_manipulations = [ + new FileManipulation( + $first_statement_pos, + $first_statement_pos, + 'namespace ' . $destination_ns . ';' . "\n\n", + true + ) + ]; + + FileManipulationBuffer::add( + $this->getFilePath(), + $file_manipulations + ); + } + } + } + + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $this, + $class->name, + $this->fq_class_name, + null + ); + } + + foreach ($storage->docblock_issues as $docblock_issue) { + IssueBuffer::maybeAdd($docblock_issue); + } + + $classlike_storage_provider = $codebase->classlike_storage_provider; + + $parent_fq_class_name = $this->parent_fq_class_name; + + if ($class instanceof PhpParser\Node\Stmt\Class_ && $class->extends && $parent_fq_class_name) { + $this->checkParentClass( + $class, + $class->extends, + $fq_class_name, + $parent_fq_class_name, + $storage, + $codebase, + $class_context + ); + } + + + if ($storage->template_types) { + foreach ($storage->template_types as $param_name => $_) { + $fq_classlike_name = Type::getFQCLNFromString( + $param_name, + $this->getAliases() + ); + + if ($codebase->classOrInterfaceExists($fq_classlike_name)) { + IssueBuffer::maybeAdd( + new ReservedWord( + 'Cannot use ' . $param_name . ' as template name since the class already exists', + new CodeLocation($this, $this->class), + 'resource' + ), + $this->getSuppressedIssues() + ); + } + } + } + + if (($storage->templatedMixins || $storage->namedMixins) + && $storage->mixin_declaring_fqcln === $storage->name) { + /** @var non-empty-array $mixins */ + $mixins = array_merge($storage->templatedMixins, $storage->namedMixins); + $union = new Union($mixins); + + $static_self = new TNamedObject($storage->name); + $static_self->was_static = true; + + $union = TypeExpander::expandUnion( + $codebase, + $union, + $storage->name, + $static_self, + null + ); + + $union->check( + $this, + new CodeLocation( + $this, + $class->name ?: $class, + null, + true + ), + $this->getSuppressedIssues() + ); + } + + if ($storage->template_extended_params) { + foreach ($storage->template_extended_params as $type_map) { + foreach ($type_map as $atomic_type) { + $atomic_type->check( + $this, + new CodeLocation( + $this, + $class->name ?: $class, + null, + true + ), + $this->getSuppressedIssues() + ); + } + } + } + + if (!$class_context) { + $class_context = new Context($this->fq_class_name); + $class_context->parent = $parent_fq_class_name; + } + + if ($global_context) { + $class_context->strict_types = $global_context->strict_types; + } + + if ($this->checkImplementedInterfaces( + $class_context, + $class, + $codebase, + $fq_class_name, + $storage + ) === false) { + return; + } + + if ($storage->invalid_dependencies) { + return; + } + + if ($this->leftover_stmts) { + (new StatementsAnalyzer( + $this, + new NodeDataProvider() + ))->analyze( + $this->leftover_stmts, + $class_context + ); + } + + if (!$storage->abstract) { + foreach ($storage->declaring_method_ids as $declaring_method_id) { + $method_storage = $codebase->methods->getStorage($declaring_method_id); + + $declaring_class_name = $declaring_method_id->fq_class_name; + $method_name_lc = $declaring_method_id->method_name; + + if ($method_storage->abstract) { + if (IssueBuffer::accepts( + new UnimplementedAbstractMethod( + 'Method ' . $method_name_lc . ' is not defined on class ' . + $this->fq_class_name . ', defined abstract in ' . $declaring_class_name, + new CodeLocation( + $this, + $class->name ?? $class, + $class_context->include_location, + true + ) + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + )) { + return; + } + } + } + } + + AttributesAnalyzer::analyze( + $this, + $class_context, + $storage, + $class->attrGroups, + AttributesAnalyzer::TARGET_CLASS, + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + + self::addContextProperties( + $this, + $storage, + $class_context, + $this->fq_class_name, + $this->parent_fq_class_name, + $class->stmts + ); + + $constructor_analyzer = null; + $member_stmts = []; + + foreach ($class->stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod) { + $method_analyzer = $this->analyzeClassMethod( + $stmt, + $storage, + $this, + $class_context, + $global_context + ); + + if ($stmt->name->name === '__construct') { + $constructor_analyzer = $method_analyzer; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\TraitUse) { + if ($this->analyzeTraitUse( + $this->source->getAliases(), + $stmt, + $project_analyzer, + $storage, + $class_context, + $global_context, + $constructor_analyzer + ) === false) { + return; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Property) { + foreach ($stmt->props as $prop) { + if ($storage->is_enum) { + if (IssueBuffer::accepts(new NoEnumProperties( + 'Enums cannot have properties', + new CodeLocation($this, $prop), + $fq_class_name + ))) { + // fall through + } + continue; + } + if ($prop->default) { + $member_stmts[] = $stmt; + } + + if ($codebase->alter_code) { + $property_id = strtolower($this->fq_class_name) . '::$' . $prop->name; + + $property_storage = $codebase->properties->getStorage($property_id); + + if ($property_storage->type + && $property_storage->type_location + && $property_storage->type_location !== $property_storage->signature_type_location + ) { + $replace_type = TypeExpander::expandUnion( + $codebase, + $property_storage->type, + $this->getFQCLN(), + $this->getFQCLN(), + $this->getParentFQCLN() + ); + + $codebase->classlikes->handleDocblockTypeInMigration( + $codebase, + $this, + $replace_type, + $property_storage->type_location, + null + ); + } + + foreach ($codebase->properties_to_rename as $original_property_id => $new_property_name) { + if ($property_id === $original_property_id) { + $file_manipulations = [ + new FileManipulation( + (int) $prop->name->getAttribute('startFilePos'), + (int) $prop->name->getAttribute('endFilePos') + 1, + '$' . $new_property_name + ) + ]; + + FileManipulationBuffer::add( + $this->getFilePath(), + $file_manipulations + ); + } + } + } + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\ClassConst) { + $member_stmts[] = $stmt; + + foreach ($stmt->consts as $const) { + $const_id = strtolower($this->fq_class_name) . '::' . $const->name; + + foreach ($codebase->class_constants_to_rename as $original_const_id => $new_const_name) { + if ($const_id === $original_const_id) { + $file_manipulations = [ + new FileManipulation( + (int) $const->name->getAttribute('startFilePos'), + (int) $const->name->getAttribute('endFilePos') + 1, + $new_const_name + ) + ]; + + FileManipulationBuffer::add( + $this->getFilePath(), + $file_manipulations + ); + } + } + } + } + } + + $statements_analyzer = new StatementsAnalyzer($this, new NodeDataProvider()); + $statements_analyzer->analyze($member_stmts, $class_context, $global_context, true); + + $config = Config::getInstance(); + + if ($class instanceof PhpParser\Node\Stmt\Class_) { + $this->checkPropertyInitialization( + $codebase, + $config, + $storage, + $class_context, + $global_context, + $constructor_analyzer + ); + } + + if ($class instanceof PhpParser\Node\Stmt\Enum_) { + $this->checkEnum(); + } + + foreach ($class->stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\Property) { + $this->analyzeProperty($this, $stmt, $class_context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\TraitUse) { + foreach ($stmt->traits as $trait) { + $fq_trait_name = self::getFQCLNFromNameObject( + $trait, + $this->source->getAliases() + ); + + try { + $trait_file_analyzer = $project_analyzer->getFileAnalyzerForClassLike($fq_trait_name); + } catch (Exception $e) { + continue; + } + + $trait_storage = $codebase->classlike_storage_provider->get($fq_trait_name); + $trait_node = $codebase->classlikes->getTraitNode($fq_trait_name); + $trait_aliases = $trait_storage->aliases; + + if ($trait_aliases === null) { + continue; + } + + $trait_analyzer = new TraitAnalyzer( + $trait_node, + $trait_file_analyzer, + $fq_trait_name, + $trait_aliases + ); + + $fq_trait_name_lc = strtolower($fq_trait_name); + + if (isset($storage->template_type_uses_count[$fq_trait_name_lc])) { + $this->checkTemplateParams( + $codebase, + $storage, + $trait_storage, + new CodeLocation( + $this, + $trait + ), + $storage->template_type_uses_count[$fq_trait_name_lc] + ); + } + + foreach ($trait_node->stmts as $trait_stmt) { + if ($trait_stmt instanceof PhpParser\Node\Stmt\Property) { + $this->analyzeProperty($trait_analyzer, $trait_stmt, $class_context); + } + } + + $trait_file_analyzer->clearSourceBeforeDestruction(); + } + } + } + + $pseudo_methods = $storage->pseudo_methods + $storage->pseudo_static_methods; + + foreach ($pseudo_methods as $pseudo_method_name => $pseudo_method_storage) { + $pseudo_method_id = new MethodIdentifier( + $this->fq_class_name, + $pseudo_method_name + ); + + $overridden_method_ids = $codebase->methods->getOverriddenMethodIds($pseudo_method_id); + + if ($overridden_method_ids + && $pseudo_method_name !== '__construct' + && $pseudo_method_storage->location + ) { + foreach ($overridden_method_ids as $overridden_method_id) { + $parent_method_storage = $codebase->methods->getStorage($overridden_method_id); + + $overridden_fq_class_name = $overridden_method_id->fq_class_name; + + $parent_storage = $classlike_storage_provider->get($overridden_fq_class_name); + + MethodComparator::compare( + $codebase, + null, + $storage, + $parent_storage, + $pseudo_method_storage, + $parent_method_storage, + $this->fq_class_name, + $pseudo_method_storage->visibility ?: 0, + $storage->location ?: $pseudo_method_storage->location, + $storage->suppressed_issues, + true, + false + ); + } + } + } + + $event = new AfterClassLikeAnalysisEvent( + $class, + $storage, + $this, + $codebase, + [] + ); + + if ($codebase->config->eventDispatcher->dispatchAfterClassLikeAnalysis($event) === false) { + return; + } + $file_manipulations = $event->getFileReplacements(); + if ($file_manipulations) { + FileManipulationBuffer::add( + $this->getFilePath(), + $file_manipulations + ); + } + } + + public static function addContextProperties( + StatementsSource $statements_source, + ClassLikeStorage $storage, + Context $class_context, + string $fq_class_name, + ?string $parent_fq_class_name, + array $stmts = [] + ): void { + $codebase = $statements_source->getCodebase(); + + foreach ($storage->appearing_property_ids as $property_name => $appearing_property_id) { + $property_class_name = $codebase->properties->getDeclaringClassForProperty( + $appearing_property_id, + true + ); + + if ($property_class_name === null) { + continue; + } + + $property_class_storage = $codebase->classlike_storage_provider->get($property_class_name); + + $property_storage = $property_class_storage->properties[$property_name]; + + if (isset($storage->overridden_property_ids[$property_name])) { + foreach ($storage->overridden_property_ids[$property_name] as $overridden_property_id) { + [$guide_class_name] = explode('::$', $overridden_property_id); + $guide_class_storage = $codebase->classlike_storage_provider->get($guide_class_name); + $guide_property_storage = $guide_class_storage->properties[$property_name]; + + if ($property_storage->visibility > $guide_property_storage->visibility + && $property_storage->location + ) { + IssueBuffer::maybeAdd( + new OverriddenPropertyAccess( + 'Property ' . $fq_class_name . '::$' . $property_name + . ' has different access level than ' + . $storage->name . '::$' . $property_name, + $property_storage->location + ) + ); + } + + if ((($property_storage->signature_type && !$guide_property_storage->signature_type) + || (!$property_storage->signature_type && $guide_property_storage->signature_type) + || ($property_storage->signature_type + && !$property_storage->signature_type->equals( + $guide_property_storage->signature_type + ))) + && $property_storage->location + ) { + IssueBuffer::maybeAdd( + new NonInvariantPropertyType( + 'Property ' . $fq_class_name . '::$' . $property_name + . ' has type ' + . ($property_storage->signature_type + ? $property_storage->signature_type->getId() + : '' + ) + . ", not invariant with " . $guide_class_name . '::$' + . $property_name . ' of type ' + . ($guide_property_storage->signature_type + ? $guide_property_storage->signature_type->getId() + : '' + ), + $property_storage->location + ), + $property_storage->suppressed_issues + ); + } + + if ($property_storage->type === null) { + // Property type not set, no need to check for docblock invariance + continue; + } + + $property_type = clone $property_storage->type; + + $guide_property_type = $guide_property_storage->type === null + ? Type::getMixed() + : clone $guide_property_storage->type; + + // Set upper bounds for all templates + $lower_bounds = []; + $extended_templates = $storage->template_extended_params ?? []; + foreach ($extended_templates as $et_name => $et_array) { + foreach ($et_array as $et_class_name => $extended_template) { + if (!isset($lower_bounds[$et_class_name][$et_name])) { + $lower_bounds[$et_class_name][$et_name] = $extended_template; + } + } + } + + // Get actual types used for templates (to support @template-covariant) + $template_standins = new TemplateResult($lower_bounds, []); + TemplateStandinTypeReplacer::replace( + $guide_property_type, + $template_standins, + $codebase, + null, + $property_type + ); + + // Iterate over parent classes to find template-covariants, and replace the upper bound with the + // standin. Since @template-covariant allows child classes, we want to use the standin type + // instead of the template extended type. + $parent_class = $storage->parent_class; + while ($parent_class !== null) { + $parent_storage = $codebase->classlike_storage_provider->get($parent_class); + foreach ($parent_storage->template_covariants ?? [] as $pt_offset => $covariant) { + if ($covariant) { + // If template_covariants is set template_types should also be set + assert($parent_storage->template_types !== null); + $pt_name = array_keys($parent_storage->template_types)[$pt_offset]; + if (isset($template_standins->lower_bounds[$pt_name][$parent_class])) { + $lower_bounds[$pt_name][$parent_class] = + TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $template_standins->lower_bounds[$pt_name][$parent_class], + $codebase + ); + } + } + } + $parent_class = $parent_storage->parent_class; + } + + $template_result = new TemplateResult([], $lower_bounds); + + TemplateInferredTypeReplacer::replace( + $guide_property_type, + $template_result, + $codebase + ); + TemplateInferredTypeReplacer::replace( + $property_type, + $template_result, + $codebase + ); + + if ($property_storage->location + && !$property_type->equals($guide_property_type, false) + && $guide_class_storage->user_defined + ) { + IssueBuffer::maybeAdd( + new NonInvariantDocblockPropertyType( + 'Property ' . $fq_class_name . '::$' . $property_name + . ' has type ' . $property_type->getId() + . ", not invariant with " . $guide_class_name . '::$' + . $property_name . ' of type ' + . $guide_property_type->getId(), + $property_storage->location + ), + $property_storage->suppressed_issues + ); + } + } + } + + if ($property_storage->type) { + $property_type = clone $property_storage->type; + + if (!$property_type->isMixed() + && !$property_storage->is_promoted + && !$property_storage->has_default + && !($property_type->isNullable() && $property_type->from_docblock) + ) { + $property_type->initialized = false; + $property_type->from_property = true; + $property_type->from_static_property = $property_storage->is_static === true; + } + } else { + $property_type = Type::getMixed(); + + if (!$property_storage->has_default && !$property_storage->is_promoted) { + $property_type->initialized = false; + $property_type->from_property = true; + $property_type->from_static_property = $property_storage->is_static === true; + } + } + + $property_type_location = $property_storage->type_location; + + $fleshed_out_type = !$property_type->isMixed() + ? TypeExpander::expandUnion( + $codebase, + $property_type, + $fq_class_name, + $fq_class_name, + $parent_fq_class_name, + true, + false, + $storage->final + ) + : $property_type; + + $class_template_params = ClassTemplateParamCollector::collect( + $codebase, + $property_class_storage, + $storage, + null, + new TNamedObject($fq_class_name), + true + ); + + if ($class_template_params) { + $this_object_type = self::getThisObjectType( + $storage, + $fq_class_name + ); + + if (!$this_object_type instanceof TGenericObject) { + $type_params = []; + + foreach ($class_template_params as $type_map) { + $type_params[] = clone array_values($type_map)[0]; + } + + $this_object_type = new TGenericObject($this_object_type->value, $type_params); + } + + $fleshed_out_type = AtomicPropertyFetchAnalyzer::localizePropertyType( + $codebase, + $fleshed_out_type, + $this_object_type, + $storage, + $property_class_storage + ); + } + + if ($property_type_location && !$fleshed_out_type->isMixed()) { + $stmt = array_filter( + $stmts, + function ($stmt) use ($property_name): bool { + return $stmt instanceof PhpParser\Node\Stmt\Property + && isset($stmt->props[0]->name->name) + && $stmt->props[0]->name->name === $property_name; + } + ); + + $suppressed = []; + if (count($stmt) > 0) { + $stmt = array_pop($stmt); + + $docComment = $stmt->getDocComment(); + if ($docComment) { + try { + $docBlock = DocComment::parsePreservingLength($docComment); + $suppressed = $docBlock->tags['psalm-suppress'] ?? []; + } catch (DocblockParseException $e) { + // do nothing to keep original behavior + } + } + } + + $fleshed_out_type->check( + $statements_source, + $property_type_location, + $storage->suppressed_issues + $statements_source->getSuppressedIssues() + $suppressed, + [], + false + ); + + if ($property_storage->signature_type) { + $union_comparison_result = new TypeComparisonResult(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $fleshed_out_type, + $property_storage->signature_type, + false, + false, + $union_comparison_result + ) && !$union_comparison_result->type_coerced_from_mixed + ) { + IssueBuffer::maybeAdd( + new MismatchingDocblockPropertyType( + 'Parameter ' + . $property_class_name . '::$' . $property_name + . ' has wrong type \'' . $fleshed_out_type . + '\', should be \'' . $property_storage->signature_type . '\'', + $property_type_location + ) + ); + } + } + } + + if ($property_storage->is_static) { + $property_id = $fq_class_name . '::$' . $property_name; + + $class_context->vars_in_scope[$property_id] = $fleshed_out_type; + } else { + $class_context->vars_in_scope['$this->' . $property_name] = $fleshed_out_type; + } + } + + foreach ($storage->pseudo_property_get_types as $property_name => $property_type) { + $property_name = substr($property_name, 1); + + if (isset($class_context->vars_in_scope['$this->' . $property_name])) { + $fleshed_out_type = !$property_type->isMixed() + ? TypeExpander::expandUnion( + $codebase, + $property_type, + $fq_class_name, + $fq_class_name, + $parent_fq_class_name + ) + : $property_type; + + $class_context->vars_in_scope['$this->' . $property_name] = $fleshed_out_type; + } + } + } + + private function checkPropertyInitialization( + Codebase $codebase, + Config $config, + ClassLikeStorage $storage, + Context $class_context, + ?Context $global_context = null, + ?MethodAnalyzer $constructor_analyzer = null + ): void { + if (!$config->reportIssueInFile('PropertyNotSetInConstructor', $this->getFilePath())) { + return; + } + + if (!isset($storage->declaring_method_ids['__construct']) + && !$config->reportIssueInFile('MissingConstructor', $this->getFilePath()) + ) { + return; + } + + $fq_class_name = $class_context->self ?: $this->fq_class_name; + $fq_class_name_lc = strtolower($fq_class_name); + + $included_file_path = $this->getFilePath(); + + $method_already_analyzed = $codebase->analyzer->isMethodAlreadyAnalyzed( + $included_file_path, + $fq_class_name_lc . '::__construct', + true + ); + + if ($method_already_analyzed && !$codebase->diff_methods) { + // this can happen when re-analysing a class that has been include()d inside another + return; + } + + /** @var PhpParser\Node\Stmt\Class_ */ + $class = $this->class; + $classlike_storage_provider = $codebase->classlike_storage_provider; + $class_storage = $classlike_storage_provider->get($fq_class_name_lc); + + $constructor_appearing_fqcln = $fq_class_name_lc; + + $uninitialized_variables = []; + $uninitialized_properties = []; + $uninitialized_typed_properties = []; + $uninitialized_private_properties = false; + + foreach ($storage->appearing_property_ids as $property_name => $appearing_property_id) { + $property_class_name = $codebase->properties->getDeclaringClassForProperty( + $appearing_property_id, + true + ); + + if ($property_class_name === null) { + continue; + } + + $property_class_storage = $classlike_storage_provider->get($property_class_name); + + $property = $property_class_storage->properties[$property_name]; + + $property_is_initialized = isset($property_class_storage->initialized_properties[$property_name]); + + if ($property->is_static) { + continue; + } + + if ($property->has_default || $property_is_initialized) { + continue; + } + + if ($property->type && $property->type->from_docblock && $property->type->isNullable()) { + continue; + } + + if ($codebase->diff_methods && $method_already_analyzed && $property->location) { + [$start, $end] = $property->location->getSelectionBounds(); + + $existing_issues = $codebase->analyzer->getExistingIssuesForFile( + $this->getFilePath(), + $start, + $end, + 'PropertyNotSetInConstructor' + ); + + if ($existing_issues) { + IssueBuffer::addIssues([$this->getFilePath() => $existing_issues]); + continue; + } + } + + if ($property->location) { + $codebase->analyzer->removeExistingDataForFile( + $this->getFilePath(), + $property->location->raw_file_start, + $property->location->raw_file_end, + 'PropertyNotSetInConstructor' + ); + } + + $codebase->file_reference_provider->addMethodReferenceToMissingClassMember( + $fq_class_name_lc . '::__construct', + strtolower($property_class_name) . '::$' . $property_name + ); + + if ($property->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE) { + $uninitialized_private_properties = true; + } + + $uninitialized_variables[] = '$this->' . $property_name; + $uninitialized_properties[$property_class_name . '::$' . $property_name] = $property; + + if ($property->type && !$property->type->isMixed()) { + $uninitialized_typed_properties[$property_class_name . '::$' . $property_name] = $property; + } + } + + if (!$uninitialized_properties) { + return; + } + + if (!$storage->abstract + && !$constructor_analyzer + && isset($storage->declaring_method_ids['__construct']) + && isset($storage->appearing_method_ids['__construct']) + && $class->extends + ) { + $constructor_declaring_fqcln = $storage->declaring_method_ids['__construct']->fq_class_name; + $constructor_appearing_fqcln = $storage->appearing_method_ids['__construct']->fq_class_name; + + $constructor_class_storage = $classlike_storage_provider->get($constructor_declaring_fqcln); + + // ignore oldstyle constructors and classes without any declared properties + if ($constructor_class_storage->user_defined + && !$constructor_class_storage->stubbed + && isset($constructor_class_storage->methods['__construct']) + ) { + $constructor_storage = $constructor_class_storage->methods['__construct']; + + $fake_constructor_params = array_map( + function (FunctionLikeParameter $param): PhpParser\Node\Param { + $fake_param = (new PhpParser\Builder\Param($param->name)); + if ($param->signature_type) { + $fake_param->setType((string)$param->signature_type); + } + + $node = $fake_param->getNode(); + + $attributes = $param->location + ? [ + 'startFilePos' => $param->location->raw_file_start, + 'endFilePos' => $param->location->raw_file_end, + 'startLine' => $param->location->raw_line_number + ] + : []; + + $node->setAttributes($attributes); + + return $node; + }, + $constructor_storage->params + ); + + $fake_constructor_stmt_args = array_map( + function (FunctionLikeParameter $param): PhpParser\Node\Arg { + $attributes = $param->location + ? [ + 'startFilePos' => $param->location->raw_file_start, + 'endFilePos' => $param->location->raw_file_end, + 'startLine' => $param->location->raw_line_number + ] + : []; + + return new VirtualArg( + new VirtualVariable($param->name, $attributes), + false, + $param->is_variadic, + $attributes + ); + }, + $constructor_storage->params + ); + + $fake_constructor_attributes = [ + 'startLine' => $class->extends->getLine(), + 'startFilePos' => $class->extends->getAttribute('startFilePos'), + 'endFilePos' => $class->extends->getAttribute('endFilePos'), + ]; + + $fake_call_attributes = $fake_constructor_attributes + + [ + 'comments' => [new PhpParser\Comment\Doc( + '/** @psalm-suppress InaccessibleMethod */', + $class->extends->getLine(), + (int) $class->extends->getAttribute('startFilePos') + )], + ]; + + $fake_constructor_stmts = [ + new VirtualExpression( + new VirtualStaticCall( + new VirtualFullyQualified($constructor_declaring_fqcln), + new VirtualIdentifier('__construct', $fake_constructor_attributes), + $fake_constructor_stmt_args, + $fake_call_attributes + ), + $fake_call_attributes + ), + ]; + + $fake_stmt = new VirtualClassMethod( + new VirtualIdentifier('__construct'), + [ + 'type' => PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC, + 'params' => $fake_constructor_params, + 'stmts' => $fake_constructor_stmts, + ], + $fake_constructor_attributes + ); + + $codebase->analyzer->disableMixedCounts(); + + $was_collecting_initializations = $class_context->collect_initializations; + + $class_context->collect_initializations = true; + $class_context->collect_nonprivate_initializations = !$uninitialized_private_properties; + + $constructor_analyzer = $this->analyzeClassMethod( + $fake_stmt, + $storage, + $this, + $class_context, + $global_context, + true + ); + + $class_context->collect_initializations = $was_collecting_initializations; + + $codebase->analyzer->enableMixedCounts(); + } + } + + if ($constructor_analyzer) { + $method_context = clone $class_context; + $method_context->collect_initializations = true; + $method_context->collect_nonprivate_initializations = !$uninitialized_private_properties; + $method_context->self = $fq_class_name; + + $this_atomic_object_type = new TNamedObject($fq_class_name); + $this_atomic_object_type->was_static = !$storage->final; + + $method_context->vars_in_scope['$this'] = new Union([$this_atomic_object_type]); + $method_context->vars_possibly_in_scope['$this'] = true; + $method_context->calling_method_id = strtolower($fq_class_name) . '::__construct'; + + $constructor_analyzer->analyze( + $method_context, + new NodeDataProvider(), + $global_context, + true + ); + + foreach ($uninitialized_properties as $property_id => $property_storage) { + [, $property_name] = explode('::$', $property_id); + + if (!isset($method_context->vars_in_scope['$this->' . $property_name])) { + $end_type = Type::getVoid(); + $end_type->initialized = false; + } else { + $end_type = $method_context->vars_in_scope['$this->' . $property_name]; + } + + $constructor_class_property_storage = $property_storage; + + $error_location = $property_storage->location; + + if ($storage->declaring_property_ids[$property_name] !== $fq_class_name) { + $error_location = $storage->location ?: $storage->stmt_location; + } + + if ($fq_class_name_lc !== $constructor_appearing_fqcln + && $property_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE + ) { + $a_class_storage = $classlike_storage_provider->get( + $end_type->initialized_class ?: $constructor_appearing_fqcln + ); + + if (!isset($a_class_storage->declaring_property_ids[$property_name])) { + $constructor_class_property_storage = null; + } else { + $declaring_property_class = $a_class_storage->declaring_property_ids[$property_name]; + $constructor_class_property_storage = $classlike_storage_provider + ->get($declaring_property_class) + ->properties[$property_name]; + } + } + + if ($property_storage->location + && $error_location + && (!$end_type->initialized || $property_storage !== $constructor_class_property_storage) + ) { + if ($property_storage->type) { + $expected_visibility = $uninitialized_private_properties + ? 'private or final ' + : ''; + + IssueBuffer::maybeAdd( + new PropertyNotSetInConstructor( + 'Property ' . $class_storage->name . '::$' . $property_name + . ' is not defined in constructor of ' + . $this->fq_class_name . ' or in any ' . $expected_visibility + . 'methods called in the constructor', + $error_location, + $property_id + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } elseif (!$property_storage->has_default) { + if (isset($this->inferred_property_types[$property_name])) { + $this->inferred_property_types[$property_name]->addType(new TNull()); + $this->inferred_property_types[$property_name]->setFromDocblock(); + } + } + } + } + + $codebase->analyzer->setAnalyzedMethod( + $included_file_path, + $fq_class_name_lc . '::__construct', + true + ); + + return; + } + + if (!$storage->abstract && $uninitialized_typed_properties) { + foreach ($uninitialized_typed_properties as $id => $uninitialized_property) { + if ($uninitialized_property->location) { + IssueBuffer::maybeAdd( + new MissingConstructor( + $class_storage->name . ' has an uninitialized property ' . $id . + ', but no constructor', + $uninitialized_property->location, + $class_storage->name . '::' . $uninitialized_variables[0] + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + } + } + } + + /** + * @return false|null + */ + private function analyzeTraitUse( + Aliases $aliases, + PhpParser\Node\Stmt\TraitUse $stmt, + ProjectAnalyzer $project_analyzer, + ClassLikeStorage $storage, + Context $class_context, + ?Context $global_context = null, + ?MethodAnalyzer &$constructor_analyzer = null, + ?TraitAnalyzer $previous_trait_analyzer = null + ): ?bool { + $codebase = $this->getCodebase(); + + $previous_context_include_location = $class_context->include_location; + + foreach ($stmt->traits as $trait_name) { + $trait_location = new CodeLocation($this, $trait_name, null, true); + $class_context->include_location = new CodeLocation($this, $trait_name, null, true); + + $fq_trait_name = self::getFQCLNFromNameObject( + $trait_name, + $aliases + ); + + if (!$codebase->classlikes->hasFullyQualifiedTraitName($fq_trait_name, $trait_location)) { + IssueBuffer::maybeAdd( + new UndefinedTrait( + 'Trait ' . $fq_trait_name . ' does not exist', + new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + + return false; + } + + if (!$codebase->traitHasCorrectCase($fq_trait_name)) { + if (IssueBuffer::accepts( + new UndefinedTrait( + 'Trait ' . $fq_trait_name . ' has wrong casing', + new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + )) { + return false; + } + + continue; + } + + $fq_trait_name_resolved = $codebase->classlikes->getUnAliasedName($fq_trait_name); + $trait_storage = $codebase->classlike_storage_provider->get($fq_trait_name_resolved); + + if ($trait_storage->deprecated) { + IssueBuffer::maybeAdd( + new DeprecatedTrait( + 'Trait ' . $fq_trait_name . ' is deprecated', + new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + if ($trait_storage->extension_requirement !== null) { + $extension_requirement = $codebase->classlikes->getUnAliasedName( + $trait_storage->extension_requirement + ); + $extensionRequirementMet = in_array($extension_requirement, $storage->parent_classes); + + if (!$extensionRequirementMet) { + IssueBuffer::maybeAdd( + new ExtensionRequirementViolation( + $fq_trait_name . ' requires using class to extend ' . $extension_requirement + . ', but ' . $storage->name . ' does not', + new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + } + + foreach ($trait_storage->implementation_requirements as $implementation_requirement) { + $implementation_requirement = $codebase->classlikes->getUnAliasedName($implementation_requirement); + $implementationRequirementMet = in_array($implementation_requirement, $storage->class_implements); + + if (!$implementationRequirementMet) { + IssueBuffer::maybeAdd( + new ImplementationRequirementViolation( + $fq_trait_name . ' requires using class to implement ' + . $implementation_requirement . ', but ' . $storage->name . ' does not', + new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + } + + if ($storage->mutation_free && !$trait_storage->mutation_free) { + IssueBuffer::maybeAdd( + new MutableDependency( + $storage->name . ' is marked @psalm-immutable but ' . $fq_trait_name . ' is not', + new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + $trait_file_analyzer = $project_analyzer->getFileAnalyzerForClassLike($fq_trait_name_resolved); + $trait_node = $codebase->classlikes->getTraitNode($fq_trait_name_resolved); + $trait_aliases = $trait_storage->aliases; + if ($trait_aliases === null) { + continue; + } + + $trait_analyzer = new TraitAnalyzer( + $trait_node, + $trait_file_analyzer, + $fq_trait_name_resolved, + $trait_aliases + ); + + foreach ($trait_node->stmts as $trait_stmt) { + if ($trait_stmt instanceof PhpParser\Node\Stmt\ClassMethod) { + $trait_method_analyzer = $this->analyzeClassMethod( + $trait_stmt, + $storage, + $trait_analyzer, + $class_context, + $global_context + ); + + if ($trait_stmt->name->name === '__construct') { + $constructor_analyzer = $trait_method_analyzer; + } + } elseif ($trait_stmt instanceof PhpParser\Node\Stmt\TraitUse) { + if ($this->analyzeTraitUse( + $trait_aliases, + $trait_stmt, + $project_analyzer, + $storage, + $class_context, + $global_context, + $constructor_analyzer, + $trait_analyzer + ) === false) { + return false; + } + } + } + + $trait_file_analyzer->clearSourceBeforeDestruction(); + } + + $class_context->include_location = $previous_context_include_location; + + return null; + } + + private function analyzeProperty( + SourceAnalyzer $source, + PhpParser\Node\Stmt\Property $stmt, + Context $context + ): void { + $fq_class_name = $source->getFQCLN(); + $property_name = $stmt->props[0]->name->name; + + $codebase = $this->getCodebase(); + + $property_id = $fq_class_name . '::$' . $property_name; + + $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( + $property_id, + true + ); + + if (!$declaring_property_class) { + return; + } + + $fq_class_name = $declaring_property_class; + + // gets inherited property type + $class_property_type = $codebase->properties->getPropertyType($property_id, false, $source, $context); + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $property_storage = $class_storage->properties[$property_name]; + + AttributesAnalyzer::analyze( + $source, + $context, + $property_storage, + $stmt->attrGroups, + AttributesAnalyzer::TARGET_PROPERTY, + $property_storage->suppressed_issues + $this->getSuppressedIssues() + ); + + if ($class_property_type && ($property_storage->type_location || !$codebase->alter_code)) { + return; + } + + $message = 'Property ' . $property_id . ' does not have a declared type'; + + $suggested_type = $property_storage->suggested_type; + + if (isset($this->inferred_property_types[$property_name])) { + $suggested_type = Type::combineUnionTypes( + $suggested_type, + $this->inferred_property_types[$property_name] ?? null, + $codebase + ); + } + + if ($suggested_type && !$property_storage->has_default && $property_storage->is_static) { + $suggested_type->addType(new TNull()); + } + + if ($suggested_type && !$suggested_type->isNull()) { + $message .= ' - consider ' . str_replace( + ['', ''], + '', + (string)$suggested_type + ); + } + + $project_analyzer = ProjectAnalyzer::getInstance(); + + if ($codebase->alter_code + && $source === $this + && isset($project_analyzer->getIssuesToFix()['MissingPropertyType']) + && !in_array('MissingPropertyType', $this->getSuppressedIssues()) + && $suggested_type + ) { + if ($suggested_type->hasMixed() || $suggested_type->isNull()) { + return; + } + + self::addOrUpdatePropertyType( + $project_analyzer, + $stmt, + $suggested_type, + $this, + $suggested_type->from_docblock + ); + + return; + } + + IssueBuffer::maybeAdd( + new MissingPropertyType( + $message, + new CodeLocation($source, $stmt->props[0]->name), + $property_id + ), + $this->source->getSuppressedIssues() + $property_storage->suppressed_issues + ); + } + + private static function addOrUpdatePropertyType( + ProjectAnalyzer $project_analyzer, + PhpParser\Node\Stmt\Property $property, + Union $inferred_type, + StatementsSource $source, + bool $docblock_only = false + ): void { + $manipulator = PropertyDocblockManipulator::getForProperty( + $project_analyzer, + $source->getFilePath(), + $property + ); + + $codebase = $project_analyzer->getCodebase(); + + $allow_native_type = !$docblock_only + && $codebase->php_major_version >= 7 + && ($codebase->php_major_version > 7 || $codebase->php_minor_version >= 4) + && $codebase->allow_backwards_incompatible_changes; + + $manipulator->setType( + $allow_native_type + ? (string) $inferred_type->toPhpString( + $source->getNamespace(), + $source->getAliasedClassesFlipped(), + $source->getFQCLN(), + $codebase->php_major_version, + $codebase->php_minor_version + ) : null, + $inferred_type->toNamespacedString( + $source->getNamespace(), + $source->getAliasedClassesFlipped(), + $source->getFQCLN(), + false + ), + $inferred_type->toNamespacedString( + $source->getNamespace(), + $source->getAliasedClassesFlipped(), + $source->getFQCLN(), + true + ), + $inferred_type->canBeFullyExpressedInPhp($codebase->php_major_version, $codebase->php_minor_version) + ); + } + + private function analyzeClassMethod( + PhpParser\Node\Stmt\ClassMethod $stmt, + ClassLikeStorage $class_storage, + SourceAnalyzer $source, + Context $class_context, + ?Context $global_context = null, + bool $is_fake = false + ): ?MethodAnalyzer { + $config = Config::getInstance(); + + if ($stmt->stmts === null && !$stmt->isAbstract()) { + IssueBuffer::maybeAdd( + new ParseError( + 'Non-abstract class method must have statements', + new CodeLocation($this, $stmt) + ) + ); + + return null; + } + + try { + $method_analyzer = new MethodAnalyzer($stmt, $source); + } catch (UnexpectedValueException $e) { + IssueBuffer::maybeAdd( + new ParseError( + 'Problem loading method: ' . $e->getMessage(), + new CodeLocation($this, $stmt) + ) + ); + + return null; + } + + $actual_method_id = $method_analyzer->getMethodId(); + + $project_analyzer = $source->getProjectAnalyzer(); + $codebase = $source->getCodebase(); + + $analyzed_method_id = $actual_method_id; + + $included_file_path = $source->getFilePath(); + + if ($class_context->self && strtolower($class_context->self) !== strtolower((string) $source->getFQCLN())) { + $analyzed_method_id = $method_analyzer->getMethodId($class_context->self); + + $declaring_method_id = $codebase->methods->getDeclaringMethodId($analyzed_method_id); + + if ((string) $actual_method_id !== (string) $declaring_method_id) { + // the method is an abstract trait method + + $declaring_method_storage = $method_analyzer->getFunctionLikeStorage(); + + if (!$declaring_method_storage instanceof MethodStorage) { + throw new LogicException('This should never happen'); + } + + if ($declaring_method_id && $declaring_method_storage->abstract) { + $implementer_method_storage = $codebase->methods->getStorage($declaring_method_id); + $declaring_storage = $codebase->classlike_storage_provider->get( + $actual_method_id->fq_class_name + ); + + MethodComparator::compare( + $codebase, + null, + $class_storage, + $declaring_storage, + $implementer_method_storage, + $declaring_method_storage, + $this->fq_class_name, + $implementer_method_storage->visibility, + new CodeLocation($source, $stmt), + $implementer_method_storage->suppressed_issues, + false + ); + } + + return null; + } + } + + $trait_safe_method_id = strtolower((string) $analyzed_method_id); + + $actual_method_id_str = strtolower((string) $actual_method_id); + + if ($actual_method_id_str !== $trait_safe_method_id) { + $trait_safe_method_id .= '&' . $actual_method_id_str; + } + + $method_already_analyzed = $codebase->analyzer->isMethodAlreadyAnalyzed( + $included_file_path, + $trait_safe_method_id + ); + + $start = (int)$stmt->getAttribute('startFilePos'); + $end = (int)$stmt->getAttribute('endFilePos'); + + $comments = $stmt->getComments(); + + if ($comments) { + $start = $comments[0]->getStartFilePos(); + } + + if ($codebase->diff_methods + && $method_already_analyzed + && !$class_context->collect_initializations + && !$class_context->collect_mutations + && !$is_fake + ) { + $project_analyzer->progress->debug( + 'Skipping analysis of pre-analyzed method ' . $analyzed_method_id . "\n" + ); + + $existing_issues = $codebase->analyzer->getExistingIssuesForFile( + $source->getFilePath(), + $start, + $end + ); + + IssueBuffer::addIssues([$source->getFilePath() => $existing_issues]); + + return $method_analyzer; + } + + $codebase->analyzer->removeExistingDataForFile( + $source->getFilePath(), + $start, + $end + ); + + $method_context = clone $class_context; + + foreach ($method_context->vars_in_scope as $context_var_id => $context_type) { + $method_context->vars_in_scope[$context_var_id] = clone $context_type; + + if ($context_type->from_property && $stmt->name->name !== '__construct') { + $method_context->vars_in_scope[$context_var_id]->initialized = true; + } + } + + $method_context->collect_exceptions = $config->check_for_throws_docblock; + + $type_provider = new NodeDataProvider(); + + $method_analyzer->analyze( + $method_context, + $type_provider, + $global_context ? clone $global_context : null + ); + + if ($stmt->name->name !== '__construct' + && $config->reportIssueInFile('InvalidReturnType', $source->getFilePath()) + && $class_context->self + ) { + self::analyzeClassMethodReturnType( + $stmt, + $method_analyzer, + $source, + $type_provider, + $codebase, + $class_storage, + $class_context->self, + $analyzed_method_id, + $actual_method_id, + $method_context->has_returned + ); + } + + if (!$method_already_analyzed + && !$class_context->collect_initializations + && !$class_context->collect_mutations + && !$is_fake + ) { + $codebase->analyzer->setAnalyzedMethod($included_file_path, $trait_safe_method_id); + } + + return $method_analyzer; + } + + private static function getThisObjectType( + ClassLikeStorage $class_storage, + string $original_fq_classlike_name + ): TNamedObject { + if ($class_storage->template_types) { + $template_params = []; + + foreach ($class_storage->template_types as $param_name => $template_map) { + $key = array_keys($template_map)[0]; + + $template_params[] = new Union([ + new TTemplateParam( + $param_name, + reset($template_map), + $key + ) + ]); + } + + return new TGenericObject( + $original_fq_classlike_name, + $template_params + ); + } + + return new TNamedObject($original_fq_classlike_name); + } + + public static function analyzeClassMethodReturnType( + PhpParser\Node\Stmt\ClassMethod $stmt, + MethodAnalyzer $method_analyzer, + SourceAnalyzer $source, + NodeDataProvider $type_provider, + Codebase $codebase, + ClassLikeStorage $class_storage, + string $fq_classlike_name, + MethodIdentifier $analyzed_method_id, + MethodIdentifier $actual_method_id, + bool $did_explicitly_return + ): void { + $secondary_return_type_location = null; + + $actual_method_storage = $codebase->methods->getStorage($actual_method_id); + + $return_type_location = $codebase->methods->getMethodReturnTypeLocation( + $actual_method_id, + $secondary_return_type_location + ); + + $original_fq_classlike_name = $fq_classlike_name; + + $return_type = $codebase->methods->getMethodReturnType( + $analyzed_method_id, + $fq_classlike_name, + $method_analyzer + ); + + if ($return_type && $class_storage->template_extended_params) { + $declaring_method_id = $codebase->methods->getDeclaringMethodId($analyzed_method_id); + + if ($declaring_method_id) { + $declaring_class_name = $declaring_method_id->fq_class_name; + + $class_storage = $codebase->classlike_storage_provider->get($declaring_class_name); + } + + $this_object_type = self::getThisObjectType( + $class_storage, + $original_fq_classlike_name + ); + + $class_template_params = ClassTemplateParamCollector::collect( + $codebase, + $class_storage, + $codebase->classlike_storage_provider->get($original_fq_classlike_name), + strtolower($stmt->name->name), + $this_object_type + ) ?: []; + + $template_result = new TemplateResult( + $class_template_params ?: [], + [] + ); + + $return_type = TemplateStandinTypeReplacer::replace( + $return_type, + $template_result, + $codebase, + null, + null, + null, + $original_fq_classlike_name + ); + } + + $overridden_method_ids = $class_storage->overridden_method_ids[strtolower($stmt->name->name)] ?? []; + + if (!$return_type + && !$class_storage->is_interface + && $overridden_method_ids + ) { + foreach ($overridden_method_ids as $interface_method_id) { + $interface_class = $interface_method_id->fq_class_name; + + if (!$codebase->classlikes->interfaceExists($interface_class)) { + continue; + } + + $interface_return_type = $codebase->methods->getMethodReturnType( + $interface_method_id, + $interface_class + ); + + $interface_return_type_location = $codebase->methods->getMethodReturnTypeLocation( + $interface_method_id + ); + + ReturnTypeAnalyzer::verifyReturnType( + $stmt, + $stmt->getStmts() ?: [], + $source, + $type_provider, + $method_analyzer, + $interface_return_type, + $interface_class, + $original_fq_classlike_name, + $interface_return_type_location, + [$analyzed_method_id->__toString()], + $did_explicitly_return + ); + } + } + + $overridden_method_ids = array_map( + function ($method_id) { + return $method_id->__toString(); + }, + $overridden_method_ids + ); + + if ($actual_method_storage->overridden_downstream) { + $overridden_method_ids['overridden::downstream'] = 'overridden::downstream'; + } + + + ReturnTypeAnalyzer::verifyReturnType( + $stmt, + $stmt->getStmts() ?: [], + $source, + $type_provider, + $method_analyzer, + $return_type, + $fq_classlike_name, + $original_fq_classlike_name, + $return_type_location, + $overridden_method_ids, + $did_explicitly_return + ); + } + + private function checkTemplateParams( + Codebase $codebase, + ClassLikeStorage $storage, + ClassLikeStorage $parent_storage, + CodeLocation $code_location, + int $given_param_count + ): void { + $expected_param_count = $parent_storage->template_types === null + ? 0 + : count($parent_storage->template_types); + + if ($expected_param_count > $given_param_count) { + IssueBuffer::maybeAdd( + new MissingTemplateParam( + $storage->name . ' has missing template params when extending ' . $parent_storage->name + . ' , expecting ' . $expected_param_count, + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } elseif ($expected_param_count < $given_param_count) { + IssueBuffer::maybeAdd( + new TooManyTemplateParams( + $storage->name . ' has too many template params when extending ' . $parent_storage->name + . ' , expecting ' . $expected_param_count, + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + $storage_param_count = ($storage->template_types ? count($storage->template_types) : 0); + + if ($parent_storage->enforce_template_inheritance + && $expected_param_count !== $storage_param_count + ) { + if ($expected_param_count > $storage_param_count) { + IssueBuffer::maybeAdd( + new MissingTemplateParam( + $storage->name . ' requires the same number of template params as ' . $parent_storage->name + . ' but saw ' . $storage_param_count, + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new TooManyTemplateParams( + $storage->name . ' requires the same number of template params as ' . $parent_storage->name + . ' but saw ' . $storage_param_count, + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + } + + if ($parent_storage->template_types && $storage->template_extended_params) { + $i = 0; + + $previous_extended = []; + + foreach ($parent_storage->template_types as $template_name => $type_map) { + // declares the variables + foreach ($type_map as $declaring_class => $template_type) { + } + + if (isset($storage->template_extended_params[$parent_storage->name][$template_name])) { + $extended_type = $storage->template_extended_params[$parent_storage->name][$template_name]; + + if (isset($parent_storage->template_covariants[$i]) + && !$parent_storage->template_covariants[$i] + ) { + foreach ($extended_type->getAtomicTypes() as $t) { + if ($t instanceof TTemplateParam + && $storage->template_types + && $storage->template_covariants + && ($local_offset + = array_search($t->param_name, array_keys($storage->template_types))) + !== false + && !empty($storage->template_covariants[$local_offset]) + ) { + IssueBuffer::maybeAdd( + new InvalidTemplateParam( + 'Cannot extend an invariant template param ' . $template_name + . ' into a covariant context', + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + } + } + + if ($parent_storage->enforce_template_inheritance) { + foreach ($extended_type->getAtomicTypes() as $t) { + if (!$t instanceof TTemplateParam + || !isset($storage->template_types[$t->param_name]) + ) { + IssueBuffer::maybeAdd( + new InvalidTemplateParam( + 'Cannot extend a strictly-enforced parent template param ' + . $template_name + . ' with a non-template type', + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } elseif ($storage->template_types[$t->param_name][$storage->name]->getId() + !== $template_type->getId() + ) { + IssueBuffer::maybeAdd( + new InvalidTemplateParam( + 'Cannot extend a strictly-enforced parent template param ' + . $template_name + . ' with constraint ' . $template_type->getId() + . ' with a child template param ' . $t->param_name + . ' with different constraint ' + . $storage->template_types[$t->param_name][$storage->name]->getId(), + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + } + } + + if (!$template_type->isMixed()) { + $template_type_copy = clone $template_type; + + $template_result = new TemplateResult( + $previous_extended ?: [], + [] + ); + + $template_type_copy = TemplateStandinTypeReplacer::replace( + $template_type_copy, + $template_result, + $codebase, + null, + $extended_type, + null, + null + ); + + if (!UnionTypeComparator::isContainedBy($codebase, $extended_type, $template_type_copy)) { + IssueBuffer::maybeAdd( + new InvalidTemplateParam( + 'Extended template param ' . $template_name + . ' expects type ' . $template_type_copy->getId() + . ', type ' . $extended_type->getId() . ' given', + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } else { + $previous_extended[$template_name] = [ + $declaring_class => $extended_type + ]; + } + } else { + $previous_extended[$template_name] = [ + $declaring_class => $extended_type + ]; + } + } + + $i++; + } + } + } + + /** + * @param PhpParser\Node\Stmt\Class_|PhpParser\Node\Stmt\Enum_ $class + */ + private function checkImplementedInterfaces( + Context $class_context, + PhpParser\Node\Stmt $class, + Codebase $codebase, + string $fq_class_name, + ClassLikeStorage $storage + ): bool { + $classlike_storage_provider = $codebase->classlike_storage_provider; + + foreach ($class->implements as $interface_name) { + $fq_interface_name = self::getFQCLNFromNameObject( + $interface_name, + $this->source->getAliases() + ); + + $fq_interface_name_lc = strtolower($fq_interface_name); + + $codebase->analyzer->addNodeReference( + $this->getFilePath(), + $interface_name, + $codebase->classlikes->interfaceExists($fq_interface_name) + ? $fq_interface_name + : '*' + . ($interface_name instanceof PhpParser\Node\Name\FullyQualified + ? '\\' + : $this->getNamespace() . '-') + . implode('\\', $interface_name->parts) + ); + + $interface_location = new CodeLocation($this, $interface_name); + + if (self::checkFullyQualifiedClassLikeName( + $this, + $fq_interface_name, + $interface_location, + null, + null, + $this->getSuppressedIssues() + ) === false) { + return false; + } + + if ($codebase->store_node_types && $fq_class_name) { + $bounds = $interface_location->getSelectionBounds(); + + $codebase->analyzer->addOffsetReference( + $this->getFilePath(), + $bounds[0], + $bounds[1], + $fq_interface_name + ); + } + + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $this, + $interface_name, + $fq_interface_name, + null + ); + + try { + $interface_storage = $classlike_storage_provider->get($fq_interface_name); + } catch (InvalidArgumentException $e) { + return false; + } + + $code_location = new CodeLocation( + $this, + $interface_name, + $class_context->include_location, + true + ); + + if (!$interface_storage->is_interface) { + IssueBuffer::maybeAdd( + new UndefinedInterface( + $fq_interface_name . ' is not an interface', + $code_location, + $fq_interface_name + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + if (isset($storage->template_type_implements_count[$fq_interface_name_lc])) { + $this->checkTemplateParams( + $codebase, + $storage, + $interface_storage, + $code_location, + $storage->template_type_implements_count[$fq_interface_name_lc] + ); + } + } + + foreach ($storage->class_implements as $fq_interface_name_lc => $fq_interface_name) { + try { + $interface_storage = $classlike_storage_provider->get($fq_interface_name_lc); + } catch (InvalidArgumentException $e) { + return false; + } + + $code_location = new CodeLocation( + $this, + $class->name ?? $class, + $class_context->include_location, + true + ); + + if ($fq_interface_name_lc === 'traversable' + && !$storage->abstract + && !isset($storage->class_implements['iteratoraggregate']) + && !isset($storage->class_implements['iterator']) + && !isset($storage->parent_classes['pdostatement']) + && !isset($storage->parent_classes['ds\collection']) + && !isset($storage->parent_classes['domnodelist']) + && !isset($storage->parent_classes['dateperiod']) + ) { + IssueBuffer::maybeAdd( + new InvalidTraversableImplementation( + 'Traversable should be implemented by implementing IteratorAggregate or Iterator', + $code_location, + $fq_class_name + ) + ); + } + + if ($interface_storage->deprecated) { + IssueBuffer::maybeAdd( + new DeprecatedInterface( + $fq_interface_name . ' is marked deprecated', + $code_location, + $fq_interface_name + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + if ($interface_storage->external_mutation_free + && !$storage->external_mutation_free + ) { + IssueBuffer::maybeAdd( + new MissingImmutableAnnotation( + $fq_interface_name . ' is marked @psalm-immutable, but ' + . $fq_class_name . ' is not marked @psalm-immutable', + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + foreach ($interface_storage->methods as $interface_method_name_lc => $interface_method_storage) { + if ($interface_method_storage->visibility === self::VISIBILITY_PUBLIC) { + $implementer_declaring_method_id = $codebase->methods->getDeclaringMethodId( + new MethodIdentifier( + $this->fq_class_name, + $interface_method_name_lc + ) + ); + + $implementer_method_storage = null; + $implementer_classlike_storage = null; + + if ($implementer_declaring_method_id) { + $implementer_fq_class_name = $implementer_declaring_method_id->fq_class_name; + $implementer_method_storage = $codebase->methods->getStorage( + $implementer_declaring_method_id + ); + $implementer_classlike_storage = $classlike_storage_provider->get( + $implementer_fq_class_name + ); + } + + if ($storage->is_enum) { + if ($interface_method_name_lc === 'cases') { + continue; + } + if ($storage->enum_type + && in_array($interface_method_name_lc, ['from', 'tryfrom'], true) + ) { + continue; + } + } + + if (!$implementer_method_storage) { + IssueBuffer::maybeAdd( + new UnimplementedInterfaceMethod( + 'Method ' . $interface_method_name_lc . ' is not defined on class ' . + $storage->name, + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + + return true; + } + + $implementer_appearing_method_id = $codebase->methods->getAppearingMethodId( + new MethodIdentifier( + $this->fq_class_name, + $interface_method_name_lc + ) + ); + + $implementer_visibility = $implementer_method_storage->visibility; + + if ($implementer_appearing_method_id + && $implementer_appearing_method_id !== $implementer_declaring_method_id + ) { + $appearing_fq_class_name = $implementer_appearing_method_id->fq_class_name; + $appearing_method_name = $implementer_appearing_method_id->method_name; + + $appearing_class_storage = $classlike_storage_provider->get( + $appearing_fq_class_name + ); + + if (isset($appearing_class_storage->trait_visibility_map[$appearing_method_name])) { + $implementer_visibility + = $appearing_class_storage->trait_visibility_map[$appearing_method_name]; + } + } + + if ($implementer_visibility !== self::VISIBILITY_PUBLIC) { + IssueBuffer::maybeAdd( + new InaccessibleMethod( + 'Interface-defined method ' . $implementer_method_storage->cased_name + . ' must be public in ' . $storage->name, + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + + return true; + } + + if ($interface_method_storage->is_static && !$implementer_method_storage->is_static) { + IssueBuffer::maybeAdd( + new MethodSignatureMismatch( + 'Method ' . $implementer_method_storage->cased_name + . ' should be static like ' + . $storage->name . '::' . $interface_method_storage->cased_name, + $code_location + ), + $implementer_method_storage->suppressed_issues + ); + + return true; + } + + if ($storage->abstract && $implementer_method_storage === $interface_method_storage) { + continue; + } + + MethodComparator::compare( + $codebase, + null, + $implementer_classlike_storage ?? $storage, + $interface_storage, + $implementer_method_storage, + $interface_method_storage, + $this->fq_class_name, + $implementer_visibility, + $code_location, + $implementer_method_storage->suppressed_issues, + false + ); + } + } + } + + return true; + } + + private function checkParentClass( + Class_ $class, + PhpParser\Node\Name $extended_class, + string $fq_class_name, + string $parent_fq_class_name, + ClassLikeStorage $storage, + Codebase $codebase, + ?Context $class_context + ): void { + $classlike_storage_provider = $codebase->classlike_storage_provider; + + if (!$parent_fq_class_name) { + throw new UnexpectedValueException('Parent class should be filled in for ' . $fq_class_name); + } + + $parent_reference_location = new CodeLocation($this, $extended_class); + + if (self::checkFullyQualifiedClassLikeName( + $this->getSource(), + $parent_fq_class_name, + $parent_reference_location, + null, + null, + $storage->suppressed_issues + $this->getSuppressedIssues() + ) === false) { + return; + } + + if ($codebase->alter_code && $codebase->classes_to_move) { + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $this, + $extended_class, + $parent_fq_class_name, + null + ); + } + + try { + $parent_class_storage = $classlike_storage_provider->get($parent_fq_class_name); + + $code_location = new CodeLocation( + $this, + $extended_class, + $class_context->include_location ?? null, + true + ); + + if ($parent_class_storage->is_trait || $parent_class_storage->is_interface) { + IssueBuffer::maybeAdd( + new UndefinedClass( + $parent_fq_class_name . ' is not a class', + $code_location, + $parent_fq_class_name . ' as class' + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + if ($parent_class_storage->final) { + IssueBuffer::maybeAdd( + new InvalidExtendClass( + 'Class ' . $fq_class_name . ' may not inherit from final class ' . $parent_fq_class_name, + $code_location, + $fq_class_name + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + if ($parent_class_storage->deprecated) { + IssueBuffer::maybeAdd( + new DeprecatedClass( + $parent_fq_class_name . ' is marked deprecated', + $code_location, + $parent_fq_class_name + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + if (!NamespaceAnalyzer::isWithinAny($fq_class_name, $parent_class_storage->internal)) { + IssueBuffer::maybeAdd( + new InternalClass( + $parent_fq_class_name . ' is internal to ' + . InternalClass::listToPhrase($parent_class_storage->internal) + . ' but called from ' . $fq_class_name, + $code_location, + $parent_fq_class_name + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + if ($parent_class_storage->external_mutation_free + && !$storage->external_mutation_free + ) { + IssueBuffer::maybeAdd( + new MissingImmutableAnnotation( + $parent_fq_class_name . ' is marked @psalm-immutable, but ' + . $fq_class_name . ' is not marked @psalm-immutable', + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + if ($storage->mutation_free + && !$parent_class_storage->mutation_free + ) { + IssueBuffer::maybeAdd( + new MutableDependency( + $fq_class_name . ' is marked @psalm-immutable but ' . $parent_fq_class_name . ' is not', + $code_location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + + if ($codebase->store_node_types) { + $codebase->analyzer->addNodeReference( + $this->getFilePath(), + $extended_class, + $codebase->classlikes->classExists($parent_fq_class_name) + ? $parent_fq_class_name + : '*' + . ($extended_class instanceof PhpParser\Node\Name\FullyQualified + ? '\\' + : $this->getNamespace() . '-') + . implode('\\', $extended_class->parts) + ); + } + + if ($storage->template_extended_count !== null || $parent_class_storage->enforce_template_inheritance) { + $code_location = new CodeLocation( + $this, + $class->name ?: $class, + $class_context->include_location ?? null, + true + ); + + $this->checkTemplateParams( + $codebase, + $storage, + $parent_class_storage, + $code_location, + $storage->template_extended_count ?? 0 + ); + } + } catch (InvalidArgumentException $e) { + // do nothing + } + } + + private function checkEnum(): void + { + $storage = $this->storage; + + $seen_values = []; + foreach ($storage->enum_cases as $case_storage) { + if ($case_storage->value !== null && $storage->enum_type === null) { + if (IssueBuffer::accepts( + new InvalidEnumCaseValue( + 'Case of a non-backed enum should not have a value', + $case_storage->stmt_location, + $storage->name + ) + )) { + } + } elseif ($case_storage->value === null && $storage->enum_type !== null) { + if (IssueBuffer::accepts( + new InvalidEnumCaseValue( + 'Case of a backed enum should have a value', + $case_storage->stmt_location, + $storage->name + ) + )) { + } + } elseif ($case_storage->value !== null && $storage->enum_type !== null) { + if ((is_int($case_storage->value) && $storage->enum_type === 'string') + || (is_string($case_storage->value) && $storage->enum_type === 'int') + ) { + if (IssueBuffer::accepts( + new InvalidEnumCaseValue( + 'Enum case value type should be ' . $storage->enum_type, + $case_storage->stmt_location, + $storage->name + ) + )) { + } + } + } + + if ($case_storage->value !== null) { + if (in_array($case_storage->value, $seen_values, true)) { + if (IssueBuffer::accepts( + new DuplicateEnumCaseValue( + 'Enum case values should be unique', + $case_storage->stmt_location, + $storage->name + ) + )) { + } + } else { + $seen_values[] = $case_storage->value; + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php new file mode 100644 index 00000000..0b4934e8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php @@ -0,0 +1,648 @@ + 'int', + 'string' => 'string', + 'float' => 'float', + 'bool' => 'bool', + 'false' => 'false', + 'object' => 'object', + 'empty' => 'empty', + 'callable' => 'callable', + 'array' => 'array', + 'iterable' => 'iterable', + 'null' => 'null', + 'mixed' => 'mixed', + ]; + + public const GETTYPE_TYPES = [ + 'boolean' => true, + 'integer' => true, + 'double' => true, + 'string' => true, + 'array' => true, + 'object' => true, + 'resource' => true, + 'resource (closed)' => true, + 'NULL' => true, + 'unknown type' => true, + ]; + + /** + * @var PhpParser\Node\Stmt\ClassLike + */ + protected $class; + + /** @var FileAnalyzer */ + public $file_analyzer; + + /** + * @var string + */ + protected $fq_class_name; + + /** + * The parent class + * + * @var string|null + */ + protected $parent_fq_class_name; + + /** + * @var PhpParser\Node\Stmt[] + */ + protected $leftover_stmts = []; + + /** @var ClassLikeStorage */ + protected $storage; + + public function __construct(PhpParser\Node\Stmt\ClassLike $class, SourceAnalyzer $source, string $fq_class_name) + { + $this->class = $class; + $this->source = $source; + $this->file_analyzer = $source->getFileAnalyzer(); + $this->fq_class_name = $fq_class_name; + $codebase = $source->getCodebase(); + $this->storage = $codebase->classlike_storage_provider->get($fq_class_name); + } + + public function __destruct() + { + unset($this->source); + unset($this->file_analyzer); + } + + public function getMethodMutations( + string $method_name, + Context $context + ): void { + $project_analyzer = $this->getFileAnalyzer()->project_analyzer; + $codebase = $project_analyzer->getCodebase(); + + foreach ($this->class->stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod && + strtolower($stmt->name->name) === strtolower($method_name) + ) { + $method_analyzer = new MethodAnalyzer($stmt, $this); + + $method_analyzer->analyze($context, new NodeDataProvider(), null, true); + + $context->clauses = []; + } elseif ($stmt instanceof PhpParser\Node\Stmt\TraitUse) { + foreach ($stmt->traits as $trait) { + $fq_trait_name = self::getFQCLNFromNameObject( + $trait, + $this->source->getAliases() + ); + + $trait_file_analyzer = $project_analyzer->getFileAnalyzerForClassLike($fq_trait_name); + $trait_node = $codebase->classlikes->getTraitNode($fq_trait_name); + $trait_storage = $codebase->classlike_storage_provider->get($fq_trait_name); + $trait_aliases = $trait_storage->aliases; + + if ($trait_aliases === null) { + continue; + } + + $trait_analyzer = new TraitAnalyzer( + $trait_node, + $trait_file_analyzer, + $fq_trait_name, + $trait_aliases + ); + + foreach ($trait_node->stmts as $trait_stmt) { + if ($trait_stmt instanceof PhpParser\Node\Stmt\ClassMethod && + strtolower($trait_stmt->name->name) === strtolower($method_name) + ) { + $method_analyzer = new MethodAnalyzer($trait_stmt, $trait_analyzer); + + $actual_method_id = $method_analyzer->getMethodId(); + + if ($context->self && $context->self !== $this->fq_class_name) { + $analyzed_method_id = $method_analyzer->getMethodId($context->self); + $declaring_method_id = $codebase->methods->getDeclaringMethodId($analyzed_method_id); + + if ((string) $actual_method_id !== (string) $declaring_method_id) { + break; + } + } + + $method_analyzer->analyze( + $context, + new NodeDataProvider(), + null, + true + ); + } + } + + $trait_file_analyzer->clearSourceBeforeDestruction(); + } + } + } + } + + public function getFunctionLikeAnalyzer(string $method_name): ?MethodAnalyzer + { + foreach ($this->class->stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod && + strtolower($stmt->name->name) === strtolower($method_name) + ) { + return new MethodAnalyzer($stmt, $this); + } + } + + return null; + } + + /** + * @param array $suppressed_issues + */ + public static function checkFullyQualifiedClassLikeName( + StatementsSource $statements_source, + string $fq_class_name, + CodeLocation $code_location, + ?string $calling_fq_class_name, + ?string $calling_method_id, + array $suppressed_issues, + ?ClassLikeNameOptions $options = null + ): ?bool { + if ($options === null) { + $options = new ClassLikeNameOptions(); + } + + $codebase = $statements_source->getCodebase(); + if ($fq_class_name === '') { + if (IssueBuffer::accepts( + new UndefinedClass( + 'Class or interface does not exist', + $code_location, + 'empty string' + ), + $suppressed_issues + )) { + return false; + } + + return null; + } + + $fq_class_name = preg_replace('/^\\\/', '', $fq_class_name); + + if (in_array($fq_class_name, ['callable', 'iterable', 'self', 'static', 'parent'], true)) { + return true; + } + + if (preg_match( + '/(^|\\\)(int|float|bool|string|void|null|false|true|object|mixed)$/i', + $fq_class_name + ) || strtolower($fq_class_name) === 'resource' + ) { + $class_name_parts = explode('\\', $fq_class_name); + $class_name = array_pop($class_name_parts); + + IssueBuffer::maybeAdd( + new ReservedWord( + $class_name . ' is a reserved word', + $code_location, + $class_name + ), + $suppressed_issues + ); + + return null; + } + + $class_exists = $codebase->classlikes->classExists( + $fq_class_name, + !$options->inferred ? $code_location : null, + $calling_fq_class_name, + $calling_method_id + ); + + $interface_exists = $codebase->classlikes->interfaceExists( + $fq_class_name, + !$options->inferred ? $code_location : null, + $calling_fq_class_name, + $calling_method_id + ); + + $enum_exists = $codebase->classlikes->enumExists( + $fq_class_name, + !$options->inferred ? $code_location : null, + $calling_fq_class_name, + $calling_method_id + ); + + if (!$class_exists + && !($interface_exists && $options->allow_interface) + && !($enum_exists && $options->allow_enum) + ) { + if (!$options->allow_trait || !$codebase->classlikes->traitExists($fq_class_name, $code_location)) { + if ($options->from_docblock) { + if (IssueBuffer::accepts( + new UndefinedDocblockClass( + 'Docblock-defined class, interface or enum named ' . $fq_class_name . ' does not exist', + $code_location, + $fq_class_name + ), + $suppressed_issues + )) { + return false; + } + } elseif ($options->from_attribute) { + if (IssueBuffer::accepts( + new UndefinedAttributeClass( + 'Attribute class ' . $fq_class_name . ' does not exist', + $code_location, + $fq_class_name + ), + $suppressed_issues + )) { + return false; + } + } else { + if (IssueBuffer::accepts( + new UndefinedClass( + 'Class, interface or enum named ' . $fq_class_name . ' does not exist', + $code_location, + $fq_class_name + ), + $suppressed_issues + )) { + return false; + } + } + } + + return null; + } + + $aliased_name = $codebase->classlikes->getUnAliasedName( + $fq_class_name + ); + + try { + $class_storage = $codebase->classlike_storage_provider->get($aliased_name); + } catch (InvalidArgumentException $e) { + if (!$options->inferred) { + throw $e; + } + + return null; + } + + foreach ($class_storage->invalid_dependencies as $dependency_class_name) { + // if the implemented/extended class is stubbed, it may not yet have + // been hydrated + if ($codebase->classlike_storage_provider->has($dependency_class_name)) { + continue; + } + + if (IssueBuffer::accepts( + new MissingDependency( + $fq_class_name . ' depends on class or interface ' + . $dependency_class_name . ' that does not exist', + $code_location, + $fq_class_name + ), + $suppressed_issues + )) { + return false; + } + } + + if (!$options->inferred) { + if (($class_exists && !$codebase->classHasCorrectCasing($fq_class_name)) + || ($interface_exists && !$codebase->interfaceHasCorrectCasing($fq_class_name)) + || ($enum_exists && !$codebase->classlikes->enumHasCorrectCasing($fq_class_name)) + ) { + if ($codebase->classlikes->isUserDefined(strtolower($aliased_name))) { + IssueBuffer::maybeAdd( + new InvalidClass( + 'Class, interface or enum ' . $fq_class_name . ' has wrong casing', + $code_location, + $fq_class_name + ), + $suppressed_issues + ); + } + } + } + + if (!$options->inferred) { + $event = new AfterClassLikeExistenceCheckEvent( + $fq_class_name, + $code_location, + $statements_source, + $codebase, + [] + ); + + $codebase->config->eventDispatcher->dispatchAfterClassLikeExistenceCheck($event); + + $file_manipulations = $event->getFileReplacements(); + if ($file_manipulations) { + FileManipulationBuffer::add($code_location->file_path, $file_manipulations); + } + } + + return true; + } + + /** + * Gets the fully-qualified class name from a Name object + * + * + */ + public static function getFQCLNFromNameObject( + PhpParser\Node\Name $class_name, + Aliases $aliases + ): string { + /** @var string|null */ + $resolved_name = $class_name->getAttribute('resolvedName'); + + if ($resolved_name) { + return $resolved_name; + } + + if ($class_name instanceof PhpParser\Node\Name\FullyQualified) { + return implode('\\', $class_name->parts); + } + + if (in_array($class_name->parts[0], ['self', 'static', 'parent'], true)) { + return $class_name->parts[0]; + } + + return Type::getFQCLNFromString( + implode('\\', $class_name->parts), + $aliases + ); + } + + /** + * @return array + */ + public function getAliasedClassesFlipped(): array + { + if ($this->source instanceof NamespaceAnalyzer || $this->source instanceof FileAnalyzer) { + return $this->source->getAliasedClassesFlipped(); + } + + return []; + } + + /** + * @return array + */ + public function getAliasedClassesFlippedReplaceable(): array + { + if ($this->source instanceof NamespaceAnalyzer || $this->source instanceof FileAnalyzer) { + return $this->source->getAliasedClassesFlippedReplaceable(); + } + + return []; + } + + public function getFQCLN(): string + { + return $this->fq_class_name; + } + + public function getClassName(): ?string + { + return $this->class->name->name ?? null; + } + + /** + * @return array>|null + */ + public function getTemplateTypeMap(): ?array + { + return $this->storage->template_types; + } + + public function getParentFQCLN(): ?string + { + return $this->parent_fq_class_name; + } + + public function isStatic(): bool + { + return false; + } + + /** + * Gets the Psalm type from a particular value + * + * @param mixed $value + * + */ + public static function getTypeFromValue($value): Union + { + switch (gettype($value)) { + case 'boolean': + if ($value) { + return Type::getTrue(); + } + + return Type::getFalse(); + + case 'integer': + return Type::getInt(false, $value); + + case 'double': + return Type::getFloat($value); + + case 'string': + return Type::getString($value); + + case 'array': + return Type::getArray(); + + case 'NULL': + return Type::getNull(); + + default: + return Type::getMixed(); + } + } + + /** + * @param string[] $suppressed_issues + */ + public static function checkPropertyVisibility( + string $property_id, + Context $context, + SourceAnalyzer $source, + CodeLocation $code_location, + array $suppressed_issues, + bool $emit_issues = true + ): ?bool { + [$fq_class_name, $property_name] = explode('::$', $property_id); + + $codebase = $source->getCodebase(); + + if ($codebase->properties->property_visibility_provider->has($fq_class_name)) { + $property_visible = $codebase->properties->property_visibility_provider->isPropertyVisible( + $source, + $fq_class_name, + $property_name, + true, + $context, + $code_location + ); + + if ($property_visible !== null) { + return $property_visible; + } + } + + $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( + $property_id, + true + ); + $appearing_property_class = $codebase->properties->getAppearingClassForProperty( + $property_id, + true + ); + + if (!$declaring_property_class || !$appearing_property_class) { + throw new UnexpectedValueException( + 'Appearing/Declaring classes are not defined for ' . $property_id + ); + } + + // if the calling class is the same, we know the property exists, so it must be visible + if ($appearing_property_class === $context->self) { + return $emit_issues ? null : true; + } + + if ($source->getSource() instanceof TraitAnalyzer + && strtolower($declaring_property_class) === strtolower((string) $source->getFQCLN()) + ) { + return $emit_issues ? null : true; + } + + $class_storage = $codebase->classlike_storage_provider->get($declaring_property_class); + + if (!isset($class_storage->properties[$property_name])) { + throw new UnexpectedValueException('$storage should not be null for ' . $property_id); + } + + $storage = $class_storage->properties[$property_name]; + + switch ($storage->visibility) { + case self::VISIBILITY_PUBLIC: + return $emit_issues ? null : true; + + case self::VISIBILITY_PRIVATE: + if ($emit_issues && IssueBuffer::accepts( + new InaccessibleProperty( + 'Cannot access private property ' . $property_id . ' from context ' . $context->self, + $code_location + ), + $suppressed_issues + )) { + // fall through + } + + return null; + case self::VISIBILITY_PROTECTED: + if (!$context->self) { + if ($emit_issues && IssueBuffer::accepts( + new InaccessibleProperty( + 'Cannot access protected property ' . $property_id, + $code_location + ), + $suppressed_issues + )) { + // fall through + } + + return null; + } + + if ($codebase->classExtends($appearing_property_class, $context->self)) { + return $emit_issues ? null : true; + } + + if (!$codebase->classExtends($context->self, $appearing_property_class)) { + if ($emit_issues && IssueBuffer::accepts( + new InaccessibleProperty( + 'Cannot access protected property ' . $property_id . ' from context ' . $context->self, + $code_location + ), + $suppressed_issues + )) { + // fall through + } + + return null; + } + } + + return $emit_issues ? null : true; + } + + /** + * @return array + */ + public static function getClassesForFile(Codebase $codebase, string $file_path): array + { + try { + return $codebase->file_storage_provider->get($file_path)->classlikes_in_file; + } catch (InvalidArgumentException $e) { + return []; + } + } + + public function getFileAnalyzer(): FileAnalyzer + { + return $this->file_analyzer; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php new file mode 100644 index 00000000..dff50564 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php @@ -0,0 +1,40 @@ +inferred = $inferred; + $this->allow_trait = $allow_trait; + $this->allow_interface = $allow_interface; + $this->allow_enum = $allow_enum; + $this->from_docblock = $from_docblock; + $this->from_attribute = $from_attribute; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php new file mode 100644 index 00000000..1b36c9be --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php @@ -0,0 +1,343 @@ + + */ +class ClosureAnalyzer extends FunctionLikeAnalyzer +{ + /** + * @param PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\ArrowFunction $function + */ + public function __construct(PhpParser\Node\FunctionLike $function, SourceAnalyzer $source) + { + $codebase = $source->getCodebase(); + + $function_id = strtolower($source->getFilePath()) + . ':' . $function->getLine() + . ':' . (int)$function->getAttribute('startFilePos') + . ':-:closure'; + + $storage = $codebase->getClosureStorage($source->getFilePath(), $function_id); + + parent::__construct($function, $source, $storage); + } + + public function getTemplateTypeMap(): ?array + { + return $this->source->getTemplateTypeMap(); + } + + /** + * @return non-empty-lowercase-string + */ + public function getClosureId(): string + { + return strtolower($this->getFilePath()) + . ':' . $this->function->getLine() + . ':' . (int)$this->function->getAttribute('startFilePos') + . ':-:closure'; + } + + /** + * @param PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\ArrowFunction $stmt + */ + public static function analyzeExpression( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\FunctionLike $stmt, + Context $context + ): bool { + $closure_analyzer = new ClosureAnalyzer($stmt, $statements_analyzer); + + if ($stmt instanceof PhpParser\Node\Expr\Closure + && self::analyzeClosureUses($statements_analyzer, $stmt, $context) === false + ) { + return false; + } + + $use_context = new Context($context->self); + + $codebase = $statements_analyzer->getCodebase(); + + if (!$statements_analyzer->isStatic()) { + if ($context->collect_mutations && + $context->self && + $codebase->classExtends( + $context->self, + (string)$statements_analyzer->getFQCLN() + ) + ) { + /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ + $use_context->vars_in_scope['$this'] = clone $context->vars_in_scope['$this']; + } elseif ($context->self) { + $this_atomic = new TNamedObject($context->self); + $this_atomic->was_static = true; + + $use_context->vars_in_scope['$this'] = new Union([$this_atomic]); + } + } + + foreach ($context->vars_in_scope as $var => $type) { + if (strpos($var, '$this->') === 0) { + $use_context->vars_in_scope[$var] = clone $type; + } + } + + if ($context->self) { + $self_class_storage = $codebase->classlike_storage_provider->get($context->self); + + ClassAnalyzer::addContextProperties( + $statements_analyzer, + $self_class_storage, + $use_context, + $context->self, + $statements_analyzer->getParentFQCLN() + ); + } + + foreach ($context->vars_possibly_in_scope as $var => $_) { + if (strpos($var, '$this->') === 0) { + $use_context->vars_possibly_in_scope[$var] = true; + } + } + + if ($stmt instanceof PhpParser\Node\Expr\Closure) { + foreach ($stmt->uses as $use) { + if (!is_string($use->var->name)) { + continue; + } + + $use_var_id = '$' . $use->var->name; + + // insert the ref into the current context if passed by ref, as whatever we're passing + // the closure to could execute it straight away. + if ($use->byRef && !$context->hasVariable($use_var_id)) { + $context->vars_in_scope[$use_var_id] = Type::getMixed(); + } + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + && $context->hasVariable($use_var_id) + ) { + $parent_nodes = $context->vars_in_scope[$use_var_id]->parent_nodes; + + foreach ($parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + new DataFlowNode('closure-use', 'closure use', null), + 'closure-use' + ); + } + } + + $use_context->vars_in_scope[$use_var_id] = + $context->hasVariable($use_var_id) && !$use->byRef + ? clone $context->vars_in_scope[$use_var_id] + : Type::getMixed(); + + if ($use->byRef) { + $use_context->vars_in_scope[$use_var_id]->by_ref = true; + } + + $use_context->vars_possibly_in_scope[$use_var_id] = true; + + foreach ($context->vars_in_scope as $var_id => $type) { + if (preg_match('/^\$' . $use->var->name . '[\[\-]/', $var_id)) { + $use_context->vars_in_scope[$var_id] = clone $type; + $use_context->vars_possibly_in_scope[$var_id] = true; + } + } + } + } else { + $traverser = new PhpParser\NodeTraverser; + + $short_closure_visitor = new ShortClosureVisitor(); + + $traverser->addVisitor($short_closure_visitor); + $traverser->traverse($stmt->getStmts()); + + foreach ($short_closure_visitor->getUsedVariables() as $use_var_id => $_) { + if ($context->hasVariable($use_var_id)) { + $use_context->vars_in_scope[$use_var_id] = clone $context->vars_in_scope[$use_var_id]; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + $parent_nodes = $context->vars_in_scope[$use_var_id]->parent_nodes; + + foreach ($parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + new DataFlowNode('closure-use', 'closure use', null), + 'closure-use' + ); + } + } + } + + $use_context->vars_possibly_in_scope[$use_var_id] = true; + } + } + + $use_context->calling_method_id = $context->calling_method_id; + + $closure_analyzer->analyze($use_context, $statements_analyzer->node_data, $context, false); + + if ($closure_analyzer->inferred_impure + && $statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + ) { + $statements_analyzer->getSource()->inferred_impure = true; + } + + if ($closure_analyzer->inferred_has_mutation + && $statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + } + + if (!$statements_analyzer->node_data->getType($stmt)) { + $statements_analyzer->node_data->setType($stmt, Type::getClosure()); + } + + return true; + } + + /** + * @return false|null + */ + public static function analyzeClosureUses( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\Closure $stmt, + Context $context + ): ?bool { + $param_names = array_map( + function (PhpParser\Node\Param $p): string { + if (!$p->var instanceof PhpParser\Node\Expr\Variable + || !is_string($p->var->name) + ) { + return ''; + } + return $p->var->name; + }, + $stmt->params + ); + + foreach ($stmt->uses as $use) { + if (!is_string($use->var->name)) { + continue; + } + + $use_var_id = '$' . $use->var->name; + + if (in_array($use->var->name, $param_names)) { + if (IssueBuffer::accepts( + new DuplicateParam( + 'Closure use duplicates param name ' . $use_var_id, + new CodeLocation($statements_analyzer->getSource(), $use->var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } + + if (!$context->hasVariable($use_var_id)) { + if ($use_var_id === '$argv' || $use_var_id === '$argc') { + continue; + } + + if ($use->byRef) { + $context->vars_in_scope[$use_var_id] = Type::getMixed(); + $context->vars_possibly_in_scope[$use_var_id] = true; + + if (!$statements_analyzer->hasVariable($use_var_id)) { + $statements_analyzer->registerVariable( + $use_var_id, + new CodeLocation($statements_analyzer, $use->var), + null + ); + } + + return null; + } + + if (!isset($context->vars_possibly_in_scope[$use_var_id])) { + if ($context->check_variables) { + if (IssueBuffer::accepts( + new UndefinedVariable( + 'Cannot find referenced variable ' . $use_var_id, + new CodeLocation($statements_analyzer->getSource(), $use->var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + return null; + } + } + + $first_appearance = $statements_analyzer->getFirstAppearance($use_var_id); + + if ($first_appearance) { + if (IssueBuffer::accepts( + new PossiblyUndefinedVariable( + 'Possibly undefined variable ' . $use_var_id . ', first seen on line ' . + $first_appearance->getLineNumber(), + new CodeLocation($statements_analyzer->getSource(), $use->var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + continue; + } + + if ($context->check_variables) { + if (IssueBuffer::accepts( + new UndefinedVariable( + 'Cannot find referenced variable ' . $use_var_id, + new CodeLocation($statements_analyzer->getSource(), $use->var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + continue; + } + } elseif ($use->byRef) { + $new_type = Type::getMixed(); + $new_type->parent_nodes = $context->vars_in_scope[$use_var_id]->parent_nodes; + + $context->remove($use_var_id); + + $context->vars_in_scope[$use_var_id] = $new_type; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php new file mode 100644 index 00000000..5af3a43e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php @@ -0,0 +1,391 @@ +\[\]\-\{\}:|?\\\\]*|\$[a-zA-Z_0-9_]+)'; + + /** + * @param array>|null $template_type_map + * @param array $type_aliases + * + * @throws DocblockParseException if there was a problem parsing the docblock + * + * @return list + */ + public static function getTypeFromComment( + PhpParser\Comment\Doc $comment, + FileSource $source, + Aliases $aliases, + ?array $template_type_map = null, + ?array $type_aliases = null + ): array { + $parsed_docblock = DocComment::parsePreservingLength($comment); + + return self::arrayToDocblocks( + $comment, + $parsed_docblock, + $source, + $aliases, + $template_type_map, + $type_aliases + ); + } + + /** + * @param array>|null $template_type_map + * @param array $type_aliases + * + * @return list + * + * @throws DocblockParseException if there was a problem parsing the docblock + */ + public static function arrayToDocblocks( + PhpParser\Comment\Doc $comment, + ParsedDocblock $parsed_docblock, + FileSource $source, + Aliases $aliases, + ?array $template_type_map = null, + ?array $type_aliases = null + ): array { + $var_id = null; + + $var_type_tokens = null; + $original_type = null; + + $var_comments = []; + + $comment_text = $comment->getText(); + + $var_line_number = $comment->getStartLine(); + + if (isset($parsed_docblock->combined_tags['var'])) { + foreach ($parsed_docblock->combined_tags['var'] as $offset => $var_line) { + $var_line = trim($var_line); + + if (!$var_line) { + continue; + } + + $type_start = null; + $type_end = null; + + $line_parts = self::splitDocLine($var_line); + + $line_number = $comment->getStartLine() + substr_count( + $comment_text, + "\n", + 0, + $offset - $comment->getStartFilePos() + ); + $description = $parsed_docblock->description; + + if ($line_parts[0]) { + $type_start = $offset; + $type_end = $type_start + strlen($line_parts[0]); + + $line_parts[0] = self::sanitizeDocblockType($line_parts[0]); + + if ($line_parts[0] === '' + || ($line_parts[0][0] === '$' + && !preg_match('/^\$this(\||$)/', $line_parts[0])) + ) { + throw new IncorrectDocblockException('Misplaced variable'); + } + + try { + $var_type_tokens = TypeTokenizer::getFullyQualifiedTokens( + $line_parts[0], + $aliases, + $template_type_map, + $type_aliases + ); + } catch (TypeParseTreeException $e) { + throw new DocblockParseException($line_parts[0] . ' is not a valid type'); + } + + $original_type = $line_parts[0]; + + $var_line_number = $line_number; + + if (count($line_parts) > 1) { + if ($line_parts[1][0] === '$') { + $var_id = $line_parts[1]; + $description = trim(substr($var_line, strlen($line_parts[0]) + strlen($line_parts[1]) + 2)); + } else { + $description = trim(substr($var_line, strlen($line_parts[0]) + 1)); + } + $description = preg_replace('/\\n \\*\\s+/um', ' ', $description); + } + } + + if (!$var_type_tokens || !$original_type) { + continue; + } + + try { + $defined_type = TypeParser::parseTokens( + $var_type_tokens, + null, + $template_type_map ?: [], + $type_aliases ?: [] + ); + } catch (TypeParseTreeException $e) { + throw new DocblockParseException( + $line_parts[0] . + ' is not a valid type' . + ' (from ' . + $source->getFilePath() . + ':' . + $comment->getStartLine() . + ')' + ); + } + + $defined_type->setFromDocblock(); + + $var_comment = new VarDocblockComment(); + $var_comment->type = $defined_type; + $var_comment->var_id = $var_id; + $var_comment->line_number = $var_line_number; + $var_comment->type_start = $type_start; + $var_comment->type_end = $type_end; + $var_comment->description = $description; + + self::decorateVarDocblockComment($var_comment, $parsed_docblock); + + $var_comments[] = $var_comment; + } + } + + if (!$var_comments + && (isset($parsed_docblock->tags['deprecated']) + || isset($parsed_docblock->tags['internal']) + || isset($parsed_docblock->tags['readonly']) + || isset($parsed_docblock->tags['psalm-readonly']) + || isset($parsed_docblock->tags['psalm-readonly-allow-private-mutation']) + || isset($parsed_docblock->tags['psalm-allow-private-mutation']) + || isset($parsed_docblock->tags['psalm-taint-escape']) + || isset($parsed_docblock->tags['psalm-internal']) + || isset($parsed_docblock->tags['psalm-suppress']) + || $parsed_docblock->description) + ) { + $var_comment = new VarDocblockComment(); + + self::decorateVarDocblockComment($var_comment, $parsed_docblock); + + $var_comments[] = $var_comment; + } + + return $var_comments; + } + + private static function decorateVarDocblockComment( + VarDocblockComment $var_comment, + ParsedDocblock $parsed_docblock + ): void { + $var_comment->deprecated = isset($parsed_docblock->tags['deprecated']); + $var_comment->internal = isset($parsed_docblock->tags['internal']); + $var_comment->readonly = isset($parsed_docblock->tags['readonly']) + || isset($parsed_docblock->tags['psalm-readonly']) + || isset($parsed_docblock->tags['psalm-readonly-allow-private-mutation']); + + $var_comment->allow_private_mutation + = isset($parsed_docblock->tags['psalm-allow-private-mutation']) + || isset($parsed_docblock->tags['psalm-readonly-allow-private-mutation']); + + if (!$var_comment->description) { + $var_comment->description = $parsed_docblock->description; + } + + if (isset($parsed_docblock->tags['psalm-taint-escape'])) { + foreach ($parsed_docblock->tags['psalm-taint-escape'] as $param) { + $param = trim($param); + $var_comment->removed_taints[] = $param; + } + } + + if (count($var_comment->psalm_internal = DocblockParser::handlePsalmInternal($parsed_docblock)) !== 0) { + $var_comment->internal = true; + } + + if (isset($parsed_docblock->tags['psalm-suppress'])) { + foreach ($parsed_docblock->tags['psalm-suppress'] as $offset => $suppress_entry) { + foreach (DocComment::parseSuppressList($suppress_entry) as $issue_offset => $suppressed_issue) { + $var_comment->suppressed_issues[$issue_offset + $offset] = $suppressed_issue; + } + } + } + } + + /** + * @psalm-pure + */ + public static function sanitizeDocblockType(string $docblock_type): string + { + $docblock_type = preg_replace('@^[ \t]*\*@m', '', $docblock_type); + $docblock_type = preg_replace('/,\n\s+\}/', '}', $docblock_type); + return str_replace("\n", '', $docblock_type); + } + + /** + * @throws DocblockParseException if an invalid string is found + * + * @return non-empty-list + * + * @psalm-pure + */ + public static function splitDocLine(string $return_block): array + { + $brackets = ''; + + $type = ''; + + $expects_callable_return = false; + + $return_block = str_replace("\t", ' ', $return_block); + + $quote_char = null; + $escaped = false; + + for ($i = 0, $l = strlen($return_block); $i < $l; ++$i) { + $char = $return_block[$i]; + $next_char = $i < $l - 1 ? $return_block[$i + 1] : null; + $last_char = $i > 0 ? $return_block[$i - 1] : null; + + if ($quote_char) { + if ($char === $quote_char && !$escaped) { + $quote_char = null; + + $type .= $char; + + continue; + } + + if ($char === '\\' && !$escaped && ($next_char === $quote_char || $next_char === '\\')) { + $escaped = true; + + $type .= $char; + + continue; + } + + $escaped = false; + + $type .= $char; + + continue; + } + + if ($char === '"' || $char === '\'') { + $quote_char = $char; + + $type .= $char; + + continue; + } + + if ($char === ':' && $last_char === ')') { + $expects_callable_return = true; + + $type .= $char; + + continue; + } + + if ($char === '[' || $char === '{' || $char === '(' || $char === '<') { + $brackets .= $char; + } elseif ($char === ']' || $char === '}' || $char === ')' || $char === '>') { + $last_bracket = substr($brackets, -1); + $brackets = substr($brackets, 0, -1); + + if (($char === ']' && $last_bracket !== '[') + || ($char === '}' && $last_bracket !== '{') + || ($char === ')' && $last_bracket !== '(') + || ($char === '>' && $last_bracket !== '<') + ) { + throw new DocblockParseException('Invalid string ' . $return_block); + } + } elseif ($char === ' ') { + if ($brackets) { + $expects_callable_return = false; + $type .= ' '; + continue; + } + + if ($next_char === '|' || $next_char === '&') { + $nexter_char = $i < $l - 2 ? $return_block[$i + 2] : null; + + if ($nexter_char === ' ') { + ++$i; + $type .= $next_char . ' '; + continue; + } + } + + if ($last_char === '|' || $last_char === '&') { + $type .= ' '; + continue; + } + + if ($next_char === ':') { + ++$i; + $type .= ' :'; + $expects_callable_return = true; + continue; + } + + if ($expects_callable_return) { + $type .= ' '; + $expects_callable_return = false; + continue; + } + + $remaining = trim(preg_replace('@^[ \t]*\* *@m', ' ', substr($return_block, $i + 1))); + + if ($remaining) { + return array_merge([rtrim($type)], preg_split('/[ \s]+/', $remaining)); + } + + return [$type]; + } + + $expects_callable_return = false; + + $type .= $char; + } + + return [$type]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php new file mode 100644 index 00000000..a33ac969 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php @@ -0,0 +1,90 @@ +label = $label; + $this->line_from = $line_from; + $this->line_to = $line_to; + $this->file_name = $file_name; + $this->file_path = $file_path; + $this->snippet = $snippet; + $this->from = $from; + $this->to = $to; + $this->snippet_from = $snippet_from; + $this->column_from = $column_from; + $this->column_to = $column_to; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php new file mode 100644 index 00000000..0d57d4c2 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php @@ -0,0 +1,682 @@ + + */ + private $required_file_paths = []; + + /** + * @var array + */ + private $parent_file_paths = []; + + /** + * @var array + */ + private $suppressed_issues = []; + + /** + * @var array> + */ + private $namespace_aliased_classes = []; + + /** + * @var array> + */ + private $namespace_aliased_classes_flipped = []; + + /** + * @var array> + */ + private $namespace_aliased_classes_flipped_replaceable = []; + + /** + * @var array + */ + public $interface_analyzers_to_analyze = []; + + /** + * @var array + */ + public $class_analyzers_to_analyze = []; + + /** + * @var null|Context + */ + public $context; + + /** + * @var ProjectAnalyzer + */ + public $project_analyzer; + + /** + * @var Codebase + */ + public $codebase; + + /** + * @var int + */ + private $first_statement_offset = -1; + + /** @var ?NodeDataProvider */ + private $node_data; + + /** @var ?Union */ + private $return_type; + + public function __construct(ProjectAnalyzer $project_analyzer, string $file_path, string $file_name) + { + $this->source = $this; + $this->file_path = $file_path; + $this->file_name = $file_name; + $this->project_analyzer = $project_analyzer; + $this->codebase = $project_analyzer->getCodebase(); + } + + public function analyze( + ?Context $file_context = null, + ?Context $global_context = null + ): void { + $codebase = $this->project_analyzer->getCodebase(); + + $file_storage = $codebase->file_storage_provider->get($this->file_path); + + if (!$file_storage->deep_scan && !$codebase->server_mode) { + throw new UnpreparedAnalysisException('File ' . $this->file_path . ' has not been properly scanned'); + } + + if ($file_storage->has_visitor_issues) { + return; + } + + if ($file_context) { + $this->context = $file_context; + } + + if (!$this->context) { + $this->context = new Context(); + } + + if ($codebase->config->useStrictTypesForFile($this->file_path)) { + $this->context->strict_types = true; + } + + $this->context->is_global = true; + $this->context->defineGlobals(); + $this->context->collect_exceptions = $codebase->config->check_for_throws_in_global_scope; + + try { + $stmts = $codebase->getStatementsForFile($this->file_path); + } catch (PhpParser\Error $e) { + return; + } + + $event = new BeforeFileAnalysisEvent($this, $this->context, $file_storage, $codebase); + + $codebase->config->eventDispatcher->dispatchBeforeFileAnalysis($event); + + if ($codebase->alter_code) { + foreach ($stmts as $stmt) { + if (!$stmt instanceof PhpParser\Node\Stmt\Declare_) { + $this->first_statement_offset = (int) $stmt->getAttribute('startFilePos'); + break; + } + } + } + + $leftover_stmts = $this->populateCheckers($stmts); + + $this->node_data = new NodeDataProvider(); + $statements_analyzer = new StatementsAnalyzer($this, $this->node_data); + + foreach ($file_storage->docblock_issues as $docblock_issue) { + IssueBuffer::maybeAdd($docblock_issue); + } + + // if there are any leftover statements, evaluate them, + // in turn causing the classes/interfaces be evaluated + if ($leftover_stmts) { + $statements_analyzer->analyze($leftover_stmts, $this->context, $global_context, true); + + foreach ($leftover_stmts as $leftover_stmt) { + if ($leftover_stmt instanceof PhpParser\Node\Stmt\Return_) { + if ($leftover_stmt->expr) { + $this->return_type = + $statements_analyzer->node_data->getType($leftover_stmt->expr) ?? Type::getMixed(); + } else { + $this->return_type = Type::getVoid(); + } + + break; + } + } + } + + // check any leftover interfaces not already evaluated + foreach ($this->interface_analyzers_to_analyze as $interface_analyzer) { + $interface_analyzer->analyze(); + } + + // check any leftover classes not already evaluated + + foreach ($this->class_analyzers_to_analyze as $class_analyzer) { + $class_analyzer->analyze(null, $this->context); + } + + if ($codebase->config->check_for_throws_in_global_scope) { + $uncaught_throws = $statements_analyzer->getUncaughtThrows($this->context); + foreach ($uncaught_throws as $possibly_thrown_exception => $codelocations) { + foreach ($codelocations as $codelocation) { + // issues are suppressed in ThrowAnalyzer, CallAnalyzer, etc. + IssueBuffer::maybeAdd( + new UncaughtThrowInGlobalScope( + $possibly_thrown_exception . ' is thrown but not caught in global scope', + $codelocation + ) + ); + } + } + } + + // validate type imports + if ($file_storage->type_aliases) { + foreach ($file_storage->type_aliases as $alias) { + if ($alias instanceof LinkableTypeAlias) { + $location = new DocblockTypeLocation( + $this->getSource(), + $alias->start_offset, + $alias->end_offset, + $alias->line_number + ); + $fq_source_classlike = $alias->declaring_fq_classlike_name; + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $this->getSource(), + $fq_source_classlike, + $location, + null, + null, + $this->suppressed_issues, + new ClassLikeNameOptions( + true, + false, + true, + true, + true + ) + ) === false) { + continue; + } + + $referenced_class_storage = $codebase->classlike_storage_provider->get($fq_source_classlike); + if (!isset($referenced_class_storage->type_aliases[$alias->alias_name])) { + IssueBuffer::maybeAdd( + new InvalidTypeImport( + 'Type alias ' . $alias->alias_name + . ' imported from ' . $fq_source_classlike + . ' is not defined on the source class', + $location + ) + ); + } + } + } + } + + $event = new AfterFileAnalysisEvent($this, $this->context, $file_storage, $codebase, $stmts); + $codebase->config->eventDispatcher->dispatchAfterFileAnalysis($event); + + $this->class_analyzers_to_analyze = []; + $this->interface_analyzers_to_analyze = []; + } + + /** + * @param array $stmts + * + * @return list + */ + public function populateCheckers(array $stmts): array + { + $leftover_stmts = []; + + foreach ($stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\Trait_) { + $leftover_stmts[] = $stmt; + } elseif ($stmt instanceof PhpParser\Node\Stmt\ClassLike) { + $this->populateClassLikeAnalyzers($stmt); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Namespace_) { + $namespace_name = $stmt->name ? implode('\\', $stmt->name->parts) : ''; + + $namespace_analyzer = new NamespaceAnalyzer($stmt, $this); + $namespace_analyzer->collectAnalyzableInformation(); + + $this->namespace_aliased_classes[$namespace_name] = $namespace_analyzer->getAliases()->uses; + $this->namespace_aliased_classes_flipped[$namespace_name] = + $namespace_analyzer->getAliasedClassesFlipped(); + $this->namespace_aliased_classes_flipped_replaceable[$namespace_name] = + $namespace_analyzer->getAliasedClassesFlippedReplaceable(); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Use_) { + $this->visitUse($stmt); + } elseif ($stmt instanceof PhpParser\Node\Stmt\GroupUse) { + $this->visitGroupUse($stmt); + } else { + if ($stmt instanceof PhpParser\Node\Stmt\If_) { + foreach ($stmt->stmts as $if_stmt) { + if ($if_stmt instanceof PhpParser\Node\Stmt\ClassLike) { + $this->populateClassLikeAnalyzers($if_stmt); + } + } + } + + $leftover_stmts[] = $stmt; + } + } + + return $leftover_stmts; + } + + private function populateClassLikeAnalyzers(PhpParser\Node\Stmt\ClassLike $stmt): void + { + if ($stmt instanceof PhpParser\Node\Stmt\Class_ || $stmt instanceof PhpParser\Node\Stmt\Enum_) { + if (!$stmt->name) { + return; + } + + // this can happen when stubbing + if (!$this->codebase->classExists($stmt->name->name) + && !$this->codebase->classlikes->enumExists($stmt->name->name) + ) { + return; + } + + + $class_analyzer = new ClassAnalyzer($stmt, $this, $stmt->name->name); + + $fq_class_name = $class_analyzer->getFQCLN(); + + $this->class_analyzers_to_analyze[strtolower($fq_class_name)] = $class_analyzer; + } elseif ($stmt instanceof PhpParser\Node\Stmt\Interface_) { + if (!$stmt->name) { + return; + } + + // this can happen when stubbing + if (!$this->codebase->interfaceExists($stmt->name->name)) { + return; + } + + $class_analyzer = new InterfaceAnalyzer($stmt, $this, $stmt->name->name); + + $fq_class_name = $class_analyzer->getFQCLN(); + + $this->interface_analyzers_to_analyze[strtolower($fq_class_name)] = $class_analyzer; + } + } + + public function addNamespacedClassAnalyzer(string $fq_class_name, ClassAnalyzer $class_analyzer): void + { + $this->class_analyzers_to_analyze[strtolower($fq_class_name)] = $class_analyzer; + } + + public function addNamespacedInterfaceAnalyzer(string $fq_class_name, InterfaceAnalyzer $interface_analyzer): void + { + $this->interface_analyzers_to_analyze[strtolower($fq_class_name)] = $interface_analyzer; + } + + public function getMethodMutations( + MethodIdentifier $method_id, + Context $this_context, + bool $from_project_analyzer = false + ): void { + $fq_class_name = $method_id->fq_class_name; + $method_name = $method_id->method_name; + $fq_class_name_lc = strtolower($fq_class_name); + + if (isset($this->class_analyzers_to_analyze[$fq_class_name_lc])) { + $class_analyzer_to_examine = $this->class_analyzers_to_analyze[$fq_class_name_lc]; + } else { + if (!$from_project_analyzer) { + $this->project_analyzer->getMethodMutations( + $method_id, + $this_context, + $this->getRootFilePath(), + $this->getRootFileName() + ); + } + + return; + } + + $call_context = new Context($this_context->self); + $call_context->collect_mutations = $this_context->collect_mutations; + $call_context->collect_initializations = $this_context->collect_initializations; + $call_context->collect_nonprivate_initializations = $this_context->collect_nonprivate_initializations; + $call_context->initialized_methods = $this_context->initialized_methods; + $call_context->include_location = $this_context->include_location; + $call_context->calling_method_id = $this_context->calling_method_id; + + foreach ($this_context->vars_possibly_in_scope as $var => $_) { + if (strpos($var, '$this->') === 0) { + $call_context->vars_possibly_in_scope[$var] = true; + } + } + + foreach ($this_context->vars_in_scope as $var => $type) { + if (strpos($var, '$this->') === 0) { + $call_context->vars_in_scope[$var] = $type; + } + } + + if (!isset($this_context->vars_in_scope['$this'])) { + throw new UnexpectedValueException('Should exist'); + } + + $call_context->vars_in_scope['$this'] = $this_context->vars_in_scope['$this']; + + $class_analyzer_to_examine->getMethodMutations($method_name, $call_context); + + foreach ($call_context->vars_possibly_in_scope as $var => $_) { + $this_context->vars_possibly_in_scope[$var] = true; + } + + foreach ($call_context->vars_in_scope as $var => $type) { + $this_context->vars_in_scope[$var] = $type; + } + } + + public function getFunctionLikeAnalyzer(MethodIdentifier $method_id): ?MethodAnalyzer + { + $fq_class_name = $method_id->fq_class_name; + $method_name = $method_id->method_name; + + $fq_class_name_lc = strtolower($fq_class_name); + + if (!isset($this->class_analyzers_to_analyze[$fq_class_name_lc])) { + return null; + } + + $class_analyzer_to_examine = $this->class_analyzers_to_analyze[$fq_class_name_lc]; + + return $class_analyzer_to_examine->getFunctionLikeAnalyzer($method_name); + } + + public function getNamespace(): ?string + { + return null; + } + + /** + * @return array + */ + public function getAliasedClassesFlipped(?string $namespace_name = null): array + { + if ($namespace_name && isset($this->namespace_aliased_classes_flipped[$namespace_name])) { + return $this->namespace_aliased_classes_flipped[$namespace_name]; + } + + return $this->aliased_classes_flipped; + } + + /** + * @return array + */ + public function getAliasedClassesFlippedReplaceable(?string $namespace_name = null): array + { + if ($namespace_name && isset($this->namespace_aliased_classes_flipped_replaceable[$namespace_name])) { + return $this->namespace_aliased_classes_flipped_replaceable[$namespace_name]; + } + + return $this->aliased_classes_flipped_replaceable; + } + + public static function clearCache(): void + { + TypeTokenizer::clearCache(); + Reflection::clearCache(); + Functions::clearCache(); + IssueBuffer::clearCache(); + FileManipulationBuffer::clearCache(); + FunctionLikeAnalyzer::clearCache(); + ClassLikeStorageProvider::deleteAll(); + FileStorageProvider::deleteAll(); + FileReferenceProvider::clearCache(); + InternalCallMapHandler::clearCache(); + } + + public function getFileName(): string + { + return $this->file_name; + } + + public function getFilePath(): string + { + return $this->file_path; + } + + public function getRootFileName(): string + { + return $this->root_file_name ?: $this->file_name; + } + + public function getRootFilePath(): string + { + return $this->root_file_path ?: $this->file_path; + } + + public function setRootFilePath(string $file_path, string $file_name): void + { + $this->root_file_name = $file_name; + $this->root_file_path = $file_path; + } + + public function addRequiredFilePath(string $file_path): void + { + $this->required_file_paths[$file_path] = true; + } + + public function addParentFilePath(string $file_path): void + { + $this->parent_file_paths[$file_path] = true; + } + + public function hasParentFilePath(string $file_path): bool + { + return $this->file_path === $file_path || isset($this->parent_file_paths[$file_path]); + } + + public function hasAlreadyRequiredFilePath(string $file_path): bool + { + return isset($this->required_file_paths[$file_path]); + } + + /** + * @return list + */ + public function getRequiredFilePaths(): array + { + return array_keys($this->required_file_paths); + } + + /** + * @return list + */ + public function getParentFilePaths(): array + { + return array_keys($this->parent_file_paths); + } + + public function getRequireNesting(): int + { + return count($this->parent_file_paths); + } + + /** + * @return array + */ + public function getSuppressedIssues(): array + { + return $this->suppressed_issues; + } + + /** + * @param array $new_issues + */ + public function addSuppressedIssues(array $new_issues): void + { + if (isset($new_issues[0])) { + $new_issues = array_combine($new_issues, $new_issues); + } + + $this->suppressed_issues = $new_issues + $this->suppressed_issues; + } + + /** + * @param array $new_issues + */ + public function removeSuppressedIssues(array $new_issues): void + { + if (isset($new_issues[0])) { + $new_issues = array_combine($new_issues, $new_issues); + } + + $this->suppressed_issues = array_diff_key($this->suppressed_issues, $new_issues); + } + + public function getFQCLN(): ?string + { + return null; + } + + public function getParentFQCLN(): ?string + { + return null; + } + + public function getClassName(): ?string + { + return null; + } + + /** + * @return array>|null + */ + public function getTemplateTypeMap(): ?array + { + return null; + } + + public function isStatic(): bool + { + return false; + } + + /** + * @psalm-mutation-free + */ + public function getFileAnalyzer(): FileAnalyzer + { + return $this; + } + + /** + * @psalm-mutation-free + */ + public function getProjectAnalyzer(): ProjectAnalyzer + { + return $this->project_analyzer; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + public function getFirstStatementOffset(): int + { + return $this->first_statement_offset; + } + + public function getNodeTypeProvider(): NodeTypeProvider + { + if (!$this->node_data) { + throw new UnexpectedValueException('There should be a node type provider'); + } + + return $this->node_data; + } + + public function getReturnType(): ?Union + { + return $this->return_type; + } + + public function clearSourceBeforeDestruction(): void + { + unset($this->source); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php new file mode 100644 index 00000000..c11aa47c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php @@ -0,0 +1,124 @@ + + */ +class FunctionAnalyzer extends FunctionLikeAnalyzer +{ + public function __construct(PhpParser\Node\Stmt\Function_ $function, SourceAnalyzer $source) + { + $codebase = $source->getCodebase(); + + $file_storage_provider = $codebase->file_storage_provider; + + $file_storage = $file_storage_provider->get($source->getFilePath()); + + $namespace = $source->getNamespace(); + + $function_id = ($namespace ? strtolower($namespace) . '\\' : '') . strtolower($function->name->name); + + if (!isset($file_storage->functions[$function_id])) { + throw new UnexpectedValueException( + 'Function ' . $function_id . ' should be defined in ' . $source->getFilePath() + ); + } + + $storage = $file_storage->functions[$function_id]; + + parent::__construct($function, $source, $storage); + } + + /** + * @return non-empty-lowercase-string + * @throws UnexpectedValueException if function is closure or arrow function. + */ + public function getFunctionId(): string + { + $namespace = $this->source->getNamespace(); + + /** @var non-empty-lowercase-string */ + return ($namespace ? strtolower($namespace) . '\\' : '') . strtolower($this->function->name->name); + } + + public static function analyzeStatement( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Stmt\Function_ $stmt, + Context $context + ): void { + foreach ($stmt->stmts as $function_stmt) { + if ($function_stmt instanceof PhpParser\Node\Stmt\Global_) { + foreach ($function_stmt->vars as $var) { + if ($var instanceof PhpParser\Node\Expr\Variable) { + if (is_string($var->name)) { + $var_id = '$' . $var->name; + + // registers variable in global context + $context->hasVariable($var_id); + } + } + } + } elseif (!$function_stmt instanceof PhpParser\Node\Stmt\Nop) { + break; + } + } + + $codebase = $statements_analyzer->getCodebase(); + + if (!$codebase->register_stub_files + && !$codebase->register_autoload_files + ) { + $function_name = strtolower($stmt->name->name); + + if ($ns = $statements_analyzer->getNamespace()) { + $fq_function_name = strtolower($ns) . '\\' . $function_name; + } else { + $fq_function_name = $function_name; + } + + $function_context = new Context($context->self); + $function_context->strict_types = $context->strict_types; + $config = Config::getInstance(); + $function_context->collect_exceptions = $config->check_for_throws_docblock; + + if ($function_analyzer = $statements_analyzer->getFunctionAnalyzer($fq_function_name)) { + $function_analyzer->analyze( + $function_context, + $statements_analyzer->node_data, + $context + ); + + if ($config->reportIssueInFile('InvalidReturnType', $statements_analyzer->getFilePath())) { + $method_id = $function_analyzer->getId(); + + $function_storage = $codebase->functions->getStorage( + $statements_analyzer, + strtolower($method_id) + ); + + $return_type = $function_storage->return_type; + $return_type_location = $function_storage->return_type_location; + + $function_analyzer->verifyReturnType( + $stmt->getStmts(), + $statements_analyzer, + $return_type, + $statements_analyzer->getFQCLN(), + $return_type_location, + $function_context->has_returned + ); + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php new file mode 100644 index 00000000..d6f1d7eb --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php @@ -0,0 +1,978 @@ +getSuppressedIssues(); + $codebase = $source->getCodebase(); + $project_analyzer = $source->getProjectAnalyzer(); + + $function_like_storage = null; + + if ($source instanceof StatementsAnalyzer) { + $function_like_storage = $function_like_analyzer->getFunctionLikeStorage($source); + } elseif ($source instanceof ClassAnalyzer + || $source instanceof TraitAnalyzer + ) { + $function_like_storage = $function_like_analyzer->getFunctionLikeStorage(); + } + + $cased_method_id = $function_like_analyzer->getCorrectlyCasedMethodId(); + + if (!$function->getStmts() && + ( + $function instanceof ClassMethod && + ($source instanceof InterfaceAnalyzer || $function->isAbstract()) + ) + ) { + if (!$return_type) { + IssueBuffer::maybeAdd( + new MissingReturnType( + 'Method ' . $cased_method_id . ' does not have a return type', + new CodeLocation($function_like_analyzer, $function->name, null, true) + ), + $suppressed_issues + ); + } + + return null; + } + + $is_to_string = $function instanceof ClassMethod && strtolower($function->name->name) === '__tostring'; + + if ($function instanceof ClassMethod + && strpos($function->name->name, '__') === 0 + && !$is_to_string + && !$return_type + ) { + // do not check __construct, __set, __get, __call etc. + return null; + } + + if (!$return_type_location) { + $return_type_location = new CodeLocation( + $function_like_analyzer, + $function instanceof Closure || $function instanceof ArrowFunction ? $function : $function->name + ); + } + + $inferred_yield_types = []; + + $inferred_return_type_parts = ReturnTypeCollector::getReturnTypes( + $codebase, + $type_provider, + $function_stmts, + $inferred_yield_types, + true + ); + + if (!$inferred_return_type_parts) { + $did_explicitly_return = true; + } + + if ((!$return_type || $return_type->from_docblock) + && ScopeAnalyzer::getControlActions( + $function_stmts, + $type_provider, + $codebase->config->exit_functions, + [] + ) !== [ScopeAnalyzer::ACTION_END] + && !$inferred_yield_types + && count($inferred_return_type_parts) + && !$did_explicitly_return + ) { + // only add null if we have a return statement elsewhere and it wasn't void + foreach ($inferred_return_type_parts as $inferred_return_type_part) { + if (!$inferred_return_type_part->isVoid()) { + $atomic_null = new TNull(); + $atomic_null->from_docblock = true; + $inferred_return_type_parts[] = new Union([$atomic_null]); + break; + } + } + } + + $control_actions = ScopeAnalyzer::getControlActions( + $function_stmts, + $type_provider, + $codebase->config->exit_functions, + [], + false + ); + + $function_always_exits = $control_actions === [ScopeAnalyzer::ACTION_END]; + + $function_returns_implicitly = (bool)array_diff( + $control_actions, + [ScopeAnalyzer::ACTION_END, ScopeAnalyzer::ACTION_RETURN] + ); + + /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ + if ($return_type + && (!$return_type->from_docblock + || ($return_type->isNullable() + && !$return_type->hasTemplate() + && !$return_type->getAtomicTypes()['null']->from_docblock + ) + ) + && !$return_type->isVoid() + && !$inferred_yield_types + && (!$function_like_storage || !$function_like_storage->has_yield) + && $function_returns_implicitly + ) { + if (IssueBuffer::accepts( + new InvalidReturnType( + 'Not all code paths of ' . $cased_method_id . ' end in a return statement, return type ' + . $return_type . ' expected', + $return_type_location + ), + $suppressed_issues + )) { + return false; + } + + return null; + } + + + if ($return_type + && $return_type->isNever() + && !$inferred_yield_types + && !$function_always_exits + ) { + if (IssueBuffer::accepts( + new InvalidReturnType( + $cased_method_id . ' is not expected to return any values but it does, ' + . 'either implicitly or explicitly', + $return_type_location + ), + $suppressed_issues + )) { + return false; + } + + return null; + } + + $number_of_types = count($inferred_return_type_parts); + // we filter TNever and TEmpty that have no bearing on the return type + if ($number_of_types > 1) { + $inferred_return_type_parts = array_filter( + $inferred_return_type_parts, + static function (Union $union_type): bool { + return !($union_type->isNever() || $union_type->isEmpty()); + } + ); + } + + $inferred_return_type_parts = array_values($inferred_return_type_parts); + + $inferred_return_type = $inferred_return_type_parts + ? Type::combineUnionTypeArray($inferred_return_type_parts, $codebase) + : Type::getVoid(); + + if ($function_always_exits) { + $inferred_return_type = new Union([new TNever]); + } + + $inferred_yield_type = $inferred_yield_types + ? Type::combineUnionTypeArray($inferred_yield_types, $codebase) + : null; + + if ($inferred_yield_type) { + $inferred_return_type = $inferred_yield_type; + } + + $unsafe_return_type = false; + + // prevent any return types that do not return a value from being used in PHP typehints + if ($codebase->alter_code + && $inferred_return_type->isNullable() + && !$inferred_yield_types + ) { + foreach ($inferred_return_type_parts as $inferred_return_type_part) { + if ($inferred_return_type_part->isVoid()) { + $unsafe_return_type = true; + break; + } + } + } + + $inferred_return_type = TypeExpander::expandUnion( + $codebase, + $inferred_return_type, + $source->getFQCLN(), + $source->getFQCLN(), + $source->getParentFQCLN() + ); + + // hack until we have proper yield type collection + if ($function_like_storage + && $function_like_storage->has_yield + && !$inferred_yield_type + && !$inferred_return_type->isVoid() + ) { + $inferred_return_type = new Union([new TNamedObject('Generator')]); + } + + if ($is_to_string) { + $union_comparison_results = new TypeComparisonResult(); + if (!$inferred_return_type->hasMixed() && + !UnionTypeComparator::isContainedBy( + $codebase, + $inferred_return_type, + Type::getString(), + $inferred_return_type->ignore_nullable_issues, + $inferred_return_type->ignore_falsable_issues, + $union_comparison_results + ) + ) { + if (IssueBuffer::accepts( + new InvalidToString( + '__toString methods must return a string, ' . $inferred_return_type . ' returned', + $return_type_location + ), + $suppressed_issues + )) { + return false; + } + } + + if ($union_comparison_results->to_string_cast) { + IssueBuffer::maybeAdd( + new ImplicitToStringCast( + 'The declared return type for ' . $cased_method_id . ' expects string, ' . + '\'' . $inferred_return_type . '\' provided with a __toString method', + $return_type_location + ), + $suppressed_issues + ); + } + + return null; + } + + if (!$return_type) { + if ($function instanceof Closure || $function instanceof ArrowFunction) { + if (!$closure_inside_call || $inferred_return_type->isMixed()) { + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['MissingClosureReturnType']) + && !in_array('MissingClosureReturnType', $suppressed_issues) + ) { + if ($inferred_return_type->hasMixed() || $inferred_return_type->isNull()) { + return null; + } + + self::addOrUpdateReturnType( + $function, + $project_analyzer, + $inferred_return_type, + $source, + ($project_analyzer->only_replace_php_types_with_non_docblock_types + || $unsafe_return_type) + && $inferred_return_type->from_docblock, + $function_like_storage + ); + + return null; + } + + IssueBuffer::maybeAdd( + new MissingClosureReturnType( + 'Closure does not have a return type, expecting ' . $inferred_return_type->getId(), + new CodeLocation($function_like_analyzer, $function, null, true) + ), + $suppressed_issues, + !$inferred_return_type->hasMixed() && !$inferred_return_type->isNull() + ); + } + + return null; + } + + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['MissingReturnType']) + && !in_array('MissingReturnType', $suppressed_issues) + ) { + if ($inferred_return_type->hasMixed() || $inferred_return_type->isNull()) { + return null; + } + + self::addOrUpdateReturnType( + $function, + $project_analyzer, + $inferred_return_type, + $source, + $compatible_method_ids + || !$did_explicitly_return + || (($project_analyzer->only_replace_php_types_with_non_docblock_types + || $unsafe_return_type) + && $inferred_return_type->from_docblock), + $function_like_storage + ); + + return null; + } + + IssueBuffer::maybeAdd( + new MissingReturnType( + 'Method ' . $cased_method_id . ' does not have a return type' . + (!$inferred_return_type->hasMixed() ? ', expecting ' . $inferred_return_type->getId() : ''), + new CodeLocation($function_like_analyzer, $function->name, null, true) + ), + $suppressed_issues, + !$inferred_return_type->hasMixed() && !$inferred_return_type->isNull() + ); + + return null; + } + + $self_fq_class_name = $fq_class_name ?: $source->getFQCLN(); + + $parent_class = null; + + $classlike_storage = null; + + if ($self_fq_class_name) { + $classlike_storage = $codebase->classlike_storage_provider->get($self_fq_class_name); + $parent_class = $classlike_storage->parent_class; + } + + // passing it through fleshOutTypes eradicates errant $ vars + $declared_return_type = TypeExpander::expandUnion( + $codebase, + $return_type, + $self_fq_class_name, + $static_fq_class_name, + $parent_class, + true, + true, + ($function_like_storage instanceof MethodStorage && $function_like_storage->final) + || ($classlike_storage && $classlike_storage->final) + ); + + if (!$inferred_return_type_parts + && !$inferred_return_type->isNever() + && !$inferred_yield_types + && (!$function_like_storage || !$function_like_storage->has_yield) + ) { + if ($declared_return_type->isVoid() || $declared_return_type->isNever()) { + return null; + } + + if (ScopeAnalyzer::onlyThrowsOrExits($type_provider, $function_stmts)) { + // if there's a single throw statement, it's presumably an exception saying this method is not to be + // used + return null; + } + + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['InvalidReturnType']) + && !in_array('InvalidReturnType', $suppressed_issues) + ) { + self::addOrUpdateReturnType( + $function, + $project_analyzer, + Type::getVoid(), + $source, + $compatible_method_ids + || (($project_analyzer->only_replace_php_types_with_non_docblock_types + || $unsafe_return_type) + && $inferred_return_type->from_docblock) + ); + + return null; + } + + if (!$declared_return_type->from_docblock || !$declared_return_type->isNullable()) { + if (IssueBuffer::accepts( + new InvalidReturnType( + 'No return statements were found for method ' . $cased_method_id . + ' but return type \'' . $declared_return_type . '\' was expected', + $return_type_location + ), + $suppressed_issues, + true + )) { + return false; + } + } + + return null; + } + + if (!$declared_return_type->hasMixed()) { + if ($inferred_return_type->isVoid() + && ($declared_return_type->isVoid() || ($function_like_storage && $function_like_storage->has_yield)) + ) { + return null; + } + + if ($inferred_return_type->hasMixed() || $inferred_return_type->isEmpty()) { + if (IssueBuffer::accepts( + new MixedInferredReturnType( + 'Could not verify return type \'' . $declared_return_type . '\' for ' . + $cased_method_id, + $return_type_location + ), + $suppressed_issues + )) { + return false; + } + + return null; + } + + $union_comparison_results = new TypeComparisonResult(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $inferred_return_type, + $declared_return_type, + true, + true, + $union_comparison_results + )) { + // is the declared return type more specific than the inferred one? + if ($union_comparison_results->type_coerced) { + if ($union_comparison_results->type_coerced_from_mixed) { + if (!$union_comparison_results->type_coerced_from_as_mixed) { + if (IssueBuffer::accepts( + new MixedReturnTypeCoercion( + 'The declared return type \'' . $declared_return_type->getId() . '\' for ' + . $cased_method_id . ' is more specific than the inferred return type ' + . '\'' . $inferred_return_type->getId() . '\'', + $return_type_location + ), + $suppressed_issues + )) { + return false; + } + } + } else { + if (IssueBuffer::accepts( + new MoreSpecificReturnType( + 'The declared return type \'' . $declared_return_type->getId() . '\' for ' + . $cased_method_id . ' is more specific than the inferred return type ' + . '\'' . $inferred_return_type->getId() . '\'', + $return_type_location + ), + $suppressed_issues + )) { + return false; + } + } + } else { + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['InvalidReturnType']) + && !in_array('InvalidReturnType', $suppressed_issues) + ) { + self::addOrUpdateReturnType( + $function, + $project_analyzer, + $inferred_return_type, + $source, + ($project_analyzer->only_replace_php_types_with_non_docblock_types + || $unsafe_return_type) + && $inferred_return_type->from_docblock, + $function_like_storage + ); + + return null; + } + + if (IssueBuffer::accepts( + new InvalidReturnType( + 'The declared return type \'' + . $declared_return_type->getId() + . '\' for ' . $cased_method_id + . ' is incorrect, got \'' + . $inferred_return_type->getId() . '\'', + $return_type_location + ), + $suppressed_issues, + true + )) { + return false; + } + } + } elseif (!$inferred_return_type->hasMixed() + && !UnionTypeComparator::isContainedBy( + $codebase, + $declared_return_type, + $inferred_return_type, + false, + false + ) + ) { + if ($codebase->alter_code) { + if (isset($project_analyzer->getIssuesToFix()['LessSpecificReturnType']) + && !in_array('LessSpecificReturnType', $suppressed_issues) + && !($function_like_storage instanceof MethodStorage && $function_like_storage->inheritdoc) + ) { + self::addOrUpdateReturnType( + $function, + $project_analyzer, + $inferred_return_type, + $source, + $compatible_method_ids + || (($project_analyzer->only_replace_php_types_with_non_docblock_types + || $unsafe_return_type) + && $inferred_return_type->from_docblock), + $function_like_storage + ); + } + } else { + if ($function instanceof Function_ + || $function instanceof Closure + || $function instanceof ArrowFunction + || $function->isPrivate() + ) { + $check_for_less_specific_type = true; + } elseif ($source instanceof StatementsAnalyzer) { + if ($function_like_storage instanceof MethodStorage) { + $check_for_less_specific_type = !$function_like_storage->overridden_somewhere; + } else { + $check_for_less_specific_type = false; + } + } else { + $check_for_less_specific_type = false; + } + + if ($check_for_less_specific_type + && (Config::getInstance()->restrict_return_types + || (!$inferred_return_type->isNullable() && $declared_return_type->isNullable()) + || (!$inferred_return_type->isFalsable() && $declared_return_type->isFalsable())) + ) { + if (IssueBuffer::accepts( + new LessSpecificReturnType( + 'The inferred return type \'' + . $inferred_return_type->getId() + . '\' for ' . $cased_method_id + . ' is more specific than the declared return type \'' + . $declared_return_type->getId() . '\'', + $return_type_location + ), + $suppressed_issues, + !($function_like_storage instanceof MethodStorage && $function_like_storage->inheritdoc) + )) { + return false; + } + } + } + } + + if ($union_comparison_results->to_string_cast) { + IssueBuffer::maybeAdd( + new ImplicitToStringCast( + 'The declared return type for ' . $cased_method_id . ' expects \'' . + $declared_return_type . '\', ' . '\'' . $inferred_return_type . + '\' provided with a __toString method', + $return_type_location + ), + $suppressed_issues + ); + } + + if (!$inferred_return_type->ignore_nullable_issues + && $inferred_return_type->isNullable() + && !$declared_return_type->isNullable() + && !$declared_return_type->hasTemplate() + && !$declared_return_type->isVoid() + ) { + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['InvalidNullableReturnType']) + && !in_array('InvalidNullableReturnType', $suppressed_issues) + && !$inferred_return_type->isNull() + ) { + self::addOrUpdateReturnType( + $function, + $project_analyzer, + $inferred_return_type, + $source, + ($project_analyzer->only_replace_php_types_with_non_docblock_types + || $unsafe_return_type) + && $inferred_return_type->from_docblock, + $function_like_storage + ); + + return null; + } + + if (IssueBuffer::accepts( + new InvalidNullableReturnType( + 'The declared return type \'' . $declared_return_type . '\' for ' . $cased_method_id . + ' is not nullable, but \'' . $inferred_return_type . '\' contains null', + $return_type_location + ), + $suppressed_issues, + !$inferred_return_type->isNull() + )) { + return false; + } + } + + if (!$inferred_return_type->ignore_falsable_issues + && $inferred_return_type->isFalsable() + && !$declared_return_type->isFalsable() + && !$declared_return_type->hasBool() + && !$declared_return_type->hasScalar() + ) { + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['InvalidFalsableReturnType']) + ) { + self::addOrUpdateReturnType( + $function, + $project_analyzer, + $inferred_return_type, + $source, + ($project_analyzer->only_replace_php_types_with_non_docblock_types + || $unsafe_return_type) + && $inferred_return_type->from_docblock, + $function_like_storage + ); + + return null; + } + + if (IssueBuffer::accepts( + new InvalidFalsableReturnType( + 'The declared return type \'' . $declared_return_type . '\' for ' . $cased_method_id . + ' does not allow false, but \'' . $inferred_return_type . '\' contains false', + $return_type_location + ), + $suppressed_issues, + true + )) { + return false; + } + } + } + + return null; + } + + /** + * @param Closure|Function_|ClassMethod|ArrowFunction $function + * + * @return false|null + */ + public static function checkReturnType( + FunctionLike $function, + ProjectAnalyzer $project_analyzer, + FunctionLikeAnalyzer $function_like_analyzer, + FunctionLikeStorage $storage, + Context $context + ): ?bool { + $codebase = $project_analyzer->getCodebase(); + + if (!$storage->return_type || !$storage->return_type_location) { + return null; + } + + $parent_class = null; + + $classlike_storage = null; + + if ($context->self) { + $classlike_storage = $codebase->classlike_storage_provider->get($context->self); + $parent_class = $classlike_storage->parent_class; + } + + if (!$storage->signature_return_type || $storage->signature_return_type === $storage->return_type) { + foreach ($storage->return_type->getAtomicTypes() as $type) { + if ($type instanceof TNamedObject + && 'parent' === $type->value + && null === $parent_class + ) { + if (IssueBuffer::accepts( + new InvalidParent( + 'Cannot use parent as a return type when class has no parent', + $storage->return_type_location + ), + $storage->suppressed_issues + )) { + return false; + } + return null; + } + } + + $fleshed_out_return_type = TypeExpander::expandUnion( + $codebase, + $storage->return_type, + $classlike_storage->name ?? null, + $classlike_storage->name ?? null, + $parent_class + ); + + $fleshed_out_return_type->check( + $function_like_analyzer, + $storage->return_type_location, + $storage->suppressed_issues, + [], + false, + false, + false, + $context->calling_method_id + ); + + return null; + } + + $fleshed_out_signature_type = TypeExpander::expandUnion( + $codebase, + $storage->signature_return_type, + $classlike_storage->name ?? null, + $classlike_storage->name ?? null, + $parent_class + ); + + if ($fleshed_out_signature_type->check( + $function_like_analyzer, + $storage->signature_return_type_location ?: $storage->return_type_location, + $storage->suppressed_issues, + [], + false + ) === false) { + return false; + } + + if ($function instanceof Closure || $function instanceof ArrowFunction) { + return null; + } + + $fleshed_out_return_type = TypeExpander::expandUnion( + $codebase, + $storage->return_type, + $classlike_storage->name ?? null, + $classlike_storage->name ?? null, + $parent_class, + true, + true + ); + + if ($fleshed_out_return_type->check( + $function_like_analyzer, + $storage->return_type_location, + $storage->suppressed_issues, + [], + false, + $storage instanceof MethodStorage && $storage->inherited_return_type + ) === false) { + return false; + } + + if ($classlike_storage && $context->self) { + $class_template_params = ClassTemplateParamCollector::collect( + $codebase, + $classlike_storage, + $codebase->classlike_storage_provider->get($context->self), + strtolower($function->name->name), + new TNamedObject($context->self), + true + ); + + $class_template_params = $class_template_params ?: []; + + if ($class_template_params) { + $template_result = new TemplateResult( + $class_template_params, + [] + ); + + $fleshed_out_return_type = TemplateStandinTypeReplacer::replace( + $fleshed_out_return_type, + $template_result, + $codebase, + null, + null, + null + ); + } + } + + $union_comparison_result = new TypeComparisonResult(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $fleshed_out_return_type, + $fleshed_out_signature_type, + false, + false, + $union_comparison_result + ) && !$union_comparison_result->type_coerced_from_mixed + ) { + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['MismatchingDocblockReturnType']) + ) { + self::addOrUpdateReturnType( + $function, + $project_analyzer, + $storage->signature_return_type, + $function_like_analyzer->getSource() + ); + + return null; + } + + if (IssueBuffer::accepts( + new MismatchingDocblockReturnType( + 'Docblock has incorrect return type \'' . $storage->return_type->getId() . + '\', should be \'' . $storage->signature_return_type->getId() . '\'', + $storage->return_type_location + ), + $storage->suppressed_issues, + true + )) { + return false; + } + } + + return null; + } + + /** + * @param Closure|Function_|ClassMethod|ArrowFunction $function + * + */ + private static function addOrUpdateReturnType( + FunctionLike $function, + ProjectAnalyzer $project_analyzer, + Union $inferred_return_type, + StatementsSource $source, + bool $docblock_only = false, + ?FunctionLikeStorage $function_like_storage = null + ): void { + $manipulator = FunctionDocblockManipulator::getForFunction( + $project_analyzer, + $source->getFilePath(), + $function + ); + + $codebase = $project_analyzer->getCodebase(); + $is_final = true; + $fqcln = $source->getFQCLN(); + + if ($fqcln !== null && $function instanceof ClassMethod) { + $class_storage = $codebase->classlike_storage_provider->get($fqcln); + $is_final = $function->isFinal() || $class_storage->final; + } + + $allow_native_type = !$docblock_only + && $codebase->php_major_version >= 7 + && ( + $codebase->allow_backwards_incompatible_changes + || $is_final + || !$function instanceof PhpParser\Node\Stmt\ClassMethod + ); + + $manipulator->setReturnType( + $allow_native_type + ? (string) $inferred_return_type->toPhpString( + $source->getNamespace(), + $source->getAliasedClassesFlipped(), + $source->getFQCLN(), + $codebase->php_major_version, + $codebase->php_minor_version + ) : null, + $inferred_return_type->toNamespacedString( + $source->getNamespace(), + $source->getAliasedClassesFlipped(), + $source->getFQCLN(), + false + ), + $inferred_return_type->toNamespacedString( + $source->getNamespace(), + $source->getAliasedClassesFlipped(), + $source->getFQCLN(), + true + ), + $inferred_return_type->canBeFullyExpressedInPhp($codebase->php_major_version, $codebase->php_minor_version), + $function_like_storage->return_type_description ?? null + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php new file mode 100644 index 00000000..f0ab1bc8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php @@ -0,0 +1,384 @@ + $stmts + * @param list $yield_types + * + * @return list a list of return types + * + * @psalm-suppress ComplexMethod to be refactored + * + * TODO: This would probably benefit from using the list of exit_functions + */ + public static function getReturnTypes( + Codebase $codebase, + NodeDataProvider $nodes, + array $stmts, + array &$yield_types, + bool $collapse_types = false + ): array { + $return_types = []; + + foreach ($stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\Return_) { + if (!$stmt->expr) { + $return_types[] = Type::getVoid(); + } elseif ($stmt_type = $nodes->getType($stmt)) { + $return_types[] = $stmt_type; + + $yield_types = array_merge($yield_types, self::getYieldTypeFromExpression($stmt->expr, $nodes)); + } elseif ($stmt->expr instanceof PhpParser\Node\Scalar\String_) { + $return_types[] = Type::getString(); + } elseif ($stmt->expr instanceof PhpParser\Node\Scalar\LNumber) { + $return_types[] = Type::getInt(); + } elseif ($stmt->expr instanceof PhpParser\Node\Expr\ConstFetch) { + if ((string)$stmt->expr->name === 'true') { + $return_types[] = Type::getTrue(); + } elseif ((string)$stmt->expr->name === 'false') { + $return_types[] = Type::getFalse(); + } elseif ((string)$stmt->expr->name === 'null') { + $return_types[] = Type::getNull(); + } + } else { + $return_types[] = Type::getMixed(); + } + + break; + } + + if ($stmt instanceof PhpParser\Node\Stmt\Break_ + || $stmt instanceof PhpParser\Node\Stmt\Continue_ + ) { + break; + } + + if ($stmt instanceof PhpParser\Node\Stmt\Throw_) { + if ($collapse_types) { + $return_types[] = Type::getNever(); + } + + break; + } + + if ($stmt instanceof PhpParser\Node\Stmt\Expression) { + if ($stmt->expr instanceof PhpParser\Node\Expr\Exit_) { + if ($collapse_types) { + $return_types[] = Type::getNever(); + } + + break; + } + + if ($stmt->expr instanceof PhpParser\Node\Expr\Assign) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + [$stmt->expr->expr], + $yield_types + ) + ); + } + + $yield_types = array_merge($yield_types, self::getYieldTypeFromExpression($stmt->expr, $nodes)); + } elseif ($stmt instanceof PhpParser\Node\Stmt\If_) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $stmt->stmts, + $yield_types + ) + ); + + foreach ($stmt->elseifs as $elseif) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $elseif->stmts, + $yield_types + ) + ); + } + + if ($stmt->else) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $stmt->else->stmts, + $yield_types + ) + ); + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\TryCatch) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $stmt->stmts, + $yield_types + ) + ); + + foreach ($stmt->catches as $catch) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $catch->stmts, + $yield_types + ) + ); + } + + if ($stmt->finally) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $stmt->finally->stmts, + $yield_types + ) + ); + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\For_) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $stmt->stmts, + $yield_types + ) + ); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Foreach_) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $stmt->stmts, + $yield_types + ) + ); + } elseif ($stmt instanceof PhpParser\Node\Stmt\While_) { + $yield_types = array_merge($yield_types, self::getYieldTypeFromExpression($stmt->cond, $nodes)); + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $stmt->stmts, + $yield_types + ) + ); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Do_) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $stmt->stmts, + $yield_types + ) + ); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Switch_) { + foreach ($stmt->cases as $case) { + $return_types = array_merge( + $return_types, + self::getReturnTypes( + $codebase, + $nodes, + $case->stmts, + $yield_types + ) + ); + } + } + } + + // if we're at the top level and we're not ending in a return, make sure to add possible null + if ($collapse_types) { + // if it's a generator, boil everything down to a single generator return type + if ($yield_types) { + $yield_types = self::processYieldTypes($codebase, $return_types, $yield_types); + } + } + + return $return_types; + } + + /** + * @param list $return_types + * @param non-empty-list $yield_types + * @return non-empty-list + */ + private static function processYieldTypes( + Codebase $codebase, + array $return_types, + array $yield_types + ): array { + $key_type = null; + $value_type = null; + + $yield_type = Type::combineUnionTypeArray($yield_types, null); + + foreach ($yield_type->getAtomicTypes() as $type) { + if ($type instanceof TKeyedArray) { + $type = $type->getGenericArrayType(); + } + + if ($type instanceof TList) { + $type = new TArray([Type::getInt(), $type->type_param]); + } + + if ($type instanceof TArray) { + [$key_type_param, $value_type_param] = $type->type_params; + + $key_type = Type::combineUnionTypes(clone $key_type_param, $key_type); + $value_type = Type::combineUnionTypes(clone $value_type_param, $value_type); + } elseif ($type instanceof TIterable + || $type instanceof TNamedObject + ) { + ForeachAnalyzer::getKeyValueParamsForTraversableObject( + $type, + $codebase, + $key_type, + $value_type + ); + } + } + + return [ + new Union([ + new TGenericObject( + 'Generator', + [ + $key_type ?? Type::getMixed(), + $value_type ?? Type::getMixed(), + Type::getMixed(), + $return_types ? Type::combineUnionTypeArray($return_types, null) : Type::getVoid() + ] + ), + ]) + ]; + } + + /** + * @return list + */ + protected static function getYieldTypeFromExpression( + PhpParser\Node\Expr $stmt, + NodeDataProvider $nodes + ): array { + if ($stmt instanceof PhpParser\Node\Expr\Yield_) { + $key_type = null; + + if ($stmt->key && ($stmt_key_type = $nodes->getType($stmt->key))) { + $key_type = $stmt_key_type; + } + + if ($stmt->value + && $value_type = $nodes->getType($stmt->value) + ) { + $generator_type = new TGenericObject( + 'Generator', + [ + $key_type ? clone $key_type : Type::getInt(), + clone $value_type, + Type::getMixed(), + Type::getMixed() + ] + ); + + return [new Union([$generator_type])]; + } + + return [Type::getMixed()]; + } + + if ($stmt instanceof PhpParser\Node\Expr\YieldFrom) { + if ($stmt_expr_type = $nodes->getType($stmt->expr)) { + return [$stmt_expr_type]; + } + + return [Type::getMixed()]; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) { + return array_merge( + self::getYieldTypeFromExpression($stmt->left, $nodes), + self::getYieldTypeFromExpression($stmt->right, $nodes) + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\Assign) { + return self::getYieldTypeFromExpression($stmt->expr, $nodes); + } + + if ($stmt instanceof PhpParser\Node\Expr\MethodCall + || $stmt instanceof PhpParser\Node\Expr\FuncCall + || $stmt instanceof PhpParser\Node\Expr\StaticCall + || $stmt instanceof PhpParser\Node\Expr\New_ + ) { + if ($stmt->isFirstClassCallable()) { + return []; + } + + $yield_types = []; + + foreach ($stmt->getArgs() as $arg) { + $yield_types = array_merge($yield_types, self::getYieldTypeFromExpression($arg->value, $nodes)); + } + + return $yield_types; + } + + if ($stmt instanceof PhpParser\Node\Expr\Array_) { + $yield_types = []; + + foreach ($stmt->items as $item) { + if ($item instanceof PhpParser\Node\Expr\ArrayItem) { + $yield_types = array_merge($yield_types, self::getYieldTypeFromExpression($item->value, $nodes)); + } + } + + return $yield_types; + } + + return []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php new file mode 100644 index 00000000..385a954c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php @@ -0,0 +1,2023 @@ + + */ + protected $suppressed_issues; + + /** + * @var bool + */ + protected $is_static = false; + + /** + * @var ?array + */ + protected $return_vars_in_scope = []; + + /** + * @var ?array + */ + protected $return_vars_possibly_in_scope = []; + + /** + * @var Union|null + */ + private $local_return_type; + + /** + * @var array + */ + protected static $no_effects_hashes = []; + + /** + * @var bool + */ + public $track_mutations = false; + + /** + * @var bool + */ + public $inferred_impure = false; + + /** + * @var bool + */ + public $inferred_has_mutation = false; + + /** + * Holds param nodes for functions with func_get_args calls + * + * @var array + */ + public $param_nodes = []; + + /** + * @var FunctionLikeStorage + */ + protected $storage; + + /** + * @param TFunction $function + */ + public function __construct($function, SourceAnalyzer $source, FunctionLikeStorage $storage) + { + $this->function = $function; + $this->source = $source; + $this->suppressed_issues = $source->getSuppressedIssues(); + $this->codebase = $source->getCodebase(); + $this->storage = $storage; + } + + /** + * @param bool $add_mutations whether or not to add mutations to this method + * + * @return false|null + * + * @psalm-suppress PossiblyUnusedReturnValue unused but seems important + */ + public function analyze( + Context $context, + NodeDataProvider $type_provider, + ?Context $global_context = null, + bool $add_mutations = false + ): ?bool { + $storage = $this->storage; + + $function_stmts = $this->function->getStmts() ?: []; + + if ($this->function instanceof ArrowFunction + && isset($function_stmts[0]) + && $function_stmts[0] instanceof PhpParser\Node\Stmt\Return_ + && $function_stmts[0]->expr + ) { + $function_stmts[0]->setAttributes($function_stmts[0]->expr->getAttributes()); + } + + if ($global_context) { + foreach ($global_context->constants as $const_name => $var_type) { + if (!$context->hasVariable($const_name)) { + $context->vars_in_scope[$const_name] = clone $var_type; + } + } + } + + $codebase = $this->codebase; + $project_analyzer = $this->getProjectAnalyzer(); + + if ($codebase->track_unused_suppressions && !isset($storage->suppressed_issues[0])) { + if (count($storage->suppressed_issues) === 1 // UnusedPsalmSuppress by itself should be marked as unused + || !in_array("UnusedPsalmSuppress", $storage->suppressed_issues) + ) { + foreach ($storage->suppressed_issues as $offset => $issue_name) { + IssueBuffer::addUnusedSuppression($this->getFilePath(), $offset, $issue_name); + } + } + } + + foreach ($storage->docblock_issues as $docblock_issue) { + IssueBuffer::maybeAdd($docblock_issue); + } + + $function_information = $this->getFunctionInformation( + $context, + $codebase, + $type_provider, + $storage, + $add_mutations + ); + + if ($function_information === null) { + return null; + } + + [ + $real_method_id, + $method_id, + $appearing_class_storage, + $hash, + $cased_method_id, + $overridden_method_ids + ] = $function_information; + + $this->suppressed_issues = $this->getSource()->getSuppressedIssues() + $storage->suppressed_issues; + if ($appearing_class_storage) { + $this->suppressed_issues += $appearing_class_storage->suppressed_issues; + } + + if ($storage instanceof MethodStorage && $storage->is_static) { + $this->is_static = true; + } + + $statements_analyzer = new StatementsAnalyzer($this, $type_provider); + + if ($this instanceof ClosureAnalyzer && $this->function instanceof Closure) { + $byref_uses = []; + + foreach ($this->function->uses as $use) { + if (!is_string($use->var->name)) { + continue; + } + + $use_var_id = '$' . $use->var->name; + + $use_location = new CodeLocation($this, $use); + + $use_assignment = null; + + if ($statements_analyzer->data_flow_graph) { + $use_assignment = DataFlowNode::getForAssignment( + $use_var_id, + $use_location + ); + + $statements_analyzer->data_flow_graph->addNode($use_assignment); + + $context->vars_in_scope[$use_var_id]->parent_nodes += [$use_assignment->id => $use_assignment]; + } + + if ($use->byRef) { + $byref_uses[$use_var_id] = true; + + if ($statements_analyzer->data_flow_graph && $use_assignment) { + $statements_analyzer->data_flow_graph->addPath( + $use_assignment, + new DataFlowNode('closure-use', 'closure use', null), + 'closure-use' + ); + } + } else { + $statements_analyzer->registerVariable($use_var_id, $use_location, null); + } + } + + $statements_analyzer->setByRefUses($byref_uses); + } + + if ($storage->template_types) { + foreach ($storage->template_types as $param_name => $_) { + $fq_classlike_name = Type::getFQCLNFromString( + $param_name, + $this->getAliases() + ); + + if ($codebase->classOrInterfaceExists($fq_classlike_name)) { + IssueBuffer::maybeAdd( + new ReservedWord( + 'Cannot use ' . $param_name . ' as template name since the class already exists', + new CodeLocation($this, $this->function), + 'resource' + ), + $this->getSuppressedIssues() + ); + } + } + } + + $template_types = $storage->template_types; + + if ($appearing_class_storage && $appearing_class_storage->template_types) { + $template_types = array_merge($template_types ?: [], $appearing_class_storage->template_types); + } + + $params = $storage->params; + + if ($codebase->alter_code) { + $this->alterParams($codebase, $storage, $params, $context); + } + + foreach ($codebase->methods_to_rename as $original_method_id => $new_method_name) { + if ($this instanceof MethodAnalyzer + && strtolower((string) $this->getMethodId()) === $original_method_id + ) { + $file_manipulations = [ + new FileManipulation( + (int) $this->function->name->getAttribute('startFilePos'), + (int) $this->function->name->getAttribute('endFilePos') + 1, + $new_method_name + ) + ]; + + FileManipulationBuffer::add( + $this->getFilePath(), + $file_manipulations + ); + } + } + + if ($storage instanceof MethodStorage + && $method_id instanceof MethodIdentifier + && $overridden_method_ids + ) { + $params = $codebase->methods->getMethodParams( + $method_id, + $this + ); + } + + $check_stmts = $this->processParams( + $statements_analyzer, + $storage, + $cased_method_id, + $params, + array_values($this->function->params), + $context, + (bool) $template_types + ); + + if ($storage->pure) { + $context->pure = true; + } + + if ($storage->mutation_free + && $cased_method_id + && !strpos($cased_method_id, '__construct') + && !($storage instanceof MethodStorage && $storage->mutation_free_inferred) + ) { + $context->mutation_free = true; + } + + if ($storage instanceof MethodStorage + && $storage->external_mutation_free + && !$storage->mutation_free_inferred + ) { + $context->external_mutation_free = true; + } + + if ($storage->unused_docblock_params) { + foreach ($storage->unused_docblock_params as $param_name => $param_location) { + if (IssueBuffer::accepts( + new InvalidDocblockParamName( + 'Incorrect param name $' . $param_name . ' in docblock for ' . $cased_method_id, + $param_location + ) + )) { + } + } + } + + if ($storage->signature_return_type && $storage->signature_return_type_location) { + [$start, $end] = $storage->signature_return_type_location->getSelectionBounds(); + + $codebase->analyzer->addOffsetReference( + $this->getFilePath(), + $start, + $end, + (string) $storage->signature_return_type + ); + } + + if ($storage instanceof MethodStorage && $storage->location && !$storage->allow_named_arg_calls) { + foreach ($overridden_method_ids as $overridden_method_id) { + $overridden_storage = $codebase->methods->getStorage($overridden_method_id); + if ($overridden_storage->allow_named_arg_calls) { + IssueBuffer::maybeAdd(new MethodSignatureMismatch( + 'Method ' . (string) $method_id . ' should accept named arguments ' + . ' as ' . (string) $overridden_method_id . ' does', + $storage->location + )); + } + } + } + + if (ReturnTypeAnalyzer::checkReturnType( + $this->function, + $project_analyzer, + $this, + $storage, + $context + ) === false) { + $check_stmts = false; + } + + if (!$check_stmts) { + return false; + } + + if ($context->collect_initializations || $context->collect_mutations) { + $statements_analyzer->addSuppressedIssues([ + 'DocblockTypeContradiction', + 'InvalidReturnStatement', + 'RedundantCondition', + 'RedundantConditionGivenDocblockType', + 'TypeDoesNotContainNull', + 'TypeDoesNotContainType', + 'LoopInvalidation', + ]); + + if ($context->collect_initializations) { + $statements_analyzer->addSuppressedIssues([ + 'UndefinedInterfaceMethod', + 'UndefinedMethod', + 'PossiblyUndefinedMethod', + ]); + } + } elseif ($cased_method_id && strpos($cased_method_id, '__destruct')) { + $statements_analyzer->addSuppressedIssues([ + 'InvalidPropertyAssignmentValue', + 'PossiblyNullPropertyAssignmentValue', + ]); + } + + $time = microtime(true); + + $project_analyzer = $statements_analyzer->getProjectAnalyzer(); + + if ($codebase->alter_code + && (isset($project_analyzer->getIssuesToFix()['MissingPureAnnotation']) + || isset($project_analyzer->getIssuesToFix()['MissingImmutableAnnotation'])) + ) { + $this->track_mutations = true; + } elseif ($this->function instanceof Closure + || $this->function instanceof ArrowFunction + ) { + $this->track_mutations = true; + } + + if ($this->function instanceof ArrowFunction && $storage->return_type && $storage->return_type->isNever()) { + // ArrowFunction perform a return implicitly so if the return type is never, we have to suppress the error + // note: the never can only come from phpdoc. PHP will refuse short closures with never in signature + $statements_analyzer->addSuppressedIssues(['NoValue']); + } + + $statements_analyzer->analyze($function_stmts, $context, $global_context, true); + + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['MissingPureAnnotation']) + && !$this->inferred_impure + && ($this->function instanceof Function_ + || $this->function instanceof ClassMethod) + && $storage->params + && !$overridden_method_ids + ) { + $manipulator = FunctionDocblockManipulator::getForFunction( + $project_analyzer, + $this->source->getFilePath(), + $this->function + ); + + $yield_types = []; + + $inferred_return_types = ReturnTypeCollector::getReturnTypes( + $codebase, + $type_provider, + $function_stmts, + $yield_types, + true + ); + + $inferred_return_type = $inferred_return_types + ? Type::combineUnionTypeArray( + $inferred_return_types, + $codebase + ) + : Type::getVoid(); + + if (!$inferred_return_type->isVoid() + && !$inferred_return_type->isFalse() + && !$inferred_return_type->isNull() + && !$inferred_return_type->isSingleIntLiteral() + && !$inferred_return_type->isSingleStringLiteral() + && !$inferred_return_type->isTrue() + && $inferred_return_type->getId() !== 'array' + ) { + $manipulator->makePure(); + } + } + + if ($this->inferred_has_mutation && $context->self) { + $this->codebase->analyzer->addMutableClass($context->self); + } + + if (!$context->collect_initializations + && !$context->collect_mutations + && $project_analyzer->debug_performance + && $cased_method_id + ) { + $traverser = new PhpParser\NodeTraverser; + + $node_counter = new NodeCounterVisitor(); + $traverser->addVisitor($node_counter); + $traverser->traverse($function_stmts); + + if ($node_counter->count > 5) { + $time_taken = microtime(true) - $time; + $codebase->analyzer->addFunctionTiming($cased_method_id, $time_taken / $node_counter->count); + } + } + + $final_actions = ScopeAnalyzer::getControlActions( + $this->function->getStmts() ?: [], + null, + $codebase->config->exit_functions, + [] + ); + + if ($final_actions !== [ScopeAnalyzer::ACTION_END]) { + $this->examineParamTypes($statements_analyzer, $context, $codebase); + } + + foreach ($params as $function_param) { + // only complain if there's no type defined by a parent type + if (!$function_param->type + && $function_param->location + ) { + if ($this->function instanceof Closure + || $this->function instanceof ArrowFunction + ) { + IssueBuffer::maybeAdd( + new MissingClosureParamType( + 'Parameter $' . $function_param->name . ' has no provided type', + $function_param->location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new MissingParamType( + 'Parameter $' . $function_param->name . ' has no provided type', + $function_param->location + ), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + } + } + + if ($this->function instanceof Closure + || $this->function instanceof ArrowFunction + ) { + $this->verifyReturnType( + $function_stmts, + $statements_analyzer, + $storage->return_type, + $this->source->getFQCLN(), + $storage->return_type_location, + $context->has_returned, + $global_context && ($global_context->inside_call || $global_context->inside_return) + ); + + $closure_yield_types = []; + + $closure_return_types = ReturnTypeCollector::getReturnTypes( + $codebase, + $type_provider, + $function_stmts, + $closure_yield_types, + true + ); + + $closure_return_type = $closure_return_types + ? Type::combineUnionTypeArray( + $closure_return_types, + $codebase + ) + : Type::getVoid(); + + $closure_yield_type = $closure_yield_types + ? Type::combineUnionTypeArray( + $closure_yield_types, + $codebase + ) + : null; + + if ($closure_yield_type) { + $closure_return_type = $closure_yield_type; + } + + if ($function_type = $statements_analyzer->node_data->getType($this->function)) { + /** + * @var TClosure + */ + $closure_atomic = $function_type->getSingleAtomic(); + + if (($storage->return_type === $storage->signature_return_type) + && (!$storage->return_type + || $storage->return_type->hasMixed() + || UnionTypeComparator::isContainedBy( + $codebase, + $closure_return_type, + $storage->return_type + )) + ) { + $closure_atomic->return_type = $closure_return_type; + } + + $closure_atomic->is_pure = !$this->inferred_impure; + } + } + + if ($codebase->collect_references + && !$context->collect_initializations + && !$context->collect_mutations + && $codebase->find_unused_variables + && $context->check_variables + ) { + $this->checkParamReferences( + $statements_analyzer, + $storage, + $appearing_class_storage, + $context + ); + } + + foreach ($storage->throws as $expected_exception => $_) { + if (($expected_exception === 'self' + || $expected_exception === 'static') + && $context->self + ) { + $expected_exception = $context->self; + } + + if (isset($storage->throw_locations[$expected_exception])) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $expected_exception, + $storage->throw_locations[$expected_exception], + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions( + false, + false, + true, + true, + true + ) + )) { + $input_type = new Union([new TNamedObject($expected_exception)]); + $container_type = new Union([new TNamedObject('Exception'), new TNamedObject('Throwable')]); + + if (!UnionTypeComparator::isContainedBy($codebase, $input_type, $container_type)) { + IssueBuffer::maybeAdd( + new InvalidThrow( + 'Class supplied for @throws ' . $expected_exception + . ' does not implement Throwable', + $storage->throw_locations[$expected_exception], + $expected_exception + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($codebase->alter_code) { + $codebase->classlikes->handleDocblockTypeInMigration( + $codebase, + $this, + $input_type, + $storage->throw_locations[$expected_exception], + $context->calling_method_id + ); + } + } + } + } + + $missingThrowsDocblockErrors = []; + foreach ($statements_analyzer->getUncaughtThrows($context) as $possibly_thrown_exception => $codelocations) { + $is_expected = false; + + foreach ($storage->throws as $expected_exception => $_) { + if ($expected_exception === $possibly_thrown_exception + || $codebase->classExtendsOrImplements($possibly_thrown_exception, $expected_exception) + ) { + $is_expected = true; + break; + } + } + + if (!$is_expected) { + $missingThrowsDocblockErrors[] = $possibly_thrown_exception; + foreach ($codelocations as $codelocation) { + // issues are suppressed in ThrowAnalyzer, CallAnalyzer, etc. + IssueBuffer::maybeAdd( + new MissingThrowsDocblock( + $possibly_thrown_exception . ' is thrown but not caught - please either catch' + . ' or add a @throws annotation', + $codelocation + ) + ); + } + } + } + + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['MissingThrowsDocblock']) + ) { + $manipulator = FunctionDocblockManipulator::getForFunction( + $project_analyzer, + $this->source->getFilePath(), + $this->function + ); + $manipulator->addThrowsDocblock($missingThrowsDocblockErrors); + } + + if ($codebase->taint_flow_graph + && $this->function instanceof ClassMethod + && $cased_method_id + && $storage->specialize_call + && isset($context->vars_in_scope['$this']) + && $context->vars_in_scope['$this']->parent_nodes + ) { + $method_source = DataFlowNode::getForMethodReturn( + (string) $method_id, + $cased_method_id, + $storage->location + ); + + $codebase->taint_flow_graph->addNode($method_source); + + foreach ($context->vars_in_scope['$this']->parent_nodes as $parent_node) { + $codebase->taint_flow_graph->addPath( + $parent_node, + $method_source, + '$this' + ); + } + } + + if ($add_mutations) { + if ($this->return_vars_in_scope !== null) { + $context->vars_in_scope = TypeAnalyzer::combineKeyedTypes( + $context->vars_in_scope, + $this->return_vars_in_scope + ); + } + + if ($this->return_vars_possibly_in_scope !== null) { + $context->vars_possibly_in_scope = array_merge( + $context->vars_possibly_in_scope, + $this->return_vars_possibly_in_scope + ); + } + + foreach ($context->vars_in_scope as $var => $_) { + if (strpos($var, '$this->') !== 0 && $var !== '$this') { + unset($context->vars_in_scope[$var]); + } + } + + foreach ($context->vars_possibly_in_scope as $var => $_) { + if (strpos($var, '$this->') !== 0 && $var !== '$this') { + unset($context->vars_possibly_in_scope[$var]); + } + } + + if ($hash + && $real_method_id + && $this instanceof MethodAnalyzer + && !$context->collect_initializations + ) { + $new_hash = md5($real_method_id . '::' . $context->getScopeSummary()); + + if ($new_hash === $hash) { + self::$no_effects_hashes[$hash] = true; + } + } + } + + $event = new AfterFunctionLikeAnalysisEvent( + $this->function, + $storage, + $this, + $codebase, + [], + $type_provider, + $context + ); + + if ($codebase->config->eventDispatcher->dispatchAfterFunctionLikeAnalysis($event) === false) { + return false; + } + + $file_manipulations = $event->getFileReplacements(); + + if ($file_manipulations) { + FileManipulationBuffer::add( + $this->getFilePath(), + $file_manipulations + ); + } + + AttributesAnalyzer::analyze( + $this, + $context, + $storage, + $this->function->attrGroups, + $storage instanceof MethodStorage ? AttributesAnalyzer::TARGET_METHOD : AttributesAnalyzer::TARGET_FUNCTION, + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + + return null; + } + + private function checkParamReferences( + StatementsAnalyzer $statements_analyzer, + FunctionLikeStorage $storage, + ?ClassLikeStorage $class_storage, + Context $context + ): void { + $codebase = $statements_analyzer->getCodebase(); + + $unused_params = []; + + foreach ($statements_analyzer->getUnusedVarLocations() as [$var_name, $original_location]) { + if (!array_key_exists(substr($var_name, 1), $storage->param_lookup)) { + continue; + } + + if (strpos($var_name, '$_') === 0 || (strpos($var_name, '$unused') === 0 && $var_name !== '$unused')) { + continue; + } + + $position = array_search(substr($var_name, 1), array_keys($storage->param_lookup), true); + + if ($position === false) { + throw new UnexpectedValueException('$position should not be false here'); + } + + if ($storage->params[$position]->by_ref) { + continue; + } + + if ($storage->params[$position]->promoted_property) { + continue; + } + + $did_match_param = false; + + foreach ($this->function->params as $param) { + if ($param->var->getAttribute('endFilePos') === $original_location->raw_file_end) { + $did_match_param = true; + break; + } + } + + if (!$did_match_param) { + continue; + } + + $assignment_node = DataFlowNode::getForAssignment($var_name, $original_location); + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + && $statements_analyzer->data_flow_graph->isVariableUsed($assignment_node) + ) { + continue; + } + + if (!$storage instanceof MethodStorage + || !$storage->cased_name + || $storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE + ) { + if ($this instanceof ClosureAnalyzer) { + IssueBuffer::maybeAdd( + new UnusedClosureParam( + 'Param ' . $var_name . ' is never referenced in this method', + $original_location + ), + $this->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new UnusedParam( + 'Param ' . $var_name . ' is never referenced in this method', + $original_location + ), + $this->getSuppressedIssues() + ); + } + } else { + $fq_class_name = (string)$context->self; + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $method_name_lc = strtolower($storage->cased_name); + + if ($storage->abstract) { + continue; + } + + if (isset($class_storage->overridden_method_ids[$method_name_lc])) { + $parent_method_id = end($class_storage->overridden_method_ids[$method_name_lc]); + + if ($parent_method_id) { + $parent_method_storage = $codebase->methods->getStorage($parent_method_id); + + // if the parent method has a param at that position and isn't abstract + if (!$parent_method_storage->abstract + && isset($parent_method_storage->params[$position]) + ) { + continue; + } + } + } + + $unused_params[$position] = $original_location; + } + } + + if ($storage instanceof MethodStorage + && $this instanceof MethodAnalyzer + && $class_storage + && $storage->cased_name + && $storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PRIVATE + ) { + $method_id_lc = strtolower((string) $this->getMethodId()); + + foreach ($storage->params as $i => $_) { + if (!isset($unused_params[$i])) { + $codebase->file_reference_provider->addMethodParamUse( + $method_id_lc, + $i, + $method_id_lc + ); + + $method_name_lc = strtolower($storage->cased_name); + + if (!isset($class_storage->overridden_method_ids[$method_name_lc])) { + continue; + } + + foreach ($class_storage->overridden_method_ids[$method_name_lc] as $parent_method_id) { + $codebase->file_reference_provider->addMethodParamUse( + strtolower((string) $parent_method_id), + $i, + $method_id_lc + ); + } + } + } + } + } + + /** + * @param list $params + * @param list $param_stmts + */ + private function processParams( + StatementsAnalyzer $statements_analyzer, + FunctionLikeStorage $storage, + ?string $cased_method_id, + array $params, + array $param_stmts, + Context $context, + bool $has_template_types + ): bool { + $check_stmts = true; + $codebase = $statements_analyzer->getCodebase(); + $project_analyzer = $statements_analyzer->getProjectAnalyzer(); + + foreach ($params as $offset => $function_param) { + $signature_type = $function_param->signature_type; + $signature_type_location = $function_param->signature_type_location; + + if ($signature_type && $signature_type_location && $signature_type->hasObjectType()) { + $referenced_type = $signature_type; + if ($referenced_type->isNullable()) { + $referenced_type = clone $referenced_type; + $referenced_type->removeType('null'); + } + [$start, $end] = $signature_type_location->getSelectionBounds(); + $codebase->analyzer->addOffsetReference( + $this->getFilePath(), + $start, + $end, + (string) $referenced_type + ); + } + + if ($signature_type) { + $signature_type = TypeExpander::expandUnion( + $codebase, + $signature_type, + $context->self, + $context->self, + $this->getParentFQCLN() + ); + } + + if ($function_param->type) { + $param_type = clone $function_param->type; + + $param_type = TypeExpander::expandUnion( + $codebase, + $param_type, + $context->self, + $context->self, + $this->getParentFQCLN(), + true, + false, + false, + true + ); + + if ($function_param->type_location) { + if ($param_type->check( + $this, + $function_param->type_location, + $storage->suppressed_issues, + [], + false, + false, + $this->function instanceof ClassMethod + && strtolower($this->function->name->name) !== '__construct', + $context->calling_method_id + ) === false) { + $check_stmts = false; + } + } + } else { + $param_type = Type::getMixed(); + } + + $var_type = $param_type; + + if ($function_param->is_variadic) { + if ($storage->allow_named_arg_calls) { + $var_type = new Union([ + new TArray([Type::getArrayKey(), $param_type]), + ]); + } else { + $var_type = new Union([ + new TList($param_type), + ]); + } + } + + if ($statements_analyzer->data_flow_graph + && $function_param->location + ) { + //don't add to taint flow graph if the type can't transmit taints + if (!$statements_analyzer->data_flow_graph instanceof TaintFlowGraph + || $function_param->type === null + || !$function_param->type->isSingle() + || (!$function_param->type->isInt() + && !$function_param->type->isFloat() + && !$function_param->type->isBool()) + ) { + $param_assignment = DataFlowNode::getForAssignment( + '$' . $function_param->name, + $function_param->location + ); + + $statements_analyzer->data_flow_graph->addNode($param_assignment); + + if ($cased_method_id) { + $type_source = DataFlowNode::getForMethodArgument( + $cased_method_id, + $cased_method_id, + $offset, + $function_param->location, + null + ); + + $statements_analyzer->data_flow_graph->addPath($type_source, $param_assignment, 'param'); + } + + if ($function_param->by_ref + && $codebase->find_unused_variables + ) { + $statements_analyzer->data_flow_graph->addPath( + $param_assignment, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use' + ); + } + + if ($storage->variadic) { + $this->param_nodes += [$param_assignment->id => $param_assignment]; + } + + $var_type->parent_nodes += [$param_assignment->id => $param_assignment]; + } + } + + $context->vars_in_scope['$' . $function_param->name] = $var_type; + $context->vars_possibly_in_scope['$' . $function_param->name] = true; + + if ($function_param->by_ref) { + $context->vars_in_scope['$' . $function_param->name]->by_ref = true; + } + + $parser_param = $this->function->getParams()[$offset] ?? null; + + if ($function_param->location) { + $statements_analyzer->registerVariable( + '$' . $function_param->name, + $function_param->location, + null + ); + } + + if (!$function_param->type_location || !$function_param->location) { + if ($parser_param && $parser_param->default) { + ExpressionAnalyzer::analyze($statements_analyzer, $parser_param->default, $context); + } + + continue; + } + + if ($signature_type) { + $union_comparison_result = new TypeComparisonResult(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $param_type, + $signature_type, + false, + false, + $union_comparison_result + ) && !$union_comparison_result->type_coerced_from_mixed + ) { + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['MismatchingDocblockParamType']) + ) { + $this->addOrUpdateParamType($project_analyzer, $function_param->name, $signature_type, true); + + continue; + } + + IssueBuffer::maybeAdd( + new MismatchingDocblockParamType( + 'Parameter $' . $function_param->name . ' has wrong type \'' . $param_type . + '\', should be \'' . $signature_type . '\'', + $function_param->type_location + ), + $storage->suppressed_issues, + true + ); + + if ($signature_type->check( + $this, + $function_param->type_location, + $storage->suppressed_issues, + [], + false + ) === false) { + $check_stmts = false; + } + + continue; + } + } + + if ($parser_param && $parser_param->default) { + ExpressionAnalyzer::analyze($statements_analyzer, $parser_param->default, $context); + + $default_type = $statements_analyzer->node_data->getType($parser_param->default); + + if ($default_type + && !$default_type->hasMixed() + && !UnionTypeComparator::isContainedBy( + $codebase, + $default_type, + $param_type, + false, + false, + null, + true + ) + ) { + IssueBuffer::maybeAdd( + new InvalidParamDefault( + 'Default value type ' . $default_type->getId() . ' for argument ' . ($offset + 1) + . ' of method ' . $cased_method_id + . ' does not match the given type ' . $param_type->getId(), + $function_param->type_location + ) + ); + } + } + + if ($has_template_types) { + $substituted_type = clone $param_type; + if ($substituted_type->check( + $this->source, + $function_param->type_location, + $this->suppressed_issues, + [], + false + ) === false) { + $check_stmts = false; + } + } else { + if ($param_type->isVoid()) { + IssueBuffer::maybeAdd( + new ReservedWord( + 'Parameter cannot be void', + $function_param->type_location, + 'void' + ), + $this->suppressed_issues + ); + } + + if ($param_type->check( + $this->source, + $function_param->type_location, + $this->suppressed_issues, + [], + false + ) === false) { + $check_stmts = false; + } + } + + if ($codebase->collect_locations) { + if ($function_param->type_location !== $function_param->signature_type_location && + $function_param->signature_type_location && + $function_param->signature_type + ) { + if ($function_param->signature_type->check( + $this->source, + $function_param->signature_type_location, + $this->suppressed_issues, + [], + false + ) === false) { + $check_stmts = false; + } + } + } + + if ($function_param->by_ref) { + // register by ref params as having been used, to avoid false positives + // @todo change the assignment analysis *just* for byref params + // so that we don't have to do this + $context->hasVariable('$' . $function_param->name); + } + + if (count($param_stmts) === count($params)) { + AttributesAnalyzer::analyze( + $this, + $context, + $function_param, + $param_stmts[$offset]->attrGroups, + AttributesAnalyzer::TARGET_PARAMETER + | ($function_param->promoted_property ? AttributesAnalyzer::TARGET_PROPERTY : 0), + $storage->suppressed_issues + $this->getSuppressedIssues() + ); + } + } + + return $check_stmts; + } + + /** + * @param FunctionLikeParameter[] $params + */ + private function alterParams( + Codebase $codebase, + FunctionLikeStorage $storage, + array $params, + Context $context + ): void { + foreach ($this->function->params as $param) { + $param_name_node = null; + + if ($param->type instanceof PhpParser\Node\Name) { + $param_name_node = $param->type; + } elseif ($param->type instanceof PhpParser\Node\NullableType + && $param->type->type instanceof PhpParser\Node\Name + ) { + $param_name_node = $param->type->type; + } + + if ($param_name_node) { + $resolved_name = ClassLikeAnalyzer::getFQCLNFromNameObject($param_name_node, $this->getAliases()); + + $parent_fqcln = $this->getParentFQCLN(); + + if ($resolved_name === 'self' && $context->self) { + $resolved_name = $context->self; + } elseif ($resolved_name === 'parent' && $parent_fqcln) { + $resolved_name = $parent_fqcln; + } + + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $this, + $param_name_node, + $resolved_name, + $context->calling_method_id, + false, + true + ); + } + } + + if ($this->function->returnType) { + $return_name_node = null; + + if ($this->function->returnType instanceof PhpParser\Node\Name) { + $return_name_node = $this->function->returnType; + } elseif ($this->function->returnType instanceof PhpParser\Node\NullableType + && $this->function->returnType->type instanceof PhpParser\Node\Name + ) { + $return_name_node = $this->function->returnType->type; + } + + if ($return_name_node) { + $resolved_name = ClassLikeAnalyzer::getFQCLNFromNameObject($return_name_node, $this->getAliases()); + + $parent_fqcln = $this->getParentFQCLN(); + + if ($resolved_name === 'self' && $context->self) { + $resolved_name = $context->self; + } elseif ($resolved_name === 'parent' && $parent_fqcln) { + $resolved_name = $parent_fqcln; + } + + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $this, + $return_name_node, + $resolved_name, + $context->calling_method_id, + false, + true + ); + } + } + + if ($storage->return_type + && $storage->return_type_location + && $storage->return_type_location !== $storage->signature_return_type_location + ) { + $replace_type = TypeExpander::expandUnion( + $codebase, + $storage->return_type, + $context->self, + 'static', + $this->getParentFQCLN(), + false + ); + + $codebase->classlikes->handleDocblockTypeInMigration( + $codebase, + $this, + $replace_type, + $storage->return_type_location, + $context->calling_method_id + ); + } + + foreach ($params as $function_param) { + if ($function_param->type + && $function_param->type_location + && $function_param->type_location !== $function_param->signature_type_location + && $function_param->type_location->file_path === $this->getFilePath() + ) { + $replace_type = TypeExpander::expandUnion( + $codebase, + $function_param->type, + $context->self, + 'static', + $this->getParentFQCLN(), + false + ); + + $codebase->classlikes->handleDocblockTypeInMigration( + $codebase, + $this, + $replace_type, + $function_param->type_location, + $context->calling_method_id + ); + } + } + } + + /** + * @param array $function_stmts + */ + public function verifyReturnType( + array $function_stmts, + StatementsAnalyzer $statements_analyzer, + ?Union $return_type = null, + ?string $fq_class_name = null, + ?CodeLocation $return_type_location = null, + bool $did_explicitly_return = false, + bool $closure_inside_call = false + ): void { + ReturnTypeAnalyzer::verifyReturnType( + $this->function, + $function_stmts, + $statements_analyzer, + $statements_analyzer->node_data, + $this, + $return_type, + $fq_class_name, + $fq_class_name, + $return_type_location, + [], + $did_explicitly_return, + $closure_inside_call + ); + } + + public function addOrUpdateParamType( + ProjectAnalyzer $project_analyzer, + string $param_name, + Union $inferred_return_type, + bool $docblock_only = false + ): void { + $manipulator = FunctionDocblockManipulator::getForFunction( + $project_analyzer, + $this->source->getFilePath(), + $this->function + ); + + $codebase = $project_analyzer->getCodebase(); + $is_final = true; + $fqcln = $this->source->getFQCLN(); + + if ($fqcln !== null && $this instanceof MethodAnalyzer) { + $class_storage = $codebase->classlike_storage_provider->get($fqcln); + $is_final = $this->function->isFinal() || $class_storage->final; + } + + $allow_native_type = !$docblock_only + && $codebase->php_major_version >= 7 + && ( + $codebase->allow_backwards_incompatible_changes + || $is_final + || !$this instanceof MethodAnalyzer + ); + + $manipulator->setParamType( + $param_name, + $allow_native_type + ? $inferred_return_type->toPhpString( + $this->source->getNamespace(), + $this->source->getAliasedClassesFlipped(), + $this->source->getFQCLN(), + $project_analyzer->getCodebase()->php_major_version, + $project_analyzer->getCodebase()->php_minor_version + ) : null, + $inferred_return_type->toNamespacedString( + $this->source->getNamespace(), + $this->source->getAliasedClassesFlipped(), + $this->source->getFQCLN(), + false + ), + $inferred_return_type->toNamespacedString( + $this->source->getNamespace(), + $this->source->getAliasedClassesFlipped(), + $this->source->getFQCLN(), + true + ) + ); + } + + /** + * Adds return types for the given function + */ + public function addReturnTypes(Context $context): void + { + if ($this->return_vars_in_scope !== null) { + $this->return_vars_in_scope = TypeAnalyzer::combineKeyedTypes( + $context->vars_in_scope, + $this->return_vars_in_scope + ); + } else { + $this->return_vars_in_scope = $context->vars_in_scope; + } + + if ($this->return_vars_possibly_in_scope !== null) { + $this->return_vars_possibly_in_scope = array_merge( + $context->vars_possibly_in_scope, + $this->return_vars_possibly_in_scope + ); + } else { + $this->return_vars_possibly_in_scope = $context->vars_possibly_in_scope; + } + } + + public function examineParamTypes( + StatementsAnalyzer $statements_analyzer, + Context $context, + Codebase $codebase, + PhpParser\Node $stmt = null + ): void { + $storage = $this->getFunctionLikeStorage($statements_analyzer); + + foreach ($storage->params as $param) { + if ($param->by_ref && isset($context->vars_in_scope['$' . $param->name]) && !$param->is_variadic) { + $actual_type = $context->vars_in_scope['$' . $param->name]; + $param_out_type = $param->out_type ?: $param->type; + + if ($param_out_type && !$actual_type->hasMixed() && $param->location) { + if (!UnionTypeComparator::isContainedBy( + $codebase, + $actual_type, + $param_out_type, + $actual_type->ignore_nullable_issues, + $actual_type->ignore_falsable_issues + ) + ) { + IssueBuffer::maybeAdd( + new ReferenceConstraintViolation( + 'Variable ' . '$' . $param->name . ' is limited to values of type ' + . $param_out_type->getId() + . ' because it is passed by reference, ' + . $actual_type->getId() . ' type found. Use @param-out to specify ' + . 'a different output type', + $stmt + ? new CodeLocation($this, $stmt) + : $param->location + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + } + } + + public function getMethodName(): ?string + { + if ($this->function instanceof ClassMethod) { + return (string)$this->function->name; + } + + return null; + } + + public function getCorrectlyCasedMethodId(?string $context_self = null): string + { + if ($this->function instanceof ClassMethod) { + $function_name = (string)$this->function->name; + + return ($context_self ?: $this->source->getFQCLN()) . '::' . $function_name; + } + + if ($this->function instanceof Function_) { + $namespace = $this->source->getNamespace(); + + return ($namespace ? $namespace . '\\' : '') . $this->function->name; + } + + if (!$this instanceof ClosureAnalyzer) { + throw new UnexpectedValueException('This is weird'); + } + + return $this->getClosureId(); + } + + public function getFunctionLikeStorage(?StatementsAnalyzer $statements_analyzer = null): FunctionLikeStorage + { + $codebase = $this->codebase; + + if ($this->function instanceof ClassMethod && $this instanceof MethodAnalyzer) { + $method_id = $this->getMethodId(); + $codebase_methods = $codebase->methods; + + try { + return $codebase_methods->getStorage($method_id); + } catch (UnexpectedValueException $e) { + $declaring_method_id = $codebase_methods->getDeclaringMethodId($method_id); + + if ($declaring_method_id === null) { + throw new UnexpectedValueException('Cannot get storage for function that doesn‘t exist'); + } + + // happens for fake constructors + return $codebase_methods->getStorage($declaring_method_id); + } + } + + if ($this instanceof FunctionAnalyzer) { + $function_id = $this->getFunctionId(); + } elseif ($this instanceof ClosureAnalyzer) { + $function_id = $this->getClosureId(); + } else { + throw new UnexpectedValueException('This is weird'); + } + + return $codebase->functions->getStorage($statements_analyzer, $function_id); + } + + /** @return non-empty-string */ + public function getId(): string + { + if ($this instanceof MethodAnalyzer) { + return (string) $this->getMethodId(); + } + + if ($this instanceof FunctionAnalyzer) { + return $this->getFunctionId(); + } + + if ($this instanceof ClosureAnalyzer) { + return $this->getClosureId(); + } + + throw new UnexpectedValueException('This is weird'); + } + + /** + * @return array + */ + public function getAliasedClassesFlipped(): array + { + if ($this->source instanceof NamespaceAnalyzer || + $this->source instanceof FileAnalyzer || + $this->source instanceof ClassLikeAnalyzer + ) { + return $this->source->getAliasedClassesFlipped(); + } + + return []; + } + + /** + * @return array + */ + public function getAliasedClassesFlippedReplaceable(): array + { + if ($this->source instanceof NamespaceAnalyzer || + $this->source instanceof FileAnalyzer || + $this->source instanceof ClassLikeAnalyzer + ) { + return $this->source->getAliasedClassesFlippedReplaceable(); + } + + return []; + } + + /** + * @return array>|null + */ + public function getTemplateTypeMap(): ?array + { + if ($this->source instanceof ClassLikeAnalyzer) { + return ($this->source->getTemplateTypeMap() ?: []) + + ($this->storage->template_types ?: []); + } + + return $this->storage->template_types; + } + + public function isStatic(): bool + { + return $this->is_static; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * Get a list of suppressed issues + * + * @return array + */ + public function getSuppressedIssues(): array + { + return $this->suppressed_issues; + } + + /** + * @param array $new_issues + */ + public function addSuppressedIssues(array $new_issues): void + { + if (isset($new_issues[0])) { + $new_issues = array_combine($new_issues, $new_issues); + } + + $this->suppressed_issues = $new_issues + $this->suppressed_issues; + } + + /** + * @param array $new_issues + */ + public function removeSuppressedIssues(array $new_issues): void + { + if (isset($new_issues[0])) { + $new_issues = array_combine($new_issues, $new_issues); + } + + $this->suppressed_issues = array_diff_key($this->suppressed_issues, $new_issues); + } + + /** + * Adds a suppressed issue, useful when creating a method checker from scratch + * + */ + public function addSuppressedIssue(string $issue_name): void + { + $this->suppressed_issues[] = $issue_name; + } + + public static function clearCache(): void + { + self::$no_effects_hashes = []; + } + + public function getLocalReturnType(Union $storage_return_type, bool $final = false): Union + { + if ($this->local_return_type) { + return $this->local_return_type; + } + + $this->local_return_type = TypeExpander::expandUnion( + $this->codebase, + $storage_return_type, + $this->getFQCLN(), + $this->getFQCLN(), + $this->getParentFQCLN(), + true, + true, + $final + ); + + return $this->local_return_type; + } + + /** + * @return array{ + * MethodIdentifier|null, + * MethodIdentifier|null, + * ClassLikeStorage|null, + * ?string, + * ?string, + * array + * }|null + */ + private function getFunctionInformation( + Context $context, + Codebase $codebase, + NodeDataProvider $type_provider, + FunctionLikeStorage $storage, + bool $add_mutations + ): ?array { + $classlike_storage_provider = $codebase->classlike_storage_provider; + $real_method_id = null; + $method_id = null; + + $cased_method_id = null; + $hash = null; + $appearing_class_storage = null; + $overridden_method_ids = []; + + if ($this instanceof MethodAnalyzer) { + if (!$storage instanceof MethodStorage) { + throw new UnexpectedValueException('$storage must be MethodStorage'); + } + + $real_method_id = $this->getMethodId(); + + $method_id = $this->getMethodId($context->self); + + $fq_class_name = (string)$context->self; + $appearing_class_storage = $classlike_storage_provider->get($fq_class_name); + + if ($add_mutations) { + if (!$context->collect_initializations) { + $hash = md5($real_method_id . '::' . $context->getScopeSummary()); + + // if we know that the function has no effects on vars, we don't bother rechecking + if (isset(self::$no_effects_hashes[$hash])) { + return null; + } + } + } elseif ($context->self) { + if ($appearing_class_storage->template_types) { + $template_params = []; + + foreach ($appearing_class_storage->template_types as $param_name => $template_map) { + $key = array_keys($template_map)[0]; + + $template_params[] = new Union([ + new TTemplateParam( + $param_name, + reset($template_map), + $key + ) + ]); + } + + $this_object_type = new TGenericObject( + $context->self, + $template_params + ); + } else { + $this_object_type = new TNamedObject($context->self); + } + + $this_object_type->was_static = !$storage->final; + + if ($this->storage instanceof MethodStorage && $this->storage->if_this_is_type) { + $template_result = new TemplateResult($this->getTemplateTypeMap() ?? [], []); + + TemplateStandinTypeReplacer::replace( + new Union([$this_object_type]), + $template_result, + $codebase, + null, + $this->storage->if_this_is_type + ); + + foreach ($context->vars_in_scope as $var_name => $var_type) { + if (0 === mb_strpos($var_name, '$this->')) { + TemplateInferredTypeReplacer::replace($var_type, $template_result, $codebase); + } + } + + $context->vars_in_scope['$this'] = $this->storage->if_this_is_type; + } else { + $context->vars_in_scope['$this'] = new Union([$this_object_type]); + } + + if ($codebase->taint_flow_graph + && $storage->specialize_call + && $storage->location + ) { + $new_parent_node = DataFlowNode::getForAssignment('$this in ' . $method_id, $storage->location); + + $codebase->taint_flow_graph->addNode($new_parent_node); + $context->vars_in_scope['$this']->parent_nodes += [$new_parent_node->id => $new_parent_node]; + } + + if ($storage->external_mutation_free + && !$storage->mutation_free_inferred + ) { + $context->vars_in_scope['$this']->reference_free = true; + + if ($this->function->name->name !== '__construct') { + $context->vars_in_scope['$this']->allow_mutations = false; + } + } + + $context->vars_possibly_in_scope['$this'] = true; + } + + if ($appearing_class_storage->has_visitor_issues) { + return null; + } + + $cased_method_id = $fq_class_name . '::' . $storage->cased_name; + + $overridden_method_ids = $codebase->methods->getOverriddenMethodIds($method_id); + + $codeLocation = new CodeLocation( + $this, + $this->function, + null, + true + ); + + if ($overridden_method_ids + && !$context->collect_initializations + && !$context->collect_mutations + ) { + foreach ($overridden_method_ids as $overridden_method_id) { + $parent_method_storage = $codebase->methods->getStorage($overridden_method_id); + + $overridden_fq_class_name = $overridden_method_id->fq_class_name; + + $parent_storage = $classlike_storage_provider->get($overridden_fq_class_name); + + if ($this->function->name->name === '__construct' + && !$parent_storage->preserve_constructor_signature + ) { + continue; + } + + $implementer_visibility = $storage->visibility; + + $implementer_appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); + $implementer_declaring_method_id = $real_method_id; + + $declaring_class_storage = $appearing_class_storage; + + if ($implementer_appearing_method_id + && $implementer_appearing_method_id !== $implementer_declaring_method_id + ) { + $appearing_fq_class_name = $implementer_appearing_method_id->fq_class_name; + $appearing_method_name = $implementer_appearing_method_id->method_name; + + $declaring_fq_class_name = $implementer_declaring_method_id->fq_class_name; + + $appearing_class_storage = $classlike_storage_provider->get( + $appearing_fq_class_name + ); + + $declaring_class_storage = $classlike_storage_provider->get( + $declaring_fq_class_name + ); + + if (isset($appearing_class_storage->trait_visibility_map[$appearing_method_name])) { + $implementer_visibility + = $appearing_class_storage->trait_visibility_map[$appearing_method_name]; + } + } + + // we've already checked this in the class checker + if (!isset($appearing_class_storage->class_implements[strtolower($overridden_fq_class_name)])) { + MethodComparator::compare( + $codebase, + count($overridden_method_ids) === 1 ? $this->function : null, + $declaring_class_storage, + $parent_storage, + $storage, + $parent_method_storage, + $fq_class_name, + $implementer_visibility, + $codeLocation, + $storage->suppressed_issues + ); + } + } + } + + MethodAnalyzer::checkMethodSignatureMustOmitReturnType($storage, $codeLocation); + + if (!$context->calling_method_id || !$context->collect_initializations) { + $context->calling_method_id = strtolower((string)$method_id); + } + } elseif ($this instanceof FunctionAnalyzer) { + $function_name = $this->function->name->name; + $namespace_prefix = $this->getNamespace(); + $cased_method_id = ($namespace_prefix !== null ? $namespace_prefix . '\\' : '') . $function_name; + $context->calling_function_id = strtolower($cased_method_id); + } elseif ($this instanceof ClosureAnalyzer) { + if ($storage->return_type) { + $closure_return_type = TypeExpander::expandUnion( + $codebase, + $storage->return_type, + $context->self, + $context->self, + $this->getParentFQCLN() + ); + } else { + $closure_return_type = Type::getMixed(); + } + + $closure_type = new TClosure( + 'Closure', + $storage->params, + $closure_return_type + ); + + if ($storage instanceof FunctionStorage) { + $closure_type->byref_uses = $storage->byref_uses; + $closure_type->is_pure = $storage->pure; + } + + $type_provider->setType( + $this->function, + new Union([ + $closure_type, + ]) + ); + } else { + throw new UnexpectedValueException('Impossible'); + } + + return [ + $real_method_id, + $method_id, + $appearing_class_storage, + $hash, + $cased_method_id, + $overridden_method_ids + ]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php new file mode 100644 index 00000000..9c68e2ed --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php @@ -0,0 +1,147 @@ +class instanceof PhpParser\Node\Stmt\Interface_) { + throw new LogicException('Something went badly wrong'); + } + + $project_analyzer = $this->file_analyzer->project_analyzer; + $codebase = $project_analyzer->getCodebase(); + $config = $project_analyzer->getConfig(); + + if ($this->class->extends) { + foreach ($this->class->extends as $extended_interface) { + $extended_interface_name = self::getFQCLNFromNameObject( + $extended_interface, + $this->getAliases() + ); + + $parent_reference_location = new CodeLocation($this, $extended_interface); + + if (!$codebase->classOrInterfaceExists( + $extended_interface_name, + $parent_reference_location + )) { + // we should not normally get here + return; + } + + try { + $extended_interface_storage = $codebase->classlike_storage_provider->get($extended_interface_name); + } catch (InvalidArgumentException $e) { + continue; + } + + if (!$extended_interface_storage->is_interface) { + $code_location = new CodeLocation( + $this, + $extended_interface + ); + + IssueBuffer::maybeAdd( + new UndefinedInterface( + $extended_interface_name . ' is not an interface', + $code_location, + $extended_interface_name + ), + $this->getSuppressedIssues() + ); + } + + if ($codebase->store_node_types && $extended_interface_name) { + $bounds = $parent_reference_location->getSelectionBounds(); + + $codebase->analyzer->addOffsetReference( + $this->getFilePath(), + $bounds[0], + $bounds[1], + $extended_interface_name + ); + } + } + } + + $fq_interface_name = $this->getFQCLN(); + + if (!$fq_interface_name) { + throw new UnexpectedValueException('bad'); + } + + $class_storage = $codebase->classlike_storage_provider->get($fq_interface_name); + $interface_context = new Context($this->getFQCLN()); + + AttributesAnalyzer::analyze( + $this, + $interface_context, + $class_storage, + $this->class->attrGroups, + AttributesAnalyzer::TARGET_CLASS, + $class_storage->suppressed_issues + $this->getSuppressedIssues() + ); + + foreach ($this->class->stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod) { + $method_analyzer = new MethodAnalyzer($stmt, $this); + + $type_provider = new NodeDataProvider(); + + $method_analyzer->analyze($interface_context, $type_provider); + + $actual_method_id = $method_analyzer->getMethodId(); + + if ($stmt->name->name !== '__construct' + && $config->reportIssueInFile('InvalidReturnType', $this->getFilePath()) + ) { + ClassAnalyzer::analyzeClassMethodReturnType( + $stmt, + $method_analyzer, + $this, + $type_provider, + $codebase, + $class_storage, + $fq_interface_name, + $actual_method_id, + $actual_method_id, + false + ); + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Property) { + IssueBuffer::maybeAdd( + new ParseError( + 'Interfaces cannot have properties', + new CodeLocation($this, $stmt) + ) + ); + + return; + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php new file mode 100644 index 00000000..4ab16f26 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php @@ -0,0 +1,175 @@ + + */ + public $taint_trace; + + /** + * @var ?list + */ + public $other_references; + + /** + * @var ?string + * @readonly + */ + public $dupe_key; + + /** + * @param ?list $taint_trace + * @param ?list $other_references + */ + public function __construct( + string $severity, + int $line_from, + int $line_to, + string $type, + string $message, + string $file_name, + string $file_path, + string $snippet, + string $selected_text, + int $from, + int $to, + int $snippet_from, + int $snippet_to, + int $column_from, + int $column_to, + int $shortcode = 0, + int $error_level = -1, + ?array $taint_trace = null, + array $other_references = null, + ?string $dupe_key = null + ) { + $this->severity = $severity; + $this->line_from = $line_from; + $this->line_to = $line_to; + $this->type = $type; + $this->message = $message; + $this->file_name = $file_name; + $this->file_path = $file_path; + $this->snippet = $snippet; + $this->selected_text = $selected_text; + $this->from = $from; + $this->to = $to; + $this->snippet_from = $snippet_from; + $this->snippet_to = $snippet_to; + $this->column_from = $column_from; + $this->column_to = $column_to; + $this->shortcode = $shortcode; + $this->error_level = $error_level; + $this->link = $shortcode ? 'https://psalm.dev/' . str_pad((string) $shortcode, 3, "0", STR_PAD_LEFT) : ''; + $this->taint_trace = $taint_trace; + $this->other_references = $other_references; + $this->dupe_key = $dupe_key; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php new file mode 100644 index 00000000..a3b02c14 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php @@ -0,0 +1,290 @@ + + */ +class MethodAnalyzer extends FunctionLikeAnalyzer +{ + public function __construct( + PhpParser\Node\Stmt\ClassMethod $function, + SourceAnalyzer $source, + ?MethodStorage $storage = null + ) { + $codebase = $source->getCodebase(); + + $method_name_lc = strtolower((string) $function->name); + + $source_fqcln = (string) $source->getFQCLN(); + + $source_fqcln_lc = strtolower($source_fqcln); + + $method_id = new MethodIdentifier($source_fqcln, $method_name_lc); + + if (!$storage) { + try { + $storage = $codebase->methods->getStorage($method_id); + } catch (UnexpectedValueException $e) { + $class_storage = $codebase->classlike_storage_provider->get($source_fqcln_lc); + + if (!$class_storage->parent_classes) { + throw $e; + } + + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if (!$declaring_method_id) { + throw $e; + } + + // happens for fake constructors + $storage = $codebase->methods->getStorage($declaring_method_id); + } + } + + parent::__construct($function, $source, $storage); + } + + /** + * Determines whether a given method is static or not + * @param array $suppressed_issues + */ + public static function checkStatic( + MethodIdentifier $method_id, + bool $self_call, + bool $is_context_dynamic, + Codebase $codebase, + CodeLocation $code_location, + array $suppressed_issues, + ?bool &$is_dynamic_this_method = false + ): bool { + $codebase_methods = $codebase->methods; + + if ($method_id->fq_class_name === 'Closure' + && $method_id->method_name === 'fromcallable' + ) { + return true; + } + + $original_method_id = $method_id; + + $method_id = $codebase_methods->getDeclaringMethodId($method_id); + + if (!$method_id) { + if (InternalCallMapHandler::inCallMap((string) $original_method_id)) { + return true; + } + + throw new LogicException('Declaring method for ' . $original_method_id . ' should not be null'); + } + + $storage = $codebase_methods->getStorage($method_id); + + if (!$storage->is_static) { + if ($self_call) { + if (!$is_context_dynamic) { + if (IssueBuffer::accepts( + new NonStaticSelfCall( + 'Method ' . $codebase_methods->getCasedMethodId($method_id) . + ' is not static, but is called ' . + 'using self::', + $code_location + ), + $suppressed_issues + )) { + return false; + } + } else { + $is_dynamic_this_method = true; + } + } else { + if (IssueBuffer::accepts( + new InvalidStaticInvocation( + 'Method ' . $codebase_methods->getCasedMethodId($method_id) . + ' is not static, but is called ' . + 'statically', + $code_location + ), + $suppressed_issues + )) { + return false; + } + } + } + + return true; + } + + /** + * @param string[] $suppressed_issues + * @param lowercase-string|null $calling_method_id + * + */ + public static function checkMethodExists( + Codebase $codebase, + MethodIdentifier $method_id, + CodeLocation $code_location, + array $suppressed_issues, + ?string $calling_method_id = null + ): ?bool { + if ($codebase->methods->methodExists( + $method_id, + $calling_method_id, + !$calling_method_id + || $calling_method_id !== strtolower((string) $method_id) + ? $code_location + : null, + null, + $code_location->file_path + )) { + return true; + } + + if (IssueBuffer::accepts( + new UndefinedMethod('Method ' . $method_id . ' does not exist', $code_location, (string) $method_id), + $suppressed_issues + )) { + return false; + } + + return null; + } + + public static function isMethodVisible( + MethodIdentifier $method_id, + Context $context, + StatementsSource $source + ): bool { + $codebase = $source->getCodebase(); + + $fq_classlike_name = $method_id->fq_class_name; + $method_name = $method_id->method_name; + + if ($codebase->methods->visibility_provider->has($fq_classlike_name)) { + $method_visible = $codebase->methods->visibility_provider->isMethodVisible( + $source, + $fq_classlike_name, + $method_name, + $context, + null + ); + + if ($method_visible !== null) { + return $method_visible; + } + } + + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if (!$declaring_method_id) { + // this can happen for methods in the callmap that were not reflected + return true; + } + + $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); + + $appearing_method_class = null; + + if ($appearing_method_id) { + $appearing_method_class = $appearing_method_id->fq_class_name; + + // if the calling class is the same, we know the method exists, so it must be visible + if ($appearing_method_class === $context->self) { + return true; + } + } + + $declaring_method_class = $declaring_method_id->fq_class_name; + + if ($source->getSource() instanceof TraitAnalyzer + && strtolower($declaring_method_class) === strtolower((string) $source->getFQCLN()) + ) { + return true; + } + + $storage = $codebase->methods->getStorage($declaring_method_id); + + switch ($storage->visibility) { + case ClassLikeAnalyzer::VISIBILITY_PUBLIC: + return true; + + case ClassLikeAnalyzer::VISIBILITY_PRIVATE: + return $context->self && $appearing_method_class === $context->self; + + case ClassLikeAnalyzer::VISIBILITY_PROTECTED: + if (!$context->self) { + return false; + } + + if ($appearing_method_class + && $codebase->classExtends($appearing_method_class, $context->self) + ) { + return true; + } + + if ($appearing_method_class + && !$codebase->classExtends($context->self, $appearing_method_class) + ) { + return false; + } + } + + return true; + } + + /** + * Check that __clone, __construct, and __destruct do not have a return type + * hint in their signature. + */ + public static function checkMethodSignatureMustOmitReturnType( + MethodStorage $method_storage, + CodeLocation $code_location + ): void { + if ($method_storage->signature_return_type === null) { + return; + } + + $cased_method_name = $method_storage->cased_name; + $methodsOfInterest = ['__clone', '__construct', '__destruct']; + + if (in_array($cased_method_name, $methodsOfInterest)) { + IssueBuffer::maybeAdd( + new MethodSignatureMustOmitReturnType( + 'Method ' . $cased_method_name . ' must not declare a return type', + $code_location + ) + ); + } + } + + public function getMethodId(?string $context_self = null): MethodIdentifier + { + $function_name = (string)$this->function->name; + + return new MethodIdentifier( + $context_self ?: (string) $this->source->getFQCLN(), + strtolower($function_name) + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php new file mode 100644 index 00000000..16ff2d9d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php @@ -0,0 +1,1080 @@ +name, + strtolower($guide_method_storage->cased_name ?: '') + ); + + $implementer_declaring_method_id = $codebase->methods->getDeclaringMethodId( + $implementer_method_id + ); + + $cased_implementer_method_id = $implementer_classlike_storage->name . '::' + . $implementer_method_storage->cased_name; + + $cased_guide_method_id = $guide_classlike_storage->name . '::' . $guide_method_storage->cased_name; + + $codebase->methods->file_reference_provider->addMethodDependencyToClassMember( + strtolower((string)($implementer_declaring_method_id ?? $implementer_method_id)), + strtolower($guide_classlike_storage->name . '::' . $guide_method_storage->cased_name) + ); + + self::checkForObviousMethodMismatches( + $guide_classlike_storage, + $implementer_classlike_storage, + $guide_method_storage, + $implementer_method_storage, + $guide_method_storage->visibility, + $implementer_visibility, + $cased_guide_method_id, + $cased_implementer_method_id, + $prevent_method_signature_mismatch, + $prevent_abstract_override, + $codebase->php_major_version >= 8, + $code_location, + $suppressed_issues + ); + + if ($guide_method_storage->signature_return_type && $prevent_method_signature_mismatch) { + self::compareMethodSignatureReturnTypes( + $codebase, + $guide_classlike_storage, + $implementer_classlike_storage, + $guide_method_storage, + $implementer_method_storage, + $guide_method_storage->signature_return_type, + $cased_guide_method_id, + $implementer_called_class_name, + $cased_implementer_method_id, + $code_location, + $suppressed_issues + ); + } + + if ($guide_method_storage->return_type + && $implementer_method_storage->return_type + && !$implementer_method_storage->inherited_return_type + && ($guide_method_storage->signature_return_type !== $guide_method_storage->return_type + || $implementer_method_storage->signature_return_type !== $implementer_method_storage->return_type) + && $implementer_classlike_storage->user_defined + && (!$guide_classlike_storage->stubbed || $guide_classlike_storage->template_types) + ) { + self::compareMethodDocblockReturnTypes( + $codebase, + $guide_classlike_storage, + $implementer_classlike_storage, + $implementer_method_storage, + $guide_method_storage->return_type, + $implementer_method_storage->return_type, + $cased_guide_method_id, + $implementer_called_class_name, + $implementer_declaring_method_id, + $code_location, + $suppressed_issues + ); + } + + foreach ($guide_method_storage->params as $i => $guide_param) { + if (!isset($implementer_method_storage->params[$i])) { + if (!$prevent_abstract_override && $i >= $guide_method_storage->required_param_count) { + continue; + } + + if (IssueBuffer::accepts( + new MethodSignatureMismatch( + 'Method ' . $cased_implementer_method_id . ' has fewer parameters than parent method ' . + $cased_guide_method_id, + $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + )) { + return false; + } + + return null; + } + + self::compareMethodParams( + $codebase, + $stmt, + $implementer_classlike_storage, + $guide_classlike_storage, + $implementer_called_class_name, + $guide_method_storage, + $implementer_method_storage, + $guide_param, + $implementer_method_storage->params[$i], + $i, + $cased_guide_method_id, + $cased_implementer_method_id, + $prevent_method_signature_mismatch, + $code_location, + $suppressed_issues + ); + } + + if ($guide_classlike_storage->user_defined + && ($guide_classlike_storage->is_interface + || $guide_classlike_storage->preserve_constructor_signature + || $implementer_method_storage->cased_name !== '__construct') + && $implementer_method_storage->required_param_count > $guide_method_storage->required_param_count + ) { + if ($implementer_method_storage->cased_name !== '__construct') { + if (IssueBuffer::accepts( + new MethodSignatureMismatch( + 'Method ' . $cased_implementer_method_id . ' has more required parameters than parent method ' . + $cased_guide_method_id, + $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + )) { + return false; + } + } else { + if (IssueBuffer::accepts( + new ConstructorSignatureMismatch( + 'Method ' . $cased_implementer_method_id . ' has more required parameters than parent method ' . + $cased_guide_method_id, + $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + )) { + return false; + } + } + + + return null; + } + + return null; + } + + /** + * @param string[] $suppressed_issues + */ + private static function checkForObviousMethodMismatches( + ClassLikeStorage $guide_classlike_storage, + ClassLikeStorage $implementer_classlike_storage, + MethodStorage $guide_method_storage, + MethodStorage $implementer_method_storage, + int $guide_visibility, + int $implementer_visibility, + string $cased_guide_method_id, + string $cased_implementer_method_id, + bool $prevent_method_signature_mismatch, + bool $prevent_abstract_override, + bool $trait_mismatches_are_fatal, + CodeLocation $code_location, + array $suppressed_issues + ): void { + if ($implementer_visibility > $guide_visibility) { + if ($trait_mismatches_are_fatal + || $guide_classlike_storage->is_trait === $implementer_classlike_storage->is_trait + || !in_array($guide_classlike_storage->name, $implementer_classlike_storage->used_traits) + || $implementer_method_storage->defining_fqcln !== $implementer_classlike_storage->name + || (!$implementer_method_storage->abstract + && !$guide_method_storage->abstract) + ) { + IssueBuffer::maybeAdd( + new OverriddenMethodAccess( + 'Method ' . $cased_implementer_method_id . ' has different access level than ' + . $cased_guide_method_id, + $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } elseif (IssueBuffer::accepts( + new TraitMethodSignatureMismatch( + 'Method ' . $cased_implementer_method_id . ' has different access level than ' + . $cased_guide_method_id, + $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + )) { + // fall through + } + } + + if ($guide_method_storage->final + && $prevent_method_signature_mismatch + && $prevent_abstract_override + ) { + IssueBuffer::maybeAdd( + new MethodSignatureMismatch( + 'Method ' . $cased_guide_method_id . ' is declared final and cannot be overridden', + $code_location + ), + $guide_method_storage->final_from_docblock ? + $suppressed_issues + $implementer_classlike_storage->suppressed_issues : + [] + ); + } + + if ($prevent_abstract_override + && !$guide_method_storage->abstract + && $implementer_method_storage->abstract + && !$guide_classlike_storage->abstract + && !$guide_classlike_storage->is_interface + ) { + IssueBuffer::maybeAdd( + new MethodSignatureMismatch( + 'Method ' . $cased_implementer_method_id . ' cannot be abstract when inherited method ' + . $cased_guide_method_id . ' is non-abstract', + $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } + + if ($guide_method_storage->external_mutation_free + && !$implementer_method_storage->external_mutation_free + && !$guide_method_storage->mutation_free_inferred + && $prevent_method_signature_mismatch + ) { + IssueBuffer::maybeAdd( + new MissingImmutableAnnotation( + $cased_guide_method_id . ' is marked @psalm-immutable, but ' + . $implementer_classlike_storage->name . '::' + . ($guide_method_storage->cased_name ?: '') + . ' is not marked @psalm-immutable', + $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } + } + + /** + * @param string[] $suppressed_issues + */ + private static function compareMethodParams( + Codebase $codebase, + ?ClassMethod $stmt, + ClassLikeStorage $implementer_classlike_storage, + ClassLikeStorage $guide_classlike_storage, + string $implementer_called_class_name, + MethodStorage $guide_method_storage, + MethodStorage $implementer_method_storage, + FunctionLikeParameter $guide_param, + FunctionLikeParameter $implementer_param, + int $i, + string $cased_guide_method_id, + string $cased_implementer_method_id, + bool $prevent_method_signature_mismatch, + CodeLocation $code_location, + array $suppressed_issues + ): void { + if ($prevent_method_signature_mismatch) { + if (!$guide_classlike_storage->user_defined + && $guide_param->type + ) { + $implementer_param_type = $implementer_param->signature_type; + + $guide_param_signature_type = $guide_param->type; + + $or_null_guide_param_signature_type = $guide_param->signature_type + ? clone $guide_param->signature_type + : null; + + if ($or_null_guide_param_signature_type) { + $or_null_guide_param_signature_type->addType(new TNull); + } + + if ($cased_guide_method_id === 'Serializable::unserialize') { + $guide_param_signature_type = null; + $or_null_guide_param_signature_type = null; + } + + if (!$guide_param->type->hasMixed() + && !$guide_param->type->from_docblock + && ($implementer_param_type || $guide_param_signature_type) + ) { + $config = Config::getInstance(); + + if ($implementer_param_type + && (!$guide_param_signature_type + || strtolower($implementer_param_type->getId()) + !== strtolower($guide_param_signature_type->getId())) + && (!$or_null_guide_param_signature_type + || strtolower($implementer_param_type->getId()) + !== strtolower($or_null_guide_param_signature_type->getId())) + ) { + if ($implementer_method_storage->cased_name === '__construct') { + IssueBuffer::maybeAdd( + new ConstructorSignatureMismatch( + 'Argument ' . ($i + 1) . ' of ' + . $cased_implementer_method_id . ' has wrong type \'' + . $implementer_param_type . '\', expecting \'' + . $guide_param_signature_type . '\' as defined by ' + . $cased_guide_method_id, + $implementer_param->location + && $config->isInProjectDirs( + $implementer_param->location->file_path + ) + ? $implementer_param->location + : $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new MethodSignatureMismatch( + 'Argument ' . ($i + 1) . ' of ' + . $cased_implementer_method_id . ' has wrong type \'' + . $implementer_param_type . '\', expecting \'' + . $guide_param_signature_type . '\' as defined by ' + . $cased_guide_method_id, + $implementer_param->location + && $config->isInProjectDirs( + $implementer_param->location->file_path + ) + ? $implementer_param->location + : $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } + + + return; + } + } + } + + $config = Config::getInstance(); + + if ($guide_param->name !== $implementer_param->name + && $guide_method_storage->allow_named_arg_calls + && $guide_classlike_storage->user_defined + && $implementer_classlike_storage->user_defined + && $implementer_param->location + && $guide_method_storage->cased_name + && strpos($guide_method_storage->cased_name, '__') !== 0 + && $config->isInProjectDirs( + $implementer_param->location->file_path + ) + ) { + if ($config->allow_named_arg_calls + || ($guide_classlike_storage->location + && !$config->isInProjectDirs($guide_classlike_storage->location->file_path) + ) + ) { + if ($codebase->alter_code) { + $project_analyzer = ProjectAnalyzer::getInstance(); + + if ($stmt && isset($project_analyzer->getIssuesToFix()['ParamNameMismatch'])) { + $param_replacer = new ParamReplacementVisitor( + $implementer_param->name, + $guide_param->name + ); + + $traverser = new NodeTraverser(); + $traverser->addVisitor($param_replacer); + $traverser->traverse([$stmt]); + + if ($replacements = $param_replacer->getReplacements()) { + FileManipulationBuffer::add( + $implementer_param->location->file_path, + $replacements + ); + } + } + } else { + IssueBuffer::maybeAdd( + new ParamNameMismatch( + 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id . ' has wrong name $' + . $implementer_param->name . ', expecting $' + . $guide_param->name . ' as defined by ' + . $cased_guide_method_id, + $implementer_param->location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } + } + } + + if ($guide_classlike_storage->user_defined + && $implementer_param->signature_type + ) { + self::compareMethodSignatureParams( + $codebase, + $i, + $guide_classlike_storage, + $implementer_classlike_storage, + $guide_method_storage, + $implementer_method_storage, + $guide_param, + $implementer_param->signature_type, + $cased_guide_method_id, + $cased_implementer_method_id, + $code_location, + $suppressed_issues + ); + } + } + + if ($implementer_param->type + && $guide_param->type + && $implementer_param->type->getId() !== $guide_param->type->getId() + ) { + self::compareMethodDocblockParams( + $codebase, + $i, + $guide_classlike_storage, + $implementer_classlike_storage, + $implementer_called_class_name, + $guide_method_storage, + $implementer_method_storage, + $cased_guide_method_id, + $cased_implementer_method_id, + $guide_param->type, + $implementer_param->type, + $code_location, + $suppressed_issues + ); + } + + if ($guide_classlike_storage->user_defined && $implementer_param->by_ref !== $guide_param->by_ref) { + $config = Config::getInstance(); + + IssueBuffer::maybeAdd( + new MethodSignatureMismatch( + 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id . ' is' . + ($implementer_param->by_ref ? '' : ' not') . ' passed by reference, but argument ' . + ($i + 1) . ' of ' . $cased_guide_method_id . ' is' . ($guide_param->by_ref ? '' : ' not'), + $implementer_param->location + && $config->isInProjectDirs( + $implementer_param->location->file_path + ) + ? $implementer_param->location + : $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } + } + + /** + * @param string[] $suppressed_issues + */ + private static function compareMethodSignatureParams( + Codebase $codebase, + int $i, + ClassLikeStorage $guide_classlike_storage, + ClassLikeStorage $implementer_classlike_storage, + MethodStorage $guide_method_storage, + MethodStorage $implementer_method_storage, + FunctionLikeParameter $guide_param, + Union $implementer_param_signature_type, + string $cased_guide_method_id, + string $cased_implementer_method_id, + CodeLocation $code_location, + array $suppressed_issues + ): void { + $guide_param_signature_type = $guide_param->signature_type + ? TypeExpander::expandUnion( + $codebase, + $guide_param->signature_type, + $guide_classlike_storage->is_trait && $guide_method_storage->abstract + ? $implementer_classlike_storage->name + : $guide_classlike_storage->name, + $guide_classlike_storage->is_trait && $guide_method_storage->abstract + ? $implementer_classlike_storage->name + : $guide_classlike_storage->name, + $guide_classlike_storage->is_trait && $guide_method_storage->abstract + ? $implementer_classlike_storage->parent_class + : $guide_classlike_storage->parent_class + ) + : null; + + $implementer_param_signature_type = TypeExpander::expandUnion( + $codebase, + $implementer_param_signature_type, + $implementer_classlike_storage->name, + $implementer_classlike_storage->name, + $implementer_classlike_storage->parent_class + ); + + $is_contained_by = (($codebase->php_major_version === 7 + && $codebase->php_minor_version === 4) + || $codebase->php_major_version >= 8) + && $guide_param_signature_type + ? UnionTypeComparator::isContainedBy( + $codebase, + $guide_param_signature_type, + $implementer_param_signature_type + ) + : UnionTypeComparator::isContainedByInPhp( + $guide_param_signature_type, + $implementer_param_signature_type + ); + if (!$is_contained_by) { + $config = Config::getInstance(); + + if ($codebase->php_major_version >= 8 + || $guide_classlike_storage->is_trait === $implementer_classlike_storage->is_trait + || !in_array($guide_classlike_storage->name, $implementer_classlike_storage->used_traits) + || $implementer_method_storage->defining_fqcln !== $implementer_classlike_storage->name + || (!$implementer_method_storage->abstract + && !$guide_method_storage->abstract) + ) { + if ($implementer_method_storage->cased_name === '__construct') { + IssueBuffer::maybeAdd( + new ConstructorSignatureMismatch( + 'Argument ' . ($i + 1) . ' of ' + . $cased_implementer_method_id + . ' has wrong type \'' + . $implementer_param_signature_type . '\', expecting \'' + . $guide_param_signature_type . '\' as defined by ' + . $cased_guide_method_id, + $implementer_method_storage->params[$i]->location + && $config->isInProjectDirs( + $implementer_method_storage->params[$i]->location->file_path + ) + ? $implementer_method_storage->params[$i]->location + : $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new MethodSignatureMismatch( + 'Argument ' . ($i + 1) . ' of ' + . $cased_implementer_method_id + . ' has wrong type \'' + . $implementer_param_signature_type . '\', expecting \'' + . $guide_param_signature_type . '\' as defined by ' + . $cased_guide_method_id, + $implementer_method_storage->params[$i]->location + && $config->isInProjectDirs( + $implementer_method_storage->params[$i]->location->file_path + ) + ? $implementer_method_storage->params[$i]->location + : $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } + } else { + IssueBuffer::maybeAdd( + new TraitMethodSignatureMismatch( + 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id . ' has wrong type \'' . + $implementer_param_signature_type . '\', expecting \'' . + $guide_param_signature_type . '\' as defined by ' . + $cased_guide_method_id, + $implementer_method_storage->params[$i]->location + && $config->isInProjectDirs( + $implementer_method_storage->params[$i]->location->file_path + ) + ? $implementer_method_storage->params[$i]->location + : $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } + } + } + + /** + * @param string[] $suppressed_issues + */ + private static function compareMethodDocblockParams( + Codebase $codebase, + int $i, + ClassLikeStorage $guide_classlike_storage, + ClassLikeStorage $implementer_classlike_storage, + string $implementer_called_class_name, + MethodStorage $guide_method_storage, + MethodStorage $implementer_method_storage, + string $cased_guide_method_id, + string $cased_implementer_method_id, + Union $guide_param_type, + Union $implementer_param_type, + CodeLocation $code_location, + array $suppressed_issues + ): void { + $implementer_method_storage_param_type = TypeExpander::expandUnion( + $codebase, + $implementer_param_type, + $implementer_classlike_storage->name, + $implementer_called_class_name, + $implementer_classlike_storage->parent_class + ); + + $guide_method_storage_param_type = TypeExpander::expandUnion( + $codebase, + $guide_param_type, + $guide_classlike_storage->is_trait && $guide_method_storage->abstract + ? $implementer_classlike_storage->name + : $guide_classlike_storage->name, + $guide_classlike_storage->is_trait && $guide_method_storage->abstract + ? $implementer_classlike_storage->name + : $guide_classlike_storage->name, + $guide_classlike_storage->is_trait && $guide_method_storage->abstract + ? $implementer_classlike_storage->parent_class + : $guide_classlike_storage->parent_class + ); + + $guide_class_name = $guide_classlike_storage->name; + + if ($implementer_classlike_storage->is_trait) { + $implementer_called_class_storage = $codebase->classlike_storage_provider->get( + $implementer_called_class_name + ); + + if (isset( + $implementer_called_class_storage->template_extended_params[$implementer_classlike_storage->name] + )) { + self::transformTemplates( + $implementer_called_class_storage->template_extended_params, + $implementer_classlike_storage->name, + $implementer_method_storage_param_type, + $codebase + ); + + self::transformTemplates( + $implementer_called_class_storage->template_extended_params, + $guide_class_name, + $guide_method_storage_param_type, + $codebase + ); + } + } + + foreach ($implementer_method_storage_param_type->getAtomicTypes() as $k => $t) { + if ($t instanceof TTemplateParam + && strpos($t->defining_class, 'fn-') === 0 + ) { + $implementer_method_storage_param_type->removeType($k); + + foreach ($t->as->getAtomicTypes() as $as_t) { + $implementer_method_storage_param_type->addType($as_t); + } + } + } + + foreach ($guide_method_storage_param_type->getAtomicTypes() as $k => $t) { + if ($t instanceof TTemplateParam + && strpos($t->defining_class, 'fn-') === 0 + ) { + $guide_method_storage_param_type->removeType($k); + + foreach ($t->as->getAtomicTypes() as $as_t) { + $guide_method_storage_param_type->addType($as_t); + } + } + } + + if ($implementer_classlike_storage->template_extended_params) { + self::transformTemplates( + $implementer_classlike_storage->template_extended_params, + $guide_class_name, + $guide_method_storage_param_type, + $codebase + ); + } + + $union_comparison_results = new TypeComparisonResult(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $guide_method_storage_param_type, + $implementer_method_storage_param_type, + !$guide_classlike_storage->user_defined, + !$guide_classlike_storage->user_defined, + $union_comparison_results + )) { + // is the declared return type more specific than the inferred one? + if ($union_comparison_results->type_coerced) { + if ($guide_classlike_storage->user_defined) { + IssueBuffer::maybeAdd( + new MoreSpecificImplementedParamType( + 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id + . ' has the more specific type \'' . + $implementer_method_storage_param_type->getId() . '\', expecting \'' . + $guide_method_storage_param_type->getId() . '\' as defined by ' . + $cased_guide_method_id, + $implementer_method_storage->params[$i]->location + ?: $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } + } else { + if (UnionTypeComparator::isContainedBy( + $codebase, + $implementer_method_storage_param_type, + $guide_method_storage_param_type, + !$guide_classlike_storage->user_defined, + !$guide_classlike_storage->user_defined + )) { + if (IssueBuffer::accepts( + new MoreSpecificImplementedParamType( + 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id + . ' has the more specific type \'' . + $implementer_method_storage_param_type->getId() . '\', expecting \'' . + $guide_method_storage_param_type->getId() . '\' as defined by ' . + $cased_guide_method_id, + $implementer_method_storage->params[$i]->location + ?: $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + )) { + // fall through + } + } else { + if (IssueBuffer::accepts( + new ImplementedParamTypeMismatch( + 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id + . ' has wrong type \'' . + $implementer_method_storage_param_type->getId() . '\', expecting \'' . + $guide_method_storage_param_type->getId() . '\' as defined by ' . + $cased_guide_method_id, + $implementer_method_storage->params[$i]->location + ?: $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + )) { + // fall through + } + } + } + } + } + + /** + * @param string[] $suppressed_issues + */ + private static function compareMethodSignatureReturnTypes( + Codebase $codebase, + ClassLikeStorage $guide_classlike_storage, + ClassLikeStorage $implementer_classlike_storage, + MethodStorage $guide_method_storage, + MethodStorage $implementer_method_storage, + Union $guide_signature_return_type, + string $cased_guide_method_id, + string $implementer_called_class_name, + string $cased_implementer_method_id, + CodeLocation $code_location, + array $suppressed_issues + ): void { + $guide_signature_return_type = TypeExpander::expandUnion( + $codebase, + $guide_signature_return_type, + $guide_classlike_storage->is_trait && $guide_method_storage->abstract + ? $implementer_classlike_storage->name + : $guide_classlike_storage->name, + ($guide_classlike_storage->is_trait && $guide_method_storage->abstract) + || $guide_classlike_storage->final + ? $implementer_classlike_storage->name + : $guide_classlike_storage->name, + $guide_classlike_storage->is_trait && $guide_method_storage->abstract + ? $implementer_classlike_storage->parent_class + : $guide_classlike_storage->parent_class, + true, + true, + $implementer_method_storage->final + ); + + $implementer_signature_return_type = $implementer_method_storage->signature_return_type + ? TypeExpander::expandUnion( + $codebase, + $implementer_method_storage->signature_return_type, + $implementer_classlike_storage->is_trait + ? $implementer_called_class_name + : $implementer_classlike_storage->name, + $implementer_classlike_storage->is_trait + ? $implementer_called_class_name + : $implementer_classlike_storage->name, + $implementer_classlike_storage->parent_class + ) : null; + + $is_contained_by = (($codebase->php_major_version === 7 + && $codebase->php_minor_version === 4) + || $codebase->php_major_version >= 8) + && $implementer_signature_return_type + ? UnionTypeComparator::isContainedBy( + $codebase, + $implementer_signature_return_type, + $guide_signature_return_type + ) + : UnionTypeComparator::isContainedByInPhp($implementer_signature_return_type, $guide_signature_return_type); + + if (!$is_contained_by) { + if ($codebase->php_major_version >= 8 + || $guide_classlike_storage->is_trait === $implementer_classlike_storage->is_trait + || !in_array($guide_classlike_storage->name, $implementer_classlike_storage->used_traits) + || $implementer_method_storage->defining_fqcln !== $implementer_classlike_storage->name + || (!$implementer_method_storage->abstract + && !$guide_method_storage->abstract) + ) { + IssueBuffer::maybeAdd( + new MethodSignatureMismatch( + 'Method ' . $cased_implementer_method_id . ' with return type \'' + . $implementer_signature_return_type . '\' is different to return type \'' + . $guide_signature_return_type . '\' of inherited method ' . $cased_guide_method_id, + $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new TraitMethodSignatureMismatch( + 'Method ' . $cased_implementer_method_id . ' with return type \'' + . $implementer_signature_return_type . '\' is different to return type \'' + . $guide_signature_return_type . '\' of inherited method ' . $cased_guide_method_id, + $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } + } + } + + /** + * @param string[] $suppressed_issues + */ + private static function compareMethodDocblockReturnTypes( + Codebase $codebase, + ClassLikeStorage $guide_classlike_storage, + ClassLikeStorage $implementer_classlike_storage, + MethodStorage $implementer_method_storage, + Union $guide_return_type, + Union $implementer_return_type, + string $cased_guide_method_id, + string $implementer_called_class_name, + ?MethodIdentifier $implementer_declaring_method_id, + CodeLocation $code_location, + array $suppressed_issues + ): void { + $implementer_method_storage_return_type = TypeExpander::expandUnion( + $codebase, + $implementer_return_type, + $implementer_classlike_storage->is_trait + ? $implementer_called_class_name + : $implementer_classlike_storage->name, + $implementer_called_class_name, + $implementer_classlike_storage->parent_class + ); + + $guide_method_storage_return_type = TypeExpander::expandUnion( + $codebase, + $guide_return_type, + $guide_classlike_storage->is_trait + ? $implementer_classlike_storage->name + : $guide_classlike_storage->name, + $guide_classlike_storage->is_trait + || $implementer_method_storage->final + ? $implementer_called_class_name + : $guide_classlike_storage->name, + $guide_classlike_storage->parent_class, + true, + true, + $implementer_method_storage->final + ); + + $guide_class_name = $guide_classlike_storage->name; + + if ($implementer_classlike_storage->template_extended_params) { + self::transformTemplates( + $implementer_classlike_storage->template_extended_params, + $guide_class_name, + $guide_method_storage_return_type, + $codebase + ); + + if ($implementer_method_storage->defining_fqcln) { + self::transformTemplates( + $implementer_classlike_storage->template_extended_params, + $implementer_method_storage->defining_fqcln, + $implementer_method_storage_return_type, + $codebase + ); + } + } + + if ($implementer_classlike_storage->is_trait) { + $implementer_called_class_storage = $codebase->classlike_storage_provider->get( + $implementer_called_class_name + ); + + if ($implementer_called_class_storage->template_extended_params) { + self::transformTemplates( + $implementer_called_class_storage->template_extended_params, + $implementer_classlike_storage->name, + $implementer_method_storage_return_type, + $codebase + ); + + self::transformTemplates( + $implementer_called_class_storage->template_extended_params, + $guide_class_name, + $guide_method_storage_return_type, + $codebase + ); + } + } + + // treat void as null when comparing against docblock implementer + if ($implementer_method_storage_return_type->isVoid()) { + $implementer_method_storage_return_type = Type::getNull(); + } + + if ($guide_method_storage_return_type->isVoid()) { + $guide_method_storage_return_type = Type::getNull(); + } + + $union_comparison_results = new TypeComparisonResult(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $implementer_method_storage_return_type, + $guide_method_storage_return_type, + false, + false, + $union_comparison_results + )) { + // is the declared return type more specific than the inferred one? + if ($union_comparison_results->type_coerced) { + IssueBuffer::maybeAdd( + new LessSpecificImplementedReturnType( + 'The inherited return type \'' . $guide_method_storage_return_type->getId() + . '\' for ' . $cased_guide_method_id . ' is more specific than the implemented ' + . 'return type for ' . $implementer_declaring_method_id . ' \'' + . $implementer_method_storage_return_type->getId() . '\'', + $implementer_method_storage->return_type_location + ?: $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new ImplementedReturnTypeMismatch( + 'The inherited return type \'' . $guide_method_storage_return_type->getId() + . '\' for ' . $cased_guide_method_id . ' is different to the implemented ' + . 'return type for ' . $implementer_declaring_method_id . ' \'' + . $implementer_method_storage_return_type->getId() . '\'', + $implementer_method_storage->return_type_location + ?: $code_location + ), + $suppressed_issues + $implementer_classlike_storage->suppressed_issues + ); + } + } + } + + /** + * @param array> $template_extended_params + */ + private static function transformTemplates( + array $template_extended_params, + string $base_class_name, + Union $templated_type, + Codebase $codebase + ): void { + if (isset($template_extended_params[$base_class_name])) { + $map = $template_extended_params[$base_class_name]; + + $template_types = []; + + foreach ($map as $key => $mapped_type) { + $new_bases = []; + + foreach ($mapped_type->getTemplateTypes() as $mapped_atomic_type) { + if ($mapped_atomic_type->defining_class === $base_class_name) { + continue; + } + + $new_bases[] = $mapped_atomic_type->defining_class; + } + + if ($new_bases) { + $mapped_type = clone $mapped_type; + + foreach ($new_bases as $new_base_class_name) { + self::transformTemplates( + $template_extended_params, + $new_base_class_name, + $mapped_type, + $codebase + ); + } + } + + $template_types[$key][$base_class_name] = $mapped_type; + } + + $template_result = new TemplateResult([], $template_types); + + TemplateInferredTypeReplacer::replace( + $templated_type, + $template_result, + $codebase + ); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php new file mode 100644 index 00000000..06413e6b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php @@ -0,0 +1,280 @@ +> + */ + protected static $public_namespace_constants = []; + + public function __construct(Namespace_ $namespace, FileAnalyzer $source) + { + $this->source = $source; + $this->namespace = $namespace; + $this->namespace_name = $this->namespace->name ? implode('\\', $this->namespace->name->parts) : ''; + } + + public function collectAnalyzableInformation(): void + { + $leftover_stmts = []; + + if (!isset(self::$public_namespace_constants[$this->namespace_name])) { + self::$public_namespace_constants[$this->namespace_name] = []; + } + + $codebase = $this->getCodebase(); + + foreach ($this->namespace->stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\ClassLike) { + $this->collectAnalyzableClassLike($stmt); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Use_) { + $this->visitUse($stmt); + } elseif ($stmt instanceof PhpParser\Node\Stmt\GroupUse) { + $this->visitGroupUse($stmt); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Const_) { + foreach ($stmt->consts as $const) { + self::$public_namespace_constants[$this->namespace_name][$const->name->name] = Type::getMixed(); + } + + $leftover_stmts[] = $stmt; + } else { + $leftover_stmts[] = $stmt; + } + } + + if ($leftover_stmts) { + $statements_analyzer = new StatementsAnalyzer($this, new NodeDataProvider()); + $context = new Context(); + $context->is_global = true; + $context->defineGlobals(); + $context->collect_exceptions = $codebase->config->check_for_throws_in_global_scope; + $statements_analyzer->analyze($leftover_stmts, $context, null, true); + + $file_context = $this->source->context; + if ($file_context) { + $file_context->mergeExceptions($context); + } + } + } + + public function collectAnalyzableClassLike(PhpParser\Node\Stmt\ClassLike $stmt): void + { + if (!$stmt->name) { + throw new UnexpectedValueException('Did not expect anonymous class here'); + } + + $fq_class_name = Type::getFQCLNFromString($stmt->name->name, $this->getAliases()); + + if ($stmt instanceof PhpParser\Node\Stmt\Class_ || $stmt instanceof PhpParser\Node\Stmt\Enum_) { + $this->source->addNamespacedClassAnalyzer( + $fq_class_name, + new ClassAnalyzer($stmt, $this, $fq_class_name) + ); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Interface_) { + $this->source->addNamespacedInterfaceAnalyzer( + $fq_class_name, + new InterfaceAnalyzer($stmt, $this, $fq_class_name) + ); + } + } + + public function getNamespace(): string + { + return $this->namespace_name; + } + + public function setConstType(string $const_name, Union $const_type): void + { + self::$public_namespace_constants[$this->namespace_name][$const_name] = $const_type; + } + + /** + * @return array + */ + public static function getConstantsForNamespace(string $namespace_name, int $visibility): array + { + // @todo this does not allow for loading in namespace constants not already defined in the current sweep + if (!isset(self::$public_namespace_constants[$namespace_name])) { + self::$public_namespace_constants[$namespace_name] = []; + } + + if ($visibility === ReflectionProperty::IS_PUBLIC) { + return self::$public_namespace_constants[$namespace_name]; + } + + throw new InvalidArgumentException('Given $visibility not supported'); + } + + public function getFileAnalyzer(): FileAnalyzer + { + return $this->source; + } + + /** + * Returns true if $calling_identifier is the same as, or is within with $identifier, in a + * case-insensitive comparison. Identifiers can be namespaces, classlikes, functions, or methods. + * + * @psalm-pure + * + * @throws InvalidArgumentException if $identifier is not a valid identifier + */ + public static function isWithin(string $calling_identifier, string $identifier): bool + { + $normalized_calling_ident = self::normalizeIdentifier($calling_identifier); + $normalized_ident = self::normalizeIdentifier($identifier); + + if ($normalized_calling_ident === $normalized_ident) { + return true; + } + + $normalized_calling_ident_parts = self::getIdentifierParts($normalized_calling_ident); + $normalized_ident_parts = self::getIdentifierParts($normalized_ident); + + if (count($normalized_calling_ident_parts) < count($normalized_ident_parts)) { + return false; + } + + for ($i = 0; $i < count($normalized_ident_parts); ++$i) { + if ($normalized_ident_parts[$i] !== $normalized_calling_ident_parts[$i]) { + return false; + } + } + + return true; + } + + /** + * Returns true if $calling_identifier is the same as or is within any identifier + * in $identifiers in a case-insensitive comparison, or if $identifiers is empty. + * Identifiers can be namespaces, classlikes, functions, or methods. + * + * @psalm-pure + * + * @psalm-assert-if-false !empty $identifiers + * + * @param list $identifiers + */ + public static function isWithinAny(string $calling_identifier, array $identifiers): bool + { + if (count($identifiers) === 0) { + return true; + } + + foreach ($identifiers as $identifier) { + if (self::isWithin($calling_identifier, $identifier)) { + return true; + } + } + + return false; + } + + /** + * @param non-empty-string $fullyQualifiedClassName, e.g. '\Psalm\Internal\Analyzer\NamespaceAnalyzer' + * + * @return non-empty-string , e.g. 'Psalm' + * + * @psalm-pure + */ + public static function getNameSpaceRoot(string $fullyQualifiedClassName): string + { + $root_namespace = preg_replace('/^([^\\\]+).*/', '$1', $fullyQualifiedClassName); + if ($root_namespace === "") { + throw new InvalidArgumentException("Invalid classname \"$fullyQualifiedClassName\""); + } + return $root_namespace; + } + + /** + * @return ($lowercase is true ? lowercase-string : string) + * + * @psalm-pure + */ + public static function normalizeIdentifier(string $identifier, bool $lowercase = true): string + { + if ($identifier === "") { + return ""; + } + + $identifier = $identifier[0] === "\\" ? substr($identifier, 1) : $identifier; + return $lowercase ? strtolower($identifier) : $identifier; + } + + /** + * Splits an identifier into parts, eg `Foo\Bar::baz` becomes ["Foo", "\\", "Bar", "::", "baz"]. + * + * @return list + * + * @psalm-pure + */ + public static function getIdentifierParts(string $identifier): array + { + $parts = []; + while (($pos = strpos($identifier, "\\")) !== false) { + if ($pos > 0) { + $part = substr($identifier, 0, $pos); + assert($part !== ""); + $parts[] = $part; + } + $parts[] = "\\"; + $identifier = substr($identifier, $pos + 1); + } + if (($pos = strpos($identifier, "::")) !== false) { + if ($pos > 0) { + $part = substr($identifier, 0, $pos); + assert($part !== ""); + $parts[] = $part; + } + $parts[] = "::"; + $identifier = substr($identifier, $pos + 2); + } + if ($identifier !== "") { + $parts[] = $identifier; + } + + return $parts; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php new file mode 100644 index 00000000..40b3316d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php @@ -0,0 +1,1527 @@ + + */ + private $issues_to_fix = []; + + /** + * @var bool + */ + public $dry_run = false; + + /** + * @var bool + */ + public $full_run = false; + + /** + * @var bool + */ + public $only_replace_php_types_with_non_docblock_types = false; + + /** + * @var ?int + */ + public $onchange_line_limit; + + /** + * @var bool + */ + public $provide_completion = false; + + /** + * @var array + */ + private $project_files = []; + + /** + * @var array + */ + private $extra_files = []; + + /** + * @var array + */ + private $to_refactor = []; + + /** + * @var ?ReportOptions + */ + public $stdout_report_options; + + /** + * @var array + */ + public $generated_report_options; + + /** + * @var array> + */ + private const SUPPORTED_ISSUES_TO_FIX = [ + InvalidFalsableReturnType::class, + InvalidNullableReturnType::class, + InvalidReturnType::class, + LessSpecificReturnType::class, + MismatchingDocblockParamType::class, + MismatchingDocblockReturnType::class, + MissingClosureReturnType::class, + MissingParamType::class, + MissingPropertyType::class, + MissingReturnType::class, + ParamNameMismatch::class, + PossiblyUndefinedGlobalVariable::class, + PossiblyUndefinedVariable::class, + PossiblyUnusedMethod::class, + PossiblyUnusedProperty::class, + RedundantCast::class, + RedundantCastGivenDocblockType::class, + UnusedMethod::class, + UnusedProperty::class, + UnusedVariable::class, + UnnecessaryVarAnnotation::class, + ]; + + /** + * When this is true, the language server will send the diagnostic code with a help link. + * + * @var bool + */ + public $language_server_use_extended_diagnostic_codes = false; + + /** + * If this is true then the language server will send log messages to the client with additional information. + * + * @var bool + */ + public $language_server_verbose = false; + + /** + * @param array $generated_report_options + */ + public function __construct( + Config $config, + Providers $providers, + ?ReportOptions $stdout_report_options = null, + array $generated_report_options = [], + int $threads = 1, + ?Progress $progress = null + ) { + if ($progress === null) { + $progress = new VoidProgress(); + } + + $this->parser_cache_provider = $providers->parser_cache_provider; + $this->project_cache_provider = $providers->project_cache_provider; + $this->file_provider = $providers->file_provider; + $this->classlike_storage_provider = $providers->classlike_storage_provider; + $this->file_reference_provider = $providers->file_reference_provider; + + $this->progress = $progress; + $this->threads = $threads; + $this->config = $config; + + $this->clearCacheDirectoryIfConfigOrComposerLockfileChanged(); + + $this->codebase = new Codebase( + $config, + $providers, + $progress + ); + + $this->stdout_report_options = $stdout_report_options; + $this->generated_report_options = $generated_report_options; + + $file_extensions = $this->config->getFileExtensions(); + + foreach ($this->config->getProjectDirectories() as $dir_name) { + $file_paths = $this->file_provider->getFilesInDir( + $dir_name, + $file_extensions, + [$this->config, 'isInProjectDirs'] + ); + + foreach ($file_paths as $file_path) { + $this->addProjectFile($file_path); + } + } + + foreach ($this->config->getExtraDirectories() as $dir_name) { + $file_paths = $this->file_provider->getFilesInDir( + $dir_name, + $file_extensions, + [$this->config, 'isInExtraDirs'] + ); + + foreach ($file_paths as $file_path) { + $this->addExtraFile($file_path); + } + } + + foreach ($this->config->getProjectFiles() as $file_path) { + $this->addProjectFile($file_path); + } + + self::$instance = $this; + } + + private function clearCacheDirectoryIfConfigOrComposerLockfileChanged(): void + { + if ($this->project_cache_provider + && $this->project_cache_provider->hasLockfileChanged() + ) { + $this->progress->debug( + 'Composer lockfile change detected, clearing cache' . "\n" + ); + + $cache_directory = $this->config->getCacheDirectory(); + if ($cache_directory !== null) { + Config::removeCacheDirectory($cache_directory); + } + + if ($this->file_reference_provider->cache) { + $this->file_reference_provider->cache->hasConfigChanged(); + } + + $this->project_cache_provider->updateComposerLockHash(); + } elseif ($this->file_reference_provider->cache + && $this->file_reference_provider->cache->hasConfigChanged() + ) { + $this->progress->debug( + 'Config change detected, clearing cache' . "\n" + ); + + $cache_directory = $this->config->getCacheDirectory(); + if ($cache_directory !== null) { + Config::removeCacheDirectory($cache_directory); + } + + if ($this->project_cache_provider) { + $this->project_cache_provider->hasLockfileChanged(); + } + } + } + + /** + * @param array $report_file_paths + * @return list + */ + public static function getFileReportOptions(array $report_file_paths, bool $show_info = true): array + { + $report_options = []; + + $mapping = [ + 'checkstyle.xml' => Report::TYPE_CHECKSTYLE, + 'sonarqube.json' => Report::TYPE_SONARQUBE, + 'codeclimate.json' => Report::TYPE_CODECLIMATE, + 'summary.json' => Report::TYPE_JSON_SUMMARY, + 'junit.xml' => Report::TYPE_JUNIT, + '.xml' => Report::TYPE_XML, + '.json' => Report::TYPE_JSON, + '.txt' => Report::TYPE_TEXT, + '.emacs' => Report::TYPE_EMACS, + '.pylint' => Report::TYPE_PYLINT, + '.console' => Report::TYPE_CONSOLE, + '.sarif' => Report::TYPE_SARIF, + 'count.txt' => Report::TYPE_COUNT, + ]; + + foreach ($report_file_paths as $report_file_path) { + foreach ($mapping as $extension => $type) { + if (substr($report_file_path, -strlen($extension)) === $extension) { + $o = new ReportOptions(); + + $o->format = $type; + $o->show_info = $show_info; + $o->output_path = $report_file_path; + $o->use_color = false; + $report_options[] = $o; + continue 2; + } + } + + throw new UnexpectedValueException('Unknown report format ' . $report_file_path); + } + + return $report_options; + } + + private function visitAutoloadFiles(): void + { + $start_time = microtime(true); + + $this->config->visitComposerAutoloadFiles($this, $this->progress); + + $now_time = microtime(true); + + $this->progress->debug( + 'Visiting autoload files took ' . number_format($now_time - $start_time, 3) . 's' . "\n" + ); + } + + public function server(?string $address = '127.0.0.1:12345', bool $socket_server_mode = false): void + { + $this->visitAutoloadFiles(); + $this->codebase->diff_methods = true; + $this->file_reference_provider->loadReferenceCache(); + $this->codebase->enterServerMode(); + + if (ini_get('pcre.jit') === '1' + && PHP_OS === 'Darwin' + && version_compare(PHP_VERSION, '7.3.0') >= 0 + && version_compare(PHP_VERSION, '7.4.0') < 0 + ) { + // do nothing + } else { + $cpu_count = self::getCpuCount(); + + // let's not go crazy + $usable_cpus = $cpu_count - 2; + + if ($usable_cpus > 1) { + $this->threads = $usable_cpus; + } + } + + $this->config->initializePlugins($this); + + foreach ($this->config->getProjectDirectories() as $dir_name) { + $this->checkDirWithConfig($dir_name, $this->config); + } + + @cli_set_process_title('Psalm ' . PSALM_VERSION . ' - PHP Language Server'); + + if (!$socket_server_mode && $address) { + // Connect to a TCP server + $socket = stream_socket_client('tcp://' . $address, $errno, $errstr); + if ($socket === false) { + fwrite(STDERR, "Could not connect to language client. Error $errno\n$errstr"); + exit(1); + } + stream_set_blocking($socket, false); + new LanguageServer( + new ProtocolStreamReader($socket), + new ProtocolStreamWriter($socket), + $this + ); + Loop::run(); + } elseif ($socket_server_mode && $address) { + // Run a TCP Server + $tcpServer = stream_socket_server('tcp://' . $address, $errno, $errstr); + if ($tcpServer === false) { + fwrite(STDERR, "Could not listen on $address. Error $errno\n$errstr"); + exit(1); + } + fwrite(STDOUT, "Server listening on $address\n"); + + $fork_available = true; + if (!extension_loaded('pcntl')) { + fwrite(STDERR, "PCNTL is not available. Only a single connection will be accepted\n"); + $fork_available = false; + } + + $disabled_functions = array_map('trim', explode(',', ini_get('disable_functions'))); + if (in_array('pcntl_fork', $disabled_functions)) { + fwrite( + STDERR, + "pcntl_fork() is disabled by php configuration (disable_functions directive)." + . " Only a single connection will be accepted\n" + ); + $fork_available = false; + } + + while ($socket = stream_socket_accept($tcpServer, -1)) { + fwrite(STDOUT, "Connection accepted\n"); + stream_set_blocking($socket, false); + if ($fork_available) { + // If PCNTL is available, fork a child process for the connection + // An exit notification will only terminate the child process + $pid = pcntl_fork(); + if ($pid === -1) { + fwrite(STDERR, "Could not fork\n"); + exit(1); + } + + if ($pid === 0) { + // Child process + $reader = new ProtocolStreamReader($socket); + $reader->on( + 'close', + function (): void { + fwrite(STDOUT, "Connection closed\n"); + } + ); + new LanguageServer( + $reader, + new ProtocolStreamWriter($socket), + $this + ); + // Just for safety + exit(0); + } + } else { + // If PCNTL is not available, we only accept one connection. + // An exit notification will terminate the server + new LanguageServer( + new ProtocolStreamReader($socket), + new ProtocolStreamWriter($socket), + $this + ); + Loop::run(); + } + } + } else { + // Use STDIO + stream_set_blocking(STDIN, false); + new LanguageServer( + new ProtocolStreamReader(STDIN), + new ProtocolStreamWriter(STDOUT), + $this + ); + Loop::run(); + } + } + + public static function getInstance(): ProjectAnalyzer + { + return self::$instance; + } + + public function canReportIssues(string $file_path): bool + { + return isset($this->project_files[$file_path]); + } + + private function generatePHPVersionMessage(): string + { + $codebase = $this->codebase; + + $version = $codebase->php_major_version . '.' . $codebase->php_minor_version; + + switch ($codebase->php_version_source) { + case 'cli': + $source = '(set by CLI argument)'; + break; + case 'config': + $source = '(set by config file)'; + break; + case 'composer': + $source = '(inferred from composer.json)'; + break; + case 'tests': + $source = '(set by tests)'; + break; + case 'runtime': + $source = '(inferred from current PHP version)'; + break; + } + + return "Target PHP version: $version $source\n"; + } + + public function check(string $base_dir, bool $is_diff = false): void + { + $start_checks = (int)microtime(true); + + if (!$base_dir) { + throw new InvalidArgumentException('Cannot work with empty base_dir'); + } + + $diff_files = null; + $deleted_files = null; + + $this->full_run = true; + + $reference_cache = $this->file_reference_provider->loadReferenceCache(true); + + $this->codebase->diff_methods = $is_diff; + + if ($is_diff + && $reference_cache + && $this->project_cache_provider + && $this->project_cache_provider->canDiffFiles() + ) { + $deleted_files = $this->file_reference_provider->getDeletedReferencedFiles(); + $diff_files = array_merge($deleted_files, $this->getDiffFiles()); + } + + $this->progress->write($this->generatePHPVersionMessage()); + $this->progress->startScanningFiles(); + + $diff_no_files = false; + + if ($diff_files === null + || $deleted_files === null + || count($diff_files) > 200 + ) { + $this->config->visitPreloadedStubFiles($this->codebase, $this->progress); + $this->visitAutoloadFiles(); + + $this->codebase->scanner->addFilesToShallowScan($this->extra_files); + $this->codebase->scanner->addFilesToDeepScan($this->project_files); + $this->codebase->analyzer->addFilesToAnalyze($this->project_files); + + $this->config->initializePlugins($this); + + $this->codebase->scanFiles($this->threads); + + $this->codebase->infer_types_from_usage = true; + } else { + $this->progress->debug(count($diff_files) . ' changed files: ' . "\n"); + $this->progress->debug(' ' . implode("\n ", $diff_files) . "\n"); + + $this->codebase->analyzer->addFilesToShowResults($this->project_files); + + if ($diff_files) { + $file_list = $this->getReferencedFilesFromDiff($diff_files); + + // strip out deleted files + $file_list = array_diff($file_list, $deleted_files); + + if ($file_list) { + $this->config->visitPreloadedStubFiles($this->codebase, $this->progress); + $this->visitAutoloadFiles(); + + $this->checkDiffFilesWithConfig($this->config, $file_list); + + $this->config->initializePlugins($this); + + $this->codebase->scanFiles($this->threads); + } else { + $diff_no_files = true; + } + } else { + $diff_no_files = true; + } + } + + if (!$diff_no_files) { + $this->config->visitStubFiles($this->codebase, $this->progress); + + $event = new AfterCodebasePopulatedEvent($this->codebase); + + $this->config->eventDispatcher->dispatchAfterCodebasePopulated($event); + } + + $this->progress->startAnalyzingFiles(); + + $this->codebase->analyzer->analyzeFiles( + $this, + $this->threads, + $this->codebase->alter_code, + true + ); + + if ($this->parser_cache_provider && !$is_diff) { + $removed_parser_files = $this->parser_cache_provider->deleteOldParserCaches($start_checks); + + if ($removed_parser_files) { + $this->progress->debug('Removed ' . $removed_parser_files . ' old parser caches' . "\n"); + } + } + } + + public function consolidateAnalyzedData(): void + { + $this->codebase->classlikes->consolidateAnalyzedData( + $this->codebase->methods, + $this->progress, + (bool)$this->codebase->find_unused_code + ); + } + + public function trackTaintedInputs(): void + { + $this->codebase->taint_flow_graph = new TaintFlowGraph(); + } + + public function trackUnusedSuppressions(): void + { + $this->codebase->track_unused_suppressions = true; + } + + public function interpretRefactors(): void + { + if (!$this->codebase->alter_code) { + throw new UnexpectedValueException('Should not be checking references'); + } + + // interpret wildcards + foreach ($this->to_refactor as $source => $destination) { + if (($source_pos = strpos($source, '*')) + && ($destination_pos = strpos($destination, '*')) + && $source_pos === (strlen($source) - 1) + && $destination_pos === (strlen($destination) - 1) + ) { + foreach ($this->codebase->classlike_storage_provider->getAll() as $class_storage) { + if (strpos($source, substr($class_storage->name, 0, $source_pos)) === 0) { + $this->to_refactor[$class_storage->name] + = substr($destination, 0, -1) . substr($class_storage->name, $source_pos); + } + } + + unset($this->to_refactor[$source]); + } + } + + foreach ($this->to_refactor as $source => $destination) { + $source_parts = explode('::', $source); + $destination_parts = explode('::', $destination); + + if (!$this->codebase->classlikes->hasFullyQualifiedClassName($source_parts[0])) { + throw new RefactorException( + 'Source class ' . $source_parts[0] . ' doesn’t exist' + ); + } + + if (count($source_parts) === 1 && count($destination_parts) === 1) { + if ($this->codebase->classlikes->hasFullyQualifiedClassName($destination_parts[0])) { + throw new RefactorException( + 'Destination class ' . $destination_parts[0] . ' already exists' + ); + } + + $source_class_storage = $this->codebase->classlike_storage_provider->get($source_parts[0]); + + $destination_parts = explode('\\', $destination, -1); + $destination_ns = implode('\\', $destination_parts); + + $this->codebase->classes_to_move[strtolower($source)] = $destination; + + $destination_class_storage = $this->codebase->classlike_storage_provider->create($destination); + + $destination_class_storage->name = $destination; + + if ($source_class_storage->aliases) { + $destination_class_storage->aliases = clone $source_class_storage->aliases; + $destination_class_storage->aliases->namespace = $destination_ns; + } + + $destination_class_storage->location = $source_class_storage->location; + $destination_class_storage->stmt_location = $source_class_storage->stmt_location; + $destination_class_storage->populated = true; + + $this->codebase->class_transforms[strtolower($source)] = $destination; + + continue; + } + + $source_method_id = new MethodIdentifier( + $source_parts[0], + strtolower($source_parts[1]) + ); + + if ($this->codebase->methods->methodExists($source_method_id)) { + if ($this->codebase->methods->methodExists( + new MethodIdentifier( + $destination_parts[0], + strtolower($destination_parts[1]) + ) + )) { + throw new RefactorException( + 'Destination method ' . $destination . ' already exists' + ); + } + + if (!$this->codebase->classlikes->classExists($destination_parts[0])) { + throw new RefactorException( + 'Destination class ' . $destination_parts[0] . ' doesn’t exist' + ); + } + + $source_lc = strtolower($source); + if (strtolower($source_parts[0]) !== strtolower($destination_parts[0])) { + $source_method_storage = $this->codebase->methods->getStorage($source_method_id); + $destination_class_storage + = $this->codebase->classlike_storage_provider->get($destination_parts[0]); + + if (!$source_method_storage->is_static + && !isset( + $destination_class_storage->parent_classes[strtolower($source_method_id->fq_class_name)] + ) + ) { + throw new RefactorException( + 'Cannot move non-static method ' . $source + . ' into unrelated class ' . $destination_parts[0] + ); + } + + $this->codebase->methods_to_move[$source_lc]= $destination; + } else { + $this->codebase->methods_to_rename[$source_lc] = $destination_parts[1]; + } + + $this->codebase->call_transforms[$source_lc . '\((.*\))'] = $destination . '($1)'; + continue; + } + + if ($source_parts[1][0] === '$') { + if ($destination_parts[1][0] !== '$') { + throw new RefactorException( + 'Destination property must be of the form Foo::$bar' + ); + } + + if (!$this->codebase->properties->propertyExists($source, true)) { + throw new RefactorException( + 'Property ' . $source . ' does not exist' + ); + } + + if ($this->codebase->properties->propertyExists($destination, true)) { + throw new RefactorException( + 'Destination property ' . $destination . ' already exists' + ); + } + + if (!$this->codebase->classlikes->classExists($destination_parts[0])) { + throw new RefactorException( + 'Destination class ' . $destination_parts[0] . ' doesn’t exist' + ); + } + + $source_id = strtolower($source_parts[0]) . '::' . $source_parts[1]; + + if (strtolower($source_parts[0]) !== strtolower($destination_parts[0])) { + $source_storage = $this->codebase->properties->getStorage($source); + + if (!$source_storage->is_static) { + throw new RefactorException( + 'Cannot move non-static property ' . $source + ); + } + + $this->codebase->properties_to_move[$source_id] = $destination; + } else { + $this->codebase->properties_to_rename[$source_id] = substr($destination_parts[1], 1); + } + + $this->codebase->property_transforms[$source_id] = $destination; + continue; + } + + $source_class_constants = $this->codebase->classlikes->getConstantsForClass( + $source_parts[0], + ReflectionProperty::IS_PRIVATE + ); + + if (isset($source_class_constants[$source_parts[1]])) { + if (!$this->codebase->classlikes->hasFullyQualifiedClassName($destination_parts[0])) { + throw new RefactorException( + 'Destination class ' . $destination_parts[0] . ' doesn’t exist' + ); + } + + $destination_class_constants = $this->codebase->classlikes->getConstantsForClass( + $destination_parts[0], + ReflectionProperty::IS_PRIVATE + ); + + if (isset($destination_class_constants[$destination_parts[1]])) { + throw new RefactorException( + 'Destination constant ' . $destination . ' already exists' + ); + } + + $source_id = strtolower($source_parts[0]) . '::' . $source_parts[1]; + + if (strtolower($source_parts[0]) !== strtolower($destination_parts[0])) { + $this->codebase->class_constants_to_move[$source_id] = $destination; + } else { + $this->codebase->class_constants_to_rename[$source_id] = $destination_parts[1]; + } + + $this->codebase->class_constant_transforms[$source_id] = $destination; + continue; + } + + throw new RefactorException( + 'Psalm cannot locate ' . $source + ); + } + } + + public function prepareMigration(): void + { + if (!$this->codebase->alter_code) { + throw new UnexpectedValueException('Should not be checking references'); + } + + $this->codebase->classlikes->moveMethods( + $this->codebase->methods, + $this->progress + ); + + $this->codebase->classlikes->moveProperties( + $this->codebase->properties, + $this->progress + ); + + $this->codebase->classlikes->moveClassConstants( + $this->progress + ); + } + + public function migrateCode(): void + { + if (!$this->codebase->alter_code) { + throw new UnexpectedValueException('Should not be checking references'); + } + + $migration_manipulations = FileManipulationBuffer::getMigrationManipulations( + $this->codebase->file_provider + ); + + if ($migration_manipulations) { + foreach ($migration_manipulations as $file_path => $file_manipulations) { + usort( + $file_manipulations, + function (FileManipulation $a, FileManipulation $b): int { + if ($a->start === $b->start) { + if ($b->end === $a->end) { + return $b->insertion_text > $a->insertion_text ? 1 : -1; + } + + return $b->end > $a->end ? 1 : -1; + } + + return $b->start > $a->start ? 1 : -1; + } + ); + + $existing_contents = $this->codebase->file_provider->getContents($file_path); + + foreach ($file_manipulations as $manipulation) { + $existing_contents = $manipulation->transform($existing_contents); + } + + $this->codebase->file_provider->setContents($file_path, $existing_contents); + } + } + + if ($this->codebase->classes_to_move) { + foreach ($this->codebase->classes_to_move as $source => $destination) { + $source_class_storage = $this->codebase->classlike_storage_provider->get($source); + + if (!$source_class_storage->location) { + continue; + } + + $potential_file_path = $this->config->getPotentialComposerFilePathForClassLike($destination); + + if ($potential_file_path && !file_exists($potential_file_path)) { + $containing_dir = dirname($potential_file_path); + + if (!file_exists($containing_dir)) { + mkdir($containing_dir, 0777, true); + } + + rename($source_class_storage->location->file_path, $potential_file_path); + } + } + } + } + + public function findReferencesTo(string $symbol): void + { + if (!$this->stdout_report_options) { + throw new UnexpectedValueException('Not expecting to emit output'); + } + + $locations = $this->codebase->findReferencesToSymbol($symbol); + + foreach ($locations as $location) { + $snippet = $location->getSnippet(); + + $snippet_bounds = $location->getSnippetBounds(); + $selection_bounds = $location->getSelectionBounds(); + + $selection_start = $selection_bounds[0] - $snippet_bounds[0]; + $selection_length = $selection_bounds[1] - $selection_bounds[0]; + + echo $location->file_name . ':' . $location->getLineNumber() . "\n" . + ( + $this->stdout_report_options->use_color + ? substr($snippet, 0, $selection_start) . + "\e[97;42m" . substr($snippet, $selection_start, $selection_length) . + "\e[0m" . substr($snippet, $selection_length + $selection_start) + : $snippet + ) . "\n" . "\n"; + } + } + + public function checkDir(string $dir_name): void + { + $this->file_reference_provider->loadReferenceCache(); + + $this->config->visitPreloadedStubFiles($this->codebase, $this->progress); + + $this->checkDirWithConfig($dir_name, $this->config, true); + + $this->progress->write($this->generatePHPVersionMessage()); + $this->progress->startScanningFiles(); + + $this->config->initializePlugins($this); + + $this->codebase->scanFiles($this->threads); + + $this->config->visitStubFiles($this->codebase, $this->progress); + + $this->progress->startAnalyzingFiles(); + + $this->codebase->analyzer->analyzeFiles( + $this, + $this->threads, + $this->codebase->alter_code, + $this->codebase->find_unused_code === 'always' + ); + } + + private function checkDirWithConfig(string $dir_name, Config $config, bool $allow_non_project_files = false): void + { + $file_extensions = $config->getFileExtensions(); + $filter = $allow_non_project_files ? null : [$this->config, 'isInProjectDirs']; + + $file_paths = $this->file_provider->getFilesInDir( + $dir_name, + $file_extensions, + $filter + ); + + $files_to_scan = []; + + foreach ($file_paths as $file_path) { + $files_to_scan[$file_path] = $file_path; + } + + $this->codebase->addFilesToAnalyze($files_to_scan); + } + + public function addProjectFile(string $file_path): void + { + $this->project_files[$file_path] = $file_path; + } + + public function addExtraFile(string $file_path): void + { + $this->extra_files[$file_path] = $file_path; + } + + /** + * @return list + */ + protected function getDiffFiles(): array + { + if (!$this->parser_cache_provider || !$this->project_cache_provider) { + throw new UnexpectedValueException('Parser cache provider cannot be null here'); + } + + $diff_files = []; + + $last_run = $this->project_cache_provider->getLastRun(PSALM_VERSION); + + foreach ($this->project_files as $file_path) { + if ($this->file_provider->getModifiedTime($file_path) >= $last_run + && $this->parser_cache_provider->loadExistingFileContentsFromCache($file_path) + !== $this->file_provider->getContents($file_path) + ) { + $diff_files[] = $file_path; + } + } + + return $diff_files; + } + + /** + * @param array $file_list + * + */ + private function checkDiffFilesWithConfig(Config $config, array $file_list = []): void + { + $files_to_scan = []; + + foreach ($file_list as $file_path) { + if (!$this->file_provider->fileExists($file_path)) { + continue; + } + + if (!$config->isInProjectDirs($file_path)) { + $this->progress->debug('skipping ' . $file_path . "\n"); + + continue; + } + + $files_to_scan[$file_path] = $file_path; + } + + $this->codebase->addFilesToAnalyze($files_to_scan); + } + + public function checkFile(string $file_path): void + { + $this->progress->debug('Checking ' . $file_path . "\n"); + + $this->config->visitPreloadedStubFiles($this->codebase, $this->progress); + + $this->config->hide_external_errors = $this->config->isInProjectDirs($file_path); + + $this->codebase->addFilesToAnalyze([$file_path => $file_path]); + + $this->file_reference_provider->loadReferenceCache(); + + $this->progress->write($this->generatePHPVersionMessage()); + $this->progress->startScanningFiles(); + + $this->config->initializePlugins($this); + + $this->codebase->scanFiles($this->threads); + + $this->config->visitStubFiles($this->codebase, $this->progress); + + $this->progress->startAnalyzingFiles(); + + $this->codebase->analyzer->analyzeFiles( + $this, + $this->threads, + $this->codebase->alter_code, + $this->codebase->find_unused_code === 'always' + ); + } + + /** + * @param string[] $paths_to_check + */ + public function checkPaths(array $paths_to_check): void + { + $this->config->visitPreloadedStubFiles($this->codebase, $this->progress); + $this->visitAutoloadFiles(); + + $this->codebase->scanner->addFilesToShallowScan($this->extra_files); + + foreach ($paths_to_check as $path) { + $this->progress->debug('Checking ' . $path . "\n"); + + if (is_dir($path)) { + $this->checkDirWithConfig($path, $this->config, true); + } elseif (is_file($path)) { + $this->codebase->addFilesToAnalyze([$path => $path]); + $this->config->hide_external_errors = $this->config->isInProjectDirs($path); + } + } + + $this->file_reference_provider->loadReferenceCache(); + + $this->progress->write($this->generatePHPVersionMessage()); + $this->progress->startScanningFiles(); + + $this->config->initializePlugins($this); + + + $this->codebase->scanFiles($this->threads); + + $this->config->visitStubFiles($this->codebase, $this->progress); + + $this->progress->startAnalyzingFiles(); + + $this->codebase->analyzer->analyzeFiles( + $this, + $this->threads, + $this->codebase->alter_code, + $this->codebase->find_unused_code === 'always' + ); + + if ($this->stdout_report_options + && in_array( + $this->stdout_report_options->format, + [Report::TYPE_CONSOLE, Report::TYPE_PHP_STORM] + ) + && $this->codebase->collect_references + ) { + fwrite( + STDERR, + PHP_EOL . 'To whom it may concern: Psalm cannot detect unused classes, methods and properties' + . PHP_EOL . 'when analyzing individual files and folders. Run on the full project to enable' + . PHP_EOL . 'complete unused code detection.' . PHP_EOL + ); + } + } + + public function getConfig(): Config + { + return $this->config; + } + + /** + * @param array $diff_files + * + * @return array + */ + public function getReferencedFilesFromDiff(array $diff_files, bool $include_referencing_files = true): array + { + $all_inherited_files_to_check = $diff_files; + + while ($diff_files) { + $diff_file = array_shift($diff_files); + + $dependent_files = $this->file_reference_provider->getFilesInheritingFromFile($diff_file); + + $new_dependent_files = array_diff($dependent_files, $all_inherited_files_to_check); + + $all_inherited_files_to_check = array_merge($all_inherited_files_to_check, $new_dependent_files); + $diff_files = array_merge($diff_files, $new_dependent_files); + } + + $all_files_to_check = $all_inherited_files_to_check; + + if ($include_referencing_files) { + foreach ($all_inherited_files_to_check as $file_name) { + $dependent_files = $this->file_reference_provider->getFilesReferencingFile($file_name); + $all_files_to_check = array_merge($dependent_files, $all_files_to_check); + } + } + + return array_combine($all_files_to_check, $all_files_to_check); + } + + public function fileExists(string $file_path): bool + { + return $this->file_provider->fileExists($file_path); + } + + public function alterCodeAfterCompletion( + bool $dry_run = false, + bool $safe_types = false + ): void { + $this->codebase->alter_code = true; + $this->codebase->infer_types_from_usage = true; + $this->show_issues = false; + $this->dry_run = $dry_run; + $this->only_replace_php_types_with_non_docblock_types = $safe_types; + } + + /** + * @param array $to_refactor + * + */ + public function refactorCodeAfterCompletion(array $to_refactor): void + { + $this->to_refactor = $to_refactor; + $this->codebase->alter_code = true; + $this->show_issues = false; + } + + /** + * @param 'cli'|'config'|'composer'|'tests' $source + */ + public function setPhpVersion(string $version, string $source): void + { + if (!preg_match('/^(5\.[456]|7\.[01234]|8\.[01])(\..*)?$/', $version)) { + throw new UnexpectedValueException('Expecting a version number in the format x.y'); + } + + [$php_major_version, $php_minor_version] = explode('.', $version); + + $php_major_version = (int) $php_major_version; + $php_minor_version = (int) $php_minor_version; + + if ($this->codebase->php_major_version !== $php_major_version + || $this->codebase->php_minor_version !== $php_minor_version + ) { + // reset lexer and parser when php version changes + StatementsProvider::clearLexer(); + StatementsProvider::clearParser(); + } + + $this->codebase->php_major_version = $php_major_version; + $this->codebase->php_minor_version = $php_minor_version; + $this->codebase->analysis_php_version_id = $php_major_version * 10000 + $php_minor_version * 100; + $this->codebase->php_version_source = $source; + } + + /** + * @param array $issues + * @throws UnsupportedIssueToFixException + * + */ + public function setIssuesToFix(array $issues): void + { + $supported_issues_to_fix = static::getSupportedIssuesToFix(); + + $supported_issues_to_fix[] = 'MissingImmutableAnnotation'; + $supported_issues_to_fix[] = 'MissingPureAnnotation'; + $supported_issues_to_fix[] = 'MissingThrowsDocblock'; + + $unsupportedIssues = array_diff(array_keys($issues), $supported_issues_to_fix); + + if (! empty($unsupportedIssues)) { + throw new UnsupportedIssueToFixException( + 'Psalm doesn\'t know how to fix issue(s): ' . implode(', ', $unsupportedIssues) . PHP_EOL + . 'Supported issues to fix are: ' . implode(',', $supported_issues_to_fix) + ); + } + + $this->issues_to_fix = $issues; + } + + public function setAllIssuesToFix(): void + { + $keyed_issues = array_fill_keys(static::getSupportedIssuesToFix(), true); + + $this->setIssuesToFix($keyed_issues); + } + + /** + * @return array + */ + public function getIssuesToFix(): array + { + return $this->issues_to_fix; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + public function getFileAnalyzerForClassLike(string $fq_class_name): FileAnalyzer + { + $fq_class_name_lc = strtolower($fq_class_name); + + $file_path = $this->codebase->scanner->getClassLikeFilePath($fq_class_name_lc); + + return new FileAnalyzer( + $this, + $file_path, + $this->config->shortenFileName($file_path) + ); + } + + public function getMethodMutations( + MethodIdentifier $original_method_id, + Context $this_context, + string $root_file_path, + string $root_file_name + ): void { + $fq_class_name = $original_method_id->fq_class_name; + + $appearing_method_id = $this->codebase->methods->getAppearingMethodId($original_method_id); + + if (!$appearing_method_id) { + // this can happen for some abstract classes implementing (but not fully) interfaces + return; + } + + $appearing_fq_class_name = $appearing_method_id->fq_class_name; + + $appearing_class_storage = $this->classlike_storage_provider->get($appearing_fq_class_name); + + if (!$appearing_class_storage->user_defined) { + return; + } + + $file_analyzer = $this->getFileAnalyzerForClassLike($fq_class_name); + + $file_analyzer->setRootFilePath($root_file_path, $root_file_name); + + if ($appearing_fq_class_name !== $fq_class_name) { + $file_analyzer = $this->getFileAnalyzerForClassLike($appearing_fq_class_name); + } + + $stmts = $this->codebase->getStatementsForFile( + $file_analyzer->getFilePath() + ); + + $file_analyzer->populateCheckers($stmts); + + if (!$this_context->self) { + $this_context->self = $fq_class_name; + $this_context->vars_in_scope['$this'] = Type::parseString($fq_class_name); + } + + $file_analyzer->getMethodMutations($appearing_method_id, $this_context, true); + + $file_analyzer->class_analyzers_to_analyze = []; + $file_analyzer->interface_analyzers_to_analyze = []; + $file_analyzer->clearSourceBeforeDestruction(); + } + + public function getFunctionLikeAnalyzer( + MethodIdentifier $method_id, + string $file_path + ): ?FunctionLikeAnalyzer { + $file_analyzer = new FileAnalyzer( + $this, + $file_path, + $this->config->shortenFileName($file_path) + ); + + $stmts = $this->codebase->getStatementsForFile( + $file_analyzer->getFilePath() + ); + + $file_analyzer->populateCheckers($stmts); + + $function_analyzer = $file_analyzer->getFunctionLikeAnalyzer($method_id); + + $file_analyzer->class_analyzers_to_analyze = []; + $file_analyzer->interface_analyzers_to_analyze = []; + + return $function_analyzer; + } + + /** + * Adapted from https://gist.github.com/divinity76/01ef9ca99c111565a72d3a8a6e42f7fb + * returns number of cpu cores + * Copyleft 2018, license: WTFPL + * @throws RuntimeException + * @throws LogicException + * @psalm-suppress ForbiddenCode + */ + public static function getCpuCount(): int + { + if (defined('PHP_WINDOWS_VERSION_MAJOR')) { + /* + $str = trim((string) shell_exec('wmic cpu get NumberOfCores 2>&1')); + if (!preg_match('/(\d+)/', $str, $matches)) { + throw new RuntimeException('wmic failed to get number of cpu cores on windows!'); + } + return ((int) $matches [1]); + */ + return 1; + } + + if (ini_get('pcre.jit') === '1' + && PHP_OS === 'Darwin' + && version_compare(PHP_VERSION, '7.3.0') >= 0 + && version_compare(PHP_VERSION, '7.4.0') < 0 + ) { + return 1; + } + + if (!extension_loaded('pcntl') || !function_exists('shell_exec')) { + return 1; + } + + $has_nproc = trim((string) @shell_exec('command -v nproc')); + if ($has_nproc) { + $ret = @shell_exec('nproc'); + if (is_string($ret)) { + $ret = trim($ret); + $tmp = filter_var($ret, FILTER_VALIDATE_INT); + if (is_int($tmp)) { + return $tmp; + } + } + } + + $ret = @shell_exec('sysctl -n hw.ncpu'); + if (is_string($ret)) { + $ret = trim($ret); + $tmp = filter_var($ret, FILTER_VALIDATE_INT); + if (is_int($tmp)) { + return $tmp; + } + } + + if (is_readable('/proc/cpuinfo')) { + $cpuinfo = file_get_contents('/proc/cpuinfo'); + $count = substr_count($cpuinfo, 'processor'); + if ($count > 0) { + return $count; + } + } + + throw new LogicException('failed to detect number of CPUs!'); + } + + /** + * @return array + * + * @psalm-pure + */ + public static function getSupportedIssuesToFix(): array + { + return array_map( + /** @param class-string $issue_class */ + function (string $issue_class): string { + $parts = explode('\\', $issue_class); + return end($parts); + }, + self::SUPPORTED_ISSUES_TO_FIX + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php new file mode 100644 index 00000000..4bbbd9bd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php @@ -0,0 +1,529 @@ + $stmts + * + */ + public static function doesEverBreak(array $stmts): bool + { + if (empty($stmts)) { + return false; + } + + for ($i = count($stmts) - 1; $i >= 0; --$i) { + $stmt = $stmts[$i]; + + if ($stmt instanceof PhpParser\Node\Stmt\Break_) { + return true; + } + + if ($stmt instanceof PhpParser\Node\Stmt\If_) { + if (self::doesEverBreak($stmt->stmts)) { + return true; + } + + if ($stmt->else && self::doesEverBreak($stmt->else->stmts)) { + return true; + } + + foreach ($stmt->elseifs as $elseif) { + if (self::doesEverBreak($elseif->stmts)) { + return true; + } + } + } + } + + return false; + } + + /** + * @param array $stmts + * @param array $exit_functions + * @param list<'loop'|'switch'> $break_types + * @param bool $return_is_exit Exit and Throw statements are treated differently from return if this is false + * + * @return list + * + * @psalm-suppress ComplexMethod nothing much we can do + */ + public static function getControlActions( + array $stmts, + ?NodeDataProvider $nodes, + array $exit_functions, + array $break_types, + bool $return_is_exit = true + ): array { + if (empty($stmts)) { + return [self::ACTION_NONE]; + } + + $control_actions = []; + + foreach ($stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\Return_ || + $stmt instanceof PhpParser\Node\Stmt\Throw_ || + ($stmt instanceof PhpParser\Node\Stmt\Expression && $stmt->expr instanceof PhpParser\Node\Expr\Exit_) + ) { + if (!$return_is_exit && $stmt instanceof PhpParser\Node\Stmt\Return_) { + $stmt_return_type = null; + if ($nodes && $stmt->expr) { + $stmt_return_type = $nodes->getType($stmt->expr); + } + + // don't consider a return if the expression never returns (e.g. a throw inside a short closure) + if ($stmt_return_type && ($stmt_return_type->isNever() || $stmt_return_type->isEmpty())) { + return array_values(array_unique(array_merge($control_actions, [self::ACTION_END]))); + } + + return array_values(array_unique(array_merge($control_actions, [self::ACTION_RETURN]))); + } + + return array_values(array_unique(array_merge($control_actions, [self::ACTION_END]))); + } + + if ($stmt instanceof PhpParser\Node\Stmt\Expression) { + // This allows calls to functions that always exit to act as exit statements themselves + if ($nodes + && ($stmt_expr_type = $nodes->getType($stmt->expr)) + && $stmt_expr_type->isNever() + ) { + return array_values(array_unique(array_merge($control_actions, [self::ACTION_END]))); + } + + if ($exit_functions) { + if ($stmt->expr instanceof PhpParser\Node\Expr\FuncCall + || $stmt->expr instanceof PhpParser\Node\Expr\StaticCall + ) { + if ($stmt->expr instanceof PhpParser\Node\Expr\FuncCall) { + /** @var string|null */ + $resolved_name = $stmt->expr->name->getAttribute('resolvedName'); + + if ($resolved_name && isset($exit_functions[strtolower($resolved_name)])) { + return array_values(array_unique(array_merge($control_actions, [self::ACTION_END]))); + } + } elseif ($stmt->expr->class instanceof PhpParser\Node\Name + && $stmt->expr->name instanceof PhpParser\Node\Identifier + ) { + /** @var string|null */ + $resolved_class_name = $stmt->expr->class->getAttribute('resolvedName'); + + if ($resolved_class_name + && isset($exit_functions[strtolower($resolved_class_name . '::' . $stmt->expr->name)]) + ) { + return array_values(array_unique(array_merge($control_actions, [self::ACTION_END]))); + } + } + } + } + + continue; + } + + if ($stmt instanceof PhpParser\Node\Stmt\Continue_) { + $count = !$stmt->num + ? 1 + : ($stmt->num instanceof PhpParser\Node\Scalar\LNumber ? $stmt->num->value : null); + + if ($break_types && $count !== null && count($break_types) >= $count) { + if ($break_types[count($break_types) - $count] === 'switch') { + return array_merge($control_actions, [self::ACTION_LEAVE_SWITCH]); + } + + return array_values($control_actions); + } + + return array_values(array_unique(array_merge($control_actions, [self::ACTION_CONTINUE]))); + } + + if ($stmt instanceof PhpParser\Node\Stmt\Break_) { + $count = !$stmt->num + ? 1 + : ($stmt->num instanceof PhpParser\Node\Scalar\LNumber ? $stmt->num->value : null); + + if ($break_types && $count !== null && count($break_types) >= $count) { + if ($break_types[count($break_types) - $count] === 'switch') { + return array_merge($control_actions, [self::ACTION_LEAVE_SWITCH]); + } + + return array_values($control_actions); + } + + return array_values(array_unique(array_merge($control_actions, [self::ACTION_BREAK]))); + } + + if ($stmt instanceof PhpParser\Node\Stmt\If_) { + $if_statement_actions = self::getControlActions( + $stmt->stmts, + $nodes, + $exit_functions, + $break_types, + $return_is_exit + ); + + $all_leave = !array_filter( + $if_statement_actions, + function ($action) { + return $action === self::ACTION_NONE; + } + ); + + $else_statement_actions = $stmt->else + ? self::getControlActions( + $stmt->else->stmts, + $nodes, + $exit_functions, + $break_types, + $return_is_exit + ) : []; + + $all_leave = $all_leave + && $else_statement_actions + && !array_filter( + $else_statement_actions, + function ($action) { + return $action === self::ACTION_NONE; + } + ); + + $all_elseif_actions = []; + + if ($stmt->elseifs) { + foreach ($stmt->elseifs as $elseif) { + $elseif_control_actions = self::getControlActions( + $elseif->stmts, + $nodes, + $exit_functions, + $break_types, + $return_is_exit + ); + + $all_leave = $all_leave + && !array_filter( + $elseif_control_actions, + function ($action) { + return $action === self::ACTION_NONE; + } + ); + + $all_elseif_actions = array_merge($elseif_control_actions, $all_elseif_actions); + } + } + + if ($all_leave) { + return array_values( + array_unique( + array_merge( + $control_actions, + $if_statement_actions, + $else_statement_actions, + $all_elseif_actions + ) + ) + ); + } + + $control_actions = array_filter( + array_merge( + $control_actions, + $if_statement_actions, + $else_statement_actions, + $all_elseif_actions + ), + function ($action) { + return $action !== self::ACTION_NONE; + } + ); + } + + if ($stmt instanceof PhpParser\Node\Stmt\Switch_) { + $has_ended = false; + $has_non_breaking_default = false; + $has_default_terminator = false; + + $all_case_actions = []; + + // iterate backwards in a case statement + for ($d = count($stmt->cases) - 1; $d >= 0; --$d) { + $case = $stmt->cases[$d]; + + $case_actions = self::getControlActions( + $case->stmts, + $nodes, + $exit_functions, + array_merge($break_types, ['switch']), + $return_is_exit + ); + + if (array_intersect([ + self::ACTION_LEAVE_SWITCH, + self::ACTION_BREAK, + self::ACTION_CONTINUE + ], $case_actions) + ) { + continue 2; + } + + if (!$case->cond) { + $has_non_breaking_default = true; + } + + $case_does_end = !array_diff( + $control_actions, + [self::ACTION_END, self::ACTION_RETURN] + ); + + if ($case_does_end) { + $has_ended = true; + } + + $all_case_actions = array_merge( + $all_case_actions, + $case_actions + ); + + if (!$case_does_end && !$has_ended) { + continue 2; + } + + if ($has_non_breaking_default && $case_does_end) { + $has_default_terminator = true; + } + } + + $all_case_actions = array_filter( + $all_case_actions, + function ($action) { + return $action !== self::ACTION_NONE; + } + ); + + if ($has_default_terminator || $stmt->getAttribute('allMatched', false)) { + return array_values(array_unique(array_merge($control_actions, $all_case_actions))); + } + + $control_actions = array_merge( + $control_actions, + $all_case_actions + ); + } + + if ($stmt instanceof PhpParser\Node\Stmt\Do_ + || $stmt instanceof PhpParser\Node\Stmt\While_ + || $stmt instanceof PhpParser\Node\Stmt\Foreach_ + || $stmt instanceof PhpParser\Node\Stmt\For_ + ) { + $loop_actions = self::getControlActions( + $stmt->stmts, + $nodes, + $exit_functions, + array_merge($break_types, ['loop']), + $return_is_exit + ); + + $control_actions = array_filter( + array_merge($control_actions, $loop_actions), + function ($action) { + return $action !== self::ACTION_NONE; + } + ); + + if ($stmt instanceof PhpParser\Node\Stmt\While_ + && $nodes + && ($stmt_expr_type = $nodes->getType($stmt->cond)) + && $stmt_expr_type->isAlwaysTruthy() + ) { + //infinite while loop that only return don't have an exit path + $have_exit_path = (bool)array_diff( + $control_actions, + [self::ACTION_END, self::ACTION_RETURN] + ); + + if (!$have_exit_path) { + return array_values(array_unique($control_actions)); + } + } + + if ($stmt instanceof PhpParser\Node\Stmt\For_ + && $nodes + ) { + $is_infinite_loop = true; + if ($stmt->cond) { + foreach ($stmt->cond as $cond) { + $stmt_expr_type = $nodes->getType($cond); + if (!$stmt_expr_type || !$stmt_expr_type->isAlwaysTruthy()) { + $is_infinite_loop = false; + } + } + } + + if ($is_infinite_loop) { + //infinite while loop that only return don't have an exit path + $have_exit_path = (bool)array_diff( + $control_actions, + [self::ACTION_END, self::ACTION_RETURN] + ); + + if (!$have_exit_path) { + return array_values(array_unique($control_actions)); + } + } + } + } + + if ($stmt instanceof PhpParser\Node\Stmt\TryCatch) { + $try_statement_actions = self::getControlActions( + $stmt->stmts, + $nodes, + $exit_functions, + $break_types, + $return_is_exit + ); + + $try_leaves = !array_filter( + $try_statement_actions, + function ($action) { + return $action === self::ACTION_NONE; + } + ); + + $all_catch_actions = []; + + if ($stmt->catches) { + $all_leave = $try_leaves; + + foreach ($stmt->catches as $catch) { + $catch_actions = self::getControlActions( + $catch->stmts, + $nodes, + $exit_functions, + $break_types, + $return_is_exit + ); + + $all_leave = $all_leave + && !array_filter( + $catch_actions, + function ($action) { + return $action === self::ACTION_NONE; + } + ); + + if (!$all_leave) { + $control_actions = array_merge($control_actions, $catch_actions); + } else { + $all_catch_actions = array_merge($all_catch_actions, $catch_actions); + } + } + + if ($all_leave && $try_statement_actions !== [self::ACTION_NONE]) { + return array_values( + array_unique( + array_merge( + $control_actions, + $try_statement_actions, + $all_catch_actions + ) + ) + ); + } + } elseif ($try_leaves) { + return array_values(array_unique(array_merge($control_actions, $try_statement_actions))); + } + + if ($stmt->finally && $stmt->finally->stmts) { + $finally_statement_actions = self::getControlActions( + $stmt->finally->stmts, + $nodes, + $exit_functions, + $break_types, + $return_is_exit + ); + + if (!in_array(self::ACTION_NONE, $finally_statement_actions, true)) { + return array_merge( + array_filter( + $control_actions, + function ($action) { + return $action !== self::ACTION_NONE; + } + ), + $finally_statement_actions + ); + } + } + + $control_actions = array_filter( + array_merge($control_actions, $try_statement_actions), + function ($action) { + return $action !== self::ACTION_NONE; + } + ); + } + } + + $control_actions[] = self::ACTION_NONE; + + return array_values(array_unique($control_actions)); + } + + /** + * @param array $stmts + * + */ + public static function onlyThrowsOrExits(NodeTypeProvider $type_provider, array $stmts): bool + { + if (empty($stmts)) { + return false; + } + + for ($i = count($stmts) - 1; $i >= 0; --$i) { + $stmt = $stmts[$i]; + + if ($stmt instanceof PhpParser\Node\Stmt\Throw_ + || ($stmt instanceof PhpParser\Node\Stmt\Expression + && $stmt->expr instanceof PhpParser\Node\Expr\Exit_) + ) { + return true; + } + + if ($stmt instanceof PhpParser\Node\Stmt\Expression) { + $stmt_type = $type_provider->getType($stmt->expr); + + if ($stmt_type && $stmt_type->isNever()) { + return true; + } + } + } + + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php new file mode 100644 index 00000000..8be2d28a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php @@ -0,0 +1,182 @@ +source); + } + + public function getAliases(): Aliases + { + return $this->source->getAliases(); + } + + /** + * @return array + */ + public function getAliasedClassesFlipped(): array + { + return $this->source->getAliasedClassesFlipped(); + } + + /** + * @return array + */ + public function getAliasedClassesFlippedReplaceable(): array + { + return $this->source->getAliasedClassesFlippedReplaceable(); + } + + public function getFQCLN(): ?string + { + return $this->source->getFQCLN(); + } + + public function getClassName(): ?string + { + return $this->source->getClassName(); + } + + public function getParentFQCLN(): ?string + { + return $this->source->getParentFQCLN(); + } + + public function getFileName(): string + { + return $this->source->getFileName(); + } + + public function getFilePath(): string + { + return $this->source->getFilePath(); + } + + public function getRootFileName(): string + { + return $this->source->getRootFileName(); + } + + public function getRootFilePath(): string + { + return $this->source->getRootFilePath(); + } + + public function setRootFilePath(string $file_path, string $file_name): void + { + $this->source->setRootFilePath($file_path, $file_name); + } + + public function hasParentFilePath(string $file_path): bool + { + return $this->source->hasParentFilePath($file_path); + } + + public function hasAlreadyRequiredFilePath(string $file_path): bool + { + return $this->source->hasAlreadyRequiredFilePath($file_path); + } + + public function getRequireNesting(): int + { + return $this->source->getRequireNesting(); + } + + /** + * @psalm-mutation-free + */ + public function getSource(): StatementsSource + { + return $this->source; + } + + /** + * Get a list of suppressed issues + * + * @return array + */ + public function getSuppressedIssues(): array + { + return $this->source->getSuppressedIssues(); + } + + /** + * @param array $new_issues + */ + public function addSuppressedIssues(array $new_issues): void + { + $this->source->addSuppressedIssues($new_issues); + } + + /** + * @param array $new_issues + */ + public function removeSuppressedIssues(array $new_issues): void + { + $this->source->removeSuppressedIssues($new_issues); + } + + public function getNamespace(): ?string + { + return $this->source->getNamespace(); + } + + public function isStatic(): bool + { + return $this->source->isStatic(); + } + + /** + * @psalm-mutation-free + */ + public function getCodebase(): Codebase + { + return $this->source->getCodebase(); + } + + /** + * @psalm-mutation-free + */ + public function getProjectAnalyzer(): ProjectAnalyzer + { + return $this->source->getProjectAnalyzer(); + } + + /** + * @psalm-mutation-free + */ + public function getFileAnalyzer(): FileAnalyzer + { + return $this->source->getFileAnalyzer(); + } + + /** + * @return array>|null + */ + public function getTemplateTypeMap(): ?array + { + return $this->source->getTemplateTypeMap(); + } + + public function getNodeTypeProvider(): NodeTypeProvider + { + return $this->source->getNodeTypeProvider(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php new file mode 100644 index 00000000..aeeb964f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php @@ -0,0 +1,210 @@ +break_types[] = 'loop'; + $do_context->inside_loop = true; + + $codebase = $statements_analyzer->getCodebase(); + + if ($codebase->alter_code) { + $do_context->branch_point = $do_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); + } + + $loop_scope = new LoopScope($do_context, $context); + $loop_scope->protected_var_ids = $context->protected_var_ids; + + self::analyzeDoNaively($statements_analyzer, $stmt, $do_context, $loop_scope); + + $mixed_var_ids = []; + + foreach ($do_context->vars_in_scope as $var_id => $type) { + if ($type->hasMixed()) { + $mixed_var_ids[] = $var_id; + } + } + + $cond_id = spl_object_id($stmt->cond); + + $while_clauses = FormulaGenerator::getFormula( + $cond_id, + $cond_id, + $stmt->cond, + $context->self, + $statements_analyzer, + $codebase + ); + + $while_clauses = array_values( + array_filter( + $while_clauses, + function (Clause $c) use ($mixed_var_ids): bool { + $keys = array_keys($c->possibilities); + + $mixed_var_ids = array_diff($mixed_var_ids, $keys); + + foreach ($keys as $key) { + foreach ($mixed_var_ids as $mixed_var_id) { + if (preg_match('/^' . preg_quote($mixed_var_id, '/') . '(\[|-)/', $key)) { + return false; + } + } + } + + return true; + } + ) + ); + + if (!$while_clauses) { + $while_clauses = [new Clause([], $cond_id, $cond_id, true)]; + } + + if (LoopAnalyzer::analyze( + $statements_analyzer, + $stmt->stmts, + WhileAnalyzer::getAndExpressions($stmt->cond), + [], + $loop_scope, + $inner_loop_context, + true, + true + ) === false) { + return false; + } + + // because it's a do {} while, inner loop vars belong to the main context + if (!$inner_loop_context) { + throw new UnexpectedValueException('There should be an inner loop context'); + } + + $negated_while_clauses = Algebra::negateFormula($while_clauses); + + $negated_while_types = Algebra::getTruthsFromFormula( + Algebra::simplifyCNF( + array_merge($context->clauses, $negated_while_clauses) + ) + ); + + if ($negated_while_types) { + $changed_var_ids = []; + + $inner_loop_context->vars_in_scope = + Reconciler::reconcileKeyedTypes( + $negated_while_types, + [], + $inner_loop_context->vars_in_scope, + $changed_var_ids, + [], + $statements_analyzer, + [], + true, + new CodeLocation($statements_analyzer->getSource(), $stmt->cond) + ); + } + + foreach ($inner_loop_context->vars_in_scope as $var_id => $type) { + // if there are break statements in the loop it's not certain + // that the loop has finished executing, so the assertions at the end + // the loop in the while conditional may not hold + if (in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true)) { + if (isset($loop_scope->possibly_defined_loop_parent_vars[$var_id])) { + $context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $type, + $loop_scope->possibly_defined_loop_parent_vars[$var_id] + ); + } + } else { + $context->vars_in_scope[$var_id] = $type; + } + } + + $do_context->loop_scope = null; + + $context->vars_possibly_in_scope = array_merge( + $context->vars_possibly_in_scope, + $do_context->vars_possibly_in_scope + ); + + $context->referenced_var_ids = array_intersect_key( + $do_context->referenced_var_ids, + $context->referenced_var_ids + ); + + if ($context->collect_exceptions) { + $context->mergeExceptions($inner_loop_context); + } + + return null; + } + + private static function analyzeDoNaively( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Stmt\Do_ $stmt, + Context $context, + LoopScope $loop_scope + ): void { + $do_context = clone $context; + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('RedundantCondition', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['RedundantCondition']); + } + if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['RedundantConditionGivenDocblockType']); + } + if (!in_array('TypeDoesNotContainType', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['TypeDoesNotContainType']); + } + + $do_context->loop_scope = $loop_scope; + + $statements_analyzer->analyze($stmt->stmts, $do_context); + + if (!in_array('RedundantCondition', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['RedundantCondition']); + } + if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['RedundantConditionGivenDocblockType']); + } + if (!in_array('TypeDoesNotContainType', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['TypeDoesNotContainType']); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php new file mode 100644 index 00000000..c45ca9b6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php @@ -0,0 +1,190 @@ +assigned_var_ids; + $context->assigned_var_ids = []; + + $init_var_types = []; + + foreach ($stmt->init as $init) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $init, $context) === false) { + return false; + } + + if ($init instanceof PhpParser\Node\Expr\Assign + && $init->var instanceof PhpParser\Node\Expr\Variable + && is_string($init->var->name) + && ($init_var_type = $statements_analyzer->node_data->getType($init->expr)) + ) { + $init_var_types[$init->var->name] = $init_var_type; + } + } + + $assigned_var_ids = $context->assigned_var_ids; + + $context->assigned_var_ids = array_merge( + $pre_assigned_var_ids, + $assigned_var_ids + ); + + $while_true = !$stmt->cond && !$stmt->init && !$stmt->loop; + + $pre_context = null; + + if ($while_true) { + $pre_context = clone $context; + } + + $for_context = clone $context; + + $for_context->inside_loop = true; + $for_context->break_types[] = 'loop'; + + $codebase = $statements_analyzer->getCodebase(); + + if ($codebase->alter_code) { + $for_context->branch_point = $for_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); + } + + $loop_scope = new LoopScope($for_context, $context); + + $loop_scope->protected_var_ids = array_merge( + $assigned_var_ids, + $context->protected_var_ids + ); + + if (LoopAnalyzer::analyze( + $statements_analyzer, + $stmt->stmts, + $stmt->cond, + $stmt->loop, + $loop_scope, + $inner_loop_context + ) === false) { + return false; + } + + if (!$inner_loop_context) { + throw new UnexpectedValueException('There should be an inner loop context'); + } + + $always_enters_loop = false; + + foreach ($stmt->cond as $cond) { + if ($cond_type = $statements_analyzer->node_data->getType($cond)) { + $always_enters_loop = $cond_type->isAlwaysTruthy(); + } + + if (count($stmt->init) === 1 + && count($stmt->cond) === 1 + && $cond instanceof PhpParser\Node\Expr\BinaryOp + && $cond->right instanceof PhpParser\Node\Scalar\LNumber + && $cond->left instanceof PhpParser\Node\Expr\Variable + && is_string($cond->left->name) + && isset($init_var_types[$cond->left->name]) + && $init_var_types[$cond->left->name]->isSingleIntLiteral() + ) { + $init_value = $init_var_types[$cond->left->name]->getSingleIntLiteral()->value; + $cond_value = $cond->right->value; + + if ($cond instanceof PhpParser\Node\Expr\BinaryOp\Smaller && $init_value < $cond_value) { + $always_enters_loop = true; + break; + } + + if ($cond instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual && $init_value <= $cond_value) { + $always_enters_loop = true; + break; + } + + if ($cond instanceof PhpParser\Node\Expr\BinaryOp\Greater && $init_value > $cond_value) { + $always_enters_loop = true; + break; + } + + if ($cond instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual && $init_value >= $cond_value) { + $always_enters_loop = true; + break; + } + } + } + + if ($while_true) { + $always_enters_loop = true; + } + + $can_leave_loop = !$while_true + || in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true); + + if ($always_enters_loop && $can_leave_loop) { + foreach ($inner_loop_context->vars_in_scope as $var_id => $type) { + // if there are break statements in the loop it's not certain + // that the loop has finished executing, so the assertions at the end + // the loop in the while conditional may not hold + if (in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true) + || in_array(ScopeAnalyzer::ACTION_CONTINUE, $loop_scope->final_actions, true) + ) { + if (isset($loop_scope->possibly_defined_loop_parent_vars[$var_id])) { + $context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $type, + $loop_scope->possibly_defined_loop_parent_vars[$var_id] + ); + } + } else { + $context->vars_in_scope[$var_id] = $type; + } + } + } + + $for_context->loop_scope = null; + + if ($can_leave_loop) { + $context->vars_possibly_in_scope = array_merge( + $context->vars_possibly_in_scope, + $for_context->vars_possibly_in_scope + ); + } elseif ($pre_context) { + $context->vars_possibly_in_scope = $pre_context->vars_possibly_in_scope; + } + + $context->referenced_var_ids = array_intersect_key( + $for_context->referenced_var_ids, + $context->referenced_var_ids + ); + + if ($context->collect_exceptions) { + $context->mergeExceptions($for_context); + } + + return null; + } +} 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 new file mode 100644 index 00000000..bdcf8341 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php @@ -0,0 +1,1149 @@ +getDocComment(); + + $codebase = $statements_analyzer->getCodebase(); + $file_path = $statements_analyzer->getRootFilePath(); + $type_aliases = $codebase->file_storage_provider->get($file_path)->type_aliases; + + if ($doc_comment) { + try { + $var_comments = CommentAnalyzer::getTypeFromComment( + $doc_comment, + $statements_analyzer->getSource(), + $statements_analyzer->getSource()->getAliases(), + $statements_analyzer->getTemplateTypeMap() ?: [], + $type_aliases + ); + } catch (DocblockParseException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($statements_analyzer, $stmt) + ) + ); + } + } + + $safe_var_ids = []; + + if ($stmt->keyVar instanceof PhpParser\Node\Expr\Variable && is_string($stmt->keyVar->name)) { + $safe_var_ids['$' . $stmt->keyVar->name] = true; + } + + if ($stmt->valueVar instanceof PhpParser\Node\Expr\Variable && is_string($stmt->valueVar->name)) { + $safe_var_ids['$' . $stmt->valueVar->name] = true; + $statements_analyzer->foreach_var_locations['$' . $stmt->valueVar->name][] = new CodeLocation( + $statements_analyzer, + $stmt->valueVar + ); + } elseif ($stmt->valueVar instanceof PhpParser\Node\Expr\List_) { + foreach ($stmt->valueVar->items as $list_item) { + if (!$list_item) { + continue; + } + + $list_item_key = $list_item->key; + $list_item_value = $list_item->value; + + if ($list_item_value instanceof PhpParser\Node\Expr\Variable && is_string($list_item_value->name)) { + $safe_var_ids['$' . $list_item_value->name] = true; + } + + if ($list_item_key instanceof PhpParser\Node\Expr\Variable && is_string($list_item_key->name)) { + $safe_var_ids['$' . $list_item_key->name] = true; + } + } + } + + foreach ($var_comments as $var_comment) { + if (!$var_comment->var_id || !$var_comment->type) { + continue; + } + + if (isset($safe_var_ids[$var_comment->var_id])) { + continue; + } + + $comment_type = TypeExpander::expandUnion( + $codebase, + $var_comment->type, + $context->self, + $context->self, + $statements_analyzer->getParentFQCLN() + ); + + $type_location = null; + + if ($var_comment->type_start + && $var_comment->type_end + && $var_comment->line_number + ) { + $type_location = new DocblockTypeLocation( + $statements_analyzer, + $var_comment->type_start, + $var_comment->type_end, + $var_comment->line_number + ); + + if ($codebase->alter_code) { + $codebase->classlikes->handleDocblockTypeInMigration( + $codebase, + $statements_analyzer, + $comment_type, + $type_location, + $context->calling_method_id + ); + } + } + + if (isset($context->vars_in_scope[$var_comment->var_id]) + || VariableFetchAnalyzer::isSuperGlobal($var_comment->var_id) + ) { + if ($codebase->find_unused_variables + && $doc_comment + && $type_location + && isset($context->vars_in_scope[$var_comment->var_id]) + && $context->vars_in_scope[$var_comment->var_id]->getId() === $comment_type->getId() + && !$comment_type->isMixed() + ) { + $project_analyzer = $statements_analyzer->getProjectAnalyzer(); + + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['UnnecessaryVarAnnotation']) + ) { + FileManipulationBuffer::addVarAnnotationToRemove($type_location); + } elseif (IssueBuffer::accepts( + new UnnecessaryVarAnnotation( + 'The @var ' . $comment_type . ' annotation for ' + . $var_comment->var_id . ' is unnecessary', + $type_location + ), + $statements_analyzer->getSuppressedIssues(), + true + )) { + // fall through + } + } + + if (isset($context->vars_in_scope[$var_comment->var_id])) { + $comment_type->parent_nodes = $context->vars_in_scope[$var_comment->var_id]->parent_nodes; + } + + $context->vars_in_scope[$var_comment->var_id] = $comment_type; + } + } + + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + $context->inside_general_use = $was_inside_general_use; + + return false; + } + $context->inside_general_use = $was_inside_general_use; + + $key_type = null; + $value_type = null; + $always_non_empty_array = true; + + $var_id = ExpressionIdentifier::getVarId( + $stmt->expr, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { + $iterator_type = $stmt_expr_type; + } elseif ($var_id && $context->hasVariable($var_id)) { + $iterator_type = $context->vars_in_scope[$var_id]; + } else { + $iterator_type = null; + } + + if ($iterator_type) { + if (self::checkIteratorType( + $statements_analyzer, + $stmt, + $stmt->expr, + $iterator_type, + $codebase, + $context, + $key_type, + $value_type, + $always_non_empty_array + ) === false + ) { + return false; + } + } + + $foreach_context = clone $context; + + foreach ($foreach_context->vars_in_scope as $context_var_id => $context_type) { + $foreach_context->vars_in_scope[$context_var_id] = clone $context_type; + } + + $foreach_context->inside_loop = true; + $foreach_context->break_types[] = 'loop'; + + if ($codebase->alter_code) { + $foreach_context->branch_point = + $foreach_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); + } + + if ($stmt->keyVar instanceof PhpParser\Node\Expr\Variable && is_string($stmt->keyVar->name)) { + $key_type = $key_type ?? Type::getMixed(); + + AssignmentAnalyzer::analyze( + $statements_analyzer, + $stmt->keyVar, + $stmt->expr, + $key_type, + $foreach_context, + $doc_comment, + ['$' . $stmt->keyVar->name => true] + ); + } + + $value_type = $value_type ?? Type::getMixed(); + + if ($stmt->byRef) { + $value_type->by_ref = true; + } + + AssignmentAnalyzer::analyze( + $statements_analyzer, + $stmt->valueVar, + $stmt->expr, + $value_type, + $foreach_context, + $doc_comment, + $stmt->valueVar instanceof PhpParser\Node\Expr\Variable + && is_string($stmt->valueVar->name) + ? ['$' . $stmt->valueVar->name => true] + : [] + ); + + foreach ($var_comments as $var_comment) { + if (!$var_comment->var_id || !$var_comment->type) { + continue; + } + + $comment_type = TypeExpander::expandUnion( + $codebase, + $var_comment->type, + $context->self, + $context->self, + $statements_analyzer->getParentFQCLN() + ); + + if (isset($foreach_context->vars_in_scope[$var_comment->var_id])) { + $existing_var_type = $foreach_context->vars_in_scope[$var_comment->var_id]; + $comment_type->parent_nodes = $existing_var_type->parent_nodes; + $comment_type->by_ref = $existing_var_type->by_ref; + } + + $foreach_context->vars_in_scope[$var_comment->var_id] = $comment_type; + } + + $loop_scope = new LoopScope($foreach_context, $context); + + $loop_scope->protected_var_ids = $context->protected_var_ids; + + if (LoopAnalyzer::analyze( + $statements_analyzer, + $stmt->stmts, + [], + [], + $loop_scope, + $inner_loop_context, + false, + $always_non_empty_array + ) === false) { + return false; + } + + if (!$inner_loop_context) { + throw new UnexpectedValueException('There should be an inner loop context'); + } + + $foreach_context->loop_scope = null; + + $context->vars_possibly_in_scope = array_merge( + $foreach_context->vars_possibly_in_scope, + $context->vars_possibly_in_scope + ); + + $context->referenced_var_ids = array_intersect_key( + $foreach_context->referenced_var_ids, + $context->referenced_var_ids + ); + + if ($context->collect_exceptions) { + $context->mergeExceptions($foreach_context); + } + + return null; + } + + /** + * @param PhpParser\Node\Stmt\Foreach_|PhpParser\Node\Expr\YieldFrom $stmt + * @return false|null + */ + public static function checkIteratorType( + StatementsAnalyzer $statements_analyzer, + PhpParser\NodeAbstract $stmt, + PhpParser\Node\Expr $expr, + Union $iterator_type, + Codebase $codebase, + Context $context, + ?Union &$key_type, + ?Union &$value_type, + bool &$always_non_empty_array + ): ?bool { + if ($iterator_type->isNull()) { + if (IssueBuffer::accepts( + new NullIterator( + 'Cannot iterate over null', + new CodeLocation($statements_analyzer->getSource(), $expr) + ), + $statements_analyzer->getSuppressedIssues() + )) { + } + + return false; + } + + if ($iterator_type->isNullable() && !$iterator_type->ignore_nullable_issues) { + IssueBuffer::maybeAdd( + new PossiblyNullIterator( + 'Cannot iterate over nullable var ' . $iterator_type, + new CodeLocation($statements_analyzer->getSource(), $expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return null; + } + + if ($iterator_type->isFalsable() && !$iterator_type->ignore_falsable_issues) { + IssueBuffer::maybeAdd( + new PossiblyFalseIterator( + 'Cannot iterate over falsable var ' . $iterator_type, + new CodeLocation($statements_analyzer->getSource(), $expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return null; + } + + $has_valid_iterator = false; + $invalid_iterator_types = []; + $raw_object_types = []; + + foreach ($iterator_type->getAtomicTypes() as $iterator_atomic_type) { + if ($iterator_atomic_type instanceof TTemplateParam) { + $iterator_atomic_type = $iterator_atomic_type->as->getSingleAtomic(); + } + + // if it's an empty array, we cannot iterate over it + if ($iterator_atomic_type instanceof TArray + && $iterator_atomic_type->type_params[1]->isEmpty() + ) { + $always_non_empty_array = false; + $has_valid_iterator = true; + continue; + } + + if ($iterator_atomic_type instanceof TNull + || $iterator_atomic_type instanceof TFalse + ) { + $always_non_empty_array = false; + continue; + } + + if ($iterator_atomic_type instanceof TArray + || $iterator_atomic_type instanceof TKeyedArray + || $iterator_atomic_type instanceof TList + ) { + if ($iterator_atomic_type instanceof TKeyedArray) { + if (!$iterator_atomic_type->sealed) { + $always_non_empty_array = false; + } + $iterator_atomic_type = $iterator_atomic_type->getGenericArrayType(); + } elseif ($iterator_atomic_type instanceof TList) { + $list_var_id = ExpressionIdentifier::getArrayVarId( + $expr, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if (!$iterator_atomic_type instanceof TNonEmptyList) { + $always_non_empty_array = false; + } + + $iterator_atomic_type = new TArray([ + $list_var_id + ? new Union([ + new TDependentListKey($list_var_id) + ]) + : new Union([new TIntRange(0, null)]), + $iterator_atomic_type->type_param + ]); + } elseif (!$iterator_atomic_type instanceof TNonEmptyArray) { + $always_non_empty_array = false; + } + + $value_type = Type::combineUnionTypes($value_type, clone $iterator_atomic_type->type_params[1]); + + $key_type_part = $iterator_atomic_type->type_params[0]; + + $key_type = Type::combineUnionTypes($key_type, $key_type_part); + + ArrayFetchAnalyzer::taintArrayFetch( + $statements_analyzer, + $expr, + null, + $value_type, + $key_type + ); + + $has_valid_iterator = true; + continue; + } + + $always_non_empty_array = false; + + if ($iterator_atomic_type instanceof Scalar || $iterator_atomic_type instanceof TVoid) { + $invalid_iterator_types[] = $iterator_atomic_type->getKey(); + + $value_type = Type::getMixed(); + } elseif ($iterator_atomic_type instanceof TObject || $iterator_atomic_type instanceof TMixed) { + $has_valid_iterator = true; + $value_type = Type::getMixed(); + $key_type = Type::getMixed(); + + ArrayFetchAnalyzer::taintArrayFetch( + $statements_analyzer, + $expr, + null, + $value_type, + $key_type + ); + + if (!$context->pure) { + if ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + } else { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a possibly-mutating iterator from a pure context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } elseif ($iterator_atomic_type instanceof TIterable) { + if ($iterator_atomic_type->extra_types) { + $iterator_atomic_type_copy = clone $iterator_atomic_type; + $iterator_atomic_type_copy->extra_types = []; + $iterator_atomic_types = [$iterator_atomic_type_copy]; + $iterator_atomic_types = array_merge( + $iterator_atomic_types, + $iterator_atomic_type->extra_types + ); + } else { + $iterator_atomic_types = [$iterator_atomic_type]; + } + + $intersection_value_type = null; + $intersection_key_type = null; + + foreach ($iterator_atomic_types as $iat) { + if (!$iat instanceof TIterable) { + continue; + } + + [$key_type_part, $value_type_part] = $iat->type_params; + + if (!$intersection_value_type) { + $intersection_value_type = $value_type_part; + } else { + $intersection_value_type = Type::intersectUnionTypes( + $intersection_value_type, + $value_type_part, + $codebase + ) ?? Type::getMixed(); + } + + if (!$intersection_key_type) { + $intersection_key_type = $key_type_part; + } else { + $intersection_key_type = Type::intersectUnionTypes( + $intersection_key_type, + $key_type_part, + $codebase + ) ?? Type::getMixed(); + } + } + + if (!$intersection_value_type || !$intersection_key_type) { + throw new UnexpectedValueException('Should not happen'); + } + + $value_type = Type::combineUnionTypes($value_type, $intersection_value_type); + $key_type = Type::combineUnionTypes($key_type, $intersection_key_type); + + ArrayFetchAnalyzer::taintArrayFetch( + $statements_analyzer, + $expr, + null, + $value_type, + $key_type + ); + + $has_valid_iterator = true; + + if (!$context->pure) { + if ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + } else { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a possibly-mutating Traversable::getIterator from a pure context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } elseif ($iterator_atomic_type instanceof TNamedObject) { + if ($iterator_atomic_type->value !== 'Traversable' && + $iterator_atomic_type->value !== $statements_analyzer->getClassName() + ) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $iterator_atomic_type->value, + new CodeLocation($statements_analyzer->getSource(), $expr), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions(true) + ) === false) { + return false; + } + } + + if (AtomicTypeComparator::isContainedBy( + $codebase, + $iterator_atomic_type, + new TIterable([Type::getMixed(), Type::getMixed()]) + )) { + self::handleIterable( + $statements_analyzer, + $iterator_atomic_type, + $expr, + $codebase, + $context, + $key_type, + $value_type, + $has_valid_iterator + ); + } else { + $raw_object_types[] = $iterator_atomic_type->value; + } + + if (!$context->pure) { + if ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + } else { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a possibly-mutating iterator from a pure context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + if ($raw_object_types) { + if ($has_valid_iterator) { + IssueBuffer::maybeAdd( + new PossibleRawObjectIteration( + 'Possibly undesired iteration over regular object ' . reset($raw_object_types), + new CodeLocation($statements_analyzer->getSource(), $expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RawObjectIteration( + 'Possibly undesired iteration over regular object ' . reset($raw_object_types), + new CodeLocation($statements_analyzer->getSource(), $expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($invalid_iterator_types) { + if ($has_valid_iterator) { + IssueBuffer::maybeAdd( + new PossiblyInvalidIterator( + 'Cannot iterate over ' . $invalid_iterator_types[0], + new CodeLocation($statements_analyzer->getSource(), $expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidIterator( + 'Cannot iterate over ' . $invalid_iterator_types[0], + new CodeLocation($statements_analyzer->getSource(), $expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + return null; + } + + public static function handleIterable( + StatementsAnalyzer $statements_analyzer, + TNamedObject $iterator_atomic_type, + PhpParser\Node\Expr $foreach_expr, + Codebase $codebase, + Context $context, + ?Union &$key_type, + ?Union &$value_type, + bool &$has_valid_iterator + ): void { + if ($iterator_atomic_type->extra_types) { + $iterator_atomic_type_copy = clone $iterator_atomic_type; + $iterator_atomic_type_copy->extra_types = []; + $iterator_atomic_types = [$iterator_atomic_type_copy]; + $iterator_atomic_types = array_merge($iterator_atomic_types, $iterator_atomic_type->extra_types); + } else { + $iterator_atomic_types = [$iterator_atomic_type]; + } + + foreach ($iterator_atomic_types as $iterator_atomic_type) { + if ($iterator_atomic_type instanceof TTemplateParam + || $iterator_atomic_type instanceof TObjectWithProperties + ) { + throw new UnexpectedValueException('Shouldn’t get a generic param here'); + } + + + $has_valid_iterator = true; + + if ($iterator_atomic_type instanceof TNamedObject + && strtolower($iterator_atomic_type->value) === 'simplexmlelement' + ) { + $value_type = Type::combineUnionTypes( + $value_type, + new Union([clone $iterator_atomic_type]) + ); + + $key_type = Type::combineUnionTypes( + $key_type, + Type::getString() + ); + } + + if ($iterator_atomic_type instanceof TIterable + || (strtolower($iterator_atomic_type->value) === 'traversable' + || $codebase->classImplements( + $iterator_atomic_type->value, + 'Traversable' + ) || + ( + $codebase->interfaceExists($iterator_atomic_type->value) + && $codebase->interfaceExtends( + $iterator_atomic_type->value, + 'Traversable' + ) + )) + ) { + if (strtolower($iterator_atomic_type->value) === 'iteratoraggregate' + || $codebase->classImplements( + $iterator_atomic_type->value, + 'IteratorAggregate' + ) + || ($codebase->interfaceExists($iterator_atomic_type->value) + && $codebase->interfaceExtends( + $iterator_atomic_type->value, + 'IteratorAggregate' + ) + ) + ) { + $old_data_provider = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $fake_method_call = new VirtualMethodCall( + $foreach_expr, + new VirtualIdentifier('getIterator', $foreach_expr->getAttributes()) + ); + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); + } + + if (!in_array('PossiblyUndefinedMethod', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['PossiblyUndefinedMethod']); + } + + $was_inside_call = $context->inside_call; + + $context->inside_call = true; + + MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_method_call, + $context + ); + + $context->inside_call = $was_inside_call; + + if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['PossiblyInvalidMethodCall']); + } + + if (!in_array('PossiblyUndefinedMethod', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['PossiblyUndefinedMethod']); + } + + $iterator_class_type = $statements_analyzer->node_data->getType($fake_method_call) ?? null; + + $statements_analyzer->node_data = $old_data_provider; + + if ($iterator_class_type) { + foreach ($iterator_class_type->getAtomicTypes() as $array_atomic_type) { + $key_type_part = null; + $value_type_part = null; + + if ($array_atomic_type instanceof TArray + || $array_atomic_type instanceof TKeyedArray + ) { + if ($array_atomic_type instanceof TKeyedArray) { + $array_atomic_type = $array_atomic_type->getGenericArrayType(); + } + + [$key_type_part, $value_type_part] = $array_atomic_type->type_params; + } else { + if ($array_atomic_type instanceof TNamedObject + && $codebase->classExists($array_atomic_type->value) + && $codebase->classImplements( + $array_atomic_type->value, + 'Traversable' + ) + ) { + $generic_storage = $codebase->classlike_storage_provider->get( + $array_atomic_type->value + ); + + // The collection might be an iterator, in which case + // we want to call the iterator function + /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ + if (!isset($generic_storage->template_extended_params['Traversable']) + || ($generic_storage + ->template_extended_params['Traversable']['TKey']->isMixed() + && $generic_storage + ->template_extended_params['Traversable']['TValue']->isMixed()) + ) { + self::handleIterable( + $statements_analyzer, + $array_atomic_type, + $fake_method_call, + $codebase, + $context, + $key_type, + $value_type, + $has_valid_iterator + ); + + continue; + } + } + + if ($array_atomic_type instanceof TIterable + || ($array_atomic_type instanceof TNamedObject + && ($array_atomic_type->value === 'Traversable' + || ($codebase->classOrInterfaceExists($array_atomic_type->value) + && $codebase->classImplements( + $array_atomic_type->value, + 'Traversable' + )))) + ) { + self::getKeyValueParamsForTraversableObject( + $array_atomic_type, + $codebase, + $key_type_part, + $value_type_part + ); + } + } + + if (!$key_type_part || !$value_type_part) { + break; + } + + $key_type = Type::combineUnionTypes($key_type, $key_type_part); + $value_type = Type::combineUnionTypes($value_type, $value_type_part); + } + } + } elseif ($codebase->classImplements( + $iterator_atomic_type->value, + 'Iterator' + ) || + ( + $codebase->interfaceExists($iterator_atomic_type->value) + && $codebase->interfaceExtends( + $iterator_atomic_type->value, + 'Iterator' + ) + ) + ) { + $iterator_value_type = self::getFakeMethodCallType( + $statements_analyzer, + $foreach_expr, + $context, + 'current' + ); + + $iterator_key_type = self::getFakeMethodCallType( + $statements_analyzer, + $foreach_expr, + $context, + 'key' + ); + + if ($iterator_value_type && !$iterator_value_type->isMixed()) { + $value_type = Type::combineUnionTypes($value_type, $iterator_value_type); + } + + if ($iterator_key_type && !$iterator_key_type->isMixed()) { + $key_type = Type::combineUnionTypes($key_type, $iterator_key_type); + } + } + + if (!$key_type && !$value_type) { + self::getKeyValueParamsForTraversableObject( + $iterator_atomic_type, + $codebase, + $key_type, + $value_type + ); + } + + return; + } + + if (!$codebase->classlikes->classOrInterfaceExists($iterator_atomic_type->value)) { + return; + } + } + } + + public static function getKeyValueParamsForTraversableObject( + Atomic $iterator_atomic_type, + Codebase $codebase, + ?Union &$key_type, + ?Union &$value_type + ): void { + if ($iterator_atomic_type instanceof TIterable + || ($iterator_atomic_type instanceof TGenericObject + && strtolower($iterator_atomic_type->value) === 'traversable') + ) { + $value_type = Type::combineUnionTypes($value_type, $iterator_atomic_type->type_params[1]); + $key_type = Type::combineUnionTypes($key_type, $iterator_atomic_type->type_params[0]); + + return; + } + + if ($iterator_atomic_type instanceof TNamedObject + && ( + $codebase->classImplements( + $iterator_atomic_type->value, + 'Traversable' + ) + || $codebase->interfaceExtends( + $iterator_atomic_type->value, + 'Traversable' + ) + ) + ) { + $generic_storage = $codebase->classlike_storage_provider->get( + $iterator_atomic_type->value + ); + + if (!isset($generic_storage->template_extended_params['Traversable'])) { + return; + } + + if ($generic_storage->template_types + || $iterator_atomic_type instanceof TGenericObject + ) { + // if we're just being passed the non-generic class itself, assume + // that it's inside the calling class + $passed_type_params = $iterator_atomic_type instanceof TGenericObject + ? $iterator_atomic_type->type_params + : array_values( + array_map( + /** @param array $arr */ + function (array $arr) use ($iterator_atomic_type): Union { + return $arr[$iterator_atomic_type->value] ?? Type::getMixed(); + }, + $generic_storage->template_types + ) + ); + } else { + $passed_type_params = null; + } + + $key_type = self::getExtendedType( + 'TKey', + 'Traversable', + $generic_storage->name, + $generic_storage->template_extended_params, + $generic_storage->template_types, + $passed_type_params + ); + + $value_type = self::getExtendedType( + 'TValue', + 'Traversable', + $generic_storage->name, + $generic_storage->template_extended_params, + $generic_storage->template_types, + $passed_type_params + ); + + return; + } + } + + private static function getFakeMethodCallType( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $foreach_expr, + Context $context, + string $method_name + ): ?Union { + $old_data_provider = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $fake_method_call = new VirtualMethodCall( + $foreach_expr, + new VirtualIdentifier($method_name, $foreach_expr->getAttributes()) + ); + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); + } + + if (!in_array('PossiblyUndefinedMethod', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['PossiblyUndefinedMethod']); + } + + $was_inside_call = $context->inside_call; + + $context->inside_call = true; + + MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_method_call, + $context + ); + + $context->inside_call = $was_inside_call; + + if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['PossiblyInvalidMethodCall']); + } + + if (!in_array('PossiblyUndefinedMethod', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['PossiblyUndefinedMethod']); + } + + $iterator_class_type = $statements_analyzer->node_data->getType($fake_method_call) ?? null; + + $statements_analyzer->node_data = $old_data_provider; + + return $iterator_class_type; + } + + /** + * @param array> $template_extended_params + * @param array> $class_template_types + * @param array $calling_type_params + */ + private static function getExtendedType( + string $template_name, + string $template_class, + string $calling_class, + array $template_extended_params, + ?array $class_template_types = null, + ?array $calling_type_params = null + ): ?Union { + if ($calling_class === $template_class) { + if (isset($class_template_types[$template_name]) && $calling_type_params) { + $offset = array_search($template_name, array_keys($class_template_types)); + + if ($offset !== false && isset($calling_type_params[$offset])) { + return $calling_type_params[$offset]; + } + } + + return null; + } + + if (isset($template_extended_params[$template_class][$template_name])) { + $extended_type = $template_extended_params[$template_class][$template_name]; + + $return_type = null; + + foreach ($extended_type->getAtomicTypes() as $extended_atomic_type) { + if (!$extended_atomic_type instanceof TTemplateParam) { + $return_type = Type::combineUnionTypes( + $return_type, + $extended_type + ); + + continue; + } + + $candidate_type = self::getExtendedType( + $extended_atomic_type->param_name, + $extended_atomic_type->defining_class, + $calling_class, + $template_extended_params, + $class_template_types, + $calling_type_params + ); + + if ($candidate_type) { + $return_type = Type::combineUnionTypes( + $return_type, + $candidate_type + ); + } + } + + if ($return_type) { + return $return_type; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php new file mode 100644 index 00000000..cd4002e5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php @@ -0,0 +1,377 @@ +negated_clauses) { + $entry_clauses = array_merge($outer_context->clauses, $if_scope->negated_clauses); + + $changed_var_ids = []; + + if ($if_scope->negated_types) { + $vars_reconciled = Reconciler::reconcileKeyedTypes( + $if_scope->negated_types, + [], + $outer_context->vars_in_scope, + $changed_var_ids, + [], + $statements_analyzer, + [], + $outer_context->inside_loop, + new CodeLocation( + $statements_analyzer->getSource(), + $cond instanceof PhpParser\Node\Expr\BooleanNot + ? $cond->expr + : $cond, + $outer_context->include_location, + false + ) + ); + + if ($changed_var_ids) { + $outer_context = clone $outer_context; + $outer_context->vars_in_scope = $vars_reconciled; + + $entry_clauses = array_values( + array_filter( + $entry_clauses, + function (Clause $c) use ($changed_var_ids): bool { + return count($c->possibilities) > 1 + || $c->wedge + || !isset($changed_var_ids[array_keys($c->possibilities)[0]]); + } + ) + ); + } + } + } + + // get the first expression in the if, which should be evaluated on its own + // this allows us to update the context of $matches in + // if (!preg_match('/a/', 'aa', $matches)) { + // exit + // } + // echo $matches[0]; + $externally_applied_if_cond_expr = self::getDefinitelyEvaluatedExpressionAfterIf($cond); + + $internally_applied_if_cond_expr = self::getDefinitelyEvaluatedExpressionInsideIf($cond); + + $pre_condition_vars_in_scope = $outer_context->vars_in_scope; + + $referenced_var_ids = $outer_context->referenced_var_ids; + $outer_context->referenced_var_ids = []; + + $pre_assigned_var_ids = $outer_context->assigned_var_ids; + $outer_context->assigned_var_ids = []; + + $if_context = null; + + if ($internally_applied_if_cond_expr !== $externally_applied_if_cond_expr) { + $if_context = clone $outer_context; + } + + $was_inside_conditional = $outer_context->inside_conditional; + + $outer_context->inside_conditional = true; + + if ($externally_applied_if_cond_expr) { + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $externally_applied_if_cond_expr, + $outer_context + ) === false) { + throw new ScopeAnalysisException(); + } + } + + $first_cond_assigned_var_ids = $outer_context->assigned_var_ids; + $outer_context->assigned_var_ids = array_merge( + $pre_assigned_var_ids, + $first_cond_assigned_var_ids + ); + + $first_cond_referenced_var_ids = $outer_context->referenced_var_ids; + $outer_context->referenced_var_ids = array_merge( + $referenced_var_ids, + $first_cond_referenced_var_ids + ); + + $outer_context->inside_conditional = $was_inside_conditional; + + if (!$if_context) { + $if_context = clone $outer_context; + } + + $if_conditional_context = clone $if_context; + $if_conditional_context->if_context = $if_context; + $if_conditional_context->if_scope = $if_scope; + + if ($codebase->alter_code) { + $if_context->branch_point = $branch_point; + } + + // we need to clone the current context so our ongoing updates + // to $outer_context don't mess with elseif/else blocks + $post_if_context = clone $outer_context; + + if ($internally_applied_if_cond_expr !== $cond + || $externally_applied_if_cond_expr !== $cond + ) { + $assigned_var_ids = $first_cond_assigned_var_ids; + $if_conditional_context->assigned_var_ids = []; + + $referenced_var_ids = $first_cond_referenced_var_ids; + $if_conditional_context->referenced_var_ids = []; + + $was_inside_conditional = $if_conditional_context->inside_conditional; + + $if_conditional_context->inside_conditional = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $cond, $if_conditional_context) === false) { + throw new ScopeAnalysisException(); + } + + $if_conditional_context->inside_conditional = $was_inside_conditional; + + /** @var array */ + $more_cond_referenced_var_ids = $if_conditional_context->referenced_var_ids; + $if_conditional_context->referenced_var_ids = array_merge( + $more_cond_referenced_var_ids, + $referenced_var_ids + ); + + $cond_referenced_var_ids = array_merge( + $first_cond_referenced_var_ids, + $more_cond_referenced_var_ids + ); + + /** @var array */ + $more_cond_assigned_var_ids = $if_conditional_context->assigned_var_ids; + $if_conditional_context->assigned_var_ids = array_merge( + $more_cond_assigned_var_ids, + $assigned_var_ids + ); + + $assigned_in_conditional_var_ids = array_merge( + $first_cond_assigned_var_ids, + $more_cond_assigned_var_ids + ); + } else { + $cond_referenced_var_ids = $first_cond_referenced_var_ids; + + $assigned_in_conditional_var_ids = $first_cond_assigned_var_ids; + } + + $newish_var_ids = array_map( + /** + * @param Union $_ + * + * @return true + */ + function (Union $_): bool { + return true; + }, + array_diff_key( + $if_conditional_context->vars_in_scope, + $pre_condition_vars_in_scope, + $cond_referenced_var_ids, + $assigned_in_conditional_var_ids + ) + ); + + self::handleParadoxicalCondition($statements_analyzer, $cond, true); + + // get all the var ids that were referenced in the conditional, but not assigned in it + $cond_referenced_var_ids = array_diff_key($cond_referenced_var_ids, $assigned_in_conditional_var_ids); + + $cond_referenced_var_ids = array_merge($newish_var_ids, $cond_referenced_var_ids); + + return new IfConditionalScope( + $if_context, + $post_if_context, + $cond_referenced_var_ids, + $assigned_in_conditional_var_ids, + $entry_clauses + ); + } + + /** + * Returns statements that are definitely evaluated before any statements after the end of the + * if/elseif/else blocks + */ + private static function getDefinitelyEvaluatedExpressionAfterIf(PhpParser\Node\Expr $stmt): ?PhpParser\Node\Expr + { + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical + ) { + if ($stmt->left instanceof PhpParser\Node\Expr\ConstFetch + && $stmt->left->name->parts === ['true'] + ) { + return self::getDefinitelyEvaluatedExpressionAfterIf($stmt->right); + } + + if ($stmt->right instanceof PhpParser\Node\Expr\ConstFetch + && $stmt->right->name->parts === ['true'] + ) { + return self::getDefinitelyEvaluatedExpressionAfterIf($stmt->left); + } + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) { + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalAnd + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalXor + ) { + return self::getDefinitelyEvaluatedExpressionAfterIf($stmt->left); + } + + return $stmt; + } + + if ($stmt instanceof PhpParser\Node\Expr\BooleanNot) { + $inner_stmt = self::getDefinitelyEvaluatedExpressionInsideIf($stmt->expr); + + if ($inner_stmt !== $stmt->expr) { + return $inner_stmt; + } + } + + return $stmt; + } + + /** + * Returns statements that are definitely evaluated before any statements inside + * the if block + */ + private static function getDefinitelyEvaluatedExpressionInsideIf(PhpParser\Node\Expr $stmt): ?PhpParser\Node\Expr + { + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical + ) { + if ($stmt->left instanceof PhpParser\Node\Expr\ConstFetch + && $stmt->left->name->parts === ['true'] + ) { + return self::getDefinitelyEvaluatedExpressionInsideIf($stmt->right); + } + + if ($stmt->right instanceof PhpParser\Node\Expr\ConstFetch + && $stmt->right->name->parts === ['true'] + ) { + return self::getDefinitelyEvaluatedExpressionInsideIf($stmt->left); + } + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) { + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalOr + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalXor + ) { + return self::getDefinitelyEvaluatedExpressionInsideIf($stmt->left); + } + + return $stmt; + } + + if ($stmt instanceof PhpParser\Node\Expr\BooleanNot) { + $inner_stmt = self::getDefinitelyEvaluatedExpressionAfterIf($stmt->expr); + + if ($inner_stmt !== $stmt->expr) { + return $inner_stmt; + } + } + + return $stmt; + } + + public static function handleParadoxicalCondition( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $stmt, + bool $emit_redundant_with_assignation = false + ): void { + $type = $statements_analyzer->node_data->getType($stmt); + + if ($type !== null) { + if ($type->isAlwaysFalsy()) { + if ($type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + 'Operand of type ' . $type->getId() . ' is always false', + new CodeLocation($statements_analyzer, $stmt), + 'false falsy' + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + 'Operand of type ' . $type->getId() . ' is always false', + new CodeLocation($statements_analyzer, $stmt), + 'false falsy' + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } elseif ($type->isAlwaysTruthy() && + (!$stmt instanceof PhpParser\Node\Expr\Assign || $emit_redundant_with_assignation) + ) { + if ($type->from_docblock) { + IssueBuffer::maybeAdd( + new RedundantConditionGivenDocblockType( + 'Operand of type ' . $type->getId() . ' is always true', + new CodeLocation($statements_analyzer, $stmt), + 'true falsy' + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RedundantCondition( + 'Operand of type ' . $type->getId() . ' is always true', + new CodeLocation($statements_analyzer, $stmt), + 'true falsy' + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php new file mode 100644 index 00000000..f2071b32 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php @@ -0,0 +1,242 @@ +getCodebase(); + + if (!$else && !$if_scope->negated_clauses && !$else_context->clauses) { + $if_scope->final_actions = array_merge([ScopeAnalyzer::ACTION_NONE], $if_scope->final_actions); + $if_scope->assigned_var_ids = []; + $if_scope->new_vars = []; + $if_scope->redefined_vars = []; + $if_scope->reasonable_clauses = []; + + return null; + } + + $else_context->clauses = Algebra::simplifyCNF( + array_merge( + $else_context->clauses, + $if_scope->negated_clauses + ) + ); + + $else_types = Algebra::getTruthsFromFormula($else_context->clauses); + + if (!$else && !$else_types) { + $if_scope->final_actions = array_merge([ScopeAnalyzer::ACTION_NONE], $if_scope->final_actions); + $if_scope->assigned_var_ids = []; + $if_scope->new_vars = []; + $if_scope->redefined_vars = []; + $if_scope->reasonable_clauses = []; + + return null; + } + + $original_context = clone $else_context; + + if ($else_types) { + $changed_var_ids = []; + + $else_vars_reconciled = Reconciler::reconcileKeyedTypes( + $else_types, + [], + $else_context->vars_in_scope, + $changed_var_ids, + [], + $statements_analyzer, + $statements_analyzer->getTemplateTypeMap() ?: [], + $else_context->inside_loop, + $else + ? new CodeLocation($statements_analyzer->getSource(), $else, $outer_context->include_location) + : null + ); + + $else_context->vars_in_scope = $else_vars_reconciled; + + $else_context->clauses = Context::removeReconciledClauses($else_context->clauses, $changed_var_ids)[0]; + + foreach ($changed_var_ids as $changed_var_id => $_) { + foreach ($else_context->vars_in_scope as $var_id => $_) { + if (preg_match('/' . preg_quote($changed_var_id, '/') . '[\]\[\-]/', $var_id) + && !array_key_exists($var_id, $changed_var_ids) + ) { + unset($else_context->vars_in_scope[$var_id]); + } + } + } + } + + $old_else_context = clone $else_context; + + $pre_stmts_assigned_var_ids = $else_context->assigned_var_ids; + $else_context->assigned_var_ids = []; + + $pre_possibly_assigned_var_ids = $else_context->possibly_assigned_var_ids; + $else_context->possibly_assigned_var_ids = []; + + if ($else) { + if ($statements_analyzer->analyze( + $else->stmts, + $else_context + ) === false + ) { + return false; + } + } + + /** @var array */ + $new_assigned_var_ids = $else_context->assigned_var_ids; + $else_context->assigned_var_ids = $pre_stmts_assigned_var_ids; + + /** @var array */ + $new_possibly_assigned_var_ids = $else_context->possibly_assigned_var_ids; + $else_context->possibly_assigned_var_ids = $pre_possibly_assigned_var_ids + $new_possibly_assigned_var_ids; + + if ($else) { + foreach ($else_context->byref_constraints as $var_id => $byref_constraint) { + if (isset($outer_context->byref_constraints[$var_id]) + && ($outer_constraint_type = $outer_context->byref_constraints[$var_id]->type) + && $byref_constraint->type + && !UnionTypeComparator::isContainedBy( + $codebase, + $byref_constraint->type, + $outer_constraint_type + ) + ) { + IssueBuffer::maybeAdd( + new ConflictingReferenceConstraint( + 'There is more than one pass-by-reference constraint on ' . $var_id, + new CodeLocation($statements_analyzer, $else, $outer_context->include_location, true) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + $outer_context->byref_constraints[$var_id] = $byref_constraint; + } + } + } + + $final_actions = $else + ? ScopeAnalyzer::getControlActions( + $else->stmts, + $statements_analyzer->node_data, + $codebase->config->exit_functions, + [] + ) + : [ScopeAnalyzer::ACTION_NONE]; + // has a return/throw at end + $has_ending_statements = $final_actions === [ScopeAnalyzer::ACTION_END]; + $has_leaving_statements = $has_ending_statements + || (count($final_actions) && !in_array(ScopeAnalyzer::ACTION_NONE, $final_actions, true)); + + $has_break_statement = $final_actions === [ScopeAnalyzer::ACTION_BREAK]; + $has_continue_statement = $final_actions === [ScopeAnalyzer::ACTION_CONTINUE]; + + $if_scope->final_actions = array_merge($final_actions, $if_scope->final_actions); + + // if it doesn't end in a return + if (!$has_leaving_statements) { + IfAnalyzer::updateIfScope( + $codebase, + $if_scope, + $else_context, + $original_context, + $new_assigned_var_ids, + $new_possibly_assigned_var_ids, + [], + (bool) $else + ); + + $if_scope->reasonable_clauses = []; + } + + // update the parent context as necessary + if ($if_scope->negatable_if_types) { + $outer_context->update( + $old_else_context, + $else_context, + $has_leaving_statements, + array_keys($if_scope->negatable_if_types), + $if_scope->updated_vars + ); + } + + if (!$has_ending_statements) { + $vars_possibly_in_scope = array_diff_key( + $else_context->vars_possibly_in_scope, + $outer_context->vars_possibly_in_scope + ); + + $possibly_assigned_var_ids = $new_possibly_assigned_var_ids; + + if ($has_leaving_statements && $else_context->loop_scope) { + if (!$has_continue_statement && !$has_break_statement) { + $if_scope->new_vars_possibly_in_scope = array_merge( + $vars_possibly_in_scope, + $if_scope->new_vars_possibly_in_scope + ); + + $if_scope->possibly_assigned_var_ids = array_merge( + $possibly_assigned_var_ids, + $if_scope->possibly_assigned_var_ids + ); + } + + $else_context->loop_scope->vars_possibly_in_scope = array_merge( + $vars_possibly_in_scope, + $else_context->loop_scope->vars_possibly_in_scope + ); + } elseif (!$has_leaving_statements) { + $if_scope->new_vars_possibly_in_scope = array_merge( + $vars_possibly_in_scope, + $if_scope->new_vars_possibly_in_scope + ); + + $if_scope->possibly_assigned_var_ids = array_merge( + $possibly_assigned_var_ids, + $if_scope->possibly_assigned_var_ids + ); + } + } + + if ($outer_context->collect_exceptions) { + $outer_context->mergeExceptions($else_context); + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php new file mode 100644 index 00000000..105bf206 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php @@ -0,0 +1,439 @@ +cond, + $else_context, + $codebase, + $if_scope, + $branch_point + ); + + $elseif_context = $if_conditional_scope->if_context; + $cond_referenced_var_ids = $if_conditional_scope->cond_referenced_var_ids; + $assigned_in_conditional_var_ids = $if_conditional_scope->assigned_in_conditional_var_ids; + $entry_clauses = $if_conditional_scope->entry_clauses; + } catch (ScopeAnalysisException $e) { + return false; + } + + $mixed_var_ids = []; + + foreach ($elseif_context->vars_in_scope as $var_id => $type) { + if ($type->hasMixed()) { + $mixed_var_ids[] = $var_id; + } + } + + $elseif_cond_id = spl_object_id($elseif->cond); + + $elseif_clauses = FormulaGenerator::getFormula( + $elseif_cond_id, + $elseif_cond_id, + $elseif->cond, + $else_context->self, + $statements_analyzer, + $codebase + ); + + $elseif_clauses = array_map( + /** + * @return Clause + */ + function (Clause $c) use ($mixed_var_ids, $elseif_cond_id): Clause { + $keys = array_keys($c->possibilities); + + $mixed_var_ids = array_diff($mixed_var_ids, $keys); + + foreach ($keys as $key) { + foreach ($mixed_var_ids as $mixed_var_id) { + if (preg_match('/^' . preg_quote($mixed_var_id, '/') . '(\[|-)/', $key)) { + return new Clause([], $elseif_cond_id, $elseif_cond_id, true); + } + } + } + + return $c; + }, + $elseif_clauses + ); + + $entry_clauses = array_map( + /** + * @return Clause + */ + function (Clause $c) use ($assigned_in_conditional_var_ids, $elseif_cond_id): Clause { + $keys = array_keys($c->possibilities); + + foreach ($keys as $key) { + foreach ($assigned_in_conditional_var_ids as $conditional_assigned_var_id => $_) { + if (preg_match('/^' . preg_quote($conditional_assigned_var_id, '/') . '(\[|-|$)/', $key)) { + return new Clause([], $elseif_cond_id, $elseif_cond_id, true); + } + } + } + + return $c; + }, + $entry_clauses + ); + + // this will see whether any of the clauses in set A conflict with the clauses in set B + AlgebraAnalyzer::checkForParadox( + $entry_clauses, + $elseif_clauses, + $statements_analyzer, + $elseif->cond, + $assigned_in_conditional_var_ids + ); + + $elseif_context_clauses = array_merge($entry_clauses, $elseif_clauses); + + if ($elseif_context->reconciled_expression_clauses) { + $reconciled_expression_clauses = $elseif_context->reconciled_expression_clauses; + + $elseif_context_clauses = array_values( + array_filter( + $elseif_context_clauses, + function ($c) use ($reconciled_expression_clauses): bool { + return !in_array($c->hash, $reconciled_expression_clauses); + } + ) + ); + } + + $elseif_context->clauses = Algebra::simplifyCNF($elseif_context_clauses); + + $active_elseif_types = []; + + try { + if (array_filter( + $entry_clauses, + function ($clause): bool { + return (bool)$clause->possibilities; + } + )) { + $omit_keys = array_reduce( + $entry_clauses, + /** + * @param array $carry + * @return array + */ + function (array $carry, Clause $clause): array { + return array_merge($carry, array_keys($clause->possibilities)); + }, + [] + ); + + $omit_keys = array_combine($omit_keys, $omit_keys); + $omit_keys = array_diff_key($omit_keys, Algebra::getTruthsFromFormula($entry_clauses)); + + $cond_referenced_var_ids = array_diff_key( + $cond_referenced_var_ids, + $omit_keys + ); + } + $reconcilable_elseif_types = Algebra::getTruthsFromFormula( + $elseif_context->clauses, + spl_object_id($elseif->cond), + $cond_referenced_var_ids, + $active_elseif_types + ); + $negated_elseif_types = Algebra::getTruthsFromFormula( + Algebra::negateFormula($elseif_clauses) + ); + } catch (ComplicatedExpressionException $e) { + $reconcilable_elseif_types = []; + $negated_elseif_types = []; + } + + $all_negated_vars = array_unique( + array_merge( + array_keys($negated_elseif_types), + array_keys($if_scope->negated_types) + ) + ); + + foreach ($all_negated_vars as $var_id) { + if (isset($negated_elseif_types[$var_id])) { + if (isset($if_scope->negated_types[$var_id])) { + $if_scope->negated_types[$var_id] = array_merge( + $if_scope->negated_types[$var_id], + $negated_elseif_types[$var_id] + ); + } else { + $if_scope->negated_types[$var_id] = $negated_elseif_types[$var_id]; + } + } + } + + $newly_reconciled_var_ids = []; + + // if the elseif has an || in the conditional, we cannot easily reason about it + if ($reconcilable_elseif_types) { + $elseif_vars_reconciled = Reconciler::reconcileKeyedTypes( + $reconcilable_elseif_types, + $active_elseif_types, + $elseif_context->vars_in_scope, + $newly_reconciled_var_ids, + $cond_referenced_var_ids, + $statements_analyzer, + $statements_analyzer->getTemplateTypeMap() ?: [], + $elseif_context->inside_loop, + new CodeLocation( + $statements_analyzer->getSource(), + $elseif->cond instanceof PhpParser\Node\Expr\BooleanNot + ? $elseif->cond->expr + : $elseif->cond, + $outer_context->include_location + ) + ); + + $elseif_context->vars_in_scope = $elseif_vars_reconciled; + + if ($newly_reconciled_var_ids) { + $elseif_context->clauses = Context::removeReconciledClauses( + $elseif_context->clauses, + $newly_reconciled_var_ids + )[0]; + + foreach ($newly_reconciled_var_ids as $changed_var_id => $_) { + foreach ($elseif_context->vars_in_scope as $var_id => $_) { + if (preg_match('/' . preg_quote($changed_var_id, '/') . '[\]\[\-]/', $var_id) + && !array_key_exists($var_id, $newly_reconciled_var_ids) + && !array_key_exists($var_id, $cond_referenced_var_ids) + ) { + unset($elseif_context->vars_in_scope[$var_id]); + } + } + } + } + } + + $pre_stmts_assigned_var_ids = $elseif_context->assigned_var_ids; + $elseif_context->assigned_var_ids = []; + $pre_stmts_possibly_assigned_var_ids = $elseif_context->possibly_assigned_var_ids; + $elseif_context->possibly_assigned_var_ids = []; + + if ($statements_analyzer->analyze( + $elseif->stmts, + $elseif_context + ) === false + ) { + return false; + } + + /** @var array */ + $new_stmts_assigned_var_ids = $elseif_context->assigned_var_ids; + $elseif_context->assigned_var_ids = $pre_stmts_assigned_var_ids + $new_stmts_assigned_var_ids; + + /** @var array */ + $new_stmts_possibly_assigned_var_ids = $elseif_context->possibly_assigned_var_ids; + $elseif_context->possibly_assigned_var_ids = + $pre_stmts_possibly_assigned_var_ids + $new_stmts_possibly_assigned_var_ids; + + foreach ($elseif_context->byref_constraints as $var_id => $byref_constraint) { + if (isset($outer_context->byref_constraints[$var_id]) + && ($outer_constraint_type = $outer_context->byref_constraints[$var_id]->type) + && $byref_constraint->type + && !UnionTypeComparator::isContainedBy( + $codebase, + $byref_constraint->type, + $outer_constraint_type + ) + ) { + IssueBuffer::maybeAdd( + new ConflictingReferenceConstraint( + 'There is more than one pass-by-reference constraint on ' . $var_id, + new CodeLocation($statements_analyzer, $elseif, $outer_context->include_location, true) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + $outer_context->byref_constraints[$var_id] = $byref_constraint; + } + } + + $final_actions = ScopeAnalyzer::getControlActions( + $elseif->stmts, + $statements_analyzer->node_data, + $codebase->config->exit_functions, + [] + ); + // has a return/throw at end + $has_ending_statements = $final_actions === [ScopeAnalyzer::ACTION_END]; + $has_leaving_statements = $has_ending_statements + || (count($final_actions) && !in_array(ScopeAnalyzer::ACTION_NONE, $final_actions, true)); + + $has_break_statement = $final_actions === [ScopeAnalyzer::ACTION_BREAK]; + $has_continue_statement = $final_actions === [ScopeAnalyzer::ACTION_CONTINUE]; + + $if_scope->final_actions = array_merge($final_actions, $if_scope->final_actions); + + // update the parent context as necessary + if (!$has_leaving_statements) { + IfAnalyzer::updateIfScope( + $codebase, + $if_scope, + $elseif_context, + $outer_context, + array_merge($new_stmts_assigned_var_ids, $assigned_in_conditional_var_ids), + $new_stmts_possibly_assigned_var_ids, + $newly_reconciled_var_ids + ); + + $reasonable_clause_count = count($if_scope->reasonable_clauses); + + if ($reasonable_clause_count && $reasonable_clause_count < 20000 && $elseif_clauses) { + $if_scope->reasonable_clauses = Algebra::combineOredClauses( + $if_scope->reasonable_clauses, + $elseif_clauses, + $elseif_cond_id + ); + } else { + $if_scope->reasonable_clauses = []; + } + } else { + $if_scope->reasonable_clauses = []; + } + + if ($negated_elseif_types) { + if ($has_leaving_statements) { + $newly_reconciled_var_ids = []; + + $leaving_vars_reconciled = Reconciler::reconcileKeyedTypes( + $negated_elseif_types, + [], + $pre_conditional_context->vars_in_scope, + $newly_reconciled_var_ids, + [], + $statements_analyzer, + $statements_analyzer->getTemplateTypeMap() ?: [], + $elseif_context->inside_loop, + new CodeLocation($statements_analyzer->getSource(), $elseif, $outer_context->include_location) + ); + + $implied_outer_context = clone $elseif_context; + $implied_outer_context->vars_in_scope = $leaving_vars_reconciled; + + $updated_vars = []; + + $outer_context->update( + $elseif_context, + $implied_outer_context, + false, + array_keys($negated_elseif_types), + $updated_vars + ); + } + } + + if (!$has_ending_statements) { + $vars_possibly_in_scope = array_diff_key( + $elseif_context->vars_possibly_in_scope, + $outer_context->vars_possibly_in_scope + ); + + $possibly_assigned_var_ids = $new_stmts_possibly_assigned_var_ids; + + if ($has_leaving_statements && $elseif_context->loop_scope) { + if (!$has_continue_statement && !$has_break_statement) { + $if_scope->new_vars_possibly_in_scope = array_merge( + $vars_possibly_in_scope, + $if_scope->new_vars_possibly_in_scope + ); + $if_scope->possibly_assigned_var_ids = array_merge( + $possibly_assigned_var_ids, + $if_scope->possibly_assigned_var_ids + ); + } + + $elseif_context->loop_scope->vars_possibly_in_scope = array_merge( + $vars_possibly_in_scope, + $elseif_context->loop_scope->vars_possibly_in_scope + ); + } elseif (!$has_leaving_statements) { + $if_scope->new_vars_possibly_in_scope = array_merge( + $vars_possibly_in_scope, + $if_scope->new_vars_possibly_in_scope + ); + $if_scope->possibly_assigned_var_ids = array_merge( + $possibly_assigned_var_ids, + $if_scope->possibly_assigned_var_ids + ); + } + } + + if ($outer_context->collect_exceptions) { + $outer_context->mergeExceptions($elseif_context); + } + + try { + $if_scope->negated_clauses = Algebra::simplifyCNF( + array_merge( + $if_scope->negated_clauses, + Algebra::negateFormula($elseif_clauses) + ) + ); + } catch (ComplicatedExpressionException $e) { + $if_scope->negated_clauses = []; + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php new file mode 100644 index 00000000..005a2722 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php @@ -0,0 +1,532 @@ + $pre_assignment_else_redefined_vars + * + * @return false|null + */ + public static function analyze( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Stmt\If_ $stmt, + IfScope $if_scope, + IfConditionalScope $if_conditional_scope, + Context $if_context, + Context $old_if_context, + Context $outer_context, + array $pre_assignment_else_redefined_vars + ): ?bool { + $codebase = $statements_analyzer->getCodebase(); + + $if_context->parent_context = $outer_context; + + $assigned_var_ids = $if_context->assigned_var_ids; + $possibly_assigned_var_ids = $if_context->possibly_assigned_var_ids; + $if_context->assigned_var_ids = []; + $if_context->possibly_assigned_var_ids = []; + + if ($statements_analyzer->analyze( + $stmt->stmts, + $if_context + ) === false + ) { + return false; + } + + $final_actions = ScopeAnalyzer::getControlActions( + $stmt->stmts, + $statements_analyzer->node_data, + $codebase->config->exit_functions, + [] + ); + + $has_ending_statements = $final_actions === [ScopeAnalyzer::ACTION_END]; + + $has_leaving_statements = $has_ending_statements + || (count($final_actions) && !in_array(ScopeAnalyzer::ACTION_NONE, $final_actions, true)); + + $has_break_statement = $final_actions === [ScopeAnalyzer::ACTION_BREAK]; + $has_continue_statement = $final_actions === [ScopeAnalyzer::ACTION_CONTINUE]; + + $if_scope->final_actions = $final_actions; + + /** @var array */ + $new_assigned_var_ids = $if_context->assigned_var_ids; + /** @var array */ + $new_possibly_assigned_var_ids = $if_context->possibly_assigned_var_ids; + + $if_context->assigned_var_ids = array_merge($assigned_var_ids, $new_assigned_var_ids); + $if_context->possibly_assigned_var_ids = array_merge( + $possibly_assigned_var_ids, + $new_possibly_assigned_var_ids + ); + + foreach ($if_context->byref_constraints as $var_id => $byref_constraint) { + if (isset($outer_context->byref_constraints[$var_id]) + && $byref_constraint->type + && ($outer_constraint_type = $outer_context->byref_constraints[$var_id]->type) + && !UnionTypeComparator::isContainedBy( + $codebase, + $byref_constraint->type, + $outer_constraint_type + ) + ) { + IssueBuffer::maybeAdd( + new ConflictingReferenceConstraint( + 'There is more than one pass-by-reference constraint on ' . $var_id + . ' between ' . $byref_constraint->type->getId() + . ' and ' . $outer_constraint_type->getId(), + new CodeLocation($statements_analyzer, $stmt, $outer_context->include_location, true) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + $outer_context->byref_constraints[$var_id] = $byref_constraint; + } + } + + $mic_drop = false; + + if (!$has_leaving_statements) { + self::updateIfScope( + $codebase, + $if_scope, + $if_context, + $outer_context, + $new_assigned_var_ids, + $new_possibly_assigned_var_ids, + $if_scope->if_cond_changed_var_ids + ); + + if ($if_scope->reasonable_clauses) { + // remove all reasonable clauses that would be negated by the if stmts + foreach ($new_assigned_var_ids as $var_id => $_) { + $if_scope->reasonable_clauses = Context::filterClauses( + $var_id, + $if_scope->reasonable_clauses, + $if_context->vars_in_scope[$var_id] ?? null, + $statements_analyzer + ); + } + } + } else { + if (!$has_break_statement) { + $if_scope->reasonable_clauses = []; + + // If we're assigning inside + if ($if_conditional_scope->assigned_in_conditional_var_ids + && $if_scope->post_leaving_if_context + ) { + self::addConditionallyAssignedVarsToContext( + $statements_analyzer, + $stmt->cond, + $if_scope->post_leaving_if_context, + $outer_context, + $if_conditional_scope->assigned_in_conditional_var_ids + ); + } + + if (!$stmt->else && !$stmt->elseifs) { + $mic_drop = self::handleMicDrop( + $statements_analyzer, + $stmt->cond, + $if_scope, + $outer_context, + $new_assigned_var_ids + ); + + $outer_context->clauses = Algebra::simplifyCNF( + array_merge($outer_context->clauses, $if_scope->negated_clauses) + ); + } + } + } + + // update the parent context as necessary, but only if we can safely reason about type negation. + // We only update vars that changed both at the start of the if block and then again by an assignment + // in the if statement. + if ($if_scope->negated_types && !$mic_drop) { + $vars_to_update = array_intersect( + array_keys($pre_assignment_else_redefined_vars), + array_keys($if_scope->negated_types) + ); + + $extra_vars_to_update = []; + + // if there's an object-like array in there, we also need to update the root array variable + foreach ($vars_to_update as $var_id) { + $bracked_pos = strpos($var_id, '['); + if ($bracked_pos !== false) { + $extra_vars_to_update[] = substr($var_id, 0, $bracked_pos); + } + } + + if ($extra_vars_to_update) { + $vars_to_update = array_unique(array_merge($extra_vars_to_update, $vars_to_update)); + } + + //update $if_context vars to include the pre-assignment else vars + if (!$stmt->else && !$has_leaving_statements) { + foreach ($pre_assignment_else_redefined_vars as $var_id => $type) { + if (isset($if_context->vars_in_scope[$var_id])) { + $if_context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $if_context->vars_in_scope[$var_id], + $type, + $codebase + ); + } + } + } + + $outer_context->update( + $old_if_context, + $if_context, + $has_leaving_statements, + $vars_to_update, + $if_scope->updated_vars + ); + } + + if (!$has_ending_statements) { + $vars_possibly_in_scope = array_diff_key( + $if_context->vars_possibly_in_scope, + $outer_context->vars_possibly_in_scope + ); + + if ($if_context->loop_scope) { + if (!$has_continue_statement && !$has_break_statement) { + $if_scope->new_vars_possibly_in_scope = $vars_possibly_in_scope; + } + + $if_context->loop_scope->vars_possibly_in_scope = array_merge( + $vars_possibly_in_scope, + $if_context->loop_scope->vars_possibly_in_scope + ); + } elseif (!$has_leaving_statements) { + $if_scope->new_vars_possibly_in_scope = $vars_possibly_in_scope; + } + } + + if ($outer_context->collect_exceptions) { + $outer_context->mergeExceptions($if_context); + } + + return null; + } + + /** + * This handles the situation when returning inside an + * if block with no else or elseifs + * + * @param array $new_assigned_var_ids + */ + private static function handleMicDrop( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $cond, + IfScope $if_scope, + Context $post_if_context, + array $new_assigned_var_ids + ): bool { + if (!$if_scope->negated_types) { + return false; + } + + $newly_reconciled_var_ids = []; + + $post_if_context_vars_reconciled = Reconciler::reconcileKeyedTypes( + $if_scope->negated_types, + [], + $post_if_context->vars_in_scope, + $newly_reconciled_var_ids, + [], + $statements_analyzer, + $statements_analyzer->getTemplateTypeMap() ?: [], + $post_if_context->inside_loop, + new CodeLocation( + $statements_analyzer->getSource(), + $cond instanceof PhpParser\Node\Expr\BooleanNot + ? $cond->expr + : $cond, + $post_if_context->include_location, + false + ) + ); + + foreach ($newly_reconciled_var_ids as $changed_var_id => $_) { + $post_if_context->removeVarFromConflictingClauses($changed_var_id); + } + + $newly_reconciled_var_ids += $new_assigned_var_ids; + + foreach ($newly_reconciled_var_ids as $var_id => $_) { + $if_scope->negated_clauses = Context::filterClauses( + $var_id, + $if_scope->negated_clauses + ); + } + + foreach ($newly_reconciled_var_ids as $var_id => $_) { + $first_appearance = $statements_analyzer->getFirstAppearance($var_id); + + if ($first_appearance + && isset($post_if_context->vars_in_scope[$var_id]) + && isset($post_if_context_vars_reconciled[$var_id]) + && $post_if_context->vars_in_scope[$var_id]->hasMixed() + && !$post_if_context_vars_reconciled[$var_id]->hasMixed() + ) { + if (!$post_if_context->collect_initializations + && !$post_if_context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + ) { + $parent_source = $statements_analyzer->getSource(); + + $functionlike_storage = $parent_source instanceof FunctionLikeAnalyzer + ? $parent_source->getFunctionLikeStorage($statements_analyzer) + : null; + + if (!$functionlike_storage + || (!$parent_source->getSource() instanceof TraitAnalyzer + && !isset($functionlike_storage->param_lookup[substr($var_id, 1)])) + ) { + $codebase = $statements_analyzer->getCodebase(); + $codebase->analyzer->decrementMixedCount($statements_analyzer->getFilePath()); + } + } + + IssueBuffer::remove( + $statements_analyzer->getFilePath(), + 'MixedAssignment', + $first_appearance->raw_file_start + ); + } + } + + $post_if_context->vars_in_scope = $post_if_context_vars_reconciled; + + return true; + } + + /** + * @param array $assigned_in_conditional_var_ids + */ + public static function addConditionallyAssignedVarsToContext( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $cond, + Context $post_leaving_if_context, + Context $post_if_context, + array $assigned_in_conditional_var_ids + ): void { + // this filters out coercions to expected types in ArgumentAnalyzer + $assigned_in_conditional_var_ids = array_filter($assigned_in_conditional_var_ids); + + if (!$assigned_in_conditional_var_ids) { + return; + } + + $exprs = self::getDefinitelyEvaluatedOredExpressions($cond); + + // if there was no assignment in the first expression it's safe to proceed + $old_node_data = $statements_analyzer->node_data; + $statements_analyzer->node_data = clone $old_node_data; + + IssueBuffer::startRecording(); + + foreach ($exprs as $expr) { + if ($expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd) { + $fake_not = new VirtualBooleanOr( + self::negateExpr($expr->left), + self::negateExpr($expr->right), + $expr->getAttributes() + ); + } else { + $fake_not = self::negateExpr($expr); + } + + $fake_negated_expr = new VirtualFuncCall( + new VirtualFullyQualified('assert'), + [new VirtualArg( + $fake_not, + false, + false, + $expr->getAttributes() + )], + $expr->getAttributes() + ); + + $post_leaving_if_context->inside_negation = !$post_leaving_if_context->inside_negation; + + ExpressionAnalyzer::analyze( + $statements_analyzer, + $fake_negated_expr, + $post_leaving_if_context + ); + + $post_leaving_if_context->inside_negation = !$post_leaving_if_context->inside_negation; + } + + IssueBuffer::clearRecordingLevel(); + IssueBuffer::stopRecording(); + + $statements_analyzer->node_data = $old_node_data; + + foreach ($assigned_in_conditional_var_ids as $var_id => $_) { + if (isset($post_leaving_if_context->vars_in_scope[$var_id])) { + $post_if_context->vars_in_scope[$var_id] = clone $post_leaving_if_context->vars_in_scope[$var_id]; + } + } + } + + /** + * Returns all expressions inside an ored expression + * @return non-empty-list + */ + private static function getDefinitelyEvaluatedOredExpressions(PhpParser\Node\Expr $stmt): array + { + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalOr + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalXor + ) { + return array_merge( + self::getDefinitelyEvaluatedOredExpressions($stmt->left), + self::getDefinitelyEvaluatedOredExpressions($stmt->right) + ); + } + + return [$stmt]; + } + + private static function negateExpr(PhpParser\Node\Expr $expr): PhpParser\Node\Expr + { + if ($expr instanceof PhpParser\Node\Expr\BooleanNot) { + return $expr->expr; + } + + return new VirtualBooleanNot($expr, $expr->getAttributes()); + } + + /** + * @param array $assigned_var_ids + * @param array $possibly_assigned_var_ids + * @param array $newly_reconciled_var_ids + */ + public static function updateIfScope( + Codebase $codebase, + IfScope $if_scope, + Context $if_context, + Context $outer_context, + array $assigned_var_ids, + array $possibly_assigned_var_ids, + array $newly_reconciled_var_ids, + bool $update_new_vars = true + ): void { + $redefined_vars = $if_context->getRedefinedVars($outer_context->vars_in_scope); + + if ($if_scope->new_vars === null) { + if ($update_new_vars) { + $if_scope->new_vars = array_diff_key($if_context->vars_in_scope, $outer_context->vars_in_scope); + } + } else { + foreach ($if_scope->new_vars as $new_var => $type) { + if (!$if_context->hasVariable($new_var)) { + unset($if_scope->new_vars[$new_var]); + } else { + $if_scope->new_vars[$new_var] = Type::combineUnionTypes( + $type, + $if_context->vars_in_scope[$new_var], + $codebase + ); + } + } + } + + $possibly_redefined_vars = $redefined_vars; + + foreach ($possibly_redefined_vars as $var_id => $_) { + if (!isset($possibly_assigned_var_ids[$var_id]) + && isset($newly_reconciled_var_ids[$var_id]) + ) { + unset($possibly_redefined_vars[$var_id]); + } + } + + if ($if_scope->assigned_var_ids === null) { + $if_scope->assigned_var_ids = $assigned_var_ids; + } else { + $if_scope->assigned_var_ids = array_intersect_key($assigned_var_ids, $if_scope->assigned_var_ids); + } + + $if_scope->possibly_assigned_var_ids += $possibly_assigned_var_ids; + + if ($if_scope->redefined_vars === null) { + $if_scope->redefined_vars = $redefined_vars; + $if_scope->possibly_redefined_vars = $possibly_redefined_vars; + } else { + foreach ($if_scope->redefined_vars as $redefined_var => $type) { + if (!isset($redefined_vars[$redefined_var])) { + unset($if_scope->redefined_vars[$redefined_var]); + } else { + $if_scope->redefined_vars[$redefined_var] = Type::combineUnionTypes( + $redefined_vars[$redefined_var], + $type, + $codebase + ); + + if (isset($outer_context->vars_in_scope[$redefined_var]) + && $if_scope->redefined_vars[$redefined_var]->equals( + $outer_context->vars_in_scope[$redefined_var] + ) + ) { + unset($if_scope->redefined_vars[$redefined_var]); + } + } + } + + foreach ($possibly_redefined_vars as $var => $type) { + $if_scope->possibly_redefined_vars[$var] = Type::combineUnionTypes( + $type, + $if_scope->possibly_redefined_vars[$var] ?? null, + $codebase + ); + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php new file mode 100644 index 00000000..1f9dcc35 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php @@ -0,0 +1,509 @@ +getCodebase(); + + $if_scope = new IfScope(); + + // We need to clone the original context for later use if we're exiting in this if conditional + if ($stmt->cond instanceof PhpParser\Node\Expr\BinaryOp + || ($stmt->cond instanceof PhpParser\Node\Expr\BooleanNot + && $stmt->cond->expr instanceof PhpParser\Node\Expr\BinaryOp) + ) { + $final_actions = ScopeAnalyzer::getControlActions( + $stmt->stmts, + null, + $codebase->config->exit_functions, + [] + ); + + $has_leaving_statements = $final_actions === [ScopeAnalyzer::ACTION_END] + || (count($final_actions) && !in_array(ScopeAnalyzer::ACTION_NONE, $final_actions, true)); + + if ($has_leaving_statements) { + $if_scope->post_leaving_if_context = clone $context; + } + } + + try { + $if_conditional_scope = IfConditionalAnalyzer::analyze( + $statements_analyzer, + $stmt->cond, + $context, + $codebase, + $if_scope, + $context->branch_point ?: (int) $stmt->getAttribute('startFilePos') + ); + + $if_context = $if_conditional_scope->if_context; + + $post_if_context = $if_conditional_scope->post_if_context; + $cond_referenced_var_ids = $if_conditional_scope->cond_referenced_var_ids; + $assigned_in_conditional_var_ids = $if_conditional_scope->assigned_in_conditional_var_ids; + } catch (ScopeAnalysisException $e) { + return false; + } + + $mixed_var_ids = []; + + foreach ($if_context->vars_in_scope as $var_id => $type) { + if ($type->isMixed() && isset($context->vars_in_scope[$var_id])) { + $mixed_var_ids[] = $var_id; + } + } + + $cond_object_id = spl_object_id($stmt->cond); + + $if_clauses = FormulaGenerator::getFormula( + $cond_object_id, + $cond_object_id, + $stmt->cond, + $context->self, + $statements_analyzer, + $codebase + ); + + if (count($if_clauses) > 200) { + $if_clauses = []; + } + + $if_clauses = array_map( + /** + * @return Clause + */ + function (Clause $c) use ($mixed_var_ids, $cond_object_id): Clause { + $keys = array_keys($c->possibilities); + + $mixed_var_ids = array_diff($mixed_var_ids, $keys); + + foreach ($keys as $key) { + foreach ($mixed_var_ids as $mixed_var_id) { + if (preg_match('/^' . preg_quote($mixed_var_id, '/') . '(\[|-)/', $key)) { + return new Clause([], $cond_object_id, $cond_object_id, true); + } + } + } + + return $c; + }, + $if_clauses + ); + + $entry_clauses = $context->clauses; + + // this will see whether any of the clauses in set A conflict with the clauses in set B + AlgebraAnalyzer::checkForParadox( + $context->clauses, + $if_clauses, + $statements_analyzer, + $stmt->cond, + $assigned_in_conditional_var_ids + ); + + // if we have assignments in the if, we may have duplicate clauses + if ($assigned_in_conditional_var_ids) { + $if_clauses = Algebra::simplifyCNF($if_clauses); + } + + $if_context_clauses = array_merge($entry_clauses, $if_clauses); + + $if_context->clauses = Algebra::simplifyCNF($if_context_clauses); + + if ($if_context->reconciled_expression_clauses) { + $reconciled_expression_clauses = $if_context->reconciled_expression_clauses; + + $if_context->clauses = array_values( + array_filter( + $if_context->clauses, + function ($c) use ($reconciled_expression_clauses): bool { + return !in_array($c->hash, $reconciled_expression_clauses); + } + ) + ); + + if (count($if_context->clauses) === 1 + && $if_context->clauses[0]->wedge + && !$if_context->clauses[0]->possibilities + ) { + $if_context->clauses = []; + $if_context->reconciled_expression_clauses = []; + } + } + + // define this before we alter local clauses after reconciliation + $if_scope->reasonable_clauses = $if_context->clauses; + + try { + $if_scope->negated_clauses = Algebra::negateFormula($if_clauses); + } catch (ComplicatedExpressionException $e) { + try { + $if_scope->negated_clauses = FormulaGenerator::getFormula( + $cond_object_id, + $cond_object_id, + new VirtualBooleanNot($stmt->cond), + $context->self, + $statements_analyzer, + $codebase, + false + ); + } catch (ComplicatedExpressionException $e) { + $if_scope->negated_clauses = []; + } + } + + $if_scope->negated_types = Algebra::getTruthsFromFormula( + Algebra::simplifyCNF( + array_merge($context->clauses, $if_scope->negated_clauses) + ) + ); + + $active_if_types = []; + + $reconcilable_if_types = Algebra::getTruthsFromFormula( + $if_context->clauses, + spl_object_id($stmt->cond), + $cond_referenced_var_ids, + $active_if_types + ); + + if (array_filter( + $context->clauses, + function ($clause): bool { + return (bool)$clause->possibilities; + } + )) { + $omit_keys = array_reduce( + $context->clauses, + /** + * @param array $carry + * @return array + */ + function (array $carry, Clause $clause): array { + return array_merge($carry, array_keys($clause->possibilities)); + }, + [] + ); + + $omit_keys = array_combine($omit_keys, $omit_keys); + $omit_keys = array_diff_key($omit_keys, Algebra::getTruthsFromFormula($context->clauses)); + + $cond_referenced_var_ids = array_diff_key( + $cond_referenced_var_ids, + $omit_keys + ); + } + + // if the if has an || in the conditional, we cannot easily reason about it + if ($reconcilable_if_types) { + $changed_var_ids = []; + + $if_vars_in_scope_reconciled = + Reconciler::reconcileKeyedTypes( + $reconcilable_if_types, + $active_if_types, + $if_context->vars_in_scope, + $changed_var_ids, + $cond_referenced_var_ids, + $statements_analyzer, + $statements_analyzer->getTemplateTypeMap() ?: [], + $if_context->inside_loop, + $context->check_variables + ? new CodeLocation( + $statements_analyzer->getSource(), + $stmt->cond instanceof PhpParser\Node\Expr\BooleanNot + ? $stmt->cond->expr + : $stmt->cond, + $context->include_location + ) : null + ); + + $if_context->vars_in_scope = $if_vars_in_scope_reconciled; + + foreach ($reconcilable_if_types as $var_id => $_) { + $if_context->vars_possibly_in_scope[$var_id] = true; + } + + if ($changed_var_ids) { + $if_context->clauses = Context::removeReconciledClauses($if_context->clauses, $changed_var_ids)[0]; + + foreach ($changed_var_ids as $changed_var_id => $_) { + foreach ($if_context->vars_in_scope as $var_id => $_) { + if (preg_match('/' . preg_quote($changed_var_id, '/') . '[\]\[\-]/', $var_id) + && !array_key_exists($var_id, $changed_var_ids) + && !array_key_exists($var_id, $cond_referenced_var_ids) + ) { + unset($if_context->vars_in_scope[$var_id]); + } + } + } + } + + $if_scope->if_cond_changed_var_ids = $changed_var_ids; + } + + $if_context->reconciled_expression_clauses = []; + + $old_if_context = clone $if_context; + $context->vars_possibly_in_scope = array_merge( + $if_context->vars_possibly_in_scope, + $context->vars_possibly_in_scope + ); + + $context->referenced_var_ids = array_merge( + $if_context->referenced_var_ids, + $context->referenced_var_ids + ); + + $temp_else_context = clone $post_if_context; + + $changed_var_ids = []; + + if ($if_scope->negated_types) { + $else_vars_reconciled = Reconciler::reconcileKeyedTypes( + $if_scope->negated_types, + [], + $temp_else_context->vars_in_scope, + $changed_var_ids, + [], + $statements_analyzer, + $statements_analyzer->getTemplateTypeMap() ?: [], + $context->inside_loop, + $context->check_variables + ? new CodeLocation( + $statements_analyzer->getSource(), + $stmt->cond instanceof PhpParser\Node\Expr\BooleanNot + ? $stmt->cond->expr + : $stmt->cond, + $context->include_location + ) : null + ); + + $temp_else_context->vars_in_scope = $else_vars_reconciled; + } + + // we calculate the vars redefined in a hypothetical else statement to determine + // which vars of the if we can safely change + $pre_assignment_else_redefined_vars = array_intersect_key( + $temp_else_context->getRedefinedVars($context->vars_in_scope, true), + $changed_var_ids + ); + + // check the if + if (IfAnalyzer::analyze( + $statements_analyzer, + $stmt, + $if_scope, + $if_conditional_scope, + $if_context, + $old_if_context, + $context, + $pre_assignment_else_redefined_vars + ) === false) { + return false; + } + + // this has to go on a separate line because the phar compactor messes with precedence + $scope_to_clone = $if_scope->post_leaving_if_context ?? $post_if_context; + $else_context = clone $scope_to_clone; + + // check the elseifs + foreach ($stmt->elseifs as $elseif) { + if (ElseIfAnalyzer::analyze( + $statements_analyzer, + $elseif, + $if_scope, + $else_context, + $context, + $codebase, + $else_context->branch_point ?: (int) $stmt->getAttribute('startFilePos') + ) === false) { + return false; + } + } + + if ($stmt->else) { + if ($codebase->alter_code) { + $else_context->branch_point = + $else_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); + } + } + + if (ElseAnalyzer::analyze( + $statements_analyzer, + $stmt->else, + $if_scope, + $else_context, + $context + ) === false) { + return false; + } + + if ($context->loop_scope) { + $context->loop_scope->final_actions = array_unique( + array_merge( + $context->loop_scope->final_actions, + $if_scope->final_actions + ) + ); + } + + $context->vars_possibly_in_scope = array_merge( + $context->vars_possibly_in_scope, + $if_scope->new_vars_possibly_in_scope + ); + + $context->possibly_assigned_var_ids = array_merge( + $context->possibly_assigned_var_ids, + $if_scope->possibly_assigned_var_ids ?: [] + ); + + // vars can only be defined/redefined if there was an else (defined in every block) + $context->assigned_var_ids = array_merge( + $context->assigned_var_ids, + $if_scope->assigned_var_ids ?: [] + ); + + if ($if_scope->new_vars) { + foreach ($if_scope->new_vars as $var_id => $type) { + if (isset($context->vars_possibly_in_scope[$var_id]) + && $statements_analyzer->data_flow_graph + ) { + $type->parent_nodes += $statements_analyzer->getParentNodesForPossiblyUndefinedVariable($var_id); + } + + $context->vars_in_scope[$var_id] = $type; + } + } + + if ($if_scope->redefined_vars) { + foreach ($if_scope->redefined_vars as $var_id => $type) { + $context->vars_in_scope[$var_id] = $type; + $if_scope->updated_vars[$var_id] = true; + + if ($if_scope->reasonable_clauses) { + $if_scope->reasonable_clauses = Context::filterClauses( + $var_id, + $if_scope->reasonable_clauses, + $context->vars_in_scope[$var_id] ?? null, + $statements_analyzer + ); + } + } + } + + if ($if_scope->reasonable_clauses + && (count($if_scope->reasonable_clauses) > 1 || !$if_scope->reasonable_clauses[0]->wedge) + ) { + $context->clauses = Algebra::simplifyCNF( + array_merge( + $if_scope->reasonable_clauses, + $context->clauses + ) + ); + } + + if ($if_scope->possibly_redefined_vars) { + foreach ($if_scope->possibly_redefined_vars as $var_id => $type) { + if (isset($context->vars_in_scope[$var_id])) { + if (!$type->failed_reconciliation + && !isset($if_scope->updated_vars[$var_id]) + ) { + $combined_type = Type::combineUnionTypes( + $context->vars_in_scope[$var_id], + $type, + $codebase + ); + + if (!$combined_type->equals($context->vars_in_scope[$var_id])) { + $context->removeDescendents($var_id, $combined_type); + } + + $context->vars_in_scope[$var_id] = $combined_type; + } else { + $context->vars_in_scope[$var_id]->parent_nodes += $type->parent_nodes; + } + } + } + } + + $context->possibly_assigned_var_ids += $if_scope->possibly_assigned_var_ids; + + if (!in_array(ScopeAnalyzer::ACTION_NONE, $if_scope->final_actions, true)) { + $context->has_returned = true; + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php new file mode 100644 index 00000000..1cfd4023 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php @@ -0,0 +1,735 @@ + $stmts + * @param PhpParser\Node\Expr[] $pre_conditions + * @param PhpParser\Node\Expr[] $post_expressions + * + * @return false|null + */ + public static function analyze( + StatementsAnalyzer $statements_analyzer, + array $stmts, + array $pre_conditions, + array $post_expressions, + LoopScope $loop_scope, + Context &$inner_context = null, + bool $is_do = false, + bool $always_enters_loop = false + ): ?bool { + $traverser = new PhpParser\NodeTraverser; + + $assignment_mapper = new AssignmentMapVisitor($loop_scope->loop_context->self); + $traverser->addVisitor($assignment_mapper); + + $traverser->traverse(array_merge($pre_conditions, $stmts, $post_expressions)); + + $assignment_map = $assignment_mapper->getAssignmentMap(); + + $assignment_depth = 0; + + $always_assigned_before_loop_body_vars = []; + + $pre_condition_clauses = []; + + $original_protected_var_ids = $loop_scope->loop_parent_context->protected_var_ids; + + $codebase = $statements_analyzer->getCodebase(); + + $inner_do_context = null; + + if ($pre_conditions) { + foreach ($pre_conditions as $i => $pre_condition) { + $pre_condition_id = spl_object_id($pre_condition); + + $pre_condition_clauses[$i] = FormulaGenerator::getFormula( + $pre_condition_id, + $pre_condition_id, + $pre_condition, + $loop_scope->loop_context->self, + $statements_analyzer, + $codebase + ); + } + } else { + $always_assigned_before_loop_body_vars = Context::getNewOrUpdatedVarIds( + $loop_scope->loop_parent_context, + $loop_scope->loop_context + ); + } + + $final_actions = ScopeAnalyzer::getControlActions( + $stmts, + $statements_analyzer->node_data, + Config::getInstance()->exit_functions, + [] + ); + + $does_always_break = $final_actions === [ScopeAnalyzer::ACTION_BREAK]; + + $has_continue = in_array(ScopeAnalyzer::ACTION_CONTINUE, $final_actions, true); + + if ($assignment_map) { + $first_var_id = array_keys($assignment_map)[0]; + + $assignment_depth = self::getAssignmentMapDepth($first_var_id, $assignment_map); + } + + if ($has_continue) { + // this intuitively feels right to me – if there's a continue statement, + // maybe more assignment intrigue is possible + $assignment_depth++; + } + + $loop_scope->loop_context->parent_context = $loop_scope->loop_parent_context; + + $pre_outer_context = $loop_scope->loop_parent_context; + + if ($assignment_depth === 0 || $does_always_break) { + $inner_context = clone $loop_scope->loop_context; + + foreach ($inner_context->vars_in_scope as $context_var_id => $context_type) { + $inner_context->vars_in_scope[$context_var_id] = clone $context_type; + } + + $inner_context->loop_scope = $loop_scope; + + $inner_context->parent_context = $loop_scope->loop_context; + $old_referenced_var_ids = $inner_context->referenced_var_ids; + $inner_context->referenced_var_ids = []; + + foreach ($pre_conditions as $condition_offset => $pre_condition) { + self::applyPreConditionToLoopContext( + $statements_analyzer, + $pre_condition, + $pre_condition_clauses[$condition_offset], + $inner_context, + $loop_scope->loop_parent_context, + $is_do + ); + } + + $inner_context->protected_var_ids = $loop_scope->protected_var_ids; + + $statements_analyzer->analyze($stmts, $inner_context); + self::updateLoopScopeContexts($loop_scope, $loop_scope->loop_parent_context); + + foreach ($post_expressions as $post_expression) { + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $post_expression, + $loop_scope->loop_context + ) === false + ) { + return false; + } + } + + $inner_context->referenced_var_ids = $old_referenced_var_ids + $inner_context->referenced_var_ids; + + $loop_scope->loop_parent_context->vars_possibly_in_scope = array_merge( + $inner_context->vars_possibly_in_scope, + $loop_scope->loop_parent_context->vars_possibly_in_scope + ); + } else { + $pre_outer_context = clone $loop_scope->loop_parent_context; + + $analyzer = $statements_analyzer->getCodebase()->analyzer; + + $original_mixed_counts = $analyzer->getMixedCountsForFile($statements_analyzer->getFilePath()); + + $pre_condition_vars_in_scope = $loop_scope->loop_context->vars_in_scope; + + IssueBuffer::startRecording(); + + if (!$is_do) { + foreach ($pre_conditions as $condition_offset => $pre_condition) { + self::applyPreConditionToLoopContext( + $statements_analyzer, + $pre_condition, + $pre_condition_clauses[$condition_offset], + $loop_scope->loop_context, + $loop_scope->loop_parent_context, + $is_do + ); + } + } + + // record all the vars that existed before we did the first pass through the loop + $pre_loop_context = clone $loop_scope->loop_context; + + $inner_context = clone $loop_scope->loop_context; + + foreach ($inner_context->vars_in_scope as $context_var_id => $context_type) { + $inner_context->vars_in_scope[$context_var_id] = clone $context_type; + } + + $inner_context->parent_context = $loop_scope->loop_context; + $inner_context->loop_scope = $loop_scope; + + $old_referenced_var_ids = $inner_context->referenced_var_ids; + $inner_context->referenced_var_ids = []; + + $inner_context->protected_var_ids = $loop_scope->protected_var_ids; + + $statements_analyzer->analyze($stmts, $inner_context); + + self::updateLoopScopeContexts($loop_scope, $pre_outer_context); + + $inner_context->protected_var_ids = $original_protected_var_ids; + + if ($is_do) { + $inner_do_context = clone $inner_context; + + foreach ($pre_conditions as $condition_offset => $pre_condition) { + $always_assigned_before_loop_body_vars = array_merge( + self::applyPreConditionToLoopContext( + $statements_analyzer, + $pre_condition, + $pre_condition_clauses[$condition_offset], + $inner_context, + $loop_scope->loop_parent_context, + $is_do + ), + $always_assigned_before_loop_body_vars + ); + } + } + + $always_assigned_before_loop_body_vars = array_unique($always_assigned_before_loop_body_vars); + + foreach ($post_expressions as $post_expression) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $post_expression, $inner_context) === false) { + return false; + } + } + + $inner_context->referenced_var_ids = array_intersect_key( + $old_referenced_var_ids, + $inner_context->referenced_var_ids + ); + + $recorded_issues = IssueBuffer::clearRecordingLevel(); + IssueBuffer::stopRecording(); + + for ($i = 0; $i < $assignment_depth; ++$i) { + $vars_to_remove = []; + + $loop_scope->iteration_count++; + + $has_changes = false; + + // reset the $inner_context to what it was before we started the analysis, + // but union the types with what's in the loop scope + + foreach ($inner_context->vars_in_scope as $var_id => $type) { + if (in_array($var_id, $always_assigned_before_loop_body_vars, true)) { + // set the vars to whatever the while/foreach loop expects them to be + if (!isset($pre_loop_context->vars_in_scope[$var_id]) + || !$type->equals($pre_loop_context->vars_in_scope[$var_id]) + ) { + $has_changes = true; + } + } elseif (isset($pre_outer_context->vars_in_scope[$var_id])) { + if (!$type->equals($pre_outer_context->vars_in_scope[$var_id])) { + $has_changes = true; + + // widen the foreach context type with the initial context type + $inner_context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $inner_context->vars_in_scope[$var_id], + $pre_outer_context->vars_in_scope[$var_id] + ); + + // if there's a change, invalidate related clauses + $pre_loop_context->removeVarFromConflictingClauses($var_id); + + $loop_scope->loop_parent_context->possibly_assigned_var_ids[$var_id] = true; + } + + if (isset($loop_scope->loop_context->vars_in_scope[$var_id]) + && !$type->equals($loop_scope->loop_context->vars_in_scope[$var_id]) + ) { + $has_changes = true; + + // widen the foreach context type with the initial context type + $inner_context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $inner_context->vars_in_scope[$var_id], + $loop_scope->loop_context->vars_in_scope[$var_id] + ); + + // if there's a change, invalidate related clauses + $pre_loop_context->removeVarFromConflictingClauses($var_id); + } + } else { + // give an opportunity to redeemed UndefinedVariable issues + if ($recorded_issues) { + $has_changes = true; + } + + // if we're in a do block we don't want to remove vars before evaluating + // the where conditional + if (!$is_do) { + $vars_to_remove[] = $var_id; + } + } + } + + $inner_context->has_returned = false; + + $loop_scope->loop_parent_context->vars_possibly_in_scope = array_merge( + $inner_context->vars_possibly_in_scope, + $loop_scope->loop_parent_context->vars_possibly_in_scope + ); + + // if there are no changes to the types, no need to re-examine + if (!$has_changes) { + break; + } + + // remove vars that were defined in the foreach + foreach ($vars_to_remove as $var_id) { + unset($inner_context->vars_in_scope[$var_id]); + } + + $inner_context->clauses = $pre_loop_context->clauses; + $inner_context->byref_constraints = $pre_loop_context->byref_constraints; + + $analyzer->setMixedCountsForFile($statements_analyzer->getFilePath(), $original_mixed_counts); + IssueBuffer::startRecording(); + + foreach ($pre_loop_context->vars_in_scope as $var_id => $_) { + if (!isset($pre_condition_vars_in_scope[$var_id]) + && isset($inner_context->vars_in_scope[$var_id]) + && strpos($var_id, '->') === false + && strpos($var_id, '[') === false + ) { + $inner_context->vars_in_scope[$var_id]->possibly_undefined = true; + } + } + + if (!$is_do) { + foreach ($pre_conditions as $condition_offset => $pre_condition) { + self::applyPreConditionToLoopContext( + $statements_analyzer, + $pre_condition, + $pre_condition_clauses[$condition_offset], + $inner_context, + $loop_scope->loop_parent_context, + false + ); + } + } + + foreach ($always_assigned_before_loop_body_vars as $var_id) { + if ((!isset($inner_context->vars_in_scope[$var_id]) + || $inner_context->vars_in_scope[$var_id]->getId() + !== $pre_loop_context->vars_in_scope[$var_id]->getId() + || $inner_context->vars_in_scope[$var_id]->from_docblock + !== $pre_loop_context->vars_in_scope[$var_id]->from_docblock + ) + ) { + if (isset($pre_loop_context->vars_in_scope[$var_id])) { + $inner_context->vars_in_scope[$var_id] = clone $pre_loop_context->vars_in_scope[$var_id]; + } else { + unset($inner_context->vars_in_scope[$var_id]); + } + } + } + + $inner_context->clauses = $pre_loop_context->clauses; + + $inner_context->protected_var_ids = $loop_scope->protected_var_ids; + + $traverser = new PhpParser\NodeTraverser; + + $traverser->addVisitor( + new NodeCleanerVisitor( + $statements_analyzer->node_data + ) + ); + $traverser->traverse($stmts); + + $statements_analyzer->analyze($stmts, $inner_context); + + self::updateLoopScopeContexts($loop_scope, $pre_outer_context); + + $inner_context->protected_var_ids = $original_protected_var_ids; + + if ($is_do) { + $inner_do_context = clone $inner_context; + + foreach ($pre_conditions as $condition_offset => $pre_condition) { + self::applyPreConditionToLoopContext( + $statements_analyzer, + $pre_condition, + $pre_condition_clauses[$condition_offset], + $inner_context, + $loop_scope->loop_parent_context, + $is_do + ); + } + } + + foreach ($post_expressions as $post_expression) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $post_expression, $inner_context) === false) { + return false; + } + } + + $recorded_issues = IssueBuffer::clearRecordingLevel(); + + IssueBuffer::stopRecording(); + } + + if ($recorded_issues) { + foreach ($recorded_issues as $recorded_issue) { + // if we're not in any loops then this will just result in the issue being emitted + IssueBuffer::bubbleUp($recorded_issue); + } + } + } + + $does_sometimes_break = in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true); + $does_always_break = $loop_scope->final_actions === [ScopeAnalyzer::ACTION_BREAK]; + + if ($does_sometimes_break) { + if ($loop_scope->possibly_redefined_loop_parent_vars !== null) { + foreach ($loop_scope->possibly_redefined_loop_parent_vars as $var => $type) { + $loop_scope->loop_parent_context->vars_in_scope[$var] = Type::combineUnionTypes( + $type, + $loop_scope->loop_parent_context->vars_in_scope[$var] + ); + + $loop_scope->loop_parent_context->possibly_assigned_var_ids[$var] = true; + } + } + } + + foreach ($loop_scope->loop_parent_context->vars_in_scope as $var_id => $type) { + if (!isset($loop_scope->loop_context->vars_in_scope[$var_id])) { + continue; + } + + if ($loop_scope->loop_context->vars_in_scope[$var_id]->getId() !== $type->getId()) { + $loop_scope->loop_parent_context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $loop_scope->loop_parent_context->vars_in_scope[$var_id], + $loop_scope->loop_context->vars_in_scope[$var_id] + ); + + $loop_scope->loop_parent_context->removeVarFromConflictingClauses($var_id); + } else { + $loop_scope->loop_parent_context->vars_in_scope[$var_id]->parent_nodes + += $loop_scope->loop_context->vars_in_scope[$var_id]->parent_nodes; + } + } + + if (!$does_always_break) { + foreach ($loop_scope->loop_parent_context->vars_in_scope as $var_id => $type) { + if (!isset($inner_context->vars_in_scope[$var_id])) { + unset($loop_scope->loop_parent_context->vars_in_scope[$var_id]); + continue; + } + + if ($inner_context->vars_in_scope[$var_id]->hasMixed()) { + $inner_context->vars_in_scope[$var_id]->parent_nodes + += $loop_scope->loop_parent_context->vars_in_scope[$var_id]->parent_nodes; + + $loop_scope->loop_parent_context->vars_in_scope[$var_id] = + $inner_context->vars_in_scope[$var_id]; + $loop_scope->loop_parent_context->removeVarFromConflictingClauses($var_id); + + continue; + } + + if ($inner_context->vars_in_scope[$var_id]->getId() !== $type->getId()) { + $loop_scope->loop_parent_context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $loop_scope->loop_parent_context->vars_in_scope[$var_id], + $inner_context->vars_in_scope[$var_id] + ); + + $loop_scope->loop_parent_context->removeVarFromConflictingClauses($var_id); + } else { + $loop_scope->loop_parent_context->vars_in_scope[$var_id]->parent_nodes = array_merge( + $loop_scope->loop_parent_context->vars_in_scope[$var_id]->parent_nodes, + $inner_context->vars_in_scope[$var_id]->parent_nodes + ); + } + } + } + + if ($pre_conditions && $pre_condition_clauses && !ScopeAnalyzer::doesEverBreak($stmts)) { + // if the loop contains an assertion and there are no break statements, we can negate that assertion + // and apply it to the current context + + try { + $negated_pre_condition_clauses = Algebra::negateFormula(array_merge(...$pre_condition_clauses)); + } catch (ComplicatedExpressionException $e) { + $negated_pre_condition_clauses = []; + } + + $negated_pre_condition_types = Algebra::getTruthsFromFormula($negated_pre_condition_clauses); + + if ($negated_pre_condition_types) { + $changed_var_ids = []; + + $vars_in_scope_reconciled = Reconciler::reconcileKeyedTypes( + $negated_pre_condition_types, + [], + $inner_context->vars_in_scope, + $changed_var_ids, + [], + $statements_analyzer, + [], + true, + new CodeLocation($statements_analyzer->getSource(), $pre_conditions[0]) + ); + + foreach ($changed_var_ids as $var_id => $_) { + if (isset($vars_in_scope_reconciled[$var_id]) + && isset($loop_scope->loop_parent_context->vars_in_scope[$var_id]) + ) { + $loop_scope->loop_parent_context->vars_in_scope[$var_id] = $vars_in_scope_reconciled[$var_id]; + } + + $loop_scope->loop_parent_context->removeVarFromConflictingClauses($var_id); + } + } + } + + $loop_scope->loop_context->referenced_var_ids = array_merge( + array_intersect_key( + $inner_context->referenced_var_ids, + $pre_outer_context->vars_in_scope + ), + $loop_scope->loop_context->referenced_var_ids + ); + + if ($always_enters_loop) { + foreach ($inner_context->vars_in_scope as $var_id => $type) { + // if there are break statements in the loop it's not certain + // that the loop has finished executing, so the assertions at the end + // the loop in the while conditional may not hold + if (in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true) + || in_array(ScopeAnalyzer::ACTION_CONTINUE, $loop_scope->final_actions, true) + ) { + if (isset($loop_scope->possibly_defined_loop_parent_vars[$var_id])) { + $loop_scope->loop_parent_context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $type, + $loop_scope->possibly_defined_loop_parent_vars[$var_id] + ); + } + } else { + $loop_scope->loop_parent_context->vars_in_scope[$var_id] = $type; + } + } + } + + if ($inner_do_context) { + $inner_context = $inner_do_context; + } + + return null; + } + + private static function updateLoopScopeContexts( + LoopScope $loop_scope, + Context $pre_outer_context + ): void { + $updated_loop_vars = []; + + if (!in_array(ScopeAnalyzer::ACTION_CONTINUE, $loop_scope->final_actions, true)) { + $loop_scope->loop_context->vars_in_scope = $pre_outer_context->vars_in_scope; + } else { + if ($loop_scope->redefined_loop_vars !== null) { + foreach ($loop_scope->redefined_loop_vars as $var => $type) { + $loop_scope->loop_context->vars_in_scope[$var] = $type; + $updated_loop_vars[$var] = true; + } + } + + if ($loop_scope->possibly_redefined_loop_vars) { + foreach ($loop_scope->possibly_redefined_loop_vars as $var => $type) { + if ($loop_scope->loop_context->hasVariable($var)) { + if (!isset($updated_loop_vars[$var])) { + $loop_scope->loop_context->vars_in_scope[$var] = Type::combineUnionTypes( + $loop_scope->loop_context->vars_in_scope[$var], + $type + ); + } else { + $loop_scope->loop_context->vars_in_scope[$var]->parent_nodes + += $type->parent_nodes; + } + } + } + } + } + + // merge vars possibly in scope at the end of each loop + $loop_scope->loop_context->vars_possibly_in_scope = array_merge( + $loop_scope->loop_context->vars_possibly_in_scope, + $loop_scope->vars_possibly_in_scope + ); + } + + /** + * @param list $pre_condition_clauses + * + * @return list + */ + private static function applyPreConditionToLoopContext( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $pre_condition, + array $pre_condition_clauses, + Context $loop_context, + Context $outer_context, + bool $is_do + ): array { + $pre_referenced_var_ids = $loop_context->referenced_var_ids; + $loop_context->referenced_var_ids = []; + + $was_inside_conditional = $loop_context->inside_conditional; + + $loop_context->inside_conditional = true; + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('RedundantCondition', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['RedundantCondition']); + } + if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['RedundantConditionGivenDocblockType']); + } + if (!in_array('TypeDoesNotContainType', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['TypeDoesNotContainType']); + } + + if (ExpressionAnalyzer::analyze($statements_analyzer, $pre_condition, $loop_context) === false) { + $loop_context->inside_conditional = $was_inside_conditional; + + return []; + } + + $loop_context->inside_conditional = $was_inside_conditional; + + $new_referenced_var_ids = $loop_context->referenced_var_ids; + $loop_context->referenced_var_ids = array_merge($pre_referenced_var_ids, $new_referenced_var_ids); + + $always_assigned_before_loop_body_vars = Context::getNewOrUpdatedVarIds($outer_context, $loop_context); + + $loop_context->clauses = Algebra::simplifyCNF( + array_merge($outer_context->clauses, $pre_condition_clauses) + ); + + $active_while_types = []; + + $reconcilable_while_types = Algebra::getTruthsFromFormula( + $loop_context->clauses, + spl_object_id($pre_condition), + $new_referenced_var_ids + ); + + $changed_var_ids = []; + + if ($reconcilable_while_types) { + $pre_condition_vars_in_scope_reconciled = Reconciler::reconcileKeyedTypes( + $reconcilable_while_types, + $active_while_types, + $loop_context->vars_in_scope, + $changed_var_ids, + $new_referenced_var_ids, + $statements_analyzer, + [], + true, + new CodeLocation($statements_analyzer->getSource(), $pre_condition) + ); + + $loop_context->vars_in_scope = $pre_condition_vars_in_scope_reconciled; + } + + if (!in_array('RedundantCondition', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['RedundantCondition']); + } + if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['RedundantConditionGivenDocblockType']); + } + if (!in_array('TypeDoesNotContainType', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['TypeDoesNotContainType']); + } + + if ($is_do) { + return []; + } + + foreach ($always_assigned_before_loop_body_vars as $var_id) { + $loop_context->clauses = Context::filterClauses( + $var_id, + $loop_context->clauses, + null, + $statements_analyzer + ); + } + + return $always_assigned_before_loop_body_vars; + } + + /** + * @param array> $assignment_map + * + */ + private static function getAssignmentMapDepth(string $first_var_id, array $assignment_map): int + { + $max_depth = 0; + + $assignment_var_ids = $assignment_map[$first_var_id]; + unset($assignment_map[$first_var_id]); + + foreach ($assignment_var_ids as $assignment_var_id => $_) { + $depth = 1; + + if (isset($assignment_map[$assignment_var_id])) { + $depth = 1 + self::getAssignmentMapDepth($assignment_var_id, $assignment_map); + } + + if ($depth > $max_depth) { + $max_depth = $depth; + } + } + + return $max_depth; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php new file mode 100644 index 00000000..fd492eba --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php @@ -0,0 +1,234 @@ +getCodebase(); + + $was_inside_conditional = $context->inside_conditional; + + $context->inside_conditional = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->cond, $context) === false) { + $context->inside_conditional = $was_inside_conditional; + + return; + } + + $context->inside_conditional = $was_inside_conditional; + + $switch_var_id = ExpressionIdentifier::getArrayVarId( + $stmt->cond, + null, + $statements_analyzer + ); + + if (!$switch_var_id + && ($stmt->cond instanceof PhpParser\Node\Expr\FuncCall + || $stmt->cond instanceof PhpParser\Node\Expr\MethodCall + || $stmt->cond instanceof PhpParser\Node\Expr\StaticCall + ) + ) { + $switch_var_id = '$__tmp_switch__' . (int) $stmt->cond->getAttribute('startFilePos'); + + $condition_type = $statements_analyzer->node_data->getType($stmt->cond) ?? Type::getMixed(); + + $context->vars_in_scope[$switch_var_id] = $condition_type; + } + + $original_context = clone $context; + + // the last statement always breaks, by default + $last_case_exit_type = 'break'; + + $case_exit_types = new SplFixedArray(count($stmt->cases)); + + $has_default = false; + + $case_action_map = []; + + $config = Config::getInstance(); + + // create a map of case statement -> ultimate exit type + for ($i = count($stmt->cases) - 1; $i >= 0; --$i) { + $case = $stmt->cases[$i]; + + $case_actions = $case_action_map[$i] = ScopeAnalyzer::getControlActions( + $case->stmts, + $statements_analyzer->node_data, + $config->exit_functions, + ['switch'] + ); + + if (!in_array(ScopeAnalyzer::ACTION_NONE, $case_actions, true)) { + if ($case_actions === [ScopeAnalyzer::ACTION_END]) { + $last_case_exit_type = 'return_throw'; + } elseif ($case_actions === [ScopeAnalyzer::ACTION_CONTINUE]) { + $last_case_exit_type = 'continue'; + } elseif (in_array(ScopeAnalyzer::ACTION_LEAVE_SWITCH, $case_actions, true)) { + $last_case_exit_type = 'break'; + } + } elseif (count($case_actions) !== 1) { + $last_case_exit_type = 'hybrid'; + } + + $case_exit_types[$i] = $last_case_exit_type; + } + + $switch_scope = new SwitchScope(); + + $was_caching_assertions = $statements_analyzer->node_data->cache_assertions; + + $statements_analyzer->node_data->cache_assertions = false; + + $all_options_returned = true; + + for ($i = 0, $l = count($stmt->cases); $i < $l; $i++) { + $case = $stmt->cases[$i]; + + /** @var string */ + $case_exit_type = $case_exit_types[$i]; + if ($case_exit_type !== 'return_throw') { + $all_options_returned = false; + } + + $case_actions = $case_action_map[$i]; + + if (!$case->cond) { + $has_default = true; + } + + if (SwitchCaseAnalyzer::analyze( + $statements_analyzer, + $codebase, + $stmt, + $switch_var_id, + $case, + $context, + $original_context, + $case_exit_type, + $case_actions, + $i === $l - 1, + $switch_scope + ) === false + ) { + return; + } + } + + $all_options_matched = $has_default; + + if (!$has_default && $switch_scope->negated_clauses && $switch_var_id) { + $entry_clauses = Algebra::simplifyCNF( + array_merge( + $original_context->clauses, + $switch_scope->negated_clauses + ) + ); + + $reconcilable_if_types = Algebra::getTruthsFromFormula($entry_clauses); + + // if the if has an || in the conditional, we cannot easily reason about it + if ($reconcilable_if_types && isset($reconcilable_if_types[$switch_var_id])) { + $changed_var_ids = []; + + $case_vars_in_scope_reconciled = + Reconciler::reconcileKeyedTypes( + $reconcilable_if_types, + [], + $original_context->vars_in_scope, + $changed_var_ids, + [], + $statements_analyzer, + [], + $original_context->inside_loop + ); + + if (isset($case_vars_in_scope_reconciled[$switch_var_id]) + && $case_vars_in_scope_reconciled[$switch_var_id]->isEmpty() + ) { + $all_options_matched = true; + } + } + } + + if ($was_caching_assertions) { + $statements_analyzer->node_data->cache_assertions = true; + } + + // only update vars if there is a default or all possible cases accounted for + // if the default has a throw/return/continue, that should be handled above + if ($all_options_matched) { + if ($switch_scope->new_vars_in_scope) { + $context->vars_in_scope = array_merge($context->vars_in_scope, $switch_scope->new_vars_in_scope); + } + + if ($switch_scope->redefined_vars) { + $context->vars_in_scope = array_merge($context->vars_in_scope, $switch_scope->redefined_vars); + } + + if ($switch_scope->possibly_redefined_vars) { + foreach ($switch_scope->possibly_redefined_vars as $var_id => $type) { + if (!isset($switch_scope->redefined_vars[$var_id]) + && !isset($switch_scope->new_vars_in_scope[$var_id]) + && isset($context->vars_in_scope[$var_id]) + ) { + $context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $type, + $context->vars_in_scope[$var_id] + ); + } + } + } + + $stmt->setAttribute('allMatched', true); + } elseif ($switch_scope->possibly_redefined_vars) { + foreach ($switch_scope->possibly_redefined_vars as $var_id => $type) { + if (isset($context->vars_in_scope[$var_id])) { + $context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $type, + $context->vars_in_scope[$var_id] + ); + } + } + } + + if ($switch_scope->new_assigned_var_ids) { + $context->assigned_var_ids += $switch_scope->new_assigned_var_ids; + } + + $context->vars_possibly_in_scope = array_merge( + $context->vars_possibly_in_scope, + $switch_scope->new_vars_possibly_in_scope + ); + + //a switch can't return in all options without a default + $context->has_returned = $all_options_returned && $has_default; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php new file mode 100644 index 00000000..d8802a1c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php @@ -0,0 +1,769 @@ +alter_code) { + $case_context->branch_point = $case_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); + } + + $case_context->parent_context = $context; + $case_scope = $case_context->case_scope = new CaseScope($case_context); + + $case_equality_expr = null; + + $old_node_data = $statements_analyzer->node_data; + + $fake_switch_condition = false; + + if ($switch_var_id && strpos($switch_var_id, '$__tmp_switch__') === 0) { + $switch_condition = new VirtualVariable( + substr($switch_var_id, 1), + $stmt->cond->getAttributes() + ); + + $fake_switch_condition = true; + } else { + $switch_condition = $stmt->cond; + } + + if ($case->cond) { + $was_inside_conditional = $case_context->inside_conditional; + $case_context->inside_conditional = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $case->cond, $case_context) === false) { + unset($case_scope->parent_context); + unset($case_context->case_scope); + unset($case_context->parent_context); + + return false; + } + + $case_context->inside_conditional = $was_inside_conditional; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $traverser = new PhpParser\NodeTraverser; + $traverser->addVisitor( + new ConditionCloningVisitor( + $statements_analyzer->node_data + ) + ); + + /** @var PhpParser\Node\Expr */ + $switch_condition = $traverser->traverse([$switch_condition])[0]; + + if ($fake_switch_condition) { + $statements_analyzer->node_data->setType( + $switch_condition, + $case_context->vars_in_scope[$switch_var_id] ?? Type::getMixed() + ); + } + + if ($switch_condition instanceof PhpParser\Node\Expr\Variable + && is_string($switch_condition->name) + && isset($context->vars_in_scope['$' . $switch_condition->name]) + ) { + $switch_var_type = $context->vars_in_scope['$' . $switch_condition->name]; + + $type_statements = []; + + foreach ($switch_var_type->getAtomicTypes() as $type) { + if ($type instanceof TDependentGetClass) { + $type_statements[] = new VirtualFuncCall( + new VirtualName(['get_class']), + [ + new VirtualArg( + new VirtualVariable( + substr($type->typeof, 1), + $stmt->cond->getAttributes() + ), + false, + false, + $stmt->cond->getAttributes() + ), + ], + $stmt->cond->getAttributes() + ); + } elseif ($type instanceof TDependentGetType) { + $type_statements[] = new VirtualFuncCall( + new VirtualName(['gettype']), + [ + new VirtualArg( + new VirtualVariable( + substr($type->typeof, 1), + $stmt->cond->getAttributes() + ), + false, + false, + $stmt->cond->getAttributes() + ), + ], + $stmt->cond->getAttributes() + ); + } elseif ($type instanceof TDependentGetDebugType) { + $type_statements[] = new VirtualFuncCall( + new VirtualName(['get_debug_type']), + [ + new VirtualArg( + new VirtualVariable( + substr($type->typeof, 1), + $stmt->cond->getAttributes() + ), + false, + false, + $stmt->cond->getAttributes() + ), + ], + $stmt->cond->getAttributes() + ); + } else { + $type_statements = null; + break; + } + } + + if ($type_statements && count($type_statements) === 1) { + $switch_condition = $type_statements[0]; + + if ($fake_switch_condition) { + $statements_analyzer->node_data->setType( + $switch_condition, + $case_context->vars_in_scope[$switch_var_id] ?? Type::getMixed() + ); + } + } + } + + if ($switch_condition instanceof PhpParser\Node\Expr\ConstFetch + && $switch_condition->name->parts === ['true'] + ) { + $case_equality_expr = $case->cond; + } elseif (($switch_condition_type = $statements_analyzer->node_data->getType($switch_condition)) + && ($case_cond_type = $statements_analyzer->node_data->getType($case->cond)) + && (($switch_condition_type->isString() && $case_cond_type->isString()) + || ($switch_condition_type->isInt() && $case_cond_type->isInt()) + || ($switch_condition_type->isFloat() && $case_cond_type->isFloat()) + ) + ) { + $case_equality_expr = new VirtualIdentical( + $switch_condition, + $case->cond, + $case->cond->getAttributes() + ); + } else { + $case_equality_expr = new VirtualEqual( + $switch_condition, + $case->cond, + $case->cond->getAttributes() + ); + } + } + + $continue_case_equality_expr = false; + + if ($case->stmts) { + $case_stmts = array_merge($switch_scope->leftover_statements, $case->stmts); + } else { + $continue_case_equality_expr = count($switch_scope->leftover_statements) === 1; + $case_stmts = $switch_scope->leftover_statements; + } + + if (!$has_leaving_statements && !$is_last) { + if (!$case_equality_expr) { + $case_equality_expr = new VirtualFuncCall( + new VirtualFullyQualified(['rand']), + [ + new VirtualArg(new VirtualLNumber(0)), + new VirtualArg(new VirtualLNumber(1)), + ], + $case->getAttributes() + ); + } + + $switch_scope->leftover_case_equality_expr = $switch_scope->leftover_case_equality_expr + ? new VirtualBooleanOr( + $switch_scope->leftover_case_equality_expr, + $case_equality_expr, + $case->cond ? $case->cond->getAttributes() : $case->getAttributes() + ) + : $case_equality_expr; + + if ($continue_case_equality_expr + && $switch_scope->leftover_statements[0] instanceof PhpParser\Node\Stmt\If_ + ) { + $case_if_stmt = $switch_scope->leftover_statements[0]; + $case_if_stmt->cond = $switch_scope->leftover_case_equality_expr; + } else { + $case_if_stmt = new VirtualIf( + $switch_scope->leftover_case_equality_expr, + ['stmts' => $case_stmts], + $case->getAttributes() + ); + + $switch_scope->leftover_statements = [$case_if_stmt]; + } + + unset($case_scope->parent_context); + unset($case_context->case_scope); + unset($case_context->parent_context); + + $statements_analyzer->node_data = $old_node_data; + + return null; + } + + if ($switch_scope->leftover_case_equality_expr) { + $case_or_default_equality_expr = $case_equality_expr; + + if (!$case_or_default_equality_expr) { + $case_or_default_equality_expr = new VirtualFuncCall( + new VirtualFullyQualified(['rand']), + [ + new VirtualArg(new VirtualLNumber(0)), + new VirtualArg(new VirtualLNumber(1)), + ], + $case->getAttributes() + ); + } + + $case_equality_expr = new VirtualBooleanOr( + $switch_scope->leftover_case_equality_expr, + $case_or_default_equality_expr, + $case_or_default_equality_expr->getAttributes() + ); + } + + if ($case_equality_expr + && $switch_condition instanceof PhpParser\Node\Expr\Variable + && is_string($switch_condition->name) + && isset($context->vars_in_scope['$' . $switch_condition->name]) + ) { + $new_case_equality_expr = self::simplifyCaseEqualityExpression( + $case_equality_expr, + $switch_condition + ); + + if ($new_case_equality_expr) { + $was_inside_conditional = $case_context->inside_conditional; + + $case_context->inside_conditional = true; + + ExpressionAnalyzer::analyze( + $statements_analyzer, + $new_case_equality_expr->getArgs()[1]->value, + $case_context + ); + + $case_context->inside_conditional = $was_inside_conditional; + + $case_equality_expr = $new_case_equality_expr; + } + } + + $case_context->break_types[] = 'switch'; + + $switch_scope->leftover_statements = []; + $switch_scope->leftover_case_equality_expr = null; + + $case_clauses = []; + + if ($case_equality_expr) { + $case_equality_expr_id = spl_object_id($case_equality_expr); + $case_clauses = FormulaGenerator::getFormula( + $case_equality_expr_id, + $case_equality_expr_id, + $case_equality_expr, + $context->self, + $statements_analyzer, + $codebase, + false, + false + ); + } + + if ($switch_scope->negated_clauses && count($switch_scope->negated_clauses) < 50) { + $entry_clauses = Algebra::simplifyCNF( + array_merge( + $original_context->clauses, + $switch_scope->negated_clauses + ) + ); + } else { + $entry_clauses = $original_context->clauses; + } + + if ($case_clauses && $case->cond) { + // this will see whether any of the clauses in set A conflict with the clauses in set B + AlgebraAnalyzer::checkForParadox( + $entry_clauses, + $case_clauses, + $statements_analyzer, + $case->cond, + [] + ); + + if (count($entry_clauses) + count($case_clauses) < 50) { + $case_context->clauses = Algebra::simplifyCNF(array_merge($entry_clauses, $case_clauses)); + } else { + $case_context->clauses = array_merge($entry_clauses, $case_clauses); + } + } else { + $case_context->clauses = $entry_clauses; + } + + $reconcilable_if_types = Algebra::getTruthsFromFormula($case_context->clauses); + + // if the if has an || in the conditional, we cannot easily reason about it + if ($reconcilable_if_types) { + $changed_var_ids = []; + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('RedundantCondition', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['RedundantCondition']); + } + + if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['RedundantConditionGivenDocblockType']); + } + + $case_vars_in_scope_reconciled = + Reconciler::reconcileKeyedTypes( + $reconcilable_if_types, + [], + $case_context->vars_in_scope, + $changed_var_ids, + $case->cond && $switch_var_id ? [$switch_var_id => true] : [], + $statements_analyzer, + [], + $case_context->inside_loop, + new CodeLocation( + $statements_analyzer->getSource(), + $case->cond ?? $case, + $context->include_location + ) + ); + + if (!in_array('RedundantCondition', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['RedundantCondition']); + } + + if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['RedundantConditionGivenDocblockType']); + } + + $case_context->vars_in_scope = $case_vars_in_scope_reconciled; + foreach ($reconcilable_if_types as $var_id => $_) { + $case_context->vars_possibly_in_scope[$var_id] = true; + } + + if ($changed_var_ids) { + $case_context->clauses = Context::removeReconciledClauses($case_context->clauses, $changed_var_ids)[0]; + } + } + + if ($case_clauses && $case_equality_expr) { + try { + $negated_case_clauses = Algebra::negateFormula($case_clauses); + } catch (ComplicatedExpressionException $e) { + $case_equality_expr_id = spl_object_id($case_equality_expr); + + try { + $negated_case_clauses = FormulaGenerator::getFormula( + $case_equality_expr_id, + $case_equality_expr_id, + new VirtualBooleanNot($case_equality_expr), + $context->self, + $statements_analyzer, + $codebase, + false, + false + ); + } catch (ComplicatedExpressionException $e) { + $negated_case_clauses = []; + } + } + + $switch_scope->negated_clauses = array_merge( + $switch_scope->negated_clauses, + $negated_case_clauses + ); + } + + $pre_possibly_assigned_var_ids = $case_context->possibly_assigned_var_ids; + $case_context->possibly_assigned_var_ids = []; + + $pre_assigned_var_ids = $case_context->assigned_var_ids; + $case_context->assigned_var_ids = []; + + $statements_analyzer->analyze($case_stmts, $case_context); + + $traverser = new PhpParser\NodeTraverser; + $traverser->addVisitor( + new TypeMappingVisitor( + $statements_analyzer->node_data, + $old_node_data + ) + ); + + $traverser->traverse([$case]); + + $statements_analyzer->node_data = $old_node_data; + + /** @var array */ + $new_case_assigned_var_ids = $case_context->assigned_var_ids; + $case_context->assigned_var_ids = $pre_assigned_var_ids + $new_case_assigned_var_ids; + + /** @var array */ + $new_case_possibly_assigned_var_ids = $case_context->possibly_assigned_var_ids; + $case_context->possibly_assigned_var_ids = + $pre_possibly_assigned_var_ids + $new_case_possibly_assigned_var_ids; + + $context->referenced_var_ids = array_merge( + $context->referenced_var_ids, + $case_context->referenced_var_ids + ); + + if ($case_exit_type !== 'return_throw') { + if (self::handleNonReturningCase( + $statements_analyzer, + $switch_var_id, + $case, + $context, + $case_context, + $original_context, + $case_exit_type, + $switch_scope + ) === false) { + unset($case_scope->parent_context); + unset($case_context->case_scope); + unset($case_context->parent_context); + + return false; + } + } + + // augment the information with data from break statements + if ($case_scope->break_vars !== null) { + if ($switch_scope->possibly_redefined_vars === null) { + $switch_scope->possibly_redefined_vars = array_intersect_key( + $case_scope->break_vars, + $context->vars_in_scope + ); + } else { + foreach ($case_scope->break_vars as $var_id => $type) { + if (isset($context->vars_in_scope[$var_id])) { + $switch_scope->possibly_redefined_vars[$var_id] = Type::combineUnionTypes( + clone $type, + $switch_scope->possibly_redefined_vars[$var_id] ?? null + ); + } + } + } + + if ($switch_scope->new_vars_in_scope !== null) { + foreach ($switch_scope->new_vars_in_scope as $var_id => $type) { + if (isset($case_scope->break_vars[$var_id])) { + if (!isset($case_context->vars_in_scope[$var_id])) { + unset($switch_scope->new_vars_in_scope[$var_id]); + } else { + $switch_scope->new_vars_in_scope[$var_id] = Type::combineUnionTypes( + clone $case_scope->break_vars[$var_id], + $type + ); + } + } else { + unset($switch_scope->new_vars_in_scope[$var_id]); + } + } + } + + if ($switch_scope->redefined_vars !== null) { + foreach ($switch_scope->redefined_vars as $var_id => $type) { + if (isset($case_scope->break_vars[$var_id])) { + $switch_scope->redefined_vars[$var_id] = Type::combineUnionTypes( + clone $case_scope->break_vars[$var_id], + $type + ); + } else { + unset($switch_scope->redefined_vars[$var_id]); + } + } + } + } + + unset($case_scope->parent_context); + unset($case_context->case_scope); + unset($case_context->parent_context); + + return null; + } + + /** + * @return null|false + */ + private static function handleNonReturningCase( + StatementsAnalyzer $statements_analyzer, + ?string $switch_var_id, + PhpParser\Node\Stmt\Case_ $case, + Context $context, + Context $case_context, + Context $original_context, + string $case_exit_type, + SwitchScope $switch_scope + ): ?bool { + if (!$case->cond + && $switch_var_id + && isset($case_context->vars_in_scope[$switch_var_id]) + && $case_context->vars_in_scope[$switch_var_id]->isEmpty() + ) { + if (IssueBuffer::accepts( + new ParadoxicalCondition( + 'All possible case statements have been met, default is impossible here', + new CodeLocation($statements_analyzer->getSource(), $case) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } + + // if we're leaving this block, add vars to outer for loop scope + if ($case_exit_type === 'continue') { + if (!$context->loop_scope) { + if (IssueBuffer::accepts( + new ContinueOutsideLoop( + 'Continue called when not in loop', + new CodeLocation($statements_analyzer->getSource(), $case) + ) + )) { + return false; + } + } + } else { + $case_redefined_vars = $case_context->getRedefinedVars($original_context->vars_in_scope); + + if ($switch_scope->possibly_redefined_vars === null) { + $switch_scope->possibly_redefined_vars = $case_redefined_vars; + } else { + foreach ($case_redefined_vars as $var_id => $type) { + $switch_scope->possibly_redefined_vars[$var_id] = Type::combineUnionTypes( + clone $type, + $switch_scope->possibly_redefined_vars[$var_id] ?? null + ); + } + } + + if ($switch_scope->redefined_vars === null) { + $switch_scope->redefined_vars = $case_redefined_vars; + } else { + foreach ($switch_scope->redefined_vars as $var_id => $type) { + if (!isset($case_redefined_vars[$var_id])) { + unset($switch_scope->redefined_vars[$var_id]); + } else { + $switch_scope->redefined_vars[$var_id] = Type::combineUnionTypes( + $type, + clone $case_redefined_vars[$var_id] + ); + } + } + } + + $context_new_vars = array_diff_key($case_context->vars_in_scope, $context->vars_in_scope); + + if ($switch_scope->new_vars_in_scope === null) { + $switch_scope->new_vars_in_scope = $context_new_vars; + $switch_scope->new_vars_possibly_in_scope = array_diff_key( + $case_context->vars_possibly_in_scope, + $context->vars_possibly_in_scope + ); + } else { + foreach ($switch_scope->new_vars_in_scope as $new_var => $type) { + if (!$case_context->hasVariable($new_var)) { + unset($switch_scope->new_vars_in_scope[$new_var]); + } else { + $switch_scope->new_vars_in_scope[$new_var] = + Type::combineUnionTypes(clone $case_context->vars_in_scope[$new_var], $type); + } + } + + $switch_scope->new_vars_possibly_in_scope = array_merge( + array_diff_key( + $case_context->vars_possibly_in_scope, + $context->vars_possibly_in_scope + ), + $switch_scope->new_vars_possibly_in_scope + ); + } + } + + if ($context->collect_exceptions) { + $context->mergeExceptions($case_context); + } + + return null; + } + + private static function simplifyCaseEqualityExpression( + PhpParser\Node\Expr $case_equality_expr, + PhpParser\Node\Expr\Variable $var + ): ?PhpParser\Node\Expr\FuncCall { + if ($case_equality_expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr) { + $nested_or_options = self::getOptionsFromNestedOr($case_equality_expr, $var); + + if ($nested_or_options) { + return new VirtualFuncCall( + new VirtualFullyQualified(['in_array']), + [ + new VirtualArg( + $var, + false, + false, + $var->getAttributes() + ), + new VirtualArg( + new VirtualArray( + $nested_or_options, + $case_equality_expr->getAttributes() + ), + false, + false, + $case_equality_expr->getAttributes() + ), + new VirtualArg( + new VirtualConstFetch( + new VirtualFullyQualified(['true']) + ) + ), + ] + ); + } + } + + return null; + } + + /** + * @param array $in_array_values + * @return ?array + */ + private static function getOptionsFromNestedOr( + PhpParser\Node\Expr $case_equality_expr, + PhpParser\Node\Expr\Variable $var, + array $in_array_values = [] + ): ?array { + if ($case_equality_expr instanceof PhpParser\Node\Expr\BinaryOp\Identical + && $case_equality_expr->left instanceof PhpParser\Node\Expr\Variable + && $case_equality_expr->left->name === $var->name + ) { + $in_array_values[] = new VirtualArrayItem( + $case_equality_expr->right, + null, + false, + $case_equality_expr->right->getAttributes() + ); + + return $in_array_values; + } + + if (!$case_equality_expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr) { + return null; + } + + if (!$case_equality_expr->right instanceof PhpParser\Node\Expr\BinaryOp\Identical + || !$case_equality_expr->right->left instanceof PhpParser\Node\Expr\Variable + || $case_equality_expr->right->left->name !== $var->name + ) { + return null; + } + + $in_array_values[] = new VirtualArrayItem( + $case_equality_expr->right->right, + null, + false, + $case_equality_expr->right->right->getAttributes() + ); + + return self::getOptionsFromNestedOr( + $case_equality_expr->left, + $var, + $in_array_values + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php new file mode 100644 index 00000000..5074bd68 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php @@ -0,0 +1,516 @@ +getCodebase(); + + /** @var int $i */ + foreach ($stmt->catches as $i => $catch) { + $catch_actions[$i] = ScopeAnalyzer::getControlActions( + $catch->stmts, + $statements_analyzer->node_data, + $codebase->config->exit_functions, + [] + ); + $all_catches_leave = $all_catches_leave && !in_array(ScopeAnalyzer::ACTION_NONE, $catch_actions[$i], true); + } + + $existing_thrown_exceptions = $context->possibly_thrown_exceptions; + + /** + * @var array> $context->possibly_thrown_exceptions + */ + $context->possibly_thrown_exceptions = []; + + $old_context = clone $context; + + if ($all_catches_leave && !$stmt->finally) { + $try_context = $context; + } else { + $try_context = clone $context; + + if ($codebase->alter_code) { + $try_context->branch_point = $try_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); + } + + if ($stmt->finally) { + $try_context->finally_scope = new FinallyScope($try_context->vars_in_scope); + } + } + + $assigned_var_ids = $try_context->assigned_var_ids; + $context->assigned_var_ids = []; + + $old_referenced_var_ids = $try_context->referenced_var_ids; + + $was_inside_try = $context->inside_try; + $context->inside_try = true; + if ($statements_analyzer->analyze($stmt->stmts, $context) === false) { + return false; + } + $context->inside_try = $was_inside_try; + + if ($try_context->finally_scope) { + foreach ($context->vars_in_scope as $var_id => $type) { + $try_context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( + $try_context->finally_scope->vars_in_scope[$var_id] ?? null, + $type, + $statements_analyzer->getCodebase() + ); + } + } + + $context->has_returned = false; + + $try_block_control_actions = ScopeAnalyzer::getControlActions( + $stmt->stmts, + $statements_analyzer->node_data, + $codebase->config->exit_functions, + [] + ); + + /** @var array */ + $newly_assigned_var_ids = $context->assigned_var_ids; + + $context->assigned_var_ids = array_merge( + $assigned_var_ids, + $newly_assigned_var_ids + ); + + $possibly_referenced_var_ids = array_merge( + $context->referenced_var_ids, + $old_referenced_var_ids + ); + + if ($try_context !== $context) { + foreach ($context->vars_in_scope as $var_id => $type) { + if (!isset($try_context->vars_in_scope[$var_id])) { + $try_context->vars_in_scope[$var_id] = clone $type; + + $context->vars_in_scope[$var_id]->possibly_undefined = true; + $context->vars_in_scope[$var_id]->possibly_undefined_from_try = true; + } else { + $try_context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $try_context->vars_in_scope[$var_id], + $type + ); + } + } + + $try_context->vars_possibly_in_scope = $context->vars_possibly_in_scope; + $try_context->possibly_thrown_exceptions = $context->possibly_thrown_exceptions; + + $context->referenced_var_ids = array_intersect_key( + $try_context->referenced_var_ids, + $context->referenced_var_ids + ); + } + + $try_leaves_loop = $context->loop_scope + && $context->loop_scope->final_actions + && !in_array(ScopeAnalyzer::ACTION_NONE, $context->loop_scope->final_actions, true); + + if (!$all_catches_leave) { + foreach ($newly_assigned_var_ids as $assigned_var_id => $_) { + $context->removeVarFromConflictingClauses($assigned_var_id); + } + } else { + foreach ($newly_assigned_var_ids as $assigned_var_id => $_) { + $try_context->removeVarFromConflictingClauses($assigned_var_id); + } + } + + // at this point we have two contexts – $context, in which it is assumed that everything was fine, + // and $try_context - which allows all variables to have the union of the values before and after + // the try was applied + $original_context = clone $try_context; + + $issues_to_suppress = [ + 'RedundantCondition', + 'RedundantConditionGivenDocblockType', + 'TypeDoesNotContainNull', + 'TypeDoesNotContainType', + ]; + + $definitely_newly_assigned_var_ids = $newly_assigned_var_ids; + + /** @var int $i */ + foreach ($stmt->catches as $i => $catch) { + $catch_context = clone $original_context; + $catch_context->has_returned = false; + + foreach ($catch_context->vars_in_scope as $var_id => $type) { + if (!isset($old_context->vars_in_scope[$var_id])) { + $type = clone $type; + $type->possibly_undefined_from_try = true; + $catch_context->vars_in_scope[$var_id] = $type; + } else { + $catch_context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $type, + $old_context->vars_in_scope[$var_id] + ); + } + } + + $fq_catch_classes = []; + + if (!$catch->types) { + throw new UnexpectedValueException('Very bad'); + } + + foreach ($catch->types as $catch_type) { + $fq_catch_class = ClassLikeAnalyzer::getFQCLNFromNameObject( + $catch_type, + $statements_analyzer->getAliases() + ); + + $fq_catch_class = $codebase->classlikes->getUnAliasedName($fq_catch_class); + + if ($codebase->alter_code && $fq_catch_class) { + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $catch_type, + $fq_catch_class, + $context->calling_method_id + ); + } + + if ($original_context->check_classes) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $fq_catch_class, + new CodeLocation($statements_analyzer->getSource(), $catch_type, $context->include_location), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions(true) + ) === false) { + // fall through + } + } + + if (($codebase->classExists($fq_catch_class) + && strtolower($fq_catch_class) !== 'exception' + && !($codebase->classExtends($fq_catch_class, 'Exception') + || $codebase->classImplements($fq_catch_class, 'Throwable'))) + || ($codebase->interfaceExists($fq_catch_class) + && strtolower($fq_catch_class) !== 'throwable' + && !$codebase->interfaceExtends($fq_catch_class, 'Throwable')) + ) { + IssueBuffer::maybeAdd( + new InvalidCatch( + 'Class/interface ' . $fq_catch_class . ' cannot be caught', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_catch_class + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $fq_catch_classes[] = $fq_catch_class; + } + + if ($catch_context->collect_exceptions) { + foreach ($fq_catch_classes as $fq_catch_class) { + $fq_catch_class_lower = strtolower($fq_catch_class); + + foreach ($catch_context->possibly_thrown_exceptions as $exception_fqcln => $_) { + $exception_fqcln_lower = strtolower($exception_fqcln); + + if ($exception_fqcln_lower === $fq_catch_class_lower + || ($codebase->classExists($exception_fqcln) + && $codebase->classExtendsOrImplements($exception_fqcln, $fq_catch_class)) + || ($codebase->interfaceExists($exception_fqcln) + && $codebase->interfaceExtends($exception_fqcln, $fq_catch_class)) + ) { + unset($original_context->possibly_thrown_exceptions[$exception_fqcln]); + unset($context->possibly_thrown_exceptions[$exception_fqcln]); + unset($catch_context->possibly_thrown_exceptions[$exception_fqcln]); + } + } + } + + $catch_context->possibly_thrown_exceptions = []; + } + + // discard all clauses because crazy stuff may have happened in try block + $catch_context->clauses = []; + + if ($catch->var && is_string($catch->var->name)) { + $catch_var_id = '$' . $catch->var->name; + + $catch_context->vars_in_scope[$catch_var_id] = new Union( + array_map( + function (string $fq_catch_class) use ($codebase): TNamedObject { + $catch_class_type = new TNamedObject($fq_catch_class); + + if (version_compare(PHP_VERSION, '7.0.0dev', '>=') + && strtolower($fq_catch_class) !== 'throwable' + && $codebase->interfaceExists($fq_catch_class) + && !$codebase->interfaceExtends($fq_catch_class, 'Throwable') + ) { + $catch_class_type->addIntersectionType(new TNamedObject('Throwable')); + } + + return $catch_class_type; + }, + $fq_catch_classes + ) + ); + + // removes dependent vars from $context + $catch_context->removeDescendents( + $catch_var_id, + null, + $catch_context->vars_in_scope[$catch_var_id], + $statements_analyzer + ); + + $catch_context->vars_possibly_in_scope[$catch_var_id] = true; + + $location = new CodeLocation($statements_analyzer->getSource(), $catch->var); + + if (!$statements_analyzer->hasVariable($catch_var_id)) { + $statements_analyzer->registerVariable( + $catch_var_id, + $location, + $catch_context->branch_point + ); + } else { + $statements_analyzer->registerVariableAssignment( + $catch_var_id, + $location + ); + } + + if ($statements_analyzer->data_flow_graph) { + $catch_var_node = DataFlowNode::getForAssignment($catch_var_id, $location); + + $catch_context->vars_in_scope[$catch_var_id]->parent_nodes = [ + $catch_var_node->id => $catch_var_node + ]; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + $statements_analyzer->data_flow_graph->addPath( + $catch_var_node, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use' + ); + } + } + } + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + foreach ($issues_to_suppress as $issue_to_suppress) { + if (!in_array($issue_to_suppress, $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues([$issue_to_suppress]); + } + } + + $old_catch_assigned_var_ids = $catch_context->referenced_var_ids; + + $catch_context->assigned_var_ids = []; + + $statements_analyzer->analyze($catch->stmts, $catch_context); + + // recalculate in case there's a no-return clause + $catch_actions[$i] = ScopeAnalyzer::getControlActions( + $catch->stmts, + $statements_analyzer->node_data, + $codebase->config->exit_functions, + [] + ); + + foreach ($issues_to_suppress as $issue_to_suppress) { + if (!in_array($issue_to_suppress, $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues([$issue_to_suppress]); + } + } + + /** @var array */ + $new_catch_assigned_var_ids = $catch_context->assigned_var_ids; + + $catch_context->assigned_var_ids += $old_catch_assigned_var_ids; + + $context->referenced_var_ids = array_intersect_key( + $catch_context->referenced_var_ids, + $context->referenced_var_ids + ); + + $possibly_referenced_var_ids = array_merge( + $catch_context->referenced_var_ids, + $possibly_referenced_var_ids + ); + + if ($catch_context->collect_exceptions) { + $context->mergeExceptions($catch_context); + } + + $catch_doesnt_leave_parent_scope = $catch_actions[$i] !== [ScopeAnalyzer::ACTION_END] + && $catch_actions[$i] !== [ScopeAnalyzer::ACTION_CONTINUE] + && $catch_actions[$i] !== [ScopeAnalyzer::ACTION_BREAK]; + + if ($catch_doesnt_leave_parent_scope) { + $definitely_newly_assigned_var_ids = array_intersect_key( + $new_catch_assigned_var_ids, + $definitely_newly_assigned_var_ids + ); + + foreach ($catch_context->vars_in_scope as $var_id => $type) { + if ($try_block_control_actions === [ScopeAnalyzer::ACTION_END]) { + $context->vars_in_scope[$var_id] = $type; + } elseif (isset($context->vars_in_scope[$var_id])) { + $context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $context->vars_in_scope[$var_id], + $type + ); + } + } + + $context->vars_possibly_in_scope = array_merge( + $catch_context->vars_possibly_in_scope, + $context->vars_possibly_in_scope + ); + } else { + if ($stmt->finally) { + $context->vars_possibly_in_scope = array_merge( + $catch_context->vars_possibly_in_scope, + $context->vars_possibly_in_scope + ); + } + } + + if ($try_context->finally_scope) { + foreach ($catch_context->vars_in_scope as $var_id => $type) { + if (isset($try_context->finally_scope->vars_in_scope[$var_id])) { + if ($try_context->finally_scope->vars_in_scope[$var_id] !== $type) { + $try_context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( + $try_context->finally_scope->vars_in_scope[$var_id], + $type, + $statements_analyzer->getCodebase() + ); + } + } else { + $try_context->finally_scope->vars_in_scope[$var_id] = $type; + $type->possibly_undefined = true; + $type->possibly_undefined_from_try = true; + } + } + } + } + + if ($context->loop_scope + && !$try_leaves_loop + && !in_array(ScopeAnalyzer::ACTION_NONE, $context->loop_scope->final_actions, true) + ) { + $context->loop_scope->final_actions[] = ScopeAnalyzer::ACTION_NONE; + } + + $finally_has_returned = false; + if ($stmt->finally) { + if ($try_context->finally_scope) { + $finally_context = clone $context; + + $finally_context->assigned_var_ids = []; + $finally_context->possibly_assigned_var_ids = []; + + $finally_context->vars_in_scope = $try_context->finally_scope->vars_in_scope; + + $statements_analyzer->analyze($stmt->finally->stmts, $finally_context); + + $finally_has_returned = $finally_context->has_returned; + + /** @var string $var_id */ + foreach ($finally_context->assigned_var_ids as $var_id => $_) { + if (isset($context->vars_in_scope[$var_id]) + && isset($finally_context->vars_in_scope[$var_id]) + ) { + if ($context->vars_in_scope[$var_id]->possibly_undefined + && $context->vars_in_scope[$var_id]->possibly_undefined_from_try + ) { + $context->vars_in_scope[$var_id]->possibly_undefined = false; + $context->vars_in_scope[$var_id]->possibly_undefined_from_try = false; + } + + $context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $context->vars_in_scope[$var_id], + $finally_context->vars_in_scope[$var_id], + $codebase + ); + } elseif (isset($finally_context->vars_in_scope[$var_id])) { + $context->vars_in_scope[$var_id] = clone $finally_context->vars_in_scope[$var_id]; + } + } + } + } + + foreach ($definitely_newly_assigned_var_ids as $var_id => $_) { + if (isset($context->vars_in_scope[$var_id])) { + $new_type = clone $context->vars_in_scope[$var_id]; + + if ($new_type->possibly_undefined_from_try) { + $new_type->possibly_undefined = false; + $new_type->possibly_undefined_from_try = false; + } + + $context->vars_in_scope[$var_id] = $new_type; + } + } + + foreach ($existing_thrown_exceptions as $possibly_thrown_exception => $codelocations) { + foreach ($codelocations as $hash => $codelocation) { + $context->possibly_thrown_exceptions[$possibly_thrown_exception][$hash] = $codelocation; + } + } + + $body_has_returned = !in_array(ScopeAnalyzer::ACTION_NONE, $try_block_control_actions, true); + $context->has_returned = ($body_has_returned && $all_catches_leave) || $finally_has_returned; + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php new file mode 100644 index 00000000..a6ef17df --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php @@ -0,0 +1,139 @@ +cond instanceof PhpParser\Node\Expr\ConstFetch && $stmt->cond->name->parts === ['true']) + || ($stmt->cond instanceof PhpParser\Node\Scalar\LNumber && $stmt->cond->value > 0); + + $pre_context = null; + + if ($while_true) { + $pre_context = clone $context; + } + + $while_context = clone $context; + + $while_context->inside_loop = true; + $while_context->break_types[] = 'loop'; + + $codebase = $statements_analyzer->getCodebase(); + + if ($codebase->alter_code) { + $while_context->branch_point = $while_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); + } + + $loop_scope = new LoopScope($while_context, $context); + $loop_scope->protected_var_ids = $context->protected_var_ids; + + if (LoopAnalyzer::analyze( + $statements_analyzer, + $stmt->stmts, + self::getAndExpressions($stmt->cond), + [], + $loop_scope, + $inner_loop_context + ) === false) { + return false; + } + + if (!$inner_loop_context) { + throw new UnexpectedValueException('There should be an inner loop context'); + } + + $always_enters_loop = false; + + if ($stmt_cond_type = $statements_analyzer->node_data->getType($stmt->cond)) { + $always_enters_loop = $stmt_cond_type->isAlwaysTruthy(); + } + + if ($while_true) { + $always_enters_loop = true; + } + + $can_leave_loop = !$while_true + || in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true); + + if ($always_enters_loop && $can_leave_loop) { + foreach ($inner_loop_context->vars_in_scope as $var_id => $type) { + // if there are break statements in the loop it's not certain + // that the loop has finished executing, so the assertions at the end + // the loop in the while conditional may not hold + if (in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true) + || in_array(ScopeAnalyzer::ACTION_CONTINUE, $loop_scope->final_actions, true) + ) { + if (isset($loop_scope->possibly_defined_loop_parent_vars[$var_id])) { + $context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $type, + $loop_scope->possibly_defined_loop_parent_vars[$var_id] + ); + } + } else { + $context->vars_in_scope[$var_id] = $type; + } + } + } + + $while_context->loop_scope = null; + + if ($can_leave_loop) { + $context->vars_possibly_in_scope = array_merge( + $context->vars_possibly_in_scope, + $while_context->vars_possibly_in_scope + ); + } elseif ($pre_context) { + $context->vars_possibly_in_scope = $pre_context->vars_possibly_in_scope; + } + + $context->referenced_var_ids = array_intersect_key( + $while_context->referenced_var_ids, + $context->referenced_var_ids + ); + + if ($context->collect_exceptions) { + $context->mergeExceptions($while_context); + } + + return null; + } + + /** + * @return list + */ + public static function getAndExpressions( + PhpParser\Node\Expr $expr + ): array { + if ($expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd) { + return array_merge( + self::getAndExpressions($expr->left), + self::getAndExpressions($expr->right) + ); + } + + return [$expr]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php new file mode 100644 index 00000000..2a988563 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php @@ -0,0 +1,95 @@ +loop_scope; + + $leaving_switch = true; + + if ($loop_scope) { + if ($context->break_types + && end($context->break_types) === 'switch' + && (!$stmt->num instanceof PhpParser\Node\Scalar\LNumber || $stmt->num->value < 2) + ) { + $loop_scope->final_actions[] = ScopeAnalyzer::ACTION_LEAVE_SWITCH; + } else { + $leaving_switch = false; + + $loop_scope->final_actions[] = ScopeAnalyzer::ACTION_BREAK; + } + + $redefined_vars = $context->getRedefinedVars($loop_scope->loop_parent_context->vars_in_scope); + + if ($loop_scope->possibly_redefined_loop_parent_vars === null) { + $loop_scope->possibly_redefined_loop_parent_vars = $redefined_vars; + } else { + foreach ($redefined_vars as $var => $type) { + $loop_scope->possibly_redefined_loop_parent_vars[$var] = Type::combineUnionTypes( + $type, + $loop_scope->possibly_redefined_loop_parent_vars[$var] ?? null + ); + } + } + + if ($loop_scope->iteration_count === 0) { + foreach ($context->vars_in_scope as $var_id => $type) { + if (!isset($loop_scope->loop_parent_context->vars_in_scope[$var_id])) { + $loop_scope->possibly_defined_loop_parent_vars[$var_id] = Type::combineUnionTypes( + $type, + $loop_scope->possibly_defined_loop_parent_vars[$var_id] ?? null + ); + } + } + } + + if ($context->finally_scope) { + foreach ($context->vars_in_scope as $var_id => $type) { + if (isset($context->finally_scope->vars_in_scope[$var_id])) { + $context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( + $context->finally_scope->vars_in_scope[$var_id], + $type, + $statements_analyzer->getCodebase() + ); + } else { + $context->finally_scope->vars_in_scope[$var_id] = $type; + $type->possibly_undefined = true; + $type->possibly_undefined_from_try = true; + } + } + } + } + + $case_scope = $context->case_scope; + if ($case_scope && $leaving_switch) { + foreach ($context->vars_in_scope as $var_id => $type) { + if ($case_scope->parent_context !== $context) { + if ($case_scope->break_vars === null) { + $case_scope->break_vars = []; + } + + $case_scope->break_vars[$var_id] = Type::combineUnionTypes( + $type, + $case_scope->break_vars[$var_id] ?? null + ); + } + } + } + + $context->has_returned = true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php new file mode 100644 index 00000000..17826f14 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php @@ -0,0 +1,100 @@ +num instanceof PhpParser\Node\Scalar\LNumber? $stmt->num->value : 1; + + $loop_scope = $context->loop_scope; + + if ($count === 2 && isset($loop_scope->loop_parent_context->loop_scope)) { + $loop_scope = $loop_scope->loop_parent_context->loop_scope; + } + + if ($count === 3 && isset($loop_scope->loop_parent_context->loop_scope)) { + $loop_scope = $loop_scope->loop_parent_context->loop_scope; + } + + if ($loop_scope === null) { + if (!$context->break_types) { + if (IssueBuffer::accepts( + new ContinueOutsideLoop( + 'Continue call outside loop context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSource()->getSuppressedIssues() + )) { + return; + } + } + } else { + if ($context->break_types + && end($context->break_types) === 'switch' + && $count < 2 + ) { + $loop_scope->final_actions[] = ScopeAnalyzer::ACTION_LEAVE_SWITCH; + } else { + $loop_scope->final_actions[] = ScopeAnalyzer::ACTION_CONTINUE; + } + + $redefined_vars = $context->getRedefinedVars($loop_scope->loop_parent_context->vars_in_scope); + + if ($loop_scope->redefined_loop_vars === null) { + $loop_scope->redefined_loop_vars = $redefined_vars; + } else { + foreach ($loop_scope->redefined_loop_vars as $redefined_var => $type) { + if (!isset($redefined_vars[$redefined_var])) { + unset($loop_scope->redefined_loop_vars[$redefined_var]); + } else { + $loop_scope->redefined_loop_vars[$redefined_var] = Type::combineUnionTypes( + $redefined_vars[$redefined_var], + $type + ); + } + } + } + + foreach ($redefined_vars as $var => $type) { + $loop_scope->possibly_redefined_loop_vars[$var] = Type::combineUnionTypes( + $type, + $loop_scope->possibly_redefined_loop_vars[$var] ?? null + ); + } + + if ($context->finally_scope) { + foreach ($context->vars_in_scope as $var_id => $type) { + if (isset($context->finally_scope->vars_in_scope[$var_id])) { + $context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( + $context->finally_scope->vars_in_scope[$var_id], + $type, + $statements_analyzer->getCodebase() + ); + } else { + $context->finally_scope->vars_in_scope[$var_id] = $type; + $type->possibly_undefined = true; + $type->possibly_undefined_from_try = true; + } + } + } + } + + $context->has_returned = true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php new file mode 100644 index 00000000..8b9be56b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php @@ -0,0 +1,135 @@ +getCodebase(); + + foreach ($stmt->exprs as $i => $expr) { + $context->inside_call = true; + ExpressionAnalyzer::analyze($statements_analyzer, $expr, $context); + $context->inside_call = false; + + $expr_type = $statements_analyzer->node_data->getType($expr); + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { + if ($expr_type && $expr_type->hasObjectType()) { + $expr_type = CastAnalyzer::castStringAttempt( + $statements_analyzer, + $context, + $expr_type, + $expr, + false + ); + } + + $call_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + $echo_param_sink = TaintSink::getForMethodArgument( + 'echo', + 'echo', + (int) $i, + null, + $call_location + ); + + $echo_param_sink->taints = [ + TaintKind::INPUT_HTML, + TaintKind::INPUT_HAS_QUOTES, + TaintKind::USER_SECRET, + TaintKind::SYSTEM_SECRET + ]; + + $statements_analyzer->data_flow_graph->addSink($echo_param_sink); + } + + if (ArgumentAnalyzer::verifyType( + $statements_analyzer, + $expr_type ?? Type::getMixed(), + Type::getString(), + null, + 'echo', + null, + (int)$i, + new CodeLocation($statements_analyzer->getSource(), $expr), + $expr, + $context, + $echo_param, + false, + null, + true, + true, + new CodeLocation($statements_analyzer, $stmt) + ) === false) { + return false; + } + } + + if ($codebase->config->forbid_echo) { + if (IssueBuffer::accepts( + new ForbiddenEcho( + 'Use of echo', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSource()->getSuppressedIssues() + )) { + return false; + } + } elseif (isset($codebase->config->forbidden_functions['echo'])) { + IssueBuffer::maybeAdd( + new ForbiddenCode( + 'Use of echo', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSource()->getSuppressedIssues() + ); + } + + if (!$context->collect_initializations && !$context->collect_mutations) { + if ($context->mutation_free || $context->external_mutation_free) { + IssueBuffer::maybeAdd( + new ImpureFunctionCall( + 'Cannot call echo from a mutation-free context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + } + + return true; + } +} 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 new file mode 100644 index 00000000..0a92b1a1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php @@ -0,0 +1,607 @@ +items)) { + $statements_analyzer->node_data->setType($stmt, Type::getEmptyArray()); + + return true; + } + + $codebase = $statements_analyzer->getCodebase(); + + $array_creation_info = new ArrayCreationInfo(); + + foreach ($stmt->items as $item) { + if ($item === null) { + IssueBuffer::maybeAdd( + new ParseError( + 'Array element cannot be empty', + new CodeLocation($statements_analyzer, $stmt) + ) + ); + + return false; + } + + self::analyzeArrayItem( + $statements_analyzer, + $context, + $array_creation_info, + $item, + $codebase + ); + } + + if ($array_creation_info->item_key_atomic_types) { + $item_key_type = TypeCombiner::combine( + $array_creation_info->item_key_atomic_types, + $codebase, + false, + true, + 30 + ); + } else { + $item_key_type = null; + } + + if ($array_creation_info->item_value_atomic_types) { + $item_value_type = TypeCombiner::combine( + $array_creation_info->item_value_atomic_types, + $codebase, + false, + true, + 30 + ); + } else { + $item_value_type = null; + } + + // if this array looks like an object-like array, let's return that instead + if ($item_value_type + && $item_key_type + && ($item_key_type->hasString() || $item_key_type->hasInt()) + && $array_creation_info->can_create_objectlike + && $array_creation_info->property_types + ) { + $object_like = new TKeyedArray( + $array_creation_info->property_types, + $array_creation_info->class_strings + ); + $object_like->sealed = true; + $object_like->is_list = $array_creation_info->all_list; + + $stmt_type = new Union([$object_like]); + + if ($array_creation_info->parent_taint_nodes) { + $stmt_type->parent_nodes = $array_creation_info->parent_taint_nodes; + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + return true; + } + + if ($array_creation_info->all_list) { + if (empty($array_creation_info->item_key_atomic_types)) { + $array_type = new TList($item_value_type ?? Type::getMixed()); + } else { + $array_type = new TNonEmptyList($item_value_type ?? Type::getMixed()); + $array_type->count = count($array_creation_info->property_types); + } + + $stmt_type = new Union([ + $array_type, + ]); + + if ($array_creation_info->parent_taint_nodes) { + $stmt_type->parent_nodes = $array_creation_info->parent_taint_nodes; + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + return true; + } + + if ($item_key_type) { + $bad_types = []; + $good_types = []; + + foreach ($item_key_type->getAtomicTypes() as $atomic_key_type) { + if ($atomic_key_type instanceof TMixed) { + IssueBuffer::maybeAdd( + new MixedArrayOffset( + 'Cannot create mixed offset – expecting array-key', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + $bad_types[] = $atomic_key_type; + + $good_types[] = new TArrayKey; + + + continue; + } + + if (!$atomic_key_type instanceof TString + && !$atomic_key_type instanceof TInt + && !$atomic_key_type instanceof TArrayKey + && !$atomic_key_type instanceof TTemplateParam + && !( + $atomic_key_type instanceof TObjectWithProperties + && isset($atomic_key_type->methods['__toString']) + ) + ) { + IssueBuffer::maybeAdd( + new InvalidArrayOffset( + 'Cannot create offset of type ' . $item_key_type->getKey() . ', expecting array-key', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + $bad_types[] = $atomic_key_type; + + if ($atomic_key_type instanceof TFalse) { + $good_types[] = new TLiteralInt(0); + } elseif ($atomic_key_type instanceof TTrue) { + $good_types[] = new TLiteralInt(1); + } elseif ($atomic_key_type instanceof TBool) { + $good_types[] = new TLiteralInt(0); + $good_types[] = new TLiteralInt(1); + } elseif ($atomic_key_type instanceof TLiteralFloat) { + $good_types[] = new TLiteralInt((int) $atomic_key_type->value); + } elseif ($atomic_key_type instanceof TFloat) { + $good_types[] = new TInt; + } else { + $good_types[] = new TArrayKey; + } + } + } + + if ($bad_types && $good_types) { + $item_key_type->substitute( + TypeCombiner::combine($bad_types, $codebase), + TypeCombiner::combine($good_types, $codebase) + ); + } + } + + $array_type = new TNonEmptyArray([ + $item_key_type && !$item_key_type->hasMixed() ? $item_key_type : Type::getArrayKey(), + $item_value_type ?? Type::getMixed(), + ]); + + $array_type->count = count($array_creation_info->property_types); + + $stmt_type = new Union([ + $array_type, + ]); + + if ($array_creation_info->parent_taint_nodes) { + $stmt_type->parent_nodes = $array_creation_info->parent_taint_nodes; + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + return true; + } + + private static function analyzeArrayItem( + StatementsAnalyzer $statements_analyzer, + Context $context, + ArrayCreationInfo $array_creation_info, + PhpParser\Node\Expr\ArrayItem $item, + Codebase $codebase + ): void { + if ($item->unpack) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $item->value, $context) === false) { + return; + } + + $unpacked_array_type = $statements_analyzer->node_data->getType($item->value); + + if (!$unpacked_array_type) { + return; + } + + self::handleUnpackedArray( + $statements_analyzer, + $array_creation_info, + $item, + $unpacked_array_type, + $codebase + ); + + if (($data_flow_graph = $statements_analyzer->data_flow_graph) + && $data_flow_graph instanceof VariableUseGraph + && $unpacked_array_type->parent_nodes + ) { + $var_location = new CodeLocation($statements_analyzer->getSource(), $item->value); + + $new_parent_node = DataFlowNode::getForAssignment( + 'array', + $var_location + ); + + $data_flow_graph->addNode($new_parent_node); + + foreach ($unpacked_array_type->parent_nodes as $parent_node) { + $data_flow_graph->addPath( + $parent_node, + $new_parent_node, + 'arrayvalue-assignment' + ); + } + + $array_creation_info->parent_taint_nodes += [$new_parent_node->id => $new_parent_node]; + } + + return; + } + + $item_key_value = null; + $item_key_type = null; + $item_is_list_item = false; + + if ($item->key) { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + if (ExpressionAnalyzer::analyze($statements_analyzer, $item->key, $context) === false) { + $context->inside_general_use = $was_inside_general_use; + + return; + } + $context->inside_general_use = $was_inside_general_use; + + if ($item_key_type = $statements_analyzer->node_data->getType($item->key)) { + $key_type = $item_key_type; + + if ($key_type->isNull()) { + $key_type = Type::getString(''); + } + + if ($item->key instanceof PhpParser\Node\Scalar\String_ + && preg_match('/^(0|[1-9][0-9]*)$/', $item->key->value) + && ( + (int) $item->key->value < PHP_INT_MAX || + $item->key->value === (string) PHP_INT_MAX + ) + ) { + $key_type = Type::getInt(false, (int) $item->key->value); + } + + $array_creation_info->item_key_atomic_types = array_merge( + $array_creation_info->item_key_atomic_types, + array_values($key_type->getAtomicTypes()) + ); + + if ($key_type->isSingleStringLiteral()) { + $item_key_literal_type = $key_type->getSingleStringLiteral(); + $item_key_value = $item_key_literal_type->value; + + if ($item_key_literal_type instanceof TLiteralClassString) { + $array_creation_info->class_strings[$item_key_value] = true; + } + } elseif ($key_type->isSingleIntLiteral()) { + $item_key_value = $key_type->getSingleIntLiteral()->value; + + if ($item_key_value >= $array_creation_info->int_offset) { + if ($item_key_value === $array_creation_info->int_offset) { + $item_is_list_item = true; + } + $array_creation_info->int_offset = $item_key_value + 1; + } + } + } + } else { + $item_is_list_item = true; + $item_key_value = $array_creation_info->int_offset++; + $array_creation_info->item_key_atomic_types[] = new TLiteralInt($item_key_value); + } + + if (ExpressionAnalyzer::analyze($statements_analyzer, $item->value, $context) === false) { + return; + } + + $array_creation_info->all_list = $array_creation_info->all_list && $item_is_list_item; + + if ($item_key_value !== null) { + if (isset($array_creation_info->array_keys[$item_key_value])) { + IssueBuffer::maybeAdd( + new DuplicateArrayKey( + 'Key \'' . $item_key_value . '\' already exists on array', + new CodeLocation($statements_analyzer->getSource(), $item) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $array_creation_info->array_keys[$item_key_value] = true; + } + + + if (($data_flow_graph = $statements_analyzer->data_flow_graph) + && ($data_flow_graph instanceof VariableUseGraph + || !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues())) + ) { + if ($item_value_type = $statements_analyzer->node_data->getType($item->value)) { + if ($item_value_type->parent_nodes + && !($item_value_type->isSingle() + && $item_value_type->hasLiteralValue() + && $data_flow_graph instanceof TaintFlowGraph) + ) { + $var_location = new CodeLocation($statements_analyzer->getSource(), $item); + + $new_parent_node = DataFlowNode::getForAssignment( + 'array' + . ($item_key_value !== null ? '[\'' . $item_key_value . '\']' : ''), + $var_location + ); + + $data_flow_graph->addNode($new_parent_node); + + $event = new AddRemoveTaintsEvent($item, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + foreach ($item_value_type->parent_nodes as $parent_node) { + $data_flow_graph->addPath( + $parent_node, + $new_parent_node, + 'arrayvalue-assignment' + . ($item_key_value !== null ? '-\'' . $item_key_value . '\'' : ''), + $added_taints, + $removed_taints + ); + } + + $array_creation_info->parent_taint_nodes += [$new_parent_node->id => $new_parent_node]; + } + + if ($item_key_type + && $item_key_type->parent_nodes + && $item_key_value === null + && !($item_key_type->isSingle() + && $item_key_type->hasLiteralValue() + && $data_flow_graph instanceof TaintFlowGraph) + ) { + $var_location = new CodeLocation($statements_analyzer->getSource(), $item); + + $new_parent_node = DataFlowNode::getForAssignment( + 'array', + $var_location + ); + + $data_flow_graph->addNode($new_parent_node); + + $event = new AddRemoveTaintsEvent($item, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + foreach ($item_key_type->parent_nodes as $parent_node) { + $data_flow_graph->addPath( + $parent_node, + $new_parent_node, + 'arraykey-assignment', + $added_taints, + $removed_taints + ); + } + + $array_creation_info->parent_taint_nodes += [$new_parent_node->id => $new_parent_node]; + } + } + } + + if ($item->byRef) { + $var_id = ExpressionIdentifier::getArrayVarId( + $item->value, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($var_id) { + $context->removeDescendents( + $var_id, + $context->vars_in_scope[$var_id] ?? null, + null, + $statements_analyzer + ); + + $context->vars_in_scope[$var_id] = Type::getMixed(); + } + } + + $config = $codebase->config; + + if ($item_value_type = $statements_analyzer->node_data->getType($item->value)) { + if ($item_key_value !== null + && count($array_creation_info->property_types) <= $config->max_shaped_array_size + ) { + $array_creation_info->property_types[$item_key_value] = $item_value_type; + } else { + $array_creation_info->can_create_objectlike = false; + } + + $array_creation_info->item_value_atomic_types = array_merge( + $array_creation_info->item_value_atomic_types, + array_values($item_value_type->getAtomicTypes()) + ); + } else { + $array_creation_info->item_value_atomic_types[] = new TMixed(); + + if ($item_key_value !== null + && count($array_creation_info->property_types) <= $config->max_shaped_array_size + ) { + $array_creation_info->property_types[$item_key_value] = Type::getMixed(); + } else { + $array_creation_info->can_create_objectlike = false; + } + } + } + + private static function handleUnpackedArray( + StatementsAnalyzer $statements_analyzer, + ArrayCreationInfo $array_creation_info, + PhpParser\Node\Expr\ArrayItem $item, + Union $unpacked_array_type, + Codebase $codebase + ): void { + foreach ($unpacked_array_type->getAtomicTypes() as $unpacked_atomic_type) { + if ($unpacked_atomic_type instanceof TKeyedArray) { + foreach ($unpacked_atomic_type->properties as $key => $property_value) { + if (is_string($key)) { + if ($codebase->php_major_version < 8 || + ($codebase->php_major_version === 8 && $codebase->php_minor_version < 1) + ) { + IssueBuffer::maybeAdd( + new DuplicateArrayKey( + 'String keys are not supported in unpacked arrays', + new CodeLocation($statements_analyzer->getSource(), $item->value) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + $new_offset = $key; + $array_creation_info->item_key_atomic_types[] = new TLiteralString($new_offset); + } else { + $new_offset = $array_creation_info->int_offset++; + $array_creation_info->item_key_atomic_types[] = new TLiteralInt($new_offset); + } + + $array_creation_info->item_value_atomic_types = array_merge( + $array_creation_info->item_value_atomic_types, + array_values($property_value->getAtomicTypes()) + ); + + $array_creation_info->array_keys[$new_offset] = true; + $array_creation_info->property_types[$new_offset] = $property_value; + } + } else { + $codebase = $statements_analyzer->getCodebase(); + + if ($unpacked_atomic_type instanceof TArray + || $unpacked_atomic_type instanceof TIterable + || ( + $unpacked_atomic_type instanceof TGenericObject + && $unpacked_atomic_type->hasTraversableInterface($codebase) + && count($unpacked_atomic_type->type_params) === 2 + )) { + /** @psalm-suppress PossiblyUndefinedArrayOffset provably true, but Psalm can’t see it */ + if ($unpacked_atomic_type->type_params[1]->isEmpty()) { + continue; + } + $array_creation_info->can_create_objectlike = false; + + if ($unpacked_atomic_type->type_params[0]->hasString()) { + if ($codebase->php_major_version < 8 || + ($codebase->php_major_version === 8 && $codebase->php_minor_version < 1) + ) { + IssueBuffer::maybeAdd( + new DuplicateArrayKey( + 'String keys are not supported in unpacked arrays', + new CodeLocation($statements_analyzer->getSource(), $item->value) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + $array_creation_info->item_key_atomic_types[] = new TString(); + } elseif ($unpacked_atomic_type->type_params[0]->hasInt()) { + $array_creation_info->item_key_atomic_types[] = new TInt(); + } + + $array_creation_info->item_value_atomic_types = array_merge( + $array_creation_info->item_value_atomic_types, + array_values( + isset($unpacked_atomic_type->type_params[1]) + ? $unpacked_atomic_type->type_params[1]->getAtomicTypes() + : [new TMixed()] + ) + ); + } elseif ($unpacked_atomic_type instanceof TList) { + if ($unpacked_atomic_type->type_param->isEmpty()) { + continue; + } + $array_creation_info->can_create_objectlike = false; + + $array_creation_info->item_key_atomic_types[] = new TInt(); + + $array_creation_info->item_value_atomic_types = array_merge( + $array_creation_info->item_value_atomic_types, + array_values($unpacked_atomic_type->type_param->getAtomicTypes()) + ); + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php new file mode 100644 index 00000000..ca0e761b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php @@ -0,0 +1,55 @@ + + */ + public $item_key_atomic_types = []; + + /** + * @var list + */ + public $item_value_atomic_types = []; + + /** + * @var array + */ + public $property_types = []; + + /** + * @var array + */ + public $class_strings = []; + + /** + * @var bool + */ + public $can_create_objectlike = true; + + /** + * @var array + */ + public $array_keys = []; + + /** + * @var int + */ + public $int_offset = 0; + + /** + * @var bool + */ + public $all_list = true; + + /** + * @var array + */ + public $parent_taint_nodes = []; +} 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 new file mode 100644 index 00000000..0fa53eaf --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php @@ -0,0 +1,4122 @@ + 0) will be turned into an assertion to make psalm understand that in the + * if block, $a is a positive-int + */ +class AssertionFinder +{ + public const ASSIGNMENT_TO_RIGHT = 1; + public const ASSIGNMENT_TO_LEFT = -1; + + public const IS_TYPE_CHECKS = [ + 'is_string' => ['string', [Type::class, 'getString']], + 'is_int' => ['int', [Type::class, 'getInt']], + 'is_integer' => ['int', [Type::class, 'getInt']], + 'is_long' => ['int', [Type::class, 'getInt']], + 'is_bool' => ['bool', [Type::class, 'getBool']], + 'is_resource' => ['resource', [Type::class, 'getResource']], + 'is_object' => ['object', [Type::class, 'getObject']], + 'array_is_list' => ['list', [Type::class, 'getList']], + 'is_array' => ['array', [Type::class, 'getArray']], + 'is_numeric' => ['numeric', [Type::class, 'getNumeric']], + 'is_null' => ['null', [Type::class, 'getNull']], + 'is_float' => ['float', [Type::class, 'getFloat']], + 'is_real' => ['float', [Type::class, 'getFloat']], + 'is_double' => ['float', [Type::class, 'getFloat']], + 'is_scalar' => ['scalar', [Type::class, 'getScalar']], + 'is_iterable' => ['iterable'], + 'is_countable' => ['countable'], + ]; + + /** + * Gets all the type assertions in a conditional + * + * @return list>>> + */ + public static function scrapeAssertions( + PhpParser\Node\Expr $conditional, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase = null, + bool $inside_negation = false, + bool $cache = true, + bool $inside_conditional = true + ): array { + $if_types = []; + + if ($conditional instanceof PhpParser\Node\Expr\Instanceof_) { + return self::getInstanceofAssertions( + $conditional, + $codebase, + $source, + $this_class_name, + $inside_negation + ); + } + + if ($conditional instanceof PhpParser\Node\Expr\Assign) { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->var, + $this_class_name, + $source + ); + + $candidate_if_types = $inside_conditional + ? self::scrapeAssertions( + $conditional->expr, + $this_class_name, + $source, + $codebase, + $inside_negation, + $cache, + $inside_conditional + ) + : []; + + if ($var_name) { + if ($candidate_if_types) { + $if_types[$var_name] = [['@' . json_encode($candidate_if_types[0])]]; + } else { + $if_types[$var_name] = [['!falsy']]; + } + } + + return $if_types ? [$if_types] : []; + } + + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional, + $this_class_name, + $source + ); + + if ($var_name) { + $if_types[$var_name] = [['!falsy']]; + + if (!$conditional instanceof PhpParser\Node\Expr\MethodCall + && !$conditional instanceof PhpParser\Node\Expr\StaticCall + ) { + return [$if_types]; + } + } + + if ($conditional instanceof PhpParser\Node\Expr\BooleanNot) { + return []; + } + + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical || + $conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal + ) { + return self::scrapeEqualityAssertions( + $conditional, + $this_class_name, + $source, + $codebase, + $cache, + $inside_conditional + ); + } + + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical || + $conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual + ) { + return self::scrapeInequalityAssertions( + $conditional, + $this_class_name, + $source, + $codebase, + $cache, + $inside_conditional + ); + } + + //A nullsafe method call basically adds an assertion !null for the checked variable + if ($conditional instanceof PhpParser\Node\Expr\NullsafeMethodCall) { + $if_types = []; + + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->var, + $this_class_name, + $source + ); + + if ($var_name) { + $if_types[$var_name] = [['!null']]; + } + + //we may throw a RedundantNullsafeMethodCall here in the future if $var_name is never null + + return $if_types ? [$if_types] : []; + } + + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater + || $conditional instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual + ) { + return self::getGreaterAssertions( + $conditional, + $source, + $this_class_name + ); + } + + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Smaller + || $conditional instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual + ) { + return self::getSmallerAssertions( + $conditional, + $source, + $this_class_name + ); + } + + if ($conditional instanceof PhpParser\Node\Expr\FuncCall && !$conditional->isFirstClassCallable()) { + return self::processFunctionCall( + $conditional, + $this_class_name, + $source, + $codebase, + $inside_negation + ); + } + + if (($conditional instanceof PhpParser\Node\Expr\MethodCall + || $conditional instanceof PhpParser\Node\Expr\StaticCall) + && !$conditional->isFirstClassCallable() + ) { + $custom_assertions = self::processCustomAssertion($conditional, $this_class_name, $source); + + if ($custom_assertions) { + return $custom_assertions; + } + + return $if_types ? [$if_types] : []; + } + + if ($conditional instanceof PhpParser\Node\Expr\Empty_) { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->expr, + $this_class_name, + $source + ); + + if ($var_name) { + if ($conditional->expr instanceof PhpParser\Node\Expr\Variable + && $source instanceof StatementsAnalyzer + && ($var_type = $source->node_data->getType($conditional->expr)) + && !$var_type->isMixed() + && !$var_type->possibly_undefined + ) { + $if_types[$var_name] = [['falsy']]; + } else { + $if_types[$var_name] = [['empty']]; + } + } + + return $if_types ? [$if_types] : []; + } + + if ($conditional instanceof PhpParser\Node\Expr\Isset_) { + foreach ($conditional->vars as $isset_var) { + $var_name = ExpressionIdentifier::getArrayVarId( + $isset_var, + $this_class_name, + $source + ); + + if ($var_name) { + if ($isset_var instanceof PhpParser\Node\Expr\Variable + && $source instanceof StatementsAnalyzer + && ($var_type = $source->node_data->getType($isset_var)) + && !$var_type->isMixed() + && !$var_type->possibly_undefined + && !$var_type->possibly_undefined_from_try + ) { + $if_types[$var_name] = [['!null']]; + } else { + $if_types[$var_name] = [['isset']]; + } + } else { + // look for any variables we *can* use for an isset assertion + $array_root = $isset_var; + + while ($array_root instanceof PhpParser\Node\Expr\ArrayDimFetch && !$var_name) { + $array_root = $array_root->var; + + $var_name = ExpressionIdentifier::getArrayVarId( + $array_root, + $this_class_name, + $source + ); + } + + if ($var_name) { + $if_types[$var_name] = [['=isset']]; + } + } + } + + return $if_types ? [$if_types] : []; + } + + return []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional + * @return list>>> + */ + private static function scrapeEqualityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase = null, + bool $cache = true, + bool $inside_conditional = true + ): array { + $null_position = self::hasNullVariable($conditional, $source); + + if ($null_position !== null) { + return self::getNullEqualityAssertions( + $conditional, + $this_class_name, + $source, + $codebase, + $null_position + ); + } + + $true_position = self::hasTrueVariable($conditional); + + if ($true_position) { + return self::getTrueEqualityAssertions( + $conditional, + $this_class_name, + $source, + $codebase, + $cache, + $true_position + ); + } + + $false_position = self::hasFalseVariable($conditional); + + if ($false_position) { + return self::getFalseEqualityAssertions( + $conditional, + $this_class_name, + $source, + $codebase, + $cache, + $inside_conditional, + $false_position + ); + } + + $empty_array_position = self::hasEmptyArrayVariable($conditional); + + if ($empty_array_position !== null) { + return self::getEmptyArrayEqualityAssertions( + $conditional, + $this_class_name, + $source, + $codebase, + $empty_array_position + ); + } + + $gettype_position = self::hasGetTypeCheck($conditional); + + if ($gettype_position) { + return self::getGettypeEqualityAssertions( + $conditional, + $this_class_name, + $source, + $gettype_position + ); + } + + $get_debug_type_position = self::hasGetDebugTypeCheck($conditional); + + if ($get_debug_type_position) { + return self::getGetdebugtypeEqualityAssertions( + $conditional, + $this_class_name, + $source, + $get_debug_type_position + ); + } + + if (!$source instanceof StatementsAnalyzer) { + return []; + } + + $count = null; + $count_equality_position = self::hasCountEqualityCheck($conditional, $count); + + if ($count_equality_position) { + $if_types = []; + + if ($count_equality_position === self::ASSIGNMENT_TO_RIGHT) { + $count_expr = $conditional->left; + } elseif ($count_equality_position === self::ASSIGNMENT_TO_LEFT) { + $count_expr = $conditional->right; + } else { + throw new UnexpectedValueException('$count_equality_position value'); + } + + /** @var PhpParser\Node\Expr\FuncCall $count_expr */ + $var_name = ExpressionIdentifier::getArrayVarId( + $count_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + + $var_type = $source->node_data->getType($conditional->left); + $other_type = $source->node_data->getType($conditional->right); + + if ($codebase + && $other_type + && $var_type + && $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical + ) { + self::handleParadoxicalAssertions( + $source, + $var_type, + $this_class_name, + $other_type, + $codebase, + $conditional + ); + } + + if ($var_name) { + if ($count !== 0) { + $if_types[$var_name] = [['=has-exactly-' . $count]]; + } else { + $if_types[$var_name] = [['!non-empty-countable']]; + } + } + + return $if_types ? [$if_types] : []; + } + + $getclass_position = self::hasGetClassCheck($conditional, $source); + + if ($getclass_position) { + return self::getGetclassEqualityAssertions( + $conditional, + $this_class_name, + $source, + $getclass_position + ); + } + + $typed_value_position = self::hasTypedValueComparison($conditional, $source); + + if ($typed_value_position) { + return self::getTypedValueEqualityAssertions( + $conditional, + $this_class_name, + $source, + $codebase, + $typed_value_position + ); + } + + $var_type = $source->node_data->getType($conditional->left); + $other_type = $source->node_data->getType($conditional->right); + + if ($codebase + && $var_type + && $other_type + && $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical + ) { + if (!UnionTypeComparator::canExpressionTypesBeIdentical($codebase, $var_type, $other_type)) { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + $var_type->getId() . ' cannot be identical to ' . $other_type->getId(), + new CodeLocation($source, $conditional), + $var_type->getId() . ' ' . $other_type->getId() + ), + $source->getSuppressedIssues() + ); + } else { + // both side of the Identical can be asserted to the intersection of both + $intersection_type = Type::intersectUnionTypes($var_type, $other_type, $codebase); + + if ($intersection_type !== null && $intersection_type->isSingle()) { + try { + $assertion = $intersection_type->getAssertionString(); + } catch (UnexpectedValueException $e) { + // getAssertionString can't work if the Union has more than one type + return []; + } + $if_types = []; + + $var_name_left = ExpressionIdentifier::getArrayVarId( + $conditional->left, + $this_class_name, + $source + ); + + try { + $var_assertion_different = $var_type->getAssertionString() !== $assertion; + } catch (UnexpectedValueException $e) { + // if getAssertionString threw, it's different + $var_assertion_different = true; + } + + if ($var_name_left && $var_assertion_different) { + $if_types[$var_name_left] = [['='.$assertion]]; + } + + $var_name_right = ExpressionIdentifier::getArrayVarId( + $conditional->right, + $this_class_name, + $source + ); + + + try { + $other_assertion_different = $other_type->getAssertionString() !== $assertion; + } catch (UnexpectedValueException $e) { + // if getAssertionString threw, it's different + $other_assertion_different = true; + } + + if ($var_name_right && $other_assertion_different) { + $if_types[$var_name_right] = [['='.$assertion]]; + } + + return $if_types ? [$if_types] : []; + } + } + } + + return []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional + * @return list>>> + */ + private static function scrapeInequalityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase = null, + bool $cache = true, + bool $inside_conditional = true + ): array { + $null_position = self::hasNullVariable($conditional, $source); + + if ($null_position !== null) { + return self::getNullInequalityAssertions( + $conditional, + $source, + $this_class_name, + $codebase, + $null_position + ); + } + + $false_position = self::hasFalseVariable($conditional); + + if ($false_position) { + return self::getFalseInequalityAssertions( + $conditional, + $cache, + $this_class_name, + $source, + $inside_conditional, + $codebase, + $false_position + ); + } + + $true_position = self::hasTrueVariable($conditional); + + if ($true_position) { + return self::getTrueInequalityAssertions( + $true_position, + $conditional, + $this_class_name, + $source, + $codebase, + $cache, + $inside_conditional + ); + } + + $count = null; + $count_inequality_position = self::hasCountEqualityCheck($conditional, $count); + + if ($count_inequality_position) { + $if_types = []; + + if ($count_inequality_position === self::ASSIGNMENT_TO_RIGHT) { + $count_expr = $conditional->left; + } elseif ($count_inequality_position === self::ASSIGNMENT_TO_LEFT) { + $count_expr = $conditional->right; + } else { + throw new UnexpectedValueException('$count_equality_position value'); + } + + /** @var PhpParser\Node\Expr\FuncCall $count_expr */ + $var_name = ExpressionIdentifier::getArrayVarId( + $count_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + + if ($var_name) { + if ($count) { + $if_types[$var_name] = [['!has-exactly-' . $count]]; + } else { + $if_types[$var_name] = [['non-empty-countable']]; + } + } + + return $if_types ? [$if_types] : []; + } + + $empty_array_position = self::hasEmptyArrayVariable($conditional); + + if ($empty_array_position !== null) { + return self::getEmptyInequalityAssertions( + $conditional, + $this_class_name, + $source, + $codebase, + $empty_array_position + ); + } + + $gettype_position = self::hasGetTypeCheck($conditional); + + if ($gettype_position) { + return self::getGettypeInequalityAssertions( + $conditional, + $this_class_name, + $source, + $gettype_position + ); + } + + $get_debug_type_position = self::hasGetDebugTypeCheck($conditional); + + if ($get_debug_type_position) { + return self::getGetdebugTypeInequalityAssertions( + $conditional, + $this_class_name, + $source, + $get_debug_type_position + ); + } + + if (!$source instanceof StatementsAnalyzer) { + return []; + } + + $getclass_position = self::hasGetClassCheck($conditional, $source); + + if ($getclass_position) { + return self::getGetclassInequalityAssertions( + $conditional, + $this_class_name, + $source, + $getclass_position + ); + } + + $typed_value_position = self::hasTypedValueComparison($conditional, $source); + + if ($typed_value_position) { + return self::getTypedValueInequalityAssertions( + $conditional, + $this_class_name, + $source, + $codebase, + $typed_value_position + ); + } + + return []; + } + + /** + * @return list>>> + */ + public static function processFunctionCall( + PhpParser\Node\Expr\FuncCall $expr, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase = null, + bool $negate = false + ): array { + $first_var_name = isset($expr->getArgs()[0]->value) + ? ExpressionIdentifier::getArrayVarId( + $expr->getArgs()[0]->value, + $this_class_name, + $source + ) + : null; + + $if_types = []; + + $first_var_type = isset($expr->getArgs()[0]->value) + && $source instanceof StatementsAnalyzer + ? $source->node_data->getType($expr->getArgs()[0]->value) + : null; + + if ($tmp_if_types = self::handleIsTypeCheck( + $codebase, + $source, + $expr, + $first_var_name, + $first_var_type, + $expr, + $negate + )) { + $if_types = $tmp_if_types; + } elseif ($source instanceof StatementsAnalyzer && self::hasIsACheck($expr, $source)) { + return self::getIsaAssertions($expr, $source, $this_class_name, $first_var_name); + } elseif (self::hasCallableCheck($expr)) { + if ($first_var_name) { + $if_types[$first_var_name] = [['callable']]; + } elseif ($expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\Array_ + && isset($expr->getArgs()[0]->value->items[0], $expr->getArgs()[0]->value->items[1]) + && $expr->getArgs()[0]->value->items[1]->value instanceof PhpParser\Node\Scalar\String_ + ) { + $first_var_name_in_array_argument = ExpressionIdentifier::getArrayVarId( + $expr->getArgs()[0]->value->items[0]->value, + $this_class_name, + $source + ); + if ($first_var_name_in_array_argument) { + $if_types[$first_var_name_in_array_argument] = [ + ['hasmethod-' . $expr->getArgs()[0]->value->items[1]->value->value] + ]; + } + } + } elseif ($class_exists_check_type = self::hasClassExistsCheck($expr)) { + if ($first_var_name) { + $class_string_type = ($class_exists_check_type === 1 ? 'loaded-' : '') . 'class-string'; + $if_types[$first_var_name] = [[$class_string_type]]; + } + } elseif ($class_exists_check_type = self::hasTraitExistsCheck($expr)) { + if ($first_var_name) { + if ($class_exists_check_type === 2) { + $if_types[$first_var_name] = [['trait-string']]; + } else { + $if_types[$first_var_name] = [['=trait-string']]; + } + } + } elseif (self::hasInterfaceExistsCheck($expr)) { + if ($first_var_name) { + $if_types[$first_var_name] = [['interface-string']]; + } + } elseif (self::hasFunctionExistsCheck($expr)) { + if ($first_var_name) { + $if_types[$first_var_name] = [['callable-string']]; + } + } elseif ($expr->name instanceof PhpParser\Node\Name + && strtolower($expr->name->parts[0]) === 'method_exists' + && isset($expr->getArgs()[1]) + && $expr->getArgs()[1]->value instanceof PhpParser\Node\Scalar\String_ + ) { + if ($first_var_name) { + $if_types[$first_var_name] = [['hasmethod-' . $expr->getArgs()[1]->value->value]]; + } + } elseif (self::hasInArrayCheck($expr) && $source instanceof StatementsAnalyzer) { + return self::getInarrayAssertions($expr, $source, $first_var_name); + } elseif (self::hasArrayKeyExistsCheck($expr)) { + return self::getArrayKeyExistsAssertions( + $expr, + $first_var_type, + $first_var_name, + $source, + $this_class_name + ); + } elseif (self::hasNonEmptyCountCheck($expr)) { + if ($first_var_name) { + $if_types[$first_var_name] = [['non-empty-countable']]; + } + } else { + return self::processCustomAssertion($expr, $this_class_name, $source); + } + + return $if_types ? [$if_types] : []; + } + + private static function processIrreconcilableFunctionCall( + Union $first_var_type, + Union $expected_type, + PhpParser\Node\Expr $expr, + StatementsAnalyzer $source, + Codebase $codebase, + bool $negate + ): void { + if ($first_var_type->hasMixed()) { + return; + } + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $first_var_type, + $expected_type + )) { + return; + } + + if (!$negate) { + if ($first_var_type->from_docblock) { + IssueBuffer::maybeAdd( + new RedundantConditionGivenDocblockType( + 'Docblock type ' . $first_var_type . ' always contains ' . $expected_type, + new CodeLocation($source, $expr), + $first_var_type . ' ' . $expected_type + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RedundantCondition( + $first_var_type . ' always contains ' . $expected_type, + new CodeLocation($source, $expr), + $first_var_type . ' ' . $expected_type + ), + $source->getSuppressedIssues() + ); + } + } else { + if ($first_var_type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + 'Docblock type !' . $first_var_type . ' does not contain ' . $expected_type, + new CodeLocation($source, $expr), + $first_var_type . ' ' . $expected_type + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + '!' . $first_var_type . ' does not contain ' . $expected_type, + new CodeLocation($source, $expr), + $first_var_type . ' ' . $expected_type + ), + $source->getSuppressedIssues() + ); + } + } + } + + /** + * @param PhpParser\Node\Expr\FuncCall|PhpParser\Node\Expr\MethodCall|PhpParser\Node\Expr\StaticCall $expr + * + * @return list>>> + */ + protected static function processCustomAssertion( + PhpParser\Node\Expr $expr, + ?string $this_class_name, + FileSource $source + ): array { + if (!$source instanceof StatementsAnalyzer) { + return []; + } + + $if_true_assertions = $source->node_data->getIfTrueAssertions($expr); + $if_false_assertions = $source->node_data->getIfFalseAssertions($expr); + + if ($if_true_assertions === null && $if_false_assertions === null) { + return []; + } + + $first_var_name = isset($expr->getArgs()[0]->value) + ? ExpressionIdentifier::getArrayVarId( + $expr->getArgs()[0]->value, + $this_class_name, + $source + ) + : null; + + $anded_types = []; + + if ($if_true_assertions) { + foreach ($if_true_assertions as $assertion) { + $if_types = []; + + $assertion = clone $assertion; + + foreach ($assertion->rule as $i => $and_rules) { + foreach ($and_rules as $j => $rule) { + if (strpos($rule, 'class-constant(') === 0) { + $codebase = $source->getCodebase(); + try { + $assertion->rule[$i][$j] = TypeExpander::expandUnion( + $codebase, + Type::parseString(substr($rule, 15, -1)), + null, + null, + null + )->getAssertionString(); + } catch (UnexpectedValueException $e) { + continue; + } + } + } + } + + if (is_int($assertion->var_id) && isset($expr->getArgs()[$assertion->var_id])) { + if ($assertion->var_id === 0) { + $var_name = $first_var_name; + } else { + $var_name = ExpressionIdentifier::getArrayVarId( + $expr->getArgs()[$assertion->var_id]->value, + $this_class_name, + $source + ); + } + + if ($var_name) { + $if_types[$var_name] = [[$assertion->rule[0][0]]]; + } + } elseif ($assertion->var_id === '$this') { + if (!$expr instanceof PhpParser\Node\Expr\MethodCall) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Assertion of $this can be done only on method of a class', + new CodeLocation($source, $expr) + ) + ); + continue; + } + + $var_id = ExpressionIdentifier::getArrayVarId( + $expr->var, + $this_class_name, + $source + ); + + if ($var_id) { + $if_types[$var_id] = [[$assertion->rule[0][0]]]; + } + } elseif (is_string($assertion->var_id)) { + $is_function = substr($assertion->var_id, -2) === '()'; + $exploded_id = explode('->', $assertion->var_id); + $var_id = $exploded_id[0] ?? null; + $property = $exploded_id[1] ?? null; + + if (is_numeric($var_id) && null !== $property && !$is_function) { + $args = $expr->getArgs(); + + if (!array_key_exists($var_id, $args)) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Variable '.$var_id.' is not an argument so cannot be asserted', + new CodeLocation($source, $expr) + ) + ); + continue; + } + + $arg_value = $args[$var_id]->value; + assert($arg_value instanceof PhpParser\Node\Expr\Variable); + + $arg_var_id = ExpressionIdentifier::getArrayVarId($arg_value, null, $source); + + if (null === $arg_var_id) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Variable being asserted as argument ' . ($var_id+1) . ' cannot be found + in local scope', + new CodeLocation($source, $expr) + ) + ); + continue; + } + + if (count($exploded_id) === 2) { + $failedMessage = self::isPropertyImmutableOnArgument( + $property, + $source->getNodeTypeProvider(), + $source->getCodebase()->classlike_storage_provider, + $arg_value + ); + + if (null !== $failedMessage) { + IssueBuffer::maybeAdd( + new InvalidDocblock($failedMessage, new CodeLocation($source, $expr)) + ); + continue; + } + } + + $assertion_var_id = str_replace($var_id, $arg_var_id, $assertion->var_id); + } elseif (!$expr instanceof PhpParser\Node\Expr\FuncCall) { + $assertion_var_id = $assertion->var_id; + + if (strpos($assertion_var_id, 'self::') === 0) { + $assertion_var_id = $this_class_name.'::'.substr($assertion_var_id, 6); + } + } else { + IssueBuffer::maybeAdd( + new InvalidDocblock( + sprintf('Assertion of variable "%s" cannot be recognized', $assertion->var_id), + new CodeLocation($source, $expr) + ) + ); + continue; + } + $if_types[$assertion_var_id] = [[$assertion->rule[0][0]]]; + } + + if ($if_types) { + $anded_types[] = $if_types; + } + } + } + + if ($if_false_assertions) { + foreach ($if_false_assertions as $assertion) { + $if_types = []; + + $assertion = clone $assertion; + + foreach ($assertion->rule as $i => $and_rules) { + foreach ($and_rules as $j => $rule) { + if (strpos($rule, 'class-constant(') === 0) { + $codebase = $source->getCodebase(); + + try { + $assertion->rule[$i][$j] = TypeExpander::expandUnion( + $codebase, + Type::parseString(substr($rule, 15, -1)), + null, + null, + null + )->getAssertionString(); + } catch (UnexpectedValueException $e) { + continue; + } + } + } + } + + if (is_int($assertion->var_id) && isset($expr->getArgs()[$assertion->var_id])) { + if ($assertion->var_id === 0) { + $var_name = $first_var_name; + } else { + $var_name = ExpressionIdentifier::getArrayVarId( + $expr->getArgs()[$assertion->var_id]->value, + $this_class_name, + $source + ); + } + + if ($var_name) { + if ('!' === $assertion->rule[0][0][0]) { + $if_types[$var_name] = [[substr($assertion->rule[0][0], 1)]]; + } else { + $if_types[$var_name] = [['!' . $assertion->rule[0][0]]]; + } + } + } elseif ($assertion->var_id === '$this' && $expr instanceof PhpParser\Node\Expr\MethodCall) { + $var_id = ExpressionIdentifier::getArrayVarId( + $expr->var, + $this_class_name, + $source + ); + + if ($var_id) { + if ('!' === $assertion->rule[0][0][0]) { + $if_types[$var_id] = [[substr($assertion->rule[0][0], 1)]]; + } else { + $if_types[$var_id] = [['!' . $assertion->rule[0][0]]]; + } + } + } elseif (is_string($assertion->var_id)) { + $is_function = substr($assertion->var_id, -2) === '()'; + $exploded_id = explode('->', $assertion->var_id); + $var_id = $exploded_id[0] ?? null; + $property = $exploded_id[1] ?? null; + + if (is_numeric($var_id) && null !== $property && !$is_function) { + $args = $expr->getArgs(); + + if (!array_key_exists($var_id, $args)) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Variable '.$var_id.' is not an argument so cannot be asserted', + new CodeLocation($source, $expr) + ) + ); + continue; + } + /** @var PhpParser\Node\Expr\Variable $arg_value */ + $arg_value = $args[$var_id]->value; + + $arg_var_id = ExpressionIdentifier::getArrayVarId($arg_value, null, $source); + + if (null === $arg_var_id) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Variable being asserted as argument ' . ($var_id+1) . ' cannot be found + in local scope', + new CodeLocation($source, $expr) + ) + ); + continue; + } + + if (count($exploded_id) === 2) { + $failedMessage = self::isPropertyImmutableOnArgument( + $property, + $source->getNodeTypeProvider(), + $source->getCodebase()->classlike_storage_provider, + $arg_value + ); + + if (null !== $failedMessage) { + IssueBuffer::maybeAdd( + new InvalidDocblock($failedMessage, new CodeLocation($source, $expr)) + ); + continue; + } + } + + if ('!' === $assertion->rule[0][0][0]) { + $rule = substr($assertion->rule[0][0], 1); + } else { + $rule = '!' . $assertion->rule[0][0]; + } + $assertion_var_id = str_replace($var_id, $arg_var_id, $assertion->var_id); + + $if_types[$assertion_var_id] = [[$rule]]; + } elseif (!$expr instanceof PhpParser\Node\Expr\FuncCall) { + $var_id = $assertion->var_id; + if (strpos($var_id, 'self::') === 0) { + $var_id = $this_class_name.'::'.substr($var_id, 6); + } + $if_types[$var_id] = [['!'.$assertion->rule[0][0]]]; + } else { + IssueBuffer::maybeAdd( + new InvalidDocblock( + sprintf('Assertion of variable "%s" cannot be recognized', $assertion->var_id), + new CodeLocation($source, $expr) + ) + ); + } + } + + if ($if_types) { + $anded_types[] = $if_types; + } + } + } + + return $anded_types; + } + + /** + * @return list + */ + protected static function getInstanceOfTypes( + PhpParser\Node\Expr\Instanceof_ $stmt, + ?string $this_class_name, + FileSource $source + ): array { + if ($stmt->class instanceof PhpParser\Node\Name) { + if (!in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true)) { + $instanceof_class = ClassLikeAnalyzer::getFQCLNFromNameObject( + $stmt->class, + $source->getAliases() + ); + + if ($source instanceof StatementsAnalyzer) { + $codebase = $source->getCodebase(); + $instanceof_class = $codebase->classlikes->getUnAliasedName($instanceof_class); + } + + return [$instanceof_class]; + } + + if ($this_class_name + && (in_array(strtolower($stmt->class->parts[0]), ['self', 'static'], true))) { + if ($stmt->class->parts[0] === 'static') { + return ['=' . $this_class_name . '&static']; + } + + return [$this_class_name]; + } + } elseif ($source instanceof StatementsAnalyzer) { + $stmt_class_type = $source->node_data->getType($stmt->class); + + if ($stmt_class_type) { + $literal_class_strings = []; + + foreach ($stmt_class_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TLiteralClassString) { + $literal_class_strings[] = $atomic_type->value; + } elseif ($atomic_type instanceof TTemplateParamClass) { + $literal_class_strings[] = $atomic_type->param_name; + } elseif ($atomic_type instanceof TClassString && $atomic_type->as !== 'object') { + $literal_class_strings[] = $atomic_type->as; + } + } + + return $literal_class_strings; + } + } + + return []; + } + + /** + * @param Identical|Equal|NotIdentical|NotEqual $conditional + */ + protected static function hasNullVariable( + PhpParser\Node\Expr\BinaryOp $conditional, + FileSource $source + ): ?int { + if ($conditional->right instanceof PhpParser\Node\Expr\ConstFetch + && strtolower($conditional->right->name->parts[0]) === 'null' + ) { + return self::ASSIGNMENT_TO_RIGHT; + } + + if ($conditional->left instanceof PhpParser\Node\Expr\ConstFetch + && strtolower($conditional->left->name->parts[0]) === 'null' + ) { + return self::ASSIGNMENT_TO_LEFT; + } + + if ($source instanceof StatementsAnalyzer + && ($right_type = $source->node_data->getType($conditional->right)) + && $right_type->isNull() + ) { + return self::ASSIGNMENT_TO_RIGHT; + } + + return null; + } + + /** + * @param Identical|Equal|NotIdentical|NotEqual $conditional + */ + public static function hasFalseVariable( + PhpParser\Node\Expr\BinaryOp $conditional + ): ?int { + if ($conditional->right instanceof PhpParser\Node\Expr\ConstFetch + && strtolower($conditional->right->name->parts[0]) === 'false' + ) { + return self::ASSIGNMENT_TO_RIGHT; + } + + if ($conditional->left instanceof PhpParser\Node\Expr\ConstFetch + && strtolower($conditional->left->name->parts[0]) === 'false' + ) { + return self::ASSIGNMENT_TO_LEFT; + } + + return null; + } + + /** + * @param Identical|Equal|NotIdentical|NotEqual $conditional + */ + public static function hasTrueVariable( + PhpParser\Node\Expr\BinaryOp $conditional + ): ?int { + if ($conditional->right instanceof PhpParser\Node\Expr\ConstFetch + && strtolower($conditional->right->name->parts[0]) === 'true' + ) { + return self::ASSIGNMENT_TO_RIGHT; + } + + if ($conditional->left instanceof PhpParser\Node\Expr\ConstFetch + && strtolower($conditional->left->name->parts[0]) === 'true' + ) { + return self::ASSIGNMENT_TO_LEFT; + } + + return null; + } + + /** + * @param Identical|Equal|NotIdentical|NotEqual $conditional + */ + protected static function hasEmptyArrayVariable( + PhpParser\Node\Expr\BinaryOp $conditional + ): ?int { + if ($conditional->right instanceof PhpParser\Node\Expr\Array_ + && !$conditional->right->items + ) { + return self::ASSIGNMENT_TO_RIGHT; + } + + if ($conditional->left instanceof PhpParser\Node\Expr\Array_ + && !$conditional->left->items + ) { + return self::ASSIGNMENT_TO_LEFT; + } + + return null; + } + + /** + * @param Identical|Equal|NotIdentical|NotEqual $conditional + * @return false|int + */ + protected static function hasGetTypeCheck( + PhpParser\Node\Expr\BinaryOp $conditional + ) { + if ($conditional->right instanceof PhpParser\Node\Expr\FuncCall + && $conditional->right->name instanceof PhpParser\Node\Name + && strtolower($conditional->right->name->parts[0]) === 'gettype' + && $conditional->right->getArgs() + && $conditional->left instanceof PhpParser\Node\Scalar\String_ + ) { + return self::ASSIGNMENT_TO_RIGHT; + } + + if ($conditional->left instanceof PhpParser\Node\Expr\FuncCall + && $conditional->left->name instanceof PhpParser\Node\Name + && strtolower($conditional->left->name->parts[0]) === 'gettype' + && $conditional->left->getArgs() + && $conditional->right instanceof PhpParser\Node\Scalar\String_ + ) { + return self::ASSIGNMENT_TO_LEFT; + } + + return false; + } + + /** + * @param Identical|Equal|NotIdentical|NotEqual $conditional + * @return false|int + */ + protected static function hasGetDebugTypeCheck( + PhpParser\Node\Expr\BinaryOp $conditional + ) { + if ($conditional->right instanceof PhpParser\Node\Expr\FuncCall + && $conditional->right->name instanceof PhpParser\Node\Name + && strtolower($conditional->right->name->parts[0]) === 'get_debug_type' + && $conditional->right->getArgs() + && ($conditional->left instanceof PhpParser\Node\Scalar\String_ + || $conditional->left instanceof PhpParser\Node\Expr\ClassConstFetch) + ) { + return self::ASSIGNMENT_TO_RIGHT; + } + + if ($conditional->left instanceof PhpParser\Node\Expr\FuncCall + && $conditional->left->name instanceof PhpParser\Node\Name + && strtolower($conditional->left->name->parts[0]) === 'get_debug_type' + && $conditional->left->getArgs() + && ($conditional->right instanceof PhpParser\Node\Scalar\String_ + || $conditional->right instanceof PhpParser\Node\Expr\ClassConstFetch) + ) { + return self::ASSIGNMENT_TO_LEFT; + } + + return false; + } + + /** + * @param Identical|Equal|NotIdentical|NotEqual $conditional + * @return false|int + */ + protected static function hasGetClassCheck( + PhpParser\Node\Expr\BinaryOp $conditional, + FileSource $source + ) { + if (!$source instanceof StatementsAnalyzer) { + return false; + } + + $right_get_class = $conditional->right instanceof PhpParser\Node\Expr\FuncCall + && $conditional->right->name instanceof PhpParser\Node\Name + && strtolower($conditional->right->name->parts[0]) === 'get_class'; + + $right_static_class = $conditional->right instanceof PhpParser\Node\Expr\ClassConstFetch + && $conditional->right->class instanceof PhpParser\Node\Name + && $conditional->right->class->parts === ['static'] + && $conditional->right->name instanceof PhpParser\Node\Identifier + && strtolower($conditional->right->name->name) === 'class'; + + $right_variable_class_const = $conditional->right instanceof PhpParser\Node\Expr\ClassConstFetch + && $conditional->right->class instanceof PhpParser\Node\Expr\Variable + && $conditional->right->name instanceof PhpParser\Node\Identifier + && strtolower($conditional->right->name->name) === 'class'; + + $left_class_string = $conditional->left instanceof PhpParser\Node\Expr\ClassConstFetch + && $conditional->left->class instanceof PhpParser\Node\Name + && $conditional->left->name instanceof PhpParser\Node\Identifier + && strtolower($conditional->left->name->name) === 'class'; + + $left_type = $source->node_data->getType($conditional->left); + + $left_class_string_t = false; + + if ($left_type && $left_type->isSingle()) { + foreach ($left_type->getAtomicTypes() as $type_part) { + if ($type_part instanceof TClassString) { + $left_class_string_t = true; + break; + } + } + } + + if (($right_get_class || $right_static_class || $right_variable_class_const) + && ($left_class_string || $left_class_string_t) + ) { + return self::ASSIGNMENT_TO_RIGHT; + } + + $left_get_class = $conditional->left instanceof PhpParser\Node\Expr\FuncCall + && $conditional->left->name instanceof PhpParser\Node\Name + && strtolower($conditional->left->name->parts[0]) === 'get_class'; + + $left_static_class = $conditional->left instanceof PhpParser\Node\Expr\ClassConstFetch + && $conditional->left->class instanceof PhpParser\Node\Name + && $conditional->left->class->parts === ['static'] + && $conditional->left->name instanceof PhpParser\Node\Identifier + && strtolower($conditional->left->name->name) === 'class'; + + $left_variable_class_const = $conditional->left instanceof PhpParser\Node\Expr\ClassConstFetch + && $conditional->left->class instanceof PhpParser\Node\Expr\Variable + && $conditional->left->name instanceof PhpParser\Node\Identifier + && strtolower($conditional->left->name->name) === 'class'; + + $right_class_string = $conditional->right instanceof PhpParser\Node\Expr\ClassConstFetch + && $conditional->right->class instanceof PhpParser\Node\Name + && $conditional->right->name instanceof PhpParser\Node\Identifier + && strtolower($conditional->right->name->name) === 'class'; + + $right_type = $source->node_data->getType($conditional->right); + + $right_class_string_t = false; + + if ($right_type && $right_type->isSingle()) { + foreach ($right_type->getAtomicTypes() as $type_part) { + if ($type_part instanceof TClassString) { + $right_class_string_t = true; + break; + } + } + } + + if (($left_get_class || $left_static_class || $left_variable_class_const) + && ($right_class_string || $right_class_string_t) + ) { + return self::ASSIGNMENT_TO_LEFT; + } + + return false; + } + + /** + * @param Greater|GreaterOrEqual|Smaller|SmallerOrEqual $conditional + * @return false|int + */ + protected static function hasNonEmptyCountEqualityCheck( + PhpParser\Node\Expr\BinaryOp $conditional, + ?int &$min_count + ) { + if ($conditional->left instanceof PhpParser\Node\Expr\FuncCall + && $conditional->left->name instanceof PhpParser\Node\Name + && strtolower($conditional->left->name->parts[0]) === 'count' + && $conditional->left->getArgs() + && ($conditional instanceof BinaryOp\Greater || $conditional instanceof BinaryOp\GreaterOrEqual) + ) { + $assignment_to = self::ASSIGNMENT_TO_RIGHT; + $compare_to = $conditional->right; + $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' + && $conditional->right->getArgs() + && ($conditional instanceof BinaryOp\Smaller || $conditional instanceof BinaryOp\SmallerOrEqual) + ) { + $assignment_to = self::ASSIGNMENT_TO_LEFT; + $compare_to = $conditional->left; + $comparison_adjustment = $conditional instanceof BinaryOp\Smaller ? 1 : 0; + } else { + return false; + } + + // TODO get node type provider here somehow and check literal ints and int ranges + if ($compare_to instanceof PhpParser\Node\Scalar\LNumber + && $compare_to->value > (-1 * $comparison_adjustment) + ) { + $min_count = $compare_to->value + $comparison_adjustment; + + return $assignment_to; + } + + return false; + } + + /** + * @param Greater|GreaterOrEqual|Smaller|SmallerOrEqual $conditional + * @return false|int + */ + protected static function hasLessThanCountEqualityCheck( + PhpParser\Node\Expr\BinaryOp $conditional, + ?int &$max_count + ) { + $left_count = $conditional->left instanceof PhpParser\Node\Expr\FuncCall + && $conditional->left->name instanceof PhpParser\Node\Name + && strtolower($conditional->left->name->parts[0]) === 'count' + && $conditional->left->getArgs(); + + $operator_less_than_or_equal = + $conditional instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual + || $conditional instanceof PhpParser\Node\Expr\BinaryOp\Smaller; + + if ($left_count + && $operator_less_than_or_equal + && $conditional->right instanceof PhpParser\Node\Scalar\LNumber + ) { + $max_count = $conditional->right->value - + ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Smaller ? 1 : 0); + + return self::ASSIGNMENT_TO_RIGHT; + } + + $right_count = $conditional->right instanceof PhpParser\Node\Expr\FuncCall + && $conditional->right->name instanceof PhpParser\Node\Name + && strtolower($conditional->right->name->parts[0]) === 'count' + && $conditional->right->getArgs(); + + $operator_greater_than_or_equal = + $conditional instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual + || $conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater; + + if ($right_count + && $operator_greater_than_or_equal + && $conditional->left instanceof PhpParser\Node\Scalar\LNumber + ) { + $max_count = $conditional->left->value - + ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater ? 1 : 0); + + return self::ASSIGNMENT_TO_LEFT; + } + + return false; + } + + /** + * @param Equal|Identical|NotEqual|NotIdentical $conditional + * @return false|int + */ + protected static function hasCountEqualityCheck( + PhpParser\Node\Expr\BinaryOp $conditional, + ?int &$count + ) { + $left_count = $conditional->left instanceof PhpParser\Node\Expr\FuncCall + && $conditional->left->name instanceof PhpParser\Node\Name + && strtolower($conditional->left->name->parts[0]) === 'count' + && $conditional->left->getArgs(); + + if ($left_count && $conditional->right instanceof PhpParser\Node\Scalar\LNumber) { + $count = $conditional->right->value; + + return self::ASSIGNMENT_TO_RIGHT; + } + + $right_count = $conditional->right instanceof PhpParser\Node\Expr\FuncCall + && $conditional->right->name instanceof PhpParser\Node\Name + && strtolower($conditional->right->name->parts[0]) === 'count' + && $conditional->right->getArgs(); + + if ($right_count && $conditional->left instanceof PhpParser\Node\Scalar\LNumber) { + $count = $conditional->left->value; + + return self::ASSIGNMENT_TO_LEFT; + } + + return false; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Greater|PhpParser\Node\Expr\BinaryOp\GreaterOrEqual $conditional + * @return false|int + */ + protected static function hasSuperiorNumberCheck( + FileSource $source, + PhpParser\Node\Expr\BinaryOp $conditional, + ?int &$literal_value_comparison, + bool &$isset_assert + ) { + $right_assignment = false; + $value_right = null; + if ($source instanceof StatementsAnalyzer + && ($type = $source->node_data->getType($conditional->right)) + && $type->isSingleIntLiteral() + ) { + $right_assignment = true; + $value_right = $type->getSingleIntLiteral()->value; + } elseif ($conditional->right instanceof LNumber) { + $right_assignment = true; + $value_right = $conditional->right->value; + } elseif ($conditional->right instanceof UnaryMinus && $conditional->right->expr instanceof LNumber) { + $right_assignment = true; + $value_right = -$conditional->right->expr->value; + } elseif ($conditional->right instanceof UnaryPlus && $conditional->right->expr instanceof LNumber) { + $right_assignment = true; + $value_right = $conditional->right->expr->value; + } + if ($right_assignment === true && $value_right !== null) { + $isset_assert = $value_right === 0 && $conditional instanceof Greater; + + $literal_value_comparison = $value_right + + ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater ? 1 : 0); + + return self::ASSIGNMENT_TO_RIGHT; + } + + $left_assignment = false; + $value_left = null; + if ($source instanceof StatementsAnalyzer + && ($type = $source->node_data->getType($conditional->left)) + && $type->isSingleIntLiteral() + ) { + $left_assignment = true; + $value_left = $type->getSingleIntLiteral()->value; + } elseif ($conditional->left instanceof LNumber) { + $left_assignment = true; + $value_left = $conditional->left->value; + } elseif ($conditional->left instanceof UnaryMinus && $conditional->left->expr instanceof LNumber) { + $left_assignment = true; + $value_left = -$conditional->left->expr->value; + } elseif ($conditional->left instanceof UnaryPlus && $conditional->left->expr instanceof LNumber) { + $left_assignment = true; + $value_left = $conditional->left->expr->value; + } + if ($left_assignment === true && $value_left !== null) { + $isset_assert = $value_left === 0 && $conditional instanceof Greater; + + $literal_value_comparison = $value_left + + ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater ? -1 : 0); + + return self::ASSIGNMENT_TO_LEFT; + } + + return false; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Smaller|PhpParser\Node\Expr\BinaryOp\SmallerOrEqual $conditional + * @return false|int + */ + protected static function hasInferiorNumberCheck( + FileSource $source, + PhpParser\Node\Expr\BinaryOp $conditional, + ?int &$literal_value_comparison, + bool &$isset_assert + ) { + $right_assignment = false; + $value_right = null; + if ($source instanceof StatementsAnalyzer + && ($type = $source->node_data->getType($conditional->right)) + && $type->isSingleIntLiteral() + ) { + $right_assignment = true; + $value_right = $type->getSingleIntLiteral()->value; + } elseif ($conditional->right instanceof LNumber) { + $right_assignment = true; + $value_right = $conditional->right->value; + } elseif ($conditional->right instanceof UnaryMinus && $conditional->right->expr instanceof LNumber) { + $right_assignment = true; + $value_right = -$conditional->right->expr->value; + } elseif ($conditional->right instanceof UnaryPlus && $conditional->right->expr instanceof LNumber) { + $right_assignment = true; + $value_right = $conditional->right->expr->value; + } + if ($right_assignment === true && $value_right !== null) { + $isset_assert = $value_right === 0 && $conditional instanceof Smaller; + + $literal_value_comparison = $value_right + + ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Smaller ? -1 : 0); + return self::ASSIGNMENT_TO_RIGHT; + } + + $left_assignment = false; + $value_left = null; + if ($source instanceof StatementsAnalyzer + && ($type = $source->node_data->getType($conditional->left)) + && $type->isSingleIntLiteral() + ) { + $left_assignment = true; + $value_left = $type->getSingleIntLiteral()->value; + } elseif ($conditional->left instanceof LNumber) { + $left_assignment = true; + $value_left = $conditional->left->value; + } elseif ($conditional->left instanceof UnaryMinus && $conditional->left->expr instanceof LNumber) { + $left_assignment = true; + $value_left = -$conditional->left->expr->value; + } elseif ($conditional->left instanceof UnaryPlus && $conditional->left->expr instanceof LNumber) { + $left_assignment = true; + $value_left = $conditional->left->expr->value; + } + if ($left_assignment === true && $value_left !== null) { + $isset_assert = $value_left === 0 && $conditional instanceof Smaller; + + $literal_value_comparison = $value_left + + ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Smaller ? 1 : 0); + + return self::ASSIGNMENT_TO_LEFT; + } + + return false; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Greater|PhpParser\Node\Expr\BinaryOp\GreaterOrEqual $conditional + * @return false|int + */ + protected static function hasReconcilableNonEmptyCountEqualityCheck( + PhpParser\Node\Expr\BinaryOp $conditional + ) { + $left_count = $conditional->left instanceof PhpParser\Node\Expr\FuncCall + && $conditional->left->name instanceof PhpParser\Node\Name + && strtolower($conditional->left->name->parts[0]) === 'count'; + + $right_number = $conditional->right instanceof PhpParser\Node\Scalar\LNumber + && $conditional->right->value === ( + $conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater ? 0 : 1); + + if ($left_count && $right_number) { + return self::ASSIGNMENT_TO_RIGHT; + } + + return false; + } + + /** + * @param Identical|Equal|Smaller|SmallerOrEqual|NotIdentical|NotEqual $conditional + * @return false|int + */ + protected static function hasTypedValueComparison( + PhpParser\Node\Expr\BinaryOp $conditional, + FileSource $source + ) { + if (!$source instanceof StatementsAnalyzer) { + return false; + } + + if (($right_type = $source->node_data->getType($conditional->right)) + && ((!$conditional->right instanceof PhpParser\Node\Expr\Variable + && !$conditional->right instanceof PhpParser\Node\Expr\PropertyFetch + && !$conditional->right instanceof PhpParser\Node\Expr\StaticPropertyFetch) + || $conditional->left instanceof PhpParser\Node\Expr\Variable + || $conditional->left instanceof PhpParser\Node\Expr\PropertyFetch + || $conditional->left instanceof PhpParser\Node\Expr\StaticPropertyFetch) + && count($right_type->getAtomicTypes()) === 1 + && !$right_type->hasMixed() + ) { + return self::ASSIGNMENT_TO_RIGHT; + } + + if (($left_type = $source->node_data->getType($conditional->left)) + && !$conditional->left instanceof PhpParser\Node\Expr\Variable + && !$conditional->left instanceof PhpParser\Node\Expr\PropertyFetch + && !$conditional->left instanceof PhpParser\Node\Expr\StaticPropertyFetch + && count($left_type->getAtomicTypes()) === 1 + && !$left_type->hasMixed() + ) { + return self::ASSIGNMENT_TO_LEFT; + } + + return false; + } + + protected static function hasIsACheck( + PhpParser\Node\Expr\FuncCall $stmt, + StatementsAnalyzer $source + ): bool { + if ($stmt->name instanceof PhpParser\Node\Name + && (strtolower($stmt->name->parts[0]) === 'is_a' + || strtolower($stmt->name->parts[0]) === 'is_subclass_of') + && isset($stmt->getArgs()[1]) + ) { + $second_arg = $stmt->getArgs()[1]->value; + + if ($second_arg instanceof PhpParser\Node\Scalar\String_ + || ( + $second_arg instanceof PhpParser\Node\Expr\ClassConstFetch + && $second_arg->class instanceof PhpParser\Node\Name + && $second_arg->name instanceof PhpParser\Node\Identifier + && strtolower($second_arg->name->name) === 'class' + ) + || (($second_arg_type = $source->node_data->getType($second_arg)) + && $second_arg_type->hasString()) + ) { + return true; + } + } + + return false; + } + + /** + * @return array>> + */ + private static function handleIsTypeCheck( + ?Codebase $codebase, + FileSource $source, + PhpParser\Node\Expr\FuncCall $stmt, + ?string $first_var_name, + ?Union $first_var_type, + PhpParser\Node\Expr\FuncCall $expr, + bool $negate + ): array { + $if_types = []; + if ($stmt->name instanceof PhpParser\Node\Name + && ($function_name = strtolower($stmt->name->parts[0])) + && isset(self::IS_TYPE_CHECKS[$function_name]) + && $source instanceof StatementsAnalyzer + && ($source->getNamespace() === null //either the namespace is null + || $stmt->name instanceof PhpParser\Node\Name\FullyQualified //or we have a FQ to base function + || isset($source->getAliases()->functions[$function_name]) //or it is imported + || ($codebase && !$codebase->functions->functionExists( + $source, + strtolower($source->getNamespace()."\\".$function_name) + )) //or this function name does not exist in current namespace + ) + ) { + if ($first_var_name) { + $if_types[$first_var_name] = [[self::IS_TYPE_CHECKS[$function_name][0]]]; + } elseif ($first_var_type + && $codebase + ) { + if (isset(self::IS_TYPE_CHECKS[$function_name][1])) { + $callable = self::IS_TYPE_CHECKS[$function_name][1]; + assert(is_callable($callable)); + $type = $callable(); + assert($type instanceof Union); + self::processIrreconcilableFunctionCall( + $first_var_type, + $type, + $expr, + $source, + $codebase, + $negate + ); + } + } + } + + return $if_types; + } + + protected static function hasCallableCheck(PhpParser\Node\Expr\FuncCall $stmt): bool + { + return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'is_callable'; + } + + /** + * @return Reconciler::RECONCILIATION_* + */ + protected static function hasClassExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): int + { + if ($stmt->name instanceof PhpParser\Node\Name + && strtolower($stmt->name->parts[0]) === 'class_exists' + ) { + if (!isset($stmt->getArgs()[1])) { + return 2; + } + + $second_arg = $stmt->getArgs()[1]->value; + + if ($second_arg instanceof PhpParser\Node\Expr\ConstFetch + && strtolower($second_arg->name->parts[0]) === 'true' + ) { + return 2; + } + + return 1; + } + + return 0; + } + + /** + * @return 0|1|2 + */ + protected static function hasTraitExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): int + { + if ($stmt->name instanceof PhpParser\Node\Name + && strtolower($stmt->name->parts[0]) === 'trait_exists' + ) { + if (!isset($stmt->getArgs()[1])) { + return 2; + } + + $second_arg = $stmt->getArgs()[1]->value; + + if ($second_arg instanceof PhpParser\Node\Expr\ConstFetch + && strtolower($second_arg->name->parts[0]) === 'true' + ) { + return 2; + } + + return 1; + } + + return 0; + } + + protected static function hasInterfaceExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): bool + { + return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'interface_exists'; + } + + protected static function hasFunctionExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): bool + { + return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'function_exists'; + } + + protected static function hasInArrayCheck(PhpParser\Node\Expr\FuncCall $stmt): bool + { + if ($stmt->name instanceof PhpParser\Node\Name + && strtolower($stmt->name->parts[0]) === 'in_array' + && isset($stmt->getArgs()[2]) + ) { + $second_arg = $stmt->getArgs()[2]->value; + + if ($second_arg instanceof PhpParser\Node\Expr\ConstFetch + && strtolower($second_arg->name->parts[0]) === 'true' + ) { + return true; + } + } + + return false; + } + + protected static function hasNonEmptyCountCheck(PhpParser\Node\Expr\FuncCall $stmt): bool + { + return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'count'; + } + + protected static function hasArrayKeyExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): bool + { + return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'array_key_exists'; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional + * @return list>>> + */ + private static function getNullInequalityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + FileSource $source, + ?string $this_class_name, + ?Codebase $codebase, + int $null_position + ): array { + $if_types = []; + + if ($null_position === self::ASSIGNMENT_TO_RIGHT) { + $base_conditional = $conditional->left; + } elseif ($null_position === self::ASSIGNMENT_TO_LEFT) { + $base_conditional = $conditional->right; + } else { + throw new UnexpectedValueException('Bad null variable position'); + } + + $var_name = ExpressionIdentifier::getArrayVarId( + $base_conditional, + $this_class_name, + $source + ); + + if ($var_name) { + if ($base_conditional instanceof PhpParser\Node\Expr\Assign) { + $var_name = '=' . $var_name; + } + + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { + $if_types[$var_name] = [['!null']]; + } else { + $if_types[$var_name] = [['!falsy']]; + } + } + + if ($codebase + && $source instanceof StatementsAnalyzer + && ($var_type = $source->node_data->getType($base_conditional)) + ) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { + $null_type = Type::getNull(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $var_type, + $null_type + ) && !UnionTypeComparator::isContainedBy( + $codebase, + $null_type, + $var_type + )) { + if ($var_type->from_docblock) { + IssueBuffer::maybeAdd( + new RedundantConditionGivenDocblockType( + 'Docblock-defined type ' . $var_type . ' can never contain null', + new CodeLocation($source, $conditional), + $var_type->getId() . ' null' + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RedundantCondition( + $var_type . ' can never contain null', + new CodeLocation($source, $conditional), + $var_type->getId() . ' null' + ), + $source->getSuppressedIssues() + ); + } + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional + * @return list>>> + */ + private static function getFalseInequalityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + bool $cache, + ?string $this_class_name, + FileSource $source, + bool $inside_conditional, + ?Codebase $codebase, + int $false_position + ): array { + $if_types = []; + + if ($false_position === self::ASSIGNMENT_TO_RIGHT) { + $base_conditional = $conditional->left; + } elseif ($false_position === self::ASSIGNMENT_TO_LEFT) { + $base_conditional = $conditional->right; + } else { + throw new UnexpectedValueException('Bad false variable position'); + } + + $var_name = ExpressionIdentifier::getArrayVarId( + $base_conditional, + $this_class_name, + $source + ); + + if ($var_name) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { + $if_types[$var_name] = [['!false']]; + } else { + $if_types[$var_name] = [['!falsy']]; + } + + $if_types = [$if_types]; + } else { + $if_types = null; + + if ($source instanceof StatementsAnalyzer && $cache) { + $if_types = $source->node_data->getAssertions($base_conditional); + } + + if ($if_types === null) { + $if_types = self::scrapeAssertions( + $base_conditional, + $this_class_name, + $source, + $codebase, + false, + $cache, + $inside_conditional + ); + + if ($source instanceof StatementsAnalyzer && $cache) { + $source->node_data->setAssertions($base_conditional, $if_types); + } + } + } + + if ($codebase + && $source instanceof StatementsAnalyzer + && ($var_type = $source->node_data->getType($base_conditional)) + && $conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical + ) { + $config = $source->getCodebase()->config; + + if ($config->strict_binary_operands + && $var_type->isSingle() + && $var_type->hasBool() + && !$var_type->from_docblock + ) { + IssueBuffer::maybeAdd( + new RedundantIdentityWithTrue( + 'The "!== false" part of this comparison is redundant', + new CodeLocation($source, $conditional) + ), + $source->getSuppressedIssues() + ); + } + + $false_type = Type::getFalse(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $var_type, + $false_type + ) && !UnionTypeComparator::isContainedBy( + $codebase, + $false_type, + $var_type + )) { + if ($var_type->from_docblock) { + IssueBuffer::maybeAdd( + new RedundantConditionGivenDocblockType( + 'Docblock-defined type ' . $var_type . ' can never contain false', + new CodeLocation($source, $conditional), + $var_type->getId() . ' false' + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RedundantCondition( + $var_type . ' can never contain false', + new CodeLocation($source, $conditional), + $var_type->getId() . ' false' + ), + $source->getSuppressedIssues() + ); + } + } + } + + return $if_types; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional + * @return list>>> + */ + private static function getTrueInequalityAssertions( + int $true_position, + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase, + bool $cache, + bool $inside_conditional + ): array { + $if_types = []; + + if ($true_position === self::ASSIGNMENT_TO_RIGHT) { + $base_conditional = $conditional->left; + } elseif ($true_position === self::ASSIGNMENT_TO_LEFT) { + $base_conditional = $conditional->right; + } else { + throw new UnexpectedValueException('Bad null variable position'); + } + + if ($base_conditional instanceof PhpParser\Node\Expr\FuncCall) { + $notif_types = self::processFunctionCall( + $base_conditional, + $this_class_name, + $source, + $codebase, + true + ); + } else { + $var_name = ExpressionIdentifier::getArrayVarId( + $base_conditional, + $this_class_name, + $source + ); + + if ($var_name) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { + $if_types[$var_name] = [['!true']]; + } else { + $if_types[$var_name] = [['falsy']]; + } + + $notif_types = []; + } else { + $notif_types = null; + + if ($source instanceof StatementsAnalyzer && $cache) { + $notif_types = $source->node_data->getAssertions($base_conditional); + } + + if ($notif_types === null) { + $notif_types = self::scrapeAssertions( + $base_conditional, + $this_class_name, + $source, + $codebase, + false, + $cache, + $inside_conditional + ); + + if ($source instanceof StatementsAnalyzer && $cache) { + $source->node_data->setAssertions($base_conditional, $notif_types); + } + } + } + } + + if (count($notif_types) === 1) { + $notif_types = $notif_types[0]; + + if (count($notif_types) === 1) { + $if_types = Algebra::negateTypes($notif_types); + } + } + + $if_types = $if_types ? [$if_types] : []; + + if ($codebase + && $source instanceof StatementsAnalyzer + && ($var_type = $source->node_data->getType($base_conditional)) + ) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { + $true_type = Type::getTrue(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $var_type, + $true_type + ) && !UnionTypeComparator::isContainedBy( + $codebase, + $true_type, + $var_type + )) { + if ($var_type->from_docblock) { + IssueBuffer::maybeAdd( + new RedundantConditionGivenDocblockType( + 'Docblock-defined type ' . $var_type . ' can never contain true', + new CodeLocation($source, $conditional), + $var_type->getId() . ' true' + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RedundantCondition( + $var_type . ' can never contain ' . $true_type, + new CodeLocation($source, $conditional), + $var_type->getId() . ' true' + ), + $source->getSuppressedIssues() + ); + } + } + } + } + + return $if_types; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional + * @return list>>> + */ + private static function getEmptyInequalityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase, + int $empty_array_position + ): array { + $if_types = []; + + if ($empty_array_position === self::ASSIGNMENT_TO_RIGHT) { + $base_conditional = $conditional->left; + } elseif ($empty_array_position === self::ASSIGNMENT_TO_LEFT) { + $base_conditional = $conditional->right; + } else { + throw new UnexpectedValueException('Bad empty array variable position'); + } + + $var_name = ExpressionIdentifier::getArrayVarId( + $base_conditional, + $this_class_name, + $source + ); + + if ($var_name) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { + $if_types[$var_name] = [['non-empty-countable']]; + } else { + $if_types[$var_name] = [['!falsy']]; + } + } + + if ($codebase + && $source instanceof StatementsAnalyzer + && ($var_type = $source->node_data->getType($base_conditional)) + ) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { + $empty_array_type = Type::getEmptyArray(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $var_type, + $empty_array_type + ) && !UnionTypeComparator::isContainedBy( + $codebase, + $empty_array_type, + $var_type + )) { + if ($var_type->from_docblock) { + IssueBuffer::maybeAdd( + new RedundantConditionGivenDocblockType( + 'Docblock-defined type ' . $var_type->getId() . ' can never contain null', + new CodeLocation($source, $conditional), + $var_type->getId() . ' null' + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RedundantCondition( + $var_type->getId() . ' can never contain null', + new CodeLocation($source, $conditional), + $var_type->getId() . ' null' + ), + $source->getSuppressedIssues() + ); + } + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional + * @return list>>> + */ + private static function getGettypeInequalityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + int $gettype_position + ): array { + $if_types = []; + + if ($gettype_position === self::ASSIGNMENT_TO_RIGHT) { + $whichclass_expr = $conditional->left; + $gettype_expr = $conditional->right; + } elseif ($gettype_position === self::ASSIGNMENT_TO_LEFT) { + $whichclass_expr = $conditional->right; + $gettype_expr = $conditional->left; + } else { + throw new UnexpectedValueException('$gettype_position value'); + } + + /** @var PhpParser\Node\Expr\FuncCall $gettype_expr */ + $var_name = ExpressionIdentifier::getArrayVarId( + $gettype_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + + if ($whichclass_expr instanceof PhpParser\Node\Scalar\String_) { + $var_type = $whichclass_expr->value; + } elseif ($whichclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch + && $whichclass_expr->class instanceof PhpParser\Node\Name + ) { + $var_type = ClassLikeAnalyzer::getFQCLNFromNameObject( + $whichclass_expr->class, + $source->getAliases() + ); + } else { + throw new UnexpectedValueException('Shouldn’t get here'); + } + + if (!isset(ClassLikeAnalyzer::GETTYPE_TYPES[$var_type])) { + IssueBuffer::maybeAdd( + new UnevaluatedCode( + 'gettype cannot return this value', + new CodeLocation($source, $whichclass_expr) + ) + ); + } else { + if ($var_name && $var_type) { + if ($var_type === 'class@anonymous') { + $if_types[$var_name] = [['!=object']]; + } elseif ($var_type === 'resource (closed)') { + $if_types[$var_name] = [['!closed-resource']]; + } elseif (strpos($var_type, 'resource (') === 0) { + $if_types[$var_name] = [['!=resource']]; + } else { + $if_types[$var_name] = [['!' . $var_type]]; + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional + * @return list>>> + */ + private static function getGetdebugTypeInequalityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + int $get_debug_type_position + ): array { + $if_types = []; + + if ($get_debug_type_position === self::ASSIGNMENT_TO_RIGHT) { + $whichclass_expr = $conditional->left; + $get_debug_type_expr = $conditional->right; + } elseif ($get_debug_type_position === self::ASSIGNMENT_TO_LEFT) { + $whichclass_expr = $conditional->right; + $get_debug_type_expr = $conditional->left; + } else { + throw new UnexpectedValueException('$gettype_position value'); + } + + /** @var PhpParser\Node\Expr\FuncCall $get_debug_type_expr */ + $var_name = ExpressionIdentifier::getArrayVarId( + $get_debug_type_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + + if ($whichclass_expr instanceof PhpParser\Node\Scalar\String_) { + $var_type = $whichclass_expr->value; + } elseif ($whichclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch + && $whichclass_expr->class instanceof PhpParser\Node\Name + ) { + $var_type = ClassLikeAnalyzer::getFQCLNFromNameObject( + $whichclass_expr->class, + $source->getAliases() + ); + } else { + throw new UnexpectedValueException('Shouldn’t get here'); + } + + if ($var_name && $var_type) { + if ($var_type === 'class@anonymous') { + $if_types[$var_name] = [['!=object']]; + } elseif ($var_type === 'resource (closed)') { + $if_types[$var_name] = [['!closed-resource']]; + } elseif (strpos($var_type, 'resource (') === 0) { + $if_types[$var_name] = [['!=resource']]; + } else { + $if_types[$var_name] = [['!' . $var_type]]; + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional + * @return list>>> + */ + private static function getGetclassInequalityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + StatementsAnalyzer $source, + int $getclass_position + ): array { + $if_types = []; + + if ($getclass_position === self::ASSIGNMENT_TO_RIGHT) { + $whichclass_expr = $conditional->left; + $getclass_expr = $conditional->right; + } elseif ($getclass_position === self::ASSIGNMENT_TO_LEFT) { + $whichclass_expr = $conditional->right; + $getclass_expr = $conditional->left; + } else { + throw new UnexpectedValueException('$getclass_position value'); + } + + if ($getclass_expr instanceof PhpParser\Node\Expr\FuncCall) { + $var_name = ExpressionIdentifier::getArrayVarId( + $getclass_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + } elseif ($getclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch + && $getclass_expr->class instanceof PhpParser\Node\Expr + ) { + $var_name = ExpressionIdentifier::getArrayVarId( + $getclass_expr->class, + $this_class_name, + $source + ); + } else { + $var_name = '$this'; + } + + if ($whichclass_expr instanceof PhpParser\Node\Scalar\String_) { + $var_type = $whichclass_expr->value; + } elseif ($whichclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch + && $whichclass_expr->class instanceof PhpParser\Node\Name + ) { + $var_type = ClassLikeAnalyzer::getFQCLNFromNameObject( + $whichclass_expr->class, + $source->getAliases() + ); + + if ($var_type === 'self' || $var_type === 'static') { + $var_type = $this_class_name; + } elseif ($var_type === 'parent') { + $var_type = null; + } + } else { + $type = $source->node_data->getType($whichclass_expr); + + if ($type && $var_name) { + foreach ($type->getAtomicTypes() as $type_part) { + if ($type_part instanceof TTemplateParamClass) { + $if_types[$var_name] = [['!=' . $type_part->param_name]]; + } + } + } + + return $if_types ? [$if_types] : []; + } + + if ($var_type + && ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $source, + $var_type, + new CodeLocation($source, $whichclass_expr), + null, + null, + $source->getSuppressedIssues() + ) === false + ) { + // fall through + } else { + if ($var_name && $var_type) { + $if_types[$var_name] = [['!=getclass-' . $var_type]]; + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional + * @return list>>> + */ + private static function getTypedValueInequalityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + StatementsAnalyzer $source, + ?Codebase $codebase, + int $typed_value_position + ): array { + $if_types = []; + + if ($typed_value_position === self::ASSIGNMENT_TO_RIGHT) { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->left, + $this_class_name, + $source + ); + + $other_type = $source->node_data->getType($conditional->left); + $var_type = $source->node_data->getType($conditional->right); + } elseif ($typed_value_position === self::ASSIGNMENT_TO_LEFT) { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->right, + $this_class_name, + $source + ); + + $var_type = $source->node_data->getType($conditional->left); + $other_type = $source->node_data->getType($conditional->right); + } else { + throw new UnexpectedValueException('$typed_value_position value'); + } + + if ($var_type) { + if ($var_name) { + $not_identical = $conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical + || ($other_type + && (($var_type->isString() && $other_type->isString()) + || ($var_type->isInt() && $other_type->isInt()) + || ($var_type->isFloat() && $other_type->isFloat()) + ) + ); + + try { + $assertion = $var_type->getAssertionString(); + } catch (UnexpectedValueException $e) { + $assertion = null; + } + + if ($not_identical) { + if ($assertion) { + $if_types[$var_name] = [['!=' . $assertion]]; + } + } else { + if ($assertion) { + $if_types[$var_name] = [['!~' . $assertion]]; + } + } + } + + if ($codebase + && $other_type + && $conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical + ) { + self::handleParadoxicalAssertions( + $source, + $var_type, + $this_class_name, + $other_type, + $codebase, + $conditional + ); + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional + * @return list>>> + */ + private static function getNullEqualityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase, + int $null_position + ): array { + $if_types = []; + + if ($null_position === self::ASSIGNMENT_TO_RIGHT) { + $base_conditional = $conditional->left; + } elseif ($null_position === self::ASSIGNMENT_TO_LEFT) { + $base_conditional = $conditional->right; + } else { + throw new UnexpectedValueException('$null_position value'); + } + + $var_name = ExpressionIdentifier::getArrayVarId( + $base_conditional, + $this_class_name, + $source + ); + + if ($var_name && $base_conditional instanceof PhpParser\Node\Expr\Assign) { + $var_name = '=' . $var_name; + } + + if ($var_name) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical) { + $if_types[$var_name] = [['null']]; + } else { + $if_types[$var_name] = [['falsy']]; + } + } + + if ($codebase + && $source instanceof StatementsAnalyzer + && ($var_type = $source->node_data->getType($base_conditional)) + && $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical + ) { + $null_type = Type::getNull(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $var_type, + $null_type + ) && !UnionTypeComparator::isContainedBy( + $codebase, + $null_type, + $var_type + )) { + if ($var_type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + $var_type . ' does not contain null', + new CodeLocation($source, $conditional), + $var_type . ' null' + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainNull( + $var_type . ' does not contain null', + new CodeLocation($source, $conditional), + $var_type->getId() + ), + $source->getSuppressedIssues() + ); + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional + * @return list>>> + */ + private static function getTrueEqualityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase, + bool $cache, + int $true_position + ): array { + $if_types = []; + + if ($true_position === self::ASSIGNMENT_TO_RIGHT) { + $base_conditional = $conditional->left; + } elseif ($true_position === self::ASSIGNMENT_TO_LEFT) { + $base_conditional = $conditional->right; + } else { + throw new UnexpectedValueException('Unrecognised position'); + } + + if ($base_conditional instanceof PhpParser\Node\Expr\FuncCall) { + $if_types = self::processFunctionCall( + $base_conditional, + $this_class_name, + $source, + $codebase, + false + ); + } else { + $var_name = ExpressionIdentifier::getArrayVarId( + $base_conditional, + $this_class_name, + $source + ); + + if ($var_name) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical) { + $if_types[$var_name] = [['true']]; + } else { + $if_types[$var_name] = [['!falsy']]; + } + + $if_types = [$if_types]; + } else { + $base_assertions = null; + + if ($source instanceof StatementsAnalyzer && $cache) { + $base_assertions = $source->node_data->getAssertions($base_conditional); + } + + if ($base_assertions === null) { + $base_assertions = self::scrapeAssertions( + $base_conditional, + $this_class_name, + $source, + $codebase, + false, + $cache + ); + + if ($source instanceof StatementsAnalyzer && $cache) { + $source->node_data->setAssertions($base_conditional, $base_assertions); + } + } + + $if_types = $base_assertions; + } + } + + if ($codebase + && $source instanceof StatementsAnalyzer + && ($var_type = $source->node_data->getType($base_conditional)) + && $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical + ) { + $config = $source->getCodebase()->config; + + if ($config->strict_binary_operands + && $var_type->isSingle() + && $var_type->hasBool() + && !$var_type->from_docblock + ) { + IssueBuffer::maybeAdd( + new RedundantIdentityWithTrue( + 'The "=== true" part of this comparison is redundant', + new CodeLocation($source, $conditional) + ), + $source->getSuppressedIssues() + ); + } + + $true_type = Type::getTrue(); + + if (!UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $true_type, + $var_type + )) { + if ($var_type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + $var_type . ' does not contain true', + new CodeLocation($source, $conditional), + $var_type . ' true' + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + $var_type . ' does not contain true', + new CodeLocation($source, $conditional), + $var_type . ' true' + ), + $source->getSuppressedIssues() + ); + } + } + } + + return $if_types; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional + * @return list>>> + */ + private static function getFalseEqualityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase, + bool $cache, + bool $inside_conditional, + int $false_position + ): array { + $if_types = []; + + if ($false_position === self::ASSIGNMENT_TO_RIGHT) { + $base_conditional = $conditional->left; + } elseif ($false_position === self::ASSIGNMENT_TO_LEFT) { + $base_conditional = $conditional->right; + } else { + throw new UnexpectedValueException('$false_position value'); + } + + if ($base_conditional instanceof PhpParser\Node\Expr\FuncCall) { + $notif_types = self::processFunctionCall( + $base_conditional, + $this_class_name, + $source, + $codebase, + true + ); + } else { + $var_name = ExpressionIdentifier::getArrayVarId( + $base_conditional, + $this_class_name, + $source + ); + + if ($var_name) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical) { + $if_types[$var_name] = [['false']]; + } else { + $if_types[$var_name] = [['falsy']]; + } + + $notif_types = []; + } else { + $notif_types = null; + + if ($source instanceof StatementsAnalyzer && $cache) { + $notif_types = $source->node_data->getAssertions($base_conditional); + } + + if ($notif_types === null) { + $notif_types = self::scrapeAssertions( + $base_conditional, + $this_class_name, + $source, + $codebase, + false, + $cache, + $inside_conditional + ); + + if ($source instanceof StatementsAnalyzer && $cache) { + $source->node_data->setAssertions($base_conditional, $notif_types); + } + } + } + } + + if (count($notif_types) === 1) { + $notif_types = $notif_types[0]; + + if (count($notif_types) === 1) { + $if_types = Algebra::negateTypes($notif_types); + } + } + + $if_types = $if_types ? [$if_types] : []; + + if ($codebase + && $source instanceof StatementsAnalyzer + && ($var_type = $source->node_data->getType($base_conditional)) + ) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical) { + $false_type = Type::getFalse(); + + if (!UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $false_type, + $var_type + )) { + if ($var_type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + $var_type . ' does not contain false', + new CodeLocation($source, $conditional), + $var_type . ' false' + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + $var_type . ' does not contain false', + new CodeLocation($source, $conditional), + $var_type . ' false' + ), + $source->getSuppressedIssues() + ); + } + } + } + } + + return $if_types; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional + * @return list>>> + */ + private static function getEmptyArrayEqualityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + ?Codebase $codebase, + int $empty_array_position + ): array { + $if_types = []; + + if ($empty_array_position === self::ASSIGNMENT_TO_RIGHT) { + $base_conditional = $conditional->left; + } elseif ($empty_array_position === self::ASSIGNMENT_TO_LEFT) { + $base_conditional = $conditional->right; + } else { + throw new UnexpectedValueException('$empty_array_position value'); + } + + $var_name = ExpressionIdentifier::getArrayVarId( + $base_conditional, + $this_class_name, + $source + ); + + if ($var_name) { + if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical) { + $if_types[$var_name] = [['!non-empty-countable']]; + } else { + $if_types[$var_name] = [['falsy']]; + } + } + + if ($codebase + && $source instanceof StatementsAnalyzer + && ($var_type = $source->node_data->getType($base_conditional)) + && $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical + ) { + $empty_array_type = Type::getEmptyArray(); + + if (!UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $empty_array_type, + $var_type + )) { + if ($var_type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + $var_type . ' does not contain an empty array', + new CodeLocation($source, $conditional), + null + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + $var_type . ' does not contain empty array', + new CodeLocation($source, $conditional), + null + ), + $source->getSuppressedIssues() + ); + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional + * @return list>>> + */ + private static function getGettypeEqualityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + int $gettype_position + ): array { + $if_types = []; + + if ($gettype_position === self::ASSIGNMENT_TO_RIGHT) { + $string_expr = $conditional->left; + $gettype_expr = $conditional->right; + } elseif ($gettype_position === self::ASSIGNMENT_TO_LEFT) { + $string_expr = $conditional->right; + $gettype_expr = $conditional->left; + } else { + throw new UnexpectedValueException('$gettype_position value'); + } + + /** @var PhpParser\Node\Expr\FuncCall $gettype_expr */ + $var_name = ExpressionIdentifier::getArrayVarId( + $gettype_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + + /** @var PhpParser\Node\Scalar\String_ $string_expr */ + $var_type = $string_expr->value; + + if (!isset(ClassLikeAnalyzer::GETTYPE_TYPES[$var_type])) { + IssueBuffer::maybeAdd( + new UnevaluatedCode( + 'gettype cannot return this value', + new CodeLocation($source, $string_expr) + ) + ); + } else { + if ($var_name && $var_type) { + if ($var_type === 'class@anonymous') { + $if_types[$var_name] = [['=object']]; + } elseif ($var_type === 'resource (closed)') { + $if_types[$var_name] = [['closed-resource']]; + } elseif (strpos($var_type, 'resource (') === 0) { + $if_types[$var_name] = [['=resource']]; + } else { + $if_types[$var_name] = [[$var_type]]; + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional + * @return list>>> + */ + private static function getGetdebugtypeEqualityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + FileSource $source, + int $get_debug_type_position + ): array { + $if_types = []; + + if ($get_debug_type_position === self::ASSIGNMENT_TO_RIGHT) { + $whichclass_expr = $conditional->left; + $get_debug_type_expr = $conditional->right; + } elseif ($get_debug_type_position === self::ASSIGNMENT_TO_LEFT) { + $whichclass_expr = $conditional->right; + $get_debug_type_expr = $conditional->left; + } else { + throw new UnexpectedValueException('$gettype_position value'); + } + + /** @var PhpParser\Node\Expr\FuncCall $get_debug_type_expr */ + $var_name = ExpressionIdentifier::getArrayVarId( + $get_debug_type_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + + if ($whichclass_expr instanceof PhpParser\Node\Scalar\String_) { + $var_type = $whichclass_expr->value; + } elseif ($whichclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch + && $whichclass_expr->class instanceof PhpParser\Node\Name + ) { + $var_type = ClassLikeAnalyzer::getFQCLNFromNameObject( + $whichclass_expr->class, + $source->getAliases() + ); + } else { + throw new UnexpectedValueException('Shouldn’t get here'); + } + + if ($var_name && $var_type) { + if ($var_type === 'class@anonymous') { + $if_types[$var_name] = [['=object']]; + } elseif ($var_type === 'resource (closed)') { + $if_types[$var_name] = [['closed-resource']]; + } elseif (strpos($var_type, 'resource (') === 0) { + $if_types[$var_name] = [['=resource']]; + } else { + $if_types[$var_name] = [[$var_type]]; + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional + * @return list>>> + */ + private static function getGetclassEqualityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + StatementsAnalyzer $source, + int $getclass_position + ): array { + $if_types = []; + + if ($getclass_position === self::ASSIGNMENT_TO_RIGHT) { + $whichclass_expr = $conditional->left; + $getclass_expr = $conditional->right; + } elseif ($getclass_position === self::ASSIGNMENT_TO_LEFT) { + $whichclass_expr = $conditional->right; + $getclass_expr = $conditional->left; + } else { + throw new UnexpectedValueException('$getclass_position value'); + } + + if ($getclass_expr instanceof PhpParser\Node\Expr\FuncCall && isset($getclass_expr->getArgs()[0])) { + $var_name = ExpressionIdentifier::getArrayVarId( + $getclass_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + } elseif ($getclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch + && $getclass_expr->class instanceof PhpParser\Node\Expr + ) { + $var_name = ExpressionIdentifier::getArrayVarId( + $getclass_expr->class, + $this_class_name, + $source + ); + } else { + $var_name = '$this'; + } + + if ($whichclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch + && $whichclass_expr->class instanceof PhpParser\Node\Name + ) { + $var_type = ClassLikeAnalyzer::getFQCLNFromNameObject( + $whichclass_expr->class, + $source->getAliases() + ); + + if ($var_type === 'self' || $var_type === 'static') { + $var_type = $this_class_name; + } elseif ($var_type === 'parent') { + $var_type = null; + } + + if ($var_type) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $source, + $var_type, + new CodeLocation($source, $whichclass_expr), + null, + null, + $source->getSuppressedIssues(), + new ClassLikeNameOptions(true) + ) === false + ) { + return []; + } + } + + if ($var_name && $var_type) { + $if_types[$var_name] = [['=getclass-' . $var_type]]; + } + } else { + $type = $source->node_data->getType($whichclass_expr); + + if ($type && $var_name) { + foreach ($type->getAtomicTypes() as $type_part) { + if ($type_part instanceof TTemplateParamClass) { + $if_types[$var_name] = [['=' . $type_part->param_name]]; + } + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional + * @return list>>> + */ + private static function getTypedValueEqualityAssertions( + PhpParser\Node\Expr\BinaryOp $conditional, + ?string $this_class_name, + StatementsAnalyzer $source, + ?Codebase $codebase, + int $typed_value_position + ): array { + $if_types = []; + + if ($typed_value_position === self::ASSIGNMENT_TO_RIGHT) { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->left, + $this_class_name, + $source + ); + + $other_var_name = ExpressionIdentifier::getArrayVarId( + $conditional->right, + $this_class_name, + $source + ); + + $other_type = $source->node_data->getType($conditional->left); + $var_type = $source->node_data->getType($conditional->right); + } elseif ($typed_value_position === self::ASSIGNMENT_TO_LEFT) { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->right, + $this_class_name, + $source + ); + + $other_var_name = ExpressionIdentifier::getArrayVarId( + $conditional->left, + $this_class_name, + $source + ); + + $var_type = $source->node_data->getType($conditional->left); + $other_type = $source->node_data->getType($conditional->right); + } else { + throw new UnexpectedValueException('$typed_value_position value'); + } + + if ($var_name && $var_type) { + $identical = $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical + || ($other_type + && (($var_type->isString(true) && $other_type->isString(true)) + || ($var_type->isInt(true) && $other_type->isInt(true)) + || ($var_type->isFloat() && $other_type->isFloat()) + ) + ); + + if ($identical) { + try { + $assertion = $var_type->getAssertionString(true); + } catch (UnexpectedValueException $e) { + $assertion = null; + } + + if ($assertion) { + $if_types[$var_name] = [['=' . $assertion]]; + } + } else { + try { + $assertion = $var_type->getAssertionString(); + } catch (UnexpectedValueException $e) { + $assertion = null; + } + + if ($assertion) { + $if_types[$var_name] = [['~' . $assertion]]; + } + } + + + if ($other_var_name && $other_type && !$other_type->isMixed()) { + if ($identical) { + try { + $assertion = $other_type->getAssertionString(true); + } catch (UnexpectedValueException $e) { + $assertion = null; + } + + if ($assertion) { + $if_types[$other_var_name] = [['=' . $assertion]]; + } + } else { + try { + $assertion = $other_type->getAssertionString(); + } catch (UnexpectedValueException $e) { + $assertion = null; + } + + if ($assertion) { + $if_types[$other_var_name] = [['~' . $assertion]]; + } + } + } + } + + if ($codebase + && $other_type + && $var_type + && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical + || ($other_type->isString() + && $var_type->isString()) + ) + ) { + self::handleParadoxicalAssertions( + $source, + $var_type, + $this_class_name, + $other_type, + $codebase, + $conditional + ); + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\FuncCall $expr + * @param StatementsAnalyzer $source + * @return list>>> + */ + private static function getIsaAssertions( + PhpParser\Node\Expr\FuncCall $expr, + StatementsAnalyzer $source, + ?string $this_class_name, + ?string $first_var_name + ): array { + $if_types = []; + + if ($expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch + && $expr->getArgs()[0]->value->name instanceof PhpParser\Node\Identifier + && strtolower($expr->getArgs()[0]->value->name->name) === 'class' + && $expr->getArgs()[0]->value->class instanceof PhpParser\Node\Name + && count($expr->getArgs()[0]->value->class->parts) === 1 + && strtolower($expr->getArgs()[0]->value->class->parts[0]) === 'static' + ) { + $first_var_name = '$this'; + } + + if ($first_var_name) { + $first_arg = $expr->getArgs()[0]->value; + $second_arg = $expr->getArgs()[1]->value; + $third_arg = $expr->getArgs()[2]->value ?? null; + + if ($third_arg instanceof PhpParser\Node\Expr\ConstFetch) { + if (!in_array(strtolower($third_arg->name->parts[0]), ['true', 'false'])) { + return []; + } + + $third_arg_value = strtolower($third_arg->name->parts[0]); + } else { + $third_arg_value = $expr->name instanceof PhpParser\Node\Name + && strtolower($expr->name->parts[0]) === 'is_subclass_of' + ? 'true' + : 'false'; + } + + $is_a_prefix = $third_arg_value === 'true' ? 'isa-string-' : 'isa-'; + + if (($first_arg_type = $source->node_data->getType($first_arg)) + && $first_arg_type->isSingleStringLiteral() + && $source->getSource()->getSource() instanceof TraitAnalyzer + && $first_arg_type->getSingleStringLiteral()->value === $this_class_name + ) { + // do nothing + } else { + if ($second_arg instanceof PhpParser\Node\Scalar\String_) { + $fq_class_name = $second_arg->value; + if ($fq_class_name[0] === '\\') { + $fq_class_name = substr($fq_class_name, 1); + } + + $if_types[$first_var_name] = [[$is_a_prefix . $fq_class_name]]; + } elseif ($second_arg instanceof PhpParser\Node\Expr\ClassConstFetch + && $second_arg->class instanceof PhpParser\Node\Name + && $second_arg->name instanceof PhpParser\Node\Identifier + && strtolower($second_arg->name->name) === 'class' + ) { + $class_node = $second_arg->class; + + if ($class_node->parts === ['static']) { + if ($this_class_name) { + $if_types[$first_var_name] = [[$is_a_prefix . $this_class_name . '&static']]; + } + } elseif ($class_node->parts === ['self']) { + if ($this_class_name) { + $if_types[$first_var_name] = [[$is_a_prefix . $this_class_name]]; + } + } elseif ($class_node->parts === ['parent']) { + // do nothing + } else { + $if_types[$first_var_name] = [[ + $is_a_prefix + . ClassLikeAnalyzer::getFQCLNFromNameObject( + $class_node, + $source->getAliases() + ) + ]]; + } + } elseif (($second_arg_type = $source->node_data->getType($second_arg)) + && $second_arg_type->hasString() + ) { + $vals = []; + + foreach ($second_arg_type->getAtomicTypes() as $second_arg_atomic_type) { + if ($second_arg_atomic_type instanceof TTemplateParamClass) { + $vals[] = [$is_a_prefix . $second_arg_atomic_type->param_name]; + } + } + + if ($vals) { + $if_types[$first_var_name] = $vals; + } + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\FuncCall $expr + * @param StatementsAnalyzer $source + * @param string|null $first_var_name + * @return list>>> + */ + private static function getInarrayAssertions( + PhpParser\Node\Expr\FuncCall $expr, + StatementsAnalyzer $source, + ?string $first_var_name + ): array { + $if_types = []; + + if ($first_var_name + && ($second_arg_type = $source->node_data->getType($expr->getArgs()[1]->value)) + && isset($expr->getArgs()[0]->value) + && !$expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch + ) { + foreach ($second_arg_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TArray + || $atomic_type instanceof TKeyedArray + || $atomic_type instanceof TList + ) { + $is_sealed = false; + if ($atomic_type instanceof TList) { + $value_type = $atomic_type->type_param; + } elseif ($atomic_type instanceof TKeyedArray) { + $value_type = $atomic_type->getGenericValueType(); + $is_sealed = $atomic_type->sealed; + } else { + $value_type = $atomic_type->type_params[1]; + } + + $assertions = []; + + if (!$is_sealed) { + // `in-array-*` has special handling in the detection of paradoxical + // conditions and the fact the negation doesn't imply anything. + // + // In the vast majority of cases, the negation of `in-array-*` + // (`Algebra::negateType`) doesn't imply anything because: + // - The array can be empty, or + // - The array may have one of the types but not the others. + // + // NOTE: the negation of the negation is the original assertion. + if ($value_type->getId() !== '' && !$value_type->isMixed() && !$value_type->hasTemplate()) { + $assertions[] = 'in-array-' . $value_type->getId(); + } + } else { + foreach ($value_type->getAtomicTypes() as $atomic_value_type) { + if ($atomic_value_type instanceof TLiteralInt + || $atomic_value_type instanceof TLiteralString + || $atomic_value_type instanceof TLiteralFloat + || $atomic_value_type instanceof TEnumCase + ) { + $assertions[] = '=' . $atomic_value_type->getAssertionString(); + } elseif ($atomic_value_type instanceof TFalse + || $atomic_value_type instanceof TTrue + || $atomic_value_type instanceof TNull + ) { + $assertions[] = $atomic_value_type->getAssertionString(); + } elseif (!$atomic_value_type instanceof TMixed) { + // mixed doesn't tell us anything and can be omitted. + // + // For the meaning of in-array, see the above comment. + $assertions[] = 'in-array-' . $value_type->getId(); + } + } + } + + if ($assertions !== []) { + $if_types[$first_var_name] = [$assertions]; + } + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\FuncCall $expr + * @param Union|null $first_var_type + * @param string|null $first_var_name + * @return list>>> + */ + private static function getArrayKeyExistsAssertions( + PhpParser\Node\Expr\FuncCall $expr, + ?Union $first_var_type, + ?string $first_var_name, + FileSource $source, + ?string $this_class_name + ): array { + $if_types = []; + + $literal_assertions = []; + + if (isset($expr->getArgs()[0]) + && isset($expr->getArgs()[1]) + && $first_var_type + && $first_var_name + && !$expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch + && $source instanceof StatementsAnalyzer + && ($second_var_type = $source->node_data->getType($expr->getArgs()[1]->value)) + ) { + foreach ($second_var_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TArray + || $atomic_type instanceof TKeyedArray + ) { + if ($atomic_type instanceof TKeyedArray) { + $key_possibly_undefined = false; + + foreach ($atomic_type->properties as $property_type) { + if ($property_type->possibly_undefined) { + $key_possibly_undefined = true; + break; + } + } + + $key_type = $atomic_type->getGenericKeyType(); + + if ($key_possibly_undefined) { + $key_type->possibly_undefined = true; + } + } else { + $key_type = $atomic_type->type_params[0]; + } + + if ($key_type->allStringLiterals() && !$key_type->possibly_undefined) { + foreach ($key_type->getLiteralStrings() as $array_literal_type) { + $literal_assertions[] = '=' . $array_literal_type->getAssertionString(); + } + } elseif ($key_type->allIntLiterals() && !$key_type->possibly_undefined) { + foreach ($key_type->getLiteralInts() as $array_literal_type) { + $literal_assertions[] = '~' . $array_literal_type->getAssertionString(); + } + } + } + } + } + + if ($literal_assertions && $first_var_name) { + $if_types[$first_var_name] = [$literal_assertions]; + } else { + $array_root = isset($expr->getArgs()[1]->value) + ? ExpressionIdentifier::getArrayVarId( + $expr->getArgs()[1]->value, + $this_class_name, + $source + ) + : null; + + if ($array_root) { + if ($first_var_name === null && isset($expr->getArgs()[0])) { + $first_arg = $expr->getArgs()[0]; + + if ($first_arg->value instanceof PhpParser\Node\Scalar\String_) { + $first_var_name = '\'' . $first_arg->value->value . '\''; + } elseif ($first_arg->value instanceof PhpParser\Node\Scalar\LNumber) { + $first_var_name = (string)$first_arg->value->value; + } + } + + if ($expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch + && $expr->getArgs()[0]->value->name instanceof PhpParser\Node\Identifier + && $expr->getArgs()[0]->value->name->name !== 'class' + ) { + $const_type = null; + + if ($source instanceof StatementsAnalyzer) { + $const_type = $source->node_data->getType($expr->getArgs()[0]->value); + } + + if ($const_type) { + if ($const_type->isSingleStringLiteral()) { + $first_var_name = $const_type->getSingleStringLiteral()->value; + } elseif ($const_type->isSingleIntLiteral()) { + $first_var_name = (string)$const_type->getSingleIntLiteral()->value; + } else { + $first_var_name = null; + } + } else { + $first_var_name = null; + } + } elseif ($expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\Variable + && $source instanceof StatementsAnalyzer + && ($first_var_type = $source->node_data->getType($expr->getArgs()[0]->value)) + ) { + foreach ($first_var_type->getLiteralStrings() as $array_literal_type) { + $if_types[$array_root . "['" . $array_literal_type->value . "']"] = [['array-key-exists']]; + } + foreach ($first_var_type->getLiteralInts() as $array_literal_type) { + $if_types[$array_root . "[" . $array_literal_type->value . "]"] = [['array-key-exists']]; + } + } + + if ($first_var_name !== null + && !strpos($first_var_name, '->') + && !strpos($first_var_name, '[') + ) { + $if_types[$array_root . '[' . $first_var_name . ']'] = [['array-key-exists']]; + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Greater|PhpParser\Node\Expr\BinaryOp\GreaterOrEqual $conditional + * @return list>>> + */ + private static function getGreaterAssertions( + PhpParser\Node\Expr $conditional, + FileSource $source, + ?string $this_class_name + ): array { + $if_types = []; + + $min_count = null; + $count_equality_position = self::hasNonEmptyCountEqualityCheck($conditional, $min_count); + $max_count = null; + $count_inequality_position = self::hasLessThanCountEqualityCheck($conditional, $max_count); + $isset_assert = false; + $superior_value_comparison = null; + $superior_value_position = self::hasSuperiorNumberCheck( + $source, + $conditional, + $superior_value_comparison, + $isset_assert + ); + + if ($count_equality_position) { + if ($count_equality_position === self::ASSIGNMENT_TO_RIGHT) { + $counted_expr = $conditional->left; + } else { + throw new UnexpectedValueException('$count_equality_position value'); + } + + /** @var PhpParser\Node\Expr\FuncCall $counted_expr */ + $var_name = ExpressionIdentifier::getArrayVarId( + $counted_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + + if ($var_name) { + if (self::hasReconcilableNonEmptyCountEqualityCheck($conditional)) { + $if_types[$var_name] = [['non-empty-countable']]; + } else { + if ($min_count) { + $if_types[$var_name] = [['=has-at-least-' . $min_count]]; + } else { + $if_types[$var_name] = [['=non-empty-countable']]; + } + } + } + + return $if_types ? [$if_types] : []; + } + + if ($count_inequality_position) { + if ($count_inequality_position === self::ASSIGNMENT_TO_LEFT) { + $count_expr = $conditional->right; + } else { + throw new UnexpectedValueException('$count_inequality_position value'); + } + + /** @var PhpParser\Node\Expr\FuncCall $count_expr */ + $var_name = ExpressionIdentifier::getArrayVarId( + $count_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + + if ($var_name) { + if ($max_count) { + $if_types[$var_name] = [['!has-at-least-' . ($max_count + 1)]]; + } else { + $if_types[$var_name] = [['!non-empty-countable']]; + } + } + + return $if_types ? [$if_types] : []; + } + + if ($superior_value_position) { + if ($superior_value_position === self::ASSIGNMENT_TO_RIGHT) { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->left, + $this_class_name, + $source + ); + } else { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->right, + $this_class_name, + $source + ); + } + + if ($var_name !== null) { + if ($superior_value_position === self::ASSIGNMENT_TO_RIGHT) { + if ($superior_value_comparison === 0) { + $if_types[$var_name] = [['=positive-numeric', '=int(0)']]; + } elseif ($superior_value_comparison === 1) { + $if_types[$var_name] = [['positive-numeric']]; + } else { + $if_types[$var_name] = [['>' . $superior_value_comparison]]; + } + } else { + $if_types[$var_name] = [['<' . $superior_value_comparison]]; + } + + if ($isset_assert) { + $if_types[$var_name][] = ['=isset']; + } + } + + return $if_types ? [$if_types] : []; + } + + return []; + } + + /** + * @param PhpParser\Node\Expr\BinaryOp\Smaller|PhpParser\Node\Expr\BinaryOp\SmallerOrEqual $conditional + * @return list>>> + */ + private static function getSmallerAssertions( + PhpParser\Node\Expr $conditional, + FileSource $source, + ?string $this_class_name + ): array { + $if_types = []; + $min_count = null; + $count_equality_position = self::hasNonEmptyCountEqualityCheck($conditional, $min_count); + $max_count = null; + $count_inequality_position = self::hasLessThanCountEqualityCheck($conditional, $max_count); + $isset_assert = false; + $inferior_value_comparison = null; + $inferior_value_position = self::hasInferiorNumberCheck( + $source, + $conditional, + $inferior_value_comparison, + $isset_assert + ); + + if ($count_equality_position) { + if ($count_equality_position === self::ASSIGNMENT_TO_LEFT) { + $count_expr = $conditional->right; + } else { + throw new UnexpectedValueException('$count_equality_position value'); + } + + /** @var PhpParser\Node\Expr\FuncCall $count_expr */ + $var_name = ExpressionIdentifier::getArrayVarId( + $count_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + + if ($var_name) { + if ($min_count) { + $if_types[$var_name] = [['=has-at-least-' . $min_count]]; + } else { + $if_types[$var_name] = [['=non-empty-countable']]; + } + } + + return $if_types ? [$if_types] : []; + } + + if ($count_inequality_position) { + if ($count_inequality_position === self::ASSIGNMENT_TO_RIGHT) { + $count_expr = $conditional->left; + } else { + throw new UnexpectedValueException('$count_inequality_position value'); + } + + /** @var PhpParser\Node\Expr\FuncCall $count_expr */ + $var_name = ExpressionIdentifier::getArrayVarId( + $count_expr->getArgs()[0]->value, + $this_class_name, + $source + ); + + if ($var_name) { + if ($max_count) { + $if_types[$var_name] = [['!has-at-least-' . ($max_count + 1)]]; + } else { + $if_types[$var_name] = [['!non-empty-countable']]; + } + } + + return $if_types ? [$if_types] : []; + } + + if ($inferior_value_position) { + if ($inferior_value_position === self::ASSIGNMENT_TO_RIGHT) { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->left, + $this_class_name, + $source + ); + } else { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->right, + $this_class_name, + $source + ); + } + + + if ($var_name !== null) { + if ($inferior_value_position === self::ASSIGNMENT_TO_RIGHT) { + $if_types[$var_name] = [['<' . $inferior_value_comparison]]; + } else { + if ($inferior_value_comparison === 0) { + $if_types[$var_name] = [['=positive-numeric', '=int(0)']]; + } elseif ($inferior_value_comparison === 1) { + $if_types[$var_name] = [['positive-numeric']]; + } else { + $if_types[$var_name] = [['>' . $inferior_value_comparison]]; + } + } + + if ($isset_assert) { + $if_types[$var_name][] = ['=isset']; + } + } + + return $if_types ? [$if_types] : []; + } + + return []; + } + + /** + * @return list>>> + */ + private static function getInstanceofAssertions( + PhpParser\Node\Expr\Instanceof_ $conditional, + ?Codebase $codebase, + FileSource $source, + ?string $this_class_name, + bool $inside_negation + ): array { + $if_types = []; + + $instanceof_types = self::getInstanceOfTypes($conditional, $this_class_name, $source); + + if ($instanceof_types) { + $var_name = ExpressionIdentifier::getArrayVarId( + $conditional->expr, + $this_class_name, + $source + ); + + if ($var_name) { + $if_types[$var_name] = [$instanceof_types]; + + $var_type = $source instanceof StatementsAnalyzer + ? $source->node_data->getType($conditional->expr) + : null; + + foreach ($instanceof_types as $instanceof_type) { + if ($instanceof_type[0] === '=') { + $instanceof_type = substr($instanceof_type, 1); + } + + if ($codebase + && $var_type + && $inside_negation + && $source instanceof StatementsAnalyzer + ) { + if ($codebase->interfaceExists($instanceof_type)) { + continue; + } + + $instanceof_type = Type::parseString( + $instanceof_type, + null, + $source->getTemplateTypeMap() ?: [] + ); + + if (!UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $instanceof_type, + $var_type + )) { + if ($var_type->from_docblock) { + IssueBuffer::maybeAdd( + new RedundantConditionGivenDocblockType( + $var_type->getId() . ' does not contain ' + . $instanceof_type->getId(), + new CodeLocation($source, $conditional), + $var_type->getId() . ' ' . $instanceof_type->getId() + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RedundantCondition( + $var_type->getId() . ' cannot be identical to ' + . $instanceof_type->getId(), + new CodeLocation($source, $conditional), + $var_type->getId() . ' ' . $instanceof_type->getId() + ), + $source->getSuppressedIssues() + ); + } + } + } + } + } + } + + return $if_types ? [$if_types] : []; + } + + /** + * @param NotIdentical|NotEqual|Identical|Equal $conditional + */ + private static function handleParadoxicalAssertions( + StatementsAnalyzer $source, + Union $var_type, + ?string $this_class_name, + Union $other_type, + Codebase $codebase, + PhpParser\Node\Expr\BinaryOp $conditional + ): void { + $parent_source = $source->getSource(); + + if ($parent_source->getSource() instanceof TraitAnalyzer + && (($var_type->isSingleStringLiteral() + && $var_type->getSingleStringLiteral()->value === $this_class_name) + || ($other_type->isSingleStringLiteral() + && $other_type->getSingleStringLiteral()->value === $this_class_name)) + ) { + // do nothing + } elseif (!UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $other_type, + $var_type + )) { + if ($var_type->from_docblock || $other_type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + $var_type->getId() . ' does not contain ' . $other_type->getId(), + new CodeLocation($source, $conditional), + $var_type->getId() . ' ' . $other_type->getId() + ), + $source->getSuppressedIssues() + ); + } else { + if ($conditional instanceof NotEqual || $conditional instanceof NotIdentical) { + IssueBuffer::maybeAdd( + new RedundantCondition( + $var_type->getId() . ' can never contain ' . $other_type->getId(), + new CodeLocation($source, $conditional), + $var_type->getId() . ' ' . $other_type->getId() + ), + $source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + $var_type->getId() . ' cannot be identical to ' . $other_type->getId(), + new CodeLocation($source, $conditional), + $var_type->getId() . ' ' . $other_type->getId() + ), + $source->getSuppressedIssues() + ); + } + } + } + } + + public static function isPropertyImmutableOnArgument( + string $property, + NodeDataProvider $node_provider, + ClassLikeStorageProvider $class_provider, + PhpParser\Node\Expr\Variable $arg_expr + ): ?string { + $type = $node_provider->getType($arg_expr); + /** @var string $name */ + $name = $arg_expr->name; + + if (null === $type) { + return 'Cannot resolve a type of variable ' . $name; + } + + foreach ($type->getAtomicTypes() as $type) { + if (!$type instanceof TNamedObject) { + return 'Variable ' . $name . ' is not an object so the assertion cannot be applied'; + } + + $class_definition = $class_provider->get($type->value); + $property_definition = $class_definition->properties[$property] ?? null; + + if (!$property_definition instanceof PropertyStorage) { + $magic_type = $class_definition->pseudo_property_get_types['$' . $property] ?? null; + if ($magic_type === null) { + return sprintf( + 'Property %s is not defined on variable %s so the assertion cannot be applied', + $property, + $name + ); + } + + $magic_getter = $class_definition->methods['__get'] ?? null; + if ($magic_getter === null || !$magic_getter->mutation_free) { + return "{$class_definition->name}::__get is not mutation-free, so the assertion cannot be applied"; + } + } + } + + return null; + } +} 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 new file mode 100644 index 00000000..a2eb2c60 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php @@ -0,0 +1,1027 @@ +var, + $statements_analyzer->getFQCLN(), + $statements_analyzer, + $nesting + ); + + self::updateArrayType( + $statements_analyzer, + $stmt, + $assign_value, + $assignment_value_type, + $context + ); + + if (!$statements_analyzer->node_data->getType($stmt->var) && $var_id) { + $context->vars_in_scope[$var_id] = Type::getMixed(); + } + } + + /** + * @return false|null + * @psalm-suppress PossiblyUnusedReturnValue not used but seems important + */ + public static function updateArrayType( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + ?PhpParser\Node\Expr $assign_value, + Union $assignment_type, + Context $context + ): ?bool { + $root_array_expr = $stmt; + + $child_stmts = []; + + while ($root_array_expr->var instanceof PhpParser\Node\Expr\ArrayDimFetch) { + $child_stmts[] = $root_array_expr; + $root_array_expr = $root_array_expr->var; + } + + $child_stmts[] = $root_array_expr; + $root_array_expr = $root_array_expr->var; + + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $root_array_expr, + $context, + true + ) === false) { + // fall through + } + + $codebase = $statements_analyzer->getCodebase(); + + $root_type = $statements_analyzer->node_data->getType($root_array_expr) ?? Type::getMixed(); + + if ($root_type->hasMixed()) { + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $stmt->var, + $context, + true + ) === false) { + // fall through + } + + if ($stmt->dim) { + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $stmt->dim, + $context + ) === false) { + // fall through + } + } + } + + $current_type = $root_type; + + $current_dim = $stmt->dim; + + // gets a variable id that *may* contain array keys + $root_var_id = ExpressionIdentifier::getArrayVarId( + $root_array_expr, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $parent_var_id = null; + + $offset_already_existed = false; + + $child_stmt = null; + + self::analyzeNestedArrayAssignment( + $statements_analyzer, + $codebase, + $context, + $assign_value, + $assignment_type, + array_reverse($child_stmts), + $root_var_id, + $parent_var_id, + $child_stmt, + $root_type, + $current_type, + $current_dim, + $offset_already_existed + ); + + $root_is_string = $root_type->isString(); + $key_values = []; + + if ($current_dim instanceof PhpParser\Node\Scalar\String_) { + $key_values[] = new TLiteralString($current_dim->value); + } elseif ($current_dim instanceof PhpParser\Node\Scalar\LNumber && !$root_is_string) { + $key_values[] = new TLiteralInt($current_dim->value); + } elseif ($current_dim + && ($key_type = $statements_analyzer->node_data->getType($current_dim)) + && !$root_is_string + ) { + $string_literals = $key_type->getLiteralStrings(); + $int_literals = $key_type->getLiteralInts(); + + $all_atomic_types = $key_type->getAtomicTypes(); + + if (count($string_literals) + count($int_literals) === count($all_atomic_types)) { + foreach ($string_literals as $string_literal) { + $key_values[] = clone $string_literal; + } + + foreach ($int_literals as $int_literal) { + $key_values[] = clone $int_literal; + } + } + } + + if ($key_values) { + $new_child_type = self::updateTypeWithKeyValues( + $codebase, + $root_type, + $current_type, + $key_values + ); + } elseif (!$root_is_string) { + $new_child_type = self::updateArrayAssignmentChildType( + $statements_analyzer, + $codebase, + $current_dim, + $context, + $current_type, + $root_type, + $offset_already_existed, + $child_stmt, + $parent_var_id + ); + } else { + $new_child_type = $root_type; + } + + $new_child_type->removeType('null'); + + if (!$root_type->hasObjectType()) { + $root_type = $new_child_type; + } + + $statements_analyzer->node_data->setType($root_array_expr, $root_type); + + if ($root_array_expr instanceof PhpParser\Node\Expr\PropertyFetch) { + if ($root_array_expr->name instanceof PhpParser\Node\Identifier) { + InstancePropertyAssignmentAnalyzer::analyze( + $statements_analyzer, + $root_array_expr, + $root_array_expr->name->name, + null, + $root_type, + $context, + false + ); + } else { + if (ExpressionAnalyzer::analyze($statements_analyzer, $root_array_expr->name, $context) === false) { + return false; + } + + if (ExpressionAnalyzer::analyze($statements_analyzer, $root_array_expr->var, $context) === false) { + return false; + } + } + } elseif ($root_array_expr instanceof PhpParser\Node\Expr\StaticPropertyFetch + && $root_array_expr->name instanceof PhpParser\Node\Identifier + ) { + if (StaticPropertyAssignmentAnalyzer::analyze( + $statements_analyzer, + $root_array_expr, + null, + $root_type, + $context + ) === false) { + return false; + } + } elseif ($root_var_id) { + $context->vars_in_scope[$root_var_id] = $root_type; + } + + if ($root_array_expr instanceof PhpParser\Node\Expr\MethodCall + || $root_array_expr instanceof PhpParser\Node\Expr\StaticCall + || $root_array_expr instanceof PhpParser\Node\Expr\FuncCall + ) { + if ($root_type->hasArray()) { + if (IssueBuffer::accepts( + new InvalidArrayAssignment( + 'Assigning to the output of a function has no effect', + new CodeLocation($statements_analyzer->getSource(), $root_array_expr) + ), + $statements_analyzer->getSuppressedIssues() + ) + ) { + // do nothing + } + } + } + + return null; + } + + /** + * @param non-empty-list $key_values + */ + private static function updateTypeWithKeyValues( + Codebase $codebase, + Union $child_stmt_type, + Union $current_type, + array $key_values + ): Union { + $has_matching_objectlike_property = false; + $has_matching_string = false; + + $child_stmt_type = clone $child_stmt_type; + + foreach ($child_stmt_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + $type->as = self::updateTypeWithKeyValues( + $codebase, + $type->as, + $current_type, + $key_values + ); + + $has_matching_objectlike_property = true; + + $child_stmt_type->substitute(new Union([$type]), $type->as); + + continue; + } + + foreach ($key_values as $key_value) { + if ($type instanceof TKeyedArray) { + if (isset($type->properties[$key_value->value])) { + $has_matching_objectlike_property = true; + + $type->properties[$key_value->value] = clone $current_type; + } + } elseif ($type instanceof TString + && $key_value instanceof TLiteralInt + ) { + $has_matching_string = true; + + if ($type instanceof TLiteralString + && $current_type->isSingleStringLiteral() + ) { + $new_char = $current_type->getSingleStringLiteral()->value; + + if (strlen($new_char) === 1) { + $type->value[0] = $new_char; + } + } + } elseif ($type instanceof TNonEmptyList + && $key_value instanceof TLiteralInt + && count($key_values) === 1 + ) { + $has_matching_objectlike_property = true; + + $type->type_param = Type::combineUnionTypes( + clone $current_type, + $type->type_param, + $codebase, + true, + false + ); + } + } + } + + $child_stmt_type->bustCache(); + + if (!$has_matching_objectlike_property && !$has_matching_string) { + if (count($key_values) === 1) { + $key_value = $key_values[0]; + + $object_like = new TKeyedArray( + [$key_value->value => clone $current_type], + $key_value instanceof TLiteralClassString + ? [$key_value->value => true] + : null + ); + + $object_like->sealed = true; + + $array_assignment_type = new Union([ + $object_like, + ]); + } else { + $array_assignment_literals = $key_values; + + $array_assignment_type = new Union([ + new TNonEmptyArray([ + new Union($array_assignment_literals), + clone $current_type + ]) + ]); + } + + return Type::combineUnionTypes( + $child_stmt_type, + $array_assignment_type, + $codebase, + true, + false + ); + } + + return $child_stmt_type; + } + + /** + * @param list $key_values $key_values + */ + private static function taintArrayAssignment( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\ArrayDimFetch $expr, + Union $stmt_type, + Union $child_stmt_type, + ?string $var_var_id, + array $key_values + ): void { + if ($statements_analyzer->data_flow_graph + && ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + || !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues())) + ) { + $var_location = new CodeLocation($statements_analyzer->getSource(), $expr->var); + + $parent_node = DataFlowNode::getForAssignment( + $var_var_id ?: 'assignment', + $var_location + ); + + $statements_analyzer->data_flow_graph->addNode($parent_node); + + $old_parent_nodes = $stmt_type->parent_nodes; + + $stmt_type->parent_nodes = [$parent_node->id => $parent_node]; + + foreach ($old_parent_nodes as $old_parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $old_parent_node, + $parent_node, + '=' + ); + + if ($stmt_type->by_ref) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $old_parent_node, + '=' + ); + } + } + + foreach ($stmt_type->parent_nodes as $parent_node) { + foreach ($child_stmt_type->parent_nodes as $child_parent_node) { + if ($key_values) { + foreach ($key_values as $key_value) { + $statements_analyzer->data_flow_graph->addPath( + $child_parent_node, + $parent_node, + 'arrayvalue-assignment-\'' . $key_value->value . '\'' + ); + } + } else { + $statements_analyzer->data_flow_graph->addPath( + $child_parent_node, + $parent_node, + 'arrayvalue-assignment' + ); + } + } + } + } + } + + private static function updateArrayAssignmentChildType( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + ?PhpParser\Node\Expr $current_dim, + Context $context, + Union $value_type, + Union $root_type, + bool $offset_already_existed, + ?PhpParser\Node\Expr $child_stmt, + ?string $parent_var_id + ): Union { + $templated_assignment = false; + + if ($current_dim) { + $key_type = $statements_analyzer->node_data->getType($current_dim); + + if ($key_type) { + if ($key_type->hasMixed()) { + $key_type = Type::getArrayKey(); + } + + if ($key_type->isSingle()) { + $key_type_type = $key_type->getSingleAtomic(); + + if ($key_type_type instanceof TDependentListKey + && $key_type_type->getVarId() === $parent_var_id + ) { + $offset_already_existed = true; + } + + if ($key_type_type instanceof TTemplateParam + && $key_type_type->as->isSingle() + && $root_type->isSingle() + && $value_type->isSingle() + ) { + $key_type_as_type = $key_type_type->as->getSingleAtomic(); + $value_atomic_type = $value_type->getSingleAtomic(); + $root_atomic_type = $root_type->getSingleAtomic(); + + if ($key_type_as_type instanceof TTemplateKeyOf + && $root_atomic_type instanceof TTemplateParam + && $value_atomic_type instanceof TTemplateIndexedAccess + && $key_type_as_type->param_name === $root_atomic_type->param_name + && $key_type_as_type->defining_class === $root_atomic_type->defining_class + && $value_atomic_type->array_param_name === $root_atomic_type->param_name + && $value_atomic_type->offset_param_name === $key_type_type->param_name + && $value_atomic_type->defining_class === $root_atomic_type->defining_class + ) { + $templated_assignment = true; + $offset_already_existed = true; + } + } + } + + $array_atomic_key_type = ArrayFetchAnalyzer::replaceOffsetTypeWithInts( + $key_type + ); + } else { + $array_atomic_key_type = Type::getArrayKey(); + } + + if ($offset_already_existed + && $child_stmt + && $parent_var_id + && ($parent_type = $context->vars_in_scope[$parent_var_id] ?? null) + ) { + if ($parent_type->hasList()) { + $array_atomic_type = new TNonEmptyList( + $value_type + ); + } elseif ($parent_type->hasClassStringMap() + && $key_type + && $key_type->isTemplatedClassString() + ) { + /** + * @var TClassStringMap + * @psalm-suppress PossiblyUndefinedStringArrayOffset + */ + $class_string_map = $parent_type->getAtomicTypes()['array']; + /** + * @var TTemplateParamClass + */ + $offset_type_part = $key_type->getSingleAtomic(); + + $template_result = new TemplateResult( + [], + [ + $offset_type_part->param_name => [ + $offset_type_part->defining_class => new Union([ + new TTemplateParam( + $class_string_map->param_name, + $offset_type_part->as_type + ? new Union([$offset_type_part->as_type]) + : Type::getObject(), + 'class-string-map' + ) + ]) + ] + ] + ); + + TemplateInferredTypeReplacer::replace( + $value_type, + $template_result, + $codebase + ); + + $array_atomic_type = new TClassStringMap( + $class_string_map->param_name, + $class_string_map->as_type, + $value_type + ); + } else { + $array_atomic_type = new TNonEmptyArray([ + $array_atomic_key_type, + $value_type, + ]); + } + } else { + $array_atomic_type = new TNonEmptyArray([ + $array_atomic_key_type, + $value_type, + ]); + } + } else { + $array_atomic_type = new TNonEmptyList($value_type); + } + + $from_countable_object_like = false; + + $new_child_type = null; + + if (!$current_dim && !$context->inside_loop) { + $atomic_root_types = $root_type->getAtomicTypes(); + + if (isset($atomic_root_types['array'])) { + if ($array_atomic_type instanceof TClassStringMap) { + $array_atomic_type = new TNonEmptyArray([ + $array_atomic_type->getStandinKeyParam(), + $array_atomic_type->value_param + ]); + } elseif ($atomic_root_types['array'] instanceof TNonEmptyArray + || $atomic_root_types['array'] instanceof TNonEmptyList + ) { + $array_atomic_type->count = $atomic_root_types['array']->count; + } elseif ($atomic_root_types['array'] instanceof TKeyedArray + && $atomic_root_types['array']->sealed + ) { + $array_atomic_type->count = count($atomic_root_types['array']->properties); + $from_countable_object_like = true; + + if ($atomic_root_types['array']->is_list + && $array_atomic_type instanceof TList + ) { + $array_atomic_type = clone $atomic_root_types['array']; + + $new_child_type = new Union([$array_atomic_type]); + + $new_child_type->parent_nodes = $root_type->parent_nodes; + } + } elseif ($array_atomic_type instanceof TList) { + $array_atomic_type = new TNonEmptyList( + $array_atomic_type->type_param + ); + } else { + $array_atomic_type = new TNonEmptyArray( + $array_atomic_type->type_params + ); + } + } + } + + $array_assignment_type = new Union([ + $array_atomic_type, + ]); + + if (!$new_child_type) { + if ($templated_assignment) { + $new_child_type = $root_type; + } else { + $new_child_type = Type::combineUnionTypes( + $root_type, + $array_assignment_type, + $codebase, + true, + true + ); + } + } + + if ($from_countable_object_like) { + $atomic_root_types = $new_child_type->getAtomicTypes(); + + if (isset($atomic_root_types['array']) + && ($atomic_root_types['array'] instanceof TNonEmptyArray + || $atomic_root_types['array'] instanceof TNonEmptyList) + && $atomic_root_types['array']->count !== null + ) { + $atomic_root_types['array']->count++; + } + } + + return $new_child_type; + } + + /** + * @param array $child_stmts + */ + private static function analyzeNestedArrayAssignment( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + Context $context, + ?PhpParser\Node\Expr $assign_value, + Union $assignment_type, + array $child_stmts, + ?string $root_var_id, + ?string &$parent_var_id, + ?PhpParser\Node\Expr &$child_stmt, + Union &$root_type, + Union &$current_type, + ?PhpParser\Node\Expr &$current_dim, + bool &$offset_already_existed + ): void { + $reversed_child_stmts = []; + $var_id_additions = []; + $full_var_id = true; + + $child_stmt = null; + + // First go from the root element up, and go as far as we can to figure out what + // array types there are + while ($child_stmts) { + $child_stmt = array_shift($child_stmts); + + if (count($child_stmts)) { + array_unshift($reversed_child_stmts, $child_stmt); + } + + $child_stmt_dim_type = null; + + $offset_type = null; + + if ($child_stmt->dim) { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $child_stmt->dim, + $context + ) === false) { + $context->inside_general_use = $was_inside_general_use; + + return; + } + + $context->inside_general_use = $was_inside_general_use; + + if (!($child_stmt_dim_type = $statements_analyzer->node_data->getType($child_stmt->dim))) { + return; + } + + [$offset_type, $var_id_addition, $full_var_id] = self::getArrayAssignmentOffsetType( + $statements_analyzer, + $child_stmt, + $child_stmt_dim_type + ); + + $var_id_additions[] = $var_id_addition; + } else { + $var_id_additions[] = ''; + $full_var_id = false; + } + + if (!($child_stmt_var_type = $statements_analyzer->node_data->getType($child_stmt->var))) { + return; + } + + if ($child_stmt_var_type->isEmpty()) { + $child_stmt_var_type = Type::getEmptyArray(); + $statements_analyzer->node_data->setType($child_stmt->var, $child_stmt_var_type); + } + + $array_var_id = $root_var_id . implode('', $var_id_additions); + + if ($parent_var_id && isset($context->vars_in_scope[$parent_var_id])) { + $child_stmt_var_type = clone $context->vars_in_scope[$parent_var_id]; + $statements_analyzer->node_data->setType($child_stmt->var, $child_stmt_var_type); + } + + $array_type = clone $child_stmt_var_type; + + $child_stmt_type = ArrayFetchAnalyzer::getArrayAccessTypeGivenOffset( + $statements_analyzer, + $child_stmt, + $array_type, + $child_stmt_dim_type ?? Type::getInt(), + true, + $array_var_id, + $context, + $assign_value, + $child_stmts ? null : $assignment_type + ); + + $statements_analyzer->node_data->setType( + $child_stmt, + $child_stmt_type + ); + + $statements_analyzer->node_data->setType($child_stmt->var, $array_type); + + if ($root_var_id) { + if (!$parent_var_id) { + $rooted_parent_id = $root_var_id; + $root_type = $array_type; + } else { + $rooted_parent_id = $parent_var_id; + } + + $context->vars_in_scope[$rooted_parent_id] = $array_type; + $context->possibly_assigned_var_ids[$rooted_parent_id] = true; + } + + if (!$child_stmts) { + // we need this slight hack as the type we're putting it has to be + // different from the type we're getting out + if ($array_type->isSingle() && $array_type->hasClassStringMap()) { + $assignment_type = $child_stmt_type; + } + + $child_stmt_type = $assignment_type; + $statements_analyzer->node_data->setType($child_stmt, $assignment_type); + + if ($statements_analyzer->data_flow_graph) { + self::taintArrayAssignment( + $statements_analyzer, + $child_stmt, + $array_type, + $assignment_type, + ExpressionIdentifier::getArrayVarId( + $child_stmt->var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ), + $offset_type !== null ? [$offset_type] : [] + ); + } + } + + $current_type = $child_stmt_type; + $current_dim = $child_stmt->dim; + + $parent_var_id = $array_var_id; + } + + if ($root_var_id + && $full_var_id + && $child_stmt + && ($child_stmt_var_type = $statements_analyzer->node_data->getType($child_stmt->var)) + && !$child_stmt_var_type->hasObjectType() + ) { + $array_var_id = $root_var_id . implode('', $var_id_additions); + $parent_var_id = $root_var_id . implode('', array_slice($var_id_additions, 0, -1)); + + if (isset($context->vars_in_scope[$array_var_id]) + && !$context->vars_in_scope[$array_var_id]->possibly_undefined + ) { + $offset_already_existed = true; + } + + $context->vars_in_scope[$array_var_id] = clone $assignment_type; + $context->possibly_assigned_var_ids[$array_var_id] = true; + } + + // only update as many child stmts are we were able to process above + foreach ($reversed_child_stmts as $child_stmt) { + $child_stmt_type = $statements_analyzer->node_data->getType($child_stmt); + + if (!$child_stmt_type) { + throw new InvalidArgumentException('Should never get here'); + } + + $key_values = []; + + if ($current_dim instanceof PhpParser\Node\Scalar\String_) { + $key_values[] = new TLiteralString($current_dim->value); + } elseif ($current_dim instanceof PhpParser\Node\Scalar\LNumber) { + $key_values[] = new TLiteralInt($current_dim->value); + } elseif ($current_dim + && ($key_type = $statements_analyzer->node_data->getType($current_dim)) + ) { + $string_literals = $key_type->getLiteralStrings(); + $int_literals = $key_type->getLiteralInts(); + + $all_atomic_types = $key_type->getAtomicTypes(); + + if (count($string_literals) + count($int_literals) === count($all_atomic_types)) { + foreach ($string_literals as $string_literal) { + $key_values[] = clone $string_literal; + } + + foreach ($int_literals as $int_literal) { + $key_values[] = clone $int_literal; + } + } + } + + if ($key_values) { + $new_child_type = self::updateTypeWithKeyValues( + $codebase, + $child_stmt_type, + $current_type, + $key_values + ); + } else { + if (!$current_dim) { + $array_assignment_type = new Union([ + new TList($current_type), + ]); + } else { + $key_type = $statements_analyzer->node_data->getType($current_dim); + + $array_assignment_type = new Union([ + new TArray([ + $key_type && !$key_type->hasMixed() + ? $key_type + : Type::getArrayKey(), + $current_type, + ]), + ]); + } + + $new_child_type = Type::combineUnionTypes( + $child_stmt_type, + $array_assignment_type, + $codebase, + true, + true + ); + } + + $new_child_type->removeType('null'); + $new_child_type->possibly_undefined = false; + + if (!$child_stmt_type->hasObjectType()) { + $child_stmt_type = $new_child_type; + $statements_analyzer->node_data->setType($child_stmt, $new_child_type); + } + + $current_type = $child_stmt_type; + $current_dim = $child_stmt->dim; + + array_pop($var_id_additions); + + $parent_array_var_id = null; + + if ($root_var_id) { + $array_var_id = $root_var_id . implode('', $var_id_additions); + $parent_array_var_id = $root_var_id . implode('', array_slice($var_id_additions, 0, -1)); + $context->vars_in_scope[$array_var_id] = clone $child_stmt_type; + $context->possibly_assigned_var_ids[$array_var_id] = true; + } + + if ($statements_analyzer->data_flow_graph) { + self::taintArrayAssignment( + $statements_analyzer, + $child_stmt, + $statements_analyzer->node_data->getType($child_stmt->var) ?? Type::getMixed(), + $new_child_type, + $parent_array_var_id, + $key_values + ); + } + } + } + + /** + * @return array{TLiteralInt|TLiteralString|null, string, bool} + */ + private static function getArrayAssignmentOffsetType( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\ArrayDimFetch $child_stmt, + Union $child_stmt_dim_type + ): array { + if ($child_stmt->dim instanceof PhpParser\Node\Scalar\String_ + || (($child_stmt->dim instanceof PhpParser\Node\Expr\ConstFetch + || $child_stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch) + && $child_stmt_dim_type->isSingleStringLiteral()) + ) { + if ($child_stmt->dim instanceof PhpParser\Node\Scalar\String_) { + $offset_type = new TLiteralString($child_stmt->dim->value); + } else { + $offset_type = $child_stmt_dim_type->getSingleStringLiteral(); + } + + if (preg_match('/^(0|[1-9][0-9]*)$/', $offset_type->value)) { + $var_id_addition = '[' . $offset_type->value . ']'; + } else { + $var_id_addition = '[\'' . $offset_type->value . '\']'; + } + + return [$offset_type, $var_id_addition, true]; + } + + if ($child_stmt->dim instanceof PhpParser\Node\Scalar\LNumber + || (($child_stmt->dim instanceof PhpParser\Node\Expr\ConstFetch + || $child_stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch) + && $child_stmt_dim_type->isSingleIntLiteral()) + ) { + if ($child_stmt->dim instanceof PhpParser\Node\Scalar\LNumber) { + $offset_type = new TLiteralInt($child_stmt->dim->value); + } else { + $offset_type = $child_stmt_dim_type->getSingleIntLiteral(); + } + + $var_id_addition = '[' . $offset_type->value . ']'; + + return [$offset_type, $var_id_addition, true]; + } + + if ($child_stmt->dim instanceof PhpParser\Node\Expr\Variable + && is_string($child_stmt->dim->name) + ) { + $var_id_addition = '[$' . $child_stmt->dim->name . ']'; + + return [null, $var_id_addition, true]; + } + + if ($child_stmt->dim instanceof PhpParser\Node\Expr\PropertyFetch + && $child_stmt->dim->name instanceof PhpParser\Node\Identifier + ) { + $object_id = ExpressionIdentifier::getArrayVarId( + $child_stmt->dim->var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($object_id) { + $var_id_addition = '[' . $object_id . '->' . $child_stmt->dim->name->name . ']'; + } else { + $var_id_addition = '[' . $child_stmt_dim_type . ']'; + } + + return [null, $var_id_addition, true]; + } + + if ($child_stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch + && $child_stmt->dim->name instanceof PhpParser\Node\Identifier + && $child_stmt->dim->class instanceof PhpParser\Node\Name + ) { + $object_name = ClassLikeAnalyzer::getFQCLNFromNameObject( + $child_stmt->dim->class, + $statements_analyzer->getAliases() + ); + $var_id_addition = '[' . $object_name . '::' . $child_stmt->dim->name->name . ']'; + + return [null, $var_id_addition, true]; + } + + $var_id_addition = '[' . $child_stmt_dim_type . ']'; + + return [null, $var_id_addition, false]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php new file mode 100644 index 00000000..9756e4fc --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php @@ -0,0 +1,33 @@ +property_type = $property_type; + $this->id = $id; + $this->assignment_type = $assignment_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php new file mode 100644 index 00000000..f5ebf74b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php @@ -0,0 +1,1540 @@ +getCodebase(); + + if ($stmt instanceof PropertyProperty) { + if (!$context->self || !$stmt->default) { + return null; + } + + $property_id = $context->self . '::$' . $prop_name; + + $class_property_type = null; + + try { + $class_property_type = $codebase->properties->getPropertyType( + $property_id, + true, + $statements_analyzer, + $context + ); + } catch (UnexpectedValueException $e) { + // do nothing + } + + if ($class_property_type) { + $class_storage = $codebase->classlike_storage_provider->get($context->self); + + $class_property_type = self::getExpandedPropertyType( + $codebase, + $context->self, + $prop_name, + $class_storage + ); + } + + $var_id = '$this->' . $prop_name; + + $assigned_properties = [ + new AssignedProperty( + $class_property_type ?? Type::getMixed(), + $property_id, + $assignment_value_type + ) + ]; + } else { + $assigned_properties = self::analyzeRegularAssignment( + $statements_analyzer, + $stmt, + $assignment_value, + $context, + $direct_assignment, + $codebase, + $assignment_value_type, + $prop_name, + $var_id + ); + } + + if (!$assigned_properties) { + return null; + } + + if ($assignment_value_type->hasMixed()) { + return null; + } + + $invalid_assignment_value_types = []; + + $has_valid_assignment_value_type = false; + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + && count($assigned_properties) === 1 + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt->name, + $assigned_properties[0]->property_type->getId() + ); + } + + foreach ($assigned_properties as $assigned_property) { + $class_property_type = $assigned_property->property_type; + $assignment_type = $assigned_property->assignment_type; + + if ($class_property_type->hasMixed()) { + continue; + } + + $union_comparison_results = new TypeComparisonResult(); + + $type_match_found = UnionTypeComparator::isContainedBy( + $codebase, + $assignment_type, + $class_property_type, + true, + true, + $union_comparison_results + ); + + if ($type_match_found && $union_comparison_results->replacement_union_type) { + if ($var_id) { + $context->vars_in_scope[$var_id] = $union_comparison_results->replacement_union_type; + } + } + + if ($union_comparison_results->type_coerced) { + if ($union_comparison_results->type_coerced_from_mixed) { + IssueBuffer::maybeAdd( + new MixedPropertyTypeCoercion( + $var_id . ' expects \'' . $class_property_type->getId() . '\', ' + . ' parent type `' . $assignment_type->getId() . '` provided', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt, + $context->include_location + ), + $assigned_property->id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new PropertyTypeCoercion( + $var_id . ' expects \'' . $class_property_type->getId() . '\', ' + . ' parent type \'' . $assignment_type->getId() . '\' provided', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt, + $context->include_location + ), + $assigned_property->id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($union_comparison_results->to_string_cast) { + IssueBuffer::maybeAdd( + new ImplicitToStringCast( + $var_id . ' expects \'' . $class_property_type . '\', ' + . '\'' . $assignment_type . '\' provided with a __toString method', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt, + $context->include_location + ) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (!$type_match_found && !$union_comparison_results->type_coerced) { + if (UnionTypeComparator::canBeContainedBy( + $codebase, + $assignment_type, + $class_property_type, + true, + true + )) { + $has_valid_assignment_value_type = true; + } + + $invalid_assignment_value_types[$assigned_property->id] = $class_property_type->getId(); + } else { + $has_valid_assignment_value_type = true; + } + + if ($type_match_found) { + if (!$assignment_type->ignore_nullable_issues + && $assignment_type->isNullable() + && !$class_property_type->isNullable() + ) { + if (IssueBuffer::accepts( + new PossiblyNullPropertyAssignmentValue( + $var_id . ' with non-nullable declared type \'' . $class_property_type . + '\' cannot be assigned nullable type \'' . $assignment_type . '\'', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt, + $context->include_location + ), + $assigned_property->id + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } + + if (!$assignment_type->ignore_falsable_issues + && $assignment_type->isFalsable() + && !$class_property_type->hasBool() + && !$class_property_type->hasScalar() + ) { + if (IssueBuffer::accepts( + new PossiblyFalsePropertyAssignmentValue( + $var_id . ' with non-falsable declared type \'' . $class_property_type . + '\' cannot be assigned possibly false type \'' . $assignment_type . '\'', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt, + $context->include_location + ), + $assigned_property->id + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } + } + } + + foreach ($invalid_assignment_value_types as $property_id => $invalid_class_property_type) { + if (!$has_valid_assignment_value_type) { + if (IssueBuffer::accepts( + new InvalidPropertyAssignmentValue( + $var_id . ' with declared type \'' . $invalid_class_property_type . + '\' cannot be assigned type \'' . $assignment_value_type->getId() . '\'', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt, + $context->include_location + ), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } else { + if (IssueBuffer::accepts( + new PossiblyInvalidPropertyAssignmentValue( + $var_id . ' with declared type \'' . $invalid_class_property_type . + '\' cannot be assigned possibly different type \'' . + $assignment_value_type->getId() . '\'', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt, + $context->include_location + ), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } + } + + return null; + } + + public static function trackPropertyImpurity( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\PropertyFetch $stmt, + string $property_id, + PropertyStorage $property_storage, + ClassLikeStorage $declaring_class_storage, + Context $context + ): void { + $codebase = $statements_analyzer->getCodebase(); + + $stmt_var_type = $statements_analyzer->node_data->getType($stmt->var); + + $property_var_pure_compatible = $stmt_var_type + && $stmt_var_type->reference_free + && $stmt_var_type->allow_mutations; + + $appearing_property_class = $codebase->properties->getAppearingClassForProperty( + $property_id, + true + ); + + $project_analyzer = $statements_analyzer->getProjectAnalyzer(); + + if ($appearing_property_class && ($property_storage->readonly || $codebase->alter_code)) { + $can_set_readonly_property = $context->self + && $context->calling_method_id + && ($appearing_property_class === $context->self + || $codebase->classExtends($context->self, $appearing_property_class)) + && (strpos($context->calling_method_id, '::__construct') + || strpos($context->calling_method_id, '::unserialize') + || strpos($context->calling_method_id, '::__unserialize') + || strpos($context->calling_method_id, '::__clone') + || $property_storage->allow_private_mutation + || $property_var_pure_compatible); + + if (!$can_set_readonly_property) { + if ($property_storage->readonly) { + IssueBuffer::maybeAdd( + new InaccessibleProperty( + $property_id . ' is marked readonly', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif (!$declaring_class_storage->mutation_free + && isset($project_analyzer->getIssuesToFix()['MissingImmutableAnnotation']) + && $statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + ) { + $codebase->analyzer->addMutableClass($declaring_class_storage->name); + } + } + } + } + + public static function analyzeStatement( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Stmt\Property $stmt, + Context $context + ): void { + foreach ($stmt->props as $prop) { + if ($prop->default) { + if ($stmt->isReadonly()) { + IssueBuffer::maybeAdd( + new InvalidPropertyAssignment( + 'Readonly property ' . $context->self . '::$' . $prop->name->name + . ' cannot have a default', + new CodeLocation($statements_analyzer->getSource(), $prop->default) + ) + ); + } + + ExpressionAnalyzer::analyze($statements_analyzer, $prop->default, $context); + + if ($prop_default_type = $statements_analyzer->node_data->getType($prop->default)) { + if (self::analyze( + $statements_analyzer, + $prop, + $prop->name->name, + $prop->default, + $prop_default_type, + $context + ) === false) { + // fall through + } + } + } + } + } + + private static function taintProperty( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\PropertyFetch $stmt, + string $property_id, + ClassLikeStorage $class_storage, + Union $assignment_value_type, + Context $context + ): void { + if (!$statements_analyzer->data_flow_graph) { + return; + } + + $codebase = $statements_analyzer->getCodebase(); + + $data_flow_graph = $statements_analyzer->data_flow_graph; + + $var_location = new CodeLocation($statements_analyzer->getSource(), $stmt->var); + $property_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + if ($class_storage->specialize_instance) { + $var_id = ExpressionIdentifier::getArrayVarId( + $stmt->var, + null, + $statements_analyzer + ); + + $var_property_id = ExpressionIdentifier::getArrayVarId( + $stmt, + null, + $statements_analyzer + ); + + if ($var_id) { + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + $context->vars_in_scope[$var_id]->parent_nodes = []; + return; + } + + $var_node = DataFlowNode::getForAssignment( + $var_id, + $var_location + ); + + $data_flow_graph->addNode($var_node); + + $property_node = DataFlowNode::getForAssignment( + $var_property_id ?: $var_id . '->$property', + $property_location + ); + + $data_flow_graph->addNode($property_node); + + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + $data_flow_graph->addPath( + $property_node, + $var_node, + 'property-assignment' + . ($stmt->name instanceof PhpParser\Node\Identifier ? '-' . $stmt->name : ''), + $added_taints, + $removed_taints + ); + + if ($assignment_value_type->parent_nodes) { + foreach ($assignment_value_type->parent_nodes as $parent_node) { + $data_flow_graph->addPath($parent_node, $property_node, '=', $added_taints, $removed_taints); + } + } + + $stmt_var_type = clone $context->vars_in_scope[$var_id]; + + if ($context->vars_in_scope[$var_id]->parent_nodes) { + foreach ($context->vars_in_scope[$var_id]->parent_nodes as $parent_node) { + $data_flow_graph->addPath($parent_node, $var_node, '=', $added_taints, $removed_taints); + } + } + + $stmt_var_type->parent_nodes = [$var_node->id => $var_node]; + + $context->vars_in_scope[$var_id] = $stmt_var_type; + } + } else { + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + $assignment_value_type->parent_nodes = []; + return; + } + + $var_property_id = ExpressionIdentifier::getArrayVarId( + $stmt, + null, + $statements_analyzer + ); + + $localized_property_node = DataFlowNode::getForAssignment( + $var_property_id + ?: $property_id . '-' . $property_location->file_name . ':' . $property_location->raw_file_start, + $property_location + ); + + $data_flow_graph->addNode($localized_property_node); + + $property_node = new DataFlowNode( + $property_id, + $property_id, + null, + null + ); + + $data_flow_graph->addNode($property_node); + + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + $data_flow_graph->addPath( + $localized_property_node, + $property_node, + 'property-assignment', + $added_taints, + $removed_taints + ); + + if ($assignment_value_type->parent_nodes) { + foreach ($assignment_value_type->parent_nodes as $parent_node) { + $data_flow_graph->addPath( + $parent_node, + $localized_property_node, + '=', + $added_taints, + $removed_taints + ); + } + } + + $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( + $property_id, + false, + $statements_analyzer + ); + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && $declaring_property_class + && $declaring_property_class !== $class_storage->name + && $stmt->name instanceof PhpParser\Node\Identifier + ) { + $declaring_property_node = new DataFlowNode( + $declaring_property_class . '::$' . $stmt->name, + $declaring_property_class . '::$' . $stmt->name, + null, + null + ); + + $data_flow_graph->addNode($declaring_property_node); + + $data_flow_graph->addPath( + $property_node, + $declaring_property_node, + 'property-assignment', + $added_taints, + $removed_taints + ); + } + } + } + + /** + * @return list + */ + private static function analyzeRegularAssignment( + StatementsAnalyzer $statements_analyzer, + PropertyFetch $stmt, + ?PhpParser\Node\Expr $assignment_value, + Context $context, + bool $direct_assignment, + Codebase $codebase, + Union $assignment_value_type, + string $prop_name, + ?string &$var_id + ): array { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + + ExpressionAnalyzer::analyze($statements_analyzer, $stmt->var, $context); + + $context->inside_general_use = $was_inside_general_use; + + $lhs_type = $statements_analyzer->node_data->getType($stmt->var); + + if ($lhs_type === null) { + return []; + } + + $lhs_var_id = ExpressionIdentifier::getVarId( + $stmt->var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $var_id = ExpressionIdentifier::getVarId( + $stmt, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($var_id) { + $context->assigned_var_ids[$var_id] = (int)$stmt->var->getAttribute('startFilePos'); + + if ($direct_assignment && isset($context->protected_var_ids[$var_id])) { + if (IssueBuffer::accepts( + new LoopInvalidation( + 'Variable ' . $var_id . ' has already been assigned in a for/foreach loop', + new CodeLocation($statements_analyzer->getSource(), $stmt->var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + } + } + } + + if ($lhs_type->hasMixed()) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + if ($stmt->name instanceof PhpParser\Node\Identifier) { + $codebase->analyzer->addMixedMemberName( + '$' . $stmt->name->name, + $context->calling_method_id ?: $statements_analyzer->getFileName() + ); + } + + if (IssueBuffer::accepts( + new MixedPropertyAssignment( + $lhs_var_id . ' of type mixed cannot be assigned to', + new CodeLocation($statements_analyzer->getSource(), $stmt->var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + } + + return []; + } + + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); + } + + if ($lhs_type->isNull()) { + if (IssueBuffer::accepts( + new NullPropertyAssignment( + $lhs_var_id . ' of type null cannot be assigned to', + new CodeLocation($statements_analyzer->getSource(), $stmt->var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + } + + return []; + } + + if ($lhs_type->isNullable() && !$lhs_type->ignore_nullable_issues) { + if (IssueBuffer::accepts( + new PossiblyNullPropertyAssignment( + $lhs_var_id . ' with possibly null type \'' . $lhs_type . '\' cannot be assigned to', + new CodeLocation($statements_analyzer->getSource(), $stmt->var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + } + } + + $has_regular_setter = false; + + $invalid_assignment_types = []; + + $has_valid_assignment_type = false; + + $lhs_atomic_types = $lhs_type->getAtomicTypes(); + + $assigned_properties = []; + + $context_type = null; + + while ($lhs_atomic_types) { + $lhs_type_part = array_pop($lhs_atomic_types); + + if ($lhs_type_part instanceof TTemplateParam) { + $lhs_atomic_types = array_merge( + $lhs_atomic_types, + $lhs_type_part->as->getAtomicTypes() + ); + + continue; + } + + $assigned_property = self::analyzeAtomicAssignment( + $statements_analyzer, + $codebase, + $stmt, + $assignment_value, + $prop_name, + $context, + $lhs_type, + $lhs_type_part, + $invalid_assignment_types, + $var_id, + $assignment_value_type, + $lhs_var_id, + $has_valid_assignment_type, + $has_regular_setter + ); + + if ($assigned_property) { + $assigned_properties[] = $assigned_property; + + if ($context_type) { + $context_type = Type::combineUnionTypes( + $context_type, + $assigned_property->assignment_type, + $codebase + ); + } else { + $context_type = $assigned_property->assignment_type; + } + } + } + + if ($invalid_assignment_types) { + $invalid_assignment_type = $invalid_assignment_types[0]; + + if (!$has_valid_assignment_type) { + if (IssueBuffer::accepts( + new InvalidPropertyAssignment( + $lhs_var_id . ' with non-object type \'' . $invalid_assignment_type . + '\' cannot treated as an object', + new CodeLocation($statements_analyzer->getSource(), $stmt->var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + } + } else { + if (IssueBuffer::accepts( + new PossiblyInvalidPropertyAssignment( + $lhs_var_id . ' with possible non-object type \'' . $invalid_assignment_type . + '\' cannot treated as an object', + new CodeLocation($statements_analyzer->getSource(), $stmt->var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + } + } + } + + if (!$has_regular_setter) { + return []; + } + + $context_type = $context_type ?: $assignment_value_type; + + if ($var_id) { + if ($context->collect_initializations + && $lhs_var_id === '$this' + ) { + $context_type->initialized_class = $context->self; + } + + // because we don't want to be assigning for property declarations + $context->vars_in_scope[$var_id] = $context_type; + } + + return $assigned_properties; + } + + /** + * @param list $invalid_assignment_types + */ + private static function analyzeAtomicAssignment( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PropertyFetch $stmt, + ?PhpParser\Node\Expr $assignment_value, + string $prop_name, + Context $context, + Union $lhs_type, + Atomic $lhs_type_part, + array &$invalid_assignment_types, + ?string $var_id, + Union $assignment_value_type, + ?string $lhs_var_id, + bool &$has_valid_assignment_type, + bool &$has_regular_setter + ): ?AssignedProperty { + if ($lhs_type_part instanceof TNull) { + return null; + } + + if ($lhs_type_part instanceof TFalse + && $lhs_type->ignore_falsable_issues + && count($lhs_type->getAtomicTypes()) > 1 + ) { + return null; + } + + if (!$lhs_type_part instanceof TObject && !$lhs_type_part instanceof TNamedObject) { + $invalid_assignment_types[] = (string)$lhs_type_part; + + return null; + } + + $has_valid_assignment_type = true; + + // stdClass and SimpleXMLElement are special cases where we cannot infer the return types + // but we don't want to throw an error + // Hack has a similar issue: https://github.com/facebook/hhvm/issues/5164 + if ($lhs_type_part instanceof TObject || + ( + in_array( + strtolower($lhs_type_part->value), + Config::getInstance()->getUniversalObjectCrates() + [ + 'dateinterval', + 'domdocument', + 'domnode' + ], + true + ) + ) + ) { + if ($var_id) { + if ($lhs_type_part instanceof TNamedObject && + strtolower($lhs_type_part->value) === 'stdclass' + ) { + $context->vars_in_scope[$var_id] = $assignment_value_type; + } else { + $context->vars_in_scope[$var_id] = Type::getMixed(); + } + } + + return null; + } + + if (ExpressionAnalyzer::isMock($lhs_type_part->value)) { + if ($var_id) { + $context->vars_in_scope[$var_id] = Type::getMixed(); + } + + return null; + } + + $intersection_types = $lhs_type_part->getIntersectionTypes() ?: []; + + $fq_class_name = $lhs_type_part->value; + + $override_property_visibility = false; + + $class_exists = false; + $interface_exists = false; + + if (!$codebase->classExists($lhs_type_part->value)) { + if ($codebase->interfaceExists($lhs_type_part->value)) { + $interface_exists = true; + $interface_storage = $codebase->classlike_storage_provider->get( + strtolower($lhs_type_part->value) + ); + + $override_property_visibility = $interface_storage->override_property_visibility; + + foreach ($intersection_types as $intersection_type) { + if ($intersection_type instanceof TNamedObject + && $codebase->classExists($intersection_type->value) + ) { + $fq_class_name = $intersection_type->value; + $class_exists = true; + break; + } + } + + if (!$class_exists) { + if (IssueBuffer::accepts( + new NoInterfaceProperties( + 'Interfaces cannot have properties', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $lhs_type_part->value + ), + $statements_analyzer->getSuppressedIssues() + )) { + return null; + } + + if (!$codebase->methods->methodExists( + new MethodIdentifier( + $fq_class_name, + '__set' + ) + )) { + return null; + } + } + } + + if (!$class_exists && !$interface_exists) { + IssueBuffer::maybeAdd( + new UndefinedClass( + 'Cannot set properties of undefined class ' . $lhs_type_part->value, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $lhs_type_part->value + ), + $statements_analyzer->getSuppressedIssues() + ); + + return null; + } + } else { + $class_exists = true; + } + + $property_id = $fq_class_name . '::$' . $prop_name; + + $has_magic_setter = false; + + $set_method_id = new MethodIdentifier($fq_class_name, '__set'); + + if ((!$codebase->properties->propertyExists($property_id, false, $statements_analyzer, $context) + || ($lhs_var_id !== '$this' + && $fq_class_name !== $context->self + && ClassLikeAnalyzer::checkPropertyVisibility( + $property_id, + $context, + $statements_analyzer, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues(), + false + ) !== true) + ) + && $codebase->methods->methodExists( + $set_method_id, + $context->calling_method_id, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer->getSource(), $stmt) + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $statements_analyzer + : null, + $statements_analyzer->getFilePath() + ) + ) { + $has_magic_setter = true; + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + if ($var_id) { + if (isset($class_storage->pseudo_property_set_types['$' . $prop_name])) { + $class_property_type = TypeExpander::expandUnion( + $codebase, + clone $class_storage->pseudo_property_set_types['$' . $prop_name], + $fq_class_name, + $fq_class_name, + $class_storage->parent_class + ); + + $has_regular_setter = true; + + if (!$context->collect_initializations && !$context->collect_mutations) { + self::taintProperty( + $statements_analyzer, + $stmt, + $property_id, + $class_storage, + $assignment_value_type, + $context + ); + } + + return new AssignedProperty( + $class_property_type, + $property_id, + $assignment_value_type + ); + } + } + + if ($assignment_value) { + self::analyzeSetCall( + $var_id, + $context, + $statements_analyzer, + $stmt, + $prop_name, + $assignment_value + ); + } + + /* + * If we have an explicit list of all allowed magic properties on the class, and we're + * not in that list, fall through + */ + if (!$var_id || !$class_storage->sealed_properties) { + if (!$context->collect_initializations && !$context->collect_mutations) { + self::taintProperty( + $statements_analyzer, + $stmt, + $property_id, + $class_storage, + $assignment_value_type, + $context + ); + } + + return null; + } + + if (!$class_exists) { + IssueBuffer::maybeAdd( + new UndefinedMagicPropertyAssignment( + 'Magic instance property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if (!$class_exists) { + return null; + } + + $has_regular_setter = true; + + if ($stmt->var instanceof PhpParser\Node\Expr\Variable + && $stmt->var->name === 'this' + && $context->self + ) { + $self_property_id = $context->self . '::$' . $prop_name; + + if ($self_property_id !== $property_id + && $codebase->properties->propertyExists( + $self_property_id, + false, + $statements_analyzer, + $context + ) + ) { + $property_id = $self_property_id; + } + } + + if ($statements_analyzer->data_flow_graph + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + self::taintProperty( + $statements_analyzer, + $stmt, + $property_id, + $class_storage, + $assignment_value_type, + $context + ); + } + + if (!$codebase->properties->propertyExists( + $property_id, + false, + $statements_analyzer, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ) + // when property existence is asserted by a plugin it doesn't necessarily has storage + || ($codebase->properties->hasStorage($property_id) + && $codebase->properties->getStorage($property_id)->is_static + ) + ) { + if ($stmt->var instanceof PhpParser\Node\Expr\Variable && $stmt->var->name === 'this') { + // if this is a proper error, we'll see it on the first pass + if ($context->collect_mutations) { + return null; + } + + IssueBuffer::maybeAdd( + new UndefinedThisPropertyAssignment( + 'Instance property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + if ($has_magic_setter) { + IssueBuffer::maybeAdd( + new UndefinedMagicPropertyAssignment( + 'Magic instance property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new UndefinedPropertyAssignment( + 'Instance property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + return null; + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->name, + $property_id + ); + } + + if (!$override_property_visibility) { + if (!$context->collect_mutations) { + if (ClassLikeAnalyzer::checkPropertyVisibility( + $property_id, + $context, + $statements_analyzer, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues() + ) === false) { + return null; + } + } else { + if (ClassLikeAnalyzer::checkPropertyVisibility( + $property_id, + $context, + $statements_analyzer, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues(), + false + ) !== true) { + return null; + } + } + } + + $declaring_property_class = (string)$codebase->properties->getDeclaringClassForProperty( + $property_id, + false + ); + + if ($codebase->properties_to_rename) { + $declaring_property_id = strtolower($declaring_property_class) . '::$' . $prop_name; + + foreach ($codebase->properties_to_rename as $original_property_id => $new_property_name) { + if ($declaring_property_id === $original_property_id) { + $file_manipulations = [ + new FileManipulation( + (int)$stmt->name->getAttribute('startFilePos'), + (int)$stmt->name->getAttribute('endFilePos') + 1, + $new_property_name + ) + ]; + + FileManipulationBuffer::add( + $statements_analyzer->getFilePath(), + $file_manipulations + ); + } + } + } + + $declaring_class_storage = $codebase->classlike_storage_provider->get($declaring_property_class); + + if (isset($declaring_class_storage->properties[$prop_name])) { + $property_storage = $declaring_class_storage->properties[$prop_name]; + + if ($property_storage->deprecated) { + IssueBuffer::maybeAdd( + new DeprecatedProperty( + $property_id . ' is marked deprecated', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($context->self && !NamespaceAnalyzer::isWithinAny($context->self, $property_storage->internal)) { + IssueBuffer::maybeAdd( + new InternalProperty( + $property_id . ' is internal to ' . InternalClass::listToPhrase($property_storage->internal) + . ' but called from ' . $context->self, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + self::trackPropertyImpurity( + $statements_analyzer, + $stmt, + $property_id, + $property_storage, + $declaring_class_storage, + $context + ); + + if (!$property_storage->readonly + && !$context->collect_mutations + && !$context->collect_initializations + && isset($context->vars_in_scope[$lhs_var_id]) + && !$context->vars_in_scope[$lhs_var_id]->allow_mutations + ) { + if ($context->mutation_free) { + IssueBuffer::maybeAdd( + new ImpurePropertyAssignment( + 'Cannot assign to a property from a mutation-free context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_impure = true; + } + } + + if ($property_storage->getter_method) { + $getter_id = $lhs_var_id . '->' . $property_storage->getter_method . '()'; + + unset($context->vars_in_scope[$getter_id]); + } + } + + $class_property_type = $codebase->properties->getPropertyType( + $property_id, + true, + $statements_analyzer, + $context + ); + + if (!$class_property_type + || (isset($declaring_class_storage->properties[$prop_name]) + && !$declaring_class_storage->properties[$prop_name]->type_location) + ) { + if (!$class_property_type) { + $class_property_type = Type::getMixed(); + } + + $source_analyzer = $statements_analyzer->getSource()->getSource(); + + if ($lhs_var_id === '$this' + && $source_analyzer instanceof ClassAnalyzer + ) { + $source_analyzer->inferred_property_types[$prop_name] = Type::combineUnionTypes( + $assignment_value_type, + $source_analyzer->inferred_property_types[$prop_name] ?? null + ); + } + } + + if (!$class_property_type->isMixed()) { + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $class_property_type = TypeExpander::expandUnion( + $codebase, + clone $class_property_type, + $fq_class_name, + $lhs_type_part, + $declaring_class_storage->parent_class, + true, + false, + $class_storage->final + ); + + $class_property_type = Methods::localizeType( + $codebase, + $class_property_type, + $fq_class_name, + $declaring_property_class + ); + + if ($lhs_type_part instanceof TGenericObject) { + $class_property_type = AtomicPropertyFetchAnalyzer::localizePropertyType( + $codebase, + $class_property_type, + $lhs_type_part, + $class_storage, + $declaring_class_storage + ); + } + + $assignment_value_type = Methods::localizeType( + $codebase, + $assignment_value_type, + $fq_class_name, + $declaring_property_class + ); + + if (!$class_property_type->hasMixed() && $assignment_value_type->hasMixed()) { + $origin_locations = []; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + foreach ($assignment_value_type->parent_nodes as $parent_node) { + $origin_locations = array_merge( + $origin_locations, + $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) + ); + } + } + + $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; + + $message = $var_id + ? 'Unable to determine the type that ' . $var_id . ' is being assigned to' + : 'Unable to determine the type of this assignment'; + + if ($origin_location && $origin_location->getLineNumber() === $stmt->getLine()) { + $origin_location = null; + } + + IssueBuffer::maybeAdd( + new MixedAssignment( + $message, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $origin_location + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + return new AssignedProperty( + $class_property_type, + $property_id, + $assignment_value_type + ); + } + + public static function getExpandedPropertyType( + Codebase $codebase, + string $fq_class_name, + string $property_name, + ClassLikeStorage $storage + ): ?Union { + $property_class_name = $codebase->properties->getDeclaringClassForProperty( + $fq_class_name . '::$' . $property_name, + true + ); + + if ($property_class_name === null) { + return null; + } + + $property_class_storage = $codebase->classlike_storage_provider->get($property_class_name); + + $property_storage = $property_class_storage->properties[$property_name]; + + if (!$property_storage->type) { + return null; + } + + $property_type = clone $property_storage->type; + + $fleshed_out_type = !$property_type->isMixed() + ? TypeExpander::expandUnion( + $codebase, + $property_type, + $fq_class_name, + $fq_class_name, + $storage->parent_class, + true, + false, + $storage->final + ) + : $property_type; + + $class_template_params = ClassTemplateParamCollector::collect( + $codebase, + $property_class_storage, + $storage, + null, + new TNamedObject($fq_class_name), + true + ); + + $template_result = new TemplateResult( + $class_template_params ?: [], + [] + ); + + if ($class_template_params) { + $fleshed_out_type = TemplateStandinTypeReplacer::replace( + $fleshed_out_type, + $template_result, + $codebase, + null, + null, + null + ); + } + + return $fleshed_out_type; + } + + private static function analyzeSetCall( + ?string $var_id, + Context $context, + StatementsAnalyzer $statements_analyzer, + PropertyFetch $stmt, + string $prop_name, + Expr $assignment_value + ): void { + if ($var_id) { + $context->removeVarFromConflictingClauses( + $var_id, + Type::getMixed(), + $statements_analyzer + ); + + unset($context->vars_in_scope[$var_id]); + } + + $old_data_provider = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $fake_method_call = new VirtualMethodCall( + $stmt->var, + new VirtualIdentifier('__set', $stmt->name->getAttributes()), + [ + new VirtualArg( + new VirtualString( + $prop_name, + $stmt->name->getAttributes() + ) + ), + new VirtualArg( + $assignment_value + ) + ] + ); + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('PossiblyNullReference', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['PossiblyNullReference']); + } + + MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_method_call, + $context, + false + ); + + if (!in_array('PossiblyNullReference', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['PossiblyNullReference']); + } + + $statements_analyzer->node_data = $old_data_provider; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php new file mode 100644 index 00000000..ebe454a9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php @@ -0,0 +1,342 @@ +self, + $statements_analyzer + ); + + $lhs_type = $statements_analyzer->node_data->getType($stmt->class); + + if (!$lhs_type) { + return null; + } + + $codebase = $statements_analyzer->getCodebase(); + + $prop_name = $stmt->name; + + foreach ($lhs_type->getAtomicTypes() as $lhs_atomic_type) { + if ($lhs_atomic_type instanceof TClassString) { + if (!$lhs_atomic_type->as_type) { + continue; + } + + $lhs_atomic_type = $lhs_atomic_type->as_type; + } + + if (!$lhs_atomic_type instanceof TNamedObject) { + continue; + } + + $fq_class_name = $lhs_atomic_type->value; + + if (!$prop_name instanceof PhpParser\Node\Identifier) { + $was_inside_general_use = $context->inside_general_use; + + $context->inside_general_use = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $prop_name, $context) === false) { + $context->inside_general_use = $was_inside_general_use; + + return false; + } + + $context->inside_general_use = $was_inside_general_use; + + if (!$context->ignore_variable_property) { + $codebase->analyzer->addMixedMemberName( + strtolower($fq_class_name) . '::$', + $context->calling_method_id ?: $statements_analyzer->getFileName() + ); + } + + return null; + } + + $property_id = $fq_class_name . '::$' . $prop_name; + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->class, + $fq_class_name + ); + + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->name, + $property_id + ); + } + + if (!$codebase->properties->propertyExists($property_id, false, $statements_analyzer, $context)) { + IssueBuffer::maybeAdd( + new UndefinedPropertyAssignment( + 'Static property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + return null; + } + + if (ClassLikeAnalyzer::checkPropertyVisibility( + $property_id, + $context, + $statements_analyzer, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues() + ) === false) { + return false; + } + + $declaring_property_class = (string) $codebase->properties->getDeclaringClassForProperty( + $fq_class_name . '::$' . $prop_name->name, + false + ); + + $declaring_property_id = strtolower($declaring_property_class) . '::$' . $prop_name; + + if ($codebase->alter_code && $stmt->class instanceof PhpParser\Node\Name) { + $moved_class = $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $stmt->class, + $fq_class_name, + $context->calling_method_id + ); + + if (!$moved_class) { + foreach ($codebase->property_transforms as $original_pattern => $transformation) { + if ($declaring_property_id === $original_pattern) { + [$old_declaring_fq_class_name] = explode('::$', $declaring_property_id); + [$new_fq_class_name, $new_property_name] = explode('::$', $transformation); + + $file_manipulations = []; + + if (strtolower($new_fq_class_name) !== $old_declaring_fq_class_name) { + $file_manipulations[] = new FileManipulation( + (int) $stmt->class->getAttribute('startFilePos'), + (int) $stmt->class->getAttribute('endFilePos') + 1, + Type::getStringFromFQCLN( + $new_fq_class_name, + $statements_analyzer->getNamespace(), + $statements_analyzer->getAliasedClassesFlipped(), + null + ) + ); + } + + $file_manipulations[] = new FileManipulation( + (int) $stmt->name->getAttribute('startFilePos'), + (int) $stmt->name->getAttribute('endFilePos') + 1, + '$' . $new_property_name + ); + + FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); + } + } + } + } + + $class_storage = $codebase->classlike_storage_provider->get($declaring_property_class); + + if ($var_id) { + $context->vars_in_scope[$var_id] = $assignment_value_type; + } + + $class_property_type = $codebase->properties->getPropertyType( + $property_id, + true, + $statements_analyzer, + $context + ); + + if (!$class_property_type) { + $class_property_type = Type::getMixed(); + + $source_analyzer = $statements_analyzer->getSource()->getSource(); + + $prop_name_name = $prop_name->name; + + if ($source_analyzer instanceof ClassAnalyzer + && $fq_class_name === $source_analyzer->getFQCLN() + ) { + $source_analyzer->inferred_property_types[$prop_name_name] = Type::combineUnionTypes( + $assignment_value_type, + $source_analyzer->inferred_property_types[$prop_name_name] ?? null + ); + } + } else { + $class_property_type = clone $class_property_type; + } + + if ($assignment_value_type->hasMixed()) { + return null; + } + + if ($class_property_type->hasMixed()) { + return null; + } + + $class_property_type = TypeExpander::expandUnion( + $codebase, + $class_property_type, + $fq_class_name, + $fq_class_name, + $class_storage->parent_class + ); + + $union_comparison_results = new TypeComparisonResult(); + + $type_match_found = UnionTypeComparator::isContainedBy( + $codebase, + $assignment_value_type, + $class_property_type, + true, + true, + $union_comparison_results + ); + + if ($union_comparison_results->type_coerced) { + if ($union_comparison_results->type_coerced_from_mixed) { + IssueBuffer::maybeAdd( + new MixedPropertyTypeCoercion( + $var_id . ' expects \'' . $class_property_type->getId() . '\', ' + . ' parent type `' . $assignment_value_type->getId() . '` provided', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt, + $context->include_location + ), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new PropertyTypeCoercion( + $var_id . ' expects \'' . $class_property_type->getId() . '\', ' + . ' parent type \'' . $assignment_value_type->getId() . '\' provided', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt, + $context->include_location + ), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($union_comparison_results->to_string_cast) { + IssueBuffer::maybeAdd( + new ImplicitToStringCast( + $var_id . ' expects \'' . $class_property_type . '\', ' + . '\'' . $assignment_value_type . '\' provided with a __toString method', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt, + $context->include_location + ) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (!$type_match_found && !$union_comparison_results->type_coerced) { + if (UnionTypeComparator::canBeContainedBy($codebase, $assignment_value_type, $class_property_type)) { + if (IssueBuffer::accepts( + new PossiblyInvalidPropertyAssignmentValue( + $var_id . ' with declared type \'' + . $class_property_type->getId() . '\' cannot be assigned type \'' + . $assignment_value_type->getId() . '\'', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt + ), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } else { + if (IssueBuffer::accepts( + new InvalidPropertyAssignmentValue( + $var_id . ' with declared type \'' . $class_property_type->getId() + . '\' cannot be assigned type \'' + . $assignment_value_type->getId() . '\'', + new CodeLocation( + $statements_analyzer->getSource(), + $assignment_value ?? $stmt + ), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } + } + + if ($var_id) { + $context->vars_in_scope[$var_id] = $assignment_value_type; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php new file mode 100644 index 00000000..51e91919 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php @@ -0,0 +1,1728 @@ +getFQCLN(), + $statements_analyzer + ); + + // gets a variable id that *may* contain array keys + $array_var_id = ExpressionIdentifier::getArrayVarId( + $assign_var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $var_comments = []; + $comment_type = null; + $comment_type_location = null; + + $was_in_assignment = $context->inside_assignment; + + $context->inside_assignment = true; + + $codebase = $statements_analyzer->getCodebase(); + + $base_assign_value = $assign_value; + + while ($base_assign_value instanceof PhpParser\Node\Expr\Assign) { + $base_assign_value = $base_assign_value->expr; + } + + if ($base_assign_value !== $assign_value) { + ExpressionAnalyzer::analyze($statements_analyzer, $base_assign_value, $context); + + $assign_value_type = $statements_analyzer->node_data->getType($base_assign_value) ?? $assign_value_type; + } + + $removed_taints = []; + + if ($doc_comment) { + $file_path = $statements_analyzer->getRootFilePath(); + + $file_storage_provider = $codebase->file_storage_provider; + + $file_storage = $file_storage_provider->get($file_path); + + $template_type_map = $statements_analyzer->getTemplateTypeMap(); + + try { + $var_comments = $codebase->config->disable_var_parsing + ? [] + : CommentAnalyzer::getTypeFromComment( + $doc_comment, + $statements_analyzer->getSource(), + $statements_analyzer->getAliases(), + $template_type_map, + $file_storage->type_aliases + ); + } catch (IncorrectDocblockException $e) { + IssueBuffer::maybeAdd( + new MissingDocblockType( + $e->getMessage(), + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ) + ); + } catch (DocblockParseException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ) + ); + } + + foreach ($var_comments as $var_comment) { + if ($var_comment->removed_taints) { + $removed_taints = $var_comment->removed_taints; + } + + self::assignTypeFromVarDocblock( + $statements_analyzer, + $assign_var, + $var_comment, + $context, + $var_id, + $comment_type, + $comment_type_location, + $not_ignored_docblock_var_ids + ); + + if ($var_id === $var_comment->var_id && $assign_value_type && $comment_type) { + $comment_type->by_ref = $assign_value_type->by_ref; + } + } + } + + if ($array_var_id) { + unset($context->referenced_var_ids[$array_var_id]); + $context->assigned_var_ids[$array_var_id] = (int) $assign_var->getAttribute('startFilePos'); + $context->possibly_assigned_var_ids[$array_var_id] = true; + } + + if ($assign_value) { + if ($var_id && $assign_value instanceof PhpParser\Node\Expr\Closure) { + foreach ($assign_value->uses as $closure_use) { + if ($closure_use->byRef + && is_string($closure_use->var->name) + && $var_id === '$' . $closure_use->var->name + ) { + $context->vars_in_scope[$var_id] = Type::getClosure(); + $context->vars_possibly_in_scope[$var_id] = true; + } + } + } + + $was_inside_general_use = $context->inside_general_use; + + $root_expr = $assign_var; + + while ($root_expr instanceof PhpParser\Node\Expr\ArrayDimFetch) { + $root_expr = $root_expr->var; + } + + // if we don't know where this data is going, treat as a dead-end usage + if (!$root_expr instanceof PhpParser\Node\Expr\Variable + || (is_string($root_expr->name) + && in_array('$' . $root_expr->name, VariableFetchAnalyzer::SUPER_GLOBALS, true)) + ) { + $context->inside_general_use = true; + } + + if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_value, $context) === false) { + $context->inside_general_use = $was_inside_general_use; + + if ($var_id) { + if ($array_var_id) { + $context->removeDescendents($array_var_id, null, $assign_value_type); + } + + // if we're not exiting immediately, make everything mixed + $context->vars_in_scope[$var_id] = $comment_type ?? Type::getMixed(); + } + + return false; + } + + $context->inside_general_use = $was_inside_general_use; + } + + if ($comment_type && $comment_type_location) { + $temp_assign_value_type = $assign_value_type + ?? ($assign_value ? $statements_analyzer->node_data->getType($assign_value) : null); + + if ($codebase->find_unused_variables + && $temp_assign_value_type + && $array_var_id + && (!$not_ignored_docblock_var_ids || isset($not_ignored_docblock_var_ids[$array_var_id])) + && $temp_assign_value_type->getId() === $comment_type->getId() + && !$comment_type->isMixed() + ) { + if ($codebase->alter_code + && isset($statements_analyzer->getProjectAnalyzer()->getIssuesToFix()['UnnecessaryVarAnnotation']) + ) { + FileManipulationBuffer::addVarAnnotationToRemove($comment_type_location); + } elseif (IssueBuffer::accepts( + new UnnecessaryVarAnnotation( + 'The @var ' . $comment_type . ' annotation for ' + . $array_var_id . ' is unnecessary', + $comment_type_location + ), + $statements_analyzer->getSuppressedIssues(), + true + )) { + // fall through + } + } + + $parent_nodes = $temp_assign_value_type->parent_nodes ?? []; + + $assign_value_type = $comment_type; + $assign_value_type->parent_nodes = $parent_nodes; + } elseif (!$assign_value_type) { + if ($assign_value) { + $assign_value_type = $statements_analyzer->node_data->getType($assign_value); + } + + if ($assign_value_type) { + $assign_value_type = clone $assign_value_type; + $assign_value_type->from_property = false; + $assign_value_type->from_static_property = false; + $assign_value_type->ignore_isset = false; + } else { + $assign_value_type = Type::getMixed(); + } + } + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + && !$assign_value_type->parent_nodes + ) { + if ($array_var_id) { + $assignment_node = DataFlowNode::getForAssignment( + $array_var_id, + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ); + } else { + $assignment_node = new DataFlowNode('unknown-origin', 'unknown origin', null); + } + + $assign_value_type->parent_nodes = [ + $assignment_node->id => $assignment_node + ]; + + if ($context->inside_try) { + // Copy previous assignment's parent nodes inside a try. Since an exception could be thrown at any + // point this is a workaround to ensure that use of a variable also uses all previous assignments. + if (isset($context->vars_in_scope[$array_var_id])) { + $assign_value_type->parent_nodes += $context->vars_in_scope[$array_var_id]->parent_nodes; + } + } + } + + if ($array_var_id && isset($context->vars_in_scope[$array_var_id])) { + if ($context->vars_in_scope[$array_var_id]->by_ref) { + if ($context->mutation_free) { + IssueBuffer::maybeAdd( + new ImpureByReferenceAssignment( + 'Variable ' . $array_var_id . ' cannot be assigned to as it is passed by reference', + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ) + ); + } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_impure = true; + $statements_analyzer->getSource()->inferred_has_mutation = true; + } + + $assign_value_type->by_ref = true; + } + + // removes dependent vars from $context + $context->removeDescendents( + $array_var_id, + $context->vars_in_scope[$array_var_id], + $assign_value_type, + $statements_analyzer + ); + } else { + $root_var_id = ExpressionIdentifier::getRootVarId( + $assign_var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($root_var_id && isset($context->vars_in_scope[$root_var_id])) { + $context->removeVarFromConflictingClauses( + $root_var_id, + $context->vars_in_scope[$root_var_id], + $statements_analyzer + ); + } + } + + $codebase = $statements_analyzer->getCodebase(); + + if ($assign_value_type->hasMixed()) { + $root_var_id = ExpressionIdentifier::getRootVarId( + $assign_var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + if (!$assign_var instanceof PhpParser\Node\Expr\PropertyFetch + && !strpos($root_var_id ?? '', '->') + && !$comment_type + && strpos($var_id ?? '', '$_') !== 0 + ) { + $origin_locations = []; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + foreach ($assign_value_type->parent_nodes as $parent_node) { + $origin_locations = array_merge( + $origin_locations, + $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) + ); + } + } + + $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; + + $message = $var_id + ? 'Unable to determine the type that ' . $var_id . ' is being assigned to' + : 'Unable to determine the type of this assignment'; + + $issue_location = new CodeLocation($statements_analyzer->getSource(), $assign_var); + + if ($origin_location && $origin_location->getHash() === $issue_location->getHash()) { + $origin_location = null; + } + + IssueBuffer::maybeAdd( + new MixedAssignment( + $message, + $issue_location, + $origin_location + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } else { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); + } + + if ($var_id + && isset($context->byref_constraints[$var_id]) + && ($outer_constraint_type = $context->byref_constraints[$var_id]->type) + ) { + if (!UnionTypeComparator::isContainedBy( + $codebase, + $assign_value_type, + $outer_constraint_type, + $assign_value_type->ignore_nullable_issues, + $assign_value_type->ignore_falsable_issues + ) + ) { + IssueBuffer::maybeAdd( + new ReferenceConstraintViolation( + 'Variable ' . $var_id . ' is limited to values of type ' + . $context->byref_constraints[$var_id]->type + . ' because it is passed by reference, ' + . $assign_value_type->getId() . ' type found', + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + if ($var_id === '$this' && IssueBuffer::accepts( + new InvalidScope( + 'Cannot re-assign ' . $var_id, + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + if (isset($context->protected_var_ids[$var_id]) + && $assign_value_type->hasLiteralInt() + ) { + IssueBuffer::maybeAdd( + new LoopInvalidation( + 'Variable ' . $var_id . ' has already been assigned in a for/foreach loop', + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($assign_var instanceof PhpParser\Node\Expr\Variable) { + self::analyzeAssignmentToVariable( + $statements_analyzer, + $codebase, + $assign_var, + $assign_value, + $assign_value_type, + $var_id, + $context + ); + } elseif ($assign_var instanceof PhpParser\Node\Expr\List_ + || $assign_var instanceof PhpParser\Node\Expr\Array_ + ) { + self::analyzeDestructuringAssignment( + $statements_analyzer, + $codebase, + $assign_var, + $assign_value, + $assign_value_type, + $context, + $doc_comment, + $array_var_id, + $var_comments, + $removed_taints + ); + } elseif ($assign_var instanceof PhpParser\Node\Expr\ArrayDimFetch) { + ArrayAssignmentAnalyzer::analyze( + $statements_analyzer, + $assign_var, + $context, + $assign_value, + $assign_value_type + ); + } elseif ($assign_var instanceof PhpParser\Node\Expr\PropertyFetch) { + self::analyzePropertyAssignment( + $statements_analyzer, + $codebase, + $assign_var, + $context, + $assign_value, + $assign_value_type, + $var_id + ); + } elseif ($assign_var instanceof PhpParser\Node\Expr\StaticPropertyFetch && + $assign_var->class instanceof PhpParser\Node\Name + ) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_var, $context) === false) { + return false; + } + + if ($context->check_classes) { + if (StaticPropertyAssignmentAnalyzer::analyze( + $statements_analyzer, + $assign_var, + $assign_value, + $assign_value_type, + $context + ) === false) { + return false; + } + } + + if ($var_id) { + $context->vars_possibly_in_scope[$var_id] = true; + } + } + + if ($var_id && isset($context->vars_in_scope[$var_id])) { + if ($context->vars_in_scope[$var_id]->isVoid()) { + IssueBuffer::maybeAdd( + new AssignmentToVoid( + 'Cannot assign ' . $var_id . ' to type void', + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ), + $statements_analyzer->getSuppressedIssues() + ); + + $context->vars_in_scope[$var_id] = Type::getNull(); + + $context->inside_assignment = $was_in_assignment; + + return $context->vars_in_scope[$var_id]; + } + + if ($context->vars_in_scope[$var_id]->isNever()) { + if (IssueBuffer::accepts( + new NoValue( + 'This function or method call never returns output', + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + $context->vars_in_scope[$var_id] = Type::getEmpty(); + + $context->inside_assignment = $was_in_assignment; + + return $context->vars_in_scope[$var_id]; + } + + if ($statements_analyzer->data_flow_graph) { + $data_flow_graph = $statements_analyzer->data_flow_graph; + + if ($context->vars_in_scope[$var_id]->parent_nodes) { + $context->vars_in_scope[$var_id] = clone $context->vars_in_scope[$var_id]; + + if ($data_flow_graph instanceof TaintFlowGraph + && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + $context->vars_in_scope[$var_id]->parent_nodes = []; + } else { + $var_location = new CodeLocation($statements_analyzer->getSource(), $assign_var); + + $event = new AddRemoveTaintsEvent($assign_var, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = array_merge( + $removed_taints, + $codebase->config->eventDispatcher->dispatchRemoveTaints($event) + ); + + self::taintAssignment( + $context->vars_in_scope[$var_id], + $data_flow_graph, + $var_id, + $var_location, + $removed_taints, + $added_taints + ); + } + } + } + } + + $context->inside_assignment = $was_in_assignment; + + return $assign_value_type; + } + + public static function assignTypeFromVarDocblock( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node $stmt, + VarDocblockComment $var_comment, + Context $context, + ?string $var_id = null, + ?Union &$comment_type = null, + ?DocblockTypeLocation &$comment_type_location = null, + array $not_ignored_docblock_var_ids = [] + ): void { + if (!$var_comment->type) { + return; + } + + $codebase = $statements_analyzer->getCodebase(); + + try { + $var_comment_type = TypeExpander::expandUnion( + $codebase, + $var_comment->type, + $context->self, + $context->self, + $statements_analyzer->getParentFQCLN() + ); + + $var_comment_type->setFromDocblock(); + + $var_comment_type->check( + $statements_analyzer, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues(), + [], + false, + false, + false, + $context->calling_method_id + ); + + $type_location = null; + + if ($var_comment->type_start + && $var_comment->type_end + && $var_comment->line_number + ) { + $type_location = new DocblockTypeLocation( + $statements_analyzer, + $var_comment->type_start, + $var_comment->type_end, + $var_comment->line_number + ); + + if ($codebase->alter_code) { + $codebase->classlikes->handleDocblockTypeInMigration( + $codebase, + $statements_analyzer, + $var_comment_type, + $type_location, + $context->calling_method_id + ); + } + } + + if (!$var_comment->var_id || $var_comment->var_id === $var_id) { + $comment_type = $var_comment_type; + $comment_type_location = $type_location; + return; + } + + $project_analyzer = $statements_analyzer->getProjectAnalyzer(); + + if ($codebase->find_unused_variables + && $type_location + && (!$not_ignored_docblock_var_ids || isset($not_ignored_docblock_var_ids[$var_comment->var_id])) + && isset($context->vars_in_scope[$var_comment->var_id]) + && $context->vars_in_scope[$var_comment->var_id]->getId() === $var_comment_type->getId() + && !$var_comment_type->isMixed() + ) { + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['UnnecessaryVarAnnotation']) + ) { + FileManipulationBuffer::addVarAnnotationToRemove($type_location); + } elseif (IssueBuffer::accepts( + new UnnecessaryVarAnnotation( + 'The @var ' . $var_comment_type . ' annotation for ' + . $var_comment->var_id . ' is unnecessary', + $type_location + ), + $statements_analyzer->getSuppressedIssues(), + true + )) { + // fall through + } + } + + $parent_nodes = $context->vars_in_scope[$var_comment->var_id]->parent_nodes ?? []; + $var_comment_type->parent_nodes = $parent_nodes; + + $context->vars_in_scope[$var_comment->var_id] = $var_comment_type; + } catch (UnexpectedValueException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($statements_analyzer->getSource(), $stmt) + ) + ); + } + } + + /** + * @param array $removed_taints + * @param array $added_taints + */ + private static function taintAssignment( + Union $type, + DataFlowGraph $data_flow_graph, + string $var_id, + CodeLocation $var_location, + array $removed_taints, + array $added_taints + ): void { + $parent_nodes = $type->parent_nodes; + + $unspecialized_parent_nodes = array_filter( + $parent_nodes, + function ($parent_node) { + return !$parent_node->specialization_key; + } + ); + + $specialized_parent_nodes = array_filter( + $parent_nodes, + function ($parent_node) { + return (bool) $parent_node->specialization_key; + } + ); + + $new_parent_nodes = []; + + foreach ($specialized_parent_nodes as $parent_node) { + $new_parent_node = DataFlowNode::getForAssignment($var_id, $var_location); + $new_parent_node->specialization_key = $parent_node->specialization_key; + + $data_flow_graph->addNode($new_parent_node); + $new_parent_nodes += [$new_parent_node->id => $new_parent_node]; + $data_flow_graph->addPath( + $parent_node, + $new_parent_node, + '=', + $added_taints, + $removed_taints + ); + } + + if ($unspecialized_parent_nodes) { + $new_parent_node = DataFlowNode::getForAssignment($var_id, $var_location); + $data_flow_graph->addNode($new_parent_node); + $new_parent_nodes += [$new_parent_node->id => $new_parent_node]; + + foreach ($unspecialized_parent_nodes as $parent_node) { + $data_flow_graph->addPath( + $parent_node, + $new_parent_node, + '=', + $added_taints, + $removed_taints + ); + } + } + + $type->parent_nodes = $new_parent_nodes; + } + + public static function analyzeAssignmentOperation( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\AssignOp $stmt, + Context $context + ): bool { + if ($stmt instanceof PhpParser\Node\Expr\AssignOp\BitwiseAnd) { + $operation = new VirtualBitwiseAnd($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\BitwiseOr) { + $operation = new VirtualBitwiseOr($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\BitwiseXor) { + $operation = new VirtualBitwiseXor($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Coalesce) { + $operation = new VirtualCoalesce($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Concat) { + $operation = new VirtualConcat($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Div) { + $operation = new VirtualDiv($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Minus) { + $operation = new VirtualMinus($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Mod) { + $operation = new VirtualMod($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Mul) { + $operation = new VirtualMul($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Plus) { + $operation = new VirtualPlus($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Pow) { + $operation = new VirtualPow($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\ShiftLeft) { + $operation = new VirtualShiftLeft($stmt->var, $stmt->expr, $stmt->getAttributes()); + } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\ShiftRight) { + $operation = new VirtualShiftRight($stmt->var, $stmt->expr, $stmt->getAttributes()); + } else { + throw new UnexpectedValueException('Unknown assign op'); + } + + $fake_assignment = new VirtualAssign( + $stmt->var, + $operation, + $stmt->getAttributes() + ); + + $old_node_data = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $fake_assignment, $context) === false) { + return false; + } + + $old_node_data->setType( + $stmt, + $statements_analyzer->node_data->getType($operation) ?? Type::getMixed() + ); + + $statements_analyzer->node_data = $old_node_data; + + return true; + } + + public static function analyzeAssignmentRef( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\AssignRef $stmt, + Context $context + ): bool { + $assignment_type = self::analyze( + $statements_analyzer, + $stmt->var, + $stmt->expr, + null, + $context, + $stmt->getDocComment() + ); + + if ($assignment_type === false) { + return false; + } + + $assignment_type->by_ref = true; + + $lhs_var_id = ExpressionIdentifier::getArrayVarId( + $stmt->var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $rhs_var_id = ExpressionIdentifier::getArrayVarId( + $stmt->expr, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($lhs_var_id) { + $context->vars_in_scope[$lhs_var_id] = $assignment_type; + $context->hasVariable($lhs_var_id); + $context->byref_constraints[$lhs_var_id] = new ReferenceConstraint(); + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + foreach ($context->vars_in_scope[$lhs_var_id]->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use' + ); + } + } + } + + if ($rhs_var_id) { + if (!isset($context->vars_in_scope[$rhs_var_id])) { + $context->vars_in_scope[$rhs_var_id] = Type::getMixed(); + } + + $context->byref_constraints[$rhs_var_id] = new ReferenceConstraint(); + } + + if ($statements_analyzer->data_flow_graph + && $lhs_var_id + && $rhs_var_id + && isset($context->vars_in_scope[$rhs_var_id]) + ) { + $rhs_type = $context->vars_in_scope[$rhs_var_id]; + + $data_flow_graph = $statements_analyzer->data_flow_graph; + + $lhs_location = new CodeLocation($statements_analyzer->getSource(), $stmt->var); + + $lhs_node = DataFlowNode::getForAssignment($lhs_var_id, $lhs_location); + + foreach ($rhs_type->parent_nodes as $byref_destination_node) { + $data_flow_graph->addPath($lhs_node, $byref_destination_node, '='); + } + } + + return true; + } + + public static function assignByRefParam( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $stmt, + Union $by_ref_type, + Union $by_ref_out_type, + Context $context, + bool $constrain_type = true, + bool $prevent_null = false + ): void { + if ($stmt instanceof PhpParser\Node\Expr\PropertyFetch && $stmt->name instanceof PhpParser\Node\Identifier) { + $prop_name = $stmt->name->name; + + InstancePropertyAssignmentAnalyzer::analyze( + $statements_analyzer, + $stmt, + $prop_name, + null, + $by_ref_out_type, + $context + ); + + return; + } + + $var_id = ExpressionIdentifier::getVarId( + $stmt, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($var_id) { + $var_not_in_scope = false; + + if (!$by_ref_type->hasMixed() && $constrain_type) { + $context->byref_constraints[$var_id] = new ReferenceConstraint($by_ref_type); + } + + if (!$context->hasVariable($var_id)) { + $context->vars_possibly_in_scope[$var_id] = true; + + $location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + if (!$statements_analyzer->hasVariable($var_id)) { + if ($constrain_type + && $prevent_null + && !$by_ref_type->isMixed() + && !$by_ref_type->isNullable() + && !strpos($var_id, '->') + && !strpos($var_id, '::') + ) { + IssueBuffer::maybeAdd( + new NullReference( + 'Not expecting null argument passed by reference', + $location + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\Variable) { + $statements_analyzer->registerVariable( + $var_id, + $location, + $context->branch_point + ); + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + $byref_node = DataFlowNode::getForAssignment($var_id, $location); + + $statements_analyzer->data_flow_graph->addPath( + $byref_node, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use' + ); + } + } + + $context->hasVariable($var_id); + } else { + $var_not_in_scope = true; + } + } elseif ($var_id === '$this') { + // don't allow changing $this + return; + } else { + $existing_type = $context->vars_in_scope[$var_id]; + + // removes dependent vars from $context + $context->removeDescendents( + $var_id, + $existing_type, + $by_ref_type, + $statements_analyzer + ); + + $by_ref_out_type = clone $by_ref_out_type; + + if ($existing_type->parent_nodes) { + $by_ref_out_type->parent_nodes += $existing_type->parent_nodes; + } + + if ($existing_type->getId() !== 'array') { + $context->vars_in_scope[$var_id] = $by_ref_out_type; + + if (!($stmt_type = $statements_analyzer->node_data->getType($stmt)) + || $stmt_type->isEmpty() + ) { + $statements_analyzer->node_data->setType($stmt, clone $by_ref_type); + } + + return; + } + } + + $context->assigned_var_ids[$var_id] = (int) $stmt->getAttribute('startFilePos'); + + $context->vars_in_scope[$var_id] = $by_ref_out_type; + + $stmt_type = $statements_analyzer->node_data->getType($stmt); + + if (!$stmt_type || $stmt_type->isEmpty()) { + $statements_analyzer->node_data->setType($stmt, clone $by_ref_type); + } + + if ($var_not_in_scope && $stmt instanceof PhpParser\Node\Expr\Variable) { + $statements_analyzer->registerPossiblyUndefinedVariable($var_id, $stmt); + } + } + } + + /** + * @param PhpParser\Node\Expr\List_|PhpParser\Node\Expr\Array_ $assign_var + * @param list $var_comments + * @param list $removed_taints + */ + private static function analyzeDestructuringAssignment( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr $assign_var, + ?PhpParser\Node\Expr $assign_value, + Union $assign_value_type, + Context $context, + ?PhpParser\Comment\Doc $doc_comment, + ?string $array_var_id, + array $var_comments, + array $removed_taints + ): void { + if (!$assign_value_type->hasArray() + && !$assign_value_type->isMixed() + && !$assign_value_type->hasArrayAccessInterface($codebase) + ) { + IssueBuffer::maybeAdd( + new InvalidArrayOffset( + 'Cannot destructure non-array of type ' . $assign_value_type->getId(), + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $can_be_empty = true; + + foreach ($assign_var->items as $offset => $assign_var_item) { + // $assign_var_item can be null e.g. list($a, ) = ['a', 'b'] + if (!$assign_var_item) { + continue; + } + + $var = $assign_var_item->value; + + if ($assign_value instanceof PhpParser\Node\Expr\Array_ + && $statements_analyzer->node_data->getType($assign_var_item->value) + ) { + self::analyze( + $statements_analyzer, + $var, + $assign_var_item->value, + null, + $context, + $doc_comment + ); + + continue; + } + + $offset_value = null; + + if (!$assign_var_item->key) { + $offset_value = $offset; + } elseif ($assign_var_item->key instanceof PhpParser\Node\Scalar\String_) { + $offset_value = $assign_var_item->key->value; + } + + $list_var_id = ExpressionIdentifier::getArrayVarId( + $var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $new_assign_type = null; + $assigned = false; + $has_null = false; + + foreach ($assign_value_type->getAtomicTypes() as $assign_value_atomic_type) { + if ($assign_value_atomic_type instanceof TKeyedArray + && !$assign_var_item->key + ) { + // if object-like has int offsets + if ($offset_value !== null + && isset($assign_value_atomic_type->properties[$offset_value]) + ) { + $value_type = $assign_value_atomic_type->properties[$offset_value]; + + if ($value_type->possibly_undefined) { + IssueBuffer::maybeAdd( + new PossiblyUndefinedArrayOffset( + 'Possibly undefined array key', + new CodeLocation($statements_analyzer->getSource(), $var) + ), + $statements_analyzer->getSuppressedIssues() + ); + + $value_type = clone $value_type; + $value_type->possibly_undefined = false; + } + + if ($statements_analyzer->data_flow_graph + && $assign_value + ) { + $assign_value_id = ExpressionIdentifier::getArrayVarId( + $assign_value, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $keyed_array_var_id = null; + + if ($assign_value_id) { + $keyed_array_var_id = $assign_value_id . '[\'' . $offset_value . '\']'; + } + + ArrayFetchAnalyzer::taintArrayFetch( + $statements_analyzer, + $assign_value, + $keyed_array_var_id, + $value_type, + Type::getString((string)$offset_value) + ); + } + + self::analyze( + $statements_analyzer, + $var, + null, + $value_type, + $context, + $doc_comment + ); + + $assigned = true; + + continue; + } + + if ($assign_value_atomic_type->sealed) { + IssueBuffer::maybeAdd( + new InvalidArrayOffset( + 'Cannot access value with offset ' . $offset, + new CodeLocation($statements_analyzer->getSource(), $var) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($assign_value_atomic_type instanceof TMixed) { + IssueBuffer::maybeAdd( + new MixedArrayAccess( + 'Cannot access array value on mixed variable ' . $array_var_id, + new CodeLocation($statements_analyzer->getSource(), $var) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($assign_value_atomic_type instanceof TNull) { + $has_null = true; + } elseif (!$assign_value_atomic_type instanceof TArray + && !$assign_value_atomic_type instanceof TKeyedArray + && !$assign_value_atomic_type instanceof TList + && !$assign_value_type->hasArrayAccessInterface($codebase) + ) { + if ($assign_value_type->hasArray()) { + if ($assign_value_atomic_type instanceof TFalse && $assign_value_type->ignore_falsable_issues) { + // do nothing + } elseif (IssueBuffer::accepts( + new PossiblyInvalidArrayAccess( + 'Cannot access array value on non-array variable ' + . $array_var_id . ' of type ' . $assign_value_atomic_type->getId(), + new CodeLocation($statements_analyzer->getSource(), $var) + ), + $statements_analyzer->getSuppressedIssues() + ) + ) { + // do nothing + } + } else { + if (IssueBuffer::accepts( + new InvalidArrayAccess( + 'Cannot access array value on non-array variable ' + . $array_var_id . ' of type ' . $assign_value_atomic_type->getId(), + new CodeLocation($statements_analyzer->getSource(), $var) + ), + $statements_analyzer->getSuppressedIssues() + ) + ) { + // do nothing + } + } + } + + if ($var instanceof PhpParser\Node\Expr\List_ + || $var instanceof PhpParser\Node\Expr\Array_ + ) { + if ($assign_value_atomic_type instanceof TKeyedArray) { + $assign_value_atomic_type = $assign_value_atomic_type->getGenericArrayType(); + } + + if ($assign_value_atomic_type instanceof TList) { + $assign_value_atomic_type = new TArray([ + Type::getInt(), + $assign_value_atomic_type->type_param + ]); + } + + $array_value_type = $assign_value_atomic_type instanceof TArray + ? clone $assign_value_atomic_type->type_params[1] + : Type::getMixed(); + + self::analyze( + $statements_analyzer, + $var, + null, + $array_value_type, + $context, + $doc_comment + ); + + continue; + } + + if ($list_var_id) { + $context->vars_possibly_in_scope[$list_var_id] = true; + $context->assigned_var_ids[$list_var_id] = (int)$var->getAttribute('startFilePos'); + $context->possibly_assigned_var_ids[$list_var_id] = true; + + $already_in_scope = isset($context->vars_in_scope[$list_var_id]); + + if (strpos($list_var_id, '-') === false && strpos($list_var_id, '[') === false) { + $location = new CodeLocation($statements_analyzer, $var); + + if (!$statements_analyzer->hasVariable($list_var_id)) { + $statements_analyzer->registerVariable( + $list_var_id, + $location, + $context->branch_point + ); + } else { + $statements_analyzer->registerVariableAssignment( + $list_var_id, + $location + ); + } + + if (isset($context->byref_constraints[$list_var_id])) { + // something + } + } + + if ($assign_value_atomic_type instanceof TArray) { + $new_assign_type = clone $assign_value_atomic_type->type_params[1]; + + if ($statements_analyzer->data_flow_graph + && $assign_value + ) { + ArrayFetchAnalyzer::taintArrayFetch( + $statements_analyzer, + $assign_value, + null, + $new_assign_type, + Type::getArrayKey() + ); + } + + $can_be_empty = !$assign_value_atomic_type instanceof TNonEmptyArray; + } elseif ($assign_value_atomic_type instanceof TList) { + $new_assign_type = clone $assign_value_atomic_type->type_param; + + if ($statements_analyzer->data_flow_graph && $assign_value) { + ArrayFetchAnalyzer::taintArrayFetch( + $statements_analyzer, + $assign_value, + null, + $new_assign_type, + Type::getArrayKey() + ); + } + + $can_be_empty = !$assign_value_atomic_type instanceof TNonEmptyList; + } elseif ($assign_value_atomic_type instanceof TKeyedArray) { + if (($assign_var_item->key instanceof PhpParser\Node\Scalar\String_ + || $assign_var_item->key instanceof PhpParser\Node\Scalar\LNumber) + && isset($assign_value_atomic_type->properties[$assign_var_item->key->value]) + ) { + $new_assign_type = + clone $assign_value_atomic_type->properties[$assign_var_item->key->value]; + + if ($new_assign_type->possibly_undefined) { + IssueBuffer::maybeAdd( + new PossiblyUndefinedArrayOffset( + 'Possibly undefined array key', + new CodeLocation($statements_analyzer->getSource(), $var) + ), + $statements_analyzer->getSuppressedIssues() + ); + + $new_assign_type->possibly_undefined = false; + } + } + + if ($statements_analyzer->data_flow_graph && $assign_value && $new_assign_type) { + ArrayFetchAnalyzer::taintArrayFetch( + $statements_analyzer, + $assign_value, + null, + $new_assign_type, + Type::getArrayKey() + ); + } + + $can_be_empty = !$assign_value_atomic_type->sealed; + } elseif ($assign_value_atomic_type->hasArrayAccessInterface($codebase)) { + ForeachAnalyzer::getKeyValueParamsForTraversableObject( + $assign_value_atomic_type, + $codebase, + $array_access_key_type, + $array_access_value_type + ); + + $new_assign_type = $array_access_value_type; + } + + if ($already_in_scope) { + // removes dependent vars from $context + $context->removeDescendents( + $list_var_id, + $context->vars_in_scope[$list_var_id], + $new_assign_type, + $statements_analyzer + ); + } + } + } + + + + if (!$assigned) { + if ($has_null) { + IssueBuffer::maybeAdd( + new PossiblyNullArrayAccess( + 'Cannot access array value on null variable ' . $array_var_id, + new CodeLocation($statements_analyzer->getSource(), $var) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + foreach ($var_comments as $var_comment) { + if (!$var_comment->type) { + continue; + } + + try { + if ($var_comment->var_id === $list_var_id) { + $var_comment_type = TypeExpander::expandUnion( + $codebase, + $var_comment->type, + $context->self, + $context->self, + $statements_analyzer->getParentFQCLN() + ); + + $var_comment_type->setFromDocblock(); + + $new_assign_type = $var_comment_type; + break; + } + } catch (UnexpectedValueException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($statements_analyzer->getSource(), $assign_var) + ) + ); + } + } + + if ($list_var_id) { + $context->vars_in_scope[$list_var_id] = $new_assign_type ?: Type::getMixed(); + + if ($statements_analyzer->data_flow_graph) { + $data_flow_graph = $statements_analyzer->data_flow_graph; + + $var_location = new CodeLocation($statements_analyzer->getSource(), $var); + + if (!$context->vars_in_scope[$list_var_id]->parent_nodes) { + $assignment_node = DataFlowNode::getForAssignment( + $list_var_id, + $var_location + ); + + $context->vars_in_scope[$list_var_id]->parent_nodes = [ + $assignment_node->id => $assignment_node + ]; + } else { + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + $context->vars_in_scope[$list_var_id]->parent_nodes = []; + } else { + $event = new AddRemoveTaintsEvent($var, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = array_merge( + $removed_taints, + $codebase->config->eventDispatcher->dispatchRemoveTaints($event) + ); + + self::taintAssignment( + $context->vars_in_scope[$list_var_id], + $data_flow_graph, + $list_var_id, + $var_location, + $removed_taints, + $added_taints + ); + } + } + } + } + } + + if ($list_var_id) { + if (($context->error_suppressing && ($offset || $can_be_empty)) + || $has_null + ) { + $context->vars_in_scope[$list_var_id]->addType(new TNull); + } + } + } + } + + private static function analyzePropertyAssignment( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\PropertyFetch $assign_var, + Context $context, + ?PhpParser\Node\Expr $assign_value, + Union $assign_value_type, + ?string $var_id + ): void { + if (!$assign_var->name instanceof PhpParser\Node\Identifier) { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + + // this can happen when the user actually means to type $this->, but there's + // a variable on the next line + if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_var->var, $context) === false) { + $context->inside_general_use = $was_inside_general_use; + + return; + } + + if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_var->name, $context) === false) { + $context->inside_general_use = $was_inside_general_use; + + return; + } + + $context->inside_general_use = $was_inside_general_use; + } + + if ($assign_var->name instanceof PhpParser\Node\Identifier) { + $prop_name = $assign_var->name->name; + } elseif (($assign_var_name_type = $statements_analyzer->node_data->getType($assign_var->name)) + && $assign_var_name_type->isSingleStringLiteral() + ) { + $prop_name = $assign_var_name_type->getSingleStringLiteral()->value; + } else { + $prop_name = null; + } + + if ($prop_name) { + InstancePropertyAssignmentAnalyzer::analyze( + $statements_analyzer, + $assign_var, + $prop_name, + $assign_value, + $assign_value_type, + $context + ); + } else { + if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_var->var, $context) === false) { + return; + } + + if (($assign_var_type = $statements_analyzer->node_data->getType($assign_var->var)) + && !$context->ignore_variable_property + ) { + $stmt_var_type = $assign_var_type; + + if ($stmt_var_type->hasObjectType()) { + foreach ($stmt_var_type->getAtomicTypes() as $type) { + if ($type instanceof TNamedObject) { + $codebase->analyzer->addMixedMemberName( + strtolower($type->value) . '::$', + $context->calling_method_id ?: $statements_analyzer->getFileName() + ); + } + } + } + } + } + + if ($var_id) { + $context->vars_possibly_in_scope[$var_id] = true; + } + + $property_var_pure_compatible = $statements_analyzer->node_data->isPureCompatible($assign_var->var); + + // prevents writing to any properties in a mutation-free context + if (!$property_var_pure_compatible + && !$context->collect_mutations + && !$context->collect_initializations + ) { + if ($context->mutation_free || $context->external_mutation_free) { + IssueBuffer::maybeAdd( + new ImpurePropertyAssignment( + 'Cannot assign to a property from a mutation-free context', + new CodeLocation($statements_analyzer, $assign_var) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + if (!$assign_var->var instanceof PhpParser\Node\Expr\Variable + || $assign_var->var->name !== 'this' + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + } + + $statements_analyzer->getSource()->inferred_impure = true; + } + } + } + + private static function analyzeAssignmentToVariable( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\Variable $assign_var, + ?PhpParser\Node\Expr $assign_value, + Union $assign_value_type, + ?string $var_id, + Context $context + ): void { + if (is_string($assign_var->name)) { + if ($var_id) { + $context->vars_in_scope[$var_id] = $assign_value_type; + $context->vars_possibly_in_scope[$var_id] = true; + + $location = new CodeLocation($statements_analyzer, $assign_var); + + if (!$statements_analyzer->hasVariable($var_id)) { + $statements_analyzer->registerVariable( + $var_id, + $location, + $context->branch_point + ); + } elseif (!$context->inside_isset) { + $statements_analyzer->registerVariableAssignment( + $var_id, + $location + ); + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $location = new CodeLocation($statements_analyzer, $assign_var); + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $assign_var, + $location->raw_file_start + . '-' . $location->raw_file_end + . ':' . $assign_value_type->getId() + ); + } + + if (isset($context->byref_constraints[$var_id])) { + $assign_value_type->by_ref = true; + } + + if ($assign_value_type->by_ref) { + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + && $assign_value_type->parent_nodes + ) { + $location = new CodeLocation($statements_analyzer, $assign_var); + + $byref_node = DataFlowNode::getForAssignment($var_id, $location); + + foreach ($assign_value_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use' + ); + + $statements_analyzer->data_flow_graph->addPath( + $byref_node, + $parent_node, + 'byref-assignment' + ); + } + } + } + + if ($assign_value_type->getId() === 'bool' + && ($assign_value instanceof PhpParser\Node\Expr\BinaryOp + || ($assign_value instanceof PhpParser\Node\Expr\BooleanNot + && $assign_value->expr instanceof PhpParser\Node\Expr\BinaryOp)) + ) { + $var_object_id = spl_object_id($assign_var); + $cond_object_id = spl_object_id($assign_value); + + $right_clauses = FormulaGenerator::getFormula( + $cond_object_id, + $cond_object_id, + $assign_value, + $context->self, + $statements_analyzer, + $codebase + ); + + $right_clauses = Context::filterClauses( + $var_id, + $right_clauses + ); + + $assignment_clauses = Algebra::combineOredClauses( + [new Clause([$var_id => ['falsy']], $var_object_id, $var_object_id)], + $right_clauses, + $cond_object_id + ); + + $context->clauses = array_merge($context->clauses, $assignment_clauses); + } + } + } else { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_var->name, $context) === false) { + $context->inside_general_use = $was_inside_general_use; + + return; + } + + $context->inside_general_use = $was_inside_general_use; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + && $assign_value_type->parent_nodes + ) { + foreach ($assign_value_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use' + ); + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php new file mode 100644 index 00000000..1f4c28f1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php @@ -0,0 +1,232 @@ +left, + [ + 'stmts' => [ + new VirtualExpression( + $stmt->right + ) + ] + ], + $stmt->getAttributes() + ); + + return IfElseAnalyzer::analyze($statements_analyzer, $fake_if_stmt, $context) !== false; + } + + $pre_referenced_var_ids = $context->referenced_var_ids; + + $pre_assigned_var_ids = $context->assigned_var_ids; + + $left_context = clone $context; + + $left_context->referenced_var_ids = []; + $left_context->assigned_var_ids = []; + + /** @var list $left_context->reconciled_expression_clauses */ + $left_context->reconciled_expression_clauses = []; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->left, $left_context) === false) { + return false; + } + + IfConditionalAnalyzer::handleParadoxicalCondition($statements_analyzer, $stmt->left); + + $codebase = $statements_analyzer->getCodebase(); + + $left_cond_id = spl_object_id($stmt->left); + + $left_clauses = FormulaGenerator::getFormula( + $left_cond_id, + $left_cond_id, + $stmt->left, + $context->self, + $statements_analyzer, + $codebase + ); + + foreach ($left_context->vars_in_scope as $var_id => $type) { + if (isset($left_context->assigned_var_ids[$var_id])) { + $context->vars_in_scope[$var_id] = $type; + } + } + + /** @var array */ + $left_referenced_var_ids = $left_context->referenced_var_ids; + $context->referenced_var_ids = array_merge($pre_referenced_var_ids, $left_referenced_var_ids); + + $left_assigned_var_ids = array_diff_key($left_context->assigned_var_ids, $pre_assigned_var_ids); + + $left_referenced_var_ids = array_diff_key($left_referenced_var_ids, $left_assigned_var_ids); + + $context_clauses = array_merge($left_context->clauses, $left_clauses); + + if ($left_context->reconciled_expression_clauses) { + $reconciled_expression_clauses = $left_context->reconciled_expression_clauses; + + $context_clauses = array_values( + array_filter( + $context_clauses, + function ($c) use ($reconciled_expression_clauses): bool { + return !in_array($c->hash, $reconciled_expression_clauses); + } + ) + ); + + if (count($context_clauses) === 1 + && $context_clauses[0]->wedge + && !$context_clauses[0]->possibilities + ) { + $context_clauses = []; + } + } + + $simplified_clauses = Algebra::simplifyCNF($context_clauses); + + $active_left_assertions = []; + + $left_type_assertions = Algebra::getTruthsFromFormula( + $simplified_clauses, + $left_cond_id, + $left_referenced_var_ids, + $active_left_assertions + ); + + $changed_var_ids = []; + + $right_context = clone $left_context; + + if ($left_type_assertions) { + // while in an and, we allow scope to boil over to support + // statements of the form if ($x && $x->foo()) + $right_vars_in_scope = Reconciler::reconcileKeyedTypes( + $left_type_assertions, + $active_left_assertions, + $context->vars_in_scope, + $changed_var_ids, + $left_referenced_var_ids, + $statements_analyzer, + $statements_analyzer->getTemplateTypeMap() ?: [], + $context->inside_loop, + new CodeLocation($statements_analyzer->getSource(), $stmt->left), + $context->inside_negation + ); + + $right_context->vars_in_scope = $right_vars_in_scope; + + if ($context->if_scope) { + $context->if_scope->if_cond_changed_var_ids += $changed_var_ids; + } + } + + $partitioned_clauses = Context::removeReconciledClauses($left_clauses, $changed_var_ids); + + $right_context->clauses = $partitioned_clauses[0]; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->right, $right_context) === false) { + return false; + } + + IfConditionalAnalyzer::handleParadoxicalCondition($statements_analyzer, $stmt->right); + + $context->referenced_var_ids = array_merge( + $right_context->referenced_var_ids, + $left_context->referenced_var_ids + ); + + if ($context->inside_conditional) { + $context->updateChecks($right_context); + + $context->vars_possibly_in_scope = array_merge( + $right_context->vars_possibly_in_scope, + $left_context->vars_possibly_in_scope + ); + + $context->assigned_var_ids = array_merge( + $left_context->assigned_var_ids, + $right_context->assigned_var_ids + ); + } + + if ($context->if_context && !$context->inside_negation) { + $context->vars_in_scope = $right_context->vars_in_scope; + $if_context = $context->if_context; + + foreach ($right_context->vars_in_scope as $var_id => $type) { + if (!isset($if_context->vars_in_scope[$var_id])) { + $if_context->vars_in_scope[$var_id] = $type; + } elseif (isset($context->vars_in_scope[$var_id])) { + $if_context->vars_in_scope[$var_id] = $context->vars_in_scope[$var_id]; + } + } + + $if_context->referenced_var_ids = array_merge( + $context->referenced_var_ids, + $if_context->referenced_var_ids + ); + + $if_context->assigned_var_ids = array_merge( + $context->assigned_var_ids, + $if_context->assigned_var_ids + ); + + $if_context->reconciled_expression_clauses = array_merge( + $if_context->reconciled_expression_clauses, + array_map( + function ($c) { + return $c->hash; + }, + $partitioned_clauses[1] + ) + ); + + $if_context->vars_possibly_in_scope = array_merge( + $context->vars_possibly_in_scope, + $if_context->vars_possibly_in_scope + ); + + $if_context->updateChecks($context); + } else { + $context->vars_in_scope = $left_context->vars_in_scope; + } + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php new file mode 100644 index 00000000..2aa814c6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php @@ -0,0 +1,1373 @@ +getCodebase() : null; + + $left_type = $nodes->getType($left); + $right_type = $nodes->getType($right); + $config = Config::getInstance(); + + if ($left_type && $left_type->isEmpty()) { + $left_type = $right_type; + } elseif ($right_type && $right_type->isEmpty()) { + $right_type = $left_type; + } + + if ($left_type && $right_type) { + if ($left_type->isNull()) { + if ($statements_source && IssueBuffer::accepts( + new NullOperand( + 'Left operand cannot be null', + new CodeLocation($statements_source, $left) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + $result_type = Type::getMixed(); + + return; + } + + if ($left_type->isNullable() && !$left_type->ignore_nullable_issues) { + if ($statements_source && IssueBuffer::accepts( + new PossiblyNullOperand( + 'Left operand cannot be nullable, got ' . $left_type, + new CodeLocation($statements_source, $left) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } + + if ($right_type->isNull()) { + if ($statements_source && IssueBuffer::accepts( + new NullOperand( + 'Right operand cannot be null', + new CodeLocation($statements_source, $right) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + $result_type = Type::getMixed(); + + return; + } + + if ($right_type->isNullable() && !$right_type->ignore_nullable_issues) { + if ($statements_source && IssueBuffer::accepts( + new PossiblyNullOperand( + 'Right operand cannot be nullable, got ' . $right_type, + new CodeLocation($statements_source, $right) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } + + if ($left_type->isFalse()) { + if ($statements_source && IssueBuffer::accepts( + new FalseOperand( + 'Left operand cannot be false', + new CodeLocation($statements_source, $left) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + + return; + } + + if ($left_type->isFalsable() && !$left_type->ignore_falsable_issues) { + if ($statements_source && IssueBuffer::accepts( + new PossiblyFalseOperand( + 'Left operand cannot be falsable, got ' . $left_type, + new CodeLocation($statements_source, $left) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } + + if ($right_type->isFalse()) { + if ($statements_source && IssueBuffer::accepts( + new FalseOperand( + 'Right operand cannot be false', + new CodeLocation($statements_source, $right) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + + return; + } + + if ($right_type->isFalsable() && !$right_type->ignore_falsable_issues) { + if ($statements_source && IssueBuffer::accepts( + new PossiblyFalseOperand( + 'Right operand cannot be falsable, got ' . $right_type, + new CodeLocation($statements_source, $right) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } + + $invalid_left_messages = []; + $invalid_right_messages = []; + $has_valid_left_operand = false; + $has_valid_right_operand = false; + $has_string_increment = false; + + foreach ($left_type->getAtomicTypes() as $left_type_part) { + foreach ($right_type->getAtomicTypes() as $right_type_part) { + $candidate_result_type = self::analyzeOperands( + $statements_source, + $codebase, + $config, + $context, + $left, + $right, + $parent, + $left_type_part, + $right_type_part, + $invalid_left_messages, + $invalid_right_messages, + $has_valid_left_operand, + $has_valid_right_operand, + $has_string_increment, + $result_type + ); + + if ($candidate_result_type) { + $result_type = $candidate_result_type; + return; + } + } + } + + if ($invalid_left_messages && $statements_source) { + $first_left_message = $invalid_left_messages[0]; + + if ($has_valid_left_operand) { + IssueBuffer::maybeAdd( + new PossiblyInvalidOperand( + $first_left_message, + new CodeLocation($statements_source, $left) + ), + $statements_source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidOperand( + $first_left_message, + new CodeLocation($statements_source, $left) + ), + $statements_source->getSuppressedIssues() + ); + } + } + + if ($invalid_right_messages && $statements_source) { + $first_right_message = $invalid_right_messages[0]; + + if ($has_valid_right_operand) { + IssueBuffer::maybeAdd( + new PossiblyInvalidOperand( + $first_right_message, + new CodeLocation($statements_source, $right) + ), + $statements_source->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidOperand( + $first_right_message, + new CodeLocation($statements_source, $right) + ), + $statements_source->getSuppressedIssues() + ); + } + } + + if ($has_string_increment && $statements_source) { + IssueBuffer::maybeAdd( + new StringIncrement( + 'Possibly unintended string increment', + new CodeLocation($statements_source, $left) + ), + $statements_source->getSuppressedIssues() + ); + } + } + } + + /** + * @param int|float $result + */ + private static function getNumericalType($result): Union + { + if (is_int($result)) { + return Type::getInt(false, $result); + } + + return Type::getFloat($result); + } + + /** + * @param string[] $invalid_left_messages + * @param string[] $invalid_right_messages + */ + private static function analyzeOperands( + ?StatementsSource $statements_source, + ?Codebase $codebase, + Config $config, + ?Context $context, + PhpParser\Node\Expr $left, + PhpParser\Node\Expr $right, + PhpParser\Node $parent, + Atomic $left_type_part, + Atomic $right_type_part, + array &$invalid_left_messages, + array &$invalid_right_messages, + bool &$has_valid_left_operand, + bool &$has_valid_right_operand, + bool &$has_string_increment, + Union &$result_type = null + ): ?Union { + if ($left_type_part instanceof TLiteralInt + && $right_type_part instanceof TLiteralInt + && ( + //we don't try to do arithmetics on variables in loops + $context === null + || $context->inside_loop === false + || (!$left instanceof PhpParser\Node\Expr\Variable && !$right instanceof PhpParser\Node\Expr\Variable) + ) + ) { + // time for some arithmetic! + $calculated_type = self::arithmeticOperation( + $parent, + $left_type_part->value, + $right_type_part->value, + true + ); + + if ($calculated_type) { + $result_type = Type::combineUnionTypes( + $calculated_type, + $result_type + ); + + $has_valid_left_operand = true; + $has_valid_right_operand = true; + + return null; + } + } + + if ($left_type_part instanceof TNull || $right_type_part instanceof TNull) { + // null case is handled above + return null; + } + + if ($left_type_part instanceof TFalse || $right_type_part instanceof TFalse) { + // null case is handled above + return null; + } + + if ($left_type_part instanceof TString + && $right_type_part instanceof TInt + && ( + $parent instanceof PhpParser\Node\Expr\PostInc || + $parent instanceof PhpParser\Node\Expr\PreInc + ) + ) { + if ($left_type_part instanceof TNumericString || + ($left_type_part instanceof TLiteralString && is_numeric($left_type_part->value)) + ) { + $new_result_type = new Union([new TFloat(), new TInt()]); + $new_result_type->from_calculation = true; + } else { + $new_result_type = Type::getNonEmptyString(); + $has_string_increment = true; + } + + $result_type = Type::combineUnionTypes($new_result_type, $result_type); + + $has_valid_left_operand = true; + $has_valid_right_operand = true; + + return null; + } + + if ($left_type_part instanceof TTemplateParam + && $right_type_part instanceof TTemplateParam + ) { + $combined_type = Type::combineUnionTypes( + $left_type_part->as, + $right_type_part->as + ); + + $combined_atomic_types = array_values($combined_type->getAtomicTypes()); + + if (count($combined_atomic_types) <= 2) { + $left_type_part = $combined_atomic_types[0]; + $right_type_part = $combined_atomic_types[1] ?? $combined_atomic_types[0]; + } + } + + if ($left_type_part instanceof TMixed || $right_type_part instanceof TMixed) { + if ($statements_source && $codebase && $context) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_source->getFilePath() === $statements_source->getRootFilePath() + && (!(($source = $statements_source->getSource()) + instanceof FunctionLikeAnalyzer) + || !$source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_source->getFilePath()); + } + } + + if ($left_type_part instanceof TMixed) { + if ($statements_source && IssueBuffer::accepts( + new MixedOperand( + 'Left operand cannot be mixed', + new CodeLocation($statements_source, $left) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } else { + if ($statements_source && IssueBuffer::accepts( + new MixedOperand( + 'Right operand cannot be mixed', + new CodeLocation($statements_source, $right) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } + + if ($left_type_part instanceof TMixed + && $left_type_part->from_loop_isset + && $parent instanceof PhpParser\Node\Expr\AssignOp\Plus + && !$right_type_part instanceof TMixed + ) { + $result_type = Type::combineUnionTypes(new Union([$right_type_part]), $result_type); + + return null; + } + + $from_loop_isset = (!($left_type_part instanceof TMixed) || $left_type_part->from_loop_isset) + && (!($right_type_part instanceof TMixed) || $right_type_part->from_loop_isset); + + $result_type = Type::getMixed($from_loop_isset); + + return $result_type; + } + + if ($left_type_part instanceof TTemplateParam || $right_type_part instanceof TTemplateParam) { + if ($left_type_part instanceof TTemplateParam + && !$left_type_part->as->isInt() + && !$left_type_part->as->isFloat() + ) { + if ($statements_source && IssueBuffer::accepts( + new MixedOperand( + 'Left operand cannot be a non-numeric template', + new CodeLocation($statements_source, $left) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } elseif ($right_type_part instanceof TTemplateParam + && !$right_type_part->as->isInt() + && !$right_type_part->as->isFloat() + ) { + if ($statements_source && IssueBuffer::accepts( + new MixedOperand( + 'Right operand cannot be a non-numeric template', + new CodeLocation($statements_source, $right) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } + + return null; + } + + if ($statements_source && $codebase && $context) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_source->getFilePath() === $statements_source->getRootFilePath() + && (!(($parent_source = $statements_source->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_source->getFilePath()); + } + } + + if ($left_type_part instanceof TArray + || $right_type_part instanceof TArray + || $left_type_part instanceof TKeyedArray + || $right_type_part instanceof TKeyedArray + || $left_type_part instanceof TList + || $right_type_part instanceof TList + ) { + if ((!$right_type_part instanceof TArray + && !$right_type_part instanceof TKeyedArray + && !$right_type_part instanceof TList) + || (!$left_type_part instanceof TArray + && !$left_type_part instanceof TKeyedArray + && !$left_type_part instanceof TList) + ) { + if (!$left_type_part instanceof TArray + && !$left_type_part instanceof TKeyedArray + && !$left_type_part instanceof TList + ) { + $invalid_left_messages[] = 'Cannot add an array to a non-array ' . $left_type_part; + } else { + $invalid_right_messages[] = 'Cannot add an array to a non-array ' . $right_type_part; + } + + if ($left_type_part instanceof TArray + || $left_type_part instanceof TKeyedArray + || $left_type_part instanceof TList + ) { + $has_valid_left_operand = true; + } elseif ($right_type_part instanceof TArray + || $right_type_part instanceof TKeyedArray + || $right_type_part instanceof TList + ) { + $has_valid_right_operand = true; + } + + $result_type = Type::getArray(); + + return null; + } + + $has_valid_right_operand = true; + $has_valid_left_operand = true; + + if ($left_type_part instanceof TKeyedArray + && $right_type_part instanceof TKeyedArray + ) { + $definitely_existing_mixed_right_properties = array_diff_key( + $right_type_part->properties, + $left_type_part->properties + ); + + $properties = $left_type_part->properties; + + foreach ($right_type_part->properties as $key => $type) { + if (!isset($properties[$key])) { + $properties[$key] = $type; + } elseif ($properties[$key]->possibly_undefined) { + $properties[$key] = Type::combineUnionTypes( + $properties[$key], + $type, + $codebase + ); + + $properties[$key]->possibly_undefined = $type->possibly_undefined; + } + } + + if (!$left_type_part->sealed) { + foreach ($definitely_existing_mixed_right_properties as $key => $type) { + $properties[$key] = Type::combineUnionTypes(Type::getMixed(), $type); + } + } + + $new_keyed_array = new TKeyedArray($properties); + $new_keyed_array->sealed = $left_type_part->sealed && $right_type_part->sealed; + $result_type_member = new Union([$new_keyed_array]); + } else { + $result_type_member = TypeCombiner::combine( + [$left_type_part, $right_type_part], + $codebase, + true + ); + } + + $result_type = Type::combineUnionTypes($result_type_member, $result_type, $codebase, true); + + if ($left instanceof PhpParser\Node\Expr\ArrayDimFetch + && $context + && $statements_source instanceof StatementsAnalyzer + ) { + ArrayAssignmentAnalyzer::updateArrayType( + $statements_source, + $left, + $right, + $result_type, + $context + ); + } + + return null; + } + + if (($left_type_part instanceof TNamedObject && strtolower($left_type_part->value) === 'gmp') + || ($right_type_part instanceof TNamedObject && strtolower($right_type_part->value) === 'gmp') + ) { + if ((($left_type_part instanceof TNamedObject + && strtolower($left_type_part->value) === 'gmp') + && (($right_type_part instanceof TNamedObject + && strtolower($right_type_part->value) === 'gmp') + || ($right_type_part->isNumericType() || $right_type_part instanceof TMixed))) + || (($right_type_part instanceof TNamedObject + && strtolower($right_type_part->value) === 'gmp') + && (($left_type_part instanceof TNamedObject + && strtolower($left_type_part->value) === 'gmp') + || ($left_type_part->isNumericType() || $left_type_part instanceof TMixed))) + ) { + $result_type = Type::combineUnionTypes( + new Union([new TNamedObject('GMP')]), + $result_type + ); + } else { + if ($statements_source && IssueBuffer::accepts( + new InvalidOperand( + 'Cannot add GMP to non-numeric type', + new CodeLocation($statements_source, $parent) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } + + return null; + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Plus + || $parent instanceof PhpParser\Node\Expr\BinaryOp\Minus + || $parent instanceof PhpParser\Node\Expr\BinaryOp\Mul + || $parent instanceof PhpParser\Node\Expr\BinaryOp\Div + || $parent instanceof PhpParser\Node\Expr\BinaryOp\Mod + || $parent instanceof PhpParser\Node\Expr\BinaryOp\Pow + ) { + $non_decimal_type = null; + if ($left_type_part instanceof TNamedObject + && strtolower($left_type_part->value) === "decimal\\decimal" + ) { + $non_decimal_type = $right_type_part; + } elseif ($right_type_part instanceof TNamedObject + && strtolower($right_type_part->value) === "decimal\\decimal" + ) { + $non_decimal_type = $left_type_part; + } + if ($non_decimal_type !== null) { + if ($non_decimal_type instanceof TInt + || $non_decimal_type instanceof TNumericString + || $non_decimal_type instanceof TNamedObject + && strtolower($non_decimal_type->value) === "decimal\\decimal" + ) { + $result_type = Type::combineUnionTypes( + new Union([new TNamedObject("Decimal\\Decimal")]), + $result_type + ); + } else { + if ($statements_source) { + IssueBuffer::maybeAdd( + new InvalidOperand( + "Cannot add Decimal\\Decimal to {$non_decimal_type->getId()}", + new CodeLocation($statements_source, $parent) + ), + $statements_source->getSuppressedIssues() + ); + } + } + + return null; + } + } + + if ($left_type_part instanceof TLiteralString) { + if (preg_match('/^\-?\d+$/', $left_type_part->value)) { + $left_type_part = new TLiteralInt((int) $left_type_part->value); + } elseif (preg_match('/^\-?\d?\.\d+$/', $left_type_part->value)) { + $left_type_part = new TLiteralFloat((float) $left_type_part->value); + } + } + + if ($right_type_part instanceof TLiteralString) { + if (preg_match('/^\-?\d+$/', $right_type_part->value)) { + $right_type_part = new TLiteralInt((int) $right_type_part->value); + } elseif (preg_match('/^\-?\d?\.\d+$/', $right_type_part->value)) { + $right_type_part = new TLiteralFloat((float) $right_type_part->value); + } + } + + if ($left_type_part->isNumericType() || $right_type_part->isNumericType()) { + if (($left_type_part instanceof TNumeric || $right_type_part instanceof TNumeric) + && ($left_type_part->isNumericType() && $right_type_part->isNumericType()) + ) { + if ($config->strict_binary_operands) { + if ($statements_source && IssueBuffer::accepts( + new InvalidOperand( + 'Cannot process different numeric types together in strict binary operands mode, '. + 'please cast explicitly', + new CodeLocation($statements_source, $parent) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { + $new_result_type = Type::getInt(); + } else { + $new_result_type = new Union([new TFloat(), new TInt()]); + } + + $result_type = Type::combineUnionTypes($new_result_type, $result_type); + + $has_valid_right_operand = true; + $has_valid_left_operand = true; + + return null; + } + + if ($left_type_part instanceof TIntRange && $right_type_part instanceof TIntRange) { + self::analyzeOperandsBetweenIntRange($parent, $result_type, $left_type_part, $right_type_part); + return null; + } + + if (($left_type_part instanceof TIntRange && $right_type_part instanceof TInt) || + ($left_type_part instanceof TInt && $right_type_part instanceof TIntRange) + ) { + self::analyzeOperandsBetweenIntRangeAndInt( + $parent, + $result_type, + $left_type_part, + $right_type_part + ); + return null; + } + + if ($left_type_part instanceof TInt && $right_type_part instanceof TInt) { + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Div) { + $result_type = new Union([new TInt(), new TFloat()]); + } else { + $left_is_positive = $left_type_part instanceof TPositiveInt + || ($left_type_part instanceof TLiteralInt && $left_type_part->value > 0); + + $right_is_positive = $right_type_part instanceof TPositiveInt + || ($right_type_part instanceof TLiteralInt && $right_type_part->value > 0); + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Minus) { + $always_positive = false; + } elseif ($left_is_positive && $right_is_positive) { + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor + || $parent instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd + || $parent instanceof PhpParser\Node\Expr\BinaryOp\ShiftLeft + || $parent instanceof PhpParser\Node\Expr\BinaryOp\ShiftRight + ) { + $always_positive = false; + } else { + $always_positive = true; + } + } elseif ($parent instanceof PhpParser\Node\Expr\BinaryOp\Plus + && ($left_type_part instanceof TLiteralInt && $left_type_part->value === 0) + && $right_is_positive + ) { + $always_positive = true; + } elseif ($parent instanceof PhpParser\Node\Expr\BinaryOp\Plus + && ($right_type_part instanceof TLiteralInt && $right_type_part->value === 0) + && $left_is_positive + ) { + $always_positive = true; + } else { + $always_positive = false; + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { + if ($right_type_part instanceof TLiteralInt) { + $literal_value_max = $right_type_part->value - 1; + if ($always_positive) { + $result_type = new Union([new TIntRange(0, $literal_value_max)]); + } else { + $result_type = new Union( + [new TIntRange(-$literal_value_max, $literal_value_max)] + ); + } + } else { + if ($always_positive) { + $result_type = new Union([ + new TPositiveInt(), + new TLiteralInt(0) + ]); + } else { + $result_type = Type::getInt(); + } + } + } else { + $result_type = Type::combineUnionTypes( + $always_positive ? Type::getPositiveInt(true) : Type::getInt(true), + $result_type + ); + } + } + + $has_valid_right_operand = true; + $has_valid_left_operand = true; + + return null; + } + + if ($left_type_part instanceof TFloat && $right_type_part instanceof TFloat) { + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { + $result_type = Type::getInt(); + } else { + $result_type = Type::combineUnionTypes(Type::getFloat(), $result_type); + } + + $has_valid_right_operand = true; + $has_valid_left_operand = true; + + return null; + } + + if (($left_type_part instanceof TFloat && $right_type_part instanceof TInt) + || ($left_type_part instanceof TInt && $right_type_part instanceof TFloat) + ) { + if ($config->strict_binary_operands) { + if ($statements_source && IssueBuffer::accepts( + new InvalidOperand( + 'Cannot process ints and floats in strict binary operands mode, '. + 'please cast explicitly', + new CodeLocation($statements_source, $parent) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { + $result_type = Type::getInt(); + } else { + $result_type = Type::combineUnionTypes(Type::getFloat(), $result_type); + } + + $has_valid_right_operand = true; + $has_valid_left_operand = true; + + return null; + } + + if ($left_type_part->isNumericType() && $right_type_part->isNumericType()) { + if ($config->strict_binary_operands) { + if ($statements_source && IssueBuffer::accepts( + new InvalidOperand( + 'Cannot process numeric types together in strict operands mode, '. + 'please cast explicitly', + new CodeLocation($statements_source, $parent) + ), + $statements_source->getSuppressedIssues() + )) { + // fall through + } + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { + $result_type = Type::getInt(); + } else { + $result_type = new Union([new TInt, new TFloat]); + } + + $has_valid_right_operand = true; + $has_valid_left_operand = true; + + return null; + } + + if (!$left_type_part->isNumericType()) { + $invalid_left_messages[] = 'Cannot perform a numeric operation with a non-numeric type ' + . $left_type_part; + $has_valid_right_operand = true; + } else { + $invalid_right_messages[] = 'Cannot perform a numeric operation with a non-numeric type ' + . $right_type_part; + $has_valid_left_operand = true; + } + } else { + $invalid_left_messages[] = + 'Cannot perform a numeric operation with non-numeric types ' . $left_type_part + . ' and ' . $right_type_part; + } + + return null; + } + + /** + * @param PhpParser\Node $operation + * @param float|int $operand1 + * @param float|int $operand2 + */ + public static function arithmeticOperation( + PhpParser\Node $operation, + $operand1, + $operand2, + bool $allow_float_result + ): ?Union { + if ($operation instanceof PhpParser\Node\Expr\BinaryOp\Plus) { + $result = $operand1 + $operand2; + } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\Minus) { + $result = $operand1 - $operand2; + } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\Mod) { + if ($operand2 === 0) { + return Type::getEmpty(); + } + + $result = $operand1 % $operand2; + } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\Mul) { + $result = $operand1 * $operand2; + } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\Pow) { + $result = $operand1 ** $operand2; + } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr) { + $result = $operand1 | $operand2; + } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd) { + $result = $operand1 & $operand2; + } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor) { + $result = $operand1 ^ $operand2; + } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\ShiftLeft) { + $result = $operand1 << $operand2; + } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\ShiftRight) { + $result = $operand1 >> $operand2; + } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\Div) { + if ($operand2 === 0) { + return Type::getEmpty(); + } + + $result = $operand1 / $operand2; + } else { + return null; + } + + $calculated_type = self::getNumericalType($result); + if (!$allow_float_result && $calculated_type->isFloat()) { + return null; + } + + return $calculated_type; + } + + private static function analyzeOperandsBetweenIntRange( + PhpParser\Node $parent, + ?Union &$result_type, + TIntRange $left_type_part, + TIntRange $right_type_part + ): void { + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Div) { + //can't assume an int range will stay int after division + $result_type = Type::combineUnionTypes( + new Union([new TInt(), new TFloat()]), + $result_type + ); + return; + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { + self::analyzeModBetweenIntRange($result_type, $left_type_part, $right_type_part); + return; + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd || + $parent instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr || + $parent instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor + ) { + //really complex to calculate + $result_type = Type::combineUnionTypes( + Type::getInt(), + $result_type + ); + return; + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\ShiftLeft || + $parent instanceof PhpParser\Node\Expr\BinaryOp\ShiftRight + ) { + //really complex to calculate + $result_type = Type::combineUnionTypes( + new Union([new TInt()]), + $result_type + ); + return; + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mul) { + self::analyzeMulBetweenIntRange($parent, $result_type, $left_type_part, $right_type_part); + return; + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Pow) { + self::analyzePowBetweenIntRange($result_type, $left_type_part, $right_type_part); + return; + } + + if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Minus) { + //for Minus, we have to assume the min is the min from first range minus the max from the second + $min_operand1 = $left_type_part->min_bound; + $min_operand2 = $right_type_part->max_bound; + //and the max is the max from first range minus the min from the second + $max_operand1 = $left_type_part->max_bound; + $max_operand2 = $right_type_part->min_bound; + } else { + $min_operand1 = $left_type_part->min_bound; + $min_operand2 = $right_type_part->min_bound; + + $max_operand1 = $left_type_part->max_bound; + $max_operand2 = $right_type_part->max_bound; + } + + $calculated_min_type = null; + if ($min_operand1 !== null && $min_operand2 !== null) { + // when there are two valid numbers, make any operation + $calculated_min_type = self::arithmeticOperation( + $parent, + $min_operand1, + $min_operand2, + false + ); + } + + $calculated_max_type = null; + if ($max_operand1 !== null && $max_operand2 !== null) { + // when there are two valid numbers, make any operation + $calculated_max_type = self::arithmeticOperation( + $parent, + $max_operand1, + $max_operand2, + false + ); + } + + $min_value = $calculated_min_type !== null ? $calculated_min_type->getSingleIntLiteral()->value : null; + $max_value = $calculated_max_type !== null ? $calculated_max_type->getSingleIntLiteral()->value : null; + + $new_result_type = new Union([new TIntRange($min_value, $max_value)]); + + $result_type = Type::combineUnionTypes($new_result_type, $result_type); + } + + /** + * @param TIntRange|TInt $left_type_part + * @param TIntRange|TInt $right_type_part + */ + private static function analyzeOperandsBetweenIntRangeAndInt( + PhpParser\Node $parent, + ?Union &$result_type, + Atomic $left_type_part, + Atomic $right_type_part + ): void { + if (!$left_type_part instanceof TIntRange) { + $left_type_part = TIntRange::convertToIntRange($left_type_part); + } + if (!$right_type_part instanceof TIntRange) { + $right_type_part = TIntRange::convertToIntRange($right_type_part); + } + + self::analyzeOperandsBetweenIntRange($parent, $result_type, $left_type_part, $right_type_part); + } + + private static function analyzeMulBetweenIntRange( + PhpParser\Node\Expr\BinaryOp\Mul $parent, + ?Union &$result_type, + TIntRange $left_type_part, + TIntRange $right_type_part + ): void { + //Mul is a special case because of double negatives. We can only infer when we know both signs strictly + if ($right_type_part->min_bound !== null + && $right_type_part->max_bound !== null + && $left_type_part->min_bound !== null + && $left_type_part->max_bound !== null + ) { + //everything is known, we can do calculations + //[ x_1 , x_2 ] ⋆ [ y_1 , y_2 ] = + // [ + // min(x_1 ⋆ y_1 , x_1 ⋆ y_2 , x_2 ⋆ y_1 , x_2 ⋆ y_2), + // max(x_1 ⋆ y_1 , x_1 ⋆ y_2 , x_2 ⋆ y_1 , x_2 ⋆ y_2) + // ] + $x_1 = $right_type_part->min_bound; + $x_2 = $right_type_part->max_bound; + $y_1 = $left_type_part->min_bound; + $y_2 = $left_type_part->max_bound; + $min_value = min($x_1 * $y_1, $x_1 * $y_2, $x_2 * $y_1, $x_2 * $y_2); + $max_value = max($x_1 * $y_1, $x_1 * $y_2, $x_2 * $y_1, $x_2 * $y_2); + + $new_result_type = new Union([new TIntRange($min_value, $max_value)]); + } elseif ($right_type_part->isPositiveOrZero() && $left_type_part->isPositiveOrZero()) { + // both operands are positive, result will be only positive + $min_operand1 = $left_type_part->min_bound; + $min_operand2 = $right_type_part->min_bound; + + $max_operand1 = $left_type_part->max_bound; + $max_operand2 = $right_type_part->max_bound; + + $calculated_min_type = null; + if ($min_operand1 !== null && $min_operand2 !== null) { + // when there are two valid numbers, make any operation + $calculated_min_type = self::arithmeticOperation( + $parent, + $min_operand1, + $min_operand2, + false + ); + } + + $calculated_max_type = null; + if ($max_operand1 !== null && $max_operand2 !== null) { + // when there are two valid numbers, make any operation + $calculated_max_type = self::arithmeticOperation( + $parent, + $max_operand1, + $max_operand2, + false + ); + } + + $min_value = $calculated_min_type !== null ? $calculated_min_type->getSingleIntLiteral()->value : null; + $max_value = $calculated_max_type !== null ? $calculated_max_type->getSingleIntLiteral()->value : null; + + $new_result_type = new Union([new TIntRange($min_value, $max_value)]); + } elseif ($right_type_part->isPositiveOrZero() && $left_type_part->isNegativeOrZero()) { + // one operand is negative, result will be negative and we have to check min vs max + $min_operand1 = $left_type_part->max_bound; + $min_operand2 = $right_type_part->min_bound; + + $max_operand1 = $left_type_part->min_bound; + $max_operand2 = $right_type_part->max_bound; + + $calculated_min_type = null; + if ($min_operand1 !== null && $min_operand2 !== null) { + // when there are two valid numbers, make any operation + $calculated_min_type = self::arithmeticOperation( + $parent, + $min_operand1, + $min_operand2, + false + ); + } + + $calculated_max_type = null; + if ($max_operand1 !== null && $max_operand2 !== null) { + // when there are two valid numbers, make any operation + $calculated_max_type = self::arithmeticOperation( + $parent, + $max_operand1, + $max_operand2, + false + ); + } + + $min_value = $calculated_min_type !== null ? $calculated_min_type->getSingleIntLiteral()->value : null; + $max_value = $calculated_max_type !== null ? $calculated_max_type->getSingleIntLiteral()->value : null; + + if ($min_value > $max_value) { + [$min_value, $max_value] = [$max_value, $min_value]; + } + + $new_result_type = new Union([new TIntRange($min_value, $max_value)]); + } elseif ($right_type_part->isNegativeOrZero() && $left_type_part->isPositiveOrZero()) { + // one operand is negative, result will be negative and we have to check min vs max + $min_operand1 = $left_type_part->min_bound; + $min_operand2 = $right_type_part->max_bound; + + $max_operand1 = $left_type_part->max_bound; + $max_operand2 = $right_type_part->min_bound; + + $calculated_min_type = null; + if ($min_operand1 !== null && $min_operand2 !== null) { + // when there are two valid numbers, make any operation + $calculated_min_type = self::arithmeticOperation( + $parent, + $min_operand1, + $min_operand2, + false + ); + } + + $calculated_max_type = null; + if ($max_operand1 !== null && $max_operand2 !== null) { + // when there are two valid numbers, make any operation + $calculated_max_type = self::arithmeticOperation( + $parent, + $max_operand1, + $max_operand2, + false + ); + } + + $min_value = $calculated_min_type !== null ? $calculated_min_type->getSingleIntLiteral()->value : null; + $max_value = $calculated_max_type !== null ? $calculated_max_type->getSingleIntLiteral()->value : null; + + if ($min_value > $max_value) { + [$min_value, $max_value] = [$max_value, $min_value]; + } + + $new_result_type = new Union([new TIntRange($min_value, $max_value)]); + } elseif ($right_type_part->isNegativeOrZero() && $left_type_part->isNegativeOrZero()) { + // both operand are negative, result will be positive + $min_operand1 = $left_type_part->max_bound; + $min_operand2 = $right_type_part->max_bound; + + $max_operand1 = $left_type_part->min_bound; + $max_operand2 = $right_type_part->min_bound; + + $calculated_min_type = null; + if ($min_operand1 !== null && $min_operand2 !== null) { + // when there are two valid numbers, make any operation + $calculated_min_type = self::arithmeticOperation( + $parent, + $min_operand1, + $min_operand2, + false + ); + } + + $calculated_max_type = null; + if ($max_operand1 !== null && $max_operand2 !== null) { + // when there are two valid numbers, make any operation + $calculated_max_type = self::arithmeticOperation( + $parent, + $max_operand1, + $max_operand2, + false + ); + } + + $min_value = $calculated_min_type !== null ? $calculated_min_type->getSingleIntLiteral()->value : null; + $max_value = $calculated_max_type !== null ? $calculated_max_type->getSingleIntLiteral()->value : null; + + $new_result_type = new Union([new TIntRange($min_value, $max_value)]); + } else { + $new_result_type = Type::getInt(true); + } + + $result_type = Type::combineUnionTypes($new_result_type, $result_type); + } + + private static function analyzePowBetweenIntRange( + ?Union &$result_type, + TIntRange $left_type_part, + TIntRange $right_type_part + ): void { + //If Pow first operand is negative, the result could be positive or negative, else it will be positive + //If Pow second operand is negative, the result will be float, if it's 0, it will be 1/-1, else positive + if ($left_type_part->isPositive()) { + if ($right_type_part->isPositive()) { + $new_result_type = new Union([new TIntRange(1, null)]); + } elseif ($right_type_part->isNegative()) { + $new_result_type = Type::getFloat(); + } elseif ($right_type_part->min_bound === 0 && $right_type_part->max_bound === 0) { + $new_result_type = Type::getInt(true, 1); + } else { + //$right_type_part may be a mix of positive, negative and 0 + $new_result_type = new Union([new TInt(), new TFloat()]); + } + } elseif ($left_type_part->isNegative()) { + if ($right_type_part->isPositive()) { + if ($right_type_part->min_bound === $right_type_part->max_bound) { + if ($right_type_part->max_bound % 2 === 0) { + $new_result_type = new Union([new TIntRange(1, null)]); + } else { + $new_result_type = new Union([new TIntRange(null, -1)]); + } + } else { + $new_result_type = Type::getInt(true); + } + } elseif ($right_type_part->isNegative()) { + $new_result_type = Type::getFloat(); + } elseif ($right_type_part->min_bound === 0 && $right_type_part->max_bound === 0) { + $new_result_type = Type::getInt(true, -1); + } else { + //$right_type_part may be a mix of positive, negative and 0 + $new_result_type = new Union([new TInt(), new TFloat()]); + } + } elseif ($left_type_part->min_bound === 0 && $left_type_part->max_bound === 0) { + if ($right_type_part->isPositive()) { + $new_result_type = Type::getInt(true, 0); + } elseif ($right_type_part->min_bound === 0 && $right_type_part->max_bound === 0) { + $new_result_type = Type::getInt(true, 1); + } else { + //technically could be a float(INF)... + $new_result_type = Type::getEmpty(); + } + } else { + //$left_type_part may be a mix of positive, negative and 0 + if ($right_type_part->isPositive()) { + if ($right_type_part->min_bound === $right_type_part->max_bound + && $right_type_part->max_bound % 2 === 0 + ) { + $new_result_type = new Union([new TIntRange(1, null)]); + } else { + $new_result_type = Type::getInt(true); + } + } elseif ($right_type_part->isNegative()) { + $new_result_type = Type::getFloat(); + } elseif ($right_type_part->min_bound === 0 && $right_type_part->max_bound === 0) { + $new_result_type = Type::getInt(true, 1); + } else { + //$left_type_part may be a mix of positive, negative and 0 + $new_result_type = new Union([new TInt(), new TFloat()]); + } + } + + $result_type = Type::combineUnionTypes($new_result_type, $result_type); + } + + private static function analyzeModBetweenIntRange( + ?Union &$result_type, + TIntRange $left_type_part, + TIntRange $right_type_part + ): void { + //result of Mod is not directly dependant on the bounds of the range + if ($right_type_part->min_bound !== null && $right_type_part->min_bound === $right_type_part->max_bound) { + //if the second operand is a literal, we can be pretty detailed + if ($right_type_part->max_bound === 0) { + $new_result_type = Type::getEmpty(); + } else { + if ($left_type_part->isPositiveOrZero()) { + if ($right_type_part->isPositive()) { + $max = $right_type_part->min_bound - 1; + $new_result_type = new Union([new TIntRange(0, $max)]); + } else { + $max = $right_type_part->min_bound + 1; + $new_result_type = new Union([new TIntRange($max, 0)]); + } + } elseif ($left_type_part->isNegativeOrZero()) { + if ($right_type_part->isPositive()) { + $max = $right_type_part->min_bound - 1; + $new_result_type = new Union([new TIntRange(-$max, 0)]); + } else { + $max = $right_type_part->min_bound + 1; + $new_result_type = new Union([new TIntRange(-$max, 0)]); + } + } else { + if ($right_type_part->isPositive()) { + $max = $right_type_part->min_bound - 1; + } else { + $max = -$right_type_part->min_bound - 1; + } + $new_result_type = new Union([new TIntRange(-$max, $max)]); + } + } + } elseif ($right_type_part->isPositive()) { + if ($left_type_part->isPositiveOrZero()) { + if ($right_type_part->max_bound !== null) { + //we now that the result will be a range between 0 and $right->max - 1 + $new_result_type = new Union( + [new TIntRange(0, $right_type_part->max_bound - 1)] + ); + } else { + $new_result_type = new Union([new TIntRange(0, null)]); + } + } elseif ($left_type_part->isNegativeOrZero()) { + $new_result_type = new Union([new TIntRange(null, 0)]); + } else { + $new_result_type = Type::getInt(true); + } + } elseif ($right_type_part->isNegative()) { + if ($left_type_part->isPositiveOrZero()) { + $new_result_type = new Union([new TIntRange(null, 0)]); + } elseif ($left_type_part->isNegativeOrZero()) { + $new_result_type = new Union([new TIntRange(null, 0)]); + } else { + $new_result_type = Type::getInt(true); + } + } else { + $new_result_type = Type::getInt(true); + } + + $result_type = Type::combineUnionTypes( + $new_result_type, + $result_type + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php new file mode 100644 index 00000000..f5c75807 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php @@ -0,0 +1,89 @@ +left; + + $root_expr = $left_expr; + + while ($root_expr instanceof PhpParser\Node\Expr\ArrayDimFetch + || $root_expr instanceof PhpParser\Node\Expr\PropertyFetch + ) { + $root_expr = $root_expr->var; + } + + if ($root_expr instanceof PhpParser\Node\Expr\FuncCall + || $root_expr instanceof PhpParser\Node\Expr\MethodCall + || $root_expr instanceof PhpParser\Node\Expr\StaticCall + || $root_expr instanceof PhpParser\Node\Expr\Cast + || $root_expr instanceof PhpParser\Node\Expr\NullsafePropertyFetch + || $root_expr instanceof PhpParser\Node\Expr\NullsafeMethodCall + || $root_expr instanceof PhpParser\Node\Expr\Ternary + ) { + $left_var_id = '$' . (int) $left_expr->getAttribute('startFilePos'); + + $cloned = clone $context; + $cloned->inside_isset = true; + + ExpressionAnalyzer::analyze($statements_analyzer, $left_expr, $cloned); + + $condition_type = $statements_analyzer->node_data->getType($left_expr) ?? Type::getMixed(); + + if ($root_expr !== $left_expr) { + $condition_type->possibly_undefined = true; + } + + $context->vars_in_scope[$left_var_id] = $condition_type; + + $left_expr = new VirtualVariable( + substr($left_var_id, 1), + $left_expr->getAttributes() + ); + } + + $ternary = new VirtualTernary( + new VirtualIsset( + [$left_expr], + $stmt->left->getAttributes() + ), + $left_expr, + $stmt->right, + $stmt->getAttributes() + ); + + $old_node_data = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + ExpressionAnalyzer::analyze($statements_analyzer, $ternary, $context); + + $ternary_type = $statements_analyzer->node_data->getType($ternary) ?? Type::getMixed(); + + $statements_analyzer->node_data = $old_node_data; + + $statements_analyzer->node_data->setType($stmt, $ternary_type); + + return true; + } +} 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 new file mode 100644 index 00000000..e317de46 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php @@ -0,0 +1,432 @@ +getCodebase(); + + $left_type = $statements_analyzer->node_data->getType($left); + $right_type = $statements_analyzer->node_data->getType($right); + $config = Config::getInstance(); + + if ($left_type && $right_type) { + $result_type = Type::getString(); + + if ($left_type->hasMixed() || $right_type->hasMixed()) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + if ($left_type->hasMixed()) { + $arg_location = new CodeLocation($statements_analyzer->getSource(), $left); + + $origin_locations = []; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + foreach ($left_type->parent_nodes as $parent_node) { + $origin_locations = array_merge( + $origin_locations, + $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) + ); + } + } + + $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; + + if ($origin_location && $origin_location->getHash() === $arg_location->getHash()) { + $origin_location = null; + } + + IssueBuffer::maybeAdd( + new MixedOperand( + 'Left operand cannot be mixed', + $arg_location, + $origin_location + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + $arg_location = new CodeLocation($statements_analyzer->getSource(), $right); + $origin_locations = []; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + foreach ($right_type->parent_nodes as $parent_node) { + $origin_locations = array_merge( + $origin_locations, + $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) + ); + } + } + + $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; + + if ($origin_location && $origin_location->getHash() === $arg_location->getHash()) { + $origin_location = null; + } + + IssueBuffer::maybeAdd( + new MixedOperand( + 'Right operand cannot be mixed', + $arg_location, + $origin_location + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + return; + } + + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); + } + + self::analyzeOperand($statements_analyzer, $left, $left_type, 'Left', $context); + self::analyzeOperand($statements_analyzer, $right, $right_type, 'Right', $context); + + // If both types are specific literals, combine them into new literals + $literal_concat = false; + + if ($left_type->allSpecificLiterals() && $right_type->allSpecificLiterals()) { + $left_type_parts = $left_type->getAtomicTypes(); + $right_type_parts = $right_type->getAtomicTypes(); + $combinations = count($left_type_parts) * count($right_type_parts); + if ($combinations < self::MAX_LITERALS) { + $literal_concat = true; + $result_type_parts = []; + + foreach ($left_type->getAtomicTypes() as $left_type_part) { + foreach ($right_type->getAtomicTypes() as $right_type_part) { + $literal = $left_type_part->value . $right_type_part->value; + if (strlen($literal) >= $config->max_string_length) { + // Literal too long, use non-literal type instead + $literal_concat = false; + break 2; + } + + $result_type_parts[] = new TLiteralString($literal); + } + } + + if ($literal_concat) { + assert(count($result_type_parts) === $combinations); + assert(count($result_type_parts) !== 0); // #8163 + $result_type = new Union($result_type_parts); + } + } + } + + if (!$literal_concat) { + $numeric_type = Type::getNumericString(); + $numeric_type->addType(new TInt()); + $numeric_type->addType(new TFloat()); + $left_is_numeric = UnionTypeComparator::isContainedBy( + $codebase, + $left_type, + $numeric_type + ); + + if ($left_is_numeric) { + $right_uint = Type::getPositiveInt(); + $right_uint->addType(new TLiteralInt(0)); + $right_is_uint = UnionTypeComparator::isContainedBy( + $codebase, + $right_type, + $right_uint + ); + + if ($right_is_uint) { + $result_type = Type::getNumericString(); + return; + } + } + + $lowercase_type = clone $numeric_type; + $lowercase_type->addType(new TLowercaseString()); + + $all_lowercase = UnionTypeComparator::isContainedBy( + $codebase, + $left_type, + $lowercase_type + ) && UnionTypeComparator::isContainedBy( + $codebase, + $right_type, + $lowercase_type + ); + + $non_empty_string = clone $numeric_type; + $non_empty_string->addType(new TNonEmptyString()); + + $has_non_empty = UnionTypeComparator::isContainedBy( + $codebase, + $left_type, + $non_empty_string + ) || UnionTypeComparator::isContainedBy( + $codebase, + $right_type, + $non_empty_string + ); + + $all_literals = $left_type->allLiterals() && $right_type->allLiterals(); + + if ($has_non_empty) { + if ($all_literals) { + $result_type = new Union([new TNonEmptyNonspecificLiteralString]); + } elseif ($all_lowercase) { + $result_type = Type::getNonEmptyLowercaseString(); + } else { + $result_type = Type::getNonEmptyString(); + } + } else { + if ($all_literals) { + $result_type = new Union([new TNonspecificLiteralString]); + } elseif ($all_lowercase) { + $result_type = Type::getLowercaseString(); + } else { + $result_type = Type::getString(); + } + } + } + } + } + + private static function analyzeOperand( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $operand, + Union $operand_type, + string $side, + Context $context + ): void { + $codebase = $statements_analyzer->getCodebase(); + $config = Config::getInstance(); + + if ($operand_type->isNull()) { + IssueBuffer::maybeAdd( + new NullOperand( + 'Cannot concatenate with a ' . $operand_type, + new CodeLocation($statements_analyzer->getSource(), $operand) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + if ($operand_type->isFalse()) { + IssueBuffer::maybeAdd( + new FalseOperand( + 'Cannot concatenate with a ' . $operand_type, + new CodeLocation($statements_analyzer->getSource(), $operand) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + if ($operand_type->isNullable() && !$operand_type->ignore_nullable_issues) { + IssueBuffer::maybeAdd( + new PossiblyNullOperand( + 'Cannot concatenate with a possibly null ' . $operand_type, + new CodeLocation($statements_analyzer->getSource(), $operand) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($operand_type->isFalsable() && !$operand_type->ignore_falsable_issues) { + IssueBuffer::maybeAdd( + new PossiblyFalseOperand( + 'Cannot concatenate with a possibly false ' . $operand_type, + new CodeLocation($statements_analyzer->getSource(), $operand) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $operand_type_match = true; + $has_valid_operand = false; + $comparison_result = new TypeComparisonResult(); + + foreach ($operand_type->getAtomicTypes() as $operand_type_part) { + if ($operand_type_part instanceof TTemplateParam && !$operand_type_part->as->isString()) { + IssueBuffer::maybeAdd( + new MixedOperand( + "$side operand cannot be a non-string template param", + new CodeLocation($statements_analyzer->getSource(), $operand) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + if ($operand_type_part instanceof TNull || $operand_type_part instanceof TFalse) { + continue; + } + + $operand_type_part_match = AtomicTypeComparator::isContainedBy( + $codebase, + $operand_type_part, + new TString, + false, + false, + $comparison_result + ); + + $operand_type_match = $operand_type_match && $operand_type_part_match; + + $has_valid_operand = $has_valid_operand || $operand_type_part_match; + + if ($comparison_result->to_string_cast && $config->strict_binary_operands) { + IssueBuffer::maybeAdd( + new ImplicitToStringCast( + "$side side of concat op expects string, '$operand_type' provided with a __toString method", + new CodeLocation($statements_analyzer->getSource(), $operand) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + foreach ($operand_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TNamedObject) { + $to_string_method_id = new MethodIdentifier( + $atomic_type->value, + '__tostring' + ); + + if ($codebase->methods->methodExists( + $to_string_method_id, + $context->calling_method_id, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer->getSource(), $operand) + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $statements_analyzer + : null, + $statements_analyzer->getFilePath() + )) { + try { + $storage = $codebase->methods->getStorage($to_string_method_id); + } catch (UnexpectedValueException $e) { + continue; + } + + if ($context->mutation_free && !$storage->mutation_free) { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a possibly-mutating method ' + . $atomic_type->value . '::__toString from a pure context', + new CodeLocation($statements_analyzer, $operand) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + } + } + } + } + + if (!$operand_type_match + && (!$comparison_result->scalar_type_match_found || $config->strict_binary_operands) + ) { + if ($has_valid_operand) { + IssueBuffer::maybeAdd( + new PossiblyInvalidOperand( + 'Cannot concatenate with a ' . $operand_type, + new CodeLocation($statements_analyzer->getSource(), $operand) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidOperand( + 'Cannot concatenate with a ' . $operand_type, + new CodeLocation($statements_analyzer->getSource(), $operand) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php new file mode 100644 index 00000000..c4381115 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php @@ -0,0 +1,134 @@ +node_data->getType($stmt->left); + $stmt_right_type = $statements_analyzer->node_data->getType($stmt->right); + + if (!$stmt_left_type || !$stmt_right_type) { + return; + } + + if (($stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd + ) + && $stmt_left_type->hasString() + && $stmt_right_type->hasString() + ) { + $stmt_type = Type::getString(); + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + BinaryOpAnalyzer::addDataFlow( + $statements_analyzer, + $stmt, + $stmt->left, + $stmt->right, + 'nondivop' + ); + + return; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Plus + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Minus + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Mod + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Mul + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Pow + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\ShiftLeft + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\ShiftRight + ) { + ArithmeticOpAnalyzer::analyze( + $statements_analyzer, + $statements_analyzer->node_data, + $stmt->left, + $stmt->right, + $stmt, + $result_type, + $context + ); + + if (!$result_type) { + $result_type = new Union([new TInt(), new TFloat()]); + } + + $statements_analyzer->node_data->setType($stmt, $result_type); + + BinaryOpAnalyzer::addDataFlow( + $statements_analyzer, + $stmt, + $stmt->left, + $stmt->right, + 'nondivop' + ); + + return; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalXor) { + if ($stmt_left_type->hasBool() || $stmt_right_type->hasBool()) { + $statements_analyzer->node_data->setType($stmt, Type::getBool()); + } + + BinaryOpAnalyzer::addDataFlow( + $statements_analyzer, + $stmt, + $stmt->left, + $stmt->right, + 'xor' + ); + + return; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Div) { + ArithmeticOpAnalyzer::analyze( + $statements_analyzer, + $statements_analyzer->node_data, + $stmt->left, + $stmt->right, + $stmt, + $result_type, + $context + ); + + if (!$result_type) { + $result_type = new Union([new TInt(), new TFloat()]); + } + + $statements_analyzer->node_data->setType($stmt, $result_type); + + BinaryOpAnalyzer::addDataFlow( + $statements_analyzer, + $stmt, + $stmt->left, + $stmt->right, + 'div' + ); + + return; + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php new file mode 100644 index 00000000..d584d43f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php @@ -0,0 +1,411 @@ +left, $stmt->left->getAttributes()), + [ + 'stmts' => [ + new VirtualExpression( + $stmt->right + ) + ] + ], + $stmt->getAttributes() + ); + + return IfElseAnalyzer::analyze($statements_analyzer, $fake_if_stmt, $context) !== false; + } + + $codebase = $statements_analyzer->getCodebase(); + + $post_leaving_if_context = null; + + if (!$stmt->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || !$stmt->left->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || !$stmt->left->left->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + ) { + $if_scope = new IfScope(); + + try { + $if_conditional_scope = IfConditionalAnalyzer::analyze( + $statements_analyzer, + $stmt->left, + $context, + $codebase, + $if_scope, + $context->branch_point ?: (int) $stmt->getAttribute('startFilePos') + ); + + $left_context = $if_conditional_scope->if_context; + + $left_referenced_var_ids = $if_conditional_scope->cond_referenced_var_ids; + $left_assigned_var_ids = $if_conditional_scope->assigned_in_conditional_var_ids; + + if ($stmt->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr) { + $post_leaving_if_context = clone $context; + } + } catch (ScopeAnalysisException $e) { + return false; + } + } else { + $pre_referenced_var_ids = $context->referenced_var_ids; + $context->referenced_var_ids = []; + + $pre_assigned_var_ids = $context->assigned_var_ids; + + $post_leaving_if_context = clone $context; + + $left_context = clone $context; + $left_context->parent_context = $context; + $left_context->if_context = null; + $left_context->assigned_var_ids = []; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->left, $left_context) === false) { + return false; + } + + IfConditionalAnalyzer::handleParadoxicalCondition($statements_analyzer, $stmt->left); + + foreach ($left_context->vars_in_scope as $var_id => $type) { + if (!isset($context->vars_in_scope[$var_id])) { + if (isset($left_context->assigned_var_ids[$var_id])) { + $context->vars_in_scope[$var_id] = clone $type; + } + } else { + $context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $context->vars_in_scope[$var_id], + $type, + $codebase + ); + } + } + + $left_referenced_var_ids = $left_context->referenced_var_ids; + $left_context->referenced_var_ids = array_merge($pre_referenced_var_ids, $left_referenced_var_ids); + + $left_assigned_var_ids = array_diff_key($left_context->assigned_var_ids, $pre_assigned_var_ids); + $left_context->assigned_var_ids = array_merge($pre_assigned_var_ids, $left_context->assigned_var_ids); + + $left_referenced_var_ids = array_diff_key($left_referenced_var_ids, $left_assigned_var_ids); + } + + $left_cond_id = spl_object_id($stmt->left); + + $left_clauses = FormulaGenerator::getFormula( + $left_cond_id, + $left_cond_id, + $stmt->left, + $context->self, + $statements_analyzer, + $codebase + ); + + try { + $negated_left_clauses = Algebra::negateFormula($left_clauses); + } catch (ComplicatedExpressionException $e) { + try { + $negated_left_clauses = FormulaGenerator::getFormula( + $left_cond_id, + $left_cond_id, + new VirtualBooleanNot($stmt->left), + $context->self, + $statements_analyzer, + $codebase, + false + ); + } catch (ComplicatedExpressionException $e) { + return false; + } + } + + if ($left_context->reconciled_expression_clauses) { + $reconciled_expression_clauses = $left_context->reconciled_expression_clauses; + + $negated_left_clauses = array_values( + array_filter( + $negated_left_clauses, + function ($c) use ($reconciled_expression_clauses): bool { + return !in_array($c->hash, $reconciled_expression_clauses); + } + ) + ); + + if (count($negated_left_clauses) === 1 + && $negated_left_clauses[0]->wedge + && !$negated_left_clauses[0]->possibilities + ) { + $negated_left_clauses = []; + } + } + + $clauses_for_right_analysis = Algebra::simplifyCNF( + array_merge( + $context->clauses, + $negated_left_clauses + ) + ); + + $active_negated_type_assertions = []; + + $negated_type_assertions = Algebra::getTruthsFromFormula( + $clauses_for_right_analysis, + $left_cond_id, + $left_referenced_var_ids, + $active_negated_type_assertions + ); + + $changed_var_ids = []; + + $right_context = clone $context; + + if ($stmt->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + && $left_assigned_var_ids + && $post_leaving_if_context + ) { + IfAnalyzer::addConditionallyAssignedVarsToContext( + $statements_analyzer, + $stmt->left, + $post_leaving_if_context, + $right_context, + $left_assigned_var_ids + ); + } + + if ($negated_type_assertions) { + // while in an or, we allow scope to boil over to support + // statements of the form if ($x === null || $x->foo()) + $right_vars_in_scope = Reconciler::reconcileKeyedTypes( + $negated_type_assertions, + $active_negated_type_assertions, + $right_context->vars_in_scope, + $changed_var_ids, + $left_referenced_var_ids, + $statements_analyzer, + [], + $left_context->inside_loop, + new CodeLocation($statements_analyzer->getSource(), $stmt->left), + !$context->inside_negation + ); + $right_context->vars_in_scope = $right_vars_in_scope; + } + + $right_context->clauses = $clauses_for_right_analysis; + + if ($changed_var_ids) { + $partitioned_clauses = Context::removeReconciledClauses($right_context->clauses, $changed_var_ids); + $right_context->clauses = $partitioned_clauses[0]; + $right_context->reconciled_expression_clauses = array_merge( + $context->reconciled_expression_clauses, + array_map( + function ($c) { + return $c->hash; + }, + $partitioned_clauses[1] + ) + ); + + $partitioned_clauses = Context::removeReconciledClauses($context->clauses, $changed_var_ids); + $context->clauses = $partitioned_clauses[0]; + $context->reconciled_expression_clauses = array_merge( + $context->reconciled_expression_clauses, + array_map( + function ($c) { + return $c->hash; + }, + $partitioned_clauses[1] + ) + ); + } + + $right_context->if_context = null; + + $pre_referenced_var_ids = $right_context->referenced_var_ids; + $right_context->referenced_var_ids = []; + + $pre_assigned_var_ids = $right_context->assigned_var_ids; + $right_context->assigned_var_ids = []; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->right, $right_context) === false) { + return false; + } + + IfConditionalAnalyzer::handleParadoxicalCondition($statements_analyzer, $stmt->right); + + $right_referenced_var_ids = $right_context->referenced_var_ids; + $right_context->referenced_var_ids = array_merge($pre_referenced_var_ids, $right_referenced_var_ids); + + $right_assigned_var_ids = $right_context->assigned_var_ids; + $right_context->assigned_var_ids = array_merge($pre_assigned_var_ids, $right_assigned_var_ids); + + $right_cond_id = spl_object_id($stmt->right); + + $right_clauses = FormulaGenerator::getFormula( + $right_cond_id, + $right_cond_id, + $stmt->right, + $context->self, + $statements_analyzer, + $codebase + ); + + $clauses_for_right_analysis = Context::removeReconciledClauses( + $clauses_for_right_analysis, + $right_assigned_var_ids + )[0]; + + $combined_right_clauses = Algebra::simplifyCNF( + array_merge($clauses_for_right_analysis, $right_clauses) + ); + + $active_right_type_assertions = []; + + $right_type_assertions = Algebra::getTruthsFromFormula( + $combined_right_clauses, + $right_cond_id, + $right_referenced_var_ids, + $active_right_type_assertions + ); + + if ($right_type_assertions) { + $right_changed_var_ids = []; + + Reconciler::reconcileKeyedTypes( + $right_type_assertions, + $active_right_type_assertions, + $right_context->vars_in_scope, + $right_changed_var_ids, + $right_referenced_var_ids, + $statements_analyzer, + [], + $left_context->inside_loop, + new CodeLocation($statements_analyzer->getSource(), $stmt->right), + $context->inside_negation + ); + } + + if (!($stmt->right instanceof PhpParser\Node\Expr\Exit_)) { + foreach ($right_context->vars_in_scope as $var_id => $type) { + if (isset($context->vars_in_scope[$var_id])) { + $context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $context->vars_in_scope[$var_id], + $type, + $codebase + ); + } + } + } elseif ($stmt->left instanceof PhpParser\Node\Expr\Assign) { + $var_id = ExpressionIdentifier::getVarId($stmt->left->var, $context->self); + + if ($var_id && isset($left_context->vars_in_scope[$var_id])) { + $left_inferred_reconciled = AssertionReconciler::reconcile( + '!falsy', + clone $left_context->vars_in_scope[$var_id], + '', + $statements_analyzer, + $context->inside_loop, + [], + new CodeLocation($statements_analyzer->getSource(), $stmt->left), + $statements_analyzer->getSuppressedIssues() + ); + + $context->vars_in_scope[$var_id] = $left_inferred_reconciled; + } + } + + if ($context->inside_conditional) { + $context->updateChecks($right_context); + } + + $context->referenced_var_ids = array_merge( + $right_context->referenced_var_ids, + $context->referenced_var_ids + ); + + $context->assigned_var_ids = array_merge( + $context->assigned_var_ids, + $right_context->assigned_var_ids + ); + + if ($context->if_context) { + $if_context = $context->if_context; + + foreach ($right_context->vars_in_scope as $var_id => $type) { + if (isset($if_context->vars_in_scope[$var_id])) { + $if_context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $type, + $if_context->vars_in_scope[$var_id], + $codebase + ); + } elseif (isset($left_context->vars_in_scope[$var_id])) { + $if_context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $type, + $left_context->vars_in_scope[$var_id], + $codebase + ); + } + } + + $if_context->referenced_var_ids = array_merge( + $context->referenced_var_ids, + $if_context->referenced_var_ids + ); + + $if_context->assigned_var_ids = array_merge( + $context->assigned_var_ids, + $if_context->assigned_var_ids + ); + + $if_context->updateChecks($context); + } + + $context->vars_possibly_in_scope = array_merge( + $right_context->vars_possibly_in_scope, + $context->vars_possibly_in_scope + ); + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php new file mode 100644 index 00000000..5a4108c0 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php @@ -0,0 +1,530 @@ + 100) { + $statements_analyzer->node_data->setType($stmt, Type::getString()); + + // ignore deeply-nested string concatenation + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd || + $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalAnd + ) { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + + $expr_result = AndAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context, + $from_stmt + ); + + $context->inside_general_use = $was_inside_general_use; + + $statements_analyzer->node_data->setType($stmt, Type::getBool()); + + return $expr_result; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr || + $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalOr + ) { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + + $expr_result = OrAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context, + $from_stmt + ); + + $context->inside_general_use = $was_inside_general_use; + + $statements_analyzer->node_data->setType($stmt, Type::getBool()); + + return $expr_result; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Coalesce) { + $expr_result = CoalesceAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context + ); + + self::addDataFlow( + $statements_analyzer, + $stmt, + $stmt->left, + $stmt->right, + 'coalesce' + ); + + return $expr_result; + } + + if ($stmt->left instanceof PhpParser\Node\Expr\BinaryOp) { + if (self::analyze($statements_analyzer, $stmt->left, $context, $nesting + 1) === false) { + return false; + } + } else { + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->left, $context) === false) { + return false; + } + } + + if ($stmt->right instanceof PhpParser\Node\Expr\BinaryOp) { + if (self::analyze($statements_analyzer, $stmt->right, $context, $nesting + 1) === false) { + return false; + } + } else { + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->right, $context) === false) { + return false; + } + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat) { + $stmt_type = Type::getString(); + + ConcatAnalyzer::analyze( + $statements_analyzer, + $stmt->left, + $stmt->right, + $context, + $result_type + ); + + if ($result_type) { + $stmt_type = $result_type; + } + + if ($statements_analyzer->data_flow_graph + && ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + || !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues())) + ) { + $stmt_left_type = $statements_analyzer->node_data->getType($stmt->left); + $stmt_right_type = $statements_analyzer->node_data->getType($stmt->right); + + $var_location = new CodeLocation($statements_analyzer, $stmt); + + $new_parent_node = DataFlowNode::getForAssignment('concat', $var_location); + $statements_analyzer->data_flow_graph->addNode($new_parent_node); + + $stmt_type->parent_nodes = [ + $new_parent_node->id => $new_parent_node + ]; + + $codebase = $statements_analyzer->getCodebase(); + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + if ($stmt_left_type && $stmt_left_type->parent_nodes) { + foreach ($stmt_left_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $new_parent_node, + 'concat', + $added_taints, + $removed_taints + ); + } + } + + if ($stmt_right_type && $stmt_right_type->parent_nodes) { + foreach ($stmt_right_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $new_parent_node, + 'concat', + $added_taints, + $removed_taints + ); + } + } + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Spaceship) { + $statements_analyzer->node_data->setType( + $stmt, + new Union( + [ + new TLiteralInt(-1), + new TLiteralInt(0), + new TLiteralInt(1) + ] + ) + ); + + self::addDataFlow( + $statements_analyzer, + $stmt, + $stmt->left, + $stmt->right, + '<=>' + ); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotEqual + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Greater + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Smaller + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual + ) { + $statements_analyzer->node_data->setType($stmt, Type::getBool()); + + $stmt_left_type = $statements_analyzer->node_data->getType($stmt->left); + $stmt_right_type = $statements_analyzer->node_data->getType($stmt->right); + + if (($stmt instanceof PhpParser\Node\Expr\BinaryOp\Greater + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Smaller + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual) + && $statements_analyzer->getCodebase()->config->strict_binary_operands + && $stmt_left_type + && $stmt_right_type + && (($stmt_left_type->isSingle() && $stmt_left_type->hasBool()) + || ($stmt_right_type->isSingle() && $stmt_right_type->hasBool())) + ) { + IssueBuffer::maybeAdd( + new InvalidOperand( + 'Cannot compare ' . $stmt_left_type->getId() . ' to ' . $stmt_right_type->getId(), + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotEqual + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) + && $stmt->left instanceof PhpParser\Node\Expr\FuncCall + && $stmt->left->name instanceof PhpParser\Node\Name + && $stmt->left->name->parts === ['substr'] + && isset($stmt->left->getArgs()[1]) + && $stmt_right_type + && $stmt_right_type->hasLiteralString() + ) { + $from_type = $statements_analyzer->node_data->getType($stmt->left->getArgs()[1]->value); + + $length_type = isset($stmt->left->getArgs()[2]) + ? ($statements_analyzer->node_data->getType($stmt->left->getArgs()[2]->value) ?? Type::getMixed()) + : null; + + $string_length = null; + + if ($from_type && $from_type->isSingleIntLiteral() && $length_type === null) { + $string_length = -$from_type->getSingleIntLiteral()->value; + } elseif ($length_type && $length_type->isSingleIntLiteral()) { + $string_length = $length_type->getSingleIntLiteral()->value; + } + + if ($string_length > 0) { + foreach ($stmt_right_type->getAtomicTypes() as $atomic_right_type) { + if ($atomic_right_type instanceof TLiteralString) { + if (strlen($atomic_right_type->value) !== $string_length) { + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical + ) { + if ($atomic_right_type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + $atomic_right_type . ' string length is not ' . $string_length, + new CodeLocation($statements_analyzer, $stmt), + null + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + $atomic_right_type . ' string length is not ' . $string_length, + new CodeLocation($statements_analyzer, $stmt), + null + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } else { + if ($atomic_right_type->from_docblock) { + IssueBuffer::maybeAdd( + new RedundantConditionGivenDocblockType( + $atomic_right_type . ' string length is never ' . $string_length, + new CodeLocation($statements_analyzer, $stmt), + null + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RedundantCondition( + $atomic_right_type . ' string length is never ' . $string_length, + new CodeLocation($statements_analyzer, $stmt), + null + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + } + } + } + } + + $codebase = $statements_analyzer->getCodebase(); + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal + && $stmt_left_type + && $stmt_right_type + && ($context->mutation_free || $codebase->alter_code) + ) { + self::checkForImpureEqualityComparison( + $statements_analyzer, + $stmt, + $stmt_left_type, + $stmt_right_type + ); + } + + self::addDataFlow( + $statements_analyzer, + $stmt, + $stmt->left, + $stmt->right, + 'comparison' + ); + + return true; + } + + NonComparisonOpAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context + ); + + return true; + } + + public static function addDataFlow( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $stmt, + PhpParser\Node\Expr $left, + PhpParser\Node\Expr $right, + string $type = 'binaryop' + ): void { + if ($stmt->getLine() === -1) { + throw new UnexpectedValueException('bad'); + } + $result_type = $statements_analyzer->node_data->getType($stmt); + if (!$result_type) { + return; + } + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && $stmt instanceof PhpParser\Node\Expr\BinaryOp + && !$stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat + && !$stmt instanceof PhpParser\Node\Expr\BinaryOp\Coalesce + && (!$stmt instanceof PhpParser\Node\Expr\BinaryOp\Plus || !$result_type->hasArray()) + ) { + //among BinaryOp, only Concat and Coalesce can pass tainted value to the result. Also Plus on arrays only + return; + } + + if ($statements_analyzer->data_flow_graph) { + $stmt_left_type = $statements_analyzer->node_data->getType($left); + $stmt_right_type = $statements_analyzer->node_data->getType($right); + + $var_location = new CodeLocation($statements_analyzer, $stmt); + + $new_parent_node = DataFlowNode::getForAssignment($type, $var_location); + $statements_analyzer->data_flow_graph->addNode($new_parent_node); + + $result_type->parent_nodes = [ + $new_parent_node->id => $new_parent_node + ]; + + if ($stmt_left_type && $stmt_left_type->parent_nodes) { + foreach ($stmt_left_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath($parent_node, $new_parent_node, $type); + } + } + + if ($stmt_right_type && $stmt_right_type->parent_nodes) { + foreach ($stmt_right_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath($parent_node, $new_parent_node, $type); + } + } + + if ($stmt instanceof PhpParser\Node\Expr\AssignOp + && $statements_analyzer->data_flow_graph instanceof VariableUseGraph + ) { + $root_expr = $left; + + while ($root_expr instanceof PhpParser\Node\Expr\ArrayDimFetch) { + $root_expr = $root_expr->var; + } + + if ($left instanceof PhpParser\Node\Expr\PropertyFetch) { + $statements_analyzer->data_flow_graph->addPath( + $new_parent_node, + new DataFlowNode('variable-use', 'variable use', null), + 'used-by-instance-property' + ); + } if ($left instanceof PhpParser\Node\Expr\StaticPropertyFetch) { + $statements_analyzer->data_flow_graph->addPath( + $new_parent_node, + new DataFlowNode('variable-use', 'variable use', null), + 'use-in-static-property' + ); + } elseif (!$left instanceof PhpParser\Node\Expr\Variable) { + $statements_analyzer->data_flow_graph->addPath( + $new_parent_node, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use' + ); + } + } + } + } + + private static function checkForImpureEqualityComparison( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\BinaryOp\Equal $stmt, + Union $stmt_left_type, + Union $stmt_right_type + ): void { + $codebase = $statements_analyzer->getCodebase(); + + if ($stmt_left_type->hasString() && $stmt_right_type->hasObjectType()) { + foreach ($stmt_right_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TNamedObject) { + try { + $storage = $codebase->methods->getStorage( + new MethodIdentifier( + $atomic_type->value, + '__tostring' + ) + ); + } catch (UnexpectedValueException $e) { + continue; + } + + if (!$storage->mutation_free) { + if ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } else { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a possibly-mutating method ' + . $atomic_type->value . '::__toString from a pure context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + } + } elseif ($stmt_right_type->hasString() && $stmt_left_type->hasObjectType()) { + foreach ($stmt_left_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TNamedObject) { + try { + $storage = $codebase->methods->getStorage( + new MethodIdentifier( + $atomic_type->value, + '__tostring' + ) + ); + } catch (UnexpectedValueException $e) { + continue; + } + + if (!$storage->mutation_free) { + if ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } else { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a possibly-mutating method ' + . $atomic_type->value . '::__toString from a pure context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + } + } + } +} 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 new file mode 100644 index 00000000..fa8c19d6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php @@ -0,0 +1,124 @@ +expr, $context) === false) { + return false; + } + + if (!($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr))) { + $statements_analyzer->node_data->setType($stmt, new Union([new TInt(), new TString()])); + } elseif ($stmt_expr_type->isMixed()) { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } else { + $acceptable_types = []; + $unacceptable_type = null; + $has_valid_operand = false; + + foreach ($stmt_expr_type->getAtomicTypes() as $type_string => $type_part) { + if ($type_part instanceof TInt || $type_part instanceof TString) { + if ($type_part instanceof TLiteralInt) { + $type_part->value = ~$type_part->value; + } elseif ($type_part instanceof TLiteralString) { + $type_part->value = ~$type_part->value; + } + + $acceptable_types[] = $type_part; + $has_valid_operand = true; + } elseif ($type_part instanceof TFloat) { + $type_part = ($type_part instanceof TLiteralFloat) ? + new TLiteralInt(~$type_part->value) : + new TInt; + + $stmt_expr_type->removeType($type_string); + $stmt_expr_type->addType($type_part); + + $acceptable_types[] = $type_part; + $has_valid_operand = true; + } elseif (!$unacceptable_type) { + $unacceptable_type = $type_part; + } + } + + if ($unacceptable_type || !$acceptable_types) { + $message = 'Cannot negate a non-numeric non-string type ' . $unacceptable_type; + if ($has_valid_operand) { + IssueBuffer::maybeAdd( + new PossiblyInvalidOperand( + $message, + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidOperand( + $message, + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } else { + $statements_analyzer->node_data->setType($stmt, new Union($acceptable_types)); + } + } + + self::addDataFlow($statements_analyzer, $stmt, $stmt->expr); + + return true; + } + + private static function addDataFlow( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $stmt, + PhpParser\Node\Expr $value + ): void { + $result_type = $statements_analyzer->node_data->getType($stmt); + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph && $result_type) { + $var_location = new CodeLocation($statements_analyzer, $stmt); + + $stmt_value_type = $statements_analyzer->node_data->getType($value); + + $new_parent_node = DataFlowNode::getForAssignment('bitwisenot', $var_location); + $statements_analyzer->data_flow_graph->addNode($new_parent_node); + $result_type->parent_nodes = [ + $new_parent_node->id => $new_parent_node, + ]; + + if ($stmt_value_type && $stmt_value_type->parent_nodes) { + foreach ($stmt_value_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath($parent_node, $new_parent_node, 'bitwisenot'); + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php new file mode 100644 index 00000000..cf135ee9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php @@ -0,0 +1,46 @@ +inside_negation; + + $context->inside_negation = !$inside_negation; + + $result = ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context); + + $context->inside_negation = $inside_negation; + + $expr_type = $statements_analyzer->node_data->getType($stmt->expr); + + $stmt_type = Type::getBool(); + if ($expr_type) { + if ($expr_type->isAlwaysTruthy()) { + $stmt_type = Type::getFalse(); + } elseif ($expr_type->isAlwaysFalsy()) { + $stmt_type = Type::getTrue(); + } + + $stmt_type->from_docblock = $expr_type->from_docblock; + $stmt_type->parent_nodes = $expr_type->parent_nodes; + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + return $result; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php new file mode 100644 index 00000000..84b777c7 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php @@ -0,0 +1,1629 @@ +> $class_generic_params + * @return false|null + */ + public static function checkArgumentMatches( + StatementsAnalyzer $statements_analyzer, + ?string $cased_method_id, + ?MethodIdentifier $method_id, + ?string $self_fq_class_name, + ?string $static_fq_class_name, + CodeLocation $function_call_location, + ?FunctionLikeParameter $function_param, + int $argument_offset, + int $unpacked_argument_offset, + bool $allow_named_args, + PhpParser\Node\Arg $arg, + ?Union $arg_value_type, + Context $context, + array $class_generic_params, + ?TemplateResult $template_result, + bool $specialize_taint, + bool $in_call_map + ): ?bool { + $codebase = $statements_analyzer->getCodebase(); + + if (!$arg_value_type) { + if ($function_param && !$function_param->by_ref) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + $param_type = $function_param->type; + + if ($function_param->is_variadic + && $param_type + && $param_type->hasArray() + ) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TList|TArray + */ + $array_type = $param_type->getAtomicTypes()['array']; + + if ($array_type instanceof TList) { + $param_type = $array_type->type_param; + } else { + $param_type = $array_type->type_params[1]; + } + } + + if ($param_type && !$param_type->hasMixed()) { + IssueBuffer::maybeAdd( + new MixedArgument( + 'Argument ' . ($argument_offset + 1) . ' of ' . $cased_method_id + . ' cannot be mixed, expecting ' . $param_type, + new CodeLocation($statements_analyzer->getSource(), $arg->value), + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + return null; + } + + if (!$function_param) { + return null; + } + + if ($function_param->expect_variable + && $arg_value_type->isSingleStringLiteral() + && !$arg->value instanceof PhpParser\Node\Scalar\MagicConst + && !$arg->value instanceof PhpParser\Node\Expr\ConstFetch + && !$arg->value instanceof PhpParser\Node\Expr\ClassConstFetch + ) { + $values = preg_split('//u', $arg_value_type->getSingleStringLiteral()->value, -1, PREG_SPLIT_NO_EMPTY); + + if ($values !== false) { + $prev_ord = 0; + + $gt_count = 0; + + foreach ($values as $value) { + $ord = ord($value); + + if ($ord > $prev_ord) { + $gt_count++; + } + + $prev_ord = $ord; + } + + if (count($values) < 12 || ($gt_count / count($values)) < 0.8) { + IssueBuffer::maybeAdd( + new InvalidLiteralArgument( + 'Argument ' . ($argument_offset + 1) . ' of ' . $cased_method_id + . ' expects a non-literal value, ' . $arg_value_type->getId() . ' provided', + new CodeLocation($statements_analyzer->getSource(), $arg->value), + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + if (self::checkFunctionLikeTypeMatches( + $statements_analyzer, + $codebase, + $cased_method_id, + $method_id, + $self_fq_class_name, + $static_fq_class_name, + $function_call_location, + $function_param, + $allow_named_args, + $arg_value_type, + $argument_offset, + $unpacked_argument_offset, + $arg, + $context, + $class_generic_params, + $template_result, + $specialize_taint, + $in_call_map + ) === false) { + return false; + } + + return null; + } + + /** + * @param array> $class_generic_params + * @return false|null + */ + private static function checkFunctionLikeTypeMatches( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + ?string $cased_method_id, + ?MethodIdentifier $method_id, + ?string $self_fq_class_name, + ?string $static_fq_class_name, + CodeLocation $function_call_location, + FunctionLikeParameter $function_param, + bool $allow_named_args, + Union $arg_type, + int $argument_offset, + int $unpacked_argument_offset, + PhpParser\Node\Arg $arg, + Context $context, + ?array $class_generic_params, + ?TemplateResult $template_result, + bool $specialize_taint, + bool $in_call_map + ): ?bool { + if (!$function_param->type) { + if (!$codebase->infer_types_from_usage && !$statements_analyzer->data_flow_graph) { + return null; + } + + $param_type = Type::getMixed(); + } else { + $param_type = clone $function_param->type; + } + + $bindable_template_params = []; + + if ($template_result) { + $bindable_template_params = $param_type->getTemplateTypes(); + } + + $parent_class = null; + + $classlike_storage = null; + $static_classlike_storage = null; + + if ($self_fq_class_name) { + $classlike_storage = $codebase->classlike_storage_provider->get($self_fq_class_name); + $parent_class = $classlike_storage->parent_class; + $static_classlike_storage = $classlike_storage; + + if ($static_fq_class_name && $static_fq_class_name !== $self_fq_class_name) { + $static_classlike_storage = $codebase->classlike_storage_provider->get($static_fq_class_name); + } + } + + $param_type = TypeExpander::expandUnion( + $codebase, + $param_type, + $classlike_storage->name ?? null, + $static_classlike_storage->name ?? null, + $parent_class, + true, + false, + $static_classlike_storage->final ?? false, + true + ); + + if ($class_generic_params) { + // here we're replacing the param types and arg types with the bound + // class template params. + // + // For example, if we're operating on a class Foo with params TKey and TValue, + // and we're calling a method "add(TKey $key, TValue $value)" on an instance + // of that class where we know that TKey is int and TValue is string, then we + // want to substitute the expected parameters so it's as if we were actually + // calling "add(int $key, string $value)" + $readonly_template_result = new TemplateResult($class_generic_params, []); + + // This flag ensures that the template results will never be written to + // It also supercedes the `$add_lower_bounds` flag so that closure params + // don’t get overwritten + $readonly_template_result->readonly = true; + + $arg_value_type = $statements_analyzer->node_data->getType($arg->value); + + $param_type = TemplateStandinTypeReplacer::replace( + $param_type, + $readonly_template_result, + $codebase, + $statements_analyzer, + $arg_value_type, + $argument_offset, + $context->self, + $context->calling_function_id ?: $context->calling_method_id + ); + + $arg_type = TemplateStandinTypeReplacer::replace( + $arg_type, + $readonly_template_result, + $codebase, + $statements_analyzer, + $arg_value_type, + $argument_offset, + $context->self, + $context->calling_function_id ?: $context->calling_method_id + ); + } + + if ($template_result && $template_result->template_types) { + $arg_type_param = $arg_type; + + if ($arg->unpack) { + $arg_type_param = null; + + foreach ($arg_type->getAtomicTypes() as $arg_atomic_type) { + if ($arg_atomic_type instanceof TArray + || $arg_atomic_type instanceof TList + || $arg_atomic_type instanceof TKeyedArray + ) { + if ($arg_atomic_type instanceof TKeyedArray) { + $arg_type_param = $arg_atomic_type->getGenericValueType(); + } elseif ($arg_atomic_type instanceof TList) { + $arg_type_param = $arg_atomic_type->type_param; + } else { + $arg_type_param = $arg_atomic_type->type_params[1]; + } + } elseif ($arg_atomic_type instanceof TIterable) { + $arg_type_param = $arg_atomic_type->type_params[1]; + } elseif ($arg_atomic_type instanceof TNamedObject) { + ForeachAnalyzer::getKeyValueParamsForTraversableObject( + $arg_atomic_type, + $codebase, + $key_type, + $arg_type_param + ); + } + } + + if (!$arg_type_param) { + $arg_type_param = Type::getMixed(); + $arg_type_param->parent_nodes = $arg_type->parent_nodes; + } + } + + $param_type = TemplateStandinTypeReplacer::replace( + $param_type, + $template_result, + $codebase, + $statements_analyzer, + $arg_type_param, + $argument_offset, + !$statements_analyzer->isStatic() + && (!$method_id || $method_id->method_name !== '__construct') + ? $context->self + : null, + $context->calling_method_id ?: $context->calling_function_id + ); + + foreach ($bindable_template_params as $template_type) { + if (!isset( + $template_result->lower_bounds + [$template_type->param_name] + [$template_type->defining_class] + )) { + if (isset( + $template_result->upper_bounds + [$template_type->param_name] + [$template_type->defining_class] + )) { + $template_result->lower_bounds[$template_type->param_name][$template_type->defining_class] = [ + new TemplateBound( + clone $template_result->upper_bounds + [$template_type->param_name] + [$template_type->defining_class]->type + ) + ]; + } else { + $template_result->lower_bounds[$template_type->param_name][$template_type->defining_class] = [ + new TemplateBound( + clone $template_type->as + ) + ]; + } + } + } + + $param_type = TypeExpander::expandUnion( + $codebase, + $param_type, + $classlike_storage->name ?? null, + $static_classlike_storage->name ?? null, + $parent_class, + true, + false, + $static_classlike_storage->final ?? false, + true + ); + } + + $fleshed_out_signature_type = $function_param->signature_type + ? TypeExpander::expandUnion( + $codebase, + $function_param->signature_type, + $classlike_storage->name ?? null, + $static_classlike_storage->name ?? null, + $parent_class + ) + : null; + + $unpacked_atomic_array = null; + + if ($arg->unpack) { + if ($arg_type->hasMixed()) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + IssueBuffer::maybeAdd( + new MixedArgument( + 'Argument ' . ($argument_offset + 1) . ' of ' . $cased_method_id + . ' cannot unpack ' . $arg_type->getId() . ', expecting iterable', + new CodeLocation($statements_analyzer->getSource(), $arg->value), + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + if ($cased_method_id) { + $arg_location = new CodeLocation($statements_analyzer->getSource(), $arg->value); + + self::processTaintedness( + $statements_analyzer, + $cased_method_id, + $method_id, + $argument_offset, + $arg_location, + $function_call_location, + $function_param, + $arg_type, + $arg->value, + $context, + $specialize_taint + ); + } + + return null; + } + + if ($arg_type->hasArray()) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TList|TKeyedArray|TClassStringMap + */ + $unpacked_atomic_array = $arg_type->getAtomicTypes()['array']; + $arg_key_allowed = true; + + if ($unpacked_atomic_array instanceof TKeyedArray) { + if (!$allow_named_args && !$unpacked_atomic_array->getGenericKeyType()->isInt()) { + $arg_key_allowed = false; + } + + if ($function_param->is_variadic) { + $arg_type = $unpacked_atomic_array->getGenericValueType(); + } elseif ($codebase->php_major_version >= 8 + && $allow_named_args + && isset($unpacked_atomic_array->properties[$function_param->name]) + ) { + $arg_type = clone $unpacked_atomic_array->properties[$function_param->name]; + } elseif ($unpacked_atomic_array->is_list + && isset($unpacked_atomic_array->properties[$unpacked_argument_offset]) + ) { + $arg_type = clone $unpacked_atomic_array->properties[$unpacked_argument_offset]; + } elseif ($function_param->is_optional && $function_param->default_type) { + if ($function_param->default_type instanceof Union) { + $arg_type = $function_param->default_type; + } else { + $arg_type_atomic = ConstantTypeResolver::resolve( + $codebase->classlikes, + $function_param->default_type, + $statements_analyzer + ); + + $arg_type = new Union([$arg_type_atomic]); + } + } else { + $arg_type = Type::getMixed(); + } + } elseif ($unpacked_atomic_array instanceof TList) { + $arg_type = $unpacked_atomic_array->type_param; + } elseif ($unpacked_atomic_array instanceof TClassStringMap) { + $arg_type = Type::getMixed(); + } else { + if (!$allow_named_args && !$unpacked_atomic_array->type_params[0]->isInt()) { + $arg_key_allowed = false; + } + $arg_type = $unpacked_atomic_array->type_params[1]; + } + + if (!$arg_key_allowed) { + IssueBuffer::maybeAdd( + new NamedArgumentNotAllowed( + 'Method ' . $cased_method_id + . ' called with named unpacked array ' . $unpacked_atomic_array->getId() + . ' (array with string keys)', + new CodeLocation($statements_analyzer->getSource(), $arg->value), + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } else { + $non_iterable = false; + $invalid_key = false; + $invalid_string_key = false; + $possibly_matches = false; + foreach ($arg_type->getAtomicTypes() as $atomic_type) { + if (!$atomic_type->isIterable($codebase)) { + $non_iterable = true; + } else { + $key_type = $codebase->getKeyValueParamsForTraversableObject($atomic_type)[0]; + if (!UnionTypeComparator::isContainedBy( + $codebase, + $key_type, + Type::getArrayKey() + )) { + $invalid_key = true; + + continue; + } + if (($codebase->php_major_version < 8 || !$allow_named_args) && !$key_type->isInt()) { + $invalid_string_key = true; + + continue; + } + $possibly_matches = true; + } + } + + $issue_type = $possibly_matches ? PossiblyInvalidArgument::class : InvalidArgument::class; + if ($non_iterable) { + IssueBuffer::maybeAdd( + new $issue_type( + 'Tried to unpack non-iterable ' . $arg_type->getId(), + new CodeLocation($statements_analyzer->getSource(), $arg->value), + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + if ($invalid_key) { + IssueBuffer::maybeAdd( + new $issue_type( + 'Method ' . $cased_method_id + . ' called with unpacked iterable ' . $arg_type->getId() + . ' with invalid key (must be ' + . ($codebase->php_major_version < 8 ? 'int' : 'int|string') . ')', + new CodeLocation($statements_analyzer->getSource(), $arg->value), + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + if ($invalid_string_key) { + if ($codebase->php_major_version < 8) { + IssueBuffer::maybeAdd( + new $issue_type( + 'String keys not supported in unpacked arguments', + new CodeLocation($statements_analyzer->getSource(), $arg->value), + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new NamedArgumentNotAllowed( + 'Method ' . $cased_method_id + . ' called with named unpacked iterable ' . $arg_type->getId() + . ' (iterable with string keys)', + new CodeLocation($statements_analyzer->getSource(), $arg->value), + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + return null; + } + } else { + if (!$allow_named_args && $arg->name !== null) { + IssueBuffer::maybeAdd( + new NamedArgumentNotAllowed( + 'Method ' . $cased_method_id. ' called with named argument ' . $arg->name->name, + new CodeLocation($statements_analyzer->getSource(), $arg->value), + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + // bypass verifying argument types when collecting initialisations, + // because the argument locations are not reliable (file names normally differ) + // See https://github.com/vimeo/psalm/issues/5662 + if ($arg instanceof VirtualArg + && $context->collect_initializations + ) { + return null; + } + + if (self::verifyType( + $statements_analyzer, + $arg_type, + $param_type, + $fleshed_out_signature_type, + $cased_method_id, + $method_id, + $argument_offset, + new CodeLocation($statements_analyzer->getSource(), $arg->value), + $arg->value, + $context, + $function_param, + $arg->unpack, + $unpacked_atomic_array, + $specialize_taint, + $in_call_map, + $function_call_location + ) === false) { + return false; + } + + return null; + } + + /** + * @param TKeyedArray|TArray|TList|TClassStringMap|null $unpacked_atomic_array + * @return null|false + * @psalm-suppress ComplexMethod + */ + public static function verifyType( + StatementsAnalyzer $statements_analyzer, + Union $input_type, + Union $param_type, + ?Union $signature_param_type, + ?string $cased_method_id, + ?MethodIdentifier $method_id, + int $argument_offset, + CodeLocation $arg_location, + PhpParser\Node\Expr $input_expr, + Context $context, + FunctionLikeParameter $function_param, + bool $unpack, + ?Atomic $unpacked_atomic_array, + bool $specialize_taint, + bool $in_call_map, + CodeLocation $function_call_location + ): ?bool { + $codebase = $statements_analyzer->getCodebase(); + + if ($param_type->hasMixed()) { + if ($codebase->infer_types_from_usage + && !$input_type->hasMixed() + && !$param_type->from_docblock + && !$param_type->had_template + && $method_id + && strpos($method_id->method_name, '__') !== 0 + ) { + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if ($declaring_method_id) { + $id_lc = strtolower((string) $declaring_method_id); + $codebase->analyzer->possible_method_param_types[$id_lc][$argument_offset] + = Type::combineUnionTypes( + $codebase->analyzer->possible_method_param_types[$id_lc][$argument_offset] ?? null, + clone $input_type, + $codebase + ); + } + } + + if ($cased_method_id) { + self::processTaintedness( + $statements_analyzer, + $cased_method_id, + $method_id, + $argument_offset, + $arg_location, + $function_call_location, + $function_param, + $input_type, + $input_expr, + $context, + $specialize_taint + ); + } + + return null; + } + + $method_identifier = $cased_method_id ? ' of ' . $cased_method_id : ''; + + if ($input_type->hasMixed()) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + $origin_locations = []; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + foreach ($input_type->parent_nodes as $parent_node) { + $origin_locations = array_merge( + $origin_locations, + $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) + ); + } + } + + $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; + + if ($origin_location && $origin_location->getHash() === $arg_location->getHash()) { + $origin_location = null; + } + + IssueBuffer::maybeAdd( + new MixedArgument( + 'Argument ' . ($argument_offset + 1) . $method_identifier + . ' cannot be ' . $input_type->getId() . ', expecting ' . + $param_type, + $arg_location, + $cased_method_id, + $origin_location + ), + $statements_analyzer->getSuppressedIssues() + ); + + if ($input_type->isMixed()) { + if (!$function_param->by_ref + && !($function_param->is_variadic xor $unpack) + && $cased_method_id !== 'echo' + && $cased_method_id !== 'print' + && (!$in_call_map || $context->strict_types) + ) { + self::coerceValueAfterGatekeeperArgument( + $statements_analyzer, + $input_type, + false, + $input_expr, + $param_type, + $signature_param_type, + $context, + $unpack, + $unpacked_atomic_array + ); + } + } + + if ($cased_method_id) { + $input_type = self::processTaintedness( + $statements_analyzer, + $cased_method_id, + $method_id, + $argument_offset, + $arg_location, + $function_call_location, + $function_param, + $input_type, + $input_expr, + $context, + $specialize_taint + ); + } + + if ($input_type->isMixed()) { + return null; + } + } + + if ($input_type->isNever()) { + IssueBuffer::maybeAdd( + new NoValue( + 'This function or method call never returns output', + $arg_location + ), + $statements_analyzer->getSuppressedIssues() + ); + + return null; + } + + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); + } + + if ($function_param->by_ref || $function_param->is_optional) { + //if the param is optional or a ref, we'll allow the input to be possibly_undefined + $param_type->possibly_undefined = true; + } + + if ($param_type->hasCallableType() && $param_type->isSingle()) { + // we do this replacement early because later we don't have access to the + // $statements_analyzer, which is necessary to understand string function names + foreach ($input_type->getAtomicTypes() as $key => $atomic_type) { + if (!$atomic_type instanceof TLiteralString + || InternalCallMapHandler::inCallMap($atomic_type->value) + ) { + continue; + } + + $candidate_callable = CallableTypeComparator::getCallableFromAtomic( + $codebase, + $atomic_type, + null, + $statements_analyzer, + true + ); + + if ($candidate_callable) { + $input_type->removeType($key); + $input_type->addType($candidate_callable); + } + } + } + + $union_comparison_results = new TypeComparisonResult(); + + $type_match_found = UnionTypeComparator::isContainedBy( + $codebase, + $input_type, + $param_type, + true, + true, + $union_comparison_results + ); + + $replace_input_type = false; + + if ($union_comparison_results->replacement_union_type) { + $replace_input_type = true; + $input_type = $union_comparison_results->replacement_union_type; + } + + if ($cased_method_id) { + $old_input_type = $input_type; + + $input_type = self::processTaintedness( + $statements_analyzer, + $cased_method_id, + $method_id, + $argument_offset, + $arg_location, + $function_call_location, + $function_param, + $input_type, + $input_expr, + $context, + $specialize_taint + ); + + if ($old_input_type !== $input_type) { + $replace_input_type = true; + } + } + + if ($type_match_found + && $param_type->hasCallableType() + ) { + $potential_method_ids = []; + + foreach ($input_type->getAtomicTypes() as $input_type_part) { + if ($input_type_part instanceof TKeyedArray) { + $potential_method_id = CallableTypeComparator::getCallableMethodIdFromTKeyedArray( + $input_type_part, + $codebase, + $context->calling_method_id, + $statements_analyzer->getFilePath() + ); + + if ($potential_method_id && $potential_method_id !== 'not-callable') { + $potential_method_ids[] = $potential_method_id; + } + } elseif ($input_type_part instanceof TLiteralString + && strpos($input_type_part->value, '::') + ) { + $parts = explode('::', $input_type_part->value); + $potential_method_ids[] = new MethodIdentifier( + $parts[0], + strtolower($parts[1]) + ); + } + } + + foreach ($potential_method_ids as $potential_method_id) { + $codebase->methods->methodExists( + $potential_method_id, + $context->calling_method_id, + null, + $statements_analyzer, + $statements_analyzer->getFilePath(), + true, + $context->insideUse() + ); + } + } + + if ($context->strict_types + && !$input_type->hasArray() + && !$param_type->from_docblock + && $cased_method_id !== 'echo' + && $cased_method_id !== 'print' + && $cased_method_id !== 'sprintf' + ) { + $union_comparison_results->scalar_type_match_found = false; + + if ($union_comparison_results->to_string_cast) { + $union_comparison_results->to_string_cast = false; + $type_match_found = false; + } + } + + if ($union_comparison_results->type_coerced && !$input_type->hasMixed()) { + if ($union_comparison_results->type_coerced_from_mixed) { + $origin_locations = []; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + foreach ($input_type->parent_nodes as $parent_node) { + $origin_locations = array_merge( + $origin_locations, + $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) + ); + } + } + + $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; + + if ($origin_location && $origin_location->getHash() === $arg_location->getHash()) { + $origin_location = null; + } + + IssueBuffer::maybeAdd( + new MixedArgumentTypeCoercion( + 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . $param_type->getId() . + ', parent type ' . $input_type->getId() . ' provided', + $arg_location, + $cased_method_id, + $origin_location + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new ArgumentTypeCoercion( + 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . $param_type->getId() . + ', parent type ' . $input_type->getId() . ' provided', + $arg_location, + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($union_comparison_results->to_string_cast && $cased_method_id !== 'echo' && $cased_method_id !== 'print') { + IssueBuffer::maybeAdd( + new ImplicitToStringCast( + 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . + $param_type->getId() . ', ' . $input_type->getId() . ' provided with a __toString method', + $arg_location + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (!$type_match_found && !$union_comparison_results->type_coerced) { + $types_can_be_identical = UnionTypeComparator::canBeContainedBy( + $codebase, + $input_type, + $param_type, + true, + true + ); + + $type = ($input_type->possibly_undefined ? 'possibly undefined ' : '') . $input_type->getId(); + if ($union_comparison_results->scalar_type_match_found) { + if ($cased_method_id !== 'echo' && $cased_method_id !== 'print') { + IssueBuffer::maybeAdd( + new InvalidScalarArgument( + 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . + $param_type->getId() . ', ' . $type . ' provided', + $arg_location, + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } elseif ($types_can_be_identical) { + IssueBuffer::maybeAdd( + new PossiblyInvalidArgument( + 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . $param_type->getId() . + ', possibly different type ' . $type . ' provided', + $arg_location, + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidArgument( + 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . $param_type->getId() . + ', ' . $type . ' provided', + $arg_location, + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + return null; + } + + if ($input_expr instanceof PhpParser\Node\Scalar\String_ + || $input_expr instanceof PhpParser\Node\Expr\Array_ + || $input_expr instanceof PhpParser\Node\Expr\BinaryOp\Concat + ) { + self::verifyExplicitParam( + $statements_analyzer, + $param_type, + $arg_location, + $input_expr, + $context + ); + + return null; + } + + if (!$param_type->isNullable() && $cased_method_id !== 'echo' && $cased_method_id !== 'print') { + if ($input_type->isNull()) { + IssueBuffer::maybeAdd( + new NullArgument( + 'Argument ' . ($argument_offset + 1) . $method_identifier . ' cannot be null, ' . + 'null value provided to parameter with type ' . $param_type->getId(), + $arg_location, + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + return null; + } + + if ($input_type->isNullable() && !$input_type->ignore_nullable_issues) { + IssueBuffer::maybeAdd( + new PossiblyNullArgument( + 'Argument ' . ($argument_offset + 1) . $method_identifier . ' cannot be null, possibly ' . + 'null value provided', + $arg_location, + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if (!$param_type->isFalsable() && + !$param_type->hasBool() && + !$param_type->hasScalar() && + $cased_method_id !== 'echo' && + $cased_method_id !== 'print' + ) { + if ($input_type->isFalse()) { + IssueBuffer::maybeAdd( + new InvalidArgument( + 'Argument ' . ($argument_offset + 1) . $method_identifier . ' cannot be false, ' . + $param_type->getId() . ' value expected', + $arg_location, + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + return null; + } + + if ($input_type->isFalsable() && !$input_type->ignore_falsable_issues) { + IssueBuffer::maybeAdd( + new PossiblyFalseArgument( + 'Argument ' . ($argument_offset + 1) . $method_identifier . ' cannot be false, possibly ' . + $param_type->getId() . ' value expected', + $arg_location, + $cased_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if (($type_match_found || $input_type->hasMixed()) + && !$function_param->by_ref + && !($function_param->is_variadic xor $unpack) + && $cased_method_id !== 'echo' + && $cased_method_id !== 'print' + && (!$in_call_map || $context->strict_types) + ) { + self::coerceValueAfterGatekeeperArgument( + $statements_analyzer, + $input_type, + $replace_input_type, + $input_expr, + $param_type, + $signature_param_type, + $context, + $unpack, + $unpacked_atomic_array + ); + } + + return null; + } + + /** + * @param PhpParser\Node\Scalar\String_|PhpParser\Node\Expr\Array_|PhpParser\Node\Expr\BinaryOp\Concat $input_expr + */ + private static function verifyExplicitParam( + StatementsAnalyzer $statements_analyzer, + Union $param_type, + CodeLocation $arg_location, + PhpParser\Node\Expr $input_expr, + Context $context + ): void { + $codebase = $statements_analyzer->getCodebase(); + + foreach ($param_type->getAtomicTypes() as $param_type_part) { + if ($param_type_part instanceof TClassString + && $input_expr instanceof PhpParser\Node\Scalar\String_ + && $param_type->isSingle() + ) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $input_expr->value, + $arg_location, + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions(true) + ) === false + ) { + return; + } + } elseif ($param_type_part instanceof TArray + && $input_expr instanceof PhpParser\Node\Expr\Array_ + ) { + foreach ($param_type_part->type_params[1]->getAtomicTypes() as $param_array_type_part) { + if ($param_array_type_part instanceof TClassString) { + foreach ($input_expr->items as $item) { + if ($item && $item->value instanceof PhpParser\Node\Scalar\String_) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $item->value->value, + $arg_location, + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions(true) + ) === false + ) { + return; + } + } + } + } + } + } elseif ($param_type_part instanceof TCallable) { + $can_be_callable_like_array = false; + if ($param_type->hasArray()) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + */ + $param_array_type = $param_type->getAtomicTypes()['array']; + + $row_type = null; + if ($param_array_type instanceof TList) { + $row_type = $param_array_type->type_param; + } elseif ($param_array_type instanceof TArray) { + $row_type = $param_array_type->type_params[1]; + } elseif ($param_array_type instanceof TKeyedArray) { + $row_type = $param_array_type->getGenericArrayType()->type_params[1]; + } + + if ($row_type && + ($row_type->hasMixed() || $row_type->hasString()) + ) { + $can_be_callable_like_array = true; + } + } + + if (!$can_be_callable_like_array) { + $function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( + $statements_analyzer, + $input_expr + ); + + foreach ($function_ids as $function_id) { + if (strpos($function_id, '::') !== false) { + if ($function_id[0] === '$') { + $function_id = substr($function_id, 1); + } + + $function_id_parts = explode('&', $function_id); + + $non_existent_method_ids = []; + $has_valid_method = false; + + foreach ($function_id_parts as $function_id_part) { + [$callable_fq_class_name, $method_name] = explode('::', $function_id_part); + + switch ($callable_fq_class_name) { + case 'self': + case 'static': + case 'parent': + $container_class = $statements_analyzer->getFQCLN(); + + if ($callable_fq_class_name === 'parent') { + $container_class = $statements_analyzer->getParentFQCLN(); + } + + if (!$container_class) { + continue 2; + } + + $callable_fq_class_name = $container_class; + } + + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $callable_fq_class_name, + $arg_location, + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions(true) + ) === false + ) { + return; + } + + $function_id_part = new MethodIdentifier( + $callable_fq_class_name, + strtolower($method_name) + ); + + $call_method_id = new MethodIdentifier( + $callable_fq_class_name, + '__call' + ); + + if (!$codebase->classOrInterfaceOrEnumExists($callable_fq_class_name)) { + return; + } + + if (!$codebase->methods->methodExists($function_id_part) + && !$codebase->methods->methodExists($call_method_id) + ) { + $non_existent_method_ids[] = $function_id_part; + } else { + $has_valid_method = true; + } + } + + if (!$has_valid_method && !$param_type->hasString() && !$param_type->hasArray()) { + if (MethodAnalyzer::checkMethodExists( + $codebase, + $non_existent_method_ids[0], + $arg_location, + $statements_analyzer->getSuppressedIssues() + ) === false + ) { + return; + } + } + } else { + if (!$param_type->hasString() + && !$param_type->hasArray() + && CallAnalyzer::checkFunctionExists( + $statements_analyzer, + $function_id, + $arg_location, + false + ) === false + ) { + return; + } + } + } + } + } + } + } + + /** + * @param TKeyedArray|TArray|TList|TClassStringMap $unpacked_atomic_array + */ + private static function coerceValueAfterGatekeeperArgument( + StatementsAnalyzer $statements_analyzer, + Union $input_type, + bool $input_type_changed, + PhpParser\Node\Expr $input_expr, + Union $param_type, + ?Union $signature_param_type, + Context $context, + bool $unpack, + ?Atomic $unpacked_atomic_array + ): void { + if ($param_type->hasMixed()) { + return; + } + + if (!$input_type_changed && $param_type->from_docblock && !$input_type->hasMixed()) { + $input_type = clone $input_type; + + foreach ($param_type->getAtomicTypes() as $param_atomic_type) { + if ($param_atomic_type instanceof TGenericObject) { + foreach ($input_type->getAtomicTypes() as $input_atomic_type) { + if ($input_atomic_type instanceof TGenericObject + && $input_atomic_type->value === $param_atomic_type->value + ) { + foreach ($input_atomic_type->type_params as $i => $type_param) { + if ($type_param->isEmpty() && isset($param_atomic_type->type_params[$i])) { + $input_type_changed = true; + + $input_atomic_type->type_params[$i] = clone $param_atomic_type->type_params[$i]; + } + } + } + } + } + } + + if (!$input_type_changed) { + return; + } + } + + $var_id = ExpressionIdentifier::getVarId( + $input_expr, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($var_id) { + $was_cloned = false; + + if ($input_type->isNullable() && !$param_type->isNullable()) { + $input_type = clone $input_type; + $was_cloned = true; + $input_type->removeType('null'); + } + + if ($input_type->getId() === $param_type->getId()) { + if ($input_type->from_docblock) { + if (!$was_cloned) { + $was_cloned = true; + $input_type = clone $input_type; + } + + $input_type->from_docblock = false; + + foreach ($input_type->getAtomicTypes() as $atomic_type) { + $atomic_type->from_docblock = false; + } + } + } elseif ($input_type->hasMixed() && $signature_param_type) { + $was_cloned = true; + $parent_nodes = $input_type->parent_nodes; + $by_ref = $input_type->by_ref; + $input_type = clone $signature_param_type; + + if ($input_type->isNullable()) { + $input_type->ignore_nullable_issues = true; + } + + $input_type->parent_nodes = $parent_nodes; + $input_type->by_ref = $by_ref; + } + + if ($context->inside_conditional && !isset($context->assigned_var_ids[$var_id])) { + $context->assigned_var_ids[$var_id] = 0; + } + + if ($was_cloned) { + $context->removeVarFromConflictingClauses($var_id, null, $statements_analyzer); + } + + if ($unpack) { + if ($unpacked_atomic_array instanceof TList) { + $unpacked_atomic_array = clone $unpacked_atomic_array; + $unpacked_atomic_array->type_param = $input_type; + + $context->vars_in_scope[$var_id] = new Union([$unpacked_atomic_array]); + } elseif ($unpacked_atomic_array instanceof TArray) { + $unpacked_atomic_array = clone $unpacked_atomic_array; + $unpacked_atomic_array->type_params[1] = $input_type; + + $context->vars_in_scope[$var_id] = new Union([$unpacked_atomic_array]); + } elseif ($unpacked_atomic_array instanceof TKeyedArray + && $unpacked_atomic_array->is_list + ) { + $unpacked_atomic_array = $unpacked_atomic_array->getList(); + $unpacked_atomic_array->type_param = $input_type; + + $context->vars_in_scope[$var_id] = new Union([$unpacked_atomic_array]); + } else { + $context->vars_in_scope[$var_id] = new Union([ + new TArray([ + Type::getInt(), + $input_type + ]), + ]); + } + } else { + $context->vars_in_scope[$var_id] = $input_type; + } + } + } + + private static function processTaintedness( + StatementsAnalyzer $statements_analyzer, + string $cased_method_id, + ?MethodIdentifier $method_id, + int $argument_offset, + CodeLocation $arg_location, + CodeLocation $function_call_location, + FunctionLikeParameter $function_param, + Union $input_type, + PhpParser\Node\Expr $expr, + Context $context, + bool $specialize_taint + ): Union { + $codebase = $statements_analyzer->getCodebase(); + + if (!$statements_analyzer->data_flow_graph + || ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues())) + ) { + return $input_type; + } + + // literal data can’t be tainted + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && $input_type->isSingle() + && $input_type->hasLiteralValue() + ) { + return $input_type; + } + + // numeric types can't be tainted, neither can bool + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && $input_type->isSingle() + && ($input_type->isInt() || $input_type->isFloat() || $input_type->isBool()) + ) { + return $input_type; + } + + $event = new AddRemoveTaintsEvent($expr, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + if ($function_param->type && $function_param->type->isString() && !$input_type->isString()) { + $cast_type = CastAnalyzer::castStringAttempt( + $statements_analyzer, + $context, + $input_type, + $expr, + false + ); + + $input_type = clone $input_type; + $input_type->parent_nodes += $cast_type->parent_nodes; + } + + if ($specialize_taint) { + $method_node = DataFlowNode::getForMethodArgument( + $cased_method_id, + $cased_method_id, + $argument_offset, + $statements_analyzer->data_flow_graph instanceof TaintFlowGraph + ? $function_param->location + : null, + $function_call_location + ); + } else { + $method_node = DataFlowNode::getForMethodArgument( + $cased_method_id, + $cased_method_id, + $argument_offset, + $statements_analyzer->data_flow_graph instanceof TaintFlowGraph + ? $function_param->location + : null + ); + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && $method_id + && $method_id->method_name !== '__construct' + ) { + $fq_classlike_name = $method_id->fq_class_name; + $method_name = $method_id->method_name; + $cased_method_name = explode('::', $cased_method_id)[1]; + + $class_storage = $codebase->classlike_storage_provider->get($fq_classlike_name); + + foreach ($class_storage->dependent_classlikes as $dependent_classlike_lc => $_) { + $dependent_classlike_storage = $codebase->classlike_storage_provider->get( + $dependent_classlike_lc + ); + $new_sink = DataFlowNode::getForMethodArgument( + $dependent_classlike_lc . '::' . $method_name, + $dependent_classlike_storage->name . '::' . $cased_method_name, + $argument_offset, + $arg_location, + null + ); + + $statements_analyzer->data_flow_graph->addNode($new_sink); + $statements_analyzer->data_flow_graph->addPath( + $method_node, + $new_sink, + 'arg', + $added_taints, + $removed_taints + ); + } + } + } + + if ($method_id && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if ($declaring_method_id && (string) $declaring_method_id !== (string) $method_id) { + $new_sink = DataFlowNode::getForMethodArgument( + (string) $declaring_method_id, + $codebase->methods->getCasedMethodId($declaring_method_id), + $argument_offset, + $arg_location, + null + ); + + $statements_analyzer->data_flow_graph->addNode($new_sink); + $statements_analyzer->data_flow_graph->addPath( + $method_node, + $new_sink, + 'arg', + $added_taints, + $removed_taints + ); + } + } + + $statements_analyzer->data_flow_graph->addNode($method_node); + + $argument_value_node = DataFlowNode::getForAssignment( + 'call to ' . $cased_method_id, + $arg_location + ); + + $statements_analyzer->data_flow_graph->addNode($argument_value_node); + + $statements_analyzer->data_flow_graph->addPath( + $argument_value_node, + $method_node, + 'arg', + $added_taints, + $removed_taints + ); + + foreach ($input_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addNode($method_node); + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $argument_value_node, + 'arg', + $added_taints, + $removed_taints + ); + } + + if ($function_param->assert_untainted) { + $input_type = clone $input_type; + $input_type->parent_nodes = []; + } + + return $input_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php new file mode 100644 index 00000000..cf5fe6f2 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php @@ -0,0 +1,142 @@ +file_provider->getContents($statements_analyzer->getFilePath()); + + // Find opening paren + $first_argument = $stmt->getArgs()[0] ?? null; + $first_argument_character = $first_argument !== null + ? $first_argument->getStartFilePos() + : $stmt->getEndFilePos(); + $method_name_and_first_paren_source_code_length = $first_argument_character - $stmt->getStartFilePos(); + // FIXME: There are weird ::__construct calls in the AST for `extends` + if ($method_name_and_first_paren_source_code_length <= 0) { + return; + } + $method_name_and_first_paren_source_code = substr( + $file_content, + $stmt->getStartFilePos(), + $method_name_and_first_paren_source_code_length + ); + $method_name_and_first_paren_tokens = token_get_all('getStartFilePos()) { + return; + } + + // Record ranges of the source code that need to be tokenized to find commas + /** @var array{0: int, 1: int}[] $ranges */ + $ranges = []; + + // Add range between opening paren and first argument + $first_argument = $stmt->getArgs()[0] ?? null; + $first_argument_starting_position = $first_argument !== null + ? $first_argument->getStartFilePos() + : $stmt->getEndFilePos(); + $first_range_starting_position = $opening_paren_position + 1; + if ($first_range_starting_position !== $first_argument_starting_position) { + $ranges[] = [$first_range_starting_position, $first_argument_starting_position]; + } + + // Add range between arguments + foreach ($stmt->getArgs() as $i => $argument) { + $range_start = $argument->getEndFilePos() + 1; + $next_argument = $stmt->getArgs()[$i + 1] ?? null; + $range_end = $next_argument !== null + ? $next_argument->getStartFilePos() + : $stmt->getEndFilePos(); + + if ($range_start !== $range_end) { + $ranges[] = [$range_start, $range_end]; + } + } + + $commas = []; + foreach ($ranges as $range) { + $position = $range[0]; + $length = $range[1] - $position; + + if ($length > 0) { + $range_source_code = substr($file_content, $position, $length); + $range_tokens = token_get_all('analyzer->addNodeArgument( + $statements_analyzer->getFilePath(), + $argument_start_position, + $comma, + $function_reference, + $argument_number + ); + + ++$argument_number; + $argument_start_position = $comma + 1; + } + + $codebase->analyzer->addNodeArgument( + $statements_analyzer->getFilePath(), + $argument_start_position, + $stmt->getEndFilePos(), + $function_reference, + $argument_number + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php new file mode 100644 index 00000000..c3930b74 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php @@ -0,0 +1,1620 @@ + $args + * @param array|null $function_params + * + * @return false|null + */ + public static function analyze( + StatementsAnalyzer $statements_analyzer, + array $args, + ?array $function_params, + ?string $method_id, + bool $allow_named_args, + Context $context, + ?TemplateResult $template_result = null + ): ?bool { + $last_param = $function_params + ? $function_params[count($function_params) - 1] + : null; + + // if this modifies the array type based on further args + if (in_array($method_id, ['array_push', 'array_unshift'], true) + && $function_params + && isset($args[0]) + && isset($args[1]) + ) { + if (ArrayFunctionArgumentsAnalyzer::handleAddition( + $statements_analyzer, + $args, + $context, + $method_id + ) === false + ) { + return false; + } + + return null; + } + + if ($method_id === 'array_splice' && $function_params && count($args) > 1) { + if (ArrayFunctionArgumentsAnalyzer::handleSplice($statements_analyzer, $args, $context) === false) { + return false; + } + + return null; + } + + if ($method_id === 'array_map') { + $args = array_reverse($args, true); + } + + foreach ($args as $argument_offset => $arg) { + if ($function_params === null) { + if (self::evaluateArbitraryParam( + $statements_analyzer, + $arg, + $context + ) === false) { + return false; + } + + continue; + } + + $param = null; + + if ($arg->name && $allow_named_args) { + foreach ($function_params as $candidate_param) { + if ($candidate_param->name === $arg->name->name) { + $param = $candidate_param; + break; + } + } + + if ($last_param && $last_param->is_variadic) { + $param = $last_param; + } + } elseif ($argument_offset < count($function_params)) { + $param = $function_params[$argument_offset]; + } elseif ($last_param && $last_param->is_variadic) { + $param = $last_param; + } + + $by_ref = $param && $param->by_ref; + + $by_ref_type = null; + + if ($by_ref) { + $by_ref_type = $param->type ? clone $param->type : Type::getMixed(); + } + + if ($by_ref + && $by_ref_type + && !($arg->value instanceof PhpParser\Node\Expr\Closure + || $arg->value instanceof PhpParser\Node\Expr\ConstFetch + || $arg->value instanceof PhpParser\Node\Expr\ClassConstFetch + || $arg->value instanceof PhpParser\Node\Expr\FuncCall + || $arg->value instanceof PhpParser\Node\Expr\MethodCall + || $arg->value instanceof PhpParser\Node\Expr\StaticCall + || $arg->value instanceof PhpParser\Node\Expr\New_ + || $arg->value instanceof PhpParser\Node\Expr\Assign + || $arg->value instanceof PhpParser\Node\Expr\Array_ + || $arg->value instanceof PhpParser\Node\Expr\Ternary + || $arg->value instanceof PhpParser\Node\Expr\BinaryOp + ) + ) { + if (self::handleByRefFunctionArg( + $statements_analyzer, + $method_id, + $argument_offset, + $arg, + $context + ) === false) { + return false; + } + + continue; + } + + $toggled_class_exists = false; + + if ($method_id === 'class_exists' + && $argument_offset === 0 + && !$context->inside_class_exists + ) { + $context->inside_class_exists = true; + $toggled_class_exists = true; + } + + if (($arg->value instanceof PhpParser\Node\Expr\Closure + || $arg->value instanceof PhpParser\Node\Expr\ArrowFunction) + && $param + && !$arg->value->getDocComment() + ) { + self::handleClosureArg( + $statements_analyzer, + $args, + $method_id, + $context, + $template_result ?? new TemplateResult([], []), + $argument_offset, + $arg, + $param + ); + } + + $was_inside_call = $context->inside_call; + + $context->inside_call = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $arg->value, $context) === false) { + $context->inside_call = $was_inside_call; + + return false; + } + + $context->inside_call = $was_inside_call; + + if (($argument_offset === 0 && $method_id === 'array_filter' && count($args) === 2) + || ($argument_offset > 0 && $method_id === 'array_map' && count($args) >= 2) + ) { + self::handleArrayMapFilterArrayArg( + $statements_analyzer, + $method_id, + $argument_offset, + $arg, + $context, + $template_result + ); + } + + $inferred_arg_type = $statements_analyzer->node_data->getType($arg->value); + + if (null !== $inferred_arg_type && null !== $template_result && null !== $param && null !== $param->type) { + $codebase = $statements_analyzer->getCodebase(); + + TemplateStandinTypeReplacer::replace( + clone $param->type, + $template_result, + $codebase, + $statements_analyzer, + $inferred_arg_type, + $argument_offset, + $context->self, + $context->calling_method_id ?: $context->calling_function_id + ); + } + + if ($toggled_class_exists) { + $context->inside_class_exists = false; + } + } + + if ($method_id === "ReflectionClass::getattributes" + || $method_id === "ReflectionClassConstant::getattributes" + || $method_id === "ReflectionFunction::getattributes" + || $method_id === "ReflectionMethod::getattributes" + || $method_id === "ReflectionParameter::getattributes" + || $method_id === "ReflectionProperty::getattributes" + ) { + AttributesAnalyzer::analyzeGetAttributes($statements_analyzer, $method_id, array_values($args)); + } + + return null; + } + + private static function handleArrayMapFilterArrayArg( + StatementsAnalyzer $statements_analyzer, + string $method_id, + int $argument_offset, + PhpParser\Node\Arg $arg, + Context $context, + ?TemplateResult &$template_result + ): void { + $codebase = $statements_analyzer->getCodebase(); + + $generic_param_type = new Union([ + new TArray([ + Type::getArrayKey(), + new Union([ + new TTemplateParam( + 'ArrayValue' . $argument_offset, + Type::getMixed(), + $method_id + ) + ]) + ]) + ]); + + $template_types = ['ArrayValue' . $argument_offset => [$method_id => Type::getMixed()]]; + + $replace_template_result = new TemplateResult( + $template_types, + [] + ); + + $existing_type = $statements_analyzer->node_data->getType($arg->value); + + TemplateStandinTypeReplacer::replace( + $generic_param_type, + $replace_template_result, + $codebase, + $statements_analyzer, + $existing_type, + $argument_offset, + $context->self, + $context->calling_method_id ?: $context->calling_function_id + ); + + if ($replace_template_result->lower_bounds) { + if (!$template_result) { + $template_result = new TemplateResult([], []); + } + + $template_result->lower_bounds += $replace_template_result->lower_bounds; + } + } + + /** + * @param array $args + */ + private static function handleClosureArg( + StatementsAnalyzer $statements_analyzer, + array $args, + ?string $method_id, + Context $context, + TemplateResult $template_result, + int $argument_offset, + PhpParser\Node\Arg $arg, + FunctionLikeParameter $param + ): void { + if (!$param->type) { + return; + } + + $codebase = $statements_analyzer->getCodebase(); + + if (($argument_offset === 1 && $method_id === 'array_filter' && count($args) === 2) + || ($argument_offset === 0 && $method_id === 'array_map' && count($args) >= 2) + ) { + $function_like_params = []; + + foreach ($template_result->lower_bounds as $template_name => $_) { + $function_like_params[] = new FunctionLikeParameter( + 'function', + false, + new Union([ + new TTemplateParam( + $template_name, + Type::getMixed(), + $method_id + ) + ]) + ); + } + + $replaced_type = new Union([ + new TCallable( + 'callable', + array_reverse($function_like_params) + ) + ]); + } else { + $replaced_type = clone $param->type; + } + + $replace_template_result = new TemplateResult( + array_map( + function ($template_map) use ($codebase) { + return array_map( + function ($lower_bounds) use ($codebase) { + return TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $lower_bounds, + $codebase + ); + }, + $template_map + ); + }, + $template_result->lower_bounds + ), + [] + ); + + $replaced_type = TemplateStandinTypeReplacer::replace( + $replaced_type, + $replace_template_result, + $codebase, + $statements_analyzer, + null, + null, + null, + $context->calling_method_id ?: $context->calling_function_id + ); + + TemplateInferredTypeReplacer::replace( + $replaced_type, + $replace_template_result, + $codebase + ); + + $closure_id = strtolower($statements_analyzer->getFilePath()) + . ':' . $arg->value->getLine() + . ':' . (int)$arg->value->getAttribute('startFilePos') + . ':-:closure'; + + try { + $closure_storage = $codebase->getClosureStorage( + $statements_analyzer->getFilePath(), + $closure_id + ); + } catch (UnexpectedValueException $e) { + return; + } + + foreach ($closure_storage->params as $closure_param_offset => $param_storage) { + $param_type_inferred = $param_storage->type_inferred; + + $newly_inferred_type = null; + $has_different_docblock_type = false; + + if ($param_storage->type && !$param_type_inferred) { + if ($param_storage->type !== $param_storage->signature_type) { + $has_different_docblock_type = true; + } + } + + if (!$has_different_docblock_type) { + foreach ($replaced_type->getAtomicTypes() as $replaced_type_part) { + if ($replaced_type_part instanceof TCallable + || $replaced_type_part instanceof TClosure + ) { + if (isset($replaced_type_part->params[$closure_param_offset]->type)) { + $replaced_param_type = $replaced_type_part->params[$closure_param_offset]->type; + + if ($replaced_param_type->hasTemplate()) { + $replaced_param_type = TypeExpander::expandUnion( + $codebase, + $replaced_param_type, + null, + null, + null, + true, + false, + false, + true, + true + ); + } + + if ($param_storage->type && !$param_type_inferred) { + $type_match_found = UnionTypeComparator::isContainedBy( + $codebase, + $replaced_param_type, + $param_storage->type + ); + + if (!$type_match_found) { + continue; + } + } + + $newly_inferred_type = Type::combineUnionTypes( + $newly_inferred_type, + $replaced_param_type, + $codebase + ); + } + } + } + } + + if ($newly_inferred_type) { + $param_storage->type = $newly_inferred_type; + $param_storage->type_inferred = true; + } + + if ($param_storage->type && ($method_id === 'array_map' || $method_id === 'array_filter')) { + ArrayFetchAnalyzer::taintArrayFetch( + $statements_analyzer, + $args[1 - $argument_offset]->value, + null, + $param_storage->type, + Type::getMixed() + ); + } + } + } + + /** + * @param list $args + * @param string|MethodIdentifier|null $method_id + * @param array $function_params + * + * @return false|null + * + * @psalm-suppress ComplexMethod there's just not much that can be done about this + */ + public static function checkArgumentsMatch( + StatementsAnalyzer $statements_analyzer, + array $args, + $method_id, + array $function_params, + ?FunctionLikeStorage $function_storage, + ?ClassLikeStorage $class_storage, + ?TemplateResult $class_template_result, + CodeLocation $code_location, + Context $context + ): ?bool { + $in_call_map = $method_id ? InternalCallMapHandler::inCallMap((string) $method_id) : false; + + $cased_method_id = (string) $method_id; + + $is_variadic = false; + + $fq_class_name = null; + + $codebase = $statements_analyzer->getCodebase(); + + if ($method_id) { + if (!$in_call_map && $method_id instanceof MethodIdentifier) { + $fq_class_name = $method_id->fq_class_name; + } + + if ($function_storage) { + $is_variadic = $function_storage->variadic; + } elseif (is_string($method_id)) { + $is_variadic = Functions::isVariadic( + $codebase, + strtolower($method_id), + $statements_analyzer->getRootFilePath() + ); + } else { + $is_variadic = $codebase->methods->isVariadic($method_id); + } + } + + if ($method_id instanceof MethodIdentifier) { + $cased_method_id = $codebase->methods->getCasedMethodId($method_id); + } elseif ($function_storage) { + $cased_method_id = $function_storage->cased_name; + } + + $calling_class_storage = $class_storage; + + $static_fq_class_name = $fq_class_name; + $self_fq_class_name = $fq_class_name; + + if ($method_id instanceof MethodIdentifier) { + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if ($declaring_method_id && (string)$declaring_method_id !== (string)$method_id) { + $self_fq_class_name = $declaring_method_id->fq_class_name; + $class_storage = $codebase->classlike_storage_provider->get($self_fq_class_name); + } + + $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); + + if ($appearing_method_id && $declaring_method_id !== $appearing_method_id) { + $self_fq_class_name = $appearing_method_id->fq_class_name; + } + } + + if ($function_params) { + foreach ($function_params as $function_param) { + $is_variadic = $is_variadic || $function_param->is_variadic; + } + } + + $has_packed_var = false; + + foreach ($args as $arg) { + if ($arg->unpack) { + $has_packed_var = true; + } + } + + $last_param = $function_params + ? $function_params[count($function_params) - 1] + : null; + + $template_result = null; + + $class_generic_params = []; + + if ($class_template_result) { + foreach ($class_template_result->lower_bounds as $template_name => $type_map) { + foreach ($type_map as $class => $lower_bounds) { + if (count($lower_bounds) === 1) { + $class_generic_params[$template_name][$class] = clone reset($lower_bounds)->type; + } + } + } + } + + if ($function_storage) { + $template_result = self::getProvisionalTemplateResultForFunctionLike( + $statements_analyzer, + $codebase, + $context, + $class_storage, + $self_fq_class_name, + $calling_class_storage, + $function_storage, + $class_generic_params, + $class_template_result, + $args, + $function_params, + $last_param + ); + } + + $function_param_count = count($function_params); + + if (count($function_params) > count($args) && !$has_packed_var) { + for ($i = count($args), $iMax = count($function_params); $i < $iMax; $i++) { + if ($function_params[$i]->default_type + && $function_params[$i]->type + && $function_params[$i]->type->hasTemplate() + ) { + if ($function_params[$i]->default_type instanceof Union) { + $default_type = $function_params[$i]->default_type; + } else { + $default_type_atomic = ConstantTypeResolver::resolve( + $codebase->classlikes, + $function_params[$i]->default_type, + $statements_analyzer + ); + + $default_type = new Union([$default_type_atomic]); + } + + if ($default_type->hasLiteralValue()) { + ArgumentAnalyzer::checkArgumentMatches( + $statements_analyzer, + $cased_method_id, + $method_id instanceof MethodIdentifier ? $method_id : null, + $self_fq_class_name, + $static_fq_class_name, + $code_location, + $function_params[$i], + $i, + $i, + $function_storage->allow_named_arg_calls ?? true, + new VirtualArg( + StubsGenerator::getExpressionFromType($default_type) + ), + $default_type, + $context, + $class_generic_params, + $template_result, + $function_storage->specialize_call ?? true, + $in_call_map + ); + } + } + } + } + + if (($method_id === 'preg_match_all' || $method_id === 'preg_match') && count($args) > 3) { + $args = array_reverse($args, true); + } + + $arg_function_params = []; + $matched_args = []; + $named_args_was_used = false; + + foreach ($args as $argument_offset => $arg) { + if ($named_args_was_used && !$arg->name) { + IssueBuffer::maybeAdd( + new InvalidNamedArgument( + 'Cannot use positional argument after named argument', + new CodeLocation($statements_analyzer, $arg), + (string)$method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($arg->unpack) { + if ($function_param_count > $argument_offset) { + for ($i = $argument_offset; $i < $function_param_count; $i++) { + $arg_function_params[$argument_offset][] = $function_params[$i]; + } + } + + if (($arg_value_type = $statements_analyzer->node_data->getType($arg->value)) + && $arg_value_type->hasArray()) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TList|TKeyedArray + */ + $array_type = $arg_value_type->getAtomicTypes()['array']; + + if ($array_type instanceof TKeyedArray) { + $key_types = $array_type->getGenericArrayType()->getChildNodes()[0]->getChildNodes(); + + foreach ($key_types as $key_type) { + if (!$key_type instanceof TLiteralString + || ($function_storage && !$function_storage->allow_named_arg_calls)) { + continue; + } + + $param_found = false; + + foreach ($function_params as $candidate_param) { + if ($candidate_param->name === $key_type->value || $candidate_param->is_variadic) { + if ($candidate_param->name === $key_type->value) { + if (isset($matched_args[$candidate_param->name])) { + IssueBuffer::maybeAdd( + new InvalidNamedArgument( + 'Parameter $' . $key_type->value . ' has already been used in ' + . ($cased_method_id ?: $method_id), + new CodeLocation($statements_analyzer, $arg), + (string)$method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $matched_args[$candidate_param->name] = true; + } + + $param_found = true; + break; + } + } + + if (!$param_found) { + IssueBuffer::maybeAdd( + new InvalidNamedArgument( + 'Parameter $' . $key_type->value . ' does not exist on function ' + . ($cased_method_id ?: $method_id), + new CodeLocation($statements_analyzer, $arg), + (string)$method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + } + } elseif ($arg->name && (!$function_storage || $function_storage->allow_named_arg_calls)) { + $named_args_was_used = true; + + foreach ($function_params as $candidate_param) { + if ($candidate_param->name === $arg->name->name || $candidate_param->is_variadic) { + if ($candidate_param->name === $arg->name->name) { + if (isset($matched_args[$candidate_param->name])) { + IssueBuffer::maybeAdd( + new InvalidNamedArgument( + 'Parameter $' . $arg->name->name . ' has already been used in ' + . ($cased_method_id ?: $method_id), + new CodeLocation($statements_analyzer, $arg->name), + (string) $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $matched_args[$candidate_param->name] = true; + } + + $arg_function_params[$argument_offset] = [$candidate_param]; + break; + } + } + + if (!isset($arg_function_params[$argument_offset])) { + IssueBuffer::maybeAdd( + new InvalidNamedArgument( + 'Parameter $' . $arg->name->name . ' does not exist on function ' + . ($cased_method_id ?: $method_id), + new CodeLocation($statements_analyzer, $arg->name), + (string) $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } elseif ($function_param_count > $argument_offset) { + $arg_function_params[$argument_offset] = [$function_params[$argument_offset]]; + $matched_args[$function_params[$argument_offset]->name] = true; + } elseif ($last_param && $last_param->is_variadic) { + $arg_function_params[$argument_offset] = [$last_param]; + $matched_args[$last_param->name] = true; + } + } + + foreach ($args as $argument_offset => $arg) { + if (!isset($arg_function_params[$argument_offset])) { + continue; + } + + if ($arg_function_params[$argument_offset][0]->by_ref + && $method_id !== 'extract' + ) { + if (self::handlePossiblyMatchingByRefParam( + $statements_analyzer, + $codebase, + (string) $method_id, + $cased_method_id, + $last_param, + $function_params, + $argument_offset, + $arg, + $context, + $template_result + ) === false) { + return null; + } + } + + $arg_value_type = $statements_analyzer->node_data->getType($arg->value); + + foreach ($arg_function_params[$argument_offset] as $i => $function_param) { + if (ArgumentAnalyzer::checkArgumentMatches( + $statements_analyzer, + $cased_method_id, + $method_id instanceof MethodIdentifier ? $method_id : null, + $self_fq_class_name, + $static_fq_class_name, + $code_location, + $function_param, + $argument_offset + $i, + $i, + $function_storage->allow_named_arg_calls ?? true, + $arg, + $arg_value_type, + $context, + $class_generic_params, + $template_result, + $function_storage->specialize_call ?? true, + $in_call_map + ) === false) { + return false; + } + } + } + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && $cased_method_id + ) { + foreach ($args as $argument_offset => $_) { + if (!isset($arg_function_params[$argument_offset])) { + continue; + } + + foreach ($arg_function_params[$argument_offset] as $function_param) { + if ($function_param->sinks) { + if (!$function_storage || $function_storage->specialize_call) { + $sink = TaintSink::getForMethodArgument( + $cased_method_id, + $cased_method_id, + $argument_offset, + $function_param->location, + $code_location + ); + } else { + $sink = TaintSink::getForMethodArgument( + $cased_method_id, + $cased_method_id, + $argument_offset, + $function_param->location + ); + } + + $sink->taints = $function_param->sinks; + + $statements_analyzer->data_flow_graph->addSink($sink); + } + } + } + } + + if ($method_id === 'array_map' || $method_id === 'array_filter') { + if ($method_id === 'array_map' && count($args) < 2) { + IssueBuffer::maybeAdd( + new TooFewArguments( + 'Too few arguments for ' . $method_id, + $code_location, + $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($method_id === 'array_filter' && count($args) < 1) { + IssueBuffer::maybeAdd( + new TooFewArguments( + 'Too few arguments for ' . $method_id, + $code_location, + $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + ArrayFunctionArgumentsAnalyzer::checkArgumentsMatch( + $statements_analyzer, + $context, + $args, + $method_id, + $context->check_functions + ); + + return null; + } + + if ($method_id === 'get_class' && $args === []) { + //get_class without args only works when inside a class + if (!$context->self) { + IssueBuffer::maybeAdd( + new TooFewArguments( + 'Cannot call get_class() without argument outside of class scope', + $code_location, + $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + return null; + } + } + + self::checkArgCount( + $statements_analyzer, + $codebase, + $function_storage, + $context, + $template_result, + $is_variadic, + $args, + $function_params, + $in_call_map, + $method_id, + $cased_method_id, + $code_location + ); + + return null; + } + + /** + * @param array $function_params + * @return false|null + */ + private static function handlePossiblyMatchingByRefParam( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + string $method_id, + ?string $cased_method_id, + ?FunctionLikeParameter $last_param, + array $function_params, + int $argument_offset, + PhpParser\Node\Arg $arg, + Context $context, + ?TemplateResult $template_result + ): ?bool { + if ($arg->value instanceof PhpParser\Node\Scalar + || $arg->value instanceof PhpParser\Node\Expr\Cast + || $arg->value instanceof PhpParser\Node\Expr\Array_ + || $arg->value instanceof PhpParser\Node\Expr\ClassConstFetch + || $arg->value instanceof PhpParser\Node\Expr\BinaryOp + || $arg->value instanceof PhpParser\Node\Expr\Ternary + || ( + ( + $arg->value instanceof PhpParser\Node\Expr\ConstFetch + || $arg->value instanceof PhpParser\Node\Expr\FuncCall + || $arg->value instanceof PhpParser\Node\Expr\MethodCall + || $arg->value instanceof PhpParser\Node\Expr\StaticCall + ) && ( + !($arg_value_type = $statements_analyzer->node_data->getType($arg->value)) + || !$arg_value_type->by_ref + ) + ) + ) { + IssueBuffer::maybeAdd( + new InvalidPassByReference( + 'Parameter ' . ($argument_offset + 1) . ' of ' . $cased_method_id . ' expects a variable', + new CodeLocation($statements_analyzer->getSource(), $arg->value) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return false; + } + + if (!in_array( + $method_id, + [ + 'ksort', 'asort', 'krsort', 'arsort', 'natcasesort', 'natsort', + 'reset', 'end', 'next', 'prev', 'array_pop', 'array_shift', + 'array_push', 'array_unshift', 'socket_select', 'array_splice', + ], + true + )) { + $by_ref_type = null; + $by_ref_out_type = null; + + $check_null_ref = true; + + if ($last_param) { + if ($argument_offset < count($function_params)) { + $function_param = $function_params[$argument_offset]; + } else { + $function_param = $last_param; + } + + if ($function_param->type) { + $by_ref_type = clone $function_param->type; + } + if ($function_param->out_type) { + $by_ref_out_type = clone $function_param->out_type; + } + + if ($by_ref_type && $by_ref_type->isNullable()) { + $check_null_ref = false; + } + + if ($template_result && $by_ref_type) { + $original_by_ref_type = clone $by_ref_type; + + $by_ref_type = TemplateStandinTypeReplacer::replace( + clone $by_ref_type, + $template_result, + $codebase, + $statements_analyzer, + $statements_analyzer->node_data->getType($arg->value), + $argument_offset, + $context->self, + $context->calling_method_id ?: $context->calling_function_id + ); + + if ($template_result->lower_bounds) { + TemplateInferredTypeReplacer::replace( + $original_by_ref_type, + $template_result, + $codebase + ); + + $by_ref_type = $original_by_ref_type; + } + } + + if ($template_result && $by_ref_out_type) { + $original_by_ref_out_type = clone $by_ref_out_type; + + $by_ref_out_type = TemplateStandinTypeReplacer::replace( + clone $by_ref_out_type, + $template_result, + $codebase, + $statements_analyzer, + $statements_analyzer->node_data->getType($arg->value), + $argument_offset, + $context->self, + $context->calling_method_id ?: $context->calling_function_id + ); + + if ($template_result->lower_bounds) { + TemplateInferredTypeReplacer::replace( + $original_by_ref_out_type, + $template_result, + $codebase + ); + + $by_ref_out_type = $original_by_ref_out_type; + } + } + + if ($by_ref_type && $function_param->is_variadic && $arg->unpack) { + $by_ref_type = new Union([ + new TArray([ + Type::getInt(), + $by_ref_type, + ]), + ]); + } + } + + $by_ref_type = $by_ref_type ?: Type::getMixed(); + + AssignmentAnalyzer::assignByRefParam( + $statements_analyzer, + $arg->value, + $by_ref_type, + $by_ref_out_type ?: $by_ref_type, + $context, + $method_id && (strpos($method_id, '::') !== false || !InternalCallMapHandler::inCallMap($method_id)), + $check_null_ref + ); + } + + return null; + } + + /** + * @return false|null + */ + private static function evaluateArbitraryParam( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Arg $arg, + Context $context + ): ?bool { + // there are a bunch of things we want to evaluate even when we don't + // know what function/method is being called + if ($arg->value instanceof PhpParser\Node\Expr\Closure + || $arg->value instanceof PhpParser\Node\Expr\ConstFetch + || $arg->value instanceof PhpParser\Node\Expr\ClassConstFetch + || $arg->value instanceof PhpParser\Node\Expr\FuncCall + || $arg->value instanceof PhpParser\Node\Expr\MethodCall + || $arg->value instanceof PhpParser\Node\Expr\StaticCall + || $arg->value instanceof PhpParser\Node\Expr\New_ + || $arg->value instanceof PhpParser\Node\Expr\Cast + || $arg->value instanceof PhpParser\Node\Expr\Assign + || $arg->value instanceof PhpParser\Node\Expr\ArrayDimFetch + || $arg->value instanceof PhpParser\Node\Expr\PropertyFetch + || $arg->value instanceof PhpParser\Node\Expr\Array_ + || $arg->value instanceof PhpParser\Node\Expr\BinaryOp + || $arg->value instanceof PhpParser\Node\Expr\Ternary + || $arg->value instanceof PhpParser\Node\Scalar\Encapsed + || $arg->value instanceof PhpParser\Node\Expr\PostInc + || $arg->value instanceof PhpParser\Node\Expr\PostDec + || $arg->value instanceof PhpParser\Node\Expr\PreInc + || $arg->value instanceof PhpParser\Node\Expr\PreDec + ) { + $was_inside_call = $context->inside_call; + $context->inside_call = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $arg->value, $context) === false) { + $context->inside_call = $was_inside_call; + + return false; + } + + $context->inside_call = $was_inside_call; + } + + if ($arg->value instanceof PhpParser\Node\Expr\PropertyFetch + && $arg->value->name instanceof PhpParser\Node\Identifier + ) { + $var_id = '$' . $arg->value->name->name; + } else { + $var_id = ExpressionIdentifier::getVarId( + $arg->value, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + } + + if ($var_id) { + if ($arg->value instanceof PhpParser\Node\Expr\Variable) { + $statements_analyzer->registerPossiblyUndefinedVariable($var_id, $arg->value); + } + + if (!$context->hasVariable($var_id) + || $context->vars_in_scope[$var_id]->isNull() + ) { + if (!isset($context->vars_in_scope[$var_id]) + && $arg->value instanceof PhpParser\Node\Expr\Variable + ) { + IssueBuffer::maybeAdd( + new PossiblyUndefinedVariable( + 'Variable ' . $var_id + . ' must be defined prior to use within an unknown function or method', + new CodeLocation($statements_analyzer->getSource(), $arg->value) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + // we don't know if it exists, assume it's passed by reference + $context->vars_in_scope[$var_id] = Type::getMixed(); + $context->vars_possibly_in_scope[$var_id] = true; + } else { + $was_inside_call = $context->inside_call; + $context->inside_call = true; + ExpressionAnalyzer::analyze($statements_analyzer, $arg->value, $context); + $context->inside_call = $was_inside_call; + + $context->removeVarFromConflictingClauses( + $var_id, + $context->vars_in_scope[$var_id], + $statements_analyzer + ); + + foreach ($context->vars_in_scope[$var_id]->getAtomicTypes() as $type) { + if ($type instanceof TArray && $type->type_params[1]->isEmpty()) { + $context->vars_in_scope[$var_id]->removeType('array'); + $context->vars_in_scope[$var_id]->addType( + new TArray( + [Type::getArrayKey(), Type::getMixed()] + ) + ); + } + } + } + } + + return null; + } + + /** + * @return false|null + */ + private static function handleByRefFunctionArg( + StatementsAnalyzer $statements_analyzer, + ?string $method_id, + int $argument_offset, + PhpParser\Node\Arg $arg, + Context $context + ): ?bool { + $var_id = ExpressionIdentifier::getVarId( + $arg->value, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $builtin_array_functions = [ + 'ksort', 'asort', 'krsort', 'arsort', 'natcasesort', 'natsort', + 'reset', 'end', 'next', 'prev', 'array_pop', 'array_shift', + ]; + + if (($var_id && isset($context->vars_in_scope[$var_id])) + || ($method_id + && in_array( + $method_id, + $builtin_array_functions, + true + )) + ) { + $was_inside_assignment = $context->inside_assignment; + $context->inside_assignment = true; + + // if the variable is in scope, get or we're in a special array function, + // figure out its type before proceeding + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $arg->value, + $context + ) === false) { + $context->inside_assignment = $was_inside_assignment; + + return false; + } + + $context->inside_assignment = $was_inside_assignment; + } + + // special handling for array sort + if ($argument_offset === 0 + && $method_id + && in_array( + $method_id, + $builtin_array_functions, + true + ) + ) { + if (in_array($method_id, ['array_pop', 'array_shift'], true)) { + ArrayFunctionArgumentsAnalyzer::handleByRefArrayAdjustment( + $statements_analyzer, + $arg, + $context, + $method_id === 'array_shift' + ); + + return null; + } + + // noops + if (in_array($method_id, ['reset', 'end', 'next', 'prev', 'ksort'], true)) { + return null; + } + + if (($arg_value_type = $statements_analyzer->node_data->getType($arg->value)) + && $arg_value_type->hasArray() + ) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TList|TKeyedArray + */ + $array_type = $arg_value_type->getAtomicTypes()['array']; + + if ($array_type instanceof TKeyedArray) { + $array_type = $array_type->getGenericArrayType(); + } + + if ($array_type instanceof TList) { + $array_type = new TArray([Type::getInt(), $array_type->type_param]); + } + + $by_ref_type = new Union([clone $array_type]); + + AssignmentAnalyzer::assignByRefParam( + $statements_analyzer, + $arg->value, + $by_ref_type, + $by_ref_type, + $context, + false + ); + + return null; + } + } + + if ($method_id === 'socket_select') { + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $arg->value, + $context + ) === false) { + return false; + } + } + + if (!$arg->value instanceof PhpParser\Node\Expr\Variable) { + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('EmptyArrayAccess', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['EmptyArrayAccess']); + } + + if (ExpressionAnalyzer::analyze($statements_analyzer, $arg->value, $context) === false) { + return false; + } + + if (!in_array('EmptyArrayAccess', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['EmptyArrayAccess']); + } + } + + return null; + } + + /** + * @param list $args + * @param array $function_params + * @param array> $class_generic_params + */ + private static function getProvisionalTemplateResultForFunctionLike( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + Context $context, + ?ClassLikeStorage $class_storage, + ?string $self_fq_class_name, + ?ClassLikeStorage $calling_class_storage, + FunctionLikeStorage $function_storage, + array $class_generic_params, + ?TemplateResult $class_template_result, + array $args, + array $function_params, + ?FunctionLikeParameter $last_param + ): ?TemplateResult { + $template_types = CallAnalyzer::getTemplateTypesForCall( + $codebase, + $class_storage, + $self_fq_class_name, + $calling_class_storage, + $function_storage->template_types ?: [], + $class_generic_params + ); + + if (!$template_types) { + return null; + } + + if (!$class_template_result) { + return new TemplateResult($template_types, []); + } + + $template_result = $class_template_result; + + if (!$template_result->template_types) { + $template_result->template_types = $template_types; + } + + foreach ($args as $argument_offset => $arg) { + $function_param = null; + + if ($arg->name && $function_storage->allow_named_arg_calls) { + foreach ($function_params as $candidate_param) { + if ($candidate_param->name === $arg->name->name) { + $function_param = $candidate_param; + break; + } + } + } elseif ($argument_offset < count($function_params)) { + $function_param = $function_params[$argument_offset]; + } elseif ($last_param && $last_param->is_variadic) { + $function_param = $last_param; + } + + if (!$function_param + || !$function_param->type + ) { + continue; + } + + $arg_value_type = $statements_analyzer->node_data->getType($arg->value); + + if (!$arg_value_type) { + continue; + } + + $fleshed_out_param_type = TypeExpander::expandUnion( + $codebase, + $function_param->type, + $class_storage->name ?? null, + $calling_class_storage->name ?? null, + null, + true, + false, + $calling_class_storage->final ?? false + ); + + TemplateStandinTypeReplacer::replace( + $fleshed_out_param_type, + $template_result, + $codebase, + $statements_analyzer, + $arg_value_type, + $argument_offset, + $context->self, + $context->calling_method_id ?: $context->calling_function_id, + false + ); + } + + return $template_result; + } + + /** + * @param array $args + * @param string|MethodIdentifier|null $method_id + * @param array $function_params + */ + private static function checkArgCount( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + ?FunctionLikeStorage $function_storage, + Context $context, + ?TemplateResult $template_result, + bool $is_variadic, + array $args, + array $function_params, + bool $in_call_map, + $method_id, + ?string $cased_method_id, + CodeLocation $code_location + ): void { + if (!$is_variadic + && count($args) > count($function_params) + && (!count($function_params) || $function_params[count($function_params) - 1]->name !== '...=') + && ($in_call_map + || !$function_storage instanceof MethodStorage + || $function_storage->is_static + || ($method_id instanceof MethodIdentifier + && $method_id->method_name === '__construct')) + ) { + IssueBuffer::maybeAdd( + new TooManyArguments( + 'Too many arguments for ' . ($cased_method_id ?: $method_id) + . ' - expecting ' . count($function_params) . ' but saw ' . count($args), + $code_location, + (string)$method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + if (count($args) < count($function_params)) { + //we're gonna loop over given args and unset them from the function_params. + // If some mandatory params are left at the end, we'll throw an error + foreach ($args as $arg) { + // when the argument is not named, we can remove the params in order + if ($arg->name === null) { + // if we're unpacking, we try to unset the exact number of params, if we can't we give up and return + if ($arg->unpack) { + $arg_value_type = $statements_analyzer->node_data->getType($arg->value); + + if (!$arg_value_type || !$arg_value_type->hasArray()) { + return; + } + + if ($arg_value_type->isSingle() + && ($atomic_arg_type = $arg_value_type->getSingleAtomic()) + && $atomic_arg_type instanceof TKeyedArray + && !$atomic_arg_type->is_list + ) { + //if we have a single shape, we'll check param names + foreach ($atomic_arg_type->properties as $property_name => $_property_type) { + foreach ($function_params as $k => $param) { + if ($param->name === $property_name) { + unset($function_params[$k]); + } + } + } + continue; + } + + foreach ($arg_value_type->getAtomicTypes() as $atomic_arg_type) { + $packed_var_definite_args_tmp = []; + if ($atomic_arg_type instanceof TCallableArray || + $atomic_arg_type instanceof TCallableList || + $atomic_arg_type instanceof TCallableKeyedArray + ) { + $packed_var_definite_args_tmp[] = 2; + } elseif ($atomic_arg_type instanceof TKeyedArray) { + if (!$atomic_arg_type->sealed) { + return; + } + + foreach ($atomic_arg_type->properties as $property_type) { + if ($property_type->possibly_undefined) { + return; + } + } + //we did not return. The number of packed params is the number of properties + $packed_var_definite_args_tmp[] = count($atomic_arg_type->properties); + } elseif ($atomic_arg_type instanceof TNonEmptyArray || + $atomic_arg_type instanceof TNonEmptyList + ) { + if ($atomic_arg_type->count === null) { + return; + } + + $packed_var_definite_args_tmp[] = $atomic_arg_type->count; + } elseif ($atomic_arg_type instanceof TArray + && $atomic_arg_type->type_params[1]->isEmpty() + ) { + $packed_var_definite_args_tmp[] = 0; + } else { + return; + } + + + if (min($packed_var_definite_args_tmp) === max($packed_var_definite_args_tmp)) { + //we have a stable number of params + $packed_var_definite_args = $packed_var_definite_args_tmp[0]; + } else { + return; + } + } + } else { + //if we're not unpacking, we remove the first param + $packed_var_definite_args = 1; + } + + $function_params = array_slice($function_params, $packed_var_definite_args); + continue; + } + + foreach ($function_params as $k => $param) { + if ($param->name === $arg->name->name) { + unset($function_params[$k]); + continue; + } + } + } + + //we're now left with an array of params that were not passed. + // If they're mandatory, throw an error. Otherwise, we compute the default value + foreach ($function_params as $i => $param) { + if (!$param->is_optional && !$param->is_variadic) { + IssueBuffer::maybeAdd( + new TooFewArguments( + 'Too few arguments for ' . $cased_method_id + . ' - expecting ' . $param->name . ' to be passed', + $code_location, + (string)$method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + continue; + } + + if ($param->type + && $param->default_type + && !$param->is_variadic + && $template_result + ) { + if ($param->default_type instanceof Union) { + $default_type = clone $param->default_type; + } else { + $default_type_atomic = ConstantTypeResolver::resolve( + $codebase->classlikes, + $param->default_type, + $statements_analyzer + ); + + $default_type = new Union([$default_type_atomic]); + } + + TemplateStandinTypeReplacer::replace( + $param->type, + $template_result, + $codebase, + $statements_analyzer, + $default_type, + $i, + $context->self, + $context->calling_method_id ?: $context->calling_function_id, + true + ); + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php new file mode 100644 index 00000000..654e9bd8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php @@ -0,0 +1,957 @@ + $args + */ + public static function checkArgumentsMatch( + StatementsAnalyzer $statements_analyzer, + Context $context, + array $args, + string $method_id, + bool $check_functions + ): void { + $closure_index = $method_id === 'array_map' ? 0 : 1; + + $array_arg_types = []; + + foreach ($args as $i => $arg) { + if ($i === 0 && $method_id === 'array_map') { + continue; + } + + if ($i === 1 && $method_id === 'array_filter') { + break; + } + + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TKeyedArray|TArray|TList|null + */ + $array_arg_type = ($arg_value_type = $statements_analyzer->node_data->getType($arg->value)) + && ($types = $arg_value_type->getAtomicTypes()) + && isset($types['array']) + ? $types['array'] + : null; + + if ($array_arg_type instanceof TKeyedArray) { + $array_arg_type = $array_arg_type->getGenericArrayType(); + } + + if ($array_arg_type instanceof TList) { + $array_arg_type = new TArray([Type::getInt(), $array_arg_type->type_param]); + } + + $array_arg_types[] = $array_arg_type; + } + + $closure_arg = $args[$closure_index] ?? null; + + $closure_arg_type = null; + + if ($closure_arg) { + $closure_arg_type = $statements_analyzer->node_data->getType($closure_arg->value); + } + + if ($closure_arg && $closure_arg_type) { + $min_closure_param_count = $max_closure_param_count = count($array_arg_types); + + if ($method_id === 'array_filter') { + $max_closure_param_count = count($args) > 2 ? 2 : 1; + } + + foreach ($closure_arg_type->getAtomicTypes() as $closure_type) { + self::checkClosureType( + $statements_analyzer, + $context, + $method_id, + $closure_type, + $closure_arg, + $min_closure_param_count, + $max_closure_param_count, + $array_arg_types, + $check_functions + ); + } + } + } + + /** + * @param list $args + * + * @return false|null + */ + public static function handleAddition( + StatementsAnalyzer $statements_analyzer, + array $args, + Context $context, + string $method_id + ): ?bool { + $array_arg = $args[0]->value; + $nb_args = count($args); + + $unpacked_args = array_filter( + $args, + function ($arg) { + return $arg->unpack; + } + ); + + if ($method_id === 'array_push' && !$unpacked_args) { + for ($i = 1; $i < $nb_args; $i++) { + $was_inside_assignment = $context->inside_assignment; + + $context->inside_assignment = true; + + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $args[$i]->value, + $context + ) === false) { + $context->inside_assignment = $was_inside_assignment; + + return false; + } + + $context->inside_assignment = $was_inside_assignment; + + $old_node_data = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + ArrayAssignmentAnalyzer::analyze( + $statements_analyzer, + new VirtualArrayDimFetch( + $args[0]->value, + null, + $args[$i]->value->getAttributes() + ), + $context, + $args[$i]->value, + $statements_analyzer->node_data->getType($args[$i]->value) ?? Type::getMixed() + ); + + $statements_analyzer->node_data = $old_node_data; + } + + return null; + } + + $context->inside_call = true; + + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $array_arg, + $context + ) === false) { + return false; + } + + for ($i = 1; $i < $nb_args; $i++) { + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $args[$i]->value, + $context + ) === false) { + return false; + } + } + + if (($array_arg_type = $statements_analyzer->node_data->getType($array_arg)) + && $array_arg_type->hasArray() + ) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TKeyedArray|TList + */ + $array_type = $array_arg_type->getAtomicTypes()['array']; + + $objectlike_list = null; + + if ($array_type instanceof TKeyedArray) { + if ($array_type->is_list) { + $objectlike_list = clone $array_type; + } + + $array_type = $array_type->getGenericArrayType(); + + if ($objectlike_list) { + if ($array_type instanceof TNonEmptyArray) { + $array_type = new TNonEmptyList($array_type->type_params[1]); + } else { + $array_type = new TList($array_type->type_params[1]); + } + } + } + + $by_ref_type = new Union([clone $array_type]); + + foreach ($args as $argument_offset => $arg) { + if ($argument_offset === 0) { + continue; + } + + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $arg->value, + $context + ) === false) { + return false; + } + + if ($method_id === 'array_unshift' && $nb_args === 2 && !$unpacked_args) { + $new_offset_type = Type::getInt(false, 0); + } else { + $new_offset_type = Type::getInt(); + } + + if (!($arg_value_type = $statements_analyzer->node_data->getType($arg->value)) + || $arg_value_type->hasMixed() + ) { + $by_ref_type = Type::combineUnionTypes( + $by_ref_type, + new Union([new TArray([$new_offset_type, Type::getMixed()])]) + ); + } elseif ($arg->unpack) { + $arg_value_type = clone $arg_value_type; + + foreach ($arg_value_type->getAtomicTypes() as $arg_value_atomic_type) { + if ($arg_value_atomic_type instanceof TKeyedArray) { + $was_list = $arg_value_atomic_type->is_list; + + $arg_value_atomic_type = $arg_value_atomic_type->getGenericArrayType(); + + if ($was_list) { + if ($arg_value_atomic_type instanceof TNonEmptyArray) { + $arg_value_atomic_type = new TNonEmptyList($arg_value_atomic_type->type_params[1]); + } else { + $arg_value_atomic_type = new TList($arg_value_atomic_type->type_params[1]); + } + } + + $arg_value_type->addType($arg_value_atomic_type); + } + } + + $by_ref_type = Type::combineUnionTypes( + $by_ref_type, + $arg_value_type + ); + } else { + if ($objectlike_list) { + array_unshift($objectlike_list->properties, $arg_value_type); + + $by_ref_type = new Union([$objectlike_list]); + } elseif ($array_type instanceof TList) { + $by_ref_type = Type::combineUnionTypes( + $by_ref_type, + new Union( + [ + new TNonEmptyList(clone $arg_value_type), + ] + ) + ); + } else { + $by_ref_type = Type::combineUnionTypes( + $by_ref_type, + new Union( + [ + new TNonEmptyArray( + [ + $new_offset_type, + clone $arg_value_type + ] + ), + ] + ), + null, + true + ); + } + } + } + + AssignmentAnalyzer::assignByRefParam( + $statements_analyzer, + $array_arg, + $by_ref_type, + $by_ref_type, + $context, + false + ); + } + + $context->inside_call = false; + + return null; + } + + /** + * @param list $args + * + * @return false|null + */ + public static function handleSplice( + StatementsAnalyzer $statements_analyzer, + array $args, + Context $context + ): ?bool { + $context->inside_call = true; + $array_arg = $args[0]->value; + + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $array_arg, + $context + ) === false) { + return false; + } + + $offset_arg = $args[1]->value; + + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $offset_arg, + $context + ) === false) { + return false; + } + + if (!isset($args[2])) { + return null; + } + + $length_arg = $args[2]->value; + + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $length_arg, + $context + ) === false) { + return false; + } + + if (!isset($args[3])) { + return null; + } + + $replacement_arg = $args[3]->value; + + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $replacement_arg, + $context + ) === false) { + return false; + } + + $context->inside_call = false; + + $replacement_arg_type = $statements_analyzer->node_data->getType($replacement_arg); + + if ($replacement_arg_type + && !$replacement_arg_type->hasArray() + && $replacement_arg_type->hasString() + && $replacement_arg_type->isSingle() + ) { + $replacement_arg_type = new Union([ + new TArray([Type::getInt(), $replacement_arg_type]) + ]); + + $statements_analyzer->node_data->setType($replacement_arg, $replacement_arg_type); + } + + if (($array_arg_type = $statements_analyzer->node_data->getType($array_arg)) + && $array_arg_type->hasArray() + && $replacement_arg_type + && $replacement_arg_type->hasArray() + ) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TKeyedArray|TList + */ + $array_type = $array_arg_type->getAtomicTypes()['array']; + + if ($array_type instanceof TKeyedArray) { + if ($array_type->is_list) { + $array_type = new TNonEmptyList($array_type->getGenericValueType()); + } else { + $array_type = $array_type->getGenericArrayType(); + } + } + + if ($array_type instanceof TArray + && $array_type->type_params[0]->hasInt() + && !$array_type->type_params[0]->hasString() + ) { + if ($array_type instanceof TNonEmptyArray) { + $array_type = new TNonEmptyList($array_type->type_params[1]); + } else { + $array_type = new TList($array_type->type_params[1]); + } + } + + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TKeyedArray|TList + */ + $replacement_array_type = $replacement_arg_type->getAtomicTypes()['array']; + + if ($replacement_array_type instanceof TKeyedArray) { + $was_list = $replacement_array_type->is_list; + + $replacement_array_type = $replacement_array_type->getGenericArrayType(); + + if ($was_list) { + if ($replacement_array_type instanceof TNonEmptyArray) { + $replacement_array_type = new TNonEmptyList($replacement_array_type->type_params[1]); + } else { + $replacement_array_type = new TList($replacement_array_type->type_params[1]); + } + } + } + + $by_ref_type = TypeCombiner::combine([$array_type, $replacement_array_type]); + + AssignmentAnalyzer::assignByRefParam( + $statements_analyzer, + $array_arg, + $by_ref_type, + $by_ref_type, + $context, + false + ); + + return null; + } + + $array_type = Type::getArray(); + + AssignmentAnalyzer::assignByRefParam( + $statements_analyzer, + $array_arg, + $array_type, + $array_type, + $context, + false + ); + + return null; + } + + public static function handleByRefArrayAdjustment( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Arg $arg, + Context $context, + bool $is_array_shift + ): void { + $var_id = ExpressionIdentifier::getVarId( + $arg->value, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($var_id) { + $context->removeVarFromConflictingClauses($var_id, null, $statements_analyzer); + + if (isset($context->vars_in_scope[$var_id])) { + $array_type = clone $context->vars_in_scope[$var_id]; + + $array_atomic_types = $array_type->getAtomicTypes(); + + foreach ($array_atomic_types as $array_atomic_type) { + if ($array_atomic_type instanceof TKeyedArray) { + if ($is_array_shift && $array_atomic_type->is_list) { + $array_atomic_type = clone $array_atomic_type; + + $array_properties = $array_atomic_type->properties; + + array_shift($array_properties); + + if (!$array_properties) { + $array_atomic_type = new TList( + $array_atomic_type->previous_value_type ?: Type::getMixed() + ); + + $array_type->addType($array_atomic_type); + } else { + $array_atomic_type->properties = $array_properties; + } + } + + if ($array_atomic_type instanceof TKeyedArray) { + $array_atomic_type = $array_atomic_type->getGenericArrayType(); + } + } + + if ($array_atomic_type instanceof TNonEmptyArray) { + if (!$context->inside_loop && $array_atomic_type->count !== null) { + if ($array_atomic_type->count === 0) { + $array_atomic_type = new TArray( + [ + new Union([new TEmpty]), + new Union([new TEmpty]), + ] + ); + } else { + $array_atomic_type->count--; + } + } else { + $array_atomic_type = new TArray($array_atomic_type->type_params); + } + + $array_type->addType($array_atomic_type); + } elseif ($array_atomic_type instanceof TNonEmptyList) { + if (!$context->inside_loop && $array_atomic_type->count !== null) { + if ($array_atomic_type->count === 0) { + $array_atomic_type = new TArray( + [ + new Union([new TEmpty]), + new Union([new TEmpty]), + ] + ); + } else { + $array_atomic_type->count--; + } + } else { + $array_atomic_type = new TList($array_atomic_type->type_param); + } + + $array_type->addType($array_atomic_type); + } + } + + $context->removeDescendents($var_id, $array_type); + $context->vars_in_scope[$var_id] = $array_type; + } + } + } + + /** + * @param (TArray|null)[] $array_arg_types + * + */ + private static function checkClosureType( + StatementsAnalyzer $statements_analyzer, + Context $context, + string $method_id, + Atomic $closure_type, + PhpParser\Node\Arg $closure_arg, + int $min_closure_param_count, + int $max_closure_param_count, + array $array_arg_types, + bool $check_functions + ): void { + $codebase = $statements_analyzer->getCodebase(); + + if (!$closure_type instanceof TClosure) { + if ($method_id === 'array_map') { + return; + } + + if (!$closure_arg->value instanceof PhpParser\Node\Scalar\String_ + && !$closure_arg->value instanceof PhpParser\Node\Expr\Array_ + && !$closure_arg->value instanceof PhpParser\Node\Expr\BinaryOp\Concat + ) { + return; + } + + $function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( + $statements_analyzer, + $closure_arg->value + ); + + $closure_types = []; + + foreach ($function_ids as $function_id) { + $function_id = strtolower($function_id); + + if (strpos($function_id, '::') !== false) { + if ($function_id[0] === '$') { + $function_id = substr($function_id, 1); + } + + $function_id_parts = explode('&', $function_id); + + foreach ($function_id_parts as $function_id_part) { + [$callable_fq_class_name, $method_name] = explode('::', $function_id_part); + + switch ($callable_fq_class_name) { + case 'self': + case 'static': + case 'parent': + $container_class = $statements_analyzer->getFQCLN(); + + if ($callable_fq_class_name === 'parent') { + $container_class = $statements_analyzer->getParentFQCLN(); + } + + if (!$container_class) { + continue 2; + } + + $callable_fq_class_name = $container_class; + } + + if (!$codebase->classOrInterfaceExists($callable_fq_class_name)) { + return; + } + + $function_id_part = new MethodIdentifier( + $callable_fq_class_name, + strtolower($method_name) + ); + + try { + $method_storage = $codebase->methods->getStorage($function_id_part); + } catch (UnexpectedValueException $e) { + // the method may not exist, but we're suppressing that issue + continue; + } + + $closure_types[] = new TClosure( + 'Closure', + $method_storage->params, + $method_storage->return_type ?: Type::getMixed() + ); + } + } else { + if (!$check_functions) { + continue; + } + + if (!$codebase->functions->functionExists($statements_analyzer, $function_id)) { + continue; + } + + $function_storage = $codebase->functions->getStorage( + $statements_analyzer, + $function_id + ); + + if (InternalCallMapHandler::inCallMap($function_id)) { + $callmap_callables = InternalCallMapHandler::getCallablesFromCallMap($function_id); + + if ($callmap_callables === null) { + throw new UnexpectedValueException('This should not happen'); + } + + $passing_callmap_callables = []; + + foreach ($callmap_callables as $callmap_callable) { + $required_param_count = 0; + + assert($callmap_callable->params !== null); + + foreach ($callmap_callable->params as $i => $param) { + if (!$param->is_optional && !$param->is_variadic) { + $required_param_count = $i + 1; + } + } + + if ($required_param_count <= $max_closure_param_count) { + $passing_callmap_callables[] = $callmap_callable; + } + } + + if ($passing_callmap_callables) { + foreach ($passing_callmap_callables as $passing_callmap_callable) { + $closure_types[] = $passing_callmap_callable; + } + } else { + $closure_types[] = $callmap_callables[0]; + } + } else { + $closure_types[] = new TClosure( + 'Closure', + $function_storage->params, + $function_storage->return_type ?: Type::getMixed() + ); + } + } + } + } else { + $closure_types = [$closure_type]; + } + + foreach ($closure_types as $closure_type) { + if ($closure_type->params === null) { + continue; + } + + self::checkClosureTypeArgs( + $statements_analyzer, + $context, + $method_id, + $closure_type, + $closure_arg, + $min_closure_param_count, + $max_closure_param_count, + $array_arg_types + ); + } + } + + /** + * @param TClosure|TCallable $closure_type + * @param (TArray|null)[] $array_arg_types + */ + private static function checkClosureTypeArgs( + StatementsAnalyzer $statements_analyzer, + Context $context, + string $method_id, + Atomic $closure_type, + PhpParser\Node\Arg $closure_arg, + int $min_closure_param_count, + int $max_closure_param_count, + array $array_arg_types + ): void { + $codebase = $statements_analyzer->getCodebase(); + + $closure_params = $closure_type->params; + + if ($closure_params === null) { + throw new UnexpectedValueException('Closure params should not be null here'); + } + + $required_param_count = 0; + + foreach ($closure_params as $i => $param) { + if (!$param->is_optional && !$param->is_variadic) { + $required_param_count = $i + 1; + } + } + + if (count($closure_params) < $min_closure_param_count) { + $argument_text = $min_closure_param_count === 1 ? 'one argument' : $min_closure_param_count . ' arguments'; + + IssueBuffer::maybeAdd( + new TooManyArguments( + 'The callable passed to ' . $method_id . ' will be called with ' . $argument_text . ', expecting ' + . $required_param_count, + new CodeLocation($statements_analyzer->getSource(), $closure_arg), + $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + if ($required_param_count > $max_closure_param_count) { + $argument_text = $max_closure_param_count === 1 ? 'one argument' : $max_closure_param_count . ' arguments'; + + IssueBuffer::maybeAdd( + new TooFewArguments( + 'The callable passed to ' . $method_id . ' will be called with ' . $argument_text . ', expecting ' + . $required_param_count, + new CodeLocation($statements_analyzer->getSource(), $closure_arg), + $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + // abandon attempt to validate closure params if we have an extra arg for ARRAY_FILTER + if ($method_id === 'array_filter' && $max_closure_param_count > 1) { + return; + } + + foreach ($closure_params as $i => $closure_param) { + if (!isset($array_arg_types[$i])) { + continue; + } + + $array_arg_type = $array_arg_types[$i]; + + $input_type = $array_arg_type->type_params[1]; + + if ($input_type->hasMixed()) { + continue; + } + + $closure_param_type = $closure_param->type; + + if (!$closure_param_type) { + continue; + } + + if ($method_id === 'array_map' + && $i === 0 + && $closure_type->return_type + && $closure_param_type->hasTemplate() + ) { + $closure_param_type = clone $closure_param_type; + $closure_type->return_type = clone $closure_type->return_type; + + $template_result = new TemplateResult( + [], + [] + ); + + foreach ($closure_param_type->getTemplateTypes() as $template_type) { + $template_result->template_types[$template_type->param_name] = [ + ($template_type->defining_class) => $template_type->as + ]; + } + + $closure_param_type = TemplateStandinTypeReplacer::replace( + $closure_param_type, + $template_result, + $codebase, + $statements_analyzer, + $input_type, + $i, + $context->self, + $context->calling_method_id ?: $context->calling_function_id + ); + + $closure_type->replaceTemplateTypesWithArgTypes( + $template_result, + $codebase + ); + } + + $closure_param_type = TypeExpander::expandUnion( + $codebase, + $closure_param_type, + $context->self, + null, + $statements_analyzer->getParentFQCLN() + ); + + $union_comparison_results = new TypeComparisonResult(); + + $type_match_found = UnionTypeComparator::isContainedBy( + $codebase, + $input_type, + $closure_param_type, + $input_type->ignore_nullable_issues, + $input_type->ignore_falsable_issues, + $union_comparison_results + ); + + if ($union_comparison_results->type_coerced) { + if ($union_comparison_results->type_coerced_from_mixed) { + IssueBuffer::maybeAdd( + new MixedArgumentTypeCoercion( + 'Parameter ' . ($i + 1) . ' of closure passed to function ' . $method_id . ' expects ' . + $closure_param_type->getId() . ', parent type ' . $input_type->getId() . ' provided', + new CodeLocation($statements_analyzer->getSource(), $closure_arg), + $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new ArgumentTypeCoercion( + 'Parameter ' . ($i + 1) . ' of closure passed to function ' . $method_id . ' expects ' . + $closure_param_type->getId() . ', parent type ' . $input_type->getId() . ' provided', + new CodeLocation($statements_analyzer->getSource(), $closure_arg), + $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if (!$union_comparison_results->type_coerced && !$type_match_found) { + $types_can_be_identical = UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $input_type, + $closure_param_type + ); + + if ($union_comparison_results->scalar_type_match_found) { + IssueBuffer::maybeAdd( + new InvalidScalarArgument( + 'Parameter ' . ($i + 1) . ' of closure passed to function ' . $method_id . ' expects ' . + $closure_param_type->getId() . ', ' . $input_type->getId() . ' provided', + new CodeLocation($statements_analyzer->getSource(), $closure_arg), + $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($types_can_be_identical) { + IssueBuffer::maybeAdd( + new PossiblyInvalidArgument( + 'Parameter ' . ($i + 1) . ' of closure passed to function ' . $method_id . ' expects ' + . $closure_param_type->getId() . ', possibly different type ' + . $input_type->getId() . ' provided', + new CodeLocation($statements_analyzer->getSource(), $closure_arg), + $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif (IssueBuffer::accepts( + new InvalidArgument( + 'Parameter ' . ($i + 1) . ' of closure passed to function ' . $method_id . ' expects ' . + $closure_param_type->getId() . ', ' . $input_type->getId() . ' provided', + new CodeLocation($statements_analyzer->getSource(), $closure_arg), + $method_id + ), + $statements_analyzer->getSuppressedIssues() + )) { + // fall through + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php new file mode 100644 index 00000000..1450e9e3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php @@ -0,0 +1,282 @@ +>|null + * @psalm-suppress MoreSpecificReturnType + * @psalm-suppress LessSpecificReturnStatement + */ + public static function collect( + Codebase $codebase, + ClassLikeStorage $class_storage, + ClassLikeStorage $static_class_storage, + ?string $method_name = null, + ?Atomic $lhs_type_part = null, + bool $self_call = false + ): ?array { + $static_fq_class_name = $static_class_storage->name; + + $non_trait_class_storage = $class_storage->is_trait + ? $static_class_storage + : $class_storage; + + $template_types = $class_storage->template_types; + + $candidate_class_storages = [$class_storage]; + + if ($static_class_storage->template_extended_params + && $method_name + && !empty($non_trait_class_storage->overridden_method_ids[$method_name]) + && isset($class_storage->methods[$method_name]) + && (!isset($non_trait_class_storage->methods[$method_name]->return_type) + || $class_storage->methods[$method_name]->inherited_return_type) + ) { + foreach ($non_trait_class_storage->overridden_method_ids[$method_name] as $overridden_method_id) { + $overridden_storage = $codebase->methods->getStorage($overridden_method_id); + + if (!$overridden_storage->return_type) { + continue; + } + + if ($overridden_storage->return_type->isNull()) { + continue; + } + + $fq_overridden_class = $overridden_method_id->fq_class_name; + + $overridden_class_storage = $codebase->classlike_storage_provider->get($fq_overridden_class); + + $overridden_template_types = $overridden_class_storage->template_types; + + if (!$template_types) { + $template_types = $overridden_template_types; + } elseif ($overridden_template_types) { + foreach ($overridden_template_types as $template_name => $template_map) { + if (isset($template_types[$template_name])) { + $template_types[$template_name] = array_merge( + $template_types[$template_name], + $template_map + ); + } else { + $template_types[$template_name] = $template_map; + } + } + } + + $candidate_class_storages[] = $overridden_class_storage; + } + } + + if (!$template_types) { + return null; + } + + $class_template_params = []; + $e = $static_class_storage->template_extended_params; + + if ($lhs_type_part instanceof TGenericObject) { + if ($class_storage === $static_class_storage && $class_storage->template_types) { + $i = 0; + + foreach ($class_storage->template_types as $type_name => $_) { + if (isset($lhs_type_part->type_params[$i])) { + $class_template_params[$type_name][$class_storage->name] + = $lhs_type_part->type_params[$i]; + } + + $i++; + } + } + + foreach ($template_types as $type_name => $_) { + if (isset($class_template_params[$type_name])) { + continue; + } + + if ($class_storage !== $static_class_storage + && isset($e[$class_storage->name][$type_name]) + ) { + $input_type_extends = $e[$class_storage->name][$type_name]; + + $output_type_extends = self::resolveTemplateParam( + $input_type_extends, + $static_class_storage, + $lhs_type_part + ); + if (!$self_call || $static_fq_class_name !== $class_storage->name) { + $class_template_params[$type_name][$class_storage->name] + = $output_type_extends ?? Type::getMixed(); + } + } + + if ((!$self_call || $static_fq_class_name !== $class_storage->name) + && !isset($class_template_params[$type_name]) + ) { + $class_template_params[$type_name] = [$class_storage->name => Type::getMixed()]; + } + } + } + + foreach ($template_types as $type_name => $type_map) { + foreach ($type_map as $type) { + foreach ($candidate_class_storages as $candidate_class_storage) { + if ($candidate_class_storage !== $static_class_storage + && isset($e[$candidate_class_storage->name][$type_name]) + && !isset($class_template_params[$type_name][$candidate_class_storage->name]) + ) { + $class_template_params[$type_name][$candidate_class_storage->name] = new Union( + self::expandType( + $codebase, + $e[$candidate_class_storage->name][$type_name], + $e, + $static_class_storage->name, + $static_class_storage->template_types + ) + ); + } + } + + if (!$self_call) { + if (!isset($class_template_params[$type_name])) { + $class_template_params[$type_name][$class_storage->name] = $type; + } + } + } + } + + return $class_template_params; + } + + public static function resolveTemplateParam( + Union $input_type_extends, + ClassLikeStorage $static_class_storage, + TGenericObject $lhs_type_part + ): ?Union { + $output_type_extends = null; + foreach ($input_type_extends->getAtomicTypes() as $type_extends_atomic) { + if ($type_extends_atomic instanceof TTemplateParam) { + if (isset( + $static_class_storage + ->template_types + [$type_extends_atomic->param_name] + [$type_extends_atomic->defining_class] + ) + ) { + $mapped_offset = array_search( + $type_extends_atomic->param_name, + array_keys($static_class_storage->template_types), + true + ); + + if ($mapped_offset !== false + && isset($lhs_type_part->type_params[$mapped_offset]) + ) { + $output_type_extends = Type::combineUnionTypes( + $lhs_type_part->type_params[$mapped_offset], + $output_type_extends + ); + } + } elseif (isset( + $static_class_storage + ->template_extended_params + [$type_extends_atomic->defining_class] + [$type_extends_atomic->param_name] + )) { + $nested_output_type = self::resolveTemplateParam( + $static_class_storage + ->template_extended_params + [$type_extends_atomic->defining_class] + [$type_extends_atomic->param_name], + $static_class_storage, + $lhs_type_part + ); + if ($nested_output_type !== null) { + $output_type_extends = Type::combineUnionTypes( + $nested_output_type, + $output_type_extends + ); + } + } + } else { + $output_type_extends = Type::combineUnionTypes( + new Union([$type_extends_atomic]), + $output_type_extends + ); + } + } + return $output_type_extends; + } + + /** + * @param array> $e + * @return non-empty-list + */ + private static function expandType( + Codebase $codebase, + Union $input_type_extends, + array $e, + string $static_fq_class_name, + ?array $static_template_types + ): array { + $output_type_extends = []; + + foreach ($input_type_extends->getAtomicTypes() as $type_extends_atomic) { + if ($type_extends_atomic instanceof TTemplateParam + && ($static_fq_class_name !== $type_extends_atomic->defining_class + || !isset($static_template_types[$type_extends_atomic->param_name])) + && isset($e[$type_extends_atomic->defining_class][$type_extends_atomic->param_name]) + ) { + $output_type_extends = array_merge( + $output_type_extends, + self::expandType( + $codebase, + $e[$type_extends_atomic->defining_class][$type_extends_atomic->param_name], + $e, + $static_fq_class_name, + $static_template_types + ) + ); + } elseif ($type_extends_atomic instanceof TClassConstant) { + $expanded = TypeExpander::expandAtomic( + $codebase, + $type_extends_atomic, + $type_extends_atomic->fq_classlike_name, + $type_extends_atomic->fq_classlike_name, + null, + true, + true + ); + + if ($expanded instanceof Atomic) { + $output_type_extends[] = $expanded; + } else { + foreach ($expanded as $type) { + $output_type_extends[] = $type; + } + } + } else { + $output_type_extends[] = $type_extends_atomic; + } + } + + return $output_type_extends; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php new file mode 100644 index 00000000..d98cf1fc --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php @@ -0,0 +1,1129 @@ +name; + + $codebase = $statements_analyzer->getCodebase(); + + $code_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + $config = $codebase->config; + + $is_first_class_callable = $stmt->isFirstClassCallable(); + + $real_stmt = $stmt; + + if ($function_name instanceof PhpParser\Node\Name + && !$is_first_class_callable + && isset($stmt->getArgs()[0]) + && !$stmt->getArgs()[0]->unpack + ) { + $original_function_id = implode('\\', $function_name->parts); + + if ($original_function_id === 'call_user_func') { + $other_args = array_slice($stmt->getArgs(), 1); + + $function_name = $stmt->getArgs()[0]->value; + + $stmt = new VirtualFuncCall( + $function_name, + $other_args, + $stmt->getAttributes() + ); + } + + if ($original_function_id === 'call_user_func_array' && isset($stmt->getArgs()[1])) { + $function_name = $stmt->getArgs()[0]->value; + + $stmt = new VirtualFuncCall( + $function_name, + [new VirtualArg($stmt->getArgs()[1]->value, false, true)], + $stmt->getAttributes() + ); + } + } + + if ($function_name instanceof PhpParser\Node\Expr) { + $function_call_info = self::getAnalyzeNamedExpression( + $statements_analyzer, + $stmt, + $real_stmt, + $function_name, + $context + ); + + if ($function_call_info->function_exists === false) { + return true; + } + + if ($function_call_info->new_function_name) { + $function_name = $function_call_info->new_function_name; + } + } else { + $function_call_info = self::handleNamedFunction( + $statements_analyzer, + $stmt, + $function_name, + $context, + $code_location + ); + + if (!$function_call_info->function_exists) { + return true; + } + } + + $set_inside_conditional = false; + + if ($function_name instanceof PhpParser\Node\Name + && $function_name->parts === ['assert'] + && !$context->inside_conditional + ) { + $context->inside_conditional = true; + $set_inside_conditional = true; + } + + if (!$is_first_class_callable) { + $template_result = null; + + if (isset($function_call_info->function_storage->template_types)) { + $template_result = new TemplateResult($function_call_info->function_storage->template_types ?: [], []); + } + + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + $function_call_info->function_params, + $function_call_info->function_id, + $function_call_info->allow_named_args, + $context, + $template_result + ); + } + + if ($set_inside_conditional) { + $context->inside_conditional = false; + } + + $function_callable = null; + + if (!$is_first_class_callable + && $function_name instanceof PhpParser\Node\Name + && $function_call_info->function_id + ) { + if (!$function_call_info->is_stubbed && $function_call_info->in_call_map) { + $function_callable = InternalCallMapHandler::getCallableFromCallMapById( + $codebase, + $function_call_info->function_id, + $stmt->getArgs(), + $statements_analyzer->node_data + ); + + $function_call_info->function_params = $function_callable->params; + } + } + + $template_result = new TemplateResult([], []); + + // do this here to allow closure param checks + if (!$is_first_class_callable && $function_call_info->function_params !== null) { + ArgumentsAnalyzer::checkArgumentsMatch( + $statements_analyzer, + $stmt->getArgs(), + $function_call_info->function_id, + $function_call_info->function_params, + $function_call_info->function_storage, + null, + $template_result, + $code_location, + $context + ); + } + + CallAnalyzer::checkTemplateResult( + $statements_analyzer, + $template_result, + $code_location, + $function_call_info->function_id + ); + + if ($function_name instanceof PhpParser\Node\Name && $function_call_info->function_id) { + $stmt_type = FunctionCallReturnTypeFetcher::fetch( + $statements_analyzer, + $codebase, + $stmt, + $function_name, + $function_call_info->function_id, + $function_call_info->in_call_map, + $function_call_info->is_stubbed, + $function_call_info->function_storage, + $function_callable, + $template_result, + $context + ); + + $statements_analyzer->node_data->setType($real_stmt, $stmt_type); + + if ($stmt_type->isNever()) { + $context->has_returned = true; + } + + $event = new AfterEveryFunctionCallAnalysisEvent( + $stmt, + $function_call_info->function_id, + $context, + $statements_analyzer->getSource(), + $codebase + ); + + $config->eventDispatcher->dispatchAfterEveryFunctionCallAnalysis($event); + + if ($is_first_class_callable) { + return true; + } + } + + if ($is_first_class_callable) { + $type_provider = $statements_analyzer->getNodeTypeProvider(); + $closure_types = []; + + if ($input_type = $type_provider->getType($function_name)) { + foreach ($input_type->getAtomicTypes() as $atomic_type) { + $candidate_callable = CallableTypeComparator::getCallableFromAtomic( + $codebase, + $atomic_type, + null, + $statements_analyzer + ); + + if ($candidate_callable) { + $closure_types[] = new TClosure( + 'Closure', + $candidate_callable->params, + $candidate_callable->return_type, + $candidate_callable->is_pure + ); + } + } + } + + if ($closure_types) { + $stmt_type = TypeCombiner::combine($closure_types, $codebase); + } else { + $stmt_type = Type::getClosure(); + } + + $statements_analyzer->node_data->setType($real_stmt, $stmt_type); + + return true; + } + + foreach ($function_call_info->defined_constants as $const_name => $const_type) { + $context->constants[$const_name] = clone $const_type; + $context->vars_in_scope[$const_name] = clone $const_type; + } + + foreach ($function_call_info->global_variables as $var_id => $_) { + $context->vars_in_scope[$var_id] = Type::getMixed(); + $context->vars_possibly_in_scope[$var_id] = true; + } + + if ($function_name instanceof PhpParser\Node\Name + && $function_name->parts === ['assert'] + && isset($stmt->getArgs()[0]) + ) { + self::processAssertFunctionEffects( + $statements_analyzer, + $codebase, + $stmt, + $stmt->getArgs()[0], + $context + ); + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + && ($stmt_type = $statements_analyzer->node_data->getType($real_stmt)) + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt, + $stmt_type->getId() + ); + } + + self::checkFunctionCallPurity( + $statements_analyzer, + $codebase, + $stmt, + $function_name, + $function_call_info, + $context + ); + + if ($function_call_info->function_storage) { + $inferred_lower_bounds = $template_result->lower_bounds; + + if ($function_call_info->function_storage->assertions && $function_name instanceof PhpParser\Node\Name) { + self::applyAssertionsToContext( + $function_name, + null, + $function_call_info->function_storage->assertions, + $stmt->getArgs(), + $inferred_lower_bounds, + $context, + $statements_analyzer + ); + } + + if ($function_call_info->function_storage->if_true_assertions) { + $statements_analyzer->node_data->setIfTrueAssertions( + $stmt, + array_map( + function (Assertion $assertion) use ($inferred_lower_bounds, $codebase): Assertion { + return $assertion->getUntemplatedCopy($inferred_lower_bounds ?: [], null, $codebase); + }, + $function_call_info->function_storage->if_true_assertions + ) + ); + } + + if ($function_call_info->function_storage->if_false_assertions) { + $statements_analyzer->node_data->setIfFalseAssertions( + $stmt, + array_map( + function (Assertion $assertion) use ($inferred_lower_bounds, $codebase): Assertion { + return $assertion->getUntemplatedCopy($inferred_lower_bounds ?: [], null, $codebase); + }, + $function_call_info->function_storage->if_false_assertions + ) + ); + } + + if ($function_call_info->function_storage->deprecated && $function_call_info->function_id) { + IssueBuffer::maybeAdd( + new DeprecatedFunction( + 'The function ' . $function_call_info->function_id . ' has been marked as deprecated', + $code_location, + $function_call_info->function_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($function_call_info->byref_uses) { + foreach ($function_call_info->byref_uses as $byref_use_var => $_) { + $context->vars_in_scope['$' . $byref_use_var] = Type::getMixed(); + $context->vars_possibly_in_scope['$' . $byref_use_var] = true; + } + } + + if ($function_name instanceof PhpParser\Node\Name && $function_call_info->function_id) { + NamedFunctionCallHandler::handle( + $statements_analyzer, + $codebase, + $stmt, + $real_stmt, + $function_name, + strtolower($function_call_info->function_id), + $context + ); + } + + if (!$statements_analyzer->node_data->getType($real_stmt)) { + $statements_analyzer->node_data->setType($real_stmt, Type::getMixed()); + } + + return true; + } + + private static function handleNamedFunction( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\FuncCall $stmt, + PhpParser\Node\Name $function_name, + Context $context, + CodeLocation $code_location + ): FunctionCallInfo { + $function_call_info = new FunctionCallInfo(); + + $codebase = $statements_analyzer->getCodebase(); + $codebase_functions = $codebase->functions; + + $original_function_id = implode('\\', $function_name->parts); + + if (!$function_name instanceof PhpParser\Node\Name\FullyQualified) { + $function_call_info->function_id = $codebase_functions->getFullyQualifiedFunctionNameFromString( + $original_function_id, + $statements_analyzer + ); + } else { + $function_call_info->function_id = $original_function_id; + } + + $namespaced_function_exists = $codebase_functions->functionExists( + $statements_analyzer, + strtolower($function_call_info->function_id) + ); + + if (!$namespaced_function_exists + && !$function_name instanceof PhpParser\Node\Name\FullyQualified + ) { + $function_call_info->in_call_map = InternalCallMapHandler::inCallMap($original_function_id); + $function_call_info->is_stubbed = $codebase_functions->hasStubbedFunction($original_function_id); + + if ($function_call_info->is_stubbed || $function_call_info->in_call_map) { + $function_call_info->function_id = $original_function_id; + } + } else { + $function_call_info->in_call_map = InternalCallMapHandler::inCallMap($function_call_info->function_id); + $function_call_info->is_stubbed = $codebase_functions->hasStubbedFunction($function_call_info->function_id); + } + + $function_call_info->function_exists + = $function_call_info->is_stubbed || $function_call_info->in_call_map || $namespaced_function_exists; + + if ($function_call_info->function_exists + && $codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + ArgumentMapPopulator::recordArgumentPositions( + $statements_analyzer, + $stmt, + $codebase, + $function_call_info->function_id + ); + } + + $is_predefined = true; + + $is_maybe_root_function = !$function_name instanceof PhpParser\Node\Name\FullyQualified + && count($function_name->parts) === 1; + + $args = $stmt->isFirstClassCallable() ? [] : $stmt->getArgs(); + + if (!$function_call_info->in_call_map) { + $predefined_functions = $codebase->config->getPredefinedFunctions(); + $is_predefined = isset($predefined_functions[strtolower($original_function_id)]) + || isset($predefined_functions[strtolower($function_call_info->function_id)]); + + if ($context->check_functions) { + if (self::checkFunctionExists( + $statements_analyzer, + $function_call_info->function_id, + $code_location, + $is_maybe_root_function + ) === false) { + if ($args && ArgumentsAnalyzer::analyze( + $statements_analyzer, + $args, + null, + null, + true, + $context + ) === false) { + // fall through + } + + return $function_call_info; + } + + $function_call_info->function_exists = true; + } + } else { + $function_call_info->function_exists = true; + } + + $function_call_info->function_params = null; + $function_call_info->defined_constants = []; + $function_call_info->global_variables = []; + $args = $stmt->isFirstClassCallable() ? [] : $stmt->getArgs(); + + if ($function_call_info->function_exists) { + if ($codebase->functions->params_provider->has($function_call_info->function_id)) { + $function_call_info->function_params = $codebase->functions->params_provider->getFunctionParams( + $statements_analyzer, + $function_call_info->function_id, + $args, + null, + $code_location + ); + } + + if ($function_call_info->function_params === null) { + if (!$function_call_info->in_call_map || $function_call_info->is_stubbed) { + try { + $function_call_info->function_storage = $function_storage = $codebase_functions->getStorage( + $statements_analyzer, + strtolower($function_call_info->function_id) + ); + + $function_call_info->function_params = $function_call_info->function_storage->params; + + if (!$function_storage->allow_named_arg_calls) { + $function_call_info->allow_named_args = false; + } + + if (!$is_predefined) { + $function_call_info->defined_constants = $function_storage->defined_constants; + $function_call_info->global_variables = $function_storage->global_variables; + } + } catch (UnexpectedValueException $e) { + $function_call_info->function_params = [ + new FunctionLikeParameter('args', false, null, null, null, false, false, true) + ]; + } + } else { + $function_callable = InternalCallMapHandler::getCallableFromCallMapById( + $codebase, + $function_call_info->function_id, + $args, + $statements_analyzer->node_data + ); + + $function_call_info->function_params = $function_callable->params; + } + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $function_name, + $function_call_info->function_id . '()' + ); + } + } + + return $function_call_info; + } + + private static function getAnalyzeNamedExpression( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\FuncCall $stmt, + PhpParser\Node\Expr\FuncCall $real_stmt, + PhpParser\Node\Expr $function_name, + Context $context + ): FunctionCallInfo { + $function_call_info = new FunctionCallInfo(); + + $codebase = $statements_analyzer->getCodebase(); + + $was_in_call = $context->inside_call; + $context->inside_call = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $function_name, $context) === false) { + $context->inside_call = $was_in_call; + + return $function_call_info; + } + + $context->inside_call = $was_in_call; + + $function_call_info->byref_uses = []; + + if ($stmt_name_type = $statements_analyzer->node_data->getType($function_name)) { + if ($stmt_name_type->isNull()) { + IssueBuffer::maybeAdd( + new NullFunctionCall( + 'Cannot call function on null value', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return $function_call_info; + } + + if ($stmt_name_type->isNullable()) { + IssueBuffer::maybeAdd( + new PossiblyNullFunctionCall( + 'Cannot call function on possibly null value', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $invalid_function_call_types = []; + $has_valid_function_call_type = false; + + $var_atomic_types = $stmt_name_type->getAtomicTypes(); + + while ($var_atomic_types) { + $var_type_part = array_shift($var_atomic_types); + + if ($var_type_part instanceof TTemplateParam) { + $var_atomic_types = array_merge($var_atomic_types, $var_type_part->as->getAtomicTypes()); + continue; + } + + if ($var_type_part instanceof TClosure || $var_type_part instanceof TCallable) { + if (!$var_type_part->is_pure) { + if ($context->pure || $context->mutation_free) { + IssueBuffer::maybeAdd( + new ImpureFunctionCall( + 'Cannot call an impure function from a mutation-free context', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (!$function_call_info->function_storage) { + $function_call_info->function_storage = new FunctionStorage(); + } + + $function_call_info->function_storage->pure = false; + $function_call_info->function_storage->mutation_free = false; + } + + $function_call_info->function_params = $var_type_part->params; + + if (($stmt_type = $statements_analyzer->node_data->getType($real_stmt)) + && $var_type_part->return_type + ) { + $statements_analyzer->node_data->setType( + $real_stmt, + Type::combineUnionTypes( + $stmt_type, + $var_type_part->return_type + ) + ); + } else { + $statements_analyzer->node_data->setType( + $real_stmt, + $var_type_part->return_type ?? Type::getMixed() + ); + } + + if ($var_type_part instanceof TClosure) { + $function_call_info->byref_uses += $var_type_part->byref_uses; + } + + $function_call_info->function_exists = true; + $has_valid_function_call_type = true; + } elseif ($var_type_part instanceof TMixed) { + $has_valid_function_call_type = true; + + IssueBuffer::maybeAdd( + new MixedFunctionCall( + 'Cannot call function on ' . $var_type_part->getId(), + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($var_type_part instanceof TCallableObject + || $var_type_part instanceof TCallableString + || ($var_type_part instanceof TNamedObject && $var_type_part->value === 'Closure') + || ($var_type_part instanceof TObjectWithProperties && isset($var_type_part->methods['__invoke'])) + ) { + // this is fine + $has_valid_function_call_type = true; + } elseif ($var_type_part instanceof TString + || $var_type_part instanceof TArray + || $var_type_part instanceof TList + || ($var_type_part instanceof TKeyedArray + && count($var_type_part->properties) === 2) + ) { + $potential_method_id = null; + + if ($var_type_part instanceof TKeyedArray) { + $potential_method_id = CallableTypeComparator::getCallableMethodIdFromTKeyedArray( + $var_type_part, + $codebase, + $context->calling_method_id, + $statements_analyzer->getFilePath() + ); + + if ($potential_method_id === 'not-callable') { + $potential_method_id = null; + } + } elseif ($var_type_part instanceof TLiteralString) { + if (!$var_type_part->value) { + $invalid_function_call_types[] = '\'\''; + continue; + } + + if (strpos($var_type_part->value, '::')) { + $parts = explode('::', strtolower($var_type_part->value)); + $fq_class_name = $parts[0]; + $fq_class_name = preg_replace('/^\\\\/', '', $fq_class_name); + $potential_method_id = new MethodIdentifier($fq_class_name, $parts[1]); + } else { + $function_call_info->new_function_name = new VirtualFullyQualified( + $var_type_part->value, + $function_name->getAttributes() + ); + } + } + + if ($potential_method_id) { + $codebase->methods->methodExists( + $potential_method_id, + $context->calling_method_id, + null, + $statements_analyzer, + $statements_analyzer->getFilePath() + ); + } + + // this is also kind of fine + $has_valid_function_call_type = true; + } elseif ($var_type_part instanceof TNull) { + // handled above + } elseif (!$var_type_part instanceof TNamedObject + || !$codebase->classlikes->classOrInterfaceExists($var_type_part->value) + || !$codebase->methods->methodExists( + new MethodIdentifier( + $var_type_part->value, + '__invoke' + ) + ) + ) { + $invalid_function_call_types[] = (string)$var_type_part; + } else { + self::analyzeInvokeCall( + $statements_analyzer, + $stmt, + $real_stmt, + $function_name, + $context, + $var_type_part + ); + } + } + + if ($invalid_function_call_types) { + $var_type_part = reset($invalid_function_call_types); + + if ($has_valid_function_call_type) { + IssueBuffer::maybeAdd( + new PossiblyInvalidFunctionCall( + 'Cannot treat type ' . $var_type_part . ' as callable', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidFunctionCall( + 'Cannot treat type ' . $var_type_part . ' as callable', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + return $function_call_info; + } + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && $stmt_name_type->parent_nodes + && $stmt_name_type->hasString() + && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + $arg_location = new CodeLocation($statements_analyzer->getSource(), $function_name); + + $custom_call_sink = TaintSink::getForMethodArgument( + 'variable-call', + 'variable-call', + 0, + $arg_location, + $arg_location + ); + + $custom_call_sink->taints = [TaintKind::INPUT_CALLABLE]; + + $statements_analyzer->data_flow_graph->addSink($custom_call_sink); + + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + foreach ($stmt_name_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $custom_call_sink, + 'call', + $added_taints, + $removed_taints + ); + } + } + } + + if (!$statements_analyzer->node_data->getType($real_stmt)) { + $statements_analyzer->node_data->setType($real_stmt, Type::getMixed()); + } + + return $function_call_info; + } + + private static function analyzeInvokeCall( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\FuncCall $stmt, + PhpParser\Node\Expr\FuncCall $real_stmt, + PhpParser\Node\Expr $function_name, + Context $context, + Atomic $atomic_type + ): void { + $old_data_provider = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $fake_method_call = new VirtualMethodCall( + $function_name, + new VirtualIdentifier('__invoke', $function_name->getAttributes()), + $stmt->args + ); + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('InternalMethod', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['InternalMethod']); + } + + $statements_analyzer->node_data->setType($function_name, new Union([$atomic_type])); + + MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_method_call, + $context, + false + ); + + if (!in_array('InternalMethod', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['InternalMethod']); + } + + $fake_method_call_type = $statements_analyzer->node_data->getType($fake_method_call); + + $statements_analyzer->node_data = $old_data_provider; + + if ($stmt_type = $statements_analyzer->node_data->getType($real_stmt)) { + $statements_analyzer->node_data->setType( + $real_stmt, + Type::combineUnionTypes( + $fake_method_call_type ?? Type::getMixed(), + $stmt_type + ) + ); + } else { + $statements_analyzer->node_data->setType( + $real_stmt, + $fake_method_call_type ?? Type::getMixed() + ); + } + } + + private static function processAssertFunctionEffects( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\FuncCall $stmt, + PhpParser\Node\Arg $first_arg, + Context $context + ): void { + $first_arg_value_id = spl_object_id($first_arg->value); + + $assert_clauses = FormulaGenerator::getFormula( + $first_arg_value_id, + $first_arg_value_id, + $first_arg->value, + $context->self, + $statements_analyzer, + $codebase + ); + + AlgebraAnalyzer::checkForParadox( + $context->clauses, + $assert_clauses, + $statements_analyzer, + $stmt, + [] + ); + + $simplified_clauses = Algebra::simplifyCNF(array_merge($context->clauses, $assert_clauses)); + + $assert_type_assertions = Algebra::getTruthsFromFormula($simplified_clauses); + + $changed_var_ids = []; + + if ($assert_type_assertions) { + // while in an and, we allow scope to boil over to support + // statements of the form if ($x && $x->foo()) + $op_vars_in_scope = Reconciler::reconcileKeyedTypes( + $assert_type_assertions, + $assert_type_assertions, + $context->vars_in_scope, + $changed_var_ids, + array_map( + function ($_): bool { + return true; + }, + $assert_type_assertions + ), + $statements_analyzer, + $statements_analyzer->getTemplateTypeMap() ?: [], + $context->inside_loop, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ); + + foreach ($changed_var_ids as $var_id => $_) { + $first_appearance = $statements_analyzer->getFirstAppearance($var_id); + + if ($first_appearance + && isset($context->vars_in_scope[$var_id]) + && $context->vars_in_scope[$var_id]->hasMixed() + ) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->decrementMixedCount($statements_analyzer->getFilePath()); + } + + IssueBuffer::remove( + $statements_analyzer->getFilePath(), + 'MixedAssignment', + $first_appearance->raw_file_start + ); + } + + if (isset($op_vars_in_scope[$var_id])) { + $op_vars_in_scope[$var_id]->from_docblock = true; + } + } + + $context->vars_in_scope = $op_vars_in_scope; + } + + if ($changed_var_ids) { + $simplified_clauses = Context::removeReconciledClauses($simplified_clauses, $changed_var_ids)[0]; + } + + $context->clauses = $simplified_clauses; + } + + private static function checkFunctionCallPurity( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\FuncCall $stmt, + PhpParser\Node $function_name, + FunctionCallInfo $function_call_info, + Context $context + ): void { + $config = $codebase->config; + + if (!$context->collect_initializations + && !$context->collect_mutations + && ($context->mutation_free + || $context->external_mutation_free + || $codebase->find_unused_variables + || !$config->remember_property_assignments_after_call + || ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations)) + ) { + $must_use = true; + + $callmap_function_pure = $function_call_info->function_id && $function_call_info->in_call_map + ? $codebase->functions->isCallMapFunctionPure( + $codebase, + $statements_analyzer->node_data, + $function_call_info->function_id, + $stmt->isFirstClassCallable() ? [] : $stmt->getArgs(), + $must_use + ) + : null; + + if ((!$function_call_info->in_call_map + && $function_call_info->function_storage + && !$function_call_info->function_storage->pure + && !$function_call_info->function_storage->mutation_free) + || ($callmap_function_pure === false) + ) { + if ($context->mutation_free || $context->external_mutation_free) { + IssueBuffer::maybeAdd( + new ImpureFunctionCall( + 'Cannot call an impure function from a mutation-free context', + new CodeLocation($statements_analyzer, $function_name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + + if (!$config->remember_property_assignments_after_call) { + $context->removeMutableObjectVars(); + } + } elseif ($function_call_info->function_id + && (($function_call_info->function_storage + && $function_call_info->function_storage->pure + && !$function_call_info->function_storage->assertions + && $must_use) + || ($callmap_function_pure === true && $must_use)) + && $codebase->find_unused_variables + && !$context->inside_conditional + && !$context->inside_unset + ) { + /** + * If a function is pure, and has the return type of 'no-return', + * it's okay to dismiss it's return value. + */ + if (!$context->insideUse() + && !self::callUsesByReferenceArguments($function_call_info, $stmt) + && !( + $function_call_info->function_storage && + $function_call_info->function_storage->return_type && + $function_call_info->function_storage->return_type->isNever() + ) + ) { + IssueBuffer::maybeAdd( + new UnusedFunctionCall( + 'The call to ' . $function_call_info->function_id . ' is not used', + new CodeLocation($statements_analyzer, $function_name), + $function_call_info->function_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + $stmt->setAttribute('pure', true); + } + } + } + } + + private static function callUsesByReferenceArguments( + FunctionCallInfo $function_call_info, + PhpParser\Node\Expr\FuncCall $stmt + ): bool { + // If the function doesn't have any by-reference parameters + // we shouldn't look any further. + if (!$function_call_info->hasByReferenceParameters() || null === $function_call_info->function_params) { + return false; + } + + $parameters = $function_call_info->function_params; + + // If no arguments were passed + if (0 === count($stmt->getArgs())) { + return false; + } + + foreach ($stmt->getArgs() as $index => $argument) { + $parameter = null; + if (null !== $argument->name) { + $argument_name = $argument->name->toString(); + foreach ($parameters as $param) { + if ($param->name === $argument_name) { + $parameter = $param; + break; + } + } + } else { + $parameter = $parameters[$index] ?? null; + } + + if ($parameter && $parameter->by_ref) { + return true; + } + } + + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php new file mode 100644 index 00000000..61984a89 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php @@ -0,0 +1,87 @@ + + */ + public $defined_constants = []; + + /** + * @var array + */ + public $global_variables = []; + + /** + * @var ?array + */ + public $function_params; + + /** + * @var ?FunctionLikeStorage + */ + public $function_storage; + + /** + * @var ?PhpParser\Node\Name + */ + public $new_function_name; + + /** + * @var bool + */ + public $allow_named_args = true; + + /** + * @var array + */ + public $byref_uses = []; + + /** + * @mutation-free + */ + public function hasByReferenceParameters(): bool + { + if (null === $this->function_params) { + return false; + } + + foreach ($this->function_params as $value) { + if ($value->by_ref) { + return true; + } + } + + return false; + } +} 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 new file mode 100644 index 00000000..a843e945 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php @@ -0,0 +1,861 @@ +config; + + if ($stmt->isFirstClassCallable()) { + $candidate_callable = CallableTypeComparator::getCallableFromAtomic( + $codebase, + new TLiteralString($function_id), + null, + $statements_analyzer, + true + ); + + if ($candidate_callable) { + $stmt_type = new Union([new TClosure( + 'Closure', + $candidate_callable->params, + $candidate_callable->return_type, + $candidate_callable->is_pure + )]); + } else { + $stmt_type = Type::getClosure(); + } + } elseif ($codebase->functions->return_type_provider->has($function_id)) { + $stmt_type = $codebase->functions->return_type_provider->getReturnType( + $statements_analyzer, + $function_id, + $stmt, + $context, + new CodeLocation($statements_analyzer->getSource(), $function_name) + ); + } + + if (!$stmt_type) { + if (!$in_call_map || $is_stubbed) { + if ($function_storage && $function_storage->template_types) { + foreach ($function_storage->template_types as $template_name => $_) { + if (!isset($template_result->lower_bounds[$template_name])) { + if ($template_name === 'TFunctionArgCount') { + $template_result->lower_bounds[$template_name] = [ + 'fn-' . $function_id => [ + new TemplateBound( + Type::getInt(false, count($stmt->getArgs())) + ) + ] + ]; + } elseif ($template_name === 'TPhpMajorVersion') { + $template_result->lower_bounds[$template_name] = [ + 'fn-' . $function_id => [ + new TemplateBound( + Type::getInt(false, $codebase->php_major_version) + ) + ] + ]; + } elseif ($template_name === 'TPhpVersionId') { + $template_result->lower_bounds[$template_name] = [ + 'fn-' . $function_id => [ + new TemplateBound( + Type::getInt( + false, + 10000 * $codebase->php_major_version + + 100 * $codebase->php_minor_version + ) + ) + ] + ]; + } else { + $template_result->lower_bounds[$template_name] = [ + 'fn-' . $function_id => [ + new TemplateBound( + Type::getEmpty() + ) + ] + ]; + } + } + } + } + + if ($function_storage && !$context->isSuppressingExceptions($statements_analyzer)) { + $context->mergeFunctionExceptions( + $function_storage, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ); + } + + try { + if ($function_storage && $function_storage->return_type) { + $return_type = clone $function_storage->return_type; + + if ($template_result->lower_bounds && $function_storage->template_types) { + $return_type = TypeExpander::expandUnion( + $codebase, + $return_type, + null, + null, + null + ); + + TemplateInferredTypeReplacer::replace( + $return_type, + $template_result, + $codebase + ); + } + + $return_type = TypeExpander::expandUnion( + $codebase, + $return_type, + null, + null, + null, + true, + false, + false, + true + ); + + $return_type_location = $function_storage->return_type_location; + + $event = new AfterFunctionCallAnalysisEvent( + $stmt, + $function_id, + $context, + $statements_analyzer->getSource(), + $codebase, + $return_type, + [] + ); + + $config->eventDispatcher->dispatchAfterFunctionCallAnalysis($event); + $file_manipulations = $event->getFileReplacements(); + + if ($file_manipulations) { + FileManipulationBuffer::add( + $statements_analyzer->getFilePath(), + $file_manipulations + ); + } + + $stmt_type = $return_type; + $return_type->by_ref = $function_storage->returns_by_ref; + + // only check the type locally if it's defined externally + if ($return_type_location && + !$is_stubbed && // makes lookups or array_* functions quicker + !$config->isInProjectDirs($return_type_location->file_path) + ) { + $return_type->check( + $statements_analyzer, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues(), + $context->phantom_classes, + true, + false, + false, + $context->calling_method_id + ); + } + } + } catch (InvalidArgumentException $e) { + // this can happen when the function was defined in the Config startup script + $stmt_type = Type::getMixed(); + } + } else { + if (!$callmap_callable) { + throw new UnexpectedValueException('We should have a callmap callable here'); + } + + $stmt_type = self::getReturnTypeFromCallMapWithArgs( + $statements_analyzer, + $function_id, + $stmt->getArgs(), + $callmap_callable, + $context + ); + } + } + + if (!$stmt_type) { + $stmt_type = Type::getMixed(); + } + + if (!$statements_analyzer->data_flow_graph || !$function_storage) { + return $stmt_type; + } + + $return_node = self::taintReturnType( + $statements_analyzer, + $stmt, + $function_id, + $function_storage, + $stmt_type, + $template_result, + $context + ); + + if ($function_storage->proxy_calls !== null) { + foreach ($function_storage->proxy_calls as $proxy_call) { + $fake_call_arguments = []; + foreach ($proxy_call['params'] as $i) { + $fake_call_arguments[] = $stmt->getArgs()[$i]; + } + + $fake_call_factory = new BuilderFactory(); + + if (strpos($proxy_call['fqn'], '::') !== false) { + [$fqcn, $method] = explode('::', $proxy_call['fqn']); + $fake_call = $fake_call_factory->staticCall($fqcn, $method, $fake_call_arguments); + } else { + $fake_call = $fake_call_factory->funcCall($proxy_call['fqn'], $fake_call_arguments); + } + + $old_node_data = $statements_analyzer->node_data; + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + ExpressionAnalyzer::analyze($statements_analyzer, $fake_call, $context); + + $statements_analyzer->node_data = $old_node_data; + + if ($return_node && $proxy_call['return']) { + $fake_call_type = $statements_analyzer->node_data->getType($fake_call); + if (null !== $fake_call_type) { + foreach ($fake_call_type->parent_nodes as $fake_call_node) { + $statements_analyzer->data_flow_graph->addPath($fake_call_node, $return_node, 'return'); + } + } + } + } + } + + return $stmt_type; + } + + /** + * @param list $call_args + */ + private static function getReturnTypeFromCallMapWithArgs( + StatementsAnalyzer $statements_analyzer, + string $function_id, + array $call_args, + TCallable $callmap_callable, + Context $context + ): Union { + $call_map_key = strtolower($function_id); + + $codebase = $statements_analyzer->getCodebase(); + + if (!$call_args) { + switch ($call_map_key) { + case 'hrtime': + $keyed_array = new TKeyedArray([ + Type::getInt(), + Type::getInt() + ]); + $keyed_array->sealed = true; + $keyed_array->is_list = true; + return new Union([$keyed_array]); + + case 'get_called_class': + return new Union([ + new TClassString( + $context->self ?: 'object', + $context->self ? new TNamedObject($context->self, true) : null + ) + ]); + + case 'get_parent_class': + if ($context->self && $codebase->classExists($context->self)) { + $classlike_storage = $codebase->classlike_storage_provider->get($context->self); + + if ($classlike_storage->parent_classes) { + return new Union([ + new TClassString( + array_values($classlike_storage->parent_classes)[0] + ) + ]); + } + } + } + } else { + switch ($call_map_key) { + case 'count': + if (($first_arg_type = $statements_analyzer->node_data->getType($call_args[0]->value))) { + $atomic_types = $first_arg_type->getAtomicTypes(); + + if (count($atomic_types) === 1) { + if (isset($atomic_types['array'])) { + if ($atomic_types['array'] instanceof TCallableArray + || $atomic_types['array'] instanceof TCallableList + || $atomic_types['array'] instanceof TCallableKeyedArray + ) { + return Type::getInt(false, 2); + } + + if ($atomic_types['array'] instanceof TNonEmptyArray) { + return new Union([ + $atomic_types['array']->count !== null + ? new TLiteralInt($atomic_types['array']->count) + : new TPositiveInt + ]); + } + + if ($atomic_types['array'] instanceof TNonEmptyList) { + return new Union([ + $atomic_types['array']->count !== null + ? new TLiteralInt($atomic_types['array']->count) + : new TPositiveInt + ]); + } + + if ($atomic_types['array'] instanceof TKeyedArray) { + $min = 0; + $max = 0; + foreach ($atomic_types['array']->properties as $property) { + // empty, never and possibly undefined can't count for min value + if (!$property->possibly_undefined + && !$property->isEmpty() + && !$property->isNever() + ) { + $min++; + } + + //empty and never can't count for max value because we know keys are undefined + if (!$property->isEmpty() && !$property->isNever()) { + $max++; + } + } + + if ($atomic_types['array']->sealed) { + //the KeyedArray is sealed, we can use the min and max + if ($min === $max) { + return new Union([new TLiteralInt($max)]); + } + + return new Union([new TIntRange($min, $max)]); + } + + //the type is not sealed, we can only use the min + return new Union([new TIntRange($min, null)]); + } + + if ($atomic_types['array'] instanceof TArray + && $atomic_types['array']->type_params[0]->isEmpty() + && $atomic_types['array']->type_params[1]->isEmpty() + ) { + return Type::getInt(false, 0); + } + + return new Union([ + new TLiteralInt(0), + new TPositiveInt + ]); + } + } + } + + break; + + case 'hrtime': + if (($first_arg_type = $statements_analyzer->node_data->getType($call_args[0]->value))) { + if ((string) $first_arg_type === 'true') { + $int = Type::getInt(); + $int->from_calculation = true; + return $int; + } + + $keyed_array = new TKeyedArray([ + Type::getInt(), + Type::getInt() + ]); + $keyed_array->sealed = true; + $keyed_array->is_list = true; + + if ((string) $first_arg_type === 'false') { + return new Union([$keyed_array]); + } + + return new Union([ + $keyed_array, + new TInt() + ]); + } + + $int = Type::getInt(); + $int->from_calculation = true; + return $int; + + case 'min': + case 'max': + if (isset($call_args[0])) { + $first_arg = $call_args[0]->value; + + if ($first_arg_type = $statements_analyzer->node_data->getType($first_arg)) { + if ($first_arg_type->hasArray()) { + /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ + $array_type = $first_arg_type->getAtomicTypes()['array']; + if ($array_type instanceof TKeyedArray) { + return $array_type->getGenericValueType(); + } + + if ($array_type instanceof TArray) { + return clone $array_type->type_params[1]; + } + + if ($array_type instanceof TList) { + return clone $array_type->type_param; + } + } elseif ($first_arg_type->hasScalarType() + && ($second_arg = ($call_args[1]->value ?? null)) + && ($second_arg_type = $statements_analyzer->node_data->getType($second_arg)) + && $second_arg_type->hasScalarType() + ) { + return Type::combineUnionTypes($first_arg_type, $second_arg_type); + } + } + } + + break; + + case 'get_parent_class': + // this is unreliable, as it's hard to know exactly what's wanted - attempted this in + // https://github.com/vimeo/psalm/commit/355ed831e1c69c96bbf9bf2654ef64786cbe9fd7 + // but caused problems where it didn’t know exactly what level of child we + // were receiving. + // + // Really this should only work on instances we've created with new Foo(), + // but that requires more work + break; + + case 'fgetcsv': + $string_type = Type::getString(); + $string_type->addType(new TNull); + $string_type->ignore_nullable_issues = true; + + $call_map_return_type = new Union([ + new TNonEmptyList( + $string_type + ), + new TFalse, + new TNull + ]); + + if ($codebase->config->ignore_internal_nullable_issues) { + $call_map_return_type->ignore_nullable_issues = true; + } + + if ($codebase->config->ignore_internal_falsable_issues) { + $call_map_return_type->ignore_falsable_issues = true; + } + + return $call_map_return_type; + case 'mb_strtolower': + if (count($call_args) < 2) { + return Type::getLowercaseString(); + } else { + $second_arg_type = $statements_analyzer->node_data->getType($call_args[1]->value); + if ($second_arg_type && $second_arg_type->isNull()) { + return Type::getLowercaseString(); + } + } + return Type::getString(); + } + } + + $stmt_type = $callmap_callable->return_type + ? clone $callmap_callable->return_type + : Type::getMixed(); + + switch ($function_id) { + case 'mb_strpos': + case 'mb_strrpos': + case 'mb_stripos': + case 'mb_strripos': + case 'strpos': + case 'strrpos': + case 'stripos': + case 'strripos': + case 'strstr': + case 'stristr': + case 'strrchr': + case 'strpbrk': + case 'array_search': + break; + + default: + if ($stmt_type->isFalsable() + && $codebase->config->ignore_internal_falsable_issues + ) { + $stmt_type->ignore_falsable_issues = true; + } + } + + return $stmt_type; + } + + private static function taintReturnType( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\FuncCall $stmt, + string $function_id, + FunctionLikeStorage $function_storage, + Union $stmt_type, + TemplateResult $template_result, + Context $context + ): ?DataFlowNode { + if (!$statements_analyzer->data_flow_graph) { + return null; + } + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + return null; + } + + $codebase = $statements_analyzer->getCodebase(); + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + $node_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + $function_call_node = DataFlowNode::getForMethodReturn( + $function_id, + $function_id, + $statements_analyzer->data_flow_graph instanceof TaintFlowGraph + ? ($function_storage->signature_return_type_location ?: $function_storage->location) + : ($function_storage->return_type_location ?: $function_storage->location), + $function_storage->specialize_call ? $node_location : null + ); + + $statements_analyzer->data_flow_graph->addNode($function_call_node); + + $codebase = $statements_analyzer->getCodebase(); + + $conditionally_removed_taints = []; + + foreach ($function_storage->conditionally_removed_taints as $conditionally_removed_taint) { + $conditionally_removed_taint = clone $conditionally_removed_taint; + + TemplateInferredTypeReplacer::replace( + $conditionally_removed_taint, + $template_result, + $codebase + ); + + $expanded_type = TypeExpander::expandUnion( + $statements_analyzer->getCodebase(), + $conditionally_removed_taint, + null, + null, + null, + true, + true + ); + + if (!$expanded_type->isNullable()) { + foreach ($expanded_type->getLiteralStrings() as $literal_string) { + $conditionally_removed_taints[] = $literal_string->value; + } + } + } + + if ($conditionally_removed_taints && $function_storage->location) { + $assignment_node = DataFlowNode::getForAssignment( + $function_id . '-escaped', + $function_storage->signature_return_type_location ?: $function_storage->location, + $function_call_node->specialization_key + ); + + $statements_analyzer->data_flow_graph->addPath( + $function_call_node, + $assignment_node, + 'conditionally-escaped', + $added_taints, + array_merge($removed_taints, $conditionally_removed_taints) + ); + + $stmt_type->parent_nodes[$assignment_node->id] = $assignment_node; + } else { + $stmt_type->parent_nodes[$function_call_node->id] = $function_call_node; + } + + if ($function_storage->return_source_params + && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph + ) { + $removed_taints = $function_storage->removed_taints; + + if ($function_id === 'preg_replace' && count($stmt->getArgs()) > 2) { + $first_stmt_type = $statements_analyzer->node_data->getType($stmt->getArgs()[0]->value); + $second_stmt_type = $statements_analyzer->node_data->getType($stmt->getArgs()[1]->value); + + if ($first_stmt_type + && $second_stmt_type + && $first_stmt_type->isSingleStringLiteral() + && $second_stmt_type->isSingleStringLiteral() + ) { + $first_arg_value = $first_stmt_type->getSingleStringLiteral()->value; + + $pattern = substr($first_arg_value, 1, -1); + + if ($pattern[0] === '[' + && $pattern[1] === '^' + && substr($pattern, -1) === ']' + ) { + $pattern = substr($pattern, 2, -1); + + if (self::simpleExclusion($pattern, $first_arg_value[0])) { + $removed_taints[] = 'html'; + $removed_taints[] = 'has_quotes'; + $removed_taints[] = 'sql'; + } + } + } + } + + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = array_merge( + $removed_taints, + $codebase->config->eventDispatcher->dispatchRemoveTaints($event) + ); + + self::taintUsingFlows( + $statements_analyzer, + $function_storage, + $statements_analyzer->data_flow_graph, + $function_id, + $stmt->getArgs(), + $node_location, + $function_call_node, + $removed_taints, + $added_taints + ); + } + + if ($function_storage->taint_source_types && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { + $method_node = TaintSource::getForMethodReturn( + $function_id, + $function_id, + $node_location + ); + + $method_node->taints = $function_storage->taint_source_types; + + $statements_analyzer->data_flow_graph->addSource($method_node); + } + + return $function_call_node; + } + + /** + * @param array $args + * @param array $removed_taints + * @param array $added_taints + */ + public static function taintUsingFlows( + StatementsAnalyzer $statements_analyzer, + FunctionLikeStorage $function_storage, + TaintFlowGraph $graph, + string $function_id, + array $args, + CodeLocation $node_location, + DataFlowNode $function_call_node, + array $removed_taints, + array $added_taints = [] + ): void { + foreach ($function_storage->return_source_params as $i => $path_type) { + if (!isset($args[$i])) { + continue; + } + + $current_arg_is_variadic = $function_storage->params[$i]->is_variadic; + $taintable_arg_index = [$i]; + + if ($current_arg_is_variadic) { + $max_params = count($args) - 1; + for ($arg_index = $i + 1; $arg_index <= $max_params; $arg_index++) { + $taintable_arg_index[] = $arg_index; + } + } + + foreach ($taintable_arg_index as $arg_index) { + $arg_location = new CodeLocation( + $statements_analyzer, + $args[$arg_index]->value + ); + + $function_param_sink = DataFlowNode::getForMethodArgument( + $function_id, + $function_id, + $arg_index, + $arg_location, + $function_storage->specialize_call ? $node_location : null + ); + + $graph->addNode($function_param_sink); + + $graph->addPath( + $function_param_sink, + $function_call_node, + $path_type, + array_merge($added_taints, $function_storage->added_taints), + $removed_taints + ); + } + } + } + + /** + * @psalm-pure + */ + private static function simpleExclusion(string $pattern, string $escape_char): bool + { + $str_length = strlen($pattern); + + for ($i = 0; $i < $str_length; $i++) { + $current = $pattern[$i]; + $next = $pattern[$i + 1] ?? null; + + if ($current === '\\') { + if ($next === null + || $next === 'x' + || $next === 'u' + ) { + return false; + } + + if ($next === '.' + || $next === '(' + || $next === ')' + || $next === '[' + || $next === ']' + || $next === 's' + || $next === 'w' + || $next === $escape_char + ) { + $i++; + continue; + } + + return false; + } + + if ($next !== '-') { + if ($current === '_' + || $current === '-' + || $current === '|' + || $current === ':' + || $current === '#' + || $current === '.' + || $current === ' ' + ) { + continue; + } + + return false; + } + + if ($current === ']') { + return false; + } + + if (!isset($pattern[$i + 2])) { + return false; + } + + if (($current === 'a' && $pattern[$i + 2] === 'z') + || ($current === 'a' && $pattern[$i + 2] === 'Z') + || ($current === 'A' && $pattern[$i + 2] === 'Z') + || ($current === '0' && $pattern[$i + 2] === '9') + ) { + $i += 2; + continue; + } + + return false; + } + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php new file mode 100644 index 00000000..fe0c730e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php @@ -0,0 +1,22 @@ + */ + public $args; + + /** @param list $args */ + public function __construct(MethodIdentifier $method_id, array $args) + { + $this->method_id = $method_id; + $this->args = $args; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php new file mode 100644 index 00000000..e4d5d5e0 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php @@ -0,0 +1,89 @@ + + */ + public $invalid_method_call_types = []; + + /** + * @var array + */ + public $existent_method_ids = []; + + /** + * @var array + */ + public $non_existent_class_method_ids = []; + + /** + * @var array + */ + public $non_existent_interface_method_ids = []; + + /** + * @var array + */ + public $non_existent_magic_method_ids = []; + + /** + * @var bool + */ + public $check_visibility = true; + + /** + * @var bool + */ + public $too_many_arguments = true; + + /** + * @var list + */ + public $too_many_arguments_method_ids = []; + + /** + * @var bool + */ + public $too_few_arguments = false; + + /** + * @var list + */ + public $too_few_arguments_method_ids = []; + + /** + * @var bool + */ + public $can_memoize = false; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php new file mode 100644 index 00000000..6183fe74 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php @@ -0,0 +1,890 @@ +as->isMixed() + ) { + $extra_types = $lhs_type_part->extra_types; + + $lhs_type_part = array_values( + $lhs_type_part->as->getAtomicTypes() + )[0]; + + $lhs_type_part->from_docblock = true; + + if ($lhs_type_part instanceof TNamedObject) { + $lhs_type_part->extra_types = $extra_types; + } elseif ($lhs_type_part instanceof TObject && $extra_types) { + $lhs_type_part = array_shift($extra_types); + if ($extra_types) { + $lhs_type_part->extra_types = $extra_types; + } + } + + $result->has_mixed_method_call = true; + } + + $source = $statements_analyzer->getSource(); + + if (!$lhs_type_part instanceof TNamedObject) { + self::handleInvalidClass( + $statements_analyzer, + $codebase, + $stmt, + $lhs_type, + $lhs_type_part, + $lhs_var_id, + $context, + $is_intersection, + $result + ); + + return; + } + + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); + } + + $result->has_valid_method_call_type = true; + + $fq_class_name = $lhs_type_part->value; + + $is_mock = ExpressionAnalyzer::isMock($fq_class_name); + + $result->has_mock = $result->has_mock || $is_mock; + + if ($fq_class_name === 'static') { + $fq_class_name = (string) $context->self; + } + + if ($is_mock || + $context->isPhantomClass($fq_class_name) + ) { + $result->return_type = Type::getMixed(); + + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ); + + return; + } + + if ($lhs_var_id === '$this') { + $does_class_exist = true; + } else { + $does_class_exist = ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $fq_class_name, + new CodeLocation($source, $stmt->var), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions(true, false, true, true, $lhs_type_part->from_docblock) + ); + } + + if (!$does_class_exist) { + return; + } + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $result->check_visibility = $result->check_visibility && !$class_storage->override_method_visibility; + + $intersection_types = $lhs_type_part->getIntersectionTypes(); + + if (!$stmt->name instanceof PhpParser\Node\Identifier) { + if (!$context->ignore_variable_method) { + $codebase->analyzer->addMixedMemberName( + strtolower($fq_class_name) . '::', + $context->calling_method_id ?: $statements_analyzer->getFileName() + ); + } + + if ($stmt->isFirstClassCallable()) { + $return_type_candidate = null; + $method_name_type = $statements_analyzer->node_data->getType($stmt->name); + if ($method_name_type && $method_name_type->isSingleStringLiteral()) { + $method_identifier = new MethodIdentifier( + $fq_class_name, + strtolower($method_name_type->getSingleStringLiteral()->value) + ); + //the call to methodExists will register that the method was called from somewhere + if ($codebase->methods->methodExists( + $method_identifier, + $context->calling_method_id, + null, + $statements_analyzer, + $statements_analyzer->getFilePath(), + true, + $context->insideUse() + )) { + $method_storage = $codebase->methods->getStorage($method_identifier); + + $return_type_candidate = new Union([new TClosure( + 'Closure', + $method_storage->params, + $method_storage->return_type, + $method_storage->pure + )]); + } + } + + $statements_analyzer->node_data->setType($stmt, $return_type_candidate ?? Type::getClosure()); + + + return; + } + + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ); + + $result->return_type = Type::getMixed(); + return; + } + + $method_name_lc = strtolower($stmt->name->name); + + $method_id = new MethodIdentifier($fq_class_name, $method_name_lc); + + $args = $stmt->isFirstClassCallable() ? [] : $stmt->getArgs(); + + $naive_method_id = $method_id; + + // this tells us whether or not we can stay on the happy path + $naive_method_exists = $codebase->methods->methodExists( + $method_id, + $context->calling_method_id, + $codebase->collect_locations + ? new CodeLocation($source, $stmt->name) + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $statements_analyzer + : null, + $statements_analyzer->getFilePath(), + false, + $context->insideUse() + ); + + $fake_method_exists = false; + + if (!$naive_method_exists) { + // if the method doesn't exist we check for any method existence providers + if ($codebase->methods->existence_provider->has($fq_class_name)) { + $method_exists = $codebase->methods->existence_provider->doesMethodExist( + $fq_class_name, + $method_id->method_name, + $source, + null + ); + + if ($method_exists) { + $fake_method_exists = true; + } + } + + $naive_method_exists = false; + + // @mixin attributes are an absolute pain! Lots of complexity here, + // as they can redefine the called class, method id etc. + if ($class_storage->templatedMixins + && $lhs_type_part instanceof TGenericObject + && $class_storage->template_types + ) { + [$lhs_type_part, $class_storage, $naive_method_exists, $method_id, $fq_class_name] + = self::handleTemplatedMixins( + $class_storage, + $lhs_type_part, + $method_name_lc, + $codebase, + $context, + $method_id, + $source, + $stmt, + $statements_analyzer, + $fq_class_name + ); + } elseif ($class_storage->mixin_declaring_fqcln + && $class_storage->namedMixins + ) { + [$lhs_type_part, $class_storage, $naive_method_exists, $method_id, $fq_class_name] + = self::handleRegularMixins( + $class_storage, + $lhs_type_part, + $method_name_lc, + $codebase, + $context, + $method_id, + $source, + $stmt, + $statements_analyzer, + $fq_class_name, + $lhs_var_id + ); + } + } + + $all_intersection_return_type = null; + $all_intersection_existent_method_ids = []; + + // insersection types are also fun, they also complicate matters + if ($intersection_types) { + [$all_intersection_return_type, $all_intersection_existent_method_ids] + = self::getIntersectionReturnType( + $statements_analyzer, + $stmt, + $codebase, + $context, + $lhs_type, + $lhs_type_part, + $lhs_var_id, + $result, + $intersection_types + ); + } + + if (($fake_method_exists + && $codebase->methods->methodExists(new MethodIdentifier($fq_class_name, '__call'))) + || !$naive_method_exists + || !MethodAnalyzer::isMethodVisible( + $method_id, + $context, + $statements_analyzer->getSource() + ) + ) { + $interface_has_method = false; + + if ($class_storage->abstract && $class_storage->class_implements) { + foreach ($class_storage->class_implements as $interface_fqcln_lc => $_) { + $interface_storage = $codebase->classlike_storage_provider->get($interface_fqcln_lc); + + if (isset($interface_storage->methods[$method_name_lc])) { + $interface_has_method = true; + $fq_class_name = $interface_storage->name; + $method_id = new MethodIdentifier( + $fq_class_name, + $method_name_lc + ); + break; + } + } + } + + if (!$interface_has_method + && $codebase->methods->methodExists( + new MethodIdentifier($fq_class_name, '__call'), + $context->calling_method_id, + $codebase->collect_locations + ? new CodeLocation($source, $stmt->name) + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $statements_analyzer + : null, + $statements_analyzer->getFilePath(), + true, + $context->insideUse() + ) + ) { + $new_call_context = MissingMethodCallHandler::handleMagicMethod( + $statements_analyzer, + $codebase, + $stmt, + $method_id, + $class_storage, + $context, + $codebase->config, + $all_intersection_return_type, + $result, + $lhs_type_part + ); + + if ($new_call_context) { + if ($method_id === $new_call_context->method_id) { + return; + } + + $method_id = $new_call_context->method_id; + $args = $new_call_context->args; + } else { + return; + } + } + } + + $intersection_method_id = $intersection_types + ? '(' . $lhs_type_part . ')' . '::' . $stmt->name->name + : null; + $cased_method_id = $fq_class_name . '::' . $stmt->name->name; + + if ($lhs_var_id === '$this' + && $context->self + && $fq_class_name !== $context->self + && $codebase->methods->methodExists( + new MethodIdentifier($context->self, $method_name_lc) + ) + ) { + $method_id = new MethodIdentifier($context->self, $method_name_lc); + $cased_method_id = $context->self . '::' . $stmt->name->name; + $fq_class_name = $context->self; + } + + $source_method_id = $source instanceof FunctionLikeAnalyzer + ? $source->getId() + : null; + + $corrected_method_exists = ($naive_method_exists && $method_id === $naive_method_id) + || ($method_id !== $naive_method_id + && $codebase->methods->methodExists( + $method_id, + $context->calling_method_id, + $codebase->collect_locations && $method_id !== $source_method_id + ? new CodeLocation($source, $stmt->name) + : null + )); + + if (!$corrected_method_exists + || ($codebase->config->use_phpdoc_method_without_magic_or_parent + && isset($class_storage->pseudo_methods[$method_name_lc])) + ) { + MissingMethodCallHandler::handleMissingOrMagicMethod( + $statements_analyzer, + $codebase, + $stmt, + $method_id, + $codebase->interfaceExists($fq_class_name), + $context, + $codebase->config, + $all_intersection_return_type, + $all_intersection_existent_method_ids, + $intersection_method_id, + $cased_method_id, + $result, + $lhs_type_part + ); + + return; + } + + $old_node_data = $statements_analyzer->node_data; + + $return_type_candidate = ExistingAtomicMethodCallAnalyzer::analyze( + $statements_analyzer, + $stmt, + $stmt->name, + $args, + $codebase, + $context, + $lhs_type_part, + $static_type, + $lhs_var_id, + $method_id, + $result + ); + + $statements_analyzer->node_data = $old_node_data; + + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + $in_call_map = InternalCallMapHandler::inCallMap((string) ($declaring_method_id ?? $method_id)); + + if (!$in_call_map) { + if ($result->check_visibility) { + $name_code_location = new CodeLocation($statements_analyzer, $stmt->name); + + MethodVisibilityAnalyzer::analyze( + $method_id, + $context, + $statements_analyzer->getSource(), + $name_code_location, + $statements_analyzer->getSuppressedIssues() + ); + } + } + + self::updateResultReturnType( + $result, + $return_type_candidate, + $all_intersection_return_type, + $codebase + ); + } + + /** + * @param TNamedObject|TTemplateParam $lhs_type_part + * @param array $intersection_types + * + * @return array{?Union, array} + */ + private static function getIntersectionReturnType( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\MethodCall $stmt, + Codebase $codebase, + Context $context, + Union $lhs_type, + Atomic $lhs_type_part, + ?string $lhs_var_id, + AtomicMethodCallAnalysisResult $result, + array $intersection_types + ): array { + $all_intersection_return_type = null; + $all_intersection_existent_method_ids = []; + + foreach ($intersection_types as $intersection_type) { + $intersection_result = clone $result; + + /** @var ?Union $intersection_result->return_type */ + $intersection_result->return_type = null; + + self::analyze( + $statements_analyzer, + $stmt, + $codebase, + $context, + $lhs_type, + $intersection_type, + $lhs_type_part, + true, + $lhs_var_id, + $intersection_result + ); + + $result->returns_by_ref = $intersection_result->returns_by_ref; + $result->has_mock = $intersection_result->has_mock; + $result->has_valid_method_call_type = $intersection_result->has_valid_method_call_type; + $result->has_mixed_method_call = $intersection_result->has_mixed_method_call; + $result->invalid_method_call_types = $intersection_result->invalid_method_call_types; + $result->check_visibility = $intersection_result->check_visibility; + $result->too_many_arguments = $intersection_result->too_many_arguments; + + $all_intersection_existent_method_ids = array_merge( + $all_intersection_existent_method_ids, + $intersection_result->existent_method_ids + ); + + if ($intersection_result->return_type) { + if (!$all_intersection_return_type || $all_intersection_return_type->isMixed()) { + $all_intersection_return_type = $intersection_result->return_type; + } else { + $all_intersection_return_type = Type::intersectUnionTypes( + $all_intersection_return_type, + $intersection_result->return_type, + $codebase + ) ?? Type::getMixed(); + } + } + } + + return [$all_intersection_return_type, $all_intersection_existent_method_ids]; + } + + private static function updateResultReturnType( + AtomicMethodCallAnalysisResult $result, + Union $return_type_candidate, + ?Union $all_intersection_return_type, + Codebase $codebase + ): void { + if ($all_intersection_return_type) { + $return_type_candidate = Type::intersectUnionTypes( + $all_intersection_return_type, + $return_type_candidate, + $codebase + ) ?? Type::getMixed(); + } + + $result->return_type = Type::combineUnionTypes($return_type_candidate, $result->return_type); + } + + private static function handleInvalidClass( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\MethodCall $stmt, + Union $lhs_type, + Atomic $lhs_type_part, + ?string $lhs_var_id, + Context $context, + bool $is_intersection, + AtomicMethodCallAnalysisResult $result + ): void { + switch (get_class($lhs_type_part)) { + case TNull::class: + case TFalse::class: + // handled above + return; + + case TTemplateParam::class: + case TEmptyMixed::class: + case TEmpty::class: + case TMixed::class: + case TNonEmptyMixed::class: + case TObject::class: + case TObjectWithProperties::class: + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + $result->has_mixed_method_call = true; + + if ($lhs_type_part instanceof TObjectWithProperties + && $stmt->name instanceof PhpParser\Node\Identifier + && isset($lhs_type_part->methods[$stmt->name->name]) + ) { + $result->existent_method_ids[] = $lhs_type_part->methods[$stmt->name->name]; + } elseif (!$is_intersection) { + if ($stmt->name instanceof PhpParser\Node\Identifier) { + $codebase->analyzer->addMixedMemberName( + strtolower($stmt->name->name), + $context->calling_method_id ?: $statements_analyzer->getFileName() + ); + } + + if ($context->check_methods) { + $message = 'Cannot determine the type of the object' + . ' on the left hand side of this expression'; + + if ($lhs_var_id) { + $message = 'Cannot determine the type of ' . $lhs_var_id; + + if ($stmt->name instanceof PhpParser\Node\Identifier) { + $message .= ' when calling method ' . $stmt->name->name; + } + } + + $origin_locations = []; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + foreach ($lhs_type->parent_nodes as $parent_node) { + $origin_locations = array_merge( + $origin_locations, + $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) + ); + } + } + + $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; + + $name_code_location = new CodeLocation($statements_analyzer, $stmt->name); + + if ($origin_location && $origin_location->getHash() === $name_code_location->getHash()) { + $origin_location = null; + } + + IssueBuffer::maybeAdd( + new MixedMethodCall( + $message, + $name_code_location, + $origin_location + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ) === false) { + return; + } + + $result->return_type = Type::getMixed(); + return; + + default: + $result->invalid_method_call_types[] = (string)$lhs_type_part; + return; + } + } + + /** + * @param lowercase-string $method_name_lc + * @return array{TNamedObject, ClassLikeStorage, bool, MethodIdentifier, string} + */ + private static function handleTemplatedMixins( + ClassLikeStorage $class_storage, + TNamedObject $lhs_type_part, + string $method_name_lc, + Codebase $codebase, + Context $context, + MethodIdentifier $method_id, + StatementsSource $source, + PhpParser\Node\Expr\MethodCall $stmt, + StatementsAnalyzer $statements_analyzer, + string $fq_class_name + ): array { + $naive_method_exists = false; + + if ($class_storage->templatedMixins + && $lhs_type_part instanceof TGenericObject + && $class_storage->template_types + ) { + $template_type_keys = array_keys($class_storage->template_types); + + foreach ($class_storage->templatedMixins as $mixin) { + $param_position = array_search( + $mixin->param_name, + $template_type_keys + ); + + if ($param_position !== false + && isset($lhs_type_part->type_params[$param_position]) + ) { + $current_type_param = $lhs_type_part->type_params[$param_position]; + if ($current_type_param->isSingle()) { + $lhs_type_part_new = array_values( + $current_type_param->getAtomicTypes() + )[0]; + + if ($lhs_type_part_new instanceof TNamedObject) { + $new_method_id = new MethodIdentifier( + $lhs_type_part_new->value, + $method_name_lc + ); + + $mixin_class_storage = $codebase->classlike_storage_provider->get( + $lhs_type_part_new->value + ); + + if ($codebase->methods->methodExists( + $new_method_id, + $context->calling_method_id, + $codebase->collect_locations + ? new CodeLocation($source, $stmt->name) + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $statements_analyzer + : null, + $statements_analyzer->getFilePath(), + true, + $context->insideUse() + )) { + $lhs_type_part = clone $lhs_type_part_new; + $class_storage = $mixin_class_storage; + + $naive_method_exists = true; + $method_id = $new_method_id; + } elseif (isset($mixin_class_storage->pseudo_methods[$method_name_lc])) { + $lhs_type_part = clone $lhs_type_part_new; + $class_storage = $mixin_class_storage; + $method_id = $new_method_id; + } + } + } + } + } + } + + return [ + $lhs_type_part, + $class_storage, + $naive_method_exists, + $method_id, + $fq_class_name + ]; + } + + /** + * @param lowercase-string $method_name_lc + * @return array{TNamedObject, ClassLikeStorage, bool, MethodIdentifier, string} + */ + private static function handleRegularMixins( + ClassLikeStorage $class_storage, + TNamedObject $lhs_type_part, + string $method_name_lc, + Codebase $codebase, + Context $context, + MethodIdentifier $method_id, + StatementsSource $source, + PhpParser\Node\Expr\MethodCall $stmt, + StatementsAnalyzer $statements_analyzer, + string $fq_class_name, + ?string $lhs_var_id + ): array { + $naive_method_exists = false; + + foreach ($class_storage->namedMixins as $mixin) { + if (!$class_storage->mixin_declaring_fqcln) { + continue; + } + + $new_method_id = new MethodIdentifier( + $mixin->value, + $method_name_lc + ); + + if ($codebase->methods->methodExists( + $new_method_id, + $context->calling_method_id, + $codebase->collect_locations + ? new CodeLocation($source, $stmt->name) + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $statements_analyzer + : null, + $statements_analyzer->getFilePath(), + true, + $context->insideUse() + )) { + $mixin_declaring_class_storage = $codebase->classlike_storage_provider->get( + $class_storage->mixin_declaring_fqcln + ); + + $mixin_class_template_params = ClassTemplateParamCollector::collect( + $codebase, + $mixin_declaring_class_storage, + $codebase->classlike_storage_provider->get($fq_class_name), + null, + $lhs_type_part, + $lhs_var_id === '$this' + ); + + $lhs_type_part = clone $mixin; + + $lhs_type_part->replaceTemplateTypesWithArgTypes( + new TemplateResult([], $mixin_class_template_params ?: []), + $codebase + ); + + $lhs_type_expanded = TypeExpander::expandUnion( + $codebase, + new Union([$lhs_type_part]), + $mixin_declaring_class_storage->name, + $fq_class_name, + $class_storage->parent_class, + true, + false, + $class_storage->final + ); + + $new_lhs_type_part = $lhs_type_expanded->getSingleAtomic(); + + if ($new_lhs_type_part instanceof TNamedObject) { + $lhs_type_part = $new_lhs_type_part; + } + + $mixin_class_storage = $codebase->classlike_storage_provider->get($mixin->value); + + $fq_class_name = $mixin_class_storage->name; + $mixin_class_storage->mixin_declaring_fqcln = $class_storage->mixin_declaring_fqcln; + $class_storage = $mixin_class_storage; + $naive_method_exists = true; + $method_id = $new_method_id; + } + } + + return [ + $lhs_type_part, + $class_storage, + $naive_method_exists, + $method_id, + $fq_class_name + ]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php new file mode 100644 index 00000000..6dee09a6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php @@ -0,0 +1,673 @@ + $args + */ + public static function analyze( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\MethodCall $stmt, + PhpParser\Node\Identifier $stmt_name, + array $args, + Codebase $codebase, + Context $context, + TNamedObject $lhs_type_part, + ?Atomic $static_type, + ?string $lhs_var_id, + MethodIdentifier $method_id, + AtomicMethodCallAnalysisResult $result + ): Union { + $config = $codebase->config; + + $fq_class_name = $lhs_type_part->value; + + if ($fq_class_name === 'static') { + $fq_class_name = (string) $context->self; + } + + $method_name_lc = $method_id->method_name; + + $cased_method_id = $fq_class_name . '::' . $stmt_name->name; + + $result->existent_method_ids[] = $method_id->__toString(); + + if ($context->collect_initializations && $context->calling_method_id) { + [$calling_method_class] = explode('::', $context->calling_method_id); + $codebase->file_reference_provider->addMethodReferenceToClassMember( + $calling_method_class . '::__construct', + strtolower((string) $method_id), + false + ); + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + ArgumentMapPopulator::recordArgumentPositions( + $statements_analyzer, + $stmt, + $codebase, + (string) $method_id + ); + } + + if ($fq_class_name === 'Closure' && $method_name_lc === '__invoke') { + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $fake_function_call = new VirtualFuncCall( + $stmt->var, + $args, + $stmt->getAttributes() + ); + + FunctionCallAnalyzer::analyze( + $statements_analyzer, + $fake_function_call, + $context + ); + + return $statements_analyzer->node_data->getType($fake_function_call) ?? Type::getMixed(); + } + + $source = $statements_analyzer->getSource(); + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt_name, + $method_id . '()' + ); + } + + if ($context->collect_initializations && $context->calling_method_id) { + [$calling_method_class] = explode('::', $context->calling_method_id); + $codebase->file_reference_provider->addMethodReferenceToClassMember( + $calling_method_class . '::__construct', + strtolower((string) $method_id), + false + ); + } + + if ($stmt->var instanceof PhpParser\Node\Expr\Variable + && ($context->collect_initializations || $context->collect_mutations) + && $stmt->var->name === 'this' + && $source instanceof FunctionLikeAnalyzer + ) { + self::collectSpecialInformation($source, $stmt_name->name, $context); + } + + $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $parent_source = $statements_analyzer->getSource(); + + $class_template_params = ClassTemplateParamCollector::collect( + $codebase, + $codebase->methods->getClassLikeStorageForMethod($method_id), + $class_storage, + $method_name_lc, + $lhs_type_part, + $lhs_var_id === '$this' + ); + + if ($lhs_var_id === '$this' && $parent_source instanceof FunctionLikeAnalyzer) { + $grandparent_source = $parent_source->getSource(); + + if ($grandparent_source instanceof TraitAnalyzer) { + $fq_trait_name = $grandparent_source->getFQCLN(); + + $fq_trait_name_lc = strtolower($fq_trait_name); + + $trait_storage = $codebase->classlike_storage_provider->get($fq_trait_name_lc); + + if (isset($trait_storage->methods[$method_name_lc])) { + $trait_method_id = new MethodIdentifier($trait_storage->name, $method_name_lc); + + $class_template_params = ClassTemplateParamCollector::collect( + $codebase, + $codebase->methods->getClassLikeStorageForMethod($trait_method_id), + $class_storage, + $method_name_lc, + $lhs_type_part, + true + ); + } + } + } + + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + try { + $method_storage = $codebase->methods->getStorage($declaring_method_id ?? $method_id); + } catch (UnexpectedValueException $e) { + $method_storage = null; + } + + $method_template_params = []; + + if ($method_storage && $method_storage->if_this_is_type) { + $method_template_result = new TemplateResult($method_storage->template_types ?: [], []); + + TemplateStandinTypeReplacer::replace( + clone $method_storage->if_this_is_type, + $method_template_result, + $codebase, + null, + new Union([$lhs_type_part]) + ); + + $method_template_params = $method_template_result->lower_bounds; + } + + $template_result = new TemplateResult([], $class_template_params ?: []); + $template_result->lower_bounds += $method_template_params; + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + ArgumentMapPopulator::recordArgumentPositions( + $statements_analyzer, + $stmt, + $codebase, + (string) $method_id + ); + } + + $is_first_class_callable = $stmt->isFirstClassCallable(); + + if (!$is_first_class_callable && self::checkMethodArgs( + $method_id, + $args, + $template_result, + $context, + new CodeLocation($source, $stmt_name), + $statements_analyzer + ) === false) { + return Type::getMixed(); + } + + $return_type_candidate = MethodCallReturnTypeFetcher::fetch( + $statements_analyzer, + $codebase, + $stmt, + $context, + $method_id, + $declaring_method_id, + $method_id, + $cased_method_id, + $lhs_type_part, + $static_type, + $args, + $result, + $template_result + ); + + if ($is_first_class_callable) { + return $return_type_candidate; + } + + $in_call_map = InternalCallMapHandler::inCallMap((string) ($declaring_method_id ?? $method_id)); + + if (!$in_call_map) { + $name_code_location = new CodeLocation($statements_analyzer, $stmt_name); + + MethodCallProhibitionAnalyzer::analyze( + $codebase, + $context, + $method_id, + $statements_analyzer->getFullyQualifiedFunctionMethodOrNamespaceName(), + $name_code_location, + $statements_analyzer->getSuppressedIssues() + ); + + $getter_return_type = self::getMagicGetterOrSetterProperty( + $statements_analyzer, + $stmt, + $stmt_name, + $context, + $fq_class_name + ); + + if ($getter_return_type) { + $return_type_candidate = $getter_return_type; + } + } + + if ($method_storage) { + if ($method_storage->if_this_is_type) { + $class_type = new Union([$lhs_type_part]); + $if_this_is_type = clone $method_storage->if_this_is_type; + + TemplateInferredTypeReplacer::replace($if_this_is_type, $template_result, $codebase); + + if (!UnionTypeComparator::isContainedBy($codebase, $class_type, $if_this_is_type)) { + IssueBuffer::maybeAdd( + new IfThisIsMismatch( + 'Class type must be ' . $method_storage->if_this_is_type->getId() + . ' current type ' . $class_type->getId(), + new CodeLocation($source, $stmt->name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($method_storage->self_out_type && $lhs_var_id) { + $self_out_candidate = clone $method_storage->self_out_type; + + if ($template_result->lower_bounds) { + $self_out_candidate = TypeExpander::expandUnion( + $codebase, + $self_out_candidate, + $fq_class_name, + null, + $class_storage->parent_class, + true, + false, + $static_type instanceof TNamedObject + && $codebase->classlike_storage_provider->get($static_type->value)->final, + true + ); + } + + $self_out_candidate = MethodCallReturnTypeFetcher::replaceTemplateTypes( + $self_out_candidate, + $template_result, + $method_id, + count($args), + $codebase + ); + + $self_out_candidate = TypeExpander::expandUnion( + $codebase, + $self_out_candidate, + $fq_class_name, + $static_type, + $class_storage->parent_class, + true, + false, + $static_type instanceof TNamedObject + && $codebase->classlike_storage_provider->get($static_type->value)->final, + true + ); + + $context->vars_in_scope[$lhs_var_id] = $self_out_candidate; + } + + if (!$context->collect_mutations && !$context->collect_initializations) { + MethodCallPurityAnalyzer::analyze( + $statements_analyzer, + $codebase, + $stmt, + $lhs_var_id, + $cased_method_id, + $method_id, + $method_storage, + $class_storage, + $context, + $config, + $result + ); + } + + $has_packed_arg = false; + foreach ($args as $arg) { + $has_packed_arg = $has_packed_arg || $arg->unpack; + } + + if (!$has_packed_arg) { + $has_variadic_param = $method_storage->variadic; + + foreach ($method_storage->params as $param) { + $has_variadic_param = $has_variadic_param || $param->is_variadic; + } + + for ($i = count($args), $j = count($method_storage->params); $i < $j; ++$i) { + $param = $method_storage->params[$i]; + + if (!$param->is_optional + && !$param->is_variadic + && !$in_call_map + ) { + $result->too_few_arguments = true; + $result->too_few_arguments_method_ids[] = $declaring_method_id ?? $method_id; + } + } + + if ($has_variadic_param || count($method_storage->params) >= count($args) || $in_call_map) { + $result->too_many_arguments = false; + } else { + $result->too_many_arguments_method_ids[] = $declaring_method_id ?? $method_id; + } + } + + $class_template_params = $template_result->lower_bounds; + + if ($method_storage->assertions) { + self::applyAssertionsToContext( + $stmt_name, + ExpressionIdentifier::getArrayVarId($stmt->var, null, $statements_analyzer), + $method_storage->assertions, + $args, + $class_template_params, + $context, + $statements_analyzer + ); + } + + if ($method_storage->if_true_assertions) { + $statements_analyzer->node_data->setIfTrueAssertions( + $stmt, + array_map( + function (Assertion $assertion) use ( + $class_template_params, + $lhs_var_id, + $codebase + ): Assertion { + return $assertion->getUntemplatedCopy( + $class_template_params ?: [], + $lhs_var_id, + $codebase + ); + }, + $method_storage->if_true_assertions + ) + ); + } + + if ($method_storage->if_false_assertions) { + $statements_analyzer->node_data->setIfFalseAssertions( + $stmt, + array_map( + function (Assertion $assertion) use ( + $class_template_params, + $lhs_var_id, + $codebase + ): Assertion { + return $assertion->getUntemplatedCopy( + $class_template_params ?: [], + $lhs_var_id, + $codebase + ); + }, + $method_storage->if_false_assertions + ) + ); + } + } + + if ($codebase->methods_to_rename) { + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + foreach ($codebase->methods_to_rename as $original_method_id => $new_method_name) { + if ($declaring_method_id && (strtolower((string) $declaring_method_id)) === $original_method_id) { + $file_manipulations = [ + new FileManipulation( + (int) $stmt_name->getAttribute('startFilePos'), + (int) $stmt_name->getAttribute('endFilePos') + 1, + $new_method_name + ) + ]; + + FileManipulationBuffer::add( + $statements_analyzer->getFilePath(), + $file_manipulations + ); + } + } + } + + if ($config->eventDispatcher->hasAfterMethodCallAnalysisHandlers()) { + $file_manipulations = []; + + $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if ($appearing_method_id !== null && $declaring_method_id !== null) { + $event = new AfterMethodCallAnalysisEvent( + $stmt, + (string) $method_id, + (string) $appearing_method_id, + (string) $declaring_method_id, + $context, + $statements_analyzer, + $codebase, + $file_manipulations, + $return_type_candidate + ); + + $config->eventDispatcher->dispatchAfterMethodCallAnalysis($event); + $file_manipulations = $event->getFileReplacements(); + $return_type_candidate = $event->getReturnTypeCandidate(); + } + + if ($file_manipulations) { + FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); + } + } + + return $return_type_candidate ?? Type::getMixed(); + } + + /** + * Check properties accessed with magic getters and setters. + * If `@psalm-seal-properties` is set, they must be defined. + * If an `@property` annotation is specified, the setter must set something with the correct + * type. + */ + private static function getMagicGetterOrSetterProperty( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\MethodCall $stmt, + PhpParser\Node\Identifier $stmt_name, + Context $context, + string $fq_class_name + ): ?Union { + $method_name = strtolower($stmt_name->name); + if (!in_array($method_name, ['__get', '__set'], true)) { + return null; + } + + $codebase = $statements_analyzer->getCodebase(); + + $first_arg_value = $stmt->getArgs()[0]->value ?? null; + + if (!$first_arg_value instanceof PhpParser\Node\Scalar\String_) { + return null; + } + + $prop_name = $first_arg_value->value; + $property_id = $fq_class_name . '::$' . $prop_name; + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $codebase->properties->propertyExists( + $property_id, + $method_name === '__get', + $statements_analyzer, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ); + + switch ($method_name) { + case '__set': + // If `@psalm-seal-properties` is set, the property must be defined with + // a `@property` annotation + if (($class_storage->sealed_properties || $codebase->config->seal_all_properties) + && !isset($class_storage->pseudo_property_set_types['$' . $prop_name]) + && IssueBuffer::accepts( + new UndefinedThisPropertyAssignment( + 'Instance property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ) + ) { + // fall through + } + + // If a `@property` annotation is set, the type of the value passed to the + // magic setter must match the annotation. + $second_arg_type = isset($stmt->getArgs()[1]) + ? $statements_analyzer->node_data->getType($stmt->getArgs()[1]->value) + : null; + + if (isset($class_storage->pseudo_property_set_types['$' . $prop_name]) && $second_arg_type) { + $pseudo_set_type = TypeExpander::expandUnion( + $codebase, + $class_storage->pseudo_property_set_types['$' . $prop_name], + $fq_class_name, + new TNamedObject($fq_class_name), + $class_storage->parent_class + ); + + $union_comparison_results = new TypeComparisonResult(); + + $type_match_found = UnionTypeComparator::isContainedBy( + $codebase, + $second_arg_type, + $pseudo_set_type, + $second_arg_type->ignore_nullable_issues, + $second_arg_type->ignore_falsable_issues, + $union_comparison_results + ); + + if ($union_comparison_results->type_coerced) { + if ($union_comparison_results->type_coerced_from_mixed) { + IssueBuffer::maybeAdd( + new MixedPropertyTypeCoercion( + $prop_name . ' expects \'' . $pseudo_set_type->getId() . '\', ' + . ' parent type `' . $second_arg_type . '` provided', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new PropertyTypeCoercion( + $prop_name . ' expects \'' . $pseudo_set_type->getId() . '\', ' + . ' parent type `' . $second_arg_type . '` provided', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if (!$type_match_found && !$union_comparison_results->type_coerced_from_mixed) { + if (UnionTypeComparator::canBeContainedBy( + $codebase, + $second_arg_type, + $pseudo_set_type + )) { + IssueBuffer::maybeAdd( + new PossiblyInvalidPropertyAssignmentValue( + $prop_name . ' with declared type \'' + . $pseudo_set_type + . '\' cannot be assigned possibly different type \'' . $second_arg_type . '\'', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidPropertyAssignmentValue( + $prop_name . ' with declared type \'' + . $pseudo_set_type + . '\' cannot be assigned type \'' . $second_arg_type . '\'', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + break; + + case '__get': + // If `@psalm-seal-properties` is set, the property must be defined with + // a `@property` annotation + if (($class_storage->sealed_properties || $codebase->config->seal_all_properties) + && !isset($class_storage->pseudo_property_get_types['$' . $prop_name]) + && IssueBuffer::accepts( + new UndefinedThisPropertyFetch( + 'Instance property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ) + ) { + // fall through + } + + if (isset($class_storage->pseudo_property_get_types['$' . $prop_name])) { + return clone $class_storage->pseudo_property_get_types['$' . $prop_name]; + } + + break; + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php new file mode 100644 index 00000000..29c8bf22 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php @@ -0,0 +1,70 @@ +methods; + + $method_id = $codebase_methods->getDeclaringMethodId($method_id); + + if ($method_id === null) { + return null; + } + + $storage = $codebase_methods->getStorage($method_id); + + if ($storage->deprecated) { + IssueBuffer::maybeAdd( + new DeprecatedMethod( + 'The method ' . $codebase_methods->getCasedMethodId($method_id) . + ' has been marked as deprecated', + $code_location, + (string) $method_id + ), + $suppressed_issues + ); + } + + if (!$context->collect_initializations + && !$context->collect_mutations + ) { + if (!NamespaceAnalyzer::isWithinAny($caller_identifier ?? "", $storage->internal)) { + IssueBuffer::maybeAdd( + new InternalMethod( + 'The method ' . $codebase_methods->getCasedMethodId($method_id) + . ' is internal to ' . InternalClass::listToPhrase($storage->internal) + . ' but called from ' . ($caller_identifier ?: 'root namespace'), + $code_location, + (string) $method_id + ), + $suppressed_issues + ); + } + } + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php new file mode 100644 index 00000000..d0d49fdd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php @@ -0,0 +1,173 @@ +external_mutation_free + && $statements_analyzer->node_data->isPureCompatible($stmt->var); + + if ($context->pure + && !$method_storage->mutation_free + && !$method_pure_compatible + ) { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a non-mutation-free method ' + . $cased_method_id . ' from a pure context', + new CodeLocation($statements_analyzer, $stmt->name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($context->mutation_free + && !$method_storage->mutation_free + && !$method_pure_compatible + ) { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a possibly-mutating method ' + . $cased_method_id . ' from a mutation-free context', + new CodeLocation($statements_analyzer, $stmt->name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($context->external_mutation_free + && !$method_storage->mutation_free + && $method_id->fq_class_name !== $context->self + && !$method_pure_compatible + ) { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a possibly-mutating method ' + . $cased_method_id . ' from a mutation-free context', + new CodeLocation($statements_analyzer, $stmt->name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif (($method_storage->mutation_free + || ($method_storage->external_mutation_free + && ($stmt->var->getAttribute('external_mutation_free', false) + || $stmt->var->getAttribute('pure', false)) + )) + && !$context->inside_unset + ) { + if ($method_storage->mutation_free + && (!$method_storage->mutation_free_inferred + || $method_storage->final + || $method_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE) + && ($method_storage->immutable || $config->remember_property_assignments_after_call) + ) { + if ($context->inside_conditional + && !$method_storage->assertions + && !$method_storage->if_true_assertions + ) { + $stmt->setAttribute('memoizable', true); + + if ($method_storage->immutable) { + $stmt->setAttribute('pure', true); + } + } + + $result->can_memoize = true; + } + + if ($codebase->find_unused_variables + && !$context->inside_conditional + && !$context->inside_general_use + && !$context->inside_throw + ) { + if (!$context->inside_assignment + && !$context->inside_call + && !$context->inside_return + && !$method_storage->assertions + && !$method_storage->if_true_assertions + && !$method_storage->if_false_assertions + && !$method_storage->throws + ) { + IssueBuffer::maybeAdd( + new UnusedMethodCall( + 'The call to ' . $cased_method_id . ' is not used', + new CodeLocation($statements_analyzer, $stmt->name), + (string) $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif (!$method_storage->mutation_free_inferred) { + $stmt->setAttribute('pure', true); + } + } + } + + if ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + && !$method_storage->mutation_free + && !$method_pure_compatible + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + + if (!$config->remember_property_assignments_after_call + && !$method_storage->mutation_free + && !$method_pure_compatible + ) { + $context->removeMutableObjectVars(); + } elseif ($method_storage->this_property_mutations) { + if (!$method_pure_compatible) { + $context->removeMutableObjectVars(true); + } + + foreach ($method_storage->this_property_mutations as $name => $_) { + $mutation_var_id = $lhs_var_id . '->' . $name; + + $this_property_didnt_exist = $lhs_var_id === '$this' + && isset($context->vars_in_scope[$mutation_var_id]) + && !isset($class_storage->declaring_property_ids[$name]); + + if ($this_property_didnt_exist) { + $context->vars_in_scope[$mutation_var_id] = Type::getMixed(); + } else { + $new_type = AssignmentAnalyzer::getExpandedPropertyType( + $codebase, + $class_storage->name, + $name, + $class_storage + ) ?? Type::getMixed(); + + $context->vars_in_scope[$mutation_var_id] = $new_type; + $context->possibly_assigned_var_ids[$mutation_var_id] = true; + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php new file mode 100644 index 00000000..76d3dfa8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php @@ -0,0 +1,634 @@ + $args + */ + public static function fetch( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\MethodCall $stmt, + Context $context, + MethodIdentifier $method_id, + ?MethodIdentifier $declaring_method_id, + MethodIdentifier $premixin_method_id, + string $cased_method_id, + Atomic $lhs_type_part, + ?Atomic $static_type, + array $args, + AtomicMethodCallAnalysisResult $result, + TemplateResult $template_result + ): Union { + $call_map_id = $declaring_method_id ?? $method_id; + + $fq_class_name = $method_id->fq_class_name; + $method_name = $method_id->method_name; + + $class_storage = $codebase->methods->getClassLikeStorageForMethod($method_id); + $method_storage = ($class_storage->methods[$method_id->method_name] ?? null); + + if ($stmt->isFirstClassCallable()) { + if ($method_storage) { + return new Union([new TClosure( + 'Closure', + $method_storage->params, + $method_storage->return_type, + $method_storage->pure + )]); + } + + return Type::getClosure(); + } + + if ($codebase->methods->return_type_provider->has($premixin_method_id->fq_class_name)) { + $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( + $statements_analyzer, + $premixin_method_id->fq_class_name, + $premixin_method_id->method_name, + $stmt, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt->name), + $lhs_type_part instanceof TGenericObject ? $lhs_type_part->type_params : null + ); + + if ($return_type_candidate) { + return $return_type_candidate; + } + } + + if ($premixin_method_id->method_name === 'getcode' + && $premixin_method_id->fq_class_name !== Exception::class + && $premixin_method_id->fq_class_name !== RuntimeException::class + && $premixin_method_id->fq_class_name !== PDOException::class + && ( + $codebase->classImplements($premixin_method_id->fq_class_name, Throwable::class) + || $codebase->interfaceExtends($premixin_method_id->fq_class_name, Throwable::class) + ) + ) { + return Type::getInt(true); // TODO: Remove the flag in Psalm 5 + } + + if ($declaring_method_id && $declaring_method_id !== $method_id) { + $declaring_fq_class_name = $declaring_method_id->fq_class_name; + $declaring_method_name = $declaring_method_id->method_name; + + if ($codebase->methods->return_type_provider->has($declaring_fq_class_name)) { + $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( + $statements_analyzer, + $declaring_fq_class_name, + $declaring_method_name, + $stmt, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt->name), + $lhs_type_part instanceof TGenericObject ? $lhs_type_part->type_params : null, + $fq_class_name, + $method_name + ); + + if ($return_type_candidate) { + return $return_type_candidate; + } + } + } + + if (InternalCallMapHandler::inCallMap((string) $call_map_id)) { + if (($template_result->lower_bounds || $class_storage->stubbed) + && ($method_storage = ($class_storage->methods[$method_id->method_name] ?? null)) + && $method_storage->return_type + ) { + $return_type_candidate = clone $method_storage->return_type; + + $return_type_candidate = self::replaceTemplateTypes( + $return_type_candidate, + $template_result, + $method_id, + count($stmt->getArgs()), + $codebase + ); + } else { + $callmap_callables = InternalCallMapHandler::getCallablesFromCallMap((string) $call_map_id); + + if (!$callmap_callables || $callmap_callables[0]->return_type === null) { + throw new UnexpectedValueException('Shouldn’t get here'); + } + + $return_type_candidate = $callmap_callables[0]->return_type; + } + + if ($return_type_candidate->isFalsable()) { + $return_type_candidate->ignore_falsable_issues = true; + } + + $return_type_candidate = TypeExpander::expandUnion( + $codebase, + $return_type_candidate, + $fq_class_name, + $static_type, + $class_storage->parent_class, + true, + false, + false, + true + ); + } else { + $self_fq_class_name = $fq_class_name; + + $return_type_candidate = $codebase->methods->getMethodReturnType( + $method_id, + $self_fq_class_name, + $statements_analyzer, + $args + ); + + if ($return_type_candidate) { + $return_type_candidate = clone $return_type_candidate; + + if ($template_result->lower_bounds) { + $return_type_candidate = TypeExpander::expandUnion( + $codebase, + $return_type_candidate, + $fq_class_name, + null, + $class_storage->parent_class, + true, + false, + $static_type instanceof TNamedObject + && $codebase->classlike_storage_provider->get($static_type->value)->final, + true + ); + } + + $return_type_candidate = self::replaceTemplateTypes( + $return_type_candidate, + $template_result, + $method_id, + count($stmt->getArgs()), + $codebase + ); + + $return_type_candidate = TypeExpander::expandUnion( + $codebase, + $return_type_candidate, + $self_fq_class_name, + $static_type, + $class_storage->parent_class, + true, + false, + $static_type instanceof TNamedObject + && $codebase->classlike_storage_provider->get($static_type->value)->final, + true + ); + + $return_type_location = $codebase->methods->getMethodReturnTypeLocation( + $method_id, + $secondary_return_type_location + ); + + if ($secondary_return_type_location) { + $return_type_location = $secondary_return_type_location; + } + + $config = Config::getInstance(); + + // only check the type locally if it's defined externally + if ($return_type_location && !$config->isInProjectDirs($return_type_location->file_path)) { + $return_type_candidate->check( + $statements_analyzer, + new CodeLocation($statements_analyzer, $stmt), + $statements_analyzer->getSuppressedIssues(), + $context->phantom_classes, + true, + false, + false, + $context->calling_method_id + ); + } + } else { + $result->returns_by_ref = + $result->returns_by_ref + || $codebase->methods->getMethodReturnsByRef($method_id); + } + } + + if (!$return_type_candidate) { + $return_type_candidate = $method_name === '__tostring' ? Type::getString() : Type::getMixed(); + } + + self::taintMethodCallResult( + $statements_analyzer, + $return_type_candidate, + $stmt->name, + $stmt->var, + $args, + $method_id, + $declaring_method_id, + $cased_method_id, + $context + ); + + return $return_type_candidate; + } + + /** + * @param array $args + */ + public static function taintMethodCallResult( + StatementsAnalyzer $statements_analyzer, + Union $return_type_candidate, + PhpParser\Node $name_expr, + PhpParser\Node\Expr $var_expr, + array $args, + MethodIdentifier $method_id, + ?MethodIdentifier $declaring_method_id, + string $cased_method_id, + Context $context + ): void { + if (!$statements_analyzer->data_flow_graph + || !$declaring_method_id + ) { + return; + } + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + return; + } + + $codebase = $statements_analyzer->getCodebase(); + + $event = new AddRemoveTaintsEvent($var_expr, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + $method_storage = $codebase->methods->getStorage( + $declaring_method_id + ); + + $node_location = new CodeLocation($statements_analyzer, $name_expr); + + $is_declaring = (string) $declaring_method_id === (string) $method_id; + + $var_id = ExpressionIdentifier::getArrayVarId( + $var_expr, + null, + $statements_analyzer + ); + + if ($method_storage->specialize_call + && $var_id + && isset($context->vars_in_scope[$var_id]) + && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph + ) { + $var_nodes = []; + + $parent_nodes = $context->vars_in_scope[$var_id]->parent_nodes; + + $unspecialized_parent_nodes = array_filter( + $parent_nodes, + function ($parent_node) { + return !$parent_node->specialization_key; + } + ); + + $specialized_parent_nodes = array_filter( + $parent_nodes, + function ($parent_node) { + return (bool) $parent_node->specialization_key; + } + ); + + $var_node = DataFlowNode::getForAssignment( + $var_id, + new CodeLocation($statements_analyzer, $var_expr) + ); + + if ($method_storage->location) { + $this_parent_node = DataFlowNode::getForAssignment( + '$this in ' . $method_id, + $method_storage->location + ); + + foreach ($parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $this_parent_node, + '=', + $added_taints, + $removed_taints + ); + } + } + + $var_nodes[$var_node->id] = $var_node; + + $method_call_nodes = []; + + if ($unspecialized_parent_nodes) { + $method_call_node = DataFlowNode::getForMethodReturn( + (string) $method_id, + $cased_method_id, + $is_declaring ? ($method_storage->signature_return_type_location + ?: $method_storage->location) : null, + $node_location + ); + + $method_call_nodes[$method_call_node->id] = $method_call_node; + } + + foreach ($specialized_parent_nodes as $parent_node) { + $universal_method_call_node = DataFlowNode::getForMethodReturn( + (string) $method_id, + $cased_method_id, + $is_declaring ? ($method_storage->signature_return_type_location + ?: $method_storage->location) : null, + null + ); + + $method_call_node = new DataFlowNode( + strtolower((string) $method_id), + $cased_method_id, + $is_declaring ? ($method_storage->signature_return_type_location + ?: $method_storage->location) : null, + $parent_node->specialization_key + ); + + $statements_analyzer->data_flow_graph->addPath( + $universal_method_call_node, + $method_call_node, + '=', + $added_taints, + $removed_taints + ); + + $method_call_nodes[$method_call_node->id] = $method_call_node; + } + + if (!$method_call_nodes) { + return; + } + + foreach ($method_call_nodes as $method_call_node) { + $statements_analyzer->data_flow_graph->addNode($method_call_node); + + foreach ($var_nodes as $var_node) { + $statements_analyzer->data_flow_graph->addNode($var_node); + + $statements_analyzer->data_flow_graph->addPath( + $method_call_node, + $var_node, + 'method-call-' . $method_id->method_name, + $added_taints, + $removed_taints + ); + } + + if (!$is_declaring) { + $cased_declaring_method_id = $codebase->methods->getCasedMethodId($declaring_method_id); + + $declaring_method_call_node = new DataFlowNode( + strtolower((string) $declaring_method_id), + $cased_declaring_method_id, + $method_storage->signature_return_type_location ?: $method_storage->location, + $method_call_node->specialization_key + ); + + $statements_analyzer->data_flow_graph->addNode($declaring_method_call_node); + $statements_analyzer->data_flow_graph->addPath( + $declaring_method_call_node, + $method_call_node, + 'parent', + $added_taints, + $removed_taints + ); + } + } + + $return_type_candidate->parent_nodes = $method_call_nodes; + + $stmt_var_type = clone $context->vars_in_scope[$var_id]; + + $stmt_var_type->parent_nodes = $var_nodes; + + $context->vars_in_scope[$var_id] = $stmt_var_type; + } elseif ($method_storage->specialize_call + && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph + ) { + $method_call_node = DataFlowNode::getForMethodReturn( + (string) $method_id, + $cased_method_id, + $is_declaring + ? ($method_storage->signature_return_type_location ?: $method_storage->location) + : null, + $node_location + ); + + if (!$is_declaring) { + $cased_declaring_method_id = $codebase->methods->getCasedMethodId($declaring_method_id); + + $declaring_method_call_node = DataFlowNode::getForMethodReturn( + (string) $declaring_method_id, + $cased_declaring_method_id, + $method_storage->signature_return_type_location ?: $method_storage->location, + $node_location + ); + + $statements_analyzer->data_flow_graph->addNode($declaring_method_call_node); + $statements_analyzer->data_flow_graph->addPath( + $declaring_method_call_node, + $method_call_node, + 'parent', + $added_taints, + $removed_taints + ); + } + + $statements_analyzer->data_flow_graph->addNode($method_call_node); + + $return_type_candidate->parent_nodes = [ + $method_call_node->id => $method_call_node + ]; + } else { + $method_call_node = DataFlowNode::getForMethodReturn( + (string) $method_id, + $cased_method_id, + $is_declaring + ? ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + ? ($method_storage->signature_return_type_location ?: $method_storage->location) + : ($method_storage->return_type_location ?: $method_storage->location)) + : null, + null + ); + + if (!$is_declaring) { + $cased_declaring_method_id = $codebase->methods->getCasedMethodId($declaring_method_id); + + $declaring_method_call_node = DataFlowNode::getForMethodReturn( + (string) $declaring_method_id, + $cased_declaring_method_id, + $method_storage->signature_return_type_location ?: $method_storage->location, + null + ); + + $statements_analyzer->data_flow_graph->addNode($declaring_method_call_node); + $statements_analyzer->data_flow_graph->addPath( + $declaring_method_call_node, + $method_call_node, + 'parent', + $added_taints, + $removed_taints + ); + } + + $statements_analyzer->data_flow_graph->addNode($method_call_node); + + $return_type_candidate->parent_nodes = [ + $method_call_node->id => $method_call_node + ]; + } + + if ($method_storage->taint_source_types && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { + $method_node = TaintSource::getForMethodReturn( + (string) $method_id, + $cased_method_id, + $method_storage->signature_return_type_location ?: $method_storage->location + ); + + $method_node->taints = $method_storage->taint_source_types; + + $statements_analyzer->data_flow_graph->addSource($method_node); + } + + if (!$statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { + return; + } + + FunctionCallReturnTypeFetcher::taintUsingFlows( + $statements_analyzer, + $method_storage, + $statements_analyzer->data_flow_graph, + (string) $method_id, + $args, + $node_location, + $method_call_node, + $method_storage->removed_taints + ); + } + + public static function replaceTemplateTypes( + Union $return_type_candidate, + TemplateResult $template_result, + MethodIdentifier $method_id, + int $arg_count, + Codebase $codebase + ): Union { + if ($template_result->template_types) { + $bindable_template_types = $return_type_candidate->getTemplateTypes(); + + foreach ($bindable_template_types as $template_type) { + if ($template_type->defining_class !== $method_id->fq_class_name + && !isset( + $template_result->lower_bounds + [$template_type->param_name] + [$template_type->defining_class] + ) + ) { + if ($template_type->param_name === 'TFunctionArgCount') { + $template_result->lower_bounds[$template_type->param_name] = [ + 'fn-' . strtolower((string) $method_id) => [ + new TemplateBound( + Type::getInt(false, $arg_count) + ) + ] + ]; + } elseif ($template_type->param_name === 'TPhpMajorVersion') { + $template_result->lower_bounds[$template_type->param_name] = [ + 'fn-' . strtolower((string) $method_id) => [ + new TemplateBound( + Type::getInt(false, $codebase->php_major_version) + ) + ] + ]; + } elseif ($template_type->param_name === 'TPhpVersionId') { + $template_result->lower_bounds[$template_type->param_name] = [ + 'fn-' . strtolower((string) $method_id) => [ + new TemplateBound( + Type::getInt( + false, + 10000 * $codebase->php_major_version + + 100 * $codebase->php_minor_version + ) + ) + ] + ]; + } else { + $template_result->lower_bounds[$template_type->param_name] = [ + ($template_type->defining_class) => [ + new TemplateBound(Type::getEmpty()) + ] + ]; + } + } + } + } + + if ($template_result->lower_bounds) { + $return_type_candidate = TypeExpander::expandUnion( + $codebase, + $return_type_candidate, + null, + null, + null + ); + + TemplateInferredTypeReplacer::replace( + $return_type_candidate, + $template_result, + $codebase + ); + } + + return $return_type_candidate; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php new file mode 100644 index 00000000..48ff4dac --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php @@ -0,0 +1,196 @@ +getCodebase(); + $codebase_methods = $codebase->methods; + $codebase_classlikes = $codebase->classlikes; + + $fq_classlike_name = $method_id->fq_class_name; + $method_name = $method_id->method_name; + + if ($codebase_methods->visibility_provider->has($fq_classlike_name)) { + $method_visible = $codebase_methods->visibility_provider->isMethodVisible( + $source, + $fq_classlike_name, + $method_name, + $context, + $code_location + ); + + if ($method_visible === false) { + if (IssueBuffer::accepts( + new InaccessibleMethod( + 'Cannot access method ' . $codebase_methods->getCasedMethodId($method_id) . + ' from context ' . $context->self, + $code_location + ), + $suppressed_issues + )) { + return false; + } + } elseif ($method_visible === true) { + return false; + } + } + + $declaring_method_id = $codebase_methods->getDeclaringMethodId($method_id); + + if (!$declaring_method_id) { + if ($method_name === '__construct' + || ($method_id->fq_class_name === 'Closure' + && ($method_id->method_name === 'fromcallable' + || $method_id->method_name === '__invoke')) + ) { + return null; + } + + if (InternalCallMapHandler::inCallMap((string) $method_id)) { + return null; + } + + throw new UnexpectedValueException('$declaring_method_id not expected to be null here'); + } + + $appearing_method_id = $codebase_methods->getAppearingMethodId($method_id); + + $appearing_method_class = null; + $appearing_class_storage = null; + $appearing_method_name = null; + + if ($appearing_method_id) { + $appearing_method_class = $appearing_method_id->fq_class_name; + $appearing_method_name = $appearing_method_id->method_name; + + // if the calling class is the same, we know the method exists, so it must be visible + if ($appearing_method_class === $context->self) { + return null; + } + + $appearing_class_storage = $codebase->classlike_storage_provider->get($appearing_method_class); + } + + $declaring_method_class = $declaring_method_id->fq_class_name; + + if ($source->getSource() instanceof TraitAnalyzer + && strtolower($declaring_method_class) === strtolower((string) $source->getFQCLN()) + ) { + return null; + } + + $storage = $codebase->methods->getStorage($declaring_method_id); + $visibility = $storage->visibility; + + if ($appearing_method_name + && isset($appearing_class_storage->trait_visibility_map[$appearing_method_name]) + ) { + $visibility = $appearing_class_storage->trait_visibility_map[$appearing_method_name]; + } + + // Get oldest ancestor declaring $method_id + $overridden_method_ids = $codebase_methods->getOverriddenMethodIds($method_id); + // Remove traits and interfaces + while (($oldest_declaring_method_id = end($overridden_method_ids)) + && !$codebase_classlikes->hasFullyQualifiedClassName($oldest_declaring_method_id->fq_class_name) + ) { + array_pop($overridden_method_ids); + } + if (empty($overridden_method_ids)) { + // We prefer appearing method id over declaring method id because declaring method id could be a trait + $oldest_ancestor_declaring_method_id = $appearing_method_id; + } else { + // Oldest ancestor is at end of array + $oldest_ancestor_declaring_method_id = array_pop($overridden_method_ids); + } + $oldest_ancestor_declaring_method_class = $oldest_ancestor_declaring_method_id->fq_class_name ?? null; + + switch ($visibility) { + case ClassLikeAnalyzer::VISIBILITY_PUBLIC: + return null; + + case ClassLikeAnalyzer::VISIBILITY_PRIVATE: + if (!$context->self || $appearing_method_class !== $context->self) { + if (IssueBuffer::accepts( + new InaccessibleMethod( + 'Cannot access private method ' . $codebase_methods->getCasedMethodId($method_id) . + ' from context ' . $context->self, + $code_location + ), + $suppressed_issues + )) { + return false; + } + } + + return null; + + case ClassLikeAnalyzer::VISIBILITY_PROTECTED: + if (!$context->self) { + if (IssueBuffer::accepts( + new InaccessibleMethod( + 'Cannot access protected method ' . $method_id, + $code_location + ), + $suppressed_issues + )) { + return false; + } + + return null; + } + + if ($oldest_ancestor_declaring_method_class !== null + && $codebase_classlikes->classExtends($oldest_ancestor_declaring_method_class, $context->self) + ) { + return null; + } + + if ($oldest_ancestor_declaring_method_class !== null + && !$codebase_classlikes->classExtends($context->self, $oldest_ancestor_declaring_method_class) + && !$codebase_classlikes->classExtends($declaring_method_class, $context->self) + ) { + if (IssueBuffer::accepts( + new InaccessibleMethod( + 'Cannot access protected method ' . $codebase_methods->getCasedMethodId($method_id) . + ' from context ' . $context->self, + $code_location + ), + $suppressed_issues + )) { + return false; + } + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php new file mode 100644 index 00000000..c8c3c70d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php @@ -0,0 +1,454 @@ +fq_class_name; + $method_name_lc = $method_id->method_name; + + if ($stmt->isFirstClassCallable()) { + if (isset($class_storage->pseudo_methods[$method_name_lc])) { + $result->has_valid_method_call_type = true; + $result->existent_method_ids[] = $method_id->__toString(); + $result->return_type = self::createFirstClassCallableReturnType( + $class_storage->pseudo_methods[$method_name_lc] + ); + } else { + $result->non_existent_magic_method_ids[] = $method_id->__toString(); + $result->return_type = self::createFirstClassCallableReturnType(); + } + + return null; + } + + if ($codebase->methods->return_type_provider->has($fq_class_name)) { + $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( + $statements_analyzer, + $method_id->fq_class_name, + $method_id->method_name, + $stmt, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt->name) + ); + + if ($return_type_candidate) { + if ($all_intersection_return_type) { + $return_type_candidate = Type::intersectUnionTypes( + $all_intersection_return_type, + $return_type_candidate, + $codebase + ) ?? Type::getMixed(); + } + + $result->return_type = Type::combineUnionTypes( + $return_type_candidate, + $result->return_type, + $codebase + ); + + CallAnalyzer::checkMethodArgs( + $method_id, + $stmt->getArgs(), + null, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer + ); + + return null; + } + } + + $found_method_and_class_storage = self::findPseudoMethodAndClassStorages( + $codebase, + $class_storage, + $method_name_lc + ); + + if ($found_method_and_class_storage) { + $result->has_valid_method_call_type = true; + $result->existent_method_ids[] = $method_id->__toString(); + + [$pseudo_method_storage, $defining_class_storage] = $found_method_and_class_storage; + + $found_generic_params = ClassTemplateParamCollector::collect( + $codebase, + $defining_class_storage, + $class_storage, + $method_name_lc, + $lhs_type_part, + !$statements_analyzer->isStatic() && $method_id->fq_class_name === $context->self + ); + + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + $pseudo_method_storage->params, + (string) $method_id, + true, + $context, + $found_generic_params ? new TemplateResult([], $found_generic_params) : null + ); + + ArgumentsAnalyzer::checkArgumentsMatch( + $statements_analyzer, + $stmt->getArgs(), + null, + $pseudo_method_storage->params, + $pseudo_method_storage, + null, + $found_generic_params ? new TemplateResult([], $found_generic_params) : null, + new CodeLocation($statements_analyzer, $stmt), + $context + ); + + if ($pseudo_method_storage->return_type) { + $return_type_candidate = clone $pseudo_method_storage->return_type; + + if ($found_generic_params) { + TemplateInferredTypeReplacer::replace( + $return_type_candidate, + new TemplateResult([], $found_generic_params), + $codebase + ); + } + + $return_type_candidate = TypeExpander::expandUnion( + $codebase, + $return_type_candidate, + $defining_class_storage->name, + $lhs_type_part instanceof Atomic\TNamedObject ? $lhs_type_part : $fq_class_name, + $defining_class_storage->parent_class + ); + + if ($all_intersection_return_type) { + $return_type_candidate = Type::intersectUnionTypes( + $all_intersection_return_type, + $return_type_candidate, + $codebase + ) ?? Type::getMixed(); + } + + $result->return_type = Type::combineUnionTypes( + $return_type_candidate, + $result->return_type, + $codebase + ); + + return null; + } + } elseif ($all_intersection_return_type === null) { + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ); + + if ($class_storage->sealed_methods || $config->seal_all_methods) { + $result->non_existent_magic_method_ids[] = $method_id->__toString(); + + return null; + } + } + + $result->has_valid_method_call_type = true; + $result->existent_method_ids[] = $method_id->__toString(); + + $array_values = array_map( + /** + * @return PhpParser\Node\Expr\ArrayItem + */ + function (PhpParser\Node\Arg $arg): PhpParser\Node\Expr\ArrayItem { + return new VirtualArrayItem( + $arg->value, + null, + false, + $arg->getAttributes() + ); + }, + $stmt->getArgs() + ); + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + return new AtomicCallContext( + new MethodIdentifier($fq_class_name, '__call'), + [ + new VirtualArg( + new VirtualString($method_name_lc), + false, + false, + $stmt->getAttributes() + ), + new VirtualArg( + new VirtualArray( + $array_values, + $stmt->getAttributes() + ), + false, + false, + $stmt->getAttributes() + ), + ] + ); + } + + /** + * @param array $all_intersection_existent_method_ids + */ + public static function handleMissingOrMagicMethod( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\MethodCall $stmt, + MethodIdentifier $method_id, + bool $is_interface, + Context $context, + Config $config, + ?Union $all_intersection_return_type, + array $all_intersection_existent_method_ids, + ?string $intersection_method_id, + string $cased_method_id, + AtomicMethodCallAnalysisResult $result, + ?Atomic $lhs_type_part + ): void { + $fq_class_name = $method_id->fq_class_name; + $method_name_lc = $method_id->method_name; + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $found_method_and_class_storage = self::findPseudoMethodAndClassStorages( + $codebase, + $class_storage, + $method_name_lc + ); + + if (($is_interface || $config->use_phpdoc_method_without_magic_or_parent) + && $found_method_and_class_storage + ) { + $result->has_valid_method_call_type = true; + $result->existent_method_ids[] = $method_id->__toString(); + + [$pseudo_method_storage, $defining_class_storage] = $found_method_and_class_storage; + + if ($stmt->isFirstClassCallable()) { + $result->return_type = self::createFirstClassCallableReturnType($pseudo_method_storage); + return; + } + + $found_generic_params = ClassTemplateParamCollector::collect( + $codebase, + $defining_class_storage, + $class_storage, + $method_name_lc, + $lhs_type_part, + !$statements_analyzer->isStatic() && $method_id->fq_class_name === $context->self + ); + + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + $pseudo_method_storage->params, + (string) $method_id, + true, + $context, + $found_generic_params ? new TemplateResult([], $found_generic_params) : null + ) === false) { + return; + } + + if (ArgumentsAnalyzer::checkArgumentsMatch( + $statements_analyzer, + $stmt->getArgs(), + null, + $pseudo_method_storage->params, + $pseudo_method_storage, + null, + $found_generic_params ? new TemplateResult([], $found_generic_params) : null, + new CodeLocation($statements_analyzer, $stmt->name), + $context + ) === false) { + return; + } + + if ($pseudo_method_storage->return_type) { + $return_type_candidate = clone $pseudo_method_storage->return_type; + + if ($found_generic_params) { + TemplateInferredTypeReplacer::replace( + $return_type_candidate, + new TemplateResult([], $found_generic_params), + $codebase + ); + } + + if ($all_intersection_return_type) { + $return_type_candidate = Type::intersectUnionTypes( + $all_intersection_return_type, + $return_type_candidate, + $codebase + ) ?? Type::getMixed(); + } + + $return_type_candidate = TypeExpander::expandUnion( + $codebase, + $return_type_candidate, + $defining_class_storage->name, + $lhs_type_part instanceof Atomic\TNamedObject ? $lhs_type_part : $fq_class_name, + $defining_class_storage->parent_class, + true, + false, + $class_storage->final + ); + + $result->return_type = Type::combineUnionTypes($return_type_candidate, $result->return_type); + + return; + } + + $result->return_type = Type::getMixed(); + + return; + } + + if ($stmt->isFirstClassCallable()) { + $result->non_existent_class_method_ids[] = $method_id->__toString(); + $result->return_type = self::createFirstClassCallableReturnType(); + return; + } + + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ) === false) { + return; + } + + if ($all_intersection_return_type && $all_intersection_existent_method_ids) { + $result->existent_method_ids = array_merge( + $result->existent_method_ids, + $all_intersection_existent_method_ids + ); + + $result->return_type = Type::combineUnionTypes($all_intersection_return_type, $result->return_type); + + return; + } + + if ((!$is_interface && !$config->use_phpdoc_method_without_magic_or_parent) + || !isset($class_storage->pseudo_methods[$method_name_lc]) + ) { + if ($is_interface) { + $result->non_existent_interface_method_ids[] = $intersection_method_id ?: $cased_method_id; + } else { + $result->non_existent_class_method_ids[] = $intersection_method_id ?: $cased_method_id; + } + } + } + + private static function createFirstClassCallableReturnType(?MethodStorage $method_storage = null): Union + { + if ($method_storage) { + return new Union([new TClosure( + 'Closure', + $method_storage->params, + $method_storage->return_type, + $method_storage->pure + )]); + } + + return Type::getClosure(); + } + + /** + * Try to find matching pseudo method over ancestors (including interfaces). + * + * Returns the pseudo method if exists, with its defining class storage. + * If the method is not declared, null is returned. + * + * @param Codebase $codebase + * @param ClassLikeStorage $static_class_storage The called class + * @param lowercase-string $method_name_lc + * + * @return array{MethodStorage, ClassLikeStorage} + */ + private static function findPseudoMethodAndClassStorages( + Codebase $codebase, + ClassLikeStorage $static_class_storage, + string $method_name_lc + ): ?array { + if (isset($static_class_storage->declaring_pseudo_method_ids[$method_name_lc])) { + $method_id = $static_class_storage->declaring_pseudo_method_ids[$method_name_lc]; + $class_storage = $codebase->classlikes->getStorageFor($method_id->fq_class_name); + + if ($class_storage && isset($class_storage->pseudo_methods[$method_name_lc])) { + return [$class_storage->pseudo_methods[$method_name_lc], $class_storage]; + } + } + + if ($pseudo_method_storage = $static_class_storage->pseudo_methods[$method_name_lc] ?? null) { + return [$pseudo_method_storage, $static_class_storage]; + } + + $ancestors = $static_class_storage->class_implements; + + foreach ($ancestors as $fq_class_name => $_) { + $class_storage = $codebase->classlikes->getStorageFor($fq_class_name); + + if ($class_storage && isset($class_storage->pseudo_methods[$method_name_lc])) { + return [ + $class_storage->pseudo_methods[$method_name_lc], + $class_storage + ]; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php new file mode 100644 index 00000000..04f0b96c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php @@ -0,0 +1,437 @@ +inside_call; + + $context->inside_call = true; + + $existing_stmt_var_type = null; + + if (!$real_method_call) { + $existing_stmt_var_type = $statements_analyzer->node_data->getType($stmt->var); + } + + if ($existing_stmt_var_type) { + $statements_analyzer->node_data->setType($stmt->var, $existing_stmt_var_type); + } elseif (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->var, $context) === false) { + $context->inside_call = $was_inside_call; + + return false; + } + + if (!$stmt->name instanceof PhpParser\Node\Identifier) { + $context->inside_call = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->name, $context) === false) { + $context->inside_call = $was_inside_call; + + return false; + } + } + + $context->inside_call = $was_inside_call; + + if ($stmt->var instanceof PhpParser\Node\Expr\Variable) { + if (is_string($stmt->var->name) && $stmt->var->name === 'this' && !$statements_analyzer->getFQCLN()) { + if (IssueBuffer::accepts( + new InvalidScope( + 'Use of $this in non-class context', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } + } + + $lhs_var_id = ExpressionIdentifier::getArrayVarId( + $stmt->var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $class_type = $lhs_var_id && $context->hasVariable($lhs_var_id) + ? $context->vars_in_scope[$lhs_var_id] + : null; + + if ($stmt_var_type = $statements_analyzer->node_data->getType($stmt->var)) { + $class_type = $stmt_var_type; + } elseif (!$class_type) { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } + + if (!$context->check_classes) { + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ) === false) { + return false; + } + + return true; + } + + if ($class_type + && $stmt->name instanceof PhpParser\Node\Identifier + && ($class_type->isNull() || $class_type->isVoid()) + ) { + if (IssueBuffer::accepts( + new NullReference( + 'Cannot call method ' . $stmt->name->name . ' on null value', + new CodeLocation($statements_analyzer->getSource(), $stmt->name) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + return true; + } + + if ($class_type + && $stmt->name instanceof PhpParser\Node\Identifier + && $class_type->isNullable() + && !$class_type->ignore_nullable_issues + && !($stmt->name->name === 'offsetGet' && $context->inside_isset) + && !self::hasNullsafe($stmt->var) + ) { + IssueBuffer::maybeAdd( + new PossiblyNullReference( + 'Cannot call method ' . $stmt->name->name . ' on possibly null value', + new CodeLocation($statements_analyzer->getSource(), $stmt->name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($class_type + && $stmt->name instanceof PhpParser\Node\Identifier + && $class_type->isFalsable() + && !$class_type->ignore_falsable_issues + ) { + IssueBuffer::maybeAdd( + new PossiblyFalseReference( + 'Cannot call method ' . $stmt->name->name . ' on possibly false value', + new CodeLocation($statements_analyzer->getSource(), $stmt->name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $codebase = $statements_analyzer->getCodebase(); + + $source = $statements_analyzer->getSource(); + + if (!$class_type) { + $class_type = Type::getMixed(); + } + + $lhs_types = $class_type->getAtomicTypes(); + + $result = new AtomicMethodCallAnalysisResult(); + + $possible_new_class_types = []; + foreach ($lhs_types as $lhs_type_part) { + AtomicMethodCallAnalyzer::analyze( + $statements_analyzer, + $stmt, + $codebase, + $context, + $class_type, + $lhs_type_part, + $lhs_type_part instanceof TNamedObject + || $lhs_type_part instanceof TTemplateParam + ? $lhs_type_part + : null, + false, + $lhs_var_id, + $result + ); + if (isset($context->vars_in_scope[$lhs_var_id]) + && ($possible_new_class_type = $context->vars_in_scope[$lhs_var_id]) instanceof Union + && !$possible_new_class_type->equals($class_type)) { + $possible_new_class_types[] = $context->vars_in_scope[$lhs_var_id]; + } + } + if (!$stmt->isFirstClassCallable() + && !$stmt->getArgs() + && $lhs_var_id && $stmt->name instanceof PhpParser\Node\Identifier + ) { + if ($codebase->config->memoize_method_calls || $result->can_memoize) { + $method_var_id = $lhs_var_id . '->' . strtolower($stmt->name->name) . '()'; + + if (isset($context->vars_in_scope[$method_var_id])) { + $result->return_type = clone $context->vars_in_scope[$method_var_id]; + } elseif ($result->return_type !== null) { + $context->vars_in_scope[$method_var_id] = $result->return_type; + $context->vars_in_scope[$method_var_id]->has_mutations = false; + } + + if ($result->can_memoize) { + $stmt->setAttribute('memoizable', true); + } + } + } + + if (count($possible_new_class_types) > 0) { + $class_type = array_reduce( + $possible_new_class_types, + function (?Union $type_1, Union $type_2) use ($codebase): Union { + return Type::combineUnionTypes($type_1, $type_2, $codebase); + } + ); + } + + if ($result->invalid_method_call_types) { + $invalid_class_type = $result->invalid_method_call_types[0]; + + if ($result->has_valid_method_call_type || $result->has_mixed_method_call) { + IssueBuffer::maybeAdd( + new PossiblyInvalidMethodCall( + 'Cannot call method on possible ' . $invalid_class_type . ' variable ' . $lhs_var_id, + new CodeLocation($source, $stmt->name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidMethodCall( + 'Cannot call method on ' . $invalid_class_type . ' variable ' . $lhs_var_id, + new CodeLocation($source, $stmt->name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($result->non_existent_magic_method_ids) { + if ($context->check_methods) { + IssueBuffer::maybeAdd( + new UndefinedMagicMethod( + 'Magic method ' . $result->non_existent_magic_method_ids[0] . ' does not exist', + new CodeLocation($source, $stmt->name), + $result->non_existent_magic_method_ids[0] + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($result->non_existent_class_method_ids) { + if ($context->check_methods) { + if ($result->existent_method_ids || $result->has_mixed_method_call) { + IssueBuffer::maybeAdd( + new PossiblyUndefinedMethod( + 'Method ' . $result->non_existent_class_method_ids[0] . ' does not exist', + new CodeLocation($source, $stmt->name), + $result->non_existent_class_method_ids[0] + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new UndefinedMethod( + 'Method ' . $result->non_existent_class_method_ids[0] . ' does not exist', + new CodeLocation($source, $stmt->name), + $result->non_existent_class_method_ids[0] + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + return true; + } + + if ($result->non_existent_interface_method_ids) { + if ($context->check_methods) { + if ($result->existent_method_ids || $result->has_mixed_method_call) { + IssueBuffer::maybeAdd( + new PossiblyUndefinedMethod( + 'Method ' . $result->non_existent_interface_method_ids[0] . ' does not exist', + new CodeLocation($source, $stmt->name), + $result->non_existent_interface_method_ids[0] + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new UndefinedInterfaceMethod( + 'Method ' . $result->non_existent_interface_method_ids[0] . ' does not exist', + new CodeLocation($source, $stmt->name), + $result->non_existent_interface_method_ids[0] + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + return true; + } + + if ($result->too_many_arguments && $result->too_many_arguments_method_ids) { + $error_method_id = $result->too_many_arguments_method_ids[0]; + + IssueBuffer::maybeAdd( + new TooManyArguments( + 'Too many arguments for method ' . $error_method_id . ' - saw ' . count($stmt->getArgs()), + new CodeLocation($source, $stmt->name), + (string) $error_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($result->too_few_arguments && $result->too_few_arguments_method_ids) { + $error_method_id = $result->too_few_arguments_method_ids[0]; + + IssueBuffer::maybeAdd( + new TooFewArguments( + 'Too few arguments for method ' . $error_method_id . ' saw ' . count($stmt->getArgs()), + new CodeLocation($source, $stmt->name), + (string) $error_method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $stmt_type = $result->return_type; + + if ($stmt_type) { + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + if ($stmt_type->isNever()) { + $context->has_returned = true; + } + } + + if ($result->returns_by_ref) { + if (!$stmt_type) { + $stmt_type = Type::getMixed(); + $statements_analyzer->node_data->setType($stmt, $stmt_type); + } + + $stmt_type->by_ref = $result->returns_by_ref; + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + && $stmt_type + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt->name, + $stmt_type->getId(), + $stmt + ); + } + + if (!$result->existent_method_ids) { + return $stmt->isFirstClassCallable() || self::checkMethodArgs( + null, + $stmt->getArgs(), + null, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer + ); + } + + // if we called a method on this nullable variable, remove the nullable status here + // because any further calls must have worked + if ($lhs_var_id + && !$class_type->isMixed() + && $result->has_valid_method_call_type + && !$result->has_mixed_method_call + && !$result->invalid_method_call_types + && ($class_type->from_docblock || $class_type->isNullable()) + && $real_method_call + ) { + $keys_to_remove = []; + + $class_type = clone $class_type; + + foreach ($class_type->getAtomicTypes() as $key => $type) { + if (!$type instanceof TNamedObject) { + $keys_to_remove[] = $key; + } else { + $type->from_docblock = false; + } + } + + foreach ($keys_to_remove as $key) { + $class_type->removeType($key); + } + + $class_type->from_docblock = false; + + $context->removeVarFromConflictingClauses($lhs_var_id, null, $statements_analyzer); + + $context->vars_in_scope[$lhs_var_id] = $class_type; + } + + return true; + } + + public static function hasNullsafe(PhpParser\Node\Expr $expr): bool + { + if ($expr instanceof PhpParser\Node\Expr\MethodCall + || $expr instanceof PhpParser\Node\Expr\PropertyFetch + ) { + return self::hasNullsafe($expr->var); + } + + return $expr instanceof PhpParser\Node\Expr\NullsafeMethodCall + || $expr instanceof PhpParser\Node\Expr\NullsafePropertyFetch; + } +} 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 new file mode 100644 index 00000000..cb914341 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php @@ -0,0 +1,586 @@ +isFirstClassCallable()) { + return; + } + + $first_arg = $stmt->getArgs()[0] ?? null; + + if ($function_id === 'method_exists') { + $second_arg = $stmt->getArgs()[1] ?? null; + + if ($first_arg + && $first_arg->value instanceof PhpParser\Node\Expr\Variable + && $second_arg + && $second_arg->value instanceof PhpParser\Node\Scalar\String_ + ) { + // do nothing + } else { + $context->check_methods = false; + } + + return; + } + + if ($function_id === 'class_exists') { + if ($first_arg) { + if ($first_arg->value instanceof PhpParser\Node\Scalar\String_) { + if (!$codebase->classlikes->classExists($first_arg->value->value)) { + $context->phantom_classes[strtolower($first_arg->value->value)] = true; + } + } elseif ($first_arg->value instanceof PhpParser\Node\Expr\ClassConstFetch + && $first_arg->value->class instanceof PhpParser\Node\Name + && $first_arg->value->name instanceof PhpParser\Node\Identifier + && $first_arg->value->name->name === 'class' + ) { + $resolved_name = (string) $first_arg->value->class->getAttribute('resolvedName'); + + if (!$codebase->classlikes->classExists($resolved_name)) { + $context->phantom_classes[strtolower($resolved_name)] = true; + } + } + } + + return; + } + + if ($function_id === 'interface_exists') { + if ($first_arg) { + if ($first_arg->value instanceof PhpParser\Node\Scalar\String_) { + $context->phantom_classes[strtolower($first_arg->value->value)] = true; + } elseif ($first_arg->value instanceof PhpParser\Node\Expr\ClassConstFetch + && $first_arg->value->class instanceof PhpParser\Node\Name + && $first_arg->value->name instanceof PhpParser\Node\Identifier + && $first_arg->value->name->name === 'class' + ) { + $resolved_name = (string) $first_arg->value->class->getAttribute('resolvedName'); + + if (!$codebase->classlikes->interfaceExists($resolved_name)) { + $context->phantom_classes[strtolower($resolved_name)] = true; + } + } + } + + return; + } + + if (in_array($function_id, ['is_file', 'file_exists']) && $first_arg) { + $var_id = ExpressionIdentifier::getArrayVarId($first_arg->value, null); + + if ($var_id) { + $context->phantom_files[$var_id] = true; + } + + return; + } + + if ($function_id === 'extension_loaded') { + if ($first_arg + && $first_arg->value instanceof PhpParser\Node\Scalar\String_ + ) { + if (@extension_loaded($first_arg->value->value)) { + // do nothing + } else { + $context->check_classes = false; + } + } + + return; + } + + if ($function_id === 'function_exists') { + $context->check_functions = false; + return; + } + + if ($function_id === 'is_callable') { + $context->check_methods = false; + $context->check_functions = false; + return; + } + + if ($function_id === 'defined') { + $context->check_consts = false; + return; + } + + if ($function_id === 'extract') { + $context->check_variables = false; + + foreach ($context->vars_in_scope as $var_id => $_) { + if ($var_id === '$this' || strpos($var_id, '[') || strpos($var_id, '>')) { + continue; + } + + $mixed_type = Type::getMixed(); + $mixed_type->parent_nodes = $context->vars_in_scope[$var_id]->parent_nodes; + + $context->vars_in_scope[$var_id] = $mixed_type; + $context->assigned_var_ids[$var_id] = (int) $stmt->getAttribute('startFilePos'); + $context->possibly_assigned_var_ids[$var_id] = true; + } + + return; + } + + if ($function_id === 'compact') { + $all_args_string_literals = true; + $new_items = []; + + foreach ($stmt->getArgs() as $arg) { + $arg_type = $statements_analyzer->node_data->getType($arg->value); + + if (!$arg_type || !$arg_type->isSingleStringLiteral()) { + $all_args_string_literals = false; + break; + } + + $var_name = $arg_type->getSingleStringLiteral()->value; + + $new_items[] = new VirtualArrayItem( + new VirtualVariable($var_name, $arg->value->getAttributes()), + new VirtualString($var_name, $arg->value->getAttributes()), + false, + $arg->getAttributes() + ); + } + + if ($all_args_string_literals) { + $arr = new VirtualArray($new_items, $stmt->getAttributes()); + $old_node_data = $statements_analyzer->node_data; + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + ExpressionAnalyzer::analyze($statements_analyzer, $arr, $context); + + $arr_type = $statements_analyzer->node_data->getType($arr); + + $statements_analyzer->node_data = $old_node_data; + + if ($arr_type) { + $statements_analyzer->node_data->setType($stmt, $arr_type); + } + } + + return; + } + + if ($function_id === 'func_get_args') { + $source = $statements_analyzer->getSource(); + + if ($source instanceof FunctionLikeAnalyzer) { + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + foreach ($source->param_nodes as $param_node) { + $statements_analyzer->data_flow_graph->addPath( + $param_node, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use' + ); + } + } + } + + return; + } + + if ($function_id === 'var_dump' + || $function_id === 'shell_exec' + ) { + IssueBuffer::maybeAdd( + new ForbiddenCode( + 'Unsafe ' . implode('', $function_name->parts), + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (isset($codebase->config->forbidden_functions[strtolower((string) $function_name)])) { + IssueBuffer::maybeAdd( + new ForbiddenCode( + 'You have forbidden the use of ' . $function_name, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + if ($function_id === 'define') { + if ($first_arg) { + $fq_const_name = ConstFetchAnalyzer::getConstName( + $first_arg->value, + $statements_analyzer->node_data, + $codebase, + $statements_analyzer->getAliases() + ); + + if ($fq_const_name !== null && isset($stmt->getArgs()[1])) { + $second_arg = $stmt->getArgs()[1]; + $was_in_call = $context->inside_call; + $context->inside_call = true; + ExpressionAnalyzer::analyze($statements_analyzer, $second_arg->value, $context); + $context->inside_call = $was_in_call; + + ConstFetchAnalyzer::setConstType( + $statements_analyzer, + $fq_const_name, + $statements_analyzer->node_data->getType($second_arg->value) ?? Type::getMixed(), + $context + ); + } + } else { + $context->check_consts = false; + } + + return; + } + + if ($function_id === 'constant') { + if ($first_arg) { + $fq_const_name = ConstFetchAnalyzer::getConstName( + $first_arg->value, + $statements_analyzer->node_data, + $codebase, + $statements_analyzer->getAliases() + ); + + if ($fq_const_name !== null) { + $const_type = ConstFetchAnalyzer::getConstType( + $statements_analyzer, + $fq_const_name, + true, + $context + ); + + if ($const_type) { + $statements_analyzer->node_data->setType($real_stmt, $const_type); + } + } + } else { + $context->check_consts = false; + } + } + + if ($first_arg + && $function_id + && strpos($function_id, 'is_') === 0 + && $function_id !== 'is_a' + && !$context->inside_negation + ) { + $stmt_assertions = $statements_analyzer->node_data->getAssertions($stmt); + + $anded_assertions = $stmt_assertions ?? AssertionFinder::processFunctionCall( + $stmt, + $context->self, + $statements_analyzer, + $codebase, + $context->inside_negation + ); + + $changed_vars = []; + + foreach ($anded_assertions as $assertions) { + $referenced_var_ids = array_map( + function (array $_): bool { + return true; + }, + $assertions + ); + + Reconciler::reconcileKeyedTypes( + $assertions, + $assertions, + $context->vars_in_scope, + $changed_vars, + $referenced_var_ids, + $statements_analyzer, + [], + $context->inside_loop, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ); + } + + return; + } + + if ($first_arg && ($function_id === 'array_values' || $function_id === 'ksort')) { + $first_arg_type = $statements_analyzer->node_data->getType($first_arg->value); + + if ($first_arg_type + && UnionTypeComparator::isContainedBy( + $codebase, + $first_arg_type, + Type::getList() + ) + ) { + if ($first_arg_type->from_docblock) { + IssueBuffer::maybeAdd( + new RedundantFunctionCallGivenDocblockType( + "The call to $function_id is unnecessary given the list docblock type $first_arg_type", + new CodeLocation($statements_analyzer, $function_name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RedundantFunctionCall( + "The call to $function_id is unnecessary, $first_arg_type is already a list", + new CodeLocation($statements_analyzer, $function_name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + if ($first_arg && $function_id === 'strtolower') { + $first_arg_type = $statements_analyzer->node_data->getType($first_arg->value); + + if ($first_arg_type + && UnionTypeComparator::isContainedBy( + $codebase, + $first_arg_type, + new Union([new TLowercaseString()]) + ) + ) { + if ($first_arg_type->from_docblock) { + IssueBuffer::maybeAdd( + new RedundantFunctionCallGivenDocblockType( + 'The call to strtolower is unnecessary given the docblock type', + new CodeLocation($statements_analyzer, $function_name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new RedundantFunctionCall( + 'The call to strtolower is unnecessary', + new CodeLocation($statements_analyzer, $function_name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + if ($first_arg + && ($function_id === 'array_walk' + || $function_id === 'array_walk_recursive' + ) + ) { + $first_arg_type = $statements_analyzer->node_data->getType($first_arg->value); + + if ($first_arg_type && $first_arg_type->hasObjectType()) { + if ($first_arg_type->isSingle()) { + IssueBuffer::maybeAdd( + new RawObjectIteration( + 'Possibly undesired iteration over object properties', + new CodeLocation($statements_analyzer, $function_name) + ) + ); + } else { + IssueBuffer::maybeAdd( + new PossibleRawObjectIteration( + 'Possibly undesired iteration over object properties', + new CodeLocation($statements_analyzer, $function_name) + ) + ); + } + } + } + } + + private static function handleDependentTypeFunction( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\FuncCall $stmt, + PhpParser\Node\Expr\FuncCall $real_stmt, + string $function_id, + Context $context + ): void { + $first_arg = $stmt->getArgs()[0] ?? null; + + if ($first_arg) { + $var = $first_arg->value; + + if ($var instanceof PhpParser\Node\Expr\Variable + && is_string($var->name) + ) { + $var_id = '$' . $var->name; + + if (isset($context->vars_in_scope[$var_id])) { + if (!$context->vars_in_scope[$var_id]->hasTemplate()) { + if ($function_id === 'get_class') { + $atomic_type = new TDependentGetClass( + $var_id, + $context->vars_in_scope[$var_id]->hasMixed() + ? Type::getObject() + : $context->vars_in_scope[$var_id] + ); + } elseif ($function_id === 'gettype') { + $atomic_type = new TDependentGetType($var_id); + } else { + $atomic_type = new TDependentGetDebugType($var_id); + } + + $statements_analyzer->node_data->setType($real_stmt, new Union([$atomic_type])); + + return; + } + } + } + + if (($var_type = $statements_analyzer->node_data->getType($var)) + && ($function_id === 'get_class' + || $function_id === 'get_debug_type' + ) + ) { + $class_string_types = []; + + foreach ($var_type->getAtomicTypes() as $class_type) { + if ($class_type instanceof TNamedObject) { + $class_string_types[] = new TClassString($class_type->value, clone $class_type); + } elseif ($class_type instanceof TTemplateParam + && $class_type->as->isSingle() + ) { + $as_atomic_type = $class_type->as->getSingleAtomic(); + + if ($as_atomic_type instanceof TObject) { + $class_string_types[] = new TTemplateParamClass( + $class_type->param_name, + 'object', + null, + $class_type->defining_class + ); + } elseif ($as_atomic_type instanceof TNamedObject) { + $class_string_types[] = new TTemplateParamClass( + $class_type->param_name, + $as_atomic_type->value, + $as_atomic_type, + $class_type->defining_class + ); + } + } elseif ($function_id === 'get_class') { + $class_string_types[] = new TClassString(); + } else { + if ($class_type instanceof TInt) { + $class_string_types[] = new TLiteralString('int'); + } elseif ($class_type instanceof TString) { + $class_string_types[] = new TLiteralString('string'); + } elseif ($class_type instanceof TFloat) { + $class_string_types[] = new TLiteralString('float'); + } elseif ($class_type instanceof TBool) { + $class_string_types[] = new TLiteralString('bool'); + } elseif ($class_type instanceof TClosedResource) { + $class_string_types[] = new TLiteralString('resource (closed)'); + } elseif ($class_type instanceof TNull) { + $class_string_types[] = new TLiteralString('null'); + } else { + $class_string_types[] = new TString(); + } + } + } + + if ($class_string_types) { + $statements_analyzer->node_data->setType($real_stmt, new Union($class_string_types)); + } + } + } elseif ($function_id === 'get_class' + && ($get_class_name = $statements_analyzer->getFQCLN()) + ) { + $statements_analyzer->node_data->setType( + $real_stmt, + new Union([ + new TClassString( + $get_class_name, + new TNamedObject($get_class_name) + ) + ]) + ); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php new file mode 100644 index 00000000..863c38ec --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php @@ -0,0 +1,866 @@ +getCodebase(); + $config = $codebase->config; + + $can_extend = false; + + $from_static = false; + + if ($stmt->class instanceof PhpParser\Node\Name) { + if (!in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true)) { + $aliases = $statements_analyzer->getAliases(); + + if ($context->calling_method_id + && !$stmt->class instanceof PhpParser\Node\Name\FullyQualified + ) { + $codebase->file_reference_provider->addMethodReferenceToClassMember( + $context->calling_method_id, + 'use:' . $stmt->class->parts[0] . ':' . md5($statements_analyzer->getFilePath()), + false + ); + } + + $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( + $stmt->class, + $aliases + ); + + $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); + } elseif ($context->self !== null) { + switch ($stmt->class->parts[0]) { + case 'self': + $class_storage = $codebase->classlike_storage_provider->get($context->self); + $fq_class_name = $class_storage->name; + break; + + case 'parent': + $fq_class_name = $context->parent; + break; + + case 'static': + // @todo maybe we can do better here + $class_storage = $codebase->classlike_storage_provider->get($context->self); + $fq_class_name = $class_storage->name; + + if (!$class_storage->final) { + $can_extend = true; + $from_static = true; + } + + break; + } + } + + if ($codebase->store_node_types + && $fq_class_name + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->class, + $codebase->classlikes->classExists($fq_class_name) + ? $fq_class_name + : '*' + . ($stmt->class instanceof PhpParser\Node\Name\FullyQualified + ? '\\' + : $statements_analyzer->getNamespace() . '-') + . implode('\\', $stmt->class->parts) + ); + } + } elseif ($stmt->class instanceof PhpParser\Node\Stmt\Class_) { + $statements_analyzer->analyze([$stmt->class], $context); + $fq_class_name = ClassAnalyzer::getAnonymousClassName($stmt->class, $statements_analyzer->getFilePath()); + } else { + self::analyzeConstructorExpression( + $statements_analyzer, + $codebase, + $context, + $stmt, + $stmt->class, + $config, + $fq_class_name, + $can_extend + ); + } + + if ($fq_class_name) { + if ($codebase->alter_code + && $stmt->class instanceof PhpParser\Node\Name + && !in_array($stmt->class->parts[0], ['parent', 'static']) + ) { + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $stmt->class, + $fq_class_name, + $context->calling_method_id + ); + } + + if ($context->check_classes) { + if ($context->isPhantomClass($fq_class_name)) { + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ); + + return true; + } + + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $fq_class_name, + new CodeLocation($statements_analyzer->getSource(), $stmt->class), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues() + ) === false) { + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ); + + return true; + } + + if ($codebase->interfaceExists($fq_class_name)) { + if (IssueBuffer::accepts( + new InterfaceInstantiation( + 'Interface ' . $fq_class_name . ' cannot be instantiated', + new CodeLocation($statements_analyzer->getSource(), $stmt->class) + ), + $statements_analyzer->getSuppressedIssues() + )) { + } + + return true; + } + } + + if ($stmt->class instanceof PhpParser\Node\Stmt\Class_) { + $extends = $stmt->class->extends ? (string) $stmt->class->extends : null; + $result_atomic_type = new TAnonymousClassInstance($fq_class_name, false, $extends); + } else { + //if the class is a Name, it can't represent a child + $definite_class = $stmt->class instanceof PhpParser\Node\Name; + $result_atomic_type = new TNamedObject($fq_class_name, $from_static, $definite_class); + } + + $statements_analyzer->node_data->setType( + $stmt, + new Union([$result_atomic_type]) + ); + + if (strtolower($fq_class_name) !== 'stdclass' && + $codebase->classlikes->classExists($fq_class_name) + ) { + self::analyzeNamedConstructor( + $statements_analyzer, + $codebase, + $stmt, + $context, + $fq_class_name, + $from_static, + $can_extend + ); + } else { + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ); + + if ($codebase->classlikes->enumExists($fq_class_name)) { + if (IssueBuffer::accepts(new UndefinedClass( + 'Enums cannot be instantiated', + new CodeLocation($statements_analyzer, $stmt), + $fq_class_name + ))) { + // fall through + } + } + } + } + + if (!$config->remember_property_assignments_after_call && !$context->collect_initializations) { + $context->removeMutableObjectVars(); + } + + return true; + } + + private static function analyzeNamedConstructor( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\New_ $stmt, + Context $context, + string $fq_class_name, + bool $from_static, + bool $can_extend + ): void { + $storage = $codebase->classlike_storage_provider->get($fq_class_name); + + if ($from_static) { + if (!$storage->preserve_constructor_signature) { + IssueBuffer::maybeAdd( + new UnsafeInstantiation( + 'Cannot safely instantiate class ' . $fq_class_name . ' with "new static" as' + . ' its constructor might change in child classes', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($storage->template_types + && !$storage->enforce_template_inheritance + ) { + $source = $statements_analyzer->getSource(); + + if ($source instanceof FunctionLikeAnalyzer) { + $function_storage = $source->getFunctionLikeStorage($statements_analyzer); + + if ($function_storage->return_type + && preg_match('/\bstatic\b/', $function_storage->return_type->getId()) + ) { + IssueBuffer::maybeAdd( + new UnsafeGenericInstantiation( + 'Cannot safely instantiate generic class ' . $fq_class_name + . ' with "new static" as' + . ' its generic parameters may be constrained in child classes.', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + } + + // if we're not calling this constructor via new static() + if ($storage->abstract && !$can_extend) { + if (IssueBuffer::accepts( + new AbstractInstantiation( + 'Unable to instantiate a abstract class ' . $fq_class_name, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return; + } + } + + if ($storage->deprecated && strtolower($fq_class_name) !== strtolower((string)$context->self)) { + IssueBuffer::maybeAdd( + new DeprecatedClass( + $fq_class_name . ' is marked deprecated', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_class_name + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + + if ($context->self + && !$context->collect_initializations + && !$context->collect_mutations + && !NamespaceAnalyzer::isWithinAny($context->self, $storage->internal) + ) { + IssueBuffer::maybeAdd( + new InternalClass( + $fq_class_name . ' is internal to ' . InternalClass::listToPhrase($storage->internal) + . ' but called from ' . $context->self, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_class_name + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $method_id = new MethodIdentifier($fq_class_name, '__construct'); + + if ($codebase->methods->methodExists( + $method_id, + $context->calling_method_id, + $codebase->collect_locations ? new CodeLocation($statements_analyzer->getSource(), $stmt) : null, + $statements_analyzer, + $statements_analyzer->getFilePath() + )) { + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + ArgumentMapPopulator::recordArgumentPositions( + $statements_analyzer, + $stmt, + $codebase, + (string)$method_id + ); + } + + $template_result = new TemplateResult([], []); + + if (self::checkMethodArgs( + $method_id, + $stmt->getArgs(), + $template_result, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer + ) === false) { + return; + } + + if (MethodVisibilityAnalyzer::analyze( + $method_id, + $context, + $statements_analyzer->getSource(), + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues() + ) === false) { + return; + } + + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if ($declaring_method_id) { + $method_storage = $codebase->methods->getStorage($declaring_method_id); + + $caller_identifier = $statements_analyzer->getFullyQualifiedFunctionMethodOrNamespaceName() ?: ''; + if (!NamespaceAnalyzer::isWithinAny($caller_identifier, $method_storage->internal)) { + IssueBuffer::maybeAdd( + new InternalMethod( + 'Constructor ' . $codebase->methods->getCasedMethodId($declaring_method_id) + . ' is internal to ' . InternalClass::listToPhrase($method_storage->internal) + . ' but called from ' . ($caller_identifier ?: 'root namespace'), + new CodeLocation($statements_analyzer, $stmt), + (string) $method_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (!$method_storage->external_mutation_free && !$context->inside_throw) { + if ($context->pure) { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call an impure constructor from a pure context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + } + + $generic_params = $template_result->lower_bounds; + + if ($method_storage->assertions && $stmt->class instanceof PhpParser\Node\Name) { + self::applyAssertionsToContext( + $stmt->class, + null, + $method_storage->assertions, + $stmt->getArgs(), + $generic_params, + $context, + $statements_analyzer + ); + } + + if ($method_storage->if_true_assertions) { + $statements_analyzer->node_data->setIfTrueAssertions( + $stmt, + array_map( + function ($assertion) use ($generic_params, $codebase) { + return $assertion->getUntemplatedCopy($generic_params, null, $codebase); + }, + $method_storage->if_true_assertions + ) + ); + } + + if ($method_storage->if_false_assertions) { + $statements_analyzer->node_data->setIfFalseAssertions( + $stmt, + array_map( + function ($assertion) use ($generic_params, $codebase) { + return $assertion->getUntemplatedCopy($generic_params, null, $codebase); + }, + $method_storage->if_false_assertions + ) + ); + } + } + + $generic_param_types = null; + + if ($storage->template_types) { + foreach ($storage->template_types as $template_name => $base_type) { + if (isset($template_result->lower_bounds[$template_name][$fq_class_name])) { + $generic_param_type = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $template_result->lower_bounds[$template_name][$fq_class_name], + $codebase + ); + } elseif ($storage->template_extended_params && $template_result->lower_bounds) { + $generic_param_type = self::getGenericParamForOffset( + $fq_class_name, + $template_name, + $storage->template_extended_params, + array_map( + function ($type_map) use ($codebase) { + return array_map( + function ($bounds) use ($codebase) { + return TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $bounds, + $codebase + ); + }, + $type_map + ); + }, + $template_result->lower_bounds + ) + ); + } else { + if ($fq_class_name === 'SplObjectStorage') { + $generic_param_type = Type::getEmpty(); + } else { + $generic_param_type = clone array_values($base_type)[0]; + } + } + + $generic_param_type->had_template = true; + + $generic_param_types[] = $generic_param_type; + } + } + + if ($generic_param_types) { + $result_atomic_type = new TGenericObject( + $fq_class_name, + $generic_param_types + ); + + $result_atomic_type->was_static = $from_static; + + $statements_analyzer->node_data->setType( + $stmt, + new Union([$result_atomic_type]) + ); + } + } elseif ($stmt->getArgs()) { + IssueBuffer::maybeAdd( + new TooManyArguments( + 'Class ' . $fq_class_name . ' has no __construct, but arguments were passed', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_class_name . '::__construct' + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($storage->template_types) { + $result_atomic_type = new TGenericObject( + $fq_class_name, + array_values( + array_map( + function ($map) { + return clone reset($map); + }, + $storage->template_types + ) + ) + ); + + $result_atomic_type->was_static = $from_static; + + $statements_analyzer->node_data->setType( + $stmt, + new Union([$result_atomic_type]) + ); + } + + if ($storage->external_mutation_free) { + $stmt->setAttribute('external_mutation_free', true); + $stmt_type = $statements_analyzer->node_data->getType($stmt); + + if ($stmt_type) { + $stmt_type->reference_free = true; + } + } + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + && ($stmt_type = $statements_analyzer->node_data->getType($stmt)) + ) { + $code_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + $method_storage = null; + + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if ($declaring_method_id) { + $method_storage = $codebase->methods->getStorage($declaring_method_id); + } + + if ($storage->external_mutation_free + || ($method_storage && $method_storage->specialize_call) + ) { + $method_source = DataFlowNode::getForMethodReturn( + (string)$method_id, + $fq_class_name . '::__construct', + $storage->location, + $code_location + ); + } else { + $method_source = DataFlowNode::getForMethodReturn( + (string)$method_id, + $fq_class_name . '::__construct', + $storage->location + ); + } + + $statements_analyzer->data_flow_graph->addNode($method_source); + + $stmt_type->parent_nodes = [$method_source->id => $method_source]; + } + } + + private static function analyzeConstructorExpression( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + Context $context, + PhpParser\Node\Expr\New_ $stmt, + PhpParser\Node\Expr $stmt_class, + Config $config, + ?string &$fq_class_name, + bool &$can_extend + ): void { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + ExpressionAnalyzer::analyze($statements_analyzer, $stmt_class, $context); + $context->inside_general_use = $was_inside_general_use; + + $stmt_class_type = $statements_analyzer->node_data->getType($stmt_class); + + if (!$stmt_class_type) { + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ); + + return; + } + + $has_single_class = $stmt_class_type->isSingleStringLiteral(); + + if ($has_single_class) { + $fq_class_name = $stmt_class_type->getSingleStringLiteral()->value; + } else { + if (self::checkMethodArgs( + null, + $stmt->getArgs(), + null, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer + ) === false) { + return; + } + } + + $new_type = null; + + $stmt_class_types = $stmt_class_type->getAtomicTypes(); + + while ($stmt_class_types) { + $lhs_type_part = array_shift($stmt_class_types); + + if ($lhs_type_part instanceof TTemplateParam) { + $stmt_class_types = array_merge($stmt_class_types, $lhs_type_part->as->getAtomicTypes()); + continue; + } + + if ($lhs_type_part instanceof TTemplateParamClass) { + if (!$statements_analyzer->node_data->getType($stmt)) { + $new_type_part = new TTemplateParam( + $lhs_type_part->param_name, + $lhs_type_part->as_type + ? new Union([$lhs_type_part->as_type]) + : Type::getObject(), + $lhs_type_part->defining_class + ); + + if (!$lhs_type_part->as_type) { + IssueBuffer::maybeAdd( + new MixedMethodCall( + 'Cannot call constructor on an unknown class', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $new_type = Type::combineUnionTypes($new_type, new Union([$new_type_part])); + + if ($lhs_type_part->as_type + && $codebase->classlikes->classExists($lhs_type_part->as_type->value) + ) { + $as_storage = $codebase->classlike_storage_provider->get( + $lhs_type_part->as_type->value + ); + + if (!$as_storage->preserve_constructor_signature) { + IssueBuffer::maybeAdd( + new UnsafeInstantiation( + 'Cannot safely instantiate class ' . $lhs_type_part->as_type->value + . ' with "new $class_name" as' + . ' its constructor might change in child classes', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + if ($lhs_type_part->as_type) { + $codebase->methods->methodExists( + new MethodIdentifier( + $lhs_type_part->as_type->value, + '__construct' + ), + $context->calling_method_id, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer->getSource(), $stmt) : null, + $statements_analyzer, + $statements_analyzer->getFilePath() + ); + } + + continue; + } + + if ($lhs_type_part instanceof TLiteralClassString + || $lhs_type_part instanceof TClassString + || $lhs_type_part instanceof TDependentGetClass + ) { + if (!$statements_analyzer->node_data->getType($stmt)) { + if ($lhs_type_part instanceof TClassString) { + $generated_type = $lhs_type_part->as_type + ? clone $lhs_type_part->as_type + : new TObject(); + + if ($lhs_type_part->as_type + && $codebase->classlikes->classExists($lhs_type_part->as_type->value) + ) { + $as_storage = $codebase->classlike_storage_provider->get( + $lhs_type_part->as_type->value + ); + + if (!$as_storage->preserve_constructor_signature) { + IssueBuffer::maybeAdd( + new UnsafeInstantiation( + 'Cannot safely instantiate class ' . $lhs_type_part->as_type->value + . ' with "new $class_name" as' + . ' its constructor might change in child classes', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } elseif ($lhs_type_part instanceof TDependentGetClass) { + $generated_type = new TObject(); + + if ($lhs_type_part->as_type->hasObjectType() + && $lhs_type_part->as_type->isSingle() + ) { + foreach ($lhs_type_part->as_type->getAtomicTypes() as $typeof_type_atomic) { + if ($typeof_type_atomic instanceof TNamedObject) { + $generated_type = new TNamedObject( + $typeof_type_atomic->value + ); + } + } + } + } else { + $generated_type = new TNamedObject( + $lhs_type_part->value + ); + } + + if ($lhs_type_part instanceof TClassString) { + $can_extend = true; + } + + if ($generated_type instanceof TObject) { + IssueBuffer::maybeAdd( + new MixedMethodCall( + 'Cannot call constructor on an unknown class', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $new_type = Type::combineUnionTypes($new_type, new Union([$generated_type])); + } + + continue; + } + + if ($lhs_type_part instanceof TString) { + if ($config->allow_string_standin_for_class + && !$lhs_type_part instanceof TNumericString + ) { + // do nothing + } elseif (IssueBuffer::accepts( + new InvalidStringClass( + 'String cannot be used as a class', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + // fall through + } + } elseif ($lhs_type_part instanceof TMixed) { + IssueBuffer::maybeAdd( + new MixedMethodCall( + 'Cannot call constructor on an unknown class', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($lhs_type_part instanceof TFalse + && $stmt_class_type->ignore_falsable_issues + ) { + // do nothing + } elseif ($lhs_type_part instanceof TNull + && $stmt_class_type->ignore_nullable_issues + ) { + // do nothing + } elseif (IssueBuffer::accepts( + new UndefinedClass( + 'Type ' . $lhs_type_part . ' cannot be called as a class', + new CodeLocation($statements_analyzer->getSource(), $stmt), + (string)$lhs_type_part + ), + $statements_analyzer->getSuppressedIssues() + )) { + // fall through + } + + $new_type = Type::combineUnionTypes($new_type, Type::getObject()); + } + + if (!$has_single_class) { + if ($new_type) { + $statements_analyzer->node_data->setType($stmt, $new_type); + } + + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ); + + return; + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php new file mode 100644 index 00000000..da43d41f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php @@ -0,0 +1,382 @@ +getCodebase(); + $source = $statements_analyzer->getSource(); + + $config = $codebase->config; + + if ($stmt->class instanceof PhpParser\Node\Name) { + $fq_class_name = null; + + if (count($stmt->class->parts) === 1 + && in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true) + ) { + if ($stmt->class->parts[0] === 'parent') { + $child_fq_class_name = $context->self; + + $class_storage = $child_fq_class_name + ? $codebase->classlike_storage_provider->get($child_fq_class_name) + : null; + + if (!$class_storage || !$class_storage->parent_class) { + if (IssueBuffer::accepts( + new ParentNotFound( + 'Cannot call method on parent as this class does not extend another', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + return true; + } + + $fq_class_name = $class_storage->parent_class; + + $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $fq_class_name = $class_storage->name; + } elseif ($context->self) { + if ($stmt->class->parts[0] === 'static' && isset($context->vars_in_scope['$this'])) { + $fq_class_name = (string) $context->vars_in_scope['$this']; + $lhs_type = clone $context->vars_in_scope['$this']; + } else { + $fq_class_name = $context->self; + } + } else { + if (IssueBuffer::accepts( + new NonStaticSelfCall( + 'Cannot use ' . $stmt->class->parts[0] . ' outside class context', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + return true; + } + + if ($context->isPhantomClass($fq_class_name)) { + return true; + } + } elseif ($context->check_classes) { + $aliases = $statements_analyzer->getAliases(); + + if ($context->calling_method_id + && !$stmt->class instanceof PhpParser\Node\Name\FullyQualified + ) { + $codebase->file_reference_provider->addMethodReferenceToClassMember( + $context->calling_method_id, + 'use:' . $stmt->class->parts[0] . ':' . md5($statements_analyzer->getFilePath()), + false + ); + } + + $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( + $stmt->class, + $aliases + ); + + if ($context->isPhantomClass($fq_class_name)) { + return true; + } + + $does_class_exist = false; + + if ($context->self) { + $self_storage = $codebase->classlike_storage_provider->get($context->self); + + if (isset($self_storage->used_traits[strtolower($fq_class_name)])) { + $fq_class_name = $context->self; + $does_class_exist = true; + } + } + + if (!isset($context->phantom_classes[strtolower($fq_class_name)]) + && !$does_class_exist + ) { + $does_class_exist = ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $fq_class_name, + new CodeLocation($source, $stmt->class), + !$context->collect_initializations + && !$context->collect_mutations + ? $context->self + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $context->calling_method_id + : null, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions(false, false, false, true) + ); + } + + if (!$does_class_exist) { + return $does_class_exist !== false; + } + } + + if ($codebase->store_node_types + && $fq_class_name + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->class, + $fq_class_name + ); + } + + if ($fq_class_name && !$lhs_type) { + $lhs_type = new Union([new TNamedObject($fq_class_name)]); + } + } else { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + ExpressionAnalyzer::analyze($statements_analyzer, $stmt->class, $context); + $context->inside_general_use = $was_inside_general_use; + $lhs_type = $statements_analyzer->node_data->getType($stmt->class) ?? Type::getMixed(); + } + + if (!$lhs_type) { + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ) === false) { + return false; + } + + return true; + } + + $has_mock = false; + $moved_call = false; + $has_existing_method = false; + + foreach ($lhs_type->getAtomicTypes() as $lhs_type_part) { + AtomicStaticCallAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context, + $lhs_type_part, + $lhs_type->ignore_nullable_issues, + $moved_call, + $has_mock, + $has_existing_method + ); + } + + if (!$stmt->isFirstClassCallable() && !$has_existing_method) { + return self::checkMethodArgs( + $method_id, + $stmt->getArgs(), + null, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer + ); + } + + if (!$config->remember_property_assignments_after_call && !$context->collect_initializations) { + $context->removeMutableObjectVars(); + } + + if (!$statements_analyzer->node_data->getType($stmt)) { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } + + return true; + } + + public static function taintReturnType( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\StaticCall $stmt, + MethodIdentifier $method_id, + string $cased_method_id, + Union $return_type_candidate, + ?MethodStorage $method_storage, + ?TemplateResult $template_result, + ?Context $context = null + ): void { + if (!$statements_analyzer->data_flow_graph) { + return; + } + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + return; + } + + $node_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + $method_location = $method_storage + ? ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + ? ($method_storage->signature_return_type_location ?: $method_storage->location) + : ($method_storage->return_type_location ?: $method_storage->location)) + : null; + + if ($method_storage && $method_storage->specialize_call) { + $method_source = DataFlowNode::getForMethodReturn( + (string) $method_id, + $cased_method_id, + $method_location, + $node_location + ); + } else { + $method_source = DataFlowNode::getForMethodReturn( + (string) $method_id, + $cased_method_id, + $method_location + ); + } + + $statements_analyzer->data_flow_graph->addNode($method_source); + + $codebase = $statements_analyzer->getCodebase(); + + $conditionally_removed_taints = []; + + if ($method_storage && $template_result) { + foreach ($method_storage->conditionally_removed_taints as $conditionally_removed_taint) { + $conditionally_removed_taint = clone $conditionally_removed_taint; + + TemplateInferredTypeReplacer::replace( + $conditionally_removed_taint, + $template_result, + $codebase + ); + + $expanded_type = TypeExpander::expandUnion( + $statements_analyzer->getCodebase(), + $conditionally_removed_taint, + null, + null, + null, + true, + true + ); + + foreach ($expanded_type->getLiteralStrings() as $literal_string) { + $conditionally_removed_taints[] = $literal_string->value; + } + } + } + + $added_taints = []; + $removed_taints = []; + + if ($context) { + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + } + + if ($conditionally_removed_taints && $method_location) { + $assignment_node = DataFlowNode::getForAssignment( + $method_id . '-escaped', + $method_location, + $method_source->specialization_key + ); + + $statements_analyzer->data_flow_graph->addPath( + $method_source, + $assignment_node, + 'conditionally-escaped', + $added_taints, + array_merge($conditionally_removed_taints, $removed_taints) + ); + + $return_type_candidate->parent_nodes[$assignment_node->id] = $assignment_node; + } else { + $return_type_candidate->parent_nodes = [$method_source->id => $method_source]; + } + + if ($method_storage + && $method_storage->taint_source_types + && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph + ) { + $method_node = TaintSource::getForMethodReturn( + (string) $method_id, + $cased_method_id, + $method_storage->signature_return_type_location ?: $method_storage->location + ); + + $method_node->taints = $method_storage->taint_source_types; + + $statements_analyzer->data_flow_graph->addSource($method_node); + } + + if ($method_storage && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { + FunctionCallReturnTypeFetcher::taintUsingFlows( + $statements_analyzer, + $method_storage, + $statements_analyzer->data_flow_graph, + (string) $method_id, + $stmt->getArgs(), + $node_location, + $method_source, + array_merge($method_storage->removed_taints, $removed_taints), + $added_taints + ); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php new file mode 100644 index 00000000..673dc56c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php @@ -0,0 +1,1136 @@ +value; + + if (!ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $fq_class_name, + new CodeLocation($statements_analyzer, $stmt->class), + !$context->collect_initializations + && !$context->collect_mutations + ? $context->self + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $context->calling_method_id + : null, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions( + $stmt->class instanceof PhpParser\Node\Name + && count($stmt->class->parts) === 1 + && in_array(strtolower($stmt->class->parts[0]), ['self', 'static'], true) + ) + )) { + return; + } + + $intersection_types = $lhs_type_part->extra_types; + } elseif ($lhs_type_part instanceof TClassString + && $lhs_type_part->as_type + ) { + $fq_class_name = $lhs_type_part->as_type->value; + + if (!ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $fq_class_name, + new CodeLocation($statements_analyzer, $stmt->class), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues() + )) { + return; + } + + $intersection_types = $lhs_type_part->as_type->extra_types; + } elseif ($lhs_type_part instanceof TDependentGetClass + && !$lhs_type_part->as_type->hasObject() + ) { + $fq_class_name = 'object'; + + if ($lhs_type_part->as_type->hasObjectType() + && $lhs_type_part->as_type->isSingle() + ) { + foreach ($lhs_type_part->as_type->getAtomicTypes() as $typeof_type_atomic) { + if ($typeof_type_atomic instanceof TNamedObject) { + $fq_class_name = $typeof_type_atomic->value; + } + } + } + + if ($fq_class_name === 'object') { + return; + } + } elseif ($lhs_type_part instanceof TLiteralClassString) { + $fq_class_name = $lhs_type_part->value; + + if (!ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $fq_class_name, + new CodeLocation($statements_analyzer, $stmt->class), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues() + )) { + return; + } + } elseif ($lhs_type_part instanceof TTemplateParam + && !$lhs_type_part->as->isMixed() + && !$lhs_type_part->as->hasObject() + ) { + $fq_class_name = null; + + foreach ($lhs_type_part->as->getAtomicTypes() as $generic_param_type) { + if (!$generic_param_type instanceof TNamedObject) { + return; + } + + $fq_class_name = $generic_param_type->value; + break; + } + + if (!$fq_class_name) { + IssueBuffer::maybeAdd( + new UndefinedClass( + 'Type ' . $lhs_type_part->as . ' cannot be called as a class', + new CodeLocation($statements_analyzer->getSource(), $stmt), + (string) $lhs_type_part + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + } else { + self::handleNonObjectCall( + $statements_analyzer, + $stmt, + $context, + $lhs_type_part, + $ignore_nullable_issues + ); + + return; + } + + $codebase = $statements_analyzer->getCodebase(); + + $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); + + $is_mock = ExpressionAnalyzer::isMock($fq_class_name); + + $has_mock = $has_mock || $is_mock; + + if ($stmt->name instanceof PhpParser\Node\Identifier && !$is_mock) { + self::handleNamedCall( + $statements_analyzer, + $stmt, + $stmt->name, + $context, + $lhs_type_part, + $intersection_types ?: [], + $fq_class_name, + $moved_call, + $has_existing_method + ); + } else { + if ($stmt->name instanceof PhpParser\Node\Expr) { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + + ExpressionAnalyzer::analyze($statements_analyzer, $stmt->name, $context); + + $context->inside_general_use = $was_inside_general_use; + } + + if (!$context->ignore_variable_method) { + $codebase->analyzer->addMixedMemberName( + strtolower($fq_class_name) . '::', + $context->calling_method_id ?: $statements_analyzer->getFileName() + ); + } + + if ($stmt->isFirstClassCallable()) { + $return_type_candidate = null; + if (!$stmt->name instanceof PhpParser\Node\Identifier) { + $method_name_type = $statements_analyzer->node_data->getType($stmt->name); + if ($method_name_type && $method_name_type->isSingleStringLiteral()) { + $method_identifier = new MethodIdentifier( + $fq_class_name, + strtolower($method_name_type->getSingleStringLiteral()->value) + ); + //the call to methodExists will register that the method was called from somewhere + if ($codebase->methods->methodExists( + $method_identifier, + $context->calling_method_id, + null, + $statements_analyzer, + $statements_analyzer->getFilePath(), + true, + $context->insideUse() + )) { + $method_storage = $codebase->methods->getStorage($method_identifier); + + $return_type_candidate = new Union([new TClosure( + 'Closure', + $method_storage->params, + $method_storage->return_type, + $method_storage->pure + )]); + } + } + } + + $statements_analyzer->node_data->setType($stmt, $return_type_candidate ?? Type::getClosure()); + + return; + } + + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ) === false) { + return; + } + } + + if ($codebase->alter_code + && $fq_class_name + && !$moved_call + && $stmt->class instanceof PhpParser\Node\Name + && !in_array($stmt->class->parts[0], ['parent', 'static']) + ) { + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $stmt->class, + $fq_class_name, + $context->calling_method_id, + false, + $stmt->class->parts[0] === 'self' + ); + } + } + + /** + * @psalm-suppress UnusedReturnValue not used but seems important + * @psalm-suppress ComplexMethod to be refactored + */ + private static function handleNamedCall( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\StaticCall $stmt, + PhpParser\Node\Identifier $stmt_name, + Context $context, + Atomic $lhs_type_part, + array $intersection_types, + string $fq_class_name, + bool &$moved_call, + bool &$has_existing_method + ): bool { + $codebase = $statements_analyzer->getCodebase(); + + $method_name_lc = strtolower($stmt_name->name); + $method_id = new MethodIdentifier($fq_class_name, $method_name_lc); + + $cased_method_id = $fq_class_name . '::' . $stmt_name->name; + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + ArgumentMapPopulator::recordArgumentPositions( + $statements_analyzer, + $stmt, + $codebase, + (string) $method_id + ); + } + + if ($intersection_types + && !$codebase->methods->methodExists($method_id) + ) { + foreach ($intersection_types as $intersection_type) { + if (!$intersection_type instanceof TNamedObject) { + continue; + } + + $intersection_method_id = new MethodIdentifier( + $intersection_type->value, + $method_name_lc + ); + + if ($codebase->methods->methodExists($intersection_method_id)) { + $method_id = $intersection_method_id; + $cased_method_id = $intersection_type->value . '::' . $stmt_name->name; + $fq_class_name = $intersection_type->value; + break; + } + } + } + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $naive_method_exists = $codebase->methods->methodExists( + $method_id, + !$context->collect_initializations + && !$context->collect_mutations + ? $context->calling_method_id + : null, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer, $stmt_name) + : null, + $statements_analyzer, + $statements_analyzer->getFilePath(), + false, + $context->insideUse() + ); + + $fake_method_exists = false; + + if (!$naive_method_exists + && $codebase->methods->existence_provider->has($fq_class_name) + ) { + $method_exists = $codebase->methods->existence_provider->doesMethodExist( + $fq_class_name, + $method_id->method_name, + $statements_analyzer, + null + ); + + if ($method_exists) { + $fake_method_exists = true; + } + } + + if ($stmt->isFirstClassCallable()) { + $method_storage = ($class_storage->methods[$method_name_lc] ?? + ($class_storage->pseudo_static_methods[$method_name_lc] ?? null)); + + if ($method_storage) { + $return_type_candidate = new Union([new TClosure( + 'Closure', + $method_storage->params, + $method_storage->return_type, + $method_storage->pure + )]); + } else { + $return_type_candidate = Type::getClosure(); + } + + $statements_analyzer->node_data->setType($stmt, $return_type_candidate); + + return true; + } + + $args = $stmt->getArgs(); + + if (!$naive_method_exists + && $class_storage->mixin_declaring_fqcln + && $class_storage->namedMixins + ) { + foreach ($class_storage->namedMixins as $mixin) { + $new_method_id = new MethodIdentifier( + $mixin->value, + $method_name_lc + ); + + if ($codebase->methods->methodExists( + $new_method_id, + $context->calling_method_id, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer, $stmt_name) + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $statements_analyzer + : null, + $statements_analyzer->getFilePath(), + true, + $context->insideUse() + )) { + $mixin_candidates = []; + foreach ($class_storage->templatedMixins as $mixin_candidate) { + $mixin_candidates[] = clone $mixin_candidate; + } + + foreach ($class_storage->namedMixins as $mixin_candidate) { + $mixin_candidates[] = clone $mixin_candidate; + } + + $mixin_candidates_no_generic = array_filter($mixin_candidates, function ($check): bool { + return !($check instanceof TGenericObject); + }); + + // $mixin_candidates_no_generic will only be empty when there are TGenericObject entries. + // In that case, Union will be initialized with an empty array but + // replaced with non-empty types in the following loop. + /** @psalm-suppress ArgumentTypeCoercion */ + $mixin_candidate_type = new Union($mixin_candidates_no_generic); + + foreach ($mixin_candidates as $tGenericMixin) { + if (!($tGenericMixin instanceof TGenericObject)) { + continue; + } + + $mixin_declaring_class_storage = $codebase->classlike_storage_provider->get( + $class_storage->mixin_declaring_fqcln + ); + + $new_mixin_candidate_type = AtomicPropertyFetchAnalyzer::localizePropertyType( + $codebase, + new Union([$lhs_type_part]), + $tGenericMixin, + $class_storage, + $mixin_declaring_class_storage + ); + + foreach ($mixin_candidate_type->getAtomicTypes() as $type) { + $new_mixin_candidate_type->addType($type); + } + + $mixin_candidate_type = $new_mixin_candidate_type; + } + + $new_lhs_type = TypeExpander::expandUnion( + $codebase, + $mixin_candidate_type, + $fq_class_name, + $fq_class_name, + $class_storage->parent_class, + true, + false, + $class_storage->final + ); + + $mixin_context = clone $context; + $mixin_context->vars_in_scope['$__tmp_mixin_var__'] = $new_lhs_type; + + return self::forwardCallToInstanceMethod( + $statements_analyzer, + $stmt, + $stmt_name, + $mixin_context, + '__tmp_mixin_var__', + true + ); + } + } + } + + $config = $codebase->config; + + $found_method_and_class_storage = self::findPseudoMethodAndClassStorages( + $codebase, + $class_storage, + $method_name_lc + ); + + if (!$naive_method_exists + || !MethodAnalyzer::isMethodVisible( + $method_id, + $context, + $statements_analyzer->getSource() + ) + || $fake_method_exists + || ($found_method_and_class_storage + && ($config->use_phpdoc_method_without_magic_or_parent || $class_storage->parent_class)) + ) { + $callstatic_id = new MethodIdentifier( + $fq_class_name, + '__callstatic' + ); + + if ($codebase->methods->methodExists( + $callstatic_id, + $context->calling_method_id, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer, $stmt_name) + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $statements_analyzer + : null, + $statements_analyzer->getFilePath(), + true, + $context->insideUse() + )) { + $callstatic_appearing_id = $codebase->methods->getAppearingMethodId($callstatic_id); + assert($callstatic_appearing_id !== null); + $callstatic_pure = false; + $callstatic_mutation_free = false; + if ($codebase->methods->hasStorage($callstatic_appearing_id)) { + $callstatic_storage = $codebase->methods->getStorage($callstatic_appearing_id); + $callstatic_pure = $callstatic_storage->pure; + $callstatic_mutation_free = $callstatic_storage->mutation_free; + } + if ($codebase->methods->return_type_provider->has($fq_class_name)) { + $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( + $statements_analyzer, + $method_id->fq_class_name, + $method_id->method_name, + $stmt, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt_name), + null, + null, + strtolower($stmt_name->name) + ); + + if ($return_type_candidate) { + CallAnalyzer::checkMethodArgs( + $method_id, + $stmt->getArgs(), + null, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer + ); + + $statements_analyzer->node_data->setType($stmt, $return_type_candidate); + + return true; + } + } + + if ($found_method_and_class_storage) { + [$pseudo_method_storage, $defining_class_storage] = $found_method_and_class_storage; + + if (self::checkPseudoMethod( + $statements_analyzer, + $stmt, + $method_id, + $fq_class_name, + $args, + $defining_class_storage, + $pseudo_method_storage, + $context + ) === false + ) { + return false; + } + + if (!$context->inside_throw) { + if ($context->pure && !$callstatic_pure) { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call an impure method from a pure context', + new CodeLocation($statements_analyzer, $stmt_name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($context->mutation_free && !$callstatic_mutation_free) { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a possibly-mutating method from a mutation-free context', + new CodeLocation($statements_analyzer, $stmt_name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + && !$callstatic_pure + ) { + if (!$callstatic_mutation_free) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + } + + $statements_analyzer->getSource()->inferred_impure = true; + } + } + + if ($pseudo_method_storage->return_type) { + return true; + } + } else { + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $args, + null, + null, + true, + $context + ) === false) { + return false; + } + } + + $array_values = array_map( + function (PhpParser\Node\Arg $arg): PhpParser\Node\Expr\ArrayItem { + return new VirtualArrayItem( + $arg->value, + null, + false, + $arg->getAttributes() + ); + }, + $args + ); + + $args = [ + new VirtualArg( + new VirtualString((string) $method_id, $stmt_name->getAttributes()), + false, + false, + $stmt_name->getAttributes() + ), + new VirtualArg( + new VirtualArray($array_values, $stmt->getAttributes()), + false, + false, + $stmt->getAttributes() + ), + ]; + + $method_id = new MethodIdentifier( + $fq_class_name, + '__callstatic' + ); + } elseif ($found_method_and_class_storage + && ($config->use_phpdoc_method_without_magic_or_parent || $class_storage->parent_class) + ) { + [$pseudo_method_storage, $defining_class_storage] = $found_method_and_class_storage; + + if (self::checkPseudoMethod( + $statements_analyzer, + $stmt, + $method_id, + $fq_class_name, + $args, + $defining_class_storage, + $pseudo_method_storage, + $context + ) === false + ) { + return false; + } + + if ($pseudo_method_storage->return_type) { + return true; + } + } elseif ($stmt->class instanceof PhpParser\Node\Name && $stmt->class->parts[0] === 'parent' + && !$codebase->methodExists($method_id) + && !$statements_analyzer->isStatic() + ) { + // In case of parent::xxx() call on instance method context (i.e. not static context) + // with nonexistent method, we try to forward to instance method call for resolve pseudo method. + + // Use parent type as static type for the method call + $tmp_context = clone $context; + $tmp_context->vars_in_scope['$__tmp_parent_var__'] = new Union([$lhs_type_part]); + + if (self::forwardCallToInstanceMethod( + $statements_analyzer, + $stmt, + $stmt_name, + $tmp_context, + '__tmp_parent_var__' + ) === false) { + return false; + } + + unset($tmp_context); + + // Resolve actual static return type according to caller (i.e. $this) static type + if (isset($context->vars_in_scope['$this']) + && $method_call_type = $statements_analyzer->node_data->getType($stmt) + ) { + $method_call_type = clone $method_call_type; + + foreach ($method_call_type->getAtomicTypes() as $name => $type) { + if ($type instanceof TNamedObject && $type->was_static && $type->value === $fq_class_name) { + // Replace parent&static type to actual static type + $method_call_type->removeType($name); + $method_call_type->addType($context->vars_in_scope['$this']->getSingleAtomic()); + } + } + + $statements_analyzer->node_data->setType($stmt, $method_call_type); + } + + return true; + } + + if (!$context->check_methods) { + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ) === false) { + return false; + } + + return true; + } + } + + $does_method_exist = MethodAnalyzer::checkMethodExists( + $codebase, + $method_id, + new CodeLocation($statements_analyzer, $stmt), + $statements_analyzer->getSuppressedIssues(), + $context->calling_method_id + ); + + if (!$does_method_exist) { + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $stmt->getArgs(), + null, + null, + true, + $context + ) === false) { + return false; + } + + if ($codebase->alter_code && $fq_class_name && !$moved_call) { + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $stmt->class, + $fq_class_name, + $context->calling_method_id + ); + } + + return true; + } + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + if ($class_storage->deprecated && $fq_class_name !== $context->self) { + IssueBuffer::maybeAdd( + new DeprecatedClass( + $fq_class_name . ' is marked deprecated', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_class_name + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($context->self && ! NamespaceAnalyzer::isWithinAny($context->self, $class_storage->internal)) { + IssueBuffer::maybeAdd( + new InternalClass( + $fq_class_name . ' is internal to ' . InternalClass::listToPhrase($class_storage->internal) + . ' but called from ' . $context->self, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_class_name + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (MethodVisibilityAnalyzer::analyze( + $method_id, + $context, + $statements_analyzer->getSource(), + new CodeLocation($statements_analyzer, $stmt), + $statements_analyzer->getSuppressedIssues() + ) === false) { + return false; + } + + if ((!$stmt->class instanceof PhpParser\Node\Name + || $stmt->class->parts[0] !== 'parent' + || $statements_analyzer->isStatic()) + && ( + !$context->self + || $statements_analyzer->isStatic() + || !$codebase->classExtends($context->self, $fq_class_name) + ) + ) { + if (MethodAnalyzer::checkStatic( + $method_id, + ($stmt->class instanceof PhpParser\Node\Name + && strtolower($stmt->class->parts[0]) === 'self') + || $context->self === $fq_class_name, + !$statements_analyzer->isStatic(), + $codebase, + new CodeLocation($statements_analyzer, $stmt), + $statements_analyzer->getSuppressedIssues(), + $is_dynamic_this_method + ) === false) { + // fall through + } + + if ($is_dynamic_this_method) { + return self::forwardCallToInstanceMethod( + $statements_analyzer, + $stmt, + $stmt_name, + $context + ); + } + } + + $has_existing_method = true; + + ExistingAtomicStaticCallAnalyzer::analyze( + $statements_analyzer, + $stmt, + $stmt_name, + $args, + $context, + $lhs_type_part, + $method_id, + $cased_method_id, + $class_storage, + $moved_call + ); + + return true; + } + + /** + * @param list $args + * @return false|null + */ + private static function checkPseudoMethod( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\StaticCall $stmt, + MethodIdentifier $method_id, + string $static_fq_class_name, + array $args, + ClassLikeStorage $class_storage, + MethodStorage $pseudo_method_storage, + Context $context + ): ?bool { + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $args, + $pseudo_method_storage->params, + (string) $method_id, + true, + $context + ) === false) { + return false; + } + + $codebase = $statements_analyzer->getCodebase(); + + if (ArgumentsAnalyzer::checkArgumentsMatch( + $statements_analyzer, + $args, + $method_id, + $pseudo_method_storage->params, + $pseudo_method_storage, + null, + null, + new CodeLocation($statements_analyzer, $stmt), + $context + ) === false) { + return false; + } + + $method_storage = null; + + if ($statements_analyzer->data_flow_graph) { + try { + $method_storage = $codebase->methods->getStorage($method_id); + + ArgumentsAnalyzer::analyze( + $statements_analyzer, + $args, + $method_storage->params, + (string) $method_id, + true, + $context + ); + + ArgumentsAnalyzer::checkArgumentsMatch( + $statements_analyzer, + $args, + $method_id, + $method_storage->params, + $method_storage, + null, + null, + new CodeLocation($statements_analyzer, $stmt), + $context + ); + } catch (Exception $e) { + // do nothing + } + } + + if ($pseudo_method_storage->return_type) { + $return_type_candidate = clone $pseudo_method_storage->return_type; + + $return_type_candidate = TypeExpander::expandUnion( + $statements_analyzer->getCodebase(), + $return_type_candidate, + $class_storage->name, + $static_fq_class_name, + $class_storage->parent_class + ); + + if ($method_storage) { + StaticCallAnalyzer::taintReturnType( + $statements_analyzer, + $stmt, + $method_id, + (string) $method_id, + $return_type_candidate, + $method_storage, + null, + $context + ); + } + + $stmt_type = $statements_analyzer->node_data->getType($stmt); + + $statements_analyzer->node_data->setType( + $stmt, + Type::combineUnionTypes( + $return_type_candidate, + $stmt_type + ) + ); + } + + return null; + } + + public static function handleNonObjectCall( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\StaticCall $stmt, + Context $context, + Atomic $lhs_type_part, + bool $ignore_nullable_issues + ): void { + $codebase = $statements_analyzer->getCodebase(); + $config = $codebase->config; + + if ($lhs_type_part instanceof TMixed + || $lhs_type_part instanceof TTemplateParam + || $lhs_type_part instanceof TClassString + || $lhs_type_part instanceof TObject + ) { + if ($stmt->name instanceof PhpParser\Node\Identifier) { + $codebase->analyzer->addMixedMemberName( + strtolower($stmt->name->name), + $context->calling_method_id ?: $statements_analyzer->getFileName() + ); + } + + IssueBuffer::maybeAdd( + new MixedMethodCall( + 'Cannot call method on an unknown class', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + if ($lhs_type_part instanceof TString) { + if ($config->allow_string_standin_for_class + && !$lhs_type_part instanceof TNumericString + ) { + return; + } + + IssueBuffer::maybeAdd( + new InvalidStringClass( + 'String cannot be used as a class', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + if ($lhs_type_part instanceof TNull + && $ignore_nullable_issues + ) { + return; + } + + IssueBuffer::maybeAdd( + new UndefinedClass( + 'Type ' . $lhs_type_part . ' cannot be called as a class', + new CodeLocation($statements_analyzer->getSource(), $stmt), + (string) $lhs_type_part + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + /** + * Try to find matching pseudo method over ancestors (including interfaces). + * + * Returns the pseudo method if exists, with its defining class storage. + * If the method is not declared, null is returned. + * + * @param Codebase $codebase + * @param ClassLikeStorage $static_class_storage The called class + * @param lowercase-string $method_name_lc + * + * @return array{MethodStorage, ClassLikeStorage}|null + */ + private static function findPseudoMethodAndClassStorages( + Codebase $codebase, + ClassLikeStorage $static_class_storage, + string $method_name_lc + ): ?array { + if ($pseudo_method_storage = $static_class_storage->pseudo_static_methods[$method_name_lc] ?? null) { + return [$pseudo_method_storage, $static_class_storage]; + } + + $ancestors = $static_class_storage->class_implements + $static_class_storage->parent_classes; + + foreach ($ancestors as $fq_class_name => $_) { + $class_storage = $codebase->classlikes->getStorageFor($fq_class_name); + + if ($class_storage && isset($class_storage->pseudo_static_methods[$method_name_lc])) { + return [ + $class_storage->pseudo_static_methods[$method_name_lc], + $class_storage + ]; + } + } + + return null; + } + + /** + * Forward static call to instance call, using `VirtualMethodCall` and `MethodCallAnalyzer::analyze()` + * The resolved method return type will be set as type of the $stmt node. + * + * @param StatementsAnalyzer $statements_analyzer + * @param PhpParser\Node\Expr\StaticCall $stmt + * @param PhpParser\Node\Identifier $stmt_name + * @param Context $context + * @param string $virtual_var_name Temporary var name to use for create the fake MethodCall statement. + * @param bool $always_set_node_type If true, when the method has no declared typed, mixed will be set on node. + * + * @return bool Result of analysis. False if the call is invalid. + * + * @see MethodCallAnalyzer::analyze() + */ + private static function forwardCallToInstanceMethod( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\StaticCall $stmt, + PhpParser\Node\Identifier $stmt_name, + Context $context, + string $virtual_var_name = 'this', + bool $always_set_node_type = false + ): bool { + $old_data_provider = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $fake_method_call_expr = new VirtualMethodCall( + new VirtualVariable($virtual_var_name, $stmt->class->getAttributes()), + $stmt_name, + $stmt->getArgs(), + $stmt->getAttributes() + ); + + if (MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_method_call_expr, + $context + ) === false) { + return false; + } + + $fake_method_call_type = $statements_analyzer->node_data->getType($fake_method_call_expr); + + $statements_analyzer->node_data = $old_data_provider; + + if ($fake_method_call_type) { + $statements_analyzer->node_data->setType($stmt, $fake_method_call_type); + } elseif ($always_set_node_type) { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php new file mode 100644 index 00000000..3785023e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php @@ -0,0 +1,642 @@ + $args + */ + public static function analyze( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\StaticCall $stmt, + PhpParser\Node\Identifier $stmt_name, + array $args, + Context $context, + Atomic $lhs_type_part, + MethodIdentifier $method_id, + string $cased_method_id, + ClassLikeStorage $class_storage, + bool &$moved_call + ): void { + $fq_class_name = $method_id->fq_class_name; + $method_name_lc = $method_id->method_name; + + $codebase = $statements_analyzer->getCodebase(); + $config = $codebase->config; + + if (MethodCallProhibitionAnalyzer::analyze( + $codebase, + $context, + $method_id, + $statements_analyzer->getFullyQualifiedFunctionMethodOrNamespaceName(), + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues() + ) === false) { + // fall through + } + + if ($class_storage->user_defined + && $context->self + && ($context->collect_mutations || $context->collect_initializations) + ) { + $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); + + if (!$appearing_method_id) { + return; + } + + $appearing_method_class_name = $appearing_method_id->fq_class_name; + + if ($codebase->classExtends($context->self, $appearing_method_class_name)) { + $old_context_include_location = $context->include_location; + $old_self = $context->self; + $context->include_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + $context->self = $appearing_method_class_name; + + $file_analyzer = $statements_analyzer->getFileAnalyzer(); + + if ($context->collect_mutations) { + $file_analyzer->getMethodMutations($appearing_method_id, $context); + } else { + // collecting initializations + $local_vars_in_scope = []; + $local_vars_possibly_in_scope = []; + + foreach ($context->vars_in_scope as $var => $_) { + if (strpos($var, '$this->') !== 0 && $var !== '$this') { + $local_vars_in_scope[$var] = $context->vars_in_scope[$var]; + } + } + + foreach ($context->vars_possibly_in_scope as $var => $_) { + if (strpos($var, '$this->') !== 0 && $var !== '$this') { + $local_vars_possibly_in_scope[$var] = $context->vars_possibly_in_scope[$var]; + } + } + + if (!isset($context->initialized_methods[(string) $appearing_method_id])) { + if ($context->initialized_methods === null) { + $context->initialized_methods = []; + } + + $context->initialized_methods[(string) $appearing_method_id] = true; + + $file_analyzer->getMethodMutations($appearing_method_id, $context); + + foreach ($local_vars_in_scope as $var => $type) { + $context->vars_in_scope[$var] = $type; + } + + foreach ($local_vars_possibly_in_scope as $var => $type) { + $context->vars_possibly_in_scope[$var] = $type; + } + } + } + + $context->include_location = $old_context_include_location; + $context->self = $old_self; + } + } + + $found_generic_params = ClassTemplateParamCollector::collect( + $codebase, + $class_storage, + $class_storage, + $method_name_lc, + $lhs_type_part, + !$statements_analyzer->isStatic() && $method_id->fq_class_name === $context->self + ); + + if ($found_generic_params + && $stmt->class instanceof PhpParser\Node\Name + && $stmt->class->parts === ['parent'] + && $context->self + && ($self_class_storage = $codebase->classlike_storage_provider->get($context->self)) + && $self_class_storage->template_extended_params + ) { + foreach ($self_class_storage->template_extended_params as $template_fq_class_name => $extended_types) { + foreach ($extended_types as $type_key => $extended_type) { + if (isset($found_generic_params[$type_key][$template_fq_class_name])) { + $found_generic_params[$type_key][$template_fq_class_name] = clone $extended_type; + continue; + } + + foreach ($extended_type->getAtomicTypes() as $t) { + if ($t instanceof TTemplateParam + && isset($found_generic_params[$t->param_name][$t->defining_class]) + ) { + $found_generic_params[$type_key][$template_fq_class_name] + = $found_generic_params[$t->param_name][$t->defining_class]; + } else { + $found_generic_params[$type_key][$template_fq_class_name] + = clone $extended_type; + break; + } + } + } + } + } + + $template_result = new TemplateResult([], $found_generic_params ?: []); + + if (CallAnalyzer::checkMethodArgs( + $method_id, + $args, + $template_result, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer + ) === false) { + return; + } + + $fq_class_name = $stmt->class instanceof PhpParser\Node\Name && $stmt->class->parts === ['parent'] + ? (string) $statements_analyzer->getFQCLN() + : $fq_class_name; + + $self_fq_class_name = $fq_class_name; + + $return_type_candidate = null; + + if ($codebase->methods->return_type_provider->has($fq_class_name)) { + $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( + $statements_analyzer, + $fq_class_name, + $stmt_name->name, + $stmt, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt_name) + ); + } + + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if (!$return_type_candidate + && $declaring_method_id + && (string) $declaring_method_id !== (string) $method_id + ) { + $declaring_fq_class_name = $declaring_method_id->fq_class_name; + $declaring_method_name = $declaring_method_id->method_name; + + if ($codebase->methods->return_type_provider->has($declaring_fq_class_name)) { + $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( + $statements_analyzer, + $declaring_fq_class_name, + $declaring_method_name, + $stmt, + $context, + new CodeLocation($statements_analyzer->getSource(), $stmt_name), + null, + $fq_class_name, + $stmt_name->name + ); + } + } + + if (!$return_type_candidate) { + $return_type_candidate = self::getMethodReturnType( + $statements_analyzer, + $codebase, + $stmt, + $method_id, + $args, + $template_result, + $self_fq_class_name, + $lhs_type_part, + $context, + $fq_class_name, + $class_storage, + $config + ); + } + + $method_storage = $codebase->methods->getUserMethodStorage($method_id); + + if ($method_storage) { + if ($method_storage->abstract + && $stmt->class instanceof PhpParser\Node\Name + && (!$context->self + || !UnionTypeComparator::isContainedBy( + $codebase, + $context->vars_in_scope['$this'] + ?? new Union([ + new TNamedObject($context->self) + ]), + new Union([ + new TNamedObject($method_id->fq_class_name) + ]) + )) + ) { + IssueBuffer::maybeAdd( + new AbstractMethodCall( + 'Cannot call an abstract static method ' . $method_id . ' directly', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (!$context->inside_throw) { + if ($context->pure && !$method_storage->pure) { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call an impure method from a pure context', + new CodeLocation($statements_analyzer, $stmt_name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($context->mutation_free && !$method_storage->mutation_free) { + IssueBuffer::maybeAdd( + new ImpureMethodCall( + 'Cannot call a possibly-mutating method from a mutation-free context', + new CodeLocation($statements_analyzer, $stmt_name) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + && !$method_storage->pure + ) { + if (!$method_storage->mutation_free) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + } + + $statements_analyzer->getSource()->inferred_impure = true; + } + } + + $generic_params = $template_result->lower_bounds; + + if ($method_storage->assertions) { + CallAnalyzer::applyAssertionsToContext( + $stmt_name, + null, + $method_storage->assertions, + $stmt->getArgs(), + $generic_params, + $context, + $statements_analyzer + ); + } + + if ($method_storage->if_true_assertions) { + $statements_analyzer->node_data->setIfTrueAssertions( + $stmt, + array_map( + function (Assertion $assertion) use ($generic_params, $codebase): Assertion { + return $assertion->getUntemplatedCopy($generic_params, null, $codebase); + }, + $method_storage->if_true_assertions + ) + ); + } + + if ($method_storage->if_false_assertions) { + $statements_analyzer->node_data->setIfFalseAssertions( + $stmt, + array_map( + function (Assertion $assertion) use ($generic_params, $codebase): Assertion { + return $assertion->getUntemplatedCopy($generic_params, null, $codebase); + }, + $method_storage->if_false_assertions + ) + ); + } + } + + if ($codebase->alter_code) { + foreach ($codebase->call_transforms as $original_pattern => $transformation) { + if ($declaring_method_id + && strtolower((string) $declaring_method_id) . '\((.*\))' === $original_pattern + ) { + if (strpos($transformation, '($1)') === strlen($transformation) - 4 + && $stmt->class instanceof PhpParser\Node\Name + ) { + $new_method_id = substr($transformation, 0, -4); + $old_declaring_fq_class_name = $declaring_method_id->fq_class_name; + [$new_fq_class_name, $new_method_name] = explode('::', $new_method_id); + + if ($codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $stmt->class, + $new_fq_class_name, + $context->calling_method_id, + strtolower($old_declaring_fq_class_name) !== strtolower($new_fq_class_name), + $stmt->class->parts[0] === 'self' + )) { + $moved_call = true; + } + + $file_manipulations = []; + + $file_manipulations[] = new FileManipulation( + (int) $stmt_name->getAttribute('startFilePos'), + (int) $stmt_name->getAttribute('endFilePos') + 1, + $new_method_name + ); + + FileManipulationBuffer::add( + $statements_analyzer->getFilePath(), + $file_manipulations + ); + } + } + } + } + + if ($config->eventDispatcher->hasAfterMethodCallAnalysisHandlers()) { + $file_manipulations = []; + + $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); + + if ($appearing_method_id !== null && $declaring_method_id) { + $event = new AfterMethodCallAnalysisEvent( + $stmt, + (string) $method_id, + (string) $appearing_method_id, + (string) $declaring_method_id, + $context, + $statements_analyzer, + $codebase, + $file_manipulations, + $return_type_candidate + ); + $config->eventDispatcher->dispatchAfterMethodCallAnalysis($event); + $file_manipulations = $event->getFileReplacements(); + $return_type_candidate = $event->getReturnTypeCandidate(); + } + + if ($file_manipulations) { + FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); + } + } + + $return_type_candidate = $return_type_candidate ?? Type::getMixed(); + + StaticCallAnalyzer::taintReturnType( + $statements_analyzer, + $stmt, + $method_id, + $cased_method_id, + $return_type_candidate, + $method_storage, + $template_result, + $context + ); + + $stmt_type = $statements_analyzer->node_data->getType($stmt); + $statements_analyzer->node_data->setType( + $stmt, + Type::combineUnionTypes($stmt_type, $return_type_candidate) + ); + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->name, + $method_id . '()' + ); + + if ($stmt_type = $statements_analyzer->node_data->getType($stmt)) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt->name, + $stmt_type->getId(), + $stmt + ); + } + } + } + + /** + * @param list $args + */ + private static function getMethodReturnType( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\StaticCall $stmt, + MethodIdentifier $method_id, + array $args, + TemplateResult $template_result, + ?string &$self_fq_class_name, + Atomic $lhs_type_part, + Context $context, + string $fq_class_name, + ClassLikeStorage $class_storage, + Config $config + ): ?Union { + $return_type_candidate = $codebase->methods->getMethodReturnType( + $method_id, + $self_fq_class_name, + $statements_analyzer, + $args + ); + + if ($return_type_candidate) { + $return_type_candidate = clone $return_type_candidate; + + if ($template_result->template_types) { + $bindable_template_types = $return_type_candidate->getTemplateTypes(); + + foreach ($bindable_template_types as $template_type) { + if (!isset( + $template_result->lower_bounds + [$template_type->param_name] + [$template_type->defining_class] + )) { + if ($template_type->param_name === 'TFunctionArgCount') { + $template_result->lower_bounds[$template_type->param_name] = [ + 'fn-' . strtolower((string)$method_id) => [ + new TemplateBound( + Type::getInt(false, count($stmt->getArgs())) + ) + ] + ]; + } elseif ($template_type->param_name === 'TPhpMajorVersion') { + $template_result->lower_bounds[$template_type->param_name] = [ + 'fn-' . strtolower((string)$method_id) => [ + new TemplateBound( + Type::getInt(false, $codebase->php_major_version) + ) + ] + ]; + } elseif ($template_type->param_name === 'TPhpVersionId') { + $template_result->lower_bounds[$template_type->param_name] = [ + 'fn-' . strtolower((string) $method_id) => [ + new TemplateBound( + Type::getInt( + false, + 10000 * $codebase->php_major_version + + 100 * $codebase->php_minor_version + ) + ) + ] + ]; + } else { + $template_result->lower_bounds[$template_type->param_name] = [ + ($template_type->defining_class) => [ + new TemplateBound(Type::getEmpty()) + ] + ]; + } + } + } + } + + $context_final = false; + + if ($lhs_type_part instanceof TTemplateParam) { + $static_type = $lhs_type_part; + } elseif ($lhs_type_part instanceof TTemplateParamClass) { + $static_type = new TTemplateParam( + $lhs_type_part->param_name, + $lhs_type_part->as_type + ? new Union([$lhs_type_part->as_type]) + : Type::getObject(), + $lhs_type_part->defining_class + ); + } elseif ($stmt->class instanceof PhpParser\Node\Name + && count($stmt->class->parts) === 1 + && in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true) + && $lhs_type_part instanceof TNamedObject + && $context->self + ) { + $static_type = $context->self; + $context_final = $codebase->classlike_storage_provider->get($context->self)->final; + } elseif ($context->calling_method_id !== null) { + // differentiate between these cases: + // 1. "static" comes from the CALLED static method - use $fq_class_name. + // 2. "static" in return type comes from return type of the + // method CALLING the currently analyzed static method - use $context->self. + $static_type = self::hasStaticInType($return_type_candidate) + ? $fq_class_name + : $context->self; + } else { + $static_type = $fq_class_name; + } + + if ($template_result->lower_bounds) { + $return_type_candidate = TypeExpander::expandUnion( + $codebase, + $return_type_candidate, + null, + null, + null + ); + + TemplateInferredTypeReplacer::replace( + $return_type_candidate, + $template_result, + $codebase + ); + } + + $return_type_candidate = TypeExpander::expandUnion( + $codebase, + $return_type_candidate, + $self_fq_class_name, + $static_type, + $class_storage->parent_class, + true, + false, + is_string($static_type) + && ($static_type !== $context->self + || $class_storage->final + || $context_final) + ); + + $secondary_return_type_location = null; + + $return_type_location = $codebase->methods->getMethodReturnTypeLocation( + $method_id, + $secondary_return_type_location + ); + + if ($secondary_return_type_location) { + $return_type_location = $secondary_return_type_location; + } + + // only check the type locally if it's defined externally + if ($return_type_location && !$config->isInProjectDirs($return_type_location->file_path)) { + $return_type_candidate->check( + $statements_analyzer, + new CodeLocation($statements_analyzer, $stmt), + $statements_analyzer->getSuppressedIssues(), + $context->phantom_classes, + true, + false, + false, + $context->calling_method_id + ); + } + } + + return $return_type_candidate; + } + + /** + * Dumb way to determine whether a type contains "static" somewhere inside. + */ + private static function hasStaticInType(Type\TypeNode $type): bool + { + if ($type instanceof TNamedObject && ($type->value === 'static' || $type->was_static)) { + return true; + } + + foreach ($type->getChildNodes() as $child_type) { + if (self::hasStaticInType($child_type)) { + return true; + } + } + + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php new file mode 100644 index 00000000..9cc9d850 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php @@ -0,0 +1,1171 @@ +getFQCLN(); + + $project_analyzer = $source->getFileAnalyzer()->project_analyzer; + $codebase = $source->getCodebase(); + + if ($context->collect_mutations && + $context->self && + ( + $context->self === $fq_class_name || + $codebase->classExtends( + $context->self, + $fq_class_name + ) + ) + ) { + $method_id = new MethodIdentifier( + $fq_class_name, + $method_name_lc + ); + + if ((string) $method_id !== $source->getId()) { + if ($context->collect_initializations) { + if (isset($context->initialized_methods[(string) $method_id])) { + return; + } + + if ($context->initialized_methods === null) { + $context->initialized_methods = []; + } + + $context->initialized_methods[(string) $method_id] = true; + } + + $project_analyzer->getMethodMutations( + $method_id, + $context, + $source->getRootFilePath(), + $source->getRootFileName() + ); + } + } elseif ($context->collect_initializations && + $context->self && + ( + $context->self === $fq_class_name + || $codebase->classlikes->classExtends( + $context->self, + $fq_class_name + ) + ) && + $source->getMethodName() !== $method_name + ) { + $method_id = new MethodIdentifier($fq_class_name, $method_name_lc); + + $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if (isset($context->vars_in_scope['$this'])) { + foreach ($context->vars_in_scope['$this']->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TNamedObject) { + if ($fq_class_name === $atomic_type->value) { + $alt_declaring_method_id = $declaring_method_id; + } else { + $fq_class_name = $atomic_type->value; + + $method_id = new MethodIdentifier( + $fq_class_name, + $method_name_lc + ); + + $alt_declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + } + + if ($alt_declaring_method_id) { + $declaring_method_id = $alt_declaring_method_id; + break; + } + + if (!$atomic_type->extra_types) { + continue; + } + + foreach ($atomic_type->extra_types as $intersection_type) { + if ($intersection_type instanceof TNamedObject) { + $fq_class_name = $intersection_type->value; + $method_id = new MethodIdentifier( + $fq_class_name, + $method_name_lc + ); + + $alt_declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if ($alt_declaring_method_id) { + $declaring_method_id = $alt_declaring_method_id; + break 2; + } + } + } + } + } + } + + if (!$declaring_method_id) { + // can happen for __call + return; + } + + if (isset($context->initialized_methods[(string) $declaring_method_id])) { + return; + } + + if ($context->initialized_methods === null) { + $context->initialized_methods = []; + } + + $context->initialized_methods[(string) $declaring_method_id] = true; + + $method_storage = $codebase->methods->getStorage($declaring_method_id); + + $class_analyzer = $source->getSource(); + + $is_final = $method_storage->final; + + if ($method_name !== $declaring_method_id->method_name) { + $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); + + if ($appearing_method_id) { + $appearing_class_storage = $codebase->classlike_storage_provider->get( + $appearing_method_id->fq_class_name + ); + + if (isset($appearing_class_storage->trait_final_map[$method_name_lc])) { + $is_final = true; + } + } + } + + if ($class_analyzer instanceof ClassLikeAnalyzer + && !$method_storage->is_static + && ($context->collect_nonprivate_initializations + || $method_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE + || $is_final) + ) { + $local_vars_in_scope = []; + + foreach ($context->vars_in_scope as $var_id => $type) { + if (strpos($var_id, '$this->') === 0) { + if ($type->initialized) { + $local_vars_in_scope[$var_id] = $context->vars_in_scope[$var_id]; + + unset($context->vars_in_scope[$var_id]); + unset($context->vars_possibly_in_scope[$var_id]); + } + } elseif ($var_id !== '$this') { + $local_vars_in_scope[$var_id] = $context->vars_in_scope[$var_id]; + } + } + + $local_vars_possibly_in_scope = $context->vars_possibly_in_scope; + + $old_calling_method_id = $context->calling_method_id; + + if ($fq_class_name === $source->getFQCLN()) { + $class_analyzer->getMethodMutations($declaring_method_id->method_name, $context); + } else { + $declaring_fq_class_name = $declaring_method_id->fq_class_name; + + $old_self = $context->self; + $context->self = $declaring_fq_class_name; + $project_analyzer->getMethodMutations( + $declaring_method_id, + $context, + $source->getRootFilePath(), + $source->getRootFileName() + ); + $context->self = $old_self; + } + + $context->calling_method_id = $old_calling_method_id; + + foreach ($local_vars_in_scope as $var => $type) { + $context->vars_in_scope[$var] = $type; + } + + foreach ($local_vars_possibly_in_scope as $var => $_) { + $context->vars_possibly_in_scope[$var] = true; + } + } + } + } + + /** + * @param list $args + */ + public static function checkMethodArgs( + ?MethodIdentifier $method_id, + array $args, + ?TemplateResult $class_template_result, + Context $context, + CodeLocation $code_location, + StatementsAnalyzer $statements_analyzer + ): bool { + $codebase = $statements_analyzer->getCodebase(); + + if (!$method_id) { + return ArgumentsAnalyzer::analyze( + $statements_analyzer, + $args, + null, + null, + true, + $context, + $class_template_result + ) !== false; + } + + $method_params = $codebase->methods->getMethodParams($method_id, $statements_analyzer, $args, $context); + + $fq_class_name = $method_id->fq_class_name; + $method_name = $method_id->method_name; + + $fq_class_name = strtolower($codebase->classlikes->getUnAliasedName($fq_class_name)); + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $method_storage = null; + + if (isset($class_storage->declaring_method_ids[$method_name])) { + $declaring_method_id = $class_storage->declaring_method_ids[$method_name]; + + $declaring_fq_class_name = $declaring_method_id->fq_class_name; + $declaring_method_name = $declaring_method_id->method_name; + + if ($declaring_fq_class_name !== $fq_class_name) { + $declaring_class_storage = $codebase->classlike_storage_provider->get($declaring_fq_class_name); + } else { + $declaring_class_storage = $class_storage; + } + + if (!isset($declaring_class_storage->methods[$declaring_method_name])) { + throw new UnexpectedValueException('Storage should not be empty here'); + } + + $method_storage = $declaring_class_storage->methods[$declaring_method_name]; + + if ($declaring_class_storage->user_defined + && !$method_storage->has_docblock_param_types + && isset($declaring_class_storage->documenting_method_ids[$method_name]) + ) { + $documenting_method_id = $declaring_class_storage->documenting_method_ids[$method_name]; + + $documenting_method_storage = $codebase->methods->getStorage($documenting_method_id); + + if ($documenting_method_storage->template_types) { + $method_storage = $documenting_method_storage; + } + } + + if (!$context->isSuppressingExceptions($statements_analyzer)) { + $context->mergeFunctionExceptions($method_storage, $code_location); + } + } + + if (ArgumentsAnalyzer::analyze( + $statements_analyzer, + $args, + $method_params, + (string) $method_id, + $method_storage->allow_named_arg_calls ?? true, + $context, + $class_template_result + ) === false) { + return false; + } + + if (ArgumentsAnalyzer::checkArgumentsMatch( + $statements_analyzer, + $args, + $method_id, + $method_params, + $method_storage, + $class_storage, + $class_template_result, + $code_location, + $context + ) === false) { + return false; + } + + if ($class_template_result) { + self::checkTemplateResult( + $statements_analyzer, + $class_template_result, + $code_location, + strtolower((string) $method_id) + ); + } + + return true; + } + + /** + * This gets all the template params (and their types) that we think + * we'll need to know about + * + * @return array> + * @param array> $existing_template_types + * @param array> $class_template_params + */ + public static function getTemplateTypesForCall( + Codebase $codebase, + ?ClassLikeStorage $declaring_class_storage, + ?string $appearing_class_name, + ?ClassLikeStorage $calling_class_storage, + array $existing_template_types = [], + array $class_template_params = [] + ): array { + $template_types = $existing_template_types; + + if ($declaring_class_storage) { + if ($calling_class_storage + && $declaring_class_storage !== $calling_class_storage + && $calling_class_storage->template_extended_params + ) { + foreach ($calling_class_storage->template_extended_params as $class_name => $type_map) { + foreach ($type_map as $template_name => $type) { + if ($class_name === $declaring_class_storage->name) { + $output_type = null; + + foreach ($type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TTemplateParam) { + $output_type_candidate = self::getGenericParamForOffset( + $atomic_type->defining_class, + $atomic_type->param_name, + $calling_class_storage->template_extended_params, + $class_template_params + $template_types + ); + } else { + $output_type_candidate = new Union([$atomic_type]); + } + + $output_type = Type::combineUnionTypes( + $output_type_candidate, + $output_type + ); + } + + $template_types[$template_name][$declaring_class_storage->name] = $output_type; + } + } + } + } elseif ($declaring_class_storage->template_types) { + foreach ($declaring_class_storage->template_types as $template_name => $type_map) { + foreach ($type_map as $key => $type) { + $template_types[$template_name][$key] + = $class_template_params[$template_name][$key] ?? $type; + } + } + } + } + + foreach ($template_types as $key => $type_map) { + foreach ($type_map as $class => $type) { + $template_types[$key][$class] = TypeExpander::expandUnion( + $codebase, + $type, + $appearing_class_name, + $calling_class_storage->name ?? null, + null, + true, + false, + $calling_class_storage->final ?? false + ); + } + } + + return $template_types; + } + + /** + * @param array> $template_extended_params + * @param array> $found_generic_params + */ + public static function getGenericParamForOffset( + string $fq_class_name, + string $template_name, + array $template_extended_params, + array $found_generic_params + ): Union { + if (isset($found_generic_params[$template_name][$fq_class_name])) { + return $found_generic_params[$template_name][$fq_class_name]; + } + + foreach ($template_extended_params as $extended_class_name => $type_map) { + foreach ($type_map as $extended_template_name => $extended_type) { + foreach ($extended_type->getAtomicTypes() as $extended_atomic_type) { + if ($extended_atomic_type instanceof TTemplateParam + && $extended_atomic_type->param_name === $template_name + && $extended_atomic_type->defining_class === $fq_class_name + ) { + return self::getGenericParamForOffset( + $extended_class_name, + $extended_template_name, + $template_extended_params, + $found_generic_params + ); + } + } + } + } + + return Type::getMixed(); + } + + /** + * @param PhpParser\Node\Scalar\String_|PhpParser\Node\Expr\Array_|PhpParser\Node\Expr\BinaryOp\Concat $callable_arg + * + * @return list + * + * @psalm-suppress LessSpecificReturnStatement + * @psalm-suppress MoreSpecificReturnType + */ + public static function getFunctionIdsFromCallableArg( + FileSource $file_source, + PhpParser\Node\Expr $callable_arg + ): array { + if ($callable_arg instanceof PhpParser\Node\Expr\BinaryOp\Concat) { + if ($callable_arg->left instanceof PhpParser\Node\Expr\ClassConstFetch + && $callable_arg->left->class instanceof Name + && $callable_arg->left->name instanceof Identifier + && strtolower($callable_arg->left->name->name) === 'class' + && !in_array(strtolower($callable_arg->left->class->parts[0]), ['self', 'static', 'parent']) + && $callable_arg->right instanceof PhpParser\Node\Scalar\String_ + && preg_match('/^::[A-Za-z0-9]+$/', $callable_arg->right->value) + ) { + return [ + (string) $callable_arg->left->class->getAttribute('resolvedName') . $callable_arg->right->value + ]; + } + + return []; + } + + if ($callable_arg instanceof PhpParser\Node\Scalar\String_) { + $potential_id = preg_replace('/^\\\/', '', $callable_arg->value); + + if (preg_match('/^[A-Za-z0-9_]+(\\\[A-Za-z0-9_]+)*(::[A-Za-z0-9_]+)?$/', $potential_id)) { + return [$potential_id]; + } + + return []; + } + + if (count($callable_arg->items) !== 2) { + return []; + } + + /** @psalm-suppress PossiblyNullPropertyFetch */ + if ($callable_arg->items[0]->key || $callable_arg->items[1]->key) { + return []; + } + + if (!isset($callable_arg->items[0]) || !isset($callable_arg->items[1])) { + throw new UnexpectedValueException('These should never be unset'); + } + + $class_arg = $callable_arg->items[0]->value; + $method_name_arg = $callable_arg->items[1]->value; + + if (!$method_name_arg instanceof PhpParser\Node\Scalar\String_) { + return []; + } + + if ($class_arg instanceof PhpParser\Node\Scalar\String_) { + return [preg_replace('/^\\\/', '', $class_arg->value) . '::' . $method_name_arg->value]; + } + + if ($class_arg instanceof PhpParser\Node\Expr\ClassConstFetch + && $class_arg->name instanceof Identifier + && strtolower($class_arg->name->name) === 'class' + && $class_arg->class instanceof Name + ) { + $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( + $class_arg->class, + $file_source->getAliases() + ); + + return [$fq_class_name . '::' . $method_name_arg->value]; + } + + if (!$file_source instanceof StatementsAnalyzer + || !($class_arg_type = $file_source->node_data->getType($class_arg)) + ) { + return []; + } + + $method_ids = []; + + foreach ($class_arg_type->getAtomicTypes() as $type_part) { + if ($type_part instanceof TNamedObject) { + $method_id = $type_part->value . '::' . $method_name_arg->value; + + if ($type_part->extra_types) { + foreach ($type_part->extra_types as $extra_type) { + if ($extra_type instanceof TTemplateParam + || $extra_type instanceof TObjectWithProperties + ) { + throw new UnexpectedValueException('Shouldn’t get a generic param here'); + } + + $method_id .= '&' . $extra_type->value . '::' . $method_name_arg->value; + } + } + + $method_ids[] = '$' . $method_id; + } + } + + return $method_ids; + } + + /** + * @param non-empty-string $function_id + * @param bool $can_be_in_root_scope if true, the function can be shortened to the root version + * + */ + public static function checkFunctionExists( + StatementsAnalyzer $statements_analyzer, + string &$function_id, + CodeLocation $code_location, + bool $can_be_in_root_scope + ): bool { + $cased_function_id = $function_id; + $function_id = strtolower($function_id); + + $codebase = $statements_analyzer->getCodebase(); + + if (!$codebase->functions->functionExists($statements_analyzer, $function_id)) { + /** @var non-empty-lowercase-string */ + $root_function_id = preg_replace('/.*\\\/', '', $function_id); + + if ($can_be_in_root_scope + && $function_id !== $root_function_id + && $codebase->functions->functionExists($statements_analyzer, $root_function_id) + ) { + $function_id = $root_function_id; + } else { + IssueBuffer::maybeAdd( + new UndefinedFunction( + 'Function ' . $cased_function_id . ' does not exist', + $code_location, + $function_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + return false; + } + } + + return true; + } + + /** + * @param Identifier|Name $expr + * @param Assertion[] $assertions + * @param list $args + * @param array>> $inferred_lower_bounds, + * + */ + public static function applyAssertionsToContext( + PhpParser\NodeAbstract $expr, + ?string $thisName, + array $assertions, + array $args, + array $inferred_lower_bounds, + Context $context, + StatementsAnalyzer $statements_analyzer + ): void { + $type_assertions = []; + + $asserted_keys = []; + + foreach ($assertions as $assertion) { + $assertion_var_id = null; + + $arg_value = null; + + if (is_int($assertion->var_id)) { + if (!isset($args[$assertion->var_id])) { + continue; + } + + $arg_value = $args[$assertion->var_id]->value; + + $arg_var_id = ExpressionIdentifier::getArrayVarId($arg_value, null, $statements_analyzer); + + if ($arg_var_id) { + $assertion_var_id = $arg_var_id; + } + } elseif ($assertion->var_id === '$this' && $thisName !== null) { + $assertion_var_id = $thisName; + } elseif (strpos($assertion->var_id, '$this->') === 0 && $thisName !== null) { + $assertion_var_id = $thisName . str_replace('$this->', '->', $assertion->var_id); + } elseif (strpos($assertion->var_id, 'self::') === 0 && $context->self) { + $assertion_var_id = $context->self . str_replace('self::', '::', $assertion->var_id); + } elseif (strpos($assertion->var_id, '::$') !== false) { + // allow assertions to bring external static props into scope + $assertion_var_id = $assertion->var_id; + } elseif (isset($context->vars_in_scope[$assertion->var_id])) { + $assertion_var_id = $assertion->var_id; + } elseif (strpos($assertion->var_id, '->') !== false) { + $exploded = explode('->', $assertion->var_id); + + if (count($exploded) < 2) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Assert notation is malformed', + new CodeLocation($statements_analyzer, $expr) + ) + ); + continue; + } + + [$var_id, $property] = $exploded; + + $var_id = is_numeric($var_id) ? (int) $var_id : $var_id; + + if (!is_int($var_id) || !isset($args[$var_id])) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Variable ' . $var_id . ' is not an argument so cannot be asserted', + new CodeLocation($statements_analyzer, $expr) + ) + ); + continue; + } + + /** @var PhpParser\Node\Expr\Variable $arg_value */ + $arg_value = $args[$var_id]->value; + + $arg_var_id = ExpressionIdentifier::getArrayVarId($arg_value, null, $statements_analyzer); + + if (!$arg_var_id) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Variable being asserted as argument ' . ($var_id+1) . ' cannot be found in local scope', + new CodeLocation($statements_analyzer, $expr) + ) + ); + continue; + } + + if (count($exploded) === 2) { + $failedMessage = AssertionFinder::isPropertyImmutableOnArgument( + $property, + $statements_analyzer->getNodeTypeProvider(), + $statements_analyzer->getCodebase()->classlike_storage_provider, + $arg_value + ); + + if (null !== $failedMessage) { + IssueBuffer::maybeAdd( + new InvalidDocblock($failedMessage, new CodeLocation($statements_analyzer, $expr)) + ); + continue; + } + } + + $assertion_var_id = str_replace((string) $var_id, $arg_var_id, $assertion->var_id); + } + + $codebase = $statements_analyzer->getCodebase(); + + if ($assertion_var_id) { + $rule = $assertion->rule[0][0]; + + $prefix = ''; + if ($rule[0] === '!') { + $prefix .= '!'; + $rule = substr($rule, 1); + } + if ($rule[0] === '=') { + $prefix .= '='; + $rule = substr($rule, 1); + } + if ($rule[0] === '~') { + $prefix .= '~'; + $rule = substr($rule, 1); + } + + if (isset($inferred_lower_bounds[$rule])) { + foreach ($inferred_lower_bounds[$rule] as $lower_bounds) { + $lower_bound_type = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $lower_bounds, + $codebase + ); + + if ($lower_bound_type->hasMixed()) { + continue 2; + } + + $replacement_atomic_types = $lower_bound_type->getAtomicTypes(); + + if (count($replacement_atomic_types) > 1) { + continue 2; + } + + $ored_type_assertions = []; + + foreach ($replacement_atomic_types as $replacement_atomic_type) { + if ($replacement_atomic_type instanceof TMixed) { + continue 3; + } + + if ($replacement_atomic_type instanceof TArray + || $replacement_atomic_type instanceof TKeyedArray + || $replacement_atomic_type instanceof TList + ) { + $ored_type_assertions[] = $prefix . $replacement_atomic_type->getId(); + } elseif ($replacement_atomic_type instanceof TNamedObject) { + $ored_type_assertions[] = $prefix . $replacement_atomic_type->value; + } elseif ($replacement_atomic_type instanceof Scalar) { + $ored_type_assertions[] = $prefix . $replacement_atomic_type->getAssertionString(); + } elseif ($replacement_atomic_type instanceof TNull) { + $ored_type_assertions[] = $prefix . 'null'; + } elseif ($replacement_atomic_type instanceof TTemplateParam) { + $ored_type_assertions[] = $prefix . $replacement_atomic_type->param_name; + } + } + + if ($ored_type_assertions) { + $type_assertions[$assertion_var_id] = [$ored_type_assertions]; + } + } + } else { + if (isset($type_assertions[$assertion_var_id])) { + $type_assertions[$assertion_var_id] = array_merge( + $type_assertions[$assertion_var_id], + $assertion->rule + ); + } else { + $type_assertions[$assertion_var_id] = $assertion->rule; + } + } + } elseif ($arg_value && ($assertion->rule === [['!falsy']] || $assertion->rule === [['true']])) { + if ($assertion->rule === [['true']]) { + $conditional = new VirtualIdentical( + $arg_value, + new VirtualConstFetch(new VirtualName('true')) + ); + + $assert_clauses = FormulaGenerator::getFormula( + mt_rand(0, 1000000), + mt_rand(0, 1000000), + $conditional, + $context->self, + $statements_analyzer, + $codebase + ); + } else { + $assert_clauses = FormulaGenerator::getFormula( + spl_object_id($arg_value), + spl_object_id($arg_value), + $arg_value, + $context->self, + $statements_analyzer, + $statements_analyzer->getCodebase() + ); + } + + $simplified_clauses = Algebra::simplifyCNF( + array_merge($context->clauses, $assert_clauses) + ); + + $assert_type_assertions = Algebra::getTruthsFromFormula( + $simplified_clauses + ); + + $type_assertions = array_merge($type_assertions, $assert_type_assertions); + } elseif ($arg_value && $assertion->rule === [['falsy']]) { + $assert_clauses = Algebra::negateFormula( + FormulaGenerator::getFormula( + spl_object_id($arg_value), + spl_object_id($arg_value), + $arg_value, + $context->self, + $statements_analyzer, + $codebase + ) + ); + + $simplified_clauses = Algebra::simplifyCNF( + array_merge($context->clauses, $assert_clauses) + ); + + $assert_type_assertions = Algebra::getTruthsFromFormula( + $simplified_clauses + ); + + $type_assertions = array_merge($type_assertions, $assert_type_assertions); + } + } + + $changed_var_ids = []; + + foreach ($type_assertions as $var_id => $_) { + $asserted_keys[$var_id] = true; + } + + $codebase = $statements_analyzer->getCodebase(); + + if ($type_assertions) { + $template_type_map = array_map( + function ($type_map) use ($codebase) { + return array_map( + function ($bounds) use ($codebase) { + return TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $bounds, + $codebase + ); + }, + $type_map + ); + }, + $inferred_lower_bounds + ); + + foreach (($statements_analyzer->getTemplateTypeMap() ?: []) as $template_name => $map) { + foreach ($map as $ref => $type) { + $template_type_map[$template_name][$ref] = new Union([ + new TTemplateParam( + $template_name, + $type, + $ref + ) + ]); + } + } + + // while in an and, we allow scope to boil over to support + // statements of the form if ($x && $x->foo()) + $op_vars_in_scope = Reconciler::reconcileKeyedTypes( + $type_assertions, + $type_assertions, + $context->vars_in_scope, + $changed_var_ids, + $asserted_keys, + $statements_analyzer, + $template_type_map, + $context->inside_loop, + new CodeLocation($statements_analyzer->getSource(), $expr) + ); + + foreach ($changed_var_ids as $var_id => $_) { + if (isset($op_vars_in_scope[$var_id])) { + $first_appearance = $statements_analyzer->getFirstAppearance($var_id); + + if ($first_appearance + && isset($context->vars_in_scope[$var_id]) + && $context->vars_in_scope[$var_id]->hasMixed() + ) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->decrementMixedCount($statements_analyzer->getFilePath()); + } + + IssueBuffer::remove( + $statements_analyzer->getFilePath(), + 'MixedAssignment', + $first_appearance->raw_file_start + ); + } + + if ($template_type_map) { + $readonly_template_result = new TemplateResult($template_type_map, $template_type_map); + + TemplateInferredTypeReplacer::replace( + $op_vars_in_scope[$var_id], + $readonly_template_result, + $codebase + ); + } + + $op_vars_in_scope[$var_id]->from_docblock = true; + + foreach ($op_vars_in_scope[$var_id]->getAtomicTypes() as $changed_atomic_type) { + $changed_atomic_type->from_docblock = true; + + if ($changed_atomic_type instanceof TNamedObject + && $changed_atomic_type->extra_types + ) { + foreach ($changed_atomic_type->extra_types as $extra_type) { + $extra_type->from_docblock = true; + } + } + } + } + } + + $context->vars_in_scope = $op_vars_in_scope; + } + } + + /** + * This method looks for problems with a generated TemplateResult. + * + * The TemplateResult object contains upper bounds and lower bounds for each template param. + * + * Those upper bounds represent a series of constraints like + * + * Lower bound: + * T >: X (the type param T matches X, or is a supertype of X) + * Upper bound: + * T <: Y (the type param T matches Y, or is a subtype of Y) + * Equality (currently represented as an upper bound with a special flag) + * T = Z (the template T must match Z) + * + * This method attempts to reconcile those constraints. + * + * Valid constraints: + * + * T <: int|float, T >: int --- implies T is an int + * T = int --- implies T is an int + * + * Invalid constraints: + * + * T <: int|string, T >: string|float --- implies T <: int and T >: float, which is impossible + * T = int, T = string --- implies T is a string _and_ and int, which is impossible + */ + public static function checkTemplateResult( + StatementsAnalyzer $statements_analyzer, + TemplateResult $template_result, + CodeLocation $code_location, + ?string $function_id + ): void { + if ($template_result->lower_bounds && $template_result->upper_bounds) { + foreach ($template_result->upper_bounds as $template_name => $defining_map) { + foreach ($defining_map as $defining_id => $upper_bound) { + if (isset($template_result->lower_bounds[$template_name][$defining_id])) { + $lower_bound_type = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $template_result->lower_bounds[$template_name][$defining_id], + $statements_analyzer->getCodebase() + ); + + $upper_bound_type = $upper_bound->type; + + $union_comparison_result = new TypeComparisonResult(); + + if (count($template_result->upper_bounds_unintersectable_types) > 1) { + [$lower_bound_type, $upper_bound_type] + = $template_result->upper_bounds_unintersectable_types; + } + + if (!UnionTypeComparator::isContainedBy( + $statements_analyzer->getCodebase(), + $lower_bound_type, + $upper_bound_type, + false, + false, + $union_comparison_result + )) { + if ($union_comparison_result->type_coerced) { + if ($union_comparison_result->type_coerced_from_mixed) { + IssueBuffer::maybeAdd( + new MixedArgumentTypeCoercion( + 'Type ' . $lower_bound_type->getId() . ' should be a subtype of ' + . $upper_bound_type->getId(), + $code_location, + $function_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new ArgumentTypeCoercion( + 'Type ' . $lower_bound_type->getId() . ' should be a subtype of ' + . $upper_bound_type->getId(), + $code_location, + $function_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } elseif ($union_comparison_result->scalar_type_match_found) { + IssueBuffer::maybeAdd( + new InvalidScalarArgument( + 'Type ' . $lower_bound_type->getId() . ' should be a subtype of ' + . $upper_bound_type->getId(), + $code_location, + $function_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidArgument( + 'Type ' . $lower_bound_type->getId() . ' should be a subtype of ' + . $upper_bound_type->getId(), + $code_location, + $function_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } else { + $template_result->lower_bounds[$template_name][$defining_id] = [ + new TemplateBound( + clone $upper_bound->type + ) + ]; + } + } + } + } + + // Attempt to identify invalid lower bounds + foreach ($template_result->lower_bounds as $template_name => $lower_bounds) { + foreach ($lower_bounds as $lower_bounds) { + if (count($lower_bounds) > 1) { + $bounds_with_equality = array_filter( + $lower_bounds, + function ($lower_bound) { + return (bool)$lower_bound->equality_bound_classlike; + } + ); + + if (!$bounds_with_equality) { + continue; + } + + $equality_types = array_unique( + array_map( + function ($bound_with_equality) { + return $bound_with_equality->type->getId(); + }, + $bounds_with_equality + ) + ); + + if (count($equality_types) > 1) { + IssueBuffer::maybeAdd( + new InvalidArgument( + 'Incompatible types found for ' . $template_name . ' (must have only one of ' . + implode(', ', $equality_types) . ')', + $code_location, + $function_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + foreach ($lower_bounds as $lower_bound) { + if ($lower_bound->equality_bound_classlike === null) { + foreach ($bounds_with_equality as $bound_with_equality) { + if (UnionTypeComparator::isContainedBy( + $statements_analyzer->getCodebase(), + $lower_bound->type, + $bound_with_equality->type + ) && UnionTypeComparator::isContainedBy( + $statements_analyzer->getCodebase(), + $bound_with_equality->type, + $lower_bound->type + )) { + continue 2; + } + } + + IssueBuffer::maybeAdd( + new InvalidArgument( + 'Incompatible types found for ' . $template_name . ' (' . + $lower_bound->type->getId() . ' is not in ' . + implode(', ', $equality_types) . ')', + $code_location, + $function_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + } + } + } + } +} 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 new file mode 100644 index 00000000..439ee3bf --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php @@ -0,0 +1,538 @@ +expr, $context) === false) { + return false; + } + + $as_int = true; + $valid_int_type = null; + $maybe_type = $statements_analyzer->node_data->getType($stmt->expr); + + if ($maybe_type) { + if ($maybe_type->isInt()) { + $valid_int_type = $maybe_type; + if (!$maybe_type->from_calculation) { + self::handleRedundantCast($maybe_type, $statements_analyzer, $stmt); + } + } + + if (count($maybe_type->getAtomicTypes()) === 1 + && $maybe_type->getSingleAtomic() instanceof TBool) { + $as_int = false; + $type = new Union([ + new TLiteralInt(0), + new TLiteralInt(1), + ]); + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + ) { + $type->parent_nodes = $maybe_type->parent_nodes; + } + + $statements_analyzer->node_data->setType($stmt, $type); + } + } + + if ($as_int) { + $type = $valid_int_type ?? Type::getInt(); + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + ) { + $type->parent_nodes = $maybe_type->parent_nodes ?? []; + } + + $statements_analyzer->node_data->setType($stmt, $type); + } + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\Double) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + return false; + } + + $maybe_type = $statements_analyzer->node_data->getType($stmt->expr); + + if ($maybe_type) { + if ($maybe_type->isFloat()) { + self::handleRedundantCast($maybe_type, $statements_analyzer, $stmt); + } + } + + $type = Type::getFloat(); + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + ) { + $type->parent_nodes = $maybe_type->parent_nodes ?? []; + } + + $statements_analyzer->node_data->setType($stmt, $type); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\Bool_) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + return false; + } + + $maybe_type = $statements_analyzer->node_data->getType($stmt->expr); + + if ($maybe_type) { + if ($maybe_type->isBool()) { + self::handleRedundantCast($maybe_type, $statements_analyzer, $stmt); + } + } + + $type = Type::getBool(); + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + ) { + $type->parent_nodes = $maybe_type->parent_nodes ?? []; + } + + $statements_analyzer->node_data->setType($stmt, $type); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\String_) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + return false; + } + + $stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr); + + if ($stmt_expr_type) { + if ($stmt_expr_type->isString()) { + self::handleRedundantCast($stmt_expr_type, $statements_analyzer, $stmt); + } + + $stmt_type = self::castStringAttempt( + $statements_analyzer, + $context, + $stmt_expr_type, + $stmt->expr, + true + ); + } else { + $stmt_type = Type::getString(); + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\Object_) { + if (!self::checkExprGeneralUse($statements_analyzer, $stmt, $context)) { + return false; + } + + $permissible_atomic_types = []; + $all_permissible = false; + + if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { + if ($stmt_expr_type->isObjectType()) { + self::handleRedundantCast($stmt_expr_type, $statements_analyzer, $stmt); + } + + $all_permissible = true; + + foreach ($stmt_expr_type->getAtomicTypes() as $type) { + if ($type instanceof Scalar) { + $objWithProps = new TObjectWithProperties(['scalar' => new Union([$type])]); + $permissible_atomic_types[] = $objWithProps; + } elseif ($type instanceof TKeyedArray) { + $permissible_atomic_types[] = new TObjectWithProperties($type->properties); + } else { + $all_permissible = false; + break; + } + } + } + + if ($permissible_atomic_types && $all_permissible) { + $type = TypeCombiner::combine($permissible_atomic_types); + } else { + $type = Type::getObject(); + } + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph + ) { + $type->parent_nodes = $stmt_expr_type->parent_nodes ?? []; + } + + $statements_analyzer->node_data->setType($stmt, $type); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\Array_) { + if (!self::checkExprGeneralUse($statements_analyzer, $stmt, $context)) { + return false; + } + + $permissible_atomic_types = []; + $all_permissible = false; + + if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { + if ($stmt_expr_type->isArray()) { + self::handleRedundantCast($stmt_expr_type, $statements_analyzer, $stmt); + } + + $all_permissible = true; + + foreach ($stmt_expr_type->getAtomicTypes() as $type) { + if ($type instanceof Scalar) { + $keyed_array = new TKeyedArray([new Union([$type])]); + $keyed_array->is_list = true; + $keyed_array->sealed = true; + $permissible_atomic_types[] = $keyed_array; + } elseif ($type instanceof TNull) { + $permissible_atomic_types[] = new TArray([Type::getEmpty(), Type::getEmpty()]); + } elseif ($type instanceof TArray + || $type instanceof TList + || $type instanceof TKeyedArray + ) { + $permissible_atomic_types[] = clone $type; + } else { + $all_permissible = false; + break; + } + } + } + + if ($permissible_atomic_types && $all_permissible) { + $type = TypeCombiner::combine($permissible_atomic_types); + } else { + $type = Type::getArray(); + } + + if ($statements_analyzer->data_flow_graph) { + $type->parent_nodes = $stmt_expr_type->parent_nodes ?? []; + } + + $statements_analyzer->node_data->setType($stmt, $type); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\Unset_ + && $statements_analyzer->getCodebase()->php_major_version < 8 + ) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + return false; + } + + $statements_analyzer->node_data->setType($stmt, Type::getNull()); + + return true; + } + + IssueBuffer::maybeAdd( + new UnrecognizedExpression( + 'Psalm does not understand the cast ' . get_class($stmt), + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return false; + } + + public static function castStringAttempt( + StatementsAnalyzer $statements_analyzer, + Context $context, + Union $stmt_type, + PhpParser\Node\Expr $stmt, + bool $explicit_cast = false + ): Union { + $codebase = $statements_analyzer->getCodebase(); + + $invalid_casts = []; + $valid_strings = []; + $castable_types = []; + + $atomic_types = $stmt_type->getAtomicTypes(); + + $parent_nodes = []; + + if ($statements_analyzer->data_flow_graph) { + $parent_nodes = $stmt_type->parent_nodes; + } + + while ($atomic_types) { + $atomic_type = array_pop($atomic_types); + + if ($atomic_type instanceof TFloat + || $atomic_type instanceof TInt + || $atomic_type instanceof TNumeric + ) { + if ($atomic_type instanceof TLiteralInt || $atomic_type instanceof TLiteralFloat) { + $castable_types[] = new TLiteralString((string) $atomic_type->value); + } elseif ($atomic_type instanceof TNonspecificLiteralInt) { + $castable_types[] = new TNonspecificLiteralString(); + } else { + $castable_types[] = new TNumericString(); + } + + continue; + } + + if ($atomic_type instanceof TString) { + $valid_strings[] = $atomic_type; + + continue; + } + + if ($atomic_type instanceof TNull + || $atomic_type instanceof TFalse + ) { + $valid_strings[] = new TLiteralString(''); + continue; + } + + if ($atomic_type instanceof TMixed + || $atomic_type instanceof TResource + || $atomic_type instanceof Scalar + ) { + $castable_types[] = new TString(); + + continue; + } + + if ($atomic_type instanceof TNamedObject + || $atomic_type instanceof TObjectWithProperties + ) { + $intersection_types = [$atomic_type]; + + if ($atomic_type->extra_types) { + $intersection_types = array_merge($intersection_types, $atomic_type->extra_types); + } + + foreach ($intersection_types as $intersection_type) { + if ($intersection_type instanceof TNamedObject) { + $intersection_method_id = new MethodIdentifier( + $intersection_type->value, + '__tostring' + ); + + if ($codebase->methods->methodExists( + $intersection_method_id, + $context->calling_method_id, + new CodeLocation($statements_analyzer->getSource(), $stmt) + )) { + $return_type = $codebase->methods->getMethodReturnType( + $intersection_method_id, + $self_class + ) ?? Type::getString(); + + $declaring_method_id = $codebase->methods->getDeclaringMethodId($intersection_method_id); + + MethodCallReturnTypeFetcher::taintMethodCallResult( + $statements_analyzer, + $return_type, + $stmt, + $stmt, + [], + $intersection_method_id, + $declaring_method_id, + $intersection_type->value . '::__toString', + $context + ); + + if ($statements_analyzer->data_flow_graph) { + $parent_nodes = array_merge($return_type->parent_nodes, $parent_nodes); + } + + $castable_types = array_merge( + $castable_types, + array_values($return_type->getAtomicTypes()) + ); + + continue 2; + } + } + + if ($intersection_type instanceof TObjectWithProperties + && isset($intersection_type->methods['__toString']) + ) { + $castable_types[] = new TString(); + + continue 2; + } + } + } + + if ($atomic_type instanceof TTemplateParam) { + $atomic_types = array_merge($atomic_types, $atomic_type->as->getAtomicTypes()); + + continue; + } + + $invalid_casts[] = $atomic_type->getId(); + } + + if ($invalid_casts) { + if ($valid_strings || $castable_types) { + IssueBuffer::maybeAdd( + new PossiblyInvalidCast( + $invalid_casts[0] . ' cannot be cast to string', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidCast( + $invalid_casts[0] . ' cannot be cast to string', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } elseif ($explicit_cast && !$castable_types) { + // todo: emit error here + } + + $valid_types = array_merge($valid_strings, $castable_types); + + if (!$valid_types) { + $str_type = Type::getString(); + } else { + $str_type = TypeCombiner::combine( + $valid_types, + $codebase + ); + } + + if ($statements_analyzer->data_flow_graph) { + $str_type->parent_nodes = $parent_nodes; + } + + return $str_type; + } + + private static function checkExprGeneralUse( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\Cast $stmt, + Context $context + ): bool { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + $retVal = ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context); + $context->inside_general_use = $was_inside_general_use; + return $retVal; + } + + private static function handleRedundantCast( + Union $maybe_type, + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\Cast $stmt + ): void { + $codebase = $statements_analyzer->getCodebase(); + $project_analyzer = $statements_analyzer->getProjectAnalyzer(); + + $file_manipulation = null; + if ($maybe_type->from_docblock) { + $issue = new RedundantCastGivenDocblockType( + 'Redundant cast to ' . $maybe_type->getKey() . ' given docblock-provided type', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ); + + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['RedundantCastGivenDocblockType']) + ) { + $file_manipulation = new FileManipulation( + (int) $stmt->getAttribute('startFilePos'), + (int) $stmt->expr->getAttribute('startFilePos'), + '' + ); + } + } else { + $issue = new RedundantCast( + 'Redundant cast to ' . $maybe_type->getKey(), + new CodeLocation($statements_analyzer->getSource(), $stmt) + ); + + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['RedundantCast']) + ) { + $file_manipulation = new FileManipulation( + (int) $stmt->getAttribute('startFilePos'), + (int) $stmt->expr->getAttribute('startFilePos'), + '' + ); + } + } + + if ($file_manipulation) { + FileManipulationBuffer::add($statements_analyzer->getFilePath(), [$file_manipulation]); + } + + + if (IssueBuffer::accepts($issue, $statements_analyzer->getSuppressedIssues())) { + // fall through + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php new file mode 100644 index 00000000..45ed9e9a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php @@ -0,0 +1,148 @@ +getCodebase(); + $codebase_methods = $codebase->methods; + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + return false; + } + + $stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr); + + if ($stmt_expr_type) { + $clone_type = $stmt_expr_type; + + $immutable_cloned = false; + + $invalid_clones = []; + $mixed_clone = false; + + $possibly_valid = false; + $atomic_types = $clone_type->getAtomicTypes(); + + while ($atomic_types) { + $clone_type_part = array_pop($atomic_types); + + if ($clone_type_part instanceof TMixed) { + $mixed_clone = true; + } elseif ($clone_type_part instanceof TObject) { + $possibly_valid = true; + } elseif ($clone_type_part instanceof TNamedObject) { + if (!$codebase->classlikes->classOrInterfaceExists($clone_type_part->value)) { + $invalid_clones[] = $clone_type_part->getId(); + } else { + $clone_method_id = new MethodIdentifier( + $clone_type_part->value, + '__clone' + ); + + $does_method_exist = $codebase_methods->methodExists( + $clone_method_id, + $context->calling_method_id, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ); + $is_method_visible = MethodAnalyzer::isMethodVisible( + $clone_method_id, + $context, + $statements_analyzer->getSource() + ); + if ($does_method_exist && !$is_method_visible) { + $invalid_clones[] = $clone_type_part->getId(); + } else { + $possibly_valid = true; + $immutable_cloned = true; + } + } + } elseif ($clone_type_part instanceof TTemplateParam) { + $atomic_types = array_merge($atomic_types, $clone_type_part->as->getAtomicTypes()); + } else { + if ($clone_type_part instanceof TFalse + && $clone_type->ignore_falsable_issues + ) { + continue; + } + + if ($clone_type_part instanceof TNull + && $clone_type->ignore_nullable_issues + ) { + continue; + } + + $invalid_clones[] = $clone_type_part->getId(); + } + } + + if ($mixed_clone) { + IssueBuffer::maybeAdd( + new MixedClone( + 'Cannot clone mixed', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($invalid_clones) { + if ($possibly_valid) { + IssueBuffer::maybeAdd( + new PossiblyInvalidClone( + 'Cannot clone ' . $invalid_clones[0], + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidClone( + 'Cannot clone ' . $invalid_clones[0], + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + return true; + } + + $statements_analyzer->node_data->setType($stmt, $stmt_expr_type); + + if ($immutable_cloned) { + $stmt_expr_type = clone $stmt_expr_type; + $statements_analyzer->node_data->setType($stmt, $stmt_expr_type); + $stmt_expr_type->reference_free = true; + $stmt_expr_type->allow_mutations = true; + } + } + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php new file mode 100644 index 00000000..e874371f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php @@ -0,0 +1,52 @@ +expr, $context); + + $codebase = $statements_analyzer->getCodebase(); + + if (isset($codebase->config->forbidden_functions['empty'])) { + IssueBuffer::maybeAdd( + new ForbiddenCode( + 'You have forbidden the use of empty', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) + && $stmt_expr_type->hasBool() + && $stmt_expr_type->isSingle() + && !$stmt_expr_type->from_docblock + ) { + IssueBuffer::maybeAdd( + new InvalidArgument( + 'Calling empty on a boolean value is almost certainly unintended', + new CodeLocation($statements_analyzer->getSource(), $stmt->expr), + 'empty' + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $statements_analyzer->node_data->setType($stmt, Type::getBool()); + } +} 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 new file mode 100644 index 00000000..d90b9dc3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php @@ -0,0 +1,142 @@ +parts as $part) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $part, $context) === false) { + return false; + } + + $part_type = $statements_analyzer->node_data->getType($part); + + if ($part_type !== null) { + $casted_part_type = CastAnalyzer::castStringAttempt( + $statements_analyzer, + $context, + $part_type, + $part + ); + + if (!$casted_part_type->allLiterals()) { + $all_literals = false; + } elseif (!$non_empty) { + // Check if all literals are nonempty + $non_empty = true; + foreach ($casted_part_type->getAtomicTypes() as $atomic_literal) { + if (!$atomic_literal instanceof TLiteralInt + && !$atomic_literal instanceof TNonspecificLiteralInt + && !$atomic_literal instanceof TLiteralFloat + && !$atomic_literal instanceof TNonEmptyNonspecificLiteralString + && !($atomic_literal instanceof TLiteralString && $atomic_literal->value !== "") + ) { + $non_empty = false; + break; + } + } + } + + if ($literal_string !== null) { + if ($casted_part_type->isSingleLiteral()) { + $literal_string .= $casted_part_type->getSingleLiteral()->value; + } else { + $literal_string = null; + } + } + + if ($statements_analyzer->data_flow_graph + && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + $var_location = new CodeLocation($statements_analyzer, $part); + + $new_parent_node = DataFlowNode::getForAssignment('concat', $var_location); + $statements_analyzer->data_flow_graph->addNode($new_parent_node); + + $stmt_type->parent_nodes[$new_parent_node->id] = $new_parent_node; + + $codebase = $statements_analyzer->getCodebase(); + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + if ($casted_part_type->parent_nodes) { + foreach ($casted_part_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $new_parent_node, + 'concat', + $added_taints, + $removed_taints + ); + } + } + } + } elseif ($part instanceof EncapsedStringPart) { + if ($literal_string !== null) { + $literal_string .= $part->value; + } + $non_empty = $non_empty || $part->value !== ""; + } else { + $all_literals = false; + $literal_string = null; + } + } + + if ($non_empty) { + if ($literal_string !== null) { + $new_type = Type::getString($literal_string); + } elseif ($all_literals) { + $new_type = new Union([new TNonEmptyNonspecificLiteralString()]); + } else { + $new_type = new Union([new TNonEmptyString()]); + } + } elseif ($all_literals) { + $new_type = new Union([new TNonspecificLiteralString()]); + } + if (isset($new_type)) { + assert($new_type instanceof Union); + $new_type->parent_nodes = $stmt_type->parent_nodes; + $stmt_type = $new_type; + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php new file mode 100644 index 00000000..c8df04d5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php @@ -0,0 +1,85 @@ +expr, $context); + + $codebase = $statements_analyzer->getCodebase(); + + $expr_type = $statements_analyzer->node_data->getType($stmt->expr); + + if ($expr_type) { + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && $expr_type->parent_nodes + && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + $arg_location = new CodeLocation($statements_analyzer->getSource(), $stmt->expr); + + $eval_param_sink = TaintSink::getForMethodArgument( + 'eval', + 'eval', + 0, + $arg_location, + $arg_location + ); + + $eval_param_sink->taints = [TaintKind::INPUT_EVAL]; + + $statements_analyzer->data_flow_graph->addSink($eval_param_sink); + + $codebase = $statements_analyzer->getCodebase(); + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + foreach ($expr_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $eval_param_sink, + 'arg', + $added_taints, + $removed_taints + ); + } + } + } + + if (isset($codebase->config->forbidden_functions['eval'])) { + IssueBuffer::maybeAdd( + new ForbiddenCode( + 'You have forbidden the use of eval', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $context->check_classes = false; + $context->check_variables = false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php new file mode 100644 index 00000000..308a5e77 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php @@ -0,0 +1,145 @@ +getProjectAnalyzer()->getConfig(); + + $forbidden = null; + + if (isset($config->forbidden_functions['exit']) + && $stmt->getAttribute('kind') === Exit_::KIND_EXIT + ) { + $forbidden = 'exit'; + } elseif (isset($config->forbidden_functions['die']) + && $stmt->getAttribute('kind') === Exit_::KIND_DIE + ) { + $forbidden = 'die'; + } + + if ($forbidden) { + IssueBuffer::maybeAdd( + new ForbiddenCode( + 'You have forbidden the use of ' . $forbidden, + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($stmt->expr) { + $context->inside_call = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + return false; + } + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { + $call_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + $echo_param_sink = TaintSink::getForMethodArgument( + 'exit', + 'exit', + 0, + null, + $call_location + ); + + $echo_param_sink->taints = [ + TaintKind::INPUT_HTML, + TaintKind::INPUT_HAS_QUOTES, + TaintKind::USER_SECRET, + TaintKind::SYSTEM_SECRET + ]; + + $statements_analyzer->data_flow_graph->addSink($echo_param_sink); + } + + if ($expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { + $exit_param = new FunctionLikeParameter( + 'var', + false + ); + + if (ArgumentAnalyzer::verifyType( + $statements_analyzer, + $expr_type, + new Union([new TInt(), new TString()]), + null, + 'exit', + null, + 0, + new CodeLocation($statements_analyzer->getSource(), $stmt->expr), + $stmt->expr, + $context, + $exit_param, + false, + null, + true, + true, + new CodeLocation($statements_analyzer, $stmt) + ) === false) { + return false; + } + } + + $context->inside_call = false; + } + + if ($expr_type + && !$expr_type->isInt() + && !$context->collect_mutations + && !$context->collect_initializations + ) { + if ($context->mutation_free || $context->external_mutation_free) { + $function_name = $stmt->getAttribute('kind') === Exit_::KIND_DIE ? 'die' : 'exit'; + + IssueBuffer::maybeAdd( + new ImpureFunctionCall( + 'Cannot call ' . $function_name . ' with a non-integer argument from a mutation-free context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + } + + $statements_analyzer->node_data->setType($stmt, Type::getEmpty()); + + $context->has_returned = true; + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php new file mode 100644 index 00000000..ed779f5a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php @@ -0,0 +1,224 @@ +name)) { + return '$' . $stmt->name; + } + + if ($stmt instanceof PhpParser\Node\Expr\StaticPropertyFetch + && $stmt->name instanceof PhpParser\Node\Identifier + && $stmt->class instanceof PhpParser\Node\Name + ) { + if (count($stmt->class->parts) === 1 + && in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true) + ) { + if (!$this_class_name) { + $fq_class_name = $stmt->class->parts[0]; + } else { + $fq_class_name = $this_class_name; + } + } else { + $fq_class_name = $source + ? ClassLikeAnalyzer::getFQCLNFromNameObject( + $stmt->class, + $source->getAliases() + ) + : implode('\\', $stmt->class->parts); + } + + return $fq_class_name . '::$' . $stmt->name->name; + } + + if ($stmt instanceof PhpParser\Node\Expr\PropertyFetch && $stmt->name instanceof PhpParser\Node\Identifier) { + $object_id = self::getVarId($stmt->var, $this_class_name, $source); + + if (!$object_id) { + return null; + } + + return $object_id . '->' . $stmt->name->name; + } + + if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch && $nesting !== null) { + ++$nesting; + + return self::getVarId($stmt->var, $this_class_name, $source, $nesting); + } + + return null; + } + + public static function getRootVarId( + PhpParser\Node\Expr $stmt, + ?string $this_class_name, + ?FileSource $source = null + ): ?string { + if ($stmt instanceof PhpParser\Node\Expr\Variable + || $stmt instanceof PhpParser\Node\Expr\StaticPropertyFetch + ) { + return self::getVarId($stmt, $this_class_name, $source); + } + + if ($stmt instanceof PhpParser\Node\Expr\PropertyFetch && $stmt->name instanceof PhpParser\Node\Identifier) { + $property_root = self::getRootVarId($stmt->var, $this_class_name, $source); + + if ($property_root) { + return $property_root . '->' . $stmt->name->name; + } + } + + if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) { + return self::getRootVarId($stmt->var, $this_class_name, $source); + } + + return null; + } + + public static function getArrayVarId( + PhpParser\Node\Expr $stmt, + ?string $this_class_name, + ?FileSource $source = null + ): ?string { + if ($stmt instanceof PhpParser\Node\Expr\Assign) { + return self::getArrayVarId($stmt->var, $this_class_name, $source); + } + + if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) { + $root_var_id = self::getArrayVarId($stmt->var, $this_class_name, $source); + + $offset = null; + + if ($root_var_id) { + if ($stmt->dim instanceof PhpParser\Node\Scalar\String_ + || $stmt->dim instanceof PhpParser\Node\Scalar\LNumber + ) { + $offset = $stmt->dim instanceof PhpParser\Node\Scalar\String_ + ? '\'' . $stmt->dim->value . '\'' + : $stmt->dim->value; + } elseif ($stmt->dim instanceof PhpParser\Node\Expr\Variable + && is_string($stmt->dim->name) + ) { + $offset = '$' . $stmt->dim->name; + } elseif ($stmt->dim instanceof PhpParser\Node\Expr\ConstFetch) { + $offset = implode('\\', $stmt->dim->name->parts); + } elseif ($stmt->dim instanceof PhpParser\Node\Expr\PropertyFetch) { + $object_id = self::getArrayVarId($stmt->dim->var, $this_class_name, $source); + + if ($object_id && $stmt->dim->name instanceof PhpParser\Node\Identifier) { + $offset = $object_id . '->' . $stmt->dim->name; + } + } elseif ($stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch + && $stmt->dim->name instanceof PhpParser\Node\Identifier + && $stmt->dim->class instanceof PhpParser\Node\Name + && $stmt->dim->class->parts[0] === 'static' + ) { + $offset = 'static::' . $stmt->dim->name; + } elseif ($stmt->dim + && $source instanceof StatementsAnalyzer + && ($stmt_dim_type = $source->node_data->getType($stmt->dim)) + && (!$stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch + || !$stmt->dim->name instanceof PhpParser\Node\Identifier + || $stmt->dim->name->name !== 'class' + ) + ) { + if ($stmt_dim_type->isSingleStringLiteral()) { + $offset = '\'' . $stmt_dim_type->getSingleStringLiteral()->value . '\''; + } elseif ($stmt_dim_type->isSingleIntLiteral()) { + $offset = $stmt_dim_type->getSingleIntLiteral()->value; + } + } elseif ($stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch + && $stmt->dim->name instanceof PhpParser\Node\Identifier + ) { + /** @var string|null */ + $resolved_name = $stmt->dim->class->getAttribute('resolvedName'); + + if ($resolved_name) { + $offset = $resolved_name . '::' . $stmt->dim->name; + } + } + + return $offset !== null ? $root_var_id . '[' . $offset . ']' : null; + } + } + + if ($stmt instanceof PhpParser\Node\Expr\PropertyFetch) { + $object_id = self::getArrayVarId($stmt->var, $this_class_name, $source); + + if (!$object_id) { + return null; + } + + if ($stmt->name instanceof PhpParser\Node\Identifier) { + return $object_id . '->' . $stmt->name; + } + + if ($source instanceof StatementsAnalyzer + && ($stmt_name_type = $source->node_data->getType($stmt->name)) + && $stmt_name_type->isSingleStringLiteral()) { + return $object_id . '->' . $stmt_name_type->getSingleStringLiteral()->value; + } + + return null; + } + + if ($stmt instanceof PhpParser\Node\Expr\ClassConstFetch + && $stmt->name instanceof PhpParser\Node\Identifier + ) { + /** @var string|null */ + $resolved_name = $stmt->class->getAttribute('resolvedName'); + + if ($resolved_name) { + if (($resolved_name === 'self' || $resolved_name === 'static') && $this_class_name) { + $resolved_name = $this_class_name; + } + + return $resolved_name . '::' . $stmt->name; + } + } + + if ($stmt instanceof PhpParser\Node\Expr\MethodCall + && $stmt->name instanceof PhpParser\Node\Identifier + && !$stmt->isFirstClassCallable() + && !$stmt->getArgs() + ) { + $config = Config::getInstance(); + + if ($config->memoize_method_calls || $stmt->getAttribute('memoizable', false)) { + $lhs_var_name = self::getArrayVarId( + $stmt->var, + $this_class_name, + $source + ); + + if (!$lhs_var_name) { + return null; + } + + return $lhs_var_name . '->' . strtolower($stmt->name->name) . '()'; + } + } + + return self::getVarId($stmt, $this_class_name, $source); + } +} 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 new file mode 100644 index 00000000..6dd44638 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php @@ -0,0 +1,2060 @@ +var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($stmt->dim) { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + + $was_inside_unset = $context->inside_unset; + $context->inside_unset = false; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->dim, $context) === false) { + $context->inside_unset = $was_inside_unset; + $context->inside_general_use = $was_inside_general_use; + + return false; + } + + $context->inside_unset = $was_inside_unset; + + $context->inside_general_use = $was_inside_general_use; + } + + $keyed_array_var_id = ExpressionIdentifier::getArrayVarId( + $stmt, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $dim_var_id = null; + $new_offset_type = null; + + if ($stmt->dim) { + $used_key_type = $statements_analyzer->node_data->getType($stmt->dim) ?? Type::getMixed(); + + $dim_var_id = ExpressionIdentifier::getArrayVarId( + $stmt->dim, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + } else { + $used_key_type = Type::getInt(); + } + + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $stmt->var, + $context + ) === false) { + return false; + } + + $stmt_var_type = $statements_analyzer->node_data->getType($stmt->var); + + $codebase = $statements_analyzer->getCodebase(); + + if ($keyed_array_var_id + && $context->hasVariable($keyed_array_var_id) + && !$context->vars_in_scope[$keyed_array_var_id]->possibly_undefined + && $stmt_var_type + && !$stmt_var_type->hasClassStringMap() + ) { + $stmt_type = clone $context->vars_in_scope[$keyed_array_var_id]; + + $statements_analyzer->node_data->setType( + $stmt, + $stmt_type + ); + + self::taintArrayFetch( + $statements_analyzer, + $stmt->var, + $keyed_array_var_id, + $stmt_type, + $used_key_type, + $context + ); + + return true; + } + + $can_store_result = false; + + if ($stmt_var_type) { + if ($stmt_var_type->isNull()) { + if (!$context->inside_isset) { + IssueBuffer::maybeAdd( + new NullArrayAccess( + 'Cannot access array value on null variable ' . $array_var_id, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $stmt_type = $statements_analyzer->node_data->getType($stmt); + $statements_analyzer->node_data->setType( + $stmt, + Type::combineUnionTypes($stmt_type, Type::getNull()) + ); + + return true; + } + + $stmt_type = self::getArrayAccessTypeGivenOffset( + $statements_analyzer, + $stmt, + $stmt_var_type, + $used_key_type, + false, + $array_var_id, + $context, + null + ); + + if ($stmt->dim && $stmt_var_type->hasArray()) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TKeyedArray|TList|TClassStringMap + */ + $array_type = $stmt_var_type->getAtomicTypes()['array']; + + if ($array_type instanceof TClassStringMap) { + $array_value_type = Type::getMixed(); + } elseif ($array_type instanceof TArray) { + $array_value_type = $array_type->type_params[1]; + } elseif ($array_type instanceof TList) { + $array_value_type = $array_type->type_param; + } else { + $array_value_type = $array_type->getGenericValueType(); + } + + if ($context->inside_assignment || !$array_value_type->isMixed()) { + $can_store_result = true; + } + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + if ($context->inside_isset + && $stmt->dim + && ($stmt_dim_type = $statements_analyzer->node_data->getType($stmt->dim)) + && $stmt_var_type->hasArray() + && ($stmt->var instanceof PhpParser\Node\Expr\ClassConstFetch + || $stmt->var instanceof PhpParser\Node\Expr\ConstFetch) + ) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TKeyedArray|TList + */ + $array_type = $stmt_var_type->getAtomicTypes()['array']; + + if ($array_type instanceof TArray) { + $const_array_key_type = $array_type->type_params[0]; + } elseif ($array_type instanceof TList) { + $const_array_key_type = Type::getInt(); + } else { + $const_array_key_type = $array_type->getGenericKeyType(); + } + + if ($dim_var_id + && !$const_array_key_type->hasMixed() + && !$stmt_dim_type->hasMixed() + ) { + $new_offset_type = clone $stmt_dim_type; + $const_array_key_atomic_types = $const_array_key_type->getAtomicTypes(); + + foreach ($new_offset_type->getAtomicTypes() as $offset_key => $offset_atomic_type) { + if ($offset_atomic_type instanceof TString + || $offset_atomic_type instanceof TInt + ) { + if (!isset($const_array_key_atomic_types[$offset_key]) + && !UnionTypeComparator::isContainedBy( + $codebase, + new Union([$offset_atomic_type]), + $const_array_key_type + ) + ) { + $new_offset_type->removeType($offset_key); + } + } elseif (!UnionTypeComparator::isContainedBy( + $codebase, + $const_array_key_type, + new Union([$offset_atomic_type]) + )) { + $new_offset_type->removeType($offset_key); + } + } + } + } + } + + if ($keyed_array_var_id + && $context->hasVariable($keyed_array_var_id) + && (!($stmt_type = $statements_analyzer->node_data->getType($stmt)) || $stmt_type->isVanillaMixed()) + ) { + $statements_analyzer->node_data->setType($stmt, $context->vars_in_scope[$keyed_array_var_id]); + } + + if (!($stmt_type = $statements_analyzer->node_data->getType($stmt))) { + $stmt_type = Type::getMixed(); + $statements_analyzer->node_data->setType($stmt, $stmt_type); + } else { + if ($stmt_type->possibly_undefined + && !$context->inside_isset + && !$context->inside_unset + && ($stmt_var_type && !$stmt_var_type->hasMixed()) + ) { + IssueBuffer::maybeAdd( + new PossiblyUndefinedArrayOffset( + 'Possibly undefined array key ' . $keyed_array_var_id + . ' on ' . $stmt_var_type->getId(), + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $stmt_type->possibly_undefined = false; + } + + if ($context->inside_isset && $dim_var_id && $new_offset_type && !$new_offset_type->isUnionEmpty()) { + $context->vars_in_scope[$dim_var_id] = $new_offset_type; + } + + if ($keyed_array_var_id && !$context->inside_isset && $can_store_result) { + $context->vars_in_scope[$keyed_array_var_id] = $stmt_type; + $context->vars_possibly_in_scope[$keyed_array_var_id] = true; + + // reference the variable too + $context->hasVariable($keyed_array_var_id); + } + + self::taintArrayFetch( + $statements_analyzer, + $stmt->var, + $keyed_array_var_id, + $stmt_type, + $used_key_type, + $context + ); + + return true; + } + + /** + * Used to create a path between a variable $foo and $foo["a"] + */ + public static function taintArrayFetch( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $var, + ?string $keyed_array_var_id, + Union $stmt_type, + Union $offset_type, + ?Context $context = null + ): void { + if ($statements_analyzer->data_flow_graph + && ($stmt_var_type = $statements_analyzer->node_data->getType($var)) + && $stmt_var_type->parent_nodes + ) { + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + $stmt_var_type->parent_nodes = []; + return; + } + + $added_taints = []; + $removed_taints = []; + + if ($context) { + $codebase = $statements_analyzer->getCodebase(); + $event = new AddRemoveTaintsEvent($var, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + } + + $var_location = new CodeLocation($statements_analyzer->getSource(), $var); + + $new_parent_node = DataFlowNode::getForAssignment( + $keyed_array_var_id ?: 'arrayvalue-fetch', + $var_location + ); + + $array_key_node = null; + + $statements_analyzer->data_flow_graph->addNode($new_parent_node); + + $dim_value = $offset_type->isSingleStringLiteral() + ? $offset_type->getSingleStringLiteral()->value + : ($offset_type->isSingleIntLiteral() + ? $offset_type->getSingleIntLiteral()->value + : null); + + if ($keyed_array_var_id === null && $dim_value === null) { + $array_key_node = DataFlowNode::getForAssignment( + 'arraykey-fetch', + $var_location + ); + + $statements_analyzer->data_flow_graph->addNode($array_key_node); + } + + foreach ($stmt_var_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $new_parent_node, + 'arrayvalue-fetch' . ($dim_value !== null ? '-\'' . $dim_value . '\'' : ''), + $added_taints, + $removed_taints + ); + + if ($stmt_type->by_ref) { + $statements_analyzer->data_flow_graph->addPath( + $new_parent_node, + $parent_node, + 'arrayvalue-assignment' . ($dim_value !== null ? '-\'' . $dim_value . '\'' : ''), + $added_taints, + $removed_taints + ); + } + + if ($array_key_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $array_key_node, + 'arraykey-fetch', + $added_taints, + $removed_taints + ); + } + } + + $stmt_type->parent_nodes = [$new_parent_node->id => $new_parent_node]; + + if ($array_key_node) { + $offset_type->parent_nodes = [$array_key_node->id => $array_key_node]; + } + } + } + + /** + * @psalm-suppress ComplexMethod to be refactored. + * Good type/bad type behaviour could be mutualised with ArrayAnalyzer + */ + public static function getArrayAccessTypeGivenOffset( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + Union $array_type, + Union $offset_type, + bool $in_assignment, + ?string $array_var_id, + Context $context, + PhpParser\Node\Expr $assign_value = null, + Union $replacement_type = null + ): Union { + $codebase = $statements_analyzer->getCodebase(); + + $has_array_access = false; + $non_array_types = []; + + $has_valid_expected_offset = false; + $expected_offset_types = []; + + $key_values = []; + + if ($stmt->dim instanceof PhpParser\Node\Scalar\String_ + || $stmt->dim instanceof PhpParser\Node\Scalar\LNumber + ) { + $key_values[] = $stmt->dim->value; + } elseif ($stmt->dim && ($stmt_dim_type = $statements_analyzer->node_data->getType($stmt->dim))) { + $string_literals = $stmt_dim_type->getLiteralStrings(); + $int_literals = $stmt_dim_type->getLiteralInts(); + + $all_atomic_types = $stmt_dim_type->getAtomicTypes(); + + if (count($string_literals) + count($int_literals) === count($all_atomic_types)) { + foreach ($string_literals as $string_literal) { + $key_values[] = $string_literal->value; + } + + foreach ($int_literals as $int_literal) { + $key_values[] = $int_literal->value; + } + } + } + + $array_access_type = null; + + if ($offset_type->isNull()) { + IssueBuffer::maybeAdd( + new NullArrayOffset( + 'Cannot access value on variable ' . $array_var_id . ' using null offset', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + if ($in_assignment) { + $offset_type->removeType('null'); + $offset_type->addType(new TLiteralString('')); + } + } + + if ($offset_type->isNullable() && !$context->inside_isset) { + if (!$offset_type->ignore_nullable_issues) { + IssueBuffer::maybeAdd( + new PossiblyNullArrayOffset( + 'Cannot access value on variable ' . $array_var_id + . ' using possibly null offset ' . $offset_type, + new CodeLocation($statements_analyzer->getSource(), $stmt->var) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($in_assignment) { + $offset_type->removeType('null'); + + if (!$offset_type->ignore_nullable_issues) { + $offset_type->addType(new TLiteralString('')); + } + } + } + + if ($array_type->isArray()) { + $has_valid_absolute_offset = self::checkArrayOffsetType( + $offset_type, + $offset_type->getAtomicTypes(), + $codebase + ); + + if ($has_valid_absolute_offset === false) { + //we didn't find a single type that could be valid + $expected_offset_types[] = 'array-key'; + } + } else { + //on not-arrays, the type is considered valid + $has_valid_absolute_offset = true; + } + + foreach ($array_type->getAtomicTypes() as $type_string => $type) { + $original_type = $type; + + if ($type instanceof TMixed || $type instanceof TTemplateParam || $type instanceof TEmpty) { + if (!$type instanceof TTemplateParam || $type->as->isMixed() || !$type->as->isSingle()) { + $array_access_type = self::handleMixedArrayAccess( + $context, + $statements_analyzer, + $codebase, + $in_assignment, + $array_var_id, + $stmt, + $array_access_type, + $type + ); + + $has_valid_expected_offset = true; + + continue; + } + + $type = clone $type->as->getSingleAtomic(); + } + + if ($type instanceof TNull) { + if ($array_type->ignore_nullable_issues) { + continue; + } + + if ($in_assignment) { + if ($replacement_type) { + $array_access_type = Type::combineUnionTypes($array_access_type, clone $replacement_type); + } else { + IssueBuffer::maybeAdd( + new PossiblyNullArrayAssignment( + 'Cannot access array value on possibly null variable ' . $array_var_id . + ' of type ' . $array_type, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + $array_access_type = new Union([new TEmpty]); + } + } else { + if (!$context->inside_isset && !MethodCallAnalyzer::hasNullsafe($stmt->var)) { + IssueBuffer::maybeAdd( + new PossiblyNullArrayAccess( + 'Cannot access array value on possibly null variable ' . $array_var_id . + ' of type ' . $array_type, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $array_access_type = Type::combineUnionTypes($array_access_type, Type::getNull()); + } + + continue; + } + + if ($type instanceof TArray + || $type instanceof TKeyedArray + || $type instanceof TList + || $type instanceof TClassStringMap + ) { + self::handleArrayAccessOnArray( + $in_assignment, + $type, + $key_values, + $array_type, + $type_string, + $stmt, + $replacement_type, + $offset_type, + $original_type, + $codebase, + $array_var_id, + $context, + $statements_analyzer, + $expected_offset_types, + $array_access_type, + $has_array_access, + $has_valid_expected_offset + ); + + continue; + } + + if ($type instanceof TString) { + self::handleArrayAccessOnString( + $statements_analyzer, + $codebase, + $stmt, + $in_assignment, + $context, + $replacement_type, + $type, + $offset_type, + $expected_offset_types, + $array_access_type, + $has_valid_expected_offset + ); + + continue; + } + + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); + } + + if ($type instanceof TFalse && $array_type->ignore_falsable_issues) { + continue; + } + + if ($type instanceof TNamedObject) { + self::handleArrayAccessOnNamedObject( + $statements_analyzer, + $stmt, + $type, + $context, + $in_assignment, + $assign_value, + $array_access_type, + $has_array_access + ); + } elseif (!$array_type->hasMixed()) { + $non_array_types[] = (string)$type; + } + } + + if ($non_array_types) { + if ($has_array_access) { + if ($in_assignment) { + if (IssueBuffer::accepts( + new PossiblyInvalidArrayAssignment( + 'Cannot access array value on non-array variable ' . + $array_var_id . ' of type ' . $non_array_types[0], + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ) + ) { + // do nothing + } + } elseif (!$context->inside_isset) { + if (IssueBuffer::accepts( + new PossiblyInvalidArrayAccess( + 'Cannot access array value on non-array variable ' . + $array_var_id . ' of type ' . $non_array_types[0], + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ) + ) { + // do nothing + } + } + } else { + if ($in_assignment) { + IssueBuffer::maybeAdd( + new InvalidArrayAssignment( + 'Cannot access array value on non-array variable ' . + $array_var_id . ' of type ' . $non_array_types[0], + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidArrayAccess( + 'Cannot access array value on non-array variable ' . + $array_var_id . ' of type ' . $non_array_types[0], + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $array_access_type = Type::getMixed(); + } + } + + if ($offset_type->hasMixed()) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + IssueBuffer::maybeAdd( + new MixedArrayOffset( + 'Cannot access value on variable ' . $array_var_id . ' using mixed offset', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); + } + + if ($expected_offset_types) { + $invalid_offset_type = $expected_offset_types[0]; + + $used_offset = 'using a ' . $offset_type->getId() . ' offset'; + + if ($key_values) { + $used_offset = "using offset value of '" . implode('|', $key_values) . "'"; + } + + if ($has_valid_expected_offset && $has_valid_absolute_offset && $context->inside_isset) { + // do nothing + } elseif ($has_valid_expected_offset && $has_valid_absolute_offset) { + if (!$context->inside_unset) { + IssueBuffer::maybeAdd( + new PossiblyInvalidArrayOffset( + 'Cannot access value on variable ' . $array_var_id . ' ' . $used_offset + . ', expecting ' . $invalid_offset_type, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } else { + $good_types = []; + $bad_types = []; + foreach ($offset_type->getAtomicTypes() as $atomic_key_type) { + if (!$atomic_key_type instanceof TString + && !$atomic_key_type instanceof TInt + && !$atomic_key_type instanceof TArrayKey + && !$atomic_key_type instanceof TMixed + && !$atomic_key_type instanceof TTemplateParam + && !( + $atomic_key_type instanceof TObjectWithProperties + && isset($atomic_key_type->methods['__toString']) + ) + ) { + $bad_types[] = $atomic_key_type; + + if ($atomic_key_type instanceof TFalse) { + $good_types[] = new TLiteralInt(0); + } elseif ($atomic_key_type instanceof TTrue) { + $good_types[] = new TLiteralInt(1); + } elseif ($atomic_key_type instanceof TBool) { + $good_types[] = new TLiteralInt(0); + $good_types[] = new TLiteralInt(1); + } elseif ($atomic_key_type instanceof TLiteralFloat) { + $good_types[] = new TLiteralInt((int)$atomic_key_type->value); + } elseif ($atomic_key_type instanceof TFloat) { + $good_types[] = new TInt; + } else { + $good_types[] = new TArrayKey; + } + } + } + + if ($bad_types && $good_types) { + $offset_type->substitute( + TypeCombiner::combine($bad_types, $codebase), + TypeCombiner::combine($good_types, $codebase) + ); + } + + IssueBuffer::maybeAdd( + new InvalidArrayOffset( + 'Cannot access value on variable ' . $array_var_id . ' ' . $used_offset + . ', expecting ' . $invalid_offset_type, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + if ($array_access_type === null) { + // shouldn’t happen, but don’t crash + return Type::getMixed(); + } + + if ($array_type->by_ref) { + $array_access_type->by_ref = true; + } + + if ($in_assignment) { + $array_type->bustCache(); + } + + return $array_access_type; + } + + private static function checkLiteralIntArrayOffset( + Union $offset_type, + Union $expected_offset_type, + ?string $array_var_id, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + Context $context, + StatementsAnalyzer $statements_analyzer + ): void { + if ($context->inside_isset || $context->inside_unset) { + return; + } + + if ($offset_type->hasLiteralInt()) { + $found_match = false; + + foreach ($offset_type->getAtomicTypes() as $offset_type_part) { + if ($array_var_id + && $offset_type_part instanceof TLiteralInt + && isset( + $context->vars_in_scope[ + $array_var_id . '[' . $offset_type_part->value . ']' + ] + ) + && !$context->vars_in_scope[ + $array_var_id . '[' . $offset_type_part->value . ']' + ]->possibly_undefined + ) { + $found_match = true; + break; + } + + if ($offset_type_part instanceof TPositiveInt) { + $found_match = true; + break; + } + } + + if (!$found_match) { + IssueBuffer::maybeAdd( + new PossiblyUndefinedIntArrayOffset( + 'Possibly undefined array offset \'' + . $offset_type->getId() . '\' ' + . 'is risky given expected type \'' + . $expected_offset_type->getId() . '\'.' + . ' Consider using isset beforehand.', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + private static function checkLiteralStringArrayOffset( + Union $offset_type, + Union $expected_offset_type, + ?string $array_var_id, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + Context $context, + StatementsAnalyzer $statements_analyzer + ): void { + if ($context->inside_isset || $context->inside_unset) { + return; + } + + if ($offset_type->hasLiteralString() && !$expected_offset_type->hasLiteralClassString()) { + $found_match = false; + + foreach ($offset_type->getAtomicTypes() as $offset_type_part) { + if ($array_var_id + && $offset_type_part instanceof TLiteralString + && isset( + $context->vars_in_scope[ + $array_var_id . '[\'' . $offset_type_part->value . '\']' + ] + ) + && !$context->vars_in_scope[ + $array_var_id . '[\'' . $offset_type_part->value . '\']' + ]->possibly_undefined + ) { + $found_match = true; + break; + } + } + + if (!$found_match) { + IssueBuffer::maybeAdd( + new PossiblyUndefinedStringArrayOffset( + 'Possibly undefined array offset \'' + . $offset_type->getId() . '\' ' + . 'is risky given expected type \'' + . $expected_offset_type->getId() . '\'.' + . ' Consider using isset beforehand.', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + public static function replaceOffsetTypeWithInts(Union $offset_type): Union + { + $offset_types = $offset_type->getAtomicTypes(); + + $cloned = false; + + foreach ($offset_types as $key => $offset_type_part) { + if ($offset_type_part instanceof TLiteralString) { + if (preg_match('/^(0|[1-9][0-9]*)$/', $offset_type_part->value)) { + if (!$cloned) { + $offset_type = clone $offset_type; + $cloned = true; + } + $offset_type->addType(new TLiteralInt((int) $offset_type_part->value)); + $offset_type->removeType($key); + } + } elseif ($offset_type_part instanceof TBool) { + if (!$cloned) { + $offset_type = clone $offset_type; + $cloned = true; + } + + if ($offset_type_part instanceof TFalse) { + if (!$offset_type->ignore_falsable_issues) { + $offset_type->addType(new TLiteralInt(0)); + $offset_type->removeType($key); + } + } elseif ($offset_type_part instanceof TTrue) { + $offset_type->addType(new TLiteralInt(1)); + $offset_type->removeType($key); + } else { + $offset_type->addType(new TLiteralInt(0)); + $offset_type->addType(new TLiteralInt(1)); + $offset_type->removeType($key); + } + } + } + + return $offset_type; + } + + /** + * @param TMixed|TTemplateParam|TEmpty $type + */ + public static function handleMixedArrayAccess( + Context $context, + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + bool $in_assignment, + ?string $array_var_id, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + ?Union $array_access_type, + Atomic $type + ): Union { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + if (!$context->inside_isset) { + if ($in_assignment) { + IssueBuffer::maybeAdd( + new MixedArrayAssignment( + 'Cannot access array value on mixed variable ' . $array_var_id, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new MixedArrayAccess( + 'Cannot access array value on mixed variable ' . $array_var_id, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if (($data_flow_graph = $statements_analyzer->data_flow_graph) + && $data_flow_graph instanceof VariableUseGraph + && ($stmt_var_type = $statements_analyzer->node_data->getType($stmt->var)) + ) { + if ($stmt_var_type->parent_nodes) { + $var_location = new CodeLocation($statements_analyzer->getSource(), $stmt->var); + + $new_parent_node = DataFlowNode::getForAssignment('mixed-var-array-access', $var_location); + + $data_flow_graph->addNode($new_parent_node); + + foreach ($stmt_var_type->parent_nodes as $parent_node) { + $data_flow_graph->addPath($parent_node, $new_parent_node, '='); + + $data_flow_graph->addPath( + $parent_node, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use' + ); + } + + $stmt_var_type->parent_nodes = [ + $new_parent_node->id => $new_parent_node + ]; + } + } + + return Type::combineUnionTypes( + $array_access_type, + Type::getMixed($type instanceof TEmpty) + ); + } + + /** + * @param list $expected_offset_types + * @param TArray|TKeyedArray|TList|TClassStringMap $type + * @param list $key_values + */ + private static function handleArrayAccessOnArray( + bool $in_assignment, + Atomic &$type, + array &$key_values, + Union $array_type, + string $type_string, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + ?Union $replacement_type, + Union &$offset_type, + Atomic $original_type, + Codebase $codebase, + ?string $array_var_id, + Context $context, + StatementsAnalyzer $statements_analyzer, + array &$expected_offset_types, + ?Union &$array_access_type, + bool &$has_array_access, + bool &$has_valid_offset + ): void { + $has_array_access = true; + + if ($in_assignment + && $type instanceof TArray + && $type->type_params[0]->isEmpty() + && $type->type_params[1]->isEmpty() + ) { + $from_empty_array = $type->type_params[0]->isEmpty() && $type->type_params[1]->isEmpty(); + + if (count($key_values) === 1) { + $from_mixed_array = $type->type_params[1]->isMixed(); + + [$previous_key_type, $previous_value_type] = $type->type_params; + + // ok, type becomes an TKeyedArray + $array_type->removeType($type_string); + $type = new TKeyedArray([ + $key_values[0] => $from_mixed_array ? Type::getMixed() : Type::getEmpty() + ]); + + $type->sealed = $from_empty_array; + + if (!$from_empty_array) { + $type->previous_value_type = clone $previous_value_type; + $type->previous_key_type = clone $previous_key_type; + } + + $array_type->addType($type); + } elseif (!$stmt->dim && $from_empty_array && $replacement_type) { + $array_type->removeType($type_string); + $array_type->addType(new TNonEmptyList($replacement_type)); + return; + } + } elseif ($in_assignment + && $type instanceof TKeyedArray + && $type->previous_value_type + && $type->previous_value_type->isMixed() + && count($key_values) === 1 + ) { + $type->properties[$key_values[0]] = Type::getMixed(); + } + + $offset_type = self::replaceOffsetTypeWithInts($offset_type); + + if ($type instanceof TList + && (($in_assignment && $stmt->dim) + || $original_type instanceof TTemplateParam + || !$offset_type->isInt()) + ) { + $type = new TArray([Type::getInt(), $type->type_param]); + } + + if ($type instanceof TArray) { + self::handleArrayAccessOnTArray( + $statements_analyzer, + $codebase, + $context, + $stmt, + $array_type, + $array_var_id, + $type, + $offset_type, + $in_assignment, + $expected_offset_types, + $replacement_type, + $array_access_type, + $original_type, + $has_valid_offset + ); + } elseif ($type instanceof TList) { + self::handleArrayAccessOnList( + $statements_analyzer, + $codebase, + $stmt, + $type, + $offset_type, + $array_var_id, + $key_values, + $context, + $in_assignment, + $expected_offset_types, + $replacement_type, + $array_access_type, + $has_valid_offset + ); + } elseif ($type instanceof TClassStringMap) { + self::handleArrayAccessOnClassStringMap( + $codebase, + $type, + $offset_type, + $replacement_type, + $array_access_type + ); + } else { + self::handleArrayAccessOnKeyedArray( + $statements_analyzer, + $codebase, + $key_values, + $replacement_type, + $array_access_type, + $in_assignment, + $stmt, + $offset_type, + $array_var_id, + $context, + $type, + $array_type, + $expected_offset_types, + $type_string, + $has_valid_offset + ); + } + + if ($context->inside_isset) { + $offset_type->ignore_isset = true; + } + } + + /** + * @param list $expected_offset_types + */ + private static function handleArrayAccessOnTArray( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + Context $context, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + Union $array_type, + ?string $array_var_id, + TArray $type, + Union $offset_type, + bool $in_assignment, + array &$expected_offset_types, + ?Union $replacement_type, + ?Union &$array_access_type, + Atomic $original_type, + bool &$has_valid_offset + ): void { + // if we're assigning to an empty array with a key offset, refashion that array + if ($in_assignment) { + if ($type->type_params[0]->isEmpty()) { + $type->type_params[0] = $offset_type->isMixed() + ? Type::getArrayKey() + : $offset_type; + } + } elseif (!$type->type_params[0]->isEmpty()) { + $expected_offset_type = $type->type_params[0]->hasMixed() + ? new Union([new TArrayKey]) + : $type->type_params[0]; + + $templated_offset_type = null; + + foreach ($offset_type->getAtomicTypes() as $offset_atomic_type) { + if ($offset_atomic_type instanceof TTemplateParam) { + $templated_offset_type = $offset_atomic_type; + } + } + + $union_comparison_results = new TypeComparisonResult(); + + if ($original_type instanceof TTemplateParam && $templated_offset_type) { + foreach ($templated_offset_type->as->getAtomicTypes() as $offset_as) { + if ($offset_as instanceof TTemplateKeyOf + && $offset_as->param_name === $original_type->param_name + && $offset_as->defining_class === $original_type->defining_class + ) { + $type->type_params[1] = new Union([ + new TTemplateIndexedAccess( + $offset_as->param_name, + $templated_offset_type->param_name, + $offset_as->defining_class + ) + ]); + + $has_valid_offset = true; + } + } + } else { + $offset_type_contained_by_expected = UnionTypeComparator::isContainedBy( + $codebase, + $offset_type, + $expected_offset_type, + true, + $offset_type->ignore_falsable_issues, + $union_comparison_results + ); + + if ($codebase->config->ensure_array_string_offsets_exist + && $offset_type_contained_by_expected + ) { + //we already know we found a match, so if the array is non-empty and the key is a literal, + //then no need to check for PossiblyUndefinedStringArrayOffset + if (!$type instanceof TNonEmptyArray || !$type->type_params[0]->isSingleStringLiteral()) { + self::checkLiteralStringArrayOffset( + $offset_type, + $expected_offset_type, + $array_var_id, + $stmt, + $context, + $statements_analyzer + ); + } + } + + if ($codebase->config->ensure_array_int_offsets_exist + && $offset_type_contained_by_expected + ) { + self::checkLiteralIntArrayOffset( + $offset_type, + $expected_offset_type, + $array_var_id, + $stmt, + $context, + $statements_analyzer + ); + } + + if ((!$offset_type_contained_by_expected + && !$union_comparison_results->type_coerced_from_scalar) + || $union_comparison_results->to_string_cast + ) { + if ($union_comparison_results->type_coerced_from_mixed + && !$offset_type->isMixed() + ) { + IssueBuffer::maybeAdd( + new MixedArrayTypeCoercion( + 'Coercion from array offset type \'' . $offset_type->getId() . '\' ' + . 'to the expected type \'' . $expected_offset_type->getId() . '\'', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + $expected_offset_types[] = $expected_offset_type->getId(); + } + + if (UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $offset_type, + $expected_offset_type + )) { + $has_valid_offset = true; + } + } else { + $has_valid_offset = true; + } + } + } + + if (!$stmt->dim && $type instanceof TNonEmptyArray && $type->count !== null) { + $type->count++; + } + + if ($in_assignment && $replacement_type) { + $type->type_params[1] = Type::combineUnionTypes( + $type->type_params[1], + $replacement_type, + $codebase + ); + } + + $array_access_type = Type::combineUnionTypes( + $array_access_type, + $type->type_params[1] + ); + + if ($array_access_type->isEmpty() + && !$array_type->hasMixed() + && !$in_assignment + && !$context->inside_isset + ) { + IssueBuffer::maybeAdd( + new EmptyArrayAccess( + 'Cannot access value on empty array variable ' . $array_var_id, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + if (!IssueBuffer::isRecording()) { + $array_access_type = Type::getMixed(true); + } + } + } + + private static function handleArrayAccessOnClassStringMap( + Codebase $codebase, + TClassStringMap $type, + Union $offset_type, + ?Union $replacement_type, + ?Union &$array_access_type + ): void { + $offset_type_parts = array_values($offset_type->getAtomicTypes()); + + foreach ($offset_type_parts as $offset_type_part) { + if ($offset_type_part instanceof TClassString) { + if ($offset_type_part instanceof TTemplateParamClass) { + $template_result_get = new TemplateResult( + [], + [ + $type->param_name => [ + 'class-string-map' => new Union([ + new TTemplateParam( + $offset_type_part->param_name, + $offset_type_part->as_type + ? new Union([$offset_type_part->as_type]) + : Type::getObject(), + $offset_type_part->defining_class + ) + ]) + ] + ] + ); + + $template_result_set = new TemplateResult( + [], + [ + $offset_type_part->param_name => [ + $offset_type_part->defining_class => new Union([ + new TTemplateParam( + $type->param_name, + $type->as_type + ? new Union([$type->as_type]) + : Type::getObject(), + 'class-string-map' + ) + ]) + ] + ] + ); + } else { + $template_result_get = new TemplateResult( + [], + [ + $type->param_name => [ + 'class-string-map' => new Union([ + $offset_type_part->as_type + ?: new TObject() + ]) + ] + ] + ); + $template_result_set = new TemplateResult( + [], + [] + ); + } + + $expected_value_param_get = clone $type->value_param; + + TemplateInferredTypeReplacer::replace( + $expected_value_param_get, + $template_result_get, + $codebase + ); + + if ($replacement_type) { + $expected_value_param_set = clone $type->value_param; + + TemplateInferredTypeReplacer::replace( + $replacement_type, + $template_result_set, + $codebase + ); + + $type->value_param = Type::combineUnionTypes( + $replacement_type, + $expected_value_param_set, + $codebase + ); + } + + $array_access_type = Type::combineUnionTypes( + $array_access_type, + $expected_value_param_get, + $codebase + ); + } + } + } + + /** + * @param list $expected_offset_types + * @param list $key_values + */ + private static function handleArrayAccessOnKeyedArray( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + array &$key_values, + ?Union $replacement_type, + ?Union &$array_access_type, + bool $in_assignment, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + Union $offset_type, + ?string $array_var_id, + Context $context, + TKeyedArray $type, + Union $array_type, + array &$expected_offset_types, + string $type_string, + bool &$has_valid_offset + ): void { + $generic_key_type = $type->getGenericKeyType(); + + if (!$stmt->dim && $type->sealed && $type->is_list) { + $key_values[] = count($type->properties); + } + + if ($key_values) { + foreach ($key_values as $key_value) { + if (isset($type->properties[$key_value]) || $replacement_type) { + $has_valid_offset = true; + + if ($replacement_type) { + $type->properties[$key_value] = Type::combineUnionTypes( + $type->properties[$key_value] ?? null, + $replacement_type + ); + } + + $array_access_type = Type::combineUnionTypes( + $array_access_type, + clone $type->properties[$key_value] + ); + } elseif ($in_assignment) { + $type->properties[$key_value] = new Union([new TEmpty]); + + $array_access_type = Type::combineUnionTypes( + $array_access_type, + clone $type->properties[$key_value] + ); + } elseif ($type->previous_value_type) { + if ($codebase->config->ensure_array_string_offsets_exist) { + self::checkLiteralStringArrayOffset( + $offset_type, + $type->getGenericKeyType(), + $array_var_id, + $stmt, + $context, + $statements_analyzer + ); + } + + if ($codebase->config->ensure_array_int_offsets_exist) { + self::checkLiteralIntArrayOffset( + $offset_type, + $type->getGenericKeyType(), + $array_var_id, + $stmt, + $context, + $statements_analyzer + ); + } + + $type->properties[$key_value] = clone $type->previous_value_type; + + $array_access_type = clone $type->previous_value_type; + } elseif ($array_type->hasMixed()) { + $has_valid_offset = true; + + $array_access_type = Type::getMixed(); + } else { + if ($type->sealed || !$context->inside_isset) { + $object_like_keys = array_keys($type->properties); + + $last_key = array_pop($object_like_keys); + + $key_string = ''; + + if ($object_like_keys) { + $formatted_keys = implode( + ', ', + array_map( + function ($key) { + return is_int($key) ? $key : '\'' . $key . '\''; + }, + $object_like_keys + ) + ); + + $key_string = $formatted_keys . ' or '; + } + + $key_string .= is_int($last_key) ? $last_key : '\'' . $last_key . '\''; + + $expected_offset_types[] = $key_string; + } + + $array_access_type = Type::getMixed(); + } + } + } else { + $key_type = $generic_key_type->hasMixed() + ? Type::getArrayKey() + : $generic_key_type; + + $union_comparison_results = new TypeComparisonResult(); + + $is_contained = UnionTypeComparator::isContainedBy( + $codebase, + $offset_type, + $key_type, + true, + $offset_type->ignore_falsable_issues, + $union_comparison_results + ); + + if ($context->inside_isset && !$is_contained) { + $is_contained = UnionTypeComparator::isContainedBy( + $codebase, + $key_type, + $offset_type, + true, + $offset_type->ignore_falsable_issues + ); + } + + if (($is_contained + || $union_comparison_results->type_coerced_from_scalar + || $union_comparison_results->type_coerced_from_mixed + || $in_assignment) + && !$union_comparison_results->to_string_cast + ) { + if ($replacement_type) { + $generic_params = Type::combineUnionTypes( + $type->getGenericValueType(), + $replacement_type + ); + + $new_key_type = Type::combineUnionTypes( + $generic_key_type, + $offset_type->isMixed() ? Type::getArrayKey() : $offset_type + ); + + $property_count = $type->sealed ? count($type->properties) : null; + + if (!$stmt->dim && $property_count) { + ++$property_count; + $array_type->removeType($type_string); + $type = new TNonEmptyArray([ + $new_key_type, + $generic_params, + ]); + $array_type->addType($type); + $type->count = $property_count; + } else { + $array_type->removeType($type_string); + + if (!$stmt->dim && $type->is_list) { + $type = new TList($generic_params); + } else { + $type = new TArray([ + $new_key_type, + $generic_params, + ]); + } + + $array_type->addType($type); + } + + $array_access_type = Type::combineUnionTypes( + $array_access_type, + clone $generic_params + ); + } else { + $array_access_type = Type::combineUnionTypes( + $array_access_type, + $type->getGenericValueType() + ); + } + + $has_valid_offset = true; + } else { + if (!$context->inside_isset + || ($type->sealed && !$union_comparison_results->type_coerced) + ) { + $expected_offset_types[] = $generic_key_type->getId(); + } + + $array_access_type = Type::getMixed(); + } + } + } + + /** + * @param list $expected_offset_types + * @param list $key_values + */ + private static function handleArrayAccessOnList( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + TList $type, + Union $offset_type, + ?string $array_var_id, + array $key_values, + Context $context, + bool $in_assignment, + array &$expected_offset_types, + ?Union $replacement_type, + ?Union &$array_access_type, + bool &$has_valid_offset + ): void { + // if we're assigning to an empty array with a key offset, refashion that array + if (!$in_assignment) { + if (!$type instanceof TNonEmptyList + || (count($key_values) === 1 + && is_int($key_values[0]) + && $key_values[0] > 0 + && $key_values[0] > ($type->count - 1)) + ) { + $expected_offset_type = Type::getInt(); + + if ($codebase->config->ensure_array_int_offsets_exist) { + self::checkLiteralIntArrayOffset( + $offset_type, + $expected_offset_type, + $array_var_id, + $stmt, + $context, + $statements_analyzer + ); + } + $has_valid_offset = true; + } elseif (count($key_values) === 1 + && is_int($key_values[0]) + && $key_values[0] < 0 + ) { + $expected_offset_types[] = 'positive-int'; + $has_valid_offset = false; + } else { + $has_valid_offset = true; + } + } + + if ($in_assignment && $type instanceof TNonEmptyList && $type->count !== null) { + $type->count++; + } + + if ($in_assignment && $replacement_type) { + $type->type_param = Type::combineUnionTypes( + $type->type_param, + $replacement_type, + $codebase + ); + } + + $array_access_type = Type::combineUnionTypes( + $array_access_type, + $type->type_param + ); + } + + private static function handleArrayAccessOnNamedObject( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + TNamedObject $type, + Context $context, + bool $in_assignment, + ?PhpParser\Node\Expr $assign_value, + ?Union &$array_access_type, + bool &$has_array_access + ): void { + if (strtolower($type->value) === 'simplexmlelement') { + $call_array_access_type = new Union([new TNamedObject('SimpleXMLElement')]); + } elseif (strtolower($type->value) === 'domnodelist' && $stmt->dim) { + $old_data_provider = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $fake_method_call = new VirtualMethodCall( + $stmt->var, + new VirtualIdentifier('item', $stmt->var->getAttributes()), + [ + new VirtualArg($stmt->dim) + ] + ); + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); + } + + if (!in_array('MixedMethodCall', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['MixedMethodCall']); + } + + MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_method_call, + $context + ); + + if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['PossiblyInvalidMethodCall']); + } + + if (!in_array('MixedMethodCall', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['MixedMethodCall']); + } + + $call_array_access_type = $statements_analyzer->node_data->getType($fake_method_call) ?? Type::getMixed(); + + $statements_analyzer->node_data = $old_data_provider; + } else { + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); + } + + if (!in_array('MixedMethodCall', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['MixedMethodCall']); + } + + if ($in_assignment) { + $old_node_data = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $fake_set_method_call = new VirtualMethodCall( + $stmt->var, + new VirtualIdentifier('offsetSet', $stmt->var->getAttributes()), + [ + new VirtualArg( + $stmt->dim + ?? new VirtualConstFetch( + new VirtualName('null'), + $stmt->var->getAttributes() + ) + ), + new VirtualArg( + $assign_value ?? new VirtualConstFetch( + new VirtualName('null'), + $stmt->var->getAttributes() + ) + ), + ] + ); + + MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_set_method_call, + $context + ); + + $statements_analyzer->node_data = $old_node_data; + } + + if ($stmt->dim) { + $old_node_data = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $fake_get_method_call = new VirtualMethodCall( + $stmt->var, + new VirtualIdentifier('offsetGet', $stmt->var->getAttributes()), + [ + new VirtualArg( + $stmt->dim + ) + ] + ); + + MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_get_method_call, + $context + ); + + $call_array_access_type = + $statements_analyzer->node_data->getType($fake_get_method_call) ?? Type::getMixed(); + + $statements_analyzer->node_data = $old_node_data; + } else { + $call_array_access_type = Type::getVoid(); + } + + $has_array_access = true; + + if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['PossiblyInvalidMethodCall']); + } + + if (!in_array('MixedMethodCall', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['MixedMethodCall']); + } + } + + $array_access_type = Type::combineUnionTypes( + $array_access_type, + $call_array_access_type + ); + } + + /** + * @param list $expected_offset_types + */ + private static function handleArrayAccessOnString( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\ArrayDimFetch $stmt, + bool $in_assignment, + Context $context, + ?Union $replacement_type, + TString $type, + Union $offset_type, + array &$expected_offset_types, + ?Union &$array_access_type, + bool &$has_valid_offset + ): void { + if ($in_assignment && $replacement_type) { + if ($replacement_type->hasMixed()) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + IssueBuffer::maybeAdd( + new MixedStringOffsetAssignment( + 'Right-hand-side of string offset assignment cannot be mixed', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); + } + } + } + + if ($type instanceof TSingleLetter) { + $valid_offset_type = Type::getInt(false, 0); + } elseif ($type instanceof TLiteralString) { + if ($type->value === '') { + $valid_offset_type = Type::getEmpty(); + } elseif (strlen($type->value) < 10) { + $valid_offsets = []; + + for ($i = -strlen($type->value), $l = strlen($type->value); $i < $l; $i++) { + $valid_offsets[] = new TLiteralInt($i); + } + + if (!$valid_offsets) { + throw new UnexpectedValueException('This is weird'); + } + + $valid_offset_type = new Union($valid_offsets); + } else { + $valid_offset_type = Type::getInt(); + } + } else { + $valid_offset_type = Type::getInt(); + } + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $offset_type, + $valid_offset_type, + true + )) { + $expected_offset_types[] = $valid_offset_type->getId(); + + $array_access_type = Type::getMixed(); + } else { + $has_valid_offset = true; + + $array_access_type = Type::combineUnionTypes( + $array_access_type, + Type::getSingleLetter() + ); + } + } + + /** + * @param Atomic[] $offset_types + */ + private static function checkArrayOffsetType( + Union $offset_type, + array $offset_types, + Codebase $codebase + ): bool { + $has_valid_absolute_offset = false; + foreach ($offset_types as $atomic_offset_type) { + if ($atomic_offset_type instanceof TClassConstant) { + $expanded = TypeExpander::expandAtomic( + $codebase, + $atomic_offset_type, + $atomic_offset_type->fq_classlike_name, + $atomic_offset_type->fq_classlike_name, + null, + true, + true + ); + + if ($expanded instanceof Atomic) { + if (!$expanded instanceof TClassConstant) { + $has_valid_absolute_offset = self::checkArrayOffsetType( + $offset_type, + [$expanded], + $codebase + ); + } + } else { + $has_valid_absolute_offset = self::checkArrayOffsetType( + $offset_type, + $expanded, + $codebase + ); + } + + if ($has_valid_absolute_offset) { + break; + } + } + + if ($atomic_offset_type instanceof TFalse && + $offset_type->ignore_falsable_issues === true + ) { + //do nothing + } elseif ($atomic_offset_type instanceof TNull && + $offset_type->ignore_nullable_issues === true + ) { + //do nothing + } elseif ($atomic_offset_type instanceof TString || + $atomic_offset_type instanceof TInt || + $atomic_offset_type instanceof TArrayKey || + $atomic_offset_type instanceof TMixed + ) { + $has_valid_absolute_offset = true; + break; + } elseif ($atomic_offset_type instanceof TTemplateParam) { + $has_valid_absolute_offset = self::checkArrayOffsetType( + $offset_type, + $atomic_offset_type->as->getAtomicTypes(), + $codebase + ); + + if ($has_valid_absolute_offset) { + break; + } + } + } + return $has_valid_absolute_offset; + } +} 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 new file mode 100644 index 00000000..b34e983e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php @@ -0,0 +1,1217 @@ + $invalid_fetch_types $invalid_fetch_types + */ + public static function analyze( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\PropertyFetch $stmt, + Context $context, + bool $in_assignment, + ?string $var_id, + ?string $stmt_var_id, + Union $stmt_var_type, + Atomic $lhs_type_part, + string $prop_name, + bool &$has_valid_fetch_type, + array &$invalid_fetch_types, + bool $is_static_access = false + ): void { + if ($lhs_type_part instanceof TNull) { + return; + } + + if ($lhs_type_part instanceof TMixed) { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + return; + } + + if ($lhs_type_part instanceof TFalse && $stmt_var_type->ignore_falsable_issues) { + return; + } + + if (!$lhs_type_part instanceof TNamedObject && !$lhs_type_part instanceof TObject) { + $invalid_fetch_types[] = (string)$lhs_type_part; + + return; + } + + $has_valid_fetch_type = true; + + if ($lhs_type_part instanceof TObjectWithProperties + && isset($lhs_type_part->properties[$prop_name]) + ) { + $stmt_type = $statements_analyzer->node_data->getType($stmt); + + $statements_analyzer->node_data->setType( + $stmt, + Type::combineUnionTypes( + $lhs_type_part->properties[$prop_name], + $stmt_type + ) + ); + + return; + } + + // stdClass and SimpleXMLElement are special cases where we cannot infer the return types + // but we don't want to throw an error + // Hack has a similar issue: https://github.com/facebook/hhvm/issues/5164 + if ($lhs_type_part instanceof TObject + || in_array(strtolower($lhs_type_part->value), Config::getInstance()->getUniversalObjectCrates(), true) + ) { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + + return; + } + + if (ExpressionAnalyzer::isMock($lhs_type_part->value)) { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + return; + } + + $intersection_types = $lhs_type_part->getIntersectionTypes() ?: []; + + $fq_class_name = $lhs_type_part->value; + + $override_property_visibility = false; + + $has_magic_getter = false; + + $class_exists = false; + + $codebase = $statements_analyzer->getCodebase(); + + if (!$codebase->classExists($lhs_type_part->value) + && !$codebase->classlikes->enumExists($lhs_type_part->value) + ) { + $interface_exists = false; + + self::handleNonExistentClass( + $statements_analyzer, + $codebase, + $stmt, + $lhs_type_part, + $intersection_types, + $class_exists, + $interface_exists, + $fq_class_name, + $override_property_visibility + ); + + if (!$class_exists && !$interface_exists) { + return; + } + } else { + $class_exists = true; + } + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $config = $statements_analyzer->getProjectAnalyzer()->getConfig(); + + $property_id = $fq_class_name . '::$' . $prop_name; + + if ($class_storage->is_enum || in_array('UnitEnum', $codebase->getParentInterfaces($fq_class_name))) { + if ($prop_name === 'value' && !$class_storage->is_enum) { + $statements_analyzer->node_data->setType( + $stmt, + new Union([ + new TString(), + new TInt() + ]) + ); + } elseif ($prop_name === 'value' && $class_storage->enum_type !== null && $class_storage->enum_cases) { + self::handleEnumValue($statements_analyzer, $stmt, $class_storage); + } elseif ($prop_name === 'name') { + self::handleEnumName($statements_analyzer, $stmt, $lhs_type_part); + } else { + self::handleNonExistentProperty( + $statements_analyzer, + $codebase, + $stmt, + $context, + $config, + $class_storage, + $prop_name, + $lhs_type_part, + $fq_class_name, + $property_id, + $in_assignment, + $stmt_var_id, + $has_magic_getter, + $var_id + ); + } + + return; + } + + $naive_property_exists = $codebase->properties->propertyExists( + $property_id, + !$in_assignment, + $statements_analyzer, + $context, + $codebase->collect_locations ? new CodeLocation($statements_analyzer->getSource(), $stmt) : null + ); + + // add method before changing fq_class_name + $get_method_id = new MethodIdentifier($fq_class_name, '__get'); + + if (!$naive_property_exists + && $class_storage->namedMixins + ) { + foreach ($class_storage->namedMixins as $mixin) { + $new_property_id = $mixin->value . '::$' . $prop_name; + + try { + $new_class_storage = $codebase->classlike_storage_provider->get($mixin->value); + } catch (InvalidArgumentException $e) { + $new_class_storage = null; + } + + if ($new_class_storage + && ($codebase->properties->propertyExists( + $new_property_id, + !$in_assignment, + $statements_analyzer, + $context, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer->getSource(), $stmt) + : null + ) + || isset($new_class_storage->pseudo_property_get_types['$' . $prop_name])) + ) { + $fq_class_name = $mixin->value; + $lhs_type_part = clone $mixin; + $class_storage = $new_class_storage; + + if (!isset($new_class_storage->pseudo_property_get_types['$' . $prop_name])) { + $naive_property_exists = true; + } + + $property_id = $new_property_id; + } + } + } + + $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( + $property_id, + true, + $statements_analyzer + ); + + if (self::propertyFetchCanBeAnalyzed( + $statements_analyzer, + $codebase, + $stmt, + $context, + $fq_class_name, + $prop_name, + $lhs_type_part, + $property_id, + $has_magic_getter, + $stmt_var_id, + $naive_property_exists, + $override_property_visibility, + $class_exists, + $declaring_property_class, + $class_storage, + $get_method_id, + $in_assignment + ) === false) { + return; + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->name, + $property_id + ); + } + + if (!$naive_property_exists + && $fq_class_name !== $context->self + && $context->self + && $codebase->classlikes->classExtends($fq_class_name, $context->self) + && $codebase->properties->propertyExists( + $context->self . '::$' . $prop_name, + true, + $statements_analyzer, + $context, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer->getSource(), $stmt) + : null + ) + ) { + $property_id = $context->self . '::$' . $prop_name; + } elseif (!$naive_property_exists + || (!$is_static_access + // when property existence is asserted by a plugin it doesn't necessarily has storage + && $codebase->properties->hasStorage($property_id) + && $codebase->properties->getStorage($property_id)->is_static + ) + ) { + self::handleNonExistentProperty( + $statements_analyzer, + $codebase, + $stmt, + $context, + $config, + $class_storage, + $prop_name, + $lhs_type_part, + $declaring_property_class, + $property_id, + $in_assignment, + $stmt_var_id, + $has_magic_getter, + $var_id + ); + + return; + } + + if (!$override_property_visibility) { + if (ClassLikeAnalyzer::checkPropertyVisibility( + $property_id, + $context, + $statements_analyzer, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues() + ) === false) { + return; + } + } + + // FIXME: the following line look superfluous, but removing it makes + // Psalm\Tests\PropertyTypeTest::testValidCode with data set "callInParentContext" + // fail + $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( + $property_id, + true, + $statements_analyzer + ); + + if ($declaring_property_class === null) { + return; + } + + if ($codebase->properties_to_rename) { + $declaring_property_id = strtolower($declaring_property_class) . '::$' . $prop_name; + + foreach ($codebase->properties_to_rename as $original_property_id => $new_property_name) { + if ($declaring_property_id === $original_property_id) { + $file_manipulations = [ + new FileManipulation( + (int) $stmt->name->getAttribute('startFilePos'), + (int) $stmt->name->getAttribute('endFilePos') + 1, + $new_property_name + ) + ]; + + FileManipulationBuffer::add( + $statements_analyzer->getFilePath(), + $file_manipulations + ); + } + } + } + + $declaring_class_storage = $codebase->classlike_storage_provider->get( + $declaring_property_class + ); + + if (isset($declaring_class_storage->properties[$prop_name])) { + self::checkPropertyDeprecation($prop_name, $declaring_property_class, $stmt, $statements_analyzer); + + $property_storage = $declaring_class_storage->properties[$prop_name]; + + if ($context->self && !NamespaceAnalyzer::isWithinAny($context->self, $property_storage->internal)) { + IssueBuffer::maybeAdd( + new InternalProperty( + $property_id . ' is internal to ' . InternalClass::listToPhrase($property_storage->internal) + . ' but called from ' . $context->self, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($context->inside_unset) { + InstancePropertyAssignmentAnalyzer::trackPropertyImpurity( + $statements_analyzer, + $stmt, + $property_id, + $property_storage, + $declaring_class_storage, + $context + ); + } + } + + $class_property_type = self::getClassPropertyType( + $statements_analyzer, + $codebase, + $config, + $context, + $stmt, + $class_storage, + $declaring_class_storage, + $property_id, + $fq_class_name, + $prop_name, + $lhs_type_part + ); + + if (!$context->collect_mutations + && !$context->collect_initializations + && !($class_storage->external_mutation_free + && $class_property_type->allow_mutations) + ) { + if ($context->pure) { + IssueBuffer::maybeAdd( + new ImpurePropertyFetch( + 'Cannot access a property on a mutable object from a pure context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_impure = true; + } + } + + self::processTaints( + $statements_analyzer, + $stmt, + $class_property_type, + $property_id, + $class_storage, + $in_assignment, + $context + ); + + if ($class_storage->mutation_free) { + $class_property_type->has_mutations = false; + } + + $stmt_type = $statements_analyzer->node_data->getType($stmt); + $statements_analyzer->node_data->setType( + $stmt, + Type::combineUnionTypes($class_property_type, $stmt_type) + ); + } + + /** + * @param PropertyFetch|StaticPropertyFetch $stmt + */ + public static function checkPropertyDeprecation( + string $prop_name, + string $declaring_property_class, + PhpParser\Node\Expr $stmt, + StatementsAnalyzer $statements_analyzer + ): void { + $property_id = $declaring_property_class . '::$' . $prop_name; + $codebase = $statements_analyzer->getCodebase(); + $declaring_class_storage = $codebase->classlike_storage_provider->get( + $declaring_property_class + ); + + if (isset($declaring_class_storage->properties[$prop_name])) { + $property_storage = $declaring_class_storage->properties[$prop_name]; + + if ($property_storage->deprecated) { + IssueBuffer::maybeAdd( + new DeprecatedProperty( + $property_id . ' is marked deprecated', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + private static function propertyFetchCanBeAnalyzed( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\PropertyFetch $stmt, + Context $context, + string $fq_class_name, + string $prop_name, + TNamedObject $lhs_type_part, + string &$property_id, + bool &$has_magic_getter, + ?string $stmt_var_id, + bool $naive_property_exists, + bool $override_property_visibility, + bool $class_exists, + ?string $declaring_property_class, + ClassLikeStorage $class_storage, + MethodIdentifier $get_method_id, + bool $in_assignment + ): bool { + if ((!$naive_property_exists + || ($stmt_var_id !== '$this' + && $fq_class_name !== $context->self + && ClassLikeAnalyzer::checkPropertyVisibility( + $property_id, + $context, + $statements_analyzer, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues(), + false + ) !== true) + ) + && $codebase->methods->methodExists( + $get_method_id, + $context->calling_method_id, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer->getSource(), $stmt) + : null, + !$context->collect_initializations + && !$context->collect_mutations + ? $statements_analyzer + : null, + $statements_analyzer->getFilePath() + ) + ) { + $has_magic_getter = true; + + if (isset($class_storage->pseudo_property_get_types['$' . $prop_name])) { + $stmt_type = TypeExpander::expandUnion( + $codebase, + clone $class_storage->pseudo_property_get_types['$' . $prop_name], + $class_storage->name, + $class_storage->name, + $class_storage->parent_class + ); + + if (count($template_types = $class_storage->getClassTemplateTypes()) !== 0) { + if (!$lhs_type_part instanceof TGenericObject) { + $lhs_type_part = new TGenericObject($lhs_type_part->value, $template_types); + } + + $stmt_type = self::localizePropertyType( + $codebase, + $stmt_type, + $lhs_type_part, + $class_storage, + $declaring_property_class + ? $codebase->classlike_storage_provider->get( + $declaring_property_class + ) : $class_storage + ); + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + self::processTaints( + $statements_analyzer, + $stmt, + $stmt_type, + $property_id, + $class_storage, + $in_assignment, + $context + ); + + return false; + } + + $old_data_provider = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $statements_analyzer->node_data->setType($stmt->var, new Union([$lhs_type_part])); + + $fake_method_call = new VirtualMethodCall( + $stmt->var, + new VirtualIdentifier('__get', $stmt->name->getAttributes()), + [ + new VirtualArg( + new VirtualString( + $prop_name, + $stmt->name->getAttributes() + ) + ) + ] + ); + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('InternalMethod', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['InternalMethod']); + } + + MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_method_call, + $context, + false + ); + + if (!in_array('InternalMethod', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['InternalMethod']); + } + + $fake_method_call_type = $statements_analyzer->node_data->getType($fake_method_call); + + $statements_analyzer->node_data = $old_data_provider; + + if ($fake_method_call_type) { + $stmt_type = $statements_analyzer->node_data->getType($stmt); + $statements_analyzer->node_data->setType( + $stmt, + Type::combineUnionTypes($fake_method_call_type, $stmt_type) + ); + } else { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } + + /* + * If we have an explicit list of all allowed magic properties on the class, and we're + * not in that list, fall through + */ + if (!($class_storage->sealed_properties || $codebase->config->seal_all_properties) + && !$override_property_visibility + ) { + return false; + } + + if (!$class_exists) { + $property_id = $lhs_type_part->value . '::$' . $prop_name; + + IssueBuffer::maybeAdd( + new UndefinedMagicPropertyFetch( + 'Magic instance property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + return false; + } + } + + return true; + } + + public static function localizePropertyType( + Codebase $codebase, + Union $class_property_type, + TGenericObject $lhs_type_part, + ClassLikeStorage $property_class_storage, + ClassLikeStorage $property_declaring_class_storage + ): Union { + $template_types = CallAnalyzer::getTemplateTypesForCall( + $codebase, + $property_declaring_class_storage, + $property_declaring_class_storage->name, + $property_class_storage, + $property_class_storage->template_types ?: [] + ); + + $extended_types = $property_class_storage->template_extended_params; + + if ($template_types) { + if ($property_class_storage->template_types) { + foreach ($lhs_type_part->type_params as $param_offset => $lhs_param_type) { + $i = -1; + + foreach ($property_class_storage->template_types as $calling_param_name => $_) { + $i++; + + if ($i === $param_offset) { + $template_types[$calling_param_name][$property_class_storage->name] = $lhs_param_type; + break; + } + } + } + } + + foreach ($template_types as $type_name => $_) { + if (isset($extended_types[$property_declaring_class_storage->name][$type_name])) { + $mapped_type = $extended_types[$property_declaring_class_storage->name][$type_name]; + + foreach ($mapped_type->getAtomicTypes() as $mapped_type_atomic) { + if (!$mapped_type_atomic instanceof TTemplateParam) { + continue; + } + + $param_name = $mapped_type_atomic->param_name; + + $position = false; + + if (isset($property_class_storage->template_types[$param_name])) { + $position = array_search( + $param_name, + array_keys($property_class_storage->template_types) + ); + } + + if ($position !== false && isset($lhs_type_part->type_params[$position])) { + $template_types[$type_name][$property_declaring_class_storage->name] + = $lhs_type_part->type_params[$position]; + } + } + } + } + + TemplateInferredTypeReplacer::replace( + $class_property_type, + new TemplateResult([], $template_types), + $codebase + ); + } + + return $class_property_type; + } + + public static function processTaints( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\PropertyFetch $stmt, + Union $type, + string $property_id, + ClassLikeStorage $class_storage, + bool $in_assignment, + ?Context $context = null + ): void { + if (!$statements_analyzer->data_flow_graph) { + return; + } + + $data_flow_graph = $statements_analyzer->data_flow_graph; + + $var_location = new CodeLocation($statements_analyzer->getSource(), $stmt->var); + $property_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + $added_taints = []; + $removed_taints = []; + + if ($context) { + $codebase = $statements_analyzer->getCodebase(); + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + } + + if ($class_storage->specialize_instance) { + $var_id = ExpressionIdentifier::getArrayVarId( + $stmt->var, + null, + $statements_analyzer + ); + + $var_property_id = ExpressionIdentifier::getArrayVarId( + $stmt, + null, + $statements_analyzer + ); + + if ($var_id) { + $var_type = $statements_analyzer->node_data->getType($stmt->var); + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && $var_type + && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + $var_type->parent_nodes = []; + return; + } + + $var_node = DataFlowNode::getForAssignment( + $var_id, + $var_location + ); + + $data_flow_graph->addNode($var_node); + + $property_node = DataFlowNode::getForAssignment( + $var_property_id ?: $var_id . '->$property', + $property_location + ); + + $data_flow_graph->addNode($property_node); + + $data_flow_graph->addPath( + $var_node, + $property_node, + 'property-fetch' + . ($stmt->name instanceof PhpParser\Node\Identifier ? '-' . $stmt->name : ''), + $added_taints, + $removed_taints + ); + + if ($var_type && $var_type->parent_nodes) { + foreach ($var_type->parent_nodes as $parent_node) { + $data_flow_graph->addPath( + $parent_node, + $var_node, + '=', + $added_taints, + $removed_taints + ); + } + } + + $type->parent_nodes = [$property_node->id => $property_node]; + } + } else { + $var_property_id = ExpressionIdentifier::getArrayVarId( + $stmt, + null, + $statements_analyzer + ); + + $localized_property_node = DataFlowNode::getForAssignment( + $var_property_id + ?: $property_id . '-' . $property_location->file_name . ':' . $property_location->raw_file_start, + $property_location + ); + + $data_flow_graph->addNode($localized_property_node); + + $property_node = new DataFlowNode( + $property_id, + $property_id, + null, + null + ); + + $data_flow_graph->addNode($property_node); + + if ($in_assignment) { + $data_flow_graph->addPath( + $localized_property_node, + $property_node, + 'property-assignment', + $added_taints, + $removed_taints + ); + } else { + $data_flow_graph->addPath( + $property_node, + $localized_property_node, + 'property-fetch', + $added_taints, + $removed_taints + ); + } + + $type->parent_nodes = [$localized_property_node->id => $localized_property_node]; + } + } + + private static function handleEnumName( + StatementsAnalyzer $statements_analyzer, + PropertyFetch $stmt, + Atomic $lhs_type_part + ): void { + if ($lhs_type_part instanceof TEnumCase) { + $statements_analyzer->node_data->setType( + $stmt, + new Union([new TLiteralString($lhs_type_part->case_name)]) + ); + } else { + $statements_analyzer->node_data->setType($stmt, Type::getNonEmptyString()); + } + } + + private static function handleEnumValue( + StatementsAnalyzer $statements_analyzer, + PropertyFetch $stmt, + ClassLikeStorage $class_storage + ): void { + $case_values = []; + + foreach ($class_storage->enum_cases as $enum_case) { + if (is_string($enum_case->value)) { + $case_values[] = new TLiteralString($enum_case->value); + } elseif (is_int($enum_case->value)) { + $case_values[] = new TLiteralInt($enum_case->value); + } else { + // this should never happen + $case_values[] = new TMixed(); + } + } + + // todo: this is suboptimal when we reference enum directly, e.g. Status::Open->value + /** @psalm-suppress ArgumentTypeCoercion */ + $statements_analyzer->node_data->setType( + $stmt, + new Union($case_values) + ); + } + + private static function handleUndefinedProperty( + Context $context, + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\PropertyFetch $stmt, + ?string $stmt_var_id, + string $property_id, + bool $has_magic_getter, + ?string $var_id + ): void { + if ($context->inside_isset || $context->collect_initializations) { + if ($context->pure) { + IssueBuffer::maybeAdd( + new ImpurePropertyFetch( + 'Cannot access a property on a mutable object from a pure context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($context->inside_isset + && $statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_impure = true; + } + + return; + } + + if ($stmt_var_id === '$this') { + IssueBuffer::maybeAdd( + new UndefinedThisPropertyFetch( + 'Instance property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + if ($has_magic_getter) { + IssueBuffer::maybeAdd( + new UndefinedMagicPropertyFetch( + 'Magic instance property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new UndefinedPropertyFetch( + 'Instance property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + $stmt_type = Type::getMixed(); + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + if ($var_id) { + $context->vars_in_scope[$var_id] = $stmt_type; + } + } + + /** + * @param array $intersection_types + */ + private static function handleNonExistentClass( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\PropertyFetch $stmt, + TNamedObject $lhs_type_part, + array $intersection_types, + bool &$class_exists, + bool &$interface_exists, + string &$fq_class_name, + bool &$override_property_visibility + ): void { + if ($codebase->interfaceExists($lhs_type_part->value)) { + $interface_exists = true; + $interface_storage = $codebase->classlike_storage_provider->get($lhs_type_part->value); + + $override_property_visibility = $interface_storage->override_property_visibility; + + foreach ($intersection_types as $intersection_type) { + if ($intersection_type instanceof TNamedObject + && $codebase->classExists($intersection_type->value) + ) { + $fq_class_name = $intersection_type->value; + $class_exists = true; + return; + } + } + + if (!$class_exists && + //interfaces can't have properties. Except when they do... In PHP Core, they can + !in_array($fq_class_name, ['UnitEnum', 'BackedEnum'], true) && + !in_array('UnitEnum', $codebase->getParentInterfaces($fq_class_name)) + ) { + if (IssueBuffer::accepts( + new NoInterfaceProperties( + 'Interfaces cannot have properties', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $lhs_type_part->value + ), + $statements_analyzer->getSuppressedIssues() + )) { + return; + } + + if (!$codebase->methodExists($fq_class_name . '::__set')) { + return; + } + } + } + + if (!$class_exists && !$interface_exists) { + if ($lhs_type_part->from_docblock) { + IssueBuffer::maybeAdd( + new UndefinedDocblockClass( + 'Cannot get properties of undefined docblock class ' . $lhs_type_part->value, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $lhs_type_part->value + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new UndefinedClass( + 'Cannot get properties of undefined class ' . $lhs_type_part->value, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $lhs_type_part->value + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + private static function handleNonExistentProperty( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + PhpParser\Node\Expr\PropertyFetch $stmt, + Context $context, + Config $config, + ClassLikeStorage $class_storage, + string $prop_name, + TNamedObject $lhs_type_part, + ?string $declaring_property_class, + string $property_id, + bool $in_assignment, + ?string $stmt_var_id, + bool $has_magic_getter, + ?string $var_id + ): void { + if ($config->use_phpdoc_property_without_magic_or_parent + && isset($class_storage->pseudo_property_get_types['$' . $prop_name]) + ) { + $stmt_type = clone $class_storage->pseudo_property_get_types['$' . $prop_name]; + + if (count($template_types = $class_storage->getClassTemplateTypes()) !== 0) { + if (!$lhs_type_part instanceof TGenericObject) { + $lhs_type_part = new TGenericObject($lhs_type_part->value, $template_types); + } + + $stmt_type = self::localizePropertyType( + $codebase, + $stmt_type, + $lhs_type_part, + $class_storage, + $declaring_property_class + ? $codebase->classlike_storage_provider->get( + $declaring_property_class + ) : $class_storage + ); + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + self::processTaints( + $statements_analyzer, + $stmt, + $stmt_type, + $property_id, + $class_storage, + $in_assignment, + $context + ); + + return; + } + + if ($class_storage->is_interface) { + return; + } + + self::handleUndefinedProperty( + $context, + $statements_analyzer, + $stmt, + $stmt_var_id, + $property_id, + $has_magic_getter, + $var_id + ); + } + + private static function getClassPropertyType( + StatementsAnalyzer $statements_analyzer, + Codebase $codebase, + Config $config, + Context $context, + PhpParser\Node\Expr\PropertyFetch $stmt, + ClassLikeStorage $class_storage, + ClassLikeStorage $declaring_class_storage, + string $property_id, + string $fq_class_name, + string $prop_name, + TNamedObject $lhs_type_part + ): Union { + $class_property_type = $codebase->properties->getPropertyType( + $property_id, + false, + $statements_analyzer, + $context + ); + + if (!$class_property_type) { + if ($declaring_class_storage->location + && $config->isInProjectDirs( + $declaring_class_storage->location->file_path + ) + ) { + IssueBuffer::maybeAdd( + new MissingPropertyType( + 'Property ' . $fq_class_name . '::$' . $prop_name + . ' does not have a declared type', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + $class_property_type = Type::getMixed(); + } else { + $class_property_type = TypeExpander::expandUnion( + $codebase, + clone $class_property_type, + $declaring_class_storage->name, + $declaring_class_storage->name, + $declaring_class_storage->parent_class + ); + + if (count($template_types = $declaring_class_storage->getClassTemplateTypes()) !== 0) { + if (!$lhs_type_part instanceof TGenericObject) { + $lhs_type_part = new TGenericObject($lhs_type_part->value, $template_types); + } + + $class_property_type = self::localizePropertyType( + $codebase, + $class_property_type, + $lhs_type_part, + $class_storage, + $declaring_class_storage + ); + } elseif ($lhs_type_part instanceof TGenericObject) { + $class_property_type = self::localizePropertyType( + $codebase, + $class_property_type, + $lhs_type_part, + $class_storage, + $declaring_class_storage + ); + } + } + + return $class_property_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php new file mode 100644 index 00000000..8ed56437 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php @@ -0,0 +1,679 @@ +class and + * analyse the ::class int $stmt->name separately + */ + public static function analyze( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\ClassConstFetch $stmt, + Context $context + ): bool { + $codebase = $statements_analyzer->getCodebase(); + + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + + if ($stmt->class instanceof PhpParser\Node\Name) { + $first_part_lc = strtolower($stmt->class->parts[0]); + + if ($first_part_lc === 'self' || $first_part_lc === 'static') { + if (!$context->self) { + if (IssueBuffer::accepts( + new NonStaticSelfCall( + 'Cannot use ' . $first_part_lc . ' outside class context', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + return true; + } + + $fq_class_name = $context->self; + } elseif ($first_part_lc === 'parent') { + $fq_class_name = $statements_analyzer->getParentFQCLN(); + + if ($fq_class_name === null) { + if (IssueBuffer::accepts( + new ParentNotFound( + 'Cannot check property fetch on parent as this class does not extend another', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + return true; + } + } else { + $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( + $stmt->class, + $statements_analyzer->getAliases() + ); + + if ($stmt->name instanceof PhpParser\Node\Identifier) { + if ((!$context->inside_class_exists || $stmt->name->name !== 'class') + && !isset($context->phantom_classes[strtolower($fq_class_name)]) + ) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $fq_class_name, + new CodeLocation($statements_analyzer->getSource(), $stmt->class), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions(false, true) + ) === false) { + return true; + } + } + } + } + + $fq_class_name_lc = strtolower($fq_class_name); + + $moved_class = false; + + if ($codebase->alter_code + && !in_array($stmt->class->parts[0], ['parent', 'static']) + ) { + $moved_class = $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $stmt->class, + $fq_class_name, + $context->calling_method_id, + false, + $stmt->class->parts[0] === 'self' + ); + } + + if ($codebase->classlikes->classExists($fq_class_name)) { + $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); + } + + if ($stmt->name instanceof PhpParser\Node\Identifier && $stmt->name->name === 'class') { + if ($codebase->classlikes->classExists($fq_class_name)) { + $const_class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + $fq_class_name = $const_class_storage->name; + + if ($const_class_storage->deprecated && $fq_class_name !== $context->self) { + IssueBuffer::maybeAdd( + new DeprecatedClass( + 'Class ' . $fq_class_name . ' is deprecated', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_class_name + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($first_part_lc === 'static') { + $static_named_object = new TNamedObject($fq_class_name); + $static_named_object->was_static = true; + + $statements_analyzer->node_data->setType( + $stmt, + new Union([ + new TClassString($fq_class_name, $static_named_object) + ]) + ); + } else { + $statements_analyzer->node_data->setType($stmt, Type::getLiteralClassString($fq_class_name, true)); + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->class, + $fq_class_name + ); + } + + return true; + } + + // if we're ignoring that the class doesn't exist, exit anyway + if (!$codebase->classlikes->classOrInterfaceOrEnumExists($fq_class_name)) { + return true; + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->class, + $fq_class_name + ); + } + + if (!$stmt->name instanceof PhpParser\Node\Identifier) { + return true; + } + + $const_id = $fq_class_name . '::' . $stmt->name; + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->name, + $const_id + ); + } + + $const_class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + if ($const_class_storage->is_enum) { + $case = $const_class_storage->enum_cases[(string)$stmt->name] ?? null; + if ($case && $case->deprecated) { + IssueBuffer::maybeAdd( + new DeprecatedConstant( + "Enum Case $const_id is marked as deprecated", + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($fq_class_name === $context->self + || ( + $statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer && + $fq_class_name === $statements_analyzer->getSource()->getFQCLN() + ) + ) { + $class_visibility = ReflectionProperty::IS_PRIVATE; + } elseif ($context->self && + ($codebase->classlikes->classExtends($context->self, $fq_class_name) + || $codebase->classlikes->classExtends($fq_class_name, $context->self)) + ) { + $class_visibility = ReflectionProperty::IS_PROTECTED; + } else { + $class_visibility = ReflectionProperty::IS_PUBLIC; + } + + try { + $class_constant_type = $codebase->classlikes->getClassConstantType( + $fq_class_name, + $stmt->name->name, + $class_visibility, + $statements_analyzer + ); + } catch (InvalidArgumentException $_) { + return true; + } catch (CircularReferenceException $e) { + IssueBuffer::maybeAdd( + new CircularReference( + 'Constant ' . $const_id . ' contains a circular reference', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return true; + } + + if (!$class_constant_type) { + if ($fq_class_name !== $context->self) { + $class_constant_type = $codebase->classlikes->getClassConstantType( + $fq_class_name, + $stmt->name->name, + ReflectionProperty::IS_PRIVATE, + $statements_analyzer + ); + } + + if ($class_constant_type) { + IssueBuffer::maybeAdd( + new InaccessibleClassConstant( + 'Constant ' . $const_id . ' is not visible in this context', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($context->check_consts) { + IssueBuffer::maybeAdd( + new UndefinedConstant( + 'Constant ' . $const_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + return true; + } + + if ($context->calling_method_id) { + $codebase->file_reference_provider->addMethodReferenceToClassMember( + $context->calling_method_id, + $fq_class_name_lc . '::' . $stmt->name->name, + false + ); + } + + $declaring_const_id = $fq_class_name_lc . '::' . $stmt->name->name; + + if ($codebase->alter_code && !$moved_class) { + foreach ($codebase->class_constant_transforms as $original_pattern => $transformation) { + if ($declaring_const_id === $original_pattern) { + [$new_fq_class_name, $new_const_name] = explode('::', $transformation); + + $file_manipulations = []; + + if (strtolower($new_fq_class_name) !== $fq_class_name_lc) { + $file_manipulations[] = new FileManipulation( + (int) $stmt->class->getAttribute('startFilePos'), + (int) $stmt->class->getAttribute('endFilePos') + 1, + Type::getStringFromFQCLN( + $new_fq_class_name, + $statements_analyzer->getNamespace(), + $statements_analyzer->getAliasedClassesFlipped(), + null + ) + ); + } + + $file_manipulations[] = new FileManipulation( + (int) $stmt->name->getAttribute('startFilePos'), + (int) $stmt->name->getAttribute('endFilePos') + 1, + $new_const_name + ); + + FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); + } + } + } + + if ($context->self + && !$context->collect_initializations + && !$context->collect_mutations + && !NamespaceAnalyzer::isWithinAny($context->self, $const_class_storage->internal) + ) { + IssueBuffer::maybeAdd( + new InternalClass( + $fq_class_name . ' is internal to ' + . InternalClass::listToPhrase($const_class_storage->internal) + . ' but called from ' . $context->self, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_class_name + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($const_class_storage->deprecated && $fq_class_name !== $context->self) { + IssueBuffer::maybeAdd( + new DeprecatedClass( + 'Class ' . $fq_class_name . ' is deprecated', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_class_name + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif (isset($const_class_storage->constants[$stmt->name->name]) + && $const_class_storage->constants[$stmt->name->name]->deprecated + ) { + IssueBuffer::maybeAdd( + new DeprecatedConstant( + 'Constant ' . $const_id . ' is deprecated', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($first_part_lc !== 'static' || $const_class_storage->final) { + $stmt_type = clone $class_constant_type; + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + $context->vars_in_scope[$const_id] = $stmt_type; + } + + return true; + } + + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->class, $context) === false) { + $context->inside_general_use = $was_inside_general_use; + + return false; + } + + $context->inside_general_use = $was_inside_general_use; + + $lhs_type = $statements_analyzer->node_data->getType($stmt->class); + + if ($lhs_type === null) { + return true; + } + + if ($stmt->name instanceof PhpParser\Node\Identifier && $stmt->name->name === 'class') { + $class_string_types = []; + + $has_mixed_or_object = false; + + foreach ($lhs_type->getAtomicTypes() as $lhs_atomic_type) { + if ($lhs_atomic_type instanceof TNamedObject) { + $class_string_types[] = new TClassString( + $lhs_atomic_type->value, + clone $lhs_atomic_type + ); + } elseif ($lhs_atomic_type instanceof TTemplateParam + && $lhs_atomic_type->as->isSingle()) { + $as_atomic_type = $lhs_atomic_type->as->getSingleAtomic(); + + if ($as_atomic_type instanceof TObject) { + $class_string_types[] = new TTemplateParamClass( + $lhs_atomic_type->param_name, + 'object', + null, + $lhs_atomic_type->defining_class + ); + } elseif ($as_atomic_type instanceof TNamedObject) { + $class_string_types[] = new TTemplateParamClass( + $lhs_atomic_type->param_name, + $as_atomic_type->value, + $as_atomic_type, + $lhs_atomic_type->defining_class + ); + } + } elseif ($lhs_atomic_type instanceof TObject + || $lhs_atomic_type instanceof TMixed + ) { + $has_mixed_or_object = true; + } + } + + if ($has_mixed_or_object) { + $statements_analyzer->node_data->setType($stmt, new Union([new TClassString()])); + } elseif ($class_string_types) { + $statements_analyzer->node_data->setType($stmt, new Union($class_string_types)); + } + + return true; + } + + if ($stmt->class instanceof PhpParser\Node\Expr\Variable) { + $fq_class_name = null; + $lhs_type_definite_class = null; + if ($lhs_type->isSingle()) { + $atomic_type = $lhs_type->getSingleAtomic(); + if ($atomic_type instanceof TNamedObject) { + $fq_class_name = $atomic_type->value; + $lhs_type_definite_class = $atomic_type->definite_class; + } elseif ($atomic_type instanceof TLiteralClassString) { + $fq_class_name = $atomic_type->value; + $lhs_type_definite_class = $atomic_type->definite_class; + } + } + + if ($fq_class_name === null || $lhs_type_definite_class === null) { + return true; + } + + if ($codebase->classlikes->classExists($fq_class_name)) { + $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); + } + + $moved_class = false; + + if ($codebase->alter_code) { + $moved_class = $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $stmt->class, + $fq_class_name, + $context->calling_method_id + ); + } + + // if we're ignoring that the class doesn't exist, exit anyway + if (!$codebase->classlikes->classOrInterfaceOrEnumExists($fq_class_name)) { + return true; + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->class, + $fq_class_name + ); + } + + if (!$stmt->name instanceof PhpParser\Node\Identifier) { + return true; + } + + $const_id = $fq_class_name . '::' . $stmt->name; + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->name, + $const_id + ); + } + + $const_class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + if ($fq_class_name === $context->self + || ( + $statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer && + $fq_class_name === $statements_analyzer->getSource()->getFQCLN() + ) + ) { + $class_visibility = ReflectionProperty::IS_PRIVATE; + } elseif ($context->self && + ($codebase->classlikes->classExtends($context->self, $fq_class_name) + || $codebase->classlikes->classExtends($fq_class_name, $context->self)) + ) { + $class_visibility = ReflectionProperty::IS_PROTECTED; + } else { + $class_visibility = ReflectionProperty::IS_PUBLIC; + } + + try { + $class_constant_type = $codebase->classlikes->getClassConstantType( + $fq_class_name, + $stmt->name->name, + $class_visibility, + $statements_analyzer + ); + } catch (InvalidArgumentException $_) { + return true; + } catch (CircularReferenceException $e) { + IssueBuffer::maybeAdd( + new CircularReference( + 'Constant ' . $const_id . ' contains a circular reference', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return true; + } + + if (!$class_constant_type) { + if ($fq_class_name !== $context->self) { + $class_constant_type = $codebase->classlikes->getClassConstantType( + $fq_class_name, + $stmt->name->name, + ReflectionProperty::IS_PRIVATE, + $statements_analyzer + ); + } + + if ($class_constant_type) { + IssueBuffer::maybeAdd( + new InaccessibleClassConstant( + 'Constant ' . $const_id . ' is not visible in this context', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($context->check_consts) { + IssueBuffer::maybeAdd( + new UndefinedConstant( + 'Constant ' . $const_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + return true; + } + + if ($context->calling_method_id) { + $codebase->file_reference_provider->addMethodReferenceToClassMember( + $context->calling_method_id, + strtolower($fq_class_name) . '::' . $stmt->name->name, + false + ); + } + + $declaring_const_id = strtolower($fq_class_name) . '::' . $stmt->name->name; + + if ($codebase->alter_code && !$moved_class) { + foreach ($codebase->class_constant_transforms as $original_pattern => $transformation) { + if ($declaring_const_id === $original_pattern) { + [, $new_const_name] = explode('::', $transformation); + + $file_manipulations = []; + + $file_manipulations[] = new FileManipulation( + (int) $stmt->name->getAttribute('startFilePos'), + (int) $stmt->name->getAttribute('endFilePos') + 1, + $new_const_name + ); + + FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); + } + } + } + + if ($context->self + && !$context->collect_initializations + && !$context->collect_mutations + && !NamespaceAnalyzer::isWithinAny($context->self, $const_class_storage->internal) + ) { + IssueBuffer::maybeAdd( + new InternalClass( + $fq_class_name . ' is internal to ' + . InternalClass::listToPhrase($const_class_storage->internal) + . ' but called from ' . $context->self, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_class_name + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($const_class_storage->deprecated && $fq_class_name !== $context->self) { + IssueBuffer::maybeAdd( + new DeprecatedClass( + 'Class ' . $fq_class_name . ' is deprecated', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $fq_class_name + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif (isset($const_class_storage->constants[$stmt->name->name]) + && $const_class_storage->constants[$stmt->name->name]->deprecated + ) { + IssueBuffer::maybeAdd( + new DeprecatedConstant( + 'Constant ' . $const_id . ' is deprecated', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($const_class_storage->final || $lhs_type_definite_class === true) { + $stmt_type = clone $class_constant_type; + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + $context->vars_in_scope[$const_id] = $stmt_type; + } + + return true; + } + + return true; + } + + public static function analyzeClassConstAssignment( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Stmt\ClassConst $stmt, + Context $context + ): void { + foreach ($stmt->consts as $const) { + ExpressionAnalyzer::analyze($statements_analyzer, $const->value, $context); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php new file mode 100644 index 00000000..2d0d50e7 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php @@ -0,0 +1,309 @@ +name->parts); + + switch (strtolower($const_name)) { + case 'null': + $statements_analyzer->node_data->setType($stmt, Type::getNull()); + break; + + case 'false': + // false is a subtype of bool + $statements_analyzer->node_data->setType($stmt, Type::getFalse()); + break; + + case 'true': + $statements_analyzer->node_data->setType($stmt, Type::getTrue()); + break; + + case 'stdin': + $statements_analyzer->node_data->setType($stmt, Type::getResource()); + break; + + default: + $const_type = self::getConstType( + $statements_analyzer, + $const_name, + $stmt->name instanceof PhpParser\Node\Name\FullyQualified, + $context + ); + + $codebase = $statements_analyzer->getCodebase(); + + $aliased_constants = $statements_analyzer->getAliases()->constants; + if (isset($aliased_constants[$const_name])) { + $fq_const_name = $aliased_constants[$const_name]; + } elseif ($stmt->name instanceof PhpParser\Node\Name\FullyQualified) { + $fq_const_name = $const_name; + } else { + $fq_const_name = Type::getFQCLNFromString($const_name, $statements_analyzer->getAliases()); + } + + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt, + $const_type + ? $fq_const_name + : '*' + . ($stmt->name instanceof PhpParser\Node\Name\FullyQualified + ? '\\' + : $statements_analyzer->getNamespace() . '-') + . $const_name + ); + + if ($const_type) { + $statements_analyzer->node_data->setType($stmt, clone $const_type); + } elseif ($context->check_consts) { + IssueBuffer::maybeAdd( + new UndefinedConstant( + 'Const ' . $const_name . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + + public static function getGlobalConstType( + Codebase $codebase, + string $fq_const_name, + string $const_name + ): ?Union { + if ($const_name === 'STDERR' + || $const_name === 'STDOUT' + || $const_name === 'STDIN' + ) { + return Type::getResource(); + } + + if ($fq_const_name) { + $stubbed_const_type = $codebase->getStubbedConstantType( + $fq_const_name + ); + + if ($stubbed_const_type) { + return $stubbed_const_type; + } + } + + $stubbed_const_type = $codebase->getStubbedConstantType( + $const_name + ); + + if ($stubbed_const_type) { + return $stubbed_const_type; + } + + $predefined_constants = $codebase->config->getPredefinedConstants(); + + if (($fq_const_name && array_key_exists($fq_const_name, $predefined_constants)) + || array_key_exists($const_name, $predefined_constants) + ) { + switch ($const_name) { + case 'PHP_VERSION': + case 'DIRECTORY_SEPARATOR': + case 'PATH_SEPARATOR': + case 'PHP_EOL': + return Type::getNonEmptyString(); + + case 'PEAR_EXTENSION_DIR': + case 'PEAR_INSTALL_DIR': + case 'PHP_BINARY': + case 'PHP_BINDIR': + case 'PHP_CONFIG_FILE_PATH': + case 'PHP_CONFIG_FILE_SCAN_DIR': + case 'PHP_DATADIR': + case 'PHP_EXTENSION_DIR': + case 'PHP_EXTRA_VERSION': + case 'PHP_LIBDIR': + case 'PHP_LOCALSTATEDIR': + case 'PHP_MANDIR': + case 'PHP_OS': + case 'PHP_OS_FAMILY': + case 'PHP_PREFIX': + case 'PHP_SAPI': + case 'PHP_SYSCONFDIR': + return Type::getString(); + + case 'PHP_MAJOR_VERSION': + case 'PHP_MINOR_VERSION': + case 'PHP_RELEASE_VERSION': + case 'PHP_DEBUG': + case 'PHP_FLOAT_DIG': + case 'PHP_INT_MIN': + case 'PHP_ZTS': + return Type::getInt(); + + case 'PHP_INT_MAX': + case 'PHP_INT_SIZE': + case 'PHP_MAXPATHLEN': + case 'PHP_VERSION_ID': + return Type::getPositiveInt(); + + case 'PHP_FLOAT_EPSILON': + case 'PHP_FLOAT_MAX': + case 'PHP_FLOAT_MIN': + return Type::getFloat(); + } + + if ($fq_const_name && array_key_exists($fq_const_name, $predefined_constants)) { + return ClassLikeAnalyzer::getTypeFromValue($predefined_constants[$fq_const_name]); + } + + return ClassLikeAnalyzer::getTypeFromValue($predefined_constants[$const_name]); + } + + return null; + } + + public static function getConstType( + StatementsAnalyzer $statements_analyzer, + string $const_name, + bool $is_fully_qualified, + ?Context $context + ): ?Union { + $aliased_constants = $statements_analyzer->getAliases()->constants; + + if (isset($aliased_constants[$const_name])) { + $fq_const_name = $aliased_constants[$const_name]; + } elseif ($is_fully_qualified) { + $fq_const_name = $const_name; + } else { + $fq_const_name = Type::getFQCLNFromString($const_name, $statements_analyzer->getAliases()); + } + + if ($fq_const_name) { + $const_name_parts = explode('\\', $fq_const_name); + $const_name = array_pop($const_name_parts); + $namespace_name = implode('\\', $const_name_parts); + $namespace_constants = NamespaceAnalyzer::getConstantsForNamespace( + $namespace_name, + ReflectionProperty::IS_PUBLIC + ); + + if (isset($namespace_constants[$const_name])) { + return $namespace_constants[$const_name]; + } + } + + if ($context && $context->hasVariable($fq_const_name)) { + return $context->vars_in_scope[$fq_const_name]; + } + + $file_path = $statements_analyzer->getRootFilePath(); + $codebase = $statements_analyzer->getCodebase(); + + $file_storage_provider = $codebase->file_storage_provider; + + $file_storage = $file_storage_provider->get($file_path); + + if (isset($file_storage->declaring_constants[$const_name])) { + $constant_file_path = $file_storage->declaring_constants[$const_name]; + + return $file_storage_provider->get($constant_file_path)->constants[$const_name]; + } + + if (isset($file_storage->declaring_constants[$fq_const_name])) { + $constant_file_path = $file_storage->declaring_constants[$fq_const_name]; + + return $file_storage_provider->get($constant_file_path)->constants[$fq_const_name]; + } + + return self::getGlobalConstType($codebase, $fq_const_name, $const_name) + ?? self::getGlobalConstType($codebase, $const_name, $const_name); + } + + public static function setConstType( + StatementsAnalyzer $statements_analyzer, + string $const_name, + Union $const_type, + Context $context + ): void { + $context->vars_in_scope[$const_name] = $const_type; + $context->constants[$const_name] = $const_type; + + $source = $statements_analyzer->getSource(); + + if ($source instanceof NamespaceAnalyzer) { + $source->setConstType($const_name, $const_type); + } + } + + public static function getConstName( + PhpParser\Node\Expr $first_arg_value, + NodeDataProvider $type_provider, + Codebase $codebase, + Aliases $aliases + ): ?string { + $const_name = null; + + if ($first_arg_value instanceof PhpParser\Node\Scalar\String_) { + $const_name = $first_arg_value->value; + } elseif ($first_arg_type = $type_provider->getType($first_arg_value)) { + if ($first_arg_type->isSingleStringLiteral()) { + $const_name = $first_arg_type->getSingleStringLiteral()->value; + } + } else { + $simple_type = SimpleTypeInferer::infer($codebase, $type_provider, $first_arg_value, $aliases); + + if ($simple_type && $simple_type->isSingleStringLiteral()) { + $const_name = $simple_type->getSingleStringLiteral()->value; + } + } + + return $const_name; + } + + public static function analyzeConstAssignment( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Stmt\Const_ $stmt, + Context $context + ): void { + foreach ($stmt->consts as $const) { + ExpressionAnalyzer::analyze($statements_analyzer, $const->value, $context); + + self::setConstType( + $statements_analyzer, + $const->name->name, + $statements_analyzer->node_data->getType($const->value) ?? Type::getMixed(), + $context + ); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php new file mode 100644 index 00000000..1e258a05 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php @@ -0,0 +1,482 @@ +inside_general_use; + $context->inside_general_use = true; + + if (!$stmt->name instanceof PhpParser\Node\Identifier) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->name, $context) === false) { + return false; + } + } + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->var, $context) === false) { + $context->inside_general_use = $was_inside_general_use; + + return false; + } + + $context->inside_general_use = $was_inside_general_use; + + if ($stmt->name instanceof PhpParser\Node\Identifier) { + $prop_name = $stmt->name->name; + } elseif (($stmt_name_type = $statements_analyzer->node_data->getType($stmt->name)) + && $stmt_name_type->isSingleStringLiteral() + ) { + $prop_name = $stmt_name_type->getSingleStringLiteral()->value; + } else { + $prop_name = null; + } + + $codebase = $statements_analyzer->getCodebase(); + + $stmt_var_id = ExpressionIdentifier::getArrayVarId( + $stmt->var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $var_id = ExpressionIdentifier::getArrayVarId( + $stmt, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($var_id && $context->hasVariable($var_id)) { + self::handleScopedProperty( + $context, + $var_id, + $statements_analyzer, + $stmt, + $codebase, + $stmt_var_id, + $in_assignment + ); + + return true; + } + + if ($stmt_var_id && $context->hasVariable($stmt_var_id)) { + $stmt_var_type = $context->vars_in_scope[$stmt_var_id]; + } else { + $stmt_var_type = $statements_analyzer->node_data->getType($stmt->var); + } + + if (!$stmt_var_type) { + return true; + } + + if ($stmt_var_type->isNull()) { + if (IssueBuffer::accepts( + new NullPropertyFetch( + 'Cannot get property on null variable ' . $stmt_var_id, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + return true; + } + + if ($stmt_var_type->isEmpty()) { + if (IssueBuffer::accepts( + new MixedPropertyFetch( + 'Cannot fetch property on empty var ' . $stmt_var_id, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + return true; + } + + if ($stmt_var_type->hasMixed()) { + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + if ($stmt->name instanceof PhpParser\Node\Identifier) { + $codebase->analyzer->addMixedMemberName( + '$' . $stmt->name->name, + $context->calling_method_id ?: $statements_analyzer->getFileName() + ); + } + + IssueBuffer::maybeAdd( + new MixedPropertyFetch( + 'Cannot fetch property on mixed var ' . $stmt_var_id, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt->name, + $stmt_var_type->getId() + ); + } + } + + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getRootFilePath()); + } + + if ($stmt_var_type->isNullable() && !$stmt_var_type->ignore_nullable_issues) { + // we can only be sure that the variable is possibly null if we know the var_id + if (!$context->inside_isset + && $stmt->name instanceof PhpParser\Node\Identifier + && !MethodCallAnalyzer::hasNullsafe($stmt->var) + ) { + IssueBuffer::maybeAdd( + new PossiblyNullPropertyFetch( + rtrim('Cannot get property on possibly null variable ' . $stmt_var_id) + . ' of type ' . $stmt_var_type, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + $statements_analyzer->node_data->setType($stmt, Type::getNull()); + } + } + + if (!$prop_name) { + if ($stmt_var_type->hasObjectType() && !$context->ignore_variable_property) { + foreach ($stmt_var_type->getAtomicTypes() as $type) { + if ($type instanceof TNamedObject) { + $codebase->analyzer->addMixedMemberName( + strtolower($type->value) . '::$', + $context->calling_method_id ?: $statements_analyzer->getFileName() + ); + } + } + } + + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt->name, + $stmt_var_type->getId() + ); + } + + return true; + } + + $invalid_fetch_types = []; + $has_valid_fetch_type = false; + + $var_atomic_types = $stmt_var_type->getAtomicTypes(); + + while ($lhs_type_part = array_shift($var_atomic_types)) { + if ($lhs_type_part instanceof TTemplateParam) { + $var_atomic_types = array_merge($var_atomic_types, $lhs_type_part->as->getAtomicTypes()); + continue; + } + + AtomicPropertyFetchAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context, + $in_assignment, + $var_id, + $stmt_var_id, + $stmt_var_type, + $lhs_type_part, + $prop_name, + $has_valid_fetch_type, + $invalid_fetch_types, + $is_static_access + ); + } + + $stmt_type = $statements_analyzer->node_data->getType($stmt); + + if ($stmt_var_type->isNullable() && !$context->inside_isset && $stmt_type) { + $stmt_type->addType(new TNull); + + if ($stmt_var_type->ignore_nullable_issues) { + $stmt_type->ignore_nullable_issues = true; + } + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + && ($stmt_type = $statements_analyzer->node_data->getType($stmt)) + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt->name, + $stmt_type->getId() + ); + } + + if ($invalid_fetch_types) { + $lhs_type_part = $invalid_fetch_types[0]; + + if ($has_valid_fetch_type) { + IssueBuffer::maybeAdd( + new PossiblyInvalidPropertyFetch( + 'Cannot fetch property on possible non-object ' . $stmt_var_id . ' of type ' . $lhs_type_part, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new InvalidPropertyFetch( + 'Cannot fetch property on non-object ' . $stmt_var_id . ' of type ' . $lhs_type_part, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($var_id) { + $context->vars_in_scope[$var_id] = $statements_analyzer->node_data->getType($stmt) ?? Type::getMixed(); + } + + return true; + } + + private static function handleScopedProperty( + Context $context, + string $var_id, + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\PropertyFetch $stmt, + Codebase $codebase, + ?string $stmt_var_id, + bool $in_assignment + ): void { + $stmt_type = $context->vars_in_scope[$var_id]; + + // we don't need to check anything + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && (!(($parent_source = $statements_analyzer->getSource()) + instanceof FunctionLikeAnalyzer) + || !$parent_source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt->name, + $stmt_type->getId() + ); + } + + if ($stmt_var_id === '$this' + && !$stmt_type->initialized + && $context->collect_initializations + && ($stmt_var_type = $statements_analyzer->node_data->getType($stmt->var)) + && $stmt_var_type->hasObjectType() + && $stmt->name instanceof PhpParser\Node\Identifier + ) { + $source = $statements_analyzer->getSource(); + + $property_id = null; + + foreach ($stmt_var_type->getAtomicTypes() as $lhs_type_part) { + if ($lhs_type_part instanceof TNamedObject) { + if (!$codebase->classExists($lhs_type_part->value)) { + continue; + } + + $property_id = $lhs_type_part->value . '::$' . $stmt->name->name; + } + } + + if ($property_id + && $source instanceof FunctionLikeAnalyzer + && $source->getMethodName() === '__construct' + && !$context->inside_unset + ) { + if ($context->inside_isset + || ($context->inside_assignment + && isset($context->vars_in_scope[$var_id]) + && $context->vars_in_scope[$var_id]->isNullable() + ) + ) { + $stmt_type->initialized = true; + } else { + IssueBuffer::maybeAdd( + new UninitializedProperty( + 'Cannot use uninitialized property ' . $var_id, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $var_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + $stmt_type->addType(new TNull); + } + } + } + + + if (($stmt_var_type = $statements_analyzer->node_data->getType($stmt->var)) + && $stmt_var_type->hasObjectType() + && $stmt->name instanceof PhpParser\Node\Identifier + ) { + // log the appearance + foreach ($stmt_var_type->getAtomicTypes() as $lhs_type_part) { + if ($lhs_type_part instanceof TNamedObject) { + if (!$codebase->classExists($lhs_type_part->value)) { + continue; + } + + $property_id = $lhs_type_part->value . '::$' . $stmt->name->name; + + + $class_storage = $codebase->classlike_storage_provider->get($lhs_type_part->value); + + AtomicPropertyFetchAnalyzer::processTaints( + $statements_analyzer, + $stmt, + $stmt_type, + $property_id, + $class_storage, + $in_assignment + ); + + $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( + $property_id, + true, + $statements_analyzer + ); + + if ($declaring_property_class) { + AtomicPropertyFetchAnalyzer::checkPropertyDeprecation( + $stmt->name->name, + $declaring_property_class, + $stmt, + $statements_analyzer + ); + } + + $codebase->properties->propertyExists( + $property_id, + true, + $statements_analyzer, + $context, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer->getSource(), $stmt) + : null + ); + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->name, + $property_id + ); + } + + if (!$context->collect_mutations + && !$context->collect_initializations + && !($class_storage->external_mutation_free + && $stmt_type->allow_mutations) + ) { + if ($context->pure) { + IssueBuffer::maybeAdd( + new ImpurePropertyFetch( + 'Cannot access a property on a mutable object from a pure context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_impure = true; + } + } + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php new file mode 100644 index 00000000..e28e3f06 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php @@ -0,0 +1,486 @@ +class instanceof PhpParser\Node\Name) { + self::analyzeVariableStaticPropertyFetch($statements_analyzer, $stmt->class, $stmt, $context); + return true; + } + + $codebase = $statements_analyzer->getCodebase(); + + if (count($stmt->class->parts) === 1 + && in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true) + ) { + if ($stmt->class->parts[0] === 'parent') { + $fq_class_name = $statements_analyzer->getParentFQCLN(); + + if ($fq_class_name === null) { + if (IssueBuffer::accepts( + new ParentNotFound( + 'Cannot check property fetch on parent as this class does not extend another', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + return true; + } + } else { + $fq_class_name = (string)$context->self; + } + + if ($context->isPhantomClass($fq_class_name)) { + return true; + } + } else { + $aliases = $statements_analyzer->getAliases(); + + if ($context->calling_method_id + && !$stmt->class instanceof PhpParser\Node\Name\FullyQualified + ) { + $codebase->file_reference_provider->addMethodReferenceToClassMember( + $context->calling_method_id, + 'use:' . $stmt->class->parts[0] . ':' . md5($statements_analyzer->getFilePath()), + false + ); + } + + $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( + $stmt->class, + $aliases + ); + + if ($context->isPhantomClass($fq_class_name)) { + return true; + } + + if ($context->check_classes) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $fq_class_name, + new CodeLocation($statements_analyzer->getSource(), $stmt->class), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues() + ) !== true) { + return false; + } + } + } + + if ($fq_class_name + && $codebase->methods_to_move + && $context->calling_method_id + && isset($codebase->methods_to_move[$context->calling_method_id]) + ) { + $destination_method_id = $codebase->methods_to_move[$context->calling_method_id]; + + $codebase->classlikes->airliftClassLikeReference( + $fq_class_name, + explode('::', $destination_method_id)[0], + $statements_analyzer->getFilePath(), + (int) $stmt->class->getAttribute('startFilePos'), + (int) $stmt->class->getAttribute('endFilePos') + 1 + ); + } + + if ($fq_class_name) { + $statements_analyzer->node_data->setType( + $stmt->class, + new Union([new TNamedObject($fq_class_name)]) + ); + } + + if ($stmt->name instanceof PhpParser\Node\VarLikeIdentifier) { + $prop_name = $stmt->name->name; + } elseif (($stmt_name_type = $statements_analyzer->node_data->getType($stmt->name)) + && $stmt_name_type->isSingleStringLiteral() + ) { + $prop_name = $stmt_name_type->getSingleStringLiteral()->value; + } else { + $prop_name = null; + } + + if (!$prop_name) { + if ($fq_class_name) { + $codebase->analyzer->addMixedMemberName( + strtolower($fq_class_name) . '::$', + $context->calling_method_id ?: $statements_analyzer->getFileName() + ); + } + + return true; + } + + if (!$fq_class_name + || !$context->check_classes + || !$context->check_variables + || ExpressionAnalyzer::isMock($fq_class_name) + ) { + return true; + } + + $var_id = ExpressionIdentifier::getVarId( + $stmt, + $context->self ?: $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + $property_id = $fq_class_name . '::$' . $prop_name; + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->name, + $property_id + ); + } + + if ($context->mutation_free) { + IssueBuffer::maybeAdd( + new ImpureStaticProperty( + 'Cannot use a static property in a mutation-free context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() + instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + + if ($var_id && $context->hasVariable($var_id)) { + $stmt_type = $context->vars_in_scope[$var_id]; + + // we don't need to check anything + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + if ($codebase->collect_references) { + // log the appearance + $codebase->properties->propertyExists( + $property_id, + true, + $statements_analyzer, + $context, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer->getSource(), $stmt) + : null + ); + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + && ($stmt_type = $statements_analyzer->node_data->getType($stmt)) + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt->name, + $stmt_type->getId() + ); + } + + return true; + } + + if (!$codebase->properties->propertyExists( + $property_id, + true, + $statements_analyzer, + $context, + $codebase->collect_locations + ? new CodeLocation($statements_analyzer->getSource(), $stmt) + : null + ) + ) { + if ($context->inside_isset) { + return true; + } + + IssueBuffer::maybeAdd( + new UndefinedPropertyFetch( + 'Static property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + + return true; + } + + $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( + $fq_class_name . '::$' . $prop_name, + true, + $statements_analyzer + ); + + if ($declaring_property_class === null) { + return false; + } + + AtomicPropertyFetchAnalyzer::checkPropertyDeprecation( + $prop_name, + $declaring_property_class, + $stmt, + $statements_analyzer + ); + + $class_storage = $codebase->classlike_storage_provider->get($declaring_property_class); + $property = $class_storage->properties[$prop_name]; + + if (!$property->is_static) { + if ($context->inside_isset) { + return true; + } + + if ($context->inside_assignment) { + IssueBuffer::maybeAdd( + new UndefinedPropertyAssignment( + 'Static property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new UndefinedPropertyFetch( + 'Static property ' . $property_id . ' is not defined', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $property_id + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + return true; + } + + if (ClassLikeAnalyzer::checkPropertyVisibility( + $property_id, + $context, + $statements_analyzer, + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues() + ) === false) { + return false; + } + + $declaring_property_id = strtolower($declaring_property_class) . '::$' . $prop_name; + + if ($codebase->alter_code) { + $moved_class = $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $stmt->class, + $fq_class_name, + $context->calling_method_id + ); + + if (!$moved_class) { + foreach ($codebase->property_transforms as $original_pattern => $transformation) { + if ($declaring_property_id === $original_pattern) { + [$old_declaring_fq_class_name] = explode('::$', $declaring_property_id); + [$new_fq_class_name, $new_property_name] = explode('::$', $transformation); + + $file_manipulations = []; + + if (strtolower($new_fq_class_name) !== $old_declaring_fq_class_name) { + $file_manipulations[] = new FileManipulation( + (int) $stmt->class->getAttribute('startFilePos'), + (int) $stmt->class->getAttribute('endFilePos') + 1, + Type::getStringFromFQCLN( + $new_fq_class_name, + $statements_analyzer->getNamespace(), + $statements_analyzer->getAliasedClassesFlipped(), + null + ) + ); + } + + $file_manipulations[] = new FileManipulation( + (int) $stmt->name->getAttribute('startFilePos'), + (int) $stmt->name->getAttribute('endFilePos') + 1, + '$' . $new_property_name + ); + + FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); + } + } + } + } + + if ($var_id) { + if ($property->type) { + $context->vars_in_scope[$var_id] = TypeExpander::expandUnion( + $codebase, + clone $property->type, + $class_storage->name, + $class_storage->name, + $class_storage->parent_class + ); + } else { + $context->vars_in_scope[$var_id] = Type::getMixed(); + } + + $stmt_type = clone $context->vars_in_scope[$var_id]; + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt->name, + $stmt_type->getId() + ); + } + } else { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } + + return true; + } + + private static function analyzeVariableStaticPropertyFetch( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $stmt_class, + PhpParser\Node\Expr\StaticPropertyFetch $stmt, + Context $context + ): void { + $was_inside_general_use = $context->inside_general_use; + + $context->inside_general_use = true; + + ExpressionAnalyzer::analyze( + $statements_analyzer, + $stmt_class, + $context + ); + + $context->inside_general_use = $was_inside_general_use; + + $stmt_class_type = $statements_analyzer->node_data->getType($stmt_class) ?? Type::getMixed(); + + $old_data_provider = $statements_analyzer->node_data; + + $stmt_type = null; + + $codebase = $statements_analyzer->getCodebase(); + + foreach ($stmt_class_type->getAtomicTypes() as $class_atomic_type) { + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $string_type = ($class_atomic_type instanceof TClassString + && $class_atomic_type->as_type !== null) + ? $class_atomic_type->as_type->value + : ($class_atomic_type instanceof TLiteralString + ? $class_atomic_type->value + : null); + + if ($string_type) { + $new_stmt_name = new VirtualFullyQualified( + $string_type, + $stmt_class->getAttributes() + ); + + $fake_static_property = new VirtualStaticPropertyFetch( + $new_stmt_name, + $stmt->name, + $stmt->getAttributes() + ); + + self::analyze($statements_analyzer, $fake_static_property, $context); + + $fake_stmt_type = $statements_analyzer->node_data->getType($fake_static_property) ?? Type::getMixed(); + } else { + $fake_var_name = '__fake_var_' . (string) $stmt->getAttribute('startFilePos'); + + $fake_var = new VirtualVariable( + $fake_var_name, + $stmt_class->getAttributes() + ); + + $context->vars_in_scope['$' . $fake_var_name] = new Union([$class_atomic_type]); + + $fake_instance_property = new VirtualPropertyFetch( + $fake_var, + $stmt->name, + $stmt->getAttributes() + ); + + InstancePropertyFetchAnalyzer::analyze( + $statements_analyzer, + $fake_instance_property, + $context, + false, + true + ); + + $fake_stmt_type = $statements_analyzer->node_data->getType($fake_instance_property) ?? Type::getMixed(); + } + + $stmt_type = $stmt_type + ? Type::combineUnionTypes($stmt_type, $fake_stmt_type, $codebase) + : $fake_stmt_type; + + $statements_analyzer->node_data = $old_data_provider; + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + } +} 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 new file mode 100644 index 00000000..3ecde22a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php @@ -0,0 +1,559 @@ +getFileAnalyzer()->project_analyzer; + $codebase = $statements_analyzer->getCodebase(); + + if ($stmt->name === 'this') { + if ($statements_analyzer->isStatic()) { + if (IssueBuffer::accepts( + new InvalidScope( + 'Invalid reference to $this in a static context', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + return true; + } + + if (!isset($context->vars_in_scope['$this'])) { + if (IssueBuffer::accepts( + new InvalidScope( + 'Invalid reference to $this in a non-class context', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + + $context->vars_in_scope['$this'] = Type::getMixed(); + $context->vars_possibly_in_scope['$this'] = true; + + return true; + } + + $statements_analyzer->node_data->setType($stmt, clone $context->vars_in_scope['$this']); + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + && ($stmt_type = $statements_analyzer->node_data->getType($stmt)) + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt, + $stmt_type->getId() + ); + } + + if (!$context->collect_mutations && !$context->collect_initializations) { + if ($context->pure) { + IssueBuffer::maybeAdd( + new ImpureVariable( + 'Cannot reference $this in a pure context', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_impure = true; + } + } + + return true; + } + + if (!$context->check_variables) { + if (is_string($stmt->name)) { + $var_name = '$' . $stmt->name; + + if (!$context->hasVariable($var_name)) { + $context->vars_in_scope[$var_name] = Type::getMixed(); + $context->vars_possibly_in_scope[$var_name] = true; + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } else { + $stmt_type = clone $context->vars_in_scope[$var_name]; + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + self::addDataFlowToVariable($statements_analyzer, $stmt, $var_name, $stmt_type, $context); + } + } else { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } + + return true; + } + + if (is_string($stmt->name) && self::isSuperGlobal('$' . $stmt->name)) { + $var_name = '$' . $stmt->name; + + if (isset($context->vars_in_scope[$var_name])) { + $type = clone $context->vars_in_scope[$var_name]; + + self::taintVariable($statements_analyzer, $var_name, $type, $stmt); + + $statements_analyzer->node_data->setType($stmt, $type); + + return true; + } + + $type = self::getGlobalType($var_name); + + self::taintVariable($statements_analyzer, $var_name, $type, $stmt); + + $statements_analyzer->node_data->setType($stmt, $type); + $context->vars_in_scope[$var_name] = clone $type; + $context->vars_possibly_in_scope[$var_name] = true; + + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt, + $var_name + ); + + return true; + } + + if (!is_string($stmt->name)) { + if ($context->pure) { + IssueBuffer::maybeAdd( + new ImpureVariable( + 'Cannot reference an unknown variable in a pure context', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_impure = true; + } + + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + $expr_result = ExpressionAnalyzer::analyze($statements_analyzer, $stmt->name, $context); + $context->inside_general_use = $was_inside_general_use; + + return $expr_result; + } + + if ($passed_by_reference && $by_ref_type) { + AssignmentAnalyzer::assignByRefParam( + $statements_analyzer, + $stmt, + $by_ref_type, + $by_ref_type, + $context + ); + + return true; + } + + $var_name = '$' . $stmt->name; + + if (!$context->hasVariable($var_name)) { + if (!isset($context->vars_possibly_in_scope[$var_name]) + || !$statements_analyzer->getFirstAppearance($var_name) + ) { + if ($array_assignment) { + // if we're in an array assignment, let's assign the variable + // because PHP allows it + + $context->vars_in_scope[$var_name] = Type::getArray(); + $context->vars_possibly_in_scope[$var_name] = true; + + // it might have been defined first in another if/else branch + if (!$statements_analyzer->hasVariable($var_name)) { + $statements_analyzer->registerVariable( + $var_name, + new CodeLocation($statements_analyzer, $stmt), + $context->branch_point + ); + } + } elseif (!$context->inside_isset + || $statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + ) { + if ($context->is_global || $from_global) { + IssueBuffer::maybeAdd( + new UndefinedGlobalVariable( + 'Cannot find referenced variable ' . $var_name . ' in global scope', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $var_name + ), + $statements_analyzer->getSuppressedIssues() + ); + + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + + return true; + } + + IssueBuffer::maybeAdd( + new UndefinedVariable( + 'Cannot find referenced variable ' . $var_name, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + + return true; + } + } + + $first_appearance = $statements_analyzer->getFirstAppearance($var_name); + + if ($first_appearance && !$context->inside_isset && !$context->inside_unset) { + if ($context->is_global) { + if ($codebase->alter_code) { + if (!isset($project_analyzer->getIssuesToFix()['PossiblyUndefinedGlobalVariable'])) { + return true; + } + + $branch_point = $statements_analyzer->getBranchPoint($var_name); + + if ($branch_point) { + $statements_analyzer->addVariableInitialization($var_name, $branch_point); + } + + return true; + } + + IssueBuffer::maybeAdd( + new PossiblyUndefinedGlobalVariable( + 'Possibly undefined global variable ' . $var_name . ', first seen on line ' . + $first_appearance->getLineNumber(), + new CodeLocation($statements_analyzer->getSource(), $stmt), + $var_name + ), + $statements_analyzer->getSuppressedIssues(), + (bool) $statements_analyzer->getBranchPoint($var_name) + ); + } else { + if ($codebase->alter_code) { + if (!isset($project_analyzer->getIssuesToFix()['PossiblyUndefinedVariable'])) { + return true; + } + + $branch_point = $statements_analyzer->getBranchPoint($var_name); + + if ($branch_point) { + $statements_analyzer->addVariableInitialization($var_name, $branch_point); + } + + return true; + } + + IssueBuffer::maybeAdd( + new PossiblyUndefinedVariable( + 'Possibly undefined variable ' . $var_name . ', first seen on line ' . + $first_appearance->getLineNumber(), + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues(), + (bool) $statements_analyzer->getBranchPoint($var_name) + ); + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt, + $first_appearance->raw_file_start . '-' . $first_appearance->raw_file_end . ':mixed' + ); + } + + $stmt_type = Type::getMixed(); + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + self::addDataFlowToVariable($statements_analyzer, $stmt, $var_name, $stmt_type, $context); + + $statements_analyzer->registerPossiblyUndefinedVariable($var_name, $stmt); + + return true; + } + } else { + $stmt_type = clone $context->vars_in_scope[$var_name]; + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + self::addDataFlowToVariable($statements_analyzer, $stmt, $var_name, $stmt_type, $context); + + if ($stmt_type->possibly_undefined_from_try && !$context->inside_isset) { + if ($context->is_global) { + IssueBuffer::maybeAdd( + new PossiblyUndefinedGlobalVariable( + 'Possibly undefined global variable ' . $var_name . ' defined in try block', + new CodeLocation($statements_analyzer->getSource(), $stmt), + $var_name + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new PossiblyUndefinedVariable( + 'Possibly undefined variable ' . $var_name . ' defined in try block', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeType( + $statements_analyzer->getFilePath(), + $stmt, + $stmt_type->getId() + ); + } + + if ($codebase->store_node_types + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $first_appearance = $statements_analyzer->getFirstAppearance($var_name); + + if ($first_appearance) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt, + $first_appearance->raw_file_start + . '-' . $first_appearance->raw_file_end + . ':' . $stmt_type->getId() + ); + } + } + } + + return true; + } + + private static function addDataFlowToVariable( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr\Variable $stmt, + string $var_name, + Union $stmt_type, + Context $context + ): void { + $codebase = $statements_analyzer->getCodebase(); + + if ($statements_analyzer->data_flow_graph + && $codebase->find_unused_variables + && ($context->inside_return + || $context->inside_call + || $context->inside_general_use + || $context->inside_conditional + || $context->inside_throw + || $context->inside_isset) + ) { + if (!$stmt_type->parent_nodes) { + $assignment_node = DataFlowNode::getForAssignment( + $var_name, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ); + + $stmt_type->parent_nodes = [ + $assignment_node->id => $assignment_node + ]; + } + + foreach ($stmt_type->parent_nodes as $parent_node) { + if ($context->inside_call || $context->inside_return) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + new DataFlowNode( + 'variable-use', + 'variable use', + null + ), + 'use-inside-call' + ); + } elseif ($context->inside_conditional) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + new DataFlowNode( + 'variable-use', + 'variable use', + null + ), + 'use-inside-conditional' + ); + } elseif ($context->inside_isset) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + new DataFlowNode( + 'variable-use', + 'variable use', + null + ), + 'use-inside-isset' + ); + } else { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + new DataFlowNode( + 'variable-use', + 'variable use', + null + ), + 'variable-use' + ); + } + } + } + } + + private static function taintVariable( + StatementsAnalyzer $statements_analyzer, + string $var_name, + Union $type, + PhpParser\Node\Expr\Variable $stmt + ): void { + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + if ($var_name === '$_GET' + || $var_name === '$_POST' + || $var_name === '$_COOKIE' + || $var_name === '$_REQUEST' + ) { + $taint_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + $server_taint_source = new TaintSource( + $var_name . ':' . $taint_location->file_name . ':' . $taint_location->raw_file_start, + $var_name, + null, + null, + TaintKindGroup::ALL_INPUT + ); + + $statements_analyzer->data_flow_graph->addSource($server_taint_source); + + $type->parent_nodes = [ + $server_taint_source->id => $server_taint_source + ]; + } + } + } + + /** + * @psalm-pure + */ + public static function isSuperGlobal(string $var_id): bool + { + return in_array( + $var_id, + self::SUPER_GLOBALS, + true + ); + } + + public static function getGlobalType(string $var_id): Union + { + $config = Config::getInstance(); + + if (isset($config->globals[$var_id])) { + return Type::parseString($config->globals[$var_id]); + } + + if ($var_id === '$argv') { + return new Union([ + new TArray([Type::getInt(), Type::getString()]), + ]); + } + + if ($var_id === '$argc') { + return Type::getInt(); + } + + if ($var_id === '$http_response_header') { + return new Union([ + new TList(Type::getString()) + ]); + } + + if (self::isSuperGlobal($var_id)) { + $type = Type::getArray(); + if ($var_id === '$_SESSION') { + $type->possibly_undefined = true; + } + return $type; + } + + return Type::getMixed(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php new file mode 100644 index 00000000..38f9a9a3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php @@ -0,0 +1,138 @@ +inside_assignment; + $context->inside_assignment = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->var, $context) === false) { + $context->inside_assignment = $was_inside_assignment; + + return false; + } + + $context->inside_assignment = $was_inside_assignment; + + $stmt_var_type = $statements_analyzer->node_data->getType($stmt->var); + + if ($stmt instanceof PostInc || $stmt instanceof PostDec) { + $statements_analyzer->node_data->setType($stmt, $stmt_var_type ?? Type::getMixed()); + } + + if (($stmt_var_type = $statements_analyzer->node_data->getType($stmt->var)) + && $stmt_var_type->hasString() + && ($stmt instanceof PostInc || $stmt instanceof PreInc) + ) { + $return_type = null; + + $fake_right_expr = new VirtualLNumber(1, $stmt->getAttributes()); + $statements_analyzer->node_data->setType($fake_right_expr, Type::getInt()); + + ArithmeticOpAnalyzer::analyze( + $statements_analyzer, + $statements_analyzer->node_data, + $stmt->var, + $fake_right_expr, + $stmt, + $return_type, + $context + ); + + $result_type = $return_type ?? Type::getMixed(); + $statements_analyzer->node_data->setType($stmt, $result_type); + + BinaryOpAnalyzer::addDataFlow( + $statements_analyzer, + $stmt, + $stmt->var, + $fake_right_expr, + 'inc' + ); + + $var_id = ExpressionIdentifier::getArrayVarId($stmt->var, null); + + $codebase = $statements_analyzer->getCodebase(); + + if ($var_id && isset($context->vars_in_scope[$var_id])) { + $context->vars_in_scope[$var_id] = $result_type; + + if ($codebase->find_unused_variables && $stmt->var instanceof PhpParser\Node\Expr\Variable) { + $context->assigned_var_ids[$var_id] = (int) $stmt->var->getAttribute('startFilePos'); + $context->possibly_assigned_var_ids[$var_id] = true; + } + + // removes dependent vars from $context + $context->removeDescendents( + $var_id, + $context->vars_in_scope[$var_id], + $return_type, + $statements_analyzer + ); + } + } else { + $fake_right_expr = new VirtualLNumber(1, $stmt->getAttributes()); + + $operation = $stmt instanceof PostInc || $stmt instanceof PreInc + ? new VirtualPlus( + $stmt->var, + $fake_right_expr, + $stmt->var->getAttributes() + ) + : new VirtualMinus( + $stmt->var, + $fake_right_expr, + $stmt->var->getAttributes() + ); + + $fake_assignment = new VirtualAssign( + $stmt->var, + $operation, + $stmt->getAttributes() + ); + + $old_node_data = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $fake_assignment, $context) === false) { + return false; + } + + if ($stmt instanceof PreInc || $stmt instanceof PreDec) { + $old_node_data->setType( + $stmt, + $statements_analyzer->node_data->getType($operation) ?? Type::getMixed() + ); + } + + $statements_analyzer->node_data = $old_node_data; + } + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php new file mode 100644 index 00000000..9fd4f163 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php @@ -0,0 +1,423 @@ +getCodebase(); + $config = $codebase->config; + + if (!$config->allow_includes) { + throw new FileIncludeException( + 'File includes are not allowed per your Psalm config - check the allowFileIncludes flag.' + ); + } + + $was_inside_call = $context->inside_call; + + $context->inside_call = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + $context->inside_call = $was_inside_call; + + return false; + } + + $context->inside_call = $was_inside_call; + + $stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr); + + if ($stmt->expr instanceof PhpParser\Node\Scalar\String_ + || ($stmt_expr_type && $stmt_expr_type->isSingleStringLiteral()) + ) { + if ($stmt->expr instanceof PhpParser\Node\Scalar\String_) { + $path_to_file = $stmt->expr->value; + } else { + $path_to_file = $stmt_expr_type->getSingleStringLiteral()->value; + } + + $path_to_file = str_replace('/', DIRECTORY_SEPARATOR, $path_to_file); + + // attempts to resolve using get_include_path dirs + $include_path = self::resolveIncludePath($path_to_file, dirname($statements_analyzer->getFilePath())); + $path_to_file = $include_path ?: $path_to_file; + + if (DIRECTORY_SEPARATOR === '/') { + $is_path_relative = $path_to_file[0] !== DIRECTORY_SEPARATOR; + } else { + $is_path_relative = !preg_match('~^[A-Z]:\\\\~i', $path_to_file); + } + + if ($is_path_relative) { + $path_to_file = $config->base_dir . DIRECTORY_SEPARATOR . $path_to_file; + } + } else { + $path_to_file = self::getPathTo( + $stmt->expr, + $statements_analyzer->node_data, + $statements_analyzer, + $statements_analyzer->getFileName(), + $config + ); + } + + if ($stmt_expr_type + && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && $stmt_expr_type->parent_nodes + && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) + ) { + $arg_location = new CodeLocation($statements_analyzer->getSource(), $stmt->expr); + + $include_param_sink = TaintSink::getForMethodArgument( + 'include', + 'include', + 0, + $arg_location, + $arg_location + ); + + $include_param_sink->taints = [TaintKind::INPUT_INCLUDE]; + + $statements_analyzer->data_flow_graph->addSink($include_param_sink); + + $codebase = $statements_analyzer->getCodebase(); + $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); + + $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); + $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); + + foreach ($stmt_expr_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $include_param_sink, + 'arg', + $added_taints, + $removed_taints + ); + } + } + + if ($path_to_file) { + $path_to_file = self::normalizeFilePath($path_to_file); + + // if the file is already included, we can't check much more + if (in_array(realpath($path_to_file), get_included_files(), true)) { + return true; + } + + $current_file_analyzer = $statements_analyzer->getFileAnalyzer(); + + if ($current_file_analyzer->project_analyzer->fileExists($path_to_file)) { + if ($statements_analyzer->hasParentFilePath($path_to_file) + || !$codebase->file_storage_provider->has($path_to_file) + || ($statements_analyzer->hasAlreadyRequiredFilePath($path_to_file) + && !$codebase->file_storage_provider->get($path_to_file)->has_extra_statements) + ) { + return true; + } + if ($config->mustBeIgnored($path_to_file)) { + return true; + } + + $current_file_analyzer->addRequiredFilePath($path_to_file); + + $file_name = $config->shortenFileName($path_to_file); + + $nesting = $statements_analyzer->getRequireNesting() + 1; + $current_file_analyzer->project_analyzer->progress->debug( + str_repeat(' ', $nesting) . 'checking ' . $file_name . PHP_EOL + ); + + $include_file_analyzer = new FileAnalyzer( + $current_file_analyzer->project_analyzer, + $path_to_file, + $file_name + ); + + $include_file_analyzer->setRootFilePath( + $current_file_analyzer->getRootFilePath(), + $current_file_analyzer->getRootFileName() + ); + + $include_file_analyzer->addParentFilePath($current_file_analyzer->getFilePath()); + $include_file_analyzer->addRequiredFilePath($current_file_analyzer->getFilePath()); + + foreach ($current_file_analyzer->getRequiredFilePaths() as $required_file_path) { + $include_file_analyzer->addRequiredFilePath($required_file_path); + } + + foreach ($current_file_analyzer->getParentFilePaths() as $parent_file_path) { + $include_file_analyzer->addParentFilePath($parent_file_path); + } + + try { + $include_file_analyzer->analyze( + $context, + $global_context + ); + } catch (UnpreparedAnalysisException $e) { + if ($config->skip_checks_on_unresolvable_includes) { + $context->check_classes = false; + $context->check_variables = false; + $context->check_functions = false; + } + } + + $included_return_type = $include_file_analyzer->getReturnType(); + + if ($included_return_type) { + $statements_analyzer->node_data->setType($stmt, $included_return_type); + } + + $context->has_returned = false; + + foreach ($include_file_analyzer->getRequiredFilePaths() as $required_file_path) { + $current_file_analyzer->addRequiredFilePath($required_file_path); + } + + $include_file_analyzer->clearSourceBeforeDestruction(); + + return true; + } + + $source = $statements_analyzer->getSource(); + + IssueBuffer::maybeAdd( + new MissingFile( + 'Cannot find file ' . $path_to_file . ' to include', + new CodeLocation($source, $stmt) + ), + $source->getSuppressedIssues() + ); + } else { + $var_id = ExpressionIdentifier::getArrayVarId($stmt->expr, null); + + if (!$var_id || !isset($context->phantom_files[$var_id])) { + $source = $statements_analyzer->getSource(); + + IssueBuffer::maybeAdd( + new UnresolvableInclude( + 'Cannot resolve the given expression to a file path', + new CodeLocation($source, $stmt) + ), + $source->getSuppressedIssues() + ); + } + } + + if ($config->skip_checks_on_unresolvable_includes) { + $context->check_classes = false; + $context->check_variables = false; + $context->check_functions = false; + } + + return true; + } + + /** + * @psalm-suppress MixedAssignment + */ + public static function getPathTo( + PhpParser\Node\Expr $stmt, + ?NodeDataProvider $type_provider, + ?StatementsAnalyzer $statements_analyzer, + string $file_name, + Config $config + ): ?string { + if (DIRECTORY_SEPARATOR === '/') { + $is_path_relative = $file_name[0] !== DIRECTORY_SEPARATOR; + } else { + $is_path_relative = !preg_match('~^[A-Z]:\\\\~i', $file_name); + } + + if ($is_path_relative) { + $file_name = $config->base_dir . DIRECTORY_SEPARATOR . $file_name; + } + + if ($stmt instanceof PhpParser\Node\Scalar\String_) { + if (DIRECTORY_SEPARATOR !== '/') { + return str_replace('/', DIRECTORY_SEPARATOR, $stmt->value); + } + return $stmt->value; + } + + $stmt_type = $type_provider ? $type_provider->getType($stmt) : null; + + if ($stmt_type && $stmt_type->isSingleStringLiteral()) { + if (DIRECTORY_SEPARATOR !== '/') { + return str_replace( + '/', + DIRECTORY_SEPARATOR, + $stmt_type->getSingleStringLiteral()->value + ); + } + + return $stmt_type->getSingleStringLiteral()->value; + } + + if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) { + if ($stmt->var instanceof PhpParser\Node\Expr\Variable + && $stmt->var->name === 'GLOBALS' + && $stmt->dim instanceof PhpParser\Node\Scalar\String_ + ) { + if (isset($GLOBALS[$stmt->dim->value]) && is_string($GLOBALS[$stmt->dim->value])) { + /** @var string */ + return $GLOBALS[$stmt->dim->value]; + } + } + } elseif ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat) { + $left_string = self::getPathTo($stmt->left, $type_provider, $statements_analyzer, $file_name, $config); + $right_string = self::getPathTo($stmt->right, $type_provider, $statements_analyzer, $file_name, $config); + + if ($left_string && $right_string) { + return $left_string . $right_string; + } + } elseif ($stmt instanceof PhpParser\Node\Expr\FuncCall && + $stmt->name instanceof PhpParser\Node\Name && + $stmt->name->parts === ['dirname'] + ) { + if ($stmt->getArgs()) { + $dir_level = 1; + + if (isset($stmt->getArgs()[1])) { + if ($stmt->getArgs()[1]->value instanceof PhpParser\Node\Scalar\LNumber) { + $dir_level = $stmt->getArgs()[1]->value->value; + } else { + return null; + } + } + + $evaled_path = self::getPathTo( + $stmt->getArgs()[0]->value, + $type_provider, + $statements_analyzer, + $file_name, + $config + ); + + if (!$evaled_path) { + return null; + } + + return dirname($evaled_path, $dir_level); + } + } elseif ($stmt instanceof PhpParser\Node\Expr\ConstFetch) { + $const_name = implode('', $stmt->name->parts); + + if (defined($const_name)) { + $constant_value = constant($const_name); + + if (is_string($constant_value)) { + return $constant_value; + } + } + } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Dir) { + return dirname($file_name); + } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\File) { + return $file_name; + } + + return null; + } + + public static function resolveIncludePath(string $file_name, string $current_directory): ?string + { + if (!$current_directory) { + return $file_name; + } + + $paths = PATH_SEPARATOR === ':' + ? preg_split('#(?inside_general_use; + $context->inside_general_use = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + $context->inside_general_use = $was_inside_general_use; + + return false; + } + + $context->inside_general_use = $was_inside_general_use; + + if ($stmt->class instanceof PhpParser\Node\Expr) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->class, $context) === false) { + return false; + } + } elseif (!in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true)) { + if ($context->check_classes) { + $codebase = $statements_analyzer->getCodebase(); + + $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( + $stmt->class, + $statements_analyzer->getAliases() + ); + + if ($codebase->store_node_types + && $fq_class_name + && !$context->collect_initializations + && !$context->collect_mutations + ) { + $codebase->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $stmt->class, + $codebase->classlikes->classOrInterfaceOrEnumExists($fq_class_name) + ? $fq_class_name + : '*' + . ($stmt->class instanceof PhpParser\Node\Name\FullyQualified + ? '\\' + : $statements_analyzer->getNamespace() . '-') + . implode('\\', $stmt->class->parts) + ); + } + + if (!isset($context->phantom_classes[strtolower($fq_class_name)])) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $fq_class_name, + new CodeLocation($statements_analyzer->getSource(), $stmt->class), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues() + ) === false) { + return false; + } + } + + if ($codebase->alter_code) { + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $stmt->class, + $fq_class_name, + $context->calling_method_id + ); + } + } + } + + $statements_analyzer->node_data->setType($stmt, Type::getBool()); + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php new file mode 100644 index 00000000..40f33819 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php @@ -0,0 +1,49 @@ +vars as $isset_var) { + if ($isset_var instanceof PhpParser\Node\Expr\PropertyFetch + && $isset_var->var instanceof PhpParser\Node\Expr\Variable + && $isset_var->var->name === 'this' + && $isset_var->name instanceof PhpParser\Node\Identifier + ) { + $var_id = '$this->' . $isset_var->name->name; + + if (!isset($context->vars_in_scope[$var_id])) { + $context->vars_in_scope[$var_id] = Type::getMixed(); + $context->vars_possibly_in_scope[$var_id] = true; + } + } + + self::analyzeIssetVar($statements_analyzer, $isset_var, $context); + } + + $statements_analyzer->node_data->setType($stmt, Type::getBool()); + } + + public static function analyzeIssetVar( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $stmt, + Context $context + ): void { + $context->inside_isset = true; + + ExpressionAnalyzer::analyze($statements_analyzer, $stmt, $context); + + $context->inside_isset = false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php new file mode 100644 index 00000000..481a5afa --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php @@ -0,0 +1,107 @@ +node_data->setType($stmt, Type::getInt()); + } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Class_) { + $codebase = $statements_analyzer->getCodebase(); + + if (!$context->self) { + IssueBuffer::maybeAdd( + new UndefinedConstant( + 'Cannot get __class__ outside a class', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + $statements_analyzer->node_data->setType($stmt, Type::getClassString()); + } else { + if ($codebase->alter_code) { + $codebase->classlikes->handleClassLikeReferenceInMigration( + $codebase, + $statements_analyzer, + $stmt, + $context->self, + $context->calling_method_id + ); + } + + $statements_analyzer->node_data->setType($stmt, Type::getLiteralClassString($context->self)); + } + } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Namespace_) { + $namespace = $statements_analyzer->getNamespace(); + if ($namespace === null + && IssueBuffer::accepts( + new UndefinedConstant( + 'Cannot get __namespace__ outside a namespace', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ) + ) { + // fall through + } + + $statements_analyzer->node_data->setType($stmt, Type::getString($namespace)); + } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Method + || $stmt instanceof PhpParser\Node\Scalar\MagicConst\Function_ + ) { + $source = $statements_analyzer->getSource(); + if ($source instanceof MethodAnalyzer) { + if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Function_) { + $statements_analyzer->node_data->setType($stmt, Type::getString($source->getMethodName())); + } else { + $statements_analyzer->node_data->setType( + $stmt, + Type::getString($source->getCorrectlyCasedMethodId()) + ); + } + } elseif ($source instanceof FunctionAnalyzer) { + $statements_analyzer->node_data->setType($stmt, Type::getString($source->getCorrectlyCasedMethodId())); + } else { + $statements_analyzer->node_data->setType($stmt, new Union([new TCallableString])); + } + } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Dir) { + $statements_analyzer->node_data->setType( + $stmt, + Type::getString(dirname($statements_analyzer->getSource()->getFilePath())) + ); + } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\File) { + $statements_analyzer->node_data->setType( + $stmt, + Type::getString($statements_analyzer->getSource()->getFilePath()) + ); + } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Trait_) { + if ($statements_analyzer->getSource() instanceof TraitAnalyzer) { + $statements_analyzer->node_data->setType($stmt, new Union([new TNonEmptyString()])); + } else { + $statements_analyzer->node_data->setType($stmt, Type::getString()); + } + } + } +} 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 new file mode 100644 index 00000000..139fde07 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php @@ -0,0 +1,351 @@ +inside_call; + + $context->inside_call = true; + + $was_inside_conditional = $context->inside_conditional; + + $context->inside_conditional = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->cond, $context) === false) { + $context->inside_conditional = $was_inside_conditional; + + return false; + } + + $context->inside_conditional = $was_inside_conditional; + + $switch_var_id = ExpressionIdentifier::getArrayVarId( + $stmt->cond, + null, + $statements_analyzer + ); + + $match_condition = $stmt->cond; + + if (!$switch_var_id) { + if ($stmt->cond instanceof PhpParser\Node\Expr\FuncCall + && $stmt->cond->name instanceof PhpParser\Node\Name + && ($stmt->cond->name->parts === ['get_class'] + || $stmt->cond->name->parts === ['gettype'] + || $stmt->cond->name->parts === ['get_debug_type']) + && $stmt->cond->getArgs() + ) { + $first_arg = $stmt->cond->getArgs()[0]; + + if (!$first_arg->value instanceof PhpParser\Node\Expr\Variable) { + $switch_var_id = '$__tmp_switch__' . (int) $first_arg->value->getAttribute('startFilePos'); + + $condition_type = $statements_analyzer->node_data->getType($first_arg->value) ?? Type::getMixed(); + + $context->vars_in_scope[$switch_var_id] = $condition_type; + + $match_condition = new VirtualFuncCall( + $stmt->cond->name, + [ + new VirtualArg( + new VirtualVariable( + substr($switch_var_id, 1), + $first_arg->value->getAttributes() + ), + false, + false, + $first_arg->getAttributes() + ) + ], + $stmt->cond->getAttributes() + ); + } + } elseif ($stmt->cond instanceof PhpParser\Node\Expr\FuncCall + || $stmt->cond instanceof PhpParser\Node\Expr\MethodCall + || $stmt->cond instanceof PhpParser\Node\Expr\StaticCall + ) { + $switch_var_id = '$__tmp_switch__' . (int) $stmt->cond->getAttribute('startFilePos'); + + $condition_type = $statements_analyzer->node_data->getType($stmt->cond) ?? Type::getMixed(); + + $context->vars_in_scope[$switch_var_id] = $condition_type; + + $match_condition = new VirtualVariable( + substr($switch_var_id, 1), + $stmt->cond->getAttributes() + ); + } + } + + $arms = $stmt->arms; + + foreach ($arms as $i => $arm) { + // move default to the end + if ($arm->conds === null) { + unset($arms[$i]); + $arms[] = $arm; + } + } + + $arms = array_reverse($arms); + + $last_arm = array_shift($arms); + + if (!$last_arm) { + IssueBuffer::maybeAdd( + new UnhandledMatchCondition( + 'This match expression does not match anything', + new CodeLocation($statements_analyzer->getSource(), $match_condition) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return false; + } + + $old_node_data = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + if (!$last_arm->conds) { + $ternary = $last_arm->body; + } else { + $ternary = new VirtualTernary( + self::convertCondsToConditional($last_arm->conds, $match_condition, $last_arm->getAttributes()), + $last_arm->body, + new VirtualThrow( + new VirtualNew( + new VirtualFullyQualified( + 'UnhandledMatchError', + $stmt->getAttributes() + ), + [], + $stmt->getAttributes() + ) + ), + $stmt->getAttributes() + ); + } + + foreach ($arms as $arm) { + if (!$arm->conds) { + continue; + } + + $ternary = new VirtualTernary( + self::convertCondsToConditional($arm->conds, $match_condition, $arm->getAttributes()), + $arm->body, + $ternary, + $arm->getAttributes() + ); + } + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('RedundantCondition', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['RedundantCondition']); + } + + if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['RedundantConditionGivenDocblockType']); + } + + if (ExpressionAnalyzer::analyze($statements_analyzer, $ternary, $context) === false) { + return false; + } + + if (!in_array('RedundantCondition', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['RedundantCondition']); + } + + if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['RedundantConditionGivenDocblockType']); + } + + if ($switch_var_id && $last_arm->conds) { + $codebase = $statements_analyzer->getCodebase(); + + $all_conds = $last_arm->conds; + + foreach ($arms as $arm) { + if (!$arm->conds) { + throw new UnexpectedValueException('bad'); + } + + $all_conds = array_merge($arm->conds, $all_conds); + } + + $all_match_condition = self::convertCondsToConditional( + $all_conds, + $match_condition, + $match_condition->getAttributes() + ); + + ExpressionAnalyzer::analyze($statements_analyzer, $all_match_condition, $context); + + $clauses = FormulaGenerator::getFormula( + spl_object_id($all_match_condition), + spl_object_id($all_match_condition), + $all_match_condition, + $context->self, + $statements_analyzer, + $codebase, + false, + false + ); + + $reconcilable_types = Algebra::getTruthsFromFormula( + Algebra::negateFormula($clauses) + ); + + // if the if has an || in the conditional, we cannot easily reason about it + if ($reconcilable_types) { + $changed_var_ids = []; + + $vars_in_scope_reconciled = Reconciler::reconcileKeyedTypes( + $reconcilable_types, + [], + $context->vars_in_scope, + $changed_var_ids, + [], + $statements_analyzer, + [], + $context->inside_loop, + null + ); + + if (isset($vars_in_scope_reconciled[$switch_var_id])) { + $array_literal_types = array_filter( + $vars_in_scope_reconciled[$switch_var_id]->getAtomicTypes(), + function ($type) { + return $type instanceof TLiteralInt + || $type instanceof TLiteralString + || $type instanceof TLiteralFloat + || $type instanceof TEnumCase; + } + ); + + if ($array_literal_types) { + IssueBuffer::maybeAdd( + new UnhandledMatchCondition( + 'This match expression is not exhaustive - consider values ' + . $vars_in_scope_reconciled[$switch_var_id]->getId(), + new CodeLocation($statements_analyzer->getSource(), $match_condition) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + } + + $stmt_expr_type = $statements_analyzer->node_data->getType($ternary); + + $old_node_data->setType($stmt, $stmt_expr_type ?? Type::getMixed()); + + $statements_analyzer->node_data = $old_node_data; + + $context->inside_call = $was_inside_call; + + return true; + } + + /** + * @param non-empty-list $conds + */ + private static function convertCondsToConditional( + array $conds, + PhpParser\Node\Expr $match_condition, + array $attributes + ): PhpParser\Node\Expr { + if (count($conds) === 1) { + return new VirtualIdentical( + $match_condition, + $conds[0], + $attributes + ); + } + + $array_items = array_map( + function ($cond): PhpParser\Node\Expr\ArrayItem { + return new VirtualArrayItem($cond, null, false, $cond->getAttributes()); + }, + $conds + ); + + return new VirtualFuncCall( + new VirtualFullyQualified(['in_array']), + [ + new VirtualArg( + $match_condition, + false, + false, + $attributes + ), + new VirtualArg( + new VirtualArray( + $array_items, + $attributes + ), + false, + false, + $attributes + ), + new VirtualArg( + new VirtualConstFetch( + new VirtualFullyQualified(['true']), + $attributes + ), + false, + false, + $attributes + ), + ], + $attributes + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php new file mode 100644 index 00000000..c1d49922 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php @@ -0,0 +1,98 @@ +var instanceof PhpParser\Node\Expr\Variable) { + $was_inside_general_use = $context->inside_general_use; + + $context->inside_general_use = true; + ExpressionAnalyzer::analyze($statements_analyzer, $stmt->var, $context); + $context->inside_general_use = $was_inside_general_use; + + $tmp_name = '__tmp_nullsafe__' . (int) $stmt->var->getAttribute('startFilePos'); + + $condition_type = $statements_analyzer->node_data->getType($stmt->var); + + if ($condition_type) { + $context->vars_in_scope['$' . $tmp_name] = $condition_type; + + $tmp_var = new VirtualVariable($tmp_name, $stmt->var->getAttributes()); + } else { + $tmp_var = $stmt->var; + } + } else { + $tmp_var = $stmt->var; + } + + $old_node_data = $statements_analyzer->node_data; + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $null_value1 = new VirtualConstFetch( + new VirtualName('null'), + $stmt->var->getAttributes() + ); + + $null_comparison = new VirtualIdentical( + $tmp_var, + $null_value1, + $stmt->var->getAttributes() + ); + + $null_value2 = new VirtualConstFetch( + new VirtualName('null'), + $stmt->var->getAttributes() + ); + + if ($stmt instanceof PhpParser\Node\Expr\NullsafePropertyFetch) { + $ternary = new VirtualTernary( + $null_comparison, + $null_value2, + new VirtualPropertyFetch($tmp_var, $stmt->name, $stmt->getAttributes()), + $stmt->getAttributes() + ); + } else { + $ternary = new VirtualTernary( + $null_comparison, + $null_value2, + new VirtualMethodCall($tmp_var, $stmt->name, $stmt->args, $stmt->getAttributes()), + $stmt->getAttributes() + ); + } + + ExpressionAnalyzer::analyze($statements_analyzer, $ternary, $context); + + $ternary_type = $statements_analyzer->node_data->getType($ternary); + + $statements_analyzer->node_data = $old_node_data; + + $statements_analyzer->node_data->setType($stmt, $ternary_type ?? Type::getMixed()); + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php new file mode 100644 index 00000000..b65193ab --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php @@ -0,0 +1,109 @@ +getCodebase(); + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + return false; + } + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { + $call_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + $print_param_sink = TaintSink::getForMethodArgument( + 'print', + 'print', + 0, + null, + $call_location + ); + + $print_param_sink->taints = [ + TaintKind::INPUT_HTML, + TaintKind::INPUT_HAS_QUOTES, + TaintKind::USER_SECRET, + TaintKind::SYSTEM_SECRET + ]; + + $statements_analyzer->data_flow_graph->addSink($print_param_sink); + } + + if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { + if (ArgumentAnalyzer::verifyType( + $statements_analyzer, + $stmt_expr_type, + Type::getString(), + null, + 'print', + null, + 0, + new CodeLocation($statements_analyzer->getSource(), $stmt->expr), + $stmt->expr, + $context, + new FunctionLikeParameter('var', false), + false, + null, + true, + true, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ) === false) { + return false; + } + } + + if (isset($codebase->config->forbidden_functions['print'])) { + IssueBuffer::maybeAdd( + new ForbiddenCode( + 'You have forbidden the use of print', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (!$context->collect_initializations && !$context->collect_mutations) { + if ($context->mutation_free || $context->external_mutation_free) { + IssueBuffer::maybeAdd( + new ImpureFunctionCall( + 'Cannot call print from a mutation-free context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer + && $statements_analyzer->getSource()->track_mutations + ) { + $statements_analyzer->getSource()->inferred_has_mutation = true; + $statements_analyzer->getSource()->inferred_impure = true; + } + } + + $statements_analyzer->node_data->setType($stmt, Type::getInt(false, 1)); + + return true; + } +} 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 new file mode 100644 index 00000000..081d0cf2 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php @@ -0,0 +1,760 @@ + $existing_class_constants + */ + public static function infer( + Codebase $codebase, + NodeDataProvider $nodes, + PhpParser\Node\Expr $stmt, + Aliases $aliases, + FileSource $file_source = null, + ?array $existing_class_constants = null, + ?string $fq_classlike_name = null + ): ?Union { + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) { + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat) { + $left = self::infer( + $codebase, + $nodes, + $stmt->left, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + $right = self::infer( + $codebase, + $nodes, + $stmt->right, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + + if ($left + && $right + ) { + if ($left->isSingleStringLiteral() + && $right->isSingleStringLiteral() + ) { + $result = $left->getSingleStringLiteral()->value . $right->getSingleStringLiteral()->value; + + return Type::getString($result); + } + + if ($left->isSingle() && $left->getSingleAtomic() instanceof TNonEmptyString) { + return new Union([new TNonEmptyString()]); + } + + if ($right->isSingle() && $right->getSingleAtomic() instanceof TNonEmptyString) { + return new Union([new TNonEmptyString()]); + } + } + + return Type::getString(); + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalAnd + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalOr + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotEqual + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Greater + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Smaller + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual + ) { + return Type::getBool(); + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Coalesce) { + return null; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Spaceship) { + return new Union( + [ + new TLiteralInt(-1), + new TLiteralInt(0), + new TLiteralInt(1) + ] + ); + } + + $stmt_left_type = self::infer( + $codebase, + $nodes, + $stmt->left, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + + $stmt_right_type = self::infer( + $codebase, + $nodes, + $stmt->right, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + + if (!$stmt_left_type || !$stmt_right_type) { + return null; + } + + $nodes->setType( + $stmt->left, + $stmt_left_type + ); + + $nodes->setType( + $stmt->right, + $stmt_right_type + ); + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Plus + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Minus + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Mod + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Mul + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Pow + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\ShiftRight + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\ShiftLeft + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr + || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd + ) { + ArithmeticOpAnalyzer::analyze( + $file_source instanceof StatementsSource ? $file_source : null, + $nodes, + $stmt->left, + $stmt->right, + $stmt, + $result_type + ); + + if ($result_type) { + return $result_type; + } + + return null; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Div + && ($stmt_left_type->hasInt() || $stmt_left_type->hasFloat()) + && ($stmt_right_type->hasInt() || $stmt_right_type->hasFloat()) + ) { + return Type::combineUnionTypes(Type::getFloat(), Type::getInt()); + } + } + + if ($stmt instanceof PhpParser\Node\Expr\ConstFetch) { + $name = strtolower($stmt->name->parts[0]); + if ($name === 'false') { + return Type::getFalse(); + } + + if ($name === 'true') { + return Type::getTrue(); + } + + if ($name === 'null') { + return Type::getNull(); + } + + if ($stmt->name->parts[0] === '__NAMESPACE__') { + return Type::getString($aliases->namespace); + } + + return null; + } + + if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Dir + || $stmt instanceof PhpParser\Node\Scalar\MagicConst\File + ) { + return new Union([new TNonEmptyString()]); + } + + if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Line) { + return Type::getInt(); + } + + if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Class_ + || $stmt instanceof PhpParser\Node\Scalar\MagicConst\Method + || $stmt instanceof PhpParser\Node\Scalar\MagicConst\Trait_ + || $stmt instanceof PhpParser\Node\Scalar\MagicConst\Function_ + ) { + return Type::getString(); + } + + if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Namespace_) { + return Type::getString($aliases->namespace); + } + + if ($stmt instanceof PhpParser\Node\Expr\ClassConstFetch) { + if ($stmt->class instanceof PhpParser\Node\Name + && $stmt->name instanceof PhpParser\Node\Identifier + && $fq_classlike_name + && $stmt->class->parts !== ['static'] + && $stmt->class->parts !== ['parent'] + ) { + if (isset($existing_class_constants[$stmt->name->name]) + && $existing_class_constants[$stmt->name->name]->type + ) { + if ($stmt->class->parts === ['self']) { + return clone $existing_class_constants[$stmt->name->name]->type; + } + } + + if ($stmt->class->parts === ['self']) { + $const_fq_class_name = $fq_classlike_name; + } else { + $const_fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( + $stmt->class, + $aliases + ); + } + + if (strtolower($const_fq_class_name) === strtolower($fq_classlike_name) + && isset($existing_class_constants[$stmt->name->name]) + && $existing_class_constants[$stmt->name->name]->type + ) { + return clone $existing_class_constants[$stmt->name->name]->type; + } + + if (strtolower($stmt->name->name) === 'class') { + return Type::getLiteralClassString($const_fq_class_name, true); + } + + if ($existing_class_constants === null + && $file_source instanceof StatementsAnalyzer + ) { + try { + $foreign_class_constant = $codebase->classlikes->getClassConstantType( + $const_fq_class_name, + $stmt->name->name, + ReflectionProperty::IS_PRIVATE, + $file_source + ); + + if ($foreign_class_constant) { + return clone $foreign_class_constant; + } + + return null; + } catch (InvalidArgumentException | CircularReferenceException $e) { + return null; + } + } + } + + if ($stmt->name instanceof PhpParser\Node\Identifier && strtolower($stmt->name->name) === 'class') { + return Type::getClassString(); + } + + return null; + } + + if ($stmt instanceof PhpParser\Node\Scalar\String_) { + return Type::getString($stmt->value); + } + + if ($stmt instanceof PhpParser\Node\Scalar\LNumber) { + return Type::getInt(false, $stmt->value); + } + + if ($stmt instanceof PhpParser\Node\Scalar\DNumber) { + return Type::getFloat($stmt->value); + } + + if ($stmt instanceof PhpParser\Node\Expr\Array_) { + return self::inferArrayType( + $codebase, + $nodes, + $stmt, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\Int_) { + return Type::getInt(); + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\Double) { + return Type::getFloat(); + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\Bool_) { + return Type::getBool(); + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\String_) { + return Type::getString(); + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\Object_) { + return Type::getObject(); + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast\Array_) { + return Type::getArray(); + } + + if ($stmt instanceof PhpParser\Node\Expr\UnaryMinus || $stmt instanceof PhpParser\Node\Expr\UnaryPlus) { + $type_to_invert = self::infer( + $codebase, + $nodes, + $stmt->expr, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + + if (!$type_to_invert) { + return null; + } + + foreach ($type_to_invert->getAtomicTypes() as $type_part) { + if ($type_part instanceof TLiteralInt + && $stmt instanceof PhpParser\Node\Expr\UnaryMinus + ) { + $type_part->value = -$type_part->value; + } elseif ($type_part instanceof TLiteralFloat + && $stmt instanceof PhpParser\Node\Expr\UnaryMinus + ) { + $type_part->value = -$type_part->value; + } + } + + return $type_to_invert; + } + + if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) { + if ($stmt->var instanceof PhpParser\Node\Expr\ClassConstFetch + && $stmt->dim + ) { + $array_type = self::infer( + $codebase, + $nodes, + $stmt->var, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + + $dim_type = self::infer( + $codebase, + $nodes, + $stmt->dim, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + + if ($array_type !== null && $dim_type !== null) { + if ($dim_type->isSingleStringLiteral()) { + $dim_value = $dim_type->getSingleStringLiteral()->value; + } elseif ($dim_type->isSingleIntLiteral()) { + $dim_value = $dim_type->getSingleIntLiteral()->value; + } else { + return null; + } + + foreach ($array_type->getAtomicTypes() as $array_atomic_type) { + if ($array_atomic_type instanceof TKeyedArray) { + if (isset($array_atomic_type->properties[$dim_value])) { + return clone $array_atomic_type->properties[$dim_value]; + } + + return null; + } + } + } + } + } + + if ($stmt instanceof PhpParser\Node\Expr\New_) { + $resolved_class_name = $stmt->class->getAttribute('resolvedName'); + + if (!is_string($resolved_class_name)) { + return null; + } + + return new Union([ + new Type\Atomic\TNamedObject($resolved_class_name) + ]); + } + + return null; + } + + /** + * @param ?array $existing_class_constants + */ + private static function inferArrayType( + Codebase $codebase, + NodeDataProvider $nodes, + PhpParser\Node\Expr\Array_ $stmt, + Aliases $aliases, + FileSource $file_source = null, + ?array $existing_class_constants = null, + ?string $fq_classlike_name = null + ): ?Union { + if (count($stmt->items) === 0) { + return Type::getEmptyArray(); + } + + $array_creation_info = new ArrayCreationInfo(); + + foreach ($stmt->items as $item) { + if ($item === null) { + continue; + } + + if (!self::handleArrayItem( + $codebase, + $nodes, + $array_creation_info, + $item, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + )) { + return null; + } + } + + $item_key_type = null; + if ($array_creation_info->item_key_atomic_types) { + $item_key_type = TypeCombiner::combine( + $array_creation_info->item_key_atomic_types, + null, + false, + true, + 30 + ); + } + + $item_value_type = null; + if ($array_creation_info->item_value_atomic_types) { + $item_value_type = TypeCombiner::combine( + $array_creation_info->item_value_atomic_types, + null, + false, + true, + 30 + ); + } + + // if this array looks like an object-like array, let's return that instead + if ($item_value_type + && $item_key_type + && ($item_key_type->hasString() || $item_key_type->hasInt()) + && $array_creation_info->can_create_objectlike + && $array_creation_info->property_types + ) { + $objectlike = new TKeyedArray( + $array_creation_info->property_types, + $array_creation_info->class_strings + ); + $objectlike->sealed = true; + $objectlike->is_list = $array_creation_info->all_list; + return new Union([$objectlike]); + } + + if (!$item_key_type || !$item_value_type) { + return null; + } + + if ($array_creation_info->all_list) { + return new Union([ + new TNonEmptyList($item_value_type), + ]); + } + + return new Union([ + new TNonEmptyArray([ + $item_key_type, + $item_value_type, + ]), + ]); + } + + /** + * @param ?array $existing_class_constants + */ + private static function handleArrayItem( + Codebase $codebase, + NodeDataProvider $nodes, + ArrayCreationInfo $array_creation_info, + PhpParser\Node\Expr\ArrayItem $item, + Aliases $aliases, + FileSource $file_source = null, + ?array $existing_class_constants = null, + ?string $fq_classlike_name = null + ): bool { + if ($item->unpack) { + $unpacked_array_type = self::infer( + $codebase, + $nodes, + $item->value, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + + if (!$unpacked_array_type) { + return false; + } + + return self::handleUnpackedArray($array_creation_info, $unpacked_array_type); + } + + $single_item_key_type = null; + $item_is_list_item = false; + $item_key_value = null; + + if ($item->key) { + $single_item_key_type = self::infer( + $codebase, + $nodes, + $item->key, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + + if ($single_item_key_type) { + $key_type = $single_item_key_type; + if ($key_type->isNull()) { + $key_type = Type::getString(''); + } + if ($item->key instanceof PhpParser\Node\Scalar\String_ + && preg_match('/^(0|[1-9][0-9]*)$/', $item->key->value) + && ( + (int) $item->key->value < PHP_INT_MAX || + $item->key->value === (string) PHP_INT_MAX + ) + ) { + $key_type = Type::getInt(false, (int) $item->key->value); + } + + $array_creation_info->item_key_atomic_types = array_merge( + $array_creation_info->item_key_atomic_types, + array_values($key_type->getAtomicTypes()) + ); + + if ($key_type->isSingleStringLiteral()) { + $item_key_literal_type = $key_type->getSingleStringLiteral(); + $item_key_value = $item_key_literal_type->value; + + if ($item_key_literal_type instanceof TLiteralClassString) { + $array_creation_info->class_strings[$item_key_value] = true; + } + } elseif ($key_type->isSingleIntLiteral()) { + $item_key_value = $key_type->getSingleIntLiteral()->value; + + if ($item_key_value >= $array_creation_info->int_offset) { + if ($item_key_value === $array_creation_info->int_offset) { + $item_is_list_item = true; + } + $array_creation_info->int_offset = $item_key_value + 1; + } + } + } + } else { + $item_is_list_item = true; + $item_key_value = $array_creation_info->int_offset++; + $array_creation_info->item_key_atomic_types[] = new TLiteralInt($item_key_value); + } + + $single_item_value_type = self::infer( + $codebase, + $nodes, + $item->value, + $aliases, + $file_source, + $existing_class_constants, + $fq_classlike_name + ); + + if (!$single_item_value_type) { + return false; + } + + $config = $codebase->config; + + $array_creation_info->all_list = $array_creation_info->all_list && $item_is_list_item; + + if ($item->key instanceof PhpParser\Node\Scalar\String_ + || $item->key instanceof PhpParser\Node\Scalar\LNumber + || !$item->key + ) { + if ($item_key_value !== null + && count($array_creation_info->property_types) <= $config->max_shaped_array_size + ) { + $array_creation_info->property_types[$item_key_value] = $single_item_value_type; + } else { + $array_creation_info->can_create_objectlike = false; + } + } else { + $dim_type = $single_item_key_type; + + if (!$dim_type) { + return false; + } + + if (count($dim_type->getAtomicTypes()) > 1 + || $dim_type->hasMixed() + || count($array_creation_info->property_types) > $config->max_shaped_array_size + ) { + $array_creation_info->can_create_objectlike = false; + } else { + $atomic_type = $dim_type->getSingleAtomic(); + + if ($atomic_type instanceof TLiteralInt + || $atomic_type instanceof TLiteralString + ) { + if ($atomic_type instanceof TLiteralClassString) { + $array_creation_info->class_strings[$atomic_type->value] = true; + } + + $array_creation_info->property_types[$atomic_type->value] = $single_item_value_type; + } else { + $array_creation_info->can_create_objectlike = false; + } + } + } + + $array_creation_info->item_value_atomic_types = array_merge( + $array_creation_info->item_value_atomic_types, + array_values($single_item_value_type->getAtomicTypes()) + ); + + return true; + } + + private static function handleUnpackedArray( + ArrayCreationInfo $array_creation_info, + Union $unpacked_array_type + ): bool { + foreach ($unpacked_array_type->getAtomicTypes() as $unpacked_atomic_type) { + if ($unpacked_atomic_type instanceof TKeyedArray) { + 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); + } else { + $new_offset = $array_creation_info->int_offset++; + $array_creation_info->item_key_atomic_types[] = new TLiteralInt($new_offset); + } + + $array_creation_info->item_value_atomic_types = array_merge( + $array_creation_info->item_value_atomic_types, + array_values($property_value->getAtomicTypes()) + ); + + $array_creation_info->array_keys[$new_offset] = true; + $array_creation_info->property_types[$new_offset] = $property_value; + } + } elseif ($unpacked_atomic_type instanceof TArray) { + if ($unpacked_atomic_type->type_params[1]->isEmpty()) { + continue; + } + $array_creation_info->can_create_objectlike = false; + + if ($unpacked_atomic_type->type_params[0]->hasString()) { + $array_creation_info->item_key_atomic_types[] = new TString(); + } + + if ($unpacked_atomic_type->type_params[0]->hasInt()) { + $array_creation_info->item_key_atomic_types[] = new TInt(); + } + + $array_creation_info->item_value_atomic_types = array_merge( + $array_creation_info->item_value_atomic_types, + array_values( + isset($unpacked_atomic_type->type_params[1]) + ? $unpacked_atomic_type->type_params[1]->getAtomicTypes() + : [new TMixed()] + ) + ); + } elseif ($unpacked_atomic_type instanceof TList) { + if ($unpacked_atomic_type->type_param->isEmpty()) { + continue; + } + $array_creation_info->can_create_objectlike = false; + + $array_creation_info->item_key_atomic_types[] = new TInt(); + + $array_creation_info->item_value_atomic_types = array_merge( + $array_creation_info->item_value_atomic_types, + array_values($unpacked_atomic_type->type_param->getAtomicTypes()) + ); + } + } + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php new file mode 100644 index 00000000..872c7346 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php @@ -0,0 +1,306 @@ +getCodebase(); + + $if_scope = new IfScope(); + + try { + $if_conditional_scope = IfConditionalAnalyzer::analyze( + $statements_analyzer, + $stmt->cond, + $context, + $codebase, + $if_scope, + $context->branch_point ?: (int) $stmt->getAttribute('startFilePos') + ); + + $if_context = $if_conditional_scope->if_context; + + $cond_referenced_var_ids = $if_conditional_scope->cond_referenced_var_ids; + $assigned_in_conditional_var_ids = $if_conditional_scope->assigned_in_conditional_var_ids; + } catch (ScopeAnalysisException $e) { + return false; + } + + $codebase = $statements_analyzer->getCodebase(); + + $cond_id = spl_object_id($stmt->cond); + + $if_clauses = FormulaGenerator::getFormula( + $cond_id, + $cond_id, + $stmt->cond, + $context->self, + $statements_analyzer, + $codebase + ); + + $mixed_var_ids = []; + + foreach ($context->vars_in_scope as $var_id => $type) { + if ($type->hasMixed()) { + $mixed_var_ids[] = $var_id; + } + } + + foreach ($context->vars_possibly_in_scope as $var_id => $_) { + if (!isset($context->vars_in_scope[$var_id])) { + $mixed_var_ids[] = $var_id; + } + } + + $if_clauses = array_map( + /** + * @return Clause + */ + function (Clause $c) use ($mixed_var_ids, $cond_id): Clause { + $keys = array_keys($c->possibilities); + + $mixed_var_ids = array_diff($mixed_var_ids, $keys); + + foreach ($keys as $key) { + foreach ($mixed_var_ids as $mixed_var_id) { + if (preg_match('/^' . preg_quote($mixed_var_id, '/') . '(\[|-)/', $key)) { + return new Clause([], $cond_id, $cond_id, true); + } + } + } + + return $c; + }, + $if_clauses + ); + + // this will see whether any of the clauses in set A conflict with the clauses in set B + AlgebraAnalyzer::checkForParadox( + $context->clauses, + $if_clauses, + $statements_analyzer, + $stmt->cond, + $assigned_in_conditional_var_ids + ); + + $ternary_clauses = array_merge($context->clauses, $if_clauses); + + if ($if_context->reconciled_expression_clauses) { + $reconciled_expression_clauses = $if_context->reconciled_expression_clauses; + + $ternary_clauses = array_values( + array_filter( + $ternary_clauses, + function ($c) use ($reconciled_expression_clauses): bool { + return !in_array($c->hash, $reconciled_expression_clauses); + } + ) + ); + } + + $ternary_clauses = Algebra::simplifyCNF($ternary_clauses); + + $negated_clauses = Algebra::negateFormula($if_clauses); + + $negated_if_types = Algebra::getTruthsFromFormula( + Algebra::simplifyCNF( + array_merge($context->clauses, $negated_clauses) + ) + ); + + $active_if_types = []; + + $reconcilable_if_types = Algebra::getTruthsFromFormula( + $ternary_clauses, + $cond_id, + $cond_referenced_var_ids, + $active_if_types + ); + + $changed_var_ids = []; + + if ($reconcilable_if_types) { + $if_vars_in_scope_reconciled = Reconciler::reconcileKeyedTypes( + $reconcilable_if_types, + $active_if_types, + $if_context->vars_in_scope, + $changed_var_ids, + $cond_referenced_var_ids, + $statements_analyzer, + $statements_analyzer->getTemplateTypeMap() ?: [], + $if_context->inside_loop, + new CodeLocation($statements_analyzer->getSource(), $stmt->cond) + ); + + $if_context->vars_in_scope = $if_vars_in_scope_reconciled; + } + + $t_else_context = clone $context; + + if ($stmt->if) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->if, $if_context) === false) { + return false; + } + + $context->referenced_var_ids = array_merge( + $context->referenced_var_ids, + $if_context->referenced_var_ids + ); + } + + $t_else_context->clauses = Algebra::simplifyCNF( + array_merge( + $t_else_context->clauses, + $negated_clauses + ) + ); + + if ($negated_if_types) { + $changed_var_ids = []; + + $t_else_vars_in_scope_reconciled = Reconciler::reconcileKeyedTypes( + $negated_if_types, + $negated_if_types, + $t_else_context->vars_in_scope, + $changed_var_ids, + $cond_referenced_var_ids, + $statements_analyzer, + $statements_analyzer->getTemplateTypeMap() ?: [], + $t_else_context->inside_loop, + new CodeLocation($statements_analyzer->getSource(), $stmt->else) + ); + + $t_else_context->vars_in_scope = $t_else_vars_in_scope_reconciled; + + $t_else_context->clauses = Context::removeReconciledClauses($t_else_context->clauses, $changed_var_ids)[0]; + } + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->else, $t_else_context) === false) { + return false; + } + + $assign_var_ifs = $if_context->assigned_var_ids; + $assign_var_else = $t_else_context->assigned_var_ids; + $assign_all = array_intersect_key($assign_var_ifs, $assign_var_else); + + //if the same var was assigned in both branches + foreach ($assign_all as $var_id => $_) { + if (isset($if_context->vars_in_scope[$var_id]) && isset($t_else_context->vars_in_scope[$var_id])) { + $context->vars_in_scope[$var_id] = Type::combineUnionTypes( + $if_context->vars_in_scope[$var_id], + $t_else_context->vars_in_scope[$var_id] + ); + } + } + + $redef_var_ifs = array_keys($if_context->getRedefinedVars($context->vars_in_scope)); + $redef_var_else = array_keys($t_else_context->getRedefinedVars($context->vars_in_scope)); + $redef_all = array_intersect($redef_var_ifs, $redef_var_else); + + //these vars were changed in both branches + foreach ($redef_all as $redef_var_id) { + $context->vars_in_scope[$redef_var_id] = Type::combineUnionTypes( + $if_context->vars_in_scope[$redef_var_id], + $t_else_context->vars_in_scope[$redef_var_id] + ); + } + + //these vars were changed in the if and existed before + foreach ($redef_var_ifs as $redef_var_ifs_id) { + if (isset($context->vars_in_scope[$redef_var_ifs_id])) { + $context->vars_in_scope[$redef_var_ifs_id] = Type::combineUnionTypes( + $context->vars_in_scope[$redef_var_ifs_id], + $if_context->vars_in_scope[$redef_var_ifs_id] + ); + } + } + + //these vars were changed in the else and existed before + foreach ($redef_var_else as $redef_var_else_id) { + if (isset($context->vars_in_scope[$redef_var_else_id])) { + $context->vars_in_scope[$redef_var_else_id] = Type::combineUnionTypes( + $context->vars_in_scope[$redef_var_else_id], + $t_else_context->vars_in_scope[$redef_var_else_id] + ); + } + } + + $context->vars_possibly_in_scope = array_merge( + $context->vars_possibly_in_scope, + $if_context->vars_possibly_in_scope, + $t_else_context->vars_possibly_in_scope + ); + + $context->referenced_var_ids = array_merge( + $context->referenced_var_ids, + $t_else_context->referenced_var_ids + ); + + $lhs_type = null; + + if ($stmt->if) { + if ($stmt_if_type = $statements_analyzer->node_data->getType($stmt->if)) { + $lhs_type = $stmt_if_type; + } + } elseif ($stmt_cond_type = $statements_analyzer->node_data->getType($stmt->cond)) { + $if_return_type_reconciled = AssertionReconciler::reconcile( + '!falsy', + clone $stmt_cond_type, + '', + $statements_analyzer, + $context->inside_loop, + [], + new CodeLocation($statements_analyzer->getSource(), $stmt), + $statements_analyzer->getSuppressedIssues() + ); + + $lhs_type = $if_return_type_reconciled; + } + + if ($lhs_type && ($stmt_else_type = $statements_analyzer->node_data->getType($stmt->else))) { + $statements_analyzer->node_data->setType($stmt, Type::combineUnionTypes($lhs_type, $stmt_else_type)); + } else { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } + + return true; + } +} 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 new file mode 100644 index 00000000..17485447 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php @@ -0,0 +1,134 @@ +expr, $context) === false) { + return false; + } + + if (!($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr))) { + $statements_analyzer->node_data->setType($stmt, new Union([new TInt, new TFloat])); + } elseif ($stmt_expr_type->isMixed()) { + $statements_analyzer->node_data->setType($stmt, Type::getMixed()); + } else { + $acceptable_types = []; + + foreach ($stmt_expr_type->getAtomicTypes() as $type_part) { + if ($type_part instanceof TInt || $type_part instanceof TFloat) { + if ($type_part instanceof TLiteralInt + && $stmt instanceof PhpParser\Node\Expr\UnaryMinus + ) { + $type_part->value = -$type_part->value; + } elseif ($type_part instanceof TLiteralFloat + && $stmt instanceof PhpParser\Node\Expr\UnaryMinus + ) { + $type_part->value = -$type_part->value; + } + + if ($type_part instanceof TIntRange + && $stmt instanceof PhpParser\Node\Expr\UnaryMinus + ) { + //we'll have to inverse min and max bound and negate any literal + $old_min_bound = $type_part->min_bound; + $old_max_bound = $type_part->max_bound; + if ($old_min_bound === null) { + //min bound is null, max bound will be null + $type_part->max_bound = null; + } elseif ($old_min_bound === 0) { + $type_part->max_bound = 0; + } else { + $type_part->max_bound = -$old_min_bound; + } + + if ($old_max_bound === null) { + //max bound is null, min bound will be null + $type_part->min_bound = null; + } elseif ($old_max_bound === 0) { + $type_part->min_bound = 0; + } else { + $type_part->min_bound = -$old_max_bound; + } + } + + if ($type_part instanceof TPositiveInt + && $stmt instanceof PhpParser\Node\Expr\UnaryMinus + ) { + $type_part = new TIntRange(null, -1); + } + + $acceptable_types[] = $type_part; + } elseif ($type_part instanceof TString) { + $acceptable_types[] = new TInt; + $acceptable_types[] = new TFloat; + } else { + $acceptable_types[] = new TInt; + } + } + + $statements_analyzer->node_data->setType($stmt, new Union($acceptable_types)); + } + + self::addDataFlow( + $statements_analyzer, + $stmt, + $stmt->expr, + $stmt instanceof UnaryMinus ? 'unary-minus' : 'unary-plus' + ); + + return true; + } + + private static function addDataFlow( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $stmt, + PhpParser\Node\Expr $value, + string $type + ): void { + $result_type = $statements_analyzer->node_data->getType($stmt); + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph && $result_type) { + $var_location = new CodeLocation($statements_analyzer, $stmt); + + $stmt_value_type = $statements_analyzer->node_data->getType($value); + + $new_parent_node = DataFlowNode::getForAssignment($type, $var_location); + $statements_analyzer->data_flow_graph->addNode($new_parent_node); + $result_type->parent_nodes = [ + $new_parent_node->id => $new_parent_node, + ]; + + if ($stmt_value_type && $stmt_value_type->parent_nodes) { + foreach ($stmt_value_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath($parent_node, $new_parent_node, $type); + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php new file mode 100644 index 00000000..d539c3ef --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php @@ -0,0 +1,219 @@ +getDocComment(); + + $var_comments = []; + $var_comment_type = null; + + $codebase = $statements_analyzer->getCodebase(); + + if ($doc_comment) { + try { + $var_comments = CommentAnalyzer::getTypeFromComment( + $doc_comment, + $statements_analyzer, + $statements_analyzer->getAliases() + ); + } catch (DocblockParseException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($statements_analyzer->getSource(), $stmt) + ) + ); + } + + foreach ($var_comments as $var_comment) { + if (!$var_comment->type) { + continue; + } + + $comment_type = TypeExpander::expandUnion( + $codebase, + $var_comment->type, + $context->self, + $context->self ? new TNamedObject($context->self) : null, + $statements_analyzer->getParentFQCLN() + ); + + $type_location = null; + + if ($var_comment->type_start + && $var_comment->type_end + && $var_comment->line_number + ) { + $type_location = new DocblockTypeLocation( + $statements_analyzer, + $var_comment->type_start, + $var_comment->type_end, + $var_comment->line_number + ); + } + + if (!$var_comment->var_id) { + $var_comment_type = $comment_type; + continue; + } + + if ($codebase->find_unused_variables + && $type_location + && isset($context->vars_in_scope[$var_comment->var_id]) + && $context->vars_in_scope[$var_comment->var_id]->getId() === $comment_type->getId() + ) { + $project_analyzer = $statements_analyzer->getProjectAnalyzer(); + + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['UnnecessaryVarAnnotation']) + ) { + FileManipulationBuffer::addVarAnnotationToRemove($type_location); + } elseif (IssueBuffer::accepts( + new UnnecessaryVarAnnotation( + 'The @var annotation for ' . $var_comment->var_id . ' is unnecessary', + $type_location + ), + $statements_analyzer->getSuppressedIssues(), + true + )) { + // fall through + } + } + + if (isset($context->vars_in_scope[$var_comment->var_id])) { + $comment_type->parent_nodes = $context->vars_in_scope[$var_comment->var_id]->parent_nodes; + } + + $context->vars_in_scope[$var_comment->var_id] = $comment_type; + } + } + + if ($stmt->key) { + $context->inside_call = true; + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->key, $context) === false) { + return false; + } + $context->inside_call = false; + } + + if ($stmt->value) { + $context->inside_call = true; + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->value, $context) === false) { + return false; + } + $context->inside_call = false; + + if ($var_comment_type) { + $expression_type = clone $var_comment_type; + } elseif ($stmt_var_type = $statements_analyzer->node_data->getType($stmt->value)) { + $expression_type = clone $stmt_var_type; + } else { + $expression_type = Type::getMixed(); + } + } else { + $expression_type = Type::getEmpty(); + } + + $yield_type = null; + + foreach ($expression_type->getAtomicTypes() as $expression_atomic_type) { + if ($expression_atomic_type instanceof TNamedObject) { + if (!$codebase->classlikes->classOrInterfaceExists($expression_atomic_type->value)) { + continue; + } + + $classlike_storage = $codebase->classlike_storage_provider->get($expression_atomic_type->value); + + if ($classlike_storage->yield) { + if ($expression_atomic_type instanceof TGenericObject) { + $yield_candidate_type = AtomicPropertyFetchAnalyzer::localizePropertyType( + $codebase, + clone $classlike_storage->yield, + $expression_atomic_type, + $classlike_storage, + $classlike_storage + ); + + $yield_type = Type::combineUnionTypes( + $yield_type, + $yield_candidate_type, + $codebase + ); + } else { + $yield_type = Type::getMixed(); + } + } + } + } + + if ($yield_type) { + $expression_type->substitute($expression_type, $yield_type); + } + + $statements_analyzer->node_data->setType($stmt, $expression_type); + + $source = $statements_analyzer->getSource(); + + if ($source instanceof FunctionLikeAnalyzer + && !($source->getSource() instanceof TraitAnalyzer) + ) { + $source->examineParamTypes($statements_analyzer, $context, $codebase, $stmt); + + $storage = $source->getFunctionLikeStorage($statements_analyzer); + + if ($storage->return_type && !$yield_type) { + foreach ($storage->return_type->getAtomicTypes() as $atomic_return_type) { + if ($atomic_return_type instanceof TNamedObject + && $atomic_return_type->value === 'Generator' + ) { + if ($atomic_return_type instanceof TGenericObject) { + if (!$atomic_return_type->type_params[2]->isVoid()) { + $statements_analyzer->node_data->setType( + $stmt, + clone $atomic_return_type->type_params[2] + ); + } + } else { + $statements_analyzer->node_data->setType( + $stmt, + Type::combineUnionTypes( + Type::getMixed(), + $expression_type + ) + ); + } + } + } + } + } + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php new file mode 100644 index 00000000..f9c03c41 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php @@ -0,0 +1,82 @@ +inside_call; + + $context->inside_call = true; + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + $context->inside_call = $was_inside_call; + + return false; + } + + if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { + $key_type = null; + $value_type = null; + $always_non_empty_array = true; + if (ForeachAnalyzer::checkIteratorType( + $statements_analyzer, + $stmt, + $stmt->expr, + $stmt_expr_type, + $statements_analyzer->getCodebase(), + $context, + $key_type, + $value_type, + $always_non_empty_array + ) === false + ) { + $context->inside_call = $was_inside_call; + + return false; + } + + $yield_from_type = null; + + foreach ($stmt_expr_type->getAtomicTypes() as $atomic_type) { + if ($yield_from_type === null) { + if ($atomic_type instanceof TGenericObject + && strtolower($atomic_type->value) === 'generator' + && isset($atomic_type->type_params[3]) + ) { + $yield_from_type = clone $atomic_type->type_params[3]; + } elseif ($atomic_type instanceof TArray) { + $yield_from_type = clone $atomic_type->type_params[1]; + } elseif ($atomic_type instanceof TKeyedArray) { + $yield_from_type = $atomic_type->getGenericValueType(); + } + } else { + $yield_from_type = Type::getMixed(); + } + } + + // this should be whatever the generator above returns, but *not* the return type + $statements_analyzer->node_data->setType($stmt, $yield_from_type ?: Type::getMixed()); + } + + $context->inside_call = $was_inside_call; + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php new file mode 100644 index 00000000..0ce2af83 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php @@ -0,0 +1,514 @@ +getCodebase(); + + if (self::handleExpression( + $statements_analyzer, + $stmt, + $context, + $array_assignment, + $global_context, + $from_stmt + ) === false + ) { + return false; + } + + if (!$context->inside_conditional + && ($stmt instanceof PhpParser\Node\Expr\BinaryOp + || $stmt instanceof PhpParser\Node\Expr\Instanceof_ + || $stmt instanceof PhpParser\Node\Expr\Assign + || $stmt instanceof PhpParser\Node\Expr\BooleanNot + || $stmt instanceof PhpParser\Node\Expr\Empty_ + || $stmt instanceof PhpParser\Node\Expr\Isset_ + || $stmt instanceof PhpParser\Node\Expr\FuncCall) + ) { + $assertions = $statements_analyzer->node_data->getAssertions($stmt); + + if ($assertions === null) { + $negate = $context->inside_negation; + + while ($stmt instanceof PhpParser\Node\Expr\BooleanNot) { + $stmt = $stmt->expr; + $negate = !$negate; + } + + AssertionFinder::scrapeAssertions( + $stmt, + $context->self, + $statements_analyzer, + $codebase, + $negate, + true, + false + ); + } + } + + $event = new AfterExpressionAnalysisEvent( + $stmt, + $context, + $statements_analyzer, + $codebase, + [] + ); + + if ($codebase->config->eventDispatcher->dispatchAfterExpressionAnalysis($event) === false) { + return false; + } + + $file_manipulations = $event->getFileReplacements(); + + if ($file_manipulations) { + FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); + } + + return true; + } + + private static function handleExpression( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $stmt, + Context $context, + bool $array_assignment, + ?Context $global_context, + bool $from_stmt + ): bool { + if ($stmt instanceof PhpParser\Node\Expr\Variable) { + return VariableFetchAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context, + false, + null, + $array_assignment + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\Assign) { + $assignment_type = AssignmentAnalyzer::analyze( + $statements_analyzer, + $stmt->var, + $stmt->expr, + null, + $context, + $stmt->getDocComment() + ); + + if ($assignment_type === false) { + return false; + } + + if (!$from_stmt) { + $statements_analyzer->node_data->setType($stmt, $assignment_type); + } + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\AssignOp) { + return AssignmentAnalyzer::analyzeAssignmentOperation($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\MethodCall) { + return MethodCallAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\StaticCall) { + return StaticCallAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\ConstFetch) { + ConstFetchAnalyzer::analyze($statements_analyzer, $stmt, $context); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Scalar\String_) { + $statements_analyzer->node_data->setType($stmt, Type::getString($stmt->value)); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Scalar\EncapsedStringPart) { + return true; + } + + if ($stmt instanceof PhpParser\Node\Scalar\MagicConst) { + MagicConstAnalyzer::analyze($statements_analyzer, $stmt, $context); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Scalar\LNumber) { + $statements_analyzer->node_data->setType($stmt, Type::getInt(false, $stmt->value)); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Scalar\DNumber) { + $statements_analyzer->node_data->setType($stmt, Type::getFloat($stmt->value)); + + return true; + } + + + if ($stmt instanceof PhpParser\Node\Expr\UnaryMinus || $stmt instanceof PhpParser\Node\Expr\UnaryPlus) { + return UnaryPlusMinusAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\Isset_) { + IssetAnalyzer::analyze($statements_analyzer, $stmt, $context); + $statements_analyzer->node_data->setType($stmt, Type::getBool()); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\ClassConstFetch) { + return ClassConstFetchAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\PropertyFetch) { + return InstancePropertyFetchAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context, + $array_assignment + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\StaticPropertyFetch) { + return StaticPropertyFetchAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\BitwiseNot) { + return BitwiseNotAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) { + return BinaryOpAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context, + 0, + $from_stmt + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\PostInc + || $stmt instanceof PhpParser\Node\Expr\PostDec + || $stmt instanceof PhpParser\Node\Expr\PreInc + || $stmt instanceof PhpParser\Node\Expr\PreDec + ) { + return IncDecExpressionAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\New_) { + return NewAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\Array_) { + return ArrayAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Scalar\Encapsed) { + return EncapsulatedStringAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\FuncCall) { + return FunctionCallAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\Ternary) { + return TernaryAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\BooleanNot) { + return BooleanNotAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\Empty_) { + EmptyAnalyzer::analyze($statements_analyzer, $stmt, $context); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\Closure + || $stmt instanceof PhpParser\Node\Expr\ArrowFunction + ) { + return ClosureAnalyzer::analyzeExpression($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) { + return ArrayFetchAnalyzer::analyze( + $statements_analyzer, + $stmt, + $context + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\Cast) { + return CastAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\Clone_) { + return CloneAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\Instanceof_) { + return InstanceofAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\Exit_) { + return ExitAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\Include_) { + return IncludeAnalyzer::analyze($statements_analyzer, $stmt, $context, $global_context); + } + + if ($stmt instanceof PhpParser\Node\Expr\Eval_) { + EvalAnalyzer::analyze($statements_analyzer, $stmt, $context); + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\AssignRef) { + return AssignmentAnalyzer::analyzeAssignmentRef($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\ErrorSuppress) { + $context->error_suppressing = true; + if (self::analyze($statements_analyzer, $stmt->expr, $context) === false) { + return false; + } + $context->error_suppressing = false; + + $expr_type = $statements_analyzer->node_data->getType($stmt->expr); + + if ($expr_type) { + $statements_analyzer->node_data->setType($stmt, $expr_type); + } + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\ShellExec) { + if ($statements_analyzer->data_flow_graph) { + $call_location = new CodeLocation($statements_analyzer->getSource(), $stmt); + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { + $sink = TaintSink::getForMethodArgument( + 'shell_exec', + 'shell_exec', + 0, + null, + $call_location + ); + + $sink->taints = [TaintKind::INPUT_SHELL]; + + $statements_analyzer->data_flow_graph->addSink($sink); + } + + foreach ($stmt->parts as $part) { + if ($part instanceof PhpParser\Node\Expr\Variable) { + if (self::analyze($statements_analyzer, $part, $context) === false) { + break; + } + + $expr_type = $statements_analyzer->node_data->getType($part); + if ($expr_type === null) { + break; + } + + $shell_exec_param = new FunctionLikeParameter( + 'var', + false + ); + + if (ArgumentAnalyzer::verifyType( + $statements_analyzer, + $expr_type, + Type::getString(), + null, + 'shell_exec', + null, + 0, + $call_location, + $stmt, + $context, + $shell_exec_param, + false, + null, + true, + true, + new CodeLocation($statements_analyzer, $stmt) + ) === false) { + return false; + } + + foreach ($expr_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use' + ); + } + } + } + } + + IssueBuffer::maybeAdd( + new ForbiddenCode( + 'Use of shell_exec', + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\Print_) { + $was_inside_call = $context->inside_call; + $context->inside_call = true; + if (PrintAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { + $context->inside_call = $was_inside_call; + + return false; + } + $context->inside_call = $was_inside_call; + + return true; + } + + if ($stmt instanceof PhpParser\Node\Expr\Yield_) { + return YieldAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\YieldFrom) { + return YieldFromAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + $php_major_version = $statements_analyzer->getCodebase()->php_major_version; + $php_minor_version = $statements_analyzer->getCodebase()->php_minor_version; + + if ($stmt instanceof PhpParser\Node\Expr\Match_ && $php_major_version >= 8) { + return MatchAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\Throw_ && $php_major_version >= 8) { + return ThrowAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if (($stmt instanceof PhpParser\Node\Expr\NullsafePropertyFetch + || $stmt instanceof PhpParser\Node\Expr\NullsafeMethodCall) + && $php_major_version >= 8 + ) { + return NullsafeAnalyzer::analyze($statements_analyzer, $stmt, $context); + } + + if ($stmt instanceof PhpParser\Node\Expr\Error) { + // do nothing + return true; + } + + if (IssueBuffer::accepts( + new UnrecognizedExpression( + 'Psalm does not understand ' . get_class($stmt) . ' for PHP ' . + $php_major_version . ' ' . $php_minor_version, + new CodeLocation($statements_analyzer->getSource(), $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + // fall through + } + + return false; + } + + public static function isMock(string $fq_class_name): bool + { + return in_array(strtolower($fq_class_name), Config::getInstance()->getMockClasses(), true); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php new file mode 100644 index 00000000..c716bc2b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php @@ -0,0 +1,83 @@ +collect_initializations && !$global_context) { + IssueBuffer::maybeAdd( + new InvalidGlobal( + 'Cannot use global scope here', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSource()->getSuppressedIssues() + ); + } + + $source = $statements_analyzer->getSource(); + $function_storage = $source instanceof FunctionLikeAnalyzer + ? $source->getFunctionLikeStorage($statements_analyzer) + : null; + + foreach ($stmt->vars as $var) { + if ($var instanceof PhpParser\Node\Expr\Variable) { + if (is_string($var->name)) { + $var_id = '$' . $var->name; + + if ($var->name === 'argv' || $var->name === 'argc') { + $context->vars_in_scope[$var_id] = VariableFetchAnalyzer::getGlobalType($var_id); + } elseif (isset($function_storage->global_types[$var_id])) { + $context->vars_in_scope[$var_id] = clone $function_storage->global_types[$var_id]; + $context->vars_possibly_in_scope[$var_id] = true; + } else { + $context->vars_in_scope[$var_id] = + $global_context && $global_context->hasVariable($var_id) + ? clone $global_context->vars_in_scope[$var_id] + : VariableFetchAnalyzer::getGlobalType($var_id); + + $context->vars_possibly_in_scope[$var_id] = true; + + $context->byref_constraints[$var_id] = new ReferenceConstraint(); + } + $assignment_node = DataFlowNode::getForAssignment( + $var_id, + new CodeLocation($statements_analyzer, $var) + ); + $context->vars_in_scope[$var_id]->parent_nodes = [ + $assignment_node->id => $assignment_node, + ]; + $context->vars_from_global[$var_id] = true; + $statements_analyzer->registerVariable( + $var_id, + new CodeLocation($statements_analyzer, $var), + $context->branch_point + ); + $statements_analyzer->getCodebase()->analyzer->addNodeReference( + $statements_analyzer->getFilePath(), + $var, + $var_id + ); + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php new file mode 100644 index 00000000..79832cc9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php @@ -0,0 +1,658 @@ +getDocComment(); + + $var_comments = []; + $var_comment_type = null; + + $source = $statements_analyzer->getSource(); + + $codebase = $statements_analyzer->getCodebase(); + + if ($doc_comment && ($parsed_docblock = $statements_analyzer->getParsedDocblock())) { + $file_storage_provider = $codebase->file_storage_provider; + + $file_storage = $file_storage_provider->get($statements_analyzer->getFilePath()); + + try { + $var_comments = $codebase->config->disable_var_parsing + ? [] + : CommentAnalyzer::arrayToDocblocks( + $doc_comment, + $parsed_docblock, + $statements_analyzer->getSource(), + $statements_analyzer->getAliases(), + $statements_analyzer->getTemplateTypeMap(), + $file_storage->type_aliases + ); + } catch (DocblockParseException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($source, $stmt) + ) + ); + } + + foreach ($var_comments as $var_comment) { + if (!$var_comment->type) { + continue; + } + + $comment_type = TypeExpander::expandUnion( + $codebase, + $var_comment->type, + $context->self, + $context->self, + $statements_analyzer->getParentFQCLN() + ); + + if ($codebase->alter_code + && $var_comment->type_start + && $var_comment->type_end + && $var_comment->line_number + ) { + $type_location = new DocblockTypeLocation( + $statements_analyzer, + $var_comment->type_start, + $var_comment->type_end, + $var_comment->line_number + ); + + $codebase->classlikes->handleDocblockTypeInMigration( + $codebase, + $statements_analyzer, + $comment_type, + $type_location, + $context->calling_method_id + ); + } + + if (!$var_comment->var_id) { + $var_comment_type = $comment_type; + continue; + } + + if (isset($context->vars_in_scope[$var_comment->var_id])) { + $comment_type->parent_nodes = $context->vars_in_scope[$var_comment->var_id]->parent_nodes; + } + + $context->vars_in_scope[$var_comment->var_id] = $comment_type; + } + } + + if ($stmt->expr) { + $context->inside_return = true; + + if ($stmt->expr instanceof PhpParser\Node\Expr\Closure + || $stmt->expr instanceof PhpParser\Node\Expr\ArrowFunction + ) { + self::potentiallyInferTypesOnClosureFromParentReturnType( + $statements_analyzer, + $stmt->expr, + $context + ); + } + + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + $context->inside_return = false; + return; + } + + $stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr); + + if ($var_comment_type) { + $stmt_type = $var_comment_type; + + if ($stmt_expr_type && $stmt_expr_type->parent_nodes) { + $stmt_type->parent_nodes = $stmt_expr_type->parent_nodes; + } + + $statements_analyzer->node_data->setType($stmt, $var_comment_type); + } elseif ($stmt_expr_type) { + $stmt_type = $stmt_expr_type; + + if ($stmt_type->isNever()) { + IssueBuffer::maybeAdd( + new NoValue( + 'This function or method call never returns output', + new CodeLocation($source, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + + $stmt_type = Type::getEmpty(); + } + + if ($stmt_type->isVoid()) { + $stmt_type = Type::getNull(); + } + } else { + $stmt_type = Type::getMixed(); + } + + $context->inside_return = false; + } else { + $stmt_type = Type::getVoid(); + } + + $statements_analyzer->node_data->setType($stmt, $stmt_type); + + if ($context->finally_scope) { + foreach ($context->vars_in_scope as $var_id => $type) { + if (isset($context->finally_scope->vars_in_scope[$var_id])) { + $context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( + $context->finally_scope->vars_in_scope[$var_id], + $type, + $statements_analyzer->getCodebase() + ); + } else { + $context->finally_scope->vars_in_scope[$var_id] = $type; + $type->possibly_undefined = true; + $type->possibly_undefined_from_try = true; + } + } + } + + if ($source instanceof FunctionLikeAnalyzer + && !($source->getSource() instanceof TraitAnalyzer) + ) { + $source->addReturnTypes($context); + + $source->examineParamTypes($statements_analyzer, $context, $codebase, $stmt); + + $storage = $source->getFunctionLikeStorage($statements_analyzer); + + $cased_method_id = $source->getCorrectlyCasedMethodId(); + + if ($stmt->expr && $storage->location) { + $inferred_type = TypeExpander::expandUnion( + $codebase, + $stmt_type, + $source->getFQCLN(), + $source->getFQCLN(), + $source->getParentFQCLN() + ); + + if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { + self::handleTaints( + $statements_analyzer, + $stmt, + $cased_method_id, + $inferred_type, + $storage + ); + } + + if ($storage instanceof MethodStorage && $context->self) { + $self_class = $context->self; + + $declared_return_type = $codebase->methods->getMethodReturnType( + MethodIdentifier::wrap($cased_method_id), + $self_class, + $statements_analyzer, + null + ); + } else { + $declared_return_type = $storage->return_type; + } + + if ($declared_return_type && !$declared_return_type->hasMixed()) { + $local_return_type = $source->getLocalReturnType( + $declared_return_type, + $storage instanceof MethodStorage && $storage->final + ); + + if ($storage instanceof MethodStorage) { + [$fq_class_name, $method_name] = explode('::', $cased_method_id); + + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); + + $found_generic_params = ClassTemplateParamCollector::collect( + $codebase, + $class_storage, + $class_storage, + strtolower($method_name), + null, + true + ); + + if ($found_generic_params) { + foreach ($found_generic_params as $template_name => $_) { + unset($found_generic_params[$template_name][$fq_class_name]); + } + + $local_return_type = clone $local_return_type; + + TemplateInferredTypeReplacer::replace( + $local_return_type, + new TemplateResult([], $found_generic_params), + $codebase + ); + } + } + + if ($local_return_type->isGenerator() && $storage->has_yield) { + return; + } + + if ($stmt_type->hasMixed()) { + if ($local_return_type->isVoid() || $local_return_type->isNever()) { + if (IssueBuffer::accepts( + new InvalidReturnStatement( + 'No return values are expected for ' . $cased_method_id, + new CodeLocation($source, $stmt->expr) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return; + } + } + + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && !($source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); + } + + if ($stmt_type->isMixed()) { + $origin_locations = []; + + if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { + foreach ($stmt_type->parent_nodes as $parent_node) { + $origin_locations = array_merge( + $origin_locations, + $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) + ); + } + } + + $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; + + $return_location = new CodeLocation($source, $stmt->expr); + + if ($origin_location && $origin_location->getHash() === $return_location->getHash()) { + $origin_location = null; + } + + IssueBuffer::maybeAdd( + new MixedReturnStatement( + 'Could not infer a return type', + $return_location, + $origin_location + ), + $statements_analyzer->getSuppressedIssues() + ); + + return; + } + + IssueBuffer::maybeAdd( + new MixedReturnStatement( + 'Possibly-mixed return value', + new CodeLocation($source, $stmt->expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if ($local_return_type->isMixed()) { + return; + } + + if (!$context->collect_initializations + && !$context->collect_mutations + && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() + && !($source->getSource() instanceof TraitAnalyzer) + ) { + $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); + } + + if ($local_return_type->isVoid()) { + if (IssueBuffer::accepts( + new InvalidReturnStatement( + 'No return values are expected for ' . $cased_method_id, + new CodeLocation($source, $stmt->expr) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return; + } + + return; + } + + $union_comparison_results = new TypeComparisonResult(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $inferred_type, + $local_return_type, + true, + true, + $union_comparison_results + ) + ) { + // is the declared return type more specific than the inferred one? + if ($union_comparison_results->type_coerced) { + if ($union_comparison_results->type_coerced_from_mixed) { + if (!$union_comparison_results->type_coerced_from_as_mixed) { + if ($inferred_type->hasMixed()) { + IssueBuffer::maybeAdd( + new MixedReturnStatement( + 'Could not infer a return type', + new CodeLocation($source, $stmt->expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new MixedReturnTypeCoercion( + 'The type \'' . $stmt_type->getId() . '\' is more general than the' + . ' declared return type \'' . $local_return_type->getId() . '\'' + . ' for ' . $cased_method_id, + new CodeLocation($source, $stmt->expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } else { + IssueBuffer::maybeAdd( + new LessSpecificReturnStatement( + 'The type \'' . $stmt_type->getId() . '\' is more general than the' + . ' declared return type \'' . $local_return_type->getId() . '\'' + . ' for ' . $cased_method_id, + new CodeLocation($source, $stmt->expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + foreach ($local_return_type->getAtomicTypes() as $local_type_part) { + if ($local_type_part instanceof TClassString + && $stmt->expr instanceof PhpParser\Node\Scalar\String_ + ) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $stmt->expr->value, + new CodeLocation($source, $stmt->expr), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions(true) + ) === false + ) { + return; + } + } elseif ($local_type_part instanceof TArray + && $stmt->expr instanceof PhpParser\Node\Expr\Array_ + ) { + $value_param = $local_type_part->type_params[1]; + + foreach ($value_param->getAtomicTypes() as $local_array_type_part) { + if ($local_array_type_part instanceof TClassString) { + foreach ($stmt->expr->items as $item) { + if ($item && $item->value instanceof PhpParser\Node\Scalar\String_) { + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $statements_analyzer, + $item->value->value, + new CodeLocation($source, $item->value), + $context->self, + $context->calling_method_id, + $statements_analyzer->getSuppressedIssues(), + new ClassLikeNameOptions(true) + ) === false + ) { + return; + } + } + } + } + } + } + } + } else { + IssueBuffer::maybeAdd( + new InvalidReturnStatement( + 'The inferred type \'' . $inferred_type->getId() + . '\' does not match the declared return ' + . 'type \'' . $local_return_type->getId() . '\' for ' . $cased_method_id, + new CodeLocation($source, $stmt->expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + if (!$stmt_type->ignore_nullable_issues + && $inferred_type->isNullable() + && !$local_return_type->isNullable() + && !$local_return_type->hasTemplate() + ) { + IssueBuffer::maybeAdd( + new NullableReturnStatement( + 'The declared return type \'' . $local_return_type->getId() . '\' for ' + . $cased_method_id . ' is not nullable, but the function returns \'' + . $inferred_type->getId() . '\'', + new CodeLocation($source, $stmt->expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + if (!$stmt_type->ignore_falsable_issues + && $inferred_type->isFalsable() + && !$local_return_type->isFalsable() + && (!$local_return_type->hasBool() || $local_return_type->isTrue()) + && !$local_return_type->hasScalar() + ) { + IssueBuffer::maybeAdd( + new FalsableReturnStatement( + 'The declared return type \'' . $local_return_type . '\' for ' + . $cased_method_id . ' does not allow false, but the function returns \'' + . $inferred_type . '\'', + new CodeLocation($source, $stmt->expr) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } else { + if ($storage->signature_return_type + && !$storage->signature_return_type->isVoid() + && !$storage->has_yield + ) { + IssueBuffer::maybeAdd( + new InvalidReturnStatement( + 'Empty return statement is not expected in ' . $cased_method_id, + new CodeLocation($source, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + } + } + + private static function handleTaints( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Stmt\Return_ $stmt, + string $cased_method_id, + Union $inferred_type, + FunctionLikeStorage $storage + ): void { + if (!$statements_analyzer->data_flow_graph instanceof TaintFlowGraph + || !$stmt->expr + || !$storage->location + ) { + return; + } + + $method_node = DataFlowNode::getForMethodReturn( + strtolower($cased_method_id), + $cased_method_id, + $storage->signature_return_type_location ?: $storage->location + ); + + $statements_analyzer->data_flow_graph->addNode($method_node); + + if ($inferred_type->parent_nodes) { + foreach ($inferred_type->parent_nodes as $parent_node) { + $statements_analyzer->data_flow_graph->addPath( + $parent_node, + $method_node, + 'return', + $storage->added_taints, + $storage->removed_taints + ); + } + } + } + + /** + * If a function returns a closure, we try to infer the param/return types of + * the inner closure. + * @see \Psalm\Tests\ReturnTypeTest:756 + * @param PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\ArrowFunction $expr + */ + private static function potentiallyInferTypesOnClosureFromParentReturnType( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\FunctionLike $expr, + Context $context + ): void { + // if not returning from inside of a function, return + if (!$context->calling_method_id && !$context->calling_function_id) { + return; + } + + $closure_id = (new ClosureAnalyzer($expr, $statements_analyzer))->getClosureId(); + $closure_storage = $statements_analyzer + ->getCodebase() + ->getFunctionLikeStorage($statements_analyzer, $closure_id); + + $parent_fn_storage = $statements_analyzer + ->getCodebase() + ->getFunctionLikeStorage( + $statements_analyzer, + $context->calling_function_id ?: $context->calling_method_id + ); + + if ($parent_fn_storage->return_type === null) { + return; + } + + // can't infer returned closure if the parent doesn't have a callable return type + if (!$parent_fn_storage->return_type->hasCallableType()) { + return; + } + + // cannot infer if we have union/intersection types + if (!$parent_fn_storage->return_type->isSingle()) { + return; + } + + /** @var TClosure|TCallable $parent_callable_return_type */ + $parent_callable_return_type = $parent_fn_storage->return_type->getSingleAtomic(); + + if ($parent_callable_return_type->params === null && $parent_callable_return_type->return_type === null) { + return; + } + + foreach ($closure_storage->params as $key => $param) { + $parent_param = $parent_callable_return_type->params[$key] ?? null; + $param->type = self::inferInnerClosureTypeFromParent( + $statements_analyzer->getCodebase(), + $param->type, + $parent_param->type ?? null + ); + } + + $closure_storage->return_type = self::inferInnerClosureTypeFromParent( + $statements_analyzer->getCodebase(), + $closure_storage->return_type, + $parent_callable_return_type->return_type + ); + } + + /** + * - If non parent type, do nothing + * - If no return type, infer from parent + * - If parent return type is more specific, infer from parent + * - else, do nothing + */ + private static function inferInnerClosureTypeFromParent( + Codebase $codebase, + ?Union $return_type, + ?Union $parent_return_type + ): ?Union { + if (!$parent_return_type) { + return $return_type; + } + if (!$return_type || UnionTypeComparator::isContainedBy($codebase, $parent_return_type, $return_type)) { + return $parent_return_type; + } + return $return_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php new file mode 100644 index 00000000..12d068d5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php @@ -0,0 +1,188 @@ +getCodebase(); + + if ($context->mutation_free) { + IssueBuffer::maybeAdd( + new ImpureStaticVariable( + 'Cannot use a static variable in a mutation-free context', + new CodeLocation($statements_analyzer, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + + foreach ($stmt->vars as $var) { + if (!is_string($var->var->name)) { + continue; + } + + $var_id = '$' . $var->var->name; + + $doc_comment = $stmt->getDocComment(); + + $comment_type = null; + + if ($doc_comment && ($parsed_docblock = $statements_analyzer->getParsedDocblock())) { + $var_comments = []; + + try { + $var_comments = $codebase->config->disable_var_parsing + ? [] + : CommentAnalyzer::arrayToDocblocks( + $doc_comment, + $parsed_docblock, + $statements_analyzer->getSource(), + $statements_analyzer->getSource()->getAliases(), + $statements_analyzer->getSource()->getTemplateTypeMap() + ); + } catch (IncorrectDocblockException $e) { + IssueBuffer::maybeAdd( + new MissingDocblockType( + $e->getMessage(), + new CodeLocation($statements_analyzer, $var) + ) + ); + } catch (DocblockParseException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($statements_analyzer->getSource(), $var) + ) + ); + } + + foreach ($var_comments as $var_comment) { + if (!$var_comment->type) { + continue; + } + + try { + $var_comment_type = TypeExpander::expandUnion( + $codebase, + $var_comment->type, + $context->self, + $context->self, + $statements_analyzer->getParentFQCLN() + ); + + $var_comment_type->setFromDocblock(); + + $var_comment_type->check( + $statements_analyzer, + new CodeLocation($statements_analyzer->getSource(), $var), + $statements_analyzer->getSuppressedIssues() + ); + + if ($codebase->alter_code + && $var_comment->type_start + && $var_comment->type_end + && $var_comment->line_number + ) { + $type_location = new DocblockTypeLocation( + $statements_analyzer, + $var_comment->type_start, + $var_comment->type_end, + $var_comment->line_number + ); + + $codebase->classlikes->handleDocblockTypeInMigration( + $codebase, + $statements_analyzer, + $var_comment_type, + $type_location, + $context->calling_method_id + ); + } + + if (!$var_comment->var_id || $var_comment->var_id === $var_id) { + $comment_type = $var_comment_type; + continue; + } + + $context->vars_in_scope[$var_comment->var_id] = $var_comment_type; + } catch (UnexpectedValueException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($statements_analyzer, $var) + ) + ); + } + } + + if ($comment_type) { + $context->byref_constraints[$var_id] = new ReferenceConstraint($comment_type); + } + } + + if ($var->default) { + if (ExpressionAnalyzer::analyze($statements_analyzer, $var->default, $context) === false) { + return; + } + + if ($comment_type + && ($var_default_type = $statements_analyzer->node_data->getType($var->default)) + && !UnionTypeComparator::isContainedBy( + $codebase, + $var_default_type, + $comment_type + ) + ) { + IssueBuffer::maybeAdd( + new ReferenceConstraintViolation( + $var_id . ' of type ' . $comment_type->getId() . ' cannot be assigned type ' + . $var_default_type->getId(), + new CodeLocation($statements_analyzer, $var) + ) + ); + } + } + + if ($context->check_variables) { + $context->vars_in_scope[$var_id] = $comment_type ? clone $comment_type : Type::getMixed(); + $context->vars_possibly_in_scope[$var_id] = true; + $context->assigned_var_ids[$var_id] = (int) $stmt->getAttribute('startFilePos'); + $statements_analyzer->byref_uses[$var_id] = true; + + $location = new CodeLocation($statements_analyzer, $var); + + $statements_analyzer->registerVariable( + $var_id, + $location, + $context->branch_point + ); + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php new file mode 100644 index 00000000..665a1c40 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php @@ -0,0 +1,93 @@ +inside_throw = true; + if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { + return false; + } + $context->inside_throw = false; + + if ($context->finally_scope) { + foreach ($context->vars_in_scope as $var_id => $type) { + if (isset($context->finally_scope->vars_in_scope[$var_id])) { + $context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( + $context->finally_scope->vars_in_scope[$var_id], + $type, + $statements_analyzer->getCodebase() + ); + } else { + $context->finally_scope->vars_in_scope[$var_id] = $type; + $type->possibly_undefined = true; + $type->possibly_undefined_from_try = true; + } + } + } + + if ($context->check_classes + && ($throw_type = $statements_analyzer->node_data->getType($stmt->expr)) + && !$throw_type->hasMixed() + ) { + $exception_type = new Union([new TNamedObject('Exception'), new TNamedObject('Throwable')]); + + $file_analyzer = $statements_analyzer->getFileAnalyzer(); + $codebase = $statements_analyzer->getCodebase(); + + foreach ($throw_type->getAtomicTypes() as $throw_type_part) { + $throw_type_candidate = new Union([$throw_type_part]); + + if (!UnionTypeComparator::isContainedBy($codebase, $throw_type_candidate, $exception_type)) { + if (IssueBuffer::accepts( + new InvalidThrow( + 'Cannot throw ' . $throw_type_part + . ' as it does not extend Exception or implement Throwable', + new CodeLocation($file_analyzer, $stmt), + (string) $throw_type_part + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } elseif (!$context->isSuppressingExceptions($statements_analyzer)) { + $codelocation = new CodeLocation($file_analyzer, $stmt); + $hash = $codelocation->getHash(); + foreach ($throw_type->getAtomicTypes() as $throw_atomic_type) { + if ($throw_atomic_type instanceof TNamedObject) { + $context->possibly_thrown_exceptions[$throw_atomic_type->value][$hash] = $codelocation; + } + } + } + } + } + + if ($stmt instanceof PhpParser\Node\Expr\Throw_) { + $statements_analyzer->node_data->setType($stmt, Type::getEmpty()); + } + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php new file mode 100644 index 00000000..c7cfeb6d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php @@ -0,0 +1,138 @@ +inside_unset = true; + + foreach ($stmt->vars as $var) { + $was_inside_general_use = $context->inside_general_use; + $context->inside_general_use = true; + + ExpressionAnalyzer::analyze($statements_analyzer, $var, $context); + + $context->inside_general_use = $was_inside_general_use; + + $var_id = ExpressionIdentifier::getArrayVarId( + $var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($var_id) { + $context->remove($var_id); + } + + if ($var instanceof PhpParser\Node\Expr\ArrayDimFetch && $var->dim) { + $root_var_id = ExpressionIdentifier::getArrayVarId( + $var->var, + $statements_analyzer->getFQCLN(), + $statements_analyzer + ); + + if ($root_var_id && isset($context->vars_in_scope[$root_var_id])) { + $root_type = clone $context->vars_in_scope[$root_var_id]; + + foreach ($root_type->getAtomicTypes() as $atomic_root_type) { + if ($atomic_root_type instanceof TKeyedArray) { + if ($var->dim instanceof PhpParser\Node\Scalar\String_ + || $var->dim instanceof PhpParser\Node\Scalar\LNumber + ) { + if (isset($atomic_root_type->properties[$var->dim->value])) { + if ($atomic_root_type->is_list + && $var->dim->value !== count($atomic_root_type->properties)-1 + ) { + $atomic_root_type->is_list = false; + } + unset($atomic_root_type->properties[$var->dim->value]); + $root_type->bustCache(); //remove id cache + } + + if (!$atomic_root_type->properties) { + if ($atomic_root_type->previous_value_type) { + $root_type->addType( + new TArray([ + $atomic_root_type->previous_key_type + ? clone $atomic_root_type->previous_key_type + : new Union([new TArrayKey]), + clone $atomic_root_type->previous_value_type, + ]) + ); + } else { + $root_type->addType( + new TArray([ + new Union([new TEmpty]), + new Union([new TEmpty]), + ]) + ); + } + } + } else { + foreach ($atomic_root_type->properties as $key => $type) { + $atomic_root_type->properties[$key] = clone $type; + $atomic_root_type->properties[$key]->possibly_undefined = true; + } + + $atomic_root_type->sealed = false; + + $root_type->addType( + $atomic_root_type->getGenericArrayType(false) + ); + + $atomic_root_type->is_list = false; + } + } elseif ($atomic_root_type instanceof TNonEmptyArray) { + $root_type->addType( + new TArray($atomic_root_type->type_params) + ); + } elseif ($atomic_root_type instanceof TNonEmptyMixed) { + $root_type->addType( + new TMixed() + ); + } elseif ($atomic_root_type instanceof TList) { + $root_type->addType( + new TArray([ + Type::getInt(), + $atomic_root_type->type_param + ]) + ); + } + } + + $context->vars_in_scope[$root_var_id] = $root_type; + + $context->removeVarFromConflictingClauses( + $root_var_id, + $context->vars_in_scope[$root_var_id], + $statements_analyzer + ); + } + } + } + + $context->inside_unset = false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php new file mode 100644 index 00000000..30c01b4e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php @@ -0,0 +1,357 @@ + + */ + private $removed_unref_vars = []; + + /** + * @param array $stmts + * @param array $var_loc_map + * + */ + public function findUnusedAssignment( + Codebase $codebase, + array $stmts, + array $var_loc_map, + string $var_id, + CodeLocation $original_location + ): void { + $search_result = $this->findAssignStmt($stmts, $var_id, $original_location); + [$assign_stmt, $assign_exp] = $search_result; + $chain_assignment = false; + + if ($assign_stmt !== null && $assign_exp !== null) { + // Check if we have to remove assignment statement as expression (i.e. just "$var = ") + + // Consider chain of assignments + $rhs_exp = $assign_exp->expr; + if ($rhs_exp instanceof PhpParser\Node\Expr\Assign + || $rhs_exp instanceof PhpParser\Node\Expr\AssignOp + || $rhs_exp instanceof PhpParser\Node\Expr\AssignRef + ) { + $chain_assignment = true; + $removable_stmt = $this->checkRemovableChainAssignment($assign_exp, $var_loc_map); + } else { + $removable_stmt = true; + } + + if ($removable_stmt) { + $traverser = new PhpParser\NodeTraverser(); + $visitor = new CheckTrivialExprVisitor(); + $traverser->addVisitor($visitor); + $traverser->traverse([$rhs_exp]); + + $rhs_exp_trivial = (count($visitor->getNonTrivialExpr()) === 0); + + if ($rhs_exp_trivial) { + $treat_as_expr = false; + } else { + $treat_as_expr = true; + } + } else { + $treat_as_expr = true; + } + + if ($treat_as_expr) { + $is_assign_ref = $assign_exp instanceof PhpParser\Node\Expr\AssignRef; + $new_file_manipulation = self::getPartialRemovalBounds( + $codebase, + $original_location, + $assign_stmt->getEndFilePos(), + $is_assign_ref + ); + $this->removed_unref_vars[$var_id] = $original_location; + } else { + // Remove whole assignment statement + $new_file_manipulation = new FileManipulation( + $assign_stmt->getStartFilePos(), + $assign_stmt->getEndFilePos() + 1, + "", + false, + true + ); + + // If statement we are removing is a chain of assignments, mark other variables as removed + if ($chain_assignment) { + $this->markRemovedChainAssignVar($assign_exp, $var_loc_map); + } else { + $this->removed_unref_vars[$var_id] = $original_location; + } + } + + FileManipulationBuffer::add($original_location->file_path, [$new_file_manipulation]); + } elseif ($assign_exp !== null) { + $is_assign_ref = $assign_exp instanceof PhpParser\Node\Expr\AssignRef; + $new_file_manipulation = self::getPartialRemovalBounds( + $codebase, + $original_location, + $assign_exp->getEndFilePos(), + $is_assign_ref + ); + + FileManipulationBuffer::add($original_location->file_path, [$new_file_manipulation]); + $this->removed_unref_vars[$var_id] = $original_location; + } + } + + private static function getPartialRemovalBounds( + Codebase $codebase, + CodeLocation $var_loc, + int $end_bound, + bool $assign_ref = false + ): FileManipulation { + $var_start_loc= $var_loc->raw_file_start; + $stmt_content = $codebase->file_provider->getContents( + $var_loc->file_path + ); + $str_for_token = " $var_loc_map + */ + private function markRemovedChainAssignVar(PhpParser\Node\Expr $cur_assign, array $var_loc_map): void + { + $var = $cur_assign->var; + if ($var instanceof PhpParser\Node\Expr\Variable && is_string($var->name)) { + $var_name = "$" . $var->name; + $var_loc = $var_loc_map[$var_name]; + $this->removed_unref_vars[$var_name] = $var_loc; + + $rhs_exp = $cur_assign->expr; + if ($rhs_exp instanceof PhpParser\Node\Expr\Assign + || $rhs_exp instanceof PhpParser\Node\Expr\AssignOp + || $rhs_exp instanceof PhpParser\Node\Expr\AssignRef + ) { + $this->markRemovedChainAssignVar($rhs_exp, $var_loc_map); + } + } + } + + /** + * @param PhpParser\Node\Expr\Assign|PhpParser\Node\Expr\AssignOp|PhpParser\Node\Expr\AssignRef $cur_assign + * @param array $var_loc_map + */ + private function checkRemovableChainAssignment(PhpParser\Node\Expr $cur_assign, array $var_loc_map): bool + { + // Check if current assignment expr's variable is removable + $var = $cur_assign->var; + if ($var instanceof PhpParser\Node\Expr\Variable && is_string($var->name)) { + $var_loc = $cur_assign->var->getStartFilePos(); + $var_name = "$" . $var->name; + + if (array_key_exists($var_name, $var_loc_map) && + $var_loc_map[$var_name]->raw_file_start === $var_loc) { + $curr_removable = true; + } else { + $curr_removable = false; + } + + if ($curr_removable) { + $rhs_exp = $cur_assign->expr; + + if ($rhs_exp instanceof PhpParser\Node\Expr\Assign + || $rhs_exp instanceof PhpParser\Node\Expr\AssignOp + || $rhs_exp instanceof PhpParser\Node\Expr\AssignRef + ) { + return $this->checkRemovableChainAssignment($rhs_exp, $var_loc_map); + } + } + return $curr_removable; + } + + return false; + } + + /** + * @param array $stmts + * @return array{ + * 0: PhpParser\Node\Stmt|null, + * 1: PhpParser\Node\Expr\Assign|PhpParser\Node\Expr\AssignOp|PhpParser\Node\Expr\AssignRef|null + * } + */ + private function findAssignStmt(array $stmts, string $var_id, CodeLocation $original_location): array + { + $assign_stmt = null; + $assign_exp = null; + $assign_exp_found = false; + + $i = 0; + + while ($i < count($stmts) && !$assign_exp_found) { + $stmt = $stmts[$i]; + if ($stmt instanceof PhpParser\Node\Stmt\Expression) { + $search_result = $this->findAssignExp($stmt->expr, $var_id, $original_location->raw_file_start); + + [$target_exp, $levels_taken] = $search_result; + + if ($target_exp !== null) { + $assign_exp_found = true; + $assign_exp = $target_exp; + $assign_stmt = $levels_taken === 1 ? $stmt : null; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\TryCatch) { + $search_result = $this->findAssignStmt($stmt->stmts, $var_id, $original_location); + + if ($search_result[0] && $search_result[1]) { + return $search_result; + } + + foreach ($stmt->catches as $catch_stmt) { + $search_result = $this->findAssignStmt($catch_stmt->stmts, $var_id, $original_location); + + if ($search_result[0] && $search_result[1]) { + return $search_result; + } + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Do_ + || $stmt instanceof PhpParser\Node\Stmt\While_ + ) { + $search_result = $this->findAssignStmt($stmt->stmts, $var_id, $original_location); + + if ($search_result[0] && $search_result[1]) { + return $search_result; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Foreach_) { + $search_result = $this->findAssignStmt($stmt->stmts, $var_id, $original_location); + + if ($search_result[0] && $search_result[1]) { + return $search_result; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\For_) { + $search_result = $this->findAssignStmt($stmt->stmts, $var_id, $original_location); + + if ($search_result[0] && $search_result[1]) { + return $search_result; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\If_) { + $search_result = $this->findAssignStmt($stmt->stmts, $var_id, $original_location); + + if ($search_result[0] && $search_result[1]) { + return $search_result; + } + + foreach ($stmt->elseifs as $elseif_stmt) { + $search_result = $this->findAssignStmt($elseif_stmt->stmts, $var_id, $original_location); + + if ($search_result[0] && $search_result[1]) { + return $search_result; + } + } + + if ($stmt->else) { + $search_result = $this->findAssignStmt($stmt->else->stmts, $var_id, $original_location); + + if ($search_result[0] && $search_result[1]) { + return $search_result; + } + } + } + + $i++; + } + + return [$assign_stmt, $assign_exp]; + } + + /** + * @return array{ + * 0: PhpParser\Node\Expr\Assign|PhpParser\Node\Expr\AssignOp|PhpParser\Node\Expr\AssignRef|null, + * 1: int + * } + */ + private function findAssignExp( + PhpParser\Node\Expr $current_node, + string $var_id, + int $var_start_loc, + int $search_level = 1 + ): array { + if ($current_node instanceof PhpParser\Node\Expr\Assign + || $current_node instanceof PhpParser\Node\Expr\AssignOp + || $current_node instanceof PhpParser\Node\Expr\AssignRef + ) { + $var = $current_node->var; + + if ($var instanceof PhpParser\Node\Expr\Variable + && $var->name === substr($var_id, 1) + && $var->getStartFilePos() === $var_start_loc + ) { + return [$current_node, $search_level]; + } + + $rhs_exp = $current_node->expr; + $rhs_search_result = $this->findAssignExp($rhs_exp, $var_id, $var_start_loc, $search_level + 1); + return [$rhs_search_result[0], $rhs_search_result[1]]; + } + + return [null, $search_level]; + } + + public function checkIfVarRemoved(string $var_id, CodeLocation $var_loc): bool + { + return array_key_exists($var_id, $this->removed_unref_vars) + && $this->removed_unref_vars[$var_id] === $var_loc; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php new file mode 100644 index 00000000..dff3d60d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php @@ -0,0 +1,1076 @@ + + */ + private $all_vars = []; + + /** + * @var array + */ + private $var_branch_points = []; + + /** + * Possibly undefined variables should be initialised if we're altering code + * + * @var array|null + */ + private $vars_to_initialize; + + /** + * @var array + */ + private $function_analyzers = []; + + /** + * @var array + */ + private $unused_var_locations = []; + + /** + * @var ?array + */ + public $byref_uses; + + /** + * @var ParsedDocblock|null + */ + private $parsed_docblock; + + /** + * @var ?string + */ + private $fake_this_class; + + /** @var NodeDataProvider */ + public $node_data; + + /** @var ?DataFlowGraph */ + public $data_flow_graph; + + /** + * Locations of foreach values + * + * Used to discern ordinary UnusedVariables from UnusedForeachValues + * + * @var array> + * @psalm-internal Psalm\Internal\Analyzer + */ + public $foreach_var_locations = []; + + public function __construct(SourceAnalyzer $source, NodeDataProvider $node_data) + { + $this->source = $source; + $this->file_analyzer = $source->getFileAnalyzer(); + $this->codebase = $source->getCodebase(); + $this->node_data = $node_data; + + if ($this->codebase->taint_flow_graph) { + $this->data_flow_graph = new TaintFlowGraph(); + } elseif ($this->codebase->find_unused_variables) { + $this->data_flow_graph = new VariableUseGraph(); + } + } + + /** + * Checks an array of statements for validity + * + * @param array $stmts + * + * @return null|false + */ + public function analyze( + array $stmts, + Context $context, + ?Context $global_context = null, + bool $root_scope = false + ): ?bool { + if (!$stmts) { + return null; + } + + // hoist functions to the top + $this->hoistFunctions($stmts, $context); + + $project_analyzer = $this->getFileAnalyzer()->project_analyzer; + $codebase = $project_analyzer->getCodebase(); + + if ($codebase->config->hoist_constants) { + self::hoistConstants($this, $stmts, $context); + } + + foreach ($stmts as $stmt) { + if (self::analyzeStatement($this, $stmt, $context, $global_context) === false) { + return false; + } + } + + if ($root_scope + && !$context->collect_initializations + && !$context->collect_mutations + && $codebase->find_unused_variables + && $context->check_variables + ) { + //var_dump($this->data_flow_graph); + $this->checkUnreferencedVars($stmts, $context); + } + + if ($codebase->alter_code && $root_scope && $this->vars_to_initialize) { + $file_contents = $codebase->getFileContents($this->getFilePath()); + + foreach ($this->vars_to_initialize as $var_id => $branch_point) { + $newline_pos = (int)strrpos($file_contents, "\n", $branch_point - strlen($file_contents)) + 1; + $indentation = substr($file_contents, $newline_pos, $branch_point - $newline_pos); + FileManipulationBuffer::add($this->getFilePath(), [ + new FileManipulation($branch_point, $branch_point, $var_id . ' = null;' . "\n" . $indentation), + ]); + } + } + + if ($root_scope + && $this->data_flow_graph instanceof TaintFlowGraph + && $this->codebase->taint_flow_graph + && $codebase->config->trackTaintsInPath($this->getFilePath()) + ) { + $this->codebase->taint_flow_graph->addGraph($this->data_flow_graph); + } + + return null; + } + + /** + * @param array $stmts + */ + private function hoistFunctions(array $stmts, Context $context): void + { + foreach ($stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\Function_) { + $function_name = strtolower($stmt->name->name); + + if ($ns = $this->getNamespace()) { + $fq_function_name = strtolower($ns) . '\\' . $function_name; + } else { + $fq_function_name = $function_name; + } + + if ($this->data_flow_graph + && $this->codebase->find_unused_variables + ) { + foreach ($stmt->stmts as $function_stmt) { + if ($function_stmt instanceof PhpParser\Node\Stmt\Global_) { + foreach ($function_stmt->vars as $var) { + if (!$var instanceof PhpParser\Node\Expr\Variable + || !is_string($var->name) + ) { + continue; + } + + $var_id = '$' . $var->name; + + if ($var_id !== '$argv' && $var_id !== '$argc') { + $context->byref_constraints[$var_id] = new ReferenceConstraint(); + } + } + } + } + } + + try { + $function_analyzer = new FunctionAnalyzer($stmt, $this->source); + $this->function_analyzers[$fq_function_name] = $function_analyzer; + } catch (UnexpectedValueException $e) { + // do nothing + } + } + } + } + + /** + * @param array $stmts + */ + private static function hoistConstants( + StatementsAnalyzer $statements_analyzer, + array $stmts, + Context $context + ): void { + $codebase = $statements_analyzer->getCodebase(); + + foreach ($stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\Const_) { + foreach ($stmt->consts as $const) { + ConstFetchAnalyzer::setConstType( + $statements_analyzer, + $const->name->name, + SimpleTypeInferer::infer( + $codebase, + $statements_analyzer->node_data, + $const->value, + $statements_analyzer->getAliases(), + $statements_analyzer + ) ?? Type::getMixed(), + $context + ); + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Expression + && $stmt->expr instanceof PhpParser\Node\Expr\FuncCall + && $stmt->expr->name instanceof PhpParser\Node\Name + && $stmt->expr->name->parts === ['define'] + && isset($stmt->expr->getArgs()[1]) + ) { + $const_name = ConstFetchAnalyzer::getConstName( + $stmt->expr->getArgs()[0]->value, + $statements_analyzer->node_data, + $codebase, + $statements_analyzer->getAliases() + ); + + if ($const_name !== null) { + ConstFetchAnalyzer::setConstType( + $statements_analyzer, + $const_name, + SimpleTypeInferer::infer( + $codebase, + $statements_analyzer->node_data, + $stmt->expr->getArgs()[1]->value, + $statements_analyzer->getAliases(), + $statements_analyzer + ) ?? Type::getMixed(), + $context + ); + } + } + } + } + + /** + * @return false|null + */ + private static function analyzeStatement( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Stmt $stmt, + Context $context, + ?Context $global_context + ): ?bool { + $ignore_variable_property = false; + $ignore_variable_method = false; + + $codebase = $statements_analyzer->getCodebase(); + + if ($statements_analyzer->getProjectAnalyzer()->debug_lines) { + fwrite(STDERR, $statements_analyzer->getFilePath() . ':' . $stmt->getLine() . "\n"); + } + + $new_issues = null; + $traced_variables = []; + + if ($docblock = $stmt->getDocComment()) { + $statements_analyzer->parseStatementDocblock($docblock, $stmt, $context); + + if (isset($statements_analyzer->parsed_docblock->tags['psalm-trace'])) { + foreach ($statements_analyzer->parsed_docblock->tags['psalm-trace'] as $traced_variable_line) { + $possible_traced_variable_names = preg_split( + '/(?:\s*,\s*|\s+)/', + $traced_variable_line, + -1, + PREG_SPLIT_NO_EMPTY + ); + if ($possible_traced_variable_names) { + $traced_variables = array_merge($traced_variables, $possible_traced_variable_names); + } + } + } + + if (isset($statements_analyzer->parsed_docblock->tags['psalm-ignore-variable-method'])) { + $context->ignore_variable_method = $ignore_variable_method = true; + } + + if (isset($statements_analyzer->parsed_docblock->tags['psalm-ignore-variable-property'])) { + $context->ignore_variable_property = $ignore_variable_property = true; + } + + if (isset($statements_analyzer->parsed_docblock->tags['psalm-suppress'])) { + $suppressed = $statements_analyzer->parsed_docblock->tags['psalm-suppress']; + if ($suppressed) { + $new_issues = []; + + foreach ($suppressed as $offset => $suppress_entry) { + foreach (DocComment::parseSuppressList($suppress_entry) as $issue_offset => $issue_type) { + $new_issues[$issue_offset + $offset] = $issue_type; + } + } + + if ($codebase->track_unused_suppressions + && ( + (count($new_issues) === 1) // UnusedPsalmSuppress by itself should be marked as unused + || !in_array("UnusedPsalmSuppress", $new_issues) + ) + ) { + foreach ($new_issues as $offset => $issue_type) { + if ($issue_type === 'InaccessibleMethod') { + continue; + } + + IssueBuffer::addUnusedSuppression( + $statements_analyzer->getFilePath(), + $offset, + $issue_type + ); + } + } + + $statements_analyzer->addSuppressedIssues($new_issues); + } + } + + if (isset($statements_analyzer->parsed_docblock->combined_tags['var']) + && !($stmt instanceof PhpParser\Node\Stmt\Expression + && $stmt->expr instanceof PhpParser\Node\Expr\Assign) + && !$stmt instanceof PhpParser\Node\Stmt\Foreach_ + && !$stmt instanceof PhpParser\Node\Stmt\Return_ + ) { + $file_path = $statements_analyzer->getRootFilePath(); + + $file_storage_provider = $codebase->file_storage_provider; + + $file_storage = $file_storage_provider->get($file_path); + + $template_type_map = $statements_analyzer->getTemplateTypeMap(); + + $var_comments = []; + + try { + $var_comments = $codebase->config->disable_var_parsing + ? [] + : CommentAnalyzer::arrayToDocblocks( + $docblock, + $statements_analyzer->parsed_docblock, + $statements_analyzer->getSource(), + $statements_analyzer->getAliases(), + $template_type_map, + $file_storage->type_aliases + ); + } catch (IncorrectDocblockException $e) { + IssueBuffer::maybeAdd( + new MissingDocblockType( + $e->getMessage(), + new CodeLocation($statements_analyzer->getSource(), $stmt) + ) + ); + } catch (DocblockParseException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($statements_analyzer->getSource(), $stmt) + ) + ); + } + + foreach ($var_comments as $var_comment) { + AssignmentAnalyzer::assignTypeFromVarDocblock( + $statements_analyzer, + $stmt, + $var_comment, + $context + ); + + if ($var_comment->var_id === '$this' + && $var_comment->type + && $codebase->classExists((string)$var_comment->type) + ) { + $statements_analyzer->setFQCLN((string)$var_comment->type); + } + } + } + } else { + $statements_analyzer->parsed_docblock = null; + } + + if ($context->has_returned + && !$context->collect_initializations + && !$context->collect_mutations + && !($stmt instanceof PhpParser\Node\Stmt\Nop) + && !($stmt instanceof PhpParser\Node\Stmt\Function_) + && !($stmt instanceof PhpParser\Node\Stmt\Class_) + && !($stmt instanceof PhpParser\Node\Stmt\Interface_) + && !($stmt instanceof PhpParser\Node\Stmt\Trait_) + && !($stmt instanceof PhpParser\Node\Stmt\HaltCompiler) + ) { + if ($codebase->find_unused_variables) { + if (IssueBuffer::accepts( + new UnevaluatedCode( + 'Expressions after return/throw/continue', + new CodeLocation($statements_analyzer->source, $stmt) + ), + $statements_analyzer->source->getSuppressedIssues() + )) { + return null; + } + } + + return null; + } + + if ($stmt instanceof PhpParser\Node\Stmt\If_) { + if (IfElseAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { + return false; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\TryCatch) { + if (TryAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { + return false; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\For_) { + if (ForAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { + return false; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Foreach_) { + if (ForeachAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { + return false; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\While_) { + if (WhileAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { + return false; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Do_) { + if (DoAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { + return false; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Const_) { + ConstFetchAnalyzer::analyzeConstAssignment($statements_analyzer, $stmt, $context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Unset_) { + UnsetAnalyzer::analyze($statements_analyzer, $stmt, $context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Return_) { + ReturnAnalyzer::analyze($statements_analyzer, $stmt, $context); + $context->has_returned = true; + } elseif ($stmt instanceof PhpParser\Node\Stmt\Throw_) { + ThrowAnalyzer::analyze($statements_analyzer, $stmt, $context); + $context->has_returned = true; + } elseif ($stmt instanceof PhpParser\Node\Stmt\Switch_) { + SwitchAnalyzer::analyze($statements_analyzer, $stmt, $context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Break_) { + BreakAnalyzer::analyze($statements_analyzer, $stmt, $context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Continue_) { + ContinueAnalyzer::analyze($statements_analyzer, $stmt, $context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Static_) { + StaticAnalyzer::analyze($statements_analyzer, $stmt, $context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Echo_) { + if (EchoAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { + return false; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Function_) { + FunctionAnalyzer::analyzeStatement($statements_analyzer, $stmt, $context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Expression) { + if (ExpressionAnalyzer::analyze( + $statements_analyzer, + $stmt->expr, + $context, + false, + $global_context, + true + ) === false) { + return false; + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\InlineHTML) { + // do nothing + } elseif ($stmt instanceof PhpParser\Node\Stmt\Global_) { + GlobalAnalyzer::analyze($statements_analyzer, $stmt, $context, $global_context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Property) { + InstancePropertyAssignmentAnalyzer::analyzeStatement($statements_analyzer, $stmt, $context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\ClassConst) { + ClassConstFetchAnalyzer::analyzeClassConstAssignment($statements_analyzer, $stmt, $context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Class_) { + try { + $class_analyzer = new ClassAnalyzer( + $stmt, + $statements_analyzer->source, + $stmt->name->name ?? null + ); + + $class_analyzer->analyze(null, $global_context); + } catch (InvalidArgumentException $e) { + // disregard this exception, we'll likely see it elsewhere in the form + // of an issue + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Trait_) { + TraitAnalyzer::analyze($statements_analyzer, $stmt, $context); + } elseif ($stmt instanceof PhpParser\Node\Stmt\Nop) { + // do nothing + } elseif ($stmt instanceof PhpParser\Node\Stmt\Goto_) { + // do nothing + } elseif ($stmt instanceof PhpParser\Node\Stmt\Label) { + // do nothing + } elseif ($stmt instanceof PhpParser\Node\Stmt\Declare_) { + foreach ($stmt->declares as $declaration) { + if ((string) $declaration->key === 'strict_types' + && $declaration->value instanceof PhpParser\Node\Scalar\LNumber + && $declaration->value->value === 1 + ) { + $context->strict_types = true; + } + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\HaltCompiler) { + $context->has_returned = true; + } else { + if (IssueBuffer::accepts( + new UnrecognizedStatement( + 'Psalm does not understand ' . get_class($stmt), + new CodeLocation($statements_analyzer->source, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + )) { + return false; + } + } + + $codebase = $statements_analyzer->getCodebase(); + + $event = new AfterStatementAnalysisEvent( + $stmt, + $context, + $statements_analyzer, + $codebase, + [] + ); + + if ($codebase->config->eventDispatcher->dispatchAfterStatementAnalysis($event) === false) { + return false; + } + + $file_manipulations = $event->getFileReplacements(); + if ($file_manipulations) { + FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); + } + + if ($new_issues) { + $statements_analyzer->removeSuppressedIssues($new_issues); + } + + if ($ignore_variable_property) { + $context->ignore_variable_property = false; + } + + if ($ignore_variable_method) { + $context->ignore_variable_method = false; + } + + foreach ($traced_variables as $traced_variable) { + if (isset($context->vars_in_scope[$traced_variable])) { + IssueBuffer::maybeAdd( + new Trace( + $traced_variable . ': ' . $context->vars_in_scope[$traced_variable]->getId(), + new CodeLocation($statements_analyzer->source, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } else { + IssueBuffer::maybeAdd( + new UndefinedTrace( + 'Attempt to trace undefined variable ' . $traced_variable, + new CodeLocation($statements_analyzer->source, $stmt) + ), + $statements_analyzer->getSuppressedIssues() + ); + } + } + + return null; + } + + private function parseStatementDocblock( + PhpParser\Comment\Doc $docblock, + PhpParser\Node\Stmt $stmt, + Context $context + ): void { + $codebase = $this->getCodebase(); + + try { + $this->parsed_docblock = DocComment::parsePreservingLength($docblock); + } catch (DocblockParseException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($this->getSource(), $stmt, null, true) + ) + ); + + $this->parsed_docblock = null; + } + + $comments = $this->parsed_docblock; + + if (isset($comments->tags['psalm-scope-this'])) { + $trimmed = trim(reset($comments->tags['psalm-scope-this'])); + + if (!$codebase->classExists($trimmed)) { + IssueBuffer::maybeAdd( + new UndefinedDocblockClass( + 'Scope class ' . $trimmed . ' does not exist', + new CodeLocation($this->getSource(), $stmt, null, true), + $trimmed + ) + ); + } else { + $this_type = Type::parseString($trimmed); + $context->self = $trimmed; + $context->vars_in_scope['$this'] = $this_type; + $this->setFQCLN($trimmed); + } + } + } + + /** + * @param array $stmts + */ + public function checkUnreferencedVars(array $stmts, Context $context): void + { + $source = $this->getSource(); + $codebase = $source->getCodebase(); + $function_storage = $source instanceof FunctionLikeAnalyzer ? $source->getFunctionLikeStorage($this) : null; + $var_list = array_column($this->unused_var_locations, 0); + $loc_list = array_column($this->unused_var_locations, 1); + + $project_analyzer = $this->getProjectAnalyzer(); + + $unused_var_remover = new UnusedAssignmentRemover(); + + if ($this->data_flow_graph instanceof VariableUseGraph + && $codebase->config->limit_method_complexity + && $source instanceof FunctionLikeAnalyzer + && !$source instanceof ClosureAnalyzer + && $function_storage + && $function_storage->location + ) { + [$count, , $unique_destinations, $mean] = $this->data_flow_graph->getEdgeStats(); + + $average_destination_branches_converging = $unique_destinations > 0 ? $count / $unique_destinations : 0; + + if ($count > $codebase->config->max_graph_size + && $mean > $codebase->config->max_avg_path_length + && $average_destination_branches_converging > 1.1 + ) { + if ($source instanceof FunctionAnalyzer) { + IssueBuffer::maybeAdd( + new ComplexFunction( + 'This function’s complexity is greater than the project limit' + . ' (method graph size = ' . $count .', average path length = ' . round($mean). ')', + $function_storage->location + ), + $this->getSuppressedIssues() + ); + } elseif ($source instanceof MethodAnalyzer) { + IssueBuffer::maybeAdd( + new ComplexMethod( + 'This method’s complexity is greater than the project limit' + . ' (method graph size = ' . $count .', average path length = ' . round($mean) . ')', + $function_storage->location + ), + $this->getSuppressedIssues() + ); + } + } + } + + foreach ($this->unused_var_locations as [$var_id, $original_location]) { + if (strpos($var_id, '$_') === 0) { + continue; + } + + if ($function_storage) { + $param_index = array_search(substr($var_id, 1), array_keys($function_storage->param_lookup)); + if ($param_index !== false) { + $param = $function_storage->params[$param_index]; + + if ($param->location + && ($original_location->raw_file_end === $param->location->raw_file_end + || $param->by_ref) + ) { + continue; + } + } + } + + $assignment_node = DataFlowNode::getForAssignment($var_id, $original_location); + + if (!isset($this->byref_uses[$var_id]) + && !isset($context->vars_from_global[$var_id]) + && !VariableFetchAnalyzer::isSuperGlobal($var_id) + && $this->data_flow_graph instanceof VariableUseGraph + && !$this->data_flow_graph->isVariableUsed($assignment_node) + ) { + $is_foreach_var = false; + + if (isset($this->foreach_var_locations[$var_id])) { + foreach ($this->foreach_var_locations[$var_id] as $location) { + if ($location->raw_file_start === $original_location->raw_file_start) { + $is_foreach_var = true; + break; + } + } + } + + if ($is_foreach_var) { + $issue = new UnusedForeachValue( + $var_id . ' is never referenced or the value is not used', + $original_location + ); + } else { + $issue = new UnusedVariable( + $var_id . ' is never referenced or the value is not used', + $original_location + ); + } + + if ($codebase->alter_code + && $issue instanceof UnusedVariable + && !$unused_var_remover->checkIfVarRemoved($var_id, $original_location) + && isset($project_analyzer->getIssuesToFix()['UnusedVariable']) + && !IssueBuffer::isSuppressed($issue, $this->getSuppressedIssues()) + ) { + $unused_var_remover->findUnusedAssignment( + $this->getCodebase(), + $stmts, + array_combine($var_list, $loc_list), + $var_id, + $original_location + ); + } + + IssueBuffer::maybeAdd( + $issue, + $this->getSuppressedIssues(), + $issue instanceof UnusedVariable + ); + } + } + } + + public function hasVariable(string $var_name): bool + { + return isset($this->all_vars[$var_name]); + } + + public function registerVariable(string $var_id, CodeLocation $location, ?int $branch_point): void + { + $this->all_vars[$var_id] = $location; + + if ($branch_point) { + $this->var_branch_points[$var_id] = $branch_point; + } + + $this->registerVariableAssignment($var_id, $location); + } + + public function registerVariableAssignment(string $var_id, CodeLocation $location): void + { + $this->unused_var_locations[$location->getHash()] = [$var_id, $location]; + } + + /** + * @return array + */ + public function getUnusedVarLocations(): array + { + return $this->unused_var_locations; + } + + public function registerPossiblyUndefinedVariable( + string $undefined_var_id, + PhpParser\Node\Expr\Variable $stmt + ): void { + if (!$this->data_flow_graph) { + return; + } + + $use_location = new CodeLocation($this->getSource(), $stmt); + $use_node = DataFlowNode::getForAssignment($undefined_var_id, $use_location); + + $stmt_type = $this->node_data->getType($stmt); + + if ($stmt_type) { + $stmt_type->parent_nodes[$use_node->id] = $use_node; + } + + foreach ($this->unused_var_locations as [$var_id, $original_location]) { + if ($var_id === $undefined_var_id) { + $parent_node = DataFlowNode::getForAssignment($var_id, $original_location); + + $this->data_flow_graph->addPath($parent_node, $use_node, '='); + } + } + } + + /** + * @return array + */ + public function getParentNodesForPossiblyUndefinedVariable(string $undefined_var_id): array + { + if (!$this->data_flow_graph) { + return []; + } + + $parent_nodes = []; + + foreach ($this->unused_var_locations as [$var_id, $original_location]) { + if ($var_id === $undefined_var_id) { + $assignment_node = DataFlowNode::getForAssignment($var_id, $original_location); + $parent_nodes[$assignment_node->id] = $assignment_node; + } + } + + return $parent_nodes; + } + + /** + * The first appearance of the variable in this set of statements being evaluated + */ + public function getFirstAppearance(string $var_id): ?CodeLocation + { + return $this->all_vars[$var_id] ?? null; + } + + public function getBranchPoint(string $var_id): ?int + { + return $this->var_branch_points[$var_id] ?? null; + } + + public function addVariableInitialization(string $var_id, int $branch_point): void + { + $this->vars_to_initialize[$var_id] = $branch_point; + } + + public function getFileAnalyzer(): FileAnalyzer + { + return $this->file_analyzer; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * @return array + */ + public function getFunctionAnalyzers(): array + { + return $this->function_analyzers; + } + + /** + * @param array $byref_uses + */ + public function setByRefUses(array $byref_uses): void + { + $this->byref_uses = $byref_uses; + } + + /** + * @return array> + */ + public function getUncaughtThrows(Context $context): array + { + $uncaught_throws = []; + + if ($context->collect_exceptions) { + if ($context->possibly_thrown_exceptions) { + $config = $this->codebase->config; + $ignored_exceptions = array_change_key_case( + $context->is_global ? + $config->ignored_exceptions_in_global_scope : + $config->ignored_exceptions + ); + $ignored_exceptions_and_descendants = array_change_key_case( + $context->is_global ? + $config->ignored_exceptions_and_descendants_in_global_scope : + $config->ignored_exceptions_and_descendants + ); + + foreach ($context->possibly_thrown_exceptions as $possibly_thrown_exception => $codelocations) { + if (isset($ignored_exceptions[strtolower($possibly_thrown_exception)])) { + continue; + } + + $is_expected = false; + + foreach ($ignored_exceptions_and_descendants as $expected_exception => $_) { + try { + if ($expected_exception === strtolower($possibly_thrown_exception) + || $this->codebase->classExtends($possibly_thrown_exception, $expected_exception) + || $this->codebase->interfaceExtends($possibly_thrown_exception, $expected_exception) + ) { + $is_expected = true; + break; + } + } catch (InvalidArgumentException $e) { + $is_expected = true; + break; + } + } + + if (!$is_expected) { + $uncaught_throws[$possibly_thrown_exception] = $codelocations; + } + } + } + } + + return $uncaught_throws; + } + + public function getFunctionAnalyzer(string $function_id): ?FunctionAnalyzer + { + return $this->function_analyzers[$function_id] ?? null; + } + + public function getParsedDocblock(): ?ParsedDocblock + { + return $this->parsed_docblock; + } + + public function getFQCLN(): ?string + { + if ($this->fake_this_class) { + return $this->fake_this_class; + } + + return parent::getFQCLN(); + } + + public function setFQCLN(string $fake_this_class): void + { + $this->fake_this_class = $fake_this_class; + } + + /** + * @return NodeDataProvider + */ + public function getNodeTypeProvider(): NodeTypeProvider + { + return $this->node_data; + } + + public function getFullyQualifiedFunctionMethodOrNamespaceName(): ?string + { + if ($this->source instanceof MethodAnalyzer) { + $fqcn = $this->getFQCLN(); + $method_name = $this->source->getFunctionLikeStorage($this)->cased_name; + assert($fqcn !== null && $method_name !== null); + + return "$fqcn::$method_name"; + } + + if ($this->source instanceof FunctionAnalyzer) { + $namespace = $this->getNamespace(); + $namespace = $namespace === "" ? "" : "$namespace\\"; + $function_name = $this->source->getFunctionLikeStorage($this)->cased_name; + assert($function_name !== null); + + return "{$namespace}{$function_name}"; + } + + return $this->getNamespace(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php new file mode 100644 index 00000000..1260c347 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php @@ -0,0 +1,76 @@ +source = $source; + $this->file_analyzer = $source->getFileAnalyzer(); + $this->aliases = $source->getAliases(); + $this->class = $class; + $this->fq_class_name = $fq_class_name; + $codebase = $source->getCodebase(); + $this->storage = $codebase->classlike_storage_provider->get($fq_class_name); + $this->aliases = $aliases; + } + + public function getNamespace(): ?string + { + return $this->aliases->namespace; + } + + public function getAliases(): Aliases + { + return $this->aliases; + } + + /** + * @return array + */ + public function getAliasedClassesFlipped(): array + { + return []; + } + + /** + * @return array + */ + public function getAliasedClassesFlippedReplaceable(): array + { + return []; + } + + public static function analyze(StatementsAnalyzer $statements_analyzer, Trait_ $stmt, Context $context): void + { + assert($stmt->name !== null); + $storage = $statements_analyzer->getCodebase()->classlike_storage_provider->get($stmt->name->name); + AttributesAnalyzer::analyze( + $statements_analyzer, + $context, + $storage, + $stmt->attrGroups, + AttributesAnalyzer::TARGET_CLASS, + $storage->suppressed_issues + $statements_analyzer->getSuppressedIssues() + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php new file mode 100644 index 00000000..2a8451c1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php @@ -0,0 +1,118 @@ + $new_types + * @param array $existing_types + * + * @return array + */ + public static function combineKeyedTypes(array $new_types, array $existing_types): array + { + $keys = array_merge(array_keys($new_types), array_keys($existing_types)); + $keys = array_unique($keys); + + $result_types = []; + + if (empty($new_types)) { + return $existing_types; + } + + if (empty($existing_types)) { + return $new_types; + } + + foreach ($keys as $key) { + if (!isset($existing_types[$key])) { + $result_types[$key] = $new_types[$key]; + continue; + } + + if (!isset($new_types[$key])) { + $result_types[$key] = $existing_types[$key]; + continue; + } + + $existing_var_types = $existing_types[$key]; + $new_var_types = $new_types[$key]; + + if ($new_var_types->getId() === $existing_var_types->getId()) { + $result_types[$key] = $new_var_types; + } else { + $result_types[$key] = Type::combineUnionTypes($new_var_types, $existing_var_types); + } + } + + return $result_types; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Clause.php b/vendor/vimeo/psalm/src/Psalm/Internal/Clause.php new file mode 100644 index 00000000..79969230 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Clause.php @@ -0,0 +1,295 @@ + ['falsy'], + * '$b' => ['!falsy'], + * '$c' => ['!null'], + * '$d' => ['string', 'int'] + * ] + * + * representing the formula + * + * !$a || $b || $c !== null || is_string($d) || is_int($d) + * + * @var array> + */ + public $possibilities; + + /** + * An array of things that are not true + * [ + * '$a' => ['!falsy'], + * '$b' => ['falsy'], + * '$c' => ['null'], + * '$d' => ['!string', '!int'] + * ] + * represents the formula + * + * $a && !$b && $c === null && !is_string($d) && !is_int($d) + * + * @var array>|null + */ + public $impossibilities; + + /** @var bool */ + public $wedge; + + /** @var bool */ + public $reconcilable; + + /** @var bool */ + public $generated = false; + + /** @var array */ + public $redefined_vars = []; + + /** @var string|int */ + public $hash; + + /** + * @param array> $possibilities + * @param array $redefined_vars + */ + public function __construct( + array $possibilities, + int $creating_conditional_id, + int $creating_object_id, + bool $wedge = false, + bool $reconcilable = true, + bool $generated = false, + array $redefined_vars = [] + ) { + $this->possibilities = $possibilities; + $this->wedge = $wedge; + $this->reconcilable = $reconcilable; + $this->generated = $generated; + $this->redefined_vars = $redefined_vars; + $this->creating_conditional_id = $creating_conditional_id; + $this->creating_object_id = $creating_object_id; + + if ($wedge || !$reconcilable) { + $this->hash = ($wedge ? 'w' : '') . $creating_object_id; + } else { + ksort($possibilities); + + foreach ($possibilities as $i => $v) { + if (count($v) < 2) { + continue; + } + sort($possibilities[$i]); + } + + $data = serialize($possibilities); + $this->hash = PHP_VERSION_ID >= 80100 ? hash('xxh128', $data) : hash('md4', $data); + } + } + + public function contains(Clause $other_clause): bool + { + if (count($other_clause->possibilities) > count($this->possibilities)) { + return false; + } + + foreach ($other_clause->possibilities as $var => $_) { + if (!isset($this->possibilities[$var])) { + return false; + } + } + + foreach ($other_clause->possibilities as $var => $possible_types) { + if (count(array_diff($possible_types, $this->possibilities[$var]))) { + return false; + } + } + + return true; + } + + /** + * @psalm-mutation-free + */ + public function __toString(): string + { + $clause_strings = array_map( + /** + * @param non-empty-list $values + */ + function (string $var_id, array $values): string { + if ($var_id[0] === '*') { + $var_id = ''; + } + + $var_id_clauses = array_map( + function (string $value) use ($var_id): string { + if ($value === 'falsy') { + return '!' . $var_id; + } + + if ($value === '!falsy') { + return $var_id; + } + + $negate = false; + + if ($value[0] === '!') { + $negate = true; + $value = substr($value, 1); + } + + if ($value[0] === '=') { + $value = substr($value, 1); + } + + if ($negate) { + return $var_id . ' is not ' . $value; + } + + return $var_id . ' is ' . $value; + }, + $values + ); + + if (count($var_id_clauses) > 1) { + return '(' . implode(') || (', $var_id_clauses) . ')'; + } + + return $var_id_clauses[0]; + }, + array_keys($this->possibilities), + array_values($this->possibilities) + ); + + if (count($clause_strings) > 1) { + return '(' . implode(') || (', $clause_strings) . ')'; + } + + return reset($clause_strings); + } + + public function makeUnique(): self + { + $possibilities = $this->possibilities; + + foreach ($possibilities as $var_id => $var_possibilities) { + $possibilities[$var_id] = array_values(array_unique($var_possibilities)); + } + + return new self( + $possibilities, + $this->creating_conditional_id, + $this->creating_object_id, + $this->wedge, + $this->reconcilable, + $this->generated, + $this->redefined_vars + ); + } + + public function removePossibilities(string $var_id): ?self + { + $possibilities = $this->possibilities; + unset($possibilities[$var_id]); + + if (!$possibilities) { + return null; + } + + return new self( + $possibilities, + $this->creating_conditional_id, + $this->creating_object_id, + $this->wedge, + $this->reconcilable, + $this->generated, + $this->redefined_vars + ); + } + + /** + * @param non-empty-list $clause_var_possibilities + */ + public function addPossibilities(string $var_id, array $clause_var_possibilities): self + { + $possibilities = $this->possibilities; + $possibilities[$var_id] = $clause_var_possibilities; + + return new self( + $possibilities, + $this->creating_conditional_id, + $this->creating_object_id, + $this->wedge, + $this->reconcilable, + $this->generated, + $this->redefined_vars + ); + } + + public function calculateNegation(): self + { + if ($this->impossibilities !== null) { + return $this; + } + + $impossibilities = []; + + foreach ($this->possibilities as $var_id => $possibility) { + $impossibility = []; + + foreach ($possibility as $type) { + if (($type[0] !== '=' && $type[0] !== '~' + && (!isset($type[1]) || ($type[1] !== '=' && $type[1] !== '~'))) + || strpos($type, '(') + || strpos($type, 'getclass-') + ) { + $impossibility[] = Algebra::negateType($type); + } + } + + if ($impossibility) { + $impossibilities[$var_id] = $impossibility; + } + } + + $clause = clone $this; + + $clause->impossibilities = $impossibilities; + + return $clause; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php new file mode 100644 index 00000000..e8689ee9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php @@ -0,0 +1,323 @@ + $argv */ + public static function run(array $argv): void + { + gc_disable(); + ErrorHandler::install(); + $valid_short_options = [ + 'h', + 'v', + 'c:', + 'r:', + ]; + + $valid_long_options = [ + 'clear-cache', + 'config:', + 'find-dead-code', + 'help', + 'root:', + 'use-ini-defaults', + 'version', + 'tcp:', + 'tcp-server', + 'disable-on-change::', + 'enable-autocomplete::', + 'use-extended-diagnostic-codes', + 'verbose' + ]; + + $args = array_slice($argv, 1); + + $psalm_proxy = array_search('--language-server', $args, true); + + if ($psalm_proxy !== false) { + unset($args[$psalm_proxy]); + } + + array_map( + function (string $arg) use ($valid_long_options): void { + if (strpos($arg, '--') === 0 && $arg !== '--') { + $arg_name = preg_replace('/=.*$/', '', substr($arg, 2)); + + if (!in_array($arg_name, $valid_long_options, true) + && !in_array($arg_name . ':', $valid_long_options, true) + && !in_array($arg_name . '::', $valid_long_options, true) + ) { + fwrite( + STDERR, + 'Unrecognised argument "--' . $arg_name . '"' . PHP_EOL + . 'Type --help to see a list of supported arguments' . PHP_EOL + ); + error_log('Bad argument'); + exit(1); + } + } + }, + $args + ); + + // get options from command line + $options = getopt(implode('', $valid_short_options), $valid_long_options); + + if (!array_key_exists('use-ini-defaults', $options)) { + ini_set('display_errors', '1'); + ini_set('display_startup_errors', '1'); + ini_set('memory_limit', (string) (8 * 1024 * 1024 * 1024)); + } + + if (array_key_exists('help', $options)) { + $options['h'] = false; + } + + if (array_key_exists('version', $options)) { + $options['v'] = false; + } + + if (isset($options['config'])) { + $options['c'] = $options['config']; + } + + if (isset($options['c']) && is_array($options['c'])) { + fwrite(STDERR, 'Too many config files provided' . PHP_EOL); + exit(1); + } + + if (array_key_exists('h', $options)) { + echo <<runAndCollect( + // we ignore the FQN because of a hack in scoper.inc that needs full path + // phpcs:ignore SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly.ReferenceViaFullyQualifiedName + function () use ($current_dir, $options, $vendor_dir): ?\Composer\Autoload\ClassLoader { + return CliUtils::requireAutoloaders($current_dir, isset($options['r']), $vendor_dir); + } + ); + + if (array_key_exists('v', $options)) { + echo 'Psalm ' . PSALM_VERSION . PHP_EOL; + exit; + } + + $ini_handler = new PsalmRestarter('PSALM'); + + $ini_handler->disableExtension('grpc'); + + // If Xdebug is enabled, restart without it + $ini_handler->check(); + + setlocale(LC_CTYPE, 'C'); + + $path_to_config = CliUtils::getPathToConfig($options); + + if (isset($options['tcp'])) { + if (!is_string($options['tcp'])) { + fwrite(STDERR, 'tcp url should be a string' . PHP_EOL); + exit(1); + } + } + + $find_unused_code = isset($options['find-dead-code']) ? 'auto' : null; + + $config = CliUtils::initializeConfig( + $path_to_config, + $current_dir, + Report::TYPE_CONSOLE, + $first_autoloader + ); + $config->setIncludeCollector($include_collector); + + if ($config->resolve_from_config_file) { + $current_dir = $config->base_dir; + chdir($current_dir); + } + + $config->setServerMode(); + + if (isset($options['clear-cache'])) { + $cache_directory = $config->getCacheDirectory(); + + if ($cache_directory !== null) { + Config::removeCacheDirectory($cache_directory); + } + echo 'Cache directory deleted' . PHP_EOL; + exit; + } + + $providers = new Providers( + new FileProvider, + new ParserCacheProvider($config), + new FileStorageCacheProvider($config), + new ClassLikeStorageCacheProvider($config), + new FileReferenceCacheProvider($config), + new ProjectCacheProvider(Composer::getLockFilePath($current_dir)) + ); + + $project_analyzer = new ProjectAnalyzer( + $config, + $providers + ); + + if ($config->find_unused_variables) { + $project_analyzer->getCodebase()->reportUnusedVariables(); + } + + if ($config->find_unused_code) { + $find_unused_code = 'auto'; + } + + if (isset($options['disable-on-change'])) { + $project_analyzer->onchange_line_limit = (int) $options['disable-on-change']; + } + + $project_analyzer->provide_completion = !isset($options['enable-autocomplete']) + || !is_string($options['enable-autocomplete']) + || strtolower($options['enable-autocomplete']) !== 'false'; + + if ($find_unused_code) { + $project_analyzer->getCodebase()->reportUnusedCode($find_unused_code); + } + + if (isset($options['use-extended-diagnostic-codes'])) { + $project_analyzer->language_server_use_extended_diagnostic_codes = true; + } + + if (isset($options['verbose'])) { + $project_analyzer->language_server_verbose = true; + } + + $project_analyzer->server($options['tcp'] ?? null, isset($options['tcp-server'])); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php new file mode 100644 index 00000000..5a891853 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php @@ -0,0 +1,46 @@ +addCommands([ + new ShowCommand($plugin_list_factory), + new EnableCommand($plugin_list_factory), + new DisableCommand($plugin_list_factory), + ]); + + $app->setDefaultCommand('show'); + $app->run(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php new file mode 100644 index 00000000..86031b7b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php @@ -0,0 +1,1176 @@ + $argv + */ + public static function run(array $argv): void + { + gc_collect_cycles(); + gc_disable(); + + ErrorHandler::install(); + + $args = array_slice($argv, 1); + + // get options from command line + $options = getopt(implode('', self::SHORT_OPTIONS), self::LONG_OPTIONS); + if (false === $options) { + throw new RuntimeException('Failed to parse CLI options'); + } + + self::forwardCliCall($options, $argv); + + self::validateCliArguments($args); + + self::setMemoryLimit($options); + + self::syncShortOptions($options); + + if (isset($options['c']) && is_array($options['c'])) { + fwrite(STDERR, 'Too many config files provided' . PHP_EOL); + exit(1); + } + + + if (array_key_exists('h', $options)) { + echo CliUtils::getPsalmHelpText(); + /* + --shepherd[=host] + Send data to Shepherd, Psalm's GitHub integration tool. + `host` is the location of the Shepherd server. It defaults to shepherd.dev + More information is available at https://psalm.dev/shepherd + */ + + exit; + } + + $current_dir = self::getCurrentDir($options); + + $path_to_config = CliUtils::getPathToConfig($options); + + $vendor_dir = CliUtils::getVendorDir($current_dir); + + // capture environment before registering autoloader (it may destroy it) + IssueBuffer::captureServer($_SERVER); + + $include_collector = new IncludeCollector(); + $first_autoloader = $include_collector->runAndCollect( + // we ignore the FQN because of a hack in scoper.inc that needs full path + // phpcs:ignore SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly.ReferenceViaFullyQualifiedName + function () use ($current_dir, $options, $vendor_dir): ?\Composer\Autoload\ClassLoader { + return CliUtils::requireAutoloaders($current_dir, isset($options['r']), $vendor_dir); + } + ); + + $run_taint_analysis = self::shouldRunTaintAnalysis($options); + + if (array_key_exists('v', $options)) { + echo 'Psalm ' . PSALM_VERSION . PHP_EOL; + exit; + } + + $output_format = self::initOutputFormat($options); + + [$config, $init_source_dir] = self::initConfig( + $current_dir, + $args, + $vendor_dir, + $first_autoloader, + $path_to_config, + $output_format, + $run_taint_analysis, + $options + ); + + $config->setIncludeCollector($include_collector); + + $in_ci = CliUtils::runningInCI(); // disable progressbar on CI + + if ($in_ci) { + $options['long-progress'] = true; + } + + $threads = self::detectThreads($options, $config, $in_ci); + + self::emitMacPcreWarning($options, $threads); + + self::restart($options, $config, $threads); + + if (isset($options['debug-emitted-issues'])) { + $config->debug_emitted_issues = true; + } + + + setlocale(LC_CTYPE, 'C'); + + if (isset($options['set-baseline'])) { + if (is_array($options['set-baseline'])) { + die('Only one baseline file can be created at a time' . PHP_EOL); + } + } + + $paths_to_check = CliUtils::getPathsToCheck($options['f'] ?? null); + + if ($config->resolve_from_config_file) { + $current_dir = $config->base_dir; + chdir($current_dir); + } + + $plugins = []; + + if (isset($options['plugin'])) { + $plugins = $options['plugin']; + + if (!is_array($plugins)) { + $plugins = [$plugins]; + } + } + + $show_info = self::initShowInfo($options); + + $is_diff = self::initIsDiff($options); + + $find_unused_code = self::shouldFindUnusedCode($options, $config); + + $find_unused_variables = isset($options['find-unused-variables']); + + $find_references_to = isset($options['find-references-to']) && is_string($options['find-references-to']) + ? $options['find-references-to'] + : null; + + if (isset($options['shepherd']) || getenv('PSALM_SHEPHERD')) { + if (isset($options['shepherd'])) { + if (is_string($options['shepherd'])) { + $config->shepherd_host = $options['shepherd']; + } + } elseif (getenv('PSALM_SHEPHERD')) { + if (false !== ($shepherd_host = getenv('PSALM_SHEPHERD_HOST'))) { + $config->shepherd_host = $shepherd_host; + } + } + $shepherd_plugin = Path::canonicalize(__DIR__ . '/../../Plugin/Shepherd.php'); + + if (!file_exists($shepherd_plugin)) { + die('Could not find Shepherd plugin location ' . $shepherd_plugin . PHP_EOL); + } + + $plugins[] = $shepherd_plugin; + } + + if (isset($options['clear-cache'])) { + self::clearCache($config); + } + + if (isset($options['clear-global-cache'])) { + self::clearGlobalCache($config); + } + + $progress = self::initProgress($options, $config); + $providers = self::initProviders($options, $config, $current_dir); + + $stdout_report_options = self::initStdoutReportOptions($options, $show_info, $output_format, $in_ci); + + /** @var list|string $report_file_paths type guaranteed by argument to getopt() */ + $report_file_paths = $options['report'] ?? []; + if (is_string($report_file_paths)) { + $report_file_paths = [$report_file_paths]; + } + + $project_analyzer = new ProjectAnalyzer( + $config, + $providers, + $stdout_report_options, + ProjectAnalyzer::getFileReportOptions( + $report_file_paths, + isset($options['report-show-info']) + ? $options['report-show-info'] !== 'false' && $options['report-show-info'] !== '0' + : true + ), + $threads, + $progress + ); + + CliUtils::initPhpVersion($options, $config, $project_analyzer); + + $start_time = microtime(true); + + self::configureProjectAnalyzer( + $options, + $config, + $project_analyzer, + $find_references_to, + $find_unused_code, + $find_unused_variables, + $run_taint_analysis + ); + + if ($config->run_taint_analysis || $run_taint_analysis) { + $is_diff = false; + } + + /** @var string $plugin_path */ + foreach ($plugins as $plugin_path) { + $config->addPluginPath($plugin_path); + } + + if ($paths_to_check === null) { + $project_analyzer->check($current_dir, $is_diff); + } elseif ($paths_to_check) { + $project_analyzer->checkPaths($paths_to_check); + } + + if ($find_references_to) { + $project_analyzer->findReferencesTo($find_references_to); + } + + self::storeFlowGraph($options, $project_analyzer); + + if (isset($options['generate-json-map']) && is_string($options['generate-json-map'])) { + self::storeTypeMap($providers, $config, $options['generate-json-map']); + } + + if (isset($options['generate-stubs'])) { + self::generateStubs($options, $providers, $project_analyzer); + } + + if (!isset($options['i'])) { + IssueBuffer::finish( + $project_analyzer, + !$paths_to_check, + $start_time, + isset($options['stats']), + self::initBaseline($options, $config, $current_dir, $path_to_config) + ); + } else { + self::autoGenerateConfig($project_analyzer, $current_dir, $init_source_dir, $vendor_dir); + } + } + + private static function initOutputFormat(array $options): string + { + return isset($options['output-format']) && is_string($options['output-format']) + ? $options['output-format'] + : Report::TYPE_CONSOLE; + } + + private static function initShowInfo(array $options): bool + { + return isset($options['show-info']) + ? $options['show-info'] === 'true' || $options['show-info'] === '1' + : false; + } + + private static function initIsDiff(array $options): bool + { + return !isset($options['no-diff']) + && !isset($options['set-baseline']) + && !isset($options['update-baseline']); + } + + /** + * @param array $args + */ + private static function validateCliArguments(array $args): void + { + array_map( + function (string $arg): void { + if (strpos($arg, '--') === 0 && $arg !== '--') { + $arg_name = preg_replace('/=.*$/', '', substr($arg, 2)); + + if (!in_array($arg_name, self::LONG_OPTIONS) + && !in_array($arg_name . ':', self::LONG_OPTIONS) + && !in_array($arg_name . '::', self::LONG_OPTIONS) + ) { + fwrite( + STDERR, + 'Unrecognised argument "--' . $arg_name . '"' . PHP_EOL + . 'Type --help to see a list of supported arguments'. PHP_EOL + ); + exit(1); + } + } elseif (strpos($arg, '-') === 0 && $arg !== '-' && $arg !== '--') { + $arg_name = preg_replace('/=.*$/', '', substr($arg, 1)); + + if (!in_array($arg_name, self::SHORT_OPTIONS) + && !in_array($arg_name . ':', self::SHORT_OPTIONS) + ) { + fwrite( + STDERR, + 'Unrecognised argument "-' . $arg_name . '"' . PHP_EOL + . 'Type --help to see a list of supported arguments'. PHP_EOL + ); + exit(1); + } + } + }, + $args + ); + } + + /** + * @param array> $options + */ + private static function setMemoryLimit(array $options): void + { + if (!array_key_exists('use-ini-defaults', $options)) { + ini_set('display_errors', 'stderr'); + ini_set('display_startup_errors', '1'); + + $memoryLimit = (8 * 1024 * 1024 * 1024); + + if (array_key_exists('memory-limit', $options)) { + $memoryLimit = $options['memory-limit']; + + if (!is_scalar($memoryLimit)) { + throw new ConfigException('Invalid memory limit specified.'); + } + } + + ini_set('memory_limit', (string) $memoryLimit); + } + } + + /** + * @param array $args + */ + private static function generateConfig(string $current_dir, array &$args): void + { + if (file_exists($current_dir . 'psalm.xml')) { + die('A config file already exists in the current directory' . PHP_EOL); + } + + $args = array_values(array_filter( + $args, + function (string $arg): bool { + return $arg !== '--ansi' + && $arg !== '--no-ansi' + && $arg !== '-i' + && $arg !== '--init' + && $arg !== '--debug' + && $arg !== '--debug-by-line' + && $arg !== '--debug-emitted-issues' + && strpos($arg, '--disable-extension=') !== 0 + && strpos($arg, '--root=') !== 0 + && strpos($arg, '--r=') !== 0; + } + )); + + $init_level = null; + $init_source_dir = null; + if (count($args)) { + if (count($args) > 2) { + die('Too many arguments provided for psalm --init' . PHP_EOL); + } + + if (isset($args[1])) { + if (!preg_match('/^[1-8]$/', $args[1])) { + die('Config strictness must be a number between 1 and 8 inclusive' . PHP_EOL); + } + + $init_level = (int)$args[1]; + } + + $init_source_dir = $args[0]; + } + + $vendor_dir = CliUtils::getVendorDir($current_dir); + + if (null !== $init_level) { + try { + $template_contents = Creator::getContents( + $current_dir, + $init_source_dir, + $init_level, + $vendor_dir + ); + } catch (ConfigCreationException $e) { + die($e->getMessage() . PHP_EOL); + } + + if (!file_put_contents($current_dir . 'psalm.xml', $template_contents)) { + die('Could not write to psalm.xml' . PHP_EOL); + } + + exit('Config file created successfully. Please re-run psalm.' . PHP_EOL); + } + } + + private static function loadConfig( + ?string $path_to_config, + string $current_dir, + string $output_format, + ?ClassLoader $first_autoloader, + bool $run_taint_analysis, + array $options + ): Config { + $config = CliUtils::initializeConfig( + $path_to_config, + $current_dir, + $output_format, + $first_autoloader, + $run_taint_analysis + ); + + if (isset($options['error-level']) + && is_numeric($options['error-level']) + ) { + $config_level = (int) $options['error-level']; + + if (!in_array($config_level, [1, 2, 3, 4, 5, 6, 7, 8], true)) { + throw new ConfigException( + 'Invalid error level ' . $config_level + ); + } + + $config->level = $config_level; + } + return $config; + } + + private static function initProgress(array $options, Config $config): Progress + { + $debug = array_key_exists('debug', $options) || array_key_exists('debug-by-line', $options); + + $show_info = isset($options['show-info']) + ? $options['show-info'] === 'true' || $options['show-info'] === '1' + : false; + + if ($debug) { + $progress = new DebugProgress(); + } elseif (isset($options['no-progress'])) { + $progress = new VoidProgress(); + } else { + $show_errors = !$config->error_baseline || isset($options['ignore-baseline']); + if (isset($options['long-progress'])) { + $progress = new LongProgress($show_errors, $show_info); + } else { + $progress = new DefaultProgress($show_errors, $show_info); + } + } + return $progress; + } + + private static function initProviders(array $options, Config $config, string $current_dir): Providers + { + if (isset($options['no-cache']) || isset($options['i'])) { + $providers = new Providers( + new FileProvider + ); + } else { + $no_reflection_cache = isset($options['no-reflection-cache']); + $no_file_cache = isset($options['no-file-cache']); + + $file_storage_cache_provider = $no_reflection_cache + ? null + : new FileStorageCacheProvider($config); + + $classlike_storage_cache_provider = $no_reflection_cache + ? null + : new ClassLikeStorageCacheProvider($config); + + $providers = new Providers( + new FileProvider, + new ParserCacheProvider($config, !$no_file_cache), + $file_storage_cache_provider, + $classlike_storage_cache_provider, + new FileReferenceCacheProvider($config), + new ProjectCacheProvider(Composer::getLockFilePath($current_dir)) + ); + } + return $providers; + } + + /** + * @param array{set-baseline:string} $options + * @return array}>> + */ + private static function generateBaseline( + array $options, + Config $config, + string $current_dir, + ?string $path_to_config + ): array { + fwrite(STDERR, 'Writing error baseline to file...' . PHP_EOL); + + try { + $issue_baseline = ErrorBaseline::read( + new FileProvider, + $options['set-baseline'] + ); + } catch (ConfigException $e) { + $issue_baseline = []; + } + + ErrorBaseline::create( + new FileProvider, + $options['set-baseline'], + IssueBuffer::getIssuesData(), + $config->include_php_versions_in_error_baseline || isset($options['include-php-versions']) + ); + + fwrite(STDERR, "Baseline saved to {$options['set-baseline']}."); + + CliUtils::updateConfigFile( + $config, + $path_to_config ?? $current_dir, + $options['set-baseline'] + ); + + fwrite(STDERR, PHP_EOL); + + return $issue_baseline; + } + + /** + * @return array}>> + */ + private static function updateBaseline(array $options, Config $config): array + { + $baselineFile = $config->error_baseline; + + if (empty($baselineFile)) { + die('Cannot update baseline, because no baseline file is configured.' . PHP_EOL); + } + + try { + $issue_current_baseline = ErrorBaseline::read( + new FileProvider, + $baselineFile + ); + $total_issues_current_baseline = ErrorBaseline::countTotalIssues($issue_current_baseline); + + $issue_baseline = ErrorBaseline::update( + new FileProvider, + $baselineFile, + IssueBuffer::getIssuesData(), + $config->include_php_versions_in_error_baseline || isset($options['include-php-versions']) + ); + $total_issues_updated_baseline = ErrorBaseline::countTotalIssues($issue_baseline); + + $total_fixed_issues = $total_issues_current_baseline - $total_issues_updated_baseline; + + if ($total_fixed_issues > 0) { + echo str_repeat('-', 30) . "\n"; + echo $total_fixed_issues . ' errors fixed' . "\n"; + } + } catch (ConfigException $exception) { + fwrite(STDERR, 'Could not update baseline file: ' . $exception->getMessage() . PHP_EOL); + exit(1); + } + + return $issue_baseline; + } + + private static function storeTypeMap(Providers $providers, Config $config, string $type_map_location): void + { + $file_map = $providers->file_reference_provider->getFileMaps(); + + $name_file_map = []; + + $expected_references = []; + + foreach ($file_map as $file_path => $map) { + $file_name = $config->shortenFileName($file_path); + foreach ($map[0] as $map_parts) { + $expected_references[$map_parts[1]] = true; + } + $map[2] = []; + $name_file_map[$file_name] = $map; + } + + $reference_dictionary = ReferenceMapGenerator::getReferenceMap( + $providers->classlike_storage_provider, + $expected_references + ); + + $type_map_string = json_encode(['files' => $name_file_map, 'references' => $reference_dictionary]); + + $providers->file_provider->setContents( + $type_map_location, + $type_map_string + ); + } + + private static function autoGenerateConfig( + ProjectAnalyzer $project_analyzer, + string $current_dir, + ?string $init_source_dir, + string $vendor_dir + ): void { + $issues_by_file = IssueBuffer::getIssuesData(); + + if (!$issues_by_file) { + $init_level = 1; + } else { + $codebase = $project_analyzer->getCodebase(); + $mixed_counts = $codebase->analyzer->getTotalTypeCoverage($codebase); + + $init_level = Creator::getLevel( + array_merge(...array_values($issues_by_file)), + array_sum($mixed_counts) + ); + } + + echo "\n" . 'Detected level ' . $init_level . ' as a suitable initial default' . "\n"; + + try { + $template_contents = Creator::getContents( + $current_dir, + $init_source_dir, + $init_level, + $vendor_dir + ); + } catch (ConfigCreationException $e) { + die($e->getMessage() . PHP_EOL); + } + + if (!file_put_contents($current_dir . 'psalm.xml', $template_contents)) { + die('Could not write to psalm.xml' . PHP_EOL); + } + + exit('Config file created successfully. Please re-run psalm.' . PHP_EOL); + } + + private static function initStdoutReportOptions( + array $options, + bool $show_info, + string $output_format, + bool $in_ci + ): ReportOptions { + $stdout_report_options = new ReportOptions(); + $stdout_report_options->use_color = !array_key_exists('m', $options); + $stdout_report_options->show_info = $show_info; + $stdout_report_options->show_suggestions = !array_key_exists('no-suggestions', $options); + /** + * @psalm-suppress PropertyTypeCoercion + */ + $stdout_report_options->format = $output_format; + $stdout_report_options->show_snippet = !isset($options['show-snippet']) || $options['show-snippet'] !== "false"; + $stdout_report_options->pretty = isset($options['pretty-print']) && $options['pretty-print'] !== "false"; + $stdout_report_options->in_ci = $in_ci; + + return $stdout_report_options; + } + + /** @return never */ + private static function clearGlobalCache(Config $config): void + { + $cache_directory = $config->getGlobalCacheDirectory(); + + if ($cache_directory) { + Config::removeCacheDirectory($cache_directory); + echo 'Global cache directory deleted' . PHP_EOL; + } + + exit; + } + + /** @return never */ + private static function clearCache(Config $config): void + { + $cache_directory = $config->getCacheDirectory(); + + if ($cache_directory !== null) { + Config::removeCacheDirectory($cache_directory); + } + echo 'Cache directory deleted' . PHP_EOL; + exit; + } + + private static function getCurrentDir(array $options): string + { + $cwd = getcwd(); + if (false === $cwd) { + fwrite(STDERR, 'Cannot get current working directory' . PHP_EOL); + exit(1); + } + + $current_dir = $cwd . DIRECTORY_SEPARATOR; + + if (isset($options['r']) && is_string($options['r'])) { + $root_path = realpath($options['r']); + + if (!$root_path) { + fwrite( + STDERR, + 'Could not locate root directory ' . $current_dir . DIRECTORY_SEPARATOR . $options['r'] . PHP_EOL + ); + exit(1); + } + + $current_dir = $root_path . DIRECTORY_SEPARATOR; + } + + return $current_dir; + } + + private static function emitMacPcreWarning(array $options, int $threads): void + { + if (!isset($options['threads']) + && !isset($options['debug']) + && $threads === 1 + && ini_get('pcre.jit') === '1' + && PHP_OS === 'Darwin' + && version_compare(PHP_VERSION, '7.3.0') >= 0 + && version_compare(PHP_VERSION, '7.4.0') < 0 + ) { + echo( + 'If you want to run Psalm as a language server, or run Psalm with' . PHP_EOL + . 'multiple processes (--threads=4), beware:' . PHP_EOL + . Pool::MAC_PCRE_MESSAGE . PHP_EOL . PHP_EOL + ); + } + } + + private static function restart(array $options, Config $config, int $threads): void + { + $ini_handler = new PsalmRestarter('PSALM'); + + if (isset($options['disable-extension'])) { + if (is_array($options['disable-extension'])) { + /** @psalm-suppress MixedAssignment */ + foreach ($options['disable-extension'] as $extension) { + if (is_string($extension)) { + $ini_handler->disableExtension($extension); + } + } + } elseif (is_string($options['disable-extension'])) { + $ini_handler->disableExtension($options['disable-extension']); + } + } + + if ($threads > 1) { + $ini_handler->disableExtension('grpc'); + } + + $ini_handler->disableExtension('uopz'); + + // If Xdebug is enabled, restart without it + $ini_handler->check(); + + if ($config->load_xdebug_stub === null && PsalmRestarter::getSkippedVersion() !== '') { + $config->load_xdebug_stub = true; + } + } + + private static function detectThreads(array $options, Config $config, bool $in_ci): int + { + if (isset($options['threads'])) { + $threads = (int)$options['threads']; + } elseif (isset($options['debug']) || $in_ci) { + $threads = 1; + } elseif ($config->threads) { + $threads = $config->threads; + } else { + $threads = max(1, ProjectAnalyzer::getCpuCount() - 1); + } + return $threads; + } + + /** @psalm-suppress UnusedParam $argv is being reported as unused */ + private static function forwardCliCall(array $options, array $argv): void + { + if (isset($options['alter'])) { + require_once __DIR__ . '/Psalter.php'; + Psalter::run($argv); + exit; + } + + if (isset($options['language-server'])) { + require_once __DIR__ . '/LanguageServer.php'; + LanguageServer::run($argv); + exit; + } + + if (isset($options['refactor'])) { + require_once __DIR__ . '/Refactor.php'; + Refactor::run($argv); + exit; + } + } + + /** + * @param array|string> $options + * @param-out array|string> $options + */ + private static function syncShortOptions(array &$options): void + { + if (array_key_exists('help', $options)) { + $options['h'] = false; + } + + if (array_key_exists('version', $options)) { + $options['v'] = false; + } + + if (array_key_exists('init', $options)) { + $options['i'] = false; + } + + if (array_key_exists('monochrome', $options)) { + $options['m'] = false; + } + + if (isset($options['config'])) { + $options['c'] = $options['config']; + } + + if (isset($options['root'])) { + $options['r'] = $options['root']; + } + } + + /** + * @param array $args + * @return array{Config,?string} + */ + private static function initConfig( + string $current_dir, + array $args, + string $vendor_dir, + ?ClassLoader $first_autoloader, + ?string $path_to_config, + string $output_format, + bool $run_taint_analysis, + array $options + ): array { + $init_source_dir = null; + if (isset($options['i'])) { + self::generateConfig($current_dir, $args); + // if we ever got here, it means we need to run Psalm once and generate the config + // based on the errors we find + $init_source_dir = $args[0] ?? null; + + echo "Calculating best config level based on project files\n"; + Creator::createBareConfig($current_dir, $init_source_dir, $vendor_dir); + $config = Config::getInstance(); + $config->setComposerClassLoader($first_autoloader); + } else { + $config = self::loadConfig( + $path_to_config, + $current_dir, + $output_format, + $first_autoloader, + $run_taint_analysis, + $options + ); + } + return [$config, $init_source_dir]; + } + + /** + * @return array}>> + */ + private static function initBaseline( + array $options, + Config $config, + string $current_dir, + ?string $path_to_config + ): array { + $issue_baseline = []; + + if (isset($options['set-baseline']) && is_string($options['set-baseline'])) { + $issue_baseline = self::generateBaseline($options, $config, $current_dir, $path_to_config); + } + + if (isset($options['use-baseline'])) { + if (!is_string($options['use-baseline'])) { + fwrite(STDERR, '--use-baseline must be a string' . PHP_EOL); + exit(1); + } + + $baseline_file_path = $options['use-baseline']; + $config->error_baseline = $baseline_file_path; + } else { + $baseline_file_path = $config->error_baseline; + } + + if (isset($options['update-baseline'])) { + $issue_baseline = self::updateBaseline($options, $config); + } + + if (!$issue_baseline && $baseline_file_path && !isset($options['ignore-baseline'])) { + try { + $issue_baseline = ErrorBaseline::read( + new FileProvider, + $baseline_file_path + ); + } catch (ConfigException $exception) { + fwrite(STDERR, 'Error while reading baseline: ' . $exception->getMessage() . PHP_EOL); + exit(1); + } + } + + return $issue_baseline; + } + + private static function storeFlowGraph(array $options, ProjectAnalyzer $project_analyzer): void + { + /** @var string|null $dump_taint_graph */ + $dump_taint_graph = $options['dump-taint-graph'] ?? null; + + $flow_graph = $project_analyzer->getCodebase()->taint_flow_graph; + if ($flow_graph !== null && $dump_taint_graph !== null) { + file_put_contents($dump_taint_graph, "digraph Taints {\n\t". + implode("\n\t", array_map( + function (array $edges) { + return '"'.implode('" -> "', $edges).'"'; + }, + $flow_graph->summarizeEdges() + )) . + "\n}\n"); + } + } + + /** @return false|'always'|'auto' */ + private static function shouldFindUnusedCode(array $options, Config $config) + { + $find_unused_code = false; + if (isset($options['find-dead-code'])) { + $options['find-unused-code'] = $options['find-dead-code'] === 'always' ? 'always' : 'auto'; + } + + if (isset($options['find-unused-code'])) { + if ($options['find-unused-code'] === 'always') { + $find_unused_code = 'always'; + } else { + $find_unused_code = 'auto'; + } + } + + if ($config->find_unused_code) { + $find_unused_code = 'auto'; + } + + return $find_unused_code; + } + + private static function shouldRunTaintAnalysis(array $options): bool + { + return (isset($options['track-tainted-input']) + || isset($options['security-analysis']) + || isset($options['taint-analysis'])); + } + + /** + * @param string|bool|null $find_references_to + * @param false|'always'|'auto' $find_unused_code + */ + private static function configureProjectAnalyzer( + array $options, + Config $config, + ProjectAnalyzer $project_analyzer, + $find_references_to, + $find_unused_code, + bool $find_unused_variables, + bool $run_taint_analysis + ): void { + if (isset($options['generate-json-map']) && is_string($options['generate-json-map'])) { + $project_analyzer->getCodebase()->store_node_types = true; + } + + if (array_key_exists('debug-by-line', $options)) { + $project_analyzer->debug_lines = true; + } + + if (array_key_exists('debug-performance', $options)) { + $project_analyzer->debug_performance = true; + } + + if ($find_references_to !== null) { + $project_analyzer->getCodebase()->collectLocations(); + $project_analyzer->show_issues = false; + } + + if ($find_unused_code) { + $project_analyzer->getCodebase()->reportUnusedCode($find_unused_code); + } + + if ($config->find_unused_variables || $find_unused_variables) { + $project_analyzer->getCodebase()->reportUnusedVariables(); + } + + if ($config->run_taint_analysis || $run_taint_analysis) { + $project_analyzer->trackTaintedInputs(); + } + + if ($config->find_unused_psalm_suppress || isset($options['find-unused-psalm-suppress'])) { + $project_analyzer->trackUnusedSuppressions(); + } + } + + private static function generateStubs( + array $options, + Providers $providers, + ProjectAnalyzer $project_analyzer + ): void { + if (isset($options['generate-stubs']) && is_string($options['generate-stubs'])) { + $stubs_location = $options['generate-stubs']; + + $providers->file_provider->setContents( + $stubs_location, + StubsGenerator::getAll( + $project_analyzer->getCodebase(), + $providers->classlike_storage_provider, + $providers->file_storage_provider + ) + ); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php new file mode 100644 index 00000000..a2949147 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php @@ -0,0 +1,578 @@ + $argv */ + public static function run(array $argv): void + { + gc_collect_cycles(); + gc_disable(); + + ErrorHandler::install(); + + self::setMemoryLimit(); + + $args = array_slice($argv, 1); + + // get options from command line + $options = getopt(implode('', self::SHORT_OPTIONS), self::LONG_OPTIONS); + + self::validateCliArguments($args); + + self::syncShortOptions($options); + + if (isset($options['c']) && is_array($options['c'])) { + die('Too many config files provided' . PHP_EOL); + } + + if (array_key_exists('h', $options)) { + echo <<runAndCollect( + // we ignore the FQN because of a hack in scoper.inc that needs full path + // phpcs:ignore SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly.ReferenceViaFullyQualifiedName + function () use ($current_dir, $options, $vendor_dir): ?\Composer\Autoload\ClassLoader { + return CliUtils::requireAutoloaders($current_dir, isset($options['r']), $vendor_dir); + } + ); + + + // If Xdebug is enabled, restart without it + (new XdebugHandler('PSALTER'))->check(); + + $paths_to_check = CliUtils::getPathsToCheck($options['f'] ?? null); + + $path_to_config = CliUtils::getPathToConfig($options); + + $config = CliUtils::initializeConfig( + $path_to_config, + $current_dir, + Report::TYPE_CONSOLE, + $first_autoloader + ); + $config->setIncludeCollector($include_collector); + + if ($config->resolve_from_config_file) { + $current_dir = $config->base_dir; + chdir($current_dir); + } + + $threads = isset($options['threads']) ? (int)$options['threads'] : 1; + + if (isset($options['no-cache'])) { + $providers = new Providers( + new FileProvider() + ); + } else { + $providers = new Providers( + new FileProvider(), + new ParserCacheProvider($config, false), + new FileStorageCacheProvider($config), + new ClassLikeStorageCacheProvider($config), + null, + new ProjectCacheProvider(Composer::getLockFilePath($current_dir)) + ); + } + + if (array_key_exists('list-supported-issues', $options)) { + echo implode(',', ProjectAnalyzer::getSupportedIssuesToFix()) . PHP_EOL; + exit(); + } + + $debug = array_key_exists('debug', $options) || array_key_exists('debug-by-line', $options); + $progress = $debug + ? new DebugProgress() + : new DefaultProgress(); + + $stdout_report_options = new ReportOptions(); + $stdout_report_options->use_color = !array_key_exists('m', $options); + + $project_analyzer = new ProjectAnalyzer( + $config, + $providers, + $stdout_report_options, + [], + $threads, + $progress + ); + + if (array_key_exists('debug-by-line', $options)) { + $project_analyzer->debug_lines = true; + } + + if (array_key_exists('debug-emitted-issues', $options)) { + $config->debug_emitted_issues = true; + } + + if (array_key_exists('issues', $options)) { + if (!is_string($options['issues']) || !$options['issues']) { + die('Expecting a comma-separated list of issues' . PHP_EOL); + } + + $issues = explode(',', $options['issues']); + + $keyed_issues = []; + + foreach ($issues as $issue) { + $keyed_issues[$issue] = true; + } + } else { + $keyed_issues = []; + } + + CliUtils::initPhpVersion($options, $config, $project_analyzer); + + if (isset($options['codeowner'])) { + $codeowner_files = self::loadCodeowners($providers); + + $desired_codeowners = is_array($options['codeowner']) ? $options['codeowner'] : [$options['codeowner']]; + + $files_for_codeowners = self::loadCodeownersFiles($desired_codeowners, $codeowner_files); + $paths_to_check = is_array($paths_to_check) ? + array_merge($paths_to_check, $files_for_codeowners) : + $files_for_codeowners; + } + + if (isset($options['allow-backwards-incompatible-changes'])) { + $allow_backwards_incompatible_changes = filter_var( + $options['allow-backwards-incompatible-changes'], + FILTER_VALIDATE_BOOLEAN, + ['flags' => FILTER_NULL_ON_FAILURE] + ); + + if ($allow_backwards_incompatible_changes === null) { + die('--allow-backwards-incompatible-changes expects a boolean value [true|false|1|0]' . PHP_EOL); + } + + $project_analyzer->getCodebase()->allow_backwards_incompatible_changes + = $allow_backwards_incompatible_changes; + } + + if (isset($options['add-newline-between-docblock-annotations'])) { + $doc_block_add_new_line_before_return = filter_var( + $options['add-newline-between-docblock-annotations'], + FILTER_VALIDATE_BOOLEAN, + ['flags' => FILTER_NULL_ON_FAILURE] + ); + + if ($doc_block_add_new_line_before_return === null) { + die('--add-newline-between-docblock-annotations expects a boolean value [true|false|1|0]' . PHP_EOL); + } + + ParsedDocblock::addNewLineBetweenAnnotations($doc_block_add_new_line_before_return); + } + + $plugins = []; + + if (isset($options['plugin'])) { + $plugins = $options['plugin']; + + if (!is_array($plugins)) { + $plugins = [$plugins]; + } + } + + /** @var string $plugin_path */ + foreach ($plugins as $plugin_path) { + Config::getInstance()->addPluginPath($current_dir . $plugin_path); + } + + $find_unused_code = array_key_exists('find-unused-code', $options); + + foreach ($keyed_issues as $issue_name => $_) { + // MissingParamType requires the scanning of all files to inform possible params + if (strpos($issue_name, 'Unused') !== false + || $issue_name === 'MissingParamType' + || $issue_name === 'UnnecessaryVarAnnotation' + || $issue_name === 'all' + ) { + $find_unused_code = true; + break; + } + } + + if ($find_unused_code) { + $project_analyzer->getCodebase()->reportUnusedCode(); + } + + $project_analyzer->alterCodeAfterCompletion( + array_key_exists('dry-run', $options), + array_key_exists('safe-types', $options) + ); + + if ($keyed_issues === ['all' => true]) { + $project_analyzer->setAllIssuesToFix(); + } else { + try { + $project_analyzer->setIssuesToFix($keyed_issues); + } catch (UnsupportedIssueToFixException $e) { + fwrite(STDERR, $e->getMessage() . PHP_EOL); + exit(1); + } + } + + $start_time = microtime(true); + + if ($paths_to_check === null || count($paths_to_check) > 1 || $find_unused_code) { + if ($paths_to_check) { + $files_to_update = []; + + foreach ($paths_to_check as $path_to_check) { + if (!is_dir($path_to_check)) { + $files_to_update[] = (string) realpath($path_to_check); + } else { + foreach ($providers->file_provider->getFilesInDir($path_to_check, ['php']) as $php_file_path) { + $files_to_update[] = $php_file_path; + } + } + } + + $project_analyzer->getCodebase()->analyzer->setFilesToUpdate($files_to_update); + } + + $project_analyzer->check($current_dir); + } elseif ($paths_to_check) { + foreach ($paths_to_check as $path_to_check) { + if (is_dir($path_to_check)) { + $project_analyzer->checkDir($path_to_check); + } else { + $project_analyzer->checkFile($path_to_check); + } + } + } + + IssueBuffer::finish($project_analyzer, false, $start_time); + } + + private static function setMemoryLimit(): void + { + $memLimit = CliUtils::getMemoryLimitInBytes(); + // Magic number is 4096M in bytes + if ($memLimit > 0 && $memLimit < 8 * 1024 * 1024 * 1024) { + ini_set('memory_limit', (string) (8 * 1024 * 1024 * 1024)); + } + } + + /** @param array $args */ + private static function validateCliArguments(array $args): void + { + array_map( + function (string $arg): void { + if (strpos($arg, '--') === 0 && $arg !== '--') { + $arg_name = preg_replace('/=.*$/', '', substr($arg, 2)); + + if ($arg_name === 'alter') { + // valid option for psalm, ignored by psalter + return; + } + + if (!in_array($arg_name, self::LONG_OPTIONS) + && !in_array($arg_name . ':', self::LONG_OPTIONS) + && !in_array($arg_name . '::', self::LONG_OPTIONS) + ) { + fwrite( + STDERR, + 'Unrecognised argument "--' . $arg_name . '"' . PHP_EOL + . 'Type --help to see a list of supported arguments'. PHP_EOL + ); + exit(1); + } + } + }, + $args + ); + } + + /** + * @param array|string> $options + * @param-out array|string> $options + */ + private static function syncShortOptions(array &$options): void + { + if (array_key_exists('help', $options)) { + $options['h'] = false; + } + + if (array_key_exists('monochrome', $options)) { + $options['m'] = false; + } + + if (isset($options['config'])) { + $options['c'] = $options['config']; + } + + if (isset($options['root'])) { + $options['r'] = $options['root']; + } + } + + /** @return array> */ + private static function loadCodeowners(Providers $providers): array + { + if (file_exists('CODEOWNERS')) { + $codeowners_file_path = realpath('CODEOWNERS'); + } elseif (file_exists('.github/CODEOWNERS')) { + $codeowners_file_path = realpath('.github/CODEOWNERS'); + } elseif (file_exists('docs/CODEOWNERS')) { + $codeowners_file_path = realpath('docs/CODEOWNERS'); + } else { + die('Cannot use --codeowner without a CODEOWNERS file' . PHP_EOL); + } + + $codeowners_file = file_get_contents($codeowners_file_path); + + $codeowner_lines = array_map( + function (string $line): array { + $line_parts = preg_split('/\s+/', $line); + + $file_selector = substr(array_shift($line_parts), 1); + return [$file_selector, $line_parts]; + }, + array_filter( + explode("\n", $codeowners_file), + function (string $line): bool { + $line = trim($line); + + // currently we don’t match wildcard files or files that could appear anywhere + // in the repo + return $line && $line[0] === '/' && strpos($line, '*') === false; + } + ) + ); + + $codeowner_files = []; + + foreach ($codeowner_lines as [$path, $owners]) { + if (!file_exists($path)) { + continue; + } + + foreach ($owners as $i => $owner) { + $owners[$i] = strtolower($owner); + } + + if (!is_dir($path)) { + if (pathinfo($path, PATHINFO_EXTENSION) === 'php') { + $codeowner_files[$path] = $owners; + } + } else { + foreach ($providers->file_provider->getFilesInDir($path, ['php']) as $php_file_path) { + $codeowner_files[$php_file_path] = $owners; + } + } + } + + if (!$codeowner_files) { + die('Could not find any available entries in CODEOWNERS' . PHP_EOL); + } + + return $codeowner_files; + } + + /** + * @param array> $codeowner_files + * @return list + */ + private static function loadCodeownersFiles(array $desired_codeowners, array $codeowner_files): array + { + $paths_to_check = []; + /** @psalm-suppress MixedAssignment */ + foreach ($desired_codeowners as $desired_codeowner) { + if (!is_string($desired_codeowner)) { + die('Invalid --codeowner ' . (string)$desired_codeowner . PHP_EOL); + } + + if ($desired_codeowner[0] !== '@') { + die('--codeowner option must start with @' . PHP_EOL); + } + + $matched_file = false; + + foreach ($codeowner_files as $file_path => $owners) { + if (in_array(strtolower($desired_codeowner), $owners)) { + $paths_to_check[] = $file_path; + $matched_file = true; + } + } + + if (!$matched_file) { + die('User/group ' . $desired_codeowner . ' does not own any PHP files' . PHP_EOL); + } + } + + return $paths_to_check; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php new file mode 100644 index 00000000..1c87f4e8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php @@ -0,0 +1,330 @@ + $argv */ + public static function run(array $argv): void + { + ini_set('memory_limit', '8192M'); + + gc_collect_cycles(); + gc_disable(); + + ErrorHandler::install(); + + $args = array_slice($argv, 1); + + $valid_short_options = ['f:', 'm', 'h', 'r:', 'c:']; + $valid_long_options = [ + 'help', 'debug', 'debug-by-line', 'debug-emitted-issues', 'config:', 'root:', + 'threads:', 'move:', 'into:', 'rename:', 'to:', + ]; + + // get options from command line + $options = getopt(implode('', $valid_short_options), $valid_long_options); + + array_map( + function (string $arg) use ($valid_long_options): void { + if (strpos($arg, '--') === 0 && $arg !== '--') { + $arg_name = preg_replace('/=.*$/', '', substr($arg, 2)); + + if ($arg_name === 'refactor') { + // valid option for psalm, ignored by psalter + return; + } + + if (!in_array($arg_name, $valid_long_options) + && !in_array($arg_name . ':', $valid_long_options) + && !in_array($arg_name . '::', $valid_long_options) + ) { + fwrite( + STDERR, + 'Unrecognised argument "--' . $arg_name . '"' . PHP_EOL + . 'Type --help to see a list of supported arguments'. PHP_EOL + ); + exit(1); + } + } + }, + $args + ); + + if (array_key_exists('help', $options)) { + $options['h'] = false; + } + + if (isset($options['config'])) { + $options['c'] = $options['config']; + } + + if (isset($options['c']) && is_array($options['c'])) { + die('Too many config files provided' . PHP_EOL); + } + + if (array_key_exists('h', $options)) { + echo <<runAndCollect( + // we ignore the FQN because of a hack in scoper.inc that needs full path + // phpcs:ignore SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly.ReferenceViaFullyQualifiedName + function () use ($current_dir, $options, $vendor_dir): ?\Composer\Autoload\ClassLoader { + return CliUtils::requireAutoloaders($current_dir, isset($options['r']), $vendor_dir); + } + ); + + // If Xdebug is enabled, restart without it + (new XdebugHandler('PSALTER'))->check(); + + $path_to_config = CliUtils::getPathToConfig($options); + + $args = CliUtils::getArguments(); + + $operation = null; + $last_arg = null; + + $to_refactor = []; + + foreach ($args as $arg) { + if ($arg === '--move') { + $operation = 'move'; + continue; + } + + if ($arg === '--into') { + if ($operation !== 'move' || !$last_arg) { + die('--into is not expected here' . PHP_EOL); + } + + $operation = 'move_into'; + continue; + } + + if ($arg === '--rename') { + $operation = 'rename'; + continue; + } + + if ($arg === '--to') { + if ($operation !== 'rename' || !$last_arg) { + die('--to is not expected here' . PHP_EOL); + } + + $operation = 'rename_to'; + + continue; + } + + if ($arg[0] === '-') { + $operation = null; + continue; + } + + if ($operation === 'move_into' || $operation === 'rename_to') { + if (!$last_arg) { + die('Expecting a previous argument' . PHP_EOL); + } + + if ($operation === 'move_into') { + $last_arg_parts = preg_split('/, ?/', $last_arg); + + foreach ($last_arg_parts as $last_arg_part) { + if (strpos($last_arg_part, '::')) { + [, $identifier_name] = explode('::', $last_arg_part); + $to_refactor[$last_arg_part] = $arg . '::' . $identifier_name; + } else { + $namespace_parts = explode('\\', $last_arg_part); + $class_name = end($namespace_parts); + $to_refactor[$last_arg_part] = $arg . '\\' . $class_name; + } + } + } else { + $to_refactor[$last_arg] = $arg; + } + + $last_arg = null; + $operation = null; + continue; + } + + if ($operation === 'move' || $operation === 'rename') { + $last_arg = $arg; + + continue; + } + + die('Unexpected argument "' . $arg . '"' . PHP_EOL); + } + + if (!$to_refactor) { + die('No --move or --rename arguments supplied' . PHP_EOL); + } + + $config = CliUtils::initializeConfig( + $path_to_config, + $current_dir, + Report::TYPE_CONSOLE, + $first_autoloader + ); + $config->setIncludeCollector($include_collector); + + if ($config->resolve_from_config_file) { + $current_dir = $config->base_dir; + chdir($current_dir); + } + + $threads = isset($options['threads']) + ? (int)$options['threads'] + : max(1, ProjectAnalyzer::getCpuCount() - 2); + + $providers = new Providers( + new FileProvider(), + new ParserCacheProvider($config, false), + new FileStorageCacheProvider($config), + new ClassLikeStorageCacheProvider($config), + null, + new ProjectCacheProvider(Composer::getLockFilePath($current_dir)) + ); + + $debug = array_key_exists('debug', $options) || array_key_exists('debug-by-line', $options); + $progress = $debug + ? new DebugProgress() + : new DefaultProgress(); + + if (array_key_exists('debug-emitted-issues', $options)) { + $config->debug_emitted_issues = true; + } + + $project_analyzer = new ProjectAnalyzer( + $config, + $providers, + new ReportOptions(), + [], + $threads, + $progress + ); + + if (array_key_exists('debug-by-line', $options)) { + $project_analyzer->debug_lines = true; + } + + $project_analyzer->refactorCodeAfterCompletion($to_refactor); + + $start_time = microtime(true); + + $project_analyzer->check($current_dir); + + IssueBuffer::finish($project_analyzer, false, $start_time); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/CliUtils.php b/vendor/vimeo/psalm/src/Psalm/Internal/CliUtils.php new file mode 100644 index 00000000..f8c88734 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/CliUtils.php @@ -0,0 +1,665 @@ + + */ + public static function getRawCliArguments(): array + { + global $argv; + + if (!$argv) { + return []; + } + + return array_slice($argv, 1); + } + + /** + * @return list + */ + public static function getArguments(): array + { + $argv = self::getRawCliArguments(); + $filtered_input_paths = []; + + for ($i = 0, $iMax = count($argv); $i < $iMax; ++$i) { + $input_path = $argv[$i]; + + if (realpath($input_path) !== false) { + continue; + } + + if ($input_path[0] === '-' && strlen($input_path) === 2) { + if ($input_path[1] === 'c' || $input_path[1] === 'f') { + ++$i; + } + continue; + } + + if ($input_path[0] === '-' && $input_path[2] === '=') { + continue; + } + + $filtered_input_paths[] = $input_path; + } + + return $filtered_input_paths; + } + + /** + * @param string|array|null|false $f_paths + * + * @return list|null + */ + public static function getPathsToCheck($f_paths): ?array + { + $paths_to_check = []; + + if ($f_paths) { + $input_paths = is_array($f_paths) ? $f_paths : [$f_paths]; + } else { + $input_paths = self::getRawCliArguments(); + if (!$input_paths) { + return null; + } + } + + $filtered_input_paths = []; + + for ($i = 0, $iMax = count($input_paths); $i < $iMax; ++$i) { + /** @var string */ + $input_path = $input_paths[$i]; + + if ($input_path[0] === '-' && strlen($input_path) === 2) { + if ($input_path[1] === 'c' || $input_path[1] === 'f') { + ++$i; + } + continue; + } + + if ($input_path[0] === '-' && $input_path[2] === '=') { + continue; + } + + if (strpos($input_path, '--') === 0 && strlen($input_path) > 2) { + if (substr($input_path, 2) === 'config') { + ++$i; + } + continue; + } + + $filtered_input_paths[] = $input_path; + } + + if ($filtered_input_paths === ['-']) { + $meta = stream_get_meta_data(STDIN); + stream_set_blocking(STDIN, false); + if ($stdin = fgets(STDIN)) { + $filtered_input_paths = preg_split('/\s+/', trim($stdin)); + } + $blocked = $meta['blocked']; + stream_set_blocking(STDIN, $blocked); + } + + foreach ($filtered_input_paths as $path_to_check) { + if ($path_to_check[0] === '-') { + fwrite(STDERR, 'Invalid usage, expecting psalm [options] [file...]' . PHP_EOL); + exit(1); + } + + if (!file_exists($path_to_check)) { + fwrite(STDERR, 'Cannot locate ' . $path_to_check . PHP_EOL); + exit(1); + } + + $path_to_check = realpath($path_to_check); + + if (!$path_to_check) { + fwrite(STDERR, 'Error getting realpath for file' . PHP_EOL); + exit(1); + } + + $paths_to_check[] = $path_to_check; + } + + if (!$paths_to_check) { + $paths_to_check = null; + } + + return $paths_to_check; + } + + /** + * @psalm-pure + * @todo move to Psalm\Internal\Cli\Psalm once \Psalm\getPsalmHelpText() is removed in Psalm 5 + */ + public static function getPsalmHelpText(): string + { + return <<getMessage() . PHP_EOL + ); + exit(1); + } + + $config->setComposerClassLoader($first_autoloader); + + return $config; + } + + public static function updateConfigFile(Config $config, string $config_file_path, string $baseline_path): void + { + if ($config->error_baseline === $baseline_path) { + return; + } + + $config_file = $config_file_path; + + if (is_dir($config_file_path)) { + $config_file = Config::locateConfigFile($config_file_path); + } + + if (!$config_file) { + fwrite(STDERR, "Don't forget to set errorBaseline=\"{$baseline_path}\" to your config."); + + return; + } + + $config_file_contents = file_get_contents($config_file); + + if ($config->error_baseline) { + $amended_config_file_contents = preg_replace( + '/errorBaseline=".*?"/', + "errorBaseline=\"{$baseline_path}\"", + $config_file_contents + ); + } else { + $end_psalm_open_tag = strpos($config_file_contents, '>', (int)strpos($config_file_contents, '", + $end_psalm_open_tag, + 1 + ); + } else { + $amended_config_file_contents = substr_replace( + $config_file_contents, + " errorBaseline=\"{$baseline_path}\">", + $end_psalm_open_tag, + 1 + ); + } + } + + file_put_contents($config_file, $amended_config_file_contents); + } + + public static function getPathToConfig(array $options): ?string + { + $path_to_config = isset($options['c']) && is_string($options['c']) ? realpath($options['c']) : null; + + if ($path_to_config === false) { + fwrite(STDERR, 'Could not resolve path to config ' . (string) ($options['c'] ?? '') . PHP_EOL); + exit(1); + } + return $path_to_config; + } + + /** + * @psalm-pure + */ + public static function getMemoryLimitInBytes(): int + { + return self::convertMemoryLimitToBytes(ini_get('memory_limit')); + } + + /** @psalm-pure */ + public static function convertMemoryLimitToBytes(string $limit): int + { + // for unlimited = -1 + if ($limit < 0) { + return -1; + } + + if (preg_match('/^(\d+)(\D?)$/', $limit, $matches)) { + assert(isset($matches[1])); + $limit = (int)$matches[1]; + switch (strtoupper($matches[2] ?? '')) { + case 'G': + $limit *= 1024 * 1024 * 1024; + break; + case 'M': + $limit *= 1024 * 1024; + break; + case 'K': + $limit *= 1024; + break; + } + } + + return (int)$limit; + } + + public static function initPhpVersion(array $options, Config $config, ProjectAnalyzer $project_analyzer): void + { + $source = null; + + if (isset($options['php-version'])) { + if (!is_string($options['php-version'])) { + die('Expecting a version number in the format x.y' . PHP_EOL); + } + $version = $options['php-version']; + $source = 'cli'; + } elseif ($version = $config->getPhpVersionFromConfig()) { + $source = 'config'; + } elseif ($version = $config->getPHPVersionFromComposerJson()) { + $source = 'composer'; + } + + if ($version !== null && $source !== null) { + $project_analyzer->setPhpVersion($version, $source); + } + } + + public static function runningInCI(): bool + { + return isset($_SERVER['TRAVIS']) + || isset($_SERVER['CIRCLECI']) + || isset($_SERVER['APPVEYOR']) + || isset($_SERVER['JENKINS_URL']) + || isset($_SERVER['SCRUTINIZER']) + || isset($_SERVER['GITLAB_CI']) + || isset($_SERVER['GITHUB_WORKFLOW']) + || isset($_SERVER['DRONE']); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php new file mode 100644 index 00000000..36c92713 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php @@ -0,0 +1,1644 @@ + + * + * @psalm-type FileMapType = array{ + * 0: TaggedCodeType, + * 1: TaggedCodeType, + * 2: array + * } + * + * @psalm-type WorkerData = array{ + * issues: array>, + * fixable_issue_counts: array, + * nonmethod_references_to_classes: array>, + * method_references_to_classes: array>, + * file_references_to_class_members: array>, + * file_references_to_class_properties: array>, + * file_references_to_method_returns: array>, + * file_references_to_missing_class_members: array>, + * mixed_counts: array, + * mixed_member_names: array>, + * function_timings: array, + * file_manipulations: array, + * method_references_to_class_members: array>, + * method_dependencies: array>, + * method_references_to_method_returns: array>, + * method_references_to_class_properties: array>, + * method_references_to_missing_class_members: array>, + * method_param_uses: array>>, + * analyzed_methods: array>, + * file_maps: array, + * class_locations: array>, + * class_method_locations: array>, + * class_property_locations: array>, + * possible_method_param_types: array>, + * taint_data: ?TaintFlowGraph, + * unused_suppressions: array>, + * used_suppressions: array>, + * function_docblock_manipulators: array>, + * mutable_classes: array, + * } + */ + +/** + * @internal + * + * Called in the analysis phase of Psalm's execution + */ +class Analyzer +{ + /** + * @var Config + */ + private $config; + + /** + * @var FileProvider + */ + private $file_provider; + + /** + * @var FileStorageProvider + */ + private $file_storage_provider; + + /** + * @var Progress + */ + private $progress; + + /** + * Used to store counts of mixed vs non-mixed variables + * + * @var array + */ + private $mixed_counts = []; + + /** + * Used to store member names of mixed property/method access + * + * @var array> + */ + private $mixed_member_names = []; + + /** + * @var bool + */ + private $count_mixed = true; + + /** + * Used to store debug performance data + * + * @var array + */ + private $function_timings = []; + + /** + * We analyze more files than we necessarily report errors in + * + * @var array + */ + private $files_to_analyze = []; + + /** + * We can show analysis results on more files than we analyze + * because the results can be cached + * + * @var array + */ + private $files_with_analysis_results = []; + + /** + * We may update fewer files than we analyse (i.e. for dead code detection) + * + * @var array|null + */ + private $files_to_update; + + /** + * @var array> + */ + private $analyzed_methods = []; + + /** + * @var array> + */ + private $existing_issues = []; + + /** + * @var array> + */ + private $reference_map = []; + + /** + * @var array> + */ + private $type_map = []; + + /** + * @var array> + */ + private $argument_map = []; + + /** + * @var array> + */ + public $possible_method_param_types = []; + + /** + * @var array + */ + public $mutable_classes = []; + + public function __construct( + Config $config, + FileProvider $file_provider, + FileStorageProvider $file_storage_provider, + Progress $progress + ) { + $this->config = $config; + $this->file_provider = $file_provider; + $this->file_storage_provider = $file_storage_provider; + $this->progress = $progress; + } + + /** + * @param array $files_to_analyze + * + */ + public function addFilesToAnalyze(array $files_to_analyze): void + { + $this->files_to_analyze += $files_to_analyze; + $this->files_with_analysis_results += $files_to_analyze; + } + + /** + * @param array $files_to_analyze + * + */ + public function addFilesToShowResults(array $files_to_analyze): void + { + $this->files_with_analysis_results += $files_to_analyze; + } + + /** + * @param array $files_to_update + * + */ + public function setFilesToUpdate(array $files_to_update): void + { + $this->files_to_update = $files_to_update; + } + + public function canReportIssues(string $file_path): bool + { + return isset($this->files_with_analysis_results[$file_path]); + } + + /** + * @param array> $filetype_analyzers + */ + private function getFileAnalyzer( + ProjectAnalyzer $project_analyzer, + string $file_path, + array $filetype_analyzers + ): FileAnalyzer { + $extension = pathinfo($file_path, PATHINFO_EXTENSION); + + $file_name = $this->config->shortenFileName($file_path); + + if (isset($filetype_analyzers[$extension])) { + $file_analyzer = new $filetype_analyzers[$extension]($project_analyzer, $file_path, $file_name); + } else { + $file_analyzer = new FileAnalyzer($project_analyzer, $file_path, $file_name); + } + + $this->progress->debug('Getting ' . $file_path . "\n"); + + return $file_analyzer; + } + + public function analyzeFiles( + ProjectAnalyzer $project_analyzer, + int $pool_size, + bool $alter_code, + bool $consolidate_analyzed_data = false + ): void { + $this->loadCachedResults($project_analyzer); + + $codebase = $project_analyzer->getCodebase(); + + if ($alter_code) { + $project_analyzer->interpretRefactors(); + } + + $this->files_to_analyze = array_filter( + $this->files_to_analyze, + function (string $file_path): bool { + return $this->file_provider->fileExists($file_path); + } + ); + + $this->doAnalysis($project_analyzer, $pool_size); + + $scanned_files = $codebase->scanner->getScannedFiles(); + + if ($codebase->taint_flow_graph) { + $codebase->taint_flow_graph->connectSinksAndSources(); + } + + $this->progress->finish(); + + if ($consolidate_analyzed_data) { + $project_analyzer->consolidateAnalyzedData(); + } + + foreach (IssueBuffer::getIssuesData() as $file_path => $file_issues) { + $codebase->file_reference_provider->clearExistingIssuesForFile($file_path); + + foreach ($file_issues as $issue_data) { + $codebase->file_reference_provider->addIssue($file_path, $issue_data); + } + } + + $codebase->file_reference_provider->updateReferenceCache($codebase, $scanned_files); + + if ($codebase->track_unused_suppressions) { + IssueBuffer::processUnusedSuppressions($codebase->file_provider); + } + + $codebase->file_reference_provider->setAnalyzedMethods($this->analyzed_methods); + $codebase->file_reference_provider->setFileMaps($this->getFileMaps()); + $codebase->file_reference_provider->setTypeCoverage($this->mixed_counts); + $codebase->file_reference_provider->updateReferenceCache($codebase, $scanned_files); + + if ($codebase->diff_methods) { + $codebase->statements_provider->resetDiffs(); + } + + if ($alter_code) { + $this->progress->startAlteringFiles(); + + $project_analyzer->prepareMigration(); + + $files_to_update = $this->files_to_update ?? $this->files_to_analyze; + + foreach ($files_to_update as $file_path) { + $this->updateFile($file_path, $project_analyzer->dry_run); + } + + $project_analyzer->migrateCode(); + } + } + + private function doAnalysis(ProjectAnalyzer $project_analyzer, int $pool_size): void + { + $this->progress->start(count($this->files_to_analyze)); + + ksort($this->files_to_analyze); + + $codebase = $project_analyzer->getCodebase(); + + $filetype_analyzers = $this->config->getFiletypeAnalyzers(); + + $analysis_worker = + /** + * @return list + */ + function (int $_, string $file_path) use ($project_analyzer, $filetype_analyzers): array { + $file_analyzer = $this->getFileAnalyzer($project_analyzer, $file_path, $filetype_analyzers); + + $this->progress->debug('Analyzing ' . $file_analyzer->getFilePath() . "\n"); + + $file_analyzer->analyze(); + $file_analyzer->context = null; + $file_analyzer->clearSourceBeforeDestruction(); + unset($file_analyzer); + + return IssueBuffer::getIssuesDataForFile($file_path); + }; + + $task_done_closure = + /** + * @param array $issues + */ + function (array $issues): void { + $has_error = false; + $has_info = false; + + foreach ($issues as $issue) { + if ($issue->severity === 'error') { + $has_error = true; + break; + } + + if ($issue->severity === 'info') { + $has_info = true; + } + } + + $this->progress->taskDone($has_error ? 2 : ($has_info ? 1 : 0)); + }; + + if ($pool_size > 1 && count($this->files_to_analyze) > $pool_size) { + $shuffle_count = $pool_size + 1; + + $file_paths = array_values($this->files_to_analyze); + + $count = count($file_paths); + $middle = intdiv($count, $shuffle_count); + $remainder = $count % $shuffle_count; + + $new_file_paths = []; + + for ($i = 0; $i < $shuffle_count; $i++) { + for ($j = 0; $j < $middle; $j++) { + if ($j * $shuffle_count + $i < $count) { + $new_file_paths[] = $file_paths[$j * $shuffle_count + $i]; + } + } + + if ($remainder) { + $new_file_paths[] = $file_paths[$middle * $shuffle_count + $remainder - 1]; + $remainder--; + } + } + + $process_file_paths = []; + + $i = 0; + + foreach ($new_file_paths as $file_path) { + $process_file_paths[$i % $pool_size][] = $file_path; + ++$i; + } + + // Run analysis one file at a time, splitting the set of + // files up among a given number of child processes. + $pool = new Pool( + $this->config, + $process_file_paths, + function (): void { + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + + $file_reference_provider = $codebase->file_reference_provider; + + if ($codebase->taint_flow_graph) { + $codebase->taint_flow_graph = new TaintFlowGraph(); + } + + $file_reference_provider->setNonMethodReferencesToClasses([]); + $file_reference_provider->setCallingMethodReferencesToClassMembers([]); + $file_reference_provider->setCallingMethodReferencesToClassProperties([]); + $file_reference_provider->setFileReferencesToClassMembers([]); + $file_reference_provider->setFileReferencesToClassProperties([]); + $file_reference_provider->setCallingMethodReferencesToMissingClassMembers([]); + $file_reference_provider->setFileReferencesToMissingClassMembers([]); + $file_reference_provider->setReferencesToMixedMemberNames([]); + $file_reference_provider->setMethodParamUses([]); + }, + $analysis_worker, + /** @return WorkerData */ + function () { + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + $analyzer = $codebase->analyzer; + $file_reference_provider = $codebase->file_reference_provider; + + $this->progress->debug('Gathering data for forked process' . "\n"); + + // @codingStandardsIgnoreStart + return [ + 'issues' => IssueBuffer::getIssuesData(), + 'fixable_issue_counts' => IssueBuffer::getFixableIssues(), + 'nonmethod_references_to_classes' => $file_reference_provider->getAllNonMethodReferencesToClasses(), + 'method_references_to_classes' => $file_reference_provider->getAllMethodReferencesToClasses(), + 'file_references_to_class_members' => $file_reference_provider->getAllFileReferencesToClassMembers(), + 'method_references_to_class_members' => $file_reference_provider->getAllMethodReferencesToClassMembers(), + 'method_dependencies' => $file_reference_provider->getAllMethodDependencies(), + 'file_references_to_class_properties' => $file_reference_provider->getAllFileReferencesToClassProperties(), + 'file_references_to_method_returns' => $file_reference_provider->getAllFileReferencesToMethodReturns(), + 'method_references_to_class_properties' => $file_reference_provider->getAllMethodReferencesToClassProperties(), + 'method_references_to_method_returns' => $file_reference_provider->getAllMethodReferencesToMethodReturns(), + 'file_references_to_missing_class_members' => $file_reference_provider->getAllFileReferencesToMissingClassMembers(), + 'method_references_to_missing_class_members' => $file_reference_provider->getAllMethodReferencesToMissingClassMembers(), + 'method_param_uses' => $file_reference_provider->getAllMethodParamUses(), + 'mixed_member_names' => $analyzer->getMixedMemberNames(), + 'file_manipulations' => FileManipulationBuffer::getAll(), + 'mixed_counts' => $analyzer->getMixedCounts(), + 'function_timings' => $analyzer->getFunctionTimings(), + 'analyzed_methods' => $analyzer->getAnalyzedMethods(), + 'file_maps' => $analyzer->getFileMaps(), + 'class_locations' => $file_reference_provider->getAllClassLocations(), + 'class_method_locations' => $file_reference_provider->getAllClassMethodLocations(), + 'class_property_locations' => $file_reference_provider->getAllClassPropertyLocations(), + 'possible_method_param_types' => $analyzer->getPossibleMethodParamTypes(), + 'taint_data' => $codebase->taint_flow_graph, + 'unused_suppressions' => $codebase->track_unused_suppressions ? IssueBuffer::getUnusedSuppressions() : [], + 'used_suppressions' => $codebase->track_unused_suppressions ? IssueBuffer::getUsedSuppressions() : [], + 'function_docblock_manipulators' => FunctionDocblockManipulator::getManipulators(), + 'mutable_classes' => $codebase->analyzer->mutable_classes, + ]; + // @codingStandardsIgnoreEnd + }, + $task_done_closure + ); + + $this->progress->debug('Forking analysis' . "\n"); + + // Wait for all tasks to complete and collect the results. + /** + * @var array + */ + $forked_pool_data = $pool->wait(); + + $this->progress->debug('Collecting forked analysis results' . "\n"); + + foreach ($forked_pool_data as $pool_data) { + IssueBuffer::addIssues($pool_data['issues']); + IssueBuffer::addFixableIssues($pool_data['fixable_issue_counts']); + + if ($codebase->track_unused_suppressions) { + IssueBuffer::addUnusedSuppressions($pool_data['unused_suppressions']); + IssueBuffer::addUsedSuppressions($pool_data['used_suppressions']); + } + + if ($codebase->taint_flow_graph && $pool_data['taint_data']) { + $codebase->taint_flow_graph->addGraph($pool_data['taint_data']); + } + + $codebase->file_reference_provider->addNonMethodReferencesToClasses( + $pool_data['nonmethod_references_to_classes'] + ); + $codebase->file_reference_provider->addMethodReferencesToClasses( + $pool_data['method_references_to_classes'] + ); + $codebase->file_reference_provider->addFileReferencesToClassMembers( + $pool_data['file_references_to_class_members'] + ); + $codebase->file_reference_provider->addFileReferencesToClassProperties( + $pool_data['file_references_to_class_properties'] + ); + $codebase->file_reference_provider->addFileReferencesToMethodReturns( + $pool_data['file_references_to_method_returns'] + ); + $codebase->file_reference_provider->addMethodReferencesToClassMembers( + $pool_data['method_references_to_class_members'] + ); + $codebase->file_reference_provider->addMethodDependencies( + $pool_data['method_dependencies'] + ); + $codebase->file_reference_provider->addMethodReferencesToClassProperties( + $pool_data['method_references_to_class_properties'] + ); + $codebase->file_reference_provider->addMethodReferencesToMethodReturns( + $pool_data['method_references_to_method_returns'] + ); + $codebase->file_reference_provider->addFileReferencesToMissingClassMembers( + $pool_data['file_references_to_missing_class_members'] + ); + $codebase->file_reference_provider->addMethodReferencesToMissingClassMembers( + $pool_data['method_references_to_missing_class_members'] + ); + $codebase->file_reference_provider->addMethodParamUses( + $pool_data['method_param_uses'] + ); + $this->addMixedMemberNames( + $pool_data['mixed_member_names'] + ); + $this->function_timings += $pool_data['function_timings']; + $codebase->file_reference_provider->addClassLocations( + $pool_data['class_locations'] + ); + $codebase->file_reference_provider->addClassMethodLocations( + $pool_data['class_method_locations'] + ); + $codebase->file_reference_provider->addClassPropertyLocations( + $pool_data['class_property_locations'] + ); + + $this->mutable_classes = array_merge($this->mutable_classes, $pool_data['mutable_classes']); + + FunctionDocblockManipulator::addManipulators($pool_data['function_docblock_manipulators']); + + $this->analyzed_methods = array_merge($pool_data['analyzed_methods'], $this->analyzed_methods); + + foreach ($pool_data['mixed_counts'] as $file_path => [$mixed_count, $nonmixed_count]) { + if (!isset($this->mixed_counts[$file_path])) { + $this->mixed_counts[$file_path] = [$mixed_count, $nonmixed_count]; + } else { + $this->mixed_counts[$file_path][0] += $mixed_count; + $this->mixed_counts[$file_path][1] += $nonmixed_count; + } + } + + foreach ($pool_data['possible_method_param_types'] as $declaring_method_id => $possible_param_types) { + if (!isset($this->possible_method_param_types[$declaring_method_id])) { + $this->possible_method_param_types[$declaring_method_id] = $possible_param_types; + } else { + foreach ($possible_param_types as $offset => $possible_param_type) { + $this->possible_method_param_types[$declaring_method_id][$offset] + = Type::combineUnionTypes( + $this->possible_method_param_types[$declaring_method_id][$offset] ?? null, + $possible_param_type, + $codebase + ); + } + } + } + + foreach ($pool_data['file_manipulations'] as $file_path => $manipulations) { + FileManipulationBuffer::add($file_path, $manipulations); + } + + foreach ($pool_data['file_maps'] as $file_path => $file_maps) { + [$reference_map, $type_map, $argument_map] = $file_maps; + $this->reference_map[$file_path] = $reference_map; + $this->type_map[$file_path] = $type_map; + $this->argument_map[$file_path] = $argument_map; + } + } + + if ($pool->didHaveError()) { + exit(1); + } + } else { + $i = 0; + + foreach ($this->files_to_analyze as $file_path => $_) { + $analysis_worker($i, $file_path); + ++$i; + + $issues = IssueBuffer::getIssuesDataForFile($file_path); + $task_done_closure($issues); + } + } + } + + /** + * @psalm-suppress ComplexMethod + */ + public function loadCachedResults(ProjectAnalyzer $project_analyzer): void + { + $codebase = $project_analyzer->getCodebase(); + + if ($codebase->diff_methods) { + $this->analyzed_methods = $codebase->file_reference_provider->getAnalyzedMethods(); + $this->existing_issues = $codebase->file_reference_provider->getExistingIssues(); + $file_maps = $codebase->file_reference_provider->getFileMaps(); + + foreach ($file_maps as $file_path => [$reference_map, $type_map, $argument_map]) { + $this->reference_map[$file_path] = $reference_map; + $this->type_map[$file_path] = $type_map; + $this->argument_map[$file_path] = $argument_map; + } + } + + $statements_provider = $codebase->statements_provider; + $file_reference_provider = $codebase->file_reference_provider; + + $changed_members = $statements_provider->getChangedMembers(); + $unchanged_signature_members = $statements_provider->getUnchangedSignatureMembers(); + $errored_files = $statements_provider->getErrors(); + + $diff_map = $statements_provider->getDiffMap(); + $deletion_ranges = $statements_provider->getDeletionRanges(); + + $method_references_to_class_members = $file_reference_provider->getAllMethodReferencesToClassMembers(); + + $method_dependencies = $file_reference_provider->getAllMethodDependencies(); + + $method_references_to_class_properties = $file_reference_provider->getAllMethodReferencesToClassProperties(); + + $method_references_to_method_returns = $file_reference_provider->getAllMethodReferencesToMethodReturns(); + + $method_references_to_missing_class_members = + $file_reference_provider->getAllMethodReferencesToMissingClassMembers(); + + $all_referencing_methods = $method_references_to_class_members + + $method_references_to_missing_class_members + + $method_dependencies; + + $nonmethod_references_to_classes = $file_reference_provider->getAllNonMethodReferencesToClasses(); + + $method_references_to_classes = $file_reference_provider->getAllMethodReferencesToClasses(); + + $method_param_uses = $file_reference_provider->getAllMethodParamUses(); + + $file_references_to_class_members = $file_reference_provider->getAllFileReferencesToClassMembers(); + + $file_references_to_class_properties = $file_reference_provider->getAllFileReferencesToClassProperties(); + + $file_references_to_method_returns = $file_reference_provider->getAllFileReferencesToMethodReturns(); + + $file_references_to_missing_class_members + = $file_reference_provider->getAllFileReferencesToMissingClassMembers(); + + $references_to_mixed_member_names = $file_reference_provider->getAllReferencesToMixedMemberNames(); + + $this->mixed_counts = $file_reference_provider->getTypeCoverage(); + + foreach ($changed_members as $file_path => $members_by_file) { + foreach ($members_by_file as $changed_member => $_) { + if (!strpos($changed_member, '&')) { + continue; + } + + [$base_class, $trait] = explode('&', $changed_member); + + foreach ($all_referencing_methods as $member_id => $_) { + if (strpos($member_id, $base_class . '::') !== 0) { + continue; + } + + $member_bit = substr($member_id, strlen($base_class) + 2); + + if (isset($all_referencing_methods[$trait . '::' . $member_bit])) { + $changed_members[$file_path][$member_id] = true; + } + } + } + } + + $newly_invalidated_methods = []; + + foreach ($unchanged_signature_members as $file_unchanged_signature_members) { + $newly_invalidated_methods = array_merge($newly_invalidated_methods, $file_unchanged_signature_members); + + foreach ($file_unchanged_signature_members as $unchanged_signature_member_id => $_) { + // also check for things that might invalidate constructor property initialisation + if (isset($all_referencing_methods[$unchanged_signature_member_id])) { + foreach ($all_referencing_methods[$unchanged_signature_member_id] as $referencing_method_id => $_) { + if (substr($referencing_method_id, -13) === '::__construct') { + $referencing_base_classlike = explode('::', $referencing_method_id)[0]; + $unchanged_signature_classlike = explode('::', $unchanged_signature_member_id)[0]; + + if ($referencing_base_classlike === $unchanged_signature_classlike) { + $newly_invalidated_methods[$referencing_method_id] = true; + } else { + try { + $referencing_storage = $codebase->classlike_storage_provider->get( + $referencing_base_classlike + ); + } catch (InvalidArgumentException $_) { + // Workaround for #3671 + $newly_invalidated_methods[$referencing_method_id] = true; + $referencing_storage = null; + } + + if (isset($referencing_storage->used_traits[$unchanged_signature_classlike]) + || isset($referencing_storage->parent_classes[$unchanged_signature_classlike]) + ) { + $newly_invalidated_methods[$referencing_method_id] = true; + } + } + } + } + } + } + } + + foreach ($changed_members as $file_changed_members) { + foreach ($file_changed_members as $member_id => $_) { + $newly_invalidated_methods[$member_id] = true; + + if (isset($all_referencing_methods[$member_id])) { + $newly_invalidated_methods = array_merge( + $all_referencing_methods[$member_id], + $newly_invalidated_methods + ); + } + + unset( + $method_references_to_class_members[$member_id], + $method_dependencies[$member_id], + $method_references_to_class_properties[$member_id], + $method_references_to_method_returns[$member_id], + $file_references_to_class_members[$member_id], + $file_references_to_class_properties[$member_id], + $file_references_to_method_returns[$member_id], + $method_references_to_missing_class_members[$member_id], + $file_references_to_missing_class_members[$member_id], + $references_to_mixed_member_names[$member_id], + $method_param_uses[$member_id] + ); + + $member_stub = preg_replace('/::.*$/', '::*', $member_id); + + if (isset($all_referencing_methods[$member_stub])) { + $newly_invalidated_methods = array_merge( + $all_referencing_methods[$member_stub], + $newly_invalidated_methods + ); + } + } + } + + foreach ($newly_invalidated_methods as $method_id => $_) { + foreach ($method_references_to_class_members as $i => $_) { + unset($method_references_to_class_members[$i][$method_id]); + } + + foreach ($method_dependencies as $i => $_) { + unset($method_dependencies[$i][$method_id]); + } + + foreach ($method_references_to_class_properties as $i => $_) { + unset($method_references_to_class_properties[$i][$method_id]); + } + + foreach ($method_references_to_method_returns as $i => $_) { + unset($method_references_to_method_returns[$i][$method_id]); + } + + foreach ($method_references_to_classes as $i => $_) { + unset($method_references_to_classes[$i][$method_id]); + } + + foreach ($method_references_to_missing_class_members as $i => $_) { + unset($method_references_to_missing_class_members[$i][$method_id]); + } + + foreach ($references_to_mixed_member_names as $i => $_) { + unset($references_to_mixed_member_names[$i][$method_id]); + } + + foreach ($method_param_uses as $i => $_) { + foreach ($method_param_uses[$i] as $j => $_) { + unset($method_param_uses[$i][$j][$method_id]); + } + } + } + + foreach ($errored_files as $file_path => $_) { + unset($this->analyzed_methods[$file_path]); + unset($this->existing_issues[$file_path]); + } + + foreach ($this->analyzed_methods as $file_path => $analyzed_methods) { + foreach ($analyzed_methods as $correct_method_id => $_) { + $trait_safe_method_id = $correct_method_id; + + $correct_method_ids = explode('&', $correct_method_id); + + $correct_method_id = $correct_method_ids[0]; + + if (isset($newly_invalidated_methods[$correct_method_id]) + || (isset($correct_method_ids[1]) + && isset($newly_invalidated_methods[$correct_method_ids[1]])) + ) { + unset($this->analyzed_methods[$file_path][$trait_safe_method_id]); + } + } + } + + $this->shiftFileOffsets($diff_map, $deletion_ranges); + + foreach ($this->files_to_analyze as $file_path) { + $file_reference_provider->clearExistingIssuesForFile($file_path); + $file_reference_provider->clearExistingFileMapsForFile($file_path); + + $this->setMixedCountsForFile($file_path, [0, 0]); + + foreach ($file_references_to_class_members as $i => $_) { + unset($file_references_to_class_members[$i][$file_path]); + } + + foreach ($file_references_to_class_properties as $i => $_) { + unset($file_references_to_class_properties[$i][$file_path]); + } + + foreach ($file_references_to_method_returns as $i => $_) { + unset($file_references_to_method_returns[$i][$file_path]); + } + + foreach ($nonmethod_references_to_classes as $i => $_) { + unset($nonmethod_references_to_classes[$i][$file_path]); + } + + foreach ($references_to_mixed_member_names as $i => $_) { + unset($references_to_mixed_member_names[$i][$file_path]); + } + + foreach ($file_references_to_missing_class_members as $i => $_) { + unset($file_references_to_missing_class_members[$i][$file_path]); + } + } + + foreach ($this->existing_issues as $file_path => $issues) { + if (!isset($this->files_to_analyze[$file_path])) { + unset($this->existing_issues[$file_path]); + + if ($this->file_provider->fileExists($file_path)) { + IssueBuffer::addIssues([$file_path => array_values($issues)]); + } + } + } + + $method_references_to_class_members = array_filter( + $method_references_to_class_members + ); + + $method_dependencies = array_filter( + $method_dependencies + ); + + $method_references_to_class_properties = array_filter( + $method_references_to_class_properties + ); + + $method_references_to_method_returns = array_filter( + $method_references_to_method_returns + ); + + $method_references_to_missing_class_members = array_filter( + $method_references_to_missing_class_members + ); + + $file_references_to_class_members = array_filter( + $file_references_to_class_members + ); + + $file_references_to_class_properties = array_filter( + $file_references_to_class_properties + ); + + $file_references_to_method_returns = array_filter( + $file_references_to_method_returns + ); + + $file_references_to_missing_class_members = array_filter( + $file_references_to_missing_class_members + ); + + $references_to_mixed_member_names = array_filter( + $references_to_mixed_member_names + ); + + $nonmethod_references_to_classes = array_filter( + $nonmethod_references_to_classes + ); + + $method_references_to_classes = array_filter( + $method_references_to_classes + ); + + $method_param_uses = array_filter( + $method_param_uses + ); + + $file_reference_provider->setCallingMethodReferencesToClassMembers( + $method_references_to_class_members + ); + + $file_reference_provider->setMethodDependencies( + $method_dependencies + ); + + $file_reference_provider->setCallingMethodReferencesToClassProperties( + $method_references_to_class_properties + ); + + $file_reference_provider->setCallingMethodReferencesToMethodReturns( + $method_references_to_method_returns + ); + + $file_reference_provider->setFileReferencesToClassMembers( + $file_references_to_class_members + ); + + $file_reference_provider->setFileReferencesToClassProperties( + $file_references_to_class_properties + ); + + $file_reference_provider->setFileReferencesToMethodReturns( + $file_references_to_method_returns + ); + + $file_reference_provider->setCallingMethodReferencesToMissingClassMembers( + $method_references_to_missing_class_members + ); + + $file_reference_provider->setFileReferencesToMissingClassMembers( + $file_references_to_missing_class_members + ); + + $file_reference_provider->setReferencesToMixedMemberNames( + $references_to_mixed_member_names + ); + + $file_reference_provider->setCallingMethodReferencesToClasses( + $method_references_to_classes + ); + + $file_reference_provider->setNonMethodReferencesToClasses( + $nonmethod_references_to_classes + ); + + $file_reference_provider->setMethodParamUses( + $method_param_uses + ); + } + + /** + * @param array> $diff_map + * @param array> $deletion_ranges + */ + public function shiftFileOffsets(array $diff_map, array $deletion_ranges): void + { + foreach ($this->existing_issues as $file_path => $file_issues) { + if (!isset($this->analyzed_methods[$file_path])) { + continue; + } + + $file_diff_map = $diff_map[$file_path] ?? []; + $file_deletion_ranges = $deletion_ranges[$file_path] ?? []; + + if ($file_deletion_ranges) { + foreach ($file_issues as $i => $issue_data) { + foreach ($file_deletion_ranges as [$from, $to]) { + if ($issue_data->from >= $from + && $issue_data->from <= $to + ) { + unset($this->existing_issues[$file_path][$i]); + break; + } + } + } + } + + if ($file_diff_map) { + foreach ($file_issues as $issue_data) { + foreach ($file_diff_map as [$from, $to, $file_offset, $line_offset]) { + if ($issue_data->from >= $from + && $issue_data->from <= $to + ) { + $issue_data->from += $file_offset; + $issue_data->to += $file_offset; + $issue_data->snippet_from += $file_offset; + $issue_data->snippet_to += $file_offset; + $issue_data->line_from += $line_offset; + $issue_data->line_to += $line_offset; + break; + } + } + } + } + } + + foreach ($this->reference_map as $file_path => $reference_map) { + if (!isset($this->analyzed_methods[$file_path])) { + unset($this->reference_map[$file_path]); + continue; + } + + $file_diff_map = $diff_map[$file_path] ?? []; + $file_deletion_ranges = $deletion_ranges[$file_path] ?? []; + + if ($file_deletion_ranges) { + foreach ($reference_map as $reference_from => $_) { + foreach ($file_deletion_ranges as [$from, $to]) { + if ($reference_from >= $from && $reference_from <= $to) { + unset($this->reference_map[$file_path][$reference_from]); + break; + } + } + } + } + + if ($file_diff_map) { + foreach ($reference_map as $reference_from => [$reference_to, $tag]) { + foreach ($file_diff_map as [$from, $to, $file_offset]) { + if ($reference_from >= $from && $reference_from <= $to) { + unset($this->reference_map[$file_path][$reference_from]); + $this->reference_map[$file_path][$reference_from + $file_offset] = [ + $reference_to + $file_offset, + $tag, + ]; + break; + } + } + } + } + } + + foreach ($this->type_map as $file_path => $type_map) { + if (!isset($this->analyzed_methods[$file_path])) { + unset($this->type_map[$file_path]); + continue; + } + + $file_diff_map = $diff_map[$file_path] ?? []; + $file_deletion_ranges = $deletion_ranges[$file_path] ?? []; + + if ($file_deletion_ranges) { + foreach ($type_map as $type_from => $_) { + foreach ($file_deletion_ranges as [$from, $to]) { + if ($type_from >= $from && $type_from <= $to) { + unset($this->type_map[$file_path][$type_from]); + break; + } + } + } + } + + if ($file_diff_map) { + foreach ($type_map as $type_from => [$type_to, $tag]) { + foreach ($file_diff_map as [$from, $to, $file_offset]) { + if ($type_from >= $from && $type_from <= $to) { + unset($this->type_map[$file_path][$type_from]); + $this->type_map[$file_path][$type_from + $file_offset] = [ + $type_to + $file_offset, + $tag, + ]; + break; + } + } + } + } + } + + foreach ($this->argument_map as $file_path => $argument_map) { + if (!isset($this->analyzed_methods[$file_path])) { + unset($this->argument_map[$file_path]); + continue; + } + + $file_diff_map = $diff_map[$file_path] ?? []; + $file_deletion_ranges = $deletion_ranges[$file_path] ?? []; + + if ($file_deletion_ranges) { + foreach ($argument_map as $argument_from => $_) { + foreach ($file_deletion_ranges as [$from, $to]) { + if ($argument_from >= $from && $argument_from <= $to) { + unset($argument_map[$argument_from]); + break; + } + } + } + } + + if ($file_diff_map) { + foreach ($argument_map as $argument_from => [$argument_to, $method_id, $argument_number]) { + foreach ($file_diff_map as [$from, $to, $file_offset]) { + if ($argument_from >= $from && $argument_from <= $to) { + unset($this->argument_map[$file_path][$argument_from]); + $this->argument_map[$file_path][$argument_from + $file_offset] = [ + $argument_to + $file_offset, + $method_id, + $argument_number, + ]; + break; + } + } + } + } + } + } + + /** + * @return array> + */ + public function getMixedMemberNames(): array + { + return $this->mixed_member_names; + } + + public function addMixedMemberName(string $member_id, string $reference): void + { + $this->mixed_member_names[$member_id][$reference] = true; + } + + public function hasMixedMemberName(string $member_id): bool + { + return isset($this->mixed_member_names[$member_id]); + } + + /** + * @param array> $names + * + */ + public function addMixedMemberNames(array $names): void + { + foreach ($names as $key => $name) { + if (isset($this->mixed_member_names[$key])) { + $this->mixed_member_names[$key] = array_merge( + $this->mixed_member_names[$key], + $name + ); + } else { + $this->mixed_member_names[$key] = $name; + } + } + } + + /** + * @return array{0:int, 1:int} + */ + public function getMixedCountsForFile(string $file_path): array + { + if (!isset($this->mixed_counts[$file_path])) { + $this->mixed_counts[$file_path] = [0, 0]; + } + + return $this->mixed_counts[$file_path]; + } + + /** + * @param array{0:int, 1:int} $mixed_counts + * + */ + public function setMixedCountsForFile(string $file_path, array $mixed_counts): void + { + $this->mixed_counts[$file_path] = $mixed_counts; + } + + public function incrementMixedCount(string $file_path): void + { + if (!$this->count_mixed) { + return; + } + + if (!isset($this->mixed_counts[$file_path])) { + $this->mixed_counts[$file_path] = [0, 0]; + } + + ++$this->mixed_counts[$file_path][0]; + } + + public function decrementMixedCount(string $file_path): void + { + if (!$this->count_mixed) { + return; + } + + if (!isset($this->mixed_counts[$file_path])) { + return; + } + + if ($this->mixed_counts[$file_path][0] === 0) { + return; + } + + --$this->mixed_counts[$file_path][0]; + } + + public function incrementNonMixedCount(string $file_path): void + { + if (!$this->count_mixed) { + return; + } + + if (!isset($this->mixed_counts[$file_path])) { + $this->mixed_counts[$file_path] = [0, 0]; + } + + ++$this->mixed_counts[$file_path][1]; + } + + /** + * @return array + */ + public function getMixedCounts(): array + { + $all_deep_scanned_files = []; + + foreach ($this->files_to_analyze as $file_path => $_) { + $all_deep_scanned_files[$file_path] = true; + } + + return array_intersect_key($this->mixed_counts, $all_deep_scanned_files); + } + + /** + * @return array + */ + public function getFunctionTimings(): array + { + return $this->function_timings; + } + + public function addFunctionTiming(string $function_id, float $time_per_node): void + { + $this->function_timings[$function_id] = $time_per_node; + } + + public function addNodeType( + string $file_path, + PhpParser\Node $node, + string $node_type, + PhpParser\Node $parent_node = null + ): void { + if ($node_type === '') { + throw new UnexpectedValueException('non-empty node_type expected'); + } + + $this->type_map[$file_path][(int)$node->getAttribute('startFilePos')] = [ + ($parent_node ? (int)$parent_node->getAttribute('endFilePos') : (int)$node->getAttribute('endFilePos')) + 1, + $node_type, + ]; + } + + public function addNodeArgument( + string $file_path, + int $start_position, + int $end_position, + string $reference, + int $argument_number + ): void { + if ($reference === '') { + throw new UnexpectedValueException('non-empty reference expected'); + } + + $this->argument_map[$file_path][$start_position] = [ + $end_position, + $reference, + $argument_number, + ]; + } + + /** + * @param string $reference The symbol name for the reference. + * Prepend with an asterisk (*) to signify a reference that doesn't exist. + */ + public function addNodeReference(string $file_path, PhpParser\Node $node, string $reference): void + { + if (!$reference) { + throw new UnexpectedValueException('non-empty node_type expected'); + } + + $this->reference_map[$file_path][(int)$node->getAttribute('startFilePos')] = [ + (int)$node->getAttribute('endFilePos') + 1, + $reference, + ]; + } + + public function addOffsetReference(string $file_path, int $start, int $end, string $reference): void + { + if (!$reference) { + throw new UnexpectedValueException('non-empty node_type expected'); + } + + $this->reference_map[$file_path][$start] = [ + $end, + $reference, + ]; + } + + /** + * @return array{int, int} + */ + public function getTotalTypeCoverage(Codebase $codebase): array + { + $mixed_count = 0; + $nonmixed_count = 0; + + foreach ($codebase->file_reference_provider->getTypeCoverage() as $file_path => $counts) { + if (!$this->config->reportTypeStatsForFile($file_path)) { + continue; + } + + [$path_mixed_count, $path_nonmixed_count] = $counts; + + if (isset($this->mixed_counts[$file_path])) { + $mixed_count += $path_mixed_count; + $nonmixed_count += $path_nonmixed_count; + } + } + + return [$mixed_count, $nonmixed_count]; + } + + public function getTypeInferenceSummary(Codebase $codebase): string + { + $all_deep_scanned_files = []; + + foreach ($this->files_to_analyze as $file_path => $_) { + $all_deep_scanned_files[$file_path] = true; + + foreach ($this->file_storage_provider->get($file_path)->required_file_paths as $required_file_path) { + $all_deep_scanned_files[$required_file_path] = true; + } + } + + [$mixed_count, $nonmixed_count] = $this->getTotalTypeCoverage($codebase); + + $total = $mixed_count + $nonmixed_count; + + $total_files = count($all_deep_scanned_files); + + $lines = []; + + if (!$total_files) { + $lines[] = 'No files analyzed'; + } + + if (!$total) { + $lines[] = 'Psalm was unable to infer types in the codebase'; + } else { + $percentage = $nonmixed_count === $total ? '100' : number_format(100 * $nonmixed_count / $total, 4); + $lines[] = 'Psalm was able to infer types for ' . $percentage . '%' + . ' of the codebase'; + } + + return implode("\n", $lines); + } + + public function getNonMixedStats(): string + { + $stats = ''; + + $all_deep_scanned_files = []; + + foreach ($this->files_to_analyze as $file_path => $_) { + $all_deep_scanned_files[$file_path] = true; + + if (!$this->config->reportTypeStatsForFile($file_path)) { + continue; + } + + foreach ($this->file_storage_provider->get($file_path)->required_file_paths as $required_file_path) { + $all_deep_scanned_files[$required_file_path] = true; + } + } + + foreach ($all_deep_scanned_files as $file_path => $_) { + if (isset($this->mixed_counts[$file_path])) { + [$path_mixed_count, $path_nonmixed_count] = $this->mixed_counts[$file_path]; + + if ($path_mixed_count + $path_nonmixed_count) { + $stats .= number_format(100 * $path_nonmixed_count / ($path_mixed_count + $path_nonmixed_count), 3) + . '% ' . $this->config->shortenFileName($file_path) + . ' (' . $path_mixed_count . ' mixed)' . "\n"; + } + } + } + + return $stats; + } + + public function disableMixedCounts(): void + { + $this->count_mixed = false; + } + + public function enableMixedCounts(): void + { + $this->count_mixed = true; + } + + public function updateFile(string $file_path, bool $dry_run): void + { + FileManipulationBuffer::add( + $file_path, + FunctionDocblockManipulator::getManipulationsForFile($file_path) + ); + + FileManipulationBuffer::add( + $file_path, + PropertyDocblockManipulator::getManipulationsForFile($file_path) + ); + + FileManipulationBuffer::add( + $file_path, + ClassDocblockManipulator::getManipulationsForFile($file_path) + ); + + $file_manipulations = FileManipulationBuffer::getManipulationsForFile($file_path); + + if (!$file_manipulations) { + return; + } + + usort( + $file_manipulations, + function (FileManipulation $a, FileManipulation $b): int { + if ($b->end === $a->end) { + if ($a->start === $b->start) { + return $b->insertion_text > $a->insertion_text ? 1 : -1; + } + + return $b->start > $a->start ? 1 : -1; + } + + return $b->end > $a->end ? 1 : -1; + } + ); + + $last_start = PHP_INT_MAX; + $existing_contents = $this->file_provider->getContents($file_path); + + foreach ($file_manipulations as $manipulation) { + if ($manipulation->start <= $last_start) { + $existing_contents = $manipulation->transform($existing_contents); + $last_start = $manipulation->start; + } + } + + if ($dry_run) { + echo $file_path . ':' . "\n"; + + $differ = new Differ( + new StrictUnifiedDiffOutputBuilder([ + 'fromFile' => $file_path, + 'toFile' => $file_path, + ]) + ); + + echo $differ->diff($this->file_provider->getContents($file_path), $existing_contents); + + return; + } + + $this->progress->alterFileDone($file_path); + + $this->file_provider->setContents($file_path, $existing_contents); + } + + /** + * @return list + */ + public function getExistingIssuesForFile(string $file_path, int $start, int $end, ?string $issue_type = null): array + { + if (!isset($this->existing_issues[$file_path])) { + return []; + } + + $applicable_issues = []; + + foreach ($this->existing_issues[$file_path] as $issue_data) { + if ($issue_data->from >= $start && $issue_data->from <= $end) { + if ($issue_type === null || $issue_type === $issue_data->type) { + $applicable_issues[] = $issue_data; + } + } + } + + return $applicable_issues; + } + + public function removeExistingDataForFile(string $file_path, int $start, int $end, ?string $issue_type = null): void + { + if (isset($this->existing_issues[$file_path])) { + foreach ($this->existing_issues[$file_path] as $i => $issue_data) { + if ($issue_data->from >= $start && $issue_data->from <= $end) { + if ($issue_type === null || $issue_type === $issue_data->type) { + unset($this->existing_issues[$file_path][$i]); + } + } + } + } + + if (isset($this->type_map[$file_path])) { + foreach ($this->type_map[$file_path] as $map_start => $_) { + if ($map_start >= $start && $map_start <= $end) { + unset($this->type_map[$file_path][$map_start]); + } + } + } + + if (isset($this->reference_map[$file_path])) { + foreach ($this->reference_map[$file_path] as $map_start => $_) { + if ($map_start >= $start && $map_start <= $end) { + unset($this->reference_map[$file_path][$map_start]); + } + } + } + + if (isset($this->argument_map[$file_path])) { + foreach ($this->argument_map[$file_path] as $map_start => $_) { + if ($map_start >= $start && $map_start <= $end) { + unset($this->argument_map[$file_path][$map_start]); + } + } + } + } + + /** + * @return array> + */ + public function getAnalyzedMethods(): array + { + return $this->analyzed_methods; + } + + /** + * @return array + */ + public function getFileMaps(): array + { + $file_maps = []; + + foreach ($this->reference_map as $file_path => $reference_map) { + $file_maps[$file_path] = [$reference_map, [], []]; + } + + foreach ($this->type_map as $file_path => $type_map) { + if (isset($file_maps[$file_path])) { + $file_maps[$file_path][1] = $type_map; + } else { + $file_maps[$file_path] = [[], $type_map, []]; + } + } + + foreach ($this->argument_map as $file_path => $argument_map) { + if (isset($file_maps[$file_path])) { + $file_maps[$file_path][2] = $argument_map; + } else { + $file_maps[$file_path] = [[], [], $argument_map]; + } + } + + return $file_maps; + } + + /** + * @return FileMapType + */ + public function getMapsForFile(string $file_path): array + { + return [ + $this->reference_map[$file_path] ?? [], + $this->type_map[$file_path] ?? [], + $this->argument_map[$file_path] ?? [], + ]; + } + + /** + * @return array> + */ + public function getPossibleMethodParamTypes(): array + { + return $this->possible_method_param_types; + } + + public function addMutableClass(string $fqcln): void + { + $this->mutable_classes[strtolower($fqcln)] = true; + } + + public function setAnalyzedMethod(string $file_path, string $method_id, bool $is_constructor = false): void + { + $this->analyzed_methods[$file_path][$method_id] = $is_constructor ? 2 : 1; + } + + public function isMethodAlreadyAnalyzed(string $file_path, string $method_id, bool $is_constructor = false): bool + { + if ($is_constructor) { + return isset($this->analyzed_methods[$file_path][$method_id]) + && $this->analyzed_methods[$file_path][$method_id] === 2; + } + + return isset($this->analyzed_methods[$file_path][$method_id]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php new file mode 100644 index 00000000..d3863440 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php @@ -0,0 +1,61 @@ +codebase = $codebase; + } + + /** + * @return list|null + */ + public function resolve(string $class_name, string $constant_pattern): ?array + { + if (!$this->codebase->classlike_storage_provider->has($class_name)) { + return null; + } + + $constant_regex_pattern = sprintf('#^%s$#', str_replace('*', '.*', $constant_pattern)); + + $class_like_storage = $this->codebase->classlike_storage_provider->get($class_name); + $matched_class_constant_types = []; + + foreach ($class_like_storage->constants as $constant => $class_constant_storage) { + if (preg_match($constant_regex_pattern, $constant) === 0) { + continue; + } + + if (! $class_constant_storage->type) { + $matched_class_constant_types[] = [new TMixed()]; + continue; + } + + $matched_class_constant_types[] = $class_constant_storage->type->getAtomicTypes(); + } + + return array_values(array_merge([], ...$matched_class_constant_types)); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php new file mode 100644 index 00000000..372d1da9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php @@ -0,0 +1,2331 @@ + + */ + private $existing_classlikes_lc = []; + + /** + * @var array + */ + private $existing_classes_lc = []; + + /** + * @var array + */ + private $existing_classes = []; + + /** + * @var array + */ + private $existing_interfaces_lc = []; + + /** + * @var array + */ + private $existing_interfaces = []; + + /** + * @var array + */ + private $existing_traits_lc = []; + + /** + * @var array + */ + private $existing_traits = []; + + /** + * @var array + */ + private $existing_enums_lc = []; + + /** + * @var array + */ + private $existing_enums = []; + + /** + * @var array + */ + private $classlike_aliases = []; + + /** + * @var array + */ + private $trait_nodes = []; + + /** + * @var bool + */ + public $collect_references = false; + + /** + * @var bool + */ + public $collect_locations = false; + + /** + * @var StatementsProvider + */ + private $statements_provider; + + /** + * @var Config + */ + private $config; + + /** + * @var Scanner + */ + private $scanner; + + public function __construct( + Config $config, + ClassLikeStorageProvider $storage_provider, + FileReferenceProvider $file_reference_provider, + StatementsProvider $statements_provider, + Scanner $scanner + ) { + $this->config = $config; + $this->classlike_storage_provider = $storage_provider; + $this->file_reference_provider = $file_reference_provider; + $this->statements_provider = $statements_provider; + $this->scanner = $scanner; + + $this->collectPredefinedClassLikes(); + } + + private function collectPredefinedClassLikes(): void + { + /** @var array */ + $predefined_classes = get_declared_classes(); + + foreach ($predefined_classes as $predefined_class) { + $predefined_class = preg_replace('/^\\\/', '', $predefined_class); + /** @psalm-suppress ArgumentTypeCoercion */ + $reflection_class = new ReflectionClass($predefined_class); + + if (!$reflection_class->isUserDefined()) { + $predefined_class_lc = strtolower($predefined_class); + $this->existing_classlikes_lc[$predefined_class_lc] = true; + $this->existing_classes_lc[$predefined_class_lc] = true; + $this->existing_classes[$predefined_class] = true; + } + } + + /** @var array */ + $predefined_interfaces = get_declared_interfaces(); + + foreach ($predefined_interfaces as $predefined_interface) { + $predefined_interface = preg_replace('/^\\\/', '', $predefined_interface); + /** @psalm-suppress ArgumentTypeCoercion */ + $reflection_class = new ReflectionClass($predefined_interface); + + if (!$reflection_class->isUserDefined()) { + $predefined_interface_lc = strtolower($predefined_interface); + $this->existing_classlikes_lc[$predefined_interface_lc] = true; + $this->existing_interfaces_lc[$predefined_interface_lc] = true; + $this->existing_interfaces[$predefined_interface] = true; + } + } + } + + public function addFullyQualifiedClassName(string $fq_class_name, ?string $file_path = null): void + { + $fq_class_name_lc = strtolower($fq_class_name); + $this->existing_classlikes_lc[$fq_class_name_lc] = true; + $this->existing_classes_lc[$fq_class_name_lc] = true; + $this->existing_classes[$fq_class_name] = true; + + $this->existing_traits_lc[$fq_class_name_lc] = false; + $this->existing_interfaces_lc[$fq_class_name_lc] = false; + $this->existing_enums_lc[$fq_class_name_lc] = false; + + if ($file_path) { + $this->scanner->setClassLikeFilePath($fq_class_name_lc, $file_path); + } + } + + public function addFullyQualifiedInterfaceName(string $fq_class_name, ?string $file_path = null): void + { + $fq_class_name_lc = strtolower($fq_class_name); + $this->existing_classlikes_lc[$fq_class_name_lc] = true; + $this->existing_interfaces_lc[$fq_class_name_lc] = true; + $this->existing_interfaces[$fq_class_name] = true; + + $this->existing_classes_lc[$fq_class_name_lc] = false; + $this->existing_traits_lc[$fq_class_name_lc] = false; + $this->existing_enums_lc[$fq_class_name_lc] = false; + + if ($file_path) { + $this->scanner->setClassLikeFilePath($fq_class_name_lc, $file_path); + } + } + + public function addFullyQualifiedTraitName(string $fq_class_name, ?string $file_path = null): void + { + $fq_class_name_lc = strtolower($fq_class_name); + $this->existing_classlikes_lc[$fq_class_name_lc] = true; + $this->existing_traits_lc[$fq_class_name_lc] = true; + $this->existing_traits[$fq_class_name] = true; + + $this->existing_classes_lc[$fq_class_name_lc] = false; + $this->existing_interfaces_lc[$fq_class_name_lc] = false; + $this->existing_enums[$fq_class_name] = false; + + if ($file_path) { + $this->scanner->setClassLikeFilePath($fq_class_name_lc, $file_path); + } + } + + public function addFullyQualifiedEnumName(string $fq_class_name, ?string $file_path = null): void + { + $fq_class_name_lc = strtolower($fq_class_name); + $this->existing_classlikes_lc[$fq_class_name_lc] = true; + $this->existing_enums_lc[$fq_class_name_lc] = true; + $this->existing_enums[$fq_class_name] = true; + + $this->existing_traits_lc[$fq_class_name_lc] = false; + $this->existing_classes_lc[$fq_class_name_lc] = false; + $this->existing_interfaces_lc[$fq_class_name_lc] = false; + + if ($file_path) { + $this->scanner->setClassLikeFilePath($fq_class_name_lc, $file_path); + } + } + + public function addFullyQualifiedClassLikeName(string $fq_class_name_lc, ?string $file_path = null): void + { + if ($file_path) { + $this->scanner->setClassLikeFilePath($fq_class_name_lc, $file_path); + } + } + + /** + * @return list + */ + public function getMatchingClassLikeNames(string $stub): array + { + $matching_classes = []; + + if ($stub[0] === '*') { + $stub = substr($stub, 1); + } + + $fully_qualified = false; + + if ($stub[0] === '\\') { + $fully_qualified = true; + $stub = substr($stub, 1); + } else { + // for any not-fully-qualified class name the bit we care about comes after a dash + [, $stub] = explode('-', $stub); + } + + $stub = preg_quote(strtolower($stub)); + + if ($fully_qualified) { + $stub = '^' . $stub; + } else { + $stub = '(^|\\\)' . $stub; + } + + foreach ($this->existing_classes as $fq_classlike_name => $found) { + if (!$found) { + continue; + } + + if (preg_match('@' . $stub . '.*@i', $fq_classlike_name)) { + $matching_classes[] = $fq_classlike_name; + } + } + + foreach ($this->existing_interfaces as $fq_classlike_name => $found) { + if (!$found) { + continue; + } + + if (preg_match('@' . $stub . '.*@i', $fq_classlike_name)) { + $matching_classes[] = $fq_classlike_name; + } + } + + return $matching_classes; + } + + public function hasFullyQualifiedClassName( + string $fq_class_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + $fq_class_name_lc = strtolower($this->getUnAliasedName($fq_class_name)); + + if ($code_location) { + if ($calling_method_id) { + $this->file_reference_provider->addMethodReferenceToClass( + $calling_method_id, + $fq_class_name_lc + ); + } elseif (!$calling_fq_class_name || strtolower($calling_fq_class_name) !== $fq_class_name_lc) { + $this->file_reference_provider->addNonMethodReferenceToClass( + $code_location->file_path, + $fq_class_name_lc + ); + + if ($calling_fq_class_name) { + $class_storage = $this->classlike_storage_provider->get($calling_fq_class_name); + + if ($class_storage->location + && $class_storage->location->file_path !== $code_location->file_path + ) { + $this->file_reference_provider->addNonMethodReferenceToClass( + $class_storage->location->file_path, + $fq_class_name_lc + ); + } + } + } + } + + if (!isset($this->existing_classes_lc[$fq_class_name_lc]) + || !$this->existing_classes_lc[$fq_class_name_lc] + || !$this->classlike_storage_provider->has($fq_class_name_lc) + ) { + if (( + !isset($this->existing_classes_lc[$fq_class_name_lc]) + || $this->existing_classes_lc[$fq_class_name_lc] + ) + && !$this->classlike_storage_provider->has($fq_class_name_lc) + ) { + if (!isset($this->existing_classes_lc[$fq_class_name_lc])) { + $this->existing_classes_lc[$fq_class_name_lc] = false; + + return false; + } + + return $this->existing_classes_lc[$fq_class_name_lc]; + } + + return false; + } + + if ($this->collect_locations && $code_location) { + $this->file_reference_provider->addCallingLocationForClass( + $code_location, + strtolower($fq_class_name) + ); + } + + return true; + } + + public function hasFullyQualifiedInterfaceName( + string $fq_class_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + $fq_class_name_lc = strtolower($this->getUnAliasedName($fq_class_name)); + + if (!isset($this->existing_interfaces_lc[$fq_class_name_lc]) + || !$this->existing_interfaces_lc[$fq_class_name_lc] + || !$this->classlike_storage_provider->has($fq_class_name_lc) + ) { + if (( + !isset($this->existing_classes_lc[$fq_class_name_lc]) + || $this->existing_classes_lc[$fq_class_name_lc] + ) + && !$this->classlike_storage_provider->has($fq_class_name_lc) + ) { + if (!isset($this->existing_interfaces_lc[$fq_class_name_lc])) { + $this->existing_interfaces_lc[$fq_class_name_lc] = false; + + return false; + } + + return $this->existing_interfaces_lc[$fq_class_name_lc]; + } + + return false; + } + + if ($this->collect_references && $code_location) { + if ($calling_method_id) { + $this->file_reference_provider->addMethodReferenceToClass( + $calling_method_id, + $fq_class_name_lc + ); + } else { + $this->file_reference_provider->addNonMethodReferenceToClass( + $code_location->file_path, + $fq_class_name_lc + ); + + if ($calling_fq_class_name) { + $class_storage = $this->classlike_storage_provider->get($calling_fq_class_name); + + if ($class_storage->location + && $class_storage->location->file_path !== $code_location->file_path + ) { + $this->file_reference_provider->addNonMethodReferenceToClass( + $class_storage->location->file_path, + $fq_class_name_lc + ); + } + } + } + } + + if ($this->collect_locations && $code_location) { + $this->file_reference_provider->addCallingLocationForClass( + $code_location, + strtolower($fq_class_name) + ); + } + + return true; + } + + public function hasFullyQualifiedEnumName( + string $fq_class_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + $fq_class_name_lc = strtolower($this->getUnAliasedName($fq_class_name)); + + if (!isset($this->existing_enums_lc[$fq_class_name_lc]) + || !$this->existing_enums_lc[$fq_class_name_lc] + || !$this->classlike_storage_provider->has($fq_class_name_lc) + ) { + if (( + !isset($this->existing_classes_lc[$fq_class_name_lc]) + || $this->existing_classes_lc[$fq_class_name_lc] + ) + && !$this->classlike_storage_provider->has($fq_class_name_lc) + ) { + if (!isset($this->existing_enums_lc[$fq_class_name_lc])) { + $this->existing_enums_lc[$fq_class_name_lc] = false; + + return false; + } + + return $this->existing_enums_lc[$fq_class_name_lc]; + } + + return false; + } + + if ($this->collect_references && $code_location) { + if ($calling_method_id) { + $this->file_reference_provider->addMethodReferenceToClass( + $calling_method_id, + $fq_class_name_lc + ); + } else { + $this->file_reference_provider->addNonMethodReferenceToClass( + $code_location->file_path, + $fq_class_name_lc + ); + + if ($calling_fq_class_name) { + $class_storage = $this->classlike_storage_provider->get($calling_fq_class_name); + + if ($class_storage->location + && $class_storage->location->file_path !== $code_location->file_path + ) { + $this->file_reference_provider->addNonMethodReferenceToClass( + $class_storage->location->file_path, + $fq_class_name_lc + ); + } + } + } + } + + if ($this->collect_locations && $code_location) { + $this->file_reference_provider->addCallingLocationForClass( + $code_location, + strtolower($fq_class_name) + ); + } + + return true; + } + + public function hasFullyQualifiedTraitName(string $fq_class_name, ?CodeLocation $code_location = null): bool + { + $fq_class_name_lc = strtolower($this->getUnAliasedName($fq_class_name)); + + if (!isset($this->existing_traits_lc[$fq_class_name_lc]) || + !$this->existing_traits_lc[$fq_class_name_lc] + ) { + return false; + } + + if ($this->collect_references && $code_location) { + $this->file_reference_provider->addNonMethodReferenceToClass( + $code_location->file_path, + $fq_class_name_lc + ); + } + + return true; + } + + /** + * Check whether a class/interface exists + */ + public function classOrInterfaceExists( + string $fq_class_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + return $this->classExists($fq_class_name, $code_location, $calling_fq_class_name, $calling_method_id) + || $this->interfaceExists($fq_class_name, $code_location, $calling_fq_class_name, $calling_method_id); + } + + /** + * Check whether a class/interface exists + */ + public function classOrInterfaceOrEnumExists( + string $fq_class_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + return $this->classExists($fq_class_name, $code_location, $calling_fq_class_name, $calling_method_id) + || $this->interfaceExists($fq_class_name, $code_location, $calling_fq_class_name, $calling_method_id) + || $this->enumExists($fq_class_name, $code_location, $calling_fq_class_name, $calling_method_id); + } + + /** + * Determine whether or not a given class exists + */ + public function classExists( + string $fq_class_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + if (isset(ClassLikeAnalyzer::SPECIAL_TYPES[$fq_class_name])) { + return false; + } + + if ($fq_class_name === 'Generator') { + return true; + } + + return $this->hasFullyQualifiedClassName( + $fq_class_name, + $code_location, + $calling_fq_class_name, + $calling_method_id + ); + } + + /** + * Determine whether or not a class extends a parent + * + * @throws UnpopulatedClasslikeException when called on unpopulated class + * @throws InvalidArgumentException when class does not exist + */ + public function classExtends(string $fq_class_name, string $possible_parent, bool $from_api = false): bool + { + $unaliased_fq_class_name = $this->getUnAliasedName($fq_class_name); + $unaliased_fq_class_name_lc = strtolower($unaliased_fq_class_name); + + if ($unaliased_fq_class_name_lc === 'generator') { + return false; + } + + $class_storage = $this->classlike_storage_provider->get($unaliased_fq_class_name); + + if ($from_api && !$class_storage->populated) { + throw new UnpopulatedClasslikeException($fq_class_name); + } + + return isset($class_storage->parent_classes[strtolower($possible_parent)]); + } + + /** + * Check whether a class implements an interface + */ + public function classImplements(string $fq_class_name, string $interface): bool + { + $interface_id = strtolower($interface); + + $fq_class_name = strtolower($fq_class_name); + + if ($interface_id === 'callable' && $fq_class_name === 'closure') { + return true; + } + + if ($interface_id === 'traversable' && $fq_class_name === 'generator') { + return true; + } + + if ($interface_id === 'traversable' && $fq_class_name === 'iterator') { + return true; + } + + if (isset(ClassLikeAnalyzer::SPECIAL_TYPES[$interface_id]) + || isset(ClassLikeAnalyzer::SPECIAL_TYPES[$fq_class_name]) + ) { + return false; + } + + $fq_class_name = $this->getUnAliasedName($fq_class_name); + + if (!$this->classlike_storage_provider->has($fq_class_name)) { + return false; + } + $class_storage = $this->classlike_storage_provider->get($fq_class_name); + + if (isset($class_storage->class_implements[$interface_id])) { + return true; + } + + foreach ($class_storage->class_implements as $implementing_interface_lc => $_) { + $aliased_interface_lc = strtolower( + $this->getUnAliasedName($implementing_interface_lc) + ); + + if ($aliased_interface_lc === $interface_id) { + return true; + } + } + + return false; + } + + public function interfaceExists( + string $fq_interface_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + if (isset(ClassLikeAnalyzer::SPECIAL_TYPES[strtolower($fq_interface_name)])) { + return false; + } + + return $this->hasFullyQualifiedInterfaceName( + $fq_interface_name, + $code_location, + $calling_fq_class_name, + $calling_method_id + ); + } + + public function enumExists( + string $fq_enum_name, + ?CodeLocation $code_location = null, + ?string $calling_fq_class_name = null, + ?string $calling_method_id = null + ): bool { + if (isset(ClassLikeAnalyzer::SPECIAL_TYPES[strtolower($fq_enum_name)])) { + return false; + } + + return $this->hasFullyQualifiedEnumName( + $fq_enum_name, + $code_location, + $calling_fq_class_name, + $calling_method_id + ); + } + + public function interfaceExtends(string $interface_name, string $possible_parent): bool + { + return isset($this->getParentInterfaces($interface_name)[strtolower($possible_parent)]); + } + + /** + * @return array all interfaces extended by $interface_name + */ + public function getParentInterfaces(string $fq_interface_name): array + { + $fq_interface_name = strtolower($fq_interface_name); + + return $this->classlike_storage_provider->get($fq_interface_name)->parent_interfaces; + } + + public function traitExists(string $fq_trait_name, ?CodeLocation $code_location = null): bool + { + return $this->hasFullyQualifiedTraitName($fq_trait_name, $code_location); + } + + /** + * Determine whether or not a class has the correct casing + */ + public function classHasCorrectCasing(string $fq_class_name): bool + { + if ($fq_class_name === 'Generator') { + return true; + } + + if (isset($this->classlike_aliases[strtolower($fq_class_name)])) { + return true; + } + + return isset($this->existing_classes[$fq_class_name]); + } + + public function interfaceHasCorrectCasing(string $fq_interface_name): bool + { + if (isset($this->classlike_aliases[strtolower($fq_interface_name)])) { + return true; + } + + return isset($this->existing_interfaces[$fq_interface_name]); + } + + public function enumHasCorrectCasing(string $fq_enum_name): bool + { + if (isset($this->classlike_aliases[strtolower($fq_enum_name)])) { + return true; + } + + return isset($this->existing_enums[$fq_enum_name]); + } + + public function traitHasCorrectCase(string $fq_trait_name): bool + { + if (isset($this->classlike_aliases[strtolower($fq_trait_name)])) { + return true; + } + + return isset($this->existing_traits[$fq_trait_name]); + } + + /** + * @param lowercase-string $fq_class_name + */ + public function isUserDefined(string $fq_class_name): bool + { + return $this->classlike_storage_provider->get($fq_class_name)->user_defined; + } + + public function getTraitNode(string $fq_trait_name): PhpParser\Node\Stmt\Trait_ + { + $fq_trait_name_lc = strtolower($fq_trait_name); + + if (isset($this->trait_nodes[$fq_trait_name_lc])) { + return $this->trait_nodes[$fq_trait_name_lc]; + } + + $storage = $this->classlike_storage_provider->get($fq_trait_name); + + if (!$storage->location) { + throw new UnexpectedValueException('Storage should exist for ' . $fq_trait_name); + } + + $file_statements = $this->statements_provider->getStatementsForFile($storage->location->file_path, '7.4'); + + $trait_finder = new TraitFinder($fq_trait_name); + + $traverser = new NodeTraverser(); + $traverser->addVisitor( + $trait_finder + ); + + $traverser->traverse($file_statements); + + $trait_node = $trait_finder->getNode(); + + if ($trait_node) { + $this->trait_nodes[$fq_trait_name_lc] = $trait_node; + + return $trait_node; + } + + throw new UnexpectedValueException('Could not locate trait statement'); + } + + /** + * @param lowercase-string $alias_name + */ + public function addClassAlias(string $fq_class_name, string $alias_name): void + { + $this->classlike_aliases[$alias_name] = $fq_class_name; + } + + public function getUnAliasedName(string $alias_name): string + { + $alias_name_lc = strtolower($alias_name); + if ($this->existing_classlikes_lc[$alias_name_lc] ?? false) { + return $alias_name; + } + + $result = $this->classlike_aliases[$alias_name_lc] ?? $alias_name; + if ($result === $alias_name) { + return $result; + } + + return $this->getUnAliasedName($result); + } + + public function consolidateAnalyzedData(Methods $methods, ?Progress $progress, bool $find_unused_code): void + { + if ($progress === null) { + $progress = new VoidProgress(); + } + + $progress->debug('Checking class references' . PHP_EOL); + + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + + foreach ($this->existing_classlikes_lc as $fq_class_name_lc => $_) { + try { + $classlike_storage = $this->classlike_storage_provider->get($fq_class_name_lc); + } catch (InvalidArgumentException $e) { + continue; + } + + if ($classlike_storage->location + && $this->config->isInProjectDirs($classlike_storage->location->file_path) + && !$classlike_storage->is_trait + ) { + if ($find_unused_code) { + if (!$this->file_reference_provider->isClassReferenced($fq_class_name_lc)) { + IssueBuffer::maybeAdd( + new UnusedClass( + 'Class ' . $classlike_storage->name . ' is never used', + $classlike_storage->location, + $classlike_storage->name + ), + $classlike_storage->suppressed_issues + ); + } else { + $this->checkMethodReferences($classlike_storage, $methods); + $this->checkPropertyReferences($classlike_storage); + } + } + + $this->findPossibleMethodParamTypes($classlike_storage); + + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['MissingImmutableAnnotation']) + && !isset($codebase->analyzer->mutable_classes[$fq_class_name_lc]) + && !$classlike_storage->external_mutation_free + && $classlike_storage->properties + && isset($classlike_storage->methods['__construct']) + ) { + $stmts = $codebase->getStatementsForFile( + $classlike_storage->location->file_path + ); + + foreach ($stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\Namespace_) { + foreach ($stmt->stmts as $namespace_stmt) { + if ($namespace_stmt instanceof PhpParser\Node\Stmt\Class_ + && strtolower((string) $stmt->name . '\\' . (string) $namespace_stmt->name) + === $fq_class_name_lc + ) { + self::makeImmutable( + $namespace_stmt, + $project_analyzer, + $classlike_storage->location->file_path + ); + } + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\Class_ + && strtolower((string) $stmt->name) === $fq_class_name_lc + ) { + self::makeImmutable( + $stmt, + $project_analyzer, + $classlike_storage->location->file_path + ); + } + } + } + } + } + } + + public static function makeImmutable( + PhpParser\Node\Stmt\Class_ $class_stmt, + ProjectAnalyzer $project_analyzer, + string $file_path + ): void { + $manipulator = ClassDocblockManipulator::getForClass( + $project_analyzer, + $file_path, + $class_stmt + ); + + $manipulator->makeImmutable(); + } + + public function moveMethods(Methods $methods, ?Progress $progress = null): void + { + if ($progress === null) { + $progress = new VoidProgress(); + } + + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + + if (!$codebase->methods_to_move) { + return; + } + + $progress->debug('Refactoring methods ' . PHP_EOL); + + $code_migrations = []; + + foreach ($codebase->methods_to_move as $source => $destination) { + $source_parts = explode('::', $source); + + try { + $source_method_storage = $methods->getStorage( + new MethodIdentifier(...$source_parts) + ); + } catch (InvalidArgumentException $e) { + continue; + } + + [$destination_fq_class_name, $destination_name] = explode('::', $destination); + + try { + $classlike_storage = $this->classlike_storage_provider->get($destination_fq_class_name); + } catch (InvalidArgumentException $e) { + continue; + } + + if ($classlike_storage->stmt_location + && $this->config->isInProjectDirs($classlike_storage->stmt_location->file_path) + && $source_method_storage->stmt_location + && $source_method_storage->stmt_location->file_path + && $source_method_storage->location + ) { + $new_class_bounds = $classlike_storage->stmt_location->getSnippetBounds(); + $old_method_bounds = $source_method_storage->stmt_location->getSnippetBounds(); + + $old_method_name_bounds = $source_method_storage->location->getSelectionBounds(); + + FileManipulationBuffer::add( + $source_method_storage->stmt_location->file_path, + [ + new FileManipulation( + $old_method_name_bounds[0], + $old_method_name_bounds[1], + $destination_name + ), + ] + ); + + $selection = $classlike_storage->stmt_location->getSnippet(); + + $insert_pos = strrpos($selection, "\n", -1); + + if (!$insert_pos) { + $insert_pos = strlen($selection) - 1; + } else { + ++$insert_pos; + } + + $code_migrations[] = new CodeMigration( + $source_method_storage->stmt_location->file_path, + $old_method_bounds[0], + $old_method_bounds[1], + $classlike_storage->stmt_location->file_path, + $new_class_bounds[0] + $insert_pos + ); + } + } + + FileManipulationBuffer::addCodeMigrations($code_migrations); + } + + public function moveProperties(Properties $properties, ?Progress $progress = null): void + { + if ($progress === null) { + $progress = new VoidProgress(); + } + + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + + if (!$codebase->properties_to_move) { + return; + } + + $progress->debug('Refacting properties ' . PHP_EOL); + + $code_migrations = []; + + foreach ($codebase->properties_to_move as $source => $destination) { + try { + $source_property_storage = $properties->getStorage($source); + } catch (InvalidArgumentException $e) { + continue; + } + + [$source_fq_class_name] = explode('::$', $source); + [$destination_fq_class_name, $destination_name] = explode('::$', $destination); + + $source_classlike_storage = $this->classlike_storage_provider->get($source_fq_class_name); + $destination_classlike_storage = $this->classlike_storage_provider->get($destination_fq_class_name); + + if ($destination_classlike_storage->stmt_location + && $this->config->isInProjectDirs($destination_classlike_storage->stmt_location->file_path) + && $source_property_storage->stmt_location + && $source_property_storage->stmt_location->file_path + && $source_property_storage->location + ) { + if ($source_property_storage->type + && $source_property_storage->type_location + && $source_property_storage->type_location !== $source_property_storage->signature_type_location + ) { + $bounds = $source_property_storage->type_location->getSelectionBounds(); + + $replace_type = TypeExpander::expandUnion( + $codebase, + $source_property_storage->type, + $source_classlike_storage->name, + $source_classlike_storage->name, + $source_classlike_storage->parent_class + ); + + $this->airliftClassDefinedDocblockType( + $replace_type, + $destination_fq_class_name, + $source_property_storage->stmt_location->file_path, + $bounds[0], + $bounds[1] + ); + } + + $new_class_bounds = $destination_classlike_storage->stmt_location->getSnippetBounds(); + $old_property_bounds = $source_property_storage->stmt_location->getSnippetBounds(); + + $old_property_name_bounds = $source_property_storage->location->getSelectionBounds(); + + FileManipulationBuffer::add( + $source_property_storage->stmt_location->file_path, + [ + new FileManipulation( + $old_property_name_bounds[0], + $old_property_name_bounds[1], + '$' . $destination_name + ), + ] + ); + + $selection = $destination_classlike_storage->stmt_location->getSnippet(); + + $insert_pos = strrpos($selection, "\n", -1); + + if (!$insert_pos) { + $insert_pos = strlen($selection) - 1; + } else { + ++$insert_pos; + } + + $code_migrations[] = new CodeMigration( + $source_property_storage->stmt_location->file_path, + $old_property_bounds[0], + $old_property_bounds[1], + $destination_classlike_storage->stmt_location->file_path, + $new_class_bounds[0] + $insert_pos + ); + } + } + + FileManipulationBuffer::addCodeMigrations($code_migrations); + } + + public function moveClassConstants(?Progress $progress = null): void + { + if ($progress === null) { + $progress = new VoidProgress(); + } + + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + + if (!$codebase->class_constants_to_move) { + return; + } + + $progress->debug('Refacting constants ' . PHP_EOL); + + $code_migrations = []; + + foreach ($codebase->class_constants_to_move as $source => $destination) { + [$source_fq_class_name, $source_const_name] = explode('::', $source); + [$destination_fq_class_name, $destination_name] = explode('::', $destination); + + $source_classlike_storage = $this->classlike_storage_provider->get($source_fq_class_name); + $destination_classlike_storage = $this->classlike_storage_provider->get($destination_fq_class_name); + + $constant_storage = $source_classlike_storage->constants[$source_const_name]; + + $source_const_stmt_location = $constant_storage->stmt_location; + $source_const_location = $constant_storage->location; + + if (!$source_const_location || !$source_const_stmt_location) { + continue; + } + + if ($destination_classlike_storage->stmt_location + && $this->config->isInProjectDirs($destination_classlike_storage->stmt_location->file_path) + && $source_const_stmt_location->file_path + ) { + $new_class_bounds = $destination_classlike_storage->stmt_location->getSnippetBounds(); + $old_const_bounds = $source_const_stmt_location->getSnippetBounds(); + + $old_const_name_bounds = $source_const_location->getSelectionBounds(); + + FileManipulationBuffer::add( + $source_const_stmt_location->file_path, + [ + new FileManipulation( + $old_const_name_bounds[0], + $old_const_name_bounds[1], + $destination_name + ), + ] + ); + + $selection = $destination_classlike_storage->stmt_location->getSnippet(); + + $insert_pos = strrpos($selection, "\n", -1); + + if (!$insert_pos) { + $insert_pos = strlen($selection) - 1; + } else { + ++$insert_pos; + } + + $code_migrations[] = new CodeMigration( + $source_const_stmt_location->file_path, + $old_const_bounds[0], + $old_const_bounds[1], + $destination_classlike_storage->stmt_location->file_path, + $new_class_bounds[0] + $insert_pos + ); + } + } + + FileManipulationBuffer::addCodeMigrations($code_migrations); + } + + /** + * @param lowercase-string|null $calling_method_id + */ + public function handleClassLikeReferenceInMigration( + Codebase $codebase, + StatementsSource $source, + PhpParser\Node $class_name_node, + string $fq_class_name, + ?string $calling_method_id, + bool $force_change = false, + bool $was_self = false + ): bool { + if ($class_name_node instanceof VirtualNode) { + return false; + } + $calling_fq_class_name = $source->getFQCLN(); + + // if we're inside a moved class static method + if ($codebase->methods_to_move + && $calling_fq_class_name + && $calling_method_id + && isset($codebase->methods_to_move[$calling_method_id]) + ) { + $destination_class = explode('::', $codebase->methods_to_move[$calling_method_id])[0]; + + $intended_fq_class_name = strtolower($calling_fq_class_name) === strtolower($fq_class_name) + && isset($codebase->classes_to_move[strtolower($calling_fq_class_name)]) + ? $destination_class + : $fq_class_name; + + $this->airliftClassLikeReference( + $intended_fq_class_name, + $destination_class, + $source->getFilePath(), + (int) $class_name_node->getAttribute('startFilePos'), + (int) $class_name_node->getAttribute('endFilePos') + 1, + $class_name_node instanceof PhpParser\Node\Scalar\MagicConst\Class_, + $was_self + ); + + return true; + } + + // if we're outside a moved class, but we're changing all references to a class + if (isset($codebase->class_transforms[strtolower($fq_class_name)])) { + $new_fq_class_name = $codebase->class_transforms[strtolower($fq_class_name)]; + $file_manipulations = []; + + if ($class_name_node instanceof PhpParser\Node\Identifier) { + $destination_parts = explode('\\', $new_fq_class_name); + + $destination_class_name = array_pop($destination_parts); + + $file_manipulations[] = new FileManipulation( + (int) $class_name_node->getAttribute('startFilePos'), + (int) $class_name_node->getAttribute('endFilePos') + 1, + $destination_class_name + ); + + FileManipulationBuffer::add($source->getFilePath(), $file_manipulations); + + return true; + } + + $uses_flipped = $source->getAliasedClassesFlipped(); + $uses_flipped_replaceable = $source->getAliasedClassesFlippedReplaceable(); + + $old_fq_class_name = strtolower($fq_class_name); + + $migrated_source_fqcln = $calling_fq_class_name; + + if ($calling_fq_class_name + && isset($codebase->class_transforms[strtolower($calling_fq_class_name)]) + ) { + $migrated_source_fqcln = $codebase->class_transforms[strtolower($calling_fq_class_name)]; + } + + $source_namespace = $source->getNamespace(); + + if ($migrated_source_fqcln && $calling_fq_class_name !== $migrated_source_fqcln) { + $new_source_parts = explode('\\', $migrated_source_fqcln, -1); + $source_namespace = implode('\\', $new_source_parts); + } + + if (isset($uses_flipped_replaceable[$old_fq_class_name])) { + $alias = $uses_flipped_replaceable[$old_fq_class_name]; + unset($uses_flipped[$old_fq_class_name]); + $old_class_name_parts = explode('\\', $old_fq_class_name); + $old_class_name = end($old_class_name_parts); + if ($old_class_name === strtolower($alias)) { + $new_class_name_parts = explode('\\', $new_fq_class_name); + $new_class_name = end($new_class_name_parts); + $uses_flipped[strtolower($new_fq_class_name)] = $new_class_name; + } else { + $uses_flipped[strtolower($new_fq_class_name)] = $alias; + } + } + + $file_manipulations[] = new FileManipulation( + (int) $class_name_node->getAttribute('startFilePos'), + (int) $class_name_node->getAttribute('endFilePos') + 1, + Type::getStringFromFQCLN( + $new_fq_class_name, + $source_namespace, + $uses_flipped, + $migrated_source_fqcln, + $was_self + ) + . ($class_name_node instanceof PhpParser\Node\Scalar\MagicConst\Class_ ? '::class' : '') + ); + + FileManipulationBuffer::add($source->getFilePath(), $file_manipulations); + + return true; + } + + // if we're inside a moved class (could be a method, could be a property/class const default) + if ($codebase->classes_to_move + && $calling_fq_class_name + && isset($codebase->classes_to_move[strtolower($calling_fq_class_name)]) + ) { + $destination_class = $codebase->classes_to_move[strtolower($calling_fq_class_name)]; + + if ($class_name_node instanceof PhpParser\Node\Identifier) { + $destination_parts = explode('\\', $destination_class); + + $destination_class_name = array_pop($destination_parts); + $file_manipulations = []; + + $file_manipulations[] = new FileManipulation( + (int) $class_name_node->getAttribute('startFilePos'), + (int) $class_name_node->getAttribute('endFilePos') + 1, + $destination_class_name + ); + + FileManipulationBuffer::add($source->getFilePath(), $file_manipulations); + } else { + $this->airliftClassLikeReference( + strtolower($calling_fq_class_name) === strtolower($fq_class_name) + ? $destination_class + : $fq_class_name, + $destination_class, + $source->getFilePath(), + (int) $class_name_node->getAttribute('startFilePos'), + (int) $class_name_node->getAttribute('endFilePos') + 1, + $class_name_node instanceof PhpParser\Node\Scalar\MagicConst\Class_ + ); + } + + return true; + } + + if ($force_change) { + if ($calling_fq_class_name) { + $this->airliftClassLikeReference( + $fq_class_name, + $calling_fq_class_name, + $source->getFilePath(), + (int) $class_name_node->getAttribute('startFilePos'), + (int) $class_name_node->getAttribute('endFilePos') + 1 + ); + } else { + $file_manipulations = []; + + $file_manipulations[] = new FileManipulation( + (int) $class_name_node->getAttribute('startFilePos'), + (int) $class_name_node->getAttribute('endFilePos') + 1, + Type::getStringFromFQCLN( + $fq_class_name, + $source->getNamespace(), + $source->getAliasedClassesFlipped(), + null + ) + ); + + FileManipulationBuffer::add($source->getFilePath(), $file_manipulations); + } + + return true; + } + + return false; + } + + /** + * @param lowercase-string|null $calling_method_id + */ + public function handleDocblockTypeInMigration( + Codebase $codebase, + StatementsSource $source, + Union $type, + CodeLocation $type_location, + ?string $calling_method_id + ): void { + $calling_fq_class_name = $source->getFQCLN(); + $fq_class_name_lc = strtolower($calling_fq_class_name ?? ''); + + $moved_type = false; + + // if we're inside a moved class static method + if ($codebase->methods_to_move + && $calling_fq_class_name + && $calling_method_id + && isset($codebase->methods_to_move[$calling_method_id]) + ) { + $bounds = $type_location->getSelectionBounds(); + + $destination_class = explode('::', $codebase->methods_to_move[$calling_method_id])[0]; + + $this->airliftClassDefinedDocblockType( + $type, + $destination_class, + $source->getFilePath(), + $bounds[0], + $bounds[1] + ); + + $moved_type = true; + } + + // if we're outside a moved class, but we're changing all references to a class + if (!$moved_type && $codebase->class_transforms) { + $uses_flipped = $source->getAliasedClassesFlipped(); + $uses_flipped_replaceable = $source->getAliasedClassesFlippedReplaceable(); + + $migrated_source_fqcln = $calling_fq_class_name; + + if ($calling_fq_class_name + && isset($codebase->class_transforms[$fq_class_name_lc]) + ) { + $migrated_source_fqcln = $codebase->class_transforms[$fq_class_name_lc]; + } + + $source_namespace = $source->getNamespace(); + + if ($migrated_source_fqcln && $calling_fq_class_name !== $migrated_source_fqcln) { + $new_source_parts = explode('\\', $migrated_source_fqcln, -1); + $source_namespace = implode('\\', $new_source_parts); + } + + foreach ($codebase->class_transforms as $old_fq_class_name => $new_fq_class_name) { + if (isset($uses_flipped_replaceable[$old_fq_class_name])) { + $alias = $uses_flipped_replaceable[$old_fq_class_name]; + unset($uses_flipped[$old_fq_class_name]); + $old_class_name_parts = explode('\\', $old_fq_class_name); + $old_class_name = end($old_class_name_parts); + if ($old_class_name === strtolower($alias)) { + $new_class_name_parts = explode('\\', $new_fq_class_name); + $new_class_name = end($new_class_name_parts); + $uses_flipped[strtolower($new_fq_class_name)] = $new_class_name; + } else { + $uses_flipped[strtolower($new_fq_class_name)] = $alias; + } + } + } + + foreach ($codebase->class_transforms as $old_fq_class_name => $new_fq_class_name) { + if ($type->containsClassLike($old_fq_class_name)) { + $type = clone $type; + + $type->replaceClassLike($old_fq_class_name, $new_fq_class_name); + + $bounds = $type_location->getSelectionBounds(); + + $file_manipulations = []; + + $file_manipulations[] = new FileManipulation( + $bounds[0], + $bounds[1], + $type->toNamespacedString( + $source_namespace, + $uses_flipped, + $migrated_source_fqcln, + false + ) + ); + + FileManipulationBuffer::add( + $source->getFilePath(), + $file_manipulations + ); + + $moved_type = true; + } + } + } + + // if we're inside a moved class (could be a method, could be a property/class const default) + if (!$moved_type + && $codebase->classes_to_move + && $calling_fq_class_name + && isset($codebase->classes_to_move[$fq_class_name_lc]) + ) { + $bounds = $type_location->getSelectionBounds(); + + $destination_class = $codebase->classes_to_move[$fq_class_name_lc]; + + if ($type->containsClassLike($fq_class_name_lc)) { + $type = clone $type; + + $type->replaceClassLike($fq_class_name_lc, $destination_class); + } + + $this->airliftClassDefinedDocblockType( + $type, + $destination_class, + $source->getFilePath(), + $bounds[0], + $bounds[1] + ); + } + } + + public function airliftClassLikeReference( + string $fq_class_name, + string $destination_fq_class_name, + string $source_file_path, + int $source_start, + int $source_end, + bool $add_class_constant = false, + bool $allow_self = false + ): void { + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + + $destination_class_storage = $codebase->classlike_storage_provider->get($destination_fq_class_name); + + if (!$destination_class_storage->aliases) { + throw new UnexpectedValueException('Aliases should not be null'); + } + + $file_manipulations = []; + + $file_manipulations[] = new FileManipulation( + $source_start, + $source_end, + Type::getStringFromFQCLN( + $fq_class_name, + $destination_class_storage->aliases->namespace, + $destination_class_storage->aliases->uses_flipped, + $destination_class_storage->name, + $allow_self + ) . ($add_class_constant ? '::class' : '') + ); + + FileManipulationBuffer::add( + $source_file_path, + $file_manipulations + ); + } + + public function airliftClassDefinedDocblockType( + Union $type, + string $destination_fq_class_name, + string $source_file_path, + int $source_start, + int $source_end + ): void { + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + + $destination_class_storage = $codebase->classlike_storage_provider->get($destination_fq_class_name); + + if (!$destination_class_storage->aliases) { + throw new UnexpectedValueException('Aliases should not be null'); + } + + $file_manipulations = []; + + $file_manipulations[] = new FileManipulation( + $source_start, + $source_end, + $type->toNamespacedString( + $destination_class_storage->aliases->namespace, + $destination_class_storage->aliases->uses_flipped, + $destination_class_storage->name, + false + ) + ); + + FileManipulationBuffer::add( + $source_file_path, + $file_manipulations + ); + } + + /** + * @param ReflectionProperty::IS_PUBLIC|ReflectionProperty::IS_PROTECTED|ReflectionProperty::IS_PRIVATE + * $visibility + * + * @return array + */ + public function getConstantsForClass(string $class_name, int $visibility): array + { + $class_name = strtolower($class_name); + + $storage = $this->classlike_storage_provider->get($class_name); + + if ($visibility === ReflectionProperty::IS_PUBLIC) { + return array_filter( + $storage->constants, + function ($constant) { + return $constant->type + && $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC; + } + ); + } + + if ($visibility === ReflectionProperty::IS_PROTECTED) { + return array_filter( + $storage->constants, + function ($constant) { + return $constant->type + && ($constant->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC + || $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PROTECTED); + } + ); + } + + return array_filter( + $storage->constants, + function ($constant) { + return $constant->type !== null; + } + ); + } + + /** + * @param ReflectionProperty::IS_PUBLIC|ReflectionProperty::IS_PROTECTED|ReflectionProperty::IS_PRIVATE + * $visibility + */ + public function getClassConstantType( + string $class_name, + string $constant_name, + int $visibility, + ?StatementsAnalyzer $statements_analyzer = null, + array $visited_constant_ids = [] + ): ?Union { + $class_name = strtolower($class_name); + + if (!$this->classlike_storage_provider->has($class_name)) { + return null; + } + + $storage = $this->classlike_storage_provider->get($class_name); + + if (isset($storage->constants[$constant_name])) { + $constant_storage = $storage->constants[$constant_name]; + + if ($visibility === ReflectionProperty::IS_PUBLIC + && $constant_storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PUBLIC + ) { + return null; + } + + if ($visibility === ReflectionProperty::IS_PROTECTED + && $constant_storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PUBLIC + && $constant_storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PROTECTED + ) { + return null; + } + + if ($constant_storage->unresolved_node) { + $constant_storage->type = new Union([ConstantTypeResolver::resolve( + $this, + $constant_storage->unresolved_node, + $statements_analyzer, + $visited_constant_ids + )]); + } + + return $constant_storage->type; + } elseif (isset($storage->enum_cases[$constant_name])) { + return new Union([new TEnumCase($storage->name, $constant_name)]); + } + return null; + } + + private function checkMethodReferences(ClassLikeStorage $classlike_storage, Methods $methods): void + { + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + + foreach ($classlike_storage->appearing_method_ids as $method_name => $appearing_method_id) { + $appearing_fq_classlike_name = $appearing_method_id->fq_class_name; + + if ($appearing_fq_classlike_name !== $classlike_storage->name) { + continue; + } + + $method_id = $appearing_method_id; + + $declaring_classlike_storage = $classlike_storage; + + if (isset($classlike_storage->methods[$method_name])) { + $method_storage = $classlike_storage->methods[$method_name]; + } else { + $declaring_method_id = $classlike_storage->declaring_method_ids[$method_name]; + + $declaring_fq_classlike_name = $declaring_method_id->fq_class_name; + $declaring_method_name = $declaring_method_id->method_name; + + try { + $declaring_classlike_storage = $this->classlike_storage_provider->get($declaring_fq_classlike_name); + } catch (InvalidArgumentException $e) { + continue; + } + + $method_storage = $declaring_classlike_storage->methods[$declaring_method_name]; + $method_id = $declaring_method_id; + } + + if ($method_storage->location + && !$project_analyzer->canReportIssues($method_storage->location->file_path) + && !$codebase->analyzer->canReportIssues($method_storage->location->file_path) + ) { + continue; + } + + $method_referenced = $this->file_reference_provider->isClassMethodReferenced( + strtolower((string) $method_id) + ); + + if (!$method_referenced + && $method_storage->location + ) { + if ($method_name !== '__destruct' + && $method_name !== '__clone' + && $method_name !== '__invoke' + && $method_name !== '__unset' + && $method_name !== '__isset' + && $method_name !== '__sleep' + && $method_name !== '__wakeup' + && $method_name !== '__serialize' + && $method_name !== '__unserialize' + && $method_name !== '__set_state' + && $method_name !== '__debuginfo' + && $method_name !== '__tostring' // can be called in array_unique) + ) { + $method_location = $method_storage->location; + + $method_id = $classlike_storage->name . '::' . $method_storage->cased_name; + + if ($method_storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PRIVATE) { + $has_parent_references = false; + + if ($codebase->classImplements($classlike_storage->name, 'Serializable') + && ($method_name === 'serialize' || $method_name === 'unserialize') + ) { + continue; + } + + $has_variable_calls = $codebase->analyzer->hasMixedMemberName($method_name) + || $codebase->analyzer->hasMixedMemberName(strtolower($classlike_storage->name . '::')); + + if (isset($classlike_storage->overridden_method_ids[$method_name])) { + foreach ($classlike_storage->overridden_method_ids[$method_name] as $parent_method_id) { + $parent_method_storage = $methods->getStorage($parent_method_id); + + if ($parent_method_storage->location + && !$project_analyzer->canReportIssues($parent_method_storage->location->file_path) + ) { + // here we just don’t know + $has_parent_references = true; + break; + } + + $parent_method_referenced = $this->file_reference_provider->isClassMethodReferenced( + strtolower((string) $parent_method_id) + ); + + if (!$parent_method_storage->abstract || $parent_method_referenced) { + $has_parent_references = true; + break; + } + } + } + + foreach ($classlike_storage->parent_classes as $parent_method_fqcln) { + if ($codebase->analyzer->hasMixedMemberName( + strtolower($parent_method_fqcln) . '::' + )) { + $has_variable_calls = true; + break; + } + } + + foreach ($classlike_storage->class_implements as $fq_interface_name_lc => $_) { + try { + $interface_storage = $this->classlike_storage_provider->get($fq_interface_name_lc); + } catch (InvalidArgumentException $e) { + continue; + } + + if ($codebase->analyzer->hasMixedMemberName( + $fq_interface_name_lc . '::' + )) { + $has_variable_calls = true; + } + + if (isset($interface_storage->methods[$method_name])) { + $interface_method_referenced = $this->file_reference_provider->isClassMethodReferenced( + $fq_interface_name_lc . '::' . $method_name + ); + + if ($interface_method_referenced) { + $has_parent_references = true; + } + } + } + + if (!$has_parent_references) { + $issue = new PossiblyUnusedMethod( + 'Cannot find ' . ($has_variable_calls ? 'explicit' : 'any') + . ' calls to method ' . $method_id + . ($has_variable_calls ? ' (but did find some potential callers)' : ''), + $method_storage->location, + $method_id + ); + + if ($codebase->alter_code) { + if ($method_storage->stmt_location + && !$declaring_classlike_storage->is_trait + && isset($project_analyzer->getIssuesToFix()['PossiblyUnusedMethod']) + && !$has_variable_calls + && !IssueBuffer::isSuppressed($issue, $method_storage->suppressed_issues) + ) { + FileManipulationBuffer::addForCodeLocation( + $method_storage->stmt_location, + '', + true + ); + } + } elseif (IssueBuffer::accepts( + $issue, + $method_storage->suppressed_issues, + $method_storage->stmt_location + && !$declaring_classlike_storage->is_trait + && !$has_variable_calls + )) { + // fall through + } + } + } elseif (!isset($classlike_storage->declaring_method_ids['__call'])) { + $has_variable_calls = $codebase->analyzer->hasMixedMemberName( + strtolower($classlike_storage->name . '::') + ) || $codebase->analyzer->hasMixedMemberName($method_name); + + if ($method_name === '__construct') { + $issue = new UnusedConstructor( + 'Cannot find ' . ($has_variable_calls ? 'explicit' : 'any') + . ' calls to private constructor ' . $method_id + . ($has_variable_calls ? ' (but did find some potential callers)' : ''), + $method_location, + $method_id + ); + } else { + $issue = new UnusedMethod( + 'Cannot find ' . ($has_variable_calls ? 'explicit' : 'any') + . ' calls to private method ' . $method_id + . ($has_variable_calls ? ' (but did find some potential callers)' : ''), + $method_location, + $method_id + ); + } + + if ($codebase->alter_code) { + if ($method_storage->stmt_location + && !$declaring_classlike_storage->is_trait + && isset($project_analyzer->getIssuesToFix()['UnusedMethod']) + && !$has_variable_calls + && !IssueBuffer::isSuppressed($issue, $method_storage->suppressed_issues) + ) { + FileManipulationBuffer::addForCodeLocation( + $method_storage->stmt_location, + '', + true + ); + } + } elseif (IssueBuffer::accepts( + $issue, + $method_storage->suppressed_issues, + $method_storage->stmt_location + && !$declaring_classlike_storage->is_trait + && !$has_variable_calls + )) { + // fall through + } + } + } + } else { + if ($method_storage->return_type + && $method_storage->return_type_location + && !$method_storage->return_type->isVoid() + && !$method_storage->return_type->isNever() + && $method_id->method_name !== '__tostring' + && ($method_storage->is_static || !$method_storage->probably_fluent) + ) { + $method_return_referenced = $this->file_reference_provider->isMethodReturnReferenced( + strtolower((string) $method_id) + ); + + if (!$method_return_referenced) { + if ($method_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE) { + IssueBuffer::maybeAdd( + new UnusedReturnValue( + 'The return value for this private method is never used', + $method_storage->return_type_location + ), + $method_storage->suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new PossiblyUnusedReturnValue( + 'The return value for this method is never used', + $method_storage->return_type_location + ), + $method_storage->suppressed_issues + ); + } + } + } + + if ($method_storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PRIVATE + && !$classlike_storage->is_interface + ) { + foreach ($method_storage->params as $offset => $param_storage) { + if (empty($classlike_storage->overridden_method_ids[$method_name]) + && $param_storage->location + && !$param_storage->promoted_property + && !$this->file_reference_provider->isMethodParamUsed( + strtolower((string) $method_id), + $offset + ) + ) { + if ($method_storage->final) { + IssueBuffer::maybeAdd( + new UnusedParam( + 'Param #' . ($offset + 1) . ' is never referenced in this method', + $param_storage->location + ), + $method_storage->suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new PossiblyUnusedParam( + 'Param #' . ($offset + 1) . ' is never referenced in this method', + $param_storage->location + ), + $method_storage->suppressed_issues + ); + } + } + } + } + } + } + } + + private function findPossibleMethodParamTypes(ClassLikeStorage $classlike_storage): void + { + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + + foreach ($classlike_storage->appearing_method_ids as $method_name => $appearing_method_id) { + $appearing_fq_classlike_name = $appearing_method_id->fq_class_name; + + if ($appearing_fq_classlike_name !== $classlike_storage->name) { + continue; + } + + $method_id = $appearing_method_id; + + $declaring_classlike_storage = $classlike_storage; + + if (isset($classlike_storage->methods[$method_name])) { + $method_storage = $classlike_storage->methods[$method_name]; + } else { + $declaring_method_id = $classlike_storage->declaring_method_ids[$method_name]; + + $declaring_fq_classlike_name = $declaring_method_id->fq_class_name; + $declaring_method_name = $declaring_method_id->method_name; + + try { + $declaring_classlike_storage = $this->classlike_storage_provider->get($declaring_fq_classlike_name); + } catch (InvalidArgumentException $e) { + continue; + } + + $method_storage = $declaring_classlike_storage->methods[$declaring_method_name]; + $method_id = $declaring_method_id; + } + + if ($method_storage->location + && !$project_analyzer->canReportIssues($method_storage->location->file_path) + && !$codebase->analyzer->canReportIssues($method_storage->location->file_path) + ) { + continue; + } + + if ($declaring_classlike_storage->is_trait) { + continue; + } + + $method_id_lc = strtolower((string) $method_id); + + if (isset($codebase->analyzer->possible_method_param_types[$method_id_lc])) { + if ($method_storage->location) { + $possible_param_types + = $codebase->analyzer->possible_method_param_types[$method_id_lc]; + + if ($possible_param_types) { + foreach ($possible_param_types as $offset => $possible_type) { + if (!isset($method_storage->params[$offset])) { + continue; + } + + $param_name = $method_storage->params[$offset]->name; + + if ($possible_type->hasMixed() || $possible_type->isNull()) { + continue; + } + + if ($method_storage->params[$offset]->default_type) { + if ($method_storage->params[$offset]->default_type instanceof Union) { + $default_type = clone $method_storage->params[$offset]->default_type; + } else { + $default_type_atomic = ConstantTypeResolver::resolve( + $codebase->classlikes, + $method_storage->params[$offset]->default_type, + null + ); + + $default_type = new Union([$default_type_atomic]); + } + + $possible_type = Type::combineUnionTypes( + $possible_type, + $default_type + ); + } + + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['MissingParamType']) + ) { + $function_analyzer = $project_analyzer->getFunctionLikeAnalyzer( + $method_id, + $method_storage->location->file_path + ); + + $has_variable_calls = $codebase->analyzer->hasMixedMemberName( + $method_name + ) + || $codebase->analyzer->hasMixedMemberName( + strtolower($classlike_storage->name . '::') + ); + + if ($has_variable_calls) { + $possible_type->from_docblock = true; + } + + if ($function_analyzer) { + $function_analyzer->addOrUpdateParamType( + $project_analyzer, + $param_name, + $possible_type, + $possible_type->from_docblock + && $project_analyzer->only_replace_php_types_with_non_docblock_types + ); + } + } else { + IssueBuffer::addFixableIssue('MissingParamType'); + } + } + } + } + } + } + } + + private function checkPropertyReferences(ClassLikeStorage $classlike_storage): void + { + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + + foreach ($classlike_storage->properties as $property_name => $property_storage) { + $referenced_property_name = strtolower($classlike_storage->name) . '::$' . $property_name; + $property_referenced = $this->file_reference_provider->isClassPropertyReferenced( + $referenced_property_name + ); + + $property_constructor_referenced = false; + if ($property_referenced && $property_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE) { + $all_method_references = $this->file_reference_provider->getAllMethodReferencesToClassProperties(); + + if (isset($all_method_references[$referenced_property_name]) + && count($all_method_references[$referenced_property_name]) === 1) { + $constructor_name = strtolower($classlike_storage->name) . '::__construct'; + $property_references = $all_method_references[$referenced_property_name]; + + $property_constructor_referenced = isset($property_references[$constructor_name]) + && !$property_storage->is_static; + } + } + + if ((!$property_referenced || $property_constructor_referenced) + && $property_storage->location + ) { + $property_id = $classlike_storage->name . '::$' . $property_name; + + if ($property_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC + || $property_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PROTECTED + ) { + $has_parent_references = isset($classlike_storage->overridden_property_ids[$property_name]); + + $has_variable_calls = $codebase->analyzer->hasMixedMemberName('$' . $property_name) + || $codebase->analyzer->hasMixedMemberName(strtolower($classlike_storage->name) . '::$'); + + foreach ($classlike_storage->parent_classes as $parent_method_fqcln) { + if ($codebase->analyzer->hasMixedMemberName( + strtolower($parent_method_fqcln) . '::$' + )) { + $has_variable_calls = true; + break; + } + } + + foreach ($classlike_storage->class_implements as $fq_interface_name) { + if ($codebase->analyzer->hasMixedMemberName( + strtolower($fq_interface_name) . '::$' + )) { + $has_variable_calls = true; + break; + } + } + + if (!$has_parent_references + && ($property_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC + || !isset($classlike_storage->declaring_method_ids['__get'])) + ) { + $issue = new PossiblyUnusedProperty( + 'Cannot find ' . ($has_variable_calls ? 'explicit' : 'any') + . ' references to property ' . $property_id + . ($has_variable_calls ? ' (but did find some potential references)' : ''), + $property_storage->location + ); + + if ($codebase->alter_code) { + if ($property_storage->stmt_location + && isset($project_analyzer->getIssuesToFix()['PossiblyUnusedProperty']) + && !$has_variable_calls + && !IssueBuffer::isSuppressed($issue, $classlike_storage->suppressed_issues) + ) { + FileManipulationBuffer::addForCodeLocation( + $property_storage->stmt_location, + '', + true + ); + } + } elseif (IssueBuffer::accepts( + $issue, + $classlike_storage->suppressed_issues + $property_storage->suppressed_issues + )) { + // fall through + } + } + } elseif (!isset($classlike_storage->declaring_method_ids['__get'])) { + $has_variable_calls = $codebase->analyzer->hasMixedMemberName('$' . $property_name); + + $issue = new UnusedProperty( + 'Cannot find ' . ($has_variable_calls ? 'explicit' : 'any') + . ' references to private property ' . $property_id + . ($has_variable_calls ? ' (but did find some potential references)' : ''), + $property_storage->location + ); + + if ($codebase->alter_code) { + if (!$property_constructor_referenced + && $property_storage->stmt_location + && isset($project_analyzer->getIssuesToFix()['UnusedProperty']) + && !$has_variable_calls + && !IssueBuffer::isSuppressed($issue, $classlike_storage->suppressed_issues) + ) { + FileManipulationBuffer::addForCodeLocation( + $property_storage->stmt_location, + '', + true + ); + } + } elseif (IssueBuffer::accepts( + $issue, + $classlike_storage->suppressed_issues + $property_storage->suppressed_issues + )) { + // fall through + } + } + } + } + } + + /** + * @param lowercase-string $fq_classlike_name_lc + */ + public function registerMissingClassLike(string $fq_classlike_name_lc): void + { + $this->existing_classlikes_lc[$fq_classlike_name_lc] = false; + } + + /** + * @param lowercase-string $fq_classlike_name_lc + */ + public function isMissingClassLike(string $fq_classlike_name_lc): bool + { + return isset($this->existing_classlikes_lc[$fq_classlike_name_lc]) + && $this->existing_classlikes_lc[$fq_classlike_name_lc] === false; + } + + /** + * @param lowercase-string $fq_classlike_name_lc + */ + public function doesClassLikeExist(string $fq_classlike_name_lc): bool + { + return isset($this->existing_classlikes_lc[$fq_classlike_name_lc]) + && $this->existing_classlikes_lc[$fq_classlike_name_lc]; + } + + public function forgetMissingClassLikes(): void + { + $this->existing_classlikes_lc = array_filter($this->existing_classlikes_lc); + } + + public function removeClassLike(string $fq_class_name): void + { + $fq_class_name_lc = strtolower($fq_class_name); + + unset( + $this->existing_classlikes_lc[$fq_class_name_lc], + $this->existing_traits_lc[$fq_class_name_lc], + $this->existing_traits[$fq_class_name], + $this->existing_enums_lc[$fq_class_name_lc], + $this->existing_enums[$fq_class_name], + $this->existing_interfaces_lc[$fq_class_name_lc], + $this->existing_interfaces[$fq_class_name], + $this->existing_classes_lc[$fq_class_name_lc], + $this->existing_classes[$fq_class_name], + $this->trait_nodes[$fq_class_name_lc] + ); + + $this->scanner->removeClassLike($fq_class_name_lc); + } + + /** + * @return array{ + * array, + * array, + * array, + * array, + * array, + * array, + * array, + * array, + * array, + * } + */ + public function getThreadData(): array + { + return [ + $this->existing_classlikes_lc, + $this->existing_classes_lc, + $this->existing_traits_lc, + $this->existing_traits, + $this->existing_enums_lc, + $this->existing_enums, + $this->existing_interfaces_lc, + $this->existing_interfaces, + $this->existing_classes, + ]; + } + + /** + * @param array{ + * 0: array, + * 1: array, + * 2: array, + * 3: array, + * 4: array, + * 5: array, + * 6: array, + * 7: array, + * 8: array, + * } $thread_data + * + */ + public function addThreadData(array $thread_data): void + { + [ + $existing_classlikes_lc, + $existing_classes_lc, + $existing_traits_lc, + $existing_traits, + $existing_enums_lc, + $existing_enums, + $existing_interfaces_lc, + $existing_interfaces, + $existing_classes + ] = $thread_data; + + $this->existing_classlikes_lc = array_merge($existing_classlikes_lc, $this->existing_classlikes_lc); + $this->existing_classes_lc = array_merge($existing_classes_lc, $this->existing_classes_lc); + $this->existing_traits_lc = array_merge($existing_traits_lc, $this->existing_traits_lc); + $this->existing_traits = array_merge($existing_traits, $this->existing_traits); + $this->existing_enums_lc = array_merge($existing_enums_lc, $this->existing_enums_lc); + $this->existing_enums = array_merge($existing_enums, $this->existing_enums); + $this->existing_interfaces_lc = array_merge($existing_interfaces_lc, $this->existing_interfaces_lc); + $this->existing_interfaces = array_merge($existing_interfaces, $this->existing_interfaces); + $this->existing_classes = array_merge($existing_classes, $this->existing_classes); + } + + public function getStorageFor(string $fq_class_name): ?ClassLikeStorage + { + $fq_class_name = $this->getUnAliasedName($fq_class_name); + + try { + return $this->classlike_storage_provider->get($fq_class_name); + } catch (InvalidArgumentException $e) { + return null; + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php new file mode 100644 index 00000000..c73e67a3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php @@ -0,0 +1,363 @@ +value); + } + + if ($c instanceof UnresolvedBinaryOp) { + $left = self::resolve( + $classlikes, + $c->left, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + ); + $right = self::resolve( + $classlikes, + $c->right, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + ); + + if ($left instanceof TMixed || $right instanceof TMixed) { + return new TMixed; + } + + if ($c instanceof UnresolvedConcatOp) { + if (($left instanceof TLiteralString + || $left instanceof TLiteralFloat + || $left instanceof TLiteralInt) + && ($right instanceof TLiteralString + || $right instanceof TLiteralFloat + || $right instanceof TLiteralInt) + ) { + return new TLiteralString($left->value . $right->value); + } + + return new TString(); + } + + if ($c instanceof UnresolvedAdditionOp + || $c instanceof UnresolvedSubtractionOp + || $c instanceof UnresolvedDivisionOp + || $c instanceof UnresolvedMultiplicationOp + || $c instanceof UnresolvedBitwiseOr + || $c instanceof UnresolvedBitwiseXor + || $c instanceof UnresolvedBitwiseAnd + ) { + if (($left instanceof TLiteralFloat || $left instanceof TLiteralInt) + && ($right instanceof TLiteralFloat || $right instanceof TLiteralInt) + ) { + if ($c instanceof UnresolvedAdditionOp) { + return self::getLiteralTypeFromScalarValue($left->value + $right->value); + } + + if ($c instanceof UnresolvedSubtractionOp) { + return self::getLiteralTypeFromScalarValue($left->value - $right->value); + } + + if ($c instanceof UnresolvedDivisionOp) { + return self::getLiteralTypeFromScalarValue($left->value / $right->value); + } + + if ($c instanceof UnresolvedBitwiseOr) { + return self::getLiteralTypeFromScalarValue($left->value | $right->value); + } + + if ($c instanceof UnresolvedBitwiseXor) { + return self::getLiteralTypeFromScalarValue($left->value ^ $right->value); + } + + if ($c instanceof UnresolvedBitwiseAnd) { + return self::getLiteralTypeFromScalarValue($left->value & $right->value); + } + + return self::getLiteralTypeFromScalarValue($left->value * $right->value); + } + + if ($left instanceof TKeyedArray && $right instanceof TKeyedArray) { + $keyed_array = new TKeyedArray($left->properties + $right->properties); + $keyed_array->sealed = true; + return $keyed_array; + } + + return new TMixed; + } + + return new TMixed; + } + + if ($c instanceof UnresolvedTernary) { + $cond = self::resolve( + $classlikes, + $c->cond, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + ); + $if = $c->if ? self::resolve( + $classlikes, + $c->if, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + ) : null; + $else = self::resolve( + $classlikes, + $c->else, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + ); + + if ($cond instanceof TLiteralFloat + || $cond instanceof TLiteralInt + || $cond instanceof TLiteralString + ) { + if ($cond->value) { + return $if ?? $cond; + } + } elseif ($cond instanceof TFalse || $cond instanceof TNull) { + return $else; + } elseif ($cond instanceof TTrue) { + return $if ?? $cond; + } + } + + if ($c instanceof ArrayValue) { + $properties = []; + $auto_key = 0; + + if (!$c->entries) { + return new TArray([Type::getEmpty(), Type::getEmpty()]); + } + + $is_list = true; + + foreach ($c->entries as $entry) { + if ($entry instanceof ArraySpread) { + $spread_array = self::resolve( + $classlikes, + $entry->array, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + ); + + if ($spread_array instanceof TArray && $spread_array->type_params[1]->isEmpty()) { + continue; + } + + if (!$spread_array instanceof TKeyedArray) { + return new TArray([Type::getArrayKey(), Type::getMixed()]); + } + + foreach ($spread_array->properties as $spread_array_type) { + $properties[$auto_key++] = $spread_array_type; + } + continue; + } + + if ($entry->key) { + $key_type = self::resolve( + $classlikes, + $entry->key, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + ); + + if (!$key_type instanceof TLiteralInt + || $key_type->value !== $auto_key + ) { + $is_list = false; + } + } else { + $key_type = new TLiteralInt($auto_key); + } + + if ($key_type instanceof TLiteralInt + || $key_type instanceof TLiteralString + ) { + $key_value = $key_type->value; + if ($key_type instanceof TLiteralInt) { + $auto_key = $key_type->value + 1; + } elseif (ctype_digit($key_type->value)) { + $auto_key = ((int) $key_type->value) + 1; + } + } else { + return new TArray([Type::getArrayKey(), Type::getMixed()]); + } + + $value_type = new Union([self::resolve( + $classlikes, + $entry->value, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + )]); + + $properties[$key_value] = $value_type; + } + + if (empty($properties)) { + $resolved_type = new TArray([ + new Union([new TEmpty()]), + new Union([new TEmpty()]), + ]); + } else { + $resolved_type = new TKeyedArray($properties); + + $resolved_type->is_list = $is_list; + $resolved_type->sealed = true; + } + + return $resolved_type; + } + + if ($c instanceof ClassConstant) { + if ($c->name === 'class') { + return new TLiteralClassString($c->fqcln); + } + + $found_type = $classlikes->getClassConstantType( + $c->fqcln, + $c->name, + ReflectionProperty::IS_PRIVATE, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + ); + + if ($found_type) { + return $found_type->getSingleAtomic(); + } + } + + if ($c instanceof ArrayOffsetFetch) { + $var_type = self::resolve( + $classlikes, + $c->array, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + ); + + $offset_type = self::resolve( + $classlikes, + $c->offset, + $statements_analyzer, + $visited_constant_ids + [$c_id => true] + ); + + if ($var_type instanceof TKeyedArray + && ($offset_type instanceof TLiteralInt + || $offset_type instanceof TLiteralString) + ) { + $union = $var_type->properties[$offset_type->value] ?? null; + + if ($union && $union->isSingle()) { + return $union->getSingleAtomic(); + } + } + } + + if ($c instanceof Constant) { + if ($statements_analyzer) { + $found_type = ConstFetchAnalyzer::getConstType( + $statements_analyzer, + $c->name, + $c->is_fully_qualified, + null + ); + + if ($found_type) { + return $found_type->getSingleAtomic(); + } + } + } + + return new TMixed; + } + + /** + * @param string|int|float|bool|null $value + */ + private static function getLiteralTypeFromScalarValue($value): Atomic + { + if (is_string($value)) { + return new TLiteralString($value); + } + + if (is_int($value)) { + return new TLiteralInt($value); + } + + if (is_float($value)) { + return new TLiteralFloat($value); + } + + if ($value === false) { + return new TFalse; + } + + if ($value === true) { + return new TTrue; + } + + return new TNull; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php new file mode 100644 index 00000000..988a8140 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php @@ -0,0 +1,159 @@ +> */ + protected $forward_edges = []; + + abstract public function addNode(DataFlowNode $node): void; + + /** + * @param array $added_taints + * @param array $removed_taints + */ + public function addPath( + DataFlowNode $from, + DataFlowNode $to, + string $path_type, + ?array $added_taints = null, + ?array $removed_taints = null + ): void { + $from_id = $from->id; + $to_id = $to->id; + + if ($from_id === $to_id) { + return; + } + + $length = 0; + + if ($from->code_location + && $to->code_location + && $from->code_location->file_path === $to->code_location->file_path + ) { + $to_line = $to->code_location->raw_line_number; + $from_line = $from->code_location->raw_line_number; + $length = abs($to_line - $from_line); + } + + $this->forward_edges[$from_id][$to_id] = new Path($path_type, $length, $added_taints, $removed_taints); + } + + /** + * @param array $previous_path_types + * + * @psalm-pure + */ + protected static function shouldIgnoreFetch( + string $path_type, + string $expression_type, + array $previous_path_types + ): bool { + $el = strlen($expression_type); + + // arraykey-fetch requires a matching arraykey-assignment at the same level + // otherwise the tainting is not valid + if (strpos($path_type, $expression_type . '-fetch-') === 0 || $path_type === 'arraykey-fetch') { + $fetch_nesting = 0; + + $previous_path_types = array_reverse($previous_path_types); + + foreach ($previous_path_types as $previous_path_type) { + if ($previous_path_type === $expression_type . '-assignment') { + if ($fetch_nesting === 0) { + return false; + } + + $fetch_nesting--; + } + + if (strpos($previous_path_type, $expression_type . '-fetch') === 0) { + $fetch_nesting++; + } + + if (strpos($previous_path_type, $expression_type . '-assignment-') === 0) { + if ($fetch_nesting > 0) { + $fetch_nesting--; + continue; + } + + if (substr($previous_path_type, $el + 12) === substr($path_type, $el + 7)) { + return false; + } + + return true; + } + } + } + + return false; + } + + /** + * @return array{int, int, int, float} + */ + public function getEdgeStats(): array + { + $lengths = 0; + + $destination_counts = []; + $origin_counts = []; + + foreach ($this->forward_edges as $from_id => $destinations) { + foreach ($destinations as $to_id => $path) { + if ($path->length === 0) { + continue; + } + + $lengths += $path->length; + + if (!isset($destination_counts[$to_id])) { + $destination_counts[$to_id] = 0; + } + + $destination_counts[$to_id]++; + + $origin_counts[$from_id] = true; + } + } + + $count = array_sum($destination_counts); + + if (!$count) { + return [0, 0, 0, 0.0]; + } + + $mean = $lengths / $count; + + return [$count, count($origin_counts), count($destination_counts), $mean]; + } + + /** + * @psalm-return list> + */ + public function summarizeEdges(): array + { + $edges = []; + + foreach ($this->forward_edges as $source => $destinations) { + $edges[] = array_merge([$source], array_keys($destinations)); + } + + return $edges; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php new file mode 100644 index 00000000..ca882a0c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php @@ -0,0 +1,603 @@ + + */ + private static $stubbed_functions; + + /** @var FunctionReturnTypeProvider */ + public $return_type_provider; + + /** @var FunctionExistenceProvider */ + public $existence_provider; + + /** @var FunctionParamsProvider */ + public $params_provider; + + /** + * @var Reflection + */ + private $reflection; + + public function __construct(FileStorageProvider $storage_provider, Reflection $reflection) + { + $this->file_storage_provider = $storage_provider; + $this->reflection = $reflection; + $this->return_type_provider = new FunctionReturnTypeProvider(); + $this->existence_provider = new FunctionExistenceProvider(); + $this->params_provider = new FunctionParamsProvider(); + + self::$stubbed_functions = []; + } + + /** + * @param non-empty-lowercase-string $function_id + */ + public function getStorage( + ?StatementsAnalyzer $statements_analyzer, + string $function_id, + ?string $root_file_path = null, + ?string $checked_file_path = null + ): FunctionStorage { + if ($function_id[0] === '\\') { + $function_id = substr($function_id, 1); + } + + if (isset(self::$stubbed_functions[$function_id])) { + return self::$stubbed_functions[$function_id]; + } + + $file_storage = null; + + if ($statements_analyzer) { + $root_file_path = $statements_analyzer->getRootFilePath(); + $checked_file_path = $statements_analyzer->getFilePath(); + + $file_storage = $this->file_storage_provider->get($root_file_path); + + $function_analyzers = $statements_analyzer->getFunctionAnalyzers(); + + if (isset($function_analyzers[$function_id])) { + $function_id = $function_analyzers[$function_id]->getFunctionId(); + + if (isset($file_storage->functions[$function_id])) { + return $file_storage->functions[$function_id]; + } + } + + // closures can be returned here + if (isset($file_storage->functions[$function_id])) { + return $file_storage->functions[$function_id]; + } + } + + if (!$root_file_path || !$checked_file_path) { + if ($this->reflection->hasFunction($function_id)) { + return $this->reflection->getFunctionStorage($function_id); + } + + throw new UnexpectedValueException( + 'Expecting non-empty $root_file_path and $checked_file_path' + ); + } + + if ($this->reflection->hasFunction($function_id)) { + return $this->reflection->getFunctionStorage($function_id); + } + + if (!isset($file_storage->declaring_function_ids[$function_id])) { + if ($checked_file_path !== $root_file_path) { + $file_storage = $this->file_storage_provider->get($checked_file_path); + + if (isset($file_storage->functions[$function_id])) { + return $file_storage->functions[$function_id]; + } + } + + throw new UnexpectedValueException( + 'Expecting ' . $function_id . ' to have storage in ' . $checked_file_path + ); + } + + $declaring_file_path = $file_storage->declaring_function_ids[$function_id]; + + $declaring_file_storage = $this->file_storage_provider->get($declaring_file_path); + + if (!isset($declaring_file_storage->functions[$function_id])) { + throw new UnexpectedValueException( + 'Not expecting ' . $function_id . ' to not have storage in ' . $declaring_file_path + ); + } + + return $declaring_file_storage->functions[$function_id]; + } + + public function addGlobalFunction(string $function_id, FunctionStorage $storage): void + { + self::$stubbed_functions[strtolower($function_id)] = $storage; + } + + public function hasStubbedFunction(string $function_id): bool + { + return isset(self::$stubbed_functions[strtolower($function_id)]); + } + + /** + * @return array + */ + public function getAllStubbedFunctions(): array + { + return self::$stubbed_functions; + } + + /** + * @param lowercase-string $function_id + */ + public function functionExists( + StatementsAnalyzer $statements_analyzer, + string $function_id + ): bool { + if ($this->existence_provider->has($function_id)) { + $function_exists = $this->existence_provider->doesFunctionExist($statements_analyzer, $function_id); + + if ($function_exists !== null) { + return $function_exists; + } + } + + $file_storage = $this->file_storage_provider->get($statements_analyzer->getRootFilePath()); + + if (isset($file_storage->declaring_function_ids[$function_id])) { + return true; + } + + if ($this->reflection->hasFunction($function_id)) { + return true; + } + + if (isset(self::$stubbed_functions[$function_id])) { + return true; + } + + if (isset($statements_analyzer->getFunctionAnalyzers()[$function_id])) { + return true; + } + + $predefined_functions = $statements_analyzer->getCodebase()->config->getPredefinedFunctions(); + + if (isset($predefined_functions[$function_id])) { + /** @psalm-suppress ArgumentTypeCoercion */ + if ($this->reflection->registerFunction($function_id) === false) { + return false; + } + + return true; + } + + return false; + } + + /** + * @param non-empty-string $function_name + * + * @return non-empty-string + */ + public function getFullyQualifiedFunctionNameFromString(string $function_name, StatementsSource $source): string + { + if ($function_name[0] === '\\') { + $function_name = substr($function_name, 1); + + if ($function_name === '') { + throw new UnexpectedValueException('Malformed function name'); + } + + return $function_name; + } + + $function_name_lcase = strtolower($function_name); + + $aliases = $source->getAliases(); + + $imported_function_namespaces = $aliases->functions; + $imported_namespaces = $aliases->uses; + + if (strpos($function_name, '\\') !== false) { + $function_name_parts = explode('\\', $function_name); + $first_namespace = array_shift($function_name_parts); + $first_namespace_lcase = strtolower($first_namespace); + + if (isset($imported_namespaces[$first_namespace_lcase])) { + return $imported_namespaces[$first_namespace_lcase] . '\\' . implode('\\', $function_name_parts); + } + + if (isset($imported_function_namespaces[$first_namespace_lcase])) { + return $imported_function_namespaces[$first_namespace_lcase] . '\\' . + implode('\\', $function_name_parts); + } + } elseif (isset($imported_function_namespaces[$function_name_lcase])) { + return $imported_function_namespaces[$function_name_lcase]; + } + + $namespace = $source->getNamespace(); + + return ($namespace ? $namespace . '\\' : '') . $function_name; + } + + /** + * @return array + */ + public function getMatchingFunctionNames( + string $stub, + int $offset, + string $file_path, + Codebase $codebase + ): array { + if ($stub[0] === '*') { + $stub = substr($stub, 1); + } + + $fully_qualified = false; + + if ($stub[0] === '\\') { + $fully_qualified = true; + $stub = substr($stub, 1); + $stub_namespace = ''; + } else { + // functions can reference either the current namespace or root-namespaced + // equivalents. We therefore want to make both candidates. + [$stub_namespace, $stub] = explode('-', $stub); + } + + /** @var array */ + $matching_functions = []; + + $file_storage = $this->file_storage_provider->get($file_path); + + $current_namespace_aliases = null; + foreach ($file_storage->namespace_aliases as $namespace_start => $namespace_aliases) { + if ($namespace_start < $offset) { + $current_namespace_aliases = $namespace_aliases; + break; + } + } + + // We will search all functions for several patterns. This will + // be for all used namespaces, the global namespace and matched + // used functions. + $match_function_patterns = [ + $stub . '*', + ]; + + if ($stub_namespace) { + $match_function_patterns[] = $stub_namespace . '\\' . $stub . '*'; + } + + if ($current_namespace_aliases) { + foreach ($current_namespace_aliases->functions as $alias_name => $function_name) { + if (strpos($alias_name, $stub) === 0) { + try { + $match_function_patterns[] = $function_name; + } catch (Exception $e) { + } + } + } + + if (!$fully_qualified) { + foreach ($current_namespace_aliases->uses as $namespace_name) { + $match_function_patterns[] = $namespace_name . '\\' . $stub . '*'; + } + } + } + + $function_map = $file_storage->functions + + $this->getAllStubbedFunctions() + + $this->reflection->getFunctions() + + $codebase->config->getPredefinedFunctions(); + + foreach ($function_map as $function_name => $function) { + foreach ($match_function_patterns as $pattern) { + $pattern_lc = strtolower($pattern); + + if (substr($pattern, -1, 1) === '*') { + if (strpos($function_name, rtrim($pattern_lc, '*')) !== 0) { + continue; + } + } elseif ($function_name !== $pattern) { + continue; + } + if (is_bool($function)) { + /** @var callable-string $function_name */ + if ($this->reflection->registerFunction($function_name) === false) { + continue; + } + $function = $this->reflection->getFunctionStorage($function_name); + } + + if ($function->cased_name) { + $cased_name_parts = explode('\\', $function->cased_name); + $pattern_parts = explode('\\', $pattern); + + if (end($cased_name_parts)[0] !== end($pattern_parts)[0]) { + continue; + } + } + + /** @var lowercase-string $function_name */ + $matching_functions[$function_name] = $function; + } + } + + return $matching_functions; + } + + public static function isVariadic(Codebase $codebase, string $function_id, string $file_path): bool + { + $file_storage = $codebase->file_storage_provider->get($file_path); + + if (!isset($file_storage->declaring_function_ids[$function_id])) { + return false; + } + + $declaring_file_path = $file_storage->declaring_function_ids[$function_id]; + + $file_storage = $declaring_file_path === $file_path + ? $file_storage + : $codebase->file_storage_provider->get($declaring_file_path); + + return isset($file_storage->functions[$function_id]) && $file_storage->functions[$function_id]->variadic; + } + + /** + * @param ?list $args + */ + public function isCallMapFunctionPure( + Codebase $codebase, + ?NodeTypeProvider $type_provider, + string $function_id, + ?array $args, + bool &$must_use = true + ): bool { + $impure_functions = [ + // file io + 'chdir', 'chgrp', 'chmod', 'chown', 'chroot', 'copy', 'file_get_contents', 'file_put_contents', + 'opendir', 'readdir', 'closedir', 'rewinddir', 'scandir', + 'fopen', 'fread', 'fwrite', 'fclose', 'touch', 'fpassthru', 'fputs', 'fscanf', 'fseek', 'flock', + 'ftruncate', 'fprintf', 'symlink', 'mkdir', 'unlink', 'rename', 'rmdir', 'popen', 'pclose', + 'fgetcsv', 'fputcsv', 'umask', 'finfo_open', 'finfo_close', 'finfo_file', + 'stream_set_timeout', 'fgets', 'fflush', 'move_uploaded_file', 'file_exists', 'realpath', 'glob', + 'is_readable', 'is_dir', 'is_file', + + // stream/socket io + 'stream_context_set_option', 'socket_write', 'stream_set_blocking', 'socket_close', + 'socket_set_option', 'stream_set_write_buffer', 'stream_socket_enable_crypto', 'stream_copy_to_stream', + 'stream_wrapper_register', + + // meta calls + 'call_user_func', 'call_user_func_array', 'define', 'create_function', + + // http + 'header', 'header_remove', 'http_response_code', 'setcookie', + + // output buffer + 'ob_start', 'ob_end_clean', 'ob_get_clean', 'readfile', 'printf', 'var_dump', 'phpinfo', + 'ob_implicit_flush', 'vprintf', + + // mcrypt + 'mcrypt_generic_init', 'mcrypt_generic_deinit', 'mcrypt_module_close', + + // internal optimisation + 'opcache_compile_file', 'clearstatcache', + + // process-related + 'pcntl_signal', 'pcntl_alarm', 'posix_kill', 'cli_set_process_title', 'pcntl_async_signals', 'proc_close', + 'proc_nice', 'proc_open', 'proc_terminate', + + // curl + 'curl_setopt', 'curl_close', 'curl_multi_add_handle', 'curl_multi_remove_handle', + 'curl_multi_select', 'curl_multi_close', 'curl_setopt_array', + + // apc, apcu + 'apc_store', 'apc_delete', 'apc_clear_cache', 'apc_add', 'apc_inc', 'apc_dec', 'apc_cas', + 'apcu_store', 'apcu_delete', 'apcu_clear_cache', 'apcu_add', 'apcu_inc', 'apcu_dec', 'apcu_cas', + + // gz + 'gzwrite', 'gzrewind', 'gzseek', 'gzclose', + + // newrelic + 'newrelic_start_transaction', 'newrelic_name_transaction', 'newrelic_add_custom_parameter', + 'newrelic_add_custom_tracer', 'newrelic_background_job', 'newrelic_end_transaction', + 'newrelic_set_appname', + + // execution + 'shell_exec', 'exec', 'system', 'passthru', 'pcntl_exec', + + // well-known functions + 'libxml_use_internal_errors', 'libxml_disable_entity_loader', 'curl_exec', + 'mt_srand', 'openssl_pkcs7_sign', 'openssl_sign', + 'mt_rand', 'rand', 'random_int', 'random_bytes', + 'wincache_ucache_delete', 'wincache_ucache_set', 'wincache_ucache_inc', + 'class_alias', + 'class_exists', // impure by virtue of triggering autoloader + + // php environment + 'ini_set', 'sleep', 'usleep', 'register_shutdown_function', + 'error_reporting', 'register_tick_function', 'unregister_tick_function', + 'set_error_handler', 'user_error', 'trigger_error', 'restore_error_handler', + 'date_default_timezone_set', 'assert_options', 'setlocale', + 'set_exception_handler', 'set_time_limit', 'putenv', 'spl_autoload_register', + 'spl_autoload_unregister', 'microtime', 'array_rand', 'set_include_path', + + // logging + 'openlog', 'syslog', 'error_log', 'define_syslog_variables', + + // session + 'session_id', 'session_decode', 'session_name', 'session_set_cookie_params', + 'session_set_save_handler', 'session_regenerate_id', 'mb_internal_encoding', + 'session_start', 'session_cache_limiter', + + // ldap + 'ldap_set_option', + + // iterators + 'rewind', 'iterator_apply', 'iterator_to_array', + + // mysqli + 'mysqli_select_db', 'mysqli_dump_debug_info', 'mysqli_kill', 'mysqli_multi_query', + 'mysqli_next_result', 'mysqli_options', 'mysqli_ping', 'mysqli_query', 'mysqli_report', + 'mysqli_rollback', 'mysqli_savepoint', 'mysqli_set_charset', 'mysqli_ssl_set', 'mysqli_close', + + // script execution + 'ignore_user_abort', + + // ftp + 'ftp_close', 'ftp_pasv', + + // bcmath + 'bcscale', + + // json + 'json_last_error', + + // opcache + 'opcache_compile_file', 'opcache_get_configuration', 'opcache_get_status', + 'opcache_invalidate', 'opcache_is_script_cached', 'opcache_reset', + + //gettext + 'bindtextdomain', + ]; + + if (in_array(strtolower($function_id), $impure_functions, true)) { + return false; + } + + if (strpos($function_id, 'image') === 0) { + return false; + } + + if (strpos($function_id, 'readline') === 0) { + return false; + } + + if (($function_id === 'var_export' || $function_id === 'print_r') && !isset($args[1])) { + return false; + } + + if ($function_id === 'assert') { + $must_use = false; + return true; + } + + if ($function_id === 'func_num_args' || $function_id === 'func_get_args') { + return true; + } + + if ($function_id === 'count' && isset($args[0]) && $type_provider) { + $count_type = $type_provider->getType($args[0]->value); + + if ($count_type) { + foreach ($count_type->getAtomicTypes() as $atomic_count_type) { + if ($atomic_count_type instanceof TNamedObject) { + $count_method_id = new MethodIdentifier( + $atomic_count_type->value, + 'count' + ); + + try { + return $codebase->methods->getStorage($count_method_id)->mutation_free; + } catch (Exception $e) { + // do nothing + } + } + } + } + } + + $function_callable = InternalCallMapHandler::getCallableFromCallMapById( + $codebase, + $function_id, + $args ?: [], + null + ); + + if (!$function_callable->params + || ($args !== null && count($args) === 0) + || ($function_callable->return_type && $function_callable->return_type->isVoid()) + ) { + return false; + } + + $must_use = $function_id !== 'array_map' + || (isset($args[0]) && !$args[0]->value instanceof ClosureNode); + + foreach ($function_callable->params as $i => $param) { + if ($type_provider && $param->type && $param->type->hasCallableType() && isset($args[$i])) { + $arg_type = $type_provider->getType($args[$i]->value); + + if ($arg_type) { + foreach ($arg_type->getAtomicTypes() as $possible_callable) { + $possible_callable = CallableTypeComparator::getCallableFromAtomic( + $codebase, + $possible_callable + ); + + if ($possible_callable && !$possible_callable->is_pure) { + return false; + } + } + } + } + + if ($param->by_ref && isset($args[$i])) { + $must_use = false; + } + } + + return true; + } + + public static function clearCache(): void + { + self::$stubbed_functions = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php new file mode 100644 index 00000000..8af4d0cb --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php @@ -0,0 +1,437 @@ +>|null + */ + private static $call_map; + + /** + * @var array>|null + */ + private static $call_map_callables = []; + + /** + * @var array>> + */ + private static $taint_sink_map = []; + + /** + * @param list $args + */ + public static function getCallableFromCallMapById( + Codebase $codebase, + string $method_id, + array $args, + ?NodeDataProvider $nodes + ): TCallable { + $possible_callables = self::getCallablesFromCallMap($method_id); + + if ($possible_callables === null) { + throw new UnexpectedValueException( + 'Not expecting $function_param_options to be null for ' . $method_id + ); + } + + return self::getMatchingCallableFromCallMapOptions( + $codebase, + $possible_callables, + $args, + $nodes, + $method_id + ); + } + + /** + * @param array $callables + * @param list $args + * + */ + public static function getMatchingCallableFromCallMapOptions( + Codebase $codebase, + array $callables, + array $args, + ?NodeTypeProvider $nodes, + string $method_id + ): TCallable { + if (count($callables) === 1) { + return $callables[0]; + } + + $matching_param_count_callable = null; + $matching_coerced_param_count_callable = null; + + foreach ($callables as $possible_callable) { + $possible_function_params = $possible_callable->params; + + assert($possible_function_params !== null); + + $all_args_match = true; + $type_coerced = false; + + $last_param = count($possible_function_params) + ? $possible_function_params[count($possible_function_params) - 1] + : null; + + $mandatory_param_count = count($possible_function_params); + + foreach ($possible_function_params as $i => $possible_function_param) { + if ($possible_function_param->is_optional) { + $mandatory_param_count = $i; + break; + } + } + + if ($mandatory_param_count > count($args) && !($last_param && $last_param->is_variadic)) { + continue; + } + + foreach ($args as $argument_offset => $arg) { + if ($argument_offset >= count($possible_function_params)) { + if (!$last_param || !$last_param->is_variadic) { + $all_args_match = false; + break; + } + + $function_param = $last_param; + } else { + $function_param = $possible_function_params[$argument_offset]; + } + + $param_type = $function_param->type; + + if (!$param_type) { + continue; + } + + if (!$nodes + || !($arg_type = $nodes->getType($arg->value)) + ) { + continue; + } + + if ($arg_type->hasMixed()) { + continue; + } + + if ($arg->unpack && !$function_param->is_variadic) { + if ($arg_type->hasArray()) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TKeyedArray|TList + */ + $array_atomic_type = $arg_type->getAtomicTypes()['array']; + + if ($array_atomic_type instanceof TKeyedArray) { + $arg_type = $array_atomic_type->getGenericValueType(); + } elseif ($array_atomic_type instanceof TList) { + $arg_type = $array_atomic_type->type_param; + } else { + $arg_type = $array_atomic_type->type_params[1]; + } + } + } + + $arg_result = new TypeComparisonResult(); + + if (UnionTypeComparator::isContainedBy( + $codebase, + $arg_type, + $param_type, + true, + true, + $arg_result + ) || $arg_result->type_coerced) { + if ($arg_result->type_coerced) { + $type_coerced = true; + } + + continue; + } + + $all_args_match = false; + break; + } + + if (count($args) === count($possible_function_params)) { + $matching_param_count_callable = $possible_callable; + } + + if ($all_args_match && (!$type_coerced || $method_id === 'max' || $method_id === 'min')) { + return $possible_callable; + } + + if ($all_args_match) { + $matching_coerced_param_count_callable = $possible_callable; + } + } + + if ($matching_coerced_param_count_callable) { + return $matching_coerced_param_count_callable; + } + + if ($matching_param_count_callable) { + return $matching_param_count_callable; + } + + // if we don't succeed in finding a match, set to the first possible and wait for issues below + return $callables[0]; + } + + /** + * @return list|null + */ + public static function getCallablesFromCallMap(string $function_id): ?array + { + $call_map_key = strtolower($function_id); + + if (isset(self::$call_map_callables[$call_map_key])) { + return self::$call_map_callables[$call_map_key]; + } + + $call_map = self::getCallMap(); + + if (!isset($call_map[$call_map_key])) { + return null; + } + + $call_map_functions = []; + $call_map_functions[] = $call_map[$call_map_key]; + + for ($i = 1; $i < 10; ++$i) { + if (!isset($call_map[$call_map_key . '\'' . $i])) { + break; + } + + $call_map_functions[] = $call_map[$call_map_key . '\'' . $i]; + } + + $possible_callables = []; + + foreach ($call_map_functions as $call_map_function_args) { + $return_type_string = array_shift($call_map_function_args); + + if (!$return_type_string) { + $return_type = Type::getMixed(); + } else { + $return_type = Type::parseString($return_type_string); + } + + $function_params = []; + + $arg_offset = 0; + + /** @var string $arg_name - key type changed with above array_shift */ + foreach ($call_map_function_args as $arg_name => $arg_type) { + $by_reference = false; + $optional = false; + $variadic = false; + + if ($arg_name[0] === '&') { + $arg_name = substr($arg_name, 1); + $by_reference = true; + } + + if (substr($arg_name, -1) === '=') { + $arg_name = substr($arg_name, 0, -1); + $optional = true; + } + + if (strpos($arg_name, '...') === 0) { + $arg_name = substr($arg_name, 3); + $variadic = true; + } + + $param_type = $arg_type + ? Type::parseString($arg_type) + : Type::getMixed(); + + $out_type = null; + + if (strlen($arg_name) > 2 && $arg_name[0] === 'w' && $arg_name[1] === '_') { + $out_type = $param_type; + $param_type = Type::getMixed(); + } + + $function_param = new FunctionLikeParameter( + $arg_name, + $by_reference, + $param_type, + null, + null, + $optional, + false, + $variadic + ); + + if ($out_type) { + $function_param->out_type = $out_type; + } + + if ($arg_name === 'haystack') { + $function_param->expect_variable = true; + } + + if (isset(self::$taint_sink_map[$call_map_key][$arg_offset])) { + $function_param->sinks = self::$taint_sink_map[$call_map_key][$arg_offset]; + } + + $function_param->signature_type = null; + + $function_params[] = $function_param; + + $arg_offset++; + } + + $possible_callables[] = new TCallable('callable', $function_params, $return_type); + } + + self::$call_map_callables[$call_map_key] = $possible_callables; + + return $possible_callables; + } + + /** + * Gets the method/function call map + * + * @return array> + */ + public static function getCallMap(): array + { + $codebase = ProjectAnalyzer::getInstance()->getCodebase(); + $analyzer_major_version = $codebase->php_major_version; + $analyzer_minor_version = $codebase->php_minor_version; + + $analyzer_version = $analyzer_major_version . '.' . $analyzer_minor_version; + $current_version = self::PHP_MAJOR_VERSION . '.' . self::PHP_MINOR_VERSION; + + $analyzer_version_int = (int) ($analyzer_major_version . $analyzer_minor_version); + $current_version_int = (int) (self::PHP_MAJOR_VERSION . self::PHP_MINOR_VERSION); + + if (self::$call_map !== null + && $analyzer_major_version === self::$loaded_php_major_version + && $analyzer_minor_version === self::$loaded_php_minor_version + ) { + return self::$call_map; + } + + /** @var array> */ + $call_map = require(dirname(__DIR__, 4) . '/dictionaries/CallMap.php'); + + self::$call_map = []; + + foreach ($call_map as $key => $value) { + $cased_key = strtolower($key); + self::$call_map[$cased_key] = $value; + } + + /** + * @var array>> + */ + $taint_map = require(dirname(__DIR__, 4) . '/dictionaries/InternalTaintSinkMap.php'); + + foreach ($taint_map as $key => $value) { + $cased_key = strtolower($key); + self::$taint_sink_map[$cased_key] = $value; + } + + 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) { + $delta_file = dirname(__DIR__, 4) . '/dictionaries/CallMap_' . $i . '_delta.php'; + if (!file_exists($delta_file)) { + continue; + } + /** + * @var array{ + * added: array>, + * changed: array, + * new: array + * }>, + * removed: array> + * } + */ + $diff_call_map = require($delta_file); + + foreach ($diff_call_map['added'] as $key => $_) { + $cased_key = strtolower($key); + unset(self::$call_map[$cased_key]); + } + + foreach ($diff_call_map['removed'] as $key => $value) { + $cased_key = strtolower($key); + self::$call_map[$cased_key] = $value; + } + + foreach ($diff_call_map['changed'] as $key => ['old' => $value]) { + $cased_key = strtolower($key); + self::$call_map[$cased_key] = $value; + } + } + } + + self::$loaded_php_major_version = $analyzer_major_version; + self::$loaded_php_minor_version = $analyzer_minor_version; + + return self::$call_map; + } + + public static function inCallMap(string $key): bool + { + return isset(self::getCallMap()[strtolower($key)]); + } + + public static function clearCache(): void + { + self::$call_map_callables = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php new file mode 100644 index 00000000..6324b775 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php @@ -0,0 +1,1255 @@ +classlike_storage_provider = $storage_provider; + $this->file_reference_provider = $file_reference_provider; + $this->classlikes = $classlikes; + $this->return_type_provider = new MethodReturnTypeProvider(); + $this->existence_provider = new MethodExistenceProvider(); + $this->visibility_provider = new MethodVisibilityProvider(); + $this->params_provider = new MethodParamsProvider(); + } + + /** + * Whether or not a given method exists + * + * If you pass true in $is_used argument the method return is considered used + * + * @param lowercase-string|null $calling_method_id + */ + public function methodExists( + MethodIdentifier $method_id, + ?string $calling_method_id = null, + ?CodeLocation $code_location = null, + ?StatementsSource $source = null, + ?string $source_file_path = null, + bool $use_method_existence_provider = true, + bool $is_used = false + ): bool { + $fq_class_name = $method_id->fq_class_name; + $method_name = $method_id->method_name; + + if ($use_method_existence_provider && $this->existence_provider->has($fq_class_name)) { + $method_exists = $this->existence_provider->doesMethodExist( + $fq_class_name, + $method_name, + $source, + $code_location + ); + + if ($method_exists !== null) { + return $method_exists; + } + } + + $old_method_id = null; + + $fq_class_name = strtolower($this->classlikes->getUnAliasedName($fq_class_name)); + + try { + $class_storage = $this->classlike_storage_provider->get($fq_class_name); + } catch (InvalidArgumentException $e) { + return false; + } + + if ($class_storage->is_enum) { + if ($method_name === 'cases') { + return true; + } + + if ($class_storage->enum_type + && in_array($method_name, ['from', 'tryFrom'], true) + ) { + return true; + } + } + + $source_file_path = $source ? $source->getFilePath() : $source_file_path; + + $calling_class_name = $source ? $source->getFQCLN() : null; + + if (!$calling_class_name && $calling_method_id) { + $calling_class_name = explode('::', $calling_method_id)[0]; + } + + if (isset($class_storage->declaring_method_ids[$method_name])) { + $declaring_method_id = $class_storage->declaring_method_ids[$method_name]; + + if ($calling_method_id === strtolower((string) $declaring_method_id)) { + return true; + } + + $declaring_fq_class_name = strtolower($declaring_method_id->fq_class_name); + + if ($declaring_fq_class_name !== strtolower((string) $calling_class_name)) { + if ($calling_method_id) { + $this->file_reference_provider->addMethodReferenceToClass( + $calling_method_id, + $declaring_fq_class_name + ); + } elseif ($source_file_path) { + $this->file_reference_provider->addNonMethodReferenceToClass( + $source_file_path, + $declaring_fq_class_name + ); + } + } + + if ((string) $method_id !== (string) $declaring_method_id + && $class_storage->user_defined + && isset($class_storage->potential_declaring_method_ids[$method_name]) + ) { + foreach ($class_storage->potential_declaring_method_ids[$method_name] as $potential_id => $_) { + if ($calling_method_id) { + $this->file_reference_provider->addMethodReferenceToClassMember( + $calling_method_id, + $potential_id, + $is_used + ); + } elseif ($source_file_path) { + $this->file_reference_provider->addFileReferenceToClassMember( + $source_file_path, + $potential_id, + $is_used + ); + } + } + } else { + if ($calling_method_id) { + $this->file_reference_provider->addMethodReferenceToClassMember( + $calling_method_id, + strtolower((string) $declaring_method_id), + $is_used + ); + } elseif ($source_file_path) { + $this->file_reference_provider->addFileReferenceToClassMember( + $source_file_path, + strtolower((string) $declaring_method_id), + $is_used + ); + } + } + + if ($this->collect_locations && $code_location) { + $this->file_reference_provider->addCallingLocationForClassMethod( + $code_location, + strtolower((string) $declaring_method_id) + ); + } + + foreach ($class_storage->class_implements as $fq_interface_name) { + $interface_method_id_lc = strtolower($fq_interface_name . '::' . $method_name); + + if ($this->collect_locations && $code_location) { + $this->file_reference_provider->addCallingLocationForClassMethod( + $code_location, + $interface_method_id_lc + ); + } + + if ($calling_method_id) { + $this->file_reference_provider->addMethodReferenceToClassMember( + $calling_method_id, + $interface_method_id_lc, + $is_used + ); + } elseif ($source_file_path) { + $this->file_reference_provider->addFileReferenceToClassMember( + $source_file_path, + $interface_method_id_lc, + $is_used + ); + } + } + + $declaring_method_class = $declaring_method_id->fq_class_name; + $declaring_method_name = $declaring_method_id->method_name; + + $declaring_class_storage = $this->classlike_storage_provider->get($declaring_method_class); + + if (isset($declaring_class_storage->overridden_method_ids[$declaring_method_name])) { + $overridden_method_ids = $declaring_class_storage->overridden_method_ids[$declaring_method_name]; + + foreach ($overridden_method_ids as $overridden_method_id) { + if ($this->collect_locations && $code_location) { + $this->file_reference_provider->addCallingLocationForClassMethod( + $code_location, + strtolower((string) $overridden_method_id) + ); + } + + if ($calling_method_id) { + // also store failures in case the method is added later + $this->file_reference_provider->addMethodReferenceToClassMember( + $calling_method_id, + strtolower((string) $overridden_method_id), + $is_used + ); + } elseif ($source_file_path) { + $this->file_reference_provider->addFileReferenceToClassMember( + $source_file_path, + strtolower((string) $overridden_method_id), + $is_used + ); + } + } + } + + return true; + } + + if ($source_file_path && $fq_class_name !== strtolower((string) $calling_class_name)) { + if ($calling_method_id) { + $this->file_reference_provider->addMethodReferenceToClass( + $calling_method_id, + $fq_class_name + ); + } else { + $this->file_reference_provider->addNonMethodReferenceToClass( + $source_file_path, + $fq_class_name + ); + } + } + + if ($class_storage->abstract && isset($class_storage->overridden_method_ids[$method_name])) { + return true; + } + + // support checking oldstyle constructors + if ($method_name === '__construct') { + $method_name_parts = explode('\\', $fq_class_name); + $old_constructor_name = array_pop($method_name_parts); + $old_method_id = $fq_class_name . '::' . $old_constructor_name; + } + + if (!$class_storage->user_defined + && (InternalCallMapHandler::inCallMap((string) $method_id) + || ($old_method_id && InternalCallMapHandler::inCallMap($old_method_id))) + ) { + return true; + } + + foreach ($class_storage->parent_classes + $class_storage->used_traits as $potential_future_declaring_fqcln) { + $potential_id = strtolower($potential_future_declaring_fqcln) . '::' . $method_name; + + if ($calling_method_id) { + // also store failures in case the method is added later + $this->file_reference_provider->addMethodReferenceToMissingClassMember( + $calling_method_id, + $potential_id + ); + } elseif ($source_file_path) { + $this->file_reference_provider->addFileReferenceToMissingClassMember( + $source_file_path, + $potential_id + ); + } + } + + if ($calling_method_id) { + // also store failures in case the method is added later + $this->file_reference_provider->addMethodReferenceToMissingClassMember( + $calling_method_id, + strtolower((string) $method_id) + ); + } elseif ($source_file_path) { + $this->file_reference_provider->addFileReferenceToMissingClassMember( + $source_file_path, + strtolower((string) $method_id) + ); + } + + return false; + } + + /** + * @param list $args + * + * @return list + */ + public function getMethodParams( + MethodIdentifier $method_id, + ?StatementsSource $source = null, + ?array $args = null, + ?Context $context = null + ): array { + $fq_class_name = $method_id->fq_class_name; + $method_name = $method_id->method_name; + + if ($this->params_provider->has($fq_class_name)) { + $method_params = $this->params_provider->getMethodParams( + $fq_class_name, + $method_name, + $args, + $source, + $context + ); + + if ($method_params !== null) { + return $method_params; + } + } + + $declaring_method_id = $this->getDeclaringMethodId($method_id); + + $callmap_id = $declaring_method_id ?? $method_id; + + // functions + if (InternalCallMapHandler::inCallMap((string) $callmap_id)) { + $class_storage = $this->classlike_storage_provider->get($callmap_id->fq_class_name); + + $declaring_method_name = $declaring_method_id->method_name ?? $method_name; + + if (!$class_storage->stubbed || empty($class_storage->methods[$declaring_method_name]->stubbed)) { + $function_callables = InternalCallMapHandler::getCallablesFromCallMap((string) $callmap_id); + + if ($function_callables === null) { + throw new UnexpectedValueException( + 'Not expecting $function_callables to be null for ' . $callmap_id + ); + } + + if (!$source || $args === null || count($function_callables) === 1) { + assert($function_callables[0]->params !== null); + + return $function_callables[0]->params; + } + + if ($context && $source instanceof StatementsAnalyzer) { + $was_inside_call = $context->inside_call; + + $context->inside_call = true; + + foreach ($args as $arg) { + ExpressionAnalyzer::analyze( + $source, + $arg->value, + $context + ); + } + + $context->inside_call = $was_inside_call; + } + + $matching_callable = InternalCallMapHandler::getMatchingCallableFromCallMapOptions( + $source->getCodebase(), + $function_callables, + $args, + $source->getNodeTypeProvider(), + (string) $callmap_id + ); + + assert($matching_callable->params !== null); + + return $matching_callable->params; + } + } + + if ($declaring_method_id) { + $storage = $this->getStorage($declaring_method_id); + + $params = $storage->params; + + if ($storage->has_docblock_param_types) { + return $params; + } + + $appearing_method_id = $this->getAppearingMethodId($declaring_method_id); + + if (!$appearing_method_id) { + return $params; + } + + $appearing_fq_class_name = $appearing_method_id->fq_class_name; + $appearing_method_name = $appearing_method_id->method_name; + + $class_storage = $this->classlike_storage_provider->get($appearing_fq_class_name); + + if (!isset($class_storage->overridden_method_ids[$appearing_method_name])) { + return $params; + } + + if (!isset($class_storage->documenting_method_ids[$appearing_method_name])) { + return $params; + } + + $overridden_method_id = $class_storage->documenting_method_ids[$appearing_method_name]; + + $overridden_storage = $this->getStorage($overridden_method_id); + + $overriding_fq_class_name = $overridden_method_id->fq_class_name; + + foreach ($params as $i => $param) { + if (isset($overridden_storage->params[$i]->type) + && $overridden_storage->params[$i]->has_docblock_type + ) { + $params[$i] = clone $param; + /** @var Union $params[$i]->type */ + $params[$i]->type = clone $overridden_storage->params[$i]->type; + + if ($source) { + $overridden_class_storage = $this->classlike_storage_provider->get($overriding_fq_class_name); + $params[$i]->type = self::localizeType( + $source->getCodebase(), + $params[$i]->type, + $appearing_fq_class_name, + $overridden_class_storage->name + ); + } + + if ($params[$i]->signature_type + && $params[$i]->signature_type->isNullable() + ) { + $params[$i]->type->addType(new TNull); + } + + $params[$i]->type_location = $overridden_storage->params[$i]->type_location; + } + } + + return $params; + } + + throw new UnexpectedValueException('Cannot get method params for ' . $method_id); + } + + public static function localizeType( + Codebase $codebase, + Union $type, + string $appearing_fq_class_name, + string $base_fq_class_name + ): Union { + $class_storage = $codebase->classlike_storage_provider->get($appearing_fq_class_name); + $extends = $class_storage->template_extended_params; + + if (!$extends) { + return $type; + } + + $type = clone $type; + + foreach ($type->getAtomicTypes() as $key => $atomic_type) { + if ($atomic_type instanceof TTemplateParam + && ($atomic_type->defining_class === $base_fq_class_name + || isset($extends[$atomic_type->defining_class])) + ) { + $types_to_add = self::getExtendedTemplatedTypes( + $atomic_type, + $extends + ); + + if ($types_to_add) { + $type->removeType($key); + + foreach ($types_to_add as $extra_added_type) { + $type->addType($extra_added_type); + } + } + } + + if ($atomic_type instanceof TTemplateParamClass) { + if ($atomic_type->defining_class === $base_fq_class_name) { + if (isset($extends[$base_fq_class_name][$atomic_type->param_name])) { + $extended_param = $extends[$base_fq_class_name][$atomic_type->param_name]; + + $types = array_values($extended_param->getAtomicTypes()); + + if (count($types) === 1 && $types[0] instanceof TNamedObject) { + $atomic_type->as_type = $types[0]; + } else { + $atomic_type->as_type = null; + } + } + } + } + + if ($atomic_type instanceof TArray + || $atomic_type instanceof TIterable + || $atomic_type instanceof TGenericObject + ) { + foreach ($atomic_type->type_params as &$type_param) { + $type_param = self::localizeType( + $codebase, + $type_param, + $appearing_fq_class_name, + $base_fq_class_name + ); + } + } + + if ($atomic_type instanceof TList) { + $atomic_type->type_param = self::localizeType( + $codebase, + $atomic_type->type_param, + $appearing_fq_class_name, + $base_fq_class_name + ); + } + + if ($atomic_type instanceof TKeyedArray) { + foreach ($atomic_type->properties as &$property_type) { + $property_type = self::localizeType( + $codebase, + $property_type, + $appearing_fq_class_name, + $base_fq_class_name + ); + } + } + + if ($atomic_type instanceof TCallable + || $atomic_type instanceof TClosure + ) { + if ($atomic_type->params) { + foreach ($atomic_type->params as $param) { + if ($param->type) { + $param->type = self::localizeType( + $codebase, + $param->type, + $appearing_fq_class_name, + $base_fq_class_name + ); + } + } + } + + if ($atomic_type->return_type) { + $atomic_type->return_type = self::localizeType( + $codebase, + $atomic_type->return_type, + $appearing_fq_class_name, + $base_fq_class_name + ); + } + } + } + + $type->bustCache(); + + return $type; + } + + /** + * @param array> $extends + * @return list + */ + public static function getExtendedTemplatedTypes( + TTemplateParam $atomic_type, + array $extends + ): array { + $extra_added_types = []; + + if (isset($extends[$atomic_type->defining_class][$atomic_type->param_name])) { + $extended_param = clone $extends[$atomic_type->defining_class][$atomic_type->param_name]; + + foreach ($extended_param->getAtomicTypes() as $extended_atomic_type) { + if ($extended_atomic_type instanceof TTemplateParam) { + $extra_added_types = array_merge( + $extra_added_types, + self::getExtendedTemplatedTypes( + $extended_atomic_type, + $extends + ) + ); + } else { + $extra_added_types[] = $extended_atomic_type; + } + } + } else { + $extra_added_types[] = $atomic_type; + } + + return $extra_added_types; + } + + public function isVariadic(MethodIdentifier $method_id): bool + { + $declaring_method_id = $this->getDeclaringMethodId($method_id); + + if (!$declaring_method_id) { + return false; + } + + return $this->getStorage($declaring_method_id)->variadic; + } + + /** + * @param list|null $args + * + */ + public function getMethodReturnType( + MethodIdentifier $method_id, + ?string &$self_class, + ?SourceAnalyzer $source_analyzer = null, + ?array $args = null + ): ?Union { + $original_fq_class_name = $method_id->fq_class_name; + $original_method_name = $method_id->method_name; + + $adjusted_fq_class_name = $this->classlikes->getUnAliasedName($original_fq_class_name); + + if ($adjusted_fq_class_name !== $original_fq_class_name) { + $original_fq_class_name = strtolower($adjusted_fq_class_name); + } + + $original_class_storage = $this->classlike_storage_provider->get($original_fq_class_name); + + if (isset($original_class_storage->pseudo_methods[$original_method_name])) { + return $original_class_storage->pseudo_methods[$original_method_name]->return_type; + } + + $declaring_method_id = $this->getDeclaringMethodId($method_id); + + if (!$declaring_method_id) { + return null; + } + + $appearing_method_id = $this->getAppearingMethodId($method_id); + + if (!$appearing_method_id) { + $class_storage = $this->classlike_storage_provider->get($original_fq_class_name); + + if ($class_storage->abstract && isset($class_storage->overridden_method_ids[$original_method_name])) { + $appearing_method_id = reset($class_storage->overridden_method_ids[$original_method_name]); + } else { + return null; + } + } + + $appearing_fq_class_name = $appearing_method_id->fq_class_name; + $appearing_method_name = $appearing_method_id->method_name; + + $appearing_fq_class_storage = $this->classlike_storage_provider->get($appearing_fq_class_name); + + if ($appearing_fq_class_name === 'UnitEnum' + && $original_class_storage->is_enum + ) { + if ($original_method_name === 'cases') { + if ($original_class_storage->enum_cases === []) { + return Type::getEmptyArray(); + } + $types = []; + + foreach ($original_class_storage->enum_cases as $case_name => $_) { + $types[] = new Union([new TEnumCase($original_fq_class_name, $case_name)]); + } + + $list = new TKeyedArray($types); + $list->is_list = true; + $list->sealed = true; + return new Union([$list]); + } + } + + if ($appearing_fq_class_name === 'BackedEnum' + && $original_class_storage->is_enum + && $original_class_storage->enum_type + ) { + if (($original_method_name === 'from' + || $original_method_name === 'tryfrom' + ) && $source_analyzer + && isset($args[0]) + && ($first_arg_type = $source_analyzer->getNodeTypeProvider()->getType($args[0]->value)) + ) { + $types = []; + foreach ($original_class_storage->enum_cases as $case_name => $case_storage) { + if (UnionTypeComparator::isContainedBy( + $source_analyzer->getCodebase(), + is_int($case_storage->value) ? + Type::getInt(false, $case_storage->value) : + Type::getString($case_storage->value), + $first_arg_type + )) { + $types[] = new TEnumCase($original_fq_class_name, $case_name); + } + } + if ($types) { + if ($original_method_name === 'tryfrom') { + $types[] = new TNull(); + } + return new Union($types); + } + return $original_method_name === 'tryfrom' ? Type::getNull() : Type::getNever(); + } + } + + if (!$appearing_fq_class_storage->user_defined + && !$appearing_fq_class_storage->stubbed + && InternalCallMapHandler::inCallMap((string) $appearing_method_id) + ) { + if ((string) $appearing_method_id === 'Closure::fromcallable' + && isset($args[0]) + && $source_analyzer + && ($first_arg_type = $source_analyzer->getNodeTypeProvider()->getType($args[0]->value)) + && $first_arg_type->isSingle() + ) { + foreach ($first_arg_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TCallable + || $atomic_type instanceof TClosure + ) { + $callable_type = clone $atomic_type; + + return new Union([new TClosure( + 'Closure', + $callable_type->params, + $callable_type->return_type + )]); + } + + if ($atomic_type instanceof TNamedObject + && $this->methodExists( + new MethodIdentifier($atomic_type->value, '__invoke') + ) + ) { + $invokable_storage = $this->getStorage( + new MethodIdentifier($atomic_type->value, '__invoke') + ); + + return new Union([new TClosure( + 'Closure', + $invokable_storage->params, + $invokable_storage->return_type + )]); + } + } + } + + $callmap_callables = InternalCallMapHandler::getCallablesFromCallMap((string) $appearing_method_id); + + if (!$callmap_callables || $callmap_callables[0]->return_type === null) { + throw new UnexpectedValueException('Shouldn’t get here'); + } + + $return_type_candidate = $callmap_callables[0]->return_type; + + if ($return_type_candidate->isFalsable()) { + $return_type_candidate->ignore_falsable_issues = true; + } + + return $return_type_candidate; + } + + $class_storage = $this->classlike_storage_provider->get($appearing_fq_class_name); + + $storage = $this->getStorage($declaring_method_id); + + $candidate_type = $storage->return_type; + + if ($candidate_type && $candidate_type->isVoid()) { + return clone $candidate_type; + } + + if (isset($class_storage->documenting_method_ids[$appearing_method_name])) { + $overridden_method_id = $class_storage->documenting_method_ids[$appearing_method_name]; + + // special override to allow inference of Iterator types + if ($overridden_method_id->fq_class_name === 'Iterator' + && $storage->return_type + && $storage->return_type === $storage->signature_return_type + ) { + return clone $storage->return_type; + } + + $overridden_storage = $this->getStorage($overridden_method_id); + + if ($overridden_storage->return_type) { + if ($overridden_storage->return_type->isNull()) { + return Type::getVoid(); + } + + if (!$candidate_type || !$source_analyzer) { + $self_class = $overridden_method_id->fq_class_name; + + return clone $overridden_storage->return_type; + } + + if ($candidate_type->getId() === $overridden_storage->return_type->getId()) { + $self_class = $appearing_fq_class_storage->name; + + return clone $candidate_type; + } + + $overridden_class_storage = + $this->classlike_storage_provider->get($overridden_method_id->fq_class_name); + + $overridden_storage_return_type = TypeExpander::expandUnion( + $source_analyzer->getCodebase(), + clone $overridden_storage->return_type, + $overridden_method_id->fq_class_name, + $appearing_fq_class_name, + $overridden_class_storage->parent_class, + true, + false, + $storage->final + ); + + $old_contained_by_new = UnionTypeComparator::isContainedBy( + $source_analyzer->getCodebase(), + $candidate_type, + $overridden_storage_return_type + ); + + $new_contained_by_old = UnionTypeComparator::isContainedBy( + $source_analyzer->getCodebase(), + $overridden_storage_return_type, + $candidate_type + ); + + if ((!$old_contained_by_new && !$new_contained_by_old) + || ($old_contained_by_new && $new_contained_by_old) + ) { + if ($old_contained_by_new) { //implicitly $new_contained_by_old as well + $attempted_intersection = Type::intersectUnionTypes( + $candidate_type, + $overridden_storage->return_type, + $source_analyzer->getCodebase() + ); + } else { + $attempted_intersection = Type::intersectUnionTypes( + $overridden_storage->return_type, + $candidate_type, + $source_analyzer->getCodebase() + ); + } + + if ($attempted_intersection) { + $self_class = $overridden_method_id->fq_class_name; + + return $attempted_intersection; + } + + $self_class = $appearing_fq_class_storage->name; + + return clone $candidate_type; + } + + if ($old_contained_by_new) { + $self_class = $appearing_fq_class_storage->name; + + return clone $candidate_type; + } + + $self_class = $overridden_method_id->fq_class_name; + + return clone $overridden_storage->return_type; + } + } + + if ($candidate_type) { + $self_class = $appearing_fq_class_storage->name; + + return clone $candidate_type; + } + + if (!isset($class_storage->overridden_method_ids[$appearing_method_name])) { + return null; + } + + $candidate_type = null; + + foreach ($class_storage->overridden_method_ids[$appearing_method_name] as $overridden_method_id) { + $overridden_storage = $this->getStorage($overridden_method_id); + + if ($overridden_storage->return_type) { + if ($overridden_storage->return_type->isNull()) { + if ($candidate_type && !$candidate_type->isVoid()) { + return null; + } + + $candidate_type = Type::getVoid(); + continue; + } + + $fq_overridden_class = $overridden_method_id->fq_class_name; + + $overridden_class_storage = + $this->classlike_storage_provider->get($fq_overridden_class); + + $overridden_return_type = clone $overridden_storage->return_type; + + $self_class = $overridden_class_storage->name; + + if ($candidate_type && $source_analyzer && !$candidate_type->isMixed()) { + $old_contained_by_new = UnionTypeComparator::isContainedBy( + $source_analyzer->getCodebase(), + $candidate_type, + $overridden_return_type + ); + + $new_contained_by_old = UnionTypeComparator::isContainedBy( + $source_analyzer->getCodebase(), + $overridden_return_type, + $candidate_type + ); + + if ((!$old_contained_by_new && !$new_contained_by_old) + || ($old_contained_by_new && $new_contained_by_old) + ) { + $attempted_intersection = Type::intersectUnionTypes( + $candidate_type, + $overridden_return_type, + $source_analyzer->getCodebase() + ); + + if ($attempted_intersection) { + $candidate_type = $attempted_intersection; + continue; + } + + return null; + } + + if ($old_contained_by_new) { + continue; + } + } + + $candidate_type = $overridden_return_type; + } + } + + return $candidate_type; + } + + public function getMethodReturnsByRef(MethodIdentifier $method_id): bool + { + $method_id = $this->getDeclaringMethodId($method_id); + + if (!$method_id) { + return false; + } + + $fq_class_storage = $this->classlike_storage_provider->get($method_id->fq_class_name); + + if (!$fq_class_storage->user_defined && InternalCallMapHandler::inCallMap((string) $method_id)) { + return false; + } + + return $this->getStorage($method_id)->returns_by_ref; + } + + /** + * @param CodeLocation|null $defined_location + * + */ + public function getMethodReturnTypeLocation( + MethodIdentifier $method_id, + CodeLocation &$defined_location = null + ): ?CodeLocation { + $method_id = $this->getDeclaringMethodId($method_id); + + if ($method_id === null) { + return null; + } + + $storage = $this->getStorage($method_id); + + if (!$storage->return_type_location) { + $overridden_method_ids = $this->getOverriddenMethodIds($method_id); + + foreach ($overridden_method_ids as $overridden_method_id) { + $overridden_storage = $this->getStorage($overridden_method_id); + + if ($overridden_storage->return_type_location) { + $defined_location = $overridden_storage->return_type_location; + break; + } + } + } + + return $storage->return_type_location; + } + + /** + * @param lowercase-string $method_name_lc + * @param lowercase-string $declaring_method_name_lc + * + */ + public function setDeclaringMethodId( + string $fq_class_name, + string $method_name_lc, + string $declaring_fq_class_name, + string $declaring_method_name_lc + ): void { + $class_storage = $this->classlike_storage_provider->get($fq_class_name); + + $class_storage->declaring_method_ids[$method_name_lc] = new MethodIdentifier( + $declaring_fq_class_name, + $declaring_method_name_lc + ); + } + + /** + * @param lowercase-string $method_name_lc + * @param lowercase-string $appearing_method_name_lc + * + */ + public function setAppearingMethodId( + string $fq_class_name, + string $method_name_lc, + string $appearing_fq_class_name, + string $appearing_method_name_lc + ): void { + $class_storage = $this->classlike_storage_provider->get($fq_class_name); + + $class_storage->appearing_method_ids[$method_name_lc] = new MethodIdentifier( + $appearing_fq_class_name, + $appearing_method_name_lc + ); + } + + public function getDeclaringMethodId( + MethodIdentifier $method_id + ): ?MethodIdentifier { + $fq_class_name = $this->classlikes->getUnAliasedName($method_id->fq_class_name); + + $class_storage = $this->classlike_storage_provider->get($fq_class_name); + + $method_name = $method_id->method_name; + + if (isset($class_storage->declaring_method_ids[$method_name])) { + return $class_storage->declaring_method_ids[$method_name]; + } + + if ($class_storage->abstract && isset($class_storage->overridden_method_ids[$method_name])) { + return reset($class_storage->overridden_method_ids[$method_name]); + } + + return null; + } + + /** + * Get the class this method appears in (vs is declared in, which could give a trait + */ + public function getAppearingMethodId( + MethodIdentifier $method_id + ): ?MethodIdentifier { + $fq_class_name = $this->classlikes->getUnAliasedName($method_id->fq_class_name); + + $class_storage = $this->classlike_storage_provider->get($fq_class_name); + + $method_name = $method_id->method_name; + + return $class_storage->appearing_method_ids[$method_name] ?? null; + } + + /** + * @return array + */ + public function getOverriddenMethodIds(MethodIdentifier $method_id): array + { + $class_storage = $this->classlike_storage_provider->get($method_id->fq_class_name); + $method_name = $method_id->method_name; + + return $class_storage->overridden_method_ids[$method_name] ?? []; + } + + public function getCasedMethodId(MethodIdentifier $original_method_id): string + { + $method_id = $this->getDeclaringMethodId($original_method_id); + + if ($method_id === null) { + return (string) $original_method_id; + } + + $fq_class_name = $method_id->fq_class_name; + $new_method_name = $method_id->method_name; + + $old_fq_class_name = $original_method_id->fq_class_name; + $old_method_name = $original_method_id->method_name; + + $storage = $this->getStorage($method_id); + + if ($old_method_name === $new_method_name + && strtolower($old_fq_class_name) !== $old_fq_class_name + ) { + return $old_fq_class_name . '::' . $storage->cased_name; + } + + return $fq_class_name . '::' . $storage->cased_name; + } + + public function getUserMethodStorage(MethodIdentifier $method_id): ?MethodStorage + { + $declaring_method_id = $this->getDeclaringMethodId($method_id); + + if (!$declaring_method_id) { + if (InternalCallMapHandler::inCallMap((string) $method_id)) { + return null; + } + + throw new UnexpectedValueException('$storage should not be null for ' . $method_id); + } + + $storage = $this->getStorage($declaring_method_id); + + if (!$storage->location) { + return null; + } + + return $storage; + } + + public function getClassLikeStorageForMethod(MethodIdentifier $method_id): ClassLikeStorage + { + $fq_class_name = $method_id->fq_class_name; + $method_name = $method_id->method_name; + + if ($this->existence_provider->has($fq_class_name)) { + if ($this->existence_provider->doesMethodExist( + $fq_class_name, + $method_name, + null, + null + )) { + return $this->classlike_storage_provider->get($fq_class_name); + } + } + + $declaring_method_id = $this->getDeclaringMethodId($method_id); + + if ($declaring_method_id === null) { + if (InternalCallMapHandler::inCallMap((string) $method_id)) { + $declaring_method_id = $method_id; + } else { + throw new UnexpectedValueException('$storage should not be null for ' . $method_id); + } + } + + $declaring_fq_class_name = $declaring_method_id->fq_class_name; + + return $this->classlike_storage_provider->get($declaring_fq_class_name); + } + + public function getStorage(MethodIdentifier $method_id): MethodStorage + { + try { + $class_storage = $this->classlike_storage_provider->get($method_id->fq_class_name); + } catch (InvalidArgumentException $e) { + throw new UnexpectedValueException($e->getMessage()); + } + + $method_name = $method_id->method_name; + + if (!isset($class_storage->methods[$method_name])) { + throw new UnexpectedValueException( + '$storage should not be null for ' . $method_id + ); + } + + return $class_storage->methods[$method_name]; + } + + public function hasStorage(MethodIdentifier $method_id): bool + { + try { + $class_storage = $this->classlike_storage_provider->get($method_id->fq_class_name); + } catch (InvalidArgumentException $e) { + return false; + } + + $method_name = $method_id->method_name; + + if (!isset($class_storage->methods[$method_name])) { + return false; + } + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php new file mode 100644 index 00000000..9d832824 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php @@ -0,0 +1,1224 @@ +> + */ + private $invalid_class_storages = []; + + /** + * @var Progress + */ + private $progress; + + /** + * @var ClassLikes + */ + private $classlikes; + + /** + * @var Config + */ + private $config; + + /** + * @var FileReferenceProvider + */ + private $file_reference_provider; + + public function __construct( + Config $config, + ClassLikeStorageProvider $classlike_storage_provider, + FileStorageProvider $file_storage_provider, + ClassLikes $classlikes, + FileReferenceProvider $file_reference_provider, + Progress $progress + ) { + $this->classlike_storage_provider = $classlike_storage_provider; + $this->file_storage_provider = $file_storage_provider; + $this->classlikes = $classlikes; + $this->progress = $progress; + $this->config = $config; + $this->file_reference_provider = $file_reference_provider; + } + + public function populateCodebase(): void + { + $this->progress->debug('ClassLikeStorage is populating' . "\n"); + + foreach ($this->classlike_storage_provider->getNew() as $class_storage) { + $this->populateClassLikeStorage($class_storage); + } + + $this->progress->debug('ClassLikeStorage is populated' . "\n"); + + $this->progress->debug('FileStorage is populating' . "\n"); + + $all_file_storage = $this->file_storage_provider->getNew(); + + foreach ($all_file_storage as $file_storage) { + $this->populateFileStorage($file_storage); + } + + foreach ($this->classlike_storage_provider->getNew() as $class_storage) { + if ($this->config->allow_phpstorm_generics) { + foreach ($class_storage->properties as $property_storage) { + if ($property_storage->type) { + $this->convertPhpStormGenericToPsalmGeneric($property_storage->type, true); + } + } + + foreach ($class_storage->methods as $method_storage) { + if ($method_storage->return_type) { + $this->convertPhpStormGenericToPsalmGeneric($method_storage->return_type); + } + + foreach ($method_storage->params as $param_storage) { + if ($param_storage->type) { + $this->convertPhpStormGenericToPsalmGeneric($param_storage->type); + } + } + } + } + + foreach ($class_storage->dependent_classlikes as $dependent_classlike_lc => $_) { + try { + $dependee_storage = $this->classlike_storage_provider->get($dependent_classlike_lc); + } catch (InvalidArgumentException $exception) { + continue; + } + + $class_storage->dependent_classlikes += $dependee_storage->dependent_classlikes; + } + } + + if ($this->config->allow_phpstorm_generics) { + foreach ($all_file_storage as $file_storage) { + foreach ($file_storage->functions as $function_storage) { + if ($function_storage->return_type) { + $this->convertPhpStormGenericToPsalmGeneric($function_storage->return_type); + } + + foreach ($function_storage->params as $param_storage) { + if ($param_storage->type) { + $this->convertPhpStormGenericToPsalmGeneric($param_storage->type); + } + } + } + } + } + + $this->progress->debug('FileStorage is populated' . "\n"); + + ClassLikeStorageProvider::populated(); + FileStorageProvider::populated(); + } + + private function populateClassLikeStorage(ClassLikeStorage $storage, array $dependent_classlikes = []): void + { + if ($storage->populated) { + return; + } + + $fq_classlike_name_lc = strtolower($storage->name); + + if (isset($dependent_classlikes[$fq_classlike_name_lc])) { + if ($storage->location && IssueBuffer::accepts( + new CircularReference( + 'Circular reference discovered when loading ' . $storage->name, + $storage->location + ) + )) { + // fall through + } + + return; + } + + $storage_provider = $this->classlike_storage_provider; + + $dependent_classlikes[$fq_classlike_name_lc] = true; + + $this->populateDataFromTraits($storage, $storage_provider, $dependent_classlikes); + + if ($storage->parent_classes) { + $this->populateDataFromParentClass($storage, $storage_provider, $dependent_classlikes); + } + + if (!strpos($fq_classlike_name_lc, '\\') + && !isset($storage->methods['__construct']) + && isset($storage->methods[$fq_classlike_name_lc]) + && !$storage->is_interface + && !$storage->is_trait + ) { + $storage->methods['__construct'] = $storage->methods[$fq_classlike_name_lc]; + } + + $this->populateInterfaceDataFromParentInterfaces($storage, $storage_provider, $dependent_classlikes); + + $this->populateDataFromImplementedInterfaces($storage, $storage_provider, $dependent_classlikes); + + if ($storage->location) { + $file_path = $storage->location->file_path; + + foreach ($storage->parent_interfaces as $parent_interface_lc) { + $this->file_reference_provider->addFileInheritanceToClass($file_path, $parent_interface_lc); + } + + foreach ($storage->parent_classes as $parent_class_lc => $_) { + $this->file_reference_provider->addFileInheritanceToClass($file_path, $parent_class_lc); + } + + foreach ($storage->class_implements as $implemented_interface) { + $this->file_reference_provider->addFileInheritanceToClass( + $file_path, + strtolower($implemented_interface) + ); + } + + foreach ($storage->used_traits as $used_trait_lc => $_) { + $this->file_reference_provider->addFileInheritanceToClass($file_path, $used_trait_lc); + } + } + + if ($storage->mutation_free || $storage->external_mutation_free) { + foreach ($storage->methods as $method) { + if (!$method->is_static && !$method->external_mutation_free) { + $method->mutation_free = $storage->mutation_free; + $method->external_mutation_free = $storage->external_mutation_free; + $method->immutable = $storage->mutation_free; + } + } + + if ($storage->mutation_free) { + foreach ($storage->properties as $property) { + if (!$property->is_static) { + $property->readonly = true; + } + } + } + } + + if ($storage->specialize_instance) { + foreach ($storage->methods as $method) { + if (!$method->is_static) { + $method->specialize_call = true; + } + } + } + + if (!$storage->is_interface && !$storage->is_trait) { + foreach ($storage->methods as $method) { + $method->internal = array_merge($storage->internal, $method->internal); + } + + foreach ($storage->properties as $property) { + $property->internal = array_merge($storage->internal, $property->internal); + } + } + + $this->populateOverriddenMethods($storage); + + $this->progress->debug('Have populated ' . $storage->name . "\n"); + + $storage->populated = true; + + if (isset($this->invalid_class_storages[$fq_classlike_name_lc])) { + foreach ($this->invalid_class_storages[$fq_classlike_name_lc] as $dependency) { + $dependency->populated = false; + $this->populateClassLikeStorage($dependency, $dependent_classlikes); + } + + unset($this->invalid_class_storages[$fq_classlike_name_lc]); + } + } + + private function populateOverriddenMethods( + ClassLikeStorage $storage + ): void { + $storage->documenting_method_ids = []; + + foreach ($storage->methods as $method_name => $method_storage) { + if (isset($storage->overridden_method_ids[$method_name])) { + $overridden_method_ids = $storage->overridden_method_ids[$method_name]; + + $candidate_overridden_ids = null; + + $declaring_class_storages = []; + + foreach ($overridden_method_ids as $declaring_method_id) { + $declaring_class = $declaring_method_id->fq_class_name; + $declaring_class_storage + = $declaring_class_storages[$declaring_class] + = $this->classlike_storage_provider->get($declaring_class); + + if ($candidate_overridden_ids === null) { + $candidate_overridden_ids + = ($declaring_class_storage->overridden_method_ids[$method_name] ?? []) + + [$declaring_method_id->fq_class_name => $declaring_method_id]; + } else { + $candidate_overridden_ids = array_intersect_key( + $candidate_overridden_ids, + ($declaring_class_storage->overridden_method_ids[$method_name] ?? []) + + [$declaring_method_id->fq_class_name => $declaring_method_id] + ); + } + } + + foreach ($overridden_method_ids as $declaring_method_id) { + $declaring_class = $declaring_method_id->fq_class_name; + $declaring_method_name = $declaring_method_id->method_name; + $declaring_class_storage = $declaring_class_storages[$declaring_class]; + + $declaring_method_storage = $declaring_class_storage->methods[$declaring_method_name]; + + if (($declaring_method_storage->has_docblock_param_types + || $declaring_method_storage->has_docblock_return_type) + && !$method_storage->has_docblock_param_types + && !$method_storage->has_docblock_return_type + && $method_storage->inherited_return_type !== null + ) { + if (!isset($storage->documenting_method_ids[$method_name]) + || (string) $storage->documenting_method_ids[$method_name] + === (string) $declaring_method_id + ) { + $storage->documenting_method_ids[$method_name] = $declaring_method_id; + $method_storage->inherited_return_type = true; + } else { + if (in_array( + $storage->documenting_method_ids[$method_name]->fq_class_name, + $declaring_class_storage->parent_interfaces + )) { + $storage->documenting_method_ids[$method_name] = $declaring_method_id; + $method_storage->inherited_return_type = true; + } else { + $documenting_class_storage = $declaring_class_storages + [$storage->documenting_method_ids[$method_name]->fq_class_name]; + + if (!in_array( + $declaring_class, + $documenting_class_storage->parent_interfaces + ) && $documenting_class_storage->is_interface + ) { + unset($storage->documenting_method_ids[$method_name]); + $method_storage->inherited_return_type = null; + } + } + } + } + + // tell the declaring class it's overridden downstream + $declaring_method_storage->overridden_downstream = true; + $declaring_method_storage->overridden_somewhere = true; + + if ($declaring_method_storage->mutation_free_inferred) { + $declaring_method_storage->mutation_free = false; + $declaring_method_storage->external_mutation_free = false; + $declaring_method_storage->mutation_free_inferred = false; + } + + if ($declaring_method_storage->throws + && (!$method_storage->throws || $method_storage->inheritdoc) + ) { + $method_storage->throws += $declaring_method_storage->throws; + } + } + } + } + } + + private function populateDataFromTraits( + ClassLikeStorage $storage, + ClassLikeStorageProvider $storage_provider, + array $dependent_classlikes + ): void { + foreach ($storage->used_traits as $used_trait_lc => $_) { + try { + $used_trait_lc = strtolower( + $this->classlikes->getUnAliasedName( + $used_trait_lc + ) + ); + $trait_storage = $storage_provider->get($used_trait_lc); + } catch (InvalidArgumentException $e) { + continue; + } + + $this->populateClassLikeStorage($trait_storage, $dependent_classlikes); + + $this->inheritMethodsFromParent($storage, $trait_storage); + $this->inheritPropertiesFromParent($storage, $trait_storage); + + if ($trait_storage->template_types) { + $storage->template_extended_params[$trait_storage->name] = []; + + if (isset($storage->template_extended_offsets[$trait_storage->name])) { + foreach ($storage->template_extended_offsets[$trait_storage->name] as $i => $type) { + $trait_template_type_names = array_keys($trait_storage->template_types); + + $mapped_name = $trait_template_type_names[$i] ?? null; + + if ($mapped_name) { + $storage->template_extended_params[$trait_storage->name][$mapped_name] = $type; + } + } + + if ($trait_storage->template_extended_params) { + foreach ($trait_storage->template_extended_params as $t_storage_class => $type_map) { + foreach ($type_map as $i => $type) { + $storage->template_extended_params[$t_storage_class][$i] = self::extendType( + $type, + $storage + ); + } + } + } + } else { + foreach ($trait_storage->template_types as $template_name => $template_type_map) { + foreach ($template_type_map as $template_type) { + $default_param = clone $template_type; + $default_param->from_docblock = false; + $storage->template_extended_params[$trait_storage->name][$template_name] + = $default_param; + } + } + } + } elseif ($trait_storage->template_extended_params) { + $storage->template_extended_params = array_merge( + $storage->template_extended_params ?: [], + $trait_storage->template_extended_params + ); + } + + $storage->pseudo_property_get_types += $trait_storage->pseudo_property_get_types; + $storage->pseudo_property_set_types += $trait_storage->pseudo_property_set_types; + + $storage->pseudo_methods += $trait_storage->pseudo_methods; + $storage->declaring_pseudo_method_ids += $trait_storage->declaring_pseudo_method_ids; + } + } + + private static function extendType( + Union $type, + ClassLikeStorage $storage + ): Union { + $extended_types = []; + + foreach ($type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TTemplateParam) { + $referenced_type + = $storage->template_extended_params[$atomic_type->defining_class][$atomic_type->param_name] + ?? null; + + if ($referenced_type) { + foreach ($referenced_type->getAtomicTypes() as $atomic_referenced_type) { + if (!$atomic_referenced_type instanceof TTemplateParam) { + $extended_types[] = $atomic_referenced_type; + } else { + $extended_types[] = $atomic_type; + } + } + } else { + $extended_types[] = $atomic_type; + } + } else { + $extended_types[] = $atomic_type; + } + } + + return new Union($extended_types); + } + + private function populateDataFromParentClass( + ClassLikeStorage $storage, + ClassLikeStorageProvider $storage_provider, + array $dependent_classlikes + ): void { + $parent_storage_class = reset($storage->parent_classes); + + $parent_storage_class = strtolower( + $this->classlikes->getUnAliasedName( + $parent_storage_class + ) + ); + + try { + $parent_storage = $storage_provider->get($parent_storage_class); + } catch (InvalidArgumentException $e) { + $this->progress->debug('Populator could not find dependency (' . __LINE__ . ")\n"); + + $storage->invalid_dependencies[] = $parent_storage_class; + + $this->invalid_class_storages[$parent_storage_class][] = $storage; + + return; + } + + $this->populateClassLikeStorage($parent_storage, $dependent_classlikes); + + $storage->parent_classes = array_merge($storage->parent_classes, $parent_storage->parent_classes); + + if ($parent_storage->template_types) { + $storage->template_extended_params[$parent_storage->name] = []; + + if (isset($storage->template_extended_offsets[$parent_storage->name])) { + foreach ($storage->template_extended_offsets[$parent_storage->name] as $i => $type) { + $parent_template_type_names = array_keys($parent_storage->template_types); + + $mapped_name = $parent_template_type_names[$i] ?? null; + + if ($mapped_name) { + $storage->template_extended_params[$parent_storage->name][$mapped_name] = $type; + } + } + + if ($parent_storage->template_extended_params) { + foreach ($parent_storage->template_extended_params as $t_storage_class => $type_map) { + foreach ($type_map as $i => $type) { + $storage->template_extended_params[$t_storage_class][$i] = self::extendType( + $type, + $storage + ); + } + } + } + } else { + foreach ($parent_storage->template_types as $template_name => $template_type_map) { + foreach ($template_type_map as $template_type) { + $default_param = clone $template_type; + $default_param->from_docblock = false; + $storage->template_extended_params[$parent_storage->name][$template_name] + = $default_param; + } + } + + if ($parent_storage->template_extended_params) { + $storage->template_extended_params = array_merge( + $storage->template_extended_params, + $parent_storage->template_extended_params + ); + } + } + } elseif ($parent_storage->template_extended_params) { + $storage->template_extended_params = array_merge( + $storage->template_extended_params ?: [], + $parent_storage->template_extended_params + ); + } + + $this->inheritMethodsFromParent($storage, $parent_storage); + $this->inheritPropertiesFromParent($storage, $parent_storage); + + $storage->class_implements = array_merge($storage->class_implements, $parent_storage->class_implements); + $storage->invalid_dependencies = array_merge( + $storage->invalid_dependencies, + $parent_storage->invalid_dependencies + ); + + if ($parent_storage->has_visitor_issues) { + $storage->has_visitor_issues = true; + } + + $storage->constants = array_merge( + array_filter( + $parent_storage->constants, + function ($constant) { + return $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC + || $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PROTECTED; + } + ), + $storage->constants + ); + + if ($parent_storage->preserve_constructor_signature) { + $storage->preserve_constructor_signature = true; + } + + if (($parent_storage->namedMixins || $parent_storage->templatedMixins) + && (!$storage->namedMixins || !$storage->templatedMixins)) { + $storage->mixin_declaring_fqcln = $parent_storage->mixin_declaring_fqcln; + + if (!$storage->namedMixins) { + $storage->namedMixins = $parent_storage->namedMixins; + } + + if (!$storage->templatedMixins) { + $storage->templatedMixins = $parent_storage->templatedMixins; + } + } + + $storage->pseudo_property_get_types += $parent_storage->pseudo_property_get_types; + $storage->pseudo_property_set_types += $parent_storage->pseudo_property_set_types; + + $parent_storage->dependent_classlikes[strtolower($storage->name)] = true; + + $storage->pseudo_methods += $parent_storage->pseudo_methods; + $storage->declaring_pseudo_method_ids += $parent_storage->declaring_pseudo_method_ids; + } + + private function populateInterfaceDataFromParentInterfaces( + ClassLikeStorage $storage, + ClassLikeStorageProvider $storage_provider, + array $dependent_classlikes + ): void { + $parent_interfaces = []; + + foreach ($storage->direct_interface_parents as $parent_interface_lc => $_) { + try { + $parent_interface_lc = strtolower( + $this->classlikes->getUnAliasedName( + $parent_interface_lc + ) + ); + $parent_interface_storage = $storage_provider->get($parent_interface_lc); + } catch (InvalidArgumentException $e) { + $this->progress->debug('Populator could not find dependency (' . __LINE__ . ")\n"); + + $storage->invalid_dependencies[] = $parent_interface_lc; + continue; + } + + $this->populateClassLikeStorage($parent_interface_storage, $dependent_classlikes); + + // copy over any constants + $storage->constants = array_merge( + array_filter( + $parent_interface_storage->constants, + function ($constant) { + return $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC; + } + ), + $storage->constants + ); + + $storage->invalid_dependencies = array_merge( + $storage->invalid_dependencies, + $parent_interface_storage->invalid_dependencies + ); + + if ($parent_interface_storage->template_types) { + $storage->template_extended_params[$parent_interface_storage->name] = []; + + if (isset($storage->template_extended_offsets[$parent_interface_storage->name])) { + foreach ($storage->template_extended_offsets[$parent_interface_storage->name] as $i => $type) { + $parent_template_type_names = array_keys($parent_interface_storage->template_types); + + $mapped_name = $parent_template_type_names[$i] ?? null; + + if ($mapped_name) { + $storage->template_extended_params[$parent_interface_storage->name][$mapped_name] = $type; + } + } + + if ($parent_interface_storage->template_extended_params) { + foreach ($parent_interface_storage->template_extended_params as $t_storage_class => $type_map) { + foreach ($type_map as $i => $type) { + $storage->template_extended_params[$t_storage_class][$i] = self::extendType( + $type, + $storage + ); + } + } + } + } else { + foreach ($parent_interface_storage->template_types as $template_name => $template_type_map) { + foreach ($template_type_map as $template_type) { + $default_param = clone $template_type; + $default_param->from_docblock = false; + $storage->template_extended_params[$parent_interface_storage->name][$template_name] + = $default_param; + } + } + } + } elseif ($parent_interface_storage->template_extended_params) { + $storage->template_extended_params = array_merge( + $storage->template_extended_params ?: [], + $parent_interface_storage->template_extended_params + ); + } + + $parent_interfaces = array_merge($parent_interfaces, $parent_interface_storage->parent_interfaces); + + $this->inheritMethodsFromParent($storage, $parent_interface_storage); + + $storage->pseudo_methods += $parent_interface_storage->pseudo_methods; + $storage->declaring_pseudo_method_ids += $parent_interface_storage->declaring_pseudo_method_ids; + } + + $storage->parent_interfaces = array_merge($parent_interfaces, $storage->parent_interfaces); + + foreach ($storage->parent_interfaces as $parent_interface_lc => $_) { + try { + $parent_interface_lc = strtolower( + $this->classlikes->getUnAliasedName( + $parent_interface_lc + ) + ); + $parent_interface_storage = $storage_provider->get($parent_interface_lc); + } catch (InvalidArgumentException $e) { + continue; + } + + $parent_interface_storage->dependent_classlikes[strtolower($storage->name)] = true; + } + } + + private function populateDataFromImplementedInterfaces( + ClassLikeStorage $storage, + ClassLikeStorageProvider $storage_provider, + array $dependent_classlikes + ): void { + $extra_interfaces = []; + + foreach ($storage->direct_class_interfaces as $implemented_interface_lc => $_) { + try { + $implemented_interface_lc = strtolower( + $this->classlikes->getUnAliasedName( + $implemented_interface_lc + ) + ); + $implemented_interface_storage = $storage_provider->get($implemented_interface_lc); + } catch (InvalidArgumentException $e) { + $this->progress->debug('Populator could not find dependency (' . __LINE__ . ")\n"); + + $storage->invalid_dependencies[] = $implemented_interface_lc; + continue; + } + + $this->populateClassLikeStorage($implemented_interface_storage, $dependent_classlikes); + + // copy over any constants + $storage->constants = array_merge( + array_filter( + $implemented_interface_storage->constants, + function ($constant) { + return $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC; + } + ), + $storage->constants + ); + + $storage->invalid_dependencies = array_merge( + $storage->invalid_dependencies, + $implemented_interface_storage->invalid_dependencies + ); + + if ($implemented_interface_storage->template_types) { + $storage->template_extended_params[$implemented_interface_storage->name] = []; + + if (isset($storage->template_extended_offsets[$implemented_interface_storage->name])) { + foreach ($storage->template_extended_offsets[$implemented_interface_storage->name] as $i => $type) { + $parent_template_type_names = array_keys($implemented_interface_storage->template_types); + + $mapped_name = $parent_template_type_names[$i] ?? null; + + if ($mapped_name) { + $storage->template_extended_params[$implemented_interface_storage->name][$mapped_name] + = $type; + } + } + + if ($implemented_interface_storage->template_extended_params) { + foreach ($implemented_interface_storage->template_extended_params as $e_i => $type_map) { + foreach ($type_map as $i => $type) { + $storage->template_extended_params[$e_i][$i] = self::extendType( + $type, + $storage + ); + } + } + } + } else { + foreach ($implemented_interface_storage->template_types as $template_name => $template_type_map) { + foreach ($template_type_map as $template_type) { + $default_param = clone $template_type; + $default_param->from_docblock = false; + $storage->template_extended_params[$implemented_interface_storage->name][$template_name] + = $default_param; + } + } + } + } elseif ($implemented_interface_storage->template_extended_params) { + $storage->template_extended_params = array_merge( + $storage->template_extended_params ?: [], + $implemented_interface_storage->template_extended_params + ); + } + + $extra_interfaces = array_merge($extra_interfaces, $implemented_interface_storage->parent_interfaces); + } + + $storage->class_implements = array_merge($storage->class_implements, $extra_interfaces); + + $interface_method_implementers = []; + + foreach ($storage->class_implements as $implemented_interface_lc => $_) { + try { + $implemented_interface = strtolower( + $this->classlikes->getUnAliasedName( + $implemented_interface_lc + ) + ); + $implemented_interface_storage = $storage_provider->get($implemented_interface); + } catch (InvalidArgumentException $e) { + continue; + } + + $implemented_interface_storage->dependent_classlikes[strtolower($storage->name)] = true; + + foreach ($implemented_interface_storage->methods as $method_name => $method) { + if ($method->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC) { + $interface_method_implementers[$method_name][] = new MethodIdentifier( + $implemented_interface_storage->name, + $method_name + ); + } + } + } + + foreach ($interface_method_implementers as $method_name => $interface_method_ids) { + if (count($interface_method_ids) === 1) { + if (isset($storage->methods[$method_name])) { + $method_storage = $storage->methods[$method_name]; + + if ($method_storage->signature_return_type + && !$method_storage->signature_return_type->isVoid() + && $method_storage->return_type === $method_storage->signature_return_type + ) { + $interface_fqcln = $interface_method_ids[0]->fq_class_name; + $interface_storage = $storage_provider->get($interface_fqcln); + + if (isset($interface_storage->methods[$method_name])) { + $interface_method_storage = $interface_storage->methods[$method_name]; + + if ($interface_method_storage->throws + && (!$method_storage->throws || $method_storage->inheritdoc) + ) { + $method_storage->throws += $interface_method_storage->throws; + } + } + } + } + } + + foreach ($interface_method_ids as $interface_method_id) { + $storage->overridden_method_ids[$method_name][$interface_method_id->fq_class_name] + = $interface_method_id; + } + } + } + + /** + * @param array $dependent_file_paths + */ + private function populateFileStorage(FileStorage $storage, array $dependent_file_paths = []): void + { + if ($storage->populated) { + return; + } + + $file_path_lc = strtolower($storage->file_path); + + if (isset($dependent_file_paths[$file_path_lc])) { + return; + } + + $dependent_file_paths[$file_path_lc] = true; + + $all_required_file_paths = $storage->required_file_paths; + + foreach ($storage->required_file_paths as $included_file_path => $_) { + try { + $included_file_storage = $this->file_storage_provider->get($included_file_path); + } catch (InvalidArgumentException $e) { + continue; + } + + $this->populateFileStorage($included_file_storage, $dependent_file_paths); + + $all_required_file_paths = $all_required_file_paths + $included_file_storage->required_file_paths; + } + + foreach ($all_required_file_paths as $included_file_path => $_) { + try { + $included_file_storage = $this->file_storage_provider->get($included_file_path); + } catch (InvalidArgumentException $e) { + continue; + } + + $storage->declaring_function_ids = array_merge( + $included_file_storage->declaring_function_ids, + $storage->declaring_function_ids + ); + + $storage->declaring_constants = array_merge( + $included_file_storage->declaring_constants, + $storage->declaring_constants + ); + } + + foreach ($storage->referenced_classlikes as $fq_class_name) { + try { + $classlike_storage = $this->classlike_storage_provider->get($fq_class_name); + } catch (InvalidArgumentException $e) { + continue; + } + + if (!$classlike_storage->location) { + continue; + } + + try { + $included_file_storage = $this->file_storage_provider->get($classlike_storage->location->file_path); + } catch (InvalidArgumentException $e) { + continue; + } + + foreach ($classlike_storage->used_traits as $used_trait) { + try { + $trait_storage = $this->classlike_storage_provider->get($used_trait); + } catch (InvalidArgumentException $e) { + continue; + } + + if (!$trait_storage->location) { + continue; + } + + try { + $included_trait_file_storage = $this->file_storage_provider->get( + $trait_storage->location->file_path + ); + } catch (InvalidArgumentException $e) { + continue; + } + + $storage->declaring_function_ids = array_merge( + $included_trait_file_storage->declaring_function_ids, + $storage->declaring_function_ids + ); + } + + $storage->declaring_function_ids = array_merge( + $included_file_storage->declaring_function_ids, + $storage->declaring_function_ids + ); + } + + $storage->required_file_paths = $all_required_file_paths; + + foreach ($all_required_file_paths as $required_file_path) { + try { + $required_file_storage = $this->file_storage_provider->get($required_file_path); + } catch (InvalidArgumentException $e) { + continue; + } + + $required_file_storage->required_by_file_paths += [$file_path_lc => $storage->file_path]; + } + + foreach ($storage->required_classes as $required_classlike) { + try { + $classlike_storage = $this->classlike_storage_provider->get($required_classlike); + } catch (InvalidArgumentException $e) { + continue; + } + + if (!$classlike_storage->location) { + continue; + } + + try { + $required_file_storage = $this->file_storage_provider->get($classlike_storage->location->file_path); + } catch (InvalidArgumentException $e) { + continue; + } + + $required_file_storage->required_by_file_paths += [$file_path_lc => $storage->file_path]; + } + + $storage->populated = true; + } + + private function convertPhpStormGenericToPsalmGeneric(Union $candidate, bool $is_property = false): void + { + if (!$candidate->from_docblock) { + //never convert a type that comes from a signature + return; + } + + $atomic_types = $candidate->getAtomicTypes(); + + if (isset($atomic_types['array']) && count($atomic_types) > 1 && !isset($atomic_types['null'])) { + $iterator_name = null; + $generic_params = null; + $iterator_key = null; + + try { + foreach ($atomic_types as $type_key => $type) { + if ($type instanceof TIterable + || ($type instanceof TNamedObject + && (!$type->from_docblock || $is_property) + && ( + strtolower($type->value) === 'traversable' + || $this->classlikes->interfaceExtends( + $type->value, + 'Traversable' + ) + || $this->classlikes->classImplements( + $type->value, + 'Traversable' + ) + )) + ) { + $iterator_name = $type->value; + $iterator_key = $type_key; + } elseif ($type instanceof TArray) { + $generic_params = $type->type_params; + } + } + } catch (InvalidArgumentException $e) { + // ignore class-not-found issues + } + + if ($iterator_name && $iterator_key && $generic_params) { + if ($iterator_name === 'iterable') { + $generic_iterator = new TIterable($generic_params); + } else { + if (strtolower($iterator_name) === 'generator') { + $generic_params[] = Type::getMixed(); + $generic_params[] = Type::getMixed(); + } + $generic_iterator = new TGenericObject($iterator_name, $generic_params); + } + + $candidate->removeType('array'); + $candidate->removeType($iterator_key); + $candidate->addType($generic_iterator); + } + } + } + + protected function inheritMethodsFromParent( + ClassLikeStorage $storage, + ClassLikeStorage $parent_storage + ): void { + $fq_class_name = $storage->name; + $fq_class_name_lc = strtolower($fq_class_name); + + if ($parent_storage->sealed_methods) { + $storage->sealed_methods = true; + } + + // register where they appear (can never be in a trait) + foreach ($parent_storage->appearing_method_ids as $method_name_lc => $appearing_method_id) { + $aliased_method_names = [$method_name_lc]; + + if ($parent_storage->is_trait + && $storage->trait_alias_map + ) { + $aliased_method_names = array_merge( + $aliased_method_names, + array_keys($storage->trait_alias_map, $method_name_lc, true) + ); + } + + foreach ($aliased_method_names as $aliased_method_name) { + if (isset($storage->appearing_method_ids[$aliased_method_name])) { + continue; + } + + $implemented_method_id = new MethodIdentifier( + $fq_class_name, + $aliased_method_name + ); + + $storage->appearing_method_ids[$aliased_method_name] = + $parent_storage->is_trait ? $implemented_method_id : $appearing_method_id; + + $this_method_id = $fq_class_name_lc . '::' . $method_name_lc; + + if (isset($storage->methods[$aliased_method_name])) { + $storage->potential_declaring_method_ids[$aliased_method_name] = [$this_method_id => true]; + } else { + if (isset($parent_storage->potential_declaring_method_ids[$aliased_method_name])) { + $storage->potential_declaring_method_ids[$aliased_method_name] + = $parent_storage->potential_declaring_method_ids[$aliased_method_name]; + } + + $storage->potential_declaring_method_ids[$aliased_method_name][$this_method_id] = true; + + $parent_method_id = strtolower($parent_storage->name) . '::' . $method_name_lc; + $storage->potential_declaring_method_ids[$aliased_method_name][$parent_method_id] = true; + } + } + } + + // register where they're declared + foreach ($parent_storage->inheritable_method_ids as $method_name_lc => $declaring_method_id) { + if ($method_name_lc !== '__construct' + || $parent_storage->preserve_constructor_signature + ) { + if ($parent_storage->is_trait) { + $declaring_class = $declaring_method_id->fq_class_name; + $declaring_class_storage = $this->classlike_storage_provider->get($declaring_class); + + if (isset($declaring_class_storage->methods[$method_name_lc]) + && $declaring_class_storage->methods[$method_name_lc]->abstract + ) { + $storage->overridden_method_ids[$method_name_lc][$declaring_method_id->fq_class_name] + = $declaring_method_id; + } + } else { + $storage->overridden_method_ids[$method_name_lc][$declaring_method_id->fq_class_name] + = $declaring_method_id; + } + + if (isset($parent_storage->overridden_method_ids[$method_name_lc]) + && isset($storage->overridden_method_ids[$method_name_lc]) + ) { + $storage->overridden_method_ids[$method_name_lc] + += $parent_storage->overridden_method_ids[$method_name_lc]; + } + } + + $aliased_method_names = [$method_name_lc]; + + if ($parent_storage->is_trait + && $storage->trait_alias_map + ) { + $aliased_method_names = array_merge( + $aliased_method_names, + array_keys($storage->trait_alias_map, $method_name_lc, true) + ); + } + + foreach ($aliased_method_names as $aliased_method_name) { + if (isset($storage->declaring_method_ids[$aliased_method_name])) { + $implementing_method_id = $storage->declaring_method_ids[$aliased_method_name]; + + $implementing_class_storage = $this->classlike_storage_provider->get( + $implementing_method_id->fq_class_name + ); + + if (!$implementing_class_storage->methods[$implementing_method_id->method_name]->abstract + || !empty($storage->methods[$implementing_method_id->method_name]->abstract) + ) { + continue; + } + } + + $storage->declaring_method_ids[$aliased_method_name] = $declaring_method_id; + $storage->inheritable_method_ids[$aliased_method_name] = $declaring_method_id; + } + } + } + + private function inheritPropertiesFromParent( + ClassLikeStorage $storage, + ClassLikeStorage $parent_storage + ): void { + if ($parent_storage->sealed_properties) { + $storage->sealed_properties = true; + } + + // register where they appear (can never be in a trait) + foreach ($parent_storage->appearing_property_ids as $property_name => $appearing_property_id) { + if (isset($storage->appearing_property_ids[$property_name])) { + continue; + } + + if (!$parent_storage->is_trait + && isset($parent_storage->properties[$property_name]) + && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE + ) { + continue; + } + + $implemented_property_id = $storage->name . '::$' . $property_name; + + $storage->appearing_property_ids[$property_name] = + $parent_storage->is_trait ? $implemented_property_id : $appearing_property_id; + } + + // register where they're declared + foreach ($parent_storage->declaring_property_ids as $property_name => $declaring_property_class) { + if (isset($storage->declaring_property_ids[$property_name])) { + continue; + } + + if (!$parent_storage->is_trait + && isset($parent_storage->properties[$property_name]) + && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE + ) { + continue; + } + + $storage->declaring_property_ids[$property_name] = $declaring_property_class; + } + + // register where they're declared + foreach ($parent_storage->inheritable_property_ids as $property_name => $inheritable_property_id) { + if (!$parent_storage->is_trait + && isset($parent_storage->properties[$property_name]) + && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE + ) { + continue; + } + + if (!$parent_storage->is_trait) { + $storage->overridden_property_ids[$property_name][] = $inheritable_property_id; + } + + $storage->inheritable_property_ids[$property_name] = $inheritable_property_id; + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php new file mode 100644 index 00000000..2a0137a5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php @@ -0,0 +1,356 @@ +classlike_storage_provider = $storage_provider; + $this->file_reference_provider = $file_reference_provider; + $this->property_existence_provider = new PropertyExistenceProvider(); + $this->property_visibility_provider = new PropertyVisibilityProvider(); + $this->property_type_provider = new PropertyTypeProvider(); + $this->classlikes = $classlikes; + } + + /** + * Whether or not a given property exists + * + */ + public function propertyExists( + string $property_id, + bool $read_mode, + ?StatementsSource $source = null, + ?Context $context = null, + ?CodeLocation $code_location = null + ): bool { + // remove trailing backslash if it exists + $property_id = preg_replace('/^\\\\/', '', $property_id); + + [$fq_class_name, $property_name] = explode('::$', $property_id); + $fq_class_name_lc = strtolower($fq_class_name); + + if ($this->property_existence_provider->has($fq_class_name)) { + $property_exists = $this->property_existence_provider->doesPropertyExist( + $fq_class_name, + $property_name, + $read_mode, + $source, + $context, + $code_location + ); + + if ($property_exists !== null) { + return $property_exists; + } + } + + $class_storage = $this->classlikes->getStorageFor($fq_class_name); + + if (!$class_storage) { + return false; + } + + if ($source + && $context + && $context->self !== $fq_class_name + && !$context->collect_initializations + && !$context->collect_mutations + ) { + if ($context->calling_method_id) { + $this->file_reference_provider->addMethodReferenceToClass( + $context->calling_method_id, + $fq_class_name_lc + ); + } else { + $this->file_reference_provider->addNonMethodReferenceToClass( + $source->getFilePath(), + $fq_class_name_lc + ); + } + } + + if (isset($class_storage->declaring_property_ids[$property_name])) { + $declaring_property_class = strtolower($class_storage->declaring_property_ids[$property_name]); + + if ($context && $context->calling_method_id) { + $this->file_reference_provider->addMethodReferenceToClassMember( + $context->calling_method_id, + $declaring_property_class . '::$' . $property_name, + false + ); + + if ($read_mode) { + $this->file_reference_provider->addMethodReferenceToClassProperty( + $context->calling_method_id, + $declaring_property_class . '::$' . $property_name + ); + } + } elseif ($source) { + $this->file_reference_provider->addFileReferenceToClassMember( + $source->getFilePath(), + $declaring_property_class . '::$' . $property_name, + false + ); + + if ($read_mode) { + $this->file_reference_provider->addFileReferenceToClassProperty( + $source->getFilePath(), + $declaring_property_class . '::$' . $property_name + ); + } + } + + if ($this->collect_locations && $code_location) { + $this->file_reference_provider->addCallingLocationForClassProperty( + $code_location, + $declaring_property_class . '::$' . $property_name + ); + } + + return true; + } + + if ($context && $context->calling_method_id) { + $this->file_reference_provider->addMethodReferenceToMissingClassMember( + $context->calling_method_id, + $fq_class_name_lc . '::$' . $property_name + ); + } elseif ($source) { + $this->file_reference_provider->addFileReferenceToMissingClassMember( + $source->getFilePath(), + $fq_class_name_lc . '::$' . $property_name + ); + } + + return false; + } + + public function getDeclaringClassForProperty( + string $property_id, + bool $read_mode, + ?StatementsSource $source = null + ): ?string { + [$fq_class_name, $property_name] = explode('::$', $property_id); + + if ($this->property_existence_provider->has($fq_class_name)) { + if ($this->property_existence_provider->doesPropertyExist( + $fq_class_name, + $property_name, + $read_mode, + $source, + null + )) { + return $fq_class_name; + } + } + + $class_storage = $this->classlikes->getStorageFor($fq_class_name); + + if ($class_storage && isset($class_storage->declaring_property_ids[$property_name])) { + return $class_storage->declaring_property_ids[$property_name]; + } + + return null; + } + + /** + * Get the class this property appears in (vs is declared in, which could give a trait) + */ + public function getAppearingClassForProperty( + string $property_id, + bool $read_mode, + ?StatementsSource $source = null + ): ?string { + [$fq_class_name, $property_name] = explode('::$', $property_id); + + if ($this->property_existence_provider->has($fq_class_name)) { + if ($this->property_existence_provider->doesPropertyExist( + $fq_class_name, + $property_name, + $read_mode, + $source, + null + )) { + return $fq_class_name; + } + } + + $class_storage = $this->classlikes->getStorageFor($fq_class_name); + + if ($class_storage && isset($class_storage->appearing_property_ids[$property_name])) { + $appearing_property_id = $class_storage->appearing_property_ids[$property_name]; + + return explode('::$', $appearing_property_id)[0]; + } + + return null; + } + + public function getStorage(string $property_id): PropertyStorage + { + // remove trailing backslash if it exists + $property_id = preg_replace('/^\\\\/', '', $property_id); + + [$fq_class_name, $property_name] = explode('::$', $property_id); + + $class_storage = $this->classlike_storage_provider->get($fq_class_name); + + if (isset($class_storage->declaring_property_ids[$property_name])) { + $declaring_property_class = $class_storage->declaring_property_ids[$property_name]; + $declaring_class_storage = $this->classlike_storage_provider->get($declaring_property_class); + + if (isset($declaring_class_storage->properties[$property_name])) { + return $declaring_class_storage->properties[$property_name]; + } + } + + throw new UnexpectedValueException('Property ' . $property_id . ' should exist'); + } + + public function hasStorage(string $property_id): bool + { + // remove trailing backslash if it exists + $property_id = preg_replace('/^\\\\/', '', $property_id); + + [$fq_class_name, $property_name] = explode('::$', $property_id); + + $class_storage = $this->classlike_storage_provider->get($fq_class_name); + + if (isset($class_storage->declaring_property_ids[$property_name])) { + $declaring_property_class = $class_storage->declaring_property_ids[$property_name]; + $declaring_class_storage = $this->classlike_storage_provider->get($declaring_property_class); + + return isset($declaring_class_storage->properties[$property_name]); + } + return false; + } + + public function getPropertyType( + string $property_id, + bool $property_set, + ?StatementsSource $source = null, + ?Context $context = null + ): ?Union { + // remove trailing backslash if it exists + $property_id = preg_replace('/^\\\\/', '', $property_id); + + [$fq_class_name, $property_name] = explode('::$', $property_id); + + if ($this->property_type_provider->has($fq_class_name)) { + $property_type = $this->property_type_provider->getPropertyType( + $fq_class_name, + $property_name, + !$property_set, + $source, + $context + ); + + if ($property_type !== null) { + return $property_type; + } + } + + $class_storage = $this->classlikes->getStorageFor($fq_class_name); + + if ($class_storage && isset($class_storage->declaring_property_ids[$property_name])) { + $declaring_property_class = $class_storage->declaring_property_ids[$property_name]; + $declaring_class_storage = $this->classlike_storage_provider->get($declaring_property_class); + + if (isset($declaring_class_storage->properties[$property_name])) { + $storage = $declaring_class_storage->properties[$property_name]; + } else { + throw new UnexpectedValueException('Property ' . $property_id . ' should exist'); + } + } else { + throw new UnexpectedValueException('Property ' . $property_id . ' should exist'); + } + + if ($storage->type) { + if ($property_set) { + if (isset($class_storage->pseudo_property_set_types[$property_name])) { + return $class_storage->pseudo_property_set_types[$property_name]; + } + } else { + if (isset($class_storage->pseudo_property_get_types[$property_name])) { + return $class_storage->pseudo_property_get_types[$property_name]; + } + } + + return $storage->type; + } + + if (!isset($class_storage->overridden_property_ids[$property_name])) { + return null; + } + + foreach ($class_storage->overridden_property_ids[$property_name] as $overridden_property_id) { + $overridden_storage = $this->getStorage($overridden_property_id); + + if ($overridden_storage->type) { + return $overridden_storage->type; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php new file mode 100644 index 00000000..2b0029a6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php @@ -0,0 +1,46 @@ +>|null + */ + private static $property_map; + + /** + * Gets the method/function call map + * + * @return array> + */ + public static function getPropertyMap(): array + { + if (self::$property_map !== null) { + return self::$property_map; + } + + /** @var array> */ + $property_map = require(dirname(__DIR__, 4) . '/dictionaries/PropertyMap.php'); + + self::$property_map = []; + + foreach ($property_map as $key => $value) { + $cased_key = strtolower($key); + self::$property_map[$cased_key] = $value; + } + + return self::$property_map; + } + + public static function inPropertyMap(string $class_name): bool + { + return isset(self::getPropertyMap()[strtolower($class_name)]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php new file mode 100644 index 00000000..80a6ad20 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php @@ -0,0 +1,61 @@ + + */ + public static function getReferenceMap( + ClassLikeStorageProvider $classlike_storage_provider, + array $expected_references + ): array { + $reference_dictionary = []; + + foreach ($classlike_storage_provider->getAll() as $storage) { + if (!$storage->location) { + continue; + } + + $fq_classlike_name = $storage->name; + + if (isset($expected_references[$fq_classlike_name])) { + $reference_dictionary[$fq_classlike_name] + = $storage->location->file_name + . ':' . $storage->location->getLineNumber() + . ':' . $storage->location->getColumn(); + } + + foreach ($storage->methods as $method_name => $method_storage) { + if (!$method_storage->location) { + continue; + } + + if (isset($expected_references[$fq_classlike_name . '::' . $method_name . '()'])) { + $reference_dictionary[$fq_classlike_name . '::' . $method_name . '()'] + = $method_storage->location->file_name + . ':' . $method_storage->location->getLineNumber() + . ':' . $method_storage->location->getColumn(); + } + } + + foreach ($storage->properties as $property_name => $property_storage) { + if (!$property_storage->location) { + continue; + } + + if (isset($expected_references[$fq_classlike_name . '::$' . $property_name])) { + $reference_dictionary[$fq_classlike_name . '::$' . $property_name] + = $property_storage->location->file_name + . ':' . $property_storage->location->getLineNumber() + . ':' . $property_storage->location->getColumn(); + } + } + } + + return $reference_dictionary; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php new file mode 100644 index 00000000..8a50103b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php @@ -0,0 +1,548 @@ + + */ + private static $builtin_functions = []; + + public function __construct(ClassLikeStorageProvider $storage_provider, Codebase $codebase) + { + $this->storage_provider = $storage_provider; + $this->codebase = $codebase; + self::$builtin_functions = []; + } + + public function registerClass(ReflectionClass $reflected_class): void + { + $class_name = $reflected_class->name; + + if ($class_name === 'LibXMLError') { + $class_name = 'libXMLError'; + } + + $class_name_lower = strtolower($class_name); + + try { + $this->storage_provider->get($class_name_lower); + + return; + } catch (Exception $e) { + // this is fine + } + + $reflected_parent_class = $reflected_class->getParentClass(); + + $storage = $this->storage_provider->create($class_name); + $storage->abstract = $reflected_class->isAbstract(); + $storage->is_interface = $reflected_class->isInterface(); + + $storage->potential_declaring_method_ids['__construct'][$class_name_lower . '::__construct'] = true; + + if ($reflected_parent_class) { + $parent_class_name = $reflected_parent_class->getName(); + $this->registerClass($reflected_parent_class); + $parent_class_name_lc = strtolower($parent_class_name); + + $parent_storage = $this->storage_provider->get($parent_class_name_lc); + + $this->registerInheritedMethods($class_name_lower, $parent_class_name_lc); + $this->registerInheritedProperties($class_name_lower, $parent_class_name_lc); + + $storage->class_implements = $parent_storage->class_implements; + + $storage->constants = $parent_storage->constants; + + $storage->parent_classes = array_merge( + [$parent_class_name_lc => $parent_class_name], + $parent_storage->parent_classes + ); + + $storage->used_traits = $parent_storage->used_traits; + } + + $class_properties = $reflected_class->getProperties(); + + $public_mapped_properties = PropertyMap::inPropertyMap($class_name) + ? PropertyMap::getPropertyMap()[strtolower($class_name)] + : []; + + foreach ($class_properties as $class_property) { + $property_name = $class_property->getName(); + $storage->properties[$property_name] = new PropertyStorage(); + + $storage->properties[$property_name]->type = Type::getMixed(); + + if ($class_property->isStatic()) { + $storage->properties[$property_name]->is_static = true; + } + + if ($class_property->isPublic()) { + $storage->properties[$property_name]->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; + } elseif ($class_property->isProtected()) { + $storage->properties[$property_name]->visibility = ClassLikeAnalyzer::VISIBILITY_PROTECTED; + } elseif ($class_property->isPrivate()) { + $storage->properties[$property_name]->visibility = ClassLikeAnalyzer::VISIBILITY_PRIVATE; + } + + $property_id = $class_property->class . '::$' . $property_name; + + $storage->declaring_property_ids[$property_name] = $class_property->class; + $storage->appearing_property_ids[$property_name] = $property_id; + + if (!$class_property->isPrivate()) { + $storage->inheritable_property_ids[$property_name] = $property_id; + } + } + + // have to do this separately as there can be new properties here + foreach ($public_mapped_properties as $property_name => $type_string) { + $property_id = $class_name . '::$' . $property_name; + + if (!isset($storage->properties[$property_name])) { + $storage->properties[$property_name] = new PropertyStorage(); + $storage->properties[$property_name]->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; + + $storage->declaring_property_ids[$property_name] = $class_name; + $storage->appearing_property_ids[$property_name] = $property_id; + $storage->inheritable_property_ids[$property_name] = $property_id; + } + + $type = Type::parseString($type_string); + + if ($property_id === 'DateInterval::$days') { + $type->ignore_falsable_issues = true; + } + + $storage->properties[$property_name]->type = $type; + } + + /** @var array */ + $class_constants = $reflected_class->getConstants(); + + foreach ($class_constants as $name => $value) { + $storage->constants[$name] = new ClassConstantStorage( + ClassLikeAnalyzer::getTypeFromValue($value), + ClassLikeAnalyzer::VISIBILITY_PUBLIC, + null + ); + } + + if ($reflected_class->isInterface()) { + $this->codebase->classlikes->addFullyQualifiedInterfaceName($class_name); + } elseif ($reflected_class->isTrait()) { + $this->codebase->classlikes->addFullyQualifiedTraitName($class_name); + } else { + $this->codebase->classlikes->addFullyQualifiedClassName($class_name); + } + + $reflection_methods = $reflected_class->getMethods( + (ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED) + ); + + if ($class_name_lower === 'generator') { + $storage->template_types = [ + 'TKey' => ['Generator' => Type::getMixed()], + 'TValue' => ['Generator' => Type::getMixed()], + ]; + } + + $interfaces = $reflected_class->getInterfaces(); + + foreach ($interfaces as $interface) { + $interface_name = $interface->getName(); + $this->registerClass($interface); + + if ($reflected_class->isInterface()) { + $storage->parent_interfaces[strtolower($interface_name)] = $interface_name; + } else { + $storage->class_implements[strtolower($interface_name)] = $interface_name; + } + } + + foreach ($reflection_methods as $reflection_method) { + $method_reflection_class = $reflection_method->getDeclaringClass(); + + $this->registerClass($method_reflection_class); + + $this->extractReflectionMethodInfo($reflection_method); + + if ($reflection_method->class !== $class_name + && ($class_name !== 'SoapFault' || $reflection_method->name !== '__construct') + ) { + $reflection_method_name = strtolower($reflection_method->name); + $reflection_method_class = $reflection_method->class; + + $this->codebase->methods->setDeclaringMethodId( + $class_name, + $reflection_method_name, + $reflection_method_class, + $reflection_method_name + ); + + $this->codebase->methods->setAppearingMethodId( + $class_name, + $reflection_method_name, + $reflection_method_class, + $reflection_method_name + ); + } + } + } + + public function extractReflectionMethodInfo(ReflectionMethod $method): void + { + $method_name_lc = strtolower($method->getName()); + + $fq_class_name = $method->class; + + $fq_class_name_lc = strtolower($fq_class_name); + + $class_storage = $this->storage_provider->get($fq_class_name_lc); + + if (isset($class_storage->methods[$method_name_lc])) { + return; + } + + $method_id = $method->class . '::' . $method_name_lc; + + $storage = $class_storage->methods[$method_name_lc] = new MethodStorage(); + + $storage->cased_name = $method->name; + $storage->defining_fqcln = $method->class; + + if ($method_name_lc === $fq_class_name_lc) { + $this->codebase->methods->setDeclaringMethodId( + $fq_class_name, + '__construct', + $fq_class_name, + $method_name_lc + ); + $this->codebase->methods->setAppearingMethodId( + $fq_class_name, + '__construct', + $fq_class_name, + $method_name_lc + ); + } + + $declaring_class = $method->getDeclaringClass(); + + $storage->is_static = $method->isStatic(); + $storage->abstract = $method->isAbstract(); + $storage->mutation_free = $storage->external_mutation_free + = ($method_name_lc === '__construct' && $fq_class_name_lc === 'datetimezone'); + + $class_storage->declaring_method_ids[$method_name_lc] = new MethodIdentifier( + $declaring_class->name, + $method_name_lc + ); + + $class_storage->inheritable_method_ids[$method_name_lc] + = $class_storage->declaring_method_ids[$method_name_lc]; + $class_storage->appearing_method_ids[$method_name_lc] + = $class_storage->declaring_method_ids[$method_name_lc]; + $class_storage->overridden_method_ids[$method_name_lc] = []; + + $storage->visibility = $method->isPrivate() + ? ClassLikeAnalyzer::VISIBILITY_PRIVATE + : ($method->isProtected() ? ClassLikeAnalyzer::VISIBILITY_PROTECTED : ClassLikeAnalyzer::VISIBILITY_PUBLIC); + + $callables = InternalCallMapHandler::getCallablesFromCallMap($method_id); + + if ($callables && $callables[0]->params !== null && $callables[0]->return_type !== null) { + $storage->setParams([]); + + foreach ($callables[0]->params as $param) { + if ($param->type) { + $param->type->queueClassLikesForScanning($this->codebase); + } + } + + $storage->setParams($callables[0]->params); + + $storage->return_type = $callables[0]->return_type; + $storage->return_type->queueClassLikesForScanning($this->codebase); + } else { + $params = $method->getParameters(); + + $storage->setParams([]); + + foreach ($params as $param) { + $param_array = $this->getReflectionParamData($param); + $storage->addParam($param_array); + } + } + + $storage->required_param_count = 0; + + foreach ($storage->params as $i => $param) { + if (!$param->is_optional && !$param->is_variadic) { + $storage->required_param_count = $i + 1; + } + } + } + + private function getReflectionParamData(ReflectionParameter $param): FunctionLikeParameter + { + $param_type = self::getPsalmTypeFromReflectionType($param->getType()); + $param_name = $param->getName(); + + $is_optional = $param->isOptional(); + + $parameter = new FunctionLikeParameter( + $param_name, + $param->isPassedByReference(), + $param_type, + null, + null, + $is_optional, + $param_type->isNullable(), + $param->isVariadic() + ); + + $parameter->signature_type = Type::getMixed(); + + return $parameter; + } + + /** + * @param callable-string $function_id + * + * @return false|null + */ + public function registerFunction(string $function_id): ?bool + { + try { + $reflection_function = new ReflectionFunction($function_id); + + $callmap_callable = null; + + if (isset(self::$builtin_functions[$function_id])) { + return null; + } + + $storage = self::$builtin_functions[$function_id] = new FunctionStorage(); + + if (InternalCallMapHandler::inCallMap($function_id)) { + $callmap_callable = InternalCallMapHandler::getCallableFromCallMapById( + $this->codebase, + $function_id, + [], + null + ); + } + + if ($callmap_callable !== null + && $callmap_callable->params !== null + && $callmap_callable->return_type !== null + ) { + $storage->setParams($callmap_callable->params); + $storage->return_type = $callmap_callable->return_type; + } else { + $reflection_params = $reflection_function->getParameters(); + + foreach ($reflection_params as $param) { + $param_obj = $this->getReflectionParamData($param); + $storage->addParam($param_obj); + } + + if ($reflection_return_type = $reflection_function->getReturnType()) { + $storage->return_type = self::getPsalmTypeFromReflectionType($reflection_return_type); + } + } + + $storage->pure = true; + + $storage->required_param_count = 0; + + foreach ($storage->params as $i => $param) { + if (!$param->is_optional && !$param->is_variadic) { + $storage->required_param_count = $i + 1; + } + } + + $storage->cased_name = $reflection_function->getName(); + } catch (ReflectionException $e) { + return false; + } + + return null; + } + + public static function getPsalmTypeFromReflectionType(?ReflectionType $reflection_type = null): Union + { + if (!$reflection_type) { + return Type::getMixed(); + } + + if ($reflection_type instanceof ReflectionNamedType) { + $type = $reflection_type->getName(); + } elseif ($reflection_type instanceof ReflectionUnionType) { + /** @psalm-suppress MixedArgument */ + $type = implode( + '|', + array_map( + function (ReflectionNamedType $reflection) { + return $reflection->getName(); + }, + $reflection_type->getTypes() + ) + ); + } else { + throw new LogicException('Unexpected reflection class ' . get_class($reflection_type) . ' found.'); + } + + if ($reflection_type->allowsNull()) { + $type .= '|null'; + } + + return Type::parseString($type); + } + + private function registerInheritedMethods( + string $fq_class_name, + string $parent_class + ): void { + $parent_storage = $this->storage_provider->get($parent_class); + $storage = $this->storage_provider->get($fq_class_name); + + // register where they appear (can never be in a trait) + foreach ($parent_storage->appearing_method_ids as $method_name => $appearing_method_id) { + $storage->appearing_method_ids[$method_name] = $appearing_method_id; + } + + // register where they're declared + foreach ($parent_storage->inheritable_method_ids as $method_name => $declaring_method_id) { + $storage->declaring_method_ids[$method_name] = $declaring_method_id; + $storage->inheritable_method_ids[$method_name] = $declaring_method_id; + + $storage->overridden_method_ids[$method_name][$declaring_method_id->fq_class_name] + = $declaring_method_id; + } + } + + /** + * @param lowercase-string $fq_class_name + * @param lowercase-string $parent_class + * + */ + private function registerInheritedProperties( + string $fq_class_name, + string $parent_class + ): void { + $parent_storage = $this->storage_provider->get($parent_class); + $storage = $this->storage_provider->get($fq_class_name); + + // register where they appear (can never be in a trait) + foreach ($parent_storage->appearing_property_ids as $property_name => $appearing_property_id) { + if (!$parent_storage->is_trait + && isset($parent_storage->properties[$property_name]) + && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE + ) { + continue; + } + + $storage->appearing_property_ids[$property_name] = $appearing_property_id; + } + + // register where they're declared + foreach ($parent_storage->declaring_property_ids as $property_name => $declaring_property_class) { + if (!$parent_storage->is_trait + && isset($parent_storage->properties[$property_name]) + && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE + ) { + continue; + } + + $storage->declaring_property_ids[$property_name] = strtolower($declaring_property_class); + } + + // register where they're declared + foreach ($parent_storage->inheritable_property_ids as $property_name => $inheritable_property_id) { + if (!$parent_storage->is_trait + && isset($parent_storage->properties[$property_name]) + && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE + ) { + continue; + } + + $storage->inheritable_property_ids[$property_name] = $inheritable_property_id; + } + } + + public function hasFunction(string $function_id): bool + { + return isset(self::$builtin_functions[$function_id]); + } + + public function getFunctionStorage(string $function_id): FunctionStorage + { + if (isset(self::$builtin_functions[$function_id])) { + return self::$builtin_functions[$function_id]; + } + + throw new UnexpectedValueException('Expecting to have a function for ' . $function_id); + } + + /** + * @return array + */ + public function getFunctions(): array + { + return self::$builtin_functions; + } + + public static function clearCache(): void + { + self::$builtin_functions = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php new file mode 100644 index 00000000..fb6e1bf5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php @@ -0,0 +1,811 @@ +, + * array, + * array, + * array, + * array, + * array, + * array, + * array, + * array + * } + * + * @psalm-type PoolData = array{ + * classlikes_data:array{ + * array, + * array, + * array, + * array, + * array, + * array, + * array, + * array, + * array + * }, + * scanner_data: ThreadData, + * issues:array>, + * changed_members:array>, + * unchanged_signature_members:array>, + * diff_map:array>, + * deletion_ranges:array>, + * errors:array, + * classlike_storage:array, + * file_storage:array, + * new_file_content_hashes: array, + * taint_data: ?TaintFlowGraph + * } + */ + +/** + * @internal + * + * Contains methods that aid in the scanning of Psalm's codebase + */ +class Scanner +{ + /** + * @var Codebase + */ + private $codebase; + + /** + * @var array + */ + private $classlike_files = []; + + /** + * @var array + */ + private $deep_scanned_classlike_files = []; + + /** + * @var array + */ + private $files_to_scan = []; + + /** + * @var array + */ + private $classes_to_scan = []; + + /** + * @var array + */ + private $classes_to_deep_scan = []; + + /** + * @var array + */ + private $files_to_deep_scan = []; + + /** + * @var array + */ + private $scanned_files = []; + + /** + * @var array + */ + private $store_scan_failure = []; + + /** + * @var array + */ + private $reflected_classlikes_lc = []; + + /** + * @var Reflection + */ + private $reflection; + + /** + * @var Config + */ + private $config; + + /** + * @var Progress + */ + private $progress; + + /** + * @var FileStorageProvider + */ + private $file_storage_provider; + + /** + * @var FileProvider + */ + private $file_provider; + + /** + * @var FileReferenceProvider + */ + private $file_reference_provider; + + /** + * @var bool + */ + private $is_forked = false; + + public function __construct( + Codebase $codebase, + Config $config, + FileStorageProvider $file_storage_provider, + FileProvider $file_provider, + Reflection $reflection, + FileReferenceProvider $file_reference_provider, + Progress $progress + ) { + $this->codebase = $codebase; + $this->reflection = $reflection; + $this->file_provider = $file_provider; + $this->progress = $progress; + $this->file_storage_provider = $file_storage_provider; + $this->config = $config; + $this->file_reference_provider = $file_reference_provider; + } + + /** + * @param array $files_to_scan + * + */ + public function addFilesToShallowScan(array $files_to_scan): void + { + $this->files_to_scan += $files_to_scan; + } + + /** + * @param array $files_to_scan + */ + public function addFilesToDeepScan(array $files_to_scan): void + { + $this->files_to_scan += $files_to_scan; + $this->files_to_deep_scan += $files_to_scan; + } + + public function addFileToShallowScan(string $file_path): void + { + $this->files_to_scan[$file_path] = $file_path; + } + + public function addFileToDeepScan(string $file_path): void + { + $this->files_to_scan[$file_path] = $file_path; + $this->files_to_deep_scan[$file_path] = $file_path; + } + + public function removeFile(string $file_path): void + { + unset($this->scanned_files[$file_path]); + } + + public function removeClassLike(string $fq_classlike_name_lc): void + { + unset( + $this->classlike_files[$fq_classlike_name_lc], + $this->deep_scanned_classlike_files[$fq_classlike_name_lc] + ); + } + + public function setClassLikeFilePath(string $fq_classlike_name_lc, string $file_path): void + { + $this->classlike_files[$fq_classlike_name_lc] = $file_path; + } + + public function getClassLikeFilePath(string $fq_classlike_name_lc): string + { + if (!isset($this->classlike_files[$fq_classlike_name_lc])) { + throw new UnexpectedValueException('Could not find file for ' . $fq_classlike_name_lc); + } + + return $this->classlike_files[$fq_classlike_name_lc]; + } + + /** + * @param array $phantom_classes + */ + public function queueClassLikeForScanning( + string $fq_classlike_name, + bool $analyze_too = false, + bool $store_failure = true, + array $phantom_classes = [] + ): void { + if ($fq_classlike_name[0] === '\\') { + $fq_classlike_name = substr($fq_classlike_name, 1); + } + + $fq_classlike_name_lc = strtolower($fq_classlike_name); + + if ($fq_classlike_name_lc === 'static') { + return; + } + + // avoid checking classes that we know will just end in failure + if ($fq_classlike_name_lc === 'null' || substr($fq_classlike_name_lc, -5) === '\null') { + return; + } + + if (!isset($this->classlike_files[$fq_classlike_name_lc]) + || ($analyze_too && !isset($this->deep_scanned_classlike_files[$fq_classlike_name_lc])) + ) { + if (!isset($this->classes_to_scan[$fq_classlike_name_lc]) || $store_failure) { + $this->classes_to_scan[$fq_classlike_name_lc] = $fq_classlike_name; + } + + if ($analyze_too) { + $this->classes_to_deep_scan[$fq_classlike_name_lc] = true; + } + + $this->store_scan_failure[$fq_classlike_name] = $store_failure; + + if (PropertyMap::inPropertyMap($fq_classlike_name_lc)) { + $public_mapped_properties = PropertyMap::getPropertyMap()[$fq_classlike_name_lc]; + + foreach ($public_mapped_properties as $public_mapped_property) { + $property_type = Type::parseString($public_mapped_property); + $property_type->queueClassLikesForScanning( + $this->codebase, + null, + $phantom_classes + [$fq_classlike_name_lc => true] + ); + } + } + } + } + + public function scanFiles(ClassLikes $classlikes, int $pool_size = 1): bool + { + $has_changes = false; + while ($this->files_to_scan || $this->classes_to_scan) { + if ($this->files_to_scan) { + if ($this->scanFilePaths($pool_size)) { + $has_changes = true; + } + } else { + $this->convertClassesToFilePaths($classlikes); + } + } + + return $has_changes; + } + + private function scanFilePaths(int $pool_size): bool + { + $filetype_scanners = $this->config->getFiletypeScanners(); + $files_to_scan = array_filter( + $this->files_to_scan, + function (string $file_path): bool { + return $this->file_provider->fileExists($file_path) + && (!isset($this->scanned_files[$file_path]) + || (isset($this->files_to_deep_scan[$file_path]) && !$this->scanned_files[$file_path])); + } + ); + + $this->files_to_scan = []; + + if (!$files_to_scan) { + return false; + } + + $files_to_deep_scan = $this->files_to_deep_scan; + + $scanner_worker = + function (int $_, string $file_path) use ($filetype_scanners, $files_to_deep_scan): void { + $this->scanFile( + $file_path, + $filetype_scanners, + isset($files_to_deep_scan[$file_path]) + ); + }; + + if (!$this->is_forked && $pool_size > 1 && count($files_to_scan) > 512) { + $pool_size = ceil(min($pool_size, count($files_to_scan) / 256)); + } else { + $pool_size = 1; + } + + if ($pool_size > 1) { + $process_file_paths = []; + + $i = 0; + + foreach ($files_to_scan as $file_path) { + $process_file_paths[$i % $pool_size][] = $file_path; + ++$i; + } + + $this->progress->debug('Forking process for scanning' . PHP_EOL); + + // Run scanning one file at a time, splitting the set of + // files up among a given number of child processes. + $pool = new Pool( + $this->config, + $process_file_paths, + function (): void { + $this->progress->debug('Initialising forked process for scanning' . PHP_EOL); + + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + $statements_provider = $codebase->statements_provider; + + $codebase->scanner->isForked(); + FileStorageProvider::deleteAll(); + ClassLikeStorageProvider::deleteAll(); + + $statements_provider->resetDiffs(); + + $this->progress->debug('Have initialised forked process for scanning' . PHP_EOL); + }, + $scanner_worker, + /** + * @return PoolData + */ + function () { + $this->progress->debug('Collecting data from forked scanner process' . PHP_EOL); + + $project_analyzer = ProjectAnalyzer::getInstance(); + $codebase = $project_analyzer->getCodebase(); + $statements_provider = $codebase->statements_provider; + + return [ + 'classlikes_data' => $codebase->classlikes->getThreadData(), + 'scanner_data' => $codebase->scanner->getThreadData(), + 'issues' => IssueBuffer::getIssuesData(), + 'changed_members' => $statements_provider->getChangedMembers(), + 'unchanged_signature_members' => $statements_provider->getUnchangedSignatureMembers(), + 'diff_map' => $statements_provider->getDiffMap(), + 'deletion_ranges' => $statements_provider->getDeletionRanges(), + 'errors' => $statements_provider->getErrors(), + 'classlike_storage' => $codebase->classlike_storage_provider->getAll(), + 'file_storage' => $codebase->file_storage_provider->getAll(), + 'new_file_content_hashes' => $statements_provider->parser_cache_provider + ? $statements_provider->parser_cache_provider->getNewFileContentHashes() + : [], + 'taint_data' => $codebase->taint_flow_graph, + ]; + } + ); + + // Wait for all tasks to complete and collect the results. + /** + * @var array + */ + $forked_pool_data = $pool->wait(); + + foreach ($forked_pool_data as $pool_data) { + IssueBuffer::addIssues($pool_data['issues']); + + $this->codebase->statements_provider->addChangedMembers( + $pool_data['changed_members'] + ); + $this->codebase->statements_provider->addUnchangedSignatureMembers( + $pool_data['unchanged_signature_members'] + ); + $this->codebase->statements_provider->addDiffMap( + $pool_data['diff_map'] + ); + $this->codebase->statements_provider->addDeletionRanges( + $pool_data['deletion_ranges'] + ); + $this->codebase->statements_provider->addErrors($pool_data['errors']); + + if ($this->codebase->taint_flow_graph && $pool_data['taint_data']) { + $this->codebase->taint_flow_graph->addGraph($pool_data['taint_data']); + } + + $this->codebase->file_storage_provider->addMore($pool_data['file_storage']); + $this->codebase->classlike_storage_provider->addMore($pool_data['classlike_storage']); + + $this->codebase->classlikes->addThreadData($pool_data['classlikes_data']); + + $this->addThreadData($pool_data['scanner_data']); + + if ($this->codebase->statements_provider->parser_cache_provider) { + $this->codebase->statements_provider->parser_cache_provider->addNewFileContentHashes( + $pool_data['new_file_content_hashes'] + ); + } + } + + if ($pool->didHaveError()) { + exit(1); + } + } else { + $i = 0; + + foreach ($files_to_scan as $file_path => $_) { + $scanner_worker($i, $file_path); + ++$i; + } + } + + if ($this->codebase->statements_provider->parser_cache_provider) { + $this->codebase->statements_provider->parser_cache_provider->saveFileContentHashes(); + } + + foreach ($files_to_scan as $scanned_file) { + if ($this->config->hasStubFile($scanned_file)) { + $file_storage = $this->file_storage_provider->get($scanned_file); + + foreach ($file_storage->functions as $function_storage) { + if ($function_storage->cased_name + && !$this->codebase->functions->hasStubbedFunction($function_storage->cased_name) + ) { + $this->codebase->functions->addGlobalFunction( + $function_storage->cased_name, + $function_storage + ); + } + } + + foreach ($file_storage->constants as $name => $type) { + $this->codebase->addGlobalConstantType($name, $type); + } + } + } + + $this->file_reference_provider->addClassLikeFiles($this->classlike_files); + + return true; + } + + private function convertClassesToFilePaths(ClassLikes $classlikes): void + { + $classes_to_scan = $this->classes_to_scan; + + $this->classes_to_scan = []; + + foreach ($classes_to_scan as $fq_classlike_name) { + $fq_classlike_name_lc = strtolower($fq_classlike_name); + + if (isset($this->reflected_classlikes_lc[$fq_classlike_name_lc])) { + continue; + } + + if ($classlikes->isMissingClassLike($fq_classlike_name_lc)) { + continue; + } + + if (!isset($this->classlike_files[$fq_classlike_name_lc])) { + if ($classlikes->doesClassLikeExist($fq_classlike_name_lc)) { + if ($fq_classlike_name_lc === 'self') { + continue; + } + + $this->progress->debug('Using reflection to get metadata for ' . $fq_classlike_name . "\n"); + + /** @psalm-suppress ArgumentTypeCoercion */ + $reflected_class = new ReflectionClass($fq_classlike_name); + $this->reflection->registerClass($reflected_class); + $this->reflected_classlikes_lc[$fq_classlike_name_lc] = true; + } elseif ($this->fileExistsForClassLike($classlikes, $fq_classlike_name)) { + $fq_classlike_name_lc = strtolower($classlikes->getUnAliasedName( + $fq_classlike_name_lc + )); + + // even though we've checked this above, calling the method invalidates it + if (isset($this->classlike_files[$fq_classlike_name_lc])) { + $file_path = $this->classlike_files[$fq_classlike_name_lc]; + $this->files_to_scan[$file_path] = $file_path; + if (isset($this->classes_to_deep_scan[$fq_classlike_name_lc])) { + unset($this->classes_to_deep_scan[$fq_classlike_name_lc]); + $this->files_to_deep_scan[$file_path] = $file_path; + } + } + } elseif ($this->store_scan_failure[$fq_classlike_name]) { + $classlikes->registerMissingClassLike($fq_classlike_name_lc); + } + } elseif (isset($this->classes_to_deep_scan[$fq_classlike_name_lc]) + && !isset($this->deep_scanned_classlike_files[$fq_classlike_name_lc]) + ) { + $file_path = $this->classlike_files[$fq_classlike_name_lc]; + $this->files_to_scan[$file_path] = $file_path; + unset($this->classes_to_deep_scan[$fq_classlike_name_lc]); + $this->files_to_deep_scan[$file_path] = $file_path; + $this->deep_scanned_classlike_files[$fq_classlike_name_lc] = true; + } + } + } + + /** + * @param array> $filetype_scanners + */ + private function scanFile( + string $file_path, + array $filetype_scanners, + bool $will_analyze = false + ): void { + $file_scanner = $this->getScannerForPath($file_path, $filetype_scanners, $will_analyze); + + if (isset($this->scanned_files[$file_path]) + && (!$will_analyze || $this->scanned_files[$file_path]) + ) { + throw new UnexpectedValueException('Should not be rescanning ' . $file_path); + } + + if (!$this->file_provider->fileExists($file_path) && $this->config->mustBeIgnored($file_path)) { + // this should not happen, but might if the file was temporary + return; + } + + $file_contents = $this->file_provider->getContents($file_path); + + $from_cache = $this->file_storage_provider->has($file_path, $file_contents); + + if (!$from_cache) { + $this->file_storage_provider->create($file_path); + } + + $this->scanned_files[$file_path] = $will_analyze; + + $file_storage = $this->file_storage_provider->get($file_path); + + $file_scanner->scan( + $this->codebase, + $file_storage, + $from_cache, + $this->progress + ); + + if (!$from_cache) { + if (!$file_storage->has_visitor_issues && $this->file_storage_provider->cache) { + $this->file_storage_provider->cache->writeToCache($file_storage, $file_contents); + } + } else { + $this->codebase->statements_provider->setUnchangedFile($file_path); + + foreach ($file_storage->required_file_paths as $required_file_path) { + if ($will_analyze) { + $this->addFileToDeepScan($required_file_path); + } else { + $this->addFileToShallowScan($required_file_path); + } + } + + foreach ($file_storage->classlikes_in_file as $fq_classlike_name) { + $this->codebase->exhumeClassLikeStorage(strtolower($fq_classlike_name), $file_path); + } + + foreach ($file_storage->required_classes as $fq_classlike_name) { + $this->queueClassLikeForScanning($fq_classlike_name, $will_analyze, false); + } + + foreach ($file_storage->required_interfaces as $fq_classlike_name) { + $this->queueClassLikeForScanning($fq_classlike_name, false, false); + } + + foreach ($file_storage->referenced_classlikes as $fq_classlike_name) { + $this->queueClassLikeForScanning($fq_classlike_name, false, false); + } + + if ($this->codebase->register_autoload_files) { + foreach ($file_storage->functions as $function_storage) { + if ($function_storage->cased_name + && !$this->codebase->functions->hasStubbedFunction($function_storage->cased_name) + ) { + $this->codebase->functions->addGlobalFunction( + $function_storage->cased_name, + $function_storage + ); + } + } + + foreach ($file_storage->constants as $name => $type) { + $this->codebase->addGlobalConstantType($name, $type); + } + } + + foreach ($file_storage->classlike_aliases as $aliased_name => $unaliased_name) { + $this->codebase->classlikes->addClassAlias($unaliased_name, $aliased_name); + } + } + } + + /** + * @param array> $filetype_scanners + */ + private function getScannerForPath( + string $file_path, + array $filetype_scanners, + bool $will_analyze = false + ): FileScanner { + $path_parts = explode(DIRECTORY_SEPARATOR, $file_path); + $file_name_parts = explode('.', array_pop($path_parts)); + $extension = count($file_name_parts) > 1 ? array_pop($file_name_parts) : null; + + $file_name = $this->config->shortenFileName($file_path); + + if (isset($filetype_scanners[$extension])) { + return new $filetype_scanners[$extension]($file_path, $file_name, $will_analyze); + } + + return new FileScanner($file_path, $file_name, $will_analyze); + } + + /** + * @return array + */ + public function getScannedFiles(): array + { + return $this->scanned_files; + } + + /** + * Checks whether a class exists, and if it does then records what file it's in + * for later checking + */ + private function fileExistsForClassLike(ClassLikes $classlikes, string $fq_class_name): bool + { + $fq_class_name_lc = strtolower($fq_class_name); + + if (isset($this->classlike_files[$fq_class_name_lc])) { + return true; + } + + if ($fq_class_name === 'self') { + return false; + } + + $composer_file_path = $this->config->getComposerFilePathForClassLike($fq_class_name); + + if ($composer_file_path && file_exists($composer_file_path)) { + $this->progress->debug('Using composer to locate file for ' . $fq_class_name . "\n"); + + $classlikes->addFullyQualifiedClassLikeName( + $fq_class_name_lc, + realpath($composer_file_path) + ); + + return true; + } + + $reflected_class = ErrorHandler::runWithExceptionsSuppressed( + function () use ($fq_class_name): ?ReflectionClass { + $old_level = error_reporting(); + $this->progress->setErrorReporting(); + + try { + $this->progress->debug('Using reflection to locate file for ' . $fq_class_name . "\n"); + + /** @psalm-suppress ArgumentTypeCoercion */ + return new ReflectionClass($fq_class_name); + } catch (Throwable $e) { + // do not cache any results here (as case-sensitive filenames can screw things up) + + return null; + } finally { + error_reporting($old_level); + } + } + ); + + if (null === $reflected_class) { + return false; + } + + $file_path = (string)$reflected_class->getFileName(); + + // if the file was autoloaded but exists in evaled code only, return false + if (!file_exists($file_path)) { + return false; + } + + $new_fq_class_name = $reflected_class->getName(); + $new_fq_class_name_lc = strtolower($new_fq_class_name); + + if ($new_fq_class_name_lc !== $fq_class_name_lc) { + $classlikes->addClassAlias($new_fq_class_name, $fq_class_name_lc); + $fq_class_name_lc = $new_fq_class_name_lc; + } + + $fq_class_name = $new_fq_class_name; + $classlikes->addFullyQualifiedClassLikeName($fq_class_name_lc); + + if ($reflected_class->isInterface()) { + $classlikes->addFullyQualifiedInterfaceName($fq_class_name, $file_path); + } elseif ($reflected_class->isTrait()) { + $classlikes->addFullyQualifiedTraitName($fq_class_name, $file_path); + } else { + $classlikes->addFullyQualifiedClassName($fq_class_name, $file_path); + } + + return true; + } + + /** + * @return ThreadData + */ + public function getThreadData(): array + { + return [ + $this->files_to_scan, + $this->files_to_deep_scan, + $this->classes_to_scan, + $this->classes_to_deep_scan, + $this->store_scan_failure, + $this->classlike_files, + $this->deep_scanned_classlike_files, + $this->scanned_files, + $this->reflected_classlikes_lc, + ]; + } + + /** + * @param ThreadData $thread_data + * + */ + public function addThreadData(array $thread_data): void + { + [ + $files_to_scan, + $files_to_deep_scan, + $classes_to_scan, + $classes_to_deep_scan, + $store_scan_failure, + $classlike_files, + $deep_scanned_classlike_files, + $scanned_files, + $reflected_classlikes_lc + ] = $thread_data; + + $this->files_to_scan = array_merge($files_to_scan, $this->files_to_scan); + $this->files_to_deep_scan = array_merge($files_to_deep_scan, $this->files_to_deep_scan); + $this->classes_to_scan = array_merge($classes_to_scan, $this->classes_to_scan); + $this->classes_to_deep_scan = array_merge($classes_to_deep_scan, $this->classes_to_deep_scan); + $this->store_scan_failure = array_merge($store_scan_failure, $this->store_scan_failure); + $this->classlike_files = array_merge($classlike_files, $this->classlike_files); + $this->deep_scanned_classlike_files = array_merge( + $deep_scanned_classlike_files, + $this->deep_scanned_classlike_files + ); + $this->scanned_files = array_merge($scanned_files, $this->scanned_files); + $this->reflected_classlikes_lc = array_merge($reflected_classlikes_lc, $this->reflected_classlikes_lc); + } + + public function isForked(): void + { + $this->is_forked = true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php new file mode 100644 index 00000000..2812bb6a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php @@ -0,0 +1,524 @@ + */ + private $sources = []; + + /** @var array */ + private $nodes = []; + + /** @var array */ + private $sinks = []; + + /** @var array> */ + private $specialized_calls = []; + + /** @var array> */ + private $specializations = []; + + public function addNode(DataFlowNode $node): void + { + $this->nodes[$node->id] = $node; + + if ($node->unspecialized_id && $node->specialization_key) { + $this->specialized_calls[$node->specialization_key][$node->unspecialized_id] = true; + $this->specializations[$node->unspecialized_id][$node->specialization_key] = true; + } + } + + public function addSource(TaintSource $node): void + { + $this->sources[$node->id] = $node; + } + + public function addSink(TaintSink $node): void + { + $this->sinks[$node->id] = $node; + // in the rare case the sink is the _next_ node, this is necessary + $this->nodes[$node->id] = $node; + } + + public function addGraph(self $taint): void + { + $this->sources += $taint->sources; + $this->sinks += $taint->sinks; + $this->nodes += $taint->nodes; + $this->specialized_calls += $taint->specialized_calls; + + foreach ($taint->forward_edges as $key => $map) { + if (!isset($this->forward_edges[$key])) { + $this->forward_edges[$key] = $map; + } else { + $this->forward_edges[$key] += $map; + } + } + + foreach ($taint->specializations as $key => $map) { + if (!isset($this->specializations[$key])) { + $this->specializations[$key] = $map; + } else { + $this->specializations[$key] += $map; + } + } + } + + public function getPredecessorPath(DataFlowNode $source): string + { + $location_summary = ''; + + if ($source->code_location) { + $location_summary = $source->code_location->getShortSummary(); + } + + $source_descriptor = $source->label . ($location_summary ? ' (' . $location_summary . ')' : ''); + + $previous_source = $source->previous; + + if ($previous_source) { + if ($previous_source === $source) { + return ''; + } + + if ($source->code_location + && $previous_source->code_location + && $previous_source->code_location->getHash() === $source->code_location->getHash() + && $previous_source->previous + ) { + return $this->getPredecessorPath($previous_source->previous) . ' -> ' . $source_descriptor; + } + + return $this->getPredecessorPath($previous_source) . ' -> ' . $source_descriptor; + } + + return $source_descriptor; + } + + public function getSuccessorPath(DataFlowNode $sink): string + { + $location_summary = ''; + + if ($sink->code_location) { + $location_summary = $sink->code_location->getShortSummary(); + } + + $sink_descriptor = $sink->label . ($location_summary ? ' (' . $location_summary . ')' : ''); + + $next_sink = $sink->previous; + + if ($next_sink) { + if ($next_sink === $sink) { + return ''; + } + + if ($sink->code_location + && $next_sink->code_location + && $next_sink->code_location->getHash() === $sink->code_location->getHash() + && $next_sink->previous + ) { + return $sink_descriptor . ' -> ' . $this->getSuccessorPath($next_sink->previous); + } + + return $sink_descriptor . ' -> ' . $this->getSuccessorPath($next_sink); + } + + return $sink_descriptor; + } + + /** + * @return list + */ + public function getIssueTrace(DataFlowNode $source): array + { + $previous_source = $source->previous; + + $node = [ + 'location' => $source->code_location, + 'label' => $source->label, + 'entry_path_type' => end($source->path_types) ?: '' + ]; + + if ($previous_source) { + if ($previous_source === $source) { + return []; + } + + return array_merge($this->getIssueTrace($previous_source), [$node]); + } + + return [$node]; + } + + public function connectSinksAndSources(): void + { + $visited_source_ids = []; + + $sources = $this->sources; + $sinks = $this->sinks; + + ksort($this->specializations); + ksort($this->forward_edges); + + // reprocess resolved descendants up to a maximum nesting level of 40 + for ($i = 0; count($sinks) && count($sources) && $i < 40; $i++) { + $new_sources = []; + + ksort($sources); + + foreach ($sources as $source) { + $source_taints = $source->taints; + sort($source_taints); + + $visited_source_ids[$source->id][implode(',', $source_taints)] = true; + + $generated_sources = $this->getSpecializedSources($source); + + foreach ($generated_sources as $generated_source) { + $new_sources = array_merge( + $new_sources, + $this->getChildNodes( + $generated_source, + $source_taints, + $sinks, + $visited_source_ids + ) + ); + } + } + + $sources = $new_sources; + } + } + + /** + * @param array $source_taints + * @param array $sinks + * @return array + */ + private function getChildNodes( + DataFlowNode $generated_source, + array $source_taints, + array $sinks, + array $visited_source_ids + ): array { + $new_sources = []; + + $config = Config::getInstance(); + + $project_analyzer = ProjectAnalyzer::getInstance(); + + foreach ($this->forward_edges[$generated_source->id] as $to_id => $path) { + $path_type = $path->type; + $added_taints = $path->unescaped_taints ?: []; + $removed_taints = $path->escaped_taints ?: []; + + if (!isset($this->nodes[$to_id])) { + continue; + } + + $destination_node = $this->nodes[$to_id]; + + $new_taints = array_unique( + array_diff( + array_merge($source_taints, $added_taints), + $removed_taints + ) + ); + + sort($new_taints); + + if (isset($visited_source_ids[$to_id][implode(',', $new_taints)])) { + continue; + } + + if (self::shouldIgnoreFetch($path_type, 'arraykey', $generated_source->path_types)) { + continue; + } + + if (self::shouldIgnoreFetch($path_type, 'arrayvalue', $generated_source->path_types)) { + continue; + } + + if (self::shouldIgnoreFetch($path_type, 'property', $generated_source->path_types)) { + continue; + } + + if ($generated_source->code_location + && $project_analyzer->canReportIssues($generated_source->code_location->file_path) + && !$config->reportIssueInFile('TaintedInput', $generated_source->code_location->file_path) + ) { + continue; + } + + if (isset($sinks[$to_id])) { + $matching_taints = array_intersect($sinks[$to_id]->taints, $new_taints); + + if ($matching_taints && $generated_source->code_location) { + if ($sinks[$to_id]->code_location + && $config->reportIssueInFile('TaintedInput', $sinks[$to_id]->code_location->file_path) + ) { + $issue_location = $sinks[$to_id]->code_location; + } else { + $issue_location = $generated_source->code_location; + } + + $issue_trace = $this->getIssueTrace($generated_source); + $path = $this->getPredecessorPath($generated_source) + . ' -> ' . $this->getSuccessorPath($sinks[$to_id]); + + foreach ($matching_taints as $matching_taint) { + switch ($matching_taint) { + case TaintKind::INPUT_CALLABLE: + $issue = new TaintedCallable( + 'Detected tainted text', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_UNSERIALIZE: + $issue = new TaintedUnserialize( + 'Detected tainted code passed to unserialize or similar', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_INCLUDE: + $issue = new TaintedInclude( + 'Detected tainted code passed to include or similar', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_EVAL: + $issue = new TaintedEval( + 'Detected tainted code passed to eval or similar', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_SQL: + $issue = new TaintedSql( + 'Detected tainted SQL', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_HTML: + $issue = new TaintedHtml( + 'Detected tainted HTML', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_HAS_QUOTES: + $issue = new TaintedTextWithQuotes( + 'Detected tainted text with possible quotes', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_SHELL: + $issue = new TaintedShell( + 'Detected tainted shell code', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::USER_SECRET: + $issue = new TaintedUserSecret( + 'Detected tainted user secret leaking', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::SYSTEM_SECRET: + $issue = new TaintedSystemSecret( + 'Detected tainted system secret leaking', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_SSRF: + $issue = new TaintedSSRF( + 'Detected tainted network request', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_LDAP: + $issue = new TaintedLdap( + 'Detected tainted LDAP request', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_COOKIE: + $issue = new TaintedCookie( + 'Detected tainted cookie', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_FILE: + $issue = new TaintedFile( + 'Detected tainted file handling', + $issue_location, + $issue_trace, + $path + ); + break; + + case TaintKind::INPUT_HEADER: + $issue = new TaintedHeader( + 'Detected tainted header', + $issue_location, + $issue_trace, + $path + ); + break; + + default: + $issue = new TaintedCustom( + 'Detected tainted ' . $matching_taint, + $issue_location, + $issue_trace, + $path + ); + } + + IssueBuffer::maybeAdd($issue); + } + } + } + + $new_destination = clone $destination_node; + $new_destination->previous = $generated_source; + $new_destination->taints = $new_taints; + $new_destination->specialized_calls = $generated_source->specialized_calls; + $new_destination->path_types = array_merge($generated_source->path_types, [$path_type]); + + $key = $to_id . + ' ' . json_encode($new_destination->specialized_calls) . + ' ' . json_encode($new_destination->taints); + $new_sources[$key] = $new_destination; + } + + return $new_sources; + } + + /** @return array */ + private function getSpecializedSources(DataFlowNode $source): array + { + $generated_sources = []; + + if (isset($this->forward_edges[$source->id])) { + return [$source]; + } + + if ($source->specialization_key && isset($this->specialized_calls[$source->specialization_key])) { + $generated_source = clone $source; + + $generated_source->id = substr($source->id, 0, -strlen($source->specialization_key) - 1); + + $generated_source->specialized_calls[$source->specialization_key][$generated_source->id] = true; + + $generated_sources[] = $generated_source; + } elseif (isset($this->specializations[$source->id])) { + foreach ($this->specializations[$source->id] as $specialization => $_) { + if (!$source->specialized_calls || isset($source->specialized_calls[$specialization])) { + $new_source = clone $source; + + $new_source->id = $source->id . '-' . $specialization; + + unset($new_source->specialized_calls[$specialization]); + + $generated_sources[] = $new_source; + } + } + } else { + foreach ($source->specialized_calls as $key => $map) { + if (isset($map[$source->id]) && isset($this->forward_edges[$source->id . '-' . $key])) { + $new_source = clone $source; + + $new_source->id = $source->id . '-' . $key; + + $generated_sources[] = $new_source; + } + } + } + + return array_filter( + $generated_sources, + function ($new_source): bool { + return isset($this->forward_edges[$new_source->id]); + } + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php new file mode 100644 index 00000000..f0bca358 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php @@ -0,0 +1,224 @@ +> */ + protected $backward_edges = []; + + /** @var array */ + private $nodes = []; + + /** @var array> */ + private $origin_locations_by_id = []; + + public function addNode(DataFlowNode $node): void + { + $this->nodes[$node->id] = $node; + } + + /** + * @param array $added_taints + * @param array $removed_taints + */ + public function addPath( + DataFlowNode $from, + DataFlowNode $to, + string $path_type, + ?array $added_taints = null, + ?array $removed_taints = null + ): void { + $from_id = $from->id; + $to_id = $to->id; + + if ($from_id === $to_id) { + return; + } + + $length = 0; + + if ($from->code_location + && $to->code_location + && $from->code_location->file_path === $to->code_location->file_path + ) { + $to_line = $to->code_location->raw_line_number; + $from_line = $from->code_location->raw_line_number; + $length = abs($to_line - $from_line); + } + + $this->backward_edges[$to_id][$from_id] = true; + $this->forward_edges[$from_id][$to_id] = new Path($path_type, $length); + } + + public function isVariableUsed(DataFlowNode $assignment_node): bool + { + $visited_source_ids = []; + + $sources = [$assignment_node]; + + for ($i = 0; count($sources) && $i < 200; $i++) { + $new_child_nodes = []; + + foreach ($sources as $source) { + $visited_source_ids[$source->id] = true; + + $child_nodes = $this->getChildNodes( + $source, + $visited_source_ids + ); + + if ($child_nodes === null) { + return true; + } + + $new_child_nodes = array_merge( + $new_child_nodes, + $child_nodes + ); + } + + $sources = $new_child_nodes; + } + + return false; + } + + /** + * @return list + */ + public function getOriginLocations(DataFlowNode $assignment_node): array + { + if (isset($this->origin_locations_by_id[$assignment_node->id])) { + return $this->origin_locations_by_id[$assignment_node->id]; + } + + $visited_child_ids = []; + + $origin_locations = []; + + $child_nodes = [$assignment_node]; + + for ($i = 0; count($child_nodes) && $i < 200; $i++) { + $new_parent_nodes = []; + + foreach ($child_nodes as $child_node) { + $visited_child_ids[$child_node->id] = true; + + $parent_nodes = $this->getParentNodes( + $child_node, + $visited_child_ids + ); + + if (!$parent_nodes) { + if ($child_node->code_location) { + $origin_locations[] = $child_node->code_location; + } + + continue; + } + + $new_parent_nodes = array_merge( + $new_parent_nodes, + $parent_nodes + ); + } + + $child_nodes = $new_parent_nodes; + } + + $this->origin_locations_by_id[$assignment_node->id] = $origin_locations; + + return $origin_locations; + } + + /** + * @param array $visited_source_ids + * @return array|null + */ + private function getChildNodes( + DataFlowNode $generated_source, + array $visited_source_ids + ): ?array { + $new_child_nodes = []; + + if (!isset($this->forward_edges[$generated_source->id])) { + return []; + } + + foreach ($this->forward_edges[$generated_source->id] as $to_id => $path) { + $path_type = $path->type; + + if ($path->type === 'variable-use' + || $path->type === 'closure-use' + || $path->type === 'global-use' + || $path->type === 'use-inside-instance-property' + || $path->type === 'use-inside-static-property' + || $path->type === 'use-inside-call' + || $path->type === 'use-inside-conditional' + || $path->type === 'use-inside-isset' + || $path->type === 'arg' + ) { + return null; + } + + if (isset($visited_source_ids[$to_id])) { + continue; + } + + if (self::shouldIgnoreFetch($path_type, 'arraykey', $generated_source->path_types)) { + continue; + } + + if (self::shouldIgnoreFetch($path_type, 'arrayvalue', $generated_source->path_types)) { + continue; + } + + if (self::shouldIgnoreFetch($path_type, 'property', $generated_source->path_types)) { + continue; + } + + $new_destination = new DataFlowNode($to_id, $to_id, null); + $new_destination->path_types = array_merge($generated_source->path_types, [$path_type]); + + $new_child_nodes[$to_id] = $new_destination; + } + + return $new_child_nodes; + } + + /** + * @param array $visited_source_ids + * @return list + */ + private function getParentNodes( + DataFlowNode $destination, + array $visited_source_ids + ): array { + $new_parent_nodes = []; + + if (!isset($this->backward_edges[$destination->id])) { + return []; + } + + foreach ($this->backward_edges[$destination->id] as $from_id => $_) { + if (isset($visited_source_ids[$from_id])) { + continue; + } + + if (isset($this->nodes[$from_id])) { + $new_parent_nodes[] = $this->nodes[$from_id]; + } + } + + return $new_parent_nodes; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Composer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Composer.php new file mode 100644 index 00000000..52ac9350 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Composer.php @@ -0,0 +1,43 @@ + */ + public $taints; + + /** @var ?self */ + public $previous; + + /** @var list */ + public $path_types = []; + + /** + * @var array> + */ + public $specialized_calls = []; + + /** + * @param array $taints + */ + public function __construct( + string $id, + string $label, + ?CodeLocation $code_location, + ?string $specialization_key = null, + array $taints = [] + ) { + $this->id = $id; + + if ($specialization_key) { + $this->unspecialized_id = $id; + $this->id .= '-' . $specialization_key; + } + + $this->label = $label; + $this->code_location = $code_location; + $this->specialization_key = $specialization_key; + $this->taints = $taints; + } + + /** + * @return static + */ + final public static function getForMethodArgument( + string $method_id, + string $cased_method_id, + int $argument_offset, + ?CodeLocation $arg_location, + ?CodeLocation $code_location = null + ): self { + $arg_id = strtolower($method_id) . '#' . ($argument_offset + 1); + + $label = $cased_method_id . '#' . ($argument_offset + 1); + + $specialization_key = null; + + if ($code_location) { + $specialization_key = strtolower($code_location->file_name) . ':' . $code_location->raw_file_start; + } + + return new static( + $arg_id, + $label, + $arg_location, + $specialization_key + ); + } + + /** + * @return static + */ + final public static function getForAssignment( + string $var_id, + CodeLocation $assignment_location, + ?string $specialization_key = null + ): self { + $id = $var_id + . '-' . $assignment_location->file_name + . ':' . $assignment_location->raw_file_start + . '-' . $assignment_location->raw_file_end; + + return new static($id, $var_id, $assignment_location, $specialization_key); + } + + /** + * @return static + */ + final public static function getForMethodReturn( + string $method_id, + string $cased_method_id, + ?CodeLocation $code_location, + ?CodeLocation $function_location = null + ): self { + $specialization_key = null; + + if ($function_location) { + $specialization_key = strtolower($function_location->file_name) . ':' . $function_location->raw_file_start; + } + + return new static( + strtolower($method_id), + $cased_method_id, + $code_location, + $specialization_key + ); + } + + public function __toString(): string + { + return $this->id; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php b/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php new file mode 100644 index 00000000..05d120b4 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php @@ -0,0 +1,33 @@ + $unescaped_taints + * @param ?array $escaped_taints + */ + public function __construct( + string $type, + int $length, + ?array $unescaped_taints = null, + ?array $escaped_taints = null + ) { + $this->type = $type; + $this->length = $length; + $this->unescaped_taints = $unescaped_taints; + $this->escaped_taints = $escaped_taints; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php b/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php new file mode 100644 index 00000000..408f13cc --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php @@ -0,0 +1,7 @@ + $a + * @param array $b + * + * @return array{0:non-empty-list>, 1: int, 2: int, 3: array} + */ + protected static function calculateTrace( + Closure $is_equal, + array $a, + array $b, + string $a_code, + string $b_code + ): array { + $n = count($a); + $m = count($b); + $max = $n + $m; + $v = [1 => 0]; + $bc = []; + $trace = []; + for ($d = 0; $d <= $max; ++$d) { + $trace[] = $v; + for ($k = -$d; $k <= $d; $k += 2) { + if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { + $x = $v[$k + 1]; + } else { + $x = $v[$k - 1] + 1; + } + + $y = $x - $k; + + $body_change = false; + + while ($x < $n && $y < $m && ($is_equal)($a[$x], $b[$y], $a_code, $b_code, $body_change)) { + $bc[$x] = $body_change; + ++$x; + ++$y; + + $body_change = false; + } + + $v[$k] = $x; + if ($x >= $n && $y >= $m) { + return [$trace, $x, $y, $bc]; + } + } + } + throw new Exception('Should not happen'); + } + + /** + * @param array> $trace + * @param array $a + * @param array $b + * @param array $bc + * + * @return list + * + * @psalm-pure + */ + protected static function extractDiff(array $trace, int $x, int $y, array $a, array $b, array $bc): array + { + $result = []; + for ($d = count($trace) - 1; $d >= 0; --$d) { + $v = $trace[$d]; + $k = $x - $y; + + if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { + $prevK = $k + 1; + } else { + $prevK = $k - 1; + } + + $prevX = $v[$prevK]; + $prevY = $prevX - $prevK; + + while ($x > $prevX && $y > $prevY) { + $result[] = new DiffElem( + $bc[$x - 1] ? DiffElem::TYPE_KEEP_SIGNATURE : DiffElem::TYPE_KEEP, + $a[$x - 1], + $b[$y - 1] + ); + --$x; + --$y; + } + + if ($d === 0) { + break; + } + + while ($x > $prevX) { + $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x - 1], null); + --$x; + } + + while ($y > $prevY) { + $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y - 1]); + --$y; + } + } + + return array_reverse($result); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php new file mode 100644 index 00000000..fab907de --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php @@ -0,0 +1,251 @@ + $a + * @param array $b + * + * @return array{ + * 0: list, + * 1: list, + * 2: list, + * 3: array, + * 4: list + * } + */ + public static function diff(string $name, array $a, array $b, string $a_code, string $b_code): array + { + $diff_map = []; + + [$trace, $x, $y, $bc] = self::calculateTrace( + function ( + PhpParser\Node\Stmt $a, + PhpParser\Node\Stmt $b, + string $a_code, + string $b_code, + bool &$body_change = false + ) use (&$diff_map): bool { + if (get_class($a) !== get_class($b)) { + return false; + } + + $a_start = (int)$a->getAttribute('startFilePos'); + $a_end = (int)$a->getAttribute('endFilePos'); + + $b_start = (int)$b->getAttribute('startFilePos'); + $b_end = (int)$b->getAttribute('endFilePos'); + + $a_comments_end = $a_start; + $b_comments_end = $b_start; + + /** @var list */ + $a_comments = $a->getComments(); + /** @var list */ + $b_comments = $b->getComments(); + + $signature_change = false; + $body_change = false; + + if ($a_comments) { + if (!$b_comments) { + $signature_change = true; + } + + $a_start = $a_comments[0]->getStartFilePos(); + } + + if ($b_comments) { + if (!$a_comments) { + $signature_change = true; + } + + $b_start = $b_comments[0]->getStartFilePos(); + } + + $a_size = $a_end - $a_start; + $b_size = $b_end - $b_start; + + if ($a_size === $b_size + && substr($a_code, $a_start, $a_size) === substr($b_code, $b_start, $b_size) + ) { + $start_diff = $b_start - $a_start; + $line_diff = $b->getLine() - $a->getLine(); + + /** @psalm-suppress MixedArrayAssignment */ + $diff_map[] = [$a_start, $a_end, $start_diff, $line_diff]; + + return true; + } + + if (!$signature_change + && substr($a_code, $a_start, $a_comments_end - $a_start) + !== substr($b_code, $b_start, $b_comments_end - $b_start) + ) { + $signature_change = true; + } + + if ($a instanceof PhpParser\Node\Stmt\ClassMethod && $b instanceof PhpParser\Node\Stmt\ClassMethod) { + if ((string) $a->name !== (string) $b->name) { + return false; + } + + if ($a->stmts) { + $first_stmt = $a->stmts[0]; + $a_stmts_start = (int) $first_stmt->getAttribute('startFilePos'); + + if ($a_stmt_comments = $first_stmt->getComments()) { + $a_stmts_start = $a_stmt_comments[0]->getStartFilePos(); + } + } else { + $a_stmts_start = $a_end; + } + + if ($b->stmts) { + $first_stmt = $b->stmts[0]; + $b_stmts_start = (int) $first_stmt->getAttribute('startFilePos'); + + if ($b_stmt_comments = $first_stmt->getComments()) { + $b_stmts_start = $b_stmt_comments[0]->getStartFilePos(); + } + } else { + $b_stmts_start = $b_end; + } + + $a_body_size = $a_end - $a_stmts_start; + $b_body_size = $b_end - $b_stmts_start; + + $body_change = $a_body_size !== $b_body_size + || substr($a_code, $a_stmts_start, $a_end - $a_stmts_start) + !== substr($b_code, $b_stmts_start, $b_end - $b_stmts_start); + + if (!$signature_change) { + $a_signature = substr($a_code, $a_start, $a_stmts_start - $a_start); + $b_signature = substr($b_code, $b_start, $b_stmts_start - $b_start); + + if ($a_signature !== $b_signature) { + $a_signature = trim($a_signature); + $b_signature = trim($b_signature); + + if (strpos($a_signature, $b_signature) === false + && strpos($b_signature, $a_signature) === false + ) { + $signature_change = true; + } + } + } + } elseif ($a instanceof PhpParser\Node\Stmt\Property && $b instanceof PhpParser\Node\Stmt\Property) { + if (count($a->props) !== 1 || count($b->props) !== 1) { + return false; + } + + if ((string) $a->props[0]->name !== (string) $b->props[0]->name || $a->flags !== $b->flags) { + return false; + } + + $body_change = substr($a_code, $a_comments_end, $a_end - $a_comments_end) + !== substr($b_code, $b_comments_end, $b_end - $b_comments_end); + } else { + $signature_change = true; + } + + if (!$signature_change && !$body_change) { + /** @psalm-suppress MixedArrayAssignment */ + $diff_map[] = [$a_start, $a_end, $b_start - $a_start, $b->getLine() - $a->getLine()]; + } + + return !$signature_change; + }, + $a, + $b, + $a_code, + $b_code + ); + + $diff = self::extractDiff($trace, $x, $y, $a, $b, $bc); + + $keep = []; + $keep_signature = []; + $add_or_delete = []; + $deletion_ranges = []; + + $name_lc = strtolower($name); + foreach ($diff as $diff_elem) { + if ($diff_elem->type === DiffElem::TYPE_KEEP) { + if ($diff_elem->old instanceof PhpParser\Node\Stmt\ClassMethod) { + $keep[] = $name_lc . '::' . strtolower((string) $diff_elem->old->name); + } elseif ($diff_elem->old instanceof PhpParser\Node\Stmt\Property) { + foreach ($diff_elem->old->props as $prop) { + $keep[] = $name_lc . '::$' . $prop->name; + } + } elseif ($diff_elem->old instanceof PhpParser\Node\Stmt\ClassConst) { + foreach ($diff_elem->old->consts as $const) { + $keep[] = $name_lc . '::' . $const->name; + } + } elseif ($diff_elem->old instanceof PhpParser\Node\Stmt\TraitUse) { + foreach ($diff_elem->old->traits as $trait) { + $keep[] = $name_lc . '&' . strtolower((string) $trait->getAttribute('resolvedName')); + } + } + } elseif ($diff_elem->type === DiffElem::TYPE_KEEP_SIGNATURE) { + if ($diff_elem->old instanceof PhpParser\Node\Stmt\ClassMethod) { + $keep_signature[] = $name_lc . '::' . strtolower((string) $diff_elem->old->name); + } elseif ($diff_elem->old instanceof PhpParser\Node\Stmt\Property) { + foreach ($diff_elem->old->props as $prop) { + $keep_signature[] = $name_lc . '::$' . $prop->name; + } + } + } elseif ($diff_elem->type === DiffElem::TYPE_REMOVE || $diff_elem->type === DiffElem::TYPE_ADD) { + /** @var PhpParser\Node */ + $affected_elem = $diff_elem->type === DiffElem::TYPE_REMOVE ? $diff_elem->old : $diff_elem->new; + if ($affected_elem instanceof PhpParser\Node\Stmt\ClassMethod) { + $add_or_delete[] = $name_lc . '::' . strtolower((string) $affected_elem->name); + } elseif ($affected_elem instanceof PhpParser\Node\Stmt\Property) { + foreach ($affected_elem->props as $prop) { + $add_or_delete[] = $name_lc . '::$' . $prop->name; + } + } elseif ($affected_elem instanceof PhpParser\Node\Stmt\ClassConst) { + foreach ($affected_elem->consts as $const) { + $add_or_delete[] = $name_lc . '::' . $const->name; + } + } elseif ($affected_elem instanceof PhpParser\Node\Stmt\TraitUse) { + foreach ($affected_elem->traits as $trait) { + $add_or_delete[] = $name_lc . '&' . strtolower((string) $trait->getAttribute('resolvedName')); + } + } + + if ($diff_elem->type === DiffElem::TYPE_REMOVE) { + if ($doc = $affected_elem->getDocComment()) { + $start = $doc->getStartFilePos(); + } else { + $start = (int)$affected_elem->getAttribute('startFilePos'); + } + + $deletion_ranges[] = [ + $start, + (int)$affected_elem->getAttribute('endFilePos') + ]; + } + } + } + + /** @var array $diff_map */ + return [$keep, $keep_signature, $add_or_delete, $diff_map, $deletion_ranges]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php new file mode 100644 index 00000000..d8ac0d29 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php @@ -0,0 +1,37 @@ +type = $type; + $this->old = $old; + $this->new = $new; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php new file mode 100644 index 00000000..c50d4466 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php @@ -0,0 +1,319 @@ + $a + * @param list $b + * + * @return array{0:non-empty-list>, 1: int, 2: int} + * + * @psalm-pure + */ + private static function calculateTrace( + array $a, + array $b + ): array { + $n = count($a); + $m = count($b); + $max = $n + $m; + $v = [1 => 0]; + $trace = []; + for ($d = 0; $d <= $max; ++$d) { + $trace[] = $v; + for ($k = -$d; $k <= $d; $k += 2) { + if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { + $x = $v[$k + 1]; + } else { + $x = $v[$k - 1] + 1; + } + + $y = $x - $k; + + while ($x < $n && $y < $m && $a[$x] === $b[$y]) { + ++$x; + ++$y; + } + + $v[$k] = $x; + if ($x >= $n && $y >= $m) { + return [$trace, $x, $y]; + } + } + } + throw new Exception('Should not happen'); + } + + /** + * @param list> $trace + * @param list $a + * @param list $b + * + * @return list + * + * @psalm-pure + */ + private static function extractDiff(array $trace, int $x, int $y, array $a, array $b): array + { + $result = []; + for ($d = count($trace) - 1; $d >= 0; --$d) { + $v = $trace[$d]; + $k = $x - $y; + + if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { + $prevK = $k + 1; + } else { + $prevK = $k - 1; + } + + $prevX = $v[$prevK]; + $prevY = $prevX - $prevK; + + while ($x > $prevX && $y > $prevY) { + $result[] = new DiffElem( + DiffElem::TYPE_KEEP, + $a[$x - 1], + $b[$y - 1] + ); + --$x; + --$y; + } + + if ($d === 0) { + break; + } + + while ($x > $prevX) { + $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x - 1], null); + --$x; + } + + while ($y > $prevY) { + $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y - 1]); + --$y; + } + } + + return array_reverse($result); + } + + /** + * @return array + * + * @psalm-pure + */ + public static function getDiff(string $a_code, string $b_code): array + { + $a = explode("\n", $a_code); + $b = explode("\n", $b_code); + [$trace, $x, $y] = self::calculateTrace($a, $b); + + $diff = self::coalesceReplacements(self::extractDiff($trace, $x, $y, $a, $b)); + + $a_offset = 0; + + $b_offset = 0; + + $last_diff_type = null; + + /** @var array{0:int, 1:int, 2:int, 3:int, 4:int, 5:string}|null */ + $last_change = null; + + $changes = []; + $i = 0; + $line_diff = 0; + + foreach ($diff as $diff_elem) { + $diff_type = $diff_elem->type; + + if ($diff_type !== $last_diff_type) { + $last_change = null; + } + + if ($diff_type === DiffElem::TYPE_REMOVE) { + /** @var string $diff_elem->old */ + $diff_text = $diff_elem->old . "\n"; + + $text_length = strlen($diff_text); + + --$line_diff; + + if ($last_change === null) { + ++$i; + $last_change = [ + $a_offset, + $a_offset + $text_length, + $b_offset, + $b_offset, + $line_diff, + '', + ]; + $changes[$i - 1] = $last_change; + } else { + $last_change[1] += $text_length; + $last_change[4] = $line_diff; + $changes[$i - 1] = $last_change; + } + + $a_offset += $text_length; + } elseif ($diff_type === DiffElem::TYPE_ADD) { + /** @var string $diff_elem->new */ + $diff_text = $diff_elem->new . "\n"; + + $text_length = strlen($diff_text); + + ++$line_diff; + + if ($last_change === null) { + ++$i; + $last_change = [ + $a_offset, + $a_offset, + $b_offset, + $b_offset + $text_length, + $line_diff, + $diff_text, + ]; + $changes[$i - 1] = $last_change; + } else { + $last_change[3] += $text_length; + $last_change[4] = $line_diff; + $last_change[5] .= $diff_text; + + $changes[$i - 1] = $last_change; + } + + $b_offset += $text_length; + } elseif ($diff_type === DiffElem::TYPE_REPLACE) { + /** @var string $diff_elem->old */ + $old_diff_text = $diff_elem->old . "\n"; + + /** @var string $diff_elem->new */ + $new_diff_text = $diff_elem->new . "\n"; + + $old_text_length = strlen($old_diff_text); + $new_text_length = strlen($new_diff_text); + + $max_same_count = min($old_text_length, $new_text_length); + + for ($j = 0; $j < $max_same_count; ++$j) { + if ($old_diff_text[$j] !== $new_diff_text[$j]) { + break; + } + + ++$a_offset; + ++$b_offset; + --$old_text_length; + --$new_text_length; + } + + $new_diff_text = substr($new_diff_text, $j); + + if ($last_change === null || $j) { + ++$i; + $last_change = [ + $a_offset, + $a_offset + $old_text_length, + $b_offset, + $b_offset + $new_text_length, + $line_diff, + $new_diff_text, + ]; + $changes[$i - 1] = $last_change; + } else { + $last_change[1] += $old_text_length; + $last_change[3] += $new_text_length; + $last_change[5] .= $new_diff_text; + $changes[$i - 1] = $last_change; + } + + $a_offset += $old_text_length; + $b_offset += $new_text_length; + } else { + /** @psalm-suppress MixedArgument */ + $same_text_length = strlen($diff_elem->new) + 1; + + $a_offset += $same_text_length; + $b_offset += $same_text_length; + } + + $last_diff_type = $diff_elem->type; + } + + return $changes; + } + + /** + * Coalesce equal-length sequences of remove+add into a replace operation. + * + * @param DiffElem[] $diff + * + * @return list + * + * @psalm-pure + */ + private static function coalesceReplacements(array $diff): array + { + $newDiff = []; + $c = count($diff); + for ($i = 0; $i < $c; ++$i) { + $diffType = $diff[$i]->type; + if ($diffType !== DiffElem::TYPE_REMOVE) { + $newDiff[] = $diff[$i]; + continue; + } + + $j = $i; + while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { + ++$j; + } + + $k = $j; + while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { + ++$k; + } + + if ($j - $i === $k - $j) { + $len = $j - $i; + for ($n = 0; $n < $len; ++$n) { + $newDiff[] = new DiffElem( + DiffElem::TYPE_REPLACE, + $diff[$i + $n]->old, + $diff[$j + $n]->new + ); + } + } else { + for (; $i < $k; ++$i) { + $newDiff[] = $diff[$i]; + } + } + + $i = $k - 1; + } + + return $newDiff; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php new file mode 100644 index 00000000..9580d7f6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php @@ -0,0 +1,172 @@ + $a + * @param list $b + * + * @return array{ + * 0: list, + * 1: list, + * 2: list, + * 3: list, + * 4: list + * } + */ + public static function diff(array $a, array $b, string $a_code, string $b_code): array + { + [$trace, $x, $y, $bc] = self::calculateTrace( + function ( + PhpParser\Node\Stmt $a, + PhpParser\Node\Stmt $b, + string $a_code, + string $b_code, + bool &$body_change = false + ): bool { + if (get_class($a) !== get_class($b)) { + return false; + } + + if (($a instanceof PhpParser\Node\Stmt\Namespace_ && $b instanceof PhpParser\Node\Stmt\Namespace_) + || ($a instanceof PhpParser\Node\Stmt\Class_ && $b instanceof PhpParser\Node\Stmt\Class_) + || ($a instanceof PhpParser\Node\Stmt\Interface_ && $b instanceof PhpParser\Node\Stmt\Interface_) + || ($a instanceof PhpParser\Node\Stmt\Trait_ && $b instanceof PhpParser\Node\Stmt\Trait_) + ) { + return (string)$a->name === (string)$b->name; + } + + if (($a instanceof PhpParser\Node\Stmt\Use_ + && $b instanceof PhpParser\Node\Stmt\Use_) + || ($a instanceof PhpParser\Node\Stmt\GroupUse + && $b instanceof PhpParser\Node\Stmt\GroupUse) + ) { + $a_start = (int)$a->getAttribute('startFilePos'); + $a_end = (int)$a->getAttribute('endFilePos'); + + $b_start = (int)$b->getAttribute('startFilePos'); + $b_end = (int)$b->getAttribute('endFilePos'); + + $a_size = $a_end - $a_start; + $b_size = $b_end - $b_start; + + if (substr($a_code, $a_start, $a_size) === substr($b_code, $b_start, $b_size)) { + return true; + } + } + + return false; + }, + $a, + $b, + $a_code, + $b_code + ); + + $diff = self::extractDiff($trace, $x, $y, $a, $b, $bc); + + $keep = []; + $keep_signature = []; + $add_or_delete = []; + $diff_map = []; + $deletion_ranges = []; + + foreach ($diff as $diff_elem) { + if ($diff_elem->type === DiffElem::TYPE_KEEP) { + if ($diff_elem->old instanceof PhpParser\Node\Stmt\Namespace_ + && $diff_elem->new instanceof PhpParser\Node\Stmt\Namespace_ + ) { + $namespace_keep = NamespaceStatementsDiffer::diff( + (string) $diff_elem->old->name, + $diff_elem->old->stmts, + $diff_elem->new->stmts, + $a_code, + $b_code + ); + + $keep = array_merge($keep, $namespace_keep[0]); + $keep_signature = array_merge($keep_signature, $namespace_keep[1]); + $add_or_delete = array_merge($add_or_delete, $namespace_keep[2]); + $diff_map = array_merge($diff_map, $namespace_keep[3]); + $deletion_ranges = array_merge($deletion_ranges, $namespace_keep[4]); + } elseif (($diff_elem->old instanceof PhpParser\Node\Stmt\Class_ + && $diff_elem->new instanceof PhpParser\Node\Stmt\Class_) + || ($diff_elem->old instanceof PhpParser\Node\Stmt\Interface_ + && $diff_elem->new instanceof PhpParser\Node\Stmt\Interface_) + || ($diff_elem->old instanceof PhpParser\Node\Stmt\Trait_ + && $diff_elem->new instanceof PhpParser\Node\Stmt\Trait_) + ) { + $class_keep = ClassStatementsDiffer::diff( + (string) $diff_elem->old->name, + $diff_elem->old->stmts, + $diff_elem->new->stmts, + $a_code, + $b_code + ); + + $keep = array_merge($keep, $class_keep[0]); + $keep_signature = array_merge($keep_signature, $class_keep[1]); + $add_or_delete = array_merge($add_or_delete, $class_keep[2]); + $diff_map = array_merge($diff_map, $class_keep[3]); + $deletion_ranges = array_merge($deletion_ranges, $class_keep[4]); + } + } elseif ($diff_elem->type === DiffElem::TYPE_REMOVE) { + if ($diff_elem->old instanceof PhpParser\Node\Stmt\Use_ + || $diff_elem->old instanceof PhpParser\Node\Stmt\GroupUse + ) { + foreach ($diff_elem->old->uses as $use) { + if ($use->alias) { + $add_or_delete[] = 'use:' . (string) $use->alias; + } else { + $name_parts = $use->name->parts; + + $add_or_delete[] = 'use:' . end($name_parts); + } + } + } elseif ($diff_elem->old instanceof PhpParser\Node + && !$diff_elem->old instanceof PhpParser\Node\Stmt\Namespace_ + ) { + if ($doc = $diff_elem->old->getDocComment()) { + $start = $doc->getStartFilePos(); + } else { + $start = (int)$diff_elem->old->getAttribute('startFilePos'); + } + + $deletion_ranges[] = [ + $start, + (int)$diff_elem->old->getAttribute('endFilePos') + ]; + } + } elseif ($diff_elem->type === DiffElem::TYPE_ADD) { + if ($diff_elem->new instanceof PhpParser\Node\Stmt\Use_ + || $diff_elem->new instanceof PhpParser\Node\Stmt\GroupUse + ) { + foreach ($diff_elem->new->uses as $use) { + if ($use->alias) { + $add_or_delete[] = 'use:' . (string) $use->alias; + } else { + $name_parts = $use->name->parts; + + $add_or_delete[] = 'use:' . end($name_parts); + } + } + } + } + } + + return [$keep, $keep_signature, $add_or_delete, $diff_map, $deletion_ranges]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php new file mode 100644 index 00000000..5ac1e8a9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php @@ -0,0 +1,144 @@ + $a + * @param array $b + * + * @return array{ + * 0: list, + * 1: list, + * 2: list, + * 3: list, + * 4: list + * } + */ + public static function diff(string $name, array $a, array $b, string $a_code, string $b_code): array + { + [$trace, $x, $y, $bc] = self::calculateTrace( + function ( + PhpParser\Node\Stmt $a, + PhpParser\Node\Stmt $b, + string $a_code, + string $b_code, + bool &$body_change = false + ): bool { + if (get_class($a) !== get_class($b)) { + return false; + } + + if (($a instanceof PhpParser\Node\Stmt\Class_ && $b instanceof PhpParser\Node\Stmt\Class_) + || ($a instanceof PhpParser\Node\Stmt\Interface_ && $b instanceof PhpParser\Node\Stmt\Interface_) + || ($a instanceof PhpParser\Node\Stmt\Trait_ && $b instanceof PhpParser\Node\Stmt\Trait_) + ) { + // @todo add check for comments comparison + + return (string)$a->name === (string)$b->name; + } + + if (($a instanceof PhpParser\Node\Stmt\Use_ + && $b instanceof PhpParser\Node\Stmt\Use_) + || ($a instanceof PhpParser\Node\Stmt\GroupUse + && $b instanceof PhpParser\Node\Stmt\GroupUse) + ) { + $a_start = (int)$a->getAttribute('startFilePos'); + $a_end = (int)$a->getAttribute('endFilePos'); + + $b_start = (int)$b->getAttribute('startFilePos'); + $b_end = (int)$b->getAttribute('endFilePos'); + + $a_size = $a_end - $a_start; + $b_size = $b_end - $b_start; + + if (substr($a_code, $a_start, $a_size) === substr($b_code, $b_start, $b_size)) { + return true; + } + } + + return false; + }, + $a, + $b, + $a_code, + $b_code + ); + + $diff = self::extractDiff($trace, $x, $y, $a, $b, $bc); + + $keep = []; + $keep_signature = []; + $add_or_delete = []; + $diff_map = []; + $deletion_ranges = []; + + foreach ($diff as $diff_elem) { + if ($diff_elem->type === DiffElem::TYPE_KEEP) { + if (($diff_elem->old instanceof PhpParser\Node\Stmt\Class_ + && $diff_elem->new instanceof PhpParser\Node\Stmt\Class_) + || ($diff_elem->old instanceof PhpParser\Node\Stmt\Interface_ + && $diff_elem->new instanceof PhpParser\Node\Stmt\Interface_) + || ($diff_elem->old instanceof PhpParser\Node\Stmt\Trait_ + && $diff_elem->new instanceof PhpParser\Node\Stmt\Trait_) + ) { + $class_keep = ClassStatementsDiffer::diff( + ($name ? $name . '\\' : '') . $diff_elem->old->name, + $diff_elem->old->stmts, + $diff_elem->new->stmts, + $a_code, + $b_code + ); + + $keep = array_merge($keep, $class_keep[0]); + $keep_signature = array_merge($keep_signature, $class_keep[1]); + $add_or_delete = array_merge($add_or_delete, $class_keep[2]); + $diff_map = array_merge($diff_map, $class_keep[3]); + $deletion_ranges = array_merge($deletion_ranges, $class_keep[4]); + } + } elseif ($diff_elem->type === DiffElem::TYPE_REMOVE) { + if ($diff_elem->old instanceof PhpParser\Node\Stmt\Use_ + || $diff_elem->old instanceof PhpParser\Node\Stmt\GroupUse + ) { + foreach ($diff_elem->old->uses as $use) { + if ($use->alias) { + $add_or_delete[] = 'use:' . (string) $use->alias; + } else { + $name_parts = $use->name->parts; + + $add_or_delete[] = 'use:' . end($name_parts); + } + } + } + } elseif ($diff_elem->type === DiffElem::TYPE_ADD) { + if ($diff_elem->new instanceof PhpParser\Node\Stmt\Use_ + || $diff_elem->new instanceof PhpParser\Node\Stmt\GroupUse + ) { + foreach ($diff_elem->new->uses as $use) { + if ($use->alias) { + $add_or_delete[] = 'use:' . (string) $use->alias; + } else { + $name_parts = $use->name->parts; + + $add_or_delete[] = 'use:' . end($name_parts); + } + } + } + } + } + + return [$keep, $keep_signature, $add_or_delete, $diff_map, $deletion_ranges]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php b/vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php new file mode 100644 index 00000000..802f4727 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php @@ -0,0 +1,90 @@ +> + */ + private $after_method_checks = []; + /** @var list> */ + private $legacy_after_method_checks = []; + + /** + * Static methods to be called after project function checks have completed + * + * Called after function calls to functions defined in the project. + * + * Allows influencing the return type and adding of modifications. + * + * @var list> + */ + public $after_function_checks = []; + /** @var list> */ + public $legacy_after_function_checks = []; + + /** + * Static methods to be called after every function call + * + * Called after each function call, including php internal functions. + * + * Cannot change the call or influence its return type + * + * @var list> + */ + public $after_every_function_checks = []; + /** @var list> */ + public $legacy_after_every_function_checks = []; + + /** + * Static methods to be called after expression checks have completed + * + * @var list> + */ + public $after_expression_checks = []; + /** @var list> */ + public $legacy_after_expression_checks = []; + + /** + * Static methods to be called after statement checks have completed + * + * @var list> + */ + public $after_statement_checks = []; + /** @var list> */ + public $legacy_after_statement_checks = []; + + /** + * Static methods to be called after method checks have completed + * + * @var list> + */ + public $string_interpreters = []; + /** @var list> */ + public $legacy_string_interpreters = []; + + /** + * Static methods to be called after classlike exists checks have completed + * + * @var list> + */ + public $after_classlike_exists_checks = []; + /** @var list> */ + public $legacy_after_classlike_exists_checks = []; + + /** + * Static methods to be called after classlike checks have completed + * + * @var list> + */ + public $after_classlike_checks = []; + /** @var list> */ + public $legacy_after_classlike_checks = []; + + /** + * Static methods to be called after classlikes have been scanned + * + * @var list> + */ + private $after_visit_classlikes = []; + /** @var list> */ + private $legacy_after_visit_classlikes = []; + + /** + * Static methods to be called after codebase has been populated + * + * @var list> + */ + public $after_codebase_populated = []; + /** @var list> */ + public $legacy_after_codebase_populated = []; + + /** + * Static methods to be called after codebase has been populated + * + * @var list> + */ + public $after_analysis = []; + /** @var list> */ + public $legacy_after_analysis = []; + + /** + * Static methods to be called after a file has been analyzed + * + * @var list> + */ + public $after_file_checks = []; + /** @var list> */ + public $legacy_after_file_checks = []; + + /** + * Static methods to be called before a file is analyzed + * + * @var list> + */ + public $before_file_checks = []; + /** @var list> */ + public $legacy_before_file_checks = []; + + /** + * Static methods to be called after functionlike checks have completed + * + * @var list> + */ + public $after_functionlike_checks = []; + /** @var list> */ + public $legacy_after_functionlike_checks = []; + + /** + * Static methods to be called to see if taints should be added + * + * @var list> + */ + public $add_taints_checks = []; + + /** + * Static methods to be called to see if taints should be removed + * + * @var list> + */ + public $remove_taints_checks = []; + + /** + * @param class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyAfterMethodCallAnalysisInterface::class)) { + $this->legacy_after_method_checks[] = $class; + } elseif (is_subclass_of($class, AfterMethodCallAnalysisInterface::class)) { + $this->after_method_checks[] = $class; + } + + if (is_subclass_of($class, LegacyAfterFunctionCallAnalysisInterface::class)) { + $this->legacy_after_function_checks[] = $class; + } elseif (is_subclass_of($class, AfterFunctionCallAnalysisInterface::class)) { + $this->after_function_checks[] = $class; + } + + if (is_subclass_of($class, LegacyAfterEveryFunctionCallAnalysisInterface::class)) { + $this->legacy_after_every_function_checks[] = $class; + } elseif (is_subclass_of($class, AfterEveryFunctionCallAnalysisInterface::class)) { + $this->after_every_function_checks[] = $class; + } + + if (is_subclass_of($class, LegacyAfterExpressionAnalysisInterface::class)) { + $this->legacy_after_expression_checks[] = $class; + } elseif (is_subclass_of($class, AfterExpressionAnalysisInterface::class)) { + $this->after_expression_checks[] = $class; + } + + if (is_subclass_of($class, LegacyAfterStatementAnalysisInterface::class)) { + $this->legacy_after_statement_checks[] = $class; + } elseif (is_subclass_of($class, AfterStatementAnalysisInterface::class)) { + $this->after_statement_checks[] = $class; + } + + if (is_subclass_of($class, LegacyStringInterpreterInterface::class)) { + $this->legacy_string_interpreters[] = $class; + } elseif (is_subclass_of($class, StringInterpreterInterface::class)) { + $this->string_interpreters[] = $class; + } + + if (is_subclass_of($class, LegacyAfterClassLikeExistenceCheckInterface::class)) { + $this->legacy_after_classlike_exists_checks[] = $class; + } elseif (is_subclass_of($class, AfterClassLikeExistenceCheckInterface::class)) { + $this->after_classlike_exists_checks[] = $class; + } + + if (is_subclass_of($class, LegacyAfterClassLikeAnalysisInterface::class)) { + $this->legacy_after_classlike_checks[] = $class; + } elseif (is_subclass_of($class, AfterClassLikeAnalysisInterface::class)) { + $this->after_classlike_checks[] = $class; + } + + if (is_subclass_of($class, LegacyAfterClassLikeVisitInterface::class)) { + $this->legacy_after_visit_classlikes[] = $class; + } elseif (is_subclass_of($class, AfterClassLikeVisitInterface::class)) { + $this->after_visit_classlikes[] = $class; + } + + if (is_subclass_of($class, LegacyAfterCodebasePopulatedInterface::class)) { + $this->legacy_after_codebase_populated[] = $class; + } elseif (is_subclass_of($class, AfterCodebasePopulatedInterface::class)) { + $this->after_codebase_populated[] = $class; + } + + if (is_subclass_of($class, LegacyAfterAnalysisInterface::class)) { + $this->legacy_after_analysis[] = $class; + } elseif (is_subclass_of($class, AfterAnalysisInterface::class)) { + $this->after_analysis[] = $class; + } + + if (is_subclass_of($class, LegacyAfterFileAnalysisInterface::class)) { + $this->legacy_after_file_checks[] = $class; + } elseif (is_subclass_of($class, AfterFileAnalysisInterface::class)) { + $this->after_file_checks[] = $class; + } + + if (is_subclass_of($class, LegacyBeforeFileAnalysisInterface::class)) { + $this->legacy_before_file_checks[] = $class; + } elseif (is_subclass_of($class, BeforeFileAnalysisInterface::class)) { + $this->before_file_checks[] = $class; + } + + if (is_subclass_of($class, LegacyAfterFunctionLikeAnalysisInterface::class)) { + $this->legacy_after_functionlike_checks[] = $class; + } elseif (is_subclass_of($class, AfterFunctionLikeAnalysisInterface::class)) { + $this->after_functionlike_checks[] = $class; + } + + if (is_subclass_of($class, AddTaintsInterface::class)) { + $this->add_taints_checks[] = $class; + } + + if (is_subclass_of($class, RemoveTaintsInterface::class)) { + $this->remove_taints_checks[] = $class; + } + } + + public function hasAfterMethodCallAnalysisHandlers(): bool + { + return count($this->after_method_checks) || count($this->legacy_after_method_checks); + } + + public function dispatchAfterMethodCallAnalysis(AfterMethodCallAnalysisEvent $event): void + { + foreach ($this->after_method_checks as $handler) { + $handler::afterMethodCallAnalysis($event); + } + + foreach ($this->legacy_after_method_checks as $handler) { + $file_replacements = $event->getFileReplacements(); + $return_type_candidate = $event->getReturnTypeCandidate(); + $handler::afterMethodCallAnalysis( + $event->getExpr(), + $event->getMethodId(), + $event->getAppearingMethodId(), + $event->getDeclaringMethodId(), + $event->getContext(), + $event->getStatementsSource(), + $event->getCodebase(), + $file_replacements, + $return_type_candidate + ); + $event->setFileReplacements($file_replacements); + $event->setReturnTypeCandidate($return_type_candidate); + } + } + + public function dispatchAfterFunctionCallAnalysis(AfterFunctionCallAnalysisEvent $event): void + { + foreach ($this->after_function_checks as $handler) { + $handler::afterFunctionCallAnalysis($event); + } + + foreach ($this->legacy_after_function_checks as $handler) { + $file_replacements = $event->getFileReplacements(); + $handler::afterFunctionCallAnalysis( + $event->getExpr(), + $event->getFunctionId(), + $event->getContext(), + $event->getStatementsSource(), + $event->getCodebase(), + $event->getReturnTypeCandidate(), + $file_replacements + ); + $event->setFileReplacements($file_replacements); + } + } + + public function dispatchAfterEveryFunctionCallAnalysis(AfterEveryFunctionCallAnalysisEvent $event): void + { + foreach ($this->after_every_function_checks as $handler) { + $handler::afterEveryFunctionCallAnalysis($event); + } + + foreach ($this->legacy_after_every_function_checks as $handler) { + $handler::afterEveryFunctionCallAnalysis( + $event->getExpr(), + $event->getFunctionId(), + $event->getContext(), + $event->getStatementsSource(), + $event->getCodebase() + ); + } + } + + public function dispatchAfterExpressionAnalysis(AfterExpressionAnalysisEvent $event): ?bool + { + foreach ($this->after_expression_checks as $handler) { + if ($handler::afterExpressionAnalysis($event) === false) { + return false; + } + } + + foreach ($this->legacy_after_expression_checks as $handler) { + $file_replacements = $event->getFileReplacements(); + if ($handler::afterExpressionAnalysis( + $event->getExpr(), + $event->getContext(), + $event->getStatementsSource(), + $event->getCodebase(), + $file_replacements + ) === false) { + return false; + } + $event->setFileReplacements($file_replacements); + } + + return null; + } + + public function dispatchAfterStatementAnalysis(AfterStatementAnalysisEvent $event): ?bool + { + foreach ($this->after_statement_checks as $handler) { + if ($handler::afterStatementAnalysis($event) === false) { + return false; + } + } + + foreach ($this->legacy_after_statement_checks as $handler) { + $file_replacements = $event->getFileReplacements(); + if ($handler::afterStatementAnalysis( + $event->getStmt(), + $event->getContext(), + $event->getStatementsSource(), + $event->getCodebase(), + $file_replacements + ) === false) { + return false; + } + $event->setFileReplacements($file_replacements); + } + + return null; + } + + public function dispatchStringInterpreter(StringInterpreterEvent $event): ?TLiteralString + { + foreach ($this->string_interpreters as $handler) { + if ($type = $handler::getTypeFromValue($event)) { + return $type; + } + } + + foreach ($this->legacy_string_interpreters as $handler) { + if ($type = $handler::getTypeFromValue($event->getValue())) { + return $type; + } + } + + return null; + } + + public function dispatchAfterClassLikeExistenceCheck(AfterClassLikeExistenceCheckEvent $event): void + { + foreach ($this->after_classlike_exists_checks as $handler) { + $handler::afterClassLikeExistenceCheck($event); + } + + foreach ($this->legacy_after_classlike_exists_checks as $handler) { + $file_replacements = $event->getFileReplacements(); + $handler::afterClassLikeExistenceCheck( + $event->getFqClassName(), + $event->getCodeLocation(), + $event->getStatementsSource(), + $event->getCodebase(), + $file_replacements + ); + $event->setFileReplacements($file_replacements); + } + } + + public function dispatchAfterClassLikeAnalysis(AfterClassLikeAnalysisEvent $event): ?bool + { + foreach ($this->after_classlike_checks as $handler) { + if ($handler::afterStatementAnalysis($event) === false) { + return false; + } + } + + foreach ($this->legacy_after_classlike_checks as $handler) { + $file_replacements = $event->getFileReplacements(); + if ($handler::afterStatementAnalysis( + $event->getStmt(), + $event->getClasslikeStorage(), + $event->getStatementsSource(), + $event->getCodebase(), + $file_replacements + ) === false) { + return false; + } + $event->setFileReplacements($file_replacements); + } + + return null; + } + + public function hasAfterClassLikeVisitHandlers(): bool + { + return count($this->after_visit_classlikes) || count($this->legacy_after_visit_classlikes); + } + + public function dispatchAfterClassLikeVisit(AfterClassLikeVisitEvent $event): void + { + foreach ($this->after_visit_classlikes as $handler) { + $handler::afterClassLikeVisit($event); + } + + foreach ($this->legacy_after_visit_classlikes as $handler) { + $file_replacements = $event->getFileReplacements(); + $handler::afterClassLikeVisit( + $event->getStmt(), + $event->getStorage(), + $event->getStatementsSource(), + $event->getCodebase(), + $file_replacements + ); + $event->setFileReplacements($file_replacements); + } + } + + public function dispatchAfterCodebasePopulated(AfterCodebasePopulatedEvent $event): void + { + foreach ($this->after_codebase_populated as $handler) { + $handler::afterCodebasePopulated($event); + } + + foreach ($this->legacy_after_codebase_populated as $handler) { + $handler::afterCodebasePopulated( + $event->getCodebase() + ); + } + } + + public function dispatchAfterAnalysis(AfterAnalysisEvent $event): void + { + foreach ($this->after_analysis as $handler) { + $handler::afterAnalysis($event); + } + + foreach ($this->legacy_after_analysis as $handler) { + /** @psalm-suppress MixedArgumentTypeCoercion due to Psalm bug */ + $handler::afterAnalysis( + $event->getCodebase(), + $event->getIssues(), + $event->getBuildInfo(), + $event->getSourceControlInfo() + ); + } + } + + public function dispatchAfterFileAnalysis(AfterFileAnalysisEvent $event): void + { + foreach ($this->after_file_checks as $handler) { + $handler::afterAnalyzeFile($event); + } + + foreach ($this->legacy_after_file_checks as $handler) { + $handler::afterAnalyzeFile( + $event->getStatementsSource(), + $event->getFileContext(), + $event->getFileStorage(), + $event->getCodebase() + ); + } + } + + public function dispatchBeforeFileAnalysis(BeforeFileAnalysisEvent $event): void + { + foreach ($this->before_file_checks as $handler) { + $handler::beforeAnalyzeFile($event); + } + + foreach ($this->legacy_before_file_checks as $handler) { + $handler::beforeAnalyzeFile( + $event->getStatementsSource(), + $event->getFileContext(), + $event->getFileStorage(), + $event->getCodebase() + ); + } + } + + public function dispatchAfterFunctionLikeAnalysis(AfterFunctionLikeAnalysisEvent $event): ?bool + { + foreach ($this->after_functionlike_checks as $handler) { + if ($handler::afterStatementAnalysis($event) === false) { + return false; + } + } + + foreach ($this->legacy_after_functionlike_checks as $handler) { + $file_replacements = $event->getFileReplacements(); + if ($handler::afterStatementAnalysis( + $event->getStmt(), + $event->getFunctionlikeStorage(), + $event->getStatementsSource(), + $event->getCodebase(), + $file_replacements + ) === false) { + return false; + } + $event->setFileReplacements($file_replacements); + } + + return null; + } + + /** + * @return list + */ + public function dispatchAddTaints(AddRemoveTaintsEvent $event): array + { + $added_taints = []; + + foreach ($this->add_taints_checks as $handler) { + $added_taints = array_merge($added_taints, $handler::addTaints($event)); + } + + return $added_taints; + } + + /** + * @return list + */ + public function dispatchRemoveTaints(AddRemoveTaintsEvent $event): array + { + $removed_taints = []; + + foreach ($this->remove_taints_checks as $handler) { + $removed_taints = array_merge($removed_taints, $handler::removeTaints($event)); + } + + return $removed_taints; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php new file mode 100644 index 00000000..858e7f4b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php @@ -0,0 +1,321 @@ + + */ +class BuildInfoCollector +{ + /** + * Environment variables. + * + * Overwritten through collection process. + * + * @var array + */ + protected $env; + + /** + * Read environment variables. + * + * @var array + */ + protected $readEnv = []; + + public function __construct(array $env) + { + $this->env = $env; + } + + // API + + /** + * Collect environment variables. + */ + public function collect(): array + { + $this->readEnv = []; + + $this + ->fillTravisCi() + ->fillCircleCi() + ->fillAppVeyor() + ->fillJenkins() + ->fillScrutinizer() + ->fillGithubActions(); + + return $this->readEnv; + } + + // internal method + + /** + * Fill Travis CI environment variables. + * + * "TRAVIS", "TRAVIS_JOB_ID" must be set. + * + * @return $this + * + * @psalm-suppress PossiblyUndefinedStringArrayOffset + */ + protected function fillTravisCi(): self + { + if (isset($this->env['TRAVIS']) && $this->env['TRAVIS'] && isset($this->env['TRAVIS_JOB_ID'])) { + $this->readEnv['CI_JOB_ID'] = $this->env['TRAVIS_JOB_ID']; + $this->env['CI_NAME'] = 'travis-ci'; + + // backup + $this->readEnv['TRAVIS'] = $this->env['TRAVIS']; + $this->readEnv['TRAVIS_JOB_ID'] = $this->env['TRAVIS_JOB_ID']; + $this->readEnv['CI_NAME'] = $this->env['CI_NAME']; + $this->readEnv['TRAVIS_TAG'] = $this->env['TRAVIS_TAG'] ?? ''; + + $repo_slug = (string) $this->env['TRAVIS_REPO_SLUG']; + + if ($repo_slug) { + $slug_parts = explode('/', $repo_slug); + $this->readEnv['CI_REPO_OWNER'] = $slug_parts[0]; + $this->readEnv['CI_REPO_NAME'] = $slug_parts[1]; + } + + $pr_slug = (string) ($this->env['TRAVIS_PULL_REQUEST_SLUG'] ?? ''); + + if ($pr_slug) { + $slug_parts = explode('/', $pr_slug); + + $this->readEnv['CI_PR_REPO_OWNER'] = $slug_parts[0]; + $this->readEnv['CI_PR_REPO_NAME'] = $slug_parts[1]; + } + + $this->readEnv['CI_PR_NUMBER'] = $this->env['TRAVIS_PULL_REQUEST']; + $this->readEnv['CI_BRANCH'] = $this->env['TRAVIS_BRANCH']; + } + + return $this; + } + + /** + * Fill CircleCI environment variables. + * + * "CIRCLECI", "CIRCLE_BUILD_NUM" must be set. + * + * @return $this + */ + protected function fillCircleCi(): self + { + if (isset($this->env['CIRCLECI']) && $this->env['CIRCLECI'] && isset($this->env['CIRCLE_BUILD_NUM'])) { + $this->env['CI_BUILD_NUMBER'] = $this->env['CIRCLE_BUILD_NUM']; + $this->env['CI_NAME'] = 'circleci'; + + // backup + $this->readEnv['CIRCLECI'] = $this->env['CIRCLECI']; + $this->readEnv['CIRCLE_BUILD_NUM'] = $this->env['CIRCLE_BUILD_NUM']; + $this->readEnv['CI_NAME'] = $this->env['CI_NAME']; + + $this->readEnv['CI_PR_REPO_OWNER'] = $this->env['CIRCLE_PR_USERNAME'] ?? null; + $this->readEnv['CI_PR_REPO_NAME'] = $this->env['CIRCLE_PR_REPONAME'] ?? null; + + $this->readEnv['CI_REPO_OWNER'] = $this->env['CIRCLE_PROJECT_USERNAME'] ?? null; + $this->readEnv['CI_REPO_NAME'] = $this->env['CIRCLE_PROJECT_REPONAME'] ?? null; + + $this->readEnv['CI_PR_NUMBER'] = $this->env['CIRCLE_PR_NUMBER'] ?? null; + + $this->readEnv['CI_BRANCH'] = $this->env['CIRCLE_BRANCH'] ?? null; + } + + return $this; + } + + /** + * Fill AppVeyor environment variables. + * + * "APPVEYOR", "APPVEYOR_BUILD_NUMBER" must be set. + * + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * + * @return $this + */ + protected function fillAppVeyor(): self + { + if (isset($this->env['APPVEYOR']) && $this->env['APPVEYOR'] && isset($this->env['APPVEYOR_BUILD_NUMBER'])) { + $this->readEnv['CI_BUILD_NUMBER'] = $this->env['APPVEYOR_BUILD_NUMBER']; + $this->readEnv['CI_JOB_ID'] = $this->env['APPVEYOR_JOB_NUMBER']; + $this->readEnv['CI_PR_NUMBER'] = $this->env['APPVEYOR_PULL_REQUEST_NUMBER'] ?? ''; + $this->env['CI_NAME'] = 'AppVeyor'; + + // backup + $this->readEnv['APPVEYOR'] = $this->env['APPVEYOR']; + $this->readEnv['APPVEYOR_BUILD_NUMBER'] = $this->env['APPVEYOR_BUILD_NUMBER']; + $this->readEnv['APPVEYOR_JOB_NUMBER'] = $this->env['APPVEYOR_JOB_NUMBER']; + $this->readEnv['APPVEYOR_REPO_BRANCH'] = $this->env['APPVEYOR_REPO_BRANCH']; + $this->readEnv['CI_NAME'] = $this->env['CI_NAME']; + + $repo_slug = (string) ($this->env['APPVEYOR_REPO_NAME'] ?? ''); + + if ($repo_slug) { + $slug_parts = explode('/', $repo_slug); + + $this->readEnv['CI_REPO_OWNER'] = $slug_parts[0]; + $this->readEnv['CI_REPO_NAME'] = $slug_parts[1]; + } + + $pr_slug = (string) ($this->env['APPVEYOR_PULL_REQUEST_HEAD_REPO_NAME'] ?? ''); + + if ($pr_slug) { + $slug_parts = explode('/', $pr_slug); + + $this->readEnv['CI_PR_REPO_OWNER'] = $slug_parts[0]; + $this->readEnv['CI_PR_REPO_NAME'] = $slug_parts[1]; + } + + $this->readEnv['CI_BRANCH'] = $this->env['APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH'] + ?? $this->env['APPVEYOR_REPO_BRANCH']; + } + + return $this; + } + + /** + * Fill Jenkins environment variables. + * + * "JENKINS_URL", "BUILD_NUMBER" must be set. + * + * @return $this + */ + protected function fillJenkins(): self + { + if (isset($this->env['JENKINS_URL']) && isset($this->env['BUILD_NUMBER'])) { + $this->readEnv['CI_BUILD_NUMBER'] = $this->env['BUILD_NUMBER']; + $this->readEnv['CI_BUILD_URL'] = $this->env['JENKINS_URL']; + $this->env['CI_NAME'] = 'jenkins'; + + // backup + $this->readEnv['BUILD_NUMBER'] = $this->env['BUILD_NUMBER']; + $this->readEnv['JENKINS_URL'] = $this->env['JENKINS_URL']; + $this->readEnv['CI_NAME'] = $this->env['CI_NAME']; + } + + return $this; + } + + /** + * Fill Scrutinizer environment variables. + * + * "JENKINS_URL", "BUILD_NUMBER" must be set. + * + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * + * @return $this + */ + protected function fillScrutinizer(): self + { + if (isset($this->env['SCRUTINIZER']) && $this->env['SCRUTINIZER']) { + $this->readEnv['CI_JOB_ID'] = $this->env['SCRUTINIZER_INSPECTION_UUID']; + $this->readEnv['CI_BRANCH'] = $this->env['SCRUTINIZER_BRANCH']; + $this->readEnv['CI_PR_NUMBER'] = $this->env['SCRUTINIZER_PR_NUMBER'] ?? ''; + + // backup + $this->readEnv['CI_NAME'] = 'Scrutinizer'; + + $repo_slug = (string) ($this->env['SCRUTINIZER_PROJECT'] ?? ''); + + if ($repo_slug) { + $slug_parts = explode('/', $repo_slug); + + if ($this->readEnv['CI_PR_NUMBER']) { + $this->readEnv['CI_PR_REPO_OWNER'] = $slug_parts[1]; + $this->readEnv['CI_PR_REPO_NAME'] = $slug_parts[2]; + } else { + $this->readEnv['CI_REPO_OWNER'] = $slug_parts[1]; + $this->readEnv['CI_REPO_NAME'] = $slug_parts[2]; + } + } + } + + return $this; + } + + /** + * Fill Github Actions environment variables. + * + * @return $this + * @psalm-suppress PossiblyUndefinedStringArrayOffset + */ + protected function fillGithubActions(): BuildInfoCollector + { + if (isset($this->env['GITHUB_ACTIONS'])) { + $this->env['CI_NAME'] = 'github-actions'; + $this->env['CI_JOB_ID'] = $this->env['GITHUB_ACTIONS']; + + $githubRef = (string) $this->env['GITHUB_REF']; + if (strpos($githubRef, 'refs/heads/') !== false) { + $githubRef = str_replace('refs/heads/', '', $githubRef); + } elseif (strpos($githubRef, 'refs/tags/') !== false) { + $githubRef = str_replace('refs/tags/', '', $githubRef); + } + + $this->env['CI_BRANCH'] = $githubRef; + + $this->readEnv['GITHUB_ACTIONS'] = $this->env['GITHUB_ACTIONS']; + $this->readEnv['GITHUB_REF'] = $this->env['GITHUB_REF']; + $this->readEnv['CI_NAME'] = $this->env['CI_NAME']; + $this->readEnv['CI_BRANCH'] = $this->env['CI_BRANCH']; + + $slug_parts = explode('/', (string) $this->env['GITHUB_REPOSITORY']); + + $this->readEnv['CI_REPO_OWNER'] = $slug_parts[0]; + $this->readEnv['CI_REPO_NAME'] = $slug_parts[1]; + + if (isset($this->env['GITHUB_EVENT_PATH'])) { + $event_json = file_get_contents((string) $this->env['GITHUB_EVENT_PATH']); + /** @var array */ + $event_data = json_decode($event_json, true); + + if (isset($event_data['head_commit'])) { + /** + * @var array{ + * id: string, + * author: array{name: string, email: string}, + * committer: array{name: string, email: string}, + * message: string, + * timestamp: string + * } + */ + $head_commit_data = $event_data['head_commit']; + $gitinfo = new GitInfo( + $githubRef, + (new CommitInfo()) + ->setId($head_commit_data['id']) + ->setAuthorName($head_commit_data['author']['name']) + ->setAuthorEmail($head_commit_data['author']['email']) + ->setCommitterName($head_commit_data['committer']['name']) + ->setCommitterEmail($head_commit_data['committer']['email']) + ->setMessage($head_commit_data['message']) + ->setDate(strtotime($head_commit_data['timestamp'])), + [] + ); + + $this->readEnv['git'] = $gitinfo->toArray(); + } + + if ($this->env['GITHUB_EVENT_PATH'] === 'pull_request') { + $this->readEnv['CI_PR_NUMBER'] = $event_data['number']; + } + } + } + return $this; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php new file mode 100644 index 00000000..e7821285 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php @@ -0,0 +1,142 @@ + + */ +class GitInfoCollector +{ + /** + * Git command. + * + * @var SystemCommandExecutor + */ + protected $executor; + + /** + * Constructor. + */ + public function __construct() + { + $this->executor = new SystemCommandExecutor(); + } + + // API + + /** + * Collect git repository info. + */ + public function collect(): GitInfo + { + $branch = $this->collectBranch(); + $commit = $this->collectCommit(); + $remotes = $this->collectRemotes(); + + return new GitInfo($branch, $commit, $remotes); + } + + /** + * Collect branch name. + * + * @throws RuntimeException + */ + protected function collectBranch(): string + { + $branchesResult = $this->executor->execute('git branch'); + + foreach ($branchesResult as $result) { + if (strpos($result, '* ') === 0) { + $exploded = explode('* ', $result, 2); + + return $exploded[1]; + } + } + + throw new RuntimeException(); + } + + /** + * Collect commit info. + * + * @throws RuntimeException + */ + protected function collectCommit(): CommitInfo + { + $commitResult = $this->executor->execute('git log -1 --pretty=format:%H%n%aN%n%ae%n%cN%n%ce%n%s%n%at'); + + if (count($commitResult) !== 7 || array_keys($commitResult) !== range(0, 6)) { + throw new RuntimeException(); + } + + $commit = new CommitInfo(); + + return $commit + ->setId(trim($commitResult[0])) + ->setAuthorName(trim($commitResult[1])) + ->setAuthorEmail(trim($commitResult[2])) + ->setCommitterName(trim($commitResult[3])) + ->setCommitterEmail(trim($commitResult[4])) + ->setMessage($commitResult[5]) + ->setDate((int) $commitResult[6]); + } + + /** + * Collect remotes info. + * + * @throws RuntimeException + * + * @return list + */ + protected function collectRemotes(): array + { + $remotesResult = $this->executor->execute('git remote -v'); + + if (count($remotesResult) === 0) { + throw new RuntimeException(); + } + + // parse command result + $results = []; + + foreach ($remotesResult as $result) { + if (strpos($result, ' ') !== false) { + [$remote] = explode(' ', $result, 2); + + $results[] = $remote; + } + } + + // filter + $results = array_unique($results); + + // create Remote instances + $remotes = []; + + foreach ($results as $result) { + if (strpos($result, "\t") !== false) { + [$name, $url] = explode("\t", $result, 2); + + $remote = new RemoteInfo(); + $remotes[] = $remote->setName(trim($name))->setUrl(trim($url)); + } + } + + return $remotes; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php b/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php new file mode 100644 index 00000000..97113ea1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php @@ -0,0 +1,42 @@ + + * @author Dariusz Rumiński + * + * @internal + */ +final class SystemCommandExecutor +{ + /** + * Execute command. + * + * + * @throws RuntimeException + * + * @return string[] + */ + public function execute(string $command): array + { + if (!function_exists('exec')) { + throw new RuntimeException(sprintf('exec does not exist, failed to execute command: %s', $command)); + } + + exec($command, $result, $returnValue); + + if ($returnValue === 0) { + /** @var string[] */ + return $result; + } + + throw new RuntimeException(sprintf('Failed to execute command: %s', $command), $returnValue); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php new file mode 100644 index 00000000..f953ad9c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php @@ -0,0 +1,141 @@ +> + */ + private static $manipulators = []; + + /** @var Class_ */ + private $stmt; + + /** @var int */ + private $docblock_start; + + /** @var int */ + private $docblock_end; + + /** @var bool */ + private $immutable = false; + + /** @var string */ + private $indentation; + + public static function getForClass( + ProjectAnalyzer $project_analyzer, + string $file_path, + Class_ $stmt + ): self { + if (isset(self::$manipulators[$file_path][$stmt->getLine()])) { + return self::$manipulators[$file_path][$stmt->getLine()]; + } + + $manipulator + = self::$manipulators[$file_path][$stmt->getLine()] + = new self($project_analyzer, $stmt, $file_path); + + return $manipulator; + } + + private function __construct( + ProjectAnalyzer $project_analyzer, + Class_ $stmt, + string $file_path + ) { + $this->stmt = $stmt; + $docblock = $stmt->getDocComment(); + $this->docblock_start = $docblock ? $docblock->getStartFilePos() : (int)$stmt->getAttribute('startFilePos'); + $this->docblock_end = (int)$stmt->getAttribute('startFilePos'); + + $codebase = $project_analyzer->getCodebase(); + + $file_contents = $codebase->getFileContents($file_path); + + $preceding_newline_pos = (int) strrpos($file_contents, "\n", $this->docblock_end - strlen($file_contents)); + + $first_line = substr($file_contents, $preceding_newline_pos + 1, $this->docblock_end - $preceding_newline_pos); + + $this->indentation = str_replace(ltrim($first_line), '', $first_line); + } + + public function makeImmutable(): void + { + $this->immutable = true; + } + + /** + * Gets a new docblock given the existing docblock, if one exists, and the updated return types + * and/or parameters + * + */ + private function getDocblock(): string + { + $docblock = $this->stmt->getDocComment(); + + if ($docblock) { + $parsed_docblock = DocComment::parsePreservingLength($docblock); + } else { + $parsed_docblock = new ParsedDocblock('', []); + } + + $modified_docblock = false; + + if ($this->immutable) { + $modified_docblock = true; + $parsed_docblock->tags['psalm-immutable'] = ['']; + } + + if (!$modified_docblock) { + return (string)$docblock . "\n" . $this->indentation; + } + + return $parsed_docblock->render($this->indentation); + } + + /** + * @return array + */ + public static function getManipulationsForFile(string $file_path): array + { + if (!isset(self::$manipulators[$file_path])) { + return []; + } + + $file_manipulations = []; + + foreach (self::$manipulators[$file_path] as $manipulator) { + if ($manipulator->immutable) { + $file_manipulations[$manipulator->docblock_start] = new FileManipulation( + $manipulator->docblock_start, + $manipulator->docblock_end, + $manipulator->getDocblock() + ); + } + } + + return $file_manipulations; + } + + public static function clearCache(): void + { + self::$manipulators = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php new file mode 100644 index 00000000..086af29a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php @@ -0,0 +1,38 @@ +source_file_path = $source_file_path; + $this->source_start = $source_start; + $this->source_end = $source_end; + $this->destination_file_path = $destination_file_path; + $this->destination_start = $destination_start; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php new file mode 100644 index 00000000..1ed9c6c1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php @@ -0,0 +1,245 @@ + */ + private static $file_manipulations = []; + + /** @var CodeMigration[] */ + private static $code_migrations = []; + + /** + * @param FileManipulation[] $file_manipulations + * + */ + public static function add(string $file_path, array $file_manipulations): void + { + if (!isset(self::$file_manipulations[$file_path])) { + self::$file_manipulations[$file_path] = []; + } + + foreach ($file_manipulations as $file_manipulation) { + self::$file_manipulations[$file_path][$file_manipulation->getKey()] = $file_manipulation; + } + } + + /** @param CodeMigration[] $code_migrations */ + public static function addCodeMigrations(array $code_migrations): void + { + self::$code_migrations = array_merge(self::$code_migrations, $code_migrations); + } + + /** + * @return array{int, int} + */ + private static function getCodeOffsets( + string $source_file_path, + int $source_start, + int $source_end + ): array { + if (!isset(self::$file_manipulations[$source_file_path])) { + return [0, 0]; + } + + $start_offset = 0; + $middle_offset = 0; + + foreach (self::$file_manipulations[$source_file_path] as $fm) { + $offset = strlen($fm->insertion_text) - $fm->end + $fm->start; + + if ($fm->end < $source_start) { + $start_offset += $offset; + $middle_offset += $offset; + } elseif ($fm->start > $source_start + && $fm->end < $source_end + ) { + $middle_offset += $offset; + } + } + + return [$start_offset, $middle_offset]; + } + + public static function addForCodeLocation( + CodeLocation $code_location, + string $replacement_text, + bool $swallow_newlines = false + ): void { + $bounds = $code_location->getSnippetBounds(); + + if ($swallow_newlines) { + $project_analyzer = ProjectAnalyzer::getInstance(); + + $codebase = $project_analyzer->getCodebase(); + + $file_contents = $codebase->getFileContents($code_location->file_path); + + if (($file_contents[$bounds[0] - 1] ?? null) === "\n" + && ($file_contents[$bounds[0] - 2] ?? null) === "\n" + ) { + $bounds[0] -= 2; + } + } + + self::add( + $code_location->file_path, + [ + new FileManipulation( + $bounds[0], + $bounds[1], + $replacement_text + ), + ] + ); + } + + public static function addVarAnnotationToRemove(DocblockTypeLocation $code_location): void + { + $bounds = $code_location->getSelectionBounds(); + + $project_analyzer = ProjectAnalyzer::getInstance(); + + $codebase = $project_analyzer->getCodebase(); + + $file_contents = $codebase->getFileContents($code_location->file_path); + + $comment_start = strrpos($file_contents, '/**', $bounds[0] - strlen($file_contents)); + + if ($comment_start === false) { + return; + } + + $comment_end = strpos($file_contents, '*/', $bounds[1]); + + if ($comment_end === false) { + return; + } + + $comment_end += 2; + + $comment_text = substr($file_contents, $comment_start, $comment_end - $comment_start); + + $var_type_comment_start = $bounds[0] - $comment_start; + $var_type_comment_end = $bounds[1] - $comment_start; + + $var_start = strrpos($comment_text, '@var', $var_type_comment_start - strlen($comment_text)); + $var_end = strpos($comment_text, "\n", $var_type_comment_end); + + if ($var_start && $var_end) { + $var_start = strrpos($comment_text, "\n", $var_start - strlen($comment_text)) ?: $var_start; + $comment_text = substr_replace($comment_text, '', $var_start, $var_end - $var_start); + if (preg_match('@^/\*\*\n(\s*\*\s*\n)*\s*\*?\*/$@', $comment_text)) { + $comment_text = ''; + } + } else { + $comment_text = ''; + } + + self::add( + $code_location->file_path, + [ + new FileManipulation( + $comment_start, + $comment_end, + $comment_text, + false, + $comment_text === '' + ), + ] + ); + } + + /** + * @return FileManipulation[] + */ + public static function getManipulationsForFile(string $file_path): array + { + return self::$file_manipulations[$file_path] ?? []; + } + + /** + * @return array + */ + public static function getMigrationManipulations(FileProvider $file_provider): array + { + $code_migration_manipulations = []; + + foreach (self::$code_migrations as $code_migration) { + [$start_offset, $middle_offset] = self::getCodeOffsets( + $code_migration->source_file_path, + $code_migration->source_start, + $code_migration->source_end + ); + + if (!isset($code_migration_manipulations[$code_migration->source_file_path])) { + $code_migration_manipulations[$code_migration->source_file_path] = []; + } + + if (!isset($code_migration_manipulations[$code_migration->destination_file_path])) { + $code_migration_manipulations[$code_migration->destination_file_path] = []; + } + + $delete_file_manipulation = new FileManipulation( + $code_migration->source_start + $start_offset, + $code_migration->source_end + $middle_offset, + '' + ); + + $code_migration_manipulations[$code_migration->source_file_path][] = $delete_file_manipulation; + + [$destination_start_offset] = self::getCodeOffsets( + $code_migration->destination_file_path, + $code_migration->destination_start, + $code_migration->destination_start + ); + + $manipulation = new FileManipulation( + $code_migration->destination_start + $destination_start_offset, + $code_migration->destination_start + $destination_start_offset, + "\n" . substr( + $file_provider->getContents($code_migration->source_file_path), + $delete_file_manipulation->start, + $delete_file_manipulation->end - $delete_file_manipulation->start + ) . "\n" + ); + + $code_migration_manipulations[$code_migration->destination_file_path][$manipulation->getKey()] + = $manipulation; + } + + return $code_migration_manipulations; + } + + /** + * @return array + */ + public static function getAll(): array + { + return self::$file_manipulations; + } + + public static function clearCache(): void + { + self::$file_manipulations = []; + self::$code_migrations = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php new file mode 100644 index 00000000..ca652333 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php @@ -0,0 +1,579 @@ +> + */ + private static $manipulators = []; + + /** @var Closure|Function_|ClassMethod|ArrowFunction */ + private $stmt; + + /** @var int */ + private $docblock_start; + + /** @var int */ + private $docblock_end; + + /** @var int */ + private $return_typehint_area_start; + + /** @var null|int */ + private $return_typehint_colon_start; + + /** @var null|int */ + private $return_typehint_start; + + /** @var null|int */ + private $return_typehint_end; + + /** @var null|string */ + private $new_php_return_type; + + /** @var bool */ + private $return_type_is_php_compatible = false; + + /** @var null|string */ + private $new_phpdoc_return_type; + + /** @var null|string */ + private $new_psalm_return_type; + + /** @var array */ + private $new_php_param_types = []; + + /** @var array */ + private $new_phpdoc_param_types = []; + + /** @var array */ + private $new_psalm_param_types = []; + + /** @var string */ + private $indentation; + + /** @var string|null */ + private $return_type_description; + + /** @var array */ + private $param_offsets = []; + + /** @var array */ + private $param_typehint_offsets = []; + + /** @var bool */ + private $is_pure = false; + + /** @var list */ + private $throwsExceptions = []; + + /** + * @param Closure|Function_|ClassMethod|ArrowFunction $stmt + */ + public static function getForFunction( + ProjectAnalyzer $project_analyzer, + string $file_path, + FunctionLike $stmt + ): FunctionDocblockManipulator { + if (isset(self::$manipulators[$file_path][$stmt->getLine()])) { + return self::$manipulators[$file_path][$stmt->getLine()]; + } + + $manipulator + = self::$manipulators[$file_path][$stmt->getLine()] + = new self($file_path, $stmt, $project_analyzer); + + return $manipulator; + } + + /** + * @param Closure|Function_|ClassMethod|ArrowFunction $stmt + */ + private function __construct(string $file_path, FunctionLike $stmt, ProjectAnalyzer $project_analyzer) + { + $this->stmt = $stmt; + $docblock = $stmt->getDocComment(); + $this->docblock_start = $docblock ? $docblock->getStartFilePos() : (int)$stmt->getAttribute('startFilePos'); + $this->docblock_end = $function_start = (int)$stmt->getAttribute('startFilePos'); + $function_end = (int)$stmt->getAttribute('endFilePos'); + + $attributes = $stmt->getAttrGroups(); + foreach ($attributes as $attribute) { + // if we have attribute groups, we need to consider that the function starts after them + if ((int) $attribute->getAttribute('endFilePos') > $function_start) { + $function_start = (int) $attribute->getAttribute('endFilePos'); + } + } + + foreach ($stmt->params as $param) { + if ($param->var instanceof PhpParser\Node\Expr\Variable + && is_string($param->var->name) + ) { + $this->param_offsets[$param->var->name] = (int) $param->getAttribute('startFilePos'); + + if ($param->type) { + $this->param_typehint_offsets[$param->var->name] = [ + (int) $param->type->getAttribute('startFilePos'), + (int) $param->type->getAttribute('endFilePos') + ]; + } + } + } + + $codebase = $project_analyzer->getCodebase(); + + $file_contents = $codebase->getFileContents($file_path); + + $last_arg_position = $stmt->params + ? (int) $stmt->params[count($stmt->params) - 1]->getAttribute('endFilePos') + 1 + : null; + + if ($stmt instanceof Closure && $stmt->uses) { + $last_arg_position = (int) $stmt->uses[count($stmt->uses) - 1]->getAttribute('endFilePos') + 1; + } + + $end_bracket_position = (int) strpos($file_contents, ')', $last_arg_position ?: $function_start); + + $this->return_typehint_area_start = $end_bracket_position + 1; + + $function_code = substr($file_contents, $function_start, $function_end); + + $function_code_after_bracket = substr($function_code, $end_bracket_position + 1 - $function_start); + + // do a little parsing here + $chars = str_split($function_code_after_bracket); + + $in_single_line_comment = $in_multi_line_comment = false; + + for ($i = 0, $iMax = count($chars); $i < $iMax; ++$i) { + $char = $chars[$i]; + + switch ($char) { + case "\n": + $in_single_line_comment = false; + continue 2; + + case ':': + if ($in_multi_line_comment || $in_single_line_comment) { + continue 2; + } + + $this->return_typehint_colon_start = $i + $end_bracket_position + 1; + + continue 2; + + case '/': + if ($in_multi_line_comment || $in_single_line_comment) { + continue 2; + } + + if ($chars[$i + 1] === '*') { + $in_multi_line_comment = true; + ++$i; + } + + if ($chars[$i + 1] === '/') { + $in_single_line_comment = true; + ++$i; + } + + continue 2; + + case '*': + if ($in_single_line_comment) { + continue 2; + } + + if ($chars[$i + 1] === '/') { + $in_multi_line_comment = false; + ++$i; + } + + continue 2; + + case '{': + if ($in_multi_line_comment || $in_single_line_comment) { + continue 2; + } + + break 2; + + case '=': + if ($in_multi_line_comment || $in_single_line_comment) { + continue 2; + } + break 2; + + case '?': + if ($in_multi_line_comment || $in_single_line_comment) { + continue 2; + } + + $this->return_typehint_start = $i + $end_bracket_position + 1; + break; + } + + if ($in_multi_line_comment || $in_single_line_comment) { + continue; + } + + if ($chars[$i] === '\\' || preg_match('/\w/', $char)) { + if ($this->return_typehint_start === null) { + $this->return_typehint_start = $i + $end_bracket_position + 1; + } + + if ($chars[$i + 1] !== '\\' && !preg_match('/[\w]/', $chars[$i + 1])) { + $this->return_typehint_end = $i + $end_bracket_position + 2; + break; + } + } + } + + $preceding_newline_pos = strrpos($file_contents, "\n", $this->docblock_end - strlen($file_contents)); + + if ($preceding_newline_pos === false) { + $this->indentation = ''; + + return; + } + + $first_line = substr($file_contents, $preceding_newline_pos + 1, $this->docblock_end - $preceding_newline_pos); + + $this->indentation = str_replace(ltrim($first_line), '', $first_line); + } + + /** + * Sets the new return type + * + */ + public function setReturnType( + ?string $php_type, + string $new_type, + string $phpdoc_type, + bool $is_php_compatible, + ?string $description + ): void { + $new_type = str_replace(['', ''], '', $new_type); + + $this->new_php_return_type = $php_type; + $this->new_phpdoc_return_type = $phpdoc_type; + $this->new_psalm_return_type = $new_type; + $this->return_type_is_php_compatible = $is_php_compatible; + $this->return_type_description = $description; + } + + /** + * Sets a new param type + */ + public function setParamType( + string $param_name, + ?string $php_type, + string $new_type, + string $phpdoc_type + ): void { + $new_type = str_replace(['', '', ''], '', $new_type); + + if ($php_type === 'static') { + $php_type = ''; + } + if ($php_type) { + $this->new_php_param_types[$param_name] = $php_type; + } + + if ($php_type !== $phpdoc_type) { + $this->new_phpdoc_param_types[$param_name] = $phpdoc_type; + } + if ($php_type !== $new_type && $phpdoc_type !== $new_type) { + $this->new_psalm_param_types[$param_name] = $new_type; + } + } + + /** + * Gets a new docblock given the existing docblock, if one exists, and the updated return types + * and/or parameters + * + */ + private function getDocblock(): string + { + $docblock = $this->stmt->getDocComment(); + + if ($docblock) { + $parsed_docblock = DocComment::parsePreservingLength($docblock); + } else { + $parsed_docblock = new ParsedDocblock('', []); + } + + $modified_docblock = false; + + foreach ($this->new_phpdoc_param_types as $param_name => $phpdoc_type) { + $found_in_params = false; + $new_param_block = $phpdoc_type . ' ' . '$' . $param_name; + + if (isset($parsed_docblock->tags['param'])) { + foreach ($parsed_docblock->tags['param'] as &$param_block) { + $doc_parts = CommentAnalyzer::splitDocLine($param_block); + + if (($doc_parts[1] ?? null) === '$' . $param_name) { + if ($param_block !== $new_param_block) { + $modified_docblock = true; + } + + $param_block = $new_param_block; + $found_in_params = true; + break; + } + } + } + + if (!$found_in_params) { + $modified_docblock = true; + $parsed_docblock->tags['param'][] = $new_param_block; + } + } + + foreach ($this->new_psalm_param_types as $param_name => $psalm_type) { + $found_in_params = false; + $new_param_block = $psalm_type . ' ' . '$' . $param_name; + + if (isset($parsed_docblock->tags['psalm-param'])) { + foreach ($parsed_docblock->tags['psalm-param'] as &$param_block) { + $doc_parts = CommentAnalyzer::splitDocLine($param_block); + + if (($doc_parts[1] ?? null) === '$' . $param_name) { + if ($param_block !== $new_param_block) { + $modified_docblock = true; + } + + $param_block = $new_param_block; + $found_in_params = true; + break; + } + } + } + + if (!$found_in_params) { + $modified_docblock = true; + $parsed_docblock->tags['psalm-param'][] = $new_param_block; + } + } + + $old_phpdoc_return_type = null; + if (isset($parsed_docblock->tags['return'])) { + $old_phpdoc_return_type = reset($parsed_docblock->tags['return']); + } + + if ($this->is_pure) { + $modified_docblock = true; + $parsed_docblock->tags['psalm-pure'] = ['']; + } + if (count($this->throwsExceptions) > 0) { + $modified_docblock = true; + $inferredThrowsClause = array_reduce( + $this->throwsExceptions, + function (string $throwsClause, string $exception) { + return $throwsClause === '' ? $exception : $throwsClause.'|'.$exception; + }, + '' + ); + if (array_key_exists('throws', $parsed_docblock->tags)) { + $parsed_docblock->tags['throws'][] = $inferredThrowsClause; + } else { + $parsed_docblock->tags['throws'] = [$inferredThrowsClause]; + } + } + + + if ($this->new_phpdoc_return_type && $this->new_phpdoc_return_type !== $old_phpdoc_return_type) { + $modified_docblock = true; + if ($this->new_phpdoc_return_type !== $this->new_php_return_type || $this->return_type_description) { + //only add the type if it's different than signature or if there's a description + $parsed_docblock->tags['return'] = [ + $this->new_phpdoc_return_type + . ($this->return_type_description ? (' ' . $this->return_type_description) : ''), + ]; + } else { + unset($parsed_docblock->tags['return']); + } + } + + $old_psalm_return_type = null; + if (isset($parsed_docblock->tags['psalm-return'])) { + $old_psalm_return_type = reset($parsed_docblock->tags['psalm-return']); + } + + if ($this->new_psalm_return_type + && $this->new_phpdoc_return_type !== $this->new_psalm_return_type + && $this->new_psalm_return_type !== $old_psalm_return_type + ) { + $modified_docblock = true; + $parsed_docblock->tags['psalm-return'] = [$this->new_psalm_return_type]; + } + + if (!$parsed_docblock->tags && !$parsed_docblock->description) { + return ''; + } + + if (!$modified_docblock) { + return (string)$docblock . "\n" . $this->indentation; + } + + return $parsed_docblock->render($this->indentation); + } + + /** + * @return array + */ + public static function getManipulationsForFile(string $file_path): array + { + if (!isset(self::$manipulators[$file_path])) { + return []; + } + + $file_manipulations = []; + + foreach (self::$manipulators[$file_path] as $manipulator) { + if ($manipulator->new_php_return_type) { + if ($manipulator->return_typehint_start && $manipulator->return_typehint_end) { + $file_manipulations[$manipulator->return_typehint_start] = new FileManipulation( + $manipulator->return_typehint_start, + $manipulator->return_typehint_end, + $manipulator->new_php_return_type + ); + } else { + $file_manipulations[$manipulator->return_typehint_area_start] = new FileManipulation( + $manipulator->return_typehint_area_start, + $manipulator->return_typehint_area_start, + ': ' . $manipulator->new_php_return_type + ); + } + } elseif ($manipulator->new_php_return_type === '' + && $manipulator->return_typehint_colon_start + && $manipulator->new_phpdoc_return_type + && $manipulator->return_typehint_start + && $manipulator->return_typehint_end + ) { + $file_manipulations[$manipulator->return_typehint_start] = new FileManipulation( + $manipulator->return_typehint_colon_start, + $manipulator->return_typehint_end, + '' + ); + } + + if (!$manipulator->new_php_return_type + || !$manipulator->return_type_is_php_compatible + || $manipulator->docblock_start !== $manipulator->docblock_end + || $manipulator->is_pure + ) { + $file_manipulations[$manipulator->docblock_start] = new FileManipulation( + $manipulator->docblock_start, + $manipulator->docblock_end, + $manipulator->getDocblock() + ); + } + + foreach ($manipulator->new_php_param_types as $param_name => $new_php_param_type) { + if (!isset($manipulator->param_offsets[$param_name])) { + continue; + } + + $param_offset = $manipulator->param_offsets[$param_name]; + + $typehint_offsets = $manipulator->param_typehint_offsets[$param_name] ?? null; + + if ($new_php_param_type) { + if ($typehint_offsets) { + $file_manipulations[$typehint_offsets[0]] = new FileManipulation( + $typehint_offsets[0], + $typehint_offsets[1], + $new_php_param_type + ); + } else { + $file_manipulations[$param_offset] = new FileManipulation( + $param_offset, + $param_offset, + $new_php_param_type . ' ' + ); + } + } elseif ($new_php_param_type === '' + && $typehint_offsets + ) { + $file_manipulations[$typehint_offsets[0]] = new FileManipulation( + $typehint_offsets[0], + $param_offset, + '' + ); + } + } + } + + return $file_manipulations; + } + + public function makePure(): void + { + $this->is_pure = true; + } + + /** + * @param list $exceptions + */ + public function addThrowsDocblock(array $exceptions): void + { + $this->throwsExceptions = $exceptions; + } + + public static function clearCache(): void + { + self::$manipulators = []; + } + + /** + * @param array> $manipulators + */ + public static function addManipulators(array $manipulators): void + { + self::$manipulators = array_merge($manipulators, self::$manipulators); + } + + /** + * @return array> + */ + public static function getManipulators(): array + { + return self::$manipulators; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php new file mode 100644 index 00000000..0ee9654a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php @@ -0,0 +1,281 @@ +> + */ + private static $manipulators = []; + + /** @var Property */ + private $stmt; + + /** @var int */ + private $docblock_start; + + /** @var int */ + private $docblock_end; + + /** @var null|int */ + private $typehint_start; + + /** @var int */ + private $typehint_area_start; + + /** @var null|int */ + private $typehint_end; + + /** @var null|string */ + private $new_php_type; + + /** @var bool */ + private $type_is_php_compatible = false; + + /** @var null|string */ + private $new_phpdoc_type; + + /** @var null|string */ + private $new_psalm_type; + + /** @var string */ + private $indentation; + + /** @var bool */ + private $add_newline = false; + + /** @var string|null */ + private $type_description; + + public static function getForProperty( + ProjectAnalyzer $project_analyzer, + string $file_path, + Property $stmt + ): self { + if (isset(self::$manipulators[$file_path][$stmt->getLine()])) { + return self::$manipulators[$file_path][$stmt->getLine()]; + } + + $manipulator + = self::$manipulators[$file_path][$stmt->getLine()] + = new self($project_analyzer, $stmt, $file_path); + + return $manipulator; + } + + private function __construct( + ProjectAnalyzer $project_analyzer, + Property $stmt, + string $file_path + ) { + $this->stmt = $stmt; + $docblock = $stmt->getDocComment(); + $this->docblock_start = $docblock ? $docblock->getStartFilePos() : (int)$stmt->getAttribute('startFilePos'); + $this->docblock_end = (int)$stmt->getAttribute('startFilePos'); + + $codebase = $project_analyzer->getCodebase(); + + $file_contents = $codebase->getFileContents($file_path); + + if (count($stmt->props) > 1) { + $config = Config::getInstance(); + if ($config->isInProjectDirs($file_path)) { + throw new UnexpectedValueException('Cannot replace multiple inline properties in ' . $file_path); + } + + $this->indentation = ''; + + return; + } + + $prop = $stmt->props[0]; + + if ($stmt->type) { + $this->typehint_start = (int)$stmt->type->getAttribute('startFilePos'); + $this->typehint_end = (int)$stmt->type->getAttribute('endFilePos'); + } + + $this->typehint_area_start = (int)$prop->getAttribute('startFilePos') - 1; + + $preceding_newline_pos = strrpos($file_contents, "\n", $this->docblock_end - strlen($file_contents)); + + if ($preceding_newline_pos === false) { + $this->indentation = ''; + + return; + } + + if (!$docblock) { + $preceding_semicolon_pos = strrpos($file_contents, ";", $preceding_newline_pos - strlen($file_contents)); + + if ($preceding_semicolon_pos) { + $preceding_space = substr( + $file_contents, + $preceding_semicolon_pos + 1, + $preceding_newline_pos - $preceding_semicolon_pos - 1 + ); + + if (!substr_count($preceding_space, "\n")) { + $this->add_newline = true; + } + } + } + + $first_line = substr($file_contents, $preceding_newline_pos + 1, $this->docblock_end - $preceding_newline_pos); + + $this->indentation = str_replace(ltrim($first_line), '', $first_line); + } + + public function setType( + ?string $php_type, + string $new_type, + string $phpdoc_type, + bool $is_php_compatible, + ?string $description = null + ): void { + $new_type = str_replace(['', '', ''], '', $new_type); + + $this->new_php_type = $php_type; + $this->new_phpdoc_type = $phpdoc_type; + $this->new_psalm_type = $new_type; + $this->type_is_php_compatible = $is_php_compatible; + $this->type_description = $description; + } + + /** + * Gets a new docblock given the existing docblock, if one exists, and the updated return types + * and/or parameters + * + */ + private function getDocblock(): string + { + $docblock = $this->stmt->getDocComment(); + + if ($docblock) { + $parsed_docblock = DocComment::parsePreservingLength($docblock); + } else { + $parsed_docblock = new ParsedDocblock('', []); + } + + $modified_docblock = false; + + $old_phpdoc_type = null; + if (isset($parsed_docblock->tags['var'])) { + $old_phpdoc_type = array_shift($parsed_docblock->tags['var']); + } + + if ($this->new_phpdoc_type + && $this->new_phpdoc_type !== $old_phpdoc_type + ) { + $modified_docblock = true; + $parsed_docblock->tags['var'] = [ + $this->new_phpdoc_type + . ($this->type_description ? (' ' . $this->type_description) : ''), + ]; + } + + $old_psalm_type = null; + if (isset($parsed_docblock->tags['psalm-var'])) { + $old_psalm_type = array_shift($parsed_docblock->tags['psalm-var']); + } + + if ($this->new_psalm_type + && $this->new_phpdoc_type !== $this->new_psalm_type + && $this->new_psalm_type !== $old_psalm_type + ) { + $modified_docblock = true; + $parsed_docblock->tags['psalm-var'] = [$this->new_psalm_type]; + } + + if (!$parsed_docblock->tags && !$parsed_docblock->description) { + return ''; + } + + if (!$modified_docblock) { + return (string)$docblock . "\n" . $this->indentation; + } + + return $parsed_docblock->render($this->indentation); + } + + /** + * @return array + */ + public static function getManipulationsForFile(string $file_path): array + { + if (!isset(self::$manipulators[$file_path])) { + return []; + } + + $file_manipulations = []; + + foreach (self::$manipulators[$file_path] as $manipulator) { + if ($manipulator->new_php_type) { + if ($manipulator->typehint_start && $manipulator->typehint_end) { + $file_manipulations[$manipulator->typehint_start] = new FileManipulation( + $manipulator->typehint_start, + $manipulator->typehint_end, + $manipulator->new_php_type + ); + } else { + $file_manipulations[$manipulator->typehint_area_start] = new FileManipulation( + $manipulator->typehint_area_start, + $manipulator->typehint_area_start, + ' ' . $manipulator->new_php_type + ); + } + } elseif ($manipulator->new_php_type === '' + && $manipulator->new_phpdoc_type + && $manipulator->typehint_start + && $manipulator->typehint_end + ) { + $file_manipulations[$manipulator->typehint_start] = new FileManipulation( + $manipulator->typehint_start, + $manipulator->typehint_end, + '' + ); + } + + if (!$manipulator->new_php_type + || !$manipulator->type_is_php_compatible + || $manipulator->docblock_start !== $manipulator->docblock_end + ) { + $file_manipulations[$manipulator->docblock_start] = new FileManipulation( + $manipulator->docblock_start + - ($manipulator->add_newline ? strlen($manipulator->indentation) : 0), + $manipulator->docblock_end, + ($manipulator->add_newline ? "\n" . $manipulator->indentation : '') + . $manipulator->getDocblock() + ); + } + } + + return $file_manipulations; + } + + public static function clearCache(): void + { + self::$manipulators = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php new file mode 100644 index 00000000..bd1e1460 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php @@ -0,0 +1,7 @@ +data = $data; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php new file mode 100644 index 00000000..0794c9d8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php @@ -0,0 +1,17 @@ +message = $message; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php new file mode 100644 index 00000000..7c432203 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php @@ -0,0 +1,20 @@ +data = $data; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php new file mode 100644 index 00000000..3d0ad04a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php @@ -0,0 +1,492 @@ +> $process_task_data_iterator + * An array of task data items to be divided up among the + * workers. The size of this is the number of forked processes. + * @param Closure $startup_closure + * A closure to execute upon starting a child + * @param Closure(int, mixed):mixed $task_closure + * A method to execute on each task data. + * This closure must return an array (to be gathered). + * @param Closure():mixed $shutdown_closure + * A closure to execute upon shutting down a child + * @param Closure(mixed $data):void $task_done_closure + * A closure to execute when a task is done + * + * @psalm-suppress MixedAssignment + */ + public function __construct( + Config $config, + array $process_task_data_iterator, + Closure $startup_closure, + Closure $task_closure, + Closure $shutdown_closure, + ?Closure $task_done_closure = null + ) { + $pool_size = count($process_task_data_iterator); + $this->task_done_closure = $task_done_closure; + $this->config = $config; + + assert( + $pool_size > 1, + 'The pool size must be >= 2 to use the fork pool.' + ); + + if (!extension_loaded('pcntl') || !extension_loaded('posix')) { + echo + 'The pcntl & posix extensions must be loaded in order for Psalm to be able to use multiple processes.' + . PHP_EOL; + exit(1); + } + + $disabled_functions = array_map('trim', explode(',', ini_get('disable_functions'))); + if (in_array('pcntl_fork', $disabled_functions)) { + echo "pcntl_fork() is disabled by php configuration (disable_functions directive).\n" + . "Please enable it or run Psalm single-threaded with --threads=1 cli switch.\n"; + exit(1); + } + + if (ini_get('pcre.jit') === '1' + && PHP_OS === 'Darwin' + && version_compare(PHP_VERSION, '7.3.0') >= 0 + && version_compare(PHP_VERSION, '7.4.0') < 0 + ) { + die( + self::MAC_PCRE_MESSAGE . PHP_EOL + ); + } + + // We'll keep track of if this is the parent process + // so that we can tell who will be doing the waiting + $is_parent = false; + + $sockets = []; + + // Fork as many times as requested to get the given + // pool size + for ($proc_id = 0; $proc_id < $pool_size; ++$proc_id) { + // Create an IPC socket pair. + $sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP); + if (!$sockets) { + error_log('unable to create stream socket pair'); + exit(self::EXIT_FAILURE); + } + + // Fork + if (($pid = pcntl_fork()) < 0) { + error_log(posix_strerror(posix_get_last_error())); + exit(self::EXIT_FAILURE); + } + + // Parent + if ($pid > 0) { + $is_parent = true; + $this->child_pid_list[] = $pid; + $this->read_streams[] = self::streamForParent($sockets); + continue; + } + + // Child + if ($pid === 0) { + $is_parent = false; + break; + } + } + + // If we're the parent, return + if ($is_parent) { + return; + } + + // Get the write stream for the child. + $write_stream = self::streamForChild($sockets); + + // Execute anything the children wanted to execute upon + // starting up + $startup_closure(); + + // Get the work for this process + $task_data_iterator = array_values($process_task_data_iterator)[$proc_id]; + + $task_done_buffer = ''; + + try { + foreach ($task_data_iterator as $i => $task_data) { + $task_result = $task_closure($i, $task_data); + + $task_done_message = new ForkTaskDoneMessage($task_result); + if ($this->config->use_igbinary) { + $encoded_message = base64_encode(igbinary_serialize($task_done_message)); + } else { + $encoded_message = base64_encode(serialize($task_done_message)); + } + $serialized_message = $task_done_buffer . $encoded_message . "\n"; + + if (strlen($serialized_message) > 200) { + $bytes_written = @fwrite($write_stream, $serialized_message); + + if (strlen($serialized_message) !== $bytes_written) { + $task_done_buffer = substr($serialized_message, $bytes_written); + } else { + $task_done_buffer = ''; + } + } else { + $task_done_buffer = $serialized_message; + } + } + + // Execute each child's shutdown closure before + // exiting the process + $results = $shutdown_closure(); + + // Serialize this child's produced results and send them to the parent. + $process_done_message = new ForkProcessDoneMessage($results ?: []); + } catch (Throwable $t) { + // This can happen when developing Psalm from source without running `composer update`, + // or because of rare bugs in Psalm. + $process_done_message = new ForkProcessErrorMessage( + get_class($t) . ' ' . $t->getMessage() . "\n" . + "Emitted in " . $t->getFile() . ":" . $t->getLine() . "\n" . + "Stack trace in the forked worker:\n" . + $t->getTraceAsString() + ); + } + + if ($this->config->use_igbinary) { + $encoded_message = base64_encode(igbinary_serialize($process_done_message)); + } else { + $encoded_message = base64_encode(serialize($process_done_message)); + } + $serialized_message = $task_done_buffer . $encoded_message . "\n"; + + $bytes_to_write = strlen($serialized_message); + $bytes_written = 0; + + while ($bytes_written < $bytes_to_write && !feof($write_stream)) { + // attempt to write the remaining unsent part + $bytes_written += @fwrite($write_stream, substr($serialized_message, $bytes_written)); + + if ($bytes_written < $bytes_to_write) { + // wait a bit + usleep(500000); + } + } + + fclose($write_stream); + + // Children exit after completing their work + exit(self::EXIT_SUCCESS); + } + + /** + * Prepare the socket pair to be used in a parent process and + * return the stream the parent will use to read results. + * + * @param resource[] $sockets the socket pair for IPC + * + * @return resource + */ + private static function streamForParent(array $sockets) + { + [$for_read, $for_write] = $sockets; + + // The parent will not use the write channel, so it + // must be closed to prevent deadlock. + fclose($for_write); + + // stream_select will be used to read multiple streams, so these + // must be set to non-blocking mode. + if (!stream_set_blocking($for_read, false)) { + error_log('unable to set read stream to non-blocking'); + exit(self::EXIT_FAILURE); + } + + return $for_read; + } + + /** + * Prepare the socket pair to be used in a child process and return + * the stream the child will use to write results. + * + * @param resource[] $sockets the socket pair for IPC + * + * @return resource + */ + private static function streamForChild(array $sockets) + { + [$for_read, $for_write] = $sockets; + + // The while will not use the read channel, so it must + // be closed to prevent deadlock. + fclose($for_read); + + return $for_write; + } + + /** + * Read the results that each child process has serialized on their write streams. + * The results are returned in an array, one for each worker. The order of the results + * is not maintained. + * + * + * @psalm-suppress MixedAssignment + * + * @return list + */ + private function readResultsFromChildren(): array + { + // Create an array of all active streams, indexed by + // resource id. + $streams = []; + foreach ($this->read_streams as $stream) { + $streams[(int)$stream] = $stream; + } + + // Create an array for the content received on each stream, + // indexed by resource id. + $content = array_fill_keys(array_keys($streams), ''); + + $terminationMessages = []; + + // Read the data off of all the stream. + while (count($streams) > 0) { + $needs_read = array_values($streams); + $needs_write = null; + $needs_except = null; + + // Wait for data on at least one stream. + $num = @stream_select($needs_read, $needs_write, $needs_except, null /* no timeout */); + if ($num === false) { + $err = error_get_last(); + + // stream_select returns false when the `select` system call is interrupted by an incoming signal + if (isset($err['message']) && stripos($err['message'], 'interrupted system call') === false) { + error_log('unable to select on read stream'); + exit(self::EXIT_FAILURE); + } + + continue; + } + + // For each stream that was ready, read the content. + foreach ($needs_read as $file) { + $buffer = fread($file, 1024); + if ($buffer !== false) { + $content[(int)$file] .= $buffer; + } + + if (strpos($buffer, "\n") !== false) { + $serialized_messages = explode("\n", $content[(int)$file]); + $content[(int)$file] = array_pop($serialized_messages); + + foreach ($serialized_messages as $serialized_message) { + if ($this->config->use_igbinary) { + $message = igbinary_unserialize(base64_decode($serialized_message, true)); + } else { + $message = unserialize(base64_decode($serialized_message, true)); + } + + if ($message instanceof ForkProcessDoneMessage) { + $terminationMessages[] = $message->data; + } elseif ($message instanceof ForkTaskDoneMessage) { + if ($this->task_done_closure !== null) { + ($this->task_done_closure)($message->data); + } + } elseif ($message instanceof ForkProcessErrorMessage) { + // Kill all children + foreach ($this->child_pid_list as $child_pid) { + /** + * SIGTERM does not exist on windows + * @psalm-suppress UnusedPsalmSuppress + * @psalm-suppress UndefinedConstant + * @psalm-suppress MixedArgument + */ + posix_kill($child_pid, SIGTERM); + } + throw new Exception($message->message); + } else { + error_log('Child should return ForkMessage - response type=' . gettype($message)); + $this->did_have_error = true; + } + } + } + + // If the stream has closed, stop trying to select on it. + if (feof($file)) { + if ($content[(int)$file] !== '') { + error_log('Child did not send full message before closing the connection'); + $this->did_have_error = true; + } + + fclose($file); + unset($streams[(int)$file]); + } + } + } + + return $terminationMessages; + } + + /** + * Wait for all child processes to complete + * + * @return list + */ + public function wait(): array + { + $ignore_return_code = false; + try { + // Read all the streams from child processes into an array. + $content = $this->readResultsFromChildren(); + } catch (Throwable $e) { + // If children were killed because one of them threw an exception we don't care about return codes. + $ignore_return_code = true; + // PHP guarantees finally is run even after throwing + throw $e; + } finally { + // Wait for all children to return + foreach ($this->child_pid_list as $child_pid) { + $process_lookup = posix_kill($child_pid, 0); + + $status = 0; + + if ($process_lookup) { + /** + * SIGALRM does not exist on windows + * @psalm-suppress UnusedPsalmSuppress + * @psalm-suppress UndefinedConstant + * @psalm-suppress MixedArgument + */ + posix_kill($child_pid, SIGALRM); + + if (pcntl_waitpid($child_pid, $status) < 0) { + error_log(posix_strerror(posix_get_last_error())); + } + } + + // Check to see if the child died a graceful death + if (!$ignore_return_code && pcntl_wifsignaled($status)) { + $return_code = pcntl_wexitstatus($status); + $term_sig = pcntl_wtermsig($status); + + /** + * SIGALRM does not exist on windows + * @psalm-suppress UnusedPsalmSuppress + * @psalm-suppress UndefinedConstant + */ + if ($term_sig !== SIGALRM) { + $this->did_have_error = true; + error_log("Child terminated with return code $return_code and signal $term_sig"); + } + } + } + } + + return $content; + } + + /** + * Returns true if this had an error, e.g. due to memory limits or due to a child process crashing. + * + */ + public function didHaveError(): bool + { + return $this->did_have_error; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php new file mode 100644 index 00000000..0ca2e1ac --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php @@ -0,0 +1,68 @@ +disabledExtensions[] = $disabledExtension; + } + + /** + * No type hint to allow xdebug-handler v1 and v2 usage + * @param bool $default + */ + protected function requiresRestart($default): bool + { + $this->required = (bool) array_filter( + $this->disabledExtensions, + function (string $extension): bool { + return extension_loaded($extension); + } + ); + + return $default || $this->required; + } + + /** + * No type hint to allow xdebug-handler v1 and v2 usage + * @param string|string[] $command + */ + protected function restart($command): void + { + if ($this->required && $this->tmpIni) { + $regex = '/^\s*(extension\s*=.*(' . implode('|', $this->disabledExtensions) . ').*)$/mi'; + $content = file_get_contents($this->tmpIni); + + $content = preg_replace($regex, ';$1', $content); + + file_put_contents($this->tmpIni, $content); + } + + /** @psalm-suppress PossiblyInvalidArgument */ + parent::restart($command); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php new file mode 100644 index 00000000..6cd24779 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php @@ -0,0 +1,55 @@ + */ + private $included_files = []; + + /** + * @template T + * @param callable():T $f + * @return T + */ + public function runAndCollect(callable $f) + { + $before = get_included_files(); + $ret = $f(); + $after = get_included_files(); + + $included = array_diff($after, $before); + + $this->included_files = array_values(array_unique(array_merge($this->included_files, $included))); + + return $ret; + } + + /** @return list */ + public function getIncludedFiles(): array + { + return $this->included_files; + } + + /** @return list */ + public function getFilteredIncludedFiles(): array + { + return array_values(preg_grep('@^phar://@', $this->getIncludedFiles(), PREG_GREP_INVERT)); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Json/Json.php b/vendor/vimeo/psalm/src/Psalm/Internal/Json/Json.php new file mode 100644 index 00000000..2e2445fe --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Json/Json.php @@ -0,0 +1,46 @@ +handler = $handler; + $this->mapper = $mapper; + } + + /** + * Diagnostics notification are sent from the server to the client to signal results of validation runs. + * + * @param Diagnostic[] $diagnostics + */ + public function publishDiagnostics(string $uri, array $diagnostics): void + { + $this->handler->notify('textDocument/publishDiagnostics', [ + 'uri' => $uri, + 'diagnostics' => $diagnostics, + ]); + } + + /** + * The content request is sent from a server to a client + * to request the current content of a text document identified by the URI + * + * @param TextDocumentIdentifier $textDocument The document to get the content for + * + * @return Promise The document's current content + */ + public function xcontent(TextDocumentIdentifier $textDocument): Promise + { + return call( + /** + * @return Generator, object, TextDocumentItem> + */ + function () use ($textDocument) { + /** @var Promise */ + $promise = $this->handler->request( + 'textDocument/xcontent', + ['textDocument' => $textDocument] + ); + + $result = yield $promise; + + /** @var TextDocumentItem */ + return $this->mapper->map($result, new TextDocumentItem); + } + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php new file mode 100644 index 00000000..8c701565 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php @@ -0,0 +1,111 @@ +protocolReader = $protocolReader; + $this->protocolWriter = $protocolWriter; + $this->idGenerator = new IdGenerator; + } + + /** + * Sends a request to the client and returns a promise that is resolved with the result or rejected with the error + * + * @param string $method The method to call + * @param array|object $params The method parameters + * + * @return Promise Resolved with the result of the request or rejected with an error + */ + public function request(string $method, $params): Promise + { + $id = $this->idGenerator->generate(); + + return call( + /** + * @return Generator> + */ + function () use ($id, $method, $params): Generator { + yield $this->protocolWriter->write( + new Message( + new Request($id, $method, (object) $params) + ) + ); + + $deferred = new Deferred(); + + $listener = + function (Message $msg) use ($id, $deferred, &$listener): void { + error_log('request handler'); + /** + * @psalm-suppress UndefinedPropertyFetch + * @psalm-suppress MixedArgument + */ + if ($msg->body + && Response::isResponse($msg->body) + && $msg->body->id === $id + ) { + // Received a response + $this->protocolReader->removeListener('message', $listener); + if (SuccessResponse::isSuccessResponse($msg->body)) { + $deferred->resolve($msg->body->result); + } else { + $deferred->fail($msg->body->error); + } + } + }; + $this->protocolReader->on('message', $listener); + + return $deferred->promise(); + } + ); + } + + /** + * Sends a notification to the client + * + * @param string $method The method to call + * @param array|object $params The method parameters + */ + public function notify(string $method, $params): void + { + $this->protocolWriter->write( + new Message( + new Notification($method, (object)$params) + ) + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php new file mode 100644 index 00000000..9f8f80ba --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php @@ -0,0 +1,71 @@ + $arguments + */ + public function emit( + string $eventName, + array $arguments = [], + ?callable $continueCallBack = null + ): void; + + /** + * Returns the list of listeners for an event. + * + * The list is returned as an array, and the list of events are sorted by + * their priority. + * + * @return callable[] + */ + public function listeners(string $eventName): array; + + /** + * Removes a specific listener from an event. + * + * If the listener could not be found, this method will return false. If it + * was removed it will return true. + * @psalm-suppress PossiblyUnusedReturnValue + */ + public function removeListener(string $eventName, callable $listener): bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php new file mode 100644 index 00000000..50535d0e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php @@ -0,0 +1,157 @@ + + */ + protected $listeners = []; + + /** + * Subscribe to an event. + */ + public function on(string $eventName, callable $callBack, int $priority = 100): void + { + if (!isset($this->listeners[$eventName])) { + $this->listeners[$eventName] = [ + true, // If there's only one item, it's sorted + [$priority], + [$callBack], + ]; + } else { + $this->listeners[$eventName][0] = false; // marked as unsorted + $this->listeners[$eventName][1][] = $priority; + $this->listeners[$eventName][2][] = $callBack; + } + } + + /** + * Emits an event. + * + * This method will return true if 0 or more listeners were successfully + * handled. false is returned if one of the events broke the event chain. + * + * If the continueCallBack is specified, this callback will be called every + * time before the next event handler is called. + * + * If the continueCallback returns false, event propagation stops. This + * allows you to use the eventEmitter as a means for listeners to implement + * functionality in your application, and break the event loop as soon as + * some condition is fulfilled. + * + * Note that returning false from an event subscriber breaks propagation + * and returns false, but if the continue-callback stops propagation, this + * is still considered a 'successful' operation and returns true. + * + * Lastly, if there are 5 event handlers for an event. The continueCallback + * will be called at most 4 times. + * + * @param list $arguments + */ + public function emit( + string $eventName, + array $arguments = [], + ?callable $continueCallBack = null + ): void { + if ($continueCallBack === null) { + foreach ($this->listeners($eventName) as $listener) { + /** @psalm-suppress MixedAssignment */ + $result = call_user_func_array($listener, $arguments); + if ($result === false) { + return; + } + } + } else { + $listeners = $this->listeners($eventName); + $counter = count($listeners); + + foreach ($listeners as $listener) { + --$counter; + /** @psalm-suppress MixedAssignment */ + $result = call_user_func_array($listener, $arguments); + if ($result === false) { + return; + } + + if ($counter > 0) { + if (!$continueCallBack()) { + break; + } + } + } + } + } + + /** + * Returns the list of listeners for an event. + * + * The list is returned as an array, and the list of events are sorted by + * their priority. + * + * @return callable[] + */ + public function listeners(string $eventName): array + { + if (!isset($this->listeners[$eventName])) { + return []; + } + + // The list is not sorted + if (!$this->listeners[$eventName][0]) { + // Sorting + array_multisort($this->listeners[$eventName][1], SORT_NUMERIC, $this->listeners[$eventName][2]); + + // Marking the listeners as sorted + $this->listeners[$eventName][0] = true; + } + + return $this->listeners[$eventName][2]; + } + + /** + * Removes a specific listener from an event. + * + * If the listener could not be found, this method will return false. If it + * was removed it will return true. + */ + public function removeListener(string $eventName, callable $listener): bool + { + if (!isset($this->listeners[$eventName])) { + return false; + } + foreach ($this->listeners[$eventName][2] as $index => $check) { + if ($check === $listener) { + unset($this->listeners[$eventName][1][$index], $this->listeners[$eventName][2][$index]); + + return true; + } + } + + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php new file mode 100644 index 00000000..a7eee0fa --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php @@ -0,0 +1,25 @@ +counter++; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php new file mode 100644 index 00000000..9c2ef144 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php @@ -0,0 +1,64 @@ +handler = new ClientHandler($reader, $writer); + $mapper = new JsonMapper; + + $this->textDocument = new ClientTextDocument($this->handler, $mapper); + } + + /** + * Send a log message to the client. + * + * @param string $message The message to send to the client. + * @psalm-param 1|2|3|4 $type + * @param int $type The log type: + * - 1 = Error + * - 2 = Warning + * - 3 = Info + * - 4 = Log + */ + public function logMessage(string $message, int $type = 4, string $method = 'window/logMessage'): void + { + // https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window_logMessage + + if ($type < 1 || $type > 4) { + $type = 4; + } + + $this->handler->notify( + $method, + [ + 'type' => $type, + 'message' => $message + ] + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php new file mode 100644 index 00000000..30c48bec --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php @@ -0,0 +1,575 @@ + + */ + protected $onsave_paths_to_analyze = []; + + /** + * @var array + */ + protected $onchange_paths_to_analyze = []; + + /** + * @var array> + */ + protected $current_issues = []; + + public function __construct( + ProtocolReader $reader, + ProtocolWriter $writer, + ProjectAnalyzer $project_analyzer + ) { + parent::__construct($this, '/'); + $this->project_analyzer = $project_analyzer; + + $this->protocolWriter = $writer; + + $this->protocolReader = $reader; + $this->protocolReader->on( + 'close', + function (): void { + $this->shutdown(); + $this->exit(); + } + ); + $this->protocolReader->on( + 'message', + asyncCoroutine( + /** + * @return Generator + */ + function (Message $msg): Generator { + if (!$msg->body) { + return; + } + + // Ignore responses, this is the handler for requests and notifications + if (Response::isResponse($msg->body)) { + return; + } + + $result = null; + $error = null; + try { + // Invoke the method handler to get a result + /** + * @var Promise + */ + $dispatched = $this->dispatch($msg->body); + /** @psalm-suppress MixedAssignment */ + $result = yield $dispatched; + } catch (Error $e) { + // If a ResponseError is thrown, send it back in the Response + $error = $e; + } catch (Throwable $e) { + // If an unexpected error occurred, send back an INTERNAL_ERROR error response + $error = new Error( + (string) $e, + ErrorCode::INTERNAL_ERROR, + null, + $e + ); + } + // Only send a Response for a Request + // Notifications do not send Responses + /** + * @psalm-suppress UndefinedPropertyFetch + * @psalm-suppress MixedArgument + */ + if (Request::isRequest($msg->body)) { + if ($error !== null) { + $responseBody = new ErrorResponse($msg->body->id, $error); + } else { + $responseBody = new SuccessResponse($msg->body->id, $result); + } + yield $this->protocolWriter->write(new Message($responseBody)); + } + } + ) + ); + + $this->protocolReader->on( + 'readMessageGroup', + function (): void { + $this->doAnalysis(); + } + ); + + $this->client = new LanguageClient($reader, $writer); + + $this->verboseLog("Language server has started."); + } + + /** + * The initialize request is sent as the first request from the client to the server. + * + * @param ClientCapabilities $capabilities The capabilities provided by the client (editor) + * @param string|null $rootPath The rootPath of the workspace. Is null if no folder is open. + * @param int|null $processId The process Id of the parent process that started the server. + * Is null if the process has not been started by another process. If the parent process is + * not alive then the server should exit (see exit notification) its process. + * @psalm-return Promise + * @psalm-suppress PossiblyUnusedMethod + */ + public function initialize( + ClientCapabilities $capabilities, + ?string $rootPath = null, + ?int $processId = null + ): Promise { + return call( + /** @return Generator */ + function () { + $this->verboseLog("Initializing..."); + $this->clientStatus('initializing'); + + // Eventually, this might block on something. Leave it as a generator. + /** @psalm-suppress TypeDoesNotContainType */ + if (false) { + yield true; + } + + $this->verboseLog("Initializing: Getting code base..."); + $this->clientStatus('initializing', 'getting code base'); + $codebase = $this->project_analyzer->getCodebase(); + + $this->verboseLog("Initializing: Scanning files..."); + $this->clientStatus('initializing', 'scanning files'); + $codebase->scanFiles($this->project_analyzer->threads); + + $this->verboseLog("Initializing: Registering stub files..."); + $this->clientStatus('initializing', 'registering stub files'); + $codebase->config->visitStubFiles($codebase); + + if ($this->textDocument === null) { + $this->textDocument = new ServerTextDocument( + $this, + $codebase, + $this->project_analyzer + ); + } + + if ($this->workspace === null) { + $this->workspace = new ServerWorkspace( + $this, + $codebase, + $this->project_analyzer + ); + } + + $serverCapabilities = new ServerCapabilities(); + + $textDocumentSyncOptions = new TextDocumentSyncOptions(); + + $textDocumentSyncOptions->openClose = true; + + $saveOptions = new SaveOptions(); + $saveOptions->includeText = true; + $textDocumentSyncOptions->save = $saveOptions; + + if ($this->project_analyzer->onchange_line_limit === 0) { + $textDocumentSyncOptions->change = TextDocumentSyncKind::NONE; + } else { + $textDocumentSyncOptions->change = TextDocumentSyncKind::FULL; + } + + $serverCapabilities->textDocumentSync = $textDocumentSyncOptions; + + // Support "Find all symbols" + $serverCapabilities->documentSymbolProvider = false; + // Support "Find all symbols in workspace" + $serverCapabilities->workspaceSymbolProvider = false; + // Support "Go to definition" + $serverCapabilities->definitionProvider = true; + // Support "Find all references" + $serverCapabilities->referencesProvider = false; + // Support "Hover" + $serverCapabilities->hoverProvider = true; + // Support "Completion" + $serverCapabilities->codeActionProvider = true; + // Support "Code Actions" + + if ($this->project_analyzer->provide_completion) { + $serverCapabilities->completionProvider = new CompletionOptions(); + $serverCapabilities->completionProvider->resolveProvider = false; + $serverCapabilities->completionProvider->triggerCharacters = ['$', '>', ':',"[", "(", ",", " "]; + } + + $serverCapabilities->signatureHelpProvider = new SignatureHelpOptions(['(', ',']); + + // Support global references + $serverCapabilities->xworkspaceReferencesProvider = false; + $serverCapabilities->xdefinitionProvider = false; + $serverCapabilities->dependenciesProvider = false; + + $this->verboseLog("Initializing: Complete."); + $this->clientStatus('initialized'); + return new InitializeResult($serverCapabilities); + } + ); + } + + /** + * @psalm-suppress PossiblyUnusedMethod + * + */ + public function initialized(): void + { + $this->clientStatus('running'); + } + + public function queueTemporaryFileAnalysis(string $file_path, string $uri): void + { + $this->onchange_paths_to_analyze[$file_path] = $uri; + } + + public function queueFileAnalysis(string $file_path, string $uri): void + { + $this->onsave_paths_to_analyze[$file_path] = $uri; + } + + public function doAnalysis(): void + { + $this->clientStatus('analyzing'); + + try { + $codebase = $this->project_analyzer->getCodebase(); + + $all_files_to_analyze = $this->onchange_paths_to_analyze + $this->onsave_paths_to_analyze; + + if (!$all_files_to_analyze) { + return; + } + + if ($this->onsave_paths_to_analyze) { + $codebase->reloadFiles($this->project_analyzer, array_keys($this->onsave_paths_to_analyze)); + } + + if ($this->onchange_paths_to_analyze) { + $codebase->reloadFiles($this->project_analyzer, array_keys($this->onchange_paths_to_analyze)); + } + + $all_file_paths_to_analyze = array_keys($all_files_to_analyze); + $codebase->analyzer->addFilesToAnalyze( + array_combine($all_file_paths_to_analyze, $all_file_paths_to_analyze) + ); + $codebase->analyzer->analyzeFiles($this->project_analyzer, 1, false); + + $this->emitIssues($all_files_to_analyze); + + $this->onchange_paths_to_analyze = []; + $this->onsave_paths_to_analyze = []; + } finally { + // we are done, so set the status back to running + $this->clientStatus('running'); + } + } + + /** + * @param array $uris + * + */ + public function emitIssues(array $uris): void + { + $data = IssueBuffer::clear(); + $this->current_issues = $data; + + foreach ($uris as $file_path => $uri) { + $diagnostics = array_map( + function (IssueData $issue_data): Diagnostic { + //$check_name = $issue->check_name; + $description = $issue_data->message; + $severity = $issue_data->severity; + + $start_line = max($issue_data->line_from, 1); + $end_line = $issue_data->line_to; + $start_column = $issue_data->column_from; + $end_column = $issue_data->column_to; + // Language server has 0 based lines and columns, phan has 1-based lines and columns. + $range = new Range( + new Position($start_line - 1, $start_column - 1), + new Position($end_line - 1, $end_column - 1) + ); + switch ($severity) { + case Config::REPORT_INFO: + $diagnostic_severity = DiagnosticSeverity::WARNING; + break; + case Config::REPORT_ERROR: + default: + $diagnostic_severity = DiagnosticSeverity::ERROR; + break; + } + $diagnostic = new Diagnostic( + $description, + $range, + null, + $diagnostic_severity, + 'Psalm' + ); + + //$code = 'PS' . \str_pad((string) $issue_data->shortcode, 3, "0", \STR_PAD_LEFT); + $code = $issue_data->link; + + if ($this->project_analyzer->language_server_use_extended_diagnostic_codes) { + // Added in VSCode 1.43.0 and will be part of the LSP 3.16.0 standard. + // Since this new functionality is not backwards compatible, we use a + // configuration option so the end user must opt in to it using the cli argument. + // https://github.com/microsoft/vscode/blob/1.43.0/src/vs/vscode.d.ts#L4688-L4699 + + /** @psalm-suppress InvalidPropertyAssignmentValue */ + $diagnostic->code = [ + "value" => $code, + "target" => $issue_data->link, + ]; + } else { + // the Diagnostic constructor only takes `int` for the code, but the property can be + // `int` or `string`, so we set the property directly because we want to use a `string` + /** @psalm-suppress InvalidPropertyAssignmentValue */ + $diagnostic->code = $code; + } + + return $diagnostic; + }, + $data[$file_path] ?? [] + ); + + $this->client->textDocument->publishDiagnostics($uri, $diagnostics); + } + } + + /** + * The shutdown request is sent from the client to the server. It asks the server to shut down, + * but to not exit (otherwise the response might not be delivered correctly to the client). + * There is a separate exit notification that asks the server to exit. + * @psalm-suppress PossiblyUnusedReturnValue + */ + public function shutdown(): Promise + { + $this->clientStatus('closing'); + $this->verboseLog("Shutting down..."); + $codebase = $this->project_analyzer->getCodebase(); + $scanned_files = $codebase->scanner->getScannedFiles(); + $codebase->file_reference_provider->updateReferenceCache( + $codebase, + $scanned_files + ); + $this->clientStatus('closed'); + return new Success(null); + } + + /** + * A notification to ask the server to exit its process. + * + */ + public function exit(): void + { + exit(0); + } + + + /** + * Send log message to the client + * + * @param string $message The log message to send to the client. + * @psalm-param 1|2|3|4 $type + * @param int $type The log type: + * - 1 = Error + * - 2 = Warning + * - 3 = Info + * - 4 = Log + */ + public function verboseLog(string $message, int $type = 4): void + { + if ($this->project_analyzer->language_server_verbose) { + try { + $this->client->logMessage( + '[Psalm ' .PSALM_VERSION. ' - PHP Language Server] ' . $message, + $type + ); + } catch (Throwable $err) { + // do nothing + } + } + new Success(null); + } + + /** + * Send status message to client. This is the same as sending a log message, + * except this is meant for parsing by the client to present status updates in a UI. + * + * @param string $status The log message to send to the client. Should not contain colons `:`. + * @param string|null $additional_info This is additional info that the client + * can use as part of the display message. + */ + private function clientStatus(string $status, ?string $additional_info = null): void + { + try { + // here we send a notification to the client using the telemetry notification method + $this->client->logMessage( + $status . (!empty($additional_info) ? ': ' . $additional_info : ''), + 3, + 'telemetry/event' + ); + } catch (Throwable $err) { + // do nothing + } + new Success(null); + } + + /** + * Transforms an absolute file path into a URI as used by the language server protocol. + * + * @psalm-pure + */ + public static function pathToUri(string $filepath): string + { + $filepath = trim(str_replace('\\', '/', $filepath), '/'); + $parts = explode('/', $filepath); + // Don't %-encode the colon after a Windows drive letter + $first = array_shift($parts); + if (substr($first, -1) !== ':') { + $first = rawurlencode($first); + } + $parts = array_map('rawurlencode', $parts); + array_unshift($parts, $first); + $filepath = implode('/', $parts); + + return 'file:///' . $filepath; + } + + /** + * Transforms URI into file path + * + * + */ + public static function uriToPath(string $uri): string + { + $fragments = parse_url($uri); + if ($fragments === false + || !isset($fragments['scheme']) + || $fragments['scheme'] !== 'file' + || !isset($fragments['path']) + ) { + throw new InvalidArgumentException("Not a valid file URI: $uri"); + } + + $filepath = urldecode($fragments['path']); + + if (strpos($filepath, ':') !== false) { + if ($filepath[0] === '/') { + $filepath = substr($filepath, 1); + } + $filepath = str_replace('/', '\\', $filepath); + } + + $realpath = realpath($filepath); + if ($realpath !== false) { + return $realpath; + } + + return $filepath; + } + + /** + * Get the value of current_issues + * + * @return array> + */ + public function getCurrentIssues(): array + { + return $this->current_issues; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php new file mode 100644 index 00000000..be336253 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php @@ -0,0 +1,73 @@ +body = MessageBody::parse(array_pop($parts)); + foreach ($parts as $line) { + if ($line) { + $pair = explode(': ', $line); + $obj->headers[$pair[0]] = $pair[1]; + } + } + + return $obj; + } + + /** + * @param string[] $headers + */ + public function __construct(?MessageBody $body = null, array $headers = []) + { + $this->body = $body; + if (!isset($headers['Content-Type'])) { + $headers['Content-Type'] = 'application/vscode-jsonrpc; charset=utf8'; + } + $this->headers = $headers; + } + + public function __toString(): string + { + $body = (string)$this->body; + $contentLength = strlen($body); + $this->headers['Content-Length'] = (string) $contentLength; + $headers = ''; + foreach ($this->headers as $name => $value) { + $headers .= "$name: $value\r\n"; + } + + return $headers . "\r\n" . $body; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php new file mode 100644 index 00000000..dbc23d29 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php @@ -0,0 +1,15 @@ +, ?string, void> + */ + function () use ($input): Generator { + while ($this->is_accepting_new_requests) { + $read_promise = $input->read(); + + $chunk = yield $read_promise; + + if ($chunk === null) { + break; + } + + if ($this->readMessages($chunk) > 0) { + $this->emit('readMessageGroup'); + } + } + + $this->emitClose(); + } + ); + + $this->on( + 'close', + static function () use ($input): void { + $input->close(); + } + ); + } + + private function readMessages(string $buffer): int + { + $emitted_messages = 0; + $i = 0; + while (($buffer[$i] ?? '') !== '') { + $this->buffer .= $buffer[$i++]; + switch ($this->parsing_mode) { + case self::PARSE_HEADERS: + if ($this->buffer === "\r\n") { + $this->parsing_mode = self::PARSE_BODY; + $this->content_length = (int) ($this->headers['Content-Length'] ?? 0); + $this->buffer = ''; + } elseif (substr($this->buffer, -2) === "\r\n") { + $parts = explode(':', $this->buffer); + $this->headers[$parts[0]] = trim($parts[1]); + $this->buffer = ''; + } + break; + case self::PARSE_BODY: + if (strlen($this->buffer) === $this->content_length) { + if (!$this->is_accepting_new_requests) { + // If we fork, don't read any bytes in the input buffer from the worker process. + $this->emitClose(); + + return $emitted_messages; + } + // MessageBody::parse can throw an Error, maybe log an error? + try { + $msg = new Message(MessageBody::parse($this->buffer), $this->headers); + } catch (Exception $_) { + $msg = null; + } + if ($msg) { + ++$emitted_messages; + $this->emit('message', [$msg]); + /** + * @psalm-suppress DocblockTypeContradiction + */ + if (!$this->is_accepting_new_requests) { + // If we fork, don't read any bytes in the input buffer from the worker process. + $this->emitClose(); + + return $emitted_messages; + } + } + $this->parsing_mode = self::PARSE_HEADERS; + $this->headers = []; + $this->buffer = ''; + } + break; + } + } + + return $emitted_messages; + } + + private function emitClose(): void + { + if ($this->did_emit_close) { + return; + } + $this->did_emit_close = true; + $this->emit('close'); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php new file mode 100644 index 00000000..cedd7c70 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php @@ -0,0 +1,35 @@ +output = new ResourceOutputStream($output); + } + + /** + * {@inheritdoc} + */ + public function write(Message $msg): Promise + { + return $this->output->write((string)$msg); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php new file mode 100644 index 00000000..6d5ce01e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php @@ -0,0 +1,18 @@ +server = $server; + $this->codebase = $codebase; + $this->project_analyzer = $project_analyzer; + } + + /** + * The document open notification is sent from the client to the server to signal newly opened text documents. The + * document’s content is now managed by the client and the server must not try to read the document’s content using + * the document’s Uri. Open in this sense means it is managed by the client. It doesn’t necessarily mean that its + * content is presented in an editor. An open notification must not be sent more than once without a corresponding + * close notification send before. This means open and close notification must be balanced and the max open count + * for a particular textDocument is one. Note that a server’s ability to fulfill requests is independent of whether + * a text document is open or closed. + * + * @param TextDocumentItem $textDocument the document that was opened + */ + public function didOpen(TextDocumentItem $textDocument): void + { + $file_path = LanguageServer::uriToPath($textDocument->uri); + + if (!$this->codebase->config->isInProjectDirs($file_path)) { + return; + } + + $this->codebase->file_provider->openFile($file_path); + + $this->server->queueFileAnalysis($file_path, $textDocument->uri); + } + + /** + * The document save notification is sent from the client to the server when the document was saved in the client + * + * @param TextDocumentItem $textDocument the document that was opened + * @param ?string $text the content when saved + */ + public function didSave(TextDocumentItem $textDocument, ?string $text): void + { + $file_path = LanguageServer::uriToPath($textDocument->uri); + + if (!$this->codebase->config->isInProjectDirs($file_path)) { + return; + } + + // reopen file + $this->codebase->removeTemporaryFileChanges($file_path); + $this->codebase->file_provider->setOpenContents($file_path, (string) $text); + + $this->server->queueFileAnalysis($file_path, $textDocument->uri); + } + + /** + * The document change notification is sent from the client to the server to signal changes to a text document. + * + * @param VersionedTextDocumentIdentifier $textDocument + * @param TextDocumentContentChangeEvent[] $contentChanges + */ + public function didChange(VersionedTextDocumentIdentifier $textDocument, array $contentChanges): void + { + $file_path = LanguageServer::uriToPath($textDocument->uri); + + if (!$this->codebase->config->isInProjectDirs($file_path)) { + return; + } + + if (count($contentChanges) === 1 && $contentChanges[0]->range === null) { + $new_content = $contentChanges[0]->text; + } else { + throw new UnexpectedValueException('Not expecting partial diff'); + } + + if ($this->project_analyzer->onchange_line_limit !== null) { + if (substr_count($new_content, "\n") > $this->project_analyzer->onchange_line_limit) { + return; + } + } + + $this->codebase->addTemporaryFileChanges($file_path, $new_content); + $this->server->queueTemporaryFileAnalysis($file_path, $textDocument->uri); + } + + /** + * The document close notification is sent from the client to the server when the document got closed in the client. + * The document’s master now exists where the document’s Uri points to (e.g. if the document’s Uri is a file Uri the + * master now exists on disk). As with the open notification the close notification is about managing the document’s + * content. Receiving a close notification doesn’t mean that the document was open in an editor before. A close + * notification requires a previous open notification to be sent. Note that a server’s ability to fulfill requests + * is independent of whether a text document is open or closed. + * + * @param TextDocumentIdentifier $textDocument The document that was closed + * + */ + public function didClose(TextDocumentIdentifier $textDocument): void + { + $file_path = LanguageServer::uriToPath($textDocument->uri); + + $this->codebase->file_provider->closeFile($file_path); + $this->server->client->textDocument->publishDiagnostics($textDocument->uri, []); + } + + /** + * The goto definition request is sent from the client to the server to resolve the definition location of a symbol + * at a given text document position. + * + * @param TextDocumentIdentifier $textDocument The text document + * @param Position $position The position inside the text document + * @psalm-return Promise|Promise + */ + public function definition(TextDocumentIdentifier $textDocument, Position $position): Promise + { + $file_path = LanguageServer::uriToPath($textDocument->uri); + + try { + $reference_location = $this->codebase->getReferenceAtPosition($file_path, $position); + } catch (UnanalyzedFileException $e) { + $this->codebase->file_provider->openFile($file_path); + $this->server->queueFileAnalysis($file_path, $textDocument->uri); + + return new Success(null); + } + + if ($reference_location === null) { + return new Success(null); + } + + [$reference] = $reference_location; + + $code_location = $this->codebase->getSymbolLocation($file_path, $reference); + + if (!$code_location) { + return new Success(null); + } + + return new Success( + new Location( + LanguageServer::pathToUri($code_location->file_path), + new Range( + new Position($code_location->getLineNumber() - 1, $code_location->getColumn() - 1), + new Position($code_location->getEndLineNumber() - 1, $code_location->getEndColumn() - 1) + ) + ) + ); + } + + /** + * The hover request is sent from the client to the server to request + * hover information at a given text document position. + * + * @param TextDocumentIdentifier $textDocument The text document + * @param Position $position The position inside the text document + * @psalm-return Promise|Promise + */ + public function hover(TextDocumentIdentifier $textDocument, Position $position): Promise + { + $file_path = LanguageServer::uriToPath($textDocument->uri); + + try { + $reference_location = $this->codebase->getReferenceAtPosition($file_path, $position); + } catch (UnanalyzedFileException $e) { + $this->codebase->file_provider->openFile($file_path); + $this->server->queueFileAnalysis($file_path, $textDocument->uri); + + return new Success(null); + } + + if ($reference_location === null) { + return new Success(null); + } + + [$reference, $range] = $reference_location; + + $symbol_information = $this->codebase->getSymbolInformation($file_path, $reference); + + if ($symbol_information === null) { + return new Success(null); + } + + $content = "```php\n" . $symbol_information['type'] . "\n```"; + if (isset($symbol_information['description'])) { + $content .= "\n---\n" . $symbol_information['description']; + } + $contents = new MarkupContent( + MarkupKind::MARKDOWN, + $content + ); + + return new Success(new Hover($contents, $range)); + } + + /** + * The Completion request is sent from the client to the server to compute completion items at a given cursor + * position. Completion items are presented in the IntelliSense user interface. If computing full completion items + * is expensive, servers can additionally provide a handler for the completion item resolve request + * ('completionItem/resolve'). This request is sent when a completion item is selected in the user interface. A + * typically use case is for example: the 'textDocument/completion' request doesn't fill in the documentation + * property for returned completion items since it is expensive to compute. When the item is selected in the user + * interface then a 'completionItem/resolve' request is sent with the selected completion item as a param. The + * returned completion item should have the documentation property filled in. + * + * @param TextDocumentIdentifier $textDocument The text document + * @param Position $position The position + * @psalm-return Promise>|Promise + */ + public function completion(TextDocumentIdentifier $textDocument, Position $position): Promise + { + $file_path = LanguageServer::uriToPath($textDocument->uri); + if (!$this->codebase->config->isInProjectDirs($file_path)) { + return new Success([]); + } + + try { + $completion_data = $this->codebase->getCompletionDataAtPosition($file_path, $position); + } catch (UnanalyzedFileException $e) { + $this->codebase->file_provider->openFile($file_path); + $this->server->queueFileAnalysis($file_path, $textDocument->uri); + + return new Success([]); + } + + try { + $type_context = $this->codebase->getTypeContextAtPosition($file_path, $position); + } catch (UnexpectedValueException $e) { + error_log('completion errored at ' . $position->line . ':' . $position->character. + ', Reason: '.$e->getMessage()); + return new Success([]); + } + + if (!$completion_data && !$type_context) { + error_log('completion not found at ' . $position->line . ':' . $position->character); + return new Success([]); + } + + if ($completion_data) { + [$recent_type, $gap, $offset] = $completion_data; + + if ($gap === '->' || $gap === '::') { + $completion_items = $this->codebase->getCompletionItemsForClassishThing($recent_type, $gap); + } elseif ($gap === '[') { + $completion_items = $this->codebase->getCompletionItemsForArrayKeys($recent_type); + } else { + $completion_items = $this->codebase->getCompletionItemsForPartialSymbol( + $recent_type, + $offset, + $file_path + ); + } + } else { + $completion_items = $this->codebase->getCompletionItemsForType($type_context); + } + + return new Success(new CompletionList($completion_items, false)); + } + + /** + * The signature help request is sent from the client to the server to request signature + * information at a given cursor position. + */ + public function signatureHelp(TextDocumentIdentifier $textDocument, Position $position): Promise + { + $file_path = LanguageServer::uriToPath($textDocument->uri); + + try { + $argument_location = $this->codebase->getFunctionArgumentAtPosition($file_path, $position); + } catch (UnanalyzedFileException $e) { + $this->codebase->file_provider->openFile($file_path); + $this->server->queueFileAnalysis($file_path, $textDocument->uri); + + return new Success(new SignatureHelp()); + } + + if ($argument_location === null) { + return new Success(new SignatureHelp()); + } + + $signature_information = $this->codebase->getSignatureInformation($argument_location[0], $file_path); + + if (!$signature_information) { + return new Success(new SignatureHelp()); + } + + return new Success(new SignatureHelp([ + $signature_information, + ], 0, $argument_location[1])); + } + + /** + * The code action request is sent from the client to the server to compute commands + * for a given text document and range. These commands are typically code fixes to + * either fix problems or to beautify/refactor code. + * + */ + public function codeAction(TextDocumentIdentifier $textDocument, Range $range): Promise + { + $file_path = LanguageServer::uriToPath($textDocument->uri); + if (!$this->codebase->file_provider->isOpen($file_path)) { + return new Success(null); + } + + $issues = $this->server->getCurrentIssues(); + + if (empty($issues[$file_path])) { + return new Success(null); + } + + $file_contents = $this->codebase->getFileContents($file_path); + + $offsetStart = $range->start->toOffset($file_contents); + $offsetEnd = $range->end->toOffset($file_contents); + + $fixers = []; + foreach ($issues[$file_path] as $issue) { + if ($offsetStart === $issue->from && $offsetEnd === $issue->to) { + $snippetRange = new Range( + new Position($issue->line_from-1), + new Position($issue->line_to) + ); + + $indentation = ''; + if (preg_match('/^(\s*)/', $issue->snippet, $matches)) { + $indentation = $matches[1] ?? ''; + } + + $edit = new WorkspaceEdit([ + $textDocument->uri => [ + new TextEdit( + $snippetRange, + "{$indentation}/**\n". + "{$indentation} * @psalm-suppress {$issue->type}\n". + "{$indentation} */\n". + "{$issue->snippet}\n" + ) + ] + ]); + + //Suppress Ability + $fixers["suppress.{$issue->type}"] = [ + 'title' => "Suppress {$issue->type} for this line", + 'kind' => 'quickfix', + 'edit' => $edit + ]; + } + } + + if (empty($fixers)) { + return new Success(null); + } + + return new Success( + array_values($fixers) + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php new file mode 100644 index 00000000..c1bc2bd7 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php @@ -0,0 +1,78 @@ +server = $server; + $this->codebase = $codebase; + $this->project_analyzer = $project_analyzer; + } + + /** + * The watched files notification is sent from the client to the server when the client + * detects changes to files and folders watched by the language client (note although + * the name suggest that only file events are sent it is about file system events + * which include folders as well). It is recommended that servers register for these + * file system events using the registration mechanism. In former implementations clients + * pushed file events without the server actively asking for it. + * + * @param FileEvent[] $changes + * @psalm-suppress PossiblyUnusedMethod + */ + public function didChangeWatchedFiles(array $changes): void + { + foreach ($changes as $change) { + $file_path = LanguageServer::uriToPath($change->uri); + + if ($change->type === FileChangeType::DELETED) { + $this->codebase->invalidateInformationForFile($file_path); + continue; + } + + if (!$this->codebase->config->isInProjectDirs($file_path)) { + continue; + } + + if ($this->project_analyzer->onchange_line_limit === 0) { + continue; + } + + //If the file is currently open then dont analyse it because its tracked by the client + if (!$this->codebase->file_provider->isOpen($file_path)) { + $this->server->queueFileAnalysis($file_path, $change->uri); + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php b/vendor/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php new file mode 100644 index 00000000..cf4c81ba --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php @@ -0,0 +1,70 @@ +fq_class_name = $fq_class_name; + $this->method_name = $method_name; + } + + /** + * Takes any valid reference to a method id and converts + * it into a MethodIdentifier + * + * @param string|MethodIdentifier $method_id + * + * @psalm-pure + */ + public static function wrap($method_id): self + { + return is_string($method_id) ? static::fromMethodIdReference($method_id) : $method_id; + } + + /** + * @psalm-pure + */ + public static function isValidMethodIdReference(string $method_id): bool + { + return strpos($method_id, '::') !== false; + } + + /** + * @psalm-pure + */ + public static function fromMethodIdReference(string $method_id): self + { + if (!static::isValidMethodIdReference($method_id)) { + throw new InvalidArgumentException('Invalid method id reference provided: ' . $method_id); + } + // remove trailing backslash if it exists + $method_id = preg_replace('/^\\\\/', '', $method_id); + $method_id_parts = explode('::', $method_id); + return new self($method_id_parts[0], strtolower($method_id_parts[1])); + } + + /** @return non-empty-string */ + public function __toString(): string + { + return $this->fq_class_name . '::' . $this->method_name; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php new file mode 100644 index 00000000..2c96c6b1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php @@ -0,0 +1,174 @@ +stopTraversal = false; + } + + /** + * Recursively traverse a node. + * + * @param Node $node node to traverse + * + * @return Node Result of traversal (may be original node or new one) + */ + protected function traverseNode(Node $node): Node + { + foreach ($node->getSubNodeNames() as $name) { + $subNode = &$node->$name; + + if (is_array($subNode)) { + $subNode = $this->traverseArray($subNode); + if ($this->stopTraversal) { + break; + } + } elseif ($subNode instanceof Node) { + $traverseChildren = true; + foreach ($this->visitors as $visitor) { + $return = $visitor->enterNode($subNode, $traverseChildren); + if (null !== $return) { + if ($return instanceof Node) { + $subNode = $return; + } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { + $traverseChildren = false; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = true; + break 2; + } else { + throw new LogicException( + 'enterNode() returned invalid value of type ' . gettype($return) + ); + } + } + } + + if ($traverseChildren) { + $subNode = $this->traverseNode($subNode); + if ($this->stopTraversal) { + break; + } + } + + foreach ($this->visitors as $visitor) { + $return = $visitor->leaveNode($subNode); + if (null !== $return) { + if ($return instanceof Node) { + $subNode = $return; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = true; + break 2; + } elseif (is_array($return)) { + throw new LogicException( + 'leaveNode() may only return an array ' . + 'if the parent structure is an array' + ); + } else { + throw new LogicException( + 'leaveNode() returned invalid value of type ' . gettype($return) + ); + } + } + } + } + } + + return $node; + } + + /** + * Recursively traverse array (usually of nodes). + * + * @param array $nodes Array to traverse + * + * @return array Result of traversal (may be original array or changed one) + */ + protected function traverseArray(array $nodes): array + { + $doNodes = []; + + foreach ($nodes as $i => &$node) { + if ($node instanceof Node) { + $traverseChildren = true; + foreach ($this->visitors as $visitor) { + $return = $visitor->enterNode($node, $traverseChildren); + if (null !== $return) { + if ($return instanceof Node) { + $node = $return; + } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { + $traverseChildren = false; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = true; + break 2; + } else { + throw new LogicException( + 'enterNode() returned invalid value of type ' . gettype($return) + ); + } + } + } + + if ($traverseChildren) { + $node = $this->traverseNode($node); + if ($this->stopTraversal) { + break; + } + } + + foreach ($this->visitors as $visitor) { + $return = $visitor->leaveNode($node); + if (null !== $return) { + if ($return instanceof Node) { + $node = $return; + } elseif (is_array($return)) { + $doNodes[] = [$i, $return]; + break; + } elseif (self::REMOVE_NODE === $return) { + $doNodes[] = [$i, []]; + break; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = true; + break 2; + } elseif (false === $return) { + throw new LogicException( + 'bool(false) return from leaveNode() no longer supported. ' . + 'Return NodeTraverser::REMOVE_NODE instead' + ); + } else { + throw new LogicException( + 'leaveNode() returned invalid value of type ' . gettype($return) + ); + } + } + } + } elseif (is_array($node)) { + throw new LogicException('Invalid node structure: Contains nested arrays'); + } + } + + if (!empty($doNodes)) { + while (list($i, $replace) = array_pop($doNodes)) { + array_splice($nodes, $i, 1, $replace); + } + } + + return $nodes; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php new file mode 100644 index 00000000..a3fd78e2 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php @@ -0,0 +1,117 @@ +> + */ + protected $assignment_map = []; + + /** + * @var string|null + */ + protected $this_class_name; + + public function __construct(?string $this_class_name) + { + $this->this_class_name = $this_class_name; + } + + public function enterNode(PhpParser\Node $node): ?int + { + if ($node instanceof PhpParser\Node\Expr\Assign) { + $right_var_id = ExpressionIdentifier::getRootVarId($node->expr, $this->this_class_name); + + if ($node->var instanceof PhpParser\Node\Expr\List_ + || $node->var instanceof PhpParser\Node\Expr\Array_ + ) { + foreach ($node->var->items as $assign_item) { + if ($assign_item) { + $left_var_id = ExpressionIdentifier::getRootVarId($assign_item->value, $this->this_class_name); + + if ($left_var_id) { + $this->assignment_map[$left_var_id][$right_var_id ?: 'isset'] = true; + } + } + } + } else { + $left_var_id = ExpressionIdentifier::getRootVarId($node->var, $this->this_class_name); + + if ($left_var_id) { + $this->assignment_map[$left_var_id][$right_var_id ?: 'isset'] = true; + } + } + + return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; + } + + if ($node instanceof PhpParser\Node\Expr\PostInc + || $node instanceof PhpParser\Node\Expr\PostDec + || $node instanceof PhpParser\Node\Expr\PreInc + || $node instanceof PhpParser\Node\Expr\PreDec + || $node instanceof PhpParser\Node\Expr\AssignOp + ) { + $var_id = ExpressionIdentifier::getRootVarId($node->var, $this->this_class_name); + + if ($var_id) { + $this->assignment_map[$var_id][$var_id] = true; + } + + return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; + } + + if ($node instanceof PhpParser\Node\Expr\FuncCall + || $node instanceof PhpParser\Node\Expr\MethodCall + || $node instanceof PhpParser\Node\Expr\StaticCall + ) { + if (!$node->isFirstClassCallable()) { + foreach ($node->getArgs() as $arg) { + $arg_var_id = ExpressionIdentifier::getRootVarId($arg->value, $this->this_class_name); + + if ($arg_var_id) { + $this->assignment_map[$arg_var_id][$arg_var_id] = true; + } + } + } + + if ($node instanceof PhpParser\Node\Expr\MethodCall) { + $var_id = ExpressionIdentifier::getRootVarId($node->var, $this->this_class_name); + + if ($var_id) { + $this->assignment_map[$var_id]['isset'] = true; + } + } + } elseif ($node instanceof PhpParser\Node\Stmt\Unset_) { + foreach ($node->vars as $arg) { + $arg_var_id = ExpressionIdentifier::getRootVarId($arg, $this->this_class_name); + + if ($arg_var_id) { + $this->assignment_map[$arg_var_id][$arg_var_id] = true; + } + } + } + + return null; + } + + /** + * @return array> + */ + public function getAssignmentMap(): array + { + return $this->assignment_map; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php new file mode 100644 index 00000000..a57eeabd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php @@ -0,0 +1,80 @@ + + */ + protected $non_trivial_expr = []; + + private function checkNonTrivialExpr(PhpParser\Node\Expr $node): bool + { + if ($node instanceof PhpParser\Node\Expr\ArrayDimFetch + || $node instanceof PhpParser\Node\Expr\Closure + || $node instanceof PhpParser\Node\Expr\ClosureUse + || $node instanceof PhpParser\Node\Expr\Eval_ + || $node instanceof PhpParser\Node\Expr\Exit_ + || $node instanceof PhpParser\Node\Expr\Include_ + || $node instanceof PhpParser\Node\Expr\FuncCall + || $node instanceof PhpParser\Node\Expr\MethodCall + || $node instanceof PhpParser\Node\Expr\ArrowFunction + || $node instanceof PhpParser\Node\Expr\ShellExec + || $node instanceof PhpParser\Node\Expr\StaticCall + || $node instanceof PhpParser\Node\Expr\Yield_ + || $node instanceof PhpParser\Node\Expr\YieldFrom + || $node instanceof PhpParser\Node\Expr\New_ + || $node instanceof PhpParser\Node\Expr\Cast\String_ + ) { + if (($node instanceof PhpParser\Node\Expr\FuncCall + || $node instanceof PhpParser\Node\Expr\MethodCall + || $node instanceof PhpParser\Node\Expr\StaticCall) + && $node->getAttribute('pure', false) + ) { + return false; + } + + if ($node instanceof PhpParser\Node\Expr\New_ && $node->getAttribute('external_mutation_free', false)) { + return false; + } + + return true; + } + + return false; + } + + public function enterNode(PhpParser\Node $node): ?int + { + if ($node instanceof PhpParser\Node\Expr) { + // Check for Non-Trivial Expression first + if ($this->checkNonTrivialExpr($node)) { + $this->non_trivial_expr[] = $node; + return PhpParser\NodeTraverser::STOP_TRAVERSAL; + } + + if ($node instanceof PhpParser\Node\Expr\ClassConstFetch + || $node instanceof PhpParser\Node\Expr\ConstFetch + || $node instanceof PhpParser\Node\Expr\Error + || $node instanceof PhpParser\Node\Expr\PropertyFetch + || $node instanceof PhpParser\Node\Expr\StaticPropertyFetch) { + return PhpParser\NodeTraverser::STOP_TRAVERSAL; + } + } + return null; + } + + /** + * @return array + */ + public function getNonTrivialExpr(): array + { + return $this->non_trivial_expr; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php new file mode 100644 index 00000000..befd1d1a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php @@ -0,0 +1,40 @@ +getComments()) { + $node->setAttribute( + 'comments', + array_map( + /** + * @return Comment + */ + function (Comment $c): Comment { + return clone $c; + }, + $cs + ) + ); + } + + return $node; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php new file mode 100644 index 00000000..c368f377 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php @@ -0,0 +1,39 @@ +type_provider = $old_type_provider; + } + + /** + * @return Node\Expr + */ + public function enterNode(Node $node): Node + { + /** @var Expr $node */ + $origNode = $node; + + $node = clone $node; + + $node_type = $this->type_provider->getType($origNode); + + if ($node_type) { + $this->type_provider->setType($node, clone $node_type); + } + + return $node; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php new file mode 100644 index 00000000..f9515782 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php @@ -0,0 +1,28 @@ +type_provider = $type_provider; + } + + public function enterNode(PhpParser\Node $node): ?int + { + if ($node instanceof PhpParser\Node\Expr) { + $this->type_provider->clearNodeOfTypeAndAssertions($node); + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php new file mode 100644 index 00000000..dd719035 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php @@ -0,0 +1,21 @@ +count++; + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php new file mode 100644 index 00000000..7e3de329 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php @@ -0,0 +1,70 @@ + */ + private $extra_offsets; + + /** + * @param array $extra_offsets + */ + public function __construct(int $offset, int $line_offset, array $extra_offsets) + { + $this->file_offset = $offset; + $this->line_offset = $line_offset; + $this->extra_offsets = $extra_offsets; + } + + public function enterNode(PhpParser\Node $node): ?int + { + /** @var array{startFilePos: int, endFilePos: int, startLine: int} */ + $attrs = $node->getAttributes(); + + if ($cs = $node->getComments()) { + $new_comments = []; + + foreach ($cs as $c) { + if ($c instanceof PhpParser\Comment\Doc) { + $new_comments[] = new PhpParser\Comment\Doc( + $c->getText(), + $c->getStartLine() + $this->line_offset, + $c->getStartFilePos() + $this->file_offset + ($this->extra_offsets[$c->getStartFilePos()] ?? 0) + ); + } else { + $new_comments[] = new PhpParser\Comment( + $c->getText(), + $c->getStartLine() + $this->line_offset, + $c->getStartFilePos() + $this->file_offset + ($this->extra_offsets[$c->getStartFilePos()] ?? 0) + ); + } + } + + $node->setAttribute('comments', $new_comments); + } + + $node->setAttribute( + 'startFilePos', + $attrs['startFilePos'] + $this->file_offset + ($this->extra_offsets[$attrs['startFilePos']] ?? 0) + ); + $node->setAttribute( + 'endFilePos', + $attrs['endFilePos'] + $this->file_offset + ($this->extra_offsets[$attrs['endFilePos']] ?? 0) + ); + $node->setAttribute('startLine', $attrs['startLine'] + $this->line_offset); + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php new file mode 100644 index 00000000..32fe8e34 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php @@ -0,0 +1,122 @@ + */ + private $replacements = []; + + /** @var bool */ + private $new_name_replaced = false; + + /** @var bool */ + private $new_new_name_used = false; + + public function __construct(string $old_name, string $new_name) + { + $this->old_name = $old_name; + $this->new_name = $new_name; + } + + public function enterNode(PhpParser\Node $node): ?int + { + if ($node instanceof PhpParser\Node\Expr\Variable) { + if ($node->name === $this->old_name) { + $this->replacements[] = new FileManipulation( + (int) $node->getAttribute('startFilePos') + 1, + (int) $node->getAttribute('endFilePos') + 1, + $this->new_name + ); + } elseif ($node->name === $this->new_name) { + if ($this->new_new_name_used) { + $this->replacements = []; + return PhpParser\NodeTraverser::STOP_TRAVERSAL; + } + + $this->replacements[] = new FileManipulation( + (int) $node->getAttribute('startFilePos') + 1, + (int) $node->getAttribute('endFilePos') + 1, + $this->new_name . '_new' + ); + + $this->new_name_replaced = true; + } elseif ($node->name === $this->new_name . '_new') { + if ($this->new_name_replaced) { + $this->replacements = []; + return PhpParser\NodeTraverser::STOP_TRAVERSAL; + } + + $this->new_new_name_used = true; + } + } elseif ($node instanceof PhpParser\Node\Stmt\ClassMethod + && ($docblock = $node->getDocComment()) + ) { + $parsed_docblock = DocblockParser::parse( + $docblock->getText(), + $docblock->getStartFilePos() + ); + + $replaced = false; + + foreach ($parsed_docblock->tags as $tag_name => $tags) { + foreach ($tags as $i => $tag) { + if ($tag_name === 'param' + || $tag_name === 'psalm-param' + || $tag_name === 'phpstan-param' + || $tag_name === 'phan-param' + ) { + $parts = CommentAnalyzer::splitDocLine($tag); + + if (($parts[1] ?? '') === '$' . $this->old_name) { + $parsed_docblock->tags[$tag_name][$i] = str_replace( + '$' . $this->old_name, + '$' . $this->new_name, + $tag + ); + $replaced = true; + } + } + } + } + + if ($replaced) { + $this->replacements[] = new FileManipulation( + $docblock->getStartFilePos(), + $docblock->getStartFilePos() + strlen($docblock->getText()), + rtrim($parsed_docblock->render($parsed_docblock->first_line_padding)), + false, + false + ); + } + } + + return null; + } + + /** + * @return list + */ + public function getReplacements(): array + { + return $this->replacements; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php new file mode 100644 index 00000000..9734be22 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php @@ -0,0 +1,409 @@ + */ + private $offset_map; + + /** @var bool */ + private $must_rescan = false; + + /** @var int */ + private $non_method_changes; + + /** @var string */ + private $a_file_contents; + + /** @var string */ + private $b_file_contents; + + /** @var int */ + private $a_file_contents_length; + + /** @var PhpParser\Parser */ + private $parser; + + /** @var PhpParser\ErrorHandler\Collecting */ + private $error_handler; + + /** @param array $offset_map */ + public function __construct( + PhpParser\Parser $parser, + PhpParser\ErrorHandler\Collecting $error_handler, + array $offset_map, + string $a_file_contents, + string $b_file_contents + ) { + $this->parser = $parser; + $this->error_handler = $error_handler; + $this->offset_map = $offset_map; + $this->a_file_contents = $a_file_contents; + $this->a_file_contents_length = strlen($a_file_contents); + $this->b_file_contents = $b_file_contents; + $this->non_method_changes = count($offset_map); + } + + /** + * @return null|int|PhpParser\Node + */ + public function enterNode(PhpParser\Node $node, bool &$traverseChildren = true) + { + /** @var array{startFilePos: int, endFilePos: int, startLine: int} */ + $attrs = $node->getAttributes(); + + if ($cs = $node->getComments()) { + $stmt_start_pos = $cs[0]->getStartFilePos(); + } else { + $stmt_start_pos = $attrs['startFilePos']; + } + + $stmt_end_pos = $attrs['endFilePos']; + + $start_offset = 0; + $end_offset = 0; + + $line_offset = 0; + + foreach ($this->offset_map as [$a_s, $a_e, $b_s, $b_e, $line_diff]) { + if ($a_s > $stmt_end_pos) { + break; + } + + $end_offset = $b_e - $a_e; + + if ($a_s < $stmt_start_pos) { + $start_offset = $b_s - $a_s; + } + + if ($a_e < $stmt_start_pos) { + $start_offset = $end_offset; + + $line_offset = $line_diff; + + continue; + } + + if ($node instanceof PhpParser\Node\Stmt\ClassMethod + || $node instanceof PhpParser\Node\Stmt\Namespace_ + || $node instanceof PhpParser\Node\Stmt\ClassLike + ) { + if ($node instanceof PhpParser\Node\Stmt\ClassMethod) { + if ($a_s >= $stmt_start_pos && $a_e <= $stmt_end_pos) { + foreach ($this->offset_map as [$a_s2, $a_e2, $b_s2, $b_e2]) { + if ($a_s2 > $stmt_end_pos) { + break; + } + + // we have a diff that goes outside the bounds that we care about + if ($a_e2 > $stmt_end_pos) { + $this->must_rescan = true; + + return PhpParser\NodeTraverser::STOP_TRAVERSAL; + } + + $end_offset = $b_e2 - $a_e2; + + if ($a_s2 < $stmt_start_pos) { + $start_offset = $b_s2 - $a_s2; + } + + if ($a_e2 < $stmt_start_pos) { + $start_offset = $end_offset; + + $line_offset = $line_diff; + + continue; + } + + if ($a_s2 >= $stmt_start_pos && $a_e2 <= $stmt_end_pos) { + --$this->non_method_changes; + } + } + + $stmt_start_pos += $start_offset; + $stmt_end_pos += $end_offset; + + $current_line = substr_count(substr($this->b_file_contents, 0, $stmt_start_pos), "\n"); + + $method_contents = substr( + $this->b_file_contents, + $stmt_start_pos, + $stmt_end_pos - $stmt_start_pos + 1 + ); + + if (!$method_contents) { + $this->must_rescan = true; + + return PhpParser\NodeTraverser::STOP_TRAVERSAL; + } + + $error_handler = new Collecting(); + + $fake_class = '|::)(\n\s*(if|list)\s*\()/', + $fake_class, + $matches, + PREG_OFFSET_CAPTURE | PREG_SET_ORDER + ); + + foreach ($matches as $match) { + $fake_class = substr_replace( + $fake_class, + $match[1][0] . ';' . $match[2][0], + $match[0][1], + strlen($match[0][0]) + ); + + $extra_characters[] = $match[2][1]; + } + + $replacement_stmts = $this->parser->parse( + $fake_class, + $error_handler + ) ?: []; + + if (!$replacement_stmts + || !$replacement_stmts[0] instanceof PhpParser\Node\Stmt\ClassLike + || count($replacement_stmts[0]->stmts) !== 1 + ) { + $hacky_class_fix = self::balanceBrackets($fake_class); + + if ($replacement_stmts + && $replacement_stmts[0] instanceof PhpParser\Node\Stmt\ClassLike + && count($replacement_stmts[0]->stmts) !== 1 + ) { + $this->must_rescan = true; + + return PhpParser\NodeTraverser::STOP_TRAVERSAL; + } + + // changes "): {" to ") {" + $hacky_class_fix = preg_replace('/(\)[\s]*):([\s]*\{)/', '$1 $2', $hacky_class_fix); + + if ($hacky_class_fix !== $fake_class) { + $replacement_stmts = $this->parser->parse( + $hacky_class_fix, + $error_handler + ) ?: []; + } + + if (!$replacement_stmts + || !$replacement_stmts[0] instanceof PhpParser\Node\Stmt\ClassLike + || count($replacement_stmts[0]->stmts) > 1 + ) { + $this->must_rescan = true; + + return PhpParser\NodeTraverser::STOP_TRAVERSAL; + } + } + + $replacement_stmts = $replacement_stmts[0]->stmts; + + $extra_offsets = []; + + foreach ($extra_characters as $extra_offset) { + $l = strlen($fake_class); + + for ($i = $extra_offset; $i < $l; $i++) { + if (isset($extra_offsets[$i])) { + $extra_offsets[$i]--; + } else { + $extra_offsets[$i] = -1; + } + } + } + + $renumbering_traverser = new PhpParser\NodeTraverser; + $position_shifter = new OffsetShifterVisitor( + $stmt_start_pos - 15, + $current_line, + $extra_offsets + ); + $renumbering_traverser->addVisitor($position_shifter); + $replacement_stmts = $renumbering_traverser->traverse($replacement_stmts); + + if ($error_handler->hasErrors()) { + foreach ($error_handler->getErrors() as $error) { + if ($error->hasColumnInfo()) { + /** @var array{startFilePos: int, endFilePos: int} */ + $error_attrs = $error->getAttributes(); + $error = new PhpParser\Error( + $error->getRawMessage(), + [ + 'startFilePos' => $stmt_start_pos + $error_attrs['startFilePos'] - 15, + 'endFilePos' => $stmt_start_pos + $error_attrs['endFilePos'] - 15, + 'startLine' => $error->getStartLine() + $current_line + $line_offset, + ] + ); + } + + $this->error_handler->handleError($error); + } + } + + $error_handler->clearErrors(); + + $traverseChildren = false; + + return reset($replacement_stmts); + } + + $this->must_rescan = true; + + return PhpParser\NodeTraverser::STOP_TRAVERSAL; + } + + if ($node->stmts) { + /** @var int */ + $stmt_inner_start_pos = $node->stmts[0]->getAttribute('startFilePos'); + + /** @var int */ + $stmt_inner_end_pos = $node->stmts[count($node->stmts) - 1]->getAttribute('endFilePos'); + + if ($node instanceof PhpParser\Node\Stmt\ClassLike) { + /** @psalm-suppress PossiblyFalseOperand */ + $stmt_inner_start_pos = strrpos( + $this->a_file_contents, + '{', + $stmt_inner_start_pos - $this->a_file_contents_length + ) + 1; + + if ($stmt_inner_end_pos < $this->a_file_contents_length) { + $stmt_inner_end_pos = strpos($this->a_file_contents, '}', $stmt_inner_end_pos + 1); + } + } + + if ($a_s > $stmt_inner_start_pos && $a_e < $stmt_inner_end_pos) { + continue; + } + } + } + + $this->must_rescan = true; + + return PhpParser\NodeTraverser::STOP_TRAVERSAL; + } + + if ($start_offset !== 0 || $end_offset !== 0 || $line_offset !== 0) { + if ($start_offset !== 0) { + if ($cs) { + $new_comments = []; + + foreach ($cs as $c) { + if ($c instanceof PhpParser\Comment\Doc) { + $new_comments[] = new PhpParser\Comment\Doc( + $c->getText(), + $c->getStartLine() + $line_offset, + $c->getStartFilePos() + $start_offset + ); + } else { + $new_comments[] = new PhpParser\Comment( + $c->getText(), + $c->getStartLine() + $line_offset, + $c->getStartFilePos() + $start_offset + ); + } + } + + $node->setAttribute('comments', $new_comments); + + $node->setAttribute('startFilePos', $attrs['startFilePos'] + $start_offset); + } else { + $node->setAttribute('startFilePos', $stmt_start_pos + $start_offset); + } + } + + if ($end_offset !== 0) { + $node->setAttribute('endFilePos', $stmt_end_pos + $end_offset); + } + + if ($line_offset !== 0) { + $node->setAttribute('startLine', $attrs['startLine'] + $line_offset); + } + + return $node; + } + + return null; + } + + public function mustRescan(): bool + { + return $this->must_rescan || $this->non_method_changes; + } + + /** + * @psalm-pure + */ + private static function balanceBrackets(string $fake_class): string + { + $tokens = token_get_all($fake_class); + + $brace_count = 0; + + foreach ($tokens as $token) { + if ($token === '{') { + ++$brace_count; + } elseif ($token === '}') { + --$brace_count; + } + } + + if ($brace_count > 0) { + $fake_class .= str_repeat('}', $brace_count); + } + + return $fake_class; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php new file mode 100644 index 00000000..9caf12d7 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php @@ -0,0 +1,80 @@ +name instanceof PhpParser\Node\Name\FullyQualified) { + $fq_type_string = (string)$stmt->name; + } else { + $fq_type_string = ClassLikeAnalyzer::getFQCLNFromNameObject($stmt->name, $aliases); + } + + $codebase->scanner->queueClassLikeForScanning($fq_type_string); + $file_storage->referenced_classlikes[strtolower($fq_type_string)] = $fq_type_string; + + $args = []; + + foreach ($stmt->args as $arg_node) { + $key = $arg_node->name->name ?? null; + + $const_type = SimpleTypeInferer::infer( + $codebase, + new NodeDataProvider(), + $arg_node->value, + $aliases, + null, + [], + $fq_classlike_name + ); + + if (!$const_type) { + $const_type = ExpressionResolver::getUnresolvedClassConstExpr( + $arg_node->value, + $aliases, + $fq_classlike_name + ); + } + + if (!$const_type) { + $const_type = Type::getMixed(); + } + + $args[] = new AttributeArg( + $key, + $const_type, + new CodeLocation($file_scanner, $arg_node->value) + ); + } + + return new AttributeStorage( + $fq_type_string, + $args, + new CodeLocation($file_scanner, $stmt), + new CodeLocation($file_scanner, $stmt->name) + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php new file mode 100644 index 00000000..4572df37 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php @@ -0,0 +1,562 @@ +getCodebase(); + + $info = new ClassLikeDocblockComment(); + + $templates = []; + if (isset($parsed_docblock->combined_tags['template'])) { + foreach ($parsed_docblock->combined_tags['template'] as $offset => $template_line) { + $template_type = preg_split('/[\s]+/', preg_replace('@^[ \t]*\*@m', '', $template_line)); + + $template_name = array_shift($template_type); + + if (!$template_name) { + throw new IncorrectDocblockException('Empty @template tag'); + } + + $source_prefix = 'none'; + if (isset($parsed_docblock->tags['psalm-template'][$offset])) { + $source_prefix = 'psalm'; + } elseif (isset($parsed_docblock->tags['phpstan-template'][$offset])) { + $source_prefix = 'phpstan'; + } + + if (count($template_type) > 1 + && in_array(strtolower($template_type[0]), ['as', 'super', 'of'], true) + ) { + $template_modifier = strtolower(array_shift($template_type)); + $templates[$template_name][$source_prefix] = [ + $template_name, + $template_modifier, + implode(' ', $template_type), + false, + $offset - $comment->getStartFilePos() + ]; + } else { + $templates[$template_name][$source_prefix] = [ + $template_name, + null, + null, + false, + $offset - $comment->getStartFilePos() + ]; + } + } + } + + if (isset($parsed_docblock->combined_tags['template-covariant'])) { + foreach ($parsed_docblock->combined_tags['template-covariant'] as $offset => $template_line) { + $template_type = preg_split('/[\s]+/', preg_replace('@^[ \t]*\*@m', '', $template_line)); + + $template_name = array_shift($template_type); + + if (!$template_name) { + throw new IncorrectDocblockException('Empty @template-covariant tag'); + } + + $source_prefix = 'none'; + if (isset($parsed_docblock->tags['psalm-template-covariant'][$offset])) { + $source_prefix = 'psalm'; + } elseif (isset($parsed_docblock->tags['phpstan-template-covariant'][$offset])) { + $source_prefix = 'phpstan'; + } + + if (count($template_type) > 1 + && in_array(strtolower($template_type[0]), ['as', 'super', 'of'], true) + ) { + $template_modifier = strtolower(array_shift($template_type)); + $templates[$template_name][$source_prefix] = [ + $template_name, + $template_modifier, + implode(' ', $template_type), + true, + $offset - $comment->getStartFilePos() + ]; + } else { + $templates[$template_name][$source_prefix] = [ + $template_name, + null, + null, + true, + $offset - $comment->getStartFilePos() + ]; + } + } + } + + foreach ($templates as $template_entries) { + foreach (['psalm', 'phpstan', 'none'] as $source_prefix) { + if (isset($template_entries[$source_prefix])) { + $info->templates[] = $template_entries[$source_prefix]; + break; + } + } + } + + if (isset($parsed_docblock->combined_tags['extends'])) { + foreach ($parsed_docblock->combined_tags['extends'] as $template_line) { + $doc_line_parts = CommentAnalyzer::splitDocLine($template_line); + $doc_line_parts[0] = CommentAnalyzer::sanitizeDocblockType($doc_line_parts[0]); + $info->template_extends[] = $doc_line_parts[0]; + } + } + + if (isset($parsed_docblock->tags['psalm-require-extends']) + && count($extension_requirements = $parsed_docblock->tags['psalm-require-extends']) > 0) { + $info->extension_requirement = trim(preg_replace( + '@^[ \t]*\*@m', + '', + $extension_requirements[array_key_first($extension_requirements)] + )); + } + + if (isset($parsed_docblock->tags['psalm-require-implements'])) { + foreach ($parsed_docblock->tags['psalm-require-implements'] as $implementation_requirement) { + $info->implementation_requirements[] = trim(preg_replace( + '@^[ \t]*\*@m', + '', + $implementation_requirement + )); + } + } + + if (isset($parsed_docblock->combined_tags['implements'])) { + foreach ($parsed_docblock->combined_tags['implements'] as $template_line) { + $doc_line_parts = CommentAnalyzer::splitDocLine($template_line); + $doc_line_parts[0] = CommentAnalyzer::sanitizeDocblockType($doc_line_parts[0]); + $info->template_implements[] = $doc_line_parts[0]; + } + } + + if (isset($parsed_docblock->tags['psalm-yield'])) { + $yield = reset($parsed_docblock->tags['psalm-yield']); + + $info->yield = trim(preg_replace('@^[ \t]*\*@m', '', $yield)); + } + + if (isset($parsed_docblock->tags['deprecated'])) { + $info->deprecated = true; + } + + if (isset($parsed_docblock->tags['internal'])) { + $info->internal = true; + } + + if (isset($parsed_docblock->tags['final'])) { + $info->final = true; + } + + if (isset($parsed_docblock->tags['psalm-consistent-constructor'])) { + $info->consistent_constructor = true; + } + + if (isset($parsed_docblock->tags['psalm-consistent-templates'])) { + $info->consistent_templates = true; + } + + if (count($info->psalm_internal = DocblockParser::handlePsalmInternal($parsed_docblock)) !== 0) { + $info->internal = true; + } + + if (isset($parsed_docblock->tags['mixin'])) { + foreach ($parsed_docblock->tags['mixin'] as $rawMixin) { + $mixin = trim($rawMixin); + $doc_line_parts = CommentAnalyzer::splitDocLine($mixin); + $mixin = $doc_line_parts[0]; + + if ($mixin) { + $info->mixins[] = $mixin; + } else { + throw new DocblockParseException('@mixin annotation used without specifying class'); + } + } + } + + if (isset($parsed_docblock->tags['psalm-seal-properties'])) { + $info->sealed_properties = true; + } + + if (isset($parsed_docblock->tags['psalm-seal-methods'])) { + $info->sealed_methods = true; + } + + if (isset($parsed_docblock->tags['psalm-immutable']) + || isset($parsed_docblock->tags['psalm-mutation-free']) + ) { + $info->mutation_free = true; + $info->external_mutation_free = true; + $info->taint_specialize = true; + } + + if (isset($parsed_docblock->tags['psalm-external-mutation-free'])) { + $info->external_mutation_free = true; + } + + if (isset($parsed_docblock->tags['psalm-taint-specialize'])) { + $info->taint_specialize = true; + } + + if (isset($parsed_docblock->tags['psalm-override-property-visibility'])) { + $info->override_property_visibility = true; + } + + if (isset($parsed_docblock->tags['psalm-override-method-visibility'])) { + $info->override_method_visibility = true; + } + + if (isset($parsed_docblock->tags['psalm-suppress'])) { + foreach ($parsed_docblock->tags['psalm-suppress'] as $offset => $suppress_entry) { + foreach (DocComment::parseSuppressList($suppress_entry) as $issue_offset => $suppressed_issue) { + $info->suppressed_issues[$issue_offset + $offset] = $suppressed_issue; + } + } + } + + $imported_types = ($parsed_docblock->tags['phpstan-import-type'] ?? []) + + ($parsed_docblock->tags['psalm-import-type'] ?? []); + + foreach ($imported_types as $offset => $imported_type_entry) { + $info->imported_types[] = [ + 'line_number' => $comment->getStartLine() + substr_count( + $comment->getText(), + "\n", + 0, + $offset - $comment->getStartFilePos() + ), + 'start_offset' => $offset, + 'end_offset' => $offset + strlen($imported_type_entry), + 'parts' => CommentAnalyzer::splitDocLine($imported_type_entry) + ]; + } + + if (isset($parsed_docblock->combined_tags['method'])) { + foreach ($parsed_docblock->combined_tags['method'] as $offset => $method_entry) { + $method_entry = preg_replace('/[ \t]+/', ' ', trim($method_entry)); + + $docblock_lines = []; + + $is_static = false; + + $has_return = false; + + if (!preg_match('/^([a-z_A-Z][a-z_0-9A-Z]+) *\(/', $method_entry, $matches)) { + $doc_line_parts = CommentAnalyzer::splitDocLine($method_entry); + + if ($doc_line_parts[0] === 'static' && !strpos($doc_line_parts[1], '(')) { + $is_static = true; + array_shift($doc_line_parts); + } + + if (count($doc_line_parts) > 1) { + $docblock_lines[] = '@return ' . array_shift($doc_line_parts); + $has_return = true; + + $method_entry = implode(' ', $doc_line_parts); + } + } + + $method_entry = trim(preg_replace('/\/\/.*/', '', $method_entry)); + + $method_entry = preg_replace( + '/array\(([0-9a-zA-Z_\'\" ]+,)*([0-9a-zA-Z_\'\" ]+)\)/', + '[]', + $method_entry + ); + + $end_of_method_regex = '/(?create(); + } catch (TypeParseTreeException $e) { + throw new DocblockParseException($method_entry . ' is not a valid method'); + } + + if (!$method_tree instanceof MethodWithReturnTypeTree + && !$method_tree instanceof MethodTree) { + throw new DocblockParseException($method_entry . ' is not a valid method'); + } + + if ($method_tree instanceof MethodWithReturnTypeTree) { + if (!$has_return) { + $docblock_lines[] = '@return ' . TypeParser::getTypeFromTree( + $method_tree->children[1], + $codebase + )->toNamespacedString($aliases->namespace, $aliases->uses, null, false); + } + + $method_tree = $method_tree->children[0]; + } + + if (!$method_tree instanceof MethodTree) { + throw new DocblockParseException($method_entry . ' is not a valid method'); + } + + $args = []; + + foreach ($method_tree->children as $method_tree_child) { + if (!$method_tree_child instanceof MethodParamTree) { + throw new DocblockParseException($method_entry . ' is not a valid method'); + } + + $args[] = ($method_tree_child->byref ? '&' : '') + . ($method_tree_child->variadic ? '...' : '') + . $method_tree_child->name + . ($method_tree_child->default != '' ? ' = ' . $method_tree_child->default : ''); + + + if ($method_tree_child->children) { + try { + $param_type = TypeParser::getTypeFromTree($method_tree_child->children[0], $codebase); + } catch (Exception $e) { + throw new DocblockParseException( + 'Badly-formatted @method string ' . $method_entry . ' - ' . $e + ); + } + + $param_type_string = $param_type->toNamespacedString('\\', [], null, false); + $docblock_lines[] = '@param ' . $param_type_string . ' ' + . ($method_tree_child->variadic ? '...' : '') + . $method_tree_child->name; + } + } + + $function_string = 'function ' . $method_tree->value . '(' . implode(', ', $args) . ')'; + + if ($is_static) { + $function_string = 'static ' . $function_string; + } + + $function_docblock = $docblock_lines ? "/**\n * " . implode("\n * ", $docblock_lines) . "\n*/\n" : ""; + + $php_string = 'php_major_version . '.' . $codebase->php_minor_version, + $has_errors + ); + } catch (Exception $e) { + throw new DocblockParseException('Badly-formatted @method string ' . $method_entry); + } + + if (!$statements + || !$statements[0] instanceof Class_ + || !isset($statements[0]->stmts[0]) + || !$statements[0]->stmts[0] instanceof ClassMethod + ) { + throw new DocblockParseException('Badly-formatted @method string ' . $method_entry); + } + + /** @var Doc */ + $node_doc_comment = $node->getDocComment(); + + $method_offset = self::getMethodOffset($comment, $method_entry); + + $statements[0]->stmts[0]->setAttribute('startLine', $node_doc_comment->getStartLine() + $method_offset); + $statements[0]->stmts[0]->setAttribute('startFilePos', $node_doc_comment->getStartFilePos()); + $statements[0]->stmts[0]->setAttribute('endFilePos', $node->getAttribute('startFilePos')); + + if ($doc_comment = $statements[0]->stmts[0]->getDocComment()) { + $statements[0]->stmts[0]->setDocComment( + new Doc( + $doc_comment->getText(), + $comment->getStartLine() + substr_count( + $comment->getText(), + "\n", + 0, + $offset - $comment->getStartFilePos() + ), + $node_doc_comment->getStartFilePos() + ) + ); + } + + $info->methods[] = $statements[0]->stmts[0]; + } + } + + if (isset($parsed_docblock->tags['psalm-stub-override'])) { + $info->stub_override = true; + } + + if ($parsed_docblock->description) { + $info->description = $parsed_docblock->description; + } + + self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'property'); + self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'psalm-property'); + self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'property-read'); + self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'psalm-property-read'); + self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'property-write'); + self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'psalm-property-write'); + + return $info; + } + + /** + * @param array> $specials + * @param 'property'|'psalm-property'|'property-read'| + * 'psalm-property-read'|'property-write'|'psalm-property-write' $property_tag + * + * @throws DocblockParseException + * + */ + protected static function addMagicPropertyToInfo( + Doc $comment, + ClassLikeDocblockComment $info, + array $specials, + string $property_tag + ): void { + $magic_property_comments = $specials[$property_tag] ?? []; + + foreach ($magic_property_comments as $offset => $property) { + $line_parts = CommentAnalyzer::splitDocLine($property); + + if (count($line_parts) === 1 && isset($line_parts[0][0]) && $line_parts[0][0] === '$') { + continue; + } + + if (count($line_parts) > 1) { + if (preg_match('/^&?\$[A-Za-z0-9_]+,?$/', $line_parts[1]) + && $line_parts[0][0] !== '{' + ) { + $line_parts[1] = str_replace('&', '', $line_parts[1]); + + $line_parts[1] = preg_replace('/,$/', '', $line_parts[1]); + + $end = $offset + strlen($line_parts[0]); + + $line_parts[0] = str_replace("\n", '', preg_replace('@^[ \t]*\*@m', '', $line_parts[0])); + + if ($line_parts[0] === '' + || ($line_parts[0][0] === '$' + && !preg_match('/^\$this(\||$)/', $line_parts[0])) + ) { + throw new IncorrectDocblockException('Misplaced variable'); + } + + $name = trim($line_parts[1]); + + if (!preg_match('/^\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$/', $name)) { + throw new DocblockParseException('Badly-formatted @property name'); + } + + $info->properties[] = [ + 'name' => $name, + 'type' => $line_parts[0], + 'line_number' => $comment->getStartLine() + substr_count( + $comment->getText(), + "\n", + 0, + $offset - $comment->getStartFilePos() + ), + 'tag' => $property_tag, + 'start' => $offset, + 'end' => $end, + ]; + } + } else { + throw new DocblockParseException('Badly-formatted @property'); + } + } + } + + private static function getMethodOffset(Doc $comment, string $method_entry): int + { + $lines = explode("\n", $comment->getText()); + $method_offset = 0; + + foreach ($lines as $i => $line) { + if (strpos($line, $method_entry) !== false) { + $method_offset = $i; + break; + } + } + + return $method_offset; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php new file mode 100644 index 00000000..91fbfbfe --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php @@ -0,0 +1,1861 @@ + + */ + private $classlike_type_aliases = []; + + /** + * @var array> + */ + public $class_template_types = []; + + /** + * @var PhpParser\Node\Name|null + */ + private $namespace_name; + + /** + * @var Aliases + */ + private $aliases; + + /** + * @var ?ClassLikeStorage + */ + public $storage; + + /** + * @var array + */ + public $type_aliases = []; + + public function __construct( + Codebase $codebase, + FileStorage $file_storage, + FileScanner $file_scanner, + Aliases $aliases, + ?PhpParser\Node\Name $namespace_name + ) { + $this->codebase = $codebase; + $this->file_storage = $file_storage; + $this->file_scanner = $file_scanner; + $this->file_path = $file_storage->file_path; + $this->aliases = $aliases; + $this->config = Config::getInstance(); + $this->namespace_name = $namespace_name; + } + + /** + * @return false|null + */ + public function start(PhpParser\Node\Stmt\ClassLike $node): ?bool + { + $class_location = new CodeLocation($this->file_scanner, $node); + $name_location = null; + + $storage = null; + + $class_name = null; + + $is_classlike_overridden = false; + + if ($node->name === null) { + if (!$node instanceof PhpParser\Node\Stmt\Class_) { + throw new LogicException('Anonymous classes are always classes'); + } + + $fq_classlike_name = ClassAnalyzer::getAnonymousClassName($node, $this->file_path); + } else { + $name_location = new CodeLocation($this->file_scanner, $node->name); + + $fq_classlike_name = + ($this->aliases->namespace ? $this->aliases->namespace . '\\' : '') . $node->name->name; + assert($fq_classlike_name !== ""); + + $fq_classlike_name_lc = strtolower($fq_classlike_name); + + $class_name = $node->name->name; + + if ($this->codebase->classlike_storage_provider->has($fq_classlike_name_lc)) { + $duplicate_storage = $this->codebase->classlike_storage_provider->get($fq_classlike_name_lc); + + if (!$this->codebase->register_stub_files) { + if (!$duplicate_storage->stmt_location + || $duplicate_storage->stmt_location->file_path !== $this->file_path + || $class_location->getHash() !== $duplicate_storage->stmt_location->getHash() + ) { + if (IssueBuffer::accepts( + new DuplicateClass( + 'Class ' . $fq_classlike_name . ' has already been defined' + . ($duplicate_storage->location + ? ' in ' . $duplicate_storage->location->file_path + : ''), + $name_location + ) + )) { + } + + $this->file_storage->has_visitor_issues = true; + + $duplicate_storage->has_visitor_issues = true; + + return false; + } + } elseif (!$duplicate_storage->location + || $duplicate_storage->location->file_path !== $this->file_path + || $class_location->getHash() !== $duplicate_storage->location->getHash() + ) { + $is_classlike_overridden = true; + // we're overwriting some methods + $storage = $this->storage = $duplicate_storage; + $this->codebase->classlike_storage_provider->makeNew(strtolower($fq_classlike_name)); + $storage->populated = false; + $storage->class_implements = []; // we do this because reflection reports + $storage->parent_interfaces = []; + $storage->stubbed = true; + $storage->aliases = $this->aliases; + + foreach ($storage->dependent_classlikes as $dependent_name_lc => $_) { + try { + $dependent_storage = $this->codebase->classlike_storage_provider->get($dependent_name_lc); + } catch (InvalidArgumentException $exception) { + continue; + } + $dependent_storage->populated = false; + $this->codebase->classlike_storage_provider->makeNew($dependent_name_lc); + } + } + } + } + + $fq_classlike_name_lc = strtolower($fq_classlike_name); + + $this->file_storage->classlikes_in_file[$fq_classlike_name_lc] = $fq_classlike_name; + + if (!$storage) { + $this->storage = $storage = $this->codebase->classlike_storage_provider->create($fq_classlike_name); + } + + if ($class_name + && isset($this->aliases->uses[strtolower($class_name)]) + && $this->aliases->uses[strtolower($class_name)] !== $fq_classlike_name + ) { + IssueBuffer::maybeAdd( + new ParseError( + 'Class name ' . $class_name . ' clashes with a use statement alias', + $name_location ?? $class_location + ) + ); + + $storage->has_visitor_issues = true; + $this->file_storage->has_visitor_issues = true; + } + + $storage->stmt_location = $class_location; + $storage->location = $name_location; + if ($this->namespace_name) { + $storage->namespace_name_location = new CodeLocation($this->file_scanner, $this->namespace_name); + } + $storage->user_defined = !$this->codebase->register_stub_files; + $storage->stubbed = $this->codebase->register_stub_files; + $storage->aliases = $this->aliases; + + if ($node instanceof PhpParser\Node\Stmt\Class_) { + $storage->abstract = $node->isAbstract(); + $storage->final = $node->isFinal(); + + $this->codebase->classlikes->addFullyQualifiedClassName($fq_classlike_name, $this->file_path); + + if ($node->extends) { + $parent_fqcln = ClassLikeAnalyzer::getFQCLNFromNameObject($node->extends, $this->aliases); + $parent_fqcln = $this->codebase->classlikes->getUnAliasedName($parent_fqcln); + $this->codebase->scanner->queueClassLikeForScanning( + $parent_fqcln, + $this->file_scanner->will_analyze + ); + $parent_fqcln_lc = strtolower($parent_fqcln); + $storage->parent_class = $parent_fqcln; + $storage->parent_classes[$parent_fqcln_lc] = $parent_fqcln; + $this->file_storage->required_classes[strtolower($parent_fqcln)] = $parent_fqcln; + } + } elseif ($node instanceof PhpParser\Node\Stmt\Interface_) { + $storage->is_interface = true; + $this->codebase->classlikes->addFullyQualifiedInterfaceName($fq_classlike_name, $this->file_path); + + foreach ($node->extends as $interface) { + $interface_fqcln = ClassLikeAnalyzer::getFQCLNFromNameObject($interface, $this->aliases); + $interface_fqcln = $this->codebase->classlikes->getUnAliasedName($interface_fqcln); + $interface_fqcln_lc = strtolower($interface_fqcln); + $this->codebase->scanner->queueClassLikeForScanning($interface_fqcln); + $storage->parent_interfaces[$interface_fqcln_lc] = $interface_fqcln; + $storage->direct_interface_parents[$interface_fqcln_lc] = $interface_fqcln; + $this->file_storage->required_interfaces[$interface_fqcln_lc] = $interface_fqcln; + } + } elseif ($node instanceof PhpParser\Node\Stmt\Trait_) { + $storage->is_trait = true; + $this->codebase->classlikes->addFullyQualifiedTraitName($fq_classlike_name, $this->file_path); + } elseif ($node instanceof PhpParser\Node\Stmt\Enum_) { + $storage->is_enum = true; + + if ($node->scalarType) { + if ($node->scalarType->name === 'string' || $node->scalarType->name === 'int') { + $storage->enum_type = $node->scalarType->name; + } else { + IssueBuffer::maybeAdd( + new InvalidEnumBackingType( + 'Enums cannot be backed by ' . $node->scalarType->name . ', string or int expected', + new CodeLocation($this->file_scanner, $node->scalarType), + $fq_classlike_name + ) + ); + $this->file_storage->has_visitor_issues = true; + $storage->has_visitor_issues = true; + } + $storage->class_implements['backedenum'] = 'BackedEnum'; + $storage->direct_class_interfaces['backedenum'] = 'BackedEnum'; + $this->file_storage->required_interfaces['backedenum'] = 'BackedEnum'; + $this->codebase->scanner->queueClassLikeForScanning('BackedEnum'); + $storage->declaring_method_ids['from'] = new MethodIdentifier('BackedEnum', 'from'); + $storage->appearing_method_ids['from'] = $storage->declaring_method_ids['from']; + $storage->declaring_method_ids['tryfrom'] = new MethodIdentifier( + 'BackedEnum', + 'tryfrom' + ); + $storage->appearing_method_ids['tryfrom'] = $storage->declaring_method_ids['tryfrom']; + } + + $this->codebase->scanner->queueClassLikeForScanning('UnitEnum'); + $storage->class_implements['unitenum'] = 'UnitEnum'; + $storage->direct_class_interfaces['unitenum'] = 'UnitEnum'; + $this->file_storage->required_interfaces['unitenum'] = 'UnitEnum'; + $storage->final = true; + + $storage->declaring_method_ids['cases'] = new MethodIdentifier( + 'UnitEnum', + 'cases' + ); + $storage->appearing_method_ids['cases'] = $storage->declaring_method_ids['cases']; + + $this->codebase->classlikes->addFullyQualifiedEnumName($fq_classlike_name, $this->file_path); + } else { + throw new UnexpectedValueException('Unknown classlike type'); + } + + if ($node instanceof PhpParser\Node\Stmt\Class_ || $node instanceof PhpParser\Node\Stmt\Enum_) { + foreach ($node->implements as $interface) { + $interface_fqcln = ClassLikeAnalyzer::getFQCLNFromNameObject($interface, $this->aliases); + $interface_fqcln_lc = strtolower($interface_fqcln); + $this->codebase->scanner->queueClassLikeForScanning($interface_fqcln); + $storage->class_implements[$interface_fqcln_lc] = $interface_fqcln; + $storage->direct_class_interfaces[$interface_fqcln_lc] = $interface_fqcln; + $this->file_storage->required_interfaces[$interface_fqcln_lc] = $interface_fqcln; + } + } + + $docblock_info = null; + $doc_comment = $node->getDocComment(); + if ($doc_comment) { + try { + $docblock_info = ClassLikeDocblockParser::parse( + $node, + $doc_comment, + $this->aliases + ); + + $this->type_aliases += $this->getImportedTypeAliases($docblock_info, $fq_classlike_name); + } catch (DocblockParseException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $fq_classlike_name, + $name_location ?? $class_location + ); + } + } + + foreach ($node->getComments() as $comment) { + if (!$comment instanceof PhpParser\Comment\Doc) { + continue; + } + + try { + $type_aliases = self::getTypeAliasesFromComment( + $comment, + $this->aliases, + $this->type_aliases, + $fq_classlike_name + ); + + foreach ($type_aliases as $type_alias) { + // finds issues, if there are any + TypeParser::parseTokens($type_alias->replacement_tokens); + } + + $this->type_aliases += $type_aliases; + + if ($type_aliases) { + $this->classlike_type_aliases = $type_aliases; + } + } catch (DocblockParseException | TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage(), + new CodeLocation($this->file_scanner, $node, null, true) + ); + } + } + + if ($docblock_info) { + if ($docblock_info->stub_override && !$is_classlike_overridden) { + throw new InvalidClasslikeOverrideException( + 'Class/interface/trait ' . $fq_classlike_name . ' is marked as stub override,' + . ' but no original counterpart found' + ); + } + + if ($docblock_info->templates) { + $storage->template_types = []; + + usort( + $docblock_info->templates, + function (array $l, array $r): int { + return $l[4] > $r[4] ? 1 : -1; + } + ); + + foreach ($docblock_info->templates as $i => $template_map) { + $template_name = $template_map[0]; + + if ($template_map[1] !== null && $template_map[2] !== null) { + if (trim($template_map[2])) { + try { + $template_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $template_map[2], + $this->aliases, + $storage->template_types, + $this->type_aliases + ), + null, + $storage->template_types, + $this->type_aliases + ); + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $fq_classlike_name, + $name_location ?? $class_location + ); + + continue; + } + + $storage->template_types[$template_name] = [ + $fq_classlike_name => $template_type, + ]; + } else { + $storage->docblock_issues[] = new InvalidDocblock( + 'Template missing as type', + $name_location ?? $class_location + ); + } + } else { + /** @psalm-suppress PropertyTypeCoercion due to a Psalm bug */ + $storage->template_types[$template_name][$fq_classlike_name] = Type::getMixed(); + } + + $storage->template_covariants[$i] = $template_map[3]; + } + + $this->class_template_types = $storage->template_types; + } + + foreach ($docblock_info->template_extends as $extended_class_name) { + $this->extendTemplatedType($storage, $node, $extended_class_name); + } + + foreach ($docblock_info->template_implements as $implemented_class_name) { + $this->implementTemplatedType($storage, $node, $implemented_class_name); + } + + if ($docblock_info->yield) { + try { + $yield_type_tokens = TypeTokenizer::getFullyQualifiedTokens( + $docblock_info->yield, + $this->aliases, + $storage->template_types, + $this->type_aliases + ); + + $yield_type = TypeParser::parseTokens( + $yield_type_tokens, + null, + $storage->template_types ?: [], + $this->type_aliases + ); + $yield_type->setFromDocblock(); + $yield_type->queueClassLikesForScanning( + $this->codebase, + $this->file_storage, + $storage->template_types ?: [] + ); + + $storage->yield = $yield_type; + } catch (TypeParseTreeException $e) { + // do nothing + } + } + + if ($docblock_info->extension_requirement !== null) { + $storage->extension_requirement = (string) TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $docblock_info->extension_requirement, + $this->aliases, + $this->class_template_types, + $this->type_aliases + ), + null, + $this->class_template_types, + $this->type_aliases + ); + } + + foreach ($docblock_info->implementation_requirements as $implementation_requirement) { + $storage->implementation_requirements[] = (string) TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $implementation_requirement, + $this->aliases, + $this->class_template_types, + $this->type_aliases + ), + null, + $this->class_template_types, + $this->type_aliases + ); + } + + $storage->sealed_properties = $docblock_info->sealed_properties; + $storage->sealed_methods = $docblock_info->sealed_methods; + + if ($docblock_info->properties) { + foreach ($docblock_info->properties as $property) { + $pseudo_property_type_tokens = TypeTokenizer::getFullyQualifiedTokens( + $property['type'], + $this->aliases, + $this->class_template_types, + $this->type_aliases + ); + + try { + $pseudo_property_type = TypeParser::parseTokens( + $pseudo_property_type_tokens, + null, + $this->class_template_types, + $this->type_aliases + ); + $pseudo_property_type->setFromDocblock(); + $pseudo_property_type->queueClassLikesForScanning( + $this->codebase, + $this->file_storage, + $storage->template_types ?: [] + ); + + if ($property['tag'] !== 'property-read' && $property['tag'] !== 'psalm-property-read') { + $storage->pseudo_property_set_types[$property['name']] = $pseudo_property_type; + } + + if ($property['tag'] !== 'property-write' && $property['tag'] !== 'psalm-property-write') { + $storage->pseudo_property_get_types[$property['name']] = $pseudo_property_type; + } + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $fq_classlike_name, + $name_location ?? $class_location + ); + } + } + + $storage->sealed_properties = true; + } + + foreach ($docblock_info->methods as $method) { + $functionlike_node_scanner = new FunctionLikeNodeScanner( + $this->codebase, + $this->file_scanner, + $this->file_storage, + $this->aliases, + $this->type_aliases, + $this->storage, + [] + ); + + /** @var MethodStorage */ + $pseudo_method_storage = $functionlike_node_scanner->start($method, true); + $lc_method_name = strtolower($method->name->name); + + if ($pseudo_method_storage->is_static) { + $storage->pseudo_static_methods[$lc_method_name] = $pseudo_method_storage; + } else { + $storage->pseudo_methods[$lc_method_name] = $pseudo_method_storage; + $storage->declaring_pseudo_method_ids[$lc_method_name] = new MethodIdentifier( + $fq_classlike_name, + $lc_method_name + ); + } + + $storage->sealed_methods = true; + } + + + $storage->deprecated = $docblock_info->deprecated; + + if (count($docblock_info->psalm_internal) !== 0) { + $storage->internal = $docblock_info->psalm_internal; + } elseif ($docblock_info->internal && $this->aliases->namespace) { + $storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($this->aliases->namespace)]; + } + + if ($docblock_info->final && !$storage->final) { + $storage->final = true; + $storage->final_from_docblock = true; + } + + $storage->preserve_constructor_signature = $docblock_info->consistent_constructor; + + if ($storage->preserve_constructor_signature) { + $has_constructor = false; + + foreach ($node->stmts as $stmt) { + if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod + && $stmt->name->name === '__construct' + ) { + $has_constructor = true; + break; + } + } + + if (!$has_constructor) { + self::registerEmptyConstructor($storage); + } + } + + $storage->enforce_template_inheritance = $docblock_info->consistent_templates; + + foreach ($docblock_info->mixins as $key => $mixin) { + $mixin_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $mixin, + $this->aliases, + $this->class_template_types, + $this->type_aliases, + $fq_classlike_name + ), + null, + $this->class_template_types, + $this->type_aliases + ); + + $mixin_type->queueClassLikesForScanning( + $this->codebase, + $this->file_storage, + $storage->template_types ?: [] + ); + + $mixin_type->setFromDocblock(); + + if ($mixin_type->isSingle()) { + $mixin_type = $mixin_type->getSingleAtomic(); + + if ($mixin_type instanceof TNamedObject) { + $storage->namedMixins[] = $mixin_type; + } + + if ($mixin_type instanceof TTemplateParam) { + $storage->templatedMixins[] = $mixin_type; + } + } + + if ($key === 0) { + $storage->mixin_declaring_fqcln = $storage->name; + } + } + + $storage->mutation_free = $docblock_info->mutation_free; + $storage->external_mutation_free = $docblock_info->external_mutation_free; + $storage->specialize_instance = $docblock_info->taint_specialize; + + $storage->override_property_visibility = $docblock_info->override_property_visibility; + $storage->override_method_visibility = $docblock_info->override_method_visibility; + + $storage->suppressed_issues = $docblock_info->suppressed_issues; + + if ($docblock_info->description) { + $storage->description = $docblock_info->description; + } + } + + foreach ($node->stmts as $node_stmt) { + if ($node_stmt instanceof PhpParser\Node\Stmt\ClassConst) { + $this->visitClassConstDeclaration($node_stmt, $storage, $fq_classlike_name); + } elseif ($node_stmt instanceof PhpParser\Node\Stmt\EnumCase + && $node instanceof PhpParser\Node\Stmt\Enum_ + ) { + $this->visitEnumDeclaration($node_stmt, $storage, $fq_classlike_name); + } + } + + foreach ($node->stmts as $node_stmt) { + if ($node_stmt instanceof PhpParser\Node\Stmt\Property) { + $this->visitPropertyDeclaration($node_stmt, $this->config, $storage, $fq_classlike_name); + } + } + + foreach ($node->attrGroups as $attr_group) { + foreach ($attr_group->attrs as $attr) { + $attribute = AttributeResolver::resolve( + $this->codebase, + $this->file_scanner, + $this->file_storage, + $this->aliases, + $attr, + $this->storage->name ?? null + ); + + if ($attribute->fq_class_name === 'Psalm\\Deprecated' + || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Deprecated' + ) { + $storage->deprecated = true; + } + + if ($attribute->fq_class_name === 'Psalm\\Internal' && !$storage->internal) { + $storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($fq_classlike_name)]; + } + + if ($attribute->fq_class_name === 'Psalm\\Immutable' + || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Immutable' + ) { + $storage->mutation_free = true; + $storage->external_mutation_free = true; + } + + if ($attribute->fq_class_name === 'Psalm\\ExternalMutationFree') { + $storage->external_mutation_free = true; + } + + $storage->attributes[] = $attribute; + } + } + + return null; + } + + public function finish(PhpParser\Node\Stmt\ClassLike $node): ClassLikeStorage + { + if (!$this->storage) { + throw new UnexpectedValueException( + 'Storage should exist in ' . $this->file_path . ' at ' . $node->getLine() + ); + } + + $classlike_storage = $this->storage; + + $fq_classlike_name = $classlike_storage->name; + + if (PropertyMap::inPropertyMap($fq_classlike_name)) { + $mapped_properties = PropertyMap::getPropertyMap()[strtolower($fq_classlike_name)]; + + foreach ($mapped_properties as $property_name => $public_mapped_property) { + $property_type = Type::parseString($public_mapped_property); + + $property_type->queueClassLikesForScanning($this->codebase, $this->file_storage); + + if (!isset($classlike_storage->properties[$property_name])) { + $classlike_storage->properties[$property_name] = new PropertyStorage(); + } + + $classlike_storage->properties[$property_name]->type = $property_type; + + $property_id = $fq_classlike_name . '::$' . $property_name; + + $classlike_storage->declaring_property_ids[$property_name] = $fq_classlike_name; + $classlike_storage->appearing_property_ids[$property_name] = $property_id; + } + } + + $converted_aliases = array_map( + function (InlineTypeAlias $t): ?ClassTypeAlias { + try { + $union = TypeParser::parseTokens( + $t->replacement_tokens, + null, + [], + $this->type_aliases + ); + + $union->setFromDocblock(); + + return new ClassTypeAlias( + array_values($union->getAtomicTypes()) + ); + } catch (Exception $e) { + return null; + } + }, + $this->classlike_type_aliases + ); + + foreach ($converted_aliases as $key => $type) { + if (!$type) { + $classlike_storage->docblock_issues[] = new InvalidDocblock( + '@psalm-type ' . $key . ' contains invalid references', + new CodeLocation($this->file_scanner, $node, null, true) + ); + } + } + + $classlike_storage->type_aliases = array_filter($converted_aliases); + + return $classlike_storage; + } + + public function handleTraitUse(PhpParser\Node\Stmt\TraitUse $node): void + { + $storage = $this->storage; + + if (!$storage) { + throw new UnexpectedValueException('bad'); + } + + $method_map = $storage->trait_alias_map ?: []; + $visibility_map = $storage->trait_visibility_map ?: []; + $final_map = $storage->trait_final_map ?: []; + + foreach ($node->adaptations as $adaptation) { + if ($adaptation instanceof PhpParser\Node\Stmt\TraitUseAdaptation\Alias) { + $old_name = strtolower($adaptation->method->name); + $new_name = $old_name; + + if ($adaptation->newName) { + $new_name = strtolower($adaptation->newName->name); + + if ($new_name !== $old_name) { + $method_map[$new_name] = $old_name; + } + } + + if ($adaptation->newModifier) { + switch ($adaptation->newModifier) { + case 1: + $visibility_map[$new_name] = ClassLikeAnalyzer::VISIBILITY_PUBLIC; + break; + + case 2: + $visibility_map[$new_name] = ClassLikeAnalyzer::VISIBILITY_PROTECTED; + break; + + case 4: + $visibility_map[$new_name] = ClassLikeAnalyzer::VISIBILITY_PRIVATE; + break; + + case 32: + $final_map[$new_name] = true; + break; + } + } + } + } + + $storage->trait_alias_map = $method_map; + $storage->trait_visibility_map = $visibility_map; + $storage->trait_final_map = $final_map; + + foreach ($node->traits as $trait) { + $trait_fqcln = ClassLikeAnalyzer::getFQCLNFromNameObject($trait, $this->aliases); + $this->codebase->scanner->queueClassLikeForScanning($trait_fqcln, $this->file_scanner->will_analyze); + $storage->used_traits[strtolower($trait_fqcln)] = $trait_fqcln; + $this->file_storage->required_classes[strtolower($trait_fqcln)] = $trait_fqcln; + } + + if ($node_comment = $node->getDocComment()) { + $comments = DocComment::parsePreservingLength($node_comment); + + if (isset($comments->combined_tags['use'])) { + foreach ($comments->combined_tags['use'] as $template_line) { + $this->useTemplatedType( + $storage, + $node, + trim(preg_replace('@^[ \t]*\*@m', '', $template_line)) + ); + } + } + + if (isset($comments->tags['template-extends']) + || isset($comments->tags['extends']) + || isset($comments->tags['template-implements']) + || isset($comments->tags['implements']) + ) { + $storage->docblock_issues[] = new InvalidDocblock( + 'You must use @use or @template-use to parameterize traits', + new CodeLocation($this->file_scanner, $node, null, true) + ); + } + } + } + + private function extendTemplatedType( + ClassLikeStorage $storage, + PhpParser\Node\Stmt\ClassLike $node, + string $extended_class_name + ): void { + if (trim($extended_class_name) === '') { + $storage->docblock_issues[] = new InvalidDocblock( + 'Extended class cannot be empty in docblock for ' . $storage->name, + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + try { + $extended_union_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $extended_class_name, + $this->aliases, + $this->class_template_types, + $this->type_aliases + ), + null, + $this->class_template_types, + $this->type_aliases + ); + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $storage->name, + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + if (!$extended_union_type->isSingle()) { + $storage->docblock_issues[] = new InvalidDocblock( + '@template-extends cannot be a union type', + new CodeLocation($this->file_scanner, $node, null, true) + ); + } + + $extended_union_type->setFromDocblock(); + + $extended_union_type->queueClassLikesForScanning( + $this->codebase, + $this->file_storage, + $storage->template_types ?: [] + ); + + foreach ($extended_union_type->getAtomicTypes() as $atomic_type) { + if (!$atomic_type instanceof TGenericObject) { + $storage->docblock_issues[] = new InvalidDocblock( + '@template-extends has invalid class ' . $atomic_type->getId(), + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + $generic_class_lc = strtolower($atomic_type->value); + + if (!isset($storage->parent_classes[$generic_class_lc]) + && !isset($storage->parent_interfaces[$generic_class_lc]) + ) { + $storage->docblock_issues[] = new InvalidDocblock( + '@template-extends must include the name of an extended class,' + . ' got ' . $atomic_type->getId(), + new CodeLocation($this->file_scanner, $node, null, true) + ); + } + + $extended_type_parameters = []; + + $storage->template_extended_count = count($atomic_type->type_params); + + foreach ($atomic_type->type_params as $type_param) { + $extended_type_parameters[] = $type_param; + } + + $storage->template_extended_offsets[$atomic_type->value] = $extended_type_parameters; + } + } + + private function implementTemplatedType( + ClassLikeStorage $storage, + PhpParser\Node\Stmt\ClassLike $node, + string $implemented_class_name + ): void { + if (trim($implemented_class_name) === '') { + $storage->docblock_issues[] = new InvalidDocblock( + 'Extended class cannot be empty in docblock for ' . $storage->name, + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + try { + $implemented_union_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $implemented_class_name, + $this->aliases, + $this->class_template_types, + $this->type_aliases + ), + null, + $this->class_template_types, + $this->type_aliases + ); + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $storage->name, + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + if (!$implemented_union_type->isSingle()) { + $storage->docblock_issues[] = new InvalidDocblock( + '@template-implements cannot be a union type', + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + $implemented_union_type->setFromDocblock(); + + $implemented_union_type->queueClassLikesForScanning( + $this->codebase, + $this->file_storage, + $storage->template_types ?: [] + ); + + foreach ($implemented_union_type->getAtomicTypes() as $atomic_type) { + if (!$atomic_type instanceof TGenericObject) { + $storage->docblock_issues[] = new InvalidDocblock( + '@template-implements has invalid class ' . $atomic_type->getId(), + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + $generic_class_lc = strtolower($atomic_type->value); + + if (!isset($storage->class_implements[$generic_class_lc])) { + $storage->docblock_issues[] = new InvalidDocblock( + '@template-implements must include the name of an implemented class,' + . ' got ' . $atomic_type->getId(), + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + $implemented_type_parameters = []; + + $storage->template_type_implements_count[$generic_class_lc] = count($atomic_type->type_params); + + foreach ($atomic_type->type_params as $type_param) { + $implemented_type_parameters[] = $type_param; + } + + $storage->template_extended_offsets[$atomic_type->value] = $implemented_type_parameters; + } + } + + private function useTemplatedType( + ClassLikeStorage $storage, + PhpParser\Node\Stmt\TraitUse $node, + string $used_class_name + ): void { + if (trim($used_class_name) === '') { + $storage->docblock_issues[] = new InvalidDocblock( + 'Extended class cannot be empty in docblock for ' . $storage->name, + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + try { + $used_union_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $used_class_name, + $this->aliases, + $this->class_template_types, + $this->type_aliases + ), + null, + $this->class_template_types, + $this->type_aliases + ); + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $storage->name, + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + if (!$used_union_type->isSingle()) { + $storage->docblock_issues[] = new InvalidDocblock( + '@template-use cannot be a union type', + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + $used_union_type->setFromDocblock(); + + $used_union_type->queueClassLikesForScanning( + $this->codebase, + $this->file_storage, + $storage->template_types ?: [] + ); + + foreach ($used_union_type->getAtomicTypes() as $atomic_type) { + if (!$atomic_type instanceof TGenericObject) { + $storage->docblock_issues[] = new InvalidDocblock( + '@template-use has invalid class ' . $atomic_type->getId(), + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + $generic_class_lc = strtolower($atomic_type->value); + + if (!isset($storage->used_traits[$generic_class_lc])) { + $storage->docblock_issues[] = new InvalidDocblock( + '@template-use must include the name of an used class,' + . ' got ' . $atomic_type->getId(), + new CodeLocation($this->file_scanner, $node, null, true) + ); + + return; + } + + $used_type_parameters = []; + + $storage->template_type_uses_count[$generic_class_lc] = count($atomic_type->type_params); + + foreach ($atomic_type->type_params as $type_param) { + $used_type_parameters[] = $type_param; + } + + $storage->template_extended_offsets[$atomic_type->value] = $used_type_parameters; + } + } + + private static function registerEmptyConstructor(ClassLikeStorage $class_storage): void + { + $method_name_lc = '__construct'; + + if (isset($class_storage->methods[$method_name_lc])) { + return; + } + + $storage = $class_storage->methods['__construct'] = new MethodStorage(); + + $storage->cased_name = '__construct'; + $storage->defining_fqcln = $class_storage->name; + + $storage->mutation_free = $storage->external_mutation_free = true; + $storage->mutation_free_inferred = true; + + $class_storage->declaring_method_ids['__construct'] = new MethodIdentifier( + $class_storage->name, + '__construct' + ); + + $class_storage->inheritable_method_ids['__construct'] + = $class_storage->declaring_method_ids['__construct']; + $class_storage->appearing_method_ids['__construct'] + = $class_storage->declaring_method_ids['__construct']; + $class_storage->overridden_method_ids['__construct'] = []; + + $storage->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; + } + + private function visitClassConstDeclaration( + PhpParser\Node\Stmt\ClassConst $stmt, + ClassLikeStorage $storage, + string $fq_classlike_name + ): void { + $existing_constants = $storage->constants; + + $comment = $stmt->getDocComment(); + $deprecated = false; + $description = null; + $config = $this->config; + + if ($comment && $comment->getText() && ($config->use_docblock_types || $config->use_docblock_property_types)) { + $comments = DocComment::parsePreservingLength($comment); + + if (isset($comments->tags['deprecated'])) { + $deprecated = true; + } + + $description = $comments->description; + } + + foreach ($stmt->consts as $const) { + $const_type = SimpleTypeInferer::infer( + $this->codebase, + new NodeDataProvider(), + $const->value, + $this->aliases, + null, + $existing_constants, + $fq_classlike_name + ); + + if (isset($storage->constants[$const->name->name]) + || isset($storage->enum_cases[$const->name->name]) + ) { + if (IssueBuffer::accepts(new DuplicateConstant( + 'Constant names should be unique', + new CodeLocation($this->file_scanner, $const), + $fq_classlike_name + ))) { + // fall through + } + continue; + } + + $storage->constants[$const->name->name] = $constant_storage = new ClassConstantStorage( + $const_type, + $stmt->isProtected() + ? ClassLikeAnalyzer::VISIBILITY_PROTECTED + : ($stmt->isPrivate() + ? ClassLikeAnalyzer::VISIBILITY_PRIVATE + : ClassLikeAnalyzer::VISIBILITY_PUBLIC), + new CodeLocation( + $this->file_scanner, + $const->name + ) + ); + + $constant_storage->stmt_location = new CodeLocation( + $this->file_scanner, + $const + ); + + if ($const_type + && $const->value instanceof Concat + && $const_type->isSingle() + && get_class($const_type->getSingleAtomic()) === TString::class + ) { + // Prefer unresolved type over inferred string from concat, so that it can later be resolved to literal. + $const_type = null; + } + + if ($const_type) { + $existing_constants[$const->name->name] = new ClassConstantStorage( + $const_type, + $stmt->isProtected() + ? ClassLikeAnalyzer::VISIBILITY_PROTECTED + : ($stmt->isPrivate() + ? ClassLikeAnalyzer::VISIBILITY_PRIVATE + : ClassLikeAnalyzer::VISIBILITY_PUBLIC), + null + ); + } else { + $unresolved_const_expr = ExpressionResolver::getUnresolvedClassConstExpr( + $const->value, + $this->aliases, + $fq_classlike_name, + $storage->parent_class + ); + + if ($unresolved_const_expr) { + $constant_storage->unresolved_node = $unresolved_const_expr; + } else { + $constant_storage->type = Type::getMixed(); + } + } + + if ($deprecated) { + $constant_storage->deprecated = true; + } + + $constant_storage->description = $description; + + foreach ($stmt->attrGroups as $attr_group) { + foreach ($attr_group->attrs as $attr) { + $constant_storage->attributes[] = AttributeResolver::resolve( + $this->codebase, + $this->file_scanner, + $this->file_storage, + $this->aliases, + $attr, + $this->storage->name ?? null + ); + } + } + } + } + + private function visitEnumDeclaration( + PhpParser\Node\Stmt\EnumCase $stmt, + ClassLikeStorage $storage, + string $fq_classlike_name + ): void { + if (isset($storage->constants[$stmt->name->name])) { + if (IssueBuffer::accepts(new DuplicateConstant( + 'Constant names should be unique', + new CodeLocation($this->file_scanner, $stmt), + $fq_classlike_name + ))) { + // fall through + } + return; + } + + $enum_value = null; + + if ($stmt->expr !== null) { + $case_type = SimpleTypeInferer::infer( + $this->codebase, + new NodeDataProvider(), + $stmt->expr, + $this->aliases, + $this->file_scanner, + null, // enum case value expressions cannot reference constants + $fq_classlike_name + ); + + if ($case_type) { + if ($case_type->isSingleIntLiteral()) { + $enum_value = $case_type->getSingleIntLiteral()->value; + } elseif ($case_type->isSingleStringLiteral()) { + $enum_value = $case_type->getSingleStringLiteral()->value; + } else { + throw new RuntimeException( + 'Unexpected: case value for ' . $stmt->name->name . ' is ' . $case_type->getId() + ); + } + } else { + throw new RuntimeException('Failed to infer case value for ' . $stmt->name->name); + } + } + + $case_location = new CodeLocation($this->file_scanner, $stmt); + + if (!isset($storage->enum_cases[$stmt->name->name])) { + $case = new EnumCaseStorage( + $enum_value, + $case_location + ); + + $attrs = $this->getAttributeStorageFromStatement( + $this->codebase, + $this->file_scanner, + $this->file_storage, + $this->aliases, + $stmt, + $this->storage->name ?? null + ); + + foreach ($attrs as $attribute) { + if ($attribute->fq_class_name === 'Psalm\\Deprecated' + || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Deprecated' + ) { + $case->deprecated = true; + break; + } + } + + $comment = $stmt->getDocComment(); + if ($comment) { + $comments = DocComment::parsePreservingLength($comment); + + if (isset($comments->tags['deprecated'])) { + $case->deprecated = true; + } + } + $storage->enum_cases[$stmt->name->name] = $case; + } else { + if (IssueBuffer::accepts( + new DuplicateEnumCase( + 'Enum case names should be unique', + $case_location, + $fq_classlike_name + ) + )) { + } + } + } + + /** + * @param PhpParser\Node\Stmt\Property|PhpParser\Node\Stmt\EnumCase $stmt + * @return list + */ + private function getAttributeStorageFromStatement( + Codebase $codebase, + FileScanner $file_scanner, + FileStorage $file_storage, + Aliases $aliases, + PhpParser\Node\Stmt $stmt, + ?string $fq_classlike_name + ): array { + $storages = []; + foreach ($stmt->attrGroups as $attr_group) { + foreach ($attr_group->attrs as $attr) { + $storages[] = AttributeResolver::resolve( + $codebase, + $file_scanner, + $file_storage, + $aliases, + $attr, + $fq_classlike_name + ); + } + } + return $storages; + } + + /** + * @param non-empty-string $fq_classlike_name + */ + private function visitPropertyDeclaration( + PhpParser\Node\Stmt\Property $stmt, + Config $config, + ClassLikeStorage $storage, + string $fq_classlike_name + ): void { + $comment = $stmt->getDocComment(); + $var_comment = null; + + $property_is_initialized = false; + + $existing_constants = $storage->constants; + + if ($comment && $comment->getText() && ($config->use_docblock_types || $config->use_docblock_property_types)) { + if (preg_match('/[ \t\*]+@psalm-suppress[ \t]+PropertyNotSetInConstructor/', (string)$comment)) { + $property_is_initialized = true; + } + + if (preg_match('/[ \t\*]+@property[ \t]+/', (string)$comment)) { + $storage->docblock_issues[] = new InvalidDocblock( + '@property is valid only in docblocks for class', + new CodeLocation($this->file_scanner, $stmt, null, true) + ); + } + + try { + $var_comments = CommentAnalyzer::getTypeFromComment( + $comment, + $this->file_scanner, + $this->aliases, + !$stmt->isStatic() ? $this->class_template_types : [], + $this->type_aliases + ); + + $var_comment = array_pop($var_comments); + } catch (IncorrectDocblockException $e) { + $storage->docblock_issues[] = new MissingDocblockType( + $e->getMessage(), + new CodeLocation($this->file_scanner, $stmt, null, true) + ); + } catch (DocblockParseException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage(), + new CodeLocation($this->file_scanner, $stmt, null, true) + ); + } + } + + $signature_type = null; + $signature_type_location = null; + + if ($stmt->type) { + $parser_property_type = $stmt->type; + if ($parser_property_type instanceof PhpParser\Node\IntersectionType) { + throw new UnexpectedValueException('Intersection types not yet supported'); + } + /** @var Identifier|Name|NullableType|UnionType $parser_property_type */ + + $signature_type = TypeHintResolver::resolve( + $parser_property_type, + $this->codebase->scanner, + $this->file_storage, + $this->storage, + $this->aliases, + $this->codebase->php_major_version, + $this->codebase->php_minor_version + ); + + $signature_type_location = new CodeLocation( + $this->file_scanner, + $parser_property_type, + null, + false, + CodeLocation::FUNCTION_RETURN_TYPE + ); + } + + $doc_var_group_type = $var_comment->type ?? null; + + if ($doc_var_group_type) { + $doc_var_group_type->queueClassLikesForScanning($this->codebase, $this->file_storage); + $doc_var_group_type->setFromDocblock(); + } + + foreach ($stmt->props as $property) { + $doc_var_location = null; + + $property_storage = $storage->properties[$property->name->name] = new PropertyStorage(); + $property_storage->is_static = $stmt->isStatic(); + $property_storage->type = $signature_type; + $property_storage->signature_type = $signature_type; + $property_storage->signature_type_location = $signature_type_location; + $property_storage->type_location = $signature_type_location; + $property_storage->location = new CodeLocation($this->file_scanner, $property->name); + $property_storage->stmt_location = new CodeLocation($this->file_scanner, $stmt); + $property_storage->has_default = (bool)$property->default; + $property_storage->deprecated = $var_comment ? $var_comment->deprecated : false; + $property_storage->suppressed_issues = $var_comment ? $var_comment->suppressed_issues : []; + $property_storage->internal = $var_comment ? $var_comment->psalm_internal : []; + 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->allow_private_mutation = $var_comment ? $var_comment->allow_private_mutation : false; + $property_storage->description = $var_comment ? $var_comment->description : null; + + if (!$signature_type && !$doc_var_group_type) { + if ($property->default) { + $property_storage->suggested_type = SimpleTypeInferer::infer( + $this->codebase, + new NodeDataProvider(), + $property->default, + $this->aliases, + null, + $existing_constants, + $fq_classlike_name + ); + } + + $property_storage->type = null; + } else { + if ($var_comment + && $var_comment->type_start + && $var_comment->type_end + && $var_comment->line_number + ) { + $doc_var_location = new DocblockTypeLocation( + $this->file_scanner, + $var_comment->type_start, + $var_comment->type_end, + $var_comment->line_number + ); + } + + if ($doc_var_group_type) { + $property_storage->type = count($stmt->props) === 1 + ? $doc_var_group_type + : clone $doc_var_group_type; + } + } + + if ($property_storage->type + && $property_storage->type !== $property_storage->signature_type + ) { + if (!$property_storage->signature_type) { + $property_storage->type_location = $doc_var_location; + } + + if ($property_storage->signature_type) { + $all_typehint_types_match = true; + $signature_atomic_types = $property_storage->signature_type->getAtomicTypes(); + + foreach ($property_storage->type->getAtomicTypes() as $key => $type) { + if (isset($signature_atomic_types[$key])) { + $type->from_docblock = false; + } else { + $all_typehint_types_match = false; + } + } + + if ($all_typehint_types_match) { + $property_storage->type->from_docblock = false; + } + + if ($property_storage->signature_type->isNullable() + && !$property_storage->type->isNullable() + ) { + $property_storage->type->addType(new TNull()); + } + } + + $property_storage->type->queueClassLikesForScanning($this->codebase, $this->file_storage); + } + + if ($stmt->isPublic()) { + $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; + } elseif ($stmt->isProtected()) { + $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PROTECTED; + } elseif ($stmt->isPrivate()) { + $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PRIVATE; + } + + $property_id = $fq_classlike_name . '::$' . $property->name->name; + + $storage->declaring_property_ids[$property->name->name] = $fq_classlike_name; + $storage->appearing_property_ids[$property->name->name] = $property_id; + + if ($property_is_initialized) { + $storage->initialized_properties[$property->name->name] = true; + } + + if (!$stmt->isPrivate()) { + $storage->inheritable_property_ids[$property->name->name] = $property_id; + } + + $attrs = $this->getAttributeStorageFromStatement( + $this->codebase, + $this->file_scanner, + $this->file_storage, + $this->aliases, + $stmt, + $this->storage->name ?? null + ); + + foreach ($attrs as $attribute) { + if ($attribute->fq_class_name === 'Psalm\\Deprecated' + || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Deprecated' + ) { + $property_storage->deprecated = true; + } + + if ($attribute->fq_class_name === 'Psalm\\Internal' && !$property_storage->internal) { + $property_storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($fq_classlike_name)]; + } + + if ($attribute->fq_class_name === 'Psalm\\Readonly') { + $property_storage->readonly = true; + } + + $property_storage->attributes[] = $attribute; + } + } + } + + /** + * @param ClassLikeDocblockComment $comment + * @param string $fq_classlike_name + * + * @return array + */ + private function getImportedTypeAliases(ClassLikeDocblockComment $comment, string $fq_classlike_name): array + { + /** @var array $results */ + $results = []; + + foreach ($comment->imported_types as $import_type_entry) { + $imported_type_data = $import_type_entry['parts']; + $location = new DocblockTypeLocation( + $this->file_scanner, + $import_type_entry['start_offset'], + $import_type_entry['end_offset'], + $import_type_entry['line_number'] + ); + // There are two valid forms: + // @psalm-import Thing from Something + // @psalm-import Thing from Something as Alias + // but there could be leftovers after that + if (count($imported_type_data) < 3) { + $this->file_storage->docblock_issues[] = new InvalidTypeImport( + 'Invalid import in docblock for ' . $fq_classlike_name + . ', expecting " from ",' + . ' got "' . implode(' ', $imported_type_data) . '" instead.', + $location + ); + continue; + } + + if ($imported_type_data[1] === 'from' + && !empty($imported_type_data[0]) + && !empty($imported_type_data[2]) + ) { + $type_alias_name = $as_alias_name = $imported_type_data[0]; + $declaring_classlike_name = $imported_type_data[2]; + } else { + $this->file_storage->docblock_issues[] = new InvalidTypeImport( + 'Invalid import in docblock for ' . $fq_classlike_name + . ', expecting " from ", got "' + . implode( + ' ', + [$imported_type_data[0], $imported_type_data[1], $imported_type_data[2]] + ) . '" instead.', + $location + ); + continue; + } + + if (count($imported_type_data) >= 4 && $imported_type_data[3] === 'as') { + // long form + if (empty($imported_type_data[4])) { + $this->file_storage->docblock_issues[] = new InvalidTypeImport( + 'Invalid import in docblock for ' . $fq_classlike_name + . ', expecting "as ", got "' + . $imported_type_data[3] . ' ' . ($imported_type_data[4] ?? '') . '" instead.', + $location + ); + continue; + } + + $as_alias_name = $imported_type_data[4]; + } + + $declaring_fq_classlike_name = Type::getFQCLNFromString( + $declaring_classlike_name, + $this->aliases + ); + + $this->codebase->scanner->queueClassLikeForScanning($declaring_fq_classlike_name); + $this->file_storage->referenced_classlikes[strtolower($declaring_fq_classlike_name)] + = $declaring_fq_classlike_name; + + $results[$as_alias_name] = new LinkableTypeAlias( + $declaring_fq_classlike_name, + $type_alias_name, + $import_type_entry['line_number'], + $import_type_entry['start_offset'], + $import_type_entry['end_offset'] + ); + } + + return $results; + } + + /** + * @param array $type_aliases + * + * @return array + * + * @throws DocblockParseException if there was a problem parsing the docblock + */ + public static function getTypeAliasesFromComment( + PhpParser\Comment\Doc $comment, + Aliases $aliases, + ?array $type_aliases, + ?string $self_fqcln + ): array { + $parsed_docblock = DocComment::parsePreservingLength($comment); + + if (!isset($parsed_docblock->tags['psalm-type']) && !isset($parsed_docblock->tags['phpstan-type'])) { + return []; + } + + $type_alias_comment_lines = array_merge( + $parsed_docblock->tags['phpstan-type'] ?? [], + $parsed_docblock->tags['psalm-type'] ?? [] + ); + + return self::getTypeAliasesFromCommentLines( + $type_alias_comment_lines, + $aliases, + $type_aliases, + $self_fqcln + ); + } + + /** + * @param array $type_alias_comment_lines + * @param array $type_aliases + * + * @return array + * + * @throws DocblockParseException if there was a problem parsing the docblock + */ + private static function getTypeAliasesFromCommentLines( + array $type_alias_comment_lines, + Aliases $aliases, + ?array $type_aliases, + ?string $self_fqcln + ): array { + $type_alias_tokens = []; + + foreach ($type_alias_comment_lines as $var_line) { + $var_line = trim($var_line); + + if (!$var_line) { + continue; + } + + $var_line = preg_replace('/[ \t]+/', ' ', preg_replace('@^[ \t]*\*@m', '', $var_line)); + $var_line = preg_replace('/,\n\s+\}/', '}', $var_line); + $var_line = str_replace("\n", '', $var_line); + + $var_line_parts = preg_split('/( |=)/', $var_line, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + + if (!$var_line_parts) { + continue; + } + + $type_alias = array_shift($var_line_parts); + + if (!isset($var_line_parts[0])) { + continue; + } + + if ($var_line_parts[0] === ' ') { + array_shift($var_line_parts); + } + + if ($var_line_parts[0] === '=') { + array_shift($var_line_parts); + } + + if (!isset($var_line_parts[0])) { + continue; + } + + if ($var_line_parts[0] === ' ') { + array_shift($var_line_parts); + } + + $type_string = str_replace("\n", '', implode('', $var_line_parts)); + + $type_string = preg_replace('/>[^>^\}]*$/', '>', $type_string); + $type_string = preg_replace('/\}[^>^\}]*$/', '}', $type_string); + + try { + $type_tokens = TypeTokenizer::getFullyQualifiedTokens( + $type_string, + $aliases, + null, + $type_alias_tokens + $type_aliases, + $self_fqcln + ); + } catch (TypeParseTreeException $e) { + throw new DocblockParseException($type_string . ' is not a valid type'); + } + + $type_alias_tokens[$type_alias] = new InlineTypeAlias($type_tokens); + } + + return $type_alias_tokens; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php new file mode 100644 index 00000000..3cf9d029 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php @@ -0,0 +1,450 @@ +left, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + $right = self::getUnresolvedClassConstExpr( + $stmt->right, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + if (!$left || !$right) { + return null; + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Plus) { + return new UnresolvedAdditionOp($left, $right); + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Minus) { + return new UnresolvedSubtractionOp($left, $right); + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Mul) { + return new UnresolvedMultiplicationOp($left, $right); + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Div) { + return new UnresolvedDivisionOp($left, $right); + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat) { + return new UnresolvedConcatOp($left, $right); + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr) { + return new UnresolvedBitwiseOr($left, $right); + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor) { + return new UnresolvedBitwiseXor($left, $right); + } + + if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd) { + return new UnresolvedBitwiseAnd($left, $right); + } + } + + if ($stmt instanceof PhpParser\Node\Expr\Ternary) { + $cond = self::getUnresolvedClassConstExpr( + $stmt->cond, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + $if = null; + + if ($stmt->if) { + $if = self::getUnresolvedClassConstExpr( + $stmt->if, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + if ($if === null) { + $if = false; + } + } + + $else = self::getUnresolvedClassConstExpr( + $stmt->else, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + if ($cond && $else && $if !== false) { + return new UnresolvedTernary($cond, $if, $else); + } + } + + if ($stmt instanceof PhpParser\Node\Expr\ConstFetch) { + $part0_lc = strtolower($stmt->name->parts[0]); + if ($part0_lc === 'false') { + return new ScalarValue(false); + } + + if ($part0_lc === 'true') { + return new ScalarValue(true); + } + + if ($part0_lc === 'null') { + return new ScalarValue(null); + } + + if ($part0_lc === '__namespace__') { + return new ScalarValue($aliases->namespace); + } + + return new Constant( + implode('\\', $stmt->name->parts), + $stmt->name instanceof PhpParser\Node\Name\FullyQualified + ); + } + + if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Namespace_) { + return new ScalarValue($aliases->namespace); + } + + if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch && $stmt->dim) { + $left = self::getUnresolvedClassConstExpr( + $stmt->var, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + $right = self::getUnresolvedClassConstExpr( + $stmt->dim, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + if ($left && $right) { + return new ArrayOffsetFetch($left, $right); + } + } + + if ($stmt instanceof PhpParser\Node\Expr\ClassConstFetch) { + if ($stmt->class instanceof PhpParser\Node\Name + && $stmt->name instanceof PhpParser\Node\Identifier + && $fq_classlike_name + && $stmt->class->parts !== ['static'] + && ($stmt->class->parts !== ['parent'] || $parent_fq_class_name !== null) + ) { + if ($stmt->class->parts === ['self']) { + $const_fq_class_name = $fq_classlike_name; + } else { + if ($stmt->class->parts === ['parent']) { + assert($parent_fq_class_name !== null); + $const_fq_class_name = $parent_fq_class_name; + } else { + $const_fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( + $stmt->class, + $aliases + ); + } + } + + return new ClassConstant($const_fq_class_name, $stmt->name->name); + } + + return null; + } + + if ($stmt instanceof PhpParser\Node\Scalar\String_ + || $stmt instanceof PhpParser\Node\Scalar\LNumber + || $stmt instanceof PhpParser\Node\Scalar\DNumber + ) { + return new ScalarValue($stmt->value); + } + + if ($stmt instanceof PhpParser\Node\Expr\UnaryPlus) { + $right = self::getUnresolvedClassConstExpr( + $stmt->expr, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + if (!$right) { + return null; + } + + return new UnresolvedAdditionOp( + new ScalarValue(0), + $right + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\UnaryMinus) { + $right = self::getUnresolvedClassConstExpr( + $stmt->expr, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + if (!$right) { + return null; + } + + return new UnresolvedSubtractionOp( + new ScalarValue(0), + $right + ); + } + + if ($stmt instanceof PhpParser\Node\Expr\Array_) { + $items = []; + + foreach ($stmt->items as $item) { + if ($item === null) { + return null; + } + + if ($item->key) { + $item_key_type = self::getUnresolvedClassConstExpr( + $item->key, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + if (!$item_key_type) { + return null; + } + } else { + $item_key_type = null; + } + + $item_value_type = self::getUnresolvedClassConstExpr( + $item->value, + $aliases, + $fq_classlike_name, + $parent_fq_class_name + ); + + if (!$item_value_type) { + return null; + } + + if ($item->unpack) { + $items[] = new ArraySpread($item_value_type); + } else { + $items[] = new KeyValuePair($item_key_type, $item_value_type); + } + } + + return new ArrayValue($items); + } + + return null; + } + + public static function enterConditional( + Codebase $codebase, + string $file_path, + PhpParser\Node\Expr $expr + ): ?bool { + if ($expr instanceof PhpParser\Node\Expr\BooleanNot) { + $enter_negated = self::enterConditional($codebase, $file_path, $expr->expr); + + return $enter_negated === null ? null : !$enter_negated; + } + + if ($expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd) { + $enter_conditional_left = self::enterConditional($codebase, $file_path, $expr->left); + $enter_conditional_right = self::enterConditional($codebase, $file_path, $expr->right); + + return $enter_conditional_left !== false && $enter_conditional_right !== false; + } + + if ($expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr) { + $enter_conditional_left = self::enterConditional($codebase, $file_path, $expr->left); + $enter_conditional_right = self::enterConditional($codebase, $file_path, $expr->right); + + return $enter_conditional_left !== false || $enter_conditional_right !== false; + } + + if ($codebase->register_autoload_files) { + if (( + $expr instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual + || $expr instanceof PhpParser\Node\Expr\BinaryOp\Greater + || $expr instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual + || $expr instanceof PhpParser\Node\Expr\BinaryOp\Smaller + ) && ( + ( + $expr->left instanceof PhpParser\Node\Expr\ConstFetch + && $expr->left->name->parts === ['PHP_VERSION_ID'] + && $expr->right instanceof PhpParser\Node\Scalar\LNumber + ) || ( + $expr->right instanceof PhpParser\Node\Expr\ConstFetch + && $expr->right->name->parts === ['PHP_VERSION_ID'] + && $expr->left instanceof PhpParser\Node\Scalar\LNumber + ) + ) + ) { + $php_version_id = $codebase->php_major_version * 10000 + $codebase->php_minor_version * 100; + $evaluator = new ConstExprEvaluator(function (Expr $expr) use ($php_version_id) { + if ($expr instanceof ConstFetch && $expr->name->parts === ['PHP_VERSION_ID']) { + return $php_version_id; + } + throw new ConstExprEvaluationException('unexpected'); + }); + try { + return (bool) $evaluator->evaluateSilently($expr); + } catch (ConstExprEvaluationException $e) { + return null; + } + } + } + + if (!$expr instanceof PhpParser\Node\Expr\FuncCall) { + return null; + } + + return self::functionEvaluatesToTrue($codebase, $file_path, $expr); + } + + private static function functionEvaluatesToTrue( + Codebase $codebase, + string $file_path, + PhpParser\Node\Expr\FuncCall $function + ): ?bool { + if (!$function->name instanceof PhpParser\Node\Name) { + return null; + } + + if ($function->name->parts === ['function_exists'] + && isset($function->getArgs()[0]) + && $function->getArgs()[0]->value instanceof PhpParser\Node\Scalar\String_ + && function_exists($function->getArgs()[0]->value->value) + ) { + $reflection_function = new ReflectionFunction($function->getArgs()[0]->value->value); + + if ($reflection_function->isInternal()) { + return true; + } + + return false; + } + + if ($function->name->parts === ['class_exists'] + && isset($function->getArgs()[0]) + ) { + $string_value = null; + + if ($function->getArgs()[0]->value instanceof PhpParser\Node\Scalar\String_) { + $string_value = $function->getArgs()[0]->value->value; + } elseif ($function->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch + && $function->getArgs()[0]->value->class instanceof PhpParser\Node\Name + && $function->getArgs()[0]->value->name instanceof PhpParser\Node\Identifier + && strtolower($function->getArgs()[0]->value->name->name) === 'class' + ) { + $string_value = (string) $function->getArgs()[0]->value->class->getAttribute('resolvedName'); + } + + if ($string_value && class_exists($string_value)) { + $reflection_class = new ReflectionClass($string_value); + + if ($reflection_class->getFileName() !== $file_path) { + $codebase->scanner->queueClassLikeForScanning( + $string_value + ); + + return true; + } + } + + return false; + } + + if ($function->name->parts === ['interface_exists'] + && isset($function->getArgs()[0]) + ) { + $string_value = null; + + if ($function->getArgs()[0]->value instanceof PhpParser\Node\Scalar\String_) { + $string_value = $function->getArgs()[0]->value->value; + } elseif ($function->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch + && $function->getArgs()[0]->value->class instanceof PhpParser\Node\Name + && $function->getArgs()[0]->value->name instanceof PhpParser\Node\Identifier + && strtolower($function->getArgs()[0]->value->name->name) === 'class' + ) { + $string_value = (string) $function->getArgs()[0]->value->class->getAttribute('resolvedName'); + } + + if ($string_value && interface_exists($string_value)) { + $reflection_class = new ReflectionClass($string_value); + + if ($reflection_class->getFileName() !== $file_path) { + $codebase->scanner->queueClassLikeForScanning( + $string_value + ); + + return true; + } + } + + return false; + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php new file mode 100644 index 00000000..2a6dbf71 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php @@ -0,0 +1,332 @@ +will_analyze + ); + } elseif ($node instanceof PhpParser\Node\Expr\Yield_ || $node instanceof PhpParser\Node\Expr\YieldFrom) { + if ($functionlike_storage) { + $functionlike_storage->has_yield = true; + } + } elseif ($node instanceof PhpParser\Node\Expr\Cast\Object_) { + $codebase->scanner->queueClassLikeForScanning('stdClass', false, false); + $file_storage->referenced_classlikes['stdclass'] = 'stdClass'; + } elseif (($node instanceof PhpParser\Node\Expr\New_ + || $node instanceof PhpParser\Node\Expr\Instanceof_ + || $node instanceof PhpParser\Node\Expr\StaticPropertyFetch + || $node instanceof PhpParser\Node\Expr\ClassConstFetch + || $node instanceof PhpParser\Node\Expr\StaticCall) + && $node->class instanceof PhpParser\Node\Name + ) { + $fq_classlike_name = ClassLikeAnalyzer::getFQCLNFromNameObject($node->class, $aliases); + + if (!in_array(strtolower($fq_classlike_name), ['self', 'static', 'parent'], true)) { + $codebase->scanner->queueClassLikeForScanning( + $fq_classlike_name, + false, + !($node instanceof PhpParser\Node\Expr\ClassConstFetch) + || !($node->name instanceof PhpParser\Node\Identifier) + || strtolower($node->name->name) !== 'class' + ); + $file_storage->referenced_classlikes[strtolower($fq_classlike_name)] = $fq_classlike_name; + } + } elseif ($node instanceof PhpParser\Node\Expr\FuncCall && $node->name instanceof PhpParser\Node\Name) { + $function_id = implode('\\', $node->name->parts); + + if (InternalCallMapHandler::inCallMap($function_id)) { + self::registerClassMapFunctionCall( + $codebase, + $file_storage, + $file_scanner, + $aliases, + $function_id, + $node, + $functionlike_storage, + $skip_if_descendants + ); + } + } + } + + private static function registerClassMapFunctionCall( + Codebase $codebase, + FileStorage $file_storage, + FileScanner $file_scanner, + Aliases $aliases, + string $function_id, + PhpParser\Node\Expr\FuncCall $node, + ?FunctionLikeStorage $functionlike_storage, + ?int $skip_if_descendants + ): void { + $callables = InternalCallMapHandler::getCallablesFromCallMap($function_id); + + if ($callables) { + foreach ($callables as $callable) { + assert($callable->params !== null); + + foreach ($callable->params as $function_param) { + if ($function_param->type) { + $function_param->type->queueClassLikesForScanning( + $codebase, + $file_storage + ); + } + } + + if ($callable->return_type && !$callable->return_type->hasMixed()) { + $callable->return_type->queueClassLikesForScanning($codebase, $file_storage); + } + } + } + + if ($node->isFirstClassCallable()) { + return; + } + + if ($function_id === 'define') { + $first_arg_value = isset($node->getArgs()[0]) ? $node->getArgs()[0]->value : null; + $second_arg_value = isset($node->getArgs()[1]) ? $node->getArgs()[1]->value : null; + if ($first_arg_value && $second_arg_value) { + $type_provider = new NodeDataProvider(); + $const_name = ConstFetchAnalyzer::getConstName( + $first_arg_value, + $type_provider, + $codebase, + $aliases + ); + + if ($const_name !== null) { + $const_type = SimpleTypeInferer::infer( + $codebase, + $type_provider, + $second_arg_value, + $aliases + ) ?? Type::getMixed(); + + $config = Config::getInstance(); + + if ($functionlike_storage && !$config->hoist_constants) { + $functionlike_storage->defined_constants[$const_name] = $const_type; + } else { + $file_storage->constants[$const_name] = $const_type; + $file_storage->declaring_constants[$const_name] = $file_storage->file_path; + } + + if (($codebase->register_stub_files || $codebase->register_autoload_files) + && (!defined($const_name) || $const_type->isMixed()) + ) { + $codebase->addGlobalConstantType($const_name, $const_type); + } + } + } + } + + $mapping_function_ids = []; + + if (($function_id === 'array_map' && isset($node->getArgs()[0])) + || ($function_id === 'array_filter' && isset($node->getArgs()[1])) + ) { + $node_arg_value = $function_id === 'array_map' ? $node->getArgs()[0]->value : $node->getArgs()[1]->value; + + if ($node_arg_value instanceof PhpParser\Node\Scalar\String_ + || $node_arg_value instanceof PhpParser\Node\Expr\Array_ + || $node_arg_value instanceof PhpParser\Node\Expr\BinaryOp\Concat + ) { + $mapping_function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( + $file_scanner, + $node_arg_value + ); + } + + foreach ($mapping_function_ids as $potential_method_id) { + if (strpos($potential_method_id, '::') === false) { + continue; + } + + [$callable_fqcln] = explode('::', $potential_method_id); + + if (!in_array(strtolower($callable_fqcln), ['self', 'parent', 'static'], true)) { + $codebase->scanner->queueClassLikeForScanning( + $callable_fqcln + ); + } + } + } + + if ($function_id === 'func_get_arg' + || $function_id === 'func_get_args' + || $function_id === 'func_num_args' + ) { + if ($functionlike_storage) { + $functionlike_storage->variadic = true; + } + } + + if ($function_id === 'is_a' || $function_id === 'is_subclass_of') { + $second_arg = $node->getArgs()[1]->value ?? null; + + if ($second_arg instanceof PhpParser\Node\Scalar\String_) { + $codebase->scanner->queueClassLikeForScanning( + $second_arg->value + ); + } + } + + if ($function_id === 'class_alias' && !$skip_if_descendants) { + $first_arg = $node->getArgs()[0]->value ?? null; + $second_arg = $node->getArgs()[1]->value ?? null; + + if ($first_arg instanceof PhpParser\Node\Scalar\String_) { + $first_arg_value = $first_arg->value; + } elseif ($first_arg instanceof PhpParser\Node\Expr\ClassConstFetch + && $first_arg->class instanceof PhpParser\Node\Name + && $first_arg->name instanceof PhpParser\Node\Identifier + && strtolower($first_arg->name->name) === 'class' + ) { + /** @var string */ + $first_arg_value = $first_arg->class->getAttribute('resolvedName'); + } else { + $first_arg_value = null; + } + + if ($second_arg instanceof PhpParser\Node\Scalar\String_) { + $second_arg_value = $second_arg->value; + } elseif ($second_arg instanceof PhpParser\Node\Expr\ClassConstFetch + && $second_arg->class instanceof PhpParser\Node\Name + && $second_arg->name instanceof PhpParser\Node\Identifier + && strtolower($second_arg->name->name) === 'class' + ) { + /** @var string */ + $second_arg_value = $second_arg->class->getAttribute('resolvedName'); + } else { + $second_arg_value = null; + } + + if ($first_arg_value !== null && $second_arg_value !== null) { + if ($first_arg_value[0] === '\\') { + $first_arg_value = substr($first_arg_value, 1); + } + + if ($second_arg_value[0] === '\\') { + $second_arg_value = substr($second_arg_value, 1); + } + + $second_arg_value = strtolower($second_arg_value); + + $codebase->classlikes->addClassAlias( + $first_arg_value, + $second_arg_value + ); + + $file_storage->classlike_aliases[$second_arg_value] = $first_arg_value; + } + } + } + + public static function visitInclude( + Codebase $codebase, + FileStorage $file_storage, + PhpParser\Node\Expr\Include_ $stmt, + bool $scan_deep + ): void { + $config = Config::getInstance(); + + if (!$config->allow_includes) { + throw new FileIncludeException( + 'File includes are not allowed per your Psalm config - check the allowFileIncludes flag.' + ); + } + + if ($stmt->expr instanceof PhpParser\Node\Scalar\String_) { + $path_to_file = $stmt->expr->value; + + // attempts to resolve using get_include_path dirs + $include_path = IncludeAnalyzer::resolveIncludePath($path_to_file, dirname($file_storage->file_path)); + $path_to_file = $include_path ?: $path_to_file; + + if (DIRECTORY_SEPARATOR === '/') { + $is_path_relative = $path_to_file[0] !== DIRECTORY_SEPARATOR; + } else { + $is_path_relative = !preg_match('~^[A-Z]:\\\\~i', $path_to_file); + } + + if ($is_path_relative) { + $path_to_file = $config->base_dir . DIRECTORY_SEPARATOR . $path_to_file; + } + } else { + $path_to_file = IncludeAnalyzer::getPathTo( + $stmt->expr, + null, + null, + $file_storage->file_path, + $config + ); + } + + if ($path_to_file) { + $path_to_file = IncludeAnalyzer::normalizeFilePath($path_to_file); + + if ($file_storage->file_path === $path_to_file) { + return; + } + + if ($codebase->fileExists($path_to_file)) { + if ($scan_deep) { + $codebase->scanner->addFileToDeepScan($path_to_file); + } else { + $codebase->scanner->addFileToShallowScan($path_to_file); + } + + $file_storage->required_file_paths[strtolower($path_to_file)] = $path_to_file; + + return; + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php new file mode 100644 index 00000000..341d0f63 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php @@ -0,0 +1,697 @@ +getText(); + + $info = new FunctionDocblockComment(); + + self::checkDuplicatedTags($parsed_docblock); + self::checkUnexpectedTags($parsed_docblock, $info, $comment); + + if (isset($parsed_docblock->combined_tags['return'])) { + self::extractReturnType( + $comment, + $parsed_docblock->combined_tags['return'], + $info, + $code_location, + $cased_function_id + ); + } + + if (isset($parsed_docblock->combined_tags['param'])) { + foreach ($parsed_docblock->combined_tags['param'] as $offset => $param) { + $line_parts = CommentAnalyzer::splitDocLine($param); + + if (count($line_parts) === 1 && isset($line_parts[0][0]) && $line_parts[0][0] === '$') { + continue; + } + + if (count($line_parts) > 1) { + if (preg_match('/^&?(\.\.\.)?&?\$[A-Za-z0-9_]+,?$/', $line_parts[1]) + && ($line_parts[0] === '' || $line_parts[0][0] !== '{') + ) { + $line_parts[1] = str_replace('&', '', $line_parts[1]); + + $line_parts[1] = preg_replace('/,$/', '', $line_parts[1]); + + $end = $offset + strlen($line_parts[0]); + + $line_parts[0] = CommentAnalyzer::sanitizeDocblockType($line_parts[0]); + + if ($line_parts[0] === '' + || ($line_parts[0][0] === '$' + && !preg_match('/^\$this(\||$)/', $line_parts[0])) + ) { + throw new IncorrectDocblockException('Misplaced variable'); + } + + $info_param = [ + 'name' => trim($line_parts[1]), + 'type' => $line_parts[0], + 'line_number' => $comment->getStartLine() + substr_count( + $comment_text, + "\n", + 0, + $offset - $comment->getStartFilePos() + ), + 'start' => $offset, + 'end' => $end, + ]; + + if (isset($line_parts[1]) && isset($line_parts[2])) { + $description = substr($param, strlen($line_parts[0]) + strlen($line_parts[1]) + 2); + $info_param['description'] = trim($description); + // Handle multiline description. + $info_param['description'] = preg_replace( + '/\\n \\*\\s+/um', + ' ', + $info_param['description'] + ); + } + + $info->params[] = $info_param; + } + } else { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Badly-formatted @param in docblock for ' . $cased_function_id, + $code_location + ) + ); + } + } + } + + if (isset($parsed_docblock->combined_tags['param-out'])) { + foreach ($parsed_docblock->combined_tags['param-out'] as $offset => $param) { + $line_parts = CommentAnalyzer::splitDocLine($param); + + if (count($line_parts) === 1 && isset($line_parts[0][0]) && $line_parts[0][0] === '$') { + continue; + } + + if (count($line_parts) > 1) { + if (!preg_match('/\[[^\]]+\]/', $line_parts[0]) + && preg_match('/^(\.\.\.)?&?\$[A-Za-z0-9_]+,?$/', $line_parts[1]) + && $line_parts[0][0] !== '{' + ) { + if ($line_parts[1][0] === '&') { + $line_parts[1] = substr($line_parts[1], 1); + } + + $line_parts[0] = str_replace("\n", '', preg_replace('@^[ \t]*\*@m', '', $line_parts[0])); + + if ($line_parts[0] === '' + || ($line_parts[0][0] === '$' + && !preg_match('/^\$this(\||$)/', $line_parts[0])) + ) { + throw new IncorrectDocblockException('Misplaced variable'); + } + + $line_parts[1] = preg_replace('/,$/', '', $line_parts[1]); + + $info->params_out[] = [ + 'name' => trim($line_parts[1]), + 'type' => str_replace("\n", '', $line_parts[0]), + 'line_number' => $comment->getStartLine() + substr_count( + $comment_text, + "\n", + 0, + $offset - $comment->getStartFilePos() + ), + ]; + } + } else { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Badly-formatted @param in docblock for ' . $cased_function_id, + $code_location + ) + ); + } + } + } + + foreach (['psalm-self-out', 'psalm-this-out'] as $alias) { + if (isset($parsed_docblock->tags[$alias])) { + foreach ($parsed_docblock->tags[$alias] as $offset => $param) { + $line_parts = CommentAnalyzer::splitDocLine($param); + + if (count($line_parts) > 0) { + $line_parts[0] = str_replace("\n", '', preg_replace('@^[ \t]*\*@m', '', $line_parts[0])); + + $info->self_out = [ + 'type' => str_replace("\n", '', $line_parts[0]), + 'line_number' => $comment->getStartLine() + substr_count( + $comment_text, + "\n", + 0, + $offset - $comment->getStartFilePos() + ), + ]; + } + } + break; + } + } + + if (isset($parsed_docblock->tags['psalm-flow'])) { + foreach ($parsed_docblock->tags['psalm-flow'] as $param) { + $info->flows[] = trim($param); + } + } + + if (isset($parsed_docblock->tags['psalm-if-this-is'])) { + foreach ($parsed_docblock->tags['psalm-if-this-is'] as $offset => $param) { + $line_parts = CommentAnalyzer::splitDocLine($param); + + $line_parts[0] = str_replace("\n", '', preg_replace('@^[ \t]*\*@m', '', $line_parts[0])); + + $info->if_this_is = [ + 'type' => str_replace("\n", '', $line_parts[0]), + 'line_number' => $comment->getStartLine() + substr_count( + $comment->getText(), + "\n", + 0, + $offset - $comment->getStartFilePos() + ), + ]; + } + } + + if (isset($parsed_docblock->tags['psalm-taint-sink'])) { + foreach ($parsed_docblock->tags['psalm-taint-sink'] as $param) { + $param_parts = preg_split('/\s+/', trim($param)); + + if (count($param_parts) >= 2) { + $info->taint_sink_params[] = ['name' => $param_parts[1], 'taint' => $param_parts[0]]; + } + } + } + + // support for MediaWiki taint plugin + if (isset($parsed_docblock->tags['param-taint'])) { + foreach ($parsed_docblock->tags['param-taint'] as $param) { + $param_parts = preg_split('/\s+/', trim($param)); + + if (count($param_parts) === 2) { + $taint_type = $param_parts[1]; + + if (strpos($taint_type, 'exec_') === 0) { + $taint_type = substr($taint_type, 5); + + if ($taint_type === 'tainted') { + $taint_type = 'input'; + } + + if ($taint_type === 'misc') { + $taint_type = 'text'; + } + + $info->taint_sink_params[] = ['name' => $param_parts[0], 'taint' => $taint_type]; + } + } + } + } + + if (isset($parsed_docblock->tags['psalm-taint-source'])) { + foreach ($parsed_docblock->tags['psalm-taint-source'] as $param) { + $param_parts = preg_split('/\s+/', trim($param)); + + if ($param_parts[0]) { + $info->taint_source_types[] = $param_parts[0]; + } + } + } elseif (isset($parsed_docblock->tags['return-taint'])) { + // support for MediaWiki taint plugin + foreach ($parsed_docblock->tags['return-taint'] as $param) { + $param_parts = preg_split('/\s+/', trim($param)); + + if ($param_parts[0]) { + if ($param_parts[0] === 'tainted') { + $param_parts[0] = 'input'; + } + + if ($param_parts[0] === 'misc') { + $param_parts[0] = 'text'; + } + + if ($param_parts[0] !== 'none') { + $info->taint_source_types[] = $param_parts[0]; + } + } + } + } + + if (isset($parsed_docblock->tags['psalm-taint-unescape'])) { + foreach ($parsed_docblock->tags['psalm-taint-unescape'] as $param) { + $param = trim($param); + $info->added_taints[] = $param; + } + } + + if (isset($parsed_docblock->tags['psalm-taint-escape'])) { + foreach ($parsed_docblock->tags['psalm-taint-escape'] as $param) { + $param = trim($param); + if ($param[0] === '(') { + $line_parts = CommentAnalyzer::splitDocLine($param); + + $info->removed_taints[] = CommentAnalyzer::sanitizeDocblockType($line_parts[0]); + } else { + $info->removed_taints[] = explode(' ', $param)[0]; + } + } + } + + if (isset($parsed_docblock->tags['psalm-assert-untainted'])) { + foreach ($parsed_docblock->tags['psalm-assert-untainted'] as $param) { + $param = trim($param); + + $info->assert_untainted_params[] = ['name' => $param]; + } + } + + if (isset($parsed_docblock->tags['psalm-taint-specialize'])) { + $info->specialize_call = true; + } + + if (isset($parsed_docblock->tags['global'])) { + foreach ($parsed_docblock->tags['global'] as $offset => $global) { + $line_parts = CommentAnalyzer::splitDocLine($global); + + if (count($line_parts) === 1 && isset($line_parts[0][0]) && $line_parts[0][0] === '$') { + continue; + } + + if (count($line_parts) > 1) { + if (!preg_match('/\[[^\]]+\]/', $line_parts[0]) + && preg_match('/^(\.\.\.)?&?\$[A-Za-z0-9_]+,?$/', $line_parts[1]) + && $line_parts[0][0] !== '{' + ) { + if ($line_parts[1][0] === '&') { + $line_parts[1] = substr($line_parts[1], 1); + } + + if ($line_parts[0][0] === '$' && !preg_match('/^\$this(\||$)/', $line_parts[0])) { + throw new IncorrectDocblockException('Misplaced variable'); + } + + $line_parts[1] = preg_replace('/,$/', '', $line_parts[1]); + + $info->globals[] = [ + 'name' => $line_parts[1], + 'type' => $line_parts[0], + 'line_number' => $comment->getStartLine() + substr_count( + $comment_text, + "\n", + 0, + $offset - $comment->getStartFilePos() + ), + ]; + } + } else { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Badly-formatted @param in docblock for ' . $cased_function_id, + $code_location + ) + ); + } + } + } + + if (isset($parsed_docblock->tags['since'])) { + $since = trim(reset($parsed_docblock->tags['since'])); + if (preg_match('/^[4578]\.\d(\.\d+)?$/', $since)) { + $since_parts = explode('.', $since); + + $info->since_php_major_version = (int)$since_parts[0]; + $info->since_php_minor_version = (int)$since_parts[1]; + } + } + + if (isset($parsed_docblock->tags['deprecated'])) { + $info->deprecated = true; + } + + if (isset($parsed_docblock->tags['internal'])) { + $info->internal = true; + } + + if (count($info->psalm_internal = DocblockParser::handlePsalmInternal($parsed_docblock)) !== 0) { + $info->internal = true; + } + + if (isset($parsed_docblock->tags['psalm-suppress'])) { + foreach ($parsed_docblock->tags['psalm-suppress'] as $offset => $suppress_entry) { + foreach (DocComment::parseSuppressList($suppress_entry) as $issue_offset => $suppressed_issue) { + $info->suppressed_issues[$issue_offset + $offset] = $suppressed_issue; + } + } + } + + if (isset($parsed_docblock->tags['throws'])) { + foreach ($parsed_docblock->tags['throws'] as $offset => $throws_entry) { + $throws_class = preg_split('/[\s]+/', $throws_entry)[0]; + + if (!$throws_class) { + throw new IncorrectDocblockException('Unexpectedly empty @throws'); + } + + $info->throws[] = [ + $throws_class, + $offset, + $comment->getStartLine() + substr_count( + $comment->getText(), + "\n", + 0, + $offset - $comment->getStartFilePos() + ) + ]; + } + } + + if (stripos($parsed_docblock->description, '@inheritdoc') !== false + || isset($parsed_docblock->tags['inheritdoc']) + || isset($parsed_docblock->tags['inheritDoc']) + ) { + $info->inheritdoc = true; + } + + $templates = []; + if (isset($parsed_docblock->combined_tags['template'])) { + foreach ($parsed_docblock->combined_tags['template'] as $offset => $template_line) { + $template_type = preg_split('/[\s]+/', preg_replace('@^[ \t]*\*@m', '', $template_line)); + + $template_name = array_shift($template_type); + + if (!$template_name) { + throw new IncorrectDocblockException('Empty @template tag'); + } + + $source_prefix = 'none'; + if (isset($parsed_docblock->tags['psalm-template'][$offset])) { + $source_prefix = 'psalm'; + } elseif (isset($parsed_docblock->tags['phpstan-template'][$offset])) { + $source_prefix = 'phpstan'; + } + + if (count($template_type) > 1 + && in_array(strtolower($template_type[0]), ['as', 'super', 'of'], true) + ) { + $template_modifier = strtolower(array_shift($template_type)); + $templates[$template_name][$source_prefix] = [ + $template_name, + $template_modifier, + implode(' ', $template_type), + false + ]; + } else { + $templates[$template_name][$source_prefix] = [$template_name, null, null, false]; + } + } + } + + foreach ($templates as $template_entries) { + foreach (['psalm', 'phpstan', 'none'] as $source_prefix) { + if (isset($template_entries[$source_prefix])) { + $info->templates[] = $template_entries[$source_prefix]; + break; + } + } + } + + if (isset($parsed_docblock->tags['psalm-assert'])) { + foreach ($parsed_docblock->tags['psalm-assert'] as $assertion) { + $line_parts = self::sanitizeAssertionLineParts(CommentAnalyzer::splitDocLine($assertion)); + + $info->assertions[] = [ + 'type' => $line_parts[0], + 'param_name' => $line_parts[1][0] === '$' ? substr($line_parts[1], 1) : $line_parts[1], + ]; + } + } + + if (isset($parsed_docblock->tags['psalm-assert-if-true'])) { + foreach ($parsed_docblock->tags['psalm-assert-if-true'] as $assertion) { + $line_parts = self::sanitizeAssertionLineParts(CommentAnalyzer::splitDocLine($assertion)); + + $info->if_true_assertions[] = [ + 'type' => $line_parts[0], + 'param_name' => $line_parts[1][0] === '$' ? substr($line_parts[1], 1) : $line_parts[1], + ]; + } + } + + if (isset($parsed_docblock->tags['psalm-assert-if-false'])) { + foreach ($parsed_docblock->tags['psalm-assert-if-false'] as $assertion) { + $line_parts = self::sanitizeAssertionLineParts(CommentAnalyzer::splitDocLine($assertion)); + + $info->if_false_assertions[] = [ + 'type' => $line_parts[0], + 'param_name' => $line_parts[1][0] === '$' ? substr($line_parts[1], 1) : $line_parts[1], + ]; + } + } + + $info->variadic = isset($parsed_docblock->tags['psalm-variadic']); + $info->pure = isset($parsed_docblock->tags['psalm-pure']) + || isset($parsed_docblock->tags['pure']); + + if (isset($parsed_docblock->tags['psalm-mutation-free'])) { + $info->mutation_free = true; + } + + if (isset($parsed_docblock->tags['psalm-external-mutation-free'])) { + $info->external_mutation_free = true; + } + + if (isset($parsed_docblock->tags['no-named-arguments'])) { + $info->no_named_args = true; + } + + $info->ignore_nullable_return = isset($parsed_docblock->tags['psalm-ignore-nullable-return']); + $info->ignore_falsable_return = isset($parsed_docblock->tags['psalm-ignore-falsable-return']); + $info->stub_override = isset($parsed_docblock->tags['psalm-stub-override']); + + if (!empty($parsed_docblock->description)) { + $info->description = $parsed_docblock->description; + } + + return $info; + } + + /** + * @psalm-pure + * @param list $line_parts + * @return array{string, string} $line_parts + */ + private static function sanitizeAssertionLineParts(array $line_parts): array + { + if (count($line_parts) < 2 || strpos($line_parts[1], '$') === false) { + throw new IncorrectDocblockException('Misplaced variable'); + } + + $line_parts[0] = CommentAnalyzer::sanitizeDocblockType($line_parts[0]); + + if ($line_parts[1][0] === '$') { + $param_name_parts = explode('->', $line_parts[1]); + + foreach ($param_name_parts as $i => $param_name_part) { + if (substr($param_name_part, -2) === '()') { + $param_name_parts[$i] = strtolower($param_name_part); + } + } + + $line_parts[1] = implode('->', $param_name_parts); + } + + return $line_parts; + } + + /** + * @param array $return_specials + */ + private static function extractReturnType( + PhpParser\Comment\Doc $comment, + array $return_specials, + FunctionDocblockComment $info, + CodeLocation $code_location, + string $cased_function_id + ): void { + foreach ($return_specials as $offset => $return_block) { + $return_lines = explode("\n", $return_block); + + if (trim($return_lines[0]) === '') { + return; + } + + $return_block = trim($return_block); + + if ($return_block === '') { + return; + } + + $line_parts = CommentAnalyzer::splitDocLine($return_block); + + if ($line_parts[0][0] !== '{') { + if ($line_parts[0][0] === '$' && !preg_match('/^\$this(\||$)/', $line_parts[0])) { + throw new IncorrectDocblockException('Misplaced variable'); + } + + $end = $offset + strlen($line_parts[0]); + + $line_parts[0] = CommentAnalyzer::sanitizeDocblockType($line_parts[0]); + + $info->return_type = array_shift($line_parts); + $info->return_type_description = $line_parts ? implode(' ', $line_parts) : null; + + $info->return_type_line_number + = $comment->getStartLine() + substr_count( + $comment->getText(), + "\n", + 0, + $offset - $comment->getStartFilePos() + ); + $info->return_type_start = $offset; + $info->return_type_end = $end; + } else { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Badly-formatted @param in docblock for ' . $cased_function_id, + $code_location + ) + ); + } + + break; + } + } + + /** + * @throws DocblockParseException if a duplicate is found + */ + private static function checkDuplicatedTags(ParsedDocblock $parsed_docblock): void + { + if (count($parsed_docblock->tags['return'] ?? []) > 1 + || count($parsed_docblock->tags['psalm-return'] ?? []) > 1 + || count($parsed_docblock->tags['phpstan-return'] ?? []) > 1 + ) { + throw new DocblockParseException('Found duplicated @return or prefixed @return tag'); + } + + self::checkDuplicatedParams($parsed_docblock->tags['param'] ?? []); + self::checkDuplicatedParams($parsed_docblock->tags['psalm-param'] ?? []); + self::checkDuplicatedParams($parsed_docblock->tags['phpstan-param'] ?? []); + } + + /** + * @param array $param + * + * + * @throws DocblockParseException if a duplicate is found + */ + private static function checkDuplicatedParams(array $param): void + { + $list_names = self::extractAllParamNames($param); + + if (count($list_names) !== count(array_unique($list_names))) { + throw new DocblockParseException('Found duplicated @param or prefixed @param tag'); + } + } + + /** + * @param array $lines + * + * @return list + * + * @psalm-pure + */ + private static function extractAllParamNames(array $lines): array + { + $names = []; + + foreach ($lines as $line) { + $split_by_dollar = explode('$', $line, 2); + if (count($split_by_dollar) > 1) { + $split_by_space = explode(' ', $split_by_dollar[1], 2); + $names[] = $split_by_space[0]; + } + } + + return $names; + } + + private static function checkUnexpectedTags( + ParsedDocblock $parsed_docblock, + FunctionDocblockComment $info, + PhpParser\Comment\Doc $comment + ): void { + if (isset($parsed_docblock->tags['psalm-import-type'])) { + foreach ($parsed_docblock->tags['psalm-import-type'] as $offset => $_) { + $info->unexpected_tags['psalm-import-type']['lines'][] = self::docblockLineNumber($comment, $offset); + } + } + + if (isset($parsed_docblock->combined_tags['var'])) { + $info->unexpected_tags['var'] = ['lines' => [], 'suggested_replacement' => 'param']; + foreach ($parsed_docblock->combined_tags['var'] as $offset => $_) { + $info->unexpected_tags['var']['lines'][] = self::docblockLineNumber($comment, $offset); + } + } + } + + private static function docblockLineNumber(PhpParser\Comment\Doc $comment, int $offset): int + { + return $comment->getStartLine() + substr_count( + $comment->getText(), + "\n", + 0, + $offset - $comment->getStartFilePos() + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php new file mode 100644 index 00000000..d78bff90 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php @@ -0,0 +1,1454 @@ +> $existing_function_template_types + * @param array $type_aliases + */ + public static function addDocblockInfo( + Codebase $codebase, + FileScanner $file_scanner, + FileStorage $file_storage, + Aliases $aliases, + array $type_aliases, + ?ClassLikeStorage $classlike_storage, + array $existing_function_template_types, + FunctionLikeStorage $storage, + PhpParser\Node\FunctionLike $stmt, + FunctionDocblockComment $docblock_info, + bool $is_functionlike_override, + bool $fake_method, + string $cased_function_id + ): void { + self::handleUnexpectedTags($docblock_info, $storage, $stmt, $file_scanner, $cased_function_id); + + $config = Config::getInstance(); + + if ($docblock_info->mutation_free) { + $storage->mutation_free = true; + + if ($storage instanceof MethodStorage) { + $storage->external_mutation_free = true; + $storage->mutation_free_inferred = false; + } + } + + if ($storage instanceof MethodStorage && $docblock_info->external_mutation_free) { + $storage->external_mutation_free = true; + } + + if ($docblock_info->deprecated) { + $storage->deprecated = true; + } + + if (count($docblock_info->psalm_internal) !== 0) { + $storage->internal = $docblock_info->psalm_internal; + } elseif ($docblock_info->internal && $aliases->namespace) { + $storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($aliases->namespace)]; + } + + if (($storage->internal || ($classlike_storage && $classlike_storage->internal)) + && !$config->allow_internal_named_arg_calls + ) { + $storage->allow_named_arg_calls = false; + } elseif ($docblock_info->no_named_args) { + $storage->allow_named_arg_calls = false; + } + + if ($docblock_info->variadic) { + $storage->variadic = true; + } + + if ($docblock_info->pure) { + $storage->pure = true; + $storage->specialize_call = true; + $storage->mutation_free = true; + if ($storage instanceof MethodStorage) { + $storage->external_mutation_free = true; + } + } + + if ($docblock_info->specialize_call) { + $storage->specialize_call = true; + } + + // we make sure we only add ignore flag for internal stubs if the config is set to true + if ($docblock_info->ignore_nullable_return + && $storage->return_type + && ($codebase->config->ignore_internal_nullable_issues + || !in_array($file_storage->file_path, $codebase->config->internal_stubs) + ) + ) { + $storage->return_type->ignore_nullable_issues = true; + } + + // we make sure we only add ignore flag for internal stubs if the config is set to true + if ($docblock_info->ignore_falsable_return + && $storage->return_type + && ($codebase->config->ignore_internal_falsable_issues + || !in_array($file_storage->file_path, $codebase->config->internal_stubs) + ) + ) { + $storage->return_type->ignore_falsable_issues = true; + } + + if ($docblock_info->stub_override && !$is_functionlike_override) { + throw new InvalidMethodOverrideException( + 'Method ' . $cased_function_id . ' is marked as stub override,' + . ' but no original counterpart found' + ); + } + + $storage->suppressed_issues = $docblock_info->suppressed_issues; + + foreach ($docblock_info->throws as [$throw, $offset, $line]) { + $throw_location = new DocblockTypeLocation( + $file_scanner, + $offset, + $offset + strlen($throw), + $line + ); + + $class_names = array_filter(array_map('trim', explode('|', $throw))); + + foreach ($class_names as $throw_class) { + if ($throw_class !== 'self' && $throw_class !== 'static' && $throw_class !== 'parent') { + $exception_fqcln = Type::getFQCLNFromString( + $throw_class, + $aliases + ); + } else { + $exception_fqcln = $throw_class; + } + + $codebase->scanner->queueClassLikeForScanning($exception_fqcln); + $file_storage->referenced_classlikes[strtolower($exception_fqcln)] = $exception_fqcln; + $storage->throws[$exception_fqcln] = true; + $storage->throw_locations[$exception_fqcln] = $throw_location; + } + } + + if (!$config->use_docblock_types) { + return; + } + + if ($storage instanceof MethodStorage && $docblock_info->inheritdoc) { + $storage->inheritdoc = true; + } + + $template_types = $classlike_storage && $classlike_storage->template_types + ? $classlike_storage->template_types + : null; + + $function_template_types = $existing_function_template_types; + $class_template_types = $classlike_storage ? ($classlike_storage->template_types ?: []) : []; + + if ($docblock_info->templates) { + $function_template_types = self::handleTemplates( + $storage, + $docblock_info, + $aliases, + $template_types, + $type_aliases, + $file_scanner, + $stmt, + $cased_function_id + ); + } + + self::handleAssertions( + $docblock_info, + $storage, + $codebase, + $file_scanner, + $file_storage, + $aliases, + $stmt, + $class_template_types, + $function_template_types, + $type_aliases, + $classlike_storage + ); + + foreach ($docblock_info->globals as $global) { + try { + $storage->global_types[$global['name']] = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $global['type'], + $aliases, + null, + $type_aliases + ), + null + ); + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $cased_function_id, + new CodeLocation($file_scanner, $stmt, null, true) + ); + + continue; + } + } + + if ($docblock_info->params) { + self::improveParamsFromDocblock( + $codebase, + $file_scanner, + $file_storage, + $aliases, + $type_aliases, + $classlike_storage, + $storage, + $function_template_types, + $class_template_types, + $docblock_info->params, + $stmt, + $fake_method, + $classlike_storage && !$classlike_storage->is_trait ? $classlike_storage->name : null + ); + } + + if ($storage instanceof MethodStorage) { + $storage->has_docblock_param_types = (bool) array_filter( + $storage->params, + function (FunctionLikeParameter $p): bool { + return $p->type !== null && $p->has_docblock_type; + } + ); + } + + foreach ($docblock_info->params_out as $docblock_param_out) { + self::handleParamOut( + $docblock_param_out, + $aliases, + $function_template_types, + $class_template_types, + $type_aliases, + $cased_function_id, + $file_scanner, + $stmt, + $storage, + $codebase, + $file_storage + ); + } + + if ($docblock_info->self_out + && $storage instanceof MethodStorage) { + $out_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $docblock_info->self_out['type'], + $aliases, + $function_template_types + $class_template_types, + $type_aliases, + $classlike_storage ? $classlike_storage->name : null + ), + null, + $function_template_types + $class_template_types, + $type_aliases + ); + $storage->self_out_type = $out_type; + } + + if ($docblock_info->if_this_is + && $storage instanceof MethodStorage) { + $out_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $docblock_info->if_this_is['type'], + $aliases, + $function_template_types + $class_template_types, + $type_aliases, + $classlike_storage ? $classlike_storage->name : null + ), + null, + $function_template_types + $class_template_types, + $type_aliases + ); + $storage->if_this_is_type = $out_type; + } + + foreach ($docblock_info->taint_sink_params as $taint_sink_param) { + $param_name = substr($taint_sink_param['name'], 1); + + foreach ($storage->params as $param_storage) { + if ($param_storage->name === $param_name) { + $param_storage->sinks[] = $taint_sink_param['taint']; + } + } + } + + foreach ($docblock_info->taint_source_types as $taint_source_type) { + if ($taint_source_type === 'input') { + $storage->taint_source_types = array_merge( + $storage->taint_source_types, + TaintKindGroup::ALL_INPUT + ); + } else { + $storage->taint_source_types[] = $taint_source_type; + } + } + + $storage->added_taints = $docblock_info->added_taints; + + foreach ($docblock_info->removed_taints as $removed_taint) { + if ($removed_taint[0] === '(') { + self::handleRemovedTaint( + $codebase, + $stmt, + $aliases, + $removed_taint, + $function_template_types, + $class_template_types, + $type_aliases, + $storage, + $classlike_storage, + $cased_function_id, + $file_storage, + $file_scanner + ); + } else { + $storage->removed_taints[] = $removed_taint; + } + } + + self::handleTaintFlow($docblock_info, $storage); + + foreach ($docblock_info->assert_untainted_params as $untainted_assert_param) { + $param_name = substr($untainted_assert_param['name'], 1); + + foreach ($storage->params as $param_storage) { + if ($param_storage->name === $param_name) { + $param_storage->assert_untainted = true; + } + } + } + + if ($docblock_info->return_type !== null) { + self::handleReturn( + $codebase, + $docblock_info, + $docblock_info->return_type, + $fake_method, + $file_scanner, + $storage, + $stmt, + $aliases, + $function_template_types, + $class_template_types, + $type_aliases, + $classlike_storage, + $cased_function_id, + $file_storage + ); + } + + if ($docblock_info->description) { + $storage->description = $docblock_info->description; + } + } + + /** + * @param array> $template_types + * @param array|null $type_aliases + * @param array> $function_template_types + * + * @return array{ + * array, + * array> + * } + */ + private static function getConditionalSanitizedTypeTokens( + string $docblock_return_type, + Aliases $aliases, + array $template_types, + ?array $type_aliases, + FunctionLikeStorage $storage, + ?ClassLikeStorage $classlike_storage, + string $cased_function_id, + array $function_template_types + ): array { + $fixed_type_tokens = TypeTokenizer::getFullyQualifiedTokens( + $docblock_return_type, + $aliases, + $template_types, + $type_aliases, + $classlike_storage && !$classlike_storage->is_trait ? $classlike_storage->name : null + ); + + $param_type_mapping = []; + + // This checks for param references in the return type tokens + // If found, the param is replaced with a generated template param + foreach ($fixed_type_tokens as $i => $type_token) { + $token_body = $type_token[0]; + $template_function_id = 'fn-' . strtolower($cased_function_id); + + if ($token_body[0] === '$') { + foreach ($storage->params as $j => $param_storage) { + if ('$' . $param_storage->name === $token_body) { + if (!isset($param_type_mapping[$token_body])) { + $template_name = 'TGeneratedFromParam' . $j; + + $template_as_type = $param_storage->type + ? clone $param_storage->type + : Type::getMixed(); + + $storage->template_types[$template_name] = [ + $template_function_id => $template_as_type, + ]; + + $function_template_types[$template_name] + = $storage->template_types[$template_name]; + + $param_type_mapping[$token_body] = $template_name; + + $param_storage->type = new Union([ + new TTemplateParam( + $template_name, + $template_as_type, + $template_function_id + ) + ]); + } + + // 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]) + && $fixed_type_tokens[$i - 1][0][0] === ' ' + ) { + unset($fixed_type_tokens[$i - 1]); + } + + $fixed_type_tokens[$i][0] = $param_type_mapping[$token_body]; + + continue 2; + } + } + } + + if ($token_body === 'func_num_args()') { + $template_name = 'TFunctionArgCount'; + + $storage->template_types[$template_name] = [ + $template_function_id => Type::getInt(), + ]; + + $function_template_types[$template_name] + = $storage->template_types[$template_name]; + + $fixed_type_tokens[$i][0] = $template_name; + } + + if ($token_body === 'PHP_MAJOR_VERSION') { + $template_name = 'TPhpMajorVersion'; + + $storage->template_types[$template_name] = [ + $template_function_id => Type::getInt(), + ]; + + $function_template_types[$template_name] + = $storage->template_types[$template_name]; + + $fixed_type_tokens[$i][0] = $template_name; + } + + if ($token_body === 'PHP_VERSION_ID') { + $template_name = 'TPhpVersionId'; + + $storage->template_types[$template_name] = [ + $template_function_id => Type::getInt() + ]; + + $function_template_types[$template_name] + = $storage->template_types[$template_name]; + + $fixed_type_tokens[$i][0] = $template_name; + } + } + + return [$fixed_type_tokens, $function_template_types]; + } + + /** + * @param array> $class_template_types + * @param array> $function_template_types + * @param array $type_aliases + * @return non-empty-list|null + */ + private static function getAssertionParts( + Codebase $codebase, + FileScanner $file_scanner, + FileStorage $file_storage, + Aliases $aliases, + PhpParser\Node\FunctionLike $stmt, + FunctionLikeStorage $storage, + string $assertion_type, + array $class_template_types, + array $function_template_types, + array $type_aliases, + ?string $self_fqcln + ): ?array { + $prefix = ''; + + if ($assertion_type[0] === '!') { + $prefix = '!'; + $assertion_type = substr($assertion_type, 1); + } + + if ($assertion_type[0] === '~') { + $prefix .= '~'; + $assertion_type = substr($assertion_type, 1); + } + + if ($assertion_type[0] === '=') { + $prefix .= '='; + $assertion_type = substr($assertion_type, 1); + } + + $class_template_types = !$stmt instanceof PhpParser\Node\Stmt\ClassMethod || !$stmt->isStatic() + ? $class_template_types + : []; + + try { + $namespaced_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $assertion_type, + $aliases, + $function_template_types + $class_template_types, + $type_aliases, + $self_fqcln, + null, + true + ) + ); + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + 'Invalid @psalm-assert union type ' . $e, + new CodeLocation($file_scanner, $stmt, null, true) + ); + + return null; + } + + + if ($prefix && count($namespaced_type->getAtomicTypes()) > 1) { + $storage->docblock_issues[] = new InvalidDocblock( + 'Docblock assertions cannot contain | characters together with ' . $prefix, + new CodeLocation($file_scanner, $stmt, null, true) + ); + + return null; + } + + $namespaced_type->queueClassLikesForScanning( + $codebase, + $file_storage, + $function_template_types + $class_template_types + ); + + $assertion_type_parts = []; + + foreach ($namespaced_type->getAtomicTypes() as $namespaced_type_part) { + if ($namespaced_type_part instanceof TAssertionFalsy + || $namespaced_type_part instanceof TClassConstant + || ($namespaced_type_part instanceof TList + && $namespaced_type_part->type_param->isMixed()) + || ($namespaced_type_part instanceof TArray + && $namespaced_type_part->type_params[0]->isArrayKey() + && $namespaced_type_part->type_params[1]->isMixed()) + || ($namespaced_type_part instanceof TIterable + && $namespaced_type_part->type_params[0]->isMixed() + && $namespaced_type_part->type_params[1]->isMixed()) + ) { + $assertion_type_parts[] = $prefix . $namespaced_type_part->getAssertionString(); + } else { + $assertion_type_parts[] = $prefix . $namespaced_type_part->getId(); + } + } + + return $assertion_type_parts; + } + + /** + * @param array> $class_template_types + * @param array> $function_template_types + * @param array $type_aliases + * @param array< + * int, + * array{ + * type:string, + * name:string, + * line_number:int, + * start:int, + * end:int, + * description?:string + * } + * > $docblock_params + */ + private static function improveParamsFromDocblock( + Codebase $codebase, + FileScanner $file_scanner, + FileStorage $file_storage, + Aliases $aliases, + array $type_aliases, + ?ClassLikeStorage $classlike_storage, + FunctionLikeStorage $storage, + array &$function_template_types, + array $class_template_types, + array $docblock_params, + PhpParser\Node\FunctionLike $function, + bool $fake_method, + ?string $fq_classlike_name + ): void { + $base = $classlike_storage ? $classlike_storage->name . '::' : ''; + + $cased_method_id = $base . $storage->cased_name; + + $unused_docblock_params = []; + + $class_template_types = !$function instanceof PhpParser\Node\Stmt\ClassMethod || !$function->isStatic() + ? $class_template_types + : []; + + foreach ($docblock_params as $docblock_param) { + $param_name = $docblock_param['name']; + $docblock_param_variadic = false; + + if (strpos($param_name, '...') === 0) { + $docblock_param_variadic = true; + $param_name = substr($param_name, 3); + } + + $param_name = substr($param_name, 1); + + $storage_param = null; + + foreach ($storage->params as $function_signature_param) { + if ($function_signature_param->name === $param_name) { + $storage_param = $function_signature_param; + break; + } + } + + if (!$fake_method) { + $docblock_type_location = new DocblockTypeLocation( + $file_scanner, + $docblock_param['start'], + $docblock_param['end'], + $docblock_param['line_number'] + ); + } else { + $docblock_type_location = new CodeLocation( + $file_scanner, + $function, + null, + false, + CodeLocation::FUNCTION_PHPDOC_METHOD, + null + ); + } + + if ($storage_param === null) { + $param_location = new CodeLocation( + $file_scanner, + $function, + null, + true, + CodeLocation::FUNCTION_PARAM_VAR + ); + + $param_location->setCommentLine($docblock_param['line_number']); + $unused_docblock_params[$param_name] = $param_location; + + if (!$docblock_param_variadic || $storage->params || $file_scanner->will_analyze) { + continue; + } + + $storage_param = new FunctionLikeParameter( + $param_name, + false, + null, + null, + null, + false, + false, + true, + null + ); + + $storage->addParam($storage_param); + } + + try { + $new_param_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $docblock_param['type'], + $aliases, + $function_template_types + $class_template_types, + $type_aliases, + $fq_classlike_name + ), + null, + $function_template_types + $class_template_types, + $type_aliases + ); + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $cased_method_id, + $docblock_type_location + ); + + continue; + } + + $storage_param->has_docblock_type = true; + $new_param_type->setFromDocblock(); + + $new_param_type->queueClassLikesForScanning( + $codebase, + $file_storage, + $storage->template_types ?: [] + ); + + if ($storage->template_types) { + foreach ($storage->template_types as $t => $type_map) { + foreach ($type_map as $obj => $type) { + if ($type->isMixed() && $docblock_param['type'] === 'class-string<' . $t . '>') { + $storage->template_types[$t][$obj] = Type::getObject(); + + if (isset($function_template_types[$t])) { + $function_template_types[$t][$obj] = $storage->template_types[$t][$obj]; + } + } + } + } + } + + if (!$docblock_param_variadic && $storage_param->is_variadic && $new_param_type->hasArray()) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TKeyedArray|TList + */ + $array_type = $new_param_type->getAtomicTypes()['array']; + + if ($array_type instanceof TKeyedArray) { + $new_param_type = $array_type->getGenericValueType(); + } elseif ($array_type instanceof TList) { + $new_param_type = $array_type->type_param; + } else { + $new_param_type = $array_type->type_params[1]; + } + } + + $existing_param_type_nullable = $storage_param->is_nullable; + + if (isset($docblock_param['description'])) { + $storage_param->description = $docblock_param['description']; + } + + if (!$storage_param->type || $storage_param->type->hasMixed() || $storage->template_types) { + if ($existing_param_type_nullable + && !$new_param_type->isNullable() + && !$new_param_type->hasTemplate() + ) { + $new_param_type->addType(new TNull()); + } + + $config = Config::getInstance(); + + if ($config->add_param_default_to_docblock_type + && $storage_param->default_type instanceof Union + && !$storage_param->default_type->hasMixed() + && (!$storage_param->type || !$storage_param->type->hasMixed()) + ) { + $new_param_type = Type::combineUnionTypes($new_param_type, $storage_param->default_type); + } + + $storage_param->type = $new_param_type; + $storage_param->type_location = $docblock_type_location; + continue; + } + + $storage_param_atomic_types = $storage_param->type->getAtomicTypes(); + + $all_typehint_types_match = true; + + foreach ($new_param_type->getAtomicTypes() as $key => $type) { + if (isset($storage_param_atomic_types[$key])) { + $type->from_docblock = false; + + if ($storage_param_atomic_types[$key] instanceof TArray + && $type instanceof TArray + && $type->type_params[0]->hasArrayKey() + ) { + $type->type_params[0]->from_docblock = false; + } + } else { + $all_typehint_types_match = false; + } + } + + if ($all_typehint_types_match) { + $new_param_type->from_docblock = false; + } + + if ($existing_param_type_nullable && !$new_param_type->isNullable()) { + $new_param_type->addType(new TNull()); + } + + $storage_param->type = $new_param_type; + $storage_param->type_location = $docblock_type_location; + } + + $params_without_docblock_type = array_filter( + $storage->params, + function (FunctionLikeParameter $p): bool { + return !$p->has_docblock_type && (!$p->type || $p->type->hasArray()); + } + ); + + if ($params_without_docblock_type) { + $storage->unused_docblock_params = $unused_docblock_params; + } + } + + /** + * @param array $type_aliases + * @param array> $function_template_types + * @param array> $class_template_types + */ + private static function handleReturn( + Codebase $codebase, + FunctionDocblockComment $docblock_info, + string $docblock_return_type, + bool $fake_method, + FileScanner $file_scanner, + FunctionLikeStorage $storage, + PhpParser\Node\FunctionLike $stmt, + Aliases $aliases, + array $function_template_types, + array $class_template_types, + array $type_aliases, + ?ClassLikeStorage $classlike_storage, + string $cased_function_id, + FileStorage $file_storage + ): void { + if (!$fake_method + && $docblock_info->return_type_line_number + && $docblock_info->return_type_start + && $docblock_info->return_type_end + ) { + $storage->return_type_location = new DocblockTypeLocation( + $file_scanner, + $docblock_info->return_type_start, + $docblock_info->return_type_end, + $docblock_info->return_type_line_number + ); + } else { + $storage->return_type_location = new CodeLocation( + $file_scanner, + $stmt, + null, + false, + !$fake_method + ? CodeLocation::FUNCTION_PHPDOC_RETURN_TYPE + : CodeLocation::FUNCTION_PHPDOC_METHOD, + $docblock_info->return_type + ); + } + + try { + [$fixed_type_tokens, $function_template_types] = self::getConditionalSanitizedTypeTokens( + $docblock_return_type, + $aliases, + $function_template_types + $class_template_types, + $type_aliases, + $storage, + $classlike_storage, + $cased_function_id, + $function_template_types + ); + + $storage->return_type = TypeParser::parseTokens( + array_values($fixed_type_tokens), + null, + $function_template_types + $class_template_types, + $type_aliases + ); + + $storage->return_type->setFromDocblock(); + + if ($storage instanceof MethodStorage) { + $storage->has_docblock_return_type = true; + } + + if ($storage->signature_return_type) { + $all_typehint_types_match = true; + $signature_return_atomic_types = $storage->signature_return_type->getAtomicTypes(); + + foreach ($storage->return_type->getAtomicTypes() as $key => $type) { + if (isset($signature_return_atomic_types[$key])) { + $type->from_docblock = false; + } else { + $all_typehint_types_match = false; + } + } + + if ($all_typehint_types_match) { + $storage->return_type->from_docblock = false; + + if ($storage instanceof MethodStorage) { + $storage->has_docblock_return_type = true; + } + } + + // if the signature type contains null, we add null into the final return type too + if ($storage->signature_return_type->isNullable() + && !$storage->return_type->isNullable() + && !$storage->return_type->hasTemplate() + && !$storage->return_type->hasConditional() + ) { + //don't add null to final type if signature type don't match the docblock type + // however, we can't check for object types at this point (#6931), so we'll assume it's ok + if ($storage->return_type->hasObjectType() || + UnionTypeComparator::isContainedBy( + $codebase, + $storage->return_type, + $storage->signature_return_type + ) + ) { + $storage->return_type->addType(new TNull()); + } + } + } + + $storage->return_type->queueClassLikesForScanning($codebase, $file_storage); + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $cased_function_id, + new CodeLocation($file_scanner, $stmt, null, true) + ); + } + + // we make sure we only add ignore flag for internal stubs if the config is set to true + if ($docblock_info->ignore_nullable_return + && $storage->return_type + && ($codebase->config->ignore_internal_nullable_issues + || !in_array($file_storage->file_path, $codebase->config->internal_stubs) + ) + ) { + $storage->return_type->ignore_nullable_issues = true; + } + + // we make sure we only add ignore flag for internal stubs if the config is set to true + if ($docblock_info->ignore_falsable_return + && $storage->return_type + && ($codebase->config->ignore_internal_falsable_issues + || !in_array($file_storage->file_path, $codebase->config->internal_stubs) + ) + ) { + $storage->return_type->ignore_falsable_issues = true; + } + + if ($stmt->returnsByRef() && $storage->return_type) { + $storage->return_type->by_ref = true; + } + + if ($docblock_info->return_type_line_number && !$fake_method) { + $storage->return_type_location->setCommentLine($docblock_info->return_type_line_number); + } + + $storage->return_type_description = $docblock_info->return_type_description; + } + + private static function handleTaintFlow( + FunctionDocblockComment $docblock_info, + FunctionLikeStorage $storage + ): void { + if ($docblock_info->flows) { + foreach ($docblock_info->flows as $flow) { + $path_type = 'arg'; + + $fancy_path_regex = '/-\(([a-z\-]+)\)->/'; + + if (preg_match($fancy_path_regex, $flow, $matches)) { + if (isset($matches[1])) { + $path_type = $matches[1]; + } + + $flow = preg_replace($fancy_path_regex, '->', $flow); + } + + $flow_parts = explode('->', $flow); + + if (isset($flow_parts[1]) && trim($flow_parts[1]) === 'return') { + $source_param_string = trim($flow_parts[0]); + + if ($source_param_string[0] === '(' && substr($source_param_string, -1) === ')') { + $source_params = preg_split('/, ?/', substr($source_param_string, 1, -1)); + + foreach ($source_params as $source_param) { + $source_param = substr($source_param, 1); + + foreach ($storage->params as $i => $param_storage) { + if ($param_storage->name === $source_param) { + $storage->return_source_params[$i] = $path_type; + } + } + } + } + } + + if (isset($flow_parts[0]) && strpos(trim($flow_parts[0]), 'proxy') === 0) { + $proxy_call = trim(substr($flow_parts[0], strlen('proxy'))); + [$fully_qualified_name, $source_param_string] = explode('(', $proxy_call, 2); + + if (!empty($fully_qualified_name) && !empty($source_param_string)) { + $source_params = preg_split('/, ?/', substr($source_param_string, 0, -1)) ?: []; + $call_params = []; + foreach ($source_params as $source_param) { + $source_param = substr($source_param, 1); + + foreach ($storage->params as $i => $param_storage) { + if ($param_storage->name === $source_param) { + $call_params[] = $i; + } + } + } + + if ($storage->proxy_calls === null) { + $storage->proxy_calls = []; + } + + $storage->proxy_calls[] = [ + 'fqn' => $fully_qualified_name, + 'params' => $call_params, + 'return' => isset($flow_parts[1]) && trim($flow_parts[1]) === 'return' + ]; + } + } + } + } + } + + /** + * @param array $type_aliases + * @param array> $function_template_types + * @param array> $class_template_types + */ + private static function handleRemovedTaint( + Codebase $codebase, + PhpParser\Node\FunctionLike $stmt, + Aliases $aliases, + string $removed_taint, + array $function_template_types, + array $class_template_types, + array $type_aliases, + FunctionLikeStorage $storage, + ?ClassLikeStorage $classlike_storage, + string $cased_function_id, + FileStorage $file_storage, + FileScanner $file_scanner + ): void { + try { + [$fixed_type_tokens, $function_template_types] = self::getConditionalSanitizedTypeTokens( + $removed_taint, + $aliases, + $function_template_types + $class_template_types, + $type_aliases, + $storage, + $classlike_storage, + $cased_function_id, + $function_template_types + ); + + $removed_taint = TypeParser::parseTokens( + array_values($fixed_type_tokens), + null, + $function_template_types + $class_template_types, + $type_aliases + ); + + $removed_taint->queueClassLikesForScanning($codebase, $file_storage); + + $removed_taint_single = $removed_taint->getSingleAtomic(); + + if (!$removed_taint_single instanceof TConditional) { + throw new TypeParseTreeException('Escaped taint must be a conditional'); + } + + $storage->conditionally_removed_taints[] = $removed_taint; + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $cased_function_id, + new CodeLocation($file_scanner, $stmt, null, true) + ); + } + } + + /** + * @param array $type_aliases + * @param array> $function_template_types + * @param array> $class_template_types + */ + private static function handleAssertions( + FunctionDocblockComment $docblock_info, + FunctionLikeStorage $storage, + Codebase $codebase, + FileScanner $file_scanner, + FileStorage $file_storage, + Aliases $aliases, + PhpParser\Node\FunctionLike $stmt, + array $class_template_types, + array $function_template_types, + array $type_aliases, + ?ClassLikeStorage $classlike_storage + ): void { + if ($docblock_info->assertions) { + $storage->assertions = []; + + foreach ($docblock_info->assertions as $assertion) { + $assertion_type_parts = self::getAssertionParts( + $codebase, + $file_scanner, + $file_storage, + $aliases, + $stmt, + $storage, + $assertion['type'], + $class_template_types, + $function_template_types, + $type_aliases, + $classlike_storage && !$classlike_storage->is_trait ? $classlike_storage->name : null + ); + + if (!$assertion_type_parts) { + continue; + } + + foreach ($storage->params as $i => $param) { + if ($param->name === $assertion['param_name']) { + $storage->assertions[] = new Assertion( + $i, + [$assertion_type_parts] + ); + continue 2; + } + + if (strpos($assertion['param_name'], $param->name.'->') === 0) { + $storage->assertions[] = new Assertion( + str_replace($param->name, (string) $i, $assertion['param_name']), + [$assertion_type_parts] + ); + continue 2; + } + } + + $storage->assertions[] = new Assertion( + (strpos($assertion['param_name'], '$') === false ? '$' : '') . $assertion['param_name'], + [$assertion_type_parts] + ); + } + } + + if ($docblock_info->if_true_assertions) { + $storage->if_true_assertions = []; + + foreach ($docblock_info->if_true_assertions as $assertion) { + $assertion_type_parts = self::getAssertionParts( + $codebase, + $file_scanner, + $file_storage, + $aliases, + $stmt, + $storage, + $assertion['type'], + $class_template_types, + $function_template_types, + $type_aliases, + $classlike_storage && !$classlike_storage->is_trait ? $classlike_storage->name : null + ); + + if (!$assertion_type_parts) { + continue; + } + + foreach ($storage->params as $i => $param) { + if ($param->name === $assertion['param_name']) { + $storage->if_true_assertions[] = new Assertion( + $i, + [$assertion_type_parts] + ); + continue 2; + } + + if (strpos($assertion['param_name'], $param->name.'->') === 0) { + $storage->if_true_assertions[] = new Assertion( + str_replace($param->name, (string) $i, $assertion['param_name']), + [$assertion_type_parts] + ); + continue 2; + } + } + + $storage->if_true_assertions[] = new Assertion( + (strpos($assertion['param_name'], '$') === false ? '$' : '') . $assertion['param_name'], + [$assertion_type_parts] + ); + } + } + + if ($docblock_info->if_false_assertions) { + $storage->if_false_assertions = []; + + foreach ($docblock_info->if_false_assertions as $assertion) { + $assertion_type_parts = self::getAssertionParts( + $codebase, + $file_scanner, + $file_storage, + $aliases, + $stmt, + $storage, + $assertion['type'], + $class_template_types, + $function_template_types, + $type_aliases, + $classlike_storage && !$classlike_storage->is_trait ? $classlike_storage->name : null + ); + + if (!$assertion_type_parts) { + continue; + } + + foreach ($storage->params as $i => $param) { + if ($param->name === $assertion['param_name']) { + $storage->if_false_assertions[] = new Assertion( + $i, + [$assertion_type_parts] + ); + continue 2; + } + + if (strpos($assertion['param_name'], $param->name.'->') === 0) { + $storage->if_false_assertions[] = new Assertion( + str_replace($param->name, (string) $i, $assertion['param_name']), + [$assertion_type_parts] + ); + continue 2; + } + } + + $storage->if_false_assertions[] = new Assertion( + (strpos($assertion['param_name'], '$') === false ? '$' : '') . $assertion['param_name'], + [$assertion_type_parts] + ); + } + } + } + + /** + * @param array $type_aliases + * @param array> $function_template_types + * @param array> $class_template_types + * @param array{name:string, type:string, line_number: int} $docblock_param_out + */ + private static function handleParamOut( + array $docblock_param_out, + Aliases $aliases, + array $function_template_types, + array $class_template_types, + array $type_aliases, + string $cased_function_id, + FileScanner $file_scanner, + PhpParser\Node\FunctionLike $stmt, + FunctionLikeStorage $storage, + Codebase $codebase, + FileStorage $file_storage + ): void { + $param_name = substr($docblock_param_out['name'], 1); + + try { + $out_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $docblock_param_out['type'], + $aliases, + $function_template_types + $class_template_types, + $type_aliases + ), + null, + $function_template_types + $class_template_types, + $type_aliases + ); + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $cased_function_id, + new CodeLocation($file_scanner, $stmt, null, true) + ); + + return; + } + + $out_type->queueClassLikesForScanning( + $codebase, + $file_storage, + $storage->template_types ?: [] + ); + + foreach ($storage->params as $param_storage) { + if ($param_storage->name === $param_name) { + $param_storage->out_type = $out_type; + } + } + } + + /** + * @param ?array> $template_types + * @param array $type_aliases + * @return array> + */ + private static function handleTemplates( + FunctionLikeStorage $storage, + FunctionDocblockComment $docblock_info, + Aliases $aliases, + ?array $template_types, + array $type_aliases, + FileScanner $file_scanner, + PhpParser\Node\FunctionLike $stmt, + string $cased_function_id + ): array { + $storage->template_types = []; + + foreach ($docblock_info->templates as $template_map) { + $template_name = $template_map[0]; + + if ($template_map[1] !== null && $template_map[2] !== null) { + if (trim($template_map[2])) { + try { + $template_type = TypeParser::parseTokens( + TypeTokenizer::getFullyQualifiedTokens( + $template_map[2], + $aliases, + $storage->template_types + ($template_types ?: []), + $type_aliases + ), + null, + $storage->template_types + ($template_types ?: []), + $type_aliases + ); + } catch (TypeParseTreeException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + 'Template ' . $template_name . ' has invalid as type - ' . $e->getMessage(), + new CodeLocation($file_scanner, $stmt, null, true) + ); + + $template_type = Type::getMixed(); + } + } else { + $storage->docblock_issues[] = new InvalidDocblock( + 'Template ' . $template_name . ' missing as type', + new CodeLocation($file_scanner, $stmt, null, true) + ); + + $template_type = Type::getMixed(); + } + } else { + $template_type = Type::getMixed(); + } + + if (isset($template_types[$template_name])) { + $storage->docblock_issues[] = new InvalidDocblock( + 'Duplicate template param ' . $template_name . ' in docblock for ' + . $cased_function_id, + new CodeLocation($file_scanner, $stmt, null, true) + ); + } else { + $storage->template_types[$template_name] = [ + 'fn-' . strtolower($cased_function_id) => $template_type, + ]; + } + } + + return array_merge($template_types ?: [], $storage->template_types); + } + + private static function handleUnexpectedTags( + FunctionDocblockComment $docblock_info, + FunctionLikeStorage $storage, + PhpParser\Node\FunctionLike $stmt, + FileScanner $file_scanner, + string $cased_function_id + ): void { + foreach ($docblock_info->unexpected_tags as $tag => $details) { + foreach ($details['lines'] as $line) { + $tag_location = new CodeLocation($file_scanner, $stmt, null, true); + $tag_location->setCommentLine($line); + + $message = 'Docblock tag @' . $tag . ' is not recognized in the function docblock ' + . 'for ' . $cased_function_id; + + if (isset($details['suggested_replacement'])) { + $message .= ', did you mean to use @' . $details['suggested_replacement'] . '?'; + } + + $storage->docblock_issues[] = new PossiblyInvalidDocblockTag($message, $tag_location); + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php new file mode 100644 index 00000000..cc101391 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php @@ -0,0 +1,1151 @@ +> + */ + private $existing_function_template_types; + + /** + * @var Aliases + */ + private $aliases; + + /** + * @var array + */ + private $type_aliases; + + /** + * @var ?FunctionLikeStorage + */ + public $storage; + + /** + * @param array> $existing_function_template_types + * @param array $type_aliases + */ + public function __construct( + Codebase $codebase, + FileScanner $file_scanner, + FileStorage $file_storage, + Aliases $aliases, + array $type_aliases, + ?ClassLikeStorage $classlike_storage, + array $existing_function_template_types + ) { + $this->codebase = $codebase; + $this->file_storage = $file_storage; + $this->file_scanner = $file_scanner; + $this->file_path = $file_storage->file_path; + $this->aliases = $aliases; + $this->type_aliases = $type_aliases; + $this->config = Config::getInstance(); + $this->classlike_storage = $classlike_storage; + $this->existing_function_template_types = $existing_function_template_types; + } + + /** + * @param bool $fake_method in the case of @method annotations we do something a little strange + * + * @return FunctionStorage|MethodStorage|false + */ + public function start(PhpParser\Node\FunctionLike $stmt, bool $fake_method = false) + { + if ($stmt instanceof PhpParser\Node\Expr\Closure + || $stmt instanceof PhpParser\Node\Expr\ArrowFunction + ) { + $this->codebase->scanner->queueClassLikeForScanning('Closure'); + } + + $functionlike_info = $this->createStorageForFunctionLike($stmt, $fake_method); + + if ($functionlike_info === false) { + return false; + } + + [ + $cased_function_id, + $storage, + $function_id, + $fq_classlike_name, + $method_name_lc, + $classlike_storage, + $is_functionlike_override, + $method_id, + $is_dupe + ] = $functionlike_info; + + if ($is_dupe) { + return $storage; + } + + if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod) { + $storage->cased_name = $stmt->name->name; + } elseif ($stmt instanceof PhpParser\Node\Stmt\Function_) { + $storage->cased_name = + ($this->aliases->namespace ? $this->aliases->namespace . '\\' : '') . $stmt->name->name; + } + + if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod || $stmt instanceof PhpParser\Node\Stmt\Function_) { + $storage->location = new CodeLocation($this->file_scanner, $stmt->name, null, true); + } else { + $storage->location = new CodeLocation($this->file_scanner, $stmt, null, true); + } + + $storage->stmt_location = new CodeLocation($this->file_scanner, $stmt); + + $required_param_count = 0; + $i = 0; + $has_optional_param = false; + + $existing_params = []; + $storage->setParams([]); + + foreach ($stmt->getParams() as $param) { + if ($param->var instanceof PhpParser\Node\Expr\Error) { + $storage->docblock_issues[] = new InvalidDocblock( + 'Param' . ($i + 1) . ' of ' . $cased_function_id . ' has invalid syntax', + new CodeLocation($this->file_scanner, $param, null, true) + ); + + ++$i; + + continue; + } + + $param_storage = $this->getTranslatedFunctionParam($param, $stmt, $fake_method, $fq_classlike_name); + + foreach ($param->attrGroups as $attr_group) { + foreach ($attr_group->attrs as $attr) { + $param_storage->attributes[] = AttributeResolver::resolve( + $this->codebase, + $this->file_scanner, + $this->file_storage, + $this->aliases, + $attr, + $this->classlike_storage->name ?? null + ); + } + } + + if ($param_storage->name === 'haystack' + && in_array($this->file_path, $this->codebase->config->internal_stubs) + ) { + $param_storage->expect_variable = true; + } + + if (isset($existing_params['$' . $param_storage->name])) { + $storage->docblock_issues[] = new DuplicateParam( + 'Duplicate param $' . $param_storage->name . ' in docblock for ' . $cased_function_id, + new CodeLocation($this->file_scanner, $param, null, true) + ); + + ++$i; + + continue; + } + + $existing_params['$' . $param_storage->name] = $i; + $storage->addParam($param_storage, (bool)$param->type); + + if (!$param_storage->is_optional && !$param_storage->is_variadic) { + $required_param_count = $i + 1; + + if (!$param->variadic + && $has_optional_param + ) { + foreach ($storage->params as $param) { + $param->is_optional = false; + } + } + } else { + $has_optional_param = true; + } + + ++$i; + } + + $storage->required_param_count = $required_param_count; + + if ($stmt instanceof PhpParser\Node\Stmt\Function_ + || $stmt instanceof PhpParser\Node\Stmt\ClassMethod + ) { + if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod + && $storage instanceof MethodStorage + && $classlike_storage + && !$classlike_storage->mutation_free + && $stmt->stmts + && count($stmt->stmts) === 1 + && !count($stmt->params) + && $stmt->stmts[0] instanceof PhpParser\Node\Stmt\Return_ + && $stmt->stmts[0]->expr instanceof PhpParser\Node\Expr\PropertyFetch + && $stmt->stmts[0]->expr->var instanceof PhpParser\Node\Expr\Variable + && $stmt->stmts[0]->expr->var->name === 'this' + && $stmt->stmts[0]->expr->name instanceof PhpParser\Node\Identifier + ) { + $property_name = $stmt->stmts[0]->expr->name->name; + + if (isset($classlike_storage->properties[$property_name]) + && $classlike_storage->properties[$property_name]->type + ) { + $storage->mutation_free = true; + $storage->external_mutation_free = true; + $storage->mutation_free_inferred = !$stmt->isFinal() && !$classlike_storage->final; + + $classlike_storage->properties[$property_name]->getter_method = strtolower($stmt->name->name); + } + } elseif (strpos($stmt->name->name, 'assert') === 0 + && $stmt->stmts + ) { + $var_assertions = []; + + foreach ($stmt->stmts as $function_stmt) { + if ($function_stmt instanceof PhpParser\Node\Stmt\If_) { + $final_actions = ScopeAnalyzer::getControlActions( + $function_stmt->stmts, + null, + $this->config->exit_functions, + [], + false + ); + + if ($final_actions !== [ScopeAnalyzer::ACTION_END]) { + $var_assertions = []; + break; + } + + $cond_id = spl_object_id($function_stmt->cond); + + $if_clauses = FormulaGenerator::getFormula( + $cond_id, + $cond_id, + $function_stmt->cond, + $this->classlike_storage->name ?? null, + $this->file_scanner, + null + ); + + try { + $negated_formula = Algebra::negateFormula($if_clauses); + } catch (ComplicatedExpressionException $e) { + $var_assertions = []; + break; + } + + $rules = Algebra::getTruthsFromFormula($negated_formula); + + if (!$rules) { + $var_assertions = []; + break; + } + + foreach ($rules as $var_id => $rule) { + foreach ($rule as $rule_part) { + if (count($rule_part) > 1) { + continue 2; + } + } + + if (isset($existing_params[$var_id])) { + $param_offset = $existing_params[$var_id]; + + $var_assertions[] = new Assertion( + $param_offset, + $rule + ); + } elseif (strpos($var_id, '$this->') === 0) { + $var_assertions[] = new Assertion( + $var_id, + $rule + ); + } + } + } else { + $var_assertions = []; + break; + } + } + + $storage->assertions = $var_assertions; + } + + if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod + && $stmt->stmts + && $storage instanceof MethodStorage + ) { + $last_stmt = end($stmt->stmts); + + if ($last_stmt instanceof PhpParser\Node\Stmt\Return_ + && $last_stmt->expr instanceof PhpParser\Node\Expr\Variable + && $last_stmt->expr->name === 'this' + ) { + $storage->probably_fluent = true; + } + } + } + + if (!$this->file_scanner->will_analyze + && ($stmt instanceof PhpParser\Node\Stmt\Function_ + || $stmt instanceof PhpParser\Node\Stmt\ClassMethod + || $stmt instanceof PhpParser\Node\Expr\Closure) + && $stmt->stmts + ) { + // pick up func_get_args that would otherwise be missed + foreach ($stmt->stmts as $function_stmt) { + if ($function_stmt instanceof PhpParser\Node\Stmt\Expression + && $function_stmt->expr instanceof PhpParser\Node\Expr\Assign + && $function_stmt->expr->expr instanceof PhpParser\Node\Expr\FuncCall + && $function_stmt->expr->expr->name instanceof PhpParser\Node\Name + ) { + $inner_function_id = implode('\\', $function_stmt->expr->expr->name->parts); + + if ($inner_function_id === 'func_get_arg' + || $inner_function_id === 'func_get_args' + || $inner_function_id === 'func_num_args' + ) { + $storage->variadic = true; + } + } elseif ($function_stmt instanceof PhpParser\Node\Stmt\If_ + && $function_stmt->cond instanceof PhpParser\Node\Expr\BinaryOp + && $function_stmt->cond->left instanceof PhpParser\Node\Expr\BinaryOp\Equal + && $function_stmt->cond->left->left instanceof PhpParser\Node\Expr\FuncCall + && $function_stmt->cond->left->left->name instanceof PhpParser\Node\Name + ) { + $inner_function_id = implode('\\', $function_stmt->cond->left->left->name->parts); + + if ($inner_function_id === 'func_get_arg' + || $inner_function_id === 'func_get_args' + || $inner_function_id === 'func_num_args' + ) { + $storage->variadic = true; + } + } + } + } + + $parser_return_type = $stmt->getReturnType(); + + if ($parser_return_type) { + $original_type = $parser_return_type; + if ($original_type instanceof PhpParser\Node\IntersectionType) { + throw new UnexpectedValueException('Intersection types not yet supported'); + } + /** @var Identifier|Name|NullableType|UnionType $original_type */ + + $storage->return_type = TypeHintResolver::resolve( + $original_type, + $this->codebase->scanner, + $this->file_storage, + $this->classlike_storage, + $this->aliases, + $this->codebase->php_major_version, + $this->codebase->php_minor_version + ); + + $storage->return_type_location = new CodeLocation( + $this->file_scanner, + $original_type + ); + + if ($stmt->returnsByRef()) { + $storage->return_type->by_ref = true; + } + + $storage->signature_return_type = $storage->return_type; + $storage->signature_return_type_location = $storage->return_type_location; + } + + if ($stmt->returnsByRef()) { + $storage->returns_by_ref = true; + } + + $doc_comment = $stmt->getDocComment(); + + + if ($classlike_storage && !$classlike_storage->is_trait) { + $storage->internal = array_merge($classlike_storage->internal, $storage->internal); + } + + if ($doc_comment) { + try { + $code_location = new CodeLocation($this->file_scanner, $stmt, null, true); + $docblock_info = FunctionLikeDocblockParser::parse($doc_comment, $code_location, $cased_function_id); + } catch (IncorrectDocblockException $e) { + $storage->docblock_issues[] = new MissingDocblockType( + $e->getMessage() . ' in docblock for ' . $cased_function_id, + new CodeLocation($this->file_scanner, $stmt, null, true) + ); + + $docblock_info = null; + } catch (DocblockParseException $e) { + $storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage() . ' in docblock for ' . $cased_function_id, + new CodeLocation($this->file_scanner, $stmt, null, true) + ); + + $docblock_info = null; + } + + if ($docblock_info) { + if ($docblock_info->since_php_major_version && !$this->aliases->namespace) { + if ($docblock_info->since_php_major_version > $this->codebase->php_major_version) { + return false; + } + + if ($docblock_info->since_php_major_version === $this->codebase->php_major_version + && $docblock_info->since_php_minor_version > $this->codebase->php_minor_version + ) { + return false; + } + } + + if ($stmt instanceof PhpParser\Node\Expr\Closure + || $stmt instanceof PhpParser\Node\Expr\ArrowFunction + ) { + if ($docblock_info->templates !== []) { + $docblock_info->templates = []; + $storage->docblock_issues[] = new InvalidDocblock( + 'Templated closures are not supported', + new CodeLocation($this->file_scanner, $stmt, null, true) + ); + } + } + + FunctionLikeDocblockScanner::addDocblockInfo( + $this->codebase, + $this->file_scanner, + $this->file_storage, + $this->aliases, + $this->type_aliases, + $this->classlike_storage, + $this->existing_function_template_types, + $storage, + $stmt, + $docblock_info, + $is_functionlike_override, + $fake_method, + $cased_function_id + ); + } + } + + // register the functionlike once the @since check has been completed + if ($stmt instanceof PhpParser\Node\Stmt\Function_ + && $function_id + && $storage instanceof FunctionStorage + ) { + if ($this->codebase->register_stub_files + || ($this->codebase->register_autoload_files + && !$this->codebase->functions->hasStubbedFunction($function_id)) + ) { + $this->codebase->functions->addGlobalFunction($function_id, $storage); + } + + $this->file_storage->functions[$function_id] = $storage; + $this->file_storage->declaring_function_ids[$function_id] = strtolower($this->file_path); + } elseif ($stmt instanceof PhpParser\Node\Stmt\ClassMethod + && $classlike_storage + && $storage instanceof MethodStorage + && $method_name_lc + && !$fake_method + && $method_id + ) { + $classlike_storage->methods[$method_name_lc] = $storage; + + $classlike_storage->declaring_method_ids[$method_name_lc] + = $classlike_storage->appearing_method_ids[$method_name_lc] + = $method_id; + + if (!$stmt->isPrivate() || $method_name_lc === '__construct' || $classlike_storage->is_trait) { + $classlike_storage->inheritable_method_ids[$method_name_lc] = $method_id; + } + + if (!isset($classlike_storage->overridden_method_ids[$method_name_lc])) { + $classlike_storage->overridden_method_ids[$method_name_lc] = []; + } + + if ($storage->final && $method_name_lc === '__construct') { + // a bit of a hack, but makes sure that `new static` works for these classes + $classlike_storage->preserve_constructor_signature = true; + } + } elseif (($stmt instanceof PhpParser\Node\Expr\Closure + || $stmt instanceof PhpParser\Node\Expr\ArrowFunction) + && $function_id + && $storage instanceof FunctionStorage + ) { + $this->file_storage->functions[$function_id] = $storage; + } + + if ($classlike_storage && $method_name_lc === '__construct') { + foreach ($stmt->getParams() as $param) { + if (!$param->flags || !$param->var instanceof PhpParser\Node\Expr\Variable) { + continue; + } + + $param_storage = null; + + foreach ($storage->params as $param_storage) { + if ($param_storage->name === $param->var->name) { + break; + } + } + + if (!$param_storage) { + continue; + } + + if (isset($classlike_storage->properties[$param_storage->name]) && $param_storage->location) { + IssueBuffer::maybeAdd( + new ParseError( + 'Promoted property ' . $param_storage->name . ' clashes with an existing property', + $param_storage->location + ) + ); + + $storage->has_visitor_issues = true; + $this->file_storage->has_visitor_issues = true; + continue; + } + + $doc_comment = $param->getDocComment(); + $var_comment_type = null; + $var_comment_readonly = false; + $var_comment_allow_private_mutation = false; + if ($doc_comment) { + $var_comments = CommentAnalyzer::getTypeFromComment( + $doc_comment, + $this->file_scanner, + $this->aliases, + $this->existing_function_template_types ?: [], + $this->type_aliases + ); + + $var_comment = array_pop($var_comments); + + if ($var_comment !== null) { + $var_comment_type = $var_comment->type; + $var_comment_readonly = $var_comment->readonly; + $var_comment_allow_private_mutation = $var_comment->allow_private_mutation; + } + } + + //both way to document type were used + if ($param_storage->type && $param_storage->type->from_docblock && $var_comment_type) { + if (IssueBuffer::accepts( + new InvalidDocblock( + 'Param ' . $param_storage->name . ' of ' . $cased_function_id . + ' should be documented as a param or a property, not both', + new CodeLocation($this->file_scanner, $param, null, true) + ) + )) { + return false; + } + } + + //no docblock type was provided for param but we have one for property + if ($var_comment_type) { + $param_storage->type = $var_comment_type; + } + + $property_storage = $classlike_storage->properties[$param_storage->name] = new PropertyStorage(); + $property_storage->is_static = false; + $property_storage->type = $param_storage->type; + $property_storage->signature_type = $param_storage->signature_type; + $property_storage->signature_type_location = $param_storage->signature_type_location; + $property_storage->type_location = $param_storage->type_location; + $property_storage->location = $param_storage->location; + $property_storage->stmt_location = new CodeLocation($this->file_scanner, $param); + $property_storage->has_default = (bool)$param->default; + $param_type_readonly = (bool)($param->flags & PhpParser\Node\Stmt\Class_::MODIFIER_READONLY); + $property_storage->readonly = $param_type_readonly ?: $var_comment_readonly; + $property_storage->allow_private_mutation = $var_comment_allow_private_mutation; + $param_storage->promoted_property = true; + $property_storage->is_promoted = true; + + $property_id = $fq_classlike_name . '::$' . $param_storage->name; + + switch ($param->flags & Class_::VISIBILITY_MODIFIER_MASK) { + case Class_::MODIFIER_PUBLIC: + $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; + $classlike_storage->inheritable_property_ids[$param_storage->name] = $property_id; + break; + + case Class_::MODIFIER_PROTECTED: + $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PROTECTED; + $classlike_storage->inheritable_property_ids[$param_storage->name] = $property_id; + break; + + case Class_::MODIFIER_PRIVATE: + $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PRIVATE; + break; + } + + $fq_classlike_name = $classlike_storage->name; + + $property_id = $fq_classlike_name . '::$' . $param_storage->name; + + $classlike_storage->declaring_property_ids[$param_storage->name] = $fq_classlike_name; + $classlike_storage->appearing_property_ids[$param_storage->name] = $property_id; + $classlike_storage->initialized_properties[$param_storage->name] = true; + } + + if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod + && $storage instanceof MethodStorage + && $storage->params + && $this->config->infer_property_types_from_constructor + ) { + $this->inferPropertyTypeFromConstructor($stmt, $storage, $classlike_storage); + } + } + + foreach ($stmt->getAttrGroups() as $attr_group) { + foreach ($attr_group->attrs as $attr) { + $attribute = AttributeResolver::resolve( + $this->codebase, + $this->file_scanner, + $this->file_storage, + $this->aliases, + $attr, + $this->classlike_storage->name ?? null + ); + + if ($attribute->fq_class_name === 'Psalm\\Pure' + || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Pure' + ) { + $storage->specialize_call = true; + $storage->mutation_free = true; + if ($storage instanceof MethodStorage) { + $storage->external_mutation_free = true; + } + } + + if ($attribute->fq_class_name === 'Psalm\\Deprecated' + || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Deprecated' + ) { + $storage->deprecated = true; + } + + if ($attribute->fq_class_name === 'Psalm\\Internal' && !$storage->internal && $fq_classlike_name) { + $storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($fq_classlike_name)]; + } + + if ($attribute->fq_class_name === 'Psalm\\ExternalMutationFree' + && $storage instanceof MethodStorage + ) { + $storage->external_mutation_free = true; + } + + if ($attribute->fq_class_name === 'JetBrains\\PhpStorm\\NoReturn') { + $storage->return_type = new Union([new TNever()]); + } + + $storage->attributes[] = $attribute; + } + } + + return $storage; + } + + private function inferPropertyTypeFromConstructor( + PhpParser\Node\Stmt\ClassMethod $stmt, + MethodStorage $storage, + ClassLikeStorage $classlike_storage + ): void { + if (!$stmt->stmts) { + return; + } + + $assigned_properties = []; + + foreach ($stmt->stmts as $function_stmt) { + if ($function_stmt instanceof PhpParser\Node\Stmt\Expression + && $function_stmt->expr instanceof PhpParser\Node\Expr\Assign + && $function_stmt->expr->var instanceof PhpParser\Node\Expr\PropertyFetch + && $function_stmt->expr->var->var instanceof PhpParser\Node\Expr\Variable + && $function_stmt->expr->var->var->name === 'this' + && $function_stmt->expr->var->name instanceof PhpParser\Node\Identifier + && ($property_name = $function_stmt->expr->var->name->name) + && isset($classlike_storage->properties[$property_name]) + && $function_stmt->expr->expr instanceof PhpParser\Node\Expr\Variable + && is_string($function_stmt->expr->expr->name) + && ($param_name = $function_stmt->expr->expr->name) + && isset($storage->param_lookup[$param_name]) + ) { + if ($classlike_storage->properties[$property_name]->type + || !$storage->param_lookup[$param_name] + ) { + continue; + } + + $param_index = array_search($param_name, array_keys($storage->param_lookup), true); + + if ($param_index === false || !isset($storage->params[$param_index]->type)) { + continue; + } + + $param_type = $storage->params[$param_index]->type; + + $assigned_properties[$property_name] = + $storage->params[$param_index]->is_variadic + ? new Union([ + new TArray([ + Type::getInt(), + $param_type, + ]), + ]) + : $param_type; + } else { + $assigned_properties = []; + break; + } + } + + if (!$assigned_properties) { + return; + } + + $storage->external_mutation_free = true; + + foreach ($assigned_properties as $property_name => $property_type) { + $classlike_storage->properties[$property_name]->type = clone $property_type; + } + } + + private function getTranslatedFunctionParam( + PhpParser\Node\Param $param, + PhpParser\Node\FunctionLike $stmt, + bool $fake_method, + ?string $fq_classlike_name + ): FunctionLikeParameter { + $param_type = null; + + $is_nullable = $param->default instanceof PhpParser\Node\Expr\ConstFetch && + strtolower($param->default->name->parts[0]) === 'null'; + + $param_typehint = $param->type; + + if ($param_typehint) { + if ($param_typehint instanceof PhpParser\Node\IntersectionType) { + throw new UnexpectedValueException('Intersection types not yet supported'); + } + /** @var Identifier|Name|NullableType|UnionType $param_typehint */ + + $param_type = TypeHintResolver::resolve( + $param_typehint, + $this->codebase->scanner, + $this->file_storage, + $this->classlike_storage, + $this->aliases, + $this->codebase->php_major_version, + $this->codebase->php_minor_version + ); + + if ($is_nullable) { + $param_type->addType(new TNull); + } else { + $is_nullable = $param_type->isNullable(); + } + } + + $is_optional = $param->default !== null; + + if ($param->var instanceof PhpParser\Node\Expr\Error || !is_string($param->var->name)) { + throw new UnexpectedValueException('Not expecting param name to be non-string'); + } + + $default_type = null; + + if ($param->default) { + $default_type = SimpleTypeInferer::infer( + $this->codebase, + new NodeDataProvider(), + $param->default, + $this->aliases, + null, + null, + $fq_classlike_name + ); + + if (!$default_type) { + $default_type = ExpressionResolver::getUnresolvedClassConstExpr( + $param->default, + $this->aliases, + $fq_classlike_name + ); + } + } + + return new FunctionLikeParameter( + $param->var->name, + $param->byRef, + $param_type, + new CodeLocation( + $this->file_scanner, + $fake_method ? $stmt : $param->var, + null, + false, + !$fake_method + ? CodeLocation::FUNCTION_PARAM_VAR + : CodeLocation::FUNCTION_PHPDOC_METHOD + ), + $param_typehint + ? new CodeLocation( + $this->file_scanner, + $fake_method ? $stmt : $param, + null, + false, + CodeLocation::FUNCTION_PARAM_TYPE + ) + : null, + $is_optional, + $is_nullable, + $param->variadic, + $default_type + ); + } + + /** + * @return array{ + * string, + * FunctionStorage|MethodStorage, + * null|string, + * null|string, + * null|lowercase-string, + * ClassLikeStorage|null, + * bool, + * MethodIdentifier|null, + * bool + * }|false + */ + private function createStorageForFunctionLike( + PhpParser\Node\FunctionLike $stmt, + bool $fake_method + ) { + $classlike_storage = null; + $fq_classlike_name = null; + $is_functionlike_override = false; + + $function_id = null; + $method_name_lc = null; + $method_id = null; + + if ($fake_method && $stmt instanceof PhpParser\Node\Stmt\ClassMethod) { + $cased_function_id = '@method ' . $stmt->name->name; + + $storage = $this->storage = new MethodStorage(); + $storage->defining_fqcln = ''; + $storage->is_static = $stmt->isStatic(); + $storage->final = $this->classlike_storage && $this->classlike_storage->final; + $storage->final_from_docblock = $this->classlike_storage && $this->classlike_storage->final_from_docblock; + } elseif ($stmt instanceof PhpParser\Node\Stmt\Function_) { + $cased_function_id = + ($this->aliases->namespace ? $this->aliases->namespace . '\\' : '') . $stmt->name->name; + $function_id = strtolower($cased_function_id); + + $storage = $this->storage = new FunctionStorage(); + + if ($this->codebase->register_stub_files || $this->codebase->register_autoload_files) { + if (isset($this->file_storage->functions[$function_id]) + && ($this->codebase->register_stub_files + || !$this->codebase->functions->hasStubbedFunction($function_id)) + ) { + $this->codebase->functions->addGlobalFunction( + $function_id, + $this->file_storage->functions[$function_id] + ); + + $storage = $this->storage = $this->file_storage->functions[$function_id]; + + return [$function_id, $storage, null, null, null, null, false, null, true]; + } + } else { + if (isset($this->file_storage->functions[$function_id])) { + $duplicate_function_storage = $this->file_storage->functions[$function_id]; + + if ($duplicate_function_storage->location + && $duplicate_function_storage->location->getLineNumber() === $stmt->getLine() + ) { + $storage = $this->storage = $this->file_storage->functions[$function_id]; + + return [$function_id, $storage, null, null, null, null, false, null, true]; + } + + IssueBuffer::maybeAdd( + new DuplicateFunction( + 'Method ' . $function_id . ' has already been defined' + . ($duplicate_function_storage->location + ? ' in ' . $duplicate_function_storage->location->file_path + : ''), + new CodeLocation($this->file_scanner, $stmt, null, true) + ) + ); + + $this->file_storage->has_visitor_issues = true; + + $duplicate_function_storage->has_visitor_issues = true; + + $storage = $this->storage = $this->file_storage->functions[$function_id]; + + return [$function_id, $storage, null, null, null, null, false, null, true]; + } + + if (isset($this->config->getPredefinedFunctions()[$function_id])) { + /** @psalm-suppress ArgumentTypeCoercion */ + $reflection_function = new ReflectionFunction($function_id); + + if ($reflection_function->getFileName() !== $this->file_path) { + IssueBuffer::maybeAdd( + new DuplicateFunction( + 'Method ' . $function_id . ' has already been defined as a core function', + new CodeLocation($this->file_scanner, $stmt, null, true) + ) + ); + } + } + } + } elseif ($stmt instanceof PhpParser\Node\Stmt\ClassMethod) { + if (!$this->classlike_storage) { + throw new LogicException('$this->classlike_storage should not be null'); + } + + $fq_classlike_name = $this->classlike_storage->name; + + $method_name_lc = strtolower($stmt->name->name); + + $function_id = $fq_classlike_name . '::' . $method_name_lc; + $cased_function_id = $fq_classlike_name . '::' . $stmt->name->name; + + $classlike_storage = $this->classlike_storage; + + $storage = null; + + if (isset($classlike_storage->methods[$method_name_lc])) { + if (!$this->codebase->register_stub_files) { + $duplicate_method_storage = $classlike_storage->methods[$method_name_lc]; + + IssueBuffer::maybeAdd( + new DuplicateMethod( + 'Method ' . $function_id . ' has already been defined' + . ($duplicate_method_storage->location + ? ' in ' . $duplicate_method_storage->location->file_path + : ''), + new CodeLocation($this->file_scanner, $stmt, null, true) + ) + ); + + $this->file_storage->has_visitor_issues = true; + + $duplicate_method_storage->has_visitor_issues = true; + + return false; + } + + // skip methods based on @since docblock tag + $doc_comment = $stmt->getDocComment(); + + if ($doc_comment) { + $docblock_info = null; + try { + $code_location = new CodeLocation($this->file_scanner, $stmt, null, true); + $docblock_info = FunctionLikeDocblockParser::parse( + $doc_comment, + $code_location, + $cased_function_id + ); + } catch (IncorrectDocblockException|DocblockParseException $e) { + } + if ($docblock_info) { + if ($docblock_info->since_php_major_version && !$this->aliases->namespace) { + if ($docblock_info->since_php_major_version > $this->codebase->php_major_version) { + return false; + } + if ($docblock_info->since_php_major_version === $this->codebase->php_major_version + && $docblock_info->since_php_minor_version > $this->codebase->php_minor_version + ) { + return false; + } + } + } + } + + $is_functionlike_override = true; + $storage = $this->storage = $classlike_storage->methods[$method_name_lc]; + } + + if (!$storage) { + $storage = $this->storage = new MethodStorage(); + } + + $storage->stubbed = $this->codebase->register_stub_files; + $storage->defining_fqcln = $fq_classlike_name; + + $class_name_parts = explode('\\', $fq_classlike_name); + $class_name = array_pop($class_name_parts); + + if ($method_name_lc === strtolower($class_name) + && !isset($classlike_storage->methods['__construct']) + && strpos($fq_classlike_name, '\\') === false + && $this->codebase->php_major_version < 8 + ) { + $this->codebase->methods->setDeclaringMethodId( + $fq_classlike_name, + '__construct', + $fq_classlike_name, + $method_name_lc + ); + + $this->codebase->methods->setAppearingMethodId( + $fq_classlike_name, + '__construct', + $fq_classlike_name, + $method_name_lc + ); + } + + $method_id = new MethodIdentifier( + $fq_classlike_name, + $method_name_lc + ); + + $storage->is_static = $stmt->isStatic(); + $storage->abstract = $stmt->isAbstract(); + + $storage->final = $classlike_storage->final || $stmt->isFinal(); + $storage->final_from_docblock = $classlike_storage->final_from_docblock; + + if ($stmt->isPrivate()) { + $storage->visibility = ClassLikeAnalyzer::VISIBILITY_PRIVATE; + } elseif ($stmt->isProtected()) { + $storage->visibility = ClassLikeAnalyzer::VISIBILITY_PROTECTED; + } else { + $storage->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; + } + } elseif ($stmt instanceof PhpParser\Node\Expr\Closure + || $stmt instanceof PhpParser\Node\Expr\ArrowFunction + ) { + $function_id = $cased_function_id = strtolower($this->file_path) + . ':' . $stmt->getLine() + . ':' . (int)$stmt->getAttribute('startFilePos') . ':-:closure'; + + $storage = $this->storage = $this->file_storage->functions[$function_id] = new FunctionStorage(); + + if ($stmt instanceof PhpParser\Node\Expr\Closure) { + foreach ($stmt->uses as $closure_use) { + if ($closure_use->byRef && is_string($closure_use->var->name)) { + $storage->byref_uses[$closure_use->var->name] = true; + } + } + } + } else { + throw new UnexpectedValueException('Unrecognized functionlike'); + } + + return [ + $cased_function_id, + $storage, + $function_id, + $fq_classlike_name, + $method_name_lc, + $classlike_storage, + $is_functionlike_override, + $method_id, + false + ]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php new file mode 100644 index 00000000..3dfb0859 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php @@ -0,0 +1,111 @@ +types) { + throw new UnexpectedValueException('bad'); + } + + foreach ($hint->types as $atomic_typehint) { + $resolved_type = self::resolve( + $atomic_typehint, + $scanner, + $file_storage, + $classlike_storage, + $aliases, + $php_major_version, + $php_minor_version + ); + + $type = Type::combineUnionTypes($resolved_type, $type); + } + + return $type; + } + + $is_nullable = false; + + if ($hint instanceof PhpParser\Node\NullableType) { + $is_nullable = true; + $hint = $hint->type; + } + + $type_string = null; + + if ($hint instanceof PhpParser\Node\Identifier) { + $fq_type_string = $hint->name; + } elseif ($hint instanceof PhpParser\Node\Name\FullyQualified) { + $fq_type_string = (string)$hint; + + $scanner->queueClassLikeForScanning($fq_type_string); + $file_storage->referenced_classlikes[strtolower($fq_type_string)] = $fq_type_string; + } else { + $lower_hint = strtolower($hint->parts[0]); + + if ($classlike_storage + && ($lower_hint === 'self' || $lower_hint === 'static') + && !$classlike_storage->is_trait + ) { + $fq_type_string = $classlike_storage->name; + + if ($lower_hint === 'static') { + $fq_type_string .= '&static'; + } + } else { + $type_string = implode('\\', $hint->parts); + $fq_type_string = ClassLikeAnalyzer::getFQCLNFromNameObject($hint, $aliases); + + $scanner->queueClassLikeForScanning($fq_type_string); + $file_storage->referenced_classlikes[strtolower($fq_type_string)] = $fq_type_string; + } + } + + $type = Type::parseString( + $fq_type_string, + [$php_major_version, $php_minor_version], + [] + ); + + if ($type_string) { + $atomic_type = $type->getSingleAtomic(); + $atomic_type->text = $type_string; + } + + if ($is_nullable) { + $type->addType(new TNull); + } + + return $type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php new file mode 100644 index 00000000..e99259cf --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php @@ -0,0 +1,650 @@ + + */ + private $functionlike_node_scanners = []; + + /** + * @var array + */ + private $classlike_node_scanners = []; + + /** + * @var PhpParser\Node\Name|null + */ + private $namespace_name; + + /** + * @var PhpParser\Node\Expr|null + */ + private $exists_cond_expr; + + /** + * @var ?int + */ + private $skip_if_descendants; + + /** + * @var array + */ + private $type_aliases = []; + + /** + * @var array + */ + private $bad_classes = []; + /** + * @var EventDispatcher + */ + private $eventDispatcher; + + public function __construct( + Codebase $codebase, + FileScanner $file_scanner, + FileStorage $file_storage + ) { + $this->codebase = $codebase; + $this->file_scanner = $file_scanner; + $this->file_path = $file_scanner->file_path; + $this->scan_deep = $file_scanner->will_analyze; + $this->file_storage = $file_storage; + $this->aliases = $this->file_storage->aliases = new Aliases(); + $this->eventDispatcher = $this->codebase->config->eventDispatcher; + } + + public function enterNode(PhpParser\Node $node): ?int + { + foreach ($node->getComments() as $comment) { + if ($comment instanceof PhpParser\Comment\Doc && !$node instanceof PhpParser\Node\Stmt\ClassLike) { + try { + $type_aliases = ClassLikeNodeScanner::getTypeAliasesFromComment( + $comment, + $this->aliases, + $this->type_aliases, + null + ); + + foreach ($type_aliases as $type_alias) { + // finds issues, if there are any + TypeParser::parseTokens($type_alias->replacement_tokens); + } + + $this->type_aliases += $type_aliases; + } catch (DocblockParseException | TypeParseTreeException $e) { + $this->file_storage->docblock_issues[] = new InvalidDocblock( + $e->getMessage(), + new CodeLocation($this->file_scanner, $node, null, true) + ); + } + } + } + + if ($node instanceof PhpParser\Node\Stmt\Namespace_) { + $this->handleNamespace($node); + } elseif ($node instanceof PhpParser\Node\Stmt\Use_) { + $this->handleUse($node); + } elseif ($node instanceof PhpParser\Node\Stmt\GroupUse) { + $this->handleGroupUse($node); + } elseif ($node instanceof PhpParser\Node\Stmt\ClassLike) { + if ($this->skip_if_descendants) { + return null; + } + + $classlike_node_scanner = new ClassLikeNodeScanner( + $this->codebase, + $this->file_storage, + $this->file_scanner, + $this->aliases, + $this->namespace_name + ); + + $this->classlike_node_scanners[] = $classlike_node_scanner; + + if ($classlike_node_scanner->start($node) === false) { + $this->bad_classes[spl_object_id($node)] = true; + return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; + } + + $this->type_aliases += $classlike_node_scanner->type_aliases; + } elseif ($node instanceof PhpParser\Node\Stmt\TryCatch) { + foreach ($node->catches as $catch) { + foreach ($catch->types as $catch_type) { + $catch_fqcln = ClassLikeAnalyzer::getFQCLNFromNameObject($catch_type, $this->aliases); + + if (!in_array(strtolower($catch_fqcln), ['self', 'static', 'parent'], true)) { + $this->codebase->scanner->queueClassLikeForScanning($catch_fqcln); + $this->file_storage->referenced_classlikes[strtolower($catch_fqcln)] = $catch_fqcln; + } + } + } + } elseif ($node instanceof PhpParser\Node\FunctionLike) { + if ($node instanceof PhpParser\Node\Stmt\Function_ + || $node instanceof PhpParser\Node\Stmt\ClassMethod + ) { + if ($this->skip_if_descendants) { + return null; + } + } + + $classlike_storage = null; + + if ($this->classlike_node_scanners) { + $classlike_node_scanner = end($this->classlike_node_scanners); + $classlike_storage = $classlike_node_scanner->storage; + } + + $functionlike_types = []; + + foreach ($this->functionlike_node_scanners as $functionlike_node_scanner) { + $functionlike_storage = $functionlike_node_scanner->storage; + $functionlike_types += $functionlike_storage->template_types ?? []; + } + + $functionlike_node_scanner = new FunctionLikeNodeScanner( + $this->codebase, + $this->file_scanner, + $this->file_storage, + $this->aliases, + $this->type_aliases, + $classlike_storage, + $functionlike_types + ); + + $functionlike_node_scanner->start($node); + + $this->functionlike_node_scanners[] = $functionlike_node_scanner; + + if ($classlike_storage + && $this->codebase->php_major_version >= 8 + && $node instanceof PhpParser\Node\Stmt\ClassMethod + && strtolower($node->name->name) === '__tostring' + ) { + if ($classlike_storage->is_interface) { + $classlike_storage->parent_interfaces['stringable'] = 'Stringable'; + } else { + $classlike_storage->class_implements['stringable'] = 'Stringable'; + } + + if (PHP_VERSION_ID >= 80000) { + $this->codebase->scanner->queueClassLikeForScanning('Stringable'); + } + } + + if (!$this->scan_deep) { + return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; + } + } elseif ($node instanceof PhpParser\Node\Stmt\Global_) { + $functionlike_node_scanner = end($this->functionlike_node_scanners); + + if ($functionlike_node_scanner && $functionlike_node_scanner->storage) { + foreach ($node->vars as $var) { + if ($var instanceof PhpParser\Node\Expr\Variable) { + if (is_string($var->name) && $var->name !== 'argv' && $var->name !== 'argc') { + $var_id = '$' . $var->name; + + $functionlike_node_scanner->storage->global_variables[$var_id] = true; + } + } + } + } + } elseif ($node instanceof PhpParser\Node\Stmt\TraitUse) { + if ($this->skip_if_descendants) { + return null; + } + + if (!$this->classlike_node_scanners) { + throw new LogicException('$this->classlike_node_scanners should not be empty'); + } + + $classlike_node_scanner = end($this->classlike_node_scanners); + + $classlike_node_scanner->handleTraitUse($node); + } elseif ($node instanceof PhpParser\Node\Stmt\Const_) { + foreach ($node->consts as $const) { + $const_type = SimpleTypeInferer::infer( + $this->codebase, + new NodeDataProvider(), + $const->value, + $this->aliases + ) ?? Type::getMixed(); + + $fq_const_name = Type::getFQCLNFromString($const->name->name, $this->aliases); + + if ($this->codebase->register_stub_files || $this->codebase->register_autoload_files) { + $this->codebase->addGlobalConstantType($fq_const_name, $const_type); + } + + $this->file_storage->constants[$fq_const_name] = $const_type; + $this->file_storage->declaring_constants[$fq_const_name] = $this->file_path; + } + } elseif ($node instanceof PhpParser\Node\Stmt\If_ && !$this->skip_if_descendants) { + if (!$this->functionlike_node_scanners) { + $this->exists_cond_expr = $node->cond; + + if (ExpressionResolver::enterConditional( + $this->codebase, + $this->file_path, + $this->exists_cond_expr + ) === false + ) { + // the else node should terminate the agreement + $this->skip_if_descendants = $node->else ? $node->else->getLine() : $node->getLine(); + } + } + } elseif ($node instanceof PhpParser\Node\Stmt\Else_) { + if ($this->skip_if_descendants === $node->getLine()) { + $this->skip_if_descendants = null; + $this->exists_cond_expr = null; + } elseif (!$this->skip_if_descendants) { + if ($this->exists_cond_expr + && ExpressionResolver::enterConditional( + $this->codebase, + $this->file_path, + $this->exists_cond_expr + ) === true + ) { + $this->skip_if_descendants = $node->getLine(); + } + } + } elseif ($node instanceof PhpParser\Node\Expr) { + $functionlike_storage = null; + + if ($this->functionlike_node_scanners) { + $functionlike_node_scanner = end($this->functionlike_node_scanners); + $functionlike_storage = $functionlike_node_scanner->storage; + } + + ExpressionScanner::scan( + $this->codebase, + $this->file_scanner, + $this->file_storage, + $this->aliases, + $node, + $functionlike_storage, + $this->skip_if_descendants + ); + } + + if ($doc_comment = $node->getDocComment()) { + $var_comments = []; + + $template_types = []; + + if ($this->classlike_node_scanners) { + $classlike_node_scanner = end($this->classlike_node_scanners); + $classlike_storage = $classlike_node_scanner->storage; + $template_types = $classlike_storage->template_types ?? []; + } + + foreach ($this->functionlike_node_scanners as $functionlike_node_scanner) { + $functionlike_storage = $functionlike_node_scanner->storage; + $template_types += $functionlike_storage->template_types ?? []; + } + + try { + $var_comments = CommentAnalyzer::getTypeFromComment( + $doc_comment, + $this->file_scanner, + $this->aliases, + $template_types, + $this->type_aliases + ); + } catch (DocblockParseException $e) { + // do nothing + } + + foreach ($var_comments as $var_comment) { + if (!$var_comment->type) { + continue; + } + + $var_type = $var_comment->type; + $var_type->queueClassLikesForScanning($this->codebase, $this->file_storage); + } + } + + if ($node instanceof PhpParser\Node\Expr\Assign + || $node instanceof PhpParser\Node\Expr\AssignOp + || $node instanceof PhpParser\Node\Expr\AssignRef + ) { + if ($node->var instanceof PhpParser\Node\Expr\PropertyFetch + && $node->var->var instanceof PhpParser\Node\Expr\Variable + && $node->var->var->name === 'this' + && $node->var->name instanceof PhpParser\Node\Identifier + ) { + if ($this->functionlike_node_scanners) { + $functionlike_node_scanner = end($this->functionlike_node_scanners); + $functionlike_storage = $functionlike_node_scanner->storage; + + if ($functionlike_storage instanceof MethodStorage) { + $functionlike_storage->this_property_mutations[$node->var->name->name] = true; + } + } + } + } + + return null; + } + + private function handleNamespace(PhpParser\Node\Stmt\Namespace_ $node): void + { + $this->file_storage->aliases = $this->aliases; + + $this->namespace_name = $node->name; + + $this->aliases = new Aliases( + $node->name ? implode('\\', $node->name->parts) : '', + $this->aliases->uses, + $this->aliases->functions, + $this->aliases->constants, + $this->aliases->uses_flipped, + $this->aliases->functions_flipped, + $this->aliases->constants_flipped + ); + + $this->file_storage->namespace_aliases[(int) $node->getAttribute('startFilePos')] = $this->aliases; + + if ($node->stmts) { + $this->aliases->namespace_first_stmt_start = (int) $node->stmts[0]->getAttribute('startFilePos'); + } + } + + private function handleUse(PhpParser\Node\Stmt\Use_ $node): void + { + foreach ($node->uses as $use) { + $use_path = implode('\\', $use->name->parts); + + $use_alias = $use->alias->name ?? $use->name->getLast(); + + switch ($use->type !== PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN ? $use->type : $node->type) { + case PhpParser\Node\Stmt\Use_::TYPE_FUNCTION: + $this->aliases->functions[strtolower($use_alias)] = $use_path; + $this->aliases->functions_flipped[strtolower($use_path)] = $use_alias; + break; + + case PhpParser\Node\Stmt\Use_::TYPE_CONSTANT: + $this->aliases->constants[$use_alias] = $use_path; + $this->aliases->constants_flipped[$use_path] = $use_alias; + break; + + case PhpParser\Node\Stmt\Use_::TYPE_NORMAL: + $this->aliases->uses[strtolower($use_alias)] = $use_path; + $this->aliases->uses_flipped[strtolower($use_path)] = $use_alias; + break; + } + } + + if (!$this->aliases->uses_start) { + $this->aliases->uses_start = (int) $node->getAttribute('startFilePos'); + } + + $this->aliases->uses_end = (int) $node->getAttribute('endFilePos') + 1; + } + + private function handleGroupUse(PhpParser\Node\Stmt\GroupUse $node): void + { + $use_prefix = implode('\\', $node->prefix->parts); + + foreach ($node->uses as $use) { + $use_path = $use_prefix . '\\' . implode('\\', $use->name->parts); + $use_alias = $use->alias->name ?? $use->name->getLast(); + + switch ($use->type !== PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN ? $use->type : $node->type) { + case PhpParser\Node\Stmt\Use_::TYPE_FUNCTION: + $this->aliases->functions[strtolower($use_alias)] = $use_path; + $this->aliases->functions_flipped[strtolower($use_path)] = $use_alias; + break; + + case PhpParser\Node\Stmt\Use_::TYPE_CONSTANT: + $this->aliases->constants[$use_alias] = $use_path; + $this->aliases->constants_flipped[$use_path] = $use_alias; + break; + + case PhpParser\Node\Stmt\Use_::TYPE_NORMAL: + $this->aliases->uses[strtolower($use_alias)] = $use_path; + $this->aliases->uses_flipped[strtolower($use_path)] = $use_alias; + break; + } + } + + if (!$this->aliases->uses_start) { + $this->aliases->uses_start = (int) $node->getAttribute('startFilePos'); + } + + $this->aliases->uses_end = (int) $node->getAttribute('endFilePos') + 1; + } + + /** + * @return null + */ + public function leaveNode(PhpParser\Node $node) + { + if ($node instanceof PhpParser\Node\Stmt\Namespace_) { + if (!$this->file_storage->aliases) { + throw new UnexpectedValueException('File storage liases should not be null'); + } + + $this->aliases = $this->file_storage->aliases; + + if ($this->codebase->register_stub_files + && $node->name + && $node->name->parts === ['PHPSTORM_META'] + ) { + foreach ($node->stmts as $meta_stmt) { + if ($meta_stmt instanceof PhpParser\Node\Stmt\Expression + && $meta_stmt->expr instanceof PhpParser\Node\Expr\FuncCall + && $meta_stmt->expr->name instanceof PhpParser\Node\Name + && $meta_stmt->expr->name->parts === ['override'] + ) { + PhpStormMetaScanner::handleOverride($meta_stmt->expr->getArgs(), $this->codebase); + } + } + } + } elseif ($node instanceof PhpParser\Node\Stmt\ClassLike) { + if ($this->skip_if_descendants) { + return null; + } + + if (isset($this->bad_classes[spl_object_id($node)])) { + return null; + } + + if (!$this->classlike_node_scanners) { + throw new UnexpectedValueException('$this->classlike_node_scanners cannot be empty'); + } + + $classlike_node_scanner = array_pop($this->classlike_node_scanners); + + $classlike_storage = $classlike_node_scanner->finish($node); + + if ($classlike_storage->has_visitor_issues) { + $this->file_storage->has_visitor_issues = true; + } + + $event = new AfterClassLikeVisitEvent( + $node, + $classlike_storage, + $this, + $this->codebase, + [] + ); + + $this->eventDispatcher->dispatchAfterClassLikeVisit($event); + + if (!$this->file_storage->has_visitor_issues) { + $this->codebase->cacheClassLikeStorage($classlike_storage, $this->file_path); + } + } elseif ($node instanceof PhpParser\Node\FunctionLike) { + if ($this->skip_if_descendants) { + return null; + } + + if (!$this->functionlike_node_scanners) { + if ($this->file_storage->has_visitor_issues) { + return null; + } + + throw new UnexpectedValueException( + 'There should be function storages for line ' . $this->file_path . ':' . $node->getLine() + ); + } + + $functionlike_node_scanner = array_pop($this->functionlike_node_scanners); + + if ($functionlike_node_scanner->storage) { + foreach ($functionlike_node_scanner->storage->docblock_issues as $docblock_issue) { + if (strpos($docblock_issue->code_location->file_path, 'CoreGenericFunctions.phpstub') + || strpos($docblock_issue->code_location->file_path, 'CoreGenericClasses.phpstub') + || strpos($this->file_path, 'CoreGenericIterators.phpstub') + ) { + $e = reset($functionlike_node_scanner->storage->docblock_issues); + + $fqcn_parts = explode('\\', get_class($e)); + $issue_type = array_pop($fqcn_parts); + + $message = $e instanceof TaintedInput + ? $e->getJourneyMessage() + : $e->message; + + throw new CodeException( + 'Error with core stub file docblocks: ' + . $issue_type + . ' - ' . $e->getShortLocationWithPrevious() + . ':' . $e->code_location->getColumn() + . ' - ' . $message + ); + } + } + + if ($functionlike_node_scanner->storage->has_visitor_issues) { + $this->file_storage->has_visitor_issues = true; + } + } + } elseif ($node instanceof PhpParser\Node\Stmt\If_ && $node->getLine() === $this->skip_if_descendants) { + $this->exists_cond_expr = null; + $this->skip_if_descendants = null; + } elseif ($node instanceof PhpParser\Node\Stmt\Else_ && $node->getLine() === $this->skip_if_descendants) { + $this->exists_cond_expr = null; + $this->skip_if_descendants = null; + } + + return null; + } + + public function getFilePath(): string + { + return $this->file_path; + } + + public function getFileName(): string + { + return $this->file_scanner->getFileName(); + } + + public function getRootFilePath(): string + { + return $this->file_scanner->getRootFilePath(); + } + + public function getRootFileName(): string + { + return $this->file_scanner->getRootFileName(); + } + + public function getAliases(): Aliases + { + return $this->aliases; + } + + /** + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingAnyTypeHint + */ + public function afterTraverse(array $nodes) + { + $this->file_storage->type_aliases = $this->type_aliases; + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php new file mode 100644 index 00000000..e0ed99db --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php @@ -0,0 +1,35 @@ + + */ + protected $used_variables = []; + + public function enterNode(PhpParser\Node $node): ?int + { + if ($node instanceof PhpParser\Node\Expr\Variable && is_string($node->name)) { + $this->used_variables['$' . $node->name] = true; + } + + return null; + } + + /** + * @return array + */ + public function getUsedVariables(): array + { + return $this->used_variables; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php new file mode 100644 index 00000000..38b14e56 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php @@ -0,0 +1,252 @@ + $offset_map + */ + public function __construct(ErrorHandler $errorHandler, ?array $offset_map = null) + { + if ($offset_map) { + foreach ($offset_map as [, , $b_s, $b_e]) { + if ($this->start_change === null) { + $this->start_change = $b_s; + } + + $this->end_change = $b_e; + } + } + + $this->nameContext = new NameContext($errorHandler); + } + + public function beforeTraverse(array $nodes): ?array + { + $this->nameContext->startNamespace(); + + return null; + } + + public function enterNode(Node $node): ?int + { + if ($node instanceof Stmt\Namespace_) { + $this->nameContext->startNamespace($node->name); + } elseif ($node instanceof Stmt\Use_) { + foreach ($node->uses as $use) { + $this->addAlias($use, $node->type); + } + } elseif ($node instanceof Stmt\GroupUse) { + foreach ($node->uses as $use) { + $this->addAlias($use, $node->type, $node->prefix); + } + } elseif ($node instanceof Stmt\Class_) { + if (null !== $node->extends) { + $node->extends = $this->resolveClassName($node->extends); + } + foreach ($node->implements as &$interface) { + $interface = $this->resolveClassName($interface); + } + $this->resolveAttrGroups($node); + if (null !== $node->name) { + $this->addNamespacedName($node); + } + } + + if ($node instanceof Stmt\ClassMethod + && $this->start_change + && $this->end_change + ) { + /** @var array{startFilePos: int, endFilePos: int} */ + $attrs = $node->getAttributes(); + + if ($cs = $node->getComments()) { + $attrs['startFilePos'] = $cs[0]->getStartFilePos(); + } + + if ($attrs['endFilePos'] < $this->start_change + || $attrs['startFilePos'] > $this->end_change + ) { + return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; + } + } + + if ($node instanceof Stmt\ClassMethod + || $node instanceof Expr\Closure + ) { + $this->resolveSignature($node); + } elseif ($node instanceof Expr\StaticCall + || $node instanceof Expr\StaticPropertyFetch + || $node instanceof Expr\ClassConstFetch + || $node instanceof Expr\New_ + || $node instanceof Expr\Instanceof_ + ) { + if ($node->class instanceof Name) { + $node->class = $this->resolveClassName($node->class); + } + } elseif ($node instanceof Stmt\Catch_) { + foreach ($node->types as &$type) { + $type = $this->resolveClassName($type); + } + } elseif ($node instanceof Expr\FuncCall) { + if ($node->name instanceof Name) { + $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); + } + } elseif ($node instanceof Expr\ConstFetch) { + $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); + } elseif ($node instanceof Stmt\Trait_) { + $this->resolveTrait($node); + } elseif ($node instanceof Stmt\TraitUse) { + foreach ($node->traits as &$trait) { + $trait = $this->resolveClassName($trait); + } + + foreach ($node->adaptations as $adaptation) { + if (null !== $adaptation->trait) { + $adaptation->trait = $this->resolveClassName($adaptation->trait); + } + + if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { + foreach ($adaptation->insteadof as &$insteadof) { + $insteadof = $this->resolveClassName($insteadof); + } + } + } + } + + return null; + } + + private function addAlias(Stmt\UseUse $use, int $type, ?Name $prefix = null): void + { + // Add prefix for group uses + /** @var Name $name */ + $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; + // Type is determined either by individual element or whole use declaration + $type |= $use->type; + + $this->nameContext->addAlias( + $name, + (string) $use->getAlias(), + $type, + $use->getAttributes() + ); + } + + /** + * @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node + */ + private function resolveSignature(PhpParser\NodeAbstract $node): void + { + foreach ($node->params as $param) { + $param->type = $this->resolveType($param->type); + } + $node->returnType = $this->resolveType($node->returnType); + } + + /** + * @template T of Node|null + * @param T $node + * @return ($node is NullableType ? NullableType : ($node is Name ? Name : T)) + * @psalm-suppress LessSpecificReturnType + */ + private function resolveType(?Node $node): ?Node + { + if ($node instanceof NullableType) { + $node->type = $this->resolveType($node->type); + + return $node; + } + if ($node instanceof Name) { + return $this->resolveClassName($node); + } + + return $node; + } + + /** + * Resolve name, according to name resolver options. + * + * CAVE: Attribute values are of type `string`, this is + * different to PhpParser's `NameResolver` using objects. + * + * @param Name $name Function or constant name to resolve + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* + * + * @return Name Resolved name, or original name with attribute + */ + protected function resolveName(Name $name, int $type): Name + { + $resolvedName = $this->nameContext->getResolvedName($name, $type); + if (null !== $resolvedName) { + $name->setAttribute('resolvedName', $resolvedName->toString()); + } else { + $namespaceName = Name\FullyQualified::concat( + $this->nameContext->getNamespace(), + $name, + $name->getAttributes() + ); + if ($namespaceName instanceof Name) { + $name->setAttribute('namespacedName', $namespaceName->toString()); + } + } + return $name; + } + + protected function resolveClassName(Name $name): Name + { + return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); + } + + protected function addNamespacedName(Stmt\Class_ $node): void + { + $node->setAttribute('namespacedName', Name::concat( + $this->nameContext->getNamespace(), + (string)$node->name + )); + } + + protected function resolveAttrGroups(Stmt\Class_ $node): void + { + foreach ($node->attrGroups as $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + $attr->name = $this->resolveClassName($attr->name); + } + } + } + + protected function resolveTrait(Stmt\Trait_ $node): void + { + $resolvedName = Name::concat($this->nameContext->getNamespace(), (string) $node->name); + + if (null !== $resolvedName) { + $node->setAttribute('resolvedName', $resolvedName->toString()); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php new file mode 100644 index 00000000..93a05225 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php @@ -0,0 +1,84 @@ + */ + private $matching_trait_nodes = []; + + private $fq_trait_name; + + public function __construct(string $fq_trait_name) + { + $this->fq_trait_name = $fq_trait_name; + } + + public function enterNode(PhpParser\Node $node, bool &$traverseChildren = true): ?int + { + if ($node instanceof PhpParser\Node\Stmt\Trait_) { + /** @var ?string */ + $resolved_name = $node->getAttribute('resolvedName'); + + if ($resolved_name === null) { + // compare ends of names, a temporary hack because PHPParser caches + // may not have that attribute + + $fq_trait_name_parts = explode('\\', $this->fq_trait_name); + + /** @psalm-suppress PossiblyNullPropertyFetch */ + if ($node->name->name === end($fq_trait_name_parts)) { + $this->matching_trait_nodes[] = $node; + } + } elseif ($resolved_name === $this->fq_trait_name) { + $this->matching_trait_nodes[] = $node; + } + } + + if ($node instanceof PhpParser\Node\Stmt\ClassLike + || $node instanceof PhpParser\Node\FunctionLike + ) { + return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; + } + + return null; + } + + public function getNode(): ?PhpParser\Node\Stmt\Trait_ + { + if (!count($this->matching_trait_nodes)) { + return null; + } + + if (count($this->matching_trait_nodes) === 1 || !trait_exists($this->fq_trait_name)) { + return $this->matching_trait_nodes[0]; + } + + try { + $reflection_trait = new ReflectionClass($this->fq_trait_name); + } catch (Throwable $t) { + return null; + } + + foreach ($this->matching_trait_nodes as $node) { + if ($node->getLine() === $reflection_trait->getStartLine()) { + return $node; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php new file mode 100644 index 00000000..05704e14 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php @@ -0,0 +1,41 @@ +fake_type_provider = $fake_type_provider; + $this->real_type_provider = $real_type_provider; + } + + /** + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingAnyTypeHint + */ + public function enterNode(Node $node) + { + $origNode = $node; + + /** @psalm-suppress ArgumentTypeCoercion */ + $node_type = $this->fake_type_provider->getType($origNode); + + if ($node_type) { + /** @psalm-suppress ArgumentTypeCoercion */ + $this->real_type_provider->setType($origNode, clone $node_type); + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php new file mode 100644 index 00000000..ae05fb47 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php @@ -0,0 +1,86 @@ +plugin_list_factory = $plugin_list_factory; + parent::__construct(); + } + + protected function configure(): void + { + $this + ->setName('disable') + ->setDescription('Disables a named plugin') + ->addArgument( + 'pluginName', + InputArgument::REQUIRED, + 'Plugin name (fully qualified class name or composer package name)' + ) + ->addOption('config', 'c', InputOption::VALUE_REQUIRED, 'Path to Psalm config file') + ->addUsage('vendor/plugin-package-name [-c path/to/psalm.xml]'); + $this->addUsage('\'Plugin\Class\Name\' [-c path/to/psalm.xml]'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + $current_dir = (string) getcwd() . DIRECTORY_SEPARATOR; + + $config_file_path = $input->getOption('config'); + if ($config_file_path !== null && !is_string($config_file_path)) { + throw new UnexpectedValueException('Config file path should be a string'); + } + + $plugin_list = ($this->plugin_list_factory)($current_dir, $config_file_path); + + $plugin_name = $input->getArgument('pluginName'); + + assert(is_string($plugin_name)); + + try { + $plugin_class = $plugin_list->resolvePluginClass($plugin_name); + } catch (InvalidArgumentException $e) { + $io->error('Unknown plugin class ' . $plugin_name); + + return 2; + } + + if (!$plugin_list->isEnabled($plugin_class)) { + $io->note('Plugin already disabled'); + + return 3; + } + + $plugin_list->disable($plugin_class); + $io->success('Plugin disabled'); + + return 0; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php new file mode 100644 index 00000000..d868ca18 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php @@ -0,0 +1,86 @@ +plugin_list_factory = $plugin_list_factory; + parent::__construct(); + } + + protected function configure(): void + { + $this + ->setName('enable') + ->setDescription('Enables a named plugin') + ->addArgument( + 'pluginName', + InputArgument::REQUIRED, + 'Plugin name (fully qualified class name or composer package name)' + ) + ->addOption('config', 'c', InputOption::VALUE_REQUIRED, 'Path to Psalm config file') + ->addUsage('vendor/plugin-package-name [-c path/to/psalm.xml]'); + $this->addUsage('\'Plugin\Class\Name\' [-c path/to/psalm.xml]'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + $current_dir = (string) getcwd() . DIRECTORY_SEPARATOR; + + $config_file_path = $input->getOption('config'); + if ($config_file_path !== null && !is_string($config_file_path)) { + throw new UnexpectedValueException('Config file path should be a string'); + } + + $plugin_list = ($this->plugin_list_factory)($current_dir, $config_file_path); + + $plugin_name = $input->getArgument('pluginName'); + + assert(is_string($plugin_name)); + + try { + $plugin_class = $plugin_list->resolvePluginClass($plugin_name); + } catch (InvalidArgumentException $e) { + $io->error('Unknown plugin class ' . $plugin_name); + + return 2; + } + + if ($plugin_list->isEnabled($plugin_class)) { + $io->note('Plugin already enabled'); + + return 3; + } + + $plugin_list->enable($plugin_class); + $io->success('Plugin enabled'); + + return 0; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php new file mode 100644 index 00000000..1ef61655 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php @@ -0,0 +1,98 @@ +plugin_list_factory = $plugin_list_factory; + parent::__construct(); + } + + protected function configure(): void + { + $this + ->setName('show') + ->setDescription('Lists enabled and available plugins') + ->addOption('config', 'c', InputOption::VALUE_REQUIRED, 'Path to Psalm config file') + ->addUsage('[-c path/to/psalm.xml]'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + $current_dir = (string) getcwd() . DIRECTORY_SEPARATOR; + + $config_file_path = $input->getOption('config'); + if ($config_file_path !== null && !is_string($config_file_path)) { + throw new UnexpectedValueException('Config file path should be a string'); + } + + $plugin_list = ($this->plugin_list_factory)($current_dir, $config_file_path); + + $enabled = $plugin_list->getEnabled(); + $available = $plugin_list->getAvailable(); + + $formatRow = + /** + * @return array{0: null|string, 1: string} + */ + function (string $class, ?string $package): array { + return [$package, $class]; + }; + + $io->section('Enabled'); + if (count($enabled)) { + $io->table( + ['Package', 'Class'], + array_map( + $formatRow, + array_keys($enabled), + array_values($enabled) + ) + ); + } else { + $io->note('No plugins enabled'); + } + + $io->section('Available'); + if (count($available)) { + $io->table( + ['Package', 'Class'], + array_map( + $formatRow, + array_keys($available), + array_values($available) + ) + ); + } else { + $io->note('No plugins available'); + } + + return 0; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php new file mode 100644 index 00000000..fd5d251e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php @@ -0,0 +1,111 @@ +file_names = $file_names; + } + + /** + * @param mixed $package + * + * @psalm-assert-if-true array{name: string, extra: array{psalm: array{pluginClass: string}}} $package + * + * @psalm-pure + */ + public function isPlugin($package): bool + { + return is_array($package) + && isset($package['name'], $package['extra']['psalm']['pluginClass']) + && is_string($package['name']) + && is_array($package['extra']) + && is_array($package['extra']['psalm']) + && is_string($package['extra']['psalm']['pluginClass']); + } + + /** + * @return array [packageName => pluginClass, ...] + */ + public function getPlugins(): array + { + $pluginPackages = $this->getAllPluginPackages(); + $ret = []; + foreach ($pluginPackages as $package) { + $ret[$package['name']] = $package['extra']['psalm']['pluginClass']; + } + + return $ret; + } + + private function read(string $file_name): array + { + $contents = json_decode(file_get_contents($file_name), true); + + if ($error = json_last_error()) { + throw new RuntimeException(json_last_error_msg(), $error); + } + + if (!is_array($contents)) { + throw new RuntimeException('Malformed ' . $file_name . ', expecting JSON-encoded object'); + } + + return $contents; + } + + /** + * @return list + */ + private function getAllPluginPackages(): array + { + $packages = $this->getAllPackages(); + $ret = []; + /** @psalm-suppress MixedAssignment */ + foreach ($packages as $package) { + if ($this->isPlugin($package)) { + $ret[] = $package; + } + } + + return $ret; + } + + private function getAllPackages(): array + { + $packages = []; + foreach ($this->file_names as $file_name) { + $composer_lock_contents = $this->read($file_name); + if (!isset($composer_lock_contents['packages']) || !is_array($composer_lock_contents['packages'])) { + throw new RuntimeException('packages section is missing or not an array'); + } + if (!isset($composer_lock_contents['packages-dev']) || !is_array($composer_lock_contents['packages-dev'])) { + throw new RuntimeException('packages-dev section is missing or not an array'); + } + $packages = array_merge( + $packages, + array_merge( + $composer_lock_contents['packages'], + $composer_lock_contents['packages-dev'] + ) + ); + } + + return $packages; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php new file mode 100644 index 00000000..a945dd24 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php @@ -0,0 +1,152 @@ +current_dir = $current_dir; + + if ($explicit_path) { + $this->path = $explicit_path; + } else { + $path = Config::locateConfigFile($current_dir); + if (!$path) { + throw new RuntimeException('Cannot find Psalm config'); + } + $this->path = $path; + } + } + + public function getConfig(): Config + { + return Config::loadFromXMLFile($this->path, $this->current_dir); + } + + public function removePlugin(string $plugin_class): void + { + $config_xml = $this->readXml(); + /** @var DomElement */ + $psalm_root = $config_xml->getElementsByTagName('psalm')[0]; + $plugins_elements = $psalm_root->getElementsByTagName('plugins'); + if (!$plugins_elements->length) { + // no plugins, nothing to remove + return; + } + + /** @var DomElement */ + $plugins_element = $plugins_elements->item(0); + + $plugin_elements = $plugins_element->getElementsByTagName('pluginClass'); + + foreach ($plugin_elements as $plugin_element) { + if ($plugin_element->getAttribute('class') === $plugin_class) { + $plugins_element->removeChild($plugin_element); + break; + } + } + + if (!$plugin_elements->length) { + // avoid breaking old psalm binaries, whose schema did not allow empty plugins + $psalm_root->removeChild($plugins_element); + } + + $this->saveXml($config_xml); + } + + public function addPlugin(string $plugin_class): void + { + $config_xml = $this->readXml(); + /** @var DomElement */ + $psalm_root = $config_xml->getElementsByTagName('psalm')->item(0); + $plugins_elements = $psalm_root->getElementsByTagName('plugins'); + if (!$plugins_elements->length) { + $plugins_element = $config_xml->createElement('plugins'); + if ($plugins_element) { + $psalm_root->appendChild($plugins_element); + } + } else { + /** @var DomElement */ + $plugins_element = $plugins_elements->item(0); + } + + $plugin_class_element = $config_xml->createElement('pluginClass'); + if ($plugin_class_element) { + $plugin_class_element->setAttribute('xmlns', Config::CONFIG_NAMESPACE); + $plugin_class_element->setAttribute('class', $plugin_class); + if ($plugins_element) { + $plugins_element->appendChild($plugin_class_element); + } + } + + $this->saveXml($config_xml); + } + + private function readXml(): DOMDocument + { + $doc = new DOMDocument(); + + $file_contents = file_get_contents($this->path); + + if (($tag_start = strpos($file_contents, '', $tag_start + 1); + + if ($tag_end !== false) { + $this->psalm_tag_end_pos = $tag_end; + $this->psalm_header = substr($file_contents, 0, $tag_end); + } + } + + assert($file_contents !== ''); + $doc->loadXML($file_contents); + + return $doc; + } + + private function saveXml(DOMDocument $config_xml): void + { + $new_file_contents = $config_xml->saveXML($config_xml); + + if (($tag_start = strpos($new_file_contents, '', $tag_start + 1); + + if ($tag_end !== false + && ($new_file_contents[$tag_end - 1] !== '/') + && $this->psalm_tag_end_pos + && $this->psalm_header + ) { + $new_file_contents = $this->psalm_header . substr($new_file_contents, $tag_end); + } + } + + $result = file_put_contents($this->path, $new_file_contents); + if ($result === false) { + throw new RuntimeException(sprintf('Unable to save xml to %s', $this->path)); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php new file mode 100644 index 00000000..7f5d9052 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php @@ -0,0 +1,120 @@ + [pluginClass => packageName] */ + private $all_plugins; + + /** @var ?array [pluginClass => ?packageName] */ + private $enabled_plugins; + + public function __construct(?ConfigFile $config_file, ComposerLock $composer_lock) + { + $this->config_file = $config_file; + $this->composer_lock = $composer_lock; + } + + /** + * @return array [pluginClass => ?packageName, ...] + */ + public function getEnabled(): array + { + if (!$this->enabled_plugins) { + $this->enabled_plugins = []; + if ($this->config_file) { + foreach ($this->config_file->getConfig()->getPluginClasses() as $plugin_entry) { + $plugin_class = $plugin_entry['class']; + $this->enabled_plugins[$plugin_class] = $this->findPluginPackage($plugin_class); + } + } + } + + return $this->enabled_plugins; + } + + /** + * @return array [pluginCLass => ?packageName] + */ + public function getAvailable(): array + { + return array_diff_key($this->getAll(), $this->getEnabled()); + } + + /** + * @return array [pluginClass => packageName] + */ + public function getAll(): array + { + if (null === $this->all_plugins) { + $this->all_plugins = array_flip($this->composer_lock->getPlugins()); + } + + return $this->all_plugins; + } + + public function resolvePluginClass(string $class_or_package): string + { + if (false === strpos($class_or_package, '/')) { + return $class_or_package; // must be a class then + } + + // pluginClass => ?pluginPackage + $plugin_classes = $this->getAll(); + + $class = array_search($class_or_package, $plugin_classes, true); + + if (false === $class) { + throw new InvalidArgumentException('Unknown plugin: ' . $class_or_package); + } + + return $class; + } + + public function findPluginPackage(string $class): ?string + { + // pluginClass => ?pluginPackage + $plugin_classes = $this->getAll(); + + return $plugin_classes[$class] ?? null; + } + + public function isEnabled(string $class): bool + { + return array_key_exists($class, $this->getEnabled()); + } + + public function enable(string $class): void + { + if (!$this->config_file) { + throw new RuntimeException('Cannot find Psalm config'); + } + + $this->config_file->addPlugin($class); + } + + public function disable(string $class): void + { + if (!$this->config_file) { + throw new RuntimeException('Cannot find Psalm config'); + } + + $this->config_file->removePlugin($class); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php new file mode 100644 index 00000000..0683365f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php @@ -0,0 +1,76 @@ +project_root = $project_root; + $this->psalm_root = $psalm_root; + } + + public function __invoke(string $current_dir, ?string $config_file_path = null): PluginList + { + try { + $config_file = new ConfigFile($current_dir, $config_file_path); + } catch (RuntimeException $exception) { + $config_file = null; + } + $composer_lock = new ComposerLock($this->findLockFiles()); + + return new PluginList($config_file, $composer_lock); + } + + /** @return non-empty-array */ + private function findLockFiles(): array + { + // use cases + // 1. plugins are installed into project vendors - composer.lock is PROJECT_ROOT/composer.lock + // 2. plugins are installed into separate composer environment (either global or bamarni-bin) + // - composer.lock is PSALM_ROOT/../../../composer.lock + // 3. plugins are installed into psalm vendors - composer.lock is PSALM_ROOT/composer.lock + // 4. none of the above - use stub (empty virtual composer.lock) + + if ($this->psalm_root === $this->project_root) { + // managing plugins for psalm itself + $composer_lock_filenames = [ + Composer::getLockFilePath(rtrim($this->psalm_root, DIRECTORY_SEPARATOR)), + ]; + } else { + $composer_lock_filenames = [ + Composer::getLockFilePath(rtrim($this->project_root, DIRECTORY_SEPARATOR)), + Composer::getLockFilePath(rtrim($this->psalm_root, DIRECTORY_SEPARATOR) . '/../../..'), + Composer::getLockFilePath(rtrim($this->psalm_root, DIRECTORY_SEPARATOR)), + ]; + } + + $composer_lock_filenames = array_filter($composer_lock_filenames, 'is_readable'); + + if (empty($composer_lock_filenames)) { + $stub_composer_lock = (object)[ + 'packages' => [], + 'packages-dev' => [], + ]; + $composer_lock_filenames[] = 'data:application/json,' . urlencode(json_encode($stub_composer_lock)); + } + + return $composer_lock_filenames; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php new file mode 100644 index 00000000..d3328a5d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php @@ -0,0 +1,115 @@ + + */ + public static function addTaints(AddRemoveTaintsEvent $event): array + { + $item = $event->getExpr(); + $statements_analyzer = $event->getStatementsSource(); + + if (!$statements_analyzer instanceof StatementsAnalyzer + || !$item instanceof PhpParser\Node\Expr\FuncCall + || $item->isFirstClassCallable() + || !$item->name instanceof PhpParser\Node\Name + || count($item->name->parts) !== 1 + || count($item->getArgs()) === 0 + ) { + return []; + } + + $function_id = strtolower($item->name->parts[0]); + + if ($function_id === 'html_entity_decode' + || $function_id === 'htmlspecialchars_decode' + ) { + $second_arg = $item->getArgs()[1]->value ?? null; + + if ($second_arg === null) { + return ['html']; + } + + $second_arg_value = $statements_analyzer->node_data->getType($second_arg); + + if (!$second_arg_value || !$second_arg_value->isSingleIntLiteral()) { + return ['html']; + } + + $second_arg_value = $second_arg_value->getSingleIntLiteral()->value; + + if (($second_arg_value & ENT_QUOTES) === ENT_QUOTES) { + return ['html', 'has_quotes']; + } + + return ['html']; + } + + return []; + } + + /** + * Called to see what taints should be removed + * + * @return list + */ + public static function removeTaints(AddRemoveTaintsEvent $event): array + { + $item = $event->getExpr(); + $statements_analyzer = $event->getStatementsSource(); + + if (!$statements_analyzer instanceof StatementsAnalyzer + || !$item instanceof PhpParser\Node\Expr\FuncCall + || $item->isFirstClassCallable() + || !$item->name instanceof PhpParser\Node\Name + || count($item->name->parts) !== 1 + || count($item->getArgs()) === 0 + ) { + return []; + } + + $function_id = strtolower($item->name->parts[0]); + + if ($function_id === 'htmlentities' + || $function_id === 'htmlspecialchars' + ) { + $second_arg = $item->getArgs()[1]->value ?? null; + + if ($second_arg === null) { + return ['html']; + } + + $second_arg_value = $statements_analyzer->node_data->getType($second_arg); + + if (!$second_arg_value || !$second_arg_value->isSingleIntLiteral()) { + return ['html']; + } + + $second_arg_value = $second_arg_value->getSingleIntLiteral()->value; + + if (($second_arg_value & ENT_QUOTES) === ENT_QUOTES) { + return ['html', 'has_quotes']; + } + + return ['html']; + } + + return []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php new file mode 100644 index 00000000..dae227f5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php @@ -0,0 +1,182 @@ +config = $config; + + $storage_dir = dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'Storage' . DIRECTORY_SEPARATOR; + + $dependent_files = [ + $storage_dir . 'FileStorage.php', + $storage_dir . 'FunctionLikeStorage.php', + $storage_dir . 'ClassLikeStorage.php', + $storage_dir . 'MethodStorage.php', + ]; + + if ($config->eventDispatcher->hasAfterClassLikeVisitHandlers()) { + $dependent_files = array_merge($dependent_files, $config->plugin_paths); + } + + foreach ($dependent_files as $dependent_file_path) { + if (!file_exists($dependent_file_path)) { + throw new UnexpectedValueException($dependent_file_path . ' must exist'); + } + + $this->modified_timestamps .= ' ' . filemtime($dependent_file_path); + } + + $this->modified_timestamps .= $this->config->computeHash(); + } + + public function writeToCache(ClassLikeStorage $storage, string $file_path, string $file_contents): void + { + $fq_classlike_name_lc = strtolower($storage->name); + + $storage->hash = $this->getCacheHash($file_path, $file_contents); + + // check if we have it in cache already + $cached_value = $this->loadFromCache($fq_classlike_name_lc, $file_path); + if (!is_null($cached_value) && $cached_value->hash === $storage->hash) { + return; + } + + $cache_location = $this->getCacheLocationForClass($fq_classlike_name_lc, $file_path, true); + if ($this->config->use_igbinary) { + file_put_contents($cache_location, igbinary_serialize($storage)); + } else { + file_put_contents($cache_location, serialize($storage)); + } + } + + public function getLatestFromCache( + string $fq_classlike_name_lc, + ?string $file_path, + ?string $file_contents + ): ClassLikeStorage { + $cached_value = $this->loadFromCache($fq_classlike_name_lc, $file_path); + + if (!$cached_value) { + throw new UnexpectedValueException($fq_classlike_name_lc . ' should be in cache'); + } + + $cache_hash = $this->getCacheHash($file_path, $file_contents); + + /** @psalm-suppress TypeDoesNotContainType */ + if (@get_class($cached_value) === '__PHP_Incomplete_Class' + || $cache_hash !== $cached_value->hash + ) { + unlink($this->getCacheLocationForClass($fq_classlike_name_lc, $file_path)); + + throw new UnexpectedValueException($fq_classlike_name_lc . ' should not be outdated'); + } + + return $cached_value; + } + + private function getCacheHash(?string $_unused_file_path, ?string $file_contents): string + { + $data = $file_contents ? $file_contents : $this->modified_timestamps; + return PHP_VERSION_ID >= 80100 ? hash('xxh128', $data) : hash('md4', $data); + } + + /** + * @psalm-suppress MixedAssignment + */ + private function loadFromCache(string $fq_classlike_name_lc, ?string $file_path): ?ClassLikeStorage + { + $cache_location = $this->getCacheLocationForClass($fq_classlike_name_lc, $file_path); + + if (file_exists($cache_location)) { + if ($this->config->use_igbinary) { + $storage = igbinary_unserialize((string)file_get_contents($cache_location)); + + if ($storage instanceof ClassLikeStorage) { + return $storage; + } + + return null; + } + + $storage = unserialize((string)file_get_contents($cache_location)); + + if ($storage instanceof ClassLikeStorage) { + return $storage; + } + + return null; + } + + return null; + } + + private function getCacheLocationForClass( + string $fq_classlike_name_lc, + ?string $file_path, + bool $create_directory = false + ): string { + $root_cache_directory = $this->config->getCacheDirectory(); + + if (!$root_cache_directory) { + throw new UnexpectedValueException('No cache directory defined'); + } + + $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::CLASS_CACHE_DIRECTORY; + + if ($create_directory && !is_dir($parser_cache_directory)) { + mkdir($parser_cache_directory, 0777, true); + } + + $data = $file_path ? strtolower($file_path) . ' ' : ''; + $data .= $fq_classlike_name_lc; + $file_path_sha = PHP_VERSION_ID >= 80100 ? hash('xxh128', $data) : hash('md4', $data); + + return $parser_cache_directory + . DIRECTORY_SEPARATOR + . $file_path_sha + . ($this->config->use_igbinary ? '-igbinary' : ''); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php new file mode 100644 index 00000000..bedf9b64 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php @@ -0,0 +1,138 @@ + + */ + private static $storage = []; + + /** + * @var array + */ + private static $new_storage = []; + + /** + * @var ?ClassLikeStorageCacheProvider + */ + public $cache; + + public function __construct(?ClassLikeStorageCacheProvider $cache = null) + { + $this->cache = $cache; + } + + /** + * @throws InvalidArgumentException when class does not exist + */ + public function get(string $fq_classlike_name): ClassLikeStorage + { + $fq_classlike_name_lc = strtolower($fq_classlike_name); + if (!isset(self::$storage[$fq_classlike_name_lc])) { + throw new InvalidArgumentException('Could not get class storage for ' . $fq_classlike_name_lc); + } + + return self::$storage[$fq_classlike_name_lc]; + } + + public function has(string $fq_classlike_name): bool + { + $fq_classlike_name_lc = strtolower($fq_classlike_name); + + return isset(self::$storage[$fq_classlike_name_lc]); + } + + public function exhume(string $fq_classlike_name, string $file_path, string $file_contents): ClassLikeStorage + { + $fq_classlike_name_lc = strtolower($fq_classlike_name); + + if (isset(self::$storage[$fq_classlike_name_lc])) { + return self::$storage[$fq_classlike_name_lc]; + } + + if (!$this->cache) { + throw new LogicException('Cannot exhume when there’s no cache'); + } + + $cached_value = $this->cache->getLatestFromCache($fq_classlike_name_lc, $file_path, $file_contents); + + self::$storage[$fq_classlike_name_lc] = $cached_value; + self::$new_storage[$fq_classlike_name_lc] = $cached_value; + + return $cached_value; + } + + /** + * @return array + */ + public function getAll(): array + { + return self::$storage; + } + + /** + * @return array + */ + public function getNew(): array + { + return self::$new_storage; + } + + /** + * @param array $more + * + */ + public function addMore(array $more): void + { + self::$new_storage = array_merge(self::$new_storage, $more); + self::$storage = array_merge(self::$storage, $more); + } + + public function makeNew(string $fq_classlike_name_lc): void + { + self::$new_storage[$fq_classlike_name_lc] = self::$storage[$fq_classlike_name_lc]; + } + + public function create(string $fq_classlike_name): ClassLikeStorage + { + $fq_classlike_name_lc = strtolower($fq_classlike_name); + + $storage = new ClassLikeStorage($fq_classlike_name); + self::$storage[$fq_classlike_name_lc] = $storage; + self::$new_storage[$fq_classlike_name_lc] = $storage; + + return $storage; + } + + public function remove(string $fq_classlike_name): void + { + $fq_classlike_name_lc = strtolower($fq_classlike_name); + + unset(self::$storage[$fq_classlike_name_lc]); + } + + public static function deleteAll(): void + { + self::$storage = []; + self::$new_storage = []; + } + + public static function populated(): void + { + self::$new_storage = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php new file mode 100644 index 00000000..a94071ad --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php @@ -0,0 +1,75 @@ + + */ + public $fake_files = []; + + /** + * @var array + */ + public $fake_file_times = []; + + public function fileExists(string $file_path): bool + { + return isset($this->fake_files[$file_path]) || parent::fileExists($file_path); + } + + public function getContents(string $file_path, bool $go_to_source = false): string + { + if (!$go_to_source && isset($this->temp_files[$file_path])) { + return $this->temp_files[$file_path]; + } + + return $this->fake_files[$file_path] ?? parent::getContents($file_path); + } + + public function setContents(string $file_path, string $file_contents): void + { + $this->fake_files[$file_path] = $file_contents; + } + + public function setOpenContents(string $file_path, string $file_contents): void + { + if (isset($this->fake_files[$file_path])) { + $this->fake_files[$file_path] = $file_contents; + } + } + + public function getModifiedTime(string $file_path): int + { + return $this->fake_file_times[$file_path] ?? parent::getModifiedTime($file_path); + } + + public function registerFile(string $file_path, string $file_contents): void + { + $this->fake_files[$file_path] = $file_contents; + $this->fake_file_times[$file_path] = (int)microtime(true); + } + + /** + * @param array $file_extensions + * @param null|callable(string):bool $filter + * + * @return list + */ + public function getFilesInDir(string $dir_path, array $file_extensions, callable $filter = null): array + { + $file_paths = parent::getFilesInDir($dir_path, $file_extensions, $filter); + + foreach ($this->fake_files as $file_path => $_) { + if (strpos($file_path, $dir_path) === 0) { + $file_paths[] = $file_path; + } + } + + return $file_paths; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php new file mode 100644 index 00000000..66d5aad3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php @@ -0,0 +1,163 @@ + + */ + protected $temp_files = []; + + /** + * @var array + */ + protected static $open_files = []; + + public function getContents(string $file_path, bool $go_to_source = false): string + { + if (!$go_to_source && isset($this->temp_files[$file_path])) { + return $this->temp_files[$file_path]; + } + + if (isset(self::$open_files[$file_path])) { + return self::$open_files[$file_path]; + } + + if (!file_exists($file_path)) { + throw new UnexpectedValueException('File ' . $file_path . ' should exist to get contents'); + } + + if (is_dir($file_path)) { + throw new UnexpectedValueException('File ' . $file_path . ' is a directory'); + } + + $file_contents = (string) file_get_contents($file_path); + + self::$open_files[$file_path] = $file_contents; + + return $file_contents; + } + + public function setContents(string $file_path, string $file_contents): void + { + if (isset(self::$open_files[$file_path])) { + self::$open_files[$file_path] = $file_contents; + } + + if (isset($this->temp_files[$file_path])) { + $this->temp_files[$file_path] = $file_contents; + } + + file_put_contents($file_path, $file_contents); + } + + public function setOpenContents(string $file_path, string $file_contents): void + { + if (isset(self::$open_files[$file_path])) { + self::$open_files[$file_path] = $file_contents; + } + } + + public function getModifiedTime(string $file_path): int + { + if (!file_exists($file_path)) { + throw new UnexpectedValueException('File should exist to get modified time'); + } + + return (int) filemtime($file_path); + } + + public function addTemporaryFileChanges(string $file_path, string $new_content): void + { + $this->temp_files[$file_path] = $new_content; + } + + public function removeTemporaryFileChanges(string $file_path): void + { + unset($this->temp_files[$file_path]); + } + + public function openFile(string $file_path): void + { + self::$open_files[$file_path] = $this->getContents($file_path, true); + } + + public function isOpen(string $file_path): bool + { + return isset($this->temp_files[$file_path]) || isset(self::$open_files[$file_path]); + } + + public function closeFile(string $file_path): void + { + unset($this->temp_files[$file_path], self::$open_files[$file_path]); + } + + public function fileExists(string $file_path): bool + { + return file_exists($file_path); + } + + /** + * @param array $file_extensions + * @param null|callable(string):bool $filter + * + * @return list + */ + public function getFilesInDir(string $dir_path, array $file_extensions, callable $filter = null): array + { + $file_paths = []; + + $iterator = new RecursiveDirectoryIterator( + $dir_path, + FilesystemIterator::CURRENT_AS_PATHNAME | FilesystemIterator::SKIP_DOTS + ); + + if ($filter !== null) { + $iterator = new RecursiveCallbackFilterIterator( + $iterator, + /** @param mixed $_ */ + function (string $current, $_, RecursiveIterator $iterator) use ($filter): bool { + if ($iterator->hasChildren()) { + $path = $current . DIRECTORY_SEPARATOR; + } else { + $path = $current; + } + + return $filter($path); + } + ); + } + + /** @var RecursiveDirectoryIterator */ + $iterator = new RecursiveIteratorIterator($iterator); + $iterator->rewind(); + + while ($iterator->valid()) { + $extension = $iterator->getExtension(); + if (in_array($extension, $file_extensions, true)) { + $file_paths[] = (string)$iterator->getRealPath(); + } + + $iterator->next(); + } + + return $file_paths; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php new file mode 100644 index 00000000..616a1c2c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php @@ -0,0 +1,1007 @@ +config = $config; + } + + public function hasConfigChanged(): bool + { + $new_hash = $this->config->computeHash(); + $has_changed = $new_hash !== $this->getConfigHashCache(); + $this->setConfigHashCache($new_hash); + return $has_changed; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedFileReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::REFERENCE_CACHE_NAME; + + if (!is_readable($reference_cache_location)) { + return null; + } + + if ($this->config->use_igbinary) { + $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); + } else { + $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); + } + + if (!is_array($reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedClassLikeFiles(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASSLIKE_FILE_CACHE_NAME; + + if (!is_readable($reference_cache_location)) { + return null; + } + + if ($this->config->use_igbinary) { + $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); + } else { + $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); + } + + if (!is_array($reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedNonMethodClassReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::NONMETHOD_CLASS_REFERENCE_CACHE_NAME; + + if (!is_readable($reference_cache_location)) { + return null; + } + + if ($this->config->use_igbinary) { + $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); + } else { + $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); + } + + if (!is_array($reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedMethodClassReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_CLASS_REFERENCE_CACHE_NAME; + + if (!is_readable($reference_cache_location)) { + return null; + } + + if ($this->config->use_igbinary) { + $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); + } else { + $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); + } + + if (!is_array($reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedMethodMemberReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $class_member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_METHOD_CACHE_NAME; + + if (!is_readable($class_member_cache_location)) { + return null; + } + + $class_member_reference_cache = (string) file_get_contents($class_member_cache_location); + if ($this->config->use_igbinary) { + $class_member_reference_cache = igbinary_unserialize($class_member_reference_cache); + } else { + $class_member_reference_cache = unserialize($class_member_reference_cache); + } + + if (!is_array($class_member_reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $class_member_reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedMethodDependencies(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $method_dependencies_cache_location + = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_DEPENDENCIES_CACHE_NAME; + + if (!is_readable($method_dependencies_cache_location)) { + return null; + } + + $method_dependencies_cache = (string) file_get_contents($method_dependencies_cache_location); + if ($this->config->use_igbinary) { + $method_dependencies_cache = igbinary_unserialize($method_dependencies_cache); + } else { + $method_dependencies_cache = unserialize($method_dependencies_cache); + } + + if (!is_array($method_dependencies_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $method_dependencies_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedMethodPropertyReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $class_member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_PROPERTY_CACHE_NAME; + + if (!is_readable($class_member_cache_location)) { + return null; + } + + $class_member_reference_cache = (string) file_get_contents($class_member_cache_location); + if ($this->config->use_igbinary) { + $class_member_reference_cache = igbinary_unserialize($class_member_reference_cache); + } else { + $class_member_reference_cache = unserialize($class_member_reference_cache); + } + + if (!is_array($class_member_reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $class_member_reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedMethodMethodReturnReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $class_member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_METHOD_RETURN_CACHE_NAME; + + if (!is_readable($class_member_cache_location)) { + return null; + } + + $class_member_reference_cache = (string) file_get_contents($class_member_cache_location); + if ($this->config->use_igbinary) { + $class_member_reference_cache = igbinary_unserialize($class_member_reference_cache); + } else { + $class_member_reference_cache = unserialize($class_member_reference_cache); + } + + if (!is_array($class_member_reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $class_member_reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedMethodMissingMemberReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $class_member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_MISSING_MEMBER_CACHE_NAME; + + if (!is_readable($class_member_cache_location)) { + return null; + } + + $class_member_reference_cache = (string) file_get_contents($class_member_cache_location); + if ($this->config->use_igbinary) { + $class_member_reference_cache = igbinary_unserialize($class_member_reference_cache); + } else { + $class_member_reference_cache = unserialize($class_member_reference_cache); + } + + if (!is_array($class_member_reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $class_member_reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedFileMemberReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $file_class_member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_CLASS_MEMBER_CACHE_NAME; + + if (!is_readable($file_class_member_cache_location)) { + return null; + } + + $file_class_member_reference_cache = (string) file_get_contents($file_class_member_cache_location); + if ($this->config->use_igbinary) { + $file_class_member_reference_cache = igbinary_unserialize($file_class_member_reference_cache); + } else { + $file_class_member_reference_cache = unserialize($file_class_member_reference_cache); + } + + if (!is_array($file_class_member_reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $file_class_member_reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedFilePropertyReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $file_class_member_cache_location = $cache_directory + . DIRECTORY_SEPARATOR + . self::FILE_CLASS_PROPERTY_CACHE_NAME; + + if (!is_readable($file_class_member_cache_location)) { + return null; + } + + $file_class_member_reference_cache = (string) file_get_contents($file_class_member_cache_location); + if ($this->config->use_igbinary) { + $file_class_member_reference_cache = igbinary_unserialize($file_class_member_reference_cache); + } else { + $file_class_member_reference_cache = unserialize($file_class_member_reference_cache); + } + + if (!is_array($file_class_member_reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $file_class_member_reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedFileMethodReturnReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $file_class_member_cache_location = $cache_directory + . DIRECTORY_SEPARATOR + . self::FILE_METHOD_RETURN_CACHE_NAME; + + if (!is_readable($file_class_member_cache_location)) { + return null; + } + + $file_class_member_reference_cache = (string) file_get_contents($file_class_member_cache_location); + if ($this->config->use_igbinary) { + $file_class_member_reference_cache = igbinary_unserialize($file_class_member_reference_cache); + } else { + $file_class_member_reference_cache = unserialize($file_class_member_reference_cache); + } + + if (!is_array($file_class_member_reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $file_class_member_reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedFileMissingMemberReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $file_class_member_cache_location + = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_MISSING_MEMBER_CACHE_NAME; + + if (!is_readable($file_class_member_cache_location)) { + return null; + } + + $file_class_member_reference_cache = (string) file_get_contents($file_class_member_cache_location); + if ($this->config->use_igbinary) { + $file_class_member_reference_cache = igbinary_unserialize($file_class_member_reference_cache); + } else { + $file_class_member_reference_cache = unserialize($file_class_member_reference_cache); + } + + if (!is_array($file_class_member_reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $file_class_member_reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedMixedMemberNameReferences(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::UNKNOWN_MEMBER_CACHE_NAME; + + if (!is_readable($reference_cache_location)) { + return null; + } + + if ($this->config->use_igbinary) { + $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); + } else { + $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); + } + + if (!is_array($reference_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedMethodParamUses(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_PARAM_USE_CACHE_NAME; + + if (!is_readable($reference_cache_location)) { + return null; + } + + if ($this->config->use_igbinary) { + $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); + } else { + $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); + } + + if (!is_array($reference_cache)) { + throw new UnexpectedValueException('The method param use cache must be an array'); + } + + return $reference_cache; + } + + /** + * @psalm-suppress MixedAssignment + */ + public function getCachedIssues(): ?array + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return null; + } + + $issues_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::ISSUES_CACHE_NAME; + + if (!is_readable($issues_cache_location)) { + return null; + } + + if ($this->config->use_igbinary) { + $issues_cache = igbinary_unserialize((string) file_get_contents($issues_cache_location)); + } else { + $issues_cache = unserialize((string) file_get_contents($issues_cache_location)); + } + + if (!is_array($issues_cache)) { + throw new UnexpectedValueException('The reference cache must be an array'); + } + + return $issues_cache; + } + + public function setCachedFileReferences(array $file_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::REFERENCE_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($reference_cache_location, igbinary_serialize($file_references)); + } else { + file_put_contents($reference_cache_location, serialize($file_references)); + } + } + + public function setCachedClassLikeFiles(array $file_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASSLIKE_FILE_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($reference_cache_location, igbinary_serialize($file_references)); + } else { + file_put_contents($reference_cache_location, serialize($file_references)); + } + } + + public function setCachedNonMethodClassReferences(array $file_class_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::NONMETHOD_CLASS_REFERENCE_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($reference_cache_location, igbinary_serialize($file_class_references)); + } else { + file_put_contents($reference_cache_location, serialize($file_class_references)); + } + } + + public function setCachedMethodClassReferences(array $method_class_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_CLASS_REFERENCE_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($reference_cache_location, igbinary_serialize($method_class_references)); + } else { + file_put_contents($reference_cache_location, serialize($method_class_references)); + } + } + + public function setCachedMethodMemberReferences(array $member_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_METHOD_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($member_cache_location, igbinary_serialize($member_references)); + } else { + file_put_contents($member_cache_location, serialize($member_references)); + } + } + + public function setCachedMethodDependencies(array $member_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_DEPENDENCIES_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($member_cache_location, igbinary_serialize($member_references)); + } else { + file_put_contents($member_cache_location, serialize($member_references)); + } + } + + public function setCachedMethodPropertyReferences(array $property_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_PROPERTY_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($member_cache_location, igbinary_serialize($property_references)); + } else { + file_put_contents($member_cache_location, serialize($property_references)); + } + } + + public function setCachedMethodMethodReturnReferences(array $method_return_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_METHOD_RETURN_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($member_cache_location, igbinary_serialize($method_return_references)); + } else { + file_put_contents($member_cache_location, serialize($method_return_references)); + } + } + + public function setCachedMethodMissingMemberReferences(array $member_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_MISSING_MEMBER_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($member_cache_location, igbinary_serialize($member_references)); + } else { + file_put_contents($member_cache_location, serialize($member_references)); + } + } + + public function setCachedFileMemberReferences(array $member_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_CLASS_MEMBER_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($member_cache_location, igbinary_serialize($member_references)); + } else { + file_put_contents($member_cache_location, serialize($member_references)); + } + } + + public function setCachedFilePropertyReferences(array $property_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_CLASS_PROPERTY_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($member_cache_location, igbinary_serialize($property_references)); + } else { + file_put_contents($member_cache_location, serialize($property_references)); + } + } + + public function setCachedFileMethodReturnReferences(array $method_return_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_METHOD_RETURN_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($member_cache_location, igbinary_serialize($method_return_references)); + } else { + file_put_contents($member_cache_location, serialize($method_return_references)); + } + } + + public function setCachedFileMissingMemberReferences(array $member_references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_MISSING_MEMBER_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($member_cache_location, igbinary_serialize($member_references)); + } else { + file_put_contents($member_cache_location, serialize($member_references)); + } + } + + public function setCachedMixedMemberNameReferences(array $references): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::UNKNOWN_MEMBER_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($reference_cache_location, igbinary_serialize($references)); + } else { + file_put_contents($reference_cache_location, serialize($references)); + } + } + + public function setCachedMethodParamUses(array $uses): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_PARAM_USE_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($reference_cache_location, igbinary_serialize($uses)); + } else { + file_put_contents($reference_cache_location, serialize($uses)); + } + } + + public function setCachedIssues(array $issues): void + { + $cache_directory = $this->config->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $issues_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::ISSUES_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($issues_cache_location, igbinary_serialize($issues)); + } else { + file_put_contents($issues_cache_location, serialize($issues)); + } + } + + /** + * @return array>|false + */ + public function getAnalyzedMethodCache() + { + $cache_directory = $this->config->getCacheDirectory(); + + $analyzed_methods_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::ANALYZED_METHODS_CACHE_NAME; + + if ($cache_directory + && file_exists($analyzed_methods_cache_location) + ) { + if ($this->config->use_igbinary) { + /** @var array> */ + return igbinary_unserialize(file_get_contents($analyzed_methods_cache_location)); + } else { + /** @var array> */ + return unserialize(file_get_contents($analyzed_methods_cache_location)); + } + } + + return false; + } + + /** + * @param array> $analyzed_methods + */ + public function setAnalyzedMethodCache(array $analyzed_methods): void + { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + if ($cache_directory) { + $analyzed_methods_cache_location = $cache_directory + . DIRECTORY_SEPARATOR + . self::ANALYZED_METHODS_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($analyzed_methods_cache_location, igbinary_serialize($analyzed_methods)); + } else { + file_put_contents($analyzed_methods_cache_location, serialize($analyzed_methods)); + } + } + } + + /** + * @return array|false + */ + public function getFileMapCache() + { + $cache_directory = $this->config->getCacheDirectory(); + + $file_maps_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_MAPS_CACHE_NAME; + + if ($cache_directory + && file_exists($file_maps_cache_location) + ) { + if ($this->config->use_igbinary) { + /** + * @var array + */ + $file_maps_cache = igbinary_unserialize(file_get_contents($file_maps_cache_location)); + } else { + /** + * @var array + */ + $file_maps_cache = unserialize(file_get_contents($file_maps_cache_location)); + } + + return $file_maps_cache; + } + + return false; + } + + /** + * @param array $file_maps + */ + public function setFileMapCache(array $file_maps): void + { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + if ($cache_directory) { + $file_maps_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_MAPS_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($file_maps_cache_location, igbinary_serialize($file_maps)); + } else { + file_put_contents($file_maps_cache_location, serialize($file_maps)); + } + } + } + + /** + * @return array|false + */ + public function getTypeCoverage() + { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + $type_coverage_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::TYPE_COVERAGE_CACHE_NAME; + + if ($cache_directory + && file_exists($type_coverage_cache_location) + ) { + if ($this->config->use_igbinary) { + /** @var array */ + $type_coverage_cache = igbinary_unserialize(file_get_contents($type_coverage_cache_location)); + } else { + /** @var array */ + $type_coverage_cache = unserialize(file_get_contents($type_coverage_cache_location)); + } + + return $type_coverage_cache; + } + + return false; + } + + /** + * @param array $mixed_counts + */ + public function setTypeCoverage(array $mixed_counts): void + { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + if ($cache_directory) { + $type_coverage_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::TYPE_COVERAGE_CACHE_NAME; + + if ($this->config->use_igbinary) { + file_put_contents($type_coverage_cache_location, igbinary_serialize($mixed_counts)); + } else { + file_put_contents($type_coverage_cache_location, serialize($mixed_counts)); + } + } + } + + /** + * @return string|false + */ + public function getConfigHashCache() + { + $cache_directory = $this->config->getCacheDirectory(); + + $config_hash_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CONFIG_HASH_CACHE_NAME; + + if ($cache_directory + && file_exists($config_hash_cache_location) + ) { + return file_get_contents($config_hash_cache_location); + } + + return false; + } + + public function setConfigHashCache(string $hash): void + { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + if ($cache_directory) { + if (!file_exists($cache_directory)) { + mkdir($cache_directory, 0777, true); + } + + $config_hash_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CONFIG_HASH_CACHE_NAME; + + file_put_contents( + $config_hash_cache_location, + $hash + ); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php new file mode 100644 index 00000000..431726ca --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php @@ -0,0 +1,1320 @@ +> + */ + private static $nonmethod_references_to_classes = []; + + /** + * A lookup table used for getting all the methods that reference a class + * + * @var array> + */ + private static $method_references_to_classes = []; + + /** + * A lookup table used for getting all the files that reference a class member + * + * @var array> + */ + private static $file_references_to_class_members = []; + + /** + * A lookup table used for getting all the files that reference a class property + * + * @var array> + */ + private static $file_references_to_class_properties = []; + + /** + * A lookup table used for getting all the files that reference a method's return value + * + * @var array> + */ + private static $file_references_to_method_returns = []; + + /** + * A lookup table used for getting all the files that reference a missing class member + * + * @var array> + */ + private static $file_references_to_missing_class_members = []; + + /** + * @var array> + */ + private static $files_inheriting_classes = []; + + /** + * A list of all files deleted since the last successful run + * + * @var array|null + */ + private static $deleted_files; + + /** + * A lookup table used for getting all the files referenced by a file + * + * @var array, i:array}> + */ + private static $file_references = []; + + /** + * @var array> + */ + private static $method_references_to_class_members = []; + + /** + * @var array> + */ + private static $method_dependencies = []; + + /** + * @var array> + */ + private static $method_references_to_class_properties = []; + + /** + * @var array> + */ + private static $method_references_to_method_returns = []; + + /** + * @var array> + */ + private static $method_references_to_missing_class_members = []; + + /** + * @var array> + */ + private static $references_to_mixed_member_names = []; + + /** + * @var array> + */ + private static $class_method_locations = []; + + /** + * @var array> + */ + private static $class_property_locations = []; + + /** + * @var array> + */ + private static $class_locations = []; + + /** + * @var array + */ + private static $classlike_files = []; + + /** + * @var array> + */ + private static $analyzed_methods = []; + + /** + * @var array> + */ + private static $issues = []; + + /** + * @var array + */ + private static $file_maps = []; + + /** + * @var array + */ + private static $mixed_counts = []; + + /** + * @var array>> + */ + private static $method_param_uses = []; + + /** + * @var ?FileReferenceCacheProvider + */ + public $cache; + + public function __construct(?FileReferenceCacheProvider $cache = null) + { + $this->cache = $cache; + } + + /** + * @return array + */ + public function getDeletedReferencedFiles(): array + { + if (self::$deleted_files === null) { + self::$deleted_files = array_filter( + array_keys(self::$file_references), + function (string $file_name): bool { + return !file_exists($file_name); + } + ); + } + + return self::$deleted_files; + } + + /** + * @param lowercase-string $fq_class_name_lc + */ + public function addNonMethodReferenceToClass(string $source_file, string $fq_class_name_lc): void + { + self::$nonmethod_references_to_classes[$fq_class_name_lc][$source_file] = true; + } + + /** + * @return array> + */ + public function getAllNonMethodReferencesToClasses(): array + { + return self::$nonmethod_references_to_classes; + } + + /** + * @param array> $references + * + */ + public function addNonMethodReferencesToClasses(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$nonmethod_references_to_classes[$key])) { + self::$nonmethod_references_to_classes[$key] = array_merge( + $reference, + self::$nonmethod_references_to_classes[$key] + ); + } else { + self::$nonmethod_references_to_classes[$key] = $reference; + } + } + } + + /** + * @param array $map + */ + public function addClassLikeFiles(array $map): void + { + self::$classlike_files += $map; + } + + public function addFileReferenceToClassMember( + string $source_file, + string $referenced_member_id, + bool $inside_return + ): void { + self::$file_references_to_class_members[$referenced_member_id][$source_file] = true; + + if ($inside_return) { + self::$file_references_to_method_returns[$referenced_member_id][$source_file] = true; + } + } + + public function addFileReferenceToClassProperty(string $source_file, string $referenced_property_id): void + { + self::$file_references_to_class_properties[$referenced_property_id][$source_file] = true; + } + + public function addFileReferenceToMissingClassMember(string $source_file, string $referenced_member_id): void + { + self::$file_references_to_missing_class_members[$referenced_member_id][$source_file] = true; + } + + /** + * @return array> + */ + public function getAllFileReferencesToClassMembers(): array + { + return self::$file_references_to_class_members; + } + + /** + * @return array> + */ + public function getAllFileReferencesToClassProperties(): array + { + return self::$file_references_to_class_properties; + } + + /** + * @return array> + */ + public function getAllFileReferencesToMethodReturns(): array + { + return self::$file_references_to_method_returns; + } + + /** + * @return array> + */ + public function getAllFileReferencesToMissingClassMembers(): array + { + return self::$file_references_to_missing_class_members; + } + + /** + * @param array> $references + * + */ + public function addFileReferencesToClassMembers(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$file_references_to_class_members[$key])) { + self::$file_references_to_class_members[$key] = array_merge( + $reference, + self::$file_references_to_class_members[$key] + ); + } else { + self::$file_references_to_class_members[$key] = $reference; + } + } + } + + /** + * @param array> $references + * + */ + public function addFileReferencesToClassProperties(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$file_references_to_class_properties[$key])) { + self::$file_references_to_class_properties[$key] = array_merge( + $reference, + self::$file_references_to_class_properties[$key] + ); + } else { + self::$file_references_to_class_properties[$key] = $reference; + } + } + } + + /** + * @param array> $references + * + */ + public function addFileReferencesToMethodReturns(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$file_references_to_method_returns[$key])) { + self::$file_references_to_method_returns[$key] = array_merge( + $reference, + self::$file_references_to_method_returns[$key] + ); + } else { + self::$file_references_to_method_returns[$key] = $reference; + } + } + } + + /** + * @param array> $references + * + */ + public function addFileReferencesToMissingClassMembers(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$file_references_to_missing_class_members[$key])) { + self::$file_references_to_missing_class_members[$key] = array_merge( + $reference, + self::$file_references_to_missing_class_members[$key] + ); + } else { + self::$file_references_to_missing_class_members[$key] = $reference; + } + } + } + + public function addFileInheritanceToClass(string $source_file, string $fq_class_name_lc): void + { + self::$files_inheriting_classes[$fq_class_name_lc][$source_file] = true; + } + + public function addMethodParamUse(string $method_id, int $offset, string $referencing_method_id): void + { + self::$method_param_uses[$method_id][$offset][$referencing_method_id] = true; + } + + /** + * @return array + */ + private function calculateFilesReferencingFile(Codebase $codebase, string $file): array + { + $referenced_files = []; + + $file_classes = ClassLikeAnalyzer::getClassesForFile($codebase, $file); + + foreach ($file_classes as $file_class_lc => $_) { + if (isset(self::$nonmethod_references_to_classes[$file_class_lc])) { + $new_files = array_keys(self::$nonmethod_references_to_classes[$file_class_lc]); + + $referenced_files = array_merge( + $referenced_files, + $new_files + ); + } + + if (isset(self::$method_references_to_classes[$file_class_lc])) { + $new_referencing_methods = array_keys(self::$method_references_to_classes[$file_class_lc]); + + foreach ($new_referencing_methods as $new_referencing_method_id) { + $fq_class_name_lc = explode('::', $new_referencing_method_id)[0]; + + try { + $referenced_files[] = $codebase->scanner->getClassLikeFilePath($fq_class_name_lc); + } catch (UnexpectedValueException $e) { + if (isset(self::$classlike_files[$fq_class_name_lc])) { + $referenced_files[] = self::$classlike_files[$fq_class_name_lc]; + } + } + } + } + } + + return array_unique($referenced_files); + } + + /** + * @return array + */ + private function calculateFilesInheritingFile(Codebase $codebase, string $file): array + { + $referenced_files = []; + + $file_classes = ClassLikeAnalyzer::getClassesForFile($codebase, $file); + + foreach ($file_classes as $file_class_lc => $_) { + if (isset(self::$files_inheriting_classes[$file_class_lc])) { + $referenced_files = array_merge( + $referenced_files, + array_keys(self::$files_inheriting_classes[$file_class_lc]) + ); + } + } + + return array_unique($referenced_files); + } + + public function removeDeletedFilesFromReferences(): void + { + $deleted_files = $this->getDeletedReferencedFiles(); + + if ($deleted_files) { + foreach ($deleted_files as $file) { + unset(self::$file_references[$file]); + } + + if ($this->cache) { + $this->cache->setCachedFileReferences(self::$file_references); + } + } + } + + /** + * @return array + */ + public function getFilesReferencingFile(string $file): array + { + return self::$file_references[$file]['a'] ?? []; + } + + /** + * @return array + */ + public function getFilesInheritingFromFile(string $file): array + { + return self::$file_references[$file]['i'] ?? []; + } + + /** + * @return array> + */ + public function getAllMethodReferencesToClassMembers(): array + { + return self::$method_references_to_class_members; + } + + /** + * @return array> + */ + public function getAllMethodDependencies(): array + { + return self::$method_dependencies; + } + + /** + * @return array> + */ + public function getAllMethodReferencesToClassProperties(): array + { + return self::$method_references_to_class_properties; + } + + /** + * @return array> + */ + public function getAllMethodReferencesToMethodReturns(): array + { + return self::$method_references_to_method_returns; + } + + /** + * @return array> + */ + public function getAllMethodReferencesToClasses(): array + { + return self::$method_references_to_classes; + } + + /** + * @return array> + */ + public function getAllMethodReferencesToMissingClassMembers(): array + { + return self::$method_references_to_missing_class_members; + } + + /** + * @return array> + */ + public function getAllReferencesToMixedMemberNames(): array + { + return self::$references_to_mixed_member_names; + } + + /** + * @return array>> + */ + public function getAllMethodParamUses(): array + { + return self::$method_param_uses; + } + + /** + * @psalm-suppress MixedPropertyTypeCoercion + */ + public function loadReferenceCache(bool $force_reload = true): bool + { + if ($this->cache && (!$this->loaded_from_cache || $force_reload)) { + $this->loaded_from_cache = true; + + $file_references = $this->cache->getCachedFileReferences(); + + if ($file_references === null) { + return false; + } + + self::$file_references = $file_references; + + $nonmethod_references_to_classes = $this->cache->getCachedNonMethodClassReferences(); + + if ($nonmethod_references_to_classes === null) { + return false; + } + + self::$nonmethod_references_to_classes = $nonmethod_references_to_classes; + + $method_references_to_classes = $this->cache->getCachedMethodClassReferences(); + + if ($method_references_to_classes === null) { + return false; + } + + self::$method_references_to_classes = $method_references_to_classes; + + $method_references_to_class_members = $this->cache->getCachedMethodMemberReferences(); + + if ($method_references_to_class_members === null) { + return false; + } + + self::$method_references_to_class_members = $method_references_to_class_members; + + $method_dependencies = $this->cache->getCachedMethodDependencies(); + + if ($method_dependencies === null) { + return false; + } + + self::$method_dependencies = $method_dependencies; + + $method_references_to_class_properties = $this->cache->getCachedMethodPropertyReferences(); + + if ($method_references_to_class_properties === null) { + return false; + } + + self::$method_references_to_class_properties = $method_references_to_class_properties; + + $method_references_to_method_returns = $this->cache->getCachedMethodMethodReturnReferences(); + + if ($method_references_to_method_returns === null) { + return false; + } + + self::$method_references_to_method_returns = $method_references_to_method_returns; + + $method_references_to_missing_class_members = $this->cache->getCachedMethodMissingMemberReferences(); + + if ($method_references_to_missing_class_members === null) { + return false; + } + + self::$method_references_to_missing_class_members = $method_references_to_missing_class_members; + + $file_references_to_class_members = $this->cache->getCachedFileMemberReferences(); + + if ($file_references_to_class_members === null) { + return false; + } + + self::$file_references_to_class_members = $file_references_to_class_members; + + $file_references_to_class_properties = $this->cache->getCachedFilePropertyReferences(); + + if ($file_references_to_class_properties === null) { + return false; + } + + self::$file_references_to_class_properties = $file_references_to_class_properties; + + $file_references_to_method_returns = $this->cache->getCachedFileMethodReturnReferences(); + + if ($file_references_to_method_returns === null) { + return false; + } + + self::$file_references_to_method_returns = $file_references_to_method_returns; + + $file_references_to_missing_class_members = $this->cache->getCachedFileMissingMemberReferences(); + + if ($file_references_to_missing_class_members === null) { + return false; + } + + self::$file_references_to_missing_class_members = $file_references_to_missing_class_members; + + $references_to_mixed_member_names = $this->cache->getCachedMixedMemberNameReferences(); + + if ($references_to_mixed_member_names === null) { + return false; + } + + self::$references_to_mixed_member_names = $references_to_mixed_member_names; + + $analyzed_methods = $this->cache->getAnalyzedMethodCache(); + + if ($analyzed_methods === false) { + return false; + } + + self::$analyzed_methods = $analyzed_methods; + + $issues = $this->cache->getCachedIssues(); + + if ($issues === null) { + return false; + } + + self::$issues = $issues; + + $method_param_uses = $this->cache->getCachedMethodParamUses(); + + if ($method_param_uses === null) { + return false; + } + + self::$method_param_uses = $method_param_uses; + + $mixed_counts = $this->cache->getTypeCoverage(); + + if ($mixed_counts === false) { + return false; + } + + self::$mixed_counts = $mixed_counts; + + $classlike_files = $this->cache->getCachedClassLikeFiles(); + + if ($classlike_files === null) { + return false; + } + + self::$classlike_files = $classlike_files; + + self::$file_maps = $this->cache->getFileMapCache() ?: []; + + return true; + } + + return false; + } + + /** + * @param array $visited_files + * + */ + public function updateReferenceCache(Codebase $codebase, array $visited_files): void + { + foreach ($visited_files as $file => $_) { + $all_file_references = array_unique( + array_merge( + self::$file_references[$file]['a'] ?? [], + $this->calculateFilesReferencingFile($codebase, $file) + ) + ); + + $inheritance_references = array_unique( + array_merge( + self::$file_references[$file]['i'] ?? [], + $this->calculateFilesInheritingFile($codebase, $file) + ) + ); + + self::$file_references[$file] = [ + 'a' => $all_file_references, + 'i' => $inheritance_references, + ]; + } + + if ($this->cache) { + $this->cache->setCachedFileReferences(self::$file_references); + $this->cache->setCachedMethodClassReferences(self::$method_references_to_classes); + $this->cache->setCachedNonMethodClassReferences(self::$nonmethod_references_to_classes); + $this->cache->setCachedMethodMemberReferences(self::$method_references_to_class_members); + $this->cache->setCachedMethodDependencies(self::$method_dependencies); + $this->cache->setCachedMethodPropertyReferences(self::$method_references_to_class_properties); + $this->cache->setCachedMethodMethodReturnReferences(self::$method_references_to_method_returns); + $this->cache->setCachedFileMemberReferences(self::$file_references_to_class_members); + $this->cache->setCachedFilePropertyReferences(self::$file_references_to_class_properties); + $this->cache->setCachedFileMethodReturnReferences(self::$file_references_to_method_returns); + $this->cache->setCachedMethodMissingMemberReferences(self::$method_references_to_missing_class_members); + $this->cache->setCachedFileMissingMemberReferences(self::$file_references_to_missing_class_members); + $this->cache->setCachedMixedMemberNameReferences(self::$references_to_mixed_member_names); + $this->cache->setCachedMethodParamUses(self::$method_param_uses); + $this->cache->setCachedIssues(self::$issues); + $this->cache->setCachedClassLikeFiles(self::$classlike_files); + $this->cache->setFileMapCache(self::$file_maps); + $this->cache->setTypeCoverage(self::$mixed_counts); + $this->cache->setAnalyzedMethodCache(self::$analyzed_methods); + } + } + + /** + * @param lowercase-string $fq_class_name_lc + */ + public function addMethodReferenceToClass(string $calling_function_id, string $fq_class_name_lc): void + { + if (!isset(self::$method_references_to_classes[$fq_class_name_lc])) { + self::$method_references_to_classes[$fq_class_name_lc] = [$calling_function_id => true]; + } else { + self::$method_references_to_classes[$fq_class_name_lc][$calling_function_id] = true; + } + } + + public function addMethodReferenceToClassMember( + string $calling_function_id, + string $referenced_member_id, + bool $inside_return + ): void { + if (!isset(self::$method_references_to_class_members[$referenced_member_id])) { + self::$method_references_to_class_members[$referenced_member_id] = [$calling_function_id => true]; + } else { + self::$method_references_to_class_members[$referenced_member_id][$calling_function_id] = true; + } + + if ($inside_return) { + if (!isset(self::$method_references_to_method_returns[$referenced_member_id])) { + self::$method_references_to_method_returns[$referenced_member_id] = [$calling_function_id => true]; + } else { + self::$method_references_to_method_returns[$referenced_member_id][$calling_function_id] = true; + } + } + } + + public function addMethodDependencyToClassMember( + string $calling_function_id, + string $referenced_member_id + ): void { + if (!isset(self::$method_dependencies[$referenced_member_id])) { + self::$method_dependencies[$referenced_member_id] = [$calling_function_id => true]; + } else { + self::$method_dependencies[$referenced_member_id][$calling_function_id] = true; + } + } + + public function addMethodReferenceToClassProperty(string $calling_function_id, string $referenced_property_id): void + { + if (!isset(self::$method_references_to_class_properties[$referenced_property_id])) { + self::$method_references_to_class_properties[$referenced_property_id] = [$calling_function_id => true]; + } else { + self::$method_references_to_class_properties[$referenced_property_id][$calling_function_id] = true; + } + } + + public function addMethodReferenceToMissingClassMember( + string $calling_function_id, + string $referenced_member_id + ): void { + if (!isset(self::$method_references_to_missing_class_members[$referenced_member_id])) { + self::$method_references_to_missing_class_members[$referenced_member_id] = [$calling_function_id => true]; + } else { + self::$method_references_to_missing_class_members[$referenced_member_id][$calling_function_id] = true; + } + } + + public function addCallingLocationForClassMethod(CodeLocation $code_location, string $referenced_member_id): void + { + if (!isset(self::$class_method_locations[$referenced_member_id])) { + self::$class_method_locations[$referenced_member_id] = [$code_location]; + } else { + self::$class_method_locations[$referenced_member_id][] = $code_location; + } + } + + public function addCallingLocationForClassProperty( + CodeLocation $code_location, + string $referenced_property_id + ): void { + if (!isset(self::$class_property_locations[$referenced_property_id])) { + self::$class_property_locations[$referenced_property_id] = [$code_location]; + } else { + self::$class_property_locations[$referenced_property_id][] = $code_location; + } + } + + public function addCallingLocationForClass(CodeLocation $code_location, string $referenced_class): void + { + if (!isset(self::$class_locations[$referenced_class])) { + self::$class_locations[$referenced_class] = [$code_location]; + } else { + self::$class_locations[$referenced_class][] = $code_location; + } + } + + public function isClassMethodReferenced(string $method_id): bool + { + return !empty(self::$file_references_to_class_members[$method_id]) + || !empty(self::$method_references_to_class_members[$method_id]); + } + + public function isClassPropertyReferenced(string $property_id): bool + { + return !empty(self::$file_references_to_class_properties[$property_id]) + || !empty(self::$method_references_to_class_properties[$property_id]); + } + + public function isMethodReturnReferenced(string $method_id): bool + { + return !empty(self::$file_references_to_method_returns[$method_id]) + || !empty(self::$method_references_to_method_returns[$method_id]); + } + + public function isClassReferenced(string $fq_class_name_lc): bool + { + return isset(self::$method_references_to_classes[$fq_class_name_lc]) + || isset(self::$nonmethod_references_to_classes[$fq_class_name_lc]); + } + + public function isMethodParamUsed(string $method_id, int $offset): bool + { + return !empty(self::$method_param_uses[$method_id][$offset]); + } + + /** + * @param array> $references + * + */ + public function setNonMethodReferencesToClasses(array $references): void + { + self::$nonmethod_references_to_classes = $references; + } + + /** + * @return array> + */ + public function getAllClassMethodLocations(): array + { + return self::$class_method_locations; + } + + /** + * @return array> + */ + public function getAllClassPropertyLocations(): array + { + return self::$class_property_locations; + } + + /** + * @return array> + */ + public function getAllClassLocations(): array + { + return self::$class_locations; + } + + /** + * @return array + */ + public function getClassMethodLocations(string $method_id): array + { + return self::$class_method_locations[$method_id] ?? []; + } + + /** + * @return array + */ + public function getClassPropertyLocations(string $property_id): array + { + return self::$class_property_locations[$property_id] ?? []; + } + + /** + * @return array + */ + public function getClassLocations(string $fq_class_name_lc): array + { + return self::$class_locations[$fq_class_name_lc] ?? []; + } + + /** + * @param array> $references + * + */ + public function addMethodReferencesToClassMembers(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$method_references_to_class_members[$key])) { + self::$method_references_to_class_members[$key] = array_merge( + $reference, + self::$method_references_to_class_members[$key] + ); + } else { + self::$method_references_to_class_members[$key] = $reference; + } + } + } + + /** + * @param array> $references + * + */ + public function addMethodDependencies(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$method_dependencies[$key])) { + self::$method_dependencies[$key] = array_merge( + $reference, + self::$method_dependencies[$key] + ); + } else { + self::$method_dependencies[$key] = $reference; + } + } + } + + /** + * @param array> $references + * + */ + public function addMethodReferencesToClassProperties(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$method_references_to_class_properties[$key])) { + self::$method_references_to_class_properties[$key] = array_merge( + $reference, + self::$method_references_to_class_properties[$key] + ); + } else { + self::$method_references_to_class_properties[$key] = $reference; + } + } + } + + /** + * @param array> $references + * + */ + public function addMethodReferencesToMethodReturns(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$method_references_to_method_returns[$key])) { + self::$method_references_to_method_returns[$key] = array_merge( + $reference, + self::$method_references_to_method_returns[$key] + ); + } else { + self::$method_references_to_method_returns[$key] = $reference; + } + } + } + + /** + * @param array> $references + * + */ + public function addMethodReferencesToClasses(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$method_references_to_classes[$key])) { + self::$method_references_to_classes[$key] = array_merge( + $reference, + self::$method_references_to_classes[$key] + ); + } else { + self::$method_references_to_classes[$key] = $reference; + } + } + } + + /** + * @param array> $references + * + */ + public function addMethodReferencesToMissingClassMembers(array $references): void + { + foreach ($references as $key => $reference) { + if (isset(self::$method_references_to_missing_class_members[$key])) { + self::$method_references_to_missing_class_members[$key] = array_merge( + $reference, + self::$method_references_to_missing_class_members[$key] + ); + } else { + self::$method_references_to_missing_class_members[$key] = $reference; + } + } + } + + /** + * @param array>> $references + * + */ + public function addMethodParamUses(array $references): void + { + foreach ($references as $method_id => $method_param_uses) { + if (isset(self::$method_param_uses[$method_id])) { + foreach ($method_param_uses as $offset => $reference_map) { + if (isset(self::$method_param_uses[$method_id][$offset])) { + self::$method_param_uses[$method_id][$offset] = array_merge( + self::$method_param_uses[$method_id][$offset], + $reference_map + ); + } else { + self::$method_param_uses[$method_id][$offset] = $reference_map; + } + } + } else { + self::$method_param_uses[$method_id] = $method_param_uses; + } + } + } + + /** + * @param array> $references + * + */ + public function setCallingMethodReferencesToClasses(array $references): void + { + self::$method_references_to_classes = $references; + } + + /** + * @param array> $references + * + */ + public function setCallingMethodReferencesToClassMembers(array $references): void + { + self::$method_references_to_class_members = $references; + } + + /** + * @param array> $references + * + */ + public function setMethodDependencies(array $references): void + { + self::$method_dependencies = $references; + } + + /** + * @param array> $references + * + */ + public function setCallingMethodReferencesToClassProperties(array $references): void + { + self::$method_references_to_class_properties = $references; + } + + /** + * @param array> $references + * + */ + public function setCallingMethodReferencesToMethodReturns(array $references): void + { + self::$method_references_to_method_returns = $references; + } + + /** + * @param array> $references + * + */ + public function setCallingMethodReferencesToMissingClassMembers(array $references): void + { + self::$method_references_to_missing_class_members = $references; + } + + /** + * @param array> $references + * + */ + public function setFileReferencesToClassMembers(array $references): void + { + self::$file_references_to_class_members = $references; + } + + /** + * @param array> $references + * + */ + public function setFileReferencesToClassProperties(array $references): void + { + self::$file_references_to_class_properties = $references; + } + + /** + * @param array> $references + * + */ + public function setFileReferencesToMethodReturns(array $references): void + { + self::$file_references_to_method_returns = $references; + } + + /** + * @param array> $references + * + */ + public function setFileReferencesToMissingClassMembers(array $references): void + { + self::$file_references_to_missing_class_members = $references; + } + + /** + * @param array> $references + * + */ + public function setReferencesToMixedMemberNames(array $references): void + { + self::$references_to_mixed_member_names = $references; + } + + /** + * @param array>> $references + * + */ + public function setMethodParamUses(array $references): void + { + self::$method_param_uses = $references; + } + + /** + * @param array> $references + * + */ + public function addClassMethodLocations(array $references): void + { + foreach ($references as $referenced_member_id => $locations) { + if (isset(self::$class_method_locations[$referenced_member_id])) { + self::$class_method_locations[$referenced_member_id] = array_merge( + self::$class_method_locations[$referenced_member_id], + $locations + ); + } else { + self::$class_method_locations[$referenced_member_id] = $locations; + } + } + } + + /** + * @param array> $references + * + */ + public function addClassPropertyLocations(array $references): void + { + foreach ($references as $referenced_member_id => $locations) { + if (isset(self::$class_property_locations[$referenced_member_id])) { + self::$class_property_locations[$referenced_member_id] = array_merge( + self::$class_property_locations[$referenced_member_id], + $locations + ); + } else { + self::$class_property_locations[$referenced_member_id] = $locations; + } + } + } + + /** + * @param array> $references + * + */ + public function addClassLocations(array $references): void + { + foreach ($references as $referenced_member_id => $locations) { + if (isset(self::$class_locations[$referenced_member_id])) { + self::$class_locations[$referenced_member_id] = array_merge( + self::$class_locations[$referenced_member_id], + $locations + ); + } else { + self::$class_locations[$referenced_member_id] = $locations; + } + } + } + + /** + * @return array> + */ + public function getExistingIssues(): array + { + return self::$issues; + } + + public function clearExistingIssuesForFile(string $file_path): void + { + unset(self::$issues[$file_path]); + } + + public function clearExistingFileMapsForFile(string $file_path): void + { + unset(self::$file_maps[$file_path]); + } + + public function addIssue(string $file_path, IssueData $issue): void + { + // don’t save parse errors ever, as they're not responsive to AST diffing + if ($issue->type === 'ParseError') { + return; + } + + if (!isset(self::$issues[$file_path])) { + self::$issues[$file_path] = [$issue]; + } else { + self::$issues[$file_path][] = $issue; + } + } + + /** + * @param array> $analyzed_methods + * + */ + public function setAnalyzedMethods(array $analyzed_methods): void + { + self::$analyzed_methods = $analyzed_methods; + } + + /** + * @param array $file_maps + */ + public function setFileMaps(array $file_maps): void + { + self::$file_maps = $file_maps; + } + + /** + * @return array + */ + public function getTypeCoverage(): array + { + return self::$mixed_counts; + } + + /** + * @param array $mixed_counts + * + */ + public function setTypeCoverage(array $mixed_counts): void + { + self::$mixed_counts = array_merge(self::$mixed_counts, $mixed_counts); + } + + /** + * @return array> + */ + public function getAnalyzedMethods(): array + { + return self::$analyzed_methods; + } + + /** + * @return array + */ + public function getFileMaps(): array + { + return self::$file_maps; + } + + public static function clearCache(): void + { + self::$files_inheriting_classes = []; + self::$deleted_files = null; + self::$file_references = []; + self::$file_references_to_class_members = []; + self::$file_references_to_class_properties = []; + self::$file_references_to_method_returns = []; + self::$method_references_to_class_members = []; + self::$method_dependencies = []; + self::$method_references_to_class_properties = []; + self::$method_references_to_method_returns = []; + self::$method_references_to_classes = []; + self::$nonmethod_references_to_classes = []; + self::$file_references_to_missing_class_members = []; + self::$method_references_to_missing_class_members = []; + self::$references_to_mixed_member_names = []; + self::$class_method_locations = []; + self::$class_property_locations = []; + self::$class_locations = []; + self::$analyzed_methods = []; + self::$issues = []; + self::$file_maps = []; + self::$method_param_uses = []; + self::$classlike_files = []; + self::$mixed_counts = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php new file mode 100644 index 00000000..d52b4165 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php @@ -0,0 +1,184 @@ +config = $config; + + $storage_dir = dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'Storage' . DIRECTORY_SEPARATOR; + + $dependent_files = [ + $storage_dir . 'FileStorage.php', + $storage_dir . 'FunctionLikeStorage.php', + $storage_dir . 'ClassLikeStorage.php', + $storage_dir . 'MethodStorage.php', + $storage_dir . 'FunctionLikeParameter.php', + ]; + + if ($config->eventDispatcher->hasAfterClassLikeVisitHandlers()) { + $dependent_files = array_merge($dependent_files, $config->plugin_paths); + } + + foreach ($dependent_files as $dependent_file_path) { + if (!file_exists($dependent_file_path)) { + throw new UnexpectedValueException($dependent_file_path . ' must exist'); + } + + $this->modified_timestamps .= ' ' . filemtime($dependent_file_path); + } + + $this->modified_timestamps .= $this->config->computeHash(); + } + + public function writeToCache(FileStorage $storage, string $file_contents): void + { + $file_path = strtolower($storage->file_path); + $cache_location = $this->getCacheLocationForPath($file_path, true); + $storage->hash = $this->getCacheHash($file_path, $file_contents); + + if ($this->config->use_igbinary) { + file_put_contents($cache_location, igbinary_serialize($storage)); + } else { + file_put_contents($cache_location, serialize($storage)); + } + } + + public function getLatestFromCache(string $file_path, string $file_contents): ?FileStorage + { + $file_path = strtolower($file_path); + $cached_value = $this->loadFromCache($file_path); + + if (!$cached_value) { + return null; + } + + $cache_hash = $this->getCacheHash($file_path, $file_contents); + + /** @psalm-suppress TypeDoesNotContainType */ + if (@get_class($cached_value) === '__PHP_Incomplete_Class' + || $cache_hash !== $cached_value->hash + ) { + $this->removeCacheForFile($file_path); + + return null; + } + + return $cached_value; + } + + public function removeCacheForFile(string $file_path): void + { + $cache_path = $this->getCacheLocationForPath($file_path); + + if (file_exists($cache_path)) { + unlink($cache_path); + } + } + + private function getCacheHash(string $_unused_file_path, string $file_contents): string + { + // do not concatenate, as $file_contents can be big and performance will be bad + // the timestamp is only needed if we don't have file contents + // as same contents should give same results, independent of when file was modified + $data = $file_contents ? $file_contents : $this->modified_timestamps; + return PHP_VERSION_ID >= 80100 ? hash('xxh128', $data) : hash('md4', $data); + } + + /** + * @psalm-suppress MixedAssignment + */ + private function loadFromCache(string $file_path): ?FileStorage + { + $cache_location = $this->getCacheLocationForPath($file_path); + + if (file_exists($cache_location)) { + if ($this->config->use_igbinary) { + $storage = igbinary_unserialize((string)file_get_contents($cache_location)); + + if ($storage instanceof FileStorage) { + return $storage; + } + + return null; + } + + $storage = unserialize((string)file_get_contents($cache_location)); + + if ($storage instanceof FileStorage) { + return $storage; + } + + return null; + } + + return null; + } + + private function getCacheLocationForPath(string $file_path, bool $create_directory = false): string + { + $root_cache_directory = $this->config->getCacheDirectory(); + + if (!$root_cache_directory) { + throw new UnexpectedValueException('No cache directory defined'); + } + + $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::FILE_STORAGE_CACHE_DIRECTORY; + + if ($create_directory && !is_dir($parser_cache_directory)) { + mkdir($parser_cache_directory, 0777, true); + } + + if (PHP_VERSION_ID >= 80100) { + $hash = hash('xxh128', $file_path); + } else { + $hash = hash('md4', $file_path); + } + + return $parser_cache_directory + . DIRECTORY_SEPARATOR + . $hash + . ($this->config->use_igbinary ? '-igbinary' : ''); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php new file mode 100644 index 00000000..ff48840d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php @@ -0,0 +1,131 @@ + + */ + private static $storage = []; + + /** + * A list of data useful to analyse new files + * Storing this statically is much faster (at least in PHP 7.2.1) + * + * @var array + */ + private static $new_storage = []; + + /** + * @var ?FileStorageCacheProvider + */ + public $cache; + + public function __construct(?FileStorageCacheProvider $cache = null) + { + $this->cache = $cache; + } + + public function get(string $file_path): FileStorage + { + $file_path = strtolower($file_path); + + if (!isset(self::$storage[$file_path])) { + throw new InvalidArgumentException('Could not get file storage for ' . $file_path); + } + + return self::$storage[$file_path]; + } + + public function remove(string $file_path): void + { + unset(self::$storage[strtolower($file_path)]); + } + + public function has(string $file_path, ?string $file_contents = null): bool + { + $file_path = strtolower($file_path); + + if (isset(self::$storage[$file_path])) { + return true; + } + + if ($file_contents === null) { + return false; + } + + if (!$this->cache) { + return false; + } + + $cached_value = $this->cache->getLatestFromCache($file_path, $file_contents); + + if (!$cached_value) { + return false; + } + + self::$storage[$file_path] = $cached_value; + self::$new_storage[$file_path] = $cached_value; + + return true; + } + + /** + * @return array + */ + public function getAll(): array + { + return self::$storage; + } + + /** + * @return array + */ + public function getNew(): array + { + return self::$new_storage; + } + + /** + * @param array $more + */ + public function addMore(array $more): void + { + self::$new_storage = array_merge(self::$new_storage, $more); + self::$storage = array_merge(self::$storage, $more); + } + + public function create(string $file_path): FileStorage + { + $file_path_lc = strtolower($file_path); + + $storage = new FileStorage($file_path); + self::$storage[$file_path_lc] = $storage; + self::$new_storage[$file_path_lc] = $storage; + + return $storage; + } + + public static function deleteAll(): void + { + self::$storage = []; + } + + public static function populated(): void + { + self::$new_storage = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php new file mode 100644 index 00000000..57c4a8c4 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php @@ -0,0 +1,117 @@ + + * > + */ + private static $handlers = []; + + /** + * @var array< + * lowercase-string, + * array + * > + */ + private static $legacy_handlers = []; + + public function __construct() + { + self::$handlers = []; + self::$legacy_handlers = []; + } + + /** + * @param class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyFunctionExistenceProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'doesFunctionExist']); + + foreach ($class::getFunctionIds() as $function_id) { + $this->registerLegacyClosure($function_id, $callable); + } + } elseif (is_subclass_of($class, FunctionExistenceProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'doesFunctionExist']); + + foreach ($class::getFunctionIds() as $function_id) { + $this->registerClosure($function_id, $callable); + } + } + } + + /** + * @param lowercase-string $function_id + * @param Closure(FunctionExistenceProviderEvent): ?bool $c + */ + public function registerClosure(string $function_id, Closure $c): void + { + self::$handlers[$function_id][] = $c; + } + + /** + * @param lowercase-string $function_id + * @param Closure( + * StatementsSource, + * string + * ): ?bool $c + */ + public function registerLegacyClosure(string $function_id, Closure $c): void + { + self::$legacy_handlers[$function_id][] = $c; + } + + public function has(string $function_id): bool + { + return isset(self::$handlers[strtolower($function_id)]) || + isset(self::$legacy_handlers[strtolower($function_id)]); + } + + public function doesFunctionExist( + StatementsSource $statements_source, + string $function_id + ): ?bool { + foreach (self::$legacy_handlers[strtolower($function_id)] ?? [] as $function_handler) { + $function_exists = $function_handler( + $statements_source, + $function_id + ); + + if ($function_exists !== null) { + return $function_exists; + } + } + + foreach (self::$handlers[strtolower($function_id)] ?? [] as $function_handler) { + $event = new FunctionExistenceProviderEvent( + $statements_source, + $function_id + ); + $function_exists = $function_handler($event); + + if ($function_exists !== null) { + return $function_exists; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php new file mode 100644 index 00000000..d6b70c4b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php @@ -0,0 +1,139 @@ +> + * > + */ + private static $handlers = []; + + /** + * @var array< + * lowercase-string, + * array, + * ?Context=, + * ?CodeLocation= + * ): ?array> + * > + */ + private static $legacy_handlers = []; + + public function __construct() + { + self::$handlers = []; + self::$legacy_handlers = []; + } + + /** + * @param class-string|class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyFunctionParamsProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'getFunctionParams']); + + foreach ($class::getFunctionIds() as $function_id) { + $this->registerLegacyClosure($function_id, $callable); + } + } elseif (is_subclass_of($class, FunctionParamsProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'getFunctionParams']); + + foreach ($class::getFunctionIds() as $function_id) { + $this->registerClosure($function_id, $callable); + } + } + } + + /** + * @param Closure(FunctionParamsProviderEvent): ?array $c + */ + public function registerClosure(string $fq_classlike_name, Closure $c): void + { + self::$handlers[strtolower($fq_classlike_name)][] = $c; + } + + /** + * @param Closure( + * StatementsSource, + * string, + * list, + * ?Context=, + * ?CodeLocation= + * ): ?array $c + */ + public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void + { + self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; + } + + public function has(string $fq_classlike_name): bool + { + return isset(self::$handlers[strtolower($fq_classlike_name)]) || + isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); + } + + /** + * @param list $call_args + * + * @return ?array + */ + public function getFunctionParams( + StatementsSource $statements_source, + string $function_id, + array $call_args, + ?Context $context = null, + ?CodeLocation $code_location = null + ): ?array { + foreach (self::$handlers[strtolower($function_id)] ?? [] as $class_handler) { + $event = new FunctionParamsProviderEvent( + $statements_source, + $function_id, + $call_args, + $context, + $code_location + ); + $result = $class_handler($event); + + if ($result) { + return $result; + } + } + + foreach (self::$legacy_handlers[strtolower($function_id)] ?? [] as $class_handler) { + $result = $class_handler( + $statements_source, + $function_id, + $call_args, + $context, + $code_location + ); + + if ($result) { + return $result; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php new file mode 100644 index 00000000..8b124ea5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php @@ -0,0 +1,205 @@ + + * > + */ + private static $handlers = []; + + /** + * @var array< + * lowercase-string, + * array, + * Context, + * CodeLocation + * ): ?Union> + * > + */ + private static $legacy_handlers = []; + + public function __construct() + { + self::$handlers = []; + self::$legacy_handlers = []; + + $this->registerClass(ArrayChunkReturnTypeProvider::class); + $this->registerClass(ArrayColumnReturnTypeProvider::class); + $this->registerClass(ArrayFilterReturnTypeProvider::class); + $this->registerClass(ArrayMapReturnTypeProvider::class); + $this->registerClass(ArrayMergeReturnTypeProvider::class); + $this->registerClass(ArrayPadReturnTypeProvider::class); + $this->registerClass(ArrayPointerAdjustmentReturnTypeProvider::class); + $this->registerClass(ArrayPopReturnTypeProvider::class); + $this->registerClass(ArrayRandReturnTypeProvider::class); + $this->registerClass(ArrayReduceReturnTypeProvider::class); + $this->registerClass(ArraySliceReturnTypeProvider::class); + $this->registerClass(ArraySpliceReturnTypeProvider::class); + $this->registerClass(ArrayReverseReturnTypeProvider::class); + $this->registerClass(ArrayUniqueReturnTypeProvider::class); + $this->registerClass(ArrayValuesReturnTypeProvider::class); + $this->registerClass(ArrayFillReturnTypeProvider::class); + $this->registerClass(FilterVarReturnTypeProvider::class); + $this->registerClass(IteratorToArrayReturnTypeProvider::class); + $this->registerClass(ParseUrlReturnTypeProvider::class); + $this->registerClass(StrReplaceReturnTypeProvider::class); + $this->registerClass(StrTrReturnTypeProvider::class); + $this->registerClass(VersionCompareReturnTypeProvider::class); + $this->registerClass(MktimeReturnTypeProvider::class); + $this->registerClass(ExplodeReturnTypeProvider::class); + $this->registerClass(GetObjectVarsReturnTypeProvider::class); + $this->registerClass(GetClassMethodsReturnTypeProvider::class); + $this->registerClass(FirstArgStringReturnTypeProvider::class); + $this->registerClass(HexdecReturnTypeProvider::class); + $this->registerClass(MinMaxReturnTypeProvider::class); + $this->registerClass(TriggerErrorReturnTypeProvider::class); + $this->registerClass(RandReturnTypeProvider::class); + $this->registerClass(InArrayReturnTypeProvider::class); + } + + /** + * @param class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyFunctionReturnTypeProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'getFunctionReturnType']); + + foreach ($class::getFunctionIds() as $function_id) { + $this->registerLegacyClosure($function_id, $callable); + } + } elseif (is_subclass_of($class, FunctionReturnTypeProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'getFunctionReturnType']); + + foreach ($class::getFunctionIds() as $function_id) { + $this->registerClosure($function_id, $callable); + } + } + } + + /** + * @param lowercase-string $function_id + * @param Closure(FunctionReturnTypeProviderEvent): ?Union $c + */ + public function registerClosure(string $function_id, Closure $c): void + { + self::$handlers[$function_id][] = $c; + } + + /** + * @param lowercase-string $function_id + * @param Closure( + * StatementsSource, + * non-empty-string, + * list, + * Context, + * CodeLocation + * ): ?Union $c + */ + public function registerLegacyClosure(string $function_id, Closure $c): void + { + self::$legacy_handlers[$function_id][] = $c; + } + + public function has(string $function_id): bool + { + return isset(self::$handlers[strtolower($function_id)]) || + isset(self::$legacy_handlers[strtolower($function_id)]); + } + + /** + * @param non-empty-string $function_id + */ + public function getReturnType( + StatementsSource $statements_source, + string $function_id, + PhpParser\Node\Expr\FuncCall $stmt, + Context $context, + CodeLocation $code_location + ): ?Union { + foreach (self::$legacy_handlers[strtolower($function_id)] ?? [] as $function_handler) { + $return_type = $function_handler( + $statements_source, + $function_id, + $stmt->getArgs(), + $context, + $code_location + ); + + if ($return_type) { + return $return_type; + } + } + + foreach (self::$handlers[strtolower($function_id)] ?? [] as $function_handler) { + $event = new FunctionReturnTypeProviderEvent( + $statements_source, + $function_id, + $stmt, + $context, + $code_location + ); + $return_type = $function_handler($event); + + if ($return_type) { + return $return_type; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php new file mode 100644 index 00000000..0f637728 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php @@ -0,0 +1,126 @@ + + * > + */ + private static $handlers = []; + + /** + * @var array< + * lowercase-string, + * array + * > + */ + private static $legacy_handlers = []; + + public function __construct() + { + self::$handlers = []; + self::$legacy_handlers = []; + } + + /** + * @param class-string|class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyMethodExistenceProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'doesMethodExist']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerLegacyClosure($fq_classlike_name, $callable); + } + } elseif (is_subclass_of($class, MethodExistenceProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'doesMethodExist']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerClosure($fq_classlike_name, $callable); + } + } + } + + /** + * @param Closure(MethodExistenceProviderEvent): ?bool $c + */ + public function registerClosure(string $fq_classlike_name, Closure $c): void + { + self::$handlers[strtolower($fq_classlike_name)][] = $c; + } + + /** + * @param Closure( + * string, + * string, + * ?StatementsSource=, + * ?CodeLocation + * ): ?bool $c + */ + public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void + { + self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; + } + + public function has(string $fq_classlike_name): bool + { + return isset(self::$handlers[strtolower($fq_classlike_name)]) || + isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); + } + + public function doesMethodExist( + string $fq_classlike_name, + string $method_name_lowercase, + ?StatementsSource $source = null, + ?CodeLocation $code_location = null + ): ?bool { + foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $method_handler) { + $method_exists = $method_handler( + $fq_classlike_name, + $method_name_lowercase, + $source, + $code_location + ); + + if ($method_exists !== null) { + return $method_exists; + } + } + + foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $method_handler) { + $event = new MethodExistenceProviderEvent( + $fq_classlike_name, + $method_name_lowercase, + $source, + $code_location + ); + $method_exists = $method_handler($event); + + if ($method_exists !== null) { + return $method_exists; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php new file mode 100644 index 00000000..0033a1ee --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php @@ -0,0 +1,148 @@ +> + * > + */ + private static $handlers = []; + + /** + * @var array< + * lowercase-string, + * array=, + * ?StatementsSource=, + * ?Context=, + * ?CodeLocation= + * ): ?array> + * > + */ + private static $legacy_handlers = []; + + public function __construct() + { + self::$handlers = []; + self::$legacy_handlers = []; + + $this->registerClass(PdoStatementSetFetchMode::class); + } + + /** + * @param class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyMethodParamsProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'getMethodParams']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerLegacyClosure($fq_classlike_name, $callable); + } + } elseif (is_subclass_of($class, MethodParamsProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'getMethodParams']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerClosure($fq_classlike_name, $callable); + } + } + } + + /** + * @param Closure(MethodParamsProviderEvent): ?array $c + */ + public function registerClosure(string $fq_classlike_name, Closure $c): void + { + self::$handlers[strtolower($fq_classlike_name)][] = $c; + } + + /** + * @param Closure( + * string, + * string, + * ?list=, + * ?StatementsSource=, + * ?Context=, + * ?CodeLocation= + * ): ?array $c + */ + public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void + { + self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; + } + + public function has(string $fq_classlike_name): bool + { + return isset(self::$handlers[strtolower($fq_classlike_name)]) || + isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); + } + + /** + * @param ?list $call_args + * + * @return ?list + */ + public function getMethodParams( + string $fq_classlike_name, + string $method_name_lowercase, + ?array $call_args = null, + ?StatementsSource $statements_source = null, + ?Context $context = null, + ?CodeLocation $code_location = null + ): ?array { + foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $class_handler) { + $result = $class_handler( + $fq_classlike_name, + $method_name_lowercase, + $call_args, + $statements_source, + $context, + $code_location + ); + + if ($result !== null) { + return array_values($result); + } + } + + foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $class_handler) { + $event = new MethodParamsProviderEvent( + $fq_classlike_name, + $method_name_lowercase, + $call_args, + $statements_source, + $context, + $code_location + ); + $result = $class_handler($event); + + if ($result !== null) { + return array_values($result); + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php new file mode 100644 index 00000000..f29dc77d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php @@ -0,0 +1,170 @@ + + * > + */ + private static $handlers = []; + + /** + * @var array< + * lowercase-string, + * array, + * Context, + * CodeLocation, + * ?array=, + * ?string=, + * ?lowercase-string= + * ): ?Union> + * > + */ + private static $legacy_handlers = []; + + public function __construct() + { + self::$handlers = []; + self::$legacy_handlers = []; + + $this->registerClass(DomNodeAppendChild::class); + $this->registerClass(ImagickPixelColorReturnTypeProvider::class); + $this->registerClass(SimpleXmlElementAsXml::class); + $this->registerClass(PdoStatementReturnTypeProvider::class); + $this->registerClass(ClosureFromCallableReturnTypeProvider::class); + } + + /** + * @param class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyMethodReturnTypeProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'getMethodReturnType']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerLegacyClosure($fq_classlike_name, $callable); + } + } elseif (is_subclass_of($class, MethodReturnTypeProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'getMethodReturnType']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerClosure($fq_classlike_name, $callable); + } + } + } + + /** + * @param Closure(MethodReturnTypeProviderEvent): ?Union $c + */ + public function registerClosure(string $fq_classlike_name, Closure $c): void + { + self::$handlers[strtolower($fq_classlike_name)][] = $c; + } + + /** + * @param Closure( + * StatementsSource, + * string, + * lowercase-string, + * list, + * Context, + * CodeLocation, + * ?array=, + * ?string=, + * ?lowercase-string= + * ): ?Union $c + * + */ + public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void + { + self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; + } + + public function has(string $fq_classlike_name): bool + { + return isset(self::$handlers[strtolower($fq_classlike_name)]) || + isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); + } + + /** + * @param PhpParser\Node\Expr\MethodCall|PhpParser\Node\Expr\StaticCall $stmt + * @param ?array $template_type_parameters + */ + public function getReturnType( + StatementsSource $statements_source, + string $fq_classlike_name, + string $method_name, + $stmt, + Context $context, + CodeLocation $code_location, + ?array $template_type_parameters = null, + ?string $called_fq_classlike_name = null, + ?string $called_method_name = null + ): ?Union { + foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $class_handler) { + $result = $class_handler( + $statements_source, + $fq_classlike_name, + strtolower($method_name), + $stmt->getArgs(), + $context, + $code_location, + $template_type_parameters, + $called_fq_classlike_name, + $called_method_name ? strtolower($called_method_name) : null + ); + + if ($result) { + return $result; + } + } + + foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $class_handler) { + $event = new MethodReturnTypeProviderEvent( + $statements_source, + $fq_classlike_name, + strtolower($method_name), + $stmt, + $context, + $code_location, + $template_type_parameters, + $called_fq_classlike_name, + $called_method_name ? strtolower($called_method_name) : null + ); + $result = $class_handler($event); + + if ($result) { + return $result; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php new file mode 100644 index 00000000..e9a876bc --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php @@ -0,0 +1,133 @@ + + * > + */ + private static $handlers = []; + + /** + * @var array< + * lowercase-string, + * array + * > + */ + private static $legacy_handlers = []; + + public function __construct() + { + self::$handlers = []; + self::$legacy_handlers = []; + } + + /** + * @param class-string + * |class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyMethodVisibilityProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'isMethodVisible']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerLegacyClosure($fq_classlike_name, $callable); + } + } elseif (is_subclass_of($class, MethodVisibilityProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'isMethodVisible']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerClosure($fq_classlike_name, $callable); + } + } + } + + /** + * @param Closure(MethodVisibilityProviderEvent): ?bool $c + */ + public function registerClosure(string $fq_classlike_name, Closure $c): void + { + self::$handlers[strtolower($fq_classlike_name)][] = $c; + } + + /** + * @param Closure( + * StatementsSource, + * string, + * string, + * Context, + * ?CodeLocation + * ): ?bool $c + */ + public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void + { + self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; + } + + public function has(string $fq_classlike_name): bool + { + return isset(self::$handlers[strtolower($fq_classlike_name)]) || + isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); + } + + public function isMethodVisible( + StatementsSource $source, + string $fq_classlike_name, + string $method_name, + Context $context, + ?CodeLocation $code_location = null + ): ?bool { + foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $method_handler) { + $method_visible = $method_handler( + $source, + $fq_classlike_name, + $method_name, + $context, + $code_location + ); + + if ($method_visible !== null) { + return $method_visible; + } + } + + foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $method_handler) { + $event = new MethodVisibilityProviderEvent( + $source, + $fq_classlike_name, + $method_name, + $context, + $code_location + ); + $method_visible = $method_handler($event); + + if ($method_visible !== null) { + return $method_visible; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php new file mode 100644 index 00000000..3987a231 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php @@ -0,0 +1,133 @@ + */ + private $node_types; + + /** + * @var SplObjectStorage>>>|null> + */ + private $node_assertions; + + /** @var SplObjectStorage> */ + private $node_if_true_assertions; + + /** @var SplObjectStorage> */ + private $node_if_false_assertions; + + /** @var bool */ + public $cache_assertions = true; + + public function __construct() + { + $this->node_types = new SplObjectStorage(); + $this->node_assertions = new SplObjectStorage(); + $this->node_if_true_assertions = new SplObjectStorage(); + $this->node_if_false_assertions = new SplObjectStorage(); + } + + /** + * @param Expr|Name|Return_ $node + */ + public function setType(NodeAbstract $node, Union $type): void + { + $this->node_types[$node] = $type; + } + + /** + * @param Expr|Name|Return_ $node + */ + public function getType(NodeAbstract $node): ?Union + { + return $this->node_types[$node] ?? null; + } + + /** + * @param list>>>|null $assertions + */ + public function setAssertions(Expr $node, ?array $assertions): void + { + if (!$this->cache_assertions) { + return; + } + + $this->node_assertions[$node] = $assertions; + } + + /** + * @return list>>>|null + */ + public function getAssertions(Expr $node): ?array + { + if (!$this->cache_assertions) { + return null; + } + + return $this->node_assertions[$node] ?? null; + } + + /** + * @param FuncCall|MethodCall|StaticCall|New_ $node + * @param array $assertions + */ + public function setIfTrueAssertions(Expr $node, array $assertions): void + { + $this->node_if_true_assertions[$node] = $assertions; + } + + /** + * @param Expr\FuncCall|MethodCall|StaticCall|New_ $node + * @return array|null + */ + public function getIfTrueAssertions(Expr $node): ?array + { + return $this->node_if_true_assertions[$node] ?? null; + } + + /** + * @param FuncCall|MethodCall|StaticCall|New_ $node + * @param array $assertions + */ + public function setIfFalseAssertions(Expr $node, array $assertions): void + { + $this->node_if_false_assertions[$node] = $assertions; + } + + /** + * @param FuncCall|MethodCall|StaticCall|New_ $node + * @return array|null + */ + public function getIfFalseAssertions(Expr $node): ?array + { + return $this->node_if_false_assertions[$node] ?? null; + } + + public function isPureCompatible(Expr $node): bool + { + $node_type = $this->getType($node); + + return ($node_type && $node_type->reference_free) || $node->getAttribute('pure', false); + } + + public function clearNodeOfTypeAndAssertions(Expr $node): void + { + unset($this->node_types[$node], $this->node_assertions[$node]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php new file mode 100644 index 00000000..a8f053f0 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php @@ -0,0 +1,399 @@ +|null + */ + private $existing_file_content_hashes; + + /** + * A map of recently-added filename hashes to contents hashes + * + * @var array + */ + private $new_file_content_hashes = []; + + /** + * @var bool + */ + private $use_file_cache; + + /** @var bool */ + private $use_igbinary; + + public function __construct(Config $config, bool $use_file_cache = true) + { + $this->use_igbinary = $config->use_igbinary; + $this->use_file_cache = $use_file_cache; + } + + /** + * @return list|null + */ + public function loadStatementsFromCache( + string $file_path, + int $file_modified_time, + string $file_content_hash + ): ?array { + $root_cache_directory = Config::getInstance()->getCacheDirectory(); + + if (!$root_cache_directory) { + return null; + } + + $file_cache_key = $this->getParserCacheKey( + $file_path + ); + + $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::PARSER_CACHE_DIRECTORY; + + $file_content_hashes = $this->new_file_content_hashes + $this->getExistingFileContentHashes(); + + $cache_location = $parser_cache_directory . DIRECTORY_SEPARATOR . $file_cache_key; + + if (isset($file_content_hashes[$file_cache_key]) + && $file_content_hash === $file_content_hashes[$file_cache_key] + && is_readable($cache_location) + && filemtime($cache_location) > $file_modified_time + ) { + if ($this->use_igbinary) { + /** @var list */ + $stmts = igbinary_unserialize((string)file_get_contents($cache_location)); + } else { + /** @var list */ + $stmts = unserialize((string)file_get_contents($cache_location)); + } + + return $stmts; + } + + return null; + } + + /** + * @return list|null + */ + public function loadExistingStatementsFromCache(string $file_path): ?array + { + $root_cache_directory = Config::getInstance()->getCacheDirectory(); + + if (!$root_cache_directory) { + return null; + } + + $file_cache_key = $this->getParserCacheKey( + $file_path + ); + + $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::PARSER_CACHE_DIRECTORY; + + $cache_location = $parser_cache_directory . DIRECTORY_SEPARATOR . $file_cache_key; + + if (is_readable($cache_location)) { + if ($this->use_igbinary) { + /** @var list */ + return igbinary_unserialize((string)file_get_contents($cache_location)) ?: null; + } + + /** @var list */ + return unserialize((string)file_get_contents($cache_location)) ?: null; + } + + return null; + } + + public function loadExistingFileContentsFromCache(string $file_path): ?string + { + if (!$this->use_file_cache) { + return null; + } + + $root_cache_directory = Config::getInstance()->getCacheDirectory(); + + if (!$root_cache_directory) { + return null; + } + + $file_cache_key = $this->getParserCacheKey( + $file_path + ); + + $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::FILE_CONTENTS_CACHE_DIRECTORY; + + $cache_location = $parser_cache_directory . DIRECTORY_SEPARATOR . $file_cache_key; + + if (is_readable($cache_location)) { + return file_get_contents($cache_location); + } + + return null; + } + + /** + * @return array + */ + private function getExistingFileContentHashes(): array + { + $config = Config::getInstance(); + $root_cache_directory = $config->getCacheDirectory(); + + if ($this->existing_file_content_hashes === null) { + $file_hashes_path = $root_cache_directory . DIRECTORY_SEPARATOR . self::FILE_HASHES; + + if ($root_cache_directory && is_readable($file_hashes_path)) { + $fp = fopen($file_hashes_path, 'r'); + $max_wait_cycles = 5; + $has_lock = false; + while ($max_wait_cycles > 0) { + if (flock($fp, LOCK_SH)) { + $has_lock = true; + break; + } + $max_wait_cycles--; + usleep(50000); + } + + if (!$has_lock) { + fclose($fp); + error_log('Could not acquire lock for content hashes file'); + $this->existing_file_content_hashes = []; + + return []; + } + + $hashes_encoded = fread($fp, filesize($file_hashes_path)); + fclose($fp); + + if (!$hashes_encoded) { + error_log('Unexpected value when loading from file content hashes'); + $this->existing_file_content_hashes = []; + + return []; + } + + $hashes_decoded = json_decode($hashes_encoded, true); + + if (!is_array($hashes_decoded)) { + error_log('Unexpected value ' . gettype($hashes_decoded)); + $this->existing_file_content_hashes = []; + + return []; + } + + /** @var array $hashes_decoded */ + $this->existing_file_content_hashes = $hashes_decoded; + } else { + $this->existing_file_content_hashes = []; + } + } + + return $this->existing_file_content_hashes; + } + + /** + * @param list $stmts + */ + public function saveStatementsToCache( + string $file_path, + string $file_content_hash, + array $stmts, + bool $touch_only + ): void { + $root_cache_directory = Config::getInstance()->getCacheDirectory(); + + if (!$root_cache_directory) { + return; + } + + $file_cache_key = $this->getParserCacheKey( + $file_path + ); + + $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::PARSER_CACHE_DIRECTORY; + + $cache_location = $parser_cache_directory . DIRECTORY_SEPARATOR . $file_cache_key; + + if ($touch_only) { + touch($cache_location); + } else { + $this->createCacheDirectory($parser_cache_directory); + + if ($this->use_igbinary) { + file_put_contents($cache_location, igbinary_serialize($stmts)); + } else { + file_put_contents($cache_location, serialize($stmts)); + } + + $this->new_file_content_hashes[$file_cache_key] = $file_content_hash; + } + } + + /** + * @return array + */ + public function getNewFileContentHashes(): array + { + return $this->new_file_content_hashes; + } + + /** + * @param array $file_content_hashes + * + */ + public function addNewFileContentHashes(array $file_content_hashes): void + { + $this->new_file_content_hashes = $file_content_hashes + $this->new_file_content_hashes; + } + + public function saveFileContentHashes(): void + { + $root_cache_directory = Config::getInstance()->getCacheDirectory(); + + if (!$root_cache_directory) { + return; + } + + // directory was removed + // most likely due to a race condition with other psalm instances that were manually started at the same time + clearstatcache(true, $root_cache_directory); + if (!is_dir($root_cache_directory)) { + return; + } + + $file_content_hashes = $this->new_file_content_hashes + $this->getExistingFileContentHashes(); + + $file_hashes_path = $root_cache_directory . DIRECTORY_SEPARATOR . self::FILE_HASHES; + + file_put_contents( + $file_hashes_path, + json_encode($file_content_hashes), + LOCK_EX + ); + } + + public function cacheFileContents(string $file_path, string $file_contents): void + { + if (!$this->use_file_cache) { + return; + } + + $root_cache_directory = Config::getInstance()->getCacheDirectory(); + + if (!$root_cache_directory) { + return; + } + + $file_cache_key = $this->getParserCacheKey( + $file_path + ); + + $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::FILE_CONTENTS_CACHE_DIRECTORY; + + $cache_location = $parser_cache_directory . DIRECTORY_SEPARATOR . $file_cache_key; + + $this->createCacheDirectory($parser_cache_directory); + + file_put_contents($cache_location, $file_contents); + } + + public function deleteOldParserCaches(float $time_before): int + { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + if (!$cache_directory) { + return 0; + } + + $removed_count = 0; + + $cache_directory .= DIRECTORY_SEPARATOR . self::PARSER_CACHE_DIRECTORY; + + if (is_dir($cache_directory)) { + $directory_files = scandir($cache_directory, SCANDIR_SORT_NONE); + + foreach ($directory_files as $directory_file) { + $full_path = $cache_directory . DIRECTORY_SEPARATOR . $directory_file; + + if ($directory_file[0] === '.') { + continue; + } + + if (filemtime($full_path) < $time_before && is_writable($full_path)) { + unlink($full_path); + ++$removed_count; + } + } + } + + return $removed_count; + } + + private function getParserCacheKey(string $file_name): string + { + return md5($file_name) . ($this->use_igbinary ? '-igbinary' : '') . '-r'; + } + + private function createCacheDirectory(string $parser_cache_directory): void + { + if (!is_dir($parser_cache_directory)) { + try { + mkdir($parser_cache_directory, 0777, true); + } catch (RuntimeException $e) { + // Race condition (#4483) + if (!is_dir($parser_cache_directory)) { + error_log('Could not create parser cache directory: ' . $parser_cache_directory); + } + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php new file mode 100644 index 00000000..57755770 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php @@ -0,0 +1,141 @@ +composer_lock_location = $composer_lock_location; + } + + public function canDiffFiles(): bool + { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + return $cache_directory && file_exists($cache_directory . DIRECTORY_SEPARATOR . self::GOOD_RUN_NAME); + } + + public function processSuccessfulRun(float $start_time, string $psalm_version): void + { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + if (!$cache_directory) { + return; + } + + $run_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::GOOD_RUN_NAME; + + file_put_contents($run_cache_location, $psalm_version); + + touch($run_cache_location, (int)$start_time); + } + + public function getLastRun(string $psalm_version): int + { + if ($this->last_run === null) { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + $run_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::GOOD_RUN_NAME; + + if (file_exists($run_cache_location) && file_get_contents($run_cache_location) === $psalm_version) { + $this->last_run = filemtime($run_cache_location); + } else { + $this->last_run = 0; + } + } + + return $this->last_run; + } + + public function hasLockfileChanged(): bool + { + if (!file_exists($this->composer_lock_location)) { + return true; + } + + $lockfile_contents = file_get_contents($this->composer_lock_location); + + if (!$lockfile_contents) { + return true; + } + + if (PHP_VERSION_ID >= 80100) { + $hash = hash('xxh128', $lockfile_contents); + } else { + $hash = hash('md4', $lockfile_contents); + } + + $changed = $hash !== $this->getComposerLockHash(); + + $this->composer_lock_hash = $hash; + + return $changed; + } + + public function updateComposerLockHash(): void + { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + if (!$cache_directory || !$this->composer_lock_hash) { + return; + } + + if (!file_exists($cache_directory)) { + mkdir($cache_directory, 0777, true); + } + + $lock_hash_location = $cache_directory . DIRECTORY_SEPARATOR . self::COMPOSER_LOCK_HASH; + + file_put_contents($lock_hash_location, $this->composer_lock_hash); + } + + protected function getComposerLockHash(): string + { + if ($this->composer_lock_hash === null) { + $cache_directory = Config::getInstance()->getCacheDirectory(); + + $lock_hash_location = $cache_directory . DIRECTORY_SEPARATOR . self::COMPOSER_LOCK_HASH; + + if (file_exists($lock_hash_location)) { + $this->composer_lock_hash = file_get_contents($lock_hash_location) ?: ''; + } else { + $this->composer_lock_hash = ''; + } + } + + return $this->composer_lock_hash; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php new file mode 100644 index 00000000..6af68fef --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php @@ -0,0 +1,138 @@ + + * > + */ + private static $handlers = []; + + /** + * @var array< + * lowercase-string, + * array + * > + */ + private static $legacy_handlers = []; + + public function __construct() + { + self::$handlers = []; + self::$legacy_handlers = []; + } + + /** + * @param class-string + * |class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyPropertyExistenceProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'doesPropertyExist']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerLegacyClosure($fq_classlike_name, $callable); + } + } elseif (is_subclass_of($class, PropertyExistenceProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'doesPropertyExist']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerClosure($fq_classlike_name, $callable); + } + } + } + + /** + * @param Closure(PropertyExistenceProviderEvent): ?bool $c + */ + public function registerClosure(string $fq_classlike_name, Closure $c): void + { + self::$handlers[strtolower($fq_classlike_name)][] = $c; + } + + /** + * @param Closure( + * string, + * string, + * bool, + * ?StatementsSource=, + * ?Context=, + * ?CodeLocation= + * ): ?bool $c + */ + public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void + { + self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; + } + + public function has(string $fq_classlike_name): bool + { + return isset(self::$handlers[strtolower($fq_classlike_name)]) || + isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); + } + + public function doesPropertyExist( + string $fq_classlike_name, + string $property_name, + bool $read_mode, + ?StatementsSource $source = null, + ?Context $context = null, + ?CodeLocation $code_location = null + ): ?bool { + foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { + $property_exists = $property_handler( + $fq_classlike_name, + $property_name, + $read_mode, + $source, + $context, + $code_location + ); + + if ($property_exists !== null) { + return $property_exists; + } + } + + foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { + $event = new PropertyExistenceProviderEvent( + $fq_classlike_name, + $property_name, + $read_mode, + $source, + $context, + $code_location + ); + $property_exists = $property_handler($event); + + if ($property_exists !== null) { + return $property_exists; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php new file mode 100644 index 00000000..2e3d1dbe --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php @@ -0,0 +1,140 @@ + + * > + */ + private static $handlers = []; + + /** + * @var array< + * lowercase-string, + * array + * > + */ + private static $legacy_handlers = []; + + public function __construct() + { + self::$handlers = []; + self::$legacy_handlers = []; + + $this->registerClass(DomDocumentPropertyTypeProvider::class); + } + + /** + * @param class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyPropertyTypeProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'getPropertyType']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerLegacyClosure($fq_classlike_name, $callable); + } + } elseif (is_subclass_of($class, PropertyTypeProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'getPropertyType']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerClosure($fq_classlike_name, $callable); + } + } + } + + /** + * @param Closure(PropertyTypeProviderEvent): ?Union $c + */ + public function registerClosure(string $fq_classlike_name, Closure $c): void + { + self::$handlers[strtolower($fq_classlike_name)][] = $c; + } + + /** + * @param Closure( + * string, + * string, + * bool, + * ?StatementsSource=, + * ?Context= + * ): ?Union $c + */ + public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void + { + self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; + } + + public function has(string $fq_classlike_name): bool + { + return isset(self::$handlers[strtolower($fq_classlike_name)]) || + isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); + } + + public function getPropertyType( + string $fq_classlike_name, + string $property_name, + bool $read_mode, + ?StatementsSource $source = null, + ?Context $context = null + ): ?Union { + + if ($source) { + $source->addSuppressedIssues(['NonInvariantDocblockPropertyType']); + } + + foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { + $property_type = $property_handler( + $fq_classlike_name, + $property_name, + $read_mode, + $source, + $context + ); + + if ($property_type !== null) { + return $property_type; + } + } + + foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { + $event = new PropertyTypeProviderEvent( + $fq_classlike_name, + $property_name, + $read_mode, + $source, + $context + ); + $property_type = $property_handler($event); + + if ($property_type !== null) { + return $property_type; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php new file mode 100644 index 00000000..2b127672 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php @@ -0,0 +1,33 @@ +getPropertyName()) === 'documentelement') { + $type = new Union([new TNamedObject('DOMElement'), new TNull()]); + $type->ignore_nullable_issues = true; + + return $type; + } + + return null; + } + + public static function getClassLikeNames(): array + { + return ['domdocument']; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php new file mode 100644 index 00000000..4ad57941 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php @@ -0,0 +1,138 @@ + + * > + */ + private static $handlers = []; + + /** + * @var array< + * lowercase-string, + * array + * > + */ + private static $legacy_handlers = []; + + public function __construct() + { + self::$handlers = []; + self::$legacy_handlers = []; + } + + /** + * @param class-string + * |class-string $class + */ + public function registerClass(string $class): void + { + if (is_subclass_of($class, LegacyPropertyVisibilityProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'isPropertyVisible']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerLegacyClosure($fq_classlike_name, $callable); + } + } elseif (is_subclass_of($class, PropertyVisibilityProviderInterface::class, true)) { + $callable = Closure::fromCallable([$class, 'isPropertyVisible']); + + foreach ($class::getClassLikeNames() as $fq_classlike_name) { + $this->registerClosure($fq_classlike_name, $callable); + } + } + } + + /** + * @param Closure(PropertyVisibilityProviderEvent): ?bool $c + */ + public function registerClosure(string $fq_classlike_name, Closure $c): void + { + self::$handlers[strtolower($fq_classlike_name)][] = $c; + } + + /** + * @param Closure( + * StatementsSource, + * string, + * string, + * bool, + * Context, + * CodeLocation + * ): ?bool $c + */ + public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void + { + self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; + } + + public function has(string $fq_classlike_name): bool + { + return isset(self::$handlers[strtolower($fq_classlike_name)]) || + isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); + } + + public function isPropertyVisible( + StatementsSource $source, + string $fq_classlike_name, + string $property_name, + bool $read_mode, + Context $context, + CodeLocation $code_location + ): ?bool { + foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { + $property_visible = $property_handler( + $source, + $fq_classlike_name, + $property_name, + $read_mode, + $context, + $code_location + ); + + if ($property_visible !== null) { + return $property_visible; + } + } + + foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { + $event = new PropertyVisibilityProviderEvent( + $source, + $fq_classlike_name, + $property_name, + $read_mode, + $context, + $code_location + ); + $property_visible = $property_handler($event); + + if ($property_visible !== null) { + return $property_visible; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php new file mode 100644 index 00000000..d42e1004 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php @@ -0,0 +1,66 @@ +file_provider = $file_provider; + $this->parser_cache_provider = $parser_cache_provider; + $this->project_cache_provider = $project_cache_provider; + + $this->file_storage_provider = new FileStorageProvider($file_storage_cache_provider); + $this->classlike_storage_provider = new ClassLikeStorageProvider($classlike_storage_cache_provider); + $this->statements_provider = new StatementsProvider( + $file_provider, + $parser_cache_provider, + $file_storage_cache_provider + ); + $this->file_reference_provider = new FileReferenceProvider($file_reference_cache_provider); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php new file mode 100644 index 00000000..86877094 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php @@ -0,0 +1,55 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_chunk']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union + { + $call_args = $event->getCallArgs(); + $statements_source = $event->getStatementsSource(); + if (count($call_args) >= 2 + && ($array_arg_type = $statements_source->getNodeTypeProvider()->getType($call_args[0]->value)) + && $array_arg_type->isSingle() + && $array_arg_type->hasArray() + && ($array_type = ArrayType::infer($array_arg_type->getAtomicTypes()['array'])) + ) { + $preserve_keys = isset($call_args[2]) + && ($preserve_keys_arg_type = $statements_source->getNodeTypeProvider()->getType($call_args[2]->value)) + && (string) $preserve_keys_arg_type !== 'false'; + + return new Union([ + new TList( + new Union([ + $preserve_keys + ? new TNonEmptyArray([$array_type->key, $array_type->value]) + : new TNonEmptyList($array_type->value) + ]) + ) + ]); + } + + return new Union([new TList(Type::getArray())]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php new file mode 100644 index 00000000..89e68a1e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php @@ -0,0 +1,142 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_column']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer + || count($call_args) < 2 + ) { + return Type::getMixed(); + } + + $row_shape = null; + $input_array_not_empty = false; + + // calculate row shape + if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value)) + && $first_arg_type->isSingle() + && $first_arg_type->hasArray() + ) { + $input_array = $first_arg_type->getAtomicTypes()['array']; + $row_type = null; + if ($input_array instanceof TKeyedArray) { + $row_type = $input_array->getGenericArrayType()->type_params[1]; + } elseif ($input_array instanceof TArray) { + $row_type = $input_array->type_params[1]; + } elseif ($input_array instanceof TList) { + $row_type = $input_array->type_param; + } + + if ($row_type && $row_type->isSingle()) { + if ($row_type->hasArray()) { + $row_shape = $row_type->getAtomicTypes()['array']; + } elseif ($row_type->hasObjectType()) { + $row_shape_union = GetObjectVarsReturnTypeProvider::getGetObjectVarsReturnType( + $row_type, + $statements_source, + $event->getContext(), + $event->getCodeLocation() + ); + if ($row_shape_union->isSingle()) { + $row_shape_union_parts = $row_shape_union->getAtomicTypes(); + $row_shape = reset($row_shape_union_parts); + } + } + } + + $input_array_not_empty = $input_array instanceof TNonEmptyList || + $input_array instanceof TNonEmptyArray || + $input_array instanceof TKeyedArray; + } + + $value_column_name = null; + $value_column_name_is_null = false; + // calculate value column name + if (($second_arg_type = $statements_source->node_data->getType($call_args[1]->value))) { + if ($second_arg_type->isSingleIntLiteral()) { + $value_column_name = $second_arg_type->getSingleIntLiteral()->value; + } elseif ($second_arg_type->isSingleStringLiteral()) { + $value_column_name = $second_arg_type->getSingleStringLiteral()->value; + } + $value_column_name_is_null = $second_arg_type->isNull(); + } + + $key_column_name = null; + $third_arg_type = null; + // calculate key column name + if (isset($call_args[2])) { + $third_arg_type = $statements_source->node_data->getType($call_args[2]->value); + + if ($third_arg_type) { + if ($third_arg_type->isSingleIntLiteral()) { + $key_column_name = $third_arg_type->getSingleIntLiteral()->value; + } elseif ($third_arg_type->isSingleStringLiteral()) { + $key_column_name = $third_arg_type->getSingleStringLiteral()->value; + } + } + } + + $result_key_type = Type::getArrayKey(); + $result_element_type = null; + $have_at_least_one_res = false; + // calculate results + if ($row_shape instanceof TKeyedArray) { + if ((null !== $value_column_name) && isset($row_shape->properties[$value_column_name])) { + $result_element_type = $row_shape->properties[$value_column_name]; + // When the selected key is possibly_undefined, the resulting array can be empty + if ($input_array_not_empty && $result_element_type->possibly_undefined !== true) { + $have_at_least_one_res = true; + } + //array_column skips undefined elements so resulting type is necessarily defined + $result_element_type->possibly_undefined = false; + } elseif ($value_column_name_is_null) { + $result_element_type = new Union([$row_shape]); + } else { + $result_element_type = Type::getMixed(); + } + + if ((null !== $key_column_name) && isset($row_shape->properties[$key_column_name])) { + $result_key_type = $row_shape->properties[$key_column_name]; + } + } + + if (isset($call_args[2]) && (string)$third_arg_type !== 'null') { + $type = $have_at_least_one_res ? + new TNonEmptyArray([$result_key_type, $result_element_type ?? Type::getMixed()]) + : new TArray([$result_key_type, $result_element_type ?? Type::getMixed()]); + } else { + $type = $have_at_least_one_res ? + new TNonEmptyList($result_element_type ?? Type::getMixed()) + : new TList($result_element_type ?? Type::getMixed()); + } + + return new Union([$type]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php new file mode 100644 index 00000000..9a16f980 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php @@ -0,0 +1,111 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_fill']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + $first_arg_type = isset($call_args[0]) ? $statements_source->node_data->getType($call_args[0]->value) : null; + $second_arg_type = isset($call_args[1]) ? $statements_source->node_data->getType($call_args[1]->value) : null; + $third_arg_type = isset($call_args[2]) ? $statements_source->node_data->getType($call_args[2]->value) : null; + + $value_type_from_third_arg = $third_arg_type ? clone $third_arg_type : Type::getMixed(); + + if ($first_arg_type + && $first_arg_type->isSingleIntLiteral() + && $first_arg_type->getSingleIntLiteral()->value === 0 + ) { + if ($second_arg_type + && self::isPositiveNumericType($second_arg_type) + ) { + return new Union([ + new TNonEmptyList( + $value_type_from_third_arg + ) + ]); + } + + return new Union([ + new TList( + $value_type_from_third_arg + ) + ]); + } + + if ($second_arg_type + && self::isPositiveNumericType($second_arg_type) + ) { + if ($first_arg_type + && $first_arg_type->isSingleIntLiteral() + && $second_arg_type->isSingleIntLiteral() + ) { + return new Union([ + new TNonEmptyArray([ + new Union([new TIntRange( + $first_arg_type->getSingleIntLiteral()->value, + $second_arg_type->getSingleIntLiteral()->value + )]), + $value_type_from_third_arg, + ]) + ]); + } + + return new Union([ + new TNonEmptyArray([ + Type::getInt(), + $value_type_from_third_arg, + ]) + ]); + } + + return new Union([ + new TArray([ + Type::getInt(), + $value_type_from_third_arg, + ]) + ]); + } + + private static function isPositiveNumericType(Union $arg): bool + { + if ($arg->isSingle() && $arg->hasPositiveInt()) { + return true; + } + + if ($arg->isSingle()) { + foreach ($arg->getRangeInts() as $range_int) { + if ($range_int->isPositive()) { + return true; + } + } + } + + return $arg->isSingleIntLiteral() && $arg->getSingleIntLiteral()->value > 0; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php new file mode 100644 index 00000000..b8612e18 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php @@ -0,0 +1,331 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_filter']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $context = $event->getContext(); + $code_location = $event->getCodeLocation(); + if (!$statements_source instanceof StatementsAnalyzer + || !$call_args + ) { + return Type::getMixed(); + } + + $array_arg = $call_args[0]->value ?? null; + + $first_arg_array = $array_arg + && ($first_arg_type = $statements_source->node_data->getType($array_arg)) + && $first_arg_type->hasType('array') + && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) + && ($array_atomic_type instanceof TArray + || $array_atomic_type instanceof TKeyedArray + || $array_atomic_type instanceof TList) + ? $array_atomic_type + : null; + + if (!$first_arg_array) { + return Type::getArray(); + } + + if ($first_arg_array instanceof TArray) { + $inner_type = $first_arg_array->type_params[1]; + $key_type = clone $first_arg_array->type_params[0]; + } elseif ($first_arg_array instanceof TList) { + $inner_type = $first_arg_array->type_param; + $key_type = Type::getInt(); + } else { + $inner_type = $first_arg_array->getGenericValueType(); + $key_type = $first_arg_array->getGenericKeyType(); + + if (!isset($call_args[1]) && !$first_arg_array->previous_value_type) { + $had_one = count($first_arg_array->properties) === 1; + + $first_arg_array = clone $first_arg_array; + + $new_properties = array_filter( + array_map( + static function ($keyed_type) use ($statements_source, $context) { + $prev_keyed_type = $keyed_type; + + $keyed_type = AssertionReconciler::reconcile( + '!falsy', + clone $keyed_type, + '', + $statements_source, + $context->inside_loop, + [], + null, + $statements_source->getSuppressedIssues() + ); + + $keyed_type->possibly_undefined = !$prev_keyed_type->isAlwaysTruthy(); + + return $keyed_type; + }, + $first_arg_array->properties + ), + static function ($keyed_type) { + return !$keyed_type->isEmpty(); + } + ); + + if (!$new_properties) { + return Type::getEmptyArray(); + } + + $first_arg_array->properties = $new_properties; + + $first_arg_array->is_list = $first_arg_array->is_list && $had_one; + $first_arg_array->sealed = false; + + return new Union([$first_arg_array]); + } + } + + if (!isset($call_args[1])) { + $inner_type = AssertionReconciler::reconcile( + '!falsy', + clone $inner_type, + '', + $statements_source, + $context->inside_loop, + [], + null, + $statements_source->getSuppressedIssues() + ); + + if ($first_arg_array instanceof TKeyedArray + && $first_arg_array->is_list + && $key_type->isSingleIntLiteral() + && $key_type->getSingleIntLiteral()->value === 0 + ) { + return new Union([ + new TList( + $inner_type + ), + ]); + } + + if ($key_type->getLiteralStrings()) { + $key_type->addType(new TString); + } + + if ($key_type->getLiteralInts()) { + $key_type->addType(new TInt); + } + + if ($inner_type->isUnionEmpty()) { + return Type::getEmptyArray(); + } + + return new Union([ + new TArray([ + $key_type, + $inner_type, + ]), + ]); + } + + if (!isset($call_args[2])) { + $function_call_arg = $call_args[1]; + + if ($function_call_arg->value instanceof PhpParser\Node\Scalar\String_ + || $function_call_arg->value instanceof PhpParser\Node\Expr\Array_ + || $function_call_arg->value instanceof PhpParser\Node\Expr\BinaryOp\Concat + ) { + $mapping_function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( + $statements_source, + $function_call_arg->value + ); + + if ($array_arg && $mapping_function_ids) { + $assertions = []; + + $fake_var_discriminator = mt_rand(); + ArrayMapReturnTypeProvider::getReturnTypeFromMappingIds( + $statements_source, + $mapping_function_ids, + $context, + $function_call_arg, + array_slice($call_args, 0, 1), + $assertions, + $fake_var_discriminator + ); + + $array_var_id = ExpressionIdentifier::getArrayVarId( + $array_arg, + null, + $statements_source + ); + + if (isset($assertions[$array_var_id . "[\$__fake_{$fake_var_discriminator}_offset_var__]"])) { + $changed_var_ids = []; + + $assertions = [ + '$inner_type' => + $assertions["{$array_var_id}[\$__fake_{$fake_var_discriminator}_offset_var__]"], + ]; + + $reconciled_types = Reconciler::reconcileKeyedTypes( + $assertions, + $assertions, + ['$inner_type' => $inner_type], + $changed_var_ids, + ['$inner_type' => true], + $statements_source, + $statements_source->getTemplateTypeMap() ?: [], + false, + new CodeLocation($statements_source, $function_call_arg->value) + ); + + if (isset($reconciled_types['$inner_type'])) { + $inner_type = $reconciled_types['$inner_type']; + } + } + + ArrayMapReturnTypeProvider::cleanContext($context, $fake_var_discriminator); + } + } elseif (($function_call_arg->value instanceof PhpParser\Node\Expr\Closure + || $function_call_arg->value instanceof PhpParser\Node\Expr\ArrowFunction) + && ($second_arg_type = $statements_source->node_data->getType($function_call_arg->value)) + && ($closure_types = $second_arg_type->getClosureTypes()) + ) { + $closure_atomic_type = reset($closure_types); + $closure_return_type = $closure_atomic_type->return_type ?: Type::getMixed(); + + if ($closure_return_type->isVoid()) { + IssueBuffer::maybeAdd( + new InvalidReturnType( + 'No return type could be found in the closure passed to array_filter', + $code_location + ), + $statements_source->getSuppressedIssues() + ); + + return Type::getArray(); + } + + /** @var list */ + $function_call_stmts = $function_call_arg->value->getStmts(); + + if (count($function_call_stmts) === 1 && count($function_call_arg->value->params)) { + $first_param = $function_call_arg->value->params[0]; + $stmt = $function_call_stmts[0]; + + if ($first_param->variadic === false + && $first_param->var instanceof PhpParser\Node\Expr\Variable + && is_string($first_param->var->name) + && $stmt instanceof PhpParser\Node\Stmt\Return_ + && $stmt->expr + ) { + $codebase = $statements_source->getCodebase(); + + $cond_object_id = spl_object_id($stmt->expr); + + try { + $filter_clauses = FormulaGenerator::getFormula( + $cond_object_id, + $cond_object_id, + $stmt->expr, + $context->self, + $statements_source, + $codebase + ); + } catch (ComplicatedExpressionException $e) { + $filter_clauses = []; + } + + $assertions = Algebra::getTruthsFromFormula( + $filter_clauses, + $cond_object_id + ); + + if (isset($assertions['$' . $first_param->var->name])) { + $changed_var_ids = []; + + $assertions = ['$inner_type' => $assertions['$' . $first_param->var->name]]; + + $reconciled_types = Reconciler::reconcileKeyedTypes( + $assertions, + $assertions, + ['$inner_type' => $inner_type], + $changed_var_ids, + ['$inner_type' => true], + $statements_source, + $statements_source->getTemplateTypeMap() ?: [], + false, + new CodeLocation($statements_source, $stmt) + ); + + if (isset($reconciled_types['$inner_type'])) { + $inner_type = $reconciled_types['$inner_type']; + } + } + } + } + } + + return new Union([ + new TArray([ + $key_type, + $inner_type, + ]), + ]); + } + + if ($inner_type->isUnionEmpty()) { + return Type::getEmptyArray(); + } + + return new Union([ + new TArray([ + $key_type, + $inner_type, + ]), + ]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php new file mode 100644 index 00000000..47c786e2 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php @@ -0,0 +1,499 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_map']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $context = $event->getContext(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + $function_call_arg = $call_args[0] ?? null; + + $function_call_type = $function_call_arg + ? $statements_source->node_data->getType($function_call_arg->value) + : null; + + if ($function_call_type && $function_call_type->isNull()) { + array_shift($call_args); + + $array_arg_types = []; + + foreach ($call_args as $call_arg) { + $call_arg_type = $statements_source->node_data->getType($call_arg->value); + + if ($call_arg_type) { + $array_arg_types[] = clone $call_arg_type; + } else { + $array_arg_types[] = Type::getMixed(); + break; + } + } + + if ($array_arg_types) { + return new Union([new TKeyedArray($array_arg_types)]); + } + + return Type::getArray(); + } + + $array_arg = $call_args[1] ?? null; + + if (!$array_arg) { + return Type::getArray(); + } + + $array_arg_atomic_type = null; + $array_arg_type = null; + + if ($array_arg_union_type = $statements_source->node_data->getType($array_arg->value)) { + $arg_types = $array_arg_union_type->getAtomicTypes(); + + if (isset($arg_types['array'])) { + $array_arg_atomic_type = $arg_types['array']; + $array_arg_type = ArrayType::infer($array_arg_atomic_type); + } + } + + $generic_key_type = null; + $mapping_return_type = null; + + if ($function_call_arg && $function_call_type) { + if (count($call_args) === 2) { + $generic_key_type = $array_arg_type->key ?? Type::getArrayKey(); + } else { + $generic_key_type = Type::getInt(); + } + + if ($function_call_type->hasCallableType()) { + $closure_types = $function_call_type->getClosureTypes() ?: $function_call_type->getCallableTypes(); + $closure_atomic_type = reset($closure_types); + + $closure_return_type = $closure_atomic_type->return_type ?: Type::getMixed(); + + if ($closure_return_type->isVoid()) { + $closure_return_type = Type::getNull(); + } + + $mapping_return_type = clone $closure_return_type; + } elseif ($function_call_arg->value instanceof PhpParser\Node\Scalar\String_ + || $function_call_arg->value instanceof PhpParser\Node\Expr\Array_ + || $function_call_arg->value instanceof PhpParser\Node\Expr\BinaryOp\Concat + ) { + $mapping_function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( + $statements_source, + $function_call_arg->value + ); + + if ($mapping_function_ids) { + $mapping_return_type = self::getReturnTypeFromMappingIds( + $statements_source, + $mapping_function_ids, + $context, + $function_call_arg, + array_slice($call_args, 1) + ); + } + + if ($function_call_arg->value instanceof PhpParser\Node\Expr\Array_ + && isset($function_call_arg->value->items[0]) + && isset($function_call_arg->value->items[1]) + && $function_call_arg->value->items[1]->value instanceof PhpParser\Node\Scalar\String_ + && $function_call_arg->value->items[0]->value instanceof PhpParser\Node\Expr\Variable + && ($variable_type + = $statements_source->node_data->getType($function_call_arg->value->items[0]->value)) + ) { + $fake_method_call = null; + + foreach ($variable_type->getAtomicTypes() as $variable_atomic_type) { + if ($variable_atomic_type instanceof TTemplateParam + || $variable_atomic_type instanceof TTemplateParamClass + ) { + $fake_method_call = new VirtualStaticCall( + $function_call_arg->value->items[0]->value, + $function_call_arg->value->items[1]->value->value, + [] + ); + } + } + + if ($fake_method_call) { + $fake_method_return_type = self::executeFakeCall( + $statements_source, + $fake_method_call, + $context + ); + + if ($fake_method_return_type) { + $mapping_return_type = $fake_method_return_type; + } + } + } + } + } + + if ($mapping_return_type && $generic_key_type) { + if ($array_arg_atomic_type instanceof TKeyedArray && count($call_args) === 2) { + $atomic_type = new TKeyedArray( + array_map( + /** + * @return Union + */ + function (Union $_) use ($mapping_return_type): Union { + return clone $mapping_return_type; + }, + $array_arg_atomic_type->properties + ) + ); + $atomic_type->is_list = $array_arg_atomic_type->is_list; + $atomic_type->sealed = $array_arg_atomic_type->sealed; + $atomic_type->previous_key_type = $array_arg_atomic_type->previous_key_type; + $atomic_type->previous_value_type = $mapping_return_type; + + return new Union([$atomic_type]); + } + + if ($array_arg_atomic_type instanceof TList + || count($call_args) !== 2 + ) { + if ($array_arg_atomic_type instanceof TNonEmptyList) { + return new Union([ + new TNonEmptyList( + $mapping_return_type + ), + ]); + } + + return new Union([ + new TList( + $mapping_return_type + ), + ]); + } + + if ($array_arg_atomic_type instanceof TNonEmptyArray) { + return new Union([ + new TNonEmptyArray([ + $generic_key_type, + $mapping_return_type, + ]), + ]); + } + + return new Union([ + new TArray([ + $generic_key_type, + $mapping_return_type, + ]) + ]); + } + + return count($call_args) === 2 && !($array_arg_type->is_list ?? false) + ? new Union([ + new TArray([ + $array_arg_type->key ?? Type::getArrayKey(), + Type::getMixed(), + ]) + ]) + : Type::getList(); + } + + /** + * @param-out array>>|null $assertions + */ + private static function executeFakeCall( + StatementsAnalyzer $statements_analyzer, + PhpParser\Node\Expr $fake_call, + Context $context, + ?array &$assertions = null + ): ?Union { + $old_data_provider = $statements_analyzer->node_data; + + $statements_analyzer->node_data = clone $statements_analyzer->node_data; + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); + } + + if (!in_array('MixedArrayOffset', $suppressed_issues, true)) { + $statements_analyzer->addSuppressedIssues(['MixedArrayOffset']); + } + + $was_inside_call = $context->inside_call; + + $context->inside_call = true; + + if ($fake_call instanceof PhpParser\Node\Expr\StaticCall) { + StaticCallAnalyzer::analyze( + $statements_analyzer, + $fake_call, + $context + ); + } elseif ($fake_call instanceof PhpParser\Node\Expr\MethodCall) { + MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_call, + $context + ); + } elseif ($fake_call instanceof PhpParser\Node\Expr\FuncCall) { + FunctionCallAnalyzer::analyze( + $statements_analyzer, + $fake_call, + $context + ); + } else { + throw new UnexpectedValueException('UnrecognizedCall'); + } + + $codebase = $statements_analyzer->getCodebase(); + + if ($assertions !== null) { + $anded_assertions = AssertionFinder::scrapeAssertions( + $fake_call, + null, + $statements_analyzer, + $codebase + ); + + $assertions = $anded_assertions[0] ?? []; + } + + $context->inside_call = $was_inside_call; + + if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['PossiblyInvalidMethodCall']); + } + + if (!in_array('MixedArrayOffset', $suppressed_issues, true)) { + $statements_analyzer->removeSuppressedIssues(['MixedArrayOffset']); + } + + $return_type = $statements_analyzer->node_data->getType($fake_call) ?? null; + + $statements_analyzer->node_data = $old_data_provider; + + return $return_type; + } + + /** + * @param non-empty-array $mapping_function_ids + * @param list $array_args + * @param int|null $fake_var_discriminator Set the fake variable id to a known value with the discriminator + * as a substring, and don't clear it from the context. + * @param-out array>>|null $assertions + */ + public static function getReturnTypeFromMappingIds( + StatementsAnalyzer $statements_source, + array $mapping_function_ids, + Context $context, + PhpParser\Node\Arg $function_call_arg, + array $array_args, + ?array &$assertions = null, + ?int $fake_var_discriminator = null + ): Union { + $mapping_return_type = null; + + $codebase = $statements_source->getCodebase(); + + $clean_context = false; + + foreach ($mapping_function_ids as $mapping_function_id) { + $mapping_function_id_parts = explode('&', $mapping_function_id); + + if ($fake_var_discriminator === null) { + $fake_var_discriminator = mt_rand(); + $clean_context = true; + } + + foreach ($mapping_function_id_parts as $mapping_function_id_part) { + $fake_args = []; + + foreach ($array_args as $array_arg) { + $fake_args[] = new VirtualArg( + new VirtualArrayDimFetch( + $array_arg->value, + new VirtualVariable( + "__fake_{$fake_var_discriminator}_offset_var__", + $array_arg->value->getAttributes() + ), + $array_arg->value->getAttributes() + ), + false, + false, + $array_arg->getAttributes() + ); + } + + if (strpos($mapping_function_id_part, '::') !== false) { + $is_instance = false; + + if ($mapping_function_id_part[0] === '$') { + $mapping_function_id_part = substr($mapping_function_id_part, 1); + $is_instance = true; + } + + $method_id_parts = explode('::', $mapping_function_id_part); + [$callable_fq_class_name, $callable_method_name] = $method_id_parts; + + if ($is_instance) { + $fake_method_call = new VirtualMethodCall( + new VirtualVariable( + "__fake_{$fake_var_discriminator}_method_call_var__", + $function_call_arg->getAttributes() + ), + new VirtualIdentifier( + $callable_method_name, + $function_call_arg->getAttributes() + ), + $fake_args, + $function_call_arg->getAttributes() + ); + + $lhs_instance_type = null; + + $callable_type = $statements_source->node_data->getType($function_call_arg->value); + + if ($callable_type) { + foreach ($callable_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TKeyedArray + && count($atomic_type->properties) === 2 + && isset($atomic_type->properties[0]) + ) { + $lhs_instance_type = clone $atomic_type->properties[0]; + } + } + } + + $context->vars_in_scope["\$__fake_{$fake_var_discriminator}_offset_var__"] = Type::getMixed(); + $context->vars_in_scope["\$__fake_{$fake_var_discriminator}_method_call_var__"] = + $lhs_instance_type ?: new Union([new TNamedObject($callable_fq_class_name)]); + } else { + $fake_method_call = new VirtualStaticCall( + new VirtualFullyQualified( + $callable_fq_class_name, + $function_call_arg->getAttributes() + ), + new VirtualIdentifier( + $callable_method_name, + $function_call_arg->getAttributes() + ), + $fake_args, + $function_call_arg->getAttributes() + ); + + $context->vars_in_scope["\$__fake_{$fake_var_discriminator}_offset_var__"] = Type::getMixed(); + } + + $fake_method_return_type = self::executeFakeCall( + $statements_source, + $fake_method_call, + $context, + $assertions + ); + + $function_id_return_type = $fake_method_return_type ?? Type::getMixed(); + } else { + $fake_function_call = new VirtualFuncCall( + new VirtualFullyQualified( + $mapping_function_id_part, + $function_call_arg->getAttributes() + ), + $fake_args, + $function_call_arg->getAttributes() + ); + + $context->vars_in_scope["\$__fake_{$fake_var_discriminator}_offset_var__"] = Type::getMixed(); + + $fake_function_return_type = self::executeFakeCall( + $statements_source, + $fake_function_call, + $context, + $assertions + ); + + $function_id_return_type = $fake_function_return_type ?? Type::getMixed(); + } + } + + if ($clean_context) { + self::cleanContext($context, $fake_var_discriminator); + } + + $fake_var_discriminator = null; + + $mapping_return_type = Type::combineUnionTypes( + $function_id_return_type, + $mapping_return_type, + $codebase + ); + } + + return $mapping_return_type; + } + + public static function cleanContext(Context $context, int $fake_var_discriminator): void + { + foreach ($context->vars_in_scope as $var_in_scope => $_) { + if (strpos($var_in_scope, "__fake_{$fake_var_discriminator}_") !== false) { + unset($context->vars_in_scope[$var_in_scope]); + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php new file mode 100644 index 00000000..6102ba47 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php @@ -0,0 +1,287 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_merge', 'array_replace']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer + || !$call_args + ) { + return Type::getMixed(); + } + + $is_replace = mb_strcut($event->getFunctionId(), 6, 7) === 'replace'; + + $inner_value_types = []; + $inner_key_types = []; + + $codebase = $statements_source->getCodebase(); + + $generic_properties = []; + $class_strings = []; + $all_keyed_arrays = true; + $all_int_offsets = true; + $all_nonempty_lists = true; + $any_nonempty = false; + + $max_keyed_array_size = 0; + + foreach ($call_args as $call_arg) { + if (!($call_arg_type = $statements_source->node_data->getType($call_arg->value))) { + return Type::getArray(); + } + + foreach ($call_arg_type->getAtomicTypes() as $type_part) { + if ($call_arg->unpack) { + if (!$type_part instanceof TArray) { + if ($type_part instanceof TKeyedArray) { + $type_part_value_type = $type_part->getGenericValueType(); + } elseif ($type_part instanceof TList) { + $type_part_value_type = $type_part->type_param; + } else { + return Type::getArray(); + } + } else { + $type_part_value_type = $type_part->type_params[1]; + } + + $unpacked_type_parts = []; + + foreach ($type_part_value_type->getAtomicTypes() as $value_type_part) { + $unpacked_type_parts[] = $value_type_part; + } + } else { + $unpacked_type_parts = [$type_part]; + } + + foreach ($unpacked_type_parts as $unpacked_type_part) { + if (!$unpacked_type_part instanceof TArray) { + if (($unpacked_type_part instanceof TFalse + && $call_arg_type->ignore_falsable_issues) + || ($unpacked_type_part instanceof TNull + && $call_arg_type->ignore_nullable_issues) + ) { + continue; + } + + if ($unpacked_type_part instanceof TKeyedArray) { + $max_keyed_array_size = max( + $max_keyed_array_size, + count($unpacked_type_part->properties) + ); + + foreach ($unpacked_type_part->properties as $key => $type) { + if (!is_string($key)) { + if ($is_replace) { + $generic_properties[$key] = $type; + } else { + $generic_properties[] = $type; + } + continue; + } + + if (isset($unpacked_type_part->class_strings[$key])) { + $class_strings[$key] = true; + } + + if (!isset($generic_properties[$key]) || !$type->possibly_undefined) { + $generic_properties[$key] = $type; + } else { + $was_possibly_undefined = $generic_properties[$key]->possibly_undefined; + + $generic_properties[$key] = Type::combineUnionTypes( + $generic_properties[$key], + $type, + $codebase + ); + + $generic_properties[$key]->possibly_undefined = $was_possibly_undefined; + } + } + + if (!$unpacked_type_part->is_list) { + $all_nonempty_lists = false; + } + + if ($unpacked_type_part->sealed) { + $any_nonempty = true; + } + + continue; + } + + if ($unpacked_type_part instanceof TList) { + $all_keyed_arrays = false; + + if (!$unpacked_type_part instanceof TNonEmptyList) { + $all_nonempty_lists = false; + } else { + $any_nonempty = true; + } + } else { + if ($unpacked_type_part instanceof TMixed + && $unpacked_type_part->from_loop_isset + ) { + $unpacked_type_part = new TArray([ + Type::getArrayKey(), + Type::getMixed(true), + ]); + } else { + return Type::getArray(); + } + } + } else { + if (!$unpacked_type_part->type_params[0]->isEmpty()) { + foreach ($generic_properties as $key => $keyed_type) { + $generic_properties[$key] = Type::combineUnionTypes( + $keyed_type, + $unpacked_type_part->type_params[1], + $codebase + ); + } + + $all_keyed_arrays = false; + $all_nonempty_lists = false; + } + } + + if ($unpacked_type_part instanceof TArray) { + if ($unpacked_type_part->type_params[1]->isEmpty()) { + continue; + } + + if (!$unpacked_type_part->type_params[0]->isInt()) { + $all_int_offsets = false; + } + + if ($unpacked_type_part instanceof TNonEmptyArray) { + $any_nonempty = true; + } + } + + $inner_key_types = array_merge( + $inner_key_types, + $unpacked_type_part instanceof TList + ? [new TInt()] + : array_values($unpacked_type_part->type_params[0]->getAtomicTypes()) + ); + $inner_value_types = array_merge( + $inner_value_types, + $unpacked_type_part instanceof TList + ? array_values($unpacked_type_part->type_param->getAtomicTypes()) + : array_values($unpacked_type_part->type_params[1]->getAtomicTypes()) + ); + } + } + } + + $inner_key_type = null; + $inner_value_type = null; + + if ($inner_key_types) { + /** + * Truthy&array-shape-list doesn't reconcile correctly, will be fixed for 5.x by #8050. + * @psalm-suppress InvalidScalarArgument + */ + $inner_key_type = TypeCombiner::combine($inner_key_types, $codebase, true); + } + + if ($inner_value_types) { + $inner_value_type = TypeCombiner::combine($inner_value_types, $codebase, true); + } + + $generic_property_count = count($generic_properties); + + if ($generic_properties + && $generic_property_count < 64 + && ($generic_property_count < $max_keyed_array_size * 2 + || $generic_property_count < 16) + ) { + $objectlike = new TKeyedArray($generic_properties); + + if ($class_strings !== []) { + $objectlike->class_strings = $class_strings; + } + + if ($all_nonempty_lists || $all_int_offsets) { + $objectlike->is_list = true; + } + + if (!$all_keyed_arrays) { + $objectlike->previous_key_type = $inner_key_type; + $objectlike->previous_value_type = $inner_value_type; + } + + return new Union([$objectlike]); + } + + if ($inner_value_type) { + if ($all_int_offsets) { + if ($any_nonempty) { + return new Union([ + new TNonEmptyList($inner_value_type), + ]); + } + + return new Union([ + new TList($inner_value_type), + ]); + } + + $inner_key_type = $inner_key_type ?? Type::getArrayKey(); + + if ($any_nonempty) { + return new Union([ + new TNonEmptyArray([ + $inner_key_type, + $inner_value_type, + ]), + ]); + } + + return new Union([ + new TArray([ + $inner_key_type, + $inner_value_type, + ]), + ]); + } + + return Type::getArray(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php new file mode 100644 index 00000000..f5859c17 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php @@ -0,0 +1,68 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_pad']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $type_provider = $statements_source->getNodeTypeProvider(); + + if (count($call_args) >= 3 + && ($array_arg_type = $type_provider->getType($call_args[0]->value)) + && ($size_arg_type = $type_provider->getType($call_args[1]->value)) + && ($value_arg_type = $type_provider->getType($call_args[2]->value)) + && $array_arg_type->isSingle() + && $array_arg_type->hasArray() + && ($array_type = ArrayType::infer($array_arg_type->getAtomicTypes()['array'])) + ) { + $codebase = $statements_source->getCodebase(); + $key_type = Type::combineUnionTypes($array_type->key, Type::getInt(), $codebase); + $value_type = Type::combineUnionTypes($array_type->value, $value_arg_type, $codebase); + $can_return_empty = ( + !$size_arg_type->isSingleIntLiteral() + || $size_arg_type->getSingleIntLiteral()->value === 0 + ); + + return new Union([ + $array_type->is_list + ? ( + $can_return_empty + ? new TList($value_type) + : new TNonEmptyList($value_type) + ) + : ( + $can_return_empty + ? new TArray([$key_type, $value_type]) + : new TNonEmptyArray([$key_type, $value_type]) + ) + ]); + } + + return Type::getArray(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php new file mode 100644 index 00000000..66d39525 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php @@ -0,0 +1,105 @@ + + */ + public static function getFunctionIds(): array + { + return ['current', 'next', 'prev', 'reset', 'end']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $function_id = $event->getFunctionId(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + $first_arg = $call_args[0]->value ?? null; + + if (!$first_arg) { + return Type::getMixed(); + } + + $first_arg_type = $statements_source->node_data->getType($first_arg); + + if (!$first_arg_type) { + return Type::getMixed(); + } + + $atomic_types = $first_arg_type->getAtomicTypes(); + + $value_type = null; + $definitely_has_items = false; + + while ($atomic_type = array_shift($atomic_types)) { + if ($atomic_type instanceof TTemplateParam) { + $atomic_types = array_merge($atomic_types, $atomic_type->as->getAtomicTypes()); + continue; + } + + if ($atomic_type instanceof TArray) { + $value_type = clone $atomic_type->type_params[1]; + $definitely_has_items = $atomic_type instanceof TNonEmptyArray; + } elseif ($atomic_type instanceof TList) { + $value_type = clone $atomic_type->type_param; + $definitely_has_items = $atomic_type instanceof TNonEmptyList; + } elseif ($atomic_type instanceof TKeyedArray) { + $value_type = $atomic_type->getGenericValueType(); + $definitely_has_items = $atomic_type->getGenericArrayType() instanceof TNonEmptyArray; + } else { + return Type::getMixed(); + } + } + + if (!$value_type) { + throw new UnexpectedValueException('This should never happen'); + } + + if ($value_type->isEmpty()) { + $value_type = Type::getFalse(); + } elseif (($function_id !== 'reset' && $function_id !== 'end') || !$definitely_has_items) { + $value_type->addType(new TFalse); + + $codebase = $statements_source->getCodebase(); + + if ($codebase->config->ignore_internal_falsable_issues) { + $value_type->ignore_falsable_issues = true; + } + } + + ArrayFetchAnalyzer::taintArrayFetch( + $statements_source, + $first_arg, + null, + $value_type, + Type::getMixed() + ); + + return $value_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php new file mode 100644 index 00000000..25dd2bd2 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php @@ -0,0 +1,96 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_pop', 'array_shift']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $function_id = $event->getFunctionId(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + $first_arg = $call_args[0]->value ?? null; + + $first_arg_array = $first_arg + && ($first_arg_type = $statements_source->node_data->getType($first_arg)) + && $first_arg_type->hasType('array') + && !$first_arg_type->hasMixed() + && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) + && ($array_atomic_type instanceof TArray + || $array_atomic_type instanceof TKeyedArray + || $array_atomic_type instanceof TList) + ? $array_atomic_type + : null; + + if (!$first_arg_array) { + return Type::getMixed(); + } + + $nullable = false; + + if ($first_arg_array instanceof TArray) { + $value_type = clone $first_arg_array->type_params[1]; + + if ($value_type->isEmpty()) { + return Type::getNull(); + } + + if (!$first_arg_array instanceof TNonEmptyArray) { + $nullable = true; + } + } elseif ($first_arg_array instanceof TList) { + $value_type = clone $first_arg_array->type_param; + + if (!$first_arg_array instanceof TNonEmptyList) { + $nullable = true; + } + } else { + // special case where we know the type of the first element + if ($function_id === 'array_shift' && $first_arg_array->is_list && isset($first_arg_array->properties[0])) { + $value_type = clone $first_arg_array->properties[0]; + } else { + $value_type = $first_arg_array->getGenericValueType(); + + if (!$first_arg_array->sealed && !$first_arg_array->previous_value_type) { + $nullable = true; + } + } + } + + if ($nullable) { + $value_type->addType(new TNull); + + $codebase = $statements_source->getCodebase(); + + if ($codebase->config->ignore_internal_nullable_issues) { + $value_type->ignore_nullable_issues = true; + } + } + + return $value_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php new file mode 100644 index 00000000..8c7062b3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php @@ -0,0 +1,76 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_rand']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + $first_arg = $call_args[0]->value ?? null; + $second_arg = $call_args[1]->value ?? null; + + $first_arg_array = $first_arg + && ($first_arg_type = $statements_source->node_data->getType($first_arg)) + && $first_arg_type->hasType('array') + && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) + && ($array_atomic_type instanceof TArray + || $array_atomic_type instanceof TKeyedArray + || $array_atomic_type instanceof TList) + ? $array_atomic_type + : null; + + if (!$first_arg_array) { + return Type::getMixed(); + } + + if ($first_arg_array instanceof TArray) { + $key_type = clone $first_arg_array->type_params[0]; + } elseif ($first_arg_array instanceof TList) { + $key_type = Type::getInt(); + } else { + $key_type = $first_arg_array->getGenericKeyType(); + } + + if (!$second_arg + || ($second_arg instanceof PhpParser\Node\Scalar\LNumber && $second_arg->value === 1) + ) { + return $key_type; + } + + $arr_type = new Union([ + new TList( + $key_type + ), + ]); + + if ($second_arg instanceof PhpParser\Node\Scalar\LNumber) { + return $arr_type; + } + + return Type::combineUnionTypes($key_type, $arr_type); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php new file mode 100644 index 00000000..a9d27ba8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php @@ -0,0 +1,298 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_reduce']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $context = $event->getContext(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + if (!isset($call_args[0]) || !isset($call_args[1])) { + return Type::getMixed(); + } + + $codebase = $statements_source->getCodebase(); + + $array_arg = $call_args[0]->value; + $function_call_arg = $call_args[1]->value; + + $array_arg_type = $statements_source->node_data->getType($array_arg); + $function_call_arg_type = $statements_source->node_data->getType($function_call_arg); + + if (!$array_arg_type || !$function_call_arg_type) { + return Type::getMixed(); + } + + $array_arg_types = $array_arg_type->getAtomicTypes(); + + $array_arg_atomic_type = null; + + if (isset($array_arg_types['array']) + && ($array_arg_types['array'] instanceof TArray + || $array_arg_types['array'] instanceof TKeyedArray + || $array_arg_types['array'] instanceof TList) + ) { + $array_arg_atomic_type = $array_arg_types['array']; + + if ($array_arg_atomic_type instanceof TKeyedArray) { + $array_arg_atomic_type = $array_arg_atomic_type->getGenericArrayType(); + } elseif ($array_arg_atomic_type instanceof TList) { + $array_arg_atomic_type = new TArray([ + Type::getInt(), + clone $array_arg_atomic_type->type_param + ]); + } + } + + if (!isset($call_args[2])) { + $reduce_return_type = Type::getNull(); + $reduce_return_type->ignore_nullable_issues = true; + } else { + $reduce_return_type = $statements_source->node_data->getType($call_args[2]->value); + + if (!$reduce_return_type) { + return Type::getMixed(); + } + + if ($reduce_return_type->hasMixed()) { + return Type::getMixed(); + } + } + + $initial_type = $reduce_return_type; + + if ($closure_types = $function_call_arg_type->getClosureTypes()) { + $closure_atomic_type = reset($closure_types); + + $closure_return_type = $closure_atomic_type->return_type ?: Type::getMixed(); + + if ($closure_return_type->isVoid()) { + $closure_return_type = Type::getNull(); + } + + $reduce_return_type = Type::combineUnionTypes($closure_return_type, $reduce_return_type); + + if ($closure_atomic_type->params !== null) { + if (count($closure_atomic_type->params) < 1) { + IssueBuffer::maybeAdd( + new InvalidArgument( + 'The closure passed to array_reduce at least one parameter', + new CodeLocation($statements_source, $function_call_arg) + ), + $statements_source->getSuppressedIssues() + ); + + return Type::getMixed(); + } + + $carry_param = $closure_atomic_type->params[0]; + $item_param = $closure_atomic_type->params[1] ?? null; + + if ($carry_param->type + && ( + !UnionTypeComparator::isContainedBy( + $codebase, + $initial_type, + $carry_param->type + ) + || ( + !$reduce_return_type->hasMixed() + && !UnionTypeComparator::isContainedBy( + $codebase, + $reduce_return_type, + $carry_param->type + ) + ) + ) + ) { + IssueBuffer::maybeAdd( + new InvalidArgument( + 'The first param of the closure passed to array_reduce must take ' + . $reduce_return_type . ' but only accepts ' . $carry_param->type, + $carry_param->type_location + ?: new CodeLocation($statements_source, $function_call_arg) + ), + $statements_source->getSuppressedIssues() + ); + + return Type::getMixed(); + } + + if ($item_param + && $item_param->type + && $array_arg_atomic_type + && !$array_arg_atomic_type->type_params[1]->hasMixed() + && !UnionTypeComparator::isContainedBy( + $codebase, + $array_arg_atomic_type->type_params[1], + $item_param->type + ) + ) { + IssueBuffer::maybeAdd( + new InvalidArgument( + 'The second param of the closure passed to array_reduce must take ' + . $array_arg_atomic_type->type_params[1] . ' but only accepts ' . $item_param->type, + $item_param->type_location + ?: new CodeLocation($statements_source, $function_call_arg) + ), + $statements_source->getSuppressedIssues() + ); + + return Type::getMixed(); + } + } + + return $reduce_return_type; + } + + if ($function_call_arg instanceof PhpParser\Node\Scalar\String_ + || $function_call_arg instanceof PhpParser\Node\Expr\Array_ + || $function_call_arg instanceof PhpParser\Node\Expr\BinaryOp\Concat + ) { + $mapping_function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( + $statements_source, + $function_call_arg + ); + + $call_map = InternalCallMapHandler::getCallMap(); + + foreach ($mapping_function_ids as $mapping_function_id) { + $mapping_function_id_parts = explode('&', $mapping_function_id); + + $part_match_found = false; + + foreach ($mapping_function_id_parts as $mapping_function_id_part) { + if (isset($call_map[$mapping_function_id_part][0])) { + if ($call_map[$mapping_function_id_part][0]) { + $mapped_function_return = + Type::parseString($call_map[$mapping_function_id_part][0]); + + $reduce_return_type = Type::combineUnionTypes( + $reduce_return_type, + $mapped_function_return + ); + + $part_match_found = true; + } + } elseif ($mapping_function_id_part) { + if (strpos($mapping_function_id_part, '::') !== false) { + if ($mapping_function_id_part[0] === '$') { + $mapping_function_id_part = substr($mapping_function_id_part, 1); + } + + [$callable_fq_class_name, $method_name] = explode('::', $mapping_function_id_part); + + if (in_array($callable_fq_class_name, ['self', 'static'], true)) { + $callable_fq_class_name = $statements_source->getFQCLN(); + if ($callable_fq_class_name === null) { + continue; + } + } + + if ($callable_fq_class_name === 'parent') { + continue; + } + + $method_id = new MethodIdentifier( + $callable_fq_class_name, + strtolower($method_name) + ); + + if (!$codebase->methods->methodExists( + $method_id, + !$context->collect_initializations + && !$context->collect_mutations + ? $context->calling_method_id + : null, + $codebase->collect_locations + ? new CodeLocation( + $statements_source, + $function_call_arg + ) : null, + null, + $statements_source->getFilePath() + )) { + continue; + } + + $part_match_found = true; + + $self_class = 'self'; + + $return_type = $codebase->methods->getMethodReturnType( + $method_id, + $self_class + ) ?? Type::getMixed(); + } else { + if (!$codebase->functions->functionExists( + $statements_source, + strtolower($mapping_function_id_part) + ) + ) { + return Type::getMixed(); + } + + $part_match_found = true; + + $function_storage = $codebase->functions->getStorage( + $statements_source, + strtolower($mapping_function_id_part) + ); + + $return_type = $function_storage->return_type ?: Type::getMixed(); + } + + $reduce_return_type = Type::combineUnionTypes($reduce_return_type, $return_type); + } + } + + if ($part_match_found === false) { + return Type::getMixed(); + } + } + + return $reduce_return_type; + } + + return Type::getMixed(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php new file mode 100644 index 00000000..0fab0664 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php @@ -0,0 +1,68 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_reverse']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + $first_arg = $call_args[0]->value ?? null; + + $first_arg_array = $first_arg + && ($first_arg_type = $statements_source->node_data->getType($first_arg)) + && $first_arg_type->hasType('array') + && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) + && ($array_atomic_type instanceof TArray + || $array_atomic_type instanceof TKeyedArray + || $array_atomic_type instanceof TList) + ? $array_atomic_type + : null; + + if (!$first_arg_array) { + return Type::getArray(); + } + + if ($first_arg_array instanceof TArray) { + return new Union([clone $first_arg_array]); + } + + if ($first_arg_array instanceof TList) { + $second_arg = $call_args[1]->value ?? null; + + if (!$second_arg + || (($second_arg_type = $statements_source->node_data->getType($second_arg)) + && $second_arg_type->isFalse() + ) + ) { + return new Union([clone $first_arg_array]); + } + + return new Union([new TArray([Type::getInt(), clone $first_arg_array->type_param])]); + } + + return new Union([$first_arg_array->getGenericArrayType()]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php new file mode 100644 index 00000000..399bb259 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php @@ -0,0 +1,98 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_slice']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + $first_arg = $call_args[0]->value ?? null; + + if (!$first_arg) { + return Type::getArray(); + } + + $first_arg_type = $statements_source->node_data->getType($first_arg); + + if (!$first_arg_type) { + return Type::getArray(); + } + + $atomic_types = $first_arg_type->getAtomicTypes(); + + $return_atomic_type = null; + + while ($atomic_type = array_shift($atomic_types)) { + if ($atomic_type instanceof TTemplateParam) { + $atomic_types = array_merge($atomic_types, $atomic_type->as->getAtomicTypes()); + continue; + } + + $already_cloned = false; + + if ($atomic_type instanceof TKeyedArray) { + $already_cloned = true; + $atomic_type = $atomic_type->getGenericArrayType(); + } + + if ($atomic_type instanceof TArray) { + if (!$already_cloned) { + $atomic_type = clone $atomic_type; + } + + $return_atomic_type = new TArray($atomic_type->type_params); + continue; + } + + if ($atomic_type instanceof TList) { + $return_atomic_type = new TArray([Type::getInt(), clone $atomic_type->type_param]); + continue; + } + + return Type::getArray(); + } + + if (!$return_atomic_type) { + throw new UnexpectedValueException('This should never happen'); + } + + $dont_preserve_int_keys = !isset($call_args[3]->value) + || (($third_arg_type = $statements_source->node_data->getType($call_args[3]->value)) + && ((string) $third_arg_type === 'false')); + + if ($dont_preserve_int_keys && $return_atomic_type->type_params[0]->isInt()) { + $return_atomic_type = new TList($return_atomic_type->type_params[1]); + } + + return new Union([$return_atomic_type]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php new file mode 100644 index 00000000..6f4d0625 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php @@ -0,0 +1,76 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_splice']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + $first_arg = $call_args[0]->value ?? null; + + $first_arg_array = $first_arg + && ($first_arg_type = $statements_source->node_data->getType($first_arg)) + && $first_arg_type->hasType('array') + && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) + && ($array_atomic_type instanceof TArray + || $array_atomic_type instanceof TKeyedArray + || $array_atomic_type instanceof TList) + ? $array_atomic_type + : null; + + if (!$first_arg_array) { + return Type::getArray(); + } + + $already_cloned = false; + + if ($first_arg_array instanceof TKeyedArray) { + $already_cloned = true; + $first_arg_array = $first_arg_array->getGenericArrayType(); + } + + if ($first_arg_array instanceof TArray) { + if (!$already_cloned) { + $first_arg_array = clone $first_arg_array; + } + $array_type = new TArray($first_arg_array->type_params); + } else { + $array_type = new TArray([Type::getInt(), clone $first_arg_array->type_param]); + } + + if (!$array_type->type_params[0]->hasString()) { + if ($array_type->type_params[1]->isString()) { + $array_type = new TList(Type::getString()); + } elseif ($array_type->type_params[1]->isInt()) { + $array_type = new TList(Type::getInt()); + } else { + $array_type = new TList(Type::getMixed()); + } + } + + return new Union([$array_type]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php new file mode 100644 index 00000000..5499ad27 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php @@ -0,0 +1,80 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_unique']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + $first_arg = $call_args[0]->value ?? null; + + $first_arg_array = $first_arg + && ($first_arg_type = $statements_source->node_data->getType($first_arg)) + && $first_arg_type->hasType('array') + && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) + && ($array_atomic_type instanceof TArray + || $array_atomic_type instanceof TKeyedArray + || $array_atomic_type instanceof TList) + ? $array_atomic_type + : null; + + if (!$first_arg_array) { + return Type::getArray(); + } + + if ($first_arg_array instanceof TArray) { + $first_arg_array = clone $first_arg_array; + + if ($first_arg_array instanceof TNonEmptyArray) { + $first_arg_array->count = null; + } + + return new Union([$first_arg_array]); + } + + if ($first_arg_array instanceof TList) { + if ($first_arg_array instanceof TNonEmptyList) { + return new Union([ + new TNonEmptyArray([ + Type::getInt(), + clone $first_arg_array->type_param + ]) + ]); + } + + return new Union([ + new TArray([ + Type::getInt(), + clone $first_arg_array->type_param + ]) + ]); + } + + return new Union([$first_arg_array->getGenericArrayType()]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php new file mode 100644 index 00000000..0544510f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php @@ -0,0 +1,88 @@ + + */ + public static function getFunctionIds(): array + { + return ['array_values']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + $first_arg = $call_args[0]->value ?? null; + + if (!$first_arg) { + return Type::getArray(); + } + + $first_arg_type = $statements_source->node_data->getType($first_arg); + + if (!$first_arg_type) { + return Type::getArray(); + } + + $atomic_types = $first_arg_type->getAtomicTypes(); + + $return_atomic_type = null; + + while ($atomic_type = array_shift($atomic_types)) { + if ($atomic_type instanceof TTemplateParam) { + $atomic_types = array_merge($atomic_types, $atomic_type->as->getAtomicTypes()); + continue; + } + + if ($atomic_type instanceof TKeyedArray) { + $atomic_type = $atomic_type->getGenericArrayType(); + } + + if ($atomic_type instanceof TArray) { + if ($atomic_type instanceof TNonEmptyArray) { + $return_atomic_type = new TNonEmptyList( + clone $atomic_type->type_params[1] + ); + } else { + $return_atomic_type = new TList( + clone $atomic_type->type_params[1] + ); + } + } elseif ($atomic_type instanceof TList) { + $return_atomic_type = $atomic_type; + } else { + return Type::getArray(); + } + } + + if (!$return_atomic_type) { + throw new UnexpectedValueException('This should never happen'); + } + + return new Union([$return_atomic_type]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php new file mode 100644 index 00000000..a94e5817 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php @@ -0,0 +1,70 @@ +getSource(); + $method_name_lowercase = $event->getMethodNameLowercase(); + $call_args = $event->getCallArgs(); + if (!$source instanceof StatementsAnalyzer) { + return null; + } + + $type_provider = $source->getNodeTypeProvider(); + $codebase = $source->getCodebase(); + + if ($method_name_lowercase === 'fromcallable') { + $closure_types = []; + + if (isset($call_args[0]) + && ($input_type = $type_provider->getType($call_args[0]->value)) + ) { + foreach ($input_type->getAtomicTypes() as $atomic_type) { + $candidate_callable = CallableTypeComparator::getCallableFromAtomic( + $codebase, + $atomic_type, + null, + $source, + true + ); + + if ($candidate_callable) { + $closure_types[] = new TClosure( + 'Closure', + $candidate_callable->params, + $candidate_callable->return_type, + $candidate_callable->is_pure + ); + } else { + return Type::getClosure(); + } + } + } + + if ($closure_types) { + return TypeCombiner::combine($closure_types, $codebase); + } + + return Type::getClosure(); + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php new file mode 100644 index 00000000..6d7723bf --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php @@ -0,0 +1,42 @@ +getSource(); + $call_args = $event->getCallArgs(); + $method_name_lowercase = $event->getMethodNameLowercase(); + + if ($method_name_lowercase !== 'appendchild') { + return null; + } + + if (!$source instanceof StatementsAnalyzer + || !$call_args + ) { + return Type::getMixed(); + } + + if (($first_arg_type = $source->node_data->getType($call_args[0]->value)) + && $first_arg_type->hasObjectType() + ) { + return clone $first_arg_type; + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php new file mode 100644 index 00000000..81001ff9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php @@ -0,0 +1,102 @@ + + */ + public static function getFunctionIds(): array + { + return ['explode']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + if (count($call_args) >= 2) { + $second_arg_type = $statements_source->node_data->getType($call_args[1]->value); + + $inner_type = new Union([ + $second_arg_type && $second_arg_type->hasLowercaseString() + ? new TLowercaseString() + : new TString + ]); + + $can_return_empty = isset($call_args[2]) + && ( + !$call_args[2]->value instanceof PhpParser\Node\Scalar\LNumber + || $call_args[2]->value->value < 0 + ); + + if ($call_args[0]->value instanceof PhpParser\Node\Scalar\String_) { + if ($call_args[0]->value->value === '') { + return Type::getFalse(); + } + + return new Union([ + $can_return_empty + ? new TList($inner_type) + : new TNonEmptyList($inner_type) + ]); + } + + if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value)) + && $first_arg_type->hasString()) { + $can_be_false = true; + if ($first_arg_type->isString()) { + $can_be_false = false; + foreach ($first_arg_type->getAtomicTypes() as $string_type) { + if (!($string_type instanceof TNonEmptyString)) { + $can_be_false = true; + break; + } + } + } + if ($can_be_false) { + $array_type = new Union([ + $can_return_empty + ? new TList($inner_type) + : new TNonEmptyList($inner_type), + new TFalse + ]); + + if ($statements_source->getCodebase()->config->ignore_internal_falsable_issues) { + $array_type->ignore_falsable_issues = true; + } + } else { + $array_type = new Union([ + $can_return_empty + ? new TList($inner_type) + : new TNonEmptyList($inner_type), + ]); + } + + return $array_type; + } + } + + return Type::getMixed(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php new file mode 100644 index 00000000..3ebc5e1d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php @@ -0,0 +1,170 @@ + + */ + public static function getFunctionIds(): array + { + return ['filter_var']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $function_id = $event->getFunctionId(); + $code_location = $event->getCodeLocation(); + if (!$statements_source instanceof StatementsAnalyzer) { + throw new UnexpectedValueException(); + } + + $filter_type = null; + + if (isset($call_args[1]) + && ($second_arg_type = $statements_source->node_data->getType($call_args[1]->value)) + && $second_arg_type->isSingleIntLiteral() + ) { + $filter_type_type = $second_arg_type->getSingleIntLiteral(); + + switch ($filter_type_type->value) { + case FILTER_VALIDATE_INT: + $filter_type = Type::getInt(); + break; + + case FILTER_VALIDATE_FLOAT: + $filter_type = Type::getFloat(); + break; + + case FILTER_VALIDATE_BOOLEAN: + $filter_type = Type::getBool(); + + break; + + case FILTER_VALIDATE_IP: + case FILTER_VALIDATE_MAC: + case FILTER_VALIDATE_REGEXP: + case FILTER_VALIDATE_URL: + case FILTER_VALIDATE_EMAIL: + case FILTER_VALIDATE_DOMAIN: + $filter_type = Type::getString(); + break; + } + + $has_object_like = false; + $filter_null = false; + + if (isset($call_args[2]) + && ($third_arg_type = $statements_source->node_data->getType($call_args[2]->value)) + && $filter_type + ) { + foreach ($third_arg_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TKeyedArray) { + $has_object_like = true; + + if (isset($atomic_type->properties['options']) + && $atomic_type->properties['options']->hasArray() + && ($options_array = $atomic_type->properties['options']->getAtomicTypes()['array'] ?? null) + && $options_array instanceof TKeyedArray + && isset($options_array->properties['default']) + ) { + $filter_type = Type::combineUnionTypes( + $filter_type, + $options_array->properties['default'] + ); + } else { + $filter_type->addType(new TFalse); + } + + if (isset($atomic_type->properties['flags']) + && $atomic_type->properties['flags']->isSingleIntLiteral() + ) { + $filter_flag_type = + $atomic_type->properties['flags']->getSingleIntLiteral(); + + if ($filter_type->hasBool() + && $filter_flag_type->value === FILTER_NULL_ON_FAILURE + ) { + $filter_type->addType(new TNull); + } + } + } elseif ($atomic_type instanceof TLiteralInt) { + if ($atomic_type->value === FILTER_NULL_ON_FAILURE) { + $filter_null = true; + $filter_type->addType(new TNull); + } + } + } + } + + if (!$has_object_like && !$filter_null && $filter_type) { + $filter_type->addType(new TFalse); + } + } + + if (!$filter_type) { + $filter_type = Type::getMixed(); + } + + if ($statements_source->data_flow_graph + && !in_array('TaintedInput', $statements_source->getSuppressedIssues()) + ) { + $function_return_sink = DataFlowNode::getForMethodReturn( + $function_id, + $function_id, + null, + $code_location + ); + + $statements_source->data_flow_graph->addNode($function_return_sink); + + $function_param_sink = DataFlowNode::getForMethodArgument( + $function_id, + $function_id, + 0, + null, + $code_location + ); + + $statements_source->data_flow_graph->addNode($function_param_sink); + + $statements_source->data_flow_graph->addPath( + $function_param_sink, + $function_return_sink, + 'arg' + ); + + $filter_type->parent_nodes = [$function_return_sink->id => $function_return_sink]; + } + + return $filter_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php new file mode 100644 index 00000000..4f99fddd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php @@ -0,0 +1,47 @@ + + */ + public static function getFunctionIds(): array + { + return [ + 'crypt', + ]; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer + || !$call_args + ) { + return Type::getMixed(); + } + + $return_type = Type::getString(); + + if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value)) + && $first_arg_type->isString() + ) { + return $return_type; + } + + $return_type->addType(new TNull); + $return_type->ignore_nullable_issues = true; + + return $return_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php new file mode 100644 index 00000000..4c7d7865 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php @@ -0,0 +1,41 @@ + + */ + public static function getFunctionIds(): array + { + return [ + 'get_class_methods', + ]; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer + || !$call_args + ) { + return Type::getMixed(); + } + + if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value)) + && ($first_arg_type->hasObjectType() || $first_arg_type->hasString()) + ) { + return Type::parseString('array'); + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php new file mode 100644 index 00000000..cc8a43da --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php @@ -0,0 +1,131 @@ + + */ + public static function getFunctionIds(): array + { + return [ + 'get_object_vars', + ]; + } + + public static function getGetObjectVarsReturnType( + Union $first_arg_type, + SourceAnalyzer $statements_source, + Context $context, + CodeLocation $location + ): Union { + if ($first_arg_type->isSingle()) { + $atomics = $first_arg_type->getAtomicTypes(); + $object_type = reset($atomics); + + if ($object_type instanceof TObjectWithProperties) { + if ([] === $object_type->properties) { + return Type::parseString('array'); + } + return new Union([ + new TKeyedArray($object_type->properties) + ]); + } + + if ($object_type instanceof TNamedObject) { + if (strtolower($object_type->value) === strtolower(stdClass::class)) { + return Type::parseString('array'); + } + $codebase = $statements_source->getCodebase(); + $class_storage = $codebase->classlikes->getStorageFor($object_type->value); + + if (null === $class_storage) { + return Type::parseString('array'); + } + + if ([] === $class_storage->appearing_property_ids) { + if ($class_storage->final) { + return Type::getEmptyArray(); + } + + return Type::parseString('array'); + } + + $properties = []; + foreach ($class_storage->appearing_property_ids as $name => $property_id) { + if (ClassAnalyzer::checkPropertyVisibility( + $property_id, + $context, + $statements_source, + $location, + $statements_source->getSuppressedIssues(), + false + ) === true) { + $property_type = $codebase->properties->getPropertyType( + $property_id, + false, + $statements_source, + $context + ); + $properties[$name] = $property_type ?? Type::getMixed(); + } + } + + if ([] === $properties) { + if ($class_storage->final) { + return Type::getEmptyArray(); + } + + return Type::parseString('array'); + } + + return new Union([ + new TKeyedArray($properties) + ]); + } + } + return Type::parseString('array'); + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer + || !$call_args + ) { + return Type::getMixed(); + } + + if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value)) + && $first_arg_type->isObjectType() + ) { + return self::getGetObjectVarsReturnType( + $first_arg_type, + $statements_source, + $event->getContext(), + $event->getCodeLocation() + ); + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php new file mode 100644 index 00000000..b6c60788 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php @@ -0,0 +1,30 @@ + + */ + public static function getFunctionIds(): array + { + return ['hexdec']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + return Type::getInt(true); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php new file mode 100644 index 00000000..c97048ae --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php @@ -0,0 +1,88 @@ +getSource(); + $call_args = $event->getCallArgs(); + $method_name_lowercase = $event->getMethodNameLowercase(); + + if ($method_name_lowercase !== 'getcolor') { + return null; + } + + if (!$source instanceof StatementsAnalyzer) { + return null; + } + + if (!$call_args) { + $formats = [0 => true]; + } else { + $normalized = $source->node_data->getType($call_args[0]->value) ?? Type::getMixed(); + $formats = []; + foreach ($normalized->getAtomicTypes() as $t) { + if ($t instanceof TLiteralInt && in_array($t->value, [0, 1, 2], true)) { + $formats[$t->value] = true; + } else { + $formats[0] = true; + $formats[1] = true; + $formats[2] = true; + } + } + } + $types = []; + if (isset($formats[0])) { + $types []= new Union([ + new TKeyedArray([ + 'r' => new Union([new TIntRange(0, 255)]), + 'g' => new Union([new TIntRange(0, 255)]), + 'b' => new Union([new TIntRange(0, 255)]), + 'a' => new Union([new TIntRange(0, 1)]) + ]) + ]); + } + if (isset($formats[1])) { + $types []= new Union([ + new TKeyedArray([ + 'r' => Type::getFloat(), + 'g' => Type::getFloat(), + 'b' => Type::getFloat(), + 'a' => Type::getFloat() + ]) + ]); + } + if (isset($formats[2])) { + $types []= new Union([ + new TKeyedArray([ + 'r' => new Union([new TIntRange(0, 255)]), + 'g' => new Union([new TIntRange(0, 255)]), + 'b' => new Union([new TIntRange(0, 255)]), + 'a' => new Union([new TIntRange(0, 255)]) + ]) + ]); + } + + assert($types !== []); + return Type::combineUnionTypeArray($types, $event->getSource()->getCodebase()); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php new file mode 100644 index 00000000..519984f2 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php @@ -0,0 +1,84 @@ + + */ + public static function getFunctionIds(): array + { + return ['in_array']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $call_args = $event->getCallArgs(); + $bool = Type::getBool(); + + if (!isset($call_args[0]) || !isset($call_args[1])) { + return $bool; + } + + $needle_type = $event->getStatementsSource()->getNodeTypeProvider()->getType($call_args[0]->value); + $haystack_type = $event->getStatementsSource()->getNodeTypeProvider()->getType($call_args[1]->value); + + if ($needle_type === null || $haystack_type === null) { + return $bool; + } + + $false = Type::getFalse(); + $false->from_docblock = $bool->from_docblock = $needle_type->from_docblock || $haystack_type->from_docblock; + + if (!isset($call_args[2])) { + return $bool; + } + + $strict_type = $event->getStatementsSource()->getNodeTypeProvider()->getType($call_args[2]->value); + + if ($strict_type === null || !$strict_type->isTrue()) { + return $bool; + } + + /** + * @var TKeyedArray|TArray|TList|null + */ + $array_arg_type = ($types = $haystack_type->getAtomicTypes()) && isset($types['array']) + ? $types['array'] + : null; + + if ($array_arg_type instanceof TKeyedArray) { + $array_arg_type = $array_arg_type->getGenericArrayType(); + } + + if ($array_arg_type instanceof TList) { + $array_arg_type = new TArray([Type::getInt(), $array_arg_type->type_param]); + } + + if (!$array_arg_type instanceof TArray) { + return $bool; + } + + $haystack_item_type = $array_arg_type->type_params[1]; + + if (UnionTypeComparator::canExpressionTypesBeIdentical( + $event->getStatementsSource()->getCodebase(), + $needle_type, + $haystack_item_type + )) { + return $bool; + } + + return $false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php new file mode 100644 index 00000000..52d26475 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php @@ -0,0 +1,129 @@ + + */ + public static function getFunctionIds(): array + { + return [ + 'iterator_to_array', + ]; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $function_id = $event->getFunctionId(); + $context = $event->getContext(); + if (!$statements_source instanceof StatementsAnalyzer + || !$call_args + ) { + return Type::getMixed(); + } + + if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value))) { + $key_type = null; + $value_type = null; + + $codebase = $statements_source->getCodebase(); + + $atomic_types = $first_arg_type->getAtomicTypes(); + + while ($call_arg_atomic_type = array_shift($atomic_types)) { + if ($call_arg_atomic_type instanceof TTemplateParam) { + $atomic_types = array_merge($atomic_types, $call_arg_atomic_type->as->getAtomicTypes()); + continue; + } + + if ($call_arg_atomic_type instanceof TNamedObject + && AtomicTypeComparator::isContainedBy( + $codebase, + $call_arg_atomic_type, + new TIterable([Type::getMixed(), Type::getMixed()]) + ) + ) { + $has_valid_iterator = true; + ForeachAnalyzer::handleIterable( + $statements_source, + $call_arg_atomic_type, + $call_args[0]->value, + $codebase, + $context, + $key_type, + $value_type, + $has_valid_iterator + ); + } + } + + if ($value_type) { + $second_arg_type = isset($call_args[1]) + ? $statements_source->node_data->getType($call_args[1]->value) + : null; + + if ($second_arg_type + && ((string) $second_arg_type === 'false') + ) { + return new Union([ + new TList($value_type), + ]); + } + + $key_type = $key_type + && (!isset($call_args[1]) + || ($second_arg_type && ((string) $second_arg_type === 'true'))) + ? $key_type + : Type::getArrayKey(); + + if ($key_type->hasMixed()) { + $key_type = Type::getArrayKey(); + } + + if ($key_type->isSingle() && $key_type->hasTemplate()) { + $template_types = $key_type->getTemplateTypes(); + $template_type = array_shift($template_types); + if ($template_type->as->hasMixed()) { + $template_type->as = Type::getArrayKey(); + $key_type = new Union([$template_type]); + } + } + + return new Union([ + new TArray([ + $key_type, + $value_type, + ]), + ]); + } + } + + $callmap_callables = InternalCallMapHandler::getCallablesFromCallMap($function_id); + + assert($callmap_callables && $callmap_callables[0]->return_type); + + return $callmap_callables[0]->return_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php new file mode 100644 index 00000000..1a24e22b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php @@ -0,0 +1,143 @@ + + */ + public static function getFunctionIds(): array + { + return ['min', 'max']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union + { + $call_args = $event->getCallArgs(); + if (count($call_args) === 0) { + return null; + } + + $statements_source = $event->getStatementsSource(); + $nodeTypeProvider = $statements_source->getNodeTypeProvider(); + + if (count($call_args) === 1 + && ($array_arg_type = $nodeTypeProvider->getType($call_args[0]->value)) + && $array_arg_type->isSingle() + && $array_arg_type->hasArray() + && ($array_type = ArrayType::infer($array_arg_type->getAtomicTypes()['array'])) + ) { + return $array_type->value; + } + + $all_int = true; + $min_bounds = []; + $max_bounds = []; + foreach ($call_args as $arg) { + if ($array_arg_type = $nodeTypeProvider->getType($arg->value)) { + foreach ($array_arg_type->getAtomicTypes() as $atomic_type) { + if (!$atomic_type instanceof TInt) { + $all_int = false; + break; + } + + if ($atomic_type instanceof TLiteralInt) { + $min_bounds[] = $atomic_type->value; + $max_bounds[] = $atomic_type->value; + } elseif ($atomic_type instanceof TIntRange) { + $min_bounds[] = $atomic_type->min_bound; + $max_bounds[] = $atomic_type->max_bound; + } elseif ($atomic_type instanceof TPositiveInt) { + $min_bounds[] = 1; + $max_bounds[] = null; + } elseif (get_class($atomic_type) === TInt::class) { + $min_bounds[] = null; + $max_bounds[] = null; + } else { + throw new UnexpectedValueException('Unexpected type'); + } + } + } else { + return Type::getMixed(); + } + } + + if ($all_int) { + if ($event->getFunctionId() === 'min') { + assert(count($min_bounds) !== 0); + //null values in $max_bounds doesn't make sense for min() so we remove them + $max_bounds = array_filter($max_bounds, function ($v) { + return $v !== null; + }) ?: [null]; + + $min_potential_int = in_array(null, $min_bounds, true) ? null : min($min_bounds); + $max_potential_int = in_array(null, $max_bounds, true) ? null : min($max_bounds); + } else { + assert(count($max_bounds) !== 0); + //null values in $min_bounds doesn't make sense for max() so we remove them + $min_bounds = array_filter($min_bounds, function ($v) { + return $v !== null; + }) ?: [null]; + + $min_potential_int = in_array(null, $min_bounds, true) ? null : max($min_bounds); + $max_potential_int = in_array(null, $max_bounds, true) ? null : max($max_bounds); + } + + if ($min_potential_int === null && $max_potential_int === null) { + return Type::getInt(); + } + + if ($min_potential_int === $max_potential_int) { + return Type::getInt(false, $min_potential_int); + } + + return new Union([new TIntRange($min_potential_int, $max_potential_int)]); + } + + //if we're dealing with non-int elements, just combine them all together + $return_type = null; + foreach ($call_args as $arg) { + if ($array_arg_type = $nodeTypeProvider->getType($arg->value)) { + if ($array_arg_type->isSingle()) { + $atomic_type = $array_arg_type->getSingleAtomic(); + if ($atomic_type instanceof TPositiveInt) { + //we replace TPositiveInt with a range for better combination + $array_arg_type->removeType('int'); + $array_arg_type->addType(new TIntRange(1, null)); + } + } + + $return_type = Type::combineUnionTypes( + $return_type, + $array_arg_type + ); + } else { + return Type::getMixed(); + } + } + + return $return_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php new file mode 100644 index 00000000..4b9ea038 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php @@ -0,0 +1,51 @@ + + */ + public static function getFunctionIds(): array + { + return [ + 'mktime', + ]; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + foreach ($call_args as $call_arg) { + if (!($call_arg_type = $statements_source->node_data->getType($call_arg->value)) + || !$call_arg_type->isInt() + ) { + $value_type = new Union([new TInt, new TFalse]); + + $codebase = $statements_source->getCodebase(); + + if ($codebase->config->ignore_internal_falsable_issues) { + $value_type->ignore_falsable_issues = true; + } + + return $value_type; + } + } + + return Type::getInt(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php new file mode 100644 index 00000000..6d51c7d2 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php @@ -0,0 +1,163 @@ + + */ + public static function getFunctionIds(): array + { + return ['parse_url']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + if (isset($call_args[1])) { + $is_default_component = false; + if ($component_type = $statements_source->node_data->getType($call_args[1]->value)) { + if (!$component_type->hasMixed()) { + $codebase = $statements_source->getCodebase(); + + $acceptable_string_component_type = new Union([ + new TLiteralInt(PHP_URL_SCHEME), + new TLiteralInt(PHP_URL_USER), + new TLiteralInt(PHP_URL_PASS), + new TLiteralInt(PHP_URL_HOST), + new TLiteralInt(PHP_URL_PATH), + new TLiteralInt(PHP_URL_QUERY), + new TLiteralInt(PHP_URL_FRAGMENT), + ]); + + $acceptable_int_component_type = new Union([ + new TLiteralInt(PHP_URL_PORT), + ]); + + if (UnionTypeComparator::isContainedBy( + $codebase, + $component_type, + $acceptable_string_component_type + )) { + $nullable_falsable_string = new Union([ + new TString, + new TFalse, + new TNull, + ]); + + $codebase = $statements_source->getCodebase(); + + if ($codebase->config->ignore_internal_nullable_issues) { + $nullable_falsable_string->ignore_nullable_issues = true; + } + + if ($codebase->config->ignore_internal_falsable_issues) { + $nullable_falsable_string->ignore_falsable_issues = true; + } + + return $nullable_falsable_string; + } + + if (UnionTypeComparator::isContainedBy( + $codebase, + $component_type, + $acceptable_int_component_type + )) { + $nullable_falsable_int = new Union([ + new TInt, + new TFalse, + new TNull, + ]); + + $codebase = $statements_source->getCodebase(); + + if ($codebase->config->ignore_internal_nullable_issues) { + $nullable_falsable_int->ignore_nullable_issues = true; + } + + if ($codebase->config->ignore_internal_falsable_issues) { + $nullable_falsable_int->ignore_falsable_issues = true; + } + + return $nullable_falsable_int; + } + + if ($component_type->isSingleIntLiteral()) { + $component_type_type = $component_type->getSingleIntLiteral(); + $is_default_component = $component_type_type->value <= -1; + } + } + } + + if (!$is_default_component) { + $nullable_string_or_int = new Union([ + new TString, + new TInt, + new TNull, + ]); + + $codebase = $statements_source->getCodebase(); + + if ($codebase->config->ignore_internal_nullable_issues) { + $nullable_string_or_int->ignore_nullable_issues = true; + } + + return $nullable_string_or_int; + } + } + + $component_types = [ + 'scheme' => Type::getString(), + 'user' => Type::getString(), + 'pass' => Type::getString(), + 'host' => Type::getString(), + 'port' => Type::getInt(), + 'path' => Type::getString(), + 'query' => Type::getString(), + 'fragment' => Type::getString(), + ]; + + foreach ($component_types as $component_type) { + $component_type->possibly_undefined = true; + } + + $return_type = new Union([ + new TKeyedArray($component_types), + new TFalse(), + ]); + + if ($statements_source->getCodebase()->config->ignore_internal_falsable_issues) { + $return_type->ignore_falsable_issues = true; + } + + return $return_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php new file mode 100644 index 00000000..86ee1271 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php @@ -0,0 +1,115 @@ +getSource(); + $call_args = $event->getCallArgs(); + $method_name_lowercase = $event->getMethodNameLowercase(); + if ($method_name_lowercase === 'fetch' + && class_exists('PDO') + && isset($call_args[0]) + && ($first_arg_type = $source->getNodeTypeProvider()->getType($call_args[0]->value)) + && $first_arg_type->isSingleIntLiteral() + ) { + $fetch_mode = $first_arg_type->getSingleIntLiteral()->value; + + switch ($fetch_mode) { + case PDO::FETCH_ASSOC: // array|false + return new Union([ + new TArray([ + Type::getString(), + new Union([ + new TScalar(), + new TNull() + ]) + ]), + new TFalse(), + ]); + + case PDO::FETCH_BOTH: // array|false + return new Union([ + new TArray([ + Type::getArrayKey(), + new Union([ + new TScalar(), + new TNull() + ]) + ]), + new TFalse(), + ]); + + case PDO::FETCH_BOUND: // bool + return Type::getBool(); + + case PDO::FETCH_CLASS: // object|false + return new Union([ + new TObject(), + new TFalse(), + ]); + + case PDO::FETCH_LAZY: // object|false + // This actually returns a PDORow object, but that class is + // undocumented, and its attributes are all dynamic anyway + return new Union([ + new TObject(), + new TFalse(), + ]); + + case PDO::FETCH_NAMED: // array>|false + return new Union([ + new TArray([ + Type::getString(), + new Union([ + new TScalar(), + new TList(Type::getScalar()) + ]) + ]), + new TFalse(), + ]); + + case PDO::FETCH_NUM: // list|false + return new Union([ + new TList( + new Union([ + new TScalar(), + new TNull() + ]) + ), + new TFalse(), + ]); + + case PDO::FETCH_OBJ: // stdClass|false + return new Union([ + new TNamedObject('stdClass'), + new TFalse(), + ]); + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php new file mode 100644 index 00000000..e352ffd4 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php @@ -0,0 +1,111 @@ + + */ + public static function getMethodParams(MethodParamsProviderEvent $event): ?array + { + $statements_source = $event->getStatementsSource(); + $method_name_lowercase = $event->getMethodNameLowercase(); + $context = $event->getContext(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return null; + } + + if ($method_name_lowercase === 'setfetchmode') { + if (!$context + || !$call_args + || ExpressionAnalyzer::analyze( + $statements_source, + $call_args[0]->value, + $context + ) === false + ) { + return null; + } + + if (($first_call_arg_type = $statements_source->node_data->getType($call_args[0]->value)) + && $first_call_arg_type->isSingleIntLiteral() + ) { + $params = [ + new FunctionLikeParameter( + 'mode', + false, + Type::getInt(), + null, + null, + false + ), + ]; + + $value = $first_call_arg_type->getSingleIntLiteral()->value; + + switch ($value) { + case PDO::FETCH_COLUMN: + $params[] = new FunctionLikeParameter( + 'colno', + false, + Type::getInt(), + null, + null, + false + ); + break; + + case PDO::FETCH_CLASS: + $params[] = new FunctionLikeParameter( + 'classname', + false, + Type::getClassString(), + null, + null, + false + ); + + $params[] = new FunctionLikeParameter( + 'ctorargs', + false, + Type::getArray(), + null, + null, + true + ); + break; + + case PDO::FETCH_INTO: + $params[] = new FunctionLikeParameter( + 'object', + false, + Type::getObject(), + null, + null, + false + ); + break; + } + + return $params; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php new file mode 100644 index 00000000..32530db9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php @@ -0,0 +1,70 @@ + + */ + public static function getFunctionIds(): array + { + return ['rand', 'mt_rand', 'random_int']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union + { + $call_args = $event->getCallArgs(); + if (count($call_args) === 0) { + return Type::getInt(); + } + + if (count($call_args) !== 2) { + return null; + } + + $statements_source = $event->getStatementsSource(); + $nodeTypeProvider = $statements_source->getNodeTypeProvider(); + + $first_arg = $nodeTypeProvider->getType($call_args[0]->value); + $second_arg = $nodeTypeProvider->getType($call_args[1]->value); + + $min_value = null; + if ($first_arg !== null && $first_arg->isSingle()) { + $first_atomic_type = $first_arg->getSingleAtomic(); + if ($first_atomic_type instanceof TLiteralInt) { + $min_value = $first_atomic_type->value; + } elseif ($first_atomic_type instanceof TIntRange) { + $min_value = $first_atomic_type->min_bound; + } elseif ($first_atomic_type instanceof TPositiveInt) { + $min_value = 1; + } + } + + $max_value = null; + if ($second_arg !== null && $second_arg->isSingle()) { + $second_atomic_type = $second_arg->getSingleAtomic(); + if ($second_atomic_type instanceof TLiteralInt) { + $max_value = $second_atomic_type->value; + } elseif ($second_atomic_type instanceof TIntRange) { + $max_value = $second_atomic_type->max_bound; + } elseif ($second_atomic_type instanceof TPositiveInt) { + // no max value, we keep null + } + } + + return new Union([new TIntRange($min_value, $max_value)]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php new file mode 100644 index 00000000..88e71c38 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php @@ -0,0 +1,31 @@ +getCallArgs(); + $method_name_lowercase = $event->getMethodNameLowercase(); + if ($method_name_lowercase === 'asxml' + && !count($call_args) + ) { + return Type::parseString('string|false'); + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php new file mode 100644 index 00000000..d32da31e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php @@ -0,0 +1,64 @@ + + */ + public static function getFunctionIds(): array + { + return [ + 'str_replace', + 'str_ireplace', + 'substr_replace', + 'preg_replace', + 'preg_replace_callback', + ]; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $function_id = $event->getFunctionId(); + if (!$statements_source instanceof StatementsAnalyzer + || count($call_args) < 3 + ) { + return Type::getMixed(); + } + + if ($subject_type = $statements_source->node_data->getType($call_args[2]->value)) { + if (!$subject_type->hasString() && $subject_type->hasArray()) { + return Type::getArray(); + } + + $return_type = Type::getString(); + + if (in_array($function_id, ['preg_replace', 'preg_replace_callback'], true)) { + $return_type->addType(new TNull()); + + $codebase = $statements_source->getCodebase(); + + if ($codebase->config->ignore_internal_nullable_issues) { + $return_type->ignore_nullable_issues = true; + } + } + + return $return_type; + } + + return Type::getMixed(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php new file mode 100644 index 00000000..cb3b0195 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php @@ -0,0 +1,72 @@ + + */ + public static function getFunctionIds(): array + { + return [ + 'strtr', + ]; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $function_id = $event->getFunctionId(); + $code_location = $event->getCodeLocation(); + if (!$statements_source instanceof StatementsAnalyzer) { + throw new UnexpectedValueException(); + } + + $type = Type::getString(); + + if ($statements_source->data_flow_graph + && !in_array('TaintedInput', $statements_source->getSuppressedIssues())) { + $function_return_sink = DataFlowNode::getForMethodReturn( + $function_id, + $function_id, + null, + $code_location + ); + + $statements_source->data_flow_graph->addNode($function_return_sink); + foreach ($call_args as $i => $_) { + $function_param_sink = DataFlowNode::getForMethodArgument( + $function_id, + $function_id, + $i, + null, + $code_location + ); + + $statements_source->data_flow_graph->addNode($function_param_sink); + + $statements_source->data_flow_graph->addPath( + $function_param_sink, + $function_return_sink, + 'arg' + ); + } + + $type->parent_nodes = [$function_return_sink->id => $function_return_sink]; + } + + return $type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php new file mode 100644 index 00000000..385c6b61 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php @@ -0,0 +1,74 @@ + + */ + public static function getFunctionIds(): array + { + return ['trigger_error']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union + { + $codebase = $event->getStatementsSource()->getCodebase(); + $config = $codebase->config; + if ($config->trigger_error_exits === 'always') { + return new Union([new TNever()]); + } + + if ($config->trigger_error_exits === 'never') { + return new Union([new TTrue()]); + } + + //default behaviour + $call_args = $event->getCallArgs(); + $statements_source = $event->getStatementsSource(); + if (isset($call_args[1]) + && ($array_arg_type = $statements_source->getNodeTypeProvider()->getType($call_args[1]->value)) + ) { + $return_types = []; + foreach ($array_arg_type->getAtomicTypes() as $atomicType) { + if ($atomicType instanceof TLiteralInt) { + if (in_array($atomicType->value, [E_USER_WARNING, E_USER_DEPRECATED, E_USER_NOTICE], true)) { + $return_types[] = new TTrue(); + } elseif ($atomicType->value === E_USER_ERROR) { + $return_types[] = new TNever(); + } else { + // not recognized int literal. return false before PHP8, fatal error since + $return_types[] = new TFalse(); + } + } else { + $return_types[] = new TBool(); + } + } + + return TypeCombiner::combine($return_types, $codebase); + } + + //default value is E_USER_NOTICE, so return true + return new Union([new TTrue()]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php new file mode 100644 index 00000000..cab2b999 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php @@ -0,0 +1,82 @@ + + */ + public static function getFunctionIds(): array + { + return ['version_compare']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union + { + $statements_source = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + if (!$statements_source instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + if (count($call_args) > 2) { + $operator_type = $statements_source->node_data->getType($call_args[2]->value); + + 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'), + ]); + + $codebase = $statements_source->getCodebase(); + + if (UnionTypeComparator::isContainedBy( + $codebase, + $operator_type, + $acceptable_operator_type + )) { + return Type::getBool(); + } + } + } + + return new Union([ + new TBool, + new TNull, + ]); + } + + return new Union([ + new TLiteralInt(-1), + new TLiteralInt(0), + new TLiteralInt(1), + ]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php new file mode 100644 index 00000000..431cb158 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php @@ -0,0 +1,538 @@ +> + */ + private $unchanged_members = []; + + /** + * @var array> + */ + private $unchanged_signature_members = []; + + /** + * @var array> + */ + private $changed_members = []; + + /** + * @var array + */ + private $errors = []; + + /** + * @var array> + */ + private $diff_map = []; + + /** + * @var array> + */ + private $deletion_ranges = []; + + /** + * @var PhpParser\Lexer|null + */ + private static $lexer; + + /** + * @var PhpParser\Parser|null + */ + private static $parser; + + public function __construct( + FileProvider $file_provider, + ?ParserCacheProvider $parser_cache_provider = null, + ?FileStorageCacheProvider $file_storage_cache_provider = null + ) { + $this->file_provider = $file_provider; + $this->parser_cache_provider = $parser_cache_provider; + $this->this_modified_time = filemtime(__FILE__); + $this->file_storage_cache_provider = $file_storage_cache_provider; + $this->statements_volatile_cache = StatementsVolatileCache::getInstance(); + } + + /** + * @return list + */ + public function getStatementsForFile(string $file_path, string $php_version, ?Progress $progress = null): array + { + unset($this->errors[$file_path]); + + if ($progress === null) { + $progress = new VoidProgress(); + } + + $from_cache = false; + + $version = PHP_PARSER_VERSION . $this->this_modified_time; + + $file_contents = $this->file_provider->getContents($file_path); + $modified_time = $this->file_provider->getModifiedTime($file_path); + + $config = Config::getInstance(); + + $file_content_hash = md5($version . $file_contents); + + if (!$this->parser_cache_provider + || (!$config->isInProjectDirs($file_path) && strpos($file_path, 'vendor')) + ) { + $cache_key = "{$file_content_hash}:{$php_version}"; + if ($this->statements_volatile_cache->has($cache_key)) { + return $this->statements_volatile_cache->get($cache_key); + } + + $progress->debug('Parsing ' . $file_path . "\n"); + + $has_errors = false; + + $stmts = self::parseStatements($file_contents, $php_version, $has_errors, $file_path); + + $this->statements_volatile_cache->set($cache_key, $stmts); + + return $stmts; + } + + $stmts = $this->parser_cache_provider->loadStatementsFromCache( + $file_path, + $modified_time, + $file_content_hash + ); + + if ($stmts === null) { + $progress->debug('Parsing ' . $file_path . "\n"); + + $existing_statements = $this->parser_cache_provider->loadExistingStatementsFromCache($file_path); + + if ($existing_statements && !$existing_statements[0] instanceof PhpParser\Node\Stmt) { + $existing_statements = null; + } + + $existing_file_contents = $this->parser_cache_provider->loadExistingFileContentsFromCache($file_path); + + // this happens after editing temporary file + if ($existing_file_contents === $file_contents && $existing_statements) { + $this->diff_map[$file_path] = []; + $this->parser_cache_provider->saveStatementsToCache( + $file_path, + $file_content_hash, + $existing_statements, + true + ); + + return $existing_statements; + } + + $file_changes = null; + + $existing_statements_copy = null; + + if ($existing_statements + && $existing_file_contents + && abs(strlen($existing_file_contents) - strlen($file_contents)) < 5000 + ) { + $file_changes = FileDiffer::getDiff($existing_file_contents, $file_contents); + + if (count($file_changes) < 10) { + $traverser = new PhpParser\NodeTraverser; + $traverser->addVisitor(new CloningVisitor); + // performs a deep clone + /** @var list */ + $existing_statements_copy = $traverser->traverse($existing_statements); + } else { + $file_changes = null; + } + } + + $has_errors = false; + + $stmts = self::parseStatements( + $file_contents, + $php_version, + $has_errors, + $file_path, + $existing_file_contents, + $existing_statements_copy, + $file_changes + ); + + if ($existing_file_contents && $existing_statements && (!$has_errors || $stmts)) { + [$unchanged_members, $unchanged_signature_members, $changed_members, $diff_map, $deletion_ranges] + = FileStatementsDiffer::diff( + $existing_statements, + $stmts, + $existing_file_contents, + $file_contents + ); + + $unchanged_members = array_map( + function (int $_): bool { + return true; + }, + array_flip($unchanged_members) + ); + + $unchanged_signature_members = array_map( + function (int $_): bool { + return true; + }, + array_flip($unchanged_signature_members) + ); + + $file_path_hash = md5($file_path); + + $changed_members = array_map( + function (string $key) use ($file_path_hash): string { + if (strpos($key, 'use:') === 0) { + return $key . ':' . $file_path_hash; + } + + return $key; + }, + $changed_members + ); + + $changed_members = array_map( + /** + * @param int $_ + * + * @return bool + */ + function ($_): bool { + return true; + }, + array_flip($changed_members) + ); + + if (isset($this->unchanged_members[$file_path])) { + $this->unchanged_members[$file_path] = array_intersect_key( + $this->unchanged_members[$file_path], + $unchanged_members + ); + } else { + $this->unchanged_members[$file_path] = $unchanged_members; + } + + if (isset($this->unchanged_signature_members[$file_path])) { + $this->unchanged_signature_members[$file_path] = array_intersect_key( + $this->unchanged_signature_members[$file_path], + $unchanged_signature_members + ); + } else { + $this->unchanged_signature_members[$file_path] = $unchanged_signature_members; + } + + if (isset($this->changed_members[$file_path])) { + $this->changed_members[$file_path] = array_merge( + $this->changed_members[$file_path], + $changed_members + ); + } else { + $this->changed_members[$file_path] = $changed_members; + } + + $this->diff_map[$file_path] = $diff_map; + $this->deletion_ranges[$file_path] = $deletion_ranges; + } elseif ($has_errors && !$stmts) { + $this->errors[$file_path] = true; + } + + if ($this->file_storage_cache_provider) { + $this->file_storage_cache_provider->removeCacheForFile($file_path); + } + + $this->parser_cache_provider->cacheFileContents($file_path, $file_contents); + } else { + $from_cache = true; + $this->diff_map[$file_path] = []; + $this->deletion_ranges[$file_path] = []; + } + + $this->parser_cache_provider->saveStatementsToCache($file_path, $file_content_hash, $stmts, $from_cache); + + if (!$stmts) { + return []; + } + + return $stmts; + } + + /** + * @return array> + */ + public function getChangedMembers(): array + { + return $this->changed_members; + } + + /** + * @param array> $more_changed_members + * + */ + public function addChangedMembers(array $more_changed_members): void + { + $this->changed_members = array_merge($more_changed_members, $this->changed_members); + } + + /** + * @return array> + */ + public function getUnchangedSignatureMembers(): array + { + return $this->unchanged_signature_members; + } + + /** + * @param array> $more_unchanged_members + * + */ + public function addUnchangedSignatureMembers(array $more_unchanged_members): void + { + $this->unchanged_signature_members = array_merge($more_unchanged_members, $this->unchanged_signature_members); + } + + /** + * @return array + */ + public function getErrors(): array + { + return $this->errors; + } + + /** + * @param array $errors + * + */ + public function addErrors(array $errors): void + { + $this->errors += $errors; + } + + public function setUnchangedFile(string $file_path): void + { + if (!isset($this->diff_map[$file_path])) { + $this->diff_map[$file_path] = []; + } + + if (!isset($this->deletion_ranges[$file_path])) { + $this->deletion_ranges[$file_path] = []; + } + } + + /** + * @return array> + */ + public function getDiffMap(): array + { + return $this->diff_map; + } + + /** + * @return array> + */ + public function getDeletionRanges(): array + { + return $this->deletion_ranges; + } + + /** + * @param array> $diff_map + * + */ + public function addDiffMap(array $diff_map): void + { + $this->diff_map = array_merge($diff_map, $this->diff_map); + } + + /** + * @param array> $deletion_ranges + * + */ + public function addDeletionRanges(array $deletion_ranges): void + { + $this->deletion_ranges = array_merge($deletion_ranges, $this->deletion_ranges); + } + + public function resetDiffs(): void + { + $this->changed_members = []; + $this->unchanged_members = []; + $this->unchanged_signature_members = []; + $this->diff_map = []; + $this->deletion_ranges = []; + } + + /** + * @param list $existing_statements + * @param array $file_changes + * + * @return list + */ + public static function parseStatements( + string $file_contents, + string $php_version, + bool &$has_errors, + ?string $file_path = null, + ?string $existing_file_contents = null, + ?array $existing_statements = null, + ?array $file_changes = null + ): array { + $attributes = [ + 'comments', 'startLine', 'startFilePos', 'endFilePos', + ]; + + if (!self::$lexer) { + self::$lexer = new PhpParser\Lexer\Emulative([ + 'usedAttributes' => $attributes, + 'phpVersion' => $php_version, + ]); + } + + if (!self::$parser) { + self::$parser = (new PhpParser\ParserFactory())->create(PhpParser\ParserFactory::ONLY_PHP7, self::$lexer); + } + + $used_cached_statements = false; + + $error_handler = new Collecting(); + + if ($existing_statements && $file_changes && $existing_file_contents) { + $clashing_traverser = new CustomTraverser; + $offset_analyzer = new PartialParserVisitor( + self::$parser, + $error_handler, + $file_changes, + $existing_file_contents, + $file_contents + ); + $clashing_traverser->addVisitor($offset_analyzer); + $clashing_traverser->traverse($existing_statements); + + if (!$offset_analyzer->mustRescan()) { + $used_cached_statements = true; + $stmts = $existing_statements; + } else { + try { + /** @var list */ + $stmts = self::$parser->parse($file_contents, $error_handler) ?: []; + } catch (Throwable $t) { + $stmts = []; + + // hope this got caught below + } + } + } else { + try { + /** @var list */ + $stmts = self::$parser->parse($file_contents, $error_handler) ?: []; + } catch (Throwable $t) { + $stmts = []; + + // hope this got caught below + } + } + + if ($error_handler->hasErrors() && $file_path) { + $config = Config::getInstance(); + $has_errors = true; + + foreach ($error_handler->getErrors() as $error) { + if ($error->hasColumnInfo()) { + IssueBuffer::maybeAdd( + new ParseError( + $error->getMessage(), + new ParseErrorLocation( + $error, + $file_contents, + $file_path, + $config->shortenFileName($file_path) + ) + ) + ); + } + } + } + + $error_handler->clearErrors(); + + $resolving_traverser = new PhpParser\NodeTraverser; + $name_resolver = new SimpleNameResolver( + $error_handler, + $used_cached_statements ? $file_changes : [] + ); + $resolving_traverser->addVisitor($name_resolver); + $resolving_traverser->traverse($stmts); + + return $stmts; + } + + public static function clearLexer(): void + { + self::$lexer = null; + } + + public static function clearParser(): void + { + self::$parser = null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php new file mode 100644 index 00000000..2dd19ea1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php @@ -0,0 +1,108 @@ +> + */ + protected $cache = []; + + /** + * @var array + */ + protected $access = []; + + /** + * @var int + */ + protected $max_size; + + /** + * @var ?StatementsVolatileCache + */ + protected static $instance; + + public function __construct(int $max_size = 4096) + { + $this->max_size = $max_size; + } + + public static function getInstance(): StatementsVolatileCache + { + if (is_null(self::$instance)) { + self::$instance = new self(); + } + + return self::$instance; + } + + public function has(string $key): bool + { + return array_key_exists($key, $this->cache); + } + + /** + * @param string $key + * @return list + * @throws InvalidArgumentException + */ + public function get(string $key): array + { + if (! $this->has($key)) { + throw new InvalidArgumentException('Given $key does not exists'); + } + + $access_index = array_search($key, $this->access); + if (false !== $access_index) { + array_splice($this->access, $access_index, 1); + } + $this->access[] = $key; + + return $this->cache[$key]; + } + + /** + * @param string $key + * @param list $content + */ + public function set(string $key, array $content): void + { + if (count($this->cache) > $this->max_size) { + reset($this->access); + + $oldest_key_index = key($this->access); + + if (! is_null($oldest_key_index)) { + $oldest_key = $this->access[$oldest_key_index]; + unset($this->cache[$oldest_key]); + unset($this->access[$oldest_key_index]); + } + } + + $this->cache[$key] = $content; + $this->access[] = $key; + } + + public function clearCache(): void + { + $this->cache = []; + $this->access = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php b/vendor/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php new file mode 100644 index 00000000..14bb1707 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php @@ -0,0 +1,36 @@ +type = clone $type; + + if ($this->type->getLiteralStrings()) { + $this->type->addType(new TString); + } + + if ($this->type->getLiteralInts()) { + $this->type->addType(new TInt); + } + + if ($this->type->getLiteralFloats()) { + $this->type->addType(new TFloat); + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php b/vendor/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php new file mode 100644 index 00000000..64c398d1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php @@ -0,0 +1,44 @@ +clearCache(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php new file mode 100644 index 00000000..a9168cc3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php @@ -0,0 +1,147 @@ + + */ + public $psalm_internal = []; + + /** + * @var string[] + */ + public $mixins = []; + + /** + * @var array + */ + public $templates = []; + + /** + * @var array + */ + public $template_extends = []; + + /** + * @var array + */ + public $template_implements = []; + + /** + * @var ?string + */ + public $yield; + + /** + * @var array + */ + public $properties = []; + + /** + * @var array + */ + public $methods = []; + + /** + * @var bool + */ + public $sealed_properties = false; + + /** + * @var bool + */ + public $sealed_methods = false; + + /** + * @var bool + */ + public $override_property_visibility = false; + + /** + * @var bool + */ + public $override_method_visibility = false; + + /** + * @var bool + */ + public $mutation_free = false; + + /** + * @var bool + */ + public $external_mutation_free = false; + + /** + * @var bool + */ + public $taint_specialize = false; + + /** + * @var array + */ + public $suppressed_issues = []; + + /** + * @var list}> + */ + public $imported_types = []; + + /** + * @var bool + */ + public $consistent_constructor = false; + + /** + * @var bool + */ + public $consistent_templates = false; + + /** @var bool */ + public $stub_override = false; + + /** + * @var null|string + */ + public $extension_requirement; + + /** + * @var array + */ + public $implementation_requirements = []; + + /** + * @var ?string + */ + public $description; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php new file mode 100644 index 00000000..2ddf134e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php @@ -0,0 +1,300 @@ + $line) { + if (preg_match('/^[ \t]*\*?\s*@\w/i', $line)) { + $last = $k; + } elseif (preg_match('/^\s*\r?$/', $line)) { + $last = false; + } elseif ($last !== false) { + $old_last_line = $lines[$last]; + $lines[$last] = $old_last_line . "\n" . $line; + + unset($lines[$k]); + } + } + + $line_offset = 0; + + foreach ($lines as $k => $line) { + $original_line_length = strlen($line); + + $line = str_replace("\r", '', $line); + + if ($first_line_padding === null) { + $asterisk_pos = strpos($line, '*'); + + if ($asterisk_pos) { + $first_line_padding = substr($line, 0, $asterisk_pos - 1); + } + } + + if (preg_match('/^[ \t]*\*?\s*@([\w\-\\\:]+)[\t ]*(.*)$/sm', $line, $matches, PREG_OFFSET_CAPTURE)) { + /** @var array $matches */ + [, $type_info, $data_info] = $matches; + + [$type] = $type_info; + [$data, $data_offset] = $data_info; + + if (strpos($data, '*')) { + $data = rtrim(preg_replace('/^[ \t]*\*\s*$/m', '', $data)); + } + + if (empty($special[$type])) { + $special[$type] = []; + } + + $data_offset += $line_offset; + + $special[$type][$data_offset + 3 + $offsetStart] = $data; + + unset($lines[$k]); + } else { + // Strip the leading *, if present. + $text = $lines[$k]; + $text = str_replace("\t", ' ', $text); + $text = preg_replace('/^ *\*/', '', $text); + $lines[$k] = $text; + } + + $line_offset += $original_line_length + 1; + } + + // Smush the whole docblock to the left edge. + $min_indent = 80; + foreach ($lines as $k => $line) { + $indent = strspn($line, ' '); + if ($indent === strlen($line)) { + // This line consists of only spaces. Trim it completely. + $lines[$k] = ''; + continue; + } + $min_indent = min($indent, $min_indent); + } + if ($min_indent > 0) { + foreach ($lines as $k => $line) { + if (strlen($line) < $min_indent) { + continue; + } + $lines[$k] = substr($line, $min_indent); + } + } + $docblock = implode("\n", $lines); + $docblock = rtrim($docblock); + + // Trim any empty lines off the front, but leave the indent level if there + // is one. + $docblock = preg_replace('/^\s*\n/', '', $docblock); + + $parsed = new ParsedDocblock($docblock, $special, $first_line_padding ?: ''); + + self::resolveTags($parsed); + + return $parsed; + } + + private static function resolveTags(ParsedDocblock $docblock): void + { + if (isset($docblock->tags['template']) + || isset($docblock->tags['psalm-template']) + || isset($docblock->tags['phpstan-template']) + ) { + $docblock->combined_tags['template'] + = ($docblock->tags['template'] ?? []) + + ($docblock->tags['phpstan-template'] ?? []) + + ($docblock->tags['psalm-template'] ?? []); + } + + if (isset($docblock->tags['template-covariant']) + || isset($docblock->tags['psalm-template-covariant']) + || isset($docblock->tags['phpstan-template-covariant']) + ) { + $docblock->combined_tags['template-covariant'] + = ($docblock->tags['template-covariant'] ?? []) + + ($docblock->tags['phpstan-template-covariant'] ?? []) + + ($docblock->tags['psalm-template-covariant'] ?? []); + } + + if (isset($docblock->tags['template-extends']) + || isset($docblock->tags['inherits']) + || isset($docblock->tags['extends']) + || isset($docblock->tags['psalm-extends']) + || isset($docblock->tags['phpstan-extends']) + ) { + $docblock->combined_tags['extends'] + = ($docblock->tags['template-extends'] ?? []) + + ($docblock->tags['inherits'] ?? []) + + ($docblock->tags['extends'] ?? []) + + ($docblock->tags['psalm-extends'] ?? []) + + ($docblock->tags['phpstan-extends'] ?? []); + } + + if (isset($docblock->tags['template-implements']) + || isset($docblock->tags['implements']) + || isset($docblock->tags['phpstan-implements']) + || isset($docblock->tags['psalm-implements']) + ) { + $docblock->combined_tags['implements'] + = ($docblock->tags['template-implements'] ?? []) + + ($docblock->tags['implements'] ?? []) + + ($docblock->tags['phpstan-implements'] ?? []) + + ($docblock->tags['psalm-implements'] ?? []); + } + + if (isset($docblock->tags['template-use']) + || isset($docblock->tags['use']) + || isset($docblock->tags['phpstan-use']) + || isset($docblock->tags['psalm-use']) + ) { + $docblock->combined_tags['use'] + = ($docblock->tags['template-use'] ?? []) + + ($docblock->tags['use'] ?? []) + + ($docblock->tags['phpstan-use'] ?? []) + + ($docblock->tags['psalm-use'] ?? []); + } + + if (isset($docblock->tags['method']) + || isset($docblock->tags['psalm-method']) + ) { + $docblock->combined_tags['method'] + = ($docblock->tags['method'] ?? []) + + ($docblock->tags['psalm-method'] ?? []); + } + + if (isset($docblock->tags['return']) + || isset($docblock->tags['psalm-return']) + || isset($docblock->tags['phpstan-return']) + ) { + if (isset($docblock->tags['psalm-return'])) { + $docblock->combined_tags['return'] = $docblock->tags['psalm-return']; + } elseif (isset($docblock->tags['phpstan-return'])) { + $docblock->combined_tags['return'] = $docblock->tags['phpstan-return']; + } else { + $docblock->combined_tags['return'] = $docblock->tags['return']; + } + } + + if (isset($docblock->tags['param']) + || isset($docblock->tags['psalm-param']) + || isset($docblock->tags['phpstan-param']) + ) { + $docblock->combined_tags['param'] + = ($docblock->tags['param'] ?? []) + + ($docblock->tags['phpstan-param'] ?? []) + + ($docblock->tags['psalm-param'] ?? []); + } + + if (isset($docblock->tags['var']) + || isset($docblock->tags['psalm-var']) + || isset($docblock->tags['phpstan-var']) + ) { + if (!isset($docblock->tags['ignore-var']) + && !isset($docblock->tags['psalm-ignore-var']) + ) { + $docblock->combined_tags['var'] + = ($docblock->tags['var'] ?? []) + + ($docblock->tags['phpstan-var'] ?? []) + + ($docblock->tags['psalm-var'] ?? []); + } + } + + if (isset($docblock->tags['param-out']) + || isset($docblock->tags['psalm-param-out']) + ) { + $docblock->combined_tags['param-out'] + = ($docblock->tags['param-out'] ?? []) + + ($docblock->tags['psalm-param-out'] ?? []); + } + } + + /** + * @return list + * @throws DocblockParseException when a @psalm-internal tag doesn't include a namespace + */ + public static function handlePsalmInternal(ParsedDocblock $parsed_docblock): array + { + if (isset($parsed_docblock->tags['psalm-internal'])) { + $psalm_internal = array_map("trim", $parsed_docblock->tags['psalm-internal']); + + if (count($psalm_internal) !== count(array_filter($psalm_internal))) { + throw new DocblockParseException('psalm-internal annotation used without specifying namespace'); + } + // assert($psalm_internal === array_filter($psalm_internal)); // TODO get this to work + assert(self::assertArrayOfNonEmptyString($psalm_internal)); + + return array_values($psalm_internal); + } + + return []; + } + + /** @psalm-assert-if-true array $arr */ + private static function assertArrayOfNonEmptyString(array $arr): bool + { + foreach ($arr as $val) { + if (!is_string($val) || $val === "") { + return false; + } + } + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php new file mode 100644 index 00000000..1cc9b6ff --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php @@ -0,0 +1,117 @@ +file_path = $file_path; + $this->file_name = $file_name; + $this->will_analyze = $will_analyze; + } + + public function scan( + Codebase $codebase, + FileStorage $file_storage, + bool $storage_from_cache = false, + ?Progress $progress = null + ): void { + if ($progress === null) { + $progress = new VoidProgress(); + } + + if ((!$this->will_analyze || $file_storage->deep_scan) + && $storage_from_cache + && !$codebase->register_stub_files + ) { + return; + } + + $stmts = $codebase->statements_provider->getStatementsForFile( + $file_storage->file_path, + $codebase->php_major_version . '.' . $codebase->php_minor_version, + $progress + ); + + foreach ($stmts as $stmt) { + if (!$stmt instanceof PhpParser\Node\Stmt\ClassLike + && !$stmt instanceof PhpParser\Node\Stmt\Function_ + && !($stmt instanceof PhpParser\Node\Stmt\Expression + && $stmt->expr instanceof PhpParser\Node\Expr\Include_) + ) { + $file_storage->has_extra_statements = true; + break; + } + } + + if ($this->will_analyze) { + $progress->debug('Deep scanning ' . $file_storage->file_path . "\n"); + } else { + $progress->debug('Scanning ' . $file_storage->file_path . "\n"); + } + + $traverser = new NodeTraverser(); + $traverser->addVisitor( + new ReflectorVisitor($codebase, $this, $file_storage) + ); + + $traverser->traverse($stmts); + + $file_storage->deep_scan = $this->will_analyze; + } + + public function getFilePath(): string + { + return $this->file_path; + } + + public function getFileName(): string + { + return $this->file_name; + } + + public function getRootFilePath(): string + { + return $this->file_path; + } + + public function getRootFileName(): string + { + return $this->file_name; + } + + public function getAliases(): Aliases + { + return new Aliases(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php new file mode 100644 index 00000000..a3819b4a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php @@ -0,0 +1,228 @@ + + */ + public $params = []; + + /** + * @var array + */ + public $params_out = []; + + /** + * @var array{type:string, line_number: int}|null + */ + public $self_out; + + /** + * @var array{type:string, line_number: int}|null + */ + public $if_this_is; + + /** + * @var array + */ + public $globals = []; + + /** + * Whether or not the function is deprecated + * + * @var bool + */ + public $deprecated = false; + + /** + * If set, the function is internal to the given namespace. + * + * @var list + */ + public $psalm_internal = []; + + /** + * Whether or not the function is internal + * + * @var bool + */ + public $internal = false; + + /** + * Whether or not the function uses get_args + * + * @var bool + */ + public $variadic = false; + + /** + * Whether or not the function is pure + * + * @var bool + */ + public $pure = false; + + /** + * Whether or not to specialize a given call (useful for taint analysis) + * + * @var bool + */ + public $specialize_call = false; + + /** + * Represents the flow from function params to return type + * + * @var array + */ + public $flows = []; + + /** + * @var array + */ + public $added_taints = []; + + /** + * @var array + */ + public $removed_taints = []; + + /** + * @var array + */ + public $taint_sink_params = []; + + /** + * @var array + */ + public $taint_source_types = []; + + /** + * @var array + */ + public $assert_untainted_params = []; + + /** + * Whether or not to ignore the nullability of this function's return type + * + * @var bool + */ + public $ignore_nullable_return = false; + + /** + * Whether or not to ignore the nullability of this function's return type + * + * @var bool + */ + public $ignore_falsable_return = false; + + /** + * @var array + */ + public $suppressed_issues = []; + + /** + * @var array + */ + public $throws = []; + + /** + * @var array + */ + public $templates = []; + + /** + * @var array + */ + public $assertions = []; + + /** + * @var array + */ + public $if_true_assertions = []; + + /** + * @var array + */ + public $if_false_assertions = []; + + /** + * @var bool + */ + public $inheritdoc = false; + + /** + * @var bool + */ + public $mutation_free = false; + + /** + * @var bool + */ + public $external_mutation_free = false; + + /** + * @var bool + */ + public $no_named_args = false; + + /** @var bool */ + public $stub_override = false; + + /** + * @var int + */ + public $since_php_major_version = 0; + + /** + * @var int + */ + public $since_php_minor_version = 0; + + /** + * @var ?string + */ + public $description; + + /** @var array, suggested_replacement?:string}> */ + public $unexpected_tags = []; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php new file mode 100644 index 00000000..26c5b013 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php @@ -0,0 +1,95 @@ +> */ + public $tags = []; + + /** @var array> */ + public $combined_tags = []; + + /** + * @var bool + */ + private static $shouldAddNewLineBetweenAnnotations = true; + + /** @param array> $tags */ + public function __construct(string $description, array $tags, string $first_line_padding = '') + { + $this->description = $description; + $this->tags = $tags; + $this->first_line_padding = $first_line_padding; + } + + public function render(string $left_padding): string + { + $doc_comment_text = '/**' . "\n"; + + $trimmed_description = trim($this->description); + + if ($trimmed_description !== '') { + $description_lines = explode("\n", $this->description); + + foreach ($description_lines as $line) { + $doc_comment_text .= $left_padding . ' *' . (trim($line) ? ' ' . $line : '') . "\n"; + } + } + + if ($this->tags) { + if ($trimmed_description !== '') { + $doc_comment_text .= $left_padding . ' *' . "\n"; + } + + $last_type = null; + + foreach ($this->tags as $type => $lines) { + if ($last_type !== null + && $last_type !== 'psalm-return' + && static::shouldAddNewLineBetweenAnnotations() + ) { + $doc_comment_text .= $left_padding . ' *' . "\n"; + } + + foreach ($lines as $line) { + $doc_comment_text .= $left_padding . ' * @' . $type . ($line !== '' ? ' ' . $line : '') . "\n"; + } + + $last_type = $type; + } + } + + $doc_comment_text .= $left_padding . ' */' . "\n" . $left_padding; + + return $doc_comment_text; + } + + private static function shouldAddNewLineBetweenAnnotations(): bool + { + return static::$shouldAddNewLineBetweenAnnotations; + } + + /** + * Sets whether a new line should be added between the annotations or not. + * + */ + public static function addNewLineBetweenAnnotations(bool $should = true): void + { + static::$shouldAddNewLineBetweenAnnotations = $should; + } + + public static function resetNewlineBetweenAnnotations(): void + { + static::$shouldAddNewLineBetweenAnnotations = true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php new file mode 100644 index 00000000..c412736a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php @@ -0,0 +1,398 @@ + $args + */ + public static function handleOverride(array $args, Codebase $codebase): void + { + if (count($args) < 2) { + return; + } + + $identifier = $args[0]->value; + + if (!$args[1]->value instanceof PhpParser\Node\Expr\FuncCall + || !$args[1]->value->name instanceof PhpParser\Node\Name + ) { + return; + } + + $map = []; + + if ($args[1]->value->name->parts === ['map'] + && $args[1]->value->getArgs() + && $args[1]->value->getArgs()[0]->value instanceof PhpParser\Node\Expr\Array_ + ) { + foreach ($args[1]->value->getArgs()[0]->value->items as $array_item) { + if ($array_item + && $array_item->key instanceof PhpParser\Node\Scalar\String_ + ) { + if ($array_item->value instanceof PhpParser\Node\Expr\ClassConstFetch + && $array_item->value->class instanceof PhpParser\Node\Name\FullyQualified + && $array_item->value->name instanceof PhpParser\Node\Identifier + && strtolower($array_item->value->name->name) + ) { + $map[$array_item->key->value] = new Union([ + new TNamedObject(implode('\\', $array_item->value->class->parts)) + ]); + } elseif ($array_item->value instanceof PhpParser\Node\Scalar\String_) { + $map[$array_item->key->value] = $array_item->value->value; + } + } + } + } + + $type_offset = null; + + if ($args[1]->value->name->parts === ['type'] + && $args[1]->value->getArgs() + && $args[1]->value->getArgs()[0]->value instanceof PhpParser\Node\Scalar\LNumber + ) { + $type_offset = $args[1]->value->getArgs()[0]->value->value; + } + + $element_type_offset = null; + + if ($args[1]->value->name->parts === ['elementType'] + && $args[1]->value->getArgs() + && $args[1]->value->getArgs()[0]->value instanceof PhpParser\Node\Scalar\LNumber + ) { + $element_type_offset = $args[1]->value->getArgs()[0]->value->value; + } + + if ($identifier instanceof PhpParser\Node\Expr\StaticCall + && $identifier->class instanceof PhpParser\Node\Name\FullyQualified + && $identifier->name instanceof PhpParser\Node\Identifier + && $identifier->getArgs() + && $identifier->getArgs()[0]->value instanceof PhpParser\Node\Scalar\LNumber + ) { + $meta_fq_classlike_name = implode('\\', $identifier->class->parts); + + $meta_method_name = strtolower($identifier->name->name); + + if ($map) { + $offset = $identifier->getArgs()[0]->value->value; + + $codebase->methods->return_type_provider->registerClosure( + $meta_fq_classlike_name, + /** + * @param list $call_args + */ + function ( + MethodReturnTypeProviderEvent $event + ) use ( + $map, + $offset, + $meta_fq_classlike_name, + $meta_method_name + ): ?Union { + $statements_analyzer = $event->getSource(); + $call_args = $event->getCallArgs(); + $method_name = $event->getMethodNameLowercase(); + $fq_classlike_name = $event->getFqClasslikeName(); + if (!$statements_analyzer instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + if ($meta_method_name !== $method_name + || $meta_fq_classlike_name !== $fq_classlike_name + ) { + return null; + } + + if (isset($call_args[$offset]->value) + && ($call_arg_type = $statements_analyzer->node_data->getType($call_args[$offset]->value)) + && $call_arg_type->isSingleStringLiteral() + ) { + $offset_arg_value = $call_arg_type->getSingleStringLiteral()->value; + + if ($mapped_type = $map[$offset_arg_value] ?? null) { + if ($mapped_type instanceof Union) { + return clone $mapped_type; + } + } + + if (($mapped_type = $map[''] ?? null) && is_string($mapped_type)) { + if (strpos($mapped_type, '@') !== false) { + $mapped_type = str_replace('@', $offset_arg_value, $mapped_type); + + if (strpos($mapped_type, '.') === false) { + return new Union([ + new TNamedObject($mapped_type) + ]); + } + } + } + } + + return null; + } + ); + } elseif ($type_offset !== null) { + $codebase->methods->return_type_provider->registerClosure( + $meta_fq_classlike_name, + /** + * @param list $call_args + */ + function ( + MethodReturnTypeProviderEvent $event + ) use ( + $type_offset, + $meta_fq_classlike_name, + $meta_method_name + ): ?Union { + $statements_analyzer = $event->getSource(); + $call_args = $event->getCallArgs(); + $method_name = $event->getMethodNameLowercase(); + $fq_classlike_name = $event->getFqClasslikeName(); + if (!$statements_analyzer instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + if ($meta_method_name !== $method_name + || $meta_fq_classlike_name !== $fq_classlike_name + ) { + return null; + } + + if (isset($call_args[$type_offset]->value) + && ($call_arg_type + = $statements_analyzer->node_data->getType($call_args[$type_offset]->value)) + ) { + return clone $call_arg_type; + } + + return null; + } + ); + } elseif ($element_type_offset !== null) { + $codebase->methods->return_type_provider->registerClosure( + $meta_fq_classlike_name, + /** + * @param list $call_args + */ + function ( + MethodReturnTypeProviderEvent $event + ) use ( + $element_type_offset, + $meta_fq_classlike_name, + $meta_method_name + ): ?Union { + $statements_analyzer = $event->getSource(); + $call_args = $event->getCallArgs(); + $method_name = $event->getMethodNameLowercase(); + $fq_classlike_name = $event->getFqClasslikeName(); + if (!$statements_analyzer instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + if ($meta_method_name !== $method_name + || $meta_fq_classlike_name !== $fq_classlike_name + ) { + return null; + } + + if (isset($call_args[$element_type_offset]->value) + && ($call_arg_type + = $statements_analyzer->node_data->getType($call_args[$element_type_offset]->value)) + && $call_arg_type->hasArray() + ) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TKeyedArray|TList + */ + $array_atomic_type = $call_arg_type->getAtomicTypes()['array']; + + if ($array_atomic_type instanceof TKeyedArray) { + return $array_atomic_type->getGenericValueType(); + } + + if ($array_atomic_type instanceof TList) { + return $array_atomic_type->type_param; + } + + return clone $array_atomic_type->type_params[1]; + } + + return null; + } + ); + } + } + + if ($identifier instanceof PhpParser\Node\Expr\FuncCall + && $identifier->name instanceof PhpParser\Node\Name\FullyQualified + && $identifier->getArgs() + && $identifier->getArgs()[0]->value instanceof PhpParser\Node\Scalar\LNumber + ) { + $function_id = strtolower(implode('\\', $identifier->name->parts)); + + if ($map) { + $offset = $identifier->getArgs()[0]->value->value; + + $codebase->functions->return_type_provider->registerClosure( + $function_id, + /** + * @param non-empty-string $function_id + * @param list $call_args + */ + function ( + FunctionReturnTypeProviderEvent $event + ) use ( + $map, + $offset + ): Union { + $statements_analyzer = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $function_id = $event->getFunctionId(); + if (!$statements_analyzer instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + if (isset($call_args[$offset]->value) + && ($call_arg_type + = $statements_analyzer->node_data->getType($call_args[$offset]->value)) + && $call_arg_type->isSingleStringLiteral() + ) { + $offset_arg_value = $call_arg_type->getSingleStringLiteral()->value; + + if ($mapped_type = $map[$offset_arg_value] ?? null) { + if ($mapped_type instanceof Union) { + return clone $mapped_type; + } + } + + if (($mapped_type = $map[''] ?? null) && is_string($mapped_type)) { + if (strpos($mapped_type, '@') !== false) { + $mapped_type = str_replace('@', $offset_arg_value, $mapped_type); + + if (strpos($mapped_type, '.') === false) { + return new Union([ + new TNamedObject($mapped_type) + ]); + } + } + } + } + + $storage = $statements_analyzer->getCodebase()->functions->getStorage( + $statements_analyzer, + strtolower($function_id) + ); + + return $storage->return_type ?: Type::getMixed(); + } + ); + } elseif ($type_offset !== null) { + $codebase->functions->return_type_provider->registerClosure( + $function_id, + /** + * @param non-empty-string $function_id + * @param list $call_args + */ + function ( + FunctionReturnTypeProviderEvent $event + ) use ( + $type_offset + ): Union { + $statements_analyzer = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $function_id = $event->getFunctionId(); + if (!$statements_analyzer instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + if (isset($call_args[$type_offset]->value) + && ($call_arg_type + = $statements_analyzer->node_data->getType($call_args[$type_offset]->value)) + ) { + return clone $call_arg_type; + } + + $storage = $statements_analyzer->getCodebase()->functions->getStorage( + $statements_analyzer, + strtolower($function_id) + ); + + return $storage->return_type ?: Type::getMixed(); + } + ); + } elseif ($element_type_offset !== null) { + $codebase->functions->return_type_provider->registerClosure( + $function_id, + /** + * @param non-empty-string $function_id + * @param list $call_args + */ + function ( + FunctionReturnTypeProviderEvent $event + ) use ( + $element_type_offset + ): Union { + $statements_analyzer = $event->getStatementsSource(); + $call_args = $event->getCallArgs(); + $function_id = $event->getFunctionId(); + if (!$statements_analyzer instanceof StatementsAnalyzer) { + return Type::getMixed(); + } + + if (isset($call_args[$element_type_offset]->value) + && ($call_arg_type + = $statements_analyzer->node_data->getType($call_args[$element_type_offset]->value)) + && $call_arg_type->hasArray() + ) { + /** + * @psalm-suppress PossiblyUndefinedStringArrayOffset + * @var TArray|TKeyedArray|TList + */ + $array_atomic_type = $call_arg_type->getAtomicTypes()['array']; + + if ($array_atomic_type instanceof TKeyedArray) { + return $array_atomic_type->getGenericValueType(); + } + + if ($array_atomic_type instanceof TList) { + return $array_atomic_type->type_param; + } + + return clone $array_atomic_type->type_params[1]; + } + + $storage = $statements_analyzer->getCodebase()->functions->getStorage( + $statements_analyzer, + strtolower($function_id) + ); + + return $storage->return_type ?: Type::getMixed(); + } + ); + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php new file mode 100644 index 00000000..fde62965 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php @@ -0,0 +1,23 @@ +array = $left; + $this->offset = $right; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php new file mode 100644 index 00000000..1a1ec7bd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php @@ -0,0 +1,19 @@ +array = $array; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php new file mode 100644 index 00000000..e42888f2 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php @@ -0,0 +1,20 @@ + */ + public $entries; + + /** @param list $entries */ + public function __construct(array $entries) + { + $this->entries = $entries; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php new file mode 100644 index 00000000..7f789b9f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php @@ -0,0 +1,23 @@ +fqcln = $fqcln; + $this->name = $name; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php new file mode 100644 index 00000000..a222fb03 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php @@ -0,0 +1,23 @@ +name = $name; + $this->is_fully_qualified = $is_fully_qualified; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php new file mode 100644 index 00000000..7ba4d8d3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php @@ -0,0 +1,23 @@ +key = $key; + $this->value = $value; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php new file mode 100644 index 00000000..6fa9727a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php @@ -0,0 +1,20 @@ +value = $value; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php new file mode 100644 index 00000000..90c2f9e9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php @@ -0,0 +1,10 @@ +left = $left; + $this->right = $right; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php new file mode 100644 index 00000000..c4fb77a3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php @@ -0,0 +1,10 @@ +cond = $cond; + $this->if = $if; + $this->else = $else; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php new file mode 100644 index 00000000..5f96f7d1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php @@ -0,0 +1,10 @@ + + */ + public $psalm_internal = []; + + /** + * Whether or not the property is readonly + * + * @var bool + */ + public $readonly = false; + + /** + * Whether or not to allow mutation by internal methods + * + * @var bool + */ + public $allow_private_mutation = false; + + /** + * @var list + */ + public $removed_taints = []; + + /** + * @var array + */ + public $suppressed_issues = []; + + /** + * @var ?string + */ + public $description; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php new file mode 100644 index 00000000..a7ce48ed --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php @@ -0,0 +1,32 @@ +|null + */ + public $break_vars; + + public function __construct(Context $parent_context) + { + $this->parent_context = $parent_context; + } + + public function __destruct() + { + unset($this->parent_context); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php new file mode 100644 index 00000000..0343f193 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php @@ -0,0 +1,24 @@ + + */ + public $vars_in_scope = []; + + /** + * @param array $vars_in_scope + */ + public function __construct(array $vars_in_scope) + { + $this->vars_in_scope = $vars_in_scope; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php new file mode 100644 index 00000000..1f98135a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php @@ -0,0 +1,50 @@ + + */ + public $cond_referenced_var_ids; + + /** + * @var array + */ + public $assigned_in_conditional_var_ids; + + /** @var list */ + public $entry_clauses; + + /** + * @param array $cond_referenced_var_ids + * @param array $assigned_in_conditional_var_ids + * @param list $entry_clauses + */ + public function __construct( + Context $if_context, + Context $post_if_context, + array $cond_referenced_var_ids, + array $assigned_in_conditional_var_ids, + array $entry_clauses + ) { + $this->if_context = $if_context; + $this->post_if_context = $post_if_context; + $this->cond_referenced_var_ids = $cond_referenced_var_ids; + $this->assigned_in_conditional_var_ids = $assigned_in_conditional_var_ids; + $this->entry_clauses = $entry_clauses; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php new file mode 100644 index 00000000..314d93f8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php @@ -0,0 +1,87 @@ +|null + */ + public $new_vars; + + /** + * @var array + */ + public $new_vars_possibly_in_scope = []; + + /** + * @var array|null + */ + public $redefined_vars; + + /** + * @var array|null + */ + public $assigned_var_ids; + + /** + * @var array + */ + public $possibly_assigned_var_ids = []; + + /** + * @var array + */ + public $possibly_redefined_vars = []; + + /** + * @var array + */ + public $updated_vars = []; + + /** + * @var array>> + */ + public $negated_types = []; + + /** + * @var array + */ + public $if_cond_changed_var_ids = []; + + /** + * @var array|null + */ + public $negatable_if_types; + + /** + * @var list + */ + public $negated_clauses = []; + + /** + * These are the set of clauses that could be applied after the `if` + * statement, if the `if` statement contains branches with leaving statements, + * and the else leaves too + * + * @var list + */ + public $reasonable_clauses = []; + + /** + * @var string[] + */ + public $final_actions = []; + + /** + * @var ?Context + */ + public $post_leaving_if_context; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php new file mode 100644 index 00000000..4bbb2089 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php @@ -0,0 +1,74 @@ +|null + */ + public $redefined_loop_vars = []; + + /** + * @var array + */ + public $possibly_redefined_loop_vars = []; + + /** + * @var array|null + */ + public $possibly_redefined_loop_parent_vars; + + /** + * @var array + */ + public $possibly_defined_loop_parent_vars = []; + + /** + * @var array + */ + public $vars_possibly_in_scope = []; + + /** + * @var array + */ + public $protected_var_ids = []; + + /** + * @var string[] + */ + public $final_actions = []; + + public function __construct(Context $loop_context, Context $parent_context) + { + $this->loop_context = $loop_context; + $this->loop_parent_context = $parent_context; + } + + public function __destruct() + { + unset($this->loop_context); + unset($this->loop_parent_context); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php new file mode 100644 index 00000000..35bb99ca --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php @@ -0,0 +1,53 @@ +|null + */ + public $new_vars_in_scope; + + /** + * @var array + */ + public $new_vars_possibly_in_scope = []; + + /** + * @var array|null + */ + public $redefined_vars; + + /** + * @var array|null + */ + public $possibly_redefined_vars; + + /** + * @var array + */ + public $leftover_statements = []; + + /** + * @var PhpParser\Node\Expr|null + */ + public $leftover_case_equality_expr; + + /** + * @var list + */ + public $negated_clauses = []; + + /** + * @var array|null + */ + public $new_assigned_var_ids; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php new file mode 100644 index 00000000..6bc81302 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php @@ -0,0 +1,314 @@ + array_merge( + self::getConstantNodes($codebase, $storage), + self::getPropertyNodes($storage), + self::getMethodNodes($storage) + ) + ]; + + $docblock = new ParsedDocblock('', []); + + $template_offset = 0; + + foreach ($storage->template_types ?: [] as $template_name => $map) { + $type = array_values($map)[0]; + + $key = isset($storage->template_covariants[$template_offset]) ? 'template-covariant' : 'template'; + + $docblock->tags[$key][] = $template_name . ' as ' . $type->toNamespacedString( + null, + [], + null, + false + ); + + $template_offset++; + } + + $attrs = [ + 'comments' => $docblock->tags + ? [ + new PhpParser\Comment\Doc( + rtrim($docblock->render(' ')) + ) + ] + : [] + ]; + + if ($storage->is_interface) { + if ($storage->direct_interface_parents) { + $subnodes['extends'] = []; + + foreach ($storage->direct_interface_parents as $direct_interface_parent) { + $subnodes['extends'][] = new VirtualFullyQualified($direct_interface_parent); + } + } + + return new VirtualInterface( + $classlike_name, + $subnodes, + $attrs + ); + } + + if ($storage->is_trait) { + return new VirtualTrait( + $classlike_name, + $subnodes, + $attrs + ); + } + + if ($storage->parent_class) { + $subnodes['extends'] = new VirtualFullyQualified($storage->parent_class); + } else + + if ($storage->direct_class_interfaces) { + $subnodes['implements'] = []; + foreach ($storage->direct_class_interfaces as $direct_class_interface) { + $subnodes['implements'][] = new VirtualFullyQualified($direct_class_interface); + } + } + + return new VirtualClass( + $classlike_name, + $subnodes, + $attrs + ); + } + + /** + * @return list + */ + private static function getConstantNodes(Codebase $codebase, ClassLikeStorage $storage): array + { + $constant_nodes = []; + + foreach ($storage->constants as $constant_name => $constant_storage) { + if ($constant_storage->unresolved_node) { + $type = new Union([ + ConstantTypeResolver::resolve( + $codebase->classlikes, + $constant_storage->unresolved_node + ) + ]); + } elseif ($constant_storage->type) { + $type = $constant_storage->type; + } else { + throw new UnexpectedValueException('bad'); + } + + $constant_nodes[] = new VirtualClassConst( + [ + new VirtualConst( + $constant_name, + StubsGenerator::getExpressionFromType($type) + ) + ], + $constant_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC + ? PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC + : ($constant_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PROTECTED + ? PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED + : PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE) + ); + } + + return $constant_nodes; + } + + /** + * @return list + */ + private static function getPropertyNodes(ClassLikeStorage $storage): array + { + $namespace_name = implode('\\', array_slice(explode('\\', $storage->name), 0, -1)); + + $property_nodes = []; + + foreach ($storage->properties as $property_name => $property_storage) { + switch ($property_storage->visibility) { + case ClassLikeAnalyzer::VISIBILITY_PRIVATE: + $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE; + break; + case ClassLikeAnalyzer::VISIBILITY_PROTECTED: + $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED; + break; + default: + $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC; + break; + } + + $docblock = new ParsedDocblock('', []); + + if ($property_storage->type + && $property_storage->signature_type !== $property_storage->type + ) { + $docblock->tags['var'][] = $property_storage->type->toNamespacedString( + $namespace_name, + [], + null, + false + ); + } + + $property_nodes[] = new VirtualProperty( + $flag | ($property_storage->is_static ? PhpParser\Node\Stmt\Class_::MODIFIER_STATIC : 0), + [ + new VirtualPropertyProperty( + $property_name, + $property_storage->suggested_type + ? StubsGenerator::getExpressionFromType($property_storage->suggested_type) + : null + ) + ], + [ + 'comments' => $docblock->tags + ? [ + new PhpParser\Comment\Doc( + rtrim($docblock->render(' ')) + ) + ] + : [] + ], + $property_storage->signature_type + ? StubsGenerator::getParserTypeFromPsalmType($property_storage->signature_type) + : null + ); + } + + return $property_nodes; + } + + /** + * @return list + */ + private static function getMethodNodes(ClassLikeStorage $storage): array { + $namespace_name = implode('\\', array_slice(explode('\\', $storage->name), 0, -1)); + $method_nodes = []; + + foreach ($storage->methods as $method_storage) { + if (!$method_storage->cased_name) { + throw new UnexpectedValueException('very bad'); + } + + switch ($method_storage->visibility) { + case ReflectionProperty::IS_PRIVATE: + $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE; + break; + case ReflectionProperty::IS_PROTECTED: + $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED; + break; + default: + $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC; + break; + } + + $docblock = new ParsedDocblock('', []); + + foreach ($method_storage->template_types ?: [] as $template_name => $map) { + $type = array_values($map)[0]; + + $docblock->tags['template'][] = $template_name . ' as ' . $type->toNamespacedString( + $namespace_name, + [], + null, + false + ); + } + + foreach ($method_storage->params as $param) { + if ($param->type && $param->type !== $param->signature_type) { + $docblock->tags['param'][] = $param->type->toNamespacedString( + $namespace_name, + [], + null, + false + ) . ' $' . $param->name; + } + } + + if ($method_storage->return_type + && $method_storage->signature_return_type !== $method_storage->return_type + ) { + $docblock->tags['return'][] = $method_storage->return_type->toNamespacedString( + $namespace_name, + [], + null, + false + ); + } + + foreach ($method_storage->throws ?: [] as $exception_name => $_) { + $docblock->tags['throws'][] = Type::getStringFromFQCLN( + $exception_name, + $namespace_name, + [], + null, + false + ); + } + + $method_nodes[] = new VirtualClassMethod( + $method_storage->cased_name, + [ + 'flags' => $flag + | ($method_storage->is_static ? PhpParser\Node\Stmt\Class_::MODIFIER_STATIC : 0) + | ($method_storage->abstract ? PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT : 0), + 'params' => StubsGenerator::getFunctionParamNodes($method_storage), + 'returnType' => $method_storage->signature_return_type + ? StubsGenerator::getParserTypeFromPsalmType($method_storage->signature_return_type) + : null, + 'stmts' => $storage->is_interface || $method_storage->abstract ? null : [], + ], + [ + 'comments' => $docblock->tags + ? [ + new PhpParser\Comment\Doc( + rtrim($docblock->render(' ')) + ) + ] + : [] + ] + ); + } + + return $method_nodes; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php new file mode 100644 index 00000000..23b1ca16 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php @@ -0,0 +1,480 @@ +getAll() as $storage) { + if (strpos($storage->name, 'Psalm\\') === 0) { + continue; + } + + if ($storage->location + && strpos($storage->location->file_path, $psalm_base) === 0 + ) { + continue; + } + + if ($storage->stubbed) { + continue; + } + + $name_parts = explode('\\', $storage->name); + + $classlike_name = array_pop($name_parts); + $namespace_name = implode('\\', $name_parts); + + if (!isset($namespaced_nodes[$namespace_name])) { + $namespaced_nodes[$namespace_name] = []; + } + + $namespaced_nodes[$namespace_name][$classlike_name] = ClassLikeStubGenerator::getClassLikeNode( + $codebase, + $storage, + $classlike_name + ); + } + + $all_function_names = []; + + foreach ($codebase->functions->getAllStubbedFunctions() as $function_storage) { + if ($function_storage->location + && strpos($function_storage->location->file_path, $psalm_base) === 0 + ) { + continue; + } + + if (!$function_storage->cased_name) { + throw new UnexpectedValueException('very bad'); + } + + $fq_name = $function_storage->cased_name; + + $all_function_names[$fq_name] = true; + + $name_parts = explode('\\', $fq_name); + $function_name = array_pop($name_parts); + + $namespace_name = implode('\\', $name_parts); + + $namespaced_nodes[$namespace_name][$fq_name] = self::getFunctionNode( + $function_storage, + $function_name, + $namespace_name + ); + } + + foreach ($codebase->getAllStubbedConstants() as $fq_name => $type) { + if ($type->isMixed()) { + continue; + } + + $name_parts = explode('\\', $fq_name); + $constant_name = array_pop($name_parts); + + $namespace_name = implode('\\', $name_parts); + + $namespaced_nodes[$namespace_name][$fq_name] = new StmtVirtualConst_( + [ + new VirtualConst( + $constant_name, + self::getExpressionFromType($type) + ) + ] + ); + } + + foreach ($file_provider->getAll() as $file_storage) { + if (strpos($file_storage->file_path, $psalm_base) === 0) { + continue; + } + + foreach ($file_storage->functions as $function_storage) { + if (!$function_storage->cased_name) { + continue; + } + + $fq_name = $function_storage->cased_name; + + if (isset($all_function_names[$fq_name])) { + continue; + } + + $all_function_names[$fq_name] = true; + + $name_parts = explode('\\', $fq_name); + $function_name = array_pop($name_parts); + + $namespace_name = implode('\\', $name_parts); + + $namespaced_nodes[$namespace_name][$fq_name] = self::getFunctionNode( + $function_storage, + $function_name, + $namespace_name + ); + } + + foreach ($file_storage->constants as $fq_name => $type) { + if ($type->isMixed()) { + continue; + } + + if ($type->isMixed()) { + continue; + } + + $name_parts = explode('\\', $fq_name); + $constant_name = array_pop($name_parts); + + $namespace_name = implode('\\', $name_parts); + + $namespaced_nodes[$namespace_name][$fq_name] = new StmtVirtualConst_( + [ + new VirtualConst( + $constant_name, + self::getExpressionFromType($type) + ) + ] + ); + } + } + + ksort($namespaced_nodes); + + $namespace_stmts = []; + + foreach ($namespaced_nodes as $namespace_name => $stmts) { + ksort($stmts); + + $namespace_stmts[] = new VirtualNamespace( + $namespace_name ? new VirtualName($namespace_name) : null, + array_values($stmts), + ['kind' => PhpParser\Node\Stmt\Namespace_::KIND_BRACED] + ); + } + + $prettyPrinter = new PhpParser\PrettyPrinter\Standard; + return $prettyPrinter->prettyPrintFile($namespace_stmts); + } + + private static function getFunctionNode( + FunctionLikeStorage $function_storage, + string $function_name, + string $namespace_name + ) : PhpParser\Node\Stmt\Function_ { + $docblock = new ParsedDocblock('', []); + + foreach ($function_storage->template_types ?: [] as $template_name => $map) { + $type = array_values($map)[0]; + + $docblock->tags['template'][] = $template_name . ' as ' . $type->toNamespacedString( + $namespace_name, + [], + null, + false + ); + } + + foreach ($function_storage->params as $param) { + if ($param->type && $param->type !== $param->signature_type) { + $docblock->tags['param'][] = $param->type->toNamespacedString( + $namespace_name, + [], + null, + false + ) . ' $' . $param->name; + } + } + + if ($function_storage->return_type + && $function_storage->signature_return_type !== $function_storage->return_type + ) { + $docblock->tags['return'][] = $function_storage->return_type->toNamespacedString( + $namespace_name, + [], + null, + false + ); + } + + foreach ($function_storage->throws ?: [] as $exception_name => $_) { + $docblock->tags['throws'][] = Type::getStringFromFQCLN( + $exception_name, + $namespace_name, + [], + null, + false + ); + } + + return new VirtualFunction( + $function_name, + [ + 'params' => self::getFunctionParamNodes($function_storage), + 'returnType' => $function_storage->signature_return_type + ? self::getParserTypeFromPsalmType($function_storage->signature_return_type) + : null, + 'stmts' => [], + ], + [ + 'comments' => $docblock->tags + ? [ + new PhpParser\Comment\Doc( + rtrim($docblock->render(' ')) + ) + ] + : [] + ] + ); + } + + /** + * @return list + */ + public static function getFunctionParamNodes(FunctionLikeStorage $method_storage): array + { + $param_nodes = []; + + foreach ($method_storage->params as $param) { + $param_nodes[] = new VirtualParam( + new VirtualVariable($param->name), + $param->default_type instanceof Union + ? self::getExpressionFromType($param->default_type) + : null, + $param->signature_type + ? self::getParserTypeFromPsalmType($param->signature_type) + : null, + $param->by_ref, + $param->is_variadic + ); + } + + return $param_nodes; + } + + /** + * @return PhpParser\Node\Identifier|PhpParser\Node\Name\FullyQualified|PhpParser\Node\NullableType|null + */ + public static function getParserTypeFromPsalmType(Union $type): ?PhpParser\NodeAbstract + { + $nullable = $type->isNullable(); + + foreach ($type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TNull) { + continue; + } + + if ($atomic_type instanceof Scalar + || $atomic_type instanceof TObject + || $atomic_type instanceof TArray + || $atomic_type instanceof TIterable + ) { + $identifier_string = $atomic_type->toPhpString(null, [], null, 8, 0); + + if ($identifier_string === null) { + throw new UnexpectedValueException( + $atomic_type->getId() . ' could not be converted to an identifier' + ); + } + $identifier = new VirtualIdentifier($identifier_string); + + if ($nullable) { + return new VirtualNullableType($identifier); + } + + return $identifier; + } + + if ($atomic_type instanceof TNamedObject) { + $name_node = new VirtualFullyQualified($atomic_type->value); + + if ($nullable) { + return new VirtualNullableType($name_node); + } + + return $name_node; + } + } + + return null; + } + + public static function getExpressionFromType(Union $type) : PhpParser\Node\Expr + { + foreach ($type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TLiteralClassString) { + return new VirtualClassConstFetch(new VirtualName('\\' . $atomic_type->value), new VirtualIdentifier('class')); + } + + if ($atomic_type instanceof TLiteralString) { + return new VirtualString($atomic_type->value); + } + + if ($atomic_type instanceof TLiteralInt) { + return new VirtualLNumber($atomic_type->value); + } + + if ($atomic_type instanceof TLiteralFloat) { + return new VirtualDNumber($atomic_type->value); + } + + if ($atomic_type instanceof TFalse) { + return new VirtualConstFetch(new VirtualName('false')); + } + + if ($atomic_type instanceof TTrue) { + return new VirtualConstFetch(new VirtualName('true')); + } + + if ($atomic_type instanceof TNull) { + return new VirtualConstFetch(new VirtualName('null')); + } + + if ($atomic_type instanceof TArray) { + return new VirtualArray([]); + } + + if ($atomic_type instanceof TKeyedArray) { + $new_items = []; + + foreach ($atomic_type->properties as $property_name => $property_type) { + if ($atomic_type->is_list) { + $key_type = null; + } elseif (is_int($property_name)) { + $key_type = new VirtualLNumber($property_name); + } else { + $key_type = new VirtualString($property_name); + } + + $new_items[] = new VirtualArrayItem( + self::getExpressionFromType($property_type), + $key_type + ); + } + + return new VirtualArray($new_items); + } + + if ($atomic_type instanceof TEnumCase) { + return new VirtualClassConstFetch(new VirtualName('\\' . $atomic_type->value), new VirtualIdentifier($atomic_type->case_name)); + } + } + + return new VirtualString('Psalm could not infer this type'); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php new file mode 100644 index 00000000..00238803 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php @@ -0,0 +1,63 @@ +key = $key; + $this->value = $value; + $this->is_list = $is_list; + } + + public static function infer(Atomic $type): ?self + { + if ($type instanceof TKeyedArray) { + return new self( + $type->getGenericKeyType(), + $type->getGenericValueType(), + $type->is_list + ); + } + + if ($type instanceof TList) { + return new self( + Type::getInt(), + $type->type_param, + true + ); + } + + if ($type instanceof TArray) { + return new self( + $type->type_params[0], + $type->type_params[1], + false + ); + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php new file mode 100644 index 00000000..d1611acc --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php @@ -0,0 +1,1816 @@ + null, + * - empty(bool) => false, + * - notEmpty(Object|null) => Object, + * - notEmpty(Object|false) => Object + * + * @param string[] $suppressed_issues + * @param array> $template_type_map + * @param-out Reconciler::RECONCILIATION_* $failed_reconciliation + */ + public static function reconcile( + string $assertion, + ?Union $existing_var_type, + ?string $key, + StatementsAnalyzer $statements_analyzer, + bool $inside_loop, + array $template_type_map, + ?CodeLocation $code_location = null, + array $suppressed_issues = [], + ?int &$failed_reconciliation = Reconciler::RECONCILIATION_OK, + bool $negated = false + ): Union { + $codebase = $statements_analyzer->getCodebase(); + + $is_strict_equality = false; + $is_loose_equality = false; + $is_equality = false; + $is_negation = false; + $failed_reconciliation = Reconciler::RECONCILIATION_OK; + + if ($assertion[0] === '!') { + $assertion = substr($assertion, 1); + $is_negation = true; + } + + if ($assertion[0] === '=') { + $assertion = substr($assertion, 1); + $is_strict_equality = true; + $is_equality = true; + } + + if ($assertion[0] === '~') { + $assertion = substr($assertion, 1); + $is_loose_equality = true; + $is_equality = true; + } + + $original_assertion = $assertion; + + if ($assertion[0] === '@') { + $assertion = 'falsy'; + $is_negation = true; + } + + if ($existing_var_type === null + && is_string($key) + && VariableFetchAnalyzer::isSuperGlobal($key) + ) { + $existing_var_type = VariableFetchAnalyzer::getGlobalType($key); + } + + if ($existing_var_type === null) { + return self::getMissingType( + $assertion, + $is_negation, + $inside_loop, + $is_equality, + $template_type_map + ); + } + + $old_var_type_string = $existing_var_type->getId(); + + if ($is_negation) { + return NegatedAssertionReconciler::reconcile( + $statements_analyzer, + $assertion, + $is_strict_equality, + $is_loose_equality, + $existing_var_type, + $template_type_map, + $old_var_type_string, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $inside_loop + ); + } + + $simply_reconciled_type = SimpleAssertionReconciler::reconcile( + $assertion, + $codebase, + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + $is_strict_equality, + $inside_loop + ); + + if ($simply_reconciled_type) { + return $simply_reconciled_type; + } + + if (strpos($assertion, 'isa-') === 0) { + $should_return = false; + + $new_type = self::handleIsA( + $codebase, + $existing_var_type, + $assertion, + $template_type_map, + $code_location, + $key, + $suppressed_issues, + $should_return + ); + + if ($should_return) { + return $new_type; + } + } elseif (strpos($assertion, 'getclass-') === 0) { + $assertion = substr($assertion, 9); + $new_type = Type::parseString($assertion, null, $template_type_map); + } else { + $bracket_pos = strpos($assertion, '('); + + if ($bracket_pos) { + return self::handleLiteralEquality( + $statements_analyzer, + $assertion, + $bracket_pos, + $is_loose_equality, + $existing_var_type, + $old_var_type_string, + $key, + $negated, + $code_location, + $suppressed_issues + ); + } + + if ($assertion === 'loaded-class-string') { + $assertion = 'class-string'; + } + + try { + $new_type = Type::parseString($assertion, null, $template_type_map); + } catch (TypeParseTreeException $e) { + $new_type = Type::getMixed(); + } + } + + if ($existing_var_type->hasMixed()) { + if ($is_loose_equality + && $new_type->hasScalarType() + ) { + return $existing_var_type; + } + + return $new_type; + } + + $refined_type = self::refine( + $statements_analyzer, + $assertion, + $original_assertion, + $new_type, + $existing_var_type, + $template_type_map, + $key, + $negated, + $code_location, + $is_equality, + $is_loose_equality, + $suppressed_issues, + $failed_reconciliation + ); + + return TypeExpander::expandUnion( + $codebase, + $refined_type, + null, + null, + null, + true, + false, + false, + true + ); + } + + /** + * @param array> $template_type_map + */ + private static function getMissingType( + string $assertion, + bool $is_negation, + bool $inside_loop, + bool $is_equality, + array $template_type_map + ): Union { + if (($assertion === 'isset' && !$is_negation) + || ($assertion === 'empty' && $is_negation) + ) { + return Type::getMixed($inside_loop); + } + + if ($assertion === 'array-key-exists' + || $assertion === 'non-empty-countable' + || strpos($assertion, 'has-at-least-') === 0 + || strpos($assertion, 'has-exactly-') === 0 + ) { + return Type::getMixed(); + } + + if (!$is_negation && $assertion !== 'falsy' && $assertion !== 'empty') { + if ($is_equality) { + $bracket_pos = strpos($assertion, '('); + + if ($bracket_pos) { + $assertion = substr($assertion, 0, $bracket_pos); + } + } + + try { + return Type::parseString($assertion, null, $template_type_map); + } catch (Exception $e) { + return Type::getMixed(); + } + } + + return Type::getMixed(); + } + + /** + * This method is called when SimpleAssertionReconciler was not enough. It receives the existing type, the assertion + * and also a new type created from the assertion string. + * + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + * @param string[] $suppressed_issues + * @param array> $template_type_map + * @param-out Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function refine( + StatementsAnalyzer $statements_analyzer, + string $assertion, + string $original_assertion, + Union $new_type, + Union $existing_var_type, + array $template_type_map, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + bool $is_equality, + bool $is_loose_equality, + array $suppressed_issues, + int &$failed_reconciliation + ): Union { + $codebase = $statements_analyzer->getCodebase(); + + $old_var_type_string = $existing_var_type->getId(); + + $new_type_has_interface = false; + + if ($new_type->hasObjectType()) { + foreach ($new_type->getAtomicTypes() as $new_type_part) { + if ($new_type_part instanceof TNamedObject && + $codebase->interfaceExists($new_type_part->value) + ) { + $new_type_has_interface = true; + break; + } + } + } + + $old_type_has_interface = false; + + if ($existing_var_type->hasObjectType()) { + foreach ($existing_var_type->getAtomicTypes() as $existing_type_part) { + if ($existing_type_part instanceof TNamedObject && + $codebase->interfaceExists($existing_type_part->value) + ) { + $old_type_has_interface = true; + break; + } + } + } + + try { + if (strpos($assertion, '<') || strpos($assertion, '[') || strpos($assertion, '{')) { + $new_type_union = Type::parseString($assertion); + + $new_type_part = $new_type_union->getSingleAtomic(); + } else { + $new_type_part = Atomic::create($assertion, null, $template_type_map); + } + } catch (TypeParseTreeException $e) { + $new_type_part = new TMixed(); + + if ($code_location) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $assertion . ' cannot be used in an assertion', + $code_location + ), + $suppressed_issues + ); + } + } + + if ($new_type_part instanceof TTemplateParam + && $new_type_part->as->isSingle() + ) { + $new_as_atomic = $new_type_part->as->getSingleAtomic(); + + $acceptable_atomic_types = []; + + foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_part) { + if ($existing_var_type_part instanceof TNamedObject + || $existing_var_type_part instanceof TTemplateParam + ) { + $new_type_part->addIntersectionType($existing_var_type_part); + $acceptable_atomic_types[] = clone $existing_var_type_part; + } else { + if (AtomicTypeComparator::isContainedBy( + $codebase, + $existing_var_type_part, + $new_as_atomic + )) { + $acceptable_atomic_types[] = clone $existing_var_type_part; + } + } + } + + if ($acceptable_atomic_types) { + $new_type_part->as = new Union($acceptable_atomic_types); + + return new Union([$new_type_part]); + } + } + + if ($new_type_part instanceof TKeyedArray) { + $acceptable_atomic_types = []; + + foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_part) { + if ($existing_var_type_part instanceof TKeyedArray) { + if (!array_intersect_key( + $existing_var_type_part->properties, + $new_type_part->properties + )) { + $existing_var_type_part = clone $existing_var_type_part; + $existing_var_type_part->properties = array_merge( + $existing_var_type_part->properties, + $new_type_part->properties + ); + + $acceptable_atomic_types[] = $existing_var_type_part; + } + } + } + + if ($acceptable_atomic_types) { + return new Union($acceptable_atomic_types); + } + } + + if ($new_type_part instanceof TNamedObject + && ($new_type_has_interface || $old_type_has_interface) + && !UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $new_type, + $existing_var_type, + false + ) + ) { + $acceptable_atomic_types = []; + + foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_part) { + if (AtomicTypeComparator::isContainedBy( + $codebase, + $existing_var_type_part, + $new_type_part + )) { + $acceptable_atomic_types[] = clone $existing_var_type_part; + continue; + } + + if ($existing_var_type_part instanceof TNamedObject + && ($codebase->classExists($existing_var_type_part->value) + || $codebase->interfaceExists($existing_var_type_part->value)) + ) { + $existing_var_type_part = clone $existing_var_type_part; + $existing_var_type_part->addIntersectionType($new_type_part); + $acceptable_atomic_types[] = $existing_var_type_part; + } + + if ($existing_var_type_part instanceof TTemplateParam) { + $existing_var_type_part = clone $existing_var_type_part; + $existing_var_type_part->addIntersectionType($new_type_part); + $acceptable_atomic_types[] = $existing_var_type_part; + } + } + + if ($acceptable_atomic_types) { + return new Union($acceptable_atomic_types); + } + } elseif (!$new_type->hasMixed()) { + $has_match = true; + + if ($key + && $code_location + && $new_type->getId() === $existing_var_type->getId() + //even if two objects are the same, equality is not guaranteed + // example: (ErrorException and TypeError are both Throwable but not equal) + && !$new_type->hasNamedObjectType() + && !$is_equality + && !($original_assertion === 'loaded-class-string' && $old_var_type_string === 'class-string') + && (!($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer) + || ($key !== '$this' + && !($existing_var_type->hasLiteralClassString() && $new_type->hasLiteralClassString()))) + ) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + $original_assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + + $any_scalar_type_match_found = false; + + if ($code_location + && $key + && !$is_equality + && $new_type_part instanceof TNamedObject + && !$new_type_has_interface + && (!($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer) + || ($key !== '$this' + && !($existing_var_type->hasLiteralClassString() && $new_type->hasLiteralClassString()))) + && UnionTypeComparator::isContainedBy( + $codebase, + $existing_var_type, + $new_type, + false, + false, + null, + false, + false + ) + ) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + $original_assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + + $new_type = self::filterTypeWithAnother( + $codebase, + $existing_var_type, + $new_type, + $template_type_map, + $has_match, + $any_scalar_type_match_found + ); + + if ($code_location + && !$has_match + && (!$is_loose_equality || !$any_scalar_type_match_found) + ) { + if ($assertion === 'null') { + if ($existing_var_type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + 'Cannot resolve types for ' . $key . ' - docblock-defined type ' + . $existing_var_type . ' does not contain null', + $code_location, + $existing_var_type->getId() . ' null' + ), + $suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainNull( + 'Cannot resolve types for ' . $key . ' - ' . $existing_var_type + . ' does not contain null', + $code_location, + $existing_var_type->getId() + ), + $suppressed_issues + ); + } + } elseif (!($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer) + || ($key !== '$this' + && !($existing_var_type->hasLiteralClassString() && $new_type->hasLiteralClassString())) + ) { + if ($existing_var_type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + 'Cannot resolve types for ' . $key . ' - docblock-defined type ' + . $existing_var_type->getId() . ' does not contain ' . $new_type->getId(), + $code_location, + $existing_var_type->getId() . ' ' . $new_type->getId() + ), + $suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + 'Cannot resolve types for ' . $key . ' - ' . $existing_var_type->getId() + . ' does not contain ' . $new_type->getId(), + $code_location, + $existing_var_type->getId() . ' ' . $new_type->getId() + ), + $suppressed_issues + ); + } + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + } + } + + return $new_type; + } + + /** + * This method receives two types. The goal is to use datas in the new type to reduce the existing_type to a more + * precise version. For example: new is `array` old is `list` so the result is `list` + * + * @param array> $template_type_map + * + * @psalm-suppress ComplexMethod we'd probably want to extract specific handling blocks at the end and also allow + * early return once a specific case has been handled + */ + private static function filterTypeWithAnother( + Codebase $codebase, + Union $existing_type, + Union $new_type, + array $template_type_map, + bool &$has_match = false, + bool &$any_scalar_type_match_found = false + ): Union { + $matching_atomic_types = []; + + $has_cloned_type = false; + + foreach ($new_type->getAtomicTypes() as $new_type_part) { + $has_local_match = false; + + foreach ($existing_type->getAtomicTypes() as $key => $existing_type_part) { + // special workaround because PHP allows floats to contain ints, but we don’t want this + // behaviour here + if ($existing_type_part instanceof TFloat + && $new_type_part instanceof TInt + ) { + $any_scalar_type_match_found = true; + continue; + } + + $atomic_comparison_results = new TypeComparisonResult(); + + if ($existing_type_part instanceof TNamedObject) { + $existing_type_part->was_static = false; + } + + $atomic_contained_by = AtomicTypeComparator::isContainedBy( + $codebase, + $new_type_part, + $existing_type_part, + true, + false, + $atomic_comparison_results + ); + + if ($atomic_contained_by) { + $has_local_match = true; + + if ($atomic_comparison_results->type_coerced + && get_class($new_type_part) === TNamedObject::class + && $existing_type_part instanceof TGenericObject + ) { + // this is a hack - it's not actually rigorous, as the params may be different + $matching_atomic_types[] = new TGenericObject( + $new_type_part->value, + $existing_type_part->type_params + ); + } elseif ($new_type_part instanceof TNamedObject + && $existing_type_part instanceof TTemplateParam + && $existing_type_part->as->hasObjectType() + ) { + $existing_type_part = clone $existing_type_part; + $existing_type_part->as = self::filterTypeWithAnother( + $codebase, + $existing_type_part->as, + new Union([$new_type_part]), + $template_type_map + ); + + $matching_atomic_types[] = $existing_type_part; + } else { + $matching_atomic_types[] = clone $new_type_part; + } + + continue; + } + + if (AtomicTypeComparator::isContainedBy( + $codebase, + $existing_type_part, + $new_type_part, + false, + false, + null + )) { + $has_local_match = true; + $matching_atomic_types[] = $existing_type_part; + + continue; + } + + if ($existing_type_part instanceof TNamedObject + && $new_type_part instanceof TNamedObject + && ($codebase->interfaceExists($existing_type_part->value) + || $codebase->interfaceExists($new_type_part->value)) + ) { + $matching_atomic_type = clone $new_type_part; + $matching_atomic_type->extra_types[$existing_type_part->getKey()] = $existing_type_part; + $matching_atomic_types[] = $matching_atomic_type; + $has_local_match = true; + + continue; + } + + if ($new_type_part instanceof TKeyedArray + && $existing_type_part instanceof TList + ) { + $new_type_key = $new_type_part->getGenericKeyType(); + $new_type_value = $new_type_part->getGenericValueType(); + + if (!$new_type_key->hasString()) { + $has_param_match = false; + + $new_type_value = self::filterTypeWithAnother( + $codebase, + $existing_type_part->type_param, + $new_type_value, + $template_type_map, + $has_param_match, + $any_scalar_type_match_found + ); + + $hybrid_type_part = new TKeyedArray($new_type_part->properties); + $hybrid_type_part->previous_key_type = Type::getInt(); + $hybrid_type_part->previous_value_type = $new_type_value; + $hybrid_type_part->is_list = true; + + if (!$has_cloned_type) { + $new_type = clone $new_type; + $has_cloned_type = true; + } + + $has_local_match = true; + + $new_type->removeType($key); + $new_type->addType($hybrid_type_part); + + continue; + } + } + + if ($new_type_part instanceof TTemplateParam + && $existing_type_part instanceof TTemplateParam + && $new_type_part->param_name !== $existing_type_part->param_name + && $new_type_part->as->hasObject() + && $existing_type_part->as->hasObject() + ) { + $matching_atomic_type = clone $new_type_part; + + $matching_atomic_type->extra_types[$existing_type_part->getKey()] = $existing_type_part; + $matching_atomic_types[] = $matching_atomic_type; + $has_local_match = true; + + continue; + } + + //we filter both types of standard iterables + if (($new_type_part instanceof TGenericObject + || $new_type_part instanceof TArray + || $new_type_part instanceof TIterable) + && ($existing_type_part instanceof TGenericObject + || $existing_type_part instanceof TArray + || $existing_type_part instanceof TIterable) + && count($new_type_part->type_params) === count($existing_type_part->type_params) + ) { + $has_any_param_match = false; + + foreach ($new_type_part->type_params as $i => $new_param) { + $existing_param = $existing_type_part->type_params[$i]; + + $has_param_match = true; + + $new_param_id = $new_param->getId(); + + $new_param = self::filterTypeWithAnother( + $codebase, + $existing_param, + $new_param, + $template_type_map, + $has_param_match, + $any_scalar_type_match_found + ); + + if ($template_type_map) { + TemplateInferredTypeReplacer::replace( + $new_param, + new TemplateResult([], $template_type_map), + $codebase + ); + } + + $existing_type->bustCache(); + + if ($has_param_match + && $existing_type_part->type_params[$i]->getId() !== $new_param_id + ) { + /** @psalm-suppress PropertyTypeCoercion */ + $existing_type_part->type_params[$i] = $new_param; + + if (!$has_local_match) { + $has_any_param_match = true; + } + } + } + + if ($has_any_param_match) { + $has_local_match = true; + $matching_atomic_types[] = $existing_type_part; + $atomic_comparison_results->type_coerced = true; + } + } + + //we filter the second part of a list with the second part of standard iterables + if (($new_type_part instanceof TArray + || $new_type_part instanceof TIterable) + && $existing_type_part instanceof TList + ) { + $has_any_param_match = false; + + $new_param = $new_type_part->type_params[1]; + $existing_param = $existing_type_part->type_param; + + $has_param_match = true; + + $new_param = self::filterTypeWithAnother( + $codebase, + $existing_param, + $new_param, + $template_type_map, + $has_param_match, + $any_scalar_type_match_found + ); + + if ($template_type_map) { + TemplateInferredTypeReplacer::replace( + $new_param, + new TemplateResult([], $template_type_map), + $codebase + ); + } + + $existing_type->bustCache(); + + if ($has_param_match + && $existing_type_part->type_param->getId() !== $new_param->getId() + ) { + $existing_type_part->type_param = $new_param; + + if (!$has_local_match) { + $has_any_param_match = true; + } + } + + if ($has_any_param_match) { + $has_local_match = true; + $matching_atomic_types[] = $existing_type_part; + $atomic_comparison_results->type_coerced = true; + } + } + + //we filter each property of a Keyed Array with the second part of standard iterables + if (($new_type_part instanceof TArray + || $new_type_part instanceof TIterable) + && $existing_type_part instanceof TKeyedArray + ) { + $has_any_param_match = false; + + $new_param = $new_type_part->type_params[1]; + foreach ($existing_type_part->properties as $property_key => $existing_param) { + $has_param_match = true; + + $new_param = self::filterTypeWithAnother( + $codebase, + $existing_param, + $new_param, + $template_type_map, + $has_param_match, + $any_scalar_type_match_found + ); + + if ($template_type_map) { + TemplateInferredTypeReplacer::replace( + $new_param, + new TemplateResult([], $template_type_map), + $codebase + ); + } + + if ($has_param_match + && $existing_type_part->properties[$property_key]->getId() !== $new_param->getId() + ) { + $existing_type_part->properties[$property_key] = $new_param; + + if (!$has_local_match) { + $has_any_param_match = true; + } + } + } + + $existing_type->bustCache(); + + if ($has_any_param_match) { + $has_local_match = true; + $matching_atomic_types[] = $existing_type_part; + $atomic_comparison_results->type_coerced = true; + } + } + + //These partial match wouldn't have been handled by AtomicTypeComparator + $new_range = null; + if ($new_type_part instanceof TIntRange && $existing_type_part instanceof TPositiveInt) { + $new_range = TIntRange::intersectIntRanges( + TIntRange::convertToIntRange($existing_type_part), + $new_type_part + ); + } elseif ($existing_type_part instanceof TIntRange + && $new_type_part instanceof TPositiveInt + ) { + $new_range = TIntRange::intersectIntRanges( + $existing_type_part, + TIntRange::convertToIntRange($new_type_part) + ); + } elseif ($new_type_part instanceof TIntRange + && $existing_type_part instanceof TIntRange + ) { + $new_range = TIntRange::intersectIntRanges( + $existing_type_part, + $new_type_part + ); + } + + if ($new_range !== null) { + $has_local_match = true; + $matching_atomic_types[] = $new_range; + } + + if ($atomic_comparison_results->type_coerced) { + continue; + } + + if ($atomic_comparison_results->scalar_type_match_found) { + $any_scalar_type_match_found = true; + } + } + + if (!$has_local_match) { + $has_match = false; + break; + } + } + + if ($matching_atomic_types) { + return new Union($matching_atomic_types); + } + + return $new_type; + } + + /** + * @param string[] $suppressed_issues + */ + private static function handleLiteralEquality( + StatementsAnalyzer $statements_analyzer, + string $assertion, + int $bracket_pos, + bool $is_loose_equality, + Union $existing_var_type, + string $old_var_type_string, + ?string $var_id, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues + ): Union { + $value = substr($assertion, $bracket_pos + 1, -1); + + $scalar_type = substr($assertion, 0, $bracket_pos); + + $existing_var_atomic_types = []; + + foreach ($existing_var_type->getAtomicTypes() as $existing_var_atomic_type) { + if ($existing_var_atomic_type instanceof TClassConstant) { + $expanded = TypeExpander::expandAtomic( + $statements_analyzer->getCodebase(), + $existing_var_atomic_type, + $existing_var_atomic_type->fq_classlike_name, + $existing_var_atomic_type->fq_classlike_name, + null, + true, + true + ); + + if ($expanded instanceof Atomic) { + $existing_var_atomic_types[$expanded->getKey()] = $expanded; + } else { + foreach ($expanded as $atomic_type) { + $existing_var_atomic_types[$atomic_type->getKey()] = $atomic_type; + } + } + } else { + $existing_var_atomic_types[$existing_var_atomic_type->getKey()] = $existing_var_atomic_type; + } + } + + if ($scalar_type === 'int') { + return self::handleLiteralEqualityWithInt( + $statements_analyzer, + $assertion, + $bracket_pos, + $is_loose_equality, + $existing_var_type, + $existing_var_atomic_types, + $old_var_type_string, + $var_id, + $negated, + $code_location, + $suppressed_issues + ); + } elseif ($scalar_type === 'string' + || $scalar_type === 'class-string' + || $scalar_type === 'interface-string' + || $scalar_type === 'callable-string' + || $scalar_type === 'trait-string' + ) { + return self::handleLiteralEqualityWithString( + $statements_analyzer, + $assertion, + $scalar_type, + $bracket_pos, + $is_loose_equality, + $existing_var_type, + $existing_var_atomic_types, + $old_var_type_string, + $var_id, + $negated, + $code_location, + $suppressed_issues + ); + } elseif ($scalar_type === 'float') { + return self::handleLiteralEqualityWithFloat( + $statements_analyzer, + $assertion, + $bracket_pos, + $is_loose_equality, + $existing_var_type, + $existing_var_atomic_types, + $old_var_type_string, + $var_id, + $negated, + $code_location, + $suppressed_issues + ); + } elseif ($scalar_type === 'enum') { + [$fq_enum_name, $case_name] = explode('::', $value); + + if ($existing_var_type->hasMixed()) { + if ($is_loose_equality) { + return $existing_var_type; + } + + return new Union([new TEnumCase($fq_enum_name, $case_name)]); + } + + $can_be_equal = false; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $atomic_key => $atomic_type) { + if (get_class($atomic_type) === TNamedObject::class + && $atomic_type->value === $fq_enum_name + ) { + $can_be_equal = true; + $did_remove_type = true; + $existing_var_type->removeType($atomic_key); + $existing_var_type->addType(new TEnumCase($fq_enum_name, $case_name)); + } elseif ($atomic_key !== $assertion) { + $existing_var_type->removeType($atomic_key); + $did_remove_type = true; + } else { + $can_be_equal = true; + } + } + + if ($var_id + && $code_location + && (!$can_be_equal || (!$did_remove_type && count($existing_var_atomic_types) === 1)) + ) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + $can_be_equal, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + return $existing_var_type; + } + + /** + * @param array $existing_var_atomic_types + * @param string[] $suppressed_issues + */ + private static function handleLiteralEqualityWithInt( + StatementsAnalyzer $statements_analyzer, + string $assertion, + int $bracket_pos, + bool $is_loose_equality, + Union $existing_var_type, + array $existing_var_atomic_types, + string $old_var_type_string, + ?string $var_id, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues + ): Union { + $value = (int) substr($assertion, $bracket_pos + 1, -1); + + // we create the literal that is being asserted. We'll return this when we're sure this is the resulting type + $literal_asserted_type = new Union([new TLiteralInt($value)]); + $literal_asserted_type->from_docblock = $existing_var_type->from_docblock; + + $compatible_int_type = self::getCompatibleIntType( + $existing_var_type, + $existing_var_atomic_types, + $value, + $is_loose_equality + ); + + if ($compatible_int_type !== null) { + return $compatible_int_type; + } + + foreach ($existing_var_atomic_types as $existing_var_atomic_type) { + if ($existing_var_atomic_type instanceof TPositiveInt && $value > 0) { + return $literal_asserted_type; + } + + if ($existing_var_atomic_type instanceof TIntRange && $existing_var_atomic_type->contains($value)) { + return $literal_asserted_type; + } + + if ($existing_var_atomic_type instanceof TLiteralInt && $existing_var_atomic_type->value === $value) { + //if we're here, we check that we had at least another type in the union, otherwise it's redundant + + if ($existing_var_type->isSingleIntLiteral()) { + if ($var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + return $existing_var_type; + } + return $literal_asserted_type; + } + + if ($existing_var_atomic_type instanceof TInt && !$existing_var_atomic_type instanceof TLiteralInt) { + return $literal_asserted_type; + } + + if ($existing_var_atomic_type instanceof TTemplateParam) { + $compatible_int_type = self::getCompatibleIntType( + $existing_var_type, + $existing_var_atomic_type->as->getAtomicTypes(), + $value, + $is_loose_equality + ); + if ($compatible_int_type !== null) { + return $compatible_int_type; + } + + $existing_var_atomic_type = clone $existing_var_atomic_type; + + $existing_var_atomic_type->as = self::handleLiteralEquality( + $statements_analyzer, + $assertion, + $bracket_pos, + false, + $existing_var_atomic_type->as, + $old_var_type_string, + $var_id, + $negated, + $code_location, + $suppressed_issues + ); + + return new Union([$existing_var_atomic_type]); + } + + if ($is_loose_equality + && $existing_var_atomic_type instanceof TLiteralFloat + && (int)$existing_var_atomic_type->value === $value + ) { + return new Union([$existing_var_atomic_type]); + } + + if ($is_loose_equality + && $existing_var_atomic_type instanceof TLiteralString + && (int)$existing_var_atomic_type->value === $value + ) { + return new Union([$existing_var_atomic_type]); + } + } + + //here we'll accept non-literal type that *could* match on loose equality and return the original type + foreach ($existing_var_atomic_types as $existing_var_atomic_type) { + //here we'll accept non-literal type that *could* match on loose equality and return the original type + if ($is_loose_equality) { + if ($existing_var_atomic_type instanceof TString + && !$existing_var_atomic_type instanceof TLiteralString + ) { + return $existing_var_type; + } + + if ($existing_var_atomic_type instanceof TFloat + && !$existing_var_atomic_type instanceof TLiteralFloat + ) { + return $existing_var_type; + } + } + } + + //if we're here, no type was eligible for the given literal. We'll emit an impossible error for this assertion + if ($var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + false, + $negated, + $code_location, + $suppressed_issues + ); + } + + return Type::getNever(); + } + + /** + * @param array $existing_var_atomic_types + * @param string[] $suppressed_issues + */ + private static function handleLiteralEqualityWithString( + StatementsAnalyzer $statements_analyzer, + string $assertion, + string $scalar_type, + int $bracket_pos, + bool $is_loose_equality, + Union $existing_var_type, + array $existing_var_atomic_types, + string $old_var_type_string, + ?string $var_id, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues + ): Union { + $value = substr($assertion, $bracket_pos + 1, -1); + + // we create the literal that is being asserted. We'll return this when we're sure this is the resulting type + $literal_asserted_type_string = new Union([new TLiteralString($value)]); + $literal_asserted_type_string->from_docblock = $existing_var_type->from_docblock; + $literal_asserted_type_classstring = new Union([new TLiteralClassString($value)]); + $literal_asserted_type_classstring->from_docblock = $existing_var_type->from_docblock; + + $compatible_string_type = self::getCompatibleStringType( + $existing_var_type, + $existing_var_atomic_types, + $value, + $scalar_type, + $is_loose_equality + ); + + if ($compatible_string_type !== null) { + return $compatible_string_type; + } + + foreach ($existing_var_atomic_types as $existing_var_atomic_type) { + if ($existing_var_atomic_type instanceof TLiteralString && $existing_var_atomic_type->value === $value) { + //if we're here, we check that we had at least another type in the union, otherwise it's redundant + + if ($existing_var_type->isSingleStringLiteral()) { + if ($var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + return $existing_var_type; + } + + if ($scalar_type === 'class-string' + || $scalar_type === 'interface-string' + || $scalar_type === 'trait-string' + ) { + return $literal_asserted_type_classstring; + } + + return $literal_asserted_type_string; + } + + if ($existing_var_atomic_type instanceof TString && !$existing_var_atomic_type instanceof TLiteralString) { + if ($scalar_type === 'class-string' + || $scalar_type === 'interface-string' + || $scalar_type === 'trait-string' + ) { + return $literal_asserted_type_classstring; + } + + return $literal_asserted_type_string; + } + + if ($existing_var_atomic_type instanceof TTemplateParam) { + $compatible_string_type = self::getCompatibleStringType( + $existing_var_type, + $existing_var_atomic_type->as->getAtomicTypes(), + $value, + $scalar_type, + $is_loose_equality + ); + if ($compatible_string_type !== null) { + return $compatible_string_type; + } + + if ($existing_var_atomic_type->as->hasString()) { + if ($scalar_type === 'class-string' + || $scalar_type === 'interface-string' + || $scalar_type === 'trait-string' + ) { + return $literal_asserted_type_classstring; + } + + return $literal_asserted_type_string; + } + + $existing_var_atomic_type = clone $existing_var_atomic_type; + + $existing_var_atomic_type->as = self::handleLiteralEquality( + $statements_analyzer, + $assertion, + $bracket_pos, + false, + $existing_var_atomic_type->as, + $old_var_type_string, + $var_id, + $negated, + $code_location, + $suppressed_issues + ); + + return new Union([$existing_var_atomic_type]); + } + + if ($is_loose_equality + && $existing_var_atomic_type instanceof TLiteralInt + && (string)$existing_var_atomic_type->value === $value + ) { + return new Union([$existing_var_atomic_type]); + } + + if ($is_loose_equality + && $existing_var_atomic_type instanceof TLiteralFloat + && (string)$existing_var_atomic_type->value === $value + ) { + return new Union([$existing_var_atomic_type]); + } + } + + //here we'll accept non-literal type that *could* match on loose equality and return the original type + foreach ($existing_var_atomic_types as $existing_var_atomic_type) { + //here we'll accept non-literal type that *could* match on loose equality and return the original type + if ($is_loose_equality) { + if ($existing_var_atomic_type instanceof TInt + && !$existing_var_atomic_type instanceof TLiteralInt + ) { + return $existing_var_type; + } + + if ($existing_var_atomic_type instanceof TFloat + && !$existing_var_atomic_type instanceof TLiteralFloat + ) { + return $existing_var_type; + } + } + } + + //if we're here, no type was eligible for the given literal. We'll emit an impossible error for this assertion + if ($var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + false, + $negated, + $code_location, + $suppressed_issues + ); + } + + return Type::getNever(); + } + + /** + * @param array $existing_var_atomic_types + * @param string[] $suppressed_issues + */ + private static function handleLiteralEqualityWithFloat( + StatementsAnalyzer $statements_analyzer, + string $assertion, + int $bracket_pos, + bool $is_loose_equality, + Union $existing_var_type, + array $existing_var_atomic_types, + string $old_var_type_string, + ?string $var_id, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues + ): Union { + $value = (float)substr($assertion, $bracket_pos + 1, -1); + + // we create the literal that is being asserted. We'll return this when we're sure this is the resulting type + $literal_asserted_type = new Union([new TLiteralFloat($value)]); + $literal_asserted_type->from_docblock = $existing_var_type->from_docblock; + + $compatible_float_type = self::getCompatibleFloatType( + $existing_var_type, + $existing_var_atomic_types, + $value, + $is_loose_equality + ); + + if ($compatible_float_type !== null) { + return $compatible_float_type; + } + + foreach ($existing_var_atomic_types as $existing_var_atomic_type) { + if ($existing_var_atomic_type instanceof TLiteralFloat && $existing_var_atomic_type->value === $value) { + //if we're here, we check that we had at least another type in the union, otherwise it's redundant + + if ($existing_var_type->isSingleFloatLiteral()) { + if ($var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + return $existing_var_type; + } + + return $literal_asserted_type; + } + + if ($existing_var_atomic_type instanceof TFloat && !$existing_var_atomic_type instanceof TLiteralFloat) { + return $literal_asserted_type; + } + + if ($existing_var_atomic_type instanceof TTemplateParam) { + $compatible_float_type = self::getCompatibleFloatType( + $existing_var_type, + $existing_var_atomic_type->as->getAtomicTypes(), + $value, + $is_loose_equality + ); + if ($compatible_float_type !== null) { + return $compatible_float_type; + } + + if ($existing_var_atomic_type->as->hasFloat()) { + return $literal_asserted_type; + } + + $existing_var_atomic_type = clone $existing_var_atomic_type; + + $existing_var_atomic_type->as = self::handleLiteralEquality( + $statements_analyzer, + $assertion, + $bracket_pos, + false, + $existing_var_atomic_type->as, + $old_var_type_string, + $var_id, + $negated, + $code_location, + $suppressed_issues + ); + + return new Union([$existing_var_atomic_type]); + } + + if ($is_loose_equality + && $existing_var_atomic_type instanceof TLiteralInt + && (float)$existing_var_atomic_type->value === $value + ) { + return new Union([$existing_var_atomic_type]); + } + + if ($is_loose_equality + && $existing_var_atomic_type instanceof TLiteralString + && (float)$existing_var_atomic_type->value === $value + ) { + return new Union([$existing_var_atomic_type]); + } + } + + //here we'll accept non-literal type that *could* match on loose equality and return the original type + foreach ($existing_var_atomic_types as $existing_var_atomic_type) { + if ($is_loose_equality) { + if ($existing_var_atomic_type instanceof TInt + && !$existing_var_atomic_type instanceof TLiteralInt + ) { + return $existing_var_type; + } + + if ($existing_var_atomic_type instanceof TString + && !$existing_var_atomic_type instanceof TLiteralString + ) { + return $existing_var_type; + } + } + } + + //if we're here, no type was eligible for the given literal. We'll emit an impossible error for this assertion + if ($var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + false, + $negated, + $code_location, + $suppressed_issues + ); + } + + return Type::getNever(); + } + + /** + * @param array $existing_var_atomic_types + */ + private static function getCompatibleIntType( + Union $existing_var_type, + array $existing_var_atomic_types, + int $value, + bool $is_loose_equality + ): ?Union { + foreach ($existing_var_atomic_types as $existing_var_atomic_type) { + if ($existing_var_atomic_type instanceof TMixed + || $existing_var_atomic_type instanceof TScalar + || $existing_var_atomic_type instanceof TNumeric + || $existing_var_atomic_type instanceof TArrayKey + ) { + if ($is_loose_equality) { + return $existing_var_type; + } + + $asserted_type = new Union([new TLiteralInt($value)]); + $asserted_type->from_docblock = $existing_var_type->from_docblock; + return $asserted_type; + } + } + + return null; + } + + /** + * @param array $existing_var_atomic_types + */ + private static function getCompatibleStringType( + Union $existing_var_type, + array $existing_var_atomic_types, + string $value, + string $scalar_type, + bool $is_loose_equality + ): ?Union { + foreach ($existing_var_atomic_types as $existing_var_atomic_type) { + if ($existing_var_atomic_type instanceof TMixed + || $existing_var_atomic_type instanceof TScalar + || $existing_var_atomic_type instanceof TArrayKey + ) { + if ($is_loose_equality) { + return $existing_var_type; + } + + if ($scalar_type === 'class-string' + || $scalar_type === 'interface-string' + || $scalar_type === 'trait-string' + ) { + $asserted_type = new Union([new TLiteralClassString($value)]); + $asserted_type->from_docblock = $existing_var_type->from_docblock; + return $asserted_type; + } + + $asserted_type = new Union([new TLiteralString($value)]); + $asserted_type->from_docblock = $existing_var_type->from_docblock; + return $asserted_type; + } + } + + return null; + } + + /** + * @param array $existing_var_atomic_types + */ + private static function getCompatibleFloatType( + Union $existing_var_type, + array $existing_var_atomic_types, + float $value, + bool $is_loose_equality + ): ?Union { + foreach ($existing_var_atomic_types as $existing_var_atomic_type) { + if ($existing_var_atomic_type instanceof TMixed + || $existing_var_atomic_type instanceof TScalar + || $existing_var_atomic_type instanceof TNumeric + ) { + if ($is_loose_equality) { + return $existing_var_type; + } + + $asserted_type = new Union([new TLiteralFloat($value)]); + $asserted_type->from_docblock = $existing_var_type->from_docblock; + return $asserted_type; + } + } + + return null; + } + + /** + * @param array> $template_type_map + * @param array $suppressed_issues + */ + private static function handleIsA( + Codebase $codebase, + Union $existing_var_type, + string &$assertion, + array $template_type_map, + ?CodeLocation $code_location, + ?string $key, + array $suppressed_issues, + bool &$should_return + ): Union { + $assertion = substr($assertion, 4); + + $allow_string_comparison = false; + + if (strpos($assertion, 'string-') === 0) { + $assertion = substr($assertion, 7); + $allow_string_comparison = true; + } + + if ($existing_var_type->hasMixed()) { + $type = new Union([ + new TNamedObject($assertion), + ]); + + if ($allow_string_comparison) { + $type->addType( + new TClassString( + $assertion, + new TNamedObject($assertion) + ) + ); + } + + $should_return = true; + return $type; + } + + $existing_has_object = $existing_var_type->hasObjectType(); + $existing_has_string = $existing_var_type->hasString(); + + if ($existing_has_object && !$existing_has_string) { + return Type::parseString($assertion, null, $template_type_map); + } + + if ($existing_has_string && !$existing_has_object) { + if (!$allow_string_comparison && $code_location) { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + 'Cannot allow string comparison to object for ' . $key, + $code_location, + null + ), + $suppressed_issues + ); + + return Type::getMixed(); + } else { + $new_type_has_interface_string = $codebase->interfaceExists($assertion); + + $old_type_has_interface_string = false; + + foreach ($existing_var_type->getAtomicTypes() as $existing_type_part) { + if ($existing_type_part instanceof TClassString + && $existing_type_part->as_type + && $codebase->interfaceExists($existing_type_part->as_type->value) + ) { + $old_type_has_interface_string = true; + break; + } + } + + if (isset($template_type_map[$assertion])) { + $new_type = Type::parseString( + 'class-string<' . $assertion . '>', + null, + $template_type_map + ); + } else { + $new_type = Type::getClassString($assertion); + } + + if (( + $new_type_has_interface_string + && !UnionTypeComparator::isContainedBy( + $codebase, + $existing_var_type, + $new_type + ) + ) + || ( + $old_type_has_interface_string + && !UnionTypeComparator::isContainedBy( + $codebase, + $new_type, + $existing_var_type + ) + ) + ) { + $new_type_part = Atomic::create($assertion, null, $template_type_map); + + $acceptable_atomic_types = []; + + foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_part) { + if (!$new_type_part instanceof TNamedObject + || !$existing_var_type_part instanceof TClassString + ) { + $acceptable_atomic_types = []; + + break; + } + + if (!$existing_var_type_part->as_type instanceof TNamedObject) { + $acceptable_atomic_types = []; + + break; + } + + $existing_var_type_part = $existing_var_type_part->as_type; + + if (AtomicTypeComparator::isContainedBy( + $codebase, + $existing_var_type_part, + $new_type_part + )) { + $acceptable_atomic_types[] = clone $existing_var_type_part; + continue; + } + + if ($codebase->classExists($existing_var_type_part->value) + || $codebase->interfaceExists($existing_var_type_part->value) + ) { + $existing_var_type_part = clone $existing_var_type_part; + $existing_var_type_part->addIntersectionType($new_type_part); + $acceptable_atomic_types[] = $existing_var_type_part; + } + } + + if (count($acceptable_atomic_types) === 1) { + $should_return = true; + + return new Union([ + new TClassString('object', $acceptable_atomic_types[0]), + ]); + } + } + } + + return $new_type; + } else { + return Type::getMixed(); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php new file mode 100644 index 00000000..d1b31b89 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php @@ -0,0 +1,293 @@ +equals( + new TArray([ + new Union([new TEmpty()]), + new Union([new TEmpty()]) + ]), + false + ); + + if ($is_empty_array + && (($container_type_part instanceof TArray + && !$container_type_part instanceof TNonEmptyArray) + || ($container_type_part instanceof TKeyedArray + && !$container_type_part->isNonEmpty()) + ) + ) { + return true; + } + + if ($container_type_part instanceof TKeyedArray + && $input_type_part instanceof TArray + ) { + $all_string_int_literals = true; + + $properties = []; + + foreach ($input_type_part->type_params[0]->getAtomicTypes() as $atomic_key_type) { + if ($atomic_key_type instanceof TLiteralString || $atomic_key_type instanceof TLiteralInt) { + $properties[$atomic_key_type->value] = clone $input_type_part->type_params[1]; + $properties[$atomic_key_type->value]->possibly_undefined = true; + } else { + $all_string_int_literals = false; + } + } + + if ($all_string_int_literals && $properties) { + $input_type_part = new TKeyedArray($properties); + + return KeyedArrayComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $atomic_comparison_result + ); + } + } + + if ($container_type_part instanceof TList + && $input_type_part instanceof TKeyedArray + ) { + if ($input_type_part->is_list) { + $input_type_part = $input_type_part->getList(); + } else { + return false; + } + } + + if ($container_type_part instanceof TList + && $input_type_part instanceof TClassStringMap + ) { + return false; + } + + if ($container_type_part instanceof TList + && $input_type_part instanceof TArray + && $input_type_part->type_params[1]->isEmpty() + ) { + return !$container_type_part instanceof TNonEmptyList; + } + + if ($container_type_part instanceof TNonEmptyList + && $input_type_part instanceof TNonEmptyArray + && $input_type_part->type_params[0]->isSingleIntLiteral() + && $input_type_part->type_params[0]->getSingleIntLiteral()->value === 0 + ) { + //this is a special case where the only offset value of an non empty array is 0, so it's a non empty list + return UnionTypeComparator::isContainedBy( + $codebase, + $input_type_part->type_params[1], + $container_type_part->type_param, + $input_type_part->type_params[1]->ignore_nullable_issues, + $input_type_part->type_params[1]->ignore_falsable_issues, + $atomic_comparison_result, + $allow_interface_equality + ); + } + + if ($input_type_part instanceof TList + && $container_type_part instanceof TList + ) { + if (!UnionTypeComparator::isContainedBy( + $codebase, + $input_type_part->type_param, + $container_type_part->type_param, + $input_type_part->type_param->ignore_nullable_issues, + $input_type_part->type_param->ignore_falsable_issues, + $atomic_comparison_result, + $allow_interface_equality + )) { + return false; + } + + return $input_type_part instanceof TNonEmptyList + || !$container_type_part instanceof TNonEmptyList; + } + + if ($container_type_part instanceof TKeyedArray) { + if ($container_type_part->is_list) { + $container_type_part = $container_type_part->getList(); + + return self::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $atomic_comparison_result + ); + } + + $container_type_part = $container_type_part->getGenericArrayType(); + } + + if ($input_type_part instanceof TKeyedArray) { + $input_type_part = $input_type_part->getGenericArrayType(); + } + + if ($input_type_part instanceof TClassStringMap) { + $input_type_part = new TArray([ + $input_type_part->getStandinKeyParam(), + clone $input_type_part->value_param + ]); + } + + if ($container_type_part instanceof TClassStringMap) { + $container_type_part = new TArray([ + $container_type_part->getStandinKeyParam(), + clone $container_type_part->value_param + ]); + } + + if ($container_type_part instanceof TList) { + $all_types_contain = false; + + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + $container_type_part = new TArray([Type::getInt(), clone $container_type_part->type_param]); + } + + if ($input_type_part instanceof TList) { + if ($input_type_part instanceof TNonEmptyList) { + // if the array has a known size < 10, make sure the array keys are literal ints + if ($input_type_part->count !== null && $input_type_part->count < 10) { + $literal_ints = array_map( + function ($i) { + return new TLiteralInt($i); + }, + range(0, $input_type_part->count - 1) + ); + + $input_type_part = new TNonEmptyArray([ + new Union($literal_ints), + clone $input_type_part->type_param + ]); + } else { + $input_type_part = new TNonEmptyArray([Type::getInt(), clone $input_type_part->type_param]); + } + } else { + $input_type_part = new TArray([Type::getInt(), clone $input_type_part->type_param]); + } + } + + foreach ($input_type_part->type_params as $i => $input_param) { + if ($i > 1) { + break; + } + + $container_param = $container_type_part->type_params[$i]; + + if ($i === 0 + && $input_param->hasMixed() + && $container_param->hasString() + && $container_param->hasInt() + ) { + continue; + } + + if ($input_param->isEmpty() + && $container_type_part instanceof TNonEmptyArray + ) { + return false; + } + + $param_comparison_result = new TypeComparisonResult(); + + if (!$input_param->isEmpty()) { + if (!UnionTypeComparator::isContainedBy( + $codebase, + $input_param, + $container_param, + $input_param->ignore_nullable_issues, + $input_param->ignore_falsable_issues, + $param_comparison_result, + $allow_interface_equality + )) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced + = $param_comparison_result->type_coerced === true + && $atomic_comparison_result->type_coerced !== false; + + $atomic_comparison_result->type_coerced_from_mixed + = $param_comparison_result->type_coerced_from_mixed === true + && $atomic_comparison_result->type_coerced_from_mixed !== false; + + $atomic_comparison_result->type_coerced_from_as_mixed + = $param_comparison_result->type_coerced_from_as_mixed === true + && $atomic_comparison_result->type_coerced_from_as_mixed !== false; + + $atomic_comparison_result->type_coerced_from_scalar + = $param_comparison_result->type_coerced_from_scalar === true + && $atomic_comparison_result->type_coerced_from_scalar !== false; + + $atomic_comparison_result->scalar_type_match_found + = $param_comparison_result->scalar_type_match_found === true + && $atomic_comparison_result->scalar_type_match_found !== false; + } + + if (!$param_comparison_result->type_coerced_from_as_mixed) { + $all_types_contain = false; + } + } else { + if ($atomic_comparison_result) { + $atomic_comparison_result->to_string_cast + = $atomic_comparison_result->to_string_cast === true + || $param_comparison_result->to_string_cast === true; + } + } + } + } + + if ($container_type_part instanceof TNonEmptyArray + && !$input_type_part instanceof TNonEmptyArray + ) { + if ($all_types_contain && $atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + return $all_types_contain; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php new file mode 100644 index 00000000..6f35b1ff --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php @@ -0,0 +1,712 @@ +extra_types))) + && ($input_type_part instanceof TTemplateParam + || ($input_type_part instanceof TNamedObject + && isset($input_type_part->extra_types))) + ) { + return ObjectComparator::isShallowlyContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $atomic_comparison_result + ); + } + + if ($container_type_part instanceof TMixed + || ($container_type_part instanceof TTemplateParam + && $container_type_part->as->isMixed() + && !$container_type_part->extra_types + && $input_type_part instanceof TMixed) + ) { + if (get_class($container_type_part) === TEmptyMixed::class + && get_class($input_type_part) === TMixed::class + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_mixed = true; + } + + return false; + } + + return true; + } + + if ($input_type_part instanceof TNever || $input_type_part instanceof TEmpty) { + return true; + } + + if ($input_type_part instanceof TMixed + || ($input_type_part instanceof TTemplateParam + && $input_type_part->as->isMixed() + && !$input_type_part->extra_types) + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_mixed = true; + } + + return false; + } + + if ($input_type_part instanceof TNull) { + if ($container_type_part instanceof TNull) { + return true; + } + + if ($container_type_part instanceof TTemplateParam + && ($container_type_part->as->isNullable() || $container_type_part->as->isMixed()) + ) { + return true; + } + + return false; + } + + if ($container_type_part instanceof TNull) { + return false; + } + + if ($input_type_part instanceof Scalar && $container_type_part instanceof Scalar) { + return ScalarTypeComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $allow_float_int_equality, + $atomic_comparison_result + ); + } + + if ($input_type_part instanceof TCallableKeyedArray + && $container_type_part instanceof TArray + ) { + return ArrayTypeComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $atomic_comparison_result + ); + } + + if (($container_type_part instanceof TCallable + && $input_type_part instanceof TCallable) + || ($container_type_part instanceof TClosure + && $input_type_part instanceof TClosure) + ) { + return CallableTypeComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $atomic_comparison_result + ); + } + + if ($container_type_part instanceof TClosure) { + if ($input_type_part instanceof TCallable) { + if (CallableTypeComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $atomic_comparison_result + ) === false + ) { + return false; + } + + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + } + + return false; + } + + if ($container_type_part instanceof TCallable && $input_type_part instanceof TClosure) { + return CallableTypeComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $atomic_comparison_result + ); + } + + if ($input_type_part instanceof TNamedObject && + $input_type_part->value === 'Closure' && + $container_type_part instanceof TCallable + ) { + return true; + } + + if ($input_type_part instanceof TObject && + $container_type_part instanceof TCallable + ) { + return true; + } + + if ($input_type_part instanceof TCallableObject && + $container_type_part instanceof TObject + ) { + return true; + } + + if (($container_type_part instanceof TKeyedArray + && $input_type_part instanceof TKeyedArray) + || ($container_type_part instanceof TObjectWithProperties + && $input_type_part instanceof TObjectWithProperties) + ) { + return KeyedArrayComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $atomic_comparison_result + ); + } + + if ($container_type_part instanceof TObjectWithProperties + && $input_type_part instanceof TObject + && !$input_type_part instanceof TObjectWithProperties + && !$input_type_part instanceof TCallableObject + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + return false; + } + + if (($input_type_part instanceof TArray + || $input_type_part instanceof TList + || $input_type_part instanceof TKeyedArray + || $input_type_part instanceof TClassStringMap) + && ($container_type_part instanceof TArray + || $container_type_part instanceof TList + || $container_type_part instanceof TKeyedArray + || $container_type_part instanceof TClassStringMap) + ) { + return ArrayTypeComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $atomic_comparison_result + ); + } + + if (get_class($container_type_part) === TNamedObject::class + && $input_type_part instanceof TEnumCase + && $input_type_part->value === $container_type_part->value + ) { + return true; + } + + if (get_class($input_type_part) === TNamedObject::class + && $container_type_part instanceof TEnumCase + && $input_type_part->value === $container_type_part->value + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if (($input_type_part instanceof TNamedObject + || ($input_type_part instanceof TTemplateParam + && $input_type_part->as->hasObjectType()) + || $input_type_part instanceof TIterable) + && ($container_type_part instanceof TNamedObject + || ($container_type_part instanceof TTemplateParam + && $container_type_part->isObjectType()) + || $container_type_part instanceof TIterable) + && ObjectComparator::isShallowlyContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $atomic_comparison_result + ) + ) { + if ($container_type_part instanceof TGenericObject || $container_type_part instanceof TIterable) { + return GenericTypeComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $atomic_comparison_result + ); + } + + if ($container_type_part instanceof TNamedObject + && $input_type_part instanceof TNamedObject + && $container_type_part->was_static + && !$input_type_part->was_static + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if ($atomic_comparison_result) { + $atomic_comparison_result->to_string_cast = false; + } + + return true; + } + + if (get_class($input_type_part) === TObject::class + && get_class($container_type_part) === TObject::class + ) { + return true; + } + + if ($container_type_part instanceof TTemplateParam && $input_type_part instanceof TTemplateParam) { + return UnionTypeComparator::isContainedBy( + $codebase, + $input_type_part->as, + $container_type_part->as, + false, + false, + $atomic_comparison_result, + $allow_interface_equality + ); + } + + if ($container_type_part instanceof TTemplateParam) { + foreach ($container_type_part->as->getAtomicTypes() as $container_as_type_part) { + if (self::isContainedBy( + $codebase, + $input_type_part, + $container_as_type_part, + $allow_interface_equality, + $allow_float_int_equality, + $atomic_comparison_result + )) { + if ($allow_interface_equality) { + return true; + } + } + } + + return false; + } + + if ($container_type_part instanceof TConditional) { + $atomic_types = array_merge( + array_values($container_type_part->if_type->getAtomicTypes()), + array_values($container_type_part->else_type->getAtomicTypes()) + ); + + foreach ($atomic_types as $container_as_type_part) { + if (self::isContainedBy( + $codebase, + $input_type_part, + $container_as_type_part, + $allow_interface_equality, + $allow_float_int_equality, + $atomic_comparison_result + )) { + return true; + } + } + + return false; + } + + if ($input_type_part instanceof TTemplateParam) { + if ($input_type_part->extra_types) { + foreach ($input_type_part->extra_types as $extra_type) { + if (self::isContainedBy( + $codebase, + $extra_type, + $container_type_part, + $allow_interface_equality, + $allow_float_int_equality, + $atomic_comparison_result + )) { + return true; + } + } + } + + foreach ($input_type_part->as->getAtomicTypes() as $input_as_type_part) { + if (self::isContainedBy( + $codebase, + $input_as_type_part, + $container_type_part, + $allow_interface_equality, + $allow_float_int_equality, + $atomic_comparison_result + )) { + return true; + } + } + + return false; + } + + if ($input_type_part instanceof TConditional) { + $input_atomic_types = array_merge( + array_values($input_type_part->if_type->getAtomicTypes()), + array_values($input_type_part->else_type->getAtomicTypes()) + ); + + foreach ($input_atomic_types as $input_as_type_part) { + if (self::isContainedBy( + $codebase, + $input_as_type_part, + $container_type_part, + $allow_interface_equality, + $allow_float_int_equality, + $atomic_comparison_result + )) { + return true; + } + } + + return false; + } + + if ($input_type_part instanceof TNamedObject + && $input_type_part->value === 'static' + && $container_type_part instanceof TNamedObject + && strtolower($container_type_part->value) === 'self' + ) { + return true; + } + + if ($container_type_part instanceof TIterable) { + if ($input_type_part instanceof TArray + || $input_type_part instanceof TKeyedArray + || $input_type_part instanceof TList + ) { + if ($input_type_part instanceof TKeyedArray) { + $input_type_part = $input_type_part->getGenericArrayType(); + } elseif ($input_type_part instanceof TList) { + $input_type_part = new TArray([Type::getInt(), $input_type_part->type_param]); + } + + $all_types_contain = true; + + foreach ($input_type_part->type_params as $i => $input_param) { + $container_param_offset = $i - (2 - count($container_type_part->type_params)); + + if ($container_param_offset === -1) { + continue; + } + + $container_param = $container_type_part->type_params[$container_param_offset]; + + if ($i === 0 + && $input_param->hasMixed() + && $container_param->hasString() + && $container_param->hasInt() + ) { + continue; + } + + $array_comparison_result = new TypeComparisonResult(); + + if (!$input_param->isEmpty()) { + if (!UnionTypeComparator::isContainedBy( + $codebase, + $input_param, + $container_param, + $input_param->ignore_nullable_issues, + $input_param->ignore_falsable_issues, + $array_comparison_result, + $allow_interface_equality + ) + && !$array_comparison_result->type_coerced_from_scalar + ) { + if ($atomic_comparison_result && $array_comparison_result->type_coerced_from_mixed) { + $atomic_comparison_result->type_coerced_from_mixed = true; + } + $all_types_contain = false; + } else { + if ($atomic_comparison_result) { + $atomic_comparison_result->to_string_cast + = $atomic_comparison_result->to_string_cast === true + || $array_comparison_result->to_string_cast === true; + } + } + } + } + return $all_types_contain; + } + + if ($input_type_part->hasTraversableInterface($codebase)) { + return true; + } + } + + if ($container_type_part instanceof TString || $container_type_part instanceof TScalar) { + if ($input_type_part instanceof TNamedObject) { + // check whether the object has a __toString method + if ($codebase->classOrInterfaceExists($input_type_part->value)) { + if ($codebase->php_major_version >= 8 + && ($input_type_part->value === 'Stringable' + || ($codebase->classlikes->classExists($input_type_part->value) + && $codebase->classlikes->classImplements($input_type_part->value, 'Stringable')) + || $codebase->classlikes->interfaceExtends($input_type_part->value, 'Stringable')) + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->to_string_cast = true; + } + + return true; + } + + if ($codebase->methods->methodExists( + new MethodIdentifier( + $input_type_part->value, + '__tostring' + ) + )) { + if ($atomic_comparison_result) { + $atomic_comparison_result->to_string_cast = true; + } + + return true; + } + } + + // PHP 5.6 doesn't support this natively, so this introduces a bug *just* when checking PHP 5.6 code + if ($input_type_part->value === 'ReflectionType') { + if ($atomic_comparison_result) { + $atomic_comparison_result->to_string_cast = true; + } + + return true; + } + } elseif ($input_type_part instanceof TObjectWithProperties + && isset($input_type_part->methods['__toString']) + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->to_string_cast = true; + } + + return true; + } + } + + if ($container_type_part instanceof TCallable && + ( + $input_type_part instanceof TLiteralString + || $input_type_part instanceof TCallableString + || $input_type_part instanceof TArray + || $input_type_part instanceof TKeyedArray + || $input_type_part instanceof TList + || ( + $input_type_part instanceof TNamedObject && + $codebase->classOrInterfaceExists($input_type_part->value) && + $codebase->methodExists($input_type_part->value . '::__invoke') + ) + ) + ) { + return CallableTypeComparator::isNotExplicitlyCallableTypeCallable( + $codebase, + $input_type_part, + $container_type_part, + $atomic_comparison_result + ); + } + + if ($container_type_part instanceof TObject + && $input_type_part instanceof TNamedObject + ) { + if ($container_type_part instanceof TObjectWithProperties + && $input_type_part->value !== 'stdClass' + ) { + return KeyedArrayComparator::isContainedByObjectWithProperties( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $atomic_comparison_result + ); + } + + return true; + } + + if ($container_type_part instanceof TNamedObject + && $input_type_part instanceof TNamedObject + && $container_type_part->was_static + && !$input_type_part->was_static + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if ($input_type_part instanceof TObject && $container_type_part instanceof TNamedObject) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if ($container_type_part instanceof TNamedObject + && $input_type_part instanceof TNamedObject + && $codebase->classOrInterfaceOrEnumExists($input_type_part->value) + && ( + ( + $codebase->classExists($container_type_part->value) + && $codebase->classExtendsOrImplements( + $container_type_part->value, + $input_type_part->value + ) + ) + || + ( + $codebase->interfaceExists($container_type_part->value) + && $codebase->interfaceExtends( + $container_type_part->value, + $input_type_part->value + ) + ) + ) + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + return $input_type_part->getKey() === $container_type_part->getKey(); + } + + /** + * Does the input param atomic type match the given param atomic type + */ + public static function canBeIdentical( + Codebase $codebase, + Atomic $type1_part, + Atomic $type2_part, + bool $allow_interface_equality = true + ): bool { + if ((get_class($type1_part) === TList::class + && $type2_part instanceof TNonEmptyList) + || (get_class($type2_part) === TList::class + && $type1_part instanceof TNonEmptyList) + ) { + return UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $type1_part->type_param, + $type2_part->type_param + ); + } + + if ((get_class($type1_part) === TArray::class + && $type2_part instanceof TNonEmptyArray) + || (get_class($type2_part) === TArray::class + && $type1_part instanceof TNonEmptyArray) + ) { + return UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $type1_part->type_params[0], + $type2_part->type_params[0] + ) + && UnionTypeComparator::canExpressionTypesBeIdentical( + $codebase, + $type1_part->type_params[1], + $type2_part->type_params[1] + ); + } + + $first_comparison_result = new TypeComparisonResult(); + $second_comparison_result = new TypeComparisonResult(); + + return (self::isContainedBy( + $codebase, + $type1_part, + $type2_part, + $allow_interface_equality, + false, + $first_comparison_result + ) + && !$first_comparison_result->to_string_cast + ) || (self::isContainedBy( + $codebase, + $type2_part, + $type1_part, + $allow_interface_equality, + false, + $second_comparison_result + ) + && !$second_comparison_result->to_string_cast + ) || ($first_comparison_result->type_coerced + && $second_comparison_result->type_coerced + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php new file mode 100644 index 00000000..107e3dd5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php @@ -0,0 +1,524 @@ +is_pure && !$input_type_part->is_pure) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = $input_type_part->is_pure === null; + } + + return false; + } + + if ($container_type_part->params !== null && $input_type_part->params === null) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_mixed = true; + } + + return false; + } + + if ($input_type_part->params !== null && $container_type_part->params !== null) { + foreach ($input_type_part->params as $i => $input_param) { + $container_param = null; + + if (isset($container_type_part->params[$i])) { + $container_param = $container_type_part->params[$i]; + } elseif ($container_type_part->params) { + $last_param = end($container_type_part->params); + + if ($last_param->is_variadic) { + $container_param = $last_param; + } + } + + if (!$container_param) { + if ($input_param->is_optional) { + break; + } + + return false; + } + + if ($container_param->type + && !$container_param->type->hasMixed() + && !UnionTypeComparator::isContainedBy( + $codebase, + $container_param->type, + $input_param->type ?: Type::getMixed(), + false, + false, + $atomic_comparison_result + ) + ) { + return false; + } + } + } + + if (isset($container_type_part->return_type)) { + if (!isset($input_type_part->return_type)) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_mixed = true; + } + + return false; + } + + $input_return = $input_type_part->return_type; + + if ($input_return->isVoid() && $container_type_part->return_type->isNullable()) { + return true; + } + + if (!$container_type_part->return_type->isVoid() + && !UnionTypeComparator::isContainedBy( + $codebase, + $input_return, + $container_type_part->return_type, + false, + false, + $atomic_comparison_result + ) + ) { + return false; + } + } + + return true; + } + + public static function isNotExplicitlyCallableTypeCallable( + Codebase $codebase, + Atomic $input_type_part, + TCallable $container_type_part, + ?TypeComparisonResult $atomic_comparison_result + ): bool { + if ($input_type_part instanceof TList) { + if ($input_type_part->type_param->isMixed() + || $input_type_part->type_param->hasScalar() + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced_from_mixed = true; + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if (!$input_type_part->type_param->hasString()) { + return false; + } + + if (!$input_type_part instanceof TCallableList) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced_from_mixed = true; + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + } + + if ($input_type_part instanceof TArray) { + if ($input_type_part->type_params[1]->isMixed() + || $input_type_part->type_params[1]->hasScalar() + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced_from_mixed = true; + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if (!$input_type_part->type_params[1]->hasString()) { + return false; + } + + if (!$input_type_part instanceof TCallableArray) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced_from_mixed = true; + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + } elseif ($input_type_part instanceof TKeyedArray) { + $method_id = self::getCallableMethodIdFromTKeyedArray($input_type_part); + + if ($method_id === 'not-callable') { + return false; + } + + if (!$method_id) { + return true; + } + + try { + $method_id = $codebase->methods->getDeclaringMethodId($method_id); + + if (!$method_id) { + return false; + } + + $codebase->methods->getStorage($method_id); + } catch (Exception $e) { + return false; + } + } + + $input_callable = self::getCallableFromAtomic($codebase, $input_type_part, $container_type_part, null, true); + + if ($input_callable) { + if (self::isContainedBy( + $codebase, + $input_callable, + $container_type_part, + $atomic_comparison_result + ) === false + ) { + return false; + } + } + + return true; + } + + /** + * @return TCallable|TClosure|null + */ + public static function getCallableFromAtomic( + Codebase $codebase, + Atomic $input_type_part, + ?TCallable $container_type_part = null, + ?StatementsAnalyzer $statements_analyzer = null, + bool $expand_callable = false + ): ?Atomic { + if ($input_type_part instanceof TCallable || $input_type_part instanceof TClosure) { + return $input_type_part; + } + + if ($input_type_part instanceof TLiteralString && $input_type_part->value) { + try { + $function_storage = $codebase->functions->getStorage( + $statements_analyzer, + strtolower($input_type_part->value) + ); + + if ($expand_callable) { + $params = []; + + foreach ($function_storage->params as $param) { + $param = clone $param; + + if ($param->type) { + $param->type = TypeExpander::expandUnion( + $codebase, + $param->type, + null, + null, + null, + true, + true, + false, + false, + true + ); + } + + $params[] = $param; + } + + $return_type = null; + + if ($function_storage->return_type) { + $return_type = TypeExpander::expandUnion( + $codebase, + $function_storage->return_type, + null, + null, + null, + true, + true, + false, + false, + true + ); + } + } else { + $return_type = $function_storage->return_type; + $params = $function_storage->params; + } + + return new TCallable( + 'callable', + $params, + $return_type, + $function_storage->pure + ); + } catch (UnexpectedValueException $e) { + if (InternalCallMapHandler::inCallMap($input_type_part->value)) { + $args = []; + + $nodes = new NodeDataProvider(); + + if ($container_type_part && $container_type_part->params) { + foreach ($container_type_part->params as $i => $param) { + $arg = new Arg( + new Variable('_' . $i) + ); + + if ($param->type) { + $nodes->setType($arg->value, $param->type); + } + + $args[] = $arg; + } + } + + $matching_callable = InternalCallMapHandler::getCallableFromCallMapById( + $codebase, + $input_type_part->value, + $args, + $nodes + ); + + $must_use = false; + + $matching_callable->is_pure = $codebase->functions->isCallMapFunctionPure( + $codebase, + $statements_analyzer->node_data ?? null, + $input_type_part->value, + null, + $must_use + ); + + return $matching_callable; + } + } + } elseif ($input_type_part instanceof TKeyedArray) { + $method_id = self::getCallableMethodIdFromTKeyedArray($input_type_part); + if ($method_id && $method_id !== 'not-callable') { + try { + $method_storage = $codebase->methods->getStorage($method_id); + $method_fqcln = $method_id->fq_class_name; + + $converted_return_type = null; + + if ($method_storage->return_type) { + $converted_return_type = TypeExpander::expandUnion( + $codebase, + $method_storage->return_type, + $method_fqcln, + $method_fqcln, + null + ); + } + + return new TCallable( + 'callable', + $method_storage->params, + $converted_return_type, + $method_storage->pure + ); + } catch (UnexpectedValueException $e) { + // do nothing + } + } + } elseif ($input_type_part instanceof TNamedObject + && $input_type_part->value === 'Closure' + ) { + return new TCallable(); + } elseif ($input_type_part instanceof TNamedObject + && $codebase->classExists($input_type_part->value) + ) { + $invoke_id = new MethodIdentifier( + $input_type_part->value, + '__invoke' + ); + + if ($codebase->methods->methodExists($invoke_id)) { + $declaring_method_id = $codebase->methods->getDeclaringMethodId($invoke_id); + + if ($declaring_method_id) { + $method_storage = $codebase->methods->getStorage($declaring_method_id); + $method_fqcln = $invoke_id->fq_class_name; + $converted_return_type = null; + if ($method_storage->return_type) { + $converted_return_type = TypeExpander::expandUnion( + $codebase, + $method_storage->return_type, + $method_fqcln, + $method_fqcln, + null + ); + } + + return new TCallable( + 'callable', + $method_storage->params, + $converted_return_type, + $method_storage->pure + ); + } + } + } + + return null; + } + + /** @return null|'not-callable'|MethodIdentifier */ + public static function getCallableMethodIdFromTKeyedArray( + TKeyedArray $input_type_part, + ?Codebase $codebase = null, + ?string $calling_method_id = null, + ?string $file_name = null + ) { + if (!isset($input_type_part->properties[0]) + || !isset($input_type_part->properties[1]) + ) { + return 'not-callable'; + } + + [$lhs, $rhs] = $input_type_part->properties; + + $rhs_low_info = $rhs->hasMixed() || $rhs->hasScalar(); + + if ($rhs_low_info || !$rhs->isSingleStringLiteral()) { + if (!$rhs_low_info && !$rhs->hasString()) { + return 'not-callable'; + } + + if ($codebase && ($calling_method_id || $file_name)) { + foreach ($lhs->getAtomicTypes() as $lhs_atomic_type) { + if ($lhs_atomic_type instanceof TNamedObject) { + $codebase->analyzer->addMixedMemberName( + strtolower($lhs_atomic_type->value) . '::', + $calling_method_id ?: $file_name + ); + } elseif ($lhs_atomic_type instanceof TTemplateParam) { + $lhs_template_type = $lhs_atomic_type->as; + if ($lhs_template_type->isSingle()) { + $lhs_template_atomic_type = $lhs_template_type->getSingleAtomic(); + $member_id = null; + if ($lhs_template_atomic_type instanceof TNamedObject) { + $member_id = $lhs_template_atomic_type->value; + } elseif ($lhs_template_atomic_type instanceof TClassString) { + $member_id = $lhs_template_atomic_type->as; + } + + if ($member_id) { + $codebase->analyzer->addMixedMemberName( + strtolower($member_id) . '::', + $calling_method_id ?: $file_name + ); + } + } + } + } + } + + return null; + } + + $method_name = $rhs->getSingleStringLiteral()->value; + + $class_name = null; + + if ($lhs->isSingleStringLiteral()) { + $class_name = $lhs->getSingleStringLiteral()->value; + if ($class_name[0] === '\\') { + $class_name = substr($class_name, 1); + } + } elseif ($lhs->isSingle()) { + foreach ($lhs->getAtomicTypes() as $lhs_atomic_type) { + if ($lhs_atomic_type instanceof TNamedObject) { + $class_name = $lhs_atomic_type->value; + } elseif ($lhs_atomic_type instanceof TTemplateParam) { + $lhs_template_type = $lhs_atomic_type->as; + if ($lhs_template_type->isSingle()) { + $lhs_template_atomic_type = $lhs_template_type->getSingleAtomic(); + if ($lhs_template_atomic_type instanceof TNamedObject) { + $class_name = $lhs_template_atomic_type->value; + } elseif ($lhs_template_atomic_type instanceof TClassString) { + $class_name = $lhs_template_atomic_type->as; + } + } + } elseif ($lhs_atomic_type instanceof TClassString + && $lhs_atomic_type->as + ) { + $class_name = $lhs_atomic_type->as; + } + } + } + + if ($class_name === 'self' + || $class_name === 'static' + || $class_name === 'parent' + ) { + return null; + } + + if (!$class_name) { + if ($codebase && ($calling_method_id || $file_name)) { + $codebase->analyzer->addMixedMemberName( + strtolower($method_name), + $calling_method_id ?: $file_name + ); + } + + return null; + } + + return new MethodIdentifier( + $class_name, + strtolower($method_name) + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php new file mode 100644 index 00000000..afc0d2c1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php @@ -0,0 +1,92 @@ +value === $input_type_part->value; + } + + if ($container_type_part instanceof TTemplateParamClass + && get_class($input_type_part) === TClassString::class + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if ($container_type_part instanceof TClassString + && $container_type_part->as === 'object' + && !$container_type_part->as_type + ) { + return true; + } + + if ($input_type_part instanceof TClassString + && $input_type_part->as === 'object' + && !$input_type_part->as_type + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_scalar = true; + } + + return false; + } + + $fake_container_object = $container_type_part instanceof TClassString + && $container_type_part->as_type + ? $container_type_part->as_type + : new TNamedObject( + $container_type_part instanceof TClassString + ? $container_type_part->as + : $container_type_part->value + ); + + $fake_input_object = $input_type_part instanceof TClassString + && $input_type_part->as_type + ? $input_type_part->as_type + : new TNamedObject( + $input_type_part instanceof TClassString + ? $input_type_part->as + : $input_type_part->value + ); + + return AtomicTypeComparator::isContainedBy( + $codebase, + $fake_input_object, + $fake_container_object, + $allow_interface_equality, + false, + $atomic_comparison_result + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php new file mode 100644 index 00000000..8cd529c6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php @@ -0,0 +1,207 @@ +extra_types + && !$input_type_part instanceof TIterable + ) { + $container_type_part = new TGenericObject( + 'Traversable', + $container_type_part->type_params + ); + + $container_was_iterable = true; + } + + if (!$input_type_part instanceof TNamedObject && !$input_type_part instanceof TIterable) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_mixed = true; + } + + return false; + } + + $container_type_params_covariant = []; + + $input_type_params = TemplateStandinTypeReplacer::getMappedGenericTypeParams( + $codebase, + $input_type_part, + $container_type_part, + $container_type_params_covariant + ); + + foreach ($input_type_params as $i => $input_param) { + if (!isset($container_type_part->type_params[$i])) { + break; + } + + $container_param = $container_type_part->type_params[$i]; + + if ($input_param->isEmpty()) { + if ($atomic_comparison_result) { + if (!$atomic_comparison_result->replacement_atomic_type) { + $atomic_comparison_result->replacement_atomic_type = clone $input_type_part; + } + + if ($atomic_comparison_result->replacement_atomic_type instanceof TGenericObject) { + /** @psalm-suppress PropertyTypeCoercion */ + $atomic_comparison_result->replacement_atomic_type->type_params[$i] + = clone $container_param; + } + } + + continue; + } + + $param_comparison_result = new TypeComparisonResult(); + + if (!UnionTypeComparator::isContainedBy( + $codebase, + $input_param, + $container_param, + $input_param->ignore_nullable_issues, + $input_param->ignore_falsable_issues, + $param_comparison_result, + $allow_interface_equality + )) { + if ($input_type_part->value === 'Generator' + && $i === 2 + && $param_comparison_result->type_coerced_from_mixed + ) { + continue; + } + + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced + = $param_comparison_result->type_coerced === true + && $atomic_comparison_result->type_coerced !== false; + + $atomic_comparison_result->type_coerced_from_mixed + = $param_comparison_result->type_coerced_from_mixed === true + && $atomic_comparison_result->type_coerced_from_mixed !== false; + + $atomic_comparison_result->type_coerced_from_as_mixed + = !$container_was_iterable + && $param_comparison_result->type_coerced_from_as_mixed === true + && $atomic_comparison_result->type_coerced_from_as_mixed !== false; + + $atomic_comparison_result->to_string_cast + = $param_comparison_result->to_string_cast === true + && $atomic_comparison_result->to_string_cast !== false; + + $atomic_comparison_result->type_coerced_from_scalar + = $param_comparison_result->type_coerced_from_scalar === true + && $atomic_comparison_result->type_coerced_from_scalar !== false; + + $atomic_comparison_result->scalar_type_match_found + = $param_comparison_result->scalar_type_match_found === true + && $atomic_comparison_result->scalar_type_match_found !== false; + } + + // if the container was an iterable then there was no mapping + // from a template type + if ($container_was_iterable || !$param_comparison_result->type_coerced_from_as_mixed) { + $all_types_contain = false; + } + } elseif (!$input_type_part instanceof TIterable + && !$container_type_part instanceof TIterable + && !$container_param->hasTemplate() + && !$input_param->hasTemplate() + ) { + if ($input_param->containsAnyLiteral()) { + if ($atomic_comparison_result) { + if (!$atomic_comparison_result->replacement_atomic_type) { + $atomic_comparison_result->replacement_atomic_type = clone $input_type_part; + } + + if ($atomic_comparison_result->replacement_atomic_type instanceof TGenericObject) { + /** @psalm-suppress PropertyTypeCoercion */ + $atomic_comparison_result->replacement_atomic_type->type_params[$i] + = clone $container_param; + } + } + } else { + if (!($container_type_params_covariant[$i] ?? false) + && !$container_param->had_template + ) { + // Make sure types are basically the same + if (!UnionTypeComparator::isContainedBy( + $codebase, + $container_param, + $input_param, + $container_param->ignore_nullable_issues, + $container_param->ignore_falsable_issues, + $param_comparison_result, + $allow_interface_equality + ) || $param_comparison_result->type_coerced + ) { + if ($container_param->hasFormerStaticObject() + && $input_param->isFormerStaticObject() + && UnionTypeComparator::isContainedBy( + $codebase, + $input_param, + $container_param, + $container_param->ignore_nullable_issues, + $container_param->ignore_falsable_issues, + $param_comparison_result, + $allow_interface_equality + ) + ) { + // do nothing + } else { + if ($container_param->hasMixed() || $container_param->isArrayKey()) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced_from_mixed = true; + } + } else { + $all_types_contain = false; + } + + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = false; + } + } + } + } + } + } + } + + if ($all_types_contain) { + if ($atomic_comparison_result) { + $atomic_comparison_result->to_string_cast = false; + } + + return true; + } + + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php new file mode 100644 index 00000000..486a4df8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php @@ -0,0 +1,180 @@ +min_bound === null; + $is_input_max = $input_type_part->max_bound === null; + $is_container_min = $container_type_part->min_bound === null; + $is_container_max = $container_type_part->max_bound === null; + + $is_input_min_in_container = ( + $is_container_min || + (!$is_input_min && $container_type_part->min_bound <= $input_type_part->min_bound) + ); + $is_input_max_in_container = ( + $is_container_max || + (!$is_input_max && $container_type_part->max_bound >= $input_type_part->max_bound) + ); + return $is_input_min_in_container && $is_input_max_in_container; + } + + /** + * This method is used to check if an integer range can be contained by multiple int types + * Worst case scenario, the input is `int<-50,max>` and container is `-50|int<-49,50>|positive-int|57` + */ + public static function isContainedByUnion( + TIntRange $input_type_part, + Union $container_type + ): bool { + $container_atomic_types = $container_type->getAtomicTypes(); + $reduced_range = clone $input_type_part; + + if (isset($container_atomic_types['int'])) { + if (get_class($container_atomic_types['int']) === TInt::class) { + return true; + } + + if (get_class($container_atomic_types['int']) === TNonspecificLiteralInt::class) { + return true; + } + + if (get_class($container_atomic_types['int']) === TPositiveInt::class) { + if ($input_type_part->isPositive()) { + return true; + } + + //every positive integer is satisfied by the positive-int int container so we reduce the range + $reduced_range->max_bound = 0; + unset($container_atomic_types['int']); + } else { + throw new UnexpectedValueException('Should not happen: unknown int key'); + } + } + + $new_nb_atomics = count($container_atomic_types); + //loop until we get to a stable situation. Either we can't remove atomics or we have a definite result + do { + $nb_atomics = $new_nb_atomics; + $result_reduction = self::reduceRangeIncrementally($container_atomic_types, $reduced_range); + $new_nb_atomics = count($container_atomic_types); + } while ($result_reduction === null && $nb_atomics !== $new_nb_atomics); + + if ($result_reduction === null && $nb_atomics === 0) { + //the range could not be reduced enough and there is no more atomics, it's not contained + return false; + } + + return $result_reduction ?? false; + } + + /** + * This method receives an array of atomics from the container and a range. + * The goal is to use values in atomics in order to reduce the range. + * Once the range is empty, it means that every value in range was covered by some atomics combination + * @param array $container_atomic_types + */ + private static function reduceRangeIncrementally(array &$container_atomic_types, TIntRange $reduced_range): ?bool + { + foreach ($container_atomic_types as $key => $container_atomic_type) { + if ($container_atomic_type instanceof TIntRange) { + if (self::isContainedBy($reduced_range, $container_atomic_type)) { + if ($container_atomic_type->max_bound === null && $container_atomic_type->min_bound === null) { + //this container range covers any integer + return true; + } + if ($container_atomic_type->max_bound === null) { + //this container range is int + //X-1 becomes the max of our reduced range if it was higher + $reduced_range->max_bound = TIntRange::getNewLowestBound( + $container_atomic_type->min_bound - 1, + $reduced_range->max_bound ?? $container_atomic_type->min_bound - 1 + ); + unset($container_atomic_types[$key]); //we don't need this one anymore + continue; + } + if ($container_atomic_type->min_bound === null) { + //this container range is int + //X+1 becomes the min of our reduced range if it was lower + $reduced_range->min_bound = TIntRange::getNewHighestBound( + $container_atomic_type->max_bound + 1, + $reduced_range->min_bound ?? $container_atomic_type->max_bound + 1 + ); + unset($container_atomic_types[$key]); //we don't need this one anymore + continue; + } + //if the container range has no 'null' bound, it's more complex + //in this case, we can only reduce if the container include one bound of our reduced range + if ($reduced_range->min_bound !== null + && $container_atomic_type->contains($reduced_range->min_bound) + ) { + //this container range is int and contains the min of our reduced range. + //the min from our reduced range becomes Y + 1 + $reduced_range->min_bound = $container_atomic_type->max_bound + 1; + unset($container_atomic_types[$key]); //we don't need this one anymore + } elseif ($reduced_range->max_bound !== null + && $container_atomic_type->contains($reduced_range->max_bound)) { + //this container range is int and contains the max of our reduced range. + //the max from our reduced range becomes X - 1 + $reduced_range->max_bound = $container_atomic_type->min_bound - 1; + unset($container_atomic_types[$key]); //we don't need this one anymore + } + //there is probably a case here where we could unset containers when they're not at all in our range + } else { + //the range in input is wider than container, we return false + return false; + } + } elseif ($container_atomic_type instanceof TLiteralInt) { + if (!$reduced_range->contains($container_atomic_type->value)) { + unset($container_atomic_types[$key]); //we don't need this one anymore + } elseif ($reduced_range->min_bound === $container_atomic_type->value) { + $reduced_range->min_bound++; + unset($container_atomic_types[$key]); //we don't need this one anymore + } elseif ($reduced_range->max_bound === $container_atomic_type->value) { + $reduced_range->max_bound--; + unset($container_atomic_types[$key]); //we don't need this one anymore + } + } + } + + //there is probably a case here if we're left only with TLiteralInt where we could return false if there's less + //of them than numbers in the reduced range + + //there is also a case where if there's not TLiteralInt anymore and we're left with TIntRange that don't contain + //bounds from our reduced range where we could return false + + //if our reduced range has its min bound superior to its max bound, it means the container covers it all. + if ($reduced_range->min_bound !== null && + $reduced_range->max_bound !== null && + $reduced_range->min_bound > $reduced_range->max_bound + ) { + return true; + } + + //if we didn't return true or false before then the result is inconclusive for this round + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php new file mode 100644 index 00000000..bb42838b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php @@ -0,0 +1,166 @@ +properties as $key => $container_property_type) { + if (!isset($input_type_part->properties[$key])) { + if (!$container_property_type->possibly_undefined) { + $all_types_contain = false; + } + + continue; + } + + $input_property_type = $input_type_part->properties[$key]; + + $property_type_comparison = new TypeComparisonResult(); + + if (!$input_property_type->isEmpty()) { + if (!UnionTypeComparator::isContainedBy( + $codebase, + $input_property_type, + $container_property_type, + $input_property_type->ignore_nullable_issues, + $input_property_type->ignore_falsable_issues, + $property_type_comparison, + $allow_interface_equality + ) + && !$property_type_comparison->type_coerced_from_scalar + ) { + $inverse_property_type_comparison = new TypeComparisonResult(); + + if ($atomic_comparison_result) { + if (UnionTypeComparator::isContainedBy( + $codebase, + $container_property_type, + $input_property_type, + false, + false, + $inverse_property_type_comparison, + $allow_interface_equality + ) + || $inverse_property_type_comparison->type_coerced_from_scalar + ) { + $atomic_comparison_result->type_coerced = true; + } + } + + $all_types_contain = false; + } else { + if ($atomic_comparison_result) { + $atomic_comparison_result->to_string_cast + = $atomic_comparison_result->to_string_cast === true + || $property_type_comparison->to_string_cast === true; + } + } + } + } + return $all_types_contain; + } + + public static function isContainedByObjectWithProperties( + Codebase $codebase, + TNamedObject $input_type_part, + TObjectWithProperties $container_type_part, + bool $allow_interface_equality, + ?TypeComparisonResult $atomic_comparison_result + ): bool { + $all_types_contain = true; + + foreach ($container_type_part->properties as $property_name => $container_property_type) { + if (!is_string($property_name)) { + continue; + } + + if (!$codebase->classlikes->classOrInterfaceExists($input_type_part->value)) { + $all_types_contain = false; + + continue; + } + + if (!$codebase->properties->propertyExists( + $input_type_part->value . '::$' . $property_name, + true + )) { + $all_types_contain = false; + + continue; + } + + $property_declaring_class = (string) $codebase->properties->getDeclaringClassForProperty( + $input_type_part . '::$' . $property_name, + true + ); + + $class_storage = $codebase->classlike_storage_provider->get($property_declaring_class); + + $input_property_storage = $class_storage->properties[$property_name]; + + $input_property_type = $input_property_storage->type ?: Type::getMixed(); + + $property_type_comparison = new TypeComparisonResult(); + + if (!$input_property_type->isEmpty() + && !UnionTypeComparator::isContainedBy( + $codebase, + $input_property_type, + $container_property_type, + false, + false, + $property_type_comparison, + $allow_interface_equality + ) + && !$property_type_comparison->type_coerced_from_scalar + ) { + $inverse_property_type_comparison = new TypeComparisonResult(); + + if (UnionTypeComparator::isContainedBy( + $codebase, + $container_property_type, + $input_property_type, + false, + false, + $inverse_property_type_comparison, + $allow_interface_equality + ) + || $inverse_property_type_comparison->type_coerced_from_scalar + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + } + + $all_types_contain = false; + } + } + + return $all_types_contain; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php new file mode 100644 index 00000000..b7b4ff30 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php @@ -0,0 +1,311 @@ +extra_types ?: []; + $intersection_input_types[$input_type_part->getKey(false)] = $input_type_part; + + if ($input_type_part instanceof TTemplateParam) { + foreach ($input_type_part->as->getAtomicTypes() as $g) { + if ($g instanceof TNamedObject && $g->extra_types) { + $intersection_input_types = array_merge( + $intersection_input_types, + $g->extra_types + ); + } + } + } + + $intersection_container_types = $container_type_part->extra_types ?: []; + $intersection_container_types[$container_type_part->getKey(false)] = $container_type_part; + + if ($container_type_part instanceof TTemplateParam) { + foreach ($container_type_part->as->getAtomicTypes() as $g) { + if ($g instanceof TNamedObject && $g->extra_types) { + $intersection_container_types = array_merge( + $intersection_container_types, + $g->extra_types + ); + } + } + } + + foreach ($intersection_container_types as $container_type_key => $intersection_container_type) { + $container_was_static = false; + + if ($intersection_container_type instanceof TIterable) { + $intersection_container_type_lower = 'iterable'; + } elseif ($intersection_container_type instanceof TObjectWithProperties) { + $intersection_container_type_lower = 'object'; + } elseif ($intersection_container_type instanceof TTemplateParam) { + if (!$allow_interface_equality) { + if (isset($intersection_input_types[$container_type_key])) { + continue; + } + + foreach ($intersection_input_types as $intersection_input_type) { + if ($intersection_input_type instanceof TTemplateParam + && (strpos($intersection_container_type->defining_class, 'fn-') === 0 + || strpos($intersection_input_type->defining_class, 'fn-') === 0) + ) { + if (strpos($intersection_input_type->defining_class, 'fn-') === 0 + && strpos($intersection_container_type->defining_class, 'fn-') === 0 + && $intersection_input_type->defining_class + !== $intersection_container_type->defining_class + ) { + continue 2; + } + + foreach ($intersection_input_type->as->getAtomicTypes() as $input_as_atomic) { + if ($input_as_atomic->equals($intersection_container_type, false)) { + continue 3; + } + } + } elseif ($intersection_input_type instanceof TTemplateParam) { + $container_param = $intersection_container_type->param_name; + $container_class = $intersection_container_type->defining_class; + $input_class_like = $codebase->classlikes + ->getStorageFor($intersection_input_type->defining_class); + + if ($codebase->classlikes->traitExists($container_class) + && $input_class_like !== null + && isset( + $input_class_like->template_extended_params[$container_class][$container_param] + )) { + continue 2; + } + } + } + + return false; + } + + if ($intersection_container_type->as->isMixed()) { + continue; + } + + $intersection_container_type_lower = null; + + foreach ($intersection_container_type->as->getAtomicTypes() as $g) { + if ($g instanceof TNull) { + continue; + } + + if ($g instanceof TObject) { + continue 2; + } + + if (!$g instanceof TNamedObject) { + continue 2; + } + + $intersection_container_type_lower = strtolower($g->value); + } + + if ($intersection_container_type_lower === null) { + return false; + } + } else { + $container_was_static = $intersection_container_type->was_static; + + $intersection_container_type_lower = strtolower( + $codebase->classlikes->getUnAliasedName( + $intersection_container_type->value + ) + ); + } + + foreach ($intersection_input_types as $intersection_input_key => $intersection_input_type) { + $input_was_static = false; + + if ($intersection_input_type instanceof TIterable) { + $intersection_input_type_lower = 'iterable'; + } elseif ($intersection_input_type instanceof TObjectWithProperties) { + $intersection_input_type_lower = 'object'; + } elseif ($intersection_input_type instanceof TTemplateParam) { + if ($intersection_input_type->as->isMixed()) { + continue; + } + + $intersection_input_type_lower = null; + + foreach ($intersection_input_type->as->getAtomicTypes() as $g) { + if ($g instanceof TNull) { + continue; + } + + if (!$g instanceof TNamedObject) { + continue 2; + } + + $intersection_input_type_lower = strtolower($g->value); + } + + if ($intersection_input_type_lower === null) { + return false; + } + } else { + $input_was_static = $intersection_input_type->was_static; + + $intersection_input_type_lower = strtolower( + $codebase->classlikes->getUnAliasedName( + $intersection_input_type->value + ) + ); + } + + if ($intersection_container_type instanceof TTemplateParam + && $intersection_input_type instanceof TTemplateParam + ) { + if ($intersection_container_type->param_name !== $intersection_input_type->param_name + || ($intersection_container_type->defining_class + !== $intersection_input_type->defining_class + && strpos($intersection_input_type->defining_class, 'fn-') !== 0 + && strpos($intersection_container_type->defining_class, 'fn-') !== 0) + ) { + if (strpos($intersection_input_type->defining_class, 'fn-') !== 0) { + $input_class_storage = $codebase->classlike_storage_provider->get( + $intersection_input_type->defining_class + ); + + if (isset($input_class_storage->template_extended_params + [$intersection_container_type->defining_class] + [$intersection_container_type->param_name]) + ) { + continue; + } + } + + return false; + } + } + + if (!$intersection_container_type instanceof TTemplateParam + || $intersection_input_type instanceof TTemplateParam + ) { + if ($intersection_container_type_lower === $intersection_input_type_lower) { + if ($container_was_static + && !$input_was_static + && !$intersection_input_type instanceof TTemplateParam + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + continue; + } + + continue 2; + } + + if ($intersection_input_type_lower === 'generator' + && in_array($intersection_container_type_lower, ['iterator', 'traversable', 'iterable'], true) + ) { + continue 2; + } + + if ($intersection_container_type_lower === 'iterable') { + if ($intersection_input_type_lower === 'traversable' + || ($codebase->classlikes->classExists($intersection_input_type_lower) + && $codebase->classlikes->classImplements( + $intersection_input_type_lower, + 'Traversable' + )) + || ($codebase->classlikes->interfaceExists($intersection_input_type_lower) + && $codebase->classlikes->interfaceExtends( + $intersection_input_type_lower, + 'Traversable' + )) + ) { + continue 2; + } + } + + if ($intersection_input_type_lower === 'traversable' + && $intersection_container_type_lower === 'iterable' + ) { + continue 2; + } + + $input_type_is_interface = $codebase->interfaceExists($intersection_input_type_lower); + $container_type_is_interface = $codebase->interfaceExists($intersection_container_type_lower); + + if ($allow_interface_equality + && $container_type_is_interface + && ($input_type_is_interface || !isset($intersection_container_types[$intersection_input_key])) + ) { + continue 2; + } + + if (($codebase->classExists($intersection_input_type_lower) + || $codebase->classlikes->enumExists($intersection_input_type_lower)) + && $codebase->classOrInterfaceExists($intersection_container_type_lower) + && $codebase->classExtendsOrImplements( + $intersection_input_type_lower, + $intersection_container_type_lower + ) + ) { + if ($container_was_static && !$input_was_static) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + continue; + } + + continue 2; + } + + if ($input_type_is_interface + && $codebase->interfaceExtends( + $intersection_input_type_lower, + $intersection_container_type_lower + ) + ) { + continue 2; + } + } + + if (ExpressionAnalyzer::isMock($intersection_input_type_lower)) { + return true; + } + } + + return false; + } + + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php new file mode 100644 index 00000000..12b1dd95 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php @@ -0,0 +1,640 @@ +type_coerced = true; + } + + return false; + } + + if ($container_type_part instanceof TNonspecificLiteralString + && ($input_type_part instanceof TLiteralString || $input_type_part instanceof TNonspecificLiteralString) + ) { + return true; + } + + if ($container_type_part instanceof TNonspecificLiteralString) { + if ($input_type_part instanceof TString) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + } + + return false; + } + + if ($container_type_part instanceof TNonspecificLiteralInt + && ($input_type_part instanceof TLiteralInt + || $input_type_part instanceof TNonspecificLiteralInt) + ) { + return true; + } + + if ($container_type_part instanceof TNonspecificLiteralInt) { + if ($input_type_part instanceof TInt) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + } + + return false; + } + + if ($input_type_part instanceof TCallableString + && (get_class($container_type_part) === TSingleLetter::class + || get_class($container_type_part) === TNonEmptyString::class + || get_class($container_type_part) === TNonFalsyString::class + || get_class($container_type_part) === TLowercaseString::class) + ) { + return true; + } + + if (($container_type_part instanceof TLowercaseString + || $container_type_part instanceof TNonEmptyLowercaseString) + && $input_type_part instanceof TString + ) { + if (($input_type_part instanceof TLowercaseString + && $container_type_part instanceof TLowercaseString) + || ($input_type_part instanceof TNonEmptyLowercaseString + && $container_type_part instanceof TNonEmptyLowercaseString) + ) { + return true; + } + + if ($input_type_part instanceof TNonEmptyLowercaseString + && $container_type_part instanceof TLowercaseString + ) { + return true; + } + + if ($input_type_part instanceof TLowercaseString + && $container_type_part instanceof TNonEmptyLowercaseString + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if ($input_type_part instanceof TLiteralString) { + if (strtolower($input_type_part->value) === $input_type_part->value) { + return $input_type_part->value || $container_type_part instanceof TLowercaseString; + } + + return false; + } + + if ($input_type_part instanceof TClassString) { + return false; + } + + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if ($container_type_part instanceof TDependentGetClass) { + $first_type = $container_type_part->as_type->getSingleAtomic(); + + $container_type_part = new TClassString( + 'object', + $first_type instanceof TNamedObject ? $first_type : null + ); + } + + if ($input_type_part instanceof TDependentGetClass) { + $first_type = $input_type_part->as_type->getSingleAtomic(); + + if ($first_type instanceof TTemplateParam) { + $object_type = $first_type->as->getSingleAtomic(); + + $input_type_part = new TTemplateParamClass( + $first_type->param_name, + $first_type->as->getId(), + $object_type instanceof TNamedObject ? $object_type : null, + $first_type->defining_class + ); + } else { + $input_type_part = new TClassString( + 'object', + $first_type instanceof TNamedObject ? $first_type : null + ); + } + } + + if ($input_type_part instanceof TDependentGetType) { + $input_type_part = new TString(); + + if ($container_type_part instanceof TLiteralString) { + return isset(ClassLikeAnalyzer::GETTYPE_TYPES[$container_type_part->value]); + } + } + + if ($container_type_part instanceof TDependentGetDebugType) { + return $input_type_part instanceof TString; + } + + if ($input_type_part instanceof TDependentGetDebugType) { + $input_type_part = new TString(); + } + + if ($container_type_part instanceof TDependentGetType) { + $container_type_part = new TString(); + + if ($input_type_part instanceof TLiteralString) { + return isset(ClassLikeAnalyzer::GETTYPE_TYPES[$input_type_part->value]); + } + } + + if ($input_type_part instanceof TFalse + && $container_type_part instanceof TBool + && !($container_type_part instanceof TTrue) + ) { + return true; + } + + if ($input_type_part instanceof TTrue + && $container_type_part instanceof TBool + && !($container_type_part instanceof TFalse) + ) { + return true; + } + + // from https://wiki.php.net/rfc/scalar_type_hints_v5: + // + // > int types can resolve a parameter type of float + if ($input_type_part instanceof TInt + && $container_type_part instanceof TFloat + && !$container_type_part instanceof TLiteralFloat + && $allow_float_int_equality + ) { + return true; + } + + if ($container_type_part instanceof TArrayKey + && $input_type_part instanceof TNumeric + ) { + return true; + } + + if ($container_type_part instanceof TArrayKey + && ($input_type_part instanceof TInt + || $input_type_part instanceof TString + || $input_type_part instanceof TTemplateKeyOf) + ) { + return true; + } + + if ($input_type_part instanceof TTemplateKeyOf) { + foreach ($input_type_part->as->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TArray) { + /** @var Scalar $array_key_atomic */ + foreach ($atomic_type->type_params[0]->getAtomicTypes() as $array_key_atomic) { + if (!self::isContainedBy( + $codebase, + $array_key_atomic, + $container_type_part, + $allow_interface_equality, + $allow_float_int_equality, + $atomic_comparison_result + )) { + return false; + } + } + } + } + + return true; + } + + if ($input_type_part instanceof TArrayKey && + ($container_type_part instanceof TInt || $container_type_part instanceof TString) + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_mixed = true; + $atomic_comparison_result->scalar_type_match_found = true; + } + + return false; + } + + if ($container_type_part instanceof TScalar && $input_type_part instanceof Scalar) { + return true; + } + + if (get_class($container_type_part) === TDependentListKey::class + && ($input_type_part instanceof TLiteralInt + || $input_type_part instanceof TPositiveInt) + ) { + return true; + } + + if (get_class($container_type_part) === TFloat::class && $input_type_part instanceof TLiteralFloat) { + return true; + } + + if ((get_class($container_type_part) === TNonEmptyString::class + || get_class($container_type_part) === TNonEmptyNonspecificLiteralString::class) + && $input_type_part instanceof TNonFalsyString + ) { + return true; + } + + if ($container_type_part instanceof TNonFalsyString + && $input_type_part instanceof TNonFalsyString + ) { + return true; + } + + if ($container_type_part instanceof TNonFalsyString + && ($input_type_part instanceof TNonEmptyString + || $input_type_part instanceof TNonEmptyNonspecificLiteralString) + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if ($container_type_part instanceof TNonEmptyString + && $input_type_part instanceof TLiteralString + && $input_type_part->value === '' + ) { + return false; + } + + if ($container_type_part instanceof TNonFalsyString + && $input_type_part instanceof TLiteralString + && $input_type_part->value === '0' + ) { + return false; + } + + if ((get_class($container_type_part) === TNonEmptyString::class + || get_class($container_type_part) === TNonFalsyString::class + || get_class($container_type_part) === TSingleLetter::class) + && $input_type_part instanceof TLiteralString + ) { + return true; + } + + if (get_class($container_type_part) === TDependentListKey::class + && $input_type_part instanceof TInt + ) { + return true; + } + + if ((get_class($input_type_part) === TInt::class && $container_type_part instanceof TLiteralInt) + || (get_class($input_type_part) === TPositiveInt::class + && $container_type_part instanceof TLiteralInt + && $container_type_part->value > 0) + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_scalar = true; + } + + return false; + } + + if ($input_type_part instanceof TIntRange && $container_type_part instanceof TIntRange) { + return IntegerRangeComparator::isContainedBy( + $input_type_part, + $container_type_part + ); + } + + if ($input_type_part instanceof TInt && $container_type_part instanceof TPositiveInt) { + if ($input_type_part instanceof TPositiveInt) { + return true; + } + if ($input_type_part instanceof TLiteralInt) { + return $input_type_part->value > 0; + } + if ($input_type_part instanceof TIntRange) { + return $input_type_part->isPositive(); + } + + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_scalar = true; + } + + return false; + } + + if ($input_type_part instanceof TInt && $container_type_part instanceof TIntRange) { + if ($input_type_part instanceof TPositiveInt) { + if ($container_type_part->min_bound > 1) { + //any positive int can't be pushed inside a range with a min > 1 + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_scalar = true; + } + + return false; + } + + if ($container_type_part->max_bound !== null) { + //any positive int can't be pushed inside a range where the max bound isn't max without coercion + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_scalar = true; + } + + return false; + } + + return true; + } + if ($input_type_part instanceof TLiteralInt) { + $min_bound = $container_type_part->min_bound; + $max_bound = $container_type_part->max_bound; + + return + ($min_bound === null || $min_bound <= $input_type_part->value) && + ($max_bound === null || $max_bound >= $input_type_part->value); + } + + //any int can't be pushed inside a range without coercion (unless the range is from min to max) + if ($container_type_part->min_bound !== null || $container_type_part->max_bound !== null) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_scalar = true; + } + } + + return false; + } + + if (get_class($input_type_part) === TFloat::class && $container_type_part instanceof TLiteralFloat) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_scalar = true; + } + + return false; + } + + if ((get_class($input_type_part) === TString::class + || get_class($input_type_part) === TSingleLetter::class + || $input_type_part instanceof TNonEmptyString + || $input_type_part instanceof TNonspecificLiteralString) + && $container_type_part instanceof TLiteralString + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_scalar = true; + } + + return false; + } + + if (($input_type_part instanceof TLowercaseString + || $input_type_part instanceof TNonEmptyLowercaseString) + && $container_type_part instanceof TLiteralString + && strtolower($container_type_part->value) === $container_type_part->value + ) { + if ($atomic_comparison_result + && ($container_type_part->value) + ) { + $atomic_comparison_result->type_coerced = true; + $atomic_comparison_result->type_coerced_from_scalar = true; + } + + return false; + } + + if (($container_type_part instanceof TClassString || $container_type_part instanceof TLiteralClassString) + && ($input_type_part instanceof TClassString || $input_type_part instanceof TLiteralClassString) + ) { + return ClassLikeStringComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $atomic_comparison_result + ); + } + + if ($container_type_part instanceof TString && $input_type_part instanceof TTraitString) { + return true; + } + + if ($container_type_part instanceof TTraitString + && (get_class($input_type_part) === TString::class + || $input_type_part instanceof TNonEmptyString + || $input_type_part instanceof TNonEmptyNonspecificLiteralString) + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if (($input_type_part instanceof TClassString + || $input_type_part instanceof TLiteralClassString) + && (get_class($container_type_part) === TSingleLetter::class + || get_class($container_type_part) === TNonEmptyString::class + || get_class($container_type_part) === TNonFalsyString::class) + ) { + return true; + } + + if ($input_type_part instanceof TNumericString + && get_class($container_type_part) === TNonEmptyString::class + ) { + return true; + } + + if ($container_type_part instanceof TString + && ($input_type_part instanceof TNumericString + || $input_type_part instanceof THtmlEscapedString) + ) { + if ($container_type_part instanceof TLiteralString) { + if (is_numeric($container_type_part->value) && $atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + return true; + } + + if ($input_type_part instanceof TString + && ($container_type_part instanceof TNumericString + || $container_type_part instanceof THtmlEscapedString) + ) { + if ($input_type_part instanceof TLiteralString) { + return is_numeric($input_type_part->value); + } + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if ($container_type_part instanceof TCallableString + && $input_type_part instanceof TLiteralString + ) { + $input_callable = CallableTypeComparator::getCallableFromAtomic($codebase, $input_type_part); + $container_callable = CallableTypeComparator::getCallableFromAtomic($codebase, $container_type_part); + + if ($input_callable && $container_callable) { + if (CallableTypeComparator::isContainedBy( + $codebase, + $input_callable, + $container_callable, + $atomic_comparison_result ?? new TypeComparisonResult() + ) === false + ) { + return false; + } + } + + if (!$input_callable) { + //we could not find a callable for the input type, so the input is not contained in the container + return false; + } + + return true; + } + + if ($input_type_part instanceof TLowercaseString + && get_class($container_type_part) === TNonEmptyString::class) { + return false; + } + + if ($input_type_part->getKey() === $container_type_part->getKey()) { + return true; + } + + if (($container_type_part instanceof TClassString + || $container_type_part instanceof TLiteralClassString + || $container_type_part instanceof TCallableString) + && $input_type_part instanceof TString + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->type_coerced = true; + } + + return false; + } + + if ($container_type_part instanceof TNumeric + && $input_type_part->isNumericType() + ) { + return true; + } + + if ($input_type_part instanceof TNumeric) { + if ($container_type_part->isNumericType()) { + if ($atomic_comparison_result) { + $atomic_comparison_result->scalar_type_match_found = true; + } + } + } + + if ($input_type_part instanceof Scalar) { + if (!$container_type_part instanceof TLiteralInt + && !$container_type_part instanceof TLiteralString + && !$container_type_part instanceof TLiteralFloat + ) { + if ($atomic_comparison_result) { + $atomic_comparison_result->scalar_type_match_found = true; + } + } + } + + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php new file mode 100644 index 00000000..5fbe29af --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php @@ -0,0 +1,43 @@ +isMixed()) { + return true; + } + + if ($input_type->isNever()) { + return true; + } + + if ($union_comparison_result) { + $union_comparison_result->scalar_type_match_found = true; + } + + if ($input_type->possibly_undefined + && !$input_type->possibly_undefined_from_try + && !$container_type->possibly_undefined + ) { + return false; + } + + if ($container_type->hasMixed() && !$container_type->isEmptyMixed()) { + return true; + } + + $container_has_template = $container_type->hasTemplateOrStatic(); + + $input_atomic_types = array_reverse(self::getTypeParts($codebase, $input_type)); + + while ($input_type_part = array_pop($input_atomic_types)) { + if ($input_type_part instanceof TNull && $ignore_null) { + continue; + } + + if ($input_type_part instanceof TFalse && $ignore_false) { + continue; + } + + if ($input_type_part instanceof TTemplateParam + && !$container_has_template + && !$input_type_part->extra_types + ) { + $input_atomic_types = array_merge($input_type_part->as->getAtomicTypes(), $input_atomic_types); + continue; + } + + + $type_match_found = false; + $scalar_type_match_found = false; + $all_to_string_cast = true; + + $all_type_coerced = null; + $all_type_coerced_from_mixed = null; + $all_type_coerced_from_as_mixed = null; + + $some_type_coerced = false; + $some_type_coerced_from_mixed = false; + + if ($input_type_part instanceof TArrayKey + && ($container_type->hasInt() && $container_type->hasString()) + ) { + continue; + } + + if ($input_type_part instanceof TArrayKey && $container_type->hasTemplate()) { + foreach ($container_type->getTemplateTypes() as $template_type) { + if ($template_type->as->isArrayKey()) { + continue 2; + } + } + } + + if ($input_type_part instanceof TIntRange && $container_type->hasInt()) { + if (IntegerRangeComparator::isContainedByUnion( + $input_type_part, + $container_type + )) { + continue; + } + } + + foreach (self::getTypeParts($codebase, $container_type) as $container_type_part) { + if ($ignore_null + && $container_type_part instanceof TNull + && !$input_type_part instanceof TNull + ) { + continue; + } + + if ($ignore_false + && $container_type_part instanceof TFalse + && !$input_type_part instanceof TFalse + ) { + continue; + } + + if ($union_comparison_result) { + $atomic_comparison_result = new TypeComparisonResult(); + } else { + $atomic_comparison_result = null; + } + + $is_atomic_contained_by = AtomicTypeComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $allow_interface_equality, + $allow_float_int_equality, + $atomic_comparison_result + ); + + if ($input_type_part instanceof TMixed + && $input_type->from_template_default + && $input_type->from_docblock + && $atomic_comparison_result + && $atomic_comparison_result->type_coerced_from_mixed + ) { + $atomic_comparison_result->type_coerced_from_as_mixed = true; + } + + if ($atomic_comparison_result) { + if ($atomic_comparison_result->scalar_type_match_found !== null) { + $scalar_type_match_found = $atomic_comparison_result->scalar_type_match_found; + } + + if ($union_comparison_result + && $atomic_comparison_result->type_coerced_from_scalar !== null + ) { + $union_comparison_result->type_coerced_from_scalar + = $atomic_comparison_result->type_coerced_from_scalar; + } + + if ($is_atomic_contained_by + && $union_comparison_result + && $atomic_comparison_result->replacement_atomic_type + ) { + if (!$union_comparison_result->replacement_union_type) { + $union_comparison_result->replacement_union_type = clone $input_type; + } + + $union_comparison_result->replacement_union_type->removeType($input_type->getKey()); + + $union_comparison_result->replacement_union_type->addType( + $atomic_comparison_result->replacement_atomic_type + ); + } + } + + if ($input_type_part instanceof TNumeric + && $container_type->hasString() + && $container_type->hasInt() + && $container_type->hasFloat() + ) { + $scalar_type_match_found = false; + $is_atomic_contained_by = true; + } + + if ($atomic_comparison_result) { + if ($atomic_comparison_result->type_coerced) { + $some_type_coerced = true; + } + + if ($atomic_comparison_result->type_coerced_from_mixed) { + $some_type_coerced_from_mixed = true; + } + + if ($atomic_comparison_result->type_coerced !== true || $all_type_coerced === false) { + $all_type_coerced = false; + } else { + $all_type_coerced = true; + } + + if ($atomic_comparison_result->type_coerced_from_mixed !== true + || $all_type_coerced_from_mixed === false + ) { + $all_type_coerced_from_mixed = false; + } else { + $all_type_coerced_from_mixed = true; + } + + if ($atomic_comparison_result->type_coerced_from_as_mixed !== true + || $all_type_coerced_from_as_mixed === false + ) { + $all_type_coerced_from_as_mixed = false; + } else { + $all_type_coerced_from_as_mixed = true; + } + } + + if ($is_atomic_contained_by) { + $type_match_found = true; + + if ($atomic_comparison_result) { + if ($atomic_comparison_result->to_string_cast !== true) { + $all_to_string_cast = false; + } + } + + $all_type_coerced_from_mixed = false; + $all_type_coerced_from_as_mixed = false; + $all_type_coerced = false; + } + } + + if ($union_comparison_result) { + // only set this flag if we're definite that the only + // reason the type match has been found is because there + // was a __toString cast + if ($all_to_string_cast && $type_match_found) { + $union_comparison_result->to_string_cast = true; + } + + if ($all_type_coerced) { + $union_comparison_result->type_coerced = true; + } + + if ($all_type_coerced_from_mixed) { + $union_comparison_result->type_coerced_from_mixed = true; + + if (($input_type->from_template_default && $input_type->from_docblock) + || $all_type_coerced_from_as_mixed + ) { + $union_comparison_result->type_coerced_from_as_mixed = true; + } + } + } + + if (!$type_match_found) { + if ($union_comparison_result) { + if ($some_type_coerced) { + $union_comparison_result->type_coerced = true; + } + + if ($some_type_coerced_from_mixed) { + $union_comparison_result->type_coerced_from_mixed = true; + + if (($input_type->from_template_default && $input_type->from_docblock) + || $all_type_coerced_from_as_mixed + ) { + $union_comparison_result->type_coerced_from_as_mixed = true; + } + } + + if (!$scalar_type_match_found) { + $union_comparison_result->scalar_type_match_found = false; + } + } + + return false; + } + } + + return true; + } + + /** + * Used for comparing signature typehints, uses PHP's light contravariance rules + * + * + */ + public static function isContainedByInPhp( + ?Union $input_type, + Union $container_type + ): bool { + if ($container_type->isMixed()) { + return true; + } + + if (!$input_type) { + return false; + } + + if ($input_type->isNever()) { + return true; + } + + if ($input_type->getId() === $container_type->getId()) { + return true; + } + + if ($input_type->isNullable() && !$container_type->isNullable()) { + return false; + } + + $input_type_not_null = clone $input_type; + $input_type_not_null->removeType('null'); + + $container_type_not_null = clone $container_type; + $container_type_not_null->removeType('null'); + + if ($input_type_not_null->getId() === $container_type_not_null->getId()) { + return true; + } + + if ($input_type_not_null->hasArray() && $container_type_not_null->hasType('iterable')) { + return true; + } + + return false; + } + + /** + * Does the input param type match the given param type + */ + public static function canBeContainedBy( + Codebase $codebase, + Union $input_type, + Union $container_type, + bool $ignore_null = false, + bool $ignore_false = false, + array &$matching_input_keys = [] + ): bool { + if ($container_type->hasMixed()) { + return true; + } + + if ($input_type->isNever()) { + return true; + } + + if ($input_type->possibly_undefined && !$container_type->possibly_undefined) { + return false; + } + + foreach (self::getTypeParts($codebase, $container_type) as $container_type_part) { + if ($container_type_part instanceof TNull && $ignore_null) { + continue; + } + + if ($container_type_part instanceof TFalse && $ignore_false) { + continue; + } + + foreach (self::getTypeParts($codebase, $input_type) as $input_type_part) { + $atomic_comparison_result = new TypeComparisonResult(); + $is_atomic_contained_by = AtomicTypeComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + false, + false, + $atomic_comparison_result + ); + + if (($is_atomic_contained_by && !$atomic_comparison_result->to_string_cast) + || $atomic_comparison_result->type_coerced_from_mixed + ) { + $matching_input_keys[$input_type_part->getKey()] = true; + } + } + } + + return (bool)$matching_input_keys; + } + + /** + * Can any part of the $type1 be equal to any part of $type2 + * + */ + public static function canExpressionTypesBeIdentical( + Codebase $codebase, + Union $type1, + Union $type2, + bool $allow_interface_equality = true + ): bool { + if ($type1->hasMixed() || $type2->hasMixed()) { + return true; + } + + if ($type1->isNullable() && $type2->isNullable()) { + return true; + } + + foreach (self::getTypeParts($codebase, $type1) as $type1_part) { + foreach (self::getTypeParts($codebase, $type2) as $type2_part) { + //special cases for TIntRange because it can contain a part of the other type. + //For exemple int<0,1> and positive-int can be identical but none contain the other + if (($type1_part instanceof TIntRange && $type2_part instanceof TPositiveInt)) { + $intersection_range = TIntRange::intersectIntRanges( + TIntRange::convertToIntRange($type2_part), + $type1_part + ); + return $intersection_range !== null; + } + + if ($type2_part instanceof TIntRange && $type1_part instanceof TPositiveInt) { + $intersection_range = TIntRange::intersectIntRanges( + TIntRange::convertToIntRange($type1_part), + $type2_part + ); + return $intersection_range !== null; + } + + if ($type1_part instanceof TIntRange && $type2_part instanceof TIntRange) { + $intersection_range = TIntRange::intersectIntRanges( + $type1_part, + $type2_part + ); + return $intersection_range !== null; + } + + $either_contains = AtomicTypeComparator::canBeIdentical( + $codebase, + $type1_part, + $type2_part, + $allow_interface_equality + ); + + if ($either_contains) { + return true; + } + } + } + + return false; + } + + /** + * @return list + */ + private static function getTypeParts( + Codebase $codebase, + Union $union_type + ): array { + $atomic_types = []; + foreach ($union_type->getAtomicTypes() as $atomic_type) { + if (!$atomic_type instanceof TTypeAlias && !$atomic_type instanceof TClassConstant) { + $atomic_types[] = $atomic_type; + continue; + } + + if ($atomic_type instanceof TTypeAlias) { + $fq_classlike_name = $atomic_type->declaring_fq_classlike_name; + } else { + $fq_classlike_name = $atomic_type->fq_classlike_name; + } + + $expanded = TypeExpander::expandAtomic( + $codebase, + $atomic_type, + $fq_classlike_name, + $fq_classlike_name, + null, + true, + true + ); + if ($expanded instanceof Atomic) { + if (!$expanded instanceof TTypeAlias && !$expanded instanceof TClassConstant) { + $atomic_types[] = $expanded; + } + continue; + } + + array_push($atomic_types, ...$expanded); + } + + return $atomic_types; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php new file mode 100644 index 00000000..b3387f37 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php @@ -0,0 +1,425 @@ +> $template_type_map + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + public static function reconcile( + StatementsAnalyzer $statements_analyzer, + string $assertion, + bool $is_strict_equality, + bool $is_loose_equality, + Union $existing_var_type, + array $template_type_map, + string $old_var_type_string, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $inside_loop + ): Union { + $is_equality = $is_strict_equality || $is_loose_equality; + + // this is a specific value comparison type that cannot be negated + if ($is_equality && $bracket_pos = strpos($assertion, '(')) { + if ($existing_var_type->hasMixed()) { + return $existing_var_type; + } + + return self::handleLiteralNegatedEquality( + $statements_analyzer, + $assertion, + $bracket_pos, + $existing_var_type, + $old_var_type_string, + $key, + $negated, + $code_location, + $suppressed_issues, + $is_strict_equality + ); + } + + if ($is_equality && $assertion === 'positive-numeric') { + return $existing_var_type; + } + + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + if ($assertion === 'false' && isset($existing_var_atomic_types['bool'])) { + $existing_var_type->removeType('bool'); + $existing_var_type->addType(new TTrue); + } elseif ($assertion === 'true' && isset($existing_var_atomic_types['bool'])) { + $existing_var_type->removeType('bool'); + $existing_var_type->addType(new TFalse); + } else { + $simple_negated_type = SimpleNegatedAssertionReconciler::reconcile( + $statements_analyzer->getCodebase(), + $assertion, + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + $inside_loop + ); + + if ($simple_negated_type) { + return $simple_negated_type; + } + } + + if ($assertion === 'iterable' || $assertion === 'countable') { + $existing_var_type->removeType('array'); + } + + if (!$is_equality + && isset($existing_var_atomic_types['int']) + && $existing_var_type->from_calculation + && ($assertion === 'int' || $assertion === 'float') + ) { + $existing_var_type->removeType($assertion); + + if ($assertion === 'int') { + $existing_var_type->addType(new TFloat); + } else { + $existing_var_type->addType(new TInt); + } + + $existing_var_type->from_calculation = false; + + return $existing_var_type; + } + + if (!$is_equality + && ($assertion === 'DateTime' || $assertion === 'DateTimeImmutable') + && isset($existing_var_atomic_types['DateTimeInterface']) + ) { + $existing_var_type->removeType('DateTimeInterface'); + + if ($assertion === 'DateTime') { + $existing_var_type->addType(new TNamedObject('DateTimeImmutable')); + } else { + $existing_var_type->addType(new TNamedObject('DateTime')); + } + + return $existing_var_type; + } + + if (strtolower($assertion) === 'traversable' + && isset($existing_var_atomic_types['iterable']) + ) { + /** @var TIterable */ + $iterable = $existing_var_atomic_types['iterable']; + $existing_var_type->removeType('iterable'); + $existing_var_type->addType(new TArray( + [ + $iterable->type_params[0]->hasMixed() + ? Type::getArrayKey() + : clone $iterable->type_params[0], + clone $iterable->type_params[1], + ] + )); + } elseif (strtolower($assertion) === 'int' + && isset($existing_var_type->getAtomicTypes()['array-key']) + ) { + $existing_var_type->removeType('array-key'); + $existing_var_type->addType(new TString); + } elseif (strpos($assertion, 'getclass-') === 0) { + $assertion = substr($assertion, 9); + } elseif ($existing_var_type->isSingle() + && $existing_var_type->hasNamedObjectType() + && isset($existing_var_type->getAtomicTypes()[$assertion]) + ) { + // checking if two types share a common parent is not enough to guarantee childs are instanceof each other + // fall through + } elseif (!$is_equality) { + $codebase = $statements_analyzer->getCodebase(); + + // if there wasn't a direct hit, go deeper, eliminating subtypes + if (!$existing_var_type->removeType($assertion)) { + foreach ($existing_var_type->getAtomicTypes() as $part_name => $existing_var_type_part) { + if (!$existing_var_type_part->isObjectType() || strpos($assertion, '-')) { + continue; + } + + $assertion_type = Type::parseString($assertion, null, $template_type_map); + + if (!$assertion_type->isSingle()) { + continue; + } + + $new_type_part = $assertion_type->getSingleAtomic(); + + if (!$new_type_part instanceof TNamedObject) { + continue; + } + + if (AtomicTypeComparator::isContainedBy( + $codebase, + $existing_var_type_part, + $new_type_part, + false, + false + )) { + $existing_var_type->removeType($part_name); + } elseif (AtomicTypeComparator::isContainedBy( + $codebase, + $new_type_part, + $existing_var_type_part, + false, + false + )) { + $existing_var_type->different = true; + } + } + } + } + + if ($is_strict_equality + && $assertion !== 'isset' + && ($key !== '$this' + || !($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer)) + ) { + $assertion = Type::parseString($assertion, null, $template_type_map); + + if ($key + && $code_location + && !UnionTypeComparator::canExpressionTypesBeIdentical( + $statements_analyzer->getCodebase(), + $existing_var_type, + $assertion + ) + ) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!=' . $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($existing_var_type->isUnionEmpty()) { + if ($key !== '$this' + || !($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer) + ) { + if ($key && $code_location && !$is_equality) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!' . $assertion, + false, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return new Union([new TEmptyMixed]); + } + + return $existing_var_type; + } + + /** + * @param string[] $suppressed_issues + * + */ + private static function handleLiteralNegatedEquality( + StatementsAnalyzer $statements_analyzer, + string $assertion, + int $bracket_pos, + Union $existing_var_type, + string $old_var_type_string, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + bool $is_strict_equality + ): Union { + $scalar_type = substr($assertion, 0, $bracket_pos); + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + $did_remove_type = false; + $did_match_literal_type = false; + + $scalar_var_type = null; + + if ($scalar_type === 'int') { + if ($existing_var_type->hasInt()) { + if ($existing_int_types = $existing_var_type->getLiteralInts()) { + if (!$existing_var_type->hasPositiveInt()) { + $did_match_literal_type = true; + } + + if (isset($existing_int_types[$assertion])) { + $existing_var_type->removeType($assertion); + + $did_remove_type = true; + } + } + } else { + $scalar_value = substr($assertion, $bracket_pos + 1, -1); + $scalar_var_type = Type::getInt(false, (int) $scalar_value); + } + } elseif ($scalar_type === 'string' + || $scalar_type === 'class-string' + || $scalar_type === 'interface-string' + || $scalar_type === 'trait-string' + || $scalar_type === 'callable-string' + ) { + if ($existing_var_type->hasString()) { + if ($existing_string_types = $existing_var_type->getLiteralStrings()) { + $did_match_literal_type = true; + + if (isset($existing_string_types[$assertion])) { + $existing_var_type->removeType($assertion); + + $did_remove_type = true; + } + } elseif ($assertion === 'string()') { + $existing_var_type->addType(new TNonEmptyString()); + } + } elseif ($scalar_type === 'string') { + $scalar_value = substr($assertion, $bracket_pos + 1, -1); + $scalar_var_type = Type::getString($scalar_value); + } + } elseif ($scalar_type === 'float') { + if ($existing_var_type->hasFloat()) { + if ($existing_float_types = $existing_var_type->getLiteralFloats()) { + $did_match_literal_type = true; + + if (isset($existing_float_types[$assertion])) { + $existing_var_type->removeType($assertion); + + $did_remove_type = true; + } + } + } else { + $scalar_value = substr($assertion, $bracket_pos + 1, -1); + $scalar_var_type = Type::getFloat((float) $scalar_value); + } + } elseif ($scalar_type === 'enum') { + [$fq_enum_name, $case_name] = explode('::', substr($assertion, $bracket_pos + 1, -1)); + + foreach ($existing_var_type->getAtomicTypes() as $atomic_key => $atomic_type) { + if (get_class($atomic_type) === TNamedObject::class + && $atomic_type->value === $fq_enum_name + ) { + $codebase = $statements_analyzer->getCodebase(); + + $enum_storage = $codebase->classlike_storage_provider->get($fq_enum_name); + + if (!$enum_storage->is_enum || !$enum_storage->enum_cases) { + $scalar_var_type = new Union([new TEnumCase($fq_enum_name, $case_name)]); + } else { + $existing_var_type->removeType($atomic_type->getKey()); + $did_remove_type = true; + + foreach ($enum_storage->enum_cases as $alt_case_name => $_) { + if ($alt_case_name === $case_name) { + continue; + } + + $existing_var_type->addType(new TEnumCase($fq_enum_name, $alt_case_name)); + } + } + } elseif ($atomic_type instanceof TEnumCase + && $atomic_type->value === $fq_enum_name + && $atomic_type->case_name !== $case_name + ) { + $did_match_literal_type = true; + } elseif ($atomic_key === $assertion) { + $existing_var_type->removeType($assertion); + $did_remove_type = true; + } + } + } + + if ($key && $code_location) { + if ($did_match_literal_type + && (!$did_remove_type || count($existing_var_atomic_types) === 1) + ) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!' . $assertion, + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } elseif ($scalar_var_type + && $is_strict_equality + && ($key !== '$this' + || !($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer)) + ) { + if (!UnionTypeComparator::canExpressionTypesBeIdentical( + $statements_analyzer->getCodebase(), + $existing_var_type, + $scalar_var_type + )) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!=' . $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + } + } + + return $existing_var_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php new file mode 100644 index 00000000..fa3f0b3b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php @@ -0,0 +1,43 @@ + + */ + public $children = []; + + /** + * @var null|ParseTree + */ + public $parent; + + /** + * @var bool + */ + public $possibly_undefined = false; + + public function __construct(?ParseTree $parent = null) + { + $this->parent = $parent; + } + + public function __destruct() + { + $this->parent = null; + } + + public function cleanParents(): void + { + foreach ($this->children as $child) { + $child->cleanParents(); + } + + $this->parent = null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php new file mode 100644 index 00000000..ae0b8cac --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php @@ -0,0 +1,21 @@ +value = $value; + $this->parent = $parent; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php new file mode 100644 index 00000000..3069d736 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php @@ -0,0 +1,12 @@ +condition = $condition; + $this->parent = $parent; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php new file mode 100644 index 00000000..5fc34640 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php @@ -0,0 +1,16 @@ +value = $value; + $this->parent = $parent; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php new file mode 100644 index 00000000..a38b8e73 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php @@ -0,0 +1,22 @@ +value = $value; + $this->parent = $parent; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php new file mode 100644 index 00000000..70251607 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php @@ -0,0 +1,12 @@ +value = $value; + $this->parent = $parent; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php new file mode 100644 index 00000000..4da6cf75 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php @@ -0,0 +1,27 @@ +value = $value; + $this->parent = $parent; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php new file mode 100644 index 00000000..a3a531e9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php @@ -0,0 +1,43 @@ +name = $name; + $this->byref = $byref; + $this->variadic = $variadic; + $this->parent = $parent; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php new file mode 100644 index 00000000..f21ef8e7 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php @@ -0,0 +1,22 @@ +value = $value; + $this->parent = $parent; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php new file mode 100644 index 00000000..47701b3c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php @@ -0,0 +1,12 @@ +param_name = $param_name; + $this->as = $as; + $this->parent = $parent; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php new file mode 100644 index 00000000..3a96b6cb --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php @@ -0,0 +1,22 @@ +param_name = $param_name; + $this->parent = $parent; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php new file mode 100644 index 00000000..1f8de487 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php @@ -0,0 +1,12 @@ +offset_start = $offset_start; + $this->offset_end = $offset_end; + $this->value = $value; + $this->parent = $parent; + $this->text = $text === $value ? null : $text; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php new file mode 100644 index 00000000..edad53cb --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php @@ -0,0 +1,842 @@ + */ + private $type_tokens; + + /** @var int */ + private $type_token_count; + + /** @var int */ + private $t = 0; + + /** + * @param list $type_tokens + */ + public function __construct(array $type_tokens) + { + $this->type_tokens = $type_tokens; + $this->type_token_count = count($type_tokens); + $this->parse_tree = new Root(); + $this->current_leaf = $this->parse_tree; + } + + public function create(): ParseTree + { + while ($this->t < $this->type_token_count) { + $type_token = $this->type_tokens[$this->t]; + + switch ($type_token[0]) { + case '<': + case '{': + case ']': + throw new TypeParseTreeException('Unexpected token ' . $type_token[0]); + + case '[': + $this->handleOpenSquareBracket(); + break; + + case '(': + $this->handleOpenRoundBracket(); + break; + + case ')': + $this->handleClosedRoundBracket(); + break; + + case '>': + do { + if ($this->current_leaf->parent === null) { + throw new TypeParseTreeException('Cannot parse generic type'); + } + + $this->current_leaf = $this->current_leaf->parent; + } while (!$this->current_leaf instanceof GenericTree); + + $this->current_leaf->terminated = true; + + break; + + case '}': + do { + if ($this->current_leaf->parent === null) { + throw new TypeParseTreeException('Cannot parse array type'); + } + + $this->current_leaf = $this->current_leaf->parent; + } while (!$this->current_leaf instanceof KeyedArrayTree); + + $this->current_leaf->terminated = true; + + break; + + case ',': + $this->handleComma(); + break; + + case '...': + case '=': + $this->handleEllipsisOrEquals($type_token); + break; + + case ':': + $this->handleColon(); + break; + + case ' ': + $this->handleSpace(); + break; + + case '?': + $this->handleQuestionMark(); + break; + + case '|': + $this->handleBar(); + break; + + case '&': + $this->handleAmpersand(); + break; + + case 'is': + case 'as': + $this->handleIsOrAs($type_token); + break; + + default: + $this->handleValue($type_token); + break; + } + + $this->t++; + } + + $this->parse_tree->cleanParents(); + + if ($this->current_leaf !== $this->parse_tree + && ($this->parse_tree instanceof GenericTree + || $this->parse_tree instanceof CallableTree + || $this->parse_tree instanceof KeyedArrayTree) + ) { + throw new TypeParseTreeException( + 'Unterminated bracket' + ); + } + + return $this->parse_tree; + } + + /** + * @param array{0: string, 1: int} $current_token + */ + private function createMethodParam(array $current_token, ParseTree $current_parent): void + { + $byref = false; + $variadic = false; + $has_default = false; + $default = ''; + + if ($current_token[0] === '&') { + $byref = true; + ++$this->t; + $current_token = $this->t < $this->type_token_count ? $this->type_tokens[$this->t] : null; + } elseif ($current_token[0] === '...') { + $variadic = true; + + ++$this->t; + $current_token = $this->t < $this->type_token_count ? $this->type_tokens[$this->t] : null; + } + + if (!$current_token || $current_token[0][0] !== '$') { + throw new TypeParseTreeException('Unexpected token after space'); + } + + $new_parent_leaf = new MethodParamTree( + $current_token[0], + $byref, + $variadic, + $current_parent + ); + + for ($j = $this->t + 1; $j < $this->type_token_count; ++$j) { + $ahead_type_token = $this->type_tokens[$j]; + + if ($ahead_type_token[0] === ',' + || ($ahead_type_token[0] === ')' && $this->type_tokens[$j - 1][0] !== '(') + ) { + $this->t = $j - 1; + break; + } + + if ($has_default) { + $default .= $ahead_type_token[0]; + } + + if ($ahead_type_token[0] === '=') { + $has_default = true; + continue; + } + + if ($j === $this->type_token_count - 1) { + throw new TypeParseTreeException('Unterminated method'); + } + } + + $new_parent_leaf->default = $default; + + if ($this->current_leaf !== $current_parent) { + $new_parent_leaf->children = [$this->current_leaf]; + array_pop($current_parent->children); + } + + $current_parent->children[] = $new_parent_leaf; + + $this->current_leaf = $new_parent_leaf; + } + + private function handleOpenSquareBracket(): void + { + if ($this->current_leaf instanceof Root) { + throw new TypeParseTreeException('Unexpected token ['); + } + + $indexed_access = false; + + $next_token = $this->t + 1 < $this->type_token_count ? $this->type_tokens[$this->t + 1] : null; + + if (!$next_token || $next_token[0] !== ']') { + $next_next_token = $this->t + 2 < $this->type_token_count ? $this->type_tokens[$this->t + 2] : null; + + if ($next_next_token !== null && $next_next_token[0] === ']') { + $indexed_access = true; + ++$this->t; + } else { + throw new TypeParseTreeException('Unexpected token ['); + } + } + + $current_parent = $this->current_leaf->parent; + + if ($indexed_access) { + if ($next_token === null) { + throw new TypeParseTreeException('Unexpected token ['); + } + + $new_parent_leaf = new IndexedAccessTree($next_token[0], $current_parent); + } else { + if ($this->current_leaf instanceof KeyedArrayPropertyTree) { + throw new TypeParseTreeException('Unexpected token ['); + } + + $new_parent_leaf = new GenericTree('array', $current_parent); + } + + $this->current_leaf->parent = $new_parent_leaf; + $new_parent_leaf->children = [$this->current_leaf]; + + if ($current_parent) { + array_pop($current_parent->children); + $current_parent->children[] = $new_parent_leaf; + } else { + $this->parse_tree = $new_parent_leaf; + } + + $this->current_leaf = $new_parent_leaf; + ++$this->t; + } + + private function handleOpenRoundBracket(): void + { + if ($this->current_leaf instanceof Value) { + throw new TypeParseTreeException('Unrecognised token ('); + } + + $new_parent = !$this->current_leaf instanceof Root ? $this->current_leaf : null; + + $new_leaf = new EncapsulationTree( + $new_parent + ); + + if ($this->current_leaf instanceof Root) { + $this->current_leaf = $this->parse_tree = $new_leaf; + return; + } + + if ($new_leaf->parent) { + $new_leaf->parent->children[] = $new_leaf; + } + + $this->current_leaf = $new_leaf; + } + + private function handleClosedRoundBracket(): void + { + $prev_token = $this->t > 0 ? $this->type_tokens[$this->t - 1] : null; + + if ($prev_token !== null + && $prev_token[0] === '(' + && $this->current_leaf instanceof CallableTree + ) { + return; + } + + do { + if ($this->current_leaf->parent === null) { + break; + } + + $this->current_leaf = $this->current_leaf->parent; + } while (!$this->current_leaf instanceof EncapsulationTree + && !$this->current_leaf instanceof CallableTree + && !$this->current_leaf instanceof MethodTree); + + if ($this->current_leaf instanceof EncapsulationTree + || $this->current_leaf instanceof CallableTree + ) { + $this->current_leaf->terminated = true; + } + } + + private function handleComma(): void + { + if ($this->current_leaf instanceof Root) { + throw new TypeParseTreeException('Unexpected token ,'); + } + + if (!$this->current_leaf->parent) { + throw new TypeParseTreeException('Cannot parse comma without a parent node'); + } + + $context_node = $this->current_leaf; + + if ($context_node instanceof GenericTree + || $context_node instanceof KeyedArrayTree + || $context_node instanceof CallableTree + || $context_node instanceof MethodTree + ) { + $context_node = $context_node->parent; + } + + while ($context_node + && !$context_node instanceof GenericTree + && !$context_node instanceof KeyedArrayTree + && !$context_node instanceof CallableTree + && !$context_node instanceof MethodTree + ) { + $context_node = $context_node->parent; + } + + if (!$context_node) { + throw new TypeParseTreeException('Cannot parse comma in non-generic/array type'); + } + + $this->current_leaf = $context_node; + } + + /** @param array{0: string, 1: int} $type_token */ + private function handleEllipsisOrEquals(array $type_token): void + { + $prev_token = $this->t > 0 ? $this->type_tokens[$this->t - 1] : null; + + if ($prev_token && ($prev_token[0] === '...' || $prev_token[0] === '=')) { + throw new TypeParseTreeException('Cannot have duplicate tokens'); + } + + $current_parent = $this->current_leaf->parent; + + if ($this->current_leaf instanceof MethodTree && $type_token[0] === '...') { + $this->createMethodParam($type_token, $this->current_leaf); + return; + } + + while ($current_parent + && !$current_parent instanceof CallableTree + && !$current_parent instanceof CallableParamTree + ) { + $this->current_leaf = $current_parent; + $current_parent = $current_parent->parent; + } + + if (!$current_parent) { + if ($this->current_leaf instanceof CallableTree + && $type_token[0] === '...' + ) { + $current_parent = $this->current_leaf; + } else { + throw new TypeParseTreeException('Unexpected token ' . $type_token[0]); + } + } + + if ($current_parent instanceof CallableParamTree) { + throw new TypeParseTreeException('Cannot have variadic param with a default'); + } + + $new_leaf = new CallableParamTree($current_parent); + $new_leaf->has_default = $type_token[0] === '='; + $new_leaf->variadic = $type_token[0] === '...'; + + if ($current_parent !== $this->current_leaf) { + $new_leaf->children = [$this->current_leaf]; + array_pop($current_parent->children); + } + $current_parent->children[] = $new_leaf; + + $this->current_leaf = $new_leaf; + } + + private function handleColon(): void + { + if ($this->current_leaf instanceof Root) { + throw new TypeParseTreeException('Unexpected token :'); + } + + $current_parent = $this->current_leaf->parent; + + if ($this->current_leaf instanceof CallableTree) { + $new_parent_leaf = new CallableWithReturnTypeTree($current_parent); + $this->current_leaf->parent = $new_parent_leaf; + $new_parent_leaf->children = [$this->current_leaf]; + + if ($current_parent) { + array_pop($current_parent->children); + $current_parent->children[] = $new_parent_leaf; + } else { + $this->parse_tree = $new_parent_leaf; + } + + $this->current_leaf = $new_parent_leaf; + return; + } + + if ($this->current_leaf instanceof MethodTree) { + $new_parent_leaf = new MethodWithReturnTypeTree($current_parent); + $this->current_leaf->parent = $new_parent_leaf; + $new_parent_leaf->children = [$this->current_leaf]; + + if ($current_parent) { + array_pop($current_parent->children); + $current_parent->children[] = $new_parent_leaf; + } else { + $this->parse_tree = $new_parent_leaf; + } + + $this->current_leaf = $new_parent_leaf; + return; + } + + if ($current_parent instanceof KeyedArrayPropertyTree) { + return; + } + + while (($current_parent instanceof UnionTree + || $current_parent instanceof CallableWithReturnTypeTree) + && $this->current_leaf->parent + ) { + $this->current_leaf = $this->current_leaf->parent; + $current_parent = $this->current_leaf->parent; + } + + if ($current_parent instanceof ConditionalTree) { + if (count($current_parent->children) > 1) { + throw new TypeParseTreeException('Cannot process colon in conditional twice'); + } + + $this->current_leaf = $current_parent; + return; + } + + if (!$current_parent) { + throw new TypeParseTreeException('Cannot process colon without parent'); + } + + if (!$this->current_leaf instanceof Value) { + throw new TypeParseTreeException('Unexpected LHS of property'); + } + + if (!$current_parent instanceof KeyedArrayTree) { + throw new TypeParseTreeException('Saw : outside of object-like array'); + } + + $prev_token = $this->t > 0 ? $this->type_tokens[$this->t - 1] : null; + + $new_parent_leaf = new KeyedArrayPropertyTree($this->current_leaf->value, $current_parent); + $new_parent_leaf->possibly_undefined = $prev_token !== null && $prev_token[0] === '?'; + array_pop($current_parent->children); + $current_parent->children[] = $new_parent_leaf; + + $this->current_leaf = $new_parent_leaf; + } + + private function handleSpace(): void + { + if ($this->current_leaf instanceof Root) { + throw new TypeParseTreeException('Unexpected space'); + } + + if ($this->current_leaf instanceof KeyedArrayTree) { + return; + } + + $current_parent = $this->current_leaf->parent; + + if ($current_parent instanceof CallableTree) { + return; + } + + while ($current_parent && !$current_parent instanceof MethodTree) { + $this->current_leaf = $current_parent; + $current_parent = $current_parent->parent; + } + + $next_token = $this->t + 1 < $this->type_token_count ? $this->type_tokens[$this->t + 1] : null; + + if (!$current_parent instanceof MethodTree || !$next_token) { + throw new TypeParseTreeException('Unexpected space'); + } + + ++$this->t; + + $this->createMethodParam($next_token, $current_parent); + } + + private function handleQuestionMark(): void + { + $next_token = $this->t + 1 < $this->type_token_count ? $this->type_tokens[$this->t + 1] : null; + + if ($next_token === null || $next_token[0] !== ':') { + while (($this->current_leaf instanceof Value + || $this->current_leaf instanceof UnionTree + || ($this->current_leaf instanceof KeyedArrayTree + && $this->current_leaf->terminated) + || ($this->current_leaf instanceof GenericTree + && $this->current_leaf->terminated) + || ($this->current_leaf instanceof EncapsulationTree + && $this->current_leaf->terminated) + || ($this->current_leaf instanceof CallableTree + && $this->current_leaf->terminated) + || $this->current_leaf instanceof IntersectionTree) + && $this->current_leaf->parent + ) { + $this->current_leaf = $this->current_leaf->parent; + } + + if ($this->current_leaf instanceof TemplateIsTree && $this->current_leaf->parent) { + $current_parent = $this->current_leaf->parent; + + $new_leaf = new ConditionalTree( + $this->current_leaf, + $this->current_leaf->parent + ); + + array_pop($current_parent->children); + $current_parent->children[] = $new_leaf; + $this->current_leaf = $new_leaf; + } else { + $new_parent = !$this->current_leaf instanceof Root ? $this->current_leaf : null; + + if (!$next_token) { + throw new TypeParseTreeException('Unexpected token ?'); + } + + $new_leaf = new NullableTree( + $new_parent + ); + + if ($this->current_leaf instanceof Root) { + $this->current_leaf = $this->parse_tree = $new_leaf; + return; + } + + if ($new_leaf->parent) { + $new_leaf->parent->children[] = $new_leaf; + } + + $this->current_leaf = $new_leaf; + } + } + } + + private function handleBar(): void + { + if ($this->current_leaf instanceof Root) { + throw new TypeParseTreeException('Unexpected token |'); + } + + $current_parent = $this->current_leaf->parent; + + if ($current_parent instanceof CallableWithReturnTypeTree) { + $this->current_leaf = $current_parent; + $current_parent = $current_parent->parent; + } + + if ($current_parent instanceof NullableTree) { + $this->current_leaf = $current_parent; + $current_parent = $current_parent->parent; + } + + if ($this->current_leaf instanceof UnionTree) { + throw new TypeParseTreeException('Unexpected token |'); + } + + if ($current_parent instanceof UnionTree) { + $this->current_leaf = $current_parent; + return; + } + + if ($current_parent instanceof IntersectionTree) { + $this->current_leaf = $current_parent; + $current_parent = $this->current_leaf->parent; + } + + if ($current_parent instanceof TemplateIsTree) { + $new_parent_leaf = new UnionTree($this->current_leaf); + $new_parent_leaf->children = [$this->current_leaf]; + $new_parent_leaf->parent = $current_parent; + } else { + $new_parent_leaf = new UnionTree($current_parent); + $new_parent_leaf->children = [$this->current_leaf]; + } + + if ($current_parent) { + array_pop($current_parent->children); + $current_parent->children[] = $new_parent_leaf; + } else { + $this->parse_tree = $new_parent_leaf; + } + + $this->current_leaf = $new_parent_leaf; + } + + private function handleAmpersand(): void + { + if ($this->current_leaf instanceof Root) { + throw new TypeParseTreeException( + 'Unexpected &' + ); + } + + $current_parent = $this->current_leaf->parent; + + if ($current_parent instanceof MethodTree) { + $this->createMethodParam($this->type_tokens[$this->t], $current_parent); + return; + } + + if ($current_parent instanceof IntersectionTree) { + $this->current_leaf = $current_parent; + return; + } + + $new_parent_leaf = new IntersectionTree($current_parent); + $new_parent_leaf->children = [$this->current_leaf]; + + if ($current_parent) { + array_pop($current_parent->children); + $current_parent->children[] = $new_parent_leaf; + } else { + $this->parse_tree = $new_parent_leaf; + } + + $this->current_leaf = $new_parent_leaf; + } + + /** @param array{0: string, 1: int} $type_token */ + private function handleIsOrAs(array $type_token): void + { + if ($this->t === 0) { + $this->handleValue($type_token); + } else { + $current_parent = $this->current_leaf->parent; + + if ($current_parent) { + array_pop($current_parent->children); + } + + if ($type_token[0] === 'as') { + $next_token = $this->t + 1 < $this->type_token_count ? $this->type_tokens[$this->t + 1] : null; + + if (!$this->current_leaf instanceof Value + || !$current_parent instanceof GenericTree + || !$next_token + ) { + throw new TypeParseTreeException('Unexpected token ' . $type_token[0]); + } + + $this->current_leaf = new TemplateAsTree( + $this->current_leaf->value, + $next_token[0], + $current_parent + ); + + $current_parent->children[] = $this->current_leaf; + ++$this->t; + } elseif ($this->current_leaf instanceof Value) { + $this->current_leaf = new TemplateIsTree( + $this->current_leaf->value, + $current_parent + ); + + if ($current_parent) { + $current_parent->children[] = $this->current_leaf; + } + } + } + } + + /** @param array{0: string, 1: int, 2?: string} $type_token */ + private function handleValue(array $type_token): void + { + $new_parent = !$this->current_leaf instanceof Root ? $this->current_leaf : null; + + if ($this->current_leaf instanceof MethodTree && $type_token[0][0] === '$') { + $this->createMethodParam($type_token, $this->current_leaf); + return; + } + + $next_token = $this->t + 1 < $this->type_token_count ? $this->type_tokens[$this->t + 1] : null; + + switch ($next_token[0] ?? null) { + case '<': + $new_leaf = new GenericTree( + $type_token[0], + $new_parent + ); + ++$this->t; + break; + + case '{': + $new_leaf = new KeyedArrayTree( + $type_token[0], + $new_parent + ); + ++$this->t; + break; + + case '(': + if (in_array( + $type_token[0], + ['callable', 'pure-callable', 'Closure', '\Closure', 'pure-Closure'], + true + )) { + $new_leaf = new CallableTree( + $type_token[0], + $new_parent + ); + } elseif ($type_token[0] !== 'array' + && $type_token[0][0] !== '\\' + && $this->current_leaf instanceof Root + ) { + $new_leaf = new MethodTree( + $type_token[0], + $new_parent + ); + } else { + throw new TypeParseTreeException( + 'Parenthesis must be preceded by “Closure”, “callable”, "pure-callable" or a valid @method name' + ); + } + + ++$this->t; + break; + + case '::': + $nexter_token = $this->t + 2 < $this->type_token_count ? $this->type_tokens[$this->t + 2] : null; + + if ($this->current_leaf instanceof ParseTree\KeyedArrayTree + && $nexter_token + && strtolower($nexter_token[0]) !== 'class' + ) { + throw new TypeParseTreeException( + ':: in array key is only allowed for ::class' + ); + } + + if (!$nexter_token + || (!preg_match('/^([a-zA-Z_][a-zA-Z_0-9]*\*?|\*)$/', $nexter_token[0]) + && strtolower($nexter_token[0]) !== 'class') + ) { + throw new TypeParseTreeException( + 'Invalid class constant ' . ($nexter_token[0] ?? '') + ); + } + + $new_leaf = new Value( + $type_token[0] . '::' . $nexter_token[0], + $type_token[1], + $type_token[1] + 2 + strlen($nexter_token[0]), + $type_token[2] ?? null, + $new_parent + ); + + $this->t += 2; + + break; + + default: + if ($type_token[0] === '$this') { + $type_token[0] = 'static'; + } + + $new_leaf = new Value( + $type_token[0], + $type_token[1], + $type_token[1] + strlen($type_token[0]), + $type_token[2] ?? null, + $new_parent + ); + break; + } + + if ($this->current_leaf instanceof Root) { + $this->current_leaf = $this->parse_tree = $new_leaf; + return; + } + + if ($new_leaf->parent) { + $new_leaf->parent->children[] = $new_leaf; + } + + $this->current_leaf = $new_leaf; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php new file mode 100644 index 00000000..0c46ef25 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php @@ -0,0 +1,2554 @@ +5` result is `int<6, max>`. + * Complex reconciliation takes part in AssertionReconciler if this class couldn't handle the reconciliation + */ +class SimpleAssertionReconciler extends Reconciler +{ + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + public static function reconcile( + string $assertion, + Codebase $codebase, + Union $existing_var_type, + ?string $key = null, + bool $negated = false, + ?CodeLocation $code_location = null, + array $suppressed_issues = [], + int &$failed_reconciliation = Reconciler::RECONCILIATION_OK, + bool $is_equality = false, + bool $is_strict_equality = false, + bool $inside_loop = false + ): ?Union { + if ($assertion === 'mixed' && $existing_var_type->hasMixed()) { + return $existing_var_type; + } + + $old_var_type_string = $existing_var_type->getId(); + + if ($assertion === 'isset') { + return self::reconcileIsset( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + $inside_loop + ); + } + + if ($assertion === 'array-key-exists') { + $existing_var_type->possibly_undefined = false; + + return $existing_var_type; + } + + if (strpos($assertion, 'in-array-') === 0) { + return self::reconcileInArray( + $codebase, + $existing_var_type, + substr($assertion, 9), + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation + ); + } + + if (strpos($assertion, 'has-array-key-') === 0) { + return self::reconcileHasArrayKey( + $existing_var_type, + substr($assertion, 14) + ); + } + + if ($assertion[0] === '>') { + return self::reconcileSuperiorTo( + $existing_var_type, + $assertion, + $inside_loop, + $old_var_type_string, + $key, + $negated, + $code_location, + $suppressed_issues + ); + } + + if ($assertion[0] === '<') { + return self::reconcileInferiorTo( + $existing_var_type, + $assertion, + $inside_loop, + $old_var_type_string, + $key, + $negated, + $code_location, + $suppressed_issues + ); + } + + if ($assertion === 'falsy' || $assertion === 'empty') { + return self::reconcileFalsyOrEmpty( + $assertion, + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + false + ); + } + + if ($assertion === 'object') { + return self::reconcileObject( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'resource') { + return self::reconcileResource( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'callable') { + return self::reconcileCallable( + $codebase, + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'iterable') { + return self::reconcileIterable( + $codebase, + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'array') { + return self::reconcileArray( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'list') { + return self::reconcileList( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + false + ); + } + + if ($assertion === 'non-empty-list') { + return self::reconcileList( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + true + ); + } + + if ($assertion === 'Traversable') { + return self::reconcileTraversable( + $codebase, + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'countable') { + return self::reconcileCountable( + $codebase, + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'string-array-access') { + return self::reconcileStringArrayAccess( + $codebase, + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $inside_loop + ); + } + + if ($assertion === 'int-or-string-array-access') { + return self::reconcileIntArrayAccess( + $codebase, + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $inside_loop + ); + } + + if ($assertion === 'numeric') { + return self::reconcileNumeric( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'scalar') { + return self::reconcileScalar( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'bool') { + return self::reconcileBool( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'string') { + return self::reconcileString( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + $is_strict_equality + ); + } + + if ($assertion === 'int') { + return self::reconcileInt( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + $is_strict_equality + ); + } + + if ($assertion === 'positive-numeric') { + return self::reconcilePositiveNumeric( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'float' + && $existing_var_type->from_calculation + && $existing_var_type->hasInt() + ) { + return Type::getFloat(); + } + + if ($assertion === 'float' && $is_equality && !$is_strict_equality && $existing_var_type->isString()) { + return Type::getNumericString(); + } + + if ($assertion === 'non-empty-countable') { + return self::reconcileNonEmptyCountable( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + null + ); + } + + if (strpos($assertion, 'has-at-least-') === 0) { + return self::reconcileNonEmptyCountable( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + (int) substr($assertion, 13) + ); + } + + if (strpos($assertion, 'has-exactly-') === 0) { + /** @psalm-suppress ArgumentTypeCoercion */ + return self::reconcileExactlyCountable( + $existing_var_type, + (int) substr($assertion, 12) + ); + } + + if (strpos($assertion, 'hasmethod-') === 0) { + return self::reconcileHasMethod( + $codebase, + substr($assertion, 10), + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation + ); + } + + if (substr($assertion, 0, 15) === 'class-constant(') { + return self::reconcileClassConstant( + $codebase, + substr($assertion, 15, -1), + $existing_var_type, + $failed_reconciliation + ); + } + + if ($existing_var_type->isSingle() + && $existing_var_type->hasTemplate() + && strpos($assertion, '-') === false + && strpos($assertion, '(') === false + ) { + foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TTemplateParam) { + if ($atomic_type->as->hasMixed() + || $atomic_type->as->hasObject() + ) { + $atomic_type->as = Type::parseString($assertion); + + return $existing_var_type; + } + } + } + } + + return null; + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileIsset( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality, + bool $inside_loop + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + // if key references an array offset + $did_remove_type = ($key && strpos($key, '[')) + || !$existing_var_type->initialized + || $existing_var_type->possibly_undefined + || $existing_var_type->ignore_isset; + + if ($existing_var_type->isNullable()) { + $existing_var_type->removeType('null'); + + $did_remove_type = true; + } + + if (!$existing_var_type->hasMixed() + && !$is_equality + && (!$did_remove_type || $existing_var_type->isUnionEmpty()) + && $key + && $code_location + ) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'isset', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + + if ($existing_var_type->isUnionEmpty()) { + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + return Type::getEmpty(); + } + } + + if ($existing_var_type->hasType('empty')) { + $existing_var_type->removeType('empty'); + $existing_var_type->addType(new TMixed($inside_loop)); + } + + $existing_var_type->from_property = false; + $existing_var_type->from_static_property = false; + $existing_var_type->possibly_undefined = false; + $existing_var_type->possibly_undefined_from_try = false; + $existing_var_type->ignore_isset = false; + + return $existing_var_type; + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileNonEmptyCountable( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality, + ?int $min_count + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + if ($existing_var_type->hasType('array')) { + $array_atomic_type = $existing_var_type->getAtomicTypes()['array']; + $did_remove_type = false; + + if ($array_atomic_type instanceof TArray) { + if (!$array_atomic_type instanceof TNonEmptyArray + || ($array_atomic_type->count < $min_count) + ) { + if ($array_atomic_type->getId() === 'array') { + $existing_var_type->removeType('array'); + } else { + $non_empty_array = new TNonEmptyArray( + $array_atomic_type->type_params + ); + + if ($min_count) { + $non_empty_array->count = $min_count; + } + + $existing_var_type->addType($non_empty_array); + } + + $did_remove_type = true; + } + } elseif ($array_atomic_type instanceof TList) { + if (!$array_atomic_type instanceof TNonEmptyList + || ($array_atomic_type->count < $min_count) + ) { + $non_empty_list = new TNonEmptyList( + $array_atomic_type->type_param + ); + + if ($min_count) { + $non_empty_list->count = $min_count; + } + + $did_remove_type = true; + $existing_var_type->addType($non_empty_list); + } + } elseif ($array_atomic_type instanceof TKeyedArray) { + foreach ($array_atomic_type->properties as $property_type) { + if ($property_type->possibly_undefined) { + $did_remove_type = true; + break; + } + } + } + + if (!$is_equality + && !$existing_var_type->hasMixed() + && (!$did_remove_type || $existing_var_type->isUnionEmpty()) + ) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'non-empty-countable', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + } + + return $existing_var_type; + } + + /** + * @param positive-int $count + */ + private static function reconcileExactlyCountable( + Union $existing_var_type, + int $count + ): Union { + if ($existing_var_type->hasType('array')) { + $array_atomic_type = $existing_var_type->getAtomicTypes()['array']; + + if ($array_atomic_type instanceof TArray) { + $non_empty_array = new TNonEmptyArray( + $array_atomic_type->type_params + ); + + $non_empty_array->count = $count; + + $existing_var_type->addType( + $non_empty_array + ); + } elseif ($array_atomic_type instanceof TList) { + $non_empty_list = new TNonEmptyList( + $array_atomic_type->type_param + ); + + $non_empty_list->count = $count; + + $existing_var_type->addType( + $non_empty_list + ); + } + } + + return $existing_var_type; + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcilePositiveNumeric( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + $did_remove_type = false; + + $positive_types = []; + + foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TLiteralInt) { + if ($atomic_type->value < 1) { + $did_remove_type = true; + } else { + $positive_types[] = $atomic_type; + } + } elseif ($atomic_type instanceof TPositiveInt) { + $positive_types[] = $atomic_type; + } elseif ($atomic_type instanceof TIntRange) { + if (!$atomic_type->isPositive()) { + $did_remove_type = true; + } + $positive_types[] = new TIntRange( + $atomic_type->min_bound === null ? 1 : max(1, $atomic_type->min_bound), + $atomic_type->max_bound === null ? null : max(1, $atomic_type->max_bound) + ); + } elseif (get_class($atomic_type) === TInt::class) { + $positive_types[] = new TPositiveInt(); + $did_remove_type = true; + } else { + // for now allow this check everywhere else + if (!$atomic_type instanceof TNull + && !$atomic_type instanceof TFalse + ) { + $positive_types[] = $atomic_type; + } + + $did_remove_type = true; + } + } + + if (!$is_equality + && !$existing_var_type->hasMixed() + && (!$did_remove_type || !$positive_types) + ) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'positive-numeric', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($positive_types) { + return new Union($positive_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileHasMethod( + Codebase $codebase, + string $method_name, + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + $object_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type instanceof TNamedObject + && $codebase->classOrInterfaceExists($type->value) + ) { + $object_types[] = $type; + + if (!$codebase->methodExists($type->value . '::' . $method_name)) { + $match_found = false; + + if ($type->extra_types) { + foreach ($type->extra_types as $extra_type) { + if ($extra_type instanceof TNamedObject + && $codebase->classOrInterfaceExists($extra_type->value) + && $codebase->methodExists($extra_type->value . '::' . $method_name) + ) { + $match_found = true; + } elseif ($extra_type instanceof TObjectWithProperties) { + $match_found = true; + + if (!isset($extra_type->methods[$method_name])) { + $extra_type->methods[$method_name] = 'object::' . $method_name; + $did_remove_type = true; + } + } + } + } + + if (!$match_found) { + $obj = new TObjectWithProperties( + [], + [$method_name => $type->value . '::' . $method_name] + ); + $type->extra_types[$obj->getKey()] = $obj; + $did_remove_type = true; + } + } + } elseif ($type instanceof TObjectWithProperties) { + $object_types[] = $type; + + if (!isset($type->methods[$method_name])) { + $type->methods[$method_name] = 'object::' . $method_name; + $did_remove_type = true; + } + } elseif ($type instanceof TObject || $type instanceof TMixed) { + $object_types[] = new TObjectWithProperties( + [], + [$method_name => 'object::' . $method_name] + ); + $did_remove_type = true; + } elseif ($type instanceof TString) { + // we don’t know + $object_types[] = $type; + $did_remove_type = true; + } elseif ($type instanceof TTemplateParam) { + $object_types[] = $type; + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if (!$object_types || !$did_remove_type) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'object with method ' . $method_name, + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($object_types) { + return new Union($object_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileString( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality, + bool $is_strict_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + if ($existing_var_type->hasMixed()) { + if ($is_equality && !$is_strict_equality) { + return $existing_var_type; + } + + return Type::getString(); + } + + $string_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type instanceof TString) { + $string_types[] = $type; + + if (get_class($type) === TString::class) { + $type->from_docblock = false; + } + } elseif ($type instanceof TCallable) { + $string_types[] = new TCallableString; + $did_remove_type = true; + } elseif ($type instanceof TNumeric) { + $string_types[] = new TNumericString; + $did_remove_type = true; + } elseif ($type instanceof TScalar || $type instanceof TArrayKey) { + $string_types[] = new TString; + $did_remove_type = true; + } elseif ($type instanceof TTemplateParam) { + if ($type->as->hasString() || $type->as->hasMixed() || $type->as->hasScalar()) { + $type = clone $type; + + $type->as = self::reconcileString( + $type->as, + null, + false, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + $is_strict_equality + ); + + $string_types[] = $type; + } + + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$did_remove_type || !$string_types) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'string', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($string_types) { + return new Union($string_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return $existing_var_type->from_docblock + ? Type::getMixed() + : Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileInt( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality, + bool $is_strict_equality + ): Union { + if ($existing_var_type->hasMixed()) { + if ($is_equality && !$is_strict_equality) { + return $existing_var_type; + } + + return Type::getInt(); + } + + $old_var_type_string = $existing_var_type->getId(); + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + $int_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type instanceof TInt) { + $int_types[] = $type; + + if (get_class($type) === TInt::class) { + $type->from_docblock = false; + } + + if ($existing_var_type->from_calculation) { + $did_remove_type = true; + } + } elseif ($type instanceof TNumeric) { + $int_types[] = new TInt; + $did_remove_type = true; + } elseif ($type instanceof TScalar || $type instanceof TArrayKey) { + $int_types[] = new TInt; + $did_remove_type = true; + } elseif ($type instanceof TTemplateParam) { + if ($type->as->hasInt() || $type->as->hasMixed()) { + $type = clone $type; + + $type->as = self::reconcileInt( + $type->as, + null, + false, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + $is_strict_equality + ); + + $int_types[] = $type; + } + + $did_remove_type = true; + } elseif ($type instanceof TString && $is_equality && !$is_strict_equality) { + $int_types[] = new TNumericString(); + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$did_remove_type || !$int_types) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'int', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($int_types) { + return new Union($int_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return $existing_var_type->from_docblock + ? Type::getMixed() + : Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileBool( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + if ($existing_var_type->hasMixed()) { + return Type::getBool(); + } + + $bool_types = []; + $did_remove_type = false; + + $old_var_type_string = $existing_var_type->getId(); + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + foreach ($existing_var_atomic_types as $type) { + if ($type instanceof TBool) { + $bool_types[] = $type; + $type->from_docblock = false; + } elseif ($type instanceof TScalar) { + $bool_types[] = new TBool; + $did_remove_type = true; + } elseif ($type instanceof TTemplateParam) { + if ($type->as->hasBool() || $type->as->hasMixed()) { + $type = clone $type; + + $type->as = self::reconcileBool( + $type->as, + null, + false, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + + $bool_types[] = $type; + } + + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$did_remove_type || !$bool_types) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'bool', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($bool_types) { + return new Union($bool_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return $existing_var_type->from_docblock + ? Type::getMixed() + : Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileScalar( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + if ($existing_var_type->hasMixed()) { + return Type::getScalar(); + } + + $scalar_types = []; + $did_remove_type = false; + + $old_var_type_string = $existing_var_type->getId(); + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + foreach ($existing_var_atomic_types as $type) { + if ($type instanceof Scalar) { + $scalar_types[] = $type; + } elseif ($type instanceof TTemplateParam) { + if ($type->as->hasScalar() || $type->as->hasMixed()) { + $type = clone $type; + + $type->as = self::reconcileScalar( + $type->as, + null, + false, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + + $scalar_types[] = $type; + } + + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$did_remove_type || !$scalar_types) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'scalar', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($scalar_types) { + return new Union($scalar_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return $existing_var_type->from_docblock + ? Type::getMixed() + : Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileNumeric( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + if ($existing_var_type->hasMixed()) { + return Type::getNumeric(); + } + + $old_var_type_string = $existing_var_type->getId(); + + $numeric_types = []; + $did_remove_type = false; + + if ($existing_var_type->hasString()) { + $did_remove_type = true; + $existing_var_type->removeType('string'); + $existing_var_type->addType(new TNumericString); + } + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TNumeric || $type instanceof TNumericString) { + // this is a workaround for a possible issue running + // is_numeric($a) && is_string($a) + $did_remove_type = true; + $numeric_types[] = $type; + } elseif ($type->isNumericType()) { + $numeric_types[] = $type; + } elseif ($type instanceof TScalar) { + $did_remove_type = true; + $numeric_types[] = new TNumeric(); + } elseif ($type instanceof TArrayKey) { + $did_remove_type = true; + $numeric_types[] = new TInt(); + $numeric_types[] = new TNumericString(); + } elseif ($type instanceof TTemplateParam) { + if ($type->as->hasNumeric() || $type->as->hasMixed()) { + $type = clone $type; + + $type->as = self::reconcileNumeric( + $type->as, + null, + false, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + + $numeric_types[] = $type; + } + + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$did_remove_type || !$numeric_types) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'numeric', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($numeric_types) { + return new Union($numeric_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return $existing_var_type->from_docblock + ? Type::getMixed() + : Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileObject( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + if ($existing_var_type->hasMixed()) { + return Type::getObject(); + } + + $old_var_type_string = $existing_var_type->getId(); + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + $object_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type->isObjectType()) { + $object_types[] = $type; + } elseif ($type instanceof TCallable) { + $object_types[] = new TCallableObject(); + $did_remove_type = true; + } elseif ($type instanceof TTemplateParam + && $type->as->isMixed() + ) { + $type = clone $type; + $type->as = Type::getObject(); + $object_types[] = $type; + $did_remove_type = true; + } elseif ($type instanceof TTemplateParam) { + if ($type->as->hasObject() || $type->as->hasMixed()) { + $type = clone $type; + + $type->as = self::reconcileObject( + $type->as, + null, + false, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + + $object_types[] = $type; + } + + $did_remove_type = true; + } elseif ($type instanceof TIterable) { + $clone_type = clone $type; + + self::refineArrayKey($clone_type->type_params[0]); + + $object_types[] = new TGenericObject('Traversable', $clone_type->type_params); + + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$object_types || !$did_remove_type) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'object', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($object_types) { + return new Union($object_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return $existing_var_type->from_docblock + ? Type::getMixed() + : Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileResource( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + if ($existing_var_type->hasMixed()) { + return Type::getResource(); + } + + $old_var_type_string = $existing_var_type->getId(); + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + $resource_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type instanceof TResource) { + $resource_types[] = $type; + } else { + $did_remove_type = true; + } + } + + if ((!$resource_types || !$did_remove_type) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'resource', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($resource_types) { + return new Union($resource_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return $existing_var_type->from_docblock + ? Type::getMixed() + : Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileCountable( + Codebase $codebase, + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + + if ($existing_var_type->hasMixed() || $existing_var_type->hasTemplate()) { + return new Union([ + new TArray([Type::getArrayKey(), Type::getMixed()]), + new TNamedObject('Countable'), + ]); + } + + $iterable_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type->isCountable($codebase)) { + $iterable_types[] = $type; + } elseif ($type instanceof TObject) { + $iterable_types[] = new TNamedObject('Countable'); + $did_remove_type = true; + } elseif ($type instanceof TNamedObject || $type instanceof TIterable) { + $countable = new TNamedObject('Countable'); + $type->extra_types[$countable->getKey()] = $countable; + $iterable_types[] = $type; + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$iterable_types || !$did_remove_type) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'countable', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($iterable_types) { + return new Union($iterable_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileIterable( + Codebase $codebase, + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + if ($existing_var_type->hasMixed() || $existing_var_type->hasTemplate()) { + return new Union([new TIterable]); + } + + $iterable_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type->isIterable($codebase)) { + $iterable_types[] = $type; + } elseif ($type instanceof TObject) { + $iterable_types[] = new TNamedObject('Traversable'); + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$iterable_types || !$did_remove_type) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'iterable', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($iterable_types) { + return new Union($iterable_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileInArray( + Codebase $codebase, + Union $existing_var_type, + string $assertion, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation + ): Union { + $new_var_type = Type::parseString($assertion); + + $intersection = Type::intersectUnionTypes($new_var_type, $existing_var_type, $codebase); + + if ($intersection === null) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $existing_var_type->getId(), + $key, + '!' . $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + return $intersection; + } + + private static function reconcileHasArrayKey( + Union $existing_var_type, + string $assertion + ): Union { + foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { + if ($atomic_type instanceof TKeyedArray) { + $is_class_string = false; + + if (strpos($assertion, '::class')) { + [$assertion] = explode('::', $assertion); + $is_class_string = true; + } + + if (isset($atomic_type->properties[$assertion])) { + $atomic_type->properties[$assertion]->possibly_undefined = false; + } else { + $atomic_type->properties[$assertion] = Type::getMixed(); + + if ($is_class_string) { + $atomic_type->class_strings[$assertion] = true; + } + } + } + } + + return $existing_var_type; + } + + /** + * @param string[] $suppressed_issues + */ + private static function reconcileSuperiorTo( + Union $existing_var_type, + string $assertion, + bool $inside_loop, + string $old_var_type_string, + ?string $var_id, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues + ): Union { + $assertion_value = (int)substr($assertion, 1); + + $did_remove_type = false; + + foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { + if ($inside_loop) { + continue; + } + + if ($atomic_type instanceof TIntRange) { + if ($atomic_type->contains($assertion_value)) { + // if the range contains the assertion, the range must be adapted + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + if ($atomic_type->min_bound === null) { + $atomic_type->min_bound = $assertion_value; + } else { + $atomic_type->min_bound = TIntRange::getNewHighestBound( + $assertion_value, + $atomic_type->min_bound + ); + } + $existing_var_type->addType($atomic_type); + } elseif ($atomic_type->isLesserThan($assertion_value)) { + // if the range is lesser than the assertion, the type must be removed + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + } elseif ($atomic_type->isGreaterThan($assertion_value)) { + // if the range is greater than the assertion, the check is redundant + } + } elseif ($atomic_type instanceof TLiteralInt) { + if ($atomic_type->value < $assertion_value) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + } /*elseif ($inside_loop) { + //when inside a loop, allow the range to extends the type + $existing_var_type->removeType($atomic_type->getKey()); + if ($atomic_type->value < $assertion_value) { + $existing_var_type->addType(new TIntRange($atomic_type->value, $assertion_value)); + } else { + $existing_var_type->addType(new TIntRange($assertion_value, $atomic_type->value)); + } + }*/ + } elseif ($atomic_type instanceof TPositiveInt) { + if ($assertion_value > 1) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + $existing_var_type->addType(new TIntRange($assertion_value, null)); + } + } elseif ($atomic_type instanceof TInt) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + $existing_var_type->addType(new TIntRange($assertion_value, null)); + } else { + // we assume that other types may have been removed (empty strings? numeric strings?) + //It may be worth refining to improve reconciliation while keeping in mind we're on loose comparison + $did_remove_type = true; + } + } + + if (!$inside_loop && !$did_remove_type && $var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + + if ($existing_var_type->isUnionEmpty()) { + if ($var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + false, + $negated, + $code_location, + $suppressed_issues + ); + } + $existing_var_type->addType(new TNever()); + } + + return $existing_var_type; + } + + /** + * @param string[] $suppressed_issues + */ + private static function reconcileInferiorTo( + Union $existing_var_type, + string $assertion, + bool $inside_loop, + string $old_var_type_string, + ?string $var_id, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues + ): Union { + $assertion_value = (int)substr($assertion, 1); + + $did_remove_type = false; + + foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { + if ($inside_loop) { + continue; + } + + if ($atomic_type instanceof TIntRange) { + if ($atomic_type->contains($assertion_value)) { + // if the range contains the assertion, the range must be adapted + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + if ($atomic_type->max_bound === null) { + $atomic_type->max_bound = $assertion_value; + } else { + $atomic_type->max_bound = min($atomic_type->max_bound, $assertion_value); + } + $existing_var_type->addType($atomic_type); + } elseif ($atomic_type->isLesserThan($assertion_value)) { + // if the range is lesser than the assertion, the check is redundant + } elseif ($atomic_type->isGreaterThan($assertion_value)) { + // if the range is greater than the assertion, the type must be removed + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + } + } elseif ($atomic_type instanceof TLiteralInt) { + if ($atomic_type->value > $assertion_value) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + } /* elseif ($inside_loop) { + //when inside a loop, allow the range to extends the type + $existing_var_type->removeType($atomic_type->getKey()); + if ($atomic_type->value < $assertion_value) { + $existing_var_type->addType(new TIntRange($atomic_type->value, $assertion_value)); + } else { + $existing_var_type->addType(new TIntRange($assertion_value, $atomic_type->value)); + } + }*/ + } elseif ($atomic_type instanceof TPositiveInt) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + if ($assertion_value >= 1) { + $existing_var_type->addType(new TIntRange(1, $assertion_value)); + } + } elseif ($atomic_type instanceof TInt) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + $existing_var_type->addType(new TIntRange(null, $assertion_value)); + } else { + // we assume that other types may have been removed (empty strings? numeric strings?) + //It may be worth refining to improve reconciliation while keeping in mind we're on loose comparison + $did_remove_type = true; + } + } + + if (!$inside_loop && !$did_remove_type && $var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + + if ($existing_var_type->isUnionEmpty()) { + if ($var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + $assertion, + false, + $negated, + $code_location, + $suppressed_issues + ); + } + $existing_var_type->addType(new TNever()); + } + + return $existing_var_type; + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileTraversable( + Codebase $codebase, + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + if ($existing_var_type->hasMixed() || $existing_var_type->hasTemplate()) { + return new Union([new TNamedObject('Traversable')]); + } + + $traversable_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type->hasTraversableInterface($codebase)) { + $traversable_types[] = $type; + } elseif ($type instanceof TIterable) { + $clone_type = clone $type; + $traversable_types[] = new TGenericObject('Traversable', $clone_type->type_params); + $did_remove_type = true; + } elseif ($type instanceof TObject) { + $traversable_types[] = new TNamedObject('Traversable'); + $did_remove_type = true; + } elseif ($type instanceof TNamedObject) { + $traversable = new TNamedObject('Traversable'); + $type->extra_types[$traversable->getKey()] = $traversable; + $traversable_types[] = $type; + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$traversable_types || !$did_remove_type) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'Traversable', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($traversable_types) { + return new Union($traversable_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return $existing_var_type->from_docblock + ? Type::getMixed() + : Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileArray( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + if ($existing_var_type->hasMixed()) { + return Type::getArray(); + } + + $array_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type instanceof TArray || $type instanceof TKeyedArray || $type instanceof TList) { + $array_types[] = $type; + } elseif ($type instanceof TCallable) { + $array_types[] = new TCallableKeyedArray([ + new Union([new TClassString, new TObject]), + Type::getString() + ]); + + $did_remove_type = true; + } elseif ($type instanceof TIterable) { + $clone_type = clone $type; + + self::refineArrayKey($clone_type->type_params[0]); + + $array_types[] = new TArray($clone_type->type_params); + + $did_remove_type = true; + } elseif ($type instanceof TTemplateParam) { + if ($type->as->hasArray() || $type->as->hasIterable() || $type->as->hasMixed()) { + $type = clone $type; + + $type->as = self::reconcileArray( + $type->as, + null, + false, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + + $array_types[] = $type; + } + + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$array_types || !$did_remove_type) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'array', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + } + + if ($array_types) { + return TypeCombiner::combine($array_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return $existing_var_type->from_docblock + ? Type::getMixed() + : Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileList( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality, + bool $is_non_empty + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + if ($existing_var_type->hasMixed() || $existing_var_type->hasTemplate()) { + return $is_non_empty ? Type::getNonEmptyList() : Type::getList(); + } + + $array_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type instanceof TList + || ($type instanceof TKeyedArray && $type->is_list) + ) { + if ($is_non_empty && $type instanceof TList && !$type instanceof TNonEmptyList) { + $array_types[] = new TNonEmptyList($type->type_param); + $did_remove_type = true; + } else { + $array_types[] = $type; + } + } elseif ($type instanceof TArray || $type instanceof TKeyedArray) { + if ($type instanceof TKeyedArray) { + $type = $type->getGenericArrayType(); + } + + if ($type->type_params[0]->hasArrayKey() + || $type->type_params[0]->hasInt() + ) { + if ($type instanceof TNonEmptyArray) { + $array_types[] = new TNonEmptyList($type->type_params[1]); + } else { + $array_types[] = new TList($type->type_params[1]); + } + } + + if ($type->type_params[0]->isEmpty() + || $type->type_params[1]->isEmpty() + ) { + //we allow an empty array to pass as a list. We keep the type as empty array though (more precise) + $array_types[] = $type; + } + + $did_remove_type = true; + } elseif ($type instanceof TCallable) { + $array_types[] = new TCallableKeyedArray([ + new Union([new TClassString, new TObject]), + Type::getString() + ]); + + $did_remove_type = true; + } elseif ($type instanceof TIterable) { + $clone_type = clone $type; + $array_types[] = new TList($clone_type->type_params[1]); + + $did_remove_type = true; + } else { + $did_remove_type = true; + } + } + + if ((!$array_types || !$did_remove_type) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'array', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + } + + if ($array_types) { + return TypeCombiner::combine($array_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return $existing_var_type->from_docblock + ? Type::getMixed() + : Type::getEmpty(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileStringArrayAccess( + Codebase $codebase, + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $inside_loop + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + if ($existing_var_type->hasMixed() || $existing_var_type->hasTemplate()) { + return new Union([ + new TNonEmptyArray([Type::getArrayKey(), Type::getMixed()]), + new TNamedObject('ArrayAccess'), + ]); + } + + $array_types = []; + + foreach ($existing_var_atomic_types as $type) { + if ($type->isArrayAccessibleWithStringKey($codebase)) { + if (get_class($type) === TArray::class) { + $array_types[] = new TNonEmptyArray($type->type_params); + } elseif (get_class($type) === TList::class) { + $array_types[] = new TNonEmptyList($type->type_param); + } else { + $array_types[] = $type; + } + } elseif ($type instanceof TTemplateParam) { + $array_types[] = $type; + } + } + + if (!$array_types) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'string-array-access', + true, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($array_types) { + return new Union($array_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed($inside_loop); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileIntArrayAccess( + Codebase $codebase, + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $inside_loop + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + if ($existing_var_type->hasMixed()) { + return Type::getMixed(); + } + + $array_types = []; + + foreach ($existing_var_atomic_types as $type) { + if ($type->isArrayAccessibleWithIntOrStringKey($codebase)) { + if (get_class($type) === TArray::class) { + $array_types[] = new TNonEmptyArray($type->type_params); + } else { + $array_types[] = $type; + } + } elseif ($type instanceof TTemplateParam) { + $array_types[] = $type; + } + } + + if (!$array_types) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'int-or-string-array-access', + true, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($array_types) { + return TypeCombiner::combine($array_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed($inside_loop); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileCallable( + Codebase $codebase, + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + if ($existing_var_type->hasMixed()) { + return Type::parseString('callable'); + } + + $old_var_type_string = $existing_var_type->getId(); + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + $callable_types = []; + $did_remove_type = false; + + foreach ($existing_var_atomic_types as $type) { + if ($type->isCallableType()) { + $callable_types[] = $type; + } elseif ($type instanceof TObject) { + $callable_types[] = new TCallableObject(); + $did_remove_type = true; + } elseif ($type instanceof TNamedObject + && $codebase->classExists($type->value) + && $codebase->methodExists($type->value . '::__invoke') + ) { + $callable_types[] = $type; + } elseif (get_class($type) === TString::class + || get_class($type) === TNonEmptyString::class + || get_class($type) === TNonFalsyString::class + ) { + $callable_types[] = new TCallableString(); + $did_remove_type = true; + } elseif (get_class($type) === TLiteralString::class + && InternalCallMapHandler::inCallMap($type->value) + ) { + $callable_types[] = $type; + $did_remove_type = true; + } elseif ($type instanceof TArray) { + $type = clone $type; + $type = new TCallableArray($type->type_params); + $callable_types[] = $type; + $did_remove_type = true; + } elseif ($type instanceof TList) { + $type = clone $type; + $type = new TCallableList($type->type_param); + $callable_types[] = $type; + $did_remove_type = true; + } elseif ($type instanceof TKeyedArray && count($type->properties) === 2) { + $type = clone $type; + $type = new TCallableKeyedArray($type->properties); + $callable_types[] = $type; + $did_remove_type = true; + } elseif ($type instanceof TTemplateParam) { + if ($type->as->hasCallableType() || $type->as->hasMixed()) { + $type = clone $type; + + $type->as = self::reconcileCallable( + $codebase, + $type->as, + null, + $negated, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + $did_remove_type = true; + + $callable_types[] = $type; + } else { + $did_remove_type = true; + } + } + + if ((!$callable_types || !$did_remove_type) && !$is_equality) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + 'callable', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + + if ($callable_types) { + return TypeCombiner::combine($callable_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileFalsyOrEmpty( + string $assertion, + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $recursive_check + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + $did_remove_type = $existing_var_type->possibly_undefined + || $existing_var_type->possibly_undefined_from_try; + + foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_key => $existing_var_type_part) { + //if any atomic in the union is either always truthy, we remove it. If not always falsy, we mark the check + //as not redundant. + if (!$existing_var_type->possibly_undefined + && !$existing_var_type->possibly_undefined_from_try + && $existing_var_type_part->isTruthy() + ) { + $did_remove_type = true; + $existing_var_type->removeType($existing_var_type_key); + } elseif (!$existing_var_type_part->isFalsy()) { + $did_remove_type = true; + } + } + + if ($did_remove_type && $existing_var_type->isUnionEmpty()) { + //every type was removed, this is an impossible assertion + if ($code_location && $key && !$recursive_check) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + $assertion, + false, + $negated, + $code_location, + $suppressed_issues + ); + } + + $failed_reconciliation = 2; + + return Type::getEmpty(); + } + + if (!$did_remove_type) { + //nothing was removed, this is a redundant assertion + if ($code_location && $key && !$recursive_check) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + + $failed_reconciliation = 1; + + return $existing_var_type; + } + + if ($existing_var_type->hasType('bool')) { + $existing_var_type->removeType('bool'); + $existing_var_type->addType(new TFalse()); + } + + if ($existing_var_type->hasArray()) { + $existing_var_type->removeType('array'); + $existing_var_type->addType(new TArray( + [ + new Union([new TEmpty()]), + new Union([new TEmpty()]), + ] + )); + } + + if ($existing_var_type->hasMixed()) { + $mixed_atomic_type = $existing_var_type->getAtomicTypes()['mixed']; + + if (get_class($mixed_atomic_type) === TMixed::class) { + $existing_var_type->removeType('mixed'); + $existing_var_type->addType(new TEmptyMixed()); + } + } + + if ($existing_var_type->hasScalar()) { + $scalar_atomic_type = $existing_var_type->getAtomicTypes()['scalar']; + + if (get_class($scalar_atomic_type) === TScalar::class) { + $existing_var_type->removeType('scalar'); + $existing_var_type->addType(new TEmptyScalar()); + } + } + + if ($existing_var_type->hasType('string')) { + $string_atomic_type = $existing_var_type->getAtomicTypes()['string']; + + 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')); + } elseif (get_class($string_atomic_type) === TNonEmptyString::class) { + $existing_var_type->removeType('string'); + $existing_var_type->addType(new TLiteralString('0')); + } elseif (get_class($string_atomic_type) === TNonEmptyLowercaseString::class) { + $existing_var_type->removeType('string'); + $existing_var_type->addType(new TLiteralString('0')); + } elseif (get_class($string_atomic_type) === TNonEmptyNonspecificLiteralString::class) { + $existing_var_type->removeType('string'); + $existing_var_type->addType(new TLiteralString('0')); + } + } + + if ($existing_var_type->hasInt()) { + $existing_range_types = $existing_var_type->getRangeInts(); + + if ($existing_range_types) { + foreach ($existing_range_types as $int_key => $literal_type) { + if ($literal_type->contains(0)) { + $existing_var_type->removeType($int_key); + $existing_var_type->addType(new TLiteralInt(0)); + } + } + } else { + $existing_var_type->removeType('int'); + $existing_var_type->addType(new TLiteralInt(0)); + } + } + + if ($existing_var_type->hasFloat()) { + $existing_var_type->removeType('float'); + $existing_var_type->addType(new TLiteralFloat(0.0)); + } + + if ($existing_var_type->hasNumeric()) { + $existing_var_type->removeType('numeric'); + $existing_var_type->addType(new TEmptyNumeric()); + } + + foreach ($existing_var_type->getAtomicTypes() as $type_key => $existing_var_atomic_type) { + if ($existing_var_atomic_type instanceof TTemplateParam) { + if (!$existing_var_atomic_type->as->isMixed()) { + $template_did_fail = 0; + + $existing_var_atomic_type = clone $existing_var_atomic_type; + + $existing_var_atomic_type->as = self::reconcileFalsyOrEmpty( + $assertion, + $existing_var_atomic_type->as, + $key, + $negated, + $code_location, + $suppressed_issues, + $template_did_fail, + $recursive_check + ); + + if (!$template_did_fail) { + $existing_var_type->removeType($type_key); + $existing_var_type->addType($existing_var_atomic_type); + } + } + } + } + + assert(!$existing_var_type->isUnionEmpty()); + return $existing_var_type; + } + + /** + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileClassConstant( + Codebase $codebase, + string $class_constant_expression, + Union $existing_type, + int &$failed_reconciliation + ): Union { + if (strpos($class_constant_expression, '::') === false) { + return $existing_type; + } + + [$class_name, $constant_pattern] = explode('::', $class_constant_expression, 2); + + $resolver = new ClassConstantByWildcardResolver($codebase); + $matched_class_constant_types = $resolver->resolve($class_name, $constant_pattern); + if ($matched_class_constant_types === null) { + return $existing_type; + } + + if ($matched_class_constant_types === []) { + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + return Type::getMixed(); + } + + return TypeCombiner::combine($matched_class_constant_types, $codebase); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php new file mode 100644 index 00000000..02fac147 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php @@ -0,0 +1,1819 @@ +getId(); + + if ($assertion === 'isset') { + if ($existing_var_type->possibly_undefined) { + return Type::getEmpty(); + } + + if (!$existing_var_type->isNullable() + && $key + && strpos($key, '[') === false + && (!$existing_var_type->hasMixed() || $existing_var_type->isAlwaysTruthy()) + ) { + if ($code_location) { + if ($existing_var_type->from_static_property) { + IssueBuffer::maybeAdd( + new RedundantPropertyInitializationCheck( + 'Static property ' . $key . ' with type ' + . $existing_var_type + . ' has unexpected isset check — should it be nullable?', + $code_location + ), + $suppressed_issues + ); + } elseif ($existing_var_type->from_property) { + IssueBuffer::maybeAdd( + new RedundantPropertyInitializationCheck( + 'Property ' . $key . ' with type ' + . $existing_var_type . ' should already be set in the constructor', + $code_location + ), + $suppressed_issues + ); + } elseif ($existing_var_type->from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + 'Cannot resolve types for ' . $key . ' with docblock-defined type ' + . $existing_var_type . ' and !isset assertion', + $code_location, + null + ), + $suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new TypeDoesNotContainType( + 'Cannot resolve types for ' . $key . ' with type ' + . $existing_var_type . ' and !isset assertion', + $code_location, + null + ), + $suppressed_issues + ); + } + } + + return $existing_var_type->from_docblock + ? Type::getNull() + : Type::getEmpty(); + } + + return Type::getNull(); + } + + if ($assertion === 'array-key-exists') { + return Type::getEmpty(); + } + + if (strpos($assertion, 'in-array-') === 0) { + $assertion = substr($assertion, 9); + $new_var_type = Type::parseString($assertion); + + $intersection = Type::intersectUnionTypes( + $new_var_type, + $existing_var_type, + $codebase + ); + + if ($intersection === null) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $existing_var_type->getId(), + $key, + '!' . $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + } + + return $existing_var_type; + } + + if ($assertion === 'object' && !$existing_var_type->hasMixed()) { + return self::reconcileObject( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'scalar' && !$existing_var_type->hasMixed()) { + return self::reconcileScalar( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'resource' && !$existing_var_type->hasMixed()) { + return self::reconcileResource( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'bool' && !$existing_var_type->hasMixed()) { + return self::reconcileBool( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'numeric' && !$existing_var_type->hasMixed()) { + return self::reconcileNumeric( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'float' && !$existing_var_type->hasMixed()) { + return self::reconcileFloat( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'int' && !$existing_var_type->hasMixed()) { + return self::reconcileInt( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'string' && !$existing_var_type->hasMixed()) { + return self::reconcileString( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'array' && !$existing_var_type->hasMixed()) { + return self::reconcileArray( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'falsy' || $assertion === 'empty') { + return self::reconcileFalsyOrEmpty( + $assertion, + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + false + ); + } + + if ($assertion === 'null' && !$existing_var_type->hasMixed()) { + return self::reconcileNull( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'false' && !$existing_var_type->hasMixed()) { + return self::reconcileFalse( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + } + + if ($assertion === 'non-empty-countable') { + return self::reconcileNonEmptyCountable( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + null + ); + } + + if ($assertion === 'callable') { + return self::reconcileCallable( + $existing_var_type + ); + } + + if (strpos($assertion, 'has-at-least-') === 0) { + return self::reconcileNonEmptyCountable( + $existing_var_type, + $key, + $negated, + $code_location, + $suppressed_issues, + $failed_reconciliation, + $is_equality, + (int) substr($assertion, 13) + ); + } + + if (strpos($assertion, 'has-exactly-') === 0) { + return $existing_var_type; + } + + if ($assertion[0] === '>') { + return self::reconcileSuperiorTo( + $existing_var_type, + $assertion, + $inside_loop, + $old_var_type_string, + $key, + $negated, + $code_location, + $suppressed_issues + ); + } + + if ($assertion[0] === '<') { + return self::reconcileInferiorTo( + $existing_var_type, + $assertion, + $inside_loop, + $old_var_type_string, + $key, + $negated, + $code_location, + $suppressed_issues + ); + } + + return null; + } + + private static function reconcileCallable( + Union $existing_var_type + ): Union { + foreach ($existing_var_type->getAtomicTypes() as $atomic_key => $type) { + if ($type instanceof TLiteralString + && InternalCallMapHandler::inCallMap($type->value) + ) { + $existing_var_type->removeType($atomic_key); + } + + if ($type->isCallableType()) { + $existing_var_type->removeType($atomic_key); + } + } + + return $existing_var_type; + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileBool( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $non_bool_types = []; + $did_remove_type = false; + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + if (!$type->as->hasBool()) { + $non_bool_types[] = $type; + } + + $did_remove_type = true; + } elseif (!$type instanceof TBool + || ($is_equality && get_class($type) === TBool::class) + ) { + if ($type instanceof TScalar) { + $did_remove_type = true; + $non_bool_types[] = new TString(); + $non_bool_types[] = new TInt(); + $non_bool_types[] = new TFloat(); + } else { + $non_bool_types[] = $type; + } + } else { + $did_remove_type = true; + } + } + + if (!$did_remove_type || !$non_bool_types) { + if ($key && $code_location && !$is_equality) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!bool', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if ($non_bool_types) { + return new Union($non_bool_types); + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileNonEmptyCountable( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality, + ?int $min_count + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + if (isset($existing_var_atomic_types['array'])) { + $array_atomic_type = $existing_var_atomic_types['array']; + $did_remove_type = false; + + if (($array_atomic_type instanceof TNonEmptyArray + || $array_atomic_type instanceof TNonEmptyList) + && ($min_count === null + || $array_atomic_type->count >= $min_count) + ) { + $did_remove_type = true; + + $existing_var_type->removeType('array'); + } elseif ($array_atomic_type->getId() !== 'array') { + $did_remove_type = true; + + if (!$min_count) { + $existing_var_type->addType(new TArray( + [ + new Union([new TEmpty]), + new Union([new TEmpty]), + ] + )); + } + } elseif ($array_atomic_type instanceof TKeyedArray) { + $did_remove_type = true; + + foreach ($array_atomic_type->properties as $property_type) { + if (!$property_type->possibly_undefined) { + $did_remove_type = false; + break; + } + } + } + + if (!$is_equality + && !$existing_var_type->hasMixed() + && (!$did_remove_type || $existing_var_type->isUnionEmpty()) + ) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!non-empty-countable', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + } + } + + return $existing_var_type; + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileNull( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $did_remove_type = false; + + if ($existing_var_type->hasType('null')) { + $did_remove_type = true; + $existing_var_type->removeType('null'); + } + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + $type->as = self::reconcileNull( + $type->as, + null, + false, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + + $did_remove_type = true; + $existing_var_type->bustCache(); + } + } + + if (!$did_remove_type || $existing_var_type->isUnionEmpty()) { + if ($key && $code_location && !$is_equality) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!null', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if (!$existing_var_type->isUnionEmpty()) { + return $existing_var_type; + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileFalse( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $did_remove_type = $existing_var_type->hasScalar(); + + if ($existing_var_type->hasType('false')) { + $did_remove_type = true; + $existing_var_type->removeType('false'); + } + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + $type->as = self::reconcileFalse( + $type->as, + null, + false, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + + $did_remove_type = true; + $existing_var_type->bustCache(); + } + } + + if (!$did_remove_type || $existing_var_type->isUnionEmpty()) { + if ($key && $code_location && !$is_equality) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!false', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if (!$existing_var_type->isUnionEmpty()) { + return $existing_var_type; + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileFalsyOrEmpty( + string $assertion, + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $recursive_check + ): Union { + $old_var_type_string = $existing_var_type->getId(); + + //empty is used a lot to check for array offset existence, so we have to silent errors a lot + $is_empty_assertion = $assertion === 'empty'; + + $did_remove_type = $existing_var_type->possibly_undefined + || $existing_var_type->possibly_undefined_from_try; + + foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_key => $existing_var_type_part) { + //if any atomic in the union is either always falsy, we remove it. If not always truthy, we mark the check + //as not redundant. + if ($existing_var_type_part->isFalsy()) { + $did_remove_type = true; + $existing_var_type->removeType($existing_var_type_key); + } elseif ($existing_var_type->possibly_undefined + || $existing_var_type->possibly_undefined_from_try + || !$existing_var_type_part->isTruthy() + ) { + $did_remove_type = true; + } + } + + if ($did_remove_type && $existing_var_type->isUnionEmpty()) { + //every type was removed, this is an impossible assertion + if ($code_location && $key && !$is_empty_assertion && !$recursive_check) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!' . $assertion, + false, + $negated, + $code_location, + $suppressed_issues + ); + } + + $failed_reconciliation = 2; + + return Type::getEmpty(); + } + + if (!$did_remove_type) { + if ($code_location && $key && !$is_empty_assertion && !$recursive_check) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!' . $assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + + $failed_reconciliation = 1; + + return $existing_var_type; + } + + $existing_var_type->possibly_undefined = false; + $existing_var_type->possibly_undefined_from_try = false; + + if ($existing_var_type->hasType('bool')) { + $existing_var_type->removeType('bool'); + $existing_var_type->addType(new TTrue()); + } + + if ($existing_var_type->hasArray()) { + $array_atomic_type = $existing_var_type->getAtomicTypes()['array']; + + if ($array_atomic_type instanceof TArray + && !$array_atomic_type instanceof TNonEmptyArray + ) { + $existing_var_type->removeType('array'); + $existing_var_type->addType( + new TNonEmptyArray( + $array_atomic_type->type_params + ) + ); + } elseif ($array_atomic_type instanceof TList + && !$array_atomic_type instanceof TNonEmptyList + ) { + $existing_var_type->removeType('array'); + $existing_var_type->addType( + new TNonEmptyList( + $array_atomic_type->type_param + ) + ); + } + } + + if ($existing_var_type->hasMixed()) { + $mixed_atomic_type = $existing_var_type->getAtomicTypes()['mixed']; + + if (get_class($mixed_atomic_type) === TMixed::class) { + $existing_var_type->removeType('mixed'); + $existing_var_type->addType(new TNonEmptyMixed()); + } + } + + if ($existing_var_type->hasScalar()) { + $scalar_atomic_type = $existing_var_type->getAtomicTypes()['scalar']; + + if (get_class($scalar_atomic_type) === TScalar::class) { + $existing_var_type->removeType('scalar'); + $existing_var_type->addType(new TNonEmptyScalar()); + } + } + + if ($existing_var_type->hasType('string')) { + $string_atomic_type = $existing_var_type->getAtomicTypes()['string']; + + if (get_class($string_atomic_type) === TString::class) { + $existing_var_type->removeType('string'); + $existing_var_type->addType(new TNonFalsyString()); + } elseif (get_class($string_atomic_type) === TLowercaseString::class) { + $existing_var_type->removeType('string'); + $existing_var_type->addType(new TNonEmptyLowercaseString()); + } elseif (get_class($string_atomic_type) === TNonspecificLiteralString::class) { + $existing_var_type->removeType('string'); + $existing_var_type->addType(new TNonEmptyNonspecificLiteralString()); + } elseif (get_class($string_atomic_type) === TNonEmptyString::class) { + $existing_var_type->removeType('string'); + $existing_var_type->addType(new TNonFalsyString()); + } + } + + if ($existing_var_type->hasInt()) { + $existing_range_types = $existing_var_type->getRangeInts(); + + if ($existing_range_types) { + foreach ($existing_range_types as $int_key => $literal_type) { + if ($literal_type->contains(0)) { + $existing_var_type->removeType($int_key); + if ($literal_type->min_bound === null || $literal_type->min_bound <= -1) { + $existing_var_type->addType(new TIntRange($literal_type->min_bound, -1)); + } + if ($literal_type->max_bound === null || $literal_type->max_bound >= 1) { + $existing_var_type->addType(new TIntRange(1, $literal_type->max_bound)); + } + } + } + } + + if ($existing_var_type->isSingle()) { + return $existing_var_type; + } + } + + foreach ($existing_var_type->getAtomicTypes() as $type_key => $existing_var_atomic_type) { + if ($existing_var_atomic_type instanceof TTemplateParam) { + if (!$existing_var_atomic_type->as->isMixed()) { + $template_did_fail = 0; + + $existing_var_atomic_type = clone $existing_var_atomic_type; + + $existing_var_atomic_type->as = self::reconcileFalsyOrEmpty( + $assertion, + $existing_var_atomic_type->as, + $key, + $negated, + $code_location, + $suppressed_issues, + $template_did_fail, + true + ); + + if (!$template_did_fail) { + $existing_var_type->removeType($type_key); + $existing_var_type->addType($existing_var_atomic_type); + } + } + } + } + + assert(!$existing_var_type->isUnionEmpty()); + return $existing_var_type; + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileScalar( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $non_scalar_types = []; + $did_remove_type = false; + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + if (!$is_equality && !$type->as->isMixed()) { + $template_did_fail = 0; + + $type = clone $type; + + $type->as = self::reconcileScalar( + $type->as, + null, + false, + null, + $suppressed_issues, + $template_did_fail, + $is_equality + ); + + $did_remove_type = true; + + if (!$template_did_fail) { + $non_scalar_types[] = $type; + } + } else { + $did_remove_type = true; + $non_scalar_types[] = $type; + } + } elseif (!($type instanceof Scalar)) { + $non_scalar_types[] = $type; + } else { + $did_remove_type = true; + + if ($is_equality) { + $non_scalar_types[] = $type; + } + } + } + + if (!$did_remove_type || !$non_scalar_types) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!scalar', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if ($non_scalar_types) { + $type = new Union($non_scalar_types); + $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; + $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; + $type->from_docblock = $existing_var_type->from_docblock; + return $type; + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileObject( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $non_object_types = []; + $did_remove_type = false; + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + if (!$is_equality && !$type->as->isMixed()) { + $template_did_fail = 0; + + $type = clone $type; + + $type->as = self::reconcileObject( + $type->as, + null, + false, + null, + $suppressed_issues, + $template_did_fail, + $is_equality + ); + + $did_remove_type = true; + + if (!$template_did_fail) { + $non_object_types[] = $type; + } + } else { + $did_remove_type = true; + $non_object_types[] = $type; + } + } elseif ($type instanceof TCallable) { + $non_object_types[] = new TCallableArray([ + Type::getArrayKey(), + Type::getMixed() + ]); + $non_object_types[] = new TCallableString(); + $did_remove_type = true; + } elseif ($type instanceof TIterable) { + $clone_type = clone $type; + + self::refineArrayKey($clone_type->type_params[0]); + + $non_object_types[] = new TArray($clone_type->type_params); + + $did_remove_type = true; + } elseif (!$type->isObjectType()) { + $non_object_types[] = $type; + } else { + $did_remove_type = true; + + if ($is_equality) { + $non_object_types[] = $type; + } + } + } + + if (!$non_object_types || !$did_remove_type) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!object', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if ($non_object_types) { + $type = new Union($non_object_types); + $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; + $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; + $type->from_docblock = $existing_var_type->from_docblock; + return $type; + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileNumeric( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $non_numeric_types = []; + $did_remove_type = $existing_var_type->hasString() + || $existing_var_type->hasScalar(); + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + if (!$is_equality && !$type->as->isMixed()) { + $template_did_fail = 0; + + $type = clone $type; + + $type->as = self::reconcileNumeric( + $type->as, + null, + false, + null, + $suppressed_issues, + $template_did_fail, + $is_equality + ); + + $did_remove_type = true; + + if (!$template_did_fail) { + $non_numeric_types[] = $type; + } + } else { + $did_remove_type = true; + $non_numeric_types[] = $type; + } + } elseif ($type instanceof TArrayKey) { + $did_remove_type = true; + $non_numeric_types[] = new TString(); + } elseif (!$type->isNumericType()) { + $non_numeric_types[] = $type; + } else { + $did_remove_type = true; + + if ($is_equality) { + $non_numeric_types[] = $type; + } + } + } + + if (!$non_numeric_types || !$did_remove_type) { + if ($key && $code_location && !$is_equality) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!numeric', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if ($non_numeric_types) { + $type = new Union($non_numeric_types); + $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; + $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; + $type->from_docblock = $existing_var_type->from_docblock; + return $type; + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileInt( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $non_int_types = []; + $did_remove_type = false; + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + if (!$is_equality && !$type->as->isMixed()) { + $template_did_fail = 0; + + $type = clone $type; + + $type->as = self::reconcileInt( + $type->as, + null, + false, + null, + $suppressed_issues, + $template_did_fail, + $is_equality + ); + + $did_remove_type = true; + + if (!$template_did_fail) { + $non_int_types[] = $type; + } + } else { + $did_remove_type = true; + $non_int_types[] = $type; + } + } elseif ($type instanceof TArrayKey) { + $did_remove_type = true; + $non_int_types[] = new TString(); + } elseif ($type instanceof TScalar) { + $did_remove_type = true; + $non_int_types[] = new TString(); + $non_int_types[] = new TFloat(); + $non_int_types[] = new TBool(); + } elseif ($type instanceof TInt) { + $did_remove_type = true; + + if ($is_equality) { + $non_int_types[] = $type; + } elseif ($existing_var_type->from_calculation) { + $non_int_types[] = new TFloat(); + } + } elseif ($type instanceof TNumeric) { + $did_remove_type = true; + $non_int_types[] = new TString(); + $non_int_types[] = new TFloat(); + } else { + $non_int_types[] = $type; + } + } + + if (!$non_int_types || !$did_remove_type) { + if ($key && $code_location && !$is_equality) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!int', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if ($non_int_types) { + $type = new Union($non_int_types); + $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; + $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; + $type->from_docblock = $existing_var_type->from_docblock; + return $type; + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileFloat( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $non_float_types = []; + $did_remove_type = false; + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + if (!$is_equality && !$type->as->isMixed()) { + $template_did_fail = 0; + + $type = clone $type; + + $type->as = self::reconcileFloat( + $type->as, + null, + false, + null, + $suppressed_issues, + $template_did_fail, + $is_equality + ); + + $did_remove_type = true; + + if (!$template_did_fail) { + $non_float_types[] = $type; + } + } else { + $did_remove_type = true; + $non_float_types[] = $type; + } + } elseif ($type instanceof TScalar) { + $did_remove_type = true; + $non_float_types[] = new TString(); + $non_float_types[] = new TInt(); + $non_float_types[] = new TBool(); + } elseif ($type instanceof TFloat) { + $did_remove_type = true; + + if ($is_equality) { + $non_float_types[] = $type; + } + } elseif ($type instanceof TNumeric) { + $did_remove_type = true; + $non_float_types[] = new TString(); + $non_float_types[] = new TInt(); + } else { + $non_float_types[] = $type; + } + } + + if (!$non_float_types || !$did_remove_type) { + if ($key && $code_location && !$is_equality) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!float', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if ($non_float_types) { + $type = new Union($non_float_types); + $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; + $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; + $type->from_docblock = $existing_var_type->from_docblock; + return $type; + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileString( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $non_string_types = []; + $did_remove_type = $existing_var_type->hasScalar(); + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + if (!$is_equality && !$type->as->isMixed()) { + $template_did_fail = 0; + + $type = clone $type; + + $type->as = self::reconcileString( + $type->as, + null, + false, + null, + $suppressed_issues, + $template_did_fail, + $is_equality + ); + + $did_remove_type = true; + + if (!$template_did_fail) { + $non_string_types[] = $type; + } + } else { + $did_remove_type = true; + $non_string_types[] = $type; + } + } elseif ($type instanceof TArrayKey) { + $non_string_types[] = new TInt(); + $did_remove_type = true; + } elseif ($type instanceof TCallable) { + $non_string_types[] = new TCallableArray([ + Type::getArrayKey(), + Type::getMixed() + ]); + $non_string_types[] = new TCallableObject(); + $did_remove_type = true; + } elseif ($type instanceof TNumeric) { + $non_string_types[] = $type; + $did_remove_type = true; + } elseif ($type instanceof TScalar) { + $did_remove_type = true; + $non_string_types[] = new TFloat(); + $non_string_types[] = new TInt(); + $non_string_types[] = new TBool(); + } elseif (!$type instanceof TString) { + $non_string_types[] = $type; + } else { + $did_remove_type = true; + + if ($is_equality) { + $non_string_types[] = $type; + } + } + } + + if (!$non_string_types || !$did_remove_type) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!string', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if ($non_string_types) { + $type = new Union($non_string_types); + $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; + $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; + $type->from_docblock = $existing_var_type->from_docblock; + return $type; + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileArray( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $non_array_types = []; + $did_remove_type = $existing_var_type->hasScalar(); + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + if (!$is_equality && !$type->as->isMixed()) { + $template_did_fail = 0; + + $type = clone $type; + + $type->as = self::reconcileArray( + $type->as, + null, + false, + null, + $suppressed_issues, + $template_did_fail, + $is_equality + ); + + $did_remove_type = true; + + if (!$template_did_fail) { + $non_array_types[] = $type; + } + } else { + $did_remove_type = true; + $non_array_types[] = $type; + } + } elseif ($type instanceof TCallable) { + $non_array_types[] = new TCallableString(); + $non_array_types[] = new TCallableObject(); + $did_remove_type = true; + } elseif ($type instanceof TIterable) { + if (!$type->type_params[0]->isMixed() || !$type->type_params[1]->isMixed()) { + $non_array_types[] = new TGenericObject('Traversable', $type->type_params); + } else { + $non_array_types[] = new TNamedObject('Traversable'); + } + + $did_remove_type = true; + } elseif (!$type instanceof TArray + && !$type instanceof TKeyedArray + && !$type instanceof TList + ) { + $non_array_types[] = $type; + } else { + $did_remove_type = true; + + if ($is_equality) { + $non_array_types[] = $type; + } + } + } + + if ((!$non_array_types || !$did_remove_type)) { + if ($key && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!array', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if ($non_array_types) { + $type = new Union($non_array_types); + $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; + $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; + $type->from_docblock = $existing_var_type->from_docblock; + return $type; + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * @param Reconciler::RECONCILIATION_* $failed_reconciliation + */ + private static function reconcileResource( + Union $existing_var_type, + ?string $key, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues, + int &$failed_reconciliation, + bool $is_equality + ): Union { + $old_var_type_string = $existing_var_type->getId(); + $did_remove_type = false; + + if ($existing_var_type->hasType('resource')) { + $did_remove_type = true; + $existing_var_type->removeType('resource'); + } + + foreach ($existing_var_type->getAtomicTypes() as $type) { + if ($type instanceof TTemplateParam) { + $type->as = self::reconcileResource( + $type->as, + null, + false, + null, + $suppressed_issues, + $failed_reconciliation, + $is_equality + ); + + $did_remove_type = true; + $existing_var_type->bustCache(); + } + } + + if (!$did_remove_type || $existing_var_type->isUnionEmpty()) { + if ($key && $code_location && !$is_equality) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $key, + '!resource', + !$did_remove_type, + $negated, + $code_location, + $suppressed_issues + ); + } + + if (!$did_remove_type) { + $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; + } + } + + if (!$existing_var_type->isUnionEmpty()) { + return $existing_var_type; + } + + $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + */ + private static function reconcileSuperiorTo( + Union $existing_var_type, + string $assertion, + bool $inside_loop, + string $old_var_type_string, + ?string $var_id, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues + ): Union { + $assertion_value = (int)substr($assertion, 1) - 1; + + $did_remove_type = false; + + foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { + if ($inside_loop) { + continue; + } + + if ($atomic_type instanceof TIntRange) { + if ($atomic_type->contains($assertion_value)) { + // if the range contains the assertion, the range must be adapted + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + if ($atomic_type->max_bound === null) { + $atomic_type->max_bound = $assertion_value; + } else { + $atomic_type->max_bound = TIntRange::getNewLowestBound( + $assertion_value, + $atomic_type->max_bound + ); + } + $existing_var_type->addType($atomic_type); + } elseif ($atomic_type->isLesserThan($assertion_value)) { + // if the range is lesser than the assertion, the check is redundant + } elseif ($atomic_type->isGreaterThan($assertion_value)) { + // if the range is greater than the assertion, the type must be removed + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + } + } elseif ($atomic_type instanceof TLiteralInt) { + if ($atomic_type->value > $assertion_value) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + } /*elseif ($inside_loop) { + //when inside a loop, allow the range to extends the type + $existing_var_type->removeType($atomic_type->getKey()); + if ($atomic_type->value < $assertion_value) { + $existing_var_type->addType(new TIntRange($atomic_type->value, $assertion_value)); + } else { + $existing_var_type->addType(new TIntRange($assertion_value, $atomic_type->value)); + } + }*/ + } elseif ($atomic_type instanceof TPositiveInt) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + if ($assertion_value >= 1) { + $existing_var_type->addType(new TIntRange(1, $assertion_value)); + } + } elseif ($atomic_type instanceof TInt) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + $existing_var_type->addType(new TIntRange(null, $assertion_value)); + } else { + // we assume that other types may have been removed (empty strings? numeric strings?) + //It may be worth refining to improve reconciliation while keeping in mind we're on loose comparison + $did_remove_type = true; + } + } + + if (!$inside_loop && !$did_remove_type && $var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + '!'.$assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + + if ($existing_var_type->isUnionEmpty()) { + if ($var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + '!'.$assertion, + false, + $negated, + $code_location, + $suppressed_issues + ); + } + $existing_var_type->addType(new TNever()); + } + + return $existing_var_type; + } + + /** + * @param string[] $suppressed_issues + */ + private static function reconcileInferiorTo( + Union $existing_var_type, + string $assertion, + bool $inside_loop, + string $old_var_type_string, + ?string $var_id, + bool $negated, + ?CodeLocation $code_location, + array $suppressed_issues + ): Union { + $assertion_value = (int)substr($assertion, 1) + 1; + + $did_remove_type = false; + + foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { + if ($inside_loop) { + continue; + } + + if ($atomic_type instanceof TIntRange) { + if ($atomic_type->contains($assertion_value)) { + // if the range contains the assertion, the range must be adapted + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + if ($atomic_type->min_bound === null) { + $atomic_type->min_bound = $assertion_value; + } else { + $atomic_type->min_bound = max($atomic_type->min_bound, $assertion_value); + } + $existing_var_type->addType($atomic_type); + } elseif ($atomic_type->isLesserThan($assertion_value)) { + // if the range is lesser than the assertion, the type must be removed + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + } elseif ($atomic_type->isGreaterThan($assertion_value)) { + // if the range is greater than the assertion, the check is redundant + } + } elseif ($atomic_type instanceof TLiteralInt) { + if ($atomic_type->value < $assertion_value) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + } /* elseif ($inside_loop) { + //when inside a loop, allow the range to extends the type + $existing_var_type->removeType($atomic_type->getKey()); + if ($atomic_type->value < $assertion_value) { + $existing_var_type->addType(new TIntRange($atomic_type->value, $assertion_value)); + } else { + $existing_var_type->addType(new TIntRange($assertion_value, $atomic_type->value)); + } + }*/ + } elseif ($atomic_type instanceof TPositiveInt) { + if ($assertion_value > 1) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + $existing_var_type->addType(new TIntRange($assertion_value, null)); + } + } elseif ($atomic_type instanceof TInt) { + $did_remove_type = true; + $existing_var_type->removeType($atomic_type->getKey()); + $existing_var_type->addType(new TIntRange($assertion_value, null)); + } else { + // we assume that other types may have been removed (empty strings? numeric strings?) + //It may be worth refining to improve reconciliation while keeping in mind we're on loose comparison + $did_remove_type = true; + } + } + + if (!$inside_loop && !$did_remove_type && $var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + '!'.$assertion, + true, + $negated, + $code_location, + $suppressed_issues + ); + } + + if ($existing_var_type->isUnionEmpty()) { + if ($var_id && $code_location) { + self::triggerIssueForImpossible( + $existing_var_type, + $old_var_type_string, + $var_id, + '!'.$assertion, + false, + $negated, + $code_location, + $suppressed_issues + ); + } + $existing_var_type->addType(new TNever()); + } + + return $existing_var_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php new file mode 100644 index 00000000..da8da461 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php @@ -0,0 +1,52 @@ +>> the type T appears at three different depths. + * + * The shallowest-appearance of the template takes prominence when inferring the type of T. + * + * @var int + */ + public $appearance_depth; + + /** + * The argument offset where this template was set + * + * In the type Foo the type appears at argument offsets 0 and 2 + * + * @var ?int + */ + public $arg_offset; + + /** + * When non-null, indicates an equality template bound (vs a lower or upper bound) + * + * @var ?string + */ + public $equality_bound_classlike; + + public function __construct( + Union $type, + int $appearance_depth = 0, + ?int $arg_offset = null, + ?string $equality_bound_classlike = null + ) { + $this->type = $type; + $this->appearance_depth = $appearance_depth; + $this->arg_offset = $arg_offset; + $this->equality_bound_classlike = $equality_bound_classlike; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php new file mode 100644 index 00000000..d0aff71b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php @@ -0,0 +1,416 @@ +lower_bounds ?: []; + + foreach ($union->getAtomicTypes() as $key => $atomic_type) { + $atomic_type->replaceTemplateTypesWithArgTypes($template_result, $codebase); + + if ($atomic_type instanceof TTemplateParam) { + $template_type = null; + + $traversed_type = TemplateStandinTypeReplacer::getRootTemplateType( + $inferred_lower_bounds, + $atomic_type->param_name, + $atomic_type->defining_class, + [], + $codebase + ); + + if ($traversed_type) { + $template_type = $traversed_type; + + if (!$atomic_type->as->isMixed() && $template_type->isMixed()) { + $template_type = clone $atomic_type->as; + } else { + $template_type = clone $template_type; + } + + if ($atomic_type->extra_types) { + foreach ($template_type->getAtomicTypes() as $template_type_key => $atomic_template_type) { + if ($atomic_template_type instanceof TNamedObject + || $atomic_template_type instanceof TTemplateParam + || $atomic_template_type instanceof TIterable + || $atomic_template_type instanceof TObjectWithProperties + ) { + $atomic_template_type->extra_types = array_merge( + $atomic_type->extra_types, + $atomic_template_type->extra_types ?: [] + ); + } elseif ($atomic_template_type instanceof TObject) { + $first_atomic_type = array_shift($atomic_type->extra_types); + + if ($atomic_type->extra_types) { + $first_atomic_type->extra_types = $atomic_type->extra_types; + } + + $template_type->removeType($template_type_key); + $template_type->addType($first_atomic_type); + } + } + } + } elseif ($codebase) { + foreach ($inferred_lower_bounds as $template_type_map) { + foreach ($template_type_map as $template_class => $_) { + if (strpos($template_class, 'fn-') === 0) { + continue; + } + + try { + $classlike_storage = $codebase->classlike_storage_provider->get($template_class); + + if ($classlike_storage->template_extended_params) { + $defining_class = $atomic_type->defining_class; + + if (isset($classlike_storage->template_extended_params[$defining_class])) { + $param_map = $classlike_storage->template_extended_params[$defining_class]; + + if (isset($param_map[$key]) + && isset($inferred_lower_bounds[(string) $param_map[$key]][$template_class]) + ) { + $template_name = (string) $param_map[$key]; + + $template_type + = clone TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $inferred_lower_bounds[$template_name][$template_class], + $codebase + ); + } + } + } + } catch (InvalidArgumentException $e) { + } + } + } + } + + if ($template_type) { + $keys_to_unset[] = $key; + + foreach ($template_type->getAtomicTypes() as $template_type_part) { + if ($template_type_part instanceof TMixed) { + $is_mixed = true; + } + + $new_types[] = $template_type_part; + } + } + } elseif ($atomic_type instanceof TTemplateParamClass) { + $template_type = isset($inferred_lower_bounds[$atomic_type->param_name][$atomic_type->defining_class]) + ? clone TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $inferred_lower_bounds[$atomic_type->param_name][$atomic_type->defining_class], + $codebase + ) + : null; + + $class_template_type = null; + + if ($template_type) { + foreach ($template_type->getAtomicTypes() as $template_type_part) { + if ($template_type_part instanceof TMixed + || $template_type_part instanceof TObject + ) { + $class_template_type = new TClassString(); + } elseif ($template_type_part instanceof TNamedObject) { + $class_template_type = new TClassString( + $template_type_part->value, + $template_type_part + ); + } elseif ($template_type_part instanceof TTemplateParam) { + $first_atomic_type = $template_type_part->as->getSingleAtomic(); + + $class_template_type = new TTemplateParamClass( + $template_type_part->param_name, + $template_type_part->as->getId(), + $first_atomic_type instanceof TNamedObject ? $first_atomic_type : null, + $template_type_part->defining_class + ); + } + } + } + + if ($class_template_type) { + $keys_to_unset[] = $key; + $new_types[] = $class_template_type; + } + } elseif ($atomic_type instanceof TTemplateIndexedAccess) { + $keys_to_unset[] = $key; + + $template_type = null; + + if (isset($inferred_lower_bounds[$atomic_type->array_param_name][$atomic_type->defining_class]) + && !empty($inferred_lower_bounds[$atomic_type->offset_param_name]) + ) { + $array_template_type + = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $inferred_lower_bounds[$atomic_type->array_param_name][$atomic_type->defining_class], + $codebase + ); + + $offset_template_type + = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + array_values($inferred_lower_bounds[$atomic_type->offset_param_name])[0], + $codebase + ); + + if ($array_template_type->isSingle() + && $offset_template_type->isSingle() + && !$array_template_type->isMixed() + && !$offset_template_type->isMixed() + ) { + $array_template_type = $array_template_type->getSingleAtomic(); + $offset_template_type = $offset_template_type->getSingleAtomic(); + + if ($array_template_type instanceof TKeyedArray + && ($offset_template_type instanceof TLiteralString + || $offset_template_type instanceof TLiteralInt) + && isset($array_template_type->properties[$offset_template_type->value]) + ) { + $template_type = clone $array_template_type->properties[$offset_template_type->value]; + } + } + } + + if ($template_type) { + foreach ($template_type->getAtomicTypes() as $template_type_part) { + if ($template_type_part instanceof TMixed) { + $is_mixed = true; + } + + $new_types[] = $template_type_part; + } + } else { + $new_types[] = new TMixed(); + } + } elseif ($atomic_type instanceof TConditional + && $codebase + ) { + $template_type = isset($inferred_lower_bounds[$atomic_type->param_name][$atomic_type->defining_class]) + ? clone TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $inferred_lower_bounds[$atomic_type->param_name][$atomic_type->defining_class], + $codebase + ) + : null; + + $if_template_type = null; + $else_template_type = null; + + $atomic_type = clone $atomic_type; + + if ($template_type) { + self::replace( + $atomic_type->as_type, + $template_result, + $codebase + ); + + if ($atomic_type->as_type->isNullable() && $template_type->isVoid()) { + $template_type = Type::getNull(); + } + + $matching_if_types = []; + $matching_else_types = []; + + foreach ($template_type->getAtomicTypes() as $candidate_atomic_type) { + if (UnionTypeComparator::isContainedBy( + $codebase, + new Union([$candidate_atomic_type]), + $atomic_type->conditional_type, + false, + false, + null, + false, + false + ) + && (!$candidate_atomic_type instanceof TInt + || $atomic_type->conditional_type->getId() !== 'float') + ) { + $matching_if_types[] = $candidate_atomic_type; + } elseif (!UnionTypeComparator::isContainedBy( + $codebase, + $atomic_type->conditional_type, + new Union([$candidate_atomic_type]), + false, + false, + null, + false, + false + )) { + $matching_else_types[] = $candidate_atomic_type; + } + } + + $if_candidate_type = $matching_if_types ? new Union($matching_if_types) : null; + $else_candidate_type = $matching_else_types ? new Union($matching_else_types) : null; + + if ($if_candidate_type + && UnionTypeComparator::isContainedBy( + $codebase, + $if_candidate_type, + $atomic_type->conditional_type, + false, + false, + null, + false, + false + ) + ) { + $if_template_type = clone $atomic_type->if_type; + + $refined_template_result = clone $template_result; + + $refined_template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class] + = [ + new TemplateBound( + $if_candidate_type + ) + ]; + + self::replace( + $if_template_type, + $refined_template_result, + $codebase + ); + } + + if ($else_candidate_type + && UnionTypeComparator::isContainedBy( + $codebase, + $else_candidate_type, + $atomic_type->as_type, + false, + false, + null, + false, + false + ) + ) { + $else_template_type = clone $atomic_type->else_type; + + $refined_template_result = clone $template_result; + + $refined_template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class] + = [ + new TemplateBound( + $else_candidate_type + ) + ]; + + self::replace( + $else_template_type, + $refined_template_result, + $codebase + ); + } + } + + if (!$if_template_type && !$else_template_type) { + self::replace( + $atomic_type->if_type, + $template_result, + $codebase + ); + + self::replace( + $atomic_type->else_type, + $template_result, + $codebase + ); + + $class_template_type = Type::combineUnionTypes( + $atomic_type->if_type, + $atomic_type->else_type, + $codebase + ); + } else { + $class_template_type = Type::combineUnionTypes( + $if_template_type, + $else_template_type, + $codebase + ); + } + + $keys_to_unset[] = $key; + + foreach ($class_template_type->getAtomicTypes() as $class_template_atomic_type) { + $new_types[] = $class_template_atomic_type; + } + } + } + + $union->bustCache(); + + if ($is_mixed) { + if (!$new_types) { + throw new UnexpectedValueException('This array should be full'); + } + + $union->replaceTypes( + TypeCombiner::combine( + $new_types, + $codebase + )->getAtomicTypes() + ); + + return; + } + + foreach ($keys_to_unset as $key) { + $union->removeType($key); + } + + $atomic_types = array_values(array_merge($union->getAtomicTypes(), $new_types)); + + $union->replaceTypes( + TypeCombiner::combine( + $atomic_types, + $codebase + )->getAtomicTypes() + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php new file mode 100644 index 00000000..c213eb59 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php @@ -0,0 +1,73 @@ +> + */ + public $template_types; + + /** + * @var array>> + */ + public $lower_bounds; + + /** + * @var array> + */ + public $upper_bounds = []; + + /** + * If set to true then we shouldn't update the template bounds + * + * @var bool + */ + public $readonly = false; + + /** + * @var list + */ + public $upper_bounds_unintersectable_types = []; + + /** + * @param array> $template_types + * @param array> $lower_bounds + */ + public function __construct(array $template_types, array $lower_bounds) + { + $this->template_types = $template_types; + + $this->lower_bounds = array_map( + function ($type_map) { + return array_map( + function ($type) { + return [new TemplateBound($type)]; + }, + $type_map + ); + }, + $lower_bounds + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php new file mode 100644 index 00000000..7d6dbf6c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php @@ -0,0 +1,1249 @@ +getAtomicTypes(); + + // here we want to subtract atomic types from the input type + // when they're also in the union type, so those shared atomic + // types will never be inferred as part of the generic type + if ($input_type && !$input_type->isSingle()) { + $new_input_type = clone $input_type; + + foreach ($original_atomic_types as $key => $_) { + if ($new_input_type->hasType($key)) { + $new_input_type->removeType($key); + } + } + + if (!$new_input_type->isUnionEmpty()) { + $input_type = $new_input_type; + } + } + + $had_template = false; + + foreach ($original_atomic_types as $key => $atomic_type) { + $atomic_types = array_merge( + $atomic_types, + self::handleAtomicStandin( + $atomic_type, + $key, + $template_result, + $codebase, + $statements_analyzer, + $input_type, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + $bound_equality_classlike, + $depth, + count($original_atomic_types) === 1, + $had_template + ) + ); + } + + if ($replace) { + if (array_values($original_atomic_types) === $atomic_types) { + return $union_type; + } + + if (!$atomic_types) { + return $union_type; + } + + if (count($atomic_types) > 1) { + $new_union_type = TypeCombiner::combine( + $atomic_types, + $codebase + ); + } else { + $new_union_type = new Union($atomic_types); + } + + $new_union_type->ignore_nullable_issues = $union_type->ignore_nullable_issues; + $new_union_type->ignore_falsable_issues = $union_type->ignore_falsable_issues; + $new_union_type->possibly_undefined = $union_type->possibly_undefined; + + if ($had_template) { + $new_union_type->had_template = true; + } + + return $new_union_type; + } + + return $union_type; + } + + /** + * @return list + */ + private static function handleAtomicStandin( + Atomic $atomic_type, + string $key, + TemplateResult $template_result, + ?Codebase $codebase, + ?StatementsAnalyzer $statements_analyzer, + ?Union $input_type, + ?int $input_arg_offset, + ?string $calling_class, + ?string $calling_function, + bool $replace, + bool $add_lower_bound, + ?string $bound_equality_classlike, + int $depth, + bool $was_single, + bool &$had_template + ): array { + if ($bracket_pos = strpos($key, '<')) { + $key = substr($key, 0, $bracket_pos); + } + + if ($atomic_type instanceof TTemplateParam + && isset($template_result->template_types[$atomic_type->param_name][$atomic_type->defining_class]) + ) { + return self::handleTemplateParamStandin( + $atomic_type, + $key, + $input_type, + $input_arg_offset, + $calling_class, + $calling_function, + $template_result, + $codebase, + $statements_analyzer, + $replace, + $add_lower_bound, + $bound_equality_classlike, + $depth, + $had_template + ); + } + + if ($atomic_type instanceof TTemplateParamClass + && isset($template_result->template_types[$atomic_type->param_name][$atomic_type->defining_class]) + ) { + if ($replace) { + return self::handleTemplateParamClassStandin( + $atomic_type, + $input_type, + $input_arg_offset, + $calling_class, + $calling_function, + $template_result, + $codebase, + $statements_analyzer, + true, + $add_lower_bound, + $bound_equality_classlike, + $depth, + $was_single, + $had_template + ); + } + } + + if ($atomic_type instanceof TTemplateIndexedAccess) { + if ($replace) { + $atomic_types = []; + + $include_first = true; + + if (isset($template_result->template_types[$atomic_type->array_param_name][$atomic_type->defining_class]) + && !empty($template_result->lower_bounds[$atomic_type->offset_param_name]) + ) { + $array_template_type + = $template_result->template_types[$atomic_type->array_param_name][$atomic_type->defining_class]; + $offset_template_type + = self::getMostSpecificTypeFromBounds( + array_values($template_result->lower_bounds[$atomic_type->offset_param_name])[0], + $codebase + ); + + if ($array_template_type->isSingle() + && $offset_template_type->isSingle() + && !$array_template_type->isMixed() + && !$offset_template_type->isMixed() + ) { + $array_template_type = $array_template_type->getSingleAtomic(); + $offset_template_type = $offset_template_type->getSingleAtomic(); + + if ($array_template_type instanceof TKeyedArray + && ($offset_template_type instanceof TLiteralString + || $offset_template_type instanceof TLiteralInt) + && isset($array_template_type->properties[$offset_template_type->value]) + ) { + $include_first = false; + + $replacement_type + = clone $array_template_type->properties[$offset_template_type->value]; + + foreach ($replacement_type->getAtomicTypes() as $replacement_atomic_type) { + $atomic_types[] = $replacement_atomic_type; + } + } + } + } + + if ($include_first) { + $atomic_types[] = $atomic_type; + } + + return $atomic_types; + } + + return [$atomic_type]; + } + + if ($atomic_type instanceof TTemplateKeyOf) { + if ($replace) { + $atomic_types = []; + + $include_first = true; + + if (isset($template_result->template_types[$atomic_type->param_name][$atomic_type->defining_class])) { + $template_type + = $template_result->template_types[$atomic_type->param_name][$atomic_type->defining_class]; + + if ($template_type->isSingle()) { + $template_type = $template_type->getSingleAtomic(); + + if ($template_type instanceof TKeyedArray + || $template_type instanceof TArray + || $template_type instanceof TList + ) { + if ($template_type instanceof TKeyedArray) { + $key_type = $template_type->getGenericKeyType(); + } elseif ($template_type instanceof TList) { + $key_type = Type::getInt(); + } else { + $key_type = clone $template_type->type_params[0]; + } + + $include_first = false; + + foreach ($key_type->getAtomicTypes() as $key_atomic_type) { + $atomic_types[] = $key_atomic_type; + } + } + } + } + + if ($include_first) { + $atomic_types[] = $atomic_type; + } + + return $atomic_types; + } + + return [$atomic_type]; + } + + $matching_atomic_types = []; + + if ($input_type && $codebase && !$input_type->hasMixed()) { + $matching_atomic_types = self::findMatchingAtomicTypesForTemplate( + $atomic_type, + $key, + $codebase, + $statements_analyzer, + $input_type + ); + } + + if (!$matching_atomic_types) { + $atomic_type = $atomic_type->replaceTemplateTypesWithStandins( + $template_result, + $codebase, + $statements_analyzer, + null, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + $depth + 1 + ); + + return [$atomic_type]; + } + + $atomic_types = []; + + foreach ($matching_atomic_types as $matching_atomic_type) { + $atomic_types[] = $atomic_type->replaceTemplateTypesWithStandins( + $template_result, + $codebase, + $statements_analyzer, + $matching_atomic_type, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + $depth + 1 + ); + } + + return $atomic_types; + } + + /** + * This method attempts to find bits of the input type (normally the argument type of a method call) + * that match the base type (normally the param type of the method). These matches are used to infer + * more template types + * + * Example: when passing `array` to a function that expects `array`, a rule in this method + * identifies the matching atomic types for `T` as `string|int` + * + * @return list + */ + private static function findMatchingAtomicTypesForTemplate( + Atomic $base_type, + string $key, + Codebase $codebase, + ?StatementsAnalyzer $statements_analyzer, + Union $input_type + ): array { + $matching_atomic_types = []; + + foreach ($input_type->getAtomicTypes() as $input_key => $atomic_input_type) { + if ($bracket_pos = strpos($input_key, '<')) { + $input_key = substr($input_key, 0, $bracket_pos); + } + + if ($input_key === $key) { + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + + if ($atomic_input_type instanceof TClosure && $base_type instanceof TClosure) { + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + + if ($atomic_input_type instanceof TCallable + && $base_type instanceof TCallable + ) { + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + + if ($atomic_input_type instanceof TClosure && $base_type instanceof TCallable) { + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + + if (($atomic_input_type instanceof TArray + || $atomic_input_type instanceof TKeyedArray + || $atomic_input_type instanceof TList) + && $key === 'iterable' + ) { + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + + if (strpos($input_key, $key . '&') === 0) { + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + + if ($atomic_input_type instanceof TLiteralClassString + && $base_type instanceof TClassString + && $base_type->as_type + ) { + try { + $classlike_storage = + $codebase->classlike_storage_provider->get($atomic_input_type->value); + + if (!empty($classlike_storage->template_extended_params[$base_type->as_type->value])) { + $atomic_input_type = new TClassString( + $base_type->as_type->value, + new TGenericObject( + $base_type->as_type->value, + array_values($classlike_storage->template_extended_params[$base_type->as_type->value]) + ) + ); + + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + } catch (InvalidArgumentException $e) { + // do nothing + } + } + + if ($base_type instanceof TCallable) { + $matching_atomic_type = CallableTypeComparator::getCallableFromAtomic( + $codebase, + $atomic_input_type, + null, + $statements_analyzer + ); + + if ($matching_atomic_type) { + $matching_atomic_types[$matching_atomic_type->getId()] = $matching_atomic_type; + continue; + } + } + + if ($atomic_input_type instanceof TNamedObject + && ($base_type instanceof TNamedObject + || $base_type instanceof TIterable) + ) { + if ($base_type instanceof TIterable) { + if ($atomic_input_type->value === 'Traversable') { + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + + $base_type = new TGenericObject( + 'Traversable', + $base_type->type_params + ); + } + + try { + $classlike_storage = + $codebase->classlike_storage_provider->get($atomic_input_type->value); + + if ($atomic_input_type instanceof TGenericObject + && isset($classlike_storage->template_extended_params[$base_type->value]) + ) { + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + + if (!empty($classlike_storage->template_extended_params[$base_type->value])) { + $atomic_input_type = new TGenericObject( + $atomic_input_type->value, + array_values($classlike_storage->template_extended_params[$base_type->value]) + ); + + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + + if (in_array('Traversable', $classlike_storage->class_implements) + && $base_type->value === 'Iterator' + ) { + $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; + continue; + } + } catch (InvalidArgumentException $e) { + // do nothing + } + } + + if ($atomic_input_type instanceof TTemplateParam) { + $matching_atomic_types = array_merge( + $matching_atomic_types, + self::findMatchingAtomicTypesForTemplate( + $base_type, + $key, + $codebase, + $statements_analyzer, + $atomic_input_type->as + ) + ); + continue; + } + } + + return array_values($matching_atomic_types); + } + + /** + * @return list + */ + private static function handleTemplateParamStandin( + TTemplateParam $atomic_type, + string $key, + ?Union $input_type, + ?int $input_arg_offset, + ?string $calling_class, + ?string $calling_function, + TemplateResult $template_result, + ?Codebase $codebase, + ?StatementsAnalyzer $statements_analyzer, + bool $replace, + bool $add_lower_bound, + ?string $bound_equality_classlike, + int $depth, + bool &$had_template + ): array { + if ($atomic_type->defining_class === $calling_class) { + return [$atomic_type]; + } + + $template_type = $template_result->template_types + [$atomic_type->param_name] + [$atomic_type->defining_class]; + + if ($template_type->getId() === $key) { + return array_values($template_type->getAtomicTypes()); + } + + $replacement_type = $template_type; + + $param_name_key = $atomic_type->param_name; + + if (strpos($key, '&')) { + $param_name_key = $key; + } + + $extra_types = []; + + if ($atomic_type->extra_types) { + foreach ($atomic_type->extra_types as $extra_type) { + $extra_type = self::replace( + new Union([$extra_type]), + $template_result, + $codebase, + $statements_analyzer, + $input_type, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + $bound_equality_classlike, + $depth + 1 + ); + + if ($extra_type->isSingle()) { + $extra_type = $extra_type->getSingleAtomic(); + + if ($extra_type instanceof TNamedObject + || $extra_type instanceof TTemplateParam + || $extra_type instanceof TIterable + || $extra_type instanceof TObjectWithProperties + ) { + $extra_types[$extra_type->getKey()] = $extra_type; + } + } + } + } + + if ($replace) { + $atomic_types = []; + + if ($replacement_type->hasMixed() + && !$atomic_type->as->hasMixed() + ) { + foreach ($atomic_type->as->getAtomicTypes() as $as_atomic_type) { + $atomic_types[] = clone $as_atomic_type; + } + } else { + if ($codebase) { + $replacement_type = TypeExpander::expandUnion( + $codebase, + $replacement_type, + $calling_class, + $calling_class, + null + ); + } + + if ($depth < 10) { + $replacement_type = self::replace( + $replacement_type, + $template_result, + $codebase, + $statements_analyzer, + $input_type, + $input_arg_offset, + $calling_class, + $calling_function, + true, + $add_lower_bound, + $bound_equality_classlike, + $depth + 1 + ); + } + + foreach ($replacement_type->getAtomicTypes() as $replacement_atomic_type) { + $replacements_found = false; + + // @codingStandardsIgnoreStart + if ($replacement_atomic_type instanceof TTemplateKeyOf + && isset($template_result->template_types[$replacement_atomic_type->param_name][$replacement_atomic_type->defining_class]) + && count($template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class]) + === 1 + ) { + $keyed_template = $template_result->template_types[$replacement_atomic_type->param_name][$replacement_atomic_type->defining_class]; + + if ($keyed_template->isSingle()) { + $keyed_template = $keyed_template->getSingleAtomic(); + } + + if ($keyed_template instanceof TKeyedArray + || $keyed_template instanceof TArray + || $keyed_template instanceof TList + ) { + if ($keyed_template instanceof TKeyedArray) { + $key_type = $keyed_template->getGenericKeyType(); + } elseif ($keyed_template instanceof TList) { + $key_type = Type::getInt(); + } else { + $key_type = $keyed_template->type_params[0]; + } + + $replacements_found = true; + + foreach ($key_type->getAtomicTypes() as $key_type_atomic) { + $atomic_types[] = clone $key_type_atomic; + } + + $existing_lower_bound = reset($template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class]); + + $existing_lower_bound->type = clone $key_type; + } + } + + if ($replacement_atomic_type instanceof TTemplateParam + && $replacement_atomic_type->defining_class !== $calling_class + && $replacement_atomic_type->defining_class !== 'fn-' . $calling_function + ) { + foreach ($replacement_atomic_type->as->getAtomicTypes() as $nested_type_atomic) { + $replacements_found = true; + $atomic_types[] = clone $nested_type_atomic; + } + } + // @codingStandardsIgnoreEnd + + if (!$replacements_found) { + $atomic_types[] = clone $replacement_atomic_type; + } + + $had_template = true; + } + } + + $matching_input_keys = []; + + if ($codebase) { + $atomic_type->as = TypeExpander::expandUnion( + $codebase, + $atomic_type->as, + $calling_class, + $calling_class, + null + ); + } + + $atomic_type->as = self::replace( + $atomic_type->as, + $template_result, + $codebase, + $statements_analyzer, + $input_type, + $input_arg_offset, + $calling_class, + $calling_function, + true, + $add_lower_bound, + $bound_equality_classlike, + $depth + 1 + ); + + if ($input_type + && !$template_result->readonly + && ( + $atomic_type->as->isMixed() + || !$codebase + || UnionTypeComparator::canBeContainedBy( + $codebase, + $input_type, + $atomic_type->as, + false, + false, + $matching_input_keys + ) + ) + ) { + $generic_param = clone $input_type; + + if ($matching_input_keys) { + $generic_param_keys = array_keys($generic_param->getAtomicTypes()); + + foreach ($generic_param_keys as $atomic_key) { + if (!isset($matching_input_keys[$atomic_key])) { + $generic_param->removeType($atomic_key); + } + } + } + + if ($add_lower_bound) { + return array_values($generic_param->getAtomicTypes()); + } + + $generic_param->setFromDocblock(); + + if (isset( + $template_result->lower_bounds[$param_name_key][$atomic_type->defining_class] + )) { + $existing_lower_bounds = $template_result->lower_bounds + [$param_name_key] + [$atomic_type->defining_class]; + + $has_matching_lower_bound = false; + + foreach ($existing_lower_bounds as $existing_lower_bound) { + $existing_depth = $existing_lower_bound->appearance_depth; + $existing_arg_offset = $existing_lower_bound->arg_offset ?? $input_arg_offset; + + if ($existing_depth === $depth + && $input_arg_offset === $existing_arg_offset + && $existing_lower_bound->type->getId() === $generic_param->getId() + && $existing_lower_bound->equality_bound_classlike === $bound_equality_classlike + ) { + $has_matching_lower_bound = true; + break; + } + } + + if (!$has_matching_lower_bound) { + $template_result->lower_bounds + [$param_name_key] + [$atomic_type->defining_class] + [] = new TemplateBound( + $generic_param, + $depth, + $input_arg_offset, + $bound_equality_classlike + ); + } + } else { + $template_result->lower_bounds[$param_name_key][$atomic_type->defining_class] = [ + new TemplateBound( + $generic_param, + $depth, + $input_arg_offset, + $bound_equality_classlike + ) + ]; + } + } + + foreach ($atomic_types as &$atomic_type) { + if ($atomic_type instanceof TNamedObject + || $atomic_type instanceof TTemplateParam + || $atomic_type instanceof TIterable + || $atomic_type instanceof TObjectWithProperties + ) { + $atomic_type->extra_types = $extra_types; + } elseif ($atomic_type instanceof TObject && $extra_types) { + $atomic_type = reset($extra_types); + $atomic_type->extra_types = array_slice($extra_types, 1); + } + } + + return $atomic_types; + } + + if ($add_lower_bound && $input_type && !$template_result->readonly) { + $matching_input_keys = []; + + if ($codebase + && UnionTypeComparator::canBeContainedBy( + $codebase, + $input_type, + $replacement_type, + false, + false, + $matching_input_keys + ) + ) { + $generic_param = clone $input_type; + + if ($matching_input_keys) { + $generic_param_keys = array_keys($generic_param->getAtomicTypes()); + + foreach ($generic_param_keys as $atomic_key) { + if (!isset($matching_input_keys[$atomic_key])) { + $generic_param->removeType($atomic_key); + } + } + } + + if (isset($template_result->upper_bounds[$param_name_key][$atomic_type->defining_class])) { + if (!UnionTypeComparator::isContainedBy( + $codebase, + $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type, + $generic_param + ) || !UnionTypeComparator::isContainedBy( + $codebase, + $generic_param, + $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type + )) { + $intersection_type = Type::intersectUnionTypes( + $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type, + $generic_param, + $codebase + ); + } else { + $intersection_type = $generic_param; + } + + if ($intersection_type) { + $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type + = $intersection_type; + } else { + $template_result->upper_bounds_unintersectable_types[] + = $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type; + $template_result->upper_bounds_unintersectable_types[] = $generic_param; + + $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type + = Type::getMixed(); + } + } else { + $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class] = new TemplateBound( + $generic_param + ); + } + } + } + + return [$atomic_type]; + } + + /** + * @return non-empty-list + */ + public static function handleTemplateParamClassStandin( + TTemplateParamClass $atomic_type, + ?Union $input_type, + ?int $input_arg_offset, + ?string $calling_class, + ?string $calling_function, + TemplateResult $template_result, + ?Codebase $codebase, + ?StatementsAnalyzer $statements_analyzer, + bool $replace, + bool $add_lower_bound, + ?string $bound_equality_classlike, + int $depth, + bool $was_single, + bool &$had_template + ): array { + if ($atomic_type->defining_class === $calling_class) { + return [$atomic_type]; + } + + $atomic_types = []; + + if ($input_type && !$template_result->readonly) { + $valid_input_atomic_types = []; + + foreach ($input_type->getAtomicTypes() as $input_atomic_type) { + if ($input_atomic_type instanceof TLiteralClassString) { + $valid_input_atomic_types[] = new TNamedObject( + $input_atomic_type->value + ); + } elseif ($input_atomic_type instanceof TTemplateParamClass) { + $valid_input_atomic_types[] = new TTemplateParam( + $input_atomic_type->param_name, + $input_atomic_type->as_type + ? new Union([$input_atomic_type->as_type]) + : ($input_atomic_type->as === 'object' + ? Type::getObject() + : Type::getMixed()), + $input_atomic_type->defining_class + ); + } elseif ($input_atomic_type instanceof TClassString) { + if ($input_atomic_type->as_type) { + $valid_input_atomic_types[] = clone $input_atomic_type->as_type; + } elseif ($input_atomic_type->as !== 'object') { + $valid_input_atomic_types[] = new TNamedObject( + $input_atomic_type->as + ); + } else { + $valid_input_atomic_types[] = new TObject(); + } + } elseif ($input_atomic_type instanceof TDependentGetClass) { + $valid_input_atomic_types[] = new TObject(); + } + } + + $generic_param = null; + + if ($valid_input_atomic_types) { + $generic_param = new Union($valid_input_atomic_types); + $generic_param->setFromDocblock(); + } elseif ($was_single) { + $generic_param = Type::getMixed(); + } + + if ($atomic_type->as_type) { + // sometimes templated class-strings can contain nested templates + // in the as type that need to be resolved as well. + $as_type_union = self::replace( + new Union([$atomic_type->as_type]), + $template_result, + $codebase, + $statements_analyzer, + $generic_param, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + $bound_equality_classlike, + $depth + 1 + ); + + $first = $as_type_union->getSingleAtomic(); + + if (count($as_type_union->getAtomicTypes()) === 1 && $first instanceof TNamedObject) { + $atomic_type->as_type = $first; + } else { + $atomic_type->as_type = null; + } + } + + if ($generic_param) { + if (isset($template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class])) { + $template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class] = [ + new TemplateBound( + Type::combineUnionTypes( + $generic_param, + self::getMostSpecificTypeFromBounds( + $template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class], + $codebase + ) + ), + $depth + ) + ]; + } else { + $template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class] = [ + new TemplateBound( + $generic_param, + $depth, + $input_arg_offset + ) + ]; + } + } + } else { + $template_type = $template_result->template_types + [$atomic_type->param_name] + [$atomic_type->defining_class]; + + foreach ($template_type->getAtomicTypes() as $template_atomic_type) { + if ($template_atomic_type instanceof TNamedObject) { + $atomic_types[] = new TClassString( + $template_atomic_type->value, + $template_atomic_type + ); + } elseif ($template_atomic_type instanceof TObject) { + $atomic_types[] = new TClassString(); + } + } + } + + $class_string = new TClassString($atomic_type->as, $atomic_type->as_type); + + if (!$atomic_types) { + $atomic_types[] = $class_string; + } + + return $atomic_types; + } + + /** + * @param array>> $template_types + */ + public static function getRootTemplateType( + array $template_types, + string $param_name, + string $defining_class, + array $visited_classes, + ?Codebase $codebase + ): ?Union { + if (isset($visited_classes[$defining_class])) { + return null; + } + + if (isset($template_types[$param_name][$defining_class])) { + $mapped_type = self::getMostSpecificTypeFromBounds( + $template_types[$param_name][$defining_class], + $codebase + ); + + $mapped_type_atomic_types = array_values($mapped_type->getAtomicTypes()); + + if (count($mapped_type_atomic_types) > 1 + || !$mapped_type_atomic_types[0] instanceof TTemplateParam + ) { + return $mapped_type; + } + + $first_template = $mapped_type_atomic_types[0]; + + return self::getRootTemplateType( + $template_types, + $first_template->param_name, + $first_template->defining_class, + $visited_classes + [$defining_class => true], + $codebase + ) ?? $mapped_type; + } + + return null; + } + + /** + * This takes a list of lower bounds and returns the most general type. + * + * If given a single bound that's just the type of that bound. + * + * If instead given a collection of lower bounds it normally returns a union of those + * bound types. + * + * @param non-empty-list $lower_bounds + */ + public static function getMostSpecificTypeFromBounds(array $lower_bounds, ?Codebase $codebase): Union + { + if (count($lower_bounds) === 1) { + return reset($lower_bounds)->type; + } + + usort( + $lower_bounds, + function (TemplateBound $bound_a, TemplateBound $bound_b) { + return $bound_b->appearance_depth <=> $bound_a->appearance_depth; + } + ); + + $current_depth = null; + $current_type = null; + $had_invariant = false; + $last_arg_offset = -1; + + foreach ($lower_bounds as $template_bound) { + if ($current_depth === null) { + $current_depth = $template_bound->appearance_depth; + } elseif ($current_depth !== $template_bound->appearance_depth && $current_type) { + if (!$current_type->isEmpty() + && ($had_invariant || $last_arg_offset === $template_bound->arg_offset) + ) { + // escape switches when matching on invariant generic params + // and when matching + break; + } + + $current_depth = $template_bound->appearance_depth; + } + + $had_invariant = $had_invariant ?: $template_bound->equality_bound_classlike !== null; + + $current_type = Type::combineUnionTypes( + $current_type, + $template_bound->type, + $codebase + ); + + $last_arg_offset = $template_bound->arg_offset; + } + + return $current_type ?? Type::getMixed(); + } + + /** + * @param TGenericObject|TNamedObject|TIterable $input_type_part + * @param TGenericObject|TIterable $container_type_part + * @return list + */ + public static function getMappedGenericTypeParams( + Codebase $codebase, + Atomic $input_type_part, + Atomic $container_type_part, + ?array &$container_type_params_covariant = null + ): array { + if ($input_type_part instanceof TGenericObject || $input_type_part instanceof TIterable) { + $input_type_params = $input_type_part->type_params; + } else { + $class_storage = $codebase->classlike_storage_provider->get($input_type_part->value); + + $container_class = $container_type_part->value; + + if (strtolower($input_type_part->value) === strtolower($container_type_part->value)) { + $input_type_params = $class_storage->getClassTemplateTypes(); + } elseif (!empty($class_storage->template_extended_params[$container_class])) { + $input_type_params = array_values($class_storage->template_extended_params[$container_class]); + } else { + $input_type_params = array_fill(0, count($class_storage->template_types ?? []), Type::getMixed()); + } + } + + try { + $input_class_storage = $codebase->classlike_storage_provider->get($input_type_part->value); + $container_class_storage = $codebase->classlike_storage_provider->get($container_type_part->value); + $container_type_params_covariant = $container_class_storage->template_covariants; + } catch (Throwable $e) { + $input_class_storage = null; + } + + if ($input_type_part->value !== $container_type_part->value + && $input_class_storage + ) { + $input_template_types = $input_class_storage->template_types; + $i = 0; + + $replacement_templates = []; + + if ($input_template_types + && (!$input_type_part instanceof TGenericObject || !$input_type_part->remapped_params) + && (!$container_type_part instanceof TGenericObject || !$container_type_part->remapped_params) + ) { + foreach ($input_template_types as $template_name => $_) { + if (!isset($input_type_params[$i])) { + break; + } + + $replacement_templates[$template_name][$input_type_part->value] = $input_type_params[$i]; + + $i++; + } + } + + $template_extends = $input_class_storage->template_extended_params; + + if (isset($template_extends[$container_type_part->value])) { + $params = $template_extends[$container_type_part->value]; + + $new_input_params = []; + + foreach ($params as $extended_input_param_type) { + $new_input_param = null; + + foreach ($extended_input_param_type->getAtomicTypes() as $et) { + if ($et instanceof TTemplateParam) { + $ets = Methods::getExtendedTemplatedTypes( + $et, + $template_extends + ); + } else { + $ets = []; + } + + if ($ets + && $ets[0] instanceof TTemplateParam + && isset( + $input_class_storage->template_types + [$ets[0]->param_name] + [$ets[0]->defining_class] + ) + ) { + $old_params_offset = (int) array_search( + $ets[0]->param_name, + array_keys($input_class_storage->template_types) + ); + + $candidate_param_type = $input_type_params[$old_params_offset] ?? Type::getMixed(); + } else { + $candidate_param_type = new Union([clone $et]); + } + + $candidate_param_type->from_template_default = true; + + $new_input_param = Type::combineUnionTypes( + $new_input_param, + $candidate_param_type + ); + } + + $new_input_param = clone $new_input_param; + + TemplateInferredTypeReplacer::replace( + $new_input_param, + new TemplateResult([], $replacement_templates), + $codebase + ); + + $new_input_params[] = $new_input_param; + } + + $input_type_params = $new_input_params; + } + } + + return $input_type_params; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php new file mode 100644 index 00000000..a8c05fb6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php @@ -0,0 +1,7 @@ + + */ + public $replacement_atomic_types; + + /** + * @param list $replacement_atomic_types + */ + public function __construct(array $replacement_atomic_types) + { + $this->replacement_atomic_types = $replacement_atomic_types; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php new file mode 100644 index 00000000..9ed473c6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php @@ -0,0 +1,24 @@ + + */ + public $replacement_tokens; + + /** + * @param list $replacement_tokens + */ + public function __construct(array $replacement_tokens) + { + $this->replacement_tokens = $replacement_tokens; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php new file mode 100644 index 00000000..a0c309dd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php @@ -0,0 +1,35 @@ +declaring_fq_classlike_name = $declaring_fq_classlike_name; + $this->alias_name = $alias_name; + $this->line_number = $line_number; + $this->start_offset = $start_offset; + $this->end_offset = $end_offset; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php new file mode 100644 index 00000000..d45af1ce --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php @@ -0,0 +1,99 @@ + */ + public $value_types = []; + + /** @var array|null */ + public $named_object_types = []; + + /** @var list */ + public $array_type_params = []; + + /** @var array> */ + public $builtin_type_params = []; + + /** @var array> */ + public $object_type_params = []; + + /** @var array */ + public $object_static = []; + + /** @var array|null */ + public $array_counts = []; + + /** @var bool */ + public $array_sometimes_filled = false; + + /** @var bool */ + public $array_always_filled = true; + + /** @var array */ + public $objectlike_entries = []; + + /** @var bool */ + public $objectlike_sealed = true; + + /** @var ?Union */ + public $objectlike_key_type; + + /** @var ?Union */ + public $objectlike_value_type; + + /** @var bool */ + public $empty_mixed = false; + + /** @var bool */ + public $non_empty_mixed = false; + + /** @var ?bool */ + public $mixed_from_loop_isset; + + /** @var array|null */ + public $strings = []; + + /** @var array|null */ + public $ints = []; + + /** @var array|null */ + public $floats = []; + + /** @var array|null */ + public $class_string_types = []; + + /** + * @var array|null + */ + public $extra_types; + + /** @var ?bool */ + public $all_arrays_lists; + + /** @var ?bool */ + public $all_arrays_callable; + + /** @var ?bool */ + public $all_arrays_class_string_maps; + + /** @var array */ + public $class_string_map_names = []; + + /** @var array */ + public $class_string_map_as_types = []; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php new file mode 100644 index 00000000..ec939c1c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php @@ -0,0 +1,1528 @@ + + array = array` + * - and `array + string = array|string` + * - and `array + array = array` + * - and `array + array = array` + * - and `array + array = array` + * + * @param non-empty-list $types + * @param int $literal_limit any greater number of literal types than this + * will be merged to a scalar + * + */ + public static function combine( + array $types, + ?Codebase $codebase = null, + bool $overwrite_empty_array = false, + bool $allow_mixed_union = true, + int $literal_limit = 500 + ): Union { + if (count($types) === 1) { + $union_type = new Union([$types[0]]); + + if ($types[0]->from_docblock) { + $union_type->from_docblock = true; + } + + return $union_type; + } + + $combination = new TypeCombination(); + + $from_docblock = false; + + foreach ($types as $type) { + $from_docblock = $from_docblock || $type->from_docblock; + + $result = self::scrapeTypeProperties( + $type, + $combination, + $codebase, + $overwrite_empty_array, + $allow_mixed_union, + $literal_limit + ); + + if ($result) { + if ($from_docblock) { + $result->from_docblock = true; + } + + return $result; + } + } + + if (count($combination->value_types) === 1 + && !count($combination->objectlike_entries) + && !$combination->array_type_params + && !$combination->builtin_type_params + && !$combination->object_type_params + && !$combination->named_object_types + && !$combination->strings + && !$combination->class_string_types + && !$combination->ints + && !$combination->floats + ) { + if (isset($combination->value_types['false'])) { + $union_type = Type::getFalse(); + + if ($from_docblock) { + $union_type->from_docblock = true; + } + + return $union_type; + } + + if (isset($combination->value_types['true'])) { + $union_type = Type::getTrue(); + + if ($from_docblock) { + $union_type->from_docblock = true; + } + + return $union_type; + } + } elseif (isset($combination->value_types['void'])) { + unset($combination->value_types['void']); + + // if we're merging with another type, we cannot represent it in PHP + $from_docblock = true; + + if (!isset($combination->value_types['null'])) { + $combination->value_types['null'] = new TNull(); + } + } + + if (isset($combination->value_types['true']) && isset($combination->value_types['false'])) { + unset($combination->value_types['true'], $combination->value_types['false']); + + $combination->value_types['bool'] = new TBool(); + } + + if ($combination->array_type_params + && (isset($combination->named_object_types['Traversable']) + || isset($combination->builtin_type_params['Traversable'])) + && ( + ($codebase && $codebase->config->allow_phpstorm_generics) + || isset($combination->builtin_type_params['Traversable']) + || (isset($combination->named_object_types['Traversable']) + && $combination->named_object_types['Traversable']->from_docblock) + ) + && !$combination->extra_types + ) { + $array_param_types = $combination->array_type_params; + $traversable_param_types = $combination->builtin_type_params['Traversable'] + ?? [Type::getMixed(), Type::getMixed()]; + + $combined_param_types = []; + + foreach ($array_param_types as $i => $array_param_type) { + $combined_param_types[] = Type::combineUnionTypes($array_param_type, $traversable_param_types[$i]); + } + + $combination->value_types['iterable'] = new TIterable($combined_param_types); + + $combination->array_type_params = []; + + /** + * @psalm-suppress PossiblyNullArrayAccess + */ + unset( + $combination->value_types['array'], + $combination->named_object_types['Traversable'], + $combination->builtin_type_params['Traversable'] + ); + } + + if ($combination->empty_mixed && $combination->non_empty_mixed) { + $combination->value_types['mixed'] = new TMixed((bool) $combination->mixed_from_loop_isset); + } + + $new_types = []; + + if ($combination->objectlike_entries) { + $new_types = self::handleKeyedArrayEntries( + $combination, + $overwrite_empty_array + ); + } + + if ($combination->array_type_params) { + if (count($combination->array_type_params) !== 2) { + throw new UnexpectedValueException('Unexpected number of parameters'); + } + + $new_types[] = self::getArrayTypeFromGenericParams( + $codebase, + $combination, + $overwrite_empty_array, + $allow_mixed_union, + $type, + $combination->array_type_params + ); + } + + if ($combination->extra_types) { + /** @psalm-suppress PropertyTypeCoercion */ + $combination->extra_types = self::combine( + array_values($combination->extra_types), + $codebase + )->getAtomicTypes(); + } + + foreach ($combination->builtin_type_params as $generic_type => $generic_type_params) { + if ($generic_type === 'iterable') { + $new_types[] = new TIterable($generic_type_params); + } else { + $generic_object = new TGenericObject($generic_type, $generic_type_params); + + /** @psalm-suppress PropertyTypeCoercion */ + $generic_object->extra_types = $combination->extra_types; + $new_types[] = $generic_object; + + if ($combination->named_object_types) { + unset($combination->named_object_types[$generic_type]); + } + } + } + + foreach ($combination->object_type_params as $generic_type => $generic_type_params) { + $generic_type = substr($generic_type, 0, (int) strpos($generic_type, '<')); + + $generic_object = new TGenericObject($generic_type, $generic_type_params); + + if ($combination->object_static[$generic_type] ?? false) { + $generic_object->was_static = true; + } + + /** @psalm-suppress PropertyTypeCoercion */ + $generic_object->extra_types = $combination->extra_types; + $new_types[] = $generic_object; + } + + if ($combination->class_string_types) { + if ($combination->strings) { + foreach ($combination->strings as $k => $string) { + if ($string instanceof TLiteralClassString) { + $combination->class_string_types[$string->value] = new TNamedObject($string->value); + unset($combination->strings[$k]); + } + } + } + + $has_non_specific_string = isset($combination->value_types['string']) + && get_class($combination->value_types['string']) === TString::class; + + if (!$has_non_specific_string) { + $object_type = self::combine( + array_values($combination->class_string_types), + $codebase + ); + + foreach ($object_type->getAtomicTypes() as $object_atomic_type) { + if ($object_atomic_type instanceof TNamedObject) { + $new_types[] = new TClassString($object_atomic_type->value, $object_atomic_type); + } elseif ($object_atomic_type instanceof TObject) { + $new_types[] = new TClassString(); + } + } + } + } + + if ($combination->strings) { + $new_types = array_merge($new_types, array_values($combination->strings)); + } + + if ($combination->ints) { + $new_types = array_merge($new_types, array_values($combination->ints)); + } + + if ($combination->floats) { + $new_types = array_merge($new_types, array_values($combination->floats)); + } + + if (isset($combination->value_types['string']) + && isset($combination->value_types['int']) + && isset($combination->value_types['bool']) + && isset($combination->value_types['float']) + ) { + unset( + $combination->value_types['string'], + $combination->value_types['int'], + $combination->value_types['bool'], + $combination->value_types['float'] + ); + $combination->value_types['scalar'] = new TScalar; + } + + if ($combination->named_object_types !== null) { + $combination->value_types += $combination->named_object_types; + } + + $has_empty = (int) isset($combination->value_types['empty']); + $has_never = false; + + foreach ($combination->value_types as $type) { + if ($type instanceof TMixed + && $combination->mixed_from_loop_isset + && (count($combination->value_types) > (1 + $has_empty) || count($new_types) > $has_empty) + ) { + continue; + } + + if (($type instanceof TEmpty || $type instanceof TNever) + && (count($combination->value_types) > 1 || count($new_types)) + ) { + $has_never = true; + continue; + } + + $new_types[] = $type; + } + + if (!$new_types && !$has_never) { + throw new UnexpectedValueException('There should be types here'); + } elseif (!$new_types && $has_never) { + $union_type = Type::getNever(); + } else { + $union_type = new Union($new_types); + } + + if ($from_docblock) { + $union_type->from_docblock = true; + } + + return $union_type; + } + + private static function scrapeTypeProperties( + Atomic $type, + TypeCombination $combination, + ?Codebase $codebase, + bool $overwrite_empty_array, + bool $allow_mixed_union, + int $literal_limit + ): ?Union { + if ($type instanceof TMixed) { + if ($type->from_loop_isset) { + if ($combination->mixed_from_loop_isset === null) { + $combination->mixed_from_loop_isset = true; + } else { + return null; + } + } else { + $combination->mixed_from_loop_isset = false; + } + + if ($type instanceof TNonEmptyMixed) { + $combination->non_empty_mixed = true; + + if ($combination->empty_mixed) { + return null; + } + } elseif ($type instanceof TEmptyMixed) { + $combination->empty_mixed = true; + + if ($combination->non_empty_mixed) { + return null; + } + } else { + $combination->empty_mixed = true; + $combination->non_empty_mixed = true; + } + + if (!$allow_mixed_union) { + return Type::getMixed($combination->mixed_from_loop_isset); + } + } + + // deal with false|bool => bool + if (($type instanceof TFalse || $type instanceof TTrue) && isset($combination->value_types['bool'])) { + return null; + } + + if (get_class($type) === TBool::class && isset($combination->value_types['false'])) { + unset($combination->value_types['false']); + } + + if (get_class($type) === TBool::class && isset($combination->value_types['true'])) { + unset($combination->value_types['true']); + } + + if ($type instanceof TArray && isset($combination->builtin_type_params['iterable'])) { + $type_key = 'iterable'; + } elseif ($type instanceof TArray + && $type->type_params[1]->isMixed() + && isset($combination->value_types['iterable']) + ) { + $type_key = 'iterable'; + $combination->builtin_type_params['iterable'] = [Type::getMixed(), Type::getMixed()]; + } elseif ($type instanceof TNamedObject + && $type->value === 'Traversable' + && (isset($combination->builtin_type_params['iterable']) || isset($combination->value_types['iterable'])) + ) { + $type_key = 'iterable'; + + if (!isset($combination->builtin_type_params['iterable'])) { + $combination->builtin_type_params['iterable'] = [Type::getMixed(), Type::getMixed()]; + } + + if (!$type instanceof TGenericObject) { + $type = new TGenericObject($type->value, [Type::getMixed(), Type::getMixed()]); + } + } elseif ($type instanceof TNamedObject && ($type->value === 'Traversable' || $type->value === 'Generator')) { + $type_key = $type->value; + } else { + $type_key = $type->getKey(); + } + + if ($type instanceof TIterable + && $combination->array_type_params + && ($type->has_docblock_params || $combination->array_type_params[1]->isMixed()) + ) { + if (!isset($combination->builtin_type_params['iterable'])) { + $combination->builtin_type_params['iterable'] = $combination->array_type_params; + } else { + foreach ($combination->array_type_params as $i => $array_type_param) { + $iterable_type_param = $combination->builtin_type_params['iterable'][$i]; + /** @psalm-suppress PropertyTypeCoercion */ + $combination->builtin_type_params['iterable'][$i] = Type::combineUnionTypes( + $iterable_type_param, + $array_type_param + ); + } + } + + $combination->array_type_params = []; + } + + if ($type instanceof TIterable + && (isset($combination->named_object_types['Traversable']) + || isset($combination->builtin_type_params['Traversable'])) + ) { + if (!isset($combination->builtin_type_params['iterable'])) { + $combination->builtin_type_params['iterable'] + = $combination->builtin_type_params['Traversable'] ?? [Type::getMixed(), Type::getMixed()]; + } elseif (isset($combination->builtin_type_params['Traversable'])) { + foreach ($combination->builtin_type_params['Traversable'] as $i => $array_type_param) { + $iterable_type_param = $combination->builtin_type_params['iterable'][$i]; + /** @psalm-suppress PropertyTypeCoercion */ + $combination->builtin_type_params['iterable'][$i] = Type::combineUnionTypes( + $iterable_type_param, + $array_type_param + ); + } + } else { + $combination->builtin_type_params['iterable'] = [Type::getMixed(), Type::getMixed()]; + } + + /** @psalm-suppress PossiblyNullArrayAccess */ + unset( + $combination->named_object_types['Traversable'], + $combination->builtin_type_params['Traversable'] + ); + } + + if ($type instanceof TNamedObject + || $type instanceof TTemplateParam + || $type instanceof TIterable + || $type instanceof TObjectWithProperties + ) { + if ($type->extra_types) { + $combination->extra_types = array_merge( + $combination->extra_types ?: [], + $type->extra_types + ); + } + } + + if ($type instanceof TNamedObject) { + if (array_key_exists($type->value, $combination->object_static)) { + if ($combination->object_static[$type->value] && !$type->was_static) { + $combination->object_static[$type->value] = false; + } + } else { + $combination->object_static[$type->value] = $type->was_static; + } + } + + if ($type instanceof TArray && $type_key === 'array') { + if ($type instanceof TCallableArray && isset($combination->value_types['callable'])) { + return null; + } + + foreach ($type->type_params as $i => $type_param) { + /** @psalm-suppress PropertyTypeCoercion */ + $combination->array_type_params[$i] = Type::combineUnionTypes( + $combination->array_type_params[$i] ?? null, + $type_param, + $codebase, + $overwrite_empty_array + ); + } + + if ($type instanceof TNonEmptyArray) { + if ($combination->array_counts !== null) { + if ($type->count === null) { + $combination->array_counts = null; + } else { + $combination->array_counts[$type->count] = true; + } + } + + $combination->array_sometimes_filled = true; + } else { + $combination->array_always_filled = false; + } + + if (!$type->type_params[1]->isEmpty()) { + $combination->all_arrays_lists = false; + $combination->all_arrays_class_string_maps = false; + } + + if ($type instanceof TCallableArray) { + if ($combination->all_arrays_callable !== false) { + $combination->all_arrays_callable = true; + } + } else { + $combination->all_arrays_callable = false; + } + + return null; + } + + if ($type instanceof TList) { + foreach ([Type::getInt(), $type->type_param] as $i => $type_param) { + /** @psalm-suppress PropertyTypeCoercion */ + $combination->array_type_params[$i] = Type::combineUnionTypes( + $combination->array_type_params[$i] ?? null, + $type_param, + $codebase, + $overwrite_empty_array + ); + } + + if ($type instanceof TNonEmptyList) { + if ($combination->array_counts !== null) { + if ($type->count === null) { + $combination->array_counts = null; + } else { + $combination->array_counts[$type->count] = true; + } + } + + $combination->array_sometimes_filled = true; + } else { + $combination->array_always_filled = false; + } + + if ($combination->all_arrays_lists !== false) { + $combination->all_arrays_lists = true; + } + + $combination->all_arrays_callable = false; + $combination->all_arrays_class_string_maps = false; + + return null; + } + + if ($type instanceof TClassStringMap) { + foreach ([$type->getStandinKeyParam(), $type->value_param] as $i => $type_param) { + /** @psalm-suppress PropertyTypeCoercion */ + $combination->array_type_params[$i] = Type::combineUnionTypes( + $combination->array_type_params[$i] ?? null, + $type_param, + $codebase, + $overwrite_empty_array + ); + } + + $combination->array_always_filled = false; + + if ($combination->all_arrays_class_string_maps !== false) { + $combination->all_arrays_class_string_maps = true; + $combination->class_string_map_names[$type->param_name] = true; + $combination->class_string_map_as_types[(string) $type->as_type] = $type->as_type; + } + + return null; + } + + if (($type instanceof TGenericObject && ($type->value === 'Traversable' || $type->value === 'Generator')) + || ($type instanceof TIterable && $type->has_docblock_params) + || ($type instanceof TArray && $type_key === 'iterable') + ) { + foreach ($type->type_params as $i => $type_param) { + /** @psalm-suppress PropertyTypeCoercion */ + $combination->builtin_type_params[$type_key][$i] = Type::combineUnionTypes( + $combination->builtin_type_params[$type_key][$i] ?? null, + $type_param, + $codebase, + $overwrite_empty_array + ); + } + + return null; + } + + if ($type instanceof TGenericObject) { + foreach ($type->type_params as $i => $type_param) { + /** @psalm-suppress PropertyTypeCoercion */ + $combination->object_type_params[$type_key][$i] = Type::combineUnionTypes( + $combination->object_type_params[$type_key][$i] ?? null, + $type_param, + $codebase, + $overwrite_empty_array + ); + } + + return null; + } + + if ($type instanceof TKeyedArray) { + if ($type instanceof TCallableKeyedArray && isset($combination->value_types['callable'])) { + return null; + } + + $existing_objectlike_entries = (bool) $combination->objectlike_entries; + $possibly_undefined_entries = $combination->objectlike_entries; + $combination->objectlike_sealed = $combination->objectlike_sealed && $type->sealed; + + if ($type->previous_value_type) { + $combination->objectlike_value_type = Type::combineUnionTypes( + $type->previous_value_type, + $combination->objectlike_value_type, + $codebase, + $overwrite_empty_array + ); + } + + if ($type->previous_key_type) { + $combination->objectlike_key_type = Type::combineUnionTypes( + $type->previous_key_type, + $combination->objectlike_key_type, + $codebase, + $overwrite_empty_array + ); + } + + $has_defined_keys = false; + + foreach ($type->properties as $candidate_property_name => $candidate_property_type) { + $value_type = $combination->objectlike_entries[$candidate_property_name] ?? null; + + if (!$value_type) { + $combination->objectlike_entries[$candidate_property_name] = clone $candidate_property_type; + // it's possibly undefined if there are existing objectlike entries and + $combination->objectlike_entries[$candidate_property_name]->possibly_undefined + = $existing_objectlike_entries || $candidate_property_type->possibly_undefined; + } else { + $combination->objectlike_entries[$candidate_property_name] = Type::combineUnionTypes( + $value_type, + $candidate_property_type, + $codebase, + $overwrite_empty_array + ); + } + + if (!$type->previous_value_type) { + unset($possibly_undefined_entries[$candidate_property_name]); + } + + if (!$candidate_property_type->possibly_undefined) { + $has_defined_keys = true; + } + } + + if (!$has_defined_keys) { + $combination->array_always_filled = false; + } + + if ($combination->array_counts !== null) { + $combination->array_counts[count($type->properties)] = true; + } + + foreach ($possibly_undefined_entries as $possibly_undefined_type) { + $possibly_undefined_type->possibly_undefined = true; + } + + if (!$type->is_list) { + $combination->all_arrays_lists = false; + } elseif ($combination->all_arrays_lists !== false) { + $combination->all_arrays_lists = true; + } + + if ($type instanceof TCallableKeyedArray) { + if ($combination->all_arrays_callable !== false) { + $combination->all_arrays_callable = true; + } + } else { + $combination->all_arrays_callable = false; + } + + $combination->all_arrays_class_string_maps = false; + + return null; + } + + if ($type instanceof TObject) { + if ($type instanceof TCallableObject && isset($combination->value_types['callable'])) { + return null; + } + + $combination->named_object_types = null; + $combination->value_types[$type_key] = $type; + + return null; + } + + if ($type instanceof TIterable) { + $combination->value_types[$type_key] = $type; + + return null; + } + + if ($type instanceof TNamedObject) { + if ($combination->named_object_types === null) { + return null; + } + + if (isset($combination->named_object_types[$type_key])) { + return null; + } + + if (!$codebase) { + $combination->named_object_types[$type_key] = $type; + + return null; + } + + if (!$codebase->classlikes->classOrInterfaceOrEnumExists($type_key)) { + // write this to the main list + $combination->value_types[$type_key] = $type; + + return null; + } + + $is_class = $codebase->classExists($type_key); + + foreach ($combination->named_object_types as $key => $_) { + if ($codebase->classExists($key)) { + if ($codebase->classExtendsOrImplements($key, $type_key)) { + unset($combination->named_object_types[$key]); + continue; + } + + if ($is_class) { + if ($codebase->classExtends($type_key, $key)) { + return null; + } + } + } else { + if ($codebase->interfaceExtends($key, $type_key)) { + unset($combination->named_object_types[$key]); + continue; + } + + if ($is_class) { + if ($codebase->classImplements($type_key, $key)) { + return null; + } + } else { + if ($codebase->interfaceExtends($type_key, $key)) { + return null; + } + } + } + } + + $combination->named_object_types[$type_key] = $type; + + return null; + } + + if ($type instanceof TScalar) { + $combination->strings = null; + $combination->ints = null; + $combination->floats = null; + unset( + $combination->value_types['string'], + $combination->value_types['int'], + $combination->value_types['bool'], + $combination->value_types['true'], + $combination->value_types['false'], + $combination->value_types['float'] + ); + + if (!isset($combination->value_types[$type_key]) + || $combination->value_types[$type_key]->getId() === $type->getId() + ) { + $combination->value_types[$type_key] = $type; + } else { + $combination->value_types[$type_key] = new TScalar(); + } + + return null; + } + + if ($type instanceof Scalar && isset($combination->value_types['scalar'])) { + return null; + } + + if ($type instanceof TArrayKey) { + $combination->strings = null; + $combination->ints = null; + unset( + $combination->value_types['string'], + $combination->value_types['int'] + ); + $combination->value_types[$type_key] = $type; + + return null; + } + + if ($type instanceof TString) { + self::scrapeStringProperties( + $type_key, + $type, + $combination, + $codebase, + $literal_limit + ); + + return null; + } + + if ($type instanceof TInt) { + self::scrapeIntProperties( + $type_key, + $type, + $combination, + $literal_limit + ); + + return null; + } + + if ($type instanceof TFloat) { + if ($type instanceof TLiteralFloat) { + if ($combination->floats !== null && count($combination->floats) < $literal_limit) { + $combination->floats[$type_key] = $type; + } else { + $combination->floats = null; + $combination->value_types['float'] = new TFloat(); + } + } else { + $combination->floats = null; + $combination->value_types['float'] = $type; + } + + return null; + } + + if ($type instanceof TCallable && $type_key === 'callable') { + if (($combination->value_types['string'] ?? null) instanceof TCallableString) { + unset($combination->value_types['string']); + } elseif (!empty($combination->array_type_params) && $combination->all_arrays_callable) { + $combination->array_type_params = []; + } elseif (isset($combination->value_types['callable-object'])) { + unset($combination->value_types['callable-object']); + } + } + + $combination->value_types[$type_key] = $type; + return null; + } + + private static function scrapeStringProperties( + string $type_key, + Atomic $type, + TypeCombination $combination, + ?Codebase $codebase, + int $literal_limit + ): void { + if ($type instanceof TCallableString && isset($combination->value_types['callable'])) { + return; + } + + if (isset($combination->value_types['array-key'])) { + return; + } + + if ($type instanceof TTemplateParamClass) { + $combination->value_types[$type_key] = $type; + } elseif ($type instanceof TClassString) { + if (!$type->as_type) { + $combination->class_string_types['object'] = new TObject(); + } else { + $combination->class_string_types[$type->as] = $type->as_type; + } + } elseif ($type instanceof TLiteralString) { + if ($combination->strings !== null && count($combination->strings) < $literal_limit) { + $combination->strings[$type_key] = $type; + } else { + $shared_classlikes = $codebase ? self::getSharedTypes($combination, $codebase) : []; + + $combination->strings = null; + + if (isset($combination->value_types['string']) + && $combination->value_types['string'] instanceof TNumericString + && is_numeric($type->value) + ) { + // do nothing + } elseif (isset($combination->value_types['class-string']) + && $type instanceof TLiteralClassString + ) { + // do nothing + } elseif ($type instanceof TLiteralClassString) { + $type_classlikes = $codebase + ? self::getClassLikes($codebase, $type->value) + : []; + + $mutual = array_intersect_key($type_classlikes, $shared_classlikes); + + if ($mutual) { + $first_class = array_keys($mutual)[0]; + + $combination->class_string_types[$first_class] = new TNamedObject($first_class); + } else { + $combination->class_string_types['object'] = new TObject(); + } + } elseif (isset($combination->value_types['string']) + && $combination->value_types['string'] instanceof TNonspecificLiteralString + ) { + // do nothing + } elseif (isset($combination->value_types['string']) + && $combination->value_types['string'] instanceof TLowercaseString + && strtolower($type->value) === $type->value + ) { + // do nothing + } elseif (isset($combination->value_types['string']) + && $combination->value_types['string'] instanceof TNonFalsyString + && $type->value + ) { + // do nothing + } elseif (isset($combination->value_types['string']) + && $combination->value_types['string'] instanceof TNonEmptyString + && $type->value !== '' + ) { + // do nothing + } else { + $combination->value_types['string'] = new TString(); + } + } + } else { + $type_key = 'string'; + + if (!isset($combination->value_types['string'])) { + if ($combination->strings) { + if ($type instanceof TNumericString) { + $has_non_numeric_string = false; + + foreach ($combination->strings as $string_type) { + if (!is_numeric($string_type->value)) { + $has_non_numeric_string = true; + break; + } + } + + if ($has_non_numeric_string) { + $combination->value_types['string'] = new TString(); + } else { + $combination->value_types['string'] = $type; + } + } elseif ($type instanceof TLowercaseString) { + $has_non_lowercase_string = false; + + foreach ($combination->strings as $string_type) { + if (strtolower($string_type->value) !== $string_type->value) { + $has_non_lowercase_string = true; + break; + } + } + + if ($has_non_lowercase_string) { + $combination->value_types['string'] = new TString(); + } else { + $combination->value_types['string'] = $type; + } + } elseif ($type instanceof TNonEmptyString) { + $has_empty_string = false; + + foreach ($combination->strings as $string_type) { + if (!$string_type->value) { + $has_empty_string = true; + break; + } + } + + if ($has_empty_string) { + $combination->value_types['string'] = new TString(); + } else { + $combination->value_types['string'] = $type; + } + } elseif ($type instanceof TNonspecificLiteralString) { + $combination->value_types['string'] = $type; + } else { + $combination->value_types[$type_key] = new TString(); + } + } else { + $combination->value_types[$type_key] = $type; + } + } elseif (get_class($combination->value_types['string']) !== TString::class) { + if (get_class($type) === TString::class) { + $combination->value_types['string'] = $type; + } elseif (get_class($combination->value_types['string']) !== get_class($type)) { + if (get_class($type) === TNonEmptyString::class + && get_class($combination->value_types['string']) === TNumericString::class + ) { + $combination->value_types['string'] = $type; + } elseif (get_class($type) === TNumericString::class + && get_class($combination->value_types['string']) === TNonEmptyString::class + ) { + // do nothing + } elseif ((get_class($type) === TNonEmptyString::class + || get_class($type) === TNumericString::class) + && get_class($combination->value_types['string']) === TNonFalsyString::class + ) { + $combination->value_types['string'] = $type; + } elseif (get_class($type) === TNonFalsyString::class + && (get_class($combination->value_types['string']) === TNonEmptyString::class + || get_class($combination->value_types['string']) === TNumericString::class) + ) { + // do nothing + } elseif ((get_class($type) === TNonEmptyString::class + || get_class($type) === TNonFalsyString::class) + && get_class($combination->value_types['string']) === TNonEmptyLowercaseString::class + ) { + $combination->value_types['string'] = new TNonEmptyString(); + } elseif ((get_class($combination->value_types['string']) === TNonEmptyString::class + || get_class($combination->value_types['string']) === TNonFalsyString::class) + && get_class($type) === TNonEmptyLowercaseString::class + ) { + $combination->value_types['string'] = new TNonEmptyString(); + } elseif (get_class($type) === TLowercaseString::class + && get_class($combination->value_types['string']) === TNonEmptyLowercaseString::class + ) { + $combination->value_types['string'] = $type; + } elseif (get_class($combination->value_types['string']) === TLowercaseString::class + && get_class($type) === TNonEmptyLowercaseString::class + ) { + //no-change + } elseif (get_class($combination->value_types['string']) + === TNonEmptyNonspecificLiteralString::class + && $type instanceof TNonEmptyString + ) { + $combination->value_types['string'] = new TNonEmptyString(); + } elseif (get_class($type) === TNonEmptyNonspecificLiteralString::class + && $combination->value_types['string'] instanceof TNonEmptyString + ) { + // do nothing + } else { + $combination->value_types['string'] = new TString(); + } + } + } + + $combination->strings = null; + } + } + + private static function scrapeIntProperties( + string $type_key, + Atomic $type, + TypeCombination $combination, + int $literal_limit + ): void { + if (isset($combination->value_types['array-key'])) { + return; + } + + $had_zero = isset($combination->ints['int(0)']); + + if ($type instanceof TLiteralInt) { + if ($type->value === 0) { + $had_zero = true; + } + + if ($combination->ints !== null && count($combination->ints) < $literal_limit) { + $combination->ints[$type_key] = $type; + } else { + $combination->ints[$type_key] = $type; + + $all_nonnegative = !array_filter( + $combination->ints, + function ($int): bool { + return $int->value < 0; + } + ); + + if (isset($combination->value_types['int'])) { + $current_int_type = $combination->value_types['int']; + if ($current_int_type instanceof TIntRange) { + foreach ($combination->ints as $int) { + if (!$current_int_type->contains($int->value)) { + $current_int_type->min_bound = TIntRange::getNewLowestBound( + $current_int_type->min_bound, + $int->value + ); + $current_int_type->max_bound = TIntRange::getNewHighestBound( + $current_int_type->max_bound, + $int->value + ); + } + } + } + } + + $combination->ints = null; + + if (!isset($combination->value_types['int'])) { + $combination->value_types['int'] = $all_nonnegative + ? new TPositiveInt() + : new TNonspecificLiteralInt(); + } elseif ($combination->value_types['int'] instanceof TPositiveInt + && !$all_nonnegative + ) { + $combination->value_types['int'] = new TInt(); + } + } + } else { + if ($type instanceof TPositiveInt) { + if ($combination->ints) { + $all_nonnegative = !array_filter( + $combination->ints, + function ($int): bool { + return $int->value < 0; + } + ); + + if ($all_nonnegative) { + $combination->value_types['int'] = $type; + } else { + $combination->value_types['int'] = new TInt(); + } + } elseif (!isset($combination->value_types['int'])) { + $combination->value_types['int'] = $type; + } elseif ($combination->value_types['int'] instanceof TIntRange) { + //if we already had a range, we ensure the min is no higher than 1 + $combination->value_types['int']->min_bound = TIntRange::getNewLowestBound( + $combination->value_types['int']->min_bound, + 1 + ); + $combination->value_types['int']->max_bound = null; + } elseif (get_class($combination->value_types['int']) !== get_class($type)) { + $combination->value_types['int'] = new TInt(); + } + } elseif ($type instanceof TNonspecificLiteralInt) { + if ($combination->ints || !isset($combination->value_types['int'])) { + $combination->value_types['int'] = $type; + } elseif (isset($combination->value_types['int']) + && get_class($combination->value_types['int']) + !== get_class($type) + ) { + $combination->value_types['int'] = new TInt(); + } + } elseif ($type instanceof TIntRange) { + $type = clone $type; + if ($combination->ints) { + foreach ($combination->ints as $int) { + if (!$type->contains($int->value)) { + $type->min_bound = TIntRange::getNewLowestBound($type->min_bound, $int->value); + $type->max_bound = TIntRange::getNewHighestBound($type->max_bound, $int->value); + } + } + + $combination->value_types['int'] = $type; + } elseif (!isset($combination->value_types['int'])) { + $combination->value_types['int'] = $type; + } else { + $old_type = $combination->value_types['int']; + if ($old_type instanceof TIntRange) { + $type->min_bound = TIntRange::getNewLowestBound($old_type->min_bound, $type->min_bound); + $type->max_bound = TIntRange::getNewHighestBound($old_type->max_bound, $type->max_bound); + } elseif ($old_type instanceof TPositiveInt) { + $type->min_bound = TIntRange::getNewLowestBound($type->min_bound, 0); + $type->max_bound = null; + } else { + $type = new TInt(); + } + $combination->value_types['int'] = $type; + } + } else { + $combination->value_types['int'] = $type; + } + + $combination->ints = null; + } + + if ($had_zero + && isset($combination->value_types['int']) + && $combination->value_types['int'] instanceof TPositiveInt + ) { + if ($combination->ints === null) { + $combination->ints = ['int(0)' => new TLiteralInt(0)]; + } elseif ($type instanceof TLiteralInt && $type->value < 0) { + $combination->ints = null; + $combination->value_types['int'] = new TInt(); + } + } + } + + /** + * @return array + */ + private static function getSharedTypes(TypeCombination $combination, Codebase $codebase): array + { + /** @var array|null */ + $shared_classlikes = null; + + if ($combination->strings) { + foreach ($combination->strings as $string_type) { + $classlikes = self::getClassLikes($codebase, $string_type->value); + + if ($shared_classlikes === null) { + $shared_classlikes = $classlikes; + } elseif ($shared_classlikes) { + $shared_classlikes = array_intersect_key($shared_classlikes, $classlikes); + } + } + } + + if ($combination->class_string_types) { + foreach ($combination->class_string_types as $value_type) { + if ($value_type instanceof TNamedObject) { + $classlikes = self::getClassLikes($codebase, $value_type->value); + + if ($shared_classlikes === null) { + $shared_classlikes = $classlikes; + } elseif ($shared_classlikes) { + $shared_classlikes = array_intersect_key($shared_classlikes, $classlikes); + } + } + } + } + + return $shared_classlikes ?: []; + } + + /** + * @return array + */ + private static function getClassLikes(Codebase $codebase, string $fq_classlike_name): array + { + try { + $class_storage = $codebase->classlike_storage_provider->get($fq_classlike_name); + } catch (InvalidArgumentException $e) { + return []; + } + + $classlikes = []; + + $classlikes[$fq_classlike_name] = true; + + foreach ($class_storage->parent_classes as $parent_class) { + $classlikes[$parent_class] = true; + } + + foreach ($class_storage->parent_interfaces as $parent_interface) { + $classlikes[$parent_interface] = true; + } + + foreach ($class_storage->class_implements as $interface) { + $classlikes[$interface] = true; + } + + return $classlikes; + } + + /** + * @return list + */ + private static function handleKeyedArrayEntries( + TypeCombination $combination, + bool $overwrite_empty_array + ): array { + $new_types = []; + + if ($combination->array_type_params + && $combination->array_type_params[0]->allStringLiterals() + && $combination->array_always_filled + ) { + foreach ($combination->array_type_params[0]->getAtomicTypes() as $atomic_key_type) { + if ($atomic_key_type instanceof TLiteralString) { + $combination->objectlike_entries[$atomic_key_type->value] + = $combination->array_type_params[1]; + } + } + + $combination->array_type_params = []; + $combination->objectlike_sealed = false; + } + + if (!$combination->array_type_params + || $combination->array_type_params[1]->isEmpty() + ) { + if (!$overwrite_empty_array + && ($combination->array_type_params + && ($combination->array_type_params[1]->isEmpty() + || $combination->array_type_params[1]->isMixed())) + ) { + foreach ($combination->objectlike_entries as $objectlike_entry) { + $objectlike_entry->possibly_undefined = true; + } + } + + if ($combination->objectlike_value_type + && $combination->objectlike_value_type->isMixed() + ) { + $combination->objectlike_entries = array_filter( + $combination->objectlike_entries, + function (Union $type): bool { + return !$type->possibly_undefined; + } + ); + } + + if ($combination->objectlike_entries) { + if ($combination->all_arrays_callable) { + $objectlike = new TCallableKeyedArray($combination->objectlike_entries); + } else { + $objectlike = new TKeyedArray($combination->objectlike_entries); + } + + if ($combination->objectlike_sealed && !$combination->array_type_params) { + $objectlike->sealed = true; + } + + if ($combination->objectlike_key_type) { + $objectlike->previous_key_type = $combination->objectlike_key_type; + } elseif ($combination->array_type_params + && $combination->array_type_params[0]->isArrayKey() + ) { + $objectlike->previous_key_type = $combination->array_type_params[0]; + } + + if ($combination->objectlike_value_type) { + $objectlike->previous_value_type = $combination->objectlike_value_type; + } elseif ($combination->array_type_params + && $combination->array_type_params[1]->isMixed() + ) { + $objectlike->previous_value_type = $combination->array_type_params[1]; + } + + if ($combination->all_arrays_lists) { + $objectlike->is_list = true; + } + + $new_types[] = $objectlike; + } else { + $new_types[] = new TArray([Type::getArrayKey(), Type::getMixed()]); + } + + // if we're merging an empty array with an object-like, clobber empty array + $combination->array_type_params = []; + } + + return $new_types; + } + + /** + * @param array{Union, Union} $generic_type_params + */ + private static function getArrayTypeFromGenericParams( + ?Codebase $codebase, + TypeCombination $combination, + bool $overwrite_empty_array, + bool $allow_mixed_union, + Atomic $type, + array $generic_type_params + ): Atomic { + if ($combination->objectlike_entries) { + $objectlike_generic_type = null; + + $objectlike_keys = []; + + foreach ($combination->objectlike_entries as $property_name => $property_type) { + $objectlike_generic_type = Type::combineUnionTypes( + clone $property_type, + $objectlike_generic_type, + $codebase, + $overwrite_empty_array + ); + + if (is_int($property_name)) { + $objectlike_keys[$property_name] = new TLiteralInt($property_name); + } elseif ($type instanceof TKeyedArray && isset($type->class_strings[$property_name])) { + $objectlike_keys[$property_name] = new TLiteralClassString($property_name); + } else { + $objectlike_keys[$property_name] = new TLiteralString($property_name); + } + } + + if ($combination->objectlike_value_type) { + $objectlike_generic_type = Type::combineUnionTypes( + $combination->objectlike_value_type, + $objectlike_generic_type, + $codebase, + $overwrite_empty_array + ); + } + + $objectlike_generic_type->possibly_undefined = false; + + $objectlike_key_type = new Union(array_values($objectlike_keys)); + + $objectlike_key_type = Type::combineUnionTypes( + $combination->objectlike_key_type, + $objectlike_key_type, + $codebase, + $overwrite_empty_array + ); + + $generic_type_params[0] = Type::combineUnionTypes( + $generic_type_params[0], + $objectlike_key_type, + $codebase, + $overwrite_empty_array, + $allow_mixed_union + ); + + if (!$generic_type_params[1]->isMixed()) { + $generic_type_params[1] = Type::combineUnionTypes( + $generic_type_params[1], + $objectlike_generic_type, + $codebase, + $overwrite_empty_array, + $allow_mixed_union + ); + } + } + + if ($combination->all_arrays_callable) { + $array_type = new TCallableArray($generic_type_params); + } elseif ($combination->array_always_filled + || ($combination->array_sometimes_filled && $overwrite_empty_array) + || ($combination->objectlike_entries + && $combination->objectlike_sealed + && $overwrite_empty_array) + ) { + if ($combination->all_arrays_lists) { + if ($combination->objectlike_entries + && $combination->objectlike_sealed + ) { + $array_type = new TKeyedArray([$generic_type_params[1]]); + $array_type->previous_key_type = Type::getInt(); + $array_type->previous_value_type = $combination->array_type_params[1]; + $array_type->is_list = true; + } else { + $array_type = new TNonEmptyList($generic_type_params[1]); + + if ($combination->array_counts && count($combination->array_counts) === 1) { + $array_type->count = array_keys($combination->array_counts)[0]; + } + } + } else { + $array_type = new TNonEmptyArray($generic_type_params); + + if ($combination->array_counts && count($combination->array_counts) === 1) { + $array_type->count = array_keys($combination->array_counts)[0]; + } + } + } else { + if ($combination->all_arrays_class_string_maps + && count($combination->class_string_map_as_types) === 1 + && count($combination->class_string_map_names) === 1 + ) { + $array_type = new TClassStringMap( + array_keys($combination->class_string_map_names)[0], + array_values($combination->class_string_map_as_types)[0], + $generic_type_params[1] + ); + } elseif ($combination->all_arrays_lists) { + $array_type = new TList($generic_type_params[1]); + } else { + $array_type = new TArray($generic_type_params); + } + } + + return $array_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php new file mode 100644 index 00000000..3709534e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php @@ -0,0 +1,909 @@ +getAtomicTypes() as $return_type_part) { + $parts = self::expandAtomic( + $codebase, + $return_type_part, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + if (is_array($parts)) { + $new_return_type_parts = array_merge($new_return_type_parts, $parts); + $has_array_output = true; + } else { + $new_return_type_parts[] = $parts; + } + } + + if ($has_array_output) { + $fleshed_out_type = TypeCombiner::combine( + $new_return_type_parts, + $codebase + ); + } else { + $fleshed_out_type = new Union($new_return_type_parts); + } + + $fleshed_out_type->from_docblock = $return_type->from_docblock; + $fleshed_out_type->ignore_nullable_issues = $return_type->ignore_nullable_issues; + $fleshed_out_type->ignore_falsable_issues = $return_type->ignore_falsable_issues; + $fleshed_out_type->possibly_undefined = $return_type->possibly_undefined; + $fleshed_out_type->possibly_undefined_from_try = $return_type->possibly_undefined_from_try; + $fleshed_out_type->by_ref = $return_type->by_ref; + $fleshed_out_type->initialized = $return_type->initialized; + $fleshed_out_type->from_property = $return_type->from_property; + $fleshed_out_type->from_static_property = $return_type->from_static_property; + $fleshed_out_type->had_template = $return_type->had_template; + $fleshed_out_type->parent_nodes = $return_type->parent_nodes; + + return $fleshed_out_type; + } + + /** + * @param string|TNamedObject|TTemplateParam|null $static_class_type + * + * @return Atomic|non-empty-list + */ + public static function expandAtomic( + Codebase $codebase, + Atomic &$return_type, + ?string $self_class, + $static_class_type, + ?string $parent_class, + bool $evaluate_class_constants = true, + bool $evaluate_conditional_types = false, + bool $final = false, + bool $expand_generic = false, + bool $expand_templates = false + ) { + if ($return_type instanceof TNamedObject + || $return_type instanceof TTemplateParam + ) { + if ($return_type->extra_types) { + $new_intersection_types = []; + + foreach ($return_type->extra_types as &$extra_type) { + self::expandAtomic( + $codebase, + $extra_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $expand_generic, + $expand_templates + ); + + if ($extra_type instanceof TNamedObject && $extra_type->extra_types) { + $new_intersection_types = array_merge( + $new_intersection_types, + $extra_type->extra_types + ); + $extra_type->extra_types = []; + } + } + + if ($new_intersection_types) { + $return_type->extra_types = array_merge($return_type->extra_types, $new_intersection_types); + } + } + + if ($return_type instanceof TNamedObject) { + $return_type = self::expandNamedObject( + $codebase, + $return_type, + $self_class, + $static_class_type, + $parent_class, + $final, + $expand_generic + ); + } + } + + if ($return_type instanceof TClassString + && $return_type->as_type + ) { + $new_as_type = clone $return_type->as_type; + + self::expandAtomic( + $codebase, + $new_as_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + if ($new_as_type instanceof TNamedObject) { + $return_type->as_type = $new_as_type; + $return_type->as = $return_type->as_type->value; + } + } elseif ($return_type instanceof TTemplateParam) { + $new_as_type = self::expandUnion( + $codebase, + clone $return_type->as, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + if ($expand_templates) { + return array_values($new_as_type->getAtomicTypes()); + } + + $return_type->as = $new_as_type; + } + + if ($return_type instanceof TClassConstant) { + if ($return_type->fq_classlike_name === 'self' && $self_class) { + $return_type->fq_classlike_name = $self_class; + } + + if ($return_type->fq_classlike_name === 'static' && $self_class) { + $return_type->fq_classlike_name = is_string($static_class_type) ? $static_class_type : $self_class; + } + + if ($evaluate_class_constants && $codebase->classOrInterfaceOrEnumExists($return_type->fq_classlike_name)) { + if (strtolower($return_type->const_name) === 'class') { + return new TLiteralClassString($return_type->fq_classlike_name); + } + + $class_storage = $codebase->classlike_storage_provider->get($return_type->fq_classlike_name); + + if (strpos($return_type->const_name, '*') !== false) { + $matching_constants = array_merge( + array_keys($class_storage->constants), + array_keys($class_storage->enum_cases) + ); + + $const_name_part = substr($return_type->const_name, 0, -1); + + if ($const_name_part) { + $matching_constants = array_filter( + $matching_constants, + function ($constant_name) use ($const_name_part): bool { + return $constant_name !== $const_name_part + && strpos($constant_name, $const_name_part) === 0; + } + ); + } + } else { + $matching_constants = [$return_type->const_name]; + } + + $matching_constant_types = []; + + foreach ($matching_constants as $matching_constant) { + try { + $class_constant = $codebase->classlikes->getClassConstantType( + $return_type->fq_classlike_name, + $matching_constant, + ReflectionProperty::IS_PRIVATE + ); + } catch (CircularReferenceException $e) { + $class_constant = null; + } + + if ($class_constant) { + if ($class_constant->isSingle()) { + $class_constant = clone $class_constant; + + $matching_constant_types = array_merge( + array_values($class_constant->getAtomicTypes()), + $matching_constant_types + ); + } + } + } + + if ($matching_constant_types) { + return $matching_constant_types; + } + } + + return $return_type; + } + + if ($return_type instanceof TTypeAlias) { + $declaring_fq_classlike_name = $return_type->declaring_fq_classlike_name; + + if ($declaring_fq_classlike_name === 'self' && $self_class) { + $declaring_fq_classlike_name = $self_class; + } + + if ($evaluate_class_constants && $codebase->classOrInterfaceExists($declaring_fq_classlike_name)) { + $class_storage = $codebase->classlike_storage_provider->get($declaring_fq_classlike_name); + + $type_alias_name = $return_type->alias_name; + + if (isset($class_storage->type_aliases[$type_alias_name])) { + $resolved_type_alias = $class_storage->type_aliases[$type_alias_name]; + + if ($resolved_type_alias->replacement_atomic_types) { + $replacement_atomic_types = $resolved_type_alias->replacement_atomic_types; + + $recursively_fleshed_out_types = []; + + foreach ($replacement_atomic_types as $replacement_atomic_type) { + $recursively_fleshed_out_type = self::expandAtomic( + $codebase, + $replacement_atomic_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + if (is_array($recursively_fleshed_out_type)) { + $recursively_fleshed_out_types = array_merge( + $recursively_fleshed_out_type, + $recursively_fleshed_out_types + ); + } else { + $recursively_fleshed_out_types[] = $recursively_fleshed_out_type; + } + } + + return $recursively_fleshed_out_types; + } + } + } + + return $return_type; + } + + if ($return_type instanceof TKeyOfClassConstant + || $return_type instanceof TValueOfClassConstant + ) { + if ($return_type->fq_classlike_name === 'self' && $self_class) { + $return_type->fq_classlike_name = $self_class; + } + + if ($evaluate_class_constants && $codebase->classOrInterfaceExists($return_type->fq_classlike_name)) { + try { + $class_constant_type = $codebase->classlikes->getClassConstantType( + $return_type->fq_classlike_name, + $return_type->const_name, + ReflectionProperty::IS_PRIVATE + ); + } catch (CircularReferenceException $e) { + $class_constant_type = null; + } + + if ($class_constant_type) { + foreach ($class_constant_type->getAtomicTypes() as $const_type_atomic) { + if ($const_type_atomic instanceof TKeyedArray + || $const_type_atomic instanceof TArray + ) { + if ($const_type_atomic instanceof TKeyedArray) { + $const_type_atomic = $const_type_atomic->getGenericArrayType(); + } + + if ($return_type instanceof TKeyOfClassConstant) { + return array_values($const_type_atomic->type_params[0]->getAtomicTypes()); + } + + return array_values($const_type_atomic->type_params[1]->getAtomicTypes()); + } + } + } + } + + return $return_type; + } + + if ($return_type instanceof TIntMask) { + if (!$evaluate_class_constants) { + return new TInt(); + } + + $potential_ints = []; + + foreach ($return_type->values as $value_type) { + $new_value_type = self::expandAtomic( + $codebase, + $value_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + if (is_array($new_value_type)) { + $new_value_type = reset($new_value_type); + } + + if (!$new_value_type instanceof TLiteralInt) { + return new TInt(); + } + + $potential_ints[] = $new_value_type->value; + } + + return TypeParser::getComputedIntsFromMask($potential_ints); + } + + if ($return_type instanceof TIntMaskOf) { + if (!$evaluate_class_constants) { + return new TInt(); + } + + $value_type = $return_type->value; + + $new_value_types = self::expandAtomic( + $codebase, + $value_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + if (!is_array($new_value_types)) { + return new TInt(); + } + + $potential_ints = []; + + foreach ($new_value_types as $new_value_type) { + if (!$new_value_type instanceof TLiteralInt) { + return new TInt(); + } + + $potential_ints[] = $new_value_type->value; + } + + return TypeParser::getComputedIntsFromMask($potential_ints); + } + + if ($return_type instanceof TArray + || $return_type instanceof TGenericObject + || $return_type instanceof TIterable + ) { + foreach ($return_type->type_params as $k => $type_param) { + /** @psalm-suppress PropertyTypeCoercion */ + $return_type->type_params[$k] = self::expandUnion( + $codebase, + $type_param, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + } + } elseif ($return_type instanceof TKeyedArray) { + foreach ($return_type->properties as &$property_type) { + $property_type = self::expandUnion( + $codebase, + $property_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + } + } elseif ($return_type instanceof TList) { + $return_type->type_param = self::expandUnion( + $codebase, + $return_type->type_param, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + } + + if ($return_type instanceof TObjectWithProperties) { + foreach ($return_type->properties as &$property_type) { + $property_type = self::expandUnion( + $codebase, + $property_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + } + } + + if ($return_type instanceof TCallable + || $return_type instanceof TClosure + ) { + if ($return_type->params) { + foreach ($return_type->params as $param) { + if ($param->type) { + $param->type = self::expandUnion( + $codebase, + $param->type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + } + } + } + if ($return_type->return_type) { + $return_type->return_type = self::expandUnion( + $codebase, + $return_type->return_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + } + } + + if ($return_type instanceof TConditional) { + return self::expandConditional( + $codebase, + $return_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + } + + return $return_type; + } + + /** + * @param string|TNamedObject|TTemplateParam|null $static_class_type + * @return TNamedObject|TTemplateParam + */ + private static function expandNamedObject( + Codebase $codebase, + TNamedObject $return_type, + ?string $self_class, + $static_class_type, + ?string $parent_class, + bool $final = false, + bool &$expand_generic = false + ) { + if ($expand_generic + && get_class($return_type) === TNamedObject::class + && !$return_type->extra_types + && $codebase->classOrInterfaceExists($return_type->value) + ) { + $value = $codebase->classlikes->getUnAliasedName($return_type->value); + $container_class_storage = $codebase->classlike_storage_provider->get( + $value + ); + + if ($container_class_storage->template_types + && array_filter( + $container_class_storage->template_types, + function ($type_map) { + return !reset($type_map)->hasMixed(); + } + ) + ) { + $return_type = new TGenericObject( + $return_type->value, + array_values( + array_map( + function ($type_map) { + return clone reset($type_map); + }, + $container_class_storage->template_types + ) + ) + ); + + // we don't want to expand generic types recursively + $expand_generic = false; + } + } + + $return_type_lc = strtolower($return_type->value); + + if ($static_class_type && ($return_type_lc === 'static' || $return_type_lc === '$this')) { + if (is_string($static_class_type)) { + $return_type->value = $static_class_type; + } else { + if ($return_type instanceof TGenericObject + && $static_class_type instanceof TGenericObject + ) { + $return_type->value = $static_class_type->value; + } else { + $return_type = clone $static_class_type; + } + } + + if (!$final && $return_type instanceof TNamedObject) { + $return_type->was_static = true; + } + } elseif ($return_type->was_static + && ($static_class_type instanceof TNamedObject + || $static_class_type instanceof TTemplateParam) + ) { + $return_type = clone $return_type; + $cloned_static = clone $static_class_type; + $extra_static = $cloned_static->extra_types ?: []; + $cloned_static->extra_types = null; + + if ($cloned_static->getKey(false) !== $return_type->getKey(false)) { + $return_type->extra_types[$static_class_type->getKey()] = clone $cloned_static; + } + + foreach ($extra_static as $extra_static_type) { + if ($extra_static_type->getKey(false) !== $return_type->getKey(false)) { + $return_type->extra_types[$extra_static_type->getKey()] = clone $extra_static_type; + } + } + } elseif ($return_type->was_static && is_string($static_class_type) && $final) { + $return_type->value = $static_class_type; + $return_type->was_static = false; + } elseif ($self_class && $return_type_lc === 'self') { + $return_type->value = $self_class; + } elseif ($parent_class && $return_type_lc === 'parent') { + $return_type->value = $parent_class; + } else { + $return_type->value = $codebase->classlikes->getUnAliasedName($return_type->value); + } + + return $return_type; + } + + /** + * @param string|TNamedObject|TTemplateParam|null $static_class_type + * + * @return Atomic|non-empty-list + */ + private static function expandConditional( + Codebase $codebase, + TConditional $return_type, + ?string $self_class, + $static_class_type, + ?string $parent_class, + bool $evaluate_class_constants = true, + bool $evaluate_conditional_types = false, + bool $final = false, + bool $expand_generic = false, + bool $expand_templates = false + ) { + $new_as_type = self::expandUnion( + $codebase, + $return_type->as_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + $return_type->as_type = $new_as_type; + + if ($evaluate_conditional_types) { + $assertion = null; + + if ($return_type->conditional_type->isSingle()) { + foreach ($return_type->conditional_type->getAtomicTypes() as $condition_atomic_type) { + $candidate = self::expandAtomic( + $codebase, + $condition_atomic_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + if (!is_array($candidate)) { + $assertion = $candidate->getAssertionString(); + } + } + } + + $if_conditional_return_types = []; + + foreach ($return_type->if_type->getAtomicTypes() as $if_atomic_type) { + $candidate = self::expandAtomic( + $codebase, + $if_atomic_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + $candidate_types = is_array($candidate) ? $candidate : [$candidate]; + + $if_conditional_return_types = array_merge( + $if_conditional_return_types, + $candidate_types + ); + } + + $else_conditional_return_types = []; + + foreach ($return_type->else_type->getAtomicTypes() as $else_atomic_type) { + $candidate = self::expandAtomic( + $codebase, + $else_atomic_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + $candidate_types = is_array($candidate) ? $candidate : [$candidate]; + + $else_conditional_return_types = array_merge( + $else_conditional_return_types, + $candidate_types + ); + } + + if ($assertion && $return_type->param_name === (string) $return_type->if_type) { + $if_conditional_return_type = TypeCombiner::combine( + $if_conditional_return_types, + $codebase + ); + + $if_conditional_return_type = SimpleAssertionReconciler::reconcile( + $assertion, + $codebase, + $if_conditional_return_type + ); + + + if ($if_conditional_return_type) { + $if_conditional_return_types = array_values($if_conditional_return_type->getAtomicTypes()); + } + } + + if ($assertion && $return_type->param_name === (string) $return_type->else_type) { + $else_conditional_return_type = TypeCombiner::combine( + $else_conditional_return_types, + $codebase + ); + + $else_conditional_return_type = SimpleNegatedAssertionReconciler::reconcile( + $codebase, + $assertion, + $else_conditional_return_type + ); + + if ($else_conditional_return_type) { + $else_conditional_return_types = array_values($else_conditional_return_type->getAtomicTypes()); + } + } + + $all_conditional_return_types = array_merge( + $if_conditional_return_types, + $else_conditional_return_types + ); + + $number_of_types = count($all_conditional_return_types); + // we filter TNever and TEmpty that have no bearing on the return type + if ($number_of_types > 1) { + $all_conditional_return_types = array_filter( + $all_conditional_return_types, + static function (Atomic $atomic_type): bool { + return !($atomic_type instanceof TEmpty + || $atomic_type instanceof TNever); + } + ); + } + + // if we still have more than one type, we remove TVoid and replace it by TNull + $number_of_types = count($all_conditional_return_types); + if ($number_of_types > 1) { + $all_conditional_return_types = array_filter( + $all_conditional_return_types, + static function (Atomic $atomic_type): bool { + return !$atomic_type instanceof TVoid; + } + ); + + if (count($all_conditional_return_types) !== $number_of_types) { + $null_type = new TNull(); + $null_type->from_docblock = true; + $all_conditional_return_types[] = $null_type; + } + } + + if ($all_conditional_return_types) { + $combined = TypeCombiner::combine( + array_values($all_conditional_return_types), + $codebase + ); + + return array_values($combined->getAtomicTypes()); + } + } + + $return_type->conditional_type = self::expandUnion( + $codebase, + $return_type->conditional_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + $return_type->if_type = self::expandUnion( + $codebase, + $return_type->if_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + $return_type->else_type = self::expandUnion( + $codebase, + $return_type->else_type, + $self_class, + $static_class_type, + $parent_class, + $evaluate_class_constants, + $evaluate_conditional_types, + $final, + $expand_generic, + $expand_templates + ); + + return $return_type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php new file mode 100644 index 00000000..fbcad54d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php @@ -0,0 +1,1336 @@ + $type_tokens + * @param array{int,int}|null $php_version + * @param array> $template_type_map + * @param array $type_aliases + * + */ + public static function parseTokens( + array $type_tokens, + ?array $php_version = null, + array $template_type_map = [], + array $type_aliases = [] + ): Union { + if (count($type_tokens) === 1) { + $only_token = $type_tokens[0]; + + // Note: valid identifiers can include class names or $this + if (!preg_match('@^(\$this|\\\\?[a-zA-Z_\x7f-\xff][\\\\\-0-9a-zA-Z_\x7f-\xff]*)$@', $only_token[0])) { + if (!is_numeric($only_token[0]) + && strpos($only_token[0], '\'') !== false + && strpos($only_token[0], '"') !== false + ) { + throw new TypeParseTreeException("Invalid type '$only_token[0]'"); + } + } else { + $only_token[0] = TypeTokenizer::fixScalarTerms($only_token[0], $php_version); + + $atomic = Atomic::create($only_token[0], $php_version, $template_type_map, $type_aliases); + $atomic->offset_start = 0; + $atomic->offset_end = strlen($only_token[0]); + $atomic->text = isset($only_token[2]) && $only_token[2] !== $only_token[0] ? $only_token[2] : null; + + return new Union([$atomic]); + } + } + + $parse_tree = (new ParseTreeCreator($type_tokens))->create(); + $codebase = ProjectAnalyzer::getInstance()->getCodebase(); + $parsed_type = self::getTypeFromTree( + $parse_tree, + $codebase, + $php_version, + $template_type_map, + $type_aliases + ); + + if (!($parsed_type instanceof Union)) { + $parsed_type = new Union([$parsed_type]); + } + + return $parsed_type; + } + + /** + * @param array{int,int}|null $php_version + * @param array> $template_type_map + * @param array $type_aliases + * + * @return Atomic|Union + */ + public static function getTypeFromTree( + ParseTree $parse_tree, + Codebase $codebase, + ?array $php_version = null, + array $template_type_map = [], + array $type_aliases = [] + ): TypeNode { + if ($parse_tree instanceof GenericTree) { + return self::getTypeFromGenericTree( + $parse_tree, + $codebase, + $template_type_map, + $type_aliases + ); + } + + if ($parse_tree instanceof UnionTree) { + return self::getTypeFromUnionTree($parse_tree, $codebase, $template_type_map, $type_aliases); + } + + if ($parse_tree instanceof IntersectionTree) { + return self::getTypeFromIntersectionTree($parse_tree, $codebase, $template_type_map, $type_aliases); + } + + if ($parse_tree instanceof KeyedArrayTree) { + return self::getTypeFromKeyedArrayTree($parse_tree, $codebase, $template_type_map, $type_aliases); + } + + if ($parse_tree instanceof CallableWithReturnTypeTree) { + $callable_type = self::getTypeFromTree( + $parse_tree->children[0], + $codebase, + null, + $template_type_map, + $type_aliases + ); + + if (!$callable_type instanceof TCallable && !$callable_type instanceof TClosure) { + throw new InvalidArgumentException('Parsing callable tree node should return TCallable'); + } + + if (!isset($parse_tree->children[1])) { + throw new TypeParseTreeException('Invalid return type'); + } + + $return_type = self::getTypeFromTree( + $parse_tree->children[1], + $codebase, + null, + $template_type_map, + $type_aliases + ); + + $callable_type->return_type = $return_type instanceof Union ? $return_type : new Union([$return_type]); + + return $callable_type; + } + + if ($parse_tree instanceof CallableTree) { + return self::getTypeFromCallableTree($parse_tree, $codebase, $template_type_map, $type_aliases); + } + + if ($parse_tree instanceof EncapsulationTree) { + if (!$parse_tree->terminated) { + throw new TypeParseTreeException('Unterminated parentheses'); + } + + if (!isset($parse_tree->children[0])) { + throw new TypeParseTreeException('Empty parentheses'); + } + + return self::getTypeFromTree( + $parse_tree->children[0], + $codebase, + null, + $template_type_map, + $type_aliases + ); + } + + if ($parse_tree instanceof NullableTree) { + if (!isset($parse_tree->children[0])) { + throw new TypeParseTreeException('Misplaced question mark'); + } + + $non_nullable_type = self::getTypeFromTree( + $parse_tree->children[0], + $codebase, + null, + $template_type_map, + $type_aliases + ); + + if ($non_nullable_type instanceof Union) { + $non_nullable_type->addType(new TNull); + + return $non_nullable_type; + } + + return TypeCombiner::combine([ + new TNull, + $non_nullable_type, + ]); + } + + if ($parse_tree instanceof MethodTree + || $parse_tree instanceof MethodWithReturnTypeTree + ) { + throw new TypeParseTreeException('Misplaced brackets'); + } + + if ($parse_tree instanceof IndexedAccessTree) { + return self::getTypeFromIndexAccessTree($parse_tree, $template_type_map); + } + + if ($parse_tree instanceof TemplateAsTree) { + return new TTemplateParam( + $parse_tree->param_name, + new Union([new TNamedObject($parse_tree->as)]), + 'class-string-map' + ); + } + + if ($parse_tree instanceof ConditionalTree) { + $template_param_name = $parse_tree->condition->param_name; + + if (!isset($template_type_map[$template_param_name])) { + throw new TypeParseTreeException('Unrecognized template \'' . $template_param_name . '\''); + } + + if (count($parse_tree->children) !== 2) { + throw new TypeParseTreeException('Invalid conditional'); + } + + $first_class = array_keys($template_type_map[$template_param_name])[0]; + + $conditional_type = self::getTypeFromTree( + $parse_tree->condition->children[0], + $codebase, + null, + $template_type_map, + $type_aliases + ); + + $if_type = self::getTypeFromTree( + $parse_tree->children[0], + $codebase, + null, + $template_type_map, + $type_aliases + ); + + $else_type = self::getTypeFromTree( + $parse_tree->children[1], + $codebase, + null, + $template_type_map, + $type_aliases + ); + + if ($conditional_type instanceof Atomic) { + $conditional_type = new Union([$conditional_type]); + } + + if ($if_type instanceof Atomic) { + $if_type = new Union([$if_type]); + } + + if ($else_type instanceof Atomic) { + $else_type = new Union([$else_type]); + } + + return new TConditional( + $template_param_name, + $first_class, + $template_type_map[$template_param_name][$first_class], + $conditional_type, + $if_type, + $else_type + ); + } + + if (!$parse_tree instanceof Value) { + throw new InvalidArgumentException('Unrecognised parse tree type ' . get_class($parse_tree)); + } + + if ($parse_tree->value[0] === '"' || $parse_tree->value[0] === '\'') { + return new TLiteralString(substr($parse_tree->value, 1, -1)); + } + + if (strpos($parse_tree->value, '::')) { + [$fq_classlike_name, $const_name] = explode('::', $parse_tree->value); + + if (isset($template_type_map[$fq_classlike_name]) && $const_name === 'class') { + $first_class = array_keys($template_type_map[$fq_classlike_name])[0]; + + return self::getGenericParamClass( + $fq_classlike_name, + $template_type_map[$fq_classlike_name][$first_class], + $first_class + ); + } + + if ($const_name === 'class') { + return new TLiteralClassString($fq_classlike_name); + } + + return new TClassConstant($fq_classlike_name, $const_name); + } + + if (preg_match('/^\-?(0|[1-9][0-9]*)(\.[0-9]{1,})$/', $parse_tree->value)) { + return new TLiteralFloat((float) $parse_tree->value); + } + + if (preg_match('/^\-?(0|[1-9][0-9]*)$/', $parse_tree->value)) { + return new TLiteralInt((int) $parse_tree->value); + } + + if (!preg_match('@^(\$this|\\\\?[a-zA-Z_\x7f-\xff][\\\\\-0-9a-zA-Z_\x7f-\xff]*)$@', $parse_tree->value)) { + throw new TypeParseTreeException('Invalid type \'' . $parse_tree->value . '\''); + } + + $atomic_type_string = TypeTokenizer::fixScalarTerms($parse_tree->value, $php_version); + + $atomic_type = Atomic::create($atomic_type_string, $php_version, $template_type_map, $type_aliases); + + $atomic_type->offset_start = $parse_tree->offset_start; + $atomic_type->offset_end = $parse_tree->offset_end; + $atomic_type->text = $parse_tree->text; + + return $atomic_type; + } + + private static function getGenericParamClass( + string $param_name, + Union $as, + string $defining_class + ): TTemplateParamClass { + if ($as->hasMixed()) { + return new TTemplateParamClass( + $param_name, + 'object', + null, + $defining_class + ); + } + + if (!$as->isSingle()) { + throw new TypeParseTreeException( + 'Invalid templated classname \'' . $as . '\'' + ); + } + + foreach ($as->getAtomicTypes() as $t) { + if ($t instanceof TObject) { + return new TTemplateParamClass( + $param_name, + 'object', + null, + $defining_class + ); + } + + if ($t instanceof TIterable) { + $traversable = new TGenericObject( + 'Traversable', + $t->type_params + ); + + $as->substitute(new Union([$t]), new Union([$traversable])); + + return new TTemplateParamClass( + $param_name, + $traversable->value, + $traversable, + $defining_class + ); + } + + if ($t instanceof TTemplateParam) { + $t_atomic_type = count($t->as->getAtomicTypes()) === 1 ? $t->as->getSingleAtomic() : null; + + if (!$t_atomic_type instanceof TNamedObject) { + $t_atomic_type = null; + } + + return new TTemplateParamClass( + $t->param_name, + $t_atomic_type->value ?? 'object', + $t_atomic_type, + $t->defining_class + ); + } + + if (!$t instanceof TNamedObject) { + throw new TypeParseTreeException( + 'Invalid templated classname \'' . $t->getId() . '\'' + ); + } + + return new TTemplateParamClass( + $param_name, + $t->value, + $t, + $defining_class + ); + } + + throw new LogicException('Should never get here'); + } + + /** + * @param non-empty-list $potential_ints + * @return non-empty-list + */ + public static function getComputedIntsFromMask(array $potential_ints): array + { + /** @var list */ + $potential_values = []; + + foreach ($potential_ints as $ith) { + $new_values = []; + + $new_values[] = $ith; + + if ($ith !== 0) { + foreach ($potential_values as $potential_value) { + $new_values[] = $ith | $potential_value; + } + } + + $potential_values = array_merge($new_values, $potential_values); + } + + array_unshift($potential_values, 0); + $potential_values = array_unique($potential_values); + + return array_map( + function ($int) { + return new TLiteralInt($int); + }, + array_values($potential_values) + ); + } + + /** + * @param array> $template_type_map + * @param array $type_aliases + * @return Atomic|Union + * @throws TypeParseTreeException + * @psalm-suppress ComplexMethod to be refactored + */ + private static function getTypeFromGenericTree( + GenericTree $parse_tree, + Codebase $codebase, + array $template_type_map, + array $type_aliases + ) { + $generic_type = $parse_tree->value; + + $generic_params = []; + + foreach ($parse_tree->children as $i => $child_tree) { + $tree_type = self::getTypeFromTree( + $child_tree, + $codebase, + null, + $template_type_map, + $type_aliases + ); + + if ($generic_type === 'class-string-map' + && $i === 0 + ) { + if ($tree_type instanceof TTemplateParam) { + $template_type_map[$tree_type->param_name] = ['class-string-map' => $tree_type->as]; + } elseif ($tree_type instanceof TNamedObject) { + $template_type_map[$tree_type->value] = ['class-string-map' => Type::getObject()]; + } + } + + $generic_params[] = $tree_type instanceof Union ? $tree_type : new Union([$tree_type]); + } + + $generic_type_value = TypeTokenizer::fixScalarTerms($generic_type); + + if (($generic_type_value === 'array' + || $generic_type_value === 'non-empty-array' + || $generic_type_value === 'associative-array') + && count($generic_params) === 1 + ) { + array_unshift($generic_params, new Union([new TArrayKey])); + } elseif (count($generic_params) === 1 + && in_array( + $generic_type_value, + ['iterable', 'Traversable', 'Iterator', 'IteratorAggregate', 'arraylike-object'], + true + ) + ) { + array_unshift($generic_params, new Union([new TMixed])); + } elseif ($generic_type_value === 'Generator') { + if (count($generic_params) === 1) { + array_unshift($generic_params, new Union([new TMixed])); + } + + for ($i = 0, $l = 4 - count($generic_params); $i < $l; ++$i) { + $generic_params[] = new Union([new TMixed]); + } + } + + if (!$generic_params) { + throw new TypeParseTreeException('No generic params provided for type'); + } + + if ($generic_type_value === 'array' || $generic_type_value === 'associative-array') { + if ($generic_params[0]->isMixed()) { + $generic_params[0] = Type::getArrayKey(); + } + + if (count($generic_params) !== 2) { + throw new TypeParseTreeException('Too many template parameters for array'); + } + + return new TArray($generic_params); + } + + if ($generic_type_value === 'arraylike-object') { + $traversable = new TGenericObject('Traversable', $generic_params); + $array_acccess = new TGenericObject('ArrayAccess', $generic_params); + $countable = new TNamedObject('Countable'); + + $traversable->extra_types[$array_acccess->getKey()] = $array_acccess; + $traversable->extra_types[$countable->getKey()] = $countable; + + return $traversable; + } + + if ($generic_type_value === 'non-empty-array') { + if ($generic_params[0]->isMixed()) { + $generic_params[0] = Type::getArrayKey(); + } + + if (count($generic_params) !== 2) { + throw new TypeParseTreeException('Too many template parameters for non-empty-array'); + } + + return new TNonEmptyArray($generic_params); + } + + if ($generic_type_value === 'iterable') { + return new TIterable($generic_params); + } + + if ($generic_type_value === 'list') { + return new TList($generic_params[0]); + } + + if ($generic_type_value === 'non-empty-list') { + return new TNonEmptyList($generic_params[0]); + } + + if ($generic_type_value === 'class-string' || $generic_type_value === 'interface-string') { + $class_name = (string)$generic_params[0]; + + if (isset($template_type_map[$class_name])) { + $first_class = array_keys($template_type_map[$class_name])[0]; + + return self::getGenericParamClass( + $class_name, + $template_type_map[$class_name][$first_class], + $first_class + ); + } + + $param_union_types = array_values($generic_params[0]->getAtomicTypes()); + + if (count($param_union_types) > 1) { + throw new TypeParseTreeException('Union types are not allowed in class string param'); + } + + if (!$param_union_types[0] instanceof TNamedObject) { + throw new TypeParseTreeException('Class string param should be a named object'); + } + + return new TClassString($class_name, $param_union_types[0]); + } + + if ($generic_type_value === 'class-string-map') { + if (count($generic_params) !== 2) { + throw new TypeParseTreeException( + 'There should only be two params for class-string-map, ' + . count($generic_params) . ' provided' + ); + } + + $template_marker_parts = array_values($generic_params[0]->getAtomicTypes()); + + $template_marker = $template_marker_parts[0]; + + $template_as_type = null; + + if ($template_marker instanceof TNamedObject) { + $template_param_name = $template_marker->value; + } elseif ($template_marker instanceof TTemplateParam) { + $template_param_name = $template_marker->param_name; + $template_as_type = $template_marker->as->getSingleAtomic(); + + if (!$template_as_type instanceof TNamedObject) { + throw new TypeParseTreeException( + 'Unrecognised as type' + ); + } + } else { + throw new TypeParseTreeException( + 'Unrecognised class-string-map templated param' + ); + } + + return new TClassStringMap( + $template_param_name, + $template_as_type, + $generic_params[1] + ); + } + + if ($generic_type_value === 'key-of') { + $param_name = (string)$generic_params[0]; + + if (isset($template_type_map[$param_name])) { + $defining_class = array_keys($template_type_map[$param_name])[0]; + + return new TTemplateKeyOf( + $param_name, + $defining_class, + $template_type_map[$param_name][$defining_class] + ); + } + + $param_union_types = array_values($generic_params[0]->getAtomicTypes()); + + if (count($param_union_types) > 1) { + throw new TypeParseTreeException('Union types are not allowed in key-of type'); + } + + if (!$param_union_types[0] instanceof TClassConstant) { + throw new TypeParseTreeException( + 'Untemplated key-of param ' . $param_name . ' should be a class constant' + ); + } + + return new TKeyOfClassConstant( + $param_union_types[0]->fq_classlike_name, + $param_union_types[0]->const_name + ); + } + + if ($generic_type_value === 'value-of') { + $param_name = (string)$generic_params[0]; + + $param_union_types = array_values($generic_params[0]->getAtomicTypes()); + + if (count($param_union_types) > 1) { + throw new TypeParseTreeException('Union types are not allowed in value-of type'); + } + + if (!$param_union_types[0] instanceof TClassConstant) { + throw new TypeParseTreeException( + 'Untemplated value-of param ' . $param_name . ' should be a class constant' + ); + } + + return new TValueOfClassConstant( + $param_union_types[0]->fq_classlike_name, + $param_union_types[0]->const_name + ); + } + + if ($generic_type_value === 'int-mask') { + $atomic_types = []; + + foreach ($generic_params as $generic_param) { + if (!$generic_param->isSingle()) { + throw new TypeParseTreeException( + 'int-mask types must all be non-union' + ); + } + + $generic_param_atomics = $generic_param->getAtomicTypes(); + + $atomic_type = reset($generic_param_atomics); + + if ($atomic_type instanceof TNamedObject) { + if (defined($atomic_type->value)) { + /** @var mixed */ + $constant_value = constant($atomic_type->value); + + if (!is_int($constant_value)) { + throw new TypeParseTreeException( + 'int-mask types must all be integer values' + ); + } + + $atomic_type = new TLiteralInt($constant_value); + } else { + throw new TypeParseTreeException( + 'int-mask types must all be integer values' + ); + } + } + + if (!$atomic_type instanceof TLiteralInt + && !($atomic_type instanceof TClassConstant + && strpos($atomic_type->const_name, '*') === false) + ) { + throw new TypeParseTreeException( + 'int-mask types must all be integer values or scalar class constants' + ); + } + + $atomic_types[] = $atomic_type; + } + + $potential_ints = []; + + foreach ($atomic_types as $atomic_type) { + if (!$atomic_type instanceof TLiteralInt) { + return new TIntMask($atomic_types); + } + + $potential_ints[] = $atomic_type->value; + } + + return new Union(self::getComputedIntsFromMask($potential_ints)); + } + + if ($generic_type_value === 'int-mask-of') { + $param_union_types = array_values($generic_params[0]->getAtomicTypes()); + + if (count($param_union_types) > 1) { + throw new TypeParseTreeException('Union types are not allowed in value-of type'); + } + + $param_type = $param_union_types[0]; + + if (!$param_type instanceof TClassConstant + && !$param_type instanceof TValueOfClassConstant + && !$param_type instanceof TKeyOfClassConstant + ) { + throw new TypeParseTreeException( + 'Invalid reference passed to int-mask-of' + ); + } elseif ($param_type instanceof TClassConstant + && strpos($param_type->const_name, '*') === false + ) { + throw new TypeParseTreeException( + 'Class constant passed to int-mask-of must be a wildcard type' + ); + } + + return new TIntMaskOf($param_type); + } + + if ($generic_type_value === 'int') { + if (count($generic_params) !== 2) { + throw new TypeParseTreeException('int range must have 2 params'); + } + assert(count($parse_tree->children) === 2); + + $get_int_range_bound = function (ParseTree $parse_tree, Union $generic_param, string $bound_name): ?int { + if (!$parse_tree instanceof Value + || count($generic_param->getAtomicTypes()) > 1 + || (!$generic_param->getSingleAtomic() instanceof TLiteralInt + && $parse_tree->value !== $bound_name + && $parse_tree->text !== $bound_name + ) + ) { + throw new TypeParseTreeException( + "Invalid type \"{$generic_param->getId()}\" as int $bound_name boundary" + ); + } + + $generic_param_atomic = $generic_param->getSingleAtomic(); + return $generic_param_atomic instanceof TLiteralInt ? $generic_param_atomic->value : null; + }; + + $min_bound = $get_int_range_bound($parse_tree->children[0], $generic_params[0], TIntRange::BOUND_MIN); + $max_bound = $get_int_range_bound($parse_tree->children[1], $generic_params[1], TIntRange::BOUND_MAX); + + if ($min_bound === null && $max_bound === null) { + return new TInt(); + } + + if ($min_bound === 1 && $max_bound === null) { + return new TPositiveInt(); + } + + if (is_int($min_bound) && is_int($max_bound) && $min_bound > $max_bound) { + throw new TypeParseTreeException( + "Min bound can't be greater than max bound, int<$min_bound, $max_bound> given" + ); + } + + return new TIntRange($min_bound, $max_bound); + } + + if (isset(TypeTokenizer::PSALM_RESERVED_WORDS[$generic_type_value]) + && $generic_type_value !== 'self' + && $generic_type_value !== 'static' + ) { + throw new TypeParseTreeException('Cannot create generic object with reserved word'); + } + + return new TGenericObject($generic_type_value, $generic_params); + } + + /** + * @param array> $template_type_map + * @param array $type_aliases + * @throws TypeParseTreeException + */ + private static function getTypeFromUnionTree( + UnionTree $parse_tree, + Codebase $codebase, + array $template_type_map, + array $type_aliases + ): Union { + $has_null = false; + + $atomic_types = []; + + foreach ($parse_tree->children as $child_tree) { + if ($child_tree instanceof NullableTree) { + if (!isset($child_tree->children[0])) { + throw new TypeParseTreeException('Invalid ? character'); + } + + $atomic_type = self::getTypeFromTree( + $child_tree->children[0], + $codebase, + null, + $template_type_map, + $type_aliases + ); + $has_null = true; + } else { + $atomic_type = self::getTypeFromTree( + $child_tree, + $codebase, + null, + $template_type_map, + $type_aliases + ); + } + + if ($atomic_type instanceof Union) { + foreach ($atomic_type->getAtomicTypes() as $type) { + $atomic_types[] = $type; + } + + continue; + } + + $atomic_types[] = $atomic_type; + } + + if ($has_null) { + $atomic_types[] = new TNull; + } + + if (!$atomic_types) { + throw new TypeParseTreeException( + 'No atomic types found' + ); + } + + return TypeCombiner::combine($atomic_types); + } + + /** + * @param array> $template_type_map + * @param array $type_aliases + * @throws TypeParseTreeException + */ + private static function getTypeFromIntersectionTree( + IntersectionTree $parse_tree, + Codebase $codebase, + array $template_type_map, + array $type_aliases + ): Atomic { + $intersection_types = array_map( + function (ParseTree $child_tree) use ($codebase, $template_type_map, $type_aliases) { + $atomic_type = self::getTypeFromTree( + $child_tree, + $codebase, + null, + $template_type_map, + $type_aliases + ); + + if (!$atomic_type instanceof Atomic) { + throw new TypeParseTreeException( + 'Intersection types cannot contain unions' + ); + } + + return $atomic_type; + }, + $parse_tree->children + ); + + $first_type = reset($intersection_types); + $last_type = end($intersection_types); + + $onlyTKeyedArray = $first_type instanceof TKeyedArray + || $last_type instanceof TKeyedArray; + + foreach ($intersection_types as $intersection_type) { + if (!$intersection_type instanceof TKeyedArray + && ($intersection_type !== $first_type + || !$first_type instanceof TArray) + && ($intersection_type !== $last_type + || !$last_type instanceof TArray) + ) { + $onlyTKeyedArray = false; + break; + } + } + + if ($onlyTKeyedArray) { + /** @var non-empty-array */ + $properties = []; + + if ($first_type instanceof TArray) { + array_shift($intersection_types); + } elseif ($last_type instanceof TArray) { + array_pop($intersection_types); + } + + /** @var TKeyedArray $intersection_type */ + foreach ($intersection_types as $intersection_type) { + foreach ($intersection_type->properties as $property => $property_type) { + if (!array_key_exists($property, $properties)) { + $properties[$property] = clone $property_type; + continue; + } + + $intersection_type = Type::intersectUnionTypes( + $properties[$property], + $property_type, + $codebase + ); + if ($intersection_type === null) { + throw new TypeParseTreeException( + 'Incompatible intersection types for "' . $property . '", ' + . $properties[$property] . ' and ' . $property_type + . ' provided' + ); + } + $properties[$property] = $intersection_type; + } + } + + $keyed_array = new TKeyedArray($properties); + + if ($first_type instanceof TArray) { + $keyed_array->previous_key_type = $first_type->type_params[0]; + $keyed_array->previous_value_type = $first_type->type_params[1]; + } elseif ($last_type instanceof TArray) { + $keyed_array->previous_key_type = $last_type->type_params[0]; + $keyed_array->previous_value_type = $last_type->type_params[1]; + } + + return $keyed_array; + } + + $keyed_intersection_types = []; + + if ($intersection_types[0] instanceof TTypeAlias) { + foreach ($intersection_types as $intersection_type) { + if (!$intersection_type instanceof TTypeAlias) { + throw new TypeParseTreeException( + 'Intersection types with a type alias can only be comprised of other type aliases, ' + . get_class($intersection_type) . ' provided' + ); + } + + $keyed_intersection_types[$intersection_type->getKey()] = $intersection_type; + } + + $first_type = array_shift($keyed_intersection_types); + + if ($keyed_intersection_types) { + $first_type->extra_types = $keyed_intersection_types; + } + } else { + foreach ($intersection_types as $intersection_type) { + if (!$intersection_type instanceof TIterable + && !$intersection_type instanceof TNamedObject + && !$intersection_type instanceof TTemplateParam + && !$intersection_type instanceof TObjectWithProperties + ) { + throw new TypeParseTreeException( + 'Intersection types must be all objects, ' + . get_class($intersection_type) . ' provided' + ); + } + + $keyed_intersection_types[$intersection_type instanceof TIterable + ? $intersection_type->getId() + : $intersection_type->getKey()] = $intersection_type; + } + + $intersect_static = false; + + if (isset($keyed_intersection_types['static'])) { + unset($keyed_intersection_types['static']); + $intersect_static = true; + } + + if (!$keyed_intersection_types && $intersect_static) { + return new TNamedObject('static'); + } + + $first_type = array_shift($keyed_intersection_types); + + if ($intersect_static + && $first_type instanceof TNamedObject + ) { + $first_type->was_static = true; + } + + if ($keyed_intersection_types) { + $first_type->extra_types = $keyed_intersection_types; + } + } + + return $first_type; + } + + /** + * @param array> $template_type_map + * @param array $type_aliases + * @return TCallable|TClosure + * @throws TypeParseTreeException + */ + private static function getTypeFromCallableTree( + CallableTree $parse_tree, + Codebase $codebase, + array $template_type_map, + array $type_aliases + ) { + $params = array_map( + /** + * @return FunctionLikeParameter + */ + function (ParseTree $child_tree) use ( + $codebase, + $template_type_map, + $type_aliases + ): FunctionLikeParameter { + $is_variadic = false; + $is_optional = false; + + if ($child_tree instanceof CallableParamTree) { + if (isset($child_tree->children[0])) { + $tree_type = self::getTypeFromTree( + $child_tree->children[0], + $codebase, + null, + $template_type_map, + $type_aliases + ); + } else { + $tree_type = new TMixed(); + } + + $is_variadic = $child_tree->variadic; + $is_optional = $child_tree->has_default; + } else { + if ($child_tree instanceof Value && strpos($child_tree->value, '$') > 0) { + $child_tree->value = preg_replace('/(.+)\$.*/', '$1', $child_tree->value); + } + + $tree_type = self::getTypeFromTree( + $child_tree, + $codebase, + null, + $template_type_map, + $type_aliases + ); + } + + $tree_type = $tree_type instanceof Union ? $tree_type : new Union([$tree_type]); + + $param = new FunctionLikeParameter( + '', + false, + $tree_type, + null, + null, + $is_optional, + false, + $is_variadic + ); + + // type is not authoritative + $param->signature_type = null; + + return $param; + }, + $parse_tree->children + ); + $pure = strpos($parse_tree->value, 'pure-') === 0 ? true : null; + + if (in_array(strtolower($parse_tree->value), ['closure', '\closure', 'pure-closure'], true)) { + return new TClosure('Closure', $params, null, $pure); + } + + return new TCallable('callable', $params, null, $pure); + } + + /** + * @param array> $template_type_map + * @throws TypeParseTreeException + */ + private static function getTypeFromIndexAccessTree( + IndexedAccessTree $parse_tree, + array $template_type_map + ): TTemplateIndexedAccess { + if (!isset($parse_tree->children[0]) || !$parse_tree->children[0] instanceof Value) { + throw new TypeParseTreeException('Unrecognised indexed access'); + } + + $offset_param_name = $parse_tree->value; + $array_param_name = $parse_tree->children[0]->value; + + if (!isset($template_type_map[$offset_param_name])) { + throw new TypeParseTreeException('Unrecognised template param ' . $offset_param_name); + } + + if (!isset($template_type_map[$array_param_name])) { + throw new TypeParseTreeException('Unrecognised template param ' . $array_param_name); + } + + $offset_template_data = $template_type_map[$offset_param_name]; + + $offset_defining_class = array_keys($offset_template_data)[0]; + + if (!$offset_defining_class + && isset($offset_template_data['']) + && $offset_template_data['']->isSingle() + ) { + $offset_template_type = $offset_template_data['']->getSingleAtomic(); + + if ($offset_template_type instanceof TTemplateKeyOf) { + $offset_defining_class = $offset_template_type->defining_class; + } + } + + $array_defining_class = array_keys($template_type_map[$array_param_name])[0]; + + if ($offset_defining_class !== $array_defining_class + && strpos($offset_defining_class, 'fn-') !== 0 + ) { + throw new TypeParseTreeException('Template params are defined in different locations'); + } + + return new TTemplateIndexedAccess( + $array_param_name, + $offset_param_name, + $array_defining_class + ); + } + + /** + * @param array> $template_type_map + * @param array $type_aliases + * @return TCallableKeyedArray|TKeyedArray|TObjectWithProperties + * @throws TypeParseTreeException + */ + private static function getTypeFromKeyedArrayTree( + KeyedArrayTree $parse_tree, + Codebase $codebase, + array $template_type_map, + array $type_aliases + ) { + $properties = []; + $class_strings = []; + + $type = $parse_tree->value; + + $is_tuple = true; + + foreach ($parse_tree->children as $i => $property_branch) { + $class_string = false; + + if (!$property_branch instanceof KeyedArrayPropertyTree) { + $property_type = self::getTypeFromTree( + $property_branch, + $codebase, + null, + $template_type_map, + $type_aliases + ); + $property_maybe_undefined = false; + $property_key = (string)$i; + } elseif (count($property_branch->children) === 1) { + $property_type = self::getTypeFromTree( + $property_branch->children[0], + $codebase, + null, + $template_type_map, + $type_aliases + ); + $property_maybe_undefined = $property_branch->possibly_undefined; + if (strpos($property_branch->value, '::')) { + [$fq_classlike_name, $const_name] = explode('::', $property_branch->value); + if ($const_name === 'class') { + $property_key = $fq_classlike_name; + $class_string = true; + } else { + $property_key = $property_branch->value; + } + } else { + $property_key = $property_branch->value; + } + $is_tuple = false; + } else { + throw new TypeParseTreeException( + 'Missing property type' + ); + } + + if ($property_key[0] === '\'' || $property_key[0] === '"') { + $property_key = stripslashes(substr($property_key, 1, -1)); + } + + if (!$property_type instanceof Union) { + $property_type = new Union([$property_type]); + } + + if ($property_maybe_undefined) { + $property_type->possibly_undefined = true; + } + + $properties[$property_key] = $property_type; + if ($class_string) { + $class_strings[$property_key] = true; + } + } + + if ($type !== 'array' && $type !== 'object' && $type !== 'callable-array') { + throw new TypeParseTreeException('Unexpected brace character'); + } + + if (!$properties) { + throw new TypeParseTreeException('No properties supplied for TKeyedArray'); + } + + if ($type === 'object') { + return new TObjectWithProperties($properties); + } + + if ($type === 'callable-array') { + return new TCallableKeyedArray($properties); + } + + $object_like = new TKeyedArray($properties, $class_strings); + + if ($is_tuple) { + $object_like->sealed = true; + $object_like->is_list = true; + } + + return $object_like; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php new file mode 100644 index 00000000..020a3b27 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php @@ -0,0 +1,511 @@ + + */ + public const PSALM_RESERVED_WORDS = [ + 'int' => true, + 'string' => true, + 'float' => true, + 'bool' => true, + 'false' => true, + 'true' => true, + 'object' => true, + 'empty' => true, + 'callable' => true, + 'array' => true, + 'non-empty-array' => true, + 'non-empty-string' => true, + 'non-falsy-string' => true, + 'iterable' => true, + 'null' => true, + 'mixed' => true, + 'numeric-string' => true, + 'class-string' => true, + 'interface-string' => true, + 'trait-string' => true, + 'callable-string' => true, + 'callable-array' => true, + 'callable-object' => true, + 'stringable-object' => true, + 'pure-callable' => true, + 'pure-Closure' => true, + 'mysql-escaped-string' => true, // deprecated + 'html-escaped-string' => true, // deprecated + 'literal-string' => true, + 'non-empty-literal-string' => true, + 'lowercase-string' => true, + 'non-empty-lowercase-string' => true, + 'positive-int' => true, + 'literal-int' => true, + 'boolean' => true, + 'integer' => true, + 'double' => true, + 'real' => true, + 'resource' => true, + 'void' => true, + 'self' => true, + 'static' => true, + 'scalar' => true, + 'numeric' => true, + 'no-return' => true, + 'never-return' => true, + 'never-returns' => true, + 'never' => true, + 'array-key' => true, + 'key-of' => true, + 'value-of' => true, + 'non-empty-countable' => true, + 'list' => true, + 'non-empty-list' => true, + 'class-string-map' => true, + 'open-resource' => true, + 'closed-resource' => true, + 'associative-array' => true, + 'arraylike-object' => true, + 'int-mask' => true, + 'int-mask-of' => true, + ]; + + /** + * @var array> + */ + private static $memoized_tokens = []; + + /** + * Tokenises a type string into an array of tuples where the first element + * contains the string token and the second element contains its offset, + * + * @return list + * + * @psalm-suppress PossiblyUndefinedIntArrayOffset + */ + public static function tokenize(string $string_type, bool $ignore_space = true): array + { + $type_tokens = [['', 0]]; + $was_char = false; + $quote_char = null; + $escaped = false; + + if (isset(self::$memoized_tokens[$string_type])) { + return self::$memoized_tokens[$string_type]; + } + + // index of last type token + $rtc = 0; + + $chars = str_split($string_type); + $was_space = false; + + for ($i = 0, $c = count($chars); $i < $c; ++$i) { + $char = $chars[$i]; + + if (!$quote_char && $char === ' ' && $ignore_space) { + $was_space = true; + continue; + } + + if ($was_space + && ($char === '$' + || ($char === '.' + && ($chars[$i + 1] ?? null) === '.' + && ($chars[$i + 2] ?? null) === '.' + && ($chars[$i + 3] ?? null) === '$')) + ) { + $type_tokens[++$rtc] = [' ', $i - 1]; + $type_tokens[++$rtc] = ['', $i]; + } elseif ($was_space + && ($char === 'a' || $char === 'i') + && ($chars[$i + 1] ?? null) === 's' + && ($chars[$i + 2] ?? null) === ' ' + ) { + $type_tokens[++$rtc] = [$char . 's', $i - 1]; + $type_tokens[++$rtc] = ['', ++$i]; + $was_char = false; + continue; + } elseif ($was_char) { + $type_tokens[++$rtc] = ['', $i]; + } + + if ($quote_char) { + if ($char === $quote_char && $i > 0 && !$escaped) { + $quote_char = null; + + $type_tokens[$rtc][0] .= $char; + $was_char = true; + + continue; + } + + $was_char = false; + + if ($char === '\\' + && !$escaped + && $i < $c - 1 + && ($chars[$i + 1] === $quote_char || $chars[$i + 1] === '\\') + ) { + $escaped = true; + continue; + } + + $escaped = false; + + $type_tokens[$rtc][0] .= $char; + + continue; + } + + if ($char === '"' || $char === '\'') { + if ($type_tokens[$rtc][0] === '') { + $type_tokens[$rtc] = [$char, $i]; + } else { + $type_tokens[++$rtc] = [$char, $i]; + } + + $quote_char = $char; + + $was_char = false; + $was_space = false; + + continue; + } + + if ($char === '<' + || $char === '>' + || $char === '|' + || $char === '?' + || $char === ',' + || $char === '{' + || $char === '}' + || $char === '[' + || $char === ']' + || $char === '(' + || $char === ')' + || $char === ' ' + || $char === '&' + || $char === '=' + ) { + if ($char === '(' + && $type_tokens[$rtc][0] === 'func_num_args' + && isset($chars[$i + 1]) + && $chars[$i + 1] === ')' + ) { + $type_tokens[$rtc][0] = 'func_num_args()'; + ++$i; + + continue; + } + + if ($type_tokens[$rtc][0] === '') { + $type_tokens[$rtc] = [$char, $i]; + } else { + $type_tokens[++$rtc] = [$char, $i]; + } + + $was_char = true; + $was_space = false; + + continue; + } + + if ($char === ':') { + if ($i + 1 < $c && $chars[$i + 1] === ':') { + if ($type_tokens[$rtc][0] === '') { + $type_tokens[$rtc] = ['::', $i]; + } else { + $type_tokens[++$rtc] = ['::', $i]; + } + + $was_char = true; + $was_space = false; + + ++$i; + + continue; + } + + if ($type_tokens[$rtc][0] === '') { + $type_tokens[$rtc] = [':', $i]; + } else { + $type_tokens[++$rtc] = [':', $i]; + } + + $was_char = true; + $was_space = false; + + continue; + } + + if ($char === '.') { + if ($i + 1 < $c + && is_numeric($chars[$i + 1]) + && $i > 0 + && is_numeric($chars[$i - 1]) + ) { + $type_tokens[$rtc][0] .= $char; + $was_char = false; + $was_space = false; + + continue; + } + + if ($i + 2 > $c || $chars[$i + 1] !== '.' || $chars[$i + 2] !== '.') { + throw new TypeParseTreeException('Unexpected token ' . $char); + } + + if ($type_tokens[$rtc][0] === '') { + $type_tokens[$rtc] = ['...', $i]; + } else { + $type_tokens[++$rtc] = ['...', $i]; + } + + $was_char = true; + $was_space = false; + + $i += 2; + + continue; + } + + $type_tokens[$rtc][0] .= $char; + $was_char = false; + $was_space = false; + } + + /** @var list $type_tokens */ + self::$memoized_tokens[$string_type] = $type_tokens; + + return $type_tokens; + } + + /** + * @param array{int,int}|null $php_version + * + * + * @psalm-pure + */ + public static function fixScalarTerms( + string $type_string, + ?array $php_version = null + ): string { + $type_string_lc = strtolower($type_string); + + switch ($type_string_lc) { + case 'int': + case 'void': + case 'float': + case 'string': + case 'bool': + case 'callable': + case 'iterable': + case 'array': + case 'object': + case 'true': + case 'false': + case 'null': + case 'mixed': + return $type_string_lc; + } + + switch ($type_string) { + case 'boolean': + return $php_version !== null ? $type_string : 'bool'; + + case 'integer': + return $php_version !== null ? $type_string : 'int'; + + case 'double': + case 'real': + return $php_version !== null ? $type_string : 'float'; + } + + return $type_string; + } + + /** + * @param array|null $template_type_map + * @param array|null $type_aliases + * + * @return list + */ + public static function getFullyQualifiedTokens( + string $string_type, + Aliases $aliases, + ?array $template_type_map = null, + ?array $type_aliases = null, + ?string $self_fqcln = null, + ?string $parent_fqcln = null, + bool $allow_assertions = false + ): array { + $type_tokens = self::tokenize($string_type); + + for ($i = 0, $l = count($type_tokens); $i < $l; ++$i) { + $string_type_token = $type_tokens[$i]; + + if (in_array( + $string_type_token[0], + [ + '<', '>', '|', '?', ',', '{', '}', ':', '::', '[', ']', '(', ')', '&', '=', '...', 'as', 'is', + ], + true + )) { + continue; + } + + if ($string_type_token[0][0] === '\\' + && strlen($string_type_token[0]) === 1 + ) { + throw new TypeParseTreeException("Backslash \"\\\" has to be part of class name."); + } + + if ($string_type_token[0][0] === '"' + || $string_type_token[0][0] === '\'' + || preg_match('/[0-9]/', $string_type_token[0][0]) + ) { + continue; + } + + if ($string_type_token[0][0] === '-' && is_numeric($string_type_token[0])) { + continue; + } + + if (isset($type_tokens[$i + 1]) + && $type_tokens[$i + 1][0] === ':' + && isset($type_tokens[$i - 1]) + && ($type_tokens[$i - 1][0] === '{' || $type_tokens[$i - 1][0] === ',') + ) { + continue; + } + + if ($i > 0 && $type_tokens[$i - 1][0] === '::') { + continue; + } + + if (strpos($string_type_token[0], '$')) { + $string_type_token[0] = preg_replace('/(.+)\$.*/', '$1', $string_type_token[0]); + } + + $fixed_token = !isset($type_tokens[$i + 1]) || $type_tokens[$i + 1][0] !== '(' + ? self::fixScalarTerms($string_type_token[0]) + : $string_type_token[0]; + + $type_tokens[$i][0] = $fixed_token; + $string_type_token[0] = $fixed_token; + + if ($string_type_token[0] === 'self' && $self_fqcln) { + $type_tokens[$i][0] = $self_fqcln; + continue; + } + + if ($string_type_token[0] === 'parent' && $parent_fqcln) { + $type_tokens[$i][0] = $parent_fqcln; + continue; + } + + if (isset(self::PSALM_RESERVED_WORDS[$string_type_token[0]])) { + continue; + } + + if (isset($template_type_map[$string_type_token[0]])) { + continue; + } + + if ($i > 1 + && ($type_tokens[$i - 2][0] === 'class-string-map') + && ($type_tokens[$i - 1][0] === '<') + ) { + $template_type_map[$string_type_token[0]] = true; + continue; + } + + if (isset($type_tokens[$i + 1]) + && isset($type_tokens[$i - 1]) + && ($type_tokens[$i - 1][0] === '{' || $type_tokens[$i - 1][0] === ',') + ) { + $next_char = $type_tokens[$i + 1][0]; + + if ($next_char === ':') { + continue; + } + + if ($next_char === '?' && isset($type_tokens[$i + 2]) && $type_tokens[$i + 2][0] === ':') { + continue; + } + } + + if ($string_type_token[0][0] === '$' || $string_type_token[0][0] === ' ') { + continue; + } + + if (isset($type_tokens[$i + 1]) && $type_tokens[$i + 1][0] === '(') { + continue; + } + + if ($allow_assertions && $string_type_token[0] === 'falsy') { + $type_tokens[$i][0] = 'false-y'; + continue; + } + + if ($string_type_token[0] === 'func_num_args()' + || $string_type_token[0] === 'PHP_MAJOR_VERSION' + || $string_type_token[0] === 'PHP_VERSION_ID' + ) { + continue; + } + + $type_tokens[$i][2] = $string_type_token[0]; + + if (isset($type_aliases[$string_type_token[0]])) { + $type_alias = $type_aliases[$string_type_token[0]]; + + if ($type_alias instanceof InlineTypeAlias) { + $replacement_tokens = $type_alias->replacement_tokens; + + array_unshift($replacement_tokens, ['(', $i]); + $replacement_tokens[] = [')', $i]; + + $diff = count($replacement_tokens) - 1; + + array_splice($type_tokens, $i, 1, $replacement_tokens); + + $i += $diff; + $l += $diff; + } + } else { + $type_tokens[$i][0] = Type::getFQCLNFromString( + $string_type_token[0], + $aliases + ); + } + } + + /** @var list */ + return $type_tokens; + } + + public static function clearCache(): void + { + self::$memoized_tokens = []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php new file mode 100644 index 00000000..94d55b17 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php @@ -0,0 +1,63 @@ +fq_classlike_name = $fq_classlike_name; + } + + protected function enterNode(TypeNode $type): ?int + { + if ($type instanceof TNamedObject) { + if (strtolower($type->value) === $this->fq_classlike_name) { + $this->contains_classlike = true; + return NodeVisitor::STOP_TRAVERSAL; + } + } + + if ($type instanceof TClassConstant) { + if (strtolower($type->fq_classlike_name) === $this->fq_classlike_name) { + $this->contains_classlike = true; + return NodeVisitor::STOP_TRAVERSAL; + } + } + + if ($type instanceof TLiteralClassString) { + if (strtolower($type->value) === $this->fq_classlike_name) { + $this->contains_classlike = true; + return NodeVisitor::STOP_TRAVERSAL; + } + } + + return null; + } + + public function matches(): bool + { + return $this->contains_classlike; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php new file mode 100644 index 00000000..e7d3f066 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php @@ -0,0 +1,45 @@ +contains_literal = true; + return NodeVisitor::STOP_TRAVERSAL; + } + + if ($type instanceof TArray && $type->type_params[1]->isEmpty()) { + $this->contains_literal = true; + return NodeVisitor::STOP_TRAVERSAL; + } + + return null; + } + + public function matches(): bool + { + return $this->contains_literal; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php new file mode 100644 index 00000000..3846e766 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php @@ -0,0 +1,31 @@ +from_docblock = true; + + if ($type instanceof TTemplateParam + && $type->as->isMixed() + ) { + return NodeVisitor::DONT_TRAVERSE_CHILDREN; + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php new file mode 100644 index 00000000..1b3d365d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php @@ -0,0 +1,50 @@ + + */ + private $template_types = []; + + protected function enterNode(TypeNode $type): ?int + { + if ($type instanceof TTemplateParam) { + $this->template_types[] = $type; + } elseif ($type instanceof TTemplateParamClass) { + $extends = $type->as_type; + + $this->template_types[] = new TTemplateParam( + $type->param_name, + $extends ? new Union([$extends]) : Type::getMixed(), + $type->defining_class + ); + } elseif ($type instanceof TConditional) { + $this->template_types[] = new TTemplateParam( + $type->param_name, + Type::getMixed(), + $type->defining_class + ); + } + + return null; + } + + /** + * @return list + */ + public function getTemplateTypes(): array + { + return $this->template_types; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php new file mode 100644 index 00000000..7cb18b13 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php @@ -0,0 +1,410 @@ + + */ + private $suppressed_issues; + + /** + * @var array + */ + private $phantom_classes; + + /** + * @var bool + */ + private $inferred; + + /** + * @var bool + */ + private $inherited; + + /** + * @var bool + */ + private $prevent_template_covariance; + + /** @var bool */ + private $has_errors = false; + + private $calling_method_id; + + /** + * @param array $suppressed_issues + * @param array $phantom_classes + */ + public function __construct( + StatementsSource $source, + CodeLocation $code_location, + array $suppressed_issues, + array $phantom_classes = [], + bool $inferred = true, + bool $inherited = false, + bool $prevent_template_covariance = false, + ?string $calling_method_id = null + ) { + $this->source = $source; + $this->code_location = $code_location; + $this->suppressed_issues = $suppressed_issues; + $this->phantom_classes = $phantom_classes; + $this->inferred = $inferred; + $this->inherited = $inherited; + $this->prevent_template_covariance = $prevent_template_covariance; + $this->calling_method_id = $calling_method_id; + } + + /** + * @psalm-suppress MoreSpecificImplementedParamType + * + * @param Atomic|Union $type + * @return self::STOP_TRAVERSAL|self::DONT_TRAVERSE_CHILDREN|null + */ + protected function enterNode(TypeNode $type): ?int + { + if ($type->checked) { + return NodeVisitor::DONT_TRAVERSE_CHILDREN; + } + + if ($type instanceof TNamedObject) { + $this->checkNamedObject($type); + } elseif ($type instanceof TClassConstant) { + $this->checkScalarClassConstant($type); + } elseif ($type instanceof TTemplateParam) { + $this->checkTemplateParam($type); + } elseif ($type instanceof TResource) { + $this->checkResource($type); + } elseif ($type instanceof TArray) { + if (count($type->type_params) > 2) { + IssueBuffer::maybeAdd( + new TooManyTemplateParams( + $type->getId(). ' has too many template params, expecting 2', + $this->code_location + ), + $this->suppressed_issues + ); + } + } + + $type->checked = true; + + return null; + } + + public function hasErrors(): bool + { + return $this->has_errors; + } + + private function checkNamedObject(TNamedObject $atomic): void + { + $codebase = $this->source->getCodebase(); + + if ($this->code_location instanceof DocblockTypeLocation + && $codebase->store_node_types + && $atomic->offset_start !== null + && $atomic->offset_end !== null + ) { + $codebase->analyzer->addOffsetReference( + $this->source->getFilePath(), + $this->code_location->raw_file_start + $atomic->offset_start, + $this->code_location->raw_file_start + $atomic->offset_end, + $atomic->value + ); + } + + if ($this->calling_method_id + && $atomic->text !== null + ) { + $codebase->file_reference_provider->addMethodReferenceToClassMember( + $this->calling_method_id, + 'use:' . $atomic->text . ':' . md5($this->source->getFilePath()), + false + ); + } + + if (!isset($this->phantom_classes[strtolower($atomic->value)]) && + ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $this->source, + $atomic->value, + $this->code_location, + $this->source->getFQCLN(), + $this->calling_method_id, + $this->suppressed_issues, + new ClassLikeNameOptions($this->inferred, false, true, true, $atomic->from_docblock) + ) === false + ) { + $this->has_errors = true; + return; + } + + $fq_class_name_lc = strtolower($atomic->value); + + if (!$this->inherited + && $codebase->classlike_storage_provider->has($fq_class_name_lc) + && $this->source->getFQCLN() !== $atomic->value + ) { + $class_storage = $codebase->classlike_storage_provider->get($fq_class_name_lc); + + if ($class_storage->deprecated) { + IssueBuffer::maybeAdd( + new DeprecatedClass( + 'Class ' . $atomic->value . ' is marked as deprecated', + $this->code_location, + $atomic->value + ), + $this->source->getSuppressedIssues() + $this->suppressed_issues + ); + } + } + + if ($atomic instanceof TGenericObject) { + $this->checkGenericParams($atomic); + } + } + + private function checkGenericParams(TGenericObject $atomic): void + { + $codebase = $this->source->getCodebase(); + + try { + $class_storage = $codebase->classlike_storage_provider->get(strtolower($atomic->value)); + } catch (InvalidArgumentException $e) { + return; + } + + $expected_type_params = $class_storage->template_types ?: []; + $expected_param_covariants = $class_storage->template_covariants; + + $template_type_count = count($expected_type_params); + $template_param_count = count($atomic->type_params); + + if ($template_type_count > $template_param_count) { + IssueBuffer::maybeAdd( + new MissingTemplateParam( + $atomic->value . ' has missing template params, expecting ' + . $template_type_count, + $this->code_location + ), + $this->suppressed_issues + ); + } elseif ($template_type_count < $template_param_count) { + IssueBuffer::maybeAdd( + new TooManyTemplateParams( + $atomic->getId(). ' has too many template params, expecting ' + . $template_type_count, + $this->code_location + ), + $this->suppressed_issues + ); + } + + $expected_type_param_keys = array_keys($expected_type_params); + + foreach ($atomic->type_params as $i => $type_param) { + $this->prevent_template_covariance = $this->source instanceof MethodAnalyzer + && $this->source->getMethodName() !== '__construct' + && empty($expected_param_covariants[$i]); + + if (isset($expected_type_param_keys[$i])) { + $expected_template_name = $expected_type_param_keys[$i]; + + foreach ($expected_type_params[$expected_template_name] as $defining_class => $expected_type_param) { + $expected_type_param = TypeExpander::expandUnion( + $codebase, + $expected_type_param, + $defining_class, + null, + null + ); + + $type_param = TypeExpander::expandUnion( + $codebase, + $type_param, + $defining_class, + null, + null + ); + + if (!UnionTypeComparator::isContainedBy($codebase, $type_param, $expected_type_param)) { + IssueBuffer::maybeAdd( + new InvalidTemplateParam( + 'Extended template param ' . $expected_template_name + . ' of ' . $atomic->getId() + . ' expects type ' + . $expected_type_param->getId() + . ', type ' . $type_param->getId() . ' given', + $this->code_location + ), + $this->suppressed_issues + ); + } + } + } + } + } + + public function checkScalarClassConstant(TClassConstant $atomic): void + { + $fq_classlike_name = $atomic->fq_classlike_name === 'self' + ? $this->source->getClassName() + : $atomic->fq_classlike_name; + + if (!$fq_classlike_name) { + return; + } + + if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( + $this->source, + $fq_classlike_name, + $this->code_location, + null, + null, + $this->suppressed_issues, + new ClassLikeNameOptions($this->inferred, false, true, true, $atomic->from_docblock) + ) === false + ) { + $this->has_errors = true; + return; + } + + $const_name = $atomic->const_name; + if (strpos($const_name, '*') !== false) { + $expanded = TypeExpander::expandAtomic( + $this->source->getCodebase(), + $atomic, + $fq_classlike_name, + $fq_classlike_name, + null, + true, + true + ); + + $is_defined = is_array($expanded) && count($expanded) > 0; + } else { + $class_constant_type = $this->source->getCodebase()->classlikes->getClassConstantType( + $fq_classlike_name, + $atomic->const_name, + ReflectionProperty::IS_PRIVATE, + null + ); + + $is_defined = null !== $class_constant_type; + } + + if (!$is_defined) { + IssueBuffer::maybeAdd( + new UndefinedConstant( + 'Constant ' . $fq_classlike_name . '::' . $const_name . ' is not defined', + $this->code_location + ), + $this->source->getSuppressedIssues() + ); + } + } + + public function checkTemplateParam(TTemplateParam $atomic): void + { + if ($this->prevent_template_covariance + && strpos($atomic->defining_class, 'fn-') !== 0 + ) { + $codebase = $this->source->getCodebase(); + + $class_storage = $codebase->classlike_storage_provider->get($atomic->defining_class); + + $template_offset = $class_storage->template_types + ? array_search($atomic->param_name, array_keys($class_storage->template_types), true) + : false; + + if ($template_offset !== false + && isset($class_storage->template_covariants[$template_offset]) + && $class_storage->template_covariants[$template_offset] + ) { + $method_storage = $this->source instanceof MethodAnalyzer + ? $this->source->getFunctionLikeStorage() + : null; + + if ($method_storage instanceof MethodStorage + && $method_storage->mutation_free + && !$method_storage->mutation_free_inferred + ) { + // do nothing + } else { + IssueBuffer::maybeAdd( + new InvalidTemplateParam( + 'Template param ' . $atomic->param_name . ' of ' + . $atomic->defining_class . ' is marked covariant and cannot be used here', + $this->code_location + ), + $this->source->getSuppressedIssues() + ); + } + } + } + } + + public function checkResource(TResource $atomic): void + { + if (!$atomic->from_docblock) { + IssueBuffer::maybeAdd( + new ReservedWord( + '\'resource\' is a reserved word', + $this->code_location, + 'resource' + ), + $this->source->getSuppressedIssues() + ); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php new file mode 100644 index 00000000..3e742886 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php @@ -0,0 +1,89 @@ + $phantom_classes + */ + public function __construct( + Scanner $scanner, + ?FileStorage $file_storage, + array $phantom_classes + ) { + $this->scanner = $scanner; + $this->file_storage = $file_storage; + $this->phantom_classes = $phantom_classes; + } + + protected function enterNode(TypeNode $type): ?int + { + if ($type instanceof TNamedObject) { + $fq_classlike_name_lc = strtolower($type->value); + + if (!isset($this->phantom_classes[$type->value]) + && !isset($this->phantom_classes[$fq_classlike_name_lc]) + ) { + $this->scanner->queueClassLikeForScanning( + $type->value, + false, + !$type->from_docblock, + $this->phantom_classes + ); + + if ($this->file_storage) { + $this->file_storage->referenced_classlikes[$fq_classlike_name_lc] = $type->value; + } + } + } + + if ($type instanceof TClassConstant) { + $this->scanner->queueClassLikeForScanning( + $type->fq_classlike_name, + false, + !$type->from_docblock, + $this->phantom_classes + ); + + if ($this->file_storage) { + $fq_classlike_name_lc = strtolower($type->fq_classlike_name); + + $this->file_storage->referenced_classlikes[$fq_classlike_name_lc] = $type->fq_classlike_name; + } + } + + if ($type instanceof TLiteralClassString) { + $this->scanner->queueClassLikeForScanning( + $type->value, + false, + !$type->from_docblock, + $this->phantom_classes + ); + + if ($this->file_storage) { + $fq_classlike_name_lc = strtolower($type->value); + + $this->file_storage->referenced_classlikes[$fq_classlike_name_lc] = $type->value; + } + } + + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php b/vendor/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php new file mode 100644 index 00000000..a3a3a1a4 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php @@ -0,0 +1,9 @@ +function_id = $function_id ? strtolower($function_id) : null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php b/vendor/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php new file mode 100644 index 00000000..e200e564 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php @@ -0,0 +1,9 @@ +fq_classlike_name = $fq_classlike_name; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/CodeIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/CodeIssue.php new file mode 100644 index 00000000..00bb8b2f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/CodeIssue.php @@ -0,0 +1,134 @@ +code_location = $code_location; + $this->message = $message; + } + + /** + * @deprecated going to be removed in Psalm 5 + * @psalm-suppress PossiblyUnusedMethod + */ + public function getLocation(): CodeLocation + { + return $this->code_location; + } + + public function getShortLocationWithPrevious(): string + { + $previous_text = ''; + + if ($this->code_location->previous_location) { + $previous_location = $this->code_location->previous_location; + $previous_text = ' from ' . $previous_location->file_name . ':' . $previous_location->getLineNumber(); + } + + return $this->code_location->file_name . ':' . $this->code_location->getLineNumber() . $previous_text; + } + + public function getShortLocation(): string + { + return $this->code_location->file_name . ':' . $this->code_location->getLineNumber(); + } + + public function getFilePath(): string + { + return $this->code_location->file_path; + } + + /** + * @deprecated going to be removed in Psalm 5 + * @psalm-suppress PossiblyUnusedMethod for convenience + */ + public function getFileName(): string + { + return $this->code_location->file_name; + } + + /** + * @deprecated going to be removed in Psalm 5 + * @psalm-suppress PossiblyUnusedMethod + */ + public function getMessage(): string + { + return $this->message; + } + + public static function getIssueType(): string + { + $fqcn_parts = explode('\\', static::class); + return array_pop($fqcn_parts); + } + + public function toIssueData(string $severity): IssueData + { + $location = $this->code_location; + $selection_bounds = $location->getSelectionBounds(); + $snippet_bounds = $location->getSnippetBounds(); + + return new IssueData( + $severity, + $location->getLineNumber(), + $location->getEndLineNumber(), + static::getIssueType(), + $this->message, + $location->file_name, + $location->file_path, + $location->getSnippet(), + $location->getSelectedText(), + $selection_bounds[0], + $selection_bounds[1], + $snippet_bounds[0], + $snippet_bounds[1], + $location->getColumn(), + $location->getEndColumn(), + (int) static::SHORTCODE, + (int) static::ERROR_LEVEL, + $this instanceof TaintedInput + ? $this->getTaintTrace() + : null, + $this instanceof MixedIssue && ($origin_location = $this->getOriginalLocation()) + ? [ + TaintedInput::nodeToDataFlowNodeData( + $origin_location, + 'The type of ' . $location->getSelectedText() . ' is sourced from here' + ) + ] + : null, + $this->dupe_key + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php b/vendor/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php new file mode 100644 index 00000000..bce1eb05 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php @@ -0,0 +1,9 @@ +dupe_key = $dupe_key; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php b/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php new file mode 100644 index 00000000..9bb2d053 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php @@ -0,0 +1,9 @@ +function_id = strtolower($function_id); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php b/vendor/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php new file mode 100644 index 00000000..c9bcba5d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php @@ -0,0 +1,9 @@ + $words */ + public static function listToPhrase(array $words): string + { + if (count($words) === 1) { + return reset($words); + } + + if (count($words) === 2) { + return implode(" and ", $words); + } + + $last_word = array_pop($words); + $phrase = implode(", ", $words); + $phrase = "$phrase, and $last_word"; + + return $phrase; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InternalMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/InternalMethod.php new file mode 100644 index 00000000..a7e19d6f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/InternalMethod.php @@ -0,0 +1,9 @@ +method_id = strtolower($method_id); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php b/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php new file mode 100644 index 00000000..812353f8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php @@ -0,0 +1,9 @@ +dupe_key = $dupe_key; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingDependency.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingDependency.php new file mode 100644 index 00000000..83afc874 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/MissingDependency.php @@ -0,0 +1,8 @@ +code_location = $code_location; + $this->message = $message; + $this->function_id = $function_id ? strtolower($function_id) : null; + $this->origin_location = $origin_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php new file mode 100644 index 00000000..1d18ace7 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php @@ -0,0 +1,27 @@ +code_location = $code_location; + $this->message = $message; + $this->function_id = $function_id ? strtolower($function_id) : null; + $this->origin_location = $origin_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php new file mode 100644 index 00000000..54dc6eab --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php @@ -0,0 +1,11 @@ +code_location = $code_location; + $this->message = $message; + $this->origin_location = $origin_location; + } + + public function getMixedOriginMessage(): string + { + return $this->message + . ($this->origin_location + ? '. Consider improving the type at ' . $this->origin_location->getShortSummary() + : ''); + } + + public function getOriginalLocation(): ?CodeLocation + { + return $this->origin_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php new file mode 100644 index 00000000..7b8f97f3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php @@ -0,0 +1,11 @@ +origin_location = $origin_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php new file mode 100644 index 00000000..7a699d4b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php @@ -0,0 +1,11 @@ +property_id = $property_id; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php b/vendor/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php new file mode 100644 index 00000000..85602e6f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php @@ -0,0 +1,20 @@ +dupe_key = $property_id; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php b/vendor/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php new file mode 100644 index 00000000..c15e00a8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php @@ -0,0 +1,9 @@ +dupe_key = $dupe_key; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php new file mode 100644 index 00000000..a60adf6e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php @@ -0,0 +1,18 @@ +dupe_key = $dupe_key; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php new file mode 100644 index 00000000..d84d0a4f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php @@ -0,0 +1,9 @@ + + * @readonly + */ + public $journey = []; + + /** + * @param list $journey + */ + public function __construct( + string $message, + CodeLocation $code_location, + array $journey, + string $journey_text + ) { + parent::__construct($message, $code_location); + + $this->journey = $journey; + $this->journey_text = $journey_text; + } + + /** + * @return list + */ + public function getTaintTrace(): array + { + $nodes = []; + + foreach ($this->journey as ['location' => $location, 'label' => $label, 'entry_path_type' => $path_type]) { + if ($location) { + $nodes[] = self::nodeToDataFlowNodeData($location, $label); + } else { + $nodes[] = ['label' => $label, 'entry_path_type' => $path_type]; + } + } + + return $nodes; + } + + public static function nodeToDataFlowNodeData( + CodeLocation $location, + string $label + ): DataFlowNodeData { + $selection_bounds = $location->getSelectionBounds(); + $snippet_bounds = $location->getSnippetBounds(); + + return new DataFlowNodeData( + $label, + $location->getLineNumber(), + $location->getEndLineNumber(), + $location->file_name, + $location->file_path, + $location->getSnippet(), + $selection_bounds[0], + $selection_bounds[1], + $snippet_bounds[0], + $location->getColumn(), + $location->getEndColumn() + ); + } + + public function getJourneyMessage(): string + { + return $this->message . ' in path: ' . $this->journey_text; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php new file mode 100644 index 00000000..37349c95 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php @@ -0,0 +1,8 @@ +dupe_key = $dupe_key; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php b/vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php new file mode 100644 index 00000000..a496b5db --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php @@ -0,0 +1,17 @@ +dupe_key = $dupe_key; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php b/vendor/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php new file mode 100644 index 00000000..f5301c22 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php @@ -0,0 +1,9 @@ +var_name = strtolower($var_name); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/IssueBuffer.php b/vendor/vimeo/psalm/src/Psalm/IssueBuffer.php new file mode 100644 index 00000000..47bde92f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/IssueBuffer.php @@ -0,0 +1,1029 @@ +> + */ + protected static $issues_data = []; + + /** + * @var array + */ + protected static $console_issues = []; + + /** + * @var array + */ + protected static $fixable_issue_counts = []; + + /** + * @var int + */ + protected static $error_count = 0; + + /** + * @var array + */ + protected static $emitted = []; + + /** @var int */ + protected static $recording_level = 0; + + /** @var array> */ + protected static $recorded_issues = []; + + /** + * @var array> + */ + protected static $unused_suppressions = []; + + /** + * @var array> + */ + protected static $used_suppressions = []; + + /** @var array */ + private static $server = []; + + /** + * This will add an issue to be emitted if it's not suppressed and return if it has been added + * @param string[] $suppressed_issues + */ + public static function accepts(CodeIssue $e, array $suppressed_issues = [], bool $is_fixable = false): bool + { + if (self::isSuppressed($e, $suppressed_issues)) { + return false; + } + + return self::add($e, $is_fixable); + } + + /** + * This will add an issue to be emitted if it's not suppressed + * @param string[] $suppressed_issues + */ + public static function maybeAdd(CodeIssue $e, array $suppressed_issues = [], bool $is_fixable = false): void + { + if (self::isSuppressed($e, $suppressed_issues)) { + return; + } + + self::add($e, $is_fixable); + } + + /** + * This is part of the findUnusedPsalmSuppress feature + */ + public static function addUnusedSuppression(string $file_path, int $offset, string $issue_type): void + { + if (strpos($issue_type, 'Tainted') === 0) { + return; + } + + if (isset(self::$used_suppressions[$file_path][$offset])) { + return; + } + + if (!isset(self::$unused_suppressions[$file_path])) { + self::$unused_suppressions[$file_path] = []; + } + + self::$unused_suppressions[$file_path][$offset] = $offset + strlen($issue_type) - 1; + } + + /** + * This will return false if an issue is ready to be added for emission. Reasons for not returning false include: + * - The issue is suppressed in config + * - We're in a recording state + * - The issue is included in the list of issues to be suppressed in param + * @param string[] $suppressed_issues + */ + public static function isSuppressed(CodeIssue $e, array $suppressed_issues = []): bool + { + $config = Config::getInstance(); + + $fqcn_parts = explode('\\', get_class($e)); + $issue_type = array_pop($fqcn_parts); + $file_path = $e->getFilePath(); + + if (!$e instanceof ConfigIssue && !$config->reportIssueInFile($issue_type, $file_path)) { + return true; + } + + $suppressed_issue_position = array_search($issue_type, $suppressed_issues); + + if ($suppressed_issue_position !== false) { + if (is_int($suppressed_issue_position)) { + self::$used_suppressions[$file_path][$suppressed_issue_position] = true; + } + + return true; + } + + $parent_issue_type = Config::getParentIssueType($issue_type); + + if ($parent_issue_type) { + $suppressed_issue_position = array_search($parent_issue_type, $suppressed_issues); + + if ($suppressed_issue_position !== false) { + if (is_int($suppressed_issue_position)) { + self::$used_suppressions[$file_path][$suppressed_issue_position] = true; + } + + return true; + } + } + + $suppress_all_position = $config->disable_suppress_all + ? false + : array_search('all', $suppressed_issues); + + if ($suppress_all_position !== false) { + if (is_int($suppress_all_position)) { + self::$used_suppressions[$file_path][$suppress_all_position] = true; + } + + return true; + } + + $reporting_level = $config->getReportingLevelForIssue($e); + + if ($reporting_level === Config::REPORT_SUPPRESS) { + return true; + } + + if ($e->code_location->getLineNumber() === -1) { + return true; + } + + if (self::$recording_level > 0) { + self::$recorded_issues[self::$recording_level][] = $e; + + return true; + } + + return false; + } + + /** + * Add an issue to be emitted. This method should normally not be used! Use IssueBuffer::maybeAdd instead. + * + * @psalm-internal Psalm\IssueBuffer + * @psalm-internal Psalm\Type\Reconciler::getValueForKey + * + * @throws CodeException + */ + public static function add(CodeIssue $e, bool $is_fixable = false): bool + { + $config = Config::getInstance(); + + $fqcn_parts = explode('\\', get_class($e)); + $issue_type = array_pop($fqcn_parts); + + $project_analyzer = ProjectAnalyzer::getInstance(); + + if (!$project_analyzer->show_issues) { + return false; + } + + $is_tainted = strpos($issue_type, 'Tainted') === 0; + + if ($project_analyzer->getCodebase()->taint_flow_graph && !$is_tainted) { + return false; + } + + $reporting_level = $config->getReportingLevelForIssue($e); + + if ($reporting_level === Config::REPORT_SUPPRESS) { + return false; + } + + if ($config->debug_emitted_issues) { + ob_start(); + debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + $trace = ob_get_clean(); + fwrite(STDERR, "\nEmitting {$e->getShortLocation()} $issue_type {$e->message}\n$trace\n"); + } + + // Make issue type for trace variable specific ("Trace" => "Trace~$var"). + $trace_var = $issue_type === 'Trace' && preg_match('/^(\$.+?):/', $e->message, $m) === 1 && isset($m[1]) + ? '~' . $m[1] + : ''; + + $emitted_key = $issue_type + . $trace_var + . '-' . $e->getShortLocation() + . ':' . $e->code_location->getColumn() + . ' ' . $e->dupe_key; + + if ($reporting_level === Config::REPORT_INFO) { + if ($is_tainted || !self::alreadyEmitted($emitted_key)) { + self::$issues_data[$e->getFilePath()][] = $e->toIssueData(Config::REPORT_INFO); + + if ($is_fixable) { + self::addFixableIssue($issue_type); + } + } + + return false; + } + + if ($config->throw_exception) { + FileAnalyzer::clearCache(); + + $message = $e instanceof TaintedInput + ? $e->getJourneyMessage() + : ($e instanceof MixedIssue + ? $e->getMixedOriginMessage() + : $e->message); + + throw new CodeException( + $issue_type + . ' - ' . $e->getShortLocationWithPrevious() + . ':' . $e->code_location->getColumn() + . ' - ' . $message + ); + } + + if ($is_tainted || !self::alreadyEmitted($emitted_key)) { + ++self::$error_count; + self::$issues_data[$e->getFilePath()][] = $e->toIssueData(Config::REPORT_ERROR); + + if ($is_fixable) { + self::addFixableIssue($issue_type); + } + } + + return true; + } + + private static function removeRecordedIssue(string $issue_type, int $file_offset): void + { + $recorded_issues = self::$recorded_issues[self::$recording_level]; + $filtered_issues = []; + + foreach ($recorded_issues as $issue) { + [$from] = $issue->code_location->getSelectionBounds(); + + if ($issue::getIssueType() !== $issue_type || $from !== $file_offset) { + $filtered_issues[] = $issue; + } + } + + self::$recorded_issues[self::$recording_level] = $filtered_issues; + } + + /** + * This will try to remove an issue that has been added for emission + */ + public static function remove(string $file_path, string $issue_type, int $file_offset): void + { + if (self::$recording_level > 0) { + self::removeRecordedIssue($issue_type, $file_offset); + } + + if (!isset(self::$issues_data[$file_path])) { + return; + } + + $filtered_issues = []; + + foreach (self::$issues_data[$file_path] as $issue) { + if ($issue->type !== $issue_type || $issue->from !== $file_offset) { + $filtered_issues[] = $issue; + } + } + + if (empty($filtered_issues)) { + unset(self::$issues_data[$file_path]); + } else { + self::$issues_data[$file_path] = $filtered_issues; + } + } + + public static function addFixableIssue(string $issue_type): void + { + if (isset(self::$fixable_issue_counts[$issue_type])) { + self::$fixable_issue_counts[$issue_type]++; + } else { + self::$fixable_issue_counts[$issue_type] = 1; + } + } + + /** + * @return array> + */ + public static function getIssuesData(): array + { + return self::$issues_data; + } + + /** + * @return list + */ + public static function getIssuesDataForFile(string $file_path): array + { + return self::$issues_data[$file_path] ?? []; + } + + /** + * @return array + */ + public static function getFixableIssues(): array + { + return self::$fixable_issue_counts; + } + + /** + * @param array $fixable_issue_counts + */ + public static function addFixableIssues(array $fixable_issue_counts): void + { + foreach ($fixable_issue_counts as $issue_type => $count) { + if (isset(self::$fixable_issue_counts[$issue_type])) { + self::$fixable_issue_counts[$issue_type] += $count; + } else { + self::$fixable_issue_counts[$issue_type] = $count; + } + } + } + + /** + * @return array> + */ + public static function getUnusedSuppressions(): array + { + return self::$unused_suppressions; + } + + /** + * @return array> + */ + public static function getUsedSuppressions(): array + { + return self::$used_suppressions; + } + + /** + * @param array> $unused_suppressions + */ + public static function addUnusedSuppressions(array $unused_suppressions): void + { + self::$unused_suppressions += $unused_suppressions; + } + + /** + * @param array> $used_suppressions + */ + public static function addUsedSuppressions(array $used_suppressions): void + { + foreach ($used_suppressions as $file => $offsets) { + if (!isset(self::$used_suppressions[$file])) { + self::$used_suppressions[$file] = $offsets; + } else { + self::$used_suppressions[$file] += $offsets; + } + } + } + + public static function processUnusedSuppressions(FileProvider $file_provider): void + { + $config = Config::getInstance(); + + foreach (self::$unused_suppressions as $file_path => $offsets) { + if (!$offsets) { + continue; + } + + if (!$config->isInProjectDirs($file_path)) { + continue; + } + + $file_contents = $file_provider->getContents($file_path); + + foreach ($offsets as $start => $end) { + if (isset(self::$used_suppressions[$file_path][$start])) { + continue; + } + + self::add( + new UnusedPsalmSuppress( + 'This suppression is never used', + new Raw( + $file_contents, + $file_path, + $config->shortenFileName($file_path), + $start, + $end + ) + ) + ); + } + } + } + + public static function getErrorCount(): int + { + return self::$error_count; + } + + /** + * @param array> $issues_data + * + */ + public static function addIssues(array $issues_data): void + { + foreach ($issues_data as $file_path => $file_issues) { + foreach ($file_issues as $issue) { + $emitted_key = $issue->type + . '-' . $issue->file_name + . ':' . $issue->line_from + . ':' . $issue->column_from + . ' ' . $issue->dupe_key; + + if (!self::alreadyEmitted($emitted_key)) { + self::$issues_data[$file_path][] = $issue; + } + } + } + } + + /** + * @param array}>> $issue_baseline + * + */ + public static function finish( + ProjectAnalyzer $project_analyzer, + bool $is_full, + float $start_time, + bool $add_stats = false, + array $issue_baseline = [] + ): void { + if (!$project_analyzer->stdout_report_options) { + throw new UnexpectedValueException('Cannot finish without stdout report options'); + } + + $codebase = $project_analyzer->getCodebase(); + + foreach ($codebase->config->config_issues as $issue) { + if (self::accepts($issue)) { + // fall through + } + } + + $error_count = 0; + $info_count = 0; + + + $issues_data = []; + + if (self::$issues_data) { + if (in_array( + $project_analyzer->stdout_report_options->format, + [Report::TYPE_CONSOLE, Report::TYPE_PHP_STORM] + )) { + echo "\n"; + } + + ksort(self::$issues_data); + + foreach (self::$issues_data as $file_path => $file_issues) { + usort( + $file_issues, + function (IssueData $d1, IssueData $d2): int { + if ($d1->file_path === $d2->file_path) { + if ($d1->line_from === $d2->line_from) { + if ($d1->column_from === $d2->column_from) { + return 0; + } + + return $d1->column_from > $d2->column_from ? 1 : -1; + } + + return $d1->line_from > $d2->line_from ? 1 : -1; + } + + return $d1->file_path > $d2->file_path ? 1 : -1; + } + ); + self::$issues_data[$file_path] = $file_issues; + } + + // make a copy so what gets saved in cache is unaffected by baseline + $issues_data = self::$issues_data; + + if (!empty($issue_baseline)) { + // Set severity for issues in baseline to INFO + foreach ($issues_data as $file_path => $file_issues) { + foreach ($file_issues as $key => $issue_data) { + $file = $issue_data->file_name; + $file = str_replace('\\', '/', $file); + $type = $issue_data->type; + + if (isset($issue_baseline[$file][$type]) && $issue_baseline[$file][$type]['o'] > 0) { + if ($issue_baseline[$file][$type]['o'] === count($issue_baseline[$file][$type]['s'])) { + $position = array_search( + trim($issue_data->selected_text), + $issue_baseline[$file][$type]['s'], + true + ); + + if ($position !== false) { + $issue_data->severity = Config::REPORT_INFO; + array_splice($issue_baseline[$file][$type]['s'], $position, 1); + $issue_baseline[$file][$type]['o']--; + } + } else { + $issue_baseline[$file][$type]['s'] = []; + $issue_data->severity = Config::REPORT_INFO; + $issue_baseline[$file][$type]['o']--; + } + } + + $issues_data[$file_path][$key] = $issue_data; + } + } + } + } + + echo self::getOutput( + $issues_data, + $project_analyzer->stdout_report_options, + $codebase->analyzer->getTotalTypeCoverage($codebase) + ); + + foreach ($issues_data as $file_issues) { + foreach ($file_issues as $issue_data) { + if ($issue_data->severity === Config::REPORT_ERROR) { + ++$error_count; + } else { + ++$info_count; + } + } + } + + + if ($codebase->config->eventDispatcher->after_analysis + || $codebase->config->eventDispatcher->legacy_after_analysis + ) { + $source_control_info = null; + $build_info = (new BuildInfoCollector(self::$server))->collect(); + + try { + $source_control_info = (new GitInfoCollector())->collect(); + } catch (RuntimeException $e) { + // do nothing + } + + /** @psalm-suppress ArgumentTypeCoercion due to Psalm bug */ + $event = new AfterAnalysisEvent( + $codebase, + $issues_data, + $build_info, + $source_control_info + ); + + $codebase->config->eventDispatcher->dispatchAfterAnalysis($event); + } + + foreach ($project_analyzer->generated_report_options as $report_options) { + if (!$report_options->output_path) { + throw new UnexpectedValueException('Output path should not be null here'); + } + + $folder = dirname($report_options->output_path); + if (!is_dir($folder) && !mkdir($folder, 0777, true) && !is_dir($folder)) { + throw new RuntimeException(sprintf('Directory "%s" was not created', $folder)); + } + file_put_contents( + $report_options->output_path, + self::getOutput( + $issues_data, + $report_options, + $codebase->analyzer->getTotalTypeCoverage($codebase) + ) + ); + } + + if (in_array( + $project_analyzer->stdout_report_options->format, + [Report::TYPE_CONSOLE, Report::TYPE_PHP_STORM] + )) { + echo str_repeat('-', 30) . "\n"; + + if ($error_count) { + echo($project_analyzer->stdout_report_options->use_color + ? "\e[0;31m" . $error_count . " errors\e[0m" + : $error_count . ' errors' + ) . ' found' . "\n"; + } else { + self::printSuccessMessage($project_analyzer); + } + + $show_info = $project_analyzer->stdout_report_options->show_info; + $show_suggestions = $project_analyzer->stdout_report_options->show_suggestions; + + if ($info_count && ($show_info || $show_suggestions)) { + echo str_repeat('-', 30) . "\n"; + + echo $info_count . ' other issues found.' . "\n"; + + if (!$show_info) { + echo 'You can display them with ' . + ($project_analyzer->stdout_report_options->use_color + ? "\e[30;48;5;195m--show-info=true\e[0m" + : '--show-info=true') . "\n"; + } + } + + if (self::$fixable_issue_counts && $show_suggestions && !$codebase->taint_flow_graph) { + echo str_repeat('-', 30) . "\n"; + + $total_count = array_sum(self::$fixable_issue_counts); + $command = '--alter --issues=' . implode(',', array_keys(self::$fixable_issue_counts)); + $command .= ' --dry-run'; + + echo 'Psalm can automatically fix ' . $total_count + . ($show_info ? ' issues' : ' of these issues') . ".\n" + . 'Run Psalm again with ' . "\n" + . ($project_analyzer->stdout_report_options->use_color + ? "\e[30;48;5;195m" . $command . "\e[0m" + : $command) . "\n" + . 'to see what it can fix.' . "\n"; + } + + echo str_repeat('-', 30) . "\n" . "\n"; + + if ($start_time) { + echo 'Checks took ' . number_format(microtime(true) - $start_time, 2) . ' seconds'; + echo ' and used ' . number_format(memory_get_peak_usage() / (1024 * 1024), 3) . 'MB of memory' . "\n"; + + $analysis_summary = $codebase->analyzer->getTypeInferenceSummary($codebase); + echo $analysis_summary . "\n"; + + if ($add_stats) { + echo '-----------------' . "\n"; + echo $codebase->analyzer->getNonMixedStats(); + echo "\n"; + } + + if ($project_analyzer->debug_performance) { + echo '-----------------' . "\n"; + echo 'Slow-to-analyze functions' . "\n"; + echo '-----------------' . "\n\n"; + + $function_timings = $codebase->analyzer->getFunctionTimings(); + + arsort($function_timings); + + $i = 0; + + foreach ($function_timings as $function_id => $time) { + if (++$i > 10) { + break; + } + + echo $function_id . ': ' . round(1000 * $time, 2) . 'ms per node' . "\n"; + } + + echo "\n"; + } + } + } + + if ($is_full && $start_time) { + $codebase->file_reference_provider->removeDeletedFilesFromReferences(); + + if ($project_analyzer->project_cache_provider) { + $project_analyzer->project_cache_provider->processSuccessfulRun($start_time, PSALM_VERSION); + } + } + + if ($error_count + && !($codebase->taint_flow_graph + && $project_analyzer->generated_report_options + && isset($_SERVER['GITHUB_WORKFLOW'])) + ) { + exit(2); + } + } + + public static function printSuccessMessage(ProjectAnalyzer $project_analyzer): void + { + if (!$project_analyzer->stdout_report_options) { + throw new UnexpectedValueException('Cannot print success message without stdout report options'); + } + + // this message will be printed + $message = "No errors found!"; + + // color block will contain this amount of characters + $blockSize = 30; + + // message with prepended and appended whitespace to be same as $blockSize + $messageWithPadding = str_repeat(' ', 7) . $message . str_repeat(' ', 7); + + // top side of the color block + $paddingTop = str_repeat(' ', $blockSize); + + // bottom side of the color block + $paddingBottom = str_repeat(' ', $blockSize); + + // background color, 42 = green + $background = "42"; + + // foreground/text color, 30 = black + $foreground = "30"; + + // text style, 1 = bold + $style = "1"; + + if ($project_analyzer->stdout_report_options->use_color) { + echo "\e[{$background};{$style}m{$paddingTop}\e[0m" . "\n"; + echo "\e[{$background};{$foreground};{$style}m{$messageWithPadding}\e[0m" . "\n"; + echo "\e[{$background};{$style}m{$paddingBottom}\e[0m" . "\n"; + } else { + echo "\n"; + echo "$messageWithPadding\n"; + echo "\n"; + } + } + + /** + * @param array> $issues_data + * @param array{int, int} $mixed_counts + * + */ + public static function getOutput( + array $issues_data, + ReportOptions $report_options, + array $mixed_counts = [0, 0] + ): string { + $total_expression_count = $mixed_counts[0] + $mixed_counts[1]; + $mixed_expression_count = $mixed_counts[0]; + + $normalized_data = $issues_data === [] ? [] : array_merge(...array_values($issues_data)); + + switch ($report_options->format) { + case Report::TYPE_COMPACT: + $output = new CompactReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_EMACS: + $output = new EmacsReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_TEXT: + $output = new TextReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_JSON: + $output = new JsonReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_JSON_SUMMARY: + $output = new JsonSummaryReport( + $normalized_data, + self::$fixable_issue_counts, + $report_options, + $mixed_expression_count, + $total_expression_count + ); + break; + + case Report::TYPE_SONARQUBE: + $output = new SonarqubeReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_PYLINT: + $output = new PylintReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_CHECKSTYLE: + $output = new CheckstyleReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_XML: + $output = new XmlReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_JUNIT: + $output = new JunitReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_CONSOLE: + $output = new ConsoleReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_GITHUB_ACTIONS: + $output = new GithubActionsReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_PHP_STORM: + $output = new PhpStormReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_SARIF: + $output = new SarifReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_CODECLIMATE: + $output = new CodeClimateReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + case Report::TYPE_COUNT: + $output = new CountReport($normalized_data, self::$fixable_issue_counts, $report_options); + break; + + default: + throw new RuntimeException('Unexpected report format: ' . $report_options->format); + } + + return $output->create(); + } + + protected static function alreadyEmitted(string $message): bool + { + $sham = sha1($message); + + if (isset(self::$emitted[$sham])) { + return true; + } + + self::$emitted[$sham] = true; + + return false; + } + + public static function clearCache(): void + { + self::$issues_data = []; + self::$emitted = []; + self::$error_count = 0; + self::$recording_level = 0; + self::$recorded_issues = []; + self::$console_issues = []; + self::$unused_suppressions = []; + self::$used_suppressions = []; + } + + /** + * @return array> + */ + public static function clear(): array + { + $current_data = self::$issues_data; + self::$issues_data = []; + self::$emitted = []; + + return $current_data; + } + + /** + * Return whether or not we're in a recording state regarding startRecording/stopRecording status + */ + public static function isRecording(): bool + { + return self::$recording_level > 0; + } + + /** + * Increase the recording level in order to start recording issues instead of adding them while in a loop + */ + public static function startRecording(): void + { + ++self::$recording_level; + self::$recorded_issues[self::$recording_level] = []; + } + + /** + * Decrease the recording level after leaving a loop + * @see startRecording + */ + public static function stopRecording(): void + { + if (self::$recording_level === 0) { + throw new UnexpectedValueException('Cannot stop recording - already at base level'); + } + + --self::$recording_level; + } + + /** + * This will return the recorded issues for the current recording level + * @return array + */ + public static function clearRecordingLevel(): array + { + if (self::$recording_level === 0) { + throw new UnexpectedValueException('Not currently recording'); + } + + $recorded_issues = self::$recorded_issues[self::$recording_level]; + + self::$recorded_issues[self::$recording_level] = []; + + return $recorded_issues; + } + + /** + * This will try to add issues that has been retrieved through clearRecordingLevel or record them at a lower level + */ + public static function bubbleUp(CodeIssue $e): void + { + if (self::$recording_level === 0) { + self::add($e); + + return; + } + + self::$recorded_issues[self::$recording_level][] = $e; + } + + /** + * @internal + * @param array $server + */ + final public static function captureServer(array $server): void + { + self::$server = $server; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php new file mode 100644 index 00000000..9c28c1e7 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php @@ -0,0 +1,13 @@ + + */ + public static function addTaints(AddRemoveTaintsEvent $event): array; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php new file mode 100644 index 00000000..a0d75fe5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php @@ -0,0 +1,13 @@ +expr = $expr; + $this->context = $context; + $this->statements_source = $statements_source; + $this->codebase = $codebase; + } + + public function getExpr(): Expr + { + return $this->expr; + } + + public function getContext(): Context + { + return $this->context; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php new file mode 100644 index 00000000..b90e349a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php @@ -0,0 +1,67 @@ +> $issues + */ + public function __construct( + Codebase $codebase, + array $issues, + array $build_info, + ?SourceControlInfo $source_control_info = null + ) { + $this->codebase = $codebase; + $this->issues = $issues; + $this->build_info = $build_info; + $this->source_control_info = $source_control_info; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * @return IssueData[][] + */ + public function getIssues(): array + { + return $this->issues; + } + + public function getBuildInfo(): array + { + return $this->build_info; + } + + public function getSourceControlInfo(): ?SourceControlInfo + { + return $this->source_control_info; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php new file mode 100644 index 00000000..f74e9dbd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php @@ -0,0 +1,88 @@ +stmt = $stmt; + $this->classlike_storage = $classlike_storage; + $this->statements_source = $statements_source; + $this->codebase = $codebase; + $this->file_replacements = $file_replacements; + } + + public function getStmt(): Node\Stmt\ClassLike + { + return $this->stmt; + } + + public function getClasslikeStorage(): ClassLikeStorage + { + return $this->classlike_storage; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * @return FileManipulation[] + */ + public function getFileReplacements(): array + { + return $this->file_replacements; + } + + /** + * @param FileManipulation[] $file_replacements + */ + public function setFileReplacements(array $file_replacements): void + { + $this->file_replacements = $file_replacements; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php new file mode 100644 index 00000000..d8620141 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php @@ -0,0 +1,85 @@ +fq_class_name = $fq_class_name; + $this->code_location = $code_location; + $this->statements_source = $statements_source; + $this->codebase = $codebase; + $this->file_replacements = $file_replacements; + } + + public function getFqClassName(): string + { + return $this->fq_class_name; + } + + public function getCodeLocation(): CodeLocation + { + return $this->code_location; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * @return FileManipulation[] + */ + public function getFileReplacements(): array + { + return $this->file_replacements; + } + + /** + * @param FileManipulation[] $file_replacements + */ + public function setFileReplacements(array $file_replacements): void + { + $this->file_replacements = $file_replacements; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php new file mode 100644 index 00000000..206b0b44 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php @@ -0,0 +1,86 @@ +stmt = $stmt; + $this->storage = $storage; + $this->statements_source = $statements_source; + $this->codebase = $codebase; + $this->file_replacements = $file_replacements; + } + + public function getStmt(): ClassLike + { + return $this->stmt; + } + + public function getStorage(): ClassLikeStorage + { + return $this->storage; + } + + public function getStatementsSource(): FileSource + { + return $this->statements_source; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * @return FileManipulation[] + */ + public function getFileReplacements(): array + { + return $this->file_replacements; + } + + /** + * @param FileManipulation[] $file_replacements + */ + public function setFileReplacements(array $file_replacements): void + { + $this->file_replacements = $file_replacements; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php new file mode 100644 index 00000000..6d2d91af --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php @@ -0,0 +1,26 @@ +codebase = $codebase; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php new file mode 100644 index 00000000..92d5717e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php @@ -0,0 +1,71 @@ +expr = $expr; + $this->function_id = $function_id; + $this->context = $context; + $this->statements_source = $statements_source; + $this->codebase = $codebase; + } + + public function getExpr(): FuncCall + { + return $this->expr; + } + + public function getFunctionId(): string + { + return $this->function_id; + } + + public function getContext(): Context + { + return $this->context; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php new file mode 100644 index 00000000..3f21097f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php @@ -0,0 +1,88 @@ +expr = $expr; + $this->context = $context; + $this->statements_source = $statements_source; + $this->codebase = $codebase; + $this->file_replacements = $file_replacements; + } + + public function getExpr(): Expr + { + return $this->expr; + } + + public function getContext(): Context + { + return $this->context; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * @return FileManipulation[] + */ + public function getFileReplacements(): array + { + return $this->file_replacements; + } + + /** + * @param FileManipulation[] $file_replacements + */ + public function setFileReplacements(array $file_replacements): void + { + $this->file_replacements = $file_replacements; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php new file mode 100644 index 00000000..65027e6f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php @@ -0,0 +1,80 @@ + $stmts + */ + public function __construct( + StatementsSource $statements_source, + Context $file_context, + FileStorage $file_storage, + Codebase $codebase, + array $stmts + ) { + $this->statements_source = $statements_source; + $this->file_context = $file_context; + $this->file_storage = $file_storage; + $this->codebase = $codebase; + $this->stmts = $stmts; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getFileContext(): Context + { + return $this->file_context; + } + + public function getFileStorage(): FileStorage + { + return $this->file_storage; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * @return Stmt[] + */ + public function getStmts(): array + { + return $this->stmts; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php new file mode 100644 index 00000000..caa0576b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php @@ -0,0 +1,113 @@ +expr = $expr; + $this->function_id = $function_id; + $this->context = $context; + $this->statements_source = $statements_source; + $this->codebase = $codebase; + $this->return_type_candidate = $return_type_candidate; + $this->file_replacements = $file_replacements; + } + + public function getExpr(): FuncCall + { + return $this->expr; + } + + /** + * @return non-empty-string + */ + public function getFunctionId(): string + { + return $this->function_id; + } + + public function getContext(): Context + { + return $this->context; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + public function getReturnTypeCandidate(): Union + { + return $this->return_type_candidate; + } + + /** + * @return FileManipulation[] + */ + public function getFileReplacements(): array + { + return $this->file_replacements; + } + + /** + * @param FileManipulation[] $file_replacements + */ + public function setFileReplacements(array $file_replacements): void + { + $this->file_replacements = $file_replacements; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php new file mode 100644 index 00000000..df6cbefc --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php @@ -0,0 +1,120 @@ +stmt = $stmt; + $this->functionlike_storage = $functionlike_storage; + $this->statements_source = $statements_source; + $this->codebase = $codebase; + $this->file_replacements = $file_replacements; + $this->node_type_provider = $node_type_provider; + $this->context = $context; + } + + public function getStmt(): Node\FunctionLike + { + return $this->stmt; + } + + /** + * @deprecated Will be removed in Psalm v5.0, use getFunctionlikeStorage() instead + */ + public function getClasslikeStorage(): FunctionLikeStorage + { + return $this->functionlike_storage; + } + + public function getFunctionlikeStorage(): FunctionLikeStorage + { + return $this->functionlike_storage; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * @return FileManipulation[] + */ + public function getFileReplacements(): array + { + return $this->file_replacements; + } + + /** + * @param FileManipulation[] $file_replacements + */ + public function setFileReplacements(array $file_replacements): void + { + $this->file_replacements = $file_replacements; + } + + public function getNodeTypeProvider(): NodeTypeProvider + { + return $this->node_type_provider; + } + + public function getContext(): Context + { + return $this->context; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php new file mode 100644 index 00000000..ea60ffa8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php @@ -0,0 +1,142 @@ +expr = $expr; + $this->method_id = $method_id; + $this->appearing_method_id = $appearing_method_id; + $this->declaring_method_id = $declaring_method_id; + $this->context = $context; + $this->statements_source = $statements_source; + $this->codebase = $codebase; + $this->file_replacements = $file_replacements; + $this->return_type_candidate = $return_type_candidate; + } + + /** + * @return MethodCall|StaticCall + */ + public function getExpr(): Expr + { + return $this->expr; + } + + public function getMethodId(): string + { + return $this->method_id; + } + + public function getAppearingMethodId(): string + { + return $this->appearing_method_id; + } + + public function getDeclaringMethodId(): string + { + return $this->declaring_method_id; + } + + public function getContext(): Context + { + return $this->context; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * @return FileManipulation[] + */ + public function getFileReplacements(): array + { + return $this->file_replacements; + } + + public function getReturnTypeCandidate(): ?Union + { + return $this->return_type_candidate; + } + + /** + * @param FileManipulation[] $file_replacements + */ + public function setFileReplacements(array $file_replacements): void + { + $this->file_replacements = $file_replacements; + } + + public function setReturnTypeCandidate(?Union $return_type_candidate): void + { + $this->return_type_candidate = $return_type_candidate; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php new file mode 100644 index 00000000..ff3f204d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php @@ -0,0 +1,88 @@ +stmt = $stmt; + $this->context = $context; + $this->statements_source = $statements_source; + $this->codebase = $codebase; + $this->file_replacements = $file_replacements; + } + + public function getStmt(): Stmt + { + return $this->stmt; + } + + public function getContext(): Context + { + return $this->context; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } + + /** + * @return FileManipulation[] + */ + public function getFileReplacements(): array + { + return $this->file_replacements; + } + + /** + * @param FileManipulation[] $file_replacements + */ + public function setFileReplacements(array $file_replacements): void + { + $this->file_replacements = $file_replacements; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php new file mode 100644 index 00000000..c11f317f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php @@ -0,0 +1,63 @@ +statements_source = $statements_source; + $this->file_context = $file_context; + $this->file_storage = $file_storage; + $this->codebase = $codebase; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getFileContext(): Context + { + return $this->file_context; + } + + public function getFileStorage(): FileStorage + { + return $this->file_storage; + } + + public function getCodebase(): Codebase + { + return $this->codebase; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php new file mode 100644 index 00000000..48a9ee53 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php @@ -0,0 +1,40 @@ +statements_source = $statements_source; + $this->function_id = $function_id; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getFunctionId(): string + { + return $this->function_id; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php new file mode 100644 index 00000000..a623e697 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php @@ -0,0 +1,77 @@ + $call_args + */ + public function __construct( + StatementsSource $statements_source, + string $function_id, + array $call_args, + ?Context $context = null, + ?CodeLocation $code_location = null + ) { + $this->statements_source = $statements_source; + $this->function_id = $function_id; + $this->call_args = $call_args; + $this->context = $context; + $this->code_location = $code_location; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + public function getFunctionId(): string + { + return $this->function_id; + } + + /** + * @return PhpParser\Node\Arg[] + */ + public function getCallArgs(): array + { + return $this->call_args; + } + + public function getContext(): ?Context + { + return $this->context; + } + + public function getCodeLocation(): ?CodeLocation + { + return $this->code_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php new file mode 100644 index 00000000..e686fafd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php @@ -0,0 +1,89 @@ +statements_source = $statements_source; + $this->function_id = $function_id; + $this->stmt = $stmt; + $this->context = $context; + $this->code_location = $code_location; + } + + public function getStatementsSource(): StatementsSource + { + return $this->statements_source; + } + + /** + * @return non-empty-string + */ + public function getFunctionId(): string + { + return $this->function_id; + } + + /** + * @return list + */ + public function getCallArgs(): array + { + return $this->stmt->getArgs(); + } + + public function getContext(): Context + { + return $this->context; + } + + public function getCodeLocation(): CodeLocation + { + return $this->code_location; + } + + public function getStmt(): PhpParser\Node\Expr\FuncCall + { + return $this->stmt; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php new file mode 100644 index 00000000..3ca5acc9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php @@ -0,0 +1,63 @@ +fq_classlike_name = $fq_classlike_name; + $this->method_name_lowercase = $method_name_lowercase; + $this->source = $source; + $this->code_location = $code_location; + } + + public function getFqClasslikeName(): string + { + return $this->fq_classlike_name; + } + + public function getMethodNameLowercase(): string + { + return $this->method_name_lowercase; + } + + public function getSource(): ?StatementsSource + { + return $this->source; + } + + public function getCodeLocation(): ?CodeLocation + { + return $this->code_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php new file mode 100644 index 00000000..d974e4f5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php @@ -0,0 +1,88 @@ +|null + */ + private $call_args; + /** + * @var StatementsSource|null + */ + private $statements_source; + /** + * @var Context|null + */ + private $context; + /** + * @var CodeLocation|null + */ + private $code_location; + + /** + * @param list $call_args + */ + public function __construct( + string $fq_classlike_name, + string $method_name_lowercase, + ?array $call_args = null, + ?StatementsSource $statements_source = null, + ?Context $context = null, + ?CodeLocation $code_location = null + ) { + $this->fq_classlike_name = $fq_classlike_name; + $this->method_name_lowercase = $method_name_lowercase; + $this->call_args = $call_args; + $this->statements_source = $statements_source; + $this->context = $context; + $this->code_location = $code_location; + } + + public function getFqClasslikeName(): string + { + return $this->fq_classlike_name; + } + + public function getMethodNameLowercase(): string + { + return $this->method_name_lowercase; + } + + /** + * @return list|null + */ + public function getCallArgs(): ?array + { + return $this->call_args; + } + + public function getStatementsSource(): ?StatementsSource + { + return $this->statements_source; + } + + public function getContext(): ?Context + { + return $this->context; + } + + public function getCodeLocation(): ?CodeLocation + { + return $this->code_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php new file mode 100644 index 00000000..52ab51e3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php @@ -0,0 +1,146 @@ + $template_type_parameters + * @param lowercase-string $method_name_lowercase + * @param lowercase-string $called_method_name_lowercase + */ + public function __construct( + StatementsSource $source, + string $fq_classlike_name, + string $method_name_lowercase, + $stmt, + Context $context, + CodeLocation $code_location, + ?array $template_type_parameters = null, + ?string $called_fq_classlike_name = null, + ?string $called_method_name_lowercase = null + ) { + $this->source = $source; + $this->fq_classlike_name = $fq_classlike_name; + $this->method_name_lowercase = $method_name_lowercase; + $this->context = $context; + $this->code_location = $code_location; + $this->stmt = $stmt; + $this->template_type_parameters = $template_type_parameters; + $this->called_fq_classlike_name = $called_fq_classlike_name; + $this->called_method_name_lowercase = $called_method_name_lowercase; + } + + public function getSource(): StatementsSource + { + return $this->source; + } + + public function getFqClasslikeName(): string + { + return $this->fq_classlike_name; + } + + /** + * @return lowercase-string + */ + public function getMethodNameLowercase(): string + { + return $this->method_name_lowercase; + } + + /** + * @return list + */ + public function getCallArgs(): array + { + return $this->stmt->getArgs(); + } + + public function getContext(): Context + { + return $this->context; + } + + public function getCodeLocation(): CodeLocation + { + return $this->code_location; + } + + /** + * @return Union[]|null + */ + public function getTemplateTypeParameters(): ?array + { + return $this->template_type_parameters; + } + + public function getCalledFqClasslikeName(): ?string + { + return $this->called_fq_classlike_name; + } + + /** + * @return lowercase-string|null + */ + public function getCalledMethodNameLowercase(): ?string + { + return $this->called_method_name_lowercase; + } + + /** + * @return PhpParser\Node\Expr\MethodCall|PhpParser\Node\Expr\StaticCall + */ + public function getStmt() + { + return $this->stmt; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php new file mode 100644 index 00000000..90ceb7d3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php @@ -0,0 +1,70 @@ +source = $source; + $this->fq_classlike_name = $fq_classlike_name; + $this->method_name_lowercase = $method_name_lowercase; + $this->context = $context; + $this->code_location = $code_location; + } + + public function getSource(): StatementsSource + { + return $this->source; + } + + public function getFqClasslikeName(): string + { + return $this->fq_classlike_name; + } + + public function getMethodNameLowercase(): string + { + return $this->method_name_lowercase; + } + + public function getContext(): Context + { + return $this->context; + } + + public function getCodeLocation(): ?CodeLocation + { + return $this->code_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php new file mode 100644 index 00000000..5cb98d5e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php @@ -0,0 +1,87 @@ +fq_classlike_name = $fq_classlike_name; + $this->property_name = $property_name; + $this->read_mode = $read_mode; + $this->source = $source; + $this->context = $context; + $this->code_location = $code_location; + } + + public function getFqClasslikeName(): string + { + return $this->fq_classlike_name; + } + + public function getPropertyName(): string + { + return $this->property_name; + } + + public function isReadMode(): bool + { + return $this->read_mode; + } + + public function getSource(): ?StatementsSource + { + return $this->source; + } + + public function getContext(): ?Context + { + return $this->context; + } + + public function getCodeLocation(): ?CodeLocation + { + return $this->code_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php new file mode 100644 index 00000000..65e91e22 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php @@ -0,0 +1,69 @@ +fq_classlike_name = $fq_classlike_name; + $this->property_name = $property_name; + $this->read_mode = $read_mode; + $this->source = $source; + $this->context = $context; + } + + public function getFqClasslikeName(): string + { + return $this->fq_classlike_name; + } + + public function getPropertyName(): string + { + return $this->property_name; + } + + public function isReadMode(): bool + { + return $this->read_mode; + } + + public function getSource(): ?StatementsSource + { + return $this->source; + } + + public function getContext(): ?Context + { + return $this->context; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php new file mode 100644 index 00000000..78ef4b57 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php @@ -0,0 +1,81 @@ +source = $source; + $this->fq_classlike_name = $fq_classlike_name; + $this->property_name = $property_name; + $this->read_mode = $read_mode; + $this->context = $context; + $this->code_location = $code_location; + } + + public function getSource(): StatementsSource + { + return $this->source; + } + + public function getFqClasslikeName(): string + { + return $this->fq_classlike_name; + } + + public function getPropertyName(): string + { + return $this->property_name; + } + + public function isReadMode(): bool + { + return $this->read_mode; + } + + public function getContext(): Context + { + return $this->context; + } + + public function getCodeLocation(): CodeLocation + { + return $this->code_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php new file mode 100644 index 00000000..c92d2442 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php @@ -0,0 +1,24 @@ +value = $value; + } + + public function getValue(): string + { + return $this->value; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php new file mode 100644 index 00000000..dbe4617b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php @@ -0,0 +1,21 @@ + + */ + public static function getFunctionIds(): array; + + /** + * Use this hook for informing whether or not a global function exists. If you know the function does + * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis + * will continue to determine if the function actually exists. + * + */ + public static function doesFunctionExist(FunctionExistenceProviderEvent $event): ?bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php new file mode 100644 index 00000000..0c966f17 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php @@ -0,0 +1,19 @@ + + */ + public static function getFunctionIds(): array; + + /** + * @return ?array + */ + public static function getFunctionParams(FunctionParamsProviderEvent $event): ?array; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php new file mode 100644 index 00000000..8e10b6d6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php @@ -0,0 +1,21 @@ + + */ + public static function getFunctionIds(): array; + + /** + * Use this hook for providing custom return type logic. If this plugin does not know what a function should + * return but another plugin may be able to determine the type, return null. Otherwise return a mixed union type + * if something should be returned, but can't be more specific. + */ + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php new file mode 100644 index 00000000..f94638f4 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php @@ -0,0 +1,20 @@ + + */ + public static function getClassLikeNames(): array; + + /** + * Use this hook for informing whether or not a method exists on a given object. If you know the method does + * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis will + * continue to determine if the method actually exists. + */ + public static function doesMethodExist(MethodExistenceProviderEvent $event): ?bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php new file mode 100644 index 00000000..a2d44ed1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php @@ -0,0 +1,19 @@ + + */ + public static function getClassLikeNames(): array; + + /** + * @return ?array + */ + public static function getMethodParams(MethodParamsProviderEvent $event): ?array; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php new file mode 100644 index 00000000..1ce1fa16 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php @@ -0,0 +1,21 @@ + + */ + public static function getClassLikeNames(): array; + + /** + * Use this hook for providing custom return type logic. If this plugin does not know what a method should return + * but another plugin may be able to determine the type, return null. Otherwise return a mixed union type if + * something should be returned, but can't be more specific. + */ + public static function getMethodReturnType(MethodReturnTypeProviderEvent $event): ?Union; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php new file mode 100644 index 00000000..65ea9171 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php @@ -0,0 +1,15 @@ + + */ + public static function getClassLikeNames(): array; + + public static function isMethodVisible(MethodVisibilityProviderEvent $event): ?bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php new file mode 100644 index 00000000..b45434de --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php @@ -0,0 +1,21 @@ + + */ + public static function getClassLikeNames(): array; + + /** + * Use this hook for informing whether or not a property exists on a given object. If you know the property does + * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis will + * continue to determine if the property actually exists. + * + */ + public static function doesPropertyExist(PropertyExistenceProviderEvent $event): ?bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php new file mode 100644 index 00000000..fd7dee3a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php @@ -0,0 +1,16 @@ + + */ + public static function getClassLikeNames(): array; + + public static function getPropertyType(PropertyTypeProviderEvent $event): ?Union; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php new file mode 100644 index 00000000..7680bd23 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php @@ -0,0 +1,15 @@ + + */ + public static function getClassLikeNames(): array; + + public static function isPropertyVisible(PropertyVisibilityProviderEvent $event): ?bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php new file mode 100644 index 00000000..08868cf8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php @@ -0,0 +1,15 @@ + + */ + public static function removeTaints(AddRemoveTaintsEvent $event): array; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php new file mode 100644 index 00000000..6bfd2227 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php @@ -0,0 +1,14 @@ +> $issues + */ + public static function afterAnalysis( + Codebase $codebase, + array $issues, + array $build_info, + ?SourceControlInfo $source_control_info = null + ): void; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php new file mode 100644 index 00000000..c910400e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php @@ -0,0 +1,29 @@ + + */ + public static function getFunctionIds(): array; + + /** + * Use this hook for informing whether or not a global function exists. If you know the function does + * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis + * will continue to determine if the function actually exists. + * + */ + public static function doesFunctionExist( + StatementsSource $statements_source, + string $function_id + ): ?bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php new file mode 100644 index 00000000..8b23d829 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php @@ -0,0 +1,31 @@ + + */ + public static function getFunctionIds(): array; + + /** + * @param list $call_args + * + * @return ?array + */ + public static function getFunctionParams( + StatementsSource $statements_source, + string $function_id, + array $call_args, + ?Context $context = null, + ?CodeLocation $code_location = null + ): ?array; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php new file mode 100644 index 00000000..125d779f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php @@ -0,0 +1,33 @@ + + */ + public static function getFunctionIds(): array; + + /** + * Use this hook for providing custom return type logic. If this plugin does not know what a function should + * return but another plugin may be able to determine the type, return null. Otherwise return a mixed union type + * if something should be returned, but can't be more specific. + * + * @param list $call_args + */ + public static function getFunctionReturnType( + StatementsSource $statements_source, + string $function_id, + array $call_args, + Context $context, + CodeLocation $code_location + ): ?Union; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php new file mode 100644 index 00000000..2964fe60 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php @@ -0,0 +1,27 @@ + + */ + public static function getClassLikeNames(): array; + + /** + * Use this hook for informing whether or not a method exists on a given object. If you know the method does + * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis will + * continue to determine if the method actually exists. + */ + public static function doesMethodExist( + string $fq_classlike_name, + string $method_name_lowercase, + ?StatementsSource $source = null, + ?CodeLocation $code_location = null + ): ?bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php new file mode 100644 index 00000000..680c60a8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php @@ -0,0 +1,32 @@ + + */ + public static function getClassLikeNames(): array; + + /** + * @param list $call_args + * + * @return ?array + */ + public static function getMethodParams( + string $fq_classlike_name, + string $method_name_lowercase, + ?array $call_args = null, + ?StatementsSource $statements_source = null, + ?Context $context = null, + ?CodeLocation $code_location = null + ): ?array; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php new file mode 100644 index 00000000..c39a61ce --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php @@ -0,0 +1,40 @@ + + */ + public static function getClassLikeNames(): array; + + /** + * Use this hook for providing custom return type logic. If this plugin does not know what a method should return + * but another plugin may be able to determine the type, return null. Otherwise return a mixed union type if + * something should be returned, but can't be more specific. + * + * @param list $call_args + * @param ?array $template_type_parameters + * @param lowercase-string $method_name_lowercase + * @param lowercase-string $called_method_name_lowercase + */ + public static function getMethodReturnType( + StatementsSource $source, + string $fq_classlike_name, + string $method_name_lowercase, + array $call_args, + Context $context, + CodeLocation $code_location, + ?array $template_type_parameters = null, + ?string $called_fq_classlike_name = null, + ?string $called_method_name_lowercase = null + ): ?Union; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php new file mode 100644 index 00000000..bf611352 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php @@ -0,0 +1,24 @@ + + */ + public static function getClassLikeNames(): array; + + public static function isMethodVisible( + StatementsSource $source, + string $fq_classlike_name, + string $method_name_lowercase, + Context $context, + ?CodeLocation $code_location = null + ): ?bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php new file mode 100644 index 00000000..6debbb96 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php @@ -0,0 +1,31 @@ + + */ + public static function getClassLikeNames(): array; + + /** + * Use this hook for informing whether or not a property exists on a given object. If you know the property does + * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis will + * continue to determine if the property actually exists. + * + */ + public static function doesPropertyExist( + string $fq_classlike_name, + string $property_name, + bool $read_mode, + ?StatementsSource $source = null, + ?Context $context = null, + ?CodeLocation $code_location = null + ): ?bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php new file mode 100644 index 00000000..0e3f18fc --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php @@ -0,0 +1,24 @@ + + */ + public static function getClassLikeNames(): array; + + public static function getPropertyType( + string $fq_classlike_name, + string $property_name, + bool $read_mode, + ?StatementsSource $source = null, + ?Context $context = null + ): ?Union; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php new file mode 100644 index 00000000..650b9447 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php @@ -0,0 +1,25 @@ + + */ + public static function getClassLikeNames(): array; + + public static function isPropertyVisible( + StatementsSource $source, + string $fq_classlike_name, + string $property_name, + bool $read_mode, + Context $context, + CodeLocation $code_location + ): ?bool; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php new file mode 100644 index 00000000..976918ee --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php @@ -0,0 +1,16 @@ + $className + * @deprecated will be removed in v5.0, use \Psalm\Plugin\FileExtensionsInterface instead (#6788) + */ + public function addFileTypeScanner(string $fileExtension, string $className): void; + + /** + * @param string $fileExtension e.g. `'html'` + * @param class-string $className + * @deprecated will be removed in v5.0, use \Psalm\Plugin\FileExtensionsInterface instead (#6788) + */ + public function addFileTypeAnalyzer(string $fileExtension, string $className): void; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Shepherd.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Shepherd.php new file mode 100644 index 00000000..51748d5f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Plugin/Shepherd.php @@ -0,0 +1,223 @@ +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); + + return; + } + + $source_control_data = $source_control_info ? $source_control_info->toArray() : []; + + 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 function (IssueData $i): bool { + return $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); + + $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, 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 + $return = curl_exec($ch); + + if ($return !== '') { + fwrite(STDERR, 'Error with Psalm Shepherd:' . PHP_EOL); + + if ($return === false) { + fwrite(STDERR, self::getCurlErrorMessage($ch) . PHP_EOL); + } else { + echo $return . PHP_EOL; + echo 'Git args: ' + . var_export($source_control_data, true) + . PHP_EOL; + echo 'CI args: ' + . var_export($build_info, true) + . PHP_EOL; + } + } else { + $short_address = str_replace('https://', '', $base_address); + + fwrite(STDERR, "🐑 results sent to $short_address 🐑" . PHP_EOL); + } + + // Close cURL session handle + curl_close($ch); + } + } + + /** + * @param mixed $ch + * + * @psalm-pure + */ + public static function getCurlErrorMessage($ch): string + { + /** + * @psalm-suppress MixedArgument + * @var array + */ + $curl_info = curl_getinfo($ch); + + if (isset($curl_info['ssl_verify_result']) + && $curl_info['ssl_verify_result'] !== 0 + ) { + switch ($curl_info['ssl_verify_result']) { + case 2: + return 'unable to get issuer certificate'; + case 3: + return 'unable to get certificate CRL'; + case 4: + return 'unable to decrypt certificate’s signature'; + case 5: + return 'unable to decrypt CRL’s signature'; + case 6: + return 'unable to decode issuer public key'; + case 7: + return 'certificate signature failure'; + case 8: + return 'CRL signature failure'; + case 9: + return 'certificate is not yet valid'; + case 10: + return 'certificate has expired'; + case 11: + return 'CRL is not yet valid'; + case 12: + return 'CRL has expired'; + case 13: + return 'format error in certificate’s notBefore field'; + case 14: + return 'format error in certificate’s notAfter field'; + case 15: + return 'format error in CRL’s lastUpdate field'; + case 16: + return 'format error in CRL’s nextUpdate field'; + case 17: + return 'out of memory'; + case 18: + return 'self signed certificate'; + case 19: + return 'self signed certificate in certificate chain'; + case 20: + return 'unable to get local issuer certificate'; + case 21: + return 'unable to verify the first certificate'; + case 22: + return 'certificate chain too long'; + case 23: + return 'certificate revoked'; + case 24: + return 'invalid CA certificate'; + case 25: + return 'path length constraint exceeded'; + case 26: + return 'unsupported certificate purpose'; + case 27: + return 'certificate not trusted'; + case 28: + return 'certificate rejected'; + case 29: + return 'subject issuer mismatch'; + case 30: + return 'authority and subject key identifier mismatch'; + case 31: + return 'authority and issuer serial number mismatch'; + case 32: + return 'key usage does not include certificate signing'; + case 50: + return 'application verification failure'; + } + + return ''; + } + + /** + * @psalm-suppress MixedArgument + */ + return var_export(curl_getinfo($ch), true); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php b/vendor/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php new file mode 100644 index 00000000..8d5340c4 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php @@ -0,0 +1,238 @@ +> + */ + private $additionalFileTypeScanners = []; + + /** + * @var array> + */ + private $additionalFileTypeAnalyzers = []; + + /** + * @var list + */ + private $additionalFileExtensions = []; + + /** + * @internal + */ + public function __construct(Config $config, Codebase $codebase) + { + $this->config = $config; + $this->codebase = $codebase; + } + + public function addStubFile(string $file_name): void + { + $this->config->addStubFile($file_name); + } + + public function registerHooksFromClass(string $handler): void + { + if (!class_exists($handler, false)) { + throw new InvalidArgumentException('Plugins must be loaded before registration'); + } + + $this->config->eventDispatcher->registerClass($handler); + + if (is_subclass_of($handler, LegacyPropertyExistenceProviderInterface::class) || + is_subclass_of($handler, PropertyExistenceProviderInterface::class) + ) { + $this->codebase->properties->property_existence_provider->registerClass($handler); + } + + if (is_subclass_of($handler, LegacyPropertyVisibilityProviderInterface::class) || + is_subclass_of($handler, PropertyVisibilityProviderInterface::class) + ) { + $this->codebase->properties->property_visibility_provider->registerClass($handler); + } + + if (is_subclass_of($handler, LegacyPropertyTypeProviderInterface::class) || + is_subclass_of($handler, PropertyTypeProviderInterface::class) + ) { + $this->codebase->properties->property_type_provider->registerClass($handler); + } + + if (is_subclass_of($handler, LegacyMethodExistenceProviderInterface::class) || + is_subclass_of($handler, MethodExistenceProviderInterface::class) + ) { + $this->codebase->methods->existence_provider->registerClass($handler); + } + + if (is_subclass_of($handler, LegacyMethodVisibilityProviderInterface::class) || + is_subclass_of($handler, MethodVisibilityProviderInterface::class) + ) { + $this->codebase->methods->visibility_provider->registerClass($handler); + } + + if (is_subclass_of($handler, LegacyMethodReturnTypeProviderInterface::class) || + is_subclass_of($handler, MethodReturnTypeProviderInterface::class) + ) { + $this->codebase->methods->return_type_provider->registerClass($handler); + } + + if (is_subclass_of($handler, LegacyMethodParamsProviderInterface::class) || + is_subclass_of($handler, MethodParamsProviderInterface::class) + ) { + $this->codebase->methods->params_provider->registerClass($handler); + } + + if (is_subclass_of($handler, LegacyFunctionExistenceProviderInterface::class) || + is_subclass_of($handler, FunctionExistenceProviderInterface::class) + ) { + $this->codebase->functions->existence_provider->registerClass($handler); + } + + if (is_subclass_of($handler, LegacyFunctionParamsProviderInterface::class) || + is_subclass_of($handler, FunctionParamsProviderInterface::class) + ) { + $this->codebase->functions->params_provider->registerClass($handler); + } + + if (is_subclass_of($handler, LegacyFunctionReturnTypeProviderInterface::class) || + is_subclass_of($handler, FunctionReturnTypeProviderInterface::class) + ) { + $this->codebase->functions->return_type_provider->registerClass($handler); + } + } + + /** + * @param string $fileExtension e.g. `'html'` + * @param class-string $className + * @deprecated will be removed in v5.0, use \Psalm\Plugin\FileExtensionsInterface instead (#6788) + */ + public function addFileTypeScanner(string $fileExtension, string $className): void + { + if (!class_exists($className) || !is_a($className, FileScanner::class, true)) { + throw new LogicException( + sprintf( + 'Class %s must be of type %s', + $className, + FileScanner::class + ), + 1622727271 + ); + } + if (!empty($this->config->getFiletypeScanners()[$fileExtension]) + || !empty($this->additionalFileTypeScanners[$fileExtension]) + ) { + throw new LogicException( + sprintf('Cannot redeclare scanner for file-type %s', $fileExtension), + 1622727272 + ); + } + $this->additionalFileTypeScanners[$fileExtension] = $className; + $this->addFileExtension($fileExtension); + } + + /** + * @return array> + * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788) + */ + public function getAdditionalFileTypeScanners(): array + { + return $this->additionalFileTypeScanners; + } + + /** + * @param string $fileExtension e.g. `'html'` + * @param class-string $className + * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788) + */ + public function addFileTypeAnalyzer(string $fileExtension, string $className): void + { + if (!class_exists($className) || !is_a($className, FileAnalyzer::class, true)) { + throw new LogicException( + sprintf( + 'Class %s must be of type %s', + $className, + FileAnalyzer::class + ), + 1622727281 + ); + } + if (!empty($this->config->getFiletypeAnalyzers()[$fileExtension]) + || !empty($this->additionalFileTypeAnalyzers[$fileExtension]) + ) { + throw new LogicException( + sprintf('Cannot redeclare analyzer for file-type %s', $fileExtension), + 1622727282 + ); + } + $this->additionalFileTypeAnalyzers[$fileExtension] = $className; + $this->addFileExtension($fileExtension); + } + + /** + * @return array> + * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788) + */ + public function getAdditionalFileTypeAnalyzers(): array + { + return $this->additionalFileTypeAnalyzers; + } + + /** + * @return list e.g. `['html', 'perl']` + * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788) + */ + public function getAdditionalFileExtensions(): array + { + return $this->additionalFileExtensions; + } + + /** + * @param string $fileExtension e.g. `'html'` + * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788) + */ + private function addFileExtension(string $fileExtension): void + { + if (!in_array($fileExtension, $this->config->getFileExtensions(), true)) { + $this->additionalFileExtensions[] = $fileExtension; + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Progress/DebugProgress.php b/vendor/vimeo/psalm/src/Psalm/Progress/DebugProgress.php new file mode 100644 index 00000000..192976d6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Progress/DebugProgress.php @@ -0,0 +1,40 @@ +write($message); + } + + public function startScanningFiles(): void + { + $this->write('Scanning files...' . "\n"); + } + + public function startAnalyzingFiles(): void + { + $this->write('Analyzing files...' . "\n"); + } + + public function startAlteringFiles(): void + { + $this->write('Updating files...' . "\n"); + } + + public function alterFileDone(string $file_name): void + { + $this->write('Altered ' . $file_name . "\n"); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php b/vendor/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php new file mode 100644 index 00000000..76f91e98 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php @@ -0,0 +1,104 @@ +number_of_tasks > self::TOO_MANY_FILES) { + ++$this->progress; + + // Source for rate limiting: + // https://github.com/phan/phan/blob/9a788581ee1a4e1c35bebf89c435fd8a238c1d17/src/Phan/CLI.php + $time = microtime(true); + + // If not enough time has elapsed, then don't update the progress bar. + // Making the update frequency based on time (instead of the number of files) + // prevents the terminal from rapidly flickering while processing small/empty files, + // and reduces the time spent writing to stderr. + if ($time - $this->previous_update_time < self::PROGRESS_BAR_SAMPLE_INTERVAL) { + // Make sure to output the section for 100% completion regardless of limits, to avoid confusion. + if ($this->progress !== $this->number_of_tasks) { + return; + } + } + $this->previous_update_time = $time; + + $inner_progress = self::renderInnerProgressBar( + self::NUMBER_OF_COLUMNS, + $this->progress / $this->number_of_tasks + ); + + $this->write($inner_progress . ' ' . $this->getOverview() . "\r"); + } else { + parent::taskDone($level); + } + } + + /** + * Fully stolen from + * https://github.com/phan/phan/blob/d61a624b1384ea220f39927d53fd656a65a75fac/src/Phan/CLI.php + * Renders a unicode progress bar that goes from light (left) to dark (right) + * The length in the console is the positive integer $length + * + * @see https://en.wikipedia.org/wiki/Block_Elements + */ + private static function renderInnerProgressBar(int $length, float $p): string + { + $current_float = $p * $length; + $current = (int)$current_float; + $rest = max($length - $current, 0); + + if (!self::doesTerminalSupportUtf8()) { + // Show a progress bar of "XXXX>------" in Windows when utf-8 is unsupported. + $progress_bar = str_repeat('X', $current); + $delta = $current_float - $current; + if ($delta > 0.5) { + $progress_bar .= '>' . str_repeat('-', $rest - 1); + } else { + $progress_bar .= str_repeat('-', $rest); + } + + return $progress_bar; + } + + // The left-most characters are "Light shade" + $progress_bar = str_repeat("\u{2588}", $current); + $delta = $current_float - $current; + if ($delta > 3.0 / 4) { + $progress_bar .= "\u{258A}" . str_repeat("\u{2591}", $rest - 1); + } elseif ($delta > 2.0 / 4) { + $progress_bar .= "\u{258C}" . str_repeat("\u{2591}", $rest - 1); + } elseif ($delta > 1.0 / 4) { + $progress_bar .= "\u{258E}" . str_repeat("\u{2591}", $rest - 1); + } else { + $progress_bar .= str_repeat("\u{2591}", $rest); + } + + return $progress_bar; + } + + public function finish(): void + { + if ($this->number_of_tasks > self::TOO_MANY_FILES) { + $this->write(str_repeat(' ', self::NUMBER_OF_COLUMNS + strlen($this->getOverview()) + 1) . "\r"); + } else { + parent::finish(); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Progress/LongProgress.php b/vendor/vimeo/psalm/src/Psalm/Progress/LongProgress.php new file mode 100644 index 00000000..0ff13f13 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Progress/LongProgress.php @@ -0,0 +1,110 @@ +print_errors = $print_errors; + $this->print_infos = $print_infos; + } + + public function startScanningFiles(): void + { + $this->write('Scanning files...' . "\n"); + } + + public function startAnalyzingFiles(): void + { + $this->write('Analyzing files...' . "\n\n"); + } + + public function startAlteringFiles(): void + { + $this->write('Altering files...' . "\n"); + } + + public function alterFileDone(string $file_name): void + { + $this->write('Altered ' . $file_name . "\n"); + } + + public function start(int $number_of_tasks): void + { + $this->number_of_tasks = $number_of_tasks; + $this->progress = 0; + } + + public function taskDone(int $level): void + { + if ($level === 0 || ($level === 1 && !$this->print_infos) || !$this->print_errors) { + $this->write(self::doesTerminalSupportUtf8() ? '░' : '_'); + } elseif ($level === 1) { + $this->write('I'); + } else { + $this->write('E'); + } + + ++$this->progress; + + if (($this->progress % self::NUMBER_OF_COLUMNS) !== 0) { + return; + } + + $this->printOverview(); + $this->write(PHP_EOL); + } + + public function finish(): void + { + $this->write(PHP_EOL); + } + + protected function getOverview(): string + { + if ($this->number_of_tasks === null) { + throw new LogicException('Progress::start() should be called before Progress::startDone()'); + } + + $leadingSpaces = 1 + strlen((string) $this->number_of_tasks) - strlen((string) $this->progress); + // Don't show 100% unless this is the last line of the progress bar. + $percentage = floor($this->progress / $this->number_of_tasks * 100); + + return sprintf( + '%s%s / %s (%s%%)', + str_repeat(' ', $leadingSpaces), + $this->progress, + $this->number_of_tasks, + $percentage + ); + } + + private function printOverview(): void + { + $this->write($this->getOverview()); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Progress/Progress.php b/vendor/vimeo/psalm/src/Psalm/Progress/Progress.php new file mode 100644 index 00000000..678f4d17 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Progress/Progress.php @@ -0,0 +1,69 @@ + + */ + protected $issues_data; + + /** @var array */ + protected $fixable_issue_counts; + + /** @var bool */ + protected $use_color; + + /** @var bool */ + protected $show_snippet; + + /** @var bool */ + protected $show_info; + + /** @var bool */ + protected $pretty; + + /** @var bool */ + protected $in_ci; + + /** @var int */ + protected $mixed_expression_count; + + /** @var int */ + protected $total_expression_count; + + /** + * @param array $issues_data + * @param array $fixable_issue_counts + */ + public function __construct( + array $issues_data, + array $fixable_issue_counts, + ReportOptions $report_options, + int $mixed_expression_count = 1, + int $total_expression_count = 1 + ) { + if (!$report_options->show_info) { + $this->issues_data = array_filter( + $issues_data, + function ($issue_data): bool { + return $issue_data->severity !== Config::REPORT_INFO; + } + ); + } else { + $this->issues_data = $issues_data; + } + $this->fixable_issue_counts = $fixable_issue_counts; + + $this->use_color = $report_options->use_color; + $this->show_snippet = $report_options->show_snippet; + $this->show_info = $report_options->show_info; + $this->pretty = $report_options->pretty; + $this->in_ci = $report_options->in_ci; + + $this->mixed_expression_count = $mixed_expression_count; + $this->total_expression_count = $total_expression_count; + } + + protected function xmlEncode(string $data): string + { + return htmlspecialchars($data, ENT_XML1 | ENT_QUOTES); + } + + abstract public function create(): string; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php b/vendor/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php new file mode 100644 index 00000000..247c258a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php @@ -0,0 +1,39 @@ +' . "\n"; + + $output .= '' . "\n"; + + foreach ($this->issues_data as $issue_data) { + $message = sprintf( + '%s: %s', + $issue_data->type, + $issue_data->message + ); + + $output .= '' . "\n"; + $output .= ' '; + $output .= 'line_from . '"'; + $output .= ' column="' . $issue_data->column_from . '"'; + $output .= ' severity="' . $issue_data->severity . '"'; + $output .= ' message="' . $this->xmlEncode($message) . '"'; + $output .= '/>' . "\n"; + $output .= '' . "\n"; + } + + $output .= '' . "\n"; + + return $output; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php b/vendor/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php new file mode 100644 index 00000000..cdd1458b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php @@ -0,0 +1,95 @@ + + */ +class CodeClimateReport extends Report +{ + public function create(): string + { + $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; + + $issues_data = array_map( + function (IssueData $issue): array { + /** + * map fields to new structure. + * Expected fields: + * - type + * - check_name + * - description* + * - content + * - categories[] + * - severity + * - fingerprint* + * - location.path* + * - location.lines.begin* + * + * Fields with * are the one used by Gitlab for Code Quality + */ + return [ + 'type' => 'issue', + 'check_name' => $issue->type, + 'description' => $issue->message, + 'categories' => [$issue->type], + 'severity' => $this->convertSeverity($issue->severity), + 'fingerprint' => $this->calculateFingerprint($issue), + 'location' => [ + 'path' => $issue->file_name, + 'lines' => [ + 'begin' => $issue->line_from, + 'end' => $issue->line_to, + ], + ], + ]; + }, + $this->issues_data + ); + + return Json::encode(array_values($issues_data), $options) . "\n"; + } + + /** + * convert our own severity to CodeClimate format + * Values can be : info, minor, major, critical, or blocker + */ + protected function convertSeverity(string $input): string + { + if (Config::REPORT_INFO === $input) { + return 'info'; + } + if (Config::REPORT_ERROR === $input) { + return 'critical'; + } + if (Config::REPORT_SUPPRESS === $input) { + return 'minor'; + } + + // unknown cases ? fallback + return 'critical'; + } + + /** + * calculate a unique fingerprint for a given issue + */ + protected function calculateFingerprint(IssueData $issue): string + { + return md5($issue->type.$issue->message.$issue->file_name.$issue->from.$issue->to); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/CompactReport.php b/vendor/vimeo/psalm/src/Psalm/Report/CompactReport.php new file mode 100644 index 00000000..f1d001a0 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/CompactReport.php @@ -0,0 +1,84 @@ +issues_data as $i => $issue_data) { + if (!$this->show_info && $issue_data->severity === Config::REPORT_INFO) { + continue; + } + + if ($current_file === null || $current_file !== $issue_data->file_name) { + // If we're processing a new file, then wrap up the last table and render it out. + if ($buffer !== null) { + $table->render(); + $output[] = $buffer->fetch(); + } + + $output[] = 'FILE: ' . $issue_data->file_name . "\n"; + + $buffer = new BufferedOutput(); + $table = new Table($buffer); + $table->setHeaders(['SEVERITY', 'LINE', 'ISSUE', 'DESCRIPTION']); + } + + $is_error = $issue_data->severity === Config::REPORT_ERROR; + if ($is_error) { + $severity = ($this->use_color ? "\e[0;31mERROR\e[0m" : 'ERROR'); + } else { + $severity = strtoupper($issue_data->severity); + } + + // Since `Table::setColumnMaxWidth` is only available in symfony/console 4.2+ we need do something similar + // so we have clean tables. + $message = $issue_data->message; + if (strlen($message) > 70) { + $message = implode("\n", str_split($message, 70)); + } + + $table->addRow([ + $severity, + $issue_data->line_from, + $issue_data->type, + $message, + ]); + + $current_file = $issue_data->file_name; + + // If we're at the end of the issue sets, then wrap up the last table and render it out. + if ($i === count($this->issues_data) - 1) { + $table->render(); + $output[] = $buffer->fetch(); + } + } + + return implode("\n", $output); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/ConsoleReport.php b/vendor/vimeo/psalm/src/Psalm/Report/ConsoleReport.php new file mode 100644 index 00000000..214b7124 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/ConsoleReport.php @@ -0,0 +1,149 @@ +issues_data as $issue_data) { + $output .= $this->format($issue_data) . "\n" . "\n"; + } + + return $output; + } + + private function format(IssueData $issue_data): string + { + $issue_string = ''; + + $is_error = $issue_data->severity === Config::REPORT_ERROR; + + if ($is_error) { + $issue_string .= ($this->use_color ? "\e[0;31mERROR\e[0m" : 'ERROR'); + } else { + $issue_string .= 'INFO'; + } + + $issue_reference = $issue_data->link ? ' (see ' . $issue_data->link . ')' : ''; + + $issue_string .= ': ' . $issue_data->type + . ' - ' . $this->getFileReference($issue_data) + . ' - ' . $issue_data->message . $issue_reference . "\n"; + + + if ($issue_data->taint_trace) { + $issue_string .= $this->getTaintSnippets($issue_data->taint_trace); + } elseif ($this->show_snippet) { + $snippet = $issue_data->snippet; + + if (!$this->use_color) { + $issue_string .= $snippet; + } else { + $selection_start = $issue_data->from - $issue_data->snippet_from; + $selection_length = $issue_data->to - $issue_data->from; + + $issue_string .= substr($snippet, 0, $selection_start) + . ($is_error ? "\e[97;41m" : "\e[30;47m") . substr($snippet, $selection_start, $selection_length) + . "\e[0m" . substr($snippet, $selection_length + $selection_start) . "\n"; + } + } + + if ($issue_data->other_references) { + if ($this->show_snippet) { + $issue_string .= "\n"; + } + + $issue_string .= $this->getTaintSnippets($issue_data->other_references); + } + + return $issue_string; + } + + /** + * @param non-empty-list $taint_trace + */ + private function getTaintSnippets(array $taint_trace): string + { + $snippets = ''; + + foreach ($taint_trace as $node_data) { + if ($node_data instanceof DataFlowNodeData) { + $snippets .= ' ' . $node_data->label . ' - ' . $this->getFileReference($node_data) . "\n"; + + if ($this->show_snippet) { + $snippet = $node_data->snippet; + + if (!$this->use_color) { + $snippets .= $snippet . "\n\n"; + } else { + $selection_start = $node_data->from - $node_data->snippet_from; + $selection_length = $node_data->to - $node_data->from; + + $snippets .= substr($snippet, 0, $selection_start) + . "\e[30;47m" . substr($snippet, $selection_start, $selection_length) + . "\e[0m" . substr($snippet, $selection_length + $selection_start) . "\n\n"; + } + } + } else { + $snippets .= ' ' . $node_data['label'] . "\n"; + $snippets .= ' ' . "\n\n"; + } + } + + return $snippets; + } + + /** + * @param IssueData|DataFlowNodeData $data + */ + private function getFileReference($data): string + { + $reference = $data->file_name . ':' . $data->line_from . ':' . $data->column_from; + + if (!$this->use_color) { + return $reference; + } + + $file_basename = basename($data->file_name); + $file_path = substr($data->file_name, 0, -strlen($file_basename)); + + $reference = $file_path + . "\033[1;31m" + . $file_basename . ':' . $data->line_from . ':' . $data->column_from + . "\033[0m" + ; + + if ($this->in_ci) { + return $reference; + } + + if (null === $this->link_format) { + // if xdebug is not enabled, use `get_cfg_var` to get the value directly from php.ini + $this->link_format = ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format') + ?: 'file://%f#L%l'; + } + + $link = strtr($this->link_format, ['%f' => $data->file_path, '%l' => $data->line_from]); + // $reference = $data->file_name . ':' . $data->line_from . ':' . $data->column_from; + + + return "\033]8;;" . $link . "\033\\" . $reference . "\033]8;;\033\\"; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/CountReport.php b/vendor/vimeo/psalm/src/Psalm/Report/CountReport.php new file mode 100644 index 00000000..b044d851 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/CountReport.php @@ -0,0 +1,39 @@ +issues_data as $issue_data) { + if (array_key_exists($issue_data->type, $issue_type_counts)) { + $issue_type_counts[$issue_data->type]++; + } else { + $issue_type_counts[$issue_data->type] = 1; + } + } + uksort($issue_type_counts, function (string $a, string $b) use ($issue_type_counts): int { + $cmp_result = $issue_type_counts[$a] <=> $issue_type_counts[$b]; + if ($cmp_result === 0) { + return $a <=> $b; + } else { + return $cmp_result; + } + }); + + $output = ''; + foreach ($issue_type_counts as $issue_type => $count) { + $output .= "{$issue_type}: {$count}\n"; + } + return $output; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/EmacsReport.php b/vendor/vimeo/psalm/src/Psalm/Report/EmacsReport.php new file mode 100644 index 00000000..785b502c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/EmacsReport.php @@ -0,0 +1,28 @@ +issues_data as $issue_data) { + $output .= sprintf( + '%s:%s:%s:%s - %s', + $issue_data->file_path, + $issue_data->line_from, + $issue_data->column_from, + ($issue_data->severity === Config::REPORT_ERROR ? 'error' : 'warning'), + $issue_data->message + ) . "\n"; + } + + return $output; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php b/vendor/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php new file mode 100644 index 00000000..9625de5e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php @@ -0,0 +1,72 @@ +issues_data as $issue_data) { + $issue_reference = $issue_data->link ? ' (see ' . $issue_data->link . ')' : ''; + $properties = sprintf( + 'file=%1$s,line=%2$d,col=%3$d,title=%4$s', + $this->escapeProperty($issue_data->file_name), + $this->escapeProperty($issue_data->line_from), + $this->escapeProperty($issue_data->column_from), + $this->escapeProperty($issue_data->type) + ); + + $data = $this->escapeData(sprintf( + '%1$s:%2$d:%3$d: %4$s: %5$s', + $issue_data->file_name, + $issue_data->line_from, + $issue_data->column_from, + $issue_data->type, + $issue_data->message . $issue_reference + )); + + $output .= sprintf( + '::%1$s %2$s::%3$s', + ($issue_data->severity === Config::REPORT_ERROR ? 'error' : 'warning'), + $properties, + $data + ) . "\n"; + } + + return $output; + } + + private function escapeData(string $data): string + { + return strtr( + $data, + [ + '%' => '%25', + "\r" => '%0D', + "\n" => '%0A', + ] + ); + } + + /** @param mixed $value */ + private function escapeProperty($value): string + { + return strtr( + (string) $value, + [ + '%' => '%25', + "\r" => '%0D', + "\n" => '%0A', + ':' => '%3A', + ',' => '%2C', + ] + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/JsonReport.php b/vendor/vimeo/psalm/src/Psalm/Report/JsonReport.php new file mode 100644 index 00000000..442e4644 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/JsonReport.php @@ -0,0 +1,28 @@ +pretty ? Json::PRETTY : Json::DEFAULT; + + $issues_data = array_map( + function ($issue_data): array { + $issue_data = (array) $issue_data; + unset($issue_data['dupe_key']); + return $issue_data; + }, + $this->issues_data + ); + + return Json::encode(array_values($issues_data), $options) . "\n"; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php b/vendor/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php new file mode 100644 index 00000000..fc36ccd8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php @@ -0,0 +1,32 @@ +issues_data as $issue_data) { + $type = $issue_data->type; + + if (!isset($type_counts[$type])) { + $type_counts[$type] = 0; + } + + ++$type_counts[$type]; + } + + $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; + + return Json::encode([ + 'issue_counts' => $type_counts, + 'mixed_expression_count' => $this->mixed_expression_count, + 'total_expression_count' => $this->total_expression_count, + ], $options) . "\n"; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/JunitReport.php b/vendor/vimeo/psalm/src/Psalm/Report/JunitReport.php new file mode 100644 index 00000000..6b849dcd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/JunitReport.php @@ -0,0 +1,175 @@ +issues_data as $error) { + $is_error = $error->severity === Config::REPORT_ERROR; + $is_warning = $error->severity === Config::REPORT_INFO; + + if (!$is_error && !$is_warning) { + continue; + } + + if ($is_error) { + $errors++; + } + + $tests++; + + $fname = $error->file_name; + + if (!isset($ndata[$fname])) { + $ndata[$fname] = [ + 'errors' => $is_error ? 1 : 0, + 'warnings' => $is_warning ? 1 : 0, + 'failures' => [], + ]; + } else { + if ($is_error) { + $ndata[$fname]['errors']++; + } else { + $ndata[$fname]['warnings']++; + } + } + + $ndata[$fname]['failures'][] = $error; + } + + $dom = new DOMDocument('1.0', 'UTF-8'); + $dom->formatOutput = true; + + $schema = 'https://raw.githubusercontent.com/junit-team/'. + 'junit5/r5.5.1/platform-tests/src/test/resources/jenkins-junit.xsd'; + + $suites = $dom->createElement('testsuites'); + + $suites->setAttribute('failures', (string) $errors); + $suites->setAttribute('errors', '0'); + $suites->setAttribute('name', 'psalm'); + $suites->setAttribute('tests', (string) $tests); + $suites->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); + $suites->setAttribute('xsi:noNamespaceSchemaLocation', $schema); + $dom->appendChild($suites); + + if (!count($ndata)) { + $suites->setAttribute('tests', '1'); + + $testsuite = $dom->createElement('testsuite'); + $testsuite->setAttribute('name', 'psalm'); + $testsuite->setAttribute('failures', '0'); + $testsuite->setAttribute('errors', '0'); + $testsuite->setAttribute('tests', '1'); + + $testcase = $dom->createElement('testcase'); + $testcase->setAttribute('name', 'psalm'); + $testsuite->appendChild($testcase); + + $suites->appendChild($testsuite); + } else { + foreach ($ndata as $file => $report) { + $this->createTestSuite($dom, $suites, $file, $report); + } + } + + + + return $dom->saveXML(); + } + + /** + * @param array{ + * errors: int, + * warnings: int, + * failures: list + * } $report + */ + private function createTestSuite(DOMDocument $dom, DOMElement $parent, string $file, array $report): void + { + $totalTests = $report['errors'] + $report['warnings']; + if ($totalTests < 1) { + $totalTests = 1; + } + + $testsuite = $dom->createElement('testsuite'); + $testsuite->setAttribute('name', $file); + $testsuite->setAttribute('failures', (string) $report['errors']); + $testsuite->setAttribute('errors', '0'); + $testsuite->setAttribute('tests', (string) $totalTests); + + $failuresByType = $this->groupByType($report['failures']); + + foreach ($failuresByType as $type => $data) { + foreach ($data as $d) { + $testcase = $dom->createElement('testcase'); + $testcase->setAttribute('name', "{$file}:{$d->line_from}"); + $testcase->setAttribute('classname', $type); + $testcase->setAttribute('assertions', (string) count($data)); + + if ($d->severity === Config::REPORT_ERROR) { + $issue = $dom->createElement('failure'); + $issue->setAttribute('type', $type); + } else { + $issue = $dom->createElement('skipped'); + } + $issue->nodeValue = $this->dataToOutput($d); + + $testcase->appendChild($issue); + $testsuite->appendChild($testcase); + } + } + $parent->appendChild($testsuite); + } + + /** + * @param list $failures + * + * @return array> + */ + private function groupByType(array $failures): array + { + $nfailures = []; + + foreach ($failures as $failure) { + $nfailures[$failure->type][] = $failure; + } + + return $nfailures; + } + + private function dataToOutput(IssueData $data): string + { + $ret = 'message: ' . $this->xmlEncode(trim($data->message)) . "\n"; + $ret .= 'type: ' . trim($data->type) . "\n"; + $ret .= 'snippet: ' . $this->xmlEncode(trim($data->snippet)) . "\n"; + $ret .= 'selected_text: ' . $this->xmlEncode(trim($data->selected_text)) . "\n"; + $ret .= 'line: ' . $data->line_from . "\n"; + $ret .= 'column_from: ' . $data->column_from . "\n"; + $ret .= 'column_to: ' . $data->column_to . "\n"; + + return $ret; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/PhpStormReport.php b/vendor/vimeo/psalm/src/Psalm/Report/PhpStormReport.php new file mode 100644 index 00000000..8bb1f68c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/PhpStormReport.php @@ -0,0 +1,99 @@ +issues_data as $issue_data) { + $output .= $this->format($issue_data) . "\n" . "\n"; + } + + return $output; + } + + private function format(IssueData $issue_data): string + { + $issue_string = ''; + + $is_error = $issue_data->severity === Config::REPORT_ERROR; + + if ($is_error) { + $issue_string .= ($this->use_color ? "\e[0;31mERROR\e[0m" : 'ERROR'); + } else { + $issue_string .= 'INFO'; + } + + $issue_reference = $issue_data->link ? ' (see ' . $issue_data->link . ')' : ''; + + $issue_string .= ': ' . $issue_data->type + . "\nat " . $issue_data->file_path . ':' . $issue_data->line_from . ':' . $issue_data->column_from + . "\n" . $issue_data->message . $issue_reference . "\n"; + + + if ($issue_data->taint_trace) { + $issue_string .= $this->getTaintSnippets($issue_data->taint_trace); + } elseif ($this->show_snippet) { + $snippet = $issue_data->snippet; + + if (!$this->use_color) { + $issue_string .= $snippet; + } else { + $selection_start = $issue_data->from - $issue_data->snippet_from; + $selection_length = $issue_data->to - $issue_data->from; + + $issue_string .= substr($snippet, 0, $selection_start) + . ($is_error ? "\e[97;41m" : "\e[30;47m") . substr($snippet, $selection_start, $selection_length) + . "\e[0m" . substr($snippet, $selection_length + $selection_start) . "\n"; + } + } + + return $issue_string; + } + + /** + * @param non-empty-list $taint_trace + */ + private function getTaintSnippets(array $taint_trace): string + { + $snippets = ''; + + foreach ($taint_trace as $node_data) { + if ($node_data instanceof DataFlowNodeData) { + $snippets .= ' ' . $node_data->label + . ' - ' . $node_data->file_name + . ':' . $node_data->line_from + . ':' . $node_data->column_from . "\n"; + + if ($this->show_snippet) { + $snippet = $node_data->snippet; + + if (!$this->use_color) { + $snippets .= $snippet . "\n\n"; + } else { + $selection_start = $node_data->from - $node_data->snippet_from; + $selection_length = $node_data->to - $node_data->from; + + $snippets .= substr($snippet, 0, $selection_start) + . "\e[30;47m" . substr($snippet, $selection_start, $selection_length) + . "\e[0m" . substr($snippet, $selection_length + $selection_start) . "\n\n"; + } + } + } else { + $snippets .= ' ' . $node_data['label'] . "\n"; + $snippets .= ' ' . "\n\n"; + } + } + + return $snippets; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/PylintReport.php b/vendor/vimeo/psalm/src/Psalm/Report/PylintReport.php new file mode 100644 index 00000000..fd348f08 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/PylintReport.php @@ -0,0 +1,49 @@ +issues_data as $issue_data) { + $output .= $this->format($issue_data) . "\n"; + } + + return $output; + } + + private function format(IssueData $issue_data): string + { + $message = sprintf( + '%s: %s', + $issue_data->type, + $issue_data->message + ); + + if ($issue_data->severity === Config::REPORT_ERROR) { + $code = 'E0001'; + } else { + $code = 'W0001'; + } + + // https://docs.pylint.org/en/1.6.0/output.html doesn't mention what to do about 'column', + // but it's still useful for users. + // E.g. jenkins can't parse %s:%d:%d. + $message = sprintf('%s (column %d)', $message, $issue_data->column_from); + return sprintf( + '%s:%d: [%s] %s', + $issue_data->file_name, + $issue_data->line_from, + $code, + $message + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/ReportOptions.php b/vendor/vimeo/psalm/src/Psalm/Report/ReportOptions.php new file mode 100644 index 00000000..3f914353 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/ReportOptions.php @@ -0,0 +1,46 @@ + '2.1.0', + '$schema' => 'https://json.schemastore.org/sarif-2.1.0.json', + 'runs' => [ + [ + 'tool' => [ + 'driver' => [ + 'name' => 'Psalm', + 'informationUri' => 'https://psalm.dev', + 'version' => PSALM_VERSION, + ], + ], + 'results' => [], + ], + ], + ]; + + $rules = []; + + foreach ($this->issues_data as $issue_data) { + $rules[$issue_data->shortcode] = [ + 'id' => (string)$issue_data->shortcode, + 'name' => $issue_data->type, + 'shortDescription' => [ + 'text' => $issue_data->type, + ], + 'properties' => [ + 'tags' => [ + (strpos($issue_data->type, 'Tainted') === 0) ? 'security' : 'maintainability', + ], + ], + 'helpUri' => $issue_data->link, + ]; + + $markdown_documentation_path = __DIR__ . '/../../../docs/running_psalm/issues/' . $issue_data->type . '.md'; + if (file_exists($markdown_documentation_path)) { + $markdown_documentation = file_get_contents($markdown_documentation_path); + $rules[$issue_data->shortcode]['help']['markdown'] = $markdown_documentation; + $rules[$issue_data->shortcode]['help']['text'] = $markdown_documentation; + } + + $jsonEntry = [ + 'ruleId' => (string)$issue_data->shortcode, + 'message' => [ + 'text' => $issue_data->message, + ], + 'level' => ($issue_data->severity === Config::REPORT_ERROR) ? 'error' : 'note', + 'locations' => [ + [ + 'physicalLocation' => [ + 'artifactLocation' => [ + 'uri' => $issue_data->file_name, + ], + 'region' => [ + 'startLine' => $issue_data->line_from, + 'endLine' => $issue_data->line_to, + 'startColumn' => $issue_data->column_from, + 'endColumn' => $issue_data->column_to, + ], + ], + ] + ], + ]; + + if ($issue_data->taint_trace != null) { + $jsonEntry['codeFlows'] = [ + [ + 'message' => [ + 'text' => 'Tracing the path from user input to insecure usage', + ], + 'threadFlows' => [ + [ + 'locations' => [], + ], + ], + ] + ]; + + foreach ($issue_data->taint_trace as $trace) { + if ($trace instanceof DataFlowNodeData + && $trace->line_from > 0 + ) { + $jsonEntry['codeFlows'][0]['threadFlows'][0]['locations'][] = [ + 'location' => [ + 'physicalLocation' => [ + 'artifactLocation' => [ + 'uri' => $trace->file_name, + ], + 'region' => [ + 'startLine' => $trace->line_from, + 'endLine' => $trace->line_to, + 'startColumn' => $trace->column_from, + 'endColumn' => $trace->column_to, + ], + ], + ], + ]; + } + } + } + + $report['runs'][0]['results'][] = $jsonEntry; + } + + foreach ($rules as $rule) { + $report['runs'][0]['tool']['driver']['rules'][] = $rule; + } + + $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; + + return Json::encode($report, $options) . "\n"; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php b/vendor/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php new file mode 100644 index 00000000..ea6a6d08 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php @@ -0,0 +1,47 @@ + []]; + + foreach ($this->issues_data as $issue_data) { + $report['issues'][] = [ + 'engineId' => 'Psalm', + 'ruleId' => $issue_data->type, + 'primaryLocation' => [ + 'message' => $issue_data->message, + 'filePath' => $issue_data->file_name, + 'textRange' => [ + 'startLine' => $issue_data->line_from, + 'endLine' => $issue_data->line_to, + // Columns in external issue reports are indexed from 0 + 'startColumn' => max(0, $issue_data->column_from - 1), + 'endColumn' => max(0, $issue_data->column_to - 1), + ], + ], + 'type' => 'CODE_SMELL', + 'severity' => $issue_data->severity === Config::REPORT_ERROR ? 'CRITICAL' : 'MINOR', + ]; + } + + $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; + + return Json::encode($report, $options) . "\n"; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/TextReport.php b/vendor/vimeo/psalm/src/Psalm/Report/TextReport.php new file mode 100644 index 00000000..1365cebc --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/TextReport.php @@ -0,0 +1,29 @@ +issues_data as $issue_data) { + $output .= sprintf( + '%s:%s:%s:%s - %s: %s', + $issue_data->file_path, + $issue_data->line_from, + $issue_data->column_from, + ($issue_data->severity === Config::REPORT_ERROR ? 'error' : 'warning'), + $issue_data->type, + $issue_data->message + ) . "\n"; + } + + return $output; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/XmlReport.php b/vendor/vimeo/psalm/src/Psalm/Report/XmlReport.php new file mode 100644 index 00000000..eea9c056 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Report/XmlReport.php @@ -0,0 +1,52 @@ + array_map( + function (IssueData $issue_data): array { + $issue_data = get_object_vars($issue_data); + unset($issue_data['dupe_key']); + + if (null !== $issue_data['taint_trace']) { + $issue_data['taint_trace'] = array_map( + function ($trace): array { + return (array) $trace; + }, + $issue_data['taint_trace'] + ); + } + + if (null !== $issue_data['other_references']) { + $issue_data['other_references'] = array_map( + function (DataFlowNodeData $reference): array { + return (array) $reference; + }, + $issue_data['other_references'] + ); + } + + return $issue_data; + }, + $this->issues_data + ) + ] + ); + + return $xml->saveXML(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php b/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php new file mode 100644 index 00000000..9238c1f0 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php @@ -0,0 +1,209 @@ + + */ +class CommitInfo +{ + /** + * Commit ID. + * + * @var null|string + */ + protected $id; + + /** + * Author name. + * + * @var null|string + */ + protected $author_name; + + /** + * Author email. + * + * @var null|string + */ + protected $author_email; + + /** + * Committer name. + * + * @var null|string + */ + protected $committer_name; + + /** + * Committer email. + * + * @var null|string + */ + protected $committer_email; + + /** + * Commit message. + * + * @var null|string + */ + protected $message; + + /** + * Commit message. + * + * @var null|int + */ + protected $date; + + public function toArray(): array + { + return [ + 'id' => $this->id, + 'author_name' => $this->author_name, + 'author_email' => $this->author_email, + 'committer_name' => $this->committer_name, + 'committer_email' => $this->committer_email, + 'message' => $this->message, + 'date' => $this->date, + ]; + } + + // accessor + + /** + * Set commit ID. + */ + public function setId(string $id): self + { + $this->id = $id; + + return $this; + } + + /** + * Return commit ID. + * + */ + public function getId(): ?string + { + return $this->id; + } + + /** + * Set author name. + */ + public function setAuthorName(string $author_name): self + { + $this->author_name = $author_name; + + return $this; + } + + /** + * Return author name. + * + */ + public function getAuthorName(): ?string + { + return $this->author_name; + } + + /** + * Set author email. + * + */ + public function setAuthorEmail(string $author_email): self + { + $this->author_email = $author_email; + + return $this; + } + + /** + * Return author email. + * + */ + public function getAuthorEmail(): ?string + { + return $this->author_email; + } + + /** + * Set committer name. + */ + public function setCommitterName(string $committer_name): self + { + $this->committer_name = $committer_name; + + return $this; + } + + /** + * Return committer name. + * + */ + public function getCommitterName(): ?string + { + return $this->committer_name; + } + + /** + * Set committer email. + */ + public function setCommitterEmail(string $committer_email): self + { + $this->committer_email = $committer_email; + + return $this; + } + + /** + * Return committer email. + * + */ + public function getCommitterEmail(): ?string + { + return $this->committer_email; + } + + /** + * Set commit message. + */ + public function setMessage(string $message): self + { + $this->message = $message; + + return $this; + } + + /** + * Return commit message. + * + */ + public function getMessage(): ?string + { + return $this->message; + } + + /** + * Set commit date + */ + public function setDate(int $date): self + { + $this->date = $date; + + return $this; + } + + /** + * Return commit date. + * + */ + public function getDate(): ?int + { + return $this->date; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php b/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php new file mode 100644 index 00000000..7f891616 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php @@ -0,0 +1,111 @@ + + */ +class GitInfo extends SourceControlInfo +{ + /** + * Branch name. + * + * @var string + */ + protected $branch; + + /** + * Head. + * + * @var CommitInfo + */ + protected $head; + + /** + * Remote. + * + * @var RemoteInfo[] + */ + protected $remotes; + + /** + * Constructor. + * + * @param string $branch branch name + * @param CommitInfo $head hEAD commit + * @param RemoteInfo[] $remotes remote repositories + */ + public function __construct(string $branch, CommitInfo $head, array $remotes) + { + $this->branch = $branch; + $this->head = $head; + $this->remotes = $remotes; + } + + public function toArray(): array + { + $remotes = []; + + foreach ($this->remotes as $remote) { + $remotes[] = $remote->toArray(); + } + + return [ + 'branch' => $this->branch, + 'head' => $this->head->toArray(), + 'remotes' => $remotes, + ]; + } + + // accessor + + /** + * Return branch name. + * + */ + public function getBranch(): string + { + return $this->branch; + } + + /** + * Return HEAD commit. + * + */ + public function getHead(): CommitInfo + { + return $this->head; + } + + /** + * Return remote repositories. + * + * @return RemoteInfo[] + */ + public function getRemotes(): array + { + return $this->remotes; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php b/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php new file mode 100644 index 00000000..dd609c86 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php @@ -0,0 +1,81 @@ + + */ +class RemoteInfo +{ + /** + * Remote name. + * + * @var null|string + */ + protected $name; + + /** + * Remote URL. + * + * @var null|string + */ + protected $url; + + public function toArray(): array + { + return [ + 'name' => $this->name, + 'url' => $this->url, + ]; + } + + // accessor + + /** + * Set remote name. + * + * @param string $name remote name + * + * @return $this + */ + public function setName(string $name): RemoteInfo + { + $this->name = $name; + + return $this; + } + + /** + * Return remote name. + * + */ + public function getName(): ?string + { + return $this->name; + } + + /** + * Set remote URL. + * + * @param string $url remote URL + * + * @return $this + */ + public function setUrl(string $url): RemoteInfo + { + $this->url = $url; + + return $this; + } + + /** + * Return remote URL. + * + */ + public function getUrl(): ?string + { + return $this->url; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php b/vendor/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php new file mode 100644 index 00000000..5cf50c80 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php @@ -0,0 +1,8 @@ + + */ + public function getAliasedClassesFlipped(): array; + + /** + * @return array + */ + public function getAliasedClassesFlippedReplaceable(): array; + + public function getFQCLN(): ?string; + + public function getClassName(): ?string; + + public function getParentFQCLN(): ?string; + + /** + * @return array>|null + */ + public function getTemplateTypeMap(): ?array; + + public function setRootFilePath(string $file_path, string $file_name): void; + + public function hasParentFilePath(string $file_path): bool; + + public function hasAlreadyRequiredFilePath(string $file_path): bool; + + public function getRequireNesting(): int; + + public function isStatic(): bool; + + public function getSource(): StatementsSource; + + public function getCodebase(): Codebase; + + /** + * Get a list of suppressed issues + * + * @return array + */ + public function getSuppressedIssues(): array; + + /** + * @param list $new_issues + */ + public function addSuppressedIssues(array $new_issues): void; + + /** + * @param list $new_issues + */ + public function removeSuppressedIssues(array $new_issues): void; + + public function getNodeTypeProvider(): NodeTypeProvider; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/Assertion.php b/vendor/vimeo/psalm/src/Psalm/Storage/Assertion.php new file mode 100644 index 00000000..53f13b12 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/Assertion.php @@ -0,0 +1,105 @@ +> the rule being asserted + */ + public $rule; + + /** + * @var int|string the id of the property/variable, or + * the parameter offset of the affected arg + */ + public $var_id; + + /** + * @param string|int $var_id + * @param array> $rule + */ + public function __construct($var_id, array $rule) + { + $this->rule = $rule; + $this->var_id = $var_id; + } + + /** + * @param array>> $inferred_lower_bounds + */ + public function getUntemplatedCopy( + array $inferred_lower_bounds, + ?string $this_var_id, + ?Codebase $codebase + ): self { + return new Assertion( + is_string($this->var_id) && $this_var_id + ? str_replace('$this->', $this_var_id . '->', $this->var_id) + : $this->var_id, + array_map( + /** + * @param array $rules + * + * @return array{0: string} + */ + function (array $rules) use ($inferred_lower_bounds, $codebase): array { + $first_rule = $rules[0]; + + if ($inferred_lower_bounds) { + $rule_tokens = TypeTokenizer::tokenize($first_rule); + + $substitute = false; + + foreach ($rule_tokens as &$rule_token) { + if (isset($inferred_lower_bounds[$rule_token[0]])) { + foreach ($inferred_lower_bounds[$rule_token[0]] as $lower_bounds) { + $substitute = true; + + $bound_type = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $lower_bounds, + $codebase + ); + + $first_type = $bound_type->getSingleAtomic(); + + if ($first_type instanceof TTemplateParam) { + $rule_token[0] = $first_type->param_name; + } else { + $rule_token[0] = $first_type->getId(); + } + } + } + } + + if ($substitute) { + return [implode( + '', + array_map( + function ($f) { + return $f[0]; + }, + $rule_tokens + ) + )]; + } + } + + return [$first_rule]; + }, + $this->rule + ) + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/AttributeArg.php b/vendor/vimeo/psalm/src/Psalm/Storage/AttributeArg.php new file mode 100644 index 00000000..c51fa723 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/AttributeArg.php @@ -0,0 +1,40 @@ +name = $name; + $this->type = $type; + $this->location = $location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php new file mode 100644 index 00000000..7717966c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php @@ -0,0 +1,47 @@ + + */ + public $args; + + /** + * @var CodeLocation + * + * @psalm-suppress PossiblyUnusedProperty part of public API + */ + public $location; + + /** + * @var CodeLocation + * + * @psalm-suppress PossiblyUnusedProperty part of public API + */ + public $name_location; + + /** + * @param list $args + */ + public function __construct( + string $fq_class_name, + array $args, + CodeLocation $location, + CodeLocation $name_location + ) { + $this->fq_class_name = $fq_class_name; + $this->args = $args; + $this->location = $location; + $this->name_location = $name_location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php new file mode 100644 index 00000000..bcbe39dc --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php @@ -0,0 +1,62 @@ + + * @psalm-suppress PossiblyUnusedProperty + */ + public $attributes = []; + + /** + * @var ?string + */ + public $description; + + /** + * @param ClassLikeAnalyzer::VISIBILITY_* $visibility + */ + public function __construct(?Union $type, int $visibility, ?CodeLocation $location) + { + $this->visibility = $visibility; + $this->location = $location; + $this->type = $type; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php new file mode 100644 index 00000000..a5252d8a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php @@ -0,0 +1,491 @@ + + */ + public $constants = []; + + /** + * Aliases to help Psalm understand constant refs + * + * @var ?Aliases + */ + public $aliases; + + /** + * @var bool + */ + public $populated = false; + + /** + * @var bool + */ + public $stubbed = false; + + /** + * @var bool + */ + public $deprecated = false; + + /** + * @var list + */ + public $internal = []; + + /** + * @var TTemplateParam[] + */ + public $templatedMixins = []; + + /** + * @var list + */ + public $namedMixins = []; + + /** + * @var ?string + */ + public $mixin_declaring_fqcln; + + /** + * @var bool + */ + public $sealed_properties = false; + + /** + * @var bool + */ + public $sealed_methods = false; + + /** + * @var bool + */ + public $override_property_visibility = false; + + /** + * @var bool + */ + public $override_method_visibility = false; + + /** + * @var array + */ + public $suppressed_issues = []; + + /** + * @var string + */ + public $name; + + /** + * Is this class user-defined + * + * @var bool + */ + public $user_defined = false; + + /** + * Interfaces this class implements directly + * + * @var array + */ + public $direct_class_interfaces = []; + + /** + * Interfaces this class implements explicitly and implicitly + * + * @var array + */ + public $class_implements = []; + + /** + * Parent interfaces listed explicitly + * + * @var array + */ + public $direct_interface_parents = []; + + /** + * Parent interfaces + * + * @var array + */ + public $parent_interfaces = []; + + /** + * There can only be one direct parent class + * + * @var ?string + */ + public $parent_class; + + /** + * Parent classes + * + * @var array + */ + public $parent_classes = []; + + /** + * @var CodeLocation|null + */ + public $location; + + /** + * @var CodeLocation|null + */ + public $stmt_location; + + /** + * @var CodeLocation|null + */ + public $namespace_name_location; + + /** + * @var bool + */ + public $abstract = false; + + /** + * @var bool + */ + public $final = false; + + /** + * @var bool + */ + public $final_from_docblock = false; + + /** + * @var array + */ + public $used_traits = []; + + /** + * @var array + */ + public $trait_alias_map = []; + + /** + * @var array + */ + public $trait_final_map = []; + + /** + * @var array + */ + public $trait_visibility_map = []; + + /** + * @var bool + */ + public $is_trait = false; + + /** + * @var bool + */ + public $is_interface = false; + + /** + * @var bool + */ + public $is_enum = false; + + /** + * @var bool + */ + public $external_mutation_free = false; + + /** + * @var bool + */ + public $mutation_free = false; + + /** + * @var bool + */ + public $specialize_instance = false; + + /** + * @var array + */ + public $methods = []; + + /** + * @var array + */ + public $pseudo_methods = []; + + /** + * @var array + */ + public $pseudo_static_methods = []; + + /** + * Maps pseudo method names to the original declaring method identifier + * The key is the method name in lowercase, and the value is the original `MethodIdentifier` instance + * + * This property contains all pseudo methods declared on ancestors. + * + * @var array + */ + public $declaring_pseudo_method_ids = []; + + /** + * @var array + */ + public $declaring_method_ids = []; + + /** + * @var array + */ + public $appearing_method_ids = []; + + /** + * Map from lowercase method name to list of declarations in order from parent, to grandparent, to + * great-grandparent, etc **including traits and interfaces**. Ancestors that don't have their own declaration are + * skipped. + * + * @var array> + */ + public $overridden_method_ids = []; + + /** + * @var array + */ + public $documenting_method_ids = []; + + /** + * @var array + */ + public $inheritable_method_ids = []; + + /** + * @var array> + */ + public $potential_declaring_method_ids = []; + + /** + * @var array + */ + public $properties = []; + + /** + * @var array + */ + public $pseudo_property_set_types = []; + + /** + * @var array + */ + public $pseudo_property_get_types = []; + + /** + * @var array + */ + public $declaring_property_ids = []; + + /** + * @var array + */ + public $appearing_property_ids = []; + + /** + * @var array + */ + public $inheritable_property_ids = []; + + /** + * @var array> + */ + public $overridden_property_ids = []; + + /** + * An array holding the class template "as" types. + * + * It's the de-facto list of all templates on a given class. + * + * The name of the template is the first key. The nested array is keyed by the defining class + * (i.e. the same as the class name). This allows operations with the same-named template defined + * across multiple classes to not run into trouble. + * + * @var array>|null + */ + public $template_types; + + /** + * @var array|null + */ + public $template_covariants; + + /** + * A map of which generic classlikes are extended or implemented by this class or interface. + * + * This is only used in the populator, which poulates the $template_extended_params property below. + * + * @internal + * + * @var array>|null + */ + public $template_extended_offsets; + + /** + * A map of which generic classlikes are extended or implemented by this class or interface. + * + * The annotation "@extends Traversable" would generate an entry of + * + * [ + * "Traversable" => [ + * "TKey" => new Union([new TNamedObject("SomeClass")]), + * "TValue" => new Union([new TNamedObject("SomeOtherClass")]) + * ] + * ] + * + * @var array>|null + */ + public $template_extended_params; + + /** + * @deprecated Will be replaced with $template_type_extends_count in Psalm v5 + * @var ?int + */ + public $template_extended_count; + + /** + * @var array|null + */ + public $template_type_implements_count; + + /** + * @var ?Union + */ + public $yield; + + /** + * @var array|null + */ + public $template_type_uses_count; + + /** + * @var array + */ + public $initialized_properties = []; + + /** + * @var array + */ + public $invalid_dependencies = []; + + /** + * @var array + */ + public $dependent_classlikes = []; + + /** + * A hash of the source file's name, contents, and this file's modified on date + * + * @var string + */ + public $hash = ''; + + /** + * @var bool + */ + public $has_visitor_issues = false; + + /** + * @var list + */ + public $docblock_issues = []; + + /** + * @var array + */ + public $type_aliases = []; + + /** + * @var bool + */ + public $preserve_constructor_signature = false; + + /** + * @var bool + */ + public $enforce_template_inheritance = false; + + /** + * @var null|string + */ + public $extension_requirement; + + /** + * @var array + */ + public $implementation_requirements = []; + + /** + * @var list + */ + public $attributes = []; + + /** + * @var array + */ + public $enum_cases = []; + + /** + * @var 'int'|'string'|null + */ + public $enum_type; + + /** + * @var ?string + */ + public $description; + + public function __construct(string $name) + { + $this->name = $name; + } + + /** + * @return list + */ + public function getAttributeStorages(): array + { + return $this->attributes; + } + + /** + * Get the template constraint types for the class. + * + * @return list + */ + public function getClassTemplateTypes(): array + { + $type_params = []; + + foreach ($this->template_types ?? [] as $type_map) { + $type_params[] = clone array_values($type_map)[0]; + } + + return $type_params; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php b/vendor/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php new file mode 100644 index 00000000..85a8610a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php @@ -0,0 +1,12 @@ + */ + public $custom_metadata = []; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php new file mode 100644 index 00000000..c61fcea3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php @@ -0,0 +1,32 @@ +value = $value; + $this->stmt_location = $location; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/FileStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/FileStorage.php new file mode 100644 index 00000000..df09117d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/FileStorage.php @@ -0,0 +1,103 @@ + + */ + public $classlikes_in_file = []; + + /** + * @var array + */ + public $referenced_classlikes = []; + + /** + * @var array + */ + public $required_classes = []; + + /** + * @var array + */ + public $required_interfaces = []; + + /** @var string */ + public $file_path; + + /** + * @var array + */ + public $functions = []; + + /** @var array */ + public $declaring_function_ids = []; + + /** + * @var array + */ + public $constants = []; + + /** @var array */ + public $declaring_constants = []; + + /** @var array */ + public $required_file_paths = []; + + /** @var array */ + public $required_by_file_paths = []; + + /** @var bool */ + public $populated = false; + + /** @var bool */ + public $deep_scan = false; + + /** @var bool */ + public $has_extra_statements = false; + + /** + * @var string + */ + public $hash = ''; + + /** + * @var bool + */ + public $has_visitor_issues = false; + + /** + * @var list + */ + public $docblock_issues = []; + + /** + * @var array + */ + public $type_aliases = []; + + /** + * @var array + */ + public $classlike_aliases = []; + + /** @var ?Aliases */ + public $aliases; + + /** @var Aliases[] */ + public $namespace_aliases = []; + + public function __construct(string $file_path) + { + $this->file_path = $file_path; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php new file mode 100644 index 00000000..70147e8c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php @@ -0,0 +1,161 @@ +|null + */ + public $sinks; + + /** + * @var bool + */ + public $assert_untainted = false; + + /** + * @var bool + */ + public $type_inferred = false; + + /** + * @var bool + */ + public $expect_variable = false; + + /** + * @var bool + */ + public $promoted_property = false; + + /** + * @var list + */ + public $attributes = []; + + /** + * @var ?string + */ + public $description; + + /** + * @param Union|UnresolvedConstantComponent|null $default_type + */ + public function __construct( + string $name, + bool $by_ref, + ?Union $type = null, + ?CodeLocation $location = null, + ?CodeLocation $type_location = null, + bool $is_optional = true, + bool $is_nullable = false, + bool $is_variadic = false, + $default_type = null + ) { + $this->name = $name; + $this->by_ref = $by_ref; + $this->type = $type; + $this->signature_type = $type; + $this->is_optional = $is_optional; + $this->is_nullable = $is_nullable; + $this->is_variadic = $is_variadic; + $this->location = $location; + $this->type_location = $type_location; + $this->signature_type_location = $type_location; + $this->default_type = $default_type; + } + + public function getId(): string + { + return ($this->type ? $this->type->getId() : 'mixed') + . ($this->is_variadic ? '...' : '') + . ($this->is_optional ? '=' : ''); + } + + public function __clone() + { + if ($this->type) { + $this->type = clone $this->type; + } + } + + /** + * @return list + */ + public function getAttributeStorages(): array + { + return $this->attributes; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php new file mode 100644 index 00000000..fe23ea05 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php @@ -0,0 +1,304 @@ + + */ + public $params = []; + + /** + * @psalm-readonly-allow-private-mutation + * @var array + */ + public $param_lookup = []; + + /** + * @var Union|null + */ + public $return_type; + + /** + * @var CodeLocation|null + */ + public $return_type_location; + + /** + * @var Union|null + */ + public $signature_return_type; + + /** + * @var CodeLocation|null + */ + public $signature_return_type_location; + + /** + * @var ?string + */ + public $cased_name; + + /** + * @var array + */ + public $suppressed_issues = []; + + /** + * @var ?bool + */ + public $deprecated; + + /** + * @var list + */ + public $internal = []; + + /** + * @var bool + */ + public $variadic = false; + + /** + * @var bool + */ + public $returns_by_ref = false; + + /** + * @var ?int + */ + public $required_param_count; + + /** + * @var array + */ + public $defined_constants = []; + + /** + * @var array + */ + public $global_variables = []; + + /** + * @var array + */ + public $global_types = []; + + /** + * An array holding the class template "as" types. + * + * It's the de-facto list of all templates on a given class. + * + * The name of the template is the first key. The nested array is keyed by a unique + * function identifier. This allows operations with the same-named template defined + * across multiple classes and/or functions to not run into trouble. + * + * @var array>|null + */ + public $template_types; + + /** + * @var array + */ + public $assertions = []; + + /** + * @var array + */ + public $if_true_assertions = []; + + /** + * @var array + */ + public $if_false_assertions = []; + + /** + * @var bool + */ + public $has_visitor_issues = false; + + /** + * @var list + */ + public $docblock_issues = []; + + /** + * @var array + */ + public $throws = []; + + /** + * @var array + */ + public $throw_locations = []; + + /** + * @var bool + */ + public $has_yield = false; + + /** + * @var bool + */ + public $mutation_free = false; + + /** + * @var string|null + */ + public $return_type_description; + + /** + * @var array|null + */ + public $unused_docblock_params; + + /** + * @var bool + */ + public $pure = false; + + /** + * Whether or not the function output is dependent solely on input - a function can be + * impure but still have this property (e.g. var_export). Useful for taint analysis. + * + * @var bool + */ + public $specialize_call = false; + + /** + * @var array + */ + public $taint_source_types = []; + + /** + * @var array + */ + public $added_taints = []; + + /** + * @var array + */ + public $removed_taints = []; + + /** + * @var array + */ + public $conditionally_removed_taints = []; + + /** + * @var array + */ + public $return_source_params = []; + + /** + * @var bool + */ + public $allow_named_arg_calls = true; + + /** + * @var list + */ + public $attributes = []; + + /** + * @var list, return: bool}>|null + */ + public $proxy_calls = []; + + /** + * @var ?string + */ + public $description; + + public function __toString(): string + { + return $this->getSignature(false); + } + + public function getSignature(bool $allow_newlines): string + { + $newlines = $allow_newlines && !empty($this->params); + + $symbol_text = 'function ' . $this->cased_name . '(' . ($newlines ? "\n" : '') . implode( + ',' . ($newlines ? "\n" : ' '), + array_map( + function (FunctionLikeParameter $param) use ($newlines): string { + return ($newlines ? ' ' : '') . ($param->type ?: 'mixed') . ' $' . $param->name; + }, + $this->params + ) + ) . ($newlines ? "\n" : '') . ') : ' . ($this->return_type ?: 'mixed'); + + if (!$this instanceof MethodStorage) { + return $symbol_text; + } + + switch ($this->visibility) { + case ClassLikeAnalyzer::VISIBILITY_PRIVATE: + $visibility_text = 'private'; + break; + + case ClassLikeAnalyzer::VISIBILITY_PROTECTED: + $visibility_text = 'protected'; + break; + + default: + $visibility_text = 'public'; + } + + return $visibility_text . ' ' . $symbol_text; + } + + /** + * @internal + * + * @param list $params + */ + public function setParams(array $params): void + { + $this->params = $params; + $param_names = array_column($params, 'name'); + $this->param_lookup = array_fill_keys($param_names, true); + } + + /** + * @internal + */ + public function addParam(FunctionLikeParameter $param, bool $lookup_value = null): void + { + $this->params[] = $param; + $this->param_lookup[$param->name] = $lookup_value ?? true; + } + + /** + * @return list + */ + public function getAttributeStorages(): array + { + return $this->attributes; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php new file mode 100644 index 00000000..22be01b0 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php @@ -0,0 +1,9 @@ + */ + public $byref_uses = []; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php b/vendor/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php new file mode 100644 index 00000000..c8bca415 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php @@ -0,0 +1,17 @@ + + * + * @psalm-suppress PossiblyUnusedMethod part of public API + */ + public function getAttributeStorages(): array; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/MethodStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/MethodStorage.php new file mode 100644 index 00000000..f9ae6a27 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/MethodStorage.php @@ -0,0 +1,107 @@ + + */ + public $this_property_mutations; + + /** + * @var Union|null + */ + public $self_out_type; + + /** + * @var Union|null + */ + public $if_this_is_type = null; + /** + * @var bool + */ + public $stubbed = false; + + /** + * @var bool + */ + public $probably_fluent = false; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php new file mode 100644 index 00000000..b309a7f1 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php @@ -0,0 +1,135 @@ + + */ + public $internal = []; + + /** + * @var ?string + */ + public $getter_method; + + /** + * @var bool + */ + public $is_promoted = false; + + /** + * @var list + */ + public $attributes = []; + + /** + * @var array + */ + public $suppressed_issues = []; + + /** + * @var ?string + */ + public $description; + + public function getInfo(): string + { + switch ($this->visibility) { + case ClassLikeAnalyzer::VISIBILITY_PRIVATE: + $visibility_text = 'private'; + break; + + case ClassLikeAnalyzer::VISIBILITY_PROTECTED: + $visibility_text = 'protected'; + break; + + default: + $visibility_text = 'public'; + } + + return $visibility_text . ' ' . ($this->type ? $this->type->getId() : 'mixed'); + } + + /** + * @return list + */ + public function getAttributeStorages(): array + { + return $this->attributes; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type.php b/vendor/vimeo/psalm/src/Psalm/Type.php new file mode 100644 index 00000000..35ca8113 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type.php @@ -0,0 +1,761 @@ +> $template_type_map + */ + public static function parseString( + string $type_string, + ?array $php_version = null, + array $template_type_map = [] + ): Union { + return TypeParser::parseTokens( + TypeTokenizer::tokenize( + $type_string + ), + $php_version, + $template_type_map + ); + } + + public static function getFQCLNFromString( + string $class, + Aliases $aliases + ): string { + if ($class === '') { + throw new InvalidArgumentException('$class cannot be empty'); + } + + if ($class[0] === '\\') { + return substr($class, 1); + } + + $imported_namespaces = $aliases->uses; + + if (strpos($class, '\\') !== false) { + $class_parts = explode('\\', $class); + $first_namespace = array_shift($class_parts); + + if (isset($imported_namespaces[strtolower($first_namespace)])) { + return $imported_namespaces[strtolower($first_namespace)] . '\\' . implode('\\', $class_parts); + } + } elseif (isset($imported_namespaces[strtolower($class)])) { + return $imported_namespaces[strtolower($class)]; + } + + $namespace = $aliases->namespace; + + return ($namespace ? $namespace . '\\' : '') . $class; + } + + /** + * @param array $aliased_classes + * + * @psalm-pure + */ + public static function getStringFromFQCLN( + string $value, + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $allow_self = false, + bool $was_static = false + ): string { + if ($allow_self && $value === $this_class) { + if ($was_static) { + return 'static'; + } + return 'self'; + } + + if (isset($aliased_classes[strtolower($value)])) { + return $aliased_classes[strtolower($value)]; + } + + if ($namespace && stripos($value, $namespace . '\\') === 0) { + $candidate = preg_replace( + '/^' . preg_quote($namespace . '\\') . '/i', + '', + $value + ); + + $candidate_parts = explode('\\', $candidate); + + if (!isset($aliased_classes[strtolower($candidate_parts[0])])) { + return $candidate; + } + } elseif (!$namespace && strpos($value, '\\') === false) { + return $value; + } + + if (strpos($value, '\\')) { + $parts = explode('\\', $value); + + $suffix = array_pop($parts); + + while ($parts) { + $left = implode('\\', $parts); + + if (isset($aliased_classes[strtolower($left)])) { + return $aliased_classes[strtolower($left)] . '\\' . $suffix; + } + + $suffix = array_pop($parts) . '\\' . $suffix; + } + } + + return '\\' . $value; + } + + public static function getInt(bool $from_calculation = false, ?int $value = null): Union + { + if ($value !== null) { + $union = new Union([new TLiteralInt($value)]); + } else { + $union = new Union([new TInt()]); + } + + $union->from_calculation = $from_calculation; + + return $union; + } + + public static function getLowercaseString(): Union + { + $type = new TLowercaseString(); + + return new Union([$type]); + } + + /** @deprecated will be removed in Psalm 5 */ + public static function getPositiveInt(bool $from_calculation = false): Union + { + $union = new Union([new TPositiveInt()]); + $union->from_calculation = $from_calculation; + + return $union; + } + + public static function getNonEmptyLowercaseString(): Union + { + $type = new TNonEmptyLowercaseString(); + + return new Union([$type]); + } + + public static function getNonEmptyString(): Union + { + $type = new TNonEmptyString(); + + return new Union([$type]); + } + + public static function getNumeric(): Union + { + $type = new TNumeric; + + return new Union([$type]); + } + + public static function getNumericString(): Union + { + $type = new TNumericString; + + return new Union([$type]); + } + + public static function getString(?string $value = null): Union + { + $type = null; + + if ($value !== null) { + $config = Config::getInstance(); + + $event = new StringInterpreterEvent($value); + + $type = $config->eventDispatcher->dispatchStringInterpreter($event); + + if (!$type) { + if (strlen($value) < $config->max_string_length) { + $type = new TLiteralString($value); + } else { + $type = new TNonEmptyString(); + } + } + } + + if (!$type) { + $type = new TString(); + } + + return new Union([$type]); + } + + public static function getSingleLetter(): Union + { + $type = new TSingleLetter; + + return new Union([$type]); + } + + public static function getClassString(string $extends = 'object'): Union + { + return new Union([ + new TClassString( + $extends, + $extends === 'object' + ? null + : new TNamedObject($extends) + ), + ]); + } + + public static function getLiteralClassString(string $class_type, bool $definite_class = false): Union + { + $type = new TLiteralClassString($class_type, $definite_class); + + return new Union([$type]); + } + + public static function getNull(): Union + { + $type = new TNull; + + return new Union([$type]); + } + + public static function getMixed(bool $from_loop_isset = false): Union + { + $type = new TMixed($from_loop_isset); + + return new Union([$type]); + } + + public static function getScalar(): Union + { + $type = new TScalar(); + + return new Union([$type]); + } + + /** + * @deprecated will be removed in Psalm 5. See getNever to retrieve a TNever that replaces TEmpty + */ + public static function getEmpty(): Union + { + $type = new TEmpty(); + + return new Union([$type]); + } + + public static function getNever(): Union + { + $type = new TNever(); + + return new Union([$type]); + } + + public static function getBool(): Union + { + $type = new TBool; + + return new Union([$type]); + } + + public static function getFloat(?float $value = null): Union + { + if ($value !== null) { + $type = new TLiteralFloat($value); + } else { + $type = new TFloat(); + } + + return new Union([$type]); + } + + public static function getObject(): Union + { + $type = new TObject; + + return new Union([$type]); + } + + public static function getClosure(): Union + { + $type = new TClosure('Closure'); + + return new Union([$type]); + } + + public static function getArrayKey(): Union + { + $type = new TArrayKey(); + + return new Union([$type]); + } + + public static function getArray(): Union + { + $type = new TArray( + [ + new Union([new TArrayKey]), + new Union([new TMixed]), + ] + ); + + return new Union([$type]); + } + + public static function getEmptyArray(): Union + { + $array_type = new TArray( + [ + new Union([new TEmpty]), + new Union([new TEmpty]), + ] + ); + + return new Union([ + $array_type, + ]); + } + + public static function getList(): Union + { + $type = new TList(new Union([new TMixed])); + + return new Union([$type]); + } + + public static function getNonEmptyList(): Union + { + $type = new TNonEmptyList(new Union([new TMixed])); + + return new Union([$type]); + } + + public static function getVoid(): Union + { + $type = new TVoid; + + return new Union([$type]); + } + + public static function getFalse(): Union + { + $type = new TFalse; + + return new Union([$type]); + } + + public static function getTrue(): Union + { + $type = new TTrue; + + return new Union([$type]); + } + + public static function getResource(): Union + { + return new Union([new TResource]); + } + + /** + * @param non-empty-list $union_types + */ + public static function combineUnionTypeArray(array $union_types, ?Codebase $codebase): Union + { + $first_type = array_pop($union_types); + + foreach ($union_types as $type) { + $first_type = self::combineUnionTypes($first_type, $type, $codebase); + } + + return $first_type; + } + + /** + * Combines two union types into one + * + * @param int $literal_limit any greater number of literal types than this + * will be merged to a scalar + * + */ + public static function combineUnionTypes( + ?Union $type_1, + ?Union $type_2, + ?Codebase $codebase = null, + bool $overwrite_empty_array = false, + bool $allow_mixed_union = true, + int $literal_limit = 500 + ): Union { + if ($type_2 === null && $type_1 === null) { + throw new UnexpectedValueException('At least one type must be provided to combine'); + } + + if ($type_1 === null) { + return $type_2; + } + + if ($type_2 === null) { + return $type_1; + } + + if ($type_1 === $type_2) { + return $type_1; + } + + if ($type_1->isVanillaMixed() && $type_2->isVanillaMixed()) { + $combined_type = self::getMixed(); + } else { + $both_failed_reconciliation = false; + + if ($type_1->failed_reconciliation) { + if ($type_2->failed_reconciliation) { + $both_failed_reconciliation = true; + } else { + $type_2 = clone $type_2; + $type_2->parent_nodes += $type_1->parent_nodes; + + return $type_2; + } + } elseif ($type_2->failed_reconciliation) { + $type_1 = clone $type_1; + $type_1->parent_nodes += $type_2->parent_nodes; + + return $type_1; + } + + $combined_type = TypeCombiner::combine( + array_merge( + array_values($type_1->getAtomicTypes()), + array_values($type_2->getAtomicTypes()) + ), + $codebase, + $overwrite_empty_array, + $allow_mixed_union, + $literal_limit + ); + + if (!$type_1->initialized || !$type_2->initialized) { + $combined_type->initialized = false; + } + + if ($type_1->from_docblock || $type_2->from_docblock) { + $combined_type->from_docblock = true; + } + + if ($type_1->from_calculation || $type_2->from_calculation) { + $combined_type->from_calculation = true; + } + + if ($type_1->ignore_nullable_issues || $type_2->ignore_nullable_issues) { + $combined_type->ignore_nullable_issues = true; + } + + if ($type_1->ignore_falsable_issues || $type_2->ignore_falsable_issues) { + $combined_type->ignore_falsable_issues = true; + } + + if ($type_1->had_template && $type_2->had_template) { + $combined_type->had_template = true; + } + + if ($type_1->reference_free && $type_2->reference_free) { + $combined_type->reference_free = true; + } + + if ($both_failed_reconciliation) { + $combined_type->failed_reconciliation = true; + } + } + + if ($type_1->possibly_undefined || $type_2->possibly_undefined) { + $combined_type->possibly_undefined = true; + } + + if ($type_1->possibly_undefined_from_try || $type_2->possibly_undefined_from_try) { + $combined_type->possibly_undefined_from_try = true; + } + + if ($type_1->parent_nodes || $type_2->parent_nodes) { + $combined_type->parent_nodes = $type_1->parent_nodes + $type_2->parent_nodes; + } + + if ($type_1->by_ref || $type_2->by_ref) { + $combined_type->by_ref = true; + } + + return $combined_type; + } + + /** + * Combines two union types into one via an intersection + * + * + */ + public static function intersectUnionTypes( + Union $type_1, + Union $type_2, + Codebase $codebase + ): ?Union { + $intersection_performed = false; + $type_1_mixed = $type_1->isMixed(); + $type_2_mixed = $type_2->isMixed(); + + if ($type_1_mixed && $type_2_mixed) { + $combined_type = self::getMixed(); + } else { + $both_failed_reconciliation = false; + + if ($type_1->failed_reconciliation) { + if ($type_2->failed_reconciliation) { + $both_failed_reconciliation = true; + } else { + return $type_2; + } + } elseif ($type_2->failed_reconciliation) { + return $type_1; + } + + if ($type_1_mixed) { + $combined_type = clone $type_2; + $intersection_performed = true; + } elseif ($type_2_mixed) { + $combined_type = clone $type_1; + $intersection_performed = true; + } else { + $combined_type = null; + foreach ($type_1->getAtomicTypes() as $type_1_atomic) { + foreach ($type_2->getAtomicTypes() as $type_2_atomic) { + $intersection_atomic = null; + $wider_type = null; + if ($type_1_atomic instanceof TNamedObject + && $type_2_atomic instanceof TNamedObject + ) { + if (($type_1_atomic->value === $type_2_atomic->value + && get_class($type_1_atomic) === TNamedObject::class + && get_class($type_2_atomic) !== TNamedObject::class) + ) { + $intersection_atomic = clone $type_2_atomic; + $wider_type = $type_1_atomic; + $intersection_performed = true; + } elseif (($type_1_atomic->value === $type_2_atomic->value + && get_class($type_2_atomic) === TNamedObject::class + && get_class($type_1_atomic) !== TNamedObject::class) + ) { + $intersection_atomic = clone $type_1_atomic; + $wider_type = $type_2_atomic; + $intersection_performed = true; + } + } + + if (null === $intersection_atomic) { + if (AtomicTypeComparator::isContainedBy( + $codebase, + $type_2_atomic, + $type_1_atomic + )) { + $intersection_atomic = clone $type_2_atomic; + $wider_type = $type_1_atomic; + $intersection_performed = true; + } elseif (AtomicTypeComparator::isContainedBy( + $codebase, + $type_1_atomic, + $type_2_atomic + )) { + $intersection_atomic = clone $type_1_atomic; + $wider_type = $type_2_atomic; + $intersection_performed = true; + } + } + + if (static::mayHaveIntersection($type_1_atomic) + && static::mayHaveIntersection($type_2_atomic) + ) { + if ($intersection_atomic === null && $wider_type === null) { + $intersection_atomic = clone $type_1_atomic; + $wider_type = $type_2_atomic; + } + if ($intersection_atomic === null || $wider_type === null) { + throw new LogicException( + '$intersection_atomic and $wider_type should be both set or null.' + .' Check the preceding code for errors.' + .' Did you forget to assign one of the variables?' + ); + } + if (!static::mayHaveIntersection($intersection_atomic) + || !static::mayHaveIntersection($wider_type) + ) { + throw new LogicException( + '$intersection_atomic and $wider_type should be both support intersection.' + .' Check the preceding code for errors.' + ); + } + if (!$intersection_atomic->extra_types) { + $intersection_atomic->extra_types = []; + } + + $intersection_performed = true; + + $wider_type_clone = clone $wider_type; + + $wider_type_clone->extra_types = []; + + $intersection_atomic->extra_types[$wider_type_clone->getKey()] = $wider_type_clone; + + $wider_type_intersection_types = $wider_type->getIntersectionTypes(); + + if ($wider_type_intersection_types !== null) { + foreach ($wider_type_intersection_types as $wider_type_intersection_type) { + $intersection_atomic->extra_types[$wider_type_intersection_type->getKey()] + = clone $wider_type_intersection_type; + } + } + } + if (null !== $intersection_atomic) { + if (null === $combined_type) { + $combined_type = new Union([$intersection_atomic]); + } else { + $combined_type->addType($intersection_atomic); + } + } + } + } + } + + //if a type is contained by the other, the intersection is the narrowest type + if (!$intersection_performed) { + $type_1_in_2 = UnionTypeComparator::isContainedBy($codebase, $type_1, $type_2); + $type_2_in_1 = UnionTypeComparator::isContainedBy($codebase, $type_2, $type_1); + if ($type_1_in_2) { + $intersection_performed = true; + $combined_type = $type_1; + } elseif ($type_2_in_1) { + $intersection_performed = true; + $combined_type = $type_2; + } + } + + if ($combined_type !== null) { + if (!$type_1->initialized && !$type_2->initialized) { + $combined_type->initialized = false; + } + + if ($type_1->possibly_undefined_from_try && $type_2->possibly_undefined_from_try) { + $combined_type->possibly_undefined_from_try = true; + } + + if ($type_1->from_docblock && $type_2->from_docblock) { + $combined_type->from_docblock = true; + } + + if ($type_1->from_calculation && $type_2->from_calculation) { + $combined_type->from_calculation = true; + } + + if ($type_1->ignore_nullable_issues && $type_2->ignore_nullable_issues) { + $combined_type->ignore_nullable_issues = true; + } + + if ($type_1->ignore_falsable_issues && $type_2->ignore_falsable_issues) { + $combined_type->ignore_falsable_issues = true; + } + + if ($both_failed_reconciliation) { + $combined_type->failed_reconciliation = true; + } + } + } + + if (!$intersection_performed && $type_1->getId() !== $type_2->getId()) { + return null; + } + + if ($type_1->possibly_undefined && $type_2->possibly_undefined && $combined_type !== null) { + $combined_type->possibly_undefined = true; + } + + return $combined_type; + } + + /** + * @psalm-assert-if-true TIterable|TNamedObject|TTemplateParam|TObjectWithProperties $type + */ + private static function mayHaveIntersection(Atomic $type): bool + { + return $type instanceof TIterable + || $type instanceof TNamedObject + || $type instanceof TTemplateParam + || $type instanceof TObjectWithProperties; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic.php new file mode 100644 index 00000000..47d8e573 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic.php @@ -0,0 +1,812 @@ +> $template_type_map + * @param array $type_aliases + */ + public static function create( + string $value, + ?array $php_version = null, + array $template_type_map = [], + array $type_aliases = [] + ): Atomic { + switch ($value) { + case 'int': + return new TInt(); + + case 'float': + return new TFloat(); + + case 'string': + return new TString(); + + case 'bool': + return new TBool(); + + case 'void': + if ($php_version === null + || ($php_version[0] > 7) + || ($php_version[0] === 7 && $php_version[1] >= 1) + ) { + return new TVoid(); + } + + break; + + case 'array-key': + return new TArrayKey(); + + case 'iterable': + if ($php_version === null + || ($php_version[0] > 7) + || ($php_version[0] === 7 && $php_version[1] >= 1) + ) { + return new TIterable(); + } + + break; + + case 'never': + if ($php_version === null + || ($php_version[0] > 8) + || ($php_version[0] === 8 && $php_version[1] >= 1) + ) { + return new TNever(); + } + + break; + + case 'never-return': + case 'never-returns': + case 'no-return': + return new TNever(); + + case 'object': + if ($php_version === null + || ($php_version[0] > 7) + || ($php_version[0] === 7 && $php_version[1] >= 2) + ) { + return new TObject(); + } + + break; + + case 'callable': + return new TCallable(); + case 'pure-callable': + $type = new TCallable(); + $type->is_pure = true; + + return $type; + + case 'array': + case 'associative-array': + return new TArray([new Union([new TArrayKey]), new Union([new TMixed])]); + + case 'non-empty-array': + return new TNonEmptyArray([new Union([new TArrayKey]), new Union([new TMixed])]); + + case 'callable-array': + return new TCallableArray([new Union([new TArrayKey]), new Union([new TMixed])]); + + case 'list': + return new TList(Type::getMixed()); + + case 'non-empty-list': + return new TNonEmptyList(Type::getMixed()); + + case 'non-empty-string': + return new TNonEmptyString(); + + case 'non-falsy-string': + return new TNonFalsyString(); + + case 'lowercase-string': + return new TLowercaseString(); + + case 'non-empty-lowercase-string': + return new TNonEmptyLowercaseString(); + + case 'resource': + return $php_version !== null ? new TNamedObject($value) : new TResource(); + + case 'resource (closed)': + case 'closed-resource': + return new TClosedResource(); + + case 'positive-int': + return new TPositiveInt(); + + case 'numeric': + return $php_version !== null ? new TNamedObject($value) : new TNumeric(); + + case 'true': + return $php_version !== null ? new TNamedObject($value) : new TTrue(); + + case 'false': + if ($php_version === null || $php_version[0] >= 8) { + return new TFalse(); + } + + return new TNamedObject($value); + + case 'empty': + return $php_version !== null ? new TNamedObject($value) : new TEmpty(); + + case 'scalar': + return $php_version !== null ? new TNamedObject($value) : new TScalar(); + + case 'null': + if ($php_version === null || $php_version[0] >= 8) { + return new TNull(); + } + + return new TNamedObject($value); + + case 'mixed': + if ($php_version === null || $php_version[0] >= 8) { + return new TMixed(); + } + + return new TNamedObject($value); + + case 'callable-object': + return new TCallableObject(); + + case 'stringable-object': + return new TObjectWithProperties([], ['__tostring' => 'string']); + + case 'class-string': + case 'interface-string': + return new TClassString(); + + case 'trait-string': + return new TTraitString(); + + case 'callable-string': + return new TCallableString(); + + case 'numeric-string': + return new TNumericString(); + + case 'html-escaped-string': + return new THtmlEscapedString(); + + case 'literal-string': + return new TNonspecificLiteralString(); + + case 'non-empty-literal-string': + return new TNonEmptyNonspecificLiteralString(); + + case 'literal-int': + return new TNonspecificLiteralInt(); + + case 'false-y': + return new TAssertionFalsy(); + + case '$this': + return new TNamedObject('static'); + + case 'non-empty-scalar': + return new TNonEmptyScalar; + + case 'empty-scalar': + return new TEmptyScalar; + + case 'non-empty-mixed': + return new TNonEmptyMixed(); + } + + if (strpos($value, '-') && strpos($value, 'OCI-') !== 0) { + throw new TypeParseTreeException('Unrecognized type ' . $value); + } + + if (is_numeric($value[0])) { + throw new TypeParseTreeException('First character of type cannot be numeric'); + } + + if (isset($template_type_map[$value])) { + $first_class = array_keys($template_type_map[$value])[0]; + + return new TTemplateParam( + $value, + $template_type_map[$value][$first_class], + $first_class + ); + } + + if (isset($type_aliases[$value])) { + $type_alias = $type_aliases[$value]; + + if ($type_alias instanceof LinkableTypeAlias) { + return new TTypeAlias($type_alias->declaring_fq_classlike_name, $type_alias->alias_name); + } + + throw new TypeParseTreeException('Invalid type alias ' . $value . ' provided'); + } + + return new TNamedObject($value); + } + + abstract public function getKey(bool $include_extra = true): string; + + public function isNumericType(): bool + { + return $this instanceof TInt + || $this instanceof TFloat + || $this instanceof TNumericString + || $this instanceof TNumeric + || ($this instanceof TLiteralString && is_numeric($this->value)); + } + + public function isObjectType(): bool + { + return $this instanceof TObject + || $this instanceof TNamedObject + || ($this instanceof TTemplateParam + && $this->as->hasObjectType()); + } + + public function isNamedObjectType(): bool + { + return $this instanceof TNamedObject + || ($this instanceof TTemplateParam + && ($this->as->hasNamedObjectType() + || array_filter( + $this->extra_types ?: [], + function ($extra_type) { + return $extra_type->isNamedObjectType(); + } + ) + ) + ); + } + + public function isCallableType(): bool + { + return $this instanceof TCallable + || $this instanceof TCallableObject + || $this instanceof TCallableString + || $this instanceof TCallableArray + || $this instanceof TCallableList + || $this instanceof TCallableKeyedArray + || $this instanceof TClosure; + } + + public function isIterable(Codebase $codebase): bool + { + return $this instanceof TIterable + || $this->hasTraversableInterface($codebase) + || $this instanceof TArray + || $this instanceof TKeyedArray + || $this instanceof TList; + } + + public function isCountable(Codebase $codebase): bool + { + return $this->hasCountableInterface($codebase) + || $this instanceof TArray + || $this instanceof TKeyedArray + || $this instanceof TList; + } + + public function hasTraversableInterface(Codebase $codebase): bool + { + return $this instanceof TNamedObject + && ( + strtolower($this->value) === 'traversable' + || ($codebase->classOrInterfaceExists($this->value) + && ($codebase->classExtendsOrImplements( + $this->value, + 'Traversable' + ) || $codebase->interfaceExtends( + $this->value, + 'Traversable' + ))) + || ( + $this->extra_types + && array_filter( + $this->extra_types, + function (Atomic $a) use ($codebase): bool { + return $a->hasTraversableInterface($codebase); + } + ) + ) + ); + } + + public function hasCountableInterface(Codebase $codebase): bool + { + return $this instanceof TNamedObject + && ( + strtolower($this->value) === 'countable' + || ($codebase->classOrInterfaceExists($this->value) + && ($codebase->classExtendsOrImplements( + $this->value, + 'Countable' + ) || $codebase->interfaceExtends( + $this->value, + 'Countable' + ))) + || ( + $this->extra_types + && array_filter( + $this->extra_types, + function (Atomic $a) use ($codebase): bool { + return $a->hasCountableInterface($codebase); + } + ) + ) + ); + } + + public function isArrayAccessibleWithStringKey(Codebase $codebase): bool + { + return $this instanceof TArray + || $this instanceof TKeyedArray + || $this instanceof TList + || $this instanceof TClassStringMap + || $this->hasArrayAccessInterface($codebase) + || ($this instanceof TNamedObject && $this->value === 'SimpleXMLElement'); + } + + public function isArrayAccessibleWithIntOrStringKey(Codebase $codebase): bool + { + return $this instanceof TString + || $this->isArrayAccessibleWithStringKey($codebase); + } + + public function hasArrayAccessInterface(Codebase $codebase): bool + { + return $this instanceof TNamedObject + && ( + strtolower($this->value) === 'arrayaccess' + || ($codebase->classOrInterfaceExists($this->value) + && ($codebase->classExtendsOrImplements( + $this->value, + 'ArrayAccess' + ) || $codebase->interfaceExtends( + $this->value, + 'ArrayAccess' + ))) + || ( + $this->extra_types + && array_filter( + $this->extra_types, + function (Atomic $a) use ($codebase): bool { + return $a->hasArrayAccessInterface($codebase); + } + ) + ) + ); + } + + public function getChildNodes(): array + { + return []; + } + + public function replaceClassLike(string $old, string $new): void + { + if ($this instanceof TNamedObject) { + if (strtolower($this->value) === $old) { + $this->value = $new; + } + } + + if ($this instanceof TNamedObject + || $this instanceof TIterable + || $this instanceof TTemplateParam + ) { + if ($this->extra_types) { + foreach ($this->extra_types as $extra_type) { + $extra_type->replaceClassLike($old, $new); + } + } + } + + if ($this instanceof TClassConstant) { + if (strtolower($this->fq_classlike_name) === $old) { + $this->fq_classlike_name = $new; + } + } + + if ($this instanceof TClassString && $this->as !== 'object') { + if (strtolower($this->as) === $old) { + $this->as = $new; + } + } + + if ($this instanceof TTemplateParam) { + $this->as->replaceClassLike($old, $new); + } + + if ($this instanceof TLiteralClassString) { + if (strtolower($this->value) === $old) { + $this->value = $new; + } + } + + if ($this instanceof TArray + || $this instanceof TGenericObject + || $this instanceof TIterable + ) { + foreach ($this->type_params as $type_param) { + $type_param->replaceClassLike($old, $new); + } + } + + if ($this instanceof TKeyedArray) { + foreach ($this->properties as $property_type) { + $property_type->replaceClassLike($old, $new); + } + } + + if ($this instanceof TClosure + || $this instanceof TCallable + ) { + if ($this->params) { + foreach ($this->params as $param) { + if ($param->type) { + $param->type->replaceClassLike($old, $new); + } + } + } + + if ($this->return_type) { + $this->return_type->replaceClassLike($old, $new); + } + } + } + + public function __toString(): string + { + return ''; + } + + public function __clone() + { + if ($this instanceof TNamedObject + || $this instanceof TTemplateParam + || $this instanceof TIterable + || $this instanceof TObjectWithProperties + ) { + if ($this->extra_types) { + foreach ($this->extra_types as &$type) { + $type = clone $type; + } + } + } + + if ($this instanceof TTemplateParam) { + $this->as = clone $this->as; + } + } + + public function getId(bool $nested = false): string + { + return $this->__toString(); + } + + public function getAssertionString(bool $exact = false): string + { + return $this->getId(); + } + + /** + * @param array $aliased_classes + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return $this->getKey(); + } + + /** + * @param array $aliased_classes + */ + abstract public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string; + + abstract public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool; + + public function replaceTemplateTypesWithStandins( + TemplateResult $template_result, + ?Codebase $codebase = null, + ?StatementsAnalyzer $statements_analyzer = null, + Atomic $input_type = null, + ?int $input_arg_offset = null, + ?string $calling_class = null, + ?string $calling_function = null, + bool $replace = true, + bool $add_lower_bound = false, + int $depth = 0 + ): self { + return $this; + } + + public function replaceTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + // do nothing + } + + public function equals(Atomic $other_type, bool $ensure_source_equality): bool + { + return get_class($other_type) === get_class($this); + } + + public function isTruthy(): bool + { + if ($this instanceof TTrue) { + return true; + } + + if ($this instanceof TLiteralInt && $this->value !== 0) { + return true; + } + + if ($this instanceof TLiteralFloat && $this->value !== 0.0) { + return true; + } + + if ($this instanceof TLiteralString && + ($this->value !== '' && $this->value !== '0') + ) { + return true; + } + + if ($this instanceof TNonFalsyString) { + return true; + } + + if ($this instanceof TCallableString) { + return true; + } + + if ($this instanceof TNonEmptyArray) { + return true; + } + + if ($this instanceof TNonEmptyScalar) { + return true; + } + + if ($this instanceof TNonEmptyList) { + return true; + } + + if ($this instanceof TNonEmptyMixed) { + return true; + } + + if ($this instanceof TObject) { + return true; + } + + if ($this instanceof TNamedObject + && $this->value !== 'SimpleXMLElement' + && $this->value !== 'SimpleXMLIterator') { + return true; + } + + if ($this instanceof TIntRange && !$this->contains(0)) { + return true; + } + + if ($this instanceof TPositiveInt) { + return true; + } + + if ($this instanceof TLiteralClassString) { + return true; + } + + if ($this instanceof TClassString) { + return true; + } + + if ($this instanceof TDependentGetClass) { + return true; + } + + if ($this instanceof TTraitString) { + return true; + } + + if ($this instanceof TResource) { + return true; + } + + if ($this instanceof TKeyedArray) { + foreach ($this->properties as $property) { + if ($property->possibly_undefined === false) { + return true; + } + } + } + + if ($this instanceof TTemplateParam && $this->as->isAlwaysTruthy()) { + return true; + } + + //we can't be sure the type is always truthy + return false; + } + + public function isFalsy(): bool + { + if ($this instanceof TFalse) { + return true; + } + + if ($this instanceof TLiteralInt && $this->value === 0) { + return true; + } + + if ($this instanceof TLiteralFloat && $this->value === 0.0) { + return true; + } + + if ($this instanceof TLiteralString && + ($this->value === '' || $this->value === '0') + ) { + return true; + } + + if ($this instanceof TNull) { + return true; + } + + if ($this instanceof TEmptyMixed) { + return true; + } + + if ($this instanceof TEmptyNumeric) { + return true; + } + + if ($this instanceof TEmptyScalar) { + return true; + } + + if ($this instanceof TTemplateParam && $this->as->isAlwaysFalsy()) { + return true; + } + + if ($this instanceof TIntRange && + $this->min_bound === 0 && + $this->max_bound === 0 + ) { + return true; + } + + if ($this instanceof TArray && $this->getId() === 'array') { + return true; + } + + //we can't be sure the type is always falsy + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php new file mode 100644 index 00000000..cd0c026d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php @@ -0,0 +1,300 @@ +|null + */ + public $params = []; + + /** + * @var Union|null + */ + public $return_type; + + /** + * @var ?bool + */ + public $is_pure; + + /** + * Constructs a new instance of a generic type + * + * @param list $params + */ + public function __construct( + string $value = 'callable', + ?array $params = null, + ?Union $return_type = null, + ?bool $is_pure = null + ) { + $this->value = $value; + $this->params = $params; + $this->return_type = $return_type; + $this->is_pure = $is_pure; + } + + public function __clone() + { + if ($this->params) { + foreach ($this->params as &$param) { + $param = clone $param; + } + } + + $this->return_type = $this->return_type ? clone $this->return_type : null; + } + + public function getKey(bool $include_extra = true): string + { + return $this->__toString(); + } + + /** + * @param array $aliased_classes + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($use_phpdoc_format) { + if ($this instanceof TNamedObject) { + return parent::toNamespacedString($namespace, $aliased_classes, $this_class, true); + } + + return $this->value; + } + + $param_string = ''; + $return_type_string = ''; + + if ($this->params !== null) { + $param_string = '(' . implode( + ', ', + array_map( + /** + * @return string + */ + function (FunctionLikeParameter $param) use ($namespace, $aliased_classes, $this_class): string { + if (!$param->type) { + $type_string = 'mixed'; + } else { + $type_string = $param->type->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + false + ); + } + + return ($param->is_variadic ? '...' : '') . $type_string . ($param->is_optional ? '=' : ''); + }, + $this->params + ) + ) . ')'; + } + + if ($this->return_type !== null) { + $return_type_multiple = count($this->return_type->getAtomicTypes()) > 1; + + $return_type_string = ':' . ($return_type_multiple ? '(' : '') . $this->return_type->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + false + ) . ($return_type_multiple ? ')' : ''); + } + + if ($this instanceof TNamedObject) { + return parent::toNamespacedString($namespace, $aliased_classes, $this_class, true) + . $param_string . $return_type_string; + } + + return ($this->is_pure ? 'pure-' : '') . 'callable' . $param_string . $return_type_string; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): string { + if ($this instanceof TNamedObject) { + return parent::toNamespacedString($namespace, $aliased_classes, $this_class, true); + } + + return $this->value; + } + + public function getId(bool $nested = false): string + { + $param_string = ''; + $return_type_string = ''; + + if ($this->params !== null) { + $param_string .= '('; + foreach ($this->params as $i => $param) { + if ($i) { + $param_string .= ', '; + } + + $param_string .= $param->getId(); + } + + $param_string .= ')'; + } + + if ($this->return_type !== null) { + $return_type_multiple = count($this->return_type->getAtomicTypes()) > 1; + $return_type_string = ':' . ($return_type_multiple ? '(' : '') + . $this->return_type->getId() . ($return_type_multiple ? ')' : ''); + } + + return ($this->is_pure ? 'pure-' : ($this->is_pure === null ? '' : 'impure-')) + . $this->value . $param_string . $return_type_string; + } + + public function __toString(): string + { + return $this->getId(); + } + + public function replaceTemplateTypesWithStandins( + TemplateResult $template_result, + ?Codebase $codebase = null, + ?StatementsAnalyzer $statements_analyzer = null, + ?Atomic $input_type = null, + ?int $input_arg_offset = null, + ?string $calling_class = null, + ?string $calling_function = null, + bool $replace = true, + bool $add_lower_bound = false, + int $depth = 0 + ): Atomic { + $callable = clone $this; + + if ($callable->params) { + foreach ($callable->params as $offset => $param) { + $input_param_type = null; + + if (($input_type instanceof TClosure || $input_type instanceof TCallable) + && isset($input_type->params[$offset]) + ) { + $input_param_type = $input_type->params[$offset]->type; + } + + if (!$param->type) { + continue; + } + + $param->type = TemplateStandinTypeReplacer::replace( + $param->type, + $template_result, + $codebase, + $statements_analyzer, + $input_param_type, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + !$add_lower_bound, + null, + $depth + ); + } + } + + if ($callable->return_type) { + $callable->return_type = TemplateStandinTypeReplacer::replace( + $callable->return_type, + $template_result, + $codebase, + $statements_analyzer, + $input_type instanceof TCallable || $input_type instanceof TClosure + ? $input_type->return_type + : null, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound + ); + } + + return $callable; + } + + public function replaceTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + if ($this->params) { + foreach ($this->params as $param) { + if (!$param->type) { + continue; + } + + TemplateInferredTypeReplacer::replace( + $param->type, + $template_result, + $codebase + ); + } + } + + if ($this->return_type) { + TemplateInferredTypeReplacer::replace( + $this->return_type, + $template_result, + $codebase + ); + } + } + + /** + * @return list + */ + public function getChildNodes(): array + { + $child_nodes = []; + + if ($this->params) { + foreach ($this->params as $param) { + if ($param->type) { + $child_nodes[] = $param->type; + } + } + } + + if ($this->return_type) { + $child_nodes[] = $this->return_type; + } + + return $child_nodes; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php new file mode 100644 index 00000000..4ebefe03 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php @@ -0,0 +1,15 @@ +type_params as $type_param) { + $s .= $type_param . ', '; + } + + $extra_types = ''; + + if ($this instanceof TNamedObject && $this->extra_types) { + $extra_types = '&' . implode('&', $this->extra_types); + } + + return $this->value . '<' . substr($s, 0, -2) . '>' . $extra_types; + } + + public function getId(bool $nested = false): string + { + $s = ''; + foreach ($this->type_params as $type_param) { + $s .= $type_param->getId() . ', '; + } + + $extra_types = ''; + + if ($this instanceof TNamedObject) { + if ($this->extra_types) { + $extra_types = '&' . implode( + '&', + array_map( + function ($type) { + return $type->getId(true); + }, + $this->extra_types + ) + ); + } + + if ($this->was_static) { + $extra_types .= '&static'; + } + } + + return $this->value . '<' . substr($s, 0, -2) . '>' . $extra_types; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + $base_value = $this instanceof TNamedObject + ? parent::toNamespacedString($namespace, $aliased_classes, $this_class, $use_phpdoc_format) + : $this->value; + + if ($base_value === 'non-empty-array') { + $base_value = 'array'; + } + + if ($use_phpdoc_format) { + if ($this instanceof TNamedObject || $this instanceof TIterable) { + return $base_value; + } + + $value_type = $this->type_params[1]; + + if ($value_type->isMixed() || $value_type->isEmpty()) { + return $base_value; + } + + $value_type_string = $value_type->toNamespacedString($namespace, $aliased_classes, $this_class, true); + + if (!$value_type->isSingle()) { + return '(' . $value_type_string . ')[]'; + } + + return $value_type_string . '[]'; + } + + $intersection_pos = strpos($base_value, '&'); + if ($intersection_pos !== false) { + $base_value = substr($base_value, 0, $intersection_pos); + } + $type_params = $this->type_params; + + //no need for special format if the key is not determined + if ($this instanceof TArray && + count($type_params) === 2 && + isset($type_params[0]) && + $type_params[0]->isArrayKey() + ) { + //we remove the key for display + unset($type_params[0]); + $type_params = array_values($type_params); + } + + if ($this instanceof TArray && + count($type_params) === 1 && + isset($type_params[0]) && + $type_params[0]->isMixed() + ) { + //when the value of an array is mixed, no need for namespaced phpdoc + return 'array'; + } + + $extra_types = ''; + + if ($this instanceof TNamedObject && $this->extra_types) { + $extra_types = '&' . implode( + '&', + array_map( + /** + * @return string + */ + function (Atomic $extra_type) use ($namespace, $aliased_classes, $this_class): string { + return $extra_type->toNamespacedString($namespace, $aliased_classes, $this_class, false); + }, + $this->extra_types + ) + ); + } + + return $base_value . + '<' . + implode( + ', ', + array_map( + /** + * @return string + */ + function (Union $type_param) use ($namespace, $aliased_classes, $this_class): string { + return $type_param->toNamespacedString($namespace, $aliased_classes, $this_class, false); + }, + $type_params + ) + ) . + '>' . $extra_types; + } + + public function __clone() + { + foreach ($this->type_params as &$type_param) { + $type_param = clone $type_param; + } + } + + /** + * @return array + */ + public function getChildNodes(): array + { + return $this->type_params; + } + + public function replaceTemplateTypesWithStandins( + TemplateResult $template_result, + ?Codebase $codebase = null, + ?StatementsAnalyzer $statements_analyzer = null, + ?Atomic $input_type = null, + ?int $input_arg_offset = null, + ?string $calling_class = null, + ?string $calling_function = null, + bool $replace = true, + bool $add_lower_bound = false, + int $depth = 0 + ): Atomic { + if ($input_type instanceof TList) { + $input_type = new TArray([Type::getInt(), $input_type->type_param]); + } + + $input_object_type_params = []; + + $container_type_params_covariant = []; + + if ($input_type instanceof TGenericObject + && ($this instanceof TGenericObject || $this instanceof TIterable) + && $codebase + ) { + $input_object_type_params = TemplateStandinTypeReplacer::getMappedGenericTypeParams( + $codebase, + $input_type, + $this, + $container_type_params_covariant + ); + } + + $atomic = clone $this; + + foreach ($atomic->type_params as $offset => $type_param) { + $input_type_param = null; + + if (($input_type instanceof TIterable + || $input_type instanceof TArray) + && + isset($input_type->type_params[$offset]) + ) { + $input_type_param = $input_type->type_params[$offset]; + } elseif ($input_type instanceof TKeyedArray) { + if ($offset === 0) { + $input_type_param = $input_type->getGenericKeyType(); + } elseif ($offset === 1) { + $input_type_param = $input_type->getGenericValueType(); + } else { + throw new UnexpectedValueException('Not expecting offset of ' . $offset); + } + } elseif ($input_type instanceof TNamedObject + && isset($input_object_type_params[$offset]) + ) { + $input_type_param = $input_object_type_params[$offset]; + } + + /** @psalm-suppress PropertyTypeCoercion */ + $atomic->type_params[$offset] = TemplateStandinTypeReplacer::replace( + $type_param, + $template_result, + $codebase, + $statements_analyzer, + $input_type_param, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + !($container_type_params_covariant[$offset] ?? true) + && $this instanceof TGenericObject + ? $this->value + : null, + $depth + 1 + ); + } + + return $atomic; + } + + public function replaceTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + foreach ($this->type_params as $offset => $type_param) { + TemplateInferredTypeReplacer::replace( + $type_param, + $template_result, + $codebase + ); + + if ($this instanceof TArray && $offset === 0 && $type_param->isMixed()) { + $this->type_params[0] = Type::getArrayKey(); + } + } + + if ($this instanceof TGenericObject) { + $this->remapped_params = true; + } + + if ($this instanceof TGenericObject || $this instanceof TIterable) { + $this->replaceIntersectionTemplateTypesWithArgTypes($template_result, $codebase); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php new file mode 100644 index 00000000..41743192 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php @@ -0,0 +1,109 @@ +|null + */ + public $extra_types; + + /** + * @param array $aliased_classes + */ + private function getNamespacedIntersectionTypes( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if (!$this->extra_types) { + return ''; + } + + return '&' . implode( + '&', + array_map( + /** + * @param TNamedObject|TTemplateParam|TIterable|TObjectWithProperties $extra_type + * + * @return string + */ + function (Atomic $extra_type) use ( + $namespace, + $aliased_classes, + $this_class, + $use_phpdoc_format + ): string { + return $extra_type->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + $use_phpdoc_format + ); + }, + $this->extra_types + ) + ); + } + + /** + * @param TNamedObject|TTemplateParam|TIterable|TObjectWithProperties $type + */ + public function addIntersectionType(Atomic $type): void + { + $this->extra_types[$type->getKey()] = $type; + } + + /** + * @return array|null + */ + public function getIntersectionTypes(): ?array + { + return $this->extra_types; + } + + public function replaceIntersectionTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + if (!$this->extra_types) { + return; + } + + $new_types = []; + + foreach ($this->extra_types as $extra_type) { + if ($extra_type instanceof TTemplateParam + && isset($template_result->lower_bounds[$extra_type->param_name][$extra_type->defining_class]) + ) { + $template_type = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( + $template_result->lower_bounds[$extra_type->param_name][$extra_type->defining_class], + $codebase + ); + + foreach ($template_type->getAtomicTypes() as $template_type_part) { + if ($template_type_part instanceof TNamedObject) { + $new_types[$template_type_part->getKey()] = clone $template_type_part; + } elseif ($template_type_part instanceof TTemplateParam) { + $new_types[$template_type_part->getKey()] = clone $template_type_part; + } + } + } else { + $extra_type->replaceTemplateTypesWithArgTypes($template_result, $codebase); + $new_types[$extra_type->getKey()] = $extra_type; + } + } + + $this->extra_types = $new_types; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php new file mode 100644 index 00000000..f37518cd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php @@ -0,0 +1,13 @@ +extends = $extends; + } + + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $php_major_version > 7 + || ($php_major_version === 7 && $php_minor_version >= 2) + ? ($this->extends ?? 'object') : null; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return $this->extends ?? 'object'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php new file mode 100644 index 00000000..05e31a47 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php @@ -0,0 +1,95 @@ +`. It expects an array with two elements, both union types. + */ +class TArray extends Atomic +{ + use GenericTrait; + + /** + * @var array{Union, Union} + */ + public $type_params; + + /** + * @var string + */ + public $value = 'array'; + + /** + * Constructs a new instance of a generic type + * + * @param array{Union, Union} $type_params + */ + public function __construct(array $type_params) + { + $this->type_params = $type_params; + } + + public function getKey(bool $include_extra = true): string + { + return 'array'; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): string { + return $this->getKey(); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return $this->type_params[0]->isArrayKey() && $this->type_params[1]->isMixed(); + } + + public function equals(Atomic $other_type, bool $ensure_source_equality): bool + { + if (get_class($other_type) !== static::class) { + return false; + } + + if ($this instanceof TNonEmptyArray + && $other_type instanceof TNonEmptyArray + && $this->count !== $other_type->count + ) { + return false; + } + + if (count($this->type_params) !== count($other_type->type_params)) { + return false; + } + + foreach ($this->type_params as $i => $type_param) { + if (!$type_param->equals($other_type->type_params[$i], $ensure_source_equality)) { + return false; + } + } + + return true; + } + + public function getAssertionString(bool $exact = false): string + { + if (!$exact || $this->type_params[1]->isMixed()) { + return 'array'; + } + + return $this->toNamespacedString(null, [], null, false); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php new file mode 100644 index 00000000..038b85cf --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php @@ -0,0 +1,49 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + /** + * @param array $aliased_classes + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return $use_phpdoc_format ? '(int|string)' : 'array-key'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php new file mode 100644 index 00000000..db43e12b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php @@ -0,0 +1,44 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php new file mode 100644 index 00000000..adae27f9 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php @@ -0,0 +1,32 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $php_major_version >= 7 ? 'bool' : null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php new file mode 100644 index 00000000..fb92d7e6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php @@ -0,0 +1,36 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): string { + return 'callable'; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return $this->params === null && $this->return_type === null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php new file mode 100644 index 00000000..1ccce11b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php @@ -0,0 +1,14 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $php_major_version > 7 + || ($php_major_version === 7 && $php_minor_version >= 2) + ? 'object' : null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function getAssertionString(bool $exact = false): string + { + return 'object'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php new file mode 100644 index 00000000..803120df --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php @@ -0,0 +1,30 @@ +getKey(); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function getAssertionString(bool $exact = false): string + { + return 'string'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php new file mode 100644 index 00000000..7790806d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php @@ -0,0 +1,81 @@ +fq_classlike_name = $fq_classlike_name; + $this->const_name = $const_name; + } + + public function getKey(bool $include_extra = true): string + { + return 'class-constant(' . $this->fq_classlike_name . '::' . $this->const_name . ')'; + } + + public function __toString(): string + { + return $this->fq_classlike_name . '::' . $this->const_name; + } + + public function getId(bool $nested = false): string + { + return $this->fq_classlike_name . '::' . $this->const_name; + } + + public function getAssertionString(bool $exact = false): string + { + return 'class-constant(' . $this->fq_classlike_name . '::' . $this->const_name . ')'; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($this->fq_classlike_name === 'static') { + return 'static::' . $this->const_name; + } + + return Type::getStringFromFQCLN($this->fq_classlike_name, $namespace, $aliased_classes, $this_class) + . '::' + . $this->const_name; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php new file mode 100644 index 00000000..745778c7 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php @@ -0,0 +1,171 @@ +as = $as; + $this->as_type = $as_type; + } + + public function getKey(bool $include_extra = true): string + { + return 'class-string' . ($this->as === 'object' ? '' : '<' . $this->as_type . '>'); + } + + public function __toString(): string + { + return $this->getKey(); + } + + public function getId(bool $nested = false): string + { + return $this->getKey(); + } + + public function getAssertionString(bool $exact = false): string + { + return 'class-string'; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return 'string'; + } + + /** + * @param array $aliased_classes + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($this->as === 'object') { + return 'class-string'; + } + + if ($namespace && stripos($this->as, $namespace . '\\') === 0) { + return 'class-string<' . preg_replace( + '/^' . preg_quote($namespace . '\\') . '/i', + '', + $this->as + ) . '>'; + } + + if (!$namespace && strpos($this->as, '\\') === false) { + return 'class-string<' . $this->as . '>'; + } + + if (isset($aliased_classes[strtolower($this->as)])) { + return 'class-string<' . $aliased_classes[strtolower($this->as)] . '>'; + } + + return 'class-string<\\' . $this->as . '>'; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function getChildNodes(): array + { + return $this->as_type ? [$this->as_type] : []; + } + + public function replaceTemplateTypesWithStandins( + TemplateResult $template_result, + ?Codebase $codebase = null, + ?StatementsAnalyzer $statements_analyzer = null, + ?Atomic $input_type = null, + ?int $input_arg_offset = null, + ?string $calling_class = null, + ?string $calling_function = null, + bool $replace = true, + bool $add_lower_bound = false, + int $depth = 0 + ): Atomic { + $class_string = clone $this; + + if (!$class_string->as_type) { + return $class_string; + } + + if ($input_type instanceof TLiteralClassString) { + $input_object_type = new TNamedObject($input_type->value); + } elseif ($input_type instanceof TClassString && $input_type->as_type) { + $input_object_type = $input_type->as_type; + } else { + $input_object_type = new TObject(); + } + + $as_type = TemplateStandinTypeReplacer::replace( + new Union([$class_string->as_type]), + $template_result, + $codebase, + $statements_analyzer, + new Union([$input_object_type]), + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + null, + $depth + ); + + $as_type_types = array_values($as_type->getAtomicTypes()); + + $class_string->as_type = count($as_type_types) === 1 + && $as_type_types[0] instanceof TNamedObject + ? $as_type_types[0] + : null; + + if (!$class_string->as_type) { + $class_string->as = 'object'; + } + + return $class_string; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php new file mode 100644 index 00000000..edef7eec --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php @@ -0,0 +1,251 @@ +value_param = $value_param; + $this->param_name = $param_name; + $this->as_type = $as_type; + } + + public function __toString(): string + { + /** @psalm-suppress MixedOperand */ + return static::KEY + . '<' + . $this->param_name + . ' as ' + . ($this->as_type ? (string) $this->as_type : 'object') + . ', ' + . ((string) $this->value_param) + . '>'; + } + + public function getId(bool $nested = false): string + { + /** @psalm-suppress MixedOperand */ + return static::KEY + . '<' + . $this->param_name + . ' as ' + . ($this->as_type ? (string) $this->as_type : 'object') + . ', ' + . $this->value_param->getId() + . '>'; + } + + public function __clone() + { + $this->value_param = clone $this->value_param; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($use_phpdoc_format) { + return (new TArray([Type::getString(), $this->value_param])) + ->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + true + ); + } + + /** @psalm-suppress MixedOperand */ + return static::KEY + . '<' + . $this->param_name + . ($this->as_type ? ' as ' . $this->as_type : '') + . ', ' + . $this->value_param->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + false + ) + . '>'; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): string { + return 'array'; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function getKey(bool $include_extra = true): string + { + return 'array'; + } + + public function replaceTemplateTypesWithStandins( + TemplateResult $template_result, + ?Codebase $codebase = null, + ?StatementsAnalyzer $statements_analyzer = null, + ?Atomic $input_type = null, + ?int $input_arg_offset = null, + ?string $calling_class = null, + ?string $calling_function = null, + bool $replace = true, + bool $add_lower_bound = false, + int $depth = 0 + ): Atomic { + $map = clone $this; + + foreach ([Type::getString(), $map->value_param] as $offset => $type_param) { + $input_type_param = null; + + if (($input_type instanceof TGenericObject + || $input_type instanceof TIterable + || $input_type instanceof TArray) + && + isset($input_type->type_params[$offset]) + ) { + $input_type_param = clone $input_type->type_params[$offset]; + } elseif ($input_type instanceof TKeyedArray) { + if ($offset === 0) { + $input_type_param = $input_type->getGenericKeyType(); + } else { + $input_type_param = $input_type->getGenericValueType(); + } + } elseif ($input_type instanceof TList) { + if ($offset === 0) { + continue; + } + + $input_type_param = clone $input_type->type_param; + } + + $value_param = TemplateStandinTypeReplacer::replace( + $type_param, + $template_result, + $codebase, + $statements_analyzer, + $input_type_param, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + null, + $depth + 1 + ); + + if ($offset === 1) { + $map->value_param = $value_param; + } + } + + return $map; + } + + public function replaceTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + TemplateInferredTypeReplacer::replace( + $this->value_param, + $template_result, + $codebase + ); + } + + public function getChildNodes(): array + { + return [$this->value_param]; + } + + public function equals(Atomic $other_type, bool $ensure_source_equality): bool + { + if (get_class($other_type) !== static::class) { + return false; + } + + if (!$this->value_param->equals($other_type->value_param, $ensure_source_equality)) { + return false; + } + + return true; + } + + public function getAssertionString(bool $exact = false): string + { + return $this->getKey(); + } + + public function getStandinKeyParam(): Union + { + return new Union([ + new TTemplateParamClass( + $this->param_name, + $this->as_type->value ?? 'object', + $this->as_type, + 'class-string-map' + ) + ]); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php new file mode 100644 index 00000000..c8391b4c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php @@ -0,0 +1,44 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php new file mode 100644 index 00000000..5e3a9dfe --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php @@ -0,0 +1,19 @@ + */ + public $byref_uses = []; + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php new file mode 100644 index 00000000..2c12fea6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php @@ -0,0 +1,148 @@ +param_name = $param_name; + $this->defining_class = $defining_class; + $this->as_type = $as_type; + $this->conditional_type = $conditional_type; + $this->if_type = $if_type; + $this->else_type = $else_type; + } + + public function __toString(): string + { + return '(' + . $this->param_name + . ' is ' . $this->conditional_type + . ' ? ' . $this->if_type + . ' : ' . $this->else_type + . ')'; + } + + public function __clone() + { + $this->conditional_type = clone $this->conditional_type; + $this->if_type = clone $this->if_type; + $this->else_type = clone $this->else_type; + $this->as_type = clone $this->as_type; + } + + public function getKey(bool $include_extra = true): string + { + return $this->__toString(); + } + + public function getAssertionString(bool $exact = false): string + { + return ''; + } + + public function getId(bool $nested = false): string + { + return '(' + . $this->param_name . ':' . $this->defining_class + . ' is ' . $this->conditional_type->getId() + . ' ? ' . $this->if_type->getId() + . ' : ' . $this->else_type->getId() + . ')'; + } + + /** + * @param array $aliased_classes + * + * @return null + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return ''; + } + + public function getChildNodes(): array + { + return [$this->conditional_type, $this->if_type, $this->else_type]; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function replaceTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + TemplateInferredTypeReplacer::replace( + $this->conditional_type, + $template_result, + $codebase + ); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php new file mode 100644 index 00000000..d53e53b2 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php @@ -0,0 +1,63 @@ +typeof = $typeof; + $this->as_type = $as_type; + } + + public function getId(bool $nested = false): string + { + return $this->as_type->isMixed() + || $this->as_type->hasObject() + ? 'class-string' + : 'class-string<' . $this->as_type->getId() . '>'; + } + + public function getKey(bool $include_extra = true): string + { + return 'get-class-of<' . $this->typeof + . (!$this->as_type->isMixed() && !$this->as_type->hasObject() ? ', ' . $this->as_type->getId() : '') + . '>'; + } + + public function getVarId(): string + { + return $this->typeof; + } + + public function getReplacement(): Atomic + { + return new TClassString(); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php new file mode 100644 index 00000000..1ca55527 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php @@ -0,0 +1,46 @@ +typeof = $typeof; + } + + public function getKey(bool $include_extra = true): string + { + return 'get-debug-type-of<' . $this->typeof . '>'; + } + + public function getVarId(): string + { + return $this->typeof; + } + + public function getReplacement(): Atomic + { + return new TString(); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php new file mode 100644 index 00000000..1c06fcda --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php @@ -0,0 +1,29 @@ +typeof = $typeof; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php new file mode 100644 index 00000000..c5bbd991 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php @@ -0,0 +1,51 @@ + $value) + */ +class TDependentListKey extends TInt implements DependentType +{ + /** + * Used to hold information as to what list variable this refers to + * + * @var string + */ + public $var_id; + + /** + * @param string $var_id the variable id + */ + public function __construct(string $var_id) + { + $this->var_id = $var_id; + } + + public function getId(bool $nested = false): string + { + return 'list-key<' . $this->var_id . '>'; + } + + public function getVarId(): string + { + return $this->var_id; + } + + public function getAssertionString(bool $exact = false): string + { + return 'int'; + } + + public function getReplacement(): Atomic + { + return new TInt(); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php new file mode 100644 index 00000000..2cfa456f --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php @@ -0,0 +1,34 @@ +`. + * @deprecated Will be replaced by TNever when in type context and TAssertionEmpty for assertion context in Psalm 5 + */ +class TEmpty extends Scalar +{ + public function __toString(): string + { + return 'empty'; + } + + public function getKey(bool $include_extra = true): string + { + return 'empty'; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php new file mode 100644 index 00000000..b5f52220 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php @@ -0,0 +1,15 @@ +case_name = $case_name; + } + + public function getKey(bool $include_extra = true): string + { + return 'enum(' . $this->value . '::' . $this->case_name . ')'; + } + + public function getId(bool $nested = false): string + { + return 'enum(' . $this->value . '::' . $this->case_name . ')'; + } + + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $this->value; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return $this->value . '::' . $this->case_name; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php new file mode 100644 index 00000000..b97abb69 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php @@ -0,0 +1,27 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $php_major_version >= 7 ? 'float' : null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php new file mode 100644 index 00000000..e0f77432 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php @@ -0,0 +1,115 @@ +` + */ +class TGenericObject extends TNamedObject +{ + use GenericTrait; + + /** + * @var non-empty-list + */ + public $type_params; + + /** @var bool if the parameters have been remapped to another class */ + public $remapped_params = false; + + /** + * @param string $value the name of the object + * @param non-empty-list $type_params + */ + public function __construct(string $value, array $type_params) + { + if ($value[0] === '\\') { + $value = substr($value, 1); + } + + $this->value = $value; + $this->type_params = $type_params; + } + + public function getKey(bool $include_extra = true): string + { + $s = ''; + + foreach ($this->type_params as $type_param) { + $s .= $type_param->getKey() . ', '; + } + + $extra_types = ''; + + if ($include_extra && $this->extra_types) { + $extra_types = '&' . implode('&', $this->extra_types); + } + + return $this->value . '<' . substr($s, 0, -2) . '>' . $extra_types; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + $result = $this->toNamespacedString($namespace, $aliased_classes, $this_class, true); + $intersection = strrpos($result, '&'); + if ($intersection === false || ( + ($php_major_version === 8 && $php_minor_version >= 1) || + ($php_major_version >= 9) + ) + ) { + return $result; + } + return substr($result, $intersection+1); + } + + public function equals(Atomic $other_type, bool $ensure_source_equality): bool + { + if (!$other_type instanceof self) { + return false; + } + + if (count($this->type_params) !== count($other_type->type_params)) { + return false; + } + + foreach ($this->type_params as $i => $type_param) { + if (!$type_param->equals($other_type->type_params[$i], $ensure_source_equality)) { + return false; + } + } + + return true; + } + + public function getAssertionString(bool $exact = false): string + { + return $this->value; + } + + public function getChildNodes(): array + { + return array_merge($this->type_params, $this->extra_types ?? []); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php new file mode 100644 index 00000000..da315ece --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php @@ -0,0 +1,25 @@ +getKey(); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php new file mode 100644 index 00000000..27191b81 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php @@ -0,0 +1,32 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $php_major_version >= 7 ? 'int' : null; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php new file mode 100644 index 00000000..cf6cd4c6 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php @@ -0,0 +1,71 @@ +` corresponds to `0|1|2|3|4|5|6|7` + */ +class TIntMask extends TInt +{ + /** @var non-empty-array */ + public $values; + + /** @param non-empty-array $values */ + public function __construct(array $values) + { + $this->values = $values; + } + + public function getKey(bool $include_extra = true): string + { + $s = ''; + + foreach ($this->values as $value) { + $s .= $value->getKey() . ', '; + } + + return 'int-mask<' . substr($s, 0, -2) . '>'; + } + + public function getId(bool $nested = false): string + { + $s = ''; + + foreach ($this->values as $value) { + $s .= $value->getId() . ', '; + } + + return 'int-mask<' . substr($s, 0, -2) . '>'; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($use_phpdoc_format) { + return 'int'; + } + + $s = ''; + + foreach ($this->values as $value) { + $s .= $value->toNamespacedString($namespace, $aliased_classes, $this_class, false) . ', '; + } + + return 'int-mask<' . substr($s, 0, -2) . '>'; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php new file mode 100644 index 00000000..70e56452 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php @@ -0,0 +1,57 @@ +` will corresponds to `0|1|2|3|4|5|6|7` if there are three constant 1, 2 and 4 + */ +class TIntMaskOf extends TInt +{ + /** @var TClassConstant|TKeyOfClassConstant|TValueOfClassConstant */ + public $value; + + /** + * @param TClassConstant|TKeyOfClassConstant|TValueOfClassConstant $value + */ + public function __construct(Atomic $value) + { + $this->value = $value; + } + + public function getKey(bool $include_extra = true): string + { + return 'int-mask-of<' . $this->value->getKey() . '>'; + } + + public function getId(bool $nested = false): string + { + return $this->getKey(); + } + + /** + * @param array $aliased_classes + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($use_phpdoc_format) { + return 'int'; + } + + return 'int-mask-of<' + . $this->value->toNamespacedString($namespace, $aliased_classes, $this_class, false) + . '>'; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php new file mode 100644 index 00000000..5b2adcdd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php @@ -0,0 +1,161 @@ +min_bound = $min_bound; + $this->max_bound = $max_bound; + } + + public function __toString(): string + { + return $this->getKey(); + } + + public function getKey(bool $include_extra = true): string + { + return 'int<' . ($this->min_bound ?? 'min') . ', ' . ($this->max_bound ?? 'max') . '>'; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + /** + * @param array $aliased_classes + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return $use_phpdoc_format ? + 'int' : + 'int<' . ($this->min_bound ?? 'min') . ', ' . ($this->max_bound ?? 'max') . '>'; + } + + public function isPositive(): bool + { + return $this->min_bound !== null && $this->min_bound > 0; + } + + public function isNegative(): bool + { + return $this->max_bound !== null && $this->max_bound < 0; + } + + public function isPositiveOrZero(): bool + { + return $this->min_bound !== null && $this->min_bound >= 0; + } + + public function isNegativeOrZero(): bool + { + return $this->max_bound !== null && $this->max_bound <= 0; + } + + public function contains(int $i): bool + { + return + ($this->min_bound === null && $this->max_bound === null) || + ($this->min_bound === null && $this->max_bound >= $i) || + ($this->max_bound === null && $this->min_bound <= $i) || + ($this->min_bound <= $i && $this->max_bound >= $i); + } + + /** + * Returns true if every part of the Range is lesser than the given value + */ + public function isLesserThan(int $i): bool + { + return $this->max_bound !== null && $this->max_bound < $i; + } + + /** + * Returns true if every part of the Range is greater than the given value + */ + public function isGreaterThan(int $i): bool + { + return $this->min_bound !== null && $this->min_bound > $i; + } + + public static function getNewLowestBound(?int $bound1, ?int $bound2): ?int + { + if ($bound1 === null || $bound2 === null) { + return null; + } + return min($bound1, $bound2); + } + + public static function getNewHighestBound(?int $bound1, ?int $bound2): ?int + { + if ($bound1 === null || $bound2 === null) { + return null; + } + return max($bound1, $bound2); + } + + /** + * convert any int to its equivalent in int range + */ + public static function convertToIntRange(TInt $int_atomic): TIntRange + { + if ($int_atomic instanceof TIntRange) { + return $int_atomic; + } + + if ($int_atomic instanceof TPositiveInt) { + return new TIntRange(1, null); + } + + if ($int_atomic instanceof TLiteralInt) { + return new TIntRange($int_atomic->value, $int_atomic->value); + } + + return new TIntRange(null, null); + } + + public static function intersectIntRanges(TIntRange $int_range1, TIntRange $int_range2): ?TIntRange + { + if ($int_range1->min_bound === null || $int_range2->min_bound === null) { + $new_min_bound = $int_range1->min_bound ?? $int_range2->min_bound; + } else { + $new_min_bound = self::getNewHighestBound($int_range1->min_bound, $int_range2->min_bound); + } + + if ($int_range1->max_bound === null || $int_range2->max_bound === null) { + $new_max_bound = $int_range1->max_bound ?? $int_range2->max_bound; + } else { + $new_max_bound = self::getNewLowestBound($int_range1->max_bound, $int_range2->max_bound); + } + + if ($new_min_bound !== null && $new_max_bound !== null && $new_min_bound > $new_max_bound) { + return null; + } + + return new self($new_min_bound, $new_max_bound); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php new file mode 100644 index 00000000..b7aea22c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php @@ -0,0 +1,129 @@ + $type_params + */ + public function __construct(array $type_params = []) + { + if (count($type_params) === 2) { + $this->has_docblock_params = true; + $this->type_params = $type_params; + } else { + $this->type_params = [Type::getMixed(), Type::getMixed()]; + } + } + + public function getKey(bool $include_extra = true): string + { + if ($include_extra && $this->extra_types) { + // do nothing + } + + return 'iterable'; + } + + public function getAssertionString(bool $exact = false): string + { + return 'iterable'; + } + + public function getId(bool $nested = false): string + { + $s = ''; + foreach ($this->type_params as $type_param) { + $s .= $type_param->getId() . ', '; + } + + $extra_types = ''; + + if ($this->extra_types) { + $extra_types = '&' . implode('&', $this->extra_types); + } + + return $this->value . '<' . substr($s, 0, -2) . '>' . $extra_types; + } + + public function __toString(): string + { + return $this->getId(); + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $php_major_version > 7 + || ($php_major_version === 7 && $php_minor_version >= 1) + ? 'iterable' + : null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return $this->type_params[0]->isMixed() && $this->type_params[1]->isMixed(); + } + + public function equals(Atomic $other_type, bool $ensure_source_equality): bool + { + if (!$other_type instanceof self) { + return false; + } + + if (count($this->type_params) !== count($other_type->type_params)) { + return false; + } + + foreach ($this->type_params as $i => $type_param) { + if (!$type_param->equals($other_type->type_params[$i], $ensure_source_equality)) { + return false; + } + } + + return true; + } + + public function getChildNodes(): array + { + return array_merge($this->type_params, $this->extra_types ?? []); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php new file mode 100644 index 00000000..05d2e710 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php @@ -0,0 +1,105 @@ +fq_classlike_name = $fq_classlike_name; + $this->const_name = $const_name; + } + + public function getKey(bool $include_extra = true): string + { + return 'key-of<' . $this->fq_classlike_name . '::' . $this->const_name . '>'; + } + + public function __toString(): string + { + return 'key-of<' . $this->fq_classlike_name . '::' . $this->const_name . '>'; + } + + public function getId(bool $nested = false): string + { + return $this->getKey(); + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + /** + * @param array $aliased_classes + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($this->fq_classlike_name === 'static') { + return 'key-ofconst_name . '>'; + } + + if ($this->fq_classlike_name === $this_class) { + return 'key-ofconst_name . '>'; + } + + if ($namespace && stripos($this->fq_classlike_name, $namespace . '\\') === 0) { + return 'key-of<' . preg_replace( + '/^' . preg_quote($namespace . '\\') . '/i', + '', + $this->fq_classlike_name + ) . '::' . $this->const_name . '>'; + } + + if (!$namespace && strpos($this->fq_classlike_name, '\\') === false) { + return 'key-of<' . $this->fq_classlike_name . '::' . $this->const_name . '>'; + } + + if (isset($aliased_classes[strtolower($this->fq_classlike_name)])) { + return 'key-of<' + . $aliased_classes[strtolower($this->fq_classlike_name)] + . '::' + . $this->const_name + . '>'; + } + + return 'key-of<\\' . $this->fq_classlike_name . '::' . $this->const_name . '>'; + } + + public function getAssertionString(bool $exact = false): string + { + return 'mixed'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php new file mode 100644 index 00000000..e3b7399e --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php @@ -0,0 +1,434 @@ + + */ + public $properties; + + /** + * @var array|null + */ + public $class_strings; + + /** + * @var bool - whether or not the objectlike has been created from an explicit array + */ + public $sealed = false; + + /** + * Whether or not the previous array had an unknown key type + * + * @var ?Union + */ + public $previous_key_type; + + /** + * Whether or not to allow new properties to be asserted on the given array + * + * @var ?Union + */ + public $previous_value_type; + + /** + * @var bool - if this is a list of sequential elements + */ + public $is_list = false; + + public const KEY = 'array'; + + /** + * Constructs a new instance of a generic type + * + * @param non-empty-array $properties + * @param array $class_strings + */ + public function __construct(array $properties, ?array $class_strings = null) + { + $this->properties = $properties; + $this->class_strings = $class_strings; + } + + public function __toString(): string + { + $property_strings = array_map( + function ($name, Union $type): string { + if ($this->is_list && $this->sealed) { + return (string) $type; + } + + $class_string_suffix = ''; + if (isset($this->class_strings[$name])) { + $class_string_suffix = '::class'; + } + + $name = $this->escapeAndQuote($name); + + return $name . $class_string_suffix . ($type->possibly_undefined ? '?' : '') . ': ' . $type; + }, + array_keys($this->properties), + $this->properties + ); + + if (!$this->is_list) { + sort($property_strings); + } + + /** @psalm-suppress MixedOperand */ + return static::KEY . '{' . implode(', ', $property_strings) . '}'; + } + + public function getId(bool $nested = false): string + { + $property_strings = array_map( + function ($name, Union $type): string { + if ($this->is_list && $this->sealed) { + return $type->getId(); + } + + $class_string_suffix = ''; + if (isset($this->class_strings[$name])) { + $class_string_suffix = '::class'; + } + + $name = $this->escapeAndQuote($name); + + return $name . $class_string_suffix . ($type->possibly_undefined ? '?' : '') . ': ' . $type->getId(); + }, + array_keys($this->properties), + $this->properties + ); + + if (!$this->is_list) { + sort($property_strings); + } + + /** @psalm-suppress MixedOperand */ + return static::KEY . '{' . + implode(', ', $property_strings) . + '}' + . ($this->previous_value_type + && (!$this->previous_value_type->isMixed() + || ($this->previous_key_type && !$this->previous_key_type->isArrayKey())) + ? '<' . ($this->previous_key_type ? $this->previous_key_type->getId() . ', ' : '') + . $this->previous_value_type->getId() . '>' + : ''); + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($use_phpdoc_format) { + return $this->getGenericArrayType()->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + true + ); + } + + /** @psalm-suppress MixedOperand */ + return static::KEY . '{' . + implode( + ', ', + array_map( + function ( + $name, + Union $type + ) use ( + $namespace, + $aliased_classes, + $this_class, + $use_phpdoc_format + ): string { + $class_string_suffix = ''; + if (isset($this->class_strings[$name])) { + $class_string_suffix = '::class'; + } + + $name = $this->escapeAndQuote($name); + + return $name . $class_string_suffix . ($type->possibly_undefined ? '?' : '') . ': ' . + $type->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + $use_phpdoc_format + ); + }, + array_keys($this->properties), + $this->properties + ) + ) . + '}'; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): string { + return $this->getKey(); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function getGenericKeyType(): Union + { + $key_types = []; + + foreach ($this->properties as $key => $_) { + if (is_int($key)) { + $key_types[] = new TLiteralInt($key); + } elseif (isset($this->class_strings[$key])) { + $key_types[] = new TLiteralClassString($key); + } else { + $key_types[] = new TLiteralString($key); + } + } + + $key_type = TypeCombiner::combine($key_types); + + $key_type->possibly_undefined = false; + + return Type::combineUnionTypes($this->previous_key_type, $key_type); + } + + public function getGenericValueType(): Union + { + $value_type = null; + + foreach ($this->properties as $property) { + $value_type = Type::combineUnionTypes(clone $property, $value_type); + } + + $value_type = Type::combineUnionTypes($this->previous_value_type, $value_type); + + $value_type->possibly_undefined = false; + + return $value_type; + } + + public function getGenericArrayType(bool $allow_non_empty = true): TArray + { + $key_types = []; + $value_type = null; + + $has_defined_keys = false; + + foreach ($this->properties as $key => $property) { + if (is_int($key)) { + $key_types[] = new TLiteralInt($key); + } elseif (isset($this->class_strings[$key])) { + $key_types[] = new TLiteralClassString($key); + } else { + $key_types[] = new TLiteralString($key); + } + + $value_type = Type::combineUnionTypes(clone $property, $value_type); + + if (!$property->possibly_undefined) { + $has_defined_keys = true; + } + } + + $key_type = TypeCombiner::combine($key_types); + + $value_type = Type::combineUnionTypes($this->previous_value_type, $value_type); + $key_type = Type::combineUnionTypes($this->previous_key_type, $key_type); + + $value_type->possibly_undefined = false; + + if ($allow_non_empty && ($this->previous_value_type || $has_defined_keys)) { + $array_type = new TNonEmptyArray([$key_type, $value_type]); + } else { + $array_type = new TArray([$key_type, $value_type]); + } + + return $array_type; + } + + public function isNonEmpty(): bool + { + foreach ($this->properties as $property) { + if (!$property->possibly_undefined) { + return true; + } + } + + return false; + } + + public function __clone() + { + foreach ($this->properties as &$property) { + $property = clone $property; + } + } + + public function getKey(bool $include_extra = true): string + { + /** @var string */ + return static::KEY; + } + + public function replaceTemplateTypesWithStandins( + TemplateResult $template_result, + ?Codebase $codebase = null, + ?StatementsAnalyzer $statements_analyzer = null, + ?Atomic $input_type = null, + ?int $input_arg_offset = null, + ?string $calling_class = null, + ?string $calling_function = null, + bool $replace = true, + bool $add_lower_bound = false, + int $depth = 0 + ): Atomic { + $object_like = clone $this; + + foreach ($this->properties as $offset => $property) { + $input_type_param = null; + + if ($input_type instanceof TKeyedArray + && isset($input_type->properties[$offset]) + ) { + $input_type_param = $input_type->properties[$offset]; + } + + $object_like->properties[$offset] = TemplateStandinTypeReplacer::replace( + $property, + $template_result, + $codebase, + $statements_analyzer, + $input_type_param, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + null, + $depth + ); + } + + return $object_like; + } + + public function replaceTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + foreach ($this->properties as $property) { + TemplateInferredTypeReplacer::replace( + $property, + $template_result, + $codebase + ); + } + } + + public function getChildNodes(): array + { + return $this->properties; + } + + public function equals(Atomic $other_type, bool $ensure_source_equality): bool + { + if (get_class($other_type) !== static::class) { + return false; + } + + if (count($this->properties) !== count($other_type->properties)) { + return false; + } + + if ($this->sealed !== $other_type->sealed) { + return false; + } + + foreach ($this->properties as $property_name => $property_type) { + if (!isset($other_type->properties[$property_name])) { + return false; + } + + if (!$property_type->equals($other_type->properties[$property_name], $ensure_source_equality)) { + return false; + } + } + + return true; + } + + public function getAssertionString(bool $exact = false): string + { + return $this->getKey(); + } + + public function getList(): TList + { + if (!$this->is_list) { + throw new UnexpectedValueException('Object-like array must be a list for conversion'); + } + + return $this->isNonEmpty() + ? new TNonEmptyList($this->getGenericValueType()) + : new TList($this->getGenericValueType()); + } + + /** + * @param string|int $name + * @return string|int + */ + private function escapeAndQuote($name) + { + if (is_string($name) && ($name === '' || preg_match('/[^a-zA-Z0-9_]/', $name))) { + $name = '\'' . str_replace("\n", '\n', addslashes($name)) . '\''; + } + + return $name; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TList.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TList.php new file mode 100644 index 00000000..e6a7a478 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TList.php @@ -0,0 +1,209 @@ +type_param = $type_param; + } + + public function __toString(): string + { + /** @psalm-suppress MixedOperand */ + return static::KEY . '<' . $this->type_param . '>'; + } + + public function getId(bool $nested = false): string + { + /** @psalm-suppress MixedOperand */ + return static::KEY . '<' . $this->type_param->getId() . '>'; + } + + public function __clone() + { + $this->type_param = clone $this->type_param; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($use_phpdoc_format) { + return (new TArray([Type::getInt(), $this->type_param])) + ->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + true + ); + } + + /** @psalm-suppress MixedOperand */ + return static::KEY + . '<' + . $this->type_param->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + false + ) + . '>'; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): string { + return 'array'; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function getKey(bool $include_extra = true): string + { + return 'array'; + } + + public function replaceTemplateTypesWithStandins( + TemplateResult $template_result, + ?Codebase $codebase = null, + ?StatementsAnalyzer $statements_analyzer = null, + ?Atomic $input_type = null, + ?int $input_arg_offset = null, + ?string $calling_class = null, + ?string $calling_function = null, + bool $replace = true, + bool $add_lower_bound = false, + int $depth = 0 + ): Atomic { + $list = clone $this; + + foreach ([Type::getInt(), $list->type_param] as $offset => $type_param) { + $input_type_param = null; + + if (($input_type instanceof TGenericObject + || $input_type instanceof TIterable + || $input_type instanceof TArray) + && + isset($input_type->type_params[$offset]) + ) { + $input_type_param = clone $input_type->type_params[$offset]; + } elseif ($input_type instanceof TKeyedArray) { + if ($offset === 0) { + $input_type_param = $input_type->getGenericKeyType(); + } else { + $input_type_param = $input_type->getGenericValueType(); + } + } elseif ($input_type instanceof TList) { + if ($offset === 0) { + continue; + } + + $input_type_param = clone $input_type->type_param; + } + + $type_param = TemplateStandinTypeReplacer::replace( + $type_param, + $template_result, + $codebase, + $statements_analyzer, + $input_type_param, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + null, + $depth + 1 + ); + + if ($offset === 1) { + $list->type_param = $type_param; + } + } + + return $list; + } + + public function replaceTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + TemplateInferredTypeReplacer::replace( + $this->type_param, + $template_result, + $codebase + ); + } + + public function equals(Atomic $other_type, bool $ensure_source_equality): bool + { + if (get_class($other_type) !== static::class) { + return false; + } + + if (!$this->type_param->equals($other_type->type_param, $ensure_source_equality)) { + return false; + } + + return true; + } + + public function getAssertionString(bool $exact = false): string + { + if (!$exact || $this->type_param->isMixed()) { + return 'list'; + } + + return $this->toNamespacedString(null, [], null, false); + } + + public function getChildNodes(): array + { + return [$this->type_param]; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php new file mode 100644 index 00000000..a36429d3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php @@ -0,0 +1,105 @@ +definite_class = $definite_class; + } + + public function __toString(): string + { + return 'class-string'; + } + + public function getKey(bool $include_extra = true): string + { + return 'class-string(' . $this->value . ')'; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): string { + return 'string'; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function getId(bool $nested = false): string + { + return $this->value . '::class'; + } + + public function getAssertionString(bool $exact = false): string + { + return $this->getKey(); + } + + /** + * @param array $aliased_classes + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($use_phpdoc_format) { + return 'string'; + } + + if ($this->value === 'static') { + return 'static::class'; + } + + if ($this->value === $this_class) { + return 'self::class'; + } + + if ($namespace && stripos($this->value, $namespace . '\\') === 0) { + return preg_replace( + '/^' . preg_quote($namespace . '\\') . '/i', + '', + $this->value + ) . '::class'; + } + + if (!$namespace && strpos($this->value, '\\') === false) { + return $this->value . '::class'; + } + + if (isset($aliased_classes[strtolower($this->value)])) { + return $aliased_classes[strtolower($this->value)] . '::class'; + } + + return '\\' . $this->value . '::class'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php new file mode 100644 index 00000000..05a7819a --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php @@ -0,0 +1,40 @@ +value = $value; + } + + public function getKey(bool $include_extra = true): string + { + return 'float(' . $this->value . ')'; + } + + public function getId(bool $nested = false): string + { + return 'float(' . $this->value . ')'; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return 'float'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php new file mode 100644 index 00000000..282dae12 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php @@ -0,0 +1,45 @@ +value = $value; + } + + public function getKey(bool $include_extra = true): string + { + return 'int(' . $this->value . ')'; + } + + public function getId(bool $nested = false): string + { + return (string) $this->value; + } + + public function getAssertionString(bool $exact = false): string + { + return 'int(' . $this->value . ')'; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return $use_phpdoc_format ? 'int' : (string) $this->value; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php new file mode 100644 index 00000000..e19cfb8d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getKey(bool $include_extra = true): string + { + return 'string(' . $this->value . ')'; + } + + public function getId(bool $nested = false): string + { + // quote control characters, backslashes and double quote + $no_newline_value = addcslashes($this->value, "\0..\37\\\""); + if (mb_strlen($this->value) > 80) { + return '"' . mb_substr($no_newline_value, 0, 80) . '...' . '"'; + } + + return '"' . $no_newline_value . '"'; + } + + public function getAssertionString(bool $exact = false): string + { + return 'string(' . $this->value . ')'; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return $use_phpdoc_format ? 'string' : "'" . $this->value . "'"; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php new file mode 100644 index 00000000..b1b34cd4 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php @@ -0,0 +1,16 @@ +from_loop_isset = $from_loop_isset; + } + + public function __toString(): string + { + return 'mixed'; + } + + public function getKey(bool $include_extra = true): string + { + return 'mixed'; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $php_major_version >= 8 ? 'mixed' : null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return $php_major_version >= 8; + } + + public function getAssertionString(bool $exact = false): string + { + return 'mixed'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php new file mode 100644 index 00000000..e9eebc94 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php @@ -0,0 +1,160 @@ +value = $value; + $this->was_static = $was_static; + $this->definite_class = $definite_class; + } + + public function __toString(): string + { + return $this->getKey(); + } + + public function getKey(bool $include_extra = true): string + { + if ($include_extra && $this->extra_types) { + return $this->value . '&' . implode('&', $this->extra_types); + } + + return $this->value; + } + + public function getId(bool $nested = false): string + { + if ($this->extra_types) { + return $this->value . '&' . implode( + '&', + array_map( + function ($type) { + return $type->getId(true); + }, + $this->extra_types + ) + ); + } + + return $this->was_static ? $this->value . '&static' : $this->value; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($this->value === 'static') { + return 'static'; + } + + $intersection_types = $this->getNamespacedIntersectionTypes( + $namespace, + $aliased_classes, + $this_class, + $use_phpdoc_format + ); + + return Type::getStringFromFQCLN( + $this->value, + $namespace, + $aliased_classes, + $this_class, + true, + $this->was_static + ) . $intersection_types; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + if ($this->value === 'static') { + return $php_major_version >= 8 ? 'static' : null; + } + + if ($this->was_static && $this->value === $this_class) { + return $php_major_version >= 8 ? 'static' : 'self'; + } + + $result = $this->toNamespacedString($namespace, $aliased_classes, $this_class, false); + $intersection = strrpos($result, '&'); + if ($intersection === false || ( + ($php_major_version === 8 && $php_minor_version >= 1) || + ($php_major_version >= 9) + ) + ) { + return $result; + } + return substr($result, $intersection+1); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return ($this->value !== 'static' && $this->was_static === false) || $php_major_version >= 8; + } + + public function replaceTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + $this->replaceIntersectionTemplateTypesWithArgTypes($template_result, $codebase); + } + + public function getChildNodes(): array + { + return $this->extra_types ?? []; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php new file mode 100644 index 00000000..1b972d0b --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php @@ -0,0 +1,40 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php new file mode 100644 index 00000000..8dce93d8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php @@ -0,0 +1,20 @@ +`. + * It expects an array with two elements, both union types. + */ +class TNonEmptyArray extends TArray +{ + /** + * @var int|null + */ + public $count; + + /** + * @var string + */ + public $value = 'non-empty-array'; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php new file mode 100644 index 00000000..cf18019d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php @@ -0,0 +1,21 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php new file mode 100644 index 00000000..8651ff1c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php @@ -0,0 +1,37 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php new file mode 100644 index 00000000..c86027a4 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php @@ -0,0 +1,34 @@ +getKey(); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function getAssertionString(bool $exact = false): string + { + return 'string'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php new file mode 100644 index 00000000..e2a87219 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php @@ -0,0 +1,42 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $php_major_version > 7 + || ($php_major_version === 7 && $php_minor_version >= 2) + ? $this->getKey() + : null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php new file mode 100644 index 00000000..fa68b797 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php @@ -0,0 +1,287 @@ + + */ + public $properties; + + /** + * @var array + */ + public $methods; + + /** + * Constructs a new instance of a generic type + * + * @param array $properties + * @param array $methods + */ + public function __construct(array $properties, array $methods = []) + { + $this->properties = $properties; + $this->methods = $methods; + } + + public function __toString(): string + { + $extra_types = ''; + + if ($this->extra_types) { + $extra_types = '&' . implode('&', $this->extra_types); + } + + $properties_string = implode( + ', ', + array_map( + /** + * @param string|int $name + */ + function ($name, Union $type): string { + return $name . ($type->possibly_undefined ? '?' : '') . ':' . $type; + }, + array_keys($this->properties), + $this->properties + ) + ); + + $methods_string = implode( + ', ', + array_map( + function (string $name): string { + return $name . '()'; + }, + array_keys($this->methods) + ) + ); + + return 'object{' + . $properties_string . ($methods_string && $properties_string ? ', ' : '') + . $methods_string + . '}' . $extra_types; + } + + public function getId(bool $nested = false): string + { + $extra_types = ''; + + if ($this->extra_types) { + $extra_types = '&' . implode('&', $this->extra_types); + } + + $properties_string = implode( + ', ', + array_map( + /** + * @param string|int $name + */ + function ($name, Union $type): string { + return $name . ($type->possibly_undefined ? '?' : '') . ':' . $type->getId(); + }, + array_keys($this->properties), + $this->properties + ) + ); + + $methods_string = implode( + ', ', + array_map( + function (string $name): string { + return $name . '()'; + }, + array_keys($this->methods) + ) + ); + + return 'object{' + . $properties_string . ($methods_string && $properties_string ? ', ' : '') + . $methods_string + . '}' . $extra_types; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($use_phpdoc_format) { + return 'object'; + } + + return 'object{' . + implode( + ', ', + array_map( + /** + * @param string|int $name + */ + function ( + $name, + Union $type + ) use ( + $namespace, + $aliased_classes, + $this_class, + $use_phpdoc_format + ): string { + return $name . ($type->possibly_undefined ? '?' : '') . ':' . $type->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + $use_phpdoc_format + ); + }, + array_keys($this->properties), + $this->properties + ) + ) . + '}'; + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): string { + return $this->getKey(); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function __clone() + { + foreach ($this->properties as &$property) { + $property = clone $property; + } + } + + public function equals(Atomic $other_type, bool $ensure_source_equality): bool + { + if (!$other_type instanceof self) { + return false; + } + + if (count($this->properties) !== count($other_type->properties)) { + return false; + } + + if ($this->methods !== $other_type->methods) { + return false; + } + + foreach ($this->properties as $property_name => $property_type) { + if (!isset($other_type->properties[$property_name])) { + return false; + } + + if (!$property_type->equals($other_type->properties[$property_name], $ensure_source_equality)) { + return false; + } + } + + return true; + } + + public function replaceTemplateTypesWithStandins( + TemplateResult $template_result, + ?Codebase $codebase = null, + ?StatementsAnalyzer $statements_analyzer = null, + ?Atomic $input_type = null, + ?int $input_arg_offset = null, + ?string $calling_class = null, + ?string $calling_function = null, + bool $replace = true, + bool $add_lower_bound = false, + int $depth = 0 + ): Atomic { + $object_like = clone $this; + + foreach ($this->properties as $offset => $property) { + $input_type_param = null; + + if ($input_type instanceof TKeyedArray + && isset($input_type->properties[$offset]) + ) { + $input_type_param = $input_type->properties[$offset]; + } + + $object_like->properties[$offset] = TemplateStandinTypeReplacer::replace( + $property, + $template_result, + $codebase, + $statements_analyzer, + $input_type_param, + $input_arg_offset, + $calling_class, + $calling_function, + $replace, + $add_lower_bound, + null, + $depth + ); + } + + return $object_like; + } + + public function replaceTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + foreach ($this->properties as $property) { + TemplateInferredTypeReplacer::replace( + $property, + $template_result, + $codebase + ); + } + } + + public function getChildNodes(): array + { + return array_merge($this->properties, $this->extra_types !== null ? array_values($this->extra_types) : []); + } + + public function getAssertionString(bool $exact = false): string + { + return $this->getKey(); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php new file mode 100644 index 00000000..4e45ef06 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php @@ -0,0 +1,41 @@ + 0) + * @deprecated will be removed in Psalm 5 + */ +class TPositiveInt extends TInt +{ + public function getId(bool $nested = false): string + { + return 'positive-int'; + } + + public function __toString(): string + { + return 'positive-int'; + } + + /** + * @return false + */ + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return $use_phpdoc_format ? 'int' : 'positive-int'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php new file mode 100644 index 00000000..49ee6509 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php @@ -0,0 +1,39 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php new file mode 100644 index 00000000..0cb6f0b8 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php @@ -0,0 +1,43 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function getAssertionString(bool $exact = false): string + { + return 'scalar'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php new file mode 100644 index 00000000..13db2024 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php @@ -0,0 +1,10 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $php_major_version >= 7 ? 'string' : null; + } + + public function __toString(): string + { + return 'string'; + } + + public function getKey(bool $include_extra = true): string + { + return 'string'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php new file mode 100644 index 00000000..72e72c38 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php @@ -0,0 +1,66 @@ +array_param_name = $array_param_name; + $this->offset_param_name = $offset_param_name; + $this->defining_class = $defining_class; + } + + public function getKey(bool $include_extra = true): string + { + return $this->array_param_name . '[' . $this->offset_param_name . ']'; + } + + public function __toString(): string + { + return $this->getKey(); + } + + public function getId(bool $nested = false): string + { + return $this->getKey(); + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php new file mode 100644 index 00000000..01e1dbcd --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php @@ -0,0 +1,63 @@ +param_name = $param_name; + $this->defining_class = $defining_class; + $this->as = $as; + } + + public function getKey(bool $include_extra = true): string + { + return 'key-of<' . $this->param_name . '>'; + } + + public function __toString(): string + { + return 'key-of<' . $this->param_name . '>'; + } + + public function getId(bool $nested = false): string + { + return 'key-of<' . $this->param_name . ':' . $this->defining_class . ' as ' . $this->as->getId() . '>'; + } + + /** + * @param array $aliased_classes + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return 'key-of<' . $this->param_name . '>'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php new file mode 100644 index 00000000..66c0af83 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php @@ -0,0 +1,135 @@ +param_name = $param_name; + $this->as = $extends; + $this->defining_class = $defining_class; + } + + public function __toString(): string + { + return $this->param_name; + } + + public function getKey(bool $include_extra = true): string + { + if ($include_extra && $this->extra_types) { + return $this->param_name . ':' . $this->defining_class . '&' . implode('&', $this->extra_types); + } + + return $this->param_name . ':' . $this->defining_class; + } + + public function getAssertionString(bool $exact = false): string + { + return $this->as->getId(); + } + + public function getId(bool $nested = false): string + { + if ($this->extra_types) { + return '(' . $this->param_name . ':' . $this->defining_class . ' as ' . $this->as->getId() + . ')&' . implode('&', array_map(function ($type) { + return $type->getId(true); + }, $this->extra_types)); + } + + return ($nested ? '(' : '') . $this->param_name + . ':' . $this->defining_class + . ' as ' . $this->as->getId() . ($nested ? ')' : ''); + } + + /** + * @param array $aliased_classes + * + * @return null + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($use_phpdoc_format) { + return $this->as->toNamespacedString( + $namespace, + $aliased_classes, + $this_class, + true + ); + } + + $intersection_types = $this->getNamespacedIntersectionTypes( + $namespace, + $aliased_classes, + $this_class, + false + ); + + return $this->param_name . $intersection_types; + } + + public function getChildNodes(): array + { + return [$this->as]; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function replaceTemplateTypesWithArgTypes( + TemplateResult $template_result, + ?Codebase $codebase + ): void { + $this->replaceIntersectionTemplateTypesWithArgTypes($template_result, $codebase); + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php new file mode 100644 index 00000000..bd683122 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php @@ -0,0 +1,65 @@ +param_name = $param_name; + $this->as = $as; + $this->as_type = $as_type; + $this->defining_class = $defining_class; + } + + public function getKey(bool $include_extra = true): string + { + return 'class-string<' . $this->param_name . '>'; + } + + public function __toString(): string + { + return 'class-string<' . $this->param_name . '>'; + } + + public function getId(bool $nested = false): string + { + return 'class-string<' . $this->param_name . ':' . $this->defining_class + . ' as ' . ($this->as_type ? $this->as_type->getId() : $this->as) . '>'; + } + + public function getAssertionString(bool $exact = false): string + { + return 'class-string<' . $this->param_name . '>'; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return $this->param_name . '::class'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php new file mode 100644 index 00000000..65008a4d --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php @@ -0,0 +1,55 @@ +getKey(); + } + + public function getId(bool $nested = false): string + { + return $this->getKey(); + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return 'string'; + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + return 'trait-string'; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php new file mode 100644 index 00000000..208c70ee --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php @@ -0,0 +1,27 @@ +|null + */ + public $extra_types; + + /** @var string */ + public $declaring_fq_classlike_name; + + /** @var string */ + public $alias_name; + + public function __construct(string $declaring_fq_classlike_name, string $alias_name) + { + $this->declaring_fq_classlike_name = $declaring_fq_classlike_name; + $this->alias_name = $alias_name; + } + + public function getKey(bool $include_extra = true): string + { + return 'type-alias(' . $this->declaring_fq_classlike_name . '::' . $this->alias_name . ')'; + } + + public function __toString(): string + { + if ($this->extra_types) { + return $this->getKey() . '&' . implode( + '&', + array_map( + 'strval', + $this->extra_types + ) + ); + } + + return $this->getKey(); + } + + public function getId(bool $nested = false): string + { + if ($this->extra_types) { + return $this->getKey() . '&' . implode( + '&', + array_map( + function ($type) { + return $type->getId(true); + }, + $this->extra_types + ) + ); + } + + return $this->getKey(); + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + public function getAssertionString(bool $exact = false): string + { + return 'mixed'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php new file mode 100644 index 00000000..cbeb6b4c --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php @@ -0,0 +1,80 @@ +fq_classlike_name = $fq_classlike_name; + $this->const_name = $const_name; + } + + public function getKey(bool $include_extra = true): string + { + return 'value-of<' . $this->fq_classlike_name . '::' . $this->const_name . '>'; + } + + public function __toString(): string + { + return 'value-of<' . $this->fq_classlike_name . '::' . $this->const_name . '>'; + } + + public function getId(bool $nested = false): string + { + return $this->getKey(); + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return false; + } + + /** + * @param array $aliased_classes + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + if ($this->fq_classlike_name === 'static') { + return 'value-ofconst_name . '>'; + } + + return 'value-of<' + . Type::getStringFromFQCLN($this->fq_classlike_name, $namespace, $aliased_classes, $this_class) + . '>::' . $this->const_name . '>'; + } + + public function getAssertionString(bool $exact = false): string + { + return 'mixed'; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php new file mode 100644 index 00000000..cec58cd4 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php @@ -0,0 +1,41 @@ + $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + return $php_major_version > 7 + || ($php_major_version === 7 && $php_minor_version >= 1) + ? $this->getKey() : null; + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + return true; + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/NodeVisitor.php b/vendor/vimeo/psalm/src/Psalm/Type/NodeVisitor.php new file mode 100644 index 00000000..d33325a5 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/NodeVisitor.php @@ -0,0 +1,50 @@ +enterNode($node); + + if ($visitor_result === self::DONT_TRAVERSE_CHILDREN) { + return true; + } + + if ($visitor_result === self::STOP_TRAVERSAL) { + return false; + } + + foreach ($node->getChildNodes() as $child_node) { + if ($this->traverse($child_node) === false) { + return false; + } + } + + return true; + } + + /** + * @param array $nodes + */ + public function traverseArray(array $nodes): void + { + foreach ($nodes as $node) { + if ($this->traverse($node) === false) { + return; + } + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Reconciler.php b/vendor/vimeo/psalm/src/Psalm/Type/Reconciler.php new file mode 100644 index 00000000..60e042b7 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Reconciler.php @@ -0,0 +1,1110 @@ +> */ + private static $broken_paths = []; + + /** + * Takes two arrays and consolidates them, removing null values from existing types where applicable + * + * @param array>> $new_types + * @param array>> $active_new_types - types we can complain about + * @param array $existing_types + * @param array $changed_var_ids + * @param array $referenced_var_ids + * @param array> $template_type_map + * + * @return array + */ + public static function reconcileKeyedTypes( + array $new_types, + array $active_new_types, + array $existing_types, + array &$changed_var_ids, + array $referenced_var_ids, + StatementsAnalyzer $statements_analyzer, + array $template_type_map = [], + bool $inside_loop = false, + ?CodeLocation $code_location = null, + bool $negated = false + ): array { + if (!$new_types) { + return $existing_types; + } + + $suppressed_issues = $statements_analyzer->getSuppressedIssues(); + + $old_new_types = $new_types; + + $new_types = self::addNestedAssertions($new_types, $existing_types); + + // make sure array keys come after base keys + ksort($new_types); + + $codebase = $statements_analyzer->getCodebase(); + + foreach ($new_types as $key => $new_type_parts) { + if (strpos($key, '::') + && !strpos($key, '$') + && !strpos($key, '[') + ) { + continue; + } + + $has_negation = false; + $has_isset = false; + $has_inverted_isset = false; + $has_falsyish = false; + $has_empty = false; + $has_count_check = false; + $is_real = ($old_new_types[$key] ?? null) === $new_type_parts; + $is_equality = $is_real; + + foreach ($new_type_parts as $new_type_part_parts) { + foreach ($new_type_part_parts as $new_type_part_part) { + if ($new_type_part_part[0] === '!') { + $has_negation = true; + } + + $has_isset = $has_isset + || $new_type_part_part === 'isset' + || $new_type_part_part === '=isset' + || $new_type_part_part === 'array-key-exists' + || $new_type_part_part === '=string-array-access'; + + $has_empty = $has_empty || $new_type_part_part === 'empty'; + + $has_falsyish = $has_falsyish + || $new_type_part_part === 'empty' + || $new_type_part_part === 'falsy'; + + $is_equality = $is_equality + && $new_type_part_part[0] === '=' + && $new_type_part_part !== '=isset'; + + $has_inverted_isset = $has_inverted_isset || $new_type_part_part === '!isset'; + + $has_count_check = $has_count_check + || $new_type_part_part === 'non-empty-countable'; + } + } + + $did_type_exist = isset($existing_types[$key]); + + $has_object_array_access = false; + + $result_type = isset($existing_types[$key]) + ? clone $existing_types[$key] + : self::getValueForKey( + $codebase, + $key, + $existing_types, + $new_types, + $code_location, + $has_isset, + $has_inverted_isset, + $has_empty, + $inside_loop, + $has_object_array_access + ); + + if ($result_type && $result_type->isUnionEmpty()) { + throw new InvalidArgumentException('Union::$types cannot be empty after get value for ' . $key); + } + + $before_adjustment = $result_type ? clone $result_type : null; + + $failed_reconciliation = self::RECONCILIATION_OK; + + foreach ($new_type_parts as $offset => $new_type_part_parts) { + $orred_type = null; + + foreach ($new_type_part_parts as $new_type_part_part) { + if ($new_type_part_part[0] === '@' + || ($new_type_part_part[0] === '!' + && $new_type_part_part[1] === '@') + ) { + if ($new_type_part_part[0] === '!') { + $nested_negated = !$negated; + + /** @var array>> */ + $data = json_decode(substr($new_type_part_part, 2), true); + } else { + $nested_negated = $negated; + /** @var array>> */ + $data = json_decode(substr($new_type_part_part, 1), true); + } + + $existing_types = self::reconcileKeyedTypes( + $data, + $data, + $existing_types, + $changed_var_ids, + $referenced_var_ids, + $statements_analyzer, + $template_type_map, + $inside_loop, + $code_location, + $nested_negated + ); + + $new_type_part_part = ($nested_negated ? '' : '!') . 'falsy'; + } + + $result_type_candidate = AssertionReconciler::reconcile( + $new_type_part_part, + $result_type ? clone $result_type : null, + $key, + $statements_analyzer, + $inside_loop, + $template_type_map, + $code_location + && isset($referenced_var_ids[$key]) + && isset($active_new_types[$key][$offset]) + ? $code_location + : null, + $suppressed_issues, + $failed_reconciliation, + $negated + ); + + if ($result_type_candidate->isUnionEmpty()) { + $result_type_candidate->addType(new TEmpty); + } + + $orred_type = Type::combineUnionTypes( + $result_type_candidate, + $orred_type, + $codebase + ); + } + + $result_type = $orred_type; + } + + if (!$result_type) { + throw new UnexpectedValueException('$result_type should not be null'); + } + + if (!$did_type_exist && $result_type->isEmpty()) { + continue; + } + + if (($statements_analyzer->data_flow_graph instanceof TaintFlowGraph + && (!$result_type->hasScalarType() + || ($result_type->hasString() && !$result_type->hasLiteralString()))) + || $statements_analyzer->data_flow_graph instanceof VariableUseGraph + ) { + if ($before_adjustment && $before_adjustment->parent_nodes) { + $result_type->parent_nodes = $before_adjustment->parent_nodes; + } elseif (!$did_type_exist && $code_location) { + $result_type->parent_nodes = $statements_analyzer->getParentNodesForPossiblyUndefinedVariable( + $key + ); + } + } + + if ($before_adjustment && $before_adjustment->by_ref) { + $result_type->by_ref = true; + } + + $type_changed = !$before_adjustment || !$result_type->equals($before_adjustment); + + if ($type_changed || $failed_reconciliation) { + $changed_var_ids[$key] = true; + + if (substr($key, -1) === ']' && !$has_inverted_isset && !$has_empty && !$is_equality) { + $key_parts = self::breakUpPathIntoParts($key); + self::adjustTKeyedArrayType( + $key_parts, + $existing_types, + $changed_var_ids, + $result_type + ); + } elseif ($key !== '$this') { + foreach ($existing_types as $new_key => $_) { + if ($new_key === $key) { + continue; + } + + if (!isset($new_types[$new_key]) + && preg_match('/' . preg_quote($key, '/') . '[\]\[\-]/', $new_key) + && $is_real + ) { + unset($existing_types[$new_key]); + } + } + } + } elseif (!$has_negation && !$has_falsyish && !$has_isset) { + $changed_var_ids[$key] = true; + } + + if ($failed_reconciliation === self::RECONCILIATION_EMPTY) { + $result_type->failed_reconciliation = true; + } + + if (!$has_object_array_access) { + $existing_types[$key] = $result_type; + } + } + + return $existing_types; + } + + /** + * This generates a list of extra assertions for an assertion on a nested key. + * + * For example ['$a[0]->foo->bar' => 'isset'] + * + * generates the assertions + * + * [ + * '$a' => '=int-or-string-array-access', + * '$a[0]' => '=isset', + * '$a[0]->foo' => '=isset', + * '$a[0]->foo->bar' => 'isset' // original assertion + * ] + * + * @param array>> $new_types + * @param array $existing_types + * + * @return array>> + */ + private static function addNestedAssertions(array $new_types, array $existing_types): array + { + foreach ($new_types as $nk => $type) { + if (strpos($nk, '[') || strpos($nk, '->')) { + if ($type[0][0] === '=isset' + || $type[0][0] === '!=empty' + || $type[0][0] === 'isset' + || $type[0][0] === '!empty' + ) { + $key_parts = self::breakUpPathIntoParts($nk); + + $base_key = array_shift($key_parts); + + if ($base_key[0] !== '$' && count($key_parts) > 2 && $key_parts[0] === '::$') { + $base_key .= array_shift($key_parts); + $base_key .= array_shift($key_parts); + } + + if (!isset($existing_types[$base_key]) || $existing_types[$base_key]->isNullable()) { + if (!isset($new_types[$base_key])) { + $new_types[$base_key] = [['=isset']]; + } else { + $new_types[$base_key][] = ['=isset']; + } + } + + while ($key_parts) { + $divider = array_shift($key_parts); + + if ($divider === '[') { + $array_key = array_shift($key_parts); + array_shift($key_parts); + + $new_base_key = $base_key . '[' . $array_key . ']'; + + if (strpos($array_key, '\'') !== false) { + $new_types[$base_key][] = ['=string-array-access']; + } else { + $new_types[$base_key][] = ['=int-or-string-array-access']; + } + + $base_key = $new_base_key; + + continue; + } + + if ($divider === '->') { + $property_name = array_shift($key_parts); + $new_base_key = $base_key . '->' . $property_name; + + if (!isset($new_types[$base_key])) { + $new_types[$base_key] = [['=isset']]; + } + + $base_key = $new_base_key; + } else { + break; + } + + if (!$key_parts) { + break; + } + + if (!isset($new_types[$base_key])) { + $new_types[$base_key] = [['!~bool'], ['!~int'], ['=isset']]; + } else { + $new_types[$base_key][] = ['!~bool']; + $new_types[$base_key][] = ['!~int']; + $new_types[$base_key][] = ['=isset']; + } + } + } + + if ($type[0][0] === 'array-key-exists') { + $key_parts = self::breakUpPathIntoParts($nk); + + if (count($key_parts) === 4 + && $key_parts[1] === '[' + && $key_parts[2][0] !== '\'' + && !is_numeric($key_parts[2]) + ) { + if ($key_parts[0][0] === '$') { + if (isset($new_types[$key_parts[0]])) { + $new_types[$key_parts[0]][] = ['=has-array-key-' . $key_parts[2]]; + } else { + $new_types[$key_parts[0]] = [['=has-array-key-' . $key_parts[2]]]; + } + } + } + } + } + } + + return $new_types; + } + + /** + * @return non-empty-list + */ + public static function breakUpPathIntoParts(string $path): array + { + if (isset(self::$broken_paths[$path])) { + return self::$broken_paths[$path]; + } + + $chars = str_split($path); + + $string_char = null; + $escape_char = false; + $brackets = 0; + + $parts = ['']; + $parts_offset = 0; + + for ($i = 0, $char_count = count($chars); $i < $char_count; ++$i) { + $char = $chars[$i]; + + if ($string_char) { + if ($char === $string_char && !$escape_char) { + $string_char = null; + } + + if ($char === '\\') { + $escape_char = !$escape_char; + } + + $parts[$parts_offset] .= $char; + continue; + } + + switch ($char) { + case '[': + case ']': + $parts_offset++; + $parts[$parts_offset] = $char; + ++$parts_offset; + + if ($char === '[') { + $brackets++; + } else { + $brackets--; + } + + continue 2; + + case '\'': + case '"': + if (!isset($parts[$parts_offset])) { + $parts[$parts_offset] = ''; + } + $parts[$parts_offset] .= $char; + $string_char = $char; + + continue 2; + + case ':': + if (!$brackets + && $i < $char_count - 2 + && $chars[$i + 1] === ':' + && $chars[$i + 2] === '$' + ) { + ++$i; + ++$i; + + ++$parts_offset; + $parts[$parts_offset] = '::$'; + ++$parts_offset; + continue 2; + } + // fall through + + case '-': + if (!$brackets + && $i < $char_count - 1 + && $chars[$i + 1] === '>' + ) { + ++$i; + + ++$parts_offset; + $parts[$parts_offset] = '->'; + ++$parts_offset; + continue 2; + } + // fall through + + // no break + default: + if (!isset($parts[$parts_offset])) { + $parts[$parts_offset] = ''; + } + $parts[$parts_offset] .= $char; + } + } + + $parts = array_values($parts); + + self::$broken_paths[$path] = $parts; + + return $parts; + } + + /** + * Gets the type for a given (non-existent key) based on the passed keys + * + * @param array $existing_keys + * @param array $new_assertions + */ + private static function getValueForKey( + Codebase $codebase, + string $key, + array &$existing_keys, + array $new_assertions, + ?CodeLocation $code_location, + bool $has_isset, + bool $has_inverted_isset, + bool $has_empty, + bool $inside_loop, + bool &$has_object_array_access + ): ?Union { + $key_parts = self::breakUpPathIntoParts($key); + + if (count($key_parts) === 1) { + return isset($existing_keys[$key_parts[0]]) ? clone $existing_keys[$key_parts[0]] : null; + } + + $base_key = array_shift($key_parts); + + if ($base_key[0] !== '$' && count($key_parts) > 2 && $key_parts[0] === '::$') { + $base_key .= array_shift($key_parts); + $base_key .= array_shift($key_parts); + } + + if (!isset($existing_keys[$base_key])) { + if (strpos($base_key, '::')) { + [$fq_class_name, $const_name] = explode('::', $base_key); + + if (!$codebase->classlikes->classOrInterfaceExists($fq_class_name)) { + return null; + } + + $class_constant = $codebase->classlikes->getClassConstantType( + $fq_class_name, + $const_name, + ReflectionProperty::IS_PRIVATE, + null + ); + + if ($class_constant) { + $existing_keys[$base_key] = clone $class_constant; + } else { + return null; + } + } else { + return null; + } + } + + while ($key_parts) { + $divider = array_shift($key_parts); + + if ($divider === '[') { + $array_key = array_shift($key_parts); + array_shift($key_parts); + + $new_base_key = $base_key . '[' . $array_key . ']'; + + if (!isset($existing_keys[$new_base_key])) { + $new_base_type = null; + + $atomic_types = $existing_keys[$base_key]->getAtomicTypes(); + + while ($atomic_types) { + $existing_key_type_part = array_shift($atomic_types); + + if ($existing_key_type_part instanceof TTemplateParam) { + $atomic_types = array_merge($atomic_types, $existing_key_type_part->as->getAtomicTypes()); + continue; + } + + if ($existing_key_type_part instanceof TArray) { + if ($has_empty) { + return null; + } + + $new_base_type_candidate = clone $existing_key_type_part->type_params[1]; + + if ($new_base_type_candidate->isMixed() && !$has_isset && !$has_inverted_isset) { + return $new_base_type_candidate; + } + + if (($has_isset || $has_inverted_isset) && isset($new_assertions[$new_base_key])) { + if ($has_inverted_isset && $new_base_key === $key) { + $new_base_type_candidate->addType(new TNull); + } + + $new_base_type_candidate->possibly_undefined = true; + } + } elseif ($existing_key_type_part instanceof TList) { + if ($has_empty) { + return null; + } + + $new_base_type_candidate = clone $existing_key_type_part->type_param; + + if (($has_isset || $has_inverted_isset) && isset($new_assertions[$new_base_key])) { + if ($has_inverted_isset && $new_base_key === $key) { + $new_base_type_candidate->addType(new TNull); + } + + $new_base_type_candidate->possibly_undefined = true; + } + } elseif ($existing_key_type_part instanceof TNull + || $existing_key_type_part instanceof TFalse + ) { + $new_base_type_candidate = Type::getNull(); + + if ($existing_keys[$base_key]->ignore_nullable_issues) { + $new_base_type_candidate->ignore_nullable_issues = true; + } + } elseif ($existing_key_type_part instanceof TClassStringMap) { + return Type::getMixed(); + } elseif ($existing_key_type_part instanceof TEmpty + || ($existing_key_type_part instanceof TMixed + && $existing_key_type_part->from_loop_isset) + ) { + return Type::getMixed($inside_loop); + } elseif ($existing_key_type_part instanceof TString) { + $new_base_type_candidate = Type::getString(); + } elseif ($existing_key_type_part instanceof TNamedObject + && ($has_isset || $has_inverted_isset) + ) { + $has_object_array_access = true; + + unset($existing_keys[$new_base_key]); + + return null; + } elseif (!$existing_key_type_part instanceof TKeyedArray) { + return Type::getMixed(); + } elseif ($array_key[0] === '$' || ($array_key[0] !== '\'' && !is_numeric($array_key[0]))) { + if ($has_empty) { + return null; + } + + $new_base_type_candidate = $existing_key_type_part->getGenericValueType(); + } else { + $array_properties = $existing_key_type_part->properties; + + $key_parts_key = str_replace('\'', '', $array_key); + + if (!isset($array_properties[$key_parts_key])) { + if ($existing_key_type_part->previous_value_type) { + $new_base_type_candidate = clone $existing_key_type_part->previous_value_type; + $new_base_type_candidate->different = true; + } else { + return null; + } + } else { + $new_base_type_candidate = clone $array_properties[$key_parts_key]; + } + } + + $new_base_type = Type::combineUnionTypes( + $new_base_type, + $new_base_type_candidate, + $codebase + ); + + $existing_keys[$new_base_key] = $new_base_type; + } + } + + $base_key = $new_base_key; + } elseif ($divider === '->' || $divider === '::$') { + $property_name = array_shift($key_parts); + $new_base_key = $base_key . $divider . $property_name; + + if (!isset($existing_keys[$new_base_key])) { + $new_base_type = null; + + $atomic_types = $existing_keys[$base_key]->getAtomicTypes(); + + while ($atomic_types) { + $existing_key_type_part = array_shift($atomic_types); + + if ($existing_key_type_part instanceof TTemplateParam) { + $atomic_types = array_merge($atomic_types, $existing_key_type_part->as->getAtomicTypes()); + continue; + } + + if ($existing_key_type_part instanceof TNull) { + $class_property_type = Type::getNull(); + } elseif ($existing_key_type_part instanceof TMixed + || $existing_key_type_part instanceof TObject + || ($existing_key_type_part instanceof TNamedObject + && strtolower($existing_key_type_part->value) === 'stdclass') + ) { + $class_property_type = Type::getMixed(); + } elseif ($existing_key_type_part instanceof TNamedObject) { + if (!$codebase->classOrInterfaceExists($existing_key_type_part->value)) { + $class_property_type = Type::getMixed(); + } else { + if (substr($property_name, -2) === '()') { + $method_id = new MethodIdentifier( + $existing_key_type_part->value, + strtolower(substr($property_name, 0, -2)) + ); + + if (!$codebase->methods->methodExists($method_id)) { + return null; + } + + $declaring_method_id = $codebase->methods->getDeclaringMethodId( + $method_id + ); + + if ($declaring_method_id === null) { + return null; + } + + $declaring_class = $declaring_method_id->fq_class_name; + + $method_return_type = $codebase->methods->getMethodReturnType( + $method_id, + $declaring_class, + null, + null + ); + + if ($method_return_type) { + $class_property_type = TypeExpander::expandUnion( + $codebase, + clone $method_return_type, + $declaring_class, + $declaring_class, + null + ); + } else { + $class_property_type = Type::getMixed(); + } + } else { + $class_property_type = self::getPropertyType( + $codebase, + $existing_key_type_part->value, + $property_name + ); + + if (!$class_property_type) { + return null; + } + } + } + } else { + $class_property_type = Type::getMixed(); + } + + $new_base_type = Type::combineUnionTypes( + $new_base_type, + $class_property_type, + $codebase + ); + + $existing_keys[$new_base_key] = $new_base_type; + } + } + + $base_key = $new_base_key; + } else { + return null; + } + } + + if (!isset($existing_keys[$base_key])) { + if ($code_location) { + IssueBuffer::add( + new PsalmInternalError( + 'Unknown key ' . $base_key, + $code_location + ) + ); + } + + return null; + } + + return $existing_keys[$base_key]; + } + + private static function getPropertyType( + Codebase $codebase, + string $fq_class_name, + string $property_name + ): ?Union { + $property_id = $fq_class_name . '::$' . $property_name; + + if (!$codebase->properties->propertyExists($property_id, true)) { + $declaring_class_storage = $codebase->classlike_storage_provider->get( + $fq_class_name + ); + + if (isset($declaring_class_storage->pseudo_property_get_types['$' . $property_name])) { + return clone $declaring_class_storage->pseudo_property_get_types['$' . $property_name]; + } + + return null; + } + + $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( + $property_id, + true + ); + + if ($declaring_property_class === null) { + return null; + } + + $class_property_type = $codebase->properties->getPropertyType( + $property_id, + false, + null, + null + ); + + $declaring_class_storage = $codebase->classlike_storage_provider->get( + $declaring_property_class + ); + + if ($class_property_type) { + return TypeExpander::expandUnion( + $codebase, + clone $class_property_type, + $declaring_class_storage->name, + $declaring_class_storage->name, + null + ); + } + + return Type::getMixed(); + } + + /** + * @param string[] $suppressed_issues + * + */ + protected static function triggerIssueForImpossible( + Union $existing_var_type, + string $old_var_type_string, + string $key, + string $assertion, + bool $redundant, + bool $negated, + CodeLocation $code_location, + array $suppressed_issues + ): void { + $not = $assertion[0] === '!'; + + if ($not) { + $assertion = substr($assertion, 1); + } + + $operator = substr($assertion, 0, 1); + if ($operator === '>') { + $assertion = '>= '.substr($assertion, 1); + } elseif ($operator === '<') { + $assertion = '<= '.substr($assertion, 1); + } + + if ($negated) { + $redundant = !$redundant; + $not = !$not; + } + + $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); + + $from_docblock = $existing_var_type->from_docblock + || (isset($existing_var_atomic_types[$assertion]) + && $existing_var_atomic_types[$assertion]->from_docblock); + + if ($redundant) { + if ($existing_var_type->from_property && $assertion === 'isset') { + if ($existing_var_type->from_static_property) { + IssueBuffer::maybeAdd( + new RedundantPropertyInitializationCheck( + 'Static property ' . $key . ' with type ' + . $old_var_type_string + . ' has unexpected isset check — should it be nullable?', + $code_location + ), + $suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new RedundantPropertyInitializationCheck( + 'Property ' . $key . ' with type ' + . $old_var_type_string . ' should already be set in the constructor', + $code_location + ), + $suppressed_issues + ); + } + } elseif ($from_docblock) { + IssueBuffer::maybeAdd( + new RedundantConditionGivenDocblockType( + 'Docblock-defined type ' . $old_var_type_string + . ' for ' . $key + . ' is ' . ($not ? 'never ' : 'always ') . $assertion, + $code_location, + $old_var_type_string . ' ' . $assertion + ), + $suppressed_issues + ); + } else { + IssueBuffer::maybeAdd( + new RedundantCondition( + 'Type ' . $old_var_type_string + . ' for ' . $key + . ' is ' . ($not ? 'never ' : 'always ') . $assertion, + $code_location, + $old_var_type_string . ' ' . $assertion + ), + $suppressed_issues + ); + } + } else { + if ($from_docblock) { + IssueBuffer::maybeAdd( + new DocblockTypeContradiction( + 'Docblock-defined type ' . $old_var_type_string + . ' for ' . $key + . ' is ' . ($not ? 'always ' : 'never ') . $assertion, + $code_location, + $old_var_type_string . ' ' . $assertion + ), + $suppressed_issues + ); + } else { + if ($assertion === 'null' && !$not) { + $issue = new TypeDoesNotContainNull( + 'Type ' . $old_var_type_string + . ' for ' . $key + . ' is never ' . $assertion, + $code_location, + $old_var_type_string . ' ' . $assertion + ); + } else { + $issue = new TypeDoesNotContainType( + 'Type ' . $old_var_type_string + . ' for ' . $key + . ' is ' . ($not ? 'always ' : 'never ') . $assertion, + $code_location, + $old_var_type_string . ' ' . $assertion + ); + } + + IssueBuffer::maybeAdd( + $issue, + $suppressed_issues + ); + } + } + } + + /** + * @param string[] $key_parts + * @param array $existing_types + * @param array $changed_var_ids + */ + private static function adjustTKeyedArrayType( + array $key_parts, + array &$existing_types, + array &$changed_var_ids, + Union $result_type + ): void { + array_pop($key_parts); + $array_key = array_pop($key_parts); + array_pop($key_parts); + + if ($array_key === null) { + throw new UnexpectedValueException('Not expecting null array key'); + } + + if ($array_key[0] === '$') { + return; + } + + $array_key_offset = $array_key[0] === '\'' || $array_key[0] === '"' ? substr($array_key, 1, -1) : $array_key; + + $base_key = implode($key_parts); + + if (isset($existing_types[$base_key]) && $array_key_offset !== false) { + foreach ($existing_types[$base_key]->getAtomicTypes() as $base_atomic_type) { + if ($base_atomic_type instanceof TKeyedArray + || ($base_atomic_type instanceof TArray + && !$base_atomic_type->type_params[1]->isEmpty()) + || $base_atomic_type instanceof TList + || $base_atomic_type instanceof TClassStringMap + ) { + $new_base_type = clone $existing_types[$base_key]; + + if ($base_atomic_type instanceof TArray) { + $previous_key_type = clone $base_atomic_type->type_params[0]; + $previous_value_type = clone $base_atomic_type->type_params[1]; + + $base_atomic_type = new TKeyedArray( + [ + $array_key_offset => clone $result_type, + ], + null + ); + + if (!$previous_key_type->isEmpty()) { + $base_atomic_type->previous_key_type = $previous_key_type; + } + $base_atomic_type->previous_value_type = $previous_value_type; + } elseif ($base_atomic_type instanceof TList) { + $previous_key_type = Type::getInt(); + $previous_value_type = clone $base_atomic_type->type_param; + + $base_atomic_type = new TKeyedArray( + [ + $array_key_offset => clone $result_type, + ], + null + ); + + $base_atomic_type->is_list = true; + + $base_atomic_type->previous_key_type = $previous_key_type; + $base_atomic_type->previous_value_type = $previous_value_type; + } elseif ($base_atomic_type instanceof TClassStringMap) { + // do nothing + } else { + $base_atomic_type = clone $base_atomic_type; + $base_atomic_type->properties[$array_key_offset] = clone $result_type; + } + + $new_base_type->addType($base_atomic_type); + + $changed_var_ids[$base_key . '[' . $array_key . ']'] = true; + + if ($key_parts[count($key_parts) - 1] === ']') { + self::adjustTKeyedArrayType( + $key_parts, + $existing_types, + $changed_var_ids, + $new_base_type + ); + } + + $existing_types[$base_key] = $new_base_type; + break; + } + } + } + } + + protected static function refineArrayKey(Union $key_type): void + { + foreach ($key_type->getAtomicTypes() as $key => $cat) { + if ($cat instanceof TTemplateParam) { + self::refineArrayKey($cat->as); + $key_type->bustCache(); + } elseif ($cat instanceof TScalar || $cat instanceof TMixed) { + $key_type->removeType($key); + $key_type->addType(new TArrayKey()); + } elseif (!$cat instanceof TString && !$cat instanceof TInt) { + $key_type->removeType($key); + $key_type->addType(new TArrayKey()); + } + } + + if ($key_type->isUnionEmpty()) { + // this should ideally prompt some sort of error + $key_type->addType(new TArrayKey()); + } + } +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/TaintKind.php b/vendor/vimeo/psalm/src/Psalm/Type/TaintKind.php new file mode 100644 index 00000000..b5022d98 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/TaintKind.php @@ -0,0 +1,25 @@ + + */ + public function getChildNodes(): array; +} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Union.php b/vendor/vimeo/psalm/src/Psalm/Type/Union.php new file mode 100644 index 00000000..6ff34be3 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Type/Union.php @@ -0,0 +1,1668 @@ + + */ + private $types; + + /** + * Whether the type originated in a docblock + * + * @var bool + */ + public $from_docblock = false; + + /** + * Whether the type originated from integer calculation + * + * @var bool + */ + public $from_calculation = false; + + /** + * Whether the type originated from a property + * + * This helps turn isset($foo->bar) into a different sort of issue + * + * @var bool + */ + public $from_property = false; + + /** + * Whether the type originated from *static* property + * + * Unlike non-static properties, static properties have no prescribed place + * like __construct() to be initialized in + * + * @var bool + */ + public $from_static_property = false; + + /** + * Whether the property that this type has been derived from has been initialized in a constructor + * + * @var bool + */ + public $initialized = true; + + /** + * Which class the type was initialised in + * + * @var ?string + */ + public $initialized_class; + + /** + * Whether or not the type has been checked yet + * + * @var bool + */ + public $checked = false; + + /** + * @var bool + */ + public $failed_reconciliation = false; + + /** + * Whether or not to ignore issues with possibly-null values + * + * @var bool + */ + public $ignore_nullable_issues = false; + + /** + * Whether or not to ignore issues with possibly-false values + * + * @var bool + */ + public $ignore_falsable_issues = false; + + /** + * Whether or not to ignore issues with isset on this type + * + * @var bool + */ + public $ignore_isset = false; + + /** + * Whether or not this variable is possibly undefined + * + * @var bool + */ + public $possibly_undefined = false; + + /** + * Whether or not this variable is possibly undefined + * + * @var bool + */ + public $possibly_undefined_from_try = false; + + /** + * Whether or not this union had a template, since replaced + * + * @var bool + */ + public $had_template = false; + + /** + * Whether or not this union comes from a template "as" default + * + * @var bool + */ + public $from_template_default = false; + + /** + * @var array + */ + private $literal_string_types = []; + + /** + * @var array + */ + private $typed_class_strings = []; + + /** + * @var array + */ + private $literal_int_types = []; + + /** + * @var array + */ + private $literal_float_types = []; + + /** + * Whether or not the type was passed by reference + * + * @var bool + */ + public $by_ref = false; + + /** + * @var bool + */ + public $reference_free = false; + + /** + * @var bool + */ + public $allow_mutations = true; + + /** + * @var bool + */ + public $has_mutations = true; + + /** @var null|string */ + private $id; + + /** + * @var array + */ + public $parent_nodes = []; + + /** + * @var bool + */ + public $different = false; + + /** + * Constructs an Union instance + * + * @param non-empty-array $types + */ + public function __construct(array $types) + { + $from_docblock = false; + + $keyed_types = []; + + foreach ($types as $type) { + $key = $type->getKey(); + $keyed_types[$key] = $type; + + if ($type instanceof TLiteralInt) { + $this->literal_int_types[$key] = $type; + } elseif ($type instanceof TLiteralString) { + $this->literal_string_types[$key] = $type; + } elseif ($type instanceof TLiteralFloat) { + $this->literal_float_types[$key] = $type; + } elseif ($type instanceof TClassString + && ($type->as_type || $type instanceof TTemplateParamClass) + ) { + $this->typed_class_strings[$key] = $type; + } + + $from_docblock = $from_docblock || $type->from_docblock; + } + + $this->types = $keyed_types; + + $this->from_docblock = $from_docblock; + } + + /** + * @param non-empty-array $types + */ + public function replaceTypes(array $types): void + { + $this->types = $types; + } + + /** + * @psalm-mutation-free + * @return non-empty-array + */ + public function getAtomicTypes(): array + { + return $this->types; + } + + public function addType(Atomic $type): void + { + $this->types[$type->getKey()] = $type; + + if ($type instanceof TLiteralString) { + $this->literal_string_types[$type->getKey()] = $type; + } elseif ($type instanceof TLiteralInt) { + $this->literal_int_types[$type->getKey()] = $type; + } elseif ($type instanceof TLiteralFloat) { + $this->literal_float_types[$type->getKey()] = $type; + } elseif ($type instanceof TString && $this->literal_string_types) { + foreach ($this->literal_string_types as $key => $_) { + unset($this->literal_string_types[$key], $this->types[$key]); + } + if (!$type instanceof TClassString + || (!$type->as_type && !$type instanceof TTemplateParamClass) + ) { + foreach ($this->typed_class_strings as $key => $_) { + unset($this->typed_class_strings[$key], $this->types[$key]); + } + } + } elseif ($type instanceof TInt && $this->literal_int_types) { + //we remove any literal that is already included in a wider type + $int_type_in_range = TIntRange::convertToIntRange($type); + foreach ($this->literal_int_types as $key => $literal_int_type) { + if ($int_type_in_range->contains($literal_int_type->value)) { + unset($this->literal_int_types[$key], $this->types[$key]); + } + } + } elseif ($type instanceof TFloat && $this->literal_float_types) { + foreach ($this->literal_float_types as $key => $_) { + unset($this->literal_float_types[$key], $this->types[$key]); + } + } + + $this->id = null; + } + + public function __clone() + { + $this->literal_string_types = []; + $this->literal_int_types = []; + $this->literal_float_types = []; + $this->typed_class_strings = []; + + foreach ($this->types as $key => &$type) { + $type = clone $type; + + if ($type instanceof TLiteralInt) { + $this->literal_int_types[$key] = $type; + } elseif ($type instanceof TLiteralString) { + $this->literal_string_types[$key] = $type; + } elseif ($type instanceof TLiteralFloat) { + $this->literal_float_types[$key] = $type; + } elseif ($type instanceof TClassString + && ($type->as_type || $type instanceof TTemplateParamClass) + ) { + $this->typed_class_strings[$key] = $type; + } + } + } + + public function __toString(): string + { + $types = []; + + $printed_int = false; + $printed_float = false; + $printed_string = false; + + foreach ($this->types as $type) { + if ($type instanceof TLiteralFloat) { + if ($printed_float) { + continue; + } + + $printed_float = true; + } elseif ($type instanceof TLiteralString) { + if ($printed_string) { + continue; + } + + $printed_string = true; + } elseif ($type instanceof TLiteralInt) { + if ($printed_int) { + continue; + } + + $printed_int = true; + } + + $types[] = (string)$type; + } + + sort($types); + return implode('|', $types); + } + + public function getKey(): string + { + $types = []; + + $printed_int = false; + $printed_float = false; + $printed_string = false; + + foreach ($this->types as $type) { + if ($type instanceof TLiteralFloat) { + if ($printed_float) { + continue; + } + + $types[] = 'float'; + $printed_float = true; + } elseif ($type instanceof TLiteralString) { + if ($printed_string) { + continue; + } + + $types[] = 'string'; + $printed_string = true; + } elseif ($type instanceof TLiteralInt) { + if ($printed_int) { + continue; + } + + $types[] = 'int'; + $printed_int = true; + } else { + $types[] = $type->getKey(); + } + } + + sort($types); + return implode('|', $types); + } + + public function getId(): string + { + if ($this->id) { + return $this->id; + } + + $types = []; + foreach ($this->types as $type) { + $types[] = $type->getId(); + } + sort($types); + + if (count($types) > 1) { + foreach ($types as $i => $type) { + if (strpos($type, ' as ') && strpos($type, '(') === false) { + $types[$i] = '(' . $type . ')'; + } + } + } + + $id = implode('|', $types); + + $this->id = $id; + + return $id; + } + + public function getAssertionString(bool $exact = false): string + { + $assertions = []; + foreach ($this->types as $type) { + $assertions[] = $type->getAssertionString($exact); + } + + $assertions = array_unique($assertions); + if (count($assertions) !== 1) { + throw new UnexpectedValueException('Should only be one type per assertion'); + } + + return reset($assertions); + } + + /** + * @param array $aliased_classes + * + */ + public function toNamespacedString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + bool $use_phpdoc_format + ): string { + $other_types = []; + + $literal_ints = []; + $literal_strings = []; + + $has_non_literal_int = false; + $has_non_literal_string = false; + + foreach ($this->types as $type) { + $type_string = $type->toNamespacedString($namespace, $aliased_classes, $this_class, $use_phpdoc_format); + if ($type instanceof TLiteralInt) { + $literal_ints[] = $type_string; + } elseif ($type instanceof TLiteralString) { + $literal_strings[] = $type_string; + } else { + if (get_class($type) === TString::class) { + $has_non_literal_string = true; + } elseif (get_class($type) === TInt::class) { + $has_non_literal_int = true; + } + $other_types[] = $type_string; + } + } + + if (count($literal_ints) <= 3 && !$has_non_literal_int) { + $other_types = array_merge($other_types, $literal_ints); + } else { + $other_types[] = 'int'; + } + + if (count($literal_strings) <= 3 && !$has_non_literal_string) { + $other_types = array_merge($other_types, $literal_strings); + } else { + $other_types[] = 'string'; + } + + sort($other_types); + return implode('|', array_unique($other_types)); + } + + /** + * @param array $aliased_classes + */ + public function toPhpString( + ?string $namespace, + array $aliased_classes, + ?string $this_class, + int $php_major_version, + int $php_minor_version + ): ?string { + if (!$this->isSingleAndMaybeNullable()) { + if ($php_major_version < 8) { + return null; + } + } elseif ($php_major_version < 7 + || (isset($this->types['null']) && $php_major_version === 7 && $php_minor_version < 1) + ) { + return null; + } + + $types = $this->types; + + $nullable = false; + + if (isset($types['null']) && count($types) > 1) { + unset($types['null']); + + $nullable = true; + } + + $falsable = false; + + if (isset($types['false']) && count($types) > 1) { + unset($types['false']); + + $falsable = true; + } + + $php_types = []; + + foreach ($types as $atomic_type) { + $php_type = $atomic_type->toPhpString( + $namespace, + $aliased_classes, + $this_class, + $php_major_version, + $php_minor_version + ); + + if (!$php_type) { + return null; + } + + $php_types[] = $php_type; + } + + if ($falsable) { + if ($nullable) { + $php_types['null'] = 'null'; + } + $php_types['false'] = 'false'; + ksort($php_types); + return implode('|', array_unique($php_types)); + } + + if ($php_major_version < 8) { + return ($nullable ? '?' : '') . implode('|', array_unique($php_types)); + } + if ($nullable) { + $php_types['null'] = 'null'; + } + return implode('|', array_unique($php_types)); + } + + public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool + { + if (!$this->isSingleAndMaybeNullable() && $php_major_version < 8) { + return false; + } + + $types = $this->types; + + if (isset($types['null'])) { + if (count($types) > 1) { + unset($types['null']); + } else { + return false; + } + } + + return !array_filter( + $types, + function ($atomic_type) use ($php_major_version, $php_minor_version) { + return !$atomic_type->canBeFullyExpressedInPhp($php_major_version, $php_minor_version); + } + ); + } + + public function removeType(string $type_string): bool + { + if (isset($this->types[$type_string])) { + unset($this->types[$type_string]); + + if (strpos($type_string, '(')) { + unset( + $this->literal_string_types[$type_string], + $this->literal_int_types[$type_string], + $this->literal_float_types[$type_string] + ); + } + + $this->id = null; + + return true; + } + + if ($type_string === 'string') { + if ($this->literal_string_types) { + foreach ($this->literal_string_types as $literal_key => $_) { + unset($this->types[$literal_key]); + } + $this->literal_string_types = []; + } + + if ($this->typed_class_strings) { + foreach ($this->typed_class_strings as $typed_class_key => $_) { + unset($this->types[$typed_class_key]); + } + $this->typed_class_strings = []; + } + + unset($this->types['class-string'], $this->types['trait-string']); + } elseif ($type_string === 'int' && $this->literal_int_types) { + foreach ($this->literal_int_types as $literal_key => $_) { + unset($this->types[$literal_key]); + } + $this->literal_int_types = []; + } elseif ($type_string === 'float' && $this->literal_float_types) { + foreach ($this->literal_float_types as $literal_key => $_) { + unset($this->types[$literal_key]); + } + $this->literal_float_types = []; + } + + return false; + } + + public function bustCache(): void + { + $this->id = null; + } + + public function hasType(string $type_string): bool + { + return isset($this->types[$type_string]); + } + + public function hasArray(): bool + { + return isset($this->types['array']); + } + + public function hasIterable(): bool + { + return isset($this->types['iterable']); + } + + public function hasList(): bool + { + return isset($this->types['array']) && $this->types['array'] instanceof TList; + } + + public function hasClassStringMap(): bool + { + return isset($this->types['array']) && $this->types['array'] instanceof TClassStringMap; + } + + public function isTemplatedClassString(): bool + { + return $this->isSingle() + && count( + array_filter( + $this->types, + function ($type): bool { + return $type instanceof TTemplateParamClass; + } + ) + ) === 1; + } + + public function hasArrayAccessInterface(Codebase $codebase): bool + { + return (bool)array_filter( + $this->types, + function ($type) use ($codebase) { + return $type->hasArrayAccessInterface($codebase); + } + ); + } + + public function hasCallableType(): bool + { + return $this->getCallableTypes() || $this->getClosureTypes(); + } + + /** + * @return array + */ + public function getCallableTypes(): array + { + return array_filter( + $this->types, + function ($type): bool { + return $type instanceof TCallable; + } + ); + } + + /** + * @return array + */ + public function getClosureTypes(): array + { + return array_filter( + $this->types, + function ($type): bool { + return $type instanceof TClosure; + } + ); + } + + public function hasObject(): bool + { + return isset($this->types['object']); + } + + public function hasObjectType(): bool + { + foreach ($this->types as $type) { + if ($type->isObjectType()) { + return true; + } + } + + return false; + } + + public function isObjectType(): bool + { + foreach ($this->types as $type) { + if (!$type->isObjectType()) { + return false; + } + } + + return true; + } + + public function hasNamedObjectType(): bool + { + foreach ($this->types as $type) { + if ($type->isNamedObjectType()) { + return true; + } + } + + return false; + } + + public function isFormerStaticObject(): bool + { + foreach ($this->types as $type) { + if (!$type instanceof TNamedObject + || !$type->was_static + ) { + return false; + } + } + + return true; + } + + public function hasFormerStaticObject(): bool + { + foreach ($this->types as $type) { + if ($type instanceof TNamedObject + && $type->was_static + ) { + return true; + } + } + + return false; + } + + public function isNullable(): bool + { + if (isset($this->types['null'])) { + return true; + } + + foreach ($this->types as $type) { + if ($type instanceof TTemplateParam && $type->as->isNullable()) { + return true; + } + } + + return false; + } + + public function isFalsable(): bool + { + if (isset($this->types['false'])) { + return true; + } + + foreach ($this->types as $type) { + if ($type instanceof TTemplateParam && $type->as->isFalsable()) { + return true; + } + } + + return false; + } + + public function hasBool(): bool + { + return isset($this->types['bool']) || isset($this->types['false']) || isset($this->types['true']); + } + + public function hasString(): bool + { + return isset($this->types['string']) + || isset($this->types['class-string']) + || isset($this->types['trait-string']) + || isset($this->types['numeric-string']) + || isset($this->types['callable-string']) + || isset($this->types['array-key']) + || $this->literal_string_types + || $this->typed_class_strings; + } + + public function hasLowercaseString(): bool + { + return isset($this->types['string']) + && ($this->types['string'] instanceof TLowercaseString + || $this->types['string'] instanceof TNonEmptyLowercaseString); + } + + public function hasLiteralClassString(): bool + { + return count($this->typed_class_strings) > 0; + } + + public function hasInt(): bool + { + return isset($this->types['int']) || isset($this->types['array-key']) || $this->literal_int_types + || array_filter($this->types, function (Atomic $type) { + return $type instanceof TIntRange; + }); + } + + public function hasPositiveInt(): bool + { + return isset($this->types['int']) && $this->types['int'] instanceof TPositiveInt; + } + + public function hasArrayKey(): bool + { + return isset($this->types['array-key']); + } + + public function hasFloat(): bool + { + return isset($this->types['float']) || $this->literal_float_types; + } + + public function hasScalar(): bool + { + return isset($this->types['scalar']); + } + + public function hasNumeric(): bool + { + return isset($this->types['numeric']); + } + + public function hasScalarType(): bool + { + return isset($this->types['int']) + || isset($this->types['float']) + || isset($this->types['string']) + || isset($this->types['class-string']) + || isset($this->types['trait-string']) + || isset($this->types['bool']) + || isset($this->types['false']) + || isset($this->types['true']) + || isset($this->types['numeric']) + || isset($this->types['numeric-string']) + || $this->literal_int_types + || $this->literal_float_types + || $this->literal_string_types + || $this->typed_class_strings; + } + + public function hasTemplate(): bool + { + return (bool) array_filter( + $this->types, + function (Atomic $type): bool { + return $type instanceof TTemplateParam + || ($type instanceof TNamedObject + && $type->extra_types + && array_filter( + $type->extra_types, + function ($t): bool { + return $t instanceof TTemplateParam; + } + ) + ); + } + ); + } + + public function hasConditional(): bool + { + return (bool) array_filter( + $this->types, + function (Atomic $type): bool { + return $type instanceof TConditional; + } + ); + } + + public function hasTemplateOrStatic(): bool + { + return (bool) array_filter( + $this->types, + function (Atomic $type): bool { + return $type instanceof TTemplateParam + || ($type instanceof TNamedObject + && ($type->was_static + || ($type->extra_types + && array_filter( + $type->extra_types, + function ($t): bool { + return $t instanceof TTemplateParam; + } + ) + ) + ) + ); + } + ); + } + + public function hasMixed(): bool + { + return isset($this->types['mixed']); + } + + public function isMixed(): bool + { + return isset($this->types['mixed']) && count($this->types) === 1; + } + + public function isEmptyMixed(): bool + { + return isset($this->types['mixed']) + && $this->types['mixed'] instanceof TEmptyMixed + && count($this->types) === 1; + } + + public function isVanillaMixed(): bool + { + return isset($this->types['mixed']) + && get_class($this->types['mixed']) === TMixed::class + && !$this->types['mixed']->from_loop_isset + && count($this->types) === 1; + } + + public function isArrayKey(): bool + { + return isset($this->types['array-key']) && count($this->types) === 1; + } + + public function isNull(): bool + { + return count($this->types) === 1 && isset($this->types['null']); + } + + public function isFalse(): bool + { + return count($this->types) === 1 && isset($this->types['false']); + } + + public function isAlwaysFalsy(): bool + { + foreach ($this->getAtomicTypes() as $atomic_type) { + if (!$atomic_type->isFalsy()) { + return false; + } + } + + return true; + } + + public function isTrue(): bool + { + return count($this->types) === 1 && isset($this->types['true']); + } + + public function isAlwaysTruthy(): bool + { + if ($this->possibly_undefined || $this->possibly_undefined_from_try) { + return false; + } + + foreach ($this->getAtomicTypes() as $atomic_type) { + if (!$atomic_type->isTruthy()) { + return false; + } + } + + return true; + } + + public function isVoid(): bool + { + return isset($this->types['void']) && count($this->types) === 1; + } + + public function isNever(): bool + { + return isset($this->types['never']) && count($this->types) === 1; + } + + public function isGenerator(): bool + { + return count($this->types) === 1 + && (($single_type = reset($this->types)) instanceof TNamedObject) + && ($single_type->value === 'Generator'); + } + + public function isEmpty(): bool + { + return isset($this->types['empty']) && count($this->types) === 1; + } + + public function substitute(Union $old_type, ?Union $new_type = null): void + { + if ($this->hasMixed() && !$this->isEmptyMixed()) { + return; + } + + if ($new_type && $new_type->ignore_nullable_issues) { + $this->ignore_nullable_issues = true; + } + + if ($new_type && $new_type->ignore_falsable_issues) { + $this->ignore_falsable_issues = true; + } + + foreach ($old_type->types as $old_type_part) { + if (!$this->removeType($old_type_part->getKey())) { + if ($old_type_part instanceof TFalse + && isset($this->types['bool']) + && !isset($this->types['true']) + ) { + $this->removeType('bool'); + $this->types['true'] = new TTrue; + } elseif ($old_type_part instanceof TTrue + && isset($this->types['bool']) + && !isset($this->types['false']) + ) { + $this->removeType('bool'); + $this->types['false'] = new TFalse; + } elseif (isset($this->types['iterable'])) { + if ($old_type_part instanceof TNamedObject + && $old_type_part->value === 'Traversable' + && !isset($this->types['array']) + ) { + $this->removeType('iterable'); + $this->types['array'] = new TArray([Type::getArrayKey(), Type::getMixed()]); + } + + if ($old_type_part instanceof TArray + && !isset($this->types['traversable']) + ) { + $this->removeType('iterable'); + $this->types['traversable'] = new TNamedObject('Traversable'); + } + } elseif (isset($this->types['array-key'])) { + if ($old_type_part instanceof TString + && !isset($this->types['int']) + ) { + $this->removeType('array-key'); + $this->types['int'] = new TInt(); + } + + if ($old_type_part instanceof TInt + && !isset($this->types['string']) + ) { + $this->removeType('array-key'); + $this->types['string'] = new TString(); + } + } + } + } + + if ($new_type) { + foreach ($new_type->types as $key => $new_type_part) { + if (!isset($this->types[$key]) + || ($new_type_part instanceof Scalar + && get_class($new_type_part) === get_class($this->types[$key])) + ) { + $this->types[$key] = $new_type_part; + } else { + $this->types[$key] = TypeCombiner::combine([$new_type_part, $this->types[$key]])->getSingleAtomic(); + } + } + } elseif (count($this->types) === 0) { + $this->types['mixed'] = new TMixed(); + } + + $this->id = null; + } + + public function isSingle(): bool + { + $type_count = count($this->types); + + $int_literal_count = count($this->literal_int_types); + $string_literal_count = count($this->literal_string_types); + $float_literal_count = count($this->literal_float_types); + + if (($int_literal_count && $string_literal_count) + || ($int_literal_count && $float_literal_count) + || ($string_literal_count && $float_literal_count) + ) { + return false; + } + + if ($int_literal_count || $string_literal_count || $float_literal_count) { + $type_count -= $int_literal_count + $string_literal_count + $float_literal_count - 1; + } + + return $type_count === 1; + } + + public function isSingleAndMaybeNullable(): bool + { + $is_nullable = isset($this->types['null']); + + $type_count = count($this->types); + + if ($type_count === 1 && $is_nullable) { + return false; + } + + $int_literal_count = count($this->literal_int_types); + $string_literal_count = count($this->literal_string_types); + $float_literal_count = count($this->literal_float_types); + + if (($int_literal_count && $string_literal_count) + || ($int_literal_count && $float_literal_count) + || ($string_literal_count && $float_literal_count) + ) { + return false; + } + + if ($int_literal_count || $string_literal_count || $float_literal_count) { + $type_count -= $int_literal_count + $string_literal_count + $float_literal_count - 1; + } + + return ($type_count - (int) $is_nullable) === 1; + } + + /** + * @return bool true if this is an int + */ + public function isInt(bool $check_templates = false): bool + { + return count( + array_filter( + $this->types, + function ($type) use ($check_templates): bool { + return $type instanceof TInt + || ($check_templates + && $type instanceof TTemplateParam + && $type->as->isInt() + ); + } + ) + ) === count($this->types); + } + + /** + * @return bool true if this is a float + */ + public function isFloat(): bool + { + if (!$this->isSingle()) { + return false; + } + + return isset($this->types['float']) || $this->literal_float_types; + } + + /** + * @return bool true if this is a string + */ + public function isString(bool $check_templates = false): bool + { + return count( + array_filter( + $this->types, + function ($type) use ($check_templates): bool { + return $type instanceof TString + || ($check_templates + && $type instanceof TTemplateParam + && $type->as->isString() + ); + } + ) + ) === count($this->types); + } + + /** + * @return bool true if this is a boolean + */ + public function isBool(): bool + { + if (!$this->isSingle()) { + return false; + } + + return isset($this->types['bool']); + } + + /** + * @return bool true if this is an array + */ + public function isArray(): bool + { + if (!$this->isSingle()) { + return false; + } + + return isset($this->types['array']); + } + + /** + * @return bool true if this is a string literal with only one possible value + */ + public function isSingleStringLiteral(): bool + { + return count($this->types) === 1 && count($this->literal_string_types) === 1; + } + + /** + * @throws InvalidArgumentException if isSingleStringLiteral is false + * + * @return TLiteralString the only string literal represented by this union type + */ + public function getSingleStringLiteral(): TLiteralString + { + if (count($this->types) !== 1 || count($this->literal_string_types) !== 1) { + throw new InvalidArgumentException('Not a string literal'); + } + + return reset($this->literal_string_types); + } + + public function allStringLiterals(): bool + { + foreach ($this->types as $atomic_key_type) { + if (!$atomic_key_type instanceof TLiteralString) { + return false; + } + } + + return true; + } + + public function allIntLiterals(): bool + { + foreach ($this->types as $atomic_key_type) { + if (!$atomic_key_type instanceof TLiteralInt) { + return false; + } + } + + return true; + } + + /** + * @psalm-assert-if-true array< + * array-key, + * TLiteralString|TLiteralInt|TLiteralFloat|TFalse|TTrue + * > $this->getAtomicTypes() + */ + public function allSpecificLiterals(): bool + { + foreach ($this->types as $atomic_key_type) { + if (!$atomic_key_type instanceof TLiteralString + && !$atomic_key_type instanceof TLiteralInt + && !$atomic_key_type instanceof TLiteralFloat + && !$atomic_key_type instanceof TFalse + && !$atomic_key_type instanceof TTrue + ) { + return false; + } + } + + return true; + } + + /** + * @psalm-assert-if-true array< + * array-key, + * TLiteralString|TLiteralInt|TLiteralFloat|TNonspecificLiteralString|TNonSpecificLiteralInt|TFalse|TTrue + * > $this->getAtomicTypes() + */ + public function allLiterals(): bool + { + foreach ($this->types as $atomic_key_type) { + if (!$atomic_key_type instanceof TLiteralString + && !$atomic_key_type instanceof TLiteralInt + && !$atomic_key_type instanceof TLiteralFloat + && !$atomic_key_type instanceof TNonspecificLiteralString + && !$atomic_key_type instanceof TNonspecificLiteralInt + && !$atomic_key_type instanceof TFalse + && !$atomic_key_type instanceof TTrue + ) { + return false; + } + } + + return true; + } + + public function hasLiteralValue(): bool + { + return $this->literal_int_types + || $this->literal_string_types + || $this->literal_float_types + || isset($this->types['false']) + || isset($this->types['true']); + } + + public function isSingleLiteral(): bool + { + return count($this->types) === 1 + && count($this->literal_int_types) + + count($this->literal_string_types) + + count($this->literal_float_types) === 1 + ; + } + + /** + * @return TLiteralInt|TLiteralString|TLiteralFloat + */ + public function getSingleLiteral() + { + if (!$this->isSingleLiteral()) { + throw new InvalidArgumentException("Not a single literal"); + } + + return ($literal = reset($this->literal_int_types)) !== false + ? $literal + : (($literal = reset($this->literal_string_types)) !== false + ? $literal + : reset($this->literal_float_types)) + ; + } + + public function hasLiteralString(): bool + { + return count($this->literal_string_types) > 0; + } + + public function hasLiteralInt(): bool + { + return count($this->literal_int_types) > 0; + } + + /** + * @return bool true if this is a int literal with only one possible value + */ + public function isSingleIntLiteral(): bool + { + return count($this->types) === 1 && count($this->literal_int_types) === 1; + } + + /** + * @throws InvalidArgumentException if isSingleIntLiteral is false + * + * @return TLiteralInt the only int literal represented by this union type + */ + public function getSingleIntLiteral(): TLiteralInt + { + if (count($this->types) !== 1 || count($this->literal_int_types) !== 1) { + throw new InvalidArgumentException('Not an int literal'); + } + + return reset($this->literal_int_types); + } + + /** + * @param array $suppressed_issues + * @param array $phantom_classes + * + */ + public function check( + StatementsSource $source, + CodeLocation $code_location, + array $suppressed_issues, + array $phantom_classes = [], + bool $inferred = true, + bool $inherited = false, + bool $prevent_template_covariance = false, + ?string $calling_method_id = null + ): bool { + if ($this->checked) { + return true; + } + + $checker = new TypeChecker( + $source, + $code_location, + $suppressed_issues, + $phantom_classes, + $inferred, + $inherited, + $prevent_template_covariance, + $calling_method_id + ); + + $checker->traverseArray($this->types); + + $this->checked = true; + + return !$checker->hasErrors(); + } + + /** + * @param array $phantom_classes + * + */ + public function queueClassLikesForScanning( + Codebase $codebase, + ?FileStorage $file_storage = null, + array $phantom_classes = [] + ): void { + $scanner_visitor = new TypeScanner( + $codebase->scanner, + $file_storage, + $phantom_classes + ); + + $scanner_visitor->traverseArray($this->types); + } + + /** + * @param lowercase-string $fq_class_like_name + */ + public function containsClassLike(string $fq_class_like_name): bool + { + $classlike_visitor = new ContainsClassLikeVisitor($fq_class_like_name); + + $classlike_visitor->traverseArray($this->types); + + return $classlike_visitor->matches(); + } + + public function containsAnyLiteral(): bool + { + $literal_visitor = new ContainsLiteralVisitor(); + + $literal_visitor->traverseArray($this->types); + + return $literal_visitor->matches(); + } + + /** + * @return list + */ + public function getTemplateTypes(): array + { + $template_type_collector = new TemplateTypeCollector(); + + $template_type_collector->traverseArray($this->types); + + return $template_type_collector->getTemplateTypes(); + } + + public function setFromDocblock(): void + { + $this->from_docblock = true; + + (new FromDocblockSetter())->traverseArray($this->types); + } + + public function replaceClassLike(string $old, string $new): void + { + foreach ($this->types as $key => $atomic_type) { + $atomic_type->replaceClassLike($old, $new); + + $this->removeType($key); + $this->addType($atomic_type); + } + } + + public function equals(Union $other_type, bool $ensure_source_equality = true): bool + { + if ($other_type === $this) { + return true; + } + + if ($other_type->id && $this->id && $other_type->id !== $this->id) { + return false; + } + + if ($this->possibly_undefined !== $other_type->possibly_undefined) { + return false; + } + + if ($this->had_template !== $other_type->had_template) { + return false; + } + + if ($this->possibly_undefined_from_try !== $other_type->possibly_undefined_from_try) { + return false; + } + + if ($this->from_calculation !== $other_type->from_calculation) { + return false; + } + + if ($this->initialized !== $other_type->initialized) { + return false; + } + + if ($ensure_source_equality && $this->from_docblock !== $other_type->from_docblock) { + return false; + } + + if (count($this->types) !== count($other_type->types)) { + return false; + } + + if ($this->parent_nodes !== $other_type->parent_nodes) { + return false; + } + + if ($this->different || $other_type->different) { + return false; + } + + $other_atomic_types = $other_type->types; + + foreach ($this->types as $key => $atomic_type) { + if (!isset($other_atomic_types[$key])) { + return false; + } + + if (!$atomic_type->equals($other_atomic_types[$key], $ensure_source_equality)) { + return false; + } + } + + return true; + } + + /** + * @return array + */ + public function getLiteralStrings(): array + { + return $this->literal_string_types; + } + + /** + * @return array + */ + public function getLiteralInts(): array + { + return $this->literal_int_types; + } + + /** + * @return array + */ + public function getRangeInts(): array + { + $ranges = []; + foreach ($this->getAtomicTypes() as $atomic) { + if ($atomic instanceof TIntRange) { + $ranges[$atomic->getKey()] = $atomic; + } + } + + return $ranges; + } + + /** + * @return array + */ + public function getLiteralFloats(): array + { + return $this->literal_float_types; + } + + /** + * @return array + */ + public function getChildNodes(): array + { + return $this->types; + } + + /** + * @return bool true if this is a float literal with only one possible value + */ + public function isSingleFloatLiteral(): bool + { + return count($this->types) === 1 && count($this->literal_float_types) === 1; + } + + /** + * @throws InvalidArgumentException if isSingleFloatLiteral is false + * + * @return TLiteralFloat the only float literal represented by this union type + */ + public function getSingleFloatLiteral(): TLiteralFloat + { + if (count($this->types) !== 1 || count($this->literal_float_types) !== 1) { + throw new InvalidArgumentException('Not a float literal'); + } + + return reset($this->literal_float_types); + } + + public function hasLiteralFloat(): bool + { + return count($this->literal_float_types) > 0; + } + + public function getSingleAtomic(): Atomic + { + return reset($this->types); + } + + public function isUnionEmpty(): bool + { + return $this->types === []; + } +} diff --git a/vendor/vimeo/psalm/src/command_functions.php b/vendor/vimeo/psalm/src/command_functions.php new file mode 100644 index 00000000..4a797d8a --- /dev/null +++ b/vendor/vimeo/psalm/src/command_functions.php @@ -0,0 +1,88 @@ + + * @deprecated going to be removed in Psalm 5 + */ +function getArguments(): array +{ + return CliUtils::getArguments(); +} + +/** + * @param string|array|null|false $f_paths + * + * @return list|null + * @deprecated going to be removed in Psalm 5 + */ +function getPathsToCheck($f_paths): ?array +{ + return CliUtils::getPathsToCheck($f_paths); +} + +/** + * @psalm-pure + * @deprecated going to be removed in Psalm 5 + */ +function getPsalmHelpText(): string +{ + return CliUtils::getPsalmHelpText(); +} + +/** @deprecated going to be removed in Psalm 5 */ +function initialiseConfig( + ?string $path_to_config, + string $current_dir, + string $output_format, + ?ClassLoader $first_autoloader, + bool $create_if_non_existent = false +): Config { + return CliUtils::initializeConfig( + $path_to_config, + $current_dir, + $output_format, + $first_autoloader, + $create_if_non_existent + ); +} + +/** @deprecated going to be removed in Psalm 5 */ +function update_config_file(Config $config, string $config_file_path, string $baseline_path): void +{ + CliUtils::updateConfigFile($config, $config_file_path, $baseline_path); +} + +/** @deprecated going to be removed in Psalm 5 */ +function get_path_to_config(array $options): ?string +{ + return CliUtils::getPathToConfig($options); +} + +/** + * @psalm-pure + * @deprecated going to be removed in Psalm 5 + */ +function getMemoryLimitInBytes(): int +{ + return CliUtils::getMemoryLimitInBytes(); +} diff --git a/vendor/vimeo/psalm/src/functions.php b/vendor/vimeo/psalm/src/functions.php new file mode 100644 index 00000000..a44e53cc --- /dev/null +++ b/vendor/vimeo/psalm/src/functions.php @@ -0,0 +1,13 @@ +isUserDefined()) { + /** + * See https://github.com/runkit7/runkit_object_id for a faster native version for php <= 7.1 + * + * @param object $object + * @return int The object id + */ + function spl_object_id($object): int + { + return runkit_object_id($object); + } + } elseif (PHP_INT_SIZE === 8) { + /** + * See https://github.com/runkit7/runkit_object_id for a faster native version for php <= 7.1 + * + * @param object $object + * @return int (The object id, XORed with a random number) + */ + function spl_object_id($object): int + { + $hash = spl_object_hash($object); + // Fit this into a php long (32-bit or 64-bit signed int). + // The first 16 hex digits (64 bytes) vary, the last 16 don't. + // Values are usually padded with 0s at the front. + return intval(substr($hash, 1, 15), 16); + } + } else { + /** + * See https://github.com/runkit7/runkit_object_id for a faster native version for php <= 7.1 + * + * @param object $object + * @return int (The object id, XORed with a random number) + */ + function spl_object_id($object): int + { + $hash = spl_object_hash($object); + // Fit this into a php long (32-bit or 64-bit signed int). + // The first 16 hex digits (64 bytes) vary, the last 16 don't. + // Values are usually padded with 0s at the front. + return intval(substr($hash, 9, 7), 16); + } + } +} diff --git a/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub b/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub new file mode 100644 index 00000000..0dae5ef3 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub @@ -0,0 +1,503 @@ + + */ +class Generator implements Traversable { + /** + * @psalm-ignore-nullable-return + * @return ?TValue Can return any type. + */ + public function current() {} + + /** + * @return void Any returned value is ignored. + */ + public function next() {} + + /** + * @return TKey scalar on success, or null on failure. + */ + public function key() {} + + /** + * @return bool The return value will be casted to boolean and then evaluated. + */ + public function valid() {} + + /** + * @return void Any returned value is ignored. + */ + public function rewind() {} + + /** + * @return TReturn Can return any type. + */ + public function getReturn() {} + + /** + * @param TSend $value + * @psalm-ignore-nullable-return + * @return ?TValue Can return any type. + */ + public function send($value) {} + + /** + * @psalm-ignore-nullable-return + * @return ?TValue Can return any type. + */ + public function throw(Throwable $exception) {} +} + +/** + * Interface to provide accessing objects as arrays. + * @link http://php.net/manual/en/class.arrayaccess.php + * + * @template TKey + * @template TValue + */ +interface ArrayAccess { + + /** + * Whether a offset exists + * @link http://php.net/manual/en/arrayaccess.offsetexists.php + * + * @param TKey $offset An offset to check for. + * @return bool true on success or false on failure. + * The return value will be casted to boolean if non-boolean was returned. + * + * @since 5.0.0 + */ + public function offsetExists($offset); + + /** + * Offset to retrieve + * @link http://php.net/manual/en/arrayaccess.offsetget.php + * + * @param TKey $offset The offset to retrieve. + * @return TValue|null Can return all value types. + * @psalm-ignore-nullable-return + * + * @since 5.0.0 + */ + public function offsetGet($offset); + + /** + * Offset to set + * @link http://php.net/manual/en/arrayaccess.offsetset.php + * + * @param TKey|null $offset The offset to assign the value to. + * @param TValue $value The value to set. + * @return void + * + * @since 5.0.0 + */ + public function offsetSet($offset, $value); + + /** + * Offset to unset + * @link http://php.net/manual/en/arrayaccess.offsetunset.php + * + * @param TKey $offset The offset to unset. + * @return void + * + * @since 5.0.0 + */ + public function offsetUnset($offset); +} + +/** + * This class allows objects to work as arrays. + * @link http://php.net/manual/en/class.arrayobject.php + * + * @template TKey + * @template TValue + * @template-implements IteratorAggregate + * @template-implements ArrayAccess + */ +class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable { + /** + * Properties of the object have their normal functionality when accessed as list (var_dump, foreach, etc.). + */ + const STD_PROP_LIST = 1; + + /** + * Entries can be accessed as properties (read and write). + */ + const ARRAY_AS_PROPS = 2; + + /** + * Construct a new array object + * @link http://php.net/manual/en/arrayobject.construct.php + * + * @param array|object $input The input parameter accepts an array or an Object. + * @param int $flags Flags to control the behaviour of the ArrayObject object. + * @param string $iterator_class Specify the class that will be used for iteration of the ArrayObject object. ArrayIterator is the default class used. + * @psalm-param class-string>|class-string> $iterator_class + * + * @since 5.0.0 + */ + public function __construct($input = null, $flags = 0, $iterator_class = "ArrayIterator") { } + + /** + * Returns whether the requested index exists + * @link http://php.net/manual/en/arrayobject.offsetexists.php + * + * @param TKey $index The index being checked. + * @return bool true if the requested index exists, otherwise false + * + * @since 5.0.0 + */ + public function offsetExists($index) { } + + /** + * Returns the value at the specified index + * @link http://php.net/manual/en/arrayobject.offsetget.php + * + * @param TKey $index The index with the value. + * @return TValue The value at the specified index or false. + * + * @since 5.0.0 + */ + public function offsetGet($index) { } + + /** + * Sets the value at the specified index to newval + * @link http://php.net/manual/en/arrayobject.offsetset.php + * + * @param TKey $index The index being set. + * @param TValue $newval The new value for the index. + * @return void + * + * @since 5.0.0 + */ + public function offsetSet($index, $newval) { } + + /** + * Unsets the value at the specified index + * @link http://php.net/manual/en/arrayobject.offsetunset.php + * + * @param TKey $index The index being unset. + * @return void + * + * @since 5.0.0 + */ + public function offsetUnset($index) { } + + /** + * Appends the value + * @link http://php.net/manual/en/arrayobject.append.php + * + * @param TValue $value The value being appended. + * @return void + * + * @since 5.0.0 + */ + public function append($value) { } + + /** + * Creates a copy of the ArrayObject. + * @link http://php.net/manual/en/arrayobject.getarraycopy.php + * + * @return array a copy of the array. When the ArrayObject refers to an object + * an array of the public properties of that object will be returned. + * + * @since 5.0.0 + */ + public function getArrayCopy() { } + + /** + * Get the number of public properties in the ArrayObject + * When the ArrayObject is constructed from an array all properties are public. + * @link http://php.net/manual/en/arrayobject.count.php + * + * @return int The number of public properties in the ArrayObject. + * + * @since 5.0.0 + */ + public function count() { } + + /** + * Gets the behavior flags. + * @link http://php.net/manual/en/arrayobject.getflags.php + * + * @return int the behavior flags of the ArrayObject. + * + * @since 5.1.0 + */ + public function getFlags() { } + + /** + * Sets the behavior flags. + * + * It takes on either a bitmask, or named constants. Using named + * constants is strongly encouraged to ensure compatibility for future + * versions. + * + * The available behavior flags are listed below. The actual + * meanings of these flags are described in the + * predefined constants. + * + * + * ArrayObject behavior flags + * + * + * + * + * + * + * + * + * + * + * + * + *
valueconstant
1 + * ArrayObject::STD_PROP_LIST + *
2 + * ArrayObject::ARRAY_AS_PROPS + *
+ * + * @link http://php.net/manual/en/arrayobject.setflags.php + * + * @param int $flags The new ArrayObject behavior. + * @return void + * + * @since 5.1.0 + */ + public function setFlags($flags) { } + + /** + * Sort the entries by value + * @link http://php.net/manual/en/arrayobject.asort.php + * + * @return void + * + * @since 5.2.0 + */ + public function asort() { } + + /** + * Sort the entries by key + * @link http://php.net/manual/en/arrayobject.ksort.php + * + * @return void + * + * @since 5.2.0 + */ + public function ksort() { } + + /** + * Sort the entries with a user-defined comparison function and maintain key association + * @link http://php.net/manual/en/arrayobject.uasort.php + * + * Function cmp_function should accept two + * parameters which will be filled by pairs of entries. + * The comparison function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + * + * @param callable(TValue, TValue):int $cmp_function + * @return void + * + * @since 5.2.0 + */ + public function uasort($cmp_function) { } + + /** + * Sort the entries by keys using a user-defined comparison function + * @link http://php.net/manual/en/arrayobject.uksort.php + * + * Function cmp_function should accept two + * parameters which will be filled by pairs of entry keys. + * The comparison function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + * + * @param callable(TKey, TKey):int $cmp_function The callable comparison function. + * @return void + * + * @since 5.2.0 + */ + public function uksort($cmp_function) { } + + /** + * Sort entries using a "natural order" algorithm + * @link http://php.net/manual/en/arrayobject.natsort.php + * + * @return void + * + * @since 5.2.0 + */ + public function natsort() { } + + /** + * Sort an array using a case insensitive "natural order" algorithm + * @link http://php.net/manual/en/arrayobject.natcasesort.php + * + * @return void + * + * @since 5.2.0 + */ + public function natcasesort() { } + + /** + * Unserialize an ArrayObject + * @link http://php.net/manual/en/arrayobject.unserialize.php + * + * @param string $serialized The serialized ArrayObject + * @return void The unserialized ArrayObject + * + * @since 5.3.0 + */ + public function unserialize($serialized) { } + + /** + * Serialize an ArrayObject + * @link http://php.net/manual/en/arrayobject.serialize.php + * + * @return string The serialized representation of the ArrayObject. + * + * @since 5.3.0 + */ + public function serialize() { } + + /** + * Create a new iterator from an ArrayObject instance + * @link http://php.net/manual/en/arrayobject.getiterator.php + * + * @return ArrayIterator An iterator from an ArrayObject. + * + * @since 5.0.0 + */ + public function getIterator() { } + + /** + * Exchange the array for another one. + * @link http://php.net/manual/en/arrayobject.exchangearray.php + * + * @param mixed $input The new array or object to exchange with the current array. + * @return array the old array. + * + * @since 5.1.0 + */ + public function exchangeArray($input) { } + + /** + * Sets the iterator classname for the ArrayObject. + * @link http://php.net/manual/en/arrayobject.setiteratorclass.php + * + * @param string $iterator_class The classname of the array iterator to use when iterating over this object. + * @psalm-param class-string>|class-string> $iterator_class + * @return void + * + * @since 5.1.0 + */ + public function setIteratorClass($iterator_class) { } + + /** + * Gets the iterator classname for the ArrayObject. + * @link http://php.net/manual/en/arrayobject.getiteratorclass.php + * + * @return string the iterator class name that is used to iterate over this object. + * @psalm-return class-string>|class-string> + * + * @since 5.1.0 + */ + public function getIteratorClass() { } +} + +interface Serializable { + /** + * @return null|string + */ + public function serialize(); + + /** + * @param string $data + * @return void + */ + public function unserialize($data); +} + +/** + * @template-covariant T as object + * @psalm-immutable + */ +final class WeakReference +{ + // always fail + public function __construct() {} + + /** + * @template TIn as object + * @param TIn $referent + * @return WeakReference + */ + public static function create(object $referent): WeakReference {} + + /** @return ?T */ + public function get(): ?object {} +} + +/** + * @template TKey of object + * @template TVal of mixed + * @implements ArrayAccess + * @implements IteratorAggregate + * @implements Traversable + * + * @since 8.0.0 + */ +final class WeakMap implements ArrayAccess, Countable, IteratorAggregate, Traversable +{ + /** + * @param TKey $offset + * @return bool + */ + public function offsetExists($offset) {} + + /** + * @param TKey $offset + * @return TVal|null + * @psalm-ignore-nullable-return + */ + public function offsetGet($offset) {} + + /** + * @param TKey $offset + * @param TVal $value + * @return void + */ + public function offsetSet($offset, $value) {} + + /** + * @param TKey $offset + * @return void + */ + public function offsetUnset($offset) {} +} + + +#[Attribute] +final class ReturnTypeWillChange +{ + public function __construct() {} +} diff --git a/vendor/vimeo/psalm/stubs/CoreGenericFunctions.phpstub b/vendor/vimeo/psalm/stubs/CoreGenericFunctions.phpstub new file mode 100644 index 00000000..54bd9d8f --- /dev/null +++ b/vendor/vimeo/psalm/stubs/CoreGenericFunctions.phpstub @@ -0,0 +1,1368 @@ + + * + * @param TArray $array + * @param mixed $search_value + * @param bool $strict + * + * @return (TArray is non-empty-array ? non-empty-list : list) + * @psalm-pure + */ +function array_keys(array $array, $search_value = null, bool $strict = false) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TValue + * + * @param array $array + * @param array ...$arrays + * + * @return array + * @psalm-pure + */ +function array_intersect(array $array, array ...$arrays) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TValue + * + * @param array $array + * @param array ...$arrays + * + * @return array + * @psalm-pure + */ +function array_intersect_key(array $array, array ...$arrays) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TValue + * + * @param array $array + * @param array ...$arrays + * + * @return array + * @psalm-pure + */ +function array_intersect_assoc(array $array, array ...$arrays) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TValue + * + * @param array $keys + * @param array $values + * + * @return ( + * PHP_MAJOR_VERSION is 8 ? + * ($keys is non-empty-array ? non-empty-array : array) : + * ($keys is non-empty-array ? non-empty-array|false : array|false) + * ) + * @psalm-ignore-falsable-return + * @psalm-pure + */ +function array_combine(array $keys, array $values) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TValue + * + * @param array $array + * @param array ...$arrays + * + * @return array + * @psalm-pure + */ +function array_diff(array $array, array ...$arrays) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TValue + * + * @param array $array + * @param array ...$arrays + * + * @return array + * @psalm-pure + */ +function array_diff_key(array $array, array ...$arrays) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TValue + * + * @param array $array + * @param array ...$arrays + * + * @return array + * @psalm-pure + */ +function array_diff_assoc(array $array, array ...$arrays) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TValue + * + * @param array $array + * + * @return array + * @psalm-pure + */ +function array_flip(array $array) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TArray as array + * + * @param TArray $array + * + * @return (TArray is array ? null : TKey|null) + * @psalm-pure + * @psalm-ignore-nullable-return + */ +function key($array) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TArray as array + * + * @param TArray $array + * + * @return (TArray is array ? null : (TArray is non-empty-array ? TKey : TKey|null)) + * @psalm-pure + */ +function array_key_first($array) +{ +} + +/** + * @psalm-template TKey as array-key + * @psalm-template TArray as array + * + * @param TArray $array + * + * @return (TArray is array ? null : (TArray is non-empty-array ? TKey : TKey|null)) + * @psalm-pure + */ +function array_key_last($array) +{ +} + +/** + * @psalm-template T + * + * @param mixed $needle + * @param array $haystack + * @param bool $strict + * + * @return T|false + * @psalm-pure + */ +function array_search($needle, array $haystack, bool $strict = false) +{ +} + +/** + * @psalm-template T + * @psalm-template TArray as array + * + * @param TArray $array + * @param-out (TArray is non-empty-array ? non-empty-list : list) $array + */ +function shuffle(array &$array): bool +{ +} + +/** + * @psalm-template T + * @psalm-template TArray as array + * + * @param TArray $array + * @param-out (TArray is non-empty-array ? non-empty-list : list) $array + */ +function sort(array &$array, int $flags = SORT_REGULAR): bool +{ +} + +/** + * @psalm-template T + * @psalm-template TArray as array + * + * @param TArray $array + * @param-out (TArray is non-empty-array ? non-empty-list : list) $array + */ +function rsort(array &$array, int $flags = SORT_REGULAR): bool +{ +} + +/** + * @psalm-template T + * @psalm-template TArray as array + * + * @param TArray $array + * @param callable(T,T):int $callback + * @param-out (TArray is non-empty-array ? non-empty-list : list) $array + */ +function usort(array &$array, callable $callback): bool +{ +} + +/** + * @psalm-template TKey + * @psalm-template T + * @psalm-template TArray as array + * + * @param TArray $array + * @param callable(T,T):int $callback + * @param-out (TArray is non-empty-array ? non-empty-array : array) $array + */ +function uasort(array &$array, callable $callback): bool +{ +} + +/** + * @psalm-template TKey + * @psalm-template T + * @psalm-template TArray as array + * + * @param TArray $array + * @param callable(TKey,TKey):int $callback + * @param-out (TArray is non-empty-array ? non-empty-array : array) $array + */ +function uksort(array &$array, callable $callback): bool +{ +} + +/** + * @psalm-pure + * + * @psalm-template K of array-key + * @psalm-template T + * + * @param array $array + * + * @return array + */ +function array_change_key_case(array $array, int $case = CASE_LOWER) +{ +} + +/** + * @psalm-pure + * + * @psalm-template TKey as array-key + * + * @param TKey $key + * @param array $array + * + * @return bool + */ +function array_key_exists($key, array $array) : bool +{ +} + +/** + * @psalm-pure + * + * @psalm-template TKey as array-key + * @psalm-template TValue + * + * @param array ...$arrays + * + * @return array + */ +function array_merge_recursive(array ...$arrays) +{ +} + +/** + * @psalm-pure + * + * @psalm-template TKey as array-key + * @psalm-template TValue + * + * @param array $keys + * @param TValue $value + * + * @return array + */ +function array_fill_keys(array $keys, $value): array +{ +} + +/** + * @psalm-pure + * + * @psalm-template TKey + * + * @param string $pattern + * @param array $array + * @param 0|1 $flags 1=PREG_GREP_INVERT + * @return array + */ +function preg_grep($pattern, array $array, $flags = 0) +{ +} + +/** + * @param resource $stream + * @param-out closed-resource $stream + */ +function fclose(&$stream) : bool +{ +} + +/** + * @param string $string + * @param-out null $string + */ +function sodium_memzero(string &$string): void +{ +} + +/** + * @param mixed $value + * @param bool $return + * @return ($return is true ? string : void) + * + * @psalm-taint-specialize + * @psalm-flow ($value) -> return + * @psalm-taint-sink html $value + */ +function var_export($value, bool $return = false) {} + +/** + * @param mixed $value + * @param list $values + * @return string + * + * @psalm-taint-specialize + * @psalm-flow ($value, $values) -> return + * @psalm-taint-sink html $value + * @psalm-taint-sink html $values + */ +function var_dump($value, ...$values) {} + +/** + * @param mixed $value + * @param bool $return + * @return ($return is true ? string : true) + * + * @psalm-taint-specialize + * @psalm-flow ($value) -> return + * @psalm-taint-sink html $value + */ +function print_r($value, bool $return = false) {} + +/** + * @psalm-pure + * + * @psalm-taint-sink file $filename + * @param mixed $filename + * @return ($return is true ? string : bool) + */ +function highlight_file($filename, bool $return = false) {} + +/** + * @psalm-pure + * + * @psalm-taint-sink file $filename + * @param mixed $filename + * @return ($return is true ? string : bool) + */ +function show_source($filename, bool $return = false) {} + +/** + * @psalm-pure + * + * @psalm-taint-sink file $filename + */ +function php_strip_whitespace(string $filename) : string {} + +/** + * @psalm-pure + * + * @param mixed $string + * @return ($return is true ? string : bool) + * + * @psalm-flow ($string) -> return + */ +function highlight_string($string, bool $return = false) {} + +/** + * @psalm-pure + * + * @return ($as_float is true ? float : string) + */ +function microtime(bool $as_float = false) {} + +/** + * @psalm-pure + * + * @return ($as_float is true ? float : array) + */ +function gettimeofday(bool $as_float = false) {} + +/** + * @psalm-pure + * + * @param numeric $num + * @return ($num is int ? positive-int|0 : ($num is float ? float : positive-int|0|float)) + */ +function abs($num) {} + +/** + * @psalm-pure + * + * @template T as string|int|float + * @template TStep as int|float + * @param T $start + * @param T $end + * @param TStep $step + * @return ( + * T is int + * ? (TStep is int ? non-empty-list : non-empty-list) + * : ( + * T is float + * ? non-empty-list + * : ( + * T is string + * ? non-empty-list + * : ( + * T is int|float + * ? non-empty-list + * : non-empty-list + * ) + * ) + * ) + * ) + */ +function range($start, $end, $step = 1) {} + +/** + * @psalm-pure + * + * @return ( + * $format is 'd'|'j'|'N'|'w'|'z'|'W'|'m'|'n'|'t'|'L'|'o'|'Y'|'y'|'B'|'g'|'G'|'h'|'H'|'i'|'s'|'u'|'v'|'Z'|'U'|'I' + * ? numeric-string + * : ($timestamp is numeric ? string : string|false) + * ) + */ +function date(string $format, int $timestamp = 0) {} + +/** + * @psalm-pure + * + * @param mixed $vars + * @param-out string|int|float|null $vars + * @psalm-flow ($string, $format) -> return + * @return (func_num_args() is 2 ? (null|list) : int) + */ +function sscanf(string $string, string $format, &...$vars) {} + +/** + * @psalm-pure + * + * @return ( + * func_num_args() is 1 + * ? array{dirname: string, basename: string, extension?: string, filename: string} + * : string + * ) + */ +function pathinfo(string $path, int $flags = \PATHINFO_DIRNAME) {} + +/** + * @psalm-pure + * + * @return (func_num_args() is 0 ? array : string|false) + */ +function getenv(string $varname = '', bool $local_only = false) {} + +/** + * @psalm-pure + * + * @return ( + * $string is non-empty-string ? non-empty-lowercase-string : lowercase-string + * ) + * + * @psalm-flow ($string) -> return + */ +function strtolower(string $string) : string {} + +/** + * @psalm-pure + * + * @return ( + * $string is non-falsy-string + * ? non-falsy-string + * : ($string is non-empty-string ? non-empty-string : string) + * ) + * + * @psalm-flow ($string) -> return + */ +function strtoupper(string $string) : string {} + +/** + * @psalm-pure + * + * @param string|array $string + * @param string|array $replace + * @param int|array $offset + * @param null|int|array $length + * + * @return ($string is array ? array : string) + * + * @psalm-flow ($string, $replace) -> return + */ +function substr_replace($string, $replace, $offset, $length = null) {} + +/** + * @psalm-pure + * + * @param string $haystack + * + * @psalm-return positive-int|0|false + */ +function strpos($haystack, $needle, int $offset = 0) : int {} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function trim(string $string, string $characters = " \t\n\r\0\x0B") : string {} + +/** + * @psalm-pure + * + * @return ($string is class-string ? ($characters is '\\' ? class-string : string) : string) + * + * @psalm-flow ($string) -> return + */ +function ltrim(string $string, string $characters = " \t\n\r\0\x0B") : string {} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function rtrim(string $string, string $characters = " \t\n\r\0\x0B") : string {} + +/** + * @psalm-pure + * + * @param string|array $separator + * @param array $array + * + * @return ( + * $separator is non-empty-string + * ? ($array is non-empty-array + * ? ($array is array + * ? ($separator is literal-string ? non-empty-literal-string : non-empty-string) + * : non-empty-string + * ) + * : string) + * : ($array is non-empty-array + * ? ($array is array + * ? ($array is array ? non-empty-literal-string : non-empty-string) + * : string + * ) + * : string) + * ) + * + * @psalm-flow ($separator) -> return + * @psalm-flow ($array) -(array-fetch)-> return + */ +function implode($separator, array $array = []) : string {} + +/** + * @psalm-pure + * + * @param string|array $separator + * @param array $array + * + * @return ( + * $separator is non-empty-string + * ? ($array is non-empty-array + * ? ($array is array + * ? ($separator is literal-string ? non-empty-literal-string : non-empty-string) + * : non-empty-string + * ) + * : string) + * : ($array is non-empty-array + * ? ($array is array + * ? ($array is array ? non-empty-literal-string : non-empty-string) + * : string + * ) + * : string) + * ) + * + * @psalm-flow ($separator) -> return + * @psalm-flow ($array) -(array-fetch)-> return + */ +function join($separator, array $array = []): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -(array-assignment)-> return + */ +function explode(string $separator, string $string, int $limit = -1) : array {} + +/** + * @psalm-pure + * + * @psalm-flow ($subject) -(array-assignment)-> return + * + * @template TFlags as int-mask<0, 1, 2, 4> + * + * @param TFlags $flags + * + * @return (TFlags is 0|2 ? non-empty-list|false : (TFlags is 1|3 ? list|false : list|false)) + * + * @psalm-ignore-falsable-return + */ +function preg_split(string $pattern, string $subject, int $limit = -1, int $flags = 0) {} + +/** + * @param array $array + * + * @return ( + * $array is array + * ? int + * : ($array is array + * ? float + * : float|int + * ) + * ) + */ +function array_sum(array $array) {} + +/** + * @param array $array + * + * @return ( + * $array is array + * ? int + * : ($array is array + * ? float + * : float|int + * ) + * ) + */ +function array_product(array $array) {} + +/** + * 257 is FILTER_VALIDATE_INT + * @psalm-taint-escape ($filter is 257 ? 'html' : null) + * + * 258 is FILTER_VALIDATE_BOOLEAN + * @psalm-taint-escape ($filter is 258 ? 'html' : null) + * + * 259 is FILTER_VALIDATE_FLOAT + * @psalm-taint-escape ($filter is 259 ? 'html' : null) + * + * @psalm-flow ($value, $filter, $options) -> return + */ +function filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed {} + +/** + * @psalm-pure + * + * @psalm-taint-escape html + * @psalm-flow ($string) -> return + */ +function strip_tags(string $string, ?string $allowed_tags = null) : string {} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function stripcslashes(string $string) : string {} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function stripslashes(string $string) : string {} + +/** + * @psalm-pure + * + * Tainting is handled in a plugin + * + * @psalm-flow ($string) -> return + */ +function htmlentities(string $string, ?int $flags = null, ?string $encoding = null, bool $double_encode = true) : string {} + +/** + * @psalm-pure + * + * Tainting is handled in a plugin + * + * @psalm-flow ($string) -> return + */ +function html_entity_decode(string $string, ?int $flags = null, ?string $encoding = null) : string {} + +/** + * @psalm-pure + * + * Tainting is handled in a plugin + * + * @psalm-flow ($string) -> return + * @psalm-return ( + * $string is non-empty-string + * ? non-empty-string + * : string + * ) + */ +function htmlspecialchars(string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = 'UTF-8', bool $double_encode = true) : string {} + +/** + * @psalm-pure + * + * Tainting is handled in a plugin + * + * @psalm-flow ($string) -> return + */ +function htmlspecialchars_decode(string $string, ?int $flags = null) : string {} + +/** + * @psalm-pure + * + * @psalm-return ( + * $string is '' + * ? 0 + * : ( + * $string is non-empty-string + * ? positive-int + * : (0|positive-int) + * ) + * ) + */ +function strlen(string $string) : int {} + +/** + * @psalm-pure + * + * @param string|array $search + * @param string|array $replace + * @param string|array $subject + * @param int $count + * @return ($subject is array ? array : string) + * + * @psalm-flow ($replace, $subject) -> return + */ +function str_replace($search, $replace, $subject, &$count = null) {} + +/** + * @psalm-pure + * + * @param string|array $search + * @param string|array $replace + * @param string|array $subject + * @param int $count + * @return ($subject is array ? array : string) + * + * @psalm-flow ($replace, $subject) -> return + */ +function str_ireplace($search, $replace, $subject, &$count = null) {} + +/** + * @psalm-pure + * + * @return ($string is non-empty-string ? non-empty-string : ($length is positive-int ? non-empty-string: string)) + * + * @psalm-flow ($string, $pad_string) -> return + */ +function str_pad(string $string, int $length, $pad_string = '', int $pad_type = STR_PAD_RIGHT): string {} + +/** + * @psalm-pure + * + * @todo update $times to be `0|positive-int` + * @return ( + * $string is non-empty-string + * ? ( + * $times is positive-int + * ? non-empty-string + * : ($times is 0 ? '' : string) + * ) + * : ($times is 0 ? '' : string) + * ) + * + * @psalm-flow ($string) -> return + */ +function str_repeat(string $string, int $times): string {} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function str_rot13(string $string): string {} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function str_shuffle(string $string): string {} + +/** + * @psalm-pure + * @return ($length is positive-int ? list : false) + * + * @psalm-flow ($string) -> return + */ +function str_split(string $string, int $length = 1) {} + +/** + * @psalm-pure + * @return string|false + * @psalm-ignore-falsable-return + * + * @psalm-flow ($haystack) -> return + */ +function strstr(string $haystack, string $needle, bool $before_needle = false) {} + +/** + * @psalm-pure + * @return string|false + * @psalm-ignore-falsable-return + * + * @psalm-flow ($haystack) -> return + */ +function stristr(string $haystack, string $needle, bool $before_needle = false) {} + +/** + * @psalm-pure + * @return string|false + * @psalm-ignore-falsable-return + * + * @psalm-flow ($haystack) -> return + */ +function strchr(string $haystack, string $needle, bool $before_needle = false) {} + +/** + * @psalm-pure + * @return string|false + * @psalm-ignore-falsable-return + * + * @psalm-flow ($string) -> return + */ +function strpbrk(string $string, string $characters) {} + +/** + * @psalm-pure + * @return string|false + * @psalm-ignore-falsable-return + * + * @psalm-flow ($haystack) -> return + */ +function strrchr(string $haystack, string $needle) {} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function strrev(string $string): string {} + +/** + * @psalm-pure + * + * @param 0|1|2 $format + * @return ( + * $format is 0 ? + * int : + * ( + * $format is 1 ? + * list : + * array + * ) + * ) + */ +function str_word_count(string $string, int $format = 0, string|null $characters = null) {} + +/** + * @psalm-pure + * + * @param string|string[] $pattern + * @param string|array $replacement + * @param string|array $subject + * @param int $count + * @return ($subject is array ? array : string|null) + * + * @psalm-flow ($replacement, $subject) -> return + */ +function preg_filter($pattern, $replacement, $subject, int $limit = -1, &$count = null) {} + +/** + * @psalm-pure + * + * @param string|string[] $pattern + * @param string|array $replacement + * @param string|array $subject + * @param int $count + * @return ($subject is array ? array|null : string|null) + * + * @psalm-flow ($replacement, $subject) -> return + */ +function preg_replace($pattern, $replacement, $subject, int $limit = -1, &$count = null) {} + +/** + * @param string|string[] $pattern + * @param callable(string[]):string $callback + * @param string|array $subject + * @param int $count + * @return ($subject is array ? array|null : string|null) + * + * @psalm-taint-specialize + * @psalm-flow ($subject) -> return + */ +function preg_replace_callback($pattern, $callback, $subject, int $limit = -1, &$count = null, int $flags = 0) {} + +/** + * @psalm-pure + * @template TFlags as int + * + * @param string $pattern + * @param string $subject + * @param mixed $matches + * @param TFlags $flags + * @param-out ( + * TFlags is 1 + * ? array> + * : (TFlags is 2 + * ? list> + * : (TFlags is 256|257 + * ? array> + * : (TFlags is 258 + * ? list> + * : (TFlags is 512|513 + * ? array> + * : (TFlags is 514 + * ? list> + * : (TFlags is 770 + * ? list> + * : array + * ) + * ) + * ) + * ) + * ) + * ) + * ) $matches + * @return int|false + * @psalm-ignore-falsable-return + */ +function preg_match_all($pattern, $subject, &$matches = [], int $flags = 1, int $offset = 0) {} + +/** + * @psalm-pure + * @template TFlags as int-mask<0, 256, 512> + * + * @param string $pattern + * @param string $subject + * @param mixed $matches + * @param TFlags $flags + * @param-out (TFlags is 256 ? array : + * TFlags is 512 ? array : + * TFlags is 768 ? array : + * array + * ) $matches + * @return 1|0|false + * @psalm-ignore-falsable-return + */ +function preg_match($pattern, $subject, &$matches = [], int $flags = 0, int $offset = 0) {} + +/** + * @psalm-pure + * + * @return (PHP_MAJOR_VERSION is 5|7 ? string|false : string) + * @psalm-ignore-falsable-return + * + * @psalm-flow ($string) -> return + */ +function substr(string $string, int $offset, ?int $length = null) {} + +/** + * @psalm-pure + * + * @psalm-flow ($str) -> return + */ +function preg_quote(string $str, ?string $delimiter = null) : string {} + +/** + * @psalm-pure + * + * @param string|int|float $values + * + * @psalm-flow ($format, $values) -> return + */ +function sprintf(string $format, ...$values) : string {} + +/** + * @psalm-pure + * @return string|false + * @psalm-ignore-falsable-return + * + * @psalm-flow ($format, $values) -> return + */ +function vsprintf(string $format, array $values) {} + +/** + * @psalm-pure + * @return string + * + * @psalm-flow ($string) -> return + */ +function wordwrap(string $string, int $width = 75, string $break = "\n", bool $cut_long_words = false) : string {} + +/** + * @psalm-pure + * + * @param string|int|float $values + * + * @psalm-taint-specialize + * @psalm-flow ($format, $values) -> return + * @psalm-taint-sink html $format + * @psalm-taint-sink html $values + */ +function printf(string $format, ...$values) : string {} + +/** + * @psalm-taint-specialize + * @psalm-taint-sink html $format + * @psalm-taint-sink html $values + */ +function vprintf(string $format, array $values) : int {} + +/** + * @psalm-pure + * + * @return string|false + * @psalm-ignore-falsable-return + * + * @psalm-flow ($path) -> return + */ +function realpath(string $path) {} + +/** + * @psalm-pure + * + * @param numeric-string $num1 + * @param numeric-string $num2 + * @return (PHP_MAJOR_VERSION is 8 ? numeric-string : ($num2 is "0" ? null : numeric-string)) + */ +function bcdiv(string $num1, string $num2, int $scale = 0): ?string {} + +/** + * @psalm-pure + * + * @param scalar|null|object $value + * @return string The string value of var. + * + * @psalm-flow ($value) -> return + */ +function strval ($value): string {} + +/** + * @return ($string is non-empty-string ? non-empty-list : non-empty-list|array{null}) + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function str_getcsv(string $string, string $separator = ',', string $enclosure = '"', string $escape = '\\\\') +{ +} + +/** + * @template TKey as array-key + * @template TArray as array + * + * @param TArray $array + * + * @return (TArray is non-empty-array ? non-empty-array : array) + * + * @psalm-pure + */ +function array_count_values(array $array): array {} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function addcslashes(string $string, string $characters) : string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function addslashes(string $string): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function ucfirst(string $string): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string, $separators) -> return + */ +function ucwords (string $string, string $separators = " \t\r\n\f\v"): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function lcfirst(string $string): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function nl2br(string $string, bool $use_xhtml = false): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function quoted_printable_decode(string $string): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function quoted_printable_encode(string $string): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function quotemeta(string $string): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function chop(string $string, string $characters = " \t\n\r\0\x0B"): string +{ +} + +/** + * @psalm-pure + * @psalm-flow ($string, $separator) -> return + */ +function chunk_split(string $string, int $length = 76, string $separator= ''): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function convert_uudecode(string $string): string +{ +} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function convert_uuencode(string $string) : string +{ +} + +/** + * @psalm-pure + * + * @psalm-taint-escape ldap + * @psalm-flow ($value) -> return + */ +function ldap_escape(string $value, string $ignore = "", int $flags = 0) : string {} + +/** + * @psalm-pure + * + * @return mixed + * @psalm-flow ($json) -> return + */ +function json_decode(string $json, ?bool $associative = null, int $depth = 512, int $flags = 0) {} + +/** + * @psalm-pure + * + * @return ($flags is 4194304 ? string : string|false) + * + * @psalm-flow ($value) -> return + * @psalm-ignore-falsable-return + */ +function json_encode(mixed $value, int $flags = 0, int $depth = 512) {} + +/** + * @psalm-pure + * + * @return string|false + * + * @psalm-flow ($values) -> return + * @psalm-ignore-falsable-return + */ +function pack(string $format, mixed ...$values) {} + +/** + * @psalm-pure + * + * @param string|int $in_codepage + * @param string|int $out_codepage + * @psalm-flow ($subject) -> return + */ +function sapi_windows_cp_conv($in_codepage, $out_codepage, string $subject) : ?string {} + +/** + * @psalm-pure + * + * @psalm-flow ($prefix) -> return + */ +function uniqid(string $prefix = "", bool $more_entropy = false) : string {} + +/** + * @psalm-pure + * + * @return array|false + * @psalm-ignore-falsable-return + * + * @psalm-flow ($string) -> return + */ +function unpack(string $format, string $string, int $offset = 0) {} + +/** + * @psalm-pure + * + * @return string|false + * + * @psalm-flow ($string) -> return + * @psalm-ignore-falsable-return + */ +function base64_decode(string $string, bool $strict = false) {} + +/** + * @psalm-pure + * + * @psalm-flow ($string) -> return + */ +function base64_encode(string $string) : string {} + +/** + * @psalm-pure + * + * @param resource|null $context + * + * @return ($associative is 0 ? list : array>)|false + * + * @psalm-taint-sink ssrf $url + */ +function get_headers(string $url, int $associative = 0, $context = null) : array|false {} + +/** + * @psalm-pure + * + * @return array|false + * + * @psalm-taint-sink ssrf $filename + */ +function get_meta_tags(string $filename, bool $use_include_path = false) : array|false {} + +/** + * @return ($categorize is false ? array : array>) + */ +function get_defined_constants(bool $categorize = false): array {} + +/** + * @param mixed $object_or_class + * @param class-string $class + * @param bool $allow_string + * @return ($allow_string is false ? ($object_or_class is object ? bool : false) : bool) + */ +function is_a($object_or_class, string $class, $allow_string = false): bool{} + +/** + * @template T of array|string + * @param T $string + * @return (T is array ? array : T is array ? array : string|false) + * @psalm-ignore-falsable-return + */ +function mb_convert_encoding(array|string $string, string $to_encoding, array|string|null $from_encoding = null): array|string|false{} + +/** + * @template TRead of null|array + * @template TWrite of null|array + * @template TExcept of null|array + * @param TRead $read + * @param TWrite $write + * @param TExcept $except + * @return false|int<0, max> + * @param-out (TRead is null ? null : array) $read + * @param-out (TWrite is null ? null : array) $write + * @param-out (TExcept is null ? null : array) $except + * @psalm-suppress ReferenceConstraintViolation + */ +function stream_select(null|array &$read, null|array &$write, null|array &$except, null|int $seconds, null|int $microseconds = null) : bool|int {} diff --git a/vendor/vimeo/psalm/stubs/CoreGenericIterators.phpstub b/vendor/vimeo/psalm/stubs/CoreGenericIterators.phpstub new file mode 100644 index 00000000..c20e54de --- /dev/null +++ b/vendor/vimeo/psalm/stubs/CoreGenericIterators.phpstub @@ -0,0 +1,1094 @@ + + */ +interface IteratorAggregate extends Traversable { + + /** + * @return Traversable An instance of an object implementing Iterator or Traversable + */ + public function getIterator(); +} + +/** + * @template-covariant TKey + * @template-covariant TValue + * + * @template-extends Traversable + */ +interface Iterator extends Traversable { + + /** + * @return TValue|null returns current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current(); + + /** + * @return void Any returned value is ignored. + */ + public function next(); + + /** + * @return TKey|null current key or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key(); + + /** + * @return bool The return value will be casted to boolean and then evaluated. + * Returns true on success or false on failure. + */ + public function valid(); + + /** + * @return void Any returned value is ignored. + */ + public function rewind(); +} + +/** + * @template-covariant TKey + * @template-covariant TValue + * + * @template-extends Iterator + */ +interface OuterIterator extends Iterator { + /** + * @return Iterator + */ + public function getInnerIterator(); +} + +/** + * @template-covariant TKey + * @template-covariant TValue + * + * @template-extends Iterator + */ +interface RecursiveIterator extends Iterator { + + /** + * @return bool true if the current entry can be iterated over, otherwise returns false. + */ + public function hasChildren(); + + /** + * @return RecursiveIterator An iterator for the current entry. + */ + public function getChildren(); +} + +/** + * @template-covariant TKey + * @template-covariant TValue + * @template-extends Iterator + */ +interface SeekableIterator extends Iterator { + /** + * Seeks to a position + * @link https://php.net/manual/en/seekableiterator.seek.php + * + * @param int $position The position to seek to. + * @return void + * + * @since 5.1.0 + */ + public function seek($position); +} + +/** + * @template-covariant TKey + * @template-covariant TValue + * @template TIterator as Traversable + * + * @template-implements OuterIterator + * + * @mixin TIterator + */ +class IteratorIterator implements OuterIterator { + /** + * @param TIterator $iterator + */ + public function __construct(Traversable $iterator) {} + + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current key value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + +/** + * @template TKey + * @template TValue + * @template TIterator as Traversable + * + * @template-extends IteratorIterator + */ +class AppendIterator extends IteratorIterator { + public function __construct(){} + + /** + * @param TIterator $iterator + * @return void + */ + public function append(Iterator $iterator) {} + + /** + * @return ArrayIterator + */ + public function getArrayIterator() {} + + /** + * @return int + */ + public function getIteratorIndex() {} + + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + +/** + * @template TKey as array-key + * @template TValue + * @template-implements SeekableIterator + * @template-implements ArrayAccess + */ +class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Countable { + const STD_PROP_LIST = 1; + const ARRAY_AS_PROPS = 2; + + /** + * @param array $array The array or object to be iterated on. + * @param int-mask-of $flags Flags to control the behaviour of the ArrayObject object. + */ + public function __construct($array = array(), $flags = 0) { } + + /** + * @param TKey $index The offset being checked. + * @return bool true if the offset exists, otherwise false + */ + public function offsetExists($index) { } + + /** + * @param TKey $index The offset to get the value from. + * @return TValue|null The value at offset index, null when accessing invalid indexes + * @psalm-ignore-nullable-return + */ + public function offsetGet($index) { } + + /** + * @param TKey $index The index to set for. + * @param TValue $newval The new value to store at the index. + * @return void + */ + public function offsetSet($index, $newval) { } + + /** + * @param TKey $index The offset to unset. + * @return void + */ + public function offsetUnset($index) { } + + /** + * @param TValue $value The value to append. + * @return void + */ + public function append($value) { } + + /** + * @return array A copy of the array, or array of public properties + * if ArrayIterator refers to an object. + */ + public function getArrayCopy() { } + + /** + * @return int The number of elements or public properties in the associated + * array or object, respectively. + */ + public function count() { } + + /** + * @return int-mask-of The current flags. + */ + public function getFlags() { } + + /** + * @param int-mask-of $flags bitmask + * @return void + */ + public function setFlags($flags) { } + + /** + * @return void + */ + public function asort() { } + + /** + * @return void + */ + public function ksort() { } + + /** + * @param callable(TValue,TValue):int $cmp_function The compare function used for the sort. + * @return void + */ + public function uasort($cmp_function) { } + + /** + * @param callable(TKey,TKey):int $cmp_function The compare function used for the sort. + * @return void + */ + public function uksort($cmp_function) { } + + /** + * @return void + */ + public function natsort() { } + + /** + * @return void + */ + public function natcasesort() { } + + /** + * @param string $serialized The serialized ArrayIterator object to be unserialized. + * @return void + */ + public function unserialize($serialized) { } + + /** + * @return string The serialized ArrayIterator + */ + public function serialize() { } + + /** + * @return void + */ + public function rewind() { } + + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() { } + + /** + * @return TKey|null The current array key or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() { } + + /** + * @return void + */ + public function next() { } + + /** + * @return bool + */ + public function valid() { } + + /** + * @param int $position The position to seek to. + * @return void + */ + public function seek($position) { } +} + +/** + * @template-covariant TKey + * @template-covariant TValue + * + * @template-extends IteratorIterator + */ +class FilterIterator extends IteratorIterator { + /** @return bool */ + abstract public function accept(); + + /** + * @return TValue Can return any type. + */ + public function current() {} + + /** + * @return TKey scalar on success, or null on failure. + */ + public function key() {} +} + +/** + * @template-covariant TKey + * @template-covariant TValue + * + * @template-implements OuterIterator + * @template-implements ArrayAccess + * + * @template-extends IteratorIterator + */ +class CachingIterator extends IteratorIterator implements OuterIterator , ArrayAccess , Countable { + const CALL_TOSTRING = 1 ; + const CATCH_GET_CHILD = 16 ; + const TOSTRING_USE_KEY = 2 ; + const TOSTRING_USE_CURRENT = 4 ; + const TOSTRING_USE_INNER = 8 ; + const FULL_CACHE = 256 ; + + /** + * @param Iterator $iterator + * @param int-mask-of $flags + */ + public function __construct(Iterator $iterator, int $flags = self::CALL_TOSTRING) {} + + /** @return bool */ + public function hasNext () {} + + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current key or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + +/** + * @template-covariant TKey + * @template-covariant TValue + * + * @template-implements OuterIterator + * + * @template-extends FilterIterator + */ +class CallbackFilterIterator extends FilterIterator implements OuterIterator { + /** + * @param Iterator $iterator + * @param callable(TValue, TKey, Iterator): bool $callback + */ + public function __construct(Iterator $iterator, callable $callback) {} + + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current key or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + +/** + * @template-implements SeekableIterator + */ +class DirectoryIterator extends SplFileInfo implements SeekableIterator { + + public function __construct(string $path){} + + /** + * @return self + */ + public function current() {} + /** + * @return int|false + * @psalm-ignore-falsable-return + */ + public function key() {} + + /** + * @return void + */ + public function next(){} + /** + * @return void + */ + public function rewind(){} + + /** + * @param int $position + */ + public function seek($position) {} + + /** + * @return bool + */ + public function valid(){} +} + +/** + * @template-implements Iterator + */ +class EmptyIterator implements Iterator { + /** + * @return empty + */ + public function current() {} + /** + * @return empty + */ + public function key() {} + /** + * @return void + */ + public function next() {} + /** + * @return void + */ + public function rewind() {} + + /** + * @return false + */ + public function valid() {} +} + +/** + * @template-extends SeekableIterator + */ +class FilesystemIterator extends DirectoryIterator +{ + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const CURRENT_MODE_MASK = 240; + const KEY_AS_PATHNAME = 0; + const KEY_AS_FILENAME = 256; + const FOLLOW_SYMLINKS = 512; + const KEY_MODE_MASK = 3840; + const NEW_CURRENT_AND_KEY = 256; + const SKIP_DOTS = 4096; + const UNIX_PATHS = 8192; + + /** + * @param int-mask $flags + */ + public function __construct(string $path, int $flags = self::KEY_AS_PATHNAME|self::CURRENT_AS_FILEINFO|self::SKIP_DOTS) {} + + /** + * @return FilesystemIterator|SplFileInfo|string|null + * @psalm-ignore-nullable-return + */ + public function current() {} + /** + * @return int-mask + */ + public function getFlags() {} + + /** + * @param int-mask $flags + * @return void + */ + public function setFlags($flags) {} + /** + * @return string|null + * @psalm-ignore-nullable-return + */ + public function key() {} +} + + + +/** + * @template-extends SeekableIterator + */ +class GlobIterator extends FilesystemIterator implements Countable { + /** + * @return int + */ + public function count() {} +} + +/** + * @template-covariant TKey + * @template-covariant TValue + * + * @template-extends IteratorIterator + */ +class InfiniteIterator extends IteratorIterator { + /** + * @param Iterator $iterator + */ + public function __construct(Iterator $iterator) {} + + /** + * @return TValue|null current value or null if iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current key or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + +/** + * @template-covariant TKey + * @template-covariant TValue + * + * @template-implements OuterIterator + * + * @template-extends IteratorIterator + */ +class LimitIterator extends IteratorIterator implements OuterIterator { + /** + * @param Iterator $iterator + */ + public function __construct(Iterator $iterator, int $offset = 0, int $count = -1) {} + + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current key or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + + + +/** + * @template-covariant TKey + * @template-covariant TValue + * + * @template-extends IteratorIterator + */ +class NoRewindIterator extends IteratorIterator { + /** + * @param Iterator $iterator + */ + public function __construct(Iterator $iterator) {} + + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + +/** + * + * @template-covariant TKey + * @template-covariant TValue + * + * @template-implements Iterator + */ +class MultipleIterator implements Iterator { + const MIT_NEED_ANY = 0 ; + const MIT_NEED_ALL = 1 ; + const MIT_KEYS_NUMERIC = 0 ; + const MIT_KEYS_ASSOC = 2 ; + + /** + * @param int-mask-of $flags + */ + public function __construct (int $flags = 0) {} + /** + * @param Iterator $iterator + * @param string|int $infos + * @return void + */ + public function attachIterator(Iterator $iterator, $infos = '') {} + /** + * @param Iterator $iterator + * @return bool + */ + public function containsIterator(Iterator $iterator) {} + + /** + * @return int + */ + public function countIterators() {} + /** + * nullable values are returned when MIT_NEED_ANY is set + * and one of the iterators is already drained. + * When MIT_NEED_ALL is set and one of the iterators + * is already drained, `current()` throws + * + * @return array + */ + public function current() {} + /** + * @param Iterator $iterator + * @return void + */ + public function detachIterator(Iterator $iterator) {} + /** + * @return int-mask-of + */ + public function getFlags() {} + /** + * @return array + */ + public function key() {} + /** + * @param int-mask-of $flags + * @return void + */ + public function setFlags( int $flags ) {} +} + +/** + * @template TKey + * @template TValue + * + * @template-extends FilterIterator + * @template-implements RecursiveIterator + */ +abstract class RecursiveFilterIterator extends FilterIterator implements RecursiveIterator { + + /** + * @param RecursiveIterator $iterator + */ + public function __construct(RecursiveIterator $iterator) {} + /** + * @return RecursiveFilterIterator + */ + public function getChildren() {} + + /** + * @return bool + */ + public function hasChildren() {} + + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + +/** + * @template TKey + * @template TValue + * + * @template-extends RecursiveFilterIterator + */ +class ParentIterator extends RecursiveFilterIterator implements RecursiveIterator, OuterIterator { + + /** + * @return bool + */ + public function accept() {} + /** + * @param RecursiveIterator $iterator + */ + public function __construct(RecursiveIterator $iterator) {} + /** + * @return ParentIterator + */ + public function getChildren() {} + + /** + * @return bool + */ + public function hasChildren() {} + /** + * @return void + */ + public function next() {} + /** + * @return void + */ + public function rewind() {} + + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current key or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + +/** + * @template TKey + * @template TValue + * + * @template-implements RecursiveIterator + * @template-extends ArrayIterator + */ +class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator { + const STD_PROP_LIST = 1 ; + const ARRAY_AS_PROPS = 2 ; + const CHILD_ARRAYS_ONLY = 4 ; + + /** + * @return RecursiveArrayIterator + */ + public function getChildren() {} + + /** + * @return bool + */ + public function hasChildren() {} + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current key or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + +/** + * @template TKey + * @template TValue + * + * @template-implements RecursiveIterator + * @template-extends ArrayIterator + */ +class RecursiveCachingIterator extends CachingIterator implements RecursiveIterator { + + const CALL_TOSTRING = 1 ; + const CATCH_GET_CHILD = 16 ; + const TOSTRING_USE_KEY = 2 ; + const TOSTRING_USE_CURRENT = 4 ; + const TOSTRING_USE_INNER = 8 ; + const FULL_CACHE = 256 ; + + /** + * @param Iterator $iterator + * @param int-mask-of $flags + */ + public function __construct(Iterator $iterator, int $flags = 0) {} + /** + * @return RecursiveCachingIterator + */ + public function getChildren() {} + + /** + * @return bool + */ + public function hasChildren() {} + + /** + * @return TValue|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return TKey|null current key or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + +/** + * @template TKey + * @template TValue + * + * @template-implements RecursiveIterator + * @template-extends CallbackFilterIterator + */ +class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator { + + /** + * @param RecursiveIterator $iterator + * @param callable(TValue, TKey, RecursiveIterator): bool $callback + */ + public function __construct(RecursiveIterator $iterator, callable $callback) {} + /** + * @return RecursiveCallbackFilterIterator + */ + public function getChildren() {} + + /** + * @return bool + */ + public function hasChildren() {} + + /** + * @return TValue|null current value or null when iterator is drained + */ + public function current() {} + + /** + * @return TKey|null current value or null when iterator is drained + */ + public function key() {} +} + +/** + * @template-implements RecursiveIterator + * @template-implements SeekableIterator + */ +class RecursiveDirectoryIterator extends FilesystemIterator implements RecursiveIterator, SeekableIterator { + + const CURRENT_AS_PATHNAME = 32 ; + const CURRENT_AS_FILEINFO = 0 ; + const CURRENT_AS_SELF = 16 ; + const CURRENT_MODE_MASK = 240 ; + const KEY_AS_PATHNAME = 0 ; + const KEY_AS_FILENAME = 256 ; + const FOLLOW_SYMLINKS = 512 ; + const KEY_MODE_MASK = 3840 ; + const NEW_CURRENT_AND_KEY = 256 ; + const SKIP_DOTS = 4096 ; + const UNIX_PATHS = 8192 ; + + /** + * @param string $path + * @param int-mask $flags + */ + public function __construct(string $path, int $flags = self::KEY_AS_PATHNAME|self::CURRENT_AS_FILEINFO) {} + + /** + * @return string + */ + public function getSubPath() {} + /** + * @return string + */ + public function getSubPathname() {} + + /** + * @return RecursiveDirectoryIterator|string|SplFileInfo|null current value or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function current() {} + + /** + * @return string|null current key or null when iterator is drained + * @psalm-ignore-nullable-return + */ + public function key() {} +} + + +/** + * @template TIterator as RecursiveIterator|IteratorAggregate + * @mixin TIterator + */ +class RecursiveIteratorIterator implements OuterIterator { + /** + * @param TIterator $iterator + * @param int $mode + * @param int $flags + * + * @return void + */ + public function __construct($iterator, $mode = 0, $flags = 0) {} +} + +/** + * @template TKey + * @template TValue + * + * @template-implements RecursiveIterator + * @template-extends RegexIterator + */ +class RecursiveRegexIterator extends RegexIterator implements RecursiveIterator { + + const MATCH = 0 ; + const GET_MATCH = 1 ; + const ALL_MATCHES = 2 ; + const SPLIT = 3 ; + const REPLACE = 4 ; + const USE_KEY = 1 ; + + /** + * @param RecursiveIterator $iterator + * @param string $regex + * @param self::MATH|self::GET_MATCH|self::ALL_MATCHES|self::SPLIT|self::REPLACE $mode + * @param self::USE_KEY|0 $flags + * @param int $preg_flags + */ + public function __construct(RecursiveIterator $iterator, string $regex, int $mode = self::MATCH, int $flags = 0, int $preg_flags = 0) {} + + /** + * @return RecursiveRegexIterator + */ + public function getChildren() {} +} + +/** + * @template TKey + * @template TValue + * + * @template-extends RecursiveIteratorIterator + * @template-implements OuterIterator + */ +class RecursiveTreeIterator extends RecursiveIteratorIterator implements OuterIterator { + + const LEAVES_ONLY = 0 ; + const SELF_FIRST = 1 ; + const CHILD_FIRST = 2 ; + const CATCH_GET_CHILD = 16 ; + + const BYPASS_CURRENT = 4 ; + const BYPASS_KEY = 8 ; + const PREFIX_LEFT = 0 ; + const PREFIX_MID_HAS_NEXT = 1 ; + const PREFIX_MID_LAST = 2 ; + const PREFIX_END_HAS_NEXT = 3 ; + const PREFIX_END_LAST = 4 ; + const PREFIX_RIGHT = 5 ; + + /** + * @return void + */ + public function beginChildren() {} + + /** + * @return RecursiveIterator + */ + public function beginIteration() {} + /** + * @return RecursiveIterator + */ + public function callGetChildren() {} + /** + * @return bool + */ + public function callHasChildren() {} + + /** + * @param RecursiveIterator|IteratorAggregate $it + * @param int-mask $flags + * @param int-mask $cit_flags + * @param self::LEAVES_ONLY|self::SELF_FIRST|self::CHILD_FIRST $mode + */ + public function __construct($it, int $flags = self::BYPASS_KEY, int $cit_flags = self::CATCH_GET_CHILD, int $mode = self::SELF_FIRST) {} + + /** + * @return string + */ + public function current() {} + /** + * @return void + */ + public function endChildren() {} + /** + * @return void + */ + public function endIteration() {} + + /** + * @return string + */ + public function getEntry() {} + /** + * @return string + */ + public function getPostfix() {} + /** + * @return string + */ + public function getPrefix() {} + /** + * @return string + */ + public function key() {} + /** + * @return void + */ + public function next() {} + /** + * @return void + */ + public function nextElement() {} + /** + * @return void + */ + public function rewind() {} + /** + * @return void + */ + public function setPostfix(string $postfix ) {} + /** + * @param self::PREFIX_* $part + * @param string $value + * @return void + */ + public function setPrefixPart(int $part , string $value ) {} + /** + * @return bool + */ + public function valid() {} +} + +/** + * @template TKey + * @template TValue + * + * @template-extends FilterIterator + */ +class RegexIterator extends FilterIterator { + const MATCH = 0 ; + const GET_MATCH = 1 ; + const ALL_MATCHES = 2 ; + const SPLIT = 3 ; + const REPLACE = 4 ; + const USE_KEY = 1 ; + + /** + * @param Iterator $iterator + * @param string $regex + * @param self::MATCH|self::GET_MATCH|self::ALL_MATCHES|self::SPLIT|self::REPLACE $mode + * @param int-mask $flags + * @param int $preg_flags + */ + public function __construct(Iterator $iterator, string $regex, int $mode = self::MATCH, int $flags = 0, int $preg_flags = 0) {} + /** + * @return TValue Can return any type. + */ + public function current() {} + + /** + * @return TKey scalar on success, or null on failure. + */ + public function key() {} +} diff --git a/vendor/vimeo/psalm/stubs/CoreImmutableClasses.phpstub b/vendor/vimeo/psalm/stubs/CoreImmutableClasses.phpstub new file mode 100644 index 00000000..405f89b4 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/CoreImmutableClasses.phpstub @@ -0,0 +1,242 @@ + + */ +class DatePeriod implements Traversable +{ + const EXCLUDE_START_DATE = 1; + /** + * @param Start $start + * @param (Start is string ? 0|self::EXCLUDE_START_DATE : DateInterval) $interval + * @param (Start is string ? never : DateTimeInterface|positive-int) $end + * @param (Start is string ? never : 0|self::EXCLUDE_START_DATE) $options + */ + public function __construct($start, $interval = 0, $end = 1, $options = 0) {} +} + +/** + * @psalm-taint-specialize + */ +interface Throwable +{ + /** + * @psalm-mutation-free + */ + public function getMessage() : string; + + /** + * @psalm-mutation-free + * + * @return int|string https://www.php.net/manual/en/throwable.getcode.php + */ + public function getCode(); + + /** + * @psalm-mutation-free + */ + public function getFile() : string; + + /** + * @psalm-mutation-free + */ + public function getLine() : int; + + /** + * @psalm-mutation-free + * @return list',args?:array}> + */ + public function getTrace() : array; + + /** + * @psalm-mutation-free + */ + public function getPrevious() : ?Throwable; + + /** + * @psalm-mutation-free + * @psalm-taint-source input + */ + public function getTraceAsString() : string; + + /** + * @return string + * @psalm-taint-source input + */ + public function __toString(); +} + +/** + * @psalm-taint-specialize + */ +class Exception implements Throwable +{ + /** + * @var string + */ + protected $message = ''; + + /** + * @var int + */ + protected $code = 0; + + /** + * @var string + */ + protected $file = ''; + + /** + * @var int + */ + protected $line = 0; + + /** + * @psalm-external-mutation-free + * @param string $message + * @param int $code + * @param Throwable $previous + */ + public function __construct($message = "", $code = 0, Throwable $previous = null) {} + + /** + * @psalm-mutation-free + */ + public final function getMessage() : string {} + + /** + * @psalm-mutation-free + * + * @return int|string https://www.php.net/manual/en/throwable.getcode.php + */ + public final function getCode() {} + + /** + * @psalm-mutation-free + */ + public final function getFile(): string {} + + /** + * @psalm-mutation-free + */ + public final function getLine(): int {} + + /** + * @psalm-mutation-free + * @return list',args?:array}> + */ + public final function getTrace() : array {} + + /** + * @psalm-mutation-free + */ + public final function getPrevious() : ?Throwable {} + + /** + * @psalm-mutation-free + * @psalm-taint-source input + */ + public final function getTraceAsString() : string {} + + /** + * @return string + * @psalm-taint-source input + */ + public function __toString() {} +} + +/** + * @psalm-taint-specialize + */ +class Error implements Throwable +{ + /** + * @var string + */ + protected $message = ''; + + /** + * @var int + */ + protected $code = 0; + + /** + * @var string + */ + protected $file = ''; + + /** + * @var int + */ + protected $line = 0; + + /** + * @psalm-external-mutation-free + * @param string $message + * @param int $code + * @param Throwable $previous + */ + public function __construct($message = "", $code = 0, Throwable $previous = null) {} + + /** + * @psalm-mutation-free + */ + public final function getMessage() : string {} + + /** + * @psalm-mutation-free + */ + public final function getCode(): int {} + + /** + * @psalm-mutation-free + */ + public final function getFile(): string {} + + /** + * @psalm-mutation-free + */ + public final function getLine(): int{} + + /** + * @psalm-mutation-free + * @return list',args?:array}> + */ + public final function getTrace() : array {} + + /** + * @psalm-mutation-free + */ + public final function getPrevious() : ?Throwable {} + + /** + * @psalm-mutation-free + * @psalm-taint-source input + */ + public final function getTraceAsString() : string {} + + /** + * @return string + * @psalm-taint-source input + */ + public function __toString() {} +} diff --git a/vendor/vimeo/psalm/stubs/DOM.phpstub b/vendor/vimeo/psalm/stubs/DOM.phpstub new file mode 100644 index 00000000..5c7630e7 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/DOM.phpstub @@ -0,0 +1,176 @@ + + */ + public function getElementsByTagName($name) {} + + /** + * @return DOMNodeList + */ + public function getElementsByTagNameNS($namespaceURI, $localName) {} +} + +/** + * The DOMElement class + * @link http://php.net/manual/en/class.domelement.php + */ +class DOMElement extends DOMNode { + public function __construct(string $name, string $value = '', string $namespaceURI = '') {} + + /** + * @return DOMNodeList + */ + public function getElementsByTagName($name) {} + /** + * @return DOMNodeList + */ + public function getElementsByTagNameNS($namespaceURI, $localName) {} +} + +/** + * @template-covariant TNode as DOMNode + * @template-implements Traversable + */ +class DOMNodeList implements Traversable, Countable { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length - 1 inclusive. + * + * @var int + * + * @since 5.0 + * @link http://php.net/manual/en/class.domnodelist.php#domnodelist.props.length + */ + public $length; + + /** + * @param int $index + * @return TNode|null + * @psalm-ignore-nullable-return + */ + public function item($index) {} +} + +/** + * @template-covariant TNode as DOMNode + * @template-implements Traversable + */ +class DOMNamedNodeMap implements Traversable, Countable { + /** + * @var int + */ + public $length; + + /** + * @return TNode|null + */ + public function getNamedItem(string $name): ?DOMNode {} + + /** + * @return TNode|null + */ + public function getNamedItemNS(string $namespaceURI, string $localName): ?DOMNode {} + + /** + * @return TNode|null + * @psalm-ignore-nullable-return + */ + public function item(int $index): ?DOMNode {} +} + +class SimpleXMLElement implements \Countable, \RecursiveIterator, \ArrayAccess +{ + /** @return array */ + public function getNamespaces(bool $recursive = false) + { + } + /** @return array|false */ + public function getDocNamespaces(bool $recursive = false, bool $fromRoot = true) + { + } + /** @return SimpleXMLIterator */ + public function children(?string $namespaceOrPrefix = null, bool $isPrefix = false) + { + } + /** @return SimpleXMLIterator */ + public function attributes(?string $namespaceOrPrefix = null, bool $isPrefix = false) + { + } + public function __construct(string $data, int $options = 0, bool $dataIsURL = false, string $namespaceOrPrefix = "", bool $isPrefix = false) + { + } + /** @return SimpleXMLElement */ + public function addChild(string $qualifiedName, ?string $value = null, ?string $namespace = null) + { + } + /** @return SimpleXMLElement */ + public function addAttribute(string $qualifiedName, ?string $value = null, ?string $namespace = null) + { + } + /** @return string */ + public function getName() + { + } + public function __toString() : string + { + } + /** @return int */ + public function count() + { + } + /** @return void */ + public function rewind() + { + } + /** @return bool */ + public function valid() + { + } + + /** @return SimpleXMLElement */ + public function current() + { + } + /** @return string|false */ + public function key() + { + } + /** @return void */ + public function next() + { + } + /** @return bool */ + public function hasChildren() + { + } + /** @return SimpleXMLElement|null */ + public function getChildren() + { + } + + public function offsetExists($offset) + { + } + + public function offsetGet($offset) + { + } + + public function offsetSet($offset, $value) + { + } + + public function offsetUnset($offset) + { + } +} + +class SimpleXMLIterator extends SimpleXMLElement +{ + +} diff --git a/vendor/vimeo/psalm/stubs/Php80.phpstub b/vendor/vimeo/psalm/stubs/Php80.phpstub new file mode 100644 index 00000000..001ebf17 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/Php80.phpstub @@ -0,0 +1,105 @@ + $flags + */ + public function __construct(int $flags = self::TARGET_ALL) + { + } +} + +class ReflectionUnionType extends ReflectionType { + /** + * @return non-empty-list + */ + public function getTypes() {} +} + +class UnhandledMatchError extends Error {} + +/** + * @psalm-immutable + * + * @template-covariant Start of string|DateTimeInterface + * @implements IteratorAggregate + */ +class DatePeriod implements IteratorAggregate +{ + const EXCLUDE_START_DATE = 1; + /** + * @param Start $start + * @param (Start is string ? 0|self::EXCLUDE_START_DATE : DateInterval) $interval + * @param (Start is string ? never : DateTimeInterface|positive-int) $end + * @param (Start is string ? never : 0|self::EXCLUDE_START_DATE) $options + */ + public function __construct($start, $interval = 0, $end = 1, $options = 0) {} + + /** @psalm-return (Start is string ? (Traversable&Iterator) : (Traversable&Iterator)) */ + public function getIterator(): Iterator {} +} diff --git a/vendor/vimeo/psalm/stubs/Php81.phpstub b/vendor/vimeo/psalm/stubs/Php81.phpstub new file mode 100644 index 00000000..694e4e9c --- /dev/null +++ b/vendor/vimeo/psalm/stubs/Php81.phpstub @@ -0,0 +1,91 @@ + + */ + public static function cases(): array; + } + + interface BackedEnum extends UnitEnum + { + public readonly int|string $value; + + /** + * @psalm-pure + */ + public static function from(string|int $value): static; + + /** + * @psalm-pure + */ + public static function tryFrom(string|int $value): ?static; + } + + class ReflectionEnum extends ReflectionClass implements Reflector + { + public function getBackingType(): ?ReflectionType; + public function getCase(string $name): ReflectionEnumUnitCase; + /** @return list */ + public function getCases(): array; + public function hasCase(string $name): bool; + public function isBacked(): bool; + } + + class ReflectionEnumUnitCase extends ReflectionClassConstant implements Reflector + { + /** + * @psalm-pure + */ + public function getEnum(): ReflectionEnum; + + /** + * @psalm-pure + */ + public function getValue(): UnitEnum; + } + + class ReflectionEnumBackedCase extends ReflectionEnumUnitCase implements Reflector + { + /** + * @psalm-pure + */ + public function getBackingValue(): int|string; + } + + class ReflectionIntersectionType extends ReflectionType { + /** + * @return non-empty-list + */ + public function getTypes() {} + } +} + +namespace FTP { + final class Connection {} +} + +namespace IMAP { + final class Connection {} +} + +namespace LDAP { + final class Connection {} + final class Result {} + final class ResultEntry {} +} + +namespace PgSql { + final class Connection {} + final class Result {} + final class Lob {} +} + +namespace PSpell { + final class Config {} + final class Dictionary {} +} diff --git a/vendor/vimeo/psalm/stubs/Reflection.phpstub b/vendor/vimeo/psalm/stubs/Reflection.phpstub new file mode 100644 index 00000000..cfbe3ba2 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/Reflection.phpstub @@ -0,0 +1,148 @@ + $name + */ +class ReflectionClass implements Reflector { + + /** + * @var class-string + */ + public $name; + + /** + * @param T|class-string|interface-string|trait-string $argument + */ + public function __construct($argument) {} + + /** + * @return class-string + */ + public function getName(): string {} + + /** + * @param mixed ...$args + * + * @return T + */ + public function newInstance(...$args): object {} + + /** + * @param array $args + * + * @return T + */ + public function newInstanceArgs(array $args): object {} + + /** + * @return T + */ + public function newInstanceWithoutConstructor(): object {} + + /** + * @return ?array + * @psalm-ignore-nullable-return + */ + public function getTraitNames(): array {} + + /** + * @since 8.0 + * @template TClass as object + * @param class-string|null $name + * @return ($name is null ? array> : array>) + */ + public function getAttributes(?string $name = null, int $flags = 0): array {} +} + +class ReflectionFunction implements Reflector +{ + /** + * @since 8.0 + * @template TClass as object + * @param class-string|null $name + * @return ($name is null ? array> : array>) + */ + public function getAttributes(?string $name = null, int $flags = 0): array {} +} + +class ReflectionProperty implements Reflector +{ + /** + * @since 8.0 + * @template TClass as object + * @param class-string|null $name + * @return ($name is null ? array> : array>) + */ + public function getAttributes(?string $name = null, int $flags = 0): array {} + + /** + * @since 7.4 + * @psalm-assert-if-true ReflectionType $this->getType() + */ + public function hasType() : bool {} + + /** + * @since 7.4 + * @psalm-mutation-free + */ + public function getType() : ?ReflectionType {} +} + +class ReflectionMethod implements Reflector +{ + /** + * @since 8.0 + * @template TClass as object + * @param class-string|null $name + * @return ($name is null ? array> : array>) + */ + public function getAttributes(?string $name = null, int $flags = 0): array {} + + public function isStatic(): bool {} +} + +class ReflectionClassConstant implements Reflector +{ + /** + * @since 8.0 + * @template TClass as object + * @param class-string|null $name + * @return ($name is null ? array> : array>) + */ + public function getAttributes(?string $name = null, int $flags = 0): array {} +} + +/** + * @psalm-immutable + */ +class ReflectionParameter implements Reflector { + /** + * @psalm-assert-if-true ReflectionType $this->getType() + */ + public function hasType() : bool {} + + public function getType() : ?ReflectionType {} + + /** + * @since 8.0 + * @template TClass as object + * @param class-string|null $name + * @return ($name is null ? array> : array>) + */ + public function getAttributes(?string $name = null, int $flags = 0): array {} +} + +/** + * @psalm-immutable + */ +class ReflectionNamedType extends ReflectionType +{ + public function getName(): string {} + + /** + * @psalm-assert-if-false class-string|'self'|'static' $this->getName() + */ + public function isBuiltin(): bool {} +} diff --git a/vendor/vimeo/psalm/stubs/SPL.phpstub b/vendor/vimeo/psalm/stubs/SPL.phpstub new file mode 100644 index 00000000..90c06d94 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/SPL.phpstub @@ -0,0 +1,972 @@ + + * @template-implements ArrayAccess + */ +class SplDoublyLinkedList implements Iterator, Countable, ArrayAccess, Serializable +{ + public function __construct() {} + + /** + * Add/insert a new value at the specified index + * + * @param TKey $index The index where the new value is to be inserted. + * @param TValue $newval The new value for the index. + * @return void + * + * @link https://php.net/spldoublylinkedlist.add + * @since 5.5.0 + */ + public function add($index, $newval) {} + + /** + * Pops a node from the end of the doubly linked list + * @link https://php.net/manual/en/spldoublylinkedlist.pop.php + * + * @return TValue The value of the popped node. + * + * @since 5.3.0 + */ + public function pop() {} + + /** + * Shifts a node from the beginning of the doubly linked list + * @link https://php.net/manual/en/spldoublylinkedlist.shift.php + * + * @return TValue The value of the shifted node. + * + * @since 5.3.0 + */ + public function shift() {} + + /** + * Pushes an element at the end of the doubly linked list + * @link https://php.net/manual/en/spldoublylinkedlist.push.php + * + * @param TValue $value The value to push. + * @return void + * + * @since 5.3.0 + */ + public function push($value) {} + + /** + * Prepends the doubly linked list with an element + * @link https://php.net/manual/en/spldoublylinkedlist.unshift.php + * + * @param TValue $value The value to unshift. + * @return void + * + * @since 5.3.0 + */ + public function unshift($value) {} + + /** + * Peeks at the node from the end of the doubly linked list + * @link https://php.net/manual/en/spldoublylinkedlist.top.php + * + * @return TValue The value of the last node. + * + * @since 5.3.0 + */ + public function top() {} + + /** + * Peeks at the node from the beginning of the doubly linked list + * @link https://php.net/manual/en/spldoublylinkedlist.bottom.php + * + * @return TValue The value of the first node. + * + * @since 5.3.0 + */ + public function bottom() {} + + /** + * Counts the number of elements in the doubly linked list. + * @link https://php.net/manual/en/spldoublylinkedlist.count.php + * + * @return int the number of elements in the doubly linked list. + * + * @since 5.3.0 + */ + public function count() {} + + /** + * Checks whether the doubly linked list is empty. + * @link https://php.net/manual/en/spldoublylinkedlist.isempty.php + * + * @return bool whether the doubly linked list is empty. + * + * @since 5.3.0 + */ + public function isEmpty() {} + + /** + * Returns whether the requested $index exists + * @link https://php.net/manual/en/spldoublylinkedlist.offsetexists.php + * + * @param TKey $index The index being checked. + * @return bool true if the requested index exists, otherwise false + * + * @since 5.3.0 + */ + public function offsetExists($index) {} + + /** + * Returns the value at the specified $index + * @link https://php.net/manual/en/spldoublylinkedlist.offsetget.php + * + * @param TKey $index The index with the value. + * @return TValue The value at the specified index. + * + * @since 5.3.0 + */ + public function offsetGet($index) {} + + /** + * Sets the value at the specified $index to $newval + * @link https://php.net/manual/en/spldoublylinkedlist.offsetset.php + * + * @param TKey $index The index being set. + * @param TValue $newval The new value for the index. + * @return void + * + * @since 5.3.0 + */ + public function offsetSet($index, $newval) {} + + /** + * Unsets the value at the specified $index + * @link https://php.net/manual/en/spldoublylinkedlist.offsetunset.php + * + * @param TKey $index The index being unset. + * @return void + * + * @since 5.3.0 + */ + public function offsetUnset($index) {} + + /** + * Return current array entry + * @link https://php.net/manual/en/spldoublylinkedlist.current.php + * + * @return TValue The current node value. + * + * @since 5.3.0 + */ + public function current() {} + + /** + * Return current node index + * @link https://php.net/manual/en/spldoublylinkedlist.key.php + * + * @return TKey The current node index. + * + * @since 5.3.0 + */ + public function key() {} +} + +/** + * The SplFixedArray class provides the main functionalities of array. + * The main differences between a SplFixedArray and a normal PHP array is that + * the SplFixedArray is of fixed length and allows only integers within the range as indexes. + * The advantage is that it uses less memory than a standard array. + * + * @link https://php.net/manual/en/class.splfixedarray.php + * + * @template TValue + * @template-implements ArrayAccess + * @template-implements Iterator + */ +class SplFixedArray implements Iterator, ArrayAccess, Countable { + /** + * Constructs a new fixed array + * + * Initializes a fixed array with a number of NULL values equal to size. + * @link https://php.net/manual/en/splfixedarray.construct.php + * + * @param int $size The size of the fixed array. This expects a number between 0 and PHP_INT_MAX. + + * @since 5.3.0 + */ + public function __construct(int $size = 0) {} + + /** + * Import a PHP array in a new SplFixedArray instance + * @link https://php.net/manual/en/splfixedarray.fromarray.php + * + * @template TInValue + * @param array $array The array to import + * @param bool $save_indexes [optional] Try to save the numeric indexes used in the original array. + * + * @return SplFixedArray Instance of SplFixedArray containing the array content + + * @since 5.3.0 + */ + public static function fromArray(array $array, bool $save_indexes = true): SplFixedArray {} + + /** + * Returns a PHP array from the fixed array + * @link https://php.net/manual/en/splfixedarray.toarray.php + * + * @return array + + * @since 5.3.0 + */ + public function toArray(): array {} + + /** + * Returns the size of the array. + * @link https://php.net/manual/en/splfixedarray.getsize.php + * + * @return int The size of the array + + * @see SplFixedArray::count() + * + * @since 5.3.0 + */ + public function getSize(): int {} + + /** + * Returns the size of the array. + * @link https://php.net/manual/en/splfixedarray.count.php + * + * @return int The size of the array + * + * @since 5.3.0 + */ + public function count(): int {} + + /** + * Rewind the iterator back to the start + * @link https://php.net/manual/en/splfixedarray.rewind.php + * + * @return void + * + * @since 5.3.0 + */ + public function rewind(): void {} + + /** + * Check whether the array contains more elements + * @link https://php.net/manual/en/splfixedarray.valid.php + * + * @return bool true if the array contains any more elements, false otherwise. + * + * @since 5.3.0 + */ + public function valid(): bool {} + + /** + * Returns current array index + * @link https://php.net/manual/en/splfixedarray.key.php + * + * @return int The current array index + * + * @since 5.3.0 + */ + public function key(): int {} + + /** + * Returns the current array entry + * @link https://php.net/manual/en/splfixedarray.current.php + * + * @return TValue The current element value + * + * @since 5.3.0 + */ + public function current() {} + + /** + * Move to the next entry + * @link https://php.net/manual/en/splfixedarray.next.php + * + * @return void + * + * @since 5.3.0 + */ + public function next(): void {} + + /** + * Returns whether the specified index exists + * @link https://php.net/manual/en/splfixedarray.offsetexists.php + * + * @param int $index The index being checked. + * @return bool true if the requested index exists, and false otherwise. + * + * @since 5.3.0 + */ + public function offsetExists(int $index): bool {} + + /** + * Sets a new value at a specified index + * @link https://php.net/manual/en/splfixedarray.offsetset.php + * + * @param int $index The index being sent. + * @param TValue $newval The new value for the index + * @return void + * + * @since 5.3.0 + */ + public function offsetSet(int $index, $newval): void {} + + /** + * Unsets the value at the specified $index + * @link https://php.net/manual/en/splfixedarray.offsetunset.php + * + * @param int $index The index being unset + * @return void + * + * @since 5.3.0 + */ + public function offsetUnset(int $index): void {} + + /** + * Returns the value at the specified index + * @link https://php.net/manual/en/splfixedarray.offsetget.php + * + * @param int $index The index with the value + * @return TValue The value at the specified index + * + * @since 5.3.0 + */ + public function offsetGet(int $index) {} +} + + +/** + * The SplStack class provides the main functionalities of a stack implemented using a doubly linked list. + * @link https://php.net/manual/en/class.splstack.php + * + * @template TValue + * @template-extends SplDoublyLinkedList + */ +class SplStack extends SplDoublyLinkedList { +} + +/** + * The SplQueue class provides the main functionalities of a queue implemented using a doubly linked list. + * @link https://php.net/manual/en/class.splqueue.php + * + * @template TValue + * @template-extends SplDoublyLinkedList + */ +class SplQueue extends SplDoublyLinkedList { + /** + * Adds an element to the queue. + * @link https://php.net/manual/en/splqueue.enqueue.php + * + * @param TValue $value The value to enqueue. + * @return void + * + * @since 5.3.0 + */ + public function enqueue($value) {} + + /** + * Dequeues a node from the queue + * @link https://php.net/manual/en/splqueue.dequeue.php + * + * @return TValue The value of the dequeued node. + * + * @since 5.3.0 + */ + public function dequeue() {} +} + +/** + * The SplHeap class provides the main functionalities of a Heap. + * @link https://php.net/manual/en/class.splheap.php + * + * @template TValue + * @template-implements Iterator + */ +abstract class SplHeap implements Iterator, Countable { + public function __construct() {} + + /** + * Compare elements in order to place them correctly in the heap while sifting up + * @link https://php.net/manual/en/splheap.compare.php + * + * @param TValue $value1 The value of the first node being compared. + * @param TValue $value2 The value of the second node being compared. + * @return int Positive integer if value1 is greater than value2, 0 if they are equal, negative integer otherwise. + * + * @since 5.3.0 + */ + protected abstract function compare($value1, $value2): int; + + /** + * Counts the number of elements in the heap + * @link https://php.net/manual/en/splheap.count.php + * + * @return int The number of elements in the heap. + * + * @since 5.3.0 + */ + public function count(): int {} + + /** + * Get the current datastructure node. + * @link https://php.net/manual/en/splheap.current.php + * + * @return TValue The current node value + * + * @since 5.3.0 + */ + public function current() {} + + /** + * Extracts a node from top of the heap and sift up + * @link https://php.net/manual/en/splheap.extract.php + * + * @return TValue The current node value + * + * @since 5.3.0 + */ + public function extract() {} + + /** + * Inserts an element in the heap by sifting it up + * @link https://php.net/manual/en/splheap.insert.php + * + * @param TValue $value The value to insert. + * @return void + * + * @since 5.3.0 + */ + public function insert($value): void {} + + /** + * Tells if the heap is in a corrupted state + * @link https://php.net/manual/en/splheap.isCorrupted.php + * + * @return bool true if the heap is corrupted, false otherwise. + * + * @since 7.0.0 + */ + public function isCorrupted(): bool {} + + /** + * Checks whether the heap is empty + * @link https://php.net/manual/en/splheap.isEmpty.php + * + * @return bool Whether the heap is empty + * + * @since 5.3.0 + */ + public function isEmpty(): bool {} + + /** + * Return current node index + * @link https://php.net/manual/en/splheap.key.php + * + * @return int The current node index + * + * @since 5.3.0 + */ + public function key() {} + + /** + * Move to the next node. This will delete the top node of the heap. + * @link https://php.net/manual/en/splheap.next.php + * + * @return void + * + * @since 5.3.0 + */ + public function next(): void {} + + /** + * Recover from the corrupted state and allow further actions on the heap + * @link https://php.net/manual/en/splheap.recoverFromCorruption.php + * + * @return void + * + * @since 5.3.0 + */ + public function recoverFromCorruption(): void {} + + /** + * Rewind iterator back to the start (no-op) + * @link https://php.net/manual/en/splheap.rewind.php + * + * @return void + * + * @since 5.3.0 + */ + public function rewind(): void {} + + /** + * Peeks at the node from the top of the heap + * @link https://php.net/manual/en/splheap.top.php + * + * @return TValue The value of the node on the top. + * + * @since 5.3.0 + */ + public function top() {} + + /** + * Check whether the heap contains any more nodes + * @link https://php.net/manual/en/splheap.valid.php + * + * @return bool Returns true if the heap contains any more nodes, false otherwise. + * + * @since 5.3.0 + */ + public function valid(): bool {} +} + + +/** + * The SplMaxHeap class provides the main functionalities of a heap, keeping the maximum on the top. + * @link https://php.net/manual/en/class.splmaxheap.php + * + * @template TValue + * @template-extends SplHeap + */ +class SplMaxHeap extends SplHeap { +} + +/** + * The SplMinHeap class provides the main functionalities of a heap, keeping the maximum on the top. + * @link https://php.net/manual/en/class.splminheap.php + * + * @template TValue + * @template-extends SplHeap + */ +class SplMinHeap extends SplHeap { +} + +/** + * The SplPriorityQueue class provides the main functionalities of a prioritized queue, implemented using a max heap. + * @link https://php.net/manual/en/class.splpriorityqueue.php + * + * @template TPriority + * @template TValue + * @template-implements Iterator + */ +class SplPriorityQueue implements Iterator, Countable { + /** + * Extract the data + */ + const EXTR_DATA = 0x00000001; + /** + * Extract the priority + */ + const EXTR_PRIORITY = 0x00000002; + /** + * Extract an array containing both + */ + const EXTR_BOTH = 0x00000003; + + public function __construct() {} + + /** + * Compare priorities in order to place them correctly in the queue while sifting up + * @link https://php.net/manual/en/splpriorityqueue.compare.php + * + * @param TValue $priority1 The priority of the first node being compared. + * @param TValue $priority2 The priority of the second node being compared. + * @return int Positive integer if priority1 is greater than priority2, 0 if they are equal, negative integer otherwise. + * + * @since 5.3.0 + */ + public function compare($priority1, $priority2): int {} + + /** + * Counts the number of elements in the queue + * @link https://php.net/manual/en/splpriorityqueue.count.php + * + * @return int The number of elements in the queue. + * + * @since 5.3.0 + */ + public function count(): int {} + + /** + * Get the current datastructure node. + * @link https://php.net/manual/en/splpriorityqueue.current.php + * + * @return TValue The current node value + * + * @since 5.3.0 + */ + public function current() {} + + /** + * Extracts a node from top of the queue and sift up + * @link https://php.net/manual/en/splpriorityqueue.extract.php + * + * @return TValue The current node value + * + * @since 5.3.0 + */ + public function extract() {} + + /** + * Get the flags of extraction + * @link https://php.net/manual/en/splpriorityqueue.getextractflags.php + * + * @return SplPriorityQueue::EXTR_* Returns the current extraction mode + * + * @see SplPriorityQueue::setExtractFlags + * + * @since 5.3.0 + */ + public function getExtractFlags(): int {} + + /** + * Inserts an element in the queue by sifting it up + * @link https://php.net/manual/en/splpriorityqueue.insert.php + * + * @param TValue $value The value to insert. + * @param TPriority $priority The associated priority. + * @return true + * + * @since 5.3.0 + */ + public function insert($value, $priority): bool {} + + /** + * Tells if the queue is in a corrupted state + * @link https://php.net/manual/en/splpriorityqueue.isCorrupted.php + * + * @return bool true if the queue is corrupted, false otherwise. + * + * @since 7.0.0 + */ + public function isCorrupted(): bool {} + + /** + * Checks whether the queue is empty + * @link https://php.net/manual/en/splpriorityqueue.isEmpty.php + * + * @return bool Whether the queue is empty + * + * @since 5.3.0 + */ + public function isEmpty(): bool {} + + /** + * Return current node index + * @link https://php.net/manual/en/splpriorityqueue.key.php + * + * @return int The current node index + * + * @since 5.3.0 + */ + public function key() {} + + /** + * Move to the next node. + * @link https://php.net/manual/en/splpriorityqueue.next.php + * + * @return void + * + * @since 5.3.0 + */ + public function next(): void {} + + /** + * Recover from the corrupted state and allow further actions on the queue + * @link https://php.net/manual/en/splpriorityqueue.recoverFromCorruption.php + * + * @return void + * + * @since 5.3.0 + */ + public function recoverFromCorruption(): void {} + + /** + * Rewind iterator back to the start (no-op) + * @link https://php.net/manual/en/splpriorityqueue.rewind.php + * + * @return void + * + * @since 5.3.0 + */ + public function rewind(): void {} + + /** + * Sets the mode of extraction + * @link https://php.net/manual/en/splpriorityqueue.setextractflags.php + * + * @param SplPriorityQueue::EXTR_* $flags Defines what is extracted by SplPriorityQueue::current(), SplPriorityQueue::top() and SplPriorityQueue::extract(). + * + * @return void + * + * @since 5.3.0 + */ + public function setExtractFlags(int $flags): void {} + + /** + * Peeks at the node from the top of the queue + * @link https://php.net/manual/en/splpriorityqueue.top.php + * + * @return TValue The value of the node on the top. + * + * @since 5.3.0 + */ + public function top() {} + + /** + * Check whether the queue contains any more nodes + * @link https://php.net/manual/en/splpriorityqueue.valid.php + * + * @return bool Returns true if the queue contains any more nodes, false otherwise. + * + * @since 5.3.0 + */ + public function valid(): bool {} +} + + +/** + * The SplObjectStorage class provides a map from objects to data or, by + * ignoring data, an object set. This dual purpose can be useful in many + * cases involving the need to uniquely identify objects. + * @link https://php.net/manual/en/class.splobjectstorage.php + * + * @template TObject as object + * @template TArrayValue + * @template-implements ArrayAccess + * @template-implements Iterator + */ +class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess { + public function __construct() {} + + /** + * Adds an object in the storage + * @link https://php.net/manual/en/splobjectstorage.attach.php + * + * @param TObject $object The object to add. + * @param TArrayValue|null $data [optional] The data to associate with the object. + * @return void + * + * @since 5.1.0 + */ + public function attach($object, $data = null) {} + + /** + * Removes an object from the storage + * @link https://php.net/manual/en/splobjectstorage.detach.php + * + * @param TObject $object The object to remove. + * @return void + * + * @since 5.1.0 + */ + public function detach($object) {} + + /** + * Checks if the storage contains a specific object + * @link https://php.net/manual/en/splobjectstorage.contains.php + * + * @param TObject $object The object to look for. + * @return bool true if the object is in the storage, false otherwise. + * + * @since 5.1.0 + */ + public function contains($object) {} + + /** + * Adds all objects from another storage + * @link https://php.net/manual/en/splobjectstorage.addall.php + * + * @param SplObjectStorage $storage The storage you want to import. + * @return void + * + * @since 5.3.0 + */ + public function addAll($storage) {} + + /** + * Removes objects contained in another storage from the current storage + * @link https://php.net/manual/en/splobjectstorage.removeall.php + * + * @param SplObjectStorage $storage The storage containing the elements to remove. + * @return void + * + * @since 5.3.0 + */ + public function removeAll($storage) {} + + /** + * Removes all objects except for those contained in another storage from the current storage + * @link https://php.net/manual/en/splobjectstorage.removeallexcept.php + * + * @param SplObjectStorage $storage The storage containing the elements to retain in the current storage. + * @return void + * + * @since 5.3.6 + */ + public function removeAllExcept($storage) {} + + /** + * Returns the data associated with the current iterator entry + * @link https://php.net/manual/en/splobjectstorage.getinfo.php + * + * @return TArrayValue The data associated with the current iterator position. + * + * @since 5.3.0 + */ + public function getInfo() {} + + /** + * Sets the data associated with the current iterator entry + * @link https://php.net/manual/en/splobjectstorage.setinfo.php + * + * @param TArrayValue $data The data to associate with the current iterator entry. + * @return void + * + * @since 5.3.0 + */ + public function setInfo($data) {} + + /** + * Returns the number of objects in the storage + * @link https://php.net/manual/en/splobjectstorage.count.php + * + * @return int The number of objects in the storage. + * + * @since 5.1.0 + */ + public function count() {} + + /** + * Rewind the iterator to the first storage element + * @link https://php.net/manual/en/splobjectstorage.rewind.php + * + * @return void + * + * @since 5.1.0 + */ + public function rewind() {} + + /** + * Returns if the current iterator entry is valid + * @link https://php.net/manual/en/splobjectstorage.valid.php + * + * @return bool true if the iterator entry is valid, false otherwise. + * + * @since 5.1.0 + */ + public function valid() {} + + /** + * Returns the index at which the iterator currently is + * @link https://php.net/manual/en/splobjectstorage.key.php + * + * @return int The index corresponding to the position of the iterator. + * + * @since 5.1.0 + */ + public function key() {} + + /** + * Returns the current storage entry + * @link https://php.net/manual/en/splobjectstorage.current.php + * + * @return TObject The object at the current iterator position. + * + * @since 5.1.0 + */ + public function current() {} + + /** + * Move to the next entry + * @link https://php.net/manual/en/splobjectstorage.next.php + * + * @return void + * + * @since 5.1.0 + */ + public function next() {} + + /** + * Unserializes a storage from its string representation + * @link https://php.net/manual/en/splobjectstorage.unserialize.php + * + * @param string $serialized The serialized representation of a storage. + * @return void + * + * @since 5.2.2 + */ + public function unserialize($serialized) {} + + /** + * Serializes the storage + * @link https://php.net/manual/en/splobjectstorage.serialize.php + * + * @return string A string representing the storage. + * + * @since 5.2.2 + */ + public function serialize() {} + + /** + * Checks whether an object exists in the storage + * @link https://php.net/manual/en/splobjectstorage.offsetexists.php + * + * @param TObject $object The object to look for. + * @return bool true if the object exists in the storage, and false otherwise. + * + * @since 5.3.0 + */ + public function offsetExists($object) {} + + /** + * Associates data to an object in the storage + * @link https://php.net/manual/en/splobjectstorage.offsetset.php + * + * @param TObject $object The object to associate data with. + * @param TArrayValue|null $data [optional] The data to associate with the object. + * @return void + * + * @since 5.3.0 + */ + public function offsetSet($object, $data = null) {} + + /** + * Removes an object from the storage + * @link https://php.net/manual/en/splobjectstorage.offsetunset.php + * + * @param TObject $object The object to remove. + * @return void + * + * @since 5.3.0 + */ + public function offsetUnset($object) {} + + /** + * Returns the data associated with an object + * @link https://php.net/manual/en/splobjectstorage.offsetget.php + * + * @param TObject $object The object to look for. + * @return TArrayValue The data previously associated with the object in the storage. + * + * @since 5.3.0 + */ + public function offsetGet($object) {} + + /** + * Calculate a unique identifier for the contained objects + * @link https://php.net/manual/en/splobjectstorage.gethash.php + * + * @param object $object object whose identifier is to be calculated. + * @return string A string with the calculated identifier. + * + * @since 5.4.0 + */ + public function getHash($object) {} + +} diff --git a/vendor/vimeo/psalm/stubs/Xdebug.phpstub b/vendor/vimeo/psalm/stubs/Xdebug.phpstub new file mode 100644 index 00000000..8c479cee --- /dev/null +++ b/vendor/vimeo/psalm/stubs/Xdebug.phpstub @@ -0,0 +1,43 @@ +> +*/ +function xdebug_get_code_coverage() : array +{ +} + +/** +* @param array $configuration +*/ +function xdebug_set_filter(int $group, int $list_type, array $configuration) : array +{ +} + +function xdebug_start_code_coverage(int $options) : void +{ +} + +function xdebug_stop_code_coverage(int $cleanup = 1) : void +{ +} diff --git a/vendor/vimeo/psalm/stubs/decimal.phpstub b/vendor/vimeo/psalm/stubs/decimal.phpstub new file mode 100644 index 00000000..90b329da --- /dev/null +++ b/vendor/vimeo/psalm/stubs/decimal.phpstub @@ -0,0 +1,492 @@ +` operator. + * + * @param mixed $other + * + * @return int 0 if this decimal is considered is equal to $other, + * -1 if this decimal should be placed before $other, + * 1 if this decimal should be placed after $other. + */ + public function compareTo($other): int {} + + /** + * String representation. + * + * This method is equivalent to a cast to string, as well as `toString`. + * + * @return string the value of this decimal represented exactly, in either + * fixed or scientific form, depending on the value. + */ + public function __toString(): string {} + + /** + * JSON + * + * This method is only here to honour the interface, and is equivalent to + * `toString`. JSON does not have a decimal type so all decimals are encoded + * as strings in the same format as `toString`. + * + * @return string + */ + public function jsonSerialize() {} +} diff --git a/vendor/vimeo/psalm/stubs/ext-apcu.phpstub b/vendor/vimeo/psalm/stubs/ext-apcu.phpstub new file mode 100644 index 00000000..76450846 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/ext-apcu.phpstub @@ -0,0 +1,92 @@ +|null|string $search + * @param int $format + * @param int $chunk_size + * @param int $list + * + * @return void + */ + public function __construct($search, $format = APC_ITER_ALL, $chunk_size = 100, $list = APC_LIST_ACTIVE) + { + } + + /** + * @return void + */ + public function rewind() + { + } + + /** + * @return void + */ + public function next() + { + } + + /** + * @return bool + */ + public function valid() + { + } + + /** + * @return string + */ + public function key() + { + } + + /** + * @return mixed + */ + public function current() + { + } + + /** + * @return int + */ + public function getTotalHits() + { + } + + /** + * @return int + */ + public function getTotalSize() + { + } + + /** + * @return int + */ + public function getTotalCount() + { + } +} diff --git a/vendor/vimeo/psalm/stubs/ext-ds.phpstub b/vendor/vimeo/psalm/stubs/ext-ds.phpstub new file mode 100644 index 00000000..04eef4dc --- /dev/null +++ b/vendor/vimeo/psalm/stubs/ext-ds.phpstub @@ -0,0 +1,1434 @@ + + */ +interface Collection extends Traversable, Countable, JsonSerializable +{ + /** + * @return Collection + * @psalm-mutation-free + */ + public function copy(): Collection; + + /** + * @return array + * @psalm-mutation-free + */ + public function toArray(): array; + + /** + * @psalm-mutation-free + */ + public function isEmpty(): bool; + + /** + * @psalm-mutation-free + */ + public function count(): int; +} + +/** + * @template TValue + * @implements Sequence + */ +final class Deque implements Sequence +{ + /** + * @param iterable $values + */ + public function __construct(iterable $values = []) + { + } + + /** + * @return Deque + * @psalm-mutation-free + */ + public function copy(): Deque + { + } + + /** + * @return list + * @psalm-mutation-free + */ + public function toArray(): array + { + } + + /** + * @psalm-mutation-free + */ + public function isEmpty(): bool + { + } + + /** + * @psalm-mutation-free + */ + public function count(): int + { + } + + /** + * @psalm-mutation-free + */ + public function allocate(int $capacity): void + { + } + + /** + * @psalm-mutation-free + */ + public function capacity(): int + { + } + + /** + * @return float|int + * @psalm-mutation-free + */ + public function sum() + { + } + + /** + * @param TValue ...$values + * @psalm-mutation-free + */ + public function contains(...$values): bool + { + } + + /** + * @param (callable(TValue): bool)|null $callback + * @return Deque + * @psalm-mutation-free + */ + public function filter(callable $callback = null): Deque + { + } + + /** + * @param TValue $value + * @return int|false + * @psalm-mutation-free + */ + public function find($value) + { + } + + /** + * @return TValue + * @throws \UnderflowException + * @psalm-mutation-free + */ + public function first() + { + } + + /** + * @return TValue + * @throws \OutOfRangeException + * @psalm-mutation-free + */ + public function get(int $index) + { + } + + /** + * @psalm-mutation-free + */ + public function join(?string $glue = null): string + { + } + + /** + * @return TValue + * @throws \UnderflowException + * @psalm-mutation-free + */ + public function last() + { + } + + /** + * @template TNewValue + * @param callable(TValue): TNewValue $callback + * @return Deque + * @psalm-mutation-free + */ + public function map(callable $callback): Deque + { + } + + /** + * @template TValue2 + * @param iterable $values + * @return Deque + * @psalm-mutation-free + */ + public function merge(iterable $values): Deque + { + } + + /** + * @return TValue + * @throws \UnderflowException + */ + public function pop() + { + } + + /** + * @template TCarry + * @param callable(TCarry, TValue): TCarry $callback + * @param TCarry $initial + * @return TCarry + * @psalm-mutation-free + */ + public function reduce(callable $callback, $initial = null) + { + } + + /** + * @return TValue + * @throws \OutOfRangeException + */ + public function remove(int $index) + { + } + + /** + * @return Deque + * @psalm-mutation-free + */ + public function reversed(): Deque + { + } + + /** + * @return TValue + * @throws \UnderflowException + */ + public function shift() + { + } + + /** + * @return Deque + * @psalm-mutation-free + */ + public function slice(int $offset, ?int $length = null): Deque + { + } + + /** + * @param (callable(TValue, TValue): int)|null $comparator + * @return Deque + * @psalm-mutation-free + */ + public function sorted(callable $comparator = null): Deque + { + } +} + +/** + * @template TKey + * @template TValue + * @implements Collection + * @implements ArrayAccess + */ +final class Map implements Collection, ArrayAccess +{ + /** + * @param iterable $values + */ + public function __construct(iterable $values = []) + { + } + + /** + * @psalm-mutation-free + */ + public function allocate(int $capacity): void + { + } + + /** + * @psalm-mutation-free + */ + public function capacity(): int + { + } + + /** + * @return Map + * @psalm-mutation-free + */ + public function copy(): Map + { + } + + /** + * @return array + * @psalm-mutation-free + */ + public function toArray(): array + { + } + + /** + * @psalm-mutation-free + */ + public function isEmpty(): bool + { + } + + /** + * @psalm-mutation-free + */ + public function count(): int + { + } + + /** + * @param callable(TKey, TValue): TValue $callback + */ + public function apply(callable $callback): void + { + } + + /** + * @return Pair + * @throws UnderflowException + * @psalm-mutation-free + */ + public function first(): Pair + { + } + + /** + * @return Pair + * @throws UnderflowException + * @psalm-mutation-free + */ + public function last(): Pair + { + } + + /** + * @return Pair + * @throws OutOfRangeException + * @psalm-mutation-free + */ + public function skip(int $position): Pair + { + } + + /** + * @template TKey2 + * @template TValue2 + * @param iterable $values + * @return Map + * @psalm-mutation-free + */ + public function merge(iterable $values): Map + { + } + + /** + * @template TKey2 + * @template TValue2 + * @param Map $map + * @return Map + * @psalm-mutation-free + */ + public function intersect(Map $map): Map + { + } + + /** + * @template TValue2 + * @param Map $map + * @return Map + * @psalm-mutation-free + */ + public function diff(Map $map): Map + { + } + + /** + * @param TKey $key + * @psalm-mutation-free + */ + public function hasKey($key): bool + { + } + + /** + * @param TValue $value + * @psalm-mutation-free + */ + public function hasValue($value): bool + { + } + + /** + * @param (callable(TKey, TValue): bool)|null $callback + * @return Map + * @psalm-mutation-free + */ + public function filter(callable $callback = null): Map + { + } + + /** + * @template TDefault + * @param TKey $key + * @param TDefault $default + * @return ( + * func_num_args() is 1 + * ? TValue + * : TValue|TDefault + * ) + * @throws OutOfBoundsException + * @psalm-mutation-free + */ + public function get($key, $default = null) + { + } + + /** + * @return Set + * @psalm-mutation-free + */ + public function keys(): Set + { + } + + /** + * @template TNewValue + * @param callable(TKey, TValue): TNewValue $callback + * @return Map + * @psalm-mutation-free + */ + public function map(callable $callback): Map + { + } + + /** + * @return Sequence> + * @psalm-mutation-free + */ + public function pairs(): Sequence + { + } + + /** + * @param TKey $key + * @param TValue $value + */ + public function put($key, $value) + { + } + + /** + * @param iterable $values + */ + public function putAll(iterable $values) + { + } + + /** + * @template TCarry + * @param callable(TCarry, TKey, TValue): TCarry $callback + * @param TCarry $initial + * @return TCarry + * @psalm-mutation-free + */ + public function reduce(callable $callback, $initial = null) + { + } + + /** + * @template TDefault + * @param TKey $key + * @param TDefault $default + * @return ( + * func_num_args() is 1 + * ? TValue + * : TValue|TDefault + * ) + * @throws \OutOfBoundsException + */ + public function remove($key, $default = null) + { + } + + /** + * @return Map + * @psalm-mutation-free + */ + public function reversed(): Map + { + } + + /** + * @return Map + * @psalm-mutation-free + */ + public function slice(int $offset, ?int $length = null): Map + { + } + + /** + * @param (callable(TValue, TValue): int)|null $comparator + */ + public function sort(callable $comparator = null) + { + } + + /** + * @param (callable(TValue, TValue): int)|null $comparator + * @return Map + * @psalm-mutation-free + */ + public function sorted(callable $comparator = null): Map + { + } + + /** + * @param (callable(TKey, TKey): int)|null $comparator + */ + public function ksort(callable $comparator = null) + { + } + + /** + * @param (callable(TKey, TKey): int)|null $comparator + * @return Map + * @psalm-mutation-free + */ + public function ksorted(callable $comparator = null): Map + { + } + + /** + * @return Sequence + * @psalm-mutation-free + */ + public function values(): Sequence + { + } + + /** + * @template TKey2 + * @template TValue2 + * @param Map $map + * @return Map + * @psalm-mutation-free + */ + public function union(Map $map): Map + { + } + + /** + * @template TKey2 + * @template TValue2 + * @param Map $map + * @return Map + * @psalm-mutation-free + */ + public function xor(Map $map): Map + { + } +} + +/** + * @template-covariant TKey + * @template-covariant TValue + */ +final class Pair implements JsonSerializable +{ + /** + * @var TKey + */ + public $key; + + /** + * @var TValue + */ + public $value; + + /** + * @param TKey $key + * @param TValue $value + */ + public function __construct($key = null, $value = null) + { + } + + /** + * @return Pair + * @psalm-mutation-free + */ + public function copy(): Pair + { + } +} + +/** + * @template TValue + * @extends Collection + * @extends ArrayAccess + */ +interface Sequence extends Collection, ArrayAccess +{ + /** + * @return Sequence + * @psalm-mutation-free + */ + public function copy(): Sequence; + + /** + * @return list + * @psalm-mutation-free + */ + public function toArray(): array; + + /** + * @psalm-mutation-free + */ + public function isEmpty(): bool; + + /** + * @psalm-mutation-free + */ + public function count(): int; + + /** + * @psalm-mutation-free + */ + public function allocate(int $capacity): void; + + /** + * @psalm-mutation-free + */ + public function capacity(): int; + + /** + * @return float|int + * @psalm-mutation-free + */ + public function sum(); + + /** + * @param callable(TValue): TValue $callback + */ + public function apply(callable $callback): void; + + /** + * @param TValue ...$values + * @psalm-mutation-free + */ + public function contains(...$values): bool; + + /** + * @param (callable(TValue): bool)|null $callback + * @return Sequence + * @psalm-mutation-free + */ + public function filter(callable $callback = null): Sequence; + + /** + * @param TValue $value + * @return int|false + * @psalm-mutation-free + */ + public function find($value); + + /** + * @return TValue + * @throws \UnderflowException + * @psalm-mutation-free + */ + public function first(); + + /** + * @return TValue + * @throws \OutOfRangeException + * @psalm-mutation-free + */ + public function get(int $index); + + /** + * @param TValue ...$values + * @throws \OutOfRangeException + */ + public function insert(int $index, ...$values); + + /** + * @psalm-mutation-free + */ + public function join(?string $glue = null): string; + + /** + * @return TValue + * @throws \UnderflowException + * @psalm-mutation-free + */ + public function last(); + + /** + * @template TNewValue + * @param callable(TValue): TNewValue $callback + * @return Sequence + * @psalm-mutation-free + */ + public function map(callable $callback): Sequence; + + /** + * @template TValue2 + * @param iterable $values + * @return Sequence + * @psalm-mutation-free + */ + public function merge(iterable $values): Sequence; + + /** + * @return TValue + * @throws \UnderflowException + */ + public function pop(); + + /** + * @param TValue ...$values + */ + public function push(...$values); + + /** + * @template TCarry + * @param callable(TCarry, TValue): TCarry $callback + * @param TCarry $initial + * @return TCarry + * @psalm-mutation-free + */ + public function reduce(callable $callback, $initial = null); + + /** + * @return TValue + * @throws \OutOfRangeException + */ + public function remove(int $index); + + /** + * @return Sequence + * @psalm-mutation-free + */ + public function reversed(): Sequence; + + /** + * @param TValue $value + * @throws \OutOfRangeException + */ + public function set(int $index, $value); + + /** + * @return TValue + * @throws \UnderflowException + */ + public function shift(); + + /** + * @return Sequence + * @psalm-mutation-free + */ + public function slice(int $index, ?int $length = null): Sequence; + + /** + * @param (callable(TValue, TValue): int)|null $comparator + */ + public function sort(callable $comparator = null); + + /** + * @param (callable(TValue, TValue): int)|null $comparator + * @return Sequence + * @psalm-mutation-free + */ + public function sorted(callable $comparator = null): Sequence; + + /** + * @param TValue ...$values + */ + public function unshift(...$values); +} + + +/** + * @template TValue + * @implements Sequence + */ +final class Vector implements Sequence +{ + /** + * @param iterable $values + */ + public function __construct(iterable $values = []) + { + } + + /** + * @return Vector + * @psalm-mutation-free + */ + public function copy(): Vector + { + } + + /** + * @return list + * @psalm-mutation-free + */ + public function toArray(): array + { + } + + /** + * @psalm-mutation-free + */ + public function isEmpty(): bool + { + } + + /** + * @psalm-mutation-free + */ + public function count(): int + { + } + + /** + * @psalm-mutation-free + */ + public function allocate(int $capacity): void + { + } + + /** + * @psalm-mutation-free + */ + public function capacity(): int + { + } + + /** + * @return float|int + * @psalm-mutation-free + */ + public function sum() + { + } + + /** + * @param TValue ...$values + * @psalm-mutation-free + */ + public function contains(...$values): bool + { + } + + /** + * @param (callable(TValue): bool)|null $callback + * @return Vector + * @psalm-mutation-free + */ + public function filter(callable $callback = null): Vector + { + } + + /** + * @param TValue $value + * @return int|false + * @psalm-mutation-free + */ + public function find($value) + { + } + + /** + * @return TValue + * @throws \UnderflowException + * @psalm-mutation-free + */ + public function first() + { + } + + /** + * @return TValue + * @throws \OutOfRangeException + * @psalm-mutation-free + */ + public function get(int $index) + { + } + + /** + * @psalm-mutation-free + */ + public function join(?string $glue = null): string + { + } + + /** + * @return TValue + * @throws \UnderflowException + * @psalm-mutation-free + */ + public function last() + { + } + + /** + * @template TNewValue + * @param callable(TValue): TNewValue $callback + * @return Vector + * @psalm-mutation-free + */ + public function map(callable $callback): Vector + { + } + + /** + * @template TValue2 + * @param iterable $values + * @return Vector + * @psalm-mutation-free + */ + public function merge(iterable $values): Sequence + { + } + + /** + * @return TValue + * @throws \UnderflowException + */ + public function pop() + { + } + + /** + * @template TCarry + * @param callable(TCarry, TValue): TCarry $callback + * @param TCarry $initial + * @return TCarry + * @psalm-mutation-free + */ + public function reduce(callable $callback, $initial = null) + { + } + + /** + * @return TValue + * @throws \OutOfRangeException + */ + public function remove(int $index) + { + } + + /** + * @return Vector + * @psalm-mutation-free + */ + public function reversed(): Vector + { + } + + /** + * @return TValue + * @throws \UnderflowException + */ + public function shift() + { + } + + /** + * @return Vector + * @psalm-mutation-free + */ + public function slice(int $offset, ?int $length = null): Vector + { + } + + /** + * @param (callable(TValue, TValue): int)|null $comparator + * @return Vector + * @psalm-mutation-free + */ + public function sorted(callable $comparator = null): Vector + { + } +} + +/** + * @template TValue + * @implements Collection + * @implements ArrayAccess + */ +final class Set implements Collection, ArrayAccess +{ + /** + * @param iterable $values + */ + public function __construct(iterable $values = []) + { + } + + /** + * @return Set + * @psalm-mutation-free + */ + public function copy(): Set + { + } + + /** + * @return list + * @psalm-mutation-free + */ + public function toArray(): array + { + } + + /** + * @psalm-mutation-free + */ + public function isEmpty(): bool + { + } + + /** + * @psalm-mutation-free + */ + public function count(): int + { + } + + /** + * @psalm-mutation-free + */ + public function allocate(int $capacity): void + { + } + + /** + * @psalm-mutation-free + */ + public function capacity(): int + { + } + + /** + * @param TValue ...$values + */ + public function add(...$values): void + { + } + + /** + * @param TValue ...$values + * @psalm-mutation-free + */ + public function contains(...$values): bool + { + } + + /** + * @template TValue2 + * @param Set $set + * @return Set + * @psalm-mutation-free + */ + public function diff(Set $set): Set + { + } + + /** + * @param (callable(TValue): bool)|null $callback + * @return Set + * @psalm-mutation-free + */ + public function filter(callable $callback = null): Set + { + } + + /** + * @return TValue + * @throws \UnderflowException + * @psalm-mutation-free + */ + public function first() + { + } + + /** + * @return TValue + * @throws \OutOfRangeException + * @psalm-mutation-free + */ + public function get(int $index) + { + } + + /** + * @template TValue2 + * @param Set $set + * @return Set + * @psalm-mutation-free + */ + public function intersect(Set $set): Set + { + } + + /** + * @return TValue + * @throws \UnderflowException + * @psalm-mutation-free + */ + public function last() + { + } + + /** + * @template TNewValue + * @param callable(TValue): TNewValue $callback + * @return Set + */ + public function map(callable $callback): Set + { + } + + /** + * @template TValue2 + * @param iterable $values + * @return Set + * @psalm-mutation-free + */ + public function merge(iterable $values): Set + { + } + + /** + * @param TValue ...$values + */ + public function remove(...$values): void + { + } + + /** + * @return Set + * @psalm-mutation-free + */ + public function reversed(): Set + { + } + + /** + * @return Set + * @psalm-mutation-free + */ + public function slice(int $index, ?int $length = null): Set + { + } + + /** + * @param (callable(TValue, TValue): int)|null $comparator + */ + public function sort(callable $comparator = null): void + { + } + + /** + * @param (callable(TValue, TValue): int)|null $comparator + * @return Set + * @psalm-mutation-free + */ + public function sorted(callable $comparator = null): Set + { + } + + /** + * @template TValue2 + * @param Set $set + * @return Set + * @psalm-mutation-free + */ + public function union(Set $set): Set + { + } + + /** + * @template TValue2 + * @param Set $set + * @return Set + * @psalm-mutation-free + */ + public function xor(Set $set): Set + { + } +} + +/** + * @template TValue + * @implements Collection + * @implements ArrayAccess + */ +final class Stack implements Collection, ArrayAccess +{ + /** + * @param iterable $values + */ + public function __construct(iterable $values = []) + { + } + + /** + * @return Stack + * @psalm-mutation-free + */ + public function copy(): Stack + { + } + + /** + * @return list + * @psalm-mutation-free + */ + public function toArray(): array + { + } + + /** + * @psalm-mutation-free + */ + public function isEmpty(): bool + { + } + + /** + * @psalm-mutation-free + */ + public function count(): int + { + } + + /** + * @psalm-mutation-free + */ + public function allocate(int $capacity): void + { + } + + /** + * @psalm-mutation-free + */ + public function capacity(): int + { + } + + /** + * @return TValue + * @throws UnderflowException + * @psalm-mutation-free + */ + public function peek() + { + } + + /** + * @return TValue + * @throws UnderflowException + */ + public function pop() + { + } + + /** + * @param TValue ...$values + */ + public function push(...$values): void + { + } +} + +/** + * @template TValue + * @implements Collection + * @implements ArrayAccess + */ +final class Queue implements Collection, ArrayAccess +{ + /** + * @param iterable $values + */ + public function __construct(iterable $values = []) + { + } + + /** + * @return Queue + * @psalm-mutation-free + */ + public function copy(): Queue + { + } + + /** + * @return list + * @psalm-mutation-free + */ + public function toArray(): array + { + } + + /** + * @psalm-mutation-free + */ + public function isEmpty(): bool + { + } + + /** + * @psalm-mutation-free + */ + public function count(): int + { + } + + /** + * @psalm-mutation-free + */ + public function allocate(int $capacity): void + { + } + + /** + * @psalm-mutation-free + */ + public function capacity(): int + { + } + + /** + * @return TValue + * @throws UnderflowException + * @psalm-mutation-free + */ + public function peek() + { + } + + /** + * @return TValue + * @throws UnderflowException + */ + public function pop() + { + } + + /** + * @param TValue ...$values + */ + public function push(...$values): void + { + } +} + +/** + * @template TValue + * @implements Collection + */ +final class PriorityQueue implements Collection +{ + /** + * @return PriorityQueue + * @psalm-mutation-free + */ + public function copy(): PriorityQueue + { + } + + /** + * @return list + * @psalm-mutation-free + */ + public function toArray(): array + { + } + + /** + * @psalm-mutation-free + */ + public function isEmpty(): bool + { + } + + /** + * @psalm-mutation-free + */ + public function count(): int + { + } + + /** + * @psalm-mutation-free + */ + public function allocate(int $capacity): void + { + } + + /** + * @psalm-mutation-free + */ + public function capacity(): int + { + } + + /** + * @return TValue + * @throws UnderflowException + * @psalm-mutation-free + */ + public function peek() + { + } + + /** + * @return TValue + * @throws UnderflowException + */ + public function pop() + { + } + + /** + * @param TValue $value + */ + public function push($value, int $priority): void + { + } +} diff --git a/vendor/vimeo/psalm/stubs/ext-geos.phpstub b/vendor/vimeo/psalm/stubs/ext-geos.phpstub new file mode 100644 index 00000000..387d1c78 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/ext-geos.phpstub @@ -0,0 +1,25 @@ + + */ +interface CursorInterface extends Traversable +{ + /** + * @return array + */ + public function toArray(); +} + +/** + * @template-covariant TValue of array|object + * + * @template-implements Iterator + * @template-implements CursorInterface + */ +final class Cursor implements CursorInterface, Iterator +{ + /** + * @return TValue + */ + public function current() {} + + /** + * @return void + */ + public function next() {} + + /** + * @return int + */ + public function key() {} + + /** + * @return bool + */ + public function valid() {} + + /** + * @return void + */ + public function rewind() {} + + /** + * @return array + */ + public function toArray() {} +} diff --git a/vendor/vimeo/psalm/stubs/mysqli.phpstub b/vendor/vimeo/psalm/stubs/mysqli.phpstub new file mode 100644 index 00000000..a5ec2f54 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/mysqli.phpstub @@ -0,0 +1,33 @@ + + */ +class mysqli_result implements Traversable +{ + /** + * @psalm-taint-sink callable $class + * + * @template T of object + * @param class-string $class + * @param array $constructor_args + * @return T|null|false + */ + function fetch_object(string $class = stdClass::class, array $constructor_args = []): object|false|null {} +} + + +/** + * @psalm-taint-sink callable $class + * + * @template T of object + * @template TValue + * + * @param mysqli_result $result + * @param class-string $class + * @param array $constructor_args + * @return T|null|false + */ +function mysqli_fetch_object(mysqli_result $result, string $class = stdClass::class, array $constructor_args = []): object|false|null {} diff --git a/vendor/vimeo/psalm/stubs/pdo.phpstub b/vendor/vimeo/psalm/stubs/pdo.phpstub new file mode 100644 index 00000000..0abf5053 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/pdo.phpstub @@ -0,0 +1,19 @@ + + */ +class PDOStatement implements Traversable +{ + /** + * @psalm-taint-sink callable $class + * + * @template T of object + * @param class-string $class + * @param array $ctorArgs + * @return false|T + */ + public function fetchObject($class = \stdclass::class, array $ctorArgs = array()) {} +} diff --git a/vendor/vimeo/psalm/stubs/phpparser.phpstub b/vendor/vimeo/psalm/stubs/phpparser.phpstub new file mode 100644 index 00000000..834f8f62 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/phpparser.phpstub @@ -0,0 +1,22 @@ + + */ + abstract public function getRawArgs(): array; + + public function isFirstClassCallable(): bool {} + + /** + * @psalm-pure + * @return list + */ + public function getArgs(): array{} +} diff --git a/vendor/vimeo/psalm/stubs/phpredis.phpstub b/vendor/vimeo/psalm/stubs/phpredis.phpstub new file mode 100644 index 00000000..791a0cfb --- /dev/null +++ b/vendor/vimeo/psalm/stubs/phpredis.phpstub @@ -0,0 +1,548 @@ + + * URI of the WSDL file or NULL if working in + * non-WSDL mode. + *

+ *

+ * During development, WSDL caching may be disabled by the + * use of the soap.wsdl_cache_ttl php.ini setting + * otherwise changes made to the WSDL file will have no effect until + * soap.wsdl_cache_ttl is expired. + *

+ * @param array $options [optional]

+ * An array of options. If working in WSDL mode, this parameter is optional. + * If working in non-WSDL mode, the location and + * uri options must be set, where location + * is the URL of the SOAP server to send the request to, and uri + * is the target namespace of the SOAP service. + *

+ *

+ * The style and use options only work in + * non-WSDL mode. In WSDL mode, they come from the WSDL file. + *

+ *

+ * The soap_version option should be one of either + * SOAP_1_1 or SOAP_1_2 to + * select SOAP 1.1 or 1.2, respectively. If omitted, 1.1 is used. + *

+ *

+ * For HTTP authentication, the login and + * password options can be used to supply credentials. + * For making an HTTP connection through + * a proxy server, the options proxy_host, + * proxy_port, proxy_login + * and proxy_password are also available. + * For HTTPS client certificate authentication use + * local_cert and passphrase options. An + * authentication may be supplied in the authentication + * option. The authentication method may be either + * SOAP_AUTHENTICATION_BASIC (default) or + * SOAP_AUTHENTICATION_DIGEST. + *

+ *

+ * The compression option allows to use compression + * of HTTP SOAP requests and responses. + *

+ *

+ * The encoding option defines internal character + * encoding. This option does not change the encoding of SOAP requests (it is + * always utf-8), but converts strings into it. + *

+ *

+ * The trace option enables tracing of request so faults + * can be backtraced. This defaults to FALSE + *

+ *

+ * The classmap option can be used to map some WSDL + * types to PHP classes. This option must be an array with WSDL types + * as keys and names of PHP classes as values. + *

+ *

+ * Setting the boolean trace option enables use of the + * methods + * SoapClient->__getLastRequest, + * SoapClient->__getLastRequestHeaders, + * SoapClient->__getLastResponse and + * SoapClient->__getLastResponseHeaders. + *

+ *

+ * The exceptions option is a boolean value defining whether + * soap errors throw exceptions of type + * SoapFault. + *

+ *

+ * The connection_timeout option defines a timeout in seconds + * for the connection to the SOAP service. This option does not define a timeout + * for services with slow responses. To limit the time to wait for calls to finish the + * default_socket_timeout setting + * is available. + *

+ *

+ * The typemap option is an array of type mappings. + * Type mapping is an array with keys type_name, + * type_ns (namespace URI), from_xml + * (callback accepting one string parameter) and to_xml + * (callback accepting one object parameter). + *

+ *

+ * The cache_wsdl option is one of + * WSDL_CACHE_NONE, + * WSDL_CACHE_DISK, + * WSDL_CACHE_MEMORY or + * WSDL_CACHE_BOTH. + *

+ *

+ * The user_agent option specifies string to use in + * User-Agent header. + *

+ *

+ * The stream_context option is a resource + * for context. + *

+ *

+ * The features option is a bitmask of + * SOAP_SINGLE_ELEMENT_ARRAYS, + * SOAP_USE_XSI_ARRAY_TYPE, + * SOAP_WAIT_ONE_WAY_CALLS. + *

+ *

+ * The keep_alive option is a boolean value defining whether + * to send the Connection: Keep-Alive header or + * Connection: close. + *

+ *

+ * The ssl_method option is one of + * SOAP_SSL_METHOD_TLS, + * SOAP_SSL_METHOD_SSLv2, + * SOAP_SSL_METHOD_SSLv3 or + * SOAP_SSL_METHOD_SSLv23. + *

+ * @throws SoapFault A SoapFault exception will be thrown if the wsdl URI cannot be loaded. + * @since 5.0.1 + */ + public function __construct ($wsdl, array $options = null) {} + + /** + * Calls a SOAP function (deprecated) + * @link https://php.net/manual/en/soapclient.call.php + * @param string $function_name + * @param array $arguments + * @return mixed + * @since 5.0.1 + */ + public function __call ($function_name, $arguments) {} + + /** + * Calls a SOAP function + * @link https://php.net/manual/en/soapclient.soapcall.php + * @param string $function_name

+ * The name of the SOAP function to call. + *

+ * @param array $arguments

+ * An array of the arguments to pass to the function. This can be either + * an ordered or an associative array. Note that most SOAP servers require + * parameter names to be provided, in which case this must be an + * associative array. + *

+ * @param array $options [optional]

+ * An associative array of options to pass to the client. + *

+ *

+ * The location option is the URL of the remote Web service. + *

+ *

+ * The uri option is the target namespace of the SOAP service. + *

+ *

+ * The soapaction option is the action to call. + *

+ * @param mixed $input_headers [optional]

+ * An array of headers to be sent along with the SOAP request. + *

+ * @param array $output_headers [optional]

+ * If supplied, this array will be filled with the headers from the SOAP response. + *

+ * @return mixed SOAP functions may return one, or multiple values. If only one value is returned + * by the SOAP function, the return value of __soapCall will be + * a simple value (e.g. an integer, a string, etc). If multiple values are + * returned, __soapCall will return + * an associative array of named output parameters. + *

+ *

+ * On error, if the SoapClient object was constructed with the exceptions + * option set to FALSE, a SoapFault object will be returned. + * @since 5.0.1 + */ + public function __soapCall (string $function_name, array $arguments, array $options = null, $input_headers = null, &$output_headers = null) {} + + /** + * Returns last SOAP request + * @link https://php.net/manual/en/soapclient.getlastrequest.php + * @return string|null The last SOAP request, as an XML string. + * @since 5.0.1 + */ + public function __getLastRequest () {} + + /** + * Returns last SOAP response + * @link https://php.net/manual/en/soapclient.getlastresponse.php + * @return string|null The last SOAP response, as an XML string. + * @since 5.0.1 + */ + public function __getLastResponse () {} + + /** + * Returns the SOAP headers from the last request + * @link https://php.net/manual/en/soapclient.getlastrequestheaders.php + * @return string|null The last SOAP request headers. + * @since 5.0.1 + */ + public function __getLastRequestHeaders () {} + + /** + * Returns the SOAP headers from the last response + * @link https://php.net/manual/en/soapclient.getlastresponseheaders.php + * @return string|null The last SOAP response headers. + * @since 5.0.1 + */ + public function __getLastResponseHeaders () {} + + /** + * Returns list of available SOAP functions + * @link https://php.net/manual/en/soapclient.getfunctions.php + * @return array|null The array of SOAP function prototypes, detailing the return type, + * the function name and type-hinted parameters. + * @since 5.0.1 + */ + public function __getFunctions () {} + + /** + * Returns a list of SOAP types + * @link https://php.net/manual/en/soapclient.gettypes.php + * @return array|null The array of SOAP types, detailing all structures and types. + * @since 5.0.1 + */ + public function __getTypes () {} + + /** + * Returns a list of all cookies + * @link https://php.net/manual/en/soapclient.getcookies.php + * @return array The array of all cookies + * @since 5.4.3 + */ + public function __getCookies () {} + + /** + * The __setCookie purpose + * @link https://php.net/manual/en/soapclient.setcookie.php + * @param string $name

+ * The name of the cookie. + *

+ * @param string $value [optional]

+ * The value of the cookie. If not specified, the cookie will be deleted. + *

+ * @return void No value is returned. + * @since 5.0.4 + */ + public function __setCookie ($name, $value = null) {} + + /** + * Sets the location of the Web service to use + * @link https://php.net/manual/en/soapclient.setlocation.php + * @param string $new_location [optional]

+ * The new endpoint URL. + *

+ * @return string The old endpoint URL. + * @since 5.0.1 + */ + public function __setLocation ($new_location = null) {} + + /** + * Sets SOAP headers for subsequent calls + * @link https://php.net/manual/en/soapclient.setsoapheaders.php + * @param mixed $soapheaders [optional]

+ * The headers to be set. It could be SoapHeader + * object or array of SoapHeader objects. + * If not specified or set to NULL, the headers will be deleted. + *

+ * @return bool TRUE on success or FALSE on failure. + * @since 5.0.5 + */ + public function __setSoapHeaders ($soapheaders = null) {} + +} diff --git a/vendor/webmozart/assert/CHANGELOG.md b/vendor/webmozart/assert/CHANGELOG.md new file mode 100644 index 00000000..56c8011d --- /dev/null +++ b/vendor/webmozart/assert/CHANGELOG.md @@ -0,0 +1,207 @@ +Changelog +========= + +## UNRELEASED + +## 1.11.0 + +### Added + +* Added explicit (non magic) `allNullOr*` methods, with `@psalm-assert` annotations, for better Psalm support. + +### Changed + +* Trait methods will now check the assertion themselves, instead of using `__callStatic` +* `isList` will now deal correctly with (modified) lists that contain `NaN` +* `reportInvalidArgument` now has a return type of `never`. + +### Removed + +* Removed `symfony/polyfill-ctype` as a dependency, and require `ext-cytpe` instead. + * You can still require the `symfony/polyfill-ctype` in your project if you need it, as it provides `ext-ctype` + +## 1.10.0 + +### Added + +* On invalid assertion, we throw a `Webmozart\Assert\InvalidArgumentException` +* Added `Assert::positiveInteger()` + +### Changed + +* Using a trait with real implementations of `all*()` and `nullOr*()` methods to improve psalm compatibility. + +### Removed + +* Support for PHP <7.2 + +## 1.9.1 + +## Fixed + +* provisional support for PHP 8.0 + +## 1.9.0 + +* added better Psalm support for `all*` & `nullOr*` methods +* These methods are now understood by Psalm through a mixin. You may need a newer version of Psalm in order to use this +* added `@psalm-pure` annotation to `Assert::notFalse()` +* added more `@psalm-assert` annotations where appropriate + +## Changed + +* the `all*` & `nullOr*` methods are now declared on an interface, instead of `@method` annotations. +This interface is linked to the `Assert` class with a `@mixin` annotation. Most IDE's have supported this +for a long time, and you should not lose any autocompletion capabilities. PHPStan has supported this since +version `0.12.20`. This package is marked incompatible (with a composer conflict) with phpstan version prior to that. +If you do not use PHPStan than this does not matter. + +## 1.8.0 + +### Added + +* added `Assert::notStartsWith()` +* added `Assert::notEndsWith()` +* added `Assert::inArray()` +* added `@psalm-pure` annotations to pure assertions + +### Fixed + +* Exception messages of comparisons between `DateTime(Immutable)` objects now display their date & time. +* Custom Exception messages for `Assert::count()` now use the values to render the exception message. + +## 1.7.0 (2020-02-14) + +### Added + +* added `Assert::notFalse()` +* added `Assert::isAOf()` +* added `Assert::isAnyOf()` +* added `Assert::isNotA()` + +## 1.6.0 (2019-11-24) + +### Added + +* added `Assert::validArrayKey()` +* added `Assert::isNonEmptyList()` +* added `Assert::isNonEmptyMap()` +* added `@throws InvalidArgumentException` annotations to all methods that throw. +* added `@psalm-assert` for the list type to the `isList` assertion. + +### Fixed + +* `ResourceBundle` & `SimpleXMLElement` now pass the `isCountable` assertions. +They are countable, without implementing the `Countable` interface. +* The doc block of `range` now has the proper variables. +* An empty array will now pass `isList` and `isMap`. As it is a valid form of both. +If a non-empty variant is needed, use `isNonEmptyList` or `isNonEmptyMap`. + +### Changed + +* Removed some `@psalm-assert` annotations, that were 'side effect' assertions See: + * [#144](https://github.com/webmozart/assert/pull/144) + * [#145](https://github.com/webmozart/assert/issues/145) + * [#146](https://github.com/webmozart/assert/pull/146) + * [#150](https://github.com/webmozart/assert/pull/150) +* If you use Psalm, the minimum version needed is `3.6.0`. Which is enforced through a composer conflict. +If you don't use Psalm, then this has no impact. + +## 1.5.0 (2019-08-24) + +### Added + +* added `Assert::uniqueValues()` +* added `Assert::unicodeLetters()` +* added: `Assert::email()` +* added support for [Psalm](https://github.com/vimeo/psalm), by adding `@psalm-assert` annotations where appropriate. + +### Fixed + +* `Assert::endsWith()` would not give the correct result when dealing with a multibyte suffix. +* `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters. + +**NOTE**: These 2 changes may break your assertions if you relied on the fact that multibyte characters didn't behave correctly. + +### Changed + +* The names of some variables have been updated to better reflect what they are. +* All function calls are now in their FQN form, slightly increasing performance. +* Tests are now properly ran against HHVM-3.30 and PHP nightly. + +### Deprecation + +* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` + * This was already done in 1.3.0, but it was only done through a silenced `trigger_error`. It is now annotated as well. + +## 1.4.0 (2018-12-25) + +### Added + +* added `Assert::ip()` +* added `Assert::ipv4()` +* added `Assert::ipv6()` +* added `Assert::notRegex()` +* added `Assert::interfaceExists()` +* added `Assert::isList()` +* added `Assert::isMap()` +* added polyfill for ctype + +### Fixed + +* Special case when comparing objects implementing `__toString()` + +## 1.3.0 (2018-01-29) + +### Added + +* added `Assert::minCount()` +* added `Assert::maxCount()` +* added `Assert::countBetween()` +* added `Assert::isCountable()` +* added `Assert::notWhitespaceOnly()` +* added `Assert::natural()` +* added `Assert::notContains()` +* added `Assert::isArrayAccessible()` +* added `Assert::isInstanceOfAny()` +* added `Assert::isIterable()` + +### Fixed + +* `stringNotEmpty` will no longer report "0" is an empty string + +### Deprecation + +* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` + +## 1.2.0 (2016-11-23) + + * added `Assert::throws()` + * added `Assert::count()` + * added extension point `Assert::reportInvalidArgument()` for custom subclasses + +## 1.1.0 (2016-08-09) + + * added `Assert::object()` + * added `Assert::propertyExists()` + * added `Assert::propertyNotExists()` + * added `Assert::methodExists()` + * added `Assert::methodNotExists()` + * added `Assert::uuid()` + +## 1.0.2 (2015-08-24) + + * integrated Style CI + * add tests for minimum package dependencies on Travis CI + +## 1.0.1 (2015-05-12) + + * added support for PHP 5.3.3 + +## 1.0.0 (2015-05-12) + + * first stable release + +## 1.0.0-beta (2015-03-19) + + * first beta release diff --git a/vendor/webmozart/assert/LICENSE b/vendor/webmozart/assert/LICENSE new file mode 100644 index 00000000..9e2e3075 --- /dev/null +++ b/vendor/webmozart/assert/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Bernhard Schussek + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/webmozart/assert/README.md b/vendor/webmozart/assert/README.md new file mode 100644 index 00000000..3b2397a1 --- /dev/null +++ b/vendor/webmozart/assert/README.md @@ -0,0 +1,287 @@ +Webmozart Assert +================ + +[![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert) +[![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert) + +This library contains efficient assertions to test the input and output of +your methods. With these assertions, you can greatly reduce the amount of coding +needed to write a safe implementation. + +All assertions in the [`Assert`] class throw an `Webmozart\Assert\InvalidArgumentException` if +they fail. + +FAQ +--- + +**What's the difference to [beberlei/assert]?** + +This library is heavily inspired by Benjamin Eberlei's wonderful [assert package], +but fixes a usability issue with error messages that can't be fixed there without +breaking backwards compatibility. + +This package features usable error messages by default. However, you can also +easily write custom error messages: + +``` +Assert::string($path, 'The path is expected to be a string. Got: %s'); +``` + +In [beberlei/assert], the ordering of the `%s` placeholders is different for +every assertion. This package, on the contrary, provides consistent placeholder +ordering for all assertions: + +* `%s`: The tested value as string, e.g. `"/foo/bar"`. +* `%2$s`, `%3$s`, ...: Additional assertion-specific values, e.g. the + minimum/maximum length, allowed values, etc. + +Check the source code of the assertions to find out details about the additional +available placeholders. + +Installation +------------ + +Use [Composer] to install the package: + +```bash +composer require webmozart/assert +``` + +Example +------- + +```php +use Webmozart\Assert\Assert; + +class Employee +{ + public function __construct($id) + { + Assert::integer($id, 'The employee ID must be an integer. Got: %s'); + Assert::greaterThan($id, 0, 'The employee ID must be a positive integer. Got: %s'); + } +} +``` + +If you create an employee with an invalid ID, an exception is thrown: + +```php +new Employee('foobar'); +// => Webmozart\Assert\InvalidArgumentException: +// The employee ID must be an integer. Got: string + +new Employee(-10); +// => Webmozart\Assert\InvalidArgumentException: +// The employee ID must be a positive integer. Got: -10 +``` + +Assertions +---------- + +The [`Assert`] class provides the following assertions: + +### Type Assertions + +Method | Description +-------------------------------------------------------- | -------------------------------------------------- +`string($value, $message = '')` | Check that a value is a string +`stringNotEmpty($value, $message = '')` | Check that a value is a non-empty string +`integer($value, $message = '')` | Check that a value is an integer +`integerish($value, $message = '')` | Check that a value casts to an integer +`positiveInteger($value, $message = '')` | Check that a value is a positive (non-zero) integer +`float($value, $message = '')` | Check that a value is a float +`numeric($value, $message = '')` | Check that a value is numeric +`natural($value, $message= ''')` | Check that a value is a non-negative integer +`boolean($value, $message = '')` | Check that a value is a boolean +`scalar($value, $message = '')` | Check that a value is a scalar +`object($value, $message = '')` | Check that a value is an object +`resource($value, $type = null, $message = '')` | Check that a value is a resource +`isCallable($value, $message = '')` | Check that a value is a callable +`isArray($value, $message = '')` | Check that a value is an array +`isTraversable($value, $message = '')` (deprecated) | Check that a value is an array or a `\Traversable` +`isIterable($value, $message = '')` | Check that a value is an array or a `\Traversable` +`isCountable($value, $message = '')` | Check that a value is an array or a `\Countable` +`isInstanceOf($value, $class, $message = '')` | Check that a value is an `instanceof` a class +`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` at least one class on the array of classes +`notInstanceOf($value, $class, $message = '')` | Check that a value is not an `instanceof` a class +`isAOf($value, $class, $message = '')` | Check that a value is of the class or has one of its parents +`isAnyOf($value, array $classes, $message = '')` | Check that a value is of at least one of the classes or has one of its parents +`isNotA($value, $class, $message = '')` | Check that a value is not of the class or has not one of its parents +`isArrayAccessible($value, $message = '')` | Check that a value can be accessed as an array +`uniqueValues($values, $message = '')` | Check that the given array contains unique values + +### Comparison Assertions + +Method | Description +----------------------------------------------- | ------------------------------------------------------------------ +`true($value, $message = '')` | Check that a value is `true` +`false($value, $message = '')` | Check that a value is `false` +`notFalse($value, $message = '')` | Check that a value is not `false` +`null($value, $message = '')` | Check that a value is `null` +`notNull($value, $message = '')` | Check that a value is not `null` +`isEmpty($value, $message = '')` | Check that a value is `empty()` +`notEmpty($value, $message = '')` | Check that a value is not `empty()` +`eq($value, $value2, $message = '')` | Check that a value equals another (`==`) +`notEq($value, $value2, $message = '')` | Check that a value does not equal another (`!=`) +`same($value, $value2, $message = '')` | Check that a value is identical to another (`===`) +`notSame($value, $value2, $message = '')` | Check that a value is not identical to another (`!==`) +`greaterThan($value, $value2, $message = '')` | Check that a value is greater than another +`greaterThanEq($value, $value2, $message = '')` | Check that a value is greater than or equal to another +`lessThan($value, $value2, $message = '')` | Check that a value is less than another +`lessThanEq($value, $value2, $message = '')` | Check that a value is less than or equal to another +`range($value, $min, $max, $message = '')` | Check that a value is within a range +`inArray($value, array $values, $message = '')` | Check that a value is one of a list of values +`oneOf($value, array $values, $message = '')` | Check that a value is one of a list of values (alias of `inArray`) + +### String Assertions + +You should check that a value is a string with `Assert::string()` before making +any of the following assertions. + +Method | Description +--------------------------------------------------- | ----------------------------------------------------------------- +`contains($value, $subString, $message = '')` | Check that a string contains a substring +`notContains($value, $subString, $message = '')` | Check that a string does not contain a substring +`startsWith($value, $prefix, $message = '')` | Check that a string has a prefix +`notStartsWith($value, $prefix, $message = '')` | Check that a string does not have a prefix +`startsWithLetter($value, $message = '')` | Check that a string starts with a letter +`endsWith($value, $suffix, $message = '')` | Check that a string has a suffix +`notEndsWith($value, $suffix, $message = '')` | Check that a string does not have a suffix +`regex($value, $pattern, $message = '')` | Check that a string matches a regular expression +`notRegex($value, $pattern, $message = '')` | Check that a string does not match a regular expression +`unicodeLetters($value, $message = '')` | Check that a string contains Unicode letters only +`alpha($value, $message = '')` | Check that a string contains letters only +`digits($value, $message = '')` | Check that a string contains digits only +`alnum($value, $message = '')` | Check that a string contains letters and digits only +`lower($value, $message = '')` | Check that a string contains lowercase characters only +`upper($value, $message = '')` | Check that a string contains uppercase characters only +`length($value, $length, $message = '')` | Check that a string has a certain number of characters +`minLength($value, $min, $message = '')` | Check that a string has at least a certain number of characters +`maxLength($value, $max, $message = '')` | Check that a string has at most a certain number of characters +`lengthBetween($value, $min, $max, $message = '')` | Check that a string has a length in the given range +`uuid($value, $message = '')` | Check that a string is a valid UUID +`ip($value, $message = '')` | Check that a string is a valid IP (either IPv4 or IPv6) +`ipv4($value, $message = '')` | Check that a string is a valid IPv4 +`ipv6($value, $message = '')` | Check that a string is a valid IPv6 +`email($value, $message = '')` | Check that a string is a valid e-mail address +`notWhitespaceOnly($value, $message = '')` | Check that a string contains at least one non-whitespace character + +### File Assertions + +Method | Description +----------------------------------- | -------------------------------------------------- +`fileExists($value, $message = '')` | Check that a value is an existing path +`file($value, $message = '')` | Check that a value is an existing file +`directory($value, $message = '')` | Check that a value is an existing directory +`readable($value, $message = '')` | Check that a value is a readable path +`writable($value, $message = '')` | Check that a value is a writable path + +### Object Assertions + +Method | Description +----------------------------------------------------- | -------------------------------------------------- +`classExists($value, $message = '')` | Check that a value is an existing class name +`subclassOf($value, $class, $message = '')` | Check that a class is a subclass of another +`interfaceExists($value, $message = '')` | Check that a value is an existing interface name +`implementsInterface($value, $class, $message = '')` | Check that a class implements an interface +`propertyExists($value, $property, $message = '')` | Check that a property exists in a class/object +`propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object +`methodExists($value, $method, $message = '')` | Check that a method exists in a class/object +`methodNotExists($value, $method, $message = '')` | Check that a method does not exist in a class/object + +### Array Assertions + +Method | Description +-------------------------------------------------- | ------------------------------------------------------------------ +`keyExists($array, $key, $message = '')` | Check that a key exists in an array +`keyNotExists($array, $key, $message = '')` | Check that a key does not exist in an array +`validArrayKey($key, $message = '')` | Check that a value is a valid array key (int or string) +`count($array, $number, $message = '')` | Check that an array contains a specific number of elements +`minCount($array, $min, $message = '')` | Check that an array contains at least a certain number of elements +`maxCount($array, $max, $message = '')` | Check that an array contains at most a certain number of elements +`countBetween($array, $min, $max, $message = '')` | Check that an array has a count in the given range +`isList($array, $message = '')` | Check that an array is a non-associative list +`isNonEmptyList($array, $message = '')` | Check that an array is a non-associative list, and not empty +`isMap($array, $message = '')` | Check that an array is associative and has strings as keys +`isNonEmptyMap($array, $message = '')` | Check that an array is associative and has strings as keys, and is not empty + +### Function Assertions + +Method | Description +------------------------------------------- | ----------------------------------------------------------------------------------------------------- +`throws($closure, $class, $message = '')` | Check that a function throws a certain exception. Subclasses of the exception class will be accepted. + +### Collection Assertions + +All of the above assertions can be prefixed with `all*()` to test the contents +of an array or a `\Traversable`: + +```php +Assert::allIsInstanceOf($employees, 'Acme\Employee'); +``` + +### Nullable Assertions + +All of the above assertions can be prefixed with `nullOr*()` to run the +assertion only if it the value is not `null`: + +```php +Assert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s'); +``` + +### Extending Assert + +The `Assert` class comes with a few methods, which can be overridden to change the class behaviour. You can also extend it to +add your own assertions. + +#### Overriding methods + +Overriding the following methods in your assertion class allows you to change the behaviour of the assertions: + +* `public static function __callStatic($name, $arguments)` + * This method is used to 'create' the `nullOr` and `all` versions of the assertions. +* `protected static function valueToString($value)` + * This method is used for error messages, to convert the value to a string value for displaying. You could use this for representing a value object with a `__toString` method for example. +* `protected static function typeToString($value)` + * This method is used for error messages, to convert the a value to a string representing its type. +* `protected static function strlen($value)` + * This method is used to calculate string length for relevant methods, using the `mb_strlen` if available and useful. +* `protected static function reportInvalidArgument($message)` + * This method is called when an assertion fails, with the specified error message. Here you can throw your own exception, or log something. + +## Static analysis support + +Where applicable, assertion functions are annotated to support Psalm's +[Assertion syntax](https://psalm.dev/docs/annotating_code/assertion_syntax/). +A dedicated [PHPStan Plugin](https://github.com/phpstan/phpstan-webmozart-assert) is +required for proper type support. + +Authors +------- + +* [Bernhard Schussek] a.k.a. [@webmozart] +* [The Community Contributors] + +Contribute +---------- + +Contributions to the package are always welcome! + +* Report any bugs or issues you find on the [issue tracker]. +* You can grab the source code at the package's [Git repository]. + +License +------- + +All contents of this package are licensed under the [MIT license]. + +[beberlei/assert]: https://github.com/beberlei/assert +[assert package]: https://github.com/beberlei/assert +[Composer]: https://getcomposer.org +[Bernhard Schussek]: https://webmozarts.com +[The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors +[issue tracker]: https://github.com/webmozart/assert/issues +[Git repository]: https://github.com/webmozart/assert +[@webmozart]: https://twitter.com/webmozart +[MIT license]: LICENSE +[`Assert`]: src/Assert.php diff --git a/vendor/webmozart/assert/composer.json b/vendor/webmozart/assert/composer.json new file mode 100644 index 00000000..b340452c --- /dev/null +++ b/vendor/webmozart/assert/composer.json @@ -0,0 +1,43 @@ +{ + "name": "webmozart/assert", + "description": "Assertions to validate method input/output with nice error messages.", + "license": "MIT", + "keywords": [ + "assert", + "check", + "validate" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "require": { + "php": "^7.2 || ^8.0", + "ext-ctype": "*" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Webmozart\\Assert\\Tests\\": "tests/", + "Webmozart\\Assert\\Bin\\": "bin/src" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + } +} diff --git a/vendor/webmozart/assert/src/Assert.php b/vendor/webmozart/assert/src/Assert.php new file mode 100644 index 00000000..db1f3a51 --- /dev/null +++ b/vendor/webmozart/assert/src/Assert.php @@ -0,0 +1,2080 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Webmozart\Assert; + +use ArrayAccess; +use BadMethodCallException; +use Closure; +use Countable; +use DateTime; +use DateTimeImmutable; +use Exception; +use ResourceBundle; +use SimpleXMLElement; +use Throwable; +use Traversable; + +/** + * Efficient assertions to validate the input/output of your methods. + * + * @since 1.0 + * + * @author Bernhard Schussek + */ +class Assert +{ + use Mixin; + + /** + * @psalm-pure + * @psalm-assert string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function string($value, $message = '') + { + if (!\is_string($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a string. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert non-empty-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function stringNotEmpty($value, $message = '') + { + static::string($value, $message); + static::notEq($value, '', $message); + } + + /** + * @psalm-pure + * @psalm-assert int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function integer($value, $message = '') + { + if (!\is_int($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an integer. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function integerish($value, $message = '') + { + if (!\is_numeric($value) || $value != (int) $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an integerish value. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert positive-int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function positiveInteger($value, $message = '') + { + if (!(\is_int($value) && $value > 0)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a positive integer. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert float $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function float($value, $message = '') + { + if (!\is_float($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a float. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function numeric($value, $message = '') + { + if (!\is_numeric($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a numeric. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert positive-int|0 $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function natural($value, $message = '') + { + if (!\is_int($value) || $value < 0) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a non-negative integer. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert bool $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function boolean($value, $message = '') + { + if (!\is_bool($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a boolean. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert scalar $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function scalar($value, $message = '') + { + if (!\is_scalar($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a scalar. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert object $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function object($value, $message = '') + { + if (!\is_object($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an object. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert resource $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function resource($value, $type = null, $message = '') + { + if (!\is_resource($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a resource. Got: %s', + static::typeToString($value) + )); + } + + if ($type && $type !== \get_resource_type($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a resource of type %2$s. Got: %s', + static::typeToString($value), + $type + )); + } + } + + /** + * @psalm-pure + * @psalm-assert callable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isCallable($value, $message = '') + { + if (!\is_callable($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a callable. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert array $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isArray($value, $message = '') + { + if (!\is_array($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isTraversable($value, $message = '') + { + @\trigger_error( + \sprintf( + 'The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', + __METHOD__ + ), + \E_USER_DEPRECATED + ); + + if (!\is_array($value) && !($value instanceof Traversable)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a traversable. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert array|ArrayAccess $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isArrayAccessible($value, $message = '') + { + if (!\is_array($value) && !($value instanceof ArrayAccess)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array accessible. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert countable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isCountable($value, $message = '') + { + if ( + !\is_array($value) + && !($value instanceof Countable) + && !($value instanceof ResourceBundle) + && !($value instanceof SimpleXMLElement) + ) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a countable. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isIterable($value, $message = '') + { + if (!\is_array($value) && !($value instanceof Traversable)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an iterable. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isInstanceOf($value, $class, $message = '') + { + if (!($value instanceof $class)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an instance of %2$s. Got: %s', + static::typeToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert !ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notInstanceOf($value, $class, $message = '') + { + if ($value instanceof $class) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an instance other than %2$s. Got: %s', + static::typeToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isInstanceOfAny($value, array $classes, $message = '') + { + foreach ($classes as $class) { + if ($value instanceof $class) { + return; + } + } + + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an instance of any of %2$s. Got: %s', + static::typeToString($value), + \implode(', ', \array_map(array(static::class, 'valueToString'), $classes)) + )); + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType|class-string $value + * + * @param object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isAOf($value, $class, $message = '') + { + static::string($class, 'Expected class as a string. Got: %s'); + + if (!\is_a($value, $class, \is_string($value))) { + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an instance of this class or to this class among its parents "%2$s". Got: %s', + static::valueToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * @psalm-assert !UnexpectedType $value + * @psalm-assert !class-string $value + * + * @param object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNotA($value, $class, $message = '') + { + static::string($class, 'Expected class as a string. Got: %s'); + + if (\is_a($value, $class, \is_string($value))) { + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an instance of this class or to this class among its parents other than "%2$s". Got: %s', + static::valueToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param object|string $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isAnyOf($value, array $classes, $message = '') + { + foreach ($classes as $class) { + static::string($class, 'Expected class as a string. Got: %s'); + + if (\is_a($value, $class, \is_string($value))) { + return; + } + } + + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an instance of any of this classes or any of those classes among their parents "%2$s". Got: %s', + static::valueToString($value), + \implode(', ', $classes) + )); + } + + /** + * @psalm-pure + * @psalm-assert empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isEmpty($value, $message = '') + { + if (!empty($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an empty value. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert !empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEmpty($value, $message = '') + { + if (empty($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a non-empty value. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function null($value, $message = '') + { + if (null !== $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected null. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert !null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notNull($value, $message = '') + { + if (null === $value) { + static::reportInvalidArgument( + $message ?: 'Expected a value other than null.' + ); + } + } + + /** + * @psalm-pure + * @psalm-assert true $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function true($value, $message = '') + { + if (true !== $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be true. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function false($value, $message = '') + { + if (false !== $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be false. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert !false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notFalse($value, $message = '') + { + if (false === $value) { + static::reportInvalidArgument( + $message ?: 'Expected a value other than false.' + ); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ip($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IP. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ipv4($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IPv4. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ipv6($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IPv6. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function email($value, $message = '') + { + if (false === \filter_var($value, FILTER_VALIDATE_EMAIL)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be a valid e-mail address. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. + * + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function uniqueValues(array $values, $message = '') + { + $allValues = \count($values); + $uniqueValues = \count(\array_unique($values)); + + if ($allValues !== $uniqueValues) { + $difference = $allValues - $uniqueValues; + + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array of unique values, but %s of them %s duplicated', + $difference, + (1 === $difference ? 'is' : 'are') + )); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function eq($value, $expect, $message = '') + { + if ($expect != $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value equal to %2$s. Got: %s', + static::valueToString($value), + static::valueToString($expect) + )); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEq($value, $expect, $message = '') + { + if ($expect == $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a different value than %s.', + static::valueToString($expect) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function same($value, $expect, $message = '') + { + if ($expect !== $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value identical to %2$s. Got: %s', + static::valueToString($value), + static::valueToString($expect) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notSame($value, $expect, $message = '') + { + if ($expect === $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value not identical to %s.', + static::valueToString($expect) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function greaterThan($value, $limit, $message = '') + { + if ($value <= $limit) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value greater than %2$s. Got: %s', + static::valueToString($value), + static::valueToString($limit) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function greaterThanEq($value, $limit, $message = '') + { + if ($value < $limit) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value greater than or equal to %2$s. Got: %s', + static::valueToString($value), + static::valueToString($limit) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lessThan($value, $limit, $message = '') + { + if ($value >= $limit) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value less than %2$s. Got: %s', + static::valueToString($value), + static::valueToString($limit) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lessThanEq($value, $limit, $message = '') + { + if ($value > $limit) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value less than or equal to %2$s. Got: %s', + static::valueToString($value), + static::valueToString($limit) + )); + } + } + + /** + * Inclusive range, so Assert::(3, 3, 5) passes. + * + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function range($value, $min, $max, $message = '') + { + if ($value < $min || $value > $max) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value between %2$s and %3$s. Got: %s', + static::valueToString($value), + static::valueToString($min), + static::valueToString($max) + )); + } + } + + /** + * A more human-readable alias of Assert::inArray(). + * + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function oneOf($value, array $values, $message = '') + { + static::inArray($value, $values, $message); + } + + /** + * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. + * + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function inArray($value, array $values, $message = '') + { + if (!\in_array($value, $values, true)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected one of: %2$s. Got: %s', + static::valueToString($value), + \implode(', ', \array_map(array(static::class, 'valueToString'), $values)) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function contains($value, $subString, $message = '') + { + if (false === \strpos($value, $subString)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain %2$s. Got: %s', + static::valueToString($value), + static::valueToString($subString) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notContains($value, $subString, $message = '') + { + if (false !== \strpos($value, $subString)) { + static::reportInvalidArgument(\sprintf( + $message ?: '%2$s was not expected to be contained in a value. Got: %s', + static::valueToString($value), + static::valueToString($subString) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notWhitespaceOnly($value, $message = '') + { + if (\preg_match('/^\s*$/', $value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a non-whitespace string. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function startsWith($value, $prefix, $message = '') + { + if (0 !== \strpos($value, $prefix)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to start with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($prefix) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notStartsWith($value, $prefix, $message = '') + { + if (0 === \strpos($value, $prefix)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value not to start with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($prefix) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function startsWithLetter($value, $message = '') + { + static::string($value); + + $valid = isset($value[0]); + + if ($valid) { + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = \ctype_alpha($value[0]); + \setlocale(LC_CTYPE, $locale); + } + + if (!$valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to start with a letter. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function endsWith($value, $suffix, $message = '') + { + if ($suffix !== \substr($value, -\strlen($suffix))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to end with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($suffix) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEndsWith($value, $suffix, $message = '') + { + if ($suffix === \substr($value, -\strlen($suffix))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value not to end with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($suffix) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function regex($value, $pattern, $message = '') + { + if (!\preg_match($pattern, $value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The value %s does not match the expected pattern.', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notRegex($value, $pattern, $message = '') + { + if (\preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The value %s matches the pattern %s (at offset %d).', + static::valueToString($value), + static::valueToString($pattern), + $matches[0][1] + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function unicodeLetters($value, $message = '') + { + static::string($value); + + if (!\preg_match('/^\p{L}+$/u', $value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain only Unicode letters. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function alpha($value, $message = '') + { + static::string($value); + + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_alpha($value); + \setlocale(LC_CTYPE, $locale); + + if ($valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain only letters. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function digits($value, $message = '') + { + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_digit($value); + \setlocale(LC_CTYPE, $locale); + + if ($valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain digits only. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function alnum($value, $message = '') + { + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_alnum($value); + \setlocale(LC_CTYPE, $locale); + + if ($valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain letters and digits only. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert lowercase-string $value + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lower($value, $message = '') + { + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_lower($value); + \setlocale(LC_CTYPE, $locale); + + if ($valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain lowercase characters only. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert !lowercase-string $value + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function upper($value, $message = '') + { + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_upper($value); + \setlocale(LC_CTYPE, $locale); + + if ($valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain uppercase characters only. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function length($value, $length, $message = '') + { + if ($length !== static::strlen($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain %2$s characters. Got: %s', + static::valueToString($value), + $length + )); + } + } + + /** + * Inclusive min. + * + * @psalm-pure + * + * @param string $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function minLength($value, $min, $message = '') + { + if (static::strlen($value) < $min) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain at least %2$s characters. Got: %s', + static::valueToString($value), + $min + )); + } + } + + /** + * Inclusive max. + * + * @psalm-pure + * + * @param string $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function maxLength($value, $max, $message = '') + { + if (static::strlen($value) > $max) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain at most %2$s characters. Got: %s', + static::valueToString($value), + $max + )); + } + } + + /** + * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. + * + * @psalm-pure + * + * @param string $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lengthBetween($value, $min, $max, $message = '') + { + $length = static::strlen($value); + + if ($length < $min || $length > $max) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', + static::valueToString($value), + $min, + $max + )); + } + } + + /** + * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function fileExists($value, $message = '') + { + static::string($value); + + if (!\file_exists($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The file %s does not exist.', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function file($value, $message = '') + { + static::fileExists($value, $message); + + if (!\is_file($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The path %s is not a file.', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function directory($value, $message = '') + { + static::fileExists($value, $message); + + if (!\is_dir($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The path %s is no directory.', + static::valueToString($value) + )); + } + } + + /** + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function readable($value, $message = '') + { + if (!\is_readable($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The path %s is not readable.', + static::valueToString($value) + )); + } + } + + /** + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function writable($value, $message = '') + { + if (!\is_writable($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The path %s is not writable.', + static::valueToString($value) + )); + } + } + + /** + * @psalm-assert class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function classExists($value, $message = '') + { + if (!\class_exists($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an existing class name. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert class-string|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function subclassOf($value, $class, $message = '') + { + if (!\is_subclass_of($value, $class)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a sub-class of %2$s. Got: %s', + static::valueToString($value), + static::valueToString($class) + )); + } + } + + /** + * @psalm-assert class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function interfaceExists($value, $message = '') + { + if (!\interface_exists($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an existing interface name. got %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert class-string $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function implementsInterface($value, $interface, $message = '') + { + if (!\in_array($interface, \class_implements($value))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an implementation of %2$s. Got: %s', + static::valueToString($value), + static::valueToString($interface) + )); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function propertyExists($classOrObject, $property, $message = '') + { + if (!\property_exists($classOrObject, $property)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the property %s to exist.', + static::valueToString($property) + )); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function propertyNotExists($classOrObject, $property, $message = '') + { + if (\property_exists($classOrObject, $property)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the property %s to not exist.', + static::valueToString($property) + )); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function methodExists($classOrObject, $method, $message = '') + { + if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the method %s to exist.', + static::valueToString($method) + )); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function methodNotExists($classOrObject, $method, $message = '') + { + if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the method %s to not exist.', + static::valueToString($method) + )); + } + } + + /** + * @psalm-pure + * + * @param array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function keyExists($array, $key, $message = '') + { + if (!(isset($array[$key]) || \array_key_exists($key, $array))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the key %s to exist.', + static::valueToString($key) + )); + } + } + + /** + * @psalm-pure + * + * @param array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function keyNotExists($array, $key, $message = '') + { + if (isset($array[$key]) || \array_key_exists($key, $array)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the key %s to not exist.', + static::valueToString($key) + )); + } + } + + /** + * Checks if a value is a valid array key (int or string). + * + * @psalm-pure + * @psalm-assert array-key $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function validArrayKey($value, $message = '') + { + if (!(\is_int($value) || \is_string($value))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected string or integer. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function count($array, $number, $message = '') + { + static::eq( + \count($array), + $number, + \sprintf( + $message ?: 'Expected an array to contain %d elements. Got: %d.', + $number, + \count($array) + ) + ); + } + + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function minCount($array, $min, $message = '') + { + if (\count($array) < $min) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array to contain at least %2$d elements. Got: %d', + \count($array), + $min + )); + } + } + + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function maxCount($array, $max, $message = '') + { + if (\count($array) > $max) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array to contain at most %2$d elements. Got: %d', + \count($array), + $max + )); + } + } + + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function countBetween($array, $min, $max, $message = '') + { + $count = \count($array); + + if ($count < $min || $count > $max) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', + $count, + $min, + $max + )); + } + } + + /** + * @psalm-pure + * @psalm-assert list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isList($array, $message = '') + { + if (!\is_array($array)) { + static::reportInvalidArgument( + $message ?: 'Expected list - non-associative array.' + ); + } + + if ($array === \array_values($array)) { + return; + } + + $nextKey = -1; + foreach ($array as $k => $v) { + if ($k !== ++$nextKey) { + static::reportInvalidArgument( + $message ?: 'Expected list - non-associative array.' + ); + } + } + } + + /** + * @psalm-pure + * @psalm-assert non-empty-list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNonEmptyList($array, $message = '') + { + static::isList($array, $message); + static::notEmpty($array, $message); + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array $array + * @psalm-assert array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isMap($array, $message = '') + { + if ( + !\is_array($array) || + \array_keys($array) !== \array_filter(\array_keys($array), '\is_string') + ) { + static::reportInvalidArgument( + $message ?: 'Expected map - associative array with string keys.' + ); + } + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array $array + * @psalm-assert array $array + * @psalm-assert !empty $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNonEmptyMap($array, $message = '') + { + static::isMap($array, $message); + static::notEmpty($array, $message); + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function uuid($value, $message = '') + { + $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); + + // The nil UUID is special form of UUID that is specified to have all + // 128 bits set to zero. + if ('00000000-0000-0000-0000-000000000000' === $value) { + return; + } + + if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Value %s is not a valid UUID.', + static::valueToString($value) + )); + } + } + + /** + * @psalm-param class-string $class + * + * @param Closure $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function throws(Closure $expression, $class = 'Exception', $message = '') + { + static::string($class); + + $actual = 'none'; + + try { + $expression(); + } catch (Exception $e) { + $actual = \get_class($e); + if ($e instanceof $class) { + return; + } + } catch (Throwable $e) { + $actual = \get_class($e); + if ($e instanceof $class) { + return; + } + } + + static::reportInvalidArgument($message ?: \sprintf( + 'Expected to throw "%s", got "%s"', + $class, + $actual + )); + } + + /** + * @throws BadMethodCallException + */ + public static function __callStatic($name, $arguments) + { + if ('nullOr' === \substr($name, 0, 6)) { + if (null !== $arguments[0]) { + $method = \lcfirst(\substr($name, 6)); + \call_user_func_array(array(static::class, $method), $arguments); + } + + return; + } + + if ('all' === \substr($name, 0, 3)) { + static::isIterable($arguments[0]); + + $method = \lcfirst(\substr($name, 3)); + $args = $arguments; + + foreach ($arguments[0] as $entry) { + $args[0] = $entry; + + \call_user_func_array(array(static::class, $method), $args); + } + + return; + } + + throw new BadMethodCallException('No such method: '.$name); + } + + /** + * @param mixed $value + * + * @return string + */ + protected static function valueToString($value) + { + if (null === $value) { + return 'null'; + } + + if (true === $value) { + return 'true'; + } + + if (false === $value) { + return 'false'; + } + + if (\is_array($value)) { + return 'array'; + } + + if (\is_object($value)) { + if (\method_exists($value, '__toString')) { + return \get_class($value).': '.self::valueToString($value->__toString()); + } + + if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { + return \get_class($value).': '.self::valueToString($value->format('c')); + } + + return \get_class($value); + } + + if (\is_resource($value)) { + return 'resource'; + } + + if (\is_string($value)) { + return '"'.$value.'"'; + } + + return (string) $value; + } + + /** + * @param mixed $value + * + * @return string + */ + protected static function typeToString($value) + { + return \is_object($value) ? \get_class($value) : \gettype($value); + } + + protected static function strlen($value) + { + if (!\function_exists('mb_detect_encoding')) { + return \strlen($value); + } + + if (false === $encoding = \mb_detect_encoding($value)) { + return \strlen($value); + } + + return \mb_strlen($value, $encoding); + } + + /** + * @param string $message + * + * @throws InvalidArgumentException + * + * @psalm-pure this method is not supposed to perform side-effects + * @psalm-return never + */ + protected static function reportInvalidArgument($message) + { + throw new InvalidArgumentException($message); + } + + private function __construct() + { + } +} diff --git a/vendor/webmozart/assert/src/InvalidArgumentException.php b/vendor/webmozart/assert/src/InvalidArgumentException.php new file mode 100644 index 00000000..9d95a58c --- /dev/null +++ b/vendor/webmozart/assert/src/InvalidArgumentException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Webmozart\Assert; + +class InvalidArgumentException extends \InvalidArgumentException +{ +} diff --git a/vendor/webmozart/assert/src/Mixin.php b/vendor/webmozart/assert/src/Mixin.php new file mode 100644 index 00000000..0f0a75e3 --- /dev/null +++ b/vendor/webmozart/assert/src/Mixin.php @@ -0,0 +1,5089 @@ + $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allString($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::string($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrString($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::string($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert non-empty-string|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrStringNotEmpty($value, $message = '') + { + null === $value || static::stringNotEmpty($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allStringNotEmpty($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::stringNotEmpty($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrStringNotEmpty($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::stringNotEmpty($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert int|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrInteger($value, $message = '') + { + null === $value || static::integer($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allInteger($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::integer($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrInteger($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::integer($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert numeric|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIntegerish($value, $message = '') + { + null === $value || static::integerish($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIntegerish($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::integerish($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIntegerish($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::integerish($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert positive-int|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrPositiveInteger($value, $message = '') + { + null === $value || static::positiveInteger($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allPositiveInteger($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::positiveInteger($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrPositiveInteger($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::positiveInteger($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert float|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrFloat($value, $message = '') + { + null === $value || static::float($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allFloat($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::float($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFloat($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::float($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert numeric|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNumeric($value, $message = '') + { + null === $value || static::numeric($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNumeric($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::numeric($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNumeric($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::numeric($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert positive-int|0|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNatural($value, $message = '') + { + null === $value || static::natural($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNatural($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::natural($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNatural($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::natural($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert bool|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrBoolean($value, $message = '') + { + null === $value || static::boolean($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allBoolean($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::boolean($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrBoolean($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::boolean($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert scalar|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrScalar($value, $message = '') + { + null === $value || static::scalar($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allScalar($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::scalar($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrScalar($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::scalar($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert object|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrObject($value, $message = '') + { + null === $value || static::object($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allObject($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::object($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrObject($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::object($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert resource|null $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrResource($value, $type = null, $message = '') + { + null === $value || static::resource($value, $type, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allResource($value, $type = null, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::resource($entry, $type, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrResource($value, $type = null, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::resource($entry, $type, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert callable|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsCallable($value, $message = '') + { + null === $value || static::isCallable($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsCallable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isCallable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsCallable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isCallable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert array|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsArray($value, $message = '') + { + null === $value || static::isArray($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsArray($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isArray($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsArray($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isArray($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable|null $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsTraversable($value, $message = '') + { + null === $value || static::isTraversable($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsTraversable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isTraversable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsTraversable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isTraversable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert array|ArrayAccess|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsArrayAccessible($value, $message = '') + { + null === $value || static::isArrayAccessible($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsArrayAccessible($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isArrayAccessible($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsArrayAccessible($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isArrayAccessible($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert countable|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsCountable($value, $message = '') + { + null === $value || static::isCountable($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsCountable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isCountable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsCountable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isCountable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsIterable($value, $message = '') + { + null === $value || static::isIterable($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsIterable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isIterable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsIterable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isIterable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType|null $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsInstanceOf($value, $class, $message = '') + { + null === $value || static::isInstanceOf($value, $class, $message); + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsInstanceOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isInstanceOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsInstanceOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isInstanceOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotInstanceOf($value, $class, $message = '') + { + null === $value || static::notInstanceOf($value, $class, $message); + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotInstanceOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notInstanceOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotInstanceOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notInstanceOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsInstanceOfAny($value, $classes, $message = '') + { + null === $value || static::isInstanceOfAny($value, $classes, $message); + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsInstanceOfAny($value, $classes, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isInstanceOfAny($entry, $classes, $message); + } + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsInstanceOfAny($value, $classes, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isInstanceOfAny($entry, $classes, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType|class-string|null $value + * + * @param object|string|null $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsAOf($value, $class, $message = '') + { + null === $value || static::isAOf($value, $class, $message); + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable> $value + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsAOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isAOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable|null> $value + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsAOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isAOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * + * @param object|string|null $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsNotA($value, $class, $message = '') + { + null === $value || static::isNotA($value, $class, $message); + } + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsNotA($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isNotA($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * @psalm-assert iterable|null> $value + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsNotA($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isNotA($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param object|string|null $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsAnyOf($value, $classes, $message = '') + { + null === $value || static::isAnyOf($value, $classes, $message); + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param iterable $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsAnyOf($value, $classes, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isAnyOf($entry, $classes, $message); + } + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param iterable $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsAnyOf($value, $classes, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isAnyOf($entry, $classes, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsEmpty($value, $message = '') + { + null === $value || static::isEmpty($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsEmpty($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::isEmpty($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsEmpty($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isEmpty($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotEmpty($value, $message = '') + { + null === $value || static::notEmpty($value, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotEmpty($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notEmpty($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotEmpty($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notEmpty($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNull($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::null($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotNull($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notNull($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert true|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrTrue($value, $message = '') + { + null === $value || static::true($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allTrue($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::true($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrTrue($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::true($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert false|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrFalse($value, $message = '') + { + null === $value || static::false($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allFalse($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::false($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFalse($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::false($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotFalse($value, $message = '') + { + null === $value || static::notFalse($value, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotFalse($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notFalse($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotFalse($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notFalse($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIp($value, $message = '') + { + null === $value || static::ip($value, $message); + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIp($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::ip($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIp($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::ip($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIpv4($value, $message = '') + { + null === $value || static::ipv4($value, $message); + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIpv4($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::ipv4($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIpv4($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::ipv4($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIpv6($value, $message = '') + { + null === $value || static::ipv6($value, $message); + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIpv6($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::ipv6($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIpv6($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::ipv6($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrEmail($value, $message = '') + { + null === $value || static::email($value, $message); + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allEmail($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::email($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrEmail($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::email($entry, $message); + } + } + + /** + * @param array|null $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrUniqueValues($values, $message = '') + { + null === $values || static::uniqueValues($values, $message); + } + + /** + * @param iterable $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allUniqueValues($values, $message = '') + { + static::isIterable($values); + + foreach ($values as $entry) { + static::uniqueValues($entry, $message); + } + } + + /** + * @param iterable $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUniqueValues($values, $message = '') + { + static::isIterable($values); + + foreach ($values as $entry) { + null === $entry || static::uniqueValues($entry, $message); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrEq($value, $expect, $message = '') + { + null === $value || static::eq($value, $expect, $message); + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allEq($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::eq($entry, $expect, $message); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrEq($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::eq($entry, $expect, $message); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotEq($value, $expect, $message = '') + { + null === $value || static::notEq($value, $expect, $message); + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotEq($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notEq($entry, $expect, $message); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotEq($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notEq($entry, $expect, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrSame($value, $expect, $message = '') + { + null === $value || static::same($value, $expect, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allSame($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::same($entry, $expect, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrSame($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::same($entry, $expect, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotSame($value, $expect, $message = '') + { + null === $value || static::notSame($value, $expect, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotSame($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notSame($entry, $expect, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotSame($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notSame($entry, $expect, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrGreaterThan($value, $limit, $message = '') + { + null === $value || static::greaterThan($value, $limit, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allGreaterThan($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::greaterThan($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrGreaterThan($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::greaterThan($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrGreaterThanEq($value, $limit, $message = '') + { + null === $value || static::greaterThanEq($value, $limit, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allGreaterThanEq($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::greaterThanEq($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrGreaterThanEq($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::greaterThanEq($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrLessThan($value, $limit, $message = '') + { + null === $value || static::lessThan($value, $limit, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allLessThan($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::lessThan($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLessThan($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::lessThan($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrLessThanEq($value, $limit, $message = '') + { + null === $value || static::lessThanEq($value, $limit, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allLessThanEq($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::lessThanEq($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLessThanEq($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::lessThanEq($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrRange($value, $min, $max, $message = '') + { + null === $value || static::range($value, $min, $max, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allRange($value, $min, $max, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::range($entry, $min, $max, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrRange($value, $min, $max, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::range($entry, $min, $max, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrOneOf($value, $values, $message = '') + { + null === $value || static::oneOf($value, $values, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allOneOf($value, $values, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::oneOf($entry, $values, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrOneOf($value, $values, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::oneOf($entry, $values, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrInArray($value, $values, $message = '') + { + null === $value || static::inArray($value, $values, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allInArray($value, $values, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::inArray($entry, $values, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrInArray($value, $values, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::inArray($entry, $values, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrContains($value, $subString, $message = '') + { + null === $value || static::contains($value, $subString, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allContains($value, $subString, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::contains($entry, $subString, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrContains($value, $subString, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::contains($entry, $subString, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotContains($value, $subString, $message = '') + { + null === $value || static::notContains($value, $subString, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotContains($value, $subString, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notContains($entry, $subString, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotContains($value, $subString, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notContains($entry, $subString, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotWhitespaceOnly($value, $message = '') + { + null === $value || static::notWhitespaceOnly($value, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotWhitespaceOnly($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notWhitespaceOnly($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotWhitespaceOnly($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notWhitespaceOnly($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrStartsWith($value, $prefix, $message = '') + { + null === $value || static::startsWith($value, $prefix, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allStartsWith($value, $prefix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::startsWith($entry, $prefix, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrStartsWith($value, $prefix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::startsWith($entry, $prefix, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotStartsWith($value, $prefix, $message = '') + { + null === $value || static::notStartsWith($value, $prefix, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotStartsWith($value, $prefix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notStartsWith($entry, $prefix, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotStartsWith($value, $prefix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notStartsWith($entry, $prefix, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrStartsWithLetter($value, $message = '') + { + null === $value || static::startsWithLetter($value, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allStartsWithLetter($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::startsWithLetter($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrStartsWithLetter($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::startsWithLetter($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrEndsWith($value, $suffix, $message = '') + { + null === $value || static::endsWith($value, $suffix, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allEndsWith($value, $suffix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::endsWith($entry, $suffix, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrEndsWith($value, $suffix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::endsWith($entry, $suffix, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotEndsWith($value, $suffix, $message = '') + { + null === $value || static::notEndsWith($value, $suffix, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotEndsWith($value, $suffix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notEndsWith($entry, $suffix, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotEndsWith($value, $suffix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notEndsWith($entry, $suffix, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrRegex($value, $pattern, $message = '') + { + null === $value || static::regex($value, $pattern, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allRegex($value, $pattern, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::regex($entry, $pattern, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrRegex($value, $pattern, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::regex($entry, $pattern, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotRegex($value, $pattern, $message = '') + { + null === $value || static::notRegex($value, $pattern, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotRegex($value, $pattern, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::notRegex($entry, $pattern, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotRegex($value, $pattern, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notRegex($entry, $pattern, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrUnicodeLetters($value, $message = '') + { + null === $value || static::unicodeLetters($value, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allUnicodeLetters($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::unicodeLetters($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUnicodeLetters($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::unicodeLetters($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrAlpha($value, $message = '') + { + null === $value || static::alpha($value, $message); + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allAlpha($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::alpha($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrAlpha($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::alpha($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrDigits($value, $message = '') + { + null === $value || static::digits($value, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allDigits($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::digits($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrDigits($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::digits($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrAlnum($value, $message = '') + { + null === $value || static::alnum($value, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allAlnum($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::alnum($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrAlnum($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::alnum($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert lowercase-string|null $value + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrLower($value, $message = '') + { + null === $value || static::lower($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allLower($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::lower($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLower($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::lower($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrUpper($value, $message = '') + { + null === $value || static::upper($value, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allUpper($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::upper($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUpper($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::upper($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrLength($value, $length, $message = '') + { + null === $value || static::length($value, $length, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allLength($value, $length, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::length($entry, $length, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLength($value, $length, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::length($entry, $length, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMinLength($value, $min, $message = '') + { + null === $value || static::minLength($value, $min, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMinLength($value, $min, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::minLength($entry, $min, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMinLength($value, $min, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::minLength($entry, $min, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMaxLength($value, $max, $message = '') + { + null === $value || static::maxLength($value, $max, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMaxLength($value, $max, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::maxLength($entry, $max, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMaxLength($value, $max, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::maxLength($entry, $max, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrLengthBetween($value, $min, $max, $message = '') + { + null === $value || static::lengthBetween($value, $min, $max, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allLengthBetween($value, $min, $max, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::lengthBetween($entry, $min, $max, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLengthBetween($value, $min, $max, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::lengthBetween($entry, $min, $max, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrFileExists($value, $message = '') + { + null === $value || static::fileExists($value, $message); + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allFileExists($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::fileExists($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFileExists($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::fileExists($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrFile($value, $message = '') + { + null === $value || static::file($value, $message); + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allFile($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::file($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFile($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::file($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrDirectory($value, $message = '') + { + null === $value || static::directory($value, $message); + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allDirectory($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::directory($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrDirectory($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::directory($entry, $message); + } + } + + /** + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrReadable($value, $message = '') + { + null === $value || static::readable($value, $message); + } + + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allReadable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::readable($entry, $message); + } + } + + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrReadable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::readable($entry, $message); + } + } + + /** + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrWritable($value, $message = '') + { + null === $value || static::writable($value, $message); + } + + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allWritable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::writable($entry, $message); + } + } + + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrWritable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::writable($entry, $message); + } + } + + /** + * @psalm-assert class-string|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrClassExists($value, $message = '') + { + null === $value || static::classExists($value, $message); + } + + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allClassExists($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::classExists($entry, $message); + } + } + + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrClassExists($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::classExists($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert class-string|ExpectedType|null $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrSubclassOf($value, $class, $message = '') + { + null === $value || static::subclassOf($value, $class, $message); + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable|ExpectedType> $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allSubclassOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::subclassOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable|ExpectedType|null> $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrSubclassOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::subclassOf($entry, $class, $message); + } + } + + /** + * @psalm-assert class-string|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrInterfaceExists($value, $message = '') + { + null === $value || static::interfaceExists($value, $message); + } + + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allInterfaceExists($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::interfaceExists($entry, $message); + } + } + + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrInterfaceExists($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::interfaceExists($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert class-string|null $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrImplementsInterface($value, $interface, $message = '') + { + null === $value || static::implementsInterface($value, $interface, $message); + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert iterable> $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allImplementsInterface($value, $interface, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::implementsInterface($entry, $interface, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert iterable|null> $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrImplementsInterface($value, $interface, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::implementsInterface($entry, $interface, $message); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object|null $classOrObject + * + * @param string|object|null $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrPropertyExists($classOrObject, $property, $message = '') + { + null === $classOrObject || static::propertyExists($classOrObject, $property, $message); + } + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allPropertyExists($classOrObject, $property, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + static::propertyExists($entry, $property, $message); + } + } + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrPropertyExists($classOrObject, $property, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + null === $entry || static::propertyExists($entry, $property, $message); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object|null $classOrObject + * + * @param string|object|null $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrPropertyNotExists($classOrObject, $property, $message = '') + { + null === $classOrObject || static::propertyNotExists($classOrObject, $property, $message); + } + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allPropertyNotExists($classOrObject, $property, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + static::propertyNotExists($entry, $property, $message); + } + } + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrPropertyNotExists($classOrObject, $property, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + null === $entry || static::propertyNotExists($entry, $property, $message); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object|null $classOrObject + * + * @param string|object|null $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMethodExists($classOrObject, $method, $message = '') + { + null === $classOrObject || static::methodExists($classOrObject, $method, $message); + } + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMethodExists($classOrObject, $method, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + static::methodExists($entry, $method, $message); + } + } + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMethodExists($classOrObject, $method, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + null === $entry || static::methodExists($entry, $method, $message); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object|null $classOrObject + * + * @param string|object|null $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMethodNotExists($classOrObject, $method, $message = '') + { + null === $classOrObject || static::methodNotExists($classOrObject, $method, $message); + } + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMethodNotExists($classOrObject, $method, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + static::methodNotExists($entry, $method, $message); + } + } + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMethodNotExists($classOrObject, $method, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + null === $entry || static::methodNotExists($entry, $method, $message); + } + } + + /** + * @psalm-pure + * + * @param array|null $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrKeyExists($array, $key, $message = '') + { + null === $array || static::keyExists($array, $key, $message); + } + + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allKeyExists($array, $key, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + static::keyExists($entry, $key, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrKeyExists($array, $key, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::keyExists($entry, $key, $message); + } + } + + /** + * @psalm-pure + * + * @param array|null $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrKeyNotExists($array, $key, $message = '') + { + null === $array || static::keyNotExists($array, $key, $message); + } + + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allKeyNotExists($array, $key, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + static::keyNotExists($entry, $key, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrKeyNotExists($array, $key, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::keyNotExists($entry, $key, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert array-key|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrValidArrayKey($value, $message = '') + { + null === $value || static::validArrayKey($value, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allValidArrayKey($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::validArrayKey($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrValidArrayKey($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::validArrayKey($entry, $message); + } + } + + /** + * @param Countable|array|null $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrCount($array, $number, $message = '') + { + null === $array || static::count($array, $number, $message); + } + + /** + * @param iterable $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allCount($array, $number, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + static::count($entry, $number, $message); + } + } + + /** + * @param iterable $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrCount($array, $number, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::count($entry, $number, $message); + } + } + + /** + * @param Countable|array|null $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMinCount($array, $min, $message = '') + { + null === $array || static::minCount($array, $min, $message); + } + + /** + * @param iterable $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMinCount($array, $min, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + static::minCount($entry, $min, $message); + } + } + + /** + * @param iterable $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMinCount($array, $min, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::minCount($entry, $min, $message); + } + } + + /** + * @param Countable|array|null $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMaxCount($array, $max, $message = '') + { + null === $array || static::maxCount($array, $max, $message); + } + + /** + * @param iterable $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMaxCount($array, $max, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + static::maxCount($entry, $max, $message); + } + } + + /** + * @param iterable $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMaxCount($array, $max, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::maxCount($entry, $max, $message); + } + } + + /** + * @param Countable|array|null $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrCountBetween($array, $min, $max, $message = '') + { + null === $array || static::countBetween($array, $min, $max, $message); + } + + /** + * @param iterable $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allCountBetween($array, $min, $max, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + static::countBetween($entry, $min, $max, $message); + } + } + + /** + * @param iterable $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrCountBetween($array, $min, $max, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::countBetween($entry, $min, $max, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert list|null $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsList($array, $message = '') + { + null === $array || static::isList($array, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsList($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + static::isList($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsList($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::isList($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert non-empty-list|null $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsNonEmptyList($array, $message = '') + { + null === $array || static::isNonEmptyList($array, $message); + } + + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsNonEmptyList($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + static::isNonEmptyList($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsNonEmptyList($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::isNonEmptyList($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array|null $array + * @psalm-assert array|null $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsMap($array, $message = '') + { + null === $array || static::isMap($array, $message); + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable> $array + * @psalm-assert iterable> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsMap($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + static::isMap($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable|null> $array + * @psalm-assert iterable|null> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsMap($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::isMap($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array|null $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsNonEmptyMap($array, $message = '') + { + null === $array || static::isNonEmptyMap($array, $message); + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsNonEmptyMap($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + static::isNonEmptyMap($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable|null> $array + * @psalm-assert iterable|null> $array + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsNonEmptyMap($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::isNonEmptyMap($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrUuid($value, $message = '') + { + null === $value || static::uuid($value, $message); + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allUuid($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + static::uuid($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUuid($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::uuid($entry, $message); + } + } + + /** + * @psalm-param class-string $class + * + * @param Closure|null $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrThrows($expression, $class = 'Exception', $message = '') + { + null === $expression || static::throws($expression, $class, $message); + } + + /** + * @psalm-param class-string $class + * + * @param iterable $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allThrows($expression, $class = 'Exception', $message = '') + { + static::isIterable($expression); + + foreach ($expression as $entry) { + static::throws($entry, $class, $message); + } + } + + /** + * @psalm-param class-string $class + * + * @param iterable $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrThrows($expression, $class = 'Exception', $message = '') + { + static::isIterable($expression); + + foreach ($expression as $entry) { + null === $entry || static::throws($entry, $class, $message); + } + } +} diff --git a/vendor/webmozart/path-util/.gitignore b/vendor/webmozart/path-util/.gitignore new file mode 100644 index 00000000..3a9875b4 --- /dev/null +++ b/vendor/webmozart/path-util/.gitignore @@ -0,0 +1,2 @@ +/vendor/ +composer.lock diff --git a/vendor/webmozart/path-util/.styleci.yml b/vendor/webmozart/path-util/.styleci.yml new file mode 100644 index 00000000..295fafec --- /dev/null +++ b/vendor/webmozart/path-util/.styleci.yml @@ -0,0 +1,8 @@ +preset: symfony + +enabled: + - ordered_use + - strict + +disabled: + - empty_return diff --git a/vendor/webmozart/path-util/.travis.yml b/vendor/webmozart/path-util/.travis.yml new file mode 100644 index 00000000..d103428e --- /dev/null +++ b/vendor/webmozart/path-util/.travis.yml @@ -0,0 +1,29 @@ +language: php + +sudo: false + +cache: + directories: + - $HOME/.composer/cache/files + +matrix: + include: + - php: 5.3 + - php: 5.4 + - php: 5.5 + - php: 5.6 + - php: 5.6 + env: COMPOSER_FLAGS='--prefer-lowest --prefer-stable' + - php: hhvm + - php: nightly + allow_failures: + - php: hhvm + - php: nightly + fast_finish: true + +install: composer update $COMPOSER_FLAGS -n + +script: vendor/bin/phpunit --verbose --coverage-clover=coverage.clover + +after_script: + - sh -c 'if [ "$TRAVIS_PHP_VERSION" != "hhvm" ]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi;' diff --git a/vendor/webmozart/path-util/CHANGELOG.md b/vendor/webmozart/path-util/CHANGELOG.md new file mode 100644 index 00000000..b669a191 --- /dev/null +++ b/vendor/webmozart/path-util/CHANGELOG.md @@ -0,0 +1,68 @@ +Changelog +========= + +* 2.3.0 (2015-12-17) + + * added `Url::makeRelative()` for calculating relative paths between URLs + * fixed `Path::makeRelative()` to trim leading dots when moving outside of + the base path + +* 2.2.3 (2015-10-05) + + * fixed `Path::makeRelative()` to produce `..` when called with the parent + directory of a path + +* 2.2.2 (2015-08-24) + + * `Path::makeAbsolute()` does not fail anymore if an absolute path is passed + with a different root (partition) than the base path + +* 2.2.1 (2015-08-24) + + * fixed minimum versions in composer.json + +* 2.2.0 (2015-08-14) + + * added `Path::normalize()` + +* 2.1.0 (2015-07-14) + + * `Path::canonicalize()` now turns `~` into the user's home directory on + Unix and Windows 8 or later. + +* 2.0.0 (2015-05-21) + + * added support for streams, e.g. "phar://C:/path/to/file" + * added `Path::join()` + * all `Path` methods now throw exceptions if parameters with invalid types are + passed + * added an internal buffer to `Path::canonicalize()` in order to increase the + performance of the `Path` class + +* 1.1.0 (2015-03-19) + + * added `Path::getFilename()` + * added `Path::getFilenameWithoutExtension()` + * added `Path::getExtension()` + * added `Path::hasExtension()` + * added `Path::changeExtension()` + * `Path::makeRelative()` now works when the absolute path and the base path + have equal directory names beneath different base directories + (e.g. "/webmozart/css/style.css" relative to "/puli/css") + +* 1.0.2 (2015-01-12) + + * `Path::makeAbsolute()` fails now if the base path is not absolute + * `Path::makeRelative()` now works when a relative path is passed and the base + path is empty + +* 1.0.1 (2014-12-03) + + * Added PHP 5.6 to Travis. + * Fixed bug in `Path::makeRelative()` when first argument is shorter than second + * Made HHVM compatibility mandatory in .travis.yml + * Added PHP 5.3.3 to travis.yml + +* 1.0.0 (2014-11-26) + + * first release diff --git a/vendor/webmozart/path-util/LICENSE b/vendor/webmozart/path-util/LICENSE new file mode 100644 index 00000000..9e2e3075 --- /dev/null +++ b/vendor/webmozart/path-util/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Bernhard Schussek + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/webmozart/path-util/README.md b/vendor/webmozart/path-util/README.md new file mode 100644 index 00000000..de86ca11 --- /dev/null +++ b/vendor/webmozart/path-util/README.md @@ -0,0 +1,143 @@ +File Path Utility +================= + +[![Build Status](https://travis-ci.org/webmozart/path-util.svg?branch=2.3.0)](https://travis-ci.org/webmozart/path-util) +[![Build status](https://ci.appveyor.com/api/projects/status/d5uuypr6p162gpxf/branch/master?svg=true)](https://ci.appveyor.com/project/webmozart/path-util/branch/master) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/webmozart/path-util/badges/quality-score.png?b=2.3.0)](https://scrutinizer-ci.com/g/webmozart/path-util/?branch=2.3.0) +[![Latest Stable Version](https://poser.pugx.org/webmozart/path-util/v/stable.svg)](https://packagist.org/packages/webmozart/path-util) +[![Total Downloads](https://poser.pugx.org/webmozart/path-util/downloads.svg)](https://packagist.org/packages/webmozart/path-util) +[![Dependency Status](https://www.versioneye.com/php/webmozart:path-util/2.3.0/badge.svg)](https://www.versioneye.com/php/webmozart:path-util/2.3.0) + +Latest release: [2.3.0](https://packagist.org/packages/webmozart/path-util#2.3.0) + +PHP >= 5.3.3 + +This package provides robust, cross-platform utility functions for normalizing, +comparing and modifying file paths and URLs. + +Installation +------------ + +The utility can be installed with [Composer]: + +``` +$ composer require webmozart/path-util +``` + +Usage +----- + +Use the `Path` class to handle file paths: + +```php +use Webmozart\PathUtil\Path; + +echo Path::canonicalize('/var/www/vhost/webmozart/../config.ini'); +// => /var/www/vhost/config.ini + +echo Path::canonicalize('C:\Programs\Webmozart\..\config.ini'); +// => C:/Programs/config.ini + +echo Path::canonicalize('~/config.ini'); +// => /home/webmozart/config.ini + +echo Path::makeAbsolute('config/config.yml', '/var/www/project'); +// => /var/www/project/config/config.yml + +echo Path::makeRelative('/var/www/project/config/config.yml', '/var/www/project/uploads'); +// => ../config/config.yml + +$paths = array( + '/var/www/vhosts/project/httpdocs/config/config.yml', + '/var/www/vhosts/project/httpdocs/images/banana.gif', + '/var/www/vhosts/project/httpdocs/uploads/../images/nicer-banana.gif', +); + +Path::getLongestCommonBasePath($paths); +// => /var/www/vhosts/project/httpdocs + +Path::getFilename('/views/index.html.twig'); +// => index.html.twig + +Path::getFilenameWithoutExtension('/views/index.html.twig'); +// => index.html + +Path::getFilenameWithoutExtension('/views/index.html.twig', 'html.twig'); +Path::getFilenameWithoutExtension('/views/index.html.twig', '.html.twig'); +// => index + +Path::getExtension('/views/index.html.twig'); +// => twig + +Path::hasExtension('/views/index.html.twig'); +// => true + +Path::hasExtension('/views/index.html.twig', 'twig'); +// => true + +Path::hasExtension('/images/profile.jpg', array('jpg', 'png', 'gif')); +// => true + +Path::changeExtension('/images/profile.jpeg', 'jpg'); +// => /images/profile.jpg + +Path::join('phar://C:/Documents', 'projects/my-project.phar', 'composer.json'); +// => phar://C:/Documents/projects/my-project.phar/composer.json + +Path::getHomeDirectory(); +// => /home/webmozart +``` + +Use the `Url` class to handle URLs: + +```php +use Webmozart\PathUtil\Url; + +echo Url::makeRelative('http://example.com/css/style.css', 'http://example.com/puli'); +// => ../css/style.css + +echo Url::makeRelative('http://cdn.example.com/css/style.css', 'http://example.com/puli'); +// => http://cdn.example.com/css/style.css +``` + +Learn more in the [Documentation] and the [API Docs]. + +Authors +------- + +* [Bernhard Schussek] a.k.a. [@webmozart] +* [The Community Contributors] + +Documentation +------------- + +Read the [Documentation] if you want to learn more about the contained functions. + +Contribute +---------- + +Contributions are always welcome! + +* Report any bugs or issues you find on the [issue tracker]. +* You can grab the source code at the [Git repository]. + +Support +------- + +If you are having problems, send a mail to bschussek@gmail.com or shout out to +[@webmozart] on Twitter. + +License +------- + +All contents of this package are licensed under the [MIT license]. + +[Bernhard Schussek]: http://webmozarts.com +[The Community Contributors]: https://github.com/webmozart/path-util/graphs/contributors +[Composer]: https://getcomposer.org +[Documentation]: docs/usage.md +[API Docs]: https://webmozart.github.io/path-util/api/latest/class-Webmozart.PathUtil.Path.html +[issue tracker]: https://github.com/webmozart/path-util/issues +[Git repository]: https://github.com/webmozart/path-util +[@webmozart]: https://twitter.com/webmozart +[MIT license]: LICENSE diff --git a/vendor/webmozart/path-util/appveyor.yml b/vendor/webmozart/path-util/appveyor.yml new file mode 100644 index 00000000..e32482d4 --- /dev/null +++ b/vendor/webmozart/path-util/appveyor.yml @@ -0,0 +1,34 @@ +build: false +shallow_clone: true +platform: x86 +clone_folder: c:\projects\webmozart\path-util + +cache: + - '%LOCALAPPDATA%\Composer\files' + +init: + - SET PATH=C:\Program Files\OpenSSL;c:\tools\php;%PATH% + +environment: + matrix: + - COMPOSER_FLAGS: "" + - COMPOSER_FLAGS: --prefer-lowest --prefer-stable + +install: + - cinst -y OpenSSL.Light + - cinst -y php + - cd c:\tools\php + - copy php.ini-production php.ini /Y + - echo date.timezone="UTC" >> php.ini + - echo extension_dir=ext >> php.ini + - echo extension=php_openssl.dll >> php.ini + - echo extension=php_mbstring.dll >> php.ini + - echo extension=php_fileinfo.dll >> php.ini + - echo memory_limit=1G >> php.ini + - cd c:\projects\webmozart\path-util + - php -r "readfile('http://getcomposer.org/installer');" | php + - php composer.phar update %COMPOSER_FLAGS% --no-interaction --no-progress + +test_script: + - cd c:\projects\webmozart\path-util + - vendor\bin\phpunit.bat --verbose diff --git a/vendor/webmozart/path-util/composer.json b/vendor/webmozart/path-util/composer.json new file mode 100644 index 00000000..884ccac0 --- /dev/null +++ b/vendor/webmozart/path-util/composer.json @@ -0,0 +1,34 @@ +{ + "name": "webmozart/path-util", + "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", + "license": "MIT", + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "require": { + "php": ">=5.3.3", + "webmozart/assert": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "autoload": { + "psr-4": { + "Webmozart\\PathUtil\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Webmozart\\PathUtil\\Tests\\": "tests/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + } +} diff --git a/vendor/webmozart/path-util/docs/usage.md b/vendor/webmozart/path-util/docs/usage.md new file mode 100644 index 00000000..5135ca0b --- /dev/null +++ b/vendor/webmozart/path-util/docs/usage.md @@ -0,0 +1,203 @@ +Painfree Handling of File Paths +=============================== + +Dealing with file paths usually involves some difficulties: + +* **System Heterogeneity**: File paths look different on different platforms. + UNIX file paths start with a slash ("/"), while Windows file paths start with + a system drive ("C:"). UNIX uses forward slashes, while Windows uses + backslashes by default ("\"). + +* **Absolute/Relative Paths**: Web applications frequently need to deal with + absolute and relative paths. Converting one to the other properly is tricky + and repetitive. + +This package provides few, but robust utility methods to simplify your life +when dealing with file paths. + +Canonicalization +---------------- + +*Canonicalization* is the transformation of a path into a normalized (the +"canonical") format. You can canonicalize a path with `Path::canonicalize()`: + +```php +echo Path::canonicalize('/var/www/vhost/webmozart/../config.ini'); +// => /var/www/vhost/config.ini +``` + +The following modifications happen during canonicalization: + +* "." segments are removed; +* ".." segments are resolved; +* backslashes ("\") are converted into forward slashes ("/"); +* root paths ("/" and "C:/") always terminate with a slash; +* non-root paths never terminate with a slash; +* schemes (such as "phar://") are kept; +* replace "~" with the user's home directory. + +You can pass absolute paths and relative paths to `canonicalize()`. When a +relative path is passed, ".." segments at the beginning of the path are kept: + +```php +echo Path::canonicalize('../uploads/../config/config.yml'); +// => ../config/config.yml +``` + +Malformed paths are returned unchanged: + +```php +echo Path::canonicalize('C:Programs/PHP/php.ini'); +// => C:Programs/PHP/php.ini +``` + +Converting Absolute/Relative Paths +---------------------------------- + +Absolute/relative paths can be converted with the methods `Path::makeAbsolute()` +and `Path::makeRelative()`. + +`makeAbsolute()` expects a relative path and a base path to base that relative +path upon: + +```php +echo Path::makeAbsolute('config/config.yml', '/var/www/project'); +// => /var/www/project/config/config.yml +``` + +If an absolute path is passed in the first argument, the absolute path is +returned unchanged: + +```php +echo Path::makeAbsolute('/usr/share/lib/config.ini', '/var/www/project'); +// => /usr/share/lib/config.ini +``` + +The method resolves ".." segments, if there are any: + +```php +echo Path::makeAbsolute('../config/config.yml', '/var/www/project/uploads'); +// => /var/www/project/config/config.yml +``` + +This method is very useful if you want to be able to accept relative paths (for +example, relative to the root directory of your project) and absolute paths at +the same time. + +`makeRelative()` is the inverse operation to `makeAbsolute()`: + +```php +echo Path::makeRelative('/var/www/project/config/config.yml', '/var/www/project'); +// => config/config.yml +``` + +If the path is not within the base path, the method will prepend ".." segments +as necessary: + +```php +echo Path::makeRelative('/var/www/project/config/config.yml', '/var/www/project/uploads'); +// => ../config/config.yml +``` + +Use `isAbsolute()` and `isRelative()` to check whether a path is absolute or +relative: + +```php +Path::isAbsolute('C:\Programs\PHP\php.ini') +// => true +``` + +All four methods internally canonicalize the passed path. + +Finding Longest Common Base Paths +--------------------------------- + +When you store absolute file paths on the file system, this leads to a lot of +duplicated information: + +```php +return array( + '/var/www/vhosts/project/httpdocs/config/config.yml', + '/var/www/vhosts/project/httpdocs/config/routing.yml', + '/var/www/vhosts/project/httpdocs/config/services.yml', + '/var/www/vhosts/project/httpdocs/images/banana.gif', + '/var/www/vhosts/project/httpdocs/uploads/images/nicer-banana.gif', +); +``` + +Especially when storing many paths, the amount of duplicated information is +noticeable. You can use `Path::getLongestCommonBasePath()` to check a list of +paths for a common base path: + +```php +$paths = array( + '/var/www/vhosts/project/httpdocs/config/config.yml', + '/var/www/vhosts/project/httpdocs/config/routing.yml', + '/var/www/vhosts/project/httpdocs/config/services.yml', + '/var/www/vhosts/project/httpdocs/images/banana.gif', + '/var/www/vhosts/project/httpdocs/uploads/images/nicer-banana.gif', +); + +Path::getLongestCommonBasePath($paths); +// => /var/www/vhosts/project/httpdocs +``` + +Use this path together with `Path::makeRelative()` to shorten the stored paths: + +```php +$bp = '/var/www/vhosts/project/httpdocs'; + +return array( + $bp.'/config/config.yml', + $bp.'/config/routing.yml', + $bp.'/config/services.yml', + $bp.'/images/banana.gif', + $bp.'/uploads/images/nicer-banana.gif', +); +``` + +`getLongestCommonBasePath()` always returns canonical paths. + +Use `Path::isBasePath()` to test whether a path is a base path of another path: + +```php +Path::isBasePath("/var/www", "/var/www/project"); +// => true + +Path::isBasePath("/var/www", "/var/www/project/.."); +// => true + +Path::isBasePath("/var/www", "/var/www/project/../.."); +// => false +``` + +Finding Directories/Root Directories +------------------------------------ + +PHP offers the function `dirname()` to obtain the directory path of a file path. +This method has a few quirks: + +* `dirname()` does not accept backslashes on UNIX +* `dirname("C:/Programs")` returns "C:", not "C:/" +* `dirname("C:/")` returns ".", not "C:/" +* `dirname("C:")` returns ".", not "C:/" +* `dirname("Programs")` returns ".", not "" +* `dirname()` does not canonicalize the result + +`Path::getDirectory()` fixes these shortcomings: + +```php +echo Path::getDirectory("C:\Programs"); +// => C:/ +``` + +Additionally, you can use `Path::getRoot()` to obtain the root of a path: + +```php +echo Path::getRoot("/etc/apache2/sites-available"); +// => / + +echo Path::getRoot("C:\Programs\Apache\Config"); +// => C:/ +``` + diff --git a/vendor/webmozart/path-util/phpunit.xml.dist b/vendor/webmozart/path-util/phpunit.xml.dist new file mode 100644 index 00000000..68cf2d33 --- /dev/null +++ b/vendor/webmozart/path-util/phpunit.xml.dist @@ -0,0 +1,16 @@ + + + + + + ./tests/ + + + + + + + ./src/ + + + diff --git a/vendor/webmozart/path-util/src/Path.php b/vendor/webmozart/path-util/src/Path.php new file mode 100644 index 00000000..2f4a1779 --- /dev/null +++ b/vendor/webmozart/path-util/src/Path.php @@ -0,0 +1,1008 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Webmozart\PathUtil; + +use InvalidArgumentException; +use RuntimeException; +use Webmozart\Assert\Assert; + +/** + * Contains utility methods for handling path strings. + * + * The methods in this class are able to deal with both UNIX and Windows paths + * with both forward and backward slashes. All methods return normalized parts + * containing only forward slashes and no excess "." and ".." segments. + * + * @since 1.0 + * + * @author Bernhard Schussek + * @author Thomas Schulz + */ +final class Path +{ + /** + * The number of buffer entries that triggers a cleanup operation. + */ + const CLEANUP_THRESHOLD = 1250; + + /** + * The buffer size after the cleanup operation. + */ + const CLEANUP_SIZE = 1000; + + /** + * Buffers input/output of {@link canonicalize()}. + * + * @var array + */ + private static $buffer = array(); + + /** + * The size of the buffer. + * + * @var int + */ + private static $bufferSize = 0; + + /** + * Canonicalizes the given path. + * + * During normalization, all slashes are replaced by forward slashes ("/"). + * Furthermore, all "." and ".." segments are removed as far as possible. + * ".." segments at the beginning of relative paths are not removed. + * + * ```php + * echo Path::canonicalize("\webmozart\puli\..\css\style.css"); + * // => /webmozart/css/style.css + * + * echo Path::canonicalize("../css/./style.css"); + * // => ../css/style.css + * ``` + * + * This method is able to deal with both UNIX and Windows paths. + * + * @param string $path A path string. + * + * @return string The canonical path. + * + * @since 1.0 Added method. + * @since 2.0 Method now fails if $path is not a string. + * @since 2.1 Added support for `~`. + */ + public static function canonicalize($path) + { + if ('' === $path) { + return ''; + } + + Assert::string($path, 'The path must be a string. Got: %s'); + + // This method is called by many other methods in this class. Buffer + // the canonicalized paths to make up for the severe performance + // decrease. + if (isset(self::$buffer[$path])) { + return self::$buffer[$path]; + } + + // Replace "~" with user's home directory. + if ('~' === $path[0]) { + $path = static::getHomeDirectory().substr($path, 1); + } + + $path = str_replace('\\', '/', $path); + + list($root, $pathWithoutRoot) = self::split($path); + + $parts = explode('/', $pathWithoutRoot); + $canonicalParts = array(); + + // Collapse "." and "..", if possible + foreach ($parts as $part) { + if ('.' === $part || '' === $part) { + continue; + } + + // Collapse ".." with the previous part, if one exists + // Don't collapse ".." if the previous part is also ".." + if ('..' === $part && count($canonicalParts) > 0 + && '..' !== $canonicalParts[count($canonicalParts) - 1]) { + array_pop($canonicalParts); + + continue; + } + + // Only add ".." prefixes for relative paths + if ('..' !== $part || '' === $root) { + $canonicalParts[] = $part; + } + } + + // Add the root directory again + self::$buffer[$path] = $canonicalPath = $root.implode('/', $canonicalParts); + ++self::$bufferSize; + + // Clean up regularly to prevent memory leaks + if (self::$bufferSize > self::CLEANUP_THRESHOLD) { + self::$buffer = array_slice(self::$buffer, -self::CLEANUP_SIZE, null, true); + self::$bufferSize = self::CLEANUP_SIZE; + } + + return $canonicalPath; + } + + /** + * Normalizes the given path. + * + * During normalization, all slashes are replaced by forward slashes ("/"). + * Contrary to {@link canonicalize()}, this method does not remove invalid + * or dot path segments. Consequently, it is much more efficient and should + * be used whenever the given path is known to be a valid, absolute system + * path. + * + * This method is able to deal with both UNIX and Windows paths. + * + * @param string $path A path string. + * + * @return string The normalized path. + * + * @since 2.2 Added method. + */ + public static function normalize($path) + { + Assert::string($path, 'The path must be a string. Got: %s'); + + return str_replace('\\', '/', $path); + } + + /** + * Returns the directory part of the path. + * + * This method is similar to PHP's dirname(), but handles various cases + * where dirname() returns a weird result: + * + * - dirname() does not accept backslashes on UNIX + * - dirname("C:/webmozart") returns "C:", not "C:/" + * - dirname("C:/") returns ".", not "C:/" + * - dirname("C:") returns ".", not "C:/" + * - dirname("webmozart") returns ".", not "" + * - dirname() does not canonicalize the result + * + * This method fixes these shortcomings and behaves like dirname() + * otherwise. + * + * The result is a canonical path. + * + * @param string $path A path string. + * + * @return string The canonical directory part. Returns the root directory + * if the root directory is passed. Returns an empty string + * if a relative path is passed that contains no slashes. + * Returns an empty string if an empty string is passed. + * + * @since 1.0 Added method. + * @since 2.0 Method now fails if $path is not a string. + */ + public static function getDirectory($path) + { + if ('' === $path) { + return ''; + } + + $path = static::canonicalize($path); + + // Maintain scheme + if (false !== ($pos = strpos($path, '://'))) { + $scheme = substr($path, 0, $pos + 3); + $path = substr($path, $pos + 3); + } else { + $scheme = ''; + } + + if (false !== ($pos = strrpos($path, '/'))) { + // Directory equals root directory "/" + if (0 === $pos) { + return $scheme.'/'; + } + + // Directory equals Windows root "C:/" + if (2 === $pos && ctype_alpha($path[0]) && ':' === $path[1]) { + return $scheme.substr($path, 0, 3); + } + + return $scheme.substr($path, 0, $pos); + } + + return ''; + } + + /** + * Returns canonical path of the user's home directory. + * + * Supported operating systems: + * + * - UNIX + * - Windows8 and upper + * + * If your operation system or environment isn't supported, an exception is thrown. + * + * The result is a canonical path. + * + * @return string The canonical home directory + * + * @throws RuntimeException If your operation system or environment isn't supported + * + * @since 2.1 Added method. + */ + public static function getHomeDirectory() + { + // For UNIX support + if (getenv('HOME')) { + return static::canonicalize(getenv('HOME')); + } + + // For >= Windows8 support + if (getenv('HOMEDRIVE') && getenv('HOMEPATH')) { + return static::canonicalize(getenv('HOMEDRIVE').getenv('HOMEPATH')); + } + + throw new RuntimeException("Your environment or operation system isn't supported"); + } + + /** + * Returns the root directory of a path. + * + * The result is a canonical path. + * + * @param string $path A path string. + * + * @return string The canonical root directory. Returns an empty string if + * the given path is relative or empty. + * + * @since 1.0 Added method. + * @since 2.0 Method now fails if $path is not a string. + */ + public static function getRoot($path) + { + if ('' === $path) { + return ''; + } + + Assert::string($path, 'The path must be a string. Got: %s'); + + // Maintain scheme + if (false !== ($pos = strpos($path, '://'))) { + $scheme = substr($path, 0, $pos + 3); + $path = substr($path, $pos + 3); + } else { + $scheme = ''; + } + + // UNIX root "/" or "\" (Windows style) + if ('/' === $path[0] || '\\' === $path[0]) { + return $scheme.'/'; + } + + $length = strlen($path); + + // Windows root + if ($length > 1 && ctype_alpha($path[0]) && ':' === $path[1]) { + // Special case: "C:" + if (2 === $length) { + return $scheme.$path.'/'; + } + + // Normal case: "C:/ or "C:\" + if ('/' === $path[2] || '\\' === $path[2]) { + return $scheme.$path[0].$path[1].'/'; + } + } + + return ''; + } + + /** + * Returns the file name from a file path. + * + * @param string $path The path string. + * + * @return string The file name. + * + * @since 1.1 Added method. + * @since 2.0 Method now fails if $path is not a string. + */ + public static function getFilename($path) + { + if ('' === $path) { + return ''; + } + + Assert::string($path, 'The path must be a string. Got: %s'); + + return basename($path); + } + + /** + * Returns the file name without the extension from a file path. + * + * @param string $path The path string. + * @param string|null $extension If specified, only that extension is cut + * off (may contain leading dot). + * + * @return string The file name without extension. + * + * @since 1.1 Added method. + * @since 2.0 Method now fails if $path or $extension have invalid types. + */ + public static function getFilenameWithoutExtension($path, $extension = null) + { + if ('' === $path) { + return ''; + } + + Assert::string($path, 'The path must be a string. Got: %s'); + Assert::nullOrString($extension, 'The extension must be a string or null. Got: %s'); + + if (null !== $extension) { + // remove extension and trailing dot + return rtrim(basename($path, $extension), '.'); + } + + return pathinfo($path, PATHINFO_FILENAME); + } + + /** + * Returns the extension from a file path. + * + * @param string $path The path string. + * @param bool $forceLowerCase Forces the extension to be lower-case + * (requires mbstring extension for correct + * multi-byte character handling in extension). + * + * @return string The extension of the file path (without leading dot). + * + * @since 1.1 Added method. + * @since 2.0 Method now fails if $path is not a string. + */ + public static function getExtension($path, $forceLowerCase = false) + { + if ('' === $path) { + return ''; + } + + Assert::string($path, 'The path must be a string. Got: %s'); + + $extension = pathinfo($path, PATHINFO_EXTENSION); + + if ($forceLowerCase) { + $extension = self::toLower($extension); + } + + return $extension; + } + + /** + * Returns whether the path has an extension. + * + * @param string $path The path string. + * @param string|array|null $extensions If null or not provided, checks if + * an extension exists, otherwise + * checks for the specified extension + * or array of extensions (with or + * without leading dot). + * @param bool $ignoreCase Whether to ignore case-sensitivity + * (requires mbstring extension for + * correct multi-byte character + * handling in the extension). + * + * @return bool Returns `true` if the path has an (or the specified) + * extension and `false` otherwise. + * + * @since 1.1 Added method. + * @since 2.0 Method now fails if $path or $extensions have invalid types. + */ + public static function hasExtension($path, $extensions = null, $ignoreCase = false) + { + if ('' === $path) { + return false; + } + + $extensions = is_object($extensions) ? array($extensions) : (array) $extensions; + + Assert::allString($extensions, 'The extensions must be strings. Got: %s'); + + $actualExtension = self::getExtension($path, $ignoreCase); + + // Only check if path has any extension + if (empty($extensions)) { + return '' !== $actualExtension; + } + + foreach ($extensions as $key => $extension) { + if ($ignoreCase) { + $extension = self::toLower($extension); + } + + // remove leading '.' in extensions array + $extensions[$key] = ltrim($extension, '.'); + } + + return in_array($actualExtension, $extensions); + } + + /** + * Changes the extension of a path string. + * + * @param string $path The path string with filename.ext to change. + * @param string $extension New extension (with or without leading dot). + * + * @return string The path string with new file extension. + * + * @since 1.1 Added method. + * @since 2.0 Method now fails if $path or $extension is not a string. + */ + public static function changeExtension($path, $extension) + { + if ('' === $path) { + return ''; + } + + Assert::string($extension, 'The extension must be a string. Got: %s'); + + $actualExtension = self::getExtension($path); + $extension = ltrim($extension, '.'); + + // No extension for paths + if ('/' === substr($path, -1)) { + return $path; + } + + // No actual extension in path + if (empty($actualExtension)) { + return $path.('.' === substr($path, -1) ? '' : '.').$extension; + } + + return substr($path, 0, -strlen($actualExtension)).$extension; + } + + /** + * Returns whether a path is absolute. + * + * @param string $path A path string. + * + * @return bool Returns true if the path is absolute, false if it is + * relative or empty. + * + * @since 1.0 Added method. + * @since 2.0 Method now fails if $path is not a string. + */ + public static function isAbsolute($path) + { + if ('' === $path) { + return false; + } + + Assert::string($path, 'The path must be a string. Got: %s'); + + // Strip scheme + if (false !== ($pos = strpos($path, '://'))) { + $path = substr($path, $pos + 3); + } + + // UNIX root "/" or "\" (Windows style) + if ('/' === $path[0] || '\\' === $path[0]) { + return true; + } + + // Windows root + if (strlen($path) > 1 && ctype_alpha($path[0]) && ':' === $path[1]) { + // Special case: "C:" + if (2 === strlen($path)) { + return true; + } + + // Normal case: "C:/ or "C:\" + if ('/' === $path[2] || '\\' === $path[2]) { + return true; + } + } + + return false; + } + + /** + * Returns whether a path is relative. + * + * @param string $path A path string. + * + * @return bool Returns true if the path is relative or empty, false if + * it is absolute. + * + * @since 1.0 Added method. + * @since 2.0 Method now fails if $path is not a string. + */ + public static function isRelative($path) + { + return !static::isAbsolute($path); + } + + /** + * Turns a relative path into an absolute path. + * + * Usually, the relative path is appended to the given base path. Dot + * segments ("." and "..") are removed/collapsed and all slashes turned + * into forward slashes. + * + * ```php + * echo Path::makeAbsolute("../style.css", "/webmozart/puli/css"); + * // => /webmozart/puli/style.css + * ``` + * + * If an absolute path is passed, that path is returned unless its root + * directory is different than the one of the base path. In that case, an + * exception is thrown. + * + * ```php + * Path::makeAbsolute("/style.css", "/webmozart/puli/css"); + * // => /style.css + * + * Path::makeAbsolute("C:/style.css", "C:/webmozart/puli/css"); + * // => C:/style.css + * + * Path::makeAbsolute("C:/style.css", "/webmozart/puli/css"); + * // InvalidArgumentException + * ``` + * + * If the base path is not an absolute path, an exception is thrown. + * + * The result is a canonical path. + * + * @param string $path A path to make absolute. + * @param string $basePath An absolute base path. + * + * @return string An absolute path in canonical form. + * + * @throws InvalidArgumentException If the base path is not absolute or if + * the given path is an absolute path with + * a different root than the base path. + * + * @since 1.0 Added method. + * @since 2.0 Method now fails if $path or $basePath is not a string. + * @since 2.2.2 Method does not fail anymore of $path and $basePath are + * absolute, but on different partitions. + */ + public static function makeAbsolute($path, $basePath) + { + Assert::stringNotEmpty($basePath, 'The base path must be a non-empty string. Got: %s'); + + if (!static::isAbsolute($basePath)) { + throw new InvalidArgumentException(sprintf( + 'The base path "%s" is not an absolute path.', + $basePath + )); + } + + if (static::isAbsolute($path)) { + return static::canonicalize($path); + } + + if (false !== ($pos = strpos($basePath, '://'))) { + $scheme = substr($basePath, 0, $pos + 3); + $basePath = substr($basePath, $pos + 3); + } else { + $scheme = ''; + } + + return $scheme.self::canonicalize(rtrim($basePath, '/\\').'/'.$path); + } + + /** + * Turns a path into a relative path. + * + * The relative path is created relative to the given base path: + * + * ```php + * echo Path::makeRelative("/webmozart/style.css", "/webmozart/puli"); + * // => ../style.css + * ``` + * + * If a relative path is passed and the base path is absolute, the relative + * path is returned unchanged: + * + * ```php + * Path::makeRelative("style.css", "/webmozart/puli/css"); + * // => style.css + * ``` + * + * If both paths are relative, the relative path is created with the + * assumption that both paths are relative to the same directory: + * + * ```php + * Path::makeRelative("style.css", "webmozart/puli/css"); + * // => ../../../style.css + * ``` + * + * If both paths are absolute, their root directory must be the same, + * otherwise an exception is thrown: + * + * ```php + * Path::makeRelative("C:/webmozart/style.css", "/webmozart/puli"); + * // InvalidArgumentException + * ``` + * + * If the passed path is absolute, but the base path is not, an exception + * is thrown as well: + * + * ```php + * Path::makeRelative("/webmozart/style.css", "webmozart/puli"); + * // InvalidArgumentException + * ``` + * + * If the base path is not an absolute path, an exception is thrown. + * + * The result is a canonical path. + * + * @param string $path A path to make relative. + * @param string $basePath A base path. + * + * @return string A relative path in canonical form. + * + * @throws InvalidArgumentException If the base path is not absolute or if + * the given path has a different root + * than the base path. + * + * @since 1.0 Added method. + * @since 2.0 Method now fails if $path or $basePath is not a string. + */ + public static function makeRelative($path, $basePath) + { + Assert::string($basePath, 'The base path must be a string. Got: %s'); + + $path = static::canonicalize($path); + $basePath = static::canonicalize($basePath); + + list($root, $relativePath) = self::split($path); + list($baseRoot, $relativeBasePath) = self::split($basePath); + + // If the base path is given as absolute path and the path is already + // relative, consider it to be relative to the given absolute path + // already + if ('' === $root && '' !== $baseRoot) { + // If base path is already in its root + if ('' === $relativeBasePath) { + $relativePath = ltrim($relativePath, './\\'); + } + + return $relativePath; + } + + // If the passed path is absolute, but the base path is not, we + // cannot generate a relative path + if ('' !== $root && '' === $baseRoot) { + throw new InvalidArgumentException(sprintf( + 'The absolute path "%s" cannot be made relative to the '. + 'relative path "%s". You should provide an absolute base '. + 'path instead.', + $path, + $basePath + )); + } + + // Fail if the roots of the two paths are different + if ($baseRoot && $root !== $baseRoot) { + throw new InvalidArgumentException(sprintf( + 'The path "%s" cannot be made relative to "%s", because they '. + 'have different roots ("%s" and "%s").', + $path, + $basePath, + $root, + $baseRoot + )); + } + + if ('' === $relativeBasePath) { + return $relativePath; + } + + // Build a "../../" prefix with as many "../" parts as necessary + $parts = explode('/', $relativePath); + $baseParts = explode('/', $relativeBasePath); + $dotDotPrefix = ''; + + // Once we found a non-matching part in the prefix, we need to add + // "../" parts for all remaining parts + $match = true; + + foreach ($baseParts as $i => $basePart) { + if ($match && isset($parts[$i]) && $basePart === $parts[$i]) { + unset($parts[$i]); + + continue; + } + + $match = false; + $dotDotPrefix .= '../'; + } + + return rtrim($dotDotPrefix.implode('/', $parts), '/'); + } + + /** + * Returns whether the given path is on the local filesystem. + * + * @param string $path A path string. + * + * @return bool Returns true if the path is local, false for a URL. + * + * @since 1.0 Added method. + * @since 2.0 Method now fails if $path is not a string. + */ + public static function isLocal($path) + { + Assert::string($path, 'The path must be a string. Got: %s'); + + return '' !== $path && false === strpos($path, '://'); + } + + /** + * Returns the longest common base path of a set of paths. + * + * Dot segments ("." and "..") are removed/collapsed and all slashes turned + * into forward slashes. + * + * ```php + * $basePath = Path::getLongestCommonBasePath(array( + * '/webmozart/css/style.css', + * '/webmozart/css/..' + * )); + * // => /webmozart + * ``` + * + * The root is returned if no common base path can be found: + * + * ```php + * $basePath = Path::getLongestCommonBasePath(array( + * '/webmozart/css/style.css', + * '/puli/css/..' + * )); + * // => / + * ``` + * + * If the paths are located on different Windows partitions, `null` is + * returned. + * + * ```php + * $basePath = Path::getLongestCommonBasePath(array( + * 'C:/webmozart/css/style.css', + * 'D:/webmozart/css/..' + * )); + * // => null + * ``` + * + * @param array $paths A list of paths. + * + * @return string|null The longest common base path in canonical form or + * `null` if the paths are on different Windows + * partitions. + * + * @since 1.0 Added method. + * @since 2.0 Method now fails if $paths are not strings. + */ + public static function getLongestCommonBasePath(array $paths) + { + Assert::allString($paths, 'The paths must be strings. Got: %s'); + + list($bpRoot, $basePath) = self::split(self::canonicalize(reset($paths))); + + for (next($paths); null !== key($paths) && '' !== $basePath; next($paths)) { + list($root, $path) = self::split(self::canonicalize(current($paths))); + + // If we deal with different roots (e.g. C:/ vs. D:/), it's time + // to quit + if ($root !== $bpRoot) { + return null; + } + + // Make the base path shorter until it fits into path + while (true) { + if ('.' === $basePath) { + // No more base paths + $basePath = ''; + + // Next path + continue 2; + } + + // Prevent false positives for common prefixes + // see isBasePath() + if (0 === strpos($path.'/', $basePath.'/')) { + // Next path + continue 2; + } + + $basePath = dirname($basePath); + } + } + + return $bpRoot.$basePath; + } + + /** + * Joins two or more path strings. + * + * The result is a canonical path. + * + * @param string[]|string $paths Path parts as parameters or array. + * + * @return string The joint path. + * + * @since 2.0 Added method. + */ + public static function join($paths) + { + if (!is_array($paths)) { + $paths = func_get_args(); + } + + Assert::allString($paths, 'The paths must be strings. Got: %s'); + + $finalPath = null; + $wasScheme = false; + + foreach ($paths as $path) { + $path = (string) $path; + + if ('' === $path) { + continue; + } + + if (null === $finalPath) { + // For first part we keep slashes, like '/top', 'C:\' or 'phar://' + $finalPath = $path; + $wasScheme = (strpos($path, '://') !== false); + continue; + } + + // Only add slash if previous part didn't end with '/' or '\' + if (!in_array(substr($finalPath, -1), array('/', '\\'))) { + $finalPath .= '/'; + } + + // If first part included a scheme like 'phar://' we allow current part to start with '/', otherwise trim + $finalPath .= $wasScheme ? $path : ltrim($path, '/'); + $wasScheme = false; + } + + if (null === $finalPath) { + return ''; + } + + return self::canonicalize($finalPath); + } + + /** + * Returns whether a path is a base path of another path. + * + * Dot segments ("." and "..") are removed/collapsed and all slashes turned + * into forward slashes. + * + * ```php + * Path::isBasePath('/webmozart', '/webmozart/css'); + * // => true + * + * Path::isBasePath('/webmozart', '/webmozart'); + * // => true + * + * Path::isBasePath('/webmozart', '/webmozart/..'); + * // => false + * + * Path::isBasePath('/webmozart', '/puli'); + * // => false + * ``` + * + * @param string $basePath The base path to test. + * @param string $ofPath The other path. + * + * @return bool Whether the base path is a base path of the other path. + * + * @since 1.0 Added method. + * @since 2.0 Method now fails if $basePath or $ofPath is not a string. + */ + public static function isBasePath($basePath, $ofPath) + { + Assert::string($basePath, 'The base path must be a string. Got: %s'); + + $basePath = self::canonicalize($basePath); + $ofPath = self::canonicalize($ofPath); + + // Append slashes to prevent false positives when two paths have + // a common prefix, for example /base/foo and /base/foobar. + // Don't append a slash for the root "/", because then that root + // won't be discovered as common prefix ("//" is not a prefix of + // "/foobar/"). + return 0 === strpos($ofPath.'/', rtrim($basePath, '/').'/'); + } + + /** + * Splits a part into its root directory and the remainder. + * + * If the path has no root directory, an empty root directory will be + * returned. + * + * If the root directory is a Windows style partition, the resulting root + * will always contain a trailing slash. + * + * list ($root, $path) = Path::split("C:/webmozart") + * // => array("C:/", "webmozart") + * + * list ($root, $path) = Path::split("C:") + * // => array("C:/", "") + * + * @param string $path The canonical path to split. + * + * @return string[] An array with the root directory and the remaining + * relative path. + */ + private static function split($path) + { + if ('' === $path) { + return array('', ''); + } + + // Remember scheme as part of the root, if any + if (false !== ($pos = strpos($path, '://'))) { + $root = substr($path, 0, $pos + 3); + $path = substr($path, $pos + 3); + } else { + $root = ''; + } + + $length = strlen($path); + + // Remove and remember root directory + if ('/' === $path[0]) { + $root .= '/'; + $path = $length > 1 ? substr($path, 1) : ''; + } elseif ($length > 1 && ctype_alpha($path[0]) && ':' === $path[1]) { + if (2 === $length) { + // Windows special case: "C:" + $root .= $path.'/'; + $path = ''; + } elseif ('/' === $path[2]) { + // Windows normal case: "C:/".. + $root .= substr($path, 0, 3); + $path = $length > 3 ? substr($path, 3) : ''; + } + } + + return array($root, $path); + } + + /** + * Converts string to lower-case (multi-byte safe if mbstring is installed). + * + * @param string $str The string + * + * @return string Lower case string + */ + private static function toLower($str) + { + if (function_exists('mb_strtolower')) { + return mb_strtolower($str, mb_detect_encoding($str)); + } + + return strtolower($str); + } + + private function __construct() + { + } +} diff --git a/vendor/webmozart/path-util/src/Url.php b/vendor/webmozart/path-util/src/Url.php new file mode 100644 index 00000000..834e7213 --- /dev/null +++ b/vendor/webmozart/path-util/src/Url.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Webmozart\PathUtil; + +use InvalidArgumentException; +use Webmozart\Assert\Assert; + +/** + * Contains utility methods for handling URL strings. + * + * The methods in this class are able to deal with URLs. + * + * @since 2.3 + * + * @author Bernhard Schussek + * @author Claudio Zizza + */ +final class Url +{ + /** + * Turns a URL into a relative path. + * + * The result is a canonical path. This class is using functionality of Path class. + * + * @see Path + * + * @param string $url A URL to make relative. + * @param string $baseUrl A base URL. + * + * @return string + * + * @throws InvalidArgumentException If the URL and base URL does + * not match. + */ + public static function makeRelative($url, $baseUrl) + { + Assert::string($url, 'The URL must be a string. Got: %s'); + Assert::string($baseUrl, 'The base URL must be a string. Got: %s'); + Assert::contains($baseUrl, '://', '%s is not an absolute Url.'); + + list($baseHost, $basePath) = self::split($baseUrl); + + if (false === strpos($url, '://')) { + if (0 === strpos($url, '/')) { + $host = $baseHost; + } else { + $host = ''; + } + $path = $url; + } else { + list($host, $path) = self::split($url); + } + + if ('' !== $host && $host !== $baseHost) { + throw new InvalidArgumentException(sprintf( + 'The URL "%s" cannot be made relative to "%s" since their host names are different.', + $host, + $baseHost + )); + } + + return Path::makeRelative($path, $basePath); + } + + /** + * Splits a URL into its host and the path. + * + * ```php + * list ($root, $path) = Path::split("http://example.com/webmozart") + * // => array("http://example.com", "/webmozart") + * + * list ($root, $path) = Path::split("http://example.com") + * // => array("http://example.com", "") + * ``` + * + * @param string $url The URL to split. + * + * @return string[] An array with the host and the path of the URL. + * + * @throws InvalidArgumentException If $url is not a URL. + */ + private static function split($url) + { + $pos = strpos($url, '://'); + $scheme = substr($url, 0, $pos + 3); + $url = substr($url, $pos + 3); + + if (false !== ($pos = strpos($url, '/'))) { + $host = substr($url, 0, $pos); + $url = substr($url, $pos); + } else { + // No path, only host + $host = $url; + $url = '/'; + } + + // At this point, we have $scheme, $host and $path + $root = $scheme.$host; + + return array($root, $url); + } +} diff --git a/vendor/webmozart/path-util/tests/PathTest.php b/vendor/webmozart/path-util/tests/PathTest.php new file mode 100644 index 00000000..cc88b97a --- /dev/null +++ b/vendor/webmozart/path-util/tests/PathTest.php @@ -0,0 +1,1340 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Webmozart\PathUtil\Tests; + +use Webmozart\PathUtil\Path; + +/** + * @since 1.0 + * + * @author Bernhard Schussek + * @author Thomas Schulz + */ +class PathTest extends \PHPUnit_Framework_TestCase +{ + protected $storedEnv = array(); + + public function setUp() + { + $this->storedEnv['HOME'] = getenv('HOME'); + $this->storedEnv['HOMEDRIVE'] = getenv('HOMEDRIVE'); + $this->storedEnv['HOMEPATH'] = getenv('HOMEPATH'); + + putenv('HOME=/home/webmozart'); + putenv('HOMEDRIVE='); + putenv('HOMEPATH='); + } + + public function tearDown() + { + putenv('HOME='.$this->storedEnv['HOME']); + putenv('HOMEDRIVE='.$this->storedEnv['HOMEDRIVE']); + putenv('HOMEPATH='.$this->storedEnv['HOMEPATH']); + } + + public function provideCanonicalizationTests() + { + return array( + // relative paths (forward slash) + array('css/./style.css', 'css/style.css'), + array('css/../style.css', 'style.css'), + array('css/./../style.css', 'style.css'), + array('css/.././style.css', 'style.css'), + array('css/../../style.css', '../style.css'), + array('./css/style.css', 'css/style.css'), + array('../css/style.css', '../css/style.css'), + array('./../css/style.css', '../css/style.css'), + array('.././css/style.css', '../css/style.css'), + array('../../css/style.css', '../../css/style.css'), + array('', ''), + array('.', ''), + array('..', '..'), + array('./..', '..'), + array('../.', '..'), + array('../..', '../..'), + + // relative paths (backslash) + array('css\\.\\style.css', 'css/style.css'), + array('css\\..\\style.css', 'style.css'), + array('css\\.\\..\\style.css', 'style.css'), + array('css\\..\\.\\style.css', 'style.css'), + array('css\\..\\..\\style.css', '../style.css'), + array('.\\css\\style.css', 'css/style.css'), + array('..\\css\\style.css', '../css/style.css'), + array('.\\..\\css\\style.css', '../css/style.css'), + array('..\\.\\css\\style.css', '../css/style.css'), + array('..\\..\\css\\style.css', '../../css/style.css'), + + // absolute paths (forward slash, UNIX) + array('/css/style.css', '/css/style.css'), + array('/css/./style.css', '/css/style.css'), + array('/css/../style.css', '/style.css'), + array('/css/./../style.css', '/style.css'), + array('/css/.././style.css', '/style.css'), + array('/./css/style.css', '/css/style.css'), + array('/../css/style.css', '/css/style.css'), + array('/./../css/style.css', '/css/style.css'), + array('/.././css/style.css', '/css/style.css'), + array('/../../css/style.css', '/css/style.css'), + + // absolute paths (backslash, UNIX) + array('\\css\\style.css', '/css/style.css'), + array('\\css\\.\\style.css', '/css/style.css'), + array('\\css\\..\\style.css', '/style.css'), + array('\\css\\.\\..\\style.css', '/style.css'), + array('\\css\\..\\.\\style.css', '/style.css'), + array('\\.\\css\\style.css', '/css/style.css'), + array('\\..\\css\\style.css', '/css/style.css'), + array('\\.\\..\\css\\style.css', '/css/style.css'), + array('\\..\\.\\css\\style.css', '/css/style.css'), + array('\\..\\..\\css\\style.css', '/css/style.css'), + + // absolute paths (forward slash, Windows) + array('C:/css/style.css', 'C:/css/style.css'), + array('C:/css/./style.css', 'C:/css/style.css'), + array('C:/css/../style.css', 'C:/style.css'), + array('C:/css/./../style.css', 'C:/style.css'), + array('C:/css/.././style.css', 'C:/style.css'), + array('C:/./css/style.css', 'C:/css/style.css'), + array('C:/../css/style.css', 'C:/css/style.css'), + array('C:/./../css/style.css', 'C:/css/style.css'), + array('C:/.././css/style.css', 'C:/css/style.css'), + array('C:/../../css/style.css', 'C:/css/style.css'), + + // absolute paths (backslash, Windows) + array('C:\\css\\style.css', 'C:/css/style.css'), + array('C:\\css\\.\\style.css', 'C:/css/style.css'), + array('C:\\css\\..\\style.css', 'C:/style.css'), + array('C:\\css\\.\\..\\style.css', 'C:/style.css'), + array('C:\\css\\..\\.\\style.css', 'C:/style.css'), + array('C:\\.\\css\\style.css', 'C:/css/style.css'), + array('C:\\..\\css\\style.css', 'C:/css/style.css'), + array('C:\\.\\..\\css\\style.css', 'C:/css/style.css'), + array('C:\\..\\.\\css\\style.css', 'C:/css/style.css'), + array('C:\\..\\..\\css\\style.css', 'C:/css/style.css'), + + // Windows special case + array('C:', 'C:/'), + + // Don't change malformed path + array('C:css/style.css', 'C:css/style.css'), + + // absolute paths (stream, UNIX) + array('phar:///css/style.css', 'phar:///css/style.css'), + array('phar:///css/./style.css', 'phar:///css/style.css'), + array('phar:///css/../style.css', 'phar:///style.css'), + array('phar:///css/./../style.css', 'phar:///style.css'), + array('phar:///css/.././style.css', 'phar:///style.css'), + array('phar:///./css/style.css', 'phar:///css/style.css'), + array('phar:///../css/style.css', 'phar:///css/style.css'), + array('phar:///./../css/style.css', 'phar:///css/style.css'), + array('phar:///.././css/style.css', 'phar:///css/style.css'), + array('phar:///../../css/style.css', 'phar:///css/style.css'), + + // absolute paths (stream, Windows) + array('phar://C:/css/style.css', 'phar://C:/css/style.css'), + array('phar://C:/css/./style.css', 'phar://C:/css/style.css'), + array('phar://C:/css/../style.css', 'phar://C:/style.css'), + array('phar://C:/css/./../style.css', 'phar://C:/style.css'), + array('phar://C:/css/.././style.css', 'phar://C:/style.css'), + array('phar://C:/./css/style.css', 'phar://C:/css/style.css'), + array('phar://C:/../css/style.css', 'phar://C:/css/style.css'), + array('phar://C:/./../css/style.css', 'phar://C:/css/style.css'), + array('phar://C:/.././css/style.css', 'phar://C:/css/style.css'), + array('phar://C:/../../css/style.css', 'phar://C:/css/style.css'), + + // paths with "~" UNIX + array('~/css/style.css', '/home/webmozart/css/style.css'), + array('~/css/./style.css', '/home/webmozart/css/style.css'), + array('~/css/../style.css', '/home/webmozart/style.css'), + array('~/css/./../style.css', '/home/webmozart/style.css'), + array('~/css/.././style.css', '/home/webmozart/style.css'), + array('~/./css/style.css', '/home/webmozart/css/style.css'), + array('~/../css/style.css', '/home/css/style.css'), + array('~/./../css/style.css', '/home/css/style.css'), + array('~/.././css/style.css', '/home/css/style.css'), + array('~/../../css/style.css', '/css/style.css'), + ); + } + + /** + * @dataProvider provideCanonicalizationTests + */ + public function testCanonicalize($path, $canonicalized) + { + $this->assertSame($canonicalized, Path::canonicalize($path)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testCanonicalizeFailsIfInvalidPath() + { + Path::canonicalize(array()); + } + + public function provideGetDirectoryTests() + { + return array( + array('/webmozart/puli/style.css', '/webmozart/puli'), + array('/webmozart/puli', '/webmozart'), + array('/webmozart', '/'), + array('/', '/'), + array('', ''), + + array('\\webmozart\\puli\\style.css', '/webmozart/puli'), + array('\\webmozart\\puli', '/webmozart'), + array('\\webmozart', '/'), + array('\\', '/'), + + array('C:/webmozart/puli/style.css', 'C:/webmozart/puli'), + array('C:/webmozart/puli', 'C:/webmozart'), + array('C:/webmozart', 'C:/'), + array('C:/', 'C:/'), + array('C:', 'C:/'), + + array('C:\\webmozart\\puli\\style.css', 'C:/webmozart/puli'), + array('C:\\webmozart\\puli', 'C:/webmozart'), + array('C:\\webmozart', 'C:/'), + array('C:\\', 'C:/'), + + array('phar:///webmozart/puli/style.css', 'phar:///webmozart/puli'), + array('phar:///webmozart/puli', 'phar:///webmozart'), + array('phar:///webmozart', 'phar:///'), + array('phar:///', 'phar:///'), + + array('phar://C:/webmozart/puli/style.css', 'phar://C:/webmozart/puli'), + array('phar://C:/webmozart/puli', 'phar://C:/webmozart'), + array('phar://C:/webmozart', 'phar://C:/'), + array('phar://C:/', 'phar://C:/'), + + array('webmozart/puli/style.css', 'webmozart/puli'), + array('webmozart/puli', 'webmozart'), + array('webmozart', ''), + + array('webmozart\\puli\\style.css', 'webmozart/puli'), + array('webmozart\\puli', 'webmozart'), + array('webmozart', ''), + + array('/webmozart/./puli/style.css', '/webmozart/puli'), + array('/webmozart/../puli/style.css', '/puli'), + array('/webmozart/./../puli/style.css', '/puli'), + array('/webmozart/.././puli/style.css', '/puli'), + array('/webmozart/../../puli/style.css', '/puli'), + array('/.', '/'), + array('/..', '/'), + + array('C:webmozart', ''), + ); + } + + /** + * @dataProvider provideGetDirectoryTests + */ + public function testGetDirectory($path, $directory) + { + $this->assertSame($directory, Path::getDirectory($path)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testGetDirectoryFailsIfInvalidPath() + { + Path::getDirectory(array()); + } + + public function provideGetFilenameTests() + { + return array( + array('/webmozart/puli/style.css', 'style.css'), + array('/webmozart/puli/STYLE.CSS', 'STYLE.CSS'), + array('/webmozart/puli/style.css/', 'style.css'), + array('/webmozart/puli/', 'puli'), + array('/webmozart/puli', 'puli'), + array('/', ''), + array('', ''), + ); + } + + /** + * @dataProvider provideGetFilenameTests + */ + public function testGetFilename($path, $filename) + { + $this->assertSame($filename, Path::getFilename($path)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testGetFilenameFailsIfInvalidPath() + { + Path::getFilename(array()); + } + + public function provideGetFilenameWithoutExtensionTests() + { + return array( + array('/webmozart/puli/style.css.twig', null, 'style.css'), + array('/webmozart/puli/style.css.', null, 'style.css'), + array('/webmozart/puli/style.css', null, 'style'), + array('/webmozart/puli/.style.css', null, '.style'), + array('/webmozart/puli/', null, 'puli'), + array('/webmozart/puli', null, 'puli'), + array('/', null, ''), + array('', null, ''), + + array('/webmozart/puli/style.css', 'css', 'style'), + array('/webmozart/puli/style.css', '.css', 'style'), + array('/webmozart/puli/style.css', 'twig', 'style.css'), + array('/webmozart/puli/style.css', '.twig', 'style.css'), + array('/webmozart/puli/style.css', '', 'style.css'), + array('/webmozart/puli/style.css.', '', 'style.css'), + array('/webmozart/puli/style.css.', '.', 'style.css'), + array('/webmozart/puli/style.css.', '.css', 'style.css'), + array('/webmozart/puli/.style.css', 'css', '.style'), + array('/webmozart/puli/.style.css', '.css', '.style'), + ); + } + + /** + * @dataProvider provideGetFilenameWithoutExtensionTests + */ + public function testGetFilenameWithoutExtension($path, $extension, $filename) + { + $this->assertSame($filename, Path::getFilenameWithoutExtension($path, $extension)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testGetFilenameWithoutExtensionFailsIfInvalidPath() + { + Path::getFilenameWithoutExtension(array(), '.css'); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The extension must be a string or null. Got: array + */ + public function testGetFilenameWithoutExtensionFailsIfInvalidExtension() + { + Path::getFilenameWithoutExtension('/style.css', array()); + } + + public function provideGetExtensionTests() + { + $tests = array( + array('/webmozart/puli/style.css.twig', false, 'twig'), + array('/webmozart/puli/style.css', false, 'css'), + array('/webmozart/puli/style.css.', false, ''), + array('/webmozart/puli/', false, ''), + array('/webmozart/puli', false, ''), + array('/', false, ''), + array('', false, ''), + + array('/webmozart/puli/style.CSS', false, 'CSS'), + array('/webmozart/puli/style.CSS', true, 'css'), + array('/webmozart/puli/style.ÄÖÜ', false, 'ÄÖÜ'), + ); + + if (extension_loaded('mbstring')) { + // This can only be tested, when mbstring is installed + $tests[] = array('/webmozart/puli/style.ÄÖÜ', true, 'äöü'); + } + + return $tests; + } + + /** + * @dataProvider provideGetExtensionTests + */ + public function testGetExtension($path, $forceLowerCase, $extension) + { + $this->assertSame($extension, Path::getExtension($path, $forceLowerCase)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testGetExtensionFailsIfInvalidPath() + { + Path::getExtension(array()); + } + + public function provideHasExtensionTests() + { + $tests = array( + array(true, '/webmozart/puli/style.css.twig', null, false), + array(true, '/webmozart/puli/style.css', null, false), + array(false, '/webmozart/puli/style.css.', null, false), + array(false, '/webmozart/puli/', null, false), + array(false, '/webmozart/puli', null, false), + array(false, '/', null, false), + array(false, '', null, false), + + array(true, '/webmozart/puli/style.css.twig', 'twig', false), + array(false, '/webmozart/puli/style.css.twig', 'css', false), + array(true, '/webmozart/puli/style.css', 'css', false), + array(true, '/webmozart/puli/style.css', '.css', false), + array(true, '/webmozart/puli/style.css.', '', false), + array(false, '/webmozart/puli/', 'ext', false), + array(false, '/webmozart/puli', 'ext', false), + array(false, '/', 'ext', false), + array(false, '', 'ext', false), + + array(false, '/webmozart/puli/style.css', 'CSS', false), + array(true, '/webmozart/puli/style.css', 'CSS', true), + array(false, '/webmozart/puli/style.CSS', 'css', false), + array(true, '/webmozart/puli/style.CSS', 'css', true), + array(true, '/webmozart/puli/style.ÄÖÜ', 'ÄÖÜ', false), + + array(true, '/webmozart/puli/style.css', array('ext', 'css'), false), + array(true, '/webmozart/puli/style.css', array('.ext', '.css'), false), + array(true, '/webmozart/puli/style.css.', array('ext', ''), false), + array(false, '/webmozart/puli/style.css', array('foo', 'bar', ''), false), + array(false, '/webmozart/puli/style.css', array('.foo', '.bar', ''), false), + ); + + if (extension_loaded('mbstring')) { + // This can only be tested, when mbstring is installed + $tests[] = array(true, '/webmozart/puli/style.ÄÖÜ', 'äöü', true); + $tests[] = array(true, '/webmozart/puli/style.ÄÖÜ', array('äöü'), true); + } + + return $tests; + } + + /** + * @dataProvider provideHasExtensionTests + */ + public function testHasExtension($hasExtension, $path, $extension, $ignoreCase) + { + $this->assertSame($hasExtension, Path::hasExtension($path, $extension, $ignoreCase)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testHasExtensionFailsIfInvalidPath() + { + Path::hasExtension(array()); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The extensions must be strings. Got: stdClass + */ + public function testHasExtensionFailsIfInvalidExtension() + { + Path::hasExtension('/style.css', (object) array()); + } + + public function provideChangeExtensionTests() + { + return array( + array('/webmozart/puli/style.css.twig', 'html', '/webmozart/puli/style.css.html'), + array('/webmozart/puli/style.css', 'sass', '/webmozart/puli/style.sass'), + array('/webmozart/puli/style.css', '.sass', '/webmozart/puli/style.sass'), + array('/webmozart/puli/style.css', '', '/webmozart/puli/style.'), + array('/webmozart/puli/style.css.', 'twig', '/webmozart/puli/style.css.twig'), + array('/webmozart/puli/style.css.', '', '/webmozart/puli/style.css.'), + array('/webmozart/puli/style.css', 'äöü', '/webmozart/puli/style.äöü'), + array('/webmozart/puli/style.äöü', 'css', '/webmozart/puli/style.css'), + array('/webmozart/puli/', 'css', '/webmozart/puli/'), + array('/webmozart/puli', 'css', '/webmozart/puli.css'), + array('/', 'css', '/'), + array('', 'css', ''), + ); + } + + /** + * @dataProvider provideChangeExtensionTests + */ + public function testChangeExtension($path, $extension, $pathExpected) + { + static $call = 0; + $this->assertSame($pathExpected, Path::changeExtension($path, $extension)); + ++$call; + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testChangeExtensionFailsIfInvalidPath() + { + Path::changeExtension(array(), '.sass'); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The extension must be a string. Got: array + */ + public function testChangeExtensionFailsIfInvalidExtension() + { + Path::changeExtension('/style.css', array()); + } + + public function provideIsAbsolutePathTests() + { + return array( + array('/css/style.css', true), + array('/', true), + array('css/style.css', false), + array('', false), + + array('\\css\\style.css', true), + array('\\', true), + array('css\\style.css', false), + + array('C:/css/style.css', true), + array('D:/', true), + + array('E:\\css\\style.css', true), + array('F:\\', true), + + array('phar:///css/style.css', true), + array('phar:///', true), + + // Windows special case + array('C:', true), + + // Not considered absolute + array('C:css/style.css', false), + ); + } + + /** + * @dataProvider provideIsAbsolutePathTests + */ + public function testIsAbsolute($path, $isAbsolute) + { + $this->assertSame($isAbsolute, Path::isAbsolute($path)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testIsAbsoluteFailsIfInvalidPath() + { + Path::isAbsolute(array()); + } + + /** + * @dataProvider provideIsAbsolutePathTests + */ + public function testIsRelative($path, $isAbsolute) + { + $this->assertSame(!$isAbsolute, Path::isRelative($path)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testIsRelativeFailsIfInvalidPath() + { + Path::isRelative(array()); + } + + public function provideGetRootTests() + { + return array( + array('/css/style.css', '/'), + array('/', '/'), + array('css/style.css', ''), + array('', ''), + + array('\\css\\style.css', '/'), + array('\\', '/'), + array('css\\style.css', ''), + + array('C:/css/style.css', 'C:/'), + array('C:/', 'C:/'), + array('C:', 'C:/'), + + array('D:\\css\\style.css', 'D:/'), + array('D:\\', 'D:/'), + + array('phar:///css/style.css', 'phar:///'), + array('phar:///', 'phar:///'), + + array('phar://C:/css/style.css', 'phar://C:/'), + array('phar://C:/', 'phar://C:/'), + array('phar://C:', 'phar://C:/'), + ); + } + + /** + * @dataProvider provideGetRootTests + */ + public function testGetRoot($path, $root) + { + $this->assertSame($root, Path::getRoot($path)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testGetRootFailsIfInvalidPath() + { + Path::getRoot(array()); + } + + public function providePathTests() + { + return array( + // relative to absolute path + array('css/style.css', '/webmozart/puli', '/webmozart/puli/css/style.css'), + array('../css/style.css', '/webmozart/puli', '/webmozart/css/style.css'), + array('../../css/style.css', '/webmozart/puli', '/css/style.css'), + + // relative to root + array('css/style.css', '/', '/css/style.css'), + array('css/style.css', 'C:', 'C:/css/style.css'), + array('css/style.css', 'C:/', 'C:/css/style.css'), + + // same sub directories in different base directories + array('../../puli/css/style.css', '/webmozart/css', '/puli/css/style.css'), + + array('', '/webmozart/puli', '/webmozart/puli'), + array('..', '/webmozart/puli', '/webmozart'), + ); + } + + public function provideMakeAbsoluteTests() + { + return array_merge($this->providePathTests(), array( + // collapse dots + array('css/./style.css', '/webmozart/puli', '/webmozart/puli/css/style.css'), + array('css/../style.css', '/webmozart/puli', '/webmozart/puli/style.css'), + array('css/./../style.css', '/webmozart/puli', '/webmozart/puli/style.css'), + array('css/.././style.css', '/webmozart/puli', '/webmozart/puli/style.css'), + array('./css/style.css', '/webmozart/puli', '/webmozart/puli/css/style.css'), + + array('css\\.\\style.css', '\\webmozart\\puli', '/webmozart/puli/css/style.css'), + array('css\\..\\style.css', '\\webmozart\\puli', '/webmozart/puli/style.css'), + array('css\\.\\..\\style.css', '\\webmozart\\puli', '/webmozart/puli/style.css'), + array('css\\..\\.\\style.css', '\\webmozart\\puli', '/webmozart/puli/style.css'), + array('.\\css\\style.css', '\\webmozart\\puli', '/webmozart/puli/css/style.css'), + + // collapse dots on root + array('./css/style.css', '/', '/css/style.css'), + array('../css/style.css', '/', '/css/style.css'), + array('../css/./style.css', '/', '/css/style.css'), + array('../css/../style.css', '/', '/style.css'), + array('../css/./../style.css', '/', '/style.css'), + array('../css/.././style.css', '/', '/style.css'), + + array('.\\css\\style.css', '\\', '/css/style.css'), + array('..\\css\\style.css', '\\', '/css/style.css'), + array('..\\css\\.\\style.css', '\\', '/css/style.css'), + array('..\\css\\..\\style.css', '\\', '/style.css'), + array('..\\css\\.\\..\\style.css', '\\', '/style.css'), + array('..\\css\\..\\.\\style.css', '\\', '/style.css'), + + array('./css/style.css', 'C:/', 'C:/css/style.css'), + array('../css/style.css', 'C:/', 'C:/css/style.css'), + array('../css/./style.css', 'C:/', 'C:/css/style.css'), + array('../css/../style.css', 'C:/', 'C:/style.css'), + array('../css/./../style.css', 'C:/', 'C:/style.css'), + array('../css/.././style.css', 'C:/', 'C:/style.css'), + + array('.\\css\\style.css', 'C:\\', 'C:/css/style.css'), + array('..\\css\\style.css', 'C:\\', 'C:/css/style.css'), + array('..\\css\\.\\style.css', 'C:\\', 'C:/css/style.css'), + array('..\\css\\..\\style.css', 'C:\\', 'C:/style.css'), + array('..\\css\\.\\..\\style.css', 'C:\\', 'C:/style.css'), + array('..\\css\\..\\.\\style.css', 'C:\\', 'C:/style.css'), + + array('./css/style.css', 'phar:///', 'phar:///css/style.css'), + array('../css/style.css', 'phar:///', 'phar:///css/style.css'), + array('../css/./style.css', 'phar:///', 'phar:///css/style.css'), + array('../css/../style.css', 'phar:///', 'phar:///style.css'), + array('../css/./../style.css', 'phar:///', 'phar:///style.css'), + array('../css/.././style.css', 'phar:///', 'phar:///style.css'), + + array('./css/style.css', 'phar://C:/', 'phar://C:/css/style.css'), + array('../css/style.css', 'phar://C:/', 'phar://C:/css/style.css'), + array('../css/./style.css', 'phar://C:/', 'phar://C:/css/style.css'), + array('../css/../style.css', 'phar://C:/', 'phar://C:/style.css'), + array('../css/./../style.css', 'phar://C:/', 'phar://C:/style.css'), + array('../css/.././style.css', 'phar://C:/', 'phar://C:/style.css'), + + // absolute paths + array('/css/style.css', '/webmozart/puli', '/css/style.css'), + array('\\css\\style.css', '/webmozart/puli', '/css/style.css'), + array('C:/css/style.css', 'C:/webmozart/puli', 'C:/css/style.css'), + array('D:\\css\\style.css', 'D:/webmozart/puli', 'D:/css/style.css'), + )); + } + + /** + * @dataProvider provideMakeAbsoluteTests + */ + public function testMakeAbsolute($relativePath, $basePath, $absolutePath) + { + $this->assertSame($absolutePath, Path::makeAbsolute($relativePath, $basePath)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testMakeAbsoluteFailsIfInvalidPath() + { + Path::makeAbsolute(array(), '/webmozart/puli'); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The base path must be a non-empty string. Got: array + */ + public function testMakeAbsoluteFailsIfInvalidBasePath() + { + Path::makeAbsolute('css/style.css', array()); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The base path "webmozart/puli" is not an absolute path. + */ + public function testMakeAbsoluteFailsIfBasePathNotAbsolute() + { + Path::makeAbsolute('css/style.css', 'webmozart/puli'); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The base path must be a non-empty string. Got: "" + */ + public function testMakeAbsoluteFailsIfBasePathEmpty() + { + Path::makeAbsolute('css/style.css', ''); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The base path must be a non-empty string. Got: NULL + */ + public function testMakeAbsoluteFailsIfBasePathNull() + { + Path::makeAbsolute('css/style.css', null); + } + + public function provideAbsolutePathsWithDifferentRoots() + { + return array( + array('C:/css/style.css', '/webmozart/puli'), + array('C:/css/style.css', '\\webmozart\\puli'), + array('C:\\css\\style.css', '/webmozart/puli'), + array('C:\\css\\style.css', '\\webmozart\\puli'), + + array('/css/style.css', 'C:/webmozart/puli'), + array('/css/style.css', 'C:\\webmozart\\puli'), + array('\\css\\style.css', 'C:/webmozart/puli'), + array('\\css\\style.css', 'C:\\webmozart\\puli'), + + array('D:/css/style.css', 'C:/webmozart/puli'), + array('D:/css/style.css', 'C:\\webmozart\\puli'), + array('D:\\css\\style.css', 'C:/webmozart/puli'), + array('D:\\css\\style.css', 'C:\\webmozart\\puli'), + + array('phar:///css/style.css', '/webmozart/puli'), + array('/css/style.css', 'phar:///webmozart/puli'), + + array('phar://C:/css/style.css', 'C:/webmozart/puli'), + array('phar://C:/css/style.css', 'C:\\webmozart\\puli'), + array('phar://C:\\css\\style.css', 'C:/webmozart/puli'), + array('phar://C:\\css\\style.css', 'C:\\webmozart\\puli'), + ); + } + + /** + * @dataProvider provideAbsolutePathsWithDifferentRoots + */ + public function testMakeAbsoluteDoesNotFailIfDifferentRoot($basePath, $absolutePath) + { + // If a path in partition D: is passed, but $basePath is in partition + // C:, the path should be returned unchanged + $this->assertSame(Path::canonicalize($absolutePath), Path::makeAbsolute($absolutePath, $basePath)); + } + + public function provideMakeRelativeTests() + { + $paths = array_map(function (array $arguments) { + return array($arguments[2], $arguments[1], $arguments[0]); + }, $this->providePathTests()); + + return array_merge($paths, array( + array('/webmozart/puli/./css/style.css', '/webmozart/puli', 'css/style.css'), + array('/webmozart/puli/../css/style.css', '/webmozart/puli', '../css/style.css'), + array('/webmozart/puli/.././css/style.css', '/webmozart/puli', '../css/style.css'), + array('/webmozart/puli/./../css/style.css', '/webmozart/puli', '../css/style.css'), + array('/webmozart/puli/../../css/style.css', '/webmozart/puli', '../../css/style.css'), + array('/webmozart/puli/css/style.css', '/webmozart/./puli', 'css/style.css'), + array('/webmozart/puli/css/style.css', '/webmozart/../puli', '../webmozart/puli/css/style.css'), + array('/webmozart/puli/css/style.css', '/webmozart/./../puli', '../webmozart/puli/css/style.css'), + array('/webmozart/puli/css/style.css', '/webmozart/.././puli', '../webmozart/puli/css/style.css'), + array('/webmozart/puli/css/style.css', '/webmozart/../../puli', '../webmozart/puli/css/style.css'), + + // first argument shorter than second + array('/css', '/webmozart/puli', '../../css'), + + // second argument shorter than first + array('/webmozart/puli', '/css', '../webmozart/puli'), + + array('\\webmozart\\puli\\css\\style.css', '\\webmozart\\puli', 'css/style.css'), + array('\\webmozart\\css\\style.css', '\\webmozart\\puli', '../css/style.css'), + array('\\css\\style.css', '\\webmozart\\puli', '../../css/style.css'), + + array('C:/webmozart/puli/css/style.css', 'C:/webmozart/puli', 'css/style.css'), + array('C:/webmozart/css/style.css', 'C:/webmozart/puli', '../css/style.css'), + array('C:/css/style.css', 'C:/webmozart/puli', '../../css/style.css'), + + array('C:\\webmozart\\puli\\css\\style.css', 'C:\\webmozart\\puli', 'css/style.css'), + array('C:\\webmozart\\css\\style.css', 'C:\\webmozart\\puli', '../css/style.css'), + array('C:\\css\\style.css', 'C:\\webmozart\\puli', '../../css/style.css'), + + array('phar:///webmozart/puli/css/style.css', 'phar:///webmozart/puli', 'css/style.css'), + array('phar:///webmozart/css/style.css', 'phar:///webmozart/puli', '../css/style.css'), + array('phar:///css/style.css', 'phar:///webmozart/puli', '../../css/style.css'), + + array('phar://C:/webmozart/puli/css/style.css', 'phar://C:/webmozart/puli', 'css/style.css'), + array('phar://C:/webmozart/css/style.css', 'phar://C:/webmozart/puli', '../css/style.css'), + array('phar://C:/css/style.css', 'phar://C:/webmozart/puli', '../../css/style.css'), + + // already relative + already in root basepath + array('../style.css', '/', 'style.css'), + array('./style.css', '/', 'style.css'), + array('../../style.css', '/', 'style.css'), + array('..\\style.css', 'C:\\', 'style.css'), + array('.\\style.css', 'C:\\', 'style.css'), + array('..\\..\\style.css', 'C:\\', 'style.css'), + array('../style.css', 'C:/', 'style.css'), + array('./style.css', 'C:/', 'style.css'), + array('../../style.css', 'C:/', 'style.css'), + array('..\\style.css', '\\', 'style.css'), + array('.\\style.css', '\\', 'style.css'), + array('..\\..\\style.css', '\\', 'style.css'), + array('../style.css', 'phar:///', 'style.css'), + array('./style.css', 'phar:///', 'style.css'), + array('../../style.css', 'phar:///', 'style.css'), + array('..\\style.css', 'phar://C:\\', 'style.css'), + array('.\\style.css', 'phar://C:\\', 'style.css'), + array('..\\..\\style.css', 'phar://C:\\', 'style.css'), + + array('css/../style.css', '/', 'style.css'), + array('css/./style.css', '/', 'css/style.css'), + array('css\\..\\style.css', 'C:\\', 'style.css'), + array('css\\.\\style.css', 'C:\\', 'css/style.css'), + array('css/../style.css', 'C:/', 'style.css'), + array('css/./style.css', 'C:/', 'css/style.css'), + array('css\\..\\style.css', '\\', 'style.css'), + array('css\\.\\style.css', '\\', 'css/style.css'), + array('css/../style.css', 'phar:///', 'style.css'), + array('css/./style.css', 'phar:///', 'css/style.css'), + array('css\\..\\style.css', 'phar://C:\\', 'style.css'), + array('css\\.\\style.css', 'phar://C:\\', 'css/style.css'), + + // already relative + array('css/style.css', '/webmozart/puli', 'css/style.css'), + array('css\\style.css', '\\webmozart\\puli', 'css/style.css'), + + // both relative + array('css/style.css', 'webmozart/puli', '../../css/style.css'), + array('css\\style.css', 'webmozart\\puli', '../../css/style.css'), + + // relative to empty + array('css/style.css', '', 'css/style.css'), + array('css\\style.css', '', 'css/style.css'), + + // different slashes in path and base path + array('/webmozart/puli/css/style.css', '\\webmozart\\puli', 'css/style.css'), + array('\\webmozart\\puli\\css\\style.css', '/webmozart/puli', 'css/style.css'), + )); + } + + /** + * @dataProvider provideMakeRelativeTests + */ + public function testMakeRelative($absolutePath, $basePath, $relativePath) + { + $this->assertSame($relativePath, Path::makeRelative($absolutePath, $basePath)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testMakeRelativeFailsIfInvalidPath() + { + Path::makeRelative(array(), '/webmozart/puli'); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The base path must be a string. Got: array + */ + public function testMakeRelativeFailsIfInvalidBasePath() + { + Path::makeRelative('/webmozart/puli/css/style.css', array()); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The absolute path "/webmozart/puli/css/style.css" cannot be made relative to the relative path "webmozart/puli". You should provide an absolute base path instead. + */ + public function testMakeRelativeFailsIfAbsolutePathAndBasePathNotAbsolute() + { + Path::makeRelative('/webmozart/puli/css/style.css', 'webmozart/puli'); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The absolute path "/webmozart/puli/css/style.css" cannot be made relative to the relative path "". You should provide an absolute base path instead. + */ + public function testMakeRelativeFailsIfAbsolutePathAndBasePathEmpty() + { + Path::makeRelative('/webmozart/puli/css/style.css', ''); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The base path must be a string. Got: NULL + */ + public function testMakeRelativeFailsIfBasePathNull() + { + Path::makeRelative('/webmozart/puli/css/style.css', null); + } + + /** + * @dataProvider provideAbsolutePathsWithDifferentRoots + * @expectedException \InvalidArgumentException + */ + public function testMakeRelativeFailsIfDifferentRoot($absolutePath, $basePath) + { + Path::makeRelative($absolutePath, $basePath); + } + + public function provideIsLocalTests() + { + return array( + array('/bg.png', true), + array('bg.png', true), + array('http://example.com/bg.png', false), + array('http://example.com', false), + array('', false), + ); + } + + /** + * @dataProvider provideIsLocalTests + */ + public function testIsLocal($path, $isLocal) + { + $this->assertSame($isLocal, Path::isLocal($path)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testIsLocalFailsIfInvalidPath() + { + Path::isLocal(array()); + } + + public function provideGetLongestCommonBasePathTests() + { + return array( + // same paths + array(array('/base/path', '/base/path'), '/base/path'), + array(array('C:/base/path', 'C:/base/path'), 'C:/base/path'), + array(array('C:\\base\\path', 'C:\\base\\path'), 'C:/base/path'), + array(array('C:/base/path', 'C:\\base\\path'), 'C:/base/path'), + array(array('phar:///base/path', 'phar:///base/path'), 'phar:///base/path'), + array(array('phar://C:/base/path', 'phar://C:/base/path'), 'phar://C:/base/path'), + + // trailing slash + array(array('/base/path/', '/base/path'), '/base/path'), + array(array('C:/base/path/', 'C:/base/path'), 'C:/base/path'), + array(array('C:\\base\\path\\', 'C:\\base\\path'), 'C:/base/path'), + array(array('C:/base/path/', 'C:\\base\\path'), 'C:/base/path'), + array(array('phar:///base/path/', 'phar:///base/path'), 'phar:///base/path'), + array(array('phar://C:/base/path/', 'phar://C:/base/path'), 'phar://C:/base/path'), + + array(array('/base/path', '/base/path/'), '/base/path'), + array(array('C:/base/path', 'C:/base/path/'), 'C:/base/path'), + array(array('C:\\base\\path', 'C:\\base\\path\\'), 'C:/base/path'), + array(array('C:/base/path', 'C:\\base\\path\\'), 'C:/base/path'), + array(array('phar:///base/path', 'phar:///base/path/'), 'phar:///base/path'), + array(array('phar://C:/base/path', 'phar://C:/base/path/'), 'phar://C:/base/path'), + + // first in second + array(array('/base/path/sub', '/base/path'), '/base/path'), + array(array('C:/base/path/sub', 'C:/base/path'), 'C:/base/path'), + array(array('C:\\base\\path\\sub', 'C:\\base\\path'), 'C:/base/path'), + array(array('C:/base/path/sub', 'C:\\base\\path'), 'C:/base/path'), + array(array('phar:///base/path/sub', 'phar:///base/path'), 'phar:///base/path'), + array(array('phar://C:/base/path/sub', 'phar://C:/base/path'), 'phar://C:/base/path'), + + // second in first + array(array('/base/path', '/base/path/sub'), '/base/path'), + array(array('C:/base/path', 'C:/base/path/sub'), 'C:/base/path'), + array(array('C:\\base\\path', 'C:\\base\\path\\sub'), 'C:/base/path'), + array(array('C:/base/path', 'C:\\base\\path\\sub'), 'C:/base/path'), + array(array('phar:///base/path', 'phar:///base/path/sub'), 'phar:///base/path'), + array(array('phar://C:/base/path', 'phar://C:/base/path/sub'), 'phar://C:/base/path'), + + // first is prefix + array(array('/base/path/di', '/base/path/dir'), '/base/path'), + array(array('C:/base/path/di', 'C:/base/path/dir'), 'C:/base/path'), + array(array('C:\\base\\path\\di', 'C:\\base\\path\\dir'), 'C:/base/path'), + array(array('C:/base/path/di', 'C:\\base\\path\\dir'), 'C:/base/path'), + array(array('phar:///base/path/di', 'phar:///base/path/dir'), 'phar:///base/path'), + array(array('phar://C:/base/path/di', 'phar://C:/base/path/dir'), 'phar://C:/base/path'), + + // second is prefix + array(array('/base/path/dir', '/base/path/di'), '/base/path'), + array(array('C:/base/path/dir', 'C:/base/path/di'), 'C:/base/path'), + array(array('C:\\base\\path\\dir', 'C:\\base\\path\\di'), 'C:/base/path'), + array(array('C:/base/path/dir', 'C:\\base\\path\\di'), 'C:/base/path'), + array(array('phar:///base/path/dir', 'phar:///base/path/di'), 'phar:///base/path'), + array(array('phar://C:/base/path/dir', 'phar://C:/base/path/di'), 'phar://C:/base/path'), + + // root is common base path + array(array('/first', '/second'), '/'), + array(array('C:/first', 'C:/second'), 'C:/'), + array(array('C:\\first', 'C:\\second'), 'C:/'), + array(array('C:/first', 'C:\\second'), 'C:/'), + array(array('phar:///first', 'phar:///second'), 'phar:///'), + array(array('phar://C:/first', 'phar://C:/second'), 'phar://C:/'), + + // windows vs unix + array(array('/base/path', 'C:/base/path'), null), + array(array('C:/base/path', '/base/path'), null), + array(array('/base/path', 'C:\\base\\path'), null), + array(array('phar:///base/path', 'phar://C:/base/path'), null), + + // different partitions + array(array('C:/base/path', 'D:/base/path'), null), + array(array('C:/base/path', 'D:\\base\\path'), null), + array(array('C:\\base\\path', 'D:\\base\\path'), null), + array(array('phar://C:/base/path', 'phar://D:/base/path'), null), + + // three paths + array(array('/base/path/foo', '/base/path', '/base/path/bar'), '/base/path'), + array(array('C:/base/path/foo', 'C:/base/path', 'C:/base/path/bar'), 'C:/base/path'), + array(array('C:\\base\\path\\foo', 'C:\\base\\path', 'C:\\base\\path\\bar'), 'C:/base/path'), + array(array('C:/base/path//foo', 'C:/base/path', 'C:\\base\\path\\bar'), 'C:/base/path'), + array(array('phar:///base/path/foo', 'phar:///base/path', 'phar:///base/path/bar'), 'phar:///base/path'), + array(array('phar://C:/base/path/foo', 'phar://C:/base/path', 'phar://C:/base/path/bar'), 'phar://C:/base/path'), + + // three paths with root + array(array('/base/path/foo', '/', '/base/path/bar'), '/'), + array(array('C:/base/path/foo', 'C:/', 'C:/base/path/bar'), 'C:/'), + array(array('C:\\base\\path\\foo', 'C:\\', 'C:\\base\\path\\bar'), 'C:/'), + array(array('C:/base/path//foo', 'C:/', 'C:\\base\\path\\bar'), 'C:/'), + array(array('phar:///base/path/foo', 'phar:///', 'phar:///base/path/bar'), 'phar:///'), + array(array('phar://C:/base/path/foo', 'phar://C:/', 'phar://C:/base/path/bar'), 'phar://C:/'), + + // three paths, different roots + array(array('/base/path/foo', 'C:/base/path', '/base/path/bar'), null), + array(array('/base/path/foo', 'C:\\base\\path', '/base/path/bar'), null), + array(array('C:/base/path/foo', 'D:/base/path', 'C:/base/path/bar'), null), + array(array('C:\\base\\path\\foo', 'D:\\base\\path', 'C:\\base\\path\\bar'), null), + array(array('C:/base/path//foo', 'D:/base/path', 'C:\\base\\path\\bar'), null), + array(array('phar:///base/path/foo', 'phar://C:/base/path', 'phar:///base/path/bar'), null), + array(array('phar://C:/base/path/foo', 'phar://D:/base/path', 'phar://C:/base/path/bar'), null), + + // only one path + array(array('/base/path'), '/base/path'), + array(array('C:/base/path'), 'C:/base/path'), + array(array('C:\\base\\path'), 'C:/base/path'), + array(array('phar:///base/path'), 'phar:///base/path'), + array(array('phar://C:/base/path'), 'phar://C:/base/path'), + ); + } + + /** + * @dataProvider provideGetLongestCommonBasePathTests + */ + public function testGetLongestCommonBasePath(array $paths, $basePath) + { + $this->assertSame($basePath, Path::getLongestCommonBasePath($paths)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The paths must be strings. Got: array + */ + public function testGetLongestCommonBasePathFailsIfInvalidPath() + { + Path::getLongestCommonBasePath(array(array())); + } + + public function provideIsBasePathTests() + { + return array( + // same paths + array('/base/path', '/base/path', true), + array('C:/base/path', 'C:/base/path', true), + array('C:\\base\\path', 'C:\\base\\path', true), + array('C:/base/path', 'C:\\base\\path', true), + array('phar:///base/path', 'phar:///base/path', true), + array('phar://C:/base/path', 'phar://C:/base/path', true), + + // trailing slash + array('/base/path/', '/base/path', true), + array('C:/base/path/', 'C:/base/path', true), + array('C:\\base\\path\\', 'C:\\base\\path', true), + array('C:/base/path/', 'C:\\base\\path', true), + array('phar:///base/path/', 'phar:///base/path', true), + array('phar://C:/base/path/', 'phar://C:/base/path', true), + + array('/base/path', '/base/path/', true), + array('C:/base/path', 'C:/base/path/', true), + array('C:\\base\\path', 'C:\\base\\path\\', true), + array('C:/base/path', 'C:\\base\\path\\', true), + array('phar:///base/path', 'phar:///base/path/', true), + array('phar://C:/base/path', 'phar://C:/base/path/', true), + + // first in second + array('/base/path/sub', '/base/path', false), + array('C:/base/path/sub', 'C:/base/path', false), + array('C:\\base\\path\\sub', 'C:\\base\\path', false), + array('C:/base/path/sub', 'C:\\base\\path', false), + array('phar:///base/path/sub', 'phar:///base/path', false), + array('phar://C:/base/path/sub', 'phar://C:/base/path', false), + + // second in first + array('/base/path', '/base/path/sub', true), + array('C:/base/path', 'C:/base/path/sub', true), + array('C:\\base\\path', 'C:\\base\\path\\sub', true), + array('C:/base/path', 'C:\\base\\path\\sub', true), + array('phar:///base/path', 'phar:///base/path/sub', true), + array('phar://C:/base/path', 'phar://C:/base/path/sub', true), + + // first is prefix + array('/base/path/di', '/base/path/dir', false), + array('C:/base/path/di', 'C:/base/path/dir', false), + array('C:\\base\\path\\di', 'C:\\base\\path\\dir', false), + array('C:/base/path/di', 'C:\\base\\path\\dir', false), + array('phar:///base/path/di', 'phar:///base/path/dir', false), + array('phar://C:/base/path/di', 'phar://C:/base/path/dir', false), + + // second is prefix + array('/base/path/dir', '/base/path/di', false), + array('C:/base/path/dir', 'C:/base/path/di', false), + array('C:\\base\\path\\dir', 'C:\\base\\path\\di', false), + array('C:/base/path/dir', 'C:\\base\\path\\di', false), + array('phar:///base/path/dir', 'phar:///base/path/di', false), + array('phar://C:/base/path/dir', 'phar://C:/base/path/di', false), + + // root + array('/', '/second', true), + array('C:/', 'C:/second', true), + array('C:', 'C:/second', true), + array('C:\\', 'C:\\second', true), + array('C:/', 'C:\\second', true), + array('phar:///', 'phar:///second', true), + array('phar://C:/', 'phar://C:/second', true), + + // windows vs unix + array('/base/path', 'C:/base/path', false), + array('C:/base/path', '/base/path', false), + array('/base/path', 'C:\\base\\path', false), + array('/base/path', 'phar:///base/path', false), + array('phar:///base/path', 'phar://C:/base/path', false), + + // different partitions + array('C:/base/path', 'D:/base/path', false), + array('C:/base/path', 'D:\\base\\path', false), + array('C:\\base\\path', 'D:\\base\\path', false), + array('C:/base/path', 'phar://C:/base/path', false), + array('phar://C:/base/path', 'phar://D:/base/path', false), + ); + } + + /** + * @dataProvider provideIsBasePathTests + */ + public function testIsBasePath($path, $ofPath, $result) + { + $this->assertSame($result, Path::isBasePath($path, $ofPath)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The base path must be a string. Got: array + */ + public function testIsBasePathFailsIfInvalidBasePath() + { + Path::isBasePath(array(), '/base/path'); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The path must be a string. Got: array + */ + public function testIsBasePathFailsIfInvalidPath() + { + Path::isBasePath('/base/path', array()); + } + + public function provideJoinTests() + { + return array( + array('', '', ''), + array('/path/to/test', '', '/path/to/test'), + array('/path/to//test', '', '/path/to/test'), + array('', '/path/to/test', '/path/to/test'), + array('', '/path/to//test', '/path/to/test'), + + array('/path/to/test', 'subdir', '/path/to/test/subdir'), + array('/path/to/test/', 'subdir', '/path/to/test/subdir'), + array('/path/to/test', '/subdir', '/path/to/test/subdir'), + array('/path/to/test/', '/subdir', '/path/to/test/subdir'), + array('/path/to/test', './subdir', '/path/to/test/subdir'), + array('/path/to/test/', './subdir', '/path/to/test/subdir'), + array('/path/to/test/', '../parentdir', '/path/to/parentdir'), + array('/path/to/test', '../parentdir', '/path/to/parentdir'), + array('path/to/test/', '/subdir', 'path/to/test/subdir'), + array('path/to/test', '/subdir', 'path/to/test/subdir'), + array('../path/to/test', '/subdir', '../path/to/test/subdir'), + array('path', '../../subdir', '../subdir'), + array('/path', '../../subdir', '/subdir'), + array('../path', '../../subdir', '../../subdir'), + + array(array('/path/to/test', 'subdir'), '', '/path/to/test/subdir'), + array(array('/path/to/test', '/subdir'), '', '/path/to/test/subdir'), + array(array('/path/to/test/', 'subdir'), '', '/path/to/test/subdir'), + array(array('/path/to/test/', '/subdir'), '', '/path/to/test/subdir'), + + array(array('/path'), '', '/path'), + array(array('/path', 'to', '/test'), '', '/path/to/test'), + array(array('/path', '', '/test'), '', '/path/test'), + array(array('path', 'to', 'test'), '', 'path/to/test'), + array(array(), '', ''), + + array('base/path', 'to/test', 'base/path/to/test'), + + array('C:\\path\\to\\test', 'subdir', 'C:/path/to/test/subdir'), + array('C:\\path\\to\\test\\', 'subdir', 'C:/path/to/test/subdir'), + array('C:\\path\\to\\test', '/subdir', 'C:/path/to/test/subdir'), + array('C:\\path\\to\\test\\', '/subdir', 'C:/path/to/test/subdir'), + + array('/', 'subdir', '/subdir'), + array('/', '/subdir', '/subdir'), + array('C:/', 'subdir', 'C:/subdir'), + array('C:/', '/subdir', 'C:/subdir'), + array('C:\\', 'subdir', 'C:/subdir'), + array('C:\\', '/subdir', 'C:/subdir'), + array('C:', 'subdir', 'C:/subdir'), + array('C:', '/subdir', 'C:/subdir'), + + array('phar://', '/path/to/test', 'phar:///path/to/test'), + array('phar:///', '/path/to/test', 'phar:///path/to/test'), + array('phar:///path/to/test', 'subdir', 'phar:///path/to/test/subdir'), + array('phar:///path/to/test', 'subdir/', 'phar:///path/to/test/subdir'), + array('phar:///path/to/test', '/subdir', 'phar:///path/to/test/subdir'), + array('phar:///path/to/test/', 'subdir', 'phar:///path/to/test/subdir'), + array('phar:///path/to/test/', '/subdir', 'phar:///path/to/test/subdir'), + + array('phar://', 'C:/path/to/test', 'phar://C:/path/to/test'), + array('phar://', 'C:\\path\\to\\test', 'phar://C:/path/to/test'), + array('phar://C:/path/to/test', 'subdir', 'phar://C:/path/to/test/subdir'), + array('phar://C:/path/to/test', 'subdir/', 'phar://C:/path/to/test/subdir'), + array('phar://C:/path/to/test', '/subdir', 'phar://C:/path/to/test/subdir'), + array('phar://C:/path/to/test/', 'subdir', 'phar://C:/path/to/test/subdir'), + array('phar://C:/path/to/test/', '/subdir', 'phar://C:/path/to/test/subdir'), + array('phar://C:', 'path/to/test', 'phar://C:/path/to/test'), + array('phar://C:', '/path/to/test', 'phar://C:/path/to/test'), + array('phar://C:/', 'path/to/test', 'phar://C:/path/to/test'), + array('phar://C:/', '/path/to/test', 'phar://C:/path/to/test'), + ); + } + + /** + * @dataProvider provideJoinTests + */ + public function testJoin($path1, $path2, $result) + { + $this->assertSame($result, Path::join($path1, $path2)); + } + + public function testJoinVarArgs() + { + $this->assertSame('/path', Path::join('/path')); + $this->assertSame('/path/to', Path::join('/path', 'to')); + $this->assertSame('/path/to/test', Path::join('/path', 'to', '/test')); + $this->assertSame('/path/to/test/subdir', Path::join('/path', 'to', '/test', 'subdir/')); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The paths must be strings. Got: array + */ + public function testJoinFailsIfInvalidPath() + { + Path::join('/path', array()); + } + + /** + * @expectedException \RuntimeException + * @expectedExceptionMessage Your environment or operation system isn't supported + */ + public function testGetHomeDirectoryFailsIfNotSupportedOperationSystem() + { + putenv('HOME='); + + Path::getHomeDirectory(); + } + + public function testGetHomeDirectoryForUnix() + { + $this->assertEquals('/home/webmozart', Path::getHomeDirectory()); + } + + public function testGetHomeDirectoryForWindows() + { + putenv('HOME='); + putenv('HOMEDRIVE=C:'); + putenv('HOMEPATH=/users/webmozart'); + + $this->assertEquals('C:/users/webmozart', Path::getHomeDirectory()); + } + + public function testNormalize() + { + $this->assertSame('C:/Foo/Bar/test', Path::normalize('C:\\Foo\\Bar/test')); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testNormalizeFailsIfNoString() + { + Path::normalize(true); + } +} diff --git a/vendor/webmozart/path-util/tests/UrlTest.php b/vendor/webmozart/path-util/tests/UrlTest.php new file mode 100644 index 00000000..ae7816ab --- /dev/null +++ b/vendor/webmozart/path-util/tests/UrlTest.php @@ -0,0 +1,179 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Webmozart\PathUtil\Tests; + +use Webmozart\PathUtil\Url; + +/** + * @since 2.3 + * + * @author Bernhard Schussek + * @author Claudio Zizza + */ +class UrlTest extends \PHPUnit_Framework_TestCase +{ + /** + * @dataProvider provideMakeRelativeTests + * @covers Webmozart\PathUtil\Url + */ + public function testMakeRelative($absolutePath, $basePath, $relativePath) + { + $host = 'http://example.com'; + + $relative = Url::makeRelative($host.$absolutePath, $host.$basePath); + $this->assertSame($relativePath, $relative); + $relative = Url::makeRelative($absolutePath, $host.$basePath); + $this->assertSame($relativePath, $relative); + } + + /** + * @dataProvider provideMakeRelativeIsAlreadyRelativeTests + * @covers Webmozart\PathUtil\Url + */ + public function testMakeRelativeIsAlreadyRelative($absolutePath, $basePath, $relativePath) + { + $host = 'http://example.com'; + + $relative = Url::makeRelative($absolutePath, $host.$basePath); + $this->assertSame($relativePath, $relative); + } + + /** + * @dataProvider provideMakeRelativeTests + * @covers Webmozart\PathUtil\Url + */ + public function testMakeRelativeWithFullUrl($absolutePath, $basePath, $relativePath) + { + $host = 'ftp://user:password@example.com:8080'; + + $relative = Url::makeRelative($host.$absolutePath, $host.$basePath); + $this->assertSame($relativePath, $relative); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The URL must be a string. Got: array + * @covers Webmozart\PathUtil\Url + */ + public function testMakeRelativeFailsIfInvalidUrl() + { + Url::makeRelative(array(), 'http://example.com/webmozart/puli'); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The base URL must be a string. Got: array + * @covers Webmozart\PathUtil\Url + */ + public function testMakeRelativeFailsIfInvalidBaseUrl() + { + Url::makeRelative('http://example.com/webmozart/puli/css/style.css', array()); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage "webmozart/puli" is not an absolute Url. + * @covers Webmozart\PathUtil\Url + */ + public function testMakeRelativeFailsIfBaseUrlNoUrl() + { + Url::makeRelative('http://example.com/webmozart/puli/css/style.css', 'webmozart/puli'); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage "" is not an absolute Url. + * @covers Webmozart\PathUtil\Url + */ + public function testMakeRelativeFailsIfBaseUrlEmpty() + { + Url::makeRelative('http://example.com/webmozart/puli/css/style.css', ''); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The base URL must be a string. Got: NULL + * @covers Webmozart\PathUtil\Url + */ + public function testMakeRelativeFailsIfBaseUrlNull() + { + Url::makeRelative('http://example.com/webmozart/puli/css/style.css', null); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The URL "http://example.com" cannot be made relative to "http://example2.com" since + * their host names are different. + * @covers Webmozart\PathUtil\Url + */ + public function testMakeRelativeFailsIfDifferentDomains() + { + Url::makeRelative('http://example.com/webmozart/puli/css/style.css', 'http://example2.com/webmozart/puli'); + } + + public function provideMakeRelativeTests() + { + return array( + + array('/webmozart/puli/css/style.css', '/webmozart/puli', 'css/style.css'), + array('/webmozart/puli/css/style.css?key=value&key2=value', '/webmozart/puli', 'css/style.css?key=value&key2=value'), + array('/webmozart/puli/css/style.css?key[]=value&key[]=value', '/webmozart/puli', 'css/style.css?key[]=value&key[]=value'), + array('/webmozart/css/style.css', '/webmozart/puli', '../css/style.css'), + array('/css/style.css', '/webmozart/puli', '../../css/style.css'), + array('/', '/', ''), + + // relative to root + array('/css/style.css', '/', 'css/style.css'), + + // same sub directories in different base directories + array('/puli/css/style.css', '/webmozart/css', '../../puli/css/style.css'), + + array('/webmozart/puli/./css/style.css', '/webmozart/puli', 'css/style.css'), + array('/webmozart/puli/../css/style.css', '/webmozart/puli', '../css/style.css'), + array('/webmozart/puli/.././css/style.css', '/webmozart/puli', '../css/style.css'), + array('/webmozart/puli/./../css/style.css', '/webmozart/puli', '../css/style.css'), + array('/webmozart/puli/../../css/style.css', '/webmozart/puli', '../../css/style.css'), + array('/webmozart/puli/css/style.css', '/webmozart/./puli', 'css/style.css'), + array('/webmozart/puli/css/style.css', '/webmozart/../puli', '../webmozart/puli/css/style.css'), + array('/webmozart/puli/css/style.css', '/webmozart/./../puli', '../webmozart/puli/css/style.css'), + array('/webmozart/puli/css/style.css', '/webmozart/.././puli', '../webmozart/puli/css/style.css'), + array('/webmozart/puli/css/style.css', '/webmozart/../../puli', '../webmozart/puli/css/style.css'), + + // first argument shorter than second + array('/css', '/webmozart/puli', '../../css'), + + // second argument shorter than first + array('/webmozart/puli', '/css', '../webmozart/puli'), + + array('', '', ''), + ); + } + + public function provideMakeRelativeIsAlreadyRelativeTests() + { + return array( + array('css/style.css', '/webmozart/puli', 'css/style.css'), + array('css/style.css', '', 'css/style.css'), + array('css/../style.css', '', 'style.css'), + array('css/./style.css', '', 'css/style.css'), + array('../style.css', '/', 'style.css'), + array('./style.css', '/', 'style.css'), + array('../../style.css', '/', 'style.css'), + array('../../style.css', '', 'style.css'), + array('./style.css', '', 'style.css'), + array('../style.css', '', 'style.css'), + array('./../style.css', '', 'style.css'), + array('css/./../style.css', '', 'style.css'), + array('css//style.css', '', 'css/style.css'), + ); + } +} From 5c22c17f842ab42b246e666ac22dcf1685943143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Thu, 4 Aug 2022 10:52:25 +0200 Subject: [PATCH 02/12] Fix errors spotted by psalm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- lib/CommandApplication.php | 2 +- lib/Updater.php | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/CommandApplication.php b/lib/CommandApplication.php index e79e6fd5..e1ad2de4 100644 --- a/lib/CommandApplication.php +++ b/lib/CommandApplication.php @@ -47,7 +47,7 @@ protected function getCommandName(InputInterface $input) { /** * Gets the default commands that should always be available. * - * @return array An array of default Command instances + * @return \Symfony\Component\Console\Command\Command[] An array of default Command instances */ protected function getDefaultCommands() { // Keep the core default commands to have the HelpCommand diff --git a/lib/Updater.php b/lib/Updater.php index cee81889..ddec987c 100644 --- a/lib/Updater.php +++ b/lib/Updater.php @@ -121,11 +121,9 @@ public function getCurrentVersion() { /** * Returns currently used release channel - * - * @return string */ - private function getCurrentReleaseChannel() { - return !is_null($this->getConfigOption('updater.release.channel')) ? $this->getConfigOption('updater.release.channel') : 'stable'; + private function getCurrentReleaseChannel(): string { + return (string)($this->getConfigOption('updater.release.channel') ?? 'stable'); } /** @@ -176,10 +174,9 @@ public function updateAvailable() { /** * Returns the specified config options * - * @param string $key * @return mixed|null Null if the entry is not found */ - public function getConfigOption($key) { + public function getConfigOption(string $key) { return isset($this->configValues[$key]) ? $this->configValues[$key] : null; } @@ -1048,7 +1045,7 @@ public function endStep($step) { } /** - * @return string + * @return array * @throws \Exception */ public function currentStep() { From f039ecf6f1ce3e5154f62ff823f9a81c89829b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Thu, 25 Aug 2022 10:40:56 +0200 Subject: [PATCH 03/12] Update index.php from lib/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- index.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/index.php b/index.php index 68e0b788..4c4acef2 100644 --- a/index.php +++ b/index.php @@ -151,11 +151,9 @@ public function getCurrentVersion() { /** * Returns currently used release channel - * - * @return string */ - private function getCurrentReleaseChannel() { - return !is_null($this->getConfigOption('updater.release.channel')) ? $this->getConfigOption('updater.release.channel') : 'stable'; + private function getCurrentReleaseChannel(): string { + return (string)($this->getConfigOption('updater.release.channel') ?? 'stable'); } /** @@ -206,10 +204,9 @@ public function updateAvailable() { /** * Returns the specified config options * - * @param string $key * @return mixed|null Null if the entry is not found */ - public function getConfigOption($key) { + public function getConfigOption(string $key) { return isset($this->configValues[$key]) ? $this->configValues[$key] : null; } @@ -1078,7 +1075,7 @@ public function endStep($step) { } /** - * @return string + * @return array * @throws \Exception */ public function currentStep() { From 0eaef8e3cba0677de56101d18daa588621c98939 Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Thu, 25 Aug 2022 22:39:11 +0200 Subject: [PATCH 04/12] Scope vimeo/psalm Signed-off-by: Daniel Kesselberg --- composer.json | 3 +- composer.lock | 1249 +- vendor-bin/coding-standard/composer.json | 3 +- vendor-bin/coding-standard/composer.lock | 1065 +- vendor/amphp/amp/LICENSE | 23 - vendor/amphp/amp/composer.json | 74 - vendor/amphp/amp/lib/CallableMaker.php | 80 - vendor/amphp/amp/lib/CancellationToken.php | 49 - .../amphp/amp/lib/CancellationTokenSource.php | 163 - vendor/amphp/amp/lib/CancelledException.php | 17 - .../amp/lib/CombinedCancellationToken.php | 87 - vendor/amphp/amp/lib/Coroutine.php | 160 - vendor/amphp/amp/lib/Deferred.php | 76 - vendor/amphp/amp/lib/Delayed.php | 58 - vendor/amphp/amp/lib/Emitter.php | 84 - vendor/amphp/amp/lib/Failure.php | 52 - vendor/amphp/amp/lib/Internal/Placeholder.php | 187 - .../amp/lib/Internal/PrivateIterator.php | 45 - .../amphp/amp/lib/Internal/PrivatePromise.php | 25 - vendor/amphp/amp/lib/Internal/Producer.php | 212 - .../amp/lib/Internal/ResolutionQueue.php | 90 - vendor/amphp/amp/lib/Internal/functions.php | 117 - vendor/amphp/amp/lib/InvalidYieldError.php | 39 - vendor/amphp/amp/lib/Iterator.php | 34 - vendor/amphp/amp/lib/LazyPromise.php | 44 - vendor/amphp/amp/lib/Loop.php | 456 - vendor/amphp/amp/lib/Loop/Driver.php | 742 - vendor/amphp/amp/lib/Loop/DriverFactory.php | 73 - vendor/amphp/amp/lib/Loop/EvDriver.php | 317 - vendor/amphp/amp/lib/Loop/EventDriver.php | 367 - .../amp/lib/Loop/Internal/TimerQueue.php | 169 - .../amp/lib/Loop/InvalidWatcherError.php | 32 - vendor/amphp/amp/lib/Loop/NativeDriver.php | 445 - vendor/amphp/amp/lib/Loop/TracingDriver.php | 251 - .../lib/Loop/UnsupportedFeatureException.php | 12 - vendor/amphp/amp/lib/Loop/UvDriver.php | 350 - vendor/amphp/amp/lib/Loop/Watcher.php | 57 - vendor/amphp/amp/lib/MultiReasonException.php | 29 - .../amphp/amp/lib/NullCancellationToken.php | 53 - vendor/amphp/amp/lib/Producer.php | 43 - vendor/amphp/amp/lib/Promise.php | 37 - vendor/amphp/amp/lib/Struct.php | 78 - vendor/amphp/amp/lib/Success.php | 60 - .../amp/lib/TimeoutCancellationToken.php | 75 - vendor/amphp/amp/lib/TimeoutException.php | 19 - vendor/amphp/amp/lib/functions.php | 825 - .../byte-stream/.github/workflows/ci.yml | 135 - vendor/amphp/byte-stream/LICENSE | 22 - vendor/amphp/byte-stream/composer.json | 58 - .../lib/Base64/Base64DecodingInputStream.php | 65 - .../lib/Base64/Base64DecodingOutputStream.php | 55 - .../lib/Base64/Base64EncodingInputStream.php | 46 - .../lib/Base64/Base64EncodingOutputStream.php | 39 - .../amphp/byte-stream/lib/ClosedException.php | 7 - .../amphp/byte-stream/lib/InMemoryStream.php | 39 - vendor/amphp/byte-stream/lib/InputStream.php | 38 - .../byte-stream/lib/InputStreamChain.php | 52 - .../amphp/byte-stream/lib/IteratorStream.php | 70 - vendor/amphp/byte-stream/lib/LineReader.php | 71 - vendor/amphp/byte-stream/lib/Message.php | 176 - vendor/amphp/byte-stream/lib/OutputBuffer.php | 55 - vendor/amphp/byte-stream/lib/OutputStream.php | 37 - vendor/amphp/byte-stream/lib/Payload.php | 92 - .../byte-stream/lib/PendingReadError.php | 17 - .../byte-stream/lib/ResourceInputStream.php | 262 - .../byte-stream/lib/ResourceOutputStream.php | 321 - .../amphp/byte-stream/lib/StreamException.php | 7 - .../amphp/byte-stream/lib/ZlibInputStream.php | 112 - .../byte-stream/lib/ZlibOutputStream.php | 119 - vendor/amphp/byte-stream/lib/functions.php | 188 - vendor/amphp/byte-stream/psalm.xml | 53 - vendor/bin/php-parse | 8 +- vendor/bin/psalm | 8 +- vendor/bin/psalm-language-server | 8 +- vendor/bin/psalm-plugin | 8 +- vendor/bin/psalm-refactor | 8 +- vendor/bin/psalter | 8 +- vendor/composer/autoload_classmap.php | 1687 -- vendor/composer/autoload_files.php | 7 +- vendor/composer/autoload_namespaces.php | 2 - vendor/composer/autoload_psr4.php | 15 - vendor/composer/autoload_static.php | 1807 +- vendor/composer/installed.json | 1377 +- vendor/composer/installed.php | 196 +- .../package-versions-deprecated/CHANGELOG.md | 120 - .../CONTRIBUTING.md | 39 - .../package-versions-deprecated/LICENSE | 19 - .../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 - vendor/composer/pcre/LICENSE | 19 - vendor/composer/pcre/README.md | 164 - vendor/composer/pcre/composer.json | 46 - vendor/composer/pcre/phpstan-baseline.neon | 17 - vendor/composer/pcre/src/MatchAllResult.php | 46 - .../pcre/src/MatchAllWithOffsetsResult.php | 48 - vendor/composer/pcre/src/MatchResult.php | 39 - .../pcre/src/MatchWithOffsetsResult.php | 41 - vendor/composer/pcre/src/PcreException.php | 60 - vendor/composer/pcre/src/Preg.php | 275 - vendor/composer/pcre/src/Regex.php | 118 - vendor/composer/pcre/src/ReplaceResult.php | 44 - vendor/composer/semver/CHANGELOG.md | 209 - vendor/composer/semver/LICENSE | 19 - vendor/composer/semver/README.md | 98 - vendor/composer/semver/composer.json | 59 - vendor/composer/semver/src/Comparator.php | 113 - .../composer/semver/src/CompilingMatcher.php | 94 - .../composer/semver/src/Constraint/Bound.php | 122 - .../semver/src/Constraint/Constraint.php | 435 - .../src/Constraint/ConstraintInterface.php | 75 - .../src/Constraint/MatchAllConstraint.php | 85 - .../src/Constraint/MatchNoneConstraint.php | 83 - .../semver/src/Constraint/MultiConstraint.php | 325 - vendor/composer/semver/src/Interval.php | 98 - vendor/composer/semver/src/Intervals.php | 478 - vendor/composer/semver/src/Semver.php | 129 - vendor/composer/semver/src/VersionParser.php | 586 - vendor/composer/xdebug-handler/CHANGELOG.md | 134 - vendor/composer/xdebug-handler/LICENSE | 21 - vendor/composer/xdebug-handler/README.md | 298 - vendor/composer/xdebug-handler/composer.json | 44 - .../composer/xdebug-handler/src/PhpConfig.php | 91 - .../composer/xdebug-handler/src/Process.php | 118 - vendor/composer/xdebug-handler/src/Status.php | 203 - .../xdebug-handler/src/XdebugHandler.php | 668 - vendor/dnoegel/php-xdg-base-dir/LICENSE | 19 - vendor/dnoegel/php-xdg-base-dir/README.md | 41 - vendor/dnoegel/php-xdg-base-dir/composer.json | 17 - vendor/dnoegel/php-xdg-base-dir/src/Xdg.php | 132 - .../.github/workflows/build.yml | 63 - vendor/felixfbecker/advanced-json-rpc/LICENSE | 15 - .../advanced-json-rpc/composer.json | 32 - .../advanced-json-rpc/lib/Dispatcher.php | 171 - .../advanced-json-rpc/lib/Error.php | 38 - .../advanced-json-rpc/lib/ErrorCode.php | 48 - .../advanced-json-rpc/lib/ErrorResponse.php | 40 - .../advanced-json-rpc/lib/Message.php | 52 - .../advanced-json-rpc/lib/Notification.php | 56 - .../advanced-json-rpc/lib/Request.php | 63 - .../advanced-json-rpc/lib/Response.php | 40 - .../advanced-json-rpc/lib/SuccessResponse.php | 40 - .../language-server-protocol/.editorconfig | 17 - .../.github/workflows/build.yml | 67 - .../language-server-protocol/LICENSE | 15 - .../language-server-protocol/README.md | 19 - .../language-server-protocol/composer.json | 44 - .../package-lock.json | 6489 ------ .../language-server-protocol/package.json | 15 - .../psalm-baseline.xml | 146 - .../language-server-protocol/psalm.xml | 16 - .../src/CallHierarchyClientCapabilities.php | 22 - .../src/ChangeAnnotation.php | 39 - .../src/ClientCapabilities.php | 97 - .../src/ClientCapabilitiesGeneral.php | 33 - .../src/ClientCapabilitiesWindow.php | 47 - .../src/ClientCapabilitiesWorkspace.php | 99 - ...entCapabilitiesWorkspaceFileOperations.php | 75 - .../src/ClientInfo.php | 29 - .../src/CodeAction.php | 146 - .../src/CodeActionClientCapabilities.php | 95 - ...ntCapabilitiesCodeActionLiteralSupport.php | 20 - ...CodeActionLiteralSupportcodeActionKind.php | 28 - ...ActionClientCapabilitiesResolveSupport.php | 21 - .../src/CodeActionContext.php | 51 - .../src/CodeActionDisabled.php | 21 - .../src/CodeActionKind.php | 87 - .../src/CodeActionTriggerKind.php | 22 - .../src/CodeDescription.php | 23 - .../language-server-protocol/src/CodeLens.php | 46 - .../src/CodeLensClientCapabilities.php | 20 - .../src/CodeLensOptions.php | 21 - .../CodeLensWorkspaceClientCapabilities.php | 25 - .../language-server-protocol/src/Command.php | 42 - .../src/CompletionClientCapabilities.php | 65 - ...letionClientCapabilitiesCompletionItem.php | 140 - ...iesCompletionItemInsertTextModeSupport.php | 24 - ...pabilitiesCompletionItemResolveSupport.php | 24 - ...ntCapabilitiesCompletionItemTagSupport.php | 24 - ...letionClientCapabilitiesCompletionList.php | 30 - .../src/CompletionContext.php | 31 - .../src/CompletionItem.php | 248 - .../src/CompletionItemKind.php | 71 - .../src/CompletionItemLabelDetails.php | 35 - .../src/CompletionItemTag.php | 11 - .../src/CompletionList.php | 39 - .../src/CompletionOptions.php | 33 - .../src/CompletionTriggerKind.php | 16 - .../src/ContentChangeEvent.php | 39 - .../src/DeclarationClientCapabilities.php | 31 - .../src/DefinitionClientCapabilities.php | 29 - .../src/DependencyReference.php | 27 - .../src/Diagnostic.php | 121 - .../src/DiagnosticRelatedInformation.php | 31 - .../src/DiagnosticSeverity.php | 26 - .../src/DiagnosticTag.php | 27 - ...dChangeConfigurationClientCapabilities.php | 20 - ...idChangeWatchedFilesClientCapabilities.php | 21 - .../src/DocumentColorClientCapabilities.php | 20 - .../DocumentFormattingClientCapabilities.php | 20 - .../src/DocumentHighlight.php | 32 - .../DocumentHighlightClientCapabilities.php | 18 - .../src/DocumentHighlightKind.php | 24 - .../src/DocumentLinkClientCapabilities.php | 31 - ...mentOnTypeFormattingClientCapabilities.php | 20 - .../src/DocumentOnTypeFormattingOptions.php | 33 - ...umentRangeFormattingClientCapabilities.php | 20 - .../src/DocumentSymbolClientCapabilities.php | 64 - ...mentSymbolClientCapabilitiesSymbolKind.php | 37 - ...mentSymbolClientCapabilitiesTagSupport.php | 32 - .../src/ErrorCode.php | 17 - .../src/ExecuteCommandClientCapabilities.php | 20 - .../src/ExecuteCommandOptions.php | 23 - .../src/FailureHandlingKind.php | 36 - .../src/FileChangeType.php | 24 - .../src/FileEvent.php | 33 - .../src/FoldingRangeClientCapabilities.php | 42 - .../src/FormattingOptions.php | 33 - .../language-server-protocol/src/Hover.php | 34 - .../src/HoverClientCapabilities.php | 36 - .../src/ImplementationClientCapabilities.php | 32 - .../src/InitializeResult.php | 29 - .../src/InitializeResultServerInfo.php | 26 - .../src/InsertTextFormat.php | 25 - .../src/InsertTextMode.php | 32 - .../LinkedEditingRangeClientCapabilities.php | 23 - .../language-server-protocol/src/Location.php | 27 - .../src/LogMessage.php | 30 - .../language-server-protocol/src/LogTrace.php | 39 - .../src/MarkdownClientCapabilities.php | 47 - .../src/MarkedString.php | 24 - .../src/MarkupContent.php | 52 - .../src/MarkupKind.php | 23 - .../src/MessageActionItem.php | 19 - .../src/MessageType.php | 29 - .../src/MonikerClientCapabilities.php | 23 - .../src/PackageDescriptor.php | 26 - .../src/ParameterInformation.php | 45 - .../language-server-protocol/src/Position.php | 67 - .../src/PrepareSupportDefaultBehavior.php | 12 - .../PublishDiagnosticsClientCapabilities.php | 67 - ...iagnosticsClientCapabilitiesTagSupport.php | 23 - .../language-server-protocol/src/Range.php | 42 - .../src/ReferenceClientCapabilities.php | 18 - .../src/ReferenceContext.php | 19 - .../src/ReferenceInformation.php | 39 - .../RegularExpressionsClientCapabilities.php | 33 - .../src/RenameClientCapabilities.php | 68 - .../src/ResourceOperationKind.php | 24 - .../src/SaveOptions.php | 15 - .../src/SelectionRangeClientCapabilities.php | 22 - .../src/SemanticTokensClientCapabilities.php | 133 - ...manticTokensClientCapabilitiesRequests.php | 31 - ...anticTokensWorkspaceClientCapabilities.php | 24 - .../src/ServerCapabilities.php | 157 - .../src/ShowDocumentClientCapabilities.php | 19 - .../ShowMessageRequestClientCapabilities.php | 20 - ...estClientCapabilitiesMessageActionItem.php | 22 - .../src/SignatureHelp.php | 61 - .../src/SignatureHelpClientCapabilities.php | 43 - ...ClientCapabilitiesSignatureInformation.php | 50 - ...gnatureInformationParameterInformation.php | 24 - .../src/SignatureHelpOptions.php | 24 - .../src/SignatureInformation.php | 66 - .../src/SymbolDescriptor.php | 36 - .../src/SymbolInformation.php | 55 - .../src/SymbolKind.php | 28 - .../src/SymbolLocationInformation.php | 33 - .../src/SymbolTag.php | 16 - .../src/TextDocumentClientCapabilities.php | 265 - .../src/TextDocumentContentChangeEvent.php | 39 - .../src/TextDocumentIdentifier.php | 22 - .../src/TextDocumentItem.php | 50 - .../TextDocumentSyncClientCapabilities.php | 49 - .../src/TextDocumentSyncKind.php | 25 - .../src/TextDocumentSyncOptions.php | 41 - .../language-server-protocol/src/TextEdit.php | 31 - .../src/TokenFormat.php | 8 - .../src/TypeDefinitionClientCapabilities.php | 33 - .../src/VersionedTextDocumentIdentifier.php | 19 - .../src/WorkspaceEdit.php | 78 - .../src/WorkspaceEditClientCapabilities.php | 80 - ...entCapabilitiesChangeAnnotationSupport.php | 21 - .../src/WorkspaceFolder.php | 31 - .../src/WorkspaceSymbolClientCapabilities.php | 55 - ...SymbolClientCapabilitiesResolveSupport.php | 24 - ...paceSymbolClientCapabilitiesSymbolKind.php | 30 - ...paceSymbolClientCapabilitiesTagSupport.php | 30 - vendor/netresearch/jsonmapper/LICENSE | 47 - vendor/netresearch/jsonmapper/composer.json | 31 - .../netresearch/jsonmapper/contributing.rst | 13 - vendor/netresearch/jsonmapper/phpunit.xml | 18 - .../netresearch/jsonmapper/src/JsonMapper.php | 850 - .../jsonmapper/src/JsonMapper/Exception.php | 26 - vendor/nikic/php-parser/LICENSE | 29 - vendor/nikic/php-parser/README.md | 225 - vendor/nikic/php-parser/bin/php-parse | 205 - vendor/nikic/php-parser/composer.json | 41 - vendor/nikic/php-parser/grammar/README.md | 30 - .../nikic/php-parser/grammar/parser.template | 106 - vendor/nikic/php-parser/grammar/php5.y | 1036 - vendor/nikic/php-parser/grammar/php7.y | 1204 -- vendor/nikic/php-parser/grammar/phpyLang.php | 184 - .../php-parser/grammar/rebuildParsers.php | 81 - .../nikic/php-parser/grammar/tokens.template | 17 - vendor/nikic/php-parser/grammar/tokens.y | 115 - .../php-parser/lib/PhpParser/Builder.php | 13 - .../lib/PhpParser/Builder/ClassConst.php | 132 - .../lib/PhpParser/Builder/Class_.php | 146 - .../lib/PhpParser/Builder/Declaration.php | 43 - .../lib/PhpParser/Builder/EnumCase.php | 85 - .../lib/PhpParser/Builder/Enum_.php | 117 - .../lib/PhpParser/Builder/FunctionLike.php | 73 - .../lib/PhpParser/Builder/Function_.php | 67 - .../lib/PhpParser/Builder/Interface_.php | 93 - .../lib/PhpParser/Builder/Method.php | 146 - .../lib/PhpParser/Builder/Namespace_.php | 45 - .../lib/PhpParser/Builder/Param.php | 122 - .../lib/PhpParser/Builder/Property.php | 161 - .../lib/PhpParser/Builder/TraitUse.php | 64 - .../PhpParser/Builder/TraitUseAdaptation.php | 148 - .../lib/PhpParser/Builder/Trait_.php | 78 - .../php-parser/lib/PhpParser/Builder/Use_.php | 49 - .../lib/PhpParser/BuilderFactory.php | 399 - .../lib/PhpParser/BuilderHelpers.php | 322 - .../php-parser/lib/PhpParser/Comment.php | 239 - .../php-parser/lib/PhpParser/Comment/Doc.php | 7 - .../ConstExprEvaluationException.php | 6 - .../lib/PhpParser/ConstExprEvaluator.php | 229 - .../nikic/php-parser/lib/PhpParser/Error.php | 180 - .../php-parser/lib/PhpParser/ErrorHandler.php | 13 - .../lib/PhpParser/ErrorHandler/Collecting.php | 46 - .../lib/PhpParser/ErrorHandler/Throwing.php | 18 - .../lib/PhpParser/Internal/DiffElem.php | 27 - .../lib/PhpParser/Internal/Differ.php | 164 - .../Internal/PrintableNewAnonClassNode.php | 61 - .../lib/PhpParser/Internal/TokenStream.php | 281 - .../php-parser/lib/PhpParser/JsonDecoder.php | 103 - .../nikic/php-parser/lib/PhpParser/Lexer.php | 560 - .../lib/PhpParser/Lexer/Emulative.php | 248 - .../Lexer/TokenEmulator/AttributeEmulator.php | 56 - .../CoaleseEqualTokenEmulator.php | 47 - .../Lexer/TokenEmulator/EnumTokenEmulator.php | 31 - .../TokenEmulator/ExplicitOctalEmulator.php | 44 - .../FlexibleDocStringEmulator.php | 76 - .../Lexer/TokenEmulator/FnTokenEmulator.php | 23 - .../Lexer/TokenEmulator/KeywordEmulator.php | 62 - .../TokenEmulator/MatchTokenEmulator.php | 23 - .../TokenEmulator/NullsafeTokenEmulator.php | 67 - .../NumericLiteralSeparatorEmulator.php | 105 - .../TokenEmulator/ReadonlyTokenEmulator.php | 23 - .../Lexer/TokenEmulator/ReverseEmulator.php | 36 - .../Lexer/TokenEmulator/TokenEmulator.php | 25 - .../php-parser/lib/PhpParser/NameContext.php | 285 - .../nikic/php-parser/lib/PhpParser/Node.php | 151 - .../php-parser/lib/PhpParser/Node/Arg.php | 46 - .../lib/PhpParser/Node/Attribute.php | 34 - .../lib/PhpParser/Node/AttributeGroup.php | 29 - .../lib/PhpParser/Node/ComplexType.php | 14 - .../php-parser/lib/PhpParser/Node/Const_.php | 37 - .../php-parser/lib/PhpParser/Node/Expr.php | 9 - .../lib/PhpParser/Node/Expr/ArrayDimFetch.php | 34 - .../lib/PhpParser/Node/Expr/ArrayItem.php | 41 - .../lib/PhpParser/Node/Expr/Array_.php | 34 - .../lib/PhpParser/Node/Expr/ArrowFunction.php | 79 - .../lib/PhpParser/Node/Expr/Assign.php | 34 - .../lib/PhpParser/Node/Expr/AssignOp.php | 30 - .../Node/Expr/AssignOp/BitwiseAnd.php | 12 - .../Node/Expr/AssignOp/BitwiseOr.php | 12 - .../Node/Expr/AssignOp/BitwiseXor.php | 12 - .../PhpParser/Node/Expr/AssignOp/Coalesce.php | 12 - .../PhpParser/Node/Expr/AssignOp/Concat.php | 12 - .../lib/PhpParser/Node/Expr/AssignOp/Div.php | 12 - .../PhpParser/Node/Expr/AssignOp/Minus.php | 12 - .../lib/PhpParser/Node/Expr/AssignOp/Mod.php | 12 - .../lib/PhpParser/Node/Expr/AssignOp/Mul.php | 12 - .../lib/PhpParser/Node/Expr/AssignOp/Plus.php | 12 - .../lib/PhpParser/Node/Expr/AssignOp/Pow.php | 12 - .../Node/Expr/AssignOp/ShiftLeft.php | 12 - .../Node/Expr/AssignOp/ShiftRight.php | 12 - .../lib/PhpParser/Node/Expr/AssignRef.php | 34 - .../lib/PhpParser/Node/Expr/BinaryOp.php | 40 - .../Node/Expr/BinaryOp/BitwiseAnd.php | 16 - .../Node/Expr/BinaryOp/BitwiseOr.php | 16 - .../Node/Expr/BinaryOp/BitwiseXor.php | 16 - .../Node/Expr/BinaryOp/BooleanAnd.php | 16 - .../Node/Expr/BinaryOp/BooleanOr.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Coalesce.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Concat.php | 16 - .../lib/PhpParser/Node/Expr/BinaryOp/Div.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Equal.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Greater.php | 16 - .../Node/Expr/BinaryOp/GreaterOrEqual.php | 16 - .../Node/Expr/BinaryOp/Identical.php | 16 - .../Node/Expr/BinaryOp/LogicalAnd.php | 16 - .../Node/Expr/BinaryOp/LogicalOr.php | 16 - .../Node/Expr/BinaryOp/LogicalXor.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Minus.php | 16 - .../lib/PhpParser/Node/Expr/BinaryOp/Mod.php | 16 - .../lib/PhpParser/Node/Expr/BinaryOp/Mul.php | 16 - .../PhpParser/Node/Expr/BinaryOp/NotEqual.php | 16 - .../Node/Expr/BinaryOp/NotIdentical.php | 16 - .../lib/PhpParser/Node/Expr/BinaryOp/Plus.php | 16 - .../lib/PhpParser/Node/Expr/BinaryOp/Pow.php | 16 - .../Node/Expr/BinaryOp/ShiftLeft.php | 16 - .../Node/Expr/BinaryOp/ShiftRight.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Smaller.php | 16 - .../Node/Expr/BinaryOp/SmallerOrEqual.php | 16 - .../Node/Expr/BinaryOp/Spaceship.php | 16 - .../lib/PhpParser/Node/Expr/BitwiseNot.php | 30 - .../lib/PhpParser/Node/Expr/BooleanNot.php | 30 - .../lib/PhpParser/Node/Expr/CallLike.php | 39 - .../lib/PhpParser/Node/Expr/Cast.php | 26 - .../lib/PhpParser/Node/Expr/Cast/Array_.php | 12 - .../lib/PhpParser/Node/Expr/Cast/Bool_.php | 12 - .../lib/PhpParser/Node/Expr/Cast/Double.php | 17 - .../lib/PhpParser/Node/Expr/Cast/Int_.php | 12 - .../lib/PhpParser/Node/Expr/Cast/Object_.php | 12 - .../lib/PhpParser/Node/Expr/Cast/String_.php | 12 - .../lib/PhpParser/Node/Expr/Cast/Unset_.php | 12 - .../PhpParser/Node/Expr/ClassConstFetch.php | 36 - .../lib/PhpParser/Node/Expr/Clone_.php | 30 - .../lib/PhpParser/Node/Expr/Closure.php | 79 - .../lib/PhpParser/Node/Expr/ClosureUse.php | 34 - .../lib/PhpParser/Node/Expr/ConstFetch.php | 31 - .../lib/PhpParser/Node/Expr/Empty_.php | 30 - .../lib/PhpParser/Node/Expr/Error.php | 31 - .../lib/PhpParser/Node/Expr/ErrorSuppress.php | 30 - .../lib/PhpParser/Node/Expr/Eval_.php | 30 - .../lib/PhpParser/Node/Expr/Exit_.php | 34 - .../lib/PhpParser/Node/Expr/FuncCall.php | 39 - .../lib/PhpParser/Node/Expr/Include_.php | 39 - .../lib/PhpParser/Node/Expr/Instanceof_.php | 35 - .../lib/PhpParser/Node/Expr/Isset_.php | 30 - .../lib/PhpParser/Node/Expr/List_.php | 30 - .../lib/PhpParser/Node/Expr/Match_.php | 31 - .../lib/PhpParser/Node/Expr/MethodCall.php | 45 - .../lib/PhpParser/Node/Expr/New_.php | 41 - .../Node/Expr/NullsafeMethodCall.php | 45 - .../Node/Expr/NullsafePropertyFetch.php | 35 - .../lib/PhpParser/Node/Expr/PostDec.php | 30 - .../lib/PhpParser/Node/Expr/PostInc.php | 30 - .../lib/PhpParser/Node/Expr/PreDec.php | 30 - .../lib/PhpParser/Node/Expr/PreInc.php | 30 - .../lib/PhpParser/Node/Expr/Print_.php | 30 - .../lib/PhpParser/Node/Expr/PropertyFetch.php | 35 - .../lib/PhpParser/Node/Expr/ShellExec.php | 30 - .../lib/PhpParser/Node/Expr/StaticCall.php | 46 - .../Node/Expr/StaticPropertyFetch.php | 36 - .../lib/PhpParser/Node/Expr/Ternary.php | 38 - .../lib/PhpParser/Node/Expr/Throw_.php | 30 - .../lib/PhpParser/Node/Expr/UnaryMinus.php | 30 - .../lib/PhpParser/Node/Expr/UnaryPlus.php | 30 - .../lib/PhpParser/Node/Expr/Variable.php | 30 - .../lib/PhpParser/Node/Expr/YieldFrom.php | 30 - .../lib/PhpParser/Node/Expr/Yield_.php | 34 - .../lib/PhpParser/Node/FunctionLike.php | 43 - .../lib/PhpParser/Node/Identifier.php | 75 - .../lib/PhpParser/Node/IntersectionType.php | 30 - .../lib/PhpParser/Node/MatchArm.php | 31 - .../php-parser/lib/PhpParser/Node/Name.php | 242 - .../PhpParser/Node/Name/FullyQualified.php | 50 - .../lib/PhpParser/Node/Name/Relative.php | 50 - .../lib/PhpParser/Node/NullableType.php | 28 - .../php-parser/lib/PhpParser/Node/Param.php | 60 - .../php-parser/lib/PhpParser/Node/Scalar.php | 7 - .../lib/PhpParser/Node/Scalar/DNumber.php | 81 - .../lib/PhpParser/Node/Scalar/Encapsed.php | 31 - .../Node/Scalar/EncapsedStringPart.php | 30 - .../lib/PhpParser/Node/Scalar/LNumber.php | 80 - .../lib/PhpParser/Node/Scalar/MagicConst.php | 28 - .../Node/Scalar/MagicConst/Class_.php | 16 - .../PhpParser/Node/Scalar/MagicConst/Dir.php | 16 - .../PhpParser/Node/Scalar/MagicConst/File.php | 16 - .../Node/Scalar/MagicConst/Function_.php | 16 - .../PhpParser/Node/Scalar/MagicConst/Line.php | 16 - .../Node/Scalar/MagicConst/Method.php | 16 - .../Node/Scalar/MagicConst/Namespace_.php | 16 - .../Node/Scalar/MagicConst/Trait_.php | 16 - .../lib/PhpParser/Node/Scalar/String_.php | 157 - .../php-parser/lib/PhpParser/Node/Stmt.php | 9 - .../lib/PhpParser/Node/Stmt/Break_.php | 30 - .../lib/PhpParser/Node/Stmt/Case_.php | 34 - .../lib/PhpParser/Node/Stmt/Catch_.php | 41 - .../lib/PhpParser/Node/Stmt/ClassConst.php | 80 - .../lib/PhpParser/Node/Stmt/ClassLike.php | 109 - .../lib/PhpParser/Node/Stmt/ClassMethod.php | 159 - .../lib/PhpParser/Node/Stmt/Class_.php | 137 - .../lib/PhpParser/Node/Stmt/Const_.php | 30 - .../lib/PhpParser/Node/Stmt/Continue_.php | 30 - .../PhpParser/Node/Stmt/DeclareDeclare.php | 34 - .../lib/PhpParser/Node/Stmt/Declare_.php | 34 - .../lib/PhpParser/Node/Stmt/Do_.php | 34 - .../lib/PhpParser/Node/Stmt/Echo_.php | 30 - .../lib/PhpParser/Node/Stmt/ElseIf_.php | 34 - .../lib/PhpParser/Node/Stmt/Else_.php | 30 - .../lib/PhpParser/Node/Stmt/EnumCase.php | 37 - .../lib/PhpParser/Node/Stmt/Enum_.php | 40 - .../lib/PhpParser/Node/Stmt/Expression.php | 33 - .../lib/PhpParser/Node/Stmt/Finally_.php | 30 - .../lib/PhpParser/Node/Stmt/For_.php | 43 - .../lib/PhpParser/Node/Stmt/Foreach_.php | 47 - .../lib/PhpParser/Node/Stmt/Function_.php | 77 - .../lib/PhpParser/Node/Stmt/Global_.php | 30 - .../lib/PhpParser/Node/Stmt/Goto_.php | 31 - .../lib/PhpParser/Node/Stmt/GroupUse.php | 39 - .../lib/PhpParser/Node/Stmt/HaltCompiler.php | 30 - .../lib/PhpParser/Node/Stmt/If_.php | 43 - .../lib/PhpParser/Node/Stmt/InlineHTML.php | 30 - .../lib/PhpParser/Node/Stmt/Interface_.php | 37 - .../lib/PhpParser/Node/Stmt/Label.php | 31 - .../lib/PhpParser/Node/Stmt/Namespace_.php | 38 - .../lib/PhpParser/Node/Stmt/Nop.php | 17 - .../lib/PhpParser/Node/Stmt/Property.php | 91 - .../PhpParser/Node/Stmt/PropertyProperty.php | 34 - .../lib/PhpParser/Node/Stmt/Return_.php | 30 - .../lib/PhpParser/Node/Stmt/StaticVar.php | 37 - .../lib/PhpParser/Node/Stmt/Static_.php | 30 - .../lib/PhpParser/Node/Stmt/Switch_.php | 34 - .../lib/PhpParser/Node/Stmt/Throw_.php | 30 - .../lib/PhpParser/Node/Stmt/TraitUse.php | 34 - .../Node/Stmt/TraitUseAdaptation.php | 13 - .../Node/Stmt/TraitUseAdaptation/Alias.php | 38 - .../Stmt/TraitUseAdaptation/Precedence.php | 34 - .../lib/PhpParser/Node/Stmt/Trait_.php | 32 - .../lib/PhpParser/Node/Stmt/TryCatch.php | 38 - .../lib/PhpParser/Node/Stmt/Unset_.php | 30 - .../lib/PhpParser/Node/Stmt/UseUse.php | 52 - .../lib/PhpParser/Node/Stmt/Use_.php | 47 - .../lib/PhpParser/Node/Stmt/While_.php | 34 - .../lib/PhpParser/Node/UnionType.php | 28 - .../lib/PhpParser/Node/VarLikeIdentifier.php | 17 - .../PhpParser/Node/VariadicPlaceholder.php | 27 - .../php-parser/lib/PhpParser/NodeAbstract.php | 178 - .../php-parser/lib/PhpParser/NodeDumper.php | 206 - .../php-parser/lib/PhpParser/NodeFinder.php | 81 - .../lib/PhpParser/NodeTraverser.php | 291 - .../lib/PhpParser/NodeTraverserInterface.php | 29 - .../php-parser/lib/PhpParser/NodeVisitor.php | 72 - .../PhpParser/NodeVisitor/CloningVisitor.php | 20 - .../PhpParser/NodeVisitor/FindingVisitor.php | 48 - .../NodeVisitor/FirstFindingVisitor.php | 50 - .../PhpParser/NodeVisitor/NameResolver.php | 257 - .../NodeVisitor/NodeConnectingVisitor.php | 52 - .../NodeVisitor/ParentConnectingVisitor.php | 41 - .../lib/PhpParser/NodeVisitorAbstract.php | 25 - .../nikic/php-parser/lib/PhpParser/Parser.php | 18 - .../lib/PhpParser/Parser/Multiple.php | 55 - .../php-parser/lib/PhpParser/Parser/Php5.php | 2672 --- .../php-parser/lib/PhpParser/Parser/Php7.php | 2829 --- .../lib/PhpParser/Parser/Tokens.php | 148 - .../lib/PhpParser/ParserAbstract.php | 1038 - .../lib/PhpParser/ParserFactory.php | 44 - .../lib/PhpParser/PrettyPrinter/Standard.php | 1105 - .../lib/PhpParser/PrettyPrinterAbstract.php | 1506 -- vendor/openlss/lib-array2xml/.gitignore | 3 - vendor/openlss/lib-array2xml/COPYING | 674 - vendor/openlss/lib-array2xml/COPYING LESSER | 165 - .../openlss/lib-array2xml/LSS/Array2XML.php | 209 - .../openlss/lib-array2xml/LSS/XML2Array.php | 173 - vendor/openlss/lib-array2xml/README.md | 72 - vendor/openlss/lib-array2xml/composer.json | 33 - .../reflection-common/.github/dependabot.yml | 7 - .../.github/workflows/push.yml | 223 - .../phpdocumentor/reflection-common/LICENSE | 22 - .../phpdocumentor/reflection-common/README.md | 11 - .../reflection-common/composer.json | 28 - .../reflection-common/src/Element.php | 30 - .../reflection-common/src/File.php | 35 - .../reflection-common/src/Fqsen.php | 89 - .../reflection-common/src/Location.php | 53 - .../reflection-common/src/Project.php | 25 - .../reflection-common/src/ProjectFactory.php | 28 - .../phpdocumentor/reflection-docblock/LICENSE | 21 - .../reflection-docblock/README.md | 75 - .../reflection-docblock/composer.json | 42 - .../reflection-docblock/src/DocBlock.php | 228 - .../src/DocBlock/Description.php | 115 - .../src/DocBlock/DescriptionFactory.php | 178 - .../src/DocBlock/ExampleFinder.php | 159 - .../src/DocBlock/Serializer.php | 157 - .../src/DocBlock/StandardTagFactory.php | 348 - .../reflection-docblock/src/DocBlock/Tag.php | 31 - .../src/DocBlock/TagFactory.php | 84 - .../src/DocBlock/Tags/Author.php | 102 - .../src/DocBlock/Tags/BaseTag.php | 53 - .../src/DocBlock/Tags/Covers.php | 101 - .../src/DocBlock/Tags/Deprecated.php | 109 - .../src/DocBlock/Tags/Example.php | 200 - .../DocBlock/Tags/Factory/StaticMethod.php | 25 - .../src/DocBlock/Tags/Formatter.php | 24 - .../Tags/Formatter/AlignFormatter.php | 50 - .../Tags/Formatter/PassthroughFormatter.php | 30 - .../src/DocBlock/Tags/Generic.php | 89 - .../src/DocBlock/Tags/InvalidTag.php | 145 - .../src/DocBlock/Tags/Link.php | 78 - .../src/DocBlock/Tags/Method.php | 279 - .../src/DocBlock/Tags/Param.php | 174 - .../src/DocBlock/Tags/Property.php | 121 - .../src/DocBlock/Tags/PropertyRead.php | 121 - .../src/DocBlock/Tags/PropertyWrite.php | 121 - .../src/DocBlock/Tags/Reference/Fqsen.php | 38 - .../src/DocBlock/Tags/Reference/Reference.php | 22 - .../src/DocBlock/Tags/Reference/Url.php | 36 - .../src/DocBlock/Tags/Return_.php | 64 - .../src/DocBlock/Tags/See.php | 106 - .../src/DocBlock/Tags/Since.php | 103 - .../src/DocBlock/Tags/Source.php | 116 - .../src/DocBlock/Tags/TagWithType.php | 66 - .../src/DocBlock/Tags/Throws.php | 64 - .../src/DocBlock/Tags/Uses.php | 100 - .../src/DocBlock/Tags/Var_.php | 122 - .../src/DocBlock/Tags/Version.php | 106 - .../src/DocBlockFactory.php | 287 - .../src/DocBlockFactoryInterface.php | 23 - .../src/Exception/PcreException.php | 44 - .../reflection-docblock/src/Utils.php | 62 - vendor/phpdocumentor/type-resolver/LICENSE | 21 - vendor/phpdocumentor/type-resolver/README.md | 177 - .../phpdocumentor/type-resolver/composer.json | 35 - .../type-resolver/src/FqsenResolver.php | 80 - .../type-resolver/src/PseudoType.php | 19 - .../src/PseudoTypes/CallableString.php | 39 - .../type-resolver/src/PseudoTypes/False_.php | 40 - .../src/PseudoTypes/HtmlEscapedString.php | 39 - .../src/PseudoTypes/IntegerRange.php | 61 - .../type-resolver/src/PseudoTypes/List_.php | 50 - .../src/PseudoTypes/LiteralString.php | 39 - .../src/PseudoTypes/LowercaseString.php | 39 - .../src/PseudoTypes/NegativeInteger.php | 39 - .../PseudoTypes/NonEmptyLowercaseString.php | 39 - .../src/PseudoTypes/NonEmptyString.php | 39 - .../src/PseudoTypes/NumericString.php | 39 - .../src/PseudoTypes/Numeric_.php | 47 - .../src/PseudoTypes/PositiveInteger.php | 39 - .../src/PseudoTypes/TraitString.php | 39 - .../type-resolver/src/PseudoTypes/True_.php | 40 - .../phpdocumentor/type-resolver/src/Type.php | 25 - .../type-resolver/src/TypeResolver.php | 700 - .../type-resolver/src/Types/AbstractList.php | 83 - .../src/Types/AggregatedType.php | 125 - .../type-resolver/src/Types/ArrayKey.php | 42 - .../type-resolver/src/Types/Array_.php | 29 - .../type-resolver/src/Types/Boolean.php | 32 - .../type-resolver/src/Types/Callable_.php | 32 - .../type-resolver/src/Types/ClassString.php | 62 - .../type-resolver/src/Types/Collection.php | 68 - .../type-resolver/src/Types/Compound.php | 38 - .../type-resolver/src/Types/Context.php | 95 - .../src/Types/ContextFactory.php | 420 - .../type-resolver/src/Types/Expression.php | 51 - .../type-resolver/src/Types/Float_.php | 32 - .../type-resolver/src/Types/Integer.php | 32 - .../src/Types/InterfaceString.php | 56 - .../type-resolver/src/Types/Intersection.php | 37 - .../type-resolver/src/Types/Iterable_.php | 38 - .../type-resolver/src/Types/Mixed_.php | 32 - .../type-resolver/src/Types/Never_.php | 35 - .../type-resolver/src/Types/Null_.php | 32 - .../type-resolver/src/Types/Nullable.php | 51 - .../type-resolver/src/Types/Object_.php | 69 - .../type-resolver/src/Types/Parent_.php | 34 - .../type-resolver/src/Types/Resource_.php | 32 - .../type-resolver/src/Types/Scalar.php | 32 - .../type-resolver/src/Types/Self_.php | 34 - .../type-resolver/src/Types/Static_.php | 39 - .../type-resolver/src/Types/String_.php | 32 - .../type-resolver/src/Types/This.php | 35 - .../type-resolver/src/Types/Void_.php | 35 - vendor/psr/log/LICENSE | 19 - vendor/psr/log/Psr/Log/AbstractLogger.php | 128 - .../log/Psr/Log/InvalidArgumentException.php | 7 - vendor/psr/log/Psr/Log/LogLevel.php | 18 - .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 - vendor/psr/log/Psr/Log/LoggerAwareTrait.php | 26 - vendor/psr/log/Psr/Log/LoggerInterface.php | 125 - vendor/psr/log/Psr/Log/LoggerTrait.php | 142 - vendor/psr/log/Psr/Log/NullLogger.php | 30 - vendor/psr/log/Psr/Log/Test/DummyTest.php | 18 - .../log/Psr/Log/Test/LoggerInterfaceTest.php | 138 - vendor/psr/log/Psr/Log/Test/TestLogger.php | 147 - vendor/psr/log/README.md | 58 - vendor/psr/log/composer.json | 26 - vendor/sebastian/diff/ChangeLog.md | 88 - vendor/sebastian/diff/LICENSE | 33 - vendor/sebastian/diff/README.md | 202 - vendor/sebastian/diff/composer.json | 47 - vendor/sebastian/diff/src/Chunk.php | 89 - vendor/sebastian/diff/src/Diff.php | 64 - vendor/sebastian/diff/src/Differ.php | 327 - .../src/Exception/ConfigurationException.php | 38 - .../diff/src/Exception/Exception.php | 16 - .../Exception/InvalidArgumentException.php | 14 - vendor/sebastian/diff/src/Line.php | 45 - .../LongestCommonSubsequenceCalculator.php | 18 - ...ientLongestCommonSubsequenceCalculator.php | 88 - .../src/Output/AbstractChunkOutputBuilder.php | 52 - .../diff/src/Output/DiffOnlyOutputBuilder.php | 72 - .../src/Output/DiffOutputBuilderInterface.php | 19 - .../Output/StrictUnifiedDiffOutputBuilder.php | 338 - .../src/Output/UnifiedDiffOutputBuilder.php | 272 - vendor/sebastian/diff/src/Parser.php | 110 - ...ientLongestCommonSubsequenceCalculator.php | 70 - vendor/vimeo/psalm/LICENSE | 21 - vendor/vimeo/psalm/composer.json | 134 - vendor/vimeo/psalm/config.xsd | 708 - vendor/vimeo/psalm/dictionaries/CallMap.php | 16820 ---------------- .../psalm/dictionaries/CallMap_71_delta.php | 76 - .../psalm/dictionaries/CallMap_72_delta.php | 230 - .../psalm/dictionaries/CallMap_73_delta.php | 72 - .../psalm/dictionaries/CallMap_74_delta.php | 50 - .../psalm/dictionaries/CallMap_80_delta.php | 1683 -- .../psalm/dictionaries/CallMap_81_delta.php | 1133 -- .../psalm/dictionaries/CallMap_historical.php | 16618 --------------- .../dictionaries/InternalTaintSinkMap.php | 65 - .../vimeo/psalm/dictionaries/PropertyMap.php | 542 - vendor/vimeo/psalm/psalm | 7 - vendor/vimeo/psalm/psalm-language-server | 7 - vendor/vimeo/psalm/psalm-plugin | 7 - vendor/vimeo/psalm/psalm-refactor | 7 - vendor/vimeo/psalm/psalter | 7 - vendor/vimeo/psalm/src/Psalm/Aliases.php | 74 - vendor/vimeo/psalm/src/Psalm/CodeLocation.php | 392 - .../CodeLocation/DocblockTypeLocation.php | 30 - .../Psalm/CodeLocation/ParseErrorLocation.php | 35 - .../psalm/src/Psalm/CodeLocation/Raw.php | 33 - vendor/vimeo/psalm/src/Psalm/Codebase.php | 2013 -- vendor/vimeo/psalm/src/Psalm/Config.php | 2403 --- .../vimeo/psalm/src/Psalm/Config/Creator.php | 296 - .../src/Psalm/Config/ErrorLevelFileFilter.php | 68 - .../psalm/src/Psalm/Config/FileFilter.php | 559 - .../psalm/src/Psalm/Config/IssueHandler.php | 174 - .../src/Psalm/Config/ProjectFileFilter.php | 95 - .../Psalm/Config/TaintAnalysisFileFilter.php | 7 - vendor/vimeo/psalm/src/Psalm/Context.php | 855 - vendor/vimeo/psalm/src/Psalm/DocComment.php | 245 - .../vimeo/psalm/src/Psalm/ErrorBaseline.php | 331 - .../Exception/CircularReferenceException.php | 9 - .../src/Psalm/Exception/CodeException.php | 9 - .../ComplicatedExpressionException.php | 9 - .../Exception/ConfigCreationException.php | 9 - .../src/Psalm/Exception/ConfigException.php | 9 - .../Exception/ConfigNotFoundException.php | 7 - .../Exception/DocblockParseException.php | 9 - .../Psalm/Exception/FileIncludeException.php | 9 - .../Exception/IncorrectDocblockException.php | 7 - .../InvalidClasslikeOverrideException.php | 9 - .../InvalidMethodOverrideException.php | 9 - .../src/Psalm/Exception/RefactorException.php | 9 - .../Exception/ScopeAnalysisException.php | 9 - .../Exception/TypeParseTreeException.php | 9 - .../Exception/UnanalyzedFileException.php | 9 - .../UnpopulatedClasslikeException.php | 16 - .../Exception/UnpreparedAnalysisException.php | 9 - .../UnsupportedIssueToFixException.php | 10 - .../src/Psalm/FileBasedPluginAdapter.php | 70 - .../psalm/src/Psalm/FileManipulation.php | 83 - vendor/vimeo/psalm/src/Psalm/FileSource.php | 16 - .../psalm/src/Psalm/Internal/Algebra.php | 630 - .../Internal/Algebra/FormulaGenerator.php | 457 - .../Internal/Analyzer/AlgebraAnalyzer.php | 174 - .../Internal/Analyzer/AttributesAnalyzer.php | 394 - .../src/Psalm/Internal/Analyzer/CanAlias.php | 162 - .../Psalm/Internal/Analyzer/ClassAnalyzer.php | 2638 --- .../Internal/Analyzer/ClassLikeAnalyzer.php | 648 - .../Analyzer/ClassLikeNameOptions.php | 40 - .../Internal/Analyzer/ClosureAnalyzer.php | 343 - .../Internal/Analyzer/CommentAnalyzer.php | 391 - .../Internal/Analyzer/DataFlowNodeData.php | 90 - .../Psalm/Internal/Analyzer/FileAnalyzer.php | 682 - .../Internal/Analyzer/FunctionAnalyzer.php | 124 - .../FunctionLike/ReturnTypeAnalyzer.php | 978 - .../FunctionLike/ReturnTypeCollector.php | 384 - .../Analyzer/FunctionLikeAnalyzer.php | 2023 -- .../Internal/Analyzer/InterfaceAnalyzer.php | 147 - .../src/Psalm/Internal/Analyzer/IssueData.php | 175 - .../Internal/Analyzer/MethodAnalyzer.php | 290 - .../Internal/Analyzer/MethodComparator.php | 1080 - .../Internal/Analyzer/NamespaceAnalyzer.php | 280 - .../Internal/Analyzer/ProjectAnalyzer.php | 1527 -- .../Psalm/Internal/Analyzer/ScopeAnalyzer.php | 529 - .../Internal/Analyzer/SourceAnalyzer.php | 182 - .../Analyzer/Statements/Block/DoAnalyzer.php | 210 - .../Analyzer/Statements/Block/ForAnalyzer.php | 190 - .../Statements/Block/ForeachAnalyzer.php | 1149 -- .../Block/IfConditionalAnalyzer.php | 377 - .../Statements/Block/IfElse/ElseAnalyzer.php | 242 - .../Block/IfElse/ElseIfAnalyzer.php | 439 - .../Statements/Block/IfElse/IfAnalyzer.php | 532 - .../Statements/Block/IfElseAnalyzer.php | 509 - .../Statements/Block/LoopAnalyzer.php | 735 - .../Statements/Block/SwitchAnalyzer.php | 234 - .../Statements/Block/SwitchCaseAnalyzer.php | 769 - .../Analyzer/Statements/Block/TryAnalyzer.php | 516 - .../Statements/Block/WhileAnalyzer.php | 139 - .../Analyzer/Statements/BreakAnalyzer.php | 95 - .../Analyzer/Statements/ContinueAnalyzer.php | 100 - .../Analyzer/Statements/EchoAnalyzer.php | 135 - .../Statements/Expression/ArrayAnalyzer.php | 607 - .../Expression/ArrayCreationInfo.php | 55 - .../Statements/Expression/AssertionFinder.php | 4122 ---- .../Assignment/ArrayAssignmentAnalyzer.php | 1027 - .../Assignment/AssignedProperty.php | 33 - .../InstancePropertyAssignmentAnalyzer.php | 1540 -- .../StaticPropertyAssignmentAnalyzer.php | 342 - .../Expression/AssignmentAnalyzer.php | 1728 -- .../Expression/BinaryOp/AndAnalyzer.php | 232 - .../BinaryOp/ArithmeticOpAnalyzer.php | 1373 -- .../Expression/BinaryOp/CoalesceAnalyzer.php | 89 - .../Expression/BinaryOp/ConcatAnalyzer.php | 432 - .../BinaryOp/NonComparisonOpAnalyzer.php | 134 - .../Expression/BinaryOp/OrAnalyzer.php | 411 - .../Expression/BinaryOpAnalyzer.php | 530 - .../Expression/BitwiseNotAnalyzer.php | 124 - .../Expression/BooleanNotAnalyzer.php | 46 - .../Expression/Call/ArgumentAnalyzer.php | 1629 -- .../Expression/Call/ArgumentMapPopulator.php | 142 - .../Expression/Call/ArgumentsAnalyzer.php | 1620 -- .../Call/ArrayFunctionArgumentsAnalyzer.php | 957 - .../Call/ClassTemplateParamCollector.php | 282 - .../Expression/Call/FunctionCallAnalyzer.php | 1129 -- .../Expression/Call/FunctionCallInfo.php | 87 - .../Call/FunctionCallReturnTypeFetcher.php | 861 - .../Call/Method/AtomicCallContext.php | 22 - .../Method/AtomicMethodCallAnalysisResult.php | 89 - .../Call/Method/AtomicMethodCallAnalyzer.php | 890 - .../ExistingAtomicMethodCallAnalyzer.php | 673 - .../Method/MethodCallProhibitionAnalyzer.php | 70 - .../Call/Method/MethodCallPurityAnalyzer.php | 173 - .../Method/MethodCallReturnTypeFetcher.php | 634 - .../Call/Method/MethodVisibilityAnalyzer.php | 196 - .../Call/Method/MissingMethodCallHandler.php | 454 - .../Expression/Call/MethodCallAnalyzer.php | 437 - .../Call/NamedFunctionCallHandler.php | 586 - .../Expression/Call/NewAnalyzer.php | 866 - .../Expression/Call/StaticCallAnalyzer.php | 382 - .../StaticMethod/AtomicStaticCallAnalyzer.php | 1136 -- .../ExistingAtomicStaticCallAnalyzer.php | 642 - .../Statements/Expression/CallAnalyzer.php | 1171 -- .../Statements/Expression/CastAnalyzer.php | 538 - .../Statements/Expression/CloneAnalyzer.php | 148 - .../Statements/Expression/EmptyAnalyzer.php | 52 - .../Expression/EncapsulatedStringAnalyzer.php | 142 - .../Statements/Expression/EvalAnalyzer.php | 85 - .../Statements/Expression/ExitAnalyzer.php | 145 - .../Expression/ExpressionIdentifier.php | 224 - .../Expression/Fetch/ArrayFetchAnalyzer.php | 2060 -- .../Fetch/AtomicPropertyFetchAnalyzer.php | 1217 -- .../Fetch/ClassConstFetchAnalyzer.php | 679 - .../Expression/Fetch/ConstFetchAnalyzer.php | 309 - .../Fetch/InstancePropertyFetchAnalyzer.php | 482 - .../Fetch/StaticPropertyFetchAnalyzer.php | 486 - .../Fetch/VariableFetchAnalyzer.php | 559 - .../Expression/IncDecExpressionAnalyzer.php | 138 - .../Statements/Expression/IncludeAnalyzer.php | 423 - .../Expression/InstanceofAnalyzer.php | 95 - .../Statements/Expression/IssetAnalyzer.php | 49 - .../Expression/MagicConstAnalyzer.php | 107 - .../Statements/Expression/MatchAnalyzer.php | 351 - .../Expression/NullsafeAnalyzer.php | 98 - .../Statements/Expression/PrintAnalyzer.php | 109 - .../Expression/SimpleTypeInferer.php | 760 - .../Statements/Expression/TernaryAnalyzer.php | 306 - .../Expression/UnaryPlusMinusAnalyzer.php | 134 - .../Statements/Expression/YieldAnalyzer.php | 219 - .../Expression/YieldFromAnalyzer.php | 82 - .../Statements/ExpressionAnalyzer.php | 514 - .../Analyzer/Statements/GlobalAnalyzer.php | 83 - .../Analyzer/Statements/ReturnAnalyzer.php | 658 - .../Analyzer/Statements/StaticAnalyzer.php | 188 - .../Analyzer/Statements/ThrowAnalyzer.php | 93 - .../Analyzer/Statements/UnsetAnalyzer.php | 138 - .../Statements/UnusedAssignmentRemover.php | 357 - .../Internal/Analyzer/StatementsAnalyzer.php | 1076 - .../Psalm/Internal/Analyzer/TraitAnalyzer.php | 76 - .../Psalm/Internal/Analyzer/TypeAnalyzer.php | 118 - .../vimeo/psalm/src/Psalm/Internal/Clause.php | 295 - .../src/Psalm/Internal/Cli/LanguageServer.php | 323 - .../psalm/src/Psalm/Internal/Cli/Plugin.php | 46 - .../psalm/src/Psalm/Internal/Cli/Psalm.php | 1176 -- .../psalm/src/Psalm/Internal/Cli/Psalter.php | 578 - .../psalm/src/Psalm/Internal/Cli/Refactor.php | 330 - .../psalm/src/Psalm/Internal/CliUtils.php | 665 - .../src/Psalm/Internal/Codebase/Analyzer.php | 1644 -- .../ClassConstantByWildcardResolver.php | 61 - .../Psalm/Internal/Codebase/ClassLikes.php | 2331 --- .../Codebase/ConstantTypeResolver.php | 363 - .../Psalm/Internal/Codebase/DataFlowGraph.php | 159 - .../src/Psalm/Internal/Codebase/Functions.php | 603 - .../Codebase/InternalCallMapHandler.php | 437 - .../src/Psalm/Internal/Codebase/Methods.php | 1255 -- .../src/Psalm/Internal/Codebase/Populator.php | 1224 -- .../Psalm/Internal/Codebase/Properties.php | 356 - .../Psalm/Internal/Codebase/PropertyMap.php | 46 - .../Codebase/ReferenceMapGenerator.php | 61 - .../Psalm/Internal/Codebase/Reflection.php | 548 - .../src/Psalm/Internal/Codebase/Scanner.php | 811 - .../Internal/Codebase/TaintFlowGraph.php | 524 - .../Internal/Codebase/VariableUseGraph.php | 224 - .../psalm/src/Psalm/Internal/Composer.php | 43 - .../Psalm/Internal/DataFlow/DataFlowNode.php | 137 - .../src/Psalm/Internal/DataFlow/Path.php | 33 - .../src/Psalm/Internal/DataFlow/TaintSink.php | 7 - .../Psalm/Internal/DataFlow/TaintSource.php | 7 - .../src/Psalm/Internal/Diff/AstDiffer.php | 129 - .../Internal/Diff/ClassStatementsDiffer.php | 251 - .../src/Psalm/Internal/Diff/DiffElem.php | 37 - .../src/Psalm/Internal/Diff/FileDiffer.php | 319 - .../Internal/Diff/FileStatementsDiffer.php | 172 - .../Diff/NamespaceStatementsDiffer.php | 144 - .../psalm/src/Psalm/Internal/ErrorHandler.php | 90 - .../src/Psalm/Internal/EventDispatcher.php | 621 - .../BuildInfoCollector.php | 321 - .../ExecutionEnvironment/GitInfoCollector.php | 142 - .../SystemCommandExecutor.php | 42 - .../ClassDocblockManipulator.php | 141 - .../FileManipulation/CodeMigration.php | 38 - .../FileManipulationBuffer.php | 245 - .../FunctionDocblockManipulator.php | 579 - .../PropertyDocblockManipulator.php | 281 - .../src/Psalm/Internal/Fork/ForkMessage.php | 7 - .../Internal/Fork/ForkProcessDoneMessage.php | 20 - .../Internal/Fork/ForkProcessErrorMessage.php | 17 - .../Internal/Fork/ForkTaskDoneMessage.php | 20 - .../psalm/src/Psalm/Internal/Fork/Pool.php | 492 - .../Psalm/Internal/Fork/PsalmRestarter.php | 68 - .../src/Psalm/Internal/IncludeCollector.php | 55 - .../psalm/src/Psalm/Internal/Json/Json.php | 46 - .../LanguageServer/Client/TextDocument.php | 79 - .../Internal/LanguageServer/ClientHandler.php | 111 - .../LanguageServer/EmitterInterface.php | 71 - .../Internal/LanguageServer/EmitterTrait.php | 157 - .../Internal/LanguageServer/IdGenerator.php | 25 - .../LanguageServer/LanguageClient.php | 64 - .../LanguageServer/LanguageServer.php | 575 - .../Psalm/Internal/LanguageServer/Message.php | 73 - .../LanguageServer/ProtocolReader.php | 15 - .../LanguageServer/ProtocolStreamReader.php | 148 - .../LanguageServer/ProtocolStreamWriter.php | 35 - .../LanguageServer/ProtocolWriter.php | 18 - .../LanguageServer/Server/TextDocument.php | 410 - .../LanguageServer/Server/Workspace.php | 78 - .../src/Psalm/Internal/MethodIdentifier.php | 70 - .../Internal/PhpTraverser/CustomTraverser.php | 174 - .../PhpVisitor/AssignmentMapVisitor.php | 117 - .../PhpVisitor/CheckTrivialExprVisitor.php | 80 - .../Internal/PhpVisitor/CloningVisitor.php | 40 - .../PhpVisitor/ConditionCloningVisitor.php | 39 - .../PhpVisitor/NodeCleanerVisitor.php | 28 - .../PhpVisitor/NodeCounterVisitor.php | 21 - .../PhpVisitor/OffsetShifterVisitor.php | 70 - .../PhpVisitor/ParamReplacementVisitor.php | 122 - .../PhpVisitor/PartialParserVisitor.php | 409 - .../Reflector/AttributeResolver.php | 80 - .../Reflector/ClassLikeDocblockParser.php | 562 - .../Reflector/ClassLikeNodeScanner.php | 1861 -- .../Reflector/ExpressionResolver.php | 450 - .../Reflector/ExpressionScanner.php | 332 - .../Reflector/FunctionLikeDocblockParser.php | 697 - .../Reflector/FunctionLikeDocblockScanner.php | 1454 -- .../Reflector/FunctionLikeNodeScanner.php | 1151 -- .../PhpVisitor/Reflector/TypeHintResolver.php | 111 - .../Internal/PhpVisitor/ReflectorVisitor.php | 650 - .../PhpVisitor/ShortClosureVisitor.php | 35 - .../PhpVisitor/SimpleNameResolver.php | 252 - .../Psalm/Internal/PhpVisitor/TraitFinder.php | 84 - .../PhpVisitor/TypeMappingVisitor.php | 41 - .../PluginManager/Command/DisableCommand.php | 86 - .../PluginManager/Command/EnableCommand.php | 86 - .../PluginManager/Command/ShowCommand.php | 98 - .../Internal/PluginManager/ComposerLock.php | 111 - .../Internal/PluginManager/ConfigFile.php | 152 - .../Internal/PluginManager/PluginList.php | 120 - .../PluginManager/PluginListFactory.php | 76 - .../AddRemoveTaints/HtmlFunctionTainter.php | 115 - .../ClassLikeStorageCacheProvider.php | 182 - .../Provider/ClassLikeStorageProvider.php | 138 - .../Internal/Provider/FakeFileProvider.php | 75 - .../Psalm/Internal/Provider/FileProvider.php | 163 - .../Provider/FileReferenceCacheProvider.php | 1007 - .../Provider/FileReferenceProvider.php | 1320 -- .../Provider/FileStorageCacheProvider.php | 184 - .../Internal/Provider/FileStorageProvider.php | 131 - .../Provider/FunctionExistenceProvider.php | 117 - .../Provider/FunctionParamsProvider.php | 139 - .../Provider/FunctionReturnTypeProvider.php | 205 - .../Provider/MethodExistenceProvider.php | 126 - .../Provider/MethodParamsProvider.php | 148 - .../Provider/MethodReturnTypeProvider.php | 170 - .../Provider/MethodVisibilityProvider.php | 133 - .../Internal/Provider/NodeDataProvider.php | 133 - .../Internal/Provider/ParserCacheProvider.php | 399 - .../Provider/ProjectCacheProvider.php | 141 - .../Provider/PropertyExistenceProvider.php | 138 - .../Provider/PropertyTypeProvider.php | 140 - .../DomDocumentPropertyTypeProvider.php | 33 - .../Provider/PropertyVisibilityProvider.php | 138 - .../src/Psalm/Internal/Provider/Providers.php | 66 - .../ArrayChunkReturnTypeProvider.php | 55 - .../ArrayColumnReturnTypeProvider.php | 142 - .../ArrayFillReturnTypeProvider.php | 111 - .../ArrayFilterReturnTypeProvider.php | 331 - .../ArrayMapReturnTypeProvider.php | 499 - .../ArrayMergeReturnTypeProvider.php | 287 - .../ArrayPadReturnTypeProvider.php | 68 - ...rayPointerAdjustmentReturnTypeProvider.php | 105 - .../ArrayPopReturnTypeProvider.php | 96 - .../ArrayRandReturnTypeProvider.php | 76 - .../ArrayReduceReturnTypeProvider.php | 298 - .../ArrayReverseReturnTypeProvider.php | 68 - .../ArraySliceReturnTypeProvider.php | 98 - .../ArraySpliceReturnTypeProvider.php | 76 - .../ArrayUniqueReturnTypeProvider.php | 80 - .../ArrayValuesReturnTypeProvider.php | 88 - .../ClosureFromCallableReturnTypeProvider.php | 70 - .../ReturnTypeProvider/DomNodeAppendChild.php | 42 - .../ExplodeReturnTypeProvider.php | 102 - .../FilterVarReturnTypeProvider.php | 170 - .../FirstArgStringReturnTypeProvider.php | 47 - .../GetClassMethodsReturnTypeProvider.php | 41 - .../GetObjectVarsReturnTypeProvider.php | 131 - .../HexdecReturnTypeProvider.php | 30 - .../ImagickPixelColorReturnTypeProvider.php | 88 - .../InArrayReturnTypeProvider.php | 84 - .../IteratorToArrayReturnTypeProvider.php | 129 - .../MinMaxReturnTypeProvider.php | 143 - .../MktimeReturnTypeProvider.php | 51 - .../ParseUrlReturnTypeProvider.php | 163 - .../PdoStatementReturnTypeProvider.php | 115 - .../PdoStatementSetFetchMode.php | 111 - .../RandReturnTypeProvider.php | 70 - .../SimpleXmlElementAsXml.php | 31 - .../StrReplaceReturnTypeProvider.php | 64 - .../StrTrReturnTypeProvider.php | 72 - .../TriggerErrorReturnTypeProvider.php | 74 - .../VersionCompareReturnTypeProvider.php | 82 - .../Internal/Provider/StatementsProvider.php | 538 - .../Provider/StatementsVolatileCache.php | 108 - .../Psalm/Internal/ReferenceConstraint.php | 36 - .../src/Psalm/Internal/RuntimeCaches.php | 44 - .../Scanner/ClassLikeDocblockComment.php | 147 - .../Psalm/Internal/Scanner/DocblockParser.php | 300 - .../Psalm/Internal/Scanner/FileScanner.php | 117 - .../Scanner/FunctionDocblockComment.php | 228 - .../Psalm/Internal/Scanner/ParsedDocblock.php | 95 - .../Internal/Scanner/PhpStormMetaScanner.php | 398 - .../UnresolvedConstant/ArrayOffsetFetch.php | 23 - .../UnresolvedConstant/ArraySpread.php | 19 - .../Scanner/UnresolvedConstant/ArrayValue.php | 20 - .../UnresolvedConstant/ClassConstant.php | 23 - .../Scanner/UnresolvedConstant/Constant.php | 23 - .../UnresolvedConstant/KeyValuePair.php | 23 - .../UnresolvedConstant/ScalarValue.php | 20 - .../UnresolvedAdditionOp.php | 10 - .../UnresolvedConstant/UnresolvedBinaryOp.php | 23 - .../UnresolvedBitwiseAnd.php | 10 - .../UnresolvedBitwiseOr.php | 10 - .../UnresolvedBitwiseXor.php | 10 - .../UnresolvedConstant/UnresolvedConcatOp.php | 10 - .../UnresolvedDivisionOp.php | 10 - .../UnresolvedMultiplicationOp.php | 10 - .../UnresolvedSubtractionOp.php | 10 - .../UnresolvedConstant/UnresolvedTernary.php | 28 - .../Scanner/UnresolvedConstantComponent.php | 10 - .../Internal/Scanner/VarDocblockComment.php | 86 - .../src/Psalm/Internal/Scope/CaseScope.php | 32 - .../src/Psalm/Internal/Scope/FinallyScope.php | 24 - .../Internal/Scope/IfConditionalScope.php | 50 - .../src/Psalm/Internal/Scope/IfScope.php | 87 - .../src/Psalm/Internal/Scope/LoopScope.php | 74 - .../src/Psalm/Internal/Scope/SwitchScope.php | 53 - .../Generator/ClassLikeStubGenerator.php | 314 - .../Stubs/Generator/StubsGenerator.php | 480 - .../src/Psalm/Internal/Type/ArrayType.php | 63 - .../Internal/Type/AssertionReconciler.php | 1816 -- .../Type/Comparator/ArrayTypeComparator.php | 293 - .../Type/Comparator/AtomicTypeComparator.php | 712 - .../Comparator/CallableTypeComparator.php | 524 - .../Comparator/ClassLikeStringComparator.php | 92 - .../Type/Comparator/GenericTypeComparator.php | 207 - .../Comparator/IntegerRangeComparator.php | 180 - .../Type/Comparator/KeyedArrayComparator.php | 166 - .../Type/Comparator/ObjectComparator.php | 311 - .../Type/Comparator/ScalarTypeComparator.php | 640 - .../Type/Comparator/TypeComparisonResult.php | 43 - .../Type/Comparator/UnionTypeComparator.php | 499 - .../Type/NegatedAssertionReconciler.php | 425 - .../src/Psalm/Internal/Type/ParseTree.php | 43 - .../Type/ParseTree/CallableParamTree.php | 21 - .../Internal/Type/ParseTree/CallableTree.php | 27 - .../ParseTree/CallableWithReturnTypeTree.php | 12 - .../Type/ParseTree/ConditionalTree.php | 22 - .../Type/ParseTree/EncapsulationTree.php | 16 - .../Internal/Type/ParseTree/GenericTree.php | 27 - .../Type/ParseTree/IndexedAccessTree.php | 22 - .../Type/ParseTree/IntersectionTree.php | 12 - .../Type/ParseTree/KeyedArrayPropertyTree.php | 22 - .../Type/ParseTree/KeyedArrayTree.php | 27 - .../Type/ParseTree/MethodParamTree.php | 43 - .../Internal/Type/ParseTree/MethodTree.php | 22 - .../ParseTree/MethodWithReturnTypeTree.php | 12 - .../Internal/Type/ParseTree/NullableTree.php | 12 - .../Psalm/Internal/Type/ParseTree/Root.php | 12 - .../Type/ParseTree/TemplateAsTree.php | 28 - .../Type/ParseTree/TemplateIsTree.php | 22 - .../Internal/Type/ParseTree/UnionTree.php | 12 - .../Psalm/Internal/Type/ParseTree/Value.php | 48 - .../Psalm/Internal/Type/ParseTreeCreator.php | 842 - .../Type/SimpleAssertionReconciler.php | 2554 --- .../Type/SimpleNegatedAssertionReconciler.php | 1819 -- .../src/Psalm/Internal/Type/TemplateBound.php | 52 - .../Type/TemplateInferredTypeReplacer.php | 416 - .../Psalm/Internal/Type/TemplateResult.php | 73 - .../Type/TemplateStandinTypeReplacer.php | 1249 -- .../src/Psalm/Internal/Type/TypeAlias.php | 7 - .../Type/TypeAlias/ClassTypeAlias.php | 22 - .../Type/TypeAlias/InlineTypeAlias.php | 24 - .../Type/TypeAlias/LinkableTypeAlias.php | 35 - .../Psalm/Internal/Type/TypeCombination.php | 99 - .../src/Psalm/Internal/Type/TypeCombiner.php | 1528 -- .../src/Psalm/Internal/Type/TypeExpander.php | 909 - .../src/Psalm/Internal/Type/TypeParser.php | 1336 -- .../src/Psalm/Internal/Type/TypeTokenizer.php | 511 - .../TypeVisitor/ContainsClassLikeVisitor.php | 63 - .../TypeVisitor/ContainsLiteralVisitor.php | 45 - .../TypeVisitor/FromDocblockSetter.php | 31 - .../TypeVisitor/TemplateTypeCollector.php | 50 - .../Internal/TypeVisitor/TypeChecker.php | 410 - .../Internal/TypeVisitor/TypeScanner.php | 89 - .../src/Psalm/Issue/AbstractInstantiation.php | 9 - .../src/Psalm/Issue/AbstractMethodCall.php | 9 - .../psalm/src/Psalm/Issue/ArgumentIssue.php | 24 - .../src/Psalm/Issue/ArgumentTypeCoercion.php | 9 - .../src/Psalm/Issue/AssignmentToVoid.php | 9 - .../src/Psalm/Issue/CircularReference.php | 9 - .../psalm/src/Psalm/Issue/ClassIssue.php | 22 - .../vimeo/psalm/src/Psalm/Issue/CodeIssue.php | 134 - .../psalm/src/Psalm/Issue/ComplexFunction.php | 9 - .../psalm/src/Psalm/Issue/ComplexMethod.php | 9 - .../psalm/src/Psalm/Issue/ConfigIssue.php | 9 - .../Issue/ConflictingReferenceConstraint.php | 9 - .../Issue/ConstructorSignatureMismatch.php | 9 - .../src/Psalm/Issue/ContinueOutsideLoop.php | 9 - .../psalm/src/Psalm/Issue/DeprecatedClass.php | 9 - .../src/Psalm/Issue/DeprecatedConstant.php | 9 - .../src/Psalm/Issue/DeprecatedFunction.php | 9 - .../src/Psalm/Issue/DeprecatedInterface.php | 9 - .../src/Psalm/Issue/DeprecatedMethod.php | 9 - .../src/Psalm/Issue/DeprecatedProperty.php | 9 - .../psalm/src/Psalm/Issue/DeprecatedTrait.php | 9 - .../Psalm/Issue/DocblockTypeContradiction.php | 17 - .../src/Psalm/Issue/DuplicateArrayKey.php | 9 - .../psalm/src/Psalm/Issue/DuplicateClass.php | 9 - .../src/Psalm/Issue/DuplicateConstant.php | 9 - .../src/Psalm/Issue/DuplicateEnumCase.php | 9 - .../Psalm/Issue/DuplicateEnumCaseValue.php | 9 - .../src/Psalm/Issue/DuplicateFunction.php | 9 - .../psalm/src/Psalm/Issue/DuplicateMethod.php | 9 - .../psalm/src/Psalm/Issue/DuplicateParam.php | 9 - .../src/Psalm/Issue/EmptyArrayAccess.php | 9 - .../Issue/ExtensionRequirementViolation.php | 9 - .../Psalm/Issue/FalsableReturnStatement.php | 9 - .../psalm/src/Psalm/Issue/FalseOperand.php | 9 - .../psalm/src/Psalm/Issue/ForbiddenCode.php | 9 - .../psalm/src/Psalm/Issue/ForbiddenEcho.php | 9 - .../psalm/src/Psalm/Issue/FunctionIssue.php | 24 - .../src/Psalm/Issue/IfThisIsMismatch.php | 9 - .../ImplementationRequirementViolation.php | 9 - .../Issue/ImplementedParamTypeMismatch.php | 9 - .../Issue/ImplementedReturnTypeMismatch.php | 9 - .../src/Psalm/Issue/ImplicitToStringCast.php | 9 - .../Issue/ImpureByReferenceAssignment.php | 9 - .../src/Psalm/Issue/ImpureFunctionCall.php | 9 - .../src/Psalm/Issue/ImpureMethodCall.php | 9 - .../Psalm/Issue/ImpurePropertyAssignment.php | 9 - .../src/Psalm/Issue/ImpurePropertyFetch.php | 9 - .../src/Psalm/Issue/ImpureStaticProperty.php | 9 - .../src/Psalm/Issue/ImpureStaticVariable.php | 9 - .../psalm/src/Psalm/Issue/ImpureVariable.php | 9 - .../Psalm/Issue/InaccessibleClassConstant.php | 9 - .../src/Psalm/Issue/InaccessibleMethod.php | 9 - .../src/Psalm/Issue/InaccessibleProperty.php | 9 - .../Psalm/Issue/InterfaceInstantiation.php | 9 - .../psalm/src/Psalm/Issue/InternalClass.php | 32 - .../psalm/src/Psalm/Issue/InternalMethod.php | 9 - .../src/Psalm/Issue/InternalProperty.php | 9 - .../psalm/src/Psalm/Issue/InvalidArgument.php | 9 - .../src/Psalm/Issue/InvalidArrayAccess.php | 9 - .../Psalm/Issue/InvalidArrayAssignment.php | 9 - .../src/Psalm/Issue/InvalidArrayOffset.php | 9 - .../src/Psalm/Issue/InvalidAttribute.php | 9 - .../psalm/src/Psalm/Issue/InvalidCast.php | 9 - .../psalm/src/Psalm/Issue/InvalidCatch.php | 9 - .../psalm/src/Psalm/Issue/InvalidClass.php | 9 - .../psalm/src/Psalm/Issue/InvalidClone.php | 9 - .../psalm/src/Psalm/Issue/InvalidDocblock.php | 9 - .../Psalm/Issue/InvalidDocblockParamName.php | 9 - .../Psalm/Issue/InvalidEnumBackingType.php | 9 - .../src/Psalm/Issue/InvalidEnumCaseValue.php | 9 - .../src/Psalm/Issue/InvalidExtendClass.php | 9 - .../Psalm/Issue/InvalidFalsableReturnType.php | 9 - .../src/Psalm/Issue/InvalidFunctionCall.php | 9 - .../psalm/src/Psalm/Issue/InvalidGlobal.php | 9 - .../psalm/src/Psalm/Issue/InvalidIterator.php | 9 - .../Psalm/Issue/InvalidLiteralArgument.php | 9 - .../src/Psalm/Issue/InvalidMethodCall.php | 9 - .../src/Psalm/Issue/InvalidNamedArgument.php | 9 - .../Psalm/Issue/InvalidNullableReturnType.php | 9 - .../psalm/src/Psalm/Issue/InvalidOperand.php | 9 - .../src/Psalm/Issue/InvalidParamDefault.php | 9 - .../psalm/src/Psalm/Issue/InvalidParent.php | 9 - .../Psalm/Issue/InvalidPassByReference.php | 9 - .../Psalm/Issue/InvalidPropertyAssignment.php | 9 - .../Issue/InvalidPropertyAssignmentValue.php | 9 - .../src/Psalm/Issue/InvalidPropertyFetch.php | 9 - .../Psalm/Issue/InvalidReturnStatement.php | 9 - .../src/Psalm/Issue/InvalidReturnType.php | 9 - .../src/Psalm/Issue/InvalidScalarArgument.php | 9 - .../psalm/src/Psalm/Issue/InvalidScope.php | 9 - .../Psalm/Issue/InvalidStaticInvocation.php | 9 - .../src/Psalm/Issue/InvalidStringClass.php | 9 - .../src/Psalm/Issue/InvalidTemplateParam.php | 9 - .../psalm/src/Psalm/Issue/InvalidThrow.php | 9 - .../psalm/src/Psalm/Issue/InvalidToString.php | 9 - .../InvalidTraversableImplementation.php | 9 - .../src/Psalm/Issue/InvalidTypeImport.php | 9 - .../LessSpecificImplementedReturnType.php | 9 - .../Issue/LessSpecificReturnStatement.php | 9 - .../Psalm/Issue/LessSpecificReturnType.php | 9 - .../src/Psalm/Issue/LoopInvalidation.php | 9 - .../psalm/src/Psalm/Issue/MethodIssue.php | 24 - .../Psalm/Issue/MethodSignatureMismatch.php | 9 - .../MethodSignatureMustOmitReturnType.php | 9 - .../MethodSignatureMustProvideReturnType.php | 9 - .../Issue/MismatchingDocblockParamType.php | 9 - .../Issue/MismatchingDocblockPropertyType.php | 9 - .../Issue/MismatchingDocblockReturnType.php | 9 - .../Psalm/Issue/MissingClosureParamType.php | 9 - .../Psalm/Issue/MissingClosureReturnType.php | 9 - .../src/Psalm/Issue/MissingConstructor.php | 17 - .../src/Psalm/Issue/MissingDependency.php | 8 - .../src/Psalm/Issue/MissingDocblockType.php | 9 - .../psalm/src/Psalm/Issue/MissingFile.php | 8 - .../Issue/MissingImmutableAnnotation.php | 8 - .../src/Psalm/Issue/MissingParamType.php | 9 - .../src/Psalm/Issue/MissingPropertyType.php | 9 - .../src/Psalm/Issue/MissingReturnType.php | 9 - .../src/Psalm/Issue/MissingTemplateParam.php | 8 - .../src/Psalm/Issue/MissingThrowsDocblock.php | 8 - .../psalm/src/Psalm/Issue/MixedArgument.php | 27 - .../Psalm/Issue/MixedArgumentTypeCoercion.php | 27 - .../src/Psalm/Issue/MixedArrayAccess.php | 11 - .../src/Psalm/Issue/MixedArrayAssignment.php | 11 - .../src/Psalm/Issue/MixedArrayOffset.php | 11 - .../Psalm/Issue/MixedArrayTypeCoercion.php | 11 - .../psalm/src/Psalm/Issue/MixedAssignment.php | 11 - .../psalm/src/Psalm/Issue/MixedClone.php | 11 - .../src/Psalm/Issue/MixedFunctionCall.php | 11 - .../Psalm/Issue/MixedInferredReturnType.php | 11 - .../psalm/src/Psalm/Issue/MixedIssue.php | 12 - .../psalm/src/Psalm/Issue/MixedIssueTrait.php | 37 - .../psalm/src/Psalm/Issue/MixedMethodCall.php | 11 - .../psalm/src/Psalm/Issue/MixedOperand.php | 11 - .../Psalm/Issue/MixedPropertyAssignment.php | 11 - .../src/Psalm/Issue/MixedPropertyFetch.php | 11 - .../Psalm/Issue/MixedPropertyTypeCoercion.php | 23 - .../src/Psalm/Issue/MixedReturnStatement.php | 11 - .../Psalm/Issue/MixedReturnTypeCoercion.php | 11 - .../Issue/MixedStringOffsetAssignment.php | 11 - .../MoreSpecificImplementedParamType.php | 9 - .../Psalm/Issue/MoreSpecificReturnType.php | 9 - .../src/Psalm/Issue/MutableDependency.php | 9 - .../Psalm/Issue/NamedArgumentNotAllowed.php | 9 - .../src/Psalm/Issue/NoEnumProperties.php | 9 - .../src/Psalm/Issue/NoInterfaceProperties.php | 9 - .../vimeo/psalm/src/Psalm/Issue/NoValue.php | 9 - .../NonInvariantDocblockPropertyType.php | 11 - .../Psalm/Issue/NonInvariantPropertyType.php | 11 - .../src/Psalm/Issue/NonStaticSelfCall.php | 9 - .../psalm/src/Psalm/Issue/NullArgument.php | 9 - .../psalm/src/Psalm/Issue/NullArrayAccess.php | 13 - .../psalm/src/Psalm/Issue/NullArrayOffset.php | 9 - .../src/Psalm/Issue/NullFunctionCall.php | 9 - .../psalm/src/Psalm/Issue/NullIterator.php | 9 - .../psalm/src/Psalm/Issue/NullOperand.php | 9 - .../Psalm/Issue/NullPropertyAssignment.php | 13 - .../src/Psalm/Issue/NullPropertyFetch.php | 13 - .../psalm/src/Psalm/Issue/NullReference.php | 9 - .../Psalm/Issue/NullableReturnStatement.php | 9 - .../Psalm/Issue/OverriddenMethodAccess.php | 9 - .../Psalm/Issue/OverriddenPropertyAccess.php | 9 - .../src/Psalm/Issue/ParadoxicalCondition.php | 9 - .../src/Psalm/Issue/ParamNameMismatch.php | 9 - .../psalm/src/Psalm/Issue/ParentNotFound.php | 9 - .../psalm/src/Psalm/Issue/ParseError.php | 9 - .../psalm/src/Psalm/Issue/PluginIssue.php | 7 - .../Issue/PossibleRawObjectIteration.php | 9 - .../src/Psalm/Issue/PossiblyFalseArgument.php | 9 - .../src/Psalm/Issue/PossiblyFalseIterator.php | 9 - .../src/Psalm/Issue/PossiblyFalseOperand.php | 9 - .../PossiblyFalsePropertyAssignmentValue.php | 9 - .../Psalm/Issue/PossiblyFalseReference.php | 9 - .../Psalm/Issue/PossiblyInvalidArgument.php | 9 - .../Issue/PossiblyInvalidArrayAccess.php | 9 - .../Issue/PossiblyInvalidArrayAssignment.php | 9 - .../Issue/PossiblyInvalidArrayOffset.php | 9 - .../src/Psalm/Issue/PossiblyInvalidCast.php | 9 - .../src/Psalm/Issue/PossiblyInvalidClone.php | 9 - .../Issue/PossiblyInvalidDocblockTag.php | 9 - .../Issue/PossiblyInvalidFunctionCall.php | 9 - .../Psalm/Issue/PossiblyInvalidIterator.php | 9 - .../Psalm/Issue/PossiblyInvalidMethodCall.php | 9 - .../Psalm/Issue/PossiblyInvalidOperand.php | 9 - .../PossiblyInvalidPropertyAssignment.php | 9 - ...PossiblyInvalidPropertyAssignmentValue.php | 9 - .../Issue/PossiblyInvalidPropertyFetch.php | 9 - .../src/Psalm/Issue/PossiblyNullArgument.php | 9 - .../Psalm/Issue/PossiblyNullArrayAccess.php | 13 - .../Issue/PossiblyNullArrayAssignment.php | 9 - .../Psalm/Issue/PossiblyNullArrayOffset.php | 9 - .../Psalm/Issue/PossiblyNullFunctionCall.php | 9 - .../src/Psalm/Issue/PossiblyNullIterator.php | 9 - .../src/Psalm/Issue/PossiblyNullOperand.php | 9 - .../Issue/PossiblyNullPropertyAssignment.php | 13 - .../PossiblyNullPropertyAssignmentValue.php | 9 - .../Psalm/Issue/PossiblyNullPropertyFetch.php | 13 - .../src/Psalm/Issue/PossiblyNullReference.php | 9 - .../Issue/PossiblyUndefinedArrayOffset.php | 9 - .../Issue/PossiblyUndefinedGlobalVariable.php | 9 - .../Issue/PossiblyUndefinedIntArrayOffset.php | 9 - .../Psalm/Issue/PossiblyUndefinedMethod.php | 9 - .../PossiblyUndefinedStringArrayOffset.php | 9 - .../Psalm/Issue/PossiblyUndefinedVariable.php | 9 - .../src/Psalm/Issue/PossiblyUnusedMethod.php | 9 - .../src/Psalm/Issue/PossiblyUnusedParam.php | 9 - .../Psalm/Issue/PossiblyUnusedProperty.php | 9 - .../Psalm/Issue/PossiblyUnusedReturnValue.php | 9 - .../psalm/src/Psalm/Issue/PropertyIssue.php | 22 - .../Issue/PropertyNotSetInConstructor.php | 20 - .../src/Psalm/Issue/PropertyTypeCoercion.php | 9 - .../src/Psalm/Issue/PsalmInternalError.php | 9 - .../src/Psalm/Issue/RawObjectIteration.php | 9 - .../psalm/src/Psalm/Issue/RedundantCast.php | 9 - .../Issue/RedundantCastGivenDocblockType.php | 9 - .../src/Psalm/Issue/RedundantCondition.php | 17 - .../RedundantConditionGivenDocblockType.php | 18 - .../src/Psalm/Issue/RedundantFunctionCall.php | 9 - ...RedundantFunctionCallGivenDocblockType.php | 9 - .../Psalm/Issue/RedundantIdentityWithTrue.php | 9 - .../RedundantPropertyInitializationCheck.php | 9 - .../Issue/ReferenceConstraintViolation.php | 9 - .../psalm/src/Psalm/Issue/ReservedWord.php | 9 - .../psalm/src/Psalm/Issue/StringIncrement.php | 9 - .../psalm/src/Psalm/Issue/TaintedCallable.php | 8 - .../psalm/src/Psalm/Issue/TaintedCookie.php | 8 - .../psalm/src/Psalm/Issue/TaintedCustom.php | 8 - .../psalm/src/Psalm/Issue/TaintedEval.php | 8 - .../psalm/src/Psalm/Issue/TaintedFile.php | 8 - .../psalm/src/Psalm/Issue/TaintedHeader.php | 8 - .../psalm/src/Psalm/Issue/TaintedHtml.php | 8 - .../psalm/src/Psalm/Issue/TaintedInclude.php | 8 - .../psalm/src/Psalm/Issue/TaintedInput.php | 84 - .../psalm/src/Psalm/Issue/TaintedLdap.php | 8 - .../psalm/src/Psalm/Issue/TaintedSSRF.php | 8 - .../psalm/src/Psalm/Issue/TaintedShell.php | 8 - .../psalm/src/Psalm/Issue/TaintedSql.php | 8 - .../src/Psalm/Issue/TaintedSystemSecret.php | 8 - .../src/Psalm/Issue/TaintedTextWithQuotes.php | 8 - .../src/Psalm/Issue/TaintedUnserialize.php | 8 - .../src/Psalm/Issue/TaintedUserSecret.php | 8 - .../psalm/src/Psalm/Issue/TooFewArguments.php | 9 - .../src/Psalm/Issue/TooManyArguments.php | 9 - .../src/Psalm/Issue/TooManyTemplateParams.php | 9 - vendor/vimeo/psalm/src/Psalm/Issue/Trace.php | 9 - .../Issue/TraitMethodSignatureMismatch.php | 9 - .../Psalm/Issue/TypeDoesNotContainNull.php | 17 - .../Psalm/Issue/TypeDoesNotContainType.php | 17 - .../Issue/UncaughtThrowInGlobalScope.php | 9 - .../Psalm/Issue/UndefinedAttributeClass.php | 9 - .../psalm/src/Psalm/Issue/UndefinedClass.php | 9 - .../src/Psalm/Issue/UndefinedConstant.php | 9 - .../Psalm/Issue/UndefinedDocblockClass.php | 9 - .../src/Psalm/Issue/UndefinedFunction.php | 9 - .../Psalm/Issue/UndefinedGlobalVariable.php | 9 - .../src/Psalm/Issue/UndefinedInterface.php | 9 - .../Psalm/Issue/UndefinedInterfaceMethod.php | 9 - .../src/Psalm/Issue/UndefinedMagicMethod.php | 9 - .../UndefinedMagicPropertyAssignment.php | 9 - .../Issue/UndefinedMagicPropertyFetch.php | 9 - .../psalm/src/Psalm/Issue/UndefinedMethod.php | 9 - .../Issue/UndefinedPropertyAssignment.php | 9 - .../Psalm/Issue/UndefinedPropertyFetch.php | 9 - .../Issue/UndefinedThisPropertyAssignment.php | 9 - .../Issue/UndefinedThisPropertyFetch.php | 9 - .../psalm/src/Psalm/Issue/UndefinedTrace.php | 9 - .../psalm/src/Psalm/Issue/UndefinedTrait.php | 9 - .../src/Psalm/Issue/UndefinedVariable.php | 9 - .../psalm/src/Psalm/Issue/UnevaluatedCode.php | 9 - .../Psalm/Issue/UnhandledMatchCondition.php | 9 - .../Issue/UnimplementedAbstractMethod.php | 9 - .../Issue/UnimplementedInterfaceMethod.php | 9 - .../src/Psalm/Issue/UninitializedProperty.php | 9 - .../Psalm/Issue/UnnecessaryVarAnnotation.php | 9 - .../Psalm/Issue/UnrecognizedExpression.php | 9 - .../src/Psalm/Issue/UnrecognizedStatement.php | 9 - .../src/Psalm/Issue/UnresolvableInclude.php | 9 - .../Issue/UnsafeGenericInstantiation.php | 9 - .../src/Psalm/Issue/UnsafeInstantiation.php | 9 - .../psalm/src/Psalm/Issue/UnusedClass.php | 9 - .../src/Psalm/Issue/UnusedClosureParam.php | 9 - .../src/Psalm/Issue/UnusedConstructor.php | 9 - .../src/Psalm/Issue/UnusedForeachValue.php | 9 - .../src/Psalm/Issue/UnusedFunctionCall.php | 9 - .../psalm/src/Psalm/Issue/UnusedMethod.php | 9 - .../src/Psalm/Issue/UnusedMethodCall.php | 9 - .../psalm/src/Psalm/Issue/UnusedParam.php | 9 - .../psalm/src/Psalm/Issue/UnusedProperty.php | 9 - .../src/Psalm/Issue/UnusedPsalmSuppress.php | 9 - .../src/Psalm/Issue/UnusedReturnValue.php | 9 - .../psalm/src/Psalm/Issue/UnusedVariable.php | 9 - .../psalm/src/Psalm/Issue/VariableIssue.php | 24 - vendor/vimeo/psalm/src/Psalm/IssueBuffer.php | 1029 - .../Node/Expr/AssignOp/VirtualBitwiseAnd.php | 13 - .../Node/Expr/AssignOp/VirtualBitwiseOr.php | 13 - .../Node/Expr/AssignOp/VirtualBitwiseXor.php | 13 - .../Node/Expr/AssignOp/VirtualCoalesce.php | 13 - .../Node/Expr/AssignOp/VirtualConcat.php | 13 - .../Psalm/Node/Expr/AssignOp/VirtualDiv.php | 13 - .../Psalm/Node/Expr/AssignOp/VirtualMinus.php | 13 - .../Psalm/Node/Expr/AssignOp/VirtualMod.php | 13 - .../Psalm/Node/Expr/AssignOp/VirtualMul.php | 13 - .../Psalm/Node/Expr/AssignOp/VirtualPlus.php | 13 - .../Psalm/Node/Expr/AssignOp/VirtualPow.php | 13 - .../Node/Expr/AssignOp/VirtualShiftLeft.php | 13 - .../Node/Expr/AssignOp/VirtualShiftRight.php | 13 - .../Node/Expr/BinaryOp/VirtualBitwiseAnd.php | 13 - .../Node/Expr/BinaryOp/VirtualBitwiseOr.php | 13 - .../Node/Expr/BinaryOp/VirtualBitwiseXor.php | 13 - .../Node/Expr/BinaryOp/VirtualBooleanAnd.php | 13 - .../Node/Expr/BinaryOp/VirtualBooleanOr.php | 13 - .../Node/Expr/BinaryOp/VirtualCoalesce.php | 13 - .../Node/Expr/BinaryOp/VirtualConcat.php | 13 - .../Psalm/Node/Expr/BinaryOp/VirtualDiv.php | 13 - .../Psalm/Node/Expr/BinaryOp/VirtualEqual.php | 13 - .../Node/Expr/BinaryOp/VirtualGreater.php | 13 - .../Expr/BinaryOp/VirtualGreaterOrEqual.php | 13 - .../Node/Expr/BinaryOp/VirtualIdentical.php | 13 - .../Node/Expr/BinaryOp/VirtualLogicalAnd.php | 13 - .../Node/Expr/BinaryOp/VirtualLogicalOr.php | 13 - .../Node/Expr/BinaryOp/VirtualLogicalXor.php | 13 - .../Psalm/Node/Expr/BinaryOp/VirtualMinus.php | 13 - .../Psalm/Node/Expr/BinaryOp/VirtualMod.php | 13 - .../Psalm/Node/Expr/BinaryOp/VirtualMul.php | 13 - .../Node/Expr/BinaryOp/VirtualNotEqual.php | 13 - .../Expr/BinaryOp/VirtualNotIdentical.php | 13 - .../Psalm/Node/Expr/BinaryOp/VirtualPlus.php | 13 - .../Psalm/Node/Expr/BinaryOp/VirtualPow.php | 13 - .../Node/Expr/BinaryOp/VirtualShiftLeft.php | 13 - .../Node/Expr/BinaryOp/VirtualShiftRight.php | 13 - .../Node/Expr/BinaryOp/VirtualSmaller.php | 13 - .../Expr/BinaryOp/VirtualSmallerOrEqual.php | 13 - .../Node/Expr/BinaryOp/VirtualSpaceship.php | 13 - .../src/Psalm/Node/Expr/Cast/VirtualArray.php | 13 - .../src/Psalm/Node/Expr/Cast/VirtualBool.php | 13 - .../Psalm/Node/Expr/Cast/VirtualDouble.php | 13 - .../src/Psalm/Node/Expr/Cast/VirtualInt.php | 13 - .../Psalm/Node/Expr/Cast/VirtualObject.php | 13 - .../Psalm/Node/Expr/Cast/VirtualString.php | 13 - .../src/Psalm/Node/Expr/Cast/VirtualUnset.php | 13 - .../src/Psalm/Node/Expr/VirtualArray.php | 13 - .../Psalm/Node/Expr/VirtualArrayDimFetch.php | 13 - .../src/Psalm/Node/Expr/VirtualArrayItem.php | 13 - .../Psalm/Node/Expr/VirtualArrowFunction.php | 13 - .../src/Psalm/Node/Expr/VirtualAssign.php | 13 - .../src/Psalm/Node/Expr/VirtualAssignRef.php | 13 - .../src/Psalm/Node/Expr/VirtualBitwiseNot.php | 13 - .../src/Psalm/Node/Expr/VirtualBooleanNot.php | 13 - .../Node/Expr/VirtualClassConstFetch.php | 13 - .../src/Psalm/Node/Expr/VirtualClone.php | 13 - .../src/Psalm/Node/Expr/VirtualClosure.php | 13 - .../src/Psalm/Node/Expr/VirtualClosureUse.php | 13 - .../src/Psalm/Node/Expr/VirtualConstFetch.php | 13 - .../src/Psalm/Node/Expr/VirtualEmpty.php | 13 - .../src/Psalm/Node/Expr/VirtualError.php | 19 - .../Psalm/Node/Expr/VirtualErrorSuppress.php | 13 - .../psalm/src/Psalm/Node/Expr/VirtualEval.php | 13 - .../psalm/src/Psalm/Node/Expr/VirtualExit.php | 13 - .../src/Psalm/Node/Expr/VirtualFuncCall.php | 13 - .../src/Psalm/Node/Expr/VirtualInclude.php | 13 - .../src/Psalm/Node/Expr/VirtualInstanceof.php | 13 - .../src/Psalm/Node/Expr/VirtualIsset.php | 13 - .../psalm/src/Psalm/Node/Expr/VirtualList.php | 13 - .../src/Psalm/Node/Expr/VirtualMatch.php | 13 - .../src/Psalm/Node/Expr/VirtualMethodCall.php | 13 - .../psalm/src/Psalm/Node/Expr/VirtualNew.php | 13 - .../Node/Expr/VirtualNullsafeMethodCall.php | 13 - .../Expr/VirtualNullsafePropertyFetch.php | 13 - .../src/Psalm/Node/Expr/VirtualPostDec.php | 13 - .../src/Psalm/Node/Expr/VirtualPostInc.php | 13 - .../src/Psalm/Node/Expr/VirtualPreDec.php | 13 - .../src/Psalm/Node/Expr/VirtualPreInc.php | 13 - .../src/Psalm/Node/Expr/VirtualPrint.php | 13 - .../Psalm/Node/Expr/VirtualPropertyFetch.php | 13 - .../src/Psalm/Node/Expr/VirtualShellExec.php | 13 - .../src/Psalm/Node/Expr/VirtualStaticCall.php | 13 - .../Node/Expr/VirtualStaticPropertyFetch.php | 13 - .../src/Psalm/Node/Expr/VirtualTernary.php | 13 - .../src/Psalm/Node/Expr/VirtualThrow.php | 13 - .../src/Psalm/Node/Expr/VirtualUnaryMinus.php | 13 - .../src/Psalm/Node/Expr/VirtualUnaryPlus.php | 13 - .../src/Psalm/Node/Expr/VirtualVariable.php | 13 - .../src/Psalm/Node/Expr/VirtualYield.php | 13 - .../src/Psalm/Node/Expr/VirtualYieldFrom.php | 13 - .../Psalm/Node/Name/VirtualFullyQualified.php | 13 - .../src/Psalm/Node/Name/VirtualRelative.php | 13 - .../Node/Scalar/MagicConst/VirtualClass.php | 13 - .../Node/Scalar/MagicConst/VirtualDir.php | 13 - .../Node/Scalar/MagicConst/VirtualFile.php | 13 - .../Scalar/MagicConst/VirtualFunction.php | 13 - .../Node/Scalar/MagicConst/VirtualLine.php | 13 - .../Node/Scalar/MagicConst/VirtualMethod.php | 13 - .../Scalar/MagicConst/VirtualNamespace.php | 13 - .../Node/Scalar/MagicConst/VirtualTrait.php | 13 - .../src/Psalm/Node/Scalar/VirtualDNumber.php | 13 - .../src/Psalm/Node/Scalar/VirtualEncapsed.php | 13 - .../Node/Scalar/VirtualEncapsedStringPart.php | 13 - .../src/Psalm/Node/Scalar/VirtualLNumber.php | 13 - .../src/Psalm/Node/Scalar/VirtualString.php | 13 - .../Stmt/TraitUseAdaptation/VirtualAlias.php | 13 - .../TraitUseAdaptation/VirtualPrecedence.php | 13 - .../src/Psalm/Node/Stmt/VirtualBreak.php | 13 - .../psalm/src/Psalm/Node/Stmt/VirtualCase.php | 13 - .../src/Psalm/Node/Stmt/VirtualCatch.php | 13 - .../src/Psalm/Node/Stmt/VirtualClass.php | 13 - .../src/Psalm/Node/Stmt/VirtualClassConst.php | 13 - .../Psalm/Node/Stmt/VirtualClassMethod.php | 13 - .../src/Psalm/Node/Stmt/VirtualConst.php | 13 - .../src/Psalm/Node/Stmt/VirtualContinue.php | 13 - .../src/Psalm/Node/Stmt/VirtualDeclare.php | 13 - .../Psalm/Node/Stmt/VirtualDeclareDeclare.php | 13 - .../psalm/src/Psalm/Node/Stmt/VirtualDo.php | 13 - .../psalm/src/Psalm/Node/Stmt/VirtualEcho.php | 13 - .../psalm/src/Psalm/Node/Stmt/VirtualElse.php | 13 - .../src/Psalm/Node/Stmt/VirtualElseIf.php | 13 - .../src/Psalm/Node/Stmt/VirtualExpression.php | 16 - .../src/Psalm/Node/Stmt/VirtualFinally.php | 13 - .../psalm/src/Psalm/Node/Stmt/VirtualFor.php | 13 - .../src/Psalm/Node/Stmt/VirtualForeach.php | 13 - .../src/Psalm/Node/Stmt/VirtualFunction.php | 13 - .../src/Psalm/Node/Stmt/VirtualGlobal.php | 13 - .../psalm/src/Psalm/Node/Stmt/VirtualGoto.php | 13 - .../src/Psalm/Node/Stmt/VirtualGroupUse.php | 13 - .../Psalm/Node/Stmt/VirtualHaltCompiler.php | 13 - .../psalm/src/Psalm/Node/Stmt/VirtualIf.php | 13 - .../src/Psalm/Node/Stmt/VirtualInlineHTML.php | 13 - .../src/Psalm/Node/Stmt/VirtualInterface.php | 13 - .../src/Psalm/Node/Stmt/VirtualLabel.php | 13 - .../src/Psalm/Node/Stmt/VirtualNamespace.php | 13 - .../psalm/src/Psalm/Node/Stmt/VirtualNop.php | 14 - .../src/Psalm/Node/Stmt/VirtualProperty.php | 13 - .../Node/Stmt/VirtualPropertyProperty.php | 13 - .../src/Psalm/Node/Stmt/VirtualReturn.php | 13 - .../src/Psalm/Node/Stmt/VirtualStatic.php | 13 - .../src/Psalm/Node/Stmt/VirtualStaticVar.php | 13 - .../src/Psalm/Node/Stmt/VirtualSwitch.php | 13 - .../src/Psalm/Node/Stmt/VirtualThrow.php | 13 - .../src/Psalm/Node/Stmt/VirtualTrait.php | 13 - .../src/Psalm/Node/Stmt/VirtualTraitUse.php | 13 - .../src/Psalm/Node/Stmt/VirtualTryCatch.php | 13 - .../src/Psalm/Node/Stmt/VirtualUnset.php | 13 - .../psalm/src/Psalm/Node/Stmt/VirtualUse.php | 13 - .../src/Psalm/Node/Stmt/VirtualUseUse.php | 13 - .../src/Psalm/Node/Stmt/VirtualWhile.php | 13 - .../vimeo/psalm/src/Psalm/Node/VirtualArg.php | 12 - .../psalm/src/Psalm/Node/VirtualAttribute.php | 12 - .../src/Psalm/Node/VirtualAttributeGroup.php | 12 - .../psalm/src/Psalm/Node/VirtualConst.php | 12 - .../src/Psalm/Node/VirtualIdentifier.php | 15 - .../psalm/src/Psalm/Node/VirtualMatchArm.php | 12 - .../psalm/src/Psalm/Node/VirtualName.php | 12 - .../psalm/src/Psalm/Node/VirtualNode.php | 11 - .../src/Psalm/Node/VirtualNullableType.php | 12 - .../psalm/src/Psalm/Node/VirtualParam.php | 12 - .../psalm/src/Psalm/Node/VirtualUnionType.php | 12 - .../Psalm/Node/VirtualVarLikeIdentifier.php | 19 - .../psalm/src/Psalm/NodeTypeProvider.php | 19 - .../EventHandler/AddTaintsInterface.php | 15 - .../EventHandler/AfterAnalysisInterface.php | 13 - .../AfterClassLikeAnalysisInterface.php | 16 - .../AfterClassLikeExistenceCheckInterface.php | 10 - .../AfterClassLikeVisitInterface.php | 14 - .../AfterCodebasePopulatedInterface.php | 16 - ...fterEveryFunctionCallAnalysisInterface.php | 10 - .../AfterExpressionAnalysisInterface.php | 15 - .../AfterFileAnalysisInterface.php | 13 - .../AfterFunctionCallAnalysisInterface.php | 10 - .../AfterFunctionLikeAnalysisInterface.php | 15 - .../AfterMethodCallAnalysisInterface.php | 10 - .../AfterStatementAnalysisInterface.php | 15 - .../BeforeFileAnalysisInterface.php | 13 - .../Event/AddRemoveTaintsEvent.php | 63 - .../EventHandler/Event/AfterAnalysisEvent.php | 67 - .../Event/AfterClassLikeAnalysisEvent.php | 88 - .../AfterClassLikeExistenceCheckEvent.php | 85 - .../Event/AfterClassLikeVisitEvent.php | 86 - .../Event/AfterCodebasePopulatedEvent.php | 26 - .../AfterEveryFunctionCallAnalysisEvent.php | 71 - .../Event/AfterExpressionAnalysisEvent.php | 88 - .../Event/AfterFileAnalysisEvent.php | 80 - .../Event/AfterFunctionCallAnalysisEvent.php | 113 - .../Event/AfterFunctionLikeAnalysisEvent.php | 120 - .../Event/AfterMethodCallAnalysisEvent.php | 142 - .../Event/AfterStatementAnalysisEvent.php | 88 - .../Event/BeforeFileAnalysisEvent.php | 63 - .../Event/FunctionExistenceProviderEvent.php | 40 - .../Event/FunctionParamsProviderEvent.php | 77 - .../Event/FunctionReturnTypeProviderEvent.php | 89 - .../Event/MethodExistenceProviderEvent.php | 63 - .../Event/MethodParamsProviderEvent.php | 88 - .../Event/MethodReturnTypeProviderEvent.php | 146 - .../Event/MethodVisibilityProviderEvent.php | 70 - .../Event/PropertyExistenceProviderEvent.php | 87 - .../Event/PropertyTypeProviderEvent.php | 69 - .../Event/PropertyVisibilityProviderEvent.php | 81 - .../Event/StringInterpreterEvent.php | 24 - .../FunctionExistenceProviderInterface.php | 21 - .../FunctionParamsProviderInterface.php | 19 - .../FunctionReturnTypeProviderInterface.php | 21 - .../MethodExistenceProviderInterface.php | 20 - .../MethodParamsProviderInterface.php | 19 - .../MethodReturnTypeProviderInterface.php | 21 - .../MethodVisibilityProviderInterface.php | 15 - .../PropertyExistenceProviderInterface.php | 21 - .../PropertyTypeProviderInterface.php | 16 - .../PropertyVisibilityProviderInterface.php | 15 - .../EventHandler/RemoveTaintsInterface.php | 15 - .../StringInterpreterInterface.php | 14 - .../Plugin/Hook/AfterAnalysisInterface.php | 23 - .../Hook/AfterClassLikeAnalysisInterface.php | 29 - .../AfterClassLikeExistenceCheckInterface.php | 23 - .../Hook/AfterClassLikeVisitInterface.php | 27 - .../Hook/AfterCodebasePopulatedInterface.php | 17 - ...fterEveryFunctionCallAnalysisInterface.php | 20 - .../Hook/AfterExpressionAnalysisInterface.php | 28 - .../Hook/AfterFileAnalysisInterface.php | 22 - .../AfterFunctionCallAnalysisInterface.php | 28 - .../AfterFunctionLikeAnalysisInterface.php | 28 - .../Hook/AfterMethodCallAnalysisInterface.php | 32 - .../Hook/AfterStatementAnalysisInterface.php | 28 - .../Hook/BeforeFileAnalysisInterface.php | 22 - .../FunctionExistenceProviderInterface.php | 25 - .../Hook/FunctionParamsProviderInterface.php | 31 - .../FunctionReturnTypeProviderInterface.php | 33 - .../Hook/MethodExistenceProviderInterface.php | 27 - .../Hook/MethodParamsProviderInterface.php | 32 - .../MethodReturnTypeProviderInterface.php | 40 - .../MethodVisibilityProviderInterface.php | 24 - .../PropertyExistenceProviderInterface.php | 31 - .../Hook/PropertyTypeProviderInterface.php | 24 - .../PropertyVisibilityProviderInterface.php | 25 - .../Hook/StringInterpreterInterface.php | 16 - .../Plugin/PluginEntryPointInterface.php | 10 - .../Psalm/Plugin/RegistrationInterface.php | 30 - .../vimeo/psalm/src/Psalm/Plugin/Shepherd.php | 223 - .../src/Psalm/PluginRegistrationSocket.php | 238 - .../src/Psalm/Progress/DebugProgress.php | 40 - .../src/Psalm/Progress/DefaultProgress.php | 104 - .../psalm/src/Psalm/Progress/LongProgress.php | 110 - .../psalm/src/Psalm/Progress/Progress.php | 69 - .../psalm/src/Psalm/Progress/VoidProgress.php | 10 - vendor/vimeo/psalm/src/Psalm/Report.php | 101 - .../src/Psalm/Report/CheckstyleReport.php | 39 - .../src/Psalm/Report/CodeClimateReport.php | 95 - .../psalm/src/Psalm/Report/CompactReport.php | 84 - .../psalm/src/Psalm/Report/ConsoleReport.php | 149 - .../psalm/src/Psalm/Report/CountReport.php | 39 - .../psalm/src/Psalm/Report/EmacsReport.php | 28 - .../src/Psalm/Report/GithubActionsReport.php | 72 - .../psalm/src/Psalm/Report/JsonReport.php | 28 - .../src/Psalm/Report/JsonSummaryReport.php | 32 - .../psalm/src/Psalm/Report/JunitReport.php | 175 - .../psalm/src/Psalm/Report/PhpStormReport.php | 99 - .../psalm/src/Psalm/Report/PylintReport.php | 49 - .../psalm/src/Psalm/Report/ReportOptions.php | 46 - .../psalm/src/Psalm/Report/SarifReport.php | 135 - .../src/Psalm/Report/SonarqubeReport.php | 47 - .../psalm/src/Psalm/Report/TextReport.php | 29 - .../psalm/src/Psalm/Report/XmlReport.php | 52 - .../Psalm/SourceControl/Git/CommitInfo.php | 209 - .../src/Psalm/SourceControl/Git/GitInfo.php | 111 - .../Psalm/SourceControl/Git/RemoteInfo.php | 81 - .../Psalm/SourceControl/SourceControlInfo.php | 8 - .../psalm/src/Psalm/StatementsSource.php | 64 - .../psalm/src/Psalm/Storage/Assertion.php | 105 - .../psalm/src/Psalm/Storage/AttributeArg.php | 40 - .../src/Psalm/Storage/AttributeStorage.php | 47 - .../Psalm/Storage/ClassConstantStorage.php | 62 - .../src/Psalm/Storage/ClassLikeStorage.php | 491 - .../src/Psalm/Storage/CustomMetadataTrait.php | 12 - .../src/Psalm/Storage/EnumCaseStorage.php | 32 - .../psalm/src/Psalm/Storage/FileStorage.php | 103 - .../Psalm/Storage/FunctionLikeParameter.php | 161 - .../src/Psalm/Storage/FunctionLikeStorage.php | 304 - .../src/Psalm/Storage/FunctionStorage.php | 9 - .../Psalm/Storage/HasAttributesInterface.php | 17 - .../psalm/src/Psalm/Storage/MethodStorage.php | 107 - .../src/Psalm/Storage/PropertyStorage.php | 135 - vendor/vimeo/psalm/src/Psalm/Type.php | 761 - vendor/vimeo/psalm/src/Psalm/Type/Atomic.php | 812 - .../src/Psalm/Type/Atomic/CallableTrait.php | 300 - .../src/Psalm/Type/Atomic/DependentType.php | 15 - .../src/Psalm/Type/Atomic/GenericTrait.php | 294 - .../Type/Atomic/HasIntersectionTrait.php | 109 - .../psalm/src/Psalm/Type/Atomic/Scalar.php | 13 - .../Type/Atomic/TAnonymousClassInstance.php | 49 - .../psalm/src/Psalm/Type/Atomic/TArray.php | 95 - .../psalm/src/Psalm/Type/Atomic/TArrayKey.php | 49 - .../src/Psalm/Type/Atomic/TAssertionFalsy.php | 44 - .../psalm/src/Psalm/Type/Atomic/TBool.php | 32 - .../psalm/src/Psalm/Type/Atomic/TCallable.php | 36 - .../src/Psalm/Type/Atomic/TCallableArray.php | 14 - .../Psalm/Type/Atomic/TCallableKeyedArray.php | 16 - .../src/Psalm/Type/Atomic/TCallableList.php | 11 - .../src/Psalm/Type/Atomic/TCallableObject.php | 44 - .../src/Psalm/Type/Atomic/TCallableString.php | 30 - .../src/Psalm/Type/Atomic/TClassConstant.php | 81 - .../src/Psalm/Type/Atomic/TClassString.php | 171 - .../src/Psalm/Type/Atomic/TClassStringMap.php | 251 - .../src/Psalm/Type/Atomic/TClosedResource.php | 44 - .../psalm/src/Psalm/Type/Atomic/TClosure.php | 19 - .../src/Psalm/Type/Atomic/TConditional.php | 148 - .../Psalm/Type/Atomic/TDependentGetClass.php | 63 - .../Type/Atomic/TDependentGetDebugType.php | 46 - .../Psalm/Type/Atomic/TDependentGetType.php | 29 - .../Psalm/Type/Atomic/TDependentListKey.php | 51 - .../psalm/src/Psalm/Type/Atomic/TEmpty.php | 34 - .../src/Psalm/Type/Atomic/TEmptyMixed.php | 15 - .../src/Psalm/Type/Atomic/TEmptyNumeric.php | 14 - .../src/Psalm/Type/Atomic/TEmptyScalar.php | 14 - .../psalm/src/Psalm/Type/Atomic/TEnumCase.php | 59 - .../psalm/src/Psalm/Type/Atomic/TFalse.php | 27 - .../psalm/src/Psalm/Type/Atomic/TFloat.php | 32 - .../src/Psalm/Type/Atomic/TGenericObject.php | 115 - .../Psalm/Type/Atomic/THtmlEscapedString.php | 25 - .../psalm/src/Psalm/Type/Atomic/TInt.php | 32 - .../psalm/src/Psalm/Type/Atomic/TIntMask.php | 71 - .../src/Psalm/Type/Atomic/TIntMaskOf.php | 57 - .../psalm/src/Psalm/Type/Atomic/TIntRange.php | 161 - .../psalm/src/Psalm/Type/Atomic/TIterable.php | 129 - .../Psalm/Type/Atomic/TKeyOfClassConstant.php | 105 - .../src/Psalm/Type/Atomic/TKeyedArray.php | 434 - .../psalm/src/Psalm/Type/Atomic/TList.php | 209 - .../Psalm/Type/Atomic/TLiteralClassString.php | 105 - .../src/Psalm/Type/Atomic/TLiteralFloat.php | 40 - .../src/Psalm/Type/Atomic/TLiteralInt.php | 45 - .../src/Psalm/Type/Atomic/TLiteralString.php | 55 - .../Psalm/Type/Atomic/TLowercaseString.php | 16 - .../psalm/src/Psalm/Type/Atomic/TMixed.php | 52 - .../src/Psalm/Type/Atomic/TNamedObject.php | 160 - .../psalm/src/Psalm/Type/Atomic/TNever.php | 40 - .../src/Psalm/Type/Atomic/TNonEmptyArray.php | 20 - .../src/Psalm/Type/Atomic/TNonEmptyList.php | 21 - .../Type/Atomic/TNonEmptyLowercaseString.php | 22 - .../src/Psalm/Type/Atomic/TNonEmptyMixed.php | 15 - .../TNonEmptyNonspecificLiteralString.php | 15 - .../src/Psalm/Type/Atomic/TNonEmptyScalar.php | 14 - .../src/Psalm/Type/Atomic/TNonEmptyString.php | 14 - .../src/Psalm/Type/Atomic/TNonFalsyString.php | 14 - .../Type/Atomic/TNonspecificLiteralInt.php | 25 - .../Type/Atomic/TNonspecificLiteralString.php | 25 - .../psalm/src/Psalm/Type/Atomic/TNull.php | 39 - .../psalm/src/Psalm/Type/Atomic/TNumeric.php | 37 - .../src/Psalm/Type/Atomic/TNumericString.php | 34 - .../psalm/src/Psalm/Type/Atomic/TObject.php | 42 - .../Type/Atomic/TObjectWithProperties.php | 287 - .../src/Psalm/Type/Atomic/TPositiveInt.php | 41 - .../psalm/src/Psalm/Type/Atomic/TResource.php | 39 - .../psalm/src/Psalm/Type/Atomic/TScalar.php | 43 - .../src/Psalm/Type/Atomic/TSingleLetter.php | 10 - .../psalm/src/Psalm/Type/Atomic/TString.php | 32 - .../Type/Atomic/TTemplateIndexedAccess.php | 66 - .../src/Psalm/Type/Atomic/TTemplateKeyOf.php | 63 - .../src/Psalm/Type/Atomic/TTemplateParam.php | 135 - .../Psalm/Type/Atomic/TTemplateParamClass.php | 65 - .../src/Psalm/Type/Atomic/TTraitString.php | 55 - .../psalm/src/Psalm/Type/Atomic/TTrue.php | 27 - .../src/Psalm/Type/Atomic/TTypeAlias.php | 88 - .../Type/Atomic/TValueOfClassConstant.php | 80 - .../psalm/src/Psalm/Type/Atomic/TVoid.php | 41 - .../psalm/src/Psalm/Type/NodeVisitor.php | 50 - .../vimeo/psalm/src/Psalm/Type/Reconciler.php | 1110 - .../vimeo/psalm/src/Psalm/Type/TaintKind.php | 25 - .../psalm/src/Psalm/Type/TaintKindGroup.php | 25 - .../vimeo/psalm/src/Psalm/Type/TypeNode.php | 11 - vendor/vimeo/psalm/src/Psalm/Type/Union.php | 1668 -- vendor/vimeo/psalm/src/command_functions.php | 88 - vendor/vimeo/psalm/src/functions.php | 13 - .../vimeo/psalm/src/psalm-language-server.php | 10 - vendor/vimeo/psalm/src/psalm-refactor.php | 10 - vendor/vimeo/psalm/src/psalm.php | 10 - vendor/vimeo/psalm/src/psalm_plugin.php | 10 - vendor/vimeo/psalm/src/psalter.php | 10 - vendor/vimeo/psalm/src/spl_object_id.php | 54 - .../psalm/stubs/CoreGenericClasses.phpstub | 503 - .../psalm/stubs/CoreGenericFunctions.phpstub | 1368 -- .../psalm/stubs/CoreGenericIterators.phpstub | 1094 - .../psalm/stubs/CoreImmutableClasses.phpstub | 242 - vendor/vimeo/psalm/stubs/DOM.phpstub | 176 - vendor/vimeo/psalm/stubs/Php80.phpstub | 105 - vendor/vimeo/psalm/stubs/Php81.phpstub | 91 - vendor/vimeo/psalm/stubs/Reflection.phpstub | 148 - vendor/vimeo/psalm/stubs/SPL.phpstub | 972 - vendor/vimeo/psalm/stubs/Xdebug.phpstub | 43 - vendor/vimeo/psalm/stubs/decimal.phpstub | 492 - vendor/vimeo/psalm/stubs/ext-apcu.phpstub | 92 - vendor/vimeo/psalm/stubs/ext-ds.phpstub | 1434 -- vendor/vimeo/psalm/stubs/ext-geos.phpstub | 25 - vendor/vimeo/psalm/stubs/mongodb.phpstub | 59 - vendor/vimeo/psalm/stubs/mysqli.phpstub | 33 - vendor/vimeo/psalm/stubs/pdo.phpstub | 19 - vendor/vimeo/psalm/stubs/phpparser.phpstub | 22 - vendor/vimeo/psalm/stubs/phpredis.phpstub | 548 - vendor/vimeo/psalm/stubs/soap.phpstub | 284 - vendor/webmozart/assert/CHANGELOG.md | 207 - vendor/webmozart/assert/LICENSE | 20 - vendor/webmozart/assert/README.md | 287 - vendor/webmozart/assert/composer.json | 43 - vendor/webmozart/assert/src/Assert.php | 2080 -- .../assert/src/InvalidArgumentException.php | 16 - vendor/webmozart/assert/src/Mixin.php | 5089 ----- vendor/webmozart/path-util/.gitignore | 2 - vendor/webmozart/path-util/.styleci.yml | 8 - vendor/webmozart/path-util/.travis.yml | 29 - vendor/webmozart/path-util/CHANGELOG.md | 68 - vendor/webmozart/path-util/LICENSE | 20 - vendor/webmozart/path-util/README.md | 143 - vendor/webmozart/path-util/appveyor.yml | 34 - vendor/webmozart/path-util/composer.json | 34 - vendor/webmozart/path-util/docs/usage.md | 203 - vendor/webmozart/path-util/phpunit.xml.dist | 16 - vendor/webmozart/path-util/src/Path.php | 1008 - vendor/webmozart/path-util/src/Url.php | 111 - vendor/webmozart/path-util/tests/PathTest.php | 1340 -- vendor/webmozart/path-util/tests/UrlTest.php | 179 - 1848 files changed, 1053 insertions(+), 288969 deletions(-) delete mode 100644 vendor/amphp/amp/LICENSE delete mode 100644 vendor/amphp/amp/composer.json delete mode 100644 vendor/amphp/amp/lib/CallableMaker.php delete mode 100644 vendor/amphp/amp/lib/CancellationToken.php delete mode 100644 vendor/amphp/amp/lib/CancellationTokenSource.php delete mode 100644 vendor/amphp/amp/lib/CancelledException.php delete mode 100644 vendor/amphp/amp/lib/CombinedCancellationToken.php delete mode 100644 vendor/amphp/amp/lib/Coroutine.php delete mode 100644 vendor/amphp/amp/lib/Deferred.php delete mode 100644 vendor/amphp/amp/lib/Delayed.php delete mode 100644 vendor/amphp/amp/lib/Emitter.php delete mode 100644 vendor/amphp/amp/lib/Failure.php delete mode 100644 vendor/amphp/amp/lib/Internal/Placeholder.php delete mode 100644 vendor/amphp/amp/lib/Internal/PrivateIterator.php delete mode 100644 vendor/amphp/amp/lib/Internal/PrivatePromise.php delete mode 100644 vendor/amphp/amp/lib/Internal/Producer.php delete mode 100644 vendor/amphp/amp/lib/Internal/ResolutionQueue.php delete mode 100644 vendor/amphp/amp/lib/Internal/functions.php delete mode 100644 vendor/amphp/amp/lib/InvalidYieldError.php delete mode 100644 vendor/amphp/amp/lib/Iterator.php delete mode 100644 vendor/amphp/amp/lib/LazyPromise.php delete mode 100644 vendor/amphp/amp/lib/Loop.php delete mode 100644 vendor/amphp/amp/lib/Loop/Driver.php delete mode 100644 vendor/amphp/amp/lib/Loop/DriverFactory.php delete mode 100644 vendor/amphp/amp/lib/Loop/EvDriver.php delete mode 100644 vendor/amphp/amp/lib/Loop/EventDriver.php delete mode 100644 vendor/amphp/amp/lib/Loop/Internal/TimerQueue.php delete mode 100644 vendor/amphp/amp/lib/Loop/InvalidWatcherError.php delete mode 100644 vendor/amphp/amp/lib/Loop/NativeDriver.php delete mode 100644 vendor/amphp/amp/lib/Loop/TracingDriver.php delete mode 100644 vendor/amphp/amp/lib/Loop/UnsupportedFeatureException.php delete mode 100644 vendor/amphp/amp/lib/Loop/UvDriver.php delete mode 100644 vendor/amphp/amp/lib/Loop/Watcher.php delete mode 100644 vendor/amphp/amp/lib/MultiReasonException.php delete mode 100644 vendor/amphp/amp/lib/NullCancellationToken.php delete mode 100644 vendor/amphp/amp/lib/Producer.php delete mode 100644 vendor/amphp/amp/lib/Promise.php delete mode 100644 vendor/amphp/amp/lib/Struct.php delete mode 100644 vendor/amphp/amp/lib/Success.php delete mode 100644 vendor/amphp/amp/lib/TimeoutCancellationToken.php delete mode 100644 vendor/amphp/amp/lib/TimeoutException.php delete mode 100644 vendor/amphp/amp/lib/functions.php delete mode 100644 vendor/amphp/byte-stream/.github/workflows/ci.yml delete mode 100644 vendor/amphp/byte-stream/LICENSE delete mode 100644 vendor/amphp/byte-stream/composer.json delete mode 100644 vendor/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php delete mode 100644 vendor/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php delete mode 100644 vendor/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php delete mode 100644 vendor/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php delete mode 100644 vendor/amphp/byte-stream/lib/ClosedException.php delete mode 100644 vendor/amphp/byte-stream/lib/InMemoryStream.php delete mode 100644 vendor/amphp/byte-stream/lib/InputStream.php delete mode 100644 vendor/amphp/byte-stream/lib/InputStreamChain.php delete mode 100644 vendor/amphp/byte-stream/lib/IteratorStream.php delete mode 100644 vendor/amphp/byte-stream/lib/LineReader.php delete mode 100644 vendor/amphp/byte-stream/lib/Message.php delete mode 100644 vendor/amphp/byte-stream/lib/OutputBuffer.php delete mode 100644 vendor/amphp/byte-stream/lib/OutputStream.php delete mode 100644 vendor/amphp/byte-stream/lib/Payload.php delete mode 100644 vendor/amphp/byte-stream/lib/PendingReadError.php delete mode 100644 vendor/amphp/byte-stream/lib/ResourceInputStream.php delete mode 100644 vendor/amphp/byte-stream/lib/ResourceOutputStream.php delete mode 100644 vendor/amphp/byte-stream/lib/StreamException.php delete mode 100644 vendor/amphp/byte-stream/lib/ZlibInputStream.php delete mode 100644 vendor/amphp/byte-stream/lib/ZlibOutputStream.php delete mode 100644 vendor/amphp/byte-stream/lib/functions.php delete mode 100644 vendor/amphp/byte-stream/psalm.xml 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/LICENSE 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 delete mode 100644 vendor/composer/pcre/LICENSE delete mode 100644 vendor/composer/pcre/README.md delete mode 100644 vendor/composer/pcre/composer.json delete mode 100644 vendor/composer/pcre/phpstan-baseline.neon delete mode 100644 vendor/composer/pcre/src/MatchAllResult.php delete mode 100644 vendor/composer/pcre/src/MatchAllWithOffsetsResult.php delete mode 100644 vendor/composer/pcre/src/MatchResult.php delete mode 100644 vendor/composer/pcre/src/MatchWithOffsetsResult.php delete mode 100644 vendor/composer/pcre/src/PcreException.php delete mode 100644 vendor/composer/pcre/src/Preg.php delete mode 100644 vendor/composer/pcre/src/Regex.php delete mode 100644 vendor/composer/pcre/src/ReplaceResult.php delete mode 100644 vendor/composer/semver/CHANGELOG.md delete mode 100644 vendor/composer/semver/LICENSE delete mode 100644 vendor/composer/semver/README.md delete mode 100644 vendor/composer/semver/composer.json delete mode 100644 vendor/composer/semver/src/Comparator.php delete mode 100644 vendor/composer/semver/src/CompilingMatcher.php delete mode 100644 vendor/composer/semver/src/Constraint/Bound.php delete mode 100644 vendor/composer/semver/src/Constraint/Constraint.php delete mode 100644 vendor/composer/semver/src/Constraint/ConstraintInterface.php delete mode 100644 vendor/composer/semver/src/Constraint/MatchAllConstraint.php delete mode 100644 vendor/composer/semver/src/Constraint/MatchNoneConstraint.php delete mode 100644 vendor/composer/semver/src/Constraint/MultiConstraint.php delete mode 100644 vendor/composer/semver/src/Interval.php delete mode 100644 vendor/composer/semver/src/Intervals.php delete mode 100644 vendor/composer/semver/src/Semver.php delete mode 100644 vendor/composer/semver/src/VersionParser.php delete mode 100644 vendor/composer/xdebug-handler/CHANGELOG.md delete mode 100644 vendor/composer/xdebug-handler/LICENSE delete mode 100644 vendor/composer/xdebug-handler/README.md delete mode 100644 vendor/composer/xdebug-handler/composer.json delete mode 100644 vendor/composer/xdebug-handler/src/PhpConfig.php delete mode 100644 vendor/composer/xdebug-handler/src/Process.php delete mode 100644 vendor/composer/xdebug-handler/src/Status.php delete mode 100644 vendor/composer/xdebug-handler/src/XdebugHandler.php delete mode 100644 vendor/dnoegel/php-xdg-base-dir/LICENSE delete mode 100644 vendor/dnoegel/php-xdg-base-dir/README.md delete mode 100644 vendor/dnoegel/php-xdg-base-dir/composer.json delete mode 100644 vendor/dnoegel/php-xdg-base-dir/src/Xdg.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/.github/workflows/build.yml delete mode 100644 vendor/felixfbecker/advanced-json-rpc/LICENSE delete mode 100644 vendor/felixfbecker/advanced-json-rpc/composer.json delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Error.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/ErrorResponse.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Message.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Notification.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Request.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Response.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php delete mode 100644 vendor/felixfbecker/language-server-protocol/.editorconfig delete mode 100644 vendor/felixfbecker/language-server-protocol/.github/workflows/build.yml delete mode 100644 vendor/felixfbecker/language-server-protocol/LICENSE delete mode 100644 vendor/felixfbecker/language-server-protocol/README.md delete mode 100644 vendor/felixfbecker/language-server-protocol/composer.json delete mode 100644 vendor/felixfbecker/language-server-protocol/package-lock.json delete mode 100644 vendor/felixfbecker/language-server-protocol/package.json delete mode 100644 vendor/felixfbecker/language-server-protocol/psalm-baseline.xml delete mode 100644 vendor/felixfbecker/language-server-protocol/psalm.xml delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ChangeAnnotation.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspaceFileOperations.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ClientInfo.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeAction.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionContext.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionDisabled.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeActionTriggerKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeDescription.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeLens.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeLensOptions.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/Command.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionContext.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionItem.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionItemKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionItemLabelDetails.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionItemTag.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionList.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionOptions.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ContentChangeEvent.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DependencyReference.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/Diagnostic.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DiagnosticTag.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DidChangeConfigurationClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentHighlight.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentLinkClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ErrorCode.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ExecuteCommandClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/FailureHandlingKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/FileChangeType.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/FileEvent.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/FormattingOptions.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/Hover.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/InitializeResult.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/InsertTextFormat.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/InsertTextMode.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/Location.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/LogMessage.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/LogTrace.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/MarkedString.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/MarkupContent.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/MarkupKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/MessageActionItem.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/MessageType.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/MonikerClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/PackageDescriptor.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ParameterInformation.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/Position.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/Range.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ReferenceContext.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ReferenceInformation.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ResourceOperationKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SaveOptions.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SelectionRangeClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ServerCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ShowDocumentClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureHelp.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SignatureInformation.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SymbolDescriptor.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SymbolInformation.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SymbolKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SymbolLocationInformation.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/SymbolTag.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentItem.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncOptions.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/TextEdit.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/TokenFormat.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/TypeDefinitionClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceEdit.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceFolder.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php delete mode 100644 vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php delete mode 100644 vendor/netresearch/jsonmapper/LICENSE delete mode 100644 vendor/netresearch/jsonmapper/composer.json delete mode 100644 vendor/netresearch/jsonmapper/contributing.rst delete mode 100644 vendor/netresearch/jsonmapper/phpunit.xml delete mode 100644 vendor/netresearch/jsonmapper/src/JsonMapper.php delete mode 100644 vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php delete mode 100644 vendor/nikic/php-parser/LICENSE delete mode 100644 vendor/nikic/php-parser/README.md delete mode 100755 vendor/nikic/php-parser/bin/php-parse delete mode 100644 vendor/nikic/php-parser/composer.json delete mode 100644 vendor/nikic/php-parser/grammar/README.md delete mode 100644 vendor/nikic/php-parser/grammar/parser.template delete mode 100644 vendor/nikic/php-parser/grammar/php5.y delete mode 100644 vendor/nikic/php-parser/grammar/php7.y delete mode 100644 vendor/nikic/php-parser/grammar/phpyLang.php delete mode 100644 vendor/nikic/php-parser/grammar/rebuildParsers.php delete mode 100644 vendor/nikic/php-parser/grammar/tokens.template delete mode 100644 vendor/nikic/php-parser/grammar/tokens.y delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Comment.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Error.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NameContext.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Param.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php delete mode 100644 vendor/openlss/lib-array2xml/.gitignore delete mode 100644 vendor/openlss/lib-array2xml/COPYING delete mode 100644 vendor/openlss/lib-array2xml/COPYING LESSER delete mode 100644 vendor/openlss/lib-array2xml/LSS/Array2XML.php delete mode 100644 vendor/openlss/lib-array2xml/LSS/XML2Array.php delete mode 100644 vendor/openlss/lib-array2xml/README.md delete mode 100644 vendor/openlss/lib-array2xml/composer.json delete mode 100644 vendor/phpdocumentor/reflection-common/.github/dependabot.yml delete mode 100644 vendor/phpdocumentor/reflection-common/.github/workflows/push.yml delete mode 100644 vendor/phpdocumentor/reflection-common/LICENSE delete mode 100644 vendor/phpdocumentor/reflection-common/README.md delete mode 100644 vendor/phpdocumentor/reflection-common/composer.json delete mode 100644 vendor/phpdocumentor/reflection-common/src/Element.php delete mode 100644 vendor/phpdocumentor/reflection-common/src/File.php delete mode 100644 vendor/phpdocumentor/reflection-common/src/Fqsen.php delete mode 100644 vendor/phpdocumentor/reflection-common/src/Location.php delete mode 100644 vendor/phpdocumentor/reflection-common/src/Project.php delete mode 100644 vendor/phpdocumentor/reflection-common/src/ProjectFactory.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/LICENSE delete mode 100644 vendor/phpdocumentor/reflection-docblock/README.md delete mode 100644 vendor/phpdocumentor/reflection-docblock/composer.json delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/Utils.php delete mode 100644 vendor/phpdocumentor/type-resolver/LICENSE delete mode 100644 vendor/phpdocumentor/type-resolver/README.md delete mode 100644 vendor/phpdocumentor/type-resolver/composer.json delete mode 100644 vendor/phpdocumentor/type-resolver/src/FqsenResolver.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoType.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/False_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/True_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Type.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/TypeResolver.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Array_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Boolean.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Callable_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ClassString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Collection.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Compound.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Context.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Expression.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Float_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Integer.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/InterfaceString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Intersection.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Never_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Null_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Nullable.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Object_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Parent_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Resource_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Scalar.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Self_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Static_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/String_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/This.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Void_.php delete mode 100644 vendor/psr/log/LICENSE delete mode 100644 vendor/psr/log/Psr/Log/AbstractLogger.php delete mode 100644 vendor/psr/log/Psr/Log/InvalidArgumentException.php delete mode 100644 vendor/psr/log/Psr/Log/LogLevel.php delete mode 100644 vendor/psr/log/Psr/Log/LoggerAwareInterface.php delete mode 100644 vendor/psr/log/Psr/Log/LoggerAwareTrait.php delete mode 100644 vendor/psr/log/Psr/Log/LoggerInterface.php delete mode 100644 vendor/psr/log/Psr/Log/LoggerTrait.php delete mode 100644 vendor/psr/log/Psr/Log/NullLogger.php delete mode 100644 vendor/psr/log/Psr/Log/Test/DummyTest.php delete mode 100644 vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php delete mode 100644 vendor/psr/log/Psr/Log/Test/TestLogger.php delete mode 100644 vendor/psr/log/README.md delete mode 100644 vendor/psr/log/composer.json delete mode 100644 vendor/sebastian/diff/ChangeLog.md delete mode 100644 vendor/sebastian/diff/LICENSE delete mode 100644 vendor/sebastian/diff/README.md delete mode 100644 vendor/sebastian/diff/composer.json delete mode 100644 vendor/sebastian/diff/src/Chunk.php delete mode 100644 vendor/sebastian/diff/src/Diff.php delete mode 100644 vendor/sebastian/diff/src/Differ.php delete mode 100644 vendor/sebastian/diff/src/Exception/ConfigurationException.php delete mode 100644 vendor/sebastian/diff/src/Exception/Exception.php delete mode 100644 vendor/sebastian/diff/src/Exception/InvalidArgumentException.php delete mode 100644 vendor/sebastian/diff/src/Line.php delete mode 100644 vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php delete mode 100644 vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php delete mode 100644 vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Parser.php delete mode 100644 vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 vendor/vimeo/psalm/LICENSE delete mode 100644 vendor/vimeo/psalm/composer.json delete mode 100644 vendor/vimeo/psalm/config.xsd delete mode 100644 vendor/vimeo/psalm/dictionaries/CallMap.php delete mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_71_delta.php delete mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_72_delta.php delete mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_73_delta.php delete mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_74_delta.php delete mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php delete mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php delete mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_historical.php delete mode 100644 vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php delete mode 100644 vendor/vimeo/psalm/dictionaries/PropertyMap.php delete mode 100755 vendor/vimeo/psalm/psalm delete mode 100755 vendor/vimeo/psalm/psalm-language-server delete mode 100755 vendor/vimeo/psalm/psalm-plugin delete mode 100755 vendor/vimeo/psalm/psalm-refactor delete mode 100755 vendor/vimeo/psalm/psalter delete mode 100644 vendor/vimeo/psalm/src/Psalm/Aliases.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/CodeLocation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/CodeLocation/Raw.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Codebase.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Config.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Config/Creator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Config/FileFilter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Config/IssueHandler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Context.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/DocComment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/ErrorBaseline.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/CodeException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/ComplicatedExpressionException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/ConfigCreationException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/ConfigException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/ConfigNotFoundException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/DocblockParseException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/FileIncludeException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/IncorrectDocblockException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/InvalidClasslikeOverrideException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/InvalidMethodOverrideException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/RefactorException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/ScopeAnalysisException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/TypeParseTreeException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/UnanalyzedFileException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/UnpopulatedClasslikeException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/UnpreparedAnalysisException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Exception/UnsupportedIssueToFixException.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/FileBasedPluginAdapter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/FileManipulation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/FileSource.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Algebra.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Clause.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/CliUtils.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Composer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/DataFlowNode.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSource.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/AstDiffer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/EventDispatcher.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Json/Json.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Client/TextDocument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/TextDocument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scanner/VarDocblockComment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/GenericTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/NullableTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Root.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Value.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/AbstractMethodCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ArgumentIssue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/AssignmentToVoid.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/CircularReference.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ClassIssue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/CodeIssue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ComplexMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ConfigIssue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ConflictingReferenceConstraint.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ConstructorSignatureMismatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ContinueOutsideLoop.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedConstant.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedFunction.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedProperty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedTrait.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DocblockTypeContradiction.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateConstant.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCase.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCaseValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateFunction.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/DuplicateParam.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/EmptyArrayAccess.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ExtensionRequirementViolation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/FalsableReturnStatement.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/FalseOperand.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenCode.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenEcho.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/FunctionIssue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImplementationRequirementViolation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImplementedParamTypeMismatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImplementedReturnTypeMismatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImplicitToStringCast.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureByReferenceAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureFunctionCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureMethodCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticProperty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticVariable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ImpureVariable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleClassConstant.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleProperty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InterfaceInstantiation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InternalClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InternalMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InternalProperty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidArgument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAccess.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayOffset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidAttribute.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidCast.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidCatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidClone.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblock.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblockParamName.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumBackingType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumCaseValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidExtendClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidFalsableReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidFunctionCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidGlobal.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidIterator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidLiteralArgument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidMethodCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidNamedArgument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidNullableReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidOperand.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidParamDefault.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidParent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidPassByReference.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignmentValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnStatement.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidScalarArgument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidScope.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidStaticInvocation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidStringClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidTemplateParam.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidThrow.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidToString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidTraversableImplementation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/InvalidTypeImport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificImplementedReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnStatement.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/LoopInvalidation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MethodIssue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockParamType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockPropertyType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureParamType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingConstructor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingDependency.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingDocblockType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingFile.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingImmutableAnnotation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingParamType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingPropertyType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingTemplateParam.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MissingThrowsDocblock.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArgument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayOffset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayTypeCoercion.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedClone.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedFunctionCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedInferredReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedIssue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedIssueTrait.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedOperand.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyTypeCoercion.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnTypeCoercion.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MixedStringOffsetAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificImplementedParamType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificReturnType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/MutableDependency.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NamedArgumentNotAllowed.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NoEnumProperties.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NoInterfaceProperties.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NoValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantDocblockPropertyType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantPropertyType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NonStaticSelfCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullArgument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullArrayAccess.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullArrayOffset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullFunctionCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullIterator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullOperand.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullReference.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/NullableReturnStatement.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/OverriddenMethodAccess.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/OverriddenPropertyAccess.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ParadoxicalCondition.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ParamNameMismatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ParentNotFound.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ParseError.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PluginIssue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossibleRawObjectIteration.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseArgument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseIterator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseOperand.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseReference.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArgument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAccess.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayOffset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidCast.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidClone.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidDocblockTag.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidFunctionCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidIterator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidMethodCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidOperand.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArgument.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAccess.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayOffset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullFunctionCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullIterator.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullOperand.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullReference.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedVariable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedParam.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedProperty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedReturnValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PropertyIssue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PsalmInternalError.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RawObjectIteration.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantCast.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantCastGivenDocblockType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantCondition.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantIdentityWithTrue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/RedundantPropertyInitializationCheck.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ReferenceConstraintViolation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/ReservedWord.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/StringIncrement.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedCallable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedCookie.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedCustom.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedEval.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedFile.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedHeader.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedHtml.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedInclude.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedInput.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedSSRF.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedShell.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedSql.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedSystemSecret.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedTextWithQuotes.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedUnserialize.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TaintedUserSecret.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TooFewArguments.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TooManyArguments.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TooManyTemplateParams.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/Trace.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TraitMethodSignatureMismatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainNull.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedAttributeClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedConstant.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedDocblockClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedFunction.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedGlobalVariable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterfaceMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyAssignment.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrace.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrait.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UndefinedVariable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnevaluatedCode.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnhandledMatchCondition.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedAbstractMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedInterfaceMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UninitializedProperty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnnecessaryVarAnnotation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedExpression.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedStatement.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnresolvableInclude.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnsafeGenericInstantiation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnsafeInstantiation.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedClosureParam.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedConstructor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedForeachValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedFunctionCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethodCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedParam.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedProperty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedPsalmSuppress.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedReturnValue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/UnusedVariable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/VariableIssue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/IssueBuffer.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMul.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPow.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualArray.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualBool.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualDouble.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualInt.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualObject.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualUnset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArray.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayDimFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayItem.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrowFunction.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssign.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssignRef.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBitwiseNot.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBooleanNot.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClassConstFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClone.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosure.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosureUse.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualConstFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEmpty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualError.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualErrorSuppress.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEval.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualExit.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualFuncCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInclude.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInstanceof.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualIsset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualList.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMethodCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNew.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostDec.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostInc.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreDec.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreInc.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPrint.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualShellExec.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticCall.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualTernary.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualThrow.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryMinus.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryPlus.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualVariable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYield.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYieldFrom.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualFullyQualified.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualRelative.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualDNumber.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsed.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualLNumber.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualBreak.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCase.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassConst.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassMethod.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualConst.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualContinue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclare.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDo.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualEcho.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElse.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElseIf.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualExpression.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFinally.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualForeach.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFunction.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGlobal.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGoto.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGroupUse.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualHaltCompiler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualIf.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInlineHTML.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualLabel.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNamespace.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNop.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualProperty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualPropertyProperty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualReturn.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStatic.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStaticVar.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualSwitch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualThrow.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTrait.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTraitUse.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTryCatch.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUnset.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUse.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUseUse.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualWhile.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualArg.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualAttribute.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualAttributeGroup.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualConst.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualIdentifier.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualMatchArm.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualName.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualNode.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualNullableType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualParam.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualUnionType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Node/VirtualVarLikeIdentifier.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/NodeTypeProvider.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeExistenceCheckInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeVisitInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterCodebasePopulatedInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterEveryFunctionCallAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterExpressionAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFileAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionCallAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionLikeAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterMethodCallAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterStatementAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/BeforeFileAnalysisInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionExistenceProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/PluginEntryPointInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/RegistrationInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Plugin/Shepherd.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Progress/DebugProgress.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Progress/LongProgress.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Progress/Progress.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Progress/VoidProgress.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/CompactReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/ConsoleReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/CountReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/EmacsReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/JsonReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/JunitReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/PhpStormReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/PylintReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/ReportOptions.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/SarifReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/TextReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Report/XmlReport.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/StatementsSource.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/Assertion.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/AttributeArg.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/FileStorage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/MethodStorage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/GenericTrait.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAnonymousClassInstance.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableKeyedArray.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableList.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableObject.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyNumeric.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyScalar.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEnumCase.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFloat.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TList.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TMixed.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyMixed.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyScalar.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonFalsyString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNull.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTypeAlias.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/NodeVisitor.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Reconciler.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/TaintKind.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/TaintKindGroup.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/TypeNode.php delete mode 100644 vendor/vimeo/psalm/src/Psalm/Type/Union.php delete mode 100644 vendor/vimeo/psalm/src/command_functions.php delete mode 100644 vendor/vimeo/psalm/src/functions.php delete mode 100644 vendor/vimeo/psalm/src/psalm-language-server.php delete mode 100644 vendor/vimeo/psalm/src/psalm-refactor.php delete mode 100644 vendor/vimeo/psalm/src/psalm.php delete mode 100644 vendor/vimeo/psalm/src/psalm_plugin.php delete mode 100644 vendor/vimeo/psalm/src/psalter.php delete mode 100644 vendor/vimeo/psalm/src/spl_object_id.php delete mode 100644 vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/CoreGenericFunctions.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/CoreGenericIterators.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/CoreImmutableClasses.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/DOM.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/Php80.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/Php81.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/Reflection.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/SPL.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/Xdebug.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/decimal.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/ext-apcu.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/ext-ds.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/ext-geos.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/mongodb.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/mysqli.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/pdo.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/phpparser.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/phpredis.phpstub delete mode 100644 vendor/vimeo/psalm/stubs/soap.phpstub delete mode 100644 vendor/webmozart/assert/CHANGELOG.md delete mode 100644 vendor/webmozart/assert/LICENSE delete mode 100644 vendor/webmozart/assert/README.md delete mode 100644 vendor/webmozart/assert/composer.json delete mode 100644 vendor/webmozart/assert/src/Assert.php delete mode 100644 vendor/webmozart/assert/src/InvalidArgumentException.php delete mode 100644 vendor/webmozart/assert/src/Mixin.php delete mode 100644 vendor/webmozart/path-util/.gitignore delete mode 100644 vendor/webmozart/path-util/.styleci.yml delete mode 100644 vendor/webmozart/path-util/.travis.yml delete mode 100644 vendor/webmozart/path-util/CHANGELOG.md delete mode 100644 vendor/webmozart/path-util/LICENSE delete mode 100644 vendor/webmozart/path-util/README.md delete mode 100644 vendor/webmozart/path-util/appveyor.yml delete mode 100644 vendor/webmozart/path-util/composer.json delete mode 100644 vendor/webmozart/path-util/docs/usage.md delete mode 100644 vendor/webmozart/path-util/phpunit.xml.dist delete mode 100644 vendor/webmozart/path-util/src/Path.php delete mode 100644 vendor/webmozart/path-util/src/Url.php delete mode 100644 vendor/webmozart/path-util/tests/PathTest.php delete mode 100644 vendor/webmozart/path-util/tests/UrlTest.php diff --git a/composer.json b/composer.json index a1afd71f..a948e924 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,6 @@ "psalm:update-baseline": "psalm --threads=1 --update-baseline" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.5", - "vimeo/psalm": "^4.26" + "bamarni/composer-bin-plugin": "^1.5" } } diff --git a/composer.lock b/composer.lock index be76e46f..1a0b1334 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "14070e04f41bafba05d6808f713bb088", + "content-hash": "41e003a0aea3705ba595ca045d13224e", "packages": [ { "name": "psr/container", @@ -541,172 +541,6 @@ } ], "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.6.2", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^7 | ^8 | ^9", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ], - "psr-4": { - "Amp\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2022-02-20T17:52:18+00:00" - }, - { - "name": "amphp/byte-stream", - "version": "v1.8.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.4", - "friendsofphp/php-cs-fixer": "^2.3", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6 || ^7 || ^8", - "psalm/phar": "^3.11.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "files": [ - "lib/functions.php" - ], - "psr-4": { - "Amp\\ByteStream\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2021-03-30T17:13:30+00:00" - }, { "name": "bamarni/composer-bin-plugin", "version": "v1.5.0", @@ -752,1087 +586,6 @@ "tool" ], "time": "2022-02-22T21:01:25+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.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" - }, - "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-02-25T20:21:48+00:00" - }, - { - "name": "composer/semver", - "version": "3.3.2", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.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/3.3.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-04-01T19:23:25+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", - "shasum": "" - }, - "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" - }, - "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/3.0.3" - }, - "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-02-25T21:32:43+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+00:00" - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" - }, - "time": "2021-06-11T22:34:44+00:00" - }, - { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "LanguageServerProtocol\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "PHP classes for the Language Server Protocol", - "keywords": [ - "language", - "microsoft", - "php", - "server" - ], - "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" - }, - "time": "2022-03-02T22:36:06+00:00" - }, - { - "name": "netresearch/jsonmapper", - "version": "v4.0.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" - }, - "time": "2020-12-01T19:48:11+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.14.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" - }, - "time": "2022-05-31T20:59:12+00:00" - }, - { - "name": "openlss/lib-array2xml", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/nullivex/lib-array2xml.git", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "LSS": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Bryan Tong", - "email": "bryan@nullivex.com", - "homepage": "https://www.nullivex.com" - }, - { - "name": "Tony Butler", - "email": "spudz76@gmail.com", - "homepage": "https://www.nullivex.com" - } - ], - "description": "Array2XML conversion library credit to lalit.org", - "homepage": "https://www.nullivex.com", - "keywords": [ - "array", - "array conversion", - "xml", - "xml conversion" - ], - "support": { - "issues": "https://github.com/nullivex/lib-array2xml/issues", - "source": "https://github.com/nullivex/lib-array2xml/tree/master" - }, - "time": "2019-03-29T20:06:56+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "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.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "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/1.6.1" - }, - "time": "2022-03-15T21:29:03+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "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": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "sebastian/diff", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:10:38+00:00" - }, - { - "name": "vimeo/psalm", - "version": "4.26.0", - "source": { - "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "6998fabb2bf528b65777bf9941920888d23c03ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/6998fabb2bf528b65777bf9941920888d23c03ac", - "reference": "6998fabb2bf528b65777bf9941920888d23c03ac", - "shasum": "" - }, - "require": { - "amphp/amp": "^2.4.2", - "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.8.0", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "ext-ctype": "*", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "felixfbecker/language-server-protocol": "^1.5", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.13", - "openlss/lib-array2xml": "^1.0", - "php": "^7.1|^8", - "sebastian/diff": "^3.0 || ^4.0", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.25", - "webmozart/path-util": "^2.3" - }, - "provide": { - "psalm/psalm": "self.version" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "brianium/paratest": "^4.0||^6.0", - "ext-curl": "*", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpdocumentor/reflection-docblock": "^5", - "phpmyadmin/sql-parser": "5.1.0||dev-master", - "phpspec/prophecy": ">=1.9.0", - "phpunit/phpunit": "^9.0", - "psalm/plugin-phpunit": "^0.16", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5", - "symfony/process": "^4.3 || ^5.0 || ^6.0", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "suggest": { - "ext-curl": "In order to send data to shepherd", - "ext-igbinary": "^2.0.5 is required, used to serialize caching data" - }, - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php", - "src/spl_object_id.php" - ], - "psr-4": { - "Psalm\\": "src/Psalm/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthew Brown" - } - ], - "description": "A static analysis tool for finding errors in PHP applications", - "keywords": [ - "code", - "inspection", - "php" - ], - "support": { - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.26.0" - }, - "time": "2022-07-31T13:10:26+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "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/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" - }, - { - "name": "webmozart/path-util", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/path-util.git", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "support": { - "issues": "https://github.com/webmozart/path-util/issues", - "source": "https://github.com/webmozart/path-util/tree/2.3.0" - }, - "abandoned": "symfony/filesystem", - "time": "2015-12-17T08:42:14+00:00" } ], "aliases": [], diff --git a/vendor-bin/coding-standard/composer.json b/vendor-bin/coding-standard/composer.json index ccaa7cfe..7aed4848 100644 --- a/vendor-bin/coding-standard/composer.json +++ b/vendor-bin/coding-standard/composer.json @@ -6,6 +6,7 @@ "sort-packages": true }, "require-dev": { - "nextcloud/coding-standard": "^1.0" + "nextcloud/coding-standard": "^1.0", + "vimeo/psalm": "^4.26" } } diff --git a/vendor-bin/coding-standard/composer.lock b/vendor-bin/coding-standard/composer.lock index 6dd1d152..dadcfd93 100644 --- a/vendor-bin/coding-standard/composer.lock +++ b/vendor-bin/coding-standard/composer.lock @@ -4,9 +4,248 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3a73a75c68f7f6783d2d42b988c9f46f", + "content-hash": "549d14795d621861b900843bd37ee6f8", "packages": [], "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2022-02-20T17:52:18+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "http://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "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.0.0", @@ -225,6 +464,43 @@ ], "time": "2022-02-25T21:32:43+00:00" }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, { "name": "doctrine/annotations", "version": "1.13.3", @@ -374,18 +650,119 @@ ], "time": "2022-02-28T11:07:21+00:00" }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + }, + "time": "2022-03-02T22:36:06+00:00" + }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.9.5", + "version": "v3.10.0", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "4465d70ba776806857a1ac2a6f877e582445ff36" + "reference": "76d7da666e66d83a1dc27a9d1c625c80cc4ac1fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/4465d70ba776806857a1ac2a6f877e582445ff36", - "reference": "4465d70ba776806857a1ac2a6f877e582445ff36", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/76d7da666e66d83a1dc27a9d1c625c80cc4ac1fe", + "reference": "76d7da666e66d83a1dc27a9d1c625c80cc4ac1fe", "shasum": "" }, "require": { @@ -395,7 +772,7 @@ "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", - "php-cs-fixer/diff": "^2.0", + "sebastian/diff": "^4.0", "symfony/console": "^5.4 || ^6.0", "symfony/event-dispatcher": "^5.4 || ^6.0", "symfony/filesystem": "^5.4 || ^6.0", @@ -423,68 +800,273 @@ "symfony/phpunit-bridge": "^6.0", "symfony/yaml": "^5.4 || ^6.0" }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters." + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.10.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2022-08-17T22:13:10+00:00" + }, + { + "name": "netresearch/jsonmapper", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" + }, + "time": "2020-12-01T19:48:11+00:00" + }, + { + "name": "nextcloud/coding-standard", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/nextcloud/coding-standard.git", + "reference": "f3d1f9375e89c605deb1734f59a9f51ecbe80578" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/f3d1f9375e89c605deb1734f59a9f51ecbe80578", + "reference": "f3d1f9375e89c605deb1734f59a9f51ecbe80578", + "shasum": "" + }, + "require": { + "friendsofphp/php-cs-fixer": "^3.2", + "php": "^7.3|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Nextcloud\\CodingStandard\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christoph Wurst", + "email": "christoph@winzerhof-wurst.at" + } + ], + "description": "Nextcloud coding standards for the php cs fixer", + "support": { + "issues": "https://github.com/nextcloud/coding-standard/issues", + "source": "https://github.com/nextcloud/coding-standard/tree/v1.0.0" + }, + "time": "2021-11-10T08:44:10+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.14.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + }, + "time": "2022-05-31T20:59:12+00:00" + }, + { + "name": "openlss/lib-array2xml", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/nullivex/lib-array2xml.git", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", + "type": "library", "autoload": { - "psr-4": { - "PhpCsFixer\\": "src/" + "psr-0": { + "LSS": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "Apache-2.0" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Bryan Tong", + "email": "bryan@nullivex.com", + "homepage": "https://www.nullivex.com" }, { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" + "name": "Tony Butler", + "email": "spudz76@gmail.com", + "homepage": "https://www.nullivex.com" } ], - "description": "A tool to automatically fix PHP code style", + "description": "Array2XML conversion library credit to lalit.org", + "homepage": "https://www.nullivex.com", + "keywords": [ + "array", + "array conversion", + "xml", + "xml conversion" + ], "support": { - "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", - "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.9.5" + "issues": "https://github.com/nullivex/lib-array2xml/issues", + "source": "https://github.com/nullivex/lib-array2xml/tree/master" }, - "funding": [ - { - "url": "https://github.com/keradus", - "type": "github" - } - ], - "time": "2022-07-22T08:43:51+00:00" + "time": "2019-03-29T20:06:56+00:00" }, { - "name": "nextcloud/coding-standard", - "version": "v1.0.0", + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", "source": { "type": "git", - "url": "https://github.com/nextcloud/coding-standard.git", - "reference": "f3d1f9375e89c605deb1734f59a9f51ecbe80578" + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/f3d1f9375e89c605deb1734f59a9f51ecbe80578", - "reference": "f3d1f9375e89c605deb1734f59a9f51ecbe80578", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", "shasum": "" }, "require": { - "friendsofphp/php-cs-fixer": "^3.2", - "php": "^7.3|^8.0" + "php": "^7.2 || ^8.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, "autoload": { "psr-4": { - "Nextcloud\\CodingStandard\\": "src" + "phpDocumentor\\Reflection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -493,68 +1075,131 @@ ], "authors": [ { - "name": "Christoph Wurst", - "email": "christoph@winzerhof-wurst.at" + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" } ], - "description": "Nextcloud coding standards for the php cs fixer", + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], "support": { - "issues": "https://github.com/nextcloud/coding-standard/issues", - "source": "https://github.com/nextcloud/coding-standard/tree/v1.0.0" + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" }, - "time": "2021-11-10T08:44:10+00:00" + "time": "2020-06-27T09:03:43+00:00" }, { - "name": "php-cs-fixer/diff", - "version": "v2.0.2", + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", "source": { "type": "git", - "url": "https://github.com/PHP-CS-Fixer/diff.git", - "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3" + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/29dc0d507e838c4580d018bd8b5cb412474f7ec3", - "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0 || ^8.0" + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" }, "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", - "symfony/process": "^3.3" + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Mike van Riel", + "email": "me@mikevanriel.com" }, { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" } ], - "description": "sebastian/diff v3 backport support for PHP 5.6+", - "homepage": "https://github.com/PHP-CS-Fixer", - "keywords": [ - "diff" + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "77a32518733312af16a44300404e945338981de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "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/PHP-CS-Fixer/diff/issues", - "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" }, - "time": "2020-10-14T08:32:19+00:00" + "time": "2022-03-15T21:29:03+00:00" }, { "name": "psr/cache", @@ -753,6 +1398,72 @@ }, "time": "2021-05-03T11:20:27+00:00" }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, { "name": "symfony/console", "version": "v5.4.11", @@ -2142,6 +2853,222 @@ } ], "time": "2022-07-24T16:15:25+00:00" + }, + { + "name": "vimeo/psalm", + "version": "4.26.0", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "6998fabb2bf528b65777bf9941920888d23c03ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/6998fabb2bf528b65777bf9941920888d23c03ac", + "reference": "6998fabb2bf528b65777bf9941920888d23c03ac", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer/package-versions-deprecated": "^1.8.0", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.0.3", + "felixfbecker/language-server-protocol": "^1.5", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.13", + "openlss/lib-array2xml": "^1.0", + "php": "^7.1|^8", + "sebastian/diff": "^3.0 || ^4.0", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.25", + "webmozart/path-util": "^2.3" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "brianium/paratest": "^4.0||^6.0", + "ext-curl": "*", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpdocumentor/reflection-docblock": "^5", + "phpmyadmin/sql-parser": "5.1.0||dev-master", + "phpspec/prophecy": ">=1.9.0", + "phpunit/phpunit": "^9.0", + "psalm/plugin-phpunit": "^0.16", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.3 || ^5.0 || ^6.0", + "weirdan/prophecy-shim": "^1.0 || ^2.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php", + "src/spl_object_id.php" + ], + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php" + ], + "support": { + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm/tree/4.26.0" + }, + "time": "2022-07-31T13:10:26+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "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/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "webmozart/path-util", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/path-util.git", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "webmozart/assert": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\PathUtil\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", + "support": { + "issues": "https://github.com/webmozart/path-util/issues", + "source": "https://github.com/webmozart/path-util/tree/2.3.0" + }, + "abandoned": "symfony/filesystem", + "time": "2015-12-17T08:42:14+00:00" } ], "aliases": [], diff --git a/vendor/amphp/amp/LICENSE b/vendor/amphp/amp/LICENSE deleted file mode 100644 index 2b431ba0..00000000 --- a/vendor/amphp/amp/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2015-2019 amphp -Copyright (c) 2016 PHP Asynchronous Interoperability Group - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/amphp/amp/composer.json b/vendor/amphp/amp/composer.json deleted file mode 100644 index c50a2bdc..00000000 --- a/vendor/amphp/amp/composer.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "amphp/amp", - "homepage": "https://amphp.org/amp", - "description": "A non-blocking concurrency framework for PHP applications.", - "keywords": [ - "async", - "asynchronous", - "concurrency", - "promise", - "awaitable", - "future", - "non-blocking", - "event", - "event-loop" - ], - "license": "MIT", - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "require": { - "php": ">=7.1" - }, - "require-dev": { - "ext-json": "*", - "amphp/phpunit-util": "^1", - "amphp/php-cs-fixer-config": "dev-master", - "react/promise": "^2", - "phpunit/phpunit": "^7 | ^8 | ^9", - "psalm/phar": "^3.11@dev", - "jetbrains/phpstorm-stubs": "^2019.3" - }, - "autoload": { - "psr-4": { - "Amp\\": "lib" - }, - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ] - }, - "autoload-dev": { - "psr-4": { - "Amp\\Test\\": "test" - } - }, - "support": { - "issues": "https://github.com/amphp/amp/issues", - "irc": "irc://irc.freenode.org/amphp" - }, - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "scripts": { - "test": "@php -dzend.assertions=1 -dassert.exception=1 ./vendor/bin/phpunit", - "code-style": "@php ./vendor/bin/php-cs-fixer fix" - } -} diff --git a/vendor/amphp/amp/lib/CallableMaker.php b/vendor/amphp/amp/lib/CallableMaker.php deleted file mode 100644 index 8fa8cff7..00000000 --- a/vendor/amphp/amp/lib/CallableMaker.php +++ /dev/null @@ -1,80 +0,0 @@ -getMethod($method); - } - - return self::$__reflectionMethods[$method]->getClosure($this); - } - - /** - * Creates a callable from a protected or private static method that may be invoked by methods requiring a - * publicly invokable callback. - * - * @param string $method Static method name. - * - * @return callable - * - * @psalm-suppress MixedInferredReturnType - */ - private static function callableFromStaticMethod(string $method): callable - { - if (!isset(self::$__reflectionMethods[$method])) { - if (self::$__reflectionClass === null) { - self::$__reflectionClass = new \ReflectionClass(self::class); - } - self::$__reflectionMethods[$method] = self::$__reflectionClass->getMethod($method); - } - - return self::$__reflectionMethods[$method]->getClosure(); - } - } -} else { - /** @psalm-suppress DuplicateClass */ - trait CallableMaker - { - /** - * @deprecated Use \Closure::fromCallable() instead of this method in PHP 7.1. - */ - private function callableFromInstanceMethod(string $method): callable - { - return \Closure::fromCallable([$this, $method]); - } - - /** - * @deprecated Use \Closure::fromCallable() instead of this method in PHP 7.1. - */ - private static function callableFromStaticMethod(string $method): callable - { - return \Closure::fromCallable([self::class, $method]); - } - } -} // @codeCoverageIgnoreEnd diff --git a/vendor/amphp/amp/lib/CancellationToken.php b/vendor/amphp/amp/lib/CancellationToken.php deleted file mode 100644 index b802994d..00000000 --- a/vendor/amphp/amp/lib/CancellationToken.php +++ /dev/null @@ -1,49 +0,0 @@ -getToken(); - * - * $response = yield $httpClient->request("https://example.com/stream", $token); - * $responseBody = $response->getBody(); - * - * while (($chunk = yield $response->read()) !== null) { - * // consume $chunk - * - * if ($noLongerInterested) { - * $cancellationTokenSource->cancel(); - * break; - * } - * } - * ``` - * - * @see CancellationToken - * @see CancelledException - */ -final class CancellationTokenSource -{ - /** @var CancellationToken */ - private $token; - - /** @var callable|null */ - private $onCancel; - - public function __construct() - { - $onCancel = null; - - $this->token = new class($onCancel) implements CancellationToken { - /** @var string */ - private $nextId = "a"; - - /** @var callable[] */ - private $callbacks = []; - - /** @var \Throwable|null */ - private $exception; - - /** - * @param mixed $onCancel - * @param-out callable $onCancel - */ - public function __construct(&$onCancel) - { - /** @psalm-suppress MissingClosureReturnType We still support PHP 7.0 */ - $onCancel = function (\Throwable $exception) { - $this->exception = $exception; - - $callbacks = $this->callbacks; - $this->callbacks = []; - - foreach ($callbacks as $callback) { - $this->invokeCallback($callback); - } - }; - } - - /** - * @param callable $callback - * - * @return void - */ - private function invokeCallback(callable $callback) - { - // No type declaration to prevent exception outside the try! - try { - /** @var mixed $result */ - $result = $callback($this->exception); - - if ($result instanceof \Generator) { - /** @psalm-var \Generator $result */ - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use ($exception) { - throw $exception; - }); - } - } - - public function subscribe(callable $callback): string - { - $id = $this->nextId++; - - if ($this->exception) { - $this->invokeCallback($callback); - } else { - $this->callbacks[$id] = $callback; - } - - return $id; - } - - public function unsubscribe(string $id) - { - unset($this->callbacks[$id]); - } - - public function isRequested(): bool - { - return isset($this->exception); - } - - public function throwIfRequested() - { - if (isset($this->exception)) { - throw $this->exception; - } - } - }; - - $this->onCancel = $onCancel; - } - - public function getToken(): CancellationToken - { - return $this->token; - } - - /** - * @param \Throwable|null $previous Exception to be used as the previous exception to CancelledException. - * - * @return void - */ - public function cancel(\Throwable $previous = null) - { - if ($this->onCancel === null) { - return; - } - - $onCancel = $this->onCancel; - $this->onCancel = null; - $onCancel(new CancelledException($previous)); - } -} diff --git a/vendor/amphp/amp/lib/CancelledException.php b/vendor/amphp/amp/lib/CancelledException.php deleted file mode 100644 index 25f8c400..00000000 --- a/vendor/amphp/amp/lib/CancelledException.php +++ /dev/null @@ -1,17 +0,0 @@ -exception; - $thatCallbacks = &$this->callbacks; - - foreach ($tokens as $token) { - $id = $token->subscribe(static function (CancelledException $exception) use (&$thatException, &$thatCallbacks) { - $thatException = $exception; - - $callbacks = $thatCallbacks; - $thatCallbacks = []; - - foreach ($callbacks as $callback) { - asyncCall($callback, $thatException); - } - }); - - $this->tokens[] = [$token, $id]; - } - } - - public function __destruct() - { - foreach ($this->tokens as list($token, $id)) { - /** @var CancellationToken $token */ - $token->unsubscribe($id); - } - } - - /** @inheritdoc */ - public function subscribe(callable $callback): string - { - $id = $this->nextId++; - - if ($this->exception) { - asyncCall($callback, $this->exception); - } else { - $this->callbacks[$id] = $callback; - } - - return $id; - } - - /** @inheritdoc */ - public function unsubscribe(string $id) - { - unset($this->callbacks[$id]); - } - - /** @inheritdoc */ - public function isRequested(): bool - { - foreach ($this->tokens as list($token)) { - if ($token->isRequested()) { - return true; - } - } - - return false; - } - - /** @inheritdoc */ - public function throwIfRequested() - { - foreach ($this->tokens as list($token)) { - $token->throwIfRequested(); - } - } -} diff --git a/vendor/amphp/amp/lib/Coroutine.php b/vendor/amphp/amp/lib/Coroutine.php deleted file mode 100644 index 5a3b4aa8..00000000 --- a/vendor/amphp/amp/lib/Coroutine.php +++ /dev/null @@ -1,160 +0,0 @@ - - */ -final class Coroutine implements Promise -{ - use Internal\Placeholder; - - /** - * Attempts to transform the non-promise yielded from the generator into a promise, otherwise returns an instance - * `Amp\Failure` failed with an instance of `Amp\InvalidYieldError`. - * - * @param mixed $yielded Non-promise yielded from generator. - * @param \Generator $generator No type for performance, we already know the type. - * - * @return Promise - */ - private static function transform($yielded, $generator): Promise - { - $exception = null; // initialize here, see https://github.com/vimeo/psalm/issues/2951 - - try { - if (\is_array($yielded)) { - return Promise\all($yielded); - } - - if ($yielded instanceof ReactPromise) { - return Promise\adapt($yielded); - } - - // No match, continue to returning Failure below. - } catch (\Throwable $exception) { - // Conversion to promise failed, fall-through to returning Failure below. - } - - return new Failure(new InvalidYieldError( - $generator, - \sprintf( - "Unexpected yield; Expected an instance of %s or %s or an array of such instances", - Promise::class, - ReactPromise::class - ), - $exception - )); - } - - /** - * @param \Generator $generator - * @psalm-param \Generator,mixed,Promise|ReactPromise|TReturn> $generator - */ - public function __construct(\Generator $generator) - { - try { - $yielded = $generator->current(); - - if (!$yielded instanceof Promise) { - if (!$generator->valid()) { - $this->resolve($generator->getReturn()); - return; - } - - $yielded = self::transform($yielded, $generator); - } - } catch (\Throwable $exception) { - $this->fail($exception); - return; - } - - /** - * @param \Throwable|null $e Exception to be thrown into the generator. - * @param mixed $v Value to be sent into the generator. - * - * @return void - * - * @psalm-suppress MissingClosureParamType - * @psalm-suppress MissingClosureReturnType - */ - $onResolve = function (\Throwable $e = null, $v) use ($generator, &$onResolve) { - /** @var bool $immediate Used to control iterative coroutine continuation. */ - static $immediate = true; - - /** @var \Throwable|null $exception Promise failure reason when executing next coroutine step, null at all other times. */ - static $exception; - - /** @var mixed $value Promise success value when executing next coroutine step, null at all other times. */ - static $value; - - $exception = $e; - /** @psalm-suppress MixedAssignment */ - $value = $v; - - if (!$immediate) { - $immediate = true; - return; - } - - try { - try { - do { - if ($exception) { - // Throw exception at current execution point. - $yielded = $generator->throw($exception); - } else { - // Send the new value and execute to next yield statement. - $yielded = $generator->send($value); - } - - if (!$yielded instanceof Promise) { - if (!$generator->valid()) { - $this->resolve($generator->getReturn()); - $onResolve = null; - return; - } - - $yielded = self::transform($yielded, $generator); - } - - $immediate = false; - $yielded->onResolve($onResolve); - } while ($immediate); - - $immediate = true; - } catch (\Throwable $exception) { - $this->fail($exception); - $onResolve = null; - } finally { - $exception = null; - $value = null; - } - } catch (\Throwable $e) { - Loop::defer(static function () use ($e) { - throw $e; - }); - } - }; - - try { - $yielded->onResolve($onResolve); - - unset($generator, $yielded, $onResolve); - } catch (\Throwable $e) { - Loop::defer(static function () use ($e) { - throw $e; - }); - } - } -} diff --git a/vendor/amphp/amp/lib/Deferred.php b/vendor/amphp/amp/lib/Deferred.php deleted file mode 100644 index cec1c5a4..00000000 --- a/vendor/amphp/amp/lib/Deferred.php +++ /dev/null @@ -1,76 +0,0 @@ - Has public resolve and fail methods. */ - private $resolver; - - /** @var Promise Hides placeholder methods */ - private $promise; - - public function __construct() - { - $this->resolver = new class implements Promise { - use Internal\Placeholder { - resolve as public; - fail as public; - isResolved as public; - } - }; - - $this->promise = new Internal\PrivatePromise($this->resolver); - } - - /** - * @return Promise - */ - public function promise(): Promise - { - return $this->promise; - } - - /** - * Fulfill the promise with the given value. - * - * @param mixed $value - * - * @psalm-param TValue|Promise $value - * - * @return void - */ - public function resolve($value = null) - { - /** @psalm-suppress UndefinedInterfaceMethod */ - $this->resolver->resolve($value); - } - - /** - * Fails the promise the the given reason. - * - * @param \Throwable $reason - * - * @return void - */ - public function fail(\Throwable $reason) - { - /** @psalm-suppress UndefinedInterfaceMethod */ - $this->resolver->fail($reason); - } - - /** - * @return bool True if the promise has been resolved. - */ - public function isResolved(): bool - { - return $this->resolver->isResolved(); - } -} diff --git a/vendor/amphp/amp/lib/Delayed.php b/vendor/amphp/amp/lib/Delayed.php deleted file mode 100644 index ec9b4202..00000000 --- a/vendor/amphp/amp/lib/Delayed.php +++ /dev/null @@ -1,58 +0,0 @@ - - */ -final class Delayed implements Promise -{ - use Internal\Placeholder; - - /** @var string|null Event loop watcher identifier. */ - private $watcher; - - /** - * @param int $time Milliseconds before succeeding the promise. - * @param TReturn $value Succeed the promise with this value. - */ - public function __construct(int $time, $value = null) - { - $this->watcher = Loop::delay($time, function () use ($value) { - $this->watcher = null; - $this->resolve($value); - }); - } - - /** - * References the internal watcher in the event loop, keeping the loop running while this promise is pending. - * - * @return self - */ - public function reference(): self - { - if ($this->watcher !== null) { - Loop::reference($this->watcher); - } - - return $this; - } - - /** - * Unreferences the internal watcher in the event loop, allowing the loop to stop while this promise is pending if - * no other events are pending in the loop. - * - * @return self - */ - public function unreference(): self - { - if ($this->watcher !== null) { - Loop::unreference($this->watcher); - } - - return $this; - } -} diff --git a/vendor/amphp/amp/lib/Emitter.php b/vendor/amphp/amp/lib/Emitter.php deleted file mode 100644 index cd6b7e54..00000000 --- a/vendor/amphp/amp/lib/Emitter.php +++ /dev/null @@ -1,84 +0,0 @@ - Has public emit, complete, and fail methods. */ - private $emitter; - - /** @var Iterator Hides producer methods. */ - private $iterator; - - public function __construct() - { - $this->emitter = new class implements Iterator { - use Internal\Producer { - emit as public; - complete as public; - fail as public; - } - }; - - $this->iterator = new Internal\PrivateIterator($this->emitter); - } - - /** - * @return Iterator - * @psalm-return Iterator - */ - public function iterate(): Iterator - { - return $this->iterator; - } - - /** - * Emits a value to the iterator. - * - * @param mixed $value - * - * @psalm-param TValue $value - * - * @return Promise - * @psalm-return Promise - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public function emit($value): Promise - { - /** @psalm-suppress UndefinedInterfaceMethod */ - return $this->emitter->emit($value); - } - - /** - * Completes the iterator. - * - * @return void - */ - public function complete() - { - /** @psalm-suppress UndefinedInterfaceMethod */ - $this->emitter->complete(); - } - - /** - * Fails the iterator with the given reason. - * - * @param \Throwable $reason - * - * @return void - */ - public function fail(\Throwable $reason) - { - /** @psalm-suppress UndefinedInterfaceMethod */ - $this->emitter->fail($reason); - } -} diff --git a/vendor/amphp/amp/lib/Failure.php b/vendor/amphp/amp/lib/Failure.php deleted file mode 100644 index 4c1ea62d..00000000 --- a/vendor/amphp/amp/lib/Failure.php +++ /dev/null @@ -1,52 +0,0 @@ - - */ -final class Failure implements Promise -{ - /** @var \Throwable $exception */ - private $exception; - - /** - * @param \Throwable $exception Rejection reason. - */ - public function __construct(\Throwable $exception) - { - $this->exception = $exception; - } - - /** - * {@inheritdoc} - */ - public function onResolve(callable $onResolved) - { - try { - /** @var mixed $result */ - $result = $onResolved($this->exception, null); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - Promise\rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use ($exception) { - throw $exception; - }); - } - } -} diff --git a/vendor/amphp/amp/lib/Internal/Placeholder.php b/vendor/amphp/amp/lib/Internal/Placeholder.php deleted file mode 100644 index dccf6067..00000000 --- a/vendor/amphp/amp/lib/Internal/Placeholder.php +++ /dev/null @@ -1,187 +0,0 @@ -, mixed, - * mixed>|null)|callable(\Throwable|null, mixed): void */ - private $onResolved; - - /** @var null|array */ - private $resolutionTrace; - - /** - * @inheritdoc - */ - public function onResolve(callable $onResolved) - { - if ($this->resolved) { - if ($this->result instanceof Promise) { - $this->result->onResolve($onResolved); - return; - } - - try { - /** @var mixed $result */ - $result = $onResolved(null, $this->result); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - Promise\rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use ($exception) { - throw $exception; - }); - } - return; - } - - if (null === $this->onResolved) { - $this->onResolved = $onResolved; - return; - } - - if (!$this->onResolved instanceof ResolutionQueue) { - /** @psalm-suppress InternalClass */ - $this->onResolved = new ResolutionQueue($this->onResolved); - } - - /** @psalm-suppress InternalMethod */ - $this->onResolved->push($onResolved); - } - - public function __destruct() - { - try { - $this->result = null; - } catch (\Throwable $e) { - Loop::defer(static function () use ($e) { - throw $e; - }); - } - } - - /** - * @param mixed $value - * - * @return void - * - * @throws \Error Thrown if the promise has already been resolved. - */ - private function resolve($value = null) - { - if ($this->resolved) { - $message = "Promise has already been resolved"; - - if (isset($this->resolutionTrace)) { - $trace = formatStacktrace($this->resolutionTrace); - $message .= ". Previous resolution trace:\n\n{$trace}\n\n"; - } else { - // @codeCoverageIgnoreStart - $message .= ", define environment variable AMP_DEBUG or const AMP_DEBUG = true and enable assertions " - . "for a stacktrace of the previous resolution."; - // @codeCoverageIgnoreEnd - } - - throw new \Error($message); - } - - \assert((function () { - $env = \getenv("AMP_DEBUG") ?: "0"; - if (($env !== "0" && $env !== "false") || (\defined("AMP_DEBUG") && \AMP_DEBUG)) { - $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); - \array_shift($trace); // remove current closure - $this->resolutionTrace = $trace; - } - - return true; - })()); - - if ($value instanceof ReactPromise) { - $value = Promise\adapt($value); - } - - $this->resolved = true; - $this->result = $value; - - if ($this->onResolved === null) { - return; - } - - $onResolved = $this->onResolved; - $this->onResolved = null; - - if ($this->result instanceof Promise) { - $this->result->onResolve($onResolved); - return; - } - - try { - /** @var mixed $result */ - $result = $onResolved(null, $this->result); - $onResolved = null; // allow garbage collection of $onResolved, to catch any exceptions from destructors - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - Promise\rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use ($exception) { - throw $exception; - }); - } - } - - /** - * @param \Throwable $reason Failure reason. - * - * @return void - */ - private function fail(\Throwable $reason) - { - $this->resolve(new Failure($reason)); - } - - /** - * @return bool True if the placeholder has been resolved. - */ - private function isResolved(): bool - { - return $this->resolved; - } -} diff --git a/vendor/amphp/amp/lib/Internal/PrivateIterator.php b/vendor/amphp/amp/lib/Internal/PrivateIterator.php deleted file mode 100644 index 7a14b243..00000000 --- a/vendor/amphp/amp/lib/Internal/PrivateIterator.php +++ /dev/null @@ -1,45 +0,0 @@ - - */ -final class PrivateIterator implements Iterator -{ - /** @var Iterator */ - private $iterator; - - /** - * @param Iterator $iterator - * - * @psalm-param Iterator $iterator - */ - public function __construct(Iterator $iterator) - { - $this->iterator = $iterator; - } - - /** - * @return Promise - */ - public function advance(): Promise - { - return $this->iterator->advance(); - } - - /** - * @psalm-return TValue - */ - public function getCurrent() - { - return $this->iterator->getCurrent(); - } -} diff --git a/vendor/amphp/amp/lib/Internal/PrivatePromise.php b/vendor/amphp/amp/lib/Internal/PrivatePromise.php deleted file mode 100644 index 3bd568a8..00000000 --- a/vendor/amphp/amp/lib/Internal/PrivatePromise.php +++ /dev/null @@ -1,25 +0,0 @@ -promise = $promise; - } - - public function onResolve(callable $onResolved) - { - $this->promise->onResolve($onResolved); - } -} diff --git a/vendor/amphp/amp/lib/Internal/Producer.php b/vendor/amphp/amp/lib/Internal/Producer.php deleted file mode 100644 index c955755a..00000000 --- a/vendor/amphp/amp/lib/Internal/Producer.php +++ /dev/null @@ -1,212 +0,0 @@ - - */ - public function advance(): Promise - { - if ($this->waiting !== null) { - throw new \Error("The prior promise returned must resolve before invoking this method again"); - } - - unset($this->values[$this->consumePosition]); - - $position = ++$this->consumePosition; - - if (\array_key_exists($position, $this->values)) { - \assert(isset($this->backPressure[$position])); - $deferred = $this->backPressure[$position]; - unset($this->backPressure[$position]); - $deferred->resolve(); - - return new Success(true); - } - - if ($this->complete) { - return $this->complete; - } - - $this->waiting = new Deferred; - - return $this->waiting->promise(); - } - - /** - * {@inheritdoc} - * - * @return TValue - */ - public function getCurrent() - { - if (empty($this->values) && $this->complete) { - throw new \Error("The iterator has completed"); - } - - if (!\array_key_exists($this->consumePosition, $this->values)) { - throw new \Error("Promise returned from advance() must resolve before calling this method"); - } - - return $this->values[$this->consumePosition]; - } - - /** - * Emits a value from the iterator. The returned promise is resolved once the emitted value has been consumed. - * - * @param mixed $value - * - * @return Promise - * @psalm-return Promise - * - * @throws \Error If the iterator has completed. - */ - private function emit($value): Promise - { - if ($this->complete) { - throw new \Error("Iterators cannot emit values after calling complete"); - } - - if ($value instanceof ReactPromise) { - $value = Promise\adapt($value); - } - - if ($value instanceof Promise) { - $deferred = new Deferred; - $value->onResolve(function ($e, $v) use ($deferred) { - if ($this->complete) { - $deferred->fail( - new \Error("The iterator was completed before the promise result could be emitted") - ); - return; - } - - if ($e) { - $this->fail($e); - $deferred->fail($e); - return; - } - - $deferred->resolve($this->emit($v)); - }); - - return $deferred->promise(); - } - - $position = ++$this->emitPosition; - - $this->values[$position] = $value; - - if ($this->waiting !== null) { - $waiting = $this->waiting; - $this->waiting = null; - $waiting->resolve(true); - return new Success; // Consumer was already waiting for a new value, so back-pressure is unnecessary. - } - - $this->backPressure[$position] = $pressure = new Deferred; - - return $pressure->promise(); - } - - /** - * Completes the iterator. - * - * @return void - * - * @throws \Error If the iterator has already been completed. - */ - private function complete() - { - if ($this->complete) { - $message = "Iterator has already been completed"; - - if (isset($this->resolutionTrace)) { - $trace = formatStacktrace($this->resolutionTrace); - $message .= ". Previous completion trace:\n\n{$trace}\n\n"; - } else { - // @codeCoverageIgnoreStart - $message .= ", define environment variable AMP_DEBUG or const AMP_DEBUG = true and enable assertions " - . "for a stacktrace of the previous resolution."; - // @codeCoverageIgnoreEnd - } - - throw new \Error($message); - } - - \assert((function () { - $env = \getenv("AMP_DEBUG") ?: "0"; - if (($env !== "0" && $env !== "false") || (\defined("AMP_DEBUG") && \AMP_DEBUG)) { - $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); - \array_shift($trace); // remove current closure - $this->resolutionTrace = $trace; - } - - return true; - })()); - - $this->complete = new Success(false); - - if ($this->waiting !== null) { - $waiting = $this->waiting; - $this->waiting = null; - $waiting->resolve($this->complete); - } - } - - /** - * @param \Throwable $exception - * - * @return void - */ - private function fail(\Throwable $exception) - { - $this->complete = new Failure($exception); - - if ($this->waiting !== null) { - $waiting = $this->waiting; - $this->waiting = null; - $waiting->resolve($this->complete); - } - } -} diff --git a/vendor/amphp/amp/lib/Internal/ResolutionQueue.php b/vendor/amphp/amp/lib/Internal/ResolutionQueue.php deleted file mode 100644 index 353a8b93..00000000 --- a/vendor/amphp/amp/lib/Internal/ResolutionQueue.php +++ /dev/null @@ -1,90 +0,0 @@ -, mixed, - * mixed>|null) | callable(\Throwable|null, mixed): void> */ - private $queue = []; - - /** - * @param callable|null $callback Initial callback to add to queue. - * - * @psalm-param null|callable(\Throwable|null, mixed): (Promise|\React\Promise\PromiseInterface|\Generator, mixed, - * mixed>|null) | callable(\Throwable|null, mixed): void $callback - */ - public function __construct(callable $callback = null) - { - if ($callback !== null) { - $this->push($callback); - } - } - - /** - * Unrolls instances of self to avoid blowing up the call stack on resolution. - * - * @param callable $callback - * - * @psalm-param callable(\Throwable|null, mixed): (Promise|\React\Promise\PromiseInterface|\Generator, mixed, - * mixed>|null) | callable(\Throwable|null, mixed): void $callback - * - * @return void - */ - public function push(callable $callback) - { - if ($callback instanceof self) { - $this->queue = \array_merge($this->queue, $callback->queue); - return; - } - - $this->queue[] = $callback; - } - - /** - * Calls each callback in the queue, passing the provided values to the function. - * - * @param \Throwable|null $exception - * @param mixed $value - * - * @return void - */ - public function __invoke($exception, $value) - { - foreach ($this->queue as $callback) { - try { - $result = $callback($exception, $value); - - if ($result === null) { - continue; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - Promise\rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use ($exception) { - throw $exception; - }); - } - } - } -} diff --git a/vendor/amphp/amp/lib/Internal/functions.php b/vendor/amphp/amp/lib/Internal/functions.php deleted file mode 100644 index eee9af20..00000000 --- a/vendor/amphp/amp/lib/Internal/functions.php +++ /dev/null @@ -1,117 +0,0 @@ - $trace Output of - * `debug_backtrace()`. - * - * @return string Formatted stacktrace. - * - * @codeCoverageIgnore - * @internal - */ -function formatStacktrace(array $trace): string -{ - return \implode("\n", \array_map(static function ($e, $i) { - $line = "#{$i} "; - - if (isset($e["file"])) { - $line .= "{$e['file']}:{$e['line']} "; - } - - if (isset($e["type"])) { - $line .= $e["class"] . $e["type"]; - } - - return $line . $e["function"] . "()"; - }, $trace, \array_keys($trace))); -} - -/** - * Creates a `TypeError` with a standardized error message. - * - * @param string[] $expected Expected types. - * @param mixed $given Given value. - * - * @return \TypeError - * - * @internal - */ -function createTypeError(array $expected, $given): \TypeError -{ - $givenType = \is_object($given) ? \sprintf("instance of %s", \get_class($given)) : \gettype($given); - - if (\count($expected) === 1) { - $expectedType = "Expected the following type: " . \array_pop($expected); - } else { - $expectedType = "Expected one of the following types: " . \implode(", ", $expected); - } - - return new \TypeError("{$expectedType}; {$givenType} given"); -} - -/** - * Returns the current time relative to an arbitrary point in time. - * - * @return int Time in milliseconds. - */ -function getCurrentTime(): int -{ - /** @var int|null $startTime */ - static $startTime; - /** @var int|null $nextWarning */ - static $nextWarning; - - if (\PHP_INT_SIZE === 4) { - // @codeCoverageIgnoreStart - if ($startTime === null) { - $startTime = \PHP_VERSION_ID >= 70300 ? \hrtime(false)[0] : \time(); - $nextWarning = \PHP_INT_MAX - 86400 * 7; - } - - if (\PHP_VERSION_ID >= 70300) { - list($seconds, $nanoseconds) = \hrtime(false); - $seconds -= $startTime; - - if ($seconds >= $nextWarning) { - $timeToOverflow = (\PHP_INT_MAX - $seconds * 1000) / 1000; - \trigger_error( - "getCurrentTime() will overflow in $timeToOverflow seconds, please restart the process before that. " . - "You're using a 32 bit version of PHP, so time will overflow about every 24 days. Regular restarts are required.", - \E_USER_WARNING - ); - - /** @psalm-suppress PossiblyNullOperand */ - $nextWarning += 600; // every 10 minutes - } - - return (int) ($seconds * 1000 + $nanoseconds / 1000000); - } - - $seconds = \microtime(true) - $startTime; - if ($seconds >= $nextWarning) { - $timeToOverflow = (\PHP_INT_MAX - $seconds * 1000) / 1000; - \trigger_error( - "getCurrentTime() will overflow in $timeToOverflow seconds, please restart the process before that. " . - "You're using a 32 bit version of PHP, so time will overflow about every 24 days. Regular restarts are required.", - \E_USER_WARNING - ); - - /** @psalm-suppress PossiblyNullOperand */ - $nextWarning += 600; // every 10 minutes - } - - return (int) ($seconds * 1000); - // @codeCoverageIgnoreEnd - } - - if (\PHP_VERSION_ID >= 70300) { - list($seconds, $nanoseconds) = \hrtime(false); - return (int) ($seconds * 1000 + $nanoseconds / 1000000); - } - - return (int) (\microtime(true) * 1000); -} diff --git a/vendor/amphp/amp/lib/InvalidYieldError.php b/vendor/amphp/amp/lib/InvalidYieldError.php deleted file mode 100644 index 8785708e..00000000 --- a/vendor/amphp/amp/lib/InvalidYieldError.php +++ /dev/null @@ -1,39 +0,0 @@ -current(); - $prefix .= \sprintf( - "; %s yielded at key %s", - \is_object($yielded) ? \get_class($yielded) : \gettype($yielded), - \var_export($generator->key(), true) - ); - - if (!$generator->valid()) { - parent::__construct($prefix, 0, $previous); - return; - } - - $reflGen = new \ReflectionGenerator($generator); - $exeGen = $reflGen->getExecutingGenerator(); - if ($isSubgenerator = ($exeGen !== $generator)) { - $reflGen = new \ReflectionGenerator($exeGen); - } - - parent::__construct(\sprintf( - "%s on line %s in %s", - $prefix, - $reflGen->getExecutingLine(), - $reflGen->getExecutingFile() - ), 0, $previous); - } -} diff --git a/vendor/amphp/amp/lib/Iterator.php b/vendor/amphp/amp/lib/Iterator.php deleted file mode 100644 index fee9b76b..00000000 --- a/vendor/amphp/amp/lib/Iterator.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * @throws \Error If the prior promise returned from this method has not resolved. - * @throws \Throwable The exception used to fail the iterator. - */ - public function advance(): Promise; - - /** - * Gets the last emitted value or throws an exception if the iterator has completed. - * - * @return mixed Value emitted from the iterator. - * @psalm-return TValue - * - * @throws \Error If the iterator has resolved or advance() was not called before calling this method. - * @throws \Throwable The exception used to fail the iterator. - */ - public function getCurrent(); -} diff --git a/vendor/amphp/amp/lib/LazyPromise.php b/vendor/amphp/amp/lib/LazyPromise.php deleted file mode 100644 index 96be33f5..00000000 --- a/vendor/amphp/amp/lib/LazyPromise.php +++ /dev/null @@ -1,44 +0,0 @@ -promisor = $promisor; - } - - /** - * {@inheritdoc} - */ - public function onResolve(callable $onResolved) - { - if ($this->promise === null) { - \assert($this->promisor !== null); - - $provider = $this->promisor; - $this->promisor = null; - $this->promise = call($provider); - } - - \assert($this->promise !== null); - - $this->promise->onResolve($onResolved); - } -} diff --git a/vendor/amphp/amp/lib/Loop.php b/vendor/amphp/amp/lib/Loop.php deleted file mode 100644 index d89d2101..00000000 --- a/vendor/amphp/amp/lib/Loop.php +++ /dev/null @@ -1,456 +0,0 @@ -defer($callback); - } - - self::$driver->run(); - } - - /** - * Stop the event loop. - * - * When an event loop is stopped, it continues with its current tick and exits the loop afterwards. Multiple calls - * to stop MUST be ignored and MUST NOT raise an exception. - * - * @return void - */ - public static function stop() - { - self::$driver->stop(); - } - - /** - * Defer the execution of a callback. - * - * The deferred callable MUST be executed before any other type of watcher in a tick. Order of enabling MUST be - * preserved when executing the callbacks. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param callable(string $watcherId, mixed $data) $callback The callback to defer. The `$watcherId` will be - * invalidated before the callback call. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public static function defer(callable $callback, $data = null): string - { - return self::$driver->defer($callback, $data); - } - - /** - * Delay the execution of a callback. - * - * The delay is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be determined by which - * timers expire first, but timers with the same expiration time MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $delay The amount of time, in milliseconds, to delay the execution for. - * @param callable(string $watcherId, mixed $data) $callback The callback to delay. The `$watcherId` will be - * invalidated before the callback call. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public static function delay(int $delay, callable $callback, $data = null): string - { - return self::$driver->delay($delay, $callback, $data); - } - - /** - * Repeatedly execute a callback. - * - * The interval between executions is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be - * determined by which timers expire first, but timers with the same expiration time MAY be executed in any order. - * The first execution is scheduled after the first interval period. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $interval The time interval, in milliseconds, to wait between executions. - * @param callable(string $watcherId, mixed $data) $callback The callback to repeat. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public static function repeat(int $interval, callable $callback, $data = null): string - { - return self::$driver->repeat($interval, $callback, $data); - } - - /** - * Execute a callback when a stream resource becomes readable or is closed for reading. - * - * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the - * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid - * resources, but are not required to, due to the high performance impact. Watchers on closed resources are - * therefore undefined behavior. - * - * Multiple watchers on the same stream MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param resource $stream The stream to monitor. - * @param callable(string $watcherId, resource $stream, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public static function onReadable($stream, callable $callback, $data = null): string - { - return self::$driver->onReadable($stream, $callback, $data); - } - - /** - * Execute a callback when a stream resource becomes writable or is closed for writing. - * - * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the - * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid - * resources, but are not required to, due to the high performance impact. Watchers on closed resources are - * therefore undefined behavior. - * - * Multiple watchers on the same stream MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param resource $stream The stream to monitor. - * @param callable(string $watcherId, resource $stream, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public static function onWritable($stream, callable $callback, $data = null): string - { - return self::$driver->onWritable($stream, $callback, $data); - } - - /** - * Execute a callback when a signal is received. - * - * Warning: Installing the same signal on different instances of this interface is deemed undefined behavior. - * Implementations MAY try to detect this, if possible, but are not required to. This is due to technical - * limitations of the signals being registered globally per process. - * - * Multiple watchers on the same signal MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $signo The signal number to monitor. - * @param callable(string $watcherId, int $signo, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the $data parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - * - * @throws UnsupportedFeatureException If signal handling is not supported. - */ - public static function onSignal(int $signo, callable $callback, $data = null): string - { - return self::$driver->onSignal($signo, $callback, $data); - } - - /** - * Enable a watcher to be active starting in the next tick. - * - * Watchers MUST immediately be marked as enabled, but only be activated (i.e. callbacks can be called) right before - * the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param string $watcherId The watcher identifier. - * - * @return void - * - * @throws InvalidWatcherError If the watcher identifier is invalid. - */ - public static function enable(string $watcherId) - { - self::$driver->enable($watcherId); - } - - /** - * Disable a watcher immediately. - * - * A watcher MUST be disabled immediately, e.g. if a defer watcher disables a later defer watcher, the second defer - * watcher isn't executed in this tick. - * - * Disabling a watcher MUST NOT invalidate the watcher. Calling this function MUST NOT fail, even if passed an - * invalid watcher. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public static function disable(string $watcherId) - { - if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { - // Prior to PHP 7.2, self::$driver may be unset during destruct. - // See https://github.com/amphp/amp/issues/212. - return; - } - - self::$driver->disable($watcherId); - } - - /** - * Cancel a watcher. - * - * This will detatch the event loop from all resources that are associated to the watcher. After this operation the - * watcher is permanently invalid. Calling this function MUST NOT fail, even if passed an invalid watcher. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public static function cancel(string $watcherId) - { - if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { - // Prior to PHP 7.2, self::$driver may be unset during destruct. - // See https://github.com/amphp/amp/issues/212. - return; - } - - self::$driver->cancel($watcherId); - } - - /** - * Reference a watcher. - * - * This will keep the event loop alive whilst the watcher is still being monitored. Watchers have this state by - * default. - * - * @param string $watcherId The watcher identifier. - * - * @return void - * - * @throws InvalidWatcherError If the watcher identifier is invalid. - */ - public static function reference(string $watcherId) - { - self::$driver->reference($watcherId); - } - - /** - * Unreference a watcher. - * - * The event loop should exit the run method when only unreferenced watchers are still being monitored. Watchers - * are all referenced by default. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public static function unreference(string $watcherId) - { - if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { - // Prior to PHP 7.2, self::$driver may be unset during destruct. - // See https://github.com/amphp/amp/issues/212. - return; - } - - self::$driver->unreference($watcherId); - } - - /** - * Returns the current loop time in millisecond increments. Note this value does not necessarily correlate to - * wall-clock time, rather the value returned is meant to be used in relative comparisons to prior values returned - * by this method (intervals, expiration calculations, etc.) and is only updated once per loop tick. - * - * @return int - */ - public static function now(): int - { - return self::$driver->now(); - } - - /** - * Stores information in the loop bound registry. - * - * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages - * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. - * - * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated - * interface for that purpose instead of sharing the storage key. - * - * @param string $key The namespaced storage key. - * @param mixed $value The value to be stored. - * - * @return void - */ - public static function setState(string $key, $value) - { - self::$driver->setState($key, $value); - } - - /** - * Gets information stored bound to the loop. - * - * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages - * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. - * - * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated - * interface for that purpose instead of sharing the storage key. - * - * @param string $key The namespaced storage key. - * - * @return mixed The previously stored value or `null` if it doesn't exist. - */ - public static function getState(string $key) - { - return self::$driver->getState($key); - } - - /** - * Set a callback to be executed when an error occurs. - * - * The callback receives the error as the first and only parameter. The return value of the callback gets ignored. - * If it can't handle the error, it MUST throw the error. Errors thrown by the callback or during its invocation - * MUST be thrown into the `run` loop and stop the driver. - * - * Subsequent calls to this method will overwrite the previous handler. - * - * @param callable(\Throwable $error)|null $callback The callback to execute. `null` will clear the - * current handler. - * - * @return callable(\Throwable $error)|null The previous handler, `null` if there was none. - */ - public static function setErrorHandler(callable $callback = null) - { - return self::$driver->setErrorHandler($callback); - } - - /** - * Retrieve an associative array of information about the event loop driver. - * - * The returned array MUST contain the following data describing the driver's currently registered watchers: - * - * [ - * "defer" => ["enabled" => int, "disabled" => int], - * "delay" => ["enabled" => int, "disabled" => int], - * "repeat" => ["enabled" => int, "disabled" => int], - * "on_readable" => ["enabled" => int, "disabled" => int], - * "on_writable" => ["enabled" => int, "disabled" => int], - * "on_signal" => ["enabled" => int, "disabled" => int], - * "enabled_watchers" => ["referenced" => int, "unreferenced" => int], - * "running" => bool - * ]; - * - * Implementations MAY optionally add more information in the array but at minimum the above `key => value` format - * MUST always be provided. - * - * @return array Statistics about the loop in the described format. - */ - public static function getInfo(): array - { - return self::$driver->getInfo(); - } - - /** - * Retrieve the event loop driver that is in scope. - * - * @return Driver - */ - public static function get(): Driver - { - return self::$driver; - } -} - -// Default factory, don't move this to a file loaded by the composer "files" autoload mechanism, otherwise custom -// implementations might have issues setting a default loop, because it's overridden by us then. - -// @codeCoverageIgnoreStart -Loop::set((new DriverFactory)->create()); -// @codeCoverageIgnoreEnd diff --git a/vendor/amphp/amp/lib/Loop/Driver.php b/vendor/amphp/amp/lib/Loop/Driver.php deleted file mode 100644 index 448bab62..00000000 --- a/vendor/amphp/amp/lib/Loop/Driver.php +++ /dev/null @@ -1,742 +0,0 @@ -running = true; - - try { - while ($this->running) { - if ($this->isEmpty()) { - return; - } - $this->tick(); - } - } finally { - $this->stop(); - } - } - - /** - * @return bool True if no enabled and referenced watchers remain in the loop. - */ - private function isEmpty(): bool - { - foreach ($this->watchers as $watcher) { - if ($watcher->enabled && $watcher->referenced) { - return false; - } - } - - return true; - } - - /** - * Executes a single tick of the event loop. - * - * @return void - */ - private function tick() - { - if (empty($this->deferQueue)) { - $this->deferQueue = $this->nextTickQueue; - } else { - $this->deferQueue = \array_merge($this->deferQueue, $this->nextTickQueue); - } - $this->nextTickQueue = []; - - $this->activate($this->enableQueue); - $this->enableQueue = []; - - foreach ($this->deferQueue as $watcher) { - if (!isset($this->deferQueue[$watcher->id])) { - continue; // Watcher disabled by another defer watcher. - } - - unset($this->watchers[$watcher->id], $this->deferQueue[$watcher->id]); - - try { - /** @var mixed $result */ - $result = ($watcher->callback)($watcher->id, $watcher->data); - - if ($result === null) { - continue; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - - /** @psalm-suppress RedundantCondition */ - $this->dispatch(empty($this->nextTickQueue) && empty($this->enableQueue) && $this->running && !$this->isEmpty()); - } - - /** - * Activates (enables) all the given watchers. - * - * @param Watcher[] $watchers - * - * @return void - */ - abstract protected function activate(array $watchers); - - /** - * Dispatches any pending read/write, timer, and signal events. - * - * @param bool $blocking - * - * @return void - */ - abstract protected function dispatch(bool $blocking); - - /** - * Stop the event loop. - * - * When an event loop is stopped, it continues with its current tick and exits the loop afterwards. Multiple calls - * to stop MUST be ignored and MUST NOT raise an exception. - * - * @return void - */ - public function stop() - { - $this->running = false; - } - - /** - * Defer the execution of a callback. - * - * The deferred callable MUST be executed before any other type of watcher in a tick. Order of enabling MUST be - * preserved when executing the callbacks. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param callable (string $watcherId, mixed $data) $callback The callback to defer. The `$watcherId` will be - * invalidated before the callback call. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public function defer(callable $callback, $data = null): string - { - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher; - $watcher->type = Watcher::DEFER; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->data = $data; - - $this->watchers[$watcher->id] = $watcher; - $this->nextTickQueue[$watcher->id] = $watcher; - - return $watcher->id; - } - - /** - * Delay the execution of a callback. - * - * The delay is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be determined by which - * timers expire first, but timers with the same expiration time MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $delay The amount of time, in milliseconds, to delay the execution for. - * @param callable (string $watcherId, mixed $data) $callback The callback to delay. The `$watcherId` will be - * invalidated before the callback call. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public function delay(int $delay, callable $callback, $data = null): string - { - if ($delay < 0) { - throw new \Error("Delay must be greater than or equal to zero"); - } - - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher; - $watcher->type = Watcher::DELAY; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->value = $delay; - $watcher->expiration = $this->now() + $delay; - $watcher->data = $data; - - $this->watchers[$watcher->id] = $watcher; - $this->enableQueue[$watcher->id] = $watcher; - - return $watcher->id; - } - - /** - * Repeatedly execute a callback. - * - * The interval between executions is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be - * determined by which timers expire first, but timers with the same expiration time MAY be executed in any order. - * The first execution is scheduled after the first interval period. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $interval The time interval, in milliseconds, to wait between executions. - * @param callable (string $watcherId, mixed $data) $callback The callback to repeat. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public function repeat(int $interval, callable $callback, $data = null): string - { - if ($interval < 0) { - throw new \Error("Interval must be greater than or equal to zero"); - } - - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher; - $watcher->type = Watcher::REPEAT; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->value = $interval; - $watcher->expiration = $this->now() + $interval; - $watcher->data = $data; - - $this->watchers[$watcher->id] = $watcher; - $this->enableQueue[$watcher->id] = $watcher; - - return $watcher->id; - } - - /** - * Execute a callback when a stream resource becomes readable or is closed for reading. - * - * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the - * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid - * resources, but are not required to, due to the high performance impact. Watchers on closed resources are - * therefore undefined behavior. - * - * Multiple watchers on the same stream MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param resource $stream The stream to monitor. - * @param callable (string $watcherId, resource $stream, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public function onReadable($stream, callable $callback, $data = null): string - { - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher; - $watcher->type = Watcher::READABLE; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->value = $stream; - $watcher->data = $data; - - $this->watchers[$watcher->id] = $watcher; - $this->enableQueue[$watcher->id] = $watcher; - - return $watcher->id; - } - - /** - * Execute a callback when a stream resource becomes writable or is closed for writing. - * - * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the - * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid - * resources, but are not required to, due to the high performance impact. Watchers on closed resources are - * therefore undefined behavior. - * - * Multiple watchers on the same stream MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param resource $stream The stream to monitor. - * @param callable (string $watcherId, resource $stream, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public function onWritable($stream, callable $callback, $data = null): string - { - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher; - $watcher->type = Watcher::WRITABLE; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->value = $stream; - $watcher->data = $data; - - $this->watchers[$watcher->id] = $watcher; - $this->enableQueue[$watcher->id] = $watcher; - - return $watcher->id; - } - - /** - * Execute a callback when a signal is received. - * - * Warning: Installing the same signal on different instances of this interface is deemed undefined behavior. - * Implementations MAY try to detect this, if possible, but are not required to. This is due to technical - * limitations of the signals being registered globally per process. - * - * Multiple watchers on the same signal MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $signo The signal number to monitor. - * @param callable (string $watcherId, int $signo, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the $data parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - * - * @throws UnsupportedFeatureException If signal handling is not supported. - */ - public function onSignal(int $signo, callable $callback, $data = null): string - { - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher; - $watcher->type = Watcher::SIGNAL; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->value = $signo; - $watcher->data = $data; - - $this->watchers[$watcher->id] = $watcher; - $this->enableQueue[$watcher->id] = $watcher; - - return $watcher->id; - } - - /** - * Enable a watcher to be active starting in the next tick. - * - * Watchers MUST immediately be marked as enabled, but only be activated (i.e. callbacks can be called) right before - * the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param string $watcherId The watcher identifier. - * - * @return void - * - * @throws InvalidWatcherError If the watcher identifier is invalid. - */ - public function enable(string $watcherId) - { - if (!isset($this->watchers[$watcherId])) { - throw new InvalidWatcherError($watcherId, "Cannot enable an invalid watcher identifier: '{$watcherId}'"); - } - - $watcher = $this->watchers[$watcherId]; - - if ($watcher->enabled) { - return; // Watcher already enabled. - } - - $watcher->enabled = true; - - switch ($watcher->type) { - case Watcher::DEFER: - $this->nextTickQueue[$watcher->id] = $watcher; - break; - - case Watcher::REPEAT: - case Watcher::DELAY: - \assert(\is_int($watcher->value)); - - $watcher->expiration = $this->now() + $watcher->value; - $this->enableQueue[$watcher->id] = $watcher; - break; - - default: - $this->enableQueue[$watcher->id] = $watcher; - break; - } - } - - /** - * Cancel a watcher. - * - * This will detach the event loop from all resources that are associated to the watcher. After this operation the - * watcher is permanently invalid. Calling this function MUST NOT fail, even if passed an invalid watcher. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public function cancel(string $watcherId) - { - $this->disable($watcherId); - unset($this->watchers[$watcherId]); - } - - /** - * Disable a watcher immediately. - * - * A watcher MUST be disabled immediately, e.g. if a defer watcher disables a later defer watcher, the second defer - * watcher isn't executed in this tick. - * - * Disabling a watcher MUST NOT invalidate the watcher. Calling this function MUST NOT fail, even if passed an - * invalid watcher. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public function disable(string $watcherId) - { - if (!isset($this->watchers[$watcherId])) { - return; - } - - $watcher = $this->watchers[$watcherId]; - - if (!$watcher->enabled) { - return; // Watcher already disabled. - } - - $watcher->enabled = false; - $id = $watcher->id; - - switch ($watcher->type) { - case Watcher::DEFER: - if (isset($this->nextTickQueue[$id])) { - // Watcher was only queued to be enabled. - unset($this->nextTickQueue[$id]); - } else { - unset($this->deferQueue[$id]); - } - break; - - default: - if (isset($this->enableQueue[$id])) { - // Watcher was only queued to be enabled. - unset($this->enableQueue[$id]); - } else { - $this->deactivate($watcher); - } - break; - } - } - - /** - * Deactivates (disables) the given watcher. - * - * @param Watcher $watcher - * - * @return void - */ - abstract protected function deactivate(Watcher $watcher); - - /** - * Reference a watcher. - * - * This will keep the event loop alive whilst the watcher is still being monitored. Watchers have this state by - * default. - * - * @param string $watcherId The watcher identifier. - * - * @return void - * - * @throws InvalidWatcherError If the watcher identifier is invalid. - */ - public function reference(string $watcherId) - { - if (!isset($this->watchers[$watcherId])) { - throw new InvalidWatcherError($watcherId, "Cannot reference an invalid watcher identifier: '{$watcherId}'"); - } - - $this->watchers[$watcherId]->referenced = true; - } - - /** - * Unreference a watcher. - * - * The event loop should exit the run method when only unreferenced watchers are still being monitored. Watchers - * are all referenced by default. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public function unreference(string $watcherId) - { - if (!isset($this->watchers[$watcherId])) { - return; - } - - $this->watchers[$watcherId]->referenced = false; - } - - /** - * Stores information in the loop bound registry. - * - * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages - * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. - * - * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated - * interface for that purpose instead of sharing the storage key. - * - * @param string $key The namespaced storage key. - * @param mixed $value The value to be stored. - * - * @return void - */ - final public function setState(string $key, $value) - { - if ($value === null) { - unset($this->registry[$key]); - } else { - $this->registry[$key] = $value; - } - } - - /** - * Gets information stored bound to the loop. - * - * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages - * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. - * - * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated - * interface for that purpose instead of sharing the storage key. - * - * @param string $key The namespaced storage key. - * - * @return mixed The previously stored value or `null` if it doesn't exist. - */ - final public function getState(string $key) - { - return isset($this->registry[$key]) ? $this->registry[$key] : null; - } - - /** - * Set a callback to be executed when an error occurs. - * - * The callback receives the error as the first and only parameter. The return value of the callback gets ignored. - * If it can't handle the error, it MUST throw the error. Errors thrown by the callback or during its invocation - * MUST be thrown into the `run` loop and stop the driver. - * - * Subsequent calls to this method will overwrite the previous handler. - * - * @param callable(\Throwable $error):void|null $callback The callback to execute. `null` will clear the - * current handler. - * - * @return callable(\Throwable $error):void|null The previous handler, `null` if there was none. - */ - public function setErrorHandler(callable $callback = null) - { - $previous = $this->errorHandler; - $this->errorHandler = $callback; - return $previous; - } - - /** - * Invokes the error handler with the given exception. - * - * @param \Throwable $exception The exception thrown from a watcher callback. - * - * @return void - * @throws \Throwable If no error handler has been set. - */ - protected function error(\Throwable $exception) - { - if ($this->errorHandler === null) { - throw $exception; - } - - ($this->errorHandler)($exception); - } - - /** - * Returns the current loop time in millisecond increments. Note this value does not necessarily correlate to - * wall-clock time, rather the value returned is meant to be used in relative comparisons to prior values returned - * by this method (intervals, expiration calculations, etc.) and is only updated once per loop tick. - * - * Extending classes should override this function to return a value cached once per loop tick. - * - * @return int - */ - public function now(): int - { - return (int) (\microtime(true) * self::MILLISEC_PER_SEC); - } - - /** - * Get the underlying loop handle. - * - * Example: the `uv_loop` resource for `libuv` or the `EvLoop` object for `libev` or `null` for a native driver. - * - * Note: This function is *not* exposed in the `Loop` class. Users shall access it directly on the respective loop - * instance. - * - * @return null|object|resource The loop handle the event loop operates on. `null` if there is none. - */ - abstract public function getHandle(); - - /** - * Returns the same array of data as getInfo(). - * - * @return array - */ - public function __debugInfo() - { - // @codeCoverageIgnoreStart - return $this->getInfo(); - // @codeCoverageIgnoreEnd - } - - /** - * Retrieve an associative array of information about the event loop driver. - * - * The returned array MUST contain the following data describing the driver's currently registered watchers: - * - * [ - * "defer" => ["enabled" => int, "disabled" => int], - * "delay" => ["enabled" => int, "disabled" => int], - * "repeat" => ["enabled" => int, "disabled" => int], - * "on_readable" => ["enabled" => int, "disabled" => int], - * "on_writable" => ["enabled" => int, "disabled" => int], - * "on_signal" => ["enabled" => int, "disabled" => int], - * "enabled_watchers" => ["referenced" => int, "unreferenced" => int], - * "running" => bool - * ]; - * - * Implementations MAY optionally add more information in the array but at minimum the above `key => value` format - * MUST always be provided. - * - * @return array Statistics about the loop in the described format. - */ - public function getInfo(): array - { - $watchers = [ - "referenced" => 0, - "unreferenced" => 0, - ]; - - $defer = $delay = $repeat = $onReadable = $onWritable = $onSignal = [ - "enabled" => 0, - "disabled" => 0, - ]; - - foreach ($this->watchers as $watcher) { - switch ($watcher->type) { - case Watcher::READABLE: - $array = &$onReadable; - break; - case Watcher::WRITABLE: - $array = &$onWritable; - break; - case Watcher::SIGNAL: - $array = &$onSignal; - break; - case Watcher::DEFER: - $array = &$defer; - break; - case Watcher::DELAY: - $array = &$delay; - break; - case Watcher::REPEAT: - $array = &$repeat; - break; - - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - // @codeCoverageIgnoreEnd - } - - if ($watcher->enabled) { - ++$array["enabled"]; - - if ($watcher->referenced) { - ++$watchers["referenced"]; - } else { - ++$watchers["unreferenced"]; - } - } else { - ++$array["disabled"]; - } - } - - return [ - "enabled_watchers" => $watchers, - "defer" => $defer, - "delay" => $delay, - "repeat" => $repeat, - "on_readable" => $onReadable, - "on_writable" => $onWritable, - "on_signal" => $onSignal, - "running" => (bool) $this->running, - ]; - } -} diff --git a/vendor/amphp/amp/lib/Loop/DriverFactory.php b/vendor/amphp/amp/lib/Loop/DriverFactory.php deleted file mode 100644 index 0ce16524..00000000 --- a/vendor/amphp/amp/lib/Loop/DriverFactory.php +++ /dev/null @@ -1,73 +0,0 @@ -createDriverFromEnv()) { - return $driver; - } - - if (UvDriver::isSupported()) { - return new UvDriver; - } - - if (EvDriver::isSupported()) { - return new EvDriver; - } - - if (EventDriver::isSupported()) { - return new EventDriver; - } - - return new NativeDriver; - })(); - - if (\getenv("AMP_DEBUG_TRACE_WATCHERS")) { - return new TracingDriver($driver); - } - - return $driver; - } - - /** - * @return Driver|null - */ - private function createDriverFromEnv() - { - $driver = \getenv("AMP_LOOP_DRIVER"); - - if (!$driver) { - return null; - } - - if (!\class_exists($driver)) { - throw new \Error(\sprintf( - "Driver '%s' does not exist.", - $driver - )); - } - - if (!\is_subclass_of($driver, Driver::class)) { - throw new \Error(\sprintf( - "Driver '%s' is not a subclass of '%s'.", - $driver, - Driver::class - )); - } - - return new $driver; - } -} -// @codeCoverageIgnoreEnd diff --git a/vendor/amphp/amp/lib/Loop/EvDriver.php b/vendor/amphp/amp/lib/Loop/EvDriver.php deleted file mode 100644 index 401bb3ba..00000000 --- a/vendor/amphp/amp/lib/Loop/EvDriver.php +++ /dev/null @@ -1,317 +0,0 @@ -handle = new \EvLoop; - $this->nowOffset = getCurrentTime(); - $this->now = \random_int(0, $this->nowOffset); - $this->nowOffset -= $this->now; - - if (self::$activeSignals === null) { - self::$activeSignals = &$this->signals; - } - - /** - * @param \EvIO $event - * - * @return void - */ - $this->ioCallback = function (\EvIO $event) { - /** @var Watcher $watcher */ - $watcher = $event->data; - - try { - $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - - /** - * @param \EvTimer $event - * - * @return void - */ - $this->timerCallback = function (\EvTimer $event) { - /** @var Watcher $watcher */ - $watcher = $event->data; - - if ($watcher->type & Watcher::DELAY) { - $this->cancel($watcher->id); - } elseif ($watcher->value === 0) { - // Disable and re-enable so it's not executed repeatedly in the same tick - // See https://github.com/amphp/amp/issues/131 - $this->disable($watcher->id); - $this->enable($watcher->id); - } - - try { - $result = ($watcher->callback)($watcher->id, $watcher->data); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - - /** - * @param \EvSignal $event - * - * @return void - */ - $this->signalCallback = function (\EvSignal $event) { - /** @var Watcher $watcher */ - $watcher = $event->data; - - try { - $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - } - - /** - * {@inheritdoc} - */ - public function cancel(string $watcherId) - { - parent::cancel($watcherId); - unset($this->events[$watcherId]); - } - - public function __destruct() - { - foreach ($this->events as $event) { - /** @psalm-suppress all */ - if ($event !== null) { // Events may have been nulled in extension depending on destruct order. - $event->stop(); - } - } - - // We need to clear all references to events manually, see - // https://bitbucket.org/osmanov/pecl-ev/issues/31/segfault-in-ev_timer_stop - $this->events = []; - } - - /** - * {@inheritdoc} - */ - public function run() - { - $active = self::$activeSignals; - - \assert($active !== null); - - foreach ($active as $event) { - $event->stop(); - } - - self::$activeSignals = &$this->signals; - - foreach ($this->signals as $event) { - $event->start(); - } - - try { - parent::run(); - } finally { - foreach ($this->signals as $event) { - $event->stop(); - } - - self::$activeSignals = &$active; - - foreach ($active as $event) { - $event->start(); - } - } - } - - /** - * {@inheritdoc} - */ - public function stop() - { - $this->handle->stop(); - parent::stop(); - } - - /** - * {@inheritdoc} - */ - public function now(): int - { - $this->now = getCurrentTime() - $this->nowOffset; - - return $this->now; - } - - /** - * {@inheritdoc} - */ - public function getHandle(): \EvLoop - { - return $this->handle; - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function dispatch(bool $blocking) - { - $this->handle->run($blocking ? \Ev::RUN_ONCE : \Ev::RUN_ONCE | \Ev::RUN_NOWAIT); - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function activate(array $watchers) - { - $this->handle->nowUpdate(); - $now = $this->now(); - - foreach ($watchers as $watcher) { - if (!isset($this->events[$id = $watcher->id])) { - switch ($watcher->type) { - case Watcher::READABLE: - \assert(\is_resource($watcher->value)); - - $this->events[$id] = $this->handle->io($watcher->value, \Ev::READ, $this->ioCallback, $watcher); - break; - - case Watcher::WRITABLE: - \assert(\is_resource($watcher->value)); - - $this->events[$id] = $this->handle->io( - $watcher->value, - \Ev::WRITE, - $this->ioCallback, - $watcher - ); - break; - - case Watcher::DELAY: - case Watcher::REPEAT: - \assert(\is_int($watcher->value)); - - $interval = $watcher->value / self::MILLISEC_PER_SEC; - $this->events[$id] = $this->handle->timer( - \max(0, ($watcher->expiration - $now) / self::MILLISEC_PER_SEC), - ($watcher->type & Watcher::REPEAT) ? $interval : 0, - $this->timerCallback, - $watcher - ); - break; - - case Watcher::SIGNAL: - \assert(\is_int($watcher->value)); - - $this->events[$id] = $this->handle->signal($watcher->value, $this->signalCallback, $watcher); - break; - - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - // @codeCoverageIgnoreEnd - } - } else { - $this->events[$id]->start(); - } - - if ($watcher->type === Watcher::SIGNAL) { - /** @psalm-suppress PropertyTypeCoercion */ - $this->signals[$id] = $this->events[$id]; - } - } - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function deactivate(Watcher $watcher) - { - if (isset($this->events[$id = $watcher->id])) { - $this->events[$id]->stop(); - - if ($watcher->type === Watcher::SIGNAL) { - unset($this->signals[$id]); - } - } - } -} diff --git a/vendor/amphp/amp/lib/Loop/EventDriver.php b/vendor/amphp/amp/lib/Loop/EventDriver.php deleted file mode 100644 index c4a9b9b5..00000000 --- a/vendor/amphp/amp/lib/Loop/EventDriver.php +++ /dev/null @@ -1,367 +0,0 @@ -requireFeatures(\EventConfig::FEATURE_FDS); - } - - $this->handle = new \EventBase($config); - $this->nowOffset = getCurrentTime(); - $this->now = \random_int(0, $this->nowOffset); - $this->nowOffset -= $this->now; - - if (self::$activeSignals === null) { - self::$activeSignals = &$this->signals; - } - - /** - * @param $resource - * @param $what - * @param Watcher $watcher - * - * @return void - */ - $this->ioCallback = function ($resource, $what, Watcher $watcher) { - \assert(\is_resource($watcher->value)); - - try { - $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - - /** - * @param $resource - * @param $what - * @param Watcher $watcher - * - * @return void - */ - $this->timerCallback = function ($resource, $what, Watcher $watcher) { - \assert(\is_int($watcher->value)); - - if ($watcher->type & Watcher::DELAY) { - $this->cancel($watcher->id); - } else { - $this->events[$watcher->id]->add($watcher->value / self::MILLISEC_PER_SEC); - } - - try { - $result = ($watcher->callback)($watcher->id, $watcher->data); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - - /** - * @param $signum - * @param $what - * @param Watcher $watcher - * - * @return void - */ - $this->signalCallback = function ($signum, $what, Watcher $watcher) { - try { - $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - } - - /** - * {@inheritdoc} - */ - public function cancel(string $watcherId) - { - parent::cancel($watcherId); - - if (isset($this->events[$watcherId])) { - $this->events[$watcherId]->free(); - unset($this->events[$watcherId]); - } - } - - public static function isSupported(): bool - { - return \extension_loaded("event"); - } - - /** - * @codeCoverageIgnore - */ - public function __destruct() - { - // Unset here, otherwise $event->del() in the loop may fail with a warning, because __destruct order isn't defined. - // Related https://github.com/amphp/amp/issues/159. - $events = $this->events; - $this->events = []; - - foreach ($events as $event) { - if ($event !== null) { // Events may have been nulled in extension depending on destruct order. - $event->free(); - } - } - - // Manually free the loop handle to fully release loop resources. - // See https://github.com/amphp/amp/issues/177. - if ($this->handle !== null) { - $this->handle->free(); - $this->handle = null; - } - } - - /** - * {@inheritdoc} - */ - public function run() - { - $active = self::$activeSignals; - - \assert($active !== null); - - foreach ($active as $event) { - $event->del(); - } - - self::$activeSignals = &$this->signals; - - foreach ($this->signals as $event) { - /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ - $event->add(); - } - - try { - parent::run(); - } finally { - foreach ($this->signals as $event) { - $event->del(); - } - - self::$activeSignals = &$active; - - foreach ($active as $event) { - /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ - $event->add(); - } - } - } - - /** - * {@inheritdoc} - */ - public function stop() - { - $this->handle->stop(); - parent::stop(); - } - - /** - * {@inheritdoc} - */ - public function now(): int - { - $this->now = getCurrentTime() - $this->nowOffset; - - return $this->now; - } - - /** - * {@inheritdoc} - */ - public function getHandle(): \EventBase - { - return $this->handle; - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function dispatch(bool $blocking) - { - $this->handle->loop($blocking ? \EventBase::LOOP_ONCE : \EventBase::LOOP_ONCE | \EventBase::LOOP_NONBLOCK); - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function activate(array $watchers) - { - $now = $this->now(); - - foreach ($watchers as $watcher) { - if (!isset($this->events[$id = $watcher->id])) { - switch ($watcher->type) { - case Watcher::READABLE: - \assert(\is_resource($watcher->value)); - - $this->events[$id] = new \Event( - $this->handle, - $watcher->value, - \Event::READ | \Event::PERSIST, - $this->ioCallback, - $watcher - ); - break; - - case Watcher::WRITABLE: - \assert(\is_resource($watcher->value)); - - $this->events[$id] = new \Event( - $this->handle, - $watcher->value, - \Event::WRITE | \Event::PERSIST, - $this->ioCallback, - $watcher - ); - break; - - case Watcher::DELAY: - case Watcher::REPEAT: - \assert(\is_int($watcher->value)); - - $this->events[$id] = new \Event( - $this->handle, - -1, - \Event::TIMEOUT, - $this->timerCallback, - $watcher - ); - break; - - case Watcher::SIGNAL: - \assert(\is_int($watcher->value)); - - $this->events[$id] = new \Event( - $this->handle, - $watcher->value, - \Event::SIGNAL | \Event::PERSIST, - $this->signalCallback, - $watcher - ); - break; - - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - // @codeCoverageIgnoreEnd - } - } - - switch ($watcher->type) { - case Watcher::DELAY: - case Watcher::REPEAT: - \assert(\is_int($watcher->value)); - - $interval = \max(0, $watcher->expiration - $now); - $this->events[$id]->add($interval > 0 ? $interval / self::MILLISEC_PER_SEC : 0); - break; - - case Watcher::SIGNAL: - $this->signals[$id] = $this->events[$id]; - // no break - - default: - /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ - $this->events[$id]->add(); - break; - } - } - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function deactivate(Watcher $watcher) - { - if (isset($this->events[$id = $watcher->id])) { - $this->events[$id]->del(); - - if ($watcher->type === Watcher::SIGNAL) { - unset($this->signals[$id]); - } - } - } -} diff --git a/vendor/amphp/amp/lib/Loop/Internal/TimerQueue.php b/vendor/amphp/amp/lib/Loop/Internal/TimerQueue.php deleted file mode 100644 index f2be704c..00000000 --- a/vendor/amphp/amp/lib/Loop/Internal/TimerQueue.php +++ /dev/null @@ -1,169 +0,0 @@ -data[$node]; - while ($node !== 0 && $entry->expiration < $this->data[$parent = ($node - 1) >> 1]->expiration) { - $this->swap($node, $parent); - $node = $parent; - } - } - - /** - * @param int $node Rebuild the data array from the given node downward. - * - * @return void - */ - private function heapifyDown(int $node) - { - $length = \count($this->data); - while (($child = ($node << 1) + 1) < $length) { - if ($this->data[$child]->expiration < $this->data[$node]->expiration - && ($child + 1 >= $length || $this->data[$child]->expiration < $this->data[$child + 1]->expiration) - ) { - // Left child is less than parent and right child. - $swap = $child; - } elseif ($child + 1 < $length && $this->data[$child + 1]->expiration < $this->data[$node]->expiration) { - // Right child is less than parent and left child. - $swap = $child + 1; - } else { // Left and right child are greater than parent. - break; - } - - $this->swap($node, $swap); - $node = $swap; - } - } - - private function swap(int $left, int $right) - { - $temp = $this->data[$left]; - - $this->data[$left] = $this->data[$right]; - $this->pointers[$this->data[$right]->id] = $left; - - $this->data[$right] = $temp; - $this->pointers[$temp->id] = $right; - } - - /** - * Inserts the watcher into the queue. Time complexity: O(log(n)). - * - * @param Watcher $watcher - * - * @psalm-param Watcher $watcher - * - * @return void - */ - public function insert(Watcher $watcher) - { - \assert($watcher->expiration !== null); - \assert(!isset($this->pointers[$watcher->id])); - - $node = \count($this->data); - $this->data[$node] = $watcher; - $this->pointers[$watcher->id] = $node; - - $this->heapifyUp($node); - } - - /** - * Removes the given watcher from the queue. Time complexity: O(log(n)). - * - * @param Watcher $watcher - * - * @psalm-param Watcher $watcher - * - * @return void - */ - public function remove(Watcher $watcher) - { - $id = $watcher->id; - - if (!isset($this->pointers[$id])) { - return; - } - - $this->removeAndRebuild($this->pointers[$id]); - } - - /** - * Deletes and returns the Watcher on top of the heap if it has expired, otherwise null is returned. - * Time complexity: O(log(n)). - * - * @param int $now Current loop time. - * - * @return Watcher|null Expired watcher at the top of the heap or null if the watcher has not expired. - * - * @psalm-return Watcher|null - */ - public function extract(int $now) - { - if (empty($this->data)) { - return null; - } - - $watcher = $this->data[0]; - - if ($watcher->expiration > $now) { - return null; - } - - $this->removeAndRebuild(0); - - return $watcher; - } - - /** - * Returns the expiration time value at the top of the heap. Time complexity: O(1). - * - * @return int|null Expiration time of the watcher at the top of the heap or null if the heap is empty. - */ - public function peek() - { - return isset($this->data[0]) ? $this->data[0]->expiration : null; - } - - /** - * @param int $node Remove the given node and then rebuild the data array. - * - * @return void - */ - private function removeAndRebuild(int $node) - { - $length = \count($this->data) - 1; - $id = $this->data[$node]->id; - $left = $this->data[$node] = $this->data[$length]; - $this->pointers[$left->id] = $node; - unset($this->data[$length], $this->pointers[$id]); - - if ($node < $length) { // don't need to do anything if we removed the last element - $parent = ($node - 1) >> 1; - if ($parent >= 0 && $this->data[$node]->expiration < $this->data[$parent]->expiration) { - $this->heapifyUp($node); - } else { - $this->heapifyDown($node); - } - } - } -} diff --git a/vendor/amphp/amp/lib/Loop/InvalidWatcherError.php b/vendor/amphp/amp/lib/Loop/InvalidWatcherError.php deleted file mode 100644 index 4842ecf5..00000000 --- a/vendor/amphp/amp/lib/Loop/InvalidWatcherError.php +++ /dev/null @@ -1,32 +0,0 @@ -watcherId = $watcherId; - parent::__construct($message); - } - - /** - * @return string The watcher identifier. - */ - public function getWatcherId() - { - return $this->watcherId; - } -} diff --git a/vendor/amphp/amp/lib/Loop/NativeDriver.php b/vendor/amphp/amp/lib/Loop/NativeDriver.php deleted file mode 100644 index 1a1302e3..00000000 --- a/vendor/amphp/amp/lib/Loop/NativeDriver.php +++ /dev/null @@ -1,445 +0,0 @@ -timerQueue = new Internal\TimerQueue; - $this->signalHandling = \extension_loaded("pcntl"); - $this->nowOffset = getCurrentTime(); - $this->now = \random_int(0, $this->nowOffset); - $this->nowOffset -= $this->now; - $this->streamSelectErrorHandler = function ($errno, $message) { - // Casing changed in PHP 8 from 'unable' to 'Unable' - if (\stripos($message, "stream_select(): unable to select [4]: ") === 0) { // EINTR - $this->streamSelectIgnoreResult = true; - - return; - } - - if (\strpos($message, 'FD_SETSIZE') !== false) { - $message = \str_replace(["\r\n", "\n", "\r"], " ", $message); - $pattern = '(stream_select\(\): You MUST recompile PHP with a larger value of FD_SETSIZE. It is set to (\d+), but you have descriptors numbered at least as high as (\d+)\.)'; - - if (\preg_match($pattern, $message, $match)) { - $helpLink = 'https://amphp.org/amp/event-loop/#implementations'; - - $message = 'You have reached the limits of stream_select(). It has a FD_SETSIZE of ' . $match[1] - . ', but you have file descriptors numbered at least as high as ' . $match[2] . '. ' - . "You can install one of the extensions listed on {$helpLink} to support a higher number of " - . "concurrent file descriptors. If a large number of open file descriptors is unexpected, you " - . "might be leaking file descriptors that aren't closed correctly."; - } - } - - throw new \Exception($message, $errno); - }; - } - - /** - * {@inheritdoc} - * - * @throws \Amp\Loop\UnsupportedFeatureException If the pcntl extension is not available. - */ - public function onSignal(int $signo, callable $callback, $data = null): string - { - if (!$this->signalHandling) { - throw new UnsupportedFeatureException("Signal handling requires the pcntl extension"); - } - - return parent::onSignal($signo, $callback, $data); - } - - /** - * {@inheritdoc} - */ - public function now(): int - { - $this->now = getCurrentTime() - $this->nowOffset; - - return $this->now; - } - - /** - * {@inheritdoc} - */ - public function getHandle() - { - return null; - } - - /** - * @param bool $blocking - * - * @return void - * - * @throws \Throwable - */ - protected function dispatch(bool $blocking) - { - $this->selectStreams( - $this->readStreams, - $this->writeStreams, - $blocking ? $this->getTimeout() : 0 - ); - - $now = $this->now(); - - while ($watcher = $this->timerQueue->extract($now)) { - if ($watcher->type & Watcher::REPEAT) { - $watcher->enabled = false; // Trick base class into adding to enable queue when calling enable() - $this->enable($watcher->id); - } else { - $this->cancel($watcher->id); - } - - try { - // Execute the timer. - $result = ($watcher->callback)($watcher->id, $watcher->data); - - if ($result === null) { - continue; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - - if ($this->signalHandling) { - \pcntl_signal_dispatch(); - } - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function activate(array $watchers) - { - foreach ($watchers as $watcher) { - switch ($watcher->type) { - case Watcher::READABLE: - \assert(\is_resource($watcher->value)); - - $streamId = (int) $watcher->value; - $this->readWatchers[$streamId][$watcher->id] = $watcher; - $this->readStreams[$streamId] = $watcher->value; - break; - - case Watcher::WRITABLE: - \assert(\is_resource($watcher->value)); - - $streamId = (int) $watcher->value; - $this->writeWatchers[$streamId][$watcher->id] = $watcher; - $this->writeStreams[$streamId] = $watcher->value; - break; - - case Watcher::DELAY: - case Watcher::REPEAT: - \assert(\is_int($watcher->value)); - $this->timerQueue->insert($watcher); - break; - - case Watcher::SIGNAL: - \assert(\is_int($watcher->value)); - - if (!isset($this->signalWatchers[$watcher->value])) { - if (!@\pcntl_signal($watcher->value, $this->callableFromInstanceMethod('handleSignal'))) { - $message = "Failed to register signal handler"; - if ($error = \error_get_last()) { - $message .= \sprintf("; Errno: %d; %s", $error["type"], $error["message"]); - } - throw new \Error($message); - } - } - - $this->signalWatchers[$watcher->value][$watcher->id] = $watcher; - break; - - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - // @codeCoverageIgnoreEnd - } - } - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function deactivate(Watcher $watcher) - { - switch ($watcher->type) { - case Watcher::READABLE: - $streamId = (int) $watcher->value; - unset($this->readWatchers[$streamId][$watcher->id]); - if (empty($this->readWatchers[$streamId])) { - unset($this->readWatchers[$streamId], $this->readStreams[$streamId]); - } - break; - - case Watcher::WRITABLE: - $streamId = (int) $watcher->value; - unset($this->writeWatchers[$streamId][$watcher->id]); - if (empty($this->writeWatchers[$streamId])) { - unset($this->writeWatchers[$streamId], $this->writeStreams[$streamId]); - } - break; - - case Watcher::DELAY: - case Watcher::REPEAT: - $this->timerQueue->remove($watcher); - break; - - case Watcher::SIGNAL: - \assert(\is_int($watcher->value)); - - if (isset($this->signalWatchers[$watcher->value])) { - unset($this->signalWatchers[$watcher->value][$watcher->id]); - - if (empty($this->signalWatchers[$watcher->value])) { - unset($this->signalWatchers[$watcher->value]); - @\pcntl_signal($watcher->value, \SIG_DFL); - } - } - break; - - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - // @codeCoverageIgnoreEnd - } - } - - /** - * @param resource[] $read - * @param resource[] $write - * @param int $timeout - * - * @return void - */ - private function selectStreams(array $read, array $write, int $timeout) - { - $timeout /= self::MILLISEC_PER_SEC; - - if (!empty($read) || !empty($write)) { // Use stream_select() if there are any streams in the loop. - if ($timeout >= 0) { - $seconds = (int) $timeout; - $microseconds = (int) (($timeout - $seconds) * self::MICROSEC_PER_SEC); - } else { - $seconds = null; - $microseconds = null; - } - - // Failed connection attempts are indicated via except on Windows - // @link https://github.com/reactphp/event-loop/blob/8bd064ce23c26c4decf186c2a5a818c9a8209eb0/src/StreamSelectLoop.php#L279-L287 - // @link https://docs.microsoft.com/de-de/windows/win32/api/winsock2/nf-winsock2-select - $except = null; - if (\DIRECTORY_SEPARATOR === '\\') { - $except = $write; - } - - \set_error_handler($this->streamSelectErrorHandler); - - try { - $result = \stream_select($read, $write, $except, $seconds, $microseconds); - } finally { - \restore_error_handler(); - } - - if ($this->streamSelectIgnoreResult || $result === 0) { - $this->streamSelectIgnoreResult = false; - return; - } - - if (!$result) { - $this->error(new \Exception('Unknown error during stream_select')); - return; - } - - foreach ($read as $stream) { - $streamId = (int) $stream; - if (!isset($this->readWatchers[$streamId])) { - continue; // All read watchers disabled. - } - - foreach ($this->readWatchers[$streamId] as $watcher) { - if (!isset($this->readWatchers[$streamId][$watcher->id])) { - continue; // Watcher disabled by another IO watcher. - } - - try { - $result = ($watcher->callback)($watcher->id, $stream, $watcher->data); - - if ($result === null) { - continue; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - } - - \assert(\is_array($write)); // See https://github.com/vimeo/psalm/issues/3036 - - if ($except) { - foreach ($except as $key => $socket) { - $write[$key] = $socket; - } - } - - foreach ($write as $stream) { - $streamId = (int) $stream; - if (!isset($this->writeWatchers[$streamId])) { - continue; // All write watchers disabled. - } - - foreach ($this->writeWatchers[$streamId] as $watcher) { - if (!isset($this->writeWatchers[$streamId][$watcher->id])) { - continue; // Watcher disabled by another IO watcher. - } - - try { - $result = ($watcher->callback)($watcher->id, $stream, $watcher->data); - - if ($result === null) { - continue; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - } - - return; - } - - if ($timeout < 0) { // Only signal watchers are enabled, so sleep indefinitely. - \usleep(\PHP_INT_MAX); - return; - } - - if ($timeout > 0) { // Sleep until next timer expires. - \usleep((int) ($timeout * self::MICROSEC_PER_SEC)); - } - } - - /** - * @return int Milliseconds until next timer expires or -1 if there are no pending times. - */ - private function getTimeout(): int - { - $expiration = $this->timerQueue->peek(); - - if ($expiration === null) { - return -1; - } - - $expiration -= getCurrentTime() - $this->nowOffset; - - return $expiration > 0 ? $expiration : 0; - } - - /** - * @param int $signo - * - * @return void - */ - private function handleSignal(int $signo) - { - foreach ($this->signalWatchers[$signo] as $watcher) { - if (!isset($this->signalWatchers[$signo][$watcher->id])) { - continue; - } - - try { - $result = ($watcher->callback)($watcher->id, $signo, $watcher->data); - - if ($result === null) { - continue; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - } -} diff --git a/vendor/amphp/amp/lib/Loop/TracingDriver.php b/vendor/amphp/amp/lib/Loop/TracingDriver.php deleted file mode 100644 index 7b787548..00000000 --- a/vendor/amphp/amp/lib/Loop/TracingDriver.php +++ /dev/null @@ -1,251 +0,0 @@ -driver = $driver; - } - - public function run() - { - $this->driver->run(); - } - - public function stop() - { - $this->driver->stop(); - } - - public function defer(callable $callback, $data = null): string - { - $id = $this->driver->defer(function (...$args) use ($callback) { - $this->cancel($args[0]); - return $callback(...$args); - }, $data); - - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = true; - - return $id; - } - - public function delay(int $delay, callable $callback, $data = null): string - { - $id = $this->driver->delay($delay, function (...$args) use ($callback) { - $this->cancel($args[0]); - return $callback(...$args); - }, $data); - - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = true; - - return $id; - } - - public function repeat(int $interval, callable $callback, $data = null): string - { - $id = $this->driver->repeat($interval, $callback, $data); - - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = true; - - return $id; - } - - public function onReadable($stream, callable $callback, $data = null): string - { - $id = $this->driver->onReadable($stream, $callback, $data); - - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = true; - - return $id; - } - - public function onWritable($stream, callable $callback, $data = null): string - { - $id = $this->driver->onWritable($stream, $callback, $data); - - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = true; - - return $id; - } - - public function onSignal(int $signo, callable $callback, $data = null): string - { - $id = $this->driver->onSignal($signo, $callback, $data); - - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = true; - - return $id; - } - - public function enable(string $watcherId) - { - try { - $this->driver->enable($watcherId); - $this->enabledWatchers[$watcherId] = true; - } catch (InvalidWatcherError $e) { - throw new InvalidWatcherError( - $watcherId, - $e->getMessage() . "\r\n\r\n" . $this->getTraces($watcherId) - ); - } - } - - public function cancel(string $watcherId) - { - $this->driver->cancel($watcherId); - - if (!isset($this->cancelTraces[$watcherId])) { - $this->cancelTraces[$watcherId] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - } - - unset($this->enabledWatchers[$watcherId], $this->unreferencedWatchers[$watcherId]); - } - - public function disable(string $watcherId) - { - $this->driver->disable($watcherId); - unset($this->enabledWatchers[$watcherId]); - } - - public function reference(string $watcherId) - { - try { - $this->driver->reference($watcherId); - unset($this->unreferencedWatchers[$watcherId]); - } catch (InvalidWatcherError $e) { - throw new InvalidWatcherError( - $watcherId, - $e->getMessage() . "\r\n\r\n" . $this->getTraces($watcherId) - ); - } - } - - public function unreference(string $watcherId) - { - $this->driver->unreference($watcherId); - $this->unreferencedWatchers[$watcherId] = true; - } - - public function setErrorHandler(callable $callback = null) - { - return $this->driver->setErrorHandler($callback); - } - - /** @inheritdoc */ - public function getHandle() - { - $this->driver->getHandle(); - } - - public function dump(): string - { - $dump = "Enabled, referenced watchers keeping the loop running: "; - - foreach ($this->enabledWatchers as $watcher => $_) { - if (isset($this->unreferencedWatchers[$watcher])) { - continue; - } - - $dump .= "Watcher ID: " . $watcher . "\r\n"; - $dump .= $this->getCreationTrace($watcher); - $dump .= "\r\n\r\n"; - } - - return \rtrim($dump); - } - - public function getInfo(): array - { - return $this->driver->getInfo(); - } - - public function __debugInfo() - { - return $this->driver->__debugInfo(); - } - - public function now(): int - { - return $this->driver->now(); - } - - protected function error(\Throwable $exception) - { - $this->driver->error($exception); - } - - /** - * @inheritdoc - * - * @return void - */ - protected function activate(array $watchers) - { - // nothing to do in a decorator - } - - /** - * @inheritdoc - * - * @return void - */ - protected function dispatch(bool $blocking) - { - // nothing to do in a decorator - } - - /** - * @inheritdoc - * - * @return void - */ - protected function deactivate(Watcher $watcher) - { - // nothing to do in a decorator - } - - private function getTraces(string $watcherId): string - { - return "Creation Trace:\r\n" . $this->getCreationTrace($watcherId) . "\r\n\r\n" . - "Cancellation Trace:\r\n" . $this->getCancelTrace($watcherId); - } - - private function getCreationTrace(string $watcher): string - { - if (!isset($this->creationTraces[$watcher])) { - return 'No creation trace, yet.'; - } - - return $this->creationTraces[$watcher]; - } - - private function getCancelTrace(string $watcher): string - { - if (!isset($this->cancelTraces[$watcher])) { - return 'No cancellation trace, yet.'; - } - - return $this->cancelTraces[$watcher]; - } -} diff --git a/vendor/amphp/amp/lib/Loop/UnsupportedFeatureException.php b/vendor/amphp/amp/lib/Loop/UnsupportedFeatureException.php deleted file mode 100644 index e767cbe1..00000000 --- a/vendor/amphp/amp/lib/Loop/UnsupportedFeatureException.php +++ /dev/null @@ -1,12 +0,0 @@ -handle = \uv_loop_new(); - - /** - * @param $event - * @param $status - * @param $events - * @param $resource - * - * @return void - */ - $this->ioCallback = function ($event, $status, $events, $resource) { - $watchers = $this->watchers[(int) $event]; - - switch ($status) { - case 0: // OK - break; - - default: // Invoke the callback on errors, as this matches behavior with other loop back-ends. - // Re-enable watcher as libuv disables the watcher on non-zero status. - $flags = 0; - foreach ($watchers as $watcher) { - $flags |= $watcher->enabled ? $watcher->type : 0; - } - \uv_poll_start($event, $flags, $this->ioCallback); - break; - } - - foreach ($watchers as $watcher) { - // $events is OR'ed with 4 to trigger watcher if no events are indicated (0) or on UV_DISCONNECT (4). - // http://docs.libuv.org/en/v1.x/poll.html - if (!($watcher->enabled && ($watcher->type & $events || ($events | 4) === 4))) { - continue; - } - - try { - $result = ($watcher->callback)($watcher->id, $resource, $watcher->data); - - if ($result === null) { - continue; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - }; - - /** - * @param $event - * - * @return void - */ - $this->timerCallback = function ($event) { - $watcher = $this->watchers[(int) $event][0]; - - if ($watcher->type & Watcher::DELAY) { - unset($this->events[$watcher->id], $this->watchers[(int) $event]); // Avoid call to uv_is_active(). - $this->cancel($watcher->id); // Remove reference to watcher in parent. - } elseif ($watcher->value === 0) { - // Disable and re-enable so it's not executed repeatedly in the same tick - // See https://github.com/amphp/amp/issues/131 - $this->disable($watcher->id); - $this->enable($watcher->id); - } - - try { - $result = ($watcher->callback)($watcher->id, $watcher->data); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - - /** - * @param $event - * @param $signo - * - * @return void - */ - $this->signalCallback = function ($event, $signo) { - $watcher = $this->watchers[(int) $event][0]; - - try { - $result = ($watcher->callback)($watcher->id, $signo, $watcher->data); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - } - - /** - * {@inheritdoc} - */ - public function cancel(string $watcherId) - { - parent::cancel($watcherId); - - if (!isset($this->events[$watcherId])) { - return; - } - - $event = $this->events[$watcherId]; - $eventId = (int) $event; - - if (isset($this->watchers[$eventId][0])) { // All except IO watchers. - unset($this->watchers[$eventId]); - } elseif (isset($this->watchers[$eventId][$watcherId])) { - $watcher = $this->watchers[$eventId][$watcherId]; - unset($this->watchers[$eventId][$watcherId]); - - if (empty($this->watchers[$eventId])) { - unset($this->watchers[$eventId], $this->streams[(int) $watcher->value]); - } - } - - unset($this->events[$watcherId]); - } - - public static function isSupported(): bool - { - return \extension_loaded("uv"); - } - - /** - * {@inheritdoc} - */ - public function now(): int - { - \uv_update_time($this->handle); - - /** @psalm-suppress TooManyArguments */ - return \uv_now($this->handle); - } - - /** - * {@inheritdoc} - */ - public function getHandle() - { - return $this->handle; - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function dispatch(bool $blocking) - { - /** @psalm-suppress TooManyArguments */ - \uv_run($this->handle, $blocking ? \UV::RUN_ONCE : \UV::RUN_NOWAIT); - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function activate(array $watchers) - { - $now = $this->now(); - - foreach ($watchers as $watcher) { - $id = $watcher->id; - - switch ($watcher->type) { - case Watcher::READABLE: - case Watcher::WRITABLE: - \assert(\is_resource($watcher->value)); - - $streamId = (int) $watcher->value; - - if (isset($this->streams[$streamId])) { - $event = $this->streams[$streamId]; - } elseif (isset($this->events[$id])) { - $event = $this->streams[$streamId] = $this->events[$id]; - } else { - /** @psalm-suppress UndefinedFunction */ - $event = $this->streams[$streamId] = \uv_poll_init_socket($this->handle, $watcher->value); - } - - $eventId = (int) $event; - $this->events[$id] = $event; - $this->watchers[$eventId][$id] = $watcher; - - $flags = 0; - foreach ($this->watchers[$eventId] as $w) { - $flags |= $w->enabled ? $w->type : 0; - } - \uv_poll_start($event, $flags, $this->ioCallback); - break; - - case Watcher::DELAY: - case Watcher::REPEAT: - \assert(\is_int($watcher->value)); - - if (isset($this->events[$id])) { - $event = $this->events[$id]; - } else { - $event = $this->events[$id] = \uv_timer_init($this->handle); - } - - $this->watchers[(int) $event] = [$watcher]; - - \uv_timer_start( - $event, - \max(0, $watcher->expiration - $now), - ($watcher->type & Watcher::REPEAT) ? $watcher->value : 0, - $this->timerCallback - ); - break; - - case Watcher::SIGNAL: - \assert(\is_int($watcher->value)); - - if (isset($this->events[$id])) { - $event = $this->events[$id]; - } else { - /** @psalm-suppress UndefinedFunction */ - $event = $this->events[$id] = \uv_signal_init($this->handle); - } - - $this->watchers[(int) $event] = [$watcher]; - - /** @psalm-suppress UndefinedFunction */ - \uv_signal_start($event, $this->signalCallback, $watcher->value); - break; - - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - // @codeCoverageIgnoreEnd - } - } - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function deactivate(Watcher $watcher) - { - $id = $watcher->id; - - if (!isset($this->events[$id])) { - return; - } - - $event = $this->events[$id]; - - if (!\uv_is_active($event)) { - return; - } - - switch ($watcher->type) { - case Watcher::READABLE: - case Watcher::WRITABLE: - $flags = 0; - foreach ($this->watchers[(int) $event] as $w) { - $flags |= $w->enabled ? $w->type : 0; - } - - if ($flags) { - \uv_poll_start($event, $flags, $this->ioCallback); - } else { - \uv_poll_stop($event); - } - break; - - case Watcher::DELAY: - case Watcher::REPEAT: - \uv_timer_stop($event); - break; - - case Watcher::SIGNAL: - \uv_signal_stop($event); - break; - - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - // @codeCoverageIgnoreEnd - } - } -} diff --git a/vendor/amphp/amp/lib/Loop/Watcher.php b/vendor/amphp/amp/lib/Loop/Watcher.php deleted file mode 100644 index 4d16f9b9..00000000 --- a/vendor/amphp/amp/lib/Loop/Watcher.php +++ /dev/null @@ -1,57 +0,0 @@ -reasons = $reasons; - } - - /** - * @return \Throwable[] - */ - public function getReasons(): array - { - return $this->reasons; - } -} diff --git a/vendor/amphp/amp/lib/NullCancellationToken.php b/vendor/amphp/amp/lib/NullCancellationToken.php deleted file mode 100644 index 66faeba1..00000000 --- a/vendor/amphp/amp/lib/NullCancellationToken.php +++ /dev/null @@ -1,53 +0,0 @@ -throwIfRequested(); - * } - * ``` - * - * potentially multiple times, it allows writing - * - * ```php - * $token = $token ?? new NullCancellationToken; - * - * // ... - * - * $token->throwIfRequested(); - * ``` - * - * instead. - */ -final class NullCancellationToken implements CancellationToken -{ - /** @inheritdoc */ - public function subscribe(callable $callback): string - { - return "null-token"; - } - - /** @inheritdoc */ - public function unsubscribe(string $id) - { - // nothing to do - } - - /** @inheritdoc */ - public function isRequested(): bool - { - return false; - } - - /** @inheritdoc */ - public function throwIfRequested() - { - // nothing to do - } -} diff --git a/vendor/amphp/amp/lib/Producer.php b/vendor/amphp/amp/lib/Producer.php deleted file mode 100644 index 35b88c91..00000000 --- a/vendor/amphp/amp/lib/Producer.php +++ /dev/null @@ -1,43 +0,0 @@ - - */ -final class Producer implements Iterator -{ - /** - * @use Internal\Producer - */ - use CallableMaker, Internal\Producer; - - /** - * @param callable(callable(TValue):Promise):\Generator $producer - * - * @throws \Error Thrown if the callable does not return a Generator. - */ - public function __construct(callable $producer) - { - $result = $producer($this->callableFromInstanceMethod("emit")); - - if (!$result instanceof \Generator) { - throw new \Error("The callable did not return a Generator"); - } - - $coroutine = new Coroutine($result); - $coroutine->onResolve(function ($exception) { - if ($this->complete) { - return; - } - - if ($exception) { - $this->fail($exception); - return; - } - - $this->complete(); - }); - } -} diff --git a/vendor/amphp/amp/lib/Promise.php b/vendor/amphp/amp/lib/Promise.php deleted file mode 100644 index 2f7e824e..00000000 --- a/vendor/amphp/amp/lib/Promise.php +++ /dev/null @@ -1,37 +0,0 @@ -, mixed, - * mixed>|null) | callable(\Throwable|null, mixed): void $onResolved - * - * @return void - */ - public function onResolve(callable $onResolved); -} diff --git a/vendor/amphp/amp/lib/Struct.php b/vendor/amphp/amp/lib/Struct.php deleted file mode 100644 index 0cb2563c..00000000 --- a/vendor/amphp/amp/lib/Struct.php +++ /dev/null @@ -1,78 +0,0 @@ -generateStructPropertyError($property) - ); - } - - /** - * @param string $property - * @param mixed $value - * - * @psalm-return no-return - */ - public function __set(string $property, $value) - { - throw new \Error( - $this->generateStructPropertyError($property) - ); - } - - private function generateStructPropertyError(string $property): string - { - $suggestion = $this->suggestPropertyName($property); - $suggestStr = ($suggestion == "") ? "" : " ... did you mean \"{$suggestion}?\""; - - return \sprintf( - "%s property \"%s\" does not exist%s", - \str_replace("\0", "@", \get_class($this)), // Handle anonymous class names. - $property, - $suggestStr - ); - } - - private function suggestPropertyName(string $badProperty): string - { - $badProperty = \strtolower($badProperty); - $bestMatch = ""; - $bestMatchPercentage = 0; - - /** @psalm-suppress RawObjectIteration */ - foreach ($this as $property => $value) { - // Never suggest properties that begin with an underscore - if ($property[0] === "_") { - continue; - } - \similar_text($badProperty, \strtolower($property), $byRefPercentage); - if ($byRefPercentage > $bestMatchPercentage) { - $bestMatchPercentage = $byRefPercentage; - $bestMatch = $property; - } - } - - return ($bestMatchPercentage >= $this->__propertySuggestThreshold) ? $bestMatch : ""; - } -} diff --git a/vendor/amphp/amp/lib/Success.php b/vendor/amphp/amp/lib/Success.php deleted file mode 100644 index 1817c5a2..00000000 --- a/vendor/amphp/amp/lib/Success.php +++ /dev/null @@ -1,60 +0,0 @@ - - */ -final class Success implements Promise -{ - /** @var mixed */ - private $value; - - /** - * @param mixed $value Anything other than a Promise object. - * - * @psalm-param TValue $value - * - * @throws \Error If a promise is given as the value. - */ - public function __construct($value = null) - { - if ($value instanceof Promise || $value instanceof ReactPromise) { - throw new \Error("Cannot use a promise as success value"); - } - - $this->value = $value; - } - - /** - * {@inheritdoc} - */ - public function onResolve(callable $onResolved) - { - try { - $result = $onResolved(null, $this->value); - - if ($result === null) { - return; - } - - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - - if ($result instanceof Promise || $result instanceof ReactPromise) { - Promise\rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use ($exception) { - throw $exception; - }); - } - } -} diff --git a/vendor/amphp/amp/lib/TimeoutCancellationToken.php b/vendor/amphp/amp/lib/TimeoutCancellationToken.php deleted file mode 100644 index 4c46ceb0..00000000 --- a/vendor/amphp/amp/lib/TimeoutCancellationToken.php +++ /dev/null @@ -1,75 +0,0 @@ -token = $source->getToken(); - - $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); - $this->watcher = Loop::delay($timeout, static function () use ($source, $message, $trace) { - $trace = formatStacktrace($trace); - $source->cancel(new TimeoutException("$message\r\nTimeoutCancellationToken was created here:\r\n$trace")); - }); - - Loop::unreference($this->watcher); - } - - /** - * Cancels the delay watcher. - */ - public function __destruct() - { - Loop::cancel($this->watcher); - } - - /** - * {@inheritdoc} - */ - public function subscribe(callable $callback): string - { - return $this->token->subscribe($callback); - } - - /** - * {@inheritdoc} - */ - public function unsubscribe(string $id) - { - $this->token->unsubscribe($id); - } - - /** - * {@inheritdoc} - */ - public function isRequested(): bool - { - return $this->token->isRequested(); - } - - /** - * {@inheritdoc} - */ - public function throwIfRequested() - { - $this->token->throwIfRequested(); - } -} diff --git a/vendor/amphp/amp/lib/TimeoutException.php b/vendor/amphp/amp/lib/TimeoutException.php deleted file mode 100644 index dc7fba9e..00000000 --- a/vendor/amphp/amp/lib/TimeoutException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * @template T as TReturn|Promise|\Generator - * - * @formatter:off - * - * @param callable(...mixed): T $callback - * - * @return callable - * @psalm-return (T is Promise ? (callable(mixed...): Promise) : (T is \Generator ? (TGenerator is Promise ? (callable(mixed...): Promise) : (callable(mixed...): Promise)) : (callable(mixed...): Promise))) - * - * @formatter:on - * - * @see asyncCoroutine() - * - * @psalm-suppress InvalidReturnType - */ - function coroutine(callable $callback): callable - { - /** @psalm-suppress InvalidReturnStatement */ - return static function (...$args) use ($callback): Promise { - return call($callback, ...$args); - }; - } - - /** - * Returns a new function that wraps $callback in a promise/coroutine-aware function that automatically runs - * Generators as coroutines. The returned function always returns void when invoked. Errors are forwarded to the - * loop's error handler using `Amp\Promise\rethrow()`. - * - * Use this function to create a coroutine-aware callable for a non-promise-aware callback caller. - * - * @param callable(...mixed): mixed $callback - * - * @return callable - * @psalm-return callable(mixed...): void - * - * @see coroutine() - */ - function asyncCoroutine(callable $callback): callable - { - return static function (...$args) use ($callback) { - Promise\rethrow(call($callback, ...$args)); - }; - } - - /** - * Calls the given function, always returning a promise. If the function returns a Generator, it will be run as a - * coroutine. If the function throws, a failed promise will be returned. - * - * @template TReturn - * @template TPromise - * @template TGeneratorReturn - * @template TGeneratorPromise - * - * @template TGenerator as TGeneratorReturn|Promise - * @template T as TReturn|Promise|\Generator - * - * @formatter:off - * - * @param callable(...mixed): T $callback - * @param mixed ...$args Arguments to pass to the function. - * - * @return Promise - * @psalm-return (T is Promise ? Promise : (T is \Generator ? (TGenerator is Promise ? Promise : Promise) : Promise)) - * - * @formatter:on - */ - function call(callable $callback, ...$args): Promise - { - try { - $result = $callback(...$args); - } catch (\Throwable $exception) { - return new Failure($exception); - } - - if ($result instanceof \Generator) { - return new Coroutine($result); - } - - if ($result instanceof Promise) { - return $result; - } - - if ($result instanceof ReactPromise) { - return Promise\adapt($result); - } - - return new Success($result); - } - - /** - * Calls the given function. If the function returns a Generator, it will be run as a coroutine. If the function - * throws or returns a failing promise, the failure is forwarded to the loop error handler. - * - * @param callable(...mixed): mixed $callback - * @param mixed ...$args Arguments to pass to the function. - * - * @return void - */ - function asyncCall(callable $callback, ...$args) - { - Promise\rethrow(call($callback, ...$args)); - } - - /** - * Sleeps for the specified number of milliseconds. - * - * @param int $milliseconds - * - * @return Delayed - */ - function delay(int $milliseconds): Delayed - { - return new Delayed($milliseconds); - } - - /** - * Returns the current time relative to an arbitrary point in time. - * - * @return int Time in milliseconds. - */ - function getCurrentTime(): int - { - return Internal\getCurrentTime(); - } -} - -namespace Amp\Promise -{ - - use Amp\Deferred; - use Amp\Loop; - use Amp\MultiReasonException; - use Amp\Promise; - use Amp\Success; - use Amp\TimeoutException; - use React\Promise\PromiseInterface as ReactPromise; - use function Amp\call; - use function Amp\Internal\createTypeError; - - /** - * Registers a callback that will forward the failure reason to the event loop's error handler if the promise fails. - * - * Use this function if you neither return the promise nor handle a possible error yourself to prevent errors from - * going entirely unnoticed. - * - * @param Promise|ReactPromise $promise Promise to register the handler on. - * - * @return void - * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. - * - */ - function rethrow($promise) - { - if (!$promise instanceof Promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } else { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - } - - $promise->onResolve(static function ($exception) { - if ($exception) { - throw $exception; - } - }); - } - - /** - * Runs the event loop until the promise is resolved. Should not be called within a running event loop. - * - * Use this function only in synchronous contexts to wait for an asynchronous operation. Use coroutines and yield to - * await promise resolution in a fully asynchronous application instead. - * - * @template TPromise - * @template T as Promise|ReactPromise - * - * @param Promise|ReactPromise $promise Promise to wait for. - * - * @return mixed Promise success value. - * - * @psalm-param T $promise - * @psalm-return (T is Promise ? TPromise : mixed) - * - * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. - * @throws \Error If the event loop stopped without the $promise being resolved. - * @throws \Throwable Promise failure reason. - */ - function wait($promise) - { - if (!$promise instanceof Promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } else { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - } - - $resolved = false; - - try { - Loop::run(function () use (&$resolved, &$value, &$exception, $promise) { - $promise->onResolve(function ($e, $v) use (&$resolved, &$value, &$exception) { - Loop::stop(); - $resolved = true; - $exception = $e; - $value = $v; - }); - }); - } catch (\Throwable $throwable) { - throw new \Error("Loop exceptionally stopped without resolving the promise", 0, $throwable); - } - - if (!$resolved) { - throw new \Error("Loop stopped without resolving the promise"); - } - - if ($exception) { - throw $exception; - } - - return $value; - } - - /** - * Creates an artificial timeout for any `Promise`. - * - * If the timeout expires before the promise is resolved, the returned promise fails with an instance of - * `Amp\TimeoutException`. - * - * @template TReturn - * - * @param Promise|ReactPromise $promise Promise to which the timeout is applied. - * @param int $timeout Timeout in milliseconds. - * - * @return Promise - * - * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. - */ - function timeout($promise, int $timeout): Promise - { - if (!$promise instanceof Promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } else { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - } - - $deferred = new Deferred; - - $watcher = Loop::delay($timeout, static function () use (&$deferred) { - $temp = $deferred; // prevent double resolve - $deferred = null; - $temp->fail(new TimeoutException); - }); - Loop::unreference($watcher); - - $promise->onResolve(function () use (&$deferred, $promise, $watcher) { - if ($deferred !== null) { - Loop::cancel($watcher); - $deferred->resolve($promise); - } - }); - - return $deferred->promise(); - } - - /** - * Creates an artificial timeout for any `Promise`. - * - * If the promise is resolved before the timeout expires, the result is returned - * - * If the timeout expires before the promise is resolved, a default value is returned - * - * @template TReturn - * - * @param Promise|ReactPromise $promise Promise to which the timeout is applied. - * @param int $timeout Timeout in milliseconds. - * @param TReturn $default - * - * @return Promise - * - * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. - */ - function timeoutWithDefault($promise, int $timeout, $default = null): Promise - { - $promise = timeout($promise, $timeout); - - return call(static function () use ($promise, $default) { - try { - return yield $promise; - } catch (TimeoutException $exception) { - return $default; - } - }); - } - - /** - * Adapts any object with a done(callable $onFulfilled, callable $onRejected) or then(callable $onFulfilled, - * callable $onRejected) method to a promise usable by components depending on placeholders implementing - * \AsyncInterop\Promise. - * - * @param object $promise Object with a done() or then() method. - * - * @return Promise Promise resolved by the $thenable object. - * - * @throws \Error If the provided object does not have a then() method. - */ - function adapt($promise): Promise - { - if (!\is_object($promise)) { - throw new \Error("Object must be provided"); - } - - $deferred = new Deferred; - - if (\method_exists($promise, 'done')) { - $promise->done([$deferred, 'resolve'], [$deferred, 'fail']); - } elseif (\method_exists($promise, 'then')) { - $promise->then([$deferred, 'resolve'], [$deferred, 'fail']); - } else { - throw new \Error("Object must have a 'then' or 'done' method"); - } - - return $deferred->promise(); - } - - /** - * Returns a promise that is resolved when all promises are resolved. The returned promise will not fail. - * Returned promise succeeds with a two-item array delineating successful and failed promise results, - * with keys identical and corresponding to the original given array. - * - * This function is the same as some() with the notable exception that it will never fail even - * if all promises in the array resolve unsuccessfully. - * - * @template TValue - * - * @param Promise[]|ReactPromise[] $promises - * - * @return Promise - * - * @throws \Error If a non-Promise is in the array. - */ - function any(array $promises): Promise - { - return some($promises, 0); - } - - /** - * Returns a promise that succeeds when all promises succeed, and fails if any promise fails. Returned - * promise succeeds with an array of values used to succeed each contained promise, with keys corresponding to - * the array of promises. - * - * @param Promise[]|ReactPromise[] $promises Array of only promises. - * - * @return Promise - * - * @throws \Error If a non-Promise is in the array. - * - * @template TValue - * - * @psalm-param array|ReactPromise> $promises - * @psalm-assert array|ReactPromise> $promises $promises - * @psalm-return Promise> - */ - function all(array $promises): Promise - { - if (empty($promises)) { - return new Success([]); - } - - $deferred = new Deferred; - $result = $deferred->promise(); - - $pending = \count($promises); - $values = []; - - foreach ($promises as $key => $promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } elseif (!$promise instanceof Promise) { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - - $values[$key] = null; // add entry to array to preserve order - $promise->onResolve(function ($exception, $value) use (&$deferred, &$values, &$pending, $key) { - if ($pending === 0) { - return; - } - - if ($exception) { - $pending = 0; - $deferred->fail($exception); - $deferred = null; - return; - } - - $values[$key] = $value; - if (0 === --$pending) { - $deferred->resolve($values); - } - }); - } - - return $result; - } - - /** - * Returns a promise that succeeds when the first promise succeeds, and fails only if all promises fail. - * - * @template TValue - * - * @param Promise[]|ReactPromise[] $promises Array of only promises. - * - * @return Promise - * - * @throws \Error If the array is empty or a non-Promise is in the array. - */ - function first(array $promises): Promise - { - if (empty($promises)) { - throw new \Error("No promises provided"); - } - - $deferred = new Deferred; - $result = $deferred->promise(); - - $pending = \count($promises); - $exceptions = []; - - foreach ($promises as $key => $promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } elseif (!$promise instanceof Promise) { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - - $exceptions[$key] = null; // add entry to array to preserve order - $promise->onResolve(function ($error, $value) use (&$deferred, &$exceptions, &$pending, $key) { - if ($pending === 0) { - return; - } - - if (!$error) { - $pending = 0; - $deferred->resolve($value); - $deferred = null; - return; - } - - $exceptions[$key] = $error; - if (0 === --$pending) { - $deferred->fail(new MultiReasonException($exceptions)); - } - }); - } - - return $result; - } - - /** - * Resolves with a two-item array delineating successful and failed Promise results. - * - * The returned promise will only fail if the given number of required promises fail. - * - * @template TValue - * - * @param Promise[]|ReactPromise[] $promises Array of only promises. - * @param int $required Number of promises that must succeed for the - * returned promise to succeed. - * - * @return Promise - * - * @throws \Error If a non-Promise is in the array. - */ - function some(array $promises, int $required = 1): Promise - { - if ($required < 0) { - throw new \Error("Number of promises required must be non-negative"); - } - - $pending = \count($promises); - - if ($required > $pending) { - throw new \Error("Too few promises provided"); - } - - if (empty($promises)) { - return new Success([[], []]); - } - - $deferred = new Deferred; - $result = $deferred->promise(); - $values = []; - $exceptions = []; - - foreach ($promises as $key => $promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } elseif (!$promise instanceof Promise) { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - - $values[$key] = $exceptions[$key] = null; // add entry to arrays to preserve order - $promise->onResolve(static function ($exception, $value) use ( - &$values, - &$exceptions, - &$pending, - $key, - $required, - $deferred - ) { - if ($exception) { - $exceptions[$key] = $exception; - unset($values[$key]); - } else { - $values[$key] = $value; - unset($exceptions[$key]); - } - - if (0 === --$pending) { - if (\count($values) < $required) { - $deferred->fail(new MultiReasonException($exceptions)); - } else { - $deferred->resolve([$exceptions, $values]); - } - } - }); - } - - return $result; - } - - /** - * Wraps a promise into another promise, altering the exception or result. - * - * @param Promise|ReactPromise $promise - * @param callable $callback - * - * @return Promise - */ - function wrap($promise, callable $callback): Promise - { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } elseif (!$promise instanceof Promise) { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - - $deferred = new Deferred(); - - $promise->onResolve(static function (\Throwable $exception = null, $result) use ($deferred, $callback) { - try { - $result = $callback($exception, $result); - } catch (\Throwable $exception) { - $deferred->fail($exception); - - return; - } - - $deferred->resolve($result); - }); - - return $deferred->promise(); - } -} - -namespace Amp\Iterator -{ - - use Amp\Delayed; - use Amp\Emitter; - use Amp\Iterator; - use Amp\Producer; - use Amp\Promise; - use function Amp\call; - use function Amp\coroutine; - use function Amp\Internal\createTypeError; - - /** - * Creates an iterator from the given iterable, emitting the each value. The iterable may contain promises. If any - * promise fails, the iterator will fail with the same reason. - * - * @param array|\Traversable $iterable Elements to emit. - * @param int $delay Delay between element emissions in milliseconds. - * - * @return Iterator - * - * @throws \TypeError If the argument is not an array or instance of \Traversable. - */ - function fromIterable(/* iterable */ - $iterable, - int $delay = 0 - ): Iterator { - if (!$iterable instanceof \Traversable && !\is_array($iterable)) { - throw createTypeError(["array", "Traversable"], $iterable); - } - - if ($delay) { - return new Producer(static function (callable $emit) use ($iterable, $delay) { - foreach ($iterable as $value) { - yield new Delayed($delay); - yield $emit($value); - } - }); - } - - return new Producer(static function (callable $emit) use ($iterable) { - foreach ($iterable as $value) { - yield $emit($value); - } - }); - } - - /** - * @template TValue - * @template TReturn - * - * @param Iterator $iterator - * @param callable (TValue $value): TReturn $onEmit - * - * @return Iterator - */ - function map(Iterator $iterator, callable $onEmit): Iterator - { - return new Producer(static function (callable $emit) use ($iterator, $onEmit) { - while (yield $iterator->advance()) { - yield $emit($onEmit($iterator->getCurrent())); - } - }); - } - - /** - * @template TValue - * - * @param Iterator $iterator - * @param callable(TValue $value):bool $filter - * - * @return Iterator - */ - function filter(Iterator $iterator, callable $filter): Iterator - { - return new Producer(static function (callable $emit) use ($iterator, $filter) { - while (yield $iterator->advance()) { - if ($filter($iterator->getCurrent())) { - yield $emit($iterator->getCurrent()); - } - } - }); - } - - /** - * Creates an iterator that emits values emitted from any iterator in the array of iterators. - * - * @param Iterator[] $iterators - * - * @return Iterator - */ - function merge(array $iterators): Iterator - { - $emitter = new Emitter; - $result = $emitter->iterate(); - - $coroutine = coroutine(static function (Iterator $iterator) use (&$emitter) { - while ((yield $iterator->advance()) && $emitter !== null) { - yield $emitter->emit($iterator->getCurrent()); - } - }); - - $coroutines = []; - foreach ($iterators as $iterator) { - if (!$iterator instanceof Iterator) { - throw createTypeError([Iterator::class], $iterator); - } - - $coroutines[] = $coroutine($iterator); - } - - Promise\all($coroutines)->onResolve(static function ($exception) use (&$emitter) { - if ($exception) { - $emitter->fail($exception); - $emitter = null; - } else { - $emitter->complete(); - } - }); - - return $result; - } - - /** - * Concatenates the given iterators into a single iterator, emitting values from a single iterator at a time. The - * prior iterator must complete before values are emitted from any subsequent iterators. Iterators are concatenated - * in the order given (iteration order of the array). - * - * @param Iterator[] $iterators - * - * @return Iterator - */ - function concat(array $iterators): Iterator - { - foreach ($iterators as $iterator) { - if (!$iterator instanceof Iterator) { - throw createTypeError([Iterator::class], $iterator); - } - } - - $emitter = new Emitter; - $previous = []; - $promise = Promise\all($previous); - - $coroutine = coroutine(static function (Iterator $iterator, callable $emit) { - while (yield $iterator->advance()) { - yield $emit($iterator->getCurrent()); - } - }); - - foreach ($iterators as $iterator) { - $emit = coroutine(static function ($value) use ($emitter, $promise) { - static $pending = true, $failed = false; - - if ($failed) { - return; - } - - if ($pending) { - try { - yield $promise; - $pending = false; - } catch (\Throwable $exception) { - $failed = true; - return; // Prior iterator failed. - } - } - - yield $emitter->emit($value); - }); - $previous[] = $coroutine($iterator, $emit); - $promise = Promise\all($previous); - } - - $promise->onResolve(static function ($exception) use ($emitter) { - if ($exception) { - $emitter->fail($exception); - return; - } - - $emitter->complete(); - }); - - return $emitter->iterate(); - } - - /** - * Discards all remaining items and returns the number of discarded items. - * - * @template TValue - * - * @param Iterator $iterator - * - * @return Promise - * - * @psalm-param Iterator $iterator - * @psalm-return Promise - */ - function discard(Iterator $iterator): Promise - { - return call(static function () use ($iterator): \Generator { - $count = 0; - - while (yield $iterator->advance()) { - $count++; - } - - return $count; - }); - } - - /** - * Collects all items from an iterator into an array. - * - * @template TValue - * - * @param Iterator $iterator - * - * @psalm-param Iterator $iterator - * - * @return Promise - * @psalm-return Promise> - */ - function toArray(Iterator $iterator): Promise - { - return call(static function () use ($iterator) { - /** @psalm-var list $array */ - $array = []; - - while (yield $iterator->advance()) { - $array[] = $iterator->getCurrent(); - } - - return $array; - }); - } -} diff --git a/vendor/amphp/byte-stream/.github/workflows/ci.yml b/vendor/amphp/byte-stream/.github/workflows/ci.yml deleted file mode 100644 index b725757f..00000000 --- a/vendor/amphp/byte-stream/.github/workflows/ci.yml +++ /dev/null @@ -1,135 +0,0 @@ -name: Continuous Integration - -on: - push: null - pull_request: - branches: - - master - -jobs: - unit_tests: - strategy: - matrix: - include: - - operating-system: 'ubuntu-latest' - php-version: '7.1' - - - operating-system: 'ubuntu-latest' - php-version: '7.2' - - - operating-system: 'ubuntu-latest' - php-version: '7.3' - - - operating-system: 'ubuntu-latest' - php-version: '7.4' - - - operating-system: 'ubuntu-latest' - php-version: '8.0' - composer-flags: '--ignore-platform-req=php' - - - operating-system: 'windows-latest' - php-version: '8.0' - composer-flags: '--ignore-platform-req=php' - - - operating-system: 'macos-latest' - php-version: '8.0' - composer-flags: '--ignore-platform-req=php' - - name: PHP ${{ matrix.php-version }} on ${{ matrix.operating-system }} - - runs-on: ${{ matrix.operating-system }} - - steps: - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-version }} - - - name: Use LF line ends - run: | - git config --global core.autocrlf false - git config --global core.eol lf - - - name: Checkout code - uses: actions/checkout@v2 - - - name: Get Composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-dir)" - - - name: Cache dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: composer-${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.*') }}-${{ matrix.composer-flags }} - restore-keys: | - composer-${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.*') }}- - composer-${{ runner.os }}-${{ matrix.php-version }}- - - - name: Install dependencies - uses: nick-invision/retry@v2 - with: - timeout_minutes: 5 - max_attempts: 5 - retry_wait_seconds: 30 - command: | - php_version=$(php -v) - composer update --optimize-autoloader --no-interaction --no-progress ${{ matrix.composer-flags }} - composer info -D - - - name: Run unit tests - run: vendor/bin/phpunit --verbose - - coding_standards: - strategy: - matrix: - include: - - operating-system: 'ubuntu-latest' - php-version: '8.0' - composer-flags: '--ignore-platform-req=php' - - name: Coding standards - runs-on: ${{ matrix.operating-system }} - - steps: - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-version }} - - - name: Use LF line ends - run: | - git config --global core.autocrlf false - git config --global core.eol lf - - - name: Checkout code - uses: actions/checkout@v2 - - - name: Get Composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-dir)" - - - name: Cache dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: composer-${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.*') }}-${{ matrix.composer-flags }} - restore-keys: | - composer-${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.*') }}- - composer-${{ runner.os }}-${{ matrix.php-version }}- - - - name: Install dependencies - uses: nick-invision/retry@v2 - with: - timeout_minutes: 5 - max_attempts: 5 - retry_wait_seconds: 30 - command: | - php_version=$(php -v) - composer update --optimize-autoloader --no-interaction --no-progress ${{ matrix.composer-flags }} - composer info -D - - - name: Run style fixer - env: - PHP_CS_FIXER_IGNORE_ENV: 1 - run: vendor/bin/php-cs-fixer --diff --dry-run -v fix diff --git a/vendor/amphp/byte-stream/LICENSE b/vendor/amphp/byte-stream/LICENSE deleted file mode 100644 index 7977d674..00000000 --- a/vendor/amphp/byte-stream/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2016-2021 amphp - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/amphp/byte-stream/composer.json b/vendor/amphp/byte-stream/composer.json deleted file mode 100644 index 0315674b..00000000 --- a/vendor/amphp/byte-stream/composer.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "amphp/byte-stream", - "homepage": "http://amphp.org/byte-stream", - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "support": { - "issues": "https://github.com/amphp/byte-stream/issues", - "irc": "irc://irc.freenode.org/amphp" - }, - "keywords": [ - "stream", - "async", - "non-blocking", - "amp", - "amphp", - "io" - ], - "license": "MIT", - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "require": { - "php": ">=7.1", - "amphp/amp": "^2" - }, - "require-dev": { - "amphp/phpunit-util": "^1.4", - "phpunit/phpunit": "^6 || ^7 || ^8", - "friendsofphp/php-cs-fixer": "^2.3", - "amphp/php-cs-fixer-config": "dev-master", - "psalm/phar": "^3.11.4", - "jetbrains/phpstorm-stubs": "^2019.3" - }, - "autoload": { - "psr-4": { - "Amp\\ByteStream\\": "lib" - }, - "files": [ - "lib/functions.php" - ] - }, - "autoload-dev": { - "psr-4": { - "Amp\\ByteStream\\Test\\": "test" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - } -} diff --git a/vendor/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php b/vendor/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php deleted file mode 100644 index 294287d2..00000000 --- a/vendor/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php +++ /dev/null @@ -1,65 +0,0 @@ -source = $source; - } - - public function read(): Promise - { - return call(function () { - if ($this->source === null) { - throw new StreamException('Failed to read stream chunk due to invalid base64 data'); - } - - $chunk = yield $this->source->read(); - if ($chunk === null) { - if ($this->buffer === null) { - return null; - } - - $chunk = \base64_decode($this->buffer, true); - if ($chunk === false) { - $this->source = null; - $this->buffer = null; - - throw new StreamException('Failed to read stream chunk due to invalid base64 data'); - } - - $this->buffer = null; - - return $chunk; - } - - $this->buffer .= $chunk; - - $length = \strlen($this->buffer); - $chunk = \base64_decode(\substr($this->buffer, 0, $length - $length % 4), true); - if ($chunk === false) { - $this->source = null; - $this->buffer = null; - - throw new StreamException('Failed to read stream chunk due to invalid base64 data'); - } - - $this->buffer = \substr($this->buffer, $length - $length % 4); - - return $chunk; - }); - } -} diff --git a/vendor/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php b/vendor/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php deleted file mode 100644 index 664d99d7..00000000 --- a/vendor/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php +++ /dev/null @@ -1,55 +0,0 @@ -destination = $destination; - } - - public function write(string $data): Promise - { - $this->buffer .= $data; - - $length = \strlen($this->buffer); - $chunk = \base64_decode(\substr($this->buffer, 0, $length - $length % 4), true); - if ($chunk === false) { - return new Failure(new StreamException('Invalid base64 near offset ' . $this->offset)); - } - - $this->offset += $length - $length % 4; - $this->buffer = \substr($this->buffer, $length - $length % 4); - - return $this->destination->write($chunk); - } - - public function end(string $finalData = ""): Promise - { - $this->offset += \strlen($this->buffer); - - $chunk = \base64_decode($this->buffer . $finalData, true); - if ($chunk === false) { - return new Failure(new StreamException('Invalid base64 near offset ' . $this->offset)); - } - - $this->buffer = ''; - - return $this->destination->end($chunk); - } -} diff --git a/vendor/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php b/vendor/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php deleted file mode 100644 index 523af9d2..00000000 --- a/vendor/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php +++ /dev/null @@ -1,46 +0,0 @@ -source = $source; - } - - public function read(): Promise - { - return call(function () { - $chunk = yield $this->source->read(); - if ($chunk === null) { - if ($this->buffer === null) { - return null; - } - - $chunk = \base64_encode($this->buffer); - $this->buffer = null; - - return $chunk; - } - - $this->buffer .= $chunk; - - $length = \strlen($this->buffer); - $chunk = \base64_encode(\substr($this->buffer, 0, $length - $length % 3)); - $this->buffer = \substr($this->buffer, $length - $length % 3); - - return $chunk; - }); - } -} diff --git a/vendor/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php b/vendor/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php deleted file mode 100644 index e23d6f53..00000000 --- a/vendor/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php +++ /dev/null @@ -1,39 +0,0 @@ -destination = $destination; - } - - public function write(string $data): Promise - { - $this->buffer .= $data; - - $length = \strlen($this->buffer); - $chunk = \base64_encode(\substr($this->buffer, 0, $length - $length % 3)); - $this->buffer = \substr($this->buffer, $length - $length % 3); - - return $this->destination->write($chunk); - } - - public function end(string $finalData = ""): Promise - { - $chunk = \base64_encode($this->buffer . $finalData); - $this->buffer = ''; - - return $this->destination->end($chunk); - } -} diff --git a/vendor/amphp/byte-stream/lib/ClosedException.php b/vendor/amphp/byte-stream/lib/ClosedException.php deleted file mode 100644 index 17957a86..00000000 --- a/vendor/amphp/byte-stream/lib/ClosedException.php +++ /dev/null @@ -1,7 +0,0 @@ -contents = $contents; - } - - /** - * Reads data from the stream. - * - * @return Promise Resolves with the full contents or `null` if the stream has closed / already been consumed. - */ - public function read(): Promise - { - if ($this->contents === null) { - return new Success; - } - - $promise = new Success($this->contents); - $this->contents = null; - - return $promise; - } -} diff --git a/vendor/amphp/byte-stream/lib/InputStream.php b/vendor/amphp/byte-stream/lib/InputStream.php deleted file mode 100644 index 4c0b9e8f..00000000 --- a/vendor/amphp/byte-stream/lib/InputStream.php +++ /dev/null @@ -1,38 +0,0 @@ -read()) !== null) { - * $buffer .= $chunk; - * } - * - * return $buffer; - * }); - * } - * ``` - */ -interface InputStream -{ - /** - * Reads data from the stream. - * - * @return Promise Resolves with a string when new data is available or `null` if the stream has closed. - * - * @psalm-return Promise - * - * @throws PendingReadError Thrown if another read operation is still pending. - */ - public function read(): Promise; -} diff --git a/vendor/amphp/byte-stream/lib/InputStreamChain.php b/vendor/amphp/byte-stream/lib/InputStreamChain.php deleted file mode 100644 index d952a852..00000000 --- a/vendor/amphp/byte-stream/lib/InputStreamChain.php +++ /dev/null @@ -1,52 +0,0 @@ -streams = $streams; - } - - /** @inheritDoc */ - public function read(): Promise - { - if ($this->reading) { - throw new PendingReadError; - } - - if (!$this->streams) { - return new Success(null); - } - - return call(function () { - $this->reading = true; - - try { - while ($this->streams) { - $chunk = yield $this->streams[0]->read(); - if ($chunk === null) { - \array_shift($this->streams); - continue; - } - - return $chunk; - } - - return null; - } finally { - $this->reading = false; - } - }); - } -} diff --git a/vendor/amphp/byte-stream/lib/IteratorStream.php b/vendor/amphp/byte-stream/lib/IteratorStream.php deleted file mode 100644 index 6fbe3912..00000000 --- a/vendor/amphp/byte-stream/lib/IteratorStream.php +++ /dev/null @@ -1,70 +0,0 @@ - */ - private $iterator; - /** @var \Throwable|null */ - private $exception; - /** @var bool */ - private $pending = false; - - /** - * @psam-param Iterator $iterator - */ - public function __construct(Iterator $iterator) - { - $this->iterator = $iterator; - } - - /** @inheritdoc */ - public function read(): Promise - { - if ($this->exception) { - return new Failure($this->exception); - } - - if ($this->pending) { - throw new PendingReadError; - } - - $this->pending = true; - /** @var Deferred $deferred */ - $deferred = new Deferred; - - $this->iterator->advance()->onResolve(function ($error, $hasNextElement) use ($deferred) { - $this->pending = false; - - if ($error) { - $this->exception = $error; - $deferred->fail($error); - } elseif ($hasNextElement) { - $chunk = $this->iterator->getCurrent(); - - if (!\is_string($chunk)) { - $this->exception = new StreamException(\sprintf( - "Unexpected iterator value of type '%s', expected string", - \is_object($chunk) ? \get_class($chunk) : \gettype($chunk) - )); - - $deferred->fail($this->exception); - - return; - } - - $deferred->resolve($chunk); - } else { - $deferred->resolve(); - } - }); - - return $deferred->promise(); - } -} diff --git a/vendor/amphp/byte-stream/lib/LineReader.php b/vendor/amphp/byte-stream/lib/LineReader.php deleted file mode 100644 index ed6b0a2a..00000000 --- a/vendor/amphp/byte-stream/lib/LineReader.php +++ /dev/null @@ -1,71 +0,0 @@ -source = $inputStream; - $this->delimiter = $delimiter === null ? "\n" : $delimiter; - $this->lineMode = $delimiter === null; - } - - /** - * @return Promise - */ - public function readLine(): Promise - { - return call(function () { - if (false !== \strpos($this->buffer, $this->delimiter)) { - list($line, $this->buffer) = \explode($this->delimiter, $this->buffer, 2); - return $this->lineMode ? \rtrim($line, "\r") : $line; - } - - while (null !== $chunk = yield $this->source->read()) { - $this->buffer .= $chunk; - - if (false !== \strpos($this->buffer, $this->delimiter)) { - list($line, $this->buffer) = \explode($this->delimiter, $this->buffer, 2); - return $this->lineMode ? \rtrim($line, "\r") : $line; - } - } - - if ($this->buffer === "") { - return null; - } - - $line = $this->buffer; - $this->buffer = ""; - return $this->lineMode ? \rtrim($line, "\r") : $line; - }); - } - - public function getBuffer(): string - { - return $this->buffer; - } - - /** - * @return void - */ - public function clearBuffer() - { - $this->buffer = ""; - } -} diff --git a/vendor/amphp/byte-stream/lib/Message.php b/vendor/amphp/byte-stream/lib/Message.php deleted file mode 100644 index 33046233..00000000 --- a/vendor/amphp/byte-stream/lib/Message.php +++ /dev/null @@ -1,176 +0,0 @@ -read()) !== null) { - * // Immediately use $chunk, reducing memory consumption since the entire message is never buffered. - * } - * - * @deprecated Use Amp\ByteStream\Payload instead. - */ -class Message implements InputStream, Promise -{ - /** @var InputStream */ - private $source; - - /** @var string */ - private $buffer = ""; - - /** @var Deferred|null */ - private $pendingRead; - - /** @var Coroutine|null */ - private $coroutine; - - /** @var bool True if onResolve() has been called. */ - private $buffering = false; - - /** @var Deferred|null */ - private $backpressure; - - /** @var bool True if the iterator has completed. */ - private $complete = false; - - /** @var \Throwable|null Used to fail future reads on failure. */ - private $error; - - /** - * @param InputStream $source An iterator that only emits strings. - */ - public function __construct(InputStream $source) - { - $this->source = $source; - } - - private function consume(): \Generator - { - while (($chunk = yield $this->source->read()) !== null) { - $buffer = $this->buffer .= $chunk; - - if ($buffer === "") { - continue; // Do not succeed reads with empty string. - } elseif ($this->pendingRead) { - $deferred = $this->pendingRead; - $this->pendingRead = null; - $this->buffer = ""; - $deferred->resolve($buffer); - $buffer = ""; // Destroy last emitted chunk to free memory. - } elseif (!$this->buffering) { - $buffer = ""; // Destroy last emitted chunk to free memory. - $this->backpressure = new Deferred; - yield $this->backpressure->promise(); - } - } - - $this->complete = true; - - if ($this->pendingRead) { - $deferred = $this->pendingRead; - $this->pendingRead = null; - $deferred->resolve($this->buffer !== "" ? $this->buffer : null); - $this->buffer = ""; - } - - return $this->buffer; - } - - /** @inheritdoc */ - final public function read(): Promise - { - if ($this->pendingRead) { - throw new PendingReadError; - } - - if ($this->coroutine === null) { - $this->coroutine = new Coroutine($this->consume()); - $this->coroutine->onResolve(function ($error) { - if ($error) { - $this->error = $error; - } - - if ($this->pendingRead) { - $deferred = $this->pendingRead; - $this->pendingRead = null; - $deferred->fail($error); - } - }); - } - - if ($this->error) { - return new Failure($this->error); - } - - if ($this->buffer !== "") { - $buffer = $this->buffer; - $this->buffer = ""; - - if ($this->backpressure) { - $backpressure = $this->backpressure; - $this->backpressure = null; - $backpressure->resolve(); - } - - return new Success($buffer); - } - - if ($this->complete) { - return new Success; - } - - $this->pendingRead = new Deferred; - return $this->pendingRead->promise(); - } - - /** @inheritdoc */ - final public function onResolve(callable $onResolved) - { - $this->buffering = true; - - if ($this->coroutine === null) { - $this->coroutine = new Coroutine($this->consume()); - } - - if ($this->backpressure) { - $backpressure = $this->backpressure; - $this->backpressure = null; - $backpressure->resolve(); - } - - $this->coroutine->onResolve($onResolved); - } - - /** - * Exposes the source input stream. - * - * This might be required to resolve a promise with an InputStream, because promises in Amp can't be resolved with - * other promises. - * - * @return InputStream - */ - final public function getInputStream(): InputStream - { - return $this->source; - } -} diff --git a/vendor/amphp/byte-stream/lib/OutputBuffer.php b/vendor/amphp/byte-stream/lib/OutputBuffer.php deleted file mode 100644 index 832dc71b..00000000 --- a/vendor/amphp/byte-stream/lib/OutputBuffer.php +++ /dev/null @@ -1,55 +0,0 @@ -deferred = new Deferred; - } - - public function write(string $data): Promise - { - if ($this->closed) { - throw new ClosedException("The stream has already been closed."); - } - - $this->contents .= $data; - - return new Success(\strlen($data)); - } - - public function end(string $finalData = ""): Promise - { - if ($this->closed) { - throw new ClosedException("The stream has already been closed."); - } - - $this->contents .= $finalData; - $this->closed = true; - - $this->deferred->resolve($this->contents); - $this->contents = ""; - - return new Success(\strlen($finalData)); - } - - public function onResolve(callable $onResolved) - { - $this->deferred->promise()->onResolve($onResolved); - } -} diff --git a/vendor/amphp/byte-stream/lib/OutputStream.php b/vendor/amphp/byte-stream/lib/OutputStream.php deleted file mode 100644 index 68f51fc1..00000000 --- a/vendor/amphp/byte-stream/lib/OutputStream.php +++ /dev/null @@ -1,37 +0,0 @@ -stream = $stream; - } - - public function __destruct() - { - if (!$this->promise) { - Promise\rethrow(new Coroutine($this->consume())); - } - } - - private function consume(): \Generator - { - try { - if ($this->lastRead && null === yield $this->lastRead) { - return; - } - - while (null !== yield $this->stream->read()) { - // Discard unread bytes from message. - } - } catch (\Throwable $exception) { - // If exception is thrown here the connection closed anyway. - } - } - - /** - * @inheritdoc - * - * @throws \Error If a buffered message was requested by calling buffer(). - */ - final public function read(): Promise - { - if ($this->promise) { - throw new \Error("Cannot stream message data once a buffered message has been requested"); - } - - return $this->lastRead = $this->stream->read(); - } - - /** - * Buffers the entire message and resolves the returned promise then. - * - * @return Promise Resolves with the entire message contents. - */ - final public function buffer(): Promise - { - if ($this->promise) { - return $this->promise; - } - - return $this->promise = call(function () { - $buffer = ''; - if ($this->lastRead && null === yield $this->lastRead) { - return $buffer; - } - - while (null !== $chunk = yield $this->stream->read()) { - $buffer .= $chunk; - } - return $buffer; - }); - } -} diff --git a/vendor/amphp/byte-stream/lib/PendingReadError.php b/vendor/amphp/byte-stream/lib/PendingReadError.php deleted file mode 100644 index 66dc1fbd..00000000 --- a/vendor/amphp/byte-stream/lib/PendingReadError.php +++ /dev/null @@ -1,17 +0,0 @@ -useSingleRead = $useSingleRead; - - if (\strpos($meta["mode"], "r") === false && \strpos($meta["mode"], "+") === false) { - throw new \Error("Expected a readable stream"); - } - - \stream_set_blocking($stream, false); - \stream_set_read_buffer($stream, 0); - - $this->resource = &$stream; - $this->chunkSize = &$chunkSize; - - $deferred = &$this->deferred; - $readable = &$this->readable; - - $this->watcher = Loop::onReadable($this->resource, static function ($watcher) use ( - &$deferred, - &$readable, - &$stream, - &$chunkSize, - $useSingleRead - ) { - if ($useSingleRead) { - $data = @\fread($stream, $chunkSize); - } else { - $data = @\stream_get_contents($stream, $chunkSize); - } - - \assert($data !== false, "Trying to read from a previously fclose()'d resource. Do NOT manually fclose() resources the loop still has a reference to."); - - // Error suppression, because pthreads does crazy things with resources, - // which might be closed during two operations. - // See https://github.com/amphp/byte-stream/issues/32 - if ($data === '' && @\feof($stream)) { - $readable = false; - $stream = null; - $data = null; // Stream closed, resolve read with null. - Loop::cancel($watcher); - } else { - Loop::disable($watcher); - } - - $temp = $deferred; - $deferred = null; - - \assert($temp instanceof Deferred); - $temp->resolve($data); - }); - - $this->immediateCallable = static function ($watcherId, $data) use (&$deferred) { - $temp = $deferred; - $deferred = null; - - \assert($temp instanceof Deferred); - $temp->resolve($data); - }; - - Loop::disable($this->watcher); - } - - /** @inheritdoc */ - public function read(): Promise - { - if ($this->deferred !== null) { - throw new PendingReadError; - } - - if (!$this->readable) { - return new Success; // Resolve with null on closed stream. - } - - \assert($this->resource !== null); - - // Attempt a direct read, because Windows suffers from slow I/O on STDIN otherwise. - if ($this->useSingleRead) { - $data = @\fread($this->resource, $this->chunkSize); - } else { - $data = @\stream_get_contents($this->resource, $this->chunkSize); - } - - \assert($data !== false, "Trying to read from a previously fclose()'d resource. Do NOT manually fclose() resources the loop still has a reference to."); - - if ($data === '') { - // Error suppression, because pthreads does crazy things with resources, - // which might be closed during two operations. - // See https://github.com/amphp/byte-stream/issues/32 - if (@\feof($this->resource)) { - $this->readable = false; - $this->resource = null; - Loop::cancel($this->watcher); - - return new Success; // Stream closed, resolve read with null. - } - - $this->deferred = new Deferred; - Loop::enable($this->watcher); - - return $this->deferred->promise(); - } - - // Prevent an immediate read → write loop from blocking everything - // See e.g. examples/benchmark-throughput.php - $this->deferred = new Deferred; - $this->immediateWatcher = Loop::defer($this->immediateCallable, $data); - - return $this->deferred->promise(); - } - - /** - * Closes the stream forcefully. Multiple `close()` calls are ignored. - * - * @return void - */ - public function close() - { - if (\is_resource($this->resource)) { - // Error suppression, as resource might already be closed - $meta = @\stream_get_meta_data($this->resource); - - if ($meta && \strpos($meta["mode"], "+") !== false) { - @\stream_socket_shutdown($this->resource, \STREAM_SHUT_RD); - } else { - /** @psalm-suppress InvalidPropertyAssignmentValue */ - @\fclose($this->resource); - } - } - - $this->free(); - } - - /** - * Nulls reference to resource, marks stream unreadable, and succeeds any pending read with null. - * - * @return void - */ - private function free() - { - $this->readable = false; - $this->resource = null; - - if ($this->deferred !== null) { - $deferred = $this->deferred; - $this->deferred = null; - $deferred->resolve(); - } - - Loop::cancel($this->watcher); - - if ($this->immediateWatcher !== null) { - Loop::cancel($this->immediateWatcher); - } - } - - /** - * @return resource|null The stream resource or null if the stream has closed. - */ - public function getResource() - { - return $this->resource; - } - - /** - * @return void - */ - public function setChunkSize(int $chunkSize) - { - $this->chunkSize = $chunkSize; - } - - /** - * References the read watcher, so the loop keeps running in case there's an active read. - * - * @return void - * - * @see Loop::reference() - */ - public function reference() - { - if (!$this->resource) { - throw new \Error("Resource has already been freed"); - } - - Loop::reference($this->watcher); - } - - /** - * Unreferences the read watcher, so the loop doesn't keep running even if there are active reads. - * - * @return void - * - * @see Loop::unreference() - */ - public function unreference() - { - if (!$this->resource) { - throw new \Error("Resource has already been freed"); - } - - Loop::unreference($this->watcher); - } - - public function __destruct() - { - if ($this->resource !== null) { - $this->free(); - } - } -} diff --git a/vendor/amphp/byte-stream/lib/ResourceOutputStream.php b/vendor/amphp/byte-stream/lib/ResourceOutputStream.php deleted file mode 100644 index 035e480b..00000000 --- a/vendor/amphp/byte-stream/lib/ResourceOutputStream.php +++ /dev/null @@ -1,321 +0,0 @@ - */ - private $writes; - - /** @var bool */ - private $writable = true; - - /** @var int|null */ - private $chunkSize; - - /** - * @param resource $stream Stream resource. - * @param int|null $chunkSize Chunk size per `fwrite()` operation. - */ - public function __construct($stream, int $chunkSize = null) - { - if (!\is_resource($stream) || \get_resource_type($stream) !== 'stream') { - throw new \Error("Expected a valid stream"); - } - - $meta = \stream_get_meta_data($stream); - - if (\strpos($meta["mode"], "r") !== false && \strpos($meta["mode"], "+") === false) { - throw new \Error("Expected a writable stream"); - } - - \stream_set_blocking($stream, false); - \stream_set_write_buffer($stream, 0); - - $this->resource = $stream; - $this->chunkSize = &$chunkSize; - - $writes = $this->writes = new \SplQueue; - $writable = &$this->writable; - $resource = &$this->resource; - - $this->watcher = Loop::onWritable($stream, static function ($watcher, $stream) use ($writes, &$chunkSize, &$writable, &$resource) { - static $emptyWrites = 0; - - try { - while (!$writes->isEmpty()) { - /** @var Deferred $deferred */ - list($data, $previous, $deferred) = $writes->shift(); - $length = \strlen($data); - - if ($length === 0) { - $deferred->resolve(0); - continue; - } - - if (!\is_resource($stream) || (($metaData = @\stream_get_meta_data($stream)) && $metaData['eof'])) { - throw new ClosedException("The stream was closed by the peer"); - } - - // Error reporting suppressed since fwrite() emits E_WARNING if the pipe is broken or the buffer is full. - // Use conditional, because PHP doesn't like getting null passed - if ($chunkSize) { - $written = @\fwrite($stream, $data, $chunkSize); - } else { - $written = @\fwrite($stream, $data); - } - - \assert( - $written !== false || \PHP_VERSION_ID >= 70400, // PHP 7.4+ returns false on EPIPE. - "Trying to write on a previously fclose()'d resource. Do NOT manually fclose() resources the still referenced in the loop." - ); - - // PHP 7.4.0 and 7.4.1 may return false on EAGAIN. - if ($written === false && \PHP_VERSION_ID >= 70402) { - $message = "Failed to write to stream"; - if ($error = \error_get_last()) { - $message .= \sprintf("; %s", $error["message"]); - } - throw new StreamException($message); - } - - // Broken pipes between processes on macOS/FreeBSD do not detect EOF properly. - if ($written === 0 || $written === false) { - if ($emptyWrites++ > self::MAX_CONSECUTIVE_EMPTY_WRITES) { - $message = "Failed to write to stream after multiple attempts"; - if ($error = \error_get_last()) { - $message .= \sprintf("; %s", $error["message"]); - } - throw new StreamException($message); - } - - $writes->unshift([$data, $previous, $deferred]); - return; - } - - $emptyWrites = 0; - - if ($length > $written) { - $data = \substr($data, $written); - $writes->unshift([$data, $written + $previous, $deferred]); - return; - } - - $deferred->resolve($written + $previous); - } - } catch (\Throwable $exception) { - $resource = null; - $writable = false; - - /** @psalm-suppress PossiblyUndefinedVariable */ - $deferred->fail($exception); - while (!$writes->isEmpty()) { - list(, , $deferred) = $writes->shift(); - $deferred->fail($exception); - } - - Loop::cancel($watcher); - } finally { - if ($writes->isEmpty()) { - Loop::disable($watcher); - } - } - }); - - Loop::disable($this->watcher); - } - - /** - * Writes data to the stream. - * - * @param string $data Bytes to write. - * - * @return Promise Succeeds once the data has been successfully written to the stream. - * - * @throws ClosedException If the stream has already been closed. - */ - public function write(string $data): Promise - { - return $this->send($data, false); - } - - /** - * Closes the stream after all pending writes have been completed. Optionally writes a final data chunk before. - * - * @param string $finalData Bytes to write. - * - * @return Promise Succeeds once the data has been successfully written to the stream. - * - * @throws ClosedException If the stream has already been closed. - */ - public function end(string $finalData = ""): Promise - { - return $this->send($finalData, true); - } - - private function send(string $data, bool $end = false): Promise - { - if (!$this->writable) { - return new Failure(new ClosedException("The stream is not writable")); - } - - $length = \strlen($data); - $written = 0; - - if ($end) { - $this->writable = false; - } - - if ($this->writes->isEmpty()) { - if ($length === 0) { - if ($end) { - $this->close(); - } - return new Success(0); - } - - if (!\is_resource($this->resource) || (($metaData = @\stream_get_meta_data($this->resource)) && $metaData['eof'])) { - return new Failure(new ClosedException("The stream was closed by the peer")); - } - - // Error reporting suppressed since fwrite() emits E_WARNING if the pipe is broken or the buffer is full. - // Use conditional, because PHP doesn't like getting null passed. - if ($this->chunkSize) { - $written = @\fwrite($this->resource, $data, $this->chunkSize); - } else { - $written = @\fwrite($this->resource, $data); - } - - \assert( - $written !== false || \PHP_VERSION_ID >= 70400, // PHP 7.4+ returns false on EPIPE. - "Trying to write on a previously fclose()'d resource. Do NOT manually fclose() resources the still referenced in the loop." - ); - - // PHP 7.4.0 and 7.4.1 may return false on EAGAIN. - if ($written === false && \PHP_VERSION_ID >= 70402) { - $message = "Failed to write to stream"; - if ($error = \error_get_last()) { - $message .= \sprintf("; %s", $error["message"]); - } - return new Failure(new StreamException($message)); - } - - $written = (int) $written; // Cast potential false to 0. - - if ($length === $written) { - if ($end) { - $this->close(); - } - return new Success($written); - } - - $data = \substr($data, $written); - } - - $deferred = new Deferred; - - if ($length - $written > self::LARGE_CHUNK_SIZE) { - $chunks = \str_split($data, self::LARGE_CHUNK_SIZE); - $data = \array_pop($chunks); - foreach ($chunks as $chunk) { - $this->writes->push([$chunk, $written, new Deferred]); - $written += self::LARGE_CHUNK_SIZE; - } - } - - $this->writes->push([$data, $written, $deferred]); - Loop::enable($this->watcher); - $promise = $deferred->promise(); - - if ($end) { - $promise->onResolve([$this, "close"]); - } - - return $promise; - } - - /** - * Closes the stream forcefully. Multiple `close()` calls are ignored. - * - * @return void - */ - public function close() - { - if (\is_resource($this->resource)) { - // Error suppression, as resource might already be closed - $meta = @\stream_get_meta_data($this->resource); - - if ($meta && \strpos($meta["mode"], "+") !== false) { - @\stream_socket_shutdown($this->resource, \STREAM_SHUT_WR); - } else { - /** @psalm-suppress InvalidPropertyAssignmentValue psalm reports this as closed-resource */ - @\fclose($this->resource); - } - } - - $this->free(); - } - - /** - * Nulls reference to resource, marks stream unwritable, and fails any pending write. - * - * @return void - */ - private function free() - { - $this->resource = null; - $this->writable = false; - - if (!$this->writes->isEmpty()) { - $exception = new ClosedException("The socket was closed before writing completed"); - do { - /** @var Deferred $deferred */ - list(, , $deferred) = $this->writes->shift(); - $deferred->fail($exception); - } while (!$this->writes->isEmpty()); - } - - Loop::cancel($this->watcher); - } - - /** - * @return resource|null Stream resource or null if end() has been called or the stream closed. - */ - public function getResource() - { - return $this->resource; - } - - /** - * @return void - */ - public function setChunkSize(int $chunkSize) - { - $this->chunkSize = $chunkSize; - } - - public function __destruct() - { - if ($this->resource !== null) { - $this->free(); - } - } -} diff --git a/vendor/amphp/byte-stream/lib/StreamException.php b/vendor/amphp/byte-stream/lib/StreamException.php deleted file mode 100644 index b86ec7e0..00000000 --- a/vendor/amphp/byte-stream/lib/StreamException.php +++ /dev/null @@ -1,7 +0,0 @@ -source = $source; - $this->encoding = $encoding; - $this->options = $options; - $this->resource = @\inflate_init($encoding, $options); - - if ($this->resource === false) { - throw new StreamException("Failed initializing deflate context"); - } - } - - /** @inheritdoc */ - public function read(): Promise - { - return call(function () { - if ($this->resource === null) { - return null; - } - - \assert($this->source !== null); - - $data = yield $this->source->read(); - - // Needs a double guard, as stream might have been closed while reading - /** @psalm-suppress ParadoxicalCondition */ - if ($this->resource === null) { - return null; - } - - if ($data === null) { - $decompressed = @\inflate_add($this->resource, "", \ZLIB_FINISH); - - if ($decompressed === false) { - throw new StreamException("Failed adding data to deflate context"); - } - - $this->close(); - - return $decompressed; - } - - $decompressed = @\inflate_add($this->resource, $data, \ZLIB_SYNC_FLUSH); - - if ($decompressed === false) { - throw new StreamException("Failed adding data to deflate context"); - } - - return $decompressed; - }); - } - - /** - * @internal - * @return void - */ - private function close() - { - $this->resource = null; - $this->source = null; - } - - /** - * Gets the used compression encoding. - * - * @return int Encoding specified on construction time. - */ - public function getEncoding(): int - { - return $this->encoding; - } - /** - * Gets the used compression options. - * - * @return array Options array passed on construction time. - */ - public function getOptions(): array - { - return $this->options; - } -} diff --git a/vendor/amphp/byte-stream/lib/ZlibOutputStream.php b/vendor/amphp/byte-stream/lib/ZlibOutputStream.php deleted file mode 100644 index 542df1ce..00000000 --- a/vendor/amphp/byte-stream/lib/ZlibOutputStream.php +++ /dev/null @@ -1,119 +0,0 @@ -destination = $destination; - $this->encoding = $encoding; - $this->options = $options; - $this->resource = @\deflate_init($encoding, $options); - - if ($this->resource === false) { - throw new StreamException("Failed initializing deflate context"); - } - } - - /** @inheritdoc */ - public function write(string $data): Promise - { - if ($this->resource === null) { - throw new ClosedException("The stream has already been closed"); - } - - \assert($this->destination !== null); - - $compressed = \deflate_add($this->resource, $data, \ZLIB_SYNC_FLUSH); - - if ($compressed === false) { - throw new StreamException("Failed adding data to deflate context"); - } - - $promise = $this->destination->write($compressed); - $promise->onResolve(function ($error) { - if ($error) { - $this->close(); - } - }); - - return $promise; - } - - /** @inheritdoc */ - public function end(string $finalData = ""): Promise - { - if ($this->resource === null) { - throw new ClosedException("The stream has already been closed"); - } - - \assert($this->destination !== null); - - $compressed = \deflate_add($this->resource, $finalData, \ZLIB_FINISH); - - if ($compressed === false) { - throw new StreamException("Failed adding data to deflate context"); - } - - $promise = $this->destination->end($compressed); - $promise->onResolve(function () { - $this->close(); - }); - - return $promise; - } - - /** - * @internal - * @return void - */ - private function close() - { - $this->resource = null; - $this->destination = null; - } - - /** - * Gets the used compression encoding. - * - * @return int Encoding specified on construction time. - */ - public function getEncoding(): int - { - return $this->encoding; - } - - /** - * Gets the used compression options. - * - * @return array Options array passed on construction time. - */ - public function getOptions(): array - { - return $this->options; - } -} diff --git a/vendor/amphp/byte-stream/lib/functions.php b/vendor/amphp/byte-stream/lib/functions.php deleted file mode 100644 index 434aef32..00000000 --- a/vendor/amphp/byte-stream/lib/functions.php +++ /dev/null @@ -1,188 +0,0 @@ -read()) !== null) { - $written += \strlen($chunk); - $writePromise = $destination->write($chunk); - $chunk = null; // free memory - yield $writePromise; - } - - return $written; - }); -} - -/** - * @param \Amp\ByteStream\InputStream $source - * - * @return \Amp\Promise - */ -function buffer(InputStream $source): Promise -{ - return call(function () use ($source): \Generator { - $buffer = ""; - - while (($chunk = yield $source->read()) !== null) { - $buffer .= $chunk; - $chunk = null; // free memory - } - - return $buffer; - }); -} - -/** - * The php://input input buffer stream for the process associated with the currently active event loop. - * - * @return ResourceInputStream - */ -function getInputBufferStream(): ResourceInputStream -{ - static $key = InputStream::class . '\\input'; - - $stream = Loop::getState($key); - - if (!$stream) { - $stream = new ResourceInputStream(\fopen('php://input', 'rb')); - Loop::setState($key, $stream); - } - - return $stream; -} - -/** - * The php://output output buffer stream for the process associated with the currently active event loop. - * - * @return ResourceOutputStream - */ -function getOutputBufferStream(): ResourceOutputStream -{ - static $key = OutputStream::class . '\\output'; - - $stream = Loop::getState($key); - - if (!$stream) { - $stream = new ResourceOutputStream(\fopen('php://output', 'wb')); - Loop::setState($key, $stream); - } - - return $stream; -} - -/** - * The STDIN stream for the process associated with the currently active event loop. - * - * @return ResourceInputStream - */ -function getStdin(): ResourceInputStream -{ - static $key = InputStream::class . '\\stdin'; - - $stream = Loop::getState($key); - - if (!$stream) { - $stream = new ResourceInputStream(\STDIN); - Loop::setState($key, $stream); - } - - return $stream; -} - -/** - * The STDOUT stream for the process associated with the currently active event loop. - * - * @return ResourceOutputStream - */ -function getStdout(): ResourceOutputStream -{ - static $key = OutputStream::class . '\\stdout'; - - $stream = Loop::getState($key); - - if (!$stream) { - $stream = new ResourceOutputStream(\STDOUT); - Loop::setState($key, $stream); - } - - return $stream; -} - -/** - * The STDERR stream for the process associated with the currently active event loop. - * - * @return ResourceOutputStream - */ -function getStderr(): ResourceOutputStream -{ - static $key = OutputStream::class . '\\stderr'; - - $stream = Loop::getState($key); - - if (!$stream) { - $stream = new ResourceOutputStream(\STDERR); - Loop::setState($key, $stream); - } - - return $stream; -} - -function parseLineDelimitedJson(InputStream $stream, bool $assoc = false, int $depth = 512, int $options = 0): Iterator -{ - return new Producer(static function (callable $emit) use ($stream, $assoc, $depth, $options) { - $reader = new LineReader($stream); - - while (null !== $line = yield $reader->readLine()) { - $line = \trim($line); - - if ($line === '') { - continue; - } - - /** @noinspection PhpComposerExtensionStubsInspection */ - $data = \json_decode($line, $assoc, $depth, $options); - /** @noinspection PhpComposerExtensionStubsInspection */ - $error = \json_last_error(); - - /** @noinspection PhpComposerExtensionStubsInspection */ - if ($error !== \JSON_ERROR_NONE) { - /** @noinspection PhpComposerExtensionStubsInspection */ - throw new StreamException('Failed to parse JSON: ' . \json_last_error_msg(), $error); - } - - yield $emit($data); - } - }); -} diff --git a/vendor/amphp/byte-stream/psalm.xml b/vendor/amphp/byte-stream/psalm.xml deleted file mode 100644 index 9684f55d..00000000 --- a/vendor/amphp/byte-stream/psalm.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/bin/php-parse b/vendor/bin/php-parse index 1bd2c838..ade70aa7 100755 --- a/vendor/bin/php-parse +++ b/vendor/bin/php-parse @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../nikic/php-parser/bin/php-parse) + * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/nikic/php-parser/bin/php-parse) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/nikic/php-parser/bin/php-parse'); exit(0); } } -include __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse'; +include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/nikic/php-parser/bin/php-parse'; diff --git a/vendor/bin/psalm b/vendor/bin/psalm index baac2024..4015b91c 100755 --- a/vendor/bin/psalm +++ b/vendor/bin/psalm @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../vimeo/psalm/psalm) + * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/vimeo/psalm/psalm) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/vimeo/psalm/psalm'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm'); exit(0); } } -include __DIR__ . '/..'.'/vimeo/psalm/psalm'; +include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm'; diff --git a/vendor/bin/psalm-language-server b/vendor/bin/psalm-language-server index 552f19b2..63c74e2c 100755 --- a/vendor/bin/psalm-language-server +++ b/vendor/bin/psalm-language-server @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../vimeo/psalm/psalm-language-server) + * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/vimeo/psalm/psalm-language-server) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/vimeo/psalm/psalm-language-server'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-language-server'); exit(0); } } -include __DIR__ . '/..'.'/vimeo/psalm/psalm-language-server'; +include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-language-server'; diff --git a/vendor/bin/psalm-plugin b/vendor/bin/psalm-plugin index a1db9f67..4255274f 100755 --- a/vendor/bin/psalm-plugin +++ b/vendor/bin/psalm-plugin @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../vimeo/psalm/psalm-plugin) + * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/vimeo/psalm/psalm-plugin) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/vimeo/psalm/psalm-plugin'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-plugin'); exit(0); } } -include __DIR__ . '/..'.'/vimeo/psalm/psalm-plugin'; +include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-plugin'; diff --git a/vendor/bin/psalm-refactor b/vendor/bin/psalm-refactor index 2376e6cf..28dd65f6 100755 --- a/vendor/bin/psalm-refactor +++ b/vendor/bin/psalm-refactor @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../vimeo/psalm/psalm-refactor) + * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/vimeo/psalm/psalm-refactor) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/vimeo/psalm/psalm-refactor'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-refactor'); exit(0); } } -include __DIR__ . '/..'.'/vimeo/psalm/psalm-refactor'; +include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-refactor'; diff --git a/vendor/bin/psalter b/vendor/bin/psalter index c1ad8e78..ae656654 100755 --- a/vendor/bin/psalter +++ b/vendor/bin/psalter @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../vimeo/psalm/psalter) + * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/vimeo/psalm/psalter) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/vimeo/psalm/psalter'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalter'); exit(0); } } -include __DIR__ . '/..'.'/vimeo/psalm/psalter'; +include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalter'; diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 77b4c1f3..cdd2a655 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -6,1608 +6,23 @@ $baseDir = dirname($vendorDir); return array( - 'AdvancedJsonRpc\\Dispatcher' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Dispatcher.php', - 'AdvancedJsonRpc\\Error' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Error.php', - 'AdvancedJsonRpc\\ErrorCode' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/ErrorCode.php', - 'AdvancedJsonRpc\\ErrorResponse' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/ErrorResponse.php', - 'AdvancedJsonRpc\\Message' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Message.php', - 'AdvancedJsonRpc\\Notification' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Notification.php', - 'AdvancedJsonRpc\\Request' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Request.php', - 'AdvancedJsonRpc\\Response' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Response.php', - 'AdvancedJsonRpc\\SuccessResponse' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php', - 'Amp\\ByteStream\\Base64\\Base64DecodingInputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php', - 'Amp\\ByteStream\\Base64\\Base64DecodingOutputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php', - 'Amp\\ByteStream\\Base64\\Base64EncodingInputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php', - 'Amp\\ByteStream\\Base64\\Base64EncodingOutputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php', - 'Amp\\ByteStream\\ClosedException' => $vendorDir . '/amphp/byte-stream/lib/ClosedException.php', - 'Amp\\ByteStream\\InMemoryStream' => $vendorDir . '/amphp/byte-stream/lib/InMemoryStream.php', - 'Amp\\ByteStream\\InputStream' => $vendorDir . '/amphp/byte-stream/lib/InputStream.php', - 'Amp\\ByteStream\\InputStreamChain' => $vendorDir . '/amphp/byte-stream/lib/InputStreamChain.php', - 'Amp\\ByteStream\\IteratorStream' => $vendorDir . '/amphp/byte-stream/lib/IteratorStream.php', - 'Amp\\ByteStream\\LineReader' => $vendorDir . '/amphp/byte-stream/lib/LineReader.php', - 'Amp\\ByteStream\\Message' => $vendorDir . '/amphp/byte-stream/lib/Message.php', - 'Amp\\ByteStream\\OutputBuffer' => $vendorDir . '/amphp/byte-stream/lib/OutputBuffer.php', - 'Amp\\ByteStream\\OutputStream' => $vendorDir . '/amphp/byte-stream/lib/OutputStream.php', - 'Amp\\ByteStream\\Payload' => $vendorDir . '/amphp/byte-stream/lib/Payload.php', - 'Amp\\ByteStream\\PendingReadError' => $vendorDir . '/amphp/byte-stream/lib/PendingReadError.php', - 'Amp\\ByteStream\\ResourceInputStream' => $vendorDir . '/amphp/byte-stream/lib/ResourceInputStream.php', - 'Amp\\ByteStream\\ResourceOutputStream' => $vendorDir . '/amphp/byte-stream/lib/ResourceOutputStream.php', - 'Amp\\ByteStream\\StreamException' => $vendorDir . '/amphp/byte-stream/lib/StreamException.php', - 'Amp\\ByteStream\\ZlibInputStream' => $vendorDir . '/amphp/byte-stream/lib/ZlibInputStream.php', - 'Amp\\ByteStream\\ZlibOutputStream' => $vendorDir . '/amphp/byte-stream/lib/ZlibOutputStream.php', - 'Amp\\CallableMaker' => $vendorDir . '/amphp/amp/lib/CallableMaker.php', - 'Amp\\CancellationToken' => $vendorDir . '/amphp/amp/lib/CancellationToken.php', - 'Amp\\CancellationTokenSource' => $vendorDir . '/amphp/amp/lib/CancellationTokenSource.php', - 'Amp\\CancelledException' => $vendorDir . '/amphp/amp/lib/CancelledException.php', - 'Amp\\CombinedCancellationToken' => $vendorDir . '/amphp/amp/lib/CombinedCancellationToken.php', - 'Amp\\Coroutine' => $vendorDir . '/amphp/amp/lib/Coroutine.php', - 'Amp\\Deferred' => $vendorDir . '/amphp/amp/lib/Deferred.php', - 'Amp\\Delayed' => $vendorDir . '/amphp/amp/lib/Delayed.php', - 'Amp\\Emitter' => $vendorDir . '/amphp/amp/lib/Emitter.php', - 'Amp\\Failure' => $vendorDir . '/amphp/amp/lib/Failure.php', - 'Amp\\Internal\\Placeholder' => $vendorDir . '/amphp/amp/lib/Internal/Placeholder.php', - 'Amp\\Internal\\PrivateIterator' => $vendorDir . '/amphp/amp/lib/Internal/PrivateIterator.php', - 'Amp\\Internal\\PrivatePromise' => $vendorDir . '/amphp/amp/lib/Internal/PrivatePromise.php', - 'Amp\\Internal\\Producer' => $vendorDir . '/amphp/amp/lib/Internal/Producer.php', - 'Amp\\Internal\\ResolutionQueue' => $vendorDir . '/amphp/amp/lib/Internal/ResolutionQueue.php', - 'Amp\\InvalidYieldError' => $vendorDir . '/amphp/amp/lib/InvalidYieldError.php', - 'Amp\\Iterator' => $vendorDir . '/amphp/amp/lib/Iterator.php', - 'Amp\\LazyPromise' => $vendorDir . '/amphp/amp/lib/LazyPromise.php', - 'Amp\\Loop' => $vendorDir . '/amphp/amp/lib/Loop.php', - 'Amp\\Loop\\Driver' => $vendorDir . '/amphp/amp/lib/Loop/Driver.php', - 'Amp\\Loop\\DriverFactory' => $vendorDir . '/amphp/amp/lib/Loop/DriverFactory.php', - 'Amp\\Loop\\EvDriver' => $vendorDir . '/amphp/amp/lib/Loop/EvDriver.php', - 'Amp\\Loop\\EventDriver' => $vendorDir . '/amphp/amp/lib/Loop/EventDriver.php', - 'Amp\\Loop\\Internal\\TimerQueue' => $vendorDir . '/amphp/amp/lib/Loop/Internal/TimerQueue.php', - 'Amp\\Loop\\InvalidWatcherError' => $vendorDir . '/amphp/amp/lib/Loop/InvalidWatcherError.php', - 'Amp\\Loop\\NativeDriver' => $vendorDir . '/amphp/amp/lib/Loop/NativeDriver.php', - 'Amp\\Loop\\TracingDriver' => $vendorDir . '/amphp/amp/lib/Loop/TracingDriver.php', - 'Amp\\Loop\\UnsupportedFeatureException' => $vendorDir . '/amphp/amp/lib/Loop/UnsupportedFeatureException.php', - 'Amp\\Loop\\UvDriver' => $vendorDir . '/amphp/amp/lib/Loop/UvDriver.php', - 'Amp\\Loop\\Watcher' => $vendorDir . '/amphp/amp/lib/Loop/Watcher.php', - 'Amp\\MultiReasonException' => $vendorDir . '/amphp/amp/lib/MultiReasonException.php', - 'Amp\\NullCancellationToken' => $vendorDir . '/amphp/amp/lib/NullCancellationToken.php', - 'Amp\\Producer' => $vendorDir . '/amphp/amp/lib/Producer.php', - 'Amp\\Promise' => $vendorDir . '/amphp/amp/lib/Promise.php', - 'Amp\\Struct' => $vendorDir . '/amphp/amp/lib/Struct.php', - 'Amp\\Success' => $vendorDir . '/amphp/amp/lib/Success.php', - 'Amp\\TimeoutCancellationToken' => $vendorDir . '/amphp/amp/lib/TimeoutCancellationToken.php', - 'Amp\\TimeoutException' => $vendorDir . '/amphp/amp/lib/TimeoutException.php', 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Bamarni\\Composer\\Bin\\BinCommand' => $vendorDir . '/bamarni/composer-bin-plugin/src/BinCommand.php', 'Bamarni\\Composer\\Bin\\CommandProvider' => $vendorDir . '/bamarni/composer-bin-plugin/src/CommandProvider.php', 'Bamarni\\Composer\\Bin\\Config' => $vendorDir . '/bamarni/composer-bin-plugin/src/Config.php', 'Bamarni\\Composer\\Bin\\Plugin' => $vendorDir . '/bamarni/composer-bin-plugin/src/Plugin.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', - 'Composer\\Pcre\\MatchAllResult' => $vendorDir . '/composer/pcre/src/MatchAllResult.php', - 'Composer\\Pcre\\MatchAllWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchAllWithOffsetsResult.php', - 'Composer\\Pcre\\MatchResult' => $vendorDir . '/composer/pcre/src/MatchResult.php', - 'Composer\\Pcre\\MatchWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchWithOffsetsResult.php', - 'Composer\\Pcre\\PcreException' => $vendorDir . '/composer/pcre/src/PcreException.php', - 'Composer\\Pcre\\Preg' => $vendorDir . '/composer/pcre/src/Preg.php', - 'Composer\\Pcre\\Regex' => $vendorDir . '/composer/pcre/src/Regex.php', - 'Composer\\Pcre\\ReplaceResult' => $vendorDir . '/composer/pcre/src/ReplaceResult.php', - 'Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php', - 'Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php', - 'Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php', - 'Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', - 'Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', - 'Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php', - 'Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php', - 'Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', - 'Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php', - 'Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php', - 'Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', - 'Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', - 'Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php', - 'Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php', - 'Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php', - 'Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php', 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', - 'JsonMapper' => $vendorDir . '/netresearch/jsonmapper/src/JsonMapper.php', - 'JsonMapper_Exception' => $vendorDir . '/netresearch/jsonmapper/src/JsonMapper/Exception.php', - 'LSS\\Array2XML' => $vendorDir . '/openlss/lib-array2xml/LSS/Array2XML.php', - 'LSS\\XML2Array' => $vendorDir . '/openlss/lib-array2xml/LSS/XML2Array.php', - 'LanguageServerProtocol\\CallHierarchyClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php', - 'LanguageServerProtocol\\ChangeAnnotation' => $vendorDir . '/felixfbecker/language-server-protocol/src/ChangeAnnotation.php', - 'LanguageServerProtocol\\ClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilities.php', - 'LanguageServerProtocol\\ClientCapabilitiesGeneral' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php', - 'LanguageServerProtocol\\ClientCapabilitiesWindow' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php', - 'LanguageServerProtocol\\ClientCapabilitiesWorkspace' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php', - 'LanguageServerProtocol\\ClientCapabilitiesWorkspaceFileOperations' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspaceFileOperations.php', - 'LanguageServerProtocol\\ClientInfo' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientInfo.php', - 'LanguageServerProtocol\\CodeAction' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeAction.php', - 'LanguageServerProtocol\\CodeActionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php', - 'LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php', - 'LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php', - 'LanguageServerProtocol\\CodeActionClientCapabilitiesResolveSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php', - 'LanguageServerProtocol\\CodeActionContext' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionContext.php', - 'LanguageServerProtocol\\CodeActionDisabled' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionDisabled.php', - 'LanguageServerProtocol\\CodeActionKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionKind.php', - 'LanguageServerProtocol\\CodeActionTriggerKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionTriggerKind.php', - 'LanguageServerProtocol\\CodeDescription' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeDescription.php', - 'LanguageServerProtocol\\CodeLens' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLens.php', - 'LanguageServerProtocol\\CodeLensClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php', - 'LanguageServerProtocol\\CodeLensOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLensOptions.php', - 'LanguageServerProtocol\\CodeLensWorkspaceClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php', - 'LanguageServerProtocol\\Command' => $vendorDir . '/felixfbecker/language-server-protocol/src/Command.php', - 'LanguageServerProtocol\\CompletionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php', - 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php', - 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemInsertTextModeSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php', - 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemResolveSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php', - 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php', - 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionList' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php', - 'LanguageServerProtocol\\CompletionContext' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionContext.php', - 'LanguageServerProtocol\\CompletionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItem.php', - 'LanguageServerProtocol\\CompletionItemKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItemKind.php', - 'LanguageServerProtocol\\CompletionItemLabelDetails' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItemLabelDetails.php', - 'LanguageServerProtocol\\CompletionItemTag' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItemTag.php', - 'LanguageServerProtocol\\CompletionList' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionList.php', - 'LanguageServerProtocol\\CompletionOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionOptions.php', - 'LanguageServerProtocol\\CompletionTriggerKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php', - 'LanguageServerProtocol\\ContentChangeEvent' => $vendorDir . '/felixfbecker/language-server-protocol/src/ContentChangeEvent.php', - 'LanguageServerProtocol\\DeclarationClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php', - 'LanguageServerProtocol\\DefinitionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php', - 'LanguageServerProtocol\\DependencyReference' => $vendorDir . '/felixfbecker/language-server-protocol/src/DependencyReference.php', - 'LanguageServerProtocol\\Diagnostic' => $vendorDir . '/felixfbecker/language-server-protocol/src/Diagnostic.php', - 'LanguageServerProtocol\\DiagnosticRelatedInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php', - 'LanguageServerProtocol\\DiagnosticSeverity' => $vendorDir . '/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php', - 'LanguageServerProtocol\\DiagnosticTag' => $vendorDir . '/felixfbecker/language-server-protocol/src/DiagnosticTag.php', - 'LanguageServerProtocol\\DidChangeConfigurationClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DidChangeConfigurationClientCapabilities.php', - 'LanguageServerProtocol\\DidChangeWatchedFilesClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php', - 'LanguageServerProtocol\\DocumentColorClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php', - 'LanguageServerProtocol\\DocumentFormattingClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php', - 'LanguageServerProtocol\\DocumentHighlight' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentHighlight.php', - 'LanguageServerProtocol\\DocumentHighlightClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php', - 'LanguageServerProtocol\\DocumentHighlightKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php', - 'LanguageServerProtocol\\DocumentLinkClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentLinkClientCapabilities.php', - 'LanguageServerProtocol\\DocumentOnTypeFormattingClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php', - 'LanguageServerProtocol\\DocumentOnTypeFormattingOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php', - 'LanguageServerProtocol\\DocumentRangeFormattingClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php', - 'LanguageServerProtocol\\DocumentSymbolClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php', - 'LanguageServerProtocol\\DocumentSymbolClientCapabilitiesSymbolKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php', - 'LanguageServerProtocol\\DocumentSymbolClientCapabilitiesTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php', - 'LanguageServerProtocol\\ErrorCode' => $vendorDir . '/felixfbecker/language-server-protocol/src/ErrorCode.php', - 'LanguageServerProtocol\\ExecuteCommandClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ExecuteCommandClientCapabilities.php', - 'LanguageServerProtocol\\ExecuteCommandOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php', - 'LanguageServerProtocol\\FailureHandlingKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/FailureHandlingKind.php', - 'LanguageServerProtocol\\FileChangeType' => $vendorDir . '/felixfbecker/language-server-protocol/src/FileChangeType.php', - 'LanguageServerProtocol\\FileEvent' => $vendorDir . '/felixfbecker/language-server-protocol/src/FileEvent.php', - 'LanguageServerProtocol\\FoldingRangeClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php', - 'LanguageServerProtocol\\FormattingOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/FormattingOptions.php', - 'LanguageServerProtocol\\Hover' => $vendorDir . '/felixfbecker/language-server-protocol/src/Hover.php', - 'LanguageServerProtocol\\HoverClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php', - 'LanguageServerProtocol\\ImplementationClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php', - 'LanguageServerProtocol\\InitializeResult' => $vendorDir . '/felixfbecker/language-server-protocol/src/InitializeResult.php', - 'LanguageServerProtocol\\InitializeResultServerInfo' => $vendorDir . '/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php', - 'LanguageServerProtocol\\InsertTextFormat' => $vendorDir . '/felixfbecker/language-server-protocol/src/InsertTextFormat.php', - 'LanguageServerProtocol\\InsertTextMode' => $vendorDir . '/felixfbecker/language-server-protocol/src/InsertTextMode.php', - 'LanguageServerProtocol\\LinkedEditingRangeClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php', - 'LanguageServerProtocol\\Location' => $vendorDir . '/felixfbecker/language-server-protocol/src/Location.php', - 'LanguageServerProtocol\\LogMessage' => $vendorDir . '/felixfbecker/language-server-protocol/src/LogMessage.php', - 'LanguageServerProtocol\\LogTrace' => $vendorDir . '/felixfbecker/language-server-protocol/src/LogTrace.php', - 'LanguageServerProtocol\\MarkdownClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php', - 'LanguageServerProtocol\\MarkedString' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkedString.php', - 'LanguageServerProtocol\\MarkupContent' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkupContent.php', - 'LanguageServerProtocol\\MarkupKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkupKind.php', - 'LanguageServerProtocol\\MessageActionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/MessageActionItem.php', - 'LanguageServerProtocol\\MessageType' => $vendorDir . '/felixfbecker/language-server-protocol/src/MessageType.php', - 'LanguageServerProtocol\\MonikerClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/MonikerClientCapabilities.php', - 'LanguageServerProtocol\\PackageDescriptor' => $vendorDir . '/felixfbecker/language-server-protocol/src/PackageDescriptor.php', - 'LanguageServerProtocol\\ParameterInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/ParameterInformation.php', - 'LanguageServerProtocol\\Position' => $vendorDir . '/felixfbecker/language-server-protocol/src/Position.php', - 'LanguageServerProtocol\\PrepareSupportDefaultBehavior' => $vendorDir . '/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php', - 'LanguageServerProtocol\\PublishDiagnosticsClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilities.php', - 'LanguageServerProtocol\\PublishDiagnosticsClientCapabilitiesTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php', - 'LanguageServerProtocol\\Range' => $vendorDir . '/felixfbecker/language-server-protocol/src/Range.php', - 'LanguageServerProtocol\\ReferenceClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php', - 'LanguageServerProtocol\\ReferenceContext' => $vendorDir . '/felixfbecker/language-server-protocol/src/ReferenceContext.php', - 'LanguageServerProtocol\\ReferenceInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/ReferenceInformation.php', - 'LanguageServerProtocol\\RegularExpressionsClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php', - 'LanguageServerProtocol\\RenameClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php', - 'LanguageServerProtocol\\ResourceOperationKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/ResourceOperationKind.php', - 'LanguageServerProtocol\\SaveOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/SaveOptions.php', - 'LanguageServerProtocol\\SelectionRangeClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SelectionRangeClientCapabilities.php', - 'LanguageServerProtocol\\SemanticTokensClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php', - 'LanguageServerProtocol\\SemanticTokensClientCapabilitiesRequests' => $vendorDir . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php', - 'LanguageServerProtocol\\SemanticTokensWorkspaceClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php', - 'LanguageServerProtocol\\ServerCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ServerCapabilities.php', - 'LanguageServerProtocol\\ShowDocumentClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ShowDocumentClientCapabilities.php', - 'LanguageServerProtocol\\ShowMessageRequestClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php', - 'LanguageServerProtocol\\ShowMessageRequestClientCapabilitiesMessageActionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php', - 'LanguageServerProtocol\\SignatureHelp' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelp.php', - 'LanguageServerProtocol\\SignatureHelpClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php', - 'LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php', - 'LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformationParameterInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php', - 'LanguageServerProtocol\\SignatureHelpOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php', - 'LanguageServerProtocol\\SignatureInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureInformation.php', - 'LanguageServerProtocol\\SymbolDescriptor' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolDescriptor.php', - 'LanguageServerProtocol\\SymbolInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolInformation.php', - 'LanguageServerProtocol\\SymbolKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolKind.php', - 'LanguageServerProtocol\\SymbolLocationInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolLocationInformation.php', - 'LanguageServerProtocol\\SymbolTag' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolTag.php', - 'LanguageServerProtocol\\TextDocumentClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentClientCapabilities.php', - 'LanguageServerProtocol\\TextDocumentContentChangeEvent' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php', - 'LanguageServerProtocol\\TextDocumentIdentifier' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php', - 'LanguageServerProtocol\\TextDocumentItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentItem.php', - 'LanguageServerProtocol\\TextDocumentSyncClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php', - 'LanguageServerProtocol\\TextDocumentSyncKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php', - 'LanguageServerProtocol\\TextDocumentSyncOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentSyncOptions.php', - 'LanguageServerProtocol\\TextEdit' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextEdit.php', - 'LanguageServerProtocol\\TokenFormat' => $vendorDir . '/felixfbecker/language-server-protocol/src/TokenFormat.php', - 'LanguageServerProtocol\\TypeDefinitionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/TypeDefinitionClientCapabilities.php', - 'LanguageServerProtocol\\VersionedTextDocumentIdentifier' => $vendorDir . '/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php', - 'LanguageServerProtocol\\WorkspaceEdit' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceEdit.php', - 'LanguageServerProtocol\\WorkspaceEditClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php', - 'LanguageServerProtocol\\WorkspaceEditClientCapabilitiesChangeAnnotationSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php', - 'LanguageServerProtocol\\WorkspaceFolder' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceFolder.php', - 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php', - 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesResolveSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php', - 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesSymbolKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php', - 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php', 'NC\\Updater\\CommandApplication' => $baseDir . '/lib/CommandApplication.php', 'NC\\Updater\\LogException' => $baseDir . '/lib/LogException.php', 'NC\\Updater\\RecursiveDirectoryIteratorWithoutData' => $baseDir . '/lib/RecursiveDirectoryIteratorWithoutData.php', 'NC\\Updater\\UpdateCommand' => $baseDir . '/lib/UpdateCommand.php', 'NC\\Updater\\UpdateException' => $baseDir . '/lib/UpdateException.php', 'NC\\Updater\\Updater' => $baseDir . '/lib/Updater.php', - 'PackageVersions\\FallbackVersions' => $vendorDir . '/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php', - 'PackageVersions\\Installer' => $vendorDir . '/composer/package-versions-deprecated/src/PackageVersions/Installer.php', - 'PackageVersions\\Versions' => $vendorDir . '/composer/package-versions-deprecated/src/PackageVersions/Versions.php', - 'PhpParser\\Builder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder.php', - 'PhpParser\\BuilderFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', - 'PhpParser\\BuilderHelpers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', - 'PhpParser\\Builder\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php', - 'PhpParser\\Builder\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', - 'PhpParser\\Builder\\Declaration' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', - 'PhpParser\\Builder\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php', - 'PhpParser\\Builder\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php', - 'PhpParser\\Builder\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', - 'PhpParser\\Builder\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', - 'PhpParser\\Builder\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', - 'PhpParser\\Builder\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', - 'PhpParser\\Builder\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', - 'PhpParser\\Builder\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', - 'PhpParser\\Builder\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', - 'PhpParser\\Builder\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', - 'PhpParser\\Builder\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', - 'PhpParser\\Builder\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', - 'PhpParser\\Builder\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', - 'PhpParser\\Comment' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment.php', - 'PhpParser\\Comment\\Doc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', - 'PhpParser\\ConstExprEvaluationException' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', - 'PhpParser\\ConstExprEvaluator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', - 'PhpParser\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Error.php', - 'PhpParser\\ErrorHandler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', - 'PhpParser\\ErrorHandler\\Collecting' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', - 'PhpParser\\ErrorHandler\\Throwing' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', - 'PhpParser\\Internal\\DiffElem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', - 'PhpParser\\Internal\\Differ' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', - 'PhpParser\\Internal\\PrintableNewAnonClassNode' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', - 'PhpParser\\Internal\\TokenStream' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', - 'PhpParser\\JsonDecoder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', - 'PhpParser\\Lexer' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer.php', - 'PhpParser\\Lexer\\Emulative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', - 'PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', - 'PhpParser\\NameContext' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NameContext.php', - 'PhpParser\\Node' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node.php', - 'PhpParser\\NodeAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', - 'PhpParser\\NodeDumper' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', - 'PhpParser\\NodeFinder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', - 'PhpParser\\NodeTraverser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', - 'PhpParser\\NodeTraverserInterface' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', - 'PhpParser\\NodeVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', - 'PhpParser\\NodeVisitorAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', - 'PhpParser\\NodeVisitor\\CloningVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', - 'PhpParser\\NodeVisitor\\FindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', - 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', - 'PhpParser\\NodeVisitor\\NameResolver' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', - 'PhpParser\\NodeVisitor\\NodeConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', - 'PhpParser\\NodeVisitor\\ParentConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', - 'PhpParser\\Node\\Arg' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', - 'PhpParser\\Node\\Attribute' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', - 'PhpParser\\Node\\AttributeGroup' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', - 'PhpParser\\Node\\ComplexType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', - 'PhpParser\\Node\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', - 'PhpParser\\Node\\Expr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', - 'PhpParser\\Node\\Expr\\ArrayDimFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', - 'PhpParser\\Node\\Expr\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', - 'PhpParser\\Node\\Expr\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', - 'PhpParser\\Node\\Expr\\ArrowFunction' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', - 'PhpParser\\Node\\Expr\\Assign' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', - 'PhpParser\\Node\\Expr\\AssignOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', - 'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', - 'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', - 'PhpParser\\Node\\Expr\\AssignRef' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', - 'PhpParser\\Node\\Expr\\BinaryOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', - 'PhpParser\\Node\\Expr\\BitwiseNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', - 'PhpParser\\Node\\Expr\\BooleanNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', - 'PhpParser\\Node\\Expr\\CallLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php', - 'PhpParser\\Node\\Expr\\Cast' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', - 'PhpParser\\Node\\Expr\\Cast\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', - 'PhpParser\\Node\\Expr\\Cast\\Bool_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', - 'PhpParser\\Node\\Expr\\Cast\\Double' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', - 'PhpParser\\Node\\Expr\\Cast\\Int_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', - 'PhpParser\\Node\\Expr\\Cast\\Object_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', - 'PhpParser\\Node\\Expr\\Cast\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', - 'PhpParser\\Node\\Expr\\Cast\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', - 'PhpParser\\Node\\Expr\\ClassConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', - 'PhpParser\\Node\\Expr\\Clone_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', - 'PhpParser\\Node\\Expr\\Closure' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', - 'PhpParser\\Node\\Expr\\ClosureUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', - 'PhpParser\\Node\\Expr\\ConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', - 'PhpParser\\Node\\Expr\\Empty_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', - 'PhpParser\\Node\\Expr\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', - 'PhpParser\\Node\\Expr\\ErrorSuppress' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', - 'PhpParser\\Node\\Expr\\Eval_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', - 'PhpParser\\Node\\Expr\\Exit_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', - 'PhpParser\\Node\\Expr\\FuncCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', - 'PhpParser\\Node\\Expr\\Include_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', - 'PhpParser\\Node\\Expr\\Instanceof_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', - 'PhpParser\\Node\\Expr\\Isset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', - 'PhpParser\\Node\\Expr\\List_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', - 'PhpParser\\Node\\Expr\\Match_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php', - 'PhpParser\\Node\\Expr\\MethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', - 'PhpParser\\Node\\Expr\\New_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', - 'PhpParser\\Node\\Expr\\NullsafeMethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php', - 'PhpParser\\Node\\Expr\\NullsafePropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php', - 'PhpParser\\Node\\Expr\\PostDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', - 'PhpParser\\Node\\Expr\\PostInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', - 'PhpParser\\Node\\Expr\\PreDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', - 'PhpParser\\Node\\Expr\\PreInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', - 'PhpParser\\Node\\Expr\\Print_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', - 'PhpParser\\Node\\Expr\\PropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', - 'PhpParser\\Node\\Expr\\ShellExec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', - 'PhpParser\\Node\\Expr\\StaticCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', - 'PhpParser\\Node\\Expr\\StaticPropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', - 'PhpParser\\Node\\Expr\\Ternary' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', - 'PhpParser\\Node\\Expr\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php', - 'PhpParser\\Node\\Expr\\UnaryMinus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', - 'PhpParser\\Node\\Expr\\UnaryPlus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', - 'PhpParser\\Node\\Expr\\Variable' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', - 'PhpParser\\Node\\Expr\\YieldFrom' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', - 'PhpParser\\Node\\Expr\\Yield_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', - 'PhpParser\\Node\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', - 'PhpParser\\Node\\Identifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', - 'PhpParser\\Node\\IntersectionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', - 'PhpParser\\Node\\MatchArm' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', - 'PhpParser\\Node\\Name' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name.php', - 'PhpParser\\Node\\Name\\FullyQualified' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', - 'PhpParser\\Node\\Name\\Relative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', - 'PhpParser\\Node\\NullableType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', - 'PhpParser\\Node\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Param.php', - 'PhpParser\\Node\\Scalar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', - 'PhpParser\\Node\\Scalar\\DNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', - 'PhpParser\\Node\\Scalar\\Encapsed' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', - 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', - 'PhpParser\\Node\\Scalar\\LNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', - 'PhpParser\\Node\\Scalar\\MagicConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\File' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', - 'PhpParser\\Node\\Scalar\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', - 'PhpParser\\Node\\Stmt' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', - 'PhpParser\\Node\\Stmt\\Break_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', - 'PhpParser\\Node\\Stmt\\Case_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', - 'PhpParser\\Node\\Stmt\\Catch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', - 'PhpParser\\Node\\Stmt\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', - 'PhpParser\\Node\\Stmt\\ClassLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', - 'PhpParser\\Node\\Stmt\\ClassMethod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', - 'PhpParser\\Node\\Stmt\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', - 'PhpParser\\Node\\Stmt\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', - 'PhpParser\\Node\\Stmt\\Continue_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', - 'PhpParser\\Node\\Stmt\\DeclareDeclare' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', - 'PhpParser\\Node\\Stmt\\Declare_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', - 'PhpParser\\Node\\Stmt\\Do_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', - 'PhpParser\\Node\\Stmt\\Echo_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', - 'PhpParser\\Node\\Stmt\\ElseIf_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', - 'PhpParser\\Node\\Stmt\\Else_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', - 'PhpParser\\Node\\Stmt\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php', - 'PhpParser\\Node\\Stmt\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php', - 'PhpParser\\Node\\Stmt\\Expression' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', - 'PhpParser\\Node\\Stmt\\Finally_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', - 'PhpParser\\Node\\Stmt\\For_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', - 'PhpParser\\Node\\Stmt\\Foreach_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', - 'PhpParser\\Node\\Stmt\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', - 'PhpParser\\Node\\Stmt\\Global_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', - 'PhpParser\\Node\\Stmt\\Goto_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', - 'PhpParser\\Node\\Stmt\\GroupUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', - 'PhpParser\\Node\\Stmt\\HaltCompiler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', - 'PhpParser\\Node\\Stmt\\If_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', - 'PhpParser\\Node\\Stmt\\InlineHTML' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', - 'PhpParser\\Node\\Stmt\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', - 'PhpParser\\Node\\Stmt\\Label' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', - 'PhpParser\\Node\\Stmt\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', - 'PhpParser\\Node\\Stmt\\Nop' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', - 'PhpParser\\Node\\Stmt\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', - 'PhpParser\\Node\\Stmt\\PropertyProperty' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', - 'PhpParser\\Node\\Stmt\\Return_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', - 'PhpParser\\Node\\Stmt\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', - 'PhpParser\\Node\\Stmt\\Static_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', - 'PhpParser\\Node\\Stmt\\Switch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', - 'PhpParser\\Node\\Stmt\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', - 'PhpParser\\Node\\Stmt\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', - 'PhpParser\\Node\\Stmt\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', - 'PhpParser\\Node\\Stmt\\TryCatch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', - 'PhpParser\\Node\\Stmt\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', - 'PhpParser\\Node\\Stmt\\UseUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', - 'PhpParser\\Node\\Stmt\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', - 'PhpParser\\Node\\Stmt\\While_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', - 'PhpParser\\Node\\UnionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', - 'PhpParser\\Node\\VarLikeIdentifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', - 'PhpParser\\Node\\VariadicPlaceholder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', - 'PhpParser\\Parser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser.php', - 'PhpParser\\ParserAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', - 'PhpParser\\ParserFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', - 'PhpParser\\Parser\\Multiple' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', - 'PhpParser\\Parser\\Php5' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', - 'PhpParser\\Parser\\Php7' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', - 'PhpParser\\Parser\\Tokens' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', - 'PhpParser\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', - 'PhpParser\\PrettyPrinter\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', - 'Psalm\\Aliases' => $vendorDir . '/vimeo/psalm/src/Psalm/Aliases.php', - 'Psalm\\CodeLocation' => $vendorDir . '/vimeo/psalm/src/Psalm/CodeLocation.php', - 'Psalm\\CodeLocation\\DocblockTypeLocation' => $vendorDir . '/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php', - 'Psalm\\CodeLocation\\ParseErrorLocation' => $vendorDir . '/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php', - 'Psalm\\CodeLocation\\Raw' => $vendorDir . '/vimeo/psalm/src/Psalm/CodeLocation/Raw.php', - 'Psalm\\Codebase' => $vendorDir . '/vimeo/psalm/src/Psalm/Codebase.php', - 'Psalm\\Config' => $vendorDir . '/vimeo/psalm/src/Psalm/Config.php', - 'Psalm\\Config\\Creator' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/Creator.php', - 'Psalm\\Config\\ErrorLevelFileFilter' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php', - 'Psalm\\Config\\FileFilter' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/FileFilter.php', - 'Psalm\\Config\\IssueHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/IssueHandler.php', - 'Psalm\\Config\\ProjectFileFilter' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php', - 'Psalm\\Config\\TaintAnalysisFileFilter' => $vendorDir . '/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php', - 'Psalm\\Context' => $vendorDir . '/vimeo/psalm/src/Psalm/Context.php', - 'Psalm\\DocComment' => $vendorDir . '/vimeo/psalm/src/Psalm/DocComment.php', - 'Psalm\\ErrorBaseline' => $vendorDir . '/vimeo/psalm/src/Psalm/ErrorBaseline.php', - 'Psalm\\Exception\\CircularReferenceException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php', - 'Psalm\\Exception\\CodeException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/CodeException.php', - 'Psalm\\Exception\\ComplicatedExpressionException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/ComplicatedExpressionException.php', - 'Psalm\\Exception\\ConfigCreationException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/ConfigCreationException.php', - 'Psalm\\Exception\\ConfigException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/ConfigException.php', - 'Psalm\\Exception\\ConfigNotFoundException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/ConfigNotFoundException.php', - 'Psalm\\Exception\\DocblockParseException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/DocblockParseException.php', - 'Psalm\\Exception\\FileIncludeException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/FileIncludeException.php', - 'Psalm\\Exception\\IncorrectDocblockException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/IncorrectDocblockException.php', - 'Psalm\\Exception\\InvalidClasslikeOverrideException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/InvalidClasslikeOverrideException.php', - 'Psalm\\Exception\\InvalidMethodOverrideException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/InvalidMethodOverrideException.php', - 'Psalm\\Exception\\RefactorException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/RefactorException.php', - 'Psalm\\Exception\\ScopeAnalysisException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/ScopeAnalysisException.php', - 'Psalm\\Exception\\TypeParseTreeException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/TypeParseTreeException.php', - 'Psalm\\Exception\\UnanalyzedFileException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/UnanalyzedFileException.php', - 'Psalm\\Exception\\UnpopulatedClasslikeException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/UnpopulatedClasslikeException.php', - 'Psalm\\Exception\\UnpreparedAnalysisException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/UnpreparedAnalysisException.php', - 'Psalm\\Exception\\UnsupportedIssueToFixException' => $vendorDir . '/vimeo/psalm/src/Psalm/Exception/UnsupportedIssueToFixException.php', - 'Psalm\\FileBasedPluginAdapter' => $vendorDir . '/vimeo/psalm/src/Psalm/FileBasedPluginAdapter.php', - 'Psalm\\FileManipulation' => $vendorDir . '/vimeo/psalm/src/Psalm/FileManipulation.php', - 'Psalm\\FileSource' => $vendorDir . '/vimeo/psalm/src/Psalm/FileSource.php', - 'Psalm\\Internal\\Algebra' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Algebra.php', - 'Psalm\\Internal\\Algebra\\FormulaGenerator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php', - 'Psalm\\Internal\\Analyzer\\AlgebraAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\AttributesAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\CanAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php', - 'Psalm\\Internal\\Analyzer\\ClassAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\ClassLikeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\ClassLikeNameOptions' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php', - 'Psalm\\Internal\\Analyzer\\ClosureAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\CommentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\DataFlowNodeData' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php', - 'Psalm\\Internal\\Analyzer\\FileAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\FunctionAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\FunctionLikeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php', - 'Psalm\\Internal\\Analyzer\\InterfaceAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\IssueData' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php', - 'Psalm\\Internal\\Analyzer\\MethodAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\MethodComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php', - 'Psalm\\Internal\\Analyzer\\NamespaceAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\ProjectAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\ScopeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\SourceAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\StatementsAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\DoAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForeachAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfConditionalAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElseAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseIfAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\IfAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\LoopAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchCaseAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\TryAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\WhileAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\BreakAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\ContinueAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\EchoAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\ExpressionAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayCreationInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssertionFinder' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssignmentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\ArrayAssignmentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\AssignedProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\InstancePropertyAssignmentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\StaticPropertyAssignmentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOpAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\AndAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ArithmeticOpAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\CoalesceAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ConcatAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\NonComparisonOpAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\OrAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BitwiseNotAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BooleanNotAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentMapPopulator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentsAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArrayFunctionArgumentsAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ClassTemplateParamCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallReturnTypeFetcher' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\MethodCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicCallContext' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalysisResult' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\ExistingAtomicMethodCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallProhibitionAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallPurityAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallReturnTypeFetcher' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodVisibilityAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MissingMethodCallHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NamedFunctionCallHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NewAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\AtomicStaticCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\ExistingAtomicStaticCallAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CastAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CloneAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EmptyAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EncapsulatedStringAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EvalAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExitAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExpressionIdentifier' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ArrayFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\AtomicPropertyFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ClassConstFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ConstFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\InstancePropertyFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\StaticPropertyFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\VariableFetchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncDecExpressionAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncludeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\InstanceofAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IssetAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MagicConstAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MatchAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\NullsafeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\PrintAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\SimpleTypeInferer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\TernaryAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\UnaryPlusMinusAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldFromAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\GlobalAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\ReturnAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\StaticAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\ThrowAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\UnsetAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\UnusedAssignmentRemover' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php', - 'Psalm\\Internal\\Analyzer\\TraitAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\TypeAnalyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php', - 'Psalm\\Internal\\Clause' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Clause.php', - 'Psalm\\Internal\\CliUtils' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/CliUtils.php', - 'Psalm\\Internal\\Cli\\LanguageServer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php', - 'Psalm\\Internal\\Cli\\Plugin' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php', - 'Psalm\\Internal\\Cli\\Psalm' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php', - 'Psalm\\Internal\\Cli\\Psalter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php', - 'Psalm\\Internal\\Cli\\Refactor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php', - 'Psalm\\Internal\\Codebase\\Analyzer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php', - 'Psalm\\Internal\\Codebase\\ClassConstantByWildcardResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php', - 'Psalm\\Internal\\Codebase\\ClassLikes' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php', - 'Psalm\\Internal\\Codebase\\ConstantTypeResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php', - 'Psalm\\Internal\\Codebase\\DataFlowGraph' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php', - 'Psalm\\Internal\\Codebase\\Functions' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php', - 'Psalm\\Internal\\Codebase\\InternalCallMapHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php', - 'Psalm\\Internal\\Codebase\\Methods' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php', - 'Psalm\\Internal\\Codebase\\Populator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php', - 'Psalm\\Internal\\Codebase\\Properties' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php', - 'Psalm\\Internal\\Codebase\\PropertyMap' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php', - 'Psalm\\Internal\\Codebase\\ReferenceMapGenerator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php', - 'Psalm\\Internal\\Codebase\\Reflection' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php', - 'Psalm\\Internal\\Codebase\\Scanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php', - 'Psalm\\Internal\\Codebase\\TaintFlowGraph' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php', - 'Psalm\\Internal\\Codebase\\VariableUseGraph' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php', - 'Psalm\\Internal\\Composer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Composer.php', - 'Psalm\\Internal\\DataFlow\\DataFlowNode' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/DataFlow/DataFlowNode.php', - 'Psalm\\Internal\\DataFlow\\Path' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php', - 'Psalm\\Internal\\DataFlow\\TaintSink' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php', - 'Psalm\\Internal\\DataFlow\\TaintSource' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSource.php', - 'Psalm\\Internal\\Diff\\AstDiffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/AstDiffer.php', - 'Psalm\\Internal\\Diff\\ClassStatementsDiffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php', - 'Psalm\\Internal\\Diff\\DiffElem' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php', - 'Psalm\\Internal\\Diff\\FileDiffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php', - 'Psalm\\Internal\\Diff\\FileStatementsDiffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php', - 'Psalm\\Internal\\Diff\\NamespaceStatementsDiffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php', - 'Psalm\\Internal\\ErrorHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php', - 'Psalm\\Internal\\EventDispatcher' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/EventDispatcher.php', - 'Psalm\\Internal\\ExecutionEnvironment\\BuildInfoCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php', - 'Psalm\\Internal\\ExecutionEnvironment\\GitInfoCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php', - 'Psalm\\Internal\\ExecutionEnvironment\\SystemCommandExecutor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php', - 'Psalm\\Internal\\FileManipulation\\ClassDocblockManipulator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php', - 'Psalm\\Internal\\FileManipulation\\CodeMigration' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php', - 'Psalm\\Internal\\FileManipulation\\FileManipulationBuffer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php', - 'Psalm\\Internal\\FileManipulation\\FunctionDocblockManipulator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php', - 'Psalm\\Internal\\FileManipulation\\PropertyDocblockManipulator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php', - 'Psalm\\Internal\\Fork\\ForkMessage' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php', - 'Psalm\\Internal\\Fork\\ForkProcessDoneMessage' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php', - 'Psalm\\Internal\\Fork\\ForkProcessErrorMessage' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php', - 'Psalm\\Internal\\Fork\\ForkTaskDoneMessage' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php', - 'Psalm\\Internal\\Fork\\Pool' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php', - 'Psalm\\Internal\\Fork\\PsalmRestarter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php', - 'Psalm\\Internal\\IncludeCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php', - 'Psalm\\Internal\\Json\\Json' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Json/Json.php', - 'Psalm\\Internal\\LanguageServer\\ClientHandler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php', - 'Psalm\\Internal\\LanguageServer\\Client\\TextDocument' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Client/TextDocument.php', - 'Psalm\\Internal\\LanguageServer\\EmitterInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php', - 'Psalm\\Internal\\LanguageServer\\EmitterTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php', - 'Psalm\\Internal\\LanguageServer\\IdGenerator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php', - 'Psalm\\Internal\\LanguageServer\\LanguageClient' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php', - 'Psalm\\Internal\\LanguageServer\\LanguageServer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php', - 'Psalm\\Internal\\LanguageServer\\Message' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php', - 'Psalm\\Internal\\LanguageServer\\ProtocolReader' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php', - 'Psalm\\Internal\\LanguageServer\\ProtocolStreamReader' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php', - 'Psalm\\Internal\\LanguageServer\\ProtocolStreamWriter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php', - 'Psalm\\Internal\\LanguageServer\\ProtocolWriter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php', - 'Psalm\\Internal\\LanguageServer\\Server\\TextDocument' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/TextDocument.php', - 'Psalm\\Internal\\LanguageServer\\Server\\Workspace' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php', - 'Psalm\\Internal\\MethodIdentifier' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php', - 'Psalm\\Internal\\PhpTraverser\\CustomTraverser' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php', - 'Psalm\\Internal\\PhpVisitor\\AssignmentMapVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\CheckTrivialExprVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\CloningVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\ConditionCloningVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\NodeCleanerVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\NodeCounterVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\OffsetShifterVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\ParamReplacementVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\PartialParserVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\ReflectorVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\AttributeResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeDocblockParser' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeNodeScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockParser' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeNodeScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\TypeHintResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php', - 'Psalm\\Internal\\PhpVisitor\\ShortClosureVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\SimpleNameResolver' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php', - 'Psalm\\Internal\\PhpVisitor\\TraitFinder' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php', - 'Psalm\\Internal\\PhpVisitor\\TypeMappingVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php', - 'Psalm\\Internal\\PluginManager\\Command\\DisableCommand' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php', - 'Psalm\\Internal\\PluginManager\\Command\\EnableCommand' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php', - 'Psalm\\Internal\\PluginManager\\Command\\ShowCommand' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php', - 'Psalm\\Internal\\PluginManager\\ComposerLock' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php', - 'Psalm\\Internal\\PluginManager\\ConfigFile' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php', - 'Psalm\\Internal\\PluginManager\\PluginList' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php', - 'Psalm\\Internal\\PluginManager\\PluginListFactory' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php', - 'Psalm\\Internal\\Provider\\AddRemoveTaints\\HtmlFunctionTainter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php', - 'Psalm\\Internal\\Provider\\ClassLikeStorageCacheProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php', - 'Psalm\\Internal\\Provider\\ClassLikeStorageProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php', - 'Psalm\\Internal\\Provider\\FakeFileProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php', - 'Psalm\\Internal\\Provider\\FileProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php', - 'Psalm\\Internal\\Provider\\FileReferenceCacheProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php', - 'Psalm\\Internal\\Provider\\FileReferenceProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php', - 'Psalm\\Internal\\Provider\\FileStorageCacheProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php', - 'Psalm\\Internal\\Provider\\FileStorageProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php', - 'Psalm\\Internal\\Provider\\FunctionExistenceProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php', - 'Psalm\\Internal\\Provider\\FunctionParamsProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php', - 'Psalm\\Internal\\Provider\\FunctionReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\MethodExistenceProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php', - 'Psalm\\Internal\\Provider\\MethodParamsProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php', - 'Psalm\\Internal\\Provider\\MethodReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\MethodVisibilityProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php', - 'Psalm\\Internal\\Provider\\NodeDataProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php', - 'Psalm\\Internal\\Provider\\ParserCacheProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php', - 'Psalm\\Internal\\Provider\\ProjectCacheProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php', - 'Psalm\\Internal\\Provider\\PropertyExistenceProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php', - 'Psalm\\Internal\\Provider\\PropertyTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php', - 'Psalm\\Internal\\Provider\\PropertyTypeProvider\\DomDocumentPropertyTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php', - 'Psalm\\Internal\\Provider\\PropertyVisibilityProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php', - 'Psalm\\Internal\\Provider\\Providers' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayChunkReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayColumnReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFillReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFilterReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMapReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMergeReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPadReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPointerAdjustmentReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPopReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayRandReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReduceReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReverseReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySliceReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySpliceReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayUniqueReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayValuesReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ClosureFromCallableReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\DomNodeAppendChild' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ExplodeReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FilterVarReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FirstArgStringReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetClassMethodsReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetObjectVarsReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\HexdecReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ImagickPixelColorReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\InArrayReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\IteratorToArrayReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MinMaxReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MktimeReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ParseUrlReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementSetFetchMode' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\RandReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\SimpleXmlElementAsXml' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrReplaceReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrTrReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\TriggerErrorReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\VersionCompareReturnTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\StatementsProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php', - 'Psalm\\Internal\\Provider\\StatementsVolatileCache' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php', - 'Psalm\\Internal\\ReferenceConstraint' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php', - 'Psalm\\Internal\\RuntimeCaches' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php', - 'Psalm\\Internal\\Scanner\\ClassLikeDocblockComment' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php', - 'Psalm\\Internal\\Scanner\\DocblockParser' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php', - 'Psalm\\Internal\\Scanner\\FileScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php', - 'Psalm\\Internal\\Scanner\\FunctionDocblockComment' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php', - 'Psalm\\Internal\\Scanner\\ParsedDocblock' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php', - 'Psalm\\Internal\\Scanner\\PhpStormMetaScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstantComponent' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayOffsetFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArraySpread' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ClassConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\Constant' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\KeyValuePair' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ScalarValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedAdditionOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBinaryOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseAnd' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseOr' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseXor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedConcatOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedDivisionOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedMultiplicationOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedSubtractionOp' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedTernary' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php', - 'Psalm\\Internal\\Scanner\\VarDocblockComment' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scanner/VarDocblockComment.php', - 'Psalm\\Internal\\Scope\\CaseScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php', - 'Psalm\\Internal\\Scope\\FinallyScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php', - 'Psalm\\Internal\\Scope\\IfConditionalScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php', - 'Psalm\\Internal\\Scope\\IfScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php', - 'Psalm\\Internal\\Scope\\LoopScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php', - 'Psalm\\Internal\\Scope\\SwitchScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php', - 'Psalm\\Internal\\Stubs\\Generator\\ClassLikeStubGenerator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php', - 'Psalm\\Internal\\Stubs\\Generator\\StubsGenerator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php', - 'Psalm\\Internal\\TypeVisitor\\ContainsClassLikeVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php', - 'Psalm\\Internal\\TypeVisitor\\ContainsLiteralVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php', - 'Psalm\\Internal\\TypeVisitor\\FromDocblockSetter' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php', - 'Psalm\\Internal\\TypeVisitor\\TemplateTypeCollector' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php', - 'Psalm\\Internal\\TypeVisitor\\TypeChecker' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php', - 'Psalm\\Internal\\TypeVisitor\\TypeScanner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php', - 'Psalm\\Internal\\Type\\ArrayType' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php', - 'Psalm\\Internal\\Type\\AssertionReconciler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php', - 'Psalm\\Internal\\Type\\Comparator\\ArrayTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\AtomicTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\CallableTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\ClassLikeStringComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\GenericTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\IntegerRangeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\KeyedArrayComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\ObjectComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\ScalarTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\TypeComparisonResult' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php', - 'Psalm\\Internal\\Type\\Comparator\\UnionTypeComparator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php', - 'Psalm\\Internal\\Type\\NegatedAssertionReconciler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php', - 'Psalm\\Internal\\Type\\ParseTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php', - 'Psalm\\Internal\\Type\\ParseTreeCreator' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php', - 'Psalm\\Internal\\Type\\ParseTree\\CallableParamTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\CallableTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\CallableWithReturnTypeTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\ConditionalTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\EncapsulationTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\GenericTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/GenericTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\IndexedAccessTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\IntersectionTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayPropertyTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\MethodParamTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\MethodTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\MethodWithReturnTypeTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\NullableTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/NullableTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\Root' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Root.php', - 'Psalm\\Internal\\Type\\ParseTree\\TemplateAsTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\TemplateIsTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\UnionTree' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\Value' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Value.php', - 'Psalm\\Internal\\Type\\SimpleAssertionReconciler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php', - 'Psalm\\Internal\\Type\\SimpleNegatedAssertionReconciler' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php', - 'Psalm\\Internal\\Type\\TemplateBound' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php', - 'Psalm\\Internal\\Type\\TemplateInferredTypeReplacer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php', - 'Psalm\\Internal\\Type\\TemplateResult' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php', - 'Psalm\\Internal\\Type\\TemplateStandinTypeReplacer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php', - 'Psalm\\Internal\\Type\\TypeAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php', - 'Psalm\\Internal\\Type\\TypeAlias\\ClassTypeAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php', - 'Psalm\\Internal\\Type\\TypeAlias\\InlineTypeAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php', - 'Psalm\\Internal\\Type\\TypeAlias\\LinkableTypeAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php', - 'Psalm\\Internal\\Type\\TypeCombination' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php', - 'Psalm\\Internal\\Type\\TypeCombiner' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php', - 'Psalm\\Internal\\Type\\TypeExpander' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php', - 'Psalm\\Internal\\Type\\TypeParser' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php', - 'Psalm\\Internal\\Type\\TypeTokenizer' => $vendorDir . '/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php', - 'Psalm\\IssueBuffer' => $vendorDir . '/vimeo/psalm/src/Psalm/IssueBuffer.php', - 'Psalm\\Issue\\AbstractInstantiation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php', - 'Psalm\\Issue\\AbstractMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/AbstractMethodCall.php', - 'Psalm\\Issue\\ArgumentIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ArgumentIssue.php', - 'Psalm\\Issue\\ArgumentTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php', - 'Psalm\\Issue\\AssignmentToVoid' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/AssignmentToVoid.php', - 'Psalm\\Issue\\CircularReference' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/CircularReference.php', - 'Psalm\\Issue\\ClassIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ClassIssue.php', - 'Psalm\\Issue\\CodeIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/CodeIssue.php', - 'Psalm\\Issue\\ComplexFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php', - 'Psalm\\Issue\\ComplexMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ComplexMethod.php', - 'Psalm\\Issue\\ConfigIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ConfigIssue.php', - 'Psalm\\Issue\\ConflictingReferenceConstraint' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ConflictingReferenceConstraint.php', - 'Psalm\\Issue\\ConstructorSignatureMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ConstructorSignatureMismatch.php', - 'Psalm\\Issue\\ContinueOutsideLoop' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ContinueOutsideLoop.php', - 'Psalm\\Issue\\DeprecatedClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedClass.php', - 'Psalm\\Issue\\DeprecatedConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedConstant.php', - 'Psalm\\Issue\\DeprecatedFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedFunction.php', - 'Psalm\\Issue\\DeprecatedInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedInterface.php', - 'Psalm\\Issue\\DeprecatedMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedMethod.php', - 'Psalm\\Issue\\DeprecatedProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedProperty.php', - 'Psalm\\Issue\\DeprecatedTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DeprecatedTrait.php', - 'Psalm\\Issue\\DocblockTypeContradiction' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DocblockTypeContradiction.php', - 'Psalm\\Issue\\DuplicateArrayKey' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php', - 'Psalm\\Issue\\DuplicateClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateClass.php', - 'Psalm\\Issue\\DuplicateConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateConstant.php', - 'Psalm\\Issue\\DuplicateEnumCase' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCase.php', - 'Psalm\\Issue\\DuplicateEnumCaseValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCaseValue.php', - 'Psalm\\Issue\\DuplicateFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateFunction.php', - 'Psalm\\Issue\\DuplicateMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateMethod.php', - 'Psalm\\Issue\\DuplicateParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/DuplicateParam.php', - 'Psalm\\Issue\\EmptyArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/EmptyArrayAccess.php', - 'Psalm\\Issue\\ExtensionRequirementViolation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ExtensionRequirementViolation.php', - 'Psalm\\Issue\\FalsableReturnStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/FalsableReturnStatement.php', - 'Psalm\\Issue\\FalseOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/FalseOperand.php', - 'Psalm\\Issue\\ForbiddenCode' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ForbiddenCode.php', - 'Psalm\\Issue\\ForbiddenEcho' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ForbiddenEcho.php', - 'Psalm\\Issue\\FunctionIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/FunctionIssue.php', - 'Psalm\\Issue\\IfThisIsMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php', - 'Psalm\\Issue\\ImplementationRequirementViolation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImplementationRequirementViolation.php', - 'Psalm\\Issue\\ImplementedParamTypeMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImplementedParamTypeMismatch.php', - 'Psalm\\Issue\\ImplementedReturnTypeMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImplementedReturnTypeMismatch.php', - 'Psalm\\Issue\\ImplicitToStringCast' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImplicitToStringCast.php', - 'Psalm\\Issue\\ImpureByReferenceAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureByReferenceAssignment.php', - 'Psalm\\Issue\\ImpureFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureFunctionCall.php', - 'Psalm\\Issue\\ImpureMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureMethodCall.php', - 'Psalm\\Issue\\ImpurePropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpurePropertyAssignment.php', - 'Psalm\\Issue\\ImpurePropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpurePropertyFetch.php', - 'Psalm\\Issue\\ImpureStaticProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureStaticProperty.php', - 'Psalm\\Issue\\ImpureStaticVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureStaticVariable.php', - 'Psalm\\Issue\\ImpureVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ImpureVariable.php', - 'Psalm\\Issue\\InaccessibleClassConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InaccessibleClassConstant.php', - 'Psalm\\Issue\\InaccessibleMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InaccessibleMethod.php', - 'Psalm\\Issue\\InaccessibleProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InaccessibleProperty.php', - 'Psalm\\Issue\\InterfaceInstantiation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InterfaceInstantiation.php', - 'Psalm\\Issue\\InternalClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InternalClass.php', - 'Psalm\\Issue\\InternalMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InternalMethod.php', - 'Psalm\\Issue\\InternalProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InternalProperty.php', - 'Psalm\\Issue\\InvalidArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidArgument.php', - 'Psalm\\Issue\\InvalidArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayAccess.php', - 'Psalm\\Issue\\InvalidArrayAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayAssignment.php', - 'Psalm\\Issue\\InvalidArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayOffset.php', - 'Psalm\\Issue\\InvalidAttribute' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidAttribute.php', - 'Psalm\\Issue\\InvalidCast' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidCast.php', - 'Psalm\\Issue\\InvalidCatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidCatch.php', - 'Psalm\\Issue\\InvalidClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidClass.php', - 'Psalm\\Issue\\InvalidClone' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidClone.php', - 'Psalm\\Issue\\InvalidDocblock' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidDocblock.php', - 'Psalm\\Issue\\InvalidDocblockParamName' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidDocblockParamName.php', - 'Psalm\\Issue\\InvalidEnumBackingType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidEnumBackingType.php', - 'Psalm\\Issue\\InvalidEnumCaseValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidEnumCaseValue.php', - 'Psalm\\Issue\\InvalidExtendClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidExtendClass.php', - 'Psalm\\Issue\\InvalidFalsableReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidFalsableReturnType.php', - 'Psalm\\Issue\\InvalidFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidFunctionCall.php', - 'Psalm\\Issue\\InvalidGlobal' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidGlobal.php', - 'Psalm\\Issue\\InvalidIterator' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidIterator.php', - 'Psalm\\Issue\\InvalidLiteralArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidLiteralArgument.php', - 'Psalm\\Issue\\InvalidMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidMethodCall.php', - 'Psalm\\Issue\\InvalidNamedArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidNamedArgument.php', - 'Psalm\\Issue\\InvalidNullableReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidNullableReturnType.php', - 'Psalm\\Issue\\InvalidOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidOperand.php', - 'Psalm\\Issue\\InvalidParamDefault' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidParamDefault.php', - 'Psalm\\Issue\\InvalidParent' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidParent.php', - 'Psalm\\Issue\\InvalidPassByReference' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidPassByReference.php', - 'Psalm\\Issue\\InvalidPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignment.php', - 'Psalm\\Issue\\InvalidPropertyAssignmentValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignmentValue.php', - 'Psalm\\Issue\\InvalidPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyFetch.php', - 'Psalm\\Issue\\InvalidReturnStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidReturnStatement.php', - 'Psalm\\Issue\\InvalidReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidReturnType.php', - 'Psalm\\Issue\\InvalidScalarArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidScalarArgument.php', - 'Psalm\\Issue\\InvalidScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidScope.php', - 'Psalm\\Issue\\InvalidStaticInvocation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidStaticInvocation.php', - 'Psalm\\Issue\\InvalidStringClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidStringClass.php', - 'Psalm\\Issue\\InvalidTemplateParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidTemplateParam.php', - 'Psalm\\Issue\\InvalidThrow' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidThrow.php', - 'Psalm\\Issue\\InvalidToString' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidToString.php', - 'Psalm\\Issue\\InvalidTraversableImplementation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidTraversableImplementation.php', - 'Psalm\\Issue\\InvalidTypeImport' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/InvalidTypeImport.php', - 'Psalm\\Issue\\LessSpecificImplementedReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/LessSpecificImplementedReturnType.php', - 'Psalm\\Issue\\LessSpecificReturnStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnStatement.php', - 'Psalm\\Issue\\LessSpecificReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnType.php', - 'Psalm\\Issue\\LoopInvalidation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/LoopInvalidation.php', - 'Psalm\\Issue\\MethodIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MethodIssue.php', - 'Psalm\\Issue\\MethodSignatureMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php', - 'Psalm\\Issue\\MethodSignatureMustOmitReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php', - 'Psalm\\Issue\\MethodSignatureMustProvideReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php', - 'Psalm\\Issue\\MismatchingDocblockParamType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockParamType.php', - 'Psalm\\Issue\\MismatchingDocblockPropertyType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockPropertyType.php', - 'Psalm\\Issue\\MismatchingDocblockReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockReturnType.php', - 'Psalm\\Issue\\MissingClosureParamType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingClosureParamType.php', - 'Psalm\\Issue\\MissingClosureReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingClosureReturnType.php', - 'Psalm\\Issue\\MissingConstructor' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingConstructor.php', - 'Psalm\\Issue\\MissingDependency' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingDependency.php', - 'Psalm\\Issue\\MissingDocblockType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingDocblockType.php', - 'Psalm\\Issue\\MissingFile' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingFile.php', - 'Psalm\\Issue\\MissingImmutableAnnotation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingImmutableAnnotation.php', - 'Psalm\\Issue\\MissingParamType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingParamType.php', - 'Psalm\\Issue\\MissingPropertyType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingPropertyType.php', - 'Psalm\\Issue\\MissingReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingReturnType.php', - 'Psalm\\Issue\\MissingTemplateParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingTemplateParam.php', - 'Psalm\\Issue\\MissingThrowsDocblock' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MissingThrowsDocblock.php', - 'Psalm\\Issue\\MixedArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArgument.php', - 'Psalm\\Issue\\MixedArgumentTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php', - 'Psalm\\Issue\\MixedArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php', - 'Psalm\\Issue\\MixedArrayAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArrayAssignment.php', - 'Psalm\\Issue\\MixedArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArrayOffset.php', - 'Psalm\\Issue\\MixedArrayTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedArrayTypeCoercion.php', - 'Psalm\\Issue\\MixedAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedAssignment.php', - 'Psalm\\Issue\\MixedClone' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedClone.php', - 'Psalm\\Issue\\MixedFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedFunctionCall.php', - 'Psalm\\Issue\\MixedInferredReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedInferredReturnType.php', - 'Psalm\\Issue\\MixedIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedIssue.php', - 'Psalm\\Issue\\MixedIssueTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedIssueTrait.php', - 'Psalm\\Issue\\MixedMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php', - 'Psalm\\Issue\\MixedOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedOperand.php', - 'Psalm\\Issue\\MixedPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyAssignment.php', - 'Psalm\\Issue\\MixedPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyFetch.php', - 'Psalm\\Issue\\MixedPropertyTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyTypeCoercion.php', - 'Psalm\\Issue\\MixedReturnStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php', - 'Psalm\\Issue\\MixedReturnTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedReturnTypeCoercion.php', - 'Psalm\\Issue\\MixedStringOffsetAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MixedStringOffsetAssignment.php', - 'Psalm\\Issue\\MoreSpecificImplementedParamType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MoreSpecificImplementedParamType.php', - 'Psalm\\Issue\\MoreSpecificReturnType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MoreSpecificReturnType.php', - 'Psalm\\Issue\\MutableDependency' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/MutableDependency.php', - 'Psalm\\Issue\\NamedArgumentNotAllowed' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NamedArgumentNotAllowed.php', - 'Psalm\\Issue\\NoEnumProperties' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NoEnumProperties.php', - 'Psalm\\Issue\\NoInterfaceProperties' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NoInterfaceProperties.php', - 'Psalm\\Issue\\NoValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NoValue.php', - 'Psalm\\Issue\\NonInvariantDocblockPropertyType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NonInvariantDocblockPropertyType.php', - 'Psalm\\Issue\\NonInvariantPropertyType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NonInvariantPropertyType.php', - 'Psalm\\Issue\\NonStaticSelfCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NonStaticSelfCall.php', - 'Psalm\\Issue\\NullArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullArgument.php', - 'Psalm\\Issue\\NullArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullArrayAccess.php', - 'Psalm\\Issue\\NullArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullArrayOffset.php', - 'Psalm\\Issue\\NullFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullFunctionCall.php', - 'Psalm\\Issue\\NullIterator' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullIterator.php', - 'Psalm\\Issue\\NullOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullOperand.php', - 'Psalm\\Issue\\NullPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullPropertyAssignment.php', - 'Psalm\\Issue\\NullPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullPropertyFetch.php', - 'Psalm\\Issue\\NullReference' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullReference.php', - 'Psalm\\Issue\\NullableReturnStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/NullableReturnStatement.php', - 'Psalm\\Issue\\OverriddenMethodAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/OverriddenMethodAccess.php', - 'Psalm\\Issue\\OverriddenPropertyAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/OverriddenPropertyAccess.php', - 'Psalm\\Issue\\ParadoxicalCondition' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ParadoxicalCondition.php', - 'Psalm\\Issue\\ParamNameMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ParamNameMismatch.php', - 'Psalm\\Issue\\ParentNotFound' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ParentNotFound.php', - 'Psalm\\Issue\\ParseError' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ParseError.php', - 'Psalm\\Issue\\PluginIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PluginIssue.php', - 'Psalm\\Issue\\PossibleRawObjectIteration' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossibleRawObjectIteration.php', - 'Psalm\\Issue\\PossiblyFalseArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseArgument.php', - 'Psalm\\Issue\\PossiblyFalseIterator' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseIterator.php', - 'Psalm\\Issue\\PossiblyFalseOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseOperand.php', - 'Psalm\\Issue\\PossiblyFalsePropertyAssignmentValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php', - 'Psalm\\Issue\\PossiblyFalseReference' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseReference.php', - 'Psalm\\Issue\\PossiblyInvalidArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArgument.php', - 'Psalm\\Issue\\PossiblyInvalidArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAccess.php', - 'Psalm\\Issue\\PossiblyInvalidArrayAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php', - 'Psalm\\Issue\\PossiblyInvalidArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayOffset.php', - 'Psalm\\Issue\\PossiblyInvalidCast' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidCast.php', - 'Psalm\\Issue\\PossiblyInvalidClone' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidClone.php', - 'Psalm\\Issue\\PossiblyInvalidDocblockTag' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidDocblockTag.php', - 'Psalm\\Issue\\PossiblyInvalidFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidFunctionCall.php', - 'Psalm\\Issue\\PossiblyInvalidIterator' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidIterator.php', - 'Psalm\\Issue\\PossiblyInvalidMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidMethodCall.php', - 'Psalm\\Issue\\PossiblyInvalidOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidOperand.php', - 'Psalm\\Issue\\PossiblyInvalidPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php', - 'Psalm\\Issue\\PossiblyInvalidPropertyAssignmentValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php', - 'Psalm\\Issue\\PossiblyInvalidPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php', - 'Psalm\\Issue\\PossiblyNullArgument' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArgument.php', - 'Psalm\\Issue\\PossiblyNullArrayAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAccess.php', - 'Psalm\\Issue\\PossiblyNullArrayAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAssignment.php', - 'Psalm\\Issue\\PossiblyNullArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayOffset.php', - 'Psalm\\Issue\\PossiblyNullFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullFunctionCall.php', - 'Psalm\\Issue\\PossiblyNullIterator' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullIterator.php', - 'Psalm\\Issue\\PossiblyNullOperand' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullOperand.php', - 'Psalm\\Issue\\PossiblyNullPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignment.php', - 'Psalm\\Issue\\PossiblyNullPropertyAssignmentValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php', - 'Psalm\\Issue\\PossiblyNullPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyFetch.php', - 'Psalm\\Issue\\PossiblyNullReference' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullReference.php', - 'Psalm\\Issue\\PossiblyUndefinedArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php', - 'Psalm\\Issue\\PossiblyUndefinedGlobalVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php', - 'Psalm\\Issue\\PossiblyUndefinedIntArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php', - 'Psalm\\Issue\\PossiblyUndefinedMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedMethod.php', - 'Psalm\\Issue\\PossiblyUndefinedStringArrayOffset' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php', - 'Psalm\\Issue\\PossiblyUndefinedVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedVariable.php', - 'Psalm\\Issue\\PossiblyUnusedMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedMethod.php', - 'Psalm\\Issue\\PossiblyUnusedParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedParam.php', - 'Psalm\\Issue\\PossiblyUnusedProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedProperty.php', - 'Psalm\\Issue\\PossiblyUnusedReturnValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedReturnValue.php', - 'Psalm\\Issue\\PropertyIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PropertyIssue.php', - 'Psalm\\Issue\\PropertyNotSetInConstructor' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php', - 'Psalm\\Issue\\PropertyTypeCoercion' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php', - 'Psalm\\Issue\\PsalmInternalError' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/PsalmInternalError.php', - 'Psalm\\Issue\\RawObjectIteration' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RawObjectIteration.php', - 'Psalm\\Issue\\RedundantCast' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantCast.php', - 'Psalm\\Issue\\RedundantCastGivenDocblockType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantCastGivenDocblockType.php', - 'Psalm\\Issue\\RedundantCondition' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantCondition.php', - 'Psalm\\Issue\\RedundantConditionGivenDocblockType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php', - 'Psalm\\Issue\\RedundantFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php', - 'Psalm\\Issue\\RedundantFunctionCallGivenDocblockType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php', - 'Psalm\\Issue\\RedundantIdentityWithTrue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantIdentityWithTrue.php', - 'Psalm\\Issue\\RedundantPropertyInitializationCheck' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/RedundantPropertyInitializationCheck.php', - 'Psalm\\Issue\\ReferenceConstraintViolation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ReferenceConstraintViolation.php', - 'Psalm\\Issue\\ReservedWord' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/ReservedWord.php', - 'Psalm\\Issue\\StringIncrement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/StringIncrement.php', - 'Psalm\\Issue\\TaintedCallable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedCallable.php', - 'Psalm\\Issue\\TaintedCookie' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedCookie.php', - 'Psalm\\Issue\\TaintedCustom' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedCustom.php', - 'Psalm\\Issue\\TaintedEval' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedEval.php', - 'Psalm\\Issue\\TaintedFile' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedFile.php', - 'Psalm\\Issue\\TaintedHeader' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedHeader.php', - 'Psalm\\Issue\\TaintedHtml' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedHtml.php', - 'Psalm\\Issue\\TaintedInclude' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedInclude.php', - 'Psalm\\Issue\\TaintedInput' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedInput.php', - 'Psalm\\Issue\\TaintedLdap' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php', - 'Psalm\\Issue\\TaintedSSRF' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedSSRF.php', - 'Psalm\\Issue\\TaintedShell' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedShell.php', - 'Psalm\\Issue\\TaintedSql' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedSql.php', - 'Psalm\\Issue\\TaintedSystemSecret' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedSystemSecret.php', - 'Psalm\\Issue\\TaintedTextWithQuotes' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedTextWithQuotes.php', - 'Psalm\\Issue\\TaintedUnserialize' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedUnserialize.php', - 'Psalm\\Issue\\TaintedUserSecret' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TaintedUserSecret.php', - 'Psalm\\Issue\\TooFewArguments' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TooFewArguments.php', - 'Psalm\\Issue\\TooManyArguments' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TooManyArguments.php', - 'Psalm\\Issue\\TooManyTemplateParams' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TooManyTemplateParams.php', - 'Psalm\\Issue\\Trace' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/Trace.php', - 'Psalm\\Issue\\TraitMethodSignatureMismatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TraitMethodSignatureMismatch.php', - 'Psalm\\Issue\\TypeDoesNotContainNull' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainNull.php', - 'Psalm\\Issue\\TypeDoesNotContainType' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php', - 'Psalm\\Issue\\UncaughtThrowInGlobalScope' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php', - 'Psalm\\Issue\\UndefinedAttributeClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedAttributeClass.php', - 'Psalm\\Issue\\UndefinedClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedClass.php', - 'Psalm\\Issue\\UndefinedConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedConstant.php', - 'Psalm\\Issue\\UndefinedDocblockClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedDocblockClass.php', - 'Psalm\\Issue\\UndefinedFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedFunction.php', - 'Psalm\\Issue\\UndefinedGlobalVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedGlobalVariable.php', - 'Psalm\\Issue\\UndefinedInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedInterface.php', - 'Psalm\\Issue\\UndefinedInterfaceMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedInterfaceMethod.php', - 'Psalm\\Issue\\UndefinedMagicMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicMethod.php', - 'Psalm\\Issue\\UndefinedMagicPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php', - 'Psalm\\Issue\\UndefinedMagicPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyFetch.php', - 'Psalm\\Issue\\UndefinedMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedMethod.php', - 'Psalm\\Issue\\UndefinedPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyAssignment.php', - 'Psalm\\Issue\\UndefinedPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyFetch.php', - 'Psalm\\Issue\\UndefinedThisPropertyAssignment' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyAssignment.php', - 'Psalm\\Issue\\UndefinedThisPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyFetch.php', - 'Psalm\\Issue\\UndefinedTrace' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedTrace.php', - 'Psalm\\Issue\\UndefinedTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedTrait.php', - 'Psalm\\Issue\\UndefinedVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UndefinedVariable.php', - 'Psalm\\Issue\\UnevaluatedCode' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnevaluatedCode.php', - 'Psalm\\Issue\\UnhandledMatchCondition' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnhandledMatchCondition.php', - 'Psalm\\Issue\\UnimplementedAbstractMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnimplementedAbstractMethod.php', - 'Psalm\\Issue\\UnimplementedInterfaceMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnimplementedInterfaceMethod.php', - 'Psalm\\Issue\\UninitializedProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UninitializedProperty.php', - 'Psalm\\Issue\\UnnecessaryVarAnnotation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnnecessaryVarAnnotation.php', - 'Psalm\\Issue\\UnrecognizedExpression' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnrecognizedExpression.php', - 'Psalm\\Issue\\UnrecognizedStatement' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnrecognizedStatement.php', - 'Psalm\\Issue\\UnresolvableInclude' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnresolvableInclude.php', - 'Psalm\\Issue\\UnsafeGenericInstantiation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnsafeGenericInstantiation.php', - 'Psalm\\Issue\\UnsafeInstantiation' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnsafeInstantiation.php', - 'Psalm\\Issue\\UnusedClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedClass.php', - 'Psalm\\Issue\\UnusedClosureParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedClosureParam.php', - 'Psalm\\Issue\\UnusedConstructor' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedConstructor.php', - 'Psalm\\Issue\\UnusedForeachValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedForeachValue.php', - 'Psalm\\Issue\\UnusedFunctionCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedFunctionCall.php', - 'Psalm\\Issue\\UnusedMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedMethod.php', - 'Psalm\\Issue\\UnusedMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedMethodCall.php', - 'Psalm\\Issue\\UnusedParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedParam.php', - 'Psalm\\Issue\\UnusedProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedProperty.php', - 'Psalm\\Issue\\UnusedPsalmSuppress' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedPsalmSuppress.php', - 'Psalm\\Issue\\UnusedReturnValue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedReturnValue.php', - 'Psalm\\Issue\\UnusedVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/UnusedVariable.php', - 'Psalm\\Issue\\VariableIssue' => $vendorDir . '/vimeo/psalm/src/Psalm/Issue/VariableIssue.php', - 'Psalm\\NodeTypeProvider' => $vendorDir . '/vimeo/psalm/src/Psalm/NodeTypeProvider.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseAnd' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseOr' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseXor' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualCoalesce' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualConcat' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualDiv' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualMinus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualMod' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMod.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualMul' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMul.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualPlus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualPow' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPow.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftLeft' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftRight' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseAnd' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseOr' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseXor' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanAnd' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanOr' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualCoalesce' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualConcat' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualDiv' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualEqual' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreater' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreaterOrEqual' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualIdentical' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalAnd' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalOr' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalXor' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMinus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMod' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMul' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotEqual' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotIdentical' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPlus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPow' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftLeft' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftRight' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmaller' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmallerOrEqual' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSpaceship' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualArray.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualBool' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualBool.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualDouble' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualDouble.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualInt' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualInt.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualObject' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualObject.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualString' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualString.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualUnset' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualUnset.php', - 'Psalm\\Node\\Expr\\VirtualArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArray.php', - 'Psalm\\Node\\Expr\\VirtualArrayDimFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayDimFetch.php', - 'Psalm\\Node\\Expr\\VirtualArrayItem' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayItem.php', - 'Psalm\\Node\\Expr\\VirtualArrowFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrowFunction.php', - 'Psalm\\Node\\Expr\\VirtualAssign' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssign.php', - 'Psalm\\Node\\Expr\\VirtualAssignRef' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssignRef.php', - 'Psalm\\Node\\Expr\\VirtualBitwiseNot' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualBitwiseNot.php', - 'Psalm\\Node\\Expr\\VirtualBooleanNot' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualBooleanNot.php', - 'Psalm\\Node\\Expr\\VirtualClassConstFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClassConstFetch.php', - 'Psalm\\Node\\Expr\\VirtualClone' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClone.php', - 'Psalm\\Node\\Expr\\VirtualClosure' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosure.php', - 'Psalm\\Node\\Expr\\VirtualClosureUse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosureUse.php', - 'Psalm\\Node\\Expr\\VirtualConstFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualConstFetch.php', - 'Psalm\\Node\\Expr\\VirtualEmpty' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualEmpty.php', - 'Psalm\\Node\\Expr\\VirtualError' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualError.php', - 'Psalm\\Node\\Expr\\VirtualErrorSuppress' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualErrorSuppress.php', - 'Psalm\\Node\\Expr\\VirtualEval' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualEval.php', - 'Psalm\\Node\\Expr\\VirtualExit' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualExit.php', - 'Psalm\\Node\\Expr\\VirtualFuncCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualFuncCall.php', - 'Psalm\\Node\\Expr\\VirtualInclude' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualInclude.php', - 'Psalm\\Node\\Expr\\VirtualInstanceof' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualInstanceof.php', - 'Psalm\\Node\\Expr\\VirtualIsset' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualIsset.php', - 'Psalm\\Node\\Expr\\VirtualList' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualList.php', - 'Psalm\\Node\\Expr\\VirtualMatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualMatch.php', - 'Psalm\\Node\\Expr\\VirtualMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualMethodCall.php', - 'Psalm\\Node\\Expr\\VirtualNew' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNew.php', - 'Psalm\\Node\\Expr\\VirtualNullsafeMethodCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php', - 'Psalm\\Node\\Expr\\VirtualNullsafePropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php', - 'Psalm\\Node\\Expr\\VirtualPostDec' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostDec.php', - 'Psalm\\Node\\Expr\\VirtualPostInc' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostInc.php', - 'Psalm\\Node\\Expr\\VirtualPreDec' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreDec.php', - 'Psalm\\Node\\Expr\\VirtualPreInc' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreInc.php', - 'Psalm\\Node\\Expr\\VirtualPrint' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPrint.php', - 'Psalm\\Node\\Expr\\VirtualPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPropertyFetch.php', - 'Psalm\\Node\\Expr\\VirtualShellExec' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualShellExec.php', - 'Psalm\\Node\\Expr\\VirtualStaticCall' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticCall.php', - 'Psalm\\Node\\Expr\\VirtualStaticPropertyFetch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php', - 'Psalm\\Node\\Expr\\VirtualTernary' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualTernary.php', - 'Psalm\\Node\\Expr\\VirtualThrow' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualThrow.php', - 'Psalm\\Node\\Expr\\VirtualUnaryMinus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryMinus.php', - 'Psalm\\Node\\Expr\\VirtualUnaryPlus' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryPlus.php', - 'Psalm\\Node\\Expr\\VirtualVariable' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualVariable.php', - 'Psalm\\Node\\Expr\\VirtualYield' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualYield.php', - 'Psalm\\Node\\Expr\\VirtualYieldFrom' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualYieldFrom.php', - 'Psalm\\Node\\Name\\VirtualFullyQualified' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Name/VirtualFullyQualified.php', - 'Psalm\\Node\\Name\\VirtualRelative' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Name/VirtualRelative.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualDir' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFile' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualLine' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualNamespace' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php', - 'Psalm\\Node\\Scalar\\VirtualDNumber' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualDNumber.php', - 'Psalm\\Node\\Scalar\\VirtualEncapsed' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsed.php', - 'Psalm\\Node\\Scalar\\VirtualEncapsedStringPart' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php', - 'Psalm\\Node\\Scalar\\VirtualLNumber' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualLNumber.php', - 'Psalm\\Node\\Scalar\\VirtualString' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualString.php', - 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php', - 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualPrecedence' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php', - 'Psalm\\Node\\Stmt\\VirtualBreak' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualBreak.php', - 'Psalm\\Node\\Stmt\\VirtualCase' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCase.php', - 'Psalm\\Node\\Stmt\\VirtualCatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCatch.php', - 'Psalm\\Node\\Stmt\\VirtualClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClass.php', - 'Psalm\\Node\\Stmt\\VirtualClassConst' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassConst.php', - 'Psalm\\Node\\Stmt\\VirtualClassMethod' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassMethod.php', - 'Psalm\\Node\\Stmt\\VirtualConst' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualConst.php', - 'Psalm\\Node\\Stmt\\VirtualContinue' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualContinue.php', - 'Psalm\\Node\\Stmt\\VirtualDeclare' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclare.php', - 'Psalm\\Node\\Stmt\\VirtualDeclareDeclare' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php', - 'Psalm\\Node\\Stmt\\VirtualDo' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDo.php', - 'Psalm\\Node\\Stmt\\VirtualEcho' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualEcho.php', - 'Psalm\\Node\\Stmt\\VirtualElse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElse.php', - 'Psalm\\Node\\Stmt\\VirtualElseIf' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElseIf.php', - 'Psalm\\Node\\Stmt\\VirtualExpression' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualExpression.php', - 'Psalm\\Node\\Stmt\\VirtualFinally' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFinally.php', - 'Psalm\\Node\\Stmt\\VirtualFor' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFor.php', - 'Psalm\\Node\\Stmt\\VirtualForeach' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualForeach.php', - 'Psalm\\Node\\Stmt\\VirtualFunction' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFunction.php', - 'Psalm\\Node\\Stmt\\VirtualGlobal' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGlobal.php', - 'Psalm\\Node\\Stmt\\VirtualGoto' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGoto.php', - 'Psalm\\Node\\Stmt\\VirtualGroupUse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGroupUse.php', - 'Psalm\\Node\\Stmt\\VirtualHaltCompiler' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualHaltCompiler.php', - 'Psalm\\Node\\Stmt\\VirtualIf' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualIf.php', - 'Psalm\\Node\\Stmt\\VirtualInlineHTML' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInlineHTML.php', - 'Psalm\\Node\\Stmt\\VirtualInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInterface.php', - 'Psalm\\Node\\Stmt\\VirtualLabel' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualLabel.php', - 'Psalm\\Node\\Stmt\\VirtualNamespace' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNamespace.php', - 'Psalm\\Node\\Stmt\\VirtualNop' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNop.php', - 'Psalm\\Node\\Stmt\\VirtualProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualProperty.php', - 'Psalm\\Node\\Stmt\\VirtualPropertyProperty' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualPropertyProperty.php', - 'Psalm\\Node\\Stmt\\VirtualReturn' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualReturn.php', - 'Psalm\\Node\\Stmt\\VirtualStatic' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStatic.php', - 'Psalm\\Node\\Stmt\\VirtualStaticVar' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStaticVar.php', - 'Psalm\\Node\\Stmt\\VirtualSwitch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualSwitch.php', - 'Psalm\\Node\\Stmt\\VirtualThrow' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualThrow.php', - 'Psalm\\Node\\Stmt\\VirtualTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTrait.php', - 'Psalm\\Node\\Stmt\\VirtualTraitUse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTraitUse.php', - 'Psalm\\Node\\Stmt\\VirtualTryCatch' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTryCatch.php', - 'Psalm\\Node\\Stmt\\VirtualUnset' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUnset.php', - 'Psalm\\Node\\Stmt\\VirtualUse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUse.php', - 'Psalm\\Node\\Stmt\\VirtualUseUse' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUseUse.php', - 'Psalm\\Node\\Stmt\\VirtualWhile' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualWhile.php', - 'Psalm\\Node\\VirtualArg' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualArg.php', - 'Psalm\\Node\\VirtualAttribute' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualAttribute.php', - 'Psalm\\Node\\VirtualAttributeGroup' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualAttributeGroup.php', - 'Psalm\\Node\\VirtualConst' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualConst.php', - 'Psalm\\Node\\VirtualIdentifier' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualIdentifier.php', - 'Psalm\\Node\\VirtualMatchArm' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualMatchArm.php', - 'Psalm\\Node\\VirtualName' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualName.php', - 'Psalm\\Node\\VirtualNode' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualNode.php', - 'Psalm\\Node\\VirtualNullableType' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualNullableType.php', - 'Psalm\\Node\\VirtualParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualParam.php', - 'Psalm\\Node\\VirtualUnionType' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualUnionType.php', - 'Psalm\\Node\\VirtualVarLikeIdentifier' => $vendorDir . '/vimeo/psalm/src/Psalm/Node/VirtualVarLikeIdentifier.php', - 'Psalm\\PluginRegistrationSocket' => $vendorDir . '/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php', - 'Psalm\\Plugin\\EventHandler\\AddTaintsInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterClassLikeAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterClassLikeExistenceCheckInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterClassLikeVisitInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterCodebasePopulatedInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterEveryFunctionCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterExpressionAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterFileAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterFunctionCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterFunctionLikeAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterMethodCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterStatementAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\BeforeFileAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AddRemoveTaintsEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeExistenceCheckEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeVisitEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterCodebasePopulatedEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterEveryFunctionCallAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterExpressionAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterFileAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionCallAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionLikeAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterMethodCallAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterStatementAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\BeforeFileAnalysisEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\FunctionExistenceProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\FunctionParamsProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\FunctionReturnTypeProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\MethodExistenceProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\MethodParamsProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\MethodReturnTypeProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\MethodVisibilityProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\PropertyExistenceProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\PropertyTypeProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\PropertyVisibilityProviderEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\StringInterpreterEvent' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php', - 'Psalm\\Plugin\\EventHandler\\FunctionExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\FunctionParamsProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\FunctionReturnTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\MethodExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\MethodParamsProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\MethodReturnTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\MethodVisibilityProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\PropertyExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\PropertyTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\PropertyVisibilityProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\RemoveTaintsInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php', - 'Psalm\\Plugin\\EventHandler\\StringInterpreterInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php', - 'Psalm\\Plugin\\Hook\\AfterAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterClassLikeAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterClassLikeExistenceCheckInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeExistenceCheckInterface.php', - 'Psalm\\Plugin\\Hook\\AfterClassLikeVisitInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeVisitInterface.php', - 'Psalm\\Plugin\\Hook\\AfterCodebasePopulatedInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterCodebasePopulatedInterface.php', - 'Psalm\\Plugin\\Hook\\AfterEveryFunctionCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterEveryFunctionCallAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterExpressionAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterExpressionAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterFileAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFileAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterFunctionCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionCallAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterFunctionLikeAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionLikeAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterMethodCallAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterMethodCallAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterStatementAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterStatementAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\BeforeFileAnalysisInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/BeforeFileAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\FunctionExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionExistenceProviderInterface.php', - 'Psalm\\Plugin\\Hook\\FunctionParamsProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php', - 'Psalm\\Plugin\\Hook\\FunctionReturnTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php', - 'Psalm\\Plugin\\Hook\\MethodExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php', - 'Psalm\\Plugin\\Hook\\MethodParamsProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php', - 'Psalm\\Plugin\\Hook\\MethodReturnTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php', - 'Psalm\\Plugin\\Hook\\MethodVisibilityProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php', - 'Psalm\\Plugin\\Hook\\PropertyExistenceProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php', - 'Psalm\\Plugin\\Hook\\PropertyTypeProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php', - 'Psalm\\Plugin\\Hook\\PropertyVisibilityProviderInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php', - 'Psalm\\Plugin\\Hook\\StringInterpreterInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php', - 'Psalm\\Plugin\\PluginEntryPointInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/PluginEntryPointInterface.php', - 'Psalm\\Plugin\\RegistrationInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/RegistrationInterface.php', - 'Psalm\\Plugin\\Shepherd' => $vendorDir . '/vimeo/psalm/src/Psalm/Plugin/Shepherd.php', - 'Psalm\\Progress\\DebugProgress' => $vendorDir . '/vimeo/psalm/src/Psalm/Progress/DebugProgress.php', - 'Psalm\\Progress\\DefaultProgress' => $vendorDir . '/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php', - 'Psalm\\Progress\\LongProgress' => $vendorDir . '/vimeo/psalm/src/Psalm/Progress/LongProgress.php', - 'Psalm\\Progress\\Progress' => $vendorDir . '/vimeo/psalm/src/Psalm/Progress/Progress.php', - 'Psalm\\Progress\\VoidProgress' => $vendorDir . '/vimeo/psalm/src/Psalm/Progress/VoidProgress.php', - 'Psalm\\Report' => $vendorDir . '/vimeo/psalm/src/Psalm/Report.php', - 'Psalm\\Report\\CheckstyleReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php', - 'Psalm\\Report\\CodeClimateReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php', - 'Psalm\\Report\\CompactReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/CompactReport.php', - 'Psalm\\Report\\ConsoleReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/ConsoleReport.php', - 'Psalm\\Report\\CountReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/CountReport.php', - 'Psalm\\Report\\EmacsReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/EmacsReport.php', - 'Psalm\\Report\\GithubActionsReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php', - 'Psalm\\Report\\JsonReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/JsonReport.php', - 'Psalm\\Report\\JsonSummaryReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php', - 'Psalm\\Report\\JunitReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/JunitReport.php', - 'Psalm\\Report\\PhpStormReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/PhpStormReport.php', - 'Psalm\\Report\\PylintReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/PylintReport.php', - 'Psalm\\Report\\ReportOptions' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/ReportOptions.php', - 'Psalm\\Report\\SarifReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/SarifReport.php', - 'Psalm\\Report\\SonarqubeReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php', - 'Psalm\\Report\\TextReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/TextReport.php', - 'Psalm\\Report\\XmlReport' => $vendorDir . '/vimeo/psalm/src/Psalm/Report/XmlReport.php', - 'Psalm\\SourceControl\\Git\\CommitInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php', - 'Psalm\\SourceControl\\Git\\GitInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php', - 'Psalm\\SourceControl\\Git\\RemoteInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php', - 'Psalm\\SourceControl\\SourceControlInfo' => $vendorDir . '/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php', - 'Psalm\\StatementsSource' => $vendorDir . '/vimeo/psalm/src/Psalm/StatementsSource.php', - 'Psalm\\Storage\\Assertion' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/Assertion.php', - 'Psalm\\Storage\\AttributeArg' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/AttributeArg.php', - 'Psalm\\Storage\\AttributeStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php', - 'Psalm\\Storage\\ClassConstantStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php', - 'Psalm\\Storage\\ClassLikeStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php', - 'Psalm\\Storage\\CustomMetadataTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php', - 'Psalm\\Storage\\EnumCaseStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php', - 'Psalm\\Storage\\FileStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/FileStorage.php', - 'Psalm\\Storage\\FunctionLikeParameter' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php', - 'Psalm\\Storage\\FunctionLikeStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php', - 'Psalm\\Storage\\FunctionStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php', - 'Psalm\\Storage\\HasAttributesInterface' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php', - 'Psalm\\Storage\\MethodStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/MethodStorage.php', - 'Psalm\\Storage\\PropertyStorage' => $vendorDir . '/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php', - 'Psalm\\Type' => $vendorDir . '/vimeo/psalm/src/Psalm/Type.php', - 'Psalm\\Type\\Atomic' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic.php', - 'Psalm\\Type\\Atomic\\CallableTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php', - 'Psalm\\Type\\Atomic\\DependentType' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php', - 'Psalm\\Type\\Atomic\\GenericTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/GenericTrait.php', - 'Psalm\\Type\\Atomic\\HasIntersectionTrait' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php', - 'Psalm\\Type\\Atomic\\Scalar' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php', - 'Psalm\\Type\\Atomic\\TAnonymousClassInstance' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TAnonymousClassInstance.php', - 'Psalm\\Type\\Atomic\\TArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php', - 'Psalm\\Type\\Atomic\\TArrayKey' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php', - 'Psalm\\Type\\Atomic\\TAssertionFalsy' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php', - 'Psalm\\Type\\Atomic\\TBool' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php', - 'Psalm\\Type\\Atomic\\TCallable' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php', - 'Psalm\\Type\\Atomic\\TCallableArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php', - 'Psalm\\Type\\Atomic\\TCallableKeyedArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableKeyedArray.php', - 'Psalm\\Type\\Atomic\\TCallableList' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableList.php', - 'Psalm\\Type\\Atomic\\TCallableObject' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableObject.php', - 'Psalm\\Type\\Atomic\\TCallableString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php', - 'Psalm\\Type\\Atomic\\TClassConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php', - 'Psalm\\Type\\Atomic\\TClassString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php', - 'Psalm\\Type\\Atomic\\TClassStringMap' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php', - 'Psalm\\Type\\Atomic\\TClosedResource' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php', - 'Psalm\\Type\\Atomic\\TClosure' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php', - 'Psalm\\Type\\Atomic\\TConditional' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php', - 'Psalm\\Type\\Atomic\\TDependentGetClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php', - 'Psalm\\Type\\Atomic\\TDependentGetDebugType' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php', - 'Psalm\\Type\\Atomic\\TDependentGetType' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php', - 'Psalm\\Type\\Atomic\\TDependentListKey' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php', - 'Psalm\\Type\\Atomic\\TEmpty' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php', - 'Psalm\\Type\\Atomic\\TEmptyMixed' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php', - 'Psalm\\Type\\Atomic\\TEmptyNumeric' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyNumeric.php', - 'Psalm\\Type\\Atomic\\TEmptyScalar' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyScalar.php', - 'Psalm\\Type\\Atomic\\TEnumCase' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TEnumCase.php', - 'Psalm\\Type\\Atomic\\TFalse' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php', - 'Psalm\\Type\\Atomic\\TFloat' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TFloat.php', - 'Psalm\\Type\\Atomic\\TGenericObject' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php', - 'Psalm\\Type\\Atomic\\THtmlEscapedString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php', - 'Psalm\\Type\\Atomic\\TInt' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php', - 'Psalm\\Type\\Atomic\\TIntMask' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php', - 'Psalm\\Type\\Atomic\\TIntMaskOf' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php', - 'Psalm\\Type\\Atomic\\TIntRange' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php', - 'Psalm\\Type\\Atomic\\TIterable' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php', - 'Psalm\\Type\\Atomic\\TKeyOfClassConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php', - 'Psalm\\Type\\Atomic\\TKeyedArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php', - 'Psalm\\Type\\Atomic\\TList' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TList.php', - 'Psalm\\Type\\Atomic\\TLiteralClassString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php', - 'Psalm\\Type\\Atomic\\TLiteralFloat' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php', - 'Psalm\\Type\\Atomic\\TLiteralInt' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php', - 'Psalm\\Type\\Atomic\\TLiteralString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php', - 'Psalm\\Type\\Atomic\\TLowercaseString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php', - 'Psalm\\Type\\Atomic\\TMixed' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TMixed.php', - 'Psalm\\Type\\Atomic\\TNamedObject' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php', - 'Psalm\\Type\\Atomic\\TNever' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php', - 'Psalm\\Type\\Atomic\\TNonEmptyArray' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php', - 'Psalm\\Type\\Atomic\\TNonEmptyList' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php', - 'Psalm\\Type\\Atomic\\TNonEmptyLowercaseString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php', - 'Psalm\\Type\\Atomic\\TNonEmptyMixed' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyMixed.php', - 'Psalm\\Type\\Atomic\\TNonEmptyNonspecificLiteralString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php', - 'Psalm\\Type\\Atomic\\TNonEmptyScalar' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyScalar.php', - 'Psalm\\Type\\Atomic\\TNonEmptyString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyString.php', - 'Psalm\\Type\\Atomic\\TNonFalsyString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonFalsyString.php', - 'Psalm\\Type\\Atomic\\TNonspecificLiteralInt' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php', - 'Psalm\\Type\\Atomic\\TNonspecificLiteralString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralString.php', - 'Psalm\\Type\\Atomic\\TNull' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNull.php', - 'Psalm\\Type\\Atomic\\TNumeric' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php', - 'Psalm\\Type\\Atomic\\TNumericString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php', - 'Psalm\\Type\\Atomic\\TObject' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php', - 'Psalm\\Type\\Atomic\\TObjectWithProperties' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php', - 'Psalm\\Type\\Atomic\\TPositiveInt' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php', - 'Psalm\\Type\\Atomic\\TResource' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php', - 'Psalm\\Type\\Atomic\\TScalar' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php', - 'Psalm\\Type\\Atomic\\TSingleLetter' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php', - 'Psalm\\Type\\Atomic\\TString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TString.php', - 'Psalm\\Type\\Atomic\\TTemplateIndexedAccess' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php', - 'Psalm\\Type\\Atomic\\TTemplateKeyOf' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php', - 'Psalm\\Type\\Atomic\\TTemplateParam' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php', - 'Psalm\\Type\\Atomic\\TTemplateParamClass' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php', - 'Psalm\\Type\\Atomic\\TTraitString' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php', - 'Psalm\\Type\\Atomic\\TTrue' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php', - 'Psalm\\Type\\Atomic\\TTypeAlias' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TTypeAlias.php', - 'Psalm\\Type\\Atomic\\TValueOfClassConstant' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php', - 'Psalm\\Type\\Atomic\\TVoid' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php', - 'Psalm\\Type\\NodeVisitor' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/NodeVisitor.php', - 'Psalm\\Type\\Reconciler' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Reconciler.php', - 'Psalm\\Type\\TaintKind' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/TaintKind.php', - 'Psalm\\Type\\TaintKindGroup' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/TaintKindGroup.php', - 'Psalm\\Type\\TypeNode' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/TypeNode.php', - 'Psalm\\Type\\Union' => $vendorDir . '/vimeo/psalm/src/Psalm/Type/Union.php', 'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', 'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', - 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php', - 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php', - 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php', - 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php', - 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php', - 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php', - 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php', - 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', - 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php', - 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', - 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php', - 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', - 'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', - 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', - 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', - 'SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', - 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', - 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', 'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', @@ -1707,106 +122,4 @@ 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - 'Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', - 'Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php', - 'Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', - 'Webmozart\\PathUtil\\Path' => $vendorDir . '/webmozart/path-util/src/Path.php', - 'Webmozart\\PathUtil\\Url' => $vendorDir . '/webmozart/path-util/src/Url.php', - 'XdgBaseDir\\Xdg' => $vendorDir . '/dnoegel/php-xdg-base-dir/src/Xdg.php', - 'phpDocumentor\\Reflection\\DocBlock' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock.php', - 'phpDocumentor\\Reflection\\DocBlockFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', - 'phpDocumentor\\Reflection\\DocBlockFactoryInterface' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', - 'phpDocumentor\\Reflection\\DocBlock\\Description' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', - 'phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', - 'phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', - 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', - 'phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', - 'phpDocumentor\\Reflection\\DocBlock\\TagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', - 'phpDocumentor\\Reflection\\Element' => $vendorDir . '/phpdocumentor/reflection-common/src/Element.php', - 'phpDocumentor\\Reflection\\Exception\\PcreException' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', - 'phpDocumentor\\Reflection\\File' => $vendorDir . '/phpdocumentor/reflection-common/src/File.php', - 'phpDocumentor\\Reflection\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-common/src/Fqsen.php', - 'phpDocumentor\\Reflection\\FqsenResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/FqsenResolver.php', - 'phpDocumentor\\Reflection\\Location' => $vendorDir . '/phpdocumentor/reflection-common/src/Location.php', - 'phpDocumentor\\Reflection\\Project' => $vendorDir . '/phpdocumentor/reflection-common/src/Project.php', - 'phpDocumentor\\Reflection\\ProjectFactory' => $vendorDir . '/phpdocumentor/reflection-common/src/ProjectFactory.php', - 'phpDocumentor\\Reflection\\PseudoType' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoType.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\False_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\List_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/List_.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\True_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', - 'phpDocumentor\\Reflection\\Type' => $vendorDir . '/phpdocumentor/type-resolver/src/Type.php', - 'phpDocumentor\\Reflection\\TypeResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/TypeResolver.php', - 'phpDocumentor\\Reflection\\Types\\AbstractList' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', - 'phpDocumentor\\Reflection\\Types\\AggregatedType' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', - 'phpDocumentor\\Reflection\\Types\\ArrayKey' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ArrayKey.php', - 'phpDocumentor\\Reflection\\Types\\Array_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Array_.php', - 'phpDocumentor\\Reflection\\Types\\Boolean' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Boolean.php', - 'phpDocumentor\\Reflection\\Types\\Callable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Callable_.php', - 'phpDocumentor\\Reflection\\Types\\ClassString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ClassString.php', - 'phpDocumentor\\Reflection\\Types\\Collection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Collection.php', - 'phpDocumentor\\Reflection\\Types\\Compound' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Compound.php', - 'phpDocumentor\\Reflection\\Types\\Context' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Context.php', - 'phpDocumentor\\Reflection\\Types\\ContextFactory' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', - 'phpDocumentor\\Reflection\\Types\\Expression' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Expression.php', - 'phpDocumentor\\Reflection\\Types\\Float_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Float_.php', - 'phpDocumentor\\Reflection\\Types\\Integer' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Integer.php', - 'phpDocumentor\\Reflection\\Types\\InterfaceString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/InterfaceString.php', - 'phpDocumentor\\Reflection\\Types\\Intersection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Intersection.php', - 'phpDocumentor\\Reflection\\Types\\Iterable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', - 'phpDocumentor\\Reflection\\Types\\Mixed_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', - 'phpDocumentor\\Reflection\\Types\\Never_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Never_.php', - 'phpDocumentor\\Reflection\\Types\\Null_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Null_.php', - 'phpDocumentor\\Reflection\\Types\\Nullable' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Nullable.php', - 'phpDocumentor\\Reflection\\Types\\Object_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Object_.php', - 'phpDocumentor\\Reflection\\Types\\Parent_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Parent_.php', - 'phpDocumentor\\Reflection\\Types\\Resource_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Resource_.php', - 'phpDocumentor\\Reflection\\Types\\Scalar' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Scalar.php', - 'phpDocumentor\\Reflection\\Types\\Self_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Self_.php', - 'phpDocumentor\\Reflection\\Types\\Static_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Static_.php', - 'phpDocumentor\\Reflection\\Types\\String_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/String_.php', - 'phpDocumentor\\Reflection\\Types\\This' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/This.php', - 'phpDocumentor\\Reflection\\Types\\Void_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Void_.php', - 'phpDocumentor\\Reflection\\Utils' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Utils.php', ); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index d238b9c7..f1de01ba 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -6,13 +6,8 @@ $baseDir = dirname($vendorDir); return array( - 'e8aa6e4b5a1db2f56ae794f1505391a8' => $vendorDir . '/amphp/amp/lib/functions.php', - '76cd0796156622033397994f25b0d8fc' => $vendorDir . '/amphp/amp/lib/Internal/functions.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', - 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', - '6cd5651c4fef5ed6b63e8d8b8ffbf3cc' => $vendorDir . '/amphp/byte-stream/lib/functions.php', - 'dc51568953534d6c54b08731e61104e2' => $vendorDir . '/vimeo/psalm/src/functions.php', - '8e4171839e12546525126d38dac3dafa' => $vendorDir . '/vimeo/psalm/src/spl_object_id.php', + 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', ); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php index e79487ed..15a2ff3a 100644 --- a/vendor/composer/autoload_namespaces.php +++ b/vendor/composer/autoload_namespaces.php @@ -6,6 +6,4 @@ $baseDir = dirname($vendorDir); return array( - 'LSS' => array($vendorDir . '/openlss/lib-array2xml'), - 'JsonMapper' => array($vendorDir . '/netresearch/jsonmapper/src'), ); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index ec80265a..c2de19eb 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -6,27 +6,12 @@ $baseDir = dirname($vendorDir); return array( - 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'), - 'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'), - 'Webmozart\\PathUtil\\' => array($vendorDir . '/webmozart/path-util/src'), - 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), - 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), - 'Psalm\\' => array($vendorDir . '/vimeo/psalm/src/Psalm'), - 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), - 'PackageVersions\\' => array($vendorDir . '/composer/package-versions-deprecated/src/PackageVersions'), 'NC\\Updater\\' => array($baseDir . '/lib'), - 'LanguageServerProtocol\\' => array($vendorDir . '/felixfbecker/language-server-protocol/src'), - 'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), - 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), - 'Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), 'Bamarni\\Composer\\Bin\\' => array($vendorDir . '/bamarni/composer-bin-plugin/src'), - 'Amp\\ByteStream\\' => array($vendorDir . '/amphp/byte-stream/lib'), - 'Amp\\' => array($vendorDir . '/amphp/amp/lib'), - 'AdvancedJsonRpc\\' => array($vendorDir . '/felixfbecker/advanced-json-rpc/lib'), ); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 6f1c6bdf..b44eec2d 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -7,31 +7,13 @@ class ComposerStaticInit2723bf3c902a907c44396c9253500aff { public static $files = array ( - 'e8aa6e4b5a1db2f56ae794f1505391a8' => __DIR__ . '/..' . '/amphp/amp/lib/functions.php', - '76cd0796156622033397994f25b0d8fc' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/functions.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', - 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', - '6cd5651c4fef5ed6b63e8d8b8ffbf3cc' => __DIR__ . '/..' . '/amphp/byte-stream/lib/functions.php', - 'dc51568953534d6c54b08731e61104e2' => __DIR__ . '/..' . '/vimeo/psalm/src/functions.php', - '8e4171839e12546525126d38dac3dafa' => __DIR__ . '/..' . '/vimeo/psalm/src/spl_object_id.php', + 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', ); public static $prefixLengthsPsr4 = array ( - 'p' => - array ( - 'phpDocumentor\\Reflection\\' => 25, - ), - 'X' => - array ( - 'XdgBaseDir\\' => 11, - ), - 'W' => - array ( - 'Webmozart\\PathUtil\\' => 19, - 'Webmozart\\Assert\\' => 17, - ), 'S' => array ( 'Symfony\\Polyfill\\Php80\\' => 23, @@ -42,57 +24,19 @@ class ComposerStaticInit2723bf3c902a907c44396c9253500aff ), 'P' => array ( - 'Psr\\Log\\' => 8, 'Psr\\Container\\' => 14, - 'Psalm\\' => 6, - 'PhpParser\\' => 10, - 'PackageVersions\\' => 16, ), 'N' => array ( 'NC\\Updater\\' => 11, ), - 'L' => - array ( - 'LanguageServerProtocol\\' => 23, - ), - 'C' => - array ( - 'Composer\\XdebugHandler\\' => 23, - 'Composer\\Semver\\' => 16, - 'Composer\\Pcre\\' => 14, - ), 'B' => array ( 'Bamarni\\Composer\\Bin\\' => 21, ), - 'A' => - array ( - 'Amp\\ByteStream\\' => 15, - 'Amp\\' => 4, - 'AdvancedJsonRpc\\' => 16, - ), ); public static $prefixDirsPsr4 = array ( - 'phpDocumentor\\Reflection\\' => - array ( - 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', - 1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', - 2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', - ), - 'XdgBaseDir\\' => - array ( - 0 => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src', - ), - 'Webmozart\\PathUtil\\' => - array ( - 0 => __DIR__ . '/..' . '/webmozart/path-util/src', - ), - 'Webmozart\\Assert\\' => - array ( - 0 => __DIR__ . '/..' . '/webmozart/assert/src', - ), 'Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', @@ -113,1684 +57,38 @@ class ComposerStaticInit2723bf3c902a907c44396c9253500aff array ( 0 => __DIR__ . '/..' . '/symfony/console', ), - 'Psr\\Log\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', - ), 'Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), - 'Psalm\\' => - array ( - 0 => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm', - ), - 'PhpParser\\' => - array ( - 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', - ), - 'PackageVersions\\' => - array ( - 0 => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions', - ), 'NC\\Updater\\' => array ( 0 => __DIR__ . '/../..' . '/lib', ), - 'LanguageServerProtocol\\' => - array ( - 0 => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src', - ), - 'Composer\\XdebugHandler\\' => - array ( - 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', - ), - 'Composer\\Semver\\' => - array ( - 0 => __DIR__ . '/..' . '/composer/semver/src', - ), - 'Composer\\Pcre\\' => - array ( - 0 => __DIR__ . '/..' . '/composer/pcre/src', - ), 'Bamarni\\Composer\\Bin\\' => array ( 0 => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src', ), - 'Amp\\ByteStream\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/byte-stream/lib', - ), - 'Amp\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/amp/lib', - ), - 'AdvancedJsonRpc\\' => - array ( - 0 => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib', - ), - ); - - public static $prefixesPsr0 = array ( - 'L' => - array ( - 'LSS' => - array ( - 0 => __DIR__ . '/..' . '/openlss/lib-array2xml', - ), - ), - 'J' => - array ( - 'JsonMapper' => - array ( - 0 => __DIR__ . '/..' . '/netresearch/jsonmapper/src', - ), - ), ); public static $classMap = array ( - 'AdvancedJsonRpc\\Dispatcher' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Dispatcher.php', - 'AdvancedJsonRpc\\Error' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Error.php', - 'AdvancedJsonRpc\\ErrorCode' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/ErrorCode.php', - 'AdvancedJsonRpc\\ErrorResponse' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/ErrorResponse.php', - 'AdvancedJsonRpc\\Message' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Message.php', - 'AdvancedJsonRpc\\Notification' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Notification.php', - 'AdvancedJsonRpc\\Request' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Request.php', - 'AdvancedJsonRpc\\Response' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Response.php', - 'AdvancedJsonRpc\\SuccessResponse' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php', - 'Amp\\ByteStream\\Base64\\Base64DecodingInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php', - 'Amp\\ByteStream\\Base64\\Base64DecodingOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php', - 'Amp\\ByteStream\\Base64\\Base64EncodingInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php', - 'Amp\\ByteStream\\Base64\\Base64EncodingOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php', - 'Amp\\ByteStream\\ClosedException' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ClosedException.php', - 'Amp\\ByteStream\\InMemoryStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InMemoryStream.php', - 'Amp\\ByteStream\\InputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InputStream.php', - 'Amp\\ByteStream\\InputStreamChain' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InputStreamChain.php', - 'Amp\\ByteStream\\IteratorStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/IteratorStream.php', - 'Amp\\ByteStream\\LineReader' => __DIR__ . '/..' . '/amphp/byte-stream/lib/LineReader.php', - 'Amp\\ByteStream\\Message' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Message.php', - 'Amp\\ByteStream\\OutputBuffer' => __DIR__ . '/..' . '/amphp/byte-stream/lib/OutputBuffer.php', - 'Amp\\ByteStream\\OutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/OutputStream.php', - 'Amp\\ByteStream\\Payload' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Payload.php', - 'Amp\\ByteStream\\PendingReadError' => __DIR__ . '/..' . '/amphp/byte-stream/lib/PendingReadError.php', - 'Amp\\ByteStream\\ResourceInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ResourceInputStream.php', - 'Amp\\ByteStream\\ResourceOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ResourceOutputStream.php', - 'Amp\\ByteStream\\StreamException' => __DIR__ . '/..' . '/amphp/byte-stream/lib/StreamException.php', - 'Amp\\ByteStream\\ZlibInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ZlibInputStream.php', - 'Amp\\ByteStream\\ZlibOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ZlibOutputStream.php', - 'Amp\\CallableMaker' => __DIR__ . '/..' . '/amphp/amp/lib/CallableMaker.php', - 'Amp\\CancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/CancellationToken.php', - 'Amp\\CancellationTokenSource' => __DIR__ . '/..' . '/amphp/amp/lib/CancellationTokenSource.php', - 'Amp\\CancelledException' => __DIR__ . '/..' . '/amphp/amp/lib/CancelledException.php', - 'Amp\\CombinedCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/CombinedCancellationToken.php', - 'Amp\\Coroutine' => __DIR__ . '/..' . '/amphp/amp/lib/Coroutine.php', - 'Amp\\Deferred' => __DIR__ . '/..' . '/amphp/amp/lib/Deferred.php', - 'Amp\\Delayed' => __DIR__ . '/..' . '/amphp/amp/lib/Delayed.php', - 'Amp\\Emitter' => __DIR__ . '/..' . '/amphp/amp/lib/Emitter.php', - 'Amp\\Failure' => __DIR__ . '/..' . '/amphp/amp/lib/Failure.php', - 'Amp\\Internal\\Placeholder' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/Placeholder.php', - 'Amp\\Internal\\PrivateIterator' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/PrivateIterator.php', - 'Amp\\Internal\\PrivatePromise' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/PrivatePromise.php', - 'Amp\\Internal\\Producer' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/Producer.php', - 'Amp\\Internal\\ResolutionQueue' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/ResolutionQueue.php', - 'Amp\\InvalidYieldError' => __DIR__ . '/..' . '/amphp/amp/lib/InvalidYieldError.php', - 'Amp\\Iterator' => __DIR__ . '/..' . '/amphp/amp/lib/Iterator.php', - 'Amp\\LazyPromise' => __DIR__ . '/..' . '/amphp/amp/lib/LazyPromise.php', - 'Amp\\Loop' => __DIR__ . '/..' . '/amphp/amp/lib/Loop.php', - 'Amp\\Loop\\Driver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Driver.php', - 'Amp\\Loop\\DriverFactory' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/DriverFactory.php', - 'Amp\\Loop\\EvDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/EvDriver.php', - 'Amp\\Loop\\EventDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/EventDriver.php', - 'Amp\\Loop\\Internal\\TimerQueue' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Internal/TimerQueue.php', - 'Amp\\Loop\\InvalidWatcherError' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/InvalidWatcherError.php', - 'Amp\\Loop\\NativeDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/NativeDriver.php', - 'Amp\\Loop\\TracingDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/TracingDriver.php', - 'Amp\\Loop\\UnsupportedFeatureException' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/UnsupportedFeatureException.php', - 'Amp\\Loop\\UvDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/UvDriver.php', - 'Amp\\Loop\\Watcher' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Watcher.php', - 'Amp\\MultiReasonException' => __DIR__ . '/..' . '/amphp/amp/lib/MultiReasonException.php', - 'Amp\\NullCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/NullCancellationToken.php', - 'Amp\\Producer' => __DIR__ . '/..' . '/amphp/amp/lib/Producer.php', - 'Amp\\Promise' => __DIR__ . '/..' . '/amphp/amp/lib/Promise.php', - 'Amp\\Struct' => __DIR__ . '/..' . '/amphp/amp/lib/Struct.php', - 'Amp\\Success' => __DIR__ . '/..' . '/amphp/amp/lib/Success.php', - 'Amp\\TimeoutCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/TimeoutCancellationToken.php', - 'Amp\\TimeoutException' => __DIR__ . '/..' . '/amphp/amp/lib/TimeoutException.php', 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Bamarni\\Composer\\Bin\\BinCommand' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/BinCommand.php', 'Bamarni\\Composer\\Bin\\CommandProvider' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/CommandProvider.php', 'Bamarni\\Composer\\Bin\\Config' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Config.php', 'Bamarni\\Composer\\Bin\\Plugin' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Plugin.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'Composer\\Pcre\\MatchAllResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllResult.php', - 'Composer\\Pcre\\MatchAllWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllWithOffsetsResult.php', - 'Composer\\Pcre\\MatchResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchResult.php', - 'Composer\\Pcre\\MatchWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchWithOffsetsResult.php', - 'Composer\\Pcre\\PcreException' => __DIR__ . '/..' . '/composer/pcre/src/PcreException.php', - 'Composer\\Pcre\\Preg' => __DIR__ . '/..' . '/composer/pcre/src/Preg.php', - 'Composer\\Pcre\\Regex' => __DIR__ . '/..' . '/composer/pcre/src/Regex.php', - 'Composer\\Pcre\\ReplaceResult' => __DIR__ . '/..' . '/composer/pcre/src/ReplaceResult.php', - 'Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', - 'Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php', - 'Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php', - 'Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', - 'Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', - 'Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php', - 'Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php', - 'Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', - 'Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php', - 'Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php', - 'Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', - 'Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', - 'Composer\\XdebugHandler\\PhpConfig' => __DIR__ . '/..' . '/composer/xdebug-handler/src/PhpConfig.php', - 'Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php', - 'Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php', - 'Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php', 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', - 'JsonMapper' => __DIR__ . '/..' . '/netresearch/jsonmapper/src/JsonMapper.php', - 'JsonMapper_Exception' => __DIR__ . '/..' . '/netresearch/jsonmapper/src/JsonMapper/Exception.php', - 'LSS\\Array2XML' => __DIR__ . '/..' . '/openlss/lib-array2xml/LSS/Array2XML.php', - 'LSS\\XML2Array' => __DIR__ . '/..' . '/openlss/lib-array2xml/LSS/XML2Array.php', - 'LanguageServerProtocol\\CallHierarchyClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php', - 'LanguageServerProtocol\\ChangeAnnotation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ChangeAnnotation.php', - 'LanguageServerProtocol\\ClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilities.php', - 'LanguageServerProtocol\\ClientCapabilitiesGeneral' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php', - 'LanguageServerProtocol\\ClientCapabilitiesWindow' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php', - 'LanguageServerProtocol\\ClientCapabilitiesWorkspace' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php', - 'LanguageServerProtocol\\ClientCapabilitiesWorkspaceFileOperations' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspaceFileOperations.php', - 'LanguageServerProtocol\\ClientInfo' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientInfo.php', - 'LanguageServerProtocol\\CodeAction' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeAction.php', - 'LanguageServerProtocol\\CodeActionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php', - 'LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php', - 'LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php', - 'LanguageServerProtocol\\CodeActionClientCapabilitiesResolveSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php', - 'LanguageServerProtocol\\CodeActionContext' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionContext.php', - 'LanguageServerProtocol\\CodeActionDisabled' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionDisabled.php', - 'LanguageServerProtocol\\CodeActionKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionKind.php', - 'LanguageServerProtocol\\CodeActionTriggerKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionTriggerKind.php', - 'LanguageServerProtocol\\CodeDescription' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeDescription.php', - 'LanguageServerProtocol\\CodeLens' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLens.php', - 'LanguageServerProtocol\\CodeLensClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php', - 'LanguageServerProtocol\\CodeLensOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLensOptions.php', - 'LanguageServerProtocol\\CodeLensWorkspaceClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php', - 'LanguageServerProtocol\\Command' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Command.php', - 'LanguageServerProtocol\\CompletionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php', - 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php', - 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemInsertTextModeSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php', - 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemResolveSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php', - 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php', - 'LanguageServerProtocol\\CompletionClientCapabilitiesCompletionList' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php', - 'LanguageServerProtocol\\CompletionContext' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionContext.php', - 'LanguageServerProtocol\\CompletionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItem.php', - 'LanguageServerProtocol\\CompletionItemKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItemKind.php', - 'LanguageServerProtocol\\CompletionItemLabelDetails' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItemLabelDetails.php', - 'LanguageServerProtocol\\CompletionItemTag' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItemTag.php', - 'LanguageServerProtocol\\CompletionList' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionList.php', - 'LanguageServerProtocol\\CompletionOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionOptions.php', - 'LanguageServerProtocol\\CompletionTriggerKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php', - 'LanguageServerProtocol\\ContentChangeEvent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ContentChangeEvent.php', - 'LanguageServerProtocol\\DeclarationClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php', - 'LanguageServerProtocol\\DefinitionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php', - 'LanguageServerProtocol\\DependencyReference' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DependencyReference.php', - 'LanguageServerProtocol\\Diagnostic' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Diagnostic.php', - 'LanguageServerProtocol\\DiagnosticRelatedInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php', - 'LanguageServerProtocol\\DiagnosticSeverity' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php', - 'LanguageServerProtocol\\DiagnosticTag' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DiagnosticTag.php', - 'LanguageServerProtocol\\DidChangeConfigurationClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DidChangeConfigurationClientCapabilities.php', - 'LanguageServerProtocol\\DidChangeWatchedFilesClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php', - 'LanguageServerProtocol\\DocumentColorClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php', - 'LanguageServerProtocol\\DocumentFormattingClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php', - 'LanguageServerProtocol\\DocumentHighlight' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentHighlight.php', - 'LanguageServerProtocol\\DocumentHighlightClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php', - 'LanguageServerProtocol\\DocumentHighlightKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php', - 'LanguageServerProtocol\\DocumentLinkClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentLinkClientCapabilities.php', - 'LanguageServerProtocol\\DocumentOnTypeFormattingClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php', - 'LanguageServerProtocol\\DocumentOnTypeFormattingOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php', - 'LanguageServerProtocol\\DocumentRangeFormattingClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php', - 'LanguageServerProtocol\\DocumentSymbolClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php', - 'LanguageServerProtocol\\DocumentSymbolClientCapabilitiesSymbolKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php', - 'LanguageServerProtocol\\DocumentSymbolClientCapabilitiesTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php', - 'LanguageServerProtocol\\ErrorCode' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ErrorCode.php', - 'LanguageServerProtocol\\ExecuteCommandClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ExecuteCommandClientCapabilities.php', - 'LanguageServerProtocol\\ExecuteCommandOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php', - 'LanguageServerProtocol\\FailureHandlingKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FailureHandlingKind.php', - 'LanguageServerProtocol\\FileChangeType' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FileChangeType.php', - 'LanguageServerProtocol\\FileEvent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FileEvent.php', - 'LanguageServerProtocol\\FoldingRangeClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php', - 'LanguageServerProtocol\\FormattingOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FormattingOptions.php', - 'LanguageServerProtocol\\Hover' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Hover.php', - 'LanguageServerProtocol\\HoverClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php', - 'LanguageServerProtocol\\ImplementationClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php', - 'LanguageServerProtocol\\InitializeResult' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InitializeResult.php', - 'LanguageServerProtocol\\InitializeResultServerInfo' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php', - 'LanguageServerProtocol\\InsertTextFormat' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InsertTextFormat.php', - 'LanguageServerProtocol\\InsertTextMode' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InsertTextMode.php', - 'LanguageServerProtocol\\LinkedEditingRangeClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php', - 'LanguageServerProtocol\\Location' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Location.php', - 'LanguageServerProtocol\\LogMessage' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/LogMessage.php', - 'LanguageServerProtocol\\LogTrace' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/LogTrace.php', - 'LanguageServerProtocol\\MarkdownClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php', - 'LanguageServerProtocol\\MarkedString' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkedString.php', - 'LanguageServerProtocol\\MarkupContent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkupContent.php', - 'LanguageServerProtocol\\MarkupKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkupKind.php', - 'LanguageServerProtocol\\MessageActionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MessageActionItem.php', - 'LanguageServerProtocol\\MessageType' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MessageType.php', - 'LanguageServerProtocol\\MonikerClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MonikerClientCapabilities.php', - 'LanguageServerProtocol\\PackageDescriptor' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PackageDescriptor.php', - 'LanguageServerProtocol\\ParameterInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ParameterInformation.php', - 'LanguageServerProtocol\\Position' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Position.php', - 'LanguageServerProtocol\\PrepareSupportDefaultBehavior' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php', - 'LanguageServerProtocol\\PublishDiagnosticsClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilities.php', - 'LanguageServerProtocol\\PublishDiagnosticsClientCapabilitiesTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php', - 'LanguageServerProtocol\\Range' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Range.php', - 'LanguageServerProtocol\\ReferenceClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php', - 'LanguageServerProtocol\\ReferenceContext' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ReferenceContext.php', - 'LanguageServerProtocol\\ReferenceInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ReferenceInformation.php', - 'LanguageServerProtocol\\RegularExpressionsClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php', - 'LanguageServerProtocol\\RenameClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php', - 'LanguageServerProtocol\\ResourceOperationKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ResourceOperationKind.php', - 'LanguageServerProtocol\\SaveOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SaveOptions.php', - 'LanguageServerProtocol\\SelectionRangeClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SelectionRangeClientCapabilities.php', - 'LanguageServerProtocol\\SemanticTokensClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php', - 'LanguageServerProtocol\\SemanticTokensClientCapabilitiesRequests' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php', - 'LanguageServerProtocol\\SemanticTokensWorkspaceClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php', - 'LanguageServerProtocol\\ServerCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ServerCapabilities.php', - 'LanguageServerProtocol\\ShowDocumentClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ShowDocumentClientCapabilities.php', - 'LanguageServerProtocol\\ShowMessageRequestClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php', - 'LanguageServerProtocol\\ShowMessageRequestClientCapabilitiesMessageActionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php', - 'LanguageServerProtocol\\SignatureHelp' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelp.php', - 'LanguageServerProtocol\\SignatureHelpClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php', - 'LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php', - 'LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformationParameterInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php', - 'LanguageServerProtocol\\SignatureHelpOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php', - 'LanguageServerProtocol\\SignatureInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureInformation.php', - 'LanguageServerProtocol\\SymbolDescriptor' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolDescriptor.php', - 'LanguageServerProtocol\\SymbolInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolInformation.php', - 'LanguageServerProtocol\\SymbolKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolKind.php', - 'LanguageServerProtocol\\SymbolLocationInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolLocationInformation.php', - 'LanguageServerProtocol\\SymbolTag' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolTag.php', - 'LanguageServerProtocol\\TextDocumentClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentClientCapabilities.php', - 'LanguageServerProtocol\\TextDocumentContentChangeEvent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php', - 'LanguageServerProtocol\\TextDocumentIdentifier' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php', - 'LanguageServerProtocol\\TextDocumentItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentItem.php', - 'LanguageServerProtocol\\TextDocumentSyncClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php', - 'LanguageServerProtocol\\TextDocumentSyncKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php', - 'LanguageServerProtocol\\TextDocumentSyncOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentSyncOptions.php', - 'LanguageServerProtocol\\TextEdit' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextEdit.php', - 'LanguageServerProtocol\\TokenFormat' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TokenFormat.php', - 'LanguageServerProtocol\\TypeDefinitionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TypeDefinitionClientCapabilities.php', - 'LanguageServerProtocol\\VersionedTextDocumentIdentifier' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php', - 'LanguageServerProtocol\\WorkspaceEdit' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceEdit.php', - 'LanguageServerProtocol\\WorkspaceEditClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php', - 'LanguageServerProtocol\\WorkspaceEditClientCapabilitiesChangeAnnotationSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php', - 'LanguageServerProtocol\\WorkspaceFolder' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceFolder.php', - 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php', - 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesResolveSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php', - 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesSymbolKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php', - 'LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php', 'NC\\Updater\\CommandApplication' => __DIR__ . '/../..' . '/lib/CommandApplication.php', 'NC\\Updater\\LogException' => __DIR__ . '/../..' . '/lib/LogException.php', 'NC\\Updater\\RecursiveDirectoryIteratorWithoutData' => __DIR__ . '/../..' . '/lib/RecursiveDirectoryIteratorWithoutData.php', 'NC\\Updater\\UpdateCommand' => __DIR__ . '/../..' . '/lib/UpdateCommand.php', 'NC\\Updater\\UpdateException' => __DIR__ . '/../..' . '/lib/UpdateException.php', 'NC\\Updater\\Updater' => __DIR__ . '/../..' . '/lib/Updater.php', - 'PackageVersions\\FallbackVersions' => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php', - 'PackageVersions\\Installer' => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions/Installer.php', - 'PackageVersions\\Versions' => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions/Versions.php', - 'PhpParser\\Builder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder.php', - 'PhpParser\\BuilderFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', - 'PhpParser\\BuilderHelpers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', - 'PhpParser\\Builder\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php', - 'PhpParser\\Builder\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', - 'PhpParser\\Builder\\Declaration' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', - 'PhpParser\\Builder\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php', - 'PhpParser\\Builder\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php', - 'PhpParser\\Builder\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', - 'PhpParser\\Builder\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', - 'PhpParser\\Builder\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', - 'PhpParser\\Builder\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', - 'PhpParser\\Builder\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', - 'PhpParser\\Builder\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', - 'PhpParser\\Builder\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', - 'PhpParser\\Builder\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', - 'PhpParser\\Builder\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', - 'PhpParser\\Builder\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', - 'PhpParser\\Builder\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', - 'PhpParser\\Comment' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment.php', - 'PhpParser\\Comment\\Doc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', - 'PhpParser\\ConstExprEvaluationException' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', - 'PhpParser\\ConstExprEvaluator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', - 'PhpParser\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Error.php', - 'PhpParser\\ErrorHandler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', - 'PhpParser\\ErrorHandler\\Collecting' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', - 'PhpParser\\ErrorHandler\\Throwing' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', - 'PhpParser\\Internal\\DiffElem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', - 'PhpParser\\Internal\\Differ' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', - 'PhpParser\\Internal\\PrintableNewAnonClassNode' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', - 'PhpParser\\Internal\\TokenStream' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', - 'PhpParser\\JsonDecoder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', - 'PhpParser\\Lexer' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer.php', - 'PhpParser\\Lexer\\Emulative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', - 'PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', - 'PhpParser\\NameContext' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NameContext.php', - 'PhpParser\\Node' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node.php', - 'PhpParser\\NodeAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', - 'PhpParser\\NodeDumper' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', - 'PhpParser\\NodeFinder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', - 'PhpParser\\NodeTraverser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', - 'PhpParser\\NodeTraverserInterface' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', - 'PhpParser\\NodeVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', - 'PhpParser\\NodeVisitorAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', - 'PhpParser\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', - 'PhpParser\\NodeVisitor\\FindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', - 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', - 'PhpParser\\NodeVisitor\\NameResolver' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', - 'PhpParser\\NodeVisitor\\NodeConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', - 'PhpParser\\NodeVisitor\\ParentConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', - 'PhpParser\\Node\\Arg' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', - 'PhpParser\\Node\\Attribute' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', - 'PhpParser\\Node\\AttributeGroup' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', - 'PhpParser\\Node\\ComplexType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', - 'PhpParser\\Node\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', - 'PhpParser\\Node\\Expr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', - 'PhpParser\\Node\\Expr\\ArrayDimFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', - 'PhpParser\\Node\\Expr\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', - 'PhpParser\\Node\\Expr\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', - 'PhpParser\\Node\\Expr\\ArrowFunction' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', - 'PhpParser\\Node\\Expr\\Assign' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', - 'PhpParser\\Node\\Expr\\AssignOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', - 'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', - 'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', - 'PhpParser\\Node\\Expr\\AssignRef' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', - 'PhpParser\\Node\\Expr\\BinaryOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', - 'PhpParser\\Node\\Expr\\BitwiseNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', - 'PhpParser\\Node\\Expr\\BooleanNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', - 'PhpParser\\Node\\Expr\\CallLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php', - 'PhpParser\\Node\\Expr\\Cast' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', - 'PhpParser\\Node\\Expr\\Cast\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', - 'PhpParser\\Node\\Expr\\Cast\\Bool_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', - 'PhpParser\\Node\\Expr\\Cast\\Double' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', - 'PhpParser\\Node\\Expr\\Cast\\Int_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', - 'PhpParser\\Node\\Expr\\Cast\\Object_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', - 'PhpParser\\Node\\Expr\\Cast\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', - 'PhpParser\\Node\\Expr\\Cast\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', - 'PhpParser\\Node\\Expr\\ClassConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', - 'PhpParser\\Node\\Expr\\Clone_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', - 'PhpParser\\Node\\Expr\\Closure' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', - 'PhpParser\\Node\\Expr\\ClosureUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', - 'PhpParser\\Node\\Expr\\ConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', - 'PhpParser\\Node\\Expr\\Empty_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', - 'PhpParser\\Node\\Expr\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', - 'PhpParser\\Node\\Expr\\ErrorSuppress' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', - 'PhpParser\\Node\\Expr\\Eval_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', - 'PhpParser\\Node\\Expr\\Exit_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', - 'PhpParser\\Node\\Expr\\FuncCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', - 'PhpParser\\Node\\Expr\\Include_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', - 'PhpParser\\Node\\Expr\\Instanceof_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', - 'PhpParser\\Node\\Expr\\Isset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', - 'PhpParser\\Node\\Expr\\List_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', - 'PhpParser\\Node\\Expr\\Match_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php', - 'PhpParser\\Node\\Expr\\MethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', - 'PhpParser\\Node\\Expr\\New_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', - 'PhpParser\\Node\\Expr\\NullsafeMethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php', - 'PhpParser\\Node\\Expr\\NullsafePropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php', - 'PhpParser\\Node\\Expr\\PostDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', - 'PhpParser\\Node\\Expr\\PostInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', - 'PhpParser\\Node\\Expr\\PreDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', - 'PhpParser\\Node\\Expr\\PreInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', - 'PhpParser\\Node\\Expr\\Print_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', - 'PhpParser\\Node\\Expr\\PropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', - 'PhpParser\\Node\\Expr\\ShellExec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', - 'PhpParser\\Node\\Expr\\StaticCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', - 'PhpParser\\Node\\Expr\\StaticPropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', - 'PhpParser\\Node\\Expr\\Ternary' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', - 'PhpParser\\Node\\Expr\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php', - 'PhpParser\\Node\\Expr\\UnaryMinus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', - 'PhpParser\\Node\\Expr\\UnaryPlus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', - 'PhpParser\\Node\\Expr\\Variable' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', - 'PhpParser\\Node\\Expr\\YieldFrom' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', - 'PhpParser\\Node\\Expr\\Yield_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', - 'PhpParser\\Node\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', - 'PhpParser\\Node\\Identifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', - 'PhpParser\\Node\\IntersectionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', - 'PhpParser\\Node\\MatchArm' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', - 'PhpParser\\Node\\Name' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name.php', - 'PhpParser\\Node\\Name\\FullyQualified' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', - 'PhpParser\\Node\\Name\\Relative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', - 'PhpParser\\Node\\NullableType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', - 'PhpParser\\Node\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Param.php', - 'PhpParser\\Node\\Scalar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', - 'PhpParser\\Node\\Scalar\\DNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', - 'PhpParser\\Node\\Scalar\\Encapsed' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', - 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', - 'PhpParser\\Node\\Scalar\\LNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', - 'PhpParser\\Node\\Scalar\\MagicConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\File' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', - 'PhpParser\\Node\\Scalar\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', - 'PhpParser\\Node\\Stmt' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', - 'PhpParser\\Node\\Stmt\\Break_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', - 'PhpParser\\Node\\Stmt\\Case_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', - 'PhpParser\\Node\\Stmt\\Catch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', - 'PhpParser\\Node\\Stmt\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', - 'PhpParser\\Node\\Stmt\\ClassLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', - 'PhpParser\\Node\\Stmt\\ClassMethod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', - 'PhpParser\\Node\\Stmt\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', - 'PhpParser\\Node\\Stmt\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', - 'PhpParser\\Node\\Stmt\\Continue_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', - 'PhpParser\\Node\\Stmt\\DeclareDeclare' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', - 'PhpParser\\Node\\Stmt\\Declare_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', - 'PhpParser\\Node\\Stmt\\Do_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', - 'PhpParser\\Node\\Stmt\\Echo_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', - 'PhpParser\\Node\\Stmt\\ElseIf_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', - 'PhpParser\\Node\\Stmt\\Else_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', - 'PhpParser\\Node\\Stmt\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php', - 'PhpParser\\Node\\Stmt\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php', - 'PhpParser\\Node\\Stmt\\Expression' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', - 'PhpParser\\Node\\Stmt\\Finally_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', - 'PhpParser\\Node\\Stmt\\For_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', - 'PhpParser\\Node\\Stmt\\Foreach_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', - 'PhpParser\\Node\\Stmt\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', - 'PhpParser\\Node\\Stmt\\Global_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', - 'PhpParser\\Node\\Stmt\\Goto_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', - 'PhpParser\\Node\\Stmt\\GroupUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', - 'PhpParser\\Node\\Stmt\\HaltCompiler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', - 'PhpParser\\Node\\Stmt\\If_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', - 'PhpParser\\Node\\Stmt\\InlineHTML' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', - 'PhpParser\\Node\\Stmt\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', - 'PhpParser\\Node\\Stmt\\Label' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', - 'PhpParser\\Node\\Stmt\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', - 'PhpParser\\Node\\Stmt\\Nop' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', - 'PhpParser\\Node\\Stmt\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', - 'PhpParser\\Node\\Stmt\\PropertyProperty' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', - 'PhpParser\\Node\\Stmt\\Return_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', - 'PhpParser\\Node\\Stmt\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', - 'PhpParser\\Node\\Stmt\\Static_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', - 'PhpParser\\Node\\Stmt\\Switch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', - 'PhpParser\\Node\\Stmt\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', - 'PhpParser\\Node\\Stmt\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', - 'PhpParser\\Node\\Stmt\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', - 'PhpParser\\Node\\Stmt\\TryCatch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', - 'PhpParser\\Node\\Stmt\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', - 'PhpParser\\Node\\Stmt\\UseUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', - 'PhpParser\\Node\\Stmt\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', - 'PhpParser\\Node\\Stmt\\While_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', - 'PhpParser\\Node\\UnionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', - 'PhpParser\\Node\\VarLikeIdentifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', - 'PhpParser\\Node\\VariadicPlaceholder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', - 'PhpParser\\Parser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser.php', - 'PhpParser\\ParserAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', - 'PhpParser\\ParserFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', - 'PhpParser\\Parser\\Multiple' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', - 'PhpParser\\Parser\\Php5' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', - 'PhpParser\\Parser\\Php7' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', - 'PhpParser\\Parser\\Tokens' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', - 'PhpParser\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', - 'PhpParser\\PrettyPrinter\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', - 'Psalm\\Aliases' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Aliases.php', - 'Psalm\\CodeLocation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/CodeLocation.php', - 'Psalm\\CodeLocation\\DocblockTypeLocation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php', - 'Psalm\\CodeLocation\\ParseErrorLocation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php', - 'Psalm\\CodeLocation\\Raw' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/CodeLocation/Raw.php', - 'Psalm\\Codebase' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Codebase.php', - 'Psalm\\Config' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config.php', - 'Psalm\\Config\\Creator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/Creator.php', - 'Psalm\\Config\\ErrorLevelFileFilter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php', - 'Psalm\\Config\\FileFilter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/FileFilter.php', - 'Psalm\\Config\\IssueHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/IssueHandler.php', - 'Psalm\\Config\\ProjectFileFilter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php', - 'Psalm\\Config\\TaintAnalysisFileFilter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php', - 'Psalm\\Context' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Context.php', - 'Psalm\\DocComment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/DocComment.php', - 'Psalm\\ErrorBaseline' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/ErrorBaseline.php', - 'Psalm\\Exception\\CircularReferenceException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php', - 'Psalm\\Exception\\CodeException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/CodeException.php', - 'Psalm\\Exception\\ComplicatedExpressionException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/ComplicatedExpressionException.php', - 'Psalm\\Exception\\ConfigCreationException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/ConfigCreationException.php', - 'Psalm\\Exception\\ConfigException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/ConfigException.php', - 'Psalm\\Exception\\ConfigNotFoundException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/ConfigNotFoundException.php', - 'Psalm\\Exception\\DocblockParseException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/DocblockParseException.php', - 'Psalm\\Exception\\FileIncludeException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/FileIncludeException.php', - 'Psalm\\Exception\\IncorrectDocblockException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/IncorrectDocblockException.php', - 'Psalm\\Exception\\InvalidClasslikeOverrideException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/InvalidClasslikeOverrideException.php', - 'Psalm\\Exception\\InvalidMethodOverrideException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/InvalidMethodOverrideException.php', - 'Psalm\\Exception\\RefactorException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/RefactorException.php', - 'Psalm\\Exception\\ScopeAnalysisException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/ScopeAnalysisException.php', - 'Psalm\\Exception\\TypeParseTreeException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/TypeParseTreeException.php', - 'Psalm\\Exception\\UnanalyzedFileException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/UnanalyzedFileException.php', - 'Psalm\\Exception\\UnpopulatedClasslikeException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/UnpopulatedClasslikeException.php', - 'Psalm\\Exception\\UnpreparedAnalysisException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/UnpreparedAnalysisException.php', - 'Psalm\\Exception\\UnsupportedIssueToFixException' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Exception/UnsupportedIssueToFixException.php', - 'Psalm\\FileBasedPluginAdapter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/FileBasedPluginAdapter.php', - 'Psalm\\FileManipulation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/FileManipulation.php', - 'Psalm\\FileSource' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/FileSource.php', - 'Psalm\\Internal\\Algebra' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Algebra.php', - 'Psalm\\Internal\\Algebra\\FormulaGenerator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php', - 'Psalm\\Internal\\Analyzer\\AlgebraAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\AttributesAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\CanAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php', - 'Psalm\\Internal\\Analyzer\\ClassAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\ClassLikeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\ClassLikeNameOptions' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php', - 'Psalm\\Internal\\Analyzer\\ClosureAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\CommentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\DataFlowNodeData' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php', - 'Psalm\\Internal\\Analyzer\\FileAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\FunctionAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\FunctionLikeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php', - 'Psalm\\Internal\\Analyzer\\InterfaceAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\IssueData' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php', - 'Psalm\\Internal\\Analyzer\\MethodAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\MethodComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php', - 'Psalm\\Internal\\Analyzer\\NamespaceAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\ProjectAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\ScopeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\SourceAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\StatementsAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\DoAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForeachAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfConditionalAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElseAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseIfAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\IfAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\LoopAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchCaseAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\TryAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Block\\WhileAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\BreakAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\ContinueAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\EchoAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\ExpressionAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayCreationInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssertionFinder' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssignmentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\ArrayAssignmentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\AssignedProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\InstancePropertyAssignmentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\StaticPropertyAssignmentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOpAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\AndAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ArithmeticOpAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\CoalesceAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ConcatAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\NonComparisonOpAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\OrAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BitwiseNotAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BooleanNotAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentMapPopulator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentsAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArrayFunctionArgumentsAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ClassTemplateParamCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallReturnTypeFetcher' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\MethodCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicCallContext' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalysisResult' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\ExistingAtomicMethodCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallProhibitionAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallPurityAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallReturnTypeFetcher' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodVisibilityAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MissingMethodCallHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NamedFunctionCallHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NewAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\AtomicStaticCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\ExistingAtomicStaticCallAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CastAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CloneAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EmptyAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EncapsulatedStringAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EvalAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExitAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExpressionIdentifier' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ArrayFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\AtomicPropertyFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ClassConstFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ConstFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\InstancePropertyFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\StaticPropertyFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\VariableFetchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncDecExpressionAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncludeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\InstanceofAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IssetAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MagicConstAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MatchAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\NullsafeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\PrintAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\SimpleTypeInferer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\TernaryAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\UnaryPlusMinusAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldFromAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\GlobalAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\ReturnAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\StaticAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\ThrowAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\UnsetAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\Statements\\UnusedAssignmentRemover' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php', - 'Psalm\\Internal\\Analyzer\\TraitAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php', - 'Psalm\\Internal\\Analyzer\\TypeAnalyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php', - 'Psalm\\Internal\\Clause' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Clause.php', - 'Psalm\\Internal\\CliUtils' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/CliUtils.php', - 'Psalm\\Internal\\Cli\\LanguageServer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php', - 'Psalm\\Internal\\Cli\\Plugin' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php', - 'Psalm\\Internal\\Cli\\Psalm' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php', - 'Psalm\\Internal\\Cli\\Psalter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php', - 'Psalm\\Internal\\Cli\\Refactor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php', - 'Psalm\\Internal\\Codebase\\Analyzer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php', - 'Psalm\\Internal\\Codebase\\ClassConstantByWildcardResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php', - 'Psalm\\Internal\\Codebase\\ClassLikes' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php', - 'Psalm\\Internal\\Codebase\\ConstantTypeResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php', - 'Psalm\\Internal\\Codebase\\DataFlowGraph' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php', - 'Psalm\\Internal\\Codebase\\Functions' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php', - 'Psalm\\Internal\\Codebase\\InternalCallMapHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php', - 'Psalm\\Internal\\Codebase\\Methods' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php', - 'Psalm\\Internal\\Codebase\\Populator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php', - 'Psalm\\Internal\\Codebase\\Properties' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php', - 'Psalm\\Internal\\Codebase\\PropertyMap' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php', - 'Psalm\\Internal\\Codebase\\ReferenceMapGenerator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php', - 'Psalm\\Internal\\Codebase\\Reflection' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php', - 'Psalm\\Internal\\Codebase\\Scanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php', - 'Psalm\\Internal\\Codebase\\TaintFlowGraph' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php', - 'Psalm\\Internal\\Codebase\\VariableUseGraph' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php', - 'Psalm\\Internal\\Composer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Composer.php', - 'Psalm\\Internal\\DataFlow\\DataFlowNode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/DataFlow/DataFlowNode.php', - 'Psalm\\Internal\\DataFlow\\Path' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php', - 'Psalm\\Internal\\DataFlow\\TaintSink' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php', - 'Psalm\\Internal\\DataFlow\\TaintSource' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSource.php', - 'Psalm\\Internal\\Diff\\AstDiffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/AstDiffer.php', - 'Psalm\\Internal\\Diff\\ClassStatementsDiffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php', - 'Psalm\\Internal\\Diff\\DiffElem' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php', - 'Psalm\\Internal\\Diff\\FileDiffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php', - 'Psalm\\Internal\\Diff\\FileStatementsDiffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php', - 'Psalm\\Internal\\Diff\\NamespaceStatementsDiffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php', - 'Psalm\\Internal\\ErrorHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php', - 'Psalm\\Internal\\EventDispatcher' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/EventDispatcher.php', - 'Psalm\\Internal\\ExecutionEnvironment\\BuildInfoCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php', - 'Psalm\\Internal\\ExecutionEnvironment\\GitInfoCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php', - 'Psalm\\Internal\\ExecutionEnvironment\\SystemCommandExecutor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php', - 'Psalm\\Internal\\FileManipulation\\ClassDocblockManipulator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php', - 'Psalm\\Internal\\FileManipulation\\CodeMigration' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php', - 'Psalm\\Internal\\FileManipulation\\FileManipulationBuffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php', - 'Psalm\\Internal\\FileManipulation\\FunctionDocblockManipulator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php', - 'Psalm\\Internal\\FileManipulation\\PropertyDocblockManipulator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php', - 'Psalm\\Internal\\Fork\\ForkMessage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php', - 'Psalm\\Internal\\Fork\\ForkProcessDoneMessage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php', - 'Psalm\\Internal\\Fork\\ForkProcessErrorMessage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php', - 'Psalm\\Internal\\Fork\\ForkTaskDoneMessage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php', - 'Psalm\\Internal\\Fork\\Pool' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php', - 'Psalm\\Internal\\Fork\\PsalmRestarter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php', - 'Psalm\\Internal\\IncludeCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php', - 'Psalm\\Internal\\Json\\Json' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Json/Json.php', - 'Psalm\\Internal\\LanguageServer\\ClientHandler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php', - 'Psalm\\Internal\\LanguageServer\\Client\\TextDocument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Client/TextDocument.php', - 'Psalm\\Internal\\LanguageServer\\EmitterInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php', - 'Psalm\\Internal\\LanguageServer\\EmitterTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php', - 'Psalm\\Internal\\LanguageServer\\IdGenerator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php', - 'Psalm\\Internal\\LanguageServer\\LanguageClient' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php', - 'Psalm\\Internal\\LanguageServer\\LanguageServer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php', - 'Psalm\\Internal\\LanguageServer\\Message' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php', - 'Psalm\\Internal\\LanguageServer\\ProtocolReader' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php', - 'Psalm\\Internal\\LanguageServer\\ProtocolStreamReader' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php', - 'Psalm\\Internal\\LanguageServer\\ProtocolStreamWriter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php', - 'Psalm\\Internal\\LanguageServer\\ProtocolWriter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php', - 'Psalm\\Internal\\LanguageServer\\Server\\TextDocument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/TextDocument.php', - 'Psalm\\Internal\\LanguageServer\\Server\\Workspace' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php', - 'Psalm\\Internal\\MethodIdentifier' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php', - 'Psalm\\Internal\\PhpTraverser\\CustomTraverser' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php', - 'Psalm\\Internal\\PhpVisitor\\AssignmentMapVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\CheckTrivialExprVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\CloningVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\ConditionCloningVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\NodeCleanerVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\NodeCounterVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\OffsetShifterVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\ParamReplacementVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\PartialParserVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\ReflectorVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\AttributeResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeDocblockParser' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeNodeScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockParser' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeNodeScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php', - 'Psalm\\Internal\\PhpVisitor\\Reflector\\TypeHintResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php', - 'Psalm\\Internal\\PhpVisitor\\ShortClosureVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php', - 'Psalm\\Internal\\PhpVisitor\\SimpleNameResolver' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php', - 'Psalm\\Internal\\PhpVisitor\\TraitFinder' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php', - 'Psalm\\Internal\\PhpVisitor\\TypeMappingVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php', - 'Psalm\\Internal\\PluginManager\\Command\\DisableCommand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php', - 'Psalm\\Internal\\PluginManager\\Command\\EnableCommand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php', - 'Psalm\\Internal\\PluginManager\\Command\\ShowCommand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php', - 'Psalm\\Internal\\PluginManager\\ComposerLock' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php', - 'Psalm\\Internal\\PluginManager\\ConfigFile' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php', - 'Psalm\\Internal\\PluginManager\\PluginList' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php', - 'Psalm\\Internal\\PluginManager\\PluginListFactory' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php', - 'Psalm\\Internal\\Provider\\AddRemoveTaints\\HtmlFunctionTainter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php', - 'Psalm\\Internal\\Provider\\ClassLikeStorageCacheProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php', - 'Psalm\\Internal\\Provider\\ClassLikeStorageProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php', - 'Psalm\\Internal\\Provider\\FakeFileProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php', - 'Psalm\\Internal\\Provider\\FileProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php', - 'Psalm\\Internal\\Provider\\FileReferenceCacheProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php', - 'Psalm\\Internal\\Provider\\FileReferenceProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php', - 'Psalm\\Internal\\Provider\\FileStorageCacheProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php', - 'Psalm\\Internal\\Provider\\FileStorageProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php', - 'Psalm\\Internal\\Provider\\FunctionExistenceProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php', - 'Psalm\\Internal\\Provider\\FunctionParamsProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php', - 'Psalm\\Internal\\Provider\\FunctionReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\MethodExistenceProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php', - 'Psalm\\Internal\\Provider\\MethodParamsProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php', - 'Psalm\\Internal\\Provider\\MethodReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\MethodVisibilityProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php', - 'Psalm\\Internal\\Provider\\NodeDataProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php', - 'Psalm\\Internal\\Provider\\ParserCacheProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php', - 'Psalm\\Internal\\Provider\\ProjectCacheProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php', - 'Psalm\\Internal\\Provider\\PropertyExistenceProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php', - 'Psalm\\Internal\\Provider\\PropertyTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php', - 'Psalm\\Internal\\Provider\\PropertyTypeProvider\\DomDocumentPropertyTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php', - 'Psalm\\Internal\\Provider\\PropertyVisibilityProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php', - 'Psalm\\Internal\\Provider\\Providers' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayChunkReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayColumnReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFillReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFilterReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMapReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMergeReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPadReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPointerAdjustmentReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPopReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayRandReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReduceReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReverseReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySliceReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySpliceReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayUniqueReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayValuesReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ClosureFromCallableReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\DomNodeAppendChild' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ExplodeReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FilterVarReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FirstArgStringReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetClassMethodsReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetObjectVarsReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\HexdecReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ImagickPixelColorReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\InArrayReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\IteratorToArrayReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MinMaxReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MktimeReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ParseUrlReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementSetFetchMode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\RandReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\SimpleXmlElementAsXml' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrReplaceReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrTrReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\TriggerErrorReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\VersionCompareReturnTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php', - 'Psalm\\Internal\\Provider\\StatementsProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php', - 'Psalm\\Internal\\Provider\\StatementsVolatileCache' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php', - 'Psalm\\Internal\\ReferenceConstraint' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php', - 'Psalm\\Internal\\RuntimeCaches' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php', - 'Psalm\\Internal\\Scanner\\ClassLikeDocblockComment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php', - 'Psalm\\Internal\\Scanner\\DocblockParser' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php', - 'Psalm\\Internal\\Scanner\\FileScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php', - 'Psalm\\Internal\\Scanner\\FunctionDocblockComment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php', - 'Psalm\\Internal\\Scanner\\ParsedDocblock' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php', - 'Psalm\\Internal\\Scanner\\PhpStormMetaScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstantComponent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayOffsetFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArraySpread' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ClassConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\Constant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\KeyValuePair' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ScalarValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedAdditionOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBinaryOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseAnd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseOr' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseXor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedConcatOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedDivisionOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedMultiplicationOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedSubtractionOp' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php', - 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedTernary' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php', - 'Psalm\\Internal\\Scanner\\VarDocblockComment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scanner/VarDocblockComment.php', - 'Psalm\\Internal\\Scope\\CaseScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php', - 'Psalm\\Internal\\Scope\\FinallyScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php', - 'Psalm\\Internal\\Scope\\IfConditionalScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php', - 'Psalm\\Internal\\Scope\\IfScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php', - 'Psalm\\Internal\\Scope\\LoopScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php', - 'Psalm\\Internal\\Scope\\SwitchScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php', - 'Psalm\\Internal\\Stubs\\Generator\\ClassLikeStubGenerator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php', - 'Psalm\\Internal\\Stubs\\Generator\\StubsGenerator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php', - 'Psalm\\Internal\\TypeVisitor\\ContainsClassLikeVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php', - 'Psalm\\Internal\\TypeVisitor\\ContainsLiteralVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php', - 'Psalm\\Internal\\TypeVisitor\\FromDocblockSetter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php', - 'Psalm\\Internal\\TypeVisitor\\TemplateTypeCollector' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php', - 'Psalm\\Internal\\TypeVisitor\\TypeChecker' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php', - 'Psalm\\Internal\\TypeVisitor\\TypeScanner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php', - 'Psalm\\Internal\\Type\\ArrayType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php', - 'Psalm\\Internal\\Type\\AssertionReconciler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php', - 'Psalm\\Internal\\Type\\Comparator\\ArrayTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\AtomicTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\CallableTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\ClassLikeStringComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\GenericTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\IntegerRangeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\KeyedArrayComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\ScalarTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php', - 'Psalm\\Internal\\Type\\Comparator\\TypeComparisonResult' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php', - 'Psalm\\Internal\\Type\\Comparator\\UnionTypeComparator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php', - 'Psalm\\Internal\\Type\\NegatedAssertionReconciler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php', - 'Psalm\\Internal\\Type\\ParseTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php', - 'Psalm\\Internal\\Type\\ParseTreeCreator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php', - 'Psalm\\Internal\\Type\\ParseTree\\CallableParamTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\CallableTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\CallableWithReturnTypeTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\ConditionalTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\EncapsulationTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\GenericTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/GenericTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\IndexedAccessTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\IntersectionTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayPropertyTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\MethodParamTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\MethodTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\MethodWithReturnTypeTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\NullableTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/NullableTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\Root' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Root.php', - 'Psalm\\Internal\\Type\\ParseTree\\TemplateAsTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\TemplateIsTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\UnionTree' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php', - 'Psalm\\Internal\\Type\\ParseTree\\Value' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Value.php', - 'Psalm\\Internal\\Type\\SimpleAssertionReconciler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php', - 'Psalm\\Internal\\Type\\SimpleNegatedAssertionReconciler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php', - 'Psalm\\Internal\\Type\\TemplateBound' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php', - 'Psalm\\Internal\\Type\\TemplateInferredTypeReplacer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php', - 'Psalm\\Internal\\Type\\TemplateResult' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php', - 'Psalm\\Internal\\Type\\TemplateStandinTypeReplacer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php', - 'Psalm\\Internal\\Type\\TypeAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php', - 'Psalm\\Internal\\Type\\TypeAlias\\ClassTypeAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php', - 'Psalm\\Internal\\Type\\TypeAlias\\InlineTypeAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php', - 'Psalm\\Internal\\Type\\TypeAlias\\LinkableTypeAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php', - 'Psalm\\Internal\\Type\\TypeCombination' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php', - 'Psalm\\Internal\\Type\\TypeCombiner' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php', - 'Psalm\\Internal\\Type\\TypeExpander' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php', - 'Psalm\\Internal\\Type\\TypeParser' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php', - 'Psalm\\Internal\\Type\\TypeTokenizer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php', - 'Psalm\\IssueBuffer' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/IssueBuffer.php', - 'Psalm\\Issue\\AbstractInstantiation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php', - 'Psalm\\Issue\\AbstractMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/AbstractMethodCall.php', - 'Psalm\\Issue\\ArgumentIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ArgumentIssue.php', - 'Psalm\\Issue\\ArgumentTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php', - 'Psalm\\Issue\\AssignmentToVoid' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/AssignmentToVoid.php', - 'Psalm\\Issue\\CircularReference' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/CircularReference.php', - 'Psalm\\Issue\\ClassIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ClassIssue.php', - 'Psalm\\Issue\\CodeIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/CodeIssue.php', - 'Psalm\\Issue\\ComplexFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php', - 'Psalm\\Issue\\ComplexMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ComplexMethod.php', - 'Psalm\\Issue\\ConfigIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ConfigIssue.php', - 'Psalm\\Issue\\ConflictingReferenceConstraint' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ConflictingReferenceConstraint.php', - 'Psalm\\Issue\\ConstructorSignatureMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ConstructorSignatureMismatch.php', - 'Psalm\\Issue\\ContinueOutsideLoop' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ContinueOutsideLoop.php', - 'Psalm\\Issue\\DeprecatedClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedClass.php', - 'Psalm\\Issue\\DeprecatedConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedConstant.php', - 'Psalm\\Issue\\DeprecatedFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedFunction.php', - 'Psalm\\Issue\\DeprecatedInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedInterface.php', - 'Psalm\\Issue\\DeprecatedMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedMethod.php', - 'Psalm\\Issue\\DeprecatedProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedProperty.php', - 'Psalm\\Issue\\DeprecatedTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DeprecatedTrait.php', - 'Psalm\\Issue\\DocblockTypeContradiction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DocblockTypeContradiction.php', - 'Psalm\\Issue\\DuplicateArrayKey' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php', - 'Psalm\\Issue\\DuplicateClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateClass.php', - 'Psalm\\Issue\\DuplicateConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateConstant.php', - 'Psalm\\Issue\\DuplicateEnumCase' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCase.php', - 'Psalm\\Issue\\DuplicateEnumCaseValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCaseValue.php', - 'Psalm\\Issue\\DuplicateFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateFunction.php', - 'Psalm\\Issue\\DuplicateMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateMethod.php', - 'Psalm\\Issue\\DuplicateParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/DuplicateParam.php', - 'Psalm\\Issue\\EmptyArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/EmptyArrayAccess.php', - 'Psalm\\Issue\\ExtensionRequirementViolation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ExtensionRequirementViolation.php', - 'Psalm\\Issue\\FalsableReturnStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/FalsableReturnStatement.php', - 'Psalm\\Issue\\FalseOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/FalseOperand.php', - 'Psalm\\Issue\\ForbiddenCode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ForbiddenCode.php', - 'Psalm\\Issue\\ForbiddenEcho' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ForbiddenEcho.php', - 'Psalm\\Issue\\FunctionIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/FunctionIssue.php', - 'Psalm\\Issue\\IfThisIsMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php', - 'Psalm\\Issue\\ImplementationRequirementViolation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImplementationRequirementViolation.php', - 'Psalm\\Issue\\ImplementedParamTypeMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImplementedParamTypeMismatch.php', - 'Psalm\\Issue\\ImplementedReturnTypeMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImplementedReturnTypeMismatch.php', - 'Psalm\\Issue\\ImplicitToStringCast' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImplicitToStringCast.php', - 'Psalm\\Issue\\ImpureByReferenceAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureByReferenceAssignment.php', - 'Psalm\\Issue\\ImpureFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureFunctionCall.php', - 'Psalm\\Issue\\ImpureMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureMethodCall.php', - 'Psalm\\Issue\\ImpurePropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpurePropertyAssignment.php', - 'Psalm\\Issue\\ImpurePropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpurePropertyFetch.php', - 'Psalm\\Issue\\ImpureStaticProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureStaticProperty.php', - 'Psalm\\Issue\\ImpureStaticVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureStaticVariable.php', - 'Psalm\\Issue\\ImpureVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ImpureVariable.php', - 'Psalm\\Issue\\InaccessibleClassConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InaccessibleClassConstant.php', - 'Psalm\\Issue\\InaccessibleMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InaccessibleMethod.php', - 'Psalm\\Issue\\InaccessibleProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InaccessibleProperty.php', - 'Psalm\\Issue\\InterfaceInstantiation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InterfaceInstantiation.php', - 'Psalm\\Issue\\InternalClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InternalClass.php', - 'Psalm\\Issue\\InternalMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InternalMethod.php', - 'Psalm\\Issue\\InternalProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InternalProperty.php', - 'Psalm\\Issue\\InvalidArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidArgument.php', - 'Psalm\\Issue\\InvalidArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayAccess.php', - 'Psalm\\Issue\\InvalidArrayAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayAssignment.php', - 'Psalm\\Issue\\InvalidArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidArrayOffset.php', - 'Psalm\\Issue\\InvalidAttribute' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidAttribute.php', - 'Psalm\\Issue\\InvalidCast' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidCast.php', - 'Psalm\\Issue\\InvalidCatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidCatch.php', - 'Psalm\\Issue\\InvalidClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidClass.php', - 'Psalm\\Issue\\InvalidClone' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidClone.php', - 'Psalm\\Issue\\InvalidDocblock' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidDocblock.php', - 'Psalm\\Issue\\InvalidDocblockParamName' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidDocblockParamName.php', - 'Psalm\\Issue\\InvalidEnumBackingType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidEnumBackingType.php', - 'Psalm\\Issue\\InvalidEnumCaseValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidEnumCaseValue.php', - 'Psalm\\Issue\\InvalidExtendClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidExtendClass.php', - 'Psalm\\Issue\\InvalidFalsableReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidFalsableReturnType.php', - 'Psalm\\Issue\\InvalidFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidFunctionCall.php', - 'Psalm\\Issue\\InvalidGlobal' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidGlobal.php', - 'Psalm\\Issue\\InvalidIterator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidIterator.php', - 'Psalm\\Issue\\InvalidLiteralArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidLiteralArgument.php', - 'Psalm\\Issue\\InvalidMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidMethodCall.php', - 'Psalm\\Issue\\InvalidNamedArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidNamedArgument.php', - 'Psalm\\Issue\\InvalidNullableReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidNullableReturnType.php', - 'Psalm\\Issue\\InvalidOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidOperand.php', - 'Psalm\\Issue\\InvalidParamDefault' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidParamDefault.php', - 'Psalm\\Issue\\InvalidParent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidParent.php', - 'Psalm\\Issue\\InvalidPassByReference' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidPassByReference.php', - 'Psalm\\Issue\\InvalidPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignment.php', - 'Psalm\\Issue\\InvalidPropertyAssignmentValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignmentValue.php', - 'Psalm\\Issue\\InvalidPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidPropertyFetch.php', - 'Psalm\\Issue\\InvalidReturnStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidReturnStatement.php', - 'Psalm\\Issue\\InvalidReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidReturnType.php', - 'Psalm\\Issue\\InvalidScalarArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidScalarArgument.php', - 'Psalm\\Issue\\InvalidScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidScope.php', - 'Psalm\\Issue\\InvalidStaticInvocation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidStaticInvocation.php', - 'Psalm\\Issue\\InvalidStringClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidStringClass.php', - 'Psalm\\Issue\\InvalidTemplateParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidTemplateParam.php', - 'Psalm\\Issue\\InvalidThrow' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidThrow.php', - 'Psalm\\Issue\\InvalidToString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidToString.php', - 'Psalm\\Issue\\InvalidTraversableImplementation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidTraversableImplementation.php', - 'Psalm\\Issue\\InvalidTypeImport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/InvalidTypeImport.php', - 'Psalm\\Issue\\LessSpecificImplementedReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/LessSpecificImplementedReturnType.php', - 'Psalm\\Issue\\LessSpecificReturnStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnStatement.php', - 'Psalm\\Issue\\LessSpecificReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnType.php', - 'Psalm\\Issue\\LoopInvalidation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/LoopInvalidation.php', - 'Psalm\\Issue\\MethodIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MethodIssue.php', - 'Psalm\\Issue\\MethodSignatureMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php', - 'Psalm\\Issue\\MethodSignatureMustOmitReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php', - 'Psalm\\Issue\\MethodSignatureMustProvideReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php', - 'Psalm\\Issue\\MismatchingDocblockParamType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockParamType.php', - 'Psalm\\Issue\\MismatchingDocblockPropertyType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockPropertyType.php', - 'Psalm\\Issue\\MismatchingDocblockReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockReturnType.php', - 'Psalm\\Issue\\MissingClosureParamType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingClosureParamType.php', - 'Psalm\\Issue\\MissingClosureReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingClosureReturnType.php', - 'Psalm\\Issue\\MissingConstructor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingConstructor.php', - 'Psalm\\Issue\\MissingDependency' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingDependency.php', - 'Psalm\\Issue\\MissingDocblockType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingDocblockType.php', - 'Psalm\\Issue\\MissingFile' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingFile.php', - 'Psalm\\Issue\\MissingImmutableAnnotation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingImmutableAnnotation.php', - 'Psalm\\Issue\\MissingParamType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingParamType.php', - 'Psalm\\Issue\\MissingPropertyType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingPropertyType.php', - 'Psalm\\Issue\\MissingReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingReturnType.php', - 'Psalm\\Issue\\MissingTemplateParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingTemplateParam.php', - 'Psalm\\Issue\\MissingThrowsDocblock' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MissingThrowsDocblock.php', - 'Psalm\\Issue\\MixedArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArgument.php', - 'Psalm\\Issue\\MixedArgumentTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php', - 'Psalm\\Issue\\MixedArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php', - 'Psalm\\Issue\\MixedArrayAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArrayAssignment.php', - 'Psalm\\Issue\\MixedArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArrayOffset.php', - 'Psalm\\Issue\\MixedArrayTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedArrayTypeCoercion.php', - 'Psalm\\Issue\\MixedAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedAssignment.php', - 'Psalm\\Issue\\MixedClone' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedClone.php', - 'Psalm\\Issue\\MixedFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedFunctionCall.php', - 'Psalm\\Issue\\MixedInferredReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedInferredReturnType.php', - 'Psalm\\Issue\\MixedIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedIssue.php', - 'Psalm\\Issue\\MixedIssueTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedIssueTrait.php', - 'Psalm\\Issue\\MixedMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php', - 'Psalm\\Issue\\MixedOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedOperand.php', - 'Psalm\\Issue\\MixedPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyAssignment.php', - 'Psalm\\Issue\\MixedPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyFetch.php', - 'Psalm\\Issue\\MixedPropertyTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedPropertyTypeCoercion.php', - 'Psalm\\Issue\\MixedReturnStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php', - 'Psalm\\Issue\\MixedReturnTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedReturnTypeCoercion.php', - 'Psalm\\Issue\\MixedStringOffsetAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MixedStringOffsetAssignment.php', - 'Psalm\\Issue\\MoreSpecificImplementedParamType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MoreSpecificImplementedParamType.php', - 'Psalm\\Issue\\MoreSpecificReturnType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MoreSpecificReturnType.php', - 'Psalm\\Issue\\MutableDependency' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/MutableDependency.php', - 'Psalm\\Issue\\NamedArgumentNotAllowed' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NamedArgumentNotAllowed.php', - 'Psalm\\Issue\\NoEnumProperties' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NoEnumProperties.php', - 'Psalm\\Issue\\NoInterfaceProperties' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NoInterfaceProperties.php', - 'Psalm\\Issue\\NoValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NoValue.php', - 'Psalm\\Issue\\NonInvariantDocblockPropertyType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NonInvariantDocblockPropertyType.php', - 'Psalm\\Issue\\NonInvariantPropertyType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NonInvariantPropertyType.php', - 'Psalm\\Issue\\NonStaticSelfCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NonStaticSelfCall.php', - 'Psalm\\Issue\\NullArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullArgument.php', - 'Psalm\\Issue\\NullArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullArrayAccess.php', - 'Psalm\\Issue\\NullArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullArrayOffset.php', - 'Psalm\\Issue\\NullFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullFunctionCall.php', - 'Psalm\\Issue\\NullIterator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullIterator.php', - 'Psalm\\Issue\\NullOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullOperand.php', - 'Psalm\\Issue\\NullPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullPropertyAssignment.php', - 'Psalm\\Issue\\NullPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullPropertyFetch.php', - 'Psalm\\Issue\\NullReference' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullReference.php', - 'Psalm\\Issue\\NullableReturnStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/NullableReturnStatement.php', - 'Psalm\\Issue\\OverriddenMethodAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/OverriddenMethodAccess.php', - 'Psalm\\Issue\\OverriddenPropertyAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/OverriddenPropertyAccess.php', - 'Psalm\\Issue\\ParadoxicalCondition' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ParadoxicalCondition.php', - 'Psalm\\Issue\\ParamNameMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ParamNameMismatch.php', - 'Psalm\\Issue\\ParentNotFound' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ParentNotFound.php', - 'Psalm\\Issue\\ParseError' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ParseError.php', - 'Psalm\\Issue\\PluginIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PluginIssue.php', - 'Psalm\\Issue\\PossibleRawObjectIteration' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossibleRawObjectIteration.php', - 'Psalm\\Issue\\PossiblyFalseArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseArgument.php', - 'Psalm\\Issue\\PossiblyFalseIterator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseIterator.php', - 'Psalm\\Issue\\PossiblyFalseOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseOperand.php', - 'Psalm\\Issue\\PossiblyFalsePropertyAssignmentValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php', - 'Psalm\\Issue\\PossiblyFalseReference' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyFalseReference.php', - 'Psalm\\Issue\\PossiblyInvalidArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArgument.php', - 'Psalm\\Issue\\PossiblyInvalidArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAccess.php', - 'Psalm\\Issue\\PossiblyInvalidArrayAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php', - 'Psalm\\Issue\\PossiblyInvalidArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayOffset.php', - 'Psalm\\Issue\\PossiblyInvalidCast' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidCast.php', - 'Psalm\\Issue\\PossiblyInvalidClone' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidClone.php', - 'Psalm\\Issue\\PossiblyInvalidDocblockTag' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidDocblockTag.php', - 'Psalm\\Issue\\PossiblyInvalidFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidFunctionCall.php', - 'Psalm\\Issue\\PossiblyInvalidIterator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidIterator.php', - 'Psalm\\Issue\\PossiblyInvalidMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidMethodCall.php', - 'Psalm\\Issue\\PossiblyInvalidOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidOperand.php', - 'Psalm\\Issue\\PossiblyInvalidPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php', - 'Psalm\\Issue\\PossiblyInvalidPropertyAssignmentValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php', - 'Psalm\\Issue\\PossiblyInvalidPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php', - 'Psalm\\Issue\\PossiblyNullArgument' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArgument.php', - 'Psalm\\Issue\\PossiblyNullArrayAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAccess.php', - 'Psalm\\Issue\\PossiblyNullArrayAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAssignment.php', - 'Psalm\\Issue\\PossiblyNullArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayOffset.php', - 'Psalm\\Issue\\PossiblyNullFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullFunctionCall.php', - 'Psalm\\Issue\\PossiblyNullIterator' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullIterator.php', - 'Psalm\\Issue\\PossiblyNullOperand' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullOperand.php', - 'Psalm\\Issue\\PossiblyNullPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignment.php', - 'Psalm\\Issue\\PossiblyNullPropertyAssignmentValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php', - 'Psalm\\Issue\\PossiblyNullPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyFetch.php', - 'Psalm\\Issue\\PossiblyNullReference' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyNullReference.php', - 'Psalm\\Issue\\PossiblyUndefinedArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php', - 'Psalm\\Issue\\PossiblyUndefinedGlobalVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php', - 'Psalm\\Issue\\PossiblyUndefinedIntArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php', - 'Psalm\\Issue\\PossiblyUndefinedMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedMethod.php', - 'Psalm\\Issue\\PossiblyUndefinedStringArrayOffset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php', - 'Psalm\\Issue\\PossiblyUndefinedVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedVariable.php', - 'Psalm\\Issue\\PossiblyUnusedMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedMethod.php', - 'Psalm\\Issue\\PossiblyUnusedParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedParam.php', - 'Psalm\\Issue\\PossiblyUnusedProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedProperty.php', - 'Psalm\\Issue\\PossiblyUnusedReturnValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedReturnValue.php', - 'Psalm\\Issue\\PropertyIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PropertyIssue.php', - 'Psalm\\Issue\\PropertyNotSetInConstructor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php', - 'Psalm\\Issue\\PropertyTypeCoercion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php', - 'Psalm\\Issue\\PsalmInternalError' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/PsalmInternalError.php', - 'Psalm\\Issue\\RawObjectIteration' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RawObjectIteration.php', - 'Psalm\\Issue\\RedundantCast' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantCast.php', - 'Psalm\\Issue\\RedundantCastGivenDocblockType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantCastGivenDocblockType.php', - 'Psalm\\Issue\\RedundantCondition' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantCondition.php', - 'Psalm\\Issue\\RedundantConditionGivenDocblockType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php', - 'Psalm\\Issue\\RedundantFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php', - 'Psalm\\Issue\\RedundantFunctionCallGivenDocblockType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php', - 'Psalm\\Issue\\RedundantIdentityWithTrue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantIdentityWithTrue.php', - 'Psalm\\Issue\\RedundantPropertyInitializationCheck' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/RedundantPropertyInitializationCheck.php', - 'Psalm\\Issue\\ReferenceConstraintViolation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ReferenceConstraintViolation.php', - 'Psalm\\Issue\\ReservedWord' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/ReservedWord.php', - 'Psalm\\Issue\\StringIncrement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/StringIncrement.php', - 'Psalm\\Issue\\TaintedCallable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedCallable.php', - 'Psalm\\Issue\\TaintedCookie' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedCookie.php', - 'Psalm\\Issue\\TaintedCustom' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedCustom.php', - 'Psalm\\Issue\\TaintedEval' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedEval.php', - 'Psalm\\Issue\\TaintedFile' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedFile.php', - 'Psalm\\Issue\\TaintedHeader' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedHeader.php', - 'Psalm\\Issue\\TaintedHtml' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedHtml.php', - 'Psalm\\Issue\\TaintedInclude' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedInclude.php', - 'Psalm\\Issue\\TaintedInput' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedInput.php', - 'Psalm\\Issue\\TaintedLdap' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php', - 'Psalm\\Issue\\TaintedSSRF' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedSSRF.php', - 'Psalm\\Issue\\TaintedShell' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedShell.php', - 'Psalm\\Issue\\TaintedSql' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedSql.php', - 'Psalm\\Issue\\TaintedSystemSecret' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedSystemSecret.php', - 'Psalm\\Issue\\TaintedTextWithQuotes' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedTextWithQuotes.php', - 'Psalm\\Issue\\TaintedUnserialize' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedUnserialize.php', - 'Psalm\\Issue\\TaintedUserSecret' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TaintedUserSecret.php', - 'Psalm\\Issue\\TooFewArguments' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TooFewArguments.php', - 'Psalm\\Issue\\TooManyArguments' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TooManyArguments.php', - 'Psalm\\Issue\\TooManyTemplateParams' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TooManyTemplateParams.php', - 'Psalm\\Issue\\Trace' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/Trace.php', - 'Psalm\\Issue\\TraitMethodSignatureMismatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TraitMethodSignatureMismatch.php', - 'Psalm\\Issue\\TypeDoesNotContainNull' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainNull.php', - 'Psalm\\Issue\\TypeDoesNotContainType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php', - 'Psalm\\Issue\\UncaughtThrowInGlobalScope' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php', - 'Psalm\\Issue\\UndefinedAttributeClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedAttributeClass.php', - 'Psalm\\Issue\\UndefinedClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedClass.php', - 'Psalm\\Issue\\UndefinedConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedConstant.php', - 'Psalm\\Issue\\UndefinedDocblockClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedDocblockClass.php', - 'Psalm\\Issue\\UndefinedFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedFunction.php', - 'Psalm\\Issue\\UndefinedGlobalVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedGlobalVariable.php', - 'Psalm\\Issue\\UndefinedInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedInterface.php', - 'Psalm\\Issue\\UndefinedInterfaceMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedInterfaceMethod.php', - 'Psalm\\Issue\\UndefinedMagicMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicMethod.php', - 'Psalm\\Issue\\UndefinedMagicPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php', - 'Psalm\\Issue\\UndefinedMagicPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyFetch.php', - 'Psalm\\Issue\\UndefinedMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedMethod.php', - 'Psalm\\Issue\\UndefinedPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyAssignment.php', - 'Psalm\\Issue\\UndefinedPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyFetch.php', - 'Psalm\\Issue\\UndefinedThisPropertyAssignment' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyAssignment.php', - 'Psalm\\Issue\\UndefinedThisPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyFetch.php', - 'Psalm\\Issue\\UndefinedTrace' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedTrace.php', - 'Psalm\\Issue\\UndefinedTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedTrait.php', - 'Psalm\\Issue\\UndefinedVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UndefinedVariable.php', - 'Psalm\\Issue\\UnevaluatedCode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnevaluatedCode.php', - 'Psalm\\Issue\\UnhandledMatchCondition' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnhandledMatchCondition.php', - 'Psalm\\Issue\\UnimplementedAbstractMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnimplementedAbstractMethod.php', - 'Psalm\\Issue\\UnimplementedInterfaceMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnimplementedInterfaceMethod.php', - 'Psalm\\Issue\\UninitializedProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UninitializedProperty.php', - 'Psalm\\Issue\\UnnecessaryVarAnnotation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnnecessaryVarAnnotation.php', - 'Psalm\\Issue\\UnrecognizedExpression' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnrecognizedExpression.php', - 'Psalm\\Issue\\UnrecognizedStatement' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnrecognizedStatement.php', - 'Psalm\\Issue\\UnresolvableInclude' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnresolvableInclude.php', - 'Psalm\\Issue\\UnsafeGenericInstantiation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnsafeGenericInstantiation.php', - 'Psalm\\Issue\\UnsafeInstantiation' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnsafeInstantiation.php', - 'Psalm\\Issue\\UnusedClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedClass.php', - 'Psalm\\Issue\\UnusedClosureParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedClosureParam.php', - 'Psalm\\Issue\\UnusedConstructor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedConstructor.php', - 'Psalm\\Issue\\UnusedForeachValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedForeachValue.php', - 'Psalm\\Issue\\UnusedFunctionCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedFunctionCall.php', - 'Psalm\\Issue\\UnusedMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedMethod.php', - 'Psalm\\Issue\\UnusedMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedMethodCall.php', - 'Psalm\\Issue\\UnusedParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedParam.php', - 'Psalm\\Issue\\UnusedProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedProperty.php', - 'Psalm\\Issue\\UnusedPsalmSuppress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedPsalmSuppress.php', - 'Psalm\\Issue\\UnusedReturnValue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedReturnValue.php', - 'Psalm\\Issue\\UnusedVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/UnusedVariable.php', - 'Psalm\\Issue\\VariableIssue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Issue/VariableIssue.php', - 'Psalm\\NodeTypeProvider' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/NodeTypeProvider.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseAnd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseOr' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseXor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualCoalesce' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualConcat' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualDiv' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualMinus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualMod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMod.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualMul' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMul.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualPlus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualPow' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPow.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftLeft' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php', - 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftRight' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseAnd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseOr' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseXor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanAnd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanOr' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualCoalesce' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualConcat' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualDiv' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualEqual' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreater' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreaterOrEqual' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualIdentical' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalAnd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalOr' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalXor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMinus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMul' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotEqual' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotIdentical' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPlus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPow' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftLeft' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftRight' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmaller' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmallerOrEqual' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php', - 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSpaceship' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualArray.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualBool' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualBool.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualDouble' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualDouble.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualInt' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualInt.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualObject' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualObject.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualString.php', - 'Psalm\\Node\\Expr\\Cast\\VirtualUnset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualUnset.php', - 'Psalm\\Node\\Expr\\VirtualArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArray.php', - 'Psalm\\Node\\Expr\\VirtualArrayDimFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayDimFetch.php', - 'Psalm\\Node\\Expr\\VirtualArrayItem' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayItem.php', - 'Psalm\\Node\\Expr\\VirtualArrowFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrowFunction.php', - 'Psalm\\Node\\Expr\\VirtualAssign' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssign.php', - 'Psalm\\Node\\Expr\\VirtualAssignRef' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssignRef.php', - 'Psalm\\Node\\Expr\\VirtualBitwiseNot' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualBitwiseNot.php', - 'Psalm\\Node\\Expr\\VirtualBooleanNot' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualBooleanNot.php', - 'Psalm\\Node\\Expr\\VirtualClassConstFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClassConstFetch.php', - 'Psalm\\Node\\Expr\\VirtualClone' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClone.php', - 'Psalm\\Node\\Expr\\VirtualClosure' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosure.php', - 'Psalm\\Node\\Expr\\VirtualClosureUse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosureUse.php', - 'Psalm\\Node\\Expr\\VirtualConstFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualConstFetch.php', - 'Psalm\\Node\\Expr\\VirtualEmpty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualEmpty.php', - 'Psalm\\Node\\Expr\\VirtualError' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualError.php', - 'Psalm\\Node\\Expr\\VirtualErrorSuppress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualErrorSuppress.php', - 'Psalm\\Node\\Expr\\VirtualEval' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualEval.php', - 'Psalm\\Node\\Expr\\VirtualExit' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualExit.php', - 'Psalm\\Node\\Expr\\VirtualFuncCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualFuncCall.php', - 'Psalm\\Node\\Expr\\VirtualInclude' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualInclude.php', - 'Psalm\\Node\\Expr\\VirtualInstanceof' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualInstanceof.php', - 'Psalm\\Node\\Expr\\VirtualIsset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualIsset.php', - 'Psalm\\Node\\Expr\\VirtualList' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualList.php', - 'Psalm\\Node\\Expr\\VirtualMatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualMatch.php', - 'Psalm\\Node\\Expr\\VirtualMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualMethodCall.php', - 'Psalm\\Node\\Expr\\VirtualNew' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNew.php', - 'Psalm\\Node\\Expr\\VirtualNullsafeMethodCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php', - 'Psalm\\Node\\Expr\\VirtualNullsafePropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php', - 'Psalm\\Node\\Expr\\VirtualPostDec' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostDec.php', - 'Psalm\\Node\\Expr\\VirtualPostInc' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostInc.php', - 'Psalm\\Node\\Expr\\VirtualPreDec' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreDec.php', - 'Psalm\\Node\\Expr\\VirtualPreInc' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreInc.php', - 'Psalm\\Node\\Expr\\VirtualPrint' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPrint.php', - 'Psalm\\Node\\Expr\\VirtualPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualPropertyFetch.php', - 'Psalm\\Node\\Expr\\VirtualShellExec' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualShellExec.php', - 'Psalm\\Node\\Expr\\VirtualStaticCall' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticCall.php', - 'Psalm\\Node\\Expr\\VirtualStaticPropertyFetch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php', - 'Psalm\\Node\\Expr\\VirtualTernary' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualTernary.php', - 'Psalm\\Node\\Expr\\VirtualThrow' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualThrow.php', - 'Psalm\\Node\\Expr\\VirtualUnaryMinus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryMinus.php', - 'Psalm\\Node\\Expr\\VirtualUnaryPlus' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryPlus.php', - 'Psalm\\Node\\Expr\\VirtualVariable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualVariable.php', - 'Psalm\\Node\\Expr\\VirtualYield' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualYield.php', - 'Psalm\\Node\\Expr\\VirtualYieldFrom' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Expr/VirtualYieldFrom.php', - 'Psalm\\Node\\Name\\VirtualFullyQualified' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Name/VirtualFullyQualified.php', - 'Psalm\\Node\\Name\\VirtualRelative' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Name/VirtualRelative.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualDir' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFile' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualLine' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualNamespace' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php', - 'Psalm\\Node\\Scalar\\MagicConst\\VirtualTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php', - 'Psalm\\Node\\Scalar\\VirtualDNumber' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualDNumber.php', - 'Psalm\\Node\\Scalar\\VirtualEncapsed' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsed.php', - 'Psalm\\Node\\Scalar\\VirtualEncapsedStringPart' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php', - 'Psalm\\Node\\Scalar\\VirtualLNumber' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualLNumber.php', - 'Psalm\\Node\\Scalar\\VirtualString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Scalar/VirtualString.php', - 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php', - 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualPrecedence' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php', - 'Psalm\\Node\\Stmt\\VirtualBreak' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualBreak.php', - 'Psalm\\Node\\Stmt\\VirtualCase' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCase.php', - 'Psalm\\Node\\Stmt\\VirtualCatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCatch.php', - 'Psalm\\Node\\Stmt\\VirtualClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClass.php', - 'Psalm\\Node\\Stmt\\VirtualClassConst' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassConst.php', - 'Psalm\\Node\\Stmt\\VirtualClassMethod' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassMethod.php', - 'Psalm\\Node\\Stmt\\VirtualConst' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualConst.php', - 'Psalm\\Node\\Stmt\\VirtualContinue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualContinue.php', - 'Psalm\\Node\\Stmt\\VirtualDeclare' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclare.php', - 'Psalm\\Node\\Stmt\\VirtualDeclareDeclare' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php', - 'Psalm\\Node\\Stmt\\VirtualDo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDo.php', - 'Psalm\\Node\\Stmt\\VirtualEcho' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualEcho.php', - 'Psalm\\Node\\Stmt\\VirtualElse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElse.php', - 'Psalm\\Node\\Stmt\\VirtualElseIf' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElseIf.php', - 'Psalm\\Node\\Stmt\\VirtualExpression' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualExpression.php', - 'Psalm\\Node\\Stmt\\VirtualFinally' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFinally.php', - 'Psalm\\Node\\Stmt\\VirtualFor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFor.php', - 'Psalm\\Node\\Stmt\\VirtualForeach' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualForeach.php', - 'Psalm\\Node\\Stmt\\VirtualFunction' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFunction.php', - 'Psalm\\Node\\Stmt\\VirtualGlobal' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGlobal.php', - 'Psalm\\Node\\Stmt\\VirtualGoto' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGoto.php', - 'Psalm\\Node\\Stmt\\VirtualGroupUse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGroupUse.php', - 'Psalm\\Node\\Stmt\\VirtualHaltCompiler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualHaltCompiler.php', - 'Psalm\\Node\\Stmt\\VirtualIf' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualIf.php', - 'Psalm\\Node\\Stmt\\VirtualInlineHTML' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInlineHTML.php', - 'Psalm\\Node\\Stmt\\VirtualInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInterface.php', - 'Psalm\\Node\\Stmt\\VirtualLabel' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualLabel.php', - 'Psalm\\Node\\Stmt\\VirtualNamespace' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNamespace.php', - 'Psalm\\Node\\Stmt\\VirtualNop' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNop.php', - 'Psalm\\Node\\Stmt\\VirtualProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualProperty.php', - 'Psalm\\Node\\Stmt\\VirtualPropertyProperty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualPropertyProperty.php', - 'Psalm\\Node\\Stmt\\VirtualReturn' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualReturn.php', - 'Psalm\\Node\\Stmt\\VirtualStatic' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStatic.php', - 'Psalm\\Node\\Stmt\\VirtualStaticVar' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStaticVar.php', - 'Psalm\\Node\\Stmt\\VirtualSwitch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualSwitch.php', - 'Psalm\\Node\\Stmt\\VirtualThrow' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualThrow.php', - 'Psalm\\Node\\Stmt\\VirtualTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTrait.php', - 'Psalm\\Node\\Stmt\\VirtualTraitUse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTraitUse.php', - 'Psalm\\Node\\Stmt\\VirtualTryCatch' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTryCatch.php', - 'Psalm\\Node\\Stmt\\VirtualUnset' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUnset.php', - 'Psalm\\Node\\Stmt\\VirtualUse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUse.php', - 'Psalm\\Node\\Stmt\\VirtualUseUse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUseUse.php', - 'Psalm\\Node\\Stmt\\VirtualWhile' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/Stmt/VirtualWhile.php', - 'Psalm\\Node\\VirtualArg' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualArg.php', - 'Psalm\\Node\\VirtualAttribute' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualAttribute.php', - 'Psalm\\Node\\VirtualAttributeGroup' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualAttributeGroup.php', - 'Psalm\\Node\\VirtualConst' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualConst.php', - 'Psalm\\Node\\VirtualIdentifier' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualIdentifier.php', - 'Psalm\\Node\\VirtualMatchArm' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualMatchArm.php', - 'Psalm\\Node\\VirtualName' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualName.php', - 'Psalm\\Node\\VirtualNode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualNode.php', - 'Psalm\\Node\\VirtualNullableType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualNullableType.php', - 'Psalm\\Node\\VirtualParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualParam.php', - 'Psalm\\Node\\VirtualUnionType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualUnionType.php', - 'Psalm\\Node\\VirtualVarLikeIdentifier' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Node/VirtualVarLikeIdentifier.php', - 'Psalm\\PluginRegistrationSocket' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php', - 'Psalm\\Plugin\\EventHandler\\AddTaintsInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterClassLikeAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterClassLikeExistenceCheckInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterClassLikeVisitInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterCodebasePopulatedInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterEveryFunctionCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterExpressionAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterFileAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterFunctionCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterFunctionLikeAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterMethodCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\AfterStatementAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\BeforeFileAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AddRemoveTaintsEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeExistenceCheckEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeVisitEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterCodebasePopulatedEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterEveryFunctionCallAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterExpressionAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterFileAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionCallAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionLikeAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterMethodCallAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\AfterStatementAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\BeforeFileAnalysisEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\FunctionExistenceProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\FunctionParamsProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\FunctionReturnTypeProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\MethodExistenceProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\MethodParamsProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\MethodReturnTypeProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\MethodVisibilityProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\PropertyExistenceProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\PropertyTypeProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\PropertyVisibilityProviderEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php', - 'Psalm\\Plugin\\EventHandler\\Event\\StringInterpreterEvent' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php', - 'Psalm\\Plugin\\EventHandler\\FunctionExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\FunctionParamsProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\FunctionReturnTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\MethodExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\MethodParamsProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\MethodReturnTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\MethodVisibilityProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\PropertyExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\PropertyTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\PropertyVisibilityProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php', - 'Psalm\\Plugin\\EventHandler\\RemoveTaintsInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php', - 'Psalm\\Plugin\\EventHandler\\StringInterpreterInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php', - 'Psalm\\Plugin\\Hook\\AfterAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterClassLikeAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterClassLikeExistenceCheckInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeExistenceCheckInterface.php', - 'Psalm\\Plugin\\Hook\\AfterClassLikeVisitInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeVisitInterface.php', - 'Psalm\\Plugin\\Hook\\AfterCodebasePopulatedInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterCodebasePopulatedInterface.php', - 'Psalm\\Plugin\\Hook\\AfterEveryFunctionCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterEveryFunctionCallAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterExpressionAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterExpressionAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterFileAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFileAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterFunctionCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionCallAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterFunctionLikeAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionLikeAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterMethodCallAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterMethodCallAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\AfterStatementAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/AfterStatementAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\BeforeFileAnalysisInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/BeforeFileAnalysisInterface.php', - 'Psalm\\Plugin\\Hook\\FunctionExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionExistenceProviderInterface.php', - 'Psalm\\Plugin\\Hook\\FunctionParamsProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php', - 'Psalm\\Plugin\\Hook\\FunctionReturnTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php', - 'Psalm\\Plugin\\Hook\\MethodExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php', - 'Psalm\\Plugin\\Hook\\MethodParamsProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php', - 'Psalm\\Plugin\\Hook\\MethodReturnTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php', - 'Psalm\\Plugin\\Hook\\MethodVisibilityProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php', - 'Psalm\\Plugin\\Hook\\PropertyExistenceProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php', - 'Psalm\\Plugin\\Hook\\PropertyTypeProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php', - 'Psalm\\Plugin\\Hook\\PropertyVisibilityProviderInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php', - 'Psalm\\Plugin\\Hook\\StringInterpreterInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php', - 'Psalm\\Plugin\\PluginEntryPointInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/PluginEntryPointInterface.php', - 'Psalm\\Plugin\\RegistrationInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/RegistrationInterface.php', - 'Psalm\\Plugin\\Shepherd' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Plugin/Shepherd.php', - 'Psalm\\Progress\\DebugProgress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Progress/DebugProgress.php', - 'Psalm\\Progress\\DefaultProgress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php', - 'Psalm\\Progress\\LongProgress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Progress/LongProgress.php', - 'Psalm\\Progress\\Progress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Progress/Progress.php', - 'Psalm\\Progress\\VoidProgress' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Progress/VoidProgress.php', - 'Psalm\\Report' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report.php', - 'Psalm\\Report\\CheckstyleReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php', - 'Psalm\\Report\\CodeClimateReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php', - 'Psalm\\Report\\CompactReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/CompactReport.php', - 'Psalm\\Report\\ConsoleReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/ConsoleReport.php', - 'Psalm\\Report\\CountReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/CountReport.php', - 'Psalm\\Report\\EmacsReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/EmacsReport.php', - 'Psalm\\Report\\GithubActionsReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php', - 'Psalm\\Report\\JsonReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/JsonReport.php', - 'Psalm\\Report\\JsonSummaryReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php', - 'Psalm\\Report\\JunitReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/JunitReport.php', - 'Psalm\\Report\\PhpStormReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/PhpStormReport.php', - 'Psalm\\Report\\PylintReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/PylintReport.php', - 'Psalm\\Report\\ReportOptions' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/ReportOptions.php', - 'Psalm\\Report\\SarifReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/SarifReport.php', - 'Psalm\\Report\\SonarqubeReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php', - 'Psalm\\Report\\TextReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/TextReport.php', - 'Psalm\\Report\\XmlReport' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Report/XmlReport.php', - 'Psalm\\SourceControl\\Git\\CommitInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php', - 'Psalm\\SourceControl\\Git\\GitInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php', - 'Psalm\\SourceControl\\Git\\RemoteInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php', - 'Psalm\\SourceControl\\SourceControlInfo' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php', - 'Psalm\\StatementsSource' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/StatementsSource.php', - 'Psalm\\Storage\\Assertion' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/Assertion.php', - 'Psalm\\Storage\\AttributeArg' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/AttributeArg.php', - 'Psalm\\Storage\\AttributeStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php', - 'Psalm\\Storage\\ClassConstantStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php', - 'Psalm\\Storage\\ClassLikeStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php', - 'Psalm\\Storage\\CustomMetadataTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php', - 'Psalm\\Storage\\EnumCaseStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php', - 'Psalm\\Storage\\FileStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/FileStorage.php', - 'Psalm\\Storage\\FunctionLikeParameter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php', - 'Psalm\\Storage\\FunctionLikeStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php', - 'Psalm\\Storage\\FunctionStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php', - 'Psalm\\Storage\\HasAttributesInterface' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php', - 'Psalm\\Storage\\MethodStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/MethodStorage.php', - 'Psalm\\Storage\\PropertyStorage' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php', - 'Psalm\\Type' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type.php', - 'Psalm\\Type\\Atomic' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic.php', - 'Psalm\\Type\\Atomic\\CallableTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php', - 'Psalm\\Type\\Atomic\\DependentType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php', - 'Psalm\\Type\\Atomic\\GenericTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/GenericTrait.php', - 'Psalm\\Type\\Atomic\\HasIntersectionTrait' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php', - 'Psalm\\Type\\Atomic\\Scalar' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php', - 'Psalm\\Type\\Atomic\\TAnonymousClassInstance' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TAnonymousClassInstance.php', - 'Psalm\\Type\\Atomic\\TArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php', - 'Psalm\\Type\\Atomic\\TArrayKey' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php', - 'Psalm\\Type\\Atomic\\TAssertionFalsy' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php', - 'Psalm\\Type\\Atomic\\TBool' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php', - 'Psalm\\Type\\Atomic\\TCallable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php', - 'Psalm\\Type\\Atomic\\TCallableArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php', - 'Psalm\\Type\\Atomic\\TCallableKeyedArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableKeyedArray.php', - 'Psalm\\Type\\Atomic\\TCallableList' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableList.php', - 'Psalm\\Type\\Atomic\\TCallableObject' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableObject.php', - 'Psalm\\Type\\Atomic\\TCallableString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php', - 'Psalm\\Type\\Atomic\\TClassConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php', - 'Psalm\\Type\\Atomic\\TClassString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php', - 'Psalm\\Type\\Atomic\\TClassStringMap' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php', - 'Psalm\\Type\\Atomic\\TClosedResource' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php', - 'Psalm\\Type\\Atomic\\TClosure' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php', - 'Psalm\\Type\\Atomic\\TConditional' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php', - 'Psalm\\Type\\Atomic\\TDependentGetClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php', - 'Psalm\\Type\\Atomic\\TDependentGetDebugType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php', - 'Psalm\\Type\\Atomic\\TDependentGetType' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php', - 'Psalm\\Type\\Atomic\\TDependentListKey' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php', - 'Psalm\\Type\\Atomic\\TEmpty' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php', - 'Psalm\\Type\\Atomic\\TEmptyMixed' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php', - 'Psalm\\Type\\Atomic\\TEmptyNumeric' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyNumeric.php', - 'Psalm\\Type\\Atomic\\TEmptyScalar' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyScalar.php', - 'Psalm\\Type\\Atomic\\TEnumCase' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TEnumCase.php', - 'Psalm\\Type\\Atomic\\TFalse' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php', - 'Psalm\\Type\\Atomic\\TFloat' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TFloat.php', - 'Psalm\\Type\\Atomic\\TGenericObject' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php', - 'Psalm\\Type\\Atomic\\THtmlEscapedString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php', - 'Psalm\\Type\\Atomic\\TInt' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php', - 'Psalm\\Type\\Atomic\\TIntMask' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php', - 'Psalm\\Type\\Atomic\\TIntMaskOf' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php', - 'Psalm\\Type\\Atomic\\TIntRange' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php', - 'Psalm\\Type\\Atomic\\TIterable' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php', - 'Psalm\\Type\\Atomic\\TKeyOfClassConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php', - 'Psalm\\Type\\Atomic\\TKeyedArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php', - 'Psalm\\Type\\Atomic\\TList' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TList.php', - 'Psalm\\Type\\Atomic\\TLiteralClassString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php', - 'Psalm\\Type\\Atomic\\TLiteralFloat' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php', - 'Psalm\\Type\\Atomic\\TLiteralInt' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php', - 'Psalm\\Type\\Atomic\\TLiteralString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php', - 'Psalm\\Type\\Atomic\\TLowercaseString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php', - 'Psalm\\Type\\Atomic\\TMixed' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TMixed.php', - 'Psalm\\Type\\Atomic\\TNamedObject' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php', - 'Psalm\\Type\\Atomic\\TNever' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php', - 'Psalm\\Type\\Atomic\\TNonEmptyArray' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php', - 'Psalm\\Type\\Atomic\\TNonEmptyList' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php', - 'Psalm\\Type\\Atomic\\TNonEmptyLowercaseString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php', - 'Psalm\\Type\\Atomic\\TNonEmptyMixed' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyMixed.php', - 'Psalm\\Type\\Atomic\\TNonEmptyNonspecificLiteralString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php', - 'Psalm\\Type\\Atomic\\TNonEmptyScalar' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyScalar.php', - 'Psalm\\Type\\Atomic\\TNonEmptyString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyString.php', - 'Psalm\\Type\\Atomic\\TNonFalsyString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonFalsyString.php', - 'Psalm\\Type\\Atomic\\TNonspecificLiteralInt' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php', - 'Psalm\\Type\\Atomic\\TNonspecificLiteralString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralString.php', - 'Psalm\\Type\\Atomic\\TNull' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNull.php', - 'Psalm\\Type\\Atomic\\TNumeric' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php', - 'Psalm\\Type\\Atomic\\TNumericString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php', - 'Psalm\\Type\\Atomic\\TObject' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php', - 'Psalm\\Type\\Atomic\\TObjectWithProperties' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php', - 'Psalm\\Type\\Atomic\\TPositiveInt' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php', - 'Psalm\\Type\\Atomic\\TResource' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php', - 'Psalm\\Type\\Atomic\\TScalar' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php', - 'Psalm\\Type\\Atomic\\TSingleLetter' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php', - 'Psalm\\Type\\Atomic\\TString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TString.php', - 'Psalm\\Type\\Atomic\\TTemplateIndexedAccess' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php', - 'Psalm\\Type\\Atomic\\TTemplateKeyOf' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php', - 'Psalm\\Type\\Atomic\\TTemplateParam' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php', - 'Psalm\\Type\\Atomic\\TTemplateParamClass' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php', - 'Psalm\\Type\\Atomic\\TTraitString' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php', - 'Psalm\\Type\\Atomic\\TTrue' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php', - 'Psalm\\Type\\Atomic\\TTypeAlias' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TTypeAlias.php', - 'Psalm\\Type\\Atomic\\TValueOfClassConstant' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php', - 'Psalm\\Type\\Atomic\\TVoid' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php', - 'Psalm\\Type\\NodeVisitor' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/NodeVisitor.php', - 'Psalm\\Type\\Reconciler' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Reconciler.php', - 'Psalm\\Type\\TaintKind' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/TaintKind.php', - 'Psalm\\Type\\TaintKindGroup' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/TaintKindGroup.php', - 'Psalm\\Type\\TypeNode' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/TypeNode.php', - 'Psalm\\Type\\Union' => __DIR__ . '/..' . '/vimeo/psalm/src/Psalm/Type/Union.php', 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', 'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', - 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php', - 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php', - 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php', - 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php', - 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php', - 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php', - 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php', - 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', - 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php', - 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', - 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php', - 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', - 'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', - 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', - 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', - 'SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', - 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', - 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', 'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', @@ -1890,108 +188,6 @@ class ComposerStaticInit2723bf3c902a907c44396c9253500aff 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - 'Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', - 'Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php', - 'Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', - 'Webmozart\\PathUtil\\Path' => __DIR__ . '/..' . '/webmozart/path-util/src/Path.php', - 'Webmozart\\PathUtil\\Url' => __DIR__ . '/..' . '/webmozart/path-util/src/Url.php', - 'XdgBaseDir\\Xdg' => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src/Xdg.php', - 'phpDocumentor\\Reflection\\DocBlock' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock.php', - 'phpDocumentor\\Reflection\\DocBlockFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', - 'phpDocumentor\\Reflection\\DocBlockFactoryInterface' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', - 'phpDocumentor\\Reflection\\DocBlock\\Description' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', - 'phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', - 'phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', - 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', - 'phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', - 'phpDocumentor\\Reflection\\DocBlock\\TagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', - 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', - 'phpDocumentor\\Reflection\\Element' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Element.php', - 'phpDocumentor\\Reflection\\Exception\\PcreException' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', - 'phpDocumentor\\Reflection\\File' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/File.php', - 'phpDocumentor\\Reflection\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Fqsen.php', - 'phpDocumentor\\Reflection\\FqsenResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/FqsenResolver.php', - 'phpDocumentor\\Reflection\\Location' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Location.php', - 'phpDocumentor\\Reflection\\Project' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Project.php', - 'phpDocumentor\\Reflection\\ProjectFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/ProjectFactory.php', - 'phpDocumentor\\Reflection\\PseudoType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoType.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\False_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\List_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/List_.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php', - 'phpDocumentor\\Reflection\\PseudoTypes\\True_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', - 'phpDocumentor\\Reflection\\Type' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Type.php', - 'phpDocumentor\\Reflection\\TypeResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/TypeResolver.php', - 'phpDocumentor\\Reflection\\Types\\AbstractList' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', - 'phpDocumentor\\Reflection\\Types\\AggregatedType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', - 'phpDocumentor\\Reflection\\Types\\ArrayKey' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ArrayKey.php', - 'phpDocumentor\\Reflection\\Types\\Array_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Array_.php', - 'phpDocumentor\\Reflection\\Types\\Boolean' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Boolean.php', - 'phpDocumentor\\Reflection\\Types\\Callable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Callable_.php', - 'phpDocumentor\\Reflection\\Types\\ClassString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ClassString.php', - 'phpDocumentor\\Reflection\\Types\\Collection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Collection.php', - 'phpDocumentor\\Reflection\\Types\\Compound' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Compound.php', - 'phpDocumentor\\Reflection\\Types\\Context' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Context.php', - 'phpDocumentor\\Reflection\\Types\\ContextFactory' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', - 'phpDocumentor\\Reflection\\Types\\Expression' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Expression.php', - 'phpDocumentor\\Reflection\\Types\\Float_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Float_.php', - 'phpDocumentor\\Reflection\\Types\\Integer' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Integer.php', - 'phpDocumentor\\Reflection\\Types\\InterfaceString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/InterfaceString.php', - 'phpDocumentor\\Reflection\\Types\\Intersection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Intersection.php', - 'phpDocumentor\\Reflection\\Types\\Iterable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', - 'phpDocumentor\\Reflection\\Types\\Mixed_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', - 'phpDocumentor\\Reflection\\Types\\Never_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Never_.php', - 'phpDocumentor\\Reflection\\Types\\Null_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Null_.php', - 'phpDocumentor\\Reflection\\Types\\Nullable' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Nullable.php', - 'phpDocumentor\\Reflection\\Types\\Object_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Object_.php', - 'phpDocumentor\\Reflection\\Types\\Parent_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Parent_.php', - 'phpDocumentor\\Reflection\\Types\\Resource_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Resource_.php', - 'phpDocumentor\\Reflection\\Types\\Scalar' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Scalar.php', - 'phpDocumentor\\Reflection\\Types\\Self_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Self_.php', - 'phpDocumentor\\Reflection\\Types\\Static_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Static_.php', - 'phpDocumentor\\Reflection\\Types\\String_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/String_.php', - 'phpDocumentor\\Reflection\\Types\\This' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/This.php', - 'phpDocumentor\\Reflection\\Types\\Void_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Void_.php', - 'phpDocumentor\\Reflection\\Utils' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Utils.php', ); public static function getInitializer(ClassLoader $loader) @@ -1999,7 +195,6 @@ public static function getInitializer(ClassLoader $loader) return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$prefixDirsPsr4; - $loader->prefixesPsr0 = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$prefixesPsr0; $loader->classMap = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$classMap; }, null, ClassLoader::class); diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 517a6b61..9a4c150e 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,1013 +1,53 @@ { "packages": [ { - "name": "amphp/amp", - "version": "v2.6.2", - "version_normalized": "2.6.2.0", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^7 | ^8 | ^9", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" - }, - "time": "2022-02-20T17:52:18+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ], - "psr-4": { - "Amp\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "install-path": "../amphp/amp" - }, - { - "name": "amphp/byte-stream", - "version": "v1.8.1", - "version_normalized": "1.8.1.0", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.4", - "friendsofphp/php-cs-fixer": "^2.3", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6 || ^7 || ^8", - "psalm/phar": "^3.11.4" - }, - "time": "2021-03-30T17:13:30+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "lib/functions.php" - ], - "psr-4": { - "Amp\\ByteStream\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "install-path": "../amphp/byte-stream" - }, - { - "name": "bamarni/composer-bin-plugin", - "version": "v1.5.0", - "version_normalized": "1.5.0.0", - "source": { - "type": "git", - "url": "https://github.com/bamarni/composer-bin-plugin.git", - "reference": "49934ffea764864788334c1485fbb08a4b852031" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/49934ffea764864788334c1485fbb08a4b852031", - "reference": "49934ffea764864788334c1485fbb08a4b852031", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": "^5.5.9 || ^7.0 || ^8.0" - }, - "require-dev": { - "composer/composer": "^1.0 || ^2.0", - "symfony/console": "^2.5 || ^3.0 || ^4.0" - }, - "time": "2022-02-22T21:01:25+00:00", - "type": "composer-plugin", - "extra": { - "class": "Bamarni\\Composer\\Bin\\Plugin" - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Bamarni\\Composer\\Bin\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "No conflicts for your bin dependencies", - "keywords": [ - "composer", - "conflict", - "dependency", - "executable", - "isolation", - "tool" - ], - "install-path": "../bamarni/composer-bin-plugin" - }, - { - "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.0.0", - "version_normalized": "3.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "time": "2022-02-25T20:21:48+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" - }, - "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": "./pcre" - }, - { - "name": "composer/semver", - "version": "3.3.2", - "version_normalized": "3.3.2.0", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "time": "2022-04-01T19:23:25+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "install-path": "./semver" - }, - { - "name": "composer/xdebug-handler", - "version": "3.0.3", - "version_normalized": "3.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", - "shasum": "" - }, - "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" - }, - "time": "2022-02-25T21:32:43+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "install-path": "./xdebug-handler" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "version_normalized": "0.1.1.0", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "time": "2019-12-04T15:06:13+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "install-path": "../dnoegel/php-xdg-base-dir" - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", - "version_normalized": "3.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" - }, - "time": "2021-06-11T22:34:44+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" - }, - "install-path": "../felixfbecker/advanced-json-rpc" - }, - { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", - "version_normalized": "1.5.2.0", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" - }, - "time": "2022-03-02T22:36:06+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "LanguageServerProtocol\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "PHP classes for the Language Server Protocol", - "keywords": [ - "language", - "microsoft", - "php", - "server" - ], - "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" - }, - "install-path": "../felixfbecker/language-server-protocol" - }, - { - "name": "netresearch/jsonmapper", - "version": "v4.0.0", - "version_normalized": "4.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "time": "2020-12-01T19:48:11+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" - }, - "install-path": "../netresearch/jsonmapper" - }, - { - "name": "nikic/php-parser", - "version": "v4.14.0", - "version_normalized": "4.14.0.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "time": "2022-05-31T20:59:12+00:00", - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" - }, - "install-path": "../nikic/php-parser" - }, - { - "name": "openlss/lib-array2xml", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/nullivex/lib-array2xml.git", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "time": "2019-03-29T20:06:56+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "LSS": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Bryan Tong", - "email": "bryan@nullivex.com", - "homepage": "https://www.nullivex.com" - }, - { - "name": "Tony Butler", - "email": "spudz76@gmail.com", - "homepage": "https://www.nullivex.com" - } - ], - "description": "Array2XML conversion library credit to lalit.org", - "homepage": "https://www.nullivex.com", - "keywords": [ - "array", - "array conversion", - "xml", - "xml conversion" - ], - "support": { - "issues": "https://github.com/nullivex/lib-array2xml/issues", - "source": "https://github.com/nullivex/lib-array2xml/tree/master" - }, - "install-path": "../openlss/lib-array2xml" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "version_normalized": "2.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "time": "2020-06-27T09:03:43+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "install-path": "../phpdocumentor/reflection-common" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "version_normalized": "5.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "time": "2021-10-19T17:43:47+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "installation-source": "dist", - "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.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "install-path": "../phpdocumentor/reflection-docblock" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "version_normalized": "1.6.1.0", + "name": "bamarni/composer-bin-plugin", + "version": "v1.5.0", + "version_normalized": "1.5.0.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" + "url": "https://github.com/bamarni/composer-bin-plugin.git", + "reference": "49934ffea764864788334c1485fbb08a4b852031" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", + "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/49934ffea764864788334c1485fbb08a4b852031", + "reference": "49934ffea764864788334c1485fbb08a4b852031", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "composer-plugin-api": "^1.0 || ^2.0", + "php": "^5.5.9 || ^7.0 || ^8.0" }, "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" + "composer/composer": "^1.0 || ^2.0", + "symfony/console": "^2.5 || ^3.0 || ^4.0" }, - "time": "2022-03-15T21:29:03+00:00", - "type": "library", + "time": "2022-02-22T21:01:25+00:00", + "type": "composer-plugin", "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } + "class": "Bamarni\\Composer\\Bin\\Plugin" }, "installation-source": "dist", "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src" + "Bamarni\\Composer\\Bin\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } + "description": "No conflicts for your bin dependencies", + "keywords": [ + "composer", + "conflict", + "dependency", + "executable", + "isolation", + "tool" ], - "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.1" - }, - "install-path": "../phpdocumentor/type-resolver" + "install-path": "../bamarni/composer-bin-plugin" }, { "name": "psr/container", @@ -1060,128 +100,6 @@ }, "install-path": "../psr/container" }, - { - "name": "psr/log", - "version": "1.1.4", - "version_normalized": "1.1.4.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2021-05-03T11:20:27+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "install-path": "../psr/log" - }, - { - "name": "sebastian/diff", - "version": "4.0.4", - "version_normalized": "4.0.4.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "time": "2020-10-26T13:10:38+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/diff" - }, { "name": "symfony/console", "version": "v4.4.43", @@ -1684,255 +602,10 @@ } ], "install-path": "../symfony/service-contracts" - }, - { - "name": "vimeo/psalm", - "version": "4.26.0", - "version_normalized": "4.26.0.0", - "source": { - "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "6998fabb2bf528b65777bf9941920888d23c03ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/6998fabb2bf528b65777bf9941920888d23c03ac", - "reference": "6998fabb2bf528b65777bf9941920888d23c03ac", - "shasum": "" - }, - "require": { - "amphp/amp": "^2.4.2", - "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.8.0", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "ext-ctype": "*", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "felixfbecker/language-server-protocol": "^1.5", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.13", - "openlss/lib-array2xml": "^1.0", - "php": "^7.1|^8", - "sebastian/diff": "^3.0 || ^4.0", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.25", - "webmozart/path-util": "^2.3" - }, - "provide": { - "psalm/psalm": "self.version" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "brianium/paratest": "^4.0||^6.0", - "ext-curl": "*", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpdocumentor/reflection-docblock": "^5", - "phpmyadmin/sql-parser": "5.1.0||dev-master", - "phpspec/prophecy": ">=1.9.0", - "phpunit/phpunit": "^9.0", - "psalm/plugin-phpunit": "^0.16", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5", - "symfony/process": "^4.3 || ^5.0 || ^6.0", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "suggest": { - "ext-curl": "In order to send data to shepherd", - "ext-igbinary": "^2.0.5 is required, used to serialize caching data" - }, - "time": "2022-07-31T13:10:26+00:00", - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "src/functions.php", - "src/spl_object_id.php" - ], - "psr-4": { - "Psalm\\": "src/Psalm/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthew Brown" - } - ], - "description": "A static analysis tool for finding errors in PHP applications", - "keywords": [ - "code", - "inspection", - "php" - ], - "support": { - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.26.0" - }, - "install-path": "../vimeo/psalm" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "version_normalized": "1.11.0.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "time": "2022-06-03T18:03:27+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "installation-source": "dist", - "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/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "install-path": "../webmozart/assert" - }, - { - "name": "webmozart/path-util", - "version": "2.3.0", - "version_normalized": "2.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/path-util.git", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "time": "2015-12-17T08:42:14+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "support": { - "issues": "https://github.com/webmozart/path-util/issues", - "source": "https://github.com/webmozart/path-util/tree/2.3.0" - }, - "abandoned": "symfony/filesystem", - "install-path": "../webmozart/path-util" } ], "dev": true, "dev-package-names": [ - "amphp/amp", - "amphp/byte-stream", - "bamarni/composer-bin-plugin", - "composer/package-versions-deprecated", - "composer/pcre", - "composer/semver", - "composer/xdebug-handler", - "dnoegel/php-xdg-base-dir", - "felixfbecker/advanced-json-rpc", - "felixfbecker/language-server-protocol", - "netresearch/jsonmapper", - "nikic/php-parser", - "openlss/lib-array2xml", - "phpdocumentor/reflection-common", - "phpdocumentor/reflection-docblock", - "phpdocumentor/type-resolver", - "psr/log", - "sebastian/diff", - "vimeo/psalm", - "webmozart/assert", - "webmozart/path-util" + "bamarni/composer-bin-plugin" ] } diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 7b567c6b..5f38c2e3 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '86df76f48f6646656a8094e0de0ae1956fd565d9', + 'reference' => 'f039ecf6f1ce3e5154f62ff823f9a81c89829b57', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,30 +13,12 @@ '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '86df76f48f6646656a8094e0de0ae1956fd565d9', + 'reference' => 'f039ecf6f1ce3e5154f62ff823f9a81c89829b57', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), - 'amphp/amp' => array( - 'pretty_version' => 'v2.6.2', - 'version' => '2.6.2.0', - 'reference' => '9d5100cebffa729aaffecd3ad25dc5aeea4f13bb', - 'type' => 'library', - 'install_path' => __DIR__ . '/../amphp/amp', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'amphp/byte-stream' => array( - 'pretty_version' => 'v1.8.1', - 'version' => '1.8.1.0', - 'reference' => 'acbd8002b3536485c997c4e019206b3f10ca15bd', - 'type' => 'library', - 'install_path' => __DIR__ . '/../amphp/byte-stream', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'bamarni/composer-bin-plugin' => array( 'pretty_version' => 'v1.5.0', 'version' => '1.5.0.0', @@ -46,135 +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.0.0', - 'version' => '3.0.0.0', - 'reference' => 'e300eb6c535192decd27a85bc72a9290f0d6b3bd', - 'type' => 'library', - 'install_path' => __DIR__ . '/./pcre', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'composer/semver' => array( - 'pretty_version' => '3.3.2', - 'version' => '3.3.2.0', - 'reference' => '3953f23262f2bff1919fc82183ad9acb13ff62c9', - 'type' => 'library', - 'install_path' => __DIR__ . '/./semver', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'composer/xdebug-handler' => array( - 'pretty_version' => '3.0.3', - 'version' => '3.0.3.0', - 'reference' => 'ced299686f41dce890debac69273b47ffe98a40c', - 'type' => 'library', - 'install_path' => __DIR__ . '/./xdebug-handler', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'dnoegel/php-xdg-base-dir' => array( - 'pretty_version' => 'v0.1.1', - 'version' => '0.1.1.0', - 'reference' => '8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd', - 'type' => 'library', - 'install_path' => __DIR__ . '/../dnoegel/php-xdg-base-dir', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'felixfbecker/advanced-json-rpc' => array( - 'pretty_version' => 'v3.2.1', - 'version' => '3.2.1.0', - 'reference' => 'b5f37dbff9a8ad360ca341f3240dc1c168b45447', - 'type' => 'library', - 'install_path' => __DIR__ . '/../felixfbecker/advanced-json-rpc', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'felixfbecker/language-server-protocol' => array( - 'pretty_version' => 'v1.5.2', - 'version' => '1.5.2.0', - 'reference' => '6e82196ffd7c62f7794d778ca52b69feec9f2842', - 'type' => 'library', - 'install_path' => __DIR__ . '/../felixfbecker/language-server-protocol', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'netresearch/jsonmapper' => array( - 'pretty_version' => 'v4.0.0', - 'version' => '4.0.0.0', - 'reference' => '8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d', - 'type' => 'library', - 'install_path' => __DIR__ . '/../netresearch/jsonmapper', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'nikic/php-parser' => array( - 'pretty_version' => 'v4.14.0', - 'version' => '4.14.0.0', - 'reference' => '34bea19b6e03d8153165d8f30bba4c3be86184c1', - 'type' => 'library', - 'install_path' => __DIR__ . '/../nikic/php-parser', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'ocramius/package-versions' => array( - 'dev_requirement' => true, - 'replaced' => array( - 0 => '1.11.99', - ), - ), - 'openlss/lib-array2xml' => array( - 'pretty_version' => '1.0.0', - 'version' => '1.0.0.0', - 'reference' => 'a91f18a8dfc69ffabe5f9b068bc39bb202c81d90', - 'type' => 'library', - 'install_path' => __DIR__ . '/../openlss/lib-array2xml', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpdocumentor/reflection-common' => array( - 'pretty_version' => '2.2.0', - 'version' => '2.2.0.0', - 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpdocumentor/reflection-common', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpdocumentor/reflection-docblock' => array( - 'pretty_version' => '5.3.0', - 'version' => '5.3.0.0', - 'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpdocumentor/type-resolver' => array( - 'pretty_version' => '1.6.1', - 'version' => '1.6.1.0', - 'reference' => '77a32518733312af16a44300404e945338981de3', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'psalm/psalm' => array( - 'dev_requirement' => true, - 'provided' => array( - 0 => '4.26.0', - ), - ), 'psr/container' => array( 'pretty_version' => '1.1.2', 'version' => '1.1.2.0', @@ -184,30 +37,12 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'psr/log' => array( - 'pretty_version' => '1.1.4', - 'version' => '1.1.4.0', - 'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11', - 'type' => 'library', - 'install_path' => __DIR__ . '/../psr/log', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'psr/log-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0|2.0', ), ), - 'sebastian/diff' => array( - 'pretty_version' => '4.0.4', - 'version' => '4.0.4.0', - 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/diff', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'symfony/console' => array( 'pretty_version' => 'v4.4.43', 'version' => '4.4.43.0', @@ -262,32 +97,5 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'vimeo/psalm' => array( - 'pretty_version' => '4.26.0', - 'version' => '4.26.0.0', - 'reference' => '6998fabb2bf528b65777bf9941920888d23c03ac', - 'type' => 'library', - 'install_path' => __DIR__ . '/../vimeo/psalm', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'webmozart/assert' => array( - 'pretty_version' => '1.11.0', - 'version' => '1.11.0.0', - 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', - 'type' => 'library', - 'install_path' => __DIR__ . '/../webmozart/assert', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'webmozart/path-util' => array( - 'pretty_version' => '2.3.0', - 'version' => '2.3.0.0', - 'reference' => 'd939f7edc24c9a1bb9c0dee5cb05d8e859490725', - 'type' => 'library', - 'install_path' => __DIR__ . '/../webmozart/path-util', - 'aliases' => array(), - 'dev_requirement' => true, - ), ), ); 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/LICENSE b/vendor/composer/package-versions-deprecated/LICENSE deleted file mode 100644 index a90b0792..00000000 --- a/vendor/composer/package-versions-deprecated/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2016 Marco Pivetta - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/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 @@ - fn ($match) => strtoupper($match[0])], $string); -$filtered = preg_grep('{[a-z]}', $elements); -$array = preg_split('{[a-z]+}', $string); -``` - -You can now call these on the `Preg` class: - -```php -use Composer\Pcre\Preg; - -if (Preg::match('{fo+}', $string, $matches)) { ... } -if (Preg::matchWithOffsets('{fo+}', $string, $matches)) { ... } -if (Preg::matchAll('{fo+}', $string, $matches)) { ... } -$newString = Preg::replace('{fo+}', 'bar', $string); -$newString = Preg::replaceCallback('{fo+}', function ($match) { return strtoupper($match[0]); }, $string); -$newString = Preg::replaceCallbackArray(['{fo+}' => fn ($match) => strtoupper($match[0])], $string); -$filtered = Preg::grep('{[a-z]}', $elements); -$array = Preg::split('{[a-z]+}', $string); -``` - -The main difference is if anything fails to match/replace/.., it will throw a `Composer\Pcre\PcreException` -instead of returning `null` (or false in some cases), so you can now use the return values safely relying on -the fact that they can only be strings (for replace), ints (for match) or arrays (for grep/split). - -Additionally the `Preg` class provides match methods that return `bool` rather than `int`, for stricter type safety -when the number of pattern matches is not useful: - -```php -use Composer\Pcre\Preg; - -if (Preg::isMatch('{fo+}', $string, $matches)) // bool -if (Preg::isMatchAll('{fo+}', $string, $matches)) // bool -``` - -If you would prefer a slightly more verbose usage, replacing by-ref arguments by result objects, you can use the `Regex` class: - -```php -use Composer\Pcre\Regex; - -// this is useful when you are just interested in knowing if something matched -// as it returns a bool instead of int(1/0) for match -$bool = Regex::isMatch('{fo+}', $string); - -$result = Regex::match('{fo+}', $string); -if ($result->matched) { something($result->matches); } - -$result = Regex::matchWithOffsets('{fo+}', $string); -if ($result->matched) { something($result->matches); } - -$result = Regex::matchAll('{fo+}', $string); -if ($result->matched && $result->count > 3) { something($result->matches); } - -$newString = Regex::replace('{fo+}', 'bar', $string)->result; -$newString = Regex::replaceCallback('{fo+}', function ($match) { return strtoupper($match[0]); }, $string)->result; -$newString = Regex::replaceCallbackArray(['{fo+}' => fn ($match) => strtoupper($match[0])], $string)->result; -``` - -Note that `preg_grep` and `preg_split` are only callable via the `Preg` class as they do not have -complex return types warranting a specific result object. - -See the [MatchResult](src/MatchResult.php), [MatchWithOffsetsResult](src/MatchWithOffsetsResult.php), [MatchAllResult](src/MatchAllResult.php), -[MatchAllWithOffsetsResult](src/MatchAllWithOffsetsResult.php), and [ReplaceResult](src/ReplaceResult.php) class sources for more details. - -Restrictions / Limitations --------------------------- - -Due to type safety requirements a few restrictions are in place. - -- matching using `PREG_OFFSET_CAPTURE` is made available via `matchWithOffsets` and `matchAllWithOffsets`. - You cannot pass the flag to `match`/`matchAll`. -- `Preg::split` will also reject `PREG_SPLIT_OFFSET_CAPTURE` and you should use `splitWithOffsets` - instead. -- `matchAll` rejects `PREG_SET_ORDER` as it also changes the shape of the returned matches. There - is no alternative provided as you can fairly easily code around it. -- `preg_filter` is not supported as it has a rather crazy API, most likely you should rather - use `Preg::grep` in combination with some loop and `Preg::replace`. -- `replace`, `replaceCallback` and `replaceCallbackArray` do not support an array `$subject`, - only simple strings. -- As of 2.0, the library always uses `PREG_UNMATCHED_AS_NULL` for matching, which offers [much - saner/more predictable results](#preg_unmatched_as_null). As of 3.0 the flag is also set for - `replaceCallback` and `replaceCallbackArray`. - -#### PREG_UNMATCHED_AS_NULL - -As of 2.0, this library always uses PREG_UNMATCHED_AS_NULL for all `match*` and `isMatch*` -functions. As of 3.0 it is also done for `replaceCallback` and `replaceCallbackArray`. - -This means your matches will always contain all matching groups, either as null if unmatched -or as string if it matched. - -The advantages in clarity and predictability are clearer if you compare the two outputs of -running this with and without PREG_UNMATCHED_AS_NULL in $flags: - -```php -preg_match('/(a)(b)*(c)(d)*/', 'ac', $matches, $flags); -``` - -| no flag | PREG_UNMATCHED_AS_NULL | -| --- | --- | -| array (size=4) | array (size=5) | -| 0 => string 'ac' (length=2) | 0 => string 'ac' (length=2) | -| 1 => string 'a' (length=1) | 1 => string 'a' (length=1) | -| 2 => string '' (length=0) | 2 => null | -| 3 => string 'c' (length=1) | 3 => string 'c' (length=1) | -| | 4 => null | -| group 2 (any unmatched group preceding one that matched) is set to `''`. You cannot tell if it matched an empty string or did not match at all | group 2 is `null` when unmatched and a string if it matched, easy to check for | -| group 4 (any optional group without a matching one following) is missing altogether. So you have to check with `isset()`, but really you want `isset($m[4]) && $m[4] !== ''` for safety unless you are very careful to check that a non-optional group follows it | group 4 is always set, and null in this case as there was no match, easy to check for with `$m[4] !== null` | - -License -------- - -composer/pcre is licensed under the MIT License, see the LICENSE file for details. diff --git a/vendor/composer/pcre/composer.json b/vendor/composer/pcre/composer.json deleted file mode 100644 index 40477ff4..00000000 --- a/vendor/composer/pcre/composer.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "composer/pcre", - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "type": "library", - "license": "MIT", - "keywords": [ - "pcre", - "regex", - "preg", - "regular expression" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^5", - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1" - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Composer\\Pcre\\": "tests" - } - }, - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "scripts": { - "test": "vendor/bin/simple-phpunit", - "phpstan": "phpstan analyse" - } -} diff --git a/vendor/composer/pcre/phpstan-baseline.neon b/vendor/composer/pcre/phpstan-baseline.neon deleted file mode 100644 index df994246..00000000 --- a/vendor/composer/pcre/phpstan-baseline.neon +++ /dev/null @@ -1,17 +0,0 @@ -parameters: - ignoreErrors: - - - message: "#^Method Composer\\\\Pcre\\\\Preg\\:\\:matchAll\\(\\) should return int\\<0, max\\> but returns int\\.$#" - count: 1 - path: src/Preg.php - - - - message: "#^Method Composer\\\\Pcre\\\\Preg\\:\\:matchAllWithOffsets\\(\\) should return int\\<0, max\\> but returns int\\.$#" - count: 1 - path: src/Preg.php - - - - message: "#^Strict comparison using \\=\\=\\= between int and null will always evaluate to false\\.$#" - count: 2 - path: src/Preg.php - diff --git a/vendor/composer/pcre/src/MatchAllResult.php b/vendor/composer/pcre/src/MatchAllResult.php deleted file mode 100644 index 4c367b03..00000000 --- a/vendor/composer/pcre/src/MatchAllResult.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Pcre; - -final class MatchAllResult -{ - /** - * An array of match group => list of matched strings - * - * @readonly - * @var array> - */ - public $matches; - - /** - * @readonly - * @var 0|positive-int - */ - public $count; - - /** - * @readonly - * @var bool - */ - public $matched; - - /** - * @param 0|positive-int $count - * @param array> $matches - */ - public function __construct($count, array $matches) - { - $this->matches = $matches; - $this->matched = (bool) $count; - $this->count = $count; - } -} diff --git a/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php b/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php deleted file mode 100644 index 4e893fec..00000000 --- a/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Pcre; - -final class MatchAllWithOffsetsResult -{ - /** - * An array of match group => list of matches, every match being a pair of string matched + offset in bytes (or -1 if no match) - * - * @readonly - * @var array> - * @phpstan-var array}>> - */ - public $matches; - - /** - * @readonly - * @var 0|positive-int - */ - public $count; - - /** - * @readonly - * @var bool - */ - public $matched; - - /** - * @param 0|positive-int $count - * @param array> $matches - * @phpstan-param array}>> $matches - */ - public function __construct($count, array $matches) - { - $this->matches = $matches; - $this->matched = (bool) $count; - $this->count = $count; - } -} diff --git a/vendor/composer/pcre/src/MatchResult.php b/vendor/composer/pcre/src/MatchResult.php deleted file mode 100644 index d8e34606..00000000 --- a/vendor/composer/pcre/src/MatchResult.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Pcre; - -final class MatchResult -{ - /** - * An array of match group => string matched - * - * @readonly - * @var array - */ - public $matches; - - /** - * @readonly - * @var bool - */ - public $matched; - - /** - * @param 0|positive-int $count - * @param array $matches - */ - public function __construct($count, array $matches) - { - $this->matches = $matches; - $this->matched = (bool) $count; - } -} diff --git a/vendor/composer/pcre/src/MatchWithOffsetsResult.php b/vendor/composer/pcre/src/MatchWithOffsetsResult.php deleted file mode 100644 index 9bd813bb..00000000 --- a/vendor/composer/pcre/src/MatchWithOffsetsResult.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Pcre; - -final class MatchWithOffsetsResult -{ - /** - * An array of match group => pair of string matched + offset in bytes (or -1 if no match) - * - * @readonly - * @var array - * @phpstan-var array}> - */ - public $matches; - - /** - * @readonly - * @var bool - */ - public $matched; - - /** - * @param 0|positive-int $count - * @param array $matches - * @phpstan-param array}> $matches - */ - public function __construct($count, array $matches) - { - $this->matches = $matches; - $this->matched = (bool) $count; - } -} diff --git a/vendor/composer/pcre/src/PcreException.php b/vendor/composer/pcre/src/PcreException.php deleted file mode 100644 index 218b2f2d..00000000 --- a/vendor/composer/pcre/src/PcreException.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Pcre; - -class PcreException extends \RuntimeException -{ - /** - * @param string $function - * @param string|string[] $pattern - * @return self - */ - public static function fromFunction($function, $pattern) - { - $code = preg_last_error(); - - if (is_array($pattern)) { - $pattern = implode(', ', $pattern); - } - - return new PcreException($function.'(): failed executing "'.$pattern.'": '.self::pcreLastErrorMessage($code), $code); - } - - /** - * @param int $code - * @return string - */ - private static function pcreLastErrorMessage($code) - { - if (function_exists('preg_last_error_msg')) { - return preg_last_error_msg(); - } - - // older php versions did not set the code properly in all cases - if (PHP_VERSION_ID < 70201 && $code === 0) { - return 'UNDEFINED_ERROR'; - } - - $constants = get_defined_constants(true); - if (!isset($constants['pcre'])) { - return 'UNDEFINED_ERROR'; - } - - foreach ($constants['pcre'] as $const => $val) { - if ($val === $code && substr($const, -6) === '_ERROR') { - return $const; - } - } - - return 'UNDEFINED_ERROR'; - } -} diff --git a/vendor/composer/pcre/src/Preg.php b/vendor/composer/pcre/src/Preg.php deleted file mode 100644 index af215779..00000000 --- a/vendor/composer/pcre/src/Preg.php +++ /dev/null @@ -1,275 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Pcre; - -class Preg -{ - /** @internal */ - public const ARRAY_MSG = '$subject as an array is not supported. You can use \'foreach\' instead.'; - /** @internal */ - public const INVALID_TYPE_MSG = '$subject must be a string, %s given.'; - - /** - * @param non-empty-string $pattern - * @param array $matches Set by method - * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported - * @return 0|1 - */ - public static function match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int - { - if (($flags & PREG_OFFSET_CAPTURE) !== 0) { - throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the type of $matches, use matchWithOffsets() instead'); - } - - $result = preg_match($pattern, $subject, $matches, $flags | PREG_UNMATCHED_AS_NULL, $offset); - if ($result === false) { - throw PcreException::fromFunction('preg_match', $pattern); - } - - return $result; - } - - /** - * Runs preg_match with PREG_OFFSET_CAPTURE - * - * @param non-empty-string $pattern - * @param array $matches Set by method - * @param int $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported - * @return 0|1 - * - * @phpstan-param array}> $matches - */ - public static function matchWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0): int - { - $result = preg_match($pattern, $subject, $matches, $flags | PREG_UNMATCHED_AS_NULL | PREG_OFFSET_CAPTURE, $offset); - if ($result === false) { - throw PcreException::fromFunction('preg_match', $pattern); - } - - return $result; - } - - /** - * @param non-empty-string $pattern - * @param array> $matches Set by method - * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported - * @return 0|positive-int - */ - public static function matchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int - { - if (($flags & PREG_OFFSET_CAPTURE) !== 0) { - throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the type of $matches, use matchAllWithOffsets() instead'); - } - - if (($flags & PREG_SET_ORDER) !== 0) { - throw new \InvalidArgumentException('PREG_SET_ORDER is not supported as it changes the type of $matches'); - } - - $result = preg_match_all($pattern, $subject, $matches, $flags | PREG_UNMATCHED_AS_NULL, $offset); - if ($result === false || /* PHP < 8 may return null */ $result === null) { - throw PcreException::fromFunction('preg_match_all', $pattern); - } - - return $result; - } - - /** - * Runs preg_match_all with PREG_OFFSET_CAPTURE - * - * @param non-empty-string $pattern - * @param array> $matches Set by method - * @param int $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported - * @return 0|positive-int - * - * @phpstan-param array}>> $matches - */ - public static function matchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0): int - { - $result = preg_match_all($pattern, $subject, $matches, $flags | PREG_UNMATCHED_AS_NULL | PREG_OFFSET_CAPTURE, $offset); - if ($result === false || /* PHP < 8 may return null */ $result === null) { - throw PcreException::fromFunction('preg_match_all', $pattern); - } - - return $result; - } - - /** - * @param string|string[] $pattern - * @param string|string[] $replacement - * @param string $subject - * @param int $count Set by method - */ - public static function replace($pattern, $replacement, $subject, int $limit = -1, int &$count = null): string - { - if (!is_scalar($subject)) { - if (is_array($subject)) { - throw new \InvalidArgumentException(static::ARRAY_MSG); - } - - throw new \TypeError(sprintf(static::INVALID_TYPE_MSG, gettype($subject))); - } - - $result = preg_replace($pattern, $replacement, $subject, $limit, $count); - if ($result === null) { - throw PcreException::fromFunction('preg_replace', $pattern); - } - - return $result; - } - - /** - * @param string|string[] $pattern - * @param string $subject - * @param int $count Set by method - * @param int $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set - */ - public static function replaceCallback($pattern, callable $replacement, $subject, int $limit = -1, int &$count = null, int $flags = 0): string - { - if (!is_scalar($subject)) { - if (is_array($subject)) { - throw new \InvalidArgumentException(static::ARRAY_MSG); - } - - throw new \TypeError(sprintf(static::INVALID_TYPE_MSG, gettype($subject))); - } - - $result = preg_replace_callback($pattern, $replacement, $subject, $limit, $count, $flags | PREG_UNMATCHED_AS_NULL); - if ($result === null) { - throw PcreException::fromFunction('preg_replace_callback', $pattern); - } - - return $result; - } - - /** - * @param array $pattern - * @param string $subject - * @param int $count Set by method - * @param int $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set - */ - public static function replaceCallbackArray(array $pattern, $subject, int $limit = -1, int &$count = null, int $flags = 0): string - { - if (!is_scalar($subject)) { - if (is_array($subject)) { - throw new \InvalidArgumentException(static::ARRAY_MSG); - } - - throw new \TypeError(sprintf(static::INVALID_TYPE_MSG, gettype($subject))); - } - - $result = preg_replace_callback_array($pattern, $subject, $limit, $count, $flags | PREG_UNMATCHED_AS_NULL); - if ($result === null) { - $pattern = array_keys($pattern); - throw PcreException::fromFunction('preg_replace_callback_array', $pattern); - } - - return $result; - } - - /** - * @param int $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE - * @return list - */ - public static function split(string $pattern, string $subject, int $limit = -1, int $flags = 0): array - { - if (($flags & PREG_SPLIT_OFFSET_CAPTURE) !== 0) { - throw new \InvalidArgumentException('PREG_SPLIT_OFFSET_CAPTURE is not supported as it changes the type of $matches, use splitWithOffsets() instead'); - } - - $result = preg_split($pattern, $subject, $limit, $flags); - if ($result === false) { - throw PcreException::fromFunction('preg_split', $pattern); - } - - return $result; - } - - /** - * @param int $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE, PREG_SPLIT_OFFSET_CAPTURE is always set - * @return list - * @phpstan-return list}> - */ - public static function splitWithOffsets(string $pattern, string $subject, int $limit = -1, int $flags = 0): array - { - $result = preg_split($pattern, $subject, $limit, $flags | PREG_SPLIT_OFFSET_CAPTURE); - if ($result === false) { - throw PcreException::fromFunction('preg_split', $pattern); - } - - return $result; - } - - /** - * @template T of string|\Stringable - * @param string $pattern - * @param array $array - * @param int $flags PREG_GREP_INVERT - * @return array - */ - public static function grep(string $pattern, array $array, int $flags = 0): array - { - $result = preg_grep($pattern, $array, $flags); - if ($result === false) { - throw PcreException::fromFunction('preg_grep', $pattern); - } - - return $result; - } - - /** - * @param non-empty-string $pattern - * @param array $matches Set by method - * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported - */ - public static function isMatch(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): bool - { - return (bool) static::match($pattern, $subject, $matches, $flags, $offset); - } - - /** - * @param non-empty-string $pattern - * @param array> $matches Set by method - * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported - */ - public static function isMatchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): bool - { - return (bool) static::matchAll($pattern, $subject, $matches, $flags, $offset); - } - - /** - * Runs preg_match with PREG_OFFSET_CAPTURE - * - * @param non-empty-string $pattern - * @param array $matches Set by method - * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported - * - * @phpstan-param array}> $matches - */ - public static function isMatchWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0): bool - { - return (bool) static::matchWithOffsets($pattern, $subject, $matches, $flags, $offset); - } - - /** - * Runs preg_match_all with PREG_OFFSET_CAPTURE - * - * @param non-empty-string $pattern - * @param array> $matches Set by method - * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported - * - * @phpstan-param array}>> $matches - */ - public static function isMatchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0): bool - { - return (bool) static::matchAllWithOffsets($pattern, $subject, $matches, $flags, $offset); - } -} diff --git a/vendor/composer/pcre/src/Regex.php b/vendor/composer/pcre/src/Regex.php deleted file mode 100644 index 9e8e7b81..00000000 --- a/vendor/composer/pcre/src/Regex.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Pcre; - -class Regex -{ - /** - * @param non-empty-string $pattern - */ - public static function isMatch(string $pattern, string $subject, int $offset = 0): bool - { - return (bool) Preg::match($pattern, $subject, $matches, 0, $offset); - } - - /** - * @param non-empty-string $pattern - * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported - */ - public static function match(string $pattern, string $subject, int $flags = 0, int $offset = 0): MatchResult - { - if (($flags & PREG_OFFSET_CAPTURE) !== 0) { - throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the return type, use matchWithOffsets() instead'); - } - - $count = Preg::match($pattern, $subject, $matches, $flags, $offset); - - return new MatchResult($count, $matches); - } - - /** - * Runs preg_match with PREG_OFFSET_CAPTURE - * - * @param non-empty-string $pattern - * @param int $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported - */ - public static function matchWithOffsets(string $pattern, string $subject, int $flags = 0, int $offset = 0): MatchWithOffsetsResult - { - $count = Preg::matchWithOffsets($pattern, $subject, $matches, $flags, $offset); - - return new MatchWithOffsetsResult($count, $matches); - } - - /** - * @param non-empty-string $pattern - * @param int $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported - */ - public static function matchAll(string $pattern, string $subject, int $flags = 0, int $offset = 0): MatchAllResult - { - if (($flags & PREG_OFFSET_CAPTURE) !== 0) { - throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the return type, use matchAllWithOffsets() instead'); - } - - if (($flags & PREG_SET_ORDER) !== 0) { - throw new \InvalidArgumentException('PREG_SET_ORDER is not supported as it changes the return type'); - } - - $count = Preg::matchAll($pattern, $subject, $matches, $flags, $offset); - - return new MatchAllResult($count, $matches); - } - - /** - * Runs preg_match_all with PREG_OFFSET_CAPTURE - * - * @param non-empty-string $pattern - * @param int $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported - */ - public static function matchAllWithOffsets(string $pattern, string $subject, int $flags = 0, int $offset = 0): MatchAllWithOffsetsResult - { - $count = Preg::matchAllWithOffsets($pattern, $subject, $matches, $flags, $offset); - - return new MatchAllWithOffsetsResult($count, $matches); - } - /** - * @param string|string[] $pattern - * @param string|string[] $replacement - * @param string $subject - */ - public static function replace($pattern, $replacement, $subject, int $limit = -1): ReplaceResult - { - $result = Preg::replace($pattern, $replacement, $subject, $limit, $count); - - return new ReplaceResult($count, $result); - } - - /** - * @param string|string[] $pattern - * @param string $subject - * @param int $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set - */ - public static function replaceCallback($pattern, callable $replacement, $subject, int $limit = -1, int $flags = 0): ReplaceResult - { - $result = Preg::replaceCallback($pattern, $replacement, $subject, $limit, $count, $flags); - - return new ReplaceResult($count, $result); - } - - /** - * @param array $pattern - * @param string $subject - * @param int $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set - */ - public static function replaceCallbackArray(array $pattern, $subject, int $limit = -1, int $flags = 0): ReplaceResult - { - $result = Preg::replaceCallbackArray($pattern, $subject, $limit, $count, $flags); - - return new ReplaceResult($count, $result); - } -} diff --git a/vendor/composer/pcre/src/ReplaceResult.php b/vendor/composer/pcre/src/ReplaceResult.php deleted file mode 100644 index 0ac08401..00000000 --- a/vendor/composer/pcre/src/ReplaceResult.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Pcre; - -final class ReplaceResult -{ - /** - * @readonly - * @var string - */ - public $result; - - /** - * @readonly - * @var 0|positive-int - */ - public $count; - - /** - * @readonly - * @var bool - */ - public $matched; - - /** - * @param 0|positive-int $count - * @param string $result - */ - public function __construct($count, $result) - { - $this->count = $count; - $this->matched = (bool) $count; - $this->result = $result; - } -} diff --git a/vendor/composer/semver/CHANGELOG.md b/vendor/composer/semver/CHANGELOG.md deleted file mode 100644 index c9514773..00000000 --- a/vendor/composer/semver/CHANGELOG.md +++ /dev/null @@ -1,209 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/). - -### [3.3.2] 2022-04-01 - - * Fixed handling of non-string values (#134) - -### [3.3.1] 2022-03-16 - - * Fixed possible cache key clash in the CompilingMatcher memoization (#132) - -### [3.3.0] 2022-03-15 - - * Improved performance of CompilingMatcher by memoizing more (#131) - * Added CompilingMatcher::clear to clear all memoization caches - -### [3.2.9] 2022-02-04 - - * Revert #129 (Fixed MultiConstraint with MatchAllConstraint) which caused regressions - -### [3.2.8] 2022-02-04 - - * Updates to latest phpstan / CI by @Seldaek in https://github.com/composer/semver/pull/130 - * Fixed MultiConstraint with MatchAllConstraint by @Toflar in https://github.com/composer/semver/pull/129 - -### [3.2.7] 2022-01-04 - - * Fixed: typo in type definition of Intervals class causing issues with Psalm scanning vendors - -### [3.2.6] 2021-10-25 - - * Fixed: type improvements to parseStability - -### [3.2.5] 2021-05-24 - - * Fixed: issue comparing disjunctive MultiConstraints to conjunctive ones (#127) - * Fixed: added complete type information using phpstan annotations - -### [3.2.4] 2020-11-13 - - * Fixed: code clean-up - -### [3.2.3] 2020-11-12 - - * Fixed: constraints in the form of `X || Y, >=Y.1` and other such complex constructs were in some cases being optimized into a more restrictive constraint - -### [3.2.2] 2020-10-14 - - * Fixed: internal code cleanups - -### [3.2.1] 2020-09-27 - - * Fixed: accidental validation of broken constraints combining ^/~ and wildcards, and -dev suffix allowing weird cases - * Fixed: normalization of beta0 and such which was dropping the 0 - -### [3.2.0] 2020-09-09 - - * Added: support for `x || @dev`, not very useful but seen in the wild and failed to validate with 1.5.2/1.6.0 - * Added: support for `foobar-dev` being equal to `dev-foobar`, dev-foobar is the official way to write it but we need to support the other for BC and convenience - -### [3.1.0] 2020-09-08 - - * Added: support for constraints like `^2.x-dev` and `~2.x-dev`, not very useful but seen in the wild and failed to validate with 3.0.1 - * Fixed: invalid aliases will no longer throw, unless explicitly validated by Composer in the root package - -### [3.0.1] 2020-09-08 - - * Fixed: handling of some invalid -dev versions which were seen as valid - -### [3.0.0] 2020-05-26 - - * Break: Renamed `EmptyConstraint`, replace it with `MatchAllConstraint` - * Break: Unlikely to affect anyone but strictly speaking a breaking change, `*.*` and such variants will not match all `dev-*` versions anymore, only `*` does - * Break: ConstraintInterface is now considered internal/private and not meant to be implemented by third parties anymore - * Added `Intervals` class to check if a constraint is a subsets of another one, and allow compacting complex MultiConstraints into simpler ones - * Added `CompilingMatcher` class to speed up constraint matching against simple Constraint instances - * Added `MatchAllConstraint` and `MatchNoneConstraint` which match everything and nothing - * Added more advanced optimization of contiguous constraints inside MultiConstraint - * Added tentative support for PHP 8 - * Fixed ConstraintInterface::matches to be commutative in all cases - -### [2.0.0] 2020-04-21 - - * Break: `dev-master`, `dev-trunk` and `dev-default` now normalize to `dev-master`, `dev-trunk` and `dev-default` instead of `9999999-dev` in 1.x - * Break: Removed the deprecated `AbstractConstraint` - * Added `getUpperBound` and `getLowerBound` to ConstraintInterface. They return `Composer\Semver\Constraint\Bound` instances - * Added `MultiConstraint::create` to create the most-optimal form of ConstraintInterface from an array of constraint strings - -### [1.7.2] 2020-12-03 - - * Fixed: Allow installing on php 8 - -### [1.7.1] 2020-09-27 - - * Fixed: accidental validation of broken constraints combining ^/~ and wildcards, and -dev suffix allowing weird cases - * Fixed: normalization of beta0 and such which was dropping the 0 - -### [1.7.0] 2020-09-09 - - * Added: support for `x || @dev`, not very useful but seen in the wild and failed to validate with 1.5.2/1.6.0 - * Added: support for `foobar-dev` being equal to `dev-foobar`, dev-foobar is the official way to write it but we need to support the other for BC and convenience - -### [1.6.0] 2020-09-08 - - * Added: support for constraints like `^2.x-dev` and `~2.x-dev`, not very useful but seen in the wild and failed to validate with 1.5.2 - * Fixed: invalid aliases will no longer throw, unless explicitly validated by Composer in the root package - -### [1.5.2] 2020-09-08 - - * Fixed: handling of some invalid -dev versions which were seen as valid - * Fixed: some doctypes - -### [1.5.1] 2020-01-13 - - * Fixed: Parsing of aliased version was not validating the alias to be a valid version - -### [1.5.0] 2019-03-19 - - * Added: some support for date versions (e.g. 201903) in `~` operator - * Fixed: support for stabilities in `~` operator was inconsistent - -### [1.4.2] 2016-08-30 - - * Fixed: collapsing of complex constraints lead to buggy constraints - -### [1.4.1] 2016-06-02 - - * Changed: branch-like requirements no longer strip build metadata - [composer/semver#38](https://github.com/composer/semver/pull/38). - -### [1.4.0] 2016-03-30 - - * Added: getters on MultiConstraint - [composer/semver#35](https://github.com/composer/semver/pull/35). - -### [1.3.0] 2016-02-25 - - * Fixed: stability parsing - [composer/composer#1234](https://github.com/composer/composer/issues/4889). - * Changed: collapse contiguous constraints when possible. - -### [1.2.0] 2015-11-10 - - * Changed: allow multiple numerical identifiers in 'pre-release' version part. - * Changed: add more 'v' prefix support. - -### [1.1.0] 2015-11-03 - - * Changed: dropped redundant `test` namespace. - * Changed: minor adjustment in datetime parsing normalization. - * Changed: `ConstraintInterface` relaxed, setPrettyString is not required anymore. - * Changed: `AbstractConstraint` marked deprecated, will be removed in 2.0. - * Changed: `Constraint` is now extensible. - -### [1.0.0] 2015-09-21 - - * Break: `VersionConstraint` renamed to `Constraint`. - * Break: `SpecificConstraint` renamed to `AbstractConstraint`. - * Break: `LinkConstraintInterface` renamed to `ConstraintInterface`. - * Break: `VersionParser::parseNameVersionPairs` was removed. - * Changed: `VersionParser::parseConstraints` allows (but ignores) build metadata now. - * Changed: `VersionParser::parseConstraints` allows (but ignores) prefixing numeric versions with a 'v' now. - * Changed: Fixed namespace(s) of test files. - * Changed: `Comparator::compare` no longer throws `InvalidArgumentException`. - * Changed: `Constraint` now throws `InvalidArgumentException`. - -### [0.1.0] 2015-07-23 - - * Added: `Composer\Semver\Comparator`, various methods to compare versions. - * Added: various documents such as README.md, LICENSE, etc. - * Added: configuration files for Git, Travis, php-cs-fixer, phpunit. - * Break: the following namespaces were renamed: - - Namespace: `Composer\Package\Version` -> `Composer\Semver` - - Namespace: `Composer\Package\LinkConstraint` -> `Composer\Semver\Constraint` - - Namespace: `Composer\Test\Package\Version` -> `Composer\Test\Semver` - - Namespace: `Composer\Test\Package\LinkConstraint` -> `Composer\Test\Semver\Constraint` - * Changed: code style using php-cs-fixer. - -[3.3.2]: https://github.com/composer/semver/compare/3.3.1...3.3.2 -[3.3.1]: https://github.com/composer/semver/compare/3.3.0...3.3.1 -[3.3.0]: https://github.com/composer/semver/compare/3.2.9...3.3.0 -[3.2.9]: https://github.com/composer/semver/compare/3.2.8...3.2.9 -[3.2.8]: https://github.com/composer/semver/compare/3.2.7...3.2.8 -[3.2.7]: https://github.com/composer/semver/compare/3.2.6...3.2.7 -[3.2.6]: https://github.com/composer/semver/compare/3.2.5...3.2.6 -[3.2.5]: https://github.com/composer/semver/compare/3.2.4...3.2.5 -[3.2.4]: https://github.com/composer/semver/compare/3.2.3...3.2.4 -[3.2.3]: https://github.com/composer/semver/compare/3.2.2...3.2.3 -[3.2.2]: https://github.com/composer/semver/compare/3.2.1...3.2.2 -[3.2.1]: https://github.com/composer/semver/compare/3.2.0...3.2.1 -[3.2.0]: https://github.com/composer/semver/compare/3.1.0...3.2.0 -[3.1.0]: https://github.com/composer/semver/compare/3.0.1...3.1.0 -[3.0.1]: https://github.com/composer/semver/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/composer/semver/compare/2.0.0...3.0.0 -[2.0.0]: https://github.com/composer/semver/compare/1.5.1...2.0.0 -[1.7.2]: https://github.com/composer/semver/compare/1.7.1...1.7.2 -[1.7.1]: https://github.com/composer/semver/compare/1.7.0...1.7.1 -[1.7.0]: https://github.com/composer/semver/compare/1.6.0...1.7.0 -[1.6.0]: https://github.com/composer/semver/compare/1.5.2...1.6.0 -[1.5.2]: https://github.com/composer/semver/compare/1.5.1...1.5.2 -[1.5.1]: https://github.com/composer/semver/compare/1.5.0...1.5.1 -[1.5.0]: https://github.com/composer/semver/compare/1.4.2...1.5.0 -[1.4.2]: https://github.com/composer/semver/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/composer/semver/compare/1.4.0...1.4.1 -[1.4.0]: https://github.com/composer/semver/compare/1.3.0...1.4.0 -[1.3.0]: https://github.com/composer/semver/compare/1.2.0...1.3.0 -[1.2.0]: https://github.com/composer/semver/compare/1.1.0...1.2.0 -[1.1.0]: https://github.com/composer/semver/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/composer/semver/compare/0.1.0...1.0.0 -[0.1.0]: https://github.com/composer/semver/compare/5e0b9a4da...0.1.0 diff --git a/vendor/composer/semver/LICENSE b/vendor/composer/semver/LICENSE deleted file mode 100644 index 46697586..00000000 --- a/vendor/composer/semver/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2015 Composer - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/composer/semver/README.md b/vendor/composer/semver/README.md deleted file mode 100644 index 35db99a5..00000000 --- a/vendor/composer/semver/README.md +++ /dev/null @@ -1,98 +0,0 @@ -composer/semver -=============== - -Semver (Semantic Versioning) library that offers utilities, version constraint parsing and validation. - -Originally written as part of [composer/composer](https://github.com/composer/composer), -now extracted and made available as a stand-alone library. - -[![Continuous Integration](https://github.com/composer/semver/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/composer/semver/actions) - - -Installation ------------- - -Install the latest version with: - -```bash -$ composer require composer/semver -``` - - -Requirements ------------- - -* PHP 5.3.2 is required but using the latest version of PHP is highly recommended. - - -Version Comparison ------------------- - -For details on how versions are compared, refer to the [Versions](https://getcomposer.org/doc/articles/versions.md) -article in the documentation section of the [getcomposer.org](https://getcomposer.org) website. - - -Basic usage ------------ - -### Comparator - -The [`Composer\Semver\Comparator`](https://github.com/composer/semver/blob/main/src/Comparator.php) class provides the following methods for comparing versions: - -* greaterThan($v1, $v2) -* greaterThanOrEqualTo($v1, $v2) -* lessThan($v1, $v2) -* lessThanOrEqualTo($v1, $v2) -* equalTo($v1, $v2) -* notEqualTo($v1, $v2) - -Each function takes two version strings as arguments and returns a boolean. For example: - -```php -use Composer\Semver\Comparator; - -Comparator::greaterThan('1.25.0', '1.24.0'); // 1.25.0 > 1.24.0 -``` - -### Semver - -The [`Composer\Semver\Semver`](https://github.com/composer/semver/blob/main/src/Semver.php) class provides the following methods: - -* satisfies($version, $constraints) -* satisfiedBy(array $versions, $constraint) -* sort($versions) -* rsort($versions) - -### Intervals - -The [`Composer\Semver\Intervals`](https://github.com/composer/semver/blob/main/src/Intervals.php) static class provides -a few utilities to work with complex constraints or read version intervals from a constraint: - -```php -use Composer\Semver\Intervals; - -// Checks whether $candidate is a subset of $constraint -Intervals::isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint); - -// Checks whether $a and $b have any intersection, equivalent to $a->matches($b) -Intervals::haveIntersections(ConstraintInterface $a, ConstraintInterface $b); - -// Optimizes a complex multi constraint by merging all intervals down to the smallest -// possible multi constraint. The drawbacks are this is not very fast, and the resulting -// multi constraint will have no human readable prettyConstraint configured on it -Intervals::compactConstraint(ConstraintInterface $constraint); - -// Creates an array of numeric intervals and branch constraints representing a given constraint -Intervals::get(ConstraintInterface $constraint); - -// Clears the memoization cache when you are done processing constraints -Intervals::clear() -``` - -See the class docblocks for more details. - - -License -------- - -composer/semver is licensed under the MIT License, see the LICENSE file for details. diff --git a/vendor/composer/semver/composer.json b/vendor/composer/semver/composer.json deleted file mode 100644 index ba78676d..00000000 --- a/vendor/composer/semver/composer.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "composer/semver", - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "type": "library", - "license": "MIT", - "keywords": [ - "semver", - "semantic", - "versioning", - "validation" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.2 || ^5", - "phpstan/phpstan": "^1.4" - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Composer\\Semver\\": "tests" - } - }, - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "scripts": { - "test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor/bin/simple-phpunit", - "phpstan": "@php vendor/bin/phpstan analyse" - } -} diff --git a/vendor/composer/semver/src/Comparator.php b/vendor/composer/semver/src/Comparator.php deleted file mode 100644 index 38f483aa..00000000 --- a/vendor/composer/semver/src/Comparator.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; - -class Comparator -{ - /** - * Evaluates the expression: $version1 > $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function greaterThan($version1, $version2) - { - return self::compare($version1, '>', $version2); - } - - /** - * Evaluates the expression: $version1 >= $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function greaterThanOrEqualTo($version1, $version2) - { - return self::compare($version1, '>=', $version2); - } - - /** - * Evaluates the expression: $version1 < $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function lessThan($version1, $version2) - { - return self::compare($version1, '<', $version2); - } - - /** - * Evaluates the expression: $version1 <= $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function lessThanOrEqualTo($version1, $version2) - { - return self::compare($version1, '<=', $version2); - } - - /** - * Evaluates the expression: $version1 == $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function equalTo($version1, $version2) - { - return self::compare($version1, '==', $version2); - } - - /** - * Evaluates the expression: $version1 != $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function notEqualTo($version1, $version2) - { - return self::compare($version1, '!=', $version2); - } - - /** - * Evaluates the expression: $version1 $operator $version2. - * - * @param string $version1 - * @param string $operator - * @param string $version2 - * - * @return bool - * - * @phpstan-param Constraint::STR_OP_* $operator - */ - public static function compare($version1, $operator, $version2) - { - $constraint = new Constraint($operator, $version2); - - return $constraint->matchSpecific(new Constraint('==', $version1), true); - } -} diff --git a/vendor/composer/semver/src/CompilingMatcher.php b/vendor/composer/semver/src/CompilingMatcher.php deleted file mode 100644 index 45bce70a..00000000 --- a/vendor/composer/semver/src/CompilingMatcher.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; -use Composer\Semver\Constraint\ConstraintInterface; - -/** - * Helper class to evaluate constraint by compiling and reusing the code to evaluate - */ -class CompilingMatcher -{ - /** - * @var array - * @phpstan-var array - */ - private static $compiledCheckerCache = array(); - /** - * @var array - * @phpstan-var array - */ - private static $resultCache = array(); - - /** @var bool */ - private static $enabled; - - /** - * @phpstan-var array - */ - private static $transOpInt = array( - Constraint::OP_EQ => Constraint::STR_OP_EQ, - Constraint::OP_LT => Constraint::STR_OP_LT, - Constraint::OP_LE => Constraint::STR_OP_LE, - Constraint::OP_GT => Constraint::STR_OP_GT, - Constraint::OP_GE => Constraint::STR_OP_GE, - Constraint::OP_NE => Constraint::STR_OP_NE, - ); - - /** - * Clears the memoization cache once you are done - * - * @return void - */ - public static function clear() - { - self::$resultCache = array(); - self::$compiledCheckerCache = array(); - } - - /** - * Evaluates the expression: $constraint match $operator $version - * - * @param ConstraintInterface $constraint - * @param int $operator - * @phpstan-param Constraint::OP_* $operator - * @param string $version - * - * @return mixed - */ - public static function match(ConstraintInterface $constraint, $operator, $version) - { - $resultCacheKey = $operator.$constraint.';'.$version; - - if (isset(self::$resultCache[$resultCacheKey])) { - return self::$resultCache[$resultCacheKey]; - } - - if (self::$enabled === null) { - self::$enabled = !\in_array('eval', explode(',', (string) ini_get('disable_functions')), true); - } - if (!self::$enabled) { - return self::$resultCache[$resultCacheKey] = $constraint->matches(new Constraint(self::$transOpInt[$operator], $version)); - } - - $cacheKey = $operator.$constraint; - if (!isset(self::$compiledCheckerCache[$cacheKey])) { - $code = $constraint->compile($operator); - self::$compiledCheckerCache[$cacheKey] = $function = eval('return function($v, $b){return '.$code.';};'); - } else { - $function = self::$compiledCheckerCache[$cacheKey]; - } - - return self::$resultCache[$resultCacheKey] = $function($version, strpos($version, 'dev-') === 0); - } -} diff --git a/vendor/composer/semver/src/Constraint/Bound.php b/vendor/composer/semver/src/Constraint/Bound.php deleted file mode 100644 index 7effb11a..00000000 --- a/vendor/composer/semver/src/Constraint/Bound.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -class Bound -{ - /** - * @var string - */ - private $version; - - /** - * @var bool - */ - private $isInclusive; - - /** - * @param string $version - * @param bool $isInclusive - */ - public function __construct($version, $isInclusive) - { - $this->version = $version; - $this->isInclusive = $isInclusive; - } - - /** - * @return string - */ - public function getVersion() - { - return $this->version; - } - - /** - * @return bool - */ - public function isInclusive() - { - return $this->isInclusive; - } - - /** - * @return bool - */ - public function isZero() - { - return $this->getVersion() === '0.0.0.0-dev' && $this->isInclusive(); - } - - /** - * @return bool - */ - public function isPositiveInfinity() - { - return $this->getVersion() === PHP_INT_MAX.'.0.0.0' && !$this->isInclusive(); - } - - /** - * Compares a bound to another with a given operator. - * - * @param Bound $other - * @param string $operator - * - * @return bool - */ - public function compareTo(Bound $other, $operator) - { - if (!\in_array($operator, array('<', '>'), true)) { - throw new \InvalidArgumentException('Does not support any other operator other than > or <.'); - } - - // If they are the same it doesn't matter - if ($this == $other) { - return false; - } - - $compareResult = version_compare($this->getVersion(), $other->getVersion()); - - // Not the same version means we don't need to check if the bounds are inclusive or not - if (0 !== $compareResult) { - return (('>' === $operator) ? 1 : -1) === $compareResult; - } - - // Question we're answering here is "am I higher than $other?" - return '>' === $operator ? $other->isInclusive() : !$other->isInclusive(); - } - - public function __toString() - { - return sprintf( - '%s [%s]', - $this->getVersion(), - $this->isInclusive() ? 'inclusive' : 'exclusive' - ); - } - - /** - * @return self - */ - public static function zero() - { - return new Bound('0.0.0.0-dev', true); - } - - /** - * @return self - */ - public static function positiveInfinity() - { - return new Bound(PHP_INT_MAX.'.0.0.0', false); - } -} diff --git a/vendor/composer/semver/src/Constraint/Constraint.php b/vendor/composer/semver/src/Constraint/Constraint.php deleted file mode 100644 index dc394829..00000000 --- a/vendor/composer/semver/src/Constraint/Constraint.php +++ /dev/null @@ -1,435 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Defines a constraint. - */ -class Constraint implements ConstraintInterface -{ - /* operator integer values */ - const OP_EQ = 0; - const OP_LT = 1; - const OP_LE = 2; - const OP_GT = 3; - const OP_GE = 4; - const OP_NE = 5; - - /* operator string values */ - const STR_OP_EQ = '=='; - const STR_OP_EQ_ALT = '='; - const STR_OP_LT = '<'; - const STR_OP_LE = '<='; - const STR_OP_GT = '>'; - const STR_OP_GE = '>='; - const STR_OP_NE = '!='; - const STR_OP_NE_ALT = '<>'; - - /** - * Operator to integer translation table. - * - * @var array - * @phpstan-var array - */ - private static $transOpStr = array( - '=' => self::OP_EQ, - '==' => self::OP_EQ, - '<' => self::OP_LT, - '<=' => self::OP_LE, - '>' => self::OP_GT, - '>=' => self::OP_GE, - '<>' => self::OP_NE, - '!=' => self::OP_NE, - ); - - /** - * Integer to operator translation table. - * - * @var array - * @phpstan-var array - */ - private static $transOpInt = array( - self::OP_EQ => '==', - self::OP_LT => '<', - self::OP_LE => '<=', - self::OP_GT => '>', - self::OP_GE => '>=', - self::OP_NE => '!=', - ); - - /** - * @var int - * @phpstan-var self::OP_* - */ - protected $operator; - - /** @var string */ - protected $version; - - /** @var string|null */ - protected $prettyString; - - /** @var Bound */ - protected $lowerBound; - - /** @var Bound */ - protected $upperBound; - - /** - * Sets operator and version to compare with. - * - * @param string $operator - * @param string $version - * - * @throws \InvalidArgumentException if invalid operator is given. - * - * @phpstan-param self::STR_OP_* $operator - */ - public function __construct($operator, $version) - { - if (!isset(self::$transOpStr[$operator])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid operator "%s" given, expected one of: %s', - $operator, - implode(', ', self::getSupportedOperators()) - )); - } - - $this->operator = self::$transOpStr[$operator]; - $this->version = $version; - } - - /** - * @return string - */ - public function getVersion() - { - return $this->version; - } - - /** - * @return string - * - * @phpstan-return self::STR_OP_* - */ - public function getOperator() - { - return self::$transOpInt[$this->operator]; - } - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - if ($provider instanceof self) { - return $this->matchSpecific($provider); - } - - // turn matching around to find a match - return $provider->matches($this); - } - - /** - * {@inheritDoc} - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * {@inheritDoc} - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return $this->__toString(); - } - - /** - * Get all supported comparison operators. - * - * @return array - * - * @phpstan-return list - */ - public static function getSupportedOperators() - { - return array_keys(self::$transOpStr); - } - - /** - * @param string $operator - * @return int - * - * @phpstan-param self::STR_OP_* $operator - * @phpstan-return self::OP_* - */ - public static function getOperatorConstant($operator) - { - return self::$transOpStr[$operator]; - } - - /** - * @param string $a - * @param string $b - * @param string $operator - * @param bool $compareBranches - * - * @throws \InvalidArgumentException if invalid operator is given. - * - * @return bool - * - * @phpstan-param self::STR_OP_* $operator - */ - public function versionCompare($a, $b, $operator, $compareBranches = false) - { - if (!isset(self::$transOpStr[$operator])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid operator "%s" given, expected one of: %s', - $operator, - implode(', ', self::getSupportedOperators()) - )); - } - - $aIsBranch = strpos($a, 'dev-') === 0; - $bIsBranch = strpos($b, 'dev-') === 0; - - if ($operator === '!=' && ($aIsBranch || $bIsBranch)) { - return $a !== $b; - } - - if ($aIsBranch && $bIsBranch) { - return $operator === '==' && $a === $b; - } - - // when branches are not comparable, we make sure dev branches never match anything - if (!$compareBranches && ($aIsBranch || $bIsBranch)) { - return false; - } - - return \version_compare($a, $b, $operator); - } - - /** - * {@inheritDoc} - */ - public function compile($otherOperator) - { - if (strpos($this->version, 'dev-') === 0) { - if (self::OP_EQ === $this->operator) { - if (self::OP_EQ === $otherOperator) { - return sprintf('$b && $v === %s', \var_export($this->version, true)); - } - if (self::OP_NE === $otherOperator) { - return sprintf('!$b || $v !== %s', \var_export($this->version, true)); - } - return 'false'; - } - - if (self::OP_NE === $this->operator) { - if (self::OP_EQ === $otherOperator) { - return sprintf('!$b || $v !== %s', \var_export($this->version, true)); - } - if (self::OP_NE === $otherOperator) { - return 'true'; - } - return '!$b'; - } - - return 'false'; - } - - if (self::OP_EQ === $this->operator) { - if (self::OP_EQ === $otherOperator) { - return sprintf('\version_compare($v, %s, \'==\')', \var_export($this->version, true)); - } - if (self::OP_NE === $otherOperator) { - return sprintf('$b || \version_compare($v, %s, \'!=\')', \var_export($this->version, true)); - } - - return sprintf('!$b && \version_compare(%s, $v, \'%s\')', \var_export($this->version, true), self::$transOpInt[$otherOperator]); - } - - if (self::OP_NE === $this->operator) { - if (self::OP_EQ === $otherOperator) { - return sprintf('$b || (!$b && \version_compare($v, %s, \'!=\'))', \var_export($this->version, true)); - } - - if (self::OP_NE === $otherOperator) { - return 'true'; - } - return '!$b'; - } - - if (self::OP_LT === $this->operator || self::OP_LE === $this->operator) { - if (self::OP_LT === $otherOperator || self::OP_LE === $otherOperator) { - return '!$b'; - } - } else { // $this->operator must be self::OP_GT || self::OP_GE here - if (self::OP_GT === $otherOperator || self::OP_GE === $otherOperator) { - return '!$b'; - } - } - - if (self::OP_NE === $otherOperator) { - return 'true'; - } - - $codeComparison = sprintf('\version_compare($v, %s, \'%s\')', \var_export($this->version, true), self::$transOpInt[$this->operator]); - if ($this->operator === self::OP_LE) { - if ($otherOperator === self::OP_GT) { - return sprintf('!$b && \version_compare($v, %s, \'!=\') && ', \var_export($this->version, true)) . $codeComparison; - } - } elseif ($this->operator === self::OP_GE) { - if ($otherOperator === self::OP_LT) { - return sprintf('!$b && \version_compare($v, %s, \'!=\') && ', \var_export($this->version, true)) . $codeComparison; - } - } - - return sprintf('!$b && %s', $codeComparison); - } - - /** - * @param Constraint $provider - * @param bool $compareBranches - * - * @return bool - */ - public function matchSpecific(Constraint $provider, $compareBranches = false) - { - $noEqualOp = str_replace('=', '', self::$transOpInt[$this->operator]); - $providerNoEqualOp = str_replace('=', '', self::$transOpInt[$provider->operator]); - - $isEqualOp = self::OP_EQ === $this->operator; - $isNonEqualOp = self::OP_NE === $this->operator; - $isProviderEqualOp = self::OP_EQ === $provider->operator; - $isProviderNonEqualOp = self::OP_NE === $provider->operator; - - // '!=' operator is match when other operator is not '==' operator or version is not match - // these kinds of comparisons always have a solution - if ($isNonEqualOp || $isProviderNonEqualOp) { - if ($isNonEqualOp && !$isProviderNonEqualOp && !$isProviderEqualOp && strpos($provider->version, 'dev-') === 0) { - return false; - } - - if ($isProviderNonEqualOp && !$isNonEqualOp && !$isEqualOp && strpos($this->version, 'dev-') === 0) { - return false; - } - - if (!$isEqualOp && !$isProviderEqualOp) { - return true; - } - return $this->versionCompare($provider->version, $this->version, '!=', $compareBranches); - } - - // an example for the condition is <= 2.0 & < 1.0 - // these kinds of comparisons always have a solution - if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) { - return !(strpos($this->version, 'dev-') === 0 || strpos($provider->version, 'dev-') === 0); - } - - $version1 = $isEqualOp ? $this->version : $provider->version; - $version2 = $isEqualOp ? $provider->version : $this->version; - $operator = $isEqualOp ? $provider->operator : $this->operator; - - if ($this->versionCompare($version1, $version2, self::$transOpInt[$operator], $compareBranches)) { - // special case, e.g. require >= 1.0 and provide < 1.0 - // 1.0 >= 1.0 but 1.0 is outside of the provided interval - - return !(self::$transOpInt[$provider->operator] === $providerNoEqualOp - && self::$transOpInt[$this->operator] !== $noEqualOp - && \version_compare($provider->version, $this->version, '==')); - } - - return false; - } - - /** - * @return string - */ - public function __toString() - { - return self::$transOpInt[$this->operator] . ' ' . $this->version; - } - - /** - * {@inheritDoc} - */ - public function getLowerBound() - { - $this->extractBounds(); - - return $this->lowerBound; - } - - /** - * {@inheritDoc} - */ - public function getUpperBound() - { - $this->extractBounds(); - - return $this->upperBound; - } - - /** - * @return void - */ - private function extractBounds() - { - if (null !== $this->lowerBound) { - return; - } - - // Branches - if (strpos($this->version, 'dev-') === 0) { - $this->lowerBound = Bound::zero(); - $this->upperBound = Bound::positiveInfinity(); - - return; - } - - switch ($this->operator) { - case self::OP_EQ: - $this->lowerBound = new Bound($this->version, true); - $this->upperBound = new Bound($this->version, true); - break; - case self::OP_LT: - $this->lowerBound = Bound::zero(); - $this->upperBound = new Bound($this->version, false); - break; - case self::OP_LE: - $this->lowerBound = Bound::zero(); - $this->upperBound = new Bound($this->version, true); - break; - case self::OP_GT: - $this->lowerBound = new Bound($this->version, false); - $this->upperBound = Bound::positiveInfinity(); - break; - case self::OP_GE: - $this->lowerBound = new Bound($this->version, true); - $this->upperBound = Bound::positiveInfinity(); - break; - case self::OP_NE: - $this->lowerBound = Bound::zero(); - $this->upperBound = Bound::positiveInfinity(); - break; - } - } -} diff --git a/vendor/composer/semver/src/Constraint/ConstraintInterface.php b/vendor/composer/semver/src/Constraint/ConstraintInterface.php deleted file mode 100644 index 389b935b..00000000 --- a/vendor/composer/semver/src/Constraint/ConstraintInterface.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * DO NOT IMPLEMENT this interface. It is only meant for usage as a type hint - * in libraries relying on composer/semver but creating your own constraint class - * that implements this interface is not a supported use case and will cause the - * composer/semver components to return unexpected results. - */ -interface ConstraintInterface -{ - /** - * Checks whether the given constraint intersects in any way with this constraint - * - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider); - - /** - * Provides a compiled version of the constraint for the given operator - * The compiled version must be a PHP expression. - * Executor of compile version must provide 2 variables: - * - $v = the string version to compare with - * - $b = whether or not the version is a non-comparable branch (starts with "dev-") - * - * @see Constraint::OP_* for the list of available operators. - * @example return '!$b && version_compare($v, '1.0', '>')'; - * - * @param int $otherOperator one Constraint::OP_* - * - * @return string - * - * @phpstan-param Constraint::OP_* $otherOperator - */ - public function compile($otherOperator); - - /** - * @return Bound - */ - public function getUpperBound(); - - /** - * @return Bound - */ - public function getLowerBound(); - - /** - * @return string - */ - public function getPrettyString(); - - /** - * @param string|null $prettyString - * - * @return void - */ - public function setPrettyString($prettyString); - - /** - * @return string - */ - public function __toString(); -} diff --git a/vendor/composer/semver/src/Constraint/MatchAllConstraint.php b/vendor/composer/semver/src/Constraint/MatchAllConstraint.php deleted file mode 100644 index 5e51af95..00000000 --- a/vendor/composer/semver/src/Constraint/MatchAllConstraint.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Defines the absence of a constraint. - * - * This constraint matches everything. - */ -class MatchAllConstraint implements ConstraintInterface -{ - /** @var string|null */ - protected $prettyString; - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function compile($otherOperator) - { - return 'true'; - } - - /** - * {@inheritDoc} - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * {@inheritDoc} - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return (string) $this; - } - - /** - * {@inheritDoc} - */ - public function __toString() - { - return '*'; - } - - /** - * {@inheritDoc} - */ - public function getUpperBound() - { - return Bound::positiveInfinity(); - } - - /** - * {@inheritDoc} - */ - public function getLowerBound() - { - return Bound::zero(); - } -} diff --git a/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php b/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php deleted file mode 100644 index dadcf622..00000000 --- a/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Blackhole of constraints, nothing escapes it - */ -class MatchNoneConstraint implements ConstraintInterface -{ - /** @var string|null */ - protected $prettyString; - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - return false; - } - - /** - * {@inheritDoc} - */ - public function compile($otherOperator) - { - return 'false'; - } - - /** - * {@inheritDoc} - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * {@inheritDoc} - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return (string) $this; - } - - /** - * {@inheritDoc} - */ - public function __toString() - { - return '[]'; - } - - /** - * {@inheritDoc} - */ - public function getUpperBound() - { - return new Bound('0.0.0.0-dev', false); - } - - /** - * {@inheritDoc} - */ - public function getLowerBound() - { - return new Bound('0.0.0.0-dev', false); - } -} diff --git a/vendor/composer/semver/src/Constraint/MultiConstraint.php b/vendor/composer/semver/src/Constraint/MultiConstraint.php deleted file mode 100644 index 1f4c0061..00000000 --- a/vendor/composer/semver/src/Constraint/MultiConstraint.php +++ /dev/null @@ -1,325 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Defines a conjunctive or disjunctive set of constraints. - */ -class MultiConstraint implements ConstraintInterface -{ - /** - * @var ConstraintInterface[] - * @phpstan-var non-empty-array - */ - protected $constraints; - - /** @var string|null */ - protected $prettyString; - - /** @var string|null */ - protected $string; - - /** @var bool */ - protected $conjunctive; - - /** @var Bound|null */ - protected $lowerBound; - - /** @var Bound|null */ - protected $upperBound; - - /** - * @param ConstraintInterface[] $constraints A set of constraints - * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive - * - * @throws \InvalidArgumentException If less than 2 constraints are passed - */ - public function __construct(array $constraints, $conjunctive = true) - { - if (\count($constraints) < 2) { - throw new \InvalidArgumentException( - 'Must provide at least two constraints for a MultiConstraint. Use '. - 'the regular Constraint class for one constraint only or MatchAllConstraint for none. You may use '. - 'MultiConstraint::create() which optimizes and handles those cases automatically.' - ); - } - - $this->constraints = $constraints; - $this->conjunctive = $conjunctive; - } - - /** - * @return ConstraintInterface[] - */ - public function getConstraints() - { - return $this->constraints; - } - - /** - * @return bool - */ - public function isConjunctive() - { - return $this->conjunctive; - } - - /** - * @return bool - */ - public function isDisjunctive() - { - return !$this->conjunctive; - } - - /** - * {@inheritDoc} - */ - public function compile($otherOperator) - { - $parts = array(); - foreach ($this->constraints as $constraint) { - $code = $constraint->compile($otherOperator); - if ($code === 'true') { - if (!$this->conjunctive) { - return 'true'; - } - } elseif ($code === 'false') { - if ($this->conjunctive) { - return 'false'; - } - } else { - $parts[] = '('.$code.')'; - } - } - - if (!$parts) { - return $this->conjunctive ? 'true' : 'false'; - } - - return $this->conjunctive ? implode('&&', $parts) : implode('||', $parts); - } - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - if (false === $this->conjunctive) { - foreach ($this->constraints as $constraint) { - if ($provider->matches($constraint)) { - return true; - } - } - - return false; - } - - // when matching a conjunctive and a disjunctive multi constraint we have to iterate over the disjunctive one - // otherwise we'd return true if different parts of the disjunctive constraint match the conjunctive one - // which would lead to incorrect results, e.g. [>1 and <2] would match [<1 or >2] although they do not intersect - if ($provider instanceof MultiConstraint && $provider->isDisjunctive()) { - return $provider->matches($this); - } - - foreach ($this->constraints as $constraint) { - if (!$provider->matches($constraint)) { - return false; - } - } - - return true; - } - - /** - * {@inheritDoc} - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * {@inheritDoc} - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return (string) $this; - } - - /** - * {@inheritDoc} - */ - public function __toString() - { - if ($this->string !== null) { - return $this->string; - } - - $constraints = array(); - foreach ($this->constraints as $constraint) { - $constraints[] = (string) $constraint; - } - - return $this->string = '[' . implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']'; - } - - /** - * {@inheritDoc} - */ - public function getLowerBound() - { - $this->extractBounds(); - - if (null === $this->lowerBound) { - throw new \LogicException('extractBounds should have populated the lowerBound property'); - } - - return $this->lowerBound; - } - - /** - * {@inheritDoc} - */ - public function getUpperBound() - { - $this->extractBounds(); - - if (null === $this->upperBound) { - throw new \LogicException('extractBounds should have populated the upperBound property'); - } - - return $this->upperBound; - } - - /** - * Tries to optimize the constraints as much as possible, meaning - * reducing/collapsing congruent constraints etc. - * Does not necessarily return a MultiConstraint instance if - * things can be reduced to a simple constraint - * - * @param ConstraintInterface[] $constraints A set of constraints - * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive - * - * @return ConstraintInterface - */ - public static function create(array $constraints, $conjunctive = true) - { - if (0 === \count($constraints)) { - return new MatchAllConstraint(); - } - - if (1 === \count($constraints)) { - return $constraints[0]; - } - - $optimized = self::optimizeConstraints($constraints, $conjunctive); - if ($optimized !== null) { - list($constraints, $conjunctive) = $optimized; - if (\count($constraints) === 1) { - return $constraints[0]; - } - } - - return new self($constraints, $conjunctive); - } - - /** - * @param ConstraintInterface[] $constraints - * @param bool $conjunctive - * @return ?array - * - * @phpstan-return array{0: list, 1: bool}|null - */ - private static function optimizeConstraints(array $constraints, $conjunctive) - { - // parse the two OR groups and if they are contiguous we collapse - // them into one constraint - // [>= 1 < 2] || [>= 2 < 3] || [>= 3 < 4] => [>= 1 < 4] - if (!$conjunctive) { - $left = $constraints[0]; - $mergedConstraints = array(); - $optimized = false; - for ($i = 1, $l = \count($constraints); $i < $l; $i++) { - $right = $constraints[$i]; - if ( - $left instanceof self - && $left->conjunctive - && $right instanceof self - && $right->conjunctive - && \count($left->constraints) === 2 - && \count($right->constraints) === 2 - && ($left0 = (string) $left->constraints[0]) - && $left0[0] === '>' && $left0[1] === '=' - && ($left1 = (string) $left->constraints[1]) - && $left1[0] === '<' - && ($right0 = (string) $right->constraints[0]) - && $right0[0] === '>' && $right0[1] === '=' - && ($right1 = (string) $right->constraints[1]) - && $right1[0] === '<' - && substr($left1, 2) === substr($right0, 3) - ) { - $optimized = true; - $left = new MultiConstraint( - array( - $left->constraints[0], - $right->constraints[1], - ), - true); - } else { - $mergedConstraints[] = $left; - $left = $right; - } - } - if ($optimized) { - $mergedConstraints[] = $left; - return array($mergedConstraints, false); - } - } - - // TODO: Here's the place to put more optimizations - - return null; - } - - /** - * @return void - */ - private function extractBounds() - { - if (null !== $this->lowerBound) { - return; - } - - foreach ($this->constraints as $constraint) { - if (null === $this->lowerBound || null === $this->upperBound) { - $this->lowerBound = $constraint->getLowerBound(); - $this->upperBound = $constraint->getUpperBound(); - continue; - } - - if ($constraint->getLowerBound()->compareTo($this->lowerBound, $this->isConjunctive() ? '>' : '<')) { - $this->lowerBound = $constraint->getLowerBound(); - } - - if ($constraint->getUpperBound()->compareTo($this->upperBound, $this->isConjunctive() ? '<' : '>')) { - $this->upperBound = $constraint->getUpperBound(); - } - } - } -} diff --git a/vendor/composer/semver/src/Interval.php b/vendor/composer/semver/src/Interval.php deleted file mode 100644 index 43d5a4f5..00000000 --- a/vendor/composer/semver/src/Interval.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; - -class Interval -{ - /** @var Constraint */ - private $start; - /** @var Constraint */ - private $end; - - public function __construct(Constraint $start, Constraint $end) - { - $this->start = $start; - $this->end = $end; - } - - /** - * @return Constraint - */ - public function getStart() - { - return $this->start; - } - - /** - * @return Constraint - */ - public function getEnd() - { - return $this->end; - } - - /** - * @return Constraint - */ - public static function fromZero() - { - static $zero; - - if (null === $zero) { - $zero = new Constraint('>=', '0.0.0.0-dev'); - } - - return $zero; - } - - /** - * @return Constraint - */ - public static function untilPositiveInfinity() - { - static $positiveInfinity; - - if (null === $positiveInfinity) { - $positiveInfinity = new Constraint('<', PHP_INT_MAX.'.0.0.0'); - } - - return $positiveInfinity; - } - - /** - * @return self - */ - public static function any() - { - return new self(self::fromZero(), self::untilPositiveInfinity()); - } - - /** - * @return array{'names': string[], 'exclude': bool} - */ - public static function anyDev() - { - // any == exclude nothing - return array('names' => array(), 'exclude' => true); - } - - /** - * @return array{'names': string[], 'exclude': bool} - */ - public static function noDev() - { - // nothing == no names included - return array('names' => array(), 'exclude' => false); - } -} diff --git a/vendor/composer/semver/src/Intervals.php b/vendor/composer/semver/src/Intervals.php deleted file mode 100644 index d889d0ad..00000000 --- a/vendor/composer/semver/src/Intervals.php +++ /dev/null @@ -1,478 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; -use Composer\Semver\Constraint\ConstraintInterface; -use Composer\Semver\Constraint\MatchAllConstraint; -use Composer\Semver\Constraint\MatchNoneConstraint; -use Composer\Semver\Constraint\MultiConstraint; - -/** - * Helper class generating intervals from constraints - * - * This contains utilities for: - * - * - compacting an existing constraint which can be used to combine several into one - * by creating a MultiConstraint out of the many constraints you have. - * - * - checking whether one subset is a subset of another. - * - * Note: You should call clear to free memoization memory usage when you are done using this class - */ -class Intervals -{ - /** - * @phpstan-var array - */ - private static $intervalsCache = array(); - - /** - * @phpstan-var array - */ - private static $opSortOrder = array( - '>=' => -3, - '<' => -2, - '>' => 2, - '<=' => 3, - ); - - /** - * Clears the memoization cache once you are done - * - * @return void - */ - public static function clear() - { - self::$intervalsCache = array(); - } - - /** - * Checks whether $candidate is a subset of $constraint - * - * @return bool - */ - public static function isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint) - { - if ($constraint instanceof MatchAllConstraint) { - return true; - } - - if ($candidate instanceof MatchNoneConstraint || $constraint instanceof MatchNoneConstraint) { - return false; - } - - $intersectionIntervals = self::get(new MultiConstraint(array($candidate, $constraint), true)); - $candidateIntervals = self::get($candidate); - if (\count($intersectionIntervals['numeric']) !== \count($candidateIntervals['numeric'])) { - return false; - } - - foreach ($intersectionIntervals['numeric'] as $index => $interval) { - if (!isset($candidateIntervals['numeric'][$index])) { - return false; - } - - if ((string) $candidateIntervals['numeric'][$index]->getStart() !== (string) $interval->getStart()) { - return false; - } - - if ((string) $candidateIntervals['numeric'][$index]->getEnd() !== (string) $interval->getEnd()) { - return false; - } - } - - if ($intersectionIntervals['branches']['exclude'] !== $candidateIntervals['branches']['exclude']) { - return false; - } - if (\count($intersectionIntervals['branches']['names']) !== \count($candidateIntervals['branches']['names'])) { - return false; - } - foreach ($intersectionIntervals['branches']['names'] as $index => $name) { - if ($name !== $candidateIntervals['branches']['names'][$index]) { - return false; - } - } - - return true; - } - - /** - * Checks whether $a and $b have any intersection, equivalent to $a->matches($b) - * - * @return bool - */ - public static function haveIntersections(ConstraintInterface $a, ConstraintInterface $b) - { - if ($a instanceof MatchAllConstraint || $b instanceof MatchAllConstraint) { - return true; - } - - if ($a instanceof MatchNoneConstraint || $b instanceof MatchNoneConstraint) { - return false; - } - - $intersectionIntervals = self::generateIntervals(new MultiConstraint(array($a, $b), true), true); - - return \count($intersectionIntervals['numeric']) > 0 || $intersectionIntervals['branches']['exclude'] || \count($intersectionIntervals['branches']['names']) > 0; - } - - /** - * Attempts to optimize a MultiConstraint - * - * When merging MultiConstraints together they can get very large, this will - * compact it by looking at the real intervals covered by all the constraints - * and then creates a new constraint containing only the smallest amount of rules - * to match the same intervals. - * - * @return ConstraintInterface - */ - public static function compactConstraint(ConstraintInterface $constraint) - { - if (!$constraint instanceof MultiConstraint) { - return $constraint; - } - - $intervals = self::generateIntervals($constraint); - $constraints = array(); - $hasNumericMatchAll = false; - - if (\count($intervals['numeric']) === 1 && (string) $intervals['numeric'][0]->getStart() === (string) Interval::fromZero() && (string) $intervals['numeric'][0]->getEnd() === (string) Interval::untilPositiveInfinity()) { - $constraints[] = $intervals['numeric'][0]->getStart(); - $hasNumericMatchAll = true; - } else { - $unEqualConstraints = array(); - for ($i = 0, $count = \count($intervals['numeric']); $i < $count; $i++) { - $interval = $intervals['numeric'][$i]; - - // if current interval ends with < N and next interval begins with > N we can swap this out for != N - // but this needs to happen as a conjunctive expression together with the start of the current interval - // and end of next interval, so [>=M, N, [>=M, !=N, getEnd()->getOperator() === '<' && $i+1 < $count) { - $nextInterval = $intervals['numeric'][$i+1]; - if ($interval->getEnd()->getVersion() === $nextInterval->getStart()->getVersion() && $nextInterval->getStart()->getOperator() === '>') { - // only add a start if we didn't already do so, can be skipped if we're looking at second - // interval in [>=M, N, P, =M, !=N] already and we only want to add !=P right now - if (\count($unEqualConstraints) === 0 && (string) $interval->getStart() !== (string) Interval::fromZero()) { - $unEqualConstraints[] = $interval->getStart(); - } - $unEqualConstraints[] = new Constraint('!=', $interval->getEnd()->getVersion()); - continue; - } - } - - if (\count($unEqualConstraints) > 0) { - // this is where the end of the following interval of a != constraint is added as explained above - if ((string) $interval->getEnd() !== (string) Interval::untilPositiveInfinity()) { - $unEqualConstraints[] = $interval->getEnd(); - } - - // count is 1 if entire constraint is just one != expression - if (\count($unEqualConstraints) > 1) { - $constraints[] = new MultiConstraint($unEqualConstraints, true); - } else { - $constraints[] = $unEqualConstraints[0]; - } - - $unEqualConstraints = array(); - continue; - } - - // convert back >= x - <= x intervals to == x - if ($interval->getStart()->getVersion() === $interval->getEnd()->getVersion() && $interval->getStart()->getOperator() === '>=' && $interval->getEnd()->getOperator() === '<=') { - $constraints[] = new Constraint('==', $interval->getStart()->getVersion()); - continue; - } - - if ((string) $interval->getStart() === (string) Interval::fromZero()) { - $constraints[] = $interval->getEnd(); - } elseif ((string) $interval->getEnd() === (string) Interval::untilPositiveInfinity()) { - $constraints[] = $interval->getStart(); - } else { - $constraints[] = new MultiConstraint(array($interval->getStart(), $interval->getEnd()), true); - } - } - } - - $devConstraints = array(); - - if (0 === \count($intervals['branches']['names'])) { - if ($intervals['branches']['exclude']) { - if ($hasNumericMatchAll) { - return new MatchAllConstraint; - } - // otherwise constraint should contain a != operator and already cover this - } - } else { - foreach ($intervals['branches']['names'] as $branchName) { - if ($intervals['branches']['exclude']) { - $devConstraints[] = new Constraint('!=', $branchName); - } else { - $devConstraints[] = new Constraint('==', $branchName); - } - } - - // excluded branches, e.g. != dev-foo are conjunctive with the interval, so - // > 2.0 != dev-foo must return a conjunctive constraint - if ($intervals['branches']['exclude']) { - if (\count($constraints) > 1) { - return new MultiConstraint(array_merge( - array(new MultiConstraint($constraints, false)), - $devConstraints - ), true); - } - - if (\count($constraints) === 1 && (string)$constraints[0] === (string)Interval::fromZero()) { - if (\count($devConstraints) > 1) { - return new MultiConstraint($devConstraints, true); - } - return $devConstraints[0]; - } - - return new MultiConstraint(array_merge($constraints, $devConstraints), true); - } - - // otherwise devConstraints contains a list of == operators for branches which are disjunctive with the - // rest of the constraint - $constraints = array_merge($constraints, $devConstraints); - } - - if (\count($constraints) > 1) { - return new MultiConstraint($constraints, false); - } - - if (\count($constraints) === 1) { - return $constraints[0]; - } - - return new MatchNoneConstraint; - } - - /** - * Creates an array of numeric intervals and branch constraints representing a given constraint - * - * if the returned numeric array is empty it means the constraint matches nothing in the numeric range (0 - +inf) - * if the returned branches array is empty it means no dev-* versions are matched - * if a constraint matches all possible dev-* versions, branches will contain Interval::anyDev() - * - * @return array - * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} - */ - public static function get(ConstraintInterface $constraint) - { - $key = (string) $constraint; - - if (!isset(self::$intervalsCache[$key])) { - self::$intervalsCache[$key] = self::generateIntervals($constraint); - } - - return self::$intervalsCache[$key]; - } - - /** - * @param bool $stopOnFirstValidInterval - * - * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} - */ - private static function generateIntervals(ConstraintInterface $constraint, $stopOnFirstValidInterval = false) - { - if ($constraint instanceof MatchAllConstraint) { - return array('numeric' => array(new Interval(Interval::fromZero(), Interval::untilPositiveInfinity())), 'branches' => Interval::anyDev()); - } - - if ($constraint instanceof MatchNoneConstraint) { - return array('numeric' => array(), 'branches' => array('names' => array(), 'exclude' => false)); - } - - if ($constraint instanceof Constraint) { - return self::generateSingleConstraintIntervals($constraint); - } - - if (!$constraint instanceof MultiConstraint) { - throw new \UnexpectedValueException('The constraint passed in should be an MatchAllConstraint, Constraint or MultiConstraint instance, got '.\get_class($constraint).'.'); - } - - $constraints = $constraint->getConstraints(); - - $numericGroups = array(); - $constraintBranches = array(); - foreach ($constraints as $c) { - $res = self::get($c); - $numericGroups[] = $res['numeric']; - $constraintBranches[] = $res['branches']; - } - - if ($constraint->isDisjunctive()) { - $branches = Interval::noDev(); - foreach ($constraintBranches as $b) { - if ($b['exclude']) { - if ($branches['exclude']) { - // disjunctive constraint, so only exclude what's excluded in all constraints - // !=a,!=b || !=b,!=c => !=b - $branches['names'] = array_intersect($branches['names'], $b['names']); - } else { - // disjunctive constraint so exclude all names which are not explicitly included in the alternative - // (==b || ==c) || !=a,!=b => !=a - $branches['exclude'] = true; - $branches['names'] = array_diff($b['names'], $branches['names']); - } - } else { - if ($branches['exclude']) { - // disjunctive constraint so exclude all names which are not explicitly included in the alternative - // !=a,!=b || (==b || ==c) => !=a - $branches['names'] = array_diff($branches['names'], $b['names']); - } else { - // disjunctive constraint, so just add all the other branches - // (==a || ==b) || ==c => ==a || ==b || ==c - $branches['names'] = array_merge($branches['names'], $b['names']); - } - } - } - } else { - $branches = Interval::anyDev(); - foreach ($constraintBranches as $b) { - if ($b['exclude']) { - if ($branches['exclude']) { - // conjunctive, so just add all branch names to be excluded - // !=a && !=b => !=a,!=b - $branches['names'] = array_merge($branches['names'], $b['names']); - } else { - // conjunctive, so only keep included names which are not excluded - // (==a||==c) && !=a,!=b => ==c - $branches['names'] = array_diff($branches['names'], $b['names']); - } - } else { - if ($branches['exclude']) { - // conjunctive, so only keep included names which are not excluded - // !=a,!=b && (==a||==c) => ==c - $branches['names'] = array_diff($b['names'], $branches['names']); - $branches['exclude'] = false; - } else { - // conjunctive, so only keep names that are included in both - // (==a||==b) && (==a||==c) => ==a - $branches['names'] = array_intersect($branches['names'], $b['names']); - } - } - } - } - - $branches['names'] = array_unique($branches['names']); - - if (\count($numericGroups) === 1) { - return array('numeric' => $numericGroups[0], 'branches' => $branches); - } - - $borders = array(); - foreach ($numericGroups as $group) { - foreach ($group as $interval) { - $borders[] = array('version' => $interval->getStart()->getVersion(), 'operator' => $interval->getStart()->getOperator(), 'side' => 'start'); - $borders[] = array('version' => $interval->getEnd()->getVersion(), 'operator' => $interval->getEnd()->getOperator(), 'side' => 'end'); - } - } - - $opSortOrder = self::$opSortOrder; - usort($borders, function ($a, $b) use ($opSortOrder) { - $order = version_compare($a['version'], $b['version']); - if ($order === 0) { - return $opSortOrder[$a['operator']] - $opSortOrder[$b['operator']]; - } - - return $order; - }); - - $activeIntervals = 0; - $intervals = array(); - $index = 0; - $activationThreshold = $constraint->isConjunctive() ? \count($numericGroups) : 1; - $start = null; - foreach ($borders as $border) { - if ($border['side'] === 'start') { - $activeIntervals++; - } else { - $activeIntervals--; - } - if (!$start && $activeIntervals >= $activationThreshold) { - $start = new Constraint($border['operator'], $border['version']); - } elseif ($start && $activeIntervals < $activationThreshold) { - // filter out invalid intervals like > x - <= x, or >= x - < x - if ( - version_compare($start->getVersion(), $border['version'], '=') - && ( - ($start->getOperator() === '>' && $border['operator'] === '<=') - || ($start->getOperator() === '>=' && $border['operator'] === '<') - ) - ) { - unset($intervals[$index]); - } else { - $intervals[$index] = new Interval($start, new Constraint($border['operator'], $border['version'])); - $index++; - - if ($stopOnFirstValidInterval) { - break; - } - } - - $start = null; - } - } - - return array('numeric' => $intervals, 'branches' => $branches); - } - - /** - * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} - */ - private static function generateSingleConstraintIntervals(Constraint $constraint) - { - $op = $constraint->getOperator(); - - // handle branch constraints first - if (strpos($constraint->getVersion(), 'dev-') === 0) { - $intervals = array(); - $branches = array('names' => array(), 'exclude' => false); - - // != dev-foo means any numeric version may match, we treat >/< like != they are not really defined for branches - if ($op === '!=') { - $intervals[] = new Interval(Interval::fromZero(), Interval::untilPositiveInfinity()); - $branches = array('names' => array($constraint->getVersion()), 'exclude' => true); - } elseif ($op === '==') { - $branches['names'][] = $constraint->getVersion(); - } - - return array( - 'numeric' => $intervals, - 'branches' => $branches, - ); - } - - if ($op[0] === '>') { // > & >= - return array('numeric' => array(new Interval($constraint, Interval::untilPositiveInfinity())), 'branches' => Interval::noDev()); - } - if ($op[0] === '<') { // < & <= - return array('numeric' => array(new Interval(Interval::fromZero(), $constraint)), 'branches' => Interval::noDev()); - } - if ($op === '!=') { - // convert !=x to intervals of 0 - x - +inf + dev* - return array('numeric' => array( - new Interval(Interval::fromZero(), new Constraint('<', $constraint->getVersion())), - new Interval(new Constraint('>', $constraint->getVersion()), Interval::untilPositiveInfinity()), - ), 'branches' => Interval::anyDev()); - } - - // convert ==x to an interval of >=x - <=x - return array('numeric' => array( - new Interval(new Constraint('>=', $constraint->getVersion()), new Constraint('<=', $constraint->getVersion())), - ), 'branches' => Interval::noDev()); - } -} diff --git a/vendor/composer/semver/src/Semver.php b/vendor/composer/semver/src/Semver.php deleted file mode 100644 index 4d6de3c2..00000000 --- a/vendor/composer/semver/src/Semver.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; - -class Semver -{ - const SORT_ASC = 1; - const SORT_DESC = -1; - - /** @var VersionParser */ - private static $versionParser; - - /** - * Determine if given version satisfies given constraints. - * - * @param string $version - * @param string $constraints - * - * @return bool - */ - public static function satisfies($version, $constraints) - { - if (null === self::$versionParser) { - self::$versionParser = new VersionParser(); - } - - $versionParser = self::$versionParser; - $provider = new Constraint('==', $versionParser->normalize($version)); - $parsedConstraints = $versionParser->parseConstraints($constraints); - - return $parsedConstraints->matches($provider); - } - - /** - * Return all versions that satisfy given constraints. - * - * @param string[] $versions - * @param string $constraints - * - * @return string[] - */ - public static function satisfiedBy(array $versions, $constraints) - { - $versions = array_filter($versions, function ($version) use ($constraints) { - return Semver::satisfies($version, $constraints); - }); - - return array_values($versions); - } - - /** - * Sort given array of versions. - * - * @param string[] $versions - * - * @return string[] - */ - public static function sort(array $versions) - { - return self::usort($versions, self::SORT_ASC); - } - - /** - * Sort given array of versions in reverse. - * - * @param string[] $versions - * - * @return string[] - */ - public static function rsort(array $versions) - { - return self::usort($versions, self::SORT_DESC); - } - - /** - * @param string[] $versions - * @param int $direction - * - * @return string[] - */ - private static function usort(array $versions, $direction) - { - if (null === self::$versionParser) { - self::$versionParser = new VersionParser(); - } - - $versionParser = self::$versionParser; - $normalized = array(); - - // Normalize outside of usort() scope for minor performance increase. - // Creates an array of arrays: [[normalized, key], ...] - foreach ($versions as $key => $version) { - $normalizedVersion = $versionParser->normalize($version); - $normalizedVersion = $versionParser->normalizeDefaultBranch($normalizedVersion); - $normalized[] = array($normalizedVersion, $key); - } - - usort($normalized, function (array $left, array $right) use ($direction) { - if ($left[0] === $right[0]) { - return 0; - } - - if (Comparator::lessThan($left[0], $right[0])) { - return -$direction; - } - - return $direction; - }); - - // Recreate input array, using the original indexes which are now in sorted order. - $sorted = array(); - foreach ($normalized as $item) { - $sorted[] = $versions[$item[1]]; - } - - return $sorted; - } -} diff --git a/vendor/composer/semver/src/VersionParser.php b/vendor/composer/semver/src/VersionParser.php deleted file mode 100644 index 202ce247..00000000 --- a/vendor/composer/semver/src/VersionParser.php +++ /dev/null @@ -1,586 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\ConstraintInterface; -use Composer\Semver\Constraint\MatchAllConstraint; -use Composer\Semver\Constraint\MultiConstraint; -use Composer\Semver\Constraint\Constraint; - -/** - * Version parser. - * - * @author Jordi Boggiano - */ -class VersionParser -{ - /** - * Regex to match pre-release data (sort of). - * - * Due to backwards compatibility: - * - Instead of enforcing hyphen, an underscore, dot or nothing at all are also accepted. - * - Only stabilities as recognized by Composer are allowed to precede a numerical identifier. - * - Numerical-only pre-release identifiers are not supported, see tests. - * - * |--------------| - * [major].[minor].[patch] -[pre-release] +[build-metadata] - * - * @var string - */ - private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\d+)*+)?)?([.-]?dev)?'; - - /** @var string */ - private static $stabilitiesRegex = 'stable|RC|beta|alpha|dev'; - - /** - * Returns the stability of a version. - * - * @param string $version - * - * @return string - * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev' - */ - public static function parseStability($version) - { - $version = (string) preg_replace('{#.+$}', '', (string) $version); - - if (strpos($version, 'dev-') === 0 || '-dev' === substr($version, -4)) { - return 'dev'; - } - - preg_match('{' . self::$modifierRegex . '(?:\+.*)?$}i', strtolower($version), $match); - - if (!empty($match[3])) { - return 'dev'; - } - - if (!empty($match[1])) { - if ('beta' === $match[1] || 'b' === $match[1]) { - return 'beta'; - } - if ('alpha' === $match[1] || 'a' === $match[1]) { - return 'alpha'; - } - if ('rc' === $match[1]) { - return 'RC'; - } - } - - return 'stable'; - } - - /** - * @param string $stability - * - * @return string - */ - public static function normalizeStability($stability) - { - $stability = strtolower((string) $stability); - - return $stability === 'rc' ? 'RC' : $stability; - } - - /** - * Normalizes a version string to be able to perform comparisons on it. - * - * @param string $version - * @param ?string $fullVersion optional complete version string to give more context - * - * @throws \UnexpectedValueException - * - * @return string - */ - public function normalize($version, $fullVersion = null) - { - $version = trim((string) $version); - $origVersion = $version; - if (null === $fullVersion) { - $fullVersion = $version; - } - - // strip off aliasing - if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $version, $match)) { - $version = $match[1]; - } - - // strip off stability flag - if (preg_match('{@(?:' . self::$stabilitiesRegex . ')$}i', $version, $match)) { - $version = substr($version, 0, strlen($version) - strlen($match[0])); - } - - // normalize master/trunk/default branches to dev-name for BC with 1.x as these used to be valid constraints - if (\in_array($version, array('master', 'trunk', 'default'), true)) { - $version = 'dev-' . $version; - } - - // if requirement is branch-like, use full name - if (stripos($version, 'dev-') === 0) { - return 'dev-' . substr($version, 4); - } - - // strip off build metadata - if (preg_match('{^([^,\s+]++)\+[^\s]++$}', $version, $match)) { - $version = $match[1]; - } - - // match classical versioning - if (preg_match('{^v?(\d{1,5})(\.\d++)?(\.\d++)?(\.\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) { - $version = $matches[1] - . (!empty($matches[2]) ? $matches[2] : '.0') - . (!empty($matches[3]) ? $matches[3] : '.0') - . (!empty($matches[4]) ? $matches[4] : '.0'); - $index = 5; - // match date(time) based versioning - } elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3})?)' . self::$modifierRegex . '$}i', $version, $matches)) { - $version = preg_replace('{\D}', '.', $matches[1]); - $index = 2; - } - - // add version modifiers if a version was matched - if (isset($index)) { - if (!empty($matches[$index])) { - if ('stable' === $matches[$index]) { - return $version; - } - $version .= '-' . $this->expandStability($matches[$index]) . (isset($matches[$index + 1]) && '' !== $matches[$index + 1] ? ltrim($matches[$index + 1], '.-') : ''); - } - - if (!empty($matches[$index + 2])) { - $version .= '-dev'; - } - - return $version; - } - - // match dev branches - if (preg_match('{(.*?)[.-]?dev$}i', $version, $match)) { - try { - $normalized = $this->normalizeBranch($match[1]); - // a branch ending with -dev is only valid if it is numeric - // if it gets prefixed with dev- it means the branch name should - // have had a dev- prefix already when passed to normalize - if (strpos($normalized, 'dev-') === false) { - return $normalized; - } - } catch (\Exception $e) { - } - } - - $extraMessage = ''; - if (preg_match('{ +as +' . preg_quote($version) . '(?:@(?:'.self::$stabilitiesRegex.'))?$}', $fullVersion)) { - $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version'; - } elseif (preg_match('{^' . preg_quote($version) . '(?:@(?:'.self::$stabilitiesRegex.'))? +as +}', $fullVersion)) { - $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-'; - } - - throw new \UnexpectedValueException('Invalid version string "' . $origVersion . '"' . $extraMessage); - } - - /** - * Extract numeric prefix from alias, if it is in numeric format, suitable for version comparison. - * - * @param string $branch Branch name (e.g. 2.1.x-dev) - * - * @return string|false Numeric prefix if present (e.g. 2.1.) or false - */ - public function parseNumericAliasPrefix($branch) - { - if (preg_match('{^(?P(\d++\\.)*\d++)(?:\.x)?-dev$}i', (string) $branch, $matches)) { - return $matches['version'] . '.'; - } - - return false; - } - - /** - * Normalizes a branch name to be able to perform comparisons on it. - * - * @param string $name - * - * @return string - */ - public function normalizeBranch($name) - { - $name = trim((string) $name); - - if (preg_match('{^v?(\d++)(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?$}i', $name, $matches)) { - $version = ''; - for ($i = 1; $i < 5; ++$i) { - $version .= isset($matches[$i]) ? str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x'; - } - - return str_replace('x', '9999999', $version) . '-dev'; - } - - return 'dev-' . $name; - } - - /** - * Normalizes a default branch name (i.e. master on git) to 9999999-dev. - * - * @param string $name - * - * @return string - * - * @deprecated No need to use this anymore in theory, Composer 2 does not normalize any branch names to 9999999-dev anymore - */ - public function normalizeDefaultBranch($name) - { - if ($name === 'dev-master' || $name === 'dev-default' || $name === 'dev-trunk') { - return '9999999-dev'; - } - - return (string) $name; - } - - /** - * Parses a constraint string into MultiConstraint and/or Constraint objects. - * - * @param string $constraints - * - * @return ConstraintInterface - */ - public function parseConstraints($constraints) - { - $prettyConstraint = (string) $constraints; - - $orConstraints = preg_split('{\s*\|\|?\s*}', trim((string) $constraints)); - if (false === $orConstraints) { - throw new \RuntimeException('Failed to preg_split string: '.$constraints); - } - $orGroups = array(); - - foreach ($orConstraints as $constraints) { - $andConstraints = preg_split('{(?< ,]) *(? 1) { - $constraintObjects = array(); - foreach ($andConstraints as $constraint) { - foreach ($this->parseConstraint($constraint) as $parsedConstraint) { - $constraintObjects[] = $parsedConstraint; - } - } - } else { - $constraintObjects = $this->parseConstraint($andConstraints[0]); - } - - if (1 === \count($constraintObjects)) { - $constraint = $constraintObjects[0]; - } else { - $constraint = new MultiConstraint($constraintObjects); - } - - $orGroups[] = $constraint; - } - - $constraint = MultiConstraint::create($orGroups, false); - - $constraint->setPrettyString($prettyConstraint); - - return $constraint; - } - - /** - * @param string $constraint - * - * @throws \UnexpectedValueException - * - * @return array - * - * @phpstan-return non-empty-array - */ - private function parseConstraint($constraint) - { - // strip off aliasing - if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $constraint, $match)) { - $constraint = $match[1]; - } - - // strip @stability flags, and keep it for later use - if (preg_match('{^([^,\s]*?)@(' . self::$stabilitiesRegex . ')$}i', $constraint, $match)) { - $constraint = '' !== $match[1] ? $match[1] : '*'; - if ($match[2] !== 'stable') { - $stabilityModifier = $match[2]; - } - } - - // get rid of #refs as those are used by composer only - if (preg_match('{^(dev-[^,\s@]+?|[^,\s@]+?\.x-dev)#.+$}i', $constraint, $match)) { - $constraint = $match[1]; - } - - if (preg_match('{^(v)?[xX*](\.[xX*])*$}i', $constraint, $match)) { - if (!empty($match[1]) || !empty($match[2])) { - return array(new Constraint('>=', '0.0.0.0-dev')); - } - - return array(new MatchAllConstraint()); - } - - $versionRegex = 'v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.(\d++))?(?:' . self::$modifierRegex . '|\.([xX*][.-]?dev))(?:\+[^\s]+)?'; - - // Tilde Range - // - // Like wildcard constraints, unsuffixed tilde constraints say that they must be greater than the previous - // version, to ensure that unstable instances of the current version are allowed. However, if a stability - // suffix is added to the constraint, then a >= match on the current version is used instead. - if (preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) { - if (strpos($constraint, '~>') === 0) { - throw new \UnexpectedValueException( - 'Could not parse version constraint ' . $constraint . ': ' . - 'Invalid operator "~>", you probably meant to use the "~" operator' - ); - } - - // Work out which position in the version we are operating at - if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) { - $position = 4; - } elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { - $position = 3; - } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { - $position = 2; - } else { - $position = 1; - } - - // when matching 2.x-dev or 3.0.x-dev we have to shift the second or third number, despite no second/third number matching above - if (!empty($matches[8])) { - $position++; - } - - // Calculate the stability suffix - $stabilitySuffix = ''; - if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { - $stabilitySuffix .= '-dev'; - } - - $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1)); - $lowerBound = new Constraint('>=', $lowVersion); - - // For upper bound, we increment the position of one more significance, - // but highPosition = 0 would be illegal - $highPosition = max(1, $position - 1); - $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev'; - $upperBound = new Constraint('<', $highVersion); - - return array( - $lowerBound, - $upperBound, - ); - } - - // Caret Range - // - // Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple. - // In other words, this allows patch and minor updates for versions 1.0.0 and above, patch updates for - // versions 0.X >=0.1.0, and no updates for versions 0.0.X - if (preg_match('{^\^' . $versionRegex . '($)}i', $constraint, $matches)) { - // Work out which position in the version we are operating at - if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) { - $position = 1; - } elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) { - $position = 2; - } else { - $position = 3; - } - - // Calculate the stability suffix - $stabilitySuffix = ''; - if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { - $stabilitySuffix .= '-dev'; - } - - $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1)); - $lowerBound = new Constraint('>=', $lowVersion); - - // For upper bound, we increment the position of one more significance, - // but highPosition = 0 would be illegal - $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; - $upperBound = new Constraint('<', $highVersion); - - return array( - $lowerBound, - $upperBound, - ); - } - - // X Range - // - // Any of X, x, or * may be used to "stand in" for one of the numeric values in the [major, minor, patch] tuple. - // A partial version range is treated as an X-Range, so the special character is in fact optional. - if (preg_match('{^v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.[xX*])++$}', $constraint, $matches)) { - if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { - $position = 3; - } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { - $position = 2; - } else { - $position = 1; - } - - $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev'; - $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; - - if ($lowVersion === '0.0.0.0-dev') { - return array(new Constraint('<', $highVersion)); - } - - return array( - new Constraint('>=', $lowVersion), - new Constraint('<', $highVersion), - ); - } - - // Hyphen Range - // - // Specifies an inclusive set. If a partial version is provided as the first version in the inclusive range, - // then the missing pieces are replaced with zeroes. If a partial version is provided as the second version in - // the inclusive range, then all versions that start with the supplied parts of the tuple are accepted, but - // nothing that would be greater than the provided tuple parts. - if (preg_match('{^(?P' . $versionRegex . ') +- +(?P' . $versionRegex . ')($)}i', $constraint, $matches)) { - // Calculate the stability suffix - $lowStabilitySuffix = ''; - if (empty($matches[6]) && empty($matches[8]) && empty($matches[9])) { - $lowStabilitySuffix = '-dev'; - } - - $lowVersion = $this->normalize($matches['from']); - $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix); - - $empty = function ($x) { - return ($x === 0 || $x === '0') ? false : empty($x); - }; - - if ((!$empty($matches[12]) && !$empty($matches[13])) || !empty($matches[15]) || !empty($matches[17]) || !empty($matches[18])) { - $highVersion = $this->normalize($matches['to']); - $upperBound = new Constraint('<=', $highVersion); - } else { - $highMatch = array('', $matches[11], $matches[12], $matches[13], $matches[14]); - - // validate to version - $this->normalize($matches['to']); - - $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[12]) ? 1 : 2, 1) . '-dev'; - $upperBound = new Constraint('<', $highVersion); - } - - return array( - $lowerBound, - $upperBound, - ); - } - - // Basic Comparators - if (preg_match('{^(<>|!=|>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) { - try { - try { - $version = $this->normalize($matches[2]); - } catch (\UnexpectedValueException $e) { - // recover from an invalid constraint like foobar-dev which should be dev-foobar - // except if the constraint uses a known operator, in which case it must be a parse error - if (substr($matches[2], -4) === '-dev' && preg_match('{^[0-9a-zA-Z-./]+$}', $matches[2])) { - $version = $this->normalize('dev-'.substr($matches[2], 0, -4)); - } else { - throw $e; - } - } - - $op = $matches[1] ?: '='; - - if ($op !== '==' && $op !== '=' && !empty($stabilityModifier) && self::parseStability($version) === 'stable') { - $version .= '-' . $stabilityModifier; - } elseif ('<' === $op || '>=' === $op) { - if (!preg_match('/-' . self::$modifierRegex . '$/', strtolower($matches[2]))) { - if (strpos($matches[2], 'dev-') !== 0) { - $version .= '-dev'; - } - } - } - - return array(new Constraint($matches[1] ?: '=', $version)); - } catch (\Exception $e) { - } - } - - $message = 'Could not parse version constraint ' . $constraint; - if (isset($e)) { - $message .= ': ' . $e->getMessage(); - } - - throw new \UnexpectedValueException($message); - } - - /** - * Increment, decrement, or simply pad a version number. - * - * Support function for {@link parseConstraint()} - * - * @param array $matches Array with version parts in array indexes 1,2,3,4 - * @param int $position 1,2,3,4 - which segment of the version to increment/decrement - * @param int $increment - * @param string $pad The string to pad version parts after $position - * - * @return string|null The new version - * - * @phpstan-param string[] $matches - */ - private function manipulateVersionString(array $matches, $position, $increment = 0, $pad = '0') - { - for ($i = 4; $i > 0; --$i) { - if ($i > $position) { - $matches[$i] = $pad; - } elseif ($i === $position && $increment) { - $matches[$i] += $increment; - // If $matches[$i] was 0, carry the decrement - if ($matches[$i] < 0) { - $matches[$i] = $pad; - --$position; - - // Return null on a carry overflow - if ($i === 1) { - return null; - } - } - } - } - - return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4]; - } - - /** - * Expand shorthand stability string to long version. - * - * @param string $stability - * - * @return string - */ - private function expandStability($stability) - { - $stability = strtolower($stability); - - switch ($stability) { - case 'a': - return 'alpha'; - case 'b': - return 'beta'; - case 'p': - case 'pl': - return 'patch'; - case 'rc': - return 'RC'; - default: - return $stability; - } - } -} diff --git a/vendor/composer/xdebug-handler/CHANGELOG.md b/vendor/composer/xdebug-handler/CHANGELOG.md deleted file mode 100644 index c5b5bcf4..00000000 --- a/vendor/composer/xdebug-handler/CHANGELOG.md +++ /dev/null @@ -1,134 +0,0 @@ -## [Unreleased] - -## [3.0.3] - 2022-02-25 - * Added: support for composer/pcre versions 2 and 3. - -## [3.0.2] - 2022-02-24 - * Fixed: regression in 3.0.1 affecting Xdebug 2 - -## [3.0.1] - 2022-01-04 - * Fixed: error when calling `isXdebugActive` before class instantiation. - -## [3.0.0] - 2021-12-23 - * Removed: support for legacy PHP versions (< PHP 7.2.5). - * Added: type declarations to arguments and return values. - * Added: strict typing to all classes. - -## [2.0.3] - 2021-12-08 - * Added: support, type annotations and refactoring for stricter PHPStan analysis. - -## [2.0.2] - 2021-07-31 - * Added: support for `xdebug_info('mode')` in Xdebug 3.1. - * Added: support for Psr\Log versions 2 and 3. - * Fixed: remove ini directives from non-cli HOST/PATH sections. - -## [2.0.1] - 2021-05-05 - * Fixed: don't restart if the cwd is a UNC path and cmd.exe will be invoked. - -## [2.0.0] - 2021-04-09 - * Break: this is a major release, see [UPGRADE.md](UPGRADE.md) for more information. - * Break: removed optional `$colorOption` constructor param and passthru fallback. - * Break: renamed `requiresRestart` param from `$isLoaded` to `$default`. - * Break: changed `restart` param `$command` from a string to an array. - * Added: support for Xdebug3 to only restart if Xdebug is not running with `xdebug.mode=off`. - * Added: `isXdebugActive()` method to determine if Xdebug is still running in the restart. - * Added: feature to bypass the shell in PHP-7.4+ by giving `proc_open` an array of arguments. - * Added: Process utility class to the API. - -## [1.4.6] - 2021-03-25 - * Fixed: fail restart if `proc_open` has been disabled in `disable_functions`. - * Fixed: enable Windows CTRL event handling in the restarted process. - -## [1.4.5] - 2020-11-13 - * Fixed: use `proc_open` when available for correct FD forwarding to the restarted process. - -## [1.4.4] - 2020-10-24 - * Fixed: exception if 'pcntl_signal' is disabled. - -## [1.4.3] - 2020-08-19 - * Fixed: restore SIGINT to default handler in restarted process if no other handler exists. - -## [1.4.2] - 2020-06-04 - * Fixed: ignore SIGINTs to let the restarted process handle them. - -## [1.4.1] - 2020-03-01 - * Fixed: restart fails if an ini file is empty. - -## [1.4.0] - 2019-11-06 - * Added: support for `NO_COLOR` environment variable: https://no-color.org - * Added: color support for Hyper terminal: https://github.com/zeit/hyper - * Fixed: correct capitalization of Xdebug (apparently). - * Fixed: improved handling for uopz extension. - -## [1.3.3] - 2019-05-27 - * Fixed: add environment changes to `$_ENV` if it is being used. - -## [1.3.2] - 2019-01-28 - * Fixed: exit call being blocked by uopz extension, resulting in application code running twice. - -## [1.3.1] - 2018-11-29 - * Fixed: fail restart if `passthru` has been disabled in `disable_functions`. - * Fixed: fail restart if an ini file cannot be opened, otherwise settings will be missing. - -## [1.3.0] - 2018-08-31 - * Added: `setPersistent` method to use environment variables for the restart. - * Fixed: improved debugging by writing output to stderr. - * Fixed: no restart when `php_ini_scanned_files` is not functional and is needed. - -## [1.2.1] - 2018-08-23 - * Fixed: fatal error with apc, when using `apc.mmap_file_mask`. - -## [1.2.0] - 2018-08-16 - * Added: debug information using `XDEBUG_HANDLER_DEBUG`. - * Added: fluent interface for setters. - * Added: `PhpConfig` helper class for calling PHP sub-processes. - * Added: `PHPRC` original value to restart stettings, for use in a restarted process. - * Changed: internal procedure to disable ini-scanning, using `-n` command-line option. - * Fixed: replaced `escapeshellarg` usage to avoid locale problems. - * Fixed: improved color-option handling to respect double-dash delimiter. - * Fixed: color-option handling regression from main script changes. - * Fixed: improved handling when checking main script. - * Fixed: handling for standard input, that never actually did anything. - * Fixed: fatal error when ctype extension is not available. - -## [1.1.0] - 2018-04-11 - * Added: `getRestartSettings` method for calling PHP processes in a restarted process. - * Added: API definition and @internal class annotations. - * Added: protected `requiresRestart` method for extending classes. - * Added: `setMainScript` method for applications that change the working directory. - * Changed: private `tmpIni` variable to protected for extending classes. - * Fixed: environment variables not available in $_SERVER when restored in the restart. - * Fixed: relative path problems caused by Phar::interceptFileFuncs. - * Fixed: incorrect handling when script file cannot be found. - -## [1.0.0] - 2018-03-08 - * Added: PSR3 logging for optional status output. - * Added: existing ini settings are merged to catch command-line overrides. - * Added: code, tests and other artefacts to decouple from Composer. - * Break: the following class was renamed: - - `Composer\XdebugHandler` -> `Composer\XdebugHandler\XdebugHandler` - -[Unreleased]: https://github.com/composer/xdebug-handler/compare/3.0.3...HEAD -[3.0.2]: https://github.com/composer/xdebug-handler/compare/3.0.2...3.0.3 -[3.0.2]: https://github.com/composer/xdebug-handler/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/composer/xdebug-handler/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/composer/xdebug-handler/compare/2.0.3...3.0.0 -[2.0.3]: https://github.com/composer/xdebug-handler/compare/2.0.2...2.0.3 -[2.0.2]: https://github.com/composer/xdebug-handler/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/composer/xdebug-handler/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/composer/xdebug-handler/compare/1.4.6...2.0.0 -[1.4.6]: https://github.com/composer/xdebug-handler/compare/1.4.5...1.4.6 -[1.4.5]: https://github.com/composer/xdebug-handler/compare/1.4.4...1.4.5 -[1.4.4]: https://github.com/composer/xdebug-handler/compare/1.4.3...1.4.4 -[1.4.3]: https://github.com/composer/xdebug-handler/compare/1.4.2...1.4.3 -[1.4.2]: https://github.com/composer/xdebug-handler/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/composer/xdebug-handler/compare/1.4.0...1.4.1 -[1.4.0]: https://github.com/composer/xdebug-handler/compare/1.3.3...1.4.0 -[1.3.3]: https://github.com/composer/xdebug-handler/compare/1.3.2...1.3.3 -[1.3.2]: https://github.com/composer/xdebug-handler/compare/1.3.1...1.3.2 -[1.3.1]: https://github.com/composer/xdebug-handler/compare/1.3.0...1.3.1 -[1.3.0]: https://github.com/composer/xdebug-handler/compare/1.2.1...1.3.0 -[1.2.1]: https://github.com/composer/xdebug-handler/compare/1.2.0...1.2.1 -[1.2.0]: https://github.com/composer/xdebug-handler/compare/1.1.0...1.2.0 -[1.1.0]: https://github.com/composer/xdebug-handler/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/composer/xdebug-handler/compare/d66f0d15cb57...1.0.0 diff --git a/vendor/composer/xdebug-handler/LICENSE b/vendor/composer/xdebug-handler/LICENSE deleted file mode 100644 index 963618a1..00000000 --- a/vendor/composer/xdebug-handler/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Composer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/composer/xdebug-handler/README.md b/vendor/composer/xdebug-handler/README.md deleted file mode 100644 index 56618fc1..00000000 --- a/vendor/composer/xdebug-handler/README.md +++ /dev/null @@ -1,298 +0,0 @@ -# composer/xdebug-handler - -[![packagist](https://img.shields.io/packagist/v/composer/xdebug-handler)](https://packagist.org/packages/composer/xdebug-handler) -[![Continuous Integration](https://github.com/composer/xdebug-handler/actions/workflows/continuous-integration.yml/badge.svg?branch=main)](https://github.com/composer/xdebug-handler/actions?query=branch:main) -![license](https://img.shields.io/github/license/composer/xdebug-handler.svg) -![php](https://img.shields.io/packagist/php-v/composer/xdebug-handler?colorB=8892BF) - -Restart a CLI process without loading the Xdebug extension, unless `xdebug.mode=off`. - -Originally written as part of [composer/composer](https://github.com/composer/composer), -now extracted and made available as a stand-alone library. - -### Version 3 - -Removed support for legacy PHP versions and added type declarations. - -Long term support for version 2 (PHP 5.3.2 - 7.2.4) follows [Composer 2.2 LTS](https://blog.packagist.com/composer-2-2/) policy. - -## Installation - -Install the latest version with: - -```bash -$ composer require composer/xdebug-handler -``` - -## Requirements - -* PHP 7.2.5 minimum, although using the latest PHP version is highly recommended. - -## Basic Usage -```php -use Composer\XdebugHandler\XdebugHandler; - -$xdebug = new XdebugHandler('myapp'); -$xdebug->check(); -unset($xdebug); -``` - -The constructor takes a single parameter, `$envPrefix`, which is upper-cased and prepended to default base values to create two distinct environment variables. The above example enables the use of: - -- `MYAPP_ALLOW_XDEBUG=1` to override automatic restart and allow Xdebug -- `MYAPP_ORIGINAL_INIS` to obtain ini file locations in a restarted process - -## Advanced Usage - -* [How it works](#how-it-works) -* [Limitations](#limitations) -* [Helper methods](#helper-methods) -* [Setter methods](#setter-methods) -* [Process configuration](#process-configuration) -* [Troubleshooting](#troubleshooting) -* [Extending the library](#extending-the-library) - -### How it works - -A temporary ini file is created from the loaded (and scanned) ini files, with any references to the Xdebug extension commented out. Current ini settings are merged, so that most ini settings made on the command-line or by the application are included (see [Limitations](#limitations)) - -* `MYAPP_ALLOW_XDEBUG` is set with internal data to flag and use in the restart. -* The command-line and environment are [configured](#process-configuration) for the restart. -* The application is restarted in a new process. - * The restart settings are stored in the environment. - * `MYAPP_ALLOW_XDEBUG` is unset. - * The application runs and exits. -* The main process exits with the exit code from the restarted process. - -#### Signal handling -Asynchronous signal handling is automatically enabled if the pcntl extension is loaded. `SIGINT` is set to `SIG_IGN` in the parent -process and restored to `SIG_DFL` in the restarted process (if no other handler has been set). - -From PHP 7.4 on Windows, `CTRL+C` and `CTRL+BREAK` handling is automatically enabled in the restarted process and ignored in the parent process. - -### Limitations -There are a few things to be aware of when running inside a restarted process. - -* Extensions set on the command-line will not be loaded. -* Ini file locations will be reported as per the restart - see [getAllIniFiles()](#getallinifiles). -* Php sub-processes may be loaded with Xdebug enabled - see [Process configuration](#process-configuration). - -### Helper methods -These static methods provide information from the current process, regardless of whether it has been restarted or not. - -#### _getAllIniFiles(): array_ -Returns an array of the original ini file locations. Use this instead of calling `php_ini_loaded_file` and `php_ini_scanned_files`, which will report the wrong values in a restarted process. - -```php -use Composer\XdebugHandler\XdebugHandler; - -$files = XdebugHandler::getAllIniFiles(); - -# $files[0] always exists, it could be an empty string -$loadedIni = array_shift($files); -$scannedInis = $files; -``` - -These locations are also available in the `MYAPP_ORIGINAL_INIS` environment variable. This is a path-separated string comprising the location returned from `php_ini_loaded_file`, which could be empty, followed by locations parsed from calling `php_ini_scanned_files`. - -#### _getRestartSettings(): ?array_ -Returns an array of settings that can be used with PHP [sub-processes](#sub-processes), or null if the process was not restarted. - -```php -use Composer\XdebugHandler\XdebugHandler; - -$settings = XdebugHandler::getRestartSettings(); -/** - * $settings: array (if the current process was restarted, - * or called with the settings from a previous restart), or null - * - * 'tmpIni' => the temporary ini file used in the restart (string) - * 'scannedInis' => if there were any scanned inis (bool) - * 'scanDir' => the original PHP_INI_SCAN_DIR value (false|string) - * 'phprc' => the original PHPRC value (false|string) - * 'inis' => the original inis from getAllIniFiles (array) - * 'skipped' => the skipped version from getSkippedVersion (string) - */ -``` - -#### _getSkippedVersion(): string_ -Returns the Xdebug version string that was skipped by the restart, or an empty string if there was no restart (or Xdebug is still loaded, perhaps by an extending class restarting for a reason other than removing Xdebug). - -```php -use Composer\XdebugHandler\XdebugHandler; - -$version = XdebugHandler::getSkippedVersion(); -# $version: '3.1.1' (for example), or an empty string -``` - -#### _isXdebugActive(): bool_ -Returns true if Xdebug is loaded and is running in an active mode (if it supports modes). Returns false if Xdebug is not loaded, or it is running with `xdebug.mode=off`. - -### Setter methods -These methods implement a fluent interface and must be called before the main `check()` method. - -#### _setLogger(LoggerInterface $logger): self_ -Enables the output of status messages to an external PSR3 logger. All messages are reported with either `DEBUG` or `WARNING` log levels. For example (showing the level and message): - -``` -// No restart -DEBUG Checking MYAPP_ALLOW_XDEBUG -DEBUG The Xdebug extension is loaded (3.1.1) xdebug.mode=off -DEBUG No restart (APP_ALLOW_XDEBUG=0) Allowed by xdebug.mode - -// Restart overridden -DEBUG Checking MYAPP_ALLOW_XDEBUG -DEBUG The Xdebug extension is loaded (3.1.1) xdebug.mode=coverage,debug,develop -DEBUG No restart (MYAPP_ALLOW_XDEBUG=1) - -// Failed restart -DEBUG Checking MYAPP_ALLOW_XDEBUG -DEBUG The Xdebug extension is loaded (3.1.0) -WARNING No restart (Unable to create temp ini file at: ...) -``` - -Status messages can also be output with `XDEBUG_HANDLER_DEBUG`. See [Troubleshooting](#troubleshooting). - -#### _setMainScript(string $script): self_ -Sets the location of the main script to run in the restart. This is only needed in more esoteric use-cases, or if the `argv[0]` location is inaccessible. The script name `--` is supported for standard input. - -#### _setPersistent(): self_ -Configures the restart using [persistent settings](#persistent-settings), so that Xdebug is not loaded in any sub-process. - -Use this method if your application invokes one or more PHP sub-process and the Xdebug extension is not needed. This avoids the overhead of implementing specific [sub-process](#sub-processes) strategies. - -Alternatively, this method can be used to set up a default _Xdebug-free_ environment which can be changed if a sub-process requires Xdebug, then restored afterwards: - -```php -function SubProcessWithXdebug() -{ - $phpConfig = new Composer\XdebugHandler\PhpConfig(); - - # Set the environment to the original configuration - $phpConfig->useOriginal(); - - # run the process with Xdebug loaded - ... - - # Restore Xdebug-free environment - $phpConfig->usePersistent(); -} -``` - -### Process configuration -The library offers two strategies to invoke a new PHP process without loading Xdebug, using either _standard_ or _persistent_ settings. Note that this is only important if the application calls a PHP sub-process. - -#### Standard settings -Uses command-line options to remove Xdebug from the new process only. - -* The -n option is added to the command-line. This tells PHP not to scan for additional inis. -* The temporary ini is added to the command-line with the -c option. - ->_If the new process calls a PHP sub-process, Xdebug will be loaded in that sub-process (unless it implements xdebug-handler, in which case there will be another restart)._ - -This is the default strategy used in the restart. - -#### Persistent settings -Uses environment variables to remove Xdebug from the new process and persist these settings to any sub-process. - -* `PHP_INI_SCAN_DIR` is set to an empty string. This tells PHP not to scan for additional inis. -* `PHPRC` is set to the temporary ini. - ->_If the new process calls a PHP sub-process, Xdebug will not be loaded in that sub-process._ - -This strategy can be used in the restart by calling [setPersistent()](#setpersistent). - -#### Sub-processes -The `PhpConfig` helper class makes it easy to invoke a PHP sub-process (with or without Xdebug loaded), regardless of whether there has been a restart. - -Each of its methods returns an array of PHP options (to add to the command-line) and sets up the environment for the required strategy. The [getRestartSettings()](#getrestartsettings) method is used internally. - -* `useOriginal()` - Xdebug will be loaded in the new process. -* `useStandard()` - Xdebug will **not** be loaded in the new process - see [standard settings](#standard-settings). -* `userPersistent()` - Xdebug will **not** be loaded in the new process - see [persistent settings](#persistent-settings) - -If there was no restart, an empty options array is returned and the environment is not changed. - -```php -use Composer\XdebugHandler\PhpConfig; - -$config = new PhpConfig; - -$options = $config->useOriginal(); -# $options: empty array -# environment: PHPRC and PHP_INI_SCAN_DIR set to original values - -$options = $config->useStandard(); -# $options: [-n, -c, tmpIni] -# environment: PHPRC and PHP_INI_SCAN_DIR set to original values - -$options = $config->usePersistent(); -# $options: empty array -# environment: PHPRC=tmpIni, PHP_INI_SCAN_DIR='' -``` - -### Troubleshooting -The following environment settings can be used to troubleshoot unexpected behavior: - -* `XDEBUG_HANDLER_DEBUG=1` Outputs status messages to `STDERR`, if it is defined, irrespective of any PSR3 logger. Each message is prefixed `xdebug-handler[pid]`, where pid is the process identifier. - -* `XDEBUG_HANDLER_DEBUG=2` As above, but additionally saves the temporary ini file and reports its location in a status message. - -### Extending the library -The API is defined by classes and their accessible elements that are not annotated as @internal. The main class has two protected methods that can be overridden to provide additional functionality: - -#### _requiresRestart(bool $default): bool_ -By default the process will restart if Xdebug is loaded and not running with `xdebug.mode=off`. Extending this method allows an application to decide, by returning a boolean (or equivalent) value. -It is only called if `MYAPP_ALLOW_XDEBUG` is empty, so it will not be called in the restarted process (where this variable contains internal data), or if the restart has been overridden. - -Note that the [setMainScript()](#setmainscriptscript) and [setPersistent()](#setpersistent) setters can be used here, if required. - -#### _restart(array $command): void_ -An application can extend this to modify the temporary ini file, its location given in the `tmpIni` property. New settings can be safely appended to the end of the data, which is `PHP_EOL` terminated. - -The `$command` parameter is an array of unescaped command-line arguments that will be used for the new process. - -Remember to finish with `parent::restart($command)`. - -#### Example -This example demonstrates two ways to extend basic functionality: - -* To avoid the overhead of spinning up a new process, the restart is skipped if a simple help command is requested. - -* The application needs write-access to phar files, so it will force a restart if `phar.readonly` is set (regardless of whether Xdebug is loaded) and change this value in the temporary ini file. - -```php -use Composer\XdebugHandler\XdebugHandler; -use MyApp\Command; - -class MyRestarter extends XdebugHandler -{ - private $required; - - protected function requiresRestart(bool $default): bool - { - if (Command::isHelp()) { - # No need to disable Xdebug for this - return false; - } - - $this->required = (bool) ini_get('phar.readonly'); - return $this->required || $default; - } - - protected function restart(array $command): void - { - if ($this->required) { - # Add required ini setting to tmpIni - $content = file_get_contents($this->tmpIni); - $content .= 'phar.readonly=0'.PHP_EOL; - file_put_contents($this->tmpIni, $content); - } - - parent::restart($command); - } -} -``` - -## License -composer/xdebug-handler is licensed under the MIT License, see the LICENSE file for details. diff --git a/vendor/composer/xdebug-handler/composer.json b/vendor/composer/xdebug-handler/composer.json deleted file mode 100644 index 6b649dab..00000000 --- a/vendor/composer/xdebug-handler/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "composer/xdebug-handler", - "description": "Restarts a process without Xdebug.", - "type": "library", - "license": "MIT", - "keywords": [ - "xdebug", - "performance" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3", - "composer/pcre": "^1 || ^2 || ^3" - }, - "require-dev": { - "symfony/phpunit-bridge": "^6.0", - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1" - }, - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Composer\\XdebugHandler\\Tests\\": "tests" - } - }, - "scripts": { - "test": "@php vendor/bin/simple-phpunit", - "phpstan": "@php vendor/bin/phpstan analyse" - } -} diff --git a/vendor/composer/xdebug-handler/src/PhpConfig.php b/vendor/composer/xdebug-handler/src/PhpConfig.php deleted file mode 100644 index 7edac888..00000000 --- a/vendor/composer/xdebug-handler/src/PhpConfig.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\XdebugHandler; - -/** - * @author John Stevenson - * - * @phpstan-type restartData array{tmpIni: string, scannedInis: bool, scanDir: false|string, phprc: false|string, inis: string[], skipped: string} - */ -class PhpConfig -{ - /** - * Use the original PHP configuration - * - * @return string[] Empty array of PHP cli options - */ - public function useOriginal(): array - { - $this->getDataAndReset(); - return []; - } - - /** - * Use standard restart settings - * - * @return string[] PHP cli options - */ - public function useStandard(): array - { - $data = $this->getDataAndReset(); - if ($data !== null) { - return ['-n', '-c', $data['tmpIni']]; - } - - return []; - } - - /** - * Use environment variables to persist settings - * - * @return string[] Empty array of PHP cli options - */ - public function usePersistent(): array - { - $data = $this->getDataAndReset(); - if ($data !== null) { - $this->updateEnv('PHPRC', $data['tmpIni']); - $this->updateEnv('PHP_INI_SCAN_DIR', ''); - } - - return []; - } - - /** - * Returns restart data if available and resets the environment - * - * @phpstan-return restartData|null - */ - private function getDataAndReset(): ?array - { - $data = XdebugHandler::getRestartSettings(); - if ($data !== null) { - $this->updateEnv('PHPRC', $data['phprc']); - $this->updateEnv('PHP_INI_SCAN_DIR', $data['scanDir']); - } - - return $data; - } - - /** - * Updates a restart settings value in the environment - * - * @param string $name - * @param string|false $value - */ - private function updateEnv(string $name, $value): void - { - Process::setEnv($name, false !== $value ? $value : null); - } -} diff --git a/vendor/composer/xdebug-handler/src/Process.php b/vendor/composer/xdebug-handler/src/Process.php deleted file mode 100644 index c612200b..00000000 --- a/vendor/composer/xdebug-handler/src/Process.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace Composer\XdebugHandler; - -use Composer\Pcre\Preg; - -/** - * Process utility functions - * - * @author John Stevenson - */ -class Process -{ - /** - * Escapes a string to be used as a shell argument. - * - * From https://github.com/johnstevenson/winbox-args - * MIT Licensed (c) John Stevenson - * - * @param string $arg The argument to be escaped - * @param bool $meta Additionally escape cmd.exe meta characters - * @param bool $module The argument is the module to invoke - */ - public static function escape(string $arg, bool $meta = true, bool $module = false): string - { - if (!defined('PHP_WINDOWS_VERSION_BUILD')) { - return "'".str_replace("'", "'\\''", $arg)."'"; - } - - $quote = strpbrk($arg, " \t") !== false || $arg === ''; - - $arg = Preg::replace('/(\\\\*)"/', '$1$1\\"', $arg, -1, $dquotes); - - if ($meta) { - $meta = $dquotes || Preg::isMatch('/%[^%]+%/', $arg); - - if (!$meta) { - $quote = $quote || strpbrk($arg, '^&|<>()') !== false; - } elseif ($module && !$dquotes && $quote) { - $meta = false; - } - } - - if ($quote) { - $arg = '"'.(Preg::replace('/(\\\\*)$/', '$1$1', $arg)).'"'; - } - - if ($meta) { - $arg = Preg::replace('/(["^&|<>()%])/', '^$1', $arg); - } - - return $arg; - } - - /** - * Escapes an array of arguments that make up a shell command - * - * @param string[] $args Argument list, with the module name first - */ - public static function escapeShellCommand(array $args): string - { - $command = ''; - $module = array_shift($args); - - if ($module !== null) { - $command = self::escape($module, true, true); - - foreach ($args as $arg) { - $command .= ' '.self::escape($arg); - } - } - - return $command; - } - - /** - * Makes putenv environment changes available in $_SERVER and $_ENV - * - * @param string $name - * @param ?string $value A null value unsets the variable - */ - public static function setEnv(string $name, ?string $value = null): bool - { - $unset = null === $value; - - if (!putenv($unset ? $name : $name.'='.$value)) { - return false; - } - - if ($unset) { - unset($_SERVER[$name]); - } else { - $_SERVER[$name] = $value; - } - - // Update $_ENV if it is being used - if (false !== stripos((string) ini_get('variables_order'), 'E')) { - if ($unset) { - unset($_ENV[$name]); - } else { - $_ENV[$name] = $value; - } - } - - return true; - } -} diff --git a/vendor/composer/xdebug-handler/src/Status.php b/vendor/composer/xdebug-handler/src/Status.php deleted file mode 100644 index b434f859..00000000 --- a/vendor/composer/xdebug-handler/src/Status.php +++ /dev/null @@ -1,203 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace Composer\XdebugHandler; - -use Psr\Log\LoggerInterface; -use Psr\Log\LogLevel; - -/** - * @author John Stevenson - * @internal - */ -class Status -{ - const ENV_RESTART = 'XDEBUG_HANDLER_RESTART'; - const CHECK = 'Check'; - const ERROR = 'Error'; - const INFO = 'Info'; - const NORESTART = 'NoRestart'; - const RESTART = 'Restart'; - const RESTARTING = 'Restarting'; - const RESTARTED = 'Restarted'; - - /** @var bool */ - private $debug; - - /** @var string */ - private $envAllowXdebug; - - /** @var string|null */ - private $loaded; - - /** @var LoggerInterface|null */ - private $logger; - - /** @var bool */ - private $modeOff; - - /** @var float */ - private $time; - - /** - * @param string $envAllowXdebug Prefixed _ALLOW_XDEBUG name - * @param bool $debug Whether debug output is required - */ - public function __construct(string $envAllowXdebug, bool $debug) - { - $start = getenv(self::ENV_RESTART); - Process::setEnv(self::ENV_RESTART); - $this->time = is_numeric($start) ? round((microtime(true) - $start) * 1000) : 0; - - $this->envAllowXdebug = $envAllowXdebug; - $this->debug = $debug && defined('STDERR'); - $this->modeOff = false; - } - - /** - * Activates status message output to a PSR3 logger - * - * @return void - */ - public function setLogger(LoggerInterface $logger): void - { - $this->logger = $logger; - } - - /** - * Calls a handler method to report a message - * - * @throws \InvalidArgumentException If $op is not known - */ - public function report(string $op, ?string $data): void - { - if ($this->logger !== null || $this->debug) { - $callable = [$this, 'report'.$op]; - - if (!is_callable($callable)) { - throw new \InvalidArgumentException('Unknown op handler: '.$op); - } - - $params = $data !== null ? [$data] : []; - call_user_func_array($callable, $params); - } - } - - /** - * Outputs a status message - */ - private function output(string $text, ?string $level = null): void - { - if ($this->logger !== null) { - $this->logger->log($level !== null ? $level: LogLevel::DEBUG, $text); - } - - if ($this->debug) { - fwrite(STDERR, sprintf('xdebug-handler[%d] %s', getmypid(), $text.PHP_EOL)); - } - } - - /** - * Checking status message - */ - private function reportCheck(string $loaded): void - { - list($version, $mode) = explode('|', $loaded); - - if ($version !== '') { - $this->loaded = '('.$version.')'.($mode !== '' ? ' xdebug.mode='.$mode : ''); - } - $this->modeOff = $mode === 'off'; - $this->output('Checking '.$this->envAllowXdebug); - } - - /** - * Error status message - */ - private function reportError(string $error): void - { - $this->output(sprintf('No restart (%s)', $error), LogLevel::WARNING); - } - - /** - * Info status message - */ - private function reportInfo(string $info): void - { - $this->output($info); - } - - /** - * No restart status message - */ - private function reportNoRestart(): void - { - $this->output($this->getLoadedMessage()); - - if ($this->loaded !== null) { - $text = sprintf('No restart (%s)', $this->getEnvAllow()); - if (!((bool) getenv($this->envAllowXdebug))) { - $text .= ' Allowed by '.($this->modeOff ? 'xdebug.mode' : 'application'); - } - $this->output($text); - } - } - - /** - * Restart status message - */ - private function reportRestart(): void - { - $this->output($this->getLoadedMessage()); - Process::setEnv(self::ENV_RESTART, (string) microtime(true)); - } - - /** - * Restarted status message - */ - private function reportRestarted(): void - { - $loaded = $this->getLoadedMessage(); - $text = sprintf('Restarted (%d ms). %s', $this->time, $loaded); - $level = $this->loaded !== null ? LogLevel::WARNING : null; - $this->output($text, $level); - } - - /** - * Restarting status message - */ - private function reportRestarting(string $command): void - { - $text = sprintf('Process restarting (%s)', $this->getEnvAllow()); - $this->output($text); - $text = 'Running '.$command; - $this->output($text); - } - - /** - * Returns the _ALLOW_XDEBUG environment variable as name=value - */ - private function getEnvAllow(): string - { - return $this->envAllowXdebug.'='.getenv($this->envAllowXdebug); - } - - /** - * Returns the Xdebug status and version - */ - private function getLoadedMessage(): string - { - $loaded = $this->loaded !== null ? sprintf('loaded %s', $this->loaded) : 'not loaded'; - return 'The Xdebug extension is '.$loaded; - } -} diff --git a/vendor/composer/xdebug-handler/src/XdebugHandler.php b/vendor/composer/xdebug-handler/src/XdebugHandler.php deleted file mode 100644 index 9052bfa4..00000000 --- a/vendor/composer/xdebug-handler/src/XdebugHandler.php +++ /dev/null @@ -1,668 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace Composer\XdebugHandler; - -use Composer\Pcre\Preg; -use Psr\Log\LoggerInterface; - -/** - * @author John Stevenson - * - * @phpstan-import-type restartData from PhpConfig - */ -class XdebugHandler -{ - const SUFFIX_ALLOW = '_ALLOW_XDEBUG'; - const SUFFIX_INIS = '_ORIGINAL_INIS'; - const RESTART_ID = 'internal'; - const RESTART_SETTINGS = 'XDEBUG_HANDLER_SETTINGS'; - const DEBUG = 'XDEBUG_HANDLER_DEBUG'; - - /** @var string|null */ - protected $tmpIni; - - /** @var bool */ - private static $inRestart; - - /** @var string */ - private static $name; - - /** @var string|null */ - private static $skipped; - - /** @var bool */ - private static $xdebugActive; - - /** @var string|null */ - private static $xdebugMode; - - /** @var string|null */ - private static $xdebugVersion; - - /** @var bool */ - private $cli; - - /** @var string|null */ - private $debug; - - /** @var string */ - private $envAllowXdebug; - - /** @var string */ - private $envOriginalInis; - - /** @var bool */ - private $persistent; - - /** @var string|null */ - private $script; - - /** @var Status */ - private $statusWriter; - - /** - * Constructor - * - * The $envPrefix is used to create distinct environment variables. It is - * uppercased and prepended to the default base values. For example 'myapp' - * would result in MYAPP_ALLOW_XDEBUG and MYAPP_ORIGINAL_INIS. - * - * @param string $envPrefix Value used in environment variables - * @throws \RuntimeException If the parameter is invalid - */ - public function __construct(string $envPrefix) - { - if ($envPrefix === '') { - throw new \RuntimeException('Invalid constructor parameter'); - } - - self::$name = strtoupper($envPrefix); - $this->envAllowXdebug = self::$name.self::SUFFIX_ALLOW; - $this->envOriginalInis = self::$name.self::SUFFIX_INIS; - - self::setXdebugDetails(); - self::$inRestart = false; - - if ($this->cli = PHP_SAPI === 'cli') { - $this->debug = (string) getenv(self::DEBUG); - } - - $this->statusWriter = new Status($this->envAllowXdebug, (bool) $this->debug); - } - - /** - * Activates status message output to a PSR3 logger - */ - public function setLogger(LoggerInterface $logger): self - { - $this->statusWriter->setLogger($logger); - return $this; - } - - /** - * Sets the main script location if it cannot be called from argv - */ - public function setMainScript(string $script): self - { - $this->script = $script; - return $this; - } - - /** - * Persist the settings to keep Xdebug out of sub-processes - */ - public function setPersistent(): self - { - $this->persistent = true; - return $this; - } - - /** - * Checks if Xdebug is loaded and the process needs to be restarted - * - * This behaviour can be disabled by setting the MYAPP_ALLOW_XDEBUG - * environment variable to 1. This variable is used internally so that - * the restarted process is created only once. - */ - public function check(): void - { - $this->notify(Status::CHECK, self::$xdebugVersion.'|'.self::$xdebugMode); - $envArgs = explode('|', (string) getenv($this->envAllowXdebug)); - - if (!((bool) $envArgs[0]) && $this->requiresRestart(self::$xdebugActive)) { - // Restart required - $this->notify(Status::RESTART); - - if ($this->prepareRestart()) { - $command = $this->getCommand(); - $this->restart($command); - } - return; - } - - if (self::RESTART_ID === $envArgs[0] && count($envArgs) === 5) { - // Restarted, so unset environment variable and use saved values - $this->notify(Status::RESTARTED); - - Process::setEnv($this->envAllowXdebug); - self::$inRestart = true; - - if (self::$xdebugVersion === null) { - // Skipped version is only set if Xdebug is not loaded - self::$skipped = $envArgs[1]; - } - - $this->tryEnableSignals(); - - // Put restart settings in the environment - $this->setEnvRestartSettings($envArgs); - return; - } - - $this->notify(Status::NORESTART); - $settings = self::getRestartSettings(); - - if ($settings !== null) { - // Called with existing settings, so sync our settings - $this->syncSettings($settings); - } - } - - /** - * Returns an array of php.ini locations with at least one entry - * - * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. - * The loaded ini location is the first entry and may be empty. - * - * @return string[] - */ - public static function getAllIniFiles(): array - { - if (self::$name !== null) { - $env = getenv(self::$name.self::SUFFIX_INIS); - - if (false !== $env) { - return explode(PATH_SEPARATOR, $env); - } - } - - $paths = [(string) php_ini_loaded_file()]; - $scanned = php_ini_scanned_files(); - - if ($scanned !== false) { - $paths = array_merge($paths, array_map('trim', explode(',', $scanned))); - } - - return $paths; - } - - /** - * Returns an array of restart settings or null - * - * Settings will be available if the current process was restarted, or - * called with the settings from an existing restart. - * - * @phpstan-return restartData|null - */ - public static function getRestartSettings(): ?array - { - $envArgs = explode('|', (string) getenv(self::RESTART_SETTINGS)); - - if (count($envArgs) !== 6 - || (!self::$inRestart && php_ini_loaded_file() !== $envArgs[0])) { - return null; - } - - return [ - 'tmpIni' => $envArgs[0], - 'scannedInis' => (bool) $envArgs[1], - 'scanDir' => '*' === $envArgs[2] ? false : $envArgs[2], - 'phprc' => '*' === $envArgs[3] ? false : $envArgs[3], - 'inis' => explode(PATH_SEPARATOR, $envArgs[4]), - 'skipped' => $envArgs[5], - ]; - } - - /** - * Returns the Xdebug version that triggered a successful restart - */ - public static function getSkippedVersion(): string - { - return (string) self::$skipped; - } - - /** - * Returns whether Xdebug is loaded and active - * - * true: if Xdebug is loaded and is running in an active mode. - * false: if Xdebug is not loaded, or it is running with xdebug.mode=off. - */ - public static function isXdebugActive(): bool - { - self::setXdebugDetails(); - return self::$xdebugActive; - } - - /** - * Allows an extending class to decide if there should be a restart - * - * The default is to restart if Xdebug is loaded and its mode is not "off". - */ - protected function requiresRestart(bool $default): bool - { - return $default; - } - - /** - * Allows an extending class to access the tmpIni - * - * @param string[] $command * - */ - protected function restart(array $command): void - { - $this->doRestart($command); - } - - /** - * Executes the restarted command then deletes the tmp ini - * - * @param string[] $command - * @phpstan-return never - */ - private function doRestart(array $command): void - { - $this->tryEnableSignals(); - $this->notify(Status::RESTARTING, implode(' ', $command)); - - if (PHP_VERSION_ID >= 70400) { - $cmd = $command; - } else { - $cmd = Process::escapeShellCommand($command); - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - // Outer quotes required on cmd string below PHP 8 - $cmd = '"'.$cmd.'"'; - } - } - - $process = proc_open($cmd, [], $pipes); - if (is_resource($process)) { - $exitCode = proc_close($process); - } - - if (!isset($exitCode)) { - // Unlikely that php or the default shell cannot be invoked - $this->notify(Status::ERROR, 'Unable to restart process'); - $exitCode = -1; - } else { - $this->notify(Status::INFO, 'Restarted process exited '.$exitCode); - } - - if ($this->debug === '2') { - $this->notify(Status::INFO, 'Temp ini saved: '.$this->tmpIni); - } else { - @unlink((string) $this->tmpIni); - } - - exit($exitCode); - } - - /** - * Returns true if everything was written for the restart - * - * If any of the following fails (however unlikely) we must return false to - * stop potential recursion: - * - tmp ini file creation - * - environment variable creation - */ - private function prepareRestart(): bool - { - $error = null; - $iniFiles = self::getAllIniFiles(); - $scannedInis = count($iniFiles) > 1; - $tmpDir = sys_get_temp_dir(); - - if (!$this->cli) { - $error = 'Unsupported SAPI: '.PHP_SAPI; - } elseif (!$this->checkConfiguration($info)) { - $error = $info; - } elseif (!$this->checkMainScript()) { - $error = 'Unable to access main script: '.$this->script; - } elseif (!$this->writeTmpIni($iniFiles, $tmpDir, $error)) { - $error = $error !== null ? $error : 'Unable to create temp ini file at: '.$tmpDir; - } elseif (!$this->setEnvironment($scannedInis, $iniFiles)) { - $error = 'Unable to set environment variables'; - } - - if ($error !== null) { - $this->notify(Status::ERROR, $error); - } - - return $error === null; - } - - /** - * Returns true if the tmp ini file was written - * - * @param string[] $iniFiles All ini files used in the current process - */ - private function writeTmpIni(array $iniFiles, string $tmpDir, ?string &$error): bool - { - if (($tmpfile = @tempnam($tmpDir, '')) === false) { - return false; - } - - $this->tmpIni = $tmpfile; - - // $iniFiles has at least one item and it may be empty - if ($iniFiles[0] === '') { - array_shift($iniFiles); - } - - $content = ''; - $sectionRegex = '/^\s*\[(?:PATH|HOST)\s*=/mi'; - $xdebugRegex = '/^\s*(zend_extension\s*=.*xdebug.*)$/mi'; - - foreach ($iniFiles as $file) { - // Check for inaccessible ini files - if (($data = @file_get_contents($file)) === false) { - $error = 'Unable to read ini: '.$file; - return false; - } - // Check and remove directives after HOST and PATH sections - if (Preg::isMatchWithOffsets($sectionRegex, $data, $matches, PREG_OFFSET_CAPTURE)) { - $data = substr($data, 0, $matches[0][1]); - } - $content .= Preg::replace($xdebugRegex, ';$1', $data).PHP_EOL; - } - - // Merge loaded settings into our ini content, if it is valid - $config = parse_ini_string($content); - $loaded = ini_get_all(null, false); - - if (false === $config || false === $loaded) { - $error = 'Unable to parse ini data'; - return false; - } - - $content .= $this->mergeLoadedConfig($loaded, $config); - - // Work-around for https://bugs.php.net/bug.php?id=75932 - $content .= 'opcache.enable_cli=0'.PHP_EOL; - - return (bool) @file_put_contents($this->tmpIni, $content); - } - - /** - * Returns the command line arguments for the restart - * - * @return string[] - */ - private function getCommand(): array - { - $php = [PHP_BINARY]; - $args = array_slice($_SERVER['argv'], 1); - - if (!$this->persistent) { - // Use command-line options - array_push($php, '-n', '-c', $this->tmpIni); - } - - return array_merge($php, [$this->script], $args); - } - - /** - * Returns true if the restart environment variables were set - * - * No need to update $_SERVER since this is set in the restarted process. - * - * @param string[] $iniFiles All ini files used in the current process - */ - private function setEnvironment(bool $scannedInis, array $iniFiles): bool - { - $scanDir = getenv('PHP_INI_SCAN_DIR'); - $phprc = getenv('PHPRC'); - - // Make original inis available to restarted process - if (!putenv($this->envOriginalInis.'='.implode(PATH_SEPARATOR, $iniFiles))) { - return false; - } - - if ($this->persistent) { - // Use the environment to persist the settings - if (!putenv('PHP_INI_SCAN_DIR=') || !putenv('PHPRC='.$this->tmpIni)) { - return false; - } - } - - // Flag restarted process and save values for it to use - $envArgs = [ - self::RESTART_ID, - self::$xdebugVersion, - (int) $scannedInis, - false === $scanDir ? '*' : $scanDir, - false === $phprc ? '*' : $phprc, - ]; - - return putenv($this->envAllowXdebug.'='.implode('|', $envArgs)); - } - - /** - * Logs status messages - */ - private function notify(string $op, ?string $data = null): void - { - $this->statusWriter->report($op, $data); - } - - /** - * Returns default, changed and command-line ini settings - * - * @param mixed[] $loadedConfig All current ini settings - * @param mixed[] $iniConfig Settings from user ini files - * - */ - private function mergeLoadedConfig(array $loadedConfig, array $iniConfig): string - { - $content = ''; - - foreach ($loadedConfig as $name => $value) { - // Value will either be null, string or array (HHVM only) - if (!is_string($value) - || strpos($name, 'xdebug') === 0 - || $name === 'apc.mmap_file_mask') { - continue; - } - - if (!isset($iniConfig[$name]) || $iniConfig[$name] !== $value) { - // Double-quote escape each value - $content .= $name.'="'.addcslashes($value, '\\"').'"'.PHP_EOL; - } - } - - return $content; - } - - /** - * Returns true if the script name can be used - */ - private function checkMainScript(): bool - { - if ($this->script !== null) { - // Allow an application to set -- for standard input - return file_exists($this->script) || '--' === $this->script; - } - - if (file_exists($this->script = $_SERVER['argv'][0])) { - return true; - } - - // Use a backtrace to resolve Phar and chdir issues. - $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - $main = end($trace); - - if ($main !== false && isset($main['file'])) { - return file_exists($this->script = $main['file']); - } - - return false; - } - - /** - * Adds restart settings to the environment - * - * @param string[] $envArgs - */ - private function setEnvRestartSettings(array $envArgs): void - { - $settings = [ - php_ini_loaded_file(), - $envArgs[2], - $envArgs[3], - $envArgs[4], - getenv($this->envOriginalInis), - self::$skipped, - ]; - - Process::setEnv(self::RESTART_SETTINGS, implode('|', $settings)); - } - - /** - * Syncs settings and the environment if called with existing settings - * - * @phpstan-param restartData $settings - */ - private function syncSettings(array $settings): void - { - if (false === getenv($this->envOriginalInis)) { - // Called by another app, so make original inis available - Process::setEnv($this->envOriginalInis, implode(PATH_SEPARATOR, $settings['inis'])); - } - - self::$skipped = $settings['skipped']; - $this->notify(Status::INFO, 'Process called with existing restart settings'); - } - - /** - * Returns true if there are no known configuration issues - */ - private function checkConfiguration(?string &$info): bool - { - if (!function_exists('proc_open')) { - $info = 'proc_open function is disabled'; - return false; - } - - if (extension_loaded('uopz') && !((bool) ini_get('uopz.disable'))) { - // uopz works at opcode level and disables exit calls - if (function_exists('uopz_allow_exit')) { - @uopz_allow_exit(true); - } else { - $info = 'uopz extension is not compatible'; - return false; - } - } - - // Check UNC paths when using cmd.exe - if (defined('PHP_WINDOWS_VERSION_BUILD') && PHP_VERSION_ID < 70400) { - $workingDir = getcwd(); - - if ($workingDir === false) { - $info = 'unable to determine working directory'; - return false; - } - - if (0 === strpos($workingDir, '\\\\')) { - $info = 'cmd.exe does not support UNC paths: '.$workingDir; - return false; - } - } - - return true; - } - - /** - * Enables async signals and control interrupts in the restarted process - * - * Available on Unix PHP 7.1+ with the pcntl extension and Windows PHP 7.4+. - */ - private function tryEnableSignals(): void - { - if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { - pcntl_async_signals(true); - $message = 'Async signals enabled'; - - if (!self::$inRestart) { - // Restarting, so ignore SIGINT in parent - pcntl_signal(SIGINT, SIG_IGN); - } elseif (is_int(pcntl_signal_get_handler(SIGINT))) { - // Restarted, no handler set so force default action - pcntl_signal(SIGINT, SIG_DFL); - } - } - - if (!self::$inRestart && function_exists('sapi_windows_set_ctrl_handler')) { - // Restarting, so set a handler to ignore CTRL events in the parent. - // This ensures that CTRL+C events will be available in the child - // process without having to enable them there, which is unreliable. - sapi_windows_set_ctrl_handler(function ($evt) {}); - } - } - - /** - * Sets static properties $xdebugActive, $xdebugVersion and $xdebugMode - */ - private static function setXdebugDetails(): void - { - if (self::$xdebugActive !== null) { - return; - } - - self::$xdebugActive = false; - if (!extension_loaded('xdebug')) { - return; - } - - $version = phpversion('xdebug'); - self::$xdebugVersion = $version !== false ? $version : 'unknown'; - - if (version_compare(self::$xdebugVersion, '3.1', '>=')) { - $modes = xdebug_info('mode'); - self::$xdebugMode = count($modes) === 0 ? 'off' : implode(',', $modes); - self::$xdebugActive = self::$xdebugMode !== 'off'; - return; - } - - // See if xdebug.mode is supported in this version - $iniMode = ini_get('xdebug.mode'); - if ($iniMode === false) { - self::$xdebugActive = true; - return; - } - - // Environment value wins but cannot be empty - $envMode = (string) getenv('XDEBUG_MODE'); - if ($envMode !== '') { - self::$xdebugMode = $envMode; - } else { - self::$xdebugMode = $iniMode !== '' ? $iniMode : 'off'; - } - - // An empty comma-separated list is treated as mode 'off' - if (Preg::isMatch('/^,+$/', str_replace(' ', '', self::$xdebugMode))) { - self::$xdebugMode = 'off'; - } - - self::$xdebugActive = self::$xdebugMode !== 'off'; - } -} diff --git a/vendor/dnoegel/php-xdg-base-dir/LICENSE b/vendor/dnoegel/php-xdg-base-dir/LICENSE deleted file mode 100644 index 029a00ab..00000000 --- a/vendor/dnoegel/php-xdg-base-dir/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014 Daniel Nögel - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/dnoegel/php-xdg-base-dir/README.md b/vendor/dnoegel/php-xdg-base-dir/README.md deleted file mode 100644 index ee06b2d6..00000000 --- a/vendor/dnoegel/php-xdg-base-dir/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# XDG Base Directory - -[![Latest Stable Version](https://img.shields.io/packagist/v/dnoegel/php-xdg-base-dir.svg?style=flat-square)](https://packagist.org/packages/dnoegel/php-xdg-base-dir) -[![Total Downloads](https://img.shields.io/packagist/dt/dnoegel/php-xdg-base-dir.svg?style=flat-square)](https://packagist.org/packages/dnoegel/php-xdg-base-dir) -[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md) -[![Build Status](https://img.shields.io/travis/dnoegel/php-xdg-base-dir/master.svg?style=flat-square)](https://travis-ci.org/dnoegel/php-xdg-base-dir) - -Implementation of XDG Base Directory specification for php - -## Install - -Via Composer - -``` bash -$ composer require dnoegel/php-xdg-base-dir -``` - -## Usage - -``` php -$xdg = new \XdgBaseDir\Xdg(); - -echo $xdg->getHomeDir(); -echo $xdg->getHomeConfigDir(); -echo $xdg->getHomeDataDir(); -echo $xdg->getHomeCacheDir(); -echo $xdg->getRuntimeDir(); - -print_r($xdg->getDataDirs()); // returns array -print_r($xdg->getConfigDirs()); // returns array -``` - -## Testing - -``` bash -$ phpunit -``` - -## License - -The MIT License (MIT). Please see [License File](https://github.com/dnoegel/php-xdg-base-dir/blob/master/LICENSE) for more information. diff --git a/vendor/dnoegel/php-xdg-base-dir/composer.json b/vendor/dnoegel/php-xdg-base-dir/composer.json deleted file mode 100644 index 94c46374..00000000 --- a/vendor/dnoegel/php-xdg-base-dir/composer.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "dnoegel/php-xdg-base-dir", - "description": "implementation of xdg base directory specification for php", - "type": "library", - "license": "MIT", - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - } -} diff --git a/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php b/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php deleted file mode 100644 index 2dd314d0..00000000 --- a/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php +++ /dev/null @@ -1,132 +0,0 @@ -getHomeDir(); - - $path = DIRECTORY_SEPARATOR === $homeDir ? $homeDir.'.config' : $homeDir . DIRECTORY_SEPARATOR . '.config'; - - return $path; - } - - /** - * @return string - */ - public function getHomeDataDir() - { - $path = getenv('XDG_DATA_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.local' . DIRECTORY_SEPARATOR . 'share'; - - return $path; - } - - /** - * @return array - */ - public function getConfigDirs() - { - $configDirs = getenv('XDG_CONFIG_DIRS') ? explode(':', getenv('XDG_CONFIG_DIRS')) : array('/etc/xdg'); - - $paths = array_merge(array($this->getHomeConfigDir()), $configDirs); - - return $paths; - } - - /** - * @return array - */ - public function getDataDirs() - { - $dataDirs = getenv('XDG_DATA_DIRS') ? explode(':', getenv('XDG_DATA_DIRS')) : array('/usr/local/share', '/usr/share'); - - $paths = array_merge(array($this->getHomeDataDir()), $dataDirs); - - return $paths; - } - - /** - * @return string - */ - public function getHomeCacheDir() - { - $path = getenv('XDG_CACHE_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.cache'; - - return $path; - - } - - public function getRuntimeDir($strict=true) - { - if ($runtimeDir = getenv('XDG_RUNTIME_DIR')) { - return $runtimeDir; - } - - if ($strict) { - throw new \RuntimeException('XDG_RUNTIME_DIR was not set'); - } - - $fallback = sys_get_temp_dir() . DIRECTORY_SEPARATOR . self::RUNTIME_DIR_FALLBACK . getenv('USER'); - - $create = false; - - if (!is_dir($fallback)) { - mkdir($fallback, 0700, true); - } - - $st = lstat($fallback); - - # The fallback must be a directory - if (!$st['mode'] & self::S_IFDIR) { - rmdir($fallback); - $create = true; - } elseif ($st['uid'] != $this->getUid() || - $st['mode'] & (self::S_IRWXG | self::S_IRWXO) - ) { - rmdir($fallback); - $create = true; - } - - if ($create) { - mkdir($fallback, 0700, true); - } - - return $fallback; - } - - private function getUid() - { - if (function_exists('posix_getuid')) { - return posix_getuid(); - } - - return getmyuid(); - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/.github/workflows/build.yml b/vendor/felixfbecker/advanced-json-rpc/.github/workflows/build.yml deleted file mode 100644 index 4b0bd562..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/.github/workflows/build.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: build - -on: [push, pull_request] - -env: - FORCE_COLOR: 1 - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - -jobs: - test: - strategy: - matrix: - php: - - 7.1 - - 7.2 - - 7.3 - - 7.4 - - 8.0 - deps: - - lowest - - highest - include: - - php: 8.1 - deps: highest - composer-options: --ignore-platform-reqs - exclude: - # that config currently breaks as older PHPUnit cannot generate coverage on PHP 8 - - php: 8 - deps: lowest - - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - - - uses: ramsey/composer-install@v1 - with: - dependency-versions: ${{ matrix.deps }} - composer-options: ${{ matrix.composer-options }} - - - run: vendor/bin/phpunit --coverage-clover=coverage.xml --whitelist lib --bootstrap vendor/autoload.php tests - - - uses: codecov/codecov-action@v1 - - release: - needs: test - if: github.repository_owner == 'felixfbecker' && github.event_name == 'push' && github.ref == 'refs/heads/master' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Setup Node.js - uses: actions/setup-node@v2 - - - name: Install npm dependencies - run: npm ci - - - name: Release - run: npm run semantic-release diff --git a/vendor/felixfbecker/advanced-json-rpc/LICENSE b/vendor/felixfbecker/advanced-json-rpc/LICENSE deleted file mode 100644 index fc354170..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2016, Felix Frederick Becker - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/felixfbecker/advanced-json-rpc/composer.json b/vendor/felixfbecker/advanced-json-rpc/composer.json deleted file mode 100644 index c4d5739e..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/composer.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "felixfbecker/advanced-json-rpc", - "description": "A more advanced JSONRPC implementation", - "type": "library", - "license": "ISC", - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "autoload-dev": { - "psr-4": { - "AdvancedJsonRpc\\Tests\\": "tests/" - } - }, - "require": { - "php": "^7.1 || ^8.0", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" - }, - "minimum-stability": "dev", - "prefer-stable": true -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php b/vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php deleted file mode 100644 index 5f045df6..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php +++ /dev/null @@ -1,171 +0,0 @@ - ReflectionMethod[] - * - * @var ReflectionMethod - */ - private $methods; - - /** - * @var \phpDocumentor\Reflection\DocBlockFactory - */ - private $docBlockFactory; - - /** - * @var \phpDocumentor\Reflection\Types\ContextFactory - */ - private $contextFactory; - - /** - * @param object $target The target object that should receive the method calls - * @param string $delimiter A delimiter for method calls on properties, for example someProperty->someMethod - */ - public function __construct($target, $delimiter = '->') - { - $this->target = $target; - $this->delimiter = $delimiter; - $this->docBlockFactory = DocBlockFactory::createInstance(); - $this->contextFactory = new Types\ContextFactory(); - $this->mapper = new JsonMapper(); - } - - /** - * Calls the appropriate method handler for an incoming Message - * - * @param string|object $msg The incoming message - * @return mixed - */ - public function dispatch($msg) - { - if (is_string($msg)) { - $msg = json_decode($msg); - if (json_last_error() !== JSON_ERROR_NONE) { - throw new Error(json_last_error_msg(), ErrorCode::PARSE_ERROR); - } - } - // Find out the object and function that should be called - $obj = $this->target; - $parts = explode($this->delimiter, $msg->method); - // The function to call is always the last part of the method - $fn = array_pop($parts); - // For namespaced methods like textDocument/didOpen, call the didOpen method on the $textDocument property - // For simple methods like initialize, shutdown, exit, this loop will simply not be entered and $obj will be - // the target - foreach ($parts as $part) { - if (!isset($obj->$part)) { - throw new Error("Method {$msg->method} is not implemented", ErrorCode::METHOD_NOT_FOUND); - } - $obj = $obj->$part; - } - if (!isset($this->methods[$msg->method])) { - try { - $method = new ReflectionMethod($obj, $fn); - $this->methods[$msg->method] = $method; - } catch (ReflectionException $e) { - throw new Error($e->getMessage(), ErrorCode::METHOD_NOT_FOUND, null, $e); - } - } - $method = $this->methods[$msg->method]; - $parameters = $method->getParameters(); - if ($method->getDocComment()) { - $docBlock = $this->docBlockFactory->create( - $method->getDocComment(), - $this->contextFactory->createFromReflector($method->getDeclaringClass()) - ); - $paramTags = $docBlock->getTagsByName('param'); - } - $args = []; - if (isset($msg->params)) { - // Find out the position - if (is_array($msg->params)) { - $args = $msg->params; - } else if (is_object($msg->params)) { - foreach ($parameters as $pos => $parameter) { - $value = null; - foreach(get_object_vars($msg->params) as $key => $val) { - if ($parameter->name === $key) { - $value = $val; - break; - } - } - $args[$pos] = $value; - } - } else { - throw new Error('Params must be structured or omitted', ErrorCode::INVALID_REQUEST); - } - foreach ($args as $position => $value) { - try { - // If the type is structured (array or object), map it with JsonMapper - if (is_object($value)) { - // Does the parameter have a type hint? - $param = $parameters[$position]; - if ($param->hasType()) { - $paramType = $param->getType(); - if ($paramType instanceof ReflectionNamedType) { - // We have object data to map and want the class name. - // This should not include the `?` if the type was nullable. - $class = $paramType->getName(); - } else { - // Fallback for php 7.0, which is still supported (and doesn't have nullable). - $class = (string)$paramType; - } - $value = $this->mapper->map($value, new $class()); - } - } else if (is_array($value) && isset($docBlock)) { - // Get the array type from the DocBlock - $type = $paramTags[$position]->getType(); - // For union types, use the first one that is a class array (often it is SomeClass[]|null) - if ($type instanceof Types\Compound) { - for ($i = 0; $t = $type->get($i); $i++) { - if ( - $t instanceof Types\Array_ - && $t->getValueType() instanceof Types\Object_ - && (string)$t->getValueType() !== 'object' - ) { - $class = (string)$t->getValueType()->getFqsen(); - $value = $this->mapper->mapArray($value, [], $class); - break; - } - } - } else if ($type instanceof Types\Array_) { - $class = (string)$type->getValueType()->getFqsen(); - $value = $this->mapper->mapArray($value, [], $class); - } else { - throw new Error('Type is not matching @param tag', ErrorCode::INVALID_PARAMS); - } - } - } catch (JsonMapper_Exception $e) { - throw new Error($e->getMessage(), ErrorCode::INVALID_PARAMS, null, $e); - } - $args[$position] = $value; - } - } - ksort($args); - $result = $obj->$fn(...$args); - return $result; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Error.php b/vendor/felixfbecker/advanced-json-rpc/lib/Error.php deleted file mode 100644 index b2801918..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Error.php +++ /dev/null @@ -1,38 +0,0 @@ -data = $data; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php b/vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php deleted file mode 100644 index f0ef4792..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php +++ /dev/null @@ -1,48 +0,0 @@ -id) && isset($msg->error); - } - - /** - * @param int|string $id - * @param \AdvancedJsonRpc\Error $error - */ - public function __construct($id, Error $error) - { - parent::__construct($id); - $this->error = $error; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Message.php b/vendor/felixfbecker/advanced-json-rpc/lib/Message.php deleted file mode 100644 index e2231dc5..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Message.php +++ /dev/null @@ -1,52 +0,0 @@ -method, $decoded->params ?? null); - } else if (Request::isRequest($decoded)) { - $obj = new Request($decoded->id, $decoded->method, $decoded->params ?? null); - } else if (SuccessResponse::isSuccessResponse($decoded)) { - $obj = new SuccessResponse($decoded->id, $decoded->result); - } else if (ErrorResponse::isErrorResponse($decoded)) { - $obj = new ErrorResponse($decoded->id, new Error($decoded->error->message, $decoded->error->code, $decoded->error->data ?? null)); - } else { - throw new Error('Invalid message', ErrorCode::INVALID_REQUEST); - } - return $obj; - } - - public function __toString(): string - { - $encoded = json_encode($this); - if ($encoded === false) { - throw new Error(json_last_error_msg(), ErrorCode::INTERNAL_ERROR); - } - return $encoded; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Notification.php b/vendor/felixfbecker/advanced-json-rpc/lib/Notification.php deleted file mode 100644 index 3440164d..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Notification.php +++ /dev/null @@ -1,56 +0,0 @@ -method); - } - - /** - * @param string $method - * @param mixed $params - */ - public function __construct(string $method, $params = null) - { - $this->method = $method; - $this->params = $params; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Request.php b/vendor/felixfbecker/advanced-json-rpc/lib/Request.php deleted file mode 100644 index 14290082..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Request.php +++ /dev/null @@ -1,63 +0,0 @@ -method); - } - - /** - * @param string|int $id - * @param string $method - * @param object|array $params - */ - public function __construct($id, string $method, $params = null) - { - $this->id = $id; - $this->method = $method; - $this->params = $params; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Response.php b/vendor/felixfbecker/advanced-json-rpc/lib/Response.php deleted file mode 100644 index a871eeac..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Response.php +++ /dev/null @@ -1,40 +0,0 @@ -error)); - } - - /** - * @param int|string $id - * @param mixed $result - * @param ResponseError $error - */ - public function __construct($id) - { - $this->id = $id; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php b/vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php deleted file mode 100644 index 222fd46e..00000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php +++ /dev/null @@ -1,40 +0,0 @@ -result = $result; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/.editorconfig b/vendor/felixfbecker/language-server-protocol/.editorconfig deleted file mode 100644 index b5f0c5df..00000000 --- a/vendor/felixfbecker/language-server-protocol/.editorconfig +++ /dev/null @@ -1,17 +0,0 @@ - -[*] -insert_final_newline = true -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -indent_style = space -indent_size = 4 - -[*.{json,yml}] -indent_size = 2 - -[composer.json] -indent_size = 4 - -[*.md] -trim_trailing_whitespace = false diff --git a/vendor/felixfbecker/language-server-protocol/.github/workflows/build.yml b/vendor/felixfbecker/language-server-protocol/.github/workflows/build.yml deleted file mode 100644 index 5a9a2a4d..00000000 --- a/vendor/felixfbecker/language-server-protocol/.github/workflows/build.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: build - -on: [push, pull_request] - -env: - FORCE_COLOR: 3 - -jobs: - test: - if: github.event_name == 'pull_request' || github.ref == 'refs/heads/master' - runs-on: ${{ matrix.os }} - strategy: - matrix: - include: - - php: '7.4' - os: ubuntu-18.04 - - php: '8.0' - os: ubuntu-18.04 - - php: '8.1' - os: ubuntu-18.04 - steps: - - uses: actions/checkout@v2 - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: '14.15.3' # renovate:keep-up-to-date - - name: Install npm dependencies - run: npm ci - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - extensions: ${{ matrix.xdebug }}, ast - tools: composer - - name: Composer Install - run: COMPOSER_ROOT_VERSION=dev-master composer install --prefer-dist --no-interaction - - name: phpcs - run: ./vendor/bin/phpcs -n - - name: phpstan - run: ./vendor/bin/phpstan - - name: psalm - run: ./vendor/bin/psalm -# - name: phan -# run: ./vendor/bin/phan -# - name: phpunit -# run: vendor/bin/phpunit --coverage-clover=coverage.xml --colors=always -# - name: Upload coverage to Codecov -# uses: codecov/codecov-action@v2 -# release: -# runs-on: ubuntu-18.04 -# needs: test -# if: github.repository_owner == 'xdebug' && github.event_name == 'push' && github.ref == 'refs/heads/main' -# steps: -# - uses: actions/checkout@v2 -# - name: Setup Node.js -# uses: actions/setup-node@v2 -# with: -# node-version: '14.15.3' # renovate:keep-up-to-date -# - name: Install npm dependencies -# run: npm ci -# - name: Build VS Code extension -# run: npm run build -# - name: Release -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# VSCE_TOKEN: ${{ secrets.VSCE_TOKEN }} -# run: npm run semantic-release diff --git a/vendor/felixfbecker/language-server-protocol/LICENSE b/vendor/felixfbecker/language-server-protocol/LICENSE deleted file mode 100644 index fc354170..00000000 --- a/vendor/felixfbecker/language-server-protocol/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2016, Felix Frederick Becker - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/felixfbecker/language-server-protocol/README.md b/vendor/felixfbecker/language-server-protocol/README.md deleted file mode 100644 index 1e169d1e..00000000 --- a/vendor/felixfbecker/language-server-protocol/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Language Server Protocol for PHP - -[![packagist](https://img.shields.io/packagist/v/felixfbecker/language-server-protocol.svg)](https://packagist.org/packages/felixfbecker/language-server-protocol) -[![build](https://travis-ci.org/felixfbecker/php-language-server-protocol.svg?branch=master)](https://travis-ci.org/felixfbecker/php-language-server-protocol) -[![php](https://img.shields.io/badge/php-%3E%3D%207.0-8892BF.svg)](https://php.net/) -[![license](https://img.shields.io/packagist/l/felixfbecker/language-server-protocol.svg)](https://github.com/felixfbecker/php-language-server-protocol/blob/master/LICENSE) - -Protocol classes for the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) in PHP - -## Installation - -``` -composer require felixfbecker/language-server-protocol -``` - -## Releases - -Releases are done automatically in CI by analyzing commit messages. -Make sure to follow the [Conventional Commits Convention](https://www.conventionalcommits.org/en/v1.0.0-beta.2/). diff --git a/vendor/felixfbecker/language-server-protocol/composer.json b/vendor/felixfbecker/language-server-protocol/composer.json deleted file mode 100644 index 4d653b4a..00000000 --- a/vendor/felixfbecker/language-server-protocol/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "felixfbecker/language-server-protocol", - "description": "PHP classes for the Language Server Protocol", - "license": "ISC", - "keywords": [ - "php", - "language", - "server", - "microsoft" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" - }, - "autoload": { - "psr-4": { - "LanguageServerProtocol\\": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "minimum-stability": "dev", - "prefer-stable": true, - "scripts": - { - "phpstan": "phpstan analyse -c phpstan.neon --ansi --level=7 -vvv src", - "psalm": "psalm", - "phpcs": "phpcs", - "phpcbf": "phpcbf" - } -} diff --git a/vendor/felixfbecker/language-server-protocol/package-lock.json b/vendor/felixfbecker/language-server-protocol/package-lock.json deleted file mode 100644 index 7fcdd3b4..00000000 --- a/vendor/felixfbecker/language-server-protocol/package-lock.json +++ /dev/null @@ -1,6489 +0,0 @@ -{ - "name": "php-language-server-protocol", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz", - "integrity": "sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw==", - "dev": true - }, - "@octokit/rest": { - "version": "15.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-15.12.0.tgz", - "integrity": "sha512-5wRag4kHRkp0JDo++L9x9FkDlHEALbLnbSede16D8u+a2/t+gX32uhDs8cukVLyyrZR79nmh1lNpxZmffwoNoQ==", - "dev": true, - "requires": { - "before-after-hook": "^1.1.0", - "btoa-lite": "^1.0.0", - "debug": "^3.1.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.0", - "lodash": "^4.17.4", - "node-fetch": "^2.1.1", - "universal-user-agent": "^2.0.0", - "url-template": "^2.0.8" - }, - "dependencies": { - "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@semantic-release/commit-analyzer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-6.0.1.tgz", - "integrity": "sha512-ENCRn1tm1D08CCBnIPsID8GjboWT6E97s0Lk3XrpAh+IMx615uAU1X2FoXyOGGc6zmqp9Ff4s8KECd/GjMcodQ==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.0", - "debug": "^4.0.0", - "import-from": "^2.1.0", - "lodash": "^4.17.4" - } - }, - "@semantic-release/error": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", - "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", - "dev": true - }, - "@semantic-release/github": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-5.0.5.tgz", - "integrity": "sha512-Hdt6b8ST2pg6pl151PlcsnTcdsC2UJhA5FdbmunbZG/TVmlnKCZ4WUzpji7YqJtDLjbQTuFm/vhM6atW3XjMWg==", - "dev": true, - "requires": { - "@octokit/rest": "^15.2.0", - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^1.0.0", - "bottleneck": "^2.0.1", - "debug": "^4.0.0", - "dir-glob": "^2.0.0", - "fs-extra": "^7.0.0", - "globby": "^8.0.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "issue-parser": "^3.0.0", - "lodash": "^4.17.4", - "mime": "^2.0.3", - "p-filter": "^1.0.0", - "p-retry": "^2.0.0", - "parse-github-url": "^1.0.1", - "url-join": "^4.0.0" - } - }, - "@semantic-release/npm": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-5.0.4.tgz", - "integrity": "sha512-ExGXP9GnM2hqUIgTnp6sXKB1G0Yh+fuLftmIopq5KHBWj34Wd2YbM/3iLkXXnAP1YZ9YCp7hsAdsR014ctbwHg==", - "dev": true, - "requires": { - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^1.0.0", - "detect-indent": "^5.0.0", - "detect-newline": "^2.1.0", - "execa": "^1.0.0", - "fs-extra": "^7.0.0", - "lodash": "^4.17.4", - "nerf-dart": "^1.0.0", - "normalize-url": "^3.0.0", - "npm": "^6.3.0", - "parse-json": "^4.0.0", - "rc": "^1.2.8", - "read-pkg": "^4.0.0", - "registry-auth-token": "^3.3.1" - }, - "dependencies": { - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - } - } - } - }, - "@semantic-release/release-notes-generator": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-7.0.2.tgz", - "integrity": "sha512-fomHrGq/gfZIAQYZk0MLRwfQ8d+DbTcI3kuO1hU2L0fDJYKHZHuPmKnsfVa5KoNdVVPHx878D/ojgyStRqhc9g==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^4.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.0", - "debug": "^4.0.0", - "get-stream": "^4.0.0", - "git-url-parse": "^10.0.1", - "import-from": "^2.1.0", - "into-stream": "^3.1.0", - "lodash": "^4.17.4" - } - }, - "JSONStream": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", - "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "aggregate-error": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz", - "integrity": "sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w=", - "dev": true, - "requires": { - "clean-stack": "^1.0.0", - "indent-string": "^3.0.0" - } - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "before-after-hook": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.1.0.tgz", - "integrity": "sha512-VOMDtYPwLbIncTxNoSzRyvaMxtXmLWLUqr8k5AfC1BzLk34HvBXaQX8snOwQZ4c0aX8aSERqtJSiI9/m2u5kuA==", - "dev": true - }, - "bottleneck": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.11.0.tgz", - "integrity": "sha512-DvKiYR1kG1qRVoLBUtPlmJffktoBZIz3qtdUbINlwzQXDhlhZdF8gWesPjwp05xqr5QZ7wXA2k1w78/COCweTg==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-stack": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", - "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=", - "dev": true - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true, - "optional": true - }, - "compare-func": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", - "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^3.0.0" - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "conventional-changelog-angular": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.1.tgz", - "integrity": "sha512-q4ylJ68fWZDdrFC9z4zKcf97HW6hp7Mo2YlqD4owfXhecFKy/PJCU/1oVFF4TqochchChqmZ0Vb0e0g8/MKNlA==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "q": "^1.5.1" - } - }, - "conventional-changelog-writer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.0.tgz", - "integrity": "sha512-hMZPe0AQ6Bi05epeK/7hz80xxk59nPA5z/b63TOHq2wigM0/akreOc8N4Jam5b9nFgKWX1e9PdPv2ewgW6bcfg==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "conventional-commits-filter": "^2.0.0", - "dateformat": "^3.0.0", - "handlebars": "^4.0.2", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.2.1", - "meow": "^4.0.0", - "semver": "^5.5.0", - "split": "^1.0.0", - "through2": "^2.0.0" - } - }, - "conventional-commits-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.0.tgz", - "integrity": "sha512-Cfl0j1/NquB/TMVx7Wrmyq7uRM+/rPQbtVVGwzfkhZ6/yH6fcMmP0Q/9044TBZPTNdGzm46vXFXL14wbET0/Mg==", - "dev": true, - "requires": { - "is-subset": "^0.1.1", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.0.tgz", - "integrity": "sha512-GWh71U26BLWgMykCp+VghZ4s64wVbtseECcKQ/PvcPZR2cUnz+FUc2J9KjxNl7/ZbCxST8R03c9fc+Vi0umS9Q==", - "dev": true, - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.0", - "lodash": "^4.2.1", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0", - "trim-off-newlines": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", - "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.0.1.tgz", - "integrity": "sha512-K23FHJ/Mt404FSlp6gSZCevIbTMLX0j3fmHhUEhQ3Wq0FMODW3+cUSoLdy1Gx4polAf4t/lphhmHH35BB8cLYw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "env-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.0.0.tgz", - "integrity": "sha512-3Xt4Cfjdy9MTTrg/eWTnJNQIrtU1DDV0KyuWOGlrR2oa9dOdzoOMbQBFbfrTiv+GypdiWWIw5HdmtakZO+rzWA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "java-properties": "^0.2.9" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", - "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.0.1", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.1", - "micromatch": "^3.1.10" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "find-versions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-2.0.0.tgz", - "integrity": "sha1-KtkNSQ9oKMGqQCks9wmsMxghDDw=", - "dev": true, - "requires": { - "array-uniq": "^1.0.0", - "semver-regex": "^1.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", - "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.0.0.tgz", - "integrity": "sha512-FneLKMENeOR7wOK0/ZXCh+lwqtnPwkeunJjRN28LPqzGvNAhYvrTAhXv6xDm4vsJ0M7lcRbIYHQudKsSy2RtSQ==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", - "dev": true, - "requires": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - }, - "dependencies": { - "split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", - "dev": true, - "requires": { - "through2": "~2.0.0" - } - } - } - }, - "git-up": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-2.0.10.tgz", - "integrity": "sha512-2v4UN3qV2RGypD9QpmUjpk+4+RlYpW8GFuiZqQnKmvei08HsFPd0RfbDvEhnE4wBvnYs8ORVtYpOFuuCEmBVBw==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^1.3.0" - } - }, - "git-url-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-10.0.1.tgz", - "integrity": "sha512-Tq2u8UPXc/FawC/dO8bvh8jcck0Lkor5OhuZvmVSeyJGRucDBfw9y2zy/GNCx28lMYh1N12IzPwDexjUNFyAeg==", - "dev": true, - "requires": { - "git-up": "^2.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "globby": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", - "dev": true, - "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hook-std": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-1.1.0.tgz", - "integrity": "sha512-aIyBZbZl3NS8XoSwIDQ+ZaiBuPOhhPWoBFA3QX0Q8hOMO8Tx4xGRTDnn/nl/LAtZWdieXzFC9ohAtTSnWrlHCQ==", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", - "dev": true, - "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "dev": true, - "requires": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-ssh": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.0.tgz", - "integrity": "sha1-6+oRaaJhTaOSpjdANmw84EnY3/Y=", - "dev": true, - "requires": { - "protocols": "^1.1.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "issue-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-3.0.0.tgz", - "integrity": "sha512-VWIhBdy0eOhlvpxOOMecBCHMpjx7lWVZcYpSzjD4dSdxptzI9TBR/cQEh057HL8+7jQKTLs+uCtezY/9VoveCA==", - "dev": true, - "requires": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - } - }, - "java-properties": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-0.2.10.tgz", - "integrity": "sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w==", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - } - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "macos-release": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", - "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", - "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "marked": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.0.tgz", - "integrity": "sha512-UhjmkCWKu1SS/BIePL2a59BMJ7V42EYtTfksodPRXzPEGEph3Inp5dylseqt+KbU9Jglsx8xcMKmlumfJMBXAA==", - "dev": true - }, - "marked-terminal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.1.1.tgz", - "integrity": "sha512-7UBFww1rdx0w9HehLMCVYa8/AxXaiDigDfMsJcj82/wgLQG9cj+oiMAVlJpeWD57VFJY2OYY+bKeEVIjIlxi+w==", - "dev": true, - "requires": { - "cardinal": "^2.1.1", - "chalk": "^2.4.1", - "cli-table": "^0.3.1", - "lodash.assign": "^4.2.0", - "node-emoji": "^1.4.1" - } - }, - "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" - } - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - }, - "dependencies": { - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - } - } - }, - "merge2": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", - "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-emoji": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", - "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", - "dev": true, - "requires": { - "lodash.toarray": "^4.4.0" - } - }, - "node-fetch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.0.tgz", - "integrity": "sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA==", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "npm": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.4.1.tgz", - "integrity": "sha512-mXJL1NTVU136PtuopXCUQaNWuHlXCTp4McwlSW8S9/Aj8OEPAlSBgo8og7kJ01MjCDrkmqFQTvN5tTEhBMhXQg==", - "dev": true, - "requires": { - "JSONStream": "^1.3.4", - "abbrev": "~1.1.1", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "aproba": "~1.2.0", - "archy": "~1.0.0", - "bin-links": "^1.1.2", - "bluebird": "~3.5.1", - "byte-size": "^4.0.3", - "cacache": "^11.2.0", - "call-limit": "~1.1.0", - "chownr": "~1.0.1", - "ci-info": "^1.4.0", - "cli-columns": "^3.1.2", - "cli-table3": "^0.5.0", - "cmd-shim": "~2.0.2", - "columnify": "~1.5.4", - "config-chain": "~1.1.11", - "debuglog": "*", - "detect-indent": "~5.0.0", - "detect-newline": "^2.1.0", - "dezalgo": "~1.0.3", - "editor": "~1.0.0", - "figgy-pudding": "^3.4.1", - "find-npm-prefix": "^1.0.2", - "fs-vacuum": "~1.2.10", - "fs-write-stream-atomic": "~1.0.10", - "gentle-fs": "^2.0.1", - "glob": "~7.1.2", - "graceful-fs": "~4.1.11", - "has-unicode": "~2.0.1", - "hosted-git-info": "^2.7.1", - "iferr": "^1.0.2", - "imurmurhash": "*", - "inflight": "~1.0.6", - "inherits": "~2.0.3", - "ini": "^1.3.5", - "init-package-json": "^1.10.3", - "is-cidr": "^2.0.6", - "json-parse-better-errors": "^1.0.2", - "lazy-property": "~1.0.0", - "libcipm": "^2.0.2", - "libnpmhook": "^4.0.1", - "libnpx": "^10.2.0", - "lock-verify": "^2.0.2", - "lockfile": "^1.0.4", - "lodash._baseindexof": "*", - "lodash._baseuniq": "~4.6.0", - "lodash._bindcallback": "*", - "lodash._cacheindexof": "*", - "lodash._createcache": "*", - "lodash._getnative": "*", - "lodash.clonedeep": "~4.5.0", - "lodash.restparam": "*", - "lodash.union": "~4.6.0", - "lodash.uniq": "~4.5.0", - "lodash.without": "~4.4.0", - "lru-cache": "^4.1.3", - "meant": "~1.0.1", - "mississippi": "^3.0.0", - "mkdirp": "~0.5.1", - "move-concurrently": "^1.0.1", - "node-gyp": "^3.8.0", - "nopt": "~4.0.1", - "normalize-package-data": "~2.4.0", - "npm-audit-report": "^1.3.1", - "npm-cache-filename": "~1.0.2", - "npm-install-checks": "~3.0.0", - "npm-lifecycle": "^2.1.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.11", - "npm-pick-manifest": "^2.1.0", - "npm-profile": "^3.0.2", - "npm-registry-client": "^8.6.0", - "npm-registry-fetch": "^1.1.0", - "npm-user-validate": "~1.0.0", - "npmlog": "~4.1.2", - "once": "~1.4.0", - "opener": "^1.5.0", - "osenv": "^0.1.5", - "pacote": "^8.1.6", - "path-is-inside": "~1.0.2", - "promise-inflight": "~1.0.1", - "qrcode-terminal": "^0.12.0", - "query-string": "^6.1.0", - "qw": "~1.0.1", - "read": "~1.0.7", - "read-cmd-shim": "~1.0.1", - "read-installed": "~4.0.3", - "read-package-json": "^2.0.13", - "read-package-tree": "^5.2.1", - "readable-stream": "^2.3.6", - "readdir-scoped-modules": "*", - "request": "^2.88.0", - "retry": "^0.12.0", - "rimraf": "~2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "sha": "~2.0.1", - "slide": "~1.1.6", - "sorted-object": "~2.0.1", - "sorted-union-stream": "~2.1.3", - "ssri": "^6.0.0", - "stringify-package": "^1.0.0", - "tar": "^4.4.6", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "uid-number": "0.0.6", - "umask": "~1.1.0", - "unique-filename": "~1.1.0", - "unpipe": "~1.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.3.2", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "~3.0.0", - "which": "^1.3.1", - "worker-farm": "^1.6.0", - "write-file-atomic": "^2.3.0" - }, - "dependencies": { - "JSONStream": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "agent-base": { - "version": "4.2.0", - "bundled": true, - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.4.1", - "bundled": true, - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "ajv": { - "version": "5.5.2", - "bundled": true, - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ansi-align": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.0.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "ansistyles": { - "version": "0.1.3", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "asap": { - "version": "2.0.6", - "bundled": true, - "dev": true - }, - "asn1": { - "version": "0.2.4", - "bundled": true, - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "bundled": true, - "dev": true - }, - "aws4": { - "version": "1.8.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bin-links": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "cmd-shim": "^2.0.2", - "gentle-fs": "^2.0.0", - "graceful-fs": "^4.1.11", - "write-file-atomic": "^2.3.0" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.5.1", - "bundled": true, - "dev": true - }, - "boxen": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-from": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "builtins": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "byline": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "byte-size": { - "version": "4.0.3", - "bundled": true, - "dev": true - }, - "cacache": { - "version": "11.2.0", - "bundled": true, - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "call-limit": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "chalk": { - "version": "2.4.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "ci-info": { - "version": "1.4.0", - "bundled": true, - "dev": true - }, - "cidr-regex": { - "version": "2.0.9", - "bundled": true, - "dev": true, - "requires": { - "ip-regex": "^2.1.0" - } - }, - "cli-boxes": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "cli-columns": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" - } - }, - "cli-table3": { - "version": "0.5.0", - "bundled": true, - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "cmd-shim": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "~0.5.0" - } - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "color-convert": { - "version": "1.9.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "^1.1.1" - } - }, - "color-name": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "colors": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "columnify": { - "version": "1.5.4", - "bundled": true, - "dev": true, - "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "combined-stream": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "bundled": true, - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "iferr": { - "version": "0.1.5", - "bundled": true, - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "cyclist": { - "version": "0.2.2", - "bundled": true, - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true - }, - "defaults": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "detect-indent": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "detect-newline": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "dezalgo": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "dot-prop": { - "version": "4.2.0", - "bundled": true, - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "duplexify": { - "version": "3.6.0", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "editor": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "encoding": { - "version": "0.1.12", - "bundled": true, - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "err-code": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "errno": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "es6-promise": { - "version": "4.2.4", - "bundled": true, - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "execa": { - "version": "0.7.0", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "extend": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "figgy-pudding": { - "version": "3.4.1", - "bundled": true, - "dev": true - }, - "find-npm-prefix": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "find-up": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flush-write-stream": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true - }, - "form-data": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs-vacuum": { - "version": "1.2.10", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "path-is-inside": "^1.0.1", - "rimraf": "^2.5.2" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - }, - "dependencies": { - "iferr": { - "version": "0.1.5", - "bundled": true, - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "genfun": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "gentle-fs": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.2", - "fs-vacuum": "^1.2.10", - "graceful-fs": "^4.1.11", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "path-is-inside": "^1.0.2", - "read-cmd-shim": "^1.0.1", - "slide": "^1.1.6" - }, - "dependencies": { - "iferr": { - "version": "0.1.5", - "bundled": true, - "dev": true - } - } - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-dirs": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "got": { - "version": "6.7.1", - "bundled": true, - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "har-validator": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "bundled": true, - "dev": true - }, - "http-cache-semantics": { - "version": "3.8.1", - "bundled": true, - "dev": true - }, - "http-proxy-agent": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - } - }, - "http-signature": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.23", - "bundled": true, - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "iferr": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "import-lazy": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true - }, - "init-package-json": { - "version": "1.10.3", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "ip": { - "version": "1.1.5", - "bundled": true, - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-ci": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "ci-info": "^1.0.0" - } - }, - "is-cidr": { - "version": "2.0.6", - "bundled": true, - "dev": true, - "requires": { - "cidr-regex": "^2.0.8" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "is-path-inside": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-redirect": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "bundled": true, - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true, - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "latest-version": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "package-json": "^4.0.0" - } - }, - "lazy-property": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "libcipm": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "graceful-fs": "^4.1.11", - "lock-verify": "^2.0.2", - "mkdirp": "^0.5.1", - "npm-lifecycle": "^2.0.3", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "pacote": "^8.1.6", - "protoduck": "^5.0.0", - "read-package-json": "^2.0.13", - "rimraf": "^2.6.2", - "worker-farm": "^1.6.0" - } - }, - "libnpmhook": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "figgy-pudding": "^3.1.0", - "npm-registry-fetch": "^3.0.0" - }, - "dependencies": { - "npm-registry-fetch": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "figgy-pudding": "^3.1.0", - "lru-cache": "^4.1.2", - "make-fetch-happen": "^4.0.0", - "npm-package-arg": "^6.0.0" - } - } - } - }, - "libnpx": { - "version": "10.2.0", - "bundled": true, - "dev": true, - "requires": { - "dotenv": "^5.0.1", - "npm-package-arg": "^6.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.0", - "update-notifier": "^2.3.0", - "which": "^1.3.0", - "y18n": "^4.0.0", - "yargs": "^11.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lock-verify": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-package-arg": "^5.1.2 || 6", - "semver": "^5.4.1" - } - }, - "lockfile": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "requires": { - "signal-exit": "^3.0.2" - } - }, - "lodash._baseindexof": { - "version": "3.1.0", - "bundled": true, - "dev": true - }, - "lodash._baseuniq": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "requires": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "lodash._createcache": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0" - } - }, - "lodash._createset": { - "version": "4.0.3", - "bundled": true, - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "bundled": true, - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "bundled": true, - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "bundled": true, - "dev": true - }, - "lodash.union": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "bundled": true, - "dev": true - }, - "lodash.without": { - "version": "4.4.0", - "bundled": true, - "dev": true - }, - "lowercase-keys": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "4.1.3", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "make-fetch-happen": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^11.0.1", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - } - }, - "meant": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "mime-db": { - "version": "1.35.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.19", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "~1.35.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mississippi": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "move-concurrently": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "bundled": true, - "dev": true - }, - "node-fetch-npm": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node-gyp": { - "version": "3.8.0", - "bundled": true, - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "nopt": { - "version": "3.0.6", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - } - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-audit-report": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "cli-table3": "^0.5.0", - "console-control-strings": "^1.1.0" - } - }, - "npm-bundled": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "npm-cache-filename": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "npm-install-checks": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "semver": "^2.3.0 || 3.x || 4 || 5" - } - }, - "npm-lifecycle": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.11", - "node-gyp": "^3.8.0", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" - } - }, - "npm-logical-tree": { - "version": "1.2.1", - "bundled": true, - "dev": true - }, - "npm-package-arg": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.6.0", - "osenv": "^0.1.5", - "semver": "^5.5.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-packlist": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "npm-profile": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.2 || 2", - "make-fetch-happen": "^2.5.0 || 3 || 4" - } - }, - "npm-registry-client": { - "version": "8.6.0", - "bundled": true, - "dev": true, - "requires": { - "concat-stream": "^1.5.2", - "graceful-fs": "^4.1.6", - "normalize-package-data": "~1.0.1 || ^2.0.0", - "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "npmlog": "2 || ^3.1.0 || ^4.0.0", - "once": "^1.3.3", - "request": "^2.74.0", - "retry": "^0.10.0", - "safe-buffer": "^5.1.1", - "semver": "2 >=2.2.1 || 3.x || 4 || 5", - "slide": "^1.1.3", - "ssri": "^5.2.4" - }, - "dependencies": { - "retry": { - "version": "0.10.1", - "bundled": true, - "dev": true - }, - "ssri": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - } - } - }, - "npm-registry-fetch": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "figgy-pudding": "^2.0.1", - "lru-cache": "^4.1.2", - "make-fetch-happen": "^3.0.0", - "npm-package-arg": "^6.0.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "cacache": { - "version": "10.0.4", - "bundled": true, - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - }, - "dependencies": { - "mississippi": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - } - } - }, - "figgy-pudding": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "make-fetch-happen": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^10.0.4", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.0", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^3.0.1", - "ssri": "^5.2.4" - } - }, - "pump": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "smart-buffer": { - "version": "1.1.15", - "bundled": true, - "dev": true - }, - "socks": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" - } - }, - "socks-proxy-agent": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" - } - }, - "ssri": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npm-user-validate": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.0", - "bundled": true, - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "package-json": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - } - }, - "pacote": { - "version": "8.1.6", - "bundled": true, - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "cacache": "^11.0.2", - "get-stream": "^3.0.0", - "glob": "^7.1.2", - "lru-cache": "^4.1.3", - "make-fetch-happen": "^4.0.1", - "minimatch": "^3.0.4", - "minipass": "^2.3.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.10", - "npm-pick-manifest": "^2.1.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "ssri": "^6.0.0", - "tar": "^4.4.3", - "unique-filename": "^1.1.0", - "which": "^1.3.0" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "pify": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-retry": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - }, - "dependencies": { - "retry": { - "version": "0.10.1", - "bundled": true, - "dev": true - } - } - }, - "promzard": { - "version": "0.3.0", - "bundled": true, - "dev": true, - "requires": { - "read": "1" - } - }, - "proto-list": { - "version": "1.2.4", - "bundled": true, - "dev": true - }, - "protoduck": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "genfun": "^4.0.1" - } - }, - "prr": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "psl": { - "version": "1.1.29", - "bundled": true, - "dev": true - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "bundled": true, - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "qs": { - "version": "6.5.2", - "bundled": true, - "dev": true - }, - "query-string": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "strict-uri-encode": "^2.0.0" - } - }, - "qw": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true - } - } - }, - "read": { - "version": "1.0.7", - "bundled": true, - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "read-installed": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" - } - }, - "read-package-json": { - "version": "2.0.13", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" - } - }, - "read-package-tree": { - "version": "5.2.1", - "bundled": true, - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "once": "^1.3.0", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "registry-auth-token": { - "version": "3.3.2", - "bundled": true, - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, - "request": { - "version": "2.88.0", - "bundled": true, - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "retry": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "run-queue": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "semver-diff": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "semver": "^5.0.3" - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "sha": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "readable-stream": "^2.0.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "slash": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "slide": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "smart-buffer": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "socks": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.0.1" - } - }, - "socks-proxy-agent": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "~4.2.0", - "socks": "~2.2.0" - } - }, - "sorted-object": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "sorted-union-stream": { - "version": "2.1.3", - "bundled": true, - "dev": true, - "requires": { - "from2": "^1.3.0", - "stream-iterate": "^1.1.0" - }, - "dependencies": { - "from2": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.10" - } - }, - "isarray": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "bundled": true, - "dev": true - } - } - }, - "spdx-correct": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "sshpk": { - "version": "1.14.2", - "bundled": true, - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.0", - "bundled": true, - "dev": true - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-iterate": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "stream-shift": "^1.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "strict-uri-encode": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-package": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tar": { - "version": "4.4.6", - "bundled": true, - "dev": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.3", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } - } - }, - "term-size": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "through": { - "version": "2.3.8", - "bundled": true, - "dev": true - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "timed-out": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "bundled": true, - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "typedarray": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "umask": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "unique-filename": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-string": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "unzip-response": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "bundled": true, - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "util-extend": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.3.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.2" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1" - } - }, - "worker-farm": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "xtend": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "y18n": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "11.0.0", - "bundled": true, - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "y18n": { - "version": "3.2.1", - "bundled": true, - "dev": true - } - } - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, - "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", - "dev": true, - "requires": { - "execa": "^0.10.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "dependencies": { - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } - } - }, - "os-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", - "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", - "dev": true, - "requires": { - "macos-release": "^1.0.0", - "win-release": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-1.0.0.tgz", - "integrity": "sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds=", - "dev": true, - "requires": { - "p-map": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - }, - "dependencies": { - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - } - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-retry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-2.0.0.tgz", - "integrity": "sha512-ZbCuzAmiwJ45q4evp/IG9D+5MUllGSUeCWwPt3j/tdYSi1KPkSD+46uqmAA1LhccDhOXv8kYZKNb8x78VflzfA==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-url": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", - "integrity": "sha1-V8FUKKuKiSsfQ4aWRccR0OFEtVQ=", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "protocols": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.6.tgz", - "integrity": "sha1-+LsmPqG1/Xp2BNJri+Ob13Z4v4o=", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "semantic-release": { - "version": "15.9.16", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.9.16.tgz", - "integrity": "sha512-5RWqMFwDBXzIaNGUdnJxI4aCd4DtKtdc+5ZNjNWXABEmkimZVuuzZhMaTVNhHYfSuVUqWG9GuATEKhjlVoTzfQ==", - "dev": true, - "requires": { - "@semantic-release/commit-analyzer": "^6.0.0", - "@semantic-release/error": "^2.2.0", - "@semantic-release/github": "^5.0.0", - "@semantic-release/npm": "^5.0.1", - "@semantic-release/release-notes-generator": "^7.0.0", - "aggregate-error": "^1.0.0", - "cosmiconfig": "^5.0.1", - "debug": "^4.0.0", - "env-ci": "^3.0.0", - "execa": "^1.0.0", - "figures": "^2.0.0", - "find-versions": "^2.0.0", - "get-stream": "^4.0.0", - "git-log-parser": "^1.2.0", - "git-url-parse": "^10.0.1", - "hook-std": "^1.1.0", - "hosted-git-info": "^2.7.1", - "lodash": "^4.17.4", - "marked": "^0.5.0", - "marked-terminal": "^3.0.0", - "p-locate": "^3.0.0", - "p-reduce": "^1.0.0", - "read-pkg-up": "^4.0.0", - "resolve-from": "^4.0.0", - "semver": "^5.4.1", - "signale": "^1.2.1", - "yargs": "^12.0.0" - } - }, - "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true - }, - "semver-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "signale": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.3.0.tgz", - "integrity": "sha512-TyFhsQ9wZDYDfsPqWMyjCxsDoMwfpsT0130Mce7wDiVCSDdtWSg83dOqoj8aGpGCs3n1YPcam6sT1OFPuGT/OQ==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", - "dev": true - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", - "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "requires": { - "through2": "^2.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "text-extensions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.8.0.tgz", - "integrity": "sha512-mVzjRxuWnDKs/qH1rbOJEVHLlSX9kty9lpi7lMvLgU9S74mQ8/Ozg9UPcKxShh0qG2NZ+NyPOPpcZU4C1Eld9A==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true - }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "universal-user-agent": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.1.tgz", - "integrity": "sha512-vz+heWVydO0iyYAa65VHD7WZkYzhl7BeNVy4i54p4TF8OMiLSXdbuQe4hm+fmWAsL+rVibaQHXfhvkw3c1Ws2w==", - "dev": true, - "requires": { - "os-name": "^2.0.1" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-join": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", - "dev": true - }, - "url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "win-release": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", - "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", - "dev": true, - "requires": { - "semver": "^5.0.1" - } - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", - "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^2.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" - }, - "dependencies": { - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - } - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } -} diff --git a/vendor/felixfbecker/language-server-protocol/package.json b/vendor/felixfbecker/language-server-protocol/package.json deleted file mode 100644 index 314301e0..00000000 --- a/vendor/felixfbecker/language-server-protocol/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "private": true, - "repository": { - "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol" - }, - "release": { - "verifyConditions": "@semantic-release/github", - "prepare": [], - "publish": "@semantic-release/github" - }, - "devDependencies": { - "semantic-release": "^15.9.16" - } -} diff --git a/vendor/felixfbecker/language-server-protocol/psalm-baseline.xml b/vendor/felixfbecker/language-server-protocol/psalm-baseline.xml deleted file mode 100644 index ca496853..00000000 --- a/vendor/felixfbecker/language-server-protocol/psalm-baseline.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - $range - - - - - $triggerKind - - - - - $label - - - - - $text - - - - - $message - - - - - $range - - - - - $firstTriggerCharacter - - - - - $insertSpaces - $tabSize - - - - - $contents - - - - - $range - $uri - - - - - $language - $value - - - - - $kind - $value - - - - - $title - - - - - $name - - - - - $character - $line - - - - - $end - $start - - - - - $includeDeclaration - - - - - $reference - $symbol - - - - - $fqsen - - - - - $kind - $location - $name - - - - - $symbol - - - - - $text - - - - - $uri - - - - - $languageId - $text - $uri - $version - - - - - $newText - $range - - - - - $version - - - diff --git a/vendor/felixfbecker/language-server-protocol/psalm.xml b/vendor/felixfbecker/language-server-protocol/psalm.xml deleted file mode 100644 index 378f26fa..00000000 --- a/vendor/felixfbecker/language-server-protocol/psalm.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - diff --git a/vendor/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php deleted file mode 100644 index 4062ada7..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php +++ /dev/null @@ -1,22 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ChangeAnnotation.php b/vendor/felixfbecker/language-server-protocol/src/ChangeAnnotation.php deleted file mode 100644 index 39868e53..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ChangeAnnotation.php +++ /dev/null @@ -1,39 +0,0 @@ -label = $label; - $this->needsConfirmation = $needsConfirmation; - $this->description = $description; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilities.php deleted file mode 100644 index c706dce7..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilities.php +++ /dev/null @@ -1,97 +0,0 @@ -workspace = $workspace; - $this->textDocument = $textDocument; - $this->window = $window; - $this->general = $general; - $this->experimental = $experimental; - $this->xfilesProvider = $xfilesProvider; - $this->xcontentProvider = $xcontentProvider; - $this->xcacheProvider = $xcacheProvider; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php deleted file mode 100644 index 70463d07..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php +++ /dev/null @@ -1,33 +0,0 @@ -regularExpressions = $regularExpressions; - $this->markdown = $markdown; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php deleted file mode 100644 index 8d6551f5..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php +++ /dev/null @@ -1,47 +0,0 @@ -workDoneProgress = $workDoneProgress; - $this->showMessage = $showMessage; - $this->showDocument = $showDocument; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php b/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php deleted file mode 100644 index 00e92475..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php +++ /dev/null @@ -1,99 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->didCreate = $didCreate; - $this->willCreate = $willCreate; - $this->didRename = $didRename; - $this->willRename = $willRename; - $this->didDelete = $didDelete; - $this->willDelete = $willDelete; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ClientInfo.php b/vendor/felixfbecker/language-server-protocol/src/ClientInfo.php deleted file mode 100644 index 5903a0c8..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ClientInfo.php +++ /dev/null @@ -1,29 +0,0 @@ -name = $name; - $this->version = $version; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeAction.php b/vendor/felixfbecker/language-server-protocol/src/CodeAction.php deleted file mode 100644 index 90133465..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeAction.php +++ /dev/null @@ -1,146 +0,0 @@ -title = $title; - $this->kind = $kind; - $this->diagnostics = $diagnostics; - $this->isPreferred = $isPreferred; - $this->disabled = $disabled; - $this->edit = $edit; - $this->command = $command; - $this->data = $data; - } - - /** - * This is needed because VSCode Does not like nulls - * meaning if a null is sent then this will not compute - * - * @return mixed - */ - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - return array_filter(get_object_vars($this)); - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php deleted file mode 100644 index 8abb115e..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php +++ /dev/null @@ -1,95 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->codeActionLiteralSupport = $codeActionLiteralSupport; - $this->isPreferredSupport = $isPreferredSupport; - $this->disabledSupport = $disabledSupport; - $this->dataSupport = $dataSupport; - $this->resolveSupport = $resolveSupport; - $this->honorsChangeAnnotations = $honorsChangeAnnotations; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php deleted file mode 100644 index ea3583f3..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php +++ /dev/null @@ -1,20 +0,0 @@ -codeActionKind = $codeActionKind; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php deleted file mode 100644 index 3d510737..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php +++ /dev/null @@ -1,28 +0,0 @@ -valueSet = $valueSet; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php deleted file mode 100644 index 89118ec1..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php +++ /dev/null @@ -1,21 +0,0 @@ -properties = $properties; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionContext.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionContext.php deleted file mode 100644 index 3766334a..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeActionContext.php +++ /dev/null @@ -1,51 +0,0 @@ -diagnostics = $diagnostics; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionDisabled.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionDisabled.php deleted file mode 100644 index a16d9642..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeActionDisabled.php +++ /dev/null @@ -1,21 +0,0 @@ -reason = $reason; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeActionKind.php b/vendor/felixfbecker/language-server-protocol/src/CodeActionKind.php deleted file mode 100644 index b1329b16..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeActionKind.php +++ /dev/null @@ -1,87 +0,0 @@ -href = $href; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeLens.php b/vendor/felixfbecker/language-server-protocol/src/CodeLens.php deleted file mode 100644 index 25998e3c..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeLens.php +++ /dev/null @@ -1,46 +0,0 @@ -range = $range; - $this->command = $command; - $this->data = $data; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php deleted file mode 100644 index 706733e5..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php +++ /dev/null @@ -1,20 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeLensOptions.php b/vendor/felixfbecker/language-server-protocol/src/CodeLensOptions.php deleted file mode 100644 index 7db0d4df..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeLensOptions.php +++ /dev/null @@ -1,21 +0,0 @@ -resolveProvider = $resolveProvider; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php deleted file mode 100644 index e97a8b1d..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php +++ /dev/null @@ -1,25 +0,0 @@ -refreshSupport = $refreshSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/Command.php b/vendor/felixfbecker/language-server-protocol/src/Command.php deleted file mode 100644 index 97e0f0cb..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/Command.php +++ /dev/null @@ -1,42 +0,0 @@ -title = $title; - $this->command = $command; - $this->arguments = $arguments; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php deleted file mode 100644 index 2f1ad4a6..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php +++ /dev/null @@ -1,65 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->completionItem = $completionItem; - $this->contextSupport = $contextSupport; - $this->insertTextMode = $insertTextMode; - $this->completionList = $completionList; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php deleted file mode 100644 index d1c1eb7f..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php +++ /dev/null @@ -1,140 +0,0 @@ -snippetSupport = $snippetSupport; - $this->commitCharactersSupport = $commitCharactersSupport; - $this->documentationFormat = $documentationFormat; - $this->deprecatedSupport = $deprecatedSupport; - $this->preselectSupport = $preselectSupport; - $this->tagSupport = $tagSupport; - $this->insertReplaceSupport = $insertReplaceSupport; - $this->resolveSupport = $resolveSupport; - $this->insertTextModeSupport = $insertTextModeSupport; - $this->labelDetailsSupport = $labelDetailsSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php deleted file mode 100644 index 68d4ead8..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php +++ /dev/null @@ -1,24 +0,0 @@ -valueSet = $valueSet; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php deleted file mode 100644 index 9afadfcd..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php +++ /dev/null @@ -1,24 +0,0 @@ -properties = $properties; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php deleted file mode 100644 index b80a4152..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php +++ /dev/null @@ -1,24 +0,0 @@ -valueSet = $valueSet; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php b/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php deleted file mode 100644 index 2a23ed93..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php +++ /dev/null @@ -1,30 +0,0 @@ -itemDefaults = $itemDefaults; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionContext.php b/vendor/felixfbecker/language-server-protocol/src/CompletionContext.php deleted file mode 100644 index 1c6d43fb..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionContext.php +++ /dev/null @@ -1,31 +0,0 @@ -triggerKind = $triggerKind; - $this->triggerCharacter = $triggerCharacter; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionItem.php b/vendor/felixfbecker/language-server-protocol/src/CompletionItem.php deleted file mode 100644 index ec8e4122..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionItem.php +++ /dev/null @@ -1,248 +0,0 @@ -` and a completion item with an `insertText` of - * `console` is provided it will only insert `sole`. Therefore it is - * recommended to use `textEdit` instead since it avoids additional client - * side interpretation. - * - * @var string|null - */ - public $insertText; - - /** - * The format of the insert text. The format applies to both the - * `insertText` property and the `newText` property of a provided - * `textEdit`. If omitted defaults to `InsertTextFormat.PlainText`. - * - * Please note that the insertTextFormat doesn't apply to - * `additionalTextEdits`. - * - * @var int|null - * @see InsertTextFormat - */ - public $insertTextFormat; - - /** - * How whitespace and indentation is handled during completion - * item insertion. If not provided the client's default value depends on - * the `textDocument.completion.insertTextMode` client capability. - * - * @since 3.16.0 - * @since 3.17.0 - support for `textDocument.completion.insertTextMode` - * - * @var int|null - * @see InsertTextMode - */ - public $insertTextMode; - - /** - * An edit which is applied to a document when selecting this completion. - * When an edit is provided the value of `insertText` is ignored. - * - * *Note:* The range of the edit must be a single line range and it must - * contain the position at which completion has been requested. - * - * Most editors support two different operations when accepting a completion - * item. One is to insert a completion text and the other is to replace an - * existing text with a completion text. Since this can usually not be - * predetermined by a server it can report both ranges. Clients need to - * signal support for `InsertReplaceEdit`s via the - * `textDocument.completion.completionItem.insertReplaceSupport` client - * capability property. - * - * *Note 1:* The text edit's range as well as both ranges from an insert - * replace edit must be a [single line] and they must contain the position - * at which completion has been requested. - * *Note 2:* If an `InsertReplaceEdit` is returned the edit's insert range - * must be a prefix of the edit's replace range, that means it must be - * contained and starting at the same position. - * - * @since 3.16.0 additional type `InsertReplaceEdit` - * - * @var TextEdit|null - */ - public $textEdit; - - /** - * An optional array of additional text edits that are applied when - * selecting this completion. Edits must not overlap (including the same - * insert position) with the main edit nor with themselves. - * - * Additional text edits should be used to change text unrelated to the - * current cursor position (for example adding an import statement at the - * top of the file if the completion item will insert an unqualified type). - * - * @var TextEdit[]|null - */ - public $additionalTextEdits; - - /** - * An optional set of characters that when pressed while this completion is - * active will accept it first and then type that character. *Note* that all - * commit characters should have `length=1` and that superfluous characters - * will be ignored. - * - * @var string[]|null - */ - public $commitCharacters; - - /** - * An optional command that is executed *after* inserting this completion. *Note* that - * additional modifications to the current document should be described with the - * additionalTextEdits-property. - * - * @var Command|null - */ - public $command; - - /** - * An data entry field that is preserved on a completion item between - * a completion and a completion resolve request. - * - * @var mixed - */ - public $data; - - /** - * @param string $label - * @param int|null $kind - * @param string|null $detail - * @param string|null $documentation - * @param string|null $sortText - * @param string|null $filterText - * @param string|null $insertText - * @param TextEdit|null $textEdit - * @param TextEdit[]|null $additionalTextEdits - * @param Command|null $command - * @param mixed|null $data - * @param int|null $insertTextFormat - */ - public function __construct( - string $label = null, - int $kind = null, - string $detail = null, - string $documentation = null, - string $sortText = null, - string $filterText = null, - string $insertText = null, - TextEdit $textEdit = null, - array $additionalTextEdits = null, - Command $command = null, - $data = null, - int $insertTextFormat = null - ) { - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->label = $label; - $this->kind = $kind; - $this->detail = $detail; - $this->documentation = $documentation; - $this->sortText = $sortText; - $this->filterText = $filterText; - $this->insertText = $insertText; - $this->textEdit = $textEdit; - $this->additionalTextEdits = $additionalTextEdits; - $this->command = $command; - $this->data = $data; - $this->insertTextFormat = $insertTextFormat; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionItemKind.php b/vendor/felixfbecker/language-server-protocol/src/CompletionItemKind.php deleted file mode 100644 index f2897f9b..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionItemKind.php +++ /dev/null @@ -1,71 +0,0 @@ -detail = $detail; - $this->description = $description; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionItemTag.php b/vendor/felixfbecker/language-server-protocol/src/CompletionItemTag.php deleted file mode 100644 index e88af50c..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionItemTag.php +++ /dev/null @@ -1,11 +0,0 @@ -items = $items; - $this->isIncomplete = $isIncomplete; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionOptions.php b/vendor/felixfbecker/language-server-protocol/src/CompletionOptions.php deleted file mode 100644 index f0c60f96..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionOptions.php +++ /dev/null @@ -1,33 +0,0 @@ -resolveProvider = $resolveProvider; - $this->triggerCharacters = $triggerCharacters; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php b/vendor/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php deleted file mode 100644 index f84c48b5..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php +++ /dev/null @@ -1,16 +0,0 @@ -range = $range; - $this->rangeLength = $rangeLength; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->text = $text; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php deleted file mode 100644 index bab0442e..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php +++ /dev/null @@ -1,31 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->linkSupport = $linkSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php deleted file mode 100644 index bc01efda..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php +++ /dev/null @@ -1,29 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->linkSupport = $linkSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DependencyReference.php b/vendor/felixfbecker/language-server-protocol/src/DependencyReference.php deleted file mode 100644 index afb6d30d..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DependencyReference.php +++ /dev/null @@ -1,27 +0,0 @@ -attributes = $attributes ?? new \stdClass; - $this->hints = $hints; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/Diagnostic.php b/vendor/felixfbecker/language-server-protocol/src/Diagnostic.php deleted file mode 100644 index 657bf0fe..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/Diagnostic.php +++ /dev/null @@ -1,121 +0,0 @@ -message = $message; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->range = $range; - $this->code = $code; - $this->severity = $severity; - $this->source = $source; - $this->codeDescription = $codeDescription; - $this->tags = $tags; - $this->relatedInformation = $relatedInformation; - $this->data = $data; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php b/vendor/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php deleted file mode 100644 index 78e2b9b4..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php +++ /dev/null @@ -1,31 +0,0 @@ -location = $location; - $this->message = $message; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php b/vendor/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php deleted file mode 100644 index d11ed95d..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php +++ /dev/null @@ -1,26 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php deleted file mode 100644 index e82b1841..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php +++ /dev/null @@ -1,21 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php deleted file mode 100644 index 93f55150..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php +++ /dev/null @@ -1,20 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php deleted file mode 100644 index 97261175..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php +++ /dev/null @@ -1,20 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentHighlight.php b/vendor/felixfbecker/language-server-protocol/src/DocumentHighlight.php deleted file mode 100644 index 4c329fce..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentHighlight.php +++ /dev/null @@ -1,32 +0,0 @@ -range = $range; - $this->kind = $kind; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php deleted file mode 100644 index f7fe47b0..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php +++ /dev/null @@ -1,18 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php b/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php deleted file mode 100644 index 21c5001e..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php +++ /dev/null @@ -1,24 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->tooltipSupport = $tooltipSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php deleted file mode 100644 index 0101fc13..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php +++ /dev/null @@ -1,20 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php b/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php deleted file mode 100644 index 149ea36c..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php +++ /dev/null @@ -1,33 +0,0 @@ -firstTriggerCharacter = $firstTriggerCharacter; - $this->moreTriggerCharacter = $moreTriggerCharacter; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php deleted file mode 100644 index 5edca75b..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php +++ /dev/null @@ -1,20 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php deleted file mode 100644 index eaa10a4f..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php +++ /dev/null @@ -1,64 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->symbolKind = $symbolKind; - $this->hierarchicalDocumentSymbolSupport = $hierarchicalDocumentSymbolSupport; - $this->tagSupport = $tagSupport; - $this->labelSupport = $labelSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php b/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php deleted file mode 100644 index 536e5e9c..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php +++ /dev/null @@ -1,37 +0,0 @@ -valueSet = $valueSet; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php b/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php deleted file mode 100644 index f423a1a6..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php +++ /dev/null @@ -1,32 +0,0 @@ -valueSet = $valueSet; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ErrorCode.php b/vendor/felixfbecker/language-server-protocol/src/ErrorCode.php deleted file mode 100644 index ffbc0755..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ErrorCode.php +++ /dev/null @@ -1,17 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php b/vendor/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php deleted file mode 100644 index 0f77b607..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php +++ /dev/null @@ -1,23 +0,0 @@ -commands = $commands; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/FailureHandlingKind.php b/vendor/felixfbecker/language-server-protocol/src/FailureHandlingKind.php deleted file mode 100644 index c0c48db2..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/FailureHandlingKind.php +++ /dev/null @@ -1,36 +0,0 @@ -uri = $uri; - $this->type = $type; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php deleted file mode 100644 index 4efe925b..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php +++ /dev/null @@ -1,42 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->rangeLimit = $rangeLimit; - $this->lineFoldingOnly = $lineFoldingOnly; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/FormattingOptions.php b/vendor/felixfbecker/language-server-protocol/src/FormattingOptions.php deleted file mode 100644 index 1d9c1327..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/FormattingOptions.php +++ /dev/null @@ -1,33 +0,0 @@ -tabSize = $tabSize; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->insertSpaces = $insertSpaces; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/Hover.php b/vendor/felixfbecker/language-server-protocol/src/Hover.php deleted file mode 100644 index 8c39c97d..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/Hover.php +++ /dev/null @@ -1,34 +0,0 @@ -contents = $contents; - $this->range = $range; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php deleted file mode 100644 index 2ba234cb..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php +++ /dev/null @@ -1,36 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->contentFormat = $contentFormat; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php deleted file mode 100644 index 9caef5dd..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php +++ /dev/null @@ -1,32 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->linkSupport = $linkSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/InitializeResult.php b/vendor/felixfbecker/language-server-protocol/src/InitializeResult.php deleted file mode 100644 index 59333eae..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/InitializeResult.php +++ /dev/null @@ -1,29 +0,0 @@ -capabilities = $capabilities; - $this->serverInfo = $serverInfo; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php b/vendor/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php deleted file mode 100644 index 040b5839..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php +++ /dev/null @@ -1,26 +0,0 @@ -name = $name; - $this->version = $version; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/InsertTextFormat.php b/vendor/felixfbecker/language-server-protocol/src/InsertTextFormat.php deleted file mode 100644 index 459904f5..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/InsertTextFormat.php +++ /dev/null @@ -1,25 +0,0 @@ -<3tabs>foo. Accepting a - * multi line completion item is indented using 2 tabs and all - * following lines inserted will be indented using 2 tabs as well. - */ - const ADJUST_INDENTATION = 2; -} diff --git a/vendor/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php deleted file mode 100644 index 05c51086..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php +++ /dev/null @@ -1,23 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/Location.php b/vendor/felixfbecker/language-server-protocol/src/Location.php deleted file mode 100644 index 7429620d..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/Location.php +++ /dev/null @@ -1,27 +0,0 @@ -uri = $uri; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->range = $range; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/LogMessage.php b/vendor/felixfbecker/language-server-protocol/src/LogMessage.php deleted file mode 100644 index 9c6f38d6..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/LogMessage.php +++ /dev/null @@ -1,30 +0,0 @@ -type = $type; - $this->message = $message; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/LogTrace.php b/vendor/felixfbecker/language-server-protocol/src/LogTrace.php deleted file mode 100644 index dfba3645..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/LogTrace.php +++ /dev/null @@ -1,39 +0,0 @@ -message = $message; - $this->verbose = $verbose; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php deleted file mode 100644 index 5af49455..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php +++ /dev/null @@ -1,47 +0,0 @@ -parser = $parser; - $this->version = $version; - $this->allowedTags = $allowedTags; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/MarkedString.php b/vendor/felixfbecker/language-server-protocol/src/MarkedString.php deleted file mode 100644 index 402a8793..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/MarkedString.php +++ /dev/null @@ -1,24 +0,0 @@ -language = $language; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->value = $value; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/MarkupContent.php b/vendor/felixfbecker/language-server-protocol/src/MarkupContent.php deleted file mode 100644 index 5b7e6db1..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/MarkupContent.php +++ /dev/null @@ -1,52 +0,0 @@ -kind = $kind; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->value = $value; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/MarkupKind.php b/vendor/felixfbecker/language-server-protocol/src/MarkupKind.php deleted file mode 100644 index 962fb031..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/MarkupKind.php +++ /dev/null @@ -1,23 +0,0 @@ -title = $title; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/MessageType.php b/vendor/felixfbecker/language-server-protocol/src/MessageType.php deleted file mode 100644 index 1d01540b..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/MessageType.php +++ /dev/null @@ -1,29 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/PackageDescriptor.php b/vendor/felixfbecker/language-server-protocol/src/PackageDescriptor.php deleted file mode 100644 index 9f26856b..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/PackageDescriptor.php +++ /dev/null @@ -1,26 +0,0 @@ -name = $name; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ParameterInformation.php b/vendor/felixfbecker/language-server-protocol/src/ParameterInformation.php deleted file mode 100644 index a94bb671..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ParameterInformation.php +++ /dev/null @@ -1,45 +0,0 @@ -label = $label; - $this->documentation = $documentation; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/Position.php b/vendor/felixfbecker/language-server-protocol/src/Position.php deleted file mode 100644 index 26c5f1e6..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/Position.php +++ /dev/null @@ -1,67 +0,0 @@ -line = $line; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->character = $character; - } - - /** - * Compares this position to another position - * Returns - * - 0 if the positions match - * - a negative number if $this is before $position - * - a positive number otherwise - * - * @param Position $position - * @return int - */ - public function compare(Position $position): int - { - if ($this->line === $position->line && $this->character === $position->character) { - return 0; - } - - if ($this->line !== $position->line) { - return $this->line - $position->line; - } - - return $this->character - $position->character; - } - - /** - * Returns the offset of the position in a string - * - * @param string $content - * @return int - */ - public function toOffset(string $content): int - { - $lines = explode("\n", $content); - $slice = array_slice($lines, 0, $this->line); - return array_sum(array_map('strlen', $slice)) + count($slice) + $this->character; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php b/vendor/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php deleted file mode 100644 index fe374095..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php +++ /dev/null @@ -1,12 +0,0 @@ -relatedInformation = $relatedInformation; - $this->tagSupport = $tagSupport; - $this->versionSupport = $versionSupport; - $this->codeDescriptionSupport = $codeDescriptionSupport; - $this->dataSupport = $dataSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php b/vendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php deleted file mode 100644 index 7fe5df63..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php +++ /dev/null @@ -1,23 +0,0 @@ -valueSet = $valueSet; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/Range.php b/vendor/felixfbecker/language-server-protocol/src/Range.php deleted file mode 100644 index 9077a523..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/Range.php +++ /dev/null @@ -1,42 +0,0 @@ -start = $start; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->end = $end; - } - - /** - * Checks if a position is within the range - * - * @param Position $position - * @return bool - */ - public function includes(Position $position): bool - { - return $this->start->compare($position) <= 0 && $this->end->compare($position) >= 0; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php deleted file mode 100644 index 195f096f..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php +++ /dev/null @@ -1,18 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ReferenceContext.php b/vendor/felixfbecker/language-server-protocol/src/ReferenceContext.php deleted file mode 100644 index fe941aee..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ReferenceContext.php +++ /dev/null @@ -1,19 +0,0 @@ -includeDeclaration = $includeDeclaration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ReferenceInformation.php b/vendor/felixfbecker/language-server-protocol/src/ReferenceInformation.php deleted file mode 100644 index 03a3be1d..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ReferenceInformation.php +++ /dev/null @@ -1,39 +0,0 @@ -reference = $reference; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->symbol = $symbol; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php deleted file mode 100644 index e3c16435..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php +++ /dev/null @@ -1,33 +0,0 @@ -engine = $engine; - $this->version = $version; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php deleted file mode 100644 index faaf258d..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php +++ /dev/null @@ -1,68 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->prepareSupport = $prepareSupport; - $this->prepareSupportDefaultBehavior = $prepareSupportDefaultBehavior; - $this->honorsChangeAnnotations = $honorsChangeAnnotations; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ResourceOperationKind.php b/vendor/felixfbecker/language-server-protocol/src/ResourceOperationKind.php deleted file mode 100644 index 7bc9ca90..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ResourceOperationKind.php +++ /dev/null @@ -1,24 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php deleted file mode 100644 index a254dbd7..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php +++ /dev/null @@ -1,133 +0,0 @@ -requests = $requests; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->tokenTypes = $tokenTypes; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->tokenModifiers = $tokenModifiers; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->formats = $formats; - $this->dynamicRegistration = $dynamicRegistration; - $this->overlappingTokenSupport = $overlappingTokenSupport; - $this->multilineTokenSupport = $multilineTokenSupport; - $this->serverCancelSupport = $serverCancelSupport; - $this->augmentsSyntaxTokens = $augmentsSyntaxTokens; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php b/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php deleted file mode 100644 index 62d2bfd6..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php +++ /dev/null @@ -1,31 +0,0 @@ -range = $range; - $this->full = $full; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php deleted file mode 100644 index ae1c0ed3..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php +++ /dev/null @@ -1,24 +0,0 @@ -refreshSupport = $refreshSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ServerCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/ServerCapabilities.php deleted file mode 100644 index 3604321f..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ServerCapabilities.php +++ /dev/null @@ -1,157 +0,0 @@ -support = $support; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php deleted file mode 100644 index b19bd870..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php +++ /dev/null @@ -1,20 +0,0 @@ -messageActionItem = $messageActionItem; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php b/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php deleted file mode 100644 index 4303f18b..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php +++ /dev/null @@ -1,22 +0,0 @@ -additionalPropertiesSupport = $additionalPropertiesSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureHelp.php b/vendor/felixfbecker/language-server-protocol/src/SignatureHelp.php deleted file mode 100644 index c5b853eb..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SignatureHelp.php +++ /dev/null @@ -1,61 +0,0 @@ -signatures = $signatures; - $this->activeSignature = $activeSignature; - $this->activeParameter = $activeParameter; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php deleted file mode 100644 index 58b48052..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php +++ /dev/null @@ -1,43 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->signatureInformation = $signatureInformation; - $this->contextSupport = $contextSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php deleted file mode 100644 index a333846b..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php +++ /dev/null @@ -1,50 +0,0 @@ -documentationFormat = $documentationFormat; - $this->parameterInformation = $parameterInformation; - $this->activeParameterSupport = $activeParameterSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php deleted file mode 100644 index 72c7d004..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php +++ /dev/null @@ -1,24 +0,0 @@ -labelOffsetSupport = $labelOffsetSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php b/vendor/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php deleted file mode 100644 index 04222ed4..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php +++ /dev/null @@ -1,24 +0,0 @@ -triggerCharacters = $triggerCharacters; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SignatureInformation.php b/vendor/felixfbecker/language-server-protocol/src/SignatureInformation.php deleted file mode 100644 index c7329feb..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SignatureInformation.php +++ /dev/null @@ -1,66 +0,0 @@ -label = $label; - $this->parameters = $parameters; - $this->documentation = $documentation; - $this->activeParameter = $activeParameter; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SymbolDescriptor.php b/vendor/felixfbecker/language-server-protocol/src/SymbolDescriptor.php deleted file mode 100644 index 2bcd4a41..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SymbolDescriptor.php +++ /dev/null @@ -1,36 +0,0 @@ -fqsen = $fqsen; - $this->package = $package; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SymbolInformation.php b/vendor/felixfbecker/language-server-protocol/src/SymbolInformation.php deleted file mode 100644 index 26688f97..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SymbolInformation.php +++ /dev/null @@ -1,55 +0,0 @@ -name = $name; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->kind = $kind; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->location = $location; - $this->containerName = $containerName; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SymbolKind.php b/vendor/felixfbecker/language-server-protocol/src/SymbolKind.php deleted file mode 100644 index b59eecae..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SymbolKind.php +++ /dev/null @@ -1,28 +0,0 @@ -symbol = $symbol; - $this->location = $location; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/SymbolTag.php b/vendor/felixfbecker/language-server-protocol/src/SymbolTag.php deleted file mode 100644 index 6eed0476..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/SymbolTag.php +++ /dev/null @@ -1,16 +0,0 @@ -synchronization = $synchronization; - $this->completion = $completion; - $this->hover = $hover; - $this->signatureHelp = $signatureHelp; - $this->declaration = $declaration; - $this->definition = $definition; - $this->typeDefinition = $typeDefinition; - $this->implementation = $implementation; - $this->references = $references; - $this->documentHighlight = $documentHighlight; - $this->documentSymbol = $documentSymbol; - $this->codeAction = $codeAction; - $this->codeLens = $codeLens; - $this->documentLink = $documentLink; - $this->colorProvider = $colorProvider; - $this->formatting = $formatting; - $this->rangeFormatting = $rangeFormatting; - $this->onTypeFormatting = $onTypeFormatting; - $this->rename = $rename; - $this->publishDiagnostics = $publishDiagnostics; - $this->foldingRange = $foldingRange; - $this->selectionRange = $selectionRange; - $this->linkedEditingRange = $linkedEditingRange; - $this->callHierarchy = $callHierarchy; - $this->semanticTokens = $semanticTokens; - $this->moniker = $moniker; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php b/vendor/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php deleted file mode 100644 index 77589fca..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php +++ /dev/null @@ -1,39 +0,0 @@ -range = $range; - $this->rangeLength = $rangeLength; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->text = $text; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php b/vendor/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php deleted file mode 100644 index fe9eaddc..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php +++ /dev/null @@ -1,22 +0,0 @@ -uri = $uri; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/TextDocumentItem.php b/vendor/felixfbecker/language-server-protocol/src/TextDocumentItem.php deleted file mode 100644 index cb9fd651..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/TextDocumentItem.php +++ /dev/null @@ -1,50 +0,0 @@ -uri = $uri; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->languageId = $languageId; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->version = $version; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->text = $text; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php deleted file mode 100644 index 6bb119c7..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php +++ /dev/null @@ -1,49 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->willSave = $willSave; - $this->willSaveWaitUntil = $willSaveWaitUntil; - $this->didSave = $didSave; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php b/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php deleted file mode 100644 index 0adf6345..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php +++ /dev/null @@ -1,25 +0,0 @@ -range = $range; - $this->newText = $newText; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/TokenFormat.php b/vendor/felixfbecker/language-server-protocol/src/TokenFormat.php deleted file mode 100644 index 73eff909..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/TokenFormat.php +++ /dev/null @@ -1,8 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->linkSupport = $linkSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php b/vendor/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php deleted file mode 100644 index 6232713f..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php +++ /dev/null @@ -1,19 +0,0 @@ -version = $version; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceEdit.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceEdit.php deleted file mode 100644 index eaa71950..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/WorkspaceEdit.php +++ /dev/null @@ -1,78 +0,0 @@ - - */ - public $changes; - - /** - * Depending on the client capability - * `workspace.workspaceEdit.resourceOperations` document changes are either - * an array of `TextDocumentEdit`s to express changes to n different text - * documents where each text document edit addresses a specific version of - * a text document. Or it can contain above `TextDocumentEdit`s mixed with - * create, rename and delete file / folder operations. - * - * Whether a client supports versioned document edits is expressed via - * `workspace.workspaceEdit.documentChanges` client capability. - * - * If a client neither supports `documentChanges` nor - * `workspace.workspaceEdit.resourceOperations` then only plain `TextEdit`s - * using the `changes` property are supported. - * - * @var mixed - */ - public $documentChanges; - - /** - * A map of change annotations that can be referenced in - * `AnnotatedTextEdit`s or create, rename and delete file / folder - * operations. - * - * Whether clients honor this property depends on the client capability - * `workspace.changeAnnotationSupport`. - * - * @since 3.16.0 - * - * @var array|null - */ - public $changeAnnotations; - - /** - * @param array $changes - * @param mixed $documentChanges - * @param array|null $changeAnnotations - */ - public function __construct( - array $changes = [], - $documentChanges = null, - array $changeAnnotations = null - ) { - $this->changes = $changes; - $this->documentChanges = $documentChanges; - $this->changeAnnotations = $changeAnnotations; - } - - /** - * This is needed because VSCode Does not like nulls - * meaning if a null is sent then this will not compute - * - * @return mixed - */ - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - return array_filter(get_object_vars($this)); - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php deleted file mode 100644 index 31e21c62..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php +++ /dev/null @@ -1,80 +0,0 @@ -documentChanges = $documentChanges; - $this->resourceOperations = $resourceOperations; - $this->failureHandling = $failureHandling; - $this->normalizesLineEndings = $normalizesLineEndings; - $this->changeAnnotationSupport = $changeAnnotationSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php deleted file mode 100644 index 8f62d562..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php +++ /dev/null @@ -1,21 +0,0 @@ -groupsOnLabel = $groupsOnLabel; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceFolder.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceFolder.php deleted file mode 100644 index 764e0c28..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/WorkspaceFolder.php +++ /dev/null @@ -1,31 +0,0 @@ -uri = $uri; - /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ - $this->name = $name; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php deleted file mode 100644 index 57550c1b..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php +++ /dev/null @@ -1,55 +0,0 @@ -dynamicRegistration = $dynamicRegistration; - $this->symbolKind = $symbolKind; - $this->tagSupport = $tagSupport; - $this->resolveSupport = $resolveSupport; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php deleted file mode 100644 index b5450396..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php +++ /dev/null @@ -1,24 +0,0 @@ -properties = $properties; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php deleted file mode 100644 index 7796d062..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php +++ /dev/null @@ -1,30 +0,0 @@ -valueSet = $valueSet; - } -} diff --git a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php b/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php deleted file mode 100644 index 1e21a84d..00000000 --- a/vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php +++ /dev/null @@ -1,30 +0,0 @@ -valueSet = $valueSet; - } -} diff --git a/vendor/netresearch/jsonmapper/LICENSE b/vendor/netresearch/jsonmapper/LICENSE deleted file mode 100644 index 2ebd4813..00000000 --- a/vendor/netresearch/jsonmapper/LICENSE +++ /dev/null @@ -1,47 +0,0 @@ -Open Software License v. 3.0 (OSL-3.0) - -This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: - - Licensed under the Open Software License version 3.0 - -1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: - - a) to reproduce the Original Work in copies, either alone or as part of a collective work; - - b) to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; - - c) to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License; - - d) to perform the Original Work publicly; and - - e) to display the Original Work publicly. - -2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. - -3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. - -4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor’s trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. - -5) External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). - -6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. - -7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. - -8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. - -9) Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including “fair use” or “fair dealing”). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). - -10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. - -11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. - -12) Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. - -13) Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. - -14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. - -16) Modification of This License. This License is Copyright (c) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under " or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. \ No newline at end of file diff --git a/vendor/netresearch/jsonmapper/composer.json b/vendor/netresearch/jsonmapper/composer.json deleted file mode 100644 index 0c5c699e..00000000 --- a/vendor/netresearch/jsonmapper/composer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "netresearch/jsonmapper", - "description": "Map nested JSON structures onto PHP classes", - "license": "OSL-3.0", - "autoload": { - "psr-0": {"JsonMapper": "src/"} - }, - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues" - }, - "require":{ - "php": ">=7.1", - "ext-spl": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", - "squizlabs/php_codesniffer": "~3.5" - } -} diff --git a/vendor/netresearch/jsonmapper/contributing.rst b/vendor/netresearch/jsonmapper/contributing.rst deleted file mode 100644 index 1e40f12c..00000000 --- a/vendor/netresearch/jsonmapper/contributing.rst +++ /dev/null @@ -1,13 +0,0 @@ -************************************** -How to add your features to JsonMapper -************************************** - -If you want to add a new feature or a fix to this library, please consider these aspects: - -- Respect the original code style and continue using it - it uses `PEAR Coding Standards`__. -- Pull requests fixing a bug should include a test case that illustrates the wrong behaviour. -- Pull requests adding a new feature should also include a test for the new feature. - - __ http://pear.php.net/manual/en/standards.php - -Having test cases included in your pull request greatly helps reviewing it and will increase the chance of it being merged. diff --git a/vendor/netresearch/jsonmapper/phpunit.xml b/vendor/netresearch/jsonmapper/phpunit.xml deleted file mode 100644 index c99d7bfd..00000000 --- a/vendor/netresearch/jsonmapper/phpunit.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - tests - - - - - src/ - - - diff --git a/vendor/netresearch/jsonmapper/src/JsonMapper.php b/vendor/netresearch/jsonmapper/src/JsonMapper.php deleted file mode 100644 index ace12bd4..00000000 --- a/vendor/netresearch/jsonmapper/src/JsonMapper.php +++ /dev/null @@ -1,850 +0,0 @@ - - * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 - * @link http://cweiske.de/ - */ - -/** - * Automatically map JSON structures into objects. - * - * @category Netresearch - * @package JsonMapper - * @author Christian Weiske - * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 - * @link http://cweiske.de/ - */ -class JsonMapper -{ - /** - * PSR-3 compatible logger object - * - * @link http://www.php-fig.org/psr/psr-3/ - * @var object - * @see setLogger() - */ - protected $logger; - - /** - * Throw an exception when JSON data contain a property - * that is not defined in the PHP class - * - * @var boolean - */ - public $bExceptionOnUndefinedProperty = false; - - /** - * Throw an exception if the JSON data miss a property - * that is marked with @required in the PHP class - * - * @var boolean - */ - public $bExceptionOnMissingData = false; - - /** - * If the types of map() parameters shall be checked. - * - * You have to disable it if you're using the json_decode "assoc" parameter. - * - * json_decode($str, false) - * - * @var boolean - */ - public $bEnforceMapType = true; - - /** - * Throw an exception when an object is expected but the JSON contains - * a non-object type. - * - * @var boolean - */ - public $bStrictObjectTypeChecking = false; - - /** - * Throw an exception, if null value is found - * but the type of attribute does not allow nulls. - * - * @var bool - */ - public $bStrictNullTypes = true; - - /** - * Allow mapping of private and proteted properties. - * - * @var boolean - */ - public $bIgnoreVisibility = false; - - /** - * Remove attributes that were not passed in JSON, - * to avoid confusion between them and NULL values. - * - * @var boolean - */ - public $bRemoveUndefinedAttributes = false; - - /** - * Override class names that JsonMapper uses to create objects. - * Useful when your setter methods accept abstract classes or interfaces. - * - * @var array - */ - public $classMap = array(); - - /** - * Callback used when an undefined property is found. - * - * Works only when $bExceptionOnUndefinedProperty is disabled. - * - * Parameters to this function are: - * 1. Object that is being filled - * 2. Name of the unknown JSON property - * 3. JSON value of the property - * - * @var callable - */ - public $undefinedPropertyHandler = null; - - /** - * Runtime cache for inspected classes. This is particularly effective if - * mapArray() is called with a large number of objects - * - * @var array property inspection result cache - */ - protected $arInspectedClasses = array(); - - /** - * Method to call on each object after deserialization is done. - * - * Is only called if it exists on the object. - * - * @var string|null - */ - public $postMappingMethod = null; - - /** - * Map data all data in $json into the given $object instance. - * - * @param object|array $json JSON object structure from json_decode() - * @param object $object Object to map $json data into - * - * @return mixed Mapped object is returned. - * @see mapArray() - */ - public function map($json, $object) - { - if ($this->bEnforceMapType && !is_object($json)) { - throw new InvalidArgumentException( - 'JsonMapper::map() requires first argument to be an object' - . ', ' . gettype($json) . ' given.' - ); - } - if (!is_object($object)) { - throw new InvalidArgumentException( - 'JsonMapper::map() requires second argument to be an object' - . ', ' . gettype($object) . ' given.' - ); - } - - $strClassName = get_class($object); - $rc = new ReflectionClass($object); - $strNs = $rc->getNamespaceName(); - $providedProperties = array(); - foreach ($json as $key => $jvalue) { - $key = $this->getSafeName($key); - $providedProperties[$key] = true; - - // Store the property inspection results so we don't have to do it - // again for subsequent objects of the same type - if (!isset($this->arInspectedClasses[$strClassName][$key])) { - $this->arInspectedClasses[$strClassName][$key] - = $this->inspectProperty($rc, $key); - } - - list($hasProperty, $accessor, $type, $isNullable) - = $this->arInspectedClasses[$strClassName][$key]; - - if (!$hasProperty) { - if ($this->bExceptionOnUndefinedProperty) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" does not exist' - . ' in object of type ' . $strClassName - ); - } else if ($this->undefinedPropertyHandler !== null) { - call_user_func( - $this->undefinedPropertyHandler, - $object, $key, $jvalue - ); - } else { - $this->log( - 'info', - 'Property {property} does not exist in {class}', - array('property' => $key, 'class' => $strClassName) - ); - } - continue; - } - - if ($accessor === null) { - if ($this->bExceptionOnUndefinedProperty) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" has no public setter method' - . ' in object of type ' . $strClassName - ); - } - $this->log( - 'info', - 'Property {property} has no public setter method in {class}', - array('property' => $key, 'class' => $strClassName) - ); - continue; - } - - if ($isNullable || !$this->bStrictNullTypes) { - if ($jvalue === null) { - $this->setProperty($object, $accessor, null); - continue; - } - $type = $this->removeNullable($type); - } else if ($jvalue === null) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" in class "' - . $strClassName . '" must not be NULL' - ); - } - - $type = $this->getFullNamespace($type, $strNs); - $type = $this->getMappedType($type, $jvalue); - - if ($type === null || $type === 'mixed') { - //no given type - simply set the json data - $this->setProperty($object, $accessor, $jvalue); - continue; - } else if ($this->isObjectOfSameType($type, $jvalue)) { - $this->setProperty($object, $accessor, $jvalue); - continue; - } else if ($this->isSimpleType($type)) { - if ($type === 'string' && is_object($jvalue)) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" in class "' - . $strClassName . '" is an object and' - . ' cannot be converted to a string' - ); - } - settype($jvalue, $type); - $this->setProperty($object, $accessor, $jvalue); - continue; - } - - //FIXME: check if type exists, give detailed error message if not - if ($type === '') { - throw new JsonMapper_Exception( - 'Empty type at property "' - . $strClassName . '::$' . $key . '"' - ); - } - - $array = null; - $subtype = null; - if ($this->isArrayOfType($type)) { - //array - $array = array(); - $subtype = substr($type, 0, -2); - } else if (substr($type, -1) == ']') { - list($proptype, $subtype) = explode('[', substr($type, 0, -1)); - if ($proptype == 'array') { - $array = array(); - } else { - $array = $this->createInstance($proptype, false, $jvalue); - } - } else { - if (is_a($type, 'ArrayObject', true)) { - $array = $this->createInstance($type, false, $jvalue); - } - } - - if ($array !== null) { - if (!is_array($jvalue) && $this->isFlatType(gettype($jvalue))) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" must be an array, ' - . gettype($jvalue) . ' given' - ); - } - - $cleanSubtype = $this->removeNullable($subtype); - $subtype = $this->getFullNamespace($cleanSubtype, $strNs); - $child = $this->mapArray($jvalue, $array, $subtype, $key); - } else if ($this->isFlatType(gettype($jvalue))) { - //use constructor parameter if we have a class - // but only a flat type (i.e. string, int) - if ($this->bStrictObjectTypeChecking) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" must be an object, ' - . gettype($jvalue) . ' given' - ); - } - $child = $this->createInstance($type, true, $jvalue); - } else { - $child = $this->createInstance($type, false, $jvalue); - $this->map($jvalue, $child); - } - $this->setProperty($object, $accessor, $child); - } - - if ($this->bExceptionOnMissingData) { - $this->checkMissingData($providedProperties, $rc); - } - - if ($this->bRemoveUndefinedAttributes) { - $this->removeUndefinedAttributes($object, $providedProperties); - } - - if ($this->postMappingMethod !== null - && $rc->hasMethod($this->postMappingMethod) - ) { - $refDeserializePostMethod = $rc->getMethod( - $this->postMappingMethod - ); - $refDeserializePostMethod->setAccessible(true); - $refDeserializePostMethod->invoke($object); - } - - return $object; - } - - /** - * Convert a type name to a fully namespaced type name. - * - * @param string $type Type name (simple type or class name) - * @param string $strNs Base namespace that gets prepended to the type name - * - * @return string Fully-qualified type name with namespace - */ - protected function getFullNamespace($type, $strNs) - { - if ($type === null || $type === '' || $type[0] === '\\' || $strNs === '') { - return $type; - } - list($first) = explode('[', $type, 2); - if ($first === 'mixed' || $this->isSimpleType($first)) { - return $type; - } - - //create a full qualified namespace - return '\\' . $strNs . '\\' . $type; - } - - /** - * Check required properties exist in json - * - * @param array $providedProperties array with json properties - * @param object $rc Reflection class to check - * - * @throws JsonMapper_Exception - * - * @return void - */ - protected function checkMissingData($providedProperties, ReflectionClass $rc) - { - foreach ($rc->getProperties() as $property) { - $rprop = $rc->getProperty($property->name); - $docblock = $rprop->getDocComment(); - $annotations = static::parseAnnotations($docblock); - if (isset($annotations['required']) - && !isset($providedProperties[$property->name]) - ) { - throw new JsonMapper_Exception( - 'Required property "' . $property->name . '" of class ' - . $rc->getName() - . ' is missing in JSON data' - ); - } - } - } - - /** - * Remove attributes from object that were not passed in JSON data. - * - * This is to avoid confusion between those that were actually passed - * as NULL, and those that weren't provided at all. - * - * @param object $object Object to remove properties from - * @param array $providedProperties Array with JSON properties - * - * @return void - */ - protected function removeUndefinedAttributes($object, $providedProperties) - { - foreach (get_object_vars($object) as $propertyName => $dummy) { - if (!isset($providedProperties[$propertyName])) { - unset($object->{$propertyName}); - } - } - } - - /** - * Map an array - * - * @param array $json JSON array structure from json_decode() - * @param mixed $array Array or ArrayObject that gets filled with - * data from $json - * @param string $class Class name for children objects. - * All children will get mapped onto this type. - * Supports class names and simple types - * like "string" and nullability "string|null". - * Pass "null" to not convert any values - * @param string $parent_key Defines the key this array belongs to - * in order to aid debugging. - * - * @return mixed Mapped $array is returned - */ - public function mapArray($json, $array, $class = null, $parent_key = '') - { - $originalClass = $class; - foreach ($json as $key => $jvalue) { - $class = $this->getMappedType($originalClass, $jvalue); - if ($class === null) { - $array[$key] = $jvalue; - } else if ($this->isArrayOfType($class)) { - $array[$key] = $this->mapArray( - $jvalue, - array(), - substr($class, 0, -2) - ); - } else if ($this->isFlatType(gettype($jvalue))) { - //use constructor parameter if we have a class - // but only a flat type (i.e. string, int) - if ($jvalue === null) { - $array[$key] = null; - } else { - if ($this->isSimpleType($class)) { - settype($jvalue, $class); - $array[$key] = $jvalue; - } else { - $array[$key] = $this->createInstance( - $class, true, $jvalue - ); - } - } - } else if ($this->isFlatType($class)) { - throw new JsonMapper_Exception( - 'JSON property "' . ($parent_key ? $parent_key : '?') . '"' - . ' is an array of type "' . $class . '"' - . ' but contained a value of type' - . ' "' . gettype($jvalue) . '"' - ); - } else if (is_a($class, 'ArrayObject', true)) { - $array[$key] = $this->mapArray( - $jvalue, - $this->createInstance($class) - ); - } else { - $array[$key] = $this->map( - $jvalue, $this->createInstance($class, false, $jvalue) - ); - } - } - return $array; - } - - /** - * Try to find out if a property exists in a given class. - * Checks property first, falls back to setter method. - * - * @param ReflectionClass $rc Reflection class to check - * @param string $name Property name - * - * @return array First value: if the property exists - * Second value: the accessor to use ( - * ReflectionMethod or ReflectionProperty, or null) - * Third value: type of the property - * Fourth value: if the property is nullable - */ - protected function inspectProperty(ReflectionClass $rc, $name) - { - //try setter method first - $setter = 'set' . $this->getCamelCaseName($name); - - if ($rc->hasMethod($setter)) { - $rmeth = $rc->getMethod($setter); - if ($rmeth->isPublic() || $this->bIgnoreVisibility) { - $isNullable = false; - $rparams = $rmeth->getParameters(); - if (count($rparams) > 0) { - $isNullable = $rparams[0]->allowsNull(); - $ptype = $rparams[0]->getType(); - if ($ptype !== null) { - if ($ptype instanceof ReflectionNamedType) { - $typeName = $ptype->getName(); - } - if ($ptype instanceof ReflectionUnionType - || !$ptype->isBuiltin() - ) { - $typeName = '\\' . $typeName; - } - //allow overriding an "array" type hint - // with a more specific class in the docblock - if ($typeName !== 'array') { - return array( - true, $rmeth, - $typeName, - $isNullable, - ); - } - } - } - - $docblock = $rmeth->getDocComment(); - $annotations = static::parseAnnotations($docblock); - - if (!isset($annotations['param'][0])) { - return array(true, $rmeth, null, $isNullable); - } - list($type) = explode(' ', trim($annotations['param'][0])); - return array(true, $rmeth, $type, $this->isNullable($type)); - } - } - - //now try to set the property directly - //we have to look it up in the class hierarchy - $class = $rc; - $rprop = null; - do { - if ($class->hasProperty($name)) { - $rprop = $class->getProperty($name); - } - } while ($rprop === null && $class = $class->getParentClass()); - - if ($rprop === null) { - //case-insensitive property matching - foreach ($rc->getProperties() as $p) { - if ((strcasecmp($p->name, $name) === 0)) { - $rprop = $p; - break; - } - } - } - if ($rprop !== null) { - if ($rprop->isPublic() || $this->bIgnoreVisibility) { - $docblock = $rprop->getDocComment(); - $annotations = static::parseAnnotations($docblock); - - if (!isset($annotations['var'][0])) { - // If there is no annotations (higher priority) inspect - // if there's a scalar type being defined - if (PHP_VERSION_ID >= 70400 && $rprop->hasType()) { - $rPropType = $rprop->getType(); - $propTypeName = $rPropType->getName(); - - if ($this->isSimpleType($propTypeName)) { - return array( - true, - $rprop, - $propTypeName, - $rPropType->allowsNull() - ); - } - - return array( - true, - $rprop, - '\\'.$propTypeName, - $rPropType->allowsNull() - ); - } - - return array(true, $rprop, null, false); - } - - //support "@var type description" - list($type) = explode(' ', $annotations['var'][0]); - - return array(true, $rprop, $type, $this->isNullable($type)); - } else { - //no setter, private property - return array(true, null, null, false); - } - } - - //no setter, no property - return array(false, null, null, false); - } - - /** - * Removes - and _ and makes the next letter uppercase - * - * @param string $name Property name - * - * @return string CamelCasedVariableName - */ - protected function getCamelCaseName($name) - { - return str_replace( - ' ', '', ucwords(str_replace(array('_', '-'), ' ', $name)) - ); - } - - /** - * Since hyphens cannot be used in variables we have to uppercase them. - * - * Technically you may use them, but they are awkward to access. - * - * @param string $name Property name - * - * @return string Name without hyphen - */ - protected function getSafeName($name) - { - if (strpos($name, '-') !== false) { - $name = $this->getCamelCaseName($name); - } - - return $name; - } - - /** - * Set a property on a given object to a given value. - * - * Checks if the setter or the property are public are made before - * calling this method. - * - * @param object $object Object to set property on - * @param object $accessor ReflectionMethod or ReflectionProperty - * @param mixed $value Value of property - * - * @return void - */ - protected function setProperty( - $object, $accessor, $value - ) { - if (!$accessor->isPublic() && $this->bIgnoreVisibility) { - $accessor->setAccessible(true); - } - if ($accessor instanceof ReflectionProperty) { - $accessor->setValue($object, $value); - } else { - //setter method - $accessor->invoke($object, $value); - } - } - - /** - * Create a new object of the given type. - * - * This method exists to be overwritten in child classes, - * so you can do dependency injection or so. - * - * @param string $class Class name to instantiate - * @param boolean $useParameter Pass $parameter to the constructor or not - * @param mixed $jvalue Constructor parameter (the json value) - * - * @return object Freshly created object - */ - protected function createInstance( - $class, $useParameter = false, $jvalue = null - ) { - if ($useParameter) { - return new $class($jvalue); - } else { - $reflectClass = new ReflectionClass($class); - $constructor = $reflectClass->getConstructor(); - if (null === $constructor - || $constructor->getNumberOfRequiredParameters() > 0 - ) { - return $reflectClass->newInstanceWithoutConstructor(); - } - return $reflectClass->newInstance(); - } - } - - /** - * Get the mapped class/type name for this class. - * Returns the incoming classname if not mapped. - * - * @param string $type Type name to map - * @param mixed $jvalue Constructor parameter (the json value) - * - * @return string The mapped type/class name - */ - protected function getMappedType($type, $jvalue = null) - { - if (isset($this->classMap[$type])) { - $target = $this->classMap[$type]; - } else if (is_string($type) && $type !== '' && $type[0] == '\\' - && isset($this->classMap[substr($type, 1)]) - ) { - $target = $this->classMap[substr($type, 1)]; - } else { - $target = null; - } - - if ($target) { - if (is_callable($target)) { - $type = $target($type, $jvalue); - } else { - $type = $target; - } - } - return $type; - } - - /** - * Checks if the given type is a "simple type" - * - * @param string $type type name from gettype() - * - * @return boolean True if it is a simple PHP type - * - * @see isFlatType() - */ - protected function isSimpleType($type) - { - return $type == 'string' - || $type == 'boolean' || $type == 'bool' - || $type == 'integer' || $type == 'int' - || $type == 'double' || $type == 'float' - || $type == 'array' || $type == 'object'; - } - - /** - * Checks if the object is of this type or has this type as one of its parents - * - * @param string $type class name of type being required - * @param mixed $value Some PHP value to be tested - * - * @return boolean True if $object has type of $type - */ - protected function isObjectOfSameType($type, $value) - { - if (false === is_object($value)) { - return false; - } - - return is_a($value, $type); - } - - /** - * Checks if the given type is a type that is not nested - * (simple type except array and object) - * - * @param string $type type name from gettype() - * - * @return boolean True if it is a non-nested PHP type - * - * @see isSimpleType() - */ - protected function isFlatType($type) - { - return $type == 'NULL' - || $type == 'string' - || $type == 'boolean' || $type == 'bool' - || $type == 'integer' || $type == 'int' - || $type == 'double' || $type == 'float'; - } - - /** - * Returns true if type is an array of elements - * (bracket notation) - * - * @param string $strType type to be matched - * - * @return bool - */ - protected function isArrayOfType($strType) - { - return substr($strType, -2) === '[]'; - } - - /** - * Checks if the given type is nullable - * - * @param string $type type name from the phpdoc param - * - * @return boolean True if it is nullable - */ - protected function isNullable($type) - { - return stripos('|' . $type . '|', '|null|') !== false; - } - - /** - * Remove the 'null' section of a type - * - * @param string $type type name from the phpdoc param - * - * @return string The new type value - */ - protected function removeNullable($type) - { - if ($type === null) { - return null; - } - return substr( - str_ireplace('|null|', '|', '|' . $type . '|'), - 1, -1 - ); - } - - /** - * Copied from PHPUnit 3.7.29, Util/Test.php - * - * @param string $docblock Full method docblock - * - * @return array Array of arrays. - * Key is the "@"-name like "param", - * each value is an array of the rest of the @-lines - */ - protected static function parseAnnotations($docblock) - { - $annotations = array(); - // Strip away the docblock header and footer - // to ease parsing of one line annotations - $docblock = substr($docblock, 3, -2); - - $re = '/@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?$/m'; - if (preg_match_all($re, $docblock, $matches)) { - $numMatches = count($matches[0]); - - for ($i = 0; $i < $numMatches; ++$i) { - $annotations[$matches['name'][$i]][] = $matches['value'][$i]; - } - } - - return $annotations; - } - - /** - * Log a message to the $logger object - * - * @param string $level Logging level - * @param string $message Text to log - * @param array $context Additional information - * - * @return null - */ - protected function log($level, $message, array $context = array()) - { - if ($this->logger) { - $this->logger->log($level, $message, $context); - } - } - - /** - * Sets a logger instance on the object - * - * @param LoggerInterface $logger PSR-3 compatible logger object - * - * @return null - */ - public function setLogger($logger) - { - $this->logger = $logger; - } -} -?> diff --git a/vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php b/vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php deleted file mode 100644 index bb8040c6..00000000 --- a/vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 - * @link http://cweiske.de/ - */ - -/** - * Simple exception - * - * @category Netresearch - * @package JsonMapper - * @author Christian Weiske - * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 - * @link http://cweiske.de/ - */ -class JsonMapper_Exception extends Exception -{ -} -?> diff --git a/vendor/nikic/php-parser/LICENSE b/vendor/nikic/php-parser/LICENSE deleted file mode 100644 index 2e567183..00000000 --- a/vendor/nikic/php-parser/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2011, Nikita Popov -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/nikic/php-parser/README.md b/vendor/nikic/php-parser/README.md deleted file mode 100644 index 708cdfcb..00000000 --- a/vendor/nikic/php-parser/README.md +++ /dev/null @@ -1,225 +0,0 @@ -PHP Parser -========== - -[![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master) - -This is a PHP 5.2 to PHP 8.1 parser written in PHP. Its purpose is to simplify static code analysis and -manipulation. - -[**Documentation for version 4.x**][doc_master] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.1). - -[Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2). - -Features --------- - -The main features provided by this library are: - - * Parsing PHP 5, PHP 7, and PHP 8 code into an abstract syntax tree (AST). - * Invalid code can be parsed into a partial AST. - * The AST contains accurate location information. - * Dumping the AST in human-readable form. - * Converting an AST back to PHP code. - * Experimental: Formatting can be preserved for partially changed ASTs. - * Infrastructure to traverse and modify ASTs. - * Resolution of namespaced names. - * Evaluation of constant expressions. - * Builders to simplify AST construction for code generation. - * Converting an AST into JSON and back. - -Quick Start ------------ - -Install the library using [composer](https://getcomposer.org): - - php composer.phar require nikic/php-parser - -Parse some PHP code into an AST and dump the result in human-readable form: - -```php -create(ParserFactory::PREFER_PHP7); -try { - $ast = $parser->parse($code); -} catch (Error $error) { - echo "Parse error: {$error->getMessage()}\n"; - return; -} - -$dumper = new NodeDumper; -echo $dumper->dump($ast) . "\n"; -``` - -This dumps an AST looking something like this: - -``` -array( - 0: Stmt_Function( - byRef: false - name: Identifier( - name: test - ) - params: array( - 0: Param( - type: null - byRef: false - variadic: false - var: Expr_Variable( - name: foo - ) - default: null - ) - ) - returnType: null - stmts: array( - 0: Stmt_Expression( - expr: Expr_FuncCall( - name: Name( - parts: array( - 0: var_dump - ) - ) - args: array( - 0: Arg( - value: Expr_Variable( - name: foo - ) - byRef: false - unpack: false - ) - ) - ) - ) - ) - ) -) -``` - -Let's traverse the AST and perform some kind of modification. For example, drop all function bodies: - -```php -use PhpParser\Node; -use PhpParser\Node\Stmt\Function_; -use PhpParser\NodeTraverser; -use PhpParser\NodeVisitorAbstract; - -$traverser = new NodeTraverser(); -$traverser->addVisitor(new class extends NodeVisitorAbstract { - public function enterNode(Node $node) { - if ($node instanceof Function_) { - // Clean out the function body - $node->stmts = []; - } - } -}); - -$ast = $traverser->traverse($ast); -echo $dumper->dump($ast) . "\n"; -``` - -This gives us an AST where the `Function_::$stmts` are empty: - -``` -array( - 0: Stmt_Function( - byRef: false - name: Identifier( - name: test - ) - params: array( - 0: Param( - type: null - byRef: false - variadic: false - var: Expr_Variable( - name: foo - ) - default: null - ) - ) - returnType: null - stmts: array( - ) - ) -) -``` - -Finally, we can convert the new AST back to PHP code: - -```php -use PhpParser\PrettyPrinter; - -$prettyPrinter = new PrettyPrinter\Standard; -echo $prettyPrinter->prettyPrintFile($ast); -``` - -This gives us our original code, minus the `var_dump()` call inside the function: - -```php - [ - 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments' -]]); -$parser = (new PhpParser\ParserFactory)->create( - PhpParser\ParserFactory::PREFER_PHP7, - $lexer -); -$dumper = new PhpParser\NodeDumper([ - 'dumpComments' => true, - 'dumpPositions' => $attributes['with-positions'], -]); -$prettyPrinter = new PhpParser\PrettyPrinter\Standard; - -$traverser = new PhpParser\NodeTraverser(); -$traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver); - -foreach ($files as $file) { - if (strpos($file, ' Code $code\n"); - } else { - if (!file_exists($file)) { - fwrite(STDERR, "File $file does not exist.\n"); - exit(1); - } - - $code = file_get_contents($file); - fwrite(STDERR, "====> File $file:\n"); - } - - if ($attributes['with-recovery']) { - $errorHandler = new PhpParser\ErrorHandler\Collecting; - $stmts = $parser->parse($code, $errorHandler); - foreach ($errorHandler->getErrors() as $error) { - $message = formatErrorMessage($error, $code, $attributes['with-column-info']); - fwrite(STDERR, $message . "\n"); - } - if (null === $stmts) { - continue; - } - } else { - try { - $stmts = $parser->parse($code); - } catch (PhpParser\Error $error) { - $message = formatErrorMessage($error, $code, $attributes['with-column-info']); - fwrite(STDERR, $message . "\n"); - exit(1); - } - } - - foreach ($operations as $operation) { - if ('dump' === $operation) { - fwrite(STDERR, "==> Node dump:\n"); - echo $dumper->dump($stmts, $code), "\n"; - } elseif ('pretty-print' === $operation) { - fwrite(STDERR, "==> Pretty print:\n"); - echo $prettyPrinter->prettyPrintFile($stmts), "\n"; - } elseif ('json-dump' === $operation) { - fwrite(STDERR, "==> JSON dump:\n"); - echo json_encode($stmts, JSON_PRETTY_PRINT), "\n"; - } elseif ('var-dump' === $operation) { - fwrite(STDERR, "==> var_dump():\n"); - var_dump($stmts); - } elseif ('resolve-names' === $operation) { - fwrite(STDERR, "==> Resolved names.\n"); - $stmts = $traverser->traverse($stmts); - } - } -} - -function formatErrorMessage(PhpParser\Error $e, $code, $withColumnInfo) { - if ($withColumnInfo && $e->hasColumnInfo()) { - return $e->getMessageWithColumnInfo($code); - } else { - return $e->getMessage(); - } -} - -function showHelp($error = '') { - if ($error) { - fwrite(STDERR, $error . "\n\n"); - } - fwrite($error ? STDERR : STDOUT, << false, - 'with-positions' => false, - 'with-recovery' => false, - ]; - - array_shift($args); - $parseOptions = true; - foreach ($args as $arg) { - if (!$parseOptions) { - $files[] = $arg; - continue; - } - - switch ($arg) { - case '--dump': - case '-d': - $operations[] = 'dump'; - break; - case '--pretty-print': - case '-p': - $operations[] = 'pretty-print'; - break; - case '--json-dump': - case '-j': - $operations[] = 'json-dump'; - break; - case '--var-dump': - $operations[] = 'var-dump'; - break; - case '--resolve-names': - case '-N'; - $operations[] = 'resolve-names'; - break; - case '--with-column-info': - case '-c'; - $attributes['with-column-info'] = true; - break; - case '--with-positions': - case '-P': - $attributes['with-positions'] = true; - break; - case '--with-recovery': - case '-r': - $attributes['with-recovery'] = true; - break; - case '--help': - case '-h'; - showHelp(); - break; - case '--': - $parseOptions = false; - break; - default: - if ($arg[0] === '-') { - showHelp("Invalid operation $arg."); - } else { - $files[] = $arg; - } - } - } - - return [$operations, $files, $attributes]; -} diff --git a/vendor/nikic/php-parser/composer.json b/vendor/nikic/php-parser/composer.json deleted file mode 100644 index 2fd064a2..00000000 --- a/vendor/nikic/php-parser/composer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "nikic/php-parser", - "type": "library", - "description": "A PHP parser written in PHP", - "keywords": [ - "php", - "parser" - ], - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Nikita Popov" - } - ], - "require": { - "php": ">=7.0", - "ext-tokenizer": "*" - }, - "require-dev": { - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0", - "ircmaxell/php-yacc": "^0.0.7" - }, - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "autoload-dev": { - "psr-4": { - "PhpParser\\": "test/PhpParser/" - } - }, - "bin": [ - "bin/php-parse" - ] -} diff --git a/vendor/nikic/php-parser/grammar/README.md b/vendor/nikic/php-parser/grammar/README.md deleted file mode 100644 index 4bae11d8..00000000 --- a/vendor/nikic/php-parser/grammar/README.md +++ /dev/null @@ -1,30 +0,0 @@ -What do all those files mean? -============================= - - * `php5.y`: PHP 5 grammar written in a pseudo language - * `php7.y`: PHP 7 grammar written in a pseudo language - * `tokens.y`: Tokens definition shared between PHP 5 and PHP 7 grammars - * `parser.template`: A `kmyacc` parser prototype file for PHP - * `tokens.template`: A `kmyacc` prototype file for the `Tokens` class - * `rebuildParsers.php`: Preprocesses the grammar and builds the parser using `kmyacc` - -.phpy pseudo language -===================== - -The `.y` file is a normal grammar in `kmyacc` (`yacc`) style, with some transformations -applied to it: - - * Nodes are created using the syntax `Name[..., ...]`. This is transformed into - `new Name(..., ..., attributes())` - * Some function-like constructs are resolved (see `rebuildParsers.php` for a list) - -Building the parser -=================== - -Run `php grammar/rebuildParsers.php` to rebuild the parsers. Additional options: - - * The `KMYACC` environment variable can be used to specify an alternative `kmyacc` binary. - By default the `phpyacc` dev dependency will be used. To use the original `kmyacc`, you - need to compile [moriyoshi's fork](https://github.com/moriyoshi/kmyacc-forked). - * The `--debug` option enables emission of debug symbols and creates the `y.output` file. - * The `--keep-tmp-grammar` option preserves the preprocessed grammar file. diff --git a/vendor/nikic/php-parser/grammar/parser.template b/vendor/nikic/php-parser/grammar/parser.template deleted file mode 100644 index 6166607c..00000000 --- a/vendor/nikic/php-parser/grammar/parser.template +++ /dev/null @@ -1,106 +0,0 @@ -semValue -#semval($,%t) $this->semValue -#semval(%n) $stackPos-(%l-%n) -#semval(%n,%t) $stackPos-(%l-%n) - -namespace PhpParser\Parser; - -use PhpParser\Error; -use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\Name; -use PhpParser\Node\Scalar; -use PhpParser\Node\Stmt; -#include; - -/* This is an automatically GENERATED file, which should not be manually edited. - * Instead edit one of the following: - * * the grammar files grammar/php5.y or grammar/php7.y - * * the skeleton file grammar/parser.template - * * the preprocessing script grammar/rebuildParsers.php - */ -class #(-p) extends \PhpParser\ParserAbstract -{ - protected $tokenToSymbolMapSize = #(YYMAXLEX); - protected $actionTableSize = #(YYLAST); - protected $gotoTableSize = #(YYGLAST); - - protected $invalidSymbol = #(YYBADCH); - protected $errorSymbol = #(YYINTERRTOK); - protected $defaultAction = #(YYDEFAULT); - protected $unexpectedTokenRule = #(YYUNEXPECTED); - - protected $YY2TBLSTATE = #(YY2TBLSTATE); - protected $numNonLeafStates = #(YYNLSTATES); - - protected $symbolToName = array( - #listvar terminals - ); - - protected $tokenToSymbol = array( - #listvar yytranslate - ); - - protected $action = array( - #listvar yyaction - ); - - protected $actionCheck = array( - #listvar yycheck - ); - - protected $actionBase = array( - #listvar yybase - ); - - protected $actionDefault = array( - #listvar yydefault - ); - - protected $goto = array( - #listvar yygoto - ); - - protected $gotoCheck = array( - #listvar yygcheck - ); - - protected $gotoBase = array( - #listvar yygbase - ); - - protected $gotoDefault = array( - #listvar yygdefault - ); - - protected $ruleToNonTerminal = array( - #listvar yylhs - ); - - protected $ruleToLength = array( - #listvar yylen - ); -#if -t - - protected $productions = array( - #production-strings; - ); -#endif - - protected function initReduceCallbacks() { - $this->reduceCallbacks = [ -#reduce - %n => function ($stackPos) { - %b - }, -#noact - %n => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, -#endreduce - ]; - } -} -#tailcode; diff --git a/vendor/nikic/php-parser/grammar/php5.y b/vendor/nikic/php-parser/grammar/php5.y deleted file mode 100644 index a62e9a31..00000000 --- a/vendor/nikic/php-parser/grammar/php5.y +++ /dev/null @@ -1,1036 +0,0 @@ -%pure_parser -%expect 6 - -%tokens - -%% - -start: - top_statement_list { $$ = $this->handleNamespaces($1); } -; - -top_statement_list_ex: - top_statement_list_ex top_statement { pushNormalizing($1, $2); } - | /* empty */ { init(); } -; - -top_statement_list: - top_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -ampersand: - T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG - | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG -; - -reserved_non_modifiers: - T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND - | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE - | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH - | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO - | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT - | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS - | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN - | T_MATCH -; - -semi_reserved: - reserved_non_modifiers - | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC -; - -identifier_ex: - T_STRING { $$ = Node\Identifier[$1]; } - | semi_reserved { $$ = Node\Identifier[$1]; } -; - -identifier: - T_STRING { $$ = Node\Identifier[$1]; } -; - -reserved_non_modifiers_identifier: - reserved_non_modifiers { $$ = Node\Identifier[$1]; } -; - -namespace_name: - T_STRING { $$ = Name[$1]; } - | T_NAME_QUALIFIED { $$ = Name[$1]; } -; - -legacy_namespace_name: - namespace_name { $$ = $1; } - | T_NAME_FULLY_QUALIFIED { $$ = Name[substr($1, 1)]; } -; - -plain_variable: - T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; } -; - -top_statement: - statement { $$ = $1; } - | function_declaration_statement { $$ = $1; } - | class_declaration_statement { $$ = $1; } - | T_HALT_COMPILER - { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; } - | T_NAMESPACE namespace_name ';' - { $$ = Stmt\Namespace_[$2, null]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($$); } - | T_NAMESPACE namespace_name '{' top_statement_list '}' - { $$ = Stmt\Namespace_[$2, $4]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($$); } - | T_NAMESPACE '{' top_statement_list '}' - { $$ = Stmt\Namespace_[null, $3]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($$); } - | T_USE use_declarations ';' { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; } - | T_USE use_type use_declarations ';' { $$ = Stmt\Use_[$3, $2]; } - | group_use_declaration ';' { $$ = $1; } - | T_CONST constant_declaration_list ';' { $$ = Stmt\Const_[$2]; } -; - -use_type: - T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; } - | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; } -; - -group_use_declaration: - T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}' - { $$ = Stmt\GroupUse[$3, $6, $2]; } - | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}' - { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; } -; - -unprefixed_use_declarations: - unprefixed_use_declarations ',' unprefixed_use_declaration - { push($1, $3); } - | unprefixed_use_declaration { init($1); } -; - -use_declarations: - use_declarations ',' use_declaration { push($1, $3); } - | use_declaration { init($1); } -; - -inline_use_declarations: - inline_use_declarations ',' inline_use_declaration { push($1, $3); } - | inline_use_declaration { init($1); } -; - -unprefixed_use_declaration: - namespace_name - { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } - | namespace_name T_AS identifier - { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } -; - -use_declaration: - legacy_namespace_name - { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } - | legacy_namespace_name T_AS identifier - { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } -; - -inline_use_declaration: - unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; } - | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; } -; - -constant_declaration_list: - constant_declaration_list ',' constant_declaration { push($1, $3); } - | constant_declaration { init($1); } -; - -constant_declaration: - identifier '=' static_scalar { $$ = Node\Const_[$1, $3]; } -; - -class_const_list: - class_const_list ',' class_const { push($1, $3); } - | class_const { init($1); } -; - -class_const: - identifier_ex '=' static_scalar { $$ = Node\Const_[$1, $3]; } -; - -inner_statement_list_ex: - inner_statement_list_ex inner_statement { pushNormalizing($1, $2); } - | /* empty */ { init(); } -; - -inner_statement_list: - inner_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -inner_statement: - statement { $$ = $1; } - | function_declaration_statement { $$ = $1; } - | class_declaration_statement { $$ = $1; } - | T_HALT_COMPILER - { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); } -; - -non_empty_statement: - '{' inner_statement_list '}' - { - if ($2) { - $$ = $2; prependLeadingComments($$); - } else { - makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); - if (null === $$) { $$ = array(); } - } - } - | T_IF parentheses_expr statement elseif_list else_single - { $$ = Stmt\If_[$2, ['stmts' => toArray($3), 'elseifs' => $4, 'else' => $5]]; } - | T_IF parentheses_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' - { $$ = Stmt\If_[$2, ['stmts' => $4, 'elseifs' => $5, 'else' => $6]]; } - | T_WHILE parentheses_expr while_statement { $$ = Stmt\While_[$2, $3]; } - | T_DO statement T_WHILE parentheses_expr ';' { $$ = Stmt\Do_ [$4, toArray($2)]; } - | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement - { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; } - | T_SWITCH parentheses_expr switch_case_list { $$ = Stmt\Switch_[$2, $3]; } - | T_BREAK ';' { $$ = Stmt\Break_[null]; } - | T_BREAK expr ';' { $$ = Stmt\Break_[$2]; } - | T_CONTINUE ';' { $$ = Stmt\Continue_[null]; } - | T_CONTINUE expr ';' { $$ = Stmt\Continue_[$2]; } - | T_RETURN ';' { $$ = Stmt\Return_[null]; } - | T_RETURN expr ';' { $$ = Stmt\Return_[$2]; } - | T_GLOBAL global_var_list ';' { $$ = Stmt\Global_[$2]; } - | T_STATIC static_var_list ';' { $$ = Stmt\Static_[$2]; } - | T_ECHO expr_list ';' { $$ = Stmt\Echo_[$2]; } - | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; } - | yield_expr ';' { $$ = Stmt\Expression[$1]; } - | expr ';' { $$ = Stmt\Expression[$1]; } - | T_UNSET '(' variables_list ')' ';' { $$ = Stmt\Unset_[$3]; } - | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement - { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; } - | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement - { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; } - | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; } - | T_TRY '{' inner_statement_list '}' catches optional_finally - { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); } - | T_THROW expr ';' { $$ = Stmt\Throw_[$2]; } - | T_GOTO identifier ';' { $$ = Stmt\Goto_[$2]; } - | identifier ':' { $$ = Stmt\Label[$1]; } - | expr error { $$ = Stmt\Expression[$1]; } - | error { $$ = array(); /* means: no statement */ } -; - -statement: - non_empty_statement { $$ = $1; } - | ';' - { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); - if ($$ === null) $$ = array(); /* means: no statement */ } -; - -catches: - /* empty */ { init(); } - | catches catch { push($1, $2); } -; - -catch: - T_CATCH '(' name plain_variable ')' '{' inner_statement_list '}' - { $$ = Stmt\Catch_[array($3), $4, $7]; } -; - -optional_finally: - /* empty */ { $$ = null; } - | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; } -; - -variables_list: - variable { init($1); } - | variables_list ',' variable { push($1, $3); } -; - -optional_ref: - /* empty */ { $$ = false; } - | ampersand { $$ = true; } -; - -optional_arg_ref: - /* empty */ { $$ = false; } - | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG { $$ = true; } -; - -optional_ellipsis: - /* empty */ { $$ = false; } - | T_ELLIPSIS { $$ = true; } -; - -function_declaration_statement: - T_FUNCTION optional_ref identifier '(' parameter_list ')' optional_return_type '{' inner_statement_list '}' - { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $9]]; } -; - -class_declaration_statement: - class_entry_type identifier extends_from implements_list '{' class_statement_list '}' - { $$ = Stmt\Class_[$2, ['type' => $1, 'extends' => $3, 'implements' => $4, 'stmts' => $6]]; - $this->checkClass($$, #2); } - | T_INTERFACE identifier interface_extends_list '{' class_statement_list '}' - { $$ = Stmt\Interface_[$2, ['extends' => $3, 'stmts' => $5]]; - $this->checkInterface($$, #2); } - | T_TRAIT identifier '{' class_statement_list '}' - { $$ = Stmt\Trait_[$2, ['stmts' => $4]]; } -; - -class_entry_type: - T_CLASS { $$ = 0; } - | T_ABSTRACT T_CLASS { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } - | T_FINAL T_CLASS { $$ = Stmt\Class_::MODIFIER_FINAL; } -; - -extends_from: - /* empty */ { $$ = null; } - | T_EXTENDS class_name { $$ = $2; } -; - -interface_extends_list: - /* empty */ { $$ = array(); } - | T_EXTENDS class_name_list { $$ = $2; } -; - -implements_list: - /* empty */ { $$ = array(); } - | T_IMPLEMENTS class_name_list { $$ = $2; } -; - -class_name_list: - class_name { init($1); } - | class_name_list ',' class_name { push($1, $3); } -; - -for_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } -; - -foreach_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } -; - -declare_statement: - non_empty_statement { $$ = toArray($1); } - | ';' { $$ = null; } - | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } -; - -declare_list: - declare_list_element { init($1); } - | declare_list ',' declare_list_element { push($1, $3); } -; - -declare_list_element: - identifier '=' static_scalar { $$ = Stmt\DeclareDeclare[$1, $3]; } -; - -switch_case_list: - '{' case_list '}' { $$ = $2; } - | '{' ';' case_list '}' { $$ = $3; } - | ':' case_list T_ENDSWITCH ';' { $$ = $2; } - | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } -; - -case_list: - /* empty */ { init(); } - | case_list case { push($1, $2); } -; - -case: - T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; } - | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; } -; - -case_separator: - ':' - | ';' -; - -while_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } -; - -elseif_list: - /* empty */ { init(); } - | elseif_list elseif { push($1, $2); } -; - -elseif: - T_ELSEIF parentheses_expr statement { $$ = Stmt\ElseIf_[$2, toArray($3)]; } -; - -new_elseif_list: - /* empty */ { init(); } - | new_elseif_list new_elseif { push($1, $2); } -; - -new_elseif: - T_ELSEIF parentheses_expr ':' inner_statement_list { $$ = Stmt\ElseIf_[$2, $4]; } -; - -else_single: - /* empty */ { $$ = null; } - | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; } -; - -new_else_single: - /* empty */ { $$ = null; } - | T_ELSE ':' inner_statement_list { $$ = Stmt\Else_[$3]; } -; - -foreach_variable: - variable { $$ = array($1, false); } - | ampersand variable { $$ = array($2, true); } - | list_expr { $$ = array($1, false); } -; - -parameter_list: - non_empty_parameter_list { $$ = $1; } - | /* empty */ { $$ = array(); } -; - -non_empty_parameter_list: - parameter { init($1); } - | non_empty_parameter_list ',' parameter { push($1, $3); } -; - -parameter: - optional_param_type optional_arg_ref optional_ellipsis plain_variable - { $$ = Node\Param[$4, null, $1, $2, $3]; $this->checkParam($$); } - | optional_param_type optional_arg_ref optional_ellipsis plain_variable '=' static_scalar - { $$ = Node\Param[$4, $6, $1, $2, $3]; $this->checkParam($$); } -; - -type: - name { $$ = $1; } - | T_ARRAY { $$ = Node\Identifier['array']; } - | T_CALLABLE { $$ = Node\Identifier['callable']; } -; - -optional_param_type: - /* empty */ { $$ = null; } - | type { $$ = $1; } -; - -optional_return_type: - /* empty */ { $$ = null; } - | ':' type { $$ = $2; } -; - -argument_list: - '(' ')' { $$ = array(); } - | '(' non_empty_argument_list ')' { $$ = $2; } - | '(' yield_expr ')' { $$ = array(Node\Arg[$2, false, false]); } -; - -non_empty_argument_list: - argument { init($1); } - | non_empty_argument_list ',' argument { push($1, $3); } -; - -argument: - expr { $$ = Node\Arg[$1, false, false]; } - | ampersand variable { $$ = Node\Arg[$2, true, false]; } - | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; } -; - -global_var_list: - global_var_list ',' global_var { push($1, $3); } - | global_var { init($1); } -; - -global_var: - plain_variable { $$ = $1; } - | '$' variable { $$ = Expr\Variable[$2]; } - | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } -; - -static_var_list: - static_var_list ',' static_var { push($1, $3); } - | static_var { init($1); } -; - -static_var: - plain_variable { $$ = Stmt\StaticVar[$1, null]; } - | plain_variable '=' static_scalar { $$ = Stmt\StaticVar[$1, $3]; } -; - -class_statement_list_ex: - class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } } - | /* empty */ { init(); } -; - -class_statement_list: - class_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -class_statement: - variable_modifiers property_declaration_list ';' - { $$ = Stmt\Property[$1, $2]; $this->checkProperty($$, #1); } - | T_CONST class_const_list ';' { $$ = Stmt\ClassConst[$2, 0]; } - | method_modifiers T_FUNCTION optional_ref identifier_ex '(' parameter_list ')' optional_return_type method_body - { $$ = Stmt\ClassMethod[$4, ['type' => $1, 'byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9]]; - $this->checkClassMethod($$, #1); } - | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; } -; - -trait_adaptations: - ';' { $$ = array(); } - | '{' trait_adaptation_list '}' { $$ = $2; } -; - -trait_adaptation_list: - /* empty */ { init(); } - | trait_adaptation_list trait_adaptation { push($1, $2); } -; - -trait_adaptation: - trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';' - { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; } - | trait_method_reference T_AS member_modifier identifier_ex ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; } - | trait_method_reference T_AS member_modifier ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; } - | trait_method_reference T_AS identifier ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } - | trait_method_reference T_AS reserved_non_modifiers_identifier ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } -; - -trait_method_reference_fully_qualified: - name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = array($1, $3); } -; -trait_method_reference: - trait_method_reference_fully_qualified { $$ = $1; } - | identifier_ex { $$ = array(null, $1); } -; - -method_body: - ';' /* abstract method */ { $$ = null; } - | '{' inner_statement_list '}' { $$ = $2; } -; - -variable_modifiers: - non_empty_member_modifiers { $$ = $1; } - | T_VAR { $$ = 0; } -; - -method_modifiers: - /* empty */ { $$ = 0; } - | non_empty_member_modifiers { $$ = $1; } -; - -non_empty_member_modifiers: - member_modifier { $$ = $1; } - | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } -; - -member_modifier: - T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } - | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } - | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } - | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; } - | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } - | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } -; - -property_declaration_list: - property_declaration { init($1); } - | property_declaration_list ',' property_declaration { push($1, $3); } -; - -property_decl_name: - T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; } -; - -property_declaration: - property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; } - | property_decl_name '=' static_scalar { $$ = Stmt\PropertyProperty[$1, $3]; } -; - -expr_list: - expr_list ',' expr { push($1, $3); } - | expr { init($1); } -; - -for_expr: - /* empty */ { $$ = array(); } - | expr_list { $$ = $1; } -; - -expr: - variable { $$ = $1; } - | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; } - | variable '=' expr { $$ = Expr\Assign[$1, $3]; } - | variable '=' ampersand variable { $$ = Expr\AssignRef[$1, $4]; } - | variable '=' ampersand new_expr { $$ = Expr\AssignRef[$1, $4]; } - | new_expr { $$ = $1; } - | T_CLONE expr { $$ = Expr\Clone_[$2]; } - | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; } - | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; } - | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; } - | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; } - | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; } - | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; } - | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; } - | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; } - | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; } - | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; } - | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; } - | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; } - | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; } - | variable T_INC { $$ = Expr\PostInc[$1]; } - | T_INC variable { $$ = Expr\PreInc [$2]; } - | variable T_DEC { $$ = Expr\PostDec[$1]; } - | T_DEC variable { $$ = Expr\PreDec [$2]; } - | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } - | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } - | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } - | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } - | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } - | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } - | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } - | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; } - | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; } - | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; } - | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; } - | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; } - | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; } - | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } - | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } - | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; } - | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; } - | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; } - | '!' expr { $$ = Expr\BooleanNot[$2]; } - | '~' expr { $$ = Expr\BitwiseNot[$2]; } - | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; } - | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } - | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; } - | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } - | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; } - | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; } - | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } - | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; } - | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } - | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; } - | parentheses_expr { $$ = $1; } - /* we need a separate '(' new_expr ')' rule to avoid problems caused by a s/r conflict */ - | '(' new_expr ')' { $$ = $2; } - | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; } - | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; } - | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; } - | T_ISSET '(' variables_list ')' { $$ = Expr\Isset_[$3]; } - | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; } - | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; } - | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; } - | T_EVAL parentheses_expr { $$ = Expr\Eval_[$2]; } - | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; } - | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; } - | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; } - | T_DOUBLE_CAST expr - { $attrs = attributes(); - $attrs['kind'] = $this->getFloatCastKind($1); - $$ = new Expr\Cast\Double($2, $attrs); } - | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; } - | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; } - | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; } - | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; } - | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; } - | T_EXIT exit_expr - { $attrs = attributes(); - $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $$ = new Expr\Exit_($2, $attrs); } - | '@' expr { $$ = Expr\ErrorSuppress[$2]; } - | scalar { $$ = $1; } - | array_expr { $$ = $1; } - | scalar_dereference { $$ = $1; } - | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; } - | T_PRINT expr { $$ = Expr\Print_[$2]; } - | T_YIELD { $$ = Expr\Yield_[null, null]; } - | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; } - | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type - '{' inner_statement_list '}' - { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $9]]; } - | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type - '{' inner_statement_list '}' - { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $10]]; } -; - -parentheses_expr: - '(' expr ')' { $$ = $2; } - | '(' yield_expr ')' { $$ = $2; } -; - -yield_expr: - T_YIELD expr { $$ = Expr\Yield_[$2, null]; } - | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; } -; - -array_expr: - T_ARRAY '(' array_pair_list ')' - { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; - $$ = new Expr\Array_($3, $attrs); } - | '[' array_pair_list ']' - { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT; - $$ = new Expr\Array_($2, $attrs); } -; - -scalar_dereference: - array_expr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[Scalar\String_::fromString($1, attributes()), $3]; } - | constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - /* alternative array syntax missing intentionally */ -; - -anonymous_class: - T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' - { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $3, 'implements' => $4, 'stmts' => $6]], $2); - $this->checkClass($$[0], -1); } -; - -new_expr: - T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; } - | T_NEW anonymous_class - { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; } -; - -lexical_vars: - /* empty */ { $$ = array(); } - | T_USE '(' lexical_var_list ')' { $$ = $3; } -; - -lexical_var_list: - lexical_var { init($1); } - | lexical_var_list ',' lexical_var { push($1, $3); } -; - -lexical_var: - optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; } -; - -function_call: - name argument_list { $$ = Expr\FuncCall[$1, $2]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex argument_list - { $$ = Expr\StaticCall[$1, $3, $4]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}' argument_list - { $$ = Expr\StaticCall[$1, $4, $6]; } - | static_property argument_list - { $$ = $this->fixupPhp5StaticPropCall($1, $2, attributes()); } - | variable_without_objects argument_list - { $$ = Expr\FuncCall[$1, $2]; } - | function_call '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - /* alternative array syntax missing intentionally */ -; - -class_name: - T_STATIC { $$ = Name[$1]; } - | name { $$ = $1; } -; - -name: - T_STRING { $$ = Name[$1]; } - | T_NAME_QUALIFIED { $$ = Name[$1]; } - | T_NAME_FULLY_QUALIFIED { $$ = Name\FullyQualified[substr($1, 1)]; } - | T_NAME_RELATIVE { $$ = Name\Relative[substr($1, 10)]; } -; - -class_name_reference: - class_name { $$ = $1; } - | dynamic_class_name_reference { $$ = $1; } -; - -dynamic_class_name_reference: - object_access_for_dcnr { $$ = $1; } - | base_variable { $$ = $1; } -; - -class_name_or_var: - class_name { $$ = $1; } - | reference_variable { $$ = $1; } -; - -object_access_for_dcnr: - base_variable T_OBJECT_OPERATOR object_property - { $$ = Expr\PropertyFetch[$1, $3]; } - | object_access_for_dcnr T_OBJECT_OPERATOR object_property - { $$ = Expr\PropertyFetch[$1, $3]; } - | object_access_for_dcnr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | object_access_for_dcnr '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } -; - -exit_expr: - /* empty */ { $$ = null; } - | '(' ')' { $$ = null; } - | parentheses_expr { $$ = $1; } -; - -backticks_expr: - /* empty */ { $$ = array(); } - | T_ENCAPSED_AND_WHITESPACE - { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`', false)]); } - | encaps_list { parseEncapsed($1, '`', false); $$ = $1; } -; - -ctor_arguments: - /* empty */ { $$ = array(); } - | argument_list { $$ = $1; } -; - -common_scalar: - T_LNUMBER { $$ = $this->parseLNumber($1, attributes(), true); } - | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); } - | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes(), false); } - | T_LINE { $$ = Scalar\MagicConst\Line[]; } - | T_FILE { $$ = Scalar\MagicConst\File[]; } - | T_DIR { $$ = Scalar\MagicConst\Dir[]; } - | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; } - | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; } - | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; } - | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; } - | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; } - | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC - { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), false); } - | T_START_HEREDOC T_END_HEREDOC - { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), false); } -; - -static_scalar: - common_scalar { $$ = $1; } - | class_name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = Expr\ClassConstFetch[$1, $3]; } - | name { $$ = Expr\ConstFetch[$1]; } - | T_ARRAY '(' static_array_pair_list ')' { $$ = Expr\Array_[$3]; } - | '[' static_array_pair_list ']' { $$ = Expr\Array_[$2]; } - | static_operation { $$ = $1; } -; - -static_operation: - static_scalar T_BOOLEAN_OR static_scalar { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } - | static_scalar T_BOOLEAN_AND static_scalar { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } - | static_scalar T_LOGICAL_OR static_scalar { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } - | static_scalar T_LOGICAL_AND static_scalar { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } - | static_scalar T_LOGICAL_XOR static_scalar { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } - | static_scalar '|' static_scalar { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } - | static_scalar T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG static_scalar - { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | static_scalar T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG static_scalar - { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | static_scalar '^' static_scalar { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } - | static_scalar '.' static_scalar { $$ = Expr\BinaryOp\Concat [$1, $3]; } - | static_scalar '+' static_scalar { $$ = Expr\BinaryOp\Plus [$1, $3]; } - | static_scalar '-' static_scalar { $$ = Expr\BinaryOp\Minus [$1, $3]; } - | static_scalar '*' static_scalar { $$ = Expr\BinaryOp\Mul [$1, $3]; } - | static_scalar '/' static_scalar { $$ = Expr\BinaryOp\Div [$1, $3]; } - | static_scalar '%' static_scalar { $$ = Expr\BinaryOp\Mod [$1, $3]; } - | static_scalar T_SL static_scalar { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } - | static_scalar T_SR static_scalar { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } - | static_scalar T_POW static_scalar { $$ = Expr\BinaryOp\Pow [$1, $3]; } - | '+' static_scalar %prec T_INC { $$ = Expr\UnaryPlus [$2]; } - | '-' static_scalar %prec T_INC { $$ = Expr\UnaryMinus[$2]; } - | '!' static_scalar { $$ = Expr\BooleanNot[$2]; } - | '~' static_scalar { $$ = Expr\BitwiseNot[$2]; } - | static_scalar T_IS_IDENTICAL static_scalar { $$ = Expr\BinaryOp\Identical [$1, $3]; } - | static_scalar T_IS_NOT_IDENTICAL static_scalar { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } - | static_scalar T_IS_EQUAL static_scalar { $$ = Expr\BinaryOp\Equal [$1, $3]; } - | static_scalar T_IS_NOT_EQUAL static_scalar { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } - | static_scalar '<' static_scalar { $$ = Expr\BinaryOp\Smaller [$1, $3]; } - | static_scalar T_IS_SMALLER_OR_EQUAL static_scalar { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } - | static_scalar '>' static_scalar { $$ = Expr\BinaryOp\Greater [$1, $3]; } - | static_scalar T_IS_GREATER_OR_EQUAL static_scalar { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } - | static_scalar '?' static_scalar ':' static_scalar { $$ = Expr\Ternary[$1, $3, $5]; } - | static_scalar '?' ':' static_scalar { $$ = Expr\Ternary[$1, null, $4]; } - | static_scalar '[' static_scalar ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | '(' static_scalar ')' { $$ = $2; } -; - -constant: - name { $$ = Expr\ConstFetch[$1]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex - { $$ = Expr\ClassConstFetch[$1, $3]; } -; - -scalar: - common_scalar { $$ = $1; } - | constant { $$ = $1; } - | '"' encaps_list '"' - { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } - | T_START_HEREDOC encaps_list T_END_HEREDOC - { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } -; - -static_array_pair_list: - /* empty */ { $$ = array(); } - | non_empty_static_array_pair_list optional_comma { $$ = $1; } -; - -optional_comma: - /* empty */ - | ',' -; - -non_empty_static_array_pair_list: - non_empty_static_array_pair_list ',' static_array_pair { push($1, $3); } - | static_array_pair { init($1); } -; - -static_array_pair: - static_scalar T_DOUBLE_ARROW static_scalar { $$ = Expr\ArrayItem[$3, $1, false]; } - | static_scalar { $$ = Expr\ArrayItem[$1, null, false]; } -; - -variable: - object_access { $$ = $1; } - | base_variable { $$ = $1; } - | function_call { $$ = $1; } - | new_expr_array_deref { $$ = $1; } -; - -new_expr_array_deref: - '(' new_expr ')' '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$2, $5]; } - | new_expr_array_deref '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - /* alternative array syntax missing intentionally */ -; - -object_access: - variable_or_new_expr T_OBJECT_OPERATOR object_property - { $$ = Expr\PropertyFetch[$1, $3]; } - | variable_or_new_expr T_OBJECT_OPERATOR object_property argument_list - { $$ = Expr\MethodCall[$1, $3, $4]; } - | object_access argument_list { $$ = Expr\FuncCall[$1, $2]; } - | object_access '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | object_access '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } -; - -variable_or_new_expr: - variable { $$ = $1; } - | '(' new_expr ')' { $$ = $2; } -; - -variable_without_objects: - reference_variable { $$ = $1; } - | '$' variable_without_objects { $$ = Expr\Variable[$2]; } -; - -base_variable: - variable_without_objects { $$ = $1; } - | static_property { $$ = $1; } -; - -static_property: - class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' reference_variable - { $$ = Expr\StaticPropertyFetch[$1, $4]; } - | static_property_with_arrays { $$ = $1; } -; - -static_property_simple_name: - T_VARIABLE - { $var = parseVar($1); $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; } -; - -static_property_with_arrays: - class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_property_simple_name - { $$ = Expr\StaticPropertyFetch[$1, $3]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' '{' expr '}' - { $$ = Expr\StaticPropertyFetch[$1, $5]; } - | static_property_with_arrays '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | static_property_with_arrays '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } -; - -reference_variable: - reference_variable '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | reference_variable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | plain_variable { $$ = $1; } - | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } -; - -dim_offset: - /* empty */ { $$ = null; } - | expr { $$ = $1; } -; - -object_property: - identifier { $$ = $1; } - | '{' expr '}' { $$ = $2; } - | variable_without_objects { $$ = $1; } - | error { $$ = Expr\Error[]; $this->errorState = 2; } -; - -list_expr: - T_LIST '(' list_expr_elements ')' { $$ = Expr\List_[$3]; } -; - -list_expr_elements: - list_expr_elements ',' list_expr_element { push($1, $3); } - | list_expr_element { init($1); } -; - -list_expr_element: - variable { $$ = Expr\ArrayItem[$1, null, false]; } - | list_expr { $$ = Expr\ArrayItem[$1, null, false]; } - | /* empty */ { $$ = null; } -; - -array_pair_list: - /* empty */ { $$ = array(); } - | non_empty_array_pair_list optional_comma { $$ = $1; } -; - -non_empty_array_pair_list: - non_empty_array_pair_list ',' array_pair { push($1, $3); } - | array_pair { init($1); } -; - -array_pair: - expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } - | expr { $$ = Expr\ArrayItem[$1, null, false]; } - | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } - | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } - | T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; } -; - -encaps_list: - encaps_list encaps_var { push($1, $2); } - | encaps_list encaps_string_part { push($1, $2); } - | encaps_var { init($1); } - | encaps_string_part encaps_var { init($1, $2); } -; - -encaps_string_part: - T_ENCAPSED_AND_WHITESPACE { $$ = Scalar\EncapsedStringPart[$1]; } -; - -encaps_str_varname: - T_STRING_VARNAME { $$ = Expr\Variable[$1]; } -; - -encaps_var: - plain_variable { $$ = $1; } - | plain_variable '[' encaps_var_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | plain_variable T_OBJECT_OPERATOR identifier { $$ = Expr\PropertyFetch[$1, $3]; } - | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = Expr\Variable[$2]; } - | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = Expr\Variable[$2]; } - | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}' - { $$ = Expr\ArrayDimFetch[$2, $4]; } - | T_CURLY_OPEN variable '}' { $$ = $2; } -; - -encaps_var_offset: - T_STRING { $$ = Scalar\String_[$1]; } - | T_NUM_STRING { $$ = $this->parseNumString($1, attributes()); } - | plain_variable { $$ = $1; } -; - -%% diff --git a/vendor/nikic/php-parser/grammar/php7.y b/vendor/nikic/php-parser/grammar/php7.y deleted file mode 100644 index 087bc739..00000000 --- a/vendor/nikic/php-parser/grammar/php7.y +++ /dev/null @@ -1,1204 +0,0 @@ -%pure_parser -%expect 2 - -%tokens - -%% - -start: - top_statement_list { $$ = $this->handleNamespaces($1); } -; - -top_statement_list_ex: - top_statement_list_ex top_statement { pushNormalizing($1, $2); } - | /* empty */ { init(); } -; - -top_statement_list: - top_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -ampersand: - T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG - | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG -; - -reserved_non_modifiers: - T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND - | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE - | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH - | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO - | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT - | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS - | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN - | T_MATCH | T_ENUM -; - -semi_reserved: - reserved_non_modifiers - | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC | T_READONLY -; - -identifier_maybe_reserved: - T_STRING { $$ = Node\Identifier[$1]; } - | semi_reserved { $$ = Node\Identifier[$1]; } -; - -identifier_not_reserved: - T_STRING { $$ = Node\Identifier[$1]; } -; - -reserved_non_modifiers_identifier: - reserved_non_modifiers { $$ = Node\Identifier[$1]; } -; - -namespace_declaration_name: - T_STRING { $$ = Name[$1]; } - | semi_reserved { $$ = Name[$1]; } - | T_NAME_QUALIFIED { $$ = Name[$1]; } -; - -namespace_name: - T_STRING { $$ = Name[$1]; } - | T_NAME_QUALIFIED { $$ = Name[$1]; } -; - -legacy_namespace_name: - namespace_name { $$ = $1; } - | T_NAME_FULLY_QUALIFIED { $$ = Name[substr($1, 1)]; } -; - -plain_variable: - T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; } -; - -semi: - ';' { /* nothing */ } - | error { /* nothing */ } -; - -no_comma: - /* empty */ { /* nothing */ } - | ',' { $this->emitError(new Error('A trailing comma is not allowed here', attributes())); } -; - -optional_comma: - /* empty */ - | ',' -; - -attribute_decl: - class_name { $$ = Node\Attribute[$1, []]; } - | class_name argument_list { $$ = Node\Attribute[$1, $2]; } -; - -attribute_group: - attribute_decl { init($1); } - | attribute_group ',' attribute_decl { push($1, $3); } -; - -attribute: - T_ATTRIBUTE attribute_group optional_comma ']' { $$ = Node\AttributeGroup[$2]; } -; - -attributes: - attribute { init($1); } - | attributes attribute { push($1, $2); } -; - -optional_attributes: - /* empty */ { $$ = []; } - | attributes { $$ = $1; } -; - -top_statement: - statement { $$ = $1; } - | function_declaration_statement { $$ = $1; } - | class_declaration_statement { $$ = $1; } - | T_HALT_COMPILER - { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; } - | T_NAMESPACE namespace_declaration_name semi - { $$ = Stmt\Namespace_[$2, null]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($$); } - | T_NAMESPACE namespace_declaration_name '{' top_statement_list '}' - { $$ = Stmt\Namespace_[$2, $4]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($$); } - | T_NAMESPACE '{' top_statement_list '}' - { $$ = Stmt\Namespace_[null, $3]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($$); } - | T_USE use_declarations semi { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; } - | T_USE use_type use_declarations semi { $$ = Stmt\Use_[$3, $2]; } - | group_use_declaration semi { $$ = $1; } - | T_CONST constant_declaration_list semi { $$ = Stmt\Const_[$2]; } -; - -use_type: - T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; } - | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; } -; - -group_use_declaration: - T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}' - { $$ = Stmt\GroupUse[$3, $6, $2]; } - | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}' - { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; } -; - -unprefixed_use_declarations: - non_empty_unprefixed_use_declarations optional_comma { $$ = $1; } -; - -non_empty_unprefixed_use_declarations: - non_empty_unprefixed_use_declarations ',' unprefixed_use_declaration - { push($1, $3); } - | unprefixed_use_declaration { init($1); } -; - -use_declarations: - non_empty_use_declarations no_comma { $$ = $1; } -; - -non_empty_use_declarations: - non_empty_use_declarations ',' use_declaration { push($1, $3); } - | use_declaration { init($1); } -; - -inline_use_declarations: - non_empty_inline_use_declarations optional_comma { $$ = $1; } -; - -non_empty_inline_use_declarations: - non_empty_inline_use_declarations ',' inline_use_declaration - { push($1, $3); } - | inline_use_declaration { init($1); } -; - -unprefixed_use_declaration: - namespace_name - { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } - | namespace_name T_AS identifier_not_reserved - { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } -; - -use_declaration: - legacy_namespace_name - { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } - | legacy_namespace_name T_AS identifier_not_reserved - { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } -; - -inline_use_declaration: - unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; } - | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; } -; - -constant_declaration_list: - non_empty_constant_declaration_list no_comma { $$ = $1; } -; - -non_empty_constant_declaration_list: - non_empty_constant_declaration_list ',' constant_declaration - { push($1, $3); } - | constant_declaration { init($1); } -; - -constant_declaration: - identifier_not_reserved '=' expr { $$ = Node\Const_[$1, $3]; } -; - -class_const_list: - non_empty_class_const_list no_comma { $$ = $1; } -; - -non_empty_class_const_list: - non_empty_class_const_list ',' class_const { push($1, $3); } - | class_const { init($1); } -; - -class_const: - identifier_maybe_reserved '=' expr { $$ = Node\Const_[$1, $3]; } -; - -inner_statement_list_ex: - inner_statement_list_ex inner_statement { pushNormalizing($1, $2); } - | /* empty */ { init(); } -; - -inner_statement_list: - inner_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -inner_statement: - statement { $$ = $1; } - | function_declaration_statement { $$ = $1; } - | class_declaration_statement { $$ = $1; } - | T_HALT_COMPILER - { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); } -; - -non_empty_statement: - '{' inner_statement_list '}' - { - if ($2) { - $$ = $2; prependLeadingComments($$); - } else { - makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); - if (null === $$) { $$ = array(); } - } - } - | T_IF '(' expr ')' statement elseif_list else_single - { $$ = Stmt\If_[$3, ['stmts' => toArray($5), 'elseifs' => $6, 'else' => $7]]; } - | T_IF '(' expr ')' ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' - { $$ = Stmt\If_[$3, ['stmts' => $6, 'elseifs' => $7, 'else' => $8]]; } - | T_WHILE '(' expr ')' while_statement { $$ = Stmt\While_[$3, $5]; } - | T_DO statement T_WHILE '(' expr ')' ';' { $$ = Stmt\Do_ [$5, toArray($2)]; } - | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement - { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; } - | T_SWITCH '(' expr ')' switch_case_list { $$ = Stmt\Switch_[$3, $5]; } - | T_BREAK optional_expr semi { $$ = Stmt\Break_[$2]; } - | T_CONTINUE optional_expr semi { $$ = Stmt\Continue_[$2]; } - | T_RETURN optional_expr semi { $$ = Stmt\Return_[$2]; } - | T_GLOBAL global_var_list semi { $$ = Stmt\Global_[$2]; } - | T_STATIC static_var_list semi { $$ = Stmt\Static_[$2]; } - | T_ECHO expr_list_forbid_comma semi { $$ = Stmt\Echo_[$2]; } - | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; } - | expr semi { - $e = $1; - if ($e instanceof Expr\Throw_) { - // For backwards-compatibility reasons, convert throw in statement position into - // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). - $$ = Stmt\Throw_[$e->expr]; - } else { - $$ = Stmt\Expression[$e]; - } - } - | T_UNSET '(' variables_list ')' semi { $$ = Stmt\Unset_[$3]; } - | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement - { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; } - | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement - { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; } - | T_FOREACH '(' expr error ')' foreach_statement - { $$ = Stmt\Foreach_[$3, new Expr\Error(stackAttributes(#4)), ['stmts' => $6]]; } - | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; } - | T_TRY '{' inner_statement_list '}' catches optional_finally - { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); } - | T_GOTO identifier_not_reserved semi { $$ = Stmt\Goto_[$2]; } - | identifier_not_reserved ':' { $$ = Stmt\Label[$1]; } - | error { $$ = array(); /* means: no statement */ } -; - -statement: - non_empty_statement { $$ = $1; } - | ';' - { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); - if ($$ === null) $$ = array(); /* means: no statement */ } -; - -catches: - /* empty */ { init(); } - | catches catch { push($1, $2); } -; - -name_union: - name { init($1); } - | name_union '|' name { push($1, $3); } -; - -catch: - T_CATCH '(' name_union optional_plain_variable ')' '{' inner_statement_list '}' - { $$ = Stmt\Catch_[$3, $4, $7]; } -; - -optional_finally: - /* empty */ { $$ = null; } - | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; } -; - -variables_list: - non_empty_variables_list optional_comma { $$ = $1; } -; - -non_empty_variables_list: - variable { init($1); } - | non_empty_variables_list ',' variable { push($1, $3); } -; - -optional_ref: - /* empty */ { $$ = false; } - | ampersand { $$ = true; } -; - -optional_arg_ref: - /* empty */ { $$ = false; } - | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG { $$ = true; } -; - -optional_ellipsis: - /* empty */ { $$ = false; } - | T_ELLIPSIS { $$ = true; } -; - -block_or_error: - '{' inner_statement_list '}' { $$ = $2; } - | error { $$ = []; } -; - -function_declaration_statement: - T_FUNCTION optional_ref identifier_not_reserved '(' parameter_list ')' optional_return_type block_or_error - { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; } - | attributes T_FUNCTION optional_ref identifier_not_reserved '(' parameter_list ')' optional_return_type block_or_error - { $$ = Stmt\Function_[$4, ['byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; } -; - -class_declaration_statement: - optional_attributes class_entry_type identifier_not_reserved extends_from implements_list '{' class_statement_list '}' - { $$ = Stmt\Class_[$3, ['type' => $2, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]]; - $this->checkClass($$, #3); } - | optional_attributes T_INTERFACE identifier_not_reserved interface_extends_list '{' class_statement_list '}' - { $$ = Stmt\Interface_[$3, ['extends' => $4, 'stmts' => $6, 'attrGroups' => $1]]; - $this->checkInterface($$, #3); } - | optional_attributes T_TRAIT identifier_not_reserved '{' class_statement_list '}' - { $$ = Stmt\Trait_[$3, ['stmts' => $5, 'attrGroups' => $1]]; } - | optional_attributes T_ENUM identifier_not_reserved enum_scalar_type implements_list '{' class_statement_list '}' - { $$ = Stmt\Enum_[$3, ['scalarType' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]]; - $this->checkEnum($$, #3); } -; - -enum_scalar_type: - /* empty */ { $$ = null; } - | ':' type { $$ = $2; } - -enum_case_expr: - /* empty */ { $$ = null; } - | '=' expr { $$ = $2; } -; - -class_entry_type: - T_CLASS { $$ = 0; } - | class_modifiers T_CLASS { $$ = $1; } -; - -class_modifiers: - class_modifier { $$ = $1; } - | class_modifiers class_modifier { $this->checkClassModifier($1, $2, #2); $$ = $1 | $2; } -; - -class_modifier: - T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } - | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } - | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } -; - -extends_from: - /* empty */ { $$ = null; } - | T_EXTENDS class_name { $$ = $2; } -; - -interface_extends_list: - /* empty */ { $$ = array(); } - | T_EXTENDS class_name_list { $$ = $2; } -; - -implements_list: - /* empty */ { $$ = array(); } - | T_IMPLEMENTS class_name_list { $$ = $2; } -; - -class_name_list: - non_empty_class_name_list no_comma { $$ = $1; } -; - -non_empty_class_name_list: - class_name { init($1); } - | non_empty_class_name_list ',' class_name { push($1, $3); } -; - -for_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } -; - -foreach_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } -; - -declare_statement: - non_empty_statement { $$ = toArray($1); } - | ';' { $$ = null; } - | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } -; - -declare_list: - non_empty_declare_list no_comma { $$ = $1; } -; - -non_empty_declare_list: - declare_list_element { init($1); } - | non_empty_declare_list ',' declare_list_element { push($1, $3); } -; - -declare_list_element: - identifier_not_reserved '=' expr { $$ = Stmt\DeclareDeclare[$1, $3]; } -; - -switch_case_list: - '{' case_list '}' { $$ = $2; } - | '{' ';' case_list '}' { $$ = $3; } - | ':' case_list T_ENDSWITCH ';' { $$ = $2; } - | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } -; - -case_list: - /* empty */ { init(); } - | case_list case { push($1, $2); } -; - -case: - T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; } - | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; } -; - -case_separator: - ':' - | ';' -; - -match: - T_MATCH '(' expr ')' '{' match_arm_list '}' { $$ = Expr\Match_[$3, $6]; } -; - -match_arm_list: - /* empty */ { $$ = []; } - | non_empty_match_arm_list optional_comma { $$ = $1; } -; - -non_empty_match_arm_list: - match_arm { init($1); } - | non_empty_match_arm_list ',' match_arm { push($1, $3); } -; - -match_arm: - expr_list_allow_comma T_DOUBLE_ARROW expr { $$ = Node\MatchArm[$1, $3]; } - | T_DEFAULT optional_comma T_DOUBLE_ARROW expr { $$ = Node\MatchArm[null, $4]; } -; - -while_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } -; - -elseif_list: - /* empty */ { init(); } - | elseif_list elseif { push($1, $2); } -; - -elseif: - T_ELSEIF '(' expr ')' statement { $$ = Stmt\ElseIf_[$3, toArray($5)]; } -; - -new_elseif_list: - /* empty */ { init(); } - | new_elseif_list new_elseif { push($1, $2); } -; - -new_elseif: - T_ELSEIF '(' expr ')' ':' inner_statement_list { $$ = Stmt\ElseIf_[$3, $6]; } -; - -else_single: - /* empty */ { $$ = null; } - | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; } -; - -new_else_single: - /* empty */ { $$ = null; } - | T_ELSE ':' inner_statement_list { $$ = Stmt\Else_[$3]; } -; - -foreach_variable: - variable { $$ = array($1, false); } - | ampersand variable { $$ = array($2, true); } - | list_expr { $$ = array($1, false); } - | array_short_syntax { $$ = array($1, false); } -; - -parameter_list: - non_empty_parameter_list optional_comma { $$ = $1; } - | /* empty */ { $$ = array(); } -; - -non_empty_parameter_list: - parameter { init($1); } - | non_empty_parameter_list ',' parameter { push($1, $3); } -; - -optional_property_modifiers: - /* empty */ { $$ = 0; } - | optional_property_modifiers property_modifier - { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } -; - -property_modifier: - T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } - | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } - | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } - | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } -; - -parameter: - optional_attributes optional_property_modifiers optional_type_without_static - optional_arg_ref optional_ellipsis plain_variable - { $$ = new Node\Param($6, null, $3, $4, $5, attributes(), $2, $1); - $this->checkParam($$); } - | optional_attributes optional_property_modifiers optional_type_without_static - optional_arg_ref optional_ellipsis plain_variable '=' expr - { $$ = new Node\Param($6, $8, $3, $4, $5, attributes(), $2, $1); - $this->checkParam($$); } - | optional_attributes optional_property_modifiers optional_type_without_static - optional_arg_ref optional_ellipsis error - { $$ = new Node\Param(Expr\Error[], null, $3, $4, $5, attributes(), $2, $1); } -; - -type_expr: - type { $$ = $1; } - | '?' type { $$ = Node\NullableType[$2]; } - | union_type { $$ = Node\UnionType[$1]; } - | intersection_type { $$ = Node\IntersectionType[$1]; } -; - -type: - type_without_static { $$ = $1; } - | T_STATIC { $$ = Node\Name['static']; } -; - -type_without_static: - name { $$ = $this->handleBuiltinTypes($1); } - | T_ARRAY { $$ = Node\Identifier['array']; } - | T_CALLABLE { $$ = Node\Identifier['callable']; } -; - -union_type: - type '|' type { init($1, $3); } - | union_type '|' type { push($1, $3); } -; - -union_type_without_static: - type_without_static '|' type_without_static { init($1, $3); } - | union_type_without_static '|' type_without_static { push($1, $3); } -; - -intersection_type: - type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type { init($1, $3); } - | intersection_type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type - { push($1, $3); } -; - -intersection_type_without_static: - type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static - { init($1, $3); } - | intersection_type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static - { push($1, $3); } -; - -type_expr_without_static: - type_without_static { $$ = $1; } - | '?' type_without_static { $$ = Node\NullableType[$2]; } - | union_type_without_static { $$ = Node\UnionType[$1]; } - | intersection_type_without_static { $$ = Node\IntersectionType[$1]; } -; - -optional_type_without_static: - /* empty */ { $$ = null; } - | type_expr_without_static { $$ = $1; } -; - -optional_return_type: - /* empty */ { $$ = null; } - | ':' type_expr { $$ = $2; } - | ':' error { $$ = null; } -; - -argument_list: - '(' ')' { $$ = array(); } - | '(' non_empty_argument_list optional_comma ')' { $$ = $2; } - | '(' variadic_placeholder ')' { init($2); } -; - -variadic_placeholder: - T_ELLIPSIS { $$ = Node\VariadicPlaceholder[]; } -; - -non_empty_argument_list: - argument { init($1); } - | non_empty_argument_list ',' argument { push($1, $3); } -; - -argument: - expr { $$ = Node\Arg[$1, false, false]; } - | ampersand variable { $$ = Node\Arg[$2, true, false]; } - | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; } - | identifier_maybe_reserved ':' expr - { $$ = new Node\Arg($3, false, false, attributes(), $1); } -; - -global_var_list: - non_empty_global_var_list no_comma { $$ = $1; } -; - -non_empty_global_var_list: - non_empty_global_var_list ',' global_var { push($1, $3); } - | global_var { init($1); } -; - -global_var: - simple_variable { $$ = $1; } -; - -static_var_list: - non_empty_static_var_list no_comma { $$ = $1; } -; - -non_empty_static_var_list: - non_empty_static_var_list ',' static_var { push($1, $3); } - | static_var { init($1); } -; - -static_var: - plain_variable { $$ = Stmt\StaticVar[$1, null]; } - | plain_variable '=' expr { $$ = Stmt\StaticVar[$1, $3]; } -; - -class_statement_list_ex: - class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } } - | /* empty */ { init(); } -; - -class_statement_list: - class_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -class_statement: - optional_attributes variable_modifiers optional_type_without_static property_declaration_list semi - { $$ = new Stmt\Property($2, $4, attributes(), $3, $1); - $this->checkProperty($$, #2); } - | optional_attributes method_modifiers T_CONST class_const_list semi - { $$ = new Stmt\ClassConst($4, $2, attributes(), $1); - $this->checkClassConst($$, #2); } - | optional_attributes method_modifiers T_FUNCTION optional_ref identifier_maybe_reserved '(' parameter_list ')' - optional_return_type method_body - { $$ = Stmt\ClassMethod[$5, ['type' => $2, 'byRef' => $4, 'params' => $7, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; - $this->checkClassMethod($$, #2); } - | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; } - | optional_attributes T_CASE identifier_maybe_reserved enum_case_expr semi - { $$ = Stmt\EnumCase[$3, $4, $1]; } - | error { $$ = null; /* will be skipped */ } -; - -trait_adaptations: - ';' { $$ = array(); } - | '{' trait_adaptation_list '}' { $$ = $2; } -; - -trait_adaptation_list: - /* empty */ { init(); } - | trait_adaptation_list trait_adaptation { push($1, $2); } -; - -trait_adaptation: - trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';' - { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; } - | trait_method_reference T_AS member_modifier identifier_maybe_reserved ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; } - | trait_method_reference T_AS member_modifier ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; } - | trait_method_reference T_AS identifier_not_reserved ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } - | trait_method_reference T_AS reserved_non_modifiers_identifier ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } -; - -trait_method_reference_fully_qualified: - name T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved { $$ = array($1, $3); } -; -trait_method_reference: - trait_method_reference_fully_qualified { $$ = $1; } - | identifier_maybe_reserved { $$ = array(null, $1); } -; - -method_body: - ';' /* abstract method */ { $$ = null; } - | block_or_error { $$ = $1; } -; - -variable_modifiers: - non_empty_member_modifiers { $$ = $1; } - | T_VAR { $$ = 0; } -; - -method_modifiers: - /* empty */ { $$ = 0; } - | non_empty_member_modifiers { $$ = $1; } -; - -non_empty_member_modifiers: - member_modifier { $$ = $1; } - | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } -; - -member_modifier: - T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } - | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } - | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } - | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; } - | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } - | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } - | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } -; - -property_declaration_list: - non_empty_property_declaration_list no_comma { $$ = $1; } -; - -non_empty_property_declaration_list: - property_declaration { init($1); } - | non_empty_property_declaration_list ',' property_declaration - { push($1, $3); } -; - -property_decl_name: - T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; } -; - -property_declaration: - property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; } - | property_decl_name '=' expr { $$ = Stmt\PropertyProperty[$1, $3]; } -; - -expr_list_forbid_comma: - non_empty_expr_list no_comma { $$ = $1; } -; - -expr_list_allow_comma: - non_empty_expr_list optional_comma { $$ = $1; } -; - -non_empty_expr_list: - non_empty_expr_list ',' expr { push($1, $3); } - | expr { init($1); } -; - -for_expr: - /* empty */ { $$ = array(); } - | expr_list_forbid_comma { $$ = $1; } -; - -expr: - variable { $$ = $1; } - | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; } - | array_short_syntax '=' expr { $$ = Expr\Assign[$1, $3]; } - | variable '=' expr { $$ = Expr\Assign[$1, $3]; } - | variable '=' ampersand variable { $$ = Expr\AssignRef[$1, $4]; } - | new_expr { $$ = $1; } - | match { $$ = $1; } - | T_CLONE expr { $$ = Expr\Clone_[$2]; } - | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; } - | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; } - | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; } - | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; } - | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; } - | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; } - | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; } - | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; } - | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; } - | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; } - | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; } - | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; } - | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; } - | variable T_INC { $$ = Expr\PostInc[$1]; } - | T_INC variable { $$ = Expr\PreInc [$2]; } - | variable T_DEC { $$ = Expr\PostDec[$1]; } - | T_DEC variable { $$ = Expr\PreDec [$2]; } - | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } - | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } - | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } - | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } - | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } - | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } - | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } - | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; } - | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; } - | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; } - | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; } - | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; } - | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; } - | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } - | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } - | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; } - | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; } - | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; } - | '!' expr { $$ = Expr\BooleanNot[$2]; } - | '~' expr { $$ = Expr\BitwiseNot[$2]; } - | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; } - | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } - | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; } - | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } - | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; } - | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; } - | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } - | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; } - | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } - | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; } - | '(' expr ')' { $$ = $2; } - | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; } - | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; } - | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; } - | T_ISSET '(' expr_list_allow_comma ')' { $$ = Expr\Isset_[$3]; } - | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; } - | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; } - | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; } - | T_EVAL '(' expr ')' { $$ = Expr\Eval_[$3]; } - | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; } - | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; } - | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; } - | T_DOUBLE_CAST expr - { $attrs = attributes(); - $attrs['kind'] = $this->getFloatCastKind($1); - $$ = new Expr\Cast\Double($2, $attrs); } - | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; } - | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; } - | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; } - | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; } - | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; } - | T_EXIT exit_expr - { $attrs = attributes(); - $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $$ = new Expr\Exit_($2, $attrs); } - | '@' expr { $$ = Expr\ErrorSuppress[$2]; } - | scalar { $$ = $1; } - | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; } - | T_PRINT expr { $$ = Expr\Print_[$2]; } - | T_YIELD { $$ = Expr\Yield_[null, null]; } - | T_YIELD expr { $$ = Expr\Yield_[$2, null]; } - | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; } - | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; } - | T_THROW expr { $$ = Expr\Throw_[$2]; } - - | T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW - { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $2, 'params' => $4, 'returnType' => $6, 'expr' => $8, 'attrGroups' => []]]; } - | T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW - { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => []]]; } - | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error - { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; } - | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error - { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => []]]; } - - | attributes T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW - { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => $1]]; } - | attributes T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW - { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $4, 'params' => $6, 'returnType' => $8, 'expr' => $10, 'attrGroups' => $1]]; } - | attributes T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error - { $$ = Expr\Closure[['static' => false, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; } - | attributes T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error - { $$ = Expr\Closure[['static' => true, 'byRef' => $4, 'params' => $6, 'uses' => $8, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; } -; - -anonymous_class: - optional_attributes T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' - { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]], $3); - $this->checkClass($$[0], -1); } -; - -new_expr: - T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; } - | T_NEW anonymous_class - { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; } -; - -lexical_vars: - /* empty */ { $$ = array(); } - | T_USE '(' lexical_var_list ')' { $$ = $3; } -; - -lexical_var_list: - non_empty_lexical_var_list optional_comma { $$ = $1; } -; - -non_empty_lexical_var_list: - lexical_var { init($1); } - | non_empty_lexical_var_list ',' lexical_var { push($1, $3); } -; - -lexical_var: - optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; } -; - -function_call: - name argument_list { $$ = Expr\FuncCall[$1, $2]; } - | callable_expr argument_list { $$ = Expr\FuncCall[$1, $2]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM member_name argument_list - { $$ = Expr\StaticCall[$1, $3, $4]; } -; - -class_name: - T_STATIC { $$ = Name[$1]; } - | name { $$ = $1; } -; - -name: - T_STRING { $$ = Name[$1]; } - | T_NAME_QUALIFIED { $$ = Name[$1]; } - | T_NAME_FULLY_QUALIFIED { $$ = Name\FullyQualified[substr($1, 1)]; } - | T_NAME_RELATIVE { $$ = Name\Relative[substr($1, 10)]; } -; - -class_name_reference: - class_name { $$ = $1; } - | new_variable { $$ = $1; } - | '(' expr ')' { $$ = $2; } - | error { $$ = Expr\Error[]; $this->errorState = 2; } -; - -class_name_or_var: - class_name { $$ = $1; } - | fully_dereferencable { $$ = $1; } -; - -exit_expr: - /* empty */ { $$ = null; } - | '(' optional_expr ')' { $$ = $2; } -; - -backticks_expr: - /* empty */ { $$ = array(); } - | T_ENCAPSED_AND_WHITESPACE - { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`')]); } - | encaps_list { parseEncapsed($1, '`', true); $$ = $1; } -; - -ctor_arguments: - /* empty */ { $$ = array(); } - | argument_list { $$ = $1; } -; - -constant: - name { $$ = Expr\ConstFetch[$1]; } - | T_LINE { $$ = Scalar\MagicConst\Line[]; } - | T_FILE { $$ = Scalar\MagicConst\File[]; } - | T_DIR { $$ = Scalar\MagicConst\Dir[]; } - | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; } - | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; } - | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; } - | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; } - | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; } -; - -class_constant: - class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved - { $$ = Expr\ClassConstFetch[$1, $3]; } - /* We interpret an isolated FOO:: as an unfinished class constant fetch. It could also be - an unfinished static property fetch or unfinished scoped call. */ - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM error - { $$ = Expr\ClassConstFetch[$1, new Expr\Error(stackAttributes(#3))]; $this->errorState = 2; } -; - -array_short_syntax: - '[' array_pair_list ']' - { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT; - $$ = new Expr\Array_($2, $attrs); } -; - -dereferencable_scalar: - T_ARRAY '(' array_pair_list ')' - { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; - $$ = new Expr\Array_($3, $attrs); } - | array_short_syntax { $$ = $1; } - | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes()); } - | '"' encaps_list '"' - { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } -; - -scalar: - T_LNUMBER { $$ = $this->parseLNumber($1, attributes()); } - | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); } - | dereferencable_scalar { $$ = $1; } - | constant { $$ = $1; } - | class_constant { $$ = $1; } - | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC - { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } - | T_START_HEREDOC T_END_HEREDOC - { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), true); } - | T_START_HEREDOC encaps_list T_END_HEREDOC - { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } -; - -optional_expr: - /* empty */ { $$ = null; } - | expr { $$ = $1; } -; - -fully_dereferencable: - variable { $$ = $1; } - | '(' expr ')' { $$ = $2; } - | dereferencable_scalar { $$ = $1; } - | class_constant { $$ = $1; } -; - -array_object_dereferencable: - fully_dereferencable { $$ = $1; } - | constant { $$ = $1; } -; - -callable_expr: - callable_variable { $$ = $1; } - | '(' expr ')' { $$ = $2; } - | dereferencable_scalar { $$ = $1; } -; - -callable_variable: - simple_variable { $$ = $1; } - | array_object_dereferencable '[' optional_expr ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | array_object_dereferencable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | function_call { $$ = $1; } - | array_object_dereferencable T_OBJECT_OPERATOR property_name argument_list - { $$ = Expr\MethodCall[$1, $3, $4]; } - | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name argument_list - { $$ = Expr\NullsafeMethodCall[$1, $3, $4]; } -; - -optional_plain_variable: - /* empty */ { $$ = null; } - | plain_variable { $$ = $1; } -; - -variable: - callable_variable { $$ = $1; } - | static_member { $$ = $1; } - | array_object_dereferencable T_OBJECT_OPERATOR property_name - { $$ = Expr\PropertyFetch[$1, $3]; } - | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name - { $$ = Expr\NullsafePropertyFetch[$1, $3]; } -; - -simple_variable: - plain_variable { $$ = $1; } - | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } - | '$' simple_variable { $$ = Expr\Variable[$2]; } - | '$' error { $$ = Expr\Variable[Expr\Error[]]; $this->errorState = 2; } -; - -static_member_prop_name: - simple_variable - { $var = $1->name; $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; } -; - -static_member: - class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name - { $$ = Expr\StaticPropertyFetch[$1, $3]; } -; - -new_variable: - simple_variable { $$ = $1; } - | new_variable '[' optional_expr ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | new_variable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | new_variable T_OBJECT_OPERATOR property_name { $$ = Expr\PropertyFetch[$1, $3]; } - | new_variable T_NULLSAFE_OBJECT_OPERATOR property_name { $$ = Expr\NullsafePropertyFetch[$1, $3]; } - | class_name T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name - { $$ = Expr\StaticPropertyFetch[$1, $3]; } - | new_variable T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name - { $$ = Expr\StaticPropertyFetch[$1, $3]; } -; - -member_name: - identifier_maybe_reserved { $$ = $1; } - | '{' expr '}' { $$ = $2; } - | simple_variable { $$ = $1; } -; - -property_name: - identifier_not_reserved { $$ = $1; } - | '{' expr '}' { $$ = $2; } - | simple_variable { $$ = $1; } - | error { $$ = Expr\Error[]; $this->errorState = 2; } -; - -list_expr: - T_LIST '(' inner_array_pair_list ')' { $$ = Expr\List_[$3]; } -; - -array_pair_list: - inner_array_pair_list - { $$ = $1; $end = count($$)-1; if ($$[$end] === null) array_pop($$); } -; - -comma_or_error: - ',' - | error - { /* do nothing -- prevent default action of $$=$1. See #551. */ } -; - -inner_array_pair_list: - inner_array_pair_list comma_or_error array_pair { push($1, $3); } - | array_pair { init($1); } -; - -array_pair: - expr { $$ = Expr\ArrayItem[$1, null, false]; } - | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } - | list_expr { $$ = Expr\ArrayItem[$1, null, false]; } - | expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } - | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } - | expr T_DOUBLE_ARROW list_expr { $$ = Expr\ArrayItem[$3, $1, false]; } - | T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; } - | /* empty */ { $$ = null; } -; - -encaps_list: - encaps_list encaps_var { push($1, $2); } - | encaps_list encaps_string_part { push($1, $2); } - | encaps_var { init($1); } - | encaps_string_part encaps_var { init($1, $2); } -; - -encaps_string_part: - T_ENCAPSED_AND_WHITESPACE { $$ = Scalar\EncapsedStringPart[$1]; } -; - -encaps_str_varname: - T_STRING_VARNAME { $$ = Expr\Variable[$1]; } -; - -encaps_var: - plain_variable { $$ = $1; } - | plain_variable '[' encaps_var_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | plain_variable T_OBJECT_OPERATOR identifier_not_reserved - { $$ = Expr\PropertyFetch[$1, $3]; } - | plain_variable T_NULLSAFE_OBJECT_OPERATOR identifier_not_reserved - { $$ = Expr\NullsafePropertyFetch[$1, $3]; } - | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = Expr\Variable[$2]; } - | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = Expr\Variable[$2]; } - | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}' - { $$ = Expr\ArrayDimFetch[$2, $4]; } - | T_CURLY_OPEN variable '}' { $$ = $2; } -; - -encaps_var_offset: - T_STRING { $$ = Scalar\String_[$1]; } - | T_NUM_STRING { $$ = $this->parseNumString($1, attributes()); } - | '-' T_NUM_STRING { $$ = $this->parseNumString('-' . $2, attributes()); } - | plain_variable { $$ = $1; } -; - -%% diff --git a/vendor/nikic/php-parser/grammar/phpyLang.php b/vendor/nikic/php-parser/grammar/phpyLang.php deleted file mode 100644 index 663c2a14..00000000 --- a/vendor/nikic/php-parser/grammar/phpyLang.php +++ /dev/null @@ -1,184 +0,0 @@ -\'[^\\\\\']*+(?:\\\\.[^\\\\\']*+)*+\') - (?"[^\\\\"]*+(?:\\\\.[^\\\\"]*+)*+") - (?(?&singleQuotedString)|(?&doubleQuotedString)) - (?/\*[^*]*+(?:\*(?!/)[^*]*+)*+\*/) - (?\{[^\'"/{}]*+(?:(?:(?&string)|(?&comment)|(?&code)|/)[^\'"/{}]*+)*+}) -)'; - -const PARAMS = '\[(?[^[\]]*+(?:\[(?¶ms)\][^[\]]*+)*+)\]'; -const ARGS = '\((?[^()]*+(?:\((?&args)\)[^()]*+)*+)\)'; - -/////////////////////////////// -/// Preprocessing functions /// -/////////////////////////////// - -function preprocessGrammar($code) { - $code = resolveNodes($code); - $code = resolveMacros($code); - $code = resolveStackAccess($code); - - return $code; -} - -function resolveNodes($code) { - return preg_replace_callback( - '~\b(?[A-Z][a-zA-Z_\\\\]++)\s*' . PARAMS . '~', - function($matches) { - // recurse - $matches['params'] = resolveNodes($matches['params']); - - $params = magicSplit( - '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,', - $matches['params'] - ); - - $paramCode = ''; - foreach ($params as $param) { - $paramCode .= $param . ', '; - } - - return 'new ' . $matches['name'] . '(' . $paramCode . 'attributes())'; - }, - $code - ); -} - -function resolveMacros($code) { - return preg_replace_callback( - '~\b(?)(?!array\()(?[a-z][A-Za-z]++)' . ARGS . '~', - function($matches) { - // recurse - $matches['args'] = resolveMacros($matches['args']); - - $name = $matches['name']; - $args = magicSplit( - '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,', - $matches['args'] - ); - - if ('attributes' === $name) { - assertArgs(0, $args, $name); - return '$this->startAttributeStack[#1] + $this->endAttributes'; - } - - if ('stackAttributes' === $name) { - assertArgs(1, $args, $name); - return '$this->startAttributeStack[' . $args[0] . ']' - . ' + $this->endAttributeStack[' . $args[0] . ']'; - } - - if ('init' === $name) { - return '$$ = array(' . implode(', ', $args) . ')'; - } - - if ('push' === $name) { - assertArgs(2, $args, $name); - - return $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0]; - } - - if ('pushNormalizing' === $name) { - assertArgs(2, $args, $name); - - return 'if (is_array(' . $args[1] . ')) { $$ = array_merge(' . $args[0] . ', ' . $args[1] . '); }' - . ' else { ' . $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0] . '; }'; - } - - if ('toArray' == $name) { - assertArgs(1, $args, $name); - - return 'is_array(' . $args[0] . ') ? ' . $args[0] . ' : array(' . $args[0] . ')'; - } - - if ('parseVar' === $name) { - assertArgs(1, $args, $name); - - return 'substr(' . $args[0] . ', 1)'; - } - - if ('parseEncapsed' === $name) { - assertArgs(3, $args, $name); - - return 'foreach (' . $args[0] . ' as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) {' - . ' $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, ' . $args[1] . ', ' . $args[2] . '); } }'; - } - - if ('makeNop' === $name) { - assertArgs(3, $args, $name); - - return '$startAttributes = ' . $args[1] . ';' - . ' if (isset($startAttributes[\'comments\']))' - . ' { ' . $args[0] . ' = new Stmt\Nop($startAttributes + ' . $args[2] . '); }' - . ' else { ' . $args[0] . ' = null; }'; - } - - if ('makeZeroLengthNop' == $name) { - assertArgs(2, $args, $name); - - return '$startAttributes = ' . $args[1] . ';' - . ' if (isset($startAttributes[\'comments\']))' - . ' { ' . $args[0] . ' = new Stmt\Nop($this->createCommentNopAttributes($startAttributes[\'comments\'])); }' - . ' else { ' . $args[0] . ' = null; }'; - } - - if ('prependLeadingComments' === $name) { - assertArgs(1, $args, $name); - - return '$attrs = $this->startAttributeStack[#1]; $stmts = ' . $args[0] . '; ' - . 'if (!empty($attrs[\'comments\'])) {' - . '$stmts[0]->setAttribute(\'comments\', ' - . 'array_merge($attrs[\'comments\'], $stmts[0]->getAttribute(\'comments\', []))); }'; - } - - return $matches[0]; - }, - $code - ); -} - -function assertArgs($num, $args, $name) { - if ($num != count($args)) { - die('Wrong argument count for ' . $name . '().'); - } -} - -function resolveStackAccess($code) { - $code = preg_replace('/\$\d+/', '$this->semStack[$0]', $code); - $code = preg_replace('/#(\d+)/', '$$1', $code); - return $code; -} - -function removeTrailingWhitespace($code) { - $lines = explode("\n", $code); - $lines = array_map('rtrim', $lines); - return implode("\n", $lines); -} - -////////////////////////////// -/// Regex helper functions /// -////////////////////////////// - -function regex($regex) { - return '~' . LIB . '(?:' . str_replace('~', '\~', $regex) . ')~'; -} - -function magicSplit($regex, $string) { - $pieces = preg_split(regex('(?:(?&string)|(?&comment)|(?&code))(*SKIP)(*FAIL)|' . $regex), $string); - - foreach ($pieces as &$piece) { - $piece = trim($piece); - } - - if ($pieces === ['']) { - return []; - } - - return $pieces; -} diff --git a/vendor/nikic/php-parser/grammar/rebuildParsers.php b/vendor/nikic/php-parser/grammar/rebuildParsers.php deleted file mode 100644 index 2d0c6b14..00000000 --- a/vendor/nikic/php-parser/grammar/rebuildParsers.php +++ /dev/null @@ -1,81 +0,0 @@ - 'Php5', - __DIR__ . '/php7.y' => 'Php7', -]; - -$tokensFile = __DIR__ . '/tokens.y'; -$tokensTemplate = __DIR__ . '/tokens.template'; -$skeletonFile = __DIR__ . '/parser.template'; -$tmpGrammarFile = __DIR__ . '/tmp_parser.phpy'; -$tmpResultFile = __DIR__ . '/tmp_parser.php'; -$resultDir = __DIR__ . '/../lib/PhpParser/Parser'; -$tokensResultsFile = $resultDir . '/Tokens.php'; - -$kmyacc = getenv('KMYACC'); -if (!$kmyacc) { - // Use phpyacc from dev dependencies by default. - $kmyacc = __DIR__ . '/../vendor/bin/phpyacc'; -} - -$options = array_flip($argv); -$optionDebug = isset($options['--debug']); -$optionKeepTmpGrammar = isset($options['--keep-tmp-grammar']); - -/////////////////// -/// Main script /// -/////////////////// - -$tokens = file_get_contents($tokensFile); - -foreach ($grammarFileToName as $grammarFile => $name) { - echo "Building temporary $name grammar file.\n"; - - $grammarCode = file_get_contents($grammarFile); - $grammarCode = str_replace('%tokens', $tokens, $grammarCode); - $grammarCode = preprocessGrammar($grammarCode); - - file_put_contents($tmpGrammarFile, $grammarCode); - - $additionalArgs = $optionDebug ? '-t -v' : ''; - - echo "Building $name parser.\n"; - $output = execCmd("$kmyacc $additionalArgs -m $skeletonFile -p $name $tmpGrammarFile"); - - $resultCode = file_get_contents($tmpResultFile); - $resultCode = removeTrailingWhitespace($resultCode); - - ensureDirExists($resultDir); - file_put_contents("$resultDir/$name.php", $resultCode); - unlink($tmpResultFile); - - echo "Building token definition.\n"; - $output = execCmd("$kmyacc -m $tokensTemplate $tmpGrammarFile"); - rename($tmpResultFile, $tokensResultsFile); - - if (!$optionKeepTmpGrammar) { - unlink($tmpGrammarFile); - } -} - -//////////////////////////////// -/// Utility helper functions /// -//////////////////////////////// - -function ensureDirExists($dir) { - if (!is_dir($dir)) { - mkdir($dir, 0777, true); - } -} - -function execCmd($cmd) { - $output = trim(shell_exec("$cmd 2>&1")); - if ($output !== "") { - echo "> " . $cmd . "\n"; - echo $output; - } - return $output; -} diff --git a/vendor/nikic/php-parser/grammar/tokens.template b/vendor/nikic/php-parser/grammar/tokens.template deleted file mode 100644 index ba4e4901..00000000 --- a/vendor/nikic/php-parser/grammar/tokens.template +++ /dev/null @@ -1,17 +0,0 @@ -semValue -#semval($,%t) $this->semValue -#semval(%n) $this->stackPos-(%l-%n) -#semval(%n,%t) $this->stackPos-(%l-%n) - -namespace PhpParser\Parser; -#include; - -/* GENERATED file based on grammar/tokens.y */ -final class Tokens -{ -#tokenval - const %s = %n; -#endtokenval -} diff --git a/vendor/nikic/php-parser/grammar/tokens.y b/vendor/nikic/php-parser/grammar/tokens.y deleted file mode 100644 index 8f0b2172..00000000 --- a/vendor/nikic/php-parser/grammar/tokens.y +++ /dev/null @@ -1,115 +0,0 @@ -/* We currently rely on the token ID mapping to be the same between PHP 5 and PHP 7 - so the same lexer can be used for - * both. This is enforced by sharing this token file. */ - -%right T_THROW -%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE -%left ',' -%left T_LOGICAL_OR -%left T_LOGICAL_XOR -%left T_LOGICAL_AND -%right T_PRINT -%right T_YIELD -%right T_DOUBLE_ARROW -%right T_YIELD_FROM -%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL -%left '?' ':' -%right T_COALESCE -%left T_BOOLEAN_OR -%left T_BOOLEAN_AND -%left '|' -%left '^' -%left T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG -%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL T_SPACESHIP -%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL -%left T_SL T_SR -%left '+' '-' '.' -%left '*' '/' '%' -%right '!' -%nonassoc T_INSTANCEOF -%right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@' -%right T_POW -%right '[' -%nonassoc T_NEW T_CLONE -%token T_EXIT -%token T_IF -%left T_ELSEIF -%left T_ELSE -%left T_ENDIF -%token T_LNUMBER -%token T_DNUMBER -%token T_STRING -%token T_STRING_VARNAME -%token T_VARIABLE -%token T_NUM_STRING -%token T_INLINE_HTML -%token T_ENCAPSED_AND_WHITESPACE -%token T_CONSTANT_ENCAPSED_STRING -%token T_ECHO -%token T_DO -%token T_WHILE -%token T_ENDWHILE -%token T_FOR -%token T_ENDFOR -%token T_FOREACH -%token T_ENDFOREACH -%token T_DECLARE -%token T_ENDDECLARE -%token T_AS -%token T_SWITCH -%token T_MATCH -%token T_ENDSWITCH -%token T_CASE -%token T_DEFAULT -%token T_BREAK -%token T_CONTINUE -%token T_GOTO -%token T_FUNCTION -%token T_FN -%token T_CONST -%token T_RETURN -%token T_TRY -%token T_CATCH -%token T_FINALLY -%token T_THROW -%token T_USE -%token T_INSTEADOF -%token T_GLOBAL -%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC T_READONLY -%token T_VAR -%token T_UNSET -%token T_ISSET -%token T_EMPTY -%token T_HALT_COMPILER -%token T_CLASS -%token T_TRAIT -%token T_INTERFACE -%token T_ENUM -%token T_EXTENDS -%token T_IMPLEMENTS -%token T_OBJECT_OPERATOR -%token T_NULLSAFE_OBJECT_OPERATOR -%token T_DOUBLE_ARROW -%token T_LIST -%token T_ARRAY -%token T_CALLABLE -%token T_CLASS_C -%token T_TRAIT_C -%token T_METHOD_C -%token T_FUNC_C -%token T_LINE -%token T_FILE -%token T_START_HEREDOC -%token T_END_HEREDOC -%token T_DOLLAR_OPEN_CURLY_BRACES -%token T_CURLY_OPEN -%token T_PAAMAYIM_NEKUDOTAYIM -%token T_NAMESPACE -%token T_NS_C -%token T_DIR -%token T_NS_SEPARATOR -%token T_ELLIPSIS -%token T_NAME_FULLY_QUALIFIED -%token T_NAME_QUALIFIED -%token T_NAME_RELATIVE -%token T_ATTRIBUTE -%token T_ENUM diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder.php b/vendor/nikic/php-parser/lib/PhpParser/Builder.php deleted file mode 100644 index 26d8921e..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder.php +++ /dev/null @@ -1,13 +0,0 @@ -constants = [new Const_($name, BuilderHelpers::normalizeValue($value))]; - } - - /** - * Add another constant to const group - * - * @param string|Identifier $name Name - * @param Node\Expr|bool|null|int|float|string|array $value Value - * - * @return $this The builder instance (for fluid interface) - */ - public function addConst($name, $value) { - $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value)); - - return $this; - } - - /** - * Makes the constant public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); - - return $this; - } - - /** - * Makes the constant protected. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); - - return $this; - } - - /** - * Makes the constant private. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); - - return $this; - } - - /** - * Makes the constant final. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeFinal() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); - - return $this; - } - - /** - * Sets doc comment for the constant. - * - * @param PhpParser\Comment\Doc|string $docComment Doc comment to set - * - * @return $this The builder instance (for fluid interface) - */ - public function setDocComment($docComment) { - $this->attributes = [ - 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] - ]; - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built class node. - * - * @return Stmt\ClassConst The built constant node - */ - public function getNode(): PhpParser\Node { - return new Stmt\ClassConst( - $this->constants, - $this->flags, - $this->attributes, - $this->attributeGroups - ); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php deleted file mode 100644 index 35b54d04..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php +++ /dev/null @@ -1,146 +0,0 @@ -name = $name; - } - - /** - * Extends a class. - * - * @param Name|string $class Name of class to extend - * - * @return $this The builder instance (for fluid interface) - */ - public function extend($class) { - $this->extends = BuilderHelpers::normalizeName($class); - - return $this; - } - - /** - * Implements one or more interfaces. - * - * @param Name|string ...$interfaces Names of interfaces to implement - * - * @return $this The builder instance (for fluid interface) - */ - public function implement(...$interfaces) { - foreach ($interfaces as $interface) { - $this->implements[] = BuilderHelpers::normalizeName($interface); - } - - return $this; - } - - /** - * Makes the class abstract. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeAbstract() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); - - return $this; - } - - /** - * Makes the class final. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeFinal() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); - - return $this; - } - - public function makeReadonly() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); - - return $this; - } - - /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $stmt = BuilderHelpers::normalizeNode($stmt); - - $targets = [ - Stmt\TraitUse::class => &$this->uses, - Stmt\ClassConst::class => &$this->constants, - Stmt\Property::class => &$this->properties, - Stmt\ClassMethod::class => &$this->methods, - ]; - - $class = \get_class($stmt); - if (!isset($targets[$class])) { - throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - - $targets[$class][] = $stmt; - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built class node. - * - * @return Stmt\Class_ The built class node - */ - public function getNode() : PhpParser\Node { - return new Stmt\Class_($this->name, [ - 'flags' => $this->flags, - 'extends' => $this->extends, - 'implements' => $this->implements, - 'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods), - 'attrGroups' => $this->attributeGroups, - ], $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php deleted file mode 100644 index 83094992..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php +++ /dev/null @@ -1,43 +0,0 @@ -addStmt($stmt); - } - - return $this; - } - - /** - * Sets doc comment for the declaration. - * - * @param PhpParser\Comment\Doc|string $docComment Doc comment to set - * - * @return $this The builder instance (for fluid interface) - */ - public function setDocComment($docComment) { - $this->attributes['comments'] = [ - BuilderHelpers::normalizeDocComment($docComment) - ]; - - return $this; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php deleted file mode 100644 index 02fa83e6..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php +++ /dev/null @@ -1,85 +0,0 @@ -name = $name; - } - - /** - * Sets the value. - * - * @param Node\Expr|string|int $value - * - * @return $this - */ - public function setValue($value) { - $this->value = BuilderHelpers::normalizeValue($value); - - return $this; - } - - /** - * Sets doc comment for the constant. - * - * @param PhpParser\Comment\Doc|string $docComment Doc comment to set - * - * @return $this The builder instance (for fluid interface) - */ - public function setDocComment($docComment) { - $this->attributes = [ - 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] - ]; - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built enum case node. - * - * @return Stmt\EnumCase The built constant node - */ - public function getNode(): PhpParser\Node { - return new Stmt\EnumCase( - $this->name, - $this->value, - $this->attributes, - $this->attributeGroups - ); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php deleted file mode 100644 index be7eef95..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php +++ /dev/null @@ -1,117 +0,0 @@ -name = $name; - } - - /** - * Sets the scalar type. - * - * @param string|Identifier $type - * - * @return $this - */ - public function setScalarType($scalarType) { - $this->scalarType = BuilderHelpers::normalizeType($scalarType); - - return $this; - } - - /** - * Implements one or more interfaces. - * - * @param Name|string ...$interfaces Names of interfaces to implement - * - * @return $this The builder instance (for fluid interface) - */ - public function implement(...$interfaces) { - foreach ($interfaces as $interface) { - $this->implements[] = BuilderHelpers::normalizeName($interface); - } - - return $this; - } - - /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $stmt = BuilderHelpers::normalizeNode($stmt); - - $targets = [ - Stmt\TraitUse::class => &$this->uses, - Stmt\EnumCase::class => &$this->enumCases, - Stmt\ClassConst::class => &$this->constants, - Stmt\ClassMethod::class => &$this->methods, - ]; - - $class = \get_class($stmt); - if (!isset($targets[$class])) { - throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - - $targets[$class][] = $stmt; - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built class node. - * - * @return Stmt\Enum_ The built enum node - */ - public function getNode() : PhpParser\Node { - return new Stmt\Enum_($this->name, [ - 'scalarType' => $this->scalarType, - 'implements' => $this->implements, - 'stmts' => array_merge($this->uses, $this->enumCases, $this->constants, $this->methods), - 'attrGroups' => $this->attributeGroups, - ], $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php deleted file mode 100644 index 98ea9d33..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php +++ /dev/null @@ -1,73 +0,0 @@ -returnByRef = true; - - return $this; - } - - /** - * Adds a parameter. - * - * @param Node\Param|Param $param The parameter to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addParam($param) { - $param = BuilderHelpers::normalizeNode($param); - - if (!$param instanceof Node\Param) { - throw new \LogicException(sprintf('Expected parameter node, got "%s"', $param->getType())); - } - - $this->params[] = $param; - - return $this; - } - - /** - * Adds multiple parameters. - * - * @param array $params The parameters to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addParams(array $params) { - foreach ($params as $param) { - $this->addParam($param); - } - - return $this; - } - - /** - * Sets the return type for PHP 7. - * - * @param string|Node\Name|Node\Identifier|Node\ComplexType $type - * - * @return $this The builder instance (for fluid interface) - */ - public function setReturnType($type) { - $this->returnType = BuilderHelpers::normalizeType($type); - - return $this; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php deleted file mode 100644 index 1cd73c0d..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php +++ /dev/null @@ -1,67 +0,0 @@ -name = $name; - } - - /** - * Adds a statement. - * - * @param Node|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built function node. - * - * @return Stmt\Function_ The built function node - */ - public function getNode() : Node { - return new Stmt\Function_($this->name, [ - 'byRef' => $this->returnByRef, - 'params' => $this->params, - 'returnType' => $this->returnType, - 'stmts' => $this->stmts, - 'attrGroups' => $this->attributeGroups, - ], $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php deleted file mode 100644 index 7806e85f..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php +++ /dev/null @@ -1,93 +0,0 @@ -name = $name; - } - - /** - * Extends one or more interfaces. - * - * @param Name|string ...$interfaces Names of interfaces to extend - * - * @return $this The builder instance (for fluid interface) - */ - public function extend(...$interfaces) { - foreach ($interfaces as $interface) { - $this->extends[] = BuilderHelpers::normalizeName($interface); - } - - return $this; - } - - /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $stmt = BuilderHelpers::normalizeNode($stmt); - - if ($stmt instanceof Stmt\ClassConst) { - $this->constants[] = $stmt; - } elseif ($stmt instanceof Stmt\ClassMethod) { - // we erase all statements in the body of an interface method - $stmt->stmts = null; - $this->methods[] = $stmt; - } else { - throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built interface node. - * - * @return Stmt\Interface_ The built interface node - */ - public function getNode() : PhpParser\Node { - return new Stmt\Interface_($this->name, [ - 'extends' => $this->extends, - 'stmts' => array_merge($this->constants, $this->methods), - 'attrGroups' => $this->attributeGroups, - ], $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php deleted file mode 100644 index 232d7cb8..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php +++ /dev/null @@ -1,146 +0,0 @@ -name = $name; - } - - /** - * Makes the method public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); - - return $this; - } - - /** - * Makes the method protected. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); - - return $this; - } - - /** - * Makes the method private. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); - - return $this; - } - - /** - * Makes the method static. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeStatic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); - - return $this; - } - - /** - * Makes the method abstract. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeAbstract() { - if (!empty($this->stmts)) { - throw new \LogicException('Cannot make method with statements abstract'); - } - - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); - $this->stmts = null; // abstract methods don't have statements - - return $this; - } - - /** - * Makes the method final. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeFinal() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); - - return $this; - } - - /** - * Adds a statement. - * - * @param Node|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - if (null === $this->stmts) { - throw new \LogicException('Cannot add statements to an abstract method'); - } - - $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built method node. - * - * @return Stmt\ClassMethod The built method node - */ - public function getNode() : Node { - return new Stmt\ClassMethod($this->name, [ - 'flags' => $this->flags, - 'byRef' => $this->returnByRef, - 'params' => $this->params, - 'returnType' => $this->returnType, - 'stmts' => $this->stmts, - 'attrGroups' => $this->attributeGroups, - ], $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php deleted file mode 100644 index 1c751e16..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php +++ /dev/null @@ -1,45 +0,0 @@ -name = null !== $name ? BuilderHelpers::normalizeName($name) : null; - } - - /** - * Adds a statement. - * - * @param Node|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); - - return $this; - } - - /** - * Returns the built node. - * - * @return Stmt\Namespace_ The built node - */ - public function getNode() : Node { - return new Stmt\Namespace_($this->name, $this->stmts, $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php deleted file mode 100644 index de9aae7e..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php +++ /dev/null @@ -1,122 +0,0 @@ -name = $name; - } - - /** - * Sets default value for the parameter. - * - * @param mixed $value Default value to use - * - * @return $this The builder instance (for fluid interface) - */ - public function setDefault($value) { - $this->default = BuilderHelpers::normalizeValue($value); - - return $this; - } - - /** - * Sets type for the parameter. - * - * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type - * - * @return $this The builder instance (for fluid interface) - */ - public function setType($type) { - $this->type = BuilderHelpers::normalizeType($type); - if ($this->type == 'void') { - throw new \LogicException('Parameter type cannot be void'); - } - - return $this; - } - - /** - * Sets type for the parameter. - * - * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type - * - * @return $this The builder instance (for fluid interface) - * - * @deprecated Use setType() instead - */ - public function setTypeHint($type) { - return $this->setType($type); - } - - /** - * Make the parameter accept the value by reference. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeByRef() { - $this->byRef = true; - - return $this; - } - - /** - * Make the parameter variadic - * - * @return $this The builder instance (for fluid interface) - */ - public function makeVariadic() { - $this->variadic = true; - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built parameter node. - * - * @return Node\Param The built parameter node - */ - public function getNode() : Node { - return new Node\Param( - new Node\Expr\Variable($this->name), - $this->default, $this->type, $this->byRef, $this->variadic, [], 0, $this->attributeGroups - ); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php deleted file mode 100644 index 68e31856..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php +++ /dev/null @@ -1,161 +0,0 @@ -name = $name; - } - - /** - * Makes the property public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); - - return $this; - } - - /** - * Makes the property protected. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); - - return $this; - } - - /** - * Makes the property private. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); - - return $this; - } - - /** - * Makes the property static. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeStatic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); - - return $this; - } - - /** - * Makes the property readonly. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeReadonly() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); - - return $this; - } - - /** - * Sets default value for the property. - * - * @param mixed $value Default value to use - * - * @return $this The builder instance (for fluid interface) - */ - public function setDefault($value) { - $this->default = BuilderHelpers::normalizeValue($value); - - return $this; - } - - /** - * Sets doc comment for the property. - * - * @param PhpParser\Comment\Doc|string $docComment Doc comment to set - * - * @return $this The builder instance (for fluid interface) - */ - public function setDocComment($docComment) { - $this->attributes = [ - 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] - ]; - - return $this; - } - - /** - * Sets the property type for PHP 7.4+. - * - * @param string|Name|Identifier|ComplexType $type - * - * @return $this - */ - public function setType($type) { - $this->type = BuilderHelpers::normalizeType($type); - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built class node. - * - * @return Stmt\Property The built property node - */ - public function getNode() : PhpParser\Node { - return new Stmt\Property( - $this->flags !== 0 ? $this->flags : Stmt\Class_::MODIFIER_PUBLIC, - [ - new Stmt\PropertyProperty($this->name, $this->default) - ], - $this->attributes, - $this->type, - $this->attributeGroups - ); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php deleted file mode 100644 index 311e8cd7..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php +++ /dev/null @@ -1,64 +0,0 @@ -and($trait); - } - } - - /** - * Adds used trait. - * - * @param Node\Name|string $trait Trait name - * - * @return $this The builder instance (for fluid interface) - */ - public function and($trait) { - $this->traits[] = BuilderHelpers::normalizeName($trait); - return $this; - } - - /** - * Adds trait adaptation. - * - * @param Stmt\TraitUseAdaptation|Builder\TraitUseAdaptation $adaptation Trait adaptation - * - * @return $this The builder instance (for fluid interface) - */ - public function with($adaptation) { - $adaptation = BuilderHelpers::normalizeNode($adaptation); - - if (!$adaptation instanceof Stmt\TraitUseAdaptation) { - throw new \LogicException('Adaptation must have type TraitUseAdaptation'); - } - - $this->adaptations[] = $adaptation; - return $this; - } - - /** - * Returns the built node. - * - * @return Node The built node - */ - public function getNode() : Node { - return new Stmt\TraitUse($this->traits, $this->adaptations); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php deleted file mode 100644 index eb6c0b62..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php +++ /dev/null @@ -1,148 +0,0 @@ -type = self::TYPE_UNDEFINED; - - $this->trait = is_null($trait)? null: BuilderHelpers::normalizeName($trait); - $this->method = BuilderHelpers::normalizeIdentifier($method); - } - - /** - * Sets alias of method. - * - * @param Node\Identifier|string $alias Alias for adaptated method - * - * @return $this The builder instance (for fluid interface) - */ - public function as($alias) { - if ($this->type === self::TYPE_UNDEFINED) { - $this->type = self::TYPE_ALIAS; - } - - if ($this->type !== self::TYPE_ALIAS) { - throw new \LogicException('Cannot set alias for not alias adaptation buider'); - } - - $this->alias = $alias; - return $this; - } - - /** - * Sets adaptated method public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() { - $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC); - return $this; - } - - /** - * Sets adaptated method protected. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeProtected() { - $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED); - return $this; - } - - /** - * Sets adaptated method private. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePrivate() { - $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE); - return $this; - } - - /** - * Adds overwritten traits. - * - * @param Node\Name|string ...$traits Traits for overwrite - * - * @return $this The builder instance (for fluid interface) - */ - public function insteadof(...$traits) { - if ($this->type === self::TYPE_UNDEFINED) { - if (is_null($this->trait)) { - throw new \LogicException('Precedence adaptation must have trait'); - } - - $this->type = self::TYPE_PRECEDENCE; - } - - if ($this->type !== self::TYPE_PRECEDENCE) { - throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider'); - } - - foreach ($traits as $trait) { - $this->insteadof[] = BuilderHelpers::normalizeName($trait); - } - - return $this; - } - - protected function setModifier(int $modifier) { - if ($this->type === self::TYPE_UNDEFINED) { - $this->type = self::TYPE_ALIAS; - } - - if ($this->type !== self::TYPE_ALIAS) { - throw new \LogicException('Cannot set access modifier for not alias adaptation buider'); - } - - if (is_null($this->modifier)) { - $this->modifier = $modifier; - } else { - throw new \LogicException('Multiple access type modifiers are not allowed'); - } - } - - /** - * Returns the built node. - * - * @return Node The built node - */ - public function getNode() : Node { - switch ($this->type) { - case self::TYPE_ALIAS: - return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias); - case self::TYPE_PRECEDENCE: - return new Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof); - default: - throw new \LogicException('Type of adaptation is not defined'); - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php deleted file mode 100644 index 97f32f98..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php +++ /dev/null @@ -1,78 +0,0 @@ -name = $name; - } - - /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $stmt = BuilderHelpers::normalizeNode($stmt); - - if ($stmt instanceof Stmt\Property) { - $this->properties[] = $stmt; - } elseif ($stmt instanceof Stmt\ClassMethod) { - $this->methods[] = $stmt; - } elseif ($stmt instanceof Stmt\TraitUse) { - $this->uses[] = $stmt; - } else { - throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built trait node. - * - * @return Stmt\Trait_ The built interface node - */ - public function getNode() : PhpParser\Node { - return new Stmt\Trait_( - $this->name, [ - 'stmts' => array_merge($this->uses, $this->properties, $this->methods), - 'attrGroups' => $this->attributeGroups, - ], $this->attributes - ); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php deleted file mode 100644 index 4bd3d12d..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php +++ /dev/null @@ -1,49 +0,0 @@ -name = BuilderHelpers::normalizeName($name); - $this->type = $type; - } - - /** - * Sets alias for used name. - * - * @param string $alias Alias to use (last component of full name by default) - * - * @return $this The builder instance (for fluid interface) - */ - public function as(string $alias) { - $this->alias = $alias; - return $this; - } - - /** - * Returns the built node. - * - * @return Stmt\Use_ The built node - */ - public function getNode() : Node { - return new Stmt\Use_([ - new Stmt\UseUse($this->name, $this->alias) - ], $this->type); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php b/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php deleted file mode 100644 index fef2579b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php +++ /dev/null @@ -1,399 +0,0 @@ -args($args) - ); - } - - /** - * Creates a namespace builder. - * - * @param null|string|Node\Name $name Name of the namespace - * - * @return Builder\Namespace_ The created namespace builder - */ - public function namespace($name) : Builder\Namespace_ { - return new Builder\Namespace_($name); - } - - /** - * Creates a class builder. - * - * @param string $name Name of the class - * - * @return Builder\Class_ The created class builder - */ - public function class(string $name) : Builder\Class_ { - return new Builder\Class_($name); - } - - /** - * Creates an interface builder. - * - * @param string $name Name of the interface - * - * @return Builder\Interface_ The created interface builder - */ - public function interface(string $name) : Builder\Interface_ { - return new Builder\Interface_($name); - } - - /** - * Creates a trait builder. - * - * @param string $name Name of the trait - * - * @return Builder\Trait_ The created trait builder - */ - public function trait(string $name) : Builder\Trait_ { - return new Builder\Trait_($name); - } - - /** - * Creates an enum builder. - * - * @param string $name Name of the enum - * - * @return Builder\Enum_ The created enum builder - */ - public function enum(string $name) : Builder\Enum_ { - return new Builder\Enum_($name); - } - - /** - * Creates a trait use builder. - * - * @param Node\Name|string ...$traits Trait names - * - * @return Builder\TraitUse The create trait use builder - */ - public function useTrait(...$traits) : Builder\TraitUse { - return new Builder\TraitUse(...$traits); - } - - /** - * Creates a trait use adaptation builder. - * - * @param Node\Name|string|null $trait Trait name - * @param Node\Identifier|string $method Method name - * - * @return Builder\TraitUseAdaptation The create trait use adaptation builder - */ - public function traitUseAdaptation($trait, $method = null) : Builder\TraitUseAdaptation { - if ($method === null) { - $method = $trait; - $trait = null; - } - - return new Builder\TraitUseAdaptation($trait, $method); - } - - /** - * Creates a method builder. - * - * @param string $name Name of the method - * - * @return Builder\Method The created method builder - */ - public function method(string $name) : Builder\Method { - return new Builder\Method($name); - } - - /** - * Creates a parameter builder. - * - * @param string $name Name of the parameter - * - * @return Builder\Param The created parameter builder - */ - public function param(string $name) : Builder\Param { - return new Builder\Param($name); - } - - /** - * Creates a property builder. - * - * @param string $name Name of the property - * - * @return Builder\Property The created property builder - */ - public function property(string $name) : Builder\Property { - return new Builder\Property($name); - } - - /** - * Creates a function builder. - * - * @param string $name Name of the function - * - * @return Builder\Function_ The created function builder - */ - public function function(string $name) : Builder\Function_ { - return new Builder\Function_($name); - } - - /** - * Creates a namespace/class use builder. - * - * @param Node\Name|string $name Name of the entity (namespace or class) to alias - * - * @return Builder\Use_ The created use builder - */ - public function use($name) : Builder\Use_ { - return new Builder\Use_($name, Use_::TYPE_NORMAL); - } - - /** - * Creates a function use builder. - * - * @param Node\Name|string $name Name of the function to alias - * - * @return Builder\Use_ The created use function builder - */ - public function useFunction($name) : Builder\Use_ { - return new Builder\Use_($name, Use_::TYPE_FUNCTION); - } - - /** - * Creates a constant use builder. - * - * @param Node\Name|string $name Name of the const to alias - * - * @return Builder\Use_ The created use const builder - */ - public function useConst($name) : Builder\Use_ { - return new Builder\Use_($name, Use_::TYPE_CONSTANT); - } - - /** - * Creates a class constant builder. - * - * @param string|Identifier $name Name - * @param Node\Expr|bool|null|int|float|string|array $value Value - * - * @return Builder\ClassConst The created use const builder - */ - public function classConst($name, $value) : Builder\ClassConst { - return new Builder\ClassConst($name, $value); - } - - /** - * Creates an enum case builder. - * - * @param string|Identifier $name Name - * - * @return Builder\EnumCase The created use const builder - */ - public function enumCase($name) : Builder\EnumCase { - return new Builder\EnumCase($name); - } - - /** - * Creates node a for a literal value. - * - * @param Expr|bool|null|int|float|string|array $value $value - * - * @return Expr - */ - public function val($value) : Expr { - return BuilderHelpers::normalizeValue($value); - } - - /** - * Creates variable node. - * - * @param string|Expr $name Name - * - * @return Expr\Variable - */ - public function var($name) : Expr\Variable { - if (!\is_string($name) && !$name instanceof Expr) { - throw new \LogicException('Variable name must be string or Expr'); - } - - return new Expr\Variable($name); - } - - /** - * Normalizes an argument list. - * - * Creates Arg nodes for all arguments and converts literal values to expressions. - * - * @param array $args List of arguments to normalize - * - * @return Arg[] - */ - public function args(array $args) : array { - $normalizedArgs = []; - foreach ($args as $key => $arg) { - if (!($arg instanceof Arg)) { - $arg = new Arg(BuilderHelpers::normalizeValue($arg)); - } - if (\is_string($key)) { - $arg->name = BuilderHelpers::normalizeIdentifier($key); - } - $normalizedArgs[] = $arg; - } - return $normalizedArgs; - } - - /** - * Creates a function call node. - * - * @param string|Name|Expr $name Function name - * @param array $args Function arguments - * - * @return Expr\FuncCall - */ - public function funcCall($name, array $args = []) : Expr\FuncCall { - return new Expr\FuncCall( - BuilderHelpers::normalizeNameOrExpr($name), - $this->args($args) - ); - } - - /** - * Creates a method call node. - * - * @param Expr $var Variable the method is called on - * @param string|Identifier|Expr $name Method name - * @param array $args Method arguments - * - * @return Expr\MethodCall - */ - public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall { - return new Expr\MethodCall( - $var, - BuilderHelpers::normalizeIdentifierOrExpr($name), - $this->args($args) - ); - } - - /** - * Creates a static method call node. - * - * @param string|Name|Expr $class Class name - * @param string|Identifier|Expr $name Method name - * @param array $args Method arguments - * - * @return Expr\StaticCall - */ - public function staticCall($class, $name, array $args = []) : Expr\StaticCall { - return new Expr\StaticCall( - BuilderHelpers::normalizeNameOrExpr($class), - BuilderHelpers::normalizeIdentifierOrExpr($name), - $this->args($args) - ); - } - - /** - * Creates an object creation node. - * - * @param string|Name|Expr $class Class name - * @param array $args Constructor arguments - * - * @return Expr\New_ - */ - public function new($class, array $args = []) : Expr\New_ { - return new Expr\New_( - BuilderHelpers::normalizeNameOrExpr($class), - $this->args($args) - ); - } - - /** - * Creates a constant fetch node. - * - * @param string|Name $name Constant name - * - * @return Expr\ConstFetch - */ - public function constFetch($name) : Expr\ConstFetch { - return new Expr\ConstFetch(BuilderHelpers::normalizeName($name)); - } - - /** - * Creates a property fetch node. - * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Property name - * - * @return Expr\PropertyFetch - */ - public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch { - return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name)); - } - - /** - * Creates a class constant fetch node. - * - * @param string|Name|Expr $class Class name - * @param string|Identifier $name Constant name - * - * @return Expr\ClassConstFetch - */ - public function classConstFetch($class, $name): Expr\ClassConstFetch { - return new Expr\ClassConstFetch( - BuilderHelpers::normalizeNameOrExpr($class), - BuilderHelpers::normalizeIdentifier($name) - ); - } - - /** - * Creates nested Concat nodes from a list of expressions. - * - * @param Expr|string ...$exprs Expressions or literal strings - * - * @return Concat - */ - public function concat(...$exprs) : Concat { - $numExprs = count($exprs); - if ($numExprs < 2) { - throw new \LogicException('Expected at least two expressions'); - } - - $lastConcat = $this->normalizeStringExpr($exprs[0]); - for ($i = 1; $i < $numExprs; $i++) { - $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i])); - } - return $lastConcat; - } - - /** - * @param string|Expr $expr - * @return Expr - */ - private function normalizeStringExpr($expr) : Expr { - if ($expr instanceof Expr) { - return $expr; - } - - if (\is_string($expr)) { - return new String_($expr); - } - - throw new \LogicException('Expected string or Expr'); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php b/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php deleted file mode 100644 index b8839db3..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php +++ /dev/null @@ -1,322 +0,0 @@ -getNode(); - } - - if ($node instanceof Node) { - return $node; - } - - throw new \LogicException('Expected node or builder object'); - } - - /** - * Normalizes a node to a statement. - * - * Expressions are wrapped in a Stmt\Expression node. - * - * @param Node|Builder $node The node to normalize - * - * @return Stmt The normalized statement node - */ - public static function normalizeStmt($node) : Stmt { - $node = self::normalizeNode($node); - if ($node instanceof Stmt) { - return $node; - } - - if ($node instanceof Expr) { - return new Stmt\Expression($node); - } - - throw new \LogicException('Expected statement or expression node'); - } - - /** - * Normalizes strings to Identifier. - * - * @param string|Identifier $name The identifier to normalize - * - * @return Identifier The normalized identifier - */ - public static function normalizeIdentifier($name) : Identifier { - if ($name instanceof Identifier) { - return $name; - } - - if (\is_string($name)) { - return new Identifier($name); - } - - throw new \LogicException('Expected string or instance of Node\Identifier'); - } - - /** - * Normalizes strings to Identifier, also allowing expressions. - * - * @param string|Identifier|Expr $name The identifier to normalize - * - * @return Identifier|Expr The normalized identifier or expression - */ - public static function normalizeIdentifierOrExpr($name) { - if ($name instanceof Identifier || $name instanceof Expr) { - return $name; - } - - if (\is_string($name)) { - return new Identifier($name); - } - - throw new \LogicException('Expected string or instance of Node\Identifier or Node\Expr'); - } - - /** - * Normalizes a name: Converts string names to Name nodes. - * - * @param Name|string $name The name to normalize - * - * @return Name The normalized name - */ - public static function normalizeName($name) : Name { - if ($name instanceof Name) { - return $name; - } - - if (is_string($name)) { - if (!$name) { - throw new \LogicException('Name cannot be empty'); - } - - if ($name[0] === '\\') { - return new Name\FullyQualified(substr($name, 1)); - } - - if (0 === strpos($name, 'namespace\\')) { - return new Name\Relative(substr($name, strlen('namespace\\'))); - } - - return new Name($name); - } - - throw new \LogicException('Name must be a string or an instance of Node\Name'); - } - - /** - * Normalizes a name: Converts string names to Name nodes, while also allowing expressions. - * - * @param Expr|Name|string $name The name to normalize - * - * @return Name|Expr The normalized name or expression - */ - public static function normalizeNameOrExpr($name) { - if ($name instanceof Expr) { - return $name; - } - - if (!is_string($name) && !($name instanceof Name)) { - throw new \LogicException( - 'Name must be a string or an instance of Node\Name or Node\Expr' - ); - } - - return self::normalizeName($name); - } - - /** - * Normalizes a type: Converts plain-text type names into proper AST representation. - * - * In particular, builtin types become Identifiers, custom types become Names and nullables - * are wrapped in NullableType nodes. - * - * @param string|Name|Identifier|ComplexType $type The type to normalize - * - * @return Name|Identifier|ComplexType The normalized type - */ - public static function normalizeType($type) { - if (!is_string($type)) { - if ( - !$type instanceof Name && !$type instanceof Identifier && - !$type instanceof ComplexType - ) { - throw new \LogicException( - 'Type must be a string, or an instance of Name, Identifier or ComplexType' - ); - } - return $type; - } - - $nullable = false; - if (strlen($type) > 0 && $type[0] === '?') { - $nullable = true; - $type = substr($type, 1); - } - - $builtinTypes = [ - 'array', 'callable', 'string', 'int', 'float', 'bool', 'iterable', 'void', 'object', 'mixed', 'never', - ]; - - $lowerType = strtolower($type); - if (in_array($lowerType, $builtinTypes)) { - $type = new Identifier($lowerType); - } else { - $type = self::normalizeName($type); - } - - $notNullableTypes = [ - 'void', 'mixed', 'never', - ]; - if ($nullable && in_array((string) $type, $notNullableTypes)) { - throw new \LogicException(sprintf('%s type cannot be nullable', $type)); - } - - return $nullable ? new NullableType($type) : $type; - } - - /** - * Normalizes a value: Converts nulls, booleans, integers, - * floats, strings and arrays into their respective nodes - * - * @param Node\Expr|bool|null|int|float|string|array $value The value to normalize - * - * @return Expr The normalized value - */ - public static function normalizeValue($value) : Expr { - if ($value instanceof Node\Expr) { - return $value; - } - - if (is_null($value)) { - return new Expr\ConstFetch( - new Name('null') - ); - } - - if (is_bool($value)) { - return new Expr\ConstFetch( - new Name($value ? 'true' : 'false') - ); - } - - if (is_int($value)) { - return new Scalar\LNumber($value); - } - - if (is_float($value)) { - return new Scalar\DNumber($value); - } - - if (is_string($value)) { - return new Scalar\String_($value); - } - - if (is_array($value)) { - $items = []; - $lastKey = -1; - foreach ($value as $itemKey => $itemValue) { - // for consecutive, numeric keys don't generate keys - if (null !== $lastKey && ++$lastKey === $itemKey) { - $items[] = new Expr\ArrayItem( - self::normalizeValue($itemValue) - ); - } else { - $lastKey = null; - $items[] = new Expr\ArrayItem( - self::normalizeValue($itemValue), - self::normalizeValue($itemKey) - ); - } - } - - return new Expr\Array_($items); - } - - throw new \LogicException('Invalid value'); - } - - /** - * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc. - * - * @param Comment\Doc|string $docComment The doc comment to normalize - * - * @return Comment\Doc The normalized doc comment - */ - public static function normalizeDocComment($docComment) : Comment\Doc { - if ($docComment instanceof Comment\Doc) { - return $docComment; - } - - if (is_string($docComment)) { - return new Comment\Doc($docComment); - } - - throw new \LogicException('Doc comment must be a string or an instance of PhpParser\Comment\Doc'); - } - - /** - * Normalizes a attribute: Converts attribute to the Attribute Group if needed. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return Node\AttributeGroup The Attribute Group - */ - public static function normalizeAttribute($attribute) : Node\AttributeGroup - { - if ($attribute instanceof Node\AttributeGroup) { - return $attribute; - } - - if (!($attribute instanceof Node\Attribute)) { - throw new \LogicException('Attribute must be an instance of PhpParser\Node\Attribute or PhpParser\Node\AttributeGroup'); - } - - return new Node\AttributeGroup([$attribute]); - } - - /** - * Adds a modifier and returns new modifier bitmask. - * - * @param int $modifiers Existing modifiers - * @param int $modifier Modifier to set - * - * @return int New modifiers - */ - public static function addModifier(int $modifiers, int $modifier) : int { - Stmt\Class_::verifyModifier($modifiers, $modifier); - return $modifiers | $modifier; - } - - /** - * Adds a modifier and returns new modifier bitmask. - * @return int New modifiers - */ - public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int { - Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet); - return $existingModifiers | $modifierToSet; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Comment.php b/vendor/nikic/php-parser/lib/PhpParser/Comment.php deleted file mode 100644 index 61e98d3d..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Comment.php +++ /dev/null @@ -1,239 +0,0 @@ -text = $text; - $this->startLine = $startLine; - $this->startFilePos = $startFilePos; - $this->startTokenPos = $startTokenPos; - $this->endLine = $endLine; - $this->endFilePos = $endFilePos; - $this->endTokenPos = $endTokenPos; - } - - /** - * Gets the comment text. - * - * @return string The comment text (including comment delimiters like /*) - */ - public function getText() : string { - return $this->text; - } - - /** - * Gets the line number the comment started on. - * - * @return int Line number (or -1 if not available) - */ - public function getStartLine() : int { - return $this->startLine; - } - - /** - * Gets the file offset the comment started on. - * - * @return int File offset (or -1 if not available) - */ - public function getStartFilePos() : int { - return $this->startFilePos; - } - - /** - * Gets the token offset the comment started on. - * - * @return int Token offset (or -1 if not available) - */ - public function getStartTokenPos() : int { - return $this->startTokenPos; - } - - /** - * Gets the line number the comment ends on. - * - * @return int Line number (or -1 if not available) - */ - public function getEndLine() : int { - return $this->endLine; - } - - /** - * Gets the file offset the comment ends on. - * - * @return int File offset (or -1 if not available) - */ - public function getEndFilePos() : int { - return $this->endFilePos; - } - - /** - * Gets the token offset the comment ends on. - * - * @return int Token offset (or -1 if not available) - */ - public function getEndTokenPos() : int { - return $this->endTokenPos; - } - - /** - * Gets the line number the comment started on. - * - * @deprecated Use getStartLine() instead - * - * @return int Line number - */ - public function getLine() : int { - return $this->startLine; - } - - /** - * Gets the file offset the comment started on. - * - * @deprecated Use getStartFilePos() instead - * - * @return int File offset - */ - public function getFilePos() : int { - return $this->startFilePos; - } - - /** - * Gets the token offset the comment started on. - * - * @deprecated Use getStartTokenPos() instead - * - * @return int Token offset - */ - public function getTokenPos() : int { - return $this->startTokenPos; - } - - /** - * Gets the comment text. - * - * @return string The comment text (including comment delimiters like /*) - */ - public function __toString() : string { - return $this->text; - } - - /** - * Gets the reformatted comment text. - * - * "Reformatted" here means that we try to clean up the whitespace at the - * starts of the lines. This is necessary because we receive the comments - * without trailing whitespace on the first line, but with trailing whitespace - * on all subsequent lines. - * - * @return mixed|string - */ - public function getReformattedText() { - $text = trim($this->text); - $newlinePos = strpos($text, "\n"); - if (false === $newlinePos) { - // Single line comments don't need further processing - return $text; - } elseif (preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\R\s+\*.*)+$)', $text)) { - // Multi line comment of the type - // - // /* - // * Some text. - // * Some more text. - // */ - // - // is handled by replacing the whitespace sequences before the * by a single space - return preg_replace('(^\s+\*)m', ' *', $this->text); - } elseif (preg_match('(^/\*\*?\s*[\r\n])', $text) && preg_match('(\n(\s*)\*/$)', $text, $matches)) { - // Multi line comment of the type - // - // /* - // Some text. - // Some more text. - // */ - // - // is handled by removing the whitespace sequence on the line before the closing - // */ on all lines. So if the last line is " */", then " " is removed at the - // start of all lines. - return preg_replace('(^' . preg_quote($matches[1]) . ')m', '', $text); - } elseif (preg_match('(^/\*\*?\s*(?!\s))', $text, $matches)) { - // Multi line comment of the type - // - // /* Some text. - // Some more text. - // Indented text. - // Even more text. */ - // - // is handled by removing the difference between the shortest whitespace prefix on all - // lines and the length of the "/* " opening sequence. - $prefixLen = $this->getShortestWhitespacePrefixLen(substr($text, $newlinePos + 1)); - $removeLen = $prefixLen - strlen($matches[0]); - return preg_replace('(^\s{' . $removeLen . '})m', '', $text); - } - - // No idea how to format this comment, so simply return as is - return $text; - } - - /** - * Get length of shortest whitespace prefix (at the start of a line). - * - * If there is a line with no prefix whitespace, 0 is a valid return value. - * - * @param string $str String to check - * @return int Length in characters. Tabs count as single characters. - */ - private function getShortestWhitespacePrefixLen(string $str) : int { - $lines = explode("\n", $str); - $shortestPrefixLen = \INF; - foreach ($lines as $line) { - preg_match('(^\s*)', $line, $matches); - $prefixLen = strlen($matches[0]); - if ($prefixLen < $shortestPrefixLen) { - $shortestPrefixLen = $prefixLen; - } - } - return $shortestPrefixLen; - } - - /** - * @return array - * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} - */ - public function jsonSerialize() : array { - // Technically not a node, but we make it look like one anyway - $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment'; - return [ - 'nodeType' => $type, - 'text' => $this->text, - // TODO: Rename these to include "start". - 'line' => $this->startLine, - 'filePos' => $this->startFilePos, - 'tokenPos' => $this->startTokenPos, - 'endLine' => $this->endLine, - 'endFilePos' => $this->endFilePos, - 'endTokenPos' => $this->endTokenPos, - ]; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php b/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php deleted file mode 100644 index a9db6128..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php +++ /dev/null @@ -1,7 +0,0 @@ -fallbackEvaluator = $fallbackEvaluator ?? function(Expr $expr) { - throw new ConstExprEvaluationException( - "Expression of type {$expr->getType()} cannot be evaluated" - ); - }; - } - - /** - * Silently evaluates a constant expression into a PHP value. - * - * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException. - * The original source of the exception is available through getPrevious(). - * - * If some part of the expression cannot be evaluated, the fallback evaluator passed to the - * constructor will be invoked. By default, if no fallback is provided, an exception of type - * ConstExprEvaluationException is thrown. - * - * See class doc comment for caveats and limitations. - * - * @param Expr $expr Constant expression to evaluate - * @return mixed Result of evaluation - * - * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred - */ - public function evaluateSilently(Expr $expr) { - set_error_handler(function($num, $str, $file, $line) { - throw new \ErrorException($str, 0, $num, $file, $line); - }); - - try { - return $this->evaluate($expr); - } catch (\Throwable $e) { - if (!$e instanceof ConstExprEvaluationException) { - $e = new ConstExprEvaluationException( - "An error occurred during constant expression evaluation", 0, $e); - } - throw $e; - } finally { - restore_error_handler(); - } - } - - /** - * Directly evaluates a constant expression into a PHP value. - * - * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these - * into a ConstExprEvaluationException. - * - * If some part of the expression cannot be evaluated, the fallback evaluator passed to the - * constructor will be invoked. By default, if no fallback is provided, an exception of type - * ConstExprEvaluationException is thrown. - * - * See class doc comment for caveats and limitations. - * - * @param Expr $expr Constant expression to evaluate - * @return mixed Result of evaluation - * - * @throws ConstExprEvaluationException if the expression cannot be evaluated - */ - public function evaluateDirectly(Expr $expr) { - return $this->evaluate($expr); - } - - private function evaluate(Expr $expr) { - if ($expr instanceof Scalar\LNumber - || $expr instanceof Scalar\DNumber - || $expr instanceof Scalar\String_ - ) { - return $expr->value; - } - - if ($expr instanceof Expr\Array_) { - return $this->evaluateArray($expr); - } - - // Unary operators - if ($expr instanceof Expr\UnaryPlus) { - return +$this->evaluate($expr->expr); - } - if ($expr instanceof Expr\UnaryMinus) { - return -$this->evaluate($expr->expr); - } - if ($expr instanceof Expr\BooleanNot) { - return !$this->evaluate($expr->expr); - } - if ($expr instanceof Expr\BitwiseNot) { - return ~$this->evaluate($expr->expr); - } - - if ($expr instanceof Expr\BinaryOp) { - return $this->evaluateBinaryOp($expr); - } - - if ($expr instanceof Expr\Ternary) { - return $this->evaluateTernary($expr); - } - - if ($expr instanceof Expr\ArrayDimFetch && null !== $expr->dim) { - return $this->evaluate($expr->var)[$this->evaluate($expr->dim)]; - } - - if ($expr instanceof Expr\ConstFetch) { - return $this->evaluateConstFetch($expr); - } - - return ($this->fallbackEvaluator)($expr); - } - - private function evaluateArray(Expr\Array_ $expr) { - $array = []; - foreach ($expr->items as $item) { - if (null !== $item->key) { - $array[$this->evaluate($item->key)] = $this->evaluate($item->value); - } elseif ($item->unpack) { - $array = array_merge($array, $this->evaluate($item->value)); - } else { - $array[] = $this->evaluate($item->value); - } - } - return $array; - } - - private function evaluateTernary(Expr\Ternary $expr) { - if (null === $expr->if) { - return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else); - } - - return $this->evaluate($expr->cond) - ? $this->evaluate($expr->if) - : $this->evaluate($expr->else); - } - - private function evaluateBinaryOp(Expr\BinaryOp $expr) { - if ($expr instanceof Expr\BinaryOp\Coalesce - && $expr->left instanceof Expr\ArrayDimFetch - ) { - // This needs to be special cased to respect BP_VAR_IS fetch semantics - return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] - ?? $this->evaluate($expr->right); - } - - // The evaluate() calls are repeated in each branch, because some of the operators are - // short-circuiting and evaluating the RHS in advance may be illegal in that case - $l = $expr->left; - $r = $expr->right; - switch ($expr->getOperatorSigil()) { - case '&': return $this->evaluate($l) & $this->evaluate($r); - case '|': return $this->evaluate($l) | $this->evaluate($r); - case '^': return $this->evaluate($l) ^ $this->evaluate($r); - case '&&': return $this->evaluate($l) && $this->evaluate($r); - case '||': return $this->evaluate($l) || $this->evaluate($r); - case '??': return $this->evaluate($l) ?? $this->evaluate($r); - case '.': return $this->evaluate($l) . $this->evaluate($r); - case '/': return $this->evaluate($l) / $this->evaluate($r); - case '==': return $this->evaluate($l) == $this->evaluate($r); - case '>': return $this->evaluate($l) > $this->evaluate($r); - case '>=': return $this->evaluate($l) >= $this->evaluate($r); - case '===': return $this->evaluate($l) === $this->evaluate($r); - case 'and': return $this->evaluate($l) and $this->evaluate($r); - case 'or': return $this->evaluate($l) or $this->evaluate($r); - case 'xor': return $this->evaluate($l) xor $this->evaluate($r); - case '-': return $this->evaluate($l) - $this->evaluate($r); - case '%': return $this->evaluate($l) % $this->evaluate($r); - case '*': return $this->evaluate($l) * $this->evaluate($r); - case '!=': return $this->evaluate($l) != $this->evaluate($r); - case '!==': return $this->evaluate($l) !== $this->evaluate($r); - case '+': return $this->evaluate($l) + $this->evaluate($r); - case '**': return $this->evaluate($l) ** $this->evaluate($r); - case '<<': return $this->evaluate($l) << $this->evaluate($r); - case '>>': return $this->evaluate($l) >> $this->evaluate($r); - case '<': return $this->evaluate($l) < $this->evaluate($r); - case '<=': return $this->evaluate($l) <= $this->evaluate($r); - case '<=>': return $this->evaluate($l) <=> $this->evaluate($r); - } - - throw new \Exception('Should not happen'); - } - - private function evaluateConstFetch(Expr\ConstFetch $expr) { - $name = $expr->name->toLowerString(); - switch ($name) { - case 'null': return null; - case 'false': return false; - case 'true': return true; - } - - return ($this->fallbackEvaluator)($expr); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Error.php b/vendor/nikic/php-parser/lib/PhpParser/Error.php deleted file mode 100644 index d1fb959d..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Error.php +++ /dev/null @@ -1,180 +0,0 @@ -rawMessage = $message; - if (is_array($attributes)) { - $this->attributes = $attributes; - } else { - $this->attributes = ['startLine' => $attributes]; - } - $this->updateMessage(); - } - - /** - * Gets the error message - * - * @return string Error message - */ - public function getRawMessage() : string { - return $this->rawMessage; - } - - /** - * Gets the line the error starts in. - * - * @return int Error start line - */ - public function getStartLine() : int { - return $this->attributes['startLine'] ?? -1; - } - - /** - * Gets the line the error ends in. - * - * @return int Error end line - */ - public function getEndLine() : int { - return $this->attributes['endLine'] ?? -1; - } - - /** - * Gets the attributes of the node/token the error occurred at. - * - * @return array - */ - public function getAttributes() : array { - return $this->attributes; - } - - /** - * Sets the attributes of the node/token the error occurred at. - * - * @param array $attributes - */ - public function setAttributes(array $attributes) { - $this->attributes = $attributes; - $this->updateMessage(); - } - - /** - * Sets the line of the PHP file the error occurred in. - * - * @param string $message Error message - */ - public function setRawMessage(string $message) { - $this->rawMessage = $message; - $this->updateMessage(); - } - - /** - * Sets the line the error starts in. - * - * @param int $line Error start line - */ - public function setStartLine(int $line) { - $this->attributes['startLine'] = $line; - $this->updateMessage(); - } - - /** - * Returns whether the error has start and end column information. - * - * For column information enable the startFilePos and endFilePos in the lexer options. - * - * @return bool - */ - public function hasColumnInfo() : bool { - return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']); - } - - /** - * Gets the start column (1-based) into the line where the error started. - * - * @param string $code Source code of the file - * @return int - */ - public function getStartColumn(string $code) : int { - if (!$this->hasColumnInfo()) { - throw new \RuntimeException('Error does not have column information'); - } - - return $this->toColumn($code, $this->attributes['startFilePos']); - } - - /** - * Gets the end column (1-based) into the line where the error ended. - * - * @param string $code Source code of the file - * @return int - */ - public function getEndColumn(string $code) : int { - if (!$this->hasColumnInfo()) { - throw new \RuntimeException('Error does not have column information'); - } - - return $this->toColumn($code, $this->attributes['endFilePos']); - } - - /** - * Formats message including line and column information. - * - * @param string $code Source code associated with the error, for calculation of the columns - * - * @return string Formatted message - */ - public function getMessageWithColumnInfo(string $code) : string { - return sprintf( - '%s from %d:%d to %d:%d', $this->getRawMessage(), - $this->getStartLine(), $this->getStartColumn($code), - $this->getEndLine(), $this->getEndColumn($code) - ); - } - - /** - * Converts a file offset into a column. - * - * @param string $code Source code that $pos indexes into - * @param int $pos 0-based position in $code - * - * @return int 1-based column (relative to start of line) - */ - private function toColumn(string $code, int $pos) : int { - if ($pos > strlen($code)) { - throw new \RuntimeException('Invalid position information'); - } - - $lineStartPos = strrpos($code, "\n", $pos - strlen($code)); - if (false === $lineStartPos) { - $lineStartPos = -1; - } - - return $pos - $lineStartPos; - } - - /** - * Updates the exception message after a change to rawMessage or rawLine. - */ - protected function updateMessage() { - $this->message = $this->rawMessage; - - if (-1 === $this->getStartLine()) { - $this->message .= ' on unknown line'; - } else { - $this->message .= ' on line ' . $this->getStartLine(); - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php b/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php deleted file mode 100644 index d620e745..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php +++ /dev/null @@ -1,13 +0,0 @@ -errors[] = $error; - } - - /** - * Get collected errors. - * - * @return Error[] - */ - public function getErrors() : array { - return $this->errors; - } - - /** - * Check whether there are any errors. - * - * @return bool - */ - public function hasErrors() : bool { - return !empty($this->errors); - } - - /** - * Reset/clear collected errors. - */ - public function clearErrors() { - $this->errors = []; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php b/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php deleted file mode 100644 index aeee989b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php +++ /dev/null @@ -1,18 +0,0 @@ -type = $type; - $this->old = $old; - $this->new = $new; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php b/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php deleted file mode 100644 index 7f218c74..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php +++ /dev/null @@ -1,164 +0,0 @@ -isEqual = $isEqual; - } - - /** - * Calculate diff (edit script) from $old to $new. - * - * @param array $old Original array - * @param array $new New array - * - * @return DiffElem[] Diff (edit script) - */ - public function diff(array $old, array $new) { - list($trace, $x, $y) = $this->calculateTrace($old, $new); - return $this->extractDiff($trace, $x, $y, $old, $new); - } - - /** - * Calculate diff, including "replace" operations. - * - * If a sequence of remove operations is followed by the same number of add operations, these - * will be coalesced into replace operations. - * - * @param array $old Original array - * @param array $new New array - * - * @return DiffElem[] Diff (edit script), including replace operations - */ - public function diffWithReplacements(array $old, array $new) { - return $this->coalesceReplacements($this->diff($old, $new)); - } - - private function calculateTrace(array $a, array $b) { - $n = \count($a); - $m = \count($b); - $max = $n + $m; - $v = [1 => 0]; - $trace = []; - for ($d = 0; $d <= $max; $d++) { - $trace[] = $v; - for ($k = -$d; $k <= $d; $k += 2) { - if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) { - $x = $v[$k+1]; - } else { - $x = $v[$k-1] + 1; - } - - $y = $x - $k; - while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) { - $x++; - $y++; - } - - $v[$k] = $x; - if ($x >= $n && $y >= $m) { - return [$trace, $x, $y]; - } - } - } - throw new \Exception('Should not happen'); - } - - private function extractDiff(array $trace, int $x, int $y, array $a, array $b) { - $result = []; - for ($d = \count($trace) - 1; $d >= 0; $d--) { - $v = $trace[$d]; - $k = $x - $y; - - if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) { - $prevK = $k + 1; - } else { - $prevK = $k - 1; - } - - $prevX = $v[$prevK]; - $prevY = $prevX - $prevK; - - while ($x > $prevX && $y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_KEEP, $a[$x-1], $b[$y-1]); - $x--; - $y--; - } - - if ($d === 0) { - break; - } - - while ($x > $prevX) { - $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x-1], null); - $x--; - } - - while ($y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y-1]); - $y--; - } - } - return array_reverse($result); - } - - /** - * Coalesce equal-length sequences of remove+add into a replace operation. - * - * @param DiffElem[] $diff - * @return DiffElem[] - */ - private function coalesceReplacements(array $diff) { - $newDiff = []; - $c = \count($diff); - for ($i = 0; $i < $c; $i++) { - $diffType = $diff[$i]->type; - if ($diffType !== DiffElem::TYPE_REMOVE) { - $newDiff[] = $diff[$i]; - continue; - } - - $j = $i; - while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { - $j++; - } - - $k = $j; - while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { - $k++; - } - - if ($j - $i === $k - $j) { - $len = $j - $i; - for ($n = 0; $n < $len; $n++) { - $newDiff[] = new DiffElem( - DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new - ); - } - } else { - for (; $i < $k; $i++) { - $newDiff[] = $diff[$i]; - } - } - $i = $k - 1; - } - return $newDiff; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php b/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php deleted file mode 100644 index 3eeac04a..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php +++ /dev/null @@ -1,61 +0,0 @@ -attrGroups = $attrGroups; - $this->args = $args; - $this->extends = $extends; - $this->implements = $implements; - $this->stmts = $stmts; - } - - public static function fromNewNode(Expr\New_ $newNode) { - $class = $newNode->class; - assert($class instanceof Node\Stmt\Class_); - // We don't assert that $class->name is null here, to allow consumers to assign unique names - // to anonymous classes for their own purposes. We simplify ignore the name here. - return new self( - $class->attrGroups, $newNode->args, $class->extends, $class->implements, - $class->stmts, $newNode->getAttributes() - ); - } - - public function getType() : string { - return 'Expr_PrintableNewAnonClass'; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'args', 'extends', 'implements', 'stmts']; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php b/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php deleted file mode 100644 index 84c0175e..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php +++ /dev/null @@ -1,281 +0,0 @@ -tokens = $tokens; - $this->indentMap = $this->calcIndentMap(); - } - - /** - * Whether the given position is immediately surrounded by parenthesis. - * - * @param int $startPos Start position - * @param int $endPos End position - * - * @return bool - */ - public function haveParens(int $startPos, int $endPos) : bool { - return $this->haveTokenImmediatelyBefore($startPos, '(') - && $this->haveTokenImmediatelyAfter($endPos, ')'); - } - - /** - * Whether the given position is immediately surrounded by braces. - * - * @param int $startPos Start position - * @param int $endPos End position - * - * @return bool - */ - public function haveBraces(int $startPos, int $endPos) : bool { - return ($this->haveTokenImmediatelyBefore($startPos, '{') - || $this->haveTokenImmediatelyBefore($startPos, T_CURLY_OPEN)) - && $this->haveTokenImmediatelyAfter($endPos, '}'); - } - - /** - * Check whether the position is directly preceded by a certain token type. - * - * During this check whitespace and comments are skipped. - * - * @param int $pos Position before which the token should occur - * @param int|string $expectedTokenType Token to check for - * - * @return bool Whether the expected token was found - */ - public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType) : bool { - $tokens = $this->tokens; - $pos--; - for (; $pos >= 0; $pos--) { - $tokenType = $tokens[$pos][0]; - if ($tokenType === $expectedTokenType) { - return true; - } - if ($tokenType !== \T_WHITESPACE - && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { - break; - } - } - return false; - } - - /** - * Check whether the position is directly followed by a certain token type. - * - * During this check whitespace and comments are skipped. - * - * @param int $pos Position after which the token should occur - * @param int|string $expectedTokenType Token to check for - * - * @return bool Whether the expected token was found - */ - public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool { - $tokens = $this->tokens; - $pos++; - for (; $pos < \count($tokens); $pos++) { - $tokenType = $tokens[$pos][0]; - if ($tokenType === $expectedTokenType) { - return true; - } - if ($tokenType !== \T_WHITESPACE - && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { - break; - } - } - return false; - } - - public function skipLeft(int $pos, $skipTokenType) { - $tokens = $this->tokens; - - $pos = $this->skipLeftWhitespace($pos); - if ($skipTokenType === \T_WHITESPACE) { - return $pos; - } - - if ($tokens[$pos][0] !== $skipTokenType) { - // Shouldn't happen. The skip token MUST be there - throw new \Exception('Encountered unexpected token'); - } - $pos--; - - return $this->skipLeftWhitespace($pos); - } - - public function skipRight(int $pos, $skipTokenType) { - $tokens = $this->tokens; - - $pos = $this->skipRightWhitespace($pos); - if ($skipTokenType === \T_WHITESPACE) { - return $pos; - } - - if ($tokens[$pos][0] !== $skipTokenType) { - // Shouldn't happen. The skip token MUST be there - throw new \Exception('Encountered unexpected token'); - } - $pos++; - - return $this->skipRightWhitespace($pos); - } - - /** - * Return first non-whitespace token position smaller or equal to passed position. - * - * @param int $pos Token position - * @return int Non-whitespace token position - */ - public function skipLeftWhitespace(int $pos) { - $tokens = $this->tokens; - for (; $pos >= 0; $pos--) { - $type = $tokens[$pos][0]; - if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { - break; - } - } - return $pos; - } - - /** - * Return first non-whitespace position greater or equal to passed position. - * - * @param int $pos Token position - * @return int Non-whitespace token position - */ - public function skipRightWhitespace(int $pos) { - $tokens = $this->tokens; - for ($count = \count($tokens); $pos < $count; $pos++) { - $type = $tokens[$pos][0]; - if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { - break; - } - } - return $pos; - } - - public function findRight(int $pos, $findTokenType) { - $tokens = $this->tokens; - for ($count = \count($tokens); $pos < $count; $pos++) { - $type = $tokens[$pos][0]; - if ($type === $findTokenType) { - return $pos; - } - } - return -1; - } - - /** - * Whether the given position range contains a certain token type. - * - * @param int $startPos Starting position (inclusive) - * @param int $endPos Ending position (exclusive) - * @param int|string $tokenType Token type to look for - * @return bool Whether the token occurs in the given range - */ - public function haveTokenInRange(int $startPos, int $endPos, $tokenType) { - $tokens = $this->tokens; - for ($pos = $startPos; $pos < $endPos; $pos++) { - if ($tokens[$pos][0] === $tokenType) { - return true; - } - } - return false; - } - - public function haveBracesInRange(int $startPos, int $endPos) { - return $this->haveTokenInRange($startPos, $endPos, '{') - || $this->haveTokenInRange($startPos, $endPos, T_CURLY_OPEN) - || $this->haveTokenInRange($startPos, $endPos, '}'); - } - - /** - * Get indentation before token position. - * - * @param int $pos Token position - * - * @return int Indentation depth (in spaces) - */ - public function getIndentationBefore(int $pos) : int { - return $this->indentMap[$pos]; - } - - /** - * Get the code corresponding to a token offset range, optionally adjusted for indentation. - * - * @param int $from Token start position (inclusive) - * @param int $to Token end position (exclusive) - * @param int $indent By how much the code should be indented (can be negative as well) - * - * @return string Code corresponding to token range, adjusted for indentation - */ - public function getTokenCode(int $from, int $to, int $indent) : string { - $tokens = $this->tokens; - $result = ''; - for ($pos = $from; $pos < $to; $pos++) { - $token = $tokens[$pos]; - if (\is_array($token)) { - $type = $token[0]; - $content = $token[1]; - if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) { - $result .= $content; - } else { - // TODO Handle non-space indentation - if ($indent < 0) { - $result .= str_replace("\n" . str_repeat(" ", -$indent), "\n", $content); - } elseif ($indent > 0) { - $result .= str_replace("\n", "\n" . str_repeat(" ", $indent), $content); - } else { - $result .= $content; - } - } - } else { - $result .= $token; - } - } - return $result; - } - - /** - * Precalculate the indentation at every token position. - * - * @return int[] Token position to indentation map - */ - private function calcIndentMap() { - $indentMap = []; - $indent = 0; - foreach ($this->tokens as $token) { - $indentMap[] = $indent; - - if ($token[0] === \T_WHITESPACE) { - $content = $token[1]; - $newlinePos = \strrpos($content, "\n"); - if (false !== $newlinePos) { - $indent = \strlen($content) - $newlinePos - 1; - } - } - } - - // Add a sentinel for one past end of the file - $indentMap[] = $indent; - - return $indentMap; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php b/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php deleted file mode 100644 index 47d2003d..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php +++ /dev/null @@ -1,103 +0,0 @@ -decodeRecursive($value); - } - - private function decodeRecursive($value) { - if (\is_array($value)) { - if (isset($value['nodeType'])) { - if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') { - return $this->decodeComment($value); - } - return $this->decodeNode($value); - } - return $this->decodeArray($value); - } - return $value; - } - - private function decodeArray(array $array) : array { - $decodedArray = []; - foreach ($array as $key => $value) { - $decodedArray[$key] = $this->decodeRecursive($value); - } - return $decodedArray; - } - - private function decodeNode(array $value) : Node { - $nodeType = $value['nodeType']; - if (!\is_string($nodeType)) { - throw new \RuntimeException('Node type must be a string'); - } - - $reflectionClass = $this->reflectionClassFromNodeType($nodeType); - /** @var Node $node */ - $node = $reflectionClass->newInstanceWithoutConstructor(); - - if (isset($value['attributes'])) { - if (!\is_array($value['attributes'])) { - throw new \RuntimeException('Attributes must be an array'); - } - - $node->setAttributes($this->decodeArray($value['attributes'])); - } - - foreach ($value as $name => $subNode) { - if ($name === 'nodeType' || $name === 'attributes') { - continue; - } - - $node->$name = $this->decodeRecursive($subNode); - } - - return $node; - } - - private function decodeComment(array $value) : Comment { - $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\Doc::class; - if (!isset($value['text'])) { - throw new \RuntimeException('Comment must have text'); - } - - return new $className( - $value['text'], - $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1, - $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1 - ); - } - - private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass { - if (!isset($this->reflectionClassCache[$nodeType])) { - $className = $this->classNameFromNodeType($nodeType); - $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className); - } - return $this->reflectionClassCache[$nodeType]; - } - - private function classNameFromNodeType(string $nodeType) : string { - $className = 'PhpParser\\Node\\' . strtr($nodeType, '_', '\\'); - if (class_exists($className)) { - return $className; - } - - $className .= '_'; - if (class_exists($className)) { - return $className; - } - - throw new \RuntimeException("Unknown node type \"$nodeType\""); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer.php deleted file mode 100644 index e15dd0a5..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer.php +++ /dev/null @@ -1,560 +0,0 @@ -defineCompatibilityTokens(); - $this->tokenMap = $this->createTokenMap(); - $this->identifierTokens = $this->createIdentifierTokenMap(); - - // map of tokens to drop while lexing (the map is only used for isset lookup, - // that's why the value is simply set to 1; the value is never actually used.) - $this->dropTokens = array_fill_keys( - [\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], 1 - ); - - $defaultAttributes = ['comments', 'startLine', 'endLine']; - $usedAttributes = array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, true); - - // Create individual boolean properties to make these checks faster. - $this->attributeStartLineUsed = isset($usedAttributes['startLine']); - $this->attributeEndLineUsed = isset($usedAttributes['endLine']); - $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']); - $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']); - $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']); - $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']); - $this->attributeCommentsUsed = isset($usedAttributes['comments']); - } - - /** - * Initializes the lexer for lexing the provided source code. - * - * This function does not throw if lexing errors occur. Instead, errors may be retrieved using - * the getErrors() method. - * - * @param string $code The source code to lex - * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to - * ErrorHandler\Throwing - */ - public function startLexing(string $code, ErrorHandler $errorHandler = null) { - if (null === $errorHandler) { - $errorHandler = new ErrorHandler\Throwing(); - } - - $this->code = $code; // keep the code around for __halt_compiler() handling - $this->pos = -1; - $this->line = 1; - $this->filePos = 0; - - // If inline HTML occurs without preceding code, treat it as if it had a leading newline. - // This ensures proper composability, because having a newline is the "safe" assumption. - $this->prevCloseTagHasNewline = true; - - $scream = ini_set('xdebug.scream', '0'); - - $this->tokens = @token_get_all($code); - $this->postprocessTokens($errorHandler); - - if (false !== $scream) { - ini_set('xdebug.scream', $scream); - } - } - - private function handleInvalidCharacterRange($start, $end, $line, ErrorHandler $errorHandler) { - $tokens = []; - for ($i = $start; $i < $end; $i++) { - $chr = $this->code[$i]; - if ($chr === "\0") { - // PHP cuts error message after null byte, so need special case - $errorMsg = 'Unexpected null byte'; - } else { - $errorMsg = sprintf( - 'Unexpected character "%s" (ASCII %d)', $chr, ord($chr) - ); - } - - $tokens[] = [\T_BAD_CHARACTER, $chr, $line]; - $errorHandler->handleError(new Error($errorMsg, [ - 'startLine' => $line, - 'endLine' => $line, - 'startFilePos' => $i, - 'endFilePos' => $i, - ])); - } - return $tokens; - } - - /** - * Check whether comment token is unterminated. - * - * @return bool - */ - private function isUnterminatedComment($token) : bool { - return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) - && substr($token[1], 0, 2) === '/*' - && substr($token[1], -2) !== '*/'; - } - - protected function postprocessTokens(ErrorHandler $errorHandler) { - // PHP's error handling for token_get_all() is rather bad, so if we want detailed - // error information we need to compute it ourselves. Invalid character errors are - // detected by finding "gaps" in the token array. Unterminated comments are detected - // by checking if a trailing comment has a "*/" at the end. - // - // Additionally, we perform a number of canonicalizations here: - // * Use the PHP 8.0 comment format, which does not include trailing whitespace anymore. - // * Use PHP 8.0 T_NAME_* tokens. - // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and - // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. - - $filePos = 0; - $line = 1; - $numTokens = \count($this->tokens); - for ($i = 0; $i < $numTokens; $i++) { - $token = $this->tokens[$i]; - - // Since PHP 7.4 invalid characters are represented by a T_BAD_CHARACTER token. - // In this case we only need to emit an error. - if ($token[0] === \T_BAD_CHARACTER) { - $this->handleInvalidCharacterRange($filePos, $filePos + 1, $line, $errorHandler); - } - - if ($token[0] === \T_COMMENT && substr($token[1], 0, 2) !== '/*' - && preg_match('/(\r\n|\n|\r)$/D', $token[1], $matches)) { - $trailingNewline = $matches[0]; - $token[1] = substr($token[1], 0, -strlen($trailingNewline)); - $this->tokens[$i] = $token; - if (isset($this->tokens[$i + 1]) && $this->tokens[$i + 1][0] === \T_WHITESPACE) { - // Move trailing newline into following T_WHITESPACE token, if it already exists. - $this->tokens[$i + 1][1] = $trailingNewline . $this->tokens[$i + 1][1]; - $this->tokens[$i + 1][2]--; - } else { - // Otherwise, we need to create a new T_WHITESPACE token. - array_splice($this->tokens, $i + 1, 0, [ - [\T_WHITESPACE, $trailingNewline, $line], - ]); - $numTokens++; - } - } - - // Emulate PHP 8 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and T_STRING - // into a single token. - if (\is_array($token) - && ($token[0] === \T_NS_SEPARATOR || isset($this->identifierTokens[$token[0]]))) { - $lastWasSeparator = $token[0] === \T_NS_SEPARATOR; - $text = $token[1]; - for ($j = $i + 1; isset($this->tokens[$j]); $j++) { - if ($lastWasSeparator) { - if (!isset($this->identifierTokens[$this->tokens[$j][0]])) { - break; - } - $lastWasSeparator = false; - } else { - if ($this->tokens[$j][0] !== \T_NS_SEPARATOR) { - break; - } - $lastWasSeparator = true; - } - $text .= $this->tokens[$j][1]; - } - if ($lastWasSeparator) { - // Trailing separator is not part of the name. - $j--; - $text = substr($text, 0, -1); - } - if ($j > $i + 1) { - if ($token[0] === \T_NS_SEPARATOR) { - $type = \T_NAME_FULLY_QUALIFIED; - } else if ($token[0] === \T_NAMESPACE) { - $type = \T_NAME_RELATIVE; - } else { - $type = \T_NAME_QUALIFIED; - } - $token = [$type, $text, $line]; - array_splice($this->tokens, $i, $j - $i, [$token]); - $numTokens -= $j - $i - 1; - } - } - - if ($token === '&') { - $next = $i + 1; - while (isset($this->tokens[$next]) && $this->tokens[$next][0] === \T_WHITESPACE) { - $next++; - } - $followedByVarOrVarArg = isset($this->tokens[$next]) && - ($this->tokens[$next][0] === \T_VARIABLE || $this->tokens[$next][0] === \T_ELLIPSIS); - $this->tokens[$i] = $token = [ - $followedByVarOrVarArg - ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG - : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG, - '&', - $line, - ]; - } - - $tokenValue = \is_string($token) ? $token : $token[1]; - $tokenLen = \strlen($tokenValue); - - if (substr($this->code, $filePos, $tokenLen) !== $tokenValue) { - // Something is missing, must be an invalid character - $nextFilePos = strpos($this->code, $tokenValue, $filePos); - $badCharTokens = $this->handleInvalidCharacterRange( - $filePos, $nextFilePos, $line, $errorHandler); - $filePos = (int) $nextFilePos; - - array_splice($this->tokens, $i, 0, $badCharTokens); - $numTokens += \count($badCharTokens); - $i += \count($badCharTokens); - } - - $filePos += $tokenLen; - $line += substr_count($tokenValue, "\n"); - } - - if ($filePos !== \strlen($this->code)) { - if (substr($this->code, $filePos, 2) === '/*') { - // Unlike PHP, HHVM will drop unterminated comments entirely - $comment = substr($this->code, $filePos); - $errorHandler->handleError(new Error('Unterminated comment', [ - 'startLine' => $line, - 'endLine' => $line + substr_count($comment, "\n"), - 'startFilePos' => $filePos, - 'endFilePos' => $filePos + \strlen($comment), - ])); - - // Emulate the PHP behavior - $isDocComment = isset($comment[3]) && $comment[3] === '*'; - $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line]; - } else { - // Invalid characters at the end of the input - $badCharTokens = $this->handleInvalidCharacterRange( - $filePos, \strlen($this->code), $line, $errorHandler); - $this->tokens = array_merge($this->tokens, $badCharTokens); - } - return; - } - - if (count($this->tokens) > 0) { - // Check for unterminated comment - $lastToken = $this->tokens[count($this->tokens) - 1]; - if ($this->isUnterminatedComment($lastToken)) { - $errorHandler->handleError(new Error('Unterminated comment', [ - 'startLine' => $line - substr_count($lastToken[1], "\n"), - 'endLine' => $line, - 'startFilePos' => $filePos - \strlen($lastToken[1]), - 'endFilePos' => $filePos, - ])); - } - } - } - - /** - * Fetches the next token. - * - * The available attributes are determined by the 'usedAttributes' option, which can - * be specified in the constructor. The following attributes are supported: - * - * * 'comments' => Array of PhpParser\Comment or PhpParser\Comment\Doc instances, - * representing all comments that occurred between the previous - * non-discarded token and the current one. - * * 'startLine' => Line in which the node starts. - * * 'endLine' => Line in which the node ends. - * * 'startTokenPos' => Offset into the token array of the first token in the node. - * * 'endTokenPos' => Offset into the token array of the last token in the node. - * * 'startFilePos' => Offset into the code string of the first character that is part of the node. - * * 'endFilePos' => Offset into the code string of the last character that is part of the node. - * - * @param mixed $value Variable to store token content in - * @param mixed $startAttributes Variable to store start attributes in - * @param mixed $endAttributes Variable to store end attributes in - * - * @return int Token id - */ - public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int { - $startAttributes = []; - $endAttributes = []; - - while (1) { - if (isset($this->tokens[++$this->pos])) { - $token = $this->tokens[$this->pos]; - } else { - // EOF token with ID 0 - $token = "\0"; - } - - if ($this->attributeStartLineUsed) { - $startAttributes['startLine'] = $this->line; - } - if ($this->attributeStartTokenPosUsed) { - $startAttributes['startTokenPos'] = $this->pos; - } - if ($this->attributeStartFilePosUsed) { - $startAttributes['startFilePos'] = $this->filePos; - } - - if (\is_string($token)) { - $value = $token; - if (isset($token[1])) { - // bug in token_get_all - $this->filePos += 2; - $id = ord('"'); - } else { - $this->filePos += 1; - $id = ord($token); - } - } elseif (!isset($this->dropTokens[$token[0]])) { - $value = $token[1]; - $id = $this->tokenMap[$token[0]]; - if (\T_CLOSE_TAG === $token[0]) { - $this->prevCloseTagHasNewline = false !== strpos($token[1], "\n") - || false !== strpos($token[1], "\r"); - } elseif (\T_INLINE_HTML === $token[0]) { - $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline; - } - - $this->line += substr_count($value, "\n"); - $this->filePos += \strlen($value); - } else { - $origLine = $this->line; - $origFilePos = $this->filePos; - $this->line += substr_count($token[1], "\n"); - $this->filePos += \strlen($token[1]); - - if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) { - if ($this->attributeCommentsUsed) { - $comment = \T_DOC_COMMENT === $token[0] - ? new Comment\Doc($token[1], - $origLine, $origFilePos, $this->pos, - $this->line, $this->filePos - 1, $this->pos) - : new Comment($token[1], - $origLine, $origFilePos, $this->pos, - $this->line, $this->filePos - 1, $this->pos); - $startAttributes['comments'][] = $comment; - } - } - continue; - } - - if ($this->attributeEndLineUsed) { - $endAttributes['endLine'] = $this->line; - } - if ($this->attributeEndTokenPosUsed) { - $endAttributes['endTokenPos'] = $this->pos; - } - if ($this->attributeEndFilePosUsed) { - $endAttributes['endFilePos'] = $this->filePos - 1; - } - - return $id; - } - - throw new \RuntimeException('Reached end of lexer loop'); - } - - /** - * Returns the token array for current code. - * - * The token array is in the same format as provided by the - * token_get_all() function and does not discard tokens (i.e. - * whitespace and comments are included). The token position - * attributes are against this token array. - * - * @return array Array of tokens in token_get_all() format - */ - public function getTokens() : array { - return $this->tokens; - } - - /** - * Handles __halt_compiler() by returning the text after it. - * - * @return string Remaining text - */ - public function handleHaltCompiler() : string { - // text after T_HALT_COMPILER, still including (); - $textAfter = substr($this->code, $this->filePos); - - // ensure that it is followed by (); - // this simplifies the situation, by not allowing any comments - // in between of the tokens. - if (!preg_match('~^\s*\(\s*\)\s*(?:;|\?>\r?\n?)~', $textAfter, $matches)) { - throw new Error('__HALT_COMPILER must be followed by "();"'); - } - - // prevent the lexer from returning any further tokens - $this->pos = count($this->tokens); - - // return with (); removed - return substr($textAfter, strlen($matches[0])); - } - - private function defineCompatibilityTokens() { - static $compatTokensDefined = false; - if ($compatTokensDefined) { - return; - } - - $compatTokens = [ - // PHP 7.4 - 'T_BAD_CHARACTER', - 'T_FN', - 'T_COALESCE_EQUAL', - // PHP 8.0 - 'T_NAME_QUALIFIED', - 'T_NAME_FULLY_QUALIFIED', - 'T_NAME_RELATIVE', - 'T_MATCH', - 'T_NULLSAFE_OBJECT_OPERATOR', - 'T_ATTRIBUTE', - // PHP 8.1 - 'T_ENUM', - 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', - 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', - 'T_READONLY', - ]; - - // PHP-Parser might be used together with another library that also emulates some or all - // of these tokens. Perform a sanity-check that all already defined tokens have been - // assigned a unique ID. - $usedTokenIds = []; - foreach ($compatTokens as $token) { - if (\defined($token)) { - $tokenId = \constant($token); - $clashingToken = $usedTokenIds[$tokenId] ?? null; - if ($clashingToken !== null) { - throw new \Error(sprintf( - 'Token %s has same ID as token %s, ' . - 'you may be using a library with broken token emulation', - $token, $clashingToken - )); - } - $usedTokenIds[$tokenId] = $token; - } - } - - // Now define any tokens that have not yet been emulated. Try to assign IDs from -1 - // downwards, but skip any IDs that may already be in use. - $newTokenId = -1; - foreach ($compatTokens as $token) { - if (!\defined($token)) { - while (isset($usedTokenIds[$newTokenId])) { - $newTokenId--; - } - \define($token, $newTokenId); - $newTokenId--; - } - } - - $compatTokensDefined = true; - } - - /** - * Creates the token map. - * - * The token map maps the PHP internal token identifiers - * to the identifiers used by the Parser. Additionally it - * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. - * - * @return array The token map - */ - protected function createTokenMap() : array { - $tokenMap = []; - - // 256 is the minimum possible token number, as everything below - // it is an ASCII value - for ($i = 256; $i < 1000; ++$i) { - if (\T_DOUBLE_COLON === $i) { - // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM - $tokenMap[$i] = Tokens::T_PAAMAYIM_NEKUDOTAYIM; - } elseif(\T_OPEN_TAG_WITH_ECHO === $i) { - // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO - $tokenMap[$i] = Tokens::T_ECHO; - } elseif(\T_CLOSE_TAG === $i) { - // T_CLOSE_TAG is equivalent to ';' - $tokenMap[$i] = ord(';'); - } elseif ('UNKNOWN' !== $name = token_name($i)) { - if ('T_HASHBANG' === $name) { - // HHVM uses a special token for #! hashbang lines - $tokenMap[$i] = Tokens::T_INLINE_HTML; - } elseif (defined($name = Tokens::class . '::' . $name)) { - // Other tokens can be mapped directly - $tokenMap[$i] = constant($name); - } - } - } - - // HHVM uses a special token for numbers that overflow to double - if (defined('T_ONUMBER')) { - $tokenMap[\T_ONUMBER] = Tokens::T_DNUMBER; - } - // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant - if (defined('T_COMPILER_HALT_OFFSET')) { - $tokenMap[\T_COMPILER_HALT_OFFSET] = Tokens::T_STRING; - } - - // Assign tokens for which we define compatibility constants, as token_name() does not know them. - $tokenMap[\T_FN] = Tokens::T_FN; - $tokenMap[\T_COALESCE_EQUAL] = Tokens::T_COALESCE_EQUAL; - $tokenMap[\T_NAME_QUALIFIED] = Tokens::T_NAME_QUALIFIED; - $tokenMap[\T_NAME_FULLY_QUALIFIED] = Tokens::T_NAME_FULLY_QUALIFIED; - $tokenMap[\T_NAME_RELATIVE] = Tokens::T_NAME_RELATIVE; - $tokenMap[\T_MATCH] = Tokens::T_MATCH; - $tokenMap[\T_NULLSAFE_OBJECT_OPERATOR] = Tokens::T_NULLSAFE_OBJECT_OPERATOR; - $tokenMap[\T_ATTRIBUTE] = Tokens::T_ATTRIBUTE; - $tokenMap[\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; - $tokenMap[\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG; - $tokenMap[\T_ENUM] = Tokens::T_ENUM; - $tokenMap[\T_READONLY] = Tokens::T_READONLY; - - return $tokenMap; - } - - private function createIdentifierTokenMap(): array { - // Based on semi_reserved production. - return array_fill_keys([ - \T_STRING, - \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, - \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, - \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, - \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, - \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, - \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, - \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, - \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, - \T_MATCH, - ], true); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php deleted file mode 100644 index 5c56e026..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php +++ /dev/null @@ -1,248 +0,0 @@ -targetPhpVersion = $options['phpVersion'] ?? Emulative::PHP_8_1; - unset($options['phpVersion']); - - parent::__construct($options); - - $emulators = [ - new FlexibleDocStringEmulator(), - new FnTokenEmulator(), - new MatchTokenEmulator(), - new CoaleseEqualTokenEmulator(), - new NumericLiteralSeparatorEmulator(), - new NullsafeTokenEmulator(), - new AttributeEmulator(), - new EnumTokenEmulator(), - new ReadonlyTokenEmulator(), - new ExplicitOctalEmulator(), - ]; - - // Collect emulators that are relevant for the PHP version we're running - // and the PHP version we're targeting for emulation. - foreach ($emulators as $emulator) { - $emulatorPhpVersion = $emulator->getPhpVersion(); - if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) { - $this->emulators[] = $emulator; - } else if ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { - $this->emulators[] = new ReverseEmulator($emulator); - } - } - } - - public function startLexing(string $code, ErrorHandler $errorHandler = null) { - $emulators = array_filter($this->emulators, function($emulator) use($code) { - return $emulator->isEmulationNeeded($code); - }); - - if (empty($emulators)) { - // Nothing to emulate, yay - parent::startLexing($code, $errorHandler); - return; - } - - $this->patches = []; - foreach ($emulators as $emulator) { - $code = $emulator->preprocessCode($code, $this->patches); - } - - $collector = new ErrorHandler\Collecting(); - parent::startLexing($code, $collector); - $this->sortPatches(); - $this->fixupTokens(); - - $errors = $collector->getErrors(); - if (!empty($errors)) { - $this->fixupErrors($errors); - foreach ($errors as $error) { - $errorHandler->handleError($error); - } - } - - foreach ($emulators as $emulator) { - $this->tokens = $emulator->emulate($code, $this->tokens); - } - } - - private function isForwardEmulationNeeded(string $emulatorPhpVersion): bool { - return version_compare(\PHP_VERSION, $emulatorPhpVersion, '<') - && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '>='); - } - - private function isReverseEmulationNeeded(string $emulatorPhpVersion): bool { - return version_compare(\PHP_VERSION, $emulatorPhpVersion, '>=') - && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '<'); - } - - private function sortPatches() - { - // Patches may be contributed by different emulators. - // Make sure they are sorted by increasing patch position. - usort($this->patches, function($p1, $p2) { - return $p1[0] <=> $p2[0]; - }); - } - - private function fixupTokens() - { - if (\count($this->patches) === 0) { - return; - } - - // Load first patch - $patchIdx = 0; - - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - - // We use a manual loop over the tokens, because we modify the array on the fly - $pos = 0; - for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) { - $token = $this->tokens[$i]; - if (\is_string($token)) { - if ($patchPos === $pos) { - // Only support replacement for string tokens. - assert($patchType === 'replace'); - $this->tokens[$i] = $patchText; - - // Fetch the next patch - $patchIdx++; - if ($patchIdx >= \count($this->patches)) { - // No more patches, we're done - return; - } - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - } - - $pos += \strlen($token); - continue; - } - - $len = \strlen($token[1]); - $posDelta = 0; - while ($patchPos >= $pos && $patchPos < $pos + $len) { - $patchTextLen = \strlen($patchText); - if ($patchType === 'remove') { - if ($patchPos === $pos && $patchTextLen === $len) { - // Remove token entirely - array_splice($this->tokens, $i, 1, []); - $i--; - $c--; - } else { - // Remove from token string - $this->tokens[$i][1] = substr_replace( - $token[1], '', $patchPos - $pos + $posDelta, $patchTextLen - ); - $posDelta -= $patchTextLen; - } - } elseif ($patchType === 'add') { - // Insert into the token string - $this->tokens[$i][1] = substr_replace( - $token[1], $patchText, $patchPos - $pos + $posDelta, 0 - ); - $posDelta += $patchTextLen; - } else if ($patchType === 'replace') { - // Replace inside the token string - $this->tokens[$i][1] = substr_replace( - $token[1], $patchText, $patchPos - $pos + $posDelta, $patchTextLen - ); - } else { - assert(false); - } - - // Fetch the next patch - $patchIdx++; - if ($patchIdx >= \count($this->patches)) { - // No more patches, we're done - return; - } - - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - - // Multiple patches may apply to the same token. Reload the current one to check - // If the new patch applies - $token = $this->tokens[$i]; - } - - $pos += $len; - } - - // A patch did not apply - assert(false); - } - - /** - * Fixup line and position information in errors. - * - * @param Error[] $errors - */ - private function fixupErrors(array $errors) { - foreach ($errors as $error) { - $attrs = $error->getAttributes(); - - $posDelta = 0; - $lineDelta = 0; - foreach ($this->patches as $patch) { - list($patchPos, $patchType, $patchText) = $patch; - if ($patchPos >= $attrs['startFilePos']) { - // No longer relevant - break; - } - - if ($patchType === 'add') { - $posDelta += strlen($patchText); - $lineDelta += substr_count($patchText, "\n"); - } else if ($patchType === 'remove') { - $posDelta -= strlen($patchText); - $lineDelta -= substr_count($patchText, "\n"); - } - } - - $attrs['startFilePos'] += $posDelta; - $attrs['endFilePos'] += $posDelta; - $attrs['startLine'] += $lineDelta; - $attrs['endLine'] += $lineDelta; - $error->setAttributes($attrs); - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php deleted file mode 100644 index 6776a519..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php +++ /dev/null @@ -1,56 +0,0 @@ -resolveIntegerOrFloatToken($tokens[$i + 1][1]); - array_splice($tokens, $i, 2, [ - [$tokenKind, '0' . $tokens[$i + 1][1], $tokens[$i][2]], - ]); - $c--; - } - } - return $tokens; - } - - private function resolveIntegerOrFloatToken(string $str): int - { - $str = substr($str, 1); - $str = str_replace('_', '', $str); - $num = octdec($str); - return is_float($num) ? \T_DNUMBER : \T_LNUMBER; - } - - public function reverseEmulate(string $code, array $tokens): array { - // Explicit octals were not legal code previously, don't bother. - return $tokens; - } -} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php deleted file mode 100644 index c15d6271..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php +++ /dev/null @@ -1,76 +0,0 @@ -\h*)\2(?![a-zA-Z0-9_\x80-\xff])(?(?:;?[\r\n])?)/x -REGEX; - - public function getPhpVersion(): string - { - return Emulative::PHP_7_3; - } - - public function isEmulationNeeded(string $code) : bool - { - return strpos($code, '<<<') !== false; - } - - public function emulate(string $code, array $tokens): array - { - // Handled by preprocessing + fixup. - return $tokens; - } - - public function reverseEmulate(string $code, array $tokens): array - { - // Not supported. - return $tokens; - } - - public function preprocessCode(string $code, array &$patches): string { - if (!preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE)) { - // No heredoc/nowdoc found - return $code; - } - - // Keep track of how much we need to adjust string offsets due to the modifications we - // already made - $posDelta = 0; - foreach ($matches as $match) { - $indentation = $match['indentation'][0]; - $indentationStart = $match['indentation'][1]; - - $separator = $match['separator'][0]; - $separatorStart = $match['separator'][1]; - - if ($indentation === '' && $separator !== '') { - // Ordinary heredoc/nowdoc - continue; - } - - if ($indentation !== '') { - // Remove indentation - $indentationLen = strlen($indentation); - $code = substr_replace($code, '', $indentationStart + $posDelta, $indentationLen); - $patches[] = [$indentationStart + $posDelta, 'add', $indentation]; - $posDelta -= $indentationLen; - } - - if ($separator === '') { - // Insert newline as separator - $code = substr_replace($code, "\n", $separatorStart + $posDelta, 0); - $patches[] = [$separatorStart + $posDelta, 'remove', "\n"]; - $posDelta += 1; - } - } - - return $code; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php deleted file mode 100644 index eb7e4963..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php +++ /dev/null @@ -1,23 +0,0 @@ -getKeywordString()) !== false; - } - - protected function isKeywordContext(array $tokens, int $pos): bool - { - $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos); - return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR; - } - - public function emulate(string $code, array $tokens): array - { - $keywordString = $this->getKeywordString(); - foreach ($tokens as $i => $token) { - if ($token[0] === T_STRING && strtolower($token[1]) === $keywordString - && $this->isKeywordContext($tokens, $i)) { - $tokens[$i][0] = $this->getKeywordToken(); - } - } - - return $tokens; - } - - /** - * @param mixed[] $tokens - * @return mixed[]|null - */ - private function getPreviousNonSpaceToken(array $tokens, int $start) - { - for ($i = $start - 1; $i >= 0; --$i) { - if ($tokens[$i][0] === T_WHITESPACE) { - continue; - } - - return $tokens[$i]; - } - - return null; - } - - public function reverseEmulate(string $code, array $tokens): array - { - $keywordToken = $this->getKeywordToken(); - foreach ($tokens as $i => $token) { - if ($token[0] === $keywordToken) { - $tokens[$i][0] = \T_STRING; - } - } - - return $tokens; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php deleted file mode 100644 index 902a46df..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php +++ /dev/null @@ -1,23 +0,0 @@ -') !== false; - } - - public function emulate(string $code, array $tokens): array - { - // We need to manually iterate and manage a count because we'll change - // the tokens array on the way - $line = 1; - for ($i = 0, $c = count($tokens); $i < $c; ++$i) { - if ($tokens[$i] === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR) { - array_splice($tokens, $i, 2, [ - [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line] - ]); - $c--; - continue; - } - - // Handle ?-> inside encapsed string. - if ($tokens[$i][0] === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) - && $tokens[$i - 1][0] === \T_VARIABLE - && preg_match('/^\?->([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)/', $tokens[$i][1], $matches) - ) { - $replacement = [ - [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line], - [\T_STRING, $matches[1], $line], - ]; - if (\strlen($matches[0]) !== \strlen($tokens[$i][1])) { - $replacement[] = [ - \T_ENCAPSED_AND_WHITESPACE, - \substr($tokens[$i][1], \strlen($matches[0])), - $line - ]; - } - array_splice($tokens, $i, 1, $replacement); - $c += \count($replacement) - 1; - continue; - } - - if (\is_array($tokens[$i])) { - $line += substr_count($tokens[$i][1], "\n"); - } - } - - return $tokens; - } - - public function reverseEmulate(string $code, array $tokens): array - { - // ?-> was not valid code previously, don't bother. - return $tokens; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php deleted file mode 100644 index cdf793e4..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php +++ /dev/null @@ -1,105 +0,0 @@ -resolveIntegerOrFloatToken($match); - $newTokens = [[$tokenKind, $match, $token[2]]]; - - $numTokens = 1; - $len = $tokenLen; - while ($matchLen > $len) { - $nextToken = $tokens[$i + $numTokens]; - $nextTokenText = \is_array($nextToken) ? $nextToken[1] : $nextToken; - $nextTokenLen = \strlen($nextTokenText); - - $numTokens++; - if ($matchLen < $len + $nextTokenLen) { - // Split trailing characters into a partial token. - assert(is_array($nextToken), "Partial token should be an array token"); - $partialText = substr($nextTokenText, $matchLen - $len); - $newTokens[] = [$nextToken[0], $partialText, $nextToken[2]]; - break; - } - - $len += $nextTokenLen; - } - - array_splice($tokens, $i, $numTokens, $newTokens); - $c -= $numTokens - \count($newTokens); - $codeOffset += $matchLen; - } - - return $tokens; - } - - private function resolveIntegerOrFloatToken(string $str): int - { - $str = str_replace('_', '', $str); - - if (stripos($str, '0b') === 0) { - $num = bindec($str); - } elseif (stripos($str, '0x') === 0) { - $num = hexdec($str); - } elseif (stripos($str, '0') === 0 && ctype_digit($str)) { - $num = octdec($str); - } else { - $num = +$str; - } - - return is_float($num) ? T_DNUMBER : T_LNUMBER; - } - - public function reverseEmulate(string $code, array $tokens): array - { - // Numeric separators were not legal code previously, don't bother. - return $tokens; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php deleted file mode 100644 index b97f8d11..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php +++ /dev/null @@ -1,23 +0,0 @@ -emulator = $emulator; - } - - public function getPhpVersion(): string { - return $this->emulator->getPhpVersion(); - } - - public function isEmulationNeeded(string $code): bool { - return $this->emulator->isEmulationNeeded($code); - } - - public function emulate(string $code, array $tokens): array { - return $this->emulator->reverseEmulate($code, $tokens); - } - - public function reverseEmulate(string $code, array $tokens): array { - return $this->emulator->emulate($code, $tokens); - } - - public function preprocessCode(string $code, array &$patches): string { - return $code; - } -} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php deleted file mode 100644 index a020bc0f..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php +++ /dev/null @@ -1,25 +0,0 @@ - [aliasName => originalName]] */ - protected $aliases = []; - - /** @var Name[][] Same as $aliases but preserving original case */ - protected $origAliases = []; - - /** @var ErrorHandler Error handler */ - protected $errorHandler; - - /** - * Create a name context. - * - * @param ErrorHandler $errorHandler Error handling used to report errors - */ - public function __construct(ErrorHandler $errorHandler) { - $this->errorHandler = $errorHandler; - } - - /** - * Start a new namespace. - * - * This also resets the alias table. - * - * @param Name|null $namespace Null is the global namespace - */ - public function startNamespace(Name $namespace = null) { - $this->namespace = $namespace; - $this->origAliases = $this->aliases = [ - Stmt\Use_::TYPE_NORMAL => [], - Stmt\Use_::TYPE_FUNCTION => [], - Stmt\Use_::TYPE_CONSTANT => [], - ]; - } - - /** - * Add an alias / import. - * - * @param Name $name Original name - * @param string $aliasName Aliased name - * @param int $type One of Stmt\Use_::TYPE_* - * @param array $errorAttrs Attributes to use to report an error - */ - public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) { - // Constant names are case sensitive, everything else case insensitive - if ($type === Stmt\Use_::TYPE_CONSTANT) { - $aliasLookupName = $aliasName; - } else { - $aliasLookupName = strtolower($aliasName); - } - - if (isset($this->aliases[$type][$aliasLookupName])) { - $typeStringMap = [ - Stmt\Use_::TYPE_NORMAL => '', - Stmt\Use_::TYPE_FUNCTION => 'function ', - Stmt\Use_::TYPE_CONSTANT => 'const ', - ]; - - $this->errorHandler->handleError(new Error( - sprintf( - 'Cannot use %s%s as %s because the name is already in use', - $typeStringMap[$type], $name, $aliasName - ), - $errorAttrs - )); - return; - } - - $this->aliases[$type][$aliasLookupName] = $name; - $this->origAliases[$type][$aliasName] = $name; - } - - /** - * Get current namespace. - * - * @return null|Name Namespace (or null if global namespace) - */ - public function getNamespace() { - return $this->namespace; - } - - /** - * Get resolved name. - * - * @param Name $name Name to resolve - * @param int $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} - * - * @return null|Name Resolved name, or null if static resolution is not possible - */ - public function getResolvedName(Name $name, int $type) { - // don't resolve special class names - if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) { - if (!$name->isUnqualified()) { - $this->errorHandler->handleError(new Error( - sprintf("'\\%s' is an invalid class name", $name->toString()), - $name->getAttributes() - )); - } - return $name; - } - - // fully qualified names are already resolved - if ($name->isFullyQualified()) { - return $name; - } - - // Try to resolve aliases - if (null !== $resolvedName = $this->resolveAlias($name, $type)) { - return $resolvedName; - } - - if ($type !== Stmt\Use_::TYPE_NORMAL && $name->isUnqualified()) { - if (null === $this->namespace) { - // outside of a namespace unaliased unqualified is same as fully qualified - return new FullyQualified($name, $name->getAttributes()); - } - - // Cannot resolve statically - return null; - } - - // if no alias exists prepend current namespace - return FullyQualified::concat($this->namespace, $name, $name->getAttributes()); - } - - /** - * Get resolved class name. - * - * @param Name $name Class ame to resolve - * - * @return Name Resolved name - */ - public function getResolvedClassName(Name $name) : Name { - return $this->getResolvedName($name, Stmt\Use_::TYPE_NORMAL); - } - - /** - * Get possible ways of writing a fully qualified name (e.g., by making use of aliases). - * - * @param string $name Fully-qualified name (without leading namespace separator) - * @param int $type One of Stmt\Use_::TYPE_* - * - * @return Name[] Possible representations of the name - */ - public function getPossibleNames(string $name, int $type) : array { - $lcName = strtolower($name); - - if ($type === Stmt\Use_::TYPE_NORMAL) { - // self, parent and static must always be unqualified - if ($lcName === "self" || $lcName === "parent" || $lcName === "static") { - return [new Name($name)]; - } - } - - // Collect possible ways to write this name, starting with the fully-qualified name - $possibleNames = [new FullyQualified($name)]; - - if (null !== $nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type)) { - // Make sure there is no alias that makes the normally namespace-relative name - // into something else - if (null === $this->resolveAlias($nsRelativeName, $type)) { - $possibleNames[] = $nsRelativeName; - } - } - - // Check for relevant namespace use statements - foreach ($this->origAliases[Stmt\Use_::TYPE_NORMAL] as $alias => $orig) { - $lcOrig = $orig->toLowerString(); - if (0 === strpos($lcName, $lcOrig . '\\')) { - $possibleNames[] = new Name($alias . substr($name, strlen($lcOrig))); - } - } - - // Check for relevant type-specific use statements - foreach ($this->origAliases[$type] as $alias => $orig) { - if ($type === Stmt\Use_::TYPE_CONSTANT) { - // Constants are are complicated-sensitive - $normalizedOrig = $this->normalizeConstName($orig->toString()); - if ($normalizedOrig === $this->normalizeConstName($name)) { - $possibleNames[] = new Name($alias); - } - } else { - // Everything else is case-insensitive - if ($orig->toLowerString() === $lcName) { - $possibleNames[] = new Name($alias); - } - } - } - - return $possibleNames; - } - - /** - * Get shortest representation of this fully-qualified name. - * - * @param string $name Fully-qualified name (without leading namespace separator) - * @param int $type One of Stmt\Use_::TYPE_* - * - * @return Name Shortest representation - */ - public function getShortName(string $name, int $type) : Name { - $possibleNames = $this->getPossibleNames($name, $type); - - // Find shortest name - $shortestName = null; - $shortestLength = \INF; - foreach ($possibleNames as $possibleName) { - $length = strlen($possibleName->toCodeString()); - if ($length < $shortestLength) { - $shortestName = $possibleName; - $shortestLength = $length; - } - } - - return $shortestName; - } - - private function resolveAlias(Name $name, $type) { - $firstPart = $name->getFirst(); - - if ($name->isQualified()) { - // resolve aliases for qualified names, always against class alias table - $checkName = strtolower($firstPart); - if (isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName])) { - $alias = $this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName]; - return FullyQualified::concat($alias, $name->slice(1), $name->getAttributes()); - } - } elseif ($name->isUnqualified()) { - // constant aliases are case-sensitive, function aliases case-insensitive - $checkName = $type === Stmt\Use_::TYPE_CONSTANT ? $firstPart : strtolower($firstPart); - if (isset($this->aliases[$type][$checkName])) { - // resolve unqualified aliases - return new FullyQualified($this->aliases[$type][$checkName], $name->getAttributes()); - } - } - - // No applicable aliases - return null; - } - - private function getNamespaceRelativeName(string $name, string $lcName, int $type) { - if (null === $this->namespace) { - return new Name($name); - } - - if ($type === Stmt\Use_::TYPE_CONSTANT) { - // The constants true/false/null always resolve to the global symbols, even inside a - // namespace, so they may be used without qualification - if ($lcName === "true" || $lcName === "false" || $lcName === "null") { - return new Name($name); - } - } - - $namespacePrefix = strtolower($this->namespace . '\\'); - if (0 === strpos($lcName, $namespacePrefix)) { - return new Name(substr($name, strlen($namespacePrefix))); - } - - return null; - } - - private function normalizeConstName(string $name) { - $nsSep = strrpos($name, '\\'); - if (false === $nsSep) { - return $name; - } - - // Constants have case-insensitive namespace and case-sensitive short-name - $ns = substr($name, 0, $nsSep); - $shortName = substr($name, $nsSep + 1); - return strtolower($ns) . '\\' . $shortName; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node.php b/vendor/nikic/php-parser/lib/PhpParser/Node.php deleted file mode 100644 index befb2565..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node.php +++ /dev/null @@ -1,151 +0,0 @@ -attributes = $attributes; - $this->name = $name; - $this->value = $value; - $this->byRef = $byRef; - $this->unpack = $unpack; - } - - public function getSubNodeNames() : array { - return ['name', 'value', 'byRef', 'unpack']; - } - - public function getType() : string { - return 'Arg'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php deleted file mode 100644 index c96f66e5..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->name = $name; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['name', 'args']; - } - - public function getType() : string { - return 'Attribute'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php b/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php deleted file mode 100644 index 613bfc41..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php +++ /dev/null @@ -1,29 +0,0 @@ -attributes = $attributes; - $this->attrs = $attrs; - } - - public function getSubNodeNames() : array { - return ['attrs']; - } - - public function getType() : string { - return 'AttributeGroup'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php deleted file mode 100644 index 9505532a..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php +++ /dev/null @@ -1,14 +0,0 @@ -attributes = $attributes; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['name', 'value']; - } - - public function getType() : string { - return 'Const'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php deleted file mode 100644 index 6cf4df22..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php +++ /dev/null @@ -1,9 +0,0 @@ -attributes = $attributes; - $this->var = $var; - $this->dim = $dim; - } - - public function getSubNodeNames() : array { - return ['var', 'dim']; - } - - public function getType() : string { - return 'Expr_ArrayDimFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php deleted file mode 100644 index 1b078f82..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php +++ /dev/null @@ -1,41 +0,0 @@ -attributes = $attributes; - $this->key = $key; - $this->value = $value; - $this->byRef = $byRef; - $this->unpack = $unpack; - } - - public function getSubNodeNames() : array { - return ['key', 'value', 'byRef', 'unpack']; - } - - public function getType() : string { - return 'Expr_ArrayItem'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php deleted file mode 100644 index e6eaa283..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->items = $items; - } - - public function getSubNodeNames() : array { - return ['items']; - } - - public function getType() : string { - return 'Expr_Array'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php deleted file mode 100644 index c273fb7e..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php +++ /dev/null @@ -1,79 +0,0 @@ - false : Whether the closure is static - * 'byRef' => false : Whether to return by reference - * 'params' => array() : Parameters - * 'returnType' => null : Return type - * 'expr' => Expr : Expression body - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct(array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->static = $subNodes['static'] ?? false; - $this->byRef = $subNodes['byRef'] ?? false; - $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->expr = $subNodes['expr']; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr']; - } - - public function returnsByRef() : bool { - return $this->byRef; - } - - public function getParams() : array { - return $this->params; - } - - public function getReturnType() { - return $this->returnType; - } - - public function getAttrGroups() : array { - return $this->attrGroups; - } - - /** - * @return Node\Stmt\Return_[] - */ - public function getStmts() : array { - return [new Node\Stmt\Return_($this->expr)]; - } - - public function getType() : string { - return 'Expr_ArrowFunction'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php deleted file mode 100644 index cf9e6e82..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->var = $var; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['var', 'expr']; - } - - public function getType() : string { - return 'Expr_Assign'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php deleted file mode 100644 index bce8604f..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->var = $var; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['var', 'expr']; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php deleted file mode 100644 index 420284cd..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php +++ /dev/null @@ -1,12 +0,0 @@ -attributes = $attributes; - $this->var = $var; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['var', 'expr']; - } - - public function getType() : string { - return 'Expr_AssignRef'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php deleted file mode 100644 index d9c582b0..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php +++ /dev/null @@ -1,40 +0,0 @@ -attributes = $attributes; - $this->left = $left; - $this->right = $right; - } - - public function getSubNodeNames() : array { - return ['left', 'right']; - } - - /** - * Get the operator sigil for this binary operation. - * - * In the case there are multiple possible sigils for an operator, this method does not - * necessarily return the one used in the parsed code. - * - * @return string - */ - abstract public function getOperatorSigil() : string; -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php deleted file mode 100644 index d907393b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php +++ /dev/null @@ -1,16 +0,0 @@ -'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Greater'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php deleted file mode 100644 index d677502c..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php +++ /dev/null @@ -1,16 +0,0 @@ -='; - } - - public function getType() : string { - return 'Expr_BinaryOp_GreaterOrEqual'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php deleted file mode 100644 index 3d96285c..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php +++ /dev/null @@ -1,16 +0,0 @@ ->'; - } - - public function getType() : string { - return 'Expr_BinaryOp_ShiftRight'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php deleted file mode 100644 index 3cb8e7e0..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php +++ /dev/null @@ -1,16 +0,0 @@ -'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Spaceship'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php deleted file mode 100644 index ed44984b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_BitwiseNot'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php deleted file mode 100644 index bf27e9f6..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_BooleanNot'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php deleted file mode 100644 index 78e1cf34..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php +++ /dev/null @@ -1,39 +0,0 @@ - - */ - abstract public function getRawArgs(): array; - - /** - * Returns whether this call expression is actually a first class callable. - */ - public function isFirstClassCallable(): bool { - foreach ($this->getRawArgs() as $arg) { - if ($arg instanceof VariadicPlaceholder) { - return true; - } - } - return false; - } - - /** - * Assert that this is not a first-class callable and return only ordinary Args. - * - * @return Arg[] - */ - public function getArgs(): array { - assert(!$this->isFirstClassCallable()); - return $this->getRawArgs(); - } -} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php deleted file mode 100644 index 36769d4f..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php +++ /dev/null @@ -1,26 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php deleted file mode 100644 index 57cc473b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php +++ /dev/null @@ -1,12 +0,0 @@ -attributes = $attributes; - $this->class = $class; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['class', 'name']; - } - - public function getType() : string { - return 'Expr_ClassConstFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php deleted file mode 100644 index db216b8f..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Clone'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php deleted file mode 100644 index 56ddea6a..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php +++ /dev/null @@ -1,79 +0,0 @@ - false : Whether the closure is static - * 'byRef' => false : Whether to return by reference - * 'params' => array(): Parameters - * 'uses' => array(): use()s - * 'returnType' => null : Return type - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attributes groups - * @param array $attributes Additional attributes - */ - public function __construct(array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->static = $subNodes['static'] ?? false; - $this->byRef = $subNodes['byRef'] ?? false; - $this->params = $subNodes['params'] ?? []; - $this->uses = $subNodes['uses'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts']; - } - - public function returnsByRef() : bool { - return $this->byRef; - } - - public function getParams() : array { - return $this->params; - } - - public function getReturnType() { - return $this->returnType; - } - - /** @return Node\Stmt[] */ - public function getStmts() : array { - return $this->stmts; - } - - public function getAttrGroups() : array { - return $this->attrGroups; - } - - public function getType() : string { - return 'Expr_Closure'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php deleted file mode 100644 index 2b8a0966..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->var = $var; - $this->byRef = $byRef; - } - - public function getSubNodeNames() : array { - return ['var', 'byRef']; - } - - public function getType() : string { - return 'Expr_ClosureUse'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php deleted file mode 100644 index 14ebd16b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php +++ /dev/null @@ -1,31 +0,0 @@ -attributes = $attributes; - $this->name = $name; - } - - public function getSubNodeNames() : array { - return ['name']; - } - - public function getType() : string { - return 'Expr_ConstFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php deleted file mode 100644 index 4042ec93..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Empty'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php deleted file mode 100644 index 1637f3ae..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php +++ /dev/null @@ -1,31 +0,0 @@ -attributes = $attributes; - } - - public function getSubNodeNames() : array { - return []; - } - - public function getType() : string { - return 'Expr_Error'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php deleted file mode 100644 index c44ff6f9..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_ErrorSuppress'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php deleted file mode 100644 index 85685474..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Eval'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php deleted file mode 100644 index b88a8f7e..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Exit'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php deleted file mode 100644 index 2de4d0dd..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php +++ /dev/null @@ -1,39 +0,0 @@ - Arguments */ - public $args; - - /** - * Constructs a function call node. - * - * @param Node\Name|Expr $name Function name - * @param array $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct($name, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->name = $name; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['name', 'args']; - } - - public function getType() : string { - return 'Expr_FuncCall'; - } - - public function getRawArgs(): array { - return $this->args; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php deleted file mode 100644 index 07ce5968..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php +++ /dev/null @@ -1,39 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - $this->type = $type; - } - - public function getSubNodeNames() : array { - return ['expr', 'type']; - } - - public function getType() : string { - return 'Expr_Include'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php deleted file mode 100644 index 9000d47b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php +++ /dev/null @@ -1,35 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - $this->class = $class; - } - - public function getSubNodeNames() : array { - return ['expr', 'class']; - } - - public function getType() : string { - return 'Expr_Instanceof'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php deleted file mode 100644 index 76b73875..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->vars = $vars; - } - - public function getSubNodeNames() : array { - return ['vars']; - } - - public function getType() : string { - return 'Expr_Isset'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php deleted file mode 100644 index c27a27b9..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->items = $items; - } - - public function getSubNodeNames() : array { - return ['items']; - } - - public function getType() : string { - return 'Expr_List'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php deleted file mode 100644 index 2455a302..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php +++ /dev/null @@ -1,31 +0,0 @@ -attributes = $attributes; - $this->cond = $cond; - $this->arms = $arms; - } - - public function getSubNodeNames() : array { - return ['cond', 'arms']; - } - - public function getType() : string { - return 'Expr_Match'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php deleted file mode 100644 index 49ca4835..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php +++ /dev/null @@ -1,45 +0,0 @@ - Arguments */ - public $args; - - /** - * Constructs a function call node. - * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['var', 'name', 'args']; - } - - public function getType() : string { - return 'Expr_MethodCall'; - } - - public function getRawArgs(): array { - return $this->args; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php deleted file mode 100644 index e2bb6492..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php +++ /dev/null @@ -1,41 +0,0 @@ - Arguments */ - public $args; - - /** - * Constructs a function call node. - * - * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) - * @param array $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct($class, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->class = $class; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['class', 'args']; - } - - public function getType() : string { - return 'Expr_New'; - } - - public function getRawArgs(): array { - return $this->args; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php deleted file mode 100644 index 07a571fd..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php +++ /dev/null @@ -1,45 +0,0 @@ - Arguments */ - public $args; - - /** - * Constructs a nullsafe method call node. - * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['var', 'name', 'args']; - } - - public function getType() : string { - return 'Expr_NullsafeMethodCall'; - } - - public function getRawArgs(): array { - return $this->args; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php deleted file mode 100644 index 9317eb3b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php +++ /dev/null @@ -1,35 +0,0 @@ -attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['var', 'name']; - } - - public function getType() : string { - return 'Expr_NullsafePropertyFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php deleted file mode 100644 index 94d6c296..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->var = $var; - } - - public function getSubNodeNames() : array { - return ['var']; - } - - public function getType() : string { - return 'Expr_PostDec'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php deleted file mode 100644 index 005c443a..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->var = $var; - } - - public function getSubNodeNames() : array { - return ['var']; - } - - public function getType() : string { - return 'Expr_PostInc'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php deleted file mode 100644 index a5ca685a..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->var = $var; - } - - public function getSubNodeNames() : array { - return ['var']; - } - - public function getType() : string { - return 'Expr_PreDec'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php deleted file mode 100644 index 0986c447..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->var = $var; - } - - public function getSubNodeNames() : array { - return ['var']; - } - - public function getType() : string { - return 'Expr_PreInc'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php deleted file mode 100644 index 2d43c2ac..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Print'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php deleted file mode 100644 index 4281f31c..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php +++ /dev/null @@ -1,35 +0,0 @@ -attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['var', 'name']; - } - - public function getType() : string { - return 'Expr_PropertyFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php deleted file mode 100644 index 537a7cc8..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->parts = $parts; - } - - public function getSubNodeNames() : array { - return ['parts']; - } - - public function getType() : string { - return 'Expr_ShellExec'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php deleted file mode 100644 index d0d099c4..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php +++ /dev/null @@ -1,46 +0,0 @@ - Arguments */ - public $args; - - /** - * Constructs a static method call node. - * - * @param Node\Name|Expr $class Class name - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct($class, $name, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->class = $class; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['class', 'name', 'args']; - } - - public function getType() : string { - return 'Expr_StaticCall'; - } - - public function getRawArgs(): array { - return $this->args; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php deleted file mode 100644 index 1ee1a25e..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php +++ /dev/null @@ -1,36 +0,0 @@ -attributes = $attributes; - $this->class = $class; - $this->name = \is_string($name) ? new VarLikeIdentifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['class', 'name']; - } - - public function getType() : string { - return 'Expr_StaticPropertyFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php deleted file mode 100644 index 9316f47d..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php +++ /dev/null @@ -1,38 +0,0 @@ -attributes = $attributes; - $this->cond = $cond; - $this->if = $if; - $this->else = $else; - } - - public function getSubNodeNames() : array { - return ['cond', 'if', 'else']; - } - - public function getType() : string { - return 'Expr_Ternary'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php deleted file mode 100644 index 5c97f0e2..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Throw'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php deleted file mode 100644 index ce8808bc..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_UnaryMinus'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php deleted file mode 100644 index d23047e5..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_UnaryPlus'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php deleted file mode 100644 index b47d38e9..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->name = $name; - } - - public function getSubNodeNames() : array { - return ['name']; - } - - public function getType() : string { - return 'Expr_Variable'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php deleted file mode 100644 index a3efce61..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_YieldFrom'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php deleted file mode 100644 index aef8fc33..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->key = $key; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['key', 'value']; - } - - public function getType() : string { - return 'Expr_Yield'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php deleted file mode 100644 index 5a825e73..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php +++ /dev/null @@ -1,43 +0,0 @@ - true, - 'parent' => true, - 'static' => true, - ]; - - /** - * Constructs an identifier node. - * - * @param string $name Identifier as string - * @param array $attributes Additional attributes - */ - public function __construct(string $name, array $attributes = []) { - $this->attributes = $attributes; - $this->name = $name; - } - - public function getSubNodeNames() : array { - return ['name']; - } - - /** - * Get identifier as string. - * - * @return string Identifier as string. - */ - public function toString() : string { - return $this->name; - } - - /** - * Get lowercased identifier as string. - * - * @return string Lowercased identifier as string - */ - public function toLowerString() : string { - return strtolower($this->name); - } - - /** - * Checks whether the identifier is a special class name (self, parent or static). - * - * @return bool Whether identifier is a special class name - */ - public function isSpecialClassName() : bool { - return isset(self::$specialClassNames[strtolower($this->name)]); - } - - /** - * Get identifier as string. - * - * @return string Identifier as string - */ - public function __toString() : string { - return $this->name; - } - - public function getType() : string { - return 'Identifier'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php deleted file mode 100644 index 9208e139..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->types = $types; - } - - public function getSubNodeNames() : array { - return ['types']; - } - - public function getType() : string { - return 'IntersectionType'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php b/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php deleted file mode 100644 index 2ae1c86b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php +++ /dev/null @@ -1,31 +0,0 @@ -conds = $conds; - $this->body = $body; - $this->attributes = $attributes; - } - - public function getSubNodeNames() : array { - return ['conds', 'body']; - } - - public function getType() : string { - return 'MatchArm'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php deleted file mode 100644 index 6b1cc9f8..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php +++ /dev/null @@ -1,242 +0,0 @@ - true, - 'parent' => true, - 'static' => true, - ]; - - /** - * Constructs a name node. - * - * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) - * @param array $attributes Additional attributes - */ - public function __construct($name, array $attributes = []) { - $this->attributes = $attributes; - $this->parts = self::prepareName($name); - } - - public function getSubNodeNames() : array { - return ['parts']; - } - - /** - * Gets the first part of the name, i.e. everything before the first namespace separator. - * - * @return string First part of the name - */ - public function getFirst() : string { - return $this->parts[0]; - } - - /** - * Gets the last part of the name, i.e. everything after the last namespace separator. - * - * @return string Last part of the name - */ - public function getLast() : string { - return $this->parts[count($this->parts) - 1]; - } - - /** - * Checks whether the name is unqualified. (E.g. Name) - * - * @return bool Whether the name is unqualified - */ - public function isUnqualified() : bool { - return 1 === count($this->parts); - } - - /** - * Checks whether the name is qualified. (E.g. Name\Name) - * - * @return bool Whether the name is qualified - */ - public function isQualified() : bool { - return 1 < count($this->parts); - } - - /** - * Checks whether the name is fully qualified. (E.g. \Name) - * - * @return bool Whether the name is fully qualified - */ - public function isFullyQualified() : bool { - return false; - } - - /** - * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) - * - * @return bool Whether the name is relative - */ - public function isRelative() : bool { - return false; - } - - /** - * Returns a string representation of the name itself, without taking the name type into - * account (e.g., not including a leading backslash for fully qualified names). - * - * @return string String representation - */ - public function toString() : string { - return implode('\\', $this->parts); - } - - /** - * Returns a string representation of the name as it would occur in code (e.g., including - * leading backslash for fully qualified names. - * - * @return string String representation - */ - public function toCodeString() : string { - return $this->toString(); - } - - /** - * Returns lowercased string representation of the name, without taking the name type into - * account (e.g., no leading backslash for fully qualified names). - * - * @return string Lowercased string representation - */ - public function toLowerString() : string { - return strtolower(implode('\\', $this->parts)); - } - - /** - * Checks whether the identifier is a special class name (self, parent or static). - * - * @return bool Whether identifier is a special class name - */ - public function isSpecialClassName() : bool { - return count($this->parts) === 1 - && isset(self::$specialClassNames[strtolower($this->parts[0])]); - } - - /** - * Returns a string representation of the name by imploding the namespace parts with the - * namespace separator. - * - * @return string String representation - */ - public function __toString() : string { - return implode('\\', $this->parts); - } - - /** - * Gets a slice of a name (similar to array_slice). - * - * This method returns a new instance of the same type as the original and with the same - * attributes. - * - * If the slice is empty, null is returned. The null value will be correctly handled in - * concatenations using concat(). - * - * Offset and length have the same meaning as in array_slice(). - * - * @param int $offset Offset to start the slice at (may be negative) - * @param int|null $length Length of the slice (may be negative) - * - * @return static|null Sliced name - */ - public function slice(int $offset, int $length = null) { - $numParts = count($this->parts); - - $realOffset = $offset < 0 ? $offset + $numParts : $offset; - if ($realOffset < 0 || $realOffset > $numParts) { - throw new \OutOfBoundsException(sprintf('Offset %d is out of bounds', $offset)); - } - - if (null === $length) { - $realLength = $numParts - $realOffset; - } else { - $realLength = $length < 0 ? $length + $numParts - $realOffset : $length; - if ($realLength < 0 || $realLength > $numParts) { - throw new \OutOfBoundsException(sprintf('Length %d is out of bounds', $length)); - } - } - - if ($realLength === 0) { - // Empty slice is represented as null - return null; - } - - return new static(array_slice($this->parts, $realOffset, $realLength), $this->attributes); - } - - /** - * Concatenate two names, yielding a new Name instance. - * - * The type of the generated instance depends on which class this method is called on, for - * example Name\FullyQualified::concat() will yield a Name\FullyQualified instance. - * - * If one of the arguments is null, a new instance of the other name will be returned. If both - * arguments are null, null will be returned. As such, writing - * Name::concat($namespace, $shortName) - * where $namespace is a Name node or null will work as expected. - * - * @param string|string[]|self|null $name1 The first name - * @param string|string[]|self|null $name2 The second name - * @param array $attributes Attributes to assign to concatenated name - * - * @return static|null Concatenated name - */ - public static function concat($name1, $name2, array $attributes = []) { - if (null === $name1 && null === $name2) { - return null; - } elseif (null === $name1) { - return new static(self::prepareName($name2), $attributes); - } elseif (null === $name2) { - return new static(self::prepareName($name1), $attributes); - } else { - return new static( - array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes - ); - } - } - - /** - * Prepares a (string, array or Name node) name for use in name changing methods by converting - * it to an array. - * - * @param string|string[]|self $name Name to prepare - * - * @return string[] Prepared name - */ - private static function prepareName($name) : array { - if (\is_string($name)) { - if ('' === $name) { - throw new \InvalidArgumentException('Name cannot be empty'); - } - - return explode('\\', $name); - } elseif (\is_array($name)) { - if (empty($name)) { - throw new \InvalidArgumentException('Name cannot be empty'); - } - - return $name; - } elseif ($name instanceof self) { - return $name->parts; - } - - throw new \InvalidArgumentException( - 'Expected string, array of parts or Name instance' - ); - } - - public function getType() : string { - return 'Name'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php deleted file mode 100644 index 1df93a56..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php +++ /dev/null @@ -1,50 +0,0 @@ -toString(); - } - - public function getType() : string { - return 'Name_FullyQualified'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php deleted file mode 100644 index 57bf7af2..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php +++ /dev/null @@ -1,50 +0,0 @@ -toString(); - } - - public function getType() : string { - return 'Name_Relative'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php deleted file mode 100644 index d68e26a3..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php +++ /dev/null @@ -1,28 +0,0 @@ -attributes = $attributes; - $this->type = \is_string($type) ? new Identifier($type) : $type; - } - - public function getSubNodeNames() : array { - return ['type']; - } - - public function getType() : string { - return 'NullableType'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php deleted file mode 100644 index 1e90b794..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php +++ /dev/null @@ -1,60 +0,0 @@ -attributes = $attributes; - $this->type = \is_string($type) ? new Identifier($type) : $type; - $this->byRef = $byRef; - $this->variadic = $variadic; - $this->var = $var; - $this->default = $default; - $this->flags = $flags; - $this->attrGroups = $attrGroups; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default']; - } - - public function getType() : string { - return 'Param'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php deleted file mode 100644 index 8117909b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php +++ /dev/null @@ -1,7 +0,0 @@ -attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - /** - * @param mixed[] $attributes - */ - public static function fromString(string $str, array $attributes = []): DNumber - { - $attributes['rawValue'] = $str; - $float = self::parse($str); - - return new DNumber($float, $attributes); - } - - /** - * @internal - * - * Parses a DNUMBER token like PHP would. - * - * @param string $str A string number - * - * @return float The parsed number - */ - public static function parse(string $str) : float { - $str = str_replace('_', '', $str); - - // if string contains any of .eE just cast it to float - if (false !== strpbrk($str, '.eE')) { - return (float) $str; - } - - // otherwise it's an integer notation that overflowed into a float - // if it starts with 0 it's one of the special integer notations - if ('0' === $str[0]) { - // hex - if ('x' === $str[1] || 'X' === $str[1]) { - return hexdec($str); - } - - // bin - if ('b' === $str[1] || 'B' === $str[1]) { - return bindec($str); - } - - // oct - // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit (8 or 9) - // so that only the digits before that are used - return octdec(substr($str, 0, strcspn($str, '89'))); - } - - // dec - return (float) $str; - } - - public function getType() : string { - return 'Scalar_DNumber'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php deleted file mode 100644 index fa5d2e26..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php +++ /dev/null @@ -1,31 +0,0 @@ -attributes = $attributes; - $this->parts = $parts; - } - - public function getSubNodeNames() : array { - return ['parts']; - } - - public function getType() : string { - return 'Scalar_Encapsed'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php deleted file mode 100644 index bb3194c1..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - public function getType() : string { - return 'Scalar_EncapsedStringPart'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php deleted file mode 100644 index 2cc2b22c..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php +++ /dev/null @@ -1,80 +0,0 @@ -attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - /** - * Constructs an LNumber node from a string number literal. - * - * @param string $str String number literal (decimal, octal, hex or binary) - * @param array $attributes Additional attributes - * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) - * - * @return LNumber The constructed LNumber, including kind attribute - */ - public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false) : LNumber { - $attributes['rawValue'] = $str; - - $str = str_replace('_', '', $str); - - if ('0' !== $str[0] || '0' === $str) { - $attributes['kind'] = LNumber::KIND_DEC; - return new LNumber((int) $str, $attributes); - } - - if ('x' === $str[1] || 'X' === $str[1]) { - $attributes['kind'] = LNumber::KIND_HEX; - return new LNumber(hexdec($str), $attributes); - } - - if ('b' === $str[1] || 'B' === $str[1]) { - $attributes['kind'] = LNumber::KIND_BIN; - return new LNumber(bindec($str), $attributes); - } - - if (!$allowInvalidOctal && strpbrk($str, '89')) { - throw new Error('Invalid numeric literal', $attributes); - } - - // Strip optional explicit octal prefix. - if ('o' === $str[1] || 'O' === $str[1]) { - $str = substr($str, 2); - } - - // use intval instead of octdec to get proper cutting behavior with malformed numbers - $attributes['kind'] = LNumber::KIND_OCT; - return new LNumber(intval($str, 8), $attributes); - } - - public function getType() : string { - return 'Scalar_LNumber'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php deleted file mode 100644 index 941f0c76..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php +++ /dev/null @@ -1,28 +0,0 @@ -attributes = $attributes; - } - - public function getSubNodeNames() : array { - return []; - } - - /** - * Get name of magic constant. - * - * @return string Name of magic constant - */ - abstract public function getName() : string; -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php deleted file mode 100644 index 24432847..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php +++ /dev/null @@ -1,16 +0,0 @@ - '\\', - '$' => '$', - 'n' => "\n", - 'r' => "\r", - 't' => "\t", - 'f' => "\f", - 'v' => "\v", - 'e' => "\x1B", - ]; - - /** - * Constructs a string scalar node. - * - * @param string $value Value of the string - * @param array $attributes Additional attributes - */ - public function __construct(string $value, array $attributes = []) { - $this->attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - /** - * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes - */ - public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self - { - $attributes['kind'] = ($str[0] === "'" || ($str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B'))) - ? Scalar\String_::KIND_SINGLE_QUOTED - : Scalar\String_::KIND_DOUBLE_QUOTED; - - $attributes['rawValue'] = $str; - - $string = self::parse($str, $parseUnicodeEscape); - - return new self($string, $attributes); - } - - /** - * @internal - * - * Parses a string token. - * - * @param string $str String token content - * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes - * - * @return string The parsed string - */ - public static function parse(string $str, bool $parseUnicodeEscape = true) : string { - $bLength = 0; - if ('b' === $str[0] || 'B' === $str[0]) { - $bLength = 1; - } - - if ('\'' === $str[$bLength]) { - return str_replace( - ['\\\\', '\\\''], - ['\\', '\''], - substr($str, $bLength + 1, -1) - ); - } else { - return self::parseEscapeSequences( - substr($str, $bLength + 1, -1), '"', $parseUnicodeEscape - ); - } - } - - /** - * @internal - * - * Parses escape sequences in strings (all string types apart from single quoted). - * - * @param string $str String without quotes - * @param null|string $quote Quote type - * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes - * - * @return string String with escape sequences parsed - */ - public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = true) : string { - if (null !== $quote) { - $str = str_replace('\\' . $quote, $quote, $str); - } - - $extra = ''; - if ($parseUnicodeEscape) { - $extra = '|u\{([0-9a-fA-F]+)\}'; - } - - return preg_replace_callback( - '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~', - function($matches) { - $str = $matches[1]; - - if (isset(self::$replacements[$str])) { - return self::$replacements[$str]; - } elseif ('x' === $str[0] || 'X' === $str[0]) { - return chr(hexdec(substr($str, 1))); - } elseif ('u' === $str[0]) { - return self::codePointToUtf8(hexdec($matches[2])); - } else { - return chr(octdec($str)); - } - }, - $str - ); - } - - /** - * Converts a Unicode code point to its UTF-8 encoded representation. - * - * @param int $num Code point - * - * @return string UTF-8 representation of code point - */ - 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); - } - throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large'); - } - - public function getType() : string { - return 'Scalar_String'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php deleted file mode 100644 index 69d33e57..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php +++ /dev/null @@ -1,9 +0,0 @@ -attributes = $attributes; - $this->num = $num; - } - - public function getSubNodeNames() : array { - return ['num']; - } - - public function getType() : string { - return 'Stmt_Break'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php deleted file mode 100644 index 2bf044c9..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['cond', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Case'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php deleted file mode 100644 index 9b9c0947..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php +++ /dev/null @@ -1,41 +0,0 @@ -attributes = $attributes; - $this->types = $types; - $this->var = $var; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['types', 'var', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Catch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php deleted file mode 100644 index 1fc7f336..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php +++ /dev/null @@ -1,80 +0,0 @@ -attributes = $attributes; - $this->flags = $flags; - $this->consts = $consts; - $this->attrGroups = $attrGroups; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'consts']; - } - - /** - * Whether constant is explicitly or implicitly public. - * - * @return bool - */ - public function isPublic() : bool { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 - || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; - } - - /** - * Whether constant is protected. - * - * @return bool - */ - public function isProtected() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); - } - - /** - * Whether constant is private. - * - * @return bool - */ - public function isPrivate() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); - } - - /** - * Whether constant is final. - * - * @return bool - */ - public function isFinal() : bool { - return (bool) ($this->flags & Class_::MODIFIER_FINAL); - } - - public function getType() : string { - return 'Stmt_ClassConst'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php deleted file mode 100644 index 2fa4e861..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php +++ /dev/null @@ -1,109 +0,0 @@ -stmts as $stmt) { - if ($stmt instanceof TraitUse) { - $traitUses[] = $stmt; - } - } - return $traitUses; - } - - /** - * @return ClassConst[] - */ - public function getConstants() : array { - $constants = []; - foreach ($this->stmts as $stmt) { - if ($stmt instanceof ClassConst) { - $constants[] = $stmt; - } - } - return $constants; - } - - /** - * @return Property[] - */ - public function getProperties() : array { - $properties = []; - foreach ($this->stmts as $stmt) { - if ($stmt instanceof Property) { - $properties[] = $stmt; - } - } - return $properties; - } - - /** - * Gets property with the given name defined directly in this class/interface/trait. - * - * @param string $name Name of the property - * - * @return Property|null Property node or null if the property does not exist - */ - public function getProperty(string $name) { - foreach ($this->stmts as $stmt) { - if ($stmt instanceof Property) { - foreach ($stmt->props as $prop) { - if ($prop instanceof PropertyProperty && $name === $prop->name->toString()) { - return $stmt; - } - } - } - } - return null; - } - - /** - * Gets all methods defined directly in this class/interface/trait - * - * @return ClassMethod[] - */ - public function getMethods() : array { - $methods = []; - foreach ($this->stmts as $stmt) { - if ($stmt instanceof ClassMethod) { - $methods[] = $stmt; - } - } - return $methods; - } - - /** - * Gets method with the given name defined directly in this class/interface/trait. - * - * @param string $name Name of the method (compared case-insensitively) - * - * @return ClassMethod|null Method node or null if the method does not exist - */ - public function getMethod(string $name) { - $lowerName = strtolower($name); - foreach ($this->stmts as $stmt) { - if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) { - return $stmt; - } - } - return null; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php deleted file mode 100644 index 09b877a9..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php +++ /dev/null @@ -1,159 +0,0 @@ - true, - '__destruct' => true, - '__call' => true, - '__callstatic' => true, - '__get' => true, - '__set' => true, - '__isset' => true, - '__unset' => true, - '__sleep' => true, - '__wakeup' => true, - '__tostring' => true, - '__set_state' => true, - '__clone' => true, - '__invoke' => true, - '__debuginfo' => true, - ]; - - /** - * Constructs a class method node. - * - * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'flags => MODIFIER_PUBLIC: Flags - * 'byRef' => false : Whether to return by reference - * 'params' => array() : Parameters - * 'returnType' => null : Return type - * 'stmts' => array() : Statements - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; - $this->byRef = $subNodes['byRef'] ?? false; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->stmts = array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts']; - } - - public function returnsByRef() : bool { - return $this->byRef; - } - - public function getParams() : array { - return $this->params; - } - - public function getReturnType() { - return $this->returnType; - } - - public function getStmts() { - return $this->stmts; - } - - public function getAttrGroups() : array { - return $this->attrGroups; - } - - /** - * Whether the method is explicitly or implicitly public. - * - * @return bool - */ - public function isPublic() : bool { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 - || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; - } - - /** - * Whether the method is protected. - * - * @return bool - */ - public function isProtected() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); - } - - /** - * Whether the method is private. - * - * @return bool - */ - public function isPrivate() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); - } - - /** - * Whether the method is abstract. - * - * @return bool - */ - public function isAbstract() : bool { - return (bool) ($this->flags & Class_::MODIFIER_ABSTRACT); - } - - /** - * Whether the method is final. - * - * @return bool - */ - public function isFinal() : bool { - return (bool) ($this->flags & Class_::MODIFIER_FINAL); - } - - /** - * Whether the method is static. - * - * @return bool - */ - public function isStatic() : bool { - return (bool) ($this->flags & Class_::MODIFIER_STATIC); - } - - /** - * Whether the method is magic. - * - * @return bool - */ - public function isMagic() : bool { - return isset(self::$magicNames[$this->name->toLowerString()]); - } - - public function getType() : string { - return 'Stmt_ClassMethod'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php deleted file mode 100644 index 52ed6c6c..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php +++ /dev/null @@ -1,137 +0,0 @@ - 0 : Flags - * 'extends' => null : Name of extended class - * 'implements' => array(): Names of implemented interfaces - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->extends = $subNodes['extends'] ?? null; - $this->implements = $subNodes['implements'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts']; - } - - /** - * Whether the class is explicitly abstract. - * - * @return bool - */ - public function isAbstract() : bool { - return (bool) ($this->flags & self::MODIFIER_ABSTRACT); - } - - /** - * Whether the class is final. - * - * @return bool - */ - public function isFinal() : bool { - return (bool) ($this->flags & self::MODIFIER_FINAL); - } - - public function isReadonly() : bool { - return (bool) ($this->flags & self::MODIFIER_READONLY); - } - - /** - * Whether the class is anonymous. - * - * @return bool - */ - public function isAnonymous() : bool { - return null === $this->name; - } - - /** - * @internal - */ - public static function verifyClassModifier($a, $b) { - if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { - throw new Error('Multiple abstract modifiers are not allowed'); - } - - if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { - throw new Error('Multiple final modifiers are not allowed'); - } - - if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { - throw new Error('Multiple readonly modifiers are not allowed'); - } - - if ($a & 48 && $b & 48) { - throw new Error('Cannot use the final modifier on an abstract class'); - } - } - - /** - * @internal - */ - public static function verifyModifier($a, $b) { - if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) { - throw new Error('Multiple access type modifiers are not allowed'); - } - - if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { - throw new Error('Multiple abstract modifiers are not allowed'); - } - - if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) { - throw new Error('Multiple static modifiers are not allowed'); - } - - if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { - throw new Error('Multiple final modifiers are not allowed'); - } - - if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { - throw new Error('Multiple readonly modifiers are not allowed'); - } - - if ($a & 48 && $b & 48) { - throw new Error('Cannot use the final modifier on an abstract class member'); - } - } - - public function getType() : string { - return 'Stmt_Class'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php deleted file mode 100644 index e6316345..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->consts = $consts; - } - - public function getSubNodeNames() : array { - return ['consts']; - } - - public function getType() : string { - return 'Stmt_Const'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php deleted file mode 100644 index 24882683..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->num = $num; - } - - public function getSubNodeNames() : array { - return ['num']; - } - - public function getType() : string { - return 'Stmt_Continue'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php deleted file mode 100644 index ac07f30c..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php +++ /dev/null @@ -1,34 +0,0 @@ -value pair node. - * - * @param string|Node\Identifier $key Key - * @param Node\Expr $value Value - * @param array $attributes Additional attributes - */ - public function __construct($key, Node\Expr $value, array $attributes = []) { - $this->attributes = $attributes; - $this->key = \is_string($key) ? new Node\Identifier($key) : $key; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['key', 'value']; - } - - public function getType() : string { - return 'Stmt_DeclareDeclare'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php deleted file mode 100644 index f46ff0ba..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->declares = $declares; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['declares', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Declare'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php deleted file mode 100644 index 78e90da0..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['stmts', 'cond']; - } - - public function getType() : string { - return 'Stmt_Do'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php deleted file mode 100644 index 7cc50d5d..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->exprs = $exprs; - } - - public function getSubNodeNames() : array { - return ['exprs']; - } - - public function getType() : string { - return 'Stmt_Echo'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php deleted file mode 100644 index eef1ece3..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['cond', 'stmts']; - } - - public function getType() : string { - return 'Stmt_ElseIf'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php deleted file mode 100644 index 0e61778e..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['stmts']; - } - - public function getType() : string { - return 'Stmt_Else'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php deleted file mode 100644 index 5beff8b3..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php +++ /dev/null @@ -1,37 +0,0 @@ -name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->expr = $expr; - $this->attrGroups = $attrGroups; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'name', 'expr']; - } - - public function getType() : string { - return 'Stmt_EnumCase'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php deleted file mode 100644 index 3a50c225..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php +++ /dev/null @@ -1,40 +0,0 @@ - null : Scalar type - * 'implements' => array() : Names of implemented interfaces - * 'stmts' => array() : Statements - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->scalarType = $subNodes['scalarType'] ?? null; - $this->implements = $subNodes['implements'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - - parent::__construct($attributes); - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Enum'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php deleted file mode 100644 index 99d1687d..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php +++ /dev/null @@ -1,33 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Stmt_Expression'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php deleted file mode 100644 index d55b8b68..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['stmts']; - } - - public function getType() : string { - return 'Stmt_Finally'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php deleted file mode 100644 index 1323d37c..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php +++ /dev/null @@ -1,43 +0,0 @@ - array(): Init expressions - * 'cond' => array(): Loop conditions - * 'loop' => array(): Loop expressions - * 'stmts' => array(): Statements - * @param array $attributes Additional attributes - */ - public function __construct(array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->init = $subNodes['init'] ?? []; - $this->cond = $subNodes['cond'] ?? []; - $this->loop = $subNodes['loop'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - } - - public function getSubNodeNames() : array { - return ['init', 'cond', 'loop', 'stmts']; - } - - public function getType() : string { - return 'Stmt_For'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php deleted file mode 100644 index 0556a7ce..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php +++ /dev/null @@ -1,47 +0,0 @@ - null : Variable to assign key to - * 'byRef' => false : Whether to assign value by reference - * 'stmts' => array(): Statements - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - $this->keyVar = $subNodes['keyVar'] ?? null; - $this->byRef = $subNodes['byRef'] ?? false; - $this->valueVar = $valueVar; - $this->stmts = $subNodes['stmts'] ?? []; - } - - public function getSubNodeNames() : array { - return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Foreach'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php deleted file mode 100644 index c2ccae24..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php +++ /dev/null @@ -1,77 +0,0 @@ - false : Whether to return by reference - * 'params' => array(): Parameters - * 'returnType' => null : Return type - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->byRef = $subNodes['byRef'] ?? false; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts']; - } - - public function returnsByRef() : bool { - return $this->byRef; - } - - public function getParams() : array { - return $this->params; - } - - public function getReturnType() { - return $this->returnType; - } - - public function getAttrGroups() : array { - return $this->attrGroups; - } - - /** @return Node\Stmt[] */ - public function getStmts() : array { - return $this->stmts; - } - - public function getType() : string { - return 'Stmt_Function'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php deleted file mode 100644 index a0022ad9..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->vars = $vars; - } - - public function getSubNodeNames() : array { - return ['vars']; - } - - public function getType() : string { - return 'Stmt_Global'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php deleted file mode 100644 index 24a57f78..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php +++ /dev/null @@ -1,31 +0,0 @@ -attributes = $attributes; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['name']; - } - - public function getType() : string { - return 'Stmt_Goto'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php deleted file mode 100644 index 24520d22..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php +++ /dev/null @@ -1,39 +0,0 @@ -attributes = $attributes; - $this->type = $type; - $this->prefix = $prefix; - $this->uses = $uses; - } - - public function getSubNodeNames() : array { - return ['type', 'prefix', 'uses']; - } - - public function getType() : string { - return 'Stmt_GroupUse'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php deleted file mode 100644 index 8e624e0f..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->remaining = $remaining; - } - - public function getSubNodeNames() : array { - return ['remaining']; - } - - public function getType() : string { - return 'Stmt_HaltCompiler'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php deleted file mode 100644 index a1bae4bf..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php +++ /dev/null @@ -1,43 +0,0 @@ - array(): Statements - * 'elseifs' => array(): Elseif clauses - * 'else' => null : Else clause - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->cond = $cond; - $this->stmts = $subNodes['stmts'] ?? []; - $this->elseifs = $subNodes['elseifs'] ?? []; - $this->else = $subNodes['else'] ?? null; - } - - public function getSubNodeNames() : array { - return ['cond', 'stmts', 'elseifs', 'else']; - } - - public function getType() : string { - return 'Stmt_If'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php deleted file mode 100644 index 0711d284..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - public function getType() : string { - return 'Stmt_InlineHTML'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php deleted file mode 100644 index 4d587dd4..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php +++ /dev/null @@ -1,37 +0,0 @@ - array(): Name of extended interfaces - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->extends = $subNodes['extends'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'name', 'extends', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Interface'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php deleted file mode 100644 index 3edcb3be..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php +++ /dev/null @@ -1,31 +0,0 @@ -attributes = $attributes; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['name']; - } - - public function getType() : string { - return 'Stmt_Label'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php deleted file mode 100644 index c6320457..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php +++ /dev/null @@ -1,38 +0,0 @@ -attributes = $attributes; - $this->name = $name; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['name', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Namespace'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php deleted file mode 100644 index f86f8df7..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php +++ /dev/null @@ -1,17 +0,0 @@ -attributes = $attributes; - $this->flags = $flags; - $this->props = $props; - $this->type = \is_string($type) ? new Identifier($type) : $type; - $this->attrGroups = $attrGroups; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'type', 'props']; - } - - /** - * Whether the property is explicitly or implicitly public. - * - * @return bool - */ - public function isPublic() : bool { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 - || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; - } - - /** - * Whether the property is protected. - * - * @return bool - */ - public function isProtected() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); - } - - /** - * Whether the property is private. - * - * @return bool - */ - public function isPrivate() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); - } - - /** - * Whether the property is static. - * - * @return bool - */ - public function isStatic() : bool { - return (bool) ($this->flags & Class_::MODIFIER_STATIC); - } - - /** - * Whether the property is readonly. - * - * @return bool - */ - public function isReadonly() : bool { - return (bool) ($this->flags & Class_::MODIFIER_READONLY); - } - - public function getType() : string { - return 'Stmt_Property'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php deleted file mode 100644 index 205731e2..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; - $this->default = $default; - } - - public function getSubNodeNames() : array { - return ['name', 'default']; - } - - public function getType() : string { - return 'Stmt_PropertyProperty'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php deleted file mode 100644 index efc578c5..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Stmt_Return'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php deleted file mode 100644 index 29584560..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php +++ /dev/null @@ -1,37 +0,0 @@ -attributes = $attributes; - $this->var = $var; - $this->default = $default; - } - - public function getSubNodeNames() : array { - return ['var', 'default']; - } - - public function getType() : string { - return 'Stmt_StaticVar'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php deleted file mode 100644 index 464898ff..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->vars = $vars; - } - - public function getSubNodeNames() : array { - return ['vars']; - } - - public function getType() : string { - return 'Stmt_Static'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php deleted file mode 100644 index 2c8dae02..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->cond = $cond; - $this->cases = $cases; - } - - public function getSubNodeNames() : array { - return ['cond', 'cases']; - } - - public function getType() : string { - return 'Stmt_Switch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php deleted file mode 100644 index a34e2b36..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Stmt_Throw'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php deleted file mode 100644 index 9e97053b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->traits = $traits; - $this->adaptations = $adaptations; - } - - public function getSubNodeNames() : array { - return ['traits', 'adaptations']; - } - - public function getType() : string { - return 'Stmt_TraitUse'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php deleted file mode 100644 index 8bdd2c04..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php +++ /dev/null @@ -1,13 +0,0 @@ -attributes = $attributes; - $this->trait = $trait; - $this->method = \is_string($method) ? new Node\Identifier($method) : $method; - $this->newModifier = $newModifier; - $this->newName = \is_string($newName) ? new Node\Identifier($newName) : $newName; - } - - public function getSubNodeNames() : array { - return ['trait', 'method', 'newModifier', 'newName']; - } - - public function getType() : string { - return 'Stmt_TraitUseAdaptation_Alias'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php deleted file mode 100644 index 80385f64..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->trait = $trait; - $this->method = \is_string($method) ? new Node\Identifier($method) : $method; - $this->insteadof = $insteadof; - } - - public function getSubNodeNames() : array { - return ['trait', 'method', 'insteadof']; - } - - public function getType() : string { - return 'Stmt_TraitUseAdaptation_Precedence'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php deleted file mode 100644 index 0cec203a..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php +++ /dev/null @@ -1,32 +0,0 @@ - array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'name', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Trait'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php deleted file mode 100644 index 7fc158c5..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php +++ /dev/null @@ -1,38 +0,0 @@ -attributes = $attributes; - $this->stmts = $stmts; - $this->catches = $catches; - $this->finally = $finally; - } - - public function getSubNodeNames() : array { - return ['stmts', 'catches', 'finally']; - } - - public function getType() : string { - return 'Stmt_TryCatch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php deleted file mode 100644 index 310e427a..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->vars = $vars; - } - - public function getSubNodeNames() : array { - return ['vars']; - } - - public function getType() : string { - return 'Stmt_Unset'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php deleted file mode 100644 index 32bd7847..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php +++ /dev/null @@ -1,52 +0,0 @@ -attributes = $attributes; - $this->type = $type; - $this->name = $name; - $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; - } - - public function getSubNodeNames() : array { - return ['type', 'name', 'alias']; - } - - /** - * Get alias. If not explicitly given this is the last component of the used name. - * - * @return Identifier - */ - public function getAlias() : Identifier { - if (null !== $this->alias) { - return $this->alias; - } - - return new Identifier($this->name->getLast()); - } - - public function getType() : string { - return 'Stmt_UseUse'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php deleted file mode 100644 index 8753da31..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php +++ /dev/null @@ -1,47 +0,0 @@ -attributes = $attributes; - $this->type = $type; - $this->uses = $uses; - } - - public function getSubNodeNames() : array { - return ['type', 'uses']; - } - - public function getType() : string { - return 'Stmt_Use'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php deleted file mode 100644 index f41034f8..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php +++ /dev/null @@ -1,34 +0,0 @@ -attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['cond', 'stmts']; - } - - public function getType() : string { - return 'Stmt_While'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php deleted file mode 100644 index 61c2d810..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php +++ /dev/null @@ -1,28 +0,0 @@ -attributes = $attributes; - $this->types = $types; - } - - public function getSubNodeNames() : array { - return ['types']; - } - - public function getType() : string { - return 'UnionType'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php b/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php deleted file mode 100644 index a30807a6..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php +++ /dev/null @@ -1,17 +0,0 @@ -attributes = $attributes; - } - - public function getType(): string { - return 'VariadicPlaceholder'; - } - - public function getSubNodeNames(): array { - return []; - } -} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php deleted file mode 100644 index 04514da1..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php +++ /dev/null @@ -1,178 +0,0 @@ -attributes = $attributes; - } - - /** - * Gets line the node started in (alias of getStartLine). - * - * @return int Start line (or -1 if not available) - */ - public function getLine() : int { - return $this->attributes['startLine'] ?? -1; - } - - /** - * Gets line the node started in. - * - * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). - * - * @return int Start line (or -1 if not available) - */ - public function getStartLine() : int { - return $this->attributes['startLine'] ?? -1; - } - - /** - * Gets the line the node ended in. - * - * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). - * - * @return int End line (or -1 if not available) - */ - public function getEndLine() : int { - return $this->attributes['endLine'] ?? -1; - } - - /** - * Gets the token offset of the first token that is part of this node. - * - * The offset is an index into the array returned by Lexer::getTokens(). - * - * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int Token start position (or -1 if not available) - */ - public function getStartTokenPos() : int { - return $this->attributes['startTokenPos'] ?? -1; - } - - /** - * Gets the token offset of the last token that is part of this node. - * - * The offset is an index into the array returned by Lexer::getTokens(). - * - * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int Token end position (or -1 if not available) - */ - public function getEndTokenPos() : int { - return $this->attributes['endTokenPos'] ?? -1; - } - - /** - * Gets the file offset of the first character that is part of this node. - * - * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int File start position (or -1 if not available) - */ - public function getStartFilePos() : int { - return $this->attributes['startFilePos'] ?? -1; - } - - /** - * Gets the file offset of the last character that is part of this node. - * - * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int File end position (or -1 if not available) - */ - public function getEndFilePos() : int { - return $this->attributes['endFilePos'] ?? -1; - } - - /** - * Gets all comments directly preceding this node. - * - * The comments are also available through the "comments" attribute. - * - * @return Comment[] - */ - public function getComments() : array { - return $this->attributes['comments'] ?? []; - } - - /** - * Gets the doc comment of the node. - * - * @return null|Comment\Doc Doc comment object or null - */ - public function getDocComment() { - $comments = $this->getComments(); - for ($i = count($comments) - 1; $i >= 0; $i--) { - $comment = $comments[$i]; - if ($comment instanceof Comment\Doc) { - return $comment; - } - } - - return null; - } - - /** - * Sets the doc comment of the node. - * - * This will either replace an existing doc comment or add it to the comments array. - * - * @param Comment\Doc $docComment Doc comment to set - */ - public function setDocComment(Comment\Doc $docComment) { - $comments = $this->getComments(); - for ($i = count($comments) - 1; $i >= 0; $i--) { - if ($comments[$i] instanceof Comment\Doc) { - // Replace existing doc comment. - $comments[$i] = $docComment; - $this->setAttribute('comments', $comments); - return; - } - } - - // Append new doc comment. - $comments[] = $docComment; - $this->setAttribute('comments', $comments); - } - - public function setAttribute(string $key, $value) { - $this->attributes[$key] = $value; - } - - public function hasAttribute(string $key) : bool { - return array_key_exists($key, $this->attributes); - } - - public function getAttribute(string $key, $default = null) { - if (array_key_exists($key, $this->attributes)) { - return $this->attributes[$key]; - } - - return $default; - } - - public function getAttributes() : array { - return $this->attributes; - } - - public function setAttributes(array $attributes) { - $this->attributes = $attributes; - } - - /** - * @return array - */ - public function jsonSerialize() : array { - return ['nodeType' => $this->getType()] + get_object_vars($this); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php b/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php deleted file mode 100644 index ba622efd..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php +++ /dev/null @@ -1,206 +0,0 @@ -dumpComments = !empty($options['dumpComments']); - $this->dumpPositions = !empty($options['dumpPositions']); - } - - /** - * Dumps a node or array. - * - * @param array|Node $node Node or array to dump - * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if - * the dumpPositions option is enabled and the dumping of node offsets - * is desired. - * - * @return string Dumped value - */ - public function dump($node, string $code = null) : string { - $this->code = $code; - return $this->dumpRecursive($node); - } - - protected function dumpRecursive($node) { - if ($node instanceof Node) { - $r = $node->getType(); - if ($this->dumpPositions && null !== $p = $this->dumpPosition($node)) { - $r .= $p; - } - $r .= '('; - - foreach ($node->getSubNodeNames() as $key) { - $r .= "\n " . $key . ': '; - - $value = $node->$key; - if (null === $value) { - $r .= 'null'; - } elseif (false === $value) { - $r .= 'false'; - } elseif (true === $value) { - $r .= 'true'; - } elseif (is_scalar($value)) { - if ('flags' === $key || 'newModifier' === $key) { - $r .= $this->dumpFlags($value); - } elseif ('type' === $key && $node instanceof Include_) { - $r .= $this->dumpIncludeType($value); - } elseif ('type' === $key - && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) { - $r .= $this->dumpUseType($value); - } else { - $r .= $value; - } - } else { - $r .= str_replace("\n", "\n ", $this->dumpRecursive($value)); - } - } - - if ($this->dumpComments && $comments = $node->getComments()) { - $r .= "\n comments: " . str_replace("\n", "\n ", $this->dumpRecursive($comments)); - } - } elseif (is_array($node)) { - $r = 'array('; - - foreach ($node as $key => $value) { - $r .= "\n " . $key . ': '; - - if (null === $value) { - $r .= 'null'; - } elseif (false === $value) { - $r .= 'false'; - } elseif (true === $value) { - $r .= 'true'; - } elseif (is_scalar($value)) { - $r .= $value; - } else { - $r .= str_replace("\n", "\n ", $this->dumpRecursive($value)); - } - } - } elseif ($node instanceof Comment) { - return $node->getReformattedText(); - } else { - throw new \InvalidArgumentException('Can only dump nodes and arrays.'); - } - - return $r . "\n)"; - } - - protected function dumpFlags($flags) { - $strs = []; - if ($flags & Class_::MODIFIER_PUBLIC) { - $strs[] = 'MODIFIER_PUBLIC'; - } - if ($flags & Class_::MODIFIER_PROTECTED) { - $strs[] = 'MODIFIER_PROTECTED'; - } - if ($flags & Class_::MODIFIER_PRIVATE) { - $strs[] = 'MODIFIER_PRIVATE'; - } - if ($flags & Class_::MODIFIER_ABSTRACT) { - $strs[] = 'MODIFIER_ABSTRACT'; - } - if ($flags & Class_::MODIFIER_STATIC) { - $strs[] = 'MODIFIER_STATIC'; - } - if ($flags & Class_::MODIFIER_FINAL) { - $strs[] = 'MODIFIER_FINAL'; - } - if ($flags & Class_::MODIFIER_READONLY) { - $strs[] = 'MODIFIER_READONLY'; - } - - if ($strs) { - return implode(' | ', $strs) . ' (' . $flags . ')'; - } else { - return $flags; - } - } - - protected function dumpIncludeType($type) { - $map = [ - Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', - Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', - Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', - Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE', - ]; - - if (!isset($map[$type])) { - return $type; - } - return $map[$type] . ' (' . $type . ')'; - } - - protected function dumpUseType($type) { - $map = [ - Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', - Use_::TYPE_NORMAL => 'TYPE_NORMAL', - Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', - Use_::TYPE_CONSTANT => 'TYPE_CONSTANT', - ]; - - if (!isset($map[$type])) { - return $type; - } - return $map[$type] . ' (' . $type . ')'; - } - - /** - * Dump node position, if possible. - * - * @param Node $node Node for which to dump position - * - * @return string|null Dump of position, or null if position information not available - */ - protected function dumpPosition(Node $node) { - if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) { - return null; - } - - $start = $node->getStartLine(); - $end = $node->getEndLine(); - if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos') - && null !== $this->code - ) { - $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos()); - $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos()); - } - return "[$start - $end]"; - } - - // Copied from Error class - private function toColumn($code, $pos) { - if ($pos > strlen($code)) { - throw new \RuntimeException('Invalid position information'); - } - - $lineStartPos = strrpos($code, "\n", $pos - strlen($code)); - if (false === $lineStartPos) { - $lineStartPos = -1; - } - - return $pos - $lineStartPos; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php b/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php deleted file mode 100644 index 2e7cfdad..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php +++ /dev/null @@ -1,81 +0,0 @@ -addVisitor($visitor); - $traverser->traverse($nodes); - - return $visitor->getFoundNodes(); - } - - /** - * Find all nodes that are instances of a certain class. - * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param string $class Class name - * - * @return Node[] Found nodes (all instances of $class) - */ - public function findInstanceOf($nodes, string $class) : array { - return $this->find($nodes, function ($node) use ($class) { - return $node instanceof $class; - }); - } - - /** - * Find first node satisfying a filter callback. - * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param callable $filter Filter callback: function(Node $node) : bool - * - * @return null|Node Found node (or null if none found) - */ - public function findFirst($nodes, callable $filter) { - if (!is_array($nodes)) { - $nodes = [$nodes]; - } - - $visitor = new FirstFindingVisitor($filter); - - $traverser = new NodeTraverser; - $traverser->addVisitor($visitor); - $traverser->traverse($nodes); - - return $visitor->getFoundNode(); - } - - /** - * Find first node that is an instance of a certain class. - * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param string $class Class name - * - * @return null|Node Found node, which is an instance of $class (or null if none found) - */ - public function findFirstInstanceOf($nodes, string $class) { - return $this->findFirst($nodes, function ($node) use ($class) { - return $node instanceof $class; - }); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php deleted file mode 100644 index 97d45bda..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php +++ /dev/null @@ -1,291 +0,0 @@ -visitors[] = $visitor; - } - - /** - * Removes an added visitor. - * - * @param NodeVisitor $visitor - */ - public function removeVisitor(NodeVisitor $visitor) { - foreach ($this->visitors as $index => $storedVisitor) { - if ($storedVisitor === $visitor) { - unset($this->visitors[$index]); - break; - } - } - } - - /** - * Traverses an array of nodes using the registered visitors. - * - * @param Node[] $nodes Array of nodes - * - * @return Node[] Traversed array of nodes - */ - public function traverse(array $nodes) : array { - $this->stopTraversal = false; - - foreach ($this->visitors as $visitor) { - if (null !== $return = $visitor->beforeTraverse($nodes)) { - $nodes = $return; - } - } - - $nodes = $this->traverseArray($nodes); - - foreach ($this->visitors as $visitor) { - if (null !== $return = $visitor->afterTraverse($nodes)) { - $nodes = $return; - } - } - - return $nodes; - } - - /** - * Recursively traverse a node. - * - * @param Node $node Node to traverse. - * - * @return Node Result of traversal (may be original node or new one) - */ - protected function traverseNode(Node $node) : Node { - foreach ($node->getSubNodeNames() as $name) { - $subNode =& $node->$name; - - if (\is_array($subNode)) { - $subNode = $this->traverseArray($subNode); - if ($this->stopTraversal) { - break; - } - } elseif ($subNode instanceof Node) { - $traverseChildren = true; - $breakVisitorIndex = null; - - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->enterNode($subNode); - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { - $traverseChildren = false; - } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { - $traverseChildren = false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } else { - throw new \LogicException( - 'enterNode() returned invalid value of type ' . gettype($return) - ); - } - } - } - - if ($traverseChildren) { - $subNode = $this->traverseNode($subNode); - if ($this->stopTraversal) { - break; - } - } - - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->leaveNode($subNode); - - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } elseif (\is_array($return)) { - throw new \LogicException( - 'leaveNode() may only return an array ' . - 'if the parent structure is an array' - ); - } else { - throw new \LogicException( - 'leaveNode() returned invalid value of type ' . gettype($return) - ); - } - } - - if ($breakVisitorIndex === $visitorIndex) { - break; - } - } - } - } - - return $node; - } - - /** - * Recursively traverse array (usually of nodes). - * - * @param array $nodes Array to traverse - * - * @return array Result of traversal (may be original array or changed one) - */ - protected function traverseArray(array $nodes) : array { - $doNodes = []; - - foreach ($nodes as $i => &$node) { - if ($node instanceof Node) { - $traverseChildren = true; - $breakVisitorIndex = null; - - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->enterNode($node); - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { - $traverseChildren = false; - } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { - $traverseChildren = false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } else { - throw new \LogicException( - 'enterNode() returned invalid value of type ' . gettype($return) - ); - } - } - } - - if ($traverseChildren) { - $node = $this->traverseNode($node); - if ($this->stopTraversal) { - break; - } - } - - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->leaveNode($node); - - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (\is_array($return)) { - $doNodes[] = [$i, $return]; - break; - } elseif (self::REMOVE_NODE === $return) { - $doNodes[] = [$i, []]; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } elseif (false === $return) { - throw new \LogicException( - 'bool(false) return from leaveNode() no longer supported. ' . - 'Return NodeTraverser::REMOVE_NODE instead' - ); - } else { - throw new \LogicException( - 'leaveNode() returned invalid value of type ' . gettype($return) - ); - } - } - - if ($breakVisitorIndex === $visitorIndex) { - break; - } - } - } elseif (\is_array($node)) { - throw new \LogicException('Invalid node structure: Contains nested arrays'); - } - } - - if (!empty($doNodes)) { - while (list($i, $replace) = array_pop($doNodes)) { - array_splice($nodes, $i, 1, $replace); - } - } - - return $nodes; - } - - private function ensureReplacementReasonable($old, $new) { - if ($old instanceof Node\Stmt && $new instanceof Node\Expr) { - throw new \LogicException( - "Trying to replace statement ({$old->getType()}) " . - "with expression ({$new->getType()}). Are you missing a " . - "Stmt_Expression wrapper?" - ); - } - - if ($old instanceof Node\Expr && $new instanceof Node\Stmt) { - throw new \LogicException( - "Trying to replace expression ({$old->getType()}) " . - "with statement ({$new->getType()})" - ); - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php deleted file mode 100644 index 77ff3d27..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - $node stays as-is - * * NodeTraverser::DONT_TRAVERSE_CHILDREN - * => Children of $node are not traversed. $node stays as-is - * * NodeTraverser::STOP_TRAVERSAL - * => Traversal is aborted. $node stays as-is - * * otherwise - * => $node is set to the return value - * - * @param Node $node Node - * - * @return null|int|Node Replacement node (or special return value) - */ - public function enterNode(Node $node); - - /** - * Called when leaving a node. - * - * Return value semantics: - * * null - * => $node stays as-is - * * NodeTraverser::REMOVE_NODE - * => $node is removed from the parent array - * * NodeTraverser::STOP_TRAVERSAL - * => Traversal is aborted. $node stays as-is - * * array (of Nodes) - * => The return value is merged into the parent array (at the position of the $node) - * * otherwise - * => $node is set to the return value - * - * @param Node $node Node - * - * @return null|int|Node|Node[] Replacement node (or special return value) - */ - public function leaveNode(Node $node); - - /** - * Called once after traversal. - * - * Return value semantics: - * * null: $nodes stays as-is - * * otherwise: $nodes is set to the return value - * - * @param Node[] $nodes Array of nodes - * - * @return null|Node[] Array of nodes - */ - public function afterTraverse(array $nodes); -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php deleted file mode 100644 index a85fa493..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php +++ /dev/null @@ -1,20 +0,0 @@ -setAttribute('origNode', $origNode); - return $node; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php deleted file mode 100644 index 9531edbc..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php +++ /dev/null @@ -1,48 +0,0 @@ -filterCallback = $filterCallback; - } - - /** - * Get found nodes satisfying the filter callback. - * - * Nodes are returned in pre-order. - * - * @return Node[] Found nodes - */ - public function getFoundNodes() : array { - return $this->foundNodes; - } - - public function beforeTraverse(array $nodes) { - $this->foundNodes = []; - - return null; - } - - public function enterNode(Node $node) { - $filterCallback = $this->filterCallback; - if ($filterCallback($node)) { - $this->foundNodes[] = $node; - } - - return null; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php deleted file mode 100644 index 596a7d7f..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php +++ /dev/null @@ -1,50 +0,0 @@ -filterCallback = $filterCallback; - } - - /** - * Get found node satisfying the filter callback. - * - * Returns null if no node satisfies the filter callback. - * - * @return null|Node Found node (or null if not found) - */ - public function getFoundNode() { - return $this->foundNode; - } - - public function beforeTraverse(array $nodes) { - $this->foundNode = null; - - return null; - } - - public function enterNode(Node $node) { - $filterCallback = $this->filterCallback; - if ($filterCallback($node)) { - $this->foundNode = $node; - return NodeTraverser::STOP_TRAVERSAL; - } - - return null; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php deleted file mode 100644 index 8e259c57..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php +++ /dev/null @@ -1,257 +0,0 @@ -nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing); - $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? false; - $this->replaceNodes = $options['replaceNodes'] ?? true; - } - - /** - * Get name resolution context. - * - * @return NameContext - */ - public function getNameContext() : NameContext { - return $this->nameContext; - } - - public function beforeTraverse(array $nodes) { - $this->nameContext->startNamespace(); - return null; - } - - public function enterNode(Node $node) { - if ($node instanceof Stmt\Namespace_) { - $this->nameContext->startNamespace($node->name); - } elseif ($node instanceof Stmt\Use_) { - foreach ($node->uses as $use) { - $this->addAlias($use, $node->type, null); - } - } elseif ($node instanceof Stmt\GroupUse) { - foreach ($node->uses as $use) { - $this->addAlias($use, $node->type, $node->prefix); - } - } elseif ($node instanceof Stmt\Class_) { - if (null !== $node->extends) { - $node->extends = $this->resolveClassName($node->extends); - } - - foreach ($node->implements as &$interface) { - $interface = $this->resolveClassName($interface); - } - - $this->resolveAttrGroups($node); - if (null !== $node->name) { - $this->addNamespacedName($node); - } - } elseif ($node instanceof Stmt\Interface_) { - foreach ($node->extends as &$interface) { - $interface = $this->resolveClassName($interface); - } - - $this->resolveAttrGroups($node); - $this->addNamespacedName($node); - } elseif ($node instanceof Stmt\Enum_) { - foreach ($node->implements as &$interface) { - $interface = $this->resolveClassName($interface); - } - - $this->resolveAttrGroups($node); - if (null !== $node->name) { - $this->addNamespacedName($node); - } - } elseif ($node instanceof Stmt\Trait_) { - $this->resolveAttrGroups($node); - $this->addNamespacedName($node); - } elseif ($node instanceof Stmt\Function_) { - $this->resolveSignature($node); - $this->resolveAttrGroups($node); - $this->addNamespacedName($node); - } elseif ($node instanceof Stmt\ClassMethod - || $node instanceof Expr\Closure - || $node instanceof Expr\ArrowFunction - ) { - $this->resolveSignature($node); - $this->resolveAttrGroups($node); - } elseif ($node instanceof Stmt\Property) { - if (null !== $node->type) { - $node->type = $this->resolveType($node->type); - } - $this->resolveAttrGroups($node); - } elseif ($node instanceof Stmt\Const_) { - foreach ($node->consts as $const) { - $this->addNamespacedName($const); - } - } else if ($node instanceof Stmt\ClassConst) { - $this->resolveAttrGroups($node); - } else if ($node instanceof Stmt\EnumCase) { - $this->resolveAttrGroups($node); - } elseif ($node instanceof Expr\StaticCall - || $node instanceof Expr\StaticPropertyFetch - || $node instanceof Expr\ClassConstFetch - || $node instanceof Expr\New_ - || $node instanceof Expr\Instanceof_ - ) { - if ($node->class instanceof Name) { - $node->class = $this->resolveClassName($node->class); - } - } elseif ($node instanceof Stmt\Catch_) { - foreach ($node->types as &$type) { - $type = $this->resolveClassName($type); - } - } elseif ($node instanceof Expr\FuncCall) { - if ($node->name instanceof Name) { - $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); - } - } elseif ($node instanceof Expr\ConstFetch) { - $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); - } elseif ($node instanceof Stmt\TraitUse) { - foreach ($node->traits as &$trait) { - $trait = $this->resolveClassName($trait); - } - - foreach ($node->adaptations as $adaptation) { - if (null !== $adaptation->trait) { - $adaptation->trait = $this->resolveClassName($adaptation->trait); - } - - if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { - foreach ($adaptation->insteadof as &$insteadof) { - $insteadof = $this->resolveClassName($insteadof); - } - } - } - } - - return null; - } - - private function addAlias(Stmt\UseUse $use, $type, Name $prefix = null) { - // Add prefix for group uses - $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; - // Type is determined either by individual element or whole use declaration - $type |= $use->type; - - $this->nameContext->addAlias( - $name, (string) $use->getAlias(), $type, $use->getAttributes() - ); - } - - /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */ - private function resolveSignature($node) { - foreach ($node->params as $param) { - $param->type = $this->resolveType($param->type); - $this->resolveAttrGroups($param); - } - $node->returnType = $this->resolveType($node->returnType); - } - - private function resolveType($node) { - if ($node instanceof Name) { - return $this->resolveClassName($node); - } - if ($node instanceof Node\NullableType) { - $node->type = $this->resolveType($node->type); - return $node; - } - if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) { - foreach ($node->types as &$type) { - $type = $this->resolveType($type); - } - return $node; - } - return $node; - } - - /** - * Resolve name, according to name resolver options. - * - * @param Name $name Function or constant name to resolve - * @param int $type One of Stmt\Use_::TYPE_* - * - * @return Name Resolved name, or original name with attribute - */ - protected function resolveName(Name $name, int $type) : Name { - if (!$this->replaceNodes) { - $resolvedName = $this->nameContext->getResolvedName($name, $type); - if (null !== $resolvedName) { - $name->setAttribute('resolvedName', $resolvedName); - } else { - $name->setAttribute('namespacedName', FullyQualified::concat( - $this->nameContext->getNamespace(), $name, $name->getAttributes())); - } - return $name; - } - - if ($this->preserveOriginalNames) { - // Save the original name - $originalName = $name; - $name = clone $originalName; - $name->setAttribute('originalName', $originalName); - } - - $resolvedName = $this->nameContext->getResolvedName($name, $type); - if (null !== $resolvedName) { - return $resolvedName; - } - - // unqualified names inside a namespace cannot be resolved at compile-time - // add the namespaced version of the name as an attribute - $name->setAttribute('namespacedName', FullyQualified::concat( - $this->nameContext->getNamespace(), $name, $name->getAttributes())); - return $name; - } - - protected function resolveClassName(Name $name) { - return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); - } - - protected function addNamespacedName(Node $node) { - $node->namespacedName = Name::concat( - $this->nameContext->getNamespace(), (string) $node->name); - } - - protected function resolveAttrGroups(Node $node) - { - foreach ($node->attrGroups as $attrGroup) { - foreach ($attrGroup->attrs as $attr) { - $attr->name = $this->resolveClassName($attr->name); - } - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php deleted file mode 100644 index ea372e5b..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php +++ /dev/null @@ -1,52 +0,0 @@ -$node->getAttribute('parent'), the previous - * node can be accessed through $node->getAttribute('previous'), - * and the next node can be accessed through $node->getAttribute('next'). - */ -final class NodeConnectingVisitor extends NodeVisitorAbstract -{ - /** - * @var Node[] - */ - private $stack = []; - - /** - * @var ?Node - */ - private $previous; - - public function beforeTraverse(array $nodes) { - $this->stack = []; - $this->previous = null; - } - - public function enterNode(Node $node) { - if (!empty($this->stack)) { - $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); - } - - if ($this->previous !== null && $this->previous->getAttribute('parent') === $node->getAttribute('parent')) { - $node->setAttribute('previous', $this->previous); - $this->previous->setAttribute('next', $node); - } - - $this->stack[] = $node; - } - - public function leaveNode(Node $node) { - $this->previous = $node; - - array_pop($this->stack); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php deleted file mode 100644 index b98d2bfa..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php +++ /dev/null @@ -1,41 +0,0 @@ -$node->getAttribute('parent'). - */ -final class ParentConnectingVisitor extends NodeVisitorAbstract -{ - /** - * @var Node[] - */ - private $stack = []; - - public function beforeTraverse(array $nodes) - { - $this->stack = []; - } - - public function enterNode(Node $node) - { - if (!empty($this->stack)) { - $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); - } - - $this->stack[] = $node; - } - - public function leaveNode(Node $node) - { - array_pop($this->stack); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php deleted file mode 100644 index d378d670..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php +++ /dev/null @@ -1,25 +0,0 @@ -parsers = $parsers; - } - - public function parse(string $code, ErrorHandler $errorHandler = null) { - if (null === $errorHandler) { - $errorHandler = new ErrorHandler\Throwing; - } - - list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code); - if ($firstError === null) { - return $firstStmts; - } - - for ($i = 1, $c = count($this->parsers); $i < $c; ++$i) { - list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code); - if ($error === null) { - return $stmts; - } - } - - throw $firstError; - } - - private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) { - $stmts = null; - $error = null; - try { - $stmts = $parser->parse($code, $errorHandler); - } catch (Error $error) {} - return [$stmts, $error]; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php deleted file mode 100644 index d9c8fe04..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php +++ /dev/null @@ -1,2672 +0,0 @@ -'", - "T_IS_GREATER_OR_EQUAL", - "T_SL", - "T_SR", - "'+'", - "'-'", - "'.'", - "'*'", - "'/'", - "'%'", - "'!'", - "T_INSTANCEOF", - "'~'", - "T_INC", - "T_DEC", - "T_INT_CAST", - "T_DOUBLE_CAST", - "T_STRING_CAST", - "T_ARRAY_CAST", - "T_OBJECT_CAST", - "T_BOOL_CAST", - "T_UNSET_CAST", - "'@'", - "T_POW", - "'['", - "T_NEW", - "T_CLONE", - "T_EXIT", - "T_IF", - "T_ELSEIF", - "T_ELSE", - "T_ENDIF", - "T_LNUMBER", - "T_DNUMBER", - "T_STRING", - "T_STRING_VARNAME", - "T_VARIABLE", - "T_NUM_STRING", - "T_INLINE_HTML", - "T_ENCAPSED_AND_WHITESPACE", - "T_CONSTANT_ENCAPSED_STRING", - "T_ECHO", - "T_DO", - "T_WHILE", - "T_ENDWHILE", - "T_FOR", - "T_ENDFOR", - "T_FOREACH", - "T_ENDFOREACH", - "T_DECLARE", - "T_ENDDECLARE", - "T_AS", - "T_SWITCH", - "T_MATCH", - "T_ENDSWITCH", - "T_CASE", - "T_DEFAULT", - "T_BREAK", - "T_CONTINUE", - "T_GOTO", - "T_FUNCTION", - "T_FN", - "T_CONST", - "T_RETURN", - "T_TRY", - "T_CATCH", - "T_FINALLY", - "T_USE", - "T_INSTEADOF", - "T_GLOBAL", - "T_STATIC", - "T_ABSTRACT", - "T_FINAL", - "T_PRIVATE", - "T_PROTECTED", - "T_PUBLIC", - "T_VAR", - "T_UNSET", - "T_ISSET", - "T_EMPTY", - "T_HALT_COMPILER", - "T_CLASS", - "T_TRAIT", - "T_INTERFACE", - "T_EXTENDS", - "T_IMPLEMENTS", - "T_OBJECT_OPERATOR", - "T_LIST", - "T_ARRAY", - "T_CALLABLE", - "T_CLASS_C", - "T_TRAIT_C", - "T_METHOD_C", - "T_FUNC_C", - "T_LINE", - "T_FILE", - "T_START_HEREDOC", - "T_END_HEREDOC", - "T_DOLLAR_OPEN_CURLY_BRACES", - "T_CURLY_OPEN", - "T_PAAMAYIM_NEKUDOTAYIM", - "T_NAMESPACE", - "T_NS_C", - "T_DIR", - "T_NS_SEPARATOR", - "T_ELLIPSIS", - "T_NAME_FULLY_QUALIFIED", - "T_NAME_QUALIFIED", - "T_NAME_RELATIVE", - "';'", - "'{'", - "'}'", - "'('", - "')'", - "'$'", - "'`'", - "']'", - "'\"'", - "T_READONLY", - "T_ENUM", - "T_NULLSAFE_OBJECT_OPERATOR", - "T_ATTRIBUTE" - ); - - protected $tokenToSymbol = array( - 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 56, 163, 168, 160, 55, 168, 168, - 158, 159, 53, 50, 8, 51, 52, 54, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 31, 155, - 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 70, 168, 162, 36, 168, 161, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 156, 35, 157, 58, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, - 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, - 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 164, - 122, 123, 124, 125, 126, 127, 128, 129, 165, 130, - 131, 132, 166, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 167 - ); - - protected $action = array( - 699, 669, 670, 671, 672, 673, 286, 674, 675, 676, - 712, 713, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 0, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244,-32766,-32766,-32766,-32766,-32766, - -32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, 245, 246, - 242, 243, 244,-32766,-32766, 677,-32766, 750,-32766,-32766, - -32766,-32766,-32766,-32766,-32766, 1224, 245, 246, 1225, 678, - 679, 680, 681, 682, 683, 684,-32766, 48, 746,-32766, - -32766,-32766,-32766,-32766,-32766, 685, 686, 687, 688, 689, - 690, 691, 692, 693, 694, 695, 715, 738, 716, 717, - 718, 719, 707, 708, 709, 737, 710, 711, 696, 697, - 698, 700, 701, 702, 740, 741, 742, 743, 744, 745, - 703, 704, 705, 706, 736, 727, 725, 726, 722, 723, - 751, 714, 720, 721, 728, 729, 731, 730, 732, 733, - 55, 56, 425, 57, 58, 724, 735, 734, 1073, 59, - 60, -224, 61,-32766,-32766,-32766,-32766,-32766,-32766,-32766, - -32766,-32766,-32766, 121,-32767,-32767,-32767,-32767, 29, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 1043, 766, 1071, 767, 580, 62, 63,-32766, - -32766,-32766,-32766, 64, 516, 65, 294, 295, 66, 67, - 68, 69, 70, 71, 72, 73, 822, 25, 302, 74, - 418, 981, 983, 1043, 1181, 1095, 1096, 1073, 748, 754, - 1075, 1074, 1076, 469,-32766,-32766,-32766, 337, 823, 54, - -32767,-32767,-32767,-32767, 98, 99, 100, 101, 102, 220, - 221, 222, 78, 361, 1107,-32766, 341,-32766,-32766,-32766, - -32766,-32766, 1107, 492, 949, 950, 951, 948, 947, 946, - 207, 477, 478, 949, 950, 951, 948, 947, 946, 1043, - 479, 480, 52, 1101, 1102, 1103, 1104, 1098, 1099, 319, - 872, 668, 667, 27, -511, 1105, 1100,-32766, 130, 1075, - 1074, 1076, 345, 668, 667, 41, 126, 341, 334, 369, - 336, 426, -128, -128, -128, 896, 897, 468, 220, 221, - 222, 811, 1195, 619, 40, 21, 427, -128, 470, -128, - 471, -128, 472, -128, 802, 428, -4, 823, 54, 207, - 33, 34, 429, 360, 317, 28, 35, 473,-32766,-32766, - -32766, 211, 356, 357, 474, 475,-32766,-32766,-32766, 754, - 476, 49, 313, 794, 843, 430, 431, 289, 125,-32766, - 813,-32766,-32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767, - -32767,-32767,-32767,-32766,-32766,-32766, 769, 103, 104, 105, - 327, 307, 825, 633, -128, 1075, 1074, 1076, 221, 222, - 927, 748, 1146, 106,-32766, 129,-32766,-32766,-32766,-32766, - 426, 823, 54, 902, 873, 302, 468, 75, 207, 359, - 811, 668, 667, 40, 21, 427, 754, 470, 754, 471, - 423, 472, 1043, 127, 428, 435, 1043, 341, 1043, 33, - 34, 429, 360, 1181, 415, 35, 473, 122, 10, 315, - 128, 356, 357, 474, 475,-32766,-32766,-32766, 768, 476, - 668, 667, 758, 843, 430, 431, 754, 1043, 1147,-32766, - -32766,-32766, 754, 419, 342, 1215,-32766, 131,-32766,-32766, - -32766, 341, 363, 346, 426, 823, 54, 100, 101, 102, - 468, 825, 633, -4, 811, 442, 903, 40, 21, 427, - 754, 470, 435, 471, 341, 472, 341, 766, 428, 767, - -209, -209, -209, 33, 34, 429, 360, 479, 1196, 35, - 473, 345,-32766,-32766,-32766, 356, 357, 474, 475, 220, - 221, 222, 421, 476, 32, 297, 794, 843, 430, 431, - 754, 754, 435,-32766, 341,-32766,-32766, 9, 300, 51, - 207, 249, 324, 753, 120, 220, 221, 222, 426, 30, - 247, 941, 422, 424, 468, 825, 633, -209, 811, 1043, - 1061, 40, 21, 427, 129, 470, 207, 471, 341, 472, - 804, 20, 428, 124, -208, -208, -208, 33, 34, 429, - 360, 479, 212, 35, 473, 923, -259, 823, 54, 356, - 357, 474, 475,-32766,-32766,-32766, 1043, 476, 213, 806, - 794, 843, 430, 431,-32766,-32766, 435, 435, 341, 341, - 443, 79, 80, 81,-32766, 668, 667, 636, 344, 808, - 668, 667, 239, 240, 241, 123, 214, 538, 250, 825, - 633, -208, 36, 251, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 252, 307, - 426, 220, 221, 222, 823, 54, 468,-32766, 222, 765, - 811, 106, 134, 40, 21, 427, 571, 470, 207, 471, - 445, 472, 207,-32766, 428, 896, 897, 207, 307, 33, - 34, 429, 245, 246, 637, 35, 473, 452, 22, 809, - 922, 356, 357, 457, 588, 135, 374, 595, 596, 476, - -228, 759, 639, 938, 653, 926, 661, -86, 823, 54, - 314, 644, 647, 821, 133, 836, 43, 106, 603, 44, - 45, 46, 47, 748, 50, 53, 132, 426, 302,-32766, - 520, 825, 633, 468, -84, 607, 577, 811, 641, 362, - 40, 21, 427, -278, 470, 754, 471, 954, 472, 441, - 627, 428, 823, 54, 574, 844, 33, 34, 429, 11, - 615, 845, 35, 473, 444, 461, 285, -511, 356, 357, - 592, -419, 593, 1106, 1153, -410, 476, 368, 838, 38, - 658, 426, 645, 795, 1052, 0, 325, 468, 0,-32766, - 0, 811, 0, 0, 40, 21, 427, 0, 470, 0, - 471, 0, 472, 0, 322, 428, 823, 54, 825, 633, - 33, 34, 429, 0, 326, 0, 35, 473, 323, 0, - 316, 318, 356, 357, -512, 426, 0, 753, 531, 0, - 476, 468, 6, 0, 0, 811, 650, 7, 40, 21, - 427, 12, 470, 14, 471, 373, 472, -420, 562, 428, - 823, 54, 78, -225, 33, 34, 429, 39, 656, 657, - 35, 473, 859, 633, 764, 812, 356, 357, 820, 799, - 814, 875, 866, 867, 476, 797, 860, 857, 855, 426, - 933, 934, 931, 819, 803, 468, 805, 807, 810, 811, - 930, 762, 40, 21, 427, 763, 470, 932, 471, 335, - 472, 358, 634, 428, 638, 640, 825, 633, 33, 34, - 429, 642, 643, 646, 35, 473, 648, 649, 651, 652, - 356, 357, 635, 426, 1221, 1223, 761, 842, 476, 468, - 248, 760, 841, 811, 1222, 840, 40, 21, 427, 1057, - 470, 830, 471, 1045, 472, 839, 1046, 428, 828, 215, - 216, 939, 33, 34, 429, 217, 864, 218, 35, 473, - 825, 633, 24, 865, 356, 357, 456, 1220, 1189, 209, - 1187, 1172, 476, 1185, 215, 216, 1086, 1095, 1096, 914, - 217, 1193, 218, 1183, -224, 1097, 26, 31, 37, 42, - 76, 77, 210, 288, 209, 292, 293, 308, 309, 310, - 311, 339, 1095, 1096, 825, 633, 355, 291, 416, 1152, - 1097, 16, 17, 18, 393, 453, 460, 462, 466, 552, - 624, 1048, 1051, 904, 1111, 1047, 1023, 563, 1022, 1088, - 0, 0, -429, 558, 1041, 1101, 1102, 1103, 1104, 1098, - 1099, 398, 1054, 1053, 1056, 1055, 1070, 1105, 1100, 1186, - 1171, 1167, 1184, 1085, 1218, 1112, 1166, 219, 558, 599, - 1101, 1102, 1103, 1104, 1098, 1099, 398, 0, 0, 0, - 0, 0, 1105, 1100, 0, 0, 0, 0, 0, 0, - 0, 0, 219 - ); - - protected $actionCheck = array( - 2, 3, 4, 5, 6, 7, 14, 9, 10, 11, - 12, 13, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 0, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 9, 10, 11, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 69, 70, - 53, 54, 55, 9, 10, 57, 30, 80, 32, 33, - 34, 35, 36, 37, 38, 80, 69, 70, 83, 71, - 72, 73, 74, 75, 76, 77, 9, 70, 80, 33, - 34, 35, 36, 37, 38, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 153, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 3, 4, 5, 6, 7, 147, 148, 149, 80, 12, - 13, 159, 15, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 156, 44, 45, 46, 47, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 13, 106, 116, 108, 85, 50, 51, 33, - 34, 35, 36, 56, 85, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 1, 70, 71, 72, - 73, 59, 60, 13, 82, 78, 79, 80, 80, 82, - 152, 153, 154, 86, 9, 10, 11, 8, 1, 2, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 9, - 10, 11, 156, 106, 143, 30, 160, 32, 33, 34, - 35, 36, 143, 116, 116, 117, 118, 119, 120, 121, - 30, 124, 125, 116, 117, 118, 119, 120, 121, 13, - 133, 134, 70, 136, 137, 138, 139, 140, 141, 142, - 31, 37, 38, 8, 132, 148, 149, 116, 156, 152, - 153, 154, 160, 37, 38, 158, 8, 160, 161, 8, - 163, 74, 75, 76, 77, 134, 135, 80, 9, 10, - 11, 84, 1, 80, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 155, 98, 0, 1, 2, 30, - 103, 104, 105, 106, 132, 8, 109, 110, 9, 10, - 11, 8, 115, 116, 117, 118, 9, 10, 11, 82, - 123, 70, 8, 126, 127, 128, 129, 8, 156, 30, - 155, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 9, 10, 11, 157, 53, 54, 55, - 8, 57, 155, 156, 157, 152, 153, 154, 10, 11, - 157, 80, 162, 69, 30, 151, 32, 33, 34, 35, - 74, 1, 2, 159, 155, 71, 80, 151, 30, 8, - 84, 37, 38, 87, 88, 89, 82, 91, 82, 93, - 8, 95, 13, 156, 98, 158, 13, 160, 13, 103, - 104, 105, 106, 82, 108, 109, 110, 156, 8, 113, - 31, 115, 116, 117, 118, 9, 10, 11, 157, 123, - 37, 38, 126, 127, 128, 129, 82, 13, 159, 33, - 34, 35, 82, 127, 8, 85, 30, 156, 32, 33, - 34, 160, 8, 147, 74, 1, 2, 50, 51, 52, - 80, 155, 156, 157, 84, 31, 159, 87, 88, 89, - 82, 91, 158, 93, 160, 95, 160, 106, 98, 108, - 100, 101, 102, 103, 104, 105, 106, 133, 159, 109, - 110, 160, 9, 10, 11, 115, 116, 117, 118, 9, - 10, 11, 8, 123, 144, 145, 126, 127, 128, 129, - 82, 82, 158, 30, 160, 32, 33, 108, 8, 70, - 30, 31, 113, 152, 16, 9, 10, 11, 74, 14, - 14, 122, 8, 8, 80, 155, 156, 157, 84, 13, - 159, 87, 88, 89, 151, 91, 30, 93, 160, 95, - 155, 159, 98, 14, 100, 101, 102, 103, 104, 105, - 106, 133, 16, 109, 110, 155, 157, 1, 2, 115, - 116, 117, 118, 9, 10, 11, 13, 123, 16, 155, - 126, 127, 128, 129, 33, 34, 158, 158, 160, 160, - 156, 9, 10, 11, 30, 37, 38, 31, 70, 155, - 37, 38, 50, 51, 52, 156, 16, 81, 16, 155, - 156, 157, 30, 16, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 16, 57, - 74, 9, 10, 11, 1, 2, 80, 116, 11, 155, - 84, 69, 156, 87, 88, 89, 160, 91, 30, 93, - 132, 95, 30, 33, 98, 134, 135, 30, 57, 103, - 104, 105, 69, 70, 31, 109, 110, 75, 76, 155, - 155, 115, 116, 75, 76, 101, 102, 111, 112, 123, - 159, 155, 156, 155, 156, 155, 156, 31, 1, 2, - 31, 31, 31, 31, 31, 38, 70, 69, 77, 70, - 70, 70, 70, 80, 70, 70, 70, 74, 71, 85, - 85, 155, 156, 80, 97, 96, 100, 84, 31, 106, - 87, 88, 89, 82, 91, 82, 93, 82, 95, 89, - 92, 98, 1, 2, 90, 127, 103, 104, 105, 97, - 94, 127, 109, 110, 97, 97, 97, 132, 115, 116, - 100, 146, 113, 143, 143, 146, 123, 106, 151, 155, - 157, 74, 31, 157, 162, -1, 114, 80, -1, 116, - -1, 84, -1, -1, 87, 88, 89, -1, 91, -1, - 93, -1, 95, -1, 130, 98, 1, 2, 155, 156, - 103, 104, 105, -1, 130, -1, 109, 110, 131, -1, - 132, 132, 115, 116, 132, 74, -1, 152, 150, -1, - 123, 80, 146, -1, -1, 84, 31, 146, 87, 88, - 89, 146, 91, 146, 93, 146, 95, 146, 150, 98, - 1, 2, 156, 159, 103, 104, 105, 155, 155, 155, - 109, 110, 155, 156, 155, 155, 115, 116, 155, 155, - 155, 155, 155, 155, 123, 155, 155, 155, 155, 74, - 155, 155, 155, 155, 155, 80, 155, 155, 155, 84, - 155, 155, 87, 88, 89, 155, 91, 155, 93, 156, - 95, 156, 156, 98, 156, 156, 155, 156, 103, 104, - 105, 156, 156, 156, 109, 110, 156, 156, 156, 156, - 115, 116, 156, 74, 157, 157, 157, 157, 123, 80, - 31, 157, 157, 84, 157, 157, 87, 88, 89, 157, - 91, 157, 93, 157, 95, 157, 157, 98, 157, 50, - 51, 157, 103, 104, 105, 56, 157, 58, 109, 110, - 155, 156, 158, 157, 115, 116, 157, 157, 157, 70, - 157, 157, 123, 157, 50, 51, 157, 78, 79, 157, - 56, 157, 58, 157, 159, 86, 158, 158, 158, 158, - 158, 158, 158, 158, 70, 158, 158, 158, 158, 158, - 158, 158, 78, 79, 155, 156, 158, 160, 158, 163, - 86, 159, 159, 159, 159, 159, 159, 159, 159, 159, - 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, - -1, -1, 161, 134, 161, 136, 137, 138, 139, 140, - 141, 142, 162, 162, 162, 162, 162, 148, 149, 162, - 162, 162, 162, 162, 162, 162, 162, 158, 134, 162, - 136, 137, 138, 139, 140, 141, 142, -1, -1, -1, - -1, -1, 148, 149, -1, -1, -1, -1, -1, -1, - -1, -1, 158 - ); - - protected $actionBase = array( - 0, 227, 326, 400, 474, 233, 132, 132, 752, -2, - -2, 138, -2, -2, -2, 663, 761, 815, 761, 586, - 717, 859, 859, 859, 244, 256, 256, 256, 413, 583, - 583, 880, 546, 169, 415, 444, 409, 200, 200, 200, - 200, 137, 137, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 249, 205, 738, 559, - 535, 739, 741, 742, 876, 679, 877, 820, 821, 693, - 823, 824, 826, 829, 832, 819, 834, 907, 836, 602, - 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, - 602, 67, 536, 299, 510, 230, 44, 652, 652, 652, - 652, 652, 652, 652, 337, 337, 337, 337, 337, 337, - 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, - 337, 337, 378, 584, 584, 584, 657, 909, 648, 934, - 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, - 934, 934, 934, 503, -21, -21, 436, 650, 364, 571, - 215, 426, 156, 26, 26, 329, 329, 329, 329, 329, - 46, 46, 5, 5, 5, 5, 152, 186, 186, 186, - 186, 120, 120, 120, 120, 374, 374, 429, 448, 448, - 334, 267, 449, 449, 449, 449, 449, 449, 449, 449, - 449, 449, 336, 427, 427, 572, 572, 408, 551, 551, - 551, 551, 671, 171, 171, 391, 311, 311, 311, 109, - 641, 856, 68, 68, 68, 68, 68, 68, 324, 324, - 324, -3, -3, -3, 655, 77, 380, 77, 380, 683, - 685, 86, 685, 654, -15, 516, 776, 281, 646, 809, - 680, 816, 560, 711, 202, 578, 857, 643, -23, 578, - 578, 578, 578, 857, 622, 628, 596, -23, 578, -23, - 639, 454, 849, 351, 249, 558, 469, 631, 743, 514, - 688, 746, 464, 544, 548, 556, 7, 412, 708, 750, - 878, 879, 349, 702, 631, 631, 631, 327, 101, 7, - -8, 623, 623, 623, 623, 219, 623, 623, 623, 623, - 291, 430, 545, 401, 745, 653, 653, 675, 839, 814, - 814, 653, 673, 653, 675, 841, 841, 841, 841, 653, - 653, 653, 653, 814, 814, 667, 814, 275, 684, 694, - 694, 841, 713, 714, 653, 653, 697, 814, 814, 814, - 697, 687, 841, 669, 637, 333, 814, 841, 689, 673, - 689, 653, 669, 689, 673, 673, 689, 22, 686, 656, - 840, 842, 860, 756, 638, 644, 847, 848, 843, 845, - 838, 692, 719, 720, 528, 659, 660, 661, 662, 696, - 664, 698, 643, 658, 658, 658, 645, 701, 645, 658, - 658, 658, 658, 658, 658, 658, 658, 632, 635, 709, - 699, 670, 723, 566, 582, 758, 640, 636, 872, 865, - 881, 883, 849, 870, 645, 890, 634, 288, 610, 850, - 633, 753, 645, 851, 645, 759, 645, 873, 777, 666, - 778, 779, 658, 874, 891, 892, 893, 894, 897, 898, - 899, 900, 665, 901, 724, 674, 866, 344, 844, 639, - 705, 677, 755, 725, 780, 372, 902, 784, 645, 645, - 765, 706, 645, 766, 726, 712, 862, 727, 867, 903, - 640, 678, 868, 645, 681, 785, 904, 372, 690, 651, - 704, 649, 728, 858, 875, 853, 767, 612, 617, 787, - 788, 792, 691, 730, 863, 864, 835, 731, 770, 642, - 771, 676, 794, 772, 852, 732, 796, 798, 871, 647, - 707, 682, 672, 668, 773, 799, 869, 733, 735, 736, - 801, 737, 804, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 137, 137, 137, 137, -2, -2, -2, - -2, 0, 0, -2, 0, 0, 0, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 0, 0, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 602, 602, - 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, - 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, - 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 602, -21, -21, -21, -21, 602, -21, - -21, -21, -21, -21, -21, -21, 602, 602, 602, 602, - 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, - 602, 602, 602, 602, -21, 602, 602, 602, -21, 68, - -21, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 602, 0, 0, 602, -21, - 602, -21, 602, -21, -21, 602, 602, 602, 602, 602, - 602, 602, -21, -21, -21, -21, -21, -21, 0, 324, - 324, 324, 324, -21, -21, -21, -21, 68, 68, 147, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 324, 324, -3, -3, 68, - 68, 68, 68, 68, 147, 68, 68, -23, 673, 673, - 673, 380, 380, 380, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 380, -23, 0, -23, - 0, 68, -23, 673, -23, 380, 673, 673, -23, 814, - 604, 604, 604, 604, 372, 7, 0, 0, 673, 673, - 0, 0, 0, 0, 0, 673, 0, 0, 0, 0, - 0, 0, 814, 0, 653, 0, 0, 0, 0, 658, - 288, 0, 677, 456, 0, 0, 0, 0, 0, 0, - 677, 456, 530, 530, 0, 665, 658, 658, 658, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 372 - ); - - protected $actionDefault = array( - 3,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767, 540, 540, 495,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 297, 297, 297, - 32767,32767,32767, 528, 528, 528, 528, 528, 528, 528, - 528, 528, 528, 528,32767,32767,32767,32767,32767,32767, - 381,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 387, - 545,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 362, - 363, 365, 366, 296, 548, 529, 245, 388, 544, 295, - 247, 325, 499,32767,32767,32767, 327, 122, 256, 201, - 498, 125, 294, 232, 380, 382, 326, 301, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 300, 454, 359, 358, 357, 456,32767, 455, 492, - 492, 495,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 323, 483, 482, 324, 452, 328, 453, - 331, 457, 460, 329, 330, 347, 348, 345, 346, 349, - 458, 459, 476, 477, 474, 475, 299, 350, 351, 352, - 353, 478, 479, 480, 481,32767,32767, 280, 539, 539, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 338, 339, 467, 468,32767, 236, 236, - 236, 236, 281, 236,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 333, 334, - 332, 462, 463, 461, 428,32767,32767,32767, 430,32767, - 32767,32767,32767,32767,32767,32767,32767, 500,32767,32767, - 32767,32767,32767, 513, 417, 171,32767, 409,32767, 171, - 171, 171, 171,32767, 220, 222, 167,32767, 171,32767, - 486,32767,32767,32767,32767,32767, 518, 343,32767,32767, - 116,32767,32767,32767, 555,32767, 513,32767, 116,32767, - 32767,32767,32767, 356, 335, 336, 337,32767,32767, 517, - 511, 470, 471, 472, 473,32767, 464, 465, 466, 469, - 32767,32767,32767,32767,32767,32767,32767,32767, 425, 431, - 431,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 516, 515,32767, 410, 494, 186, 184, - 184,32767, 206, 206,32767,32767, 188, 487, 506,32767, - 188, 173,32767, 398, 175, 494,32767,32767, 238,32767, - 238,32767, 398, 238,32767,32767, 238,32767, 411, 435, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767, 377, 378, 489, 502,32767, - 503,32767, 409, 341, 342, 344, 320,32767, 322, 367, - 368, 369, 370, 371, 372, 373, 375,32767, 415,32767, - 418,32767,32767,32767, 255,32767, 553,32767,32767, 304, - 553,32767,32767,32767, 547,32767,32767, 298,32767,32767, - 32767,32767, 251,32767, 169,32767, 537,32767, 554,32767, - 511,32767, 340,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 512,32767,32767,32767,32767, 227,32767, 448, - 32767, 116,32767,32767,32767, 187,32767,32767, 302, 246, - 32767,32767, 546,32767,32767,32767,32767,32767,32767,32767, - 32767, 114,32767, 170,32767,32767,32767, 189,32767,32767, - 511,32767,32767,32767,32767,32767,32767,32767, 293,32767, - 32767,32767,32767,32767,32767,32767, 511,32767,32767, 231, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 411, - 32767, 274,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 127, 127, 3, 127, 127, 258, 3, - 258, 127, 258, 258, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 214, 217, 206, 206, 164, 127, - 127, 266 - ); - - protected $goto = array( - 166, 140, 140, 140, 166, 187, 168, 144, 147, 141, - 142, 143, 149, 163, 163, 163, 163, 144, 144, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 138, 159, 160, 161, 162, 184, 139, 185, 493, 494, - 377, 495, 499, 500, 501, 502, 503, 504, 505, 506, - 967, 164, 145, 146, 148, 171, 176, 186, 203, 253, - 256, 258, 260, 263, 264, 265, 266, 267, 268, 269, - 277, 278, 279, 280, 303, 304, 328, 329, 330, 394, - 395, 396, 542, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 150, 151, 152, - 167, 153, 169, 154, 204, 170, 155, 156, 157, 205, - 158, 136, 620, 560, 756, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 1108, - 628, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, - 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, - 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, - 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, - 1108, 1108, 1108, 1108, 1108, 757, 888, 888, 508, 1200, - 1200, 400, 606, 508, 536, 536, 568, 532, 534, 534, - 496, 498, 524, 540, 569, 572, 583, 590, 852, 852, - 852, 852, 847, 853, 174, 585, 519, 600, 601, 177, - 178, 179, 401, 402, 403, 404, 173, 202, 206, 208, - 257, 259, 261, 262, 270, 271, 272, 273, 274, 275, - 281, 282, 283, 284, 305, 306, 331, 332, 333, 406, - 407, 408, 409, 175, 180, 254, 255, 181, 182, 183, - 497, 497, 785, 497, 497, 497, 497, 497, 497, 497, - 497, 497, 497, 497, 497, 497, 497, 509, 578, 582, - 626, 749, 509, 544, 545, 546, 547, 548, 549, 550, - 551, 553, 586, 338, 559, 321, 559, 559, 559, 559, - 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, - 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, - 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, - 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, - 530, 349, 655, 555, 587, 352, 414, 591, 575, 604, - 885, 611, 612, 881, 616, 617, 623, 625, 630, 632, - 298, 296, 296, 296, 298, 290, 299, 944, 610, 816, - 1170, 613, 436, 436, 375, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, 436, 1072, - 1084, 1083, 945, 1065, 1072, 895, 895, 895, 895, 1178, - 895, 895, 1212, 1212, 1178, 388, 858, 561, 755, 1072, - 1072, 1072, 1072, 1072, 1072, 3, 4, 384, 384, 384, - 1212, 874, 856, 854, 856, 654, 465, 511, 883, 878, - 1089, 541, 384, 537, 384, 567, 384, 1026, 19, 15, - 371, 384, 1226, 510, 1204, 1192, 1192, 1192, 510, 906, - 372, 522, 533, 554, 912, 514, 1068, 1069, 13, 1065, - 378, 912, 1158, 594, 23, 965, 386, 386, 386, 602, - 1066, 1169, 1066, 937, 447, 449, 631, 752, 1177, 1067, - 1109, 614, 935, 1177, 605, 1197, 391, 1211, 1211, 543, - 892, 386, 1194, 1194, 1194, 399, 518, 1016, 901, 389, - 771, 529, 752, 340, 752, 1211, 518, 518, 385, 781, - 1214, 770, 772, 1063, 910, 774, 1058, 1176, 659, 953, - 514, 782, 862, 915, 450, 573, 1155, 0, 463, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 513, 528, 0, 0, 0, 0, - 513, 0, 528, 0, 350, 351, 0, 609, 512, 515, - 438, 439, 1064, 618, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 779, 1219, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 301, 301 - ); - - protected $gotoCheck = array( - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 57, 68, 15, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 126, - 9, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 16, 76, 76, 68, 76, - 76, 51, 51, 68, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 68, 68, - 68, 68, 68, 68, 27, 66, 101, 66, 66, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 117, 117, 29, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 61, 61, - 61, 6, 117, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 125, 57, 125, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 32, 71, 32, 32, 69, 69, 69, 32, 40, 40, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 5, 5, 5, 5, 5, 5, 5, 97, 62, 50, - 81, 62, 57, 57, 62, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 124, 124, 97, 81, 57, 57, 57, 57, 57, 118, - 57, 57, 142, 142, 118, 12, 33, 12, 14, 57, - 57, 57, 57, 57, 57, 30, 30, 13, 13, 13, - 142, 14, 14, 14, 14, 14, 57, 14, 14, 14, - 34, 2, 13, 109, 13, 2, 13, 34, 34, 34, - 34, 13, 13, 122, 140, 9, 9, 9, 122, 83, - 58, 58, 58, 34, 13, 13, 81, 81, 58, 81, - 46, 13, 131, 127, 34, 101, 123, 123, 123, 34, - 81, 81, 81, 8, 8, 8, 8, 11, 119, 81, - 8, 8, 8, 119, 49, 138, 48, 141, 141, 47, - 78, 123, 119, 119, 119, 123, 47, 102, 80, 17, - 23, 9, 11, 18, 11, 141, 47, 47, 11, 23, - 141, 23, 24, 115, 84, 25, 113, 119, 73, 99, - 13, 26, 70, 85, 64, 65, 130, -1, 108, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, - 9, -1, 9, -1, 71, 71, -1, 13, 9, 9, - 9, 9, 13, 13, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 9, 9, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 5, 5 - ); - - protected $gotoBase = array( - 0, 0, -184, 0, 0, 356, 290, 0, 488, 149, - 0, 182, 85, 118, 426, 112, 203, 179, 208, 0, - 0, 0, 0, 162, 190, 198, 120, 27, 0, 272, - -224, 0, -274, 406, 32, 0, 0, 0, 0, 0, - 330, 0, 0, -24, 0, 0, 440, 485, 213, 218, - 371, -74, 0, 0, 0, 0, 0, 107, 110, 0, - 0, -11, -72, 0, 104, 95, -405, 0, -94, 41, - 119, -82, 0, 164, 0, 0, -79, 0, 197, 0, - 204, 43, 0, 441, 171, 121, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 100, 0, 115, - 0, 195, 210, 0, 0, 0, 0, 0, 86, 427, - 259, 0, 0, 116, 0, 174, 0, -5, 117, 196, - 0, 0, 161, 170, 93, -21, -48, 273, 0, 0, - 91, 271, 0, 0, 0, 0, 0, 0, 216, 0, - 437, 187, 102, 0, 0 - ); - - protected $gotoDefault = array( - -32768, 467, 663, 2, 664, 834, 739, 747, 597, 481, - 629, 581, 380, 1188, 791, 792, 793, 381, 367, 482, - 379, 410, 405, 780, 773, 775, 783, 172, 411, 786, - 1, 788, 517, 824, 1017, 364, 796, 365, 589, 798, - 526, 800, 801, 137, 382, 383, 527, 483, 390, 576, - 815, 276, 387, 817, 366, 818, 827, 370, 464, 454, - 459, 556, 608, 432, 446, 570, 564, 535, 1081, 565, - 861, 348, 869, 660, 877, 880, 484, 557, 891, 451, - 899, 1094, 397, 905, 911, 916, 287, 919, 417, 412, - 584, 924, 925, 5, 929, 621, 622, 8, 312, 952, - 598, 966, 420, 1036, 1038, 485, 486, 521, 458, 507, - 525, 487, 1059, 440, 413, 1062, 488, 489, 433, 434, - 1078, 354, 1163, 353, 448, 320, 1150, 579, 1113, 455, - 1203, 1159, 347, 490, 491, 376, 1182, 392, 1198, 437, - 1205, 1213, 343, 539, 566 - ); - - protected $ruleToNonTerminal = array( - 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, - 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, - 12, 12, 13, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 18, 18, 19, 19, 21, 21, - 17, 17, 22, 22, 23, 23, 24, 24, 25, 25, - 20, 20, 26, 28, 28, 29, 30, 30, 32, 31, - 31, 31, 31, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 14, 14, 54, 54, 56, 55, 55, 48, - 48, 58, 58, 59, 59, 60, 60, 15, 16, 16, - 16, 63, 63, 63, 64, 64, 67, 67, 65, 65, - 69, 69, 41, 41, 50, 50, 53, 53, 53, 52, - 52, 70, 42, 42, 42, 42, 71, 71, 72, 72, - 73, 73, 39, 39, 35, 35, 74, 37, 37, 75, - 36, 36, 38, 38, 49, 49, 49, 61, 61, 77, - 77, 78, 78, 80, 80, 80, 79, 79, 62, 62, - 81, 81, 81, 82, 82, 83, 83, 83, 44, 44, - 84, 84, 84, 45, 45, 85, 85, 86, 86, 66, - 87, 87, 87, 87, 92, 92, 93, 93, 94, 94, - 94, 94, 94, 95, 96, 96, 91, 91, 88, 88, - 90, 90, 98, 98, 97, 97, 97, 97, 97, 97, - 89, 89, 100, 99, 99, 46, 46, 40, 40, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 34, 34, 47, 47, 105, - 105, 106, 106, 106, 106, 112, 101, 101, 108, 108, - 114, 114, 115, 116, 116, 116, 116, 116, 116, 68, - 68, 57, 57, 57, 57, 102, 102, 120, 120, 117, - 117, 121, 121, 121, 121, 103, 103, 103, 107, 107, - 107, 113, 113, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 27, 27, 27, 27, - 27, 27, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 111, 111, 104, 104, - 104, 104, 127, 127, 130, 130, 129, 129, 131, 131, - 51, 51, 51, 51, 133, 133, 132, 132, 132, 132, - 132, 134, 134, 119, 119, 122, 122, 118, 118, 136, - 135, 135, 135, 135, 123, 123, 123, 123, 110, 110, - 124, 124, 124, 124, 76, 137, 137, 138, 138, 138, - 109, 109, 139, 139, 140, 140, 140, 140, 140, 125, - 125, 125, 125, 142, 143, 141, 141, 141, 141, 141, - 141, 141, 144, 144, 144 - ); - - protected $ruleToLength = array( - 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 5, 4, - 3, 4, 2, 3, 1, 1, 7, 6, 3, 1, - 3, 1, 3, 1, 1, 3, 1, 3, 1, 2, - 3, 1, 3, 3, 1, 3, 2, 0, 1, 1, - 1, 1, 1, 3, 5, 8, 3, 5, 9, 3, - 2, 3, 2, 3, 2, 3, 3, 3, 3, 1, - 2, 2, 5, 7, 9, 5, 6, 3, 3, 2, - 2, 1, 1, 1, 0, 2, 8, 0, 4, 1, - 3, 0, 1, 0, 1, 0, 1, 10, 7, 6, - 5, 1, 2, 2, 0, 2, 0, 2, 0, 2, - 1, 3, 1, 4, 1, 4, 1, 1, 4, 1, - 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, - 1, 1, 1, 4, 0, 2, 3, 0, 2, 4, - 0, 2, 0, 3, 1, 2, 1, 1, 0, 1, - 3, 4, 6, 1, 1, 1, 0, 1, 0, 2, - 2, 3, 3, 1, 3, 1, 2, 2, 3, 1, - 1, 2, 4, 3, 1, 1, 3, 2, 0, 1, - 3, 3, 9, 3, 1, 3, 0, 2, 4, 5, - 4, 4, 4, 3, 1, 1, 1, 3, 1, 1, - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 3, 1, 1, 3, 3, 1, 0, 1, 1, - 3, 3, 4, 4, 1, 2, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, - 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 1, 3, 5, 4, 3, - 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, - 2, 1, 2, 10, 11, 3, 3, 2, 4, 4, - 3, 4, 4, 4, 4, 7, 3, 2, 0, 4, - 1, 3, 2, 2, 4, 6, 2, 2, 4, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 3, 4, 4, 0, 2, 1, 0, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 2, 1, 3, 1, 4, - 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, - 3, 3, 5, 4, 4, 3, 1, 3, 1, 1, - 3, 3, 0, 2, 0, 1, 3, 1, 3, 1, - 1, 1, 1, 1, 6, 4, 3, 4, 2, 4, - 4, 1, 3, 1, 2, 1, 1, 4, 1, 1, - 3, 6, 4, 4, 4, 4, 1, 4, 0, 1, - 1, 3, 1, 1, 4, 3, 1, 1, 1, 0, - 0, 2, 3, 1, 3, 1, 4, 2, 2, 2, - 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, - 6, 3, 1, 1, 1 - ); - - protected function initReduceCallbacks() { - $this->reduceCallbacks = [ - 0 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 1 => function ($stackPos) { - $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); - }, - 2 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 3 => function ($stackPos) { - $this->semValue = array(); - }, - 4 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 5 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 6 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 7 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 8 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 9 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 10 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 11 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 12 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 13 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 14 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 15 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 16 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 17 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 18 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 19 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 20 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 21 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 22 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 23 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 24 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 25 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 26 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 27 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 28 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 29 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 30 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 31 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 32 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 33 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 34 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 35 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 36 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 37 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 38 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 39 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 40 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 41 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 42 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 43 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 44 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 45 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 46 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 47 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 48 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 49 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 50 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 51 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 52 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 53 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 54 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 55 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 56 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 57 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 58 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 59 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 60 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 61 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 62 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 63 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 64 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 65 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 66 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 67 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 68 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 69 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 70 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 71 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 72 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 73 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 74 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 75 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 76 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 77 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 78 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 79 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 80 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 81 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 82 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 83 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 84 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 85 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 86 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 87 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 88 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 89 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 90 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 91 => function ($stackPos) { - $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 92 => function ($stackPos) { - $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 93 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 94 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 95 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 96 => function ($stackPos) { - $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 97 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($this->semValue); - }, - 98 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, - 99 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, - 100 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 101 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 102 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 103 => function ($stackPos) { - $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 104 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_FUNCTION; - }, - 105 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_CONSTANT; - }, - 106 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 107 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 108 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 109 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 110 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 111 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 112 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 113 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 114 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); - }, - 115 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 116 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); - }, - 117 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 118 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; - }, - 119 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; - }, - 120 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 121 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 122 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 123 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 124 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 125 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 126 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 127 => function ($stackPos) { - $this->semValue = array(); - }, - 128 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 129 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 130 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 131 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 132 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 133 => function ($stackPos) { - - if ($this->semStack[$stackPos-(3-2)]) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; - } else { - $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if (null === $this->semValue) { $this->semValue = array(); } - } - - }, - 134 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(5-2)], ['stmts' => is_array($this->semStack[$stackPos-(5-3)]) ? $this->semStack[$stackPos-(5-3)] : array($this->semStack[$stackPos-(5-3)]), 'elseifs' => $this->semStack[$stackPos-(5-4)], 'else' => $this->semStack[$stackPos-(5-5)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 135 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(8-2)], ['stmts' => $this->semStack[$stackPos-(8-4)], 'elseifs' => $this->semStack[$stackPos-(8-5)], 'else' => $this->semStack[$stackPos-(8-6)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 136 => function ($stackPos) { - $this->semValue = new Stmt\While_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 137 => function ($stackPos) { - $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(5-4)], is_array($this->semStack[$stackPos-(5-2)]) ? $this->semStack[$stackPos-(5-2)] : array($this->semStack[$stackPos-(5-2)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 138 => function ($stackPos) { - $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 139 => function ($stackPos) { - $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 140 => function ($stackPos) { - $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 141 => function ($stackPos) { - $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 142 => function ($stackPos) { - $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 143 => function ($stackPos) { - $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 144 => function ($stackPos) { - $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 145 => function ($stackPos) { - $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 146 => function ($stackPos) { - $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 147 => function ($stackPos) { - $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 148 => function ($stackPos) { - $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 149 => function ($stackPos) { - $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 150 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 151 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 152 => function ($stackPos) { - $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 153 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 154 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 155 => function ($stackPos) { - $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 156 => function ($stackPos) { - $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); - }, - 157 => function ($stackPos) { - $this->semValue = new Stmt\Throw_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 158 => function ($stackPos) { - $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 159 => function ($stackPos) { - $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 160 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 161 => function ($stackPos) { - $this->semValue = array(); /* means: no statement */ - }, - 162 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 163 => function ($stackPos) { - $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ - }, - 164 => function ($stackPos) { - $this->semValue = array(); - }, - 165 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 166 => function ($stackPos) { - $this->semValue = new Stmt\Catch_(array($this->semStack[$stackPos-(8-3)]), $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 167 => function ($stackPos) { - $this->semValue = null; - }, - 168 => function ($stackPos) { - $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 169 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 170 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 171 => function ($stackPos) { - $this->semValue = false; - }, - 172 => function ($stackPos) { - $this->semValue = true; - }, - 173 => function ($stackPos) { - $this->semValue = false; - }, - 174 => function ($stackPos) { - $this->semValue = true; - }, - 175 => function ($stackPos) { - $this->semValue = false; - }, - 176 => function ($stackPos) { - $this->semValue = true; - }, - 177 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(10-3)], ['byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-5)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 178 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos-(7-2)); - }, - 179 => function ($stackPos) { - $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(6-2)], ['extends' => $this->semStack[$stackPos-(6-3)], 'stmts' => $this->semStack[$stackPos-(6-5)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - $this->checkInterface($this->semValue, $stackPos-(6-2)); - }, - 180 => function ($stackPos) { - $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(5-2)], ['stmts' => $this->semStack[$stackPos-(5-4)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 181 => function ($stackPos) { - $this->semValue = 0; - }, - 182 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, - 183 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, - 184 => function ($stackPos) { - $this->semValue = null; - }, - 185 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 186 => function ($stackPos) { - $this->semValue = array(); - }, - 187 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 188 => function ($stackPos) { - $this->semValue = array(); - }, - 189 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 190 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 191 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 192 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 193 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 194 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 195 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 196 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 197 => function ($stackPos) { - $this->semValue = null; - }, - 198 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 199 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 200 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 201 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 202 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 203 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 204 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 205 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(5-3)]; - }, - 206 => function ($stackPos) { - $this->semValue = array(); - }, - 207 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 208 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 209 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 210 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 211 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 212 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 213 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 214 => function ($stackPos) { - $this->semValue = array(); - }, - 215 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 216 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(3-2)], is_array($this->semStack[$stackPos-(3-3)]) ? $this->semStack[$stackPos-(3-3)] : array($this->semStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 217 => function ($stackPos) { - $this->semValue = array(); - }, - 218 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 219 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 220 => function ($stackPos) { - $this->semValue = null; - }, - 221 => function ($stackPos) { - $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 222 => function ($stackPos) { - $this->semValue = null; - }, - 223 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 224 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 225 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-2)], true); - }, - 226 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 227 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 228 => function ($stackPos) { - $this->semValue = array(); - }, - 229 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 230 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 231 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(4-4)], null, $this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); $this->checkParam($this->semValue); - }, - 232 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-3)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkParam($this->semValue); - }, - 233 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 234 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 235 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 236 => function ($stackPos) { - $this->semValue = null; - }, - 237 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 238 => function ($stackPos) { - $this->semValue = null; - }, - 239 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 240 => function ($stackPos) { - $this->semValue = array(); - }, - 241 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 242 => function ($stackPos) { - $this->semValue = array(new Node\Arg($this->semStack[$stackPos-(3-2)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes)); - }, - 243 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 244 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 245 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 246 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 247 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 248 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 249 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 250 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 251 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 252 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 253 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 254 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 255 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 256 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 257 => function ($stackPos) { - if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } - }, - 258 => function ($stackPos) { - $this->semValue = array(); - }, - 259 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 260 => function ($stackPos) { - $this->semValue = new Stmt\Property($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkProperty($this->semValue, $stackPos-(3-1)); - }, - 261 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(3-2)], 0, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 262 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(9-4)], ['type' => $this->semStack[$stackPos-(9-1)], 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - $this->checkClassMethod($this->semValue, $stackPos-(9-1)); - }, - 263 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 264 => function ($stackPos) { - $this->semValue = array(); - }, - 265 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 266 => function ($stackPos) { - $this->semValue = array(); - }, - 267 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 268 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 269 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 270 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 271 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 272 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 273 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 274 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 275 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); - }, - 276 => function ($stackPos) { - $this->semValue = null; - }, - 277 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 278 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 279 => function ($stackPos) { - $this->semValue = 0; - }, - 280 => function ($stackPos) { - $this->semValue = 0; - }, - 281 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 282 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 283 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; - }, - 284 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, - 285 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, - 286 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, - 287 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; - }, - 288 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, - 289 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, - 290 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 291 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 292 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 293 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 294 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 295 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 296 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 297 => function ($stackPos) { - $this->semValue = array(); - }, - 298 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 299 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 300 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 301 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 302 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 303 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 304 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 305 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 306 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 307 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 308 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 309 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 310 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 311 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 312 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 313 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 314 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 315 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 316 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 317 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 318 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 319 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 320 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 321 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 322 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 323 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 324 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 325 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 326 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 327 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 328 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 329 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 330 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 331 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 332 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 333 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 334 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 335 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 336 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 337 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 338 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 339 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 340 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 341 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 342 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 343 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 344 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 345 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 346 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 347 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 348 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 349 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 350 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 351 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 352 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 353 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 354 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 355 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 356 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 357 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 358 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 359 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 360 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 361 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 362 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 363 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 364 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 365 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 366 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 367 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 368 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); - $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); - }, - 369 => function ($stackPos) { - $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 370 => function ($stackPos) { - $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 371 => function ($stackPos) { - $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 372 => function ($stackPos) { - $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 373 => function ($stackPos) { - $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 374 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); - }, - 375 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 376 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 377 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 378 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 379 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 380 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 381 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 382 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 383 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-4)], 'uses' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 384 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(11-3)], 'params' => $this->semStack[$stackPos-(11-5)], 'uses' => $this->semStack[$stackPos-(11-7)], 'returnType' => $this->semStack[$stackPos-(11-8)], 'stmts' => $this->semStack[$stackPos-(11-10)]], $this->startAttributeStack[$stackPos-(11-1)] + $this->endAttributes); - }, - 385 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 386 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 387 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 388 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 389 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); - }, - 390 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); - }, - 391 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 392 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos-(4-1)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 393 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 394 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 395 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes), $this->semStack[$stackPos-(7-2)]); - $this->checkClass($this->semValue[0], -1); - }, - 396 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 397 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 398 => function ($stackPos) { - $this->semValue = array(); - }, - 399 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 400 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 401 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 402 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 403 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 404 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 405 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 406 => function ($stackPos) { - $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 407 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 408 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 409 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 410 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 411 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 412 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 413 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 414 => function ($stackPos) { - $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 415 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 416 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 417 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 418 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 419 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 420 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 421 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 422 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 423 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 424 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 425 => function ($stackPos) { - $this->semValue = null; - }, - 426 => function ($stackPos) { - $this->semValue = null; - }, - 427 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 428 => function ($stackPos) { - $this->semValue = array(); - }, - 429 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`', false), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); - }, - 430 => function ($stackPos) { - foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', false); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 431 => function ($stackPos) { - $this->semValue = array(); - }, - 432 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 433 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, true); - }, - 434 => function ($stackPos) { - $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 435 => function ($stackPos) { - $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, false); - }, - 436 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 437 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 438 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 439 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 440 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 441 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 442 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 443 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 444 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], false); - }, - 445 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], false); - }, - 446 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 447 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 448 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 449 => function ($stackPos) { - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 450 => function ($stackPos) { - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 451 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 452 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 453 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 454 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 455 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 456 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 457 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 458 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 459 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 460 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 461 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 462 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 463 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 464 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 465 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 466 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 467 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 468 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 469 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 470 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 471 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 472 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 473 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 474 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 475 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 476 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 477 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 478 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 479 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 480 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 481 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 482 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 483 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 484 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 485 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 486 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 487 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 488 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 489 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 490 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); - }, - 491 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); - }, - 492 => function ($stackPos) { - $this->semValue = array(); - }, - 493 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 494 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 495 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 496 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 497 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 498 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 499 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 500 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 501 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 502 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 503 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 504 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 505 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 506 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 507 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 508 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 509 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 510 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 511 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 512 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 513 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 514 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 515 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 516 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 517 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 518 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 519 => function ($stackPos) { - $var = substr($this->semStack[$stackPos-(1-1)], 1); $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; - }, - 520 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 521 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 522 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 523 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 524 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 525 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 526 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 527 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 528 => function ($stackPos) { - $this->semValue = null; - }, - 529 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 530 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 531 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 532 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 533 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; - }, - 534 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 535 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 536 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 537 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 538 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 539 => function ($stackPos) { - $this->semValue = null; - }, - 540 => function ($stackPos) { - $this->semValue = array(); - }, - 541 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 542 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 543 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 544 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 545 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 546 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 547 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 548 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 549 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 550 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 551 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 552 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); - }, - 553 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 554 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 555 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 556 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 557 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 558 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 559 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 560 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 561 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 562 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 563 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 564 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - ]; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php deleted file mode 100644 index 71ba0187..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php +++ /dev/null @@ -1,2829 +0,0 @@ -'", - "T_IS_GREATER_OR_EQUAL", - "T_SL", - "T_SR", - "'+'", - "'-'", - "'.'", - "'*'", - "'/'", - "'%'", - "'!'", - "T_INSTANCEOF", - "'~'", - "T_INC", - "T_DEC", - "T_INT_CAST", - "T_DOUBLE_CAST", - "T_STRING_CAST", - "T_ARRAY_CAST", - "T_OBJECT_CAST", - "T_BOOL_CAST", - "T_UNSET_CAST", - "'@'", - "T_POW", - "'['", - "T_NEW", - "T_CLONE", - "T_EXIT", - "T_IF", - "T_ELSEIF", - "T_ELSE", - "T_ENDIF", - "T_LNUMBER", - "T_DNUMBER", - "T_STRING", - "T_STRING_VARNAME", - "T_VARIABLE", - "T_NUM_STRING", - "T_INLINE_HTML", - "T_ENCAPSED_AND_WHITESPACE", - "T_CONSTANT_ENCAPSED_STRING", - "T_ECHO", - "T_DO", - "T_WHILE", - "T_ENDWHILE", - "T_FOR", - "T_ENDFOR", - "T_FOREACH", - "T_ENDFOREACH", - "T_DECLARE", - "T_ENDDECLARE", - "T_AS", - "T_SWITCH", - "T_MATCH", - "T_ENDSWITCH", - "T_CASE", - "T_DEFAULT", - "T_BREAK", - "T_CONTINUE", - "T_GOTO", - "T_FUNCTION", - "T_FN", - "T_CONST", - "T_RETURN", - "T_TRY", - "T_CATCH", - "T_FINALLY", - "T_USE", - "T_INSTEADOF", - "T_GLOBAL", - "T_STATIC", - "T_ABSTRACT", - "T_FINAL", - "T_PRIVATE", - "T_PROTECTED", - "T_PUBLIC", - "T_READONLY", - "T_VAR", - "T_UNSET", - "T_ISSET", - "T_EMPTY", - "T_HALT_COMPILER", - "T_CLASS", - "T_TRAIT", - "T_INTERFACE", - "T_ENUM", - "T_EXTENDS", - "T_IMPLEMENTS", - "T_OBJECT_OPERATOR", - "T_NULLSAFE_OBJECT_OPERATOR", - "T_LIST", - "T_ARRAY", - "T_CALLABLE", - "T_CLASS_C", - "T_TRAIT_C", - "T_METHOD_C", - "T_FUNC_C", - "T_LINE", - "T_FILE", - "T_START_HEREDOC", - "T_END_HEREDOC", - "T_DOLLAR_OPEN_CURLY_BRACES", - "T_CURLY_OPEN", - "T_PAAMAYIM_NEKUDOTAYIM", - "T_NAMESPACE", - "T_NS_C", - "T_DIR", - "T_NS_SEPARATOR", - "T_ELLIPSIS", - "T_NAME_FULLY_QUALIFIED", - "T_NAME_QUALIFIED", - "T_NAME_RELATIVE", - "T_ATTRIBUTE", - "';'", - "']'", - "'{'", - "'}'", - "'('", - "')'", - "'`'", - "'\"'", - "'$'" - ); - - protected $tokenToSymbol = array( - 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 56, 166, 168, 167, 55, 168, 168, - 163, 164, 53, 50, 8, 51, 52, 54, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 31, 159, - 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 70, 168, 160, 36, 168, 165, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 161, 35, 162, 58, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, - 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, - 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158 - ); - - protected $action = array( - 132, 133, 134, 568, 135, 136, 0, 721, 722, 723, - 137, 37, 921, 448, 449, 450,-32766,-32766,-32766,-32767, - -32767,-32767,-32767, 101, 102, 103, 104, 105, 1071, 1072, - 1073, 1070, 1069, 1068, 1074, 715, 714,-32766,-32766,-32766, - -32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, - -32767, 371, 372, 240, 2, 724,-32766,-32766,-32766, 1001, - 1002, 415, 956,-32766,-32766,-32766, 373, 372, 12, 267, - 138, 397, 728, 729, 730, 731, 415,-32766, 421,-32766, - -32766,-32766,-32766,-32766,-32766, 732, 733, 734, 735, 736, - 737, 738, 739, 740, 741, 742, 762, 569, 763, 764, - 765, 766, 754, 755, 337, 338, 757, 758, 743, 744, - 745, 747, 748, 749, 347, 789, 790, 791, 792, 793, - 794, 750, 751, 570, 571, 783, 774, 772, 773, 786, - 769, 770, 284, 421, 572, 573, 768, 574, 575, 576, - 577, 578, 579, 597, -579,-32766,-32766, 797, 771, 580, - 581, -579, 139,-32766,-32766,-32766, 132, 133, 134, 568, - 135, 136, 1020, 721, 722, 723, 137, 37,-32766,-32766, - -32766, 542, 1306, 126,-32766, 1307,-32766,-32766,-32766,-32766, - -32766,-32766,-32766, 1071, 1072, 1073, 1070, 1069, 1068, 1074, - 957, 715, 714, -318, 993, 1261,-32766,-32766,-32766, -576, - 106, 107, 108, -268, 270, 890, -576, 910, 1196, 1195, - 1197, 724,-32766,-32766,-32766, 1049, 109,-32766,-32766,-32766, - -32766, 989, 988, 987, 990, 267, 138, 397, 728, 729, - 730, 731, 1233,-32766, 421,-32766,-32766,-32766,-32766, 1001, - 1002, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 762, 569, 763, 764, 765, 766, 754, 755, - 337, 338, 757, 758, 743, 744, 745, 747, 748, 749, - 347, 789, 790, 791, 792, 793, 794, 750, 751, 570, - 571, 783, 774, 772, 773, 786, 769, 770, 880, 321, - 572, 573, 768, 574, 575, 576, 577, 578, 579,-32766, - 82, 83, 84, -579, 771, 580, 581, -579, 148, 746, - 716, 717, 718, 719, 720, 1281, 721, 722, 723, 759, - 760, 36, 1280, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 999, 270, -318, - -32766,-32766,-32766, 456, 457, 81, -193, 808, -576, 1019, - 109, 320, -576, 892, 724, 681, 802, 695, 1001, 1002, - 591,-32766, 1047,-32766,-32766,-32766, 715, 714, 725, 726, - 727, 728, 729, 730, 731, -192, -86, 795, 279, -530, - 284,-32766,-32766,-32766, 732, 733, 734, 735, 736, 737, - 738, 739, 740, 741, 742, 762, 785, 763, 764, 765, - 766, 754, 755, 756, 784, 757, 758, 743, 744, 745, - 747, 748, 749, 788, 789, 790, 791, 792, 793, 794, - 750, 751, 752, 753, 783, 774, 772, 773, 786, 769, - 770, 470, 803, 761, 767, 768, 775, 776, 778, 777, - 779, 780, -86, -530, -530, 637, 25, 771, 782, 781, - 49, 50, 51, 501, 52, 53, 239, 34, -530, 890, - 54, 55, -111, 56, 999, 128,-32766, -111, 1201, -111, - -530, -570, -536, 890, 300, -570, 144, -111, -111, -111, - -111, -111, -111, -111, -111, 1001, 1002, 1001, 1002, 686, - 1201, 925, 926, 1194, 806, 890, 927, 1296, 57, 58, - 799, 253, -193, 687, 59, 807, 60, 246, 247, 61, - 62, 63, 64, 65, 66, 67, 68, 304, 27, 268, - 69, 437, 502, -332, 306, 688, 1227, 1228, 503, 1192, - 806, -192, 318, 890, 1225, 41, 24, 504, 334, 505, - 14, 506, 880, 507, 653, 654, 508, 509, 280, 806, - 281, 43, 44, 438, 368, 367, 880, 45, 510, 35, - 249, 471, 1063, 359, 333, 103, 104, 105, 1196, 1195, - 1197, 806, 511, 512, 513, 335, 801, 1221, 880, 361, - 285, 683, 286, 365, 514, 515, 380, 1215, 1216, 1217, - 1218, 1212, 1213, 292, 433, -111, 715, 714, 434, 1219, - 1214, 149, 400, 1196, 1195, 1197, 293, -153, -153, -153, - -356, 70, -356, 316, 317, 320, 880, 892, -531, 681, - 435, 1048, -153, 707, -153, 293, -153, 1277, -153, 27, - 74, 892, 436, 681, 320, 369, 370, 833, 366, 834, - -529, 806, 382, 812, 11, 1225, 833, 150, 834, -111, - -111, 151, 74, 942, -111, 681, 320, 153, 806, 866, - -111, -111, -111, -111, 31, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 715, 714, - 374, 375, -531, -531, 890, 154, 805, 155, -4, 890, - 157, 892, -88, 681, -153, 514, 515, -531, 1215, 1216, - 1217, 1218, 1212, 1213, -529, -529, 797, 1108, 1110, -531, - 1219, 1214, 715, 714, 690,-32766, 629, 630, -528, -529, - 32, 1194, 72, 123, 124, 317, 320, 129,-32766,-32766, - -32766, -529,-32766, -535,-32766, 130,-32766, 140, 143,-32766, - 158, 159, 160, 320,-32766,-32766,-32766, 161, -528,-32766, - -32766,-32766, -79, 282, -75, 1194,-32766, 412, -73, 27, - -72, -71,-32766,-32766,-32766,-32766,-32766, 880,-32766, 287, - -32766, 806, 880,-32766, -70, 1225, -69, -68,-32766,-32766, - -32766, -67, -528, -528,-32766,-32766, -66, 141, -47, -18, - -32766, 412, 147, 320, 366, 73, 428, -528, 271,-32766, - 278, 291, -51, 696, 699, -111, -111, 1201, -533, -528, - -111, 889, -528, -528, 48, 825, -111, -111, -111, -111, - 146, 327, 283, 270, 288, 109, 515, -528, 1215, 1216, - 1217, 1218, 1212, 1213, 131, 906, 661, -16, 9, -528, - 1219, 1214, 892, 797, 681,-32766, 145, 892, 1308, 681, - -4, 1194, 72,-32766, 638, 317, 320, 806,-32766,-32766, - -32766, 1078,-32766, 544,-32766, 627,-32766, 13, 656,-32766, - 548, 298, -533, -533,-32766,-32766,-32766,-32766, 296, 297, - -32766,-32766, 674, 1194, 643, 890,-32766, 412, 806, 453, - -32766,-32766,-32766, 364,-32766,-32766,-32766, 481,-32766, -533, - -32766,-32766, 47, -494, 890, 127,-32766,-32766,-32766,-32766, - 644, 657,-32766,-32766, 305, 1194, 890, 805,-32766, 412, - 1222, 301,-32766,-32766,-32766, 0,-32766,-32766,-32766, 432, - -32766, 299, 922,-32766, -111, 293, 554, 476,-32766,-32766, - -32766,-32766, 1232, -484,-32766,-32766, 697, 1194, 560, 908, - -32766, 412, 595, 817,-32766,-32766,-32766, 7,-32766,-32766, - -32766, 1234,-32766, 16, 293,-32766, 294, 295, 880, 74, - -32766,-32766,-32766, 320, 363, 39,-32766,-32766, 40, 704, - 705, 871,-32766, 412, -246, -246, -246, 880, 966, 943, - 366,-32766, 950, 125, 1247, 940, 951, 869, 938, 880, - 1052, -111, -111, -245, -245, -245, -111, 1055, 1056, 366, - 1053, 866, -111, -111, -111, -111, 1054, 1060, 701, 1265, - -111, -111, 1299, 632, -564, -111, 33, 315, -271, 362, - 866, -111, -111, -111, -111, 682, 685, 689, 691, 692, - 693, 694,-32766, 892, 698, 681, -246, 684, 1194, 867, - 1303, 1305, 828, 827, 836,-32766,-32766,-32766, 915,-32766, - 958,-32766, 892,-32766, 681, -245,-32766, 835, 1304, 914, - 916,-32766,-32766,-32766, 892, 913, 681,-32766,-32766, 1180, - 899, 909, 897,-32766, 412, 948, 949, 1302, 1259, 1248, - 1266, 1272,-32766, 1275, -269, -562, -536, -535, -534, 1, - 28, 29, 38, 42, 46, 71, 75, 76, 77, 78, - 79, 80, 142, 152, 156, 245, 322, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 360, 429, - 0, -268, 0, 18, 19, 20, 21, 23, 399, 472, - 473, 480, 483, 484, 485, 486, 490, 491, 492, 499, - 668, 1205, 1148, 1223, 1022, 1021, 1184, -273, -103, 17, - 22, 26, 290, 398, 588, 592, 619, 673, 1152, 1200, - 1149, 1278, 0, -498, 1165, 0, 1226, 0, 320 - ); - - protected $actionCheck = array( - 2, 3, 4, 5, 6, 7, 0, 9, 10, 11, - 12, 13, 128, 129, 130, 131, 9, 10, 11, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 116, 117, - 118, 119, 120, 121, 122, 37, 38, 30, 116, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 106, 107, 14, 8, 57, 9, 10, 11, 137, - 138, 116, 31, 9, 10, 11, 106, 107, 8, 71, - 72, 73, 74, 75, 76, 77, 116, 30, 80, 32, - 33, 34, 35, 36, 30, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 30, 80, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 51, 1, 9, 10, 80, 150, 151, - 152, 8, 154, 9, 10, 11, 2, 3, 4, 5, - 6, 7, 164, 9, 10, 11, 12, 13, 9, 10, - 11, 85, 80, 14, 30, 83, 32, 33, 34, 35, - 36, 37, 38, 116, 117, 118, 119, 120, 121, 122, - 159, 37, 38, 8, 1, 1, 9, 10, 11, 1, - 53, 54, 55, 164, 57, 1, 8, 1, 155, 156, - 157, 57, 9, 10, 11, 162, 69, 30, 116, 32, - 33, 119, 120, 121, 122, 71, 72, 73, 74, 75, - 76, 77, 146, 30, 80, 32, 33, 34, 35, 137, - 138, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 84, 70, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 9, - 9, 10, 11, 160, 150, 151, 152, 164, 154, 2, - 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, - 13, 30, 8, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 116, 57, 164, - 9, 10, 11, 134, 135, 161, 8, 1, 160, 1, - 69, 167, 164, 159, 57, 161, 80, 161, 137, 138, - 1, 30, 1, 32, 33, 34, 37, 38, 71, 72, - 73, 74, 75, 76, 77, 8, 31, 80, 30, 70, - 30, 9, 10, 11, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 31, 156, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 97, 134, 135, 75, 76, 150, 151, 152, - 2, 3, 4, 5, 6, 7, 97, 8, 149, 1, - 12, 13, 101, 15, 116, 8, 116, 106, 1, 108, - 161, 160, 163, 1, 113, 164, 8, 116, 117, 118, - 119, 120, 121, 122, 123, 137, 138, 137, 138, 31, - 1, 117, 118, 80, 82, 1, 122, 85, 50, 51, - 80, 8, 164, 31, 56, 159, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 8, 70, 71, - 72, 73, 74, 162, 8, 31, 78, 79, 80, 116, - 82, 164, 8, 1, 86, 87, 88, 89, 8, 91, - 101, 93, 84, 95, 75, 76, 98, 99, 35, 82, - 37, 103, 104, 105, 106, 107, 84, 109, 110, 147, - 148, 161, 123, 115, 116, 50, 51, 52, 155, 156, - 157, 82, 124, 125, 126, 8, 156, 1, 84, 8, - 35, 161, 37, 8, 136, 137, 8, 139, 140, 141, - 142, 143, 144, 145, 8, 128, 37, 38, 8, 151, - 152, 101, 102, 155, 156, 157, 158, 75, 76, 77, - 106, 163, 108, 165, 166, 167, 84, 159, 70, 161, - 8, 159, 90, 161, 92, 158, 94, 1, 96, 70, - 163, 159, 8, 161, 167, 106, 107, 106, 106, 108, - 70, 82, 106, 8, 108, 86, 106, 14, 108, 117, - 118, 14, 163, 159, 122, 161, 167, 14, 82, 127, - 128, 129, 130, 131, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 37, 38, - 106, 107, 134, 135, 1, 14, 155, 14, 0, 1, - 14, 159, 31, 161, 162, 136, 137, 149, 139, 140, - 141, 142, 143, 144, 134, 135, 80, 59, 60, 161, - 151, 152, 37, 38, 31, 74, 111, 112, 70, 149, - 14, 80, 163, 16, 16, 166, 167, 16, 87, 88, - 89, 161, 91, 163, 93, 16, 95, 161, 16, 98, - 16, 16, 16, 167, 103, 104, 105, 16, 70, 74, - 109, 110, 31, 35, 31, 80, 115, 116, 31, 70, - 31, 31, 87, 88, 89, 124, 91, 84, 93, 35, - 95, 82, 84, 98, 31, 86, 31, 31, 103, 104, - 105, 31, 134, 135, 109, 110, 31, 161, 31, 31, - 115, 116, 31, 167, 106, 154, 108, 149, 31, 124, - 31, 113, 31, 31, 31, 117, 118, 1, 70, 161, - 122, 31, 134, 135, 70, 127, 128, 129, 130, 131, - 31, 35, 37, 57, 37, 69, 137, 149, 139, 140, - 141, 142, 143, 144, 31, 38, 77, 31, 150, 161, - 151, 152, 159, 80, 161, 74, 70, 159, 83, 161, - 162, 80, 163, 85, 90, 166, 167, 82, 87, 88, - 89, 82, 91, 85, 93, 113, 95, 97, 94, 98, - 89, 132, 134, 135, 103, 104, 105, 74, 134, 135, - 109, 110, 92, 80, 96, 1, 115, 116, 82, 97, - 87, 88, 89, 149, 91, 124, 93, 97, 95, 161, - 116, 98, 70, 149, 1, 161, 103, 104, 105, 74, - 100, 100, 109, 110, 132, 80, 1, 155, 115, 116, - 160, 114, 87, 88, 89, -1, 91, 124, 93, 128, - 95, 133, 128, 98, 128, 158, 153, 102, 103, 104, - 105, 74, 146, 149, 109, 110, 31, 80, 81, 154, - 115, 116, 153, 160, 87, 88, 89, 149, 91, 124, - 93, 146, 95, 149, 158, 98, 134, 135, 84, 163, - 103, 104, 105, 167, 149, 159, 109, 110, 159, 159, - 159, 159, 115, 116, 100, 101, 102, 84, 159, 159, - 106, 124, 159, 161, 160, 159, 159, 159, 159, 84, - 159, 117, 118, 100, 101, 102, 122, 159, 159, 106, - 159, 127, 128, 129, 130, 131, 159, 159, 162, 160, - 117, 118, 160, 160, 163, 122, 161, 161, 164, 161, - 127, 128, 129, 130, 131, 161, 161, 161, 161, 161, - 161, 161, 74, 159, 161, 161, 162, 161, 80, 162, - 162, 162, 162, 162, 162, 87, 88, 89, 162, 91, - 162, 93, 159, 95, 161, 162, 98, 162, 162, 162, - 162, 103, 104, 105, 159, 162, 161, 109, 110, 162, - 162, 162, 162, 115, 116, 162, 162, 162, 162, 162, - 162, 162, 124, 162, 164, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - -1, 164, -1, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, -1, 165, 165, -1, 166, -1, 167 - ); - - protected $actionBase = array( - 0, -2, 154, 542, 698, 894, 913, 586, 53, 430, - 867, 307, 307, 67, 307, 307, 307, 482, 693, 693, - 925, 693, 468, 504, 204, 204, 204, 651, 651, 651, - 651, 685, 685, 845, 845, 877, 813, 781, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 356, 31, 369, 716, 1008, 1014, 1010, 1015, - 1006, 1005, 1009, 1011, 1016, 935, 936, 799, 937, 938, - 939, 941, 1012, 873, 1007, 1013, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 290, 159, 136, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 54, 54, 54, 187, 569, - 569, 341, 203, 658, 47, 699, 699, 699, 699, 699, - 699, 699, 699, 699, 699, 144, 144, 7, 7, 7, - 7, 7, 371, -25, -25, -25, -25, 816, 477, 102, - 499, 358, 449, 514, 525, 525, 360, -116, 231, 231, - 231, 231, 231, 231, -78, -78, -78, -78, -78, 319, - 580, 541, 86, 423, 636, 636, 636, 636, 423, 423, - 423, 423, 825, 1020, 423, 423, 423, 558, 688, 688, - 754, 147, 147, 147, 688, 550, 788, 422, 550, 422, - 194, 92, 794, -55, -40, 321, 814, 794, 748, 842, - 198, 143, 772, 539, 772, 1004, 778, 767, 733, 868, - 896, 1017, 820, 933, 821, 934, 219, 731, 1003, 1003, - 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1021, - 339, 1004, 286, 1021, 1021, 1021, 339, 339, 339, 339, - 339, 339, 339, 339, 339, 339, 615, 286, 380, 479, - 286, 796, 339, 356, 804, 356, 356, 356, 356, 964, - 356, 356, 356, 356, 356, 356, 969, 768, 410, 356, - 31, 206, 206, 472, 193, 206, 206, 206, 206, 356, - 356, 356, 539, 776, 793, 584, 809, 377, 776, 776, - 776, 355, 185, 39, 348, 555, 523, 546, 773, 773, - 789, 946, 946, 773, 785, 773, 789, 951, 773, 946, - 787, 467, 596, 540, 585, 600, 946, 519, 773, 773, - 773, 773, 622, 773, 503, 478, 773, 773, 749, 779, - 792, 46, 946, 946, 946, 792, 581, 808, 808, 808, - 830, 831, 762, 777, 534, 526, 645, 459, 807, 777, - 777, 773, 588, 762, 777, 762, 777, 805, 777, 777, - 777, 762, 777, 785, 577, 777, 734, 634, 60, 777, - 6, 952, 953, 671, 954, 949, 955, 976, 956, 957, - 884, 962, 950, 958, 948, 947, 790, 717, 718, 818, - 764, 945, 766, 766, 766, 943, 766, 766, 766, 766, - 766, 766, 766, 766, 717, 770, 835, 811, 791, 965, - 721, 729, 806, 897, 1018, 1019, 964, 997, 959, 826, - 732, 983, 966, 866, 876, 967, 968, 984, 998, 999, - 898, 786, 899, 900, 803, 970, 885, 766, 952, 957, - 950, 958, 948, 947, 765, 760, 755, 756, 753, 740, - 737, 739, 771, 1000, 942, 871, 844, 969, 944, 717, - 869, 979, 875, 985, 986, 878, 802, 775, 872, 901, - 971, 972, 973, 886, 1001, 829, 980, 874, 987, 810, - 902, 988, 989, 990, 991, 906, 887, 888, 889, 832, - 774, 940, 798, 908, 643, 744, 797, 975, 647, 963, - 890, 915, 916, 992, 993, 994, 917, 960, 839, 981, - 784, 982, 977, 840, 843, 653, 728, 795, 681, 683, - 918, 923, 927, 961, 782, 769, 846, 847, 1002, 928, - 686, 848, 735, 929, 996, 736, 741, 800, 893, 824, - 817, 780, 974, 783, 849, 930, 851, 858, 859, 995, - 861, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 458, 458, 458, 458, 458, 458, 307, 307, 307, 307, - 0, 0, 307, 0, 0, 0, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 423, 423, - 291, 291, 0, 291, 423, 423, 423, 423, 423, 423, - 423, 423, 423, 423, 291, 291, 291, 291, 291, 291, - 291, 787, 147, 147, 147, 147, 423, 423, 423, 423, - 423, -88, -88, 147, 147, 423, 384, 423, 423, 423, - 423, 423, 423, 423, 423, 423, 423, 423, 0, 0, - 286, 422, 0, 785, 785, 785, 785, 0, 0, 0, - 0, 422, 422, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 286, 422, 0, 286, 0, 785, - 785, 423, 787, 787, 314, 384, 423, 0, 0, 0, - 0, 286, 785, 286, 339, 422, 339, 339, 206, 356, - 314, 510, 510, 510, 510, 0, 539, 787, 787, 787, - 787, 787, 787, 787, 787, 787, 787, 787, 785, 0, - 787, 0, 785, 785, 785, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 785, 0, 0, 946, 0, 0, 0, 0, 773, 0, - 0, 0, 0, 0, 0, 773, 951, 0, 0, 0, - 0, 0, 0, 785, 0, 0, 0, 0, 0, 0, - 0, 0, 766, 802, 0, 802, 0, 766, 766, 766 - ); - - protected $actionDefault = array( - 3,32767, 103,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 101,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 582, 582, 582, - 582,32767,32767, 250, 103,32767,32767, 458, 376, 376, - 376,32767,32767, 526, 526, 526, 526, 526, 526,32767, - 32767,32767,32767,32767,32767, 458,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 101,32767, - 32767,32767, 37, 7, 8, 10, 11, 50, 17, 314, - 32767,32767,32767,32767, 103,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767, 575,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767, 462, 441, 442, 444, - 445, 375, 527, 581, 317, 578, 374, 146, 329, 319, - 238, 320, 254, 463, 255, 464, 467, 468, 211, 283, - 371, 150, 405, 459, 407, 457, 461, 406, 381, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 397, 398, 379, 380, 460, 438, 437, 436, 403,32767, - 32767, 404, 408, 378, 411,32767,32767,32767,32767,32767, - 32767,32767,32767, 103,32767, 409, 410, 427, 428, 425, - 426, 429,32767, 430, 431, 432, 433,32767,32767, 306, - 32767,32767, 355, 353, 418, 419, 306,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 520, - 435,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767, 103,32767, 101, 522, 400, 402, - 490, 413, 414, 412, 382,32767, 497,32767, 103, 499, - 32767,32767,32767, 112,32767,32767,32767,32767, 521,32767, - 528, 528,32767, 483, 101, 194,32767, 194, 194,32767, - 32767,32767,32767,32767,32767,32767, 589, 483, 111, 111, - 111, 111, 111, 111, 111, 111, 111, 111, 111,32767, - 194, 111,32767,32767,32767, 101, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 189,32767, 264, 266, - 103, 543, 194,32767, 502,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 495,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 483, 423, 139,32767, 139, 528, 415, 416, - 417, 485, 528, 528, 528, 302, 285,32767,32767,32767, - 32767, 500, 500, 101, 101, 101, 101, 495,32767,32767, - 112, 100, 100, 100, 100, 100, 104, 102,32767,32767, - 32767,32767, 100,32767, 102, 102,32767,32767, 221, 208, - 219, 102,32767, 547, 548, 219, 102, 223, 223, 223, - 243, 243, 474, 308, 102, 100, 102, 102, 196, 308, - 308,32767, 102, 474, 308, 474, 308, 198, 308, 308, - 308, 474, 308,32767, 102, 308, 210, 100, 100, 308, - 32767,32767,32767, 485,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 515,32767, - 532, 545, 421, 422, 424, 530, 446, 447, 448, 449, - 450, 451, 452, 454, 577,32767, 489,32767,32767,32767, - 32767, 328, 587,32767, 587,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 588,32767, 528,32767,32767,32767,32767, 420, 9, 76, - 43, 44, 52, 58, 506, 507, 508, 509, 503, 504, - 510, 505,32767,32767, 511, 553,32767,32767, 529, 580, - 32767,32767,32767,32767,32767,32767, 139,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 515,32767, 137, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767, 528,32767,32767,32767, 304, 305,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 528,32767,32767,32767, 287, 288,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 282,32767,32767, 370,32767,32767,32767,32767, - 349,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767, 152, 152, 3, 3, 331, 152, 152, 152, 331, - 152, 331, 331, 331, 152, 152, 152, 152, 152, 152, - 276, 184, 258, 261, 243, 243, 152, 341, 152 - ); - - protected $goto = array( - 194, 194, 669, 423, 642, 883, 839, 884, 1025, 417, - 308, 309, 330, 562, 314, 422, 331, 424, 621, 823, - 677, 851, 824, 585, 838, 857, 165, 165, 165, 165, - 218, 195, 191, 191, 175, 177, 213, 191, 191, 191, - 191, 191, 192, 192, 192, 192, 192, 192, 186, 187, - 188, 189, 190, 215, 213, 216, 522, 523, 413, 524, - 526, 527, 528, 529, 530, 531, 532, 533, 1094, 166, - 167, 168, 193, 169, 170, 171, 164, 172, 173, 174, - 176, 212, 214, 217, 235, 238, 241, 242, 244, 255, - 256, 257, 258, 259, 260, 261, 263, 264, 265, 266, - 274, 275, 311, 312, 313, 418, 419, 420, 567, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 178, 234, 179, 196, 197, 198, - 236, 186, 187, 188, 189, 190, 215, 1094, 199, 180, - 181, 182, 200, 196, 183, 237, 201, 199, 163, 202, - 203, 184, 204, 205, 206, 185, 207, 208, 209, 210, - 211, 323, 323, 323, 323, 826, 607, 607, 800, 546, - 539, 1189, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, - 1224, 1224, 1242, 1242, 343, 464, 1267, 1268, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 389, 539, - 546, 555, 556, 396, 565, 587, 601, 602, 831, 798, - 879, 874, 875, 888, 15, 832, 876, 829, 877, 878, - 830, 455, 455, 941, 882, 804, 1190, 251, 251, 559, - 455, 1240, 1240, 814, 1046, 1042, 1043, 1240, 1240, 1240, - 1240, 1240, 1240, 1240, 1240, 1240, 1240, 605, 639, 1191, - 1250, 1251, 341, 248, 248, 248, 248, 250, 252, 819, - 819, 1193, 1193, 1000, 1193, 1000, 804, 416, 804, 596, - 1000, 1282, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, - 1000, 1000, 1000, 1264, 1264, 962, 1264, 1193, 488, 5, - 489, 6, 1193, 1193, 1193, 1193, 495, 385, 1193, 1193, - 1193, 1274, 1274, 1274, 1274, 277, 277, 277, 277, 558, - 1276, 1276, 1276, 1276, 1066, 1067, 895, 346, 553, 319, - 303, 896, 703, 620, 622, 641, 640, 346, 346, 1143, - 659, 663, 976, 667, 675, 972, 1260, 430, 1292, 1292, - 332, 346, 346, 816, 346, 636, 1309, 650, 651, 652, - 844, 536, 536, 924, 536, 1292, 525, 525, 541, 1269, - 1270, 346, 525, 525, 525, 525, 525, 525, 525, 525, - 525, 525, 1295, 617, 618, 1033, 819, 446, 395, 1262, - 1262, 1033, 935, 935, 935, 935, 563, 599, 446, 929, - 936, 933, 403, 676, 822, 1186, 552, 534, 534, 534, - 534, 841, 589, 600, 984, 1031, 1253, 965, 939, 939, - 937, 939, 702, 465, 538, 974, 969, 344, 345, 706, - 440, 900, 1082, 853, 946, 440, 440, 1035, 604, 662, - 469, 1293, 1293, 981, 1077, 540, 550, 0, 0, 0, - 540, 843, 550, 645, 960, 388, 1174, 911, 1293, 837, - 1175, 1178, 912, 1179, 0, 566, 458, 459, 460, 541, - 849, 1185, 0, 1300, 1301, 254, 254, 401, 402, 0, - 0, 0, 648, 0, 649, 0, 405, 406, 407, 0, - 660, 0, 0, 408, 0, 0, 0, 339, 847, 594, - 608, 611, 612, 613, 614, 633, 634, 635, 679, 918, - 995, 1003, 1007, 1004, 1008, 0, 440, 440, 440, 440, - 440, 440, 440, 440, 440, 440, 440, 0, 1188, 440, - 852, 840, 1030, 1034, 584, 1059, 0, 680, 666, 666, - 944, 496, 672, 1057, 387, 391, 547, 586, 590, 425, - 0, 0, 0, 0, 0, 0, 425, 0, 0, 0, - 0, 0, 0, 934, 1012, 1005, 1009, 1006, 1010, 0, - 0, 0, 0, 0, 272, 0, 0, 0, 0, 537, - 537, 0, 0, 0, 0, 1075, 856, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 979, - 979 - ); - - protected $gotoCheck = array( - 42, 42, 72, 65, 65, 64, 35, 64, 121, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 26, - 9, 35, 27, 124, 35, 45, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 23, 23, 23, 23, 15, 106, 106, 7, 75, - 75, 20, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 162, 162, 95, 168, 168, 168, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 15, 6, - 15, 15, 15, 15, 75, 15, 15, 15, 15, 15, - 15, 143, 143, 49, 15, 12, 20, 5, 5, 164, - 143, 163, 163, 20, 15, 15, 15, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 55, 55, 20, - 20, 20, 171, 5, 5, 5, 5, 5, 5, 22, - 22, 72, 72, 72, 72, 72, 12, 13, 12, 13, - 72, 173, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 124, 124, 101, 124, 72, 149, 46, - 149, 46, 72, 72, 72, 72, 149, 61, 72, 72, - 72, 9, 9, 9, 9, 24, 24, 24, 24, 102, - 124, 124, 124, 124, 138, 138, 72, 14, 48, 161, - 161, 72, 48, 48, 48, 63, 48, 14, 14, 145, - 48, 48, 48, 48, 48, 48, 124, 111, 174, 174, - 29, 14, 14, 18, 14, 84, 14, 84, 84, 84, - 39, 19, 19, 90, 19, 174, 165, 165, 14, 170, - 170, 14, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 174, 83, 83, 124, 22, 19, 28, 124, - 124, 124, 19, 19, 19, 19, 2, 2, 19, 19, - 19, 91, 91, 91, 25, 154, 9, 105, 105, 105, - 105, 37, 105, 9, 108, 123, 14, 25, 25, 25, - 25, 25, 25, 151, 25, 25, 25, 95, 95, 97, - 23, 17, 17, 41, 94, 23, 23, 126, 17, 14, - 82, 175, 175, 17, 141, 9, 9, -1, -1, -1, - 9, 17, 9, 17, 17, 9, 78, 78, 175, 17, - 78, 78, 78, 78, -1, 9, 9, 9, 9, 14, - 9, 17, -1, 9, 9, 5, 5, 80, 80, -1, - -1, -1, 80, -1, 80, -1, 80, 80, 80, -1, - 80, -1, -1, 80, -1, -1, -1, 80, 9, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 87, - 87, 87, 87, 87, 87, -1, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, -1, 14, 23, - 16, 16, 16, 16, 8, 8, -1, 8, 8, 8, - 16, 8, 8, 8, 58, 58, 58, 58, 58, 115, - -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, - -1, -1, -1, 16, 115, 115, 115, 115, 115, -1, - -1, -1, -1, -1, 24, -1, -1, -1, -1, 24, - 24, -1, -1, -1, -1, 16, 16, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, - 105 - ); - - protected $gotoBase = array( - 0, 0, -297, 0, 0, 226, 196, 159, 517, 7, - 0, 0, -66, -65, 25, -175, 78, -33, 39, 84, - -213, 0, -64, 158, 302, 390, 15, 18, 46, 49, - 0, 0, 0, 0, 0, -356, 0, 67, 0, 32, - 0, -10, -1, 0, 0, 13, -417, 0, -364, 200, - 0, 0, 0, 0, 0, 208, 0, 0, 490, 0, - 0, 256, 0, 85, -14, -236, 0, 0, 0, 0, - 0, 0, -6, 0, 0, -168, 0, 0, 45, 140, - -12, 0, -35, -95, -344, 0, 0, 221, 0, 0, - 27, 92, 0, 0, -11, -287, 0, 19, 0, 0, - 0, 251, 267, 0, 0, 370, -73, 0, 43, 0, - 0, 61, 0, 0, 0, 270, 0, 0, 0, 0, - 0, 6, 0, 40, 16, 0, -7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, - 0, -2, 0, 188, 0, 59, 0, 0, 0, -195, - 0, -19, 0, 0, 35, 0, 0, 0, 0, 0, - 0, 3, -57, -8, 201, 117, 0, 0, -110, 0, - -4, 223, 0, 241, 36, 129, 0, 0 - ); - - protected $gotoDefault = array( - -32768, 500, 710, 4, 711, 904, 787, 796, 582, 516, - 678, 340, 609, 414, 1258, 881, 1081, 564, 815, 1202, - 1210, 447, 818, 324, 700, 863, 864, 865, 392, 377, - 383, 390, 631, 610, 482, 850, 443, 842, 474, 845, - 442, 854, 162, 411, 498, 858, 3, 860, 543, 891, - 378, 868, 379, 655, 870, 549, 872, 873, 386, 393, - 394, 1086, 557, 606, 885, 243, 551, 886, 376, 887, - 894, 381, 384, 664, 454, 493, 487, 404, 1061, 593, - 628, 451, 468, 616, 615, 603, 467, 426, 409, 326, - 923, 931, 475, 452, 945, 342, 953, 708, 1093, 623, - 477, 961, 624, 968, 971, 517, 518, 466, 983, 269, - 986, 478, 1018, 646, 647, 998, 625, 626, 1016, 461, - 583, 1024, 444, 1032, 1246, 445, 1036, 262, 1039, 276, - 410, 427, 1044, 1045, 8, 1051, 670, 671, 10, 273, - 497, 1076, 665, 441, 1092, 431, 1162, 1164, 545, 479, - 1182, 1181, 658, 494, 1187, 1249, 439, 519, 462, 310, - 520, 302, 328, 307, 535, 289, 329, 521, 463, 1255, - 1263, 325, 30, 1283, 1294, 336, 561, 598 - ); - - protected $ruleToNonTerminal = array( - 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, - 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, - 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, - 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, - 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, - 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, - 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 25, 25, 68, 68, 71, 71, 70, 69, - 69, 62, 74, 74, 75, 75, 76, 76, 77, 77, - 78, 78, 26, 26, 27, 27, 27, 27, 86, 86, - 88, 88, 81, 81, 89, 89, 90, 90, 90, 82, - 82, 85, 85, 83, 83, 91, 92, 92, 56, 56, - 64, 64, 67, 67, 67, 66, 93, 93, 94, 57, - 57, 57, 57, 95, 95, 96, 96, 97, 97, 98, - 99, 99, 100, 100, 101, 101, 54, 54, 50, 50, - 103, 52, 52, 104, 51, 51, 53, 53, 63, 63, - 63, 63, 79, 79, 107, 107, 109, 109, 110, 110, - 110, 110, 108, 108, 108, 112, 112, 112, 112, 87, - 87, 115, 115, 115, 113, 113, 116, 116, 114, 114, - 117, 117, 118, 118, 118, 118, 111, 111, 80, 80, - 80, 20, 20, 20, 120, 119, 119, 121, 121, 121, - 121, 59, 122, 122, 123, 60, 125, 125, 126, 126, - 127, 127, 84, 128, 128, 128, 128, 128, 128, 133, - 133, 134, 134, 135, 135, 135, 135, 135, 136, 137, - 137, 132, 132, 129, 129, 131, 131, 139, 139, 138, - 138, 138, 138, 138, 138, 138, 130, 140, 140, 142, - 141, 141, 61, 102, 143, 143, 55, 55, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 150, 144, 144, 149, 149, 152, 153, 153, 154, - 155, 155, 155, 19, 19, 72, 72, 72, 72, 145, - 145, 145, 145, 157, 157, 146, 146, 148, 148, 148, - 151, 151, 162, 162, 162, 162, 162, 162, 162, 162, - 162, 163, 163, 106, 165, 165, 165, 165, 147, 147, - 147, 147, 147, 147, 147, 147, 58, 58, 160, 160, - 160, 160, 166, 166, 156, 156, 156, 167, 167, 167, - 167, 167, 167, 73, 73, 65, 65, 65, 65, 124, - 124, 124, 124, 170, 169, 159, 159, 159, 159, 159, - 159, 159, 158, 158, 158, 168, 168, 168, 168, 105, - 164, 172, 172, 171, 171, 173, 173, 173, 173, 173, - 173, 173, 173, 161, 161, 161, 161, 175, 176, 174, - 174, 174, 174, 174, 174, 174, 174, 177, 177, 177, - 177 - ); - - protected $ruleToLength = array( - 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, - 2, 0, 1, 1, 1, 1, 1, 3, 5, 4, - 3, 4, 2, 3, 1, 1, 7, 6, 2, 3, - 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, - 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, - 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, - 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, - 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, - 2, 1, 1, 1, 0, 2, 1, 3, 8, 0, - 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, - 3, 1, 8, 9, 8, 7, 6, 8, 0, 2, - 0, 2, 1, 2, 1, 2, 1, 1, 1, 0, - 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, - 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, - 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, - 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, - 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, - 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, - 1, 1, 6, 8, 6, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, - 3, 3, 1, 2, 1, 1, 0, 1, 0, 2, - 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, - 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, - 2, 0, 1, 5, 5, 10, 3, 5, 1, 1, - 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, - 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, - 1, 3, 2, 2, 3, 1, 0, 1, 1, 3, - 3, 3, 4, 1, 1, 2, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, - 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, - 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, - 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, - 10, 8, 3, 2, 0, 4, 2, 1, 3, 2, - 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 1, 1, 1, 0, 3, 0, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 3, 3, 4, 1, 1, 3, 1, 1, - 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, - 1, 1, 1, 1, 1, 3, 1, 1, 4, 4, - 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, - 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, - 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, - 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, - 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, - 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, - 1 - ); - - protected function initReduceCallbacks() { - $this->reduceCallbacks = [ - 0 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 1 => function ($stackPos) { - $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); - }, - 2 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 3 => function ($stackPos) { - $this->semValue = array(); - }, - 4 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 5 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 6 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 7 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 8 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 9 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 10 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 11 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 12 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 13 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 14 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 15 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 16 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 17 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 18 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 19 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 20 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 21 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 22 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 23 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 24 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 25 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 26 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 27 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 28 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 29 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 30 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 31 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 32 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 33 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 34 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 35 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 36 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 37 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 38 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 39 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 40 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 41 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 42 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 43 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 44 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 45 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 46 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 47 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 48 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 49 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 50 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 51 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 52 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 53 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 54 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 55 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 56 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 57 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 58 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 59 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 60 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 61 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 62 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 63 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 64 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 65 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 66 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 67 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 68 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 69 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 70 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 71 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 72 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 73 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 74 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 75 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 76 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 77 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 78 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 79 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 80 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 81 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 82 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 83 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 84 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 85 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 86 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 87 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 88 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 89 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 90 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 91 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 92 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 93 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 94 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 95 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 96 => function ($stackPos) { - $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 97 => function ($stackPos) { - $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 98 => function ($stackPos) { - /* nothing */ - }, - 99 => function ($stackPos) { - /* nothing */ - }, - 100 => function ($stackPos) { - /* nothing */ - }, - 101 => function ($stackPos) { - $this->emitError(new Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); - }, - 102 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 103 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 104 => function ($stackPos) { - $this->semValue = new Node\Attribute($this->semStack[$stackPos-(1-1)], [], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 105 => function ($stackPos) { - $this->semValue = new Node\Attribute($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 106 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 107 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 108 => function ($stackPos) { - $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 109 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 110 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 111 => function ($stackPos) { - $this->semValue = []; - }, - 112 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 113 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 114 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 115 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 116 => function ($stackPos) { - $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 117 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($this->semValue); - }, - 118 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, - 119 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, - 120 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 121 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 122 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 123 => function ($stackPos) { - $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 124 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_FUNCTION; - }, - 125 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_CONSTANT; - }, - 126 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 127 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 128 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 129 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 130 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 131 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 132 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 133 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 134 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 135 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 136 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 137 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); - }, - 138 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 139 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); - }, - 140 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 141 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; - }, - 142 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; - }, - 143 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 144 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 145 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 146 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 147 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 148 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 149 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 150 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 151 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 152 => function ($stackPos) { - $this->semValue = array(); - }, - 153 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 154 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 155 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 156 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 157 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 158 => function ($stackPos) { - - if ($this->semStack[$stackPos-(3-2)]) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; - } else { - $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if (null === $this->semValue) { $this->semValue = array(); } - } - - }, - 159 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(7-3)], ['stmts' => is_array($this->semStack[$stackPos-(7-5)]) ? $this->semStack[$stackPos-(7-5)] : array($this->semStack[$stackPos-(7-5)]), 'elseifs' => $this->semStack[$stackPos-(7-6)], 'else' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 160 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(10-3)], ['stmts' => $this->semStack[$stackPos-(10-6)], 'elseifs' => $this->semStack[$stackPos-(10-7)], 'else' => $this->semStack[$stackPos-(10-8)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 161 => function ($stackPos) { - $this->semValue = new Stmt\While_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 162 => function ($stackPos) { - $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(7-5)], is_array($this->semStack[$stackPos-(7-2)]) ? $this->semStack[$stackPos-(7-2)] : array($this->semStack[$stackPos-(7-2)]), $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 163 => function ($stackPos) { - $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 164 => function ($stackPos) { - $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 165 => function ($stackPos) { - $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 166 => function ($stackPos) { - $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 167 => function ($stackPos) { - $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 168 => function ($stackPos) { - $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 169 => function ($stackPos) { - $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 170 => function ($stackPos) { - $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 171 => function ($stackPos) { - $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 172 => function ($stackPos) { - - $e = $this->semStack[$stackPos-(2-1)]; - if ($e instanceof Expr\Throw_) { - // For backwards-compatibility reasons, convert throw in statement position into - // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). - $this->semValue = new Stmt\Throw_($e->expr, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - } else { - $this->semValue = new Stmt\Expression($e, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - } - - }, - 173 => function ($stackPos) { - $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 174 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 175 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 176 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(6-3)], new Expr\Error($this->startAttributeStack[$stackPos-(6-4)] + $this->endAttributeStack[$stackPos-(6-4)]), ['stmts' => $this->semStack[$stackPos-(6-6)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 177 => function ($stackPos) { - $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 178 => function ($stackPos) { - $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); - }, - 179 => function ($stackPos) { - $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 180 => function ($stackPos) { - $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 181 => function ($stackPos) { - $this->semValue = array(); /* means: no statement */ - }, - 182 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 183 => function ($stackPos) { - $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ - }, - 184 => function ($stackPos) { - $this->semValue = array(); - }, - 185 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 186 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 187 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 188 => function ($stackPos) { - $this->semValue = new Stmt\Catch_($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 189 => function ($stackPos) { - $this->semValue = null; - }, - 190 => function ($stackPos) { - $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 191 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 192 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 193 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 194 => function ($stackPos) { - $this->semValue = false; - }, - 195 => function ($stackPos) { - $this->semValue = true; - }, - 196 => function ($stackPos) { - $this->semValue = false; - }, - 197 => function ($stackPos) { - $this->semValue = true; - }, - 198 => function ($stackPos) { - $this->semValue = false; - }, - 199 => function ($stackPos) { - $this->semValue = true; - }, - 200 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 201 => function ($stackPos) { - $this->semValue = []; - }, - 202 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(8-3)], ['byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-5)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 203 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(9-4)], ['byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 204 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(8-3)], ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos-(8-3)); - }, - 205 => function ($stackPos) { - $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(7-3)], ['extends' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => $this->semStack[$stackPos-(7-1)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - $this->checkInterface($this->semValue, $stackPos-(7-3)); - }, - 206 => function ($stackPos) { - $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(6-3)], ['stmts' => $this->semStack[$stackPos-(6-5)], 'attrGroups' => $this->semStack[$stackPos-(6-1)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 207 => function ($stackPos) { - $this->semValue = new Stmt\Enum_($this->semStack[$stackPos-(8-3)], ['scalarType' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - $this->checkEnum($this->semValue, $stackPos-(8-3)); - }, - 208 => function ($stackPos) { - $this->semValue = null; - }, - 209 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 210 => function ($stackPos) { - $this->semValue = null; - }, - 211 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 212 => function ($stackPos) { - $this->semValue = 0; - }, - 213 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 214 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 215 => function ($stackPos) { - $this->checkClassModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; - }, - 216 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, - 217 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, - 218 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, - 219 => function ($stackPos) { - $this->semValue = null; - }, - 220 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 221 => function ($stackPos) { - $this->semValue = array(); - }, - 222 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 223 => function ($stackPos) { - $this->semValue = array(); - }, - 224 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 225 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 226 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 227 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 228 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 229 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 230 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 231 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 232 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 233 => function ($stackPos) { - $this->semValue = null; - }, - 234 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 235 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 236 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 237 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 238 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 239 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 240 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 241 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 242 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(5-3)]; - }, - 243 => function ($stackPos) { - $this->semValue = array(); - }, - 244 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 245 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 246 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 247 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 248 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 249 => function ($stackPos) { - $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 250 => function ($stackPos) { - $this->semValue = []; - }, - 251 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 252 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 253 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 254 => function ($stackPos) { - $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 255 => function ($stackPos) { - $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 256 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 257 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 258 => function ($stackPos) { - $this->semValue = array(); - }, - 259 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 260 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 261 => function ($stackPos) { - $this->semValue = array(); - }, - 262 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 263 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 264 => function ($stackPos) { - $this->semValue = null; - }, - 265 => function ($stackPos) { - $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 266 => function ($stackPos) { - $this->semValue = null; - }, - 267 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 268 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 269 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-2)], true); - }, - 270 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 271 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 272 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 273 => function ($stackPos) { - $this->semValue = array(); - }, - 274 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 275 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 276 => function ($stackPos) { - $this->semValue = 0; - }, - 277 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; - }, - 278 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, - 279 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, - 280 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, - 281 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, - 282 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); - $this->checkParam($this->semValue); - }, - 283 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]); - $this->checkParam($this->semValue); - }, - 284 => function ($stackPos) { - $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); - }, - 285 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 286 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 287 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 288 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 289 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 290 => function ($stackPos) { - $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 291 => function ($stackPos) { - $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]); - }, - 292 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 293 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 294 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 295 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 296 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 297 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 298 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 299 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 300 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 301 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 302 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 303 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 304 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 305 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 306 => function ($stackPos) { - $this->semValue = null; - }, - 307 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 308 => function ($stackPos) { - $this->semValue = null; - }, - 309 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 310 => function ($stackPos) { - $this->semValue = null; - }, - 311 => function ($stackPos) { - $this->semValue = array(); - }, - 312 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 313 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-2)]); - }, - 314 => function ($stackPos) { - $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 315 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 316 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 317 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 318 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 319 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 320 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]); - }, - 321 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 322 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 323 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 324 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 325 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 326 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 327 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 328 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 329 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 330 => function ($stackPos) { - if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } - }, - 331 => function ($stackPos) { - $this->semValue = array(); - }, - 332 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 333 => function ($stackPos) { - $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]); - $this->checkProperty($this->semValue, $stackPos-(5-2)); - }, - 334 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-1)]); - $this->checkClassConst($this->semValue, $stackPos-(5-2)); - }, - 335 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - $this->checkClassMethod($this->semValue, $stackPos-(10-2)); - }, - 336 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 337 => function ($stackPos) { - $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 338 => function ($stackPos) { - $this->semValue = null; /* will be skipped */ - }, - 339 => function ($stackPos) { - $this->semValue = array(); - }, - 340 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 341 => function ($stackPos) { - $this->semValue = array(); - }, - 342 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 343 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 344 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 345 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 346 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 347 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 348 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 349 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 350 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); - }, - 351 => function ($stackPos) { - $this->semValue = null; - }, - 352 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 353 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 354 => function ($stackPos) { - $this->semValue = 0; - }, - 355 => function ($stackPos) { - $this->semValue = 0; - }, - 356 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 357 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 358 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; - }, - 359 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, - 360 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, - 361 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, - 362 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; - }, - 363 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, - 364 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, - 365 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, - 366 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 367 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 368 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 369 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 370 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 371 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 372 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 373 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 374 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 375 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 376 => function ($stackPos) { - $this->semValue = array(); - }, - 377 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 378 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 379 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 380 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 381 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 382 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 383 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 384 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 385 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 386 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 387 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 388 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 389 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 390 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 391 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 392 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 393 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 394 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 395 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 396 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 397 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 398 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 399 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 400 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 401 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 402 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 403 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 404 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 405 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 406 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 407 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 408 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 409 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 410 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 411 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 412 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 413 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 414 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 415 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 416 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 417 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 418 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 419 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 420 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 421 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 422 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 423 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 424 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 425 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 426 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 427 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 428 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 429 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 430 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 431 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 432 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 433 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 434 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 435 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 436 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 437 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 438 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 439 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 440 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 441 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 442 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 443 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 444 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 445 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 446 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 447 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); - $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); - }, - 448 => function ($stackPos) { - $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 449 => function ($stackPos) { - $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 450 => function ($stackPos) { - $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 451 => function ($stackPos) { - $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 452 => function ($stackPos) { - $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 453 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); - }, - 454 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 455 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 456 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 457 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 458 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 459 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 460 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 461 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 462 => function ($stackPos) { - $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 463 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 464 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 465 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 466 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 467 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 468 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 469 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 470 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 471 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]); - $this->checkClass($this->semValue[0], -1); - }, - 472 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 473 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 474 => function ($stackPos) { - $this->semValue = array(); - }, - 475 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 476 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 477 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 478 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 479 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 480 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 481 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 482 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 483 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 484 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 485 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 486 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 487 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 488 => function ($stackPos) { - $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 489 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 490 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 491 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 492 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; - }, - 493 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 494 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 495 => function ($stackPos) { - $this->semValue = null; - }, - 496 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 497 => function ($stackPos) { - $this->semValue = array(); - }, - 498 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); - }, - 499 => function ($stackPos) { - foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 500 => function ($stackPos) { - $this->semValue = array(); - }, - 501 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 502 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 503 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 504 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 505 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 506 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 507 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 508 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 509 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 510 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 511 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 512 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2; - }, - 513 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); - }, - 514 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); - }, - 515 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 516 => function ($stackPos) { - $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 517 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); - }, - 518 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 519 => function ($stackPos) { - $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 520 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 521 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 522 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 523 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); - }, - 524 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true); - }, - 525 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); - }, - 526 => function ($stackPos) { - $this->semValue = null; - }, - 527 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 528 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 529 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 530 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 531 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 532 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 533 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 534 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 535 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 536 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 537 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 538 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 539 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 540 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 541 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 542 => function ($stackPos) { - $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 543 => function ($stackPos) { - $this->semValue = null; - }, - 544 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 545 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 546 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 547 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 548 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 549 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 550 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 551 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 552 => function ($stackPos) { - $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2; - }, - 553 => function ($stackPos) { - $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; - }, - 554 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 555 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 556 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 557 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 558 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 559 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 560 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 561 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 562 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 563 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 564 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 565 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 566 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 567 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 568 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; - }, - 569 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 570 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue); - }, - 571 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 572 => function ($stackPos) { - /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ - }, - 573 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 574 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 575 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 576 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 577 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 578 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 579 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 580 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 581 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 582 => function ($stackPos) { - $this->semValue = null; - }, - 583 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 584 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 585 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 586 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); - }, - 587 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 588 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 589 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 590 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 591 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 592 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 593 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 594 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 595 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 596 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 597 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 598 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 599 => function ($stackPos) { - $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 600 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - ]; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php deleted file mode 100644 index b76a5d94..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php +++ /dev/null @@ -1,148 +0,0 @@ -lexer = $lexer; - - if (isset($options['throwOnError'])) { - throw new \LogicException( - '"throwOnError" is no longer supported, use "errorHandler" instead'); - } - - $this->initReduceCallbacks(); - } - - /** - * Parses PHP code into a node tree. - * - * If a non-throwing error handler is used, the parser will continue parsing after an error - * occurred and attempt to build a partial AST. - * - * @param string $code The source code to parse - * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults - * to ErrorHandler\Throwing. - * - * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and - * the parser was unable to recover from an error). - */ - public function parse(string $code, ErrorHandler $errorHandler = null) { - $this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing; - - $this->lexer->startLexing($code, $this->errorHandler); - $result = $this->doParse(); - - // Clear out some of the interior state, so we don't hold onto unnecessary - // memory between uses of the parser - $this->startAttributeStack = []; - $this->endAttributeStack = []; - $this->semStack = []; - $this->semValue = null; - - return $result; - } - - protected function doParse() { - // We start off with no lookahead-token - $symbol = self::SYMBOL_NONE; - - // The attributes for a node are taken from the first and last token of the node. - // From the first token only the startAttributes are taken and from the last only - // the endAttributes. Both are merged using the array union operator (+). - $startAttributes = []; - $endAttributes = []; - $this->endAttributes = $endAttributes; - - // Keep stack of start and end attributes - $this->startAttributeStack = []; - $this->endAttributeStack = [$endAttributes]; - - // Start off in the initial state and keep a stack of previous states - $state = 0; - $stateStack = [$state]; - - // Semantic value stack (contains values of tokens and semantic action results) - $this->semStack = []; - - // Current position in the stack(s) - $stackPos = 0; - - $this->errorState = 0; - - for (;;) { - //$this->traceNewState($state, $symbol); - - if ($this->actionBase[$state] === 0) { - $rule = $this->actionDefault[$state]; - } else { - if ($symbol === self::SYMBOL_NONE) { - // Fetch the next token id from the lexer and fetch additional info by-ref. - // The end attributes are fetched into a temporary variable and only set once the token is really - // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is - // reduced after a token was read but not yet shifted. - $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes); - - // map the lexer token id to the internally used symbols - $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize - ? $this->tokenToSymbol[$tokenId] - : $this->invalidSymbol; - - if ($symbol === $this->invalidSymbol) { - throw new \RangeException(sprintf( - 'The lexer returned an invalid token (id=%d, value=%s)', - $tokenId, $tokenValue - )); - } - - // Allow productions to access the start attributes of the lookahead token. - $this->lookaheadStartAttributes = $startAttributes; - - //$this->traceRead($symbol); - } - - $idx = $this->actionBase[$state] + $symbol; - if ((($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) - || ($state < $this->YY2TBLSTATE - && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 - && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol)) - && ($action = $this->action[$idx]) !== $this->defaultAction) { - /* - * >= numNonLeafStates: shift and reduce - * > 0: shift - * = 0: accept - * < 0: reduce - * = -YYUNEXPECTED: error - */ - if ($action > 0) { - /* shift */ - //$this->traceShift($symbol); - - ++$stackPos; - $stateStack[$stackPos] = $state = $action; - $this->semStack[$stackPos] = $tokenValue; - $this->startAttributeStack[$stackPos] = $startAttributes; - $this->endAttributeStack[$stackPos] = $endAttributes; - $this->endAttributes = $endAttributes; - $symbol = self::SYMBOL_NONE; - - if ($this->errorState) { - --$this->errorState; - } - - if ($action < $this->numNonLeafStates) { - continue; - } - - /* $yyn >= numNonLeafStates means shift-and-reduce */ - $rule = $action - $this->numNonLeafStates; - } else { - $rule = -$action; - } - } else { - $rule = $this->actionDefault[$state]; - } - } - - for (;;) { - if ($rule === 0) { - /* accept */ - //$this->traceAccept(); - return $this->semValue; - } elseif ($rule !== $this->unexpectedTokenRule) { - /* reduce */ - //$this->traceReduce($rule); - - try { - $this->reduceCallbacks[$rule]($stackPos); - } catch (Error $e) { - if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) { - $e->setStartLine($startAttributes['startLine']); - } - - $this->emitError($e); - // Can't recover from this type of error - return null; - } - - /* Goto - shift nonterminal */ - $lastEndAttributes = $this->endAttributeStack[$stackPos]; - $ruleLength = $this->ruleToLength[$rule]; - $stackPos -= $ruleLength; - $nonTerminal = $this->ruleToNonTerminal[$rule]; - $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos]; - if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) { - $state = $this->goto[$idx]; - } else { - $state = $this->gotoDefault[$nonTerminal]; - } - - ++$stackPos; - $stateStack[$stackPos] = $state; - $this->semStack[$stackPos] = $this->semValue; - $this->endAttributeStack[$stackPos] = $lastEndAttributes; - if ($ruleLength === 0) { - // Empty productions use the start attributes of the lookahead token. - $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; - } - } else { - /* error */ - switch ($this->errorState) { - case 0: - $msg = $this->getErrorMessage($symbol, $state); - $this->emitError(new Error($msg, $startAttributes + $endAttributes)); - // Break missing intentionally - case 1: - case 2: - $this->errorState = 3; - - // Pop until error-expecting state uncovered - while (!( - (($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0 - && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) - || ($state < $this->YY2TBLSTATE - && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0 - && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) - ) || ($action = $this->action[$idx]) === $this->defaultAction) { // Not totally sure about this - if ($stackPos <= 0) { - // Could not recover from error - return null; - } - $state = $stateStack[--$stackPos]; - //$this->tracePop($state); - } - - //$this->traceShift($this->errorSymbol); - ++$stackPos; - $stateStack[$stackPos] = $state = $action; - - // We treat the error symbol as being empty, so we reset the end attributes - // to the end attributes of the last non-error symbol - $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; - $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1]; - $this->endAttributes = $this->endAttributeStack[$stackPos - 1]; - break; - - case 3: - if ($symbol === 0) { - // Reached EOF without recovering from error - return null; - } - - //$this->traceDiscard($symbol); - $symbol = self::SYMBOL_NONE; - break 2; - } - } - - if ($state < $this->numNonLeafStates) { - break; - } - - /* >= numNonLeafStates means shift-and-reduce */ - $rule = $state - $this->numNonLeafStates; - } - } - - throw new \RuntimeException('Reached end of parser loop'); - } - - protected function emitError(Error $error) { - $this->errorHandler->handleError($error); - } - - /** - * Format error message including expected tokens. - * - * @param int $symbol Unexpected symbol - * @param int $state State at time of error - * - * @return string Formatted error message - */ - protected function getErrorMessage(int $symbol, int $state) : string { - $expectedString = ''; - if ($expected = $this->getExpectedTokens($state)) { - $expectedString = ', expecting ' . implode(' or ', $expected); - } - - return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString; - } - - /** - * Get limited number of expected tokens in given state. - * - * @param int $state State - * - * @return string[] Expected tokens. If too many, an empty array is returned. - */ - protected function getExpectedTokens(int $state) : array { - $expected = []; - - $base = $this->actionBase[$state]; - foreach ($this->symbolToName as $symbol => $name) { - $idx = $base + $symbol; - if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol - || $state < $this->YY2TBLSTATE - && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 - && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol - ) { - if ($this->action[$idx] !== $this->unexpectedTokenRule - && $this->action[$idx] !== $this->defaultAction - && $symbol !== $this->errorSymbol - ) { - if (count($expected) === 4) { - /* Too many expected tokens */ - return []; - } - - $expected[] = $name; - } - } - } - - return $expected; - } - - /* - * Tracing functions used for debugging the parser. - */ - - /* - protected function traceNewState($state, $symbol) { - echo '% State ' . $state - . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n"; - } - - protected function traceRead($symbol) { - echo '% Reading ' . $this->symbolToName[$symbol] . "\n"; - } - - protected function traceShift($symbol) { - echo '% Shift ' . $this->symbolToName[$symbol] . "\n"; - } - - protected function traceAccept() { - echo "% Accepted.\n"; - } - - protected function traceReduce($n) { - echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n"; - } - - protected function tracePop($state) { - echo '% Recovering, uncovered state ' . $state . "\n"; - } - - protected function traceDiscard($symbol) { - echo '% Discard ' . $this->symbolToName[$symbol] . "\n"; - } - */ - - /* - * Helper functions invoked by semantic actions - */ - - /** - * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions. - * - * @param Node\Stmt[] $stmts - * @return Node\Stmt[] - */ - protected function handleNamespaces(array $stmts) : array { - $hasErrored = false; - $style = $this->getNamespacingStyle($stmts); - if (null === $style) { - // not namespaced, nothing to do - return $stmts; - } elseif ('brace' === $style) { - // For braced namespaces we only have to check that there are no invalid statements between the namespaces - $afterFirstNamespace = false; - foreach ($stmts as $stmt) { - if ($stmt instanceof Node\Stmt\Namespace_) { - $afterFirstNamespace = true; - } elseif (!$stmt instanceof Node\Stmt\HaltCompiler - && !$stmt instanceof Node\Stmt\Nop - && $afterFirstNamespace && !$hasErrored) { - $this->emitError(new Error( - 'No code may exist outside of namespace {}', $stmt->getAttributes())); - $hasErrored = true; // Avoid one error for every statement - } - } - return $stmts; - } else { - // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts - $resultStmts = []; - $targetStmts =& $resultStmts; - $lastNs = null; - foreach ($stmts as $stmt) { - if ($stmt instanceof Node\Stmt\Namespace_) { - if ($lastNs !== null) { - $this->fixupNamespaceAttributes($lastNs); - } - if ($stmt->stmts === null) { - $stmt->stmts = []; - $targetStmts =& $stmt->stmts; - $resultStmts[] = $stmt; - } else { - // This handles the invalid case of mixed style namespaces - $resultStmts[] = $stmt; - $targetStmts =& $resultStmts; - } - $lastNs = $stmt; - } elseif ($stmt instanceof Node\Stmt\HaltCompiler) { - // __halt_compiler() is not moved into the namespace - $resultStmts[] = $stmt; - } else { - $targetStmts[] = $stmt; - } - } - if ($lastNs !== null) { - $this->fixupNamespaceAttributes($lastNs); - } - return $resultStmts; - } - } - - private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt) { - // We moved the statements into the namespace node, as such the end of the namespace node - // needs to be extended to the end of the statements. - if (empty($stmt->stmts)) { - return; - } - - // We only move the builtin end attributes here. This is the best we can do with the - // knowledge we have. - $endAttributes = ['endLine', 'endFilePos', 'endTokenPos']; - $lastStmt = $stmt->stmts[count($stmt->stmts) - 1]; - foreach ($endAttributes as $endAttribute) { - if ($lastStmt->hasAttribute($endAttribute)) { - $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute)); - } - } - } - - /** - * Determine namespacing style (semicolon or brace) - * - * @param Node[] $stmts Top-level statements. - * - * @return null|string One of "semicolon", "brace" or null (no namespaces) - */ - private function getNamespacingStyle(array $stmts) { - $style = null; - $hasNotAllowedStmts = false; - foreach ($stmts as $i => $stmt) { - if ($stmt instanceof Node\Stmt\Namespace_) { - $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace'; - if (null === $style) { - $style = $currentStyle; - if ($hasNotAllowedStmts) { - $this->emitError(new Error( - 'Namespace declaration statement has to be the very first statement in the script', - $stmt->getLine() // Avoid marking the entire namespace as an error - )); - } - } elseif ($style !== $currentStyle) { - $this->emitError(new Error( - 'Cannot mix bracketed namespace declarations with unbracketed namespace declarations', - $stmt->getLine() // Avoid marking the entire namespace as an error - )); - // Treat like semicolon style for namespace normalization - return 'semicolon'; - } - continue; - } - - /* declare(), __halt_compiler() and nops can be used before a namespace declaration */ - if ($stmt instanceof Node\Stmt\Declare_ - || $stmt instanceof Node\Stmt\HaltCompiler - || $stmt instanceof Node\Stmt\Nop) { - continue; - } - - /* There may be a hashbang line at the very start of the file */ - if ($i === 0 && $stmt instanceof Node\Stmt\InlineHTML && preg_match('/\A#!.*\r?\n\z/', $stmt->value)) { - continue; - } - - /* Everything else if forbidden before namespace declarations */ - $hasNotAllowedStmts = true; - } - return $style; - } - - /** - * Fix up parsing of static property calls in PHP 5. - * - * In PHP 5 A::$b[c][d] and A::$b[c][d]() have very different interpretation. The former is - * interpreted as (A::$b)[c][d], while the latter is the same as A::{$b[c][d]}(). We parse the - * latter as the former initially and this method fixes the AST into the correct form when we - * encounter the "()". - * - * @param Node\Expr\StaticPropertyFetch|Node\Expr\ArrayDimFetch $prop - * @param Node\Arg[] $args - * @param array $attributes - * - * @return Expr\StaticCall - */ - protected function fixupPhp5StaticPropCall($prop, array $args, array $attributes) : Expr\StaticCall { - if ($prop instanceof Node\Expr\StaticPropertyFetch) { - $name = $prop->name instanceof VarLikeIdentifier - ? $prop->name->toString() : $prop->name; - $var = new Expr\Variable($name, $prop->name->getAttributes()); - return new Expr\StaticCall($prop->class, $var, $args, $attributes); - } elseif ($prop instanceof Node\Expr\ArrayDimFetch) { - $tmp = $prop; - while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { - $tmp = $tmp->var; - } - - /** @var Expr\StaticPropertyFetch $staticProp */ - $staticProp = $tmp->var; - - // Set start attributes to attributes of innermost node - $tmp = $prop; - $this->fixupStartAttributes($tmp, $staticProp->name); - while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { - $tmp = $tmp->var; - $this->fixupStartAttributes($tmp, $staticProp->name); - } - - $name = $staticProp->name instanceof VarLikeIdentifier - ? $staticProp->name->toString() : $staticProp->name; - $tmp->var = new Expr\Variable($name, $staticProp->name->getAttributes()); - return new Expr\StaticCall($staticProp->class, $prop, $args, $attributes); - } else { - throw new \Exception; - } - } - - protected function fixupStartAttributes(Node $to, Node $from) { - $startAttributes = ['startLine', 'startFilePos', 'startTokenPos']; - foreach ($startAttributes as $startAttribute) { - if ($from->hasAttribute($startAttribute)) { - $to->setAttribute($startAttribute, $from->getAttribute($startAttribute)); - } - } - } - - protected function handleBuiltinTypes(Name $name) { - $builtinTypes = [ - 'bool' => true, - 'int' => true, - 'float' => true, - 'string' => true, - 'iterable' => true, - 'void' => true, - 'object' => true, - 'null' => true, - 'false' => true, - 'mixed' => true, - 'never' => true, - ]; - - if (!$name->isUnqualified()) { - return $name; - } - - $lowerName = $name->toLowerString(); - if (!isset($builtinTypes[$lowerName])) { - return $name; - } - - return new Node\Identifier($lowerName, $name->getAttributes()); - } - - /** - * Get combined start and end attributes at a stack location - * - * @param int $pos Stack location - * - * @return array Combined start and end attributes - */ - protected function getAttributesAt(int $pos) : array { - return $this->startAttributeStack[$pos] + $this->endAttributeStack[$pos]; - } - - protected function getFloatCastKind(string $cast): int - { - $cast = strtolower($cast); - if (strpos($cast, 'float') !== false) { - return Double::KIND_FLOAT; - } - - if (strpos($cast, 'real') !== false) { - return Double::KIND_REAL; - } - - return Double::KIND_DOUBLE; - } - - protected function parseLNumber($str, $attributes, $allowInvalidOctal = false) { - try { - return LNumber::fromString($str, $attributes, $allowInvalidOctal); - } catch (Error $error) { - $this->emitError($error); - // Use dummy value - return new LNumber(0, $attributes); - } - } - - /** - * Parse a T_NUM_STRING token into either an integer or string node. - * - * @param string $str Number string - * @param array $attributes Attributes - * - * @return LNumber|String_ Integer or string node. - */ - protected function parseNumString(string $str, array $attributes) { - if (!preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) { - return new String_($str, $attributes); - } - - $num = +$str; - if (!is_int($num)) { - return new String_($str, $attributes); - } - - return new LNumber($num, $attributes); - } - - protected function stripIndentation( - string $string, int $indentLen, string $indentChar, - bool $newlineAtStart, bool $newlineAtEnd, array $attributes - ) { - if ($indentLen === 0) { - return $string; - } - - $start = $newlineAtStart ? '(?:(?<=\n)|\A)' : '(?<=\n)'; - $end = $newlineAtEnd ? '(?:(?=[\r\n])|\z)' : '(?=[\r\n])'; - $regex = '/' . $start . '([ \t]*)(' . $end . ')?/'; - return preg_replace_callback( - $regex, - function ($matches) use ($indentLen, $indentChar, $attributes) { - $prefix = substr($matches[1], 0, $indentLen); - if (false !== strpos($prefix, $indentChar === " " ? "\t" : " ")) { - $this->emitError(new Error( - 'Invalid indentation - tabs and spaces cannot be mixed', $attributes - )); - } elseif (strlen($prefix) < $indentLen && !isset($matches[2])) { - $this->emitError(new Error( - 'Invalid body indentation level ' . - '(expecting an indentation level of at least ' . $indentLen . ')', - $attributes - )); - } - return substr($matches[0], strlen($prefix)); - }, - $string - ); - } - - protected function parseDocString( - string $startToken, $contents, string $endToken, - array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape - ) { - $kind = strpos($startToken, "'") === false - ? String_::KIND_HEREDOC : String_::KIND_NOWDOC; - - $regex = '/\A[bB]?<<<[ \t]*[\'"]?([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[\'"]?(?:\r\n|\n|\r)\z/'; - $result = preg_match($regex, $startToken, $matches); - assert($result === 1); - $label = $matches[1]; - - $result = preg_match('/\A[ \t]*/', $endToken, $matches); - assert($result === 1); - $indentation = $matches[0]; - - $attributes['kind'] = $kind; - $attributes['docLabel'] = $label; - $attributes['docIndentation'] = $indentation; - - $indentHasSpaces = false !== strpos($indentation, " "); - $indentHasTabs = false !== strpos($indentation, "\t"); - if ($indentHasSpaces && $indentHasTabs) { - $this->emitError(new Error( - 'Invalid indentation - tabs and spaces cannot be mixed', - $endTokenAttributes - )); - - // Proceed processing as if this doc string is not indented - $indentation = ''; - } - - $indentLen = \strlen($indentation); - $indentChar = $indentHasSpaces ? " " : "\t"; - - if (\is_string($contents)) { - if ($contents === '') { - return new String_('', $attributes); - } - - $contents = $this->stripIndentation( - $contents, $indentLen, $indentChar, true, true, $attributes - ); - $contents = preg_replace('~(\r\n|\n|\r)\z~', '', $contents); - - if ($kind === String_::KIND_HEREDOC) { - $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape); - } - - return new String_($contents, $attributes); - } else { - assert(count($contents) > 0); - if (!$contents[0] instanceof Node\Scalar\EncapsedStringPart) { - // If there is no leading encapsed string part, pretend there is an empty one - $this->stripIndentation( - '', $indentLen, $indentChar, true, false, $contents[0]->getAttributes() - ); - } - - $newContents = []; - foreach ($contents as $i => $part) { - if ($part instanceof Node\Scalar\EncapsedStringPart) { - $isLast = $i === \count($contents) - 1; - $part->value = $this->stripIndentation( - $part->value, $indentLen, $indentChar, - $i === 0, $isLast, $part->getAttributes() - ); - $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); - if ($isLast) { - $part->value = preg_replace('~(\r\n|\n|\r)\z~', '', $part->value); - } - if ('' === $part->value) { - continue; - } - } - $newContents[] = $part; - } - return new Encapsed($newContents, $attributes); - } - } - - /** - * Create attributes for a zero-length common-capturing nop. - * - * @param Comment[] $comments - * @return array - */ - protected function createCommentNopAttributes(array $comments) { - $comment = $comments[count($comments) - 1]; - $commentEndLine = $comment->getEndLine(); - $commentEndFilePos = $comment->getEndFilePos(); - $commentEndTokenPos = $comment->getEndTokenPos(); - - $attributes = ['comments' => $comments]; - if (-1 !== $commentEndLine) { - $attributes['startLine'] = $commentEndLine; - $attributes['endLine'] = $commentEndLine; - } - if (-1 !== $commentEndFilePos) { - $attributes['startFilePos'] = $commentEndFilePos + 1; - $attributes['endFilePos'] = $commentEndFilePos; - } - if (-1 !== $commentEndTokenPos) { - $attributes['startTokenPos'] = $commentEndTokenPos + 1; - $attributes['endTokenPos'] = $commentEndTokenPos; - } - return $attributes; - } - - protected function checkClassModifier($a, $b, $modifierPos) { - try { - Class_::verifyClassModifier($a, $b); - } catch (Error $error) { - $error->setAttributes($this->getAttributesAt($modifierPos)); - $this->emitError($error); - } - } - - protected function checkModifier($a, $b, $modifierPos) { - // Jumping through some hoops here because verifyModifier() is also used elsewhere - try { - Class_::verifyModifier($a, $b); - } catch (Error $error) { - $error->setAttributes($this->getAttributesAt($modifierPos)); - $this->emitError($error); - } - } - - protected function checkParam(Param $node) { - if ($node->variadic && null !== $node->default) { - $this->emitError(new Error( - 'Variadic parameter cannot have a default value', - $node->default->getAttributes() - )); - } - } - - protected function checkTryCatch(TryCatch $node) { - if (empty($node->catches) && null === $node->finally) { - $this->emitError(new Error( - 'Cannot use try without catch or finally', $node->getAttributes() - )); - } - } - - protected function checkNamespace(Namespace_ $node) { - if (null !== $node->stmts) { - foreach ($node->stmts as $stmt) { - if ($stmt instanceof Namespace_) { - $this->emitError(new Error( - 'Namespace declarations cannot be nested', $stmt->getAttributes() - )); - } - } - } - } - - private function checkClassName($name, $namePos) { - if (null !== $name && $name->isSpecialClassName()) { - $this->emitError(new Error( - sprintf('Cannot use \'%s\' as class name as it is reserved', $name), - $this->getAttributesAt($namePos) - )); - } - } - - private function checkImplementedInterfaces(array $interfaces) { - foreach ($interfaces as $interface) { - if ($interface->isSpecialClassName()) { - $this->emitError(new Error( - sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface), - $interface->getAttributes() - )); - } - } - } - - protected function checkClass(Class_ $node, $namePos) { - $this->checkClassName($node->name, $namePos); - - if ($node->extends && $node->extends->isSpecialClassName()) { - $this->emitError(new Error( - sprintf('Cannot use \'%s\' as class name as it is reserved', $node->extends), - $node->extends->getAttributes() - )); - } - - $this->checkImplementedInterfaces($node->implements); - } - - protected function checkInterface(Interface_ $node, $namePos) { - $this->checkClassName($node->name, $namePos); - $this->checkImplementedInterfaces($node->extends); - } - - protected function checkEnum(Enum_ $node, $namePos) { - $this->checkClassName($node->name, $namePos); - $this->checkImplementedInterfaces($node->implements); - } - - protected function checkClassMethod(ClassMethod $node, $modifierPos) { - if ($node->flags & Class_::MODIFIER_STATIC) { - switch ($node->name->toLowerString()) { - case '__construct': - $this->emitError(new Error( - sprintf('Constructor %s() cannot be static', $node->name), - $this->getAttributesAt($modifierPos))); - break; - case '__destruct': - $this->emitError(new Error( - sprintf('Destructor %s() cannot be static', $node->name), - $this->getAttributesAt($modifierPos))); - break; - case '__clone': - $this->emitError(new Error( - sprintf('Clone method %s() cannot be static', $node->name), - $this->getAttributesAt($modifierPos))); - break; - } - } - - if ($node->flags & Class_::MODIFIER_READONLY) { - $this->emitError(new Error( - sprintf('Method %s() cannot be readonly', $node->name), - $this->getAttributesAt($modifierPos))); - } - } - - protected function checkClassConst(ClassConst $node, $modifierPos) { - if ($node->flags & Class_::MODIFIER_STATIC) { - $this->emitError(new Error( - "Cannot use 'static' as constant modifier", - $this->getAttributesAt($modifierPos))); - } - if ($node->flags & Class_::MODIFIER_ABSTRACT) { - $this->emitError(new Error( - "Cannot use 'abstract' as constant modifier", - $this->getAttributesAt($modifierPos))); - } - if ($node->flags & Class_::MODIFIER_READONLY) { - $this->emitError(new Error( - "Cannot use 'readonly' as constant modifier", - $this->getAttributesAt($modifierPos))); - } - } - - protected function checkProperty(Property $node, $modifierPos) { - if ($node->flags & Class_::MODIFIER_ABSTRACT) { - $this->emitError(new Error('Properties cannot be declared abstract', - $this->getAttributesAt($modifierPos))); - } - - if ($node->flags & Class_::MODIFIER_FINAL) { - $this->emitError(new Error('Properties cannot be declared final', - $this->getAttributesAt($modifierPos))); - } - } - - protected function checkUseUse(UseUse $node, $namePos) { - if ($node->alias && $node->alias->isSpecialClassName()) { - $this->emitError(new Error( - sprintf( - 'Cannot use %s as %s because \'%2$s\' is a special class name', - $node->name, $node->alias - ), - $this->getAttributesAt($namePos) - )); - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php b/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php deleted file mode 100644 index f041e7ff..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php +++ /dev/null @@ -1,44 +0,0 @@ -pAttrGroups($node->attrGroups, true) - . $this->pModifiers($node->flags) - . ($node->type ? $this->p($node->type) . ' ' : '') - . ($node->byRef ? '&' : '') - . ($node->variadic ? '...' : '') - . $this->p($node->var) - . ($node->default ? ' = ' . $this->p($node->default) : ''); - } - - protected function pArg(Node\Arg $node) { - return ($node->name ? $node->name->toString() . ': ' : '') - . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') - . $this->p($node->value); - } - - protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) { - return '...'; - } - - protected function pConst(Node\Const_ $node) { - return $node->name . ' = ' . $this->p($node->value); - } - - protected function pNullableType(Node\NullableType $node) { - return '?' . $this->p($node->type); - } - - protected function pUnionType(Node\UnionType $node) { - return $this->pImplode($node->types, '|'); - } - - protected function pIntersectionType(Node\IntersectionType $node) { - return $this->pImplode($node->types, '&'); - } - - protected function pIdentifier(Node\Identifier $node) { - return $node->name; - } - - protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) { - return '$' . $node->name; - } - - protected function pAttribute(Node\Attribute $node) { - return $this->p($node->name) - . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : ''); - } - - protected function pAttributeGroup(Node\AttributeGroup $node) { - return '#[' . $this->pCommaSeparated($node->attrs) . ']'; - } - - // Names - - protected function pName(Name $node) { - return implode('\\', $node->parts); - } - - protected function pName_FullyQualified(Name\FullyQualified $node) { - return '\\' . implode('\\', $node->parts); - } - - protected function pName_Relative(Name\Relative $node) { - return 'namespace\\' . implode('\\', $node->parts); - } - - // Magic Constants - - protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) { - return '__CLASS__'; - } - - protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) { - return '__DIR__'; - } - - protected function pScalar_MagicConst_File(MagicConst\File $node) { - return '__FILE__'; - } - - protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) { - return '__FUNCTION__'; - } - - protected function pScalar_MagicConst_Line(MagicConst\Line $node) { - return '__LINE__'; - } - - protected function pScalar_MagicConst_Method(MagicConst\Method $node) { - return '__METHOD__'; - } - - protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) { - return '__NAMESPACE__'; - } - - protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) { - return '__TRAIT__'; - } - - // Scalars - - protected function pScalar_String(Scalar\String_ $node) { - $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED); - switch ($kind) { - case Scalar\String_::KIND_NOWDOC: - $label = $node->getAttribute('docLabel'); - if ($label && !$this->containsEndLabel($node->value, $label)) { - if ($node->value === '') { - return "<<<'$label'\n$label" . $this->docStringEndToken; - } - - return "<<<'$label'\n$node->value\n$label" - . $this->docStringEndToken; - } - /* break missing intentionally */ - case Scalar\String_::KIND_SINGLE_QUOTED: - return $this->pSingleQuotedString($node->value); - case Scalar\String_::KIND_HEREDOC: - $label = $node->getAttribute('docLabel'); - if ($label && !$this->containsEndLabel($node->value, $label)) { - if ($node->value === '') { - return "<<<$label\n$label" . $this->docStringEndToken; - } - - $escaped = $this->escapeString($node->value, null); - return "<<<$label\n" . $escaped . "\n$label" - . $this->docStringEndToken; - } - /* break missing intentionally */ - case Scalar\String_::KIND_DOUBLE_QUOTED: - return '"' . $this->escapeString($node->value, '"') . '"'; - } - throw new \Exception('Invalid string kind'); - } - - protected function pScalar_Encapsed(Scalar\Encapsed $node) { - if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) { - $label = $node->getAttribute('docLabel'); - if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) { - if (count($node->parts) === 1 - && $node->parts[0] instanceof Scalar\EncapsedStringPart - && $node->parts[0]->value === '' - ) { - return "<<<$label\n$label" . $this->docStringEndToken; - } - - return "<<<$label\n" . $this->pEncapsList($node->parts, null) . "\n$label" - . $this->docStringEndToken; - } - } - return '"' . $this->pEncapsList($node->parts, '"') . '"'; - } - - protected function pScalar_LNumber(Scalar\LNumber $node) { - if ($node->value === -\PHP_INT_MAX-1) { - // PHP_INT_MIN cannot be represented as a literal, - // because the sign is not part of the literal - return '(-' . \PHP_INT_MAX . '-1)'; - } - - $kind = $node->getAttribute('kind', Scalar\LNumber::KIND_DEC); - if (Scalar\LNumber::KIND_DEC === $kind) { - return (string) $node->value; - } - - if ($node->value < 0) { - $sign = '-'; - $str = (string) -$node->value; - } else { - $sign = ''; - $str = (string) $node->value; - } - switch ($kind) { - case Scalar\LNumber::KIND_BIN: - return $sign . '0b' . base_convert($str, 10, 2); - case Scalar\LNumber::KIND_OCT: - return $sign . '0' . base_convert($str, 10, 8); - case Scalar\LNumber::KIND_HEX: - return $sign . '0x' . base_convert($str, 10, 16); - } - throw new \Exception('Invalid number kind'); - } - - protected function pScalar_DNumber(Scalar\DNumber $node) { - if (!is_finite($node->value)) { - if ($node->value === \INF) { - return '\INF'; - } elseif ($node->value === -\INF) { - return '-\INF'; - } else { - return '\NAN'; - } - } - - // Try to find a short full-precision representation - $stringValue = sprintf('%.16G', $node->value); - if ($node->value !== (double) $stringValue) { - $stringValue = sprintf('%.17G', $node->value); - } - - // %G is locale dependent and there exists no locale-independent alternative. We don't want - // mess with switching locales here, so let's assume that a comma is the only non-standard - // decimal separator we may encounter... - $stringValue = str_replace(',', '.', $stringValue); - - // ensure that number is really printed as float - return preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue; - } - - protected function pScalar_EncapsedStringPart(Scalar\EncapsedStringPart $node) { - throw new \LogicException('Cannot directly print EncapsedStringPart'); - } - - // Assignments - - protected function pExpr_Assign(Expr\Assign $node) { - return $this->pInfixOp(Expr\Assign::class, $node->var, ' = ', $node->expr); - } - - protected function pExpr_AssignRef(Expr\AssignRef $node) { - return $this->pInfixOp(Expr\AssignRef::class, $node->var, ' =& ', $node->expr); - } - - protected function pExpr_AssignOp_Plus(AssignOp\Plus $node) { - return $this->pInfixOp(AssignOp\Plus::class, $node->var, ' += ', $node->expr); - } - - protected function pExpr_AssignOp_Minus(AssignOp\Minus $node) { - return $this->pInfixOp(AssignOp\Minus::class, $node->var, ' -= ', $node->expr); - } - - protected function pExpr_AssignOp_Mul(AssignOp\Mul $node) { - return $this->pInfixOp(AssignOp\Mul::class, $node->var, ' *= ', $node->expr); - } - - protected function pExpr_AssignOp_Div(AssignOp\Div $node) { - return $this->pInfixOp(AssignOp\Div::class, $node->var, ' /= ', $node->expr); - } - - protected function pExpr_AssignOp_Concat(AssignOp\Concat $node) { - return $this->pInfixOp(AssignOp\Concat::class, $node->var, ' .= ', $node->expr); - } - - protected function pExpr_AssignOp_Mod(AssignOp\Mod $node) { - return $this->pInfixOp(AssignOp\Mod::class, $node->var, ' %= ', $node->expr); - } - - protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) { - return $this->pInfixOp(AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr); - } - - protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) { - return $this->pInfixOp(AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr); - } - - protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) { - return $this->pInfixOp(AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr); - } - - protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) { - return $this->pInfixOp(AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr); - } - - protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) { - return $this->pInfixOp(AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr); - } - - protected function pExpr_AssignOp_Pow(AssignOp\Pow $node) { - return $this->pInfixOp(AssignOp\Pow::class, $node->var, ' **= ', $node->expr); - } - - protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node) { - return $this->pInfixOp(AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr); - } - - // Binary expressions - - protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) { - return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right); - } - - protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) { - return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right); - } - - protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) { - return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right); - } - - protected function pExpr_BinaryOp_Div(BinaryOp\Div $node) { - return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right); - } - - protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) { - return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right); - } - - protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) { - return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right); - } - - protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) { - return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right); - } - - protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) { - return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right); - } - - protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) { - return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right); - } - - protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) { - return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right); - } - - protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) { - return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right); - } - - protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) { - return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right); - } - - protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) { - return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right); - } - - protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) { - return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right); - } - - protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) { - return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right); - } - - protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) { - return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right); - } - - protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) { - return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right); - } - - protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) { - return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right); - } - - protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) { - return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right); - } - - protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) { - return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right); - } - - protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) { - return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right); - } - - protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) { - return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right); - } - - protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) { - return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right); - } - - protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) { - return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right); - } - - protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) { - return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right); - } - - protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) { - return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right); - } - - protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) { - return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right); - } - - protected function pExpr_Instanceof(Expr\Instanceof_ $node) { - list($precedence, $associativity) = $this->precedenceMap[Expr\Instanceof_::class]; - return $this->pPrec($node->expr, $precedence, $associativity, -1) - . ' instanceof ' - . $this->pNewVariable($node->class); - } - - // Unary expressions - - protected function pExpr_BooleanNot(Expr\BooleanNot $node) { - return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr); - } - - protected function pExpr_BitwiseNot(Expr\BitwiseNot $node) { - return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr); - } - - protected function pExpr_UnaryMinus(Expr\UnaryMinus $node) { - if ($node->expr instanceof Expr\UnaryMinus || $node->expr instanceof Expr\PreDec) { - // Enforce -(-$expr) instead of --$expr - return '-(' . $this->p($node->expr) . ')'; - } - return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr); - } - - protected function pExpr_UnaryPlus(Expr\UnaryPlus $node) { - if ($node->expr instanceof Expr\UnaryPlus || $node->expr instanceof Expr\PreInc) { - // Enforce +(+$expr) instead of ++$expr - return '+(' . $this->p($node->expr) . ')'; - } - return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr); - } - - protected function pExpr_PreInc(Expr\PreInc $node) { - return $this->pPrefixOp(Expr\PreInc::class, '++', $node->var); - } - - protected function pExpr_PreDec(Expr\PreDec $node) { - return $this->pPrefixOp(Expr\PreDec::class, '--', $node->var); - } - - protected function pExpr_PostInc(Expr\PostInc $node) { - return $this->pPostfixOp(Expr\PostInc::class, $node->var, '++'); - } - - protected function pExpr_PostDec(Expr\PostDec $node) { - return $this->pPostfixOp(Expr\PostDec::class, $node->var, '--'); - } - - protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) { - return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr); - } - - protected function pExpr_YieldFrom(Expr\YieldFrom $node) { - return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr); - } - - protected function pExpr_Print(Expr\Print_ $node) { - return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr); - } - - // Casts - - protected function pExpr_Cast_Int(Cast\Int_ $node) { - return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr); - } - - protected function pExpr_Cast_Double(Cast\Double $node) { - $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE); - if ($kind === Cast\Double::KIND_DOUBLE) { - $cast = '(double)'; - } elseif ($kind === Cast\Double::KIND_FLOAT) { - $cast = '(float)'; - } elseif ($kind === Cast\Double::KIND_REAL) { - $cast = '(real)'; - } - return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr); - } - - protected function pExpr_Cast_String(Cast\String_ $node) { - return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr); - } - - protected function pExpr_Cast_Array(Cast\Array_ $node) { - return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr); - } - - protected function pExpr_Cast_Object(Cast\Object_ $node) { - return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr); - } - - protected function pExpr_Cast_Bool(Cast\Bool_ $node) { - return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr); - } - - protected function pExpr_Cast_Unset(Cast\Unset_ $node) { - return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr); - } - - // Function calls and similar constructs - - protected function pExpr_FuncCall(Expr\FuncCall $node) { - return $this->pCallLhs($node->name) - . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - - protected function pExpr_MethodCall(Expr\MethodCall $node) { - return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) - . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - - protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) { - return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name) - . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - - protected function pExpr_StaticCall(Expr\StaticCall $node) { - return $this->pDereferenceLhs($node->class) . '::' - . ($node->name instanceof Expr - ? ($node->name instanceof Expr\Variable - ? $this->p($node->name) - : '{' . $this->p($node->name) . '}') - : $node->name) - . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - - protected function pExpr_Empty(Expr\Empty_ $node) { - return 'empty(' . $this->p($node->expr) . ')'; - } - - protected function pExpr_Isset(Expr\Isset_ $node) { - return 'isset(' . $this->pCommaSeparated($node->vars) . ')'; - } - - protected function pExpr_Eval(Expr\Eval_ $node) { - return 'eval(' . $this->p($node->expr) . ')'; - } - - protected function pExpr_Include(Expr\Include_ $node) { - static $map = [ - Expr\Include_::TYPE_INCLUDE => 'include', - Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', - Expr\Include_::TYPE_REQUIRE => 'require', - Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once', - ]; - - return $map[$node->type] . ' ' . $this->p($node->expr); - } - - protected function pExpr_List(Expr\List_ $node) { - return 'list(' . $this->pCommaSeparated($node->items) . ')'; - } - - // Other - - protected function pExpr_Error(Expr\Error $node) { - throw new \LogicException('Cannot pretty-print AST with Error nodes'); - } - - protected function pExpr_Variable(Expr\Variable $node) { - if ($node->name instanceof Expr) { - return '${' . $this->p($node->name) . '}'; - } else { - return '$' . $node->name; - } - } - - protected function pExpr_Array(Expr\Array_ $node) { - $syntax = $node->getAttribute('kind', - $this->options['shortArraySyntax'] ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); - if ($syntax === Expr\Array_::KIND_SHORT) { - return '[' . $this->pMaybeMultiline($node->items, true) . ']'; - } else { - return 'array(' . $this->pMaybeMultiline($node->items, true) . ')'; - } - } - - protected function pExpr_ArrayItem(Expr\ArrayItem $node) { - return (null !== $node->key ? $this->p($node->key) . ' => ' : '') - . ($node->byRef ? '&' : '') - . ($node->unpack ? '...' : '') - . $this->p($node->value); - } - - protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) { - return $this->pDereferenceLhs($node->var) - . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']'; - } - - protected function pExpr_ConstFetch(Expr\ConstFetch $node) { - return $this->p($node->name); - } - - protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) { - return $this->pDereferenceLhs($node->class) . '::' . $this->p($node->name); - } - - protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) { - return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name); - } - - protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) { - return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name); - } - - protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) { - return $this->pDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); - } - - protected function pExpr_ShellExec(Expr\ShellExec $node) { - return '`' . $this->pEncapsList($node->parts, '`') . '`'; - } - - protected function pExpr_Closure(Expr\Closure $node) { - return $this->pAttrGroups($node->attrGroups, true) - . ($node->static ? 'static ' : '') - . 'function ' . ($node->byRef ? '&' : '') - . '(' . $this->pCommaSeparated($node->params) . ')' - . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '') - . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') - . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pExpr_Match(Expr\Match_ $node) { - return 'match (' . $this->p($node->cond) . ') {' - . $this->pCommaSeparatedMultiline($node->arms, true) - . $this->nl - . '}'; - } - - protected function pMatchArm(Node\MatchArm $node) { - return ($node->conds ? $this->pCommaSeparated($node->conds) : 'default') - . ' => ' . $this->p($node->body); - } - - protected function pExpr_ArrowFunction(Expr\ArrowFunction $node) { - return $this->pAttrGroups($node->attrGroups, true) - . ($node->static ? 'static ' : '') - . 'fn' . ($node->byRef ? '&' : '') - . '(' . $this->pCommaSeparated($node->params) . ')' - . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') - . ' => ' - . $this->p($node->expr); - } - - protected function pExpr_ClosureUse(Expr\ClosureUse $node) { - return ($node->byRef ? '&' : '') . $this->p($node->var); - } - - protected function pExpr_New(Expr\New_ $node) { - if ($node->class instanceof Stmt\Class_) { - $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : ''; - return 'new ' . $this->pClassCommon($node->class, $args); - } - return 'new ' . $this->pNewVariable($node->class) - . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - - protected function pExpr_Clone(Expr\Clone_ $node) { - return 'clone ' . $this->p($node->expr); - } - - protected function pExpr_Ternary(Expr\Ternary $node) { - // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator. - // this is okay because the part between ? and : never needs parentheses. - return $this->pInfixOp(Expr\Ternary::class, - $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else - ); - } - - protected function pExpr_Exit(Expr\Exit_ $node) { - $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE); - return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die') - . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : ''); - } - - protected function pExpr_Throw(Expr\Throw_ $node) { - return 'throw ' . $this->p($node->expr); - } - - protected function pExpr_Yield(Expr\Yield_ $node) { - if ($node->value === null) { - return 'yield'; - } else { - // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary - return '(yield ' - . ($node->key !== null ? $this->p($node->key) . ' => ' : '') - . $this->p($node->value) - . ')'; - } - } - - // Declarations - - protected function pStmt_Namespace(Stmt\Namespace_ $node) { - if ($this->canUseSemicolonNamespaces) { - return 'namespace ' . $this->p($node->name) . ';' - . $this->nl . $this->pStmts($node->stmts, false); - } else { - return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '') - . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - } - - protected function pStmt_Use(Stmt\Use_ $node) { - return 'use ' . $this->pUseType($node->type) - . $this->pCommaSeparated($node->uses) . ';'; - } - - protected function pStmt_GroupUse(Stmt\GroupUse $node) { - return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) - . '\{' . $this->pCommaSeparated($node->uses) . '};'; - } - - protected function pStmt_UseUse(Stmt\UseUse $node) { - return $this->pUseType($node->type) . $this->p($node->name) - . (null !== $node->alias ? ' as ' . $node->alias : ''); - } - - protected function pUseType($type) { - return $type === Stmt\Use_::TYPE_FUNCTION ? 'function ' - : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : ''); - } - - protected function pStmt_Interface(Stmt\Interface_ $node) { - return $this->pAttrGroups($node->attrGroups) - . 'interface ' . $node->name - . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') - . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Enum(Stmt\Enum_ $node) { - return $this->pAttrGroups($node->attrGroups) - . 'enum ' . $node->name - . ($node->scalarType ? " : $node->scalarType" : '') - . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') - . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Class(Stmt\Class_ $node) { - return $this->pClassCommon($node, ' ' . $node->name); - } - - protected function pStmt_Trait(Stmt\Trait_ $node) { - return $this->pAttrGroups($node->attrGroups) - . 'trait ' . $node->name - . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_EnumCase(Stmt\EnumCase $node) { - return $this->pAttrGroups($node->attrGroups) - . 'case ' . $node->name - . ($node->expr ? ' = ' . $this->p($node->expr) : '') - . ';'; - } - - protected function pStmt_TraitUse(Stmt\TraitUse $node) { - return 'use ' . $this->pCommaSeparated($node->traits) - . (empty($node->adaptations) - ? ';' - : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}'); - } - - protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) { - return $this->p($node->trait) . '::' . $node->method - . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';'; - } - - protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) { - return (null !== $node->trait ? $this->p($node->trait) . '::' : '') - . $node->method . ' as' - . (null !== $node->newModifier ? ' ' . rtrim($this->pModifiers($node->newModifier), ' ') : '') - . (null !== $node->newName ? ' ' . $node->newName : '') - . ';'; - } - - protected function pStmt_Property(Stmt\Property $node) { - return $this->pAttrGroups($node->attrGroups) - . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) - . ($node->type ? $this->p($node->type) . ' ' : '') - . $this->pCommaSeparated($node->props) . ';'; - } - - protected function pStmt_PropertyProperty(Stmt\PropertyProperty $node) { - return '$' . $node->name - . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); - } - - protected function pStmt_ClassMethod(Stmt\ClassMethod $node) { - return $this->pAttrGroups($node->attrGroups) - . $this->pModifiers($node->flags) - . 'function ' . ($node->byRef ? '&' : '') . $node->name - . '(' . $this->pMaybeMultiline($node->params) . ')' - . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') - . (null !== $node->stmts - ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' - : ';'); - } - - protected function pStmt_ClassConst(Stmt\ClassConst $node) { - return $this->pAttrGroups($node->attrGroups) - . $this->pModifiers($node->flags) - . 'const ' . $this->pCommaSeparated($node->consts) . ';'; - } - - protected function pStmt_Function(Stmt\Function_ $node) { - return $this->pAttrGroups($node->attrGroups) - . 'function ' . ($node->byRef ? '&' : '') . $node->name - . '(' . $this->pCommaSeparated($node->params) . ')' - . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') - . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Const(Stmt\Const_ $node) { - return 'const ' . $this->pCommaSeparated($node->consts) . ';'; - } - - protected function pStmt_Declare(Stmt\Declare_ $node) { - return 'declare (' . $this->pCommaSeparated($node->declares) . ')' - . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); - } - - protected function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) { - return $node->key . '=' . $this->p($node->value); - } - - // Control flow - - protected function pStmt_If(Stmt\If_ $node) { - return 'if (' . $this->p($node->cond) . ') {' - . $this->pStmts($node->stmts) . $this->nl . '}' - . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') - . (null !== $node->else ? ' ' . $this->p($node->else) : ''); - } - - protected function pStmt_ElseIf(Stmt\ElseIf_ $node) { - return 'elseif (' . $this->p($node->cond) . ') {' - . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Else(Stmt\Else_ $node) { - return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_For(Stmt\For_ $node) { - return 'for (' - . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') - . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') - . $this->pCommaSeparated($node->loop) - . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Foreach(Stmt\Foreach_ $node) { - return 'foreach (' . $this->p($node->expr) . ' as ' - . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') - . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' - . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_While(Stmt\While_ $node) { - return 'while (' . $this->p($node->cond) . ') {' - . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Do(Stmt\Do_ $node) { - return 'do {' . $this->pStmts($node->stmts) . $this->nl - . '} while (' . $this->p($node->cond) . ');'; - } - - protected function pStmt_Switch(Stmt\Switch_ $node) { - return 'switch (' . $this->p($node->cond) . ') {' - . $this->pStmts($node->cases) . $this->nl . '}'; - } - - protected function pStmt_Case(Stmt\Case_ $node) { - return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' - . $this->pStmts($node->stmts); - } - - protected function pStmt_TryCatch(Stmt\TryCatch $node) { - return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' - . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') - . ($node->finally !== null ? ' ' . $this->p($node->finally) : ''); - } - - protected function pStmt_Catch(Stmt\Catch_ $node) { - return 'catch (' . $this->pImplode($node->types, '|') - . ($node->var !== null ? ' ' . $this->p($node->var) : '') - . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Finally(Stmt\Finally_ $node) { - return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Break(Stmt\Break_ $node) { - return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; - } - - protected function pStmt_Continue(Stmt\Continue_ $node) { - return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; - } - - protected function pStmt_Return(Stmt\Return_ $node) { - return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';'; - } - - protected function pStmt_Throw(Stmt\Throw_ $node) { - return 'throw ' . $this->p($node->expr) . ';'; - } - - protected function pStmt_Label(Stmt\Label $node) { - return $node->name . ':'; - } - - protected function pStmt_Goto(Stmt\Goto_ $node) { - return 'goto ' . $node->name . ';'; - } - - // Other - - protected function pStmt_Expression(Stmt\Expression $node) { - return $this->p($node->expr) . ';'; - } - - protected function pStmt_Echo(Stmt\Echo_ $node) { - return 'echo ' . $this->pCommaSeparated($node->exprs) . ';'; - } - - protected function pStmt_Static(Stmt\Static_ $node) { - return 'static ' . $this->pCommaSeparated($node->vars) . ';'; - } - - protected function pStmt_Global(Stmt\Global_ $node) { - return 'global ' . $this->pCommaSeparated($node->vars) . ';'; - } - - protected function pStmt_StaticVar(Stmt\StaticVar $node) { - return $this->p($node->var) - . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); - } - - protected function pStmt_Unset(Stmt\Unset_ $node) { - return 'unset(' . $this->pCommaSeparated($node->vars) . ');'; - } - - protected function pStmt_InlineHTML(Stmt\InlineHTML $node) { - $newline = $node->getAttribute('hasLeadingNewline', true) ? "\n" : ''; - return '?>' . $newline . $node->value . 'remaining; - } - - protected function pStmt_Nop(Stmt\Nop $node) { - return ''; - } - - // Helpers - - protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) { - return $this->pAttrGroups($node->attrGroups, $node->name === null) - . $this->pModifiers($node->flags) - . 'class' . $afterClassToken - . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '') - . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') - . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pObjectProperty($node) { - if ($node instanceof Expr) { - return '{' . $this->p($node) . '}'; - } else { - return $node; - } - } - - protected function pEncapsList(array $encapsList, $quote) { - $return = ''; - foreach ($encapsList as $element) { - if ($element instanceof Scalar\EncapsedStringPart) { - $return .= $this->escapeString($element->value, $quote); - } else { - $return .= '{' . $this->p($element) . '}'; - } - } - - return $return; - } - - protected function pSingleQuotedString(string $string) { - return '\'' . addcslashes($string, '\'\\') . '\''; - } - - protected function escapeString($string, $quote) { - if (null === $quote) { - // For doc strings, don't escape newlines - $escaped = addcslashes($string, "\t\f\v$\\"); - } else { - $escaped = addcslashes($string, "\n\r\t\f\v$" . $quote . "\\"); - } - - // Escape control characters and non-UTF-8 characters. - // Regex based on https://stackoverflow.com/a/11709412/385378. - $regex = '/( - [\x00-\x08\x0E-\x1F] # Control characters - | [\xC0-\xC1] # Invalid UTF-8 Bytes - | [\xF5-\xFF] # Invalid UTF-8 Bytes - | \xE0(?=[\x80-\x9F]) # Overlong encoding of prior code point - | \xF0(?=[\x80-\x8F]) # Overlong encoding of prior code point - | [\xC2-\xDF](?![\x80-\xBF]) # Invalid UTF-8 Sequence Start - | [\xE0-\xEF](?![\x80-\xBF]{2}) # Invalid UTF-8 Sequence Start - | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start - | (?<=[\x00-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle - | (? $part) { - $atStart = $i === 0; - $atEnd = $i === count($parts) - 1; - if ($part instanceof Scalar\EncapsedStringPart - && $this->containsEndLabel($part->value, $label, $atStart, $atEnd) - ) { - return true; - } - } - return false; - } - - protected function pDereferenceLhs(Node $node) { - if (!$this->dereferenceLhsRequiresParens($node)) { - return $this->p($node); - } else { - return '(' . $this->p($node) . ')'; - } - } - - protected function pCallLhs(Node $node) { - if (!$this->callLhsRequiresParens($node)) { - return $this->p($node); - } else { - return '(' . $this->p($node) . ')'; - } - } - - protected function pNewVariable(Node $node) { - // TODO: This is not fully accurate. - return $this->pDereferenceLhs($node); - } - - /** - * @param Node[] $nodes - * @return bool - */ - protected function hasNodeWithComments(array $nodes) { - foreach ($nodes as $node) { - if ($node && $node->getComments()) { - return true; - } - } - return false; - } - - protected function pMaybeMultiline(array $nodes, bool $trailingComma = false) { - if (!$this->hasNodeWithComments($nodes)) { - return $this->pCommaSeparated($nodes); - } else { - return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl; - } - } - - protected function pAttrGroups(array $nodes, bool $inline = false): string { - $result = ''; - $sep = $inline ? ' ' : $this->nl; - foreach ($nodes as $node) { - $result .= $this->p($node) . $sep; - } - - return $result; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php deleted file mode 100644 index 2c7fc307..00000000 --- a/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php +++ /dev/null @@ -1,1506 +0,0 @@ - [ 0, 1], - Expr\BitwiseNot::class => [ 10, 1], - Expr\PreInc::class => [ 10, 1], - Expr\PreDec::class => [ 10, 1], - Expr\PostInc::class => [ 10, -1], - Expr\PostDec::class => [ 10, -1], - Expr\UnaryPlus::class => [ 10, 1], - Expr\UnaryMinus::class => [ 10, 1], - Cast\Int_::class => [ 10, 1], - Cast\Double::class => [ 10, 1], - Cast\String_::class => [ 10, 1], - Cast\Array_::class => [ 10, 1], - Cast\Object_::class => [ 10, 1], - Cast\Bool_::class => [ 10, 1], - Cast\Unset_::class => [ 10, 1], - Expr\ErrorSuppress::class => [ 10, 1], - Expr\Instanceof_::class => [ 20, 0], - Expr\BooleanNot::class => [ 30, 1], - BinaryOp\Mul::class => [ 40, -1], - BinaryOp\Div::class => [ 40, -1], - BinaryOp\Mod::class => [ 40, -1], - BinaryOp\Plus::class => [ 50, -1], - BinaryOp\Minus::class => [ 50, -1], - BinaryOp\Concat::class => [ 50, -1], - BinaryOp\ShiftLeft::class => [ 60, -1], - BinaryOp\ShiftRight::class => [ 60, -1], - BinaryOp\Smaller::class => [ 70, 0], - BinaryOp\SmallerOrEqual::class => [ 70, 0], - BinaryOp\Greater::class => [ 70, 0], - BinaryOp\GreaterOrEqual::class => [ 70, 0], - BinaryOp\Equal::class => [ 80, 0], - BinaryOp\NotEqual::class => [ 80, 0], - BinaryOp\Identical::class => [ 80, 0], - BinaryOp\NotIdentical::class => [ 80, 0], - BinaryOp\Spaceship::class => [ 80, 0], - BinaryOp\BitwiseAnd::class => [ 90, -1], - BinaryOp\BitwiseXor::class => [100, -1], - BinaryOp\BitwiseOr::class => [110, -1], - BinaryOp\BooleanAnd::class => [120, -1], - BinaryOp\BooleanOr::class => [130, -1], - BinaryOp\Coalesce::class => [140, 1], - Expr\Ternary::class => [150, 0], - // parser uses %left for assignments, but they really behave as %right - Expr\Assign::class => [160, 1], - Expr\AssignRef::class => [160, 1], - AssignOp\Plus::class => [160, 1], - AssignOp\Minus::class => [160, 1], - AssignOp\Mul::class => [160, 1], - AssignOp\Div::class => [160, 1], - AssignOp\Concat::class => [160, 1], - AssignOp\Mod::class => [160, 1], - AssignOp\BitwiseAnd::class => [160, 1], - AssignOp\BitwiseOr::class => [160, 1], - AssignOp\BitwiseXor::class => [160, 1], - AssignOp\ShiftLeft::class => [160, 1], - AssignOp\ShiftRight::class => [160, 1], - AssignOp\Pow::class => [160, 1], - AssignOp\Coalesce::class => [160, 1], - Expr\YieldFrom::class => [165, 1], - Expr\Print_::class => [168, 1], - BinaryOp\LogicalAnd::class => [170, -1], - BinaryOp\LogicalXor::class => [180, -1], - BinaryOp\LogicalOr::class => [190, -1], - Expr\Include_::class => [200, -1], - ]; - - /** @var int Current indentation level. */ - protected $indentLevel; - /** @var string Newline including current indentation. */ - protected $nl; - /** @var string Token placed at end of doc string to ensure it is followed by a newline. */ - protected $docStringEndToken; - /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */ - protected $canUseSemicolonNamespaces; - /** @var array Pretty printer options */ - protected $options; - - /** @var TokenStream Original tokens for use in format-preserving pretty print */ - protected $origTokens; - /** @var Internal\Differ Differ for node lists */ - protected $nodeListDiffer; - /** @var bool[] Map determining whether a certain character is a label character */ - protected $labelCharMap; - /** - * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used - * during format-preserving prints to place additional parens/braces if necessary. - */ - protected $fixupMap; - /** - * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r], - * where $l and $r specify the token type that needs to be stripped when removing - * this node. - */ - protected $removalMap; - /** - * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. - * $find is an optional token after which the insertion occurs. $extraLeft/Right - * are optionally added before/after the main insertions. - */ - protected $insertionMap; - /** - * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted - * between elements of this list subnode. - */ - protected $listInsertionMap; - protected $emptyListInsertionMap; - /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers - * should be reprinted. */ - protected $modifierChangeMap; - - /** - * Creates a pretty printer instance using the given options. - * - * Supported options: - * * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array - * syntax, if the node does not specify a format. - * - * @param array $options Dictionary of formatting options - */ - public function __construct(array $options = []) { - $this->docStringEndToken = '_DOC_STRING_END_' . mt_rand(); - - $defaultOptions = ['shortArraySyntax' => false]; - $this->options = $options + $defaultOptions; - } - - /** - * Reset pretty printing state. - */ - protected function resetState() { - $this->indentLevel = 0; - $this->nl = "\n"; - $this->origTokens = null; - } - - /** - * Set indentation level - * - * @param int $level Level in number of spaces - */ - protected function setIndentLevel(int $level) { - $this->indentLevel = $level; - $this->nl = "\n" . \str_repeat(' ', $level); - } - - /** - * Increase indentation level. - */ - protected function indent() { - $this->indentLevel += 4; - $this->nl .= ' '; - } - - /** - * Decrease indentation level. - */ - protected function outdent() { - assert($this->indentLevel >= 4); - $this->indentLevel -= 4; - $this->nl = "\n" . str_repeat(' ', $this->indentLevel); - } - - /** - * Pretty prints an array of statements. - * - * @param Node[] $stmts Array of statements - * - * @return string Pretty printed statements - */ - public function prettyPrint(array $stmts) : string { - $this->resetState(); - $this->preprocessNodes($stmts); - - return ltrim($this->handleMagicTokens($this->pStmts($stmts, false))); - } - - /** - * Pretty prints an expression. - * - * @param Expr $node Expression node - * - * @return string Pretty printed node - */ - public function prettyPrintExpr(Expr $node) : string { - $this->resetState(); - return $this->handleMagicTokens($this->p($node)); - } - - /** - * Pretty prints a file of statements (includes the opening prettyPrint($stmts); - - if ($stmts[0] instanceof Stmt\InlineHTML) { - $p = preg_replace('/^<\?php\s+\?>\n?/', '', $p); - } - if ($stmts[count($stmts) - 1] instanceof Stmt\InlineHTML) { - $p = preg_replace('/<\?php$/', '', rtrim($p)); - } - - return $p; - } - - /** - * Preprocesses the top-level nodes to initialize pretty printer state. - * - * @param Node[] $nodes Array of nodes - */ - protected function preprocessNodes(array $nodes) { - /* We can use semicolon-namespaces unless there is a global namespace declaration */ - $this->canUseSemicolonNamespaces = true; - foreach ($nodes as $node) { - if ($node instanceof Stmt\Namespace_ && null === $node->name) { - $this->canUseSemicolonNamespaces = false; - break; - } - } - } - - /** - * Handles (and removes) no-indent and doc-string-end tokens. - * - * @param string $str - * @return string - */ - protected function handleMagicTokens(string $str) : string { - // Replace doc-string-end tokens with nothing or a newline - $str = str_replace($this->docStringEndToken . ";\n", ";\n", $str); - $str = str_replace($this->docStringEndToken, "\n", $str); - - return $str; - } - - /** - * Pretty prints an array of nodes (statements) and indents them optionally. - * - * @param Node[] $nodes Array of nodes - * @param bool $indent Whether to indent the printed nodes - * - * @return string Pretty printed statements - */ - protected function pStmts(array $nodes, bool $indent = true) : string { - if ($indent) { - $this->indent(); - } - - $result = ''; - foreach ($nodes as $node) { - $comments = $node->getComments(); - if ($comments) { - $result .= $this->nl . $this->pComments($comments); - if ($node instanceof Stmt\Nop) { - continue; - } - } - - $result .= $this->nl . $this->p($node); - } - - if ($indent) { - $this->outdent(); - } - - return $result; - } - - /** - * Pretty-print an infix operation while taking precedence into account. - * - * @param string $class Node class of operator - * @param Node $leftNode Left-hand side node - * @param string $operatorString String representation of the operator - * @param Node $rightNode Right-hand side node - * - * @return string Pretty printed infix operation - */ - protected function pInfixOp(string $class, Node $leftNode, string $operatorString, Node $rightNode) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - - return $this->pPrec($leftNode, $precedence, $associativity, -1) - . $operatorString - . $this->pPrec($rightNode, $precedence, $associativity, 1); - } - - /** - * Pretty-print a prefix operation while taking precedence into account. - * - * @param string $class Node class of operator - * @param string $operatorString String representation of the operator - * @param Node $node Node - * - * @return string Pretty printed prefix operation - */ - protected function pPrefixOp(string $class, string $operatorString, Node $node) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $operatorString . $this->pPrec($node, $precedence, $associativity, 1); - } - - /** - * Pretty-print a postfix operation while taking precedence into account. - * - * @param string $class Node class of operator - * @param string $operatorString String representation of the operator - * @param Node $node Node - * - * @return string Pretty printed postfix operation - */ - protected function pPostfixOp(string $class, Node $node, string $operatorString) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString; - } - - /** - * Prints an expression node with the least amount of parentheses necessary to preserve the meaning. - * - * @param Node $node Node to pretty print - * @param int $parentPrecedence Precedence of the parent operator - * @param int $parentAssociativity Associativity of parent operator - * (-1 is left, 0 is nonassoc, 1 is right) - * @param int $childPosition Position of the node relative to the operator - * (-1 is left, 1 is right) - * - * @return string The pretty printed node - */ - protected function pPrec(Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string { - $class = \get_class($node); - if (isset($this->precedenceMap[$class])) { - $childPrecedence = $this->precedenceMap[$class][0]; - if ($childPrecedence > $parentPrecedence - || ($parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition) - ) { - return '(' . $this->p($node) . ')'; - } - } - - return $this->p($node); - } - - /** - * Pretty prints an array of nodes and implodes the printed values. - * - * @param Node[] $nodes Array of Nodes to be printed - * @param string $glue Character to implode with - * - * @return string Imploded pretty printed nodes - */ - protected function pImplode(array $nodes, string $glue = '') : string { - $pNodes = []; - foreach ($nodes as $node) { - if (null === $node) { - $pNodes[] = ''; - } else { - $pNodes[] = $this->p($node); - } - } - - return implode($glue, $pNodes); - } - - /** - * Pretty prints an array of nodes and implodes the printed values with commas. - * - * @param Node[] $nodes Array of Nodes to be printed - * - * @return string Comma separated pretty printed nodes - */ - protected function pCommaSeparated(array $nodes) : string { - return $this->pImplode($nodes, ', '); - } - - /** - * Pretty prints a comma-separated list of nodes in multiline style, including comments. - * - * The result includes a leading newline and one level of indentation (same as pStmts). - * - * @param Node[] $nodes Array of Nodes to be printed - * @param bool $trailingComma Whether to use a trailing comma - * - * @return string Comma separated pretty printed nodes in multiline style - */ - protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma) : string { - $this->indent(); - - $result = ''; - $lastIdx = count($nodes) - 1; - foreach ($nodes as $idx => $node) { - if ($node !== null) { - $comments = $node->getComments(); - if ($comments) { - $result .= $this->nl . $this->pComments($comments); - } - - $result .= $this->nl . $this->p($node); - } else { - $result .= $this->nl; - } - if ($trailingComma || $idx !== $lastIdx) { - $result .= ','; - } - } - - $this->outdent(); - return $result; - } - - /** - * Prints reformatted text of the passed comments. - * - * @param Comment[] $comments List of comments - * - * @return string Reformatted text of comments - */ - protected function pComments(array $comments) : string { - $formattedComments = []; - - foreach ($comments as $comment) { - $formattedComments[] = str_replace("\n", $this->nl, $comment->getReformattedText()); - } - - return implode($this->nl, $formattedComments); - } - - /** - * Perform a format-preserving pretty print of an AST. - * - * The format preservation is best effort. For some changes to the AST the formatting will not - * be preserved (at least not locally). - * - * In order to use this method a number of prerequisites must be satisfied: - * * The startTokenPos and endTokenPos attributes in the lexer must be enabled. - * * The CloningVisitor must be run on the AST prior to modification. - * * The original tokens must be provided, using the getTokens() method on the lexer. - * - * @param Node[] $stmts Modified AST with links to original AST - * @param Node[] $origStmts Original AST with token offset information - * @param array $origTokens Tokens of the original code - * - * @return string - */ - public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens) : string { - $this->initializeNodeListDiffer(); - $this->initializeLabelCharMap(); - $this->initializeFixupMap(); - $this->initializeRemovalMap(); - $this->initializeInsertionMap(); - $this->initializeListInsertionMap(); - $this->initializeEmptyListInsertionMap(); - $this->initializeModifierChangeMap(); - - $this->resetState(); - $this->origTokens = new TokenStream($origTokens); - - $this->preprocessNodes($stmts); - - $pos = 0; - $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null); - if (null !== $result) { - $result .= $this->origTokens->getTokenCode($pos, count($origTokens), 0); - } else { - // Fallback - // TODO Add pStmts($stmts, false); - } - - return ltrim($this->handleMagicTokens($result)); - } - - protected function pFallback(Node $node) { - return $this->{'p' . $node->getType()}($node); - } - - /** - * Pretty prints a node. - * - * This method also handles formatting preservation for nodes. - * - * @param Node $node Node to be pretty printed - * @param bool $parentFormatPreserved Whether parent node has preserved formatting - * - * @return string Pretty printed node - */ - protected function p(Node $node, $parentFormatPreserved = false) : string { - // No orig tokens means this is a normal pretty print without preservation of formatting - if (!$this->origTokens) { - return $this->{'p' . $node->getType()}($node); - } - - /** @var Node $origNode */ - $origNode = $node->getAttribute('origNode'); - if (null === $origNode) { - return $this->pFallback($node); - } - - $class = \get_class($node); - \assert($class === \get_class($origNode)); - - $startPos = $origNode->getStartTokenPos(); - $endPos = $origNode->getEndTokenPos(); - \assert($startPos >= 0 && $endPos >= 0); - - $fallbackNode = $node; - if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) { - // Normalize node structure of anonymous classes - $node = PrintableNewAnonClassNode::fromNewNode($node); - $origNode = PrintableNewAnonClassNode::fromNewNode($origNode); - } - - // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting - // is not preserved, then we need to use the fallback code to make sure the tags are - // printed. - if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) { - return $this->pFallback($fallbackNode); - } - - $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos); - - $type = $node->getType(); - $fixupInfo = $this->fixupMap[$class] ?? null; - - $result = ''; - $pos = $startPos; - foreach ($node->getSubNodeNames() as $subNodeName) { - $subNode = $node->$subNodeName; - $origSubNode = $origNode->$subNodeName; - - if ((!$subNode instanceof Node && $subNode !== null) - || (!$origSubNode instanceof Node && $origSubNode !== null) - ) { - if ($subNode === $origSubNode) { - // Unchanged, can reuse old code - continue; - } - - if (is_array($subNode) && is_array($origSubNode)) { - // Array subnode changed, we might be able to reconstruct it - $listResult = $this->pArray( - $subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName, - $fixupInfo[$subNodeName] ?? null - ); - if (null === $listResult) { - return $this->pFallback($fallbackNode); - } - - $result .= $listResult; - continue; - } - - if (is_int($subNode) && is_int($origSubNode)) { - // Check if this is a modifier change - $key = $type . '->' . $subNodeName; - if (!isset($this->modifierChangeMap[$key])) { - return $this->pFallback($fallbackNode); - } - - $findToken = $this->modifierChangeMap[$key]; - $result .= $this->pModifiers($subNode); - $pos = $this->origTokens->findRight($pos, $findToken); - continue; - } - - // If a non-node, non-array subnode changed, we don't be able to do a partial - // reconstructions, as we don't have enough offset information. Pretty print the - // whole node instead. - return $this->pFallback($fallbackNode); - } - - $extraLeft = ''; - $extraRight = ''; - if ($origSubNode !== null) { - $subStartPos = $origSubNode->getStartTokenPos(); - $subEndPos = $origSubNode->getEndTokenPos(); - \assert($subStartPos >= 0 && $subEndPos >= 0); - } else { - if ($subNode === null) { - // Both null, nothing to do - continue; - } - - // A node has been inserted, check if we have insertion information for it - $key = $type . '->' . $subNodeName; - if (!isset($this->insertionMap[$key])) { - return $this->pFallback($fallbackNode); - } - - list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key]; - if (null !== $findToken) { - $subStartPos = $this->origTokens->findRight($pos, $findToken) - + (int) !$beforeToken; - } else { - $subStartPos = $pos; - } - - if (null === $extraLeft && null !== $extraRight) { - // If inserting on the right only, skipping whitespace looks better - $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos); - } - $subEndPos = $subStartPos - 1; - } - - if (null === $subNode) { - // A node has been removed, check if we have removal information for it - $key = $type . '->' . $subNodeName; - if (!isset($this->removalMap[$key])) { - return $this->pFallback($fallbackNode); - } - - // Adjust positions to account for additional tokens that must be skipped - $removalInfo = $this->removalMap[$key]; - if (isset($removalInfo['left'])) { - $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1; - } - if (isset($removalInfo['right'])) { - $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1; - } - } - - $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment); - - if (null !== $subNode) { - $result .= $extraLeft; - - $origIndentLevel = $this->indentLevel; - $this->setIndentLevel($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment); - - // If it's the same node that was previously in this position, it certainly doesn't - // need fixup. It's important to check this here, because our fixup checks are more - // conservative than strictly necessary. - if (isset($fixupInfo[$subNodeName]) - && $subNode->getAttribute('origNode') !== $origSubNode - ) { - $fixup = $fixupInfo[$subNodeName]; - $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos); - } else { - $res = $this->p($subNode, true); - } - - $this->safeAppend($result, $res); - $this->setIndentLevel($origIndentLevel); - - $result .= $extraRight; - } - - $pos = $subEndPos + 1; - } - - $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment); - return $result; - } - - /** - * Perform a format-preserving pretty print of an array. - * - * @param array $nodes New nodes - * @param array $origNodes Original nodes - * @param int $pos Current token position (updated by reference) - * @param int $indentAdjustment Adjustment for indentation - * @param string $parentNodeType Type of the containing node. - * @param string $subNodeName Name of array subnode. - * @param null|int $fixup Fixup information for array item nodes - * - * @return null|string Result of pretty print or null if cannot preserve formatting - */ - protected function pArray( - array $nodes, array $origNodes, int &$pos, int $indentAdjustment, - string $parentNodeType, string $subNodeName, $fixup - ) { - $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes); - - $mapKey = $parentNodeType . '->' . $subNodeName; - $insertStr = $this->listInsertionMap[$mapKey] ?? null; - $isStmtList = $subNodeName === 'stmts'; - - $beforeFirstKeepOrReplace = true; - $skipRemovedNode = false; - $delayedAdd = []; - $lastElemIndentLevel = $this->indentLevel; - - $insertNewline = false; - if ($insertStr === "\n") { - $insertStr = ''; - $insertNewline = true; - } - - if ($isStmtList && \count($origNodes) === 1 && \count($nodes) !== 1) { - $startPos = $origNodes[0]->getStartTokenPos(); - $endPos = $origNodes[0]->getEndTokenPos(); - \assert($startPos >= 0 && $endPos >= 0); - if (!$this->origTokens->haveBraces($startPos, $endPos)) { - // This was a single statement without braces, but either additional statements - // have been added, or the single statement has been removed. This requires the - // addition of braces. For now fall back. - // TODO: Try to preserve formatting - return null; - } - } - - $result = ''; - foreach ($diff as $i => $diffElem) { - $diffType = $diffElem->type; - /** @var Node|null $arrItem */ - $arrItem = $diffElem->new; - /** @var Node|null $origArrItem */ - $origArrItem = $diffElem->old; - - if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { - $beforeFirstKeepOrReplace = false; - - if ($origArrItem === null || $arrItem === null) { - // We can only handle the case where both are null - if ($origArrItem === $arrItem) { - continue; - } - return null; - } - - if (!$arrItem instanceof Node || !$origArrItem instanceof Node) { - // We can only deal with nodes. This can occur for Names, which use string arrays. - return null; - } - - $itemStartPos = $origArrItem->getStartTokenPos(); - $itemEndPos = $origArrItem->getEndTokenPos(); - \assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos); - - $origIndentLevel = $this->indentLevel; - $lastElemIndentLevel = $this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment; - $this->setIndentLevel($lastElemIndentLevel); - - $comments = $arrItem->getComments(); - $origComments = $origArrItem->getComments(); - $commentStartPos = $origComments ? $origComments[0]->getStartTokenPos() : $itemStartPos; - \assert($commentStartPos >= 0); - - if ($commentStartPos < $pos) { - // Comments may be assigned to multiple nodes if they start at the same position. - // Make sure we don't try to print them multiple times. - $commentStartPos = $itemStartPos; - } - - if ($skipRemovedNode) { - if ($isStmtList && $this->origTokens->haveBracesInRange($pos, $itemStartPos)) { - // We'd remove the brace of a code block. - // TODO: Preserve formatting. - $this->setIndentLevel($origIndentLevel); - return null; - } - } else { - $result .= $this->origTokens->getTokenCode( - $pos, $commentStartPos, $indentAdjustment); - } - - if (!empty($delayedAdd)) { - /** @var Node $delayedAddNode */ - foreach ($delayedAdd as $delayedAddNode) { - if ($insertNewline) { - $delayedAddComments = $delayedAddNode->getComments(); - if ($delayedAddComments) { - $result .= $this->pComments($delayedAddComments) . $this->nl; - } - } - - $this->safeAppend($result, $this->p($delayedAddNode, true)); - - if ($insertNewline) { - $result .= $insertStr . $this->nl; - } else { - $result .= $insertStr; - } - } - - $delayedAdd = []; - } - - if ($comments !== $origComments) { - if ($comments) { - $result .= $this->pComments($comments) . $this->nl; - } - } else { - $result .= $this->origTokens->getTokenCode( - $commentStartPos, $itemStartPos, $indentAdjustment); - } - - // If we had to remove anything, we have done so now. - $skipRemovedNode = false; - } elseif ($diffType === DiffElem::TYPE_ADD) { - if (null === $insertStr) { - // We don't have insertion information for this list type - return null; - } - - // We go multiline if the original code was multiline, - // or if it's an array item with a comment above it. - if ($insertStr === ', ' && - ($this->isMultiline($origNodes) || $arrItem->getComments()) - ) { - $insertStr = ','; - $insertNewline = true; - } - - if ($beforeFirstKeepOrReplace) { - // Will be inserted at the next "replace" or "keep" element - $delayedAdd[] = $arrItem; - continue; - } - - $itemStartPos = $pos; - $itemEndPos = $pos - 1; - - $origIndentLevel = $this->indentLevel; - $this->setIndentLevel($lastElemIndentLevel); - - if ($insertNewline) { - $result .= $insertStr . $this->nl; - $comments = $arrItem->getComments(); - if ($comments) { - $result .= $this->pComments($comments) . $this->nl; - } - } else { - $result .= $insertStr; - } - } elseif ($diffType === DiffElem::TYPE_REMOVE) { - if (!$origArrItem instanceof Node) { - // We only support removal for nodes - return null; - } - - $itemStartPos = $origArrItem->getStartTokenPos(); - $itemEndPos = $origArrItem->getEndTokenPos(); - \assert($itemStartPos >= 0 && $itemEndPos >= 0); - - // Consider comments part of the node. - $origComments = $origArrItem->getComments(); - if ($origComments) { - $itemStartPos = $origComments[0]->getStartTokenPos(); - } - - if ($i === 0) { - // If we're removing from the start, keep the tokens before the node and drop those after it, - // instead of the other way around. - $result .= $this->origTokens->getTokenCode( - $pos, $itemStartPos, $indentAdjustment); - $skipRemovedNode = true; - } else { - if ($isStmtList && $this->origTokens->haveBracesInRange($pos, $itemStartPos)) { - // We'd remove the brace of a code block. - // TODO: Preserve formatting. - return null; - } - } - - $pos = $itemEndPos + 1; - continue; - } else { - throw new \Exception("Shouldn't happen"); - } - - if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) { - $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos); - } else { - $res = $this->p($arrItem, true); - } - $this->safeAppend($result, $res); - - $this->setIndentLevel($origIndentLevel); - $pos = $itemEndPos + 1; - } - - if ($skipRemovedNode) { - // TODO: Support removing single node. - return null; - } - - if (!empty($delayedAdd)) { - if (!isset($this->emptyListInsertionMap[$mapKey])) { - return null; - } - - list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey]; - if (null !== $findToken) { - $insertPos = $this->origTokens->findRight($pos, $findToken) + 1; - $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment); - $pos = $insertPos; - } - - $first = true; - $result .= $extraLeft; - foreach ($delayedAdd as $delayedAddNode) { - if (!$first) { - $result .= $insertStr; - } - $result .= $this->p($delayedAddNode, true); - $first = false; - } - $result .= $extraRight; - } - - return $result; - } - - /** - * Print node with fixups. - * - * Fixups here refer to the addition of extra parentheses, braces or other characters, that - * are required to preserve program semantics in a certain context (e.g. to maintain precedence - * or because only certain expressions are allowed in certain places). - * - * @param int $fixup Fixup type - * @param Node $subNode Subnode to print - * @param string|null $parentClass Class of parent node - * @param int $subStartPos Original start pos of subnode - * @param int $subEndPos Original end pos of subnode - * - * @return string Result of fixed-up print of subnode - */ - protected function pFixup(int $fixup, Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string { - switch ($fixup) { - case self::FIXUP_PREC_LEFT: - case self::FIXUP_PREC_RIGHT: - if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { - list($precedence, $associativity) = $this->precedenceMap[$parentClass]; - return $this->pPrec($subNode, $precedence, $associativity, - $fixup === self::FIXUP_PREC_LEFT ? -1 : 1); - } - break; - case self::FIXUP_CALL_LHS: - if ($this->callLhsRequiresParens($subNode) - && !$this->origTokens->haveParens($subStartPos, $subEndPos) - ) { - return '(' . $this->p($subNode) . ')'; - } - break; - case self::FIXUP_DEREF_LHS: - if ($this->dereferenceLhsRequiresParens($subNode) - && !$this->origTokens->haveParens($subStartPos, $subEndPos) - ) { - return '(' . $this->p($subNode) . ')'; - } - break; - case self::FIXUP_BRACED_NAME: - case self::FIXUP_VAR_BRACED_NAME: - if ($subNode instanceof Expr - && !$this->origTokens->haveBraces($subStartPos, $subEndPos) - ) { - return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '') - . '{' . $this->p($subNode) . '}'; - } - break; - case self::FIXUP_ENCAPSED: - if (!$subNode instanceof Scalar\EncapsedStringPart - && !$this->origTokens->haveBraces($subStartPos, $subEndPos) - ) { - return '{' . $this->p($subNode) . '}'; - } - break; - default: - throw new \Exception('Cannot happen'); - } - - // Nothing special to do - return $this->p($subNode); - } - - /** - * Appends to a string, ensuring whitespace between label characters. - * - * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x". - * Without safeAppend the result would be "echox", which does not preserve semantics. - * - * @param string $str - * @param string $append - */ - protected function safeAppend(string &$str, string $append) { - if ($str === "") { - $str = $append; - return; - } - - if ($append === "") { - return; - } - - if (!$this->labelCharMap[$append[0]] - || !$this->labelCharMap[$str[\strlen($str) - 1]]) { - $str .= $append; - } else { - $str .= " " . $append; - } - } - - /** - * Determines whether the LHS of a call must be wrapped in parenthesis. - * - * @param Node $node LHS of a call - * - * @return bool Whether parentheses are required - */ - protected function callLhsRequiresParens(Node $node) : bool { - return !($node instanceof Node\Name - || $node instanceof Expr\Variable - || $node instanceof Expr\ArrayDimFetch - || $node instanceof Expr\FuncCall - || $node instanceof Expr\MethodCall - || $node instanceof Expr\NullsafeMethodCall - || $node instanceof Expr\StaticCall - || $node instanceof Expr\Array_); - } - - /** - * Determines whether the LHS of a dereferencing operation must be wrapped in parenthesis. - * - * @param Node $node LHS of dereferencing operation - * - * @return bool Whether parentheses are required - */ - protected function dereferenceLhsRequiresParens(Node $node) : bool { - return !($node instanceof Expr\Variable - || $node instanceof Node\Name - || $node instanceof Expr\ArrayDimFetch - || $node instanceof Expr\PropertyFetch - || $node instanceof Expr\NullsafePropertyFetch - || $node instanceof Expr\StaticPropertyFetch - || $node instanceof Expr\FuncCall - || $node instanceof Expr\MethodCall - || $node instanceof Expr\NullsafeMethodCall - || $node instanceof Expr\StaticCall - || $node instanceof Expr\Array_ - || $node instanceof Scalar\String_ - || $node instanceof Expr\ConstFetch - || $node instanceof Expr\ClassConstFetch); - } - - /** - * Print modifiers, including trailing whitespace. - * - * @param int $modifiers Modifier mask to print - * - * @return string Printed modifiers - */ - protected function pModifiers(int $modifiers) { - return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC ? 'public ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE ? 'private ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_STATIC ? 'static ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT ? 'abstract ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_FINAL ? 'final ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_READONLY ? 'readonly ' : ''); - } - - /** - * Determine whether a list of nodes uses multiline formatting. - * - * @param (Node|null)[] $nodes Node list - * - * @return bool Whether multiline formatting is used - */ - protected function isMultiline(array $nodes) : bool { - if (\count($nodes) < 2) { - return false; - } - - $pos = -1; - foreach ($nodes as $node) { - if (null === $node) { - continue; - } - - $endPos = $node->getEndTokenPos() + 1; - if ($pos >= 0) { - $text = $this->origTokens->getTokenCode($pos, $endPos, 0); - if (false === strpos($text, "\n")) { - // We require that a newline is present between *every* item. If the formatting - // is inconsistent, with only some items having newlines, we don't consider it - // as multiline - return false; - } - } - $pos = $endPos; - } - - return true; - } - - /** - * Lazily initializes label char map. - * - * The label char map determines whether a certain character may occur in a label. - */ - protected function initializeLabelCharMap() { - if ($this->labelCharMap) return; - - $this->labelCharMap = []; - for ($i = 0; $i < 256; $i++) { - // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for - // older versions. - $chr = chr($i); - $this->labelCharMap[$chr] = $i >= 0x7f || ctype_alnum($chr); - } - } - - /** - * Lazily initializes node list differ. - * - * The node list differ is used to determine differences between two array subnodes. - */ - protected function initializeNodeListDiffer() { - if ($this->nodeListDiffer) return; - - $this->nodeListDiffer = new Internal\Differ(function ($a, $b) { - if ($a instanceof Node && $b instanceof Node) { - return $a === $b->getAttribute('origNode'); - } - // Can happen for array destructuring - return $a === null && $b === null; - }); - } - - /** - * Lazily initializes fixup map. - * - * The fixup map is used to determine whether a certain subnode of a certain node may require - * some kind of "fixup" operation, e.g. the addition of parenthesis or braces. - */ - protected function initializeFixupMap() { - if ($this->fixupMap) return; - - $this->fixupMap = [ - Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT], - Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT], - Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT], - Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], - Expr\Instanceof_::class => [ - 'expr' => self::FIXUP_PREC_LEFT, - 'class' => self::FIXUP_PREC_RIGHT, // TODO: FIXUP_NEW_VARIABLE - ], - Expr\Ternary::class => [ - 'cond' => self::FIXUP_PREC_LEFT, - 'else' => self::FIXUP_PREC_RIGHT, - ], - - Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], - Expr\StaticCall::class => ['class' => self::FIXUP_DEREF_LHS], - Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], - Expr\ClassConstFetch::class => ['var' => self::FIXUP_DEREF_LHS], - Expr\New_::class => ['class' => self::FIXUP_DEREF_LHS], // TODO: FIXUP_NEW_VARIABLE - Expr\MethodCall::class => [ - 'var' => self::FIXUP_DEREF_LHS, - 'name' => self::FIXUP_BRACED_NAME, - ], - Expr\NullsafeMethodCall::class => [ - 'var' => self::FIXUP_DEREF_LHS, - 'name' => self::FIXUP_BRACED_NAME, - ], - Expr\StaticPropertyFetch::class => [ - 'class' => self::FIXUP_DEREF_LHS, - 'name' => self::FIXUP_VAR_BRACED_NAME, - ], - Expr\PropertyFetch::class => [ - 'var' => self::FIXUP_DEREF_LHS, - 'name' => self::FIXUP_BRACED_NAME, - ], - Expr\NullsafePropertyFetch::class => [ - 'var' => self::FIXUP_DEREF_LHS, - 'name' => self::FIXUP_BRACED_NAME, - ], - Scalar\Encapsed::class => [ - 'parts' => self::FIXUP_ENCAPSED, - ], - ]; - - $binaryOps = [ - BinaryOp\Pow::class, BinaryOp\Mul::class, BinaryOp\Div::class, BinaryOp\Mod::class, - BinaryOp\Plus::class, BinaryOp\Minus::class, BinaryOp\Concat::class, - BinaryOp\ShiftLeft::class, BinaryOp\ShiftRight::class, BinaryOp\Smaller::class, - BinaryOp\SmallerOrEqual::class, BinaryOp\Greater::class, BinaryOp\GreaterOrEqual::class, - BinaryOp\Equal::class, BinaryOp\NotEqual::class, BinaryOp\Identical::class, - BinaryOp\NotIdentical::class, BinaryOp\Spaceship::class, BinaryOp\BitwiseAnd::class, - BinaryOp\BitwiseXor::class, BinaryOp\BitwiseOr::class, BinaryOp\BooleanAnd::class, - BinaryOp\BooleanOr::class, BinaryOp\Coalesce::class, BinaryOp\LogicalAnd::class, - BinaryOp\LogicalXor::class, BinaryOp\LogicalOr::class, - ]; - foreach ($binaryOps as $binaryOp) { - $this->fixupMap[$binaryOp] = [ - 'left' => self::FIXUP_PREC_LEFT, - 'right' => self::FIXUP_PREC_RIGHT - ]; - } - - $assignOps = [ - Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, - AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, - AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, - AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class - ]; - foreach ($assignOps as $assignOp) { - $this->fixupMap[$assignOp] = [ - 'var' => self::FIXUP_PREC_LEFT, - 'expr' => self::FIXUP_PREC_RIGHT, - ]; - } - - $prefixOps = [ - Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, - Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, - Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, - Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class, - ]; - foreach ($prefixOps as $prefixOp) { - $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT]; - } - } - - /** - * Lazily initializes the removal map. - * - * The removal map is used to determine which additional tokens should be removed when a - * certain node is replaced by null. - */ - protected function initializeRemovalMap() { - if ($this->removalMap) return; - - $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE]; - $stripLeft = ['left' => \T_WHITESPACE]; - $stripRight = ['right' => \T_WHITESPACE]; - $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW]; - $stripColon = ['left' => ':']; - $stripEquals = ['left' => '=']; - $this->removalMap = [ - 'Expr_ArrayDimFetch->dim' => $stripBoth, - 'Expr_ArrayItem->key' => $stripDoubleArrow, - 'Expr_ArrowFunction->returnType' => $stripColon, - 'Expr_Closure->returnType' => $stripColon, - 'Expr_Exit->expr' => $stripBoth, - 'Expr_Ternary->if' => $stripBoth, - 'Expr_Yield->key' => $stripDoubleArrow, - 'Expr_Yield->value' => $stripBoth, - 'Param->type' => $stripRight, - 'Param->default' => $stripEquals, - 'Stmt_Break->num' => $stripBoth, - 'Stmt_Catch->var' => $stripLeft, - 'Stmt_ClassMethod->returnType' => $stripColon, - 'Stmt_Class->extends' => ['left' => \T_EXTENDS], - 'Stmt_Enum->scalarType' => $stripColon, - 'Stmt_EnumCase->expr' => $stripEquals, - 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], - 'Stmt_Continue->num' => $stripBoth, - 'Stmt_Foreach->keyVar' => $stripDoubleArrow, - 'Stmt_Function->returnType' => $stripColon, - 'Stmt_If->else' => $stripLeft, - 'Stmt_Namespace->name' => $stripLeft, - 'Stmt_Property->type' => $stripRight, - 'Stmt_PropertyProperty->default' => $stripEquals, - 'Stmt_Return->expr' => $stripBoth, - 'Stmt_StaticVar->default' => $stripEquals, - 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, - 'Stmt_TryCatch->finally' => $stripLeft, - // 'Stmt_Case->cond': Replace with "default" - // 'Stmt_Class->name': Unclear what to do - // 'Stmt_Declare->stmts': Not a plain node - // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a plain node - ]; - } - - protected function initializeInsertionMap() { - if ($this->insertionMap) return; - - // TODO: "yield" where both key and value are inserted doesn't work - // [$find, $beforeToken, $extraLeft, $extraRight] - $this->insertionMap = [ - 'Expr_ArrayDimFetch->dim' => ['[', false, null, null], - 'Expr_ArrayItem->key' => [null, false, null, ' => '], - 'Expr_ArrowFunction->returnType' => [')', false, ' : ', null], - 'Expr_Closure->returnType' => [')', false, ' : ', null], - 'Expr_Ternary->if' => ['?', false, ' ', ' '], - 'Expr_Yield->key' => [\T_YIELD, false, null, ' => '], - 'Expr_Yield->value' => [\T_YIELD, false, ' ', null], - 'Param->type' => [null, false, null, ' '], - 'Param->default' => [null, false, ' = ', null], - 'Stmt_Break->num' => [\T_BREAK, false, ' ', null], - 'Stmt_Catch->var' => [null, false, ' ', null], - 'Stmt_ClassMethod->returnType' => [')', false, ' : ', null], - 'Stmt_Class->extends' => [null, false, ' extends ', null], - 'Stmt_Enum->scalarType' => [null, false, ' : ', null], - 'Stmt_EnumCase->expr' => [null, false, ' = ', null], - 'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null], - 'Stmt_Continue->num' => [\T_CONTINUE, false, ' ', null], - 'Stmt_Foreach->keyVar' => [\T_AS, false, null, ' => '], - 'Stmt_Function->returnType' => [')', false, ' : ', null], - 'Stmt_If->else' => [null, false, ' ', null], - 'Stmt_Namespace->name' => [\T_NAMESPACE, false, ' ', null], - 'Stmt_Property->type' => [\T_VARIABLE, true, null, ' '], - 'Stmt_PropertyProperty->default' => [null, false, ' = ', null], - 'Stmt_Return->expr' => [\T_RETURN, false, ' ', null], - 'Stmt_StaticVar->default' => [null, false, ' = ', null], - //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO - 'Stmt_TryCatch->finally' => [null, false, ' ', null], - - // 'Expr_Exit->expr': Complicated due to optional () - // 'Stmt_Case->cond': Conversion from default to case - // 'Stmt_Class->name': Unclear - // 'Stmt_Declare->stmts': Not a proper node - // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a proper node - ]; - } - - protected function initializeListInsertionMap() { - if ($this->listInsertionMap) return; - - $this->listInsertionMap = [ - // special - //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully - //'Scalar_Encapsed->parts' => '', - 'Stmt_Catch->types' => '|', - 'UnionType->types' => '|', - 'IntersectionType->types' => '&', - 'Stmt_If->elseifs' => ' ', - 'Stmt_TryCatch->catches' => ' ', - - // comma-separated lists - 'Expr_Array->items' => ', ', - 'Expr_ArrowFunction->params' => ', ', - 'Expr_Closure->params' => ', ', - 'Expr_Closure->uses' => ', ', - 'Expr_FuncCall->args' => ', ', - 'Expr_Isset->vars' => ', ', - 'Expr_List->items' => ', ', - 'Expr_MethodCall->args' => ', ', - 'Expr_NullsafeMethodCall->args' => ', ', - 'Expr_New->args' => ', ', - 'Expr_PrintableNewAnonClass->args' => ', ', - 'Expr_StaticCall->args' => ', ', - 'Stmt_ClassConst->consts' => ', ', - 'Stmt_ClassMethod->params' => ', ', - 'Stmt_Class->implements' => ', ', - 'Stmt_Enum->implements' => ', ', - 'Expr_PrintableNewAnonClass->implements' => ', ', - 'Stmt_Const->consts' => ', ', - 'Stmt_Declare->declares' => ', ', - 'Stmt_Echo->exprs' => ', ', - 'Stmt_For->init' => ', ', - 'Stmt_For->cond' => ', ', - 'Stmt_For->loop' => ', ', - 'Stmt_Function->params' => ', ', - 'Stmt_Global->vars' => ', ', - 'Stmt_GroupUse->uses' => ', ', - 'Stmt_Interface->extends' => ', ', - 'Stmt_Match->arms' => ', ', - 'Stmt_Property->props' => ', ', - 'Stmt_StaticVar->vars' => ', ', - 'Stmt_TraitUse->traits' => ', ', - 'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ', - 'Stmt_Unset->vars' => ', ', - 'Stmt_Use->uses' => ', ', - 'MatchArm->conds' => ', ', - 'AttributeGroup->attrs' => ', ', - - // statement lists - 'Expr_Closure->stmts' => "\n", - 'Stmt_Case->stmts' => "\n", - 'Stmt_Catch->stmts' => "\n", - 'Stmt_Class->stmts' => "\n", - 'Stmt_Enum->stmts' => "\n", - 'Expr_PrintableNewAnonClass->stmts' => "\n", - 'Stmt_Interface->stmts' => "\n", - 'Stmt_Trait->stmts' => "\n", - 'Stmt_ClassMethod->stmts' => "\n", - 'Stmt_Declare->stmts' => "\n", - 'Stmt_Do->stmts' => "\n", - 'Stmt_ElseIf->stmts' => "\n", - 'Stmt_Else->stmts' => "\n", - 'Stmt_Finally->stmts' => "\n", - 'Stmt_Foreach->stmts' => "\n", - 'Stmt_For->stmts' => "\n", - 'Stmt_Function->stmts' => "\n", - 'Stmt_If->stmts' => "\n", - 'Stmt_Namespace->stmts' => "\n", - 'Stmt_Class->attrGroups' => "\n", - 'Stmt_Enum->attrGroups' => "\n", - 'Stmt_EnumCase->attrGroups' => "\n", - 'Stmt_Interface->attrGroups' => "\n", - 'Stmt_Trait->attrGroups' => "\n", - 'Stmt_Function->attrGroups' => "\n", - 'Stmt_ClassMethod->attrGroups' => "\n", - 'Stmt_ClassConst->attrGroups' => "\n", - 'Stmt_Property->attrGroups' => "\n", - 'Expr_PrintableNewAnonClass->attrGroups' => ' ', - 'Expr_Closure->attrGroups' => ' ', - 'Expr_ArrowFunction->attrGroups' => ' ', - 'Param->attrGroups' => ' ', - 'Stmt_Switch->cases' => "\n", - 'Stmt_TraitUse->adaptations' => "\n", - 'Stmt_TryCatch->stmts' => "\n", - 'Stmt_While->stmts' => "\n", - - // dummy for top-level context - 'File->stmts' => "\n", - ]; - } - - protected function initializeEmptyListInsertionMap() { - if ($this->emptyListInsertionMap) return; - - // TODO Insertion into empty statement lists. - - // [$find, $extraLeft, $extraRight] - $this->emptyListInsertionMap = [ - 'Expr_ArrowFunction->params' => ['(', '', ''], - 'Expr_Closure->uses' => [')', ' use(', ')'], - 'Expr_Closure->params' => ['(', '', ''], - 'Expr_FuncCall->args' => ['(', '', ''], - 'Expr_MethodCall->args' => ['(', '', ''], - 'Expr_NullsafeMethodCall->args' => ['(', '', ''], - 'Expr_New->args' => ['(', '', ''], - 'Expr_PrintableNewAnonClass->args' => ['(', '', ''], - 'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''], - 'Expr_StaticCall->args' => ['(', '', ''], - 'Stmt_Class->implements' => [null, ' implements ', ''], - 'Stmt_Enum->implements' => [null, ' implements ', ''], - 'Stmt_ClassMethod->params' => ['(', '', ''], - 'Stmt_Interface->extends' => [null, ' extends ', ''], - 'Stmt_Function->params' => ['(', '', ''], - - /* These cannot be empty to start with: - * Expr_Isset->vars - * Stmt_Catch->types - * Stmt_Const->consts - * Stmt_ClassConst->consts - * Stmt_Declare->declares - * Stmt_Echo->exprs - * Stmt_Global->vars - * Stmt_GroupUse->uses - * Stmt_Property->props - * Stmt_StaticVar->vars - * Stmt_TraitUse->traits - * Stmt_TraitUseAdaptation_Precedence->insteadof - * Stmt_Unset->vars - * Stmt_Use->uses - * UnionType->types - */ - - /* TODO - * Stmt_If->elseifs - * Stmt_TryCatch->catches - * Expr_Array->items - * Expr_List->items - * Stmt_For->init - * Stmt_For->cond - * Stmt_For->loop - */ - ]; - } - - protected function initializeModifierChangeMap() { - if ($this->modifierChangeMap) return; - - $this->modifierChangeMap = [ - 'Stmt_ClassConst->flags' => \T_CONST, - 'Stmt_ClassMethod->flags' => \T_FUNCTION, - 'Stmt_Class->flags' => \T_CLASS, - 'Stmt_Property->flags' => \T_VARIABLE, - 'Param->flags' => \T_VARIABLE, - //'Stmt_TraitUseAdaptation_Alias->newModifier' => 0, // TODO - ]; - - // List of integer subnodes that are not modifiers: - // Expr_Include->type - // Stmt_GroupUse->type - // Stmt_Use->type - // Stmt_UseUse->type - } -} diff --git a/vendor/openlss/lib-array2xml/.gitignore b/vendor/openlss/lib-array2xml/.gitignore deleted file mode 100644 index 1ee4bf6f..00000000 --- a/vendor/openlss/lib-array2xml/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.idea -/vendor -/composer.lock diff --git a/vendor/openlss/lib-array2xml/COPYING b/vendor/openlss/lib-array2xml/COPYING deleted file mode 100644 index 20d40b6b..00000000 --- a/vendor/openlss/lib-array2xml/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/vendor/openlss/lib-array2xml/COPYING LESSER b/vendor/openlss/lib-array2xml/COPYING LESSER deleted file mode 100644 index 02bbb60b..00000000 --- a/vendor/openlss/lib-array2xml/COPYING LESSER +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. \ No newline at end of file diff --git a/vendor/openlss/lib-array2xml/LSS/Array2XML.php b/vendor/openlss/lib-array2xml/LSS/Array2XML.php deleted file mode 100644 index 99e0659a..00000000 --- a/vendor/openlss/lib-array2xml/LSS/Array2XML.php +++ /dev/null @@ -1,209 +0,0 @@ -. - */ -namespace LSS; - -use \DomDocument; -use \Exception; - -/** - * Array2XML: A class to convert array in PHP to XML - * It also takes into account attributes names unlike SimpleXML in PHP - * It returns the XML in form of DOMDocument class for further manipulation. - * It throws exception if the tag name or attribute name has illegal chars. - * - * Author : Lalit Patel - * Website: http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes - * License: Apache License 2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * Version: 0.1 (10 July 2011) - * Version: 0.2 (16 August 2011) - * - replaced htmlentities() with htmlspecialchars() (Thanks to Liel Dulev) - * - fixed a edge case where root node has a false/null/0 value. (Thanks to Liel Dulev) - * Version: 0.3 (22 August 2011) - * - fixed tag sanitize regex which didn't allow tagnames with single character. - * Version: 0.4 (18 September 2011) - * - Added support for CDATA section using @cdata instead of @value. - * Version: 0.5 (07 December 2011) - * - Changed logic to check numeric array indices not starting from 0. - * Version: 0.6 (04 March 2012) - * - Code now doesn't @cdata to be placed in an empty array - * Version: 0.7 (24 March 2012) - * - Reverted to version 0.5 - * Version: 0.8 (02 May 2012) - * - Removed htmlspecialchars() before adding to text node or attributes. - * Version: 0.11 (28 October 2015) - * - Fixed typos; Added support for plain insertion of XML trough @xml. - * - * Usage: - * $xml = Array2XML::createXML('root_node_name', $php_array); - * echo $xml->saveXML(); - */ -class Array2XML { - - /** - * @var DOMDocument - */ - private static $xml = null; - private static $encoding = 'UTF-8'; - - /** - * Initialize the root XML node [optional] - * @param $version - * @param $encoding - * @param $format_output - */ - public static function init($version = '1.0', $encoding = 'UTF-8', $format_output = true) { - self::$xml = new DomDocument($version, $encoding); - self::$xml->formatOutput = $format_output; - self::$encoding = $encoding; - } - - /** - * Convert an Array to XML - * @param string $node_name - name of the root node to be converted - * @param array $arr - aray to be converterd - * @return DomDocument - */ - public static function &createXML($node_name, $arr = array()) { - $xml = self::getXMLRoot(); - $xml->appendChild(self::convert($node_name, $arr)); - - self::$xml = null; // clear the xml node in the class for 2nd time use. - return $xml; - } - - /** - * Convert an Array to XML. - * - * @param string $node_name - * Name of the root node to be converted. - * @param array $arr - * Array to be converted. - * - * @throws \Exception - * - * @return \DOMNode - */ - private static function &convert($node_name, $arr = array()) { - - //print_arr($node_name); - $xml = self::getXMLRoot(); - $node = $xml->createElement($node_name); - - if (is_array($arr)) { - // get the attributes first.; - if (isset($arr['@attributes'])) { - foreach ($arr['@attributes'] as $key => $value) { - if (!self::isValidTagName($key)) { - throw new Exception('[Array2XML] Illegal character in attribute name. attribute: ' . $key . ' in node: ' . $node_name); - } - $node->setAttribute($key, self::bool2str($value)); - } - unset($arr['@attributes']); //remove the key from the array once done. - } - - // check if it has a value stored in @value, if yes store the value and return - // else check if its directly stored as string - if (isset($arr['@value'])) { - $node->appendChild($xml->createTextNode(self::bool2str($arr['@value']))); - unset($arr['@value']); //remove the key from the array once done. - //return from recursion, as a note with value cannot have child nodes. - return $node; - } else if (isset($arr['@cdata'])) { - $node->appendChild($xml->createCDATASection(self::bool2str($arr['@cdata']))); - unset($arr['@cdata']); //remove the key from the array once done. - //return from recursion, as a note with cdata cannot have child nodes. - return $node; - } - else if (isset($arr['@comment']) && is_string($arr['@comment'])) { - $node->appendChild($xml->createComment(self::bool2str($arr['@comment']))); - unset($arr['@comment']); - } - else if (isset($arr['@xml'])) { - $fragment = $xml->createDocumentFragment(); - $fragment->appendXML($arr['@xml']); - $node->appendChild($fragment); - unset($arr['@xml']); - return $node; - } - } - - //create subnodes using recursion - if (is_array($arr)) { - // recurse to get the node for that key - foreach ($arr as $key => $value) { - if (!self::isValidTagName($key)) { - throw new Exception('[Array2XML] Illegal character in tag name. tag: ' . $key . ' in node: ' . $node_name); - } - if (is_array($value) && is_numeric(key($value))) { - // MORE THAN ONE NODE OF ITS KIND; - // if the new array is numeric index, means it is array of nodes of the same kind - // it should follow the parent key name - foreach ($value as $k => $v) { - $node->appendChild(self::convert($key, $v)); - } - } else { - // ONLY ONE NODE OF ITS KIND - $node->appendChild(self::convert($key, $value)); - } - unset($arr[$key]); //remove the key from the array once done. - } - } - - // after we are done with all the keys in the array (if it is one) - // we check if it has any text value, if yes, append it. - if (!is_array($arr)) { - $node->appendChild($xml->createTextNode(self::bool2str($arr))); - } - - return $node; - } - - /* - * Get the root XML node, if there isn't one, create it. - */ - private static function getXMLRoot() { - if (empty(self::$xml)) { - self::init(); - } - return self::$xml; - } - - /* - * Get string representation of boolean value - */ - private static function bool2str($v) { - //convert boolean to text value. - $v = $v === true ? 'true' : $v; - $v = $v === false ? 'false' : $v; - return $v; - } - - /* - * Check if the tag name or attribute name contains illegal characters - * Ref: http://www.w3.org/TR/xml/#sec-common-syn - */ - private static function isValidTagName($tag) { - $pattern = '/^[a-z_]+[a-z0-9\:\-\.\_]*[^:]*$/i'; - return preg_match($pattern, $tag, $matches) && $matches[0] == $tag; - } -} - diff --git a/vendor/openlss/lib-array2xml/LSS/XML2Array.php b/vendor/openlss/lib-array2xml/LSS/XML2Array.php deleted file mode 100644 index ad5dafaa..00000000 --- a/vendor/openlss/lib-array2xml/LSS/XML2Array.php +++ /dev/null @@ -1,173 +0,0 @@ -. - */ -namespace LSS; -use \DOMDocument; -use \Exception; - -/** - * XML2Array: A class to convert XML to array in PHP - * It returns the array which can be converted back to XML using the Array2XML script - * It takes an XML string or a DOMDocument object as an input. - * - * See Array2XML: http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes - * - * Author : Lalit Patel - * Website: http://www.lalit.org/lab/convert-xml-to-array-in-php-xml2array - * License: Apache License 2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * Version: 0.1 (07 Dec 2011) - * Version: 0.2 (04 Mar 2012) - * Fixed typo 'DomDocument' to 'DOMDocument' - * - * Usage: - * $array = XML2Array::createArray($xml); - */ - -class XML2Array { - - protected static $xml = null; - protected static $encoding = 'UTF-8'; - protected static $prefix_attributes = '@'; - - /** - * Initialize the root XML node [optional] - * @param $version - * @param $encoding - * @param $format_output - */ - public static function init($version = '1.0', $encoding = 'UTF-8', $format_output = true) { - self::$xml = new DOMDocument($version, $encoding); - self::$xml->formatOutput = $format_output; - self::$encoding = $encoding; - } - - /** - * Convert an XML to Array - * @param string $node_name - name of the root node to be converted - * @param int - Bitwise OR of the libxml option constants see @link http://php.net/manual/libxml.constants.php - * @param array $arr - aray to be converterd - * @param mixed $callback - callback function - * @return array - */ - public static function &createArray($input_xml, $options = 0, $callback = null) { - $xml = self::getXMLRoot(); - if(is_string($input_xml)) { - $parsed = $xml->loadXML($input_xml, $options); - if(!$parsed) { - throw new Exception('[XML2Array] Error parsing the XML string.'); - } - } else { - if(get_class($input_xml) != 'DOMDocument') { - throw new Exception('[XML2Array] The input XML object should be of type: DOMDocument.'); - } - $xml = self::$xml = $input_xml; - } - $array[$xml->documentElement->tagName] = self::convert($xml->documentElement, $callback); - self::$xml = null; // clear the xml node in the class for 2nd time use. - return $array; - } - - /** - * Convert an Array to XML - * @param mixed $node - XML as a string or as an object of DOMDocument - * @param mixed $callback - callback function - * @return mixed - */ - protected static function &convert($node, $callback = null) { - $output = array(); - - switch ($node->nodeType) { - case XML_CDATA_SECTION_NODE: - $output[static::$prefix_attributes.'cdata'] = trim($node->textContent); - break; - - case XML_TEXT_NODE: - $output = trim($node->textContent); - break; - - case XML_ELEMENT_NODE: - // for each child node, call the covert function recursively - for ($i=0, $m=$node->childNodes->length; $i<$m; $i++) { - if ($callback!==null) { - $callback($m=$node->childNodes->length, $i); - } - $child = $node->childNodes->item($i); - $v = self::convert($child); - if(isset($child->tagName)) { - $t = $child->tagName; - - // avoid fatal error if the content looks like 'You are being redirected.' - if(isset($output) && !is_array($output)) { - continue; - } - // assume more nodes of same kind are coming - if(!isset($output[$t])) { - $output[$t] = array(); - } - $output[$t][] = $v; - } else { - //check if it is not an empty text node - if($v !== '') { - $output = $v; - } - } - } - - if(is_array($output)) { - // if only one node of its kind, assign it directly instead if array($value); - foreach ($output as $t => $v) { - if(is_array($v) && count($v)==1) { - $output[$t] = $v[0]; - } - } - if(empty($output)) { - //for empty nodes - $output = ''; - } - } - - // loop through the attributes and collect them - if($node->attributes->length) { - $a = array(); - foreach($node->attributes as $attrName => $attrNode) { - $a[$attrName] = (string) $attrNode->value; - } - // if its an leaf node, store the value in @value instead of directly storing it. - if(!is_array($output)) { - $output = array(static::$prefix_attributes.'value' => $output); - } - $output[static::$prefix_attributes.'attributes'] = $a; - } - break; - } - return $output; - } - - /* - * Get the root XML node, if there isn't one, create it. - */ - protected static function getXMLRoot(){ - if(empty(self::$xml)) { - self::init(); - } - return self::$xml; - } -} diff --git a/vendor/openlss/lib-array2xml/README.md b/vendor/openlss/lib-array2xml/README.md deleted file mode 100644 index d3207ce2..00000000 --- a/vendor/openlss/lib-array2xml/README.md +++ /dev/null @@ -1,72 +0,0 @@ -lib-array2xml -============= - -Array2XML conversion library credit to lalit.org - -Usage ----- -```php -//create XML -$xml = Array2XML::createXML('root_node_name', $php_array); -echo $xml->saveXML(); - -//create Array -$array = XML2Array::createArray($xml); -print_r($array); -``` - -Array2XML ----- - -@xml example: -```php -// Build the array that should be transformed into a XML object. -$array = [ - 'title' => 'A title', - 'body' => [ - '@xml' => '

The content for the news item

', - ], -]; - -// Use the Array2XML object to transform it. -$xml = Array2XML::createXML('news', $array); -echo $xml->saveXML(); -``` -This will result in the following. -```xml - - - A title - - - -

The content for the news item

- - - -
-``` - -Reference ----- -More complete references can be found here - http://www.lalit.org/lab/convert-xml-to-array-in-php-xml2array/ - http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes/ - -## Changelog - -### 1.0.0 -* Add ability for callbacks during processing to check status. - -### 0.5.1 -* Fix fata error when the array passed is empty fixed by pull request #6 - -### 0.5.0 -* add second parameter to XML2Array::createArray for DOMDocument::load, e.g: LIBXML_NOCDATA -* change method visibility from private to protected for overloading -* Merge pull request #5 to add child xml -* Merge pull request #4 to change method visibility and add second parameter for load. - - -### 0.1.0 -* Initial Release diff --git a/vendor/openlss/lib-array2xml/composer.json b/vendor/openlss/lib-array2xml/composer.json deleted file mode 100644 index 7471231f..00000000 --- a/vendor/openlss/lib-array2xml/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "openlss/lib-array2xml" - ,"homepage": "https://www.nullivex.com" - ,"description": "Array2XML conversion library credit to lalit.org" - ,"license": "Apache-2.0" - ,"type": "library" - ,"keywords": [ - "array" - ,"xml" - ,"xml conversion" - ,"array conversion" - ] - ,"authors": [ - { - "name": "Bryan Tong" - ,"email": "bryan@nullivex.com" - ,"homepage": "https://www.nullivex.com" - } - ,{ - "name": "Tony Butler" - ,"email": "spudz76@gmail.com" - ,"homepage": "https://www.nullivex.com" - } - ] - ,"require": { - "php": ">=5.3.2" - } - ,"autoload": { - "psr-0": { - "LSS": "" - } - } -} diff --git a/vendor/phpdocumentor/reflection-common/.github/dependabot.yml b/vendor/phpdocumentor/reflection-common/.github/dependabot.yml deleted file mode 100644 index c630ffa6..00000000 --- a/vendor/phpdocumentor/reflection-common/.github/dependabot.yml +++ /dev/null @@ -1,7 +0,0 @@ -version: 2 -updates: -- package-ecosystem: composer - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 diff --git a/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml b/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml deleted file mode 100644 index 484410e9..00000000 --- a/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml +++ /dev/null @@ -1,223 +0,0 @@ -on: - push: - branches: - - 2.x - pull_request: -name: Qa workflow -jobs: - setup: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - - name: Restore/cache tools folder - uses: actions/cache@v1 - with: - path: tools - key: all-tools-${{ github.sha }} - restore-keys: | - all-tools-${{ github.sha }}- - all-tools- - - - name: composer - uses: docker://composer - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - args: install --no-interaction --prefer-dist --optimize-autoloader - - - name: Install phive - run: make install-phive - - - name: Install PHAR dependencies - run: tools/phive.phar --no-progress install --copy --trust-gpg-keys 4AA394086372C20A,8A03EA3B385DBAA1 --force-accept-unsigned - - phpunit-with-coverage: - runs-on: ubuntu-latest - name: Unit tests - needs: setup - steps: - - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: 7.2 - ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 - coverage: pcov - - - name: Restore/cache tools folder - uses: actions/cache@v1 - with: - path: tools - key: all-tools-${{ github.sha }} - restore-keys: | - all-tools-${{ github.sha }}- - all-tools- - - - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ubuntu-latest-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ubuntu-latest-composer- - - - name: Install Composer dependencies - run: | - composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - - - name: Run PHPUnit - run: php tools/phpunit - - phpunit: - runs-on: ${{ matrix.operating-system }} - strategy: - matrix: - operating-system: - - ubuntu-latest - - windows-latest - - macOS-latest - php-versions: ['7.2', '7.3', '7.4', '8.0'] - name: Unit tests for PHP version ${{ matrix.php-versions }} on ${{ matrix.operating-system }} - needs: - - setup - - phpunit-with-coverage - steps: - - uses: actions/checkout@v2 - - - name: Restore/cache tools folder - uses: actions/cache@v1 - with: - path: tools - key: all-tools-${{ github.sha }} - restore-keys: | - all-tools-${{ github.sha }}- - all-tools- - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-versions }} - ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Install Composer dependencies - run: | - composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - - - name: Run PHPUnit - continue-on-error: true - run: php tools/phpunit - - codestyle: - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - name: Code style check - uses: phpDocumentor/coding-standard@latest - with: - args: -s - - phpstan: - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - name: PHPStan - uses: phpDocumentor/phpstan-ga@latest - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - args: analyse src --configuration phpstan.neon - - psalm: - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: 7.2 - ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 - tools: psalm - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Install Composer dependencies - run: | - composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - - - name: Psalm - run: psalm --output-format=github - - bc_check: - name: BC Check - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - name: fetch tags - run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - name: Roave BC Check - uses: docker://nyholm/roave-bc-check-ga diff --git a/vendor/phpdocumentor/reflection-common/LICENSE b/vendor/phpdocumentor/reflection-common/LICENSE deleted file mode 100644 index ed6926c1..00000000 --- a/vendor/phpdocumentor/reflection-common/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 phpDocumentor - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/vendor/phpdocumentor/reflection-common/README.md b/vendor/phpdocumentor/reflection-common/README.md deleted file mode 100644 index 70f830dc..00000000 --- a/vendor/phpdocumentor/reflection-common/README.md +++ /dev/null @@ -1,11 +0,0 @@ -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -![Qa workflow](https://github.com/phpDocumentor/ReflectionCommon/workflows/Qa%20workflow/badge.svg) -[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionCommon.svg)](https://coveralls.io/github/phpDocumentor/ReflectionCommon?branch=master) -[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) -[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) -[![Stable Version](https://img.shields.io/packagist/v/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) -[![Unstable Version](https://img.shields.io/packagist/vpre/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) - - -ReflectionCommon -================ diff --git a/vendor/phpdocumentor/reflection-common/composer.json b/vendor/phpdocumentor/reflection-common/composer.json deleted file mode 100644 index 4d128b49..00000000 --- a/vendor/phpdocumentor/reflection-common/composer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "phpdocumentor/reflection-common", - "keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN"], - "homepage": "http://www.phpdoc.org", - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "license": "MIT", - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "require": { - "php": "^7.2 || ^8.0" - }, - "autoload" : { - "psr-4" : { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "require-dev": { - }, - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - } -} diff --git a/vendor/phpdocumentor/reflection-common/src/Element.php b/vendor/phpdocumentor/reflection-common/src/Element.php deleted file mode 100644 index 8923e4fb..00000000 --- a/vendor/phpdocumentor/reflection-common/src/Element.php +++ /dev/null @@ -1,30 +0,0 @@ -fqsen = $fqsen; - - if (isset($matches[2])) { - $this->name = $matches[2]; - } else { - $matches = explode('\\', $fqsen); - $name = end($matches); - assert(is_string($name)); - $this->name = trim($name, '()'); - } - } - - /** - * converts this class to string. - */ - public function __toString() : string - { - return $this->fqsen; - } - - /** - * Returns the name of the element without path. - */ - public function getName() : string - { - return $this->name; - } -} diff --git a/vendor/phpdocumentor/reflection-common/src/Location.php b/vendor/phpdocumentor/reflection-common/src/Location.php deleted file mode 100644 index 177deede..00000000 --- a/vendor/phpdocumentor/reflection-common/src/Location.php +++ /dev/null @@ -1,53 +0,0 @@ -lineNumber = $lineNumber; - $this->columnNumber = $columnNumber; - } - - /** - * Returns the line number that is covered by this location. - */ - public function getLineNumber() : int - { - return $this->lineNumber; - } - - /** - * Returns the column number (character position on a line) for this location object. - */ - public function getColumnNumber() : int - { - return $this->columnNumber; - } -} diff --git a/vendor/phpdocumentor/reflection-common/src/Project.php b/vendor/phpdocumentor/reflection-common/src/Project.php deleted file mode 100644 index 57839fd1..00000000 --- a/vendor/phpdocumentor/reflection-common/src/Project.php +++ /dev/null @@ -1,25 +0,0 @@ -create($docComment); -``` - -The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock` -whose methods can be queried: - -```php -// Contains the summary for this DocBlock -$summary = $docblock->getSummary(); - -// Contains \phpDocumentor\Reflection\DocBlock\Description object -$description = $docblock->getDescription(); - -// You can either cast it to string -$description = (string) $docblock->getDescription(); - -// Or use the render method to get a string representation of the Description. -$description = $docblock->getDescription()->render(); -``` - -> For more examples it would be best to review the scripts in the [`/examples` folder](/examples). diff --git a/vendor/phpdocumentor/reflection-docblock/composer.json b/vendor/phpdocumentor/reflection-docblock/composer.json deleted file mode 100644 index d9076302..00000000 --- a/vendor/phpdocumentor/reflection-docblock/composer.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "phpdocumentor/reflection-docblock", - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1", - "phpdocumentor/reflection-common": "^2.2", - "ext-filter": "*" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "phpDocumentor\\Reflection\\": ["tests/unit", "tests/integration"] - } - }, - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php deleted file mode 100644 index cc33e60e..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php +++ /dev/null @@ -1,228 +0,0 @@ -summary = $summary; - $this->description = $description ?: new DocBlock\Description(''); - foreach ($tags as $tag) { - $this->addTag($tag); - } - - $this->context = $context; - $this->location = $location; - - $this->isTemplateEnd = $isTemplateEnd; - $this->isTemplateStart = $isTemplateStart; - } - - public function getSummary(): string - { - return $this->summary; - } - - public function getDescription(): DocBlock\Description - { - return $this->description; - } - - /** - * Returns the current context. - */ - public function getContext(): ?Types\Context - { - return $this->context; - } - - /** - * Returns the current location. - */ - public function getLocation(): ?Location - { - return $this->location; - } - - /** - * Returns whether this DocBlock is the start of a Template section. - * - * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker - * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. - * - * An example of such an opening is: - * - * ``` - * /**#@+ - * * My DocBlock - * * / - * ``` - * - * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all - * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). - * - * @see self::isTemplateEnd() for the check whether a closing marker was provided. - */ - public function isTemplateStart(): bool - { - return $this->isTemplateStart; - } - - /** - * Returns whether this DocBlock is the end of a Template section. - * - * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. - */ - public function isTemplateEnd(): bool - { - return $this->isTemplateEnd; - } - - /** - * Returns the tags for this DocBlock. - * - * @return Tag[] - */ - public function getTags(): array - { - return $this->tags; - } - - /** - * Returns an array of tags matching the given name. If no tags are found - * an empty array is returned. - * - * @param string $name String to search by. - * - * @return Tag[] - */ - public function getTagsByName(string $name): array - { - $result = []; - - foreach ($this->getTags() as $tag) { - if ($tag->getName() !== $name) { - continue; - } - - $result[] = $tag; - } - - return $result; - } - - /** - * Returns an array of tags with type matching the given name. If no tags are found - * an empty array is returned. - * - * @param string $name String to search by. - * - * @return TagWithType[] - */ - public function getTagsWithTypeByName(string $name): array - { - $result = []; - - foreach ($this->getTagsByName($name) as $tag) { - if (!$tag instanceof TagWithType) { - continue; - } - - $result[] = $tag; - } - - return $result; - } - - /** - * Checks if a tag of a certain type is present in this DocBlock. - * - * @param string $name Tag name to check for. - */ - public function hasTag(string $name): bool - { - foreach ($this->getTags() as $tag) { - if ($tag->getName() === $name) { - return true; - } - } - - return false; - } - - /** - * Remove a tag from this DocBlock. - * - * @param Tag $tagToRemove The tag to remove. - */ - public function removeTag(Tag $tagToRemove): void - { - foreach ($this->tags as $key => $tag) { - if ($tag === $tagToRemove) { - unset($this->tags[$key]); - break; - } - } - } - - /** - * Adds a tag to this DocBlock. - * - * @param Tag $tag The tag to add. - */ - private function addTag(Tag $tag): void - { - $this->tags[] = $tag; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php deleted file mode 100644 index a31b2892..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php +++ /dev/null @@ -1,115 +0,0 @@ -create('This is a {@see Description}', $context); - * - * The description factory will interpret the given body and create a body template and list of tags from them, and pass - * that onto the constructor if this class. - * - * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace - * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial - * > type names and FQSENs. - * - * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: - * - * $description = new Description( - * 'This is a %1$s', - * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] - * ); - * - * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object - * is mainly responsible for rendering. - * - * @see DescriptionFactory to create a new Description. - * @see Description\Formatter for the formatting of the body and tags. - */ -class Description -{ - /** @var string */ - private $bodyTemplate; - - /** @var Tag[] */ - private $tags; - - /** - * Initializes a Description with its body (template) and a listing of the tags used in the body template. - * - * @param Tag[] $tags - */ - public function __construct(string $bodyTemplate, array $tags = []) - { - $this->bodyTemplate = $bodyTemplate; - $this->tags = $tags; - } - - /** - * Returns the body template. - */ - public function getBodyTemplate(): string - { - return $this->bodyTemplate; - } - - /** - * Returns the tags for this DocBlock. - * - * @return Tag[] - */ - public function getTags(): array - { - return $this->tags; - } - - /** - * Renders this description as a string where the provided formatter will format the tags in the expected string - * format. - */ - public function render(?Formatter $formatter = null): string - { - if ($formatter === null) { - $formatter = new PassthroughFormatter(); - } - - $tags = []; - foreach ($this->tags as $tag) { - $tags[] = '{' . $formatter->format($tag) . '}'; - } - - return vsprintf($this->bodyTemplate, $tags); - } - - /** - * Returns a plain string representation of this description. - */ - public function __toString(): string - { - return $this->render(); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php deleted file mode 100644 index 1a519ec4..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php +++ /dev/null @@ -1,178 +0,0 @@ -tagFactory = $tagFactory; - } - - /** - * Returns the parsed text of this description. - */ - public function create(string $contents, ?TypeContext $context = null): Description - { - $tokens = $this->lex($contents); - $count = count($tokens); - $tagCount = 0; - $tags = []; - - for ($i = 1; $i < $count; $i += 2) { - $tags[] = $this->tagFactory->create($tokens[$i], $context); - $tokens[$i] = '%' . ++$tagCount . '$s'; - } - - //In order to allow "literal" inline tags, the otherwise invalid - //sequence "{@}" is changed to "@", and "{}" is changed to "}". - //"%" is escaped to "%%" because of vsprintf. - //See unit tests for examples. - for ($i = 0; $i < $count; $i += 2) { - $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); - } - - return new Description(implode('', $tokens), $tags); - } - - /** - * Strips the contents from superfluous whitespace and splits the description into a series of tokens. - * - * @return string[] A series of tokens of which the description text is composed. - */ - private function lex(string $contents): array - { - $contents = $this->removeSuperfluousStartingWhitespace($contents); - - // performance optimalization; if there is no inline tag, don't bother splitting it up. - if (strpos($contents, '{@') === false) { - return [$contents]; - } - - return Utils::pregSplit( - '/\{ - # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. - (?!@\}) - # We want to capture the whole tag line, but without the inline tag delimiters. - (\@ - # Match everything up to the next delimiter. - [^{}]* - # Nested inline tag content should not be captured, or it will appear in the result separately. - (?: - # Match nested inline tags. - (?: - # Because we did not catch the tag delimiters earlier, we must be explicit with them here. - # Notice that this also matches "{}", as a way to later introduce it as an escape sequence. - \{(?1)?\} - | - # Make sure we match hanging "{". - \{ - ) - # Match content after the nested inline tag. - [^{}]* - )* # If there are more inline tags, match them as well. We use "*" since there may not be any - # nested inline tags. - ) - \}/Sux', - $contents, - 0, - PREG_SPLIT_DELIM_CAPTURE - ); - } - - /** - * Removes the superfluous from a multi-line description. - * - * When a description has more than one line then it can happen that the second and subsequent lines have an - * additional indentation. This is commonly in use with tags like this: - * - * {@}since 1.1.0 This is an example - * description where we have an - * indentation in the second and - * subsequent lines. - * - * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent - * lines and this may cause rendering issues when, for example, using a Markdown converter. - */ - private function removeSuperfluousStartingWhitespace(string $contents): string - { - $lines = Utils::pregSplit("/\r\n?|\n/", $contents); - - // if there is only one line then we don't have lines with superfluous whitespace and - // can use the contents as-is - if (count($lines) <= 1) { - return $contents; - } - - // determine how many whitespace characters need to be stripped - $startingSpaceCount = 9999999; - for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { - // lines with a no length do not count as they are not indented at all - if (trim($lines[$i]) === '') { - continue; - } - - // determine the number of prefixing spaces by checking the difference in line length before and after - // an ltrim - $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); - } - - // strip the number of spaces from each line - if ($startingSpaceCount > 0) { - for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { - $lines[$i] = substr($lines[$i], $startingSpaceCount); - } - } - - return implode("\n", $lines); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php deleted file mode 100644 index 6a6b4729..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php +++ /dev/null @@ -1,159 +0,0 @@ -getFilePath(); - - $file = $this->getExampleFileContents($filename); - if (!$file) { - return sprintf('** File not found : %s **', $filename); - } - - return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); - } - - /** - * Registers the project's root directory where an 'examples' folder can be expected. - */ - public function setSourceDirectory(string $directory = ''): void - { - $this->sourceDirectory = $directory; - } - - /** - * Returns the project's root directory where an 'examples' folder can be expected. - */ - public function getSourceDirectory(): string - { - return $this->sourceDirectory; - } - - /** - * Registers a series of directories that may contain examples. - * - * @param string[] $directories - */ - public function setExampleDirectories(array $directories): void - { - $this->exampleDirectories = $directories; - } - - /** - * Returns a series of directories that may contain examples. - * - * @return string[] - */ - public function getExampleDirectories(): array - { - return $this->exampleDirectories; - } - - /** - * Attempts to find the requested example file and returns its contents or null if no file was found. - * - * This method will try several methods in search of the given example file, the first one it encounters is - * returned: - * - * 1. Iterates through all examples folders for the given filename - * 2. Checks the source folder for the given filename - * 3. Checks the 'examples' folder in the current working directory for examples - * 4. Checks the path relative to the current working directory for the given filename - * - * @return string[] all lines of the example file - */ - private function getExampleFileContents(string $filename): ?array - { - $normalizedPath = null; - - foreach ($this->exampleDirectories as $directory) { - $exampleFileFromConfig = $this->constructExamplePath($directory, $filename); - if (is_readable($exampleFileFromConfig)) { - $normalizedPath = $exampleFileFromConfig; - break; - } - } - - if (!$normalizedPath) { - if (is_readable($this->getExamplePathFromSource($filename))) { - $normalizedPath = $this->getExamplePathFromSource($filename); - } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { - $normalizedPath = $this->getExamplePathFromExampleDirectory($filename); - } elseif (is_readable($filename)) { - $normalizedPath = $filename; - } - } - - $lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : false; - - return $lines !== false ? $lines : null; - } - - /** - * Get example filepath based on the example directory inside your project. - */ - private function getExamplePathFromExampleDirectory(string $file): string - { - return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; - } - - /** - * Returns a path to the example file in the given directory.. - */ - private function constructExamplePath(string $directory, string $file): string - { - return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; - } - - /** - * Get example filepath based on sourcecode. - */ - private function getExamplePathFromSource(string $file): string - { - return sprintf( - '%s%s%s', - trim($this->getSourceDirectory(), '\\/'), - DIRECTORY_SEPARATOR, - trim($file, '"') - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php deleted file mode 100644 index 77e5fb5f..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php +++ /dev/null @@ -1,157 +0,0 @@ -indent = $indent; - $this->indentString = $indentString; - $this->isFirstLineIndented = $indentFirstLine; - $this->lineLength = $lineLength; - $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); - $this->lineEnding = $lineEnding; - } - - /** - * Generate a DocBlock comment. - * - * @param DocBlock $docblock The DocBlock to serialize. - * - * @return string The serialized doc block. - */ - public function getDocComment(DocBlock $docblock): string - { - $indent = str_repeat($this->indentString, $this->indent); - $firstIndent = $this->isFirstLineIndented ? $indent : ''; - // 3 === strlen(' * ') - $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; - - $text = $this->removeTrailingSpaces( - $indent, - $this->addAsterisksForEachLine( - $indent, - $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength) - ) - ); - - $comment = $firstIndent . "/**\n"; - if ($text) { - $comment .= $indent . ' * ' . $text . "\n"; - $comment .= $indent . " *\n"; - } - - $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); - - return str_replace("\n", $this->lineEnding, $comment . $indent . ' */'); - } - - private function removeTrailingSpaces(string $indent, string $text): string - { - return str_replace( - sprintf("\n%s * \n", $indent), - sprintf("\n%s *\n", $indent), - $text - ); - } - - private function addAsterisksForEachLine(string $indent, string $text): string - { - return str_replace( - "\n", - sprintf("\n%s * ", $indent), - $text - ); - } - - private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength): string - { - $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() - : ''); - if ($wrapLength !== null) { - $text = wordwrap($text, $wrapLength); - - return $text; - } - - return $text; - } - - private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment): string - { - foreach ($docblock->getTags() as $tag) { - $tagText = $this->tagFormatter->format($tag); - if ($wrapLength !== null) { - $tagText = wordwrap($tagText, $wrapLength); - } - - $tagText = str_replace( - "\n", - sprintf("\n%s * ", $indent), - $tagText - ); - - $comment .= sprintf("%s * %s\n", $indent, $tagText); - } - - return $comment; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php deleted file mode 100644 index 8d765951..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php +++ /dev/null @@ -1,348 +0,0 @@ - Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise - * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to - * > verify that a dependency is actually passed. - * - * This Factory also features a Service Locator component that is used to pass the right dependencies to the - * `create` method of a tag; each dependency should be registered as a service or as a parameter. - * - * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass - * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. - */ -final class StandardTagFactory implements TagFactory -{ - /** PCRE regular expression matching a tag name. */ - public const REGEX_TAGNAME = '[\w\-\_\\\\:]+'; - - /** - * @var array> An array with a tag as a key, and an - * FQCN to a class that handles it as an array value. - */ - private $tagHandlerMappings = [ - 'author' => Author::class, - 'covers' => Covers::class, - 'deprecated' => Deprecated::class, - // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', - 'link' => LinkTag::class, - 'method' => Method::class, - 'param' => Param::class, - 'property-read' => PropertyRead::class, - 'property' => Property::class, - 'property-write' => PropertyWrite::class, - 'return' => Return_::class, - 'see' => SeeTag::class, - 'since' => Since::class, - 'source' => Source::class, - 'throw' => Throws::class, - 'throws' => Throws::class, - 'uses' => Uses::class, - 'var' => Var_::class, - 'version' => Version::class, - ]; - - /** - * @var array> An array with a anotation s a key, and an - * FQCN to a class that handles it as an array value. - */ - private $annotationMappings = []; - - /** - * @var ReflectionParameter[][] a lazy-loading cache containing parameters - * for each tagHandler that has been used. - */ - private $tagHandlerParameterCache = []; - - /** @var FqsenResolver */ - private $fqsenResolver; - - /** - * @var mixed[] an array representing a simple Service Locator where we can store parameters and - * services that can be inserted into the Factory Methods of Tag Handlers. - */ - private $serviceLocator = []; - - /** - * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. - * - * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property - * is used. - * - * @see self::registerTagHandler() to add a new tag handler to the existing default list. - * - * @param array> $tagHandlers - */ - public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) - { - $this->fqsenResolver = $fqsenResolver; - if ($tagHandlers !== null) { - $this->tagHandlerMappings = $tagHandlers; - } - - $this->addService($fqsenResolver, FqsenResolver::class); - } - - public function create(string $tagLine, ?TypeContext $context = null): Tag - { - if (!$context) { - $context = new TypeContext(''); - } - - [$tagName, $tagBody] = $this->extractTagParts($tagLine); - - return $this->createTag(trim($tagBody), $tagName, $context); - } - - /** - * @param mixed $value - */ - public function addParameter(string $name, $value): void - { - $this->serviceLocator[$name] = $value; - } - - public function addService(object $service, ?string $alias = null): void - { - $this->serviceLocator[$alias ?: get_class($service)] = $service; - } - - public function registerTagHandler(string $tagName, string $handler): void - { - Assert::stringNotEmpty($tagName); - Assert::classExists($handler); - Assert::implementsInterface($handler, Tag::class); - - if (strpos($tagName, '\\') && $tagName[0] !== '\\') { - throw new InvalidArgumentException( - 'A namespaced tag must have a leading backslash as it must be fully qualified' - ); - } - - $this->tagHandlerMappings[$tagName] = $handler; - } - - /** - * Extracts all components for a tag. - * - * @return string[] - */ - private function extractTagParts(string $tagLine): array - { - $matches = []; - if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\s\(\{])\s*([^\s].*)|$)/us', $tagLine, $matches)) { - throw new InvalidArgumentException( - 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors' - ); - } - - if (count($matches) < 3) { - $matches[] = ''; - } - - return array_slice($matches, 1); - } - - /** - * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the - * body was invalid. - */ - private function createTag(string $body, string $name, TypeContext $context): Tag - { - $handlerClassName = $this->findHandlerClassName($name, $context); - $arguments = $this->getArgumentsForParametersFromWiring( - $this->fetchParametersForHandlerFactoryMethod($handlerClassName), - $this->getServiceLocatorWithDynamicParameters($context, $name, $body) - ); - - try { - $callable = [$handlerClassName, 'create']; - Assert::isCallable($callable); - /** @phpstan-var callable(string): ?Tag $callable */ - $tag = call_user_func_array($callable, $arguments); - - return $tag ?? InvalidTag::create($body, $name); - } catch (InvalidArgumentException $e) { - return InvalidTag::create($body, $name)->withError($e); - } - } - - /** - * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). - * - * @return class-string - */ - private function findHandlerClassName(string $tagName, TypeContext $context): string - { - $handlerClassName = Generic::class; - if (isset($this->tagHandlerMappings[$tagName])) { - $handlerClassName = $this->tagHandlerMappings[$tagName]; - } elseif ($this->isAnnotation($tagName)) { - // TODO: Annotation support is planned for a later stage and as such is disabled for now - $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); - if (isset($this->annotationMappings[$tagName])) { - $handlerClassName = $this->annotationMappings[$tagName]; - } - } - - return $handlerClassName; - } - - /** - * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. - * - * @param ReflectionParameter[] $parameters - * @param mixed[] $locator - * - * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters - * is provided with this method. - */ - private function getArgumentsForParametersFromWiring(array $parameters, array $locator): array - { - $arguments = []; - foreach ($parameters as $parameter) { - $type = $parameter->getType(); - $typeHint = null; - if ($type instanceof ReflectionNamedType) { - $typeHint = $type->getName(); - if ($typeHint === 'self') { - $declaringClass = $parameter->getDeclaringClass(); - if ($declaringClass !== null) { - $typeHint = $declaringClass->getName(); - } - } - } - - if (isset($locator[$typeHint])) { - $arguments[] = $locator[$typeHint]; - continue; - } - - $parameterName = $parameter->getName(); - if (isset($locator[$parameterName])) { - $arguments[] = $locator[$parameterName]; - continue; - } - - $arguments[] = null; - } - - return $arguments; - } - - /** - * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given - * tag handler class name. - * - * @param class-string $handlerClassName - * - * @return ReflectionParameter[] - */ - private function fetchParametersForHandlerFactoryMethod(string $handlerClassName): array - { - if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { - $methodReflection = new ReflectionMethod($handlerClassName, 'create'); - $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); - } - - return $this->tagHandlerParameterCache[$handlerClassName]; - } - - /** - * Returns a copy of this class' Service Locator with added dynamic parameters, - * such as the tag's name, body and Context. - * - * @param TypeContext $context The Context (namespace and aliasses) that may be - * passed and is used to resolve FQSENs. - * @param string $tagName The name of the tag that may be - * passed onto the factory method of the Tag class. - * @param string $tagBody The body of the tag that may be - * passed onto the factory method of the Tag class. - * - * @return mixed[] - */ - private function getServiceLocatorWithDynamicParameters( - TypeContext $context, - string $tagName, - string $tagBody - ): array { - return array_merge( - $this->serviceLocator, - [ - 'name' => $tagName, - 'body' => $tagBody, - TypeContext::class => $context, - ] - ); - } - - /** - * Returns whether the given tag belongs to an annotation. - * - * @todo this method should be populated once we implement Annotation notation support. - */ - private function isAnnotation(string $tagContent): bool - { - // 1. Contains a namespace separator - // 2. Contains parenthesis - // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part - // of the annotation class name matches the found tag name - - return false; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php deleted file mode 100644 index 7cf07b4d..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php +++ /dev/null @@ -1,31 +0,0 @@ - $handler FQCN of handler. - * - * @throws InvalidArgumentException If the tag name is not a string. - * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but - * does not start with a backslash. - * @throws InvalidArgumentException If the handler is not a string. - * @throws InvalidArgumentException If the handler is not an existing class. - * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. - */ - public function registerTagHandler(string $tagName, string $handler): void; -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php deleted file mode 100644 index ae09ecf4..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php +++ /dev/null @@ -1,102 +0,0 @@ -authorName = $authorName; - $this->authorEmail = $authorEmail; - } - - /** - * Gets the author's name. - * - * @return string The author's name. - */ - public function getAuthorName(): string - { - return $this->authorName; - } - - /** - * Returns the author's email. - * - * @return string The author's email. - */ - public function getEmail(): string - { - return $this->authorEmail; - } - - /** - * Returns this tag in string form. - */ - public function __toString(): string - { - if ($this->authorEmail) { - $authorEmail = '<' . $this->authorEmail . '>'; - } else { - $authorEmail = ''; - } - - $authorName = $this->authorName; - - return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); - } - - /** - * Attempts to create a new Author object based on the tag body. - */ - public static function create(string $body): ?self - { - $splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches); - if (!$splitTagContent) { - return null; - } - - $authorName = trim($matches[1]); - $email = isset($matches[2]) ? trim($matches[2]) : ''; - - return new static($authorName, $email); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php deleted file mode 100644 index a28d5bf9..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php +++ /dev/null @@ -1,53 +0,0 @@ -name; - } - - public function getDescription(): ?Description - { - return $this->description; - } - - public function render(?Formatter $formatter = null): string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - - return $formatter->format($this); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php deleted file mode 100644 index 3eff9d8b..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php +++ /dev/null @@ -1,101 +0,0 @@ -refers = $refers; - $this->description = $description; - } - - public static function create( - string $body, - ?DescriptionFactory $descriptionFactory = null, - ?FqsenResolver $resolver = null, - ?TypeContext $context = null - ): self { - Assert::stringNotEmpty($body); - Assert::notNull($descriptionFactory); - Assert::notNull($resolver); - - $parts = Utils::pregSplit('/\s+/Su', $body, 2); - - return new static( - self::resolveFqsen($parts[0], $resolver, $context), - $descriptionFactory->create($parts[1] ?? '', $context) - ); - } - - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context): Fqsen - { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; - } - - return new Fqsen($resolved . '::' . $fqsenParts[1]); - } - - /** - * Returns the structural element this tag refers to. - */ - public function getReference(): Fqsen - { - return $this->refers; - } - - /** - * Returns a string representation of this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $refers = (string) $this->refers; - - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php deleted file mode 100644 index dbcad28c..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php +++ /dev/null @@ -1,109 +0,0 @@ -version = $version; - $this->description = $description; - } - - /** - * @return static - */ - public static function create( - ?string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - if (empty($body)) { - return new static(); - } - - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { - return new static( - null, - $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null - ); - } - - Assert::notNull($descriptionFactory); - - return new static( - $matches[1], - $descriptionFactory->create($matches[2] ?? '', $context) - ); - } - - /** - * Gets the version section of the tag. - */ - public function getVersion(): ?string - { - return $this->version; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $version = (string) $this->version; - - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php deleted file mode 100644 index 825355aa..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php +++ /dev/null @@ -1,200 +0,0 @@ -filePath = $filePath; - $this->startingLine = $startingLine; - $this->lineCount = $lineCount; - if ($content !== null) { - $this->content = trim($content); - } - - $this->isURI = $isURI; - } - - public function getContent(): string - { - if ($this->content === null || $this->content === '') { - $filePath = $this->filePath; - if ($this->isURI) { - $filePath = $this->isUriRelative($this->filePath) - ? str_replace('%2F', '/', rawurlencode($this->filePath)) - : $this->filePath; - } - - return trim($filePath); - } - - return $this->content; - } - - public function getDescription(): ?string - { - return $this->content; - } - - public static function create(string $body): ?Tag - { - // File component: File path in quotes or File URI / Source information - if (!preg_match('/^\s*(?:(\"[^\"]+\")|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) { - return null; - } - - $filePath = null; - $fileUri = null; - if ($matches[1] !== '') { - $filePath = $matches[1]; - } else { - $fileUri = $matches[2]; - } - - $startingLine = 1; - $lineCount = 0; - $description = null; - - if (array_key_exists(3, $matches)) { - $description = $matches[3]; - - // Starting line / Number of lines / Description - if (preg_match('/^([1-9]\d*)(?:\s+((?1))\s*)?(.*)$/sux', $matches[3], $contentMatches)) { - $startingLine = (int) $contentMatches[1]; - if (isset($contentMatches[2])) { - $lineCount = (int) $contentMatches[2]; - } - - if (array_key_exists(3, $contentMatches)) { - $description = $contentMatches[3]; - } - } - } - - return new static( - $filePath ?? ($fileUri ?? ''), - $fileUri !== null, - $startingLine, - $lineCount, - $description - ); - } - - /** - * Returns the file path. - * - * @return string Path to a file to use as an example. - * May also be an absolute URI. - */ - public function getFilePath(): string - { - return trim($this->filePath, '"'); - } - - /** - * Returns a string representation for this tag. - */ - public function __toString(): string - { - $filePath = $this->filePath; - $isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; - $startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; - $lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; - $content = (string) $this->content; - - return $filePath - . ($startingLine !== '' - ? ($filePath !== '' ? ' ' : '') . $startingLine - : '') - . ($lineCount !== '' - ? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount - : '') - . ($content !== '' - ? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content - : ''); - } - - /** - * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). - */ - private function isUriRelative(string $uri): bool - { - return strpos($uri, ':') === false; - } - - public function getStartingLine(): int - { - return $this->startingLine; - } - - public function getLineCount(): int - { - return $this->lineCount; - } - - public function getName(): string - { - return 'example'; - } - - public function render(?Formatter $formatter = null): string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - - return $formatter->format($this); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php deleted file mode 100644 index f6f0bb5a..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php +++ /dev/null @@ -1,25 +0,0 @@ -maxLen = max($this->maxLen, strlen($tag->getName())); - } - } - - /** - * Formats the given tag to return a simple plain text version. - */ - public function format(Tag $tag): string - { - return '@' . $tag->getName() . - str_repeat( - ' ', - $this->maxLen - strlen($tag->getName()) + 1 - ) . - $tag; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php deleted file mode 100644 index 2afdfe55..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php +++ /dev/null @@ -1,30 +0,0 @@ -getName() . ' ' . $tag); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php deleted file mode 100644 index bc1ab10c..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php +++ /dev/null @@ -1,89 +0,0 @@ -validateTagName($name); - - $this->name = $name; - $this->description = $description; - } - - /** - * Creates a new tag that represents any unknown tag type. - * - * @return static - */ - public static function create( - string $body, - string $name = '', - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::stringNotEmpty($name); - Assert::notNull($descriptionFactory); - - $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; - - return new static($name, $description); - } - - /** - * Returns the tag as a serialized string - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - return $description; - } - - /** - * Validates if the tag name matches the expected format, otherwise throws an exception. - */ - private function validateTagName(string $name): void - { - if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { - throw new InvalidArgumentException( - 'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' - . 'hyphens and backslashes.' - ); - } - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php deleted file mode 100644 index 4e6abb8c..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php +++ /dev/null @@ -1,145 +0,0 @@ -name = $name; - $this->body = $body; - } - - public function getException(): ?Throwable - { - return $this->throwable; - } - - public function getName(): string - { - return $this->name; - } - - public static function create(string $body, string $name = ''): self - { - return new self($name, $body); - } - - public function withError(Throwable $exception): self - { - $this->flattenExceptionBacktrace($exception); - $tag = new self($this->name, $this->body); - $tag->throwable = $exception; - - return $tag; - } - - /** - * Removes all complex types from backtrace - * - * Not all objects are serializable. So we need to remove them from the - * stored exception to be sure that we do not break existing library usage. - */ - private function flattenExceptionBacktrace(Throwable $exception): void - { - $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); - $traceProperty->setAccessible(true); - - do { - $trace = $exception->getTrace(); - if (isset($trace[0]['args'])) { - $trace = array_map( - function (array $call): array { - $call['args'] = array_map([$this, 'flattenArguments'], $call['args'] ?? []); - - return $call; - }, - $trace - ); - } - - $traceProperty->setValue($exception, $trace); - $exception = $exception->getPrevious(); - } while ($exception !== null); - - $traceProperty->setAccessible(false); - } - - /** - * @param mixed $value - * - * @return mixed - * - * @throws ReflectionException - */ - private function flattenArguments($value) - { - if ($value instanceof Closure) { - $closureReflection = new ReflectionFunction($value); - $value = sprintf( - '(Closure at %s:%s)', - $closureReflection->getFileName(), - $closureReflection->getStartLine() - ); - } elseif (is_object($value)) { - $value = sprintf('object(%s)', get_class($value)); - } elseif (is_resource($value)) { - $value = sprintf('resource(%s)', get_resource_type($value)); - } elseif (is_array($value)) { - $value = array_map([$this, 'flattenArguments'], $value); - } - - return $value; - } - - public function render(?Formatter $formatter = null): string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - - return $formatter->format($this); - } - - public function __toString(): string - { - return $this->body; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php deleted file mode 100644 index ee242e3b..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php +++ /dev/null @@ -1,78 +0,0 @@ -link = $link; - $this->description = $description; - } - - public static function create( - string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::notNull($descriptionFactory); - - $parts = Utils::pregSplit('/\s+/Su', $body, 2); - $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; - - return new static($parts[0], $description); - } - - /** - * Gets the link - */ - public function getLink(): string - { - return $this->link; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $link = $this->link; - - return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php deleted file mode 100644 index f08bfffd..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php +++ /dev/null @@ -1,279 +0,0 @@ - - * @var array> - */ - private $arguments; - - /** @var bool */ - private $isStatic; - - /** @var Type */ - private $returnType; - - /** - * @param array> $arguments - * @phpstan-param array $arguments - */ - public function __construct( - string $methodName, - array $arguments = [], - ?Type $returnType = null, - bool $static = false, - ?Description $description = null - ) { - Assert::stringNotEmpty($methodName); - - if ($returnType === null) { - $returnType = new Void_(); - } - - $this->methodName = $methodName; - $this->arguments = $this->filterArguments($arguments); - $this->returnType = $returnType; - $this->isStatic = $static; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): ?self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - // 1. none or more whitespace - // 2. optionally the keyword "static" followed by whitespace - // 3. optionally a word with underscores followed by whitespace : as - // type for the return value - // 4. then optionally a word with underscores followed by () and - // whitespace : as method name as used by phpDocumentor - // 5. then a word with underscores, followed by ( and any character - // until a ) and whitespace : as method name with signature - // 6. any remaining text : as description - if ( - !preg_match( - '/^ - # Static keyword - # Declares a static method ONLY if type is also present - (?: - (static) - \s+ - )? - # Return type - (?: - ( - (?:[\w\|_\\\\]*\$this[\w\|_\\\\]*) - | - (?: - (?:[\w\|_\\\\]+) - # array notation - (?:\[\])* - )*+ - ) - \s+ - )? - # Method name - ([\w_]+) - # Arguments - (?: - \(([^\)]*)\) - )? - \s* - # Description - (.*) - $/sux', - $body, - $matches - ) - ) { - return null; - } - - [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; - - $static = $static === 'static'; - - if ($returnType === '') { - $returnType = 'void'; - } - - $returnType = $typeResolver->resolve($returnType, $context); - $description = $descriptionFactory->create($description, $context); - - /** @phpstan-var array $arguments */ - $arguments = []; - if ($argumentLines !== '') { - $argumentsExploded = explode(',', $argumentLines); - foreach ($argumentsExploded as $argument) { - $argument = explode(' ', self::stripRestArg(trim($argument)), 2); - if (strpos($argument[0], '$') === 0) { - $argumentName = substr($argument[0], 1); - $argumentType = new Mixed_(); - } else { - $argumentType = $typeResolver->resolve($argument[0], $context); - $argumentName = ''; - if (isset($argument[1])) { - $argument[1] = self::stripRestArg($argument[1]); - $argumentName = substr($argument[1], 1); - } - } - - $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; - } - } - - return new static($methodName, $arguments, $returnType, $static, $description); - } - - /** - * Retrieves the method name. - */ - public function getMethodName(): string - { - return $this->methodName; - } - - /** - * @return array> - * @phpstan-return array - */ - public function getArguments(): array - { - return $this->arguments; - } - - /** - * Checks whether the method tag describes a static method or not. - * - * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. - */ - public function isStatic(): bool - { - return $this->isStatic; - } - - public function getReturnType(): Type - { - return $this->returnType; - } - - public function __toString(): string - { - $arguments = []; - foreach ($this->arguments as $argument) { - $arguments[] = $argument['type'] . ' $' . $argument['name']; - } - - $argumentStr = '(' . implode(', ', $arguments) . ')'; - - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $static = $this->isStatic ? 'static' : ''; - - $returnType = (string) $this->returnType; - - $methodName = $this->methodName; - - return $static - . ($returnType !== '' ? ($static !== '' ? ' ' : '') . $returnType : '') - . ($methodName !== '' ? ($static !== '' || $returnType !== '' ? ' ' : '') . $methodName : '') - . $argumentStr - . ($description !== '' ? ' ' . $description : ''); - } - - /** - * @param mixed[][]|string[] $arguments - * @phpstan-param array $arguments - * - * @return mixed[][] - * @phpstan-return array - */ - private function filterArguments(array $arguments = []): array - { - $result = []; - foreach ($arguments as $argument) { - if (is_string($argument)) { - $argument = ['name' => $argument]; - } - - if (!isset($argument['type'])) { - $argument['type'] = new Mixed_(); - } - - $keys = array_keys($argument); - sort($keys); - if ($keys !== ['name', 'type']) { - throw new InvalidArgumentException( - 'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true) - ); - } - - $result[] = $argument; - } - - return $result; - } - - private static function stripRestArg(string $argument): string - { - if (strpos($argument, '...') === 0) { - $argument = trim(substr($argument, 3)); - } - - return $argument; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php deleted file mode 100644 index 3399649b..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php +++ /dev/null @@ -1,174 +0,0 @@ -name = 'param'; - $this->variableName = $variableName; - $this->type = $type; - $this->isVariadic = $isVariadic; - $this->description = $description; - $this->isReference = $isReference; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - - $type = null; - $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - $isVariadic = false; - $isReference = false; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && !self::strStartsWithVariable($firstPart)) { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ or ...$ or &$ or &...$ it must be the variable name - if (isset($parts[0]) && self::strStartsWithVariable($parts[0])) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - - Assert::notNull($variableName); - - if (strpos($variableName, '$') === 0) { - $variableName = substr($variableName, 1); - } elseif (strpos($variableName, '&$') === 0) { - $isReference = true; - $variableName = substr($variableName, 2); - } elseif (strpos($variableName, '...$') === 0) { - $isVariadic = true; - $variableName = substr($variableName, 4); - } elseif (strpos($variableName, '&...$') === 0) { - $isVariadic = true; - $isReference = true; - $variableName = substr($variableName, 5); - } - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $isVariadic, $description, $isReference); - } - - /** - * Returns the variable's name. - */ - public function getVariableName(): ?string - { - return $this->variableName; - } - - /** - * Returns whether this tag is variadic. - */ - public function isVariadic(): bool - { - return $this->isVariadic; - } - - /** - * Returns whether this tag is passed by reference. - */ - public function isReference(): bool - { - return $this->isReference; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $variableName = ''; - if ($this->variableName) { - $variableName .= ($this->isReference ? '&' : '') . ($this->isVariadic ? '...' : ''); - $variableName .= '$' . $this->variableName; - } - - $type = (string) $this->type; - - return $type - . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') - . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } - - private static function strStartsWithVariable(string $str): bool - { - return strpos($str, '$') === 0 - || - strpos($str, '...$') === 0 - || - strpos($str, '&$') === 0 - || - strpos($str, '&...$') === 0; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php deleted file mode 100644 index 2521fb3f..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php +++ /dev/null @@ -1,121 +0,0 @@ -name = 'property'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName(): ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - - $type = (string) $this->type; - - return $type - . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') - . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php deleted file mode 100644 index 9491b39c..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php +++ /dev/null @@ -1,121 +0,0 @@ -name = 'property-read'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName(): ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - - $type = (string) $this->type; - - return $type - . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') - . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php deleted file mode 100644 index 2bfdac6a..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php +++ /dev/null @@ -1,121 +0,0 @@ -name = 'property-write'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName(): ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - - $type = (string) $this->type; - - return $type - . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') - . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php deleted file mode 100644 index 532003dd..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php +++ /dev/null @@ -1,38 +0,0 @@ -fqsen = $fqsen; - } - - /** - * @return string string representation of the referenced fqsen - */ - public function __toString(): string - { - return (string) $this->fqsen; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php deleted file mode 100644 index e7dea868..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php +++ /dev/null @@ -1,22 +0,0 @@ -uri = $uri; - } - - public function __toString(): string - { - return $this->uri; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php deleted file mode 100644 index f021b609..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php +++ /dev/null @@ -1,64 +0,0 @@ -name = 'return'; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$type, $description] = self::extractTypeFromBody($body); - - $type = $typeResolver->resolve($type, $context); - $description = $descriptionFactory->create($description, $context); - - return new static($type, $description); - } - - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $type = $this->type ? '' . $this->type : 'mixed'; - - return $type . ($description !== '' ? ' ' . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php deleted file mode 100644 index a194c7de..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php +++ /dev/null @@ -1,106 +0,0 @@ -refers = $refers; - $this->description = $description; - } - - public static function create( - string $body, - ?FqsenResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::notNull($descriptionFactory); - - $parts = Utils::pregSplit('/\s+/Su', $body, 2); - $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; - - // https://tools.ietf.org/html/rfc2396#section-3 - if (preg_match('#\w://\w#', $parts[0])) { - return new static(new Url($parts[0]), $description); - } - - return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description); - } - - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context): Fqsen - { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; - } - - return new Fqsen($resolved . '::' . $fqsenParts[1]); - } - - /** - * Returns the ref of this tag. - */ - public function getReference(): Reference - { - return $this->refers; - } - - /** - * Returns a string representation of this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $refers = (string) $this->refers; - - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php deleted file mode 100644 index 54af43cd..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php +++ /dev/null @@ -1,103 +0,0 @@ -version = $version; - $this->description = $description; - } - - public static function create( - ?string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): ?self { - if (empty($body)) { - return new static(); - } - - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { - return null; - } - - Assert::notNull($descriptionFactory); - - return new static( - $matches[1], - $descriptionFactory->create($matches[2] ?? '', $context) - ); - } - - /** - * Gets the version section of the tag. - */ - public function getVersion(): ?string - { - return $this->version; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $version = (string) $this->version; - - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php deleted file mode 100644 index 8b8c0fb4..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php +++ /dev/null @@ -1,116 +0,0 @@ -startingLine = (int) $startingLine; - $this->lineCount = $lineCount !== null ? (int) $lineCount : null; - $this->description = $description; - } - - public static function create( - string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::stringNotEmpty($body); - Assert::notNull($descriptionFactory); - - $startingLine = 1; - $lineCount = null; - $description = null; - - // Starting line / Number of lines / Description - if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $body, $matches)) { - $startingLine = (int) $matches[1]; - if (isset($matches[2]) && $matches[2] !== '') { - $lineCount = (int) $matches[2]; - } - - $description = $matches[3]; - } - - return new static($startingLine, $lineCount, $descriptionFactory->create($description ?? '', $context)); - } - - /** - * Gets the starting line. - * - * @return int The starting line, relative to the structural element's - * location. - */ - public function getStartingLine(): int - { - return $this->startingLine; - } - - /** - * Returns the number of lines. - * - * @return int|null The number of lines, relative to the starting line. NULL - * means "to the end". - */ - public function getLineCount(): ?int - { - return $this->lineCount; - } - - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $startingLine = (string) $this->startingLine; - - $lineCount = $this->lineCount !== null ? ' ' . $this->lineCount : ''; - - return $startingLine - . $lineCount - . ($description !== '' - ? ' ' . $description - : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php deleted file mode 100644 index 158578bd..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php +++ /dev/null @@ -1,66 +0,0 @@ -type; - } - - /** - * @return string[] - */ - protected static function extractTypeFromBody(string $body): array - { - $type = ''; - $nestingLevel = 0; - for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { - $character = $body[$i]; - - if ($nestingLevel === 0 && trim($character) === '') { - break; - } - - $type .= $character; - if (in_array($character, ['<', '(', '[', '{'])) { - $nestingLevel++; - continue; - } - - if (in_array($character, ['>', ')', ']', '}'])) { - $nestingLevel--; - continue; - } - } - - $description = trim(substr($body, strlen($type))); - - return [$type, $description]; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php deleted file mode 100644 index f21c9101..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php +++ /dev/null @@ -1,64 +0,0 @@ -name = 'throws'; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$type, $description] = self::extractTypeFromBody($body); - - $type = $typeResolver->resolve($type, $context); - $description = $descriptionFactory->create($description, $context); - - return new static($type, $description); - } - - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $type = (string) $this->type; - - return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php deleted file mode 100644 index b72f4034..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php +++ /dev/null @@ -1,100 +0,0 @@ -refers = $refers; - $this->description = $description; - } - - public static function create( - string $body, - ?FqsenResolver $resolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::notNull($resolver); - Assert::notNull($descriptionFactory); - - $parts = Utils::pregSplit('/\s+/Su', $body, 2); - - return new static( - self::resolveFqsen($parts[0], $resolver, $context), - $descriptionFactory->create($parts[1] ?? '', $context) - ); - } - - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context): Fqsen - { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; - } - - return new Fqsen($resolved . '::' . $fqsenParts[1]); - } - - /** - * Returns the structural element this tag refers to. - */ - public function getReference(): Fqsen - { - return $this->refers; - } - - /** - * Returns a string representation of this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $refers = (string) $this->refers; - - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php deleted file mode 100644 index fa1f9dbf..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php +++ /dev/null @@ -1,122 +0,0 @@ -name = 'var'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - - $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $type = null; - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName(): ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - - $type = (string) $this->type; - - return $type - . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') - . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php deleted file mode 100644 index f46e4b8c..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php +++ /dev/null @@ -1,106 +0,0 @@ -version = $version; - $this->description = $description; - } - - public static function create( - ?string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ): ?self { - if (empty($body)) { - return new static(); - } - - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { - return null; - } - - $description = null; - if ($descriptionFactory !== null) { - $description = $descriptionFactory->create($matches[2] ?? '', $context); - } - - return new static( - $matches[1], - $description - ); - } - - /** - * Gets the version section of the tag. - */ - public function getVersion(): ?string - { - return $this->version; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString(): string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $version = (string) $this->version; - - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php deleted file mode 100644 index 37f72dd2..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php +++ /dev/null @@ -1,287 +0,0 @@ -descriptionFactory = $descriptionFactory; - $this->tagFactory = $tagFactory; - } - - /** - * Factory method for easy instantiation. - * - * @param array> $additionalTags - */ - public static function createInstance(array $additionalTags = []): self - { - $fqsenResolver = new FqsenResolver(); - $tagFactory = new StandardTagFactory($fqsenResolver); - $descriptionFactory = new DescriptionFactory($tagFactory); - - $tagFactory->addService($descriptionFactory); - $tagFactory->addService(new TypeResolver($fqsenResolver)); - - $docBlockFactory = new self($descriptionFactory, $tagFactory); - foreach ($additionalTags as $tagName => $tagHandler) { - $docBlockFactory->registerTagHandler($tagName, $tagHandler); - } - - return $docBlockFactory; - } - - /** - * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the - * getDocComment method (such as a ReflectionClass object). - */ - public function create($docblock, ?Types\Context $context = null, ?Location $location = null): DocBlock - { - if (is_object($docblock)) { - if (!method_exists($docblock, 'getDocComment')) { - $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; - - throw new InvalidArgumentException($exceptionMessage); - } - - $docblock = $docblock->getDocComment(); - Assert::string($docblock); - } - - Assert::stringNotEmpty($docblock); - - if ($context === null) { - $context = new Types\Context(''); - } - - $parts = $this->splitDocBlock($this->stripDocComment($docblock)); - - [$templateMarker, $summary, $description, $tags] = $parts; - - return new DocBlock( - $summary, - $description ? $this->descriptionFactory->create($description, $context) : null, - $this->parseTagBlock($tags, $context), - $context, - $location, - $templateMarker === '#@+', - $templateMarker === '#@-' - ); - } - - /** - * @param class-string $handler - */ - public function registerTagHandler(string $tagName, string $handler): void - { - $this->tagFactory->registerTagHandler($tagName, $handler); - } - - /** - * Strips the asterisks from the DocBlock comment. - * - * @param string $comment String containing the comment text. - */ - private function stripDocComment(string $comment): string - { - $comment = preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]?(.*)?#u', '$1', $comment); - Assert::string($comment); - $comment = trim($comment); - - // reg ex above is not able to remove */ from a single line docblock - if (substr($comment, -2) === '*/') { - $comment = trim(substr($comment, 0, -2)); - } - - return str_replace(["\r\n", "\r"], "\n", $comment); - } - - // phpcs:disable - /** - * Splits the DocBlock into a template marker, summary, description and block of tags. - * - * @param string $comment Comment to split into the sub-parts. - * - * @return string[] containing the template marker (if any), summary, description and a string containing the tags. - * - * @author Mike van Riel for extending the regex with template marker support. - * - * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. - */ - private function splitDocBlock(string $comment) : array - { - // phpcs:enable - // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This - // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the - // performance impact of running a regular expression - if (strpos($comment, '@') === 0) { - return ['', '', '', $comment]; - } - - // clears all extra horizontal whitespace from the line endings to prevent parsing issues - $comment = preg_replace('/\h*$/Sum', '', $comment); - Assert::string($comment); - /* - * Splits the docblock into a template marker, summary, description and tags section. - * - * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may - * occur after it and will be stripped). - * - The short description is started from the first character until a dot is encountered followed by a - * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing - * errors). This is optional. - * - The long description, any character until a new line is encountered followed by an @ and word - * characters (a tag). This is optional. - * - Tags; the remaining characters - * - * Big thanks to RichardJ for contributing this Regular Expression - */ - preg_match( - '/ - \A - # 1. Extract the template marker - (?:(\#\@\+|\#\@\-)\n?)? - - # 2. Extract the summary - (?: - (?! @\pL ) # The summary may not start with an @ - ( - [^\n.]+ - (?: - (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines - [\n.]* (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line - [^\n.]+ # Include anything else - )* - \.? - )? - ) - - # 3. Extract the description - (?: - \s* # Some form of whitespace _must_ precede a description because a summary must be there - (?! @\pL ) # The description may not start with an @ - ( - [^\n]+ - (?: \n+ - (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line - [^\n]+ # Include anything else - )* - ) - )? - - # 4. Extract the tags (anything that follows) - (\s+ [\s\S]*)? # everything that follows - /ux', - $comment, - $matches - ); - array_shift($matches); - - while (count($matches) < 4) { - $matches[] = ''; - } - - return $matches; - } - - /** - * Creates the tag objects. - * - * @param string $tags Tag block to parse. - * @param Types\Context $context Context of the parsed Tag - * - * @return DocBlock\Tag[] - */ - private function parseTagBlock(string $tags, Types\Context $context): array - { - $tags = $this->filterTagBlock($tags); - if ($tags === null) { - return []; - } - - $result = []; - $lines = $this->splitTagBlockIntoTagLines($tags); - foreach ($lines as $key => $tagLine) { - $result[$key] = $this->tagFactory->create(trim($tagLine), $context); - } - - return $result; - } - - /** - * @return string[] - */ - private function splitTagBlockIntoTagLines(string $tags): array - { - $result = []; - foreach (explode("\n", $tags) as $tagLine) { - if ($tagLine !== '' && strpos($tagLine, '@') === 0) { - $result[] = $tagLine; - } else { - $result[count($result) - 1] .= "\n" . $tagLine; - } - } - - return $result; - } - - private function filterTagBlock(string $tags): ?string - { - $tags = trim($tags); - if (!$tags) { - return null; - } - - if ($tags[0] !== '@') { - // @codeCoverageIgnoreStart - // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that - // we didn't foresee. - - throw new LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); - - // @codeCoverageIgnoreEnd - } - - return $tags; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php deleted file mode 100644 index 9995c0c0..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -> $additionalTags - */ - public static function createInstance(array $additionalTags = []): DocBlockFactory; - - /** - * @param string|object $docblock - */ - public function create($docblock, ?Types\Context $context = null, ?Location $location = null): DocBlock; -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php b/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php deleted file mode 100644 index b8b6da8c..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php +++ /dev/null @@ -1,44 +0,0 @@ - please note that if you want to pass partial class names that additional steps are necessary, see the - > chapter `Resolving partial classes and FQSENs` for more information. - -Where the FqsenResolver can resolve: - -- Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`) -- Function expressions (i.e. `@see \MyNamespace\myFunction()`) -- Class expressions (i.e. `@see \MyNamespace\MyClass`) -- Interface expressions (i.e. `@see \MyNamespace\MyInterface`) -- Trait expressions (i.e. `@see \MyNamespace\MyTrait`) -- Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`) -- Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`) -- Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`) - -## Resolving a type - -In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` and call its `resolve` method like this: - -```php -$typeResolver = new \phpDocumentor\Reflection\TypeResolver(); -$type = $typeResolver->resolve('string|integer'); -``` - -In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two -elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type -`\phpDocumentor\Reflection\Types\Integer`. - -The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. - -### Resolving nullable types - -Php 7.1 introduced nullable types e.g. `?string`. Type resolver will resolve the original type without the nullable notation `?` -just like it would do without the `?`. After that the type is wrapped in a `\phpDocumentor\Reflection\Types\Nullable` object. -The `Nullable` type has a method to fetch the actual type. - -## Resolving an FQSEN - -A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: - -```php -$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); -$fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()'); -``` - -In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. - -The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. - -## Resolving partial Classes and Structural Element Names - -Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class names. - -For example, you have this file: - -```php -namespace My\Example; - -use phpDocumentor\Reflection\Types; - -class Classy -{ - /** - * @var Types\Context - * @see Classy::otherFunction() - */ - public function __construct($context) {} - - public function otherFunction(){} -} -``` - -Suppose that you would want to resolve (and expand) the type in the `@var` tag and the element name in the `@see` tag. - -For the resolvers to know how to expand partial names you have to provide a bit of _Context_ for them by instantiating a new class named `\phpDocumentor\Reflection\Types\Context` with the name of the namespace and the aliases that are in play. - -### Creating a Context - -You can do this by manually creating a Context like this: - -```php -$context = new \phpDocumentor\Reflection\Types\Context( - '\My\Example', - [ 'Types' => '\phpDocumentor\Reflection\Types'] -); -``` - -Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector object or by providing the namespace that you'd like to extract and the source code of the file in which the given type expression occurs. - -```php -$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); -$context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct')); -``` - -or - -```php -$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); -$context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php')); -``` - -### Using the Context - -After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver class as second argument and the Resolvers will take this into account when resolving partial names. - -To obtain the resolved class name for the `@var` tag in the example above you can do: - -```php -$typeResolver = new \phpDocumentor\Reflection\TypeResolver(); -$type = $typeResolver->resolve('Types\Context', $context); -``` - -When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be `phpDocumentor\Reflection\Types\Context`. - -> Why is the FQSEN wrapped in another object `Object_`? -> -> The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. - -Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To resolve that you can do the following: - -```php -$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); -$type = $fqsenResolver->resolve('Classy::otherFunction()', $context); -``` - -Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the `resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to `\My\Example\Classy::otherFunction()`. diff --git a/vendor/phpdocumentor/type-resolver/composer.json b/vendor/phpdocumentor/type-resolver/composer.json deleted file mode 100644 index 4dbf6237..00000000 --- a/vendor/phpdocumentor/type-resolver/composer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "phpdocumentor/type-resolver", - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "phpDocumentor\\Reflection\\": ["tests/unit", "tests/benchmark"] - } - }, - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php b/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php deleted file mode 100644 index 068fa208..00000000 --- a/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php +++ /dev/null @@ -1,80 +0,0 @@ -isFqsen($fqsen)) { - return new Fqsen($fqsen); - } - - return $this->resolvePartialStructuralElementName($fqsen, $context); - } - - /** - * Tests whether the given type is a Fully Qualified Structural Element Name. - */ - private function isFqsen(string $type): bool - { - return strpos($type, self::OPERATOR_NAMESPACE) === 0; - } - - /** - * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation - * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. - * - * @throws InvalidArgumentException When type is not a valid FQSEN. - */ - private function resolvePartialStructuralElementName(string $type, Context $context): Fqsen - { - $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); - - $namespaceAliases = $context->getNamespaceAliases(); - - // if the first segment is not an alias; prepend namespace name and return - if (!isset($namespaceAliases[$typeParts[0]])) { - $namespace = $context->getNamespace(); - if ($namespace !== '') { - $namespace .= self::OPERATOR_NAMESPACE; - } - - return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); - } - - $typeParts[0] = $namespaceAliases[$typeParts[0]]; - - return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoType.php b/vendor/phpdocumentor/type-resolver/src/PseudoType.php deleted file mode 100644 index dd91ed79..00000000 --- a/vendor/phpdocumentor/type-resolver/src/PseudoType.php +++ /dev/null @@ -1,19 +0,0 @@ -minValue = $minValue; - $this->maxValue = $maxValue; - } - - public function underlyingType(): Type - { - return new Integer(); - } - - public function getMinValue(): string - { - return $this->minValue; - } - - public function getMaxValue(): string - { - return $this->maxValue; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString(): string - { - return 'int<' . $this->minValue . ', ' . $this->maxValue . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.php deleted file mode 100644 index f9f0c6b5..00000000 --- a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.php +++ /dev/null @@ -1,50 +0,0 @@ -valueType instanceof Mixed_) { - return 'list'; - } - - return 'list<' . $this->valueType . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php deleted file mode 100644 index 690f782b..00000000 --- a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php +++ /dev/null @@ -1,39 +0,0 @@ - List of recognized keywords and unto which Value Object they map - * @psalm-var array> - */ - private $keywords = [ - 'string' => Types\String_::class, - 'class-string' => Types\ClassString::class, - 'interface-string' => Types\InterfaceString::class, - 'html-escaped-string' => PseudoTypes\HtmlEscapedString::class, - 'lowercase-string' => PseudoTypes\LowercaseString::class, - 'non-empty-lowercase-string' => PseudoTypes\NonEmptyLowercaseString::class, - 'non-empty-string' => PseudoTypes\NonEmptyString::class, - 'numeric-string' => PseudoTypes\NumericString::class, - 'numeric' => PseudoTypes\Numeric_::class, - 'trait-string' => PseudoTypes\TraitString::class, - 'int' => Types\Integer::class, - 'integer' => Types\Integer::class, - 'positive-int' => PseudoTypes\PositiveInteger::class, - 'negative-int' => PseudoTypes\NegativeInteger::class, - 'bool' => Types\Boolean::class, - 'boolean' => Types\Boolean::class, - 'real' => Types\Float_::class, - 'float' => Types\Float_::class, - 'double' => Types\Float_::class, - 'object' => Types\Object_::class, - 'mixed' => Types\Mixed_::class, - 'array' => Types\Array_::class, - 'array-key' => Types\ArrayKey::class, - 'resource' => Types\Resource_::class, - 'void' => Types\Void_::class, - 'null' => Types\Null_::class, - 'scalar' => Types\Scalar::class, - 'callback' => Types\Callable_::class, - 'callable' => Types\Callable_::class, - 'callable-string' => PseudoTypes\CallableString::class, - 'false' => PseudoTypes\False_::class, - 'true' => PseudoTypes\True_::class, - 'literal-string' => PseudoTypes\LiteralString::class, - 'self' => Types\Self_::class, - '$this' => Types\This::class, - 'static' => Types\Static_::class, - 'parent' => Types\Parent_::class, - 'iterable' => Types\Iterable_::class, - 'never' => Types\Never_::class, - 'list' => PseudoTypes\List_::class, - ]; - - /** - * @var FqsenResolver - * @psalm-readonly - */ - private $fqsenResolver; - - /** - * Initializes this TypeResolver with the means to create and resolve Fqsen objects. - */ - public function __construct(?FqsenResolver $fqsenResolver = null) - { - $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); - } - - /** - * Analyzes the given type and returns the FQCN variant. - * - * When a type is provided this method checks whether it is not a keyword or - * Fully Qualified Class Name. If so it will use the given namespace and - * aliases to expand the type to a FQCN representation. - * - * This method only works as expected if the namespace and aliases are set; - * no dynamic reflection is being performed here. - * - * @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. - */ - public function resolve(string $type, ?Context $context = null): Type - { - $type = trim($type); - if (!$type) { - throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); - } - - if ($context === null) { - $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 - ); - - if ($tokens === false) { - throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); - } - - /** @var ArrayIterator $tokenIterator */ - $tokenIterator = new ArrayIterator($tokens); - - return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); - } - - /** - * 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 - { - $types = []; - $token = ''; - $compoundToken = '|'; - while ($tokens->valid()) { - $token = $tokens->current(); - if ($token === null) { - throw new RuntimeException( - 'Unexpected nullable character' - ); - } - - if ($token === '|' || $token === '&') { - if (count($types) === 0) { - throw new RuntimeException( - 'A type is missing before a type separator' - ); - } - - if ( - !in_array($parserContext, [ - self::PARSER_IN_COMPOUND, - self::PARSER_IN_ARRAY_EXPRESSION, - self::PARSER_IN_COLLECTION_EXPRESSION, - ], true) - ) { - throw new RuntimeException( - 'Unexpected type separator' - ); - } - - $compoundToken = $token; - $tokens->next(); - } elseif ($token === '?') { - if ( - !in_array($parserContext, [ - self::PARSER_IN_COMPOUND, - self::PARSER_IN_ARRAY_EXPRESSION, - self::PARSER_IN_COLLECTION_EXPRESSION, - ], true) - ) { - throw new RuntimeException( - 'Unexpected nullable character' - ); - } - - $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); - - $token = $tokens->current(); - if ($token === null) { // Someone did not properly close their array expression .. - break; - } - - $tokens->next(); - - $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) { - end($types); - $last = key($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 { - $type = $this->resolveSingleType($token, $context); - $tokens->next(); - if ($parserContext === self::PARSER_IN_NULLABLE) { - return $type; - } - - $types[] = $type; - } - } - - 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' - ); - } - - 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); - } - - if ($compoundToken === '|') { - return new Compound(array_values($types)); - } - - return new Intersection(array_values($types)); - } - - /** - * resolve the given type into a type object - * - * @param string $type the type string, representing a single type - * - * @return Type|Array_|Object_ - * - * @psalm-mutation-free - */ - private function resolveSingleType(string $type, Context $context): object - { - switch (true) { - case $this->isKeyword($type): - return $this->resolveKeyword($type); - - case $this->isFqsen($type): - return $this->resolveTypedObject($type); - - case $this->isPartialStructuralElementName($type): - return $this->resolveTypedObject($type, $context); - - // @codeCoverageIgnoreStart - default: - // I haven't got the foggiest how the logic would come here but added this as a defense. - throw new RuntimeException( - 'Unable to resolve type "' . $type . '", there is no known method to resolve it' - ); - } - - // @codeCoverageIgnoreEnd - } - - /** - * Adds a keyword to the list of Keywords and associates it with a specific Value Object. - * - * @psalm-param class-string $typeClassName - */ - public function addKeyword(string $keyword, string $typeClassName): void - { - if (!class_exists($typeClassName)) { - throw new InvalidArgumentException( - 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' - . ' but we could not find the class ' . $typeClassName - ); - } - - $interfaces = class_implements($typeClassName); - if ($interfaces === false) { - throw new InvalidArgumentException( - 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' - . ' but we could not find the class ' . $typeClassName - ); - } - - if (!in_array(Type::class, $interfaces, true)) { - throw new InvalidArgumentException( - 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"' - ); - } - - $this->keywords[$keyword] = $typeClassName; - } - - /** - * Detects whether the given type represents a PHPDoc keyword. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @psalm-mutation-free - */ - private function isKeyword(string $type): bool - { - return array_key_exists(strtolower($type), $this->keywords); - } - - /** - * Detects whether the given type represents a relative structural element name. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @psalm-mutation-free - */ - private function isPartialStructuralElementName(string $type): bool - { - return (isset($type[0]) && $type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type); - } - - /** - * Tests whether the given type is a Fully Qualified Structural Element Name. - * - * @psalm-mutation-free - */ - private function isFqsen(string $type): bool - { - return strpos($type, self::OPERATOR_NAMESPACE) === 0; - } - - /** - * Resolves the given keyword (such as `string`) into a Type object representing that keyword. - * - * @psalm-mutation-free - */ - private function resolveKeyword(string $type): Type - { - $className = $this->keywords[strtolower($type)]; - - return new $className(); - } - - /** - * Resolves the given FQSEN string into an FQSEN object. - * - * @psalm-mutation-free - */ - private function resolveTypedObject(string $type, ?Context $context = null): Object_ - { - return new Object_($this->fqsenResolver->resolve($type, $context)); - } - - /** - * Resolves class string - * - * @param ArrayIterator $tokens - */ - private function resolveClassString(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 class string' - ); - } - - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException( - 'class-string: ">" is missing' - ); - } - - throw new RuntimeException( - 'Unexpected character "' . $token . '", ">" is missing' - ); - } - - return new ClassString($classType->getFqsen()); - } - - /** - * Resolves integer ranges - * - * @param ArrayIterator $tokens - */ - private function resolveIntRange(ArrayIterator $tokens): 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) - ) { - throw new RuntimeException( - $classType . ' is not a collection' - ); - } - - $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' - ); - } - } - } - } - - $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' - ); - } - - 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); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php b/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php deleted file mode 100644 index b674862a..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php +++ /dev/null @@ -1,83 +0,0 @@ -valueType = $valueType; - $this->defaultKeyType = new Compound([new String_(), new Integer()]); - $this->keyType = $keyType; - } - - /** - * Returns the type for the keys of this array. - */ - public function getKeyType(): Type - { - return $this->keyType ?? $this->defaultKeyType; - } - - /** - * Returns the value for the keys of this array. - */ - public function getValueType(): Type - { - return $this->valueType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString(): string - { - if ($this->keyType) { - return 'array<' . $this->keyType . ',' . $this->valueType . '>'; - } - - if ($this->valueType instanceof Mixed_) { - return 'array'; - } - - if ($this->valueType instanceof Compound) { - return '(' . $this->valueType . ')[]'; - } - - return $this->valueType . '[]'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php b/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php deleted file mode 100644 index 472a1cdc..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php +++ /dev/null @@ -1,125 +0,0 @@ - - */ -abstract class AggregatedType implements Type, IteratorAggregate -{ - /** - * @psalm-allow-private-mutation - * @var array - */ - private $types = []; - - /** @var string */ - private $token; - - /** - * @param array $types - */ - public function __construct(array $types, string $token) - { - foreach ($types as $type) { - $this->add($type); - } - - $this->token = $token; - } - - /** - * Returns the type at the given index. - */ - public function get(int $index): ?Type - { - if (!$this->has($index)) { - return null; - } - - return $this->types[$index]; - } - - /** - * Tests if this compound type has a type with the given index. - */ - public function has(int $index): bool - { - return array_key_exists($index, $this->types); - } - - /** - * Tests if this compound type contains the given type. - */ - public function contains(Type $type): bool - { - foreach ($this->types as $typePart) { - // if the type is duplicate; do not add it - if ((string) $typePart === (string) $type) { - return true; - } - } - - return false; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString(): string - { - return implode($this->token, $this->types); - } - - /** - * @return ArrayIterator - */ - public function getIterator(): ArrayIterator - { - return new ArrayIterator($this->types); - } - - /** - * @psalm-suppress ImpureMethodCall - */ - private function add(Type $type): void - { - if ($type instanceof self) { - foreach ($type->getIterator() as $subType) { - $this->add($subType); - } - - return; - } - - // if the type is duplicate; do not add it - if ($this->contains($type)) { - return; - } - - $this->types[] = $type; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.php b/vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.php deleted file mode 100644 index cf86df00..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.php +++ /dev/null @@ -1,42 +0,0 @@ -fqsen = $fqsen; - } - - public function underlyingType(): Type - { - return new String_(); - } - - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen(): ?Fqsen - { - return $this->fqsen; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString(): string - { - if ($this->fqsen === null) { - return 'class-string'; - } - - return 'class-string<' . (string) $this->fqsen . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Collection.php b/vendor/phpdocumentor/type-resolver/src/Types/Collection.php deleted file mode 100644 index 943cc22e..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Collection.php +++ /dev/null @@ -1,68 +0,0 @@ -` - * 2. `ACollectionObject` - * - * - ACollectionObject can be 'array' or an object that can act as an array - * - aValueType and aKeyType can be any type expression - * - * @psalm-immutable - */ -final class Collection extends AbstractList -{ - /** @var Fqsen|null */ - private $fqsen; - - /** - * Initializes this representation of an array with the given Type or Fqsen. - */ - public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) - { - parent::__construct($valueType, $keyType); - - $this->fqsen = $fqsen; - } - - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen(): ?Fqsen - { - return $this->fqsen; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString(): string - { - $objectType = (string) ($this->fqsen ?? 'object'); - - if ($this->keyType === null) { - return $objectType . '<' . $this->valueType . '>'; - } - - return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php deleted file mode 100644 index ad426cc2..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php +++ /dev/null @@ -1,38 +0,0 @@ - $types - */ - public function __construct(array $types) - { - parent::__construct($types, '|'); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Context.php b/vendor/phpdocumentor/type-resolver/src/Types/Context.php deleted file mode 100644 index 79aadaf8..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Context.php +++ /dev/null @@ -1,95 +0,0 @@ - Fully Qualified Namespace. - * @psalm-var array - */ - private $namespaceAliases; - - /** - * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) - * format (without a preceding `\`). - * - * @param string $namespace The namespace where this DocBlock resides in. - * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. - * @psalm-param array $namespaceAliases - */ - public function __construct(string $namespace, array $namespaceAliases = []) - { - $this->namespace = $namespace !== 'global' && $namespace !== 'default' - ? trim($namespace, '\\') - : ''; - - foreach ($namespaceAliases as $alias => $fqnn) { - if ($fqnn[0] === '\\') { - $fqnn = substr($fqnn, 1); - } - - if ($fqnn[strlen($fqnn) - 1] === '\\') { - $fqnn = substr($fqnn, 0, -1); - } - - $namespaceAliases[$alias] = $fqnn; - } - - $this->namespaceAliases = $namespaceAliases; - } - - /** - * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. - */ - public function getNamespace(): string - { - return $this->namespace; - } - - /** - * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent - * the alias for the imported Namespace. - * - * @return string[] - * @psalm-return array - */ - public function getNamespaceAliases(): array - { - return $this->namespaceAliases; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php b/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php deleted file mode 100644 index 892ee0f9..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php +++ /dev/null @@ -1,420 +0,0 @@ - $reflector */ - - return $this->createFromReflectionClass($reflector); - } - - if ($reflector instanceof ReflectionParameter) { - return $this->createFromReflectionParameter($reflector); - } - - if ($reflector instanceof ReflectionMethod) { - return $this->createFromReflectionMethod($reflector); - } - - if ($reflector instanceof ReflectionProperty) { - return $this->createFromReflectionProperty($reflector); - } - - if ($reflector instanceof ReflectionClassConstant) { - return $this->createFromReflectionClassConstant($reflector); - } - - throw new UnexpectedValueException('Unhandled \Reflector instance given: ' . get_class($reflector)); - } - - private function createFromReflectionParameter(ReflectionParameter $parameter): Context - { - $class = $parameter->getDeclaringClass(); - if (!$class) { - throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); - } - - return $this->createFromReflectionClass($class); - } - - private function createFromReflectionMethod(ReflectionMethod $method): Context - { - $class = $method->getDeclaringClass(); - - return $this->createFromReflectionClass($class); - } - - private function createFromReflectionProperty(ReflectionProperty $property): Context - { - $class = $property->getDeclaringClass(); - - return $this->createFromReflectionClass($class); - } - - private function createFromReflectionClassConstant(ReflectionClassConstant $constant): Context - { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @phpstan-var ReflectionClass $class */ - $class = $constant->getDeclaringClass(); - - return $this->createFromReflectionClass($class); - } - - /** - * @phpstan-param ReflectionClass $class - */ - private function createFromReflectionClass(ReflectionClass $class): Context - { - $fileName = $class->getFileName(); - $namespace = $class->getNamespaceName(); - - if (is_string($fileName) && file_exists($fileName)) { - $contents = file_get_contents($fileName); - if ($contents === false) { - throw new RuntimeException('Unable to read file "' . $fileName . '"'); - } - - return $this->createForNamespace($namespace, $contents); - } - - return new Context($namespace, []); - } - - /** - * Build a Context for a namespace in the provided file contents. - * - * @see Context for more information on Contexts. - * - * @param string $namespace It does not matter if a `\` precedes the namespace name, - * this method first normalizes. - * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. - */ - public function createForNamespace(string $namespace, string $fileContents): Context - { - $namespace = trim($namespace, '\\'); - $useStatements = []; - $currentNamespace = ''; - $tokens = new ArrayIterator(token_get_all($fileContents)); - - while ($tokens->valid()) { - $currentToken = $tokens->current(); - switch ($currentToken[0]) { - case T_NAMESPACE: - $currentNamespace = $this->parseNamespace($tokens); - break; - case T_CLASS: - // Fast-forward the iterator through the class so that any - // T_USE tokens found within are skipped - these are not - // valid namespace use statements so should be ignored. - $braceLevel = 0; - $firstBraceFound = false; - while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { - $currentToken = $tokens->current(); - if ( - $currentToken === '{' - || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], true) - ) { - if (!$firstBraceFound) { - $firstBraceFound = true; - } - - ++$braceLevel; - } - - if ($currentToken === '}') { - --$braceLevel; - } - - $tokens->next(); - } - - break; - case T_USE: - if ($currentNamespace === $namespace) { - $useStatements += $this->parseUseStatement($tokens); - } - - break; - } - - $tokens->next(); - } - - return new Context($namespace, $useStatements); - } - - /** - * Deduce the name from tokens when we are at the T_NAMESPACE token. - * - * @param ArrayIterator $tokens - */ - private function parseNamespace(ArrayIterator $tokens): string - { - // skip to the first string or namespace separator - $this->skipToNextStringOrNamespaceSeparator($tokens); - - $name = ''; - $acceptedTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED]; - while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, true)) { - $name .= $tokens->current()[1]; - $tokens->next(); - } - - return $name; - } - - /** - * Deduce the names of all imports when we are at the T_USE token. - * - * @param ArrayIterator $tokens - * - * @return string[] - * @psalm-return array - */ - private function parseUseStatement(ArrayIterator $tokens): array - { - $uses = []; - - while ($tokens->valid()) { - $this->skipToNextStringOrNamespaceSeparator($tokens); - - $uses += $this->extractUseStatements($tokens); - $currentToken = $tokens->current(); - if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { - return $uses; - } - } - - return $uses; - } - - /** - * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. - * - * @param ArrayIterator $tokens - */ - private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens): void - { - while ($tokens->valid()) { - $currentToken = $tokens->current(); - if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], true)) { - break; - } - - if ($currentToken[0] === T_NAME_QUALIFIED) { - break; - } - - if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === T_NAME_FULLY_QUALIFIED) { - break; - } - - $tokens->next(); - } - } - - /** - * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of - * a USE statement yet. This will return a key/value array of the alias => namespace. - * - * @param ArrayIterator $tokens - * - * @return string[] - * @psalm-return array - * - * @psalm-suppress TypeDoesNotContainType - */ - private function extractUseStatements(ArrayIterator $tokens): array - { - $extractedUseStatements = []; - $groupedNs = ''; - $currentNs = ''; - $currentAlias = ''; - $state = 'start'; - - while ($tokens->valid()) { - $currentToken = $tokens->current(); - $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; - $tokenValue = is_string($currentToken) ? null : $currentToken[1]; - switch ($state) { - case 'start': - switch ($tokenId) { - case T_STRING: - case T_NS_SEPARATOR: - $currentNs .= (string) $tokenValue; - $currentAlias = $tokenValue; - break; - case T_NAME_QUALIFIED: - case T_NAME_FULLY_QUALIFIED: - $currentNs .= (string) $tokenValue; - $currentAlias = substr( - (string) $tokenValue, - (int) (strrpos((string) $tokenValue, '\\')) + 1 - ); - break; - case T_CURLY_OPEN: - case '{': - $state = 'grouped'; - $groupedNs = $currentNs; - break; - case T_AS: - $state = 'start-alias'; - break; - case self::T_LITERAL_USE_SEPARATOR: - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - - break; - case 'start-alias': - switch ($tokenId) { - case T_STRING: - $currentAlias = $tokenValue; - break; - case self::T_LITERAL_USE_SEPARATOR: - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - - break; - case 'grouped': - switch ($tokenId) { - case T_STRING: - case T_NS_SEPARATOR: - $currentNs .= (string) $tokenValue; - $currentAlias = $tokenValue; - break; - case T_AS: - $state = 'grouped-alias'; - break; - case self::T_LITERAL_USE_SEPARATOR: - $state = 'grouped'; - $extractedUseStatements[(string) $currentAlias] = $currentNs; - $currentNs = $groupedNs; - $currentAlias = ''; - break; - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - - break; - case 'grouped-alias': - switch ($tokenId) { - case T_STRING: - $currentAlias = $tokenValue; - break; - case self::T_LITERAL_USE_SEPARATOR: - $state = 'grouped'; - $extractedUseStatements[(string) $currentAlias] = $currentNs; - $currentNs = $groupedNs; - $currentAlias = ''; - break; - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - } - - if ($state === 'end') { - break; - } - - $tokens->next(); - } - - if ($groupedNs !== $currentNs) { - $extractedUseStatements[(string) $currentAlias] = $currentNs; - } - - return $extractedUseStatements; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Expression.php b/vendor/phpdocumentor/type-resolver/src/Types/Expression.php deleted file mode 100644 index da5f65d5..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Expression.php +++ /dev/null @@ -1,51 +0,0 @@ -valueType = $valueType; - } - - /** - * Returns the value for the keys of this array. - */ - public function getValueType(): Type - { - return $this->valueType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString(): string - { - return '(' . $this->valueType . ')'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Float_.php b/vendor/phpdocumentor/type-resolver/src/Types/Float_.php deleted file mode 100644 index 86138c0e..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Float_.php +++ /dev/null @@ -1,32 +0,0 @@ -fqsen = $fqsen; - } - - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen(): ?Fqsen - { - return $this->fqsen; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString(): string - { - if ($this->fqsen === null) { - return 'interface-string'; - } - - return 'interface-string<' . (string) $this->fqsen . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php b/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php deleted file mode 100644 index ced37b62..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php +++ /dev/null @@ -1,37 +0,0 @@ - $types - */ - public function __construct(array $types) - { - parent::__construct($types, '&'); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php b/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php deleted file mode 100644 index 1ca069f2..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php +++ /dev/null @@ -1,38 +0,0 @@ -keyType) { - return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; - } - - if ($this->valueType instanceof Mixed_) { - return 'iterable'; - } - - return 'iterable<' . $this->valueType . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php b/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php deleted file mode 100644 index 56d1b6da..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php +++ /dev/null @@ -1,32 +0,0 @@ -realType = $realType; - } - - /** - * Provide access to the actual type directly, if needed. - */ - public function getActualType(): Type - { - return $this->realType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString(): string - { - return '?' . $this->realType->__toString(); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Object_.php b/vendor/phpdocumentor/type-resolver/src/Types/Object_.php deleted file mode 100644 index 90dee57a..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Object_.php +++ /dev/null @@ -1,69 +0,0 @@ -fqsen = $fqsen; - } - - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen(): ?Fqsen - { - return $this->fqsen; - } - - public function __toString(): string - { - if ($this->fqsen) { - return (string) $this->fqsen; - } - - return 'object'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php b/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php deleted file mode 100644 index 34838599..00000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php +++ /dev/null @@ -1,34 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function alert($message, array $context = array()) - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function critical($message, array $context = array()) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function error($message, array $context = array()) - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function warning($message, array $context = array()) - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function notice($message, array $context = array()) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function info($message, array $context = array()) - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function debug($message, array $context = array()) - { - $this->log(LogLevel::DEBUG, $message, $context); - } -} diff --git a/vendor/psr/log/Psr/Log/InvalidArgumentException.php b/vendor/psr/log/Psr/Log/InvalidArgumentException.php deleted file mode 100644 index 67f852d1..00000000 --- a/vendor/psr/log/Psr/Log/InvalidArgumentException.php +++ /dev/null @@ -1,7 +0,0 @@ -logger = $logger; - } -} diff --git a/vendor/psr/log/Psr/Log/LoggerInterface.php b/vendor/psr/log/Psr/Log/LoggerInterface.php deleted file mode 100644 index 2206cfde..00000000 --- a/vendor/psr/log/Psr/Log/LoggerInterface.php +++ /dev/null @@ -1,125 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function alert($message, array $context = array()) - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function critical($message, array $context = array()) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function error($message, array $context = array()) - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function warning($message, array $context = array()) - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function notice($message, array $context = array()) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function info($message, array $context = array()) - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function debug($message, array $context = array()) - { - $this->log(LogLevel::DEBUG, $message, $context); - } - - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * - * @return void - * - * @throws \Psr\Log\InvalidArgumentException - */ - abstract public function log($level, $message, array $context = array()); -} diff --git a/vendor/psr/log/Psr/Log/NullLogger.php b/vendor/psr/log/Psr/Log/NullLogger.php deleted file mode 100644 index c8f7293b..00000000 --- a/vendor/psr/log/Psr/Log/NullLogger.php +++ /dev/null @@ -1,30 +0,0 @@ -logger) { }` - * blocks. - */ -class NullLogger extends AbstractLogger -{ - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * - * @return void - * - * @throws \Psr\Log\InvalidArgumentException - */ - public function log($level, $message, array $context = array()) - { - // noop - } -} diff --git a/vendor/psr/log/Psr/Log/Test/DummyTest.php b/vendor/psr/log/Psr/Log/Test/DummyTest.php deleted file mode 100644 index 9638c110..00000000 --- a/vendor/psr/log/Psr/Log/Test/DummyTest.php +++ /dev/null @@ -1,18 +0,0 @@ - ". - * - * Example ->error('Foo') would yield "error Foo". - * - * @return string[] - */ - abstract public function getLogs(); - - public function testImplements() - { - $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger()); - } - - /** - * @dataProvider provideLevelsAndMessages - */ - public function testLogsAtAllLevels($level, $message) - { - $logger = $this->getLogger(); - $logger->{$level}($message, array('user' => 'Bob')); - $logger->log($level, $message, array('user' => 'Bob')); - - $expected = array( - $level.' message of level '.$level.' with context: Bob', - $level.' message of level '.$level.' with context: Bob', - ); - $this->assertEquals($expected, $this->getLogs()); - } - - public function provideLevelsAndMessages() - { - return array( - LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), - LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), - LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), - LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), - LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), - LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), - LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), - LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), - ); - } - - /** - * @expectedException \Psr\Log\InvalidArgumentException - */ - public function testThrowsOnInvalidLevel() - { - $logger = $this->getLogger(); - $logger->log('invalid level', 'Foo'); - } - - public function testContextReplacement() - { - $logger = $this->getLogger(); - $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); - - $expected = array('info {Message {nothing} Bob Bar a}'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testObjectCastToString() - { - if (method_exists($this, 'createPartialMock')) { - $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString')); - } else { - $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString')); - } - $dummy->expects($this->once()) - ->method('__toString') - ->will($this->returnValue('DUMMY')); - - $this->getLogger()->warning($dummy); - - $expected = array('warning DUMMY'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testContextCanContainAnything() - { - $closed = fopen('php://memory', 'r'); - fclose($closed); - - $context = array( - 'bool' => true, - 'null' => null, - 'string' => 'Foo', - 'int' => 0, - 'float' => 0.5, - 'nested' => array('with object' => new DummyTest), - 'object' => new \DateTime, - 'resource' => fopen('php://memory', 'r'), - 'closed' => $closed, - ); - - $this->getLogger()->warning('Crazy context data', $context); - - $expected = array('warning Crazy context data'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testContextExceptionKeyCanBeExceptionOrOtherValues() - { - $logger = $this->getLogger(); - $logger->warning('Random message', array('exception' => 'oops')); - $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); - - $expected = array( - 'warning Random message', - 'critical Uncaught Exception!' - ); - $this->assertEquals($expected, $this->getLogs()); - } -} diff --git a/vendor/psr/log/Psr/Log/Test/TestLogger.php b/vendor/psr/log/Psr/Log/Test/TestLogger.php deleted file mode 100644 index 1be32304..00000000 --- a/vendor/psr/log/Psr/Log/Test/TestLogger.php +++ /dev/null @@ -1,147 +0,0 @@ - $level, - 'message' => $message, - 'context' => $context, - ]; - - $this->recordsByLevel[$record['level']][] = $record; - $this->records[] = $record; - } - - public function hasRecords($level) - { - return isset($this->recordsByLevel[$level]); - } - - public function hasRecord($record, $level) - { - if (is_string($record)) { - $record = ['message' => $record]; - } - return $this->hasRecordThatPasses(function ($rec) use ($record) { - if ($rec['message'] !== $record['message']) { - return false; - } - if (isset($record['context']) && $rec['context'] !== $record['context']) { - return false; - } - return true; - }, $level); - } - - public function hasRecordThatContains($message, $level) - { - return $this->hasRecordThatPasses(function ($rec) use ($message) { - return strpos($rec['message'], $message) !== false; - }, $level); - } - - public function hasRecordThatMatches($regex, $level) - { - return $this->hasRecordThatPasses(function ($rec) use ($regex) { - return preg_match($regex, $rec['message']) > 0; - }, $level); - } - - public function hasRecordThatPasses(callable $predicate, $level) - { - if (!isset($this->recordsByLevel[$level])) { - return false; - } - foreach ($this->recordsByLevel[$level] as $i => $rec) { - if (call_user_func($predicate, $rec, $i)) { - return true; - } - } - return false; - } - - public function __call($method, $args) - { - if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { - $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; - $level = strtolower($matches[2]); - if (method_exists($this, $genericMethod)) { - $args[] = $level; - return call_user_func_array([$this, $genericMethod], $args); - } - } - throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); - } - - public function reset() - { - $this->records = []; - $this->recordsByLevel = []; - } -} diff --git a/vendor/psr/log/README.md b/vendor/psr/log/README.md deleted file mode 100644 index a9f20c43..00000000 --- a/vendor/psr/log/README.md +++ /dev/null @@ -1,58 +0,0 @@ -PSR Log -======= - -This repository holds all interfaces/classes/traits related to -[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md). - -Note that this is not a logger of its own. It is merely an interface that -describes a logger. See the specification for more details. - -Installation ------------- - -```bash -composer require psr/log -``` - -Usage ------ - -If you need a logger, you can use the interface like this: - -```php -logger = $logger; - } - - public function doSomething() - { - if ($this->logger) { - $this->logger->info('Doing work'); - } - - try { - $this->doSomethingElse(); - } catch (Exception $exception) { - $this->logger->error('Oh no!', array('exception' => $exception)); - } - - // do something useful - } -} -``` - -You can then pick one of the implementations of the interface to get a logger. - -If you want to implement the interface, you can require this package and -implement `Psr\Log\LoggerInterface` in your code. Please read the -[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) -for details. diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json deleted file mode 100644 index ca056953..00000000 --- a/vendor/psr/log/composer.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "psr/log", - "description": "Common interface for logging libraries", - "keywords": ["psr", "psr-3", "log"], - "homepage": "https://github.com/php-fig/log", - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "require": { - "php": ">=5.3.0" - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - } -} diff --git a/vendor/sebastian/diff/ChangeLog.md b/vendor/sebastian/diff/ChangeLog.md deleted file mode 100644 index 9bdcc5b6..00000000 --- a/vendor/sebastian/diff/ChangeLog.md +++ /dev/null @@ -1,88 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [4.0.4] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\Diff\Exception` now correctly extends `\Throwable` - -## [4.0.3] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [4.0.2] - 2020-06-30 - -### Added - -* This component is now supported on PHP 8 - -## [4.0.1] - 2020-05-08 - -### Fixed - -* [#99](https://github.com/sebastianbergmann/diff/pull/99): Regression in unified diff output of identical strings - -## [4.0.0] - 2020-02-07 - -### Removed - -* Removed support for PHP 7.1 and PHP 7.2 - -## [3.0.2] - 2019-02-04 - -### Changed - -* `Chunk::setLines()` now ensures that the `$lines` array only contains `Line` objects - -## [3.0.1] - 2018-06-10 - -### Fixed - -* Removed `"minimum-stability": "dev",` from `composer.json` - -## [3.0.0] - 2018-02-01 - -* The `StrictUnifiedDiffOutputBuilder` implementation of the `DiffOutputBuilderInterface` was added - -### Changed - -* The default `DiffOutputBuilderInterface` implementation now generates context lines (unchanged lines) - -### Removed - -* Removed support for PHP 7.0 - -### Fixed - -* [#70](https://github.com/sebastianbergmann/diff/issues/70): Diffing of arrays no longer works - -## [2.0.1] - 2017-08-03 - -### Fixed - -* [#66](https://github.com/sebastianbergmann/diff/pull/66): Restored backwards compatibility for PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 - -## [2.0.0] - 2017-07-11 [YANKED] - -### Added - -* [#64](https://github.com/sebastianbergmann/diff/pull/64): Show line numbers for chunks of a diff - -### Removed - -* This component is no longer supported on PHP 5.6 - -[4.0.4]: https://github.com/sebastianbergmann/diff/compare/4.0.3...4.0.4 -[4.0.3]: https://github.com/sebastianbergmann/diff/compare/4.0.2...4.0.3 -[4.0.2]: https://github.com/sebastianbergmann/diff/compare/4.0.1...4.0.2 -[4.0.1]: https://github.com/sebastianbergmann/diff/compare/4.0.0...4.0.1 -[4.0.0]: https://github.com/sebastianbergmann/diff/compare/3.0.2...4.0.0 -[3.0.2]: https://github.com/sebastianbergmann/diff/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/diff/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/diff/compare/2.0...3.0.0 -[2.0.1]: https://github.com/sebastianbergmann/diff/compare/c341c98ce083db77f896a0aa64f5ee7652915970...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/diff/compare/1.4...c341c98ce083db77f896a0aa64f5ee7652915970 diff --git a/vendor/sebastian/diff/LICENSE b/vendor/sebastian/diff/LICENSE deleted file mode 100644 index f22f31cf..00000000 --- a/vendor/sebastian/diff/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -sebastian/diff - -Copyright (c) 2002-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/diff/README.md b/vendor/sebastian/diff/README.md deleted file mode 100644 index 734b852d..00000000 --- a/vendor/sebastian/diff/README.md +++ /dev/null @@ -1,202 +0,0 @@ -# sebastian/diff - -[![CI Status](https://github.com/sebastianbergmann/diff/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/diff/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/diff/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/diff) - -Diff implementation for PHP, factored out of PHPUnit into a stand-alone component. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/diff -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/diff -``` - -### Usage - -#### Generating diff - -The `Differ` class can be used to generate a textual representation of the difference between two strings: - -```php -diff('foo', 'bar'); -``` - -The code above yields the output below: -```diff ---- Original -+++ New -@@ @@ --foo -+bar -``` - -There are three output builders available in this package: - -#### UnifiedDiffOutputBuilder - -This is default builder, which generates the output close to udiff and is used by PHPUnit. - -```php -diff('foo', 'bar'); -``` - -#### StrictUnifiedDiffOutputBuilder - -Generates (strict) Unified diff's (unidiffs) with hunks, -similar to `diff -u` and compatible with `patch` and `git apply`. - -```php - true, // ranges of length one are rendered with the trailing `,1` - 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) - 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 - 'fromFile' => null, - 'fromFileDate' => null, - 'toFile' => null, - 'toFileDate' => null, -]); - -$differ = new Differ($builder); -print $differ->diff('foo', 'bar'); -``` - -#### DiffOnlyOutputBuilder - -Output only the lines that differ. - -```php -diff('foo', 'bar'); -``` - -#### DiffOutputBuilderInterface - -You can pass any output builder to the `Differ` class as longs as it implements the `DiffOutputBuilderInterface`. - -#### Parsing diff - -The `Parser` class can be used to parse a unified diff into an object graph: - -```php -use SebastianBergmann\Diff\Parser; -use SebastianBergmann\Git; - -$git = new Git('/usr/local/src/money'); - -$diff = $git->getDiff( - '948a1a07768d8edd10dcefa8315c1cbeffb31833', - 'c07a373d2399f3e686234c4f7f088d635eb9641b' -); - -$parser = new Parser; - -print_r($parser->parse($diff)); -``` - -The code above yields the output below: - - Array - ( - [0] => SebastianBergmann\Diff\Diff Object - ( - [from:SebastianBergmann\Diff\Diff:private] => a/tests/MoneyTest.php - [to:SebastianBergmann\Diff\Diff:private] => b/tests/MoneyTest.php - [chunks:SebastianBergmann\Diff\Diff:private] => Array - ( - [0] => SebastianBergmann\Diff\Chunk Object - ( - [start:SebastianBergmann\Diff\Chunk:private] => 87 - [startRange:SebastianBergmann\Diff\Chunk:private] => 7 - [end:SebastianBergmann\Diff\Chunk:private] => 87 - [endRange:SebastianBergmann\Diff\Chunk:private] => 7 - [lines:SebastianBergmann\Diff\Chunk:private] => Array - ( - [0] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => * @covers SebastianBergmann\Money\Money::add - ) - - [1] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => * @covers SebastianBergmann\Money\Money::newMoney - ) - - [2] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => */ - ) - - [3] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 2 - [content:SebastianBergmann\Diff\Line:private] => public function testAnotherMoneyWithSameCurrencyObjectCanBeAdded() - ) - - [4] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 1 - [content:SebastianBergmann\Diff\Line:private] => public function testAnotherMoneyObjectWithSameCurrencyCanBeAdded() - ) - - [5] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => { - ) - - [6] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => $a = new Money(1, new Currency('EUR')); - ) - - [7] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => $b = new Money(2, new Currency('EUR')); - ) - ) - ) - ) - ) - ) diff --git a/vendor/sebastian/diff/composer.json b/vendor/sebastian/diff/composer.json deleted file mode 100644 index cf92202b..00000000 --- a/vendor/sebastian/diff/composer.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "sebastian/diff", - "description": "Diff implementation", - "keywords": ["diff", "udiff", "unidiff", "unified diff"], - "homepage": "https://github.com/sebastianbergmann/diff", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "prefer-stable": true, - "config": { - "platform": { - "php": "7.3.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - } -} diff --git a/vendor/sebastian/diff/src/Chunk.php b/vendor/sebastian/diff/src/Chunk.php deleted file mode 100644 index 16ae34f4..00000000 --- a/vendor/sebastian/diff/src/Chunk.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -final class Chunk -{ - /** - * @var int - */ - private $start; - - /** - * @var int - */ - private $startRange; - - /** - * @var int - */ - private $end; - - /** - * @var int - */ - private $endRange; - - /** - * @var Line[] - */ - private $lines; - - public function __construct(int $start = 0, int $startRange = 1, int $end = 0, int $endRange = 1, array $lines = []) - { - $this->start = $start; - $this->startRange = $startRange; - $this->end = $end; - $this->endRange = $endRange; - $this->lines = $lines; - } - - public function getStart(): int - { - return $this->start; - } - - public function getStartRange(): int - { - return $this->startRange; - } - - public function getEnd(): int - { - return $this->end; - } - - public function getEndRange(): int - { - return $this->endRange; - } - - /** - * @return Line[] - */ - public function getLines(): array - { - return $this->lines; - } - - /** - * @param Line[] $lines - */ - public function setLines(array $lines): void - { - foreach ($lines as $line) { - if (!$line instanceof Line) { - throw new InvalidArgumentException; - } - } - - $this->lines = $lines; - } -} diff --git a/vendor/sebastian/diff/src/Diff.php b/vendor/sebastian/diff/src/Diff.php deleted file mode 100644 index 17b2084f..00000000 --- a/vendor/sebastian/diff/src/Diff.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -final class Diff -{ - /** - * @var string - */ - private $from; - - /** - * @var string - */ - private $to; - - /** - * @var Chunk[] - */ - private $chunks; - - /** - * @param Chunk[] $chunks - */ - public function __construct(string $from, string $to, array $chunks = []) - { - $this->from = $from; - $this->to = $to; - $this->chunks = $chunks; - } - - public function getFrom(): string - { - return $this->from; - } - - public function getTo(): string - { - return $this->to; - } - - /** - * @return Chunk[] - */ - public function getChunks(): array - { - return $this->chunks; - } - - /** - * @param Chunk[] $chunks - */ - public function setChunks(array $chunks): void - { - $this->chunks = $chunks; - } -} diff --git a/vendor/sebastian/diff/src/Differ.php b/vendor/sebastian/diff/src/Differ.php deleted file mode 100644 index 5a4d9d10..00000000 --- a/vendor/sebastian/diff/src/Differ.php +++ /dev/null @@ -1,327 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use const PHP_INT_SIZE; -use const PREG_SPLIT_DELIM_CAPTURE; -use const PREG_SPLIT_NO_EMPTY; -use function array_shift; -use function array_unshift; -use function array_values; -use function count; -use function current; -use function end; -use function get_class; -use function gettype; -use function is_array; -use function is_object; -use function is_string; -use function key; -use function min; -use function preg_split; -use function prev; -use function reset; -use function sprintf; -use function substr; -use SebastianBergmann\Diff\Output\DiffOutputBuilderInterface; -use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; - -final class Differ -{ - public const OLD = 0; - - public const ADDED = 1; - - public const REMOVED = 2; - - public const DIFF_LINE_END_WARNING = 3; - - public const NO_LINE_END_EOF_WARNING = 4; - - /** - * @var DiffOutputBuilderInterface - */ - private $outputBuilder; - - /** - * @param DiffOutputBuilderInterface $outputBuilder - * - * @throws InvalidArgumentException - */ - public function __construct($outputBuilder = null) - { - if ($outputBuilder instanceof DiffOutputBuilderInterface) { - $this->outputBuilder = $outputBuilder; - } elseif (null === $outputBuilder) { - $this->outputBuilder = new UnifiedDiffOutputBuilder; - } elseif (is_string($outputBuilder)) { - // PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 support - // @see https://github.com/sebastianbergmann/phpunit/issues/2734#issuecomment-314514056 - // @deprecated - $this->outputBuilder = new UnifiedDiffOutputBuilder($outputBuilder); - } else { - throw new InvalidArgumentException( - sprintf( - 'Expected builder to be an instance of DiffOutputBuilderInterface, or a string, got %s.', - is_object($outputBuilder) ? 'instance of "' . get_class($outputBuilder) . '"' : gettype($outputBuilder) . ' "' . $outputBuilder . '"' - ) - ); - } - } - - /** - * Returns the diff between two arrays or strings as string. - * - * @param array|string $from - * @param array|string $to - */ - public function diff($from, $to, LongestCommonSubsequenceCalculator $lcs = null): string - { - $diff = $this->diffToArray( - $this->normalizeDiffInput($from), - $this->normalizeDiffInput($to), - $lcs - ); - - return $this->outputBuilder->getDiff($diff); - } - - /** - * Returns the diff between two arrays or strings as array. - * - * Each array element contains two elements: - * - [0] => mixed $token - * - [1] => 2|1|0 - * - * - 2: REMOVED: $token was removed from $from - * - 1: ADDED: $token was added to $from - * - 0: OLD: $token is not changed in $to - * - * @param array|string $from - * @param array|string $to - * @param LongestCommonSubsequenceCalculator $lcs - */ - public function diffToArray($from, $to, LongestCommonSubsequenceCalculator $lcs = null): array - { - if (is_string($from)) { - $from = $this->splitStringByLines($from); - } elseif (!is_array($from)) { - throw new InvalidArgumentException('"from" must be an array or string.'); - } - - if (is_string($to)) { - $to = $this->splitStringByLines($to); - } elseif (!is_array($to)) { - throw new InvalidArgumentException('"to" must be an array or string.'); - } - - [$from, $to, $start, $end] = self::getArrayDiffParted($from, $to); - - if ($lcs === null) { - $lcs = $this->selectLcsImplementation($from, $to); - } - - $common = $lcs->calculate(array_values($from), array_values($to)); - $diff = []; - - foreach ($start as $token) { - $diff[] = [$token, self::OLD]; - } - - reset($from); - reset($to); - - foreach ($common as $token) { - while (($fromToken = reset($from)) !== $token) { - $diff[] = [array_shift($from), self::REMOVED]; - } - - while (($toToken = reset($to)) !== $token) { - $diff[] = [array_shift($to), self::ADDED]; - } - - $diff[] = [$token, self::OLD]; - - array_shift($from); - array_shift($to); - } - - while (($token = array_shift($from)) !== null) { - $diff[] = [$token, self::REMOVED]; - } - - while (($token = array_shift($to)) !== null) { - $diff[] = [$token, self::ADDED]; - } - - foreach ($end as $token) { - $diff[] = [$token, self::OLD]; - } - - if ($this->detectUnmatchedLineEndings($diff)) { - array_unshift($diff, ["#Warning: Strings contain different line endings!\n", self::DIFF_LINE_END_WARNING]); - } - - return $diff; - } - - /** - * Casts variable to string if it is not a string or array. - * - * @return array|string - */ - private function normalizeDiffInput($input) - { - if (!is_array($input) && !is_string($input)) { - return (string) $input; - } - - return $input; - } - - /** - * Checks if input is string, if so it will split it line-by-line. - */ - private function splitStringByLines(string $input): array - { - return preg_split('/(.*\R)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - } - - private function selectLcsImplementation(array $from, array $to): LongestCommonSubsequenceCalculator - { - // We do not want to use the time-efficient implementation if its memory - // footprint will probably exceed this value. Note that the footprint - // calculation is only an estimation for the matrix and the LCS method - // will typically allocate a bit more memory than this. - $memoryLimit = 100 * 1024 * 1024; - - if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) { - return new MemoryEfficientLongestCommonSubsequenceCalculator; - } - - return new TimeEfficientLongestCommonSubsequenceCalculator; - } - - /** - * Calculates the estimated memory footprint for the DP-based method. - * - * @return float|int - */ - private function calculateEstimatedFootprint(array $from, array $to) - { - $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; - - return $itemSize * min(count($from), count($to)) ** 2; - } - - /** - * Returns true if line ends don't match in a diff. - */ - private function detectUnmatchedLineEndings(array $diff): bool - { - $newLineBreaks = ['' => true]; - $oldLineBreaks = ['' => true]; - - foreach ($diff as $entry) { - if (self::OLD === $entry[1]) { - $ln = $this->getLinebreak($entry[0]); - $oldLineBreaks[$ln] = true; - $newLineBreaks[$ln] = true; - } elseif (self::ADDED === $entry[1]) { - $newLineBreaks[$this->getLinebreak($entry[0])] = true; - } elseif (self::REMOVED === $entry[1]) { - $oldLineBreaks[$this->getLinebreak($entry[0])] = true; - } - } - - // if either input or output is a single line without breaks than no warning should be raised - if (['' => true] === $newLineBreaks || ['' => true] === $oldLineBreaks) { - return false; - } - - // two way compare - foreach ($newLineBreaks as $break => $set) { - if (!isset($oldLineBreaks[$break])) { - return true; - } - } - - foreach ($oldLineBreaks as $break => $set) { - if (!isset($newLineBreaks[$break])) { - return true; - } - } - - return false; - } - - private function getLinebreak($line): string - { - if (!is_string($line)) { - return ''; - } - - $lc = substr($line, -1); - - if ("\r" === $lc) { - return "\r"; - } - - if ("\n" !== $lc) { - return ''; - } - - if ("\r\n" === substr($line, -2)) { - return "\r\n"; - } - - return "\n"; - } - - private static function getArrayDiffParted(array &$from, array &$to): array - { - $start = []; - $end = []; - - reset($to); - - foreach ($from as $k => $v) { - $toK = key($to); - - if ($toK === $k && $v === $to[$k]) { - $start[$k] = $v; - - unset($from[$k], $to[$k]); - } else { - break; - } - } - - end($from); - end($to); - - do { - $fromK = key($from); - $toK = key($to); - - if (null === $fromK || null === $toK || current($from) !== current($to)) { - break; - } - - prev($from); - prev($to); - - $end = [$fromK => $from[$fromK]] + $end; - unset($from[$fromK], $to[$toK]); - } while (true); - - return [$from, $to, $start, $end]; - } -} diff --git a/vendor/sebastian/diff/src/Exception/ConfigurationException.php b/vendor/sebastian/diff/src/Exception/ConfigurationException.php deleted file mode 100644 index b767b219..00000000 --- a/vendor/sebastian/diff/src/Exception/ConfigurationException.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use function get_class; -use function gettype; -use function is_object; -use function sprintf; -use Exception; - -final class ConfigurationException extends InvalidArgumentException -{ - public function __construct( - string $option, - string $expected, - $value, - int $code = 0, - Exception $previous = null - ) { - parent::__construct( - sprintf( - 'Option "%s" must be %s, got "%s".', - $option, - $expected, - is_object($value) ? get_class($value) : (null === $value ? '' : gettype($value) . '#' . $value) - ), - $code, - $previous - ); - } -} diff --git a/vendor/sebastian/diff/src/Exception/Exception.php b/vendor/sebastian/diff/src/Exception/Exception.php deleted file mode 100644 index e20d3203..00000000 --- a/vendor/sebastian/diff/src/Exception/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php b/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php deleted file mode 100644 index 846ac3fb..00000000 --- a/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/sebastian/diff/src/Line.php b/vendor/sebastian/diff/src/Line.php deleted file mode 100644 index 3596ed26..00000000 --- a/vendor/sebastian/diff/src/Line.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -final class Line -{ - public const ADDED = 1; - - public const REMOVED = 2; - - public const UNCHANGED = 3; - - /** - * @var int - */ - private $type; - - /** - * @var string - */ - private $content; - - public function __construct(int $type = self::UNCHANGED, string $content = '') - { - $this->type = $type; - $this->content = $content; - } - - public function getContent(): string - { - return $this->content; - } - - public function getType(): int - { - return $this->type; - } -} diff --git a/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php deleted file mode 100644 index dea8fe1c..00000000 --- a/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -interface LongestCommonSubsequenceCalculator -{ - /** - * Calculates the longest common subsequence of two arrays. - */ - public function calculate(array $from, array $to): array; -} diff --git a/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php deleted file mode 100644 index 0b626eaf..00000000 --- a/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use function array_fill; -use function array_merge; -use function array_reverse; -use function array_slice; -use function count; -use function in_array; -use function max; - -final class MemoryEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator -{ - /** - * {@inheritdoc} - */ - public function calculate(array $from, array $to): array - { - $cFrom = count($from); - $cTo = count($to); - - if ($cFrom === 0) { - return []; - } - - if ($cFrom === 1) { - if (in_array($from[0], $to, true)) { - return [$from[0]]; - } - - return []; - } - - $i = (int) ($cFrom / 2); - $fromStart = array_slice($from, 0, $i); - $fromEnd = array_slice($from, $i); - $llB = $this->length($fromStart, $to); - $llE = $this->length(array_reverse($fromEnd), array_reverse($to)); - $jMax = 0; - $max = 0; - - for ($j = 0; $j <= $cTo; $j++) { - $m = $llB[$j] + $llE[$cTo - $j]; - - if ($m >= $max) { - $max = $m; - $jMax = $j; - } - } - - $toStart = array_slice($to, 0, $jMax); - $toEnd = array_slice($to, $jMax); - - return array_merge( - $this->calculate($fromStart, $toStart), - $this->calculate($fromEnd, $toEnd) - ); - } - - private function length(array $from, array $to): array - { - $current = array_fill(0, count($to) + 1, 0); - $cFrom = count($from); - $cTo = count($to); - - for ($i = 0; $i < $cFrom; $i++) { - $prev = $current; - - for ($j = 0; $j < $cTo; $j++) { - if ($from[$i] === $to[$j]) { - $current[$j + 1] = $prev[$j] + 1; - } else { - $current[$j + 1] = max($current[$j], $prev[$j + 1]); - } - } - } - - return $current; - } -} diff --git a/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php b/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php deleted file mode 100644 index e55757c3..00000000 --- a/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff\Output; - -use function count; - -abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * Takes input of the diff array and returns the common parts. - * Iterates through diff line by line. - */ - protected function getCommonChunks(array $diff, int $lineThreshold = 5): array - { - $diffSize = count($diff); - $capturing = false; - $chunkStart = 0; - $chunkSize = 0; - $commonChunks = []; - - for ($i = 0; $i < $diffSize; ++$i) { - if ($diff[$i][1] === 0 /* OLD */) { - if ($capturing === false) { - $capturing = true; - $chunkStart = $i; - $chunkSize = 0; - } else { - ++$chunkSize; - } - } elseif ($capturing !== false) { - if ($chunkSize >= $lineThreshold) { - $commonChunks[$chunkStart] = $chunkStart + $chunkSize; - } - - $capturing = false; - } - } - - if ($capturing !== false && $chunkSize >= $lineThreshold) { - $commonChunks[$chunkStart] = $chunkStart + $chunkSize; - } - - return $commonChunks; - } -} diff --git a/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php b/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php deleted file mode 100644 index f79a935c..00000000 --- a/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff\Output; - -use function fclose; -use function fopen; -use function fwrite; -use function stream_get_contents; -use function substr; -use SebastianBergmann\Diff\Differ; - -/** - * Builds a diff string representation in a loose unified diff format - * listing only changes lines. Does not include line numbers. - */ -final class DiffOnlyOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * @var string - */ - private $header; - - public function __construct(string $header = "--- Original\n+++ New\n") - { - $this->header = $header; - } - - public function getDiff(array $diff): string - { - $buffer = fopen('php://memory', 'r+b'); - - if ('' !== $this->header) { - fwrite($buffer, $this->header); - - if ("\n" !== substr($this->header, -1, 1)) { - fwrite($buffer, "\n"); - } - } - - foreach ($diff as $diffEntry) { - if ($diffEntry[1] === Differ::ADDED) { - fwrite($buffer, '+' . $diffEntry[0]); - } elseif ($diffEntry[1] === Differ::REMOVED) { - fwrite($buffer, '-' . $diffEntry[0]); - } elseif ($diffEntry[1] === Differ::DIFF_LINE_END_WARNING) { - fwrite($buffer, ' ' . $diffEntry[0]); - - continue; // Warnings should not be tested for line break, it will always be there - } else { /* Not changed (old) 0 */ - continue; // we didn't write the non changs line, so do not add a line break either - } - - $lc = substr($diffEntry[0], -1); - - if ($lc !== "\n" && $lc !== "\r") { - fwrite($buffer, "\n"); // \No newline at end of file - } - } - - $diff = stream_get_contents($buffer, -1, 0); - fclose($buffer); - - return $diff; - } -} diff --git a/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php b/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php deleted file mode 100644 index 0e18f9f2..00000000 --- a/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff\Output; - -/** - * Defines how an output builder should take a generated - * diff array and return a string representation of that diff. - */ -interface DiffOutputBuilderInterface -{ - public function getDiff(array $diff): string; -} diff --git a/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php b/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php deleted file mode 100644 index 9c55ab2a..00000000 --- a/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php +++ /dev/null @@ -1,338 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff\Output; - -use function array_merge; -use function array_splice; -use function count; -use function fclose; -use function fopen; -use function fwrite; -use function is_bool; -use function is_int; -use function is_string; -use function max; -use function min; -use function sprintf; -use function stream_get_contents; -use function substr; -use SebastianBergmann\Diff\ConfigurationException; -use SebastianBergmann\Diff\Differ; - -/** - * Strict Unified diff output builder. - * - * Generates (strict) Unified diff's (unidiffs) with hunks. - */ -final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface -{ - private static $default = [ - 'collapseRanges' => true, // ranges of length one are rendered with the trailing `,1` - 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) - 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 - 'fromFile' => null, - 'fromFileDate' => null, - 'toFile' => null, - 'toFileDate' => null, - ]; - - /** - * @var bool - */ - private $changed; - - /** - * @var bool - */ - private $collapseRanges; - - /** - * @var int >= 0 - */ - private $commonLineThreshold; - - /** - * @var string - */ - private $header; - - /** - * @var int >= 0 - */ - private $contextLines; - - public function __construct(array $options = []) - { - $options = array_merge(self::$default, $options); - - if (!is_bool($options['collapseRanges'])) { - throw new ConfigurationException('collapseRanges', 'a bool', $options['collapseRanges']); - } - - if (!is_int($options['contextLines']) || $options['contextLines'] < 0) { - throw new ConfigurationException('contextLines', 'an int >= 0', $options['contextLines']); - } - - if (!is_int($options['commonLineThreshold']) || $options['commonLineThreshold'] <= 0) { - throw new ConfigurationException('commonLineThreshold', 'an int > 0', $options['commonLineThreshold']); - } - - $this->assertString($options, 'fromFile'); - $this->assertString($options, 'toFile'); - $this->assertStringOrNull($options, 'fromFileDate'); - $this->assertStringOrNull($options, 'toFileDate'); - - $this->header = sprintf( - "--- %s%s\n+++ %s%s\n", - $options['fromFile'], - null === $options['fromFileDate'] ? '' : "\t" . $options['fromFileDate'], - $options['toFile'], - null === $options['toFileDate'] ? '' : "\t" . $options['toFileDate'] - ); - - $this->collapseRanges = $options['collapseRanges']; - $this->commonLineThreshold = $options['commonLineThreshold']; - $this->contextLines = $options['contextLines']; - } - - public function getDiff(array $diff): string - { - if (0 === count($diff)) { - return ''; - } - - $this->changed = false; - - $buffer = fopen('php://memory', 'r+b'); - fwrite($buffer, $this->header); - - $this->writeDiffHunks($buffer, $diff); - - if (!$this->changed) { - fclose($buffer); - - return ''; - } - - $diff = stream_get_contents($buffer, -1, 0); - - fclose($buffer); - - // If the last char is not a linebreak: add it. - // This might happen when both the `from` and `to` do not have a trailing linebreak - $last = substr($diff, -1); - - return "\n" !== $last && "\r" !== $last - ? $diff . "\n" - : $diff; - } - - private function writeDiffHunks($output, array $diff): void - { - // detect "No newline at end of file" and insert into `$diff` if needed - - $upperLimit = count($diff); - - if (0 === $diff[$upperLimit - 1][1]) { - $lc = substr($diff[$upperLimit - 1][0], -1); - - if ("\n" !== $lc) { - array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - } else { - // search back for the last `+` and `-` line, - // check if has trailing linebreak, else add under it warning under it - $toFind = [1 => true, 2 => true]; - - for ($i = $upperLimit - 1; $i >= 0; --$i) { - if (isset($toFind[$diff[$i][1]])) { - unset($toFind[$diff[$i][1]]); - $lc = substr($diff[$i][0], -1); - - if ("\n" !== $lc) { - array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - - if (!count($toFind)) { - break; - } - } - } - } - - // write hunks to output buffer - - $cutOff = max($this->commonLineThreshold, $this->contextLines); - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - $toStart = $fromStart = 1; - $i = 0; - - /** @var int $i */ - foreach ($diff as $i => $entry) { - if (0 === $entry[1]) { // same - if (false === $hunkCapture) { - ++$fromStart; - ++$toStart; - - continue; - } - - ++$sameCount; - ++$toRange; - ++$fromRange; - - if ($sameCount === $cutOff) { - $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 - ? $hunkCapture - : $this->contextLines; - - // note: $contextEndOffset = $this->contextLines; - // - // because we never go beyond the end of the diff. - // with the cutoff/contextlines here the follow is never true; - // - // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { - // $contextEndOffset = count($diff) - 1; - // } - // - // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $cutOff + $this->contextLines + 1, - $fromStart - $contextStartOffset, - $fromRange - $cutOff + $contextStartOffset + $this->contextLines, - $toStart - $contextStartOffset, - $toRange - $cutOff + $contextStartOffset + $this->contextLines, - $output - ); - - $fromStart += $fromRange; - $toStart += $toRange; - - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - } - - continue; - } - - $sameCount = 0; - - if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { - continue; - } - - $this->changed = true; - - if (false === $hunkCapture) { - $hunkCapture = $i; - } - - if (Differ::ADDED === $entry[1]) { // added - ++$toRange; - } - - if (Differ::REMOVED === $entry[1]) { // removed - ++$fromRange; - } - } - - if (false === $hunkCapture) { - return; - } - - // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, - // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold - - $contextStartOffset = $hunkCapture - $this->contextLines < 0 - ? $hunkCapture - : $this->contextLines; - - // prevent trying to write out more common lines than there are in the diff _and_ - // do not write more than configured through the context lines - $contextEndOffset = min($sameCount, $this->contextLines); - - $fromRange -= $sameCount; - $toRange -= $sameCount; - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $sameCount + $contextEndOffset + 1, - $fromStart - $contextStartOffset, - $fromRange + $contextStartOffset + $contextEndOffset, - $toStart - $contextStartOffset, - $toRange + $contextStartOffset + $contextEndOffset, - $output - ); - } - - private function writeHunk( - array $diff, - int $diffStartIndex, - int $diffEndIndex, - int $fromStart, - int $fromRange, - int $toStart, - int $toRange, - $output - ): void { - fwrite($output, '@@ -' . $fromStart); - - if (!$this->collapseRanges || 1 !== $fromRange) { - fwrite($output, ',' . $fromRange); - } - - fwrite($output, ' +' . $toStart); - - if (!$this->collapseRanges || 1 !== $toRange) { - fwrite($output, ',' . $toRange); - } - - fwrite($output, " @@\n"); - - for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { - if ($diff[$i][1] === Differ::ADDED) { - $this->changed = true; - fwrite($output, '+' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::REMOVED) { - $this->changed = true; - fwrite($output, '-' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::OLD) { - fwrite($output, ' ' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { - $this->changed = true; - fwrite($output, $diff[$i][0]); - } - //} elseif ($diff[$i][1] === Differ::DIFF_LINE_END_WARNING) { // custom comment inserted by PHPUnit/diff package - // skip - //} else { - // unknown/invalid - //} - } - } - - private function assertString(array $options, string $option): void - { - if (!is_string($options[$option])) { - throw new ConfigurationException($option, 'a string', $options[$option]); - } - } - - private function assertStringOrNull(array $options, string $option): void - { - if (null !== $options[$option] && !is_string($options[$option])) { - throw new ConfigurationException($option, 'a string or ', $options[$option]); - } - } -} diff --git a/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php b/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php deleted file mode 100644 index 8aae6450..00000000 --- a/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php +++ /dev/null @@ -1,272 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff\Output; - -use function array_splice; -use function count; -use function fclose; -use function fopen; -use function fwrite; -use function max; -use function min; -use function stream_get_contents; -use function strlen; -use function substr; -use SebastianBergmann\Diff\Differ; - -/** - * Builds a diff string representation in unified diff format in chunks. - */ -final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder -{ - /** - * @var bool - */ - private $collapseRanges = true; - - /** - * @var int >= 0 - */ - private $commonLineThreshold = 6; - - /** - * @var int >= 0 - */ - private $contextLines = 3; - - /** - * @var string - */ - private $header; - - /** - * @var bool - */ - private $addLineNumbers; - - public function __construct(string $header = "--- Original\n+++ New\n", bool $addLineNumbers = false) - { - $this->header = $header; - $this->addLineNumbers = $addLineNumbers; - } - - public function getDiff(array $diff): string - { - $buffer = fopen('php://memory', 'r+b'); - - if ('' !== $this->header) { - fwrite($buffer, $this->header); - - if ("\n" !== substr($this->header, -1, 1)) { - fwrite($buffer, "\n"); - } - } - - if (0 !== count($diff)) { - $this->writeDiffHunks($buffer, $diff); - } - - $diff = stream_get_contents($buffer, -1, 0); - - fclose($buffer); - - // If the diff is non-empty and last char is not a linebreak: add it. - // This might happen when both the `from` and `to` do not have a trailing linebreak - $last = substr($diff, -1); - - return 0 !== strlen($diff) && "\n" !== $last && "\r" !== $last - ? $diff . "\n" - : $diff; - } - - private function writeDiffHunks($output, array $diff): void - { - // detect "No newline at end of file" and insert into `$diff` if needed - - $upperLimit = count($diff); - - if (0 === $diff[$upperLimit - 1][1]) { - $lc = substr($diff[$upperLimit - 1][0], -1); - - if ("\n" !== $lc) { - array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - } else { - // search back for the last `+` and `-` line, - // check if has trailing linebreak, else add under it warning under it - $toFind = [1 => true, 2 => true]; - - for ($i = $upperLimit - 1; $i >= 0; --$i) { - if (isset($toFind[$diff[$i][1]])) { - unset($toFind[$diff[$i][1]]); - $lc = substr($diff[$i][0], -1); - - if ("\n" !== $lc) { - array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - - if (!count($toFind)) { - break; - } - } - } - } - - // write hunks to output buffer - - $cutOff = max($this->commonLineThreshold, $this->contextLines); - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - $toStart = $fromStart = 1; - $i = 0; - - /** @var int $i */ - foreach ($diff as $i => $entry) { - if (0 === $entry[1]) { // same - if (false === $hunkCapture) { - ++$fromStart; - ++$toStart; - - continue; - } - - ++$sameCount; - ++$toRange; - ++$fromRange; - - if ($sameCount === $cutOff) { - $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 - ? $hunkCapture - : $this->contextLines; - - // note: $contextEndOffset = $this->contextLines; - // - // because we never go beyond the end of the diff. - // with the cutoff/contextlines here the follow is never true; - // - // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { - // $contextEndOffset = count($diff) - 1; - // } - // - // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $cutOff + $this->contextLines + 1, - $fromStart - $contextStartOffset, - $fromRange - $cutOff + $contextStartOffset + $this->contextLines, - $toStart - $contextStartOffset, - $toRange - $cutOff + $contextStartOffset + $this->contextLines, - $output - ); - - $fromStart += $fromRange; - $toStart += $toRange; - - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - } - - continue; - } - - $sameCount = 0; - - if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { - continue; - } - - if (false === $hunkCapture) { - $hunkCapture = $i; - } - - if (Differ::ADDED === $entry[1]) { - ++$toRange; - } - - if (Differ::REMOVED === $entry[1]) { - ++$fromRange; - } - } - - if (false === $hunkCapture) { - return; - } - - // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, - // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold - - $contextStartOffset = $hunkCapture - $this->contextLines < 0 - ? $hunkCapture - : $this->contextLines; - - // prevent trying to write out more common lines than there are in the diff _and_ - // do not write more than configured through the context lines - $contextEndOffset = min($sameCount, $this->contextLines); - - $fromRange -= $sameCount; - $toRange -= $sameCount; - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $sameCount + $contextEndOffset + 1, - $fromStart - $contextStartOffset, - $fromRange + $contextStartOffset + $contextEndOffset, - $toStart - $contextStartOffset, - $toRange + $contextStartOffset + $contextEndOffset, - $output - ); - } - - private function writeHunk( - array $diff, - int $diffStartIndex, - int $diffEndIndex, - int $fromStart, - int $fromRange, - int $toStart, - int $toRange, - $output - ): void { - if ($this->addLineNumbers) { - fwrite($output, '@@ -' . $fromStart); - - if (!$this->collapseRanges || 1 !== $fromRange) { - fwrite($output, ',' . $fromRange); - } - - fwrite($output, ' +' . $toStart); - - if (!$this->collapseRanges || 1 !== $toRange) { - fwrite($output, ',' . $toRange); - } - - fwrite($output, " @@\n"); - } else { - fwrite($output, "@@ @@\n"); - } - - for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { - if ($diff[$i][1] === Differ::ADDED) { - fwrite($output, '+' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::REMOVED) { - fwrite($output, '-' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::OLD) { - fwrite($output, ' ' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { - fwrite($output, "\n"); // $diff[$i][0] - } else { /* Not changed (old) Differ::OLD or Warning Differ::DIFF_LINE_END_WARNING */ - fwrite($output, ' ' . $diff[$i][0]); - } - } - } -} diff --git a/vendor/sebastian/diff/src/Parser.php b/vendor/sebastian/diff/src/Parser.php deleted file mode 100644 index cc9e3887..00000000 --- a/vendor/sebastian/diff/src/Parser.php +++ /dev/null @@ -1,110 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use function array_pop; -use function count; -use function max; -use function preg_match; -use function preg_split; - -/** - * Unified diff parser. - */ -final class Parser -{ - /** - * @return Diff[] - */ - public function parse(string $string): array - { - $lines = preg_split('(\r\n|\r|\n)', $string); - - if (!empty($lines) && $lines[count($lines) - 1] === '') { - array_pop($lines); - } - - $lineCount = count($lines); - $diffs = []; - $diff = null; - $collected = []; - - for ($i = 0; $i < $lineCount; ++$i) { - if (preg_match('#^---\h+"?(?P[^\\v\\t"]+)#', $lines[$i], $fromMatch) && - preg_match('#^\\+\\+\\+\\h+"?(?P[^\\v\\t"]+)#', $lines[$i + 1], $toMatch)) { - if ($diff !== null) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - $collected = []; - } - - $diff = new Diff($fromMatch['file'], $toMatch['file']); - - ++$i; - } else { - if (preg_match('/^(?:diff --git |index [\da-f\.]+|[+-]{3} [ab])/', $lines[$i])) { - continue; - } - - $collected[] = $lines[$i]; - } - } - - if ($diff !== null && count($collected)) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - } - - return $diffs; - } - - private function parseFileDiff(Diff $diff, array $lines): void - { - $chunks = []; - $chunk = null; - $diffLines = []; - - foreach ($lines as $line) { - if (preg_match('/^@@\s+-(?P\d+)(?:,\s*(?P\d+))?\s+\+(?P\d+)(?:,\s*(?P\d+))?\s+@@/', $line, $match)) { - $chunk = new Chunk( - (int) $match['start'], - isset($match['startrange']) ? max(1, (int) $match['startrange']) : 1, - (int) $match['end'], - isset($match['endrange']) ? max(1, (int) $match['endrange']) : 1 - ); - - $chunks[] = $chunk; - $diffLines = []; - - continue; - } - - if (preg_match('/^(?P[+ -])?(?P.*)/', $line, $match)) { - $type = Line::UNCHANGED; - - if ($match['type'] === '+') { - $type = Line::ADDED; - } elseif ($match['type'] === '-') { - $type = Line::REMOVED; - } - - $diffLines[] = new Line($type, $match['line']); - - if (null !== $chunk) { - $chunk->setLines($diffLines); - } - } - } - - $diff->setChunks($chunks); - } -} diff --git a/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php deleted file mode 100644 index fd19cac7..00000000 --- a/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use function array_reverse; -use function count; -use function max; -use SplFixedArray; - -final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator -{ - /** - * {@inheritdoc} - */ - public function calculate(array $from, array $to): array - { - $common = []; - $fromLength = count($from); - $toLength = count($to); - $width = $fromLength + 1; - $matrix = new SplFixedArray($width * ($toLength + 1)); - - for ($i = 0; $i <= $fromLength; ++$i) { - $matrix[$i] = 0; - } - - for ($j = 0; $j <= $toLength; ++$j) { - $matrix[$j * $width] = 0; - } - - for ($i = 1; $i <= $fromLength; ++$i) { - for ($j = 1; $j <= $toLength; ++$j) { - $o = ($j * $width) + $i; - $matrix[$o] = max( - $matrix[$o - 1], - $matrix[$o - $width], - $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0 - ); - } - } - - $i = $fromLength; - $j = $toLength; - - while ($i > 0 && $j > 0) { - if ($from[$i - 1] === $to[$j - 1]) { - $common[] = $from[$i - 1]; - --$i; - --$j; - } else { - $o = ($j * $width) + $i; - - if ($matrix[$o - $width] > $matrix[$o - 1]) { - --$j; - } else { - --$i; - } - } - } - - return array_reverse($common); - } -} diff --git a/vendor/vimeo/psalm/LICENSE b/vendor/vimeo/psalm/LICENSE deleted file mode 100644 index bfb2d1c5..00000000 --- a/vendor/vimeo/psalm/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Vimeo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/vimeo/psalm/composer.json b/vendor/vimeo/psalm/composer.json deleted file mode 100644 index ddbe93f4..00000000 --- a/vendor/vimeo/psalm/composer.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "name": "vimeo/psalm", - "type": "library", - "description": "A static analysis tool for finding errors in PHP applications", - "keywords": [ - "php", - "code", - "inspection" - ], - "license": "MIT", - "authors": [ - { - "name": "Matthew Brown" - } - ], - "require": { - "php": "^7.1|^8", - "ext-SimpleXML": "*", - "ext-ctype": "*", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-tokenizer": "*", - "amphp/amp": "^2.4.2", - "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.8.0", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "felixfbecker/language-server-protocol": "^1.5", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.13", - "openlss/lib-array2xml": "^1.0", - "sebastian/diff": "^3.0 || ^4.0", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.25", - "webmozart/path-util": "^2.3" - }, - "provide": { - "psalm/psalm": "self.version" - }, - "require-dev": { - "ext-curl": "*", - "bamarni/composer-bin-plugin": "^1.2", - "brianium/paratest": "^4.0||^6.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpdocumentor/reflection-docblock": "^5", - "phpmyadmin/sql-parser": "5.1.0||dev-master", - "phpspec/prophecy": ">=1.9.0", - "phpunit/phpunit": "^9.0", - "psalm/plugin-phpunit": "^0.16", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5", - "symfony/process": "^4.3 || ^5.0 || ^6.0", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "suggest": { - "ext-igbinary": "^2.0.5 is required, used to serialize caching data", - "ext-curl": "In order to send data to shepherd" - }, - "config": { - "allow-plugins": { - "bamarni/composer-bin-plugin": true, - "composer/package-versions-deprecated": true, - "dealerdirect/phpcodesniffer-composer-installer": true - }, - "optimize-autoloader": true, - "sort-packages": true, - "platform-check": false - }, - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psalm\\": "src/Psalm/" - }, - "files": [ - "src/functions.php", - "src/spl_object_id.php" - ] - }, - "autoload-dev": { - "psr-4": { - "Psalm\\Tests\\": "tests/" - } - }, - "repositories": [ - { - "type": "path", - "url": "examples/plugins/composer-based/echo-checker" - } - ], - "minimum-stability": "dev", - "prefer-stable": true, - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], - "scripts": { - "cs": "phpcs -p", - "cs-fix": "phpcbf -p", - "lint": "parallel-lint ./src ./tests", - "phpunit": "paratest --runner=WrapperRunner", - "phpunit-std": "phpunit", - "verify-callmap": "phpunit tests/Internal/Codebase/InternalCallMapHandlerTest.php", - "psalm": "@php ./psalm --find-dead-code", - "tests": [ - "@lint", - "@cs", - "@psalm", - "@phpunit" - ] - }, - "scripts-descriptions": { - "cs": "Checks that the code conforms to the coding standard.", - "cs-fix": "Automatically correct coding standard violations.", - "lint": "Runs unit tests.", - "phpunit": "Runs unit tests in parallel.", - "phpunit-std": "Runs unit tests.", - "psalm": "Runs static analysis.", - "tests": "Runs all available tests." - } -} diff --git a/vendor/vimeo/psalm/config.xsd b/vendor/vimeo/psalm/config.xsd deleted file mode 100644 index e942fcba..00000000 --- a/vendor/vimeo/psalm/config.xsd +++ /dev/null @@ -1,708 +0,0 @@ - - - - - - - - - - - - - - - - - - Deprecated. Replaced by documenting never as a return type. It is going to be removed in Psalm 5. - - - - - - - - - - - - - - - - - - - - - - - - - - Deprecated. Has no effect since Psalm 3 and is going to be removed in Psalm 5. - - - - - - - - - - Deprecated. PHPStorm now supports generics for the most part and @psalm- annotations can be used - - - - - - - - - - - - - - - Deprecated. Will be replaced by adding echo to forbiddenFunctions in Psalm 5. - - - - - - - - - - - - - Default is runtime-specific: if not present, Psalm will only load the Xdebug stub if psalm has unloaded the extension. - - - - - Deprecated. In Psalm 5 extensions will be loaded based on composer.json and overridden with enableExtensions/disableExtensions. - - - - - - - - - - - - Setting `totallyTyped` to `"true"` is equivalent to setting `errorLevel` to `"1"`. Setting `totallyTyped` to `"false"` is equivalent to setting `errorLevel` to `"2"` and `reportMixedIssues` to `"false"` - - - - - Deprecated. Replaced by `errorLevel` and `reportMixedIssues`. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/vimeo/psalm/dictionaries/CallMap.php b/vendor/vimeo/psalm/dictionaries/CallMap.php deleted file mode 100644 index 219e6372..00000000 --- a/vendor/vimeo/psalm/dictionaries/CallMap.php +++ /dev/null @@ -1,16820 +0,0 @@ -' => [', ''=>''] - * alternative signature for the same function - * '' => [', ''=>''] - * - * A '&' in front of the means the arg is always passed by reference. - * (i.e. ReflectionParameter->isPassedByReference()) - * This was previously only used in cases where the function actually created the - * variable in the local scope. - * Some reference arguments will have prefixes in to indicate the way the argument is used. - * Currently, the only prefixes with meaning are 'rw_' (read-write) and 'w_' (write). - * Those prefixes don't mean anything for non-references. - * Code using these signatures should remove those prefixes from messages rendered to the user. - * 1. '&rw_' indicates that a parameter with a value is expected to be passed in, and may be modified. - * Phan will warn if the variable has an incompatible type, or is undefined. - * 2. '&w_' indicates that a parameter is expected to be passed in, and the value will be ignored, and may be overwritten. - * 3. The absence of a prefix is treated by Phan the same way as having the prefix 'w_' (Some may be changed to 'rw_name'). These will have prefixes added later. - * - * So, for functions like sort() where technically the arg is by-ref, - * indicate the reference param's signature by-ref and read-write, - * as `'&rw_array'=>'array'` - * so that Phan won't create it in the local scope - * - * However, for a function like preg_match() where the 3rd arg is an array of sub-pattern matches (and optional), - * this arg needs to be marked as by-ref and write-only, as `'&w_matches='=>'array'`. - * - * A '=' following the indicates this arg is optional. - * - * The can begin with '...' to indicate the arg is variadic. - * '...args=' indicates it is both variadic and optional. - * - * Some reference arguments will have prefixes in to indicate the way the argument is used. - * Currently, the only prefixes with meaning are 'rw_' and 'w_'. - * Code using these signatures should remove those prefixes from messages rendered to the user. - * 1. '&rw_name' indicates that a parameter with a value is expected to be passed in, and may be modified. - * 2. '&w_name' indicates that a parameter is expected to be passed in, and the value will be ignored, and may be overwritten. - * - * This file contains the signatures for the most recent minor release of PHP supported by phan (php 7.2) - * - * Changes: - * - * In Phan 0.12.3, - * - * - This started using array shapes for union types (array{...}). - * - * \Phan\Language\UnionType->withFlattenedArrayShapeOrLiteralTypeInstances() may be of help to programmatically convert these to array|array - * - * - This started using array shapes with optional fields for union types (array{key?:int}). - * A `?` after the array shape field's key indicates that the field is optional. - * - * - This started adding param signatures and return signatures to `callable` types. - * E.g. 'usort' => ['bool', '&rw_array_arg'=>'array', 'cmp_function'=>'callable(mixed,mixed):int']. - * See NEWS.md for 0.12.3 for possible syntax. A suffix of `=` within `callable(...)` means that a parameter is optional. - * - * (Phan assumes that callbacks with optional arguments can be cast to callbacks with/without those args (Similar to inheritance checks) - * (e.g. callable(T1,T2=) can be cast to callable(T1) or callable(T1,T2), in the same way that a subclass would check). - * For some signatures, e.g. set_error_handler, this results in repetition, because callable(T1=) can't cast to callable(T1). - * - * Sources of stub info: - * - * 1. Reflection - * 2. docs.php.net's SVN repo or website, and examples (See internal/internalsignatures.php) - * - * See https://secure.php.net/manual/en/copyright.php - * - * The PHP manual text and comments are covered by the [Creative Commons Attribution 3.0 License](http://creativecommons.org/licenses/by/3.0/legalcode), - * copyright (c) the PHP Documentation Group - * 3. Various websites documenting individual extensions - * 4. PHPStorm stubs (For anything missing from the above sources) - * See internal/internalsignatures.php - * - * Available from https://github.com/JetBrains/phpstorm-stubs under the [Apache 2 license](https://www.apache.org/licenses/LICENSE-2.0) - * - * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file) - * - * Note: Some of Phan's inferences about return types are written as plugins for functions/methods where the return type depends on the parameter types. - * E.g. src/Phan/Plugin/Internal/DependentReturnTypeOverridePlugin.php is one plugin - */ -return [ -'_' => ['string', 'message'=>'string'], -'__halt_compiler' => ['void'], -'abs' => ['0|positive-int', 'num'=>'int'], -'abs\'1' => ['float', 'num'=>'float'], -'abs\'2' => ['numeric', 'num'=>'numeric'], -'accelerator_get_configuration' => ['array'], -'accelerator_get_scripts' => ['array'], -'accelerator_get_status' => ['array', 'fetch_scripts'=>'bool'], -'accelerator_reset' => [''], -'accelerator_set_status' => ['void', 'status'=>'bool'], -'acos' => ['float', 'num'=>'float'], -'acosh' => ['float', 'num'=>'float'], -'addcslashes' => ['string', 'string'=>'string', 'characters'=>'string'], -'addslashes' => ['string', 'string'=>'string'], -'AMQPBasicProperties::__construct' => ['void', 'content_type='=>'string', 'content_encoding='=>'string', 'headers='=>'array', 'delivery_mode='=>'int', 'priority='=>'int', 'correlation_id='=>'string', 'reply_to='=>'string', 'expiration='=>'string', 'message_id='=>'string', 'timestamp='=>'int', 'type='=>'string', 'user_id='=>'string', 'app_id='=>'string', 'cluster_id='=>'string'], -'AMQPBasicProperties::getAppId' => ['string'], -'AMQPBasicProperties::getClusterId' => ['string'], -'AMQPBasicProperties::getContentEncoding' => ['string'], -'AMQPBasicProperties::getContentType' => ['string'], -'AMQPBasicProperties::getCorrelationId' => ['string'], -'AMQPBasicProperties::getDeliveryMode' => ['int'], -'AMQPBasicProperties::getExpiration' => ['string'], -'AMQPBasicProperties::getHeaders' => ['array'], -'AMQPBasicProperties::getMessageId' => ['string'], -'AMQPBasicProperties::getPriority' => ['int'], -'AMQPBasicProperties::getReplyTo' => ['string'], -'AMQPBasicProperties::getTimestamp' => ['string'], -'AMQPBasicProperties::getType' => ['string'], -'AMQPBasicProperties::getUserId' => ['string'], -'AMQPChannel::__construct' => ['void', 'amqp_connection'=>'AMQPConnection'], -'AMQPChannel::basicRecover' => ['', 'requeue='=>'bool'], -'AMQPChannel::close' => [''], -'AMQPChannel::commitTransaction' => ['bool'], -'AMQPChannel::confirmSelect' => [''], -'AMQPChannel::getChannelId' => ['int'], -'AMQPChannel::getConnection' => ['AMQPConnection'], -'AMQPChannel::getConsumers' => ['AMQPQueue[]'], -'AMQPChannel::getPrefetchCount' => ['int'], -'AMQPChannel::getPrefetchSize' => ['int'], -'AMQPChannel::isConnected' => ['bool'], -'AMQPChannel::qos' => ['bool', 'size'=>'int', 'count'=>'int'], -'AMQPChannel::rollbackTransaction' => ['bool'], -'AMQPChannel::setConfirmCallback' => ['', 'ack_callback='=>'?callable', 'nack_callback='=>'?callable'], -'AMQPChannel::setPrefetchCount' => ['bool', 'count'=>'int'], -'AMQPChannel::setPrefetchSize' => ['bool', 'size'=>'int'], -'AMQPChannel::setReturnCallback' => ['', 'return_callback='=>'?callable'], -'AMQPChannel::startTransaction' => ['bool'], -'AMQPChannel::waitForBasicReturn' => ['', 'timeout='=>'float'], -'AMQPChannel::waitForConfirm' => ['', 'timeout='=>'float'], -'AMQPConnection::__construct' => ['void', 'credentials='=>'array'], -'AMQPConnection::connect' => ['bool'], -'AMQPConnection::disconnect' => ['bool'], -'AMQPConnection::getCACert' => ['string'], -'AMQPConnection::getCert' => ['string'], -'AMQPConnection::getHeartbeatInterval' => ['int'], -'AMQPConnection::getHost' => ['string'], -'AMQPConnection::getKey' => ['string'], -'AMQPConnection::getLogin' => ['string'], -'AMQPConnection::getMaxChannels' => ['?int'], -'AMQPConnection::getMaxFrameSize' => ['int'], -'AMQPConnection::getPassword' => ['string'], -'AMQPConnection::getPort' => ['int'], -'AMQPConnection::getReadTimeout' => ['float'], -'AMQPConnection::getTimeout' => ['float'], -'AMQPConnection::getUsedChannels' => ['int'], -'AMQPConnection::getVerify' => ['bool'], -'AMQPConnection::getVhost' => ['string'], -'AMQPConnection::getWriteTimeout' => ['float'], -'AMQPConnection::isConnected' => ['bool'], -'AMQPConnection::isPersistent' => ['?bool'], -'AMQPConnection::pconnect' => ['bool'], -'AMQPConnection::pdisconnect' => ['bool'], -'AMQPConnection::preconnect' => ['bool'], -'AMQPConnection::reconnect' => ['bool'], -'AMQPConnection::setCACert' => ['', 'cacert'=>'string'], -'AMQPConnection::setCert' => ['', 'cert'=>'string'], -'AMQPConnection::setHost' => ['bool', 'host'=>'string'], -'AMQPConnection::setKey' => ['', 'key'=>'string'], -'AMQPConnection::setLogin' => ['bool', 'login'=>'string'], -'AMQPConnection::setPassword' => ['bool', 'password'=>'string'], -'AMQPConnection::setPort' => ['bool', 'port'=>'int'], -'AMQPConnection::setReadTimeout' => ['bool', 'timeout'=>'int'], -'AMQPConnection::setTimeout' => ['bool', 'timeout'=>'int'], -'AMQPConnection::setVerify' => ['', 'verify'=>'bool'], -'AMQPConnection::setVhost' => ['bool', 'vhost'=>'string'], -'AMQPConnection::setWriteTimeout' => ['bool', 'timeout'=>'int'], -'AMQPDecimal::__construct' => ['void', 'exponent'=>'', 'significand'=>''], -'AMQPDecimal::getExponent' => ['int'], -'AMQPDecimal::getSignificand' => ['int'], -'AMQPEnvelope::__construct' => ['void'], -'AMQPEnvelope::getAppId' => ['string'], -'AMQPEnvelope::getBody' => ['string'], -'AMQPEnvelope::getClusterId' => ['string'], -'AMQPEnvelope::getConsumerTag' => ['string'], -'AMQPEnvelope::getContentEncoding' => ['string'], -'AMQPEnvelope::getContentType' => ['string'], -'AMQPEnvelope::getCorrelationId' => ['string'], -'AMQPEnvelope::getDeliveryMode' => ['int'], -'AMQPEnvelope::getDeliveryTag' => ['string'], -'AMQPEnvelope::getExchangeName' => ['string'], -'AMQPEnvelope::getExpiration' => ['string'], -'AMQPEnvelope::getHeader' => ['string|false', 'header_key'=>'string'], -'AMQPEnvelope::getHeaders' => ['array'], -'AMQPEnvelope::getMessageId' => ['string'], -'AMQPEnvelope::getPriority' => ['int'], -'AMQPEnvelope::getReplyTo' => ['string'], -'AMQPEnvelope::getRoutingKey' => ['string'], -'AMQPEnvelope::getTimeStamp' => ['string'], -'AMQPEnvelope::getType' => ['string'], -'AMQPEnvelope::getUserId' => ['string'], -'AMQPEnvelope::hasHeader' => ['bool', 'header_key'=>'string'], -'AMQPEnvelope::isRedelivery' => ['bool'], -'AMQPExchange::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'], -'AMQPExchange::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], -'AMQPExchange::declareExchange' => ['bool'], -'AMQPExchange::delete' => ['bool', 'exchangeName='=>'string', 'flags='=>'int'], -'AMQPExchange::getArgument' => ['int|string|false', 'key'=>'string'], -'AMQPExchange::getArguments' => ['array'], -'AMQPExchange::getChannel' => ['AMQPChannel'], -'AMQPExchange::getConnection' => ['AMQPConnection'], -'AMQPExchange::getFlags' => ['int'], -'AMQPExchange::getName' => ['string'], -'AMQPExchange::getType' => ['string'], -'AMQPExchange::hasArgument' => ['bool', 'key'=>'string'], -'AMQPExchange::publish' => ['bool', 'message'=>'string', 'routing_key='=>'string', 'flags='=>'int', 'attributes='=>'array'], -'AMQPExchange::setArgument' => ['bool', 'key'=>'string', 'value'=>'int|string'], -'AMQPExchange::setArguments' => ['bool', 'arguments'=>'array'], -'AMQPExchange::setFlags' => ['bool', 'flags'=>'int'], -'AMQPExchange::setName' => ['bool', 'exchange_name'=>'string'], -'AMQPExchange::setType' => ['bool', 'exchange_type'=>'string'], -'AMQPExchange::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], -'AMQPQueue::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'], -'AMQPQueue::ack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], -'AMQPQueue::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], -'AMQPQueue::cancel' => ['bool', 'consumer_tag='=>'string'], -'AMQPQueue::consume' => ['void', 'callback='=>'?callable', 'flags='=>'int', 'consumerTag='=>'string'], -'AMQPQueue::declareQueue' => ['int'], -'AMQPQueue::delete' => ['int', 'flags='=>'int'], -'AMQPQueue::get' => ['AMQPEnvelope|false', 'flags='=>'int'], -'AMQPQueue::getArgument' => ['int|string|false', 'key'=>'string'], -'AMQPQueue::getArguments' => ['array'], -'AMQPQueue::getChannel' => ['AMQPChannel'], -'AMQPQueue::getConnection' => ['AMQPConnection'], -'AMQPQueue::getConsumerTag' => ['?string'], -'AMQPQueue::getFlags' => ['int'], -'AMQPQueue::getName' => ['string'], -'AMQPQueue::hasArgument' => ['bool', 'key'=>'string'], -'AMQPQueue::nack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], -'AMQPQueue::purge' => ['bool'], -'AMQPQueue::reject' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], -'AMQPQueue::setArgument' => ['bool', 'key'=>'string', 'value'=>'mixed'], -'AMQPQueue::setArguments' => ['bool', 'arguments'=>'array'], -'AMQPQueue::setFlags' => ['bool', 'flags'=>'int'], -'AMQPQueue::setName' => ['bool', 'queue_name'=>'string'], -'AMQPQueue::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], -'AMQPTimestamp::__construct' => ['void', 'timestamp'=>'string'], -'AMQPTimestamp::__toString' => ['string'], -'AMQPTimestamp::getTimestamp' => ['string'], -'apache_child_terminate' => ['bool'], -'apache_get_modules' => ['array'], -'apache_get_version' => ['string|false'], -'apache_getenv' => ['string|false', 'variable'=>'string', 'walk_to_top='=>'bool'], -'apache_lookup_uri' => ['object', 'filename'=>'string'], -'apache_note' => ['string|false', 'note_name'=>'string', 'note_value='=>'string'], -'apache_request_headers' => ['array|false'], -'apache_reset_timeout' => ['bool'], -'apache_response_headers' => ['array|false'], -'apache_setenv' => ['bool', 'variable'=>'string', 'value'=>'string', 'walk_to_top='=>'bool'], -'apc_add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'ttl='=>'int'], -'apc_add\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], -'apc_bin_dump' => ['string|false|null', 'files='=>'array', 'user_vars='=>'array'], -'apc_bin_dumpfile' => ['int|false', 'files'=>'array', 'user_vars'=>'array', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], -'apc_bin_load' => ['bool', 'data'=>'string', 'flags='=>'int'], -'apc_bin_loadfile' => ['bool', 'filename'=>'string', 'context='=>'resource', 'flags='=>'int'], -'apc_cache_info' => ['array|false', 'cache_type='=>'string', 'limited='=>'bool'], -'apc_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'], -'apc_clear_cache' => ['bool', 'cache_type='=>'string'], -'apc_compile_file' => ['bool', 'filename'=>'string', 'atomic='=>'bool'], -'apc_dec' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool'], -'apc_define_constants' => ['bool', 'key'=>'string', 'constants'=>'array', 'case_sensitive='=>'bool'], -'apc_delete' => ['bool', 'key'=>'string|string[]|APCIterator'], -'apc_delete_file' => ['bool|string[]', 'keys'=>'mixed'], -'apc_exists' => ['bool', 'keys'=>'string'], -'apc_exists\'1' => ['array', 'keys'=>'string[]'], -'apc_fetch' => ['mixed|false', 'key'=>'string', '&w_success='=>'bool'], -'apc_fetch\'1' => ['array|false', 'key'=>'string[]', '&w_success='=>'bool'], -'apc_inc' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool'], -'apc_load_constants' => ['bool', 'key'=>'string', 'case_sensitive='=>'bool'], -'apc_sma_info' => ['array|false', 'limited='=>'bool'], -'apc_store' => ['bool', 'key'=>'string', 'var'=>'', 'ttl='=>'int'], -'apc_store\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], -'APCIterator::__construct' => ['void', 'cache'=>'string', 'search='=>'null|string|string[]', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'], -'APCIterator::current' => ['mixed|false'], -'APCIterator::getTotalCount' => ['int|false'], -'APCIterator::getTotalHits' => ['int|false'], -'APCIterator::getTotalSize' => ['int|false'], -'APCIterator::key' => ['string'], -'APCIterator::next' => ['void'], -'APCIterator::rewind' => ['void'], -'APCIterator::valid' => ['bool'], -'apcu_add' => ['bool', 'key'=>'string', 'var'=>'', 'ttl='=>'int'], -'apcu_add\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], -'apcu_cache_info' => ['array|false', 'limited='=>'bool'], -'apcu_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'], -'apcu_clear_cache' => ['bool'], -'apcu_dec' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'], -'apcu_delete' => ['bool', 'key'=>'string|APCuIterator'], -'apcu_delete\'1' => ['list', 'key'=>'string[]'], -'apcu_enabled' => ['bool'], -'apcu_entry' => ['mixed', 'key'=>'string', 'generator'=>'callable', 'ttl='=>'int'], -'apcu_exists' => ['bool', 'keys'=>'string'], -'apcu_exists\'1' => ['array', 'keys'=>'string[]'], -'apcu_fetch' => ['mixed|false', 'key'=>'string', '&w_success='=>'bool'], -'apcu_fetch\'1' => ['array|false', 'key'=>'string[]', '&w_success='=>'bool'], -'apcu_inc' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'], -'apcu_key_info' => ['?array', 'key'=>'string'], -'apcu_sma_info' => ['array|false', 'limited='=>'bool'], -'apcu_store' => ['bool', 'key'=>'string', 'var='=>'', 'ttl='=>'int'], -'apcu_store\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], -'APCuIterator::__construct' => ['void', 'search='=>'string|string[]|null', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'], -'APCuIterator::current' => ['mixed'], -'APCuIterator::getTotalCount' => ['int'], -'APCuIterator::getTotalHits' => ['int'], -'APCuIterator::getTotalSize' => ['int'], -'APCuIterator::key' => ['string'], -'APCuIterator::next' => ['void'], -'APCuIterator::rewind' => ['void'], -'APCuIterator::valid' => ['bool'], -'apd_breakpoint' => ['bool', 'debug_level'=>'int'], -'apd_callstack' => ['array'], -'apd_clunk' => ['void', 'warning'=>'string', 'delimiter='=>'string'], -'apd_continue' => ['bool', 'debug_level'=>'int'], -'apd_croak' => ['void', 'warning'=>'string', 'delimiter='=>'string'], -'apd_dump_function_table' => ['void'], -'apd_dump_persistent_resources' => ['array'], -'apd_dump_regular_resources' => ['array'], -'apd_echo' => ['bool', 'output'=>'string'], -'apd_get_active_symbols' => ['array'], -'apd_set_pprof_trace' => ['string', 'dump_directory='=>'string', 'fragment='=>'string'], -'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'], -'AppendIterator::__construct' => ['void'], -'AppendIterator::append' => ['void', 'iterator'=>'Iterator'], -'AppendIterator::current' => ['mixed'], -'AppendIterator::getArrayIterator' => ['ArrayIterator'], -'AppendIterator::getInnerIterator' => ['Iterator'], -'AppendIterator::getIteratorIndex' => ['int'], -'AppendIterator::key' => ['int|string|float|bool'], -'AppendIterator::next' => ['void'], -'AppendIterator::rewind' => ['void'], -'AppendIterator::valid' => ['bool'], -'ArgumentCountError::__clone' => ['void'], -'ArgumentCountError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], -'ArgumentCountError::__toString' => ['string'], -'ArgumentCountError::__wakeup' => ['void'], -'ArgumentCountError::getCode' => ['int'], -'ArgumentCountError::getFile' => ['string'], -'ArgumentCountError::getLine' => ['int'], -'ArgumentCountError::getMessage' => ['string'], -'ArgumentCountError::getPrevious' => ['?Throwable'], -'ArgumentCountError::getTrace' => ['list\',args?:array}>'], -'ArgumentCountError::getTraceAsString' => ['string'], -'ArithmeticError::__clone' => ['void'], -'ArithmeticError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], -'ArithmeticError::__toString' => ['string'], -'ArithmeticError::__wakeup' => ['void'], -'ArithmeticError::getCode' => ['int'], -'ArithmeticError::getFile' => ['string'], -'ArithmeticError::getLine' => ['int'], -'ArithmeticError::getMessage' => ['string'], -'ArithmeticError::getPrevious' => ['?Throwable'], -'ArithmeticError::getTrace' => ['list\',args?:array}>'], -'ArithmeticError::getTraceAsString' => ['string'], -'array_change_key_case' => ['associative-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_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_is_list' => ['bool', 'array'=>'array'], -'array_key_exists' => ['bool', 'key'=>'string|int', 'array'=>'array'], -'array_key_first' => ['int|string|null', 'array'=>'array'], -'array_key_last' => ['int|string|null', 'array'=>'array'], -'array_keys' => ['list', 'array'=>'array', 'filter_value='=>'mixed', 'strict='=>'bool'], -'array_map' => ['array', 'callback'=>'?callable', 'array'=>'array', '...arrays='=>'array'], -'array_merge' => ['array', '...arrays='=>'array'], -'array_merge_recursive' => ['array', '...arrays='=>'array'], -'array_multisort' => ['bool', '&rw_array'=>'array', 'rest='=>'array|int', 'array1_sort_flags='=>'array|int', '...args='=>'array|int'], -'array_pad' => ['array', 'array'=>'array', 'length'=>'int', 'value'=>'mixed'], -'array_pop' => ['mixed', '&rw_array'=>'array'], -'array_product' => ['int|float', 'array'=>'array'], -'array_push' => ['int', '&rw_array'=>'array', '...values='=>'mixed'], -'array_rand' => ['int|string|array|array', 'array'=>'non-empty-array', 'num'=>'int'], -'array_rand\'1' => ['int|string', 'array'=>'array'], -'array_reduce' => ['mixed', 'array'=>'array', 'callback'=>'callable(mixed,mixed):mixed', 'initial='=>'mixed'], -'array_replace' => ['array', 'array'=>'array', '...replacements='=>'array'], -'array_replace_recursive' => ['array', 'array'=>'array', '...replacements='=>'array'], -'array_reverse' => ['array', 'array'=>'array', 'preserve_keys='=>'bool'], -'array_search' => ['int|string|false', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'], -'array_shift' => ['mixed|null', '&rw_array'=>'array'], -'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_unique' => ['array', 'array'=>'array', 'flags='=>'0'], -'array_unique\'1' => ['array', 'array'=>'array', 'flags='=>'1'], -'array_unique\'2' => ['array', 'array'=>'array', 'flags='=>'2|5'], -'array_unshift' => ['int', '&rw_array'=>'array', '...values='=>'mixed'], -'array_values' => ['list', 'array'=>'array'], -'array_walk' => ['bool', '&rw_array'=>'array', 'callback'=>'callable', 'arg='=>'mixed'], -'array_walk\'1' => ['bool', '&rw_array'=>'object', 'callback'=>'callable', 'arg='=>'mixed'], -'array_walk_recursive' => ['bool', '&rw_array'=>'array', 'callback'=>'callable', 'arg='=>'mixed'], -'array_walk_recursive\'1' => ['bool', '&rw_array'=>'object', 'callback'=>'callable', 'arg='=>'mixed'], -'ArrayAccess::offsetExists' => ['bool', 'offset'=>'mixed'], -'ArrayAccess::offsetGet' => ['mixed', 'offset'=>'mixed'], -'ArrayAccess::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], -'ArrayAccess::offsetUnset' => ['void', 'offset'=>'mixed'], -'ArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'], -'ArrayIterator::append' => ['void', 'value'=>'mixed'], -'ArrayIterator::asort' => ['void'], -'ArrayIterator::count' => ['int'], -'ArrayIterator::current' => ['mixed'], -'ArrayIterator::getArrayCopy' => ['array'], -'ArrayIterator::getFlags' => ['int'], -'ArrayIterator::key' => ['int|string|false'], -'ArrayIterator::ksort' => ['void'], -'ArrayIterator::natcasesort' => ['void'], -'ArrayIterator::natsort' => ['void'], -'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::rewind' => ['void'], -'ArrayIterator::seek' => ['void', 'position'=>'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::valid' => ['bool'], -'ArrayObject::__construct' => ['void', 'input='=>'array|object', 'flags='=>'int', 'iterator_class='=>'string'], -'ArrayObject::append' => ['void', 'value'=>'mixed'], -'ArrayObject::asort' => ['void'], -'ArrayObject::count' => ['int'], -'ArrayObject::exchangeArray' => ['array', 'ar'=>'mixed'], -'ArrayObject::getArrayCopy' => ['array'], -'ArrayObject::getFlags' => ['int'], -'ArrayObject::getIterator' => ['ArrayIterator'], -'ArrayObject::getIteratorClass' => ['string'], -'ArrayObject::ksort' => ['void'], -'ArrayObject::natcasesort' => ['void'], -'ArrayObject::natsort' => ['void'], -'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::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'], -'arsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], -'asin' => ['float', 'num'=>'float'], -'asinh' => ['float', 'num'=>'float'], -'asort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], -'assert' => ['bool', 'assertion'=>'string|bool|int', 'description='=>'string|Throwable|null'], -'assert_options' => ['mixed|false', 'option'=>'int', 'value='=>'mixed'], -'ast\get_kind_name' => ['string', 'kind'=>'int'], -'ast\get_metadata' => ['array'], -'ast\get_supported_versions' => ['array', 'exclude_deprecated='=>'bool'], -'ast\kind_uses_flags' => ['bool', 'kind'=>'int'], -'ast\Node::__construct' => ['void', 'kind='=>'int', 'flags='=>'int', 'children='=>'ast\Node\Decl[]|ast\Node[]|int[]|string[]|float[]|bool[]|null[]', 'start_line='=>'int'], -'ast\parse_code' => ['ast\Node', 'code'=>'string', 'version'=>'int', 'filename='=>'string'], -'ast\parse_file' => ['ast\Node', 'filename'=>'string', 'version'=>'int'], -'atan' => ['float', 'num'=>'float'], -'atan2' => ['float', 'y'=>'float', 'x'=>'float'], -'atanh' => ['float', 'num'=>'float'], -'BadFunctionCallException::__clone' => ['void'], -'BadFunctionCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?BadFunctionCallException'], -'BadFunctionCallException::__toString' => ['string'], -'BadFunctionCallException::getCode' => ['int'], -'BadFunctionCallException::getFile' => ['string'], -'BadFunctionCallException::getLine' => ['int'], -'BadFunctionCallException::getMessage' => ['string'], -'BadFunctionCallException::getPrevious' => ['?Throwable|?BadFunctionCallException'], -'BadFunctionCallException::getTrace' => ['list\',args?:array}>'], -'BadFunctionCallException::getTraceAsString' => ['string'], -'BadMethodCallException::__clone' => ['void'], -'BadMethodCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?BadMethodCallException'], -'BadMethodCallException::__toString' => ['string'], -'BadMethodCallException::getCode' => ['int'], -'BadMethodCallException::getFile' => ['string'], -'BadMethodCallException::getLine' => ['int'], -'BadMethodCallException::getMessage' => ['string'], -'BadMethodCallException::getPrevious' => ['?Throwable|?BadMethodCallException'], -'BadMethodCallException::getTrace' => ['list\',args?:array}>'], -'BadMethodCallException::getTraceAsString' => ['string'], -'base64_decode' => ['string|false', 'string'=>'string', 'strict='=>'bool'], -'base64_encode' => ['string', 'string'=>'string'], -'base_convert' => ['string', 'num'=>'string', 'from_base'=>'int', 'to_base'=>'int'], -'basename' => ['string', 'path'=>'string', 'suffix='=>'string'], -'bbcode_add_element' => ['bool', 'bbcode_container'=>'resource', 'tag_name'=>'string', 'tag_rules'=>'array'], -'bbcode_add_smiley' => ['bool', 'bbcode_container'=>'resource', 'smiley'=>'string', 'replace_by'=>'string'], -'bbcode_create' => ['resource', 'bbcode_initial_tags='=>'array'], -'bbcode_destroy' => ['bool', 'bbcode_container'=>'resource'], -'bbcode_parse' => ['string', 'bbcode_container'=>'resource', 'to_parse'=>'string'], -'bbcode_set_arg_parser' => ['bool', 'bbcode_container'=>'resource', 'bbcode_arg_parser'=>'resource'], -'bbcode_set_flags' => ['bool', 'bbcode_container'=>'resource', 'flags'=>'int', 'mode='=>'int'], -'bcadd' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], -'bccomp' => ['int', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], -'bcdiv' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int|null'], -'bcmod' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int|null'], -'bcmul' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], -'bcompiler_load' => ['bool', 'filename'=>'string'], -'bcompiler_load_exe' => ['bool', 'filename'=>'string'], -'bcompiler_parse_class' => ['bool', 'class'=>'string', 'callback'=>'string'], -'bcompiler_read' => ['bool', 'filehandle'=>'resource'], -'bcompiler_write_class' => ['bool', 'filehandle'=>'resource', 'classname'=>'string', 'extends='=>'string'], -'bcompiler_write_constant' => ['bool', 'filehandle'=>'resource', 'constantname'=>'string'], -'bcompiler_write_exe_footer' => ['bool', 'filehandle'=>'resource', 'startpos'=>'int'], -'bcompiler_write_file' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], -'bcompiler_write_footer' => ['bool', 'filehandle'=>'resource'], -'bcompiler_write_function' => ['bool', 'filehandle'=>'resource', 'functionname'=>'string'], -'bcompiler_write_functions_from_file' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], -'bcompiler_write_header' => ['bool', 'filehandle'=>'resource', 'write_ver='=>'string'], -'bcompiler_write_included_filename' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], -'bcpow' => ['numeric-string', 'num'=>'numeric-string', 'exponent'=>'numeric-string', 'scale='=>'int|null'], -'bcpowmod' => ['numeric-string|false', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'modulus'=>'numeric-string', 'scale='=>'int|null'], -'bcscale' => ['int', 'scale='=>'int|null'], -'bcsqrt' => ['numeric-string|null', 'num'=>'numeric-string', 'scale='=>'int|null'], -'bcsub' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], -'bin2hex' => ['string', 'string'=>'string'], -'bind_textdomain_codeset' => ['string', 'domain'=>'string', 'codeset'=>'string'], -'bindec' => ['float|int', 'binary_string'=>'string'], -'bindtextdomain' => ['string', 'domain'=>'string', 'directory'=>'string'], -'birdstep_autocommit' => ['bool', 'index'=>'int'], -'birdstep_close' => ['bool', 'id'=>'int'], -'birdstep_commit' => ['bool', 'index'=>'int'], -'birdstep_connect' => ['int', 'server'=>'string', 'user'=>'string', 'pass'=>'string'], -'birdstep_exec' => ['int', 'index'=>'int', 'exec_str'=>'string'], -'birdstep_fetch' => ['bool', 'index'=>'int'], -'birdstep_fieldname' => ['string', 'index'=>'int', 'col'=>'int'], -'birdstep_fieldnum' => ['int', 'index'=>'int'], -'birdstep_freeresult' => ['bool', 'index'=>'int'], -'birdstep_off_autocommit' => ['bool', 'index'=>'int'], -'birdstep_result' => ['', 'index'=>'int', 'col'=>''], -'birdstep_rollback' => ['bool', 'index'=>'int'], -'blenc_encrypt' => ['string', 'plaintext'=>'string', 'encodedfile'=>'string', 'encryption_key='=>'string'], -'boolval' => ['bool', 'value'=>'mixed'], -'bson_decode' => ['array', 'bson'=>'string'], -'bson_encode' => ['string', 'anything'=>'mixed'], -'bzclose' => ['bool', 'bz'=>'resource'], -'bzcompress' => ['string|int', 'data'=>'string', 'block_size='=>'int', 'work_factor='=>'int'], -'bzdecompress' => ['string|int', 'data'=>'string', 'use_less_memory='=>'int'], -'bzerrno' => ['int', 'bz'=>'resource'], -'bzerror' => ['array', 'bz'=>'resource'], -'bzerrstr' => ['string', 'bz'=>'resource'], -'bzflush' => ['bool', 'bz'=>'resource'], -'bzopen' => ['resource|false', 'file'=>'string|resource', 'mode'=>'string'], -'bzread' => ['string|false', 'bz'=>'resource', 'length='=>'int'], -'bzwrite' => ['int|false', 'bz'=>'resource', 'data'=>'string', 'length='=>'int'], -'CachingIterator::__construct' => ['void', 'iterator'=>'Iterator', 'flags='=>''], -'CachingIterator::__toString' => ['string'], -'CachingIterator::count' => ['int'], -'CachingIterator::current' => ['mixed'], -'CachingIterator::getCache' => ['array'], -'CachingIterator::getFlags' => ['int'], -'CachingIterator::getInnerIterator' => ['Iterator'], -'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::rewind' => ['void'], -'CachingIterator::setFlags' => ['void', 'flags'=>'int'], -'CachingIterator::valid' => ['bool'], -'Cairo::availableFonts' => ['array'], -'Cairo::availableSurfaces' => ['array'], -'Cairo::statusToString' => ['string', 'status'=>'int'], -'Cairo::version' => ['int'], -'Cairo::versionString' => ['string'], -'cairo_append_path' => ['', 'path'=>'cairopath', 'context'=>'cairocontext'], -'cairo_arc' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], -'cairo_arc_negative' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], -'cairo_available_fonts' => ['array'], -'cairo_available_surfaces' => ['array'], -'cairo_clip' => ['', 'context'=>'cairocontext'], -'cairo_clip_extents' => ['array', 'context'=>'cairocontext'], -'cairo_clip_preserve' => ['', 'context'=>'cairocontext'], -'cairo_clip_rectangle_list' => ['array', 'context'=>'cairocontext'], -'cairo_close_path' => ['', 'context'=>'cairocontext'], -'cairo_copy_page' => ['', 'context'=>'cairocontext'], -'cairo_copy_path' => ['CairoPath', 'context'=>'cairocontext'], -'cairo_copy_path_flat' => ['CairoPath', 'context'=>'cairocontext'], -'cairo_create' => ['CairoContext', 'surface'=>'cairosurface'], -'cairo_curve_to' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float', 'context'=>'cairocontext'], -'cairo_device_to_user' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], -'cairo_device_to_user_distance' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], -'cairo_fill' => ['', 'context'=>'cairocontext'], -'cairo_fill_extents' => ['array', 'context'=>'cairocontext'], -'cairo_fill_preserve' => ['', 'context'=>'cairocontext'], -'cairo_font_extents' => ['array', 'context'=>'cairocontext'], -'cairo_font_face_get_type' => ['int', 'fontface'=>'cairofontface'], -'cairo_font_face_status' => ['int', 'fontface'=>'cairofontface'], -'cairo_font_options_create' => ['CairoFontOptions'], -'cairo_font_options_equal' => ['bool', 'options'=>'cairofontoptions', 'other'=>'cairofontoptions'], -'cairo_font_options_get_antialias' => ['int', 'options'=>'cairofontoptions'], -'cairo_font_options_get_hint_metrics' => ['int', 'options'=>'cairofontoptions'], -'cairo_font_options_get_hint_style' => ['int', 'options'=>'cairofontoptions'], -'cairo_font_options_get_subpixel_order' => ['int', 'options'=>'cairofontoptions'], -'cairo_font_options_hash' => ['int', 'options'=>'cairofontoptions'], -'cairo_font_options_merge' => ['void', 'options'=>'cairofontoptions', 'other'=>'cairofontoptions'], -'cairo_font_options_set_antialias' => ['void', 'options'=>'cairofontoptions', 'antialias'=>'int'], -'cairo_font_options_set_hint_metrics' => ['void', 'options'=>'cairofontoptions', 'hint_metrics'=>'int'], -'cairo_font_options_set_hint_style' => ['void', 'options'=>'cairofontoptions', 'hint_style'=>'int'], -'cairo_font_options_set_subpixel_order' => ['void', 'options'=>'cairofontoptions', 'subpixel_order'=>'int'], -'cairo_font_options_status' => ['int', 'options'=>'cairofontoptions'], -'cairo_format_stride_for_width' => ['int', 'format'=>'int', 'width'=>'int'], -'cairo_get_antialias' => ['int', 'context'=>'cairocontext'], -'cairo_get_current_point' => ['array', 'context'=>'cairocontext'], -'cairo_get_dash' => ['array', 'context'=>'cairocontext'], -'cairo_get_dash_count' => ['int', 'context'=>'cairocontext'], -'cairo_get_fill_rule' => ['int', 'context'=>'cairocontext'], -'cairo_get_font_face' => ['', 'context'=>'cairocontext'], -'cairo_get_font_matrix' => ['', 'context'=>'cairocontext'], -'cairo_get_font_options' => ['', 'context'=>'cairocontext'], -'cairo_get_group_target' => ['', 'context'=>'cairocontext'], -'cairo_get_line_cap' => ['int', 'context'=>'cairocontext'], -'cairo_get_line_join' => ['int', 'context'=>'cairocontext'], -'cairo_get_line_width' => ['float', 'context'=>'cairocontext'], -'cairo_get_matrix' => ['', 'context'=>'cairocontext'], -'cairo_get_miter_limit' => ['float', 'context'=>'cairocontext'], -'cairo_get_operator' => ['int', 'context'=>'cairocontext'], -'cairo_get_scaled_font' => ['', 'context'=>'cairocontext'], -'cairo_get_source' => ['', 'context'=>'cairocontext'], -'cairo_get_target' => ['', 'context'=>'cairocontext'], -'cairo_get_tolerance' => ['float', 'context'=>'cairocontext'], -'cairo_glyph_path' => ['', 'glyphs'=>'array', 'context'=>'cairocontext'], -'cairo_has_current_point' => ['bool', 'context'=>'cairocontext'], -'cairo_identity_matrix' => ['', 'context'=>'cairocontext'], -'cairo_image_surface_create' => ['CairoImageSurface', 'format'=>'int', 'width'=>'int', 'height'=>'int'], -'cairo_image_surface_create_for_data' => ['CairoImageSurface', 'data'=>'string', 'format'=>'int', 'width'=>'int', 'height'=>'int', 'stride='=>'int'], -'cairo_image_surface_create_from_png' => ['CairoImageSurface', 'file'=>'string'], -'cairo_image_surface_get_data' => ['string', 'surface'=>'cairoimagesurface'], -'cairo_image_surface_get_format' => ['int', 'surface'=>'cairoimagesurface'], -'cairo_image_surface_get_height' => ['int', 'surface'=>'cairoimagesurface'], -'cairo_image_surface_get_stride' => ['int', 'surface'=>'cairoimagesurface'], -'cairo_image_surface_get_width' => ['int', 'surface'=>'cairoimagesurface'], -'cairo_in_fill' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'cairo_in_stroke' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'cairo_line_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'cairo_mask' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], -'cairo_mask_surface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], -'cairo_matrix_create_scale' => ['object', 'sx'=>'float', 'sy'=>'float'], -'cairo_matrix_init' => ['object', 'xx='=>'float', 'yx='=>'float', 'xy='=>'float', 'yy='=>'float', 'x0='=>'float', 'y0='=>'float'], -'cairo_matrix_init_identity' => ['object'], -'cairo_matrix_init_rotate' => ['object', 'radians'=>'float'], -'cairo_matrix_init_scale' => ['object', 'sx'=>'float', 'sy'=>'float'], -'cairo_matrix_init_translate' => ['object', 'tx'=>'float', 'ty'=>'float'], -'cairo_matrix_invert' => ['void', 'matrix'=>'cairomatrix'], -'cairo_matrix_multiply' => ['CairoMatrix', 'matrix1'=>'cairomatrix', 'matrix2'=>'cairomatrix'], -'cairo_matrix_rotate' => ['', 'matrix'=>'cairomatrix', 'radians'=>'float'], -'cairo_matrix_scale' => ['', 'sx'=>'float', 'sy'=>'float', 'context'=>'cairocontext'], -'cairo_matrix_transform_distance' => ['array', 'matrix'=>'cairomatrix', 'dx'=>'float', 'dy'=>'float'], -'cairo_matrix_transform_point' => ['array', 'matrix'=>'cairomatrix', 'dx'=>'float', 'dy'=>'float'], -'cairo_matrix_translate' => ['void', 'matrix'=>'cairomatrix', 'tx'=>'float', 'ty'=>'float'], -'cairo_move_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'cairo_new_path' => ['', 'context'=>'cairocontext'], -'cairo_new_sub_path' => ['', 'context'=>'cairocontext'], -'cairo_paint' => ['', 'context'=>'cairocontext'], -'cairo_paint_with_alpha' => ['', 'alpha'=>'string', 'context'=>'cairocontext'], -'cairo_path_extents' => ['array', 'context'=>'cairocontext'], -'cairo_pattern_add_color_stop_rgb' => ['void', 'pattern'=>'cairogradientpattern', 'offset'=>'float', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'cairo_pattern_add_color_stop_rgba' => ['void', 'pattern'=>'cairogradientpattern', 'offset'=>'float', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha'=>'float'], -'cairo_pattern_create_for_surface' => ['CairoPattern', 'surface'=>'cairosurface'], -'cairo_pattern_create_linear' => ['CairoPattern', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float'], -'cairo_pattern_create_radial' => ['CairoPattern', 'x0'=>'float', 'y0'=>'float', 'r0'=>'float', 'x1'=>'float', 'y1'=>'float', 'r1'=>'float'], -'cairo_pattern_create_rgb' => ['CairoPattern', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'cairo_pattern_create_rgba' => ['CairoPattern', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha'=>'float'], -'cairo_pattern_get_color_stop_count' => ['int', 'pattern'=>'cairogradientpattern'], -'cairo_pattern_get_color_stop_rgba' => ['array', 'pattern'=>'cairogradientpattern', 'index'=>'int'], -'cairo_pattern_get_extend' => ['int', 'pattern'=>'string'], -'cairo_pattern_get_filter' => ['int', 'pattern'=>'cairosurfacepattern'], -'cairo_pattern_get_linear_points' => ['array', 'pattern'=>'cairolineargradient'], -'cairo_pattern_get_matrix' => ['CairoMatrix', 'pattern'=>'cairopattern'], -'cairo_pattern_get_radial_circles' => ['array', 'pattern'=>'cairoradialgradient'], -'cairo_pattern_get_rgba' => ['array', 'pattern'=>'cairosolidpattern'], -'cairo_pattern_get_surface' => ['CairoSurface', 'pattern'=>'cairosurfacepattern'], -'cairo_pattern_get_type' => ['int', 'pattern'=>'cairopattern'], -'cairo_pattern_set_extend' => ['void', 'pattern'=>'string', 'extend'=>'string'], -'cairo_pattern_set_filter' => ['void', 'pattern'=>'cairosurfacepattern', 'filter'=>'int'], -'cairo_pattern_set_matrix' => ['void', 'pattern'=>'cairopattern', 'matrix'=>'cairomatrix'], -'cairo_pattern_status' => ['int', 'pattern'=>'cairopattern'], -'cairo_pdf_surface_create' => ['CairoPdfSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], -'cairo_pdf_surface_set_size' => ['void', 'surface'=>'cairopdfsurface', 'width'=>'float', 'height'=>'float'], -'cairo_pop_group' => ['', 'context'=>'cairocontext'], -'cairo_pop_group_to_source' => ['', 'context'=>'cairocontext'], -'cairo_ps_get_levels' => ['array'], -'cairo_ps_level_to_string' => ['string', 'level'=>'int'], -'cairo_ps_surface_create' => ['CairoPsSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], -'cairo_ps_surface_dsc_begin_page_setup' => ['void', 'surface'=>'cairopssurface'], -'cairo_ps_surface_dsc_begin_setup' => ['void', 'surface'=>'cairopssurface'], -'cairo_ps_surface_dsc_comment' => ['void', 'surface'=>'cairopssurface', 'comment'=>'string'], -'cairo_ps_surface_get_eps' => ['bool', 'surface'=>'cairopssurface'], -'cairo_ps_surface_restrict_to_level' => ['void', 'surface'=>'cairopssurface', 'level'=>'int'], -'cairo_ps_surface_set_eps' => ['void', 'surface'=>'cairopssurface', 'level'=>'bool'], -'cairo_ps_surface_set_size' => ['void', 'surface'=>'cairopssurface', 'width'=>'float', 'height'=>'float'], -'cairo_push_group' => ['', 'context'=>'cairocontext'], -'cairo_push_group_with_content' => ['', 'content'=>'string', 'context'=>'cairocontext'], -'cairo_rectangle' => ['', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string', 'context'=>'cairocontext'], -'cairo_rel_curve_to' => ['', 'x1'=>'string', 'y1'=>'string', 'x2'=>'string', 'y2'=>'string', 'x3'=>'string', 'y3'=>'string', 'context'=>'cairocontext'], -'cairo_rel_line_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'cairo_rel_move_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'cairo_reset_clip' => ['', 'context'=>'cairocontext'], -'cairo_restore' => ['', 'context'=>'cairocontext'], -'cairo_rotate' => ['', 'sx'=>'string', 'sy'=>'string', 'context'=>'cairocontext', 'angle'=>'string'], -'cairo_save' => ['', 'context'=>'cairocontext'], -'cairo_scale' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'cairo_scaled_font_create' => ['CairoScaledFont', 'fontface'=>'cairofontface', 'matrix'=>'cairomatrix', 'ctm'=>'cairomatrix', 'fontoptions'=>'cairofontoptions'], -'cairo_scaled_font_extents' => ['array', 'scaledfont'=>'cairoscaledfont'], -'cairo_scaled_font_get_ctm' => ['CairoMatrix', 'scaledfont'=>'cairoscaledfont'], -'cairo_scaled_font_get_font_face' => ['CairoFontFace', 'scaledfont'=>'cairoscaledfont'], -'cairo_scaled_font_get_font_matrix' => ['CairoFontOptions', 'scaledfont'=>'cairoscaledfont'], -'cairo_scaled_font_get_font_options' => ['CairoFontOptions', 'scaledfont'=>'cairoscaledfont'], -'cairo_scaled_font_get_scale_matrix' => ['CairoMatrix', 'scaledfont'=>'cairoscaledfont'], -'cairo_scaled_font_get_type' => ['int', 'scaledfont'=>'cairoscaledfont'], -'cairo_scaled_font_glyph_extents' => ['array', 'scaledfont'=>'cairoscaledfont', 'glyphs'=>'array'], -'cairo_scaled_font_status' => ['int', 'scaledfont'=>'cairoscaledfont'], -'cairo_scaled_font_text_extents' => ['array', 'scaledfont'=>'cairoscaledfont', 'text'=>'string'], -'cairo_select_font_face' => ['', 'family'=>'string', 'slant='=>'string', 'weight='=>'string', 'context='=>'cairocontext'], -'cairo_set_antialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], -'cairo_set_dash' => ['', 'dashes'=>'array', 'offset='=>'string', 'context='=>'cairocontext'], -'cairo_set_fill_rule' => ['', 'setting'=>'string', 'context'=>'cairocontext'], -'cairo_set_font_face' => ['', 'fontface'=>'cairofontface', 'context'=>'cairocontext'], -'cairo_set_font_matrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], -'cairo_set_font_options' => ['', 'fontoptions'=>'cairofontoptions', 'context'=>'cairocontext'], -'cairo_set_font_size' => ['', 'size'=>'string', 'context'=>'cairocontext'], -'cairo_set_line_cap' => ['', 'setting'=>'string', 'context'=>'cairocontext'], -'cairo_set_line_join' => ['', 'setting'=>'string', 'context'=>'cairocontext'], -'cairo_set_line_width' => ['', 'width'=>'string', 'context'=>'cairocontext'], -'cairo_set_matrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], -'cairo_set_miter_limit' => ['', 'limit'=>'string', 'context'=>'cairocontext'], -'cairo_set_operator' => ['', 'setting'=>'string', 'context'=>'cairocontext'], -'cairo_set_scaled_font' => ['', 'scaledfont'=>'cairoscaledfont', 'context'=>'cairocontext'], -'cairo_set_source' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], -'cairo_set_source_surface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], -'cairo_set_tolerance' => ['', 'tolerance'=>'string', 'context'=>'cairocontext'], -'cairo_show_page' => ['', 'context'=>'cairocontext'], -'cairo_show_text' => ['', 'text'=>'string', 'context'=>'cairocontext'], -'cairo_status' => ['int', 'context'=>'cairocontext'], -'cairo_status_to_string' => ['string', 'status'=>'int'], -'cairo_stroke' => ['', 'context'=>'cairocontext'], -'cairo_stroke_extents' => ['array', 'context'=>'cairocontext'], -'cairo_stroke_preserve' => ['', 'context'=>'cairocontext'], -'cairo_surface_copy_page' => ['void', 'surface'=>'cairosurface'], -'cairo_surface_create_similar' => ['CairoSurface', 'surface'=>'cairosurface', 'content'=>'int', 'width'=>'float', 'height'=>'float'], -'cairo_surface_finish' => ['void', 'surface'=>'cairosurface'], -'cairo_surface_flush' => ['void', 'surface'=>'cairosurface'], -'cairo_surface_get_content' => ['int', 'surface'=>'cairosurface'], -'cairo_surface_get_device_offset' => ['array', 'surface'=>'cairosurface'], -'cairo_surface_get_font_options' => ['CairoFontOptions', 'surface'=>'cairosurface'], -'cairo_surface_get_type' => ['int', 'surface'=>'cairosurface'], -'cairo_surface_mark_dirty' => ['void', 'surface'=>'cairosurface'], -'cairo_surface_mark_dirty_rectangle' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], -'cairo_surface_set_device_offset' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float'], -'cairo_surface_set_fallback_resolution' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float'], -'cairo_surface_show_page' => ['void', 'surface'=>'cairosurface'], -'cairo_surface_status' => ['int', 'surface'=>'cairosurface'], -'cairo_surface_write_to_png' => ['void', 'surface'=>'cairosurface', 'stream'=>'resource'], -'cairo_svg_get_versions' => ['array'], -'cairo_svg_surface_create' => ['CairoSvgSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], -'cairo_svg_surface_get_versions' => ['array'], -'cairo_svg_surface_restrict_to_version' => ['void', 'surface'=>'cairosvgsurface', 'version'=>'int'], -'cairo_svg_version_to_string' => ['string', 'version'=>'int'], -'cairo_text_extents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], -'cairo_text_path' => ['', 'string'=>'string', 'context'=>'cairocontext', 'text'=>'string'], -'cairo_transform' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], -'cairo_translate' => ['', 'tx'=>'string', 'ty'=>'string', 'context'=>'cairocontext', 'x'=>'string', 'y'=>'string'], -'cairo_user_to_device' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'cairo_user_to_device_distance' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'cairo_version' => ['int'], -'cairo_version_string' => ['string'], -'CairoContext::__construct' => ['void', 'surface'=>'CairoSurface'], -'CairoContext::appendPath' => ['', 'path'=>'cairopath', 'context'=>'cairocontext'], -'CairoContext::arc' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], -'CairoContext::arcNegative' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], -'CairoContext::clip' => ['', 'context'=>'cairocontext'], -'CairoContext::clipExtents' => ['array', 'context'=>'cairocontext'], -'CairoContext::clipPreserve' => ['', 'context'=>'cairocontext'], -'CairoContext::clipRectangleList' => ['array', 'context'=>'cairocontext'], -'CairoContext::closePath' => ['', 'context'=>'cairocontext'], -'CairoContext::copyPage' => ['', 'context'=>'cairocontext'], -'CairoContext::copyPath' => ['CairoPath', 'context'=>'cairocontext'], -'CairoContext::copyPathFlat' => ['CairoPath', 'context'=>'cairocontext'], -'CairoContext::curveTo' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float', 'context'=>'cairocontext'], -'CairoContext::deviceToUser' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], -'CairoContext::deviceToUserDistance' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], -'CairoContext::fill' => ['', 'context'=>'cairocontext'], -'CairoContext::fillExtents' => ['array', 'context'=>'cairocontext'], -'CairoContext::fillPreserve' => ['', 'context'=>'cairocontext'], -'CairoContext::fontExtents' => ['array', 'context'=>'cairocontext'], -'CairoContext::getAntialias' => ['int', 'context'=>'cairocontext'], -'CairoContext::getCurrentPoint' => ['array', 'context'=>'cairocontext'], -'CairoContext::getDash' => ['array', 'context'=>'cairocontext'], -'CairoContext::getDashCount' => ['int', 'context'=>'cairocontext'], -'CairoContext::getFillRule' => ['int', 'context'=>'cairocontext'], -'CairoContext::getFontFace' => ['', 'context'=>'cairocontext'], -'CairoContext::getFontMatrix' => ['', 'context'=>'cairocontext'], -'CairoContext::getFontOptions' => ['', 'context'=>'cairocontext'], -'CairoContext::getGroupTarget' => ['', 'context'=>'cairocontext'], -'CairoContext::getLineCap' => ['int', 'context'=>'cairocontext'], -'CairoContext::getLineJoin' => ['int', 'context'=>'cairocontext'], -'CairoContext::getLineWidth' => ['float', 'context'=>'cairocontext'], -'CairoContext::getMatrix' => ['', 'context'=>'cairocontext'], -'CairoContext::getMiterLimit' => ['float', 'context'=>'cairocontext'], -'CairoContext::getOperator' => ['int', 'context'=>'cairocontext'], -'CairoContext::getScaledFont' => ['', 'context'=>'cairocontext'], -'CairoContext::getSource' => ['', 'context'=>'cairocontext'], -'CairoContext::getTarget' => ['', 'context'=>'cairocontext'], -'CairoContext::getTolerance' => ['float', 'context'=>'cairocontext'], -'CairoContext::glyphPath' => ['', 'glyphs'=>'array', 'context'=>'cairocontext'], -'CairoContext::hasCurrentPoint' => ['bool', 'context'=>'cairocontext'], -'CairoContext::identityMatrix' => ['', 'context'=>'cairocontext'], -'CairoContext::inFill' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'CairoContext::inStroke' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'CairoContext::lineTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'CairoContext::mask' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], -'CairoContext::maskSurface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], -'CairoContext::moveTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'CairoContext::newPath' => ['', 'context'=>'cairocontext'], -'CairoContext::newSubPath' => ['', 'context'=>'cairocontext'], -'CairoContext::paint' => ['', 'context'=>'cairocontext'], -'CairoContext::paintWithAlpha' => ['', 'alpha'=>'string', 'context'=>'cairocontext'], -'CairoContext::pathExtents' => ['array', 'context'=>'cairocontext'], -'CairoContext::popGroup' => ['', 'context'=>'cairocontext'], -'CairoContext::popGroupToSource' => ['', 'context'=>'cairocontext'], -'CairoContext::pushGroup' => ['', 'context'=>'cairocontext'], -'CairoContext::pushGroupWithContent' => ['', 'content'=>'string', 'context'=>'cairocontext'], -'CairoContext::rectangle' => ['', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string', 'context'=>'cairocontext'], -'CairoContext::relCurveTo' => ['', 'x1'=>'string', 'y1'=>'string', 'x2'=>'string', 'y2'=>'string', 'x3'=>'string', 'y3'=>'string', 'context'=>'cairocontext'], -'CairoContext::relLineTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'CairoContext::relMoveTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'CairoContext::resetClip' => ['', 'context'=>'cairocontext'], -'CairoContext::restore' => ['', 'context'=>'cairocontext'], -'CairoContext::rotate' => ['', 'angle'=>'string', 'context'=>'cairocontext'], -'CairoContext::save' => ['', 'context'=>'cairocontext'], -'CairoContext::scale' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'CairoContext::selectFontFace' => ['', 'family'=>'string', 'slant='=>'string', 'weight='=>'string', 'context='=>'cairocontext'], -'CairoContext::setAntialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], -'CairoContext::setDash' => ['', 'dashes'=>'array', 'offset='=>'string', 'context='=>'cairocontext'], -'CairoContext::setFillRule' => ['', 'setting'=>'string', 'context'=>'cairocontext'], -'CairoContext::setFontFace' => ['', 'fontface'=>'cairofontface', 'context'=>'cairocontext'], -'CairoContext::setFontMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], -'CairoContext::setFontOptions' => ['', 'fontoptions'=>'cairofontoptions', 'context'=>'cairocontext'], -'CairoContext::setFontSize' => ['', 'size'=>'string', 'context'=>'cairocontext'], -'CairoContext::setLineCap' => ['', 'setting'=>'string', 'context'=>'cairocontext'], -'CairoContext::setLineJoin' => ['', 'setting'=>'string', 'context'=>'cairocontext'], -'CairoContext::setLineWidth' => ['', 'width'=>'string', 'context'=>'cairocontext'], -'CairoContext::setMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], -'CairoContext::setMiterLimit' => ['', 'limit'=>'string', 'context'=>'cairocontext'], -'CairoContext::setOperator' => ['', 'setting'=>'string', 'context'=>'cairocontext'], -'CairoContext::setScaledFont' => ['', 'scaledfont'=>'cairoscaledfont', 'context'=>'cairocontext'], -'CairoContext::setSource' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], -'CairoContext::setSourceRGB' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], -'CairoContext::setSourceRGBA' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], -'CairoContext::setSourceSurface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], -'CairoContext::setTolerance' => ['', 'tolerance'=>'string', 'context'=>'cairocontext'], -'CairoContext::showPage' => ['', 'context'=>'cairocontext'], -'CairoContext::showText' => ['', 'text'=>'string', 'context'=>'cairocontext'], -'CairoContext::status' => ['int', 'context'=>'cairocontext'], -'CairoContext::stroke' => ['', 'context'=>'cairocontext'], -'CairoContext::strokeExtents' => ['array', 'context'=>'cairocontext'], -'CairoContext::strokePreserve' => ['', 'context'=>'cairocontext'], -'CairoContext::textExtents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], -'CairoContext::textPath' => ['', 'string'=>'string', 'context'=>'cairocontext', 'text'=>'string'], -'CairoContext::transform' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], -'CairoContext::translate' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'CairoContext::userToDevice' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'CairoContext::userToDeviceDistance' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], -'CairoFontFace::__construct' => ['void'], -'CairoFontFace::getType' => ['int'], -'CairoFontFace::status' => ['int', 'fontface'=>'cairofontface'], -'CairoFontOptions::__construct' => ['void'], -'CairoFontOptions::equal' => ['bool', 'other'=>'string'], -'CairoFontOptions::getAntialias' => ['int', 'context'=>'cairocontext'], -'CairoFontOptions::getHintMetrics' => ['int'], -'CairoFontOptions::getHintStyle' => ['int'], -'CairoFontOptions::getSubpixelOrder' => ['int'], -'CairoFontOptions::hash' => ['int'], -'CairoFontOptions::merge' => ['void', 'other'=>'string'], -'CairoFontOptions::setAntialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], -'CairoFontOptions::setHintMetrics' => ['void', 'hint_metrics'=>'string'], -'CairoFontOptions::setHintStyle' => ['void', 'hint_style'=>'string'], -'CairoFontOptions::setSubpixelOrder' => ['void', 'subpixel_order'=>'string'], -'CairoFontOptions::status' => ['int', 'context'=>'cairocontext'], -'CairoFormat::strideForWidth' => ['int', 'format'=>'int', 'width'=>'int'], -'CairoGradientPattern::addColorStopRgb' => ['void', 'offset'=>'string', 'red'=>'string', 'green'=>'string', 'blue'=>'string'], -'CairoGradientPattern::addColorStopRgba' => ['void', 'offset'=>'string', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string'], -'CairoGradientPattern::getColorStopCount' => ['int'], -'CairoGradientPattern::getColorStopRgba' => ['array', 'index'=>'string'], -'CairoGradientPattern::getExtend' => ['int'], -'CairoGradientPattern::setExtend' => ['void', 'extend'=>'int'], -'CairoImageSurface::__construct' => ['void', 'format'=>'int', 'width'=>'int', 'height'=>'int'], -'CairoImageSurface::createForData' => ['void', 'data'=>'string', 'format'=>'int', 'width'=>'int', 'height'=>'int', 'stride='=>'int'], -'CairoImageSurface::createFromPng' => ['CairoImageSurface', 'file'=>'string'], -'CairoImageSurface::getData' => ['string'], -'CairoImageSurface::getFormat' => ['int'], -'CairoImageSurface::getHeight' => ['int'], -'CairoImageSurface::getStride' => ['int'], -'CairoImageSurface::getWidth' => ['int'], -'CairoLinearGradient::__construct' => ['void', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float'], -'CairoLinearGradient::getPoints' => ['array'], -'CairoMatrix::__construct' => ['void', 'xx='=>'float', 'yx='=>'float', 'xy='=>'float', 'yy='=>'float', 'x0='=>'float', 'y0='=>'float'], -'CairoMatrix::initIdentity' => ['object'], -'CairoMatrix::initRotate' => ['object', 'radians'=>'float'], -'CairoMatrix::initScale' => ['object', 'sx'=>'float', 'sy'=>'float'], -'CairoMatrix::initTranslate' => ['object', 'tx'=>'float', 'ty'=>'float'], -'CairoMatrix::invert' => ['void'], -'CairoMatrix::multiply' => ['CairoMatrix', 'matrix1'=>'cairomatrix', 'matrix2'=>'cairomatrix'], -'CairoMatrix::rotate' => ['', 'sx'=>'string', 'sy'=>'string', 'context'=>'cairocontext', 'angle'=>'string'], -'CairoMatrix::scale' => ['', 'sx'=>'float', 'sy'=>'float', 'context'=>'cairocontext'], -'CairoMatrix::transformDistance' => ['array', 'dx'=>'string', 'dy'=>'string'], -'CairoMatrix::transformPoint' => ['array', 'dx'=>'string', 'dy'=>'string'], -'CairoMatrix::translate' => ['', 'tx'=>'string', 'ty'=>'string', 'context'=>'cairocontext', 'x'=>'string', 'y'=>'string'], -'CairoPattern::__construct' => ['void'], -'CairoPattern::getMatrix' => ['', 'context'=>'cairocontext'], -'CairoPattern::getType' => ['int'], -'CairoPattern::setMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], -'CairoPattern::status' => ['int', 'context'=>'cairocontext'], -'CairoPdfSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], -'CairoPdfSurface::setSize' => ['void', 'width'=>'string', 'height'=>'string'], -'CairoPsSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], -'CairoPsSurface::dscBeginPageSetup' => ['void'], -'CairoPsSurface::dscBeginSetup' => ['void'], -'CairoPsSurface::dscComment' => ['void', 'comment'=>'string'], -'CairoPsSurface::getEps' => ['bool'], -'CairoPsSurface::getLevels' => ['array'], -'CairoPsSurface::levelToString' => ['string', 'level'=>'int'], -'CairoPsSurface::restrictToLevel' => ['void', 'level'=>'string'], -'CairoPsSurface::setEps' => ['void', 'level'=>'string'], -'CairoPsSurface::setSize' => ['void', 'width'=>'string', 'height'=>'string'], -'CairoRadialGradient::__construct' => ['void', 'x0'=>'float', 'y0'=>'float', 'r0'=>'float', 'x1'=>'float', 'y1'=>'float', 'r1'=>'float'], -'CairoRadialGradient::getCircles' => ['array'], -'CairoScaledFont::__construct' => ['void', 'font_face'=>'CairoFontFace', 'matrix'=>'CairoMatrix', 'ctm'=>'CairoMatrix', 'options'=>'CairoFontOptions'], -'CairoScaledFont::extents' => ['array'], -'CairoScaledFont::getCtm' => ['CairoMatrix'], -'CairoScaledFont::getFontFace' => ['', 'context'=>'cairocontext'], -'CairoScaledFont::getFontMatrix' => ['', 'context'=>'cairocontext'], -'CairoScaledFont::getFontOptions' => ['', 'context'=>'cairocontext'], -'CairoScaledFont::getScaleMatrix' => ['void'], -'CairoScaledFont::getType' => ['int'], -'CairoScaledFont::glyphExtents' => ['array', 'glyphs'=>'string'], -'CairoScaledFont::status' => ['int', 'context'=>'cairocontext'], -'CairoScaledFont::textExtents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], -'CairoSolidPattern::__construct' => ['void', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha='=>'float'], -'CairoSolidPattern::getRgba' => ['array'], -'CairoSurface::__construct' => ['void'], -'CairoSurface::copyPage' => ['', 'context'=>'cairocontext'], -'CairoSurface::createSimilar' => ['void', 'other'=>'cairosurface', 'content'=>'int', 'width'=>'string', 'height'=>'string'], -'CairoSurface::finish' => ['void'], -'CairoSurface::flush' => ['void'], -'CairoSurface::getContent' => ['int'], -'CairoSurface::getDeviceOffset' => ['array'], -'CairoSurface::getFontOptions' => ['', 'context'=>'cairocontext'], -'CairoSurface::getType' => ['int'], -'CairoSurface::markDirty' => ['void'], -'CairoSurface::markDirtyRectangle' => ['void', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string'], -'CairoSurface::setDeviceOffset' => ['void', 'x'=>'string', 'y'=>'string'], -'CairoSurface::setFallbackResolution' => ['void', 'x'=>'string', 'y'=>'string'], -'CairoSurface::showPage' => ['', 'context'=>'cairocontext'], -'CairoSurface::status' => ['int', 'context'=>'cairocontext'], -'CairoSurface::writeToPng' => ['void', 'file'=>'string'], -'CairoSurfacePattern::__construct' => ['void', 'surface'=>'CairoSurface'], -'CairoSurfacePattern::getExtend' => ['int'], -'CairoSurfacePattern::getFilter' => ['int'], -'CairoSurfacePattern::getSurface' => ['void'], -'CairoSurfacePattern::setExtend' => ['void', 'extend'=>'int'], -'CairoSurfacePattern::setFilter' => ['void', 'filter'=>'string'], -'CairoSvgSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], -'CairoSvgSurface::getVersions' => ['array'], -'CairoSvgSurface::restrictToVersion' => ['void', 'version'=>'string'], -'CairoSvgSurface::versionToString' => ['string', 'version'=>'int'], -'cal_days_in_month' => ['int', 'calendar'=>'int', 'month'=>'int', 'year'=>'int'], -'cal_from_jd' => ['false|array{date:string,month:int,day:int,year:int,dow:int,abbrevdayname:string,dayname:string,abbrevmonth:string,monthname:string}', 'julian_day'=>'int', 'calendar'=>'int'], -'cal_info' => ['array', 'calendar='=>'int'], -'cal_to_jd' => ['int', 'calendar'=>'int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], -'calcul_hmac' => ['string', 'clent'=>'string', 'siretcode'=>'string', 'price'=>'string', 'reference'=>'string', 'validity'=>'string', 'taxation'=>'string', 'devise'=>'string', 'language'=>'string'], -'calculhmac' => ['string', 'clent'=>'string', 'data'=>'string'], -'call_user_func' => ['mixed|false', 'callback'=>'callable', '...args='=>'mixed'], -'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::accept' => ['bool'], -'CallbackFilterIterator::current' => ['mixed'], -'CallbackFilterIterator::getInnerIterator' => ['Iterator'], -'CallbackFilterIterator::key' => ['mixed'], -'CallbackFilterIterator::next' => ['void'], -'CallbackFilterIterator::rewind' => ['void'], -'CallbackFilterIterator::valid' => ['bool'], -'ceil' => ['float', 'num'=>'float'], -'chdb::__construct' => ['void', 'pathname'=>'string'], -'chdb::get' => ['string', 'key'=>'string'], -'chdb_create' => ['bool', 'pathname'=>'string', 'data'=>'array'], -'chdir' => ['bool', 'directory'=>'string'], -'checkdate' => ['bool', 'month'=>'int', 'day'=>'int', 'year'=>'int'], -'checkdnsrr' => ['bool', 'hostname'=>'string', 'type='=>'string'], -'chgrp' => ['bool', 'filename'=>'string', 'group'=>'string|int'], -'chmod' => ['bool', 'filename'=>'string', 'permissions'=>'int'], -'chop' => ['string', 'string'=>'string', 'characters='=>'string'], -'chown' => ['bool', 'filename'=>'string', 'user'=>'string|int'], -'chr' => ['string', 'codepoint'=>'int'], -'chroot' => ['bool', 'directory'=>'string'], -'chunk_split' => ['string', 'string'=>'string', 'length='=>'int', 'separator='=>'string'], -'class_alias' => ['bool', 'class'=>'string', 'alias'=>'string', 'autoload='=>'bool'], -'class_exists' => ['bool', 'class'=>'string', 'autoload='=>'bool'], -'class_implements' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], -'class_parents' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], -'class_uses' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], -'classkit_import' => ['array', 'filename'=>'string'], -'classkit_method_add' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int'], -'classkit_method_copy' => ['bool', 'dclass'=>'string', 'dmethod'=>'string', 'sclass'=>'string', 'smethod='=>'string'], -'classkit_method_redefine' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int'], -'classkit_method_remove' => ['bool', 'classname'=>'string', 'methodname'=>'string'], -'classkit_method_rename' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'newname'=>'string'], -'classObj::__construct' => ['void', 'layer'=>'layerObj', 'class'=>'classObj'], -'classObj::addLabel' => ['int', 'label'=>'labelObj'], -'classObj::convertToString' => ['string'], -'classObj::createLegendIcon' => ['imageObj', 'width'=>'int', 'height'=>'int'], -'classObj::deletestyle' => ['int', 'index'=>'int'], -'classObj::drawLegendIcon' => ['int', 'width'=>'int', 'height'=>'int', 'im'=>'imageObj', 'dstX'=>'int', 'dstY'=>'int'], -'classObj::free' => ['void'], -'classObj::getExpressionString' => ['string'], -'classObj::getLabel' => ['labelObj', 'index'=>'int'], -'classObj::getMetaData' => ['int', 'name'=>'string'], -'classObj::getStyle' => ['styleObj', 'index'=>'int'], -'classObj::getTextString' => ['string'], -'classObj::movestyledown' => ['int', 'index'=>'int'], -'classObj::movestyleup' => ['int', 'index'=>'int'], -'classObj::ms_newClassObj' => ['classObj', 'layer'=>'layerObj', 'class'=>'classObj'], -'classObj::removeLabel' => ['labelObj', 'index'=>'int'], -'classObj::removeMetaData' => ['int', 'name'=>'string'], -'classObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'classObj::setExpression' => ['int', 'expression'=>'string'], -'classObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], -'classObj::settext' => ['int', 'text'=>'string'], -'classObj::updateFromString' => ['int', 'snippet'=>'string'], -'clearstatcache' => ['void', 'clear_realpath_cache='=>'bool', 'filename='=>'string'], -'cli_get_process_title' => ['?string'], -'cli_set_process_title' => ['bool', 'title'=>'string'], -'ClosedGeneratorException::__clone' => ['void'], -'ClosedGeneratorException::__toString' => ['string'], -'ClosedGeneratorException::getCode' => ['int'], -'ClosedGeneratorException::getFile' => ['string'], -'ClosedGeneratorException::getLine' => ['int'], -'ClosedGeneratorException::getMessage' => ['string'], -'ClosedGeneratorException::getPrevious' => ['Throwable|ClosedGeneratorException|null'], -'ClosedGeneratorException::getTrace' => ['list\',args?:array}>'], -'ClosedGeneratorException::getTraceAsString' => ['string'], -'closedir' => ['void', 'dir_handle='=>'resource'], -'closelog' => ['bool'], -'Closure::__construct' => ['void'], -'Closure::__invoke' => ['', '...args='=>''], -'Closure::bind' => ['Closure|false', 'old'=>'Closure', 'to'=>'?object', 'scope='=>'object|string'], -'Closure::bindTo' => ['Closure|false', 'new'=>'?object', 'newscope='=>'object|string'], -'Closure::call' => ['', 'to'=>'object', '...parameters='=>''], -'Closure::fromCallable' => ['Closure', 'callable'=>'callable'], -'clusterObj::convertToString' => ['string'], -'clusterObj::getFilterString' => ['string'], -'clusterObj::getGroupString' => ['string'], -'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::compare' => ['int|false', 'string1'=>'string', 'string2'=>'string'], -'Collator::create' => ['?Collator', 'locale'=>'string'], -'Collator::getAttribute' => ['int|false', 'attr'=>'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::setStrength' => ['bool', 'strength'=>'int'], -'Collator::sort' => ['bool', '&rw_arr'=>'array', 'sort_flags='=>'int'], -'Collator::sortWithSortKeys' => ['bool', '&rw_arr'=>'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'], -'collator_get_attribute' => ['int|false', 'object'=>'collator', 'attribute'=>'int'], -'collator_get_error_code' => ['int', 'object'=>'collator'], -'collator_get_error_message' => ['string', 'object'=>'collator'], -'collator_get_locale' => ['string', 'object'=>'collator', 'type'=>'int'], -'collator_get_sort_key' => ['string', 'object'=>'collator', 'string'=>'string'], -'collator_get_strength' => ['int|false', 'object'=>'collator'], -'collator_set_attribute' => ['bool', 'object'=>'collator', 'attribute'=>'int', 'value'=>'int'], -'collator_set_strength' => ['bool', 'object'=>'collator', 'strength'=>'int'], -'collator_sort' => ['bool', 'object'=>'collator', '&rw_array'=>'array', 'flags='=>'int'], -'collator_sort_with_sort_keys' => ['bool', 'object'=>'collator', '&rw_array'=>'array'], -'Collectable::isGarbage' => ['bool'], -'Collectable::setGarbage' => ['void'], -'colorObj::setHex' => ['int', 'hex'=>'string'], -'colorObj::toHex' => ['string'], -'COM::__call' => ['', 'name'=>'', 'args'=>''], -'COM::__construct' => ['void', 'module_name'=>'string', 'server_name='=>'mixed', 'codepage='=>'int', 'typelib='=>'string'], -'COM::__get' => ['', 'name'=>''], -'COM::__set' => ['void', 'name'=>'', 'value'=>''], -'com_addref' => [''], -'com_create_guid' => ['string'], -'com_event_sink' => ['bool', 'variant'=>'VARIANT', 'sink_object'=>'object', 'sink_interface='=>'mixed'], -'com_get_active_object' => ['VARIANT', 'prog_id'=>'string', 'codepage='=>'int'], -'com_isenum' => ['bool', 'com_module'=>'variant'], -'com_load_typelib' => ['bool', 'typelib_name'=>'string', 'case_insensitive='=>'true'], -'com_message_pump' => ['bool', 'timeout_milliseconds='=>'int'], -'com_print_typeinfo' => ['bool', 'variant'=>'object', 'dispatch_interface='=>'string', 'display_sink='=>'bool'], -'commonmark\cql::__invoke' => ['', 'root'=>'CommonMark\Node', 'handler'=>'callable'], -'commonmark\interfaces\ivisitable::accept' => ['void', 'visitor'=>'CommonMark\Interfaces\IVisitor'], -'commonmark\interfaces\ivisitor::enter' => ['?int|IVisitable', 'visitable'=>'IVisitable'], -'commonmark\interfaces\ivisitor::leave' => ['?int|IVisitable', 'visitable'=>'IVisitable'], -'commonmark\node::accept' => ['void', 'visitor'=>'CommonMark\Interfaces\IVisitor'], -'commonmark\node::appendChild' => ['CommonMark\Node', 'child'=>'CommonMark\Node'], -'commonmark\node::insertAfter' => ['CommonMark\Node', 'sibling'=>'CommonMark\Node'], -'commonmark\node::insertBefore' => ['CommonMark\Node', 'sibling'=>'CommonMark\Node'], -'commonmark\node::prependChild' => ['CommonMark\Node', 'child'=>'CommonMark\Node'], -'commonmark\node::replace' => ['CommonMark\Node', 'target'=>'CommonMark\Node'], -'commonmark\node::unlink' => ['void'], -'commonmark\parse' => ['CommonMark\Node', 'content'=>'string', 'options='=>'int'], -'commonmark\parser::finish' => ['CommonMark\Node'], -'commonmark\parser::parse' => ['void', 'buffer'=>'string'], -'commonmark\render' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], -'commonmark\render\html' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int'], -'commonmark\render\latex' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], -'commonmark\render\man' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], -'commonmark\render\xml' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int'], -'compact' => ['array', 'var_name'=>'string|array', '...var_names='=>'string|array'], -'COMPersistHelper::__construct' => ['void', 'variant'=>'object'], -'COMPersistHelper::GetCurFile' => ['string'], -'COMPersistHelper::GetCurFileName' => ['string'], -'COMPersistHelper::GetMaxStreamSize' => ['int'], -'COMPersistHelper::InitNew' => ['int'], -'COMPersistHelper::LoadFromFile' => ['bool', 'filename'=>'string', 'flags'=>'int'], -'COMPersistHelper::LoadFromStream' => ['', 'stream'=>''], -'COMPersistHelper::SaveToFile' => ['bool', 'filename'=>'string', 'remember'=>'bool'], -'COMPersistHelper::SaveToStream' => ['int', 'stream'=>''], -'componere\abstract\definition::addInterface' => ['Componere\Abstract\Definition', 'interface'=>'string'], -'componere\abstract\definition::addMethod' => ['Componere\Abstract\Definition', 'name'=>'string', 'method'=>'Componere\Method'], -'componere\abstract\definition::addTrait' => ['Componere\Abstract\Definition', 'trait'=>'string'], -'componere\abstract\definition::getReflector' => ['ReflectionClass'], -'componere\cast' => ['object', 'arg1'=>'string', 'object'=>'object'], -'componere\cast_by_ref' => ['object', 'arg1'=>'string', 'object'=>'object'], -'componere\definition::addConstant' => ['Componere\Definition', 'name'=>'string', 'value'=>'Componere\Value'], -'componere\definition::addProperty' => ['Componere\Definition', 'name'=>'string', 'value'=>'Componere\Value'], -'componere\definition::getClosure' => ['Closure', 'name'=>'string'], -'componere\definition::getClosures' => ['Closure[]'], -'componere\definition::isRegistered' => ['bool'], -'componere\definition::register' => ['void'], -'componere\method::getReflector' => ['ReflectionMethod'], -'componere\method::setPrivate' => ['Method'], -'componere\method::setProtected' => ['Method'], -'componere\method::setStatic' => ['Method'], -'componere\patch::apply' => ['void'], -'componere\patch::derive' => ['Componere\Patch', 'instance'=>'object'], -'componere\patch::getClosure' => ['Closure', 'name'=>'string'], -'componere\patch::getClosures' => ['Closure[]'], -'componere\patch::isApplied' => ['bool'], -'componere\patch::revert' => ['void'], -'componere\value::hasDefault' => ['bool'], -'componere\value::isPrivate' => ['bool'], -'componere\value::isProtected' => ['bool'], -'componere\value::isStatic' => ['bool'], -'componere\value::setPrivate' => ['Value'], -'componere\value::setProtected' => ['Value'], -'componere\value::setStatic' => ['Value'], -'Cond::broadcast' => ['bool', 'condition'=>'long'], -'Cond::create' => ['long'], -'Cond::destroy' => ['bool', 'condition'=>'long'], -'Cond::signal' => ['bool', 'condition'=>'long'], -'Cond::wait' => ['bool', 'condition'=>'long', 'mutex'=>'long', 'timeout='=>'long'], -'confirm_pdo_ibm_compiled' => [''], -'connection_aborted' => ['int'], -'connection_status' => ['int'], -'connection_timeout' => ['int'], -'constant' => ['mixed', 'name'=>'string'], -'convert_cyr_string' => ['string', 'string'=>'string', 'from'=>'string', 'to'=>'string'], -'convert_uudecode' => ['string', 'string'=>'string'], -'convert_uuencode' => ['string', 'string'=>'string'], -'copy' => ['bool', 'from'=>'string', 'to'=>'string', 'context='=>'resource'], -'cos' => ['float', 'num'=>'float'], -'cosh' => ['float', 'num'=>'float'], -'Couchbase\AnalyticsQuery::__construct' => ['void'], -'Couchbase\AnalyticsQuery::fromString' => ['Couchbase\AnalyticsQuery', 'statement'=>'string'], -'Couchbase\basicDecoderV1' => ['mixed', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int', 'options'=>'array'], -'Couchbase\basicEncoderV1' => ['array', 'value'=>'mixed', 'options'=>'array'], -'Couchbase\BooleanFieldSearchQuery::__construct' => ['void'], -'Couchbase\BooleanFieldSearchQuery::boost' => ['Couchbase\BooleanFieldSearchQuery', 'boost'=>'float'], -'Couchbase\BooleanFieldSearchQuery::field' => ['Couchbase\BooleanFieldSearchQuery', 'field'=>'string'], -'Couchbase\BooleanFieldSearchQuery::jsonSerialize' => ['array'], -'Couchbase\BooleanSearchQuery::__construct' => ['void'], -'Couchbase\BooleanSearchQuery::boost' => ['Couchbase\BooleanSearchQuery', 'boost'=>'float'], -'Couchbase\BooleanSearchQuery::jsonSerialize' => ['array'], -'Couchbase\BooleanSearchQuery::must' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], -'Couchbase\BooleanSearchQuery::mustNot' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], -'Couchbase\BooleanSearchQuery::should' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], -'Couchbase\Bucket::__construct' => ['void'], -'Couchbase\Bucket::__get' => ['int', 'name'=>'string'], -'Couchbase\Bucket::__set' => ['int', 'name'=>'string', 'value'=>'int'], -'Couchbase\Bucket::append' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], -'Couchbase\Bucket::counter' => ['Couchbase\Document|array', 'ids'=>'array|string', 'delta='=>'int', 'options='=>'array'], -'Couchbase\Bucket::decryptFields' => ['array', 'document'=>'array', 'fieldOptions'=>'', 'prefix='=>'string'], -'Couchbase\Bucket::diag' => ['array', 'reportId='=>'string'], -'Couchbase\Bucket::encryptFields' => ['array', 'document'=>'array', 'fieldOptions'=>'', 'prefix='=>'string'], -'Couchbase\Bucket::get' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], -'Couchbase\Bucket::getAndLock' => ['Couchbase\Document|array', 'ids'=>'array|string', 'lockTime'=>'int', 'options='=>'array'], -'Couchbase\Bucket::getAndTouch' => ['Couchbase\Document|array', 'ids'=>'array|string', 'expiry'=>'int', 'options='=>'array'], -'Couchbase\Bucket::getFromReplica' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], -'Couchbase\Bucket::getName' => ['string'], -'Couchbase\Bucket::insert' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], -'Couchbase\Bucket::listExists' => ['bool', 'id'=>'string', 'value'=>'mixed'], -'Couchbase\Bucket::listGet' => ['mixed', 'id'=>'string', 'index'=>'int'], -'Couchbase\Bucket::listPush' => ['', 'id'=>'string', 'value'=>'mixed'], -'Couchbase\Bucket::listRemove' => ['', 'id'=>'string', 'index'=>'int'], -'Couchbase\Bucket::listSet' => ['', 'id'=>'string', 'index'=>'int', 'value'=>'mixed'], -'Couchbase\Bucket::listShift' => ['', 'id'=>'string', 'value'=>'mixed'], -'Couchbase\Bucket::listSize' => ['int', 'id'=>'string'], -'Couchbase\Bucket::lookupIn' => ['Couchbase\LookupInBuilder', 'id'=>'string'], -'Couchbase\Bucket::manager' => ['Couchbase\BucketManager'], -'Couchbase\Bucket::mapAdd' => ['', 'id'=>'string', 'key'=>'string', 'value'=>'mixed'], -'Couchbase\Bucket::mapGet' => ['mixed', 'id'=>'string', 'key'=>'string'], -'Couchbase\Bucket::mapRemove' => ['', 'id'=>'string', 'key'=>'string'], -'Couchbase\Bucket::mapSize' => ['int', 'id'=>'string'], -'Couchbase\Bucket::mutateIn' => ['Couchbase\MutateInBuilder', 'id'=>'string', 'cas'=>'string'], -'Couchbase\Bucket::ping' => ['array', 'services='=>'int', 'reportId='=>'string'], -'Couchbase\Bucket::prepend' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], -'Couchbase\Bucket::query' => ['object', 'query'=>'Couchbase\AnalyticsQuery|Couchbase\N1qlQuery|Couchbase\SearchQuery|Couchbase\SpatialViewQuery|Couchbase\ViewQuery', 'jsonAsArray='=>'bool'], -'Couchbase\Bucket::queueAdd' => ['', 'id'=>'string', 'value'=>'mixed'], -'Couchbase\Bucket::queueExists' => ['bool', 'id'=>'string', 'value'=>'mixed'], -'Couchbase\Bucket::queueRemove' => ['mixed', 'id'=>'string'], -'Couchbase\Bucket::queueSize' => ['int', 'id'=>'string'], -'Couchbase\Bucket::remove' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], -'Couchbase\Bucket::replace' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], -'Couchbase\Bucket::retrieveIn' => ['Couchbase\DocumentFragment', 'id'=>'string', '...paths='=>'array'], -'Couchbase\Bucket::setAdd' => ['', 'id'=>'string', 'value'=>'bool|float|int|string'], -'Couchbase\Bucket::setExists' => ['bool', 'id'=>'string', 'value'=>'bool|float|int|string'], -'Couchbase\Bucket::setRemove' => ['', 'id'=>'string', 'value'=>'bool|float|int|string'], -'Couchbase\Bucket::setSize' => ['int', 'id'=>'string'], -'Couchbase\Bucket::setTranscoder' => ['', 'encoder'=>'callable', 'decoder'=>'callable'], -'Couchbase\Bucket::touch' => ['Couchbase\Document|array', 'ids'=>'array|string', 'expiry'=>'int', 'options='=>'array'], -'Couchbase\Bucket::unlock' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], -'Couchbase\Bucket::upsert' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], -'Couchbase\BucketManager::__construct' => ['void'], -'Couchbase\BucketManager::createN1qlIndex' => ['', 'name'=>'string', 'fields'=>'array', 'whereClause='=>'string', 'ignoreIfExist='=>'bool', 'defer='=>'bool'], -'Couchbase\BucketManager::createN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfExist='=>'bool', 'defer='=>'bool'], -'Couchbase\BucketManager::dropN1qlIndex' => ['', 'name'=>'string', 'ignoreIfNotExist='=>'bool'], -'Couchbase\BucketManager::dropN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfNotExist='=>'bool'], -'Couchbase\BucketManager::flush' => [''], -'Couchbase\BucketManager::getDesignDocument' => ['array', 'name'=>'string'], -'Couchbase\BucketManager::info' => ['array'], -'Couchbase\BucketManager::insertDesignDocument' => ['', 'name'=>'string', 'document'=>'array'], -'Couchbase\BucketManager::listDesignDocuments' => ['array'], -'Couchbase\BucketManager::listN1qlIndexes' => ['array'], -'Couchbase\BucketManager::removeDesignDocument' => ['', 'name'=>'string'], -'Couchbase\BucketManager::upsertDesignDocument' => ['', 'name'=>'string', 'document'=>'array'], -'Couchbase\ClassicAuthenticator::bucket' => ['', 'name'=>'string', 'password'=>'string'], -'Couchbase\ClassicAuthenticator::cluster' => ['', 'username'=>'string', 'password'=>'string'], -'Couchbase\Cluster::__construct' => ['void', 'connstr'=>'string'], -'Couchbase\Cluster::authenticate' => ['null', 'authenticator'=>'Couchbase\Authenticator'], -'Couchbase\Cluster::authenticateAs' => ['null', 'username'=>'string', 'password'=>'string'], -'Couchbase\Cluster::manager' => ['Couchbase\ClusterManager', 'username='=>'string', 'password='=>'string'], -'Couchbase\Cluster::openBucket' => ['Couchbase\Bucket', 'name='=>'string', 'password='=>'string'], -'Couchbase\ClusterManager::__construct' => ['void'], -'Couchbase\ClusterManager::createBucket' => ['', 'name'=>'string', 'options='=>'array'], -'Couchbase\ClusterManager::getUser' => ['array', 'username'=>'string', 'domain='=>'int'], -'Couchbase\ClusterManager::info' => ['array'], -'Couchbase\ClusterManager::listBuckets' => ['array'], -'Couchbase\ClusterManager::listUsers' => ['array', 'domain='=>'int'], -'Couchbase\ClusterManager::removeBucket' => ['', 'name'=>'string'], -'Couchbase\ClusterManager::removeUser' => ['', 'name'=>'string', 'domain='=>'int'], -'Couchbase\ClusterManager::upsertUser' => ['', 'name'=>'string', 'settings'=>'Couchbase\UserSettings', 'domain='=>'int'], -'Couchbase\ConjunctionSearchQuery::__construct' => ['void'], -'Couchbase\ConjunctionSearchQuery::boost' => ['Couchbase\ConjunctionSearchQuery', 'boost'=>'float'], -'Couchbase\ConjunctionSearchQuery::every' => ['Couchbase\ConjunctionSearchQuery', '...queries='=>'array'], -'Couchbase\ConjunctionSearchQuery::jsonSerialize' => ['array'], -'Couchbase\DateRangeSearchFacet::__construct' => ['void'], -'Couchbase\DateRangeSearchFacet::addRange' => ['Couchbase\DateRangeSearchFacet', 'name'=>'string', 'start'=>'int|string', 'end'=>'int|string'], -'Couchbase\DateRangeSearchFacet::jsonSerialize' => ['array'], -'Couchbase\DateRangeSearchQuery::__construct' => ['void'], -'Couchbase\DateRangeSearchQuery::boost' => ['Couchbase\DateRangeSearchQuery', 'boost'=>'float'], -'Couchbase\DateRangeSearchQuery::dateTimeParser' => ['Couchbase\DateRangeSearchQuery', 'dateTimeParser'=>'string'], -'Couchbase\DateRangeSearchQuery::end' => ['Couchbase\DateRangeSearchQuery', 'end'=>'int|string', 'inclusive='=>'bool'], -'Couchbase\DateRangeSearchQuery::field' => ['Couchbase\DateRangeSearchQuery', 'field'=>'string'], -'Couchbase\DateRangeSearchQuery::jsonSerialize' => ['array'], -'Couchbase\DateRangeSearchQuery::start' => ['Couchbase\DateRangeSearchQuery', 'start'=>'int|string', 'inclusive='=>'bool'], -'Couchbase\defaultDecoder' => ['mixed', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int'], -'Couchbase\defaultEncoder' => ['array', 'value'=>'mixed'], -'Couchbase\DisjunctionSearchQuery::__construct' => ['void'], -'Couchbase\DisjunctionSearchQuery::boost' => ['Couchbase\DisjunctionSearchQuery', 'boost'=>'float'], -'Couchbase\DisjunctionSearchQuery::either' => ['Couchbase\DisjunctionSearchQuery', '...queries='=>'array'], -'Couchbase\DisjunctionSearchQuery::jsonSerialize' => ['array'], -'Couchbase\DisjunctionSearchQuery::min' => ['Couchbase\DisjunctionSearchQuery', 'min'=>'int'], -'Couchbase\DocIdSearchQuery::__construct' => ['void'], -'Couchbase\DocIdSearchQuery::boost' => ['Couchbase\DocIdSearchQuery', 'boost'=>'float'], -'Couchbase\DocIdSearchQuery::docIds' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array'], -'Couchbase\DocIdSearchQuery::field' => ['Couchbase\DocIdSearchQuery', 'field'=>'string'], -'Couchbase\DocIdSearchQuery::jsonSerialize' => ['array'], -'Couchbase\fastlzCompress' => ['string', 'data'=>'string'], -'Couchbase\fastlzDecompress' => ['string', 'data'=>'string'], -'Couchbase\GeoBoundingBoxSearchQuery::__construct' => ['void'], -'Couchbase\GeoBoundingBoxSearchQuery::boost' => ['Couchbase\GeoBoundingBoxSearchQuery', 'boost'=>'float'], -'Couchbase\GeoBoundingBoxSearchQuery::field' => ['Couchbase\GeoBoundingBoxSearchQuery', 'field'=>'string'], -'Couchbase\GeoBoundingBoxSearchQuery::jsonSerialize' => ['array'], -'Couchbase\GeoDistanceSearchQuery::__construct' => ['void'], -'Couchbase\GeoDistanceSearchQuery::boost' => ['Couchbase\GeoDistanceSearchQuery', 'boost'=>'float'], -'Couchbase\GeoDistanceSearchQuery::field' => ['Couchbase\GeoDistanceSearchQuery', 'field'=>'string'], -'Couchbase\GeoDistanceSearchQuery::jsonSerialize' => ['array'], -'Couchbase\LookupInBuilder::__construct' => ['void'], -'Couchbase\LookupInBuilder::execute' => ['Couchbase\DocumentFragment'], -'Couchbase\LookupInBuilder::exists' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], -'Couchbase\LookupInBuilder::get' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], -'Couchbase\LookupInBuilder::getCount' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], -'Couchbase\MatchAllSearchQuery::__construct' => ['void'], -'Couchbase\MatchAllSearchQuery::boost' => ['Couchbase\MatchAllSearchQuery', 'boost'=>'float'], -'Couchbase\MatchAllSearchQuery::jsonSerialize' => ['array'], -'Couchbase\MatchNoneSearchQuery::__construct' => ['void'], -'Couchbase\MatchNoneSearchQuery::boost' => ['Couchbase\MatchNoneSearchQuery', 'boost'=>'float'], -'Couchbase\MatchNoneSearchQuery::jsonSerialize' => ['array'], -'Couchbase\MatchPhraseSearchQuery::__construct' => ['void'], -'Couchbase\MatchPhraseSearchQuery::analyzer' => ['Couchbase\MatchPhraseSearchQuery', 'analyzer'=>'string'], -'Couchbase\MatchPhraseSearchQuery::boost' => ['Couchbase\MatchPhraseSearchQuery', 'boost'=>'float'], -'Couchbase\MatchPhraseSearchQuery::field' => ['Couchbase\MatchPhraseSearchQuery', 'field'=>'string'], -'Couchbase\MatchPhraseSearchQuery::jsonSerialize' => ['array'], -'Couchbase\MatchSearchQuery::__construct' => ['void'], -'Couchbase\MatchSearchQuery::analyzer' => ['Couchbase\MatchSearchQuery', 'analyzer'=>'string'], -'Couchbase\MatchSearchQuery::boost' => ['Couchbase\MatchSearchQuery', 'boost'=>'float'], -'Couchbase\MatchSearchQuery::field' => ['Couchbase\MatchSearchQuery', 'field'=>'string'], -'Couchbase\MatchSearchQuery::fuzziness' => ['Couchbase\MatchSearchQuery', 'fuzziness'=>'int'], -'Couchbase\MatchSearchQuery::jsonSerialize' => ['array'], -'Couchbase\MatchSearchQuery::prefixLength' => ['Couchbase\MatchSearchQuery', 'prefixLength'=>'int'], -'Couchbase\MutateInBuilder::__construct' => ['void'], -'Couchbase\MutateInBuilder::arrayAddUnique' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], -'Couchbase\MutateInBuilder::arrayAppend' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], -'Couchbase\MutateInBuilder::arrayAppendAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array|bool'], -'Couchbase\MutateInBuilder::arrayInsert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array'], -'Couchbase\MutateInBuilder::arrayInsertAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array'], -'Couchbase\MutateInBuilder::arrayPrepend' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], -'Couchbase\MutateInBuilder::arrayPrependAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array|bool'], -'Couchbase\MutateInBuilder::counter' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'delta'=>'int', 'options='=>'array|bool'], -'Couchbase\MutateInBuilder::execute' => ['Couchbase\DocumentFragment'], -'Couchbase\MutateInBuilder::insert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], -'Couchbase\MutateInBuilder::modeDocument' => ['', 'mode'=>'int'], -'Couchbase\MutateInBuilder::remove' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'options='=>'array'], -'Couchbase\MutateInBuilder::replace' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array'], -'Couchbase\MutateInBuilder::upsert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], -'Couchbase\MutateInBuilder::withExpiry' => ['Couchbase\MutateInBuilder', 'expiry'=>'Couchbase\expiry'], -'Couchbase\MutationState::__construct' => ['void'], -'Couchbase\MutationState::add' => ['', 'source'=>'Couchbase\Document|Couchbase\DocumentFragment|array'], -'Couchbase\MutationState::from' => ['Couchbase\MutationState', 'source'=>'Couchbase\Document|Couchbase\DocumentFragment|array'], -'Couchbase\MutationToken::__construct' => ['void'], -'Couchbase\MutationToken::bucketName' => ['string'], -'Couchbase\MutationToken::from' => ['', 'bucketName'=>'string', 'vbucketId'=>'int', 'vbucketUuid'=>'string', 'sequenceNumber'=>'string'], -'Couchbase\MutationToken::sequenceNumber' => ['string'], -'Couchbase\MutationToken::vbucketId' => ['int'], -'Couchbase\MutationToken::vbucketUuid' => ['string'], -'Couchbase\N1qlIndex::__construct' => ['void'], -'Couchbase\N1qlQuery::__construct' => ['void'], -'Couchbase\N1qlQuery::adhoc' => ['Couchbase\N1qlQuery', 'adhoc'=>'bool'], -'Couchbase\N1qlQuery::consistency' => ['Couchbase\N1qlQuery', 'consistency'=>'int'], -'Couchbase\N1qlQuery::consistentWith' => ['Couchbase\N1qlQuery', 'state'=>'Couchbase\MutationState'], -'Couchbase\N1qlQuery::crossBucket' => ['Couchbase\N1qlQuery', 'crossBucket'=>'bool'], -'Couchbase\N1qlQuery::fromString' => ['Couchbase\N1qlQuery', 'statement'=>'string'], -'Couchbase\N1qlQuery::maxParallelism' => ['Couchbase\N1qlQuery', 'maxParallelism'=>'int'], -'Couchbase\N1qlQuery::namedParams' => ['Couchbase\N1qlQuery', 'params'=>'array'], -'Couchbase\N1qlQuery::pipelineBatch' => ['Couchbase\N1qlQuery', 'pipelineBatch'=>'int'], -'Couchbase\N1qlQuery::pipelineCap' => ['Couchbase\N1qlQuery', 'pipelineCap'=>'int'], -'Couchbase\N1qlQuery::positionalParams' => ['Couchbase\N1qlQuery', 'params'=>'array'], -'Couchbase\N1qlQuery::profile' => ['', 'profileType'=>'string'], -'Couchbase\N1qlQuery::readonly' => ['Couchbase\N1qlQuery', 'readonly'=>'bool'], -'Couchbase\N1qlQuery::scanCap' => ['Couchbase\N1qlQuery', 'scanCap'=>'int'], -'Couchbase\NumericRangeSearchFacet::__construct' => ['void'], -'Couchbase\NumericRangeSearchFacet::addRange' => ['Couchbase\NumericRangeSearchFacet', 'name'=>'string', 'min'=>'float', 'max'=>'float'], -'Couchbase\NumericRangeSearchFacet::jsonSerialize' => ['array'], -'Couchbase\NumericRangeSearchQuery::__construct' => ['void'], -'Couchbase\NumericRangeSearchQuery::boost' => ['Couchbase\NumericRangeSearchQuery', 'boost'=>'float'], -'Couchbase\NumericRangeSearchQuery::field' => ['Couchbase\NumericRangeSearchQuery', 'field'=>'string'], -'Couchbase\NumericRangeSearchQuery::jsonSerialize' => ['array'], -'Couchbase\NumericRangeSearchQuery::max' => ['Couchbase\NumericRangeSearchQuery', 'max'=>'float', 'inclusive='=>'bool'], -'Couchbase\NumericRangeSearchQuery::min' => ['Couchbase\NumericRangeSearchQuery', 'min'=>'float', 'inclusive='=>'bool'], -'Couchbase\passthruDecoder' => ['string', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int'], -'Couchbase\passthruEncoder' => ['array', 'value'=>'string'], -'Couchbase\PasswordAuthenticator::password' => ['Couchbase\PasswordAuthenticator', 'password'=>'string'], -'Couchbase\PasswordAuthenticator::username' => ['Couchbase\PasswordAuthenticator', 'username'=>'string'], -'Couchbase\PhraseSearchQuery::__construct' => ['void'], -'Couchbase\PhraseSearchQuery::boost' => ['Couchbase\PhraseSearchQuery', 'boost'=>'float'], -'Couchbase\PhraseSearchQuery::field' => ['Couchbase\PhraseSearchQuery', 'field'=>'string'], -'Couchbase\PhraseSearchQuery::jsonSerialize' => ['array'], -'Couchbase\PrefixSearchQuery::__construct' => ['void'], -'Couchbase\PrefixSearchQuery::boost' => ['Couchbase\PrefixSearchQuery', 'boost'=>'float'], -'Couchbase\PrefixSearchQuery::field' => ['Couchbase\PrefixSearchQuery', 'field'=>'string'], -'Couchbase\PrefixSearchQuery::jsonSerialize' => ['array'], -'Couchbase\QueryStringSearchQuery::__construct' => ['void'], -'Couchbase\QueryStringSearchQuery::boost' => ['Couchbase\QueryStringSearchQuery', 'boost'=>'float'], -'Couchbase\QueryStringSearchQuery::jsonSerialize' => ['array'], -'Couchbase\RegexpSearchQuery::__construct' => ['void'], -'Couchbase\RegexpSearchQuery::boost' => ['Couchbase\RegexpSearchQuery', 'boost'=>'float'], -'Couchbase\RegexpSearchQuery::field' => ['Couchbase\RegexpSearchQuery', 'field'=>'string'], -'Couchbase\RegexpSearchQuery::jsonSerialize' => ['array'], -'Couchbase\SearchQuery::__construct' => ['void', 'indexName'=>'string', 'queryPart'=>'Couchbase\SearchQueryPart'], -'Couchbase\SearchQuery::addFacet' => ['Couchbase\SearchQuery', 'name'=>'string', 'facet'=>'Couchbase\SearchFacet'], -'Couchbase\SearchQuery::boolean' => ['Couchbase\BooleanSearchQuery'], -'Couchbase\SearchQuery::booleanField' => ['Couchbase\BooleanFieldSearchQuery', 'value'=>'bool'], -'Couchbase\SearchQuery::conjuncts' => ['Couchbase\ConjunctionSearchQuery', '...queries='=>'array'], -'Couchbase\SearchQuery::consistentWith' => ['Couchbase\SearchQuery', 'state'=>'Couchbase\MutationState'], -'Couchbase\SearchQuery::dateRange' => ['Couchbase\DateRangeSearchQuery'], -'Couchbase\SearchQuery::dateRangeFacet' => ['Couchbase\DateRangeSearchFacet', 'field'=>'string', 'limit'=>'int'], -'Couchbase\SearchQuery::disjuncts' => ['Couchbase\DisjunctionSearchQuery', '...queries='=>'array'], -'Couchbase\SearchQuery::docId' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array'], -'Couchbase\SearchQuery::explain' => ['Couchbase\SearchQuery', 'explain'=>'bool'], -'Couchbase\SearchQuery::fields' => ['Couchbase\SearchQuery', '...fields='=>'array'], -'Couchbase\SearchQuery::geoBoundingBox' => ['Couchbase\GeoBoundingBoxSearchQuery', 'topLeftLongitude'=>'float', 'topLeftLatitude'=>'float', 'bottomRightLongitude'=>'float', 'bottomRightLatitude'=>'float'], -'Couchbase\SearchQuery::geoDistance' => ['Couchbase\GeoDistanceSearchQuery', 'longitude'=>'float', 'latitude'=>'float', 'distance'=>'string'], -'Couchbase\SearchQuery::highlight' => ['Couchbase\SearchQuery', 'style'=>'string', '...fields='=>'array'], -'Couchbase\SearchQuery::jsonSerialize' => ['array'], -'Couchbase\SearchQuery::limit' => ['Couchbase\SearchQuery', 'limit'=>'int'], -'Couchbase\SearchQuery::match' => ['Couchbase\MatchSearchQuery', 'match'=>'string'], -'Couchbase\SearchQuery::matchAll' => ['Couchbase\MatchAllSearchQuery'], -'Couchbase\SearchQuery::matchNone' => ['Couchbase\MatchNoneSearchQuery'], -'Couchbase\SearchQuery::matchPhrase' => ['Couchbase\MatchPhraseSearchQuery', '...terms='=>'array'], -'Couchbase\SearchQuery::numericRange' => ['Couchbase\NumericRangeSearchQuery'], -'Couchbase\SearchQuery::numericRangeFacet' => ['Couchbase\NumericRangeSearchFacet', 'field'=>'string', 'limit'=>'int'], -'Couchbase\SearchQuery::prefix' => ['Couchbase\PrefixSearchQuery', 'prefix'=>'string'], -'Couchbase\SearchQuery::queryString' => ['Couchbase\QueryStringSearchQuery', 'queryString'=>'string'], -'Couchbase\SearchQuery::regexp' => ['Couchbase\RegexpSearchQuery', 'regexp'=>'string'], -'Couchbase\SearchQuery::serverSideTimeout' => ['Couchbase\SearchQuery', 'serverSideTimeout'=>'int'], -'Couchbase\SearchQuery::skip' => ['Couchbase\SearchQuery', 'skip'=>'int'], -'Couchbase\SearchQuery::sort' => ['Couchbase\SearchQuery', '...sort='=>'array'], -'Couchbase\SearchQuery::term' => ['Couchbase\TermSearchQuery', 'term'=>'string'], -'Couchbase\SearchQuery::termFacet' => ['Couchbase\TermSearchFacet', 'field'=>'string', 'limit'=>'int'], -'Couchbase\SearchQuery::termRange' => ['Couchbase\TermRangeSearchQuery'], -'Couchbase\SearchQuery::wildcard' => ['Couchbase\WildcardSearchQuery', 'wildcard'=>'string'], -'Couchbase\SearchSort::__construct' => ['void'], -'Couchbase\SearchSort::field' => ['Couchbase\SearchSortField', 'field'=>'string'], -'Couchbase\SearchSort::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], -'Couchbase\SearchSort::id' => ['Couchbase\SearchSortId'], -'Couchbase\SearchSort::score' => ['Couchbase\SearchSortScore'], -'Couchbase\SearchSortField::__construct' => ['void'], -'Couchbase\SearchSortField::descending' => ['Couchbase\SearchSortField', 'descending'=>'bool'], -'Couchbase\SearchSortField::field' => ['Couchbase\SearchSortField', 'field'=>'string'], -'Couchbase\SearchSortField::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], -'Couchbase\SearchSortField::id' => ['Couchbase\SearchSortId'], -'Couchbase\SearchSortField::jsonSerialize' => ['mixed'], -'Couchbase\SearchSortField::missing' => ['', 'missing'=>'string'], -'Couchbase\SearchSortField::mode' => ['', 'mode'=>'string'], -'Couchbase\SearchSortField::score' => ['Couchbase\SearchSortScore'], -'Couchbase\SearchSortField::type' => ['', 'type'=>'string'], -'Couchbase\SearchSortGeoDistance::__construct' => ['void'], -'Couchbase\SearchSortGeoDistance::descending' => ['Couchbase\SearchSortGeoDistance', 'descending'=>'bool'], -'Couchbase\SearchSortGeoDistance::field' => ['Couchbase\SearchSortField', 'field'=>'string'], -'Couchbase\SearchSortGeoDistance::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], -'Couchbase\SearchSortGeoDistance::id' => ['Couchbase\SearchSortId'], -'Couchbase\SearchSortGeoDistance::jsonSerialize' => ['mixed'], -'Couchbase\SearchSortGeoDistance::score' => ['Couchbase\SearchSortScore'], -'Couchbase\SearchSortGeoDistance::unit' => ['Couchbase\SearchSortGeoDistance', 'unit'=>'string'], -'Couchbase\SearchSortId::__construct' => ['void'], -'Couchbase\SearchSortId::descending' => ['Couchbase\SearchSortId', 'descending'=>'bool'], -'Couchbase\SearchSortId::field' => ['Couchbase\SearchSortField', 'field'=>'string'], -'Couchbase\SearchSortId::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], -'Couchbase\SearchSortId::id' => ['Couchbase\SearchSortId'], -'Couchbase\SearchSortId::jsonSerialize' => ['mixed'], -'Couchbase\SearchSortId::score' => ['Couchbase\SearchSortScore'], -'Couchbase\SearchSortScore::__construct' => ['void'], -'Couchbase\SearchSortScore::descending' => ['Couchbase\SearchSortScore', 'descending'=>'bool'], -'Couchbase\SearchSortScore::field' => ['Couchbase\SearchSortField', 'field'=>'string'], -'Couchbase\SearchSortScore::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], -'Couchbase\SearchSortScore::id' => ['Couchbase\SearchSortId'], -'Couchbase\SearchSortScore::jsonSerialize' => ['mixed'], -'Couchbase\SearchSortScore::score' => ['Couchbase\SearchSortScore'], -'Couchbase\SpatialViewQuery::__construct' => ['void'], -'Couchbase\SpatialViewQuery::bbox' => ['Couchbase\SpatialViewQuery', 'bbox'=>'array'], -'Couchbase\SpatialViewQuery::consistency' => ['Couchbase\SpatialViewQuery', 'consistency'=>'int'], -'Couchbase\SpatialViewQuery::custom' => ['', 'customParameters'=>'array'], -'Couchbase\SpatialViewQuery::encode' => ['array'], -'Couchbase\SpatialViewQuery::endRange' => ['Couchbase\SpatialViewQuery', 'range'=>'array'], -'Couchbase\SpatialViewQuery::limit' => ['Couchbase\SpatialViewQuery', 'limit'=>'int'], -'Couchbase\SpatialViewQuery::order' => ['Couchbase\SpatialViewQuery', 'order'=>'int'], -'Couchbase\SpatialViewQuery::skip' => ['Couchbase\SpatialViewQuery', 'skip'=>'int'], -'Couchbase\SpatialViewQuery::startRange' => ['Couchbase\SpatialViewQuery', 'range'=>'array'], -'Couchbase\TermRangeSearchQuery::__construct' => ['void'], -'Couchbase\TermRangeSearchQuery::boost' => ['Couchbase\TermRangeSearchQuery', 'boost'=>'float'], -'Couchbase\TermRangeSearchQuery::field' => ['Couchbase\TermRangeSearchQuery', 'field'=>'string'], -'Couchbase\TermRangeSearchQuery::jsonSerialize' => ['array'], -'Couchbase\TermRangeSearchQuery::max' => ['Couchbase\TermRangeSearchQuery', 'max'=>'string', 'inclusive='=>'bool'], -'Couchbase\TermRangeSearchQuery::min' => ['Couchbase\TermRangeSearchQuery', 'min'=>'string', 'inclusive='=>'bool'], -'Couchbase\TermSearchFacet::__construct' => ['void'], -'Couchbase\TermSearchFacet::jsonSerialize' => ['array'], -'Couchbase\TermSearchQuery::__construct' => ['void'], -'Couchbase\TermSearchQuery::boost' => ['Couchbase\TermSearchQuery', 'boost'=>'float'], -'Couchbase\TermSearchQuery::field' => ['Couchbase\TermSearchQuery', 'field'=>'string'], -'Couchbase\TermSearchQuery::fuzziness' => ['Couchbase\TermSearchQuery', 'fuzziness'=>'int'], -'Couchbase\TermSearchQuery::jsonSerialize' => ['array'], -'Couchbase\TermSearchQuery::prefixLength' => ['Couchbase\TermSearchQuery', 'prefixLength'=>'int'], -'Couchbase\UserSettings::fullName' => ['Couchbase\UserSettings', 'fullName'=>'string'], -'Couchbase\UserSettings::password' => ['Couchbase\UserSettings', 'password'=>'string'], -'Couchbase\UserSettings::role' => ['Couchbase\UserSettings', 'role'=>'string', 'bucket='=>'string'], -'Couchbase\ViewQuery::__construct' => ['void'], -'Couchbase\ViewQuery::consistency' => ['Couchbase\ViewQuery', 'consistency'=>'int'], -'Couchbase\ViewQuery::custom' => ['Couchbase\ViewQuery', 'customParameters'=>'array'], -'Couchbase\ViewQuery::encode' => ['array'], -'Couchbase\ViewQuery::from' => ['Couchbase\ViewQuery', 'designDocumentName'=>'string', 'viewName'=>'string'], -'Couchbase\ViewQuery::fromSpatial' => ['Couchbase\SpatialViewQuery', 'designDocumentName'=>'string', 'viewName'=>'string'], -'Couchbase\ViewQuery::group' => ['Couchbase\ViewQuery', 'group'=>'bool'], -'Couchbase\ViewQuery::groupLevel' => ['Couchbase\ViewQuery', 'groupLevel'=>'int'], -'Couchbase\ViewQuery::idRange' => ['Couchbase\ViewQuery', 'startKeyDocumentId'=>'string', 'endKeyDocumentId'=>'string'], -'Couchbase\ViewQuery::key' => ['Couchbase\ViewQuery', 'key'=>'mixed'], -'Couchbase\ViewQuery::keys' => ['Couchbase\ViewQuery', 'keys'=>'array'], -'Couchbase\ViewQuery::limit' => ['Couchbase\ViewQuery', 'limit'=>'int'], -'Couchbase\ViewQuery::order' => ['Couchbase\ViewQuery', 'order'=>'int'], -'Couchbase\ViewQuery::range' => ['Couchbase\ViewQuery', 'startKey'=>'mixed', 'endKey'=>'mixed', 'inclusiveEnd='=>'bool'], -'Couchbase\ViewQuery::reduce' => ['Couchbase\ViewQuery', 'reduce'=>'bool'], -'Couchbase\ViewQuery::skip' => ['Couchbase\ViewQuery', 'skip'=>'int'], -'Couchbase\ViewQueryEncodable::encode' => ['array'], -'Couchbase\WildcardSearchQuery::__construct' => ['void'], -'Couchbase\WildcardSearchQuery::boost' => ['Couchbase\WildcardSearchQuery', 'boost'=>'float'], -'Couchbase\WildcardSearchQuery::field' => ['Couchbase\WildcardSearchQuery', 'field'=>'string'], -'Couchbase\WildcardSearchQuery::jsonSerialize' => ['array'], -'Couchbase\zlibCompress' => ['string', 'data'=>'string'], -'Couchbase\zlibDecompress' => ['string', 'data'=>'string'], -'count' => ['int', 'value'=>'Countable|array', 'mode='=>'int'], -'count_chars' => ['array', 'input'=>'string', 'mode='=>'0|1|2'], -'count_chars\'1' => ['string', 'input'=>'string', 'mode='=>'3|4'], -'Countable::count' => ['int'], -'crack_check' => ['bool', 'dictionary'=>'', 'password'=>'string'], -'crack_closedict' => ['bool', 'dictionary='=>'resource'], -'crack_getlastmessage' => ['string'], -'crack_opendict' => ['resource|false', 'dictionary'=>'string'], -'crash' => [''], -'crc32' => ['int', 'string'=>'string'], -'crypt' => ['string', 'string'=>'string', 'salt='=>'string'], -'ctype_alnum' => ['bool', 'text'=>'string|int'], -'ctype_alpha' => ['bool', 'text'=>'string|int'], -'ctype_cntrl' => ['bool', 'text'=>'string|int'], -'ctype_digit' => ['bool', 'text'=>'string|int'], -'ctype_graph' => ['bool', 'text'=>'string|int'], -'ctype_lower' => ['bool', 'text'=>'string|int'], -'ctype_print' => ['bool', 'text'=>'string|int'], -'ctype_punct' => ['bool', 'text'=>'string|int'], -'ctype_space' => ['bool', 'text'=>'string|int'], -'ctype_upper' => ['bool', 'text'=>'string|int'], -'ctype_xdigit' => ['bool', 'text'=>'string|int'], -'cubrid_affected_rows' => ['int', 'req_identifier='=>''], -'cubrid_bind' => ['bool', 'req_identifier'=>'resource', 'bind_param'=>'int', 'bind_value'=>'mixed', 'bind_value_type='=>'string'], -'cubrid_client_encoding' => ['string', 'conn_identifier='=>''], -'cubrid_close' => ['bool', 'conn_identifier='=>''], -'cubrid_close_prepare' => ['bool', 'req_identifier'=>'resource'], -'cubrid_close_request' => ['bool', 'req_identifier'=>'resource'], -'cubrid_col_get' => ['array', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string'], -'cubrid_col_size' => ['int', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string'], -'cubrid_column_names' => ['array', 'req_identifier'=>'resource'], -'cubrid_column_types' => ['array', 'req_identifier'=>'resource'], -'cubrid_commit' => ['bool', 'conn_identifier'=>'resource'], -'cubrid_connect' => ['resource', 'host'=>'string', 'port'=>'int', 'dbname'=>'string', 'userid='=>'string', 'passwd='=>'string'], -'cubrid_connect_with_url' => ['resource', 'conn_url'=>'string', 'userid='=>'string', 'passwd='=>'string'], -'cubrid_current_oid' => ['string', 'req_identifier'=>'resource'], -'cubrid_data_seek' => ['bool', 'req_identifier'=>'', 'row_number'=>'int'], -'cubrid_db_name' => ['string', 'result'=>'array', 'index'=>'int'], -'cubrid_db_parameter' => ['array', 'conn_identifier'=>'resource'], -'cubrid_disconnect' => ['bool', 'conn_identifier'=>'resource'], -'cubrid_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], -'cubrid_errno' => ['int', 'conn_identifier='=>''], -'cubrid_error' => ['string', 'connection='=>''], -'cubrid_error_code' => ['int'], -'cubrid_error_code_facility' => ['int'], -'cubrid_error_msg' => ['string'], -'cubrid_execute' => ['bool', 'conn_identifier'=>'', 'sql'=>'string', 'option='=>'int', 'request_identifier='=>''], -'cubrid_fetch' => ['mixed', 'result'=>'resource', 'type='=>'int'], -'cubrid_fetch_array' => ['array', 'result'=>'resource', 'type='=>'int'], -'cubrid_fetch_assoc' => ['array', 'result'=>'resource'], -'cubrid_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], -'cubrid_fetch_lengths' => ['array', 'result'=>'resource'], -'cubrid_fetch_object' => ['object', 'result'=>'resource', 'class_name='=>'string', 'params='=>'array'], -'cubrid_fetch_row' => ['array', 'result'=>'resource'], -'cubrid_field_flags' => ['string', 'result'=>'resource', 'field_offset'=>'int'], -'cubrid_field_len' => ['int', 'result'=>'resource', 'field_offset'=>'int'], -'cubrid_field_name' => ['string', 'result'=>'resource', 'field_offset'=>'int'], -'cubrid_field_seek' => ['bool', 'result'=>'resource', 'field_offset='=>'int'], -'cubrid_field_table' => ['string', 'result'=>'resource', 'field_offset'=>'int'], -'cubrid_field_type' => ['string', 'result'=>'resource', 'field_offset'=>'int'], -'cubrid_free_result' => ['bool', 'req_identifier'=>'resource'], -'cubrid_get' => ['mixed', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr='=>'mixed'], -'cubrid_get_autocommit' => ['bool', 'conn_identifier'=>'resource'], -'cubrid_get_charset' => ['string', 'conn_identifier'=>'resource'], -'cubrid_get_class_name' => ['string', 'conn_identifier'=>'resource', 'oid'=>'string'], -'cubrid_get_client_info' => ['string'], -'cubrid_get_db_parameter' => ['array', 'conn_identifier'=>'resource'], -'cubrid_get_query_timeout' => ['int', 'req_identifier'=>'resource'], -'cubrid_get_server_info' => ['string', 'conn_identifier'=>'resource'], -'cubrid_insert_id' => ['string', 'conn_identifier='=>'resource'], -'cubrid_is_instance' => ['int', 'conn_identifier'=>'resource', 'oid'=>'string'], -'cubrid_list_dbs' => ['array', 'conn_identifier'=>'resource'], -'cubrid_load_from_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string', 'file_name'=>'string'], -'cubrid_lob2_bind' => ['bool', 'req_identifier'=>'resource', 'bind_index'=>'int', 'bind_value'=>'mixed', 'bind_value_type='=>'string'], -'cubrid_lob2_close' => ['bool', 'lob_identifier'=>'resource'], -'cubrid_lob2_export' => ['bool', 'lob_identifier'=>'resource', 'file_name'=>'string'], -'cubrid_lob2_import' => ['bool', 'lob_identifier'=>'resource', 'file_name'=>'string'], -'cubrid_lob2_new' => ['resource', 'conn_identifier='=>'resource', 'type='=>'string'], -'cubrid_lob2_read' => ['string', 'lob_identifier'=>'resource', 'length'=>'int'], -'cubrid_lob2_seek' => ['bool', 'lob_identifier'=>'resource', 'offset'=>'int', 'origin='=>'int'], -'cubrid_lob2_seek64' => ['bool', 'lob_identifier'=>'resource', 'offset'=>'string', 'origin='=>'int'], -'cubrid_lob2_size' => ['int', 'lob_identifier'=>'resource'], -'cubrid_lob2_size64' => ['string', 'lob_identifier'=>'resource'], -'cubrid_lob2_tell' => ['int', 'lob_identifier'=>'resource'], -'cubrid_lob2_tell64' => ['string', 'lob_identifier'=>'resource'], -'cubrid_lob2_write' => ['bool', 'lob_identifier'=>'resource', 'buf'=>'string'], -'cubrid_lob_close' => ['bool', 'lob_identifier_array'=>'array'], -'cubrid_lob_export' => ['bool', 'conn_identifier'=>'resource', 'lob_identifier'=>'resource', 'path_name'=>'string'], -'cubrid_lob_get' => ['array', 'conn_identifier'=>'resource', 'sql'=>'string'], -'cubrid_lob_send' => ['bool', 'conn_identifier'=>'resource', 'lob_identifier'=>'resource'], -'cubrid_lob_size' => ['string', 'lob_identifier'=>'resource'], -'cubrid_lock_read' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], -'cubrid_lock_write' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], -'cubrid_move_cursor' => ['int', 'req_identifier'=>'resource', 'offset'=>'int', 'origin='=>'int'], -'cubrid_new_glo' => ['string', 'conn_identifier'=>'', 'class_name'=>'string', 'file_name'=>'string'], -'cubrid_next_result' => ['bool', 'result'=>'resource'], -'cubrid_num_cols' => ['int', 'req_identifier'=>'resource'], -'cubrid_num_fields' => ['int', 'result'=>'resource'], -'cubrid_num_rows' => ['int', 'req_identifier'=>'resource'], -'cubrid_pconnect' => ['resource', 'host'=>'string', 'port'=>'int', 'dbname'=>'string', 'userid='=>'string', 'passwd='=>'string'], -'cubrid_pconnect_with_url' => ['resource', 'conn_url'=>'string', 'userid='=>'string', 'passwd='=>'string'], -'cubrid_ping' => ['bool', 'conn_identifier='=>''], -'cubrid_prepare' => ['resource', 'conn_identifier'=>'resource', 'prepare_stmt'=>'string', 'option='=>'int'], -'cubrid_put' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr='=>'string', 'value='=>'mixed'], -'cubrid_query' => ['resource', 'query'=>'string', 'conn_identifier='=>''], -'cubrid_real_escape_string' => ['string', 'unescaped_string'=>'string', 'conn_identifier='=>''], -'cubrid_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field='=>''], -'cubrid_rollback' => ['bool', 'conn_identifier'=>'resource'], -'cubrid_save_to_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string', 'file_name'=>'string'], -'cubrid_schema' => ['array', 'conn_identifier'=>'resource', 'schema_type'=>'int', 'class_name='=>'string', 'attr_name='=>'string'], -'cubrid_send_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string'], -'cubrid_seq_add' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'seq_element'=>'string'], -'cubrid_seq_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int'], -'cubrid_seq_insert' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int', 'seq_element'=>'string'], -'cubrid_seq_put' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int', 'seq_element'=>'string'], -'cubrid_set_add' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'set_element'=>'string'], -'cubrid_set_autocommit' => ['bool', 'conn_identifier'=>'resource', 'mode'=>'bool'], -'cubrid_set_db_parameter' => ['bool', 'conn_identifier'=>'resource', 'param_type'=>'int', 'param_value'=>'int'], -'cubrid_set_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'set_element'=>'string'], -'cubrid_set_query_timeout' => ['bool', 'req_identifier'=>'resource', 'timeout'=>'int'], -'cubrid_unbuffered_query' => ['resource', 'query'=>'string', 'conn_identifier='=>''], -'cubrid_version' => ['string'], -'curl_close' => ['void', 'handle'=>'CurlHandle'], -'curl_copy_handle' => ['CurlHandle', 'handle'=>'CurlHandle'], -'curl_errno' => ['int', 'handle'=>'CurlHandle'], -'curl_error' => ['string', 'handle'=>'CurlHandle'], -'curl_escape' => ['string|false', 'handle'=>'CurlHandle', 'string'=>'string'], -'curl_exec' => ['bool|string', 'handle'=>'CurlHandle'], -'curl_file_create' => ['CURLFile', 'filename'=>'string', 'mime_type='=>'string|null', 'posted_filename='=>'string|null'], -'curl_getinfo' => ['mixed', 'handle'=>'CurlHandle', 'option='=>'int'], -'curl_init' => ['CurlHandle|false', 'url='=>'string'], -'curl_multi_add_handle' => ['int', 'multi_handle'=>'CurlMultiHandle', 'handle'=>'CurlHandle'], -'curl_multi_close' => ['void', 'multi_handle'=>'CurlMultiHandle'], -'curl_multi_errno' => ['int', 'multi_handle'=>'CurlMultiHandle'], -'curl_multi_exec' => ['int', 'multi_handle'=>'CurlMultiHandle', '&w_still_running'=>'int'], -'curl_multi_getcontent' => ['?string', 'handle'=>'CurlHandle'], -'curl_multi_info_read' => ['array|false', 'multi_handle'=>'CurlMultiHandle', '&w_queued_messages='=>'int'], -'curl_multi_init' => ['CurlMultiHandle|false'], -'curl_multi_remove_handle' => ['int', 'multi_handle'=>'CurlMultiHandle', 'handle'=>'CurlHandle'], -'curl_multi_select' => ['int', 'multi_handle'=>'CurlMultiHandle', 'timeout='=>'float'], -'curl_multi_setopt' => ['bool', 'multi_handle'=>'CurlMultiHandle', 'option'=>'int', 'value'=>'mixed'], -'curl_multi_strerror' => ['?string', 'error_code'=>'int'], -'curl_pause' => ['int', 'handle'=>'CurlHandle', 'flags'=>'int'], -'curl_reset' => ['void', 'handle'=>'CurlHandle'], -'curl_setopt' => ['bool', 'handle'=>'CurlHandle', 'option'=>'int', 'value'=>'callable|mixed'], -'curl_setopt_array' => ['bool', 'handle'=>'CurlHandle', 'options'=>'array'], -'curl_share_close' => ['void', 'share_handle'=>'CurlShareHandle'], -'curl_share_errno' => ['int', 'share_handle'=>'CurlShareHandle'], -'curl_share_init' => ['CurlShareHandle'], -'curl_share_setopt' => ['bool', 'share_handle'=>'CurlShareHandle', 'option'=>'int', 'value'=>'mixed'], -'curl_share_strerror' => ['?string', 'error_code'=>'int'], -'curl_strerror' => ['?string', 'error_code'=>'int'], -'curl_unescape' => ['string|false', 'handle'=>'CurlShareHandle', 'string'=>'string'], -'curl_version' => ['array', 'version='=>'int'], -'CURLFile::__construct' => ['void', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'], -'CURLFile::__wakeup' => ['void'], -'CURLFile::getFilename' => ['string'], -'CURLFile::getMimeType' => ['string'], -'CURLFile::getPostFilename' => ['string'], -'CURLFile::setMimeType' => ['void', 'mime'=>'string'], -'CURLFile::setPostFilename' => ['void', 'name'=>'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'], -'cyrus_bind' => ['bool', 'connection'=>'resource', 'callbacks'=>'array'], -'cyrus_close' => ['bool', 'connection'=>'resource'], -'cyrus_connect' => ['resource', 'host='=>'string', 'port='=>'string', 'flags='=>'int'], -'cyrus_query' => ['array', 'connection'=>'resource', 'query'=>'string'], -'cyrus_unbind' => ['bool', 'connection'=>'resource', 'trigger_name'=>'string'], -'date' => ['string', 'format'=>'string', 'timestamp='=>'?int'], -'date_add' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'], -'date_create' => ['DateTime|false', 'datetime='=>'string', 'timezone='=>'?DateTimeZone'], -'date_create_from_format' => ['DateTime|false', 'format'=>'string', 'datetime'=>'string', 'timezone='=>'?\DateTimeZone'], -'date_create_immutable' => ['DateTimeImmutable|false', 'datetime='=>'string', 'timezone='=>'?DateTimeZone'], -'date_create_immutable_from_format' => ['DateTimeImmutable|false', 'format'=>'string', 'datetime'=>'string', 'timezone='=>'?DateTimeZone'], -'date_date_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'month'=>'int', 'day'=>'int'], -'date_default_timezone_get' => ['string'], -'date_default_timezone_set' => ['bool', 'timezoneId'=>'string'], -'date_diff' => ['DateInterval|false', 'baseObject'=>'DateTimeInterface', 'targetObject'=>'DateTimeInterface', 'absolute='=>'bool'], -'date_format' => ['string', 'object'=>'DateTimeInterface', 'format'=>'string'], -'date_get_last_errors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], -'date_interval_create_from_date_string' => ['DateInterval', 'datetime'=>'string'], -'date_interval_format' => ['string', 'object'=>'DateInterval', 'format'=>'string'], -'date_isodate_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'week'=>'int', 'dayOfWeek='=>'int|mixed'], -'date_modify' => ['DateTime|false', 'object'=>'DateTime', 'modifier'=>'string'], -'date_offset_get' => ['int|false', 'object'=>'DateTimeInterface'], -'date_parse' => ['array|false', 'datetime'=>'string'], -'date_parse_from_format' => ['array', 'format'=>'string', 'datetime'=>'string'], -'date_sub' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'], -'date_sun_info' => ['array|false', 'timestamp'=>'int', 'latitude'=>'float', 'longitude'=>'float'], -'date_sunrise' => ['mixed', 'timestamp'=>'int', 'returnFormat='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'utcOffset='=>'float'], -'date_sunset' => ['mixed', 'timestamp'=>'int', 'returnFormat='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'utcOffset='=>'float'], -'date_time_set' => ['DateTime|false', 'object'=>'', 'hour'=>'', 'minute'=>'', 'second='=>'', 'microsecond='=>''], -'date_timestamp_get' => ['int', 'object'=>'DateTimeInterface'], -'date_timestamp_set' => ['DateTime|false', 'object'=>'DateTime', 'timestamp'=>'int'], -'date_timezone_get' => ['DateTimeZone|false', 'object'=>'DateTimeInterface'], -'date_timezone_set' => ['DateTime|false', 'object'=>'DateTime', 'timezone'=>'DateTimeZone'], -'datefmt_create' => ['?IntlDateFormatter', 'locale'=>'?string', 'dateType='=>'int', 'timeType='=>'int', 'timezone='=>'DateTimeZone|IntlTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'?string'], -'datefmt_format' => ['string|false', 'formatter'=>'IntlDateFormatter', 'datetime'=>'DateTime|IntlCalendar|array|int'], -'datefmt_format_object' => ['string|false', 'datetime'=>'object', 'format='=>'mixed', 'locale='=>'string'], -'datefmt_get_calendar' => ['int', 'formatter'=>'IntlDateFormatter'], -'datefmt_get_calendar_object' => ['IntlCalendar|false|null', 'formatter'=>'IntlDateFormatter'], -'datefmt_get_datetype' => ['int', 'formatter'=>'IntlDateFormatter'], -'datefmt_get_error_code' => ['int', 'formatter'=>'IntlDateFormatter'], -'datefmt_get_error_message' => ['string', 'formatter'=>'IntlDateFormatter'], -'datefmt_get_locale' => ['string|false', 'formatter'=>'IntlDateFormatter', 'type='=>'int'], -'datefmt_get_pattern' => ['string', 'formatter'=>'IntlDateFormatter'], -'datefmt_get_timetype' => ['int', 'formatter'=>'IntlDateFormatter'], -'datefmt_get_timezone' => ['IntlTimeZone|false', 'formatter'=>'IntlDateFormatter'], -'datefmt_get_timezone_id' => ['string|false', 'formatter'=>'IntlDateFormatter'], -'datefmt_is_lenient' => ['bool', 'formatter'=>'IntlDateFormatter'], -'datefmt_localtime' => ['array|false', 'formatter'=>'IntlDateFormatter', 'string'=>'string', '&rw_offset='=>'int'], -'datefmt_parse' => ['int|false', 'formatter'=>'IntlDateFormatter', 'string'=>'string', '&rw_offset='=>'int'], -'datefmt_set_calendar' => ['bool', 'formatter'=>'IntlDateFormatter', 'calendar'=>'int'], -'datefmt_set_lenient' => ['?bool', '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::__set_state' => ['DateInterval', 'array'=>'array'], -'DateInterval::__wakeup' => ['void'], -'DateInterval::createFromDateString' => ['DateInterval|false', 'time'=>'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'], -'DatePeriod::__construct\'2' => ['void', 'iso'=>'string', 'options='=>'int'], -'DatePeriod::__wakeup' => ['void'], -'DatePeriod::getDateInterval' => ['DateInterval'], -'DatePeriod::getEndDate' => ['?DateTimeInterface'], -'DatePeriod::getStartDate' => ['DateTimeInterface'], -'DateTime::__construct' => ['void', 'time='=>'string'], -'DateTime::__construct\'1' => ['void', 'time'=>'?string', 'timezone'=>'?DateTimeZone'], -'DateTime::__set_state' => ['static', 'array'=>'array'], -'DateTime::__wakeup' => ['void'], -'DateTime::add' => ['static', 'interval'=>'DateInterval'], -'DateTime::createFromFormat' => ['static|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'], -'DateTime::createFromImmutable' => ['static', 'object'=>'DateTimeImmutable'], -'DateTime::createFromInterface' => ['self', 'object' => 'DateTimeInterface'], -'DateTime::diff' => ['DateInterval|false', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], -'DateTime::format' => ['string', 'format'=>'string'], -'DateTime::getLastErrors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], -'DateTime::getOffset' => ['int'], -'DateTime::getTimestamp' => ['int|false'], -'DateTime::getTimezone' => ['DateTimeZone|false'], -'DateTime::modify' => ['static|false', 'modify'=>'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::setTimezone' => ['static', 'timezone'=>'DateTimeZone'], -'DateTime::sub' => ['static', 'interval'=>'DateInterval'], -'DateTimeImmutable::__construct' => ['void', 'time='=>'string'], -'DateTimeImmutable::__construct\'1' => ['void', 'time'=>'?string', 'timezone'=>'?DateTimeZone'], -'DateTimeImmutable::__set_state' => ['static', 'array'=>'array'], -'DateTimeImmutable::__wakeup' => ['void'], -'DateTimeImmutable::add' => ['static', 'interval'=>'DateInterval'], -'DateTimeImmutable::createFromFormat' => ['static|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'], -'DateTimeImmutable::createFromInterface' => ['self', 'object' => 'DateTimeInterface'], -'DateTimeImmutable::createFromMutable' => ['static', 'datetime'=>'DateTime'], -'DateTimeImmutable::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], -'DateTimeImmutable::format' => ['string', 'format'=>'string'], -'DateTimeImmutable::getLastErrors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], -'DateTimeImmutable::getOffset' => ['int'], -'DateTimeImmutable::getTimestamp' => ['int|false'], -'DateTimeImmutable::getTimezone' => ['DateTimeZone|false'], -'DateTimeImmutable::modify' => ['static', 'modify'=>'string'], -'DateTimeImmutable::setDate' => ['static|false', 'year'=>'int', 'month'=>'int', 'day'=>'int'], -'DateTimeImmutable::setISODate' => ['static|false', 'year'=>'int', 'week'=>'int', 'day='=>'int'], -'DateTimeImmutable::setTime' => ['static|false', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], -'DateTimeImmutable::setTimestamp' => ['static|false', 'unixtimestamp'=>'int'], -'DateTimeImmutable::setTimezone' => ['static|false', 'timezone'=>'DateTimeZone'], -'DateTimeImmutable::sub' => ['static|false', 'interval'=>'DateInterval'], -'DateTimeInterface::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], -'DateTimeInterface::format' => ['string', 'format'=>'string'], -'DateTimeInterface::getOffset' => ['int'], -'DateTimeInterface::getTimestamp' => ['int|false'], -'DateTimeInterface::getTimezone' => ['DateTimeZone|false'], -'DateTimeZone::__construct' => ['void', 'timezone'=>'string'], -'DateTimeZone::__set_state' => ['DateTimeZone', 'array'=>'array'], -'DateTimeZone::__wakeup' => ['void'], -'DateTimeZone::getLocation' => ['array|false'], -'DateTimeZone::getName' => ['string'], -'DateTimeZone::getOffset' => ['int|false', 'datetime'=>'DateTimeInterface'], -'DateTimeZone::getTransitions' => ['list|false', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'], -'DateTimeZone::listAbbreviations' => ['array>|false'], -'DateTimeZone::listIdentifiers' => ['list', 'timezoneGroup='=>'int', 'countryCode='=>'string|null'], -'db2_autocommit' => ['mixed', 'connection'=>'resource', 'value='=>'int'], -'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_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_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_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_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_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_pclose' => ['bool', 'resource'=>'resource'], -'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_primarykeys' => [''], -'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_rollback' => ['bool', 'connection'=>'resource'], -'db2_server_info' => ['object|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_specialcolumns' => [''], -'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_tableprivileges' => [''], -'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'], -'dba_fetch' => ['string|false', 'key'=>'string', 'skip'=>'int', 'dba'=>'resource'], -'dba_fetch\'1' => ['string|false', 'key'=>'string', 'skip'=>'resource'], -'dba_firstkey' => ['string', 'dba'=>'resource'], -'dba_handlers' => ['array', 'full_info='=>'bool'], -'dba_insert' => ['bool', 'key'=>'string', 'value'=>'string', 'dba'=>'resource'], -'dba_key_split' => ['array|false', 'key'=>'string'], -'dba_list' => ['array'], -'dba_nextkey' => ['string', 'dba'=>'resource'], -'dba_open' => ['resource', 'path'=>'string', 'mode'=>'string', 'handler='=>'string', '...handler_params='=>'string'], -'dba_optimize' => ['bool', 'dba'=>'resource'], -'dba_popen' => ['resource', 'path'=>'string', 'mode'=>'string', 'handler='=>'string', '...handler_params='=>'string'], -'dba_replace' => ['bool', 'key'=>'string', 'value'=>'string', 'dba'=>'resource'], -'dba_sync' => ['bool', 'dba'=>'resource'], -'dbase_add_record' => ['bool', 'dbase_identifier'=>'resource', 'record'=>'array'], -'dbase_close' => ['bool', 'dbase_identifier'=>'resource'], -'dbase_create' => ['resource|false', 'filename'=>'string', 'fields'=>'array'], -'dbase_delete_record' => ['bool', 'dbase_identifier'=>'resource', 'record_number'=>'int'], -'dbase_get_header_info' => ['array', 'dbase_identifier'=>'resource'], -'dbase_get_record' => ['array', 'dbase_identifier'=>'resource', 'record_number'=>'int'], -'dbase_get_record_with_names' => ['array', 'dbase_identifier'=>'resource', 'record_number'=>'int'], -'dbase_numfields' => ['int', 'dbase_identifier'=>'resource'], -'dbase_numrecords' => ['int', 'dbase_identifier'=>'resource'], -'dbase_open' => ['resource|false', 'filename'=>'string', 'mode'=>'int'], -'dbase_pack' => ['bool', 'dbase_identifier'=>'resource'], -'dbase_replace_record' => ['bool', 'dbase_identifier'=>'resource', 'record'=>'array', 'record_number'=>'int'], -'dbplus_add' => ['int', 'relation'=>'resource', 'tuple'=>'array'], -'dbplus_aql' => ['resource', 'query'=>'string', 'server='=>'string', 'dbpath='=>'string'], -'dbplus_chdir' => ['string', 'newdir='=>'string'], -'dbplus_close' => ['mixed', 'relation'=>'resource'], -'dbplus_curr' => ['int', 'relation'=>'resource', 'tuple'=>'array'], -'dbplus_errcode' => ['string', 'errno='=>'int'], -'dbplus_errno' => ['int'], -'dbplus_find' => ['int', 'relation'=>'resource', 'constraints'=>'array', 'tuple'=>'mixed'], -'dbplus_first' => ['int', 'relation'=>'resource', 'tuple'=>'array'], -'dbplus_flush' => ['int', 'relation'=>'resource'], -'dbplus_freealllocks' => ['int'], -'dbplus_freelock' => ['int', 'relation'=>'resource', 'tuple'=>'string'], -'dbplus_freerlocks' => ['int', 'relation'=>'resource'], -'dbplus_getlock' => ['int', 'relation'=>'resource', 'tuple'=>'string'], -'dbplus_getunique' => ['int', 'relation'=>'resource', 'uniqueid'=>'int'], -'dbplus_info' => ['int', 'relation'=>'resource', 'key'=>'string', 'result'=>'array'], -'dbplus_last' => ['int', 'relation'=>'resource', 'tuple'=>'array'], -'dbplus_lockrel' => ['int', 'relation'=>'resource'], -'dbplus_next' => ['int', 'relation'=>'resource', 'tuple'=>'array'], -'dbplus_open' => ['resource', 'name'=>'string'], -'dbplus_prev' => ['int', 'relation'=>'resource', 'tuple'=>'array'], -'dbplus_rchperm' => ['int', 'relation'=>'resource', 'mask'=>'int', 'user'=>'string', 'group'=>'string'], -'dbplus_rcreate' => ['resource', 'name'=>'string', 'domlist'=>'mixed', 'overwrite='=>'bool'], -'dbplus_rcrtexact' => ['mixed', 'name'=>'string', 'relation'=>'resource', 'overwrite='=>'bool'], -'dbplus_rcrtlike' => ['mixed', 'name'=>'string', 'relation'=>'resource', 'overwrite='=>'int'], -'dbplus_resolve' => ['array', 'relation_name'=>'string'], -'dbplus_restorepos' => ['int', 'relation'=>'resource', 'tuple'=>'array'], -'dbplus_rkeys' => ['mixed', 'relation'=>'resource', 'domlist'=>'mixed'], -'dbplus_ropen' => ['resource', 'name'=>'string'], -'dbplus_rquery' => ['resource', 'query'=>'string', 'dbpath='=>'string'], -'dbplus_rrename' => ['int', 'relation'=>'resource', 'name'=>'string'], -'dbplus_rsecindex' => ['mixed', 'relation'=>'resource', 'domlist'=>'mixed', 'type'=>'int'], -'dbplus_runlink' => ['int', 'relation'=>'resource'], -'dbplus_rzap' => ['int', 'relation'=>'resource'], -'dbplus_savepos' => ['int', 'relation'=>'resource'], -'dbplus_setindex' => ['int', 'relation'=>'resource', 'idx_name'=>'string'], -'dbplus_setindexbynumber' => ['int', 'relation'=>'resource', 'idx_number'=>'int'], -'dbplus_sql' => ['resource', 'query'=>'string', 'server='=>'string', 'dbpath='=>'string'], -'dbplus_tcl' => ['string', 'sid'=>'int', 'script'=>'string'], -'dbplus_tremove' => ['int', 'relation'=>'resource', 'tuple'=>'array', 'current='=>'array'], -'dbplus_undo' => ['int', 'relation'=>'resource'], -'dbplus_undoprepare' => ['int', 'relation'=>'resource'], -'dbplus_unlockrel' => ['int', 'relation'=>'resource'], -'dbplus_unselect' => ['int', 'relation'=>'resource'], -'dbplus_update' => ['int', 'relation'=>'resource', 'old'=>'array', 'new'=>'array'], -'dbplus_xlockrel' => ['int', 'relation'=>'resource'], -'dbplus_xunlockrel' => ['int', 'relation'=>'resource'], -'dbx_close' => ['int', 'link_identifier'=>'object'], -'dbx_compare' => ['int', 'row_a'=>'array', 'row_b'=>'array', 'column_key'=>'string', 'flags='=>'int'], -'dbx_connect' => ['object', 'module'=>'mixed', 'host'=>'string', 'database'=>'string', 'username'=>'string', 'password'=>'string', 'persistent='=>'int'], -'dbx_error' => ['string', 'link_identifier'=>'object'], -'dbx_escape_string' => ['string', 'link_identifier'=>'object', 'text'=>'string'], -'dbx_fetch_row' => ['mixed', 'result_identifier'=>'object'], -'dbx_query' => ['mixed', 'link_identifier'=>'object', 'sql_statement'=>'string', 'flags='=>'int'], -'dbx_sort' => ['bool', 'result'=>'object', 'user_compare_function'=>'string'], -'dcgettext' => ['string', 'domain'=>'string', 'message'=>'string', 'category'=>'int'], -'dcngettext' => ['string', 'domain'=>'string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int', 'category'=>'int'], -'deaggregate' => ['', 'object'=>'object', 'class_name='=>'string'], -'debug_backtrace' => ['list', 'options='=>'int', 'limit='=>'int'], -'debug_print_backtrace' => ['void', 'options='=>'int', 'limit='=>'int'], -'debug_zval_dump' => ['void', '...value'=>'mixed'], -'debugger_connect' => [''], -'debugger_connector_pid' => [''], -'debugger_get_server_start_time' => [''], -'debugger_print' => [''], -'debugger_start_debug' => [''], -'decbin' => ['string', 'num'=>'int'], -'dechex' => ['string', 'num'=>'int'], -'decoct' => ['string', 'num'=>'int'], -'define' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'case_insensitive='=>'bool'], -'define_syslog_variables' => ['void'], -'defined' => ['bool', 'constant_name'=>'string'], -'deflate_add' => ['string|false', 'context'=>'resource', 'data'=>'string', 'flush_mode='=>'int'], -'deflate_init' => ['resource|false', 'encoding'=>'int', 'options='=>'array'], -'deg2rad' => ['float', 'num'=>'float'], -'dgettext' => ['string', 'domain'=>'string', 'message'=>'string'], -'dio_close' => ['void', 'fd'=>'resource'], -'dio_fcntl' => ['mixed', 'fd'=>'resource', 'cmd'=>'int', 'args='=>'mixed'], -'dio_open' => ['resource|false', 'filename'=>'string', 'flags'=>'int', 'mode='=>'int'], -'dio_read' => ['string', 'fd'=>'resource', 'length='=>'int'], -'dio_seek' => ['int', 'fd'=>'resource', 'pos'=>'int', 'whence='=>'int'], -'dio_stat' => ['?array', 'fd'=>'resource'], -'dio_tcsetattr' => ['bool', 'fd'=>'resource', 'options'=>'array'], -'dio_truncate' => ['bool', 'fd'=>'resource', 'offset'=>'int'], -'dio_write' => ['int', 'fd'=>'resource', 'data'=>'string', 'length='=>'int'], -'dir' => ['Directory|false', 'directory'=>'string', 'context='=>'resource'], -'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::__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::getFilename' => ['string'], -'DirectoryIterator::getGroup' => ['int'], -'DirectoryIterator::getInode' => ['int'], -'DirectoryIterator::getLinkTarget' => ['string'], -'DirectoryIterator::getMTime' => ['int'], -'DirectoryIterator::getOwner' => ['int'], -'DirectoryIterator::getPath' => ['string'], -'DirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], -'DirectoryIterator::getPathname' => ['string'], -'DirectoryIterator::getPerms' => ['int'], -'DirectoryIterator::getRealPath' => ['string'], -'DirectoryIterator::getSize' => ['int'], -'DirectoryIterator::getType' => ['string'], -'DirectoryIterator::isDir' => ['bool'], -'DirectoryIterator::isDot' => ['bool'], -'DirectoryIterator::isExecutable' => ['bool'], -'DirectoryIterator::isFile' => ['bool'], -'DirectoryIterator::isLink' => ['bool'], -'DirectoryIterator::isReadable' => ['bool'], -'DirectoryIterator::isWritable' => ['bool'], -'DirectoryIterator::key' => ['string'], -'DirectoryIterator::next' => ['void'], -'DirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], -'DirectoryIterator::rewind' => ['void'], -'DirectoryIterator::seek' => ['void', 'position'=>'int'], -'DirectoryIterator::setFileClass' => ['void', 'class_name='=>'string'], -'DirectoryIterator::setInfoClass' => ['void', 'class_name='=>'string'], -'DirectoryIterator::valid' => ['bool'], -'dirname' => ['string', 'path'=>'string', 'levels='=>'int'], -'disk_free_space' => ['float|false', 'directory'=>'string'], -'disk_total_space' => ['float|false', 'directory'=>'string'], -'diskfreespace' => ['float|false', 'directory'=>'string'], -'display_disabled_function' => [''], -'dl' => ['bool', 'extension_filename'=>'string'], -'dngettext' => ['string', 'domain'=>'string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int'], -'dns_check_record' => ['bool', 'hostname'=>'string', 'type='=>'string'], -'dns_get_mx' => ['bool', 'hostname'=>'string', '&w_hosts'=>'array', '&w_weights'=>'array'], -'dns_get_record' => ['list|false', 'hostname'=>'string', 'type='=>'int', '&w_authoritative_name_servers='=>'array', '&w_additional_records='=>'array', 'raw='=>'bool'], -'dom_document_relaxNG_validate_file' => ['bool', 'filename'=>'string'], -'dom_document_relaxNG_validate_xml' => ['bool', 'source'=>'string'], -'dom_document_schema_validate' => ['bool', 'source'=>'string', 'flags'=>'int'], -'dom_document_schema_validate_file' => ['bool', 'filename'=>'string', 'flags'=>'int'], -'dom_document_xinclude' => ['int', 'options'=>'int'], -'dom_import_simplexml' => ['DOMElement', 'node'=>'SimpleXMLElement'], -'dom_xpath_evaluate' => ['', 'expr'=>'string', 'context'=>'DOMNode', 'registernodens'=>'bool'], -'dom_xpath_query' => ['DOMNodeList', 'expr'=>'string', 'context'=>'DOMNode', 'registernodens'=>'bool'], -'dom_xpath_register_ns' => ['bool', 'prefix'=>'string', 'uri'=>'string'], -'dom_xpath_register_php_functions' => [''], -'DomainException::__clone' => ['void'], -'DomainException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?DomainException'], -'DomainException::__toString' => ['string'], -'DomainException::__wakeup' => ['void'], -'DomainException::getCode' => ['int'], -'DomainException::getFile' => ['string'], -'DomainException::getLine' => ['int'], -'DomainException::getMessage' => ['string'], -'DomainException::getPrevious' => ['Throwable|DomainException|null'], -'DomainException::getTrace' => ['list\',args?:array}>'], -'DomainException::getTraceAsString' => ['string'], -'DOMAttr::__construct' => ['void', 'name'=>'string', 'value='=>'string'], -'DOMAttr::getLineNo' => ['int'], -'DOMAttr::getNodePath' => ['?string'], -'DOMAttr::hasAttributes' => ['bool'], -'DOMAttr::hasChildNodes' => ['bool'], -'DOMAttr::insertBefore' => ['DOMNode', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode'], -'DOMAttr::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'], -'DOMAttr::isId' => ['bool'], -'DOMAttr::isSameNode' => ['bool', 'node'=>'DOMNode'], -'DOMAttr::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], -'DOMAttr::lookupNamespaceUri' => ['string', 'prefix'=>'string'], -'DOMAttr::lookupPrefix' => ['string', 'namespaceuri'=>'string'], -'DOMAttr::normalize' => ['void'], -'DOMAttr::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], -'DOMAttr::replaceChild' => ['DOMNode', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], -'DomAttribute::name' => ['string'], -'DomAttribute::set_value' => ['bool', 'content'=>'string'], -'DomAttribute::specified' => ['bool'], -'DomAttribute::value' => ['string'], -'DOMCdataSection::__construct' => ['void', 'value'=>'string'], -'DOMCharacterData::appendData' => ['void', 'data'=>'string'], -'DOMCharacterData::deleteData' => ['void', 'offset'=>'int', 'count'=>'int'], -'DOMCharacterData::insertData' => ['void', 'offset'=>'int', 'data'=>'string'], -'DOMCharacterData::replaceData' => ['void', 'offset'=>'int', 'count'=>'int', 'data'=>'string'], -'DOMCharacterData::substringData' => ['string', 'offset'=>'int', 'count'=>'int'], -'DOMComment::__construct' => ['void', 'value='=>'string'], -'DOMDocument::__construct' => ['void', 'version='=>'string', 'encoding='=>'string'], -'DOMDocument::createAttribute' => ['DOMAttr|false', 'name'=>'string'], -'DOMDocument::createAttributeNS' => ['DOMAttr|false', 'namespaceuri'=>'string', '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', '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', 'localname'=>'string'], -'DOMDocument::importNode' => ['DOMNode|false', 'importednode'=>'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::relaxNGValidate' => ['bool', 'filename'=>'string'], -'DOMDocument::relaxNGValidateSource' => ['bool', 'source'=>'string'], -'DOMDocument::save' => ['int|false', 'filename'=>'string', 'options='=>'int'], -'DOMDocument::saveHTML' => ['string|false', 'node='=>'?DOMNode'], -'DOMDocument::saveHTMLFile' => ['int|false', 'filename'=>'string'], -'DOMDocument::saveXML' => ['string|false', 'node='=>'?DOMNode', 'options='=>'int'], -'DOMDocument::schemaValidate' => ['bool', 'filename'=>'string', 'flags='=>'int'], -'DOMDocument::schemaValidateSource' => ['bool', 'source'=>'string', 'flags='=>'int'], -'DOMDocument::validate' => ['bool'], -'DOMDocument::xinclude' => ['int', 'options='=>'int'], -'DOMDocumentFragment::__construct' => ['void'], -'DOMDocumentFragment::appendXML' => ['bool', 'data'=>'string'], -'DomDocumentType::entities' => ['array'], -'DomDocumentType::internal_subset' => ['bool'], -'DomDocumentType::name' => ['string'], -'DomDocumentType::notations' => ['array'], -'DomDocumentType::public_id' => ['string'], -'DomDocumentType::system_id' => ['string'], -'DOMElement::__construct' => ['void', 'name'=>'string', 'value='=>'string', 'uri='=>'string'], -'DOMElement::get_attribute' => ['string', 'name'=>'string'], -'DOMElement::get_attribute_node' => ['DomAttribute', 'name'=>'string'], -'DOMElement::get_elements_by_tagname' => ['array', 'name'=>'string'], -'DOMElement::getAttribute' => ['string', 'name'=>'string'], -'DOMElement::getAttributeNode' => ['DOMAttr', 'name'=>'string'], -'DOMElement::getAttributeNodeNS' => ['DOMAttr', 'namespaceuri'=>'string', 'localname'=>'string'], -'DOMElement::getAttributeNS' => ['string', 'namespaceuri'=>'string', 'localname'=>'string'], -'DOMElement::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'], -'DOMElement::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string', 'localname'=>'string'], -'DOMElement::has_attribute' => ['bool', 'name'=>'string'], -'DOMElement::hasAttribute' => ['bool', 'name'=>'string'], -'DOMElement::hasAttributeNS' => ['bool', 'namespaceuri'=>'string', 'localname'=>'string'], -'DOMElement::remove_attribute' => ['bool', 'name'=>'string'], -'DOMElement::removeAttribute' => ['bool', 'name'=>'string'], -'DOMElement::removeAttributeNode' => ['bool', 'oldnode'=>'DOMAttr'], -'DOMElement::removeAttributeNS' => ['bool', 'namespaceuri'=>'string', 'localname'=>'string'], -'DOMElement::set_attribute' => ['DomAttribute', 'name'=>'string', 'value'=>'string'], -'DOMElement::set_attribute_node' => ['DomNode', 'attr'=>'DOMNode'], -'DOMElement::setAttribute' => ['DOMAttr|false', 'name'=>'string', 'value'=>'string'], -'DOMElement::setAttributeNode' => ['?DOMAttr', 'attr'=>'DOMAttr'], -'DOMElement::setAttributeNodeNS' => ['DOMAttr', 'attr'=>'DOMAttr'], -'DOMElement::setAttributeNS' => ['void', 'namespaceuri'=>'string', '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::tagname' => ['string'], -'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::hasFeature' => ['bool', 'feature'=>'string', 'version'=>'string'], -'DOMNamedNodeMap::count' => ['int'], -'DOMNamedNodeMap::getNamedItem' => ['?DOMNode', 'name'=>'string'], -'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespaceuri'=>'string', 'localname'=>'string'], -'DOMNamedNodeMap::item' => ['?DOMNode', 'index'=>'int'], -'DomNode::add_namespace' => ['bool', 'uri'=>'string', 'prefix'=>'string'], -'DomNode::append_child' => ['DOMNode', 'newnode'=>'DOMNode'], -'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::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::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], -'DOMNode::lookupNamespaceURI' => ['string', 'prefix'=>'string'], -'DOMNode::lookupPrefix' => ['string', 'namespaceuri'=>'string'], -'DOMNode::normalize' => ['void'], -'DOMNode::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], -'DOMNode::replaceChild' => ['DOMNode|false', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], -'DOMNodeList::count' => ['int'], -'DOMNodeList::item' => ['?DOMNode', 'index'=>'int'], -'DOMProcessingInstruction::__construct' => ['void', 'name'=>'string', 'value'=>'string'], -'DomProcessingInstruction::data' => ['string'], -'DomProcessingInstruction::target' => ['string'], -'DOMText::__construct' => ['void', 'value='=>'string'], -'DOMText::isElementContentWhitespace' => ['bool'], -'DOMText::isWhitespaceInElementContent' => ['bool'], -'DOMText::splitText' => ['DOMText', 'offset'=>'int'], -'domxml_new_doc' => ['DomDocument', 'version'=>'string'], -'domxml_open_file' => ['DomDocument', 'filename'=>'string', 'mode='=>'int', 'error='=>'array'], -'domxml_open_mem' => ['DomDocument', 'string'=>'string', 'mode='=>'int', 'error='=>'array'], -'domxml_version' => ['string'], -'domxml_xmltree' => ['DomDocument', 'string'=>'string'], -'domxml_xslt_stylesheet' => ['DomXsltStylesheet', 'xsl_buf'=>'string'], -'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'], -'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'], -'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'=>''], -'dotnet_load' => ['int', 'assembly_name'=>'string', 'datatype_name='=>'string', 'codepage='=>'int'], -'doubleval' => ['float', 'value'=>'mixed'], -'Ds\Collection::clear' => ['void'], -'Ds\Collection::copy' => ['Ds\Collection'], -'Ds\Collection::isEmpty' => ['bool'], -'Ds\Collection::toArray' => ['array'], -'Ds\Deque::__construct' => ['void', 'values='=>'mixed'], -'Ds\Deque::allocate' => ['void', 'capacity'=>'int'], -'Ds\Deque::apply' => ['void', 'callback'=>'callable'], -'Ds\Deque::capacity' => ['int'], -'Ds\Deque::clear' => ['void'], -'Ds\Deque::contains' => ['bool', '...values='=>'mixed'], -'Ds\Deque::copy' => ['Ds\Deque'], -'Ds\Deque::count' => ['int'], -'Ds\Deque::filter' => ['Ds\Deque', 'callback='=>'callable'], -'Ds\Deque::find' => ['mixed', 'value'=>'mixed'], -'Ds\Deque::first' => ['mixed'], -'Ds\Deque::get' => ['void', 'index'=>'int'], -'Ds\Deque::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], -'Ds\Deque::isEmpty' => ['bool'], -'Ds\Deque::join' => ['string', 'glue='=>'string'], -'Ds\Deque::jsonSerialize' => ['array'], -'Ds\Deque::last' => ['mixed'], -'Ds\Deque::map' => ['Ds\Deque', 'callback'=>'callable'], -'Ds\Deque::merge' => ['Ds\Deque', 'values'=>'mixed'], -'Ds\Deque::pop' => ['mixed'], -'Ds\Deque::push' => ['void', '...values='=>'mixed'], -'Ds\Deque::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], -'Ds\Deque::remove' => ['mixed', 'index'=>'int'], -'Ds\Deque::reverse' => ['void'], -'Ds\Deque::reversed' => ['Ds\Deque'], -'Ds\Deque::rotate' => ['void', 'rotations'=>'int'], -'Ds\Deque::set' => ['void', 'index'=>'int', 'value'=>'mixed'], -'Ds\Deque::shift' => ['mixed'], -'Ds\Deque::slice' => ['Ds\Deque', 'index'=>'int', 'length='=>'?int'], -'Ds\Deque::sort' => ['void', 'comparator='=>'callable'], -'Ds\Deque::sorted' => ['Ds\Deque', 'comparator='=>'callable'], -'Ds\Deque::sum' => ['int|float'], -'Ds\Deque::toArray' => ['array'], -'Ds\Deque::unshift' => ['void', '...values='=>'mixed'], -'Ds\Hashable::equals' => ['bool', 'object'=>'mixed'], -'Ds\Hashable::hash' => ['mixed'], -'Ds\Map::__construct' => ['void', 'values='=>'mixed'], -'Ds\Map::allocate' => ['void', 'capacity'=>'int'], -'Ds\Map::apply' => ['void', 'callback'=>'callable'], -'Ds\Map::capacity' => ['int'], -'Ds\Map::clear' => ['void'], -'Ds\Map::copy' => ['Ds\Map'], -'Ds\Map::count' => ['int'], -'Ds\Map::diff' => ['Ds\Map', 'map'=>'Ds\Map'], -'Ds\Map::filter' => ['Ds\Map', 'callback='=>'callable'], -'Ds\Map::first' => ['Ds\Pair'], -'Ds\Map::get' => ['mixed', 'key'=>'mixed', 'default='=>'mixed'], -'Ds\Map::hasKey' => ['bool', 'key'=>'mixed'], -'Ds\Map::hasValue' => ['bool', 'value'=>'mixed'], -'Ds\Map::intersect' => ['Ds\Map', 'map'=>'Ds\Map'], -'Ds\Map::isEmpty' => ['bool'], -'Ds\Map::jsonSerialize' => ['array'], -'Ds\Map::keys' => ['Ds\Set'], -'Ds\Map::ksort' => ['void', 'comparator='=>'callable'], -'Ds\Map::ksorted' => ['Ds\Map', 'comparator='=>'callable'], -'Ds\Map::last' => ['Ds\Pair'], -'Ds\Map::map' => ['Ds\Map', 'callback'=>'callable'], -'Ds\Map::merge' => ['Ds\Map', 'values'=>'mixed'], -'Ds\Map::pairs' => ['Ds\Sequence'], -'Ds\Map::put' => ['void', 'key'=>'mixed', 'value'=>'mixed'], -'Ds\Map::putAll' => ['void', 'values'=>'mixed'], -'Ds\Map::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], -'Ds\Map::remove' => ['mixed', 'key'=>'mixed', 'default='=>'mixed'], -'Ds\Map::reverse' => ['void'], -'Ds\Map::reversed' => ['Ds\Map'], -'Ds\Map::skip' => ['Ds\Pair', 'position'=>'int'], -'Ds\Map::slice' => ['Ds\Map', 'index'=>'int', 'length='=>'?int'], -'Ds\Map::sort' => ['void', 'comparator='=>'callable'], -'Ds\Map::sorted' => ['Ds\Map', 'comparator='=>'callable'], -'Ds\Map::sum' => ['int|float'], -'Ds\Map::toArray' => ['array'], -'Ds\Map::union' => ['Ds\Map', 'map'=>'Ds\Map'], -'Ds\Map::values' => ['Ds\Sequence'], -'Ds\Map::xor' => ['Ds\Map', 'map'=>'Ds\Map'], -'Ds\Pair::__construct' => ['void', 'key='=>'mixed', 'value='=>'mixed'], -'Ds\Pair::clear' => ['void'], -'Ds\Pair::copy' => ['Ds\Pair'], -'Ds\Pair::isEmpty' => ['bool'], -'Ds\Pair::jsonSerialize' => ['array'], -'Ds\Pair::toArray' => ['array'], -'Ds\PriorityQueue::__construct' => ['void'], -'Ds\PriorityQueue::allocate' => ['void', 'capacity'=>'int'], -'Ds\PriorityQueue::capacity' => ['int'], -'Ds\PriorityQueue::clear' => ['void'], -'Ds\PriorityQueue::copy' => ['Ds\PriorityQueue'], -'Ds\PriorityQueue::count' => ['int'], -'Ds\PriorityQueue::isEmpty' => ['bool'], -'Ds\PriorityQueue::jsonSerialize' => ['array'], -'Ds\PriorityQueue::peek' => ['mixed'], -'Ds\PriorityQueue::pop' => ['mixed'], -'Ds\PriorityQueue::push' => ['void', 'value'=>'mixed', 'priority'=>'int'], -'Ds\PriorityQueue::toArray' => ['array'], -'Ds\Queue::__construct' => ['void', 'values='=>'mixed'], -'Ds\Queue::allocate' => ['void', 'capacity'=>'int'], -'Ds\Queue::capacity' => ['int'], -'Ds\Queue::clear' => ['void'], -'Ds\Queue::copy' => ['Ds\Queue'], -'Ds\Queue::count' => ['int'], -'Ds\Queue::isEmpty' => ['bool'], -'Ds\Queue::jsonSerialize' => ['array'], -'Ds\Queue::peek' => ['mixed'], -'Ds\Queue::pop' => ['mixed'], -'Ds\Queue::push' => ['void', '...values='=>'mixed'], -'Ds\Queue::toArray' => ['array'], -'Ds\Sequence::allocate' => ['void', 'capacity'=>'int'], -'Ds\Sequence::apply' => ['void', 'callback'=>'callable'], -'Ds\Sequence::capacity' => ['int'], -'Ds\Sequence::contains' => ['bool', '...values='=>'mixed'], -'Ds\Sequence::filter' => ['Ds\Sequence', 'callback='=>'callable'], -'Ds\Sequence::find' => ['mixed', 'value'=>'mixed'], -'Ds\Sequence::first' => ['mixed'], -'Ds\Sequence::get' => ['mixed', 'index'=>'int'], -'Ds\Sequence::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], -'Ds\Sequence::join' => ['string', 'glue='=>'string'], -'Ds\Sequence::last' => ['void'], -'Ds\Sequence::map' => ['Ds\Sequence', 'callback'=>'callable'], -'Ds\Sequence::merge' => ['Ds\Sequence', 'values'=>'mixed'], -'Ds\Sequence::pop' => ['mixed'], -'Ds\Sequence::push' => ['void', '...values='=>'mixed'], -'Ds\Sequence::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], -'Ds\Sequence::remove' => ['mixed', 'index'=>'int'], -'Ds\Sequence::reverse' => ['void'], -'Ds\Sequence::reversed' => ['Ds\Sequence'], -'Ds\Sequence::rotate' => ['void', 'rotations'=>'int'], -'Ds\Sequence::set' => ['void', 'index'=>'int', 'value'=>'mixed'], -'Ds\Sequence::shift' => ['mixed'], -'Ds\Sequence::slice' => ['Ds\Sequence', 'index'=>'int', 'length='=>'?int'], -'Ds\Sequence::sort' => ['void', 'comparator='=>'callable'], -'Ds\Sequence::sorted' => ['Ds\Sequence', 'comparator='=>'callable'], -'Ds\Sequence::sum' => ['int|float'], -'Ds\Sequence::unshift' => ['void', '...values='=>'mixed'], -'Ds\Set::__construct' => ['void', 'values='=>'mixed'], -'Ds\Set::add' => ['void', '...values='=>'mixed'], -'Ds\Set::allocate' => ['void', 'capacity'=>'int'], -'Ds\Set::capacity' => ['int'], -'Ds\Set::clear' => ['void'], -'Ds\Set::contains' => ['bool', '...values='=>'mixed'], -'Ds\Set::copy' => ['Ds\Set'], -'Ds\Set::count' => ['int'], -'Ds\Set::diff' => ['Ds\Set', 'set'=>'Ds\Set'], -'Ds\Set::filter' => ['Ds\Set', 'callback='=>'callable'], -'Ds\Set::first' => ['mixed'], -'Ds\Set::get' => ['mixed', 'index'=>'int'], -'Ds\Set::intersect' => ['Ds\Set', 'set'=>'Ds\Set'], -'Ds\Set::isEmpty' => ['bool'], -'Ds\Set::join' => ['string', 'glue='=>'string'], -'Ds\Set::jsonSerialize' => ['array'], -'Ds\Set::last' => ['mixed'], -'Ds\Set::merge' => ['Ds\Set', 'values'=>'mixed'], -'Ds\Set::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], -'Ds\Set::remove' => ['void', '...values='=>'mixed'], -'Ds\Set::reverse' => ['void'], -'Ds\Set::reversed' => ['Ds\Set'], -'Ds\Set::slice' => ['Ds\Set', 'index'=>'int', 'length='=>'?int'], -'Ds\Set::sort' => ['void', 'comparator='=>'callable'], -'Ds\Set::sorted' => ['Ds\Set', 'comparator='=>'callable'], -'Ds\Set::sum' => ['int|float'], -'Ds\Set::toArray' => ['array'], -'Ds\Set::union' => ['Ds\Set', 'set'=>'Ds\Set'], -'Ds\Set::xor' => ['Ds\Set', 'set'=>'Ds\Set'], -'Ds\Stack::__construct' => ['void', 'values='=>'mixed'], -'Ds\Stack::allocate' => ['void', 'capacity'=>'int'], -'Ds\Stack::capacity' => ['int'], -'Ds\Stack::clear' => ['void'], -'Ds\Stack::copy' => ['Ds\Stack'], -'Ds\Stack::count' => ['int'], -'Ds\Stack::isEmpty' => ['bool'], -'Ds\Stack::jsonSerialize' => ['array'], -'Ds\Stack::peek' => ['mixed'], -'Ds\Stack::pop' => ['mixed'], -'Ds\Stack::push' => ['void', '...values='=>'mixed'], -'Ds\Stack::toArray' => ['array'], -'Ds\Vector::__construct' => ['void', 'values='=>'mixed'], -'Ds\Vector::allocate' => ['void', 'capacity'=>'int'], -'Ds\Vector::apply' => ['void', 'callback'=>'callable'], -'Ds\Vector::capacity' => ['int'], -'Ds\Vector::clear' => ['void'], -'Ds\Vector::contains' => ['bool', '...values='=>'mixed'], -'Ds\Vector::copy' => ['Ds\Vector'], -'Ds\Vector::count' => ['int'], -'Ds\Vector::filter' => ['Ds\Vector', 'callback='=>'callable'], -'Ds\Vector::find' => ['mixed', 'value'=>'mixed'], -'Ds\Vector::first' => ['mixed'], -'Ds\Vector::get' => ['mixed', 'index'=>'int'], -'Ds\Vector::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], -'Ds\Vector::isEmpty' => ['bool'], -'Ds\Vector::join' => ['string', 'glue='=>'string'], -'Ds\Vector::jsonSerialize' => ['array'], -'Ds\Vector::last' => ['mixed'], -'Ds\Vector::map' => ['Ds\Vector', 'callback'=>'callable'], -'Ds\Vector::merge' => ['Ds\Vector', 'values'=>'mixed'], -'Ds\Vector::pop' => ['mixed'], -'Ds\Vector::push' => ['void', '...values='=>'mixed'], -'Ds\Vector::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], -'Ds\Vector::remove' => ['mixed', 'index'=>'int'], -'Ds\Vector::reverse' => ['void'], -'Ds\Vector::reversed' => ['Ds\Vector'], -'Ds\Vector::rotate' => ['void', 'rotations'=>'int'], -'Ds\Vector::set' => ['void', 'index'=>'int', 'value'=>'mixed'], -'Ds\Vector::shift' => ['mixed'], -'Ds\Vector::slice' => ['Ds\Vector', 'index'=>'int', 'length='=>'?int'], -'Ds\Vector::sort' => ['void', 'comparator='=>'callable'], -'Ds\Vector::sorted' => ['Ds\Vector', 'comparator='=>'callable'], -'Ds\Vector::sum' => ['int|float'], -'Ds\Vector::toArray' => ['array'], -'Ds\Vector::unshift' => ['void', '...values='=>'mixed'], -'easter_date' => ['int', 'year='=>'int'], -'easter_days' => ['int', 'year='=>'int', 'mode='=>'int'], -'echo' => ['void', 'arg1'=>'string', '...args='=>'string'], -'eio_busy' => ['resource', 'delay'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_cancel' => ['void', 'req'=>'resource'], -'eio_chmod' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_chown' => ['resource', 'path'=>'string', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_close' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_custom' => ['resource', 'execute'=>'callable', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], -'eio_dup2' => ['resource', 'fd'=>'mixed', 'fd2'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_event_loop' => ['bool'], -'eio_fallocate' => ['resource', 'fd'=>'mixed', 'mode'=>'int', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_fchmod' => ['resource', 'fd'=>'mixed', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_fchown' => ['resource', 'fd'=>'mixed', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_fdatasync' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_fstat' => ['resource', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], -'eio_fstatvfs' => ['resource', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], -'eio_fsync' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_ftruncate' => ['resource', 'fd'=>'mixed', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_futime' => ['resource', 'fd'=>'mixed', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_get_event_stream' => ['mixed'], -'eio_get_last_error' => ['string', 'req'=>'resource'], -'eio_grp' => ['resource', 'callback'=>'callable', 'data='=>'string'], -'eio_grp_add' => ['void', 'grp'=>'resource', 'req'=>'resource'], -'eio_grp_cancel' => ['void', 'grp'=>'resource'], -'eio_grp_limit' => ['void', 'grp'=>'resource', 'limit'=>'int'], -'eio_init' => ['void'], -'eio_link' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_lstat' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], -'eio_mkdir' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_mknod' => ['resource', 'path'=>'string', 'mode'=>'int', 'dev'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_nop' => ['resource', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_npending' => ['int'], -'eio_nready' => ['int'], -'eio_nreqs' => ['int'], -'eio_nthreads' => ['int'], -'eio_open' => ['resource', 'path'=>'string', 'flags'=>'int', 'mode'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], -'eio_poll' => ['int'], -'eio_read' => ['resource', 'fd'=>'mixed', 'length'=>'int', 'offset'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], -'eio_readahead' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_readdir' => ['resource', 'path'=>'string', 'flags'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], -'eio_readlink' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], -'eio_realpath' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], -'eio_rename' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_rmdir' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_seek' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'whence'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_sendfile' => ['resource', 'out_fd'=>'mixed', 'in_fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'string'], -'eio_set_max_idle' => ['void', 'nthreads'=>'int'], -'eio_set_max_parallel' => ['void', 'nthreads'=>'int'], -'eio_set_max_poll_reqs' => ['void', 'nreqs'=>'int'], -'eio_set_max_poll_time' => ['void', 'nseconds'=>'float'], -'eio_set_min_parallel' => ['void', 'nthreads'=>'string'], -'eio_stat' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], -'eio_statvfs' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], -'eio_symlink' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_sync' => ['resource', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_sync_file_range' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'nbytes'=>'int', 'flags'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_syncfs' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_truncate' => ['resource', 'path'=>'string', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_unlink' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_utime' => ['resource', 'path'=>'string', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'eio_write' => ['resource', 'fd'=>'mixed', 'string'=>'string', 'length='=>'int', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'empty' => ['bool', 'value'=>'mixed'], -'EmptyIterator::current' => ['mixed'], -'EmptyIterator::key' => ['mixed'], -'EmptyIterator::next' => ['void'], -'EmptyIterator::rewind' => ['void'], -'EmptyIterator::valid' => ['bool'], -'enchant_broker_describe' => ['array', 'broker'=>'resource'], -'enchant_broker_dict_exists' => ['bool', 'broker'=>'resource', 'tag'=>'string'], -'enchant_broker_free' => ['bool', 'broker'=>'resource'], -'enchant_broker_free_dict' => ['bool', 'dictionary'=>'resource'], -'enchant_broker_get_dict_path' => ['string', 'broker'=>'resource', 'type'=>'int'], -'enchant_broker_get_error' => ['string|false', 'broker'=>'resource'], -'enchant_broker_init' => ['resource|false'], -'enchant_broker_list_dicts' => ['array|false', 'broker'=>'resource'], -'enchant_broker_request_dict' => ['resource|false', 'broker'=>'resource', 'tag'=>'string'], -'enchant_broker_request_pwl_dict' => ['resource|false', 'broker'=>'resource', 'filename'=>'string'], -'enchant_broker_set_dict_path' => ['bool', 'broker'=>'resource', 'type'=>'int', 'path'=>'string'], -'enchant_broker_set_ordering' => ['bool', 'broker'=>'resource', 'tag'=>'string', 'ordering'=>'string'], -'enchant_dict_add_to_personal' => ['void', 'dictionary'=>'resource', 'word'=>'string'], -'enchant_dict_add_to_session' => ['void', 'dictionary'=>'resource', 'word'=>'string'], -'enchant_dict_check' => ['bool', 'dictionary'=>'resource', 'word'=>'string'], -'enchant_dict_describe' => ['array', 'dictionary'=>'resource'], -'enchant_dict_get_error' => ['string', 'dictionary'=>'resource'], -'enchant_dict_is_in_session' => ['bool', 'dictionary'=>'resource', 'word'=>'string'], -'enchant_dict_quick_check' => ['bool', 'dictionary'=>'resource', 'word'=>'string', '&w_suggestions='=>'array'], -'enchant_dict_store_replacement' => ['void', 'dictionary'=>'resource', 'misspelled'=>'string', 'correct'=>'string'], -'enchant_dict_suggest' => ['array', 'dictionary'=>'resource', 'word'=>'string'], -'end' => ['mixed|false', '&r_array'=>'array|object'], -'enum_exists' => ['bool', 'enum' => 'class-string', 'autoload=' => 'bool'], -'Error::__clone' => ['void'], -'Error::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], -'Error::__toString' => ['string'], -'Error::getCode' => ['int'], -'Error::getFile' => ['string'], -'Error::getLine' => ['int'], -'Error::getMessage' => ['string'], -'Error::getPrevious' => ['Throwable|Error|null'], -'Error::getTrace' => ['list\',args?:array}>'], -'Error::getTraceAsString' => ['string'], -'error_clear_last' => ['void'], -'error_get_last' => ['?array{type:int,message:string,file:string,line:int}'], -'error_log' => ['bool', 'message'=>'string', 'message_type='=>'int', 'destination='=>'string', 'additional_headers='=>'string'], -'error_reporting' => ['int', 'error_level='=>'int'], -'ErrorException::__clone' => ['void'], -'ErrorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'severity='=>'int', 'filename='=>'string', 'line='=>'int', 'previous='=>'?Throwable|?ErrorException'], -'ErrorException::__toString' => ['string'], -'ErrorException::getCode' => ['int'], -'ErrorException::getFile' => ['string'], -'ErrorException::getLine' => ['int'], -'ErrorException::getMessage' => ['string'], -'ErrorException::getPrevious' => ['Throwable|ErrorException|null'], -'ErrorException::getSeverity' => ['int'], -'ErrorException::getTrace' => ['list\',args?:array}>'], -'ErrorException::getTraceAsString' => ['string'], -'escapeshellarg' => ['string', 'arg'=>'string'], -'escapeshellcmd' => ['string', 'command'=>'string'], -'Ev::backend' => ['int'], -'Ev::depth' => ['int'], -'Ev::embeddableBackends' => ['int'], -'Ev::feedSignal' => ['void', 'signum'=>'int'], -'Ev::feedSignalEvent' => ['void', 'signum'=>'int'], -'Ev::iteration' => ['int'], -'Ev::now' => ['float'], -'Ev::nowUpdate' => ['void'], -'Ev::recommendedBackends' => ['int'], -'Ev::resume' => ['void'], -'Ev::run' => ['void', 'flags='=>'int'], -'Ev::sleep' => ['void', 'seconds'=>'float'], -'Ev::stop' => ['void', 'how='=>'int'], -'Ev::supportedBackends' => ['int'], -'Ev::suspend' => ['void'], -'Ev::time' => ['float'], -'Ev::verify' => ['void'], -'eval' => ['mixed', 'code_str'=>'string'], -'EvCheck::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvCheck::clear' => ['int'], -'EvCheck::createStopped' => ['EvCheck', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvCheck::feed' => ['void', 'events'=>'int'], -'EvCheck::getLoop' => ['EvLoop'], -'EvCheck::invoke' => ['void', 'events'=>'int'], -'EvCheck::keepAlive' => ['void', 'value'=>'bool'], -'EvCheck::setCallback' => ['void', 'callback'=>'callable'], -'EvCheck::start' => ['void'], -'EvCheck::stop' => ['void'], -'EvChild::__construct' => ['void', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvChild::clear' => ['int'], -'EvChild::createStopped' => ['EvChild', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvChild::feed' => ['void', 'events'=>'int'], -'EvChild::getLoop' => ['EvLoop'], -'EvChild::invoke' => ['void', 'events'=>'int'], -'EvChild::keepAlive' => ['void', 'value'=>'bool'], -'EvChild::set' => ['void', 'pid'=>'int', 'trace'=>'bool'], -'EvChild::setCallback' => ['void', 'callback'=>'callable'], -'EvChild::start' => ['void'], -'EvChild::stop' => ['void'], -'EvEmbed::__construct' => ['void', 'other'=>'object', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvEmbed::clear' => ['int'], -'EvEmbed::createStopped' => ['EvEmbed', 'other'=>'object', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvEmbed::feed' => ['void', 'events'=>'int'], -'EvEmbed::getLoop' => ['EvLoop'], -'EvEmbed::invoke' => ['void', 'events'=>'int'], -'EvEmbed::keepAlive' => ['void', 'value'=>'bool'], -'EvEmbed::set' => ['void', 'other'=>'object'], -'EvEmbed::setCallback' => ['void', 'callback'=>'callable'], -'EvEmbed::start' => ['void'], -'EvEmbed::stop' => ['void'], -'EvEmbed::sweep' => ['void'], -'Event::__construct' => ['void', 'base'=>'EventBase', 'fd'=>'mixed', 'what'=>'int', 'cb'=>'callable', 'arg='=>'mixed'], -'Event::add' => ['bool', 'timeout='=>'float'], -'Event::addSignal' => ['bool', 'timeout='=>'float'], -'Event::addTimer' => ['bool', 'timeout='=>'float'], -'Event::del' => ['bool'], -'Event::delSignal' => ['bool'], -'Event::delTimer' => ['bool'], -'Event::free' => ['void'], -'Event::getSupportedMethods' => ['array'], -'Event::pending' => ['bool', 'flags'=>'int'], -'Event::set' => ['bool', 'base'=>'EventBase', 'fd'=>'mixed', 'what='=>'int', 'cb='=>'callable', 'arg='=>'mixed'], -'Event::setPriority' => ['bool', 'priority'=>'int'], -'Event::setTimer' => ['bool', 'base'=>'EventBase', 'cb'=>'callable', 'arg='=>'mixed'], -'Event::signal' => ['Event', 'base'=>'EventBase', 'signum'=>'int', 'cb'=>'callable', 'arg='=>'mixed'], -'Event::timer' => ['Event', 'base'=>'EventBase', 'cb'=>'callable', 'arg='=>'mixed'], -'event_add' => ['bool', 'event'=>'resource', 'timeout='=>'int'], -'event_base_free' => ['void', 'event_base'=>'resource'], -'event_base_loop' => ['int', 'event_base'=>'resource', 'flags='=>'int'], -'event_base_loopbreak' => ['bool', 'event_base'=>'resource'], -'event_base_loopexit' => ['bool', 'event_base'=>'resource', 'timeout='=>'int'], -'event_base_new' => ['resource|false'], -'event_base_priority_init' => ['bool', 'event_base'=>'resource', 'npriorities'=>'int'], -'event_base_reinit' => ['bool', 'event_base'=>'resource'], -'event_base_set' => ['bool', 'event'=>'resource', 'event_base'=>'resource'], -'event_buffer_base_set' => ['bool', 'bevent'=>'resource', 'event_base'=>'resource'], -'event_buffer_disable' => ['bool', 'bevent'=>'resource', 'events'=>'int'], -'event_buffer_enable' => ['bool', 'bevent'=>'resource', 'events'=>'int'], -'event_buffer_fd_set' => ['void', 'bevent'=>'resource', 'fd'=>'resource'], -'event_buffer_free' => ['void', 'bevent'=>'resource'], -'event_buffer_new' => ['resource|false', 'stream'=>'resource', 'readcb'=>'callable|null', 'writecb'=>'callable|null', 'errorcb'=>'callable', 'arg='=>'mixed'], -'event_buffer_priority_set' => ['bool', 'bevent'=>'resource', 'priority'=>'int'], -'event_buffer_read' => ['string', 'bevent'=>'resource', 'data_size'=>'int'], -'event_buffer_set_callback' => ['bool', 'event'=>'resource', 'readcb'=>'mixed', 'writecb'=>'mixed', 'errorcb'=>'mixed', 'arg='=>'mixed'], -'event_buffer_timeout_set' => ['void', 'bevent'=>'resource', 'read_timeout'=>'int', 'write_timeout'=>'int'], -'event_buffer_watermark_set' => ['void', 'bevent'=>'resource', 'events'=>'int', 'lowmark'=>'int', 'highmark'=>'int'], -'event_buffer_write' => ['bool', 'bevent'=>'resource', 'data'=>'string', 'data_size='=>'int'], -'event_del' => ['bool', 'event'=>'resource'], -'event_free' => ['void', 'event'=>'resource'], -'event_new' => ['resource|false'], -'event_priority_set' => ['bool', 'event'=>'resource', 'priority'=>'int'], -'event_set' => ['bool', 'event'=>'resource', 'fd'=>'int|resource', 'events'=>'int', 'callback'=>'callable', 'arg='=>'mixed'], -'event_timer_add' => ['bool', 'event'=>'resource', 'timeout='=>'int'], -'event_timer_del' => ['bool', 'event'=>'resource'], -'event_timer_new' => ['resource|false'], -'event_timer_pending' => ['bool', 'event'=>'resource', 'timeout='=>'int'], -'event_timer_set' => ['bool', 'event'=>'resource', 'callback'=>'callable', 'arg='=>'mixed'], -'EventBase::__construct' => ['void', 'cfg='=>'EventConfig'], -'EventBase::dispatch' => ['void'], -'EventBase::exit' => ['bool', 'timeout='=>'float'], -'EventBase::free' => ['void'], -'EventBase::getFeatures' => ['int'], -'EventBase::getMethod' => ['string', 'cfg='=>'EventConfig'], -'EventBase::getTimeOfDayCached' => ['float'], -'EventBase::gotExit' => ['bool'], -'EventBase::gotStop' => ['bool'], -'EventBase::loop' => ['bool', 'flags='=>'int'], -'EventBase::priorityInit' => ['bool', 'n_priorities'=>'int'], -'EventBase::reInit' => ['bool'], -'EventBase::stop' => ['bool'], -'EventBuffer::__construct' => ['void'], -'EventBuffer::add' => ['bool', 'data'=>'string'], -'EventBuffer::addBuffer' => ['bool', 'buf'=>'EventBuffer'], -'EventBuffer::appendFrom' => ['int', 'buf'=>'EventBuffer', 'length'=>'int'], -'EventBuffer::copyout' => ['int', '&w_data'=>'string', 'max_bytes'=>'int'], -'EventBuffer::drain' => ['bool', 'length'=>'int'], -'EventBuffer::enableLocking' => ['void'], -'EventBuffer::expand' => ['bool', 'length'=>'int'], -'EventBuffer::freeze' => ['bool', 'at_front'=>'bool'], -'EventBuffer::lock' => ['void'], -'EventBuffer::prepend' => ['bool', 'data'=>'string'], -'EventBuffer::prependBuffer' => ['bool', 'buf'=>'EventBuffer'], -'EventBuffer::pullup' => ['string', 'size'=>'int'], -'EventBuffer::read' => ['string', 'max_bytes'=>'int'], -'EventBuffer::readFrom' => ['int', 'fd'=>'mixed', 'howmuch'=>'int'], -'EventBuffer::readLine' => ['string', 'eol_style'=>'int'], -'EventBuffer::search' => ['mixed', 'what'=>'string', 'start='=>'int', 'end='=>'int'], -'EventBuffer::searchEol' => ['mixed', 'start='=>'int', 'eol_style='=>'int'], -'EventBuffer::substr' => ['string', 'start'=>'int', 'length='=>'int'], -'EventBuffer::unfreeze' => ['bool', 'at_front'=>'bool'], -'EventBuffer::unlock' => ['bool'], -'EventBuffer::write' => ['int', 'fd'=>'mixed', 'howmuch='=>'int'], -'EventBufferEvent::__construct' => ['void', 'base'=>'EventBase', 'socket='=>'mixed', 'options='=>'int', 'readcb='=>'callable', 'writecb='=>'callable', 'eventcb='=>'callable'], -'EventBufferEvent::close' => ['void'], -'EventBufferEvent::connect' => ['bool', 'addr'=>'string'], -'EventBufferEvent::connectHost' => ['bool', 'dns_base'=>'EventDnsBase', 'hostname'=>'string', 'port'=>'int', 'family='=>'int'], -'EventBufferEvent::createPair' => ['array', 'base'=>'EventBase', 'options='=>'int'], -'EventBufferEvent::disable' => ['bool', 'events'=>'int'], -'EventBufferEvent::enable' => ['bool', 'events'=>'int'], -'EventBufferEvent::free' => ['void'], -'EventBufferEvent::getDnsErrorString' => ['string'], -'EventBufferEvent::getEnabled' => ['int'], -'EventBufferEvent::getInput' => ['EventBuffer'], -'EventBufferEvent::getOutput' => ['EventBuffer'], -'EventBufferEvent::read' => ['string', 'size'=>'int'], -'EventBufferEvent::readBuffer' => ['bool', 'buf'=>'EventBuffer'], -'EventBufferEvent::setCallbacks' => ['void', 'readcb'=>'callable', 'writecb'=>'callable', 'eventcb'=>'callable', 'arg='=>'string'], -'EventBufferEvent::setPriority' => ['bool', 'priority'=>'int'], -'EventBufferEvent::setTimeouts' => ['bool', 'timeout_read'=>'float', 'timeout_write'=>'float'], -'EventBufferEvent::setWatermark' => ['void', 'events'=>'int', 'lowmark'=>'int', 'highmark'=>'int'], -'EventBufferEvent::sslError' => ['string'], -'EventBufferEvent::sslFilter' => ['EventBufferEvent', 'base'=>'EventBase', 'underlying'=>'EventBufferEvent', 'ctx'=>'EventSslContext', 'state'=>'int', 'options='=>'int'], -'EventBufferEvent::sslGetCipherInfo' => ['string'], -'EventBufferEvent::sslGetCipherName' => ['string'], -'EventBufferEvent::sslGetCipherVersion' => ['string'], -'EventBufferEvent::sslGetProtocol' => ['string'], -'EventBufferEvent::sslRenegotiate' => ['void'], -'EventBufferEvent::sslSocket' => ['EventBufferEvent', 'base'=>'EventBase', 'socket'=>'mixed', 'ctx'=>'EventSslContext', 'state'=>'int', 'options='=>'int'], -'EventBufferEvent::write' => ['bool', 'data'=>'string'], -'EventBufferEvent::writeBuffer' => ['bool', 'buf'=>'EventBuffer'], -'EventConfig::__construct' => ['void'], -'EventConfig::avoidMethod' => ['bool', 'method'=>'string'], -'EventConfig::requireFeatures' => ['bool', 'feature'=>'int'], -'EventConfig::setMaxDispatchInterval' => ['void', 'max_interval'=>'int', 'max_callbacks'=>'int', 'min_priority'=>'int'], -'EventDnsBase::__construct' => ['void', 'base'=>'EventBase', 'initialize'=>'bool'], -'EventDnsBase::addNameserverIp' => ['bool', 'ip'=>'string'], -'EventDnsBase::addSearch' => ['void', 'domain'=>'string'], -'EventDnsBase::clearSearch' => ['void'], -'EventDnsBase::countNameservers' => ['int'], -'EventDnsBase::loadHosts' => ['bool', 'hosts'=>'string'], -'EventDnsBase::parseResolvConf' => ['bool', 'flags'=>'int', 'filename'=>'string'], -'EventDnsBase::setOption' => ['bool', 'option'=>'string', 'value'=>'string'], -'EventDnsBase::setSearchNdots' => ['bool', 'ndots'=>'int'], -'EventHttp::__construct' => ['void', 'base'=>'EventBase', 'ctx='=>'EventSslContext'], -'EventHttp::accept' => ['bool', 'socket'=>'mixed'], -'EventHttp::addServerAlias' => ['bool', 'alias'=>'string'], -'EventHttp::bind' => ['void', 'address'=>'string', 'port'=>'int'], -'EventHttp::removeServerAlias' => ['bool', 'alias'=>'string'], -'EventHttp::setAllowedMethods' => ['void', 'methods'=>'int'], -'EventHttp::setCallback' => ['void', 'path'=>'string', 'cb'=>'string', 'arg='=>'string'], -'EventHttp::setDefaultCallback' => ['void', 'cb'=>'string', 'arg='=>'string'], -'EventHttp::setMaxBodySize' => ['void', 'value'=>'int'], -'EventHttp::setMaxHeadersSize' => ['void', 'value'=>'int'], -'EventHttp::setTimeout' => ['void', 'value'=>'int'], -'EventHttpConnection::__construct' => ['void', 'base'=>'EventBase', 'dns_base'=>'EventDnsBase', 'address'=>'string', 'port'=>'int', 'ctx='=>'EventSslContext'], -'EventHttpConnection::getBase' => ['EventBase'], -'EventHttpConnection::getPeer' => ['void', '&w_address'=>'string', '&w_port'=>'int'], -'EventHttpConnection::makeRequest' => ['bool', 'req'=>'EventHttpRequest', 'type'=>'int', 'uri'=>'string'], -'EventHttpConnection::setCloseCallback' => ['void', 'callback'=>'callable', 'data='=>'mixed'], -'EventHttpConnection::setLocalAddress' => ['void', 'address'=>'string'], -'EventHttpConnection::setLocalPort' => ['void', 'port'=>'int'], -'EventHttpConnection::setMaxBodySize' => ['void', 'max_size'=>'string'], -'EventHttpConnection::setMaxHeadersSize' => ['void', 'max_size'=>'string'], -'EventHttpConnection::setRetries' => ['void', 'retries'=>'int'], -'EventHttpConnection::setTimeout' => ['void', 'timeout'=>'int'], -'EventHttpRequest::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed'], -'EventHttpRequest::addHeader' => ['bool', 'key'=>'string', 'value'=>'string', 'type'=>'int'], -'EventHttpRequest::cancel' => ['void'], -'EventHttpRequest::clearHeaders' => ['void'], -'EventHttpRequest::closeConnection' => ['void'], -'EventHttpRequest::findHeader' => ['void', 'key'=>'string', 'type'=>'string'], -'EventHttpRequest::free' => ['void'], -'EventHttpRequest::getBufferEvent' => ['EventBufferEvent'], -'EventHttpRequest::getCommand' => ['void'], -'EventHttpRequest::getConnection' => ['EventHttpConnection'], -'EventHttpRequest::getHost' => ['string'], -'EventHttpRequest::getInputBuffer' => ['EventBuffer'], -'EventHttpRequest::getInputHeaders' => ['array'], -'EventHttpRequest::getOutputBuffer' => ['EventBuffer'], -'EventHttpRequest::getOutputHeaders' => ['void'], -'EventHttpRequest::getResponseCode' => ['int'], -'EventHttpRequest::getUri' => ['string'], -'EventHttpRequest::removeHeader' => ['void', 'key'=>'string', 'type'=>'string'], -'EventHttpRequest::sendError' => ['void', 'error'=>'int', 'reason='=>'string'], -'EventHttpRequest::sendReply' => ['void', 'code'=>'int', 'reason'=>'string', 'buf='=>'EventBuffer'], -'EventHttpRequest::sendReplyChunk' => ['void', 'buf'=>'EventBuffer'], -'EventHttpRequest::sendReplyEnd' => ['void'], -'EventHttpRequest::sendReplyStart' => ['void', 'code'=>'int', 'reason'=>'string'], -'EventListener::__construct' => ['void', 'base'=>'EventBase', 'cb'=>'callable', 'data'=>'mixed', 'flags'=>'int', 'backlog'=>'int', 'target'=>'mixed'], -'EventListener::disable' => ['bool'], -'EventListener::enable' => ['bool'], -'EventListener::getBase' => ['void'], -'EventListener::getSocketName' => ['bool', '&w_address'=>'string', '&w_port='=>'mixed'], -'EventListener::setCallback' => ['void', 'cb'=>'callable', 'arg='=>'mixed'], -'EventListener::setErrorCallback' => ['void', 'cb'=>'string'], -'EventSslContext::__construct' => ['void', 'method'=>'string', 'options'=>'string'], -'EventUtil::__construct' => ['void'], -'EventUtil::getLastSocketErrno' => ['int', 'socket='=>'mixed'], -'EventUtil::getLastSocketError' => ['string', 'socket='=>'mixed'], -'EventUtil::getSocketFd' => ['int', 'socket'=>'mixed'], -'EventUtil::getSocketName' => ['bool', 'socket'=>'mixed', '&w_address'=>'string', '&w_port='=>'mixed'], -'EventUtil::setSocketOption' => ['bool', 'socket'=>'mixed', 'level'=>'int', 'optname'=>'int', 'optval'=>'mixed'], -'EventUtil::sslRandPoll' => ['void'], -'EvFork::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvFork::clear' => ['int'], -'EvFork::createStopped' => ['EvFork', 'callback'=>'callable', 'data='=>'string', 'priority='=>'string'], -'EvFork::feed' => ['void', 'events'=>'int'], -'EvFork::getLoop' => ['EvLoop'], -'EvFork::invoke' => ['void', 'events'=>'int'], -'EvFork::keepAlive' => ['void', 'value'=>'bool'], -'EvFork::setCallback' => ['void', 'callback'=>'callable'], -'EvFork::start' => ['void'], -'EvFork::stop' => ['void'], -'EvIdle::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvIdle::clear' => ['int'], -'EvIdle::createStopped' => ['EvIdle', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvIdle::feed' => ['void', 'events'=>'int'], -'EvIdle::getLoop' => ['EvLoop'], -'EvIdle::invoke' => ['void', 'events'=>'int'], -'EvIdle::keepAlive' => ['void', 'value'=>'bool'], -'EvIdle::setCallback' => ['void', 'callback'=>'callable'], -'EvIdle::start' => ['void'], -'EvIdle::stop' => ['void'], -'EvIo::__construct' => ['void', 'fd'=>'mixed', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvIo::clear' => ['int'], -'EvIo::createStopped' => ['EvIo', 'fd'=>'resource', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvIo::feed' => ['void', 'events'=>'int'], -'EvIo::getLoop' => ['EvLoop'], -'EvIo::invoke' => ['void', 'events'=>'int'], -'EvIo::keepAlive' => ['void', 'value'=>'bool'], -'EvIo::set' => ['void', 'fd'=>'resource', 'events'=>'int'], -'EvIo::setCallback' => ['void', 'callback'=>'callable'], -'EvIo::start' => ['void'], -'EvIo::stop' => ['void'], -'EvLoop::__construct' => ['void', 'flags='=>'int', 'data='=>'mixed', 'io_interval='=>'float', 'timeout_interval='=>'float'], -'EvLoop::backend' => ['int'], -'EvLoop::check' => ['EvCheck', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::child' => ['EvChild', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::defaultLoop' => ['EvLoop', 'flags='=>'int', 'data='=>'mixed', 'io_interval='=>'float', 'timeout_interval='=>'float'], -'EvLoop::embed' => ['EvEmbed', 'other'=>'EvLoop', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::fork' => ['EvFork', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::idle' => ['EvIdle', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::invokePending' => ['void'], -'EvLoop::io' => ['EvIo', 'fd'=>'resource', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::loopFork' => ['void'], -'EvLoop::now' => ['float'], -'EvLoop::nowUpdate' => ['void'], -'EvLoop::periodic' => ['EvPeriodic', 'offset'=>'float', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::prepare' => ['EvPrepare', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::resume' => ['void'], -'EvLoop::run' => ['void', 'flags='=>'int'], -'EvLoop::signal' => ['EvSignal', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::stat' => ['EvStat', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::stop' => ['void', 'how='=>'int'], -'EvLoop::suspend' => ['void'], -'EvLoop::timer' => ['EvTimer', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvLoop::verify' => ['void'], -'EvPeriodic::__construct' => ['void', 'offset'=>'float', 'interval'=>'string', 'reschedule_cb'=>'callable', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvPeriodic::again' => ['void'], -'EvPeriodic::at' => ['float'], -'EvPeriodic::clear' => ['int'], -'EvPeriodic::createStopped' => ['EvPeriodic', 'offset'=>'float', 'interval'=>'float', 'reschedule_cb'=>'callable', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvPeriodic::feed' => ['void', 'events'=>'int'], -'EvPeriodic::getLoop' => ['EvLoop'], -'EvPeriodic::invoke' => ['void', 'events'=>'int'], -'EvPeriodic::keepAlive' => ['void', 'value'=>'bool'], -'EvPeriodic::set' => ['void', 'offset'=>'float', 'interval'=>'float'], -'EvPeriodic::setCallback' => ['void', 'callback'=>'callable'], -'EvPeriodic::start' => ['void'], -'EvPeriodic::stop' => ['void'], -'EvPrepare::__construct' => ['void', 'callback'=>'string', 'data='=>'string', 'priority='=>'string'], -'EvPrepare::clear' => ['int'], -'EvPrepare::createStopped' => ['EvPrepare', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvPrepare::feed' => ['void', 'events'=>'int'], -'EvPrepare::getLoop' => ['EvLoop'], -'EvPrepare::invoke' => ['void', 'events'=>'int'], -'EvPrepare::keepAlive' => ['void', 'value'=>'bool'], -'EvPrepare::setCallback' => ['void', 'callback'=>'callable'], -'EvPrepare::start' => ['void'], -'EvPrepare::stop' => ['void'], -'EvSignal::__construct' => ['void', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvSignal::clear' => ['int'], -'EvSignal::createStopped' => ['EvSignal', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvSignal::feed' => ['void', 'events'=>'int'], -'EvSignal::getLoop' => ['EvLoop'], -'EvSignal::invoke' => ['void', 'events'=>'int'], -'EvSignal::keepAlive' => ['void', 'value'=>'bool'], -'EvSignal::set' => ['void', 'signum'=>'int'], -'EvSignal::setCallback' => ['void', 'callback'=>'callable'], -'EvSignal::start' => ['void'], -'EvSignal::stop' => ['void'], -'EvStat::__construct' => ['void', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvStat::attr' => ['array'], -'EvStat::clear' => ['int'], -'EvStat::createStopped' => ['EvStat', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvStat::feed' => ['void', 'events'=>'int'], -'EvStat::getLoop' => ['EvLoop'], -'EvStat::invoke' => ['void', 'events'=>'int'], -'EvStat::keepAlive' => ['void', 'value'=>'bool'], -'EvStat::prev' => ['array'], -'EvStat::set' => ['void', 'path'=>'string', 'interval'=>'float'], -'EvStat::setCallback' => ['void', 'callback'=>'callable'], -'EvStat::start' => ['void'], -'EvStat::stat' => ['bool'], -'EvStat::stop' => ['void'], -'EvTimer::__construct' => ['void', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvTimer::again' => ['void'], -'EvTimer::clear' => ['int'], -'EvTimer::createStopped' => ['EvTimer', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], -'EvTimer::feed' => ['void', 'events'=>'int'], -'EvTimer::getLoop' => ['EvLoop'], -'EvTimer::invoke' => ['void', 'events'=>'int'], -'EvTimer::keepAlive' => ['void', 'value'=>'bool'], -'EvTimer::set' => ['void', 'after'=>'float', 'repeat'=>'float'], -'EvTimer::setCallback' => ['void', 'callback'=>'callable'], -'EvTimer::start' => ['void'], -'EvTimer::stop' => ['void'], -'EvWatcher::__construct' => ['void'], -'EvWatcher::clear' => ['int'], -'EvWatcher::feed' => ['void', 'revents'=>'int'], -'EvWatcher::getLoop' => ['EvLoop'], -'EvWatcher::invoke' => ['void', 'revents'=>'int'], -'EvWatcher::keepalive' => ['bool', 'value='=>'bool'], -'EvWatcher::setCallback' => ['void', 'callback'=>'callable'], -'EvWatcher::start' => ['void'], -'EvWatcher::stop' => ['void'], -'Exception::__clone' => ['void'], -'Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Exception'], -'Exception::__toString' => ['string'], -'Exception::getCode' => ['int|string'], -'Exception::getFile' => ['string'], -'Exception::getLine' => ['int'], -'Exception::getMessage' => ['string'], -'Exception::getPrevious' => ['?Throwable|?Exception'], -'Exception::getTrace' => ['list\',args?:array}>'], -'Exception::getTraceAsString' => ['string'], -'exec' => ['string|false', 'command'=>'string', '&w_output='=>'array', '&w_result_code='=>'int'], -'exif_imagetype' => ['int|false', 'filename'=>'string'], -'exif_read_data' => ['array|false', 'file'=>'string|resource', 'required_sections='=>'string', 'as_arrays='=>'bool', 'read_thumbnail='=>'bool'], -'exif_tagname' => ['string|false', 'index'=>'int'], -'exif_thumbnail' => ['string|false', 'file'=>'string', '&w_width='=>'int', '&w_height='=>'int', '&w_image_type='=>'int'], -'exit' => ['', 'status'=>'string|int'], -'exp' => ['float', 'num'=>'float'], -'expect_expectl' => ['int', 'expect'=>'resource', 'cases'=>'array', 'match='=>'array'], -'expect_popen' => ['resource|false', 'command'=>'string'], -'explode' => ['list', 'separator'=>'string', 'string'=>'string', 'limit='=>'int'], -'expm1' => ['float', 'num'=>'float'], -'extension_loaded' => ['bool', 'extension'=>'string'], -'extract' => ['int', '&rw_array'=>'array', 'flags='=>'int', 'prefix='=>'string'], -'ezmlm_hash' => ['int', 'addr'=>'string'], -'fam_cancel_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], -'fam_close' => ['void', 'fam'=>'resource'], -'fam_monitor_collection' => ['resource', 'fam'=>'resource', 'dirname'=>'string', 'depth'=>'int', 'mask'=>'string'], -'fam_monitor_directory' => ['resource', 'fam'=>'resource', 'dirname'=>'string'], -'fam_monitor_file' => ['resource', 'fam'=>'resource', 'filename'=>'string'], -'fam_next_event' => ['array', 'fam'=>'resource'], -'fam_open' => ['resource|false', 'appname='=>'string'], -'fam_pending' => ['int', 'fam'=>'resource'], -'fam_resume_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], -'fam_suspend_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], -'fann_cascadetrain_on_data' => ['bool', 'ann'=>'resource', 'data'=>'resource', 'max_neurons'=>'int', 'neurons_between_reports'=>'int', 'desired_error'=>'float'], -'fann_cascadetrain_on_file' => ['bool', 'ann'=>'resource', 'filename'=>'string', 'max_neurons'=>'int', 'neurons_between_reports'=>'int', 'desired_error'=>'float'], -'fann_clear_scaling_params' => ['bool', 'ann'=>'resource'], -'fann_copy' => ['resource|false', 'ann'=>'resource'], -'fann_create_from_file' => ['resource', 'configuration_file'=>'string'], -'fann_create_shortcut' => ['resource|false', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], -'fann_create_shortcut_array' => ['resource|false', 'num_layers'=>'int', 'layers'=>'array'], -'fann_create_sparse' => ['resource|false', 'connection_rate'=>'float', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], -'fann_create_sparse_array' => ['resource|false', 'connection_rate'=>'float', 'num_layers'=>'int', 'layers'=>'array'], -'fann_create_standard' => ['resource|false', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], -'fann_create_standard_array' => ['resource|false', 'num_layers'=>'int', 'layers'=>'array'], -'fann_create_train' => ['resource', 'num_data'=>'int', 'num_input'=>'int', 'num_output'=>'int'], -'fann_create_train_from_callback' => ['resource', 'num_data'=>'int', 'num_input'=>'int', 'num_output'=>'int', 'user_function'=>'callable'], -'fann_descale_input' => ['bool', 'ann'=>'resource', 'input_vector'=>'array'], -'fann_descale_output' => ['bool', 'ann'=>'resource', 'output_vector'=>'array'], -'fann_descale_train' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], -'fann_destroy' => ['bool', 'ann'=>'resource'], -'fann_destroy_train' => ['bool', 'train_data'=>'resource'], -'fann_duplicate_train_data' => ['resource', 'data'=>'resource'], -'fann_get_activation_function' => ['int|false', 'ann'=>'resource', 'layer'=>'int', 'neuron'=>'int'], -'fann_get_activation_steepness' => ['float|false', 'ann'=>'resource', 'layer'=>'int', 'neuron'=>'int'], -'fann_get_bias_array' => ['array', 'ann'=>'resource'], -'fann_get_bit_fail' => ['int|false', 'ann'=>'resource'], -'fann_get_bit_fail_limit' => ['float|false', 'ann'=>'resource'], -'fann_get_cascade_activation_functions' => ['array|false', 'ann'=>'resource'], -'fann_get_cascade_activation_functions_count' => ['int|false', 'ann'=>'resource'], -'fann_get_cascade_activation_steepnesses' => ['array|false', 'ann'=>'resource'], -'fann_get_cascade_activation_steepnesses_count' => ['int|false', 'ann'=>'resource'], -'fann_get_cascade_candidate_change_fraction' => ['float|false', 'ann'=>'resource'], -'fann_get_cascade_candidate_limit' => ['float|false', 'ann'=>'resource'], -'fann_get_cascade_candidate_stagnation_epochs' => ['float|false', 'ann'=>'resource'], -'fann_get_cascade_max_cand_epochs' => ['int|false', 'ann'=>'resource'], -'fann_get_cascade_max_out_epochs' => ['int|false', 'ann'=>'resource'], -'fann_get_cascade_min_cand_epochs' => ['int|false', 'ann'=>'resource'], -'fann_get_cascade_min_out_epochs' => ['int|false', 'ann'=>'resource'], -'fann_get_cascade_num_candidate_groups' => ['int|false', 'ann'=>'resource'], -'fann_get_cascade_num_candidates' => ['int|false', 'ann'=>'resource'], -'fann_get_cascade_output_change_fraction' => ['float|false', 'ann'=>'resource'], -'fann_get_cascade_output_stagnation_epochs' => ['int|false', 'ann'=>'resource'], -'fann_get_cascade_weight_multiplier' => ['float|false', 'ann'=>'resource'], -'fann_get_connection_array' => ['array', 'ann'=>'resource'], -'fann_get_connection_rate' => ['float|false', 'ann'=>'resource'], -'fann_get_errno' => ['int|false', 'errdat'=>'resource'], -'fann_get_errstr' => ['string|false', 'errdat'=>'resource'], -'fann_get_layer_array' => ['array', 'ann'=>'resource'], -'fann_get_learning_momentum' => ['float|false', 'ann'=>'resource'], -'fann_get_learning_rate' => ['float|false', 'ann'=>'resource'], -'fann_get_MSE' => ['float|false', 'ann'=>'resource'], -'fann_get_network_type' => ['int|false', 'ann'=>'resource'], -'fann_get_num_input' => ['int|false', 'ann'=>'resource'], -'fann_get_num_layers' => ['int|false', 'ann'=>'resource'], -'fann_get_num_output' => ['int|false', 'ann'=>'resource'], -'fann_get_quickprop_decay' => ['float|false', 'ann'=>'resource'], -'fann_get_quickprop_mu' => ['float|false', 'ann'=>'resource'], -'fann_get_rprop_decrease_factor' => ['float|false', 'ann'=>'resource'], -'fann_get_rprop_delta_max' => ['float|false', 'ann'=>'resource'], -'fann_get_rprop_delta_min' => ['float|false', 'ann'=>'resource'], -'fann_get_rprop_delta_zero' => ['float|false', 'ann'=>'resource'], -'fann_get_rprop_increase_factor' => ['float|false', 'ann'=>'resource'], -'fann_get_sarprop_step_error_shift' => ['float|false', 'ann'=>'resource'], -'fann_get_sarprop_step_error_threshold_factor' => ['float|false', 'ann'=>'resource'], -'fann_get_sarprop_temperature' => ['float|false', 'ann'=>'resource'], -'fann_get_sarprop_weight_decay_shift' => ['float|false', 'ann'=>'resource'], -'fann_get_total_connections' => ['int|false', 'ann'=>'resource'], -'fann_get_total_neurons' => ['int|false', 'ann'=>'resource'], -'fann_get_train_error_function' => ['int|false', 'ann'=>'resource'], -'fann_get_train_stop_function' => ['int|false', 'ann'=>'resource'], -'fann_get_training_algorithm' => ['int|false', 'ann'=>'resource'], -'fann_init_weights' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], -'fann_length_train_data' => ['int|false', 'data'=>'resource'], -'fann_merge_train_data' => ['resource|false', 'data1'=>'resource', 'data2'=>'resource'], -'fann_num_input_train_data' => ['int|false', 'data'=>'resource'], -'fann_num_output_train_data' => ['int|false', 'data'=>'resource'], -'fann_print_error' => ['void', 'errdat'=>'string'], -'fann_randomize_weights' => ['bool', 'ann'=>'resource', 'min_weight'=>'float', 'max_weight'=>'float'], -'fann_read_train_from_file' => ['resource', 'filename'=>'string'], -'fann_reset_errno' => ['void', 'errdat'=>'resource'], -'fann_reset_errstr' => ['void', 'errdat'=>'resource'], -'fann_reset_MSE' => ['bool', 'ann'=>'string'], -'fann_run' => ['array|false', 'ann'=>'resource', 'input'=>'array'], -'fann_save' => ['bool', 'ann'=>'resource', 'configuration_file'=>'string'], -'fann_save_train' => ['bool', 'data'=>'resource', 'file_name'=>'string'], -'fann_scale_input' => ['bool', 'ann'=>'resource', 'input_vector'=>'array'], -'fann_scale_input_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], -'fann_scale_output' => ['bool', 'ann'=>'resource', 'output_vector'=>'array'], -'fann_scale_output_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], -'fann_scale_train' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], -'fann_scale_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], -'fann_set_activation_function' => ['bool', 'ann'=>'resource', 'activation_function'=>'int', 'layer'=>'int', 'neuron'=>'int'], -'fann_set_activation_function_hidden' => ['bool', 'ann'=>'resource', 'activation_function'=>'int'], -'fann_set_activation_function_layer' => ['bool', 'ann'=>'resource', 'activation_function'=>'int', 'layer'=>'int'], -'fann_set_activation_function_output' => ['bool', 'ann'=>'resource', 'activation_function'=>'int'], -'fann_set_activation_steepness' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float', 'layer'=>'int', 'neuron'=>'int'], -'fann_set_activation_steepness_hidden' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float'], -'fann_set_activation_steepness_layer' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float', 'layer'=>'int'], -'fann_set_activation_steepness_output' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float'], -'fann_set_bit_fail_limit' => ['bool', 'ann'=>'resource', 'bit_fail_limit'=>'float'], -'fann_set_callback' => ['bool', 'ann'=>'resource', 'callback'=>'callable'], -'fann_set_cascade_activation_functions' => ['bool', 'ann'=>'resource', 'cascade_activation_functions'=>'array'], -'fann_set_cascade_activation_steepnesses' => ['bool', 'ann'=>'resource', 'cascade_activation_steepnesses_count'=>'array'], -'fann_set_cascade_candidate_change_fraction' => ['bool', 'ann'=>'resource', 'cascade_candidate_change_fraction'=>'float'], -'fann_set_cascade_candidate_limit' => ['bool', 'ann'=>'resource', 'cascade_candidate_limit'=>'float'], -'fann_set_cascade_candidate_stagnation_epochs' => ['bool', 'ann'=>'resource', 'cascade_candidate_stagnation_epochs'=>'int'], -'fann_set_cascade_max_cand_epochs' => ['bool', 'ann'=>'resource', 'cascade_max_cand_epochs'=>'int'], -'fann_set_cascade_max_out_epochs' => ['bool', 'ann'=>'resource', 'cascade_max_out_epochs'=>'int'], -'fann_set_cascade_min_cand_epochs' => ['bool', 'ann'=>'resource', 'cascade_min_cand_epochs'=>'int'], -'fann_set_cascade_min_out_epochs' => ['bool', 'ann'=>'resource', 'cascade_min_out_epochs'=>'int'], -'fann_set_cascade_num_candidate_groups' => ['bool', 'ann'=>'resource', 'cascade_num_candidate_groups'=>'int'], -'fann_set_cascade_output_change_fraction' => ['bool', 'ann'=>'resource', 'cascade_output_change_fraction'=>'float'], -'fann_set_cascade_output_stagnation_epochs' => ['bool', 'ann'=>'resource', 'cascade_output_stagnation_epochs'=>'int'], -'fann_set_cascade_weight_multiplier' => ['bool', 'ann'=>'resource', 'cascade_weight_multiplier'=>'float'], -'fann_set_error_log' => ['void', 'errdat'=>'resource', 'log_file'=>'string'], -'fann_set_input_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_input_min'=>'float', 'new_input_max'=>'float'], -'fann_set_learning_momentum' => ['bool', 'ann'=>'resource', 'learning_momentum'=>'float'], -'fann_set_learning_rate' => ['bool', 'ann'=>'resource', 'learning_rate'=>'float'], -'fann_set_output_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_output_min'=>'float', 'new_output_max'=>'float'], -'fann_set_quickprop_decay' => ['bool', 'ann'=>'resource', 'quickprop_decay'=>'float'], -'fann_set_quickprop_mu' => ['bool', 'ann'=>'resource', 'quickprop_mu'=>'float'], -'fann_set_rprop_decrease_factor' => ['bool', 'ann'=>'resource', 'rprop_decrease_factor'=>'float'], -'fann_set_rprop_delta_max' => ['bool', 'ann'=>'resource', 'rprop_delta_max'=>'float'], -'fann_set_rprop_delta_min' => ['bool', 'ann'=>'resource', 'rprop_delta_min'=>'float'], -'fann_set_rprop_delta_zero' => ['bool', 'ann'=>'resource', 'rprop_delta_zero'=>'float'], -'fann_set_rprop_increase_factor' => ['bool', 'ann'=>'resource', 'rprop_increase_factor'=>'float'], -'fann_set_sarprop_step_error_shift' => ['bool', 'ann'=>'resource', 'sarprop_step_error_shift'=>'float'], -'fann_set_sarprop_step_error_threshold_factor' => ['bool', 'ann'=>'resource', 'sarprop_step_error_threshold_factor'=>'float'], -'fann_set_sarprop_temperature' => ['bool', 'ann'=>'resource', 'sarprop_temperature'=>'float'], -'fann_set_sarprop_weight_decay_shift' => ['bool', 'ann'=>'resource', 'sarprop_weight_decay_shift'=>'float'], -'fann_set_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_input_min'=>'float', 'new_input_max'=>'float', 'new_output_min'=>'float', 'new_output_max'=>'float'], -'fann_set_train_error_function' => ['bool', 'ann'=>'resource', 'error_function'=>'int'], -'fann_set_train_stop_function' => ['bool', 'ann'=>'resource', 'stop_function'=>'int'], -'fann_set_training_algorithm' => ['bool', 'ann'=>'resource', 'training_algorithm'=>'int'], -'fann_set_weight' => ['bool', 'ann'=>'resource', 'from_neuron'=>'int', 'to_neuron'=>'int', 'weight'=>'float'], -'fann_set_weight_array' => ['bool', 'ann'=>'resource', 'connections'=>'array'], -'fann_shuffle_train_data' => ['bool', 'train_data'=>'resource'], -'fann_subset_train_data' => ['resource', 'data'=>'resource', 'pos'=>'int', 'length'=>'int'], -'fann_test' => ['bool', 'ann'=>'resource', 'input'=>'array', 'desired_output'=>'array'], -'fann_test_data' => ['float|false', 'ann'=>'resource', 'data'=>'resource'], -'fann_train' => ['bool', 'ann'=>'resource', 'input'=>'array', 'desired_output'=>'array'], -'fann_train_epoch' => ['float|false', 'ann'=>'resource', 'data'=>'resource'], -'fann_train_on_data' => ['bool', 'ann'=>'resource', 'data'=>'resource', 'max_epochs'=>'int', 'epochs_between_reports'=>'int', 'desired_error'=>'float'], -'fann_train_on_file' => ['bool', 'ann'=>'resource', 'filename'=>'string', 'max_epochs'=>'int', 'epochs_between_reports'=>'int', 'desired_error'=>'float'], -'FANNConnection::__construct' => ['void', 'from_neuron'=>'int', 'to_neuron'=>'int', 'weight'=>'float'], -'FANNConnection::getFromNeuron' => ['int'], -'FANNConnection::getToNeuron' => ['int'], -'FANNConnection::getWeight' => ['void'], -'FANNConnection::setWeight' => ['bool', 'weight'=>'float'], -'fastcgi_finish_request' => ['bool'], -'fbsql_affected_rows' => ['int', 'link_identifier='=>'?resource'], -'fbsql_autocommit' => ['bool', 'link_identifier'=>'resource', 'onoff='=>'bool'], -'fbsql_blob_size' => ['int', 'blob_handle'=>'string', 'link_identifier='=>'?resource'], -'fbsql_change_user' => ['bool', 'user'=>'string', 'password'=>'string', 'database='=>'string', 'link_identifier='=>'?resource'], -'fbsql_clob_size' => ['int', 'clob_handle'=>'string', 'link_identifier='=>'?resource'], -'fbsql_close' => ['bool', 'link_identifier='=>'?resource'], -'fbsql_commit' => ['bool', 'link_identifier='=>'?resource'], -'fbsql_connect' => ['resource', 'hostname='=>'string', 'username='=>'string', 'password='=>'string'], -'fbsql_create_blob' => ['string', 'blob_data'=>'string', 'link_identifier='=>'?resource'], -'fbsql_create_clob' => ['string', 'clob_data'=>'string', 'link_identifier='=>'?resource'], -'fbsql_create_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource', 'database_options='=>'string'], -'fbsql_data_seek' => ['bool', 'result'=>'resource', 'row_number'=>'int'], -'fbsql_database' => ['string', 'link_identifier'=>'resource', 'database='=>'string'], -'fbsql_database_password' => ['string', 'link_identifier'=>'resource', 'database_password='=>'string'], -'fbsql_db_query' => ['resource', 'database'=>'string', 'query'=>'string', 'link_identifier='=>'?resource'], -'fbsql_db_status' => ['int', 'database_name'=>'string', 'link_identifier='=>'?resource'], -'fbsql_drop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], -'fbsql_errno' => ['int', 'link_identifier='=>'?resource'], -'fbsql_error' => ['string', 'link_identifier='=>'?resource'], -'fbsql_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], -'fbsql_fetch_assoc' => ['array', 'result'=>'resource'], -'fbsql_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], -'fbsql_fetch_lengths' => ['array', 'result'=>'resource'], -'fbsql_fetch_object' => ['object', 'result'=>'resource'], -'fbsql_fetch_row' => ['array', 'result'=>'resource'], -'fbsql_field_flags' => ['string', 'result'=>'resource', 'field_offset='=>'int'], -'fbsql_field_len' => ['int', 'result'=>'resource', 'field_offset='=>'int'], -'fbsql_field_name' => ['string', 'result'=>'resource', 'field_index='=>'int'], -'fbsql_field_seek' => ['bool', 'result'=>'resource', 'field_offset='=>'int'], -'fbsql_field_table' => ['string', 'result'=>'resource', 'field_offset='=>'int'], -'fbsql_field_type' => ['string', 'result'=>'resource', 'field_offset='=>'int'], -'fbsql_free_result' => ['bool', 'result'=>'resource'], -'fbsql_get_autostart_info' => ['array', 'link_identifier='=>'?resource'], -'fbsql_hostname' => ['string', 'link_identifier'=>'resource', 'host_name='=>'string'], -'fbsql_insert_id' => ['int', 'link_identifier='=>'?resource'], -'fbsql_list_dbs' => ['resource', 'link_identifier='=>'?resource'], -'fbsql_list_fields' => ['resource', 'database_name'=>'string', 'table_name'=>'string', 'link_identifier='=>'?resource'], -'fbsql_list_tables' => ['resource', 'database'=>'string', 'link_identifier='=>'?resource'], -'fbsql_next_result' => ['bool', 'result'=>'resource'], -'fbsql_num_fields' => ['int', 'result'=>'resource'], -'fbsql_num_rows' => ['int', 'result'=>'resource'], -'fbsql_password' => ['string', 'link_identifier'=>'resource', 'password='=>'string'], -'fbsql_pconnect' => ['resource', 'hostname='=>'string', 'username='=>'string', 'password='=>'string'], -'fbsql_query' => ['resource', 'query'=>'string', 'link_identifier='=>'?resource', 'batch_size='=>'int'], -'fbsql_read_blob' => ['string', 'blob_handle'=>'string', 'link_identifier='=>'?resource'], -'fbsql_read_clob' => ['string', 'clob_handle'=>'string', 'link_identifier='=>'?resource'], -'fbsql_result' => ['mixed', 'result'=>'resource', 'row='=>'int', 'field='=>'mixed'], -'fbsql_rollback' => ['bool', 'link_identifier='=>'?resource'], -'fbsql_rows_fetched' => ['int', 'result'=>'resource'], -'fbsql_select_db' => ['bool', 'database_name='=>'string', 'link_identifier='=>'?resource'], -'fbsql_set_characterset' => ['void', 'link_identifier'=>'resource', 'characterset'=>'int', 'in_out_both='=>'int'], -'fbsql_set_lob_mode' => ['bool', 'result'=>'resource', 'lob_mode'=>'int'], -'fbsql_set_password' => ['bool', 'link_identifier'=>'resource', 'user'=>'string', 'password'=>'string', 'old_password'=>'string'], -'fbsql_set_transaction' => ['void', 'link_identifier'=>'resource', 'locking'=>'int', 'isolation'=>'int'], -'fbsql_start_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource', 'database_options='=>'string'], -'fbsql_stop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], -'fbsql_table_name' => ['string', 'result'=>'resource', 'index'=>'int'], -'fbsql_username' => ['string', 'link_identifier'=>'resource', 'username='=>'string'], -'fbsql_warnings' => ['bool', 'onoff='=>'bool'], -'fclose' => ['bool', 'stream'=>'resource'], -'fdf_add_doc_javascript' => ['bool', 'fdf_document'=>'resource', 'script_name'=>'string', 'script_code'=>'string'], -'fdf_add_template' => ['bool', 'fdf_document'=>'resource', 'newpage'=>'int', 'filename'=>'string', 'template'=>'string', 'rename'=>'int'], -'fdf_close' => ['void', 'fdf_document'=>'resource'], -'fdf_create' => ['resource'], -'fdf_enum_values' => ['bool', 'fdf_document'=>'resource', 'function'=>'callable', 'userdata='=>'mixed'], -'fdf_errno' => ['int'], -'fdf_error' => ['string', 'error_code='=>'int'], -'fdf_get_ap' => ['bool', 'fdf_document'=>'resource', 'field'=>'string', 'face'=>'int', 'filename'=>'string'], -'fdf_get_attachment' => ['array', 'fdf_document'=>'resource', 'fieldname'=>'string', 'savepath'=>'string'], -'fdf_get_encoding' => ['string', 'fdf_document'=>'resource'], -'fdf_get_file' => ['string', 'fdf_document'=>'resource'], -'fdf_get_flags' => ['int', 'fdf_document'=>'resource', 'fieldname'=>'string', 'whichflags'=>'int'], -'fdf_get_opt' => ['mixed', 'fdf_document'=>'resource', 'fieldname'=>'string', 'element='=>'int'], -'fdf_get_status' => ['string', 'fdf_document'=>'resource'], -'fdf_get_value' => ['mixed', 'fdf_document'=>'resource', 'fieldname'=>'string', 'which='=>'int'], -'fdf_get_version' => ['string', 'fdf_document='=>'resource'], -'fdf_header' => ['void'], -'fdf_next_field_name' => ['string', 'fdf_document'=>'resource', 'fieldname='=>'string'], -'fdf_open' => ['resource|false', 'filename'=>'string'], -'fdf_open_string' => ['resource', 'fdf_data'=>'string'], -'fdf_remove_item' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'item'=>'int'], -'fdf_save' => ['bool', 'fdf_document'=>'resource', 'filename='=>'string'], -'fdf_save_string' => ['string', 'fdf_document'=>'resource'], -'fdf_set_ap' => ['bool', 'fdf_document'=>'resource', 'field_name'=>'string', 'face'=>'int', 'filename'=>'string', 'page_number'=>'int'], -'fdf_set_encoding' => ['bool', 'fdf_document'=>'resource', 'encoding'=>'string'], -'fdf_set_file' => ['bool', 'fdf_document'=>'resource', 'url'=>'string', 'target_frame='=>'string'], -'fdf_set_flags' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'whichflags'=>'int', 'newflags'=>'int'], -'fdf_set_javascript_action' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'trigger'=>'int', 'script'=>'string'], -'fdf_set_on_import_javascript' => ['bool', 'fdf_document'=>'resource', 'script'=>'string', 'before_data_import'=>'bool'], -'fdf_set_opt' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'element'=>'int', 'string1'=>'string', 'string2'=>'string'], -'fdf_set_status' => ['bool', 'fdf_document'=>'resource', 'status'=>'string'], -'fdf_set_submit_form_action' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'trigger'=>'int', 'script'=>'string', 'flags'=>'int'], -'fdf_set_target_frame' => ['bool', 'fdf_document'=>'resource', 'frame_name'=>'string'], -'fdf_set_value' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'value'=>'mixed', 'isname='=>'int'], -'fdf_set_version' => ['bool', 'fdf_document'=>'resource', 'version'=>'string'], -'fdiv' => ['float', 'num1'=>'float', 'num2'=>'float'], -'feof' => ['bool', 'stream'=>'resource'], -'fflush' => ['bool', 'stream'=>'resource'], -'fsync' => ['bool', 'stream'=>'resource'], -'fdatasync' => ['bool', 'stream'=>'resource'], -'ffmpeg_animated_gif::__construct' => ['void', 'output_file_path'=>'string', 'width'=>'int', 'height'=>'int', 'frame_rate'=>'int', 'loop_count='=>'int'], -'ffmpeg_animated_gif::addFrame' => ['', 'frame_to_add'=>'ffmpeg_frame'], -'ffmpeg_frame::__construct' => ['void', 'gd_image'=>'resource'], -'ffmpeg_frame::crop' => ['', 'crop_top'=>'int', 'crop_bottom='=>'int', 'crop_left='=>'int', 'crop_right='=>'int'], -'ffmpeg_frame::getHeight' => ['int'], -'ffmpeg_frame::getPresentationTimestamp' => ['int'], -'ffmpeg_frame::getPTS' => ['int'], -'ffmpeg_frame::getWidth' => ['int'], -'ffmpeg_frame::resize' => ['', 'width'=>'int', 'height'=>'int', 'crop_top='=>'int', 'crop_bottom='=>'int', 'crop_left='=>'int', 'crop_right='=>'int'], -'ffmpeg_frame::toGDImage' => ['resource'], -'ffmpeg_movie::__construct' => ['void', 'path_to_media'=>'string', 'persistent'=>'bool'], -'ffmpeg_movie::getArtist' => ['string'], -'ffmpeg_movie::getAudioBitRate' => ['int'], -'ffmpeg_movie::getAudioChannels' => ['int'], -'ffmpeg_movie::getAudioCodec' => ['string'], -'ffmpeg_movie::getAudioSampleRate' => ['int'], -'ffmpeg_movie::getAuthor' => ['string'], -'ffmpeg_movie::getBitRate' => ['int'], -'ffmpeg_movie::getComment' => ['string'], -'ffmpeg_movie::getCopyright' => ['string'], -'ffmpeg_movie::getDuration' => ['int'], -'ffmpeg_movie::getFilename' => ['string'], -'ffmpeg_movie::getFrame' => ['ffmpeg_frame|false', 'framenumber'=>'int'], -'ffmpeg_movie::getFrameCount' => ['int'], -'ffmpeg_movie::getFrameHeight' => ['int'], -'ffmpeg_movie::getFrameNumber' => ['int'], -'ffmpeg_movie::getFrameRate' => ['int'], -'ffmpeg_movie::getFrameWidth' => ['int'], -'ffmpeg_movie::getGenre' => ['string'], -'ffmpeg_movie::getNextKeyFrame' => ['ffmpeg_frame|false'], -'ffmpeg_movie::getPixelFormat' => [''], -'ffmpeg_movie::getTitle' => ['string'], -'ffmpeg_movie::getTrackNumber' => ['int|string'], -'ffmpeg_movie::getVideoBitRate' => ['int'], -'ffmpeg_movie::getVideoCodec' => ['string'], -'ffmpeg_movie::getYear' => ['int|string'], -'ffmpeg_movie::hasAudio' => ['bool'], -'ffmpeg_movie::hasVideo' => ['bool'], -'fgetc' => ['string|false', 'stream'=>'resource'], -'fgetcsv' => ['list|array{0: null}|false|null', 'stream'=>'resource', 'length='=>'int', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'fgets' => ['string|false', 'stream'=>'resource', 'length='=>'int'], -'fgetss' => ['string|false', 'fp'=>'resource', 'length='=>'int', 'allowable_tags='=>'string'], -'file' => ['list|false', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], -'file_exists' => ['bool', 'filename'=>'string'], -'file_get_contents' => ['string|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'?resource', 'offset='=>'int', 'length='=>'int'], -'file_put_contents' => ['int|false', 'filename'=>'string', 'data'=>'string|resource|array', 'flags='=>'int', 'context='=>'resource'], -'fileatime' => ['int|false', 'filename'=>'string'], -'filectime' => ['int|false', 'filename'=>'string'], -'filegroup' => ['int|false', 'filename'=>'string'], -'fileinode' => ['int|false', 'filename'=>'string'], -'filemtime' => ['int|false', 'filename'=>'string'], -'fileowner' => ['int|false', 'filename'=>'string'], -'fileperms' => ['int|false', 'filename'=>'string'], -'filepro' => ['bool', 'directory'=>'string'], -'filepro_fieldcount' => ['int'], -'filepro_fieldname' => ['string', 'field_number'=>'int'], -'filepro_fieldtype' => ['string', 'field_number'=>'int'], -'filepro_fieldwidth' => ['int', 'field_number'=>'int'], -'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::__toString' => ['string'], -'FilesystemIterator::_bad_state_ex' => [''], -'FilesystemIterator::current' => ['mixed'], -'FilesystemIterator::getATime' => ['int'], -'FilesystemIterator::getBasename' => ['string', 'suffix='=>'string'], -'FilesystemIterator::getCTime' => ['int'], -'FilesystemIterator::getExtension' => ['string'], -'FilesystemIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], -'FilesystemIterator::getFilename' => ['string'], -'FilesystemIterator::getFlags' => ['int'], -'FilesystemIterator::getGroup' => ['int'], -'FilesystemIterator::getInode' => ['int'], -'FilesystemIterator::getLinkTarget' => ['string'], -'FilesystemIterator::getMTime' => ['int'], -'FilesystemIterator::getOwner' => ['int'], -'FilesystemIterator::getPath' => ['string'], -'FilesystemIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], -'FilesystemIterator::getPathname' => ['string'], -'FilesystemIterator::getPerms' => ['int'], -'FilesystemIterator::getRealPath' => ['string'], -'FilesystemIterator::getSize' => ['int'], -'FilesystemIterator::getType' => ['string'], -'FilesystemIterator::isDir' => ['bool'], -'FilesystemIterator::isDot' => ['bool'], -'FilesystemIterator::isExecutable' => ['bool'], -'FilesystemIterator::isFile' => ['bool'], -'FilesystemIterator::isLink' => ['bool'], -'FilesystemIterator::isReadable' => ['bool'], -'FilesystemIterator::isWritable' => ['bool'], -'FilesystemIterator::key' => ['string'], -'FilesystemIterator::next' => ['void'], -'FilesystemIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'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::valid' => ['bool'], -'filetype' => ['string|false', 'filename'=>'string'], -'filter_has_var' => ['bool', 'input_type'=>'int', 'var_name'=>'string'], -'filter_id' => ['int|false', 'name'=>'string'], -'filter_input' => ['mixed|false', 'type'=>'int', 'var_name'=>'string', 'filter='=>'int', 'options='=>'array|int'], -'filter_input_array' => ['mixed|false', 'type'=>'int', 'options='=>'int|array', 'add_empty='=>'bool'], -'filter_list' => ['array'], -'filter_var' => ['mixed|false', 'value'=>'mixed', 'filter='=>'int', 'options='=>'array|int'], -'filter_var_array' => ['array|false|null', 'array'=>'array', 'options='=>'array|int', 'add_empty='=>'bool'], -'FilterIterator::__construct' => ['void', 'iterator'=>'Iterator'], -'FilterIterator::accept' => ['bool'], -'FilterIterator::current' => ['mixed'], -'FilterIterator::getInnerIterator' => ['Iterator'], -'FilterIterator::key' => ['mixed'], -'FilterIterator::next' => ['void'], -'FilterIterator::rewind' => ['void'], -'FilterIterator::valid' => ['bool'], -'finfo::__construct' => ['void', 'options='=>'int', 'magic_file='=>'string'], -'finfo::buffer' => ['string|false', 'string'=>'string', 'options='=>'int', 'context='=>'resource'], -'finfo::file' => ['string|false', 'file_name'=>'string', 'options='=>'int', 'context='=>'resource'], -'finfo::finfo' => ['void', 'options='=>'int', 'magic_file='=>'string'], -'finfo::set_flags' => ['bool', 'options'=>'int'], -'finfo_buffer' => ['string|false', 'finfo'=>'finfo', 'string'=>'string', 'flags='=>'int', 'context='=>'resource'], -'finfo_close' => ['bool', 'finfo'=>'finfo'], -'finfo_file' => ['string|false', 'finfo'=>'finfo', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], -'finfo_open' => ['finfo|false', 'flags='=>'int', 'magic_database='=>'string'], -'finfo_set_flags' => ['bool', 'finfo'=>'finfo', 'flags'=>'int'], -'floatval' => ['float', 'value'=>'mixed'], -'flock' => ['bool', 'stream'=>'resource', 'operation'=>'int', '&w_would_block='=>'int'], -'floor' => ['float', 'num'=>'float'], -'flush' => ['void'], -'fmod' => ['float', 'num1'=>'float', 'num2'=>'float'], -'fnmatch' => ['bool', 'pattern'=>'string', 'filename'=>'string', 'flags='=>'int'], -'fopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'bool', 'context='=>'resource|null'], -'forward_static_call' => ['mixed|false', 'callback'=>'callable', '...args='=>'mixed'], -'forward_static_call_array' => ['mixed|false', 'callback'=>'callable', 'args'=>'list'], -'fpassthru' => ['int|false', 'stream'=>'resource'], -'fpm_get_status' => ['array|false'], -'fprintf' => ['int', 'stream'=>'resource', 'format'=>'string', '...values='=>'string|int|float'], -'fputcsv' => ['int|false', 'stream'=>'resource', 'fields'=>'array', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string', 'eol='=>'string'], -'fputs' => ['int|false', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], -'fread' => ['string|false', 'stream'=>'resource', 'length'=>'int'], -'frenchtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], -'fribidi_log2vis' => ['string', 'string'=>'string', 'direction'=>'string', 'charset'=>'int'], -'fscanf' => ['list', 'stream'=>'resource', 'format'=>'string'], -'fscanf\'1' => ['int', 'stream'=>'resource', 'format'=>'string', '&...w_vars='=>'string|int|float'], -'fseek' => ['int', 'stream'=>'resource', 'offset'=>'int', 'whence='=>'int'], -'fsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float'], -'fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'stream'=>'resource'], -'ftell' => ['int|false', 'stream'=>'resource'], -'ftok' => ['int', 'filename'=>'string', 'project_id'=>'string'], -'ftp_alloc' => ['bool', 'ftp'=>'FTP\Connection', 'size'=>'int', '&w_response='=>'string'], -'ftp_append' => ['bool', 'ftp'=>'FTP\Connection', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int'], -'ftp_cdup' => ['bool', 'ftp'=>'FTP\Connection'], -'ftp_chdir' => ['bool', 'ftp'=>'FTP\Connection', 'directory'=>'string'], -'ftp_chmod' => ['int|false', 'ftp'=>'FTP\Connection', 'permissions'=>'int', 'filename'=>'string'], -'ftp_close' => ['bool', 'ftp'=>'FTP\Connection'], -'ftp_connect' => ['FTP\Connection|false', 'hostname'=>'string', 'port='=>'int', 'timeout='=>'int'], -'ftp_delete' => ['bool', 'ftp'=>'FTP\Connection', 'filename'=>'string'], -'ftp_exec' => ['bool', 'ftp'=>'FTP\Connection', 'command'=>'string'], -'ftp_fget' => ['bool', 'ftp'=>'FTP\Connection', 'stream'=>'resource', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], -'ftp_fput' => ['bool', 'ftp'=>'FTP\Connection', 'remote_filename'=>'string', 'stream'=>'resource', 'mode='=>'int', 'offset='=>'int'], -'ftp_get' => ['bool', 'ftp'=>'FTP\Connection', 'local_filename'=>'string', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], -'ftp_get_option' => ['mixed|false', 'ftp'=>'FTP\Connection', 'option'=>'int'], -'ftp_login' => ['bool', 'ftp'=>'FTP\Connection', 'username'=>'string', 'password'=>'string'], -'ftp_mdtm' => ['int', 'ftp'=>'FTP\Connection', 'filename'=>'string'], -'ftp_mkdir' => ['string|false', 'ftp'=>'FTP\Connection', 'directory'=>'string'], -'ftp_mlsd' => ['array|false', 'ftp'=>'FTP\Connection', 'directory'=>'string'], -'ftp_nb_continue' => ['int', 'ftp'=>'FTP\Connection'], -'ftp_nb_fget' => ['int', 'ftp'=>'FTP\Connection', 'stream'=>'resource', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], -'ftp_nb_fput' => ['int', 'ftp'=>'FTP\Connection', 'remote_filename'=>'string', 'stream'=>'resource', 'mode='=>'int', 'offset='=>'int'], -'ftp_nb_get' => ['int', 'ftp'=>'FTP\Connection', 'local_filename'=>'string', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], -'ftp_nb_put' => ['int', 'ftp'=>'FTP\Connection', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], -'ftp_nlist' => ['array|false', 'ftp'=>'FTP\Connection', 'directory'=>'string'], -'ftp_pasv' => ['bool', 'ftp'=>'FTP\Connection', 'enable'=>'bool'], -'ftp_put' => ['bool', 'ftp'=>'FTP\Connection', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], -'ftp_pwd' => ['string|false', 'ftp'=>'FTP\Connection'], -'ftp_quit' => ['bool', 'ftp'=>'FTP\Connection'], -'ftp_raw' => ['?array', 'ftp'=>'FTP\Connection', 'command'=>'string'], -'ftp_rawlist' => ['array|false', 'ftp'=>'FTP\Connection', 'directory'=>'string', 'recursive='=>'bool'], -'ftp_rename' => ['bool', 'ftp'=>'FTP\Connection', 'from'=>'string', 'to'=>'string'], -'ftp_rmdir' => ['bool', 'ftp'=>'FTP\Connection', 'directory'=>'string'], -'ftp_set_option' => ['bool', 'ftp'=>'FTP\Connection', 'option'=>'int', 'value'=>'mixed'], -'ftp_site' => ['bool', 'ftp'=>'FTP\Connection', 'command'=>'string'], -'ftp_size' => ['int', 'ftp'=>'FTP\Connection', 'filename'=>'string'], -'ftp_ssl_connect' => ['FTP\Connection|false', 'hostname'=>'string', 'port='=>'int', 'timeout='=>'int'], -'ftp_systype' => ['string|false', 'ftp'=>'FTP\Connection'], -'ftruncate' => ['bool', 'stream'=>'resource', 'size'=>'int'], -'func_get_arg' => ['mixed|false', 'position'=>'int'], -'func_get_args' => ['list'], -'func_num_args' => ['int'], -'function_exists' => ['bool', 'function'=>'string'], -'fwrite' => ['int|false', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], -'Fiber::__construct' => ['void', 'callback'=>'callable'], -'Fiber::start' => ['mixed', '...args'=>'mixed'], -'Fiber::resume' => ['mixed', 'value='=>'null|mixed'], -'Fiber::throw' => ['mixed', 'exception'=>'Throwable'], -'Fiber::isStarted' => ['bool'], -'Fiber::isSuspended' => ['bool'], -'Fiber::isRunning' => ['bool'], -'Fiber::isTerminated' => ['bool'], -'Fiber::getReturn' => ['mixed'], -'Fiber::getCurrent' => ['?self'], -'Fiber::suspend' => ['mixed', 'value='=>'null|mixed'], -'FiberError::__construct' => ['void'], -'gc_collect_cycles' => ['int'], -'gc_disable' => ['void'], -'gc_enable' => ['void'], -'gc_enabled' => ['bool'], -'gc_mem_caches' => ['int'], -'gc_status' => ['array{runs:int,collected:int,threshold:int,roots:int}'], -'gd_info' => ['array'], -'gearman_bugreport' => [''], -'gearman_client_add_options' => ['', 'client_object'=>'', 'option'=>''], -'gearman_client_add_server' => ['', 'client_object'=>'', 'host'=>'', 'port'=>''], -'gearman_client_add_servers' => ['', 'client_object'=>'', 'servers'=>''], -'gearman_client_add_task' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], -'gearman_client_add_task_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], -'gearman_client_add_task_high' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], -'gearman_client_add_task_high_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], -'gearman_client_add_task_low' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], -'gearman_client_add_task_low_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], -'gearman_client_add_task_status' => ['', 'client_object'=>'', 'job_handle'=>'', 'context'=>''], -'gearman_client_clear_fn' => ['', 'client_object'=>''], -'gearman_client_clone' => ['', 'client_object'=>''], -'gearman_client_context' => ['', 'client_object'=>''], -'gearman_client_create' => ['', 'client_object'=>''], -'gearman_client_do' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], -'gearman_client_do_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], -'gearman_client_do_high' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], -'gearman_client_do_high_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], -'gearman_client_do_job_handle' => ['', 'client_object'=>''], -'gearman_client_do_low' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], -'gearman_client_do_low_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], -'gearman_client_do_normal' => ['', 'client_object'=>'', 'function_name'=>'string', 'workload'=>'string', 'unique'=>'string'], -'gearman_client_do_status' => ['', 'client_object'=>''], -'gearman_client_echo' => ['', 'client_object'=>'', 'workload'=>''], -'gearman_client_errno' => ['', 'client_object'=>''], -'gearman_client_error' => ['', 'client_object'=>''], -'gearman_client_job_status' => ['', 'client_object'=>'', 'job_handle'=>''], -'gearman_client_options' => ['', 'client_object'=>''], -'gearman_client_remove_options' => ['', 'client_object'=>'', 'option'=>''], -'gearman_client_return_code' => ['', 'client_object'=>''], -'gearman_client_run_tasks' => ['', 'data'=>''], -'gearman_client_set_complete_fn' => ['', 'client_object'=>'', 'callback'=>''], -'gearman_client_set_context' => ['', 'client_object'=>'', 'context'=>''], -'gearman_client_set_created_fn' => ['', 'client_object'=>'', 'callback'=>''], -'gearman_client_set_data_fn' => ['', 'client_object'=>'', 'callback'=>''], -'gearman_client_set_exception_fn' => ['', 'client_object'=>'', 'callback'=>''], -'gearman_client_set_fail_fn' => ['', 'client_object'=>'', 'callback'=>''], -'gearman_client_set_options' => ['', 'client_object'=>'', 'option'=>''], -'gearman_client_set_status_fn' => ['', 'client_object'=>'', 'callback'=>''], -'gearman_client_set_timeout' => ['', 'client_object'=>'', 'timeout'=>''], -'gearman_client_set_warning_fn' => ['', 'client_object'=>'', 'callback'=>''], -'gearman_client_set_workload_fn' => ['', 'client_object'=>'', 'callback'=>''], -'gearman_client_timeout' => ['', 'client_object'=>''], -'gearman_client_wait' => ['', 'client_object'=>''], -'gearman_job_function_name' => ['', 'job_object'=>''], -'gearman_job_handle' => ['string'], -'gearman_job_return_code' => ['', 'job_object'=>''], -'gearman_job_send_complete' => ['', 'job_object'=>'', 'result'=>''], -'gearman_job_send_data' => ['', 'job_object'=>'', 'data'=>''], -'gearman_job_send_exception' => ['', 'job_object'=>'', 'exception'=>''], -'gearman_job_send_fail' => ['', 'job_object'=>''], -'gearman_job_send_status' => ['', 'job_object'=>'', 'numerator'=>'', 'denominator'=>''], -'gearman_job_send_warning' => ['', 'job_object'=>'', 'warning'=>''], -'gearman_job_status' => ['array', 'job_handle'=>'string'], -'gearman_job_unique' => ['', 'job_object'=>''], -'gearman_job_workload' => ['', 'job_object'=>''], -'gearman_job_workload_size' => ['', 'job_object'=>''], -'gearman_task_data' => ['', 'task_object'=>''], -'gearman_task_data_size' => ['', 'task_object'=>''], -'gearman_task_denominator' => ['', 'task_object'=>''], -'gearman_task_function_name' => ['', 'task_object'=>''], -'gearman_task_is_known' => ['', 'task_object'=>''], -'gearman_task_is_running' => ['', 'task_object'=>''], -'gearman_task_job_handle' => ['', 'task_object'=>''], -'gearman_task_numerator' => ['', 'task_object'=>''], -'gearman_task_recv_data' => ['', 'task_object'=>'', 'data_len'=>''], -'gearman_task_return_code' => ['', 'task_object'=>''], -'gearman_task_send_workload' => ['', 'task_object'=>'', 'data'=>''], -'gearman_task_unique' => ['', 'task_object'=>''], -'gearman_verbose_name' => ['', 'verbose'=>''], -'gearman_version' => [''], -'gearman_worker_add_function' => ['', 'worker_object'=>'', 'function_name'=>'', 'function'=>'', 'data'=>'', 'timeout'=>''], -'gearman_worker_add_options' => ['', 'worker_object'=>'', 'option'=>''], -'gearman_worker_add_server' => ['', 'worker_object'=>'', 'host'=>'', 'port'=>''], -'gearman_worker_add_servers' => ['', 'worker_object'=>'', 'servers'=>''], -'gearman_worker_clone' => ['', 'worker_object'=>''], -'gearman_worker_create' => [''], -'gearman_worker_echo' => ['', 'worker_object'=>'', 'workload'=>''], -'gearman_worker_errno' => ['', 'worker_object'=>''], -'gearman_worker_error' => ['', 'worker_object'=>''], -'gearman_worker_grab_job' => ['', 'worker_object'=>''], -'gearman_worker_options' => ['', 'worker_object'=>''], -'gearman_worker_register' => ['', 'worker_object'=>'', 'function_name'=>'', 'timeout'=>''], -'gearman_worker_remove_options' => ['', 'worker_object'=>'', 'option'=>''], -'gearman_worker_return_code' => ['', 'worker_object'=>''], -'gearman_worker_set_options' => ['', 'worker_object'=>'', 'option'=>''], -'gearman_worker_set_timeout' => ['', 'worker_object'=>'', 'timeout'=>''], -'gearman_worker_timeout' => ['', 'worker_object'=>''], -'gearman_worker_unregister' => ['', 'worker_object'=>'', 'function_name'=>''], -'gearman_worker_unregister_all' => ['', 'worker_object'=>''], -'gearman_worker_wait' => ['', 'worker_object'=>''], -'gearman_worker_work' => ['', 'worker_object'=>''], -'GearmanClient::__construct' => ['void'], -'GearmanClient::addOptions' => ['bool', 'options'=>'int'], -'GearmanClient::addServer' => ['bool', 'host='=>'string', 'port='=>'int'], -'GearmanClient::addServers' => ['bool', 'servers='=>'string'], -'GearmanClient::addTask' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskHigh' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskHighBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskLow' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskLowBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskStatus' => ['GearmanTask', 'job_handle'=>'string', 'context='=>'string'], -'GearmanClient::clearCallbacks' => ['bool'], -'GearmanClient::clone' => ['GearmanClient'], -'GearmanClient::context' => ['string'], -'GearmanClient::data' => ['string'], -'GearmanClient::do' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], -'GearmanClient::doBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], -'GearmanClient::doHigh' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], -'GearmanClient::doHighBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], -'GearmanClient::doJobHandle' => ['string'], -'GearmanClient::doLow' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], -'GearmanClient::doLowBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], -'GearmanClient::doNormal' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], -'GearmanClient::doStatus' => ['array'], -'GearmanClient::echo' => ['bool', 'workload'=>'string'], -'GearmanClient::error' => ['string'], -'GearmanClient::getErrno' => ['int'], -'GearmanClient::jobStatus' => ['array', 'job_handle'=>'string'], -'GearmanClient::options' => [''], -'GearmanClient::ping' => ['bool', 'workload'=>'string'], -'GearmanClient::removeOptions' => ['bool', 'options'=>'int'], -'GearmanClient::returnCode' => ['int'], -'GearmanClient::runTasks' => ['bool'], -'GearmanClient::setClientCallback' => ['void', 'callback'=>'callable'], -'GearmanClient::setCompleteCallback' => ['bool', 'callback'=>'callable'], -'GearmanClient::setContext' => ['bool', 'context'=>'string'], -'GearmanClient::setCreatedCallback' => ['bool', 'callback'=>'string'], -'GearmanClient::setData' => ['bool', 'data'=>'string'], -'GearmanClient::setDataCallback' => ['bool', 'callback'=>'callable'], -'GearmanClient::setExceptionCallback' => ['bool', 'callback'=>'callable'], -'GearmanClient::setFailCallback' => ['bool', 'callback'=>'callable'], -'GearmanClient::setOptions' => ['bool', 'options'=>'int'], -'GearmanClient::setStatusCallback' => ['bool', 'callback'=>'callable'], -'GearmanClient::setTimeout' => ['bool', 'timeout'=>'int'], -'GearmanClient::setWarningCallback' => ['bool', 'callback'=>'callable'], -'GearmanClient::setWorkloadCallback' => ['bool', 'callback'=>'callable'], -'GearmanClient::timeout' => ['int'], -'GearmanClient::wait' => [''], -'GearmanJob::__construct' => ['void'], -'GearmanJob::complete' => ['bool', 'result'=>'string'], -'GearmanJob::data' => ['bool', 'data'=>'string'], -'GearmanJob::exception' => ['bool', 'exception'=>'string'], -'GearmanJob::fail' => ['bool'], -'GearmanJob::functionName' => ['string'], -'GearmanJob::handle' => ['string'], -'GearmanJob::returnCode' => ['int'], -'GearmanJob::sendComplete' => ['bool', 'result'=>'string'], -'GearmanJob::sendData' => ['bool', 'data'=>'string'], -'GearmanJob::sendException' => ['bool', 'exception'=>'string'], -'GearmanJob::sendFail' => ['bool'], -'GearmanJob::sendStatus' => ['bool', 'numerator'=>'int', 'denominator'=>'int'], -'GearmanJob::sendWarning' => ['bool', 'warning'=>'string'], -'GearmanJob::setReturn' => ['bool', 'gearman_return_t'=>'string'], -'GearmanJob::status' => ['bool', 'numerator'=>'int', 'denominator'=>'int'], -'GearmanJob::unique' => ['string'], -'GearmanJob::warning' => ['bool', 'warning'=>'string'], -'GearmanJob::workload' => ['string'], -'GearmanJob::workloadSize' => ['int'], -'GearmanTask::__construct' => ['void'], -'GearmanTask::create' => ['GearmanTask'], -'GearmanTask::data' => ['string|false'], -'GearmanTask::dataSize' => ['int|false'], -'GearmanTask::function' => ['string'], -'GearmanTask::functionName' => ['string'], -'GearmanTask::isKnown' => ['bool'], -'GearmanTask::isRunning' => ['bool'], -'GearmanTask::jobHandle' => ['string'], -'GearmanTask::recvData' => ['array|false', 'data_len'=>'int'], -'GearmanTask::returnCode' => ['int'], -'GearmanTask::sendData' => ['int', 'data'=>'string'], -'GearmanTask::sendWorkload' => ['int|false', 'data'=>'string'], -'GearmanTask::taskDenominator' => ['int|false'], -'GearmanTask::taskNumerator' => ['int|false'], -'GearmanTask::unique' => ['string|false'], -'GearmanTask::uuid' => ['string'], -'GearmanWorker::__construct' => ['void'], -'GearmanWorker::addFunction' => ['bool', 'function_name'=>'string', 'function'=>'callable', 'context='=>'mixed', 'timeout='=>'int'], -'GearmanWorker::addOptions' => ['bool', 'option'=>'int'], -'GearmanWorker::addServer' => ['bool', 'host='=>'string', 'port='=>'int'], -'GearmanWorker::addServers' => ['bool', 'servers'=>'string'], -'GearmanWorker::clone' => ['void'], -'GearmanWorker::echo' => ['bool', 'workload'=>'string'], -'GearmanWorker::error' => ['string'], -'GearmanWorker::getErrno' => ['int'], -'GearmanWorker::grabJob' => [''], -'GearmanWorker::options' => ['int'], -'GearmanWorker::register' => ['bool', 'function_name'=>'string', 'timeout='=>'int'], -'GearmanWorker::removeOptions' => ['bool', 'option'=>'int'], -'GearmanWorker::returnCode' => ['int'], -'GearmanWorker::setId' => ['bool', 'id'=>'string'], -'GearmanWorker::setOptions' => ['bool', 'option'=>'int'], -'GearmanWorker::setTimeout' => ['bool', 'timeout'=>'int'], -'GearmanWorker::timeout' => ['int'], -'GearmanWorker::unregister' => ['bool', 'function_name'=>'string'], -'GearmanWorker::unregisterAll' => ['bool'], -'GearmanWorker::wait' => ['bool'], -'GearmanWorker::work' => ['bool'], -'Gender\Gender::__construct' => ['void', 'dsn='=>'string'], -'Gender\Gender::connect' => ['bool', 'dsn'=>'string'], -'Gender\Gender::country' => ['array', 'country'=>'int'], -'Gender\Gender::get' => ['int', 'name'=>'string', 'country='=>'int'], -'Gender\Gender::isNick' => ['array', 'name0'=>'string', 'name1'=>'string', 'country='=>'int'], -'Gender\Gender::similarNames' => ['array', 'name'=>'string', 'country='=>'int'], -'Generator::__wakeup' => ['void'], -'Generator::current' => ['mixed'], -'Generator::getReturn' => ['mixed'], -'Generator::key' => ['mixed'], -'Generator::next' => ['void'], -'Generator::rewind' => ['void'], -'Generator::send' => ['mixed', 'value'=>'mixed'], -'Generator::throw' => ['mixed', 'exception'=>'Exception|Throwable'], -'Generator::valid' => ['bool'], -'geoip_asnum_by_name' => ['string|false', 'hostname'=>'string'], -'geoip_continent_code_by_name' => ['string|false', 'hostname'=>'string'], -'geoip_country_code3_by_name' => ['string|false', 'hostname'=>'string'], -'geoip_country_code_by_name' => ['string|false', 'hostname'=>'string'], -'geoip_country_name_by_name' => ['string|false', 'hostname'=>'string'], -'geoip_database_info' => ['string', 'database='=>'int'], -'geoip_db_avail' => ['bool', 'database'=>'int'], -'geoip_db_filename' => ['string', 'database'=>'int'], -'geoip_db_get_all_info' => ['array'], -'geoip_domain_by_name' => ['string', 'hostname'=>'string'], -'geoip_id_by_name' => ['int', 'hostname'=>'string'], -'geoip_isp_by_name' => ['string|false', 'hostname'=>'string'], -'geoip_netspeedcell_by_name' => ['string|false', 'hostname'=>'string'], -'geoip_org_by_name' => ['string|false', 'hostname'=>'string'], -'geoip_record_by_name' => ['array|false', 'hostname'=>'string'], -'geoip_region_by_name' => ['array|false', 'hostname'=>'string'], -'geoip_region_name_by_code' => ['string|false', 'country_code'=>'string', 'region_code'=>'string'], -'geoip_setup_custom_directory' => ['void', 'path'=>'string'], -'geoip_time_zone_by_country_and_region' => ['string|false', 'country_code'=>'string', 'region_code='=>'string'], -'GEOSGeometry::__toString' => ['string'], -'GEOSGeometry::project' => ['float', 'other'=>'GEOSGeometry', 'normalized'=>'bool'], -'GEOSGeometry::interpolate' => ['GEOSGeometry', 'dist'=>'float', 'normalized'=>'bool'], -'GEOSGeometry::buffer' => ['GEOSGeometry', 'dist'=>'float', 'styleArray='=>'array'], -'GEOSGeometry::offsetCurve' => ['GEOSGeometry', 'dist'=>'float', 'styleArray'=>'array'], -'GEOSGeometry::envelope' => ['GEOSGeometry'], -'GEOSGeometry::intersection' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::convexHull' => ['GEOSGeometry'], -'GEOSGeometry::difference' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::symDifference' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::boundary' => ['GEOSGeometry'], -'GEOSGeometry::union' => ['GEOSGeometry', 'otherGeom='=>'GEOSGeometry'], -'GEOSGeometry::pointOnSurface' => ['GEOSGeometry'], -'GEOSGeometry::centroid' => ['GEOSGeometry'], -'GEOSGeometry::relate' => ['string|bool', 'otherGeom'=>'GEOSGeometry', 'pattern'=>'string'], -'GEOSGeometry::relateBoundaryNodeRule' => ['string', 'otherGeom'=>'GEOSGeometry', 'rule'=>'int'], -'GEOSGeometry::simplify' => ['GEOSGeometry', 'tolerance'=>'float', 'preserveTopology='=>'bool'], -'GEOSGeometry::normalize' => ['GEOSGeometry'], -'GEOSGeometry::extractUniquePoints' => ['GEOSGeometry'], -'GEOSGeometry::disjoint' => ['bool', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::touches' => ['bool', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::intersects' => ['bool', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::crosses' => ['bool', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::within' => ['bool', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::contains' => ['bool', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::overlaps' => ['bool', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::covers' => ['bool', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::coveredBy' => ['bool', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::equals' => ['bool', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::equalsExact' => ['bool', 'geom'=>'GEOSGeometry', 'tolerance'=>'float'], -'GEOSGeometry::isEmpty' => ['bool'], -'GEOSGeometry::checkValidity' => ['array{valid: bool, reason?: string, location?: GEOSGeometry}'], -'GEOSGeometry::isSimple' => ['bool'], -'GEOSGeometry::isRing' => ['bool'], -'GEOSGeometry::hasZ' => ['bool'], -'GEOSGeometry::isClosed' => ['bool'], -'GEOSGeometry::typeName' => ['string'], -'GEOSGeometry::typeId' => ['int'], -'GEOSGeometry::getSRID' => ['int'], -'GEOSGeometry::setSRID' => ['void', 'srid'=>'int'], -'GEOSGeometry::numGeometries' => ['int'], -'GEOSGeometry::geometryN' => ['GEOSGeometry', 'num'=>'int'], -'GEOSGeometry::numInteriorRings' => ['int'], -'GEOSGeometry::numPoints' => ['int'], -'GEOSGeometry::getX' => ['float'], -'GEOSGeometry::getY' => ['float'], -'GEOSGeometry::interiorRingN' => ['GEOSGeometry', 'num'=>'int'], -'GEOSGeometry::exteriorRing' => ['GEOSGeometry'], -'GEOSGeometry::numCoordinates' => ['int'], -'GEOSGeometry::dimension' => ['int'], -'GEOSGeometry::coordinateDimension' => ['int'], -'GEOSGeometry::pointN' => ['GEOSGeometry', 'num'=>'int'], -'GEOSGeometry::startPoint' => ['GEOSGeometry'], -'GEOSGeometry::endPoint' => ['GEOSGeometry'], -'GEOSGeometry::area' => ['float'], -'GEOSGeometry::length' => ['float'], -'GEOSGeometry::distance' => ['float', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::hausdorffDistance' => ['float', 'geom'=>'GEOSGeometry'], -'GEOSGeometry::snapTo' => ['GEOSGeometry', 'geom'=>'GEOSGeometry', 'tolerance'=>'float'], -'GEOSGeometry::node' => ['GEOSGeometry'], -'GEOSGeometry::delaunayTriangulation' => ['GEOSGeometry', 'tolerance'=>'float', 'onlyEdges'=>'bool'], -'GEOSGeometry::voronoiDiagram' => ['GEOSGeometry', 'tolerance'=>'float', 'onlyEdges'=>'bool', 'extent'=>'GEOSGeometry|null'], -'GEOSLineMerge' => ['array', 'geom'=>'GEOSGeometry'], -'GEOSPolygonize' => ['array{rings: GEOSGeometry[], cut_edges?: GEOSGeometry[], dangles: GEOSGeometry[], invalid_rings: GEOSGeometry[]}', 'geom'=>'GEOSGeometry'], -'GEOSRelateMatch' => ['bool', 'matrix'=>'string', 'pattern'=>'string'], -'GEOSSharedPaths' => ['GEOSGeometry', 'geom1'=>'GEOSGeometry', 'geom2'=>'GEOSGeometry'], -'GEOSVersion' => ['string'], -'GEOSWKBReader::__construct' => ['void'], -'GEOSWKBReader::read' => ['GEOSGeometry', 'wkb'=>'string'], -'GEOSWKBReader::readHEX' => ['GEOSGeometry', 'wkb'=>'string'], -'GEOSWKBWriter::__construct' => ['void'], -'GEOSWKBWriter::getOutputDimension' => ['int'], -'GEOSWKBWriter::setOutputDimension' => ['void', 'dim'=>'int'], -'GEOSWKBWriter::getByteOrder' => ['int'], -'GEOSWKBWriter::setByteOrder' => ['void', 'byteOrder'=>'int'], -'GEOSWKBWriter::getIncludeSRID' => ['bool'], -'GEOSWKBWriter::setIncludeSRID' => ['void', 'inc'=>'bool'], -'GEOSWKBWriter::write' => ['string', 'geom'=>'GEOSGeometry'], -'GEOSWKBWriter::writeHEX' => ['string', 'geom'=>'GEOSGeometry'], -'GEOSWKTReader::__construct' => ['void'], -'GEOSWKTReader::read' => ['GEOSGeometry', 'wkt'=>'string'], -'GEOSWKTWriter::__construct' => ['void'], -'GEOSWKTWriter::write' => ['string', 'geom'=>'GEOSGeometry'], -'GEOSWKTWriter::setTrim' => ['void', 'trim'=>'bool'], -'GEOSWKTWriter::setRoundingPrecision' => ['void', 'prec'=>'int'], -'GEOSWKTWriter::setOutputDimension' => ['void', 'dim'=>'int'], -'GEOSWKTWriter::getOutputDimension' => ['int'], -'GEOSWKTWriter::setOld3D' => ['void', 'val'=>'bool'], -'get_browser' => ['array|object|false', 'user_agent='=>'?string', 'return_array='=>'bool'], -'get_call_stack' => [''], -'get_called_class' => ['class-string'], -'get_cfg_var' => ['string|false', 'option'=>'string'], -'get_class' => ['class-string', 'object='=>'object'], -'get_class_methods' => ['list', 'object_or_class'=>'object|class-string'], -'get_class_vars' => ['array', 'class'=>'string'], -'get_current_user' => ['string'], -'get_debug_type' => ['string', 'value'=>'mixed'], -'get_declared_classes' => ['list'], -'get_declared_interfaces' => ['list'], -'get_declared_traits' => ['list|null'], -'get_defined_constants' => ['array', 'categorize='=>'bool'], -'get_defined_functions' => ['array>', 'exclude_disabled='=>'bool'], -'get_defined_vars' => ['array'], -'get_extension_funcs' => ['list|false', 'extension'=>'string'], -'get_headers' => ['array|false', 'url'=>'string', 'associative='=>'int', 'context='=>'resource'], -'get_html_translation_table' => ['array', 'table='=>'int', 'flags='=>'int', 'encoding='=>'string'], -'get_include_path' => ['string'], -'get_included_files' => ['list'], -'get_loaded_extensions' => ['list', 'zend_extensions='=>'bool'], -'get_magic_quotes_gpc' => ['int|false'], -'get_magic_quotes_runtime' => ['int|false'], -'get_meta_tags' => ['array', 'filename'=>'string', 'use_include_path='=>'bool'], -'get_object_vars' => ['array', 'object'=>'object'], -'get_parent_class' => ['class-string|false', 'object_or_class='=>'object|class-string'], -'get_required_files' => ['list'], -'get_resource_id' => ['int', 'resource'=>'resource'], -'get_resource_type' => ['string', 'resource'=>'resource'], -'get_resources' => ['array', 'type='=>'string'], -'getallheaders' => ['array|false'], -'getcwd' => ['string|false'], -'getdate' => ['array{seconds: int<0, 59>, minutes: int<0, 59>, hours: int<0, 23>, mday: int<1, 31>, wday: int<0, 6>, mon: int<1, 12>, year: int, yday: int<0, 365>, weekday: "Monday"|"Tuesday"|"Wednesday"|"Thursday"|"Friday"|"Saturday"|"Sunday", month: "January"|"February"|"March"|"April"|"May"|"June"|"July"|"August"|"September"|"October"|"November"|"December", 0: int}', 'timestamp='=>'int'], -'getenv' => ['string|false', 'name'=>'string', 'local_only='=>'bool'], -'getenv\'1' => ['array'], -'gethostbyaddr' => ['string|false', 'ip'=>'string'], -'gethostbyname' => ['string', 'hostname'=>'string'], -'gethostbynamel' => ['list|false', 'hostname'=>'string'], -'gethostname' => ['string|false'], -'getimagesize' => ['array|false', 'filename'=>'string', '&w_image_info='=>'array'], -'getimagesizefromstring' => ['array|false', 'string'=>'string', '&w_image_info='=>'array'], -'getlastmod' => ['int|false'], -'getmxrr' => ['bool', 'hostname'=>'string', '&w_hosts'=>'array', '&w_weights='=>'array'], -'getmygid' => ['int|false'], -'getmyinode' => ['int|false'], -'getmypid' => ['int|false'], -'getmyuid' => ['int|false'], -'getopt' => ['array|array|array>|false', 'short_options'=>'string', 'long_options='=>'array', '&w_rest_index='=>'int'], -'getprotobyname' => ['int|false', 'protocol'=>'string'], -'getprotobynumber' => ['string', 'protocol'=>'int'], -'getrandmax' => ['int'], -'getrusage' => ['array', 'mode='=>'int'], -'getservbyname' => ['int|false', 'service'=>'string', 'protocol'=>'string'], -'getservbyport' => ['string|false', 'port'=>'int', 'protocol'=>'string'], -'gettext' => ['string', 'message'=>'string'], -'gettimeofday' => ['array'], -'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::count' => ['int'], -'GlobIterator::current' => ['FilesystemIterator|SplFileInfo|string'], -'GlobIterator::getATime' => [''], -'GlobIterator::getBasename' => ['', 'suffix='=>'string'], -'GlobIterator::getCTime' => [''], -'GlobIterator::getExtension' => [''], -'GlobIterator::getFileInfo' => [''], -'GlobIterator::getFilename' => [''], -'GlobIterator::getFlags' => ['int'], -'GlobIterator::getGroup' => [''], -'GlobIterator::getInode' => [''], -'GlobIterator::getLinkTarget' => [''], -'GlobIterator::getMTime' => [''], -'GlobIterator::getOwner' => [''], -'GlobIterator::getPath' => [''], -'GlobIterator::getPathInfo' => [''], -'GlobIterator::getPathname' => [''], -'GlobIterator::getPerms' => [''], -'GlobIterator::getRealPath' => [''], -'GlobIterator::getSize' => [''], -'GlobIterator::getType' => [''], -'GlobIterator::isDir' => [''], -'GlobIterator::isDot' => [''], -'GlobIterator::isExecutable' => [''], -'GlobIterator::isFile' => [''], -'GlobIterator::isLink' => [''], -'GlobIterator::isReadable' => [''], -'GlobIterator::isWritable' => [''], -'GlobIterator::key' => ['string'], -'GlobIterator::next' => ['void'], -'GlobIterator::openFile' => [''], -'GlobIterator::rewind' => ['void'], -'GlobIterator::seek' => ['void', 'position'=>'int'], -'GlobIterator::setFileClass' => [''], -'GlobIterator::setFlags' => ['void', 'flags='=>'int'], -'GlobIterator::setInfoClass' => [''], -'GlobIterator::valid' => [''], -'Gmagick::__construct' => ['void', 'filename='=>'string'], -'Gmagick::addimage' => ['Gmagick', 'gmagick'=>'gmagick'], -'Gmagick::addnoiseimage' => ['Gmagick', 'noise'=>'int'], -'Gmagick::annotateimage' => ['Gmagick', 'gmagickdraw'=>'gmagickdraw', 'x'=>'float', 'y'=>'float', 'angle'=>'float', 'text'=>'string'], -'Gmagick::blurimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], -'Gmagick::borderimage' => ['Gmagick', 'color'=>'gmagickpixel', 'width'=>'int', 'height'=>'int'], -'Gmagick::charcoalimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float'], -'Gmagick::chopimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], -'Gmagick::clear' => ['Gmagick'], -'Gmagick::commentimage' => ['Gmagick', 'comment'=>'string'], -'Gmagick::compositeimage' => ['Gmagick', 'source'=>'gmagick', 'compose'=>'int', 'x'=>'int', 'y'=>'int'], -'Gmagick::cropimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], -'Gmagick::cropthumbnailimage' => ['Gmagick', 'width'=>'int', 'height'=>'int'], -'Gmagick::current' => ['Gmagick'], -'Gmagick::cyclecolormapimage' => ['Gmagick', 'displace'=>'int'], -'Gmagick::deconstructimages' => ['Gmagick'], -'Gmagick::despeckleimage' => ['Gmagick'], -'Gmagick::destroy' => ['bool'], -'Gmagick::drawimage' => ['Gmagick', 'gmagickdraw'=>'gmagickdraw'], -'Gmagick::edgeimage' => ['Gmagick', 'radius'=>'float'], -'Gmagick::embossimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float'], -'Gmagick::enhanceimage' => ['Gmagick'], -'Gmagick::equalizeimage' => ['Gmagick'], -'Gmagick::flipimage' => ['Gmagick'], -'Gmagick::flopimage' => ['Gmagick'], -'Gmagick::frameimage' => ['Gmagick', 'color'=>'gmagickpixel', 'width'=>'int', 'height'=>'int', 'inner_bevel'=>'int', 'outer_bevel'=>'int'], -'Gmagick::gammaimage' => ['Gmagick', 'gamma'=>'float'], -'Gmagick::getcopyright' => ['string'], -'Gmagick::getfilename' => ['string'], -'Gmagick::getimagebackgroundcolor' => ['GmagickPixel'], -'Gmagick::getimageblueprimary' => ['array'], -'Gmagick::getimagebordercolor' => ['GmagickPixel'], -'Gmagick::getimagechanneldepth' => ['int', 'channel_type'=>'int'], -'Gmagick::getimagecolors' => ['int'], -'Gmagick::getimagecolorspace' => ['int'], -'Gmagick::getimagecompose' => ['int'], -'Gmagick::getimagedelay' => ['int'], -'Gmagick::getimagedepth' => ['int'], -'Gmagick::getimagedispose' => ['int'], -'Gmagick::getimageextrema' => ['array'], -'Gmagick::getimagefilename' => ['string'], -'Gmagick::getimageformat' => ['string'], -'Gmagick::getimagegamma' => ['float'], -'Gmagick::getimagegreenprimary' => ['array'], -'Gmagick::getimageheight' => ['int'], -'Gmagick::getimagehistogram' => ['array'], -'Gmagick::getimageindex' => ['int'], -'Gmagick::getimageinterlacescheme' => ['int'], -'Gmagick::getimageiterations' => ['int'], -'Gmagick::getimagematte' => ['int'], -'Gmagick::getimagemattecolor' => ['GmagickPixel'], -'Gmagick::getimageprofile' => ['string', 'name'=>'string'], -'Gmagick::getimageredprimary' => ['array'], -'Gmagick::getimagerenderingintent' => ['int'], -'Gmagick::getimageresolution' => ['array'], -'Gmagick::getimagescene' => ['int'], -'Gmagick::getimagesignature' => ['string'], -'Gmagick::getimagetype' => ['int'], -'Gmagick::getimageunits' => ['int'], -'Gmagick::getimagewhitepoint' => ['array'], -'Gmagick::getimagewidth' => ['int'], -'Gmagick::getpackagename' => ['string'], -'Gmagick::getquantumdepth' => ['array'], -'Gmagick::getreleasedate' => ['string'], -'Gmagick::getsamplingfactors' => ['array'], -'Gmagick::getsize' => ['array'], -'Gmagick::getversion' => ['array'], -'Gmagick::hasnextimage' => ['bool'], -'Gmagick::haspreviousimage' => ['bool'], -'Gmagick::implodeimage' => ['mixed', 'radius'=>'float'], -'Gmagick::labelimage' => ['mixed', 'label'=>'string'], -'Gmagick::levelimage' => ['mixed', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'int'], -'Gmagick::magnifyimage' => ['mixed'], -'Gmagick::mapimage' => ['Gmagick', 'gmagick'=>'gmagick', 'dither'=>'bool'], -'Gmagick::medianfilterimage' => ['void', 'radius'=>'float'], -'Gmagick::minifyimage' => ['Gmagick'], -'Gmagick::modulateimage' => ['Gmagick', 'brightness'=>'float', 'saturation'=>'float', 'hue'=>'float'], -'Gmagick::motionblurimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float'], -'Gmagick::newimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'background'=>'string', 'format='=>'string'], -'Gmagick::nextimage' => ['bool'], -'Gmagick::normalizeimage' => ['Gmagick', 'channel='=>'int'], -'Gmagick::oilpaintimage' => ['Gmagick', 'radius'=>'float'], -'Gmagick::previousimage' => ['bool'], -'Gmagick::profileimage' => ['Gmagick', 'name'=>'string', 'profile'=>'string'], -'Gmagick::quantizeimage' => ['Gmagick', 'numcolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], -'Gmagick::quantizeimages' => ['Gmagick', 'numcolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], -'Gmagick::queryfontmetrics' => ['array', 'draw'=>'gmagickdraw', 'text'=>'string'], -'Gmagick::queryfonts' => ['array', 'pattern='=>'string'], -'Gmagick::queryformats' => ['array', 'pattern='=>'string'], -'Gmagick::radialblurimage' => ['Gmagick', 'angle'=>'float', 'channel='=>'int'], -'Gmagick::raiseimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int', 'raise'=>'bool'], -'Gmagick::read' => ['Gmagick', 'filename'=>'string'], -'Gmagick::readimage' => ['Gmagick', 'filename'=>'string'], -'Gmagick::readimageblob' => ['Gmagick', 'imagecontents'=>'string', 'filename='=>'string'], -'Gmagick::readimagefile' => ['Gmagick', 'fp'=>'resource', 'filename='=>'string'], -'Gmagick::reducenoiseimage' => ['Gmagick', 'radius'=>'float'], -'Gmagick::removeimage' => ['Gmagick'], -'Gmagick::removeimageprofile' => ['string', 'name'=>'string'], -'Gmagick::resampleimage' => ['Gmagick', 'xresolution'=>'float', 'yresolution'=>'float', 'filter'=>'int', 'blur'=>'float'], -'Gmagick::resizeimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'filter'=>'int', 'blur'=>'float', 'fit='=>'bool'], -'Gmagick::rollimage' => ['Gmagick', 'x'=>'int', 'y'=>'int'], -'Gmagick::rotateimage' => ['Gmagick', 'color'=>'mixed', 'degrees'=>'float'], -'Gmagick::scaleimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'fit='=>'bool'], -'Gmagick::separateimagechannel' => ['Gmagick', 'channel'=>'int'], -'Gmagick::setCompressionQuality' => ['Gmagick', 'quality'=>'int'], -'Gmagick::setfilename' => ['Gmagick', 'filename'=>'string'], -'Gmagick::setimagebackgroundcolor' => ['Gmagick', 'color'=>'gmagickpixel'], -'Gmagick::setimageblueprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], -'Gmagick::setimagebordercolor' => ['Gmagick', 'color'=>'gmagickpixel'], -'Gmagick::setimagechanneldepth' => ['Gmagick', 'channel'=>'int', 'depth'=>'int'], -'Gmagick::setimagecolorspace' => ['Gmagick', 'colorspace'=>'int'], -'Gmagick::setimagecompose' => ['Gmagick', 'composite'=>'int'], -'Gmagick::setimagedelay' => ['Gmagick', 'delay'=>'int'], -'Gmagick::setimagedepth' => ['Gmagick', 'depth'=>'int'], -'Gmagick::setimagedispose' => ['Gmagick', 'disposetype'=>'int'], -'Gmagick::setimagefilename' => ['Gmagick', 'filename'=>'string'], -'Gmagick::setimageformat' => ['Gmagick', 'imageformat'=>'string'], -'Gmagick::setimagegamma' => ['Gmagick', 'gamma'=>'float'], -'Gmagick::setimagegreenprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], -'Gmagick::setimageindex' => ['Gmagick', 'index'=>'int'], -'Gmagick::setimageinterlacescheme' => ['Gmagick', 'interlace'=>'int'], -'Gmagick::setimageiterations' => ['Gmagick', 'iterations'=>'int'], -'Gmagick::setimageprofile' => ['Gmagick', 'name'=>'string', 'profile'=>'string'], -'Gmagick::setimageredprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], -'Gmagick::setimagerenderingintent' => ['Gmagick', 'rendering_intent'=>'int'], -'Gmagick::setimageresolution' => ['Gmagick', 'xresolution'=>'float', 'yresolution'=>'float'], -'Gmagick::setimagescene' => ['Gmagick', 'scene'=>'int'], -'Gmagick::setimagetype' => ['Gmagick', 'imgtype'=>'int'], -'Gmagick::setimageunits' => ['Gmagick', 'resolution'=>'int'], -'Gmagick::setimagewhitepoint' => ['Gmagick', 'x'=>'float', 'y'=>'float'], -'Gmagick::setsamplingfactors' => ['Gmagick', 'factors'=>'array'], -'Gmagick::setsize' => ['Gmagick', 'columns'=>'int', 'rows'=>'int'], -'Gmagick::shearimage' => ['Gmagick', 'color'=>'mixed', 'xshear'=>'float', 'yshear'=>'float'], -'Gmagick::solarizeimage' => ['Gmagick', 'threshold'=>'int'], -'Gmagick::spreadimage' => ['Gmagick', 'radius'=>'float'], -'Gmagick::stripimage' => ['Gmagick'], -'Gmagick::swirlimage' => ['Gmagick', 'degrees'=>'float'], -'Gmagick::thumbnailimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'fit='=>'bool'], -'Gmagick::trimimage' => ['Gmagick', 'fuzz'=>'float'], -'Gmagick::write' => ['Gmagick', 'filename'=>'string'], -'Gmagick::writeimage' => ['Gmagick', 'filename'=>'string', 'all_frames='=>'bool'], -'GmagickDraw::annotate' => ['GmagickDraw', 'x'=>'float', 'y'=>'float', 'text'=>'string'], -'GmagickDraw::arc' => ['GmagickDraw', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float', 'sd'=>'float', 'ed'=>'float'], -'GmagickDraw::bezier' => ['GmagickDraw', 'coordinate_array'=>'array'], -'GmagickDraw::ellipse' => ['GmagickDraw', 'ox'=>'float', 'oy'=>'float', 'rx'=>'float', 'ry'=>'float', 'start'=>'float', 'end'=>'float'], -'GmagickDraw::getfillcolor' => ['GmagickPixel'], -'GmagickDraw::getfillopacity' => ['float'], -'GmagickDraw::getfont' => ['string|false'], -'GmagickDraw::getfontsize' => ['float'], -'GmagickDraw::getfontstyle' => ['int'], -'GmagickDraw::getfontweight' => ['int'], -'GmagickDraw::getstrokecolor' => ['GmagickPixel'], -'GmagickDraw::getstrokeopacity' => ['float'], -'GmagickDraw::getstrokewidth' => ['float'], -'GmagickDraw::gettextdecoration' => ['int'], -'GmagickDraw::gettextencoding' => ['string|false'], -'GmagickDraw::line' => ['GmagickDraw', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float'], -'GmagickDraw::point' => ['GmagickDraw', 'x'=>'float', 'y'=>'float'], -'GmagickDraw::polygon' => ['GmagickDraw', 'coordinates'=>'array'], -'GmagickDraw::polyline' => ['GmagickDraw', 'coordinate_array'=>'array'], -'GmagickDraw::rectangle' => ['GmagickDraw', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], -'GmagickDraw::rotate' => ['GmagickDraw', 'degrees'=>'float'], -'GmagickDraw::roundrectangle' => ['GmagickDraw', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'rx'=>'float', 'ry'=>'float'], -'GmagickDraw::scale' => ['GmagickDraw', 'x'=>'float', 'y'=>'float'], -'GmagickDraw::setfillcolor' => ['GmagickDraw', 'color'=>'string'], -'GmagickDraw::setfillopacity' => ['GmagickDraw', 'fill_opacity'=>'float'], -'GmagickDraw::setfont' => ['GmagickDraw', 'font'=>'string'], -'GmagickDraw::setfontsize' => ['GmagickDraw', 'pointsize'=>'float'], -'GmagickDraw::setfontstyle' => ['GmagickDraw', 'style'=>'int'], -'GmagickDraw::setfontweight' => ['GmagickDraw', 'weight'=>'int'], -'GmagickDraw::setstrokecolor' => ['GmagickDraw', 'color'=>'gmagickpixel'], -'GmagickDraw::setstrokeopacity' => ['GmagickDraw', 'stroke_opacity'=>'float'], -'GmagickDraw::setstrokewidth' => ['GmagickDraw', 'width'=>'float'], -'GmagickDraw::settextdecoration' => ['GmagickDraw', 'decoration'=>'int'], -'GmagickDraw::settextencoding' => ['GmagickDraw', 'encoding'=>'string'], -'GmagickPixel::__construct' => ['void', 'color='=>'string'], -'GmagickPixel::getcolor' => ['mixed', 'as_array='=>'bool', 'normalize_array='=>'bool'], -'GmagickPixel::getcolorcount' => ['int'], -'GmagickPixel::getcolorvalue' => ['float', 'color'=>'int'], -'GmagickPixel::setcolor' => ['GmagickPixel', 'color'=>'string'], -'GmagickPixel::setcolorvalue' => ['GmagickPixel', 'color'=>'int', 'value'=>'float'], -'gmdate' => ['string', 'format'=>'string', 'timestamp='=>'int|null'], -'gmmktime' => ['int|false', 'hour'=>'int', 'minute='=>'int|null', 'second='=>'int|null', 'month='=>'int|null', 'day='=>'int|null', 'year='=>'int|null'], -'GMP::__construct' => ['void'], -'GMP::__toString' => ['numeric-string'], -'GMP::serialize' => ['string'], -'GMP::unserialize' => ['void', 'serialized'=>'string'], -'gmp_abs' => ['GMP', 'num'=>'GMP|string|int'], -'gmp_add' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_and' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_binomial' => ['GMP', 'n'=>'GMP|string|int', 'k'=>'int'], -'gmp_clrbit' => ['void', 'num'=>'GMP|string|int', 'index'=>'int'], -'gmp_cmp' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_com' => ['GMP', 'num'=>'GMP|string|int'], -'gmp_div' => ['GMP', 'num1'=>'GMP|resource|string', 'num2'=>'GMP|resource|string', 'rounding_mode='=>'int'], -'gmp_div_q' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], -'gmp_div_qr' => ['array{0: GMP, 1: GMP}', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], -'gmp_div_r' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], -'gmp_divexact' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_export' => ['string|false', 'num'=>'GMP|string|int', 'word_size='=>'int', 'flags='=>'int'], -'gmp_fact' => ['GMP', 'num'=>'int'], -'gmp_gcd' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_gcdext' => ['array', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_hamdist' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_import' => ['GMP|false', 'data'=>'string', 'word_size='=>'int', 'flags='=>'int'], -'gmp_init' => ['GMP', 'num'=>'int|string', 'base='=>'int'], -'gmp_intval' => ['int', 'num'=>'GMP|string|int'], -'gmp_invert' => ['GMP|false', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_jacobi' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_kronecker' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_lcm' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_legendre' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_mod' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_mul' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_neg' => ['GMP', 'num'=>'GMP|string|int'], -'gmp_nextprime' => ['GMP', 'num'=>'GMP|string|int'], -'gmp_or' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_perfect_power' => ['bool', 'num'=>'GMP|string|int'], -'gmp_perfect_square' => ['bool', 'num'=>'GMP|string|int'], -'gmp_popcount' => ['int', 'num'=>'GMP|string|int'], -'gmp_pow' => ['GMP', 'num'=>'GMP|string|int', 'exponent'=>'int'], -'gmp_powm' => ['GMP', 'num'=>'GMP|string|int', 'exponent'=>'GMP|string|int', 'modulus'=>'GMP|string|int'], -'gmp_prob_prime' => ['int', 'num'=>'GMP|string|int', 'repetitions='=>'int'], -'gmp_random_bits' => ['GMP', 'bits'=>'int'], -'gmp_random_range' => ['GMP', 'min'=>'GMP|string|int', 'max'=>'GMP|string|int'], -'gmp_random_seed' => ['void', 'seed'=>'GMP|string|int'], -'gmp_root' => ['GMP', 'num'=>'GMP|string|int', 'nth'=>'int'], -'gmp_rootrem' => ['array{0: GMP, 1: GMP}', 'num'=>'GMP|string|int', 'nth'=>'int'], -'gmp_scan0' => ['int', 'num1'=>'GMP|string|int', 'start'=>'int'], -'gmp_scan1' => ['int', 'num1'=>'GMP|string|int', 'start'=>'int'], -'gmp_setbit' => ['void', 'num'=>'GMP|string|int', 'index'=>'int', 'value='=>'bool'], -'gmp_sign' => ['int', 'num'=>'GMP|string|int'], -'gmp_sqrt' => ['GMP', 'num'=>'GMP|string|int'], -'gmp_sqrtrem' => ['array{0: GMP, 1: GMP}', 'num'=>'GMP|string|int'], -'gmp_strval' => ['numeric-string', 'num'=>'GMP|string|int', 'base='=>'int'], -'gmp_sub' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmp_testbit' => ['bool', 'num'=>'GMP|string|int', 'index'=>'int'], -'gmp_xor' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], -'gmstrftime' => ['string|false', 'format'=>'string', 'timestamp='=>'?int'], -'gnupg::adddecryptkey' => ['bool', 'fingerprint'=>'string', 'passphrase'=>'string'], -'gnupg::addencryptkey' => ['bool', 'fingerprint'=>'string'], -'gnupg::addsignkey' => ['bool', 'fingerprint'=>'string', 'passphrase='=>'string'], -'gnupg::cleardecryptkeys' => ['bool'], -'gnupg::clearencryptkeys' => ['bool'], -'gnupg::clearsignkeys' => ['bool'], -'gnupg::decrypt' => ['string|false', 'text'=>'string'], -'gnupg::decryptverify' => ['array|false', 'text'=>'string', '&plaintext'=>'string'], -'gnupg::encrypt' => ['string|false', 'plaintext'=>'string'], -'gnupg::encryptsign' => ['string|false', 'plaintext'=>'string'], -'gnupg::export' => ['string|false', 'fingerprint'=>'string'], -'gnupg::geterror' => ['string|false'], -'gnupg::getprotocol' => ['int'], -'gnupg::import' => ['array|false', 'keydata'=>'string'], -'gnupg::init' => ['resource'], -'gnupg::keyinfo' => ['array', 'pattern'=>'string'], -'gnupg::setarmor' => ['bool', 'armor'=>'int'], -'gnupg::seterrormode' => ['void', 'errormode'=>'int'], -'gnupg::setsignmode' => ['bool', 'signmode'=>'int'], -'gnupg::sign' => ['string|false', 'plaintext'=>'string'], -'gnupg::verify' => ['array|false', 'signed_text'=>'string', 'signature'=>'string', '&plaintext='=>'string'], -'gnupg_adddecryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase'=>'string'], -'gnupg_addencryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string'], -'gnupg_addsignkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase='=>'string'], -'gnupg_cleardecryptkeys' => ['bool', 'identifier'=>'resource'], -'gnupg_clearencryptkeys' => ['bool', 'identifier'=>'resource'], -'gnupg_clearsignkeys' => ['bool', 'identifier'=>'resource'], -'gnupg_decrypt' => ['string', 'identifier'=>'resource', 'text'=>'string'], -'gnupg_decryptverify' => ['array', 'identifier'=>'resource', 'text'=>'string', 'plaintext'=>'string'], -'gnupg_encrypt' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], -'gnupg_encryptsign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], -'gnupg_export' => ['string', 'identifier'=>'resource', 'fingerprint'=>'string'], -'gnupg_geterror' => ['string', 'identifier'=>'resource'], -'gnupg_getprotocol' => ['int', 'identifier'=>'resource'], -'gnupg_import' => ['array', 'identifier'=>'resource', 'keydata'=>'string'], -'gnupg_init' => ['resource'], -'gnupg_keyinfo' => ['array', 'identifier'=>'resource', 'pattern'=>'string'], -'gnupg_setarmor' => ['bool', 'identifier'=>'resource', 'armor'=>'int'], -'gnupg_seterrormode' => ['void', 'identifier'=>'resource', 'errormode'=>'int'], -'gnupg_setsignmode' => ['bool', 'identifier'=>'resource', 'signmode'=>'int'], -'gnupg_sign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], -'gnupg_verify' => ['array', 'identifier'=>'resource', 'signed_text'=>'string', 'signature'=>'string', 'plaintext='=>'string'], -'gopher_parsedir' => ['array', 'dirent'=>'string'], -'grapheme_extract' => ['string|false', 'haystack'=>'string', 'size'=>'int', 'type='=>'int', 'offset='=>'int', '&w_next='=>'int'], -'grapheme_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], -'grapheme_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'beforeNeedle='=>'bool'], -'grapheme_strlen' => ['0|positive-int|false|null', 'string'=>'string'], -'grapheme_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], -'grapheme_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], -'grapheme_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], -'grapheme_strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'beforeNeedle='=>'bool'], -'grapheme_substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int'], -'gregoriantojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], -'gridObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'Grpc\Call::__construct' => ['void', 'channel'=>'Grpc\Channel', 'method'=>'string', 'absolute_deadline'=>'Grpc\Timeval', 'host_override='=>'mixed'], -'Grpc\Call::cancel' => [''], -'Grpc\Call::getPeer' => ['string'], -'Grpc\Call::setCredentials' => ['int', 'creds_obj'=>'Grpc\CallCredentials'], -'Grpc\Call::startBatch' => ['object', 'batch'=>'array'], -'Grpc\CallCredentials::createComposite' => ['Grpc\CallCredentials', 'cred1'=>'Grpc\CallCredentials', 'cred2'=>'Grpc\CallCredentials'], -'Grpc\CallCredentials::createFromPlugin' => ['Grpc\CallCredentials', 'callback'=>'Closure'], -'Grpc\Channel::__construct' => ['void', 'target'=>'string', 'args='=>'array'], -'Grpc\Channel::close' => [''], -'Grpc\Channel::getConnectivityState' => ['int', 'try_to_connect='=>'bool'], -'Grpc\Channel::getTarget' => ['string'], -'Grpc\Channel::watchConnectivityState' => ['bool', 'last_state'=>'int', 'deadline_obj'=>'Grpc\Timeval'], -'Grpc\ChannelCredentials::createComposite' => ['Grpc\ChannelCredentials', 'cred1'=>'Grpc\ChannelCredentials', 'cred2'=>'Grpc\CallCredentials'], -'Grpc\ChannelCredentials::createDefault' => ['Grpc\ChannelCredentials'], -'Grpc\ChannelCredentials::createInsecure' => ['null'], -'Grpc\ChannelCredentials::createSsl' => ['Grpc\ChannelCredentials', 'pem_root_certs'=>'string', 'pem_private_key='=>'string', 'pem_cert_chain='=>'string'], -'Grpc\ChannelCredentials::setDefaultRootsPem' => ['', 'pem_roots'=>'string'], -'Grpc\Server::__construct' => ['void', 'args'=>'array'], -'Grpc\Server::addHttp2Port' => ['bool', 'addr'=>'string'], -'Grpc\Server::addSecureHttp2Port' => ['bool', 'addr'=>'string', 'creds_obj'=>'Grpc\ServerCredentials'], -'Grpc\Server::requestCall' => ['', 'tag_new'=>'int', 'tag_cancel'=>'int'], -'Grpc\Server::start' => [''], -'Grpc\ServerCredentials::createSsl' => ['object', 'pem_root_certs'=>'string', 'pem_private_key'=>'string', 'pem_cert_chain'=>'string'], -'Grpc\Timeval::__construct' => ['void', 'usec'=>'int'], -'Grpc\Timeval::add' => ['Grpc\Timeval', 'other'=>'Grpc\Timeval'], -'Grpc\Timeval::compare' => ['int', 'a'=>'Grpc\Timeval', 'b'=>'Grpc\Timeval'], -'Grpc\Timeval::infFuture' => ['Grpc\Timeval'], -'Grpc\Timeval::infPast' => ['Grpc\Timeval'], -'Grpc\Timeval::now' => ['Grpc\Timeval'], -'Grpc\Timeval::similar' => ['bool', 'a'=>'Grpc\Timeval', 'b'=>'Grpc\Timeval', 'threshold'=>'Grpc\Timeval'], -'Grpc\Timeval::sleepUntil' => [''], -'Grpc\Timeval::subtract' => ['Grpc\Timeval', 'other'=>'Grpc\Timeval'], -'Grpc\Timeval::zero' => ['Grpc\Timeval'], -'gupnp_context_get_host_ip' => ['string', 'context'=>'resource'], -'gupnp_context_get_port' => ['int', 'context'=>'resource'], -'gupnp_context_get_subscription_timeout' => ['int', 'context'=>'resource'], -'gupnp_context_host_path' => ['bool', 'context'=>'resource', 'local_path'=>'string', 'server_path'=>'string'], -'gupnp_context_new' => ['resource', 'host_ip='=>'string', 'port='=>'int'], -'gupnp_context_set_subscription_timeout' => ['void', 'context'=>'resource', 'timeout'=>'int'], -'gupnp_context_timeout_add' => ['bool', 'context'=>'resource', 'timeout'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], -'gupnp_context_unhost_path' => ['bool', 'context'=>'resource', 'server_path'=>'string'], -'gupnp_control_point_browse_start' => ['bool', 'cpoint'=>'resource'], -'gupnp_control_point_browse_stop' => ['bool', 'cpoint'=>'resource'], -'gupnp_control_point_callback_set' => ['bool', 'cpoint'=>'resource', 'signal'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], -'gupnp_control_point_new' => ['resource', 'context'=>'resource', 'target'=>'string'], -'gupnp_device_action_callback_set' => ['bool', 'root_device'=>'resource', 'signal'=>'int', 'action_name'=>'string', 'callback'=>'mixed', 'arg='=>'mixed'], -'gupnp_device_info_get' => ['array', 'root_device'=>'resource'], -'gupnp_device_info_get_service' => ['resource', 'root_device'=>'resource', 'type'=>'string'], -'gupnp_root_device_get_available' => ['bool', 'root_device'=>'resource'], -'gupnp_root_device_get_relative_location' => ['string', 'root_device'=>'resource'], -'gupnp_root_device_new' => ['resource', 'context'=>'resource', 'location'=>'string', 'description_dir'=>'string'], -'gupnp_root_device_set_available' => ['bool', 'root_device'=>'resource', 'available'=>'bool'], -'gupnp_root_device_start' => ['bool', 'root_device'=>'resource'], -'gupnp_root_device_stop' => ['bool', 'root_device'=>'resource'], -'gupnp_service_action_get' => ['mixed', 'action'=>'resource', 'name'=>'string', 'type'=>'int'], -'gupnp_service_action_return' => ['bool', 'action'=>'resource'], -'gupnp_service_action_return_error' => ['bool', 'action'=>'resource', 'error_code'=>'int', 'error_description='=>'string'], -'gupnp_service_action_set' => ['bool', 'action'=>'resource', 'name'=>'string', 'type'=>'int', 'value'=>'mixed'], -'gupnp_service_freeze_notify' => ['bool', 'service'=>'resource'], -'gupnp_service_info_get' => ['array', 'proxy'=>'resource'], -'gupnp_service_info_get_introspection' => ['mixed', 'proxy'=>'resource', 'callback='=>'mixed', 'arg='=>'mixed'], -'gupnp_service_introspection_get_state_variable' => ['array', 'introspection'=>'resource', 'variable_name'=>'string'], -'gupnp_service_notify' => ['bool', 'service'=>'resource', 'name'=>'string', 'type'=>'int', 'value'=>'mixed'], -'gupnp_service_proxy_action_get' => ['mixed', 'proxy'=>'resource', 'action'=>'string', 'name'=>'string', 'type'=>'int'], -'gupnp_service_proxy_action_set' => ['bool', 'proxy'=>'resource', 'action'=>'string', 'name'=>'string', 'value'=>'mixed', 'type'=>'int'], -'gupnp_service_proxy_add_notify' => ['bool', 'proxy'=>'resource', 'value'=>'string', 'type'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], -'gupnp_service_proxy_callback_set' => ['bool', 'proxy'=>'resource', 'signal'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], -'gupnp_service_proxy_get_subscribed' => ['bool', 'proxy'=>'resource'], -'gupnp_service_proxy_remove_notify' => ['bool', 'proxy'=>'resource', 'value'=>'string'], -'gupnp_service_proxy_send_action' => ['array', 'proxy'=>'resource', 'action'=>'string', 'in_params'=>'array', 'out_params'=>'array'], -'gupnp_service_proxy_set_subscribed' => ['bool', 'proxy'=>'resource', 'subscribed'=>'bool'], -'gupnp_service_thaw_notify' => ['bool', 'service'=>'resource'], -'gzclose' => ['bool', 'stream'=>'resource'], -'gzcompress' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], -'gzdecode' => ['string|false', 'data'=>'string', 'max_length='=>'int'], -'gzdeflate' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], -'gzencode' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], -'gzeof' => ['bool|int', 'stream'=>'resource'], -'gzfile' => ['list', 'filename'=>'string', 'use_include_path='=>'int'], -'gzgetc' => ['string|false', 'stream'=>'resource'], -'gzgets' => ['string|false', 'stream'=>'resource', 'length='=>'int'], -'gzinflate' => ['string|false', 'data'=>'string', 'max_length='=>'int'], -'gzopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'int'], -'gzpassthru' => ['int|false', 'stream'=>'resource'], -'gzputs' => ['int', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], -'gzread' => ['string|false', 'stream'=>'resource', 'length'=>'int'], -'gzrewind' => ['bool', 'stream'=>'resource'], -'gzseek' => ['int', 'stream'=>'resource', 'offset'=>'int', 'whence='=>'int'], -'gztell' => ['int|false', 'stream'=>'resource'], -'gzuncompress' => ['string|false', 'data'=>'string', 'max_length='=>'int'], -'gzwrite' => ['int', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], -'HaruAnnotation::setBorderStyle' => ['bool', 'width'=>'float', 'dash_on'=>'int', 'dash_off'=>'int'], -'HaruAnnotation::setHighlightMode' => ['bool', 'mode'=>'int'], -'HaruAnnotation::setIcon' => ['bool', 'icon'=>'int'], -'HaruAnnotation::setOpened' => ['bool', 'opened'=>'bool'], -'HaruDestination::setFit' => ['bool'], -'HaruDestination::setFitB' => ['bool'], -'HaruDestination::setFitBH' => ['bool', 'top'=>'float'], -'HaruDestination::setFitBV' => ['bool', 'left'=>'float'], -'HaruDestination::setFitH' => ['bool', 'top'=>'float'], -'HaruDestination::setFitR' => ['bool', 'left'=>'float', 'bottom'=>'float', 'right'=>'float', 'top'=>'float'], -'HaruDestination::setFitV' => ['bool', 'left'=>'float'], -'HaruDestination::setXYZ' => ['bool', 'left'=>'float', 'top'=>'float', 'zoom'=>'float'], -'HaruDoc::__construct' => ['void'], -'HaruDoc::addPage' => ['object'], -'HaruDoc::addPageLabel' => ['bool', 'first_page'=>'int', 'style'=>'int', 'first_num'=>'int', 'prefix='=>'string'], -'HaruDoc::createOutline' => ['object', 'title'=>'string', 'parent_outline='=>'object', 'encoder='=>'object'], -'HaruDoc::getCurrentEncoder' => ['object'], -'HaruDoc::getCurrentPage' => ['object'], -'HaruDoc::getEncoder' => ['object', 'encoding'=>'string'], -'HaruDoc::getFont' => ['object', 'fontname'=>'string', 'encoding='=>'string'], -'HaruDoc::getInfoAttr' => ['string', 'type'=>'int'], -'HaruDoc::getPageLayout' => ['int'], -'HaruDoc::getPageMode' => ['int'], -'HaruDoc::getStreamSize' => ['int'], -'HaruDoc::insertPage' => ['object', 'page'=>'object'], -'HaruDoc::loadJPEG' => ['object', 'filename'=>'string'], -'HaruDoc::loadPNG' => ['object', 'filename'=>'string', 'deferred='=>'bool'], -'HaruDoc::loadRaw' => ['object', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'color_space'=>'int'], -'HaruDoc::loadTTC' => ['string', 'fontfile'=>'string', 'index'=>'int', 'embed='=>'bool'], -'HaruDoc::loadTTF' => ['string', 'fontfile'=>'string', 'embed='=>'bool'], -'HaruDoc::loadType1' => ['string', 'afmfile'=>'string', 'pfmfile='=>'string'], -'HaruDoc::output' => ['bool'], -'HaruDoc::readFromStream' => ['string', 'bytes'=>'int'], -'HaruDoc::resetError' => ['bool'], -'HaruDoc::resetStream' => ['bool'], -'HaruDoc::save' => ['bool', 'file'=>'string'], -'HaruDoc::saveToStream' => ['bool'], -'HaruDoc::setCompressionMode' => ['bool', 'mode'=>'int'], -'HaruDoc::setCurrentEncoder' => ['bool', 'encoding'=>'string'], -'HaruDoc::setEncryptionMode' => ['bool', 'mode'=>'int', 'key_len='=>'int'], -'HaruDoc::setInfoAttr' => ['bool', 'type'=>'int', 'info'=>'string'], -'HaruDoc::setInfoDateAttr' => ['bool', 'type'=>'int', 'year'=>'int', 'month'=>'int', 'day'=>'int', 'hour'=>'int', 'min'=>'int', 'sec'=>'int', 'ind'=>'string', 'off_hour'=>'int', 'off_min'=>'int'], -'HaruDoc::setOpenAction' => ['bool', 'destination'=>'object'], -'HaruDoc::setPageLayout' => ['bool', 'layout'=>'int'], -'HaruDoc::setPageMode' => ['bool', 'mode'=>'int'], -'HaruDoc::setPagesConfiguration' => ['bool', 'page_per_pages'=>'int'], -'HaruDoc::setPassword' => ['bool', 'owner_password'=>'string', 'user_password'=>'string'], -'HaruDoc::setPermission' => ['bool', 'permission'=>'int'], -'HaruDoc::useCNSEncodings' => ['bool'], -'HaruDoc::useCNSFonts' => ['bool'], -'HaruDoc::useCNTEncodings' => ['bool'], -'HaruDoc::useCNTFonts' => ['bool'], -'HaruDoc::useJPEncodings' => ['bool'], -'HaruDoc::useJPFonts' => ['bool'], -'HaruDoc::useKREncodings' => ['bool'], -'HaruDoc::useKRFonts' => ['bool'], -'HaruEncoder::getByteType' => ['int', 'text'=>'string', 'index'=>'int'], -'HaruEncoder::getType' => ['int'], -'HaruEncoder::getUnicode' => ['int', 'character'=>'int'], -'HaruEncoder::getWritingMode' => ['int'], -'HaruFont::getAscent' => ['int'], -'HaruFont::getCapHeight' => ['int'], -'HaruFont::getDescent' => ['int'], -'HaruFont::getEncodingName' => ['string'], -'HaruFont::getFontName' => ['string'], -'HaruFont::getTextWidth' => ['array', 'text'=>'string'], -'HaruFont::getUnicodeWidth' => ['int', 'character'=>'int'], -'HaruFont::getXHeight' => ['int'], -'HaruFont::measureText' => ['int', 'text'=>'string', 'width'=>'float', 'font_size'=>'float', 'char_space'=>'float', 'word_space'=>'float', 'word_wrap='=>'bool'], -'HaruImage::getBitsPerComponent' => ['int'], -'HaruImage::getColorSpace' => ['string'], -'HaruImage::getHeight' => ['int'], -'HaruImage::getSize' => ['array'], -'HaruImage::getWidth' => ['int'], -'HaruImage::setColorMask' => ['bool', 'rmin'=>'int', 'rmax'=>'int', 'gmin'=>'int', 'gmax'=>'int', 'bmin'=>'int', 'bmax'=>'int'], -'HaruImage::setMaskImage' => ['bool', 'mask_image'=>'object'], -'HaruOutline::setDestination' => ['bool', 'destination'=>'object'], -'HaruOutline::setOpened' => ['bool', 'opened'=>'bool'], -'HaruPage::arc' => ['bool', 'x'=>'float', 'y'=>'float', 'ray'=>'float', 'ang1'=>'float', 'ang2'=>'float'], -'HaruPage::beginText' => ['bool'], -'HaruPage::circle' => ['bool', 'x'=>'float', 'y'=>'float', 'ray'=>'float'], -'HaruPage::closePath' => ['bool'], -'HaruPage::concat' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], -'HaruPage::createDestination' => ['object'], -'HaruPage::createLinkAnnotation' => ['object', 'rectangle'=>'array', 'destination'=>'object'], -'HaruPage::createTextAnnotation' => ['object', 'rectangle'=>'array', 'text'=>'string', 'encoder='=>'object'], -'HaruPage::createURLAnnotation' => ['object', 'rectangle'=>'array', 'url'=>'string'], -'HaruPage::curveTo' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], -'HaruPage::curveTo2' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], -'HaruPage::curveTo3' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x3'=>'float', 'y3'=>'float'], -'HaruPage::drawImage' => ['bool', 'image'=>'object', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], -'HaruPage::ellipse' => ['bool', 'x'=>'float', 'y'=>'float', 'xray'=>'float', 'yray'=>'float'], -'HaruPage::endPath' => ['bool'], -'HaruPage::endText' => ['bool'], -'HaruPage::eofill' => ['bool'], -'HaruPage::eoFillStroke' => ['bool', 'close_path='=>'bool'], -'HaruPage::fill' => ['bool'], -'HaruPage::fillStroke' => ['bool', 'close_path='=>'bool'], -'HaruPage::getCharSpace' => ['float'], -'HaruPage::getCMYKFill' => ['array'], -'HaruPage::getCMYKStroke' => ['array'], -'HaruPage::getCurrentFont' => ['object'], -'HaruPage::getCurrentFontSize' => ['float'], -'HaruPage::getCurrentPos' => ['array'], -'HaruPage::getCurrentTextPos' => ['array'], -'HaruPage::getDash' => ['array'], -'HaruPage::getFillingColorSpace' => ['int'], -'HaruPage::getFlatness' => ['float'], -'HaruPage::getGMode' => ['int'], -'HaruPage::getGrayFill' => ['float'], -'HaruPage::getGrayStroke' => ['float'], -'HaruPage::getHeight' => ['float'], -'HaruPage::getHorizontalScaling' => ['float'], -'HaruPage::getLineCap' => ['int'], -'HaruPage::getLineJoin' => ['int'], -'HaruPage::getLineWidth' => ['float'], -'HaruPage::getMiterLimit' => ['float'], -'HaruPage::getRGBFill' => ['array'], -'HaruPage::getRGBStroke' => ['array'], -'HaruPage::getStrokingColorSpace' => ['int'], -'HaruPage::getTextLeading' => ['float'], -'HaruPage::getTextMatrix' => ['array'], -'HaruPage::getTextRenderingMode' => ['int'], -'HaruPage::getTextRise' => ['float'], -'HaruPage::getTextWidth' => ['float', 'text'=>'string'], -'HaruPage::getTransMatrix' => ['array'], -'HaruPage::getWidth' => ['float'], -'HaruPage::getWordSpace' => ['float'], -'HaruPage::lineTo' => ['bool', 'x'=>'float', 'y'=>'float'], -'HaruPage::measureText' => ['int', 'text'=>'string', 'width'=>'float', 'wordwrap='=>'bool'], -'HaruPage::moveTextPos' => ['bool', 'x'=>'float', 'y'=>'float', 'set_leading='=>'bool'], -'HaruPage::moveTo' => ['bool', 'x'=>'float', 'y'=>'float'], -'HaruPage::moveToNextLine' => ['bool'], -'HaruPage::rectangle' => ['bool', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], -'HaruPage::setCharSpace' => ['bool', 'char_space'=>'float'], -'HaruPage::setCMYKFill' => ['bool', 'c'=>'float', 'm'=>'float', 'y'=>'float', 'k'=>'float'], -'HaruPage::setCMYKStroke' => ['bool', 'c'=>'float', 'm'=>'float', 'y'=>'float', 'k'=>'float'], -'HaruPage::setDash' => ['bool', 'pattern'=>'array', 'phase'=>'int'], -'HaruPage::setFlatness' => ['bool', 'flatness'=>'float'], -'HaruPage::setFontAndSize' => ['bool', 'font'=>'object', 'size'=>'float'], -'HaruPage::setGrayFill' => ['bool', 'value'=>'float'], -'HaruPage::setGrayStroke' => ['bool', 'value'=>'float'], -'HaruPage::setHeight' => ['bool', 'height'=>'float'], -'HaruPage::setHorizontalScaling' => ['bool', 'scaling'=>'float'], -'HaruPage::setLineCap' => ['bool', 'cap'=>'int'], -'HaruPage::setLineJoin' => ['bool', 'join'=>'int'], -'HaruPage::setLineWidth' => ['bool', 'width'=>'float'], -'HaruPage::setMiterLimit' => ['bool', 'limit'=>'float'], -'HaruPage::setRGBFill' => ['bool', 'r'=>'float', 'g'=>'float', 'b'=>'float'], -'HaruPage::setRGBStroke' => ['bool', 'r'=>'float', 'g'=>'float', 'b'=>'float'], -'HaruPage::setRotate' => ['bool', 'angle'=>'int'], -'HaruPage::setSize' => ['bool', 'size'=>'int', 'direction'=>'int'], -'HaruPage::setSlideShow' => ['bool', 'type'=>'int', 'disp_time'=>'float', 'trans_time'=>'float'], -'HaruPage::setTextLeading' => ['bool', 'text_leading'=>'float'], -'HaruPage::setTextMatrix' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], -'HaruPage::setTextRenderingMode' => ['bool', 'mode'=>'int'], -'HaruPage::setTextRise' => ['bool', 'rise'=>'float'], -'HaruPage::setWidth' => ['bool', 'width'=>'float'], -'HaruPage::setWordSpace' => ['bool', 'word_space'=>'float'], -'HaruPage::showText' => ['bool', 'text'=>'string'], -'HaruPage::showTextNextLine' => ['bool', 'text'=>'string', 'word_space='=>'float', 'char_space='=>'float'], -'HaruPage::stroke' => ['bool', 'close_path='=>'bool'], -'HaruPage::textOut' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'], -'HaruPage::textRect' => ['bool', 'left'=>'float', 'top'=>'float', 'right'=>'float', 'bottom'=>'float', 'text'=>'string', 'align='=>'int'], -'hash' => ['string|false', 'algo'=>'string', 'data'=>'string', 'binary='=>'bool', 'options='=>'array'], -'hash_algos' => ['list'], -'hash_copy' => ['HashContext', 'context'=>'HashContext'], -'hash_equals' => ['bool', 'known_string'=>'string', 'user_string'=>'string'], -'hash_file' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'binary='=>'bool', 'options='=>'array'], -'hash_final' => ['string', 'context'=>'HashContext', 'binary='=>'bool'], -'hash_hkdf' => ['string|false', 'algo'=>'string', 'key'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'], -'hash_hmac' => ['string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'binary='=>'bool'], -'hash_hmac_algos' => ['list'], -'hash_hmac_file' => ['string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'binary='=>'bool'], -'hash_init' => ['HashContext', 'algo'=>'string', 'flags='=>'int', 'key='=>'string', 'options='=>'array'], -'hash_pbkdf2' => ['string', 'algo'=>'string', 'password'=>'string', 'salt'=>'string', 'iterations'=>'int', 'length='=>'int', 'binary='=>'bool'], -'hash_update' => ['bool', 'context'=>'HashContext', 'data'=>'string'], -'hash_update_file' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'stream_context='=>'?resource'], -'hash_update_stream' => ['int', 'context'=>'HashContext', 'stream'=>'resource', 'length='=>'int'], -'hashTableObj::clear' => ['void'], -'hashTableObj::get' => ['string', 'key'=>'string'], -'hashTableObj::nextkey' => ['string', 'previousKey'=>'string'], -'hashTableObj::remove' => ['int', 'key'=>'string'], -'hashTableObj::set' => ['int', 'key'=>'string', 'value'=>'string'], -'header' => ['void', 'header'=>'string', 'replace='=>'bool', 'response_code='=>'int'], -'header_register_callback' => ['bool', 'callback'=>'callable():void'], -'header_remove' => ['void', 'name='=>'string'], -'headers_list' => ['list'], -'headers_sent' => ['bool', '&w_filename='=>'string', '&w_line='=>'int'], -'hebrev' => ['string', 'string'=>'string', 'max_chars_per_line='=>'int'], -'hebrevc' => ['string', 'string'=>'string', 'max_chars_per_line='=>'int'], -'hex2bin' => ['string|false', 'string'=>'string'], -'hexdec' => ['int|float', 'hex_string'=>'string'], -'highlight_file' => ['string|bool', 'filename'=>'string', 'return='=>'bool'], -'highlight_string' => ['string|bool', 'string'=>'string', 'return='=>'bool'], -'hrtime' => ['array{0:int,1:int}|false', 'as_number='=>'false'], -'hrtime\'1' => ['int|float|false', 'as_number='=>'true'], -'HRTime\PerformanceCounter::getElapsedTicks' => ['int'], -'HRTime\PerformanceCounter::getFrequency' => ['int'], -'HRTime\PerformanceCounter::getLastElapsedTicks' => ['int'], -'HRTime\PerformanceCounter::getTicks' => ['int'], -'HRTime\PerformanceCounter::getTicksSince' => ['int', 'start'=>'int'], -'HRTime\PerformanceCounter::isRunning' => ['bool'], -'HRTime\PerformanceCounter::start' => ['void'], -'HRTime\PerformanceCounter::stop' => ['void'], -'HRTime\StopWatch::getElapsedTicks' => ['int'], -'HRTime\StopWatch::getElapsedTime' => ['float', 'unit='=>'int'], -'HRTime\StopWatch::getLastElapsedTicks' => ['int'], -'HRTime\StopWatch::getLastElapsedTime' => ['float', 'unit='=>'int'], -'HRTime\StopWatch::isRunning' => ['bool'], -'HRTime\StopWatch::start' => ['void'], -'HRTime\StopWatch::stop' => ['void'], -'html_entity_decode' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string'], -'htmlentities' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string', 'double_encode='=>'bool'], -'htmlspecialchars' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string|null', 'double_encode='=>'bool'], -'htmlspecialchars_decode' => ['string', 'string'=>'string', 'flags='=>'int'], -'http\Client::__construct' => ['void', 'driver='=>'string', 'persistent_handle_id='=>'string'], -'http\Client::addCookies' => ['http\Client', 'cookies='=>'?array'], -'http\Client::addSslOptions' => ['http\Client', 'ssl_options='=>'?array'], -'http\Client::attach' => ['void', 'observer'=>'SplObserver'], -'http\Client::configure' => ['http\Client', 'settings'=>'array'], -'http\Client::count' => ['int'], -'http\Client::dequeue' => ['http\Client', 'request'=>'http\Client\Request'], -'http\Client::detach' => ['void', 'observer'=>'SplObserver'], -'http\Client::enableEvents' => ['http\Client', 'enable='=>'mixed'], -'http\Client::enablePipelining' => ['http\Client', 'enable='=>'mixed'], -'http\Client::enqueue' => ['http\Client', 'request'=>'http\Client\Request', 'callable='=>'mixed'], -'http\Client::getAvailableConfiguration' => ['array'], -'http\Client::getAvailableDrivers' => ['array'], -'http\Client::getAvailableOptions' => ['array'], -'http\Client::getCookies' => ['array'], -'http\Client::getHistory' => ['http\Message'], -'http\Client::getObservers' => ['SplObjectStorage'], -'http\Client::getOptions' => ['array'], -'http\Client::getProgressInfo' => ['null|object', 'request'=>'http\Client\Request'], -'http\Client::getResponse' => ['http\Client\Response|null', 'request='=>'?http\Client\Request'], -'http\Client::getSslOptions' => ['array'], -'http\Client::getTransferInfo' => ['object', 'request'=>'http\Client\Request'], -'http\Client::notify' => ['void', 'request='=>'?http\Client\Request'], -'http\Client::once' => ['bool'], -'http\Client::requeue' => ['http\Client', 'request'=>'http\Client\Request', 'callable='=>'mixed'], -'http\Client::reset' => ['http\Client'], -'http\Client::send' => ['http\Client'], -'http\Client::setCookies' => ['http\Client', 'cookies='=>'?array'], -'http\Client::setDebug' => ['http\Client', 'callback'=>'callable'], -'http\Client::setOptions' => ['http\Client', 'options='=>'?array'], -'http\Client::setSslOptions' => ['http\Client', 'ssl_option='=>'?array'], -'http\Client::wait' => ['bool', 'timeout='=>'mixed'], -'http\Client\Curl\User::init' => ['', 'run'=>'callable'], -'http\Client\Curl\User::once' => [''], -'http\Client\Curl\User::send' => [''], -'http\Client\Curl\User::socket' => ['', 'socket'=>'resource', 'action'=>'int'], -'http\Client\Curl\User::timer' => ['', 'timeout_ms'=>'int'], -'http\Client\Curl\User::wait' => ['', 'timeout_ms='=>'mixed'], -'http\Client\Request::__construct' => ['void', 'method='=>'mixed', 'url='=>'mixed', 'headers='=>'?array', 'body='=>'?http\Message\Body'], -'http\Client\Request::__toString' => ['string'], -'http\Client\Request::addBody' => ['http\Message', 'body'=>'http\Message\Body'], -'http\Client\Request::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], -'http\Client\Request::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], -'http\Client\Request::addQuery' => ['http\Client\Request', 'query_data'=>'mixed'], -'http\Client\Request::addSslOptions' => ['http\Client\Request', 'ssl_options='=>'?array'], -'http\Client\Request::count' => ['int'], -'http\Client\Request::current' => ['mixed'], -'http\Client\Request::detach' => ['http\Message'], -'http\Client\Request::getBody' => ['http\Message\Body'], -'http\Client\Request::getContentType' => ['null|string'], -'http\Client\Request::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], -'http\Client\Request::getHeaders' => ['array'], -'http\Client\Request::getHttpVersion' => ['string'], -'http\Client\Request::getInfo' => ['null|string'], -'http\Client\Request::getOptions' => ['array'], -'http\Client\Request::getParentMessage' => ['http\Message'], -'http\Client\Request::getQuery' => ['null|string'], -'http\Client\Request::getRequestMethod' => ['false|string'], -'http\Client\Request::getRequestUrl' => ['false|string'], -'http\Client\Request::getResponseCode' => ['false|int'], -'http\Client\Request::getResponseStatus' => ['false|string'], -'http\Client\Request::getSslOptions' => ['array'], -'http\Client\Request::getType' => ['int'], -'http\Client\Request::isMultipart' => ['bool', '&boundary='=>'mixed'], -'http\Client\Request::key' => ['int|string'], -'http\Client\Request::next' => ['void'], -'http\Client\Request::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], -'http\Client\Request::reverse' => ['http\Message'], -'http\Client\Request::rewind' => ['void'], -'http\Client\Request::serialize' => ['string'], -'http\Client\Request::setBody' => ['http\Message', 'body'=>'http\Message\Body'], -'http\Client\Request::setContentType' => ['http\Client\Request', 'content_type'=>'string'], -'http\Client\Request::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], -'http\Client\Request::setHeaders' => ['http\Message', 'headers'=>'array'], -'http\Client\Request::setHttpVersion' => ['http\Message', 'http_version'=>'string'], -'http\Client\Request::setInfo' => ['http\Message', 'http_info'=>'string'], -'http\Client\Request::setOptions' => ['http\Client\Request', 'options='=>'?array'], -'http\Client\Request::setQuery' => ['http\Client\Request', 'query_data='=>'mixed'], -'http\Client\Request::setRequestMethod' => ['http\Message', 'request_method'=>'string'], -'http\Client\Request::setRequestUrl' => ['http\Message', 'url'=>'string'], -'http\Client\Request::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], -'http\Client\Request::setResponseStatus' => ['http\Message', 'response_status'=>'string'], -'http\Client\Request::setSslOptions' => ['http\Client\Request', 'ssl_options='=>'?array'], -'http\Client\Request::setType' => ['http\Message', 'type'=>'int'], -'http\Client\Request::splitMultipartBody' => ['http\Message'], -'http\Client\Request::toCallback' => ['http\Message', 'callback'=>'callable'], -'http\Client\Request::toStream' => ['http\Message', 'stream'=>'resource'], -'http\Client\Request::toString' => ['string', 'include_parent='=>'mixed'], -'http\Client\Request::unserialize' => ['void', 'serialized'=>'string'], -'http\Client\Request::valid' => ['bool'], -'http\Client\Response::__construct' => ['Iterator'], -'http\Client\Response::__toString' => ['string'], -'http\Client\Response::addBody' => ['http\Message', 'body'=>'http\Message\Body'], -'http\Client\Response::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], -'http\Client\Response::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], -'http\Client\Response::count' => ['int'], -'http\Client\Response::current' => ['mixed'], -'http\Client\Response::detach' => ['http\Message'], -'http\Client\Response::getBody' => ['http\Message\Body'], -'http\Client\Response::getCookies' => ['array', 'flags='=>'mixed', 'allowed_extras='=>'mixed'], -'http\Client\Response::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], -'http\Client\Response::getHeaders' => ['array'], -'http\Client\Response::getHttpVersion' => ['string'], -'http\Client\Response::getInfo' => ['null|string'], -'http\Client\Response::getParentMessage' => ['http\Message'], -'http\Client\Response::getRequestMethod' => ['false|string'], -'http\Client\Response::getRequestUrl' => ['false|string'], -'http\Client\Response::getResponseCode' => ['false|int'], -'http\Client\Response::getResponseStatus' => ['false|string'], -'http\Client\Response::getTransferInfo' => ['mixed|object', 'element='=>'mixed'], -'http\Client\Response::getType' => ['int'], -'http\Client\Response::isMultipart' => ['bool', '&boundary='=>'mixed'], -'http\Client\Response::key' => ['int|string'], -'http\Client\Response::next' => ['void'], -'http\Client\Response::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], -'http\Client\Response::reverse' => ['http\Message'], -'http\Client\Response::rewind' => ['void'], -'http\Client\Response::serialize' => ['string'], -'http\Client\Response::setBody' => ['http\Message', 'body'=>'http\Message\Body'], -'http\Client\Response::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], -'http\Client\Response::setHeaders' => ['http\Message', 'headers'=>'array'], -'http\Client\Response::setHttpVersion' => ['http\Message', 'http_version'=>'string'], -'http\Client\Response::setInfo' => ['http\Message', 'http_info'=>'string'], -'http\Client\Response::setRequestMethod' => ['http\Message', 'request_method'=>'string'], -'http\Client\Response::setRequestUrl' => ['http\Message', 'url'=>'string'], -'http\Client\Response::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], -'http\Client\Response::setResponseStatus' => ['http\Message', 'response_status'=>'string'], -'http\Client\Response::setType' => ['http\Message', 'type'=>'int'], -'http\Client\Response::splitMultipartBody' => ['http\Message'], -'http\Client\Response::toCallback' => ['http\Message', 'callback'=>'callable'], -'http\Client\Response::toStream' => ['http\Message', 'stream'=>'resource'], -'http\Client\Response::toString' => ['string', 'include_parent='=>'mixed'], -'http\Client\Response::unserialize' => ['void', 'serialized'=>'string'], -'http\Client\Response::valid' => ['bool'], -'http\Cookie::__construct' => ['void', 'cookie_string='=>'mixed', 'parser_flags='=>'int', 'allowed_extras='=>'array'], -'http\Cookie::__toString' => ['string'], -'http\Cookie::addCookie' => ['http\Cookie', 'cookie_name'=>'string', 'cookie_value'=>'string'], -'http\Cookie::addCookies' => ['http\Cookie', 'cookies'=>'array'], -'http\Cookie::addExtra' => ['http\Cookie', 'extra_name'=>'string', 'extra_value'=>'string'], -'http\Cookie::addExtras' => ['http\Cookie', 'extras'=>'array'], -'http\Cookie::getCookie' => ['null|string', 'name'=>'string'], -'http\Cookie::getCookies' => ['array'], -'http\Cookie::getDomain' => ['string'], -'http\Cookie::getExpires' => ['int'], -'http\Cookie::getExtra' => ['string', 'name'=>'string'], -'http\Cookie::getExtras' => ['array'], -'http\Cookie::getFlags' => ['int'], -'http\Cookie::getMaxAge' => ['int'], -'http\Cookie::getPath' => ['string'], -'http\Cookie::setCookie' => ['http\Cookie', 'cookie_name'=>'string', 'cookie_value='=>'mixed'], -'http\Cookie::setCookies' => ['http\Cookie', 'cookies='=>'mixed'], -'http\Cookie::setDomain' => ['http\Cookie', 'value='=>'mixed'], -'http\Cookie::setExpires' => ['http\Cookie', 'value='=>'mixed'], -'http\Cookie::setExtra' => ['http\Cookie', 'extra_name'=>'string', 'extra_value='=>'mixed'], -'http\Cookie::setExtras' => ['http\Cookie', 'extras='=>'mixed'], -'http\Cookie::setFlags' => ['http\Cookie', 'value='=>'mixed'], -'http\Cookie::setMaxAge' => ['http\Cookie', 'value='=>'mixed'], -'http\Cookie::setPath' => ['http\Cookie', 'value='=>'mixed'], -'http\Cookie::toArray' => ['array'], -'http\Cookie::toString' => ['string'], -'http\Encoding\Stream::__construct' => ['void', 'flags='=>'mixed'], -'http\Encoding\Stream::done' => ['bool'], -'http\Encoding\Stream::finish' => ['string'], -'http\Encoding\Stream::flush' => ['string'], -'http\Encoding\Stream::update' => ['string', 'data'=>'string'], -'http\Encoding\Stream\Debrotli::__construct' => ['void', 'flags='=>'int'], -'http\Encoding\Stream\Debrotli::decode' => ['string', 'data'=>'string'], -'http\Encoding\Stream\Debrotli::done' => ['bool'], -'http\Encoding\Stream\Debrotli::finish' => ['string'], -'http\Encoding\Stream\Debrotli::flush' => ['string'], -'http\Encoding\Stream\Debrotli::update' => ['string', 'data'=>'string'], -'http\Encoding\Stream\Dechunk::__construct' => ['void', 'flags='=>'mixed'], -'http\Encoding\Stream\Dechunk::decode' => ['false|string', 'data'=>'string', '&decoded_len='=>'mixed'], -'http\Encoding\Stream\Dechunk::done' => ['bool'], -'http\Encoding\Stream\Dechunk::finish' => ['string'], -'http\Encoding\Stream\Dechunk::flush' => ['string'], -'http\Encoding\Stream\Dechunk::update' => ['string', 'data'=>'string'], -'http\Encoding\Stream\Deflate::__construct' => ['void', 'flags='=>'mixed'], -'http\Encoding\Stream\Deflate::done' => ['bool'], -'http\Encoding\Stream\Deflate::encode' => ['string', 'data'=>'string', 'flags='=>'mixed'], -'http\Encoding\Stream\Deflate::finish' => ['string'], -'http\Encoding\Stream\Deflate::flush' => ['string'], -'http\Encoding\Stream\Deflate::update' => ['string', 'data'=>'string'], -'http\Encoding\Stream\Enbrotli::__construct' => ['void', 'flags='=>'int'], -'http\Encoding\Stream\Enbrotli::done' => ['bool'], -'http\Encoding\Stream\Enbrotli::encode' => ['string', 'data'=>'string', 'flags='=>'int'], -'http\Encoding\Stream\Enbrotli::finish' => ['string'], -'http\Encoding\Stream\Enbrotli::flush' => ['string'], -'http\Encoding\Stream\Enbrotli::update' => ['string', 'data'=>'string'], -'http\Encoding\Stream\Inflate::__construct' => ['void', 'flags='=>'mixed'], -'http\Encoding\Stream\Inflate::decode' => ['string', 'data'=>'string'], -'http\Encoding\Stream\Inflate::done' => ['bool'], -'http\Encoding\Stream\Inflate::finish' => ['string'], -'http\Encoding\Stream\Inflate::flush' => ['string'], -'http\Encoding\Stream\Inflate::update' => ['string', 'data'=>'string'], -'http\Env::getRequestBody' => ['http\Message\Body', 'body_class_name='=>'mixed'], -'http\Env::getRequestHeader' => ['array|null|string', 'header_name='=>'mixed'], -'http\Env::getResponseCode' => ['int'], -'http\Env::getResponseHeader' => ['array|null|string', 'header_name='=>'mixed'], -'http\Env::getResponseStatusForAllCodes' => ['array'], -'http\Env::getResponseStatusForCode' => ['string', 'code'=>'int'], -'http\Env::negotiate' => ['null|string', 'params'=>'string', 'supported'=>'array', 'primary_type_separator='=>'mixed', '&result_array='=>'mixed'], -'http\Env::negotiateCharset' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], -'http\Env::negotiateContentType' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], -'http\Env::negotiateEncoding' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], -'http\Env::negotiateLanguage' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], -'http\Env::setResponseCode' => ['bool', 'code'=>'int'], -'http\Env::setResponseHeader' => ['bool', 'header_name'=>'string', 'header_value='=>'mixed', 'response_code='=>'mixed', 'replace_header='=>'mixed'], -'http\Env\Request::__construct' => ['void'], -'http\Env\Request::__toString' => ['string'], -'http\Env\Request::addBody' => ['http\Message', 'body'=>'http\Message\Body'], -'http\Env\Request::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], -'http\Env\Request::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], -'http\Env\Request::count' => ['int'], -'http\Env\Request::current' => ['mixed'], -'http\Env\Request::detach' => ['http\Message'], -'http\Env\Request::getBody' => ['http\Message\Body'], -'http\Env\Request::getCookie' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], -'http\Env\Request::getFiles' => ['array'], -'http\Env\Request::getForm' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], -'http\Env\Request::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], -'http\Env\Request::getHeaders' => ['array'], -'http\Env\Request::getHttpVersion' => ['string'], -'http\Env\Request::getInfo' => ['null|string'], -'http\Env\Request::getParentMessage' => ['http\Message'], -'http\Env\Request::getQuery' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], -'http\Env\Request::getRequestMethod' => ['false|string'], -'http\Env\Request::getRequestUrl' => ['false|string'], -'http\Env\Request::getResponseCode' => ['false|int'], -'http\Env\Request::getResponseStatus' => ['false|string'], -'http\Env\Request::getType' => ['int'], -'http\Env\Request::isMultipart' => ['bool', '&boundary='=>'mixed'], -'http\Env\Request::key' => ['int|string'], -'http\Env\Request::next' => ['void'], -'http\Env\Request::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], -'http\Env\Request::reverse' => ['http\Message'], -'http\Env\Request::rewind' => ['void'], -'http\Env\Request::serialize' => ['string'], -'http\Env\Request::setBody' => ['http\Message', 'body'=>'http\Message\Body'], -'http\Env\Request::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], -'http\Env\Request::setHeaders' => ['http\Message', 'headers'=>'array'], -'http\Env\Request::setHttpVersion' => ['http\Message', 'http_version'=>'string'], -'http\Env\Request::setInfo' => ['http\Message', 'http_info'=>'string'], -'http\Env\Request::setRequestMethod' => ['http\Message', 'request_method'=>'string'], -'http\Env\Request::setRequestUrl' => ['http\Message', 'url'=>'string'], -'http\Env\Request::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], -'http\Env\Request::setResponseStatus' => ['http\Message', 'response_status'=>'string'], -'http\Env\Request::setType' => ['http\Message', 'type'=>'int'], -'http\Env\Request::splitMultipartBody' => ['http\Message'], -'http\Env\Request::toCallback' => ['http\Message', 'callback'=>'callable'], -'http\Env\Request::toStream' => ['http\Message', 'stream'=>'resource'], -'http\Env\Request::toString' => ['string', 'include_parent='=>'mixed'], -'http\Env\Request::unserialize' => ['void', 'serialized'=>'string'], -'http\Env\Request::valid' => ['bool'], -'http\Env\Response::__construct' => ['void'], -'http\Env\Response::__invoke' => ['bool', 'data'=>'string', 'ob_flags='=>'int'], -'http\Env\Response::__toString' => ['string'], -'http\Env\Response::addBody' => ['http\Message', 'body'=>'http\Message\Body'], -'http\Env\Response::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], -'http\Env\Response::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], -'http\Env\Response::count' => ['int'], -'http\Env\Response::current' => ['mixed'], -'http\Env\Response::detach' => ['http\Message'], -'http\Env\Response::getBody' => ['http\Message\Body'], -'http\Env\Response::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], -'http\Env\Response::getHeaders' => ['array'], -'http\Env\Response::getHttpVersion' => ['string'], -'http\Env\Response::getInfo' => ['?string'], -'http\Env\Response::getParentMessage' => ['http\Message'], -'http\Env\Response::getRequestMethod' => ['false|string'], -'http\Env\Response::getRequestUrl' => ['false|string'], -'http\Env\Response::getResponseCode' => ['false|int'], -'http\Env\Response::getResponseStatus' => ['false|string'], -'http\Env\Response::getType' => ['int'], -'http\Env\Response::isCachedByETag' => ['int', 'header_name='=>'string'], -'http\Env\Response::isCachedByLastModified' => ['int', 'header_name='=>'string'], -'http\Env\Response::isMultipart' => ['bool', '&boundary='=>'mixed'], -'http\Env\Response::key' => ['int|string'], -'http\Env\Response::next' => ['void'], -'http\Env\Response::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], -'http\Env\Response::reverse' => ['http\Message'], -'http\Env\Response::rewind' => ['void'], -'http\Env\Response::send' => ['bool', 'stream='=>'resource'], -'http\Env\Response::serialize' => ['string'], -'http\Env\Response::setBody' => ['http\Message', 'body'=>'http\Message\Body'], -'http\Env\Response::setCacheControl' => ['http\Env\Response', 'cache_control'=>'string'], -'http\Env\Response::setContentDisposition' => ['http\Env\Response', 'disposition_params'=>'array'], -'http\Env\Response::setContentEncoding' => ['http\Env\Response', 'content_encoding'=>'int'], -'http\Env\Response::setContentType' => ['http\Env\Response', 'content_type'=>'string'], -'http\Env\Response::setCookie' => ['http\Env\Response', 'cookie'=>'mixed'], -'http\Env\Response::setEnvRequest' => ['http\Env\Response', 'env_request'=>'http\Message'], -'http\Env\Response::setEtag' => ['http\Env\Response', 'etag'=>'string'], -'http\Env\Response::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], -'http\Env\Response::setHeaders' => ['http\Message', 'headers'=>'array'], -'http\Env\Response::setHttpVersion' => ['http\Message', 'http_version'=>'string'], -'http\Env\Response::setInfo' => ['http\Message', 'http_info'=>'string'], -'http\Env\Response::setLastModified' => ['http\Env\Response', 'last_modified'=>'int'], -'http\Env\Response::setRequestMethod' => ['http\Message', 'request_method'=>'string'], -'http\Env\Response::setRequestUrl' => ['http\Message', 'url'=>'string'], -'http\Env\Response::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], -'http\Env\Response::setResponseStatus' => ['http\Message', 'response_status'=>'string'], -'http\Env\Response::setThrottleRate' => ['http\Env\Response', 'chunk_size'=>'int', 'delay='=>'float|int'], -'http\Env\Response::setType' => ['http\Message', 'type'=>'int'], -'http\Env\Response::splitMultipartBody' => ['http\Message'], -'http\Env\Response::toCallback' => ['http\Message', 'callback'=>'callable'], -'http\Env\Response::toStream' => ['http\Message', 'stream'=>'resource'], -'http\Env\Response::toString' => ['string', 'include_parent='=>'mixed'], -'http\Env\Response::unserialize' => ['void', 'serialized'=>'string'], -'http\Env\Response::valid' => ['bool'], -'http\Header::__construct' => ['void', 'name='=>'mixed', 'value='=>'mixed'], -'http\Header::__toString' => ['string'], -'http\Header::getParams' => ['http\Params', 'param_sep='=>'mixed', 'arg_sep='=>'mixed', 'val_sep='=>'mixed', 'flags='=>'mixed'], -'http\Header::match' => ['bool', 'value'=>'string', 'flags='=>'mixed'], -'http\Header::negotiate' => ['null|string', 'supported'=>'array', '&result='=>'mixed'], -'http\Header::parse' => ['array|false', 'string'=>'string', 'header_class='=>'mixed'], -'http\Header::serialize' => ['string'], -'http\Header::toString' => ['string'], -'http\Header::unserialize' => ['void', 'serialized'=>'string'], -'http\Header\Parser::getState' => ['int'], -'http\Header\Parser::parse' => ['int', 'data'=>'string', 'flags'=>'int', '&headers'=>'array'], -'http\Header\Parser::stream' => ['int', 'stream'=>'resource', 'flags'=>'int', '&headers'=>'array'], -'http\Message::__construct' => ['void', 'message='=>'mixed', 'greedy='=>'bool'], -'http\Message::__toString' => ['string'], -'http\Message::addBody' => ['http\Message', 'body'=>'http\Message\Body'], -'http\Message::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], -'http\Message::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], -'http\Message::count' => ['int'], -'http\Message::current' => ['mixed'], -'http\Message::detach' => ['http\Message'], -'http\Message::getBody' => ['http\Message\Body'], -'http\Message::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], -'http\Message::getHeaders' => ['array'], -'http\Message::getHttpVersion' => ['string'], -'http\Message::getInfo' => ['null|string'], -'http\Message::getParentMessage' => ['http\Message'], -'http\Message::getRequestMethod' => ['false|string'], -'http\Message::getRequestUrl' => ['false|string'], -'http\Message::getResponseCode' => ['false|int'], -'http\Message::getResponseStatus' => ['false|string'], -'http\Message::getType' => ['int'], -'http\Message::isMultipart' => ['bool', '&boundary='=>'mixed'], -'http\Message::key' => ['int|string'], -'http\Message::next' => ['void'], -'http\Message::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], -'http\Message::reverse' => ['http\Message'], -'http\Message::rewind' => ['void'], -'http\Message::serialize' => ['string'], -'http\Message::setBody' => ['http\Message', 'body'=>'http\Message\Body'], -'http\Message::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], -'http\Message::setHeaders' => ['http\Message', 'headers'=>'array'], -'http\Message::setHttpVersion' => ['http\Message', 'http_version'=>'string'], -'http\Message::setInfo' => ['http\Message', 'http_info'=>'string'], -'http\Message::setRequestMethod' => ['http\Message', 'request_method'=>'string'], -'http\Message::setRequestUrl' => ['http\Message', 'url'=>'string'], -'http\Message::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], -'http\Message::setResponseStatus' => ['http\Message', 'response_status'=>'string'], -'http\Message::setType' => ['http\Message', 'type'=>'int'], -'http\Message::splitMultipartBody' => ['http\Message'], -'http\Message::toCallback' => ['http\Message', 'callback'=>'callable'], -'http\Message::toStream' => ['http\Message', 'stream'=>'resource'], -'http\Message::toString' => ['string', 'include_parent='=>'mixed'], -'http\Message::unserialize' => ['void', 'serialized'=>'string'], -'http\Message::valid' => ['bool'], -'http\Message\Body::__construct' => ['void', 'stream='=>'resource'], -'http\Message\Body::__toString' => ['string'], -'http\Message\Body::addForm' => ['http\Message\Body', 'fields='=>'?array', 'files='=>'?array'], -'http\Message\Body::addPart' => ['http\Message\Body', 'message'=>'http\Message'], -'http\Message\Body::append' => ['http\Message\Body', 'string'=>'string'], -'http\Message\Body::etag' => ['false|string'], -'http\Message\Body::getBoundary' => ['null|string'], -'http\Message\Body::getResource' => ['resource'], -'http\Message\Body::serialize' => ['string'], -'http\Message\Body::stat' => ['int|object', 'field='=>'mixed'], -'http\Message\Body::toCallback' => ['http\Message\Body', 'callback'=>'callable', 'offset='=>'mixed', 'maxlen='=>'mixed'], -'http\Message\Body::toStream' => ['http\Message\Body', 'stream'=>'resource', 'offset='=>'mixed', 'maxlen='=>'mixed'], -'http\Message\Body::toString' => ['string'], -'http\Message\Body::unserialize' => ['void', 'serialized'=>'string'], -'http\Message\Parser::getState' => ['int'], -'http\Message\Parser::parse' => ['int', 'data'=>'string', 'flags'=>'int', '&message'=>'http\Message'], -'http\Message\Parser::stream' => ['int', 'stream'=>'resource', 'flags'=>'int', '&message'=>'http\Message'], -'http\Params::__construct' => ['void', 'params='=>'mixed', 'param_sep='=>'mixed', 'arg_sep='=>'mixed', 'val_sep='=>'mixed', 'flags='=>'mixed'], -'http\Params::__toString' => ['string'], -'http\Params::offsetExists' => ['bool', 'name'=>'mixed'], -'http\Params::offsetGet' => ['mixed', 'name'=>'mixed'], -'http\Params::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], -'http\Params::offsetUnset' => ['void', 'name'=>'mixed'], -'http\Params::toArray' => ['array'], -'http\Params::toString' => ['string'], -'http\QueryString::__construct' => ['void', 'querystring'=>'string'], -'http\QueryString::__toString' => ['string'], -'http\QueryString::get' => ['http\QueryString|string|mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getArray' => ['array|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getBool' => ['bool|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getFloat' => ['float|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getGlobalInstance' => ['http\QueryString'], -'http\QueryString::getInt' => ['int|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getIterator' => ['IteratorAggregate'], -'http\QueryString::getObject' => ['object|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getString' => ['string|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::mod' => ['http\QueryString', 'params='=>'mixed'], -'http\QueryString::offsetExists' => ['bool', 'offset'=>'mixed'], -'http\QueryString::offsetGet' => ['mixed|null', 'offset'=>'mixed'], -'http\QueryString::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], -'http\QueryString::offsetUnset' => ['void', 'offset'=>'mixed'], -'http\QueryString::serialize' => ['string'], -'http\QueryString::set' => ['http\QueryString', 'params'=>'mixed'], -'http\QueryString::toArray' => ['array'], -'http\QueryString::toString' => ['string'], -'http\QueryString::unserialize' => ['void', 'serialized'=>'string'], -'http\QueryString::xlate' => ['http\QueryString'], -'http\Url::__construct' => ['void', 'old_url='=>'mixed', 'new_url='=>'mixed', 'flags='=>'int'], -'http\Url::__toString' => ['string'], -'http\Url::mod' => ['http\Url', 'parts'=>'mixed', 'flags='=>'float|int|mixed'], -'http\Url::toArray' => ['string[]'], -'http\Url::toString' => ['string'], -'http_build_cookie' => ['string', 'cookie'=>'array'], -'http_build_query' => ['string', 'data'=>'array|object', 'numeric_prefix='=>'string', 'arg_separator='=>'string', 'encoding_type='=>'int'], -'http_build_str' => ['string', 'query'=>'array', 'prefix='=>'?string', 'arg_separator='=>'string'], -'http_build_url' => ['string', 'url='=>'string|array', 'parts='=>'string|array', 'flags='=>'int', 'new_url='=>'array'], -'http_cache_etag' => ['bool', 'etag='=>'string'], -'http_cache_last_modified' => ['bool', 'timestamp_or_expires='=>'int'], -'http_chunked_decode' => ['string|false', 'encoded'=>'string'], -'http_date' => ['string', 'timestamp='=>'int'], -'http_deflate' => ['?string', 'data'=>'string', 'flags='=>'int'], -'http_get' => ['string', 'url'=>'string', 'options='=>'array', 'info='=>'array'], -'http_get_request_body' => ['?string'], -'http_get_request_body_stream' => ['?resource'], -'http_get_request_headers' => ['array'], -'http_head' => ['string', 'url'=>'string', 'options='=>'array', 'info='=>'array'], -'http_inflate' => ['?string', 'data'=>'string'], -'http_match_etag' => ['bool', 'etag'=>'string', 'for_range='=>'bool'], -'http_match_modified' => ['bool', 'timestamp='=>'int', 'for_range='=>'bool'], -'http_match_request_header' => ['bool', 'header'=>'string', 'value'=>'string', 'match_case='=>'bool'], -'http_negotiate_charset' => ['string', 'supported'=>'array', 'result='=>'array'], -'http_negotiate_content_type' => ['string', 'supported'=>'array', 'result='=>'array'], -'http_negotiate_language' => ['string', 'supported'=>'array', 'result='=>'array'], -'http_parse_cookie' => ['stdClass|false', 'cookie'=>'string', 'flags='=>'int', 'allowed_extras='=>'array'], -'http_parse_headers' => ['array|false', 'header'=>'string'], -'http_parse_message' => ['object', 'message'=>'string'], -'http_parse_params' => ['stdClass', 'param'=>'string', 'flags='=>'int'], -'http_persistent_handles_clean' => ['string', 'ident='=>'string'], -'http_persistent_handles_count' => ['stdClass|false'], -'http_persistent_handles_ident' => ['string|false', 'ident='=>'string'], -'http_post_data' => ['string', 'url'=>'string', 'data'=>'string', 'options='=>'array', 'info='=>'array'], -'http_post_fields' => ['string', 'url'=>'string', 'data'=>'array', 'files='=>'array', 'options='=>'array', 'info='=>'array'], -'http_put_data' => ['string', 'url'=>'string', 'data'=>'string', 'options='=>'array', 'info='=>'array'], -'http_put_file' => ['string', 'url'=>'string', 'file'=>'string', 'options='=>'array', 'info='=>'array'], -'http_put_stream' => ['string', 'url'=>'string', 'stream'=>'resource', 'options='=>'array', 'info='=>'array'], -'http_redirect' => ['int|false', 'url='=>'string', 'params='=>'array', 'session='=>'bool', 'status='=>'int'], -'http_request' => ['string', 'method'=>'int', 'url'=>'string', 'body='=>'string', 'options='=>'array', 'info='=>'array'], -'http_request_body_encode' => ['string|false', 'fields'=>'array', 'files'=>'array'], -'http_request_method_exists' => ['bool', 'method'=>'mixed'], -'http_request_method_name' => ['string|false', 'method'=>'int'], -'http_request_method_register' => ['int|false', 'method'=>'string'], -'http_request_method_unregister' => ['bool', 'method'=>'mixed'], -'http_response_code' => ['int|bool', 'response_code='=>'int'], -'http_send_content_disposition' => ['bool', 'filename'=>'string', 'inline='=>'bool'], -'http_send_content_type' => ['bool', 'content_type='=>'string'], -'http_send_data' => ['bool', 'data'=>'string'], -'http_send_file' => ['bool', 'file'=>'string'], -'http_send_last_modified' => ['bool', 'timestamp='=>'int'], -'http_send_status' => ['bool', 'status'=>'int'], -'http_send_stream' => ['bool', 'stream'=>'resource'], -'http_support' => ['int', 'feature='=>'int'], -'http_throttle' => ['void', 'sec'=>'float', 'bytes='=>'int'], -'HttpDeflateStream::__construct' => ['void', 'flags='=>'int'], -'HttpDeflateStream::factory' => ['HttpDeflateStream', 'flags='=>'int', 'class_name='=>'string'], -'HttpDeflateStream::finish' => ['string', 'data='=>'string'], -'HttpDeflateStream::flush' => ['string|false', 'data='=>'string'], -'HttpDeflateStream::update' => ['string|false', 'data'=>'string'], -'HttpInflateStream::__construct' => ['void', 'flags='=>'int'], -'HttpInflateStream::factory' => ['HttpInflateStream', 'flags='=>'int', 'class_name='=>'string'], -'HttpInflateStream::finish' => ['string', 'data='=>'string'], -'HttpInflateStream::flush' => ['string|false', 'data='=>'string'], -'HttpInflateStream::update' => ['string|false', 'data'=>'string'], -'HttpMessage::__construct' => ['void', 'message='=>'string'], -'HttpMessage::__toString' => ['string'], -'HttpMessage::addHeaders' => ['void', 'headers'=>'array', 'append='=>'bool'], -'HttpMessage::count' => ['int'], -'HttpMessage::current' => ['mixed'], -'HttpMessage::detach' => ['HttpMessage'], -'HttpMessage::factory' => ['?HttpMessage', 'raw_message='=>'string', 'class_name='=>'string'], -'HttpMessage::fromEnv' => ['?HttpMessage', 'message_type'=>'int', 'class_name='=>'string'], -'HttpMessage::fromString' => ['?HttpMessage', 'raw_message='=>'string', 'class_name='=>'string'], -'HttpMessage::getBody' => ['string'], -'HttpMessage::getHeader' => ['?string', 'header'=>'string'], -'HttpMessage::getHeaders' => ['array'], -'HttpMessage::getHttpVersion' => ['string'], -'HttpMessage::getInfo' => [''], -'HttpMessage::getParentMessage' => ['HttpMessage'], -'HttpMessage::getRequestMethod' => ['string|false'], -'HttpMessage::getRequestUrl' => ['string|false'], -'HttpMessage::getResponseCode' => ['int'], -'HttpMessage::getResponseStatus' => ['string'], -'HttpMessage::getType' => ['int'], -'HttpMessage::guessContentType' => ['string|false', 'magic_file'=>'string', 'magic_mode='=>'int'], -'HttpMessage::key' => ['int|string'], -'HttpMessage::next' => ['void'], -'HttpMessage::prepend' => ['void', 'message'=>'HttpMessage', 'top='=>'bool'], -'HttpMessage::reverse' => ['HttpMessage'], -'HttpMessage::rewind' => ['void'], -'HttpMessage::send' => ['bool'], -'HttpMessage::serialize' => ['string'], -'HttpMessage::setBody' => ['void', 'body'=>'string'], -'HttpMessage::setHeaders' => ['void', 'headers'=>'array'], -'HttpMessage::setHttpVersion' => ['bool', 'version'=>'string'], -'HttpMessage::setInfo' => ['', 'http_info'=>''], -'HttpMessage::setRequestMethod' => ['bool', 'method'=>'string'], -'HttpMessage::setRequestUrl' => ['bool', 'url'=>'string'], -'HttpMessage::setResponseCode' => ['bool', 'code'=>'int'], -'HttpMessage::setResponseStatus' => ['bool', 'status'=>'string'], -'HttpMessage::setType' => ['void', 'type'=>'int'], -'HttpMessage::toMessageTypeObject' => ['HttpRequest|HttpResponse|null'], -'HttpMessage::toString' => ['string', 'include_parent='=>'bool'], -'HttpMessage::unserialize' => ['void', 'serialized'=>'string'], -'HttpMessage::valid' => ['bool'], -'HttpQueryString::__construct' => ['void', 'global='=>'bool', 'add='=>'mixed'], -'HttpQueryString::__toString' => ['string'], -'HttpQueryString::factory' => ['', 'global'=>'', 'params'=>'', 'class_name'=>''], -'HttpQueryString::get' => ['mixed', 'key='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], -'HttpQueryString::getArray' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], -'HttpQueryString::getBool' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], -'HttpQueryString::getFloat' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], -'HttpQueryString::getInt' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], -'HttpQueryString::getObject' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], -'HttpQueryString::getString' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], -'HttpQueryString::mod' => ['HttpQueryString', 'params'=>'mixed'], -'HttpQueryString::offsetExists' => ['bool', 'offset'=>'mixed'], -'HttpQueryString::offsetGet' => ['mixed', 'offset'=>'mixed'], -'HttpQueryString::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], -'HttpQueryString::offsetUnset' => ['void', 'offset'=>'mixed'], -'HttpQueryString::serialize' => ['string'], -'HttpQueryString::set' => ['string', 'params'=>'mixed'], -'HttpQueryString::singleton' => ['HttpQueryString', 'global='=>'bool'], -'HttpQueryString::toArray' => ['array'], -'HttpQueryString::toString' => ['string'], -'HttpQueryString::unserialize' => ['void', 'serialized'=>'string'], -'HttpQueryString::xlate' => ['bool', 'ie'=>'string', 'oe'=>'string'], -'HttpRequest::__construct' => ['void', 'url='=>'string', 'request_method='=>'int', 'options='=>'array'], -'HttpRequest::addBody' => ['', 'request_body_data'=>''], -'HttpRequest::addCookies' => ['bool', 'cookies'=>'array'], -'HttpRequest::addHeaders' => ['bool', 'headers'=>'array'], -'HttpRequest::addPostFields' => ['bool', 'post_data'=>'array'], -'HttpRequest::addPostFile' => ['bool', 'name'=>'string', 'file'=>'string', 'content_type='=>'string'], -'HttpRequest::addPutData' => ['bool', 'put_data'=>'string'], -'HttpRequest::addQueryData' => ['bool', 'query_params'=>'array'], -'HttpRequest::addRawPostData' => ['bool', 'raw_post_data'=>'string'], -'HttpRequest::addSslOptions' => ['bool', 'options'=>'array'], -'HttpRequest::clearHistory' => ['void'], -'HttpRequest::enableCookies' => ['bool'], -'HttpRequest::encodeBody' => ['', 'fields'=>'', 'files'=>''], -'HttpRequest::factory' => ['', 'url'=>'', 'method'=>'', 'options'=>'', 'class_name'=>''], -'HttpRequest::flushCookies' => [''], -'HttpRequest::get' => ['', 'url'=>'', 'options'=>'', '&info'=>''], -'HttpRequest::getBody' => [''], -'HttpRequest::getContentType' => ['string'], -'HttpRequest::getCookies' => ['array'], -'HttpRequest::getHeaders' => ['array'], -'HttpRequest::getHistory' => ['HttpMessage'], -'HttpRequest::getMethod' => ['int'], -'HttpRequest::getOptions' => ['array'], -'HttpRequest::getPostFields' => ['array'], -'HttpRequest::getPostFiles' => ['array'], -'HttpRequest::getPutData' => ['string'], -'HttpRequest::getPutFile' => ['string'], -'HttpRequest::getQueryData' => ['string'], -'HttpRequest::getRawPostData' => ['string'], -'HttpRequest::getRawRequestMessage' => ['string'], -'HttpRequest::getRawResponseMessage' => ['string'], -'HttpRequest::getRequestMessage' => ['HttpMessage'], -'HttpRequest::getResponseBody' => ['string'], -'HttpRequest::getResponseCode' => ['int'], -'HttpRequest::getResponseCookies' => ['stdClass[]', 'flags='=>'int', 'allowed_extras='=>'array'], -'HttpRequest::getResponseData' => ['array'], -'HttpRequest::getResponseHeader' => ['mixed', 'name='=>'string'], -'HttpRequest::getResponseInfo' => ['mixed', 'name='=>'string'], -'HttpRequest::getResponseMessage' => ['HttpMessage'], -'HttpRequest::getResponseStatus' => ['string'], -'HttpRequest::getSslOptions' => ['array'], -'HttpRequest::getUrl' => ['string'], -'HttpRequest::head' => ['', 'url'=>'', 'options'=>'', '&info'=>''], -'HttpRequest::methodExists' => ['', 'method'=>''], -'HttpRequest::methodName' => ['', 'method_id'=>''], -'HttpRequest::methodRegister' => ['', 'method_name'=>''], -'HttpRequest::methodUnregister' => ['', 'method'=>''], -'HttpRequest::postData' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], -'HttpRequest::postFields' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], -'HttpRequest::putData' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], -'HttpRequest::putFile' => ['', 'url'=>'', 'file'=>'', 'options'=>'', '&info'=>''], -'HttpRequest::putStream' => ['', 'url'=>'', 'stream'=>'', 'options'=>'', '&info'=>''], -'HttpRequest::resetCookies' => ['bool', 'session_only='=>'bool'], -'HttpRequest::send' => ['HttpMessage'], -'HttpRequest::setBody' => ['bool', 'request_body_data='=>'string'], -'HttpRequest::setContentType' => ['bool', 'content_type'=>'string'], -'HttpRequest::setCookies' => ['bool', 'cookies='=>'array'], -'HttpRequest::setHeaders' => ['bool', 'headers='=>'array'], -'HttpRequest::setMethod' => ['bool', 'request_method'=>'int'], -'HttpRequest::setOptions' => ['bool', 'options='=>'array'], -'HttpRequest::setPostFields' => ['bool', 'post_data'=>'array'], -'HttpRequest::setPostFiles' => ['bool', 'post_files'=>'array'], -'HttpRequest::setPutData' => ['bool', 'put_data='=>'string'], -'HttpRequest::setPutFile' => ['bool', 'file='=>'string'], -'HttpRequest::setQueryData' => ['bool', 'query_data'=>'mixed'], -'HttpRequest::setRawPostData' => ['bool', 'raw_post_data='=>'string'], -'HttpRequest::setSslOptions' => ['bool', 'options='=>'array'], -'HttpRequest::setUrl' => ['bool', 'url'=>'string'], -'HttpRequestDataShare::__construct' => ['void'], -'HttpRequestDataShare::__destruct' => ['void'], -'HttpRequestDataShare::attach' => ['', 'request'=>'HttpRequest'], -'HttpRequestDataShare::count' => ['int'], -'HttpRequestDataShare::detach' => ['', 'request'=>'HttpRequest'], -'HttpRequestDataShare::factory' => ['', 'global'=>'', 'class_name'=>''], -'HttpRequestDataShare::reset' => [''], -'HttpRequestDataShare::singleton' => ['', 'global'=>''], -'HttpRequestPool::__construct' => ['void', 'request='=>'HttpRequest'], -'HttpRequestPool::__destruct' => ['void'], -'HttpRequestPool::attach' => ['bool', 'request'=>'HttpRequest'], -'HttpRequestPool::count' => ['int'], -'HttpRequestPool::current' => ['mixed'], -'HttpRequestPool::detach' => ['bool', 'request'=>'HttpRequest'], -'HttpRequestPool::enableEvents' => ['', 'enable'=>''], -'HttpRequestPool::enablePipelining' => ['', 'enable'=>''], -'HttpRequestPool::getAttachedRequests' => ['array'], -'HttpRequestPool::getFinishedRequests' => ['array'], -'HttpRequestPool::key' => ['int|string'], -'HttpRequestPool::next' => ['void'], -'HttpRequestPool::reset' => ['void'], -'HttpRequestPool::rewind' => ['void'], -'HttpRequestPool::send' => ['bool'], -'HttpRequestPool::socketPerform' => ['bool'], -'HttpRequestPool::socketSelect' => ['bool', 'timeout='=>'float'], -'HttpRequestPool::valid' => ['bool'], -'HttpResponse::capture' => ['void'], -'HttpResponse::getBufferSize' => ['int'], -'HttpResponse::getCache' => ['bool'], -'HttpResponse::getCacheControl' => ['string'], -'HttpResponse::getContentDisposition' => ['string'], -'HttpResponse::getContentType' => ['string'], -'HttpResponse::getData' => ['string'], -'HttpResponse::getETag' => ['string'], -'HttpResponse::getFile' => ['string'], -'HttpResponse::getGzip' => ['bool'], -'HttpResponse::getHeader' => ['mixed', 'name='=>'string'], -'HttpResponse::getLastModified' => ['int'], -'HttpResponse::getRequestBody' => ['string'], -'HttpResponse::getRequestBodyStream' => ['resource'], -'HttpResponse::getRequestHeaders' => ['array'], -'HttpResponse::getStream' => ['resource'], -'HttpResponse::getThrottleDelay' => ['float'], -'HttpResponse::guessContentType' => ['string|false', 'magic_file'=>'string', 'magic_mode='=>'int'], -'HttpResponse::redirect' => ['void', 'url='=>'string', 'params='=>'array', 'session='=>'bool', 'status='=>'int'], -'HttpResponse::send' => ['bool', 'clean_ob='=>'bool'], -'HttpResponse::setBufferSize' => ['bool', 'bytes'=>'int'], -'HttpResponse::setCache' => ['bool', 'cache'=>'bool'], -'HttpResponse::setCacheControl' => ['bool', 'control'=>'string', 'max_age='=>'int', 'must_revalidate='=>'bool'], -'HttpResponse::setContentDisposition' => ['bool', 'filename'=>'string', 'inline='=>'bool'], -'HttpResponse::setContentType' => ['bool', 'content_type'=>'string'], -'HttpResponse::setData' => ['bool', 'data'=>'mixed'], -'HttpResponse::setETag' => ['bool', 'etag'=>'string'], -'HttpResponse::setFile' => ['bool', 'file'=>'string'], -'HttpResponse::setGzip' => ['bool', 'gzip'=>'bool'], -'HttpResponse::setHeader' => ['bool', 'name'=>'string', 'value='=>'mixed', 'replace='=>'bool'], -'HttpResponse::setLastModified' => ['bool', 'timestamp'=>'int'], -'HttpResponse::setStream' => ['bool', 'stream'=>'resource'], -'HttpResponse::setThrottleDelay' => ['bool', 'seconds'=>'float'], -'HttpResponse::status' => ['bool', 'status'=>'int'], -'HttpUtil::buildCookie' => ['', 'cookie_array'=>''], -'HttpUtil::buildStr' => ['', 'query'=>'', 'prefix'=>'', 'arg_sep'=>''], -'HttpUtil::buildUrl' => ['', 'url'=>'', 'parts'=>'', 'flags'=>'', '&composed'=>''], -'HttpUtil::chunkedDecode' => ['', 'encoded_string'=>''], -'HttpUtil::date' => ['', 'timestamp'=>''], -'HttpUtil::deflate' => ['', 'plain'=>'', 'flags'=>''], -'HttpUtil::inflate' => ['', 'encoded'=>''], -'HttpUtil::matchEtag' => ['', 'plain_etag'=>'', 'for_range'=>''], -'HttpUtil::matchModified' => ['', 'last_modified'=>'', 'for_range'=>''], -'HttpUtil::matchRequestHeader' => ['', 'header_name'=>'', 'header_value'=>'', 'case_sensitive'=>''], -'HttpUtil::negotiateCharset' => ['', 'supported'=>'', '&result'=>''], -'HttpUtil::negotiateContentType' => ['', 'supported'=>'', '&result'=>''], -'HttpUtil::negotiateLanguage' => ['', 'supported'=>'', '&result'=>''], -'HttpUtil::parseCookie' => ['', 'cookie_string'=>''], -'HttpUtil::parseHeaders' => ['', 'headers_string'=>''], -'HttpUtil::parseMessage' => ['', 'message_string'=>''], -'HttpUtil::parseParams' => ['', 'param_string'=>'', 'flags'=>''], -'HttpUtil::support' => ['', 'feature'=>''], -'hw_api::checkin' => ['bool', 'parameter'=>'array'], -'hw_api::checkout' => ['bool', 'parameter'=>'array'], -'hw_api::children' => ['array', 'parameter'=>'array'], -'hw_api::content' => ['HW_API_Content', 'parameter'=>'array'], -'hw_api::copy' => ['hw_api_content', 'parameter'=>'array'], -'hw_api::dbstat' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::dcstat' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::dstanchors' => ['array', 'parameter'=>'array'], -'hw_api::dstofsrcanchor' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::find' => ['array', 'parameter'=>'array'], -'hw_api::ftstat' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::hwstat' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::identify' => ['bool', 'parameter'=>'array'], -'hw_api::info' => ['array', 'parameter'=>'array'], -'hw_api::insert' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::insertanchor' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::insertcollection' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::insertdocument' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::link' => ['bool', 'parameter'=>'array'], -'hw_api::lock' => ['bool', 'parameter'=>'array'], -'hw_api::move' => ['bool', 'parameter'=>'array'], -'hw_api::object' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::objectbyanchor' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::parents' => ['array', 'parameter'=>'array'], -'hw_api::remove' => ['bool', 'parameter'=>'array'], -'hw_api::replace' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::setcommittedversion' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::srcanchors' => ['array', 'parameter'=>'array'], -'hw_api::srcsofdst' => ['array', 'parameter'=>'array'], -'hw_api::unlock' => ['bool', 'parameter'=>'array'], -'hw_api::user' => ['hw_api_object', 'parameter'=>'array'], -'hw_api::userlist' => ['array', 'parameter'=>'array'], -'hw_api_attribute' => ['HW_API_Attribute', 'name='=>'string', 'value='=>'string'], -'hw_api_attribute::key' => ['string'], -'hw_api_attribute::langdepvalue' => ['string', 'language'=>'string'], -'hw_api_attribute::value' => ['string'], -'hw_api_attribute::values' => ['array'], -'hw_api_content' => ['HW_API_Content', 'content'=>'string', 'mimetype'=>'string'], -'hw_api_content::mimetype' => ['string'], -'hw_api_content::read' => ['string', 'buffer'=>'string', 'length'=>'int'], -'hw_api_error::count' => ['int'], -'hw_api_error::reason' => ['HW_API_Reason'], -'hw_api_object' => ['hw_api_object', 'parameter'=>'array'], -'hw_api_object::assign' => ['bool', 'parameter'=>'array'], -'hw_api_object::attreditable' => ['bool', 'parameter'=>'array'], -'hw_api_object::count' => ['int', 'parameter'=>'array'], -'hw_api_object::insert' => ['bool', 'attribute'=>'hw_api_attribute'], -'hw_api_object::remove' => ['bool', 'name'=>'string'], -'hw_api_object::title' => ['string', 'parameter'=>'array'], -'hw_api_object::value' => ['string', 'name'=>'string'], -'hw_api_reason::description' => ['string'], -'hw_api_reason::type' => ['HW_API_Reason'], -'hw_Array2Objrec' => ['string', 'object_array'=>'array'], -'hw_changeobject' => ['bool', 'link'=>'int', 'objid'=>'int', 'attributes'=>'array'], -'hw_Children' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_ChildrenObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_Close' => ['bool', 'connection'=>'int'], -'hw_Connect' => ['int', 'host'=>'string', 'port'=>'int', 'username='=>'string', 'password='=>'string'], -'hw_connection_info' => ['', 'link'=>'int'], -'hw_cp' => ['int', 'connection'=>'int', 'object_id_array'=>'array', 'destination_id'=>'int'], -'hw_Deleteobject' => ['bool', 'connection'=>'int', 'object_to_delete'=>'int'], -'hw_DocByAnchor' => ['int', 'connection'=>'int', 'anchorid'=>'int'], -'hw_DocByAnchorObj' => ['string', 'connection'=>'int', 'anchorid'=>'int'], -'hw_Document_Attributes' => ['string', 'hw_document'=>'int'], -'hw_Document_BodyTag' => ['string', 'hw_document'=>'int', 'prefix='=>'string'], -'hw_Document_Content' => ['string', 'hw_document'=>'int'], -'hw_Document_SetContent' => ['bool', 'hw_document'=>'int', 'content'=>'string'], -'hw_Document_Size' => ['int', 'hw_document'=>'int'], -'hw_dummy' => ['string', 'link'=>'int', 'id'=>'int', 'msgid'=>'int'], -'hw_EditText' => ['bool', 'connection'=>'int', 'hw_document'=>'int'], -'hw_Error' => ['int', 'connection'=>'int'], -'hw_ErrorMsg' => ['string', 'connection'=>'int'], -'hw_Free_Document' => ['bool', 'hw_document'=>'int'], -'hw_GetAnchors' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_GetAnchorsObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_GetAndLock' => ['string', 'connection'=>'int', 'objectid'=>'int'], -'hw_GetChildColl' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_GetChildCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_GetChildDocColl' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_GetChildDocCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_GetObject' => ['', 'connection'=>'int', 'objectid'=>'', 'query='=>'string'], -'hw_GetObjectByQuery' => ['array', 'connection'=>'int', 'query'=>'string', 'max_hits'=>'int'], -'hw_GetObjectByQueryColl' => ['array', 'connection'=>'int', 'objectid'=>'int', 'query'=>'string', 'max_hits'=>'int'], -'hw_GetObjectByQueryCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int', 'query'=>'string', 'max_hits'=>'int'], -'hw_GetObjectByQueryObj' => ['array', 'connection'=>'int', 'query'=>'string', 'max_hits'=>'int'], -'hw_GetParents' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_GetParentsObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_getrellink' => ['string', 'link'=>'int', 'rootid'=>'int', 'sourceid'=>'int', 'destid'=>'int'], -'hw_GetRemote' => ['int', 'connection'=>'int', 'objectid'=>'int'], -'hw_getremotechildren' => ['', 'connection'=>'int', 'object_record'=>'string'], -'hw_GetSrcByDestObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], -'hw_GetText' => ['int', 'connection'=>'int', 'objectid'=>'int', 'prefix='=>''], -'hw_getusername' => ['string', 'connection'=>'int'], -'hw_Identify' => ['string', 'link'=>'int', 'username'=>'string', 'password'=>'string'], -'hw_InCollections' => ['array', 'connection'=>'int', 'object_id_array'=>'array', 'collection_id_array'=>'array', 'return_collections'=>'int'], -'hw_Info' => ['string', 'connection'=>'int'], -'hw_InsColl' => ['int', 'connection'=>'int', 'objectid'=>'int', 'object_array'=>'array'], -'hw_InsDoc' => ['int', 'connection'=>'', 'parentid'=>'int', 'object_record'=>'string', 'text='=>'string'], -'hw_insertanchors' => ['bool', 'hwdoc'=>'int', 'anchorecs'=>'array', 'dest'=>'array', 'urlprefixes='=>'array'], -'hw_InsertDocument' => ['int', 'connection'=>'int', 'parent_id'=>'int', 'hw_document'=>'int'], -'hw_InsertObject' => ['int', 'connection'=>'int', 'object_rec'=>'string', 'parameter'=>'string'], -'hw_mapid' => ['int', 'connection'=>'int', 'server_id'=>'int', 'object_id'=>'int'], -'hw_Modifyobject' => ['bool', 'connection'=>'int', 'object_to_change'=>'int', 'remove'=>'array', 'add'=>'array', 'mode='=>'int'], -'hw_mv' => ['int', 'connection'=>'int', 'object_id_array'=>'array', 'source_id'=>'int', 'destination_id'=>'int'], -'hw_New_Document' => ['int', 'object_record'=>'string', 'document_data'=>'string', 'document_size'=>'int'], -'hw_objrec2array' => ['array', 'object_record'=>'string', 'format='=>'array'], -'hw_Output_Document' => ['bool', 'hw_document'=>'int'], -'hw_pConnect' => ['int', 'host'=>'string', 'port'=>'int', 'username='=>'string', 'password='=>'string'], -'hw_PipeDocument' => ['int', 'connection'=>'int', 'objectid'=>'int', 'url_prefixes='=>'array'], -'hw_Root' => ['int'], -'hw_setlinkroot' => ['int', 'link'=>'int', 'rootid'=>'int'], -'hw_stat' => ['string', 'link'=>'int'], -'hw_Unlock' => ['bool', 'connection'=>'int', 'objectid'=>'int'], -'hw_Who' => ['array', 'connection'=>'int'], -'hwapi_attribute_new' => ['HW_API_Attribute', 'name='=>'string', 'value='=>'string'], -'hwapi_content_new' => ['HW_API_Content', 'content'=>'string', 'mimetype'=>'string'], -'hwapi_hgcsp' => ['HW_API', 'hostname'=>'string', 'port='=>'int'], -'hwapi_object_new' => ['hw_api_object', 'parameter'=>'array'], -'hypot' => ['float', 'x'=>'float', 'y'=>'float'], -'ibase_add_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password'=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], -'ibase_affected_rows' => ['int', 'link_identifier='=>'resource'], -'ibase_backup' => ['mixed', 'service_handle'=>'resource', 'source_db'=>'string', 'dest_file'=>'string', 'options='=>'int', 'verbose='=>'bool'], -'ibase_blob_add' => ['void', 'blob_handle'=>'resource', 'data'=>'string'], -'ibase_blob_cancel' => ['bool', 'blob_handle'=>'resource'], -'ibase_blob_close' => ['string|bool', 'blob_handle'=>'resource'], -'ibase_blob_create' => ['resource', 'link_identifier='=>'resource'], -'ibase_blob_echo' => ['bool', 'link_identifier'=>'', 'blob_id'=>'string'], -'ibase_blob_echo\'1' => ['bool', 'blob_id'=>'string'], -'ibase_blob_get' => ['string|false', 'blob_handle'=>'resource', 'length'=>'int'], -'ibase_blob_import' => ['string|false', 'link_identifier'=>'resource', 'file_handle'=>'resource'], -'ibase_blob_info' => ['array', 'link_identifier'=>'resource', 'blob_id'=>'string'], -'ibase_blob_info\'1' => ['array', 'blob_id'=>'string'], -'ibase_blob_open' => ['resource|false', 'link_identifier'=>'', 'blob_id'=>'string'], -'ibase_blob_open\'1' => ['resource', 'blob_id'=>'string'], -'ibase_close' => ['bool', 'link_identifier='=>'resource'], -'ibase_commit' => ['bool', 'link_identifier='=>'resource'], -'ibase_commit_ret' => ['bool', 'link_identifier='=>'resource'], -'ibase_connect' => ['resource|false', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'buffers='=>'int', 'dialect='=>'int', 'role='=>'string'], -'ibase_db_info' => ['string', 'service_handle'=>'resource', 'db'=>'string', 'action'=>'int', 'argument='=>'int'], -'ibase_delete_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password='=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], -'ibase_drop_db' => ['bool', 'link_identifier='=>'resource'], -'ibase_errcode' => ['int|false'], -'ibase_errmsg' => ['string|false'], -'ibase_execute' => ['resource|false', 'query'=>'resource', 'bind_arg='=>'mixed', '...args='=>'mixed'], -'ibase_fetch_assoc' => ['array|false', 'result'=>'resource', 'fetch_flags='=>'int'], -'ibase_fetch_object' => ['object|false', 'result'=>'resource', 'fetch_flags='=>'int'], -'ibase_fetch_row' => ['array|false', 'result'=>'resource', 'fetch_flags='=>'int'], -'ibase_field_info' => ['array', 'query_result'=>'resource', 'field_number'=>'int'], -'ibase_free_event_handler' => ['bool', 'event'=>'resource'], -'ibase_free_query' => ['bool', 'query'=>'resource'], -'ibase_free_result' => ['bool', 'result'=>'resource'], -'ibase_gen_id' => ['int|string', 'generator'=>'string', 'increment='=>'int', 'link_identifier='=>'resource'], -'ibase_maintain_db' => ['bool', 'service_handle'=>'resource', 'db'=>'string', 'action'=>'int', 'argument='=>'int'], -'ibase_modify_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password'=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], -'ibase_name_result' => ['bool', 'result'=>'resource', 'name'=>'string'], -'ibase_num_fields' => ['int', 'query_result'=>'resource'], -'ibase_num_params' => ['int', 'query'=>'resource'], -'ibase_num_rows' => ['int', 'result_identifier'=>''], -'ibase_param_info' => ['array', 'query'=>'resource', 'field_number'=>'int'], -'ibase_pconnect' => ['resource|false', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'buffers='=>'int', 'dialect='=>'int', 'role='=>'string'], -'ibase_prepare' => ['resource|false', 'link_identifier'=>'', 'query'=>'string', 'trans_identifier'=>''], -'ibase_query' => ['resource|false', 'link_identifier='=>'resource', 'string='=>'string', 'bind_arg='=>'int', '...args='=>''], -'ibase_restore' => ['mixed', 'service_handle'=>'resource', 'source_file'=>'string', 'dest_db'=>'string', 'options='=>'int', 'verbose='=>'bool'], -'ibase_rollback' => ['bool', 'link_identifier='=>'resource'], -'ibase_rollback_ret' => ['bool', 'link_identifier='=>'resource'], -'ibase_server_info' => ['string', 'service_handle'=>'resource', 'action'=>'int'], -'ibase_service_attach' => ['resource', 'host'=>'string', 'dba_username'=>'string', 'dba_password'=>'string'], -'ibase_service_detach' => ['bool', 'service_handle'=>'resource'], -'ibase_set_event_handler' => ['resource', 'link_identifier'=>'', 'callback'=>'callable', 'event='=>'string', '...args='=>''], -'ibase_set_event_handler\'1' => ['resource', 'callback'=>'callable', 'event'=>'string', '...args'=>''], -'ibase_timefmt' => ['bool', 'format'=>'string', 'columntype='=>'int'], -'ibase_trans' => ['resource|false', 'trans_args='=>'int', 'link_identifier='=>'', '...args='=>''], -'ibase_wait_event' => ['string', 'link_identifier'=>'', 'event='=>'string', '...args='=>''], -'ibase_wait_event\'1' => ['string', 'event'=>'string', '...args'=>''], -'iconv' => ['string|false', 'from_encoding'=>'string', 'to_encoding'=>'string', 'string'=>'string'], -'iconv_get_encoding' => ['mixed', 'type='=>'string'], -'iconv_mime_decode' => ['string|false', 'string'=>'string', 'mode='=>'int', 'encoding='=>'string'], -'iconv_mime_decode_headers' => ['array|false', 'headers'=>'string', 'mode='=>'int', 'encoding='=>'string'], -'iconv_mime_encode' => ['string|false', 'field_name'=>'string', 'field_value'=>'string', 'options='=>'array'], -'iconv_set_encoding' => ['bool', 'type'=>'string', 'encoding'=>'string'], -'iconv_strlen' => ['0|positive-int|false', 'string'=>'string', 'encoding='=>'string'], -'iconv_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], -'iconv_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'], -'iconv_substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int', 'encoding='=>'string'], -'id3_get_frame_long_name' => ['string', 'frameid'=>'string'], -'id3_get_frame_short_name' => ['string', 'frameid'=>'string'], -'id3_get_genre_id' => ['int', 'genre'=>'string'], -'id3_get_genre_list' => ['array'], -'id3_get_genre_name' => ['string', 'genre_id'=>'int'], -'id3_get_tag' => ['array', 'filename'=>'string', 'version='=>'int'], -'id3_get_version' => ['int', 'filename'=>'string'], -'id3_remove_tag' => ['bool', 'filename'=>'string', 'version='=>'int'], -'id3_set_tag' => ['bool', 'filename'=>'string', 'tag'=>'array', 'version='=>'int'], -'idate' => ['int', 'format'=>'string', 'timestamp='=>'int'], -'idn_strerror' => ['string', 'errorcode'=>'int'], -'idn_to_ascii' => ['string|false', 'domain'=>'string', 'flags='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'], -'idn_to_utf8' => ['string|false', 'domain'=>'string', 'flags='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'], -'ifx_affected_rows' => ['int', 'result_id'=>'resource'], -'ifx_blobinfile_mode' => ['bool', 'mode'=>'int'], -'ifx_byteasvarchar' => ['bool', 'mode'=>'int'], -'ifx_close' => ['bool', 'link_identifier='=>'resource'], -'ifx_connect' => ['resource', 'database='=>'string', 'userid='=>'string', 'password='=>'string'], -'ifx_copy_blob' => ['int', 'bid'=>'int'], -'ifx_create_blob' => ['int', 'type'=>'int', 'mode'=>'int', 'param'=>'string'], -'ifx_create_char' => ['int', 'param'=>'string'], -'ifx_do' => ['bool', 'result_id'=>'resource'], -'ifx_error' => ['string', 'link_identifier='=>'resource'], -'ifx_errormsg' => ['string', 'errorcode='=>'int'], -'ifx_fetch_row' => ['array', 'result_id'=>'resource', 'position='=>'mixed'], -'ifx_fieldproperties' => ['array', 'result_id'=>'resource'], -'ifx_fieldtypes' => ['array', 'result_id'=>'resource'], -'ifx_free_blob' => ['bool', 'bid'=>'int'], -'ifx_free_char' => ['bool', 'bid'=>'int'], -'ifx_free_result' => ['bool', 'result_id'=>'resource'], -'ifx_get_blob' => ['string', 'bid'=>'int'], -'ifx_get_char' => ['string', 'bid'=>'int'], -'ifx_getsqlca' => ['array', 'result_id'=>'resource'], -'ifx_htmltbl_result' => ['int', 'result_id'=>'resource', 'html_table_options='=>'string'], -'ifx_nullformat' => ['bool', 'mode'=>'int'], -'ifx_num_fields' => ['int', 'result_id'=>'resource'], -'ifx_num_rows' => ['int', 'result_id'=>'resource'], -'ifx_pconnect' => ['resource', 'database='=>'string', 'userid='=>'string', 'password='=>'string'], -'ifx_prepare' => ['resource', 'query'=>'string', 'link_identifier'=>'resource', 'cursor_def='=>'int', 'blobidarray='=>'mixed'], -'ifx_query' => ['resource', 'query'=>'string', 'link_identifier'=>'resource', 'cursor_type='=>'int', 'blobidarray='=>'mixed'], -'ifx_textasvarchar' => ['bool', 'mode'=>'int'], -'ifx_update_blob' => ['bool', 'bid'=>'int', 'content'=>'string'], -'ifx_update_char' => ['bool', 'bid'=>'int', 'content'=>'string'], -'ifxus_close_slob' => ['bool', 'bid'=>'int'], -'ifxus_create_slob' => ['int', 'mode'=>'int'], -'ifxus_free_slob' => ['bool', 'bid'=>'int'], -'ifxus_open_slob' => ['int', 'bid'=>'int', 'mode'=>'int'], -'ifxus_read_slob' => ['string', 'bid'=>'int', 'nbytes'=>'int'], -'ifxus_seek_slob' => ['int', 'bid'=>'int', 'mode'=>'int', 'offset'=>'int'], -'ifxus_tell_slob' => ['int', 'bid'=>'int'], -'ifxus_write_slob' => ['int', 'bid'=>'int', 'content'=>'string'], -'igbinary_serialize' => ['string|false', 'value'=>'mixed'], -'igbinary_unserialize' => ['mixed', 'string'=>'string'], -'ignore_user_abort' => ['int', 'enable='=>'bool'], -'iis_add_server' => ['int', 'path'=>'string', 'comment'=>'string', 'server_ip'=>'string', 'port'=>'int', 'host_name'=>'string', 'rights'=>'int', 'start_server'=>'int'], -'iis_get_dir_security' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string'], -'iis_get_script_map' => ['string', 'server_instance'=>'int', 'virtual_path'=>'string', 'script_extension'=>'string'], -'iis_get_server_by_comment' => ['int', 'comment'=>'string'], -'iis_get_server_by_path' => ['int', 'path'=>'string'], -'iis_get_server_rights' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string'], -'iis_get_service_state' => ['int', 'service_id'=>'string'], -'iis_remove_server' => ['int', 'server_instance'=>'int'], -'iis_set_app_settings' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'application_scope'=>'string'], -'iis_set_dir_security' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'directory_flags'=>'int'], -'iis_set_script_map' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'script_extension'=>'string', 'engine_path'=>'string', 'allow_scripting'=>'int'], -'iis_set_server_rights' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'directory_flags'=>'int'], -'iis_start_server' => ['int', 'server_instance'=>'int'], -'iis_start_service' => ['int', 'service_id'=>'string'], -'iis_stop_server' => ['int', 'server_instance'=>'int'], -'iis_stop_service' => ['int', 'service_id'=>'string'], -'image_type_to_extension' => ['string', 'image_type'=>'int', 'include_dot='=>'bool'], -'image_type_to_mime_type' => ['string', 'image_type'=>'int'], -'imageaffine' => ['false|GdImage', 'image'=>'GdImage', 'affine'=>'array', 'clip='=>'?array'], -'imageaffinematrixconcat' => ['array{0:float,1:float,2:float,3:float,4:float,5:float}|false', 'matrix1'=>'array', 'matrix2'=>'array'], -'imageaffinematrixget' => ['array{0:float,1:float,2:float,3:float,4:float,5:float}|false', 'type'=>'int', 'options'=>'array|float'], -'imagealphablending' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], -'imageantialias' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], -'imagearc' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int'], -'imageavif' => ['bool', 'image'=>'GdImage', 'file='=>'resource|string|null', 'quality='=>'int', 'speed='=>'int'], -'imagebmp' => ['bool', 'image'=>'GdImage', 'file='=>'resource|string|null', 'compressed='=>'bool'], -'imagechar' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], -'imagecharup' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], -'imagecolorallocate' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'imagecolorallocatealpha' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], -'imagecolorat' => ['int|false', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int'], -'imagecolorclosest' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'imagecolorclosestalpha' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], -'imagecolorclosesthwb' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'imagecolordeallocate' => ['bool', 'image'=>'GdImage', 'color'=>'int'], -'imagecolorexact' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'imagecolorexactalpha' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], -'imagecolormatch' => ['bool', 'image1'=>'GdImage', 'image2'=>'GdImage'], -'imagecolorresolve' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'imagecolorresolvealpha' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], -'imagecolorset' => ['void', 'image'=>'GdImage', 'color'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], -'imagecolorsforindex' => ['array|false', 'image'=>'GdImage', 'color'=>'int'], -'imagecolorstotal' => ['int|false', 'image'=>'GdImage'], -'imagecolortransparent' => ['int|false', 'image'=>'GdImage', 'color='=>'int'], -'imageconvolution' => ['bool', 'image'=>'GdImage', 'matrix'=>'array', 'divisor'=>'float', 'offset'=>'float'], -'imagecopy' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int'], -'imagecopymerge' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], -'imagecopymergegray' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], -'imagecopyresampled' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], -'imagecopyresized' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], -'imagecreate' => ['false|GdImage', 'width'=>'int', 'height'=>'int'], -'imagecreatefromavif' => ['false|GdImage', 'filename'=>'string'], -'imagecreatefrombmp' => ['false|GdImage', 'filename'=>'string'], -'imagecreatefromgd' => ['false|GdImage', 'filename'=>'string'], -'imagecreatefromgd2' => ['false|GdImage', 'filename'=>'string'], -'imagecreatefromgd2part' => ['false|GdImage', 'filename'=>'string', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int'], -'imagecreatefromgif' => ['false|GdImage', 'filename'=>'string'], -'imagecreatefromjpeg' => ['false|GdImage', 'filename'=>'string'], -'imagecreatefrompng' => ['false|GdImage', 'filename'=>'string'], -'imagecreatefromstring' => ['false|GdImage', 'data'=>'string'], -'imagecreatefromwbmp' => ['false|GdImage', 'filename'=>'string'], -'imagecreatefromwebp' => ['false|GdImage', 'filename'=>'string'], -'imagecreatefromxbm' => ['false|GdImage', 'filename'=>'string'], -'imagecreatefromxpm' => ['false|GdImage', 'filename'=>'string'], -'imagecreatetruecolor' => ['false|GdImage', 'width'=>'int', 'height'=>'int'], -'imagecrop' => ['false|GdImage', 'image'=>'GdImage', 'rectangle'=>'array'], -'imagecropauto' => ['false|GdImage', 'image'=>'GdImage', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'], -'imagedashedline' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], -'imagedestroy' => ['bool', 'image'=>'GdImage'], -'imageellipse' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], -'imagefill' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'color'=>'int'], -'imagefilledarc' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int', 'style'=>'int'], -'imagefilledellipse' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], -'imagefilledpolygon' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], -'imagefilledrectangle' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], -'imagefilltoborder' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'border_color'=>'int', 'color'=>'int'], -'imagefilter' => ['bool', 'image'=>'GdImage', 'filter'=>'int', 'args='=>'int', 'arg2='=>'int', 'arg3='=>'int', 'arg4='=>'int'], -'imageflip' => ['bool', 'image'=>'GdImage', 'mode'=>'int'], -'imagefontheight' => ['int', 'font'=>'int'], -'imagefontwidth' => ['int', 'font'=>'int'], -'imageftbbox' => ['array|false', 'size'=>'float', 'angle'=>'float', 'font_filename'=>'string', 'string'=>'string', 'options='=>'array'], -'imagefttext' => ['array|false', 'image'=>'GdImage', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string', 'options='=>'array'], -'imagegammacorrect' => ['bool', 'image'=>'GdImage', 'input_gamma'=>'float', 'output_gamma'=>'float'], -'imagegd' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null'], -'imagegd2' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'chunk_size='=>'int', 'mode='=>'int'], -'imagegetclip' => ['array', 'image'=>'GdImage'], -'imagegetinterpolation' => ['int', 'image'=>'GdImage'], -'imagegif' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null'], -'imagegrabscreen' => ['false|GdImage'], -'imagegrabwindow' => ['false|GdImage', 'handle'=>'int', 'client_area='=>'int'], -'imageinterlace' => ['int|false', 'image'=>'GdImage', 'enable='=>'int'], -'imageistruecolor' => ['bool', 'image'=>'GdImage'], -'imagejpeg' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int'], -'imagelayereffect' => ['bool', 'image'=>'GdImage', 'effect'=>'int'], -'imageline' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], -'imageloadfont' => ['int|false', 'filename'=>'string'], -'imageObj::pasteImage' => ['void', 'srcImg'=>'imageObj', 'transparentColorHex'=>'int', 'dstX'=>'int', 'dstY'=>'int', 'angle'=>'int'], -'imageObj::saveImage' => ['int', 'filename'=>'string', 'oMap'=>'mapObj'], -'imageObj::saveWebImage' => ['string'], -'imageopenpolygon' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'], -'imagepalettecopy' => ['void', 'dst'=>'GdImage', 'src'=>'GdImage'], -'imagepalettetotruecolor' => ['bool', 'image'=>'GdImage'], -'imagepng' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int', 'filters='=>'int'], -'imagepolygon' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], -'imagerectangle' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], -'imageresolution' => ['array|bool', 'image'=>'GdImage', 'resolution_x='=>'int', 'resolution_y='=>'int'], -'imagerotate' => ['false|GdImage', 'image'=>'GdImage', 'angle'=>'float', 'background_color'=>'int', 'ignore_transparent='=>'int'], -'imagesavealpha' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], -'imagescale' => ['false|GdImage', 'image'=>'GdImage', 'width'=>'int', 'height='=>'int', 'mode='=>'int'], -'imagesetbrush' => ['bool', 'image'=>'GdImage', 'brush'=>'GdImage'], -'imagesetclip' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'x2'=>'int', 'y1'=>'int', 'y2'=>'int'], -'imagesetinterpolation' => ['bool', 'image'=>'GdImage', 'method'=>'int'], -'imagesetpixel' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'color'=>'int'], -'imagesetstyle' => ['bool', 'image'=>'GdImage', 'style'=>'non-empty-array'], -'imagesetthickness' => ['bool', 'image'=>'GdImage', 'thickness'=>'int'], -'imagesettile' => ['bool', 'image'=>'GdImage', 'tile'=>'GdImage'], -'imagestring' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], -'imagestringup' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], -'imagesx' => ['int|false', 'image'=>'GdImage'], -'imagesy' => ['int|false', 'image'=>'GdImage'], -'imagetruecolortopalette' => ['bool', 'image'=>'GdImage', 'dither'=>'bool', 'num_colors'=>'int'], -'imagettfbbox' => ['false|array', 'size'=>'float', 'angle'=>'float', 'font_filename'=>'string', 'string'=>'string'], -'imagettftext' => ['false|array', 'image'=>'GdImage', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string'], -'imagetypes' => ['int'], -'imagewbmp' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'foreground_color='=>'int'], -'imagewebp' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int'], -'imagexbm' => ['bool', 'image'=>'GdImage', 'filename='=>'?string', 'foreground_color='=>'int'], -'Imagick::__construct' => ['void', 'files='=>'string|string[]'], -'Imagick::__toString' => ['string'], -'Imagick::adaptiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], -'Imagick::adaptiveResizeImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool'], -'Imagick::adaptiveSharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], -'Imagick::adaptiveThresholdImage' => ['bool', 'width'=>'int', 'height'=>'int', 'offset'=>'int'], -'Imagick::addImage' => ['bool', 'source'=>'Imagick'], -'Imagick::addNoiseImage' => ['bool', 'noise_type'=>'int', 'channel='=>'int'], -'Imagick::affineTransformImage' => ['bool', 'matrix'=>'ImagickDraw'], -'Imagick::animateImages' => ['bool', 'x_server'=>'string'], -'Imagick::annotateImage' => ['bool', 'draw_settings'=>'ImagickDraw', 'x'=>'float', 'y'=>'float', 'angle'=>'float', 'text'=>'string'], -'Imagick::appendImages' => ['Imagick', 'stack'=>'bool'], -'Imagick::autoGammaImage' => ['bool', 'channel='=>'int'], -'Imagick::autoLevelImage' => ['void', 'CHANNEL='=>'string'], -'Imagick::autoOrient' => ['bool'], -'Imagick::averageImages' => ['Imagick'], -'Imagick::blackThresholdImage' => ['bool', 'threshold'=>'mixed'], -'Imagick::blueShiftImage' => ['void', 'factor='=>'float'], -'Imagick::blurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], -'Imagick::borderImage' => ['bool', 'bordercolor'=>'mixed', 'width'=>'int', 'height'=>'int'], -'Imagick::brightnessContrastImage' => ['void', 'brightness'=>'string', 'contrast'=>'string', 'CHANNEL='=>'string'], -'Imagick::charcoalImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'], -'Imagick::chopImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], -'Imagick::clampImage' => ['void', 'CHANNEL='=>'string'], -'Imagick::clear' => ['bool'], -'Imagick::clipImage' => ['bool'], -'Imagick::clipImagePath' => ['void', 'pathname'=>'string', 'inside'=>'string'], -'Imagick::clipPathImage' => ['bool', 'pathname'=>'string', 'inside'=>'bool'], -'Imagick::clone' => ['Imagick'], -'Imagick::clutImage' => ['bool', 'lookup_table'=>'Imagick', 'channel='=>'float'], -'Imagick::coalesceImages' => ['Imagick'], -'Imagick::colorFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'], -'Imagick::colorizeImage' => ['bool', 'colorize'=>'mixed', 'opacity'=>'mixed'], -'Imagick::colorMatrixImage' => ['void', 'color_matrix'=>'string'], -'Imagick::combineImages' => ['Imagick', 'channeltype'=>'int'], -'Imagick::commentImage' => ['bool', 'comment'=>'string'], -'Imagick::compareImageChannels' => ['array{Imagick, float}', 'image'=>'Imagick', 'channeltype'=>'int', 'metrictype'=>'int'], -'Imagick::compareImageLayers' => ['Imagick', 'method'=>'int'], -'Imagick::compareImages' => ['array{Imagick, float}', 'compare'=>'Imagick', 'metric'=>'int'], -'Imagick::compositeImage' => ['bool', 'composite_object'=>'Imagick', 'composite'=>'int', 'x'=>'int', 'y'=>'int', 'channel='=>'int'], -'Imagick::compositeImageGravity' => ['bool', 'Imagick'=>'Imagick', 'COMPOSITE_CONSTANT'=>'int', 'GRAVITY_CONSTANT'=>'int'], -'Imagick::contrastImage' => ['bool', 'sharpen'=>'bool'], -'Imagick::contrastStretchImage' => ['bool', 'black_point'=>'float', 'white_point'=>'float', 'channel='=>'int'], -'Imagick::convolveImage' => ['bool', 'kernel'=>'array', 'channel='=>'int'], -'Imagick::count' => ['void', 'mode='=>'string'], -'Imagick::cropImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], -'Imagick::cropThumbnailImage' => ['bool', 'width'=>'int', 'height'=>'int', 'legacy='=>'bool'], -'Imagick::current' => ['Imagick'], -'Imagick::cycleColormapImage' => ['bool', 'displace'=>'int'], -'Imagick::decipherImage' => ['bool', 'passphrase'=>'string'], -'Imagick::deconstructImages' => ['Imagick'], -'Imagick::deleteImageArtifact' => ['bool', 'artifact'=>'string'], -'Imagick::deleteImageProperty' => ['void', 'name'=>'string'], -'Imagick::deskewImage' => ['bool', 'threshold'=>'float'], -'Imagick::despeckleImage' => ['bool'], -'Imagick::destroy' => ['bool'], -'Imagick::displayImage' => ['bool', 'servername'=>'string'], -'Imagick::displayImages' => ['bool', 'servername'=>'string'], -'Imagick::distortImage' => ['bool', 'method'=>'int', 'arguments'=>'array', 'bestfit'=>'bool'], -'Imagick::drawImage' => ['bool', 'draw'=>'ImagickDraw'], -'Imagick::edgeImage' => ['bool', 'radius'=>'float'], -'Imagick::embossImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'], -'Imagick::encipherImage' => ['bool', 'passphrase'=>'string'], -'Imagick::enhanceImage' => ['bool'], -'Imagick::equalizeImage' => ['bool'], -'Imagick::evaluateImage' => ['bool', 'op'=>'int', 'constant'=>'float', 'channel='=>'int'], -'Imagick::evaluateImages' => ['bool', 'EVALUATE_CONSTANT'=>'int'], -'Imagick::exportImagePixels' => ['list', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int'], -'Imagick::extentImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], -'Imagick::filter' => ['void', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'int'], -'Imagick::flattenImages' => ['Imagick'], -'Imagick::flipImage' => ['bool'], -'Imagick::floodFillPaintImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'target'=>'mixed', 'x'=>'int', 'y'=>'int', 'invert'=>'bool', 'channel='=>'int'], -'Imagick::flopImage' => ['bool'], -'Imagick::forwardFourierTransformimage' => ['void', 'magnitude'=>'bool'], -'Imagick::frameImage' => ['bool', 'matte_color'=>'mixed', 'width'=>'int', 'height'=>'int', 'inner_bevel'=>'int', 'outer_bevel'=>'int'], -'Imagick::functionImage' => ['bool', 'function'=>'int', 'arguments'=>'array', 'channel='=>'int'], -'Imagick::fxImage' => ['Imagick', 'expression'=>'string', 'channel='=>'int'], -'Imagick::gammaImage' => ['bool', 'gamma'=>'float', 'channel='=>'int'], -'Imagick::gaussianBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], -'Imagick::getColorspace' => ['int'], -'Imagick::getCompression' => ['int'], -'Imagick::getCompressionQuality' => ['int'], -'Imagick::getConfigureOptions' => ['string'], -'Imagick::getCopyright' => ['string'], -'Imagick::getFeatures' => ['string'], -'Imagick::getFilename' => ['string'], -'Imagick::getFont' => ['string|false'], -'Imagick::getFormat' => ['string'], -'Imagick::getGravity' => ['int'], -'Imagick::getHDRIEnabled' => ['int'], -'Imagick::getHomeURL' => ['string'], -'Imagick::getImage' => ['Imagick'], -'Imagick::getImageAlphaChannel' => ['int'], -'Imagick::getImageArtifact' => ['string', 'artifact'=>'string'], -'Imagick::getImageAttribute' => ['string', 'key'=>'string'], -'Imagick::getImageBackgroundColor' => ['ImagickPixel'], -'Imagick::getImageBlob' => ['string'], -'Imagick::getImageBluePrimary' => ['array{x:float, y:float}'], -'Imagick::getImageBorderColor' => ['ImagickPixel'], -'Imagick::getImageChannelDepth' => ['int', 'channel'=>'int'], -'Imagick::getImageChannelDistortion' => ['float', 'reference'=>'Imagick', 'channel'=>'int', 'metric'=>'int'], -'Imagick::getImageChannelDistortions' => ['float', 'reference'=>'Imagick', 'metric'=>'int', 'channel='=>'int'], -'Imagick::getImageChannelExtrema' => ['array{minima:int, maxima:int}', 'channel'=>'int'], -'Imagick::getImageChannelKurtosis' => ['array{kurtosis:float, skewness:float}', 'channel='=>'int'], -'Imagick::getImageChannelMean' => ['array{mean:float, standardDeviation:float}', 'channel'=>'int'], -'Imagick::getImageChannelRange' => ['array{minima:float, maxima:float}', 'channel'=>'int'], -'Imagick::getImageChannelStatistics' => ['array'], -'Imagick::getImageClipMask' => ['Imagick'], -'Imagick::getImageColormapColor' => ['ImagickPixel', 'index'=>'int'], -'Imagick::getImageColors' => ['int'], -'Imagick::getImageColorspace' => ['int'], -'Imagick::getImageCompose' => ['int'], -'Imagick::getImageCompression' => ['int'], -'Imagick::getImageCompressionQuality' => ['int'], -'Imagick::getImageDelay' => ['int'], -'Imagick::getImageDepth' => ['int'], -'Imagick::getImageDispose' => ['int'], -'Imagick::getImageDistortion' => ['float', 'reference'=>'magickwand', 'metric'=>'int'], -'Imagick::getImageExtrema' => ['array{min:int, max:int}'], -'Imagick::getImageFilename' => ['string'], -'Imagick::getImageFormat' => ['string'], -'Imagick::getImageGamma' => ['float'], -'Imagick::getImageGeometry' => ['array{width:int, height:int}'], -'Imagick::getImageGravity' => ['int'], -'Imagick::getImageGreenPrimary' => ['array{x:float, y:float}'], -'Imagick::getImageHeight' => ['int'], -'Imagick::getImageHistogram' => ['list'], -'Imagick::getImageIndex' => ['int'], -'Imagick::getImageInterlaceScheme' => ['int'], -'Imagick::getImageInterpolateMethod' => ['int'], -'Imagick::getImageIterations' => ['int'], -'Imagick::getImageLength' => ['int'], -'Imagick::getImageMagickLicense' => ['string'], -'Imagick::getImageMatte' => ['bool'], -'Imagick::getImageMatteColor' => ['ImagickPixel'], -'Imagick::getImageMimeType' => ['string'], -'Imagick::getImageOrientation' => ['int'], -'Imagick::getImagePage' => ['array{width:int, height:int, x:int, y:int}'], -'Imagick::getImagePixelColor' => ['ImagickPixel', 'x'=>'int', 'y'=>'int'], -'Imagick::getImageProfile' => ['string', 'name'=>'string'], -'Imagick::getImageProfiles' => ['array', 'pattern='=>'string', 'only_names='=>'bool'], -'Imagick::getImageProperties' => ['array', 'pattern='=>'string', 'only_names='=>'bool'], -'Imagick::getImageProperty' => ['string|false', 'name'=>'string'], -'Imagick::getImageRedPrimary' => ['array{x:float, y:float}'], -'Imagick::getImageRegion' => ['Imagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], -'Imagick::getImageRenderingIntent' => ['int'], -'Imagick::getImageResolution' => ['array{x:float, y:float}'], -'Imagick::getImagesBlob' => ['string'], -'Imagick::getImageScene' => ['int'], -'Imagick::getImageSignature' => ['string'], -'Imagick::getImageSize' => ['int'], -'Imagick::getImageTicksPerSecond' => ['int'], -'Imagick::getImageTotalInkDensity' => ['float'], -'Imagick::getImageType' => ['int'], -'Imagick::getImageUnits' => ['int'], -'Imagick::getImageVirtualPixelMethod' => ['int'], -'Imagick::getImageWhitePoint' => ['array{x:float, y:float}'], -'Imagick::getImageWidth' => ['int'], -'Imagick::getInterlaceScheme' => ['int'], -'Imagick::getIteratorIndex' => ['int'], -'Imagick::getNumberImages' => ['int'], -'Imagick::getOption' => ['string', 'key'=>'string'], -'Imagick::getPackageName' => ['string'], -'Imagick::getPage' => ['array{width:int, height:int, x:int, y:int}'], -'Imagick::getPixelIterator' => ['ImagickPixelIterator'], -'Imagick::getPixelRegionIterator' => ['ImagickPixelIterator', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'], -'Imagick::getPointSize' => ['float'], -'Imagick::getQuantum' => ['int'], -'Imagick::getQuantumDepth' => ['array{quantumDepthLong:int, quantumDepthString:string}'], -'Imagick::getQuantumRange' => ['array{quantumRangeLong:int, quantumRangeString:string}'], -'Imagick::getRegistry' => ['string|false', 'key'=>'string'], -'Imagick::getReleaseDate' => ['string'], -'Imagick::getResource' => ['int', 'type'=>'int'], -'Imagick::getResourceLimit' => ['int', 'type'=>'int'], -'Imagick::getSamplingFactors' => ['array'], -'Imagick::getSize' => ['array{columns:int, rows: int}'], -'Imagick::getSizeOffset' => ['int'], -'Imagick::getVersion' => ['array{versionNumber: int, versionString:string}'], -'Imagick::haldClutImage' => ['bool', 'clut'=>'Imagick', 'channel='=>'int'], -'Imagick::hasNextImage' => ['bool'], -'Imagick::hasPreviousImage' => ['bool'], -'Imagick::identifyFormat' => ['string|false', 'embedText'=>'string'], -'Imagick::identifyImage' => ['array', 'appendrawoutput='=>'bool'], -'Imagick::identifyImageType' => ['int'], -'Imagick::implodeImage' => ['bool', 'radius'=>'float'], -'Imagick::importImagePixels' => ['bool', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int', 'pixels'=>'list'], -'Imagick::inverseFourierTransformImage' => ['void', 'complement'=>'string', 'magnitude'=>'string'], -'Imagick::key' => ['int|string'], -'Imagick::labelImage' => ['bool', 'label'=>'string'], -'Imagick::levelImage' => ['bool', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'int'], -'Imagick::linearStretchImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float'], -'Imagick::liquidRescaleImage' => ['bool', 'width'=>'int', 'height'=>'int', 'delta_x'=>'float', 'rigidity'=>'float'], -'Imagick::listRegistry' => ['array'], -'Imagick::localContrastImage' => ['bool', 'radius'=>'float', 'strength'=>'float'], -'Imagick::magnifyImage' => ['bool'], -'Imagick::mapImage' => ['bool', 'map'=>'Imagick', 'dither'=>'bool'], -'Imagick::matteFloodfillImage' => ['bool', 'alpha'=>'float', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'], -'Imagick::medianFilterImage' => ['bool', 'radius'=>'float'], -'Imagick::mergeImageLayers' => ['Imagick', 'layer_method'=>'int'], -'Imagick::minifyImage' => ['bool'], -'Imagick::modulateImage' => ['bool', 'brightness'=>'float', 'saturation'=>'float', 'hue'=>'float'], -'Imagick::montageImage' => ['Imagick', 'draw'=>'ImagickDraw', 'tile_geometry'=>'string', 'thumbnail_geometry'=>'string', 'mode'=>'int', 'frame'=>'string'], -'Imagick::morphImages' => ['Imagick', 'number_frames'=>'int'], -'Imagick::morphology' => ['void', 'morphologyMethod'=>'int', 'iterations'=>'int', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'string'], -'Imagick::mosaicImages' => ['Imagick'], -'Imagick::motionBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float', 'channel='=>'int'], -'Imagick::negateImage' => ['bool', 'gray'=>'bool', 'channel='=>'int'], -'Imagick::newImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'background'=>'mixed', 'format='=>'string'], -'Imagick::newPseudoImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'pseudostring'=>'string'], -'Imagick::next' => ['void'], -'Imagick::nextImage' => ['bool'], -'Imagick::normalizeImage' => ['bool', 'channel='=>'int'], -'Imagick::oilPaintImage' => ['bool', 'radius'=>'float'], -'Imagick::opaquePaintImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'invert'=>'bool', 'channel='=>'int'], -'Imagick::optimizeImageLayers' => ['bool'], -'Imagick::orderedPosterizeImage' => ['bool', 'threshold_map'=>'string', 'channel='=>'int'], -'Imagick::paintFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int', 'channel='=>'int'], -'Imagick::paintOpaqueImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'channel='=>'int'], -'Imagick::paintTransparentImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float'], -'Imagick::pingImage' => ['bool', 'filename'=>'string'], -'Imagick::pingImageBlob' => ['bool', 'image'=>'string'], -'Imagick::pingImageFile' => ['bool', 'filehandle'=>'resource', 'filename='=>'string'], -'Imagick::polaroidImage' => ['bool', 'properties'=>'ImagickDraw', 'angle'=>'float'], -'Imagick::posterizeImage' => ['bool', 'levels'=>'int', 'dither'=>'bool'], -'Imagick::previewImages' => ['bool', 'preview'=>'int'], -'Imagick::previousImage' => ['bool'], -'Imagick::profileImage' => ['bool', 'name'=>'string', 'profile'=>'string'], -'Imagick::quantizeImage' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], -'Imagick::quantizeImages' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], -'Imagick::queryFontMetrics' => ['array', 'properties'=>'ImagickDraw', 'text'=>'string', 'multiline='=>'bool'], -'Imagick::queryFonts' => ['array', 'pattern='=>'string'], -'Imagick::queryFormats' => ['list', 'pattern='=>'string'], -'Imagick::radialBlurImage' => ['bool', 'angle'=>'float', 'channel='=>'int'], -'Imagick::raiseImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int', 'raise'=>'bool'], -'Imagick::randomThresholdImage' => ['bool', 'low'=>'float', 'high'=>'float', 'channel='=>'int'], -'Imagick::readImage' => ['bool', 'filename'=>'string'], -'Imagick::readImageBlob' => ['bool', 'image'=>'string', 'filename='=>'string'], -'Imagick::readImageFile' => ['bool', 'filehandle'=>'resource', 'filename='=>'string'], -'Imagick::readImages' => ['Imagick', 'filenames'=>'string'], -'Imagick::recolorImage' => ['bool', 'matrix'=>'list'], -'Imagick::reduceNoiseImage' => ['bool', 'radius'=>'float'], -'Imagick::remapImage' => ['bool', 'replacement'=>'Imagick', 'dither'=>'int'], -'Imagick::removeImage' => ['bool'], -'Imagick::removeImageProfile' => ['string', 'name'=>'string'], -'Imagick::render' => ['bool'], -'Imagick::resampleImage' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float', 'filter'=>'int', 'blur'=>'float'], -'Imagick::resetImagePage' => ['bool', 'page'=>'string'], -'Imagick::resetIterator' => [''], -'Imagick::resizeImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'filter'=>'int', 'blur'=>'float', 'bestfit='=>'bool'], -'Imagick::rewind' => ['void'], -'Imagick::rollImage' => ['bool', 'x'=>'int', 'y'=>'int'], -'Imagick::rotateImage' => ['bool', 'background'=>'mixed', 'degrees'=>'float'], -'Imagick::rotationalBlurImage' => ['void', 'angle'=>'string', 'CHANNEL='=>'string'], -'Imagick::roundCorners' => ['bool', 'x_rounding'=>'float', 'y_rounding'=>'float', 'stroke_width='=>'float', 'displace='=>'float', 'size_correction='=>'float'], -'Imagick::roundCornersImage' => ['', 'xRounding'=>'', 'yRounding'=>'', 'strokeWidth'=>'', 'displace'=>'', 'sizeCorrection'=>''], -'Imagick::sampleImage' => ['bool', 'columns'=>'int', 'rows'=>'int'], -'Imagick::scaleImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'bestfit='=>'bool'], -'Imagick::segmentImage' => ['bool', 'colorspace'=>'int', 'cluster_threshold'=>'float', 'smooth_threshold'=>'float', 'verbose='=>'bool'], -'Imagick::selectiveBlurImage' => ['void', 'radius'=>'float', 'sigma'=>'float', 'threshold'=>'float', 'CHANNEL'=>'int'], -'Imagick::separateImageChannel' => ['bool', 'channel'=>'int'], -'Imagick::sepiaToneImage' => ['bool', 'threshold'=>'float'], -'Imagick::setAntiAlias' => ['int', 'antialias'=>'bool'], -'Imagick::setBackgroundColor' => ['bool', 'background'=>'mixed'], -'Imagick::setColorspace' => ['bool', 'colorspace'=>'int'], -'Imagick::setCompression' => ['bool', 'compression'=>'int'], -'Imagick::setCompressionQuality' => ['bool', 'quality'=>'int'], -'Imagick::setFilename' => ['bool', 'filename'=>'string'], -'Imagick::setFirstIterator' => ['bool'], -'Imagick::setFont' => ['bool', 'font'=>'string'], -'Imagick::setFormat' => ['bool', 'format'=>'string'], -'Imagick::setGravity' => ['bool', 'gravity'=>'int'], -'Imagick::setImage' => ['bool', 'replace'=>'Imagick'], -'Imagick::setImageAlpha' => ['bool', 'alpha'=>'float'], -'Imagick::setImageAlphaChannel' => ['bool', 'mode'=>'int'], -'Imagick::setImageArtifact' => ['bool', 'artifact'=>'string', 'value'=>'string'], -'Imagick::setImageAttribute' => ['void', 'key'=>'string', 'value'=>'string'], -'Imagick::setImageBackgroundColor' => ['bool', 'background'=>'mixed'], -'Imagick::setImageBias' => ['bool', 'bias'=>'float'], -'Imagick::setImageBiasQuantum' => ['void', 'bias'=>'string'], -'Imagick::setImageBluePrimary' => ['bool', 'x'=>'float', 'y'=>'float'], -'Imagick::setImageBorderColor' => ['bool', 'border'=>'mixed'], -'Imagick::setImageChannelDepth' => ['bool', 'channel'=>'int', 'depth'=>'int'], -'Imagick::setImageChannelMask' => ['', 'channel'=>'int'], -'Imagick::setImageClipMask' => ['bool', 'clip_mask'=>'Imagick'], -'Imagick::setImageColormapColor' => ['bool', 'index'=>'int', 'color'=>'ImagickPixel'], -'Imagick::setImageColorspace' => ['bool', 'colorspace'=>'int'], -'Imagick::setImageCompose' => ['bool', 'compose'=>'int'], -'Imagick::setImageCompression' => ['bool', 'compression'=>'int'], -'Imagick::setImageCompressionQuality' => ['bool', 'quality'=>'int'], -'Imagick::setImageDelay' => ['bool', 'delay'=>'int'], -'Imagick::setImageDepth' => ['bool', 'depth'=>'int'], -'Imagick::setImageDispose' => ['bool', 'dispose'=>'int'], -'Imagick::setImageExtent' => ['bool', 'columns'=>'int', 'rows'=>'int'], -'Imagick::setImageFilename' => ['bool', 'filename'=>'string'], -'Imagick::setImageFormat' => ['bool', 'format'=>'string'], -'Imagick::setImageGamma' => ['bool', 'gamma'=>'float'], -'Imagick::setImageGravity' => ['bool', 'gravity'=>'int'], -'Imagick::setImageGreenPrimary' => ['bool', 'x'=>'float', 'y'=>'float'], -'Imagick::setImageIndex' => ['bool', 'index'=>'int'], -'Imagick::setImageInterlaceScheme' => ['bool', 'interlace_scheme'=>'int'], -'Imagick::setImageInterpolateMethod' => ['bool', 'method'=>'int'], -'Imagick::setImageIterations' => ['bool', 'iterations'=>'int'], -'Imagick::setImageMatte' => ['bool', 'matte'=>'bool'], -'Imagick::setImageMatteColor' => ['bool', 'matte'=>'mixed'], -'Imagick::setImageOpacity' => ['bool', 'opacity'=>'float'], -'Imagick::setImageOrientation' => ['bool', 'orientation'=>'int'], -'Imagick::setImagePage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], -'Imagick::setImageProfile' => ['bool', 'name'=>'string', 'profile'=>'string'], -'Imagick::setImageProgressMonitor' => ['', 'filename'=>''], -'Imagick::setImageProperty' => ['bool', 'name'=>'string', 'value'=>'string'], -'Imagick::setImageRedPrimary' => ['bool', 'x'=>'float', 'y'=>'float'], -'Imagick::setImageRenderingIntent' => ['bool', 'rendering_intent'=>'int'], -'Imagick::setImageResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'], -'Imagick::setImageScene' => ['bool', 'scene'=>'int'], -'Imagick::setImageTicksPerSecond' => ['bool', 'ticks_per_second'=>'int'], -'Imagick::setImageType' => ['bool', 'image_type'=>'int'], -'Imagick::setImageUnits' => ['bool', 'units'=>'int'], -'Imagick::setImageVirtualPixelMethod' => ['bool', 'method'=>'int'], -'Imagick::setImageWhitePoint' => ['bool', 'x'=>'float', 'y'=>'float'], -'Imagick::setInterlaceScheme' => ['bool', 'interlace_scheme'=>'int'], -'Imagick::setIteratorIndex' => ['bool', 'index'=>'int'], -'Imagick::setLastIterator' => ['bool'], -'Imagick::setOption' => ['bool', 'key'=>'string', 'value'=>'string'], -'Imagick::setPage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], -'Imagick::setPointSize' => ['bool', 'point_size'=>'float'], -'Imagick::setProgressMonitor' => ['void', 'callback'=>'callable'], -'Imagick::setRegistry' => ['void', 'key'=>'string', 'value'=>'string'], -'Imagick::setResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'], -'Imagick::setResourceLimit' => ['bool', 'type'=>'int', 'limit'=>'int'], -'Imagick::setSamplingFactors' => ['bool', 'factors'=>'list'], -'Imagick::setSize' => ['bool', 'columns'=>'int', 'rows'=>'int'], -'Imagick::setSizeOffset' => ['bool', 'columns'=>'int', 'rows'=>'int', 'offset'=>'int'], -'Imagick::setType' => ['bool', 'image_type'=>'int'], -'Imagick::shadeImage' => ['bool', 'gray'=>'bool', 'azimuth'=>'float', 'elevation'=>'float'], -'Imagick::shadowImage' => ['bool', 'opacity'=>'float', 'sigma'=>'float', 'x'=>'int', 'y'=>'int'], -'Imagick::sharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], -'Imagick::shaveImage' => ['bool', 'columns'=>'int', 'rows'=>'int'], -'Imagick::shearImage' => ['bool', 'background'=>'mixed', 'x_shear'=>'float', 'y_shear'=>'float'], -'Imagick::sigmoidalContrastImage' => ['bool', 'sharpen'=>'bool', 'alpha'=>'float', 'beta'=>'float', 'channel='=>'int'], -'Imagick::similarityImage' => ['Imagick', 'Imagick'=>'Imagick', '&bestMatch'=>'array', '&similarity'=>'float', 'similarity_threshold'=>'float', 'metric'=>'int'], -'Imagick::sketchImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float'], -'Imagick::smushImages' => ['Imagick', 'stack'=>'string', 'offset'=>'string'], -'Imagick::solarizeImage' => ['bool', 'threshold'=>'int'], -'Imagick::sparseColorImage' => ['bool', 'sparse_method'=>'int', 'arguments'=>'array', 'channel='=>'int'], -'Imagick::spliceImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], -'Imagick::spreadImage' => ['bool', 'radius'=>'float'], -'Imagick::statisticImage' => ['void', 'type'=>'int', 'width'=>'int', 'height'=>'int', 'CHANNEL='=>'string'], -'Imagick::steganoImage' => ['Imagick', 'watermark_wand'=>'Imagick', 'offset'=>'int'], -'Imagick::stereoImage' => ['bool', 'offset_wand'=>'Imagick'], -'Imagick::stripImage' => ['bool'], -'Imagick::subImageMatch' => ['Imagick', 'Imagick'=>'Imagick', '&w_offset='=>'array', '&w_similarity='=>'float'], -'Imagick::swirlImage' => ['bool', 'degrees'=>'float'], -'Imagick::textureImage' => ['bool', 'texture_wand'=>'Imagick'], -'Imagick::thresholdImage' => ['bool', 'threshold'=>'float', 'channel='=>'int'], -'Imagick::thumbnailImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool', 'fill='=>'bool', 'legacy='=>'bool'], -'Imagick::tintImage' => ['bool', 'tint'=>'mixed', 'opacity'=>'mixed'], -'Imagick::transformImage' => ['Imagick', 'crop'=>'string', 'geometry'=>'string'], -'Imagick::transformImageColorspace' => ['bool', 'colorspace'=>'int'], -'Imagick::transparentPaintImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float', 'invert'=>'bool'], -'Imagick::transposeImage' => ['bool'], -'Imagick::transverseImage' => ['bool'], -'Imagick::trimImage' => ['bool', 'fuzz'=>'float'], -'Imagick::uniqueImageColors' => ['bool'], -'Imagick::unsharpMaskImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'amount'=>'float', 'threshold'=>'float', 'channel='=>'int'], -'Imagick::valid' => ['bool'], -'Imagick::vignetteImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float', 'x'=>'int', 'y'=>'int'], -'Imagick::waveImage' => ['bool', 'amplitude'=>'float', 'length'=>'float'], -'Imagick::whiteThresholdImage' => ['bool', 'threshold'=>'mixed'], -'Imagick::writeImage' => ['bool', 'filename='=>'string'], -'Imagick::writeImageFile' => ['bool', 'filehandle'=>'resource'], -'Imagick::writeImages' => ['bool', 'filename'=>'string', 'adjoin'=>'bool'], -'Imagick::writeImagesFile' => ['bool', 'filehandle'=>'resource'], -'ImagickDraw::__construct' => ['void'], -'ImagickDraw::affine' => ['bool', 'affine'=>'array'], -'ImagickDraw::annotation' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'], -'ImagickDraw::arc' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float', 'sd'=>'float', 'ed'=>'float'], -'ImagickDraw::bezier' => ['bool', 'coordinates'=>'list'], -'ImagickDraw::circle' => ['bool', 'ox'=>'float', 'oy'=>'float', 'px'=>'float', 'py'=>'float'], -'ImagickDraw::clear' => ['bool'], -'ImagickDraw::clone' => ['ImagickDraw'], -'ImagickDraw::color' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'], -'ImagickDraw::comment' => ['bool', 'comment'=>'string'], -'ImagickDraw::composite' => ['bool', 'compose'=>'int', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float', 'compositewand'=>'Imagick'], -'ImagickDraw::destroy' => ['bool'], -'ImagickDraw::ellipse' => ['bool', 'ox'=>'float', 'oy'=>'float', 'rx'=>'float', 'ry'=>'float', 'start'=>'float', 'end'=>'float'], -'ImagickDraw::getBorderColor' => ['ImagickPixel'], -'ImagickDraw::getClipPath' => ['string|false'], -'ImagickDraw::getClipRule' => ['int'], -'ImagickDraw::getClipUnits' => ['int'], -'ImagickDraw::getDensity' => ['?string'], -'ImagickDraw::getFillColor' => ['ImagickPixel'], -'ImagickDraw::getFillOpacity' => ['float'], -'ImagickDraw::getFillRule' => ['int'], -'ImagickDraw::getFont' => ['string|false'], -'ImagickDraw::getFontFamily' => ['string|false'], -'ImagickDraw::getFontResolution' => ['array'], -'ImagickDraw::getFontSize' => ['float'], -'ImagickDraw::getFontStretch' => ['int'], -'ImagickDraw::getFontStyle' => ['int'], -'ImagickDraw::getFontWeight' => ['int'], -'ImagickDraw::getGravity' => ['int'], -'ImagickDraw::getOpacity' => ['float'], -'ImagickDraw::getStrokeAntialias' => ['bool'], -'ImagickDraw::getStrokeColor' => ['ImagickPixel'], -'ImagickDraw::getStrokeDashArray' => ['array'], -'ImagickDraw::getStrokeDashOffset' => ['float'], -'ImagickDraw::getStrokeLineCap' => ['int'], -'ImagickDraw::getStrokeLineJoin' => ['int'], -'ImagickDraw::getStrokeMiterLimit' => ['int'], -'ImagickDraw::getStrokeOpacity' => ['float'], -'ImagickDraw::getStrokeWidth' => ['float'], -'ImagickDraw::getTextAlignment' => ['int'], -'ImagickDraw::getTextAntialias' => ['bool'], -'ImagickDraw::getTextDecoration' => ['int'], -'ImagickDraw::getTextDirection' => ['bool'], -'ImagickDraw::getTextEncoding' => ['string'], -'ImagickDraw::getTextInterlineSpacing' => ['float'], -'ImagickDraw::getTextInterwordSpacing' => ['float'], -'ImagickDraw::getTextKerning' => ['float'], -'ImagickDraw::getTextUnderColor' => ['ImagickPixel'], -'ImagickDraw::getVectorGraphics' => ['string'], -'ImagickDraw::line' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float'], -'ImagickDraw::matte' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'], -'ImagickDraw::pathClose' => ['bool'], -'ImagickDraw::pathCurveToAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathCurveToQuadraticBezierAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathCurveToQuadraticBezierRelative' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathCurveToQuadraticBezierSmoothRelative' => ['bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathCurveToRelative' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathCurveToSmoothAbsolute' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathCurveToSmoothRelative' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathEllipticArcAbsolute' => ['bool', 'rx'=>'float', 'ry'=>'float', 'x_axis_rotation'=>'float', 'large_arc_flag'=>'bool', 'sweep_flag'=>'bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathEllipticArcRelative' => ['bool', 'rx'=>'float', 'ry'=>'float', 'x_axis_rotation'=>'float', 'large_arc_flag'=>'bool', 'sweep_flag'=>'bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathFinish' => ['bool'], -'ImagickDraw::pathLineToAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathLineToHorizontalAbsolute' => ['bool', 'x'=>'float'], -'ImagickDraw::pathLineToHorizontalRelative' => ['bool', 'x'=>'float'], -'ImagickDraw::pathLineToRelative' => ['bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathLineToVerticalAbsolute' => ['bool', 'y'=>'float'], -'ImagickDraw::pathLineToVerticalRelative' => ['bool', 'y'=>'float'], -'ImagickDraw::pathMoveToAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathMoveToRelative' => ['bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::pathStart' => ['bool'], -'ImagickDraw::point' => ['bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::polygon' => ['bool', 'coordinates'=>'list'], -'ImagickDraw::polyline' => ['bool', 'coordinates'=>'list'], -'ImagickDraw::pop' => ['bool'], -'ImagickDraw::popClipPath' => ['bool'], -'ImagickDraw::popDefs' => ['bool'], -'ImagickDraw::popPattern' => ['bool'], -'ImagickDraw::push' => ['bool'], -'ImagickDraw::pushClipPath' => ['bool', 'clip_mask_id'=>'string'], -'ImagickDraw::pushDefs' => ['bool'], -'ImagickDraw::pushPattern' => ['bool', 'pattern_id'=>'string', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], -'ImagickDraw::rectangle' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], -'ImagickDraw::render' => ['bool'], -'ImagickDraw::resetVectorGraphics' => ['void'], -'ImagickDraw::rotate' => ['bool', 'degrees'=>'float'], -'ImagickDraw::roundRectangle' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'rx'=>'float', 'ry'=>'float'], -'ImagickDraw::scale' => ['bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::setBorderColor' => ['bool', 'color'=>'ImagickPixel|string'], -'ImagickDraw::setClipPath' => ['bool', 'clip_mask'=>'string'], -'ImagickDraw::setClipRule' => ['bool', 'fill_rule'=>'int'], -'ImagickDraw::setClipUnits' => ['bool', 'clip_units'=>'int'], -'ImagickDraw::setDensity' => ['bool', 'density_string'=>'string'], -'ImagickDraw::setFillAlpha' => ['bool', 'opacity'=>'float'], -'ImagickDraw::setFillColor' => ['bool', 'fill_pixel'=>'ImagickPixel|string'], -'ImagickDraw::setFillOpacity' => ['bool', 'fillopacity'=>'float'], -'ImagickDraw::setFillPatternURL' => ['bool', 'fill_url'=>'string'], -'ImagickDraw::setFillRule' => ['bool', 'fill_rule'=>'int'], -'ImagickDraw::setFont' => ['bool', 'font_name'=>'string'], -'ImagickDraw::setFontFamily' => ['bool', 'font_family'=>'string'], -'ImagickDraw::setFontResolution' => ['bool', 'x'=>'float', 'y'=>'float'], -'ImagickDraw::setFontSize' => ['bool', 'pointsize'=>'float'], -'ImagickDraw::setFontStretch' => ['bool', 'fontstretch'=>'int'], -'ImagickDraw::setFontStyle' => ['bool', 'style'=>'int'], -'ImagickDraw::setFontWeight' => ['bool', 'font_weight'=>'int'], -'ImagickDraw::setGravity' => ['bool', 'gravity'=>'int'], -'ImagickDraw::setOpacity' => ['void', 'opacity'=>'float'], -'ImagickDraw::setResolution' => ['void', 'x_resolution'=>'float', 'y_resolution'=>'float'], -'ImagickDraw::setStrokeAlpha' => ['bool', 'opacity'=>'float'], -'ImagickDraw::setStrokeAntialias' => ['bool', 'stroke_antialias'=>'bool'], -'ImagickDraw::setStrokeColor' => ['bool', 'stroke_pixel'=>'ImagickPixel|string'], -'ImagickDraw::setStrokeDashArray' => ['bool', 'dasharray'=>'list'], -'ImagickDraw::setStrokeDashOffset' => ['bool', 'dash_offset'=>'float'], -'ImagickDraw::setStrokeLineCap' => ['bool', 'linecap'=>'int'], -'ImagickDraw::setStrokeLineJoin' => ['bool', 'linejoin'=>'int'], -'ImagickDraw::setStrokeMiterLimit' => ['bool', 'miterlimit'=>'int'], -'ImagickDraw::setStrokeOpacity' => ['bool', 'stroke_opacity'=>'float'], -'ImagickDraw::setStrokePatternURL' => ['bool', 'stroke_url'=>'string'], -'ImagickDraw::setStrokeWidth' => ['bool', 'stroke_width'=>'float'], -'ImagickDraw::setTextAlignment' => ['bool', 'alignment'=>'int'], -'ImagickDraw::setTextAntialias' => ['bool', 'antialias'=>'bool'], -'ImagickDraw::setTextDecoration' => ['bool', 'decoration'=>'int'], -'ImagickDraw::setTextDirection' => ['bool', 'direction'=>'int'], -'ImagickDraw::setTextEncoding' => ['bool', 'encoding'=>'string'], -'ImagickDraw::setTextInterlineSpacing' => ['void', 'spacing'=>'float'], -'ImagickDraw::setTextInterwordSpacing' => ['void', 'spacing'=>'float'], -'ImagickDraw::setTextKerning' => ['void', 'kerning'=>'float'], -'ImagickDraw::setTextUnderColor' => ['bool', 'under_color'=>'ImagickPixel|string'], -'ImagickDraw::setVectorGraphics' => ['bool', 'xml'=>'string'], -'ImagickDraw::setViewbox' => ['bool', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int'], -'ImagickDraw::skewX' => ['bool', 'degrees'=>'float'], -'ImagickDraw::skewY' => ['bool', 'degrees'=>'float'], -'ImagickDraw::translate' => ['bool', 'x'=>'float', 'y'=>'float'], -'ImagickKernel::addKernel' => ['void', 'ImagickKernel'=>'ImagickKernel'], -'ImagickKernel::addUnityKernel' => ['void'], -'ImagickKernel::fromBuiltin' => ['ImagickKernel', 'kernelType'=>'string', 'kernelString'=>'string'], -'ImagickKernel::fromMatrix' => ['ImagickKernel', 'matrix'=>'list>', 'origin='=>'array'], -'ImagickKernel::getMatrix' => ['list>'], -'ImagickKernel::scale' => ['void'], -'ImagickKernel::separate' => ['ImagickKernel[]'], -'ImagickKernel::seperate' => ['void'], -'ImagickPixel::__construct' => ['void', 'color='=>'string'], -'ImagickPixel::clear' => ['bool'], -'ImagickPixel::clone' => ['void'], -'ImagickPixel::destroy' => ['bool'], -'ImagickPixel::getColor' => ['array{r: int|float, g: int|float, b: int|float, a: int|float}', 'normalized='=>'0|1|2'], -'ImagickPixel::getColorAsString' => ['string'], -'ImagickPixel::getColorCount' => ['int'], -'ImagickPixel::getColorQuantum' => ['mixed'], -'ImagickPixel::getColorValue' => ['float', 'color'=>'int'], -'ImagickPixel::getColorValueQuantum' => ['mixed'], -'ImagickPixel::getHSL' => ['array{hue: float, saturation: float, luminosity: float}'], -'ImagickPixel::getIndex' => ['int'], -'ImagickPixel::isPixelSimilar' => ['bool', 'color'=>'ImagickPixel', 'fuzz'=>'float'], -'ImagickPixel::isPixelSimilarQuantum' => ['bool', 'color'=>'string', 'fuzz='=>'string'], -'ImagickPixel::isSimilar' => ['bool', 'color'=>'ImagickPixel', 'fuzz'=>'float'], -'ImagickPixel::setColor' => ['bool', 'color'=>'string'], -'ImagickPixel::setcolorcount' => ['void', 'colorCount'=>'string'], -'ImagickPixel::setColorFromPixel' => ['bool', 'srcPixel'=>'ImagickPixel'], -'ImagickPixel::setColorValue' => ['bool', 'color'=>'int', 'value'=>'float'], -'ImagickPixel::setColorValueQuantum' => ['void', 'color'=>'int', 'value'=>'mixed'], -'ImagickPixel::setHSL' => ['bool', 'hue'=>'float', 'saturation'=>'float', 'luminosity'=>'float'], -'ImagickPixel::setIndex' => ['void', 'index'=>'int'], -'ImagickPixelIterator::__construct' => ['void', 'wand'=>'Imagick'], -'ImagickPixelIterator::clear' => ['bool'], -'ImagickPixelIterator::current' => ['mixed'], -'ImagickPixelIterator::destroy' => ['bool'], -'ImagickPixelIterator::getCurrentIteratorRow' => ['array'], -'ImagickPixelIterator::getIteratorRow' => ['int'], -'ImagickPixelIterator::getNextIteratorRow' => ['array'], -'ImagickPixelIterator::getpixeliterator' => ['', 'Imagick'=>'Imagick'], -'ImagickPixelIterator::getpixelregioniterator' => ['', 'Imagick'=>'Imagick', 'x'=>'', 'y'=>'', 'columns'=>'', 'rows'=>''], -'ImagickPixelIterator::getPreviousIteratorRow' => ['array'], -'ImagickPixelIterator::key' => ['int|string'], -'ImagickPixelIterator::newPixelIterator' => ['bool', 'wand'=>'Imagick'], -'ImagickPixelIterator::newPixelRegionIterator' => ['bool', 'wand'=>'Imagick', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'], -'ImagickPixelIterator::next' => ['void'], -'ImagickPixelIterator::resetIterator' => ['bool'], -'ImagickPixelIterator::rewind' => ['void'], -'ImagickPixelIterator::setIteratorFirstRow' => ['bool'], -'ImagickPixelIterator::setIteratorLastRow' => ['bool'], -'ImagickPixelIterator::setIteratorRow' => ['bool', 'row'=>'int'], -'ImagickPixelIterator::syncIterator' => ['bool'], -'ImagickPixelIterator::valid' => ['bool'], -'imap_8bit' => ['string|false', 'string'=>'string'], -'imap_alerts' => ['array|false'], -'imap_append' => ['bool', 'imap'=>'IMAP\Connection', 'folder'=>'string', 'message'=>'string', 'options='=>'string', 'internal_date='=>'string'], -'imap_base64' => ['string|false', 'string'=>'string'], -'imap_binary' => ['string|false', 'string'=>'string'], -'imap_body' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], -'imap_bodystruct' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string'], -'imap_check' => ['stdClass|false', 'imap'=>'IMAP\Connection'], -'imap_clearflag_full' => ['bool', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], -'imap_close' => ['bool', 'imap'=>'IMAP\Connection', 'flags='=>'int'], -'imap_create' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], -'imap_createmailbox' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], -'imap_delete' => ['bool', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], -'imap_deletemailbox' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], -'imap_errors' => ['array|false'], -'imap_expunge' => ['bool', 'imap'=>'IMAP\Connection'], -'imap_fetch_overview' => ['array|false', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flags='=>'int'], -'imap_fetchbody' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], -'imap_fetchheader' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], -'imap_fetchmime' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], -'imap_fetchstructure' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], -'imap_fetchtext' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], -'imap_gc' => ['bool', 'imap'=>'IMAP\Connection', 'flags'=>'int'], -'imap_get_quota' => ['array|false', 'imap'=>'IMAP\Connection', 'quota_root'=>'string'], -'imap_get_quotaroot' => ['array|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], -'imap_getacl' => ['array|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], -'imap_getmailboxes' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], -'imap_getsubscribed' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], -'imap_header' => ['stdClass|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string'], -'imap_headerinfo' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string|null'], -'imap_headers' => ['array|false', 'imap'=>'IMAP\Connection'], -'imap_last_error' => ['string|false'], -'imap_list' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], -'imap_listmailbox' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], -'imap_listscan' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], -'imap_listsubscribed' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], -'imap_lsub' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], -'imap_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string', 'cc='=>'string', 'bcc='=>'string', 'return_path='=>'string'], -'imap_mail_compose' => ['string|false', 'envelope'=>'array', 'bodies'=>'array'], -'imap_mail_copy' => ['bool', 'imap'=>'IMAP\Connection', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], -'imap_mail_move' => ['bool', 'imap'=>'IMAP\Connection', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], -'imap_mailboxmsginfo' => ['stdClass|false', 'imap'=>'IMAP\Connection'], -'imap_mime_header_decode' => ['array|false', 'string'=>'string'], -'imap_msgno' => ['int|false', 'imap'=>'IMAP\Connection', 'message_uid'=>'int'], -'imap_mutf7_to_utf8' => ['string|false', 'string'=>'string'], -'imap_num_msg' => ['int|false', 'imap'=>'IMAP\Connection'], -'imap_num_recent' => ['int|false', 'imap'=>'IMAP\Connection'], -'imap_open' => ['IMAP\Connection|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'flags='=>'int', 'retries='=>'int', 'options='=>'?array'], -'imap_ping' => ['bool', 'imap'=>'IMAP\Connection'], -'imap_qprint' => ['string|false', 'string'=>'string'], -'imap_rename' => ['bool', 'imap'=>'IMAP\Connection', 'from'=>'string', 'to'=>'string'], -'imap_renamemailbox' => ['bool', 'imap'=>'IMAP\Connection', 'from'=>'string', 'to'=>'string'], -'imap_reopen' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'flags='=>'int', 'retries='=>'int'], -'imap_rfc822_parse_adrlist' => ['array', 'string'=>'string', 'default_hostname'=>'string'], -'imap_rfc822_parse_headers' => ['stdClass', 'headers'=>'string', 'default_hostname='=>'string'], -'imap_rfc822_write_address' => ['string|false', 'mailbox'=>'?string', 'hostname'=>'?string', 'personal'=>'?string'], -'imap_savebody' => ['bool', 'imap'=>'IMAP\Connection', 'file'=>'string|resource', 'message_num'=>'int', 'section='=>'string', 'flags='=>'int'], -'imap_scan' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], -'imap_scanmailbox' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], -'imap_search' => ['array|false', 'imap'=>'IMAP\Connection', 'criteria'=>'string', 'flags='=>'int', 'charset='=>'string'], -'imap_set_quota' => ['bool', 'imap'=>'IMAP\Connection', 'quota_root'=>'string', 'mailbox_size'=>'int'], -'imap_setacl' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'user_id'=>'string', 'rights'=>'string'], -'imap_setflag_full' => ['bool', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], -'imap_sort' => ['array|false', 'imap'=>'IMAP\Connection', 'criteria'=>'int', 'reverse'=>'int', 'flags='=>'int', 'search_criteria='=>'string', 'charset='=>'string'], -'imap_status' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'flags'=>'int'], -'imap_subscribe' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], -'imap_thread' => ['array|false', 'imap'=>'IMAP\Connection', 'flags='=>'int'], -'imap_timeout' => ['int|bool', 'timeout_type'=>'int', 'timeout='=>'int'], -'imap_uid' => ['int|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int'], -'imap_undelete' => ['bool', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], -'imap_unsubscribe' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], -'imap_utf7_decode' => ['string|false', 'string'=>'string'], -'imap_utf7_encode' => ['string', 'string'=>'string'], -'imap_utf8' => ['string', 'mime_encoded_text'=>'string'], -'imap_utf8_to_mutf7' => ['string|false', 'string'=>'string'], -'implode' => ['string', 'separator'=>'string', 'array'=>'array'], -'implode\'1' => ['string', 'separator'=>'array'], -'import_request_variables' => ['bool', 'types'=>'string', 'prefix='=>'string'], -'in_array' => ['bool', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'], -'inclued_get_data' => ['array'], -'inet_ntop' => ['string|false', 'ip'=>'string'], -'inet_pton' => ['string|false', 'ip'=>'string'], -'InfiniteIterator::__construct' => ['void', 'iterator'=>'Iterator'], -'InfiniteIterator::current' => ['mixed'], -'InfiniteIterator::getInnerIterator' => ['Iterator'], -'InfiniteIterator::key' => ['bool|float|int|string'], -'InfiniteIterator::next' => ['void'], -'InfiniteIterator::rewind' => ['void'], -'InfiniteIterator::valid' => ['bool'], -'inflate_add' => ['string|false', 'context'=>'resource', 'data'=>'string', 'flush_mode='=>'int'], -'inflate_get_read_len' => ['int|false', 'context'=>'resource'], -'inflate_get_status' => ['int|false', 'context'=>'resource'], -'inflate_init' => ['resource|false', 'encoding'=>'int', 'options='=>'array'], -'ingres_autocommit' => ['bool', 'link'=>'resource'], -'ingres_autocommit_state' => ['bool', 'link'=>'resource'], -'ingres_charset' => ['string', 'link'=>'resource'], -'ingres_close' => ['bool', 'link'=>'resource'], -'ingres_commit' => ['bool', 'link'=>'resource'], -'ingres_connect' => ['resource', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'options='=>'array'], -'ingres_cursor' => ['string', 'result'=>'resource'], -'ingres_errno' => ['int', 'link='=>'resource'], -'ingres_error' => ['string', 'link='=>'resource'], -'ingres_errsqlstate' => ['string', 'link='=>'resource'], -'ingres_escape_string' => ['string', 'link'=>'resource', 'source_string'=>'string'], -'ingres_execute' => ['bool', 'result'=>'resource', 'params='=>'array', 'types='=>'string'], -'ingres_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], -'ingres_fetch_assoc' => ['array', 'result'=>'resource'], -'ingres_fetch_object' => ['object', 'result'=>'resource', 'result_type='=>'int'], -'ingres_fetch_proc_return' => ['int', 'result'=>'resource'], -'ingres_fetch_row' => ['array', 'result'=>'resource'], -'ingres_field_length' => ['int', 'result'=>'resource', 'index'=>'int'], -'ingres_field_name' => ['string', 'result'=>'resource', 'index'=>'int'], -'ingres_field_nullable' => ['bool', 'result'=>'resource', 'index'=>'int'], -'ingres_field_precision' => ['int', 'result'=>'resource', 'index'=>'int'], -'ingres_field_scale' => ['int', 'result'=>'resource', 'index'=>'int'], -'ingres_field_type' => ['string', 'result'=>'resource', 'index'=>'int'], -'ingres_free_result' => ['bool', 'result'=>'resource'], -'ingres_next_error' => ['bool', 'link='=>'resource'], -'ingres_num_fields' => ['int', 'result'=>'resource'], -'ingres_num_rows' => ['int', 'result'=>'resource'], -'ingres_pconnect' => ['resource', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'options='=>'array'], -'ingres_prepare' => ['mixed', 'link'=>'resource', 'query'=>'string'], -'ingres_query' => ['mixed', 'link'=>'resource', 'query'=>'string', 'params='=>'array', 'types='=>'string'], -'ingres_result_seek' => ['bool', 'result'=>'resource', 'position'=>'int'], -'ingres_rollback' => ['bool', 'link'=>'resource'], -'ingres_set_environment' => ['bool', 'link'=>'resource', 'options'=>'array'], -'ingres_unbuffered_query' => ['mixed', 'link'=>'resource', 'query'=>'string', 'params='=>'array', 'types='=>'string'], -'ini_alter' => ['string|false', 'option'=>'string', 'value'=>'string'], -'ini_get' => ['string|false', 'option'=>'string'], -'ini_get_all' => ['array|false', 'extension='=>'?string', 'details='=>'bool'], -'ini_restore' => ['void', 'option'=>'string'], -'ini_set' => ['string|false', 'option'=>'string', 'value'=>'string|int|float|bool|null'], -'inotify_add_watch' => ['int', 'inotify_instance'=>'resource', 'pathname'=>'string', 'mask'=>'int'], -'inotify_init' => ['resource|false'], -'inotify_queue_len' => ['int', 'inotify_instance'=>'resource'], -'inotify_read' => ['array|false', 'inotify_instance'=>'resource'], -'inotify_rm_watch' => ['bool', 'inotify_instance'=>'resource', 'watch_descriptor'=>'int'], -'intdiv' => ['int', 'num1'=>'int', 'num2'=>'int'], -'interface_exists' => ['bool', 'interface'=>'string', 'autoload='=>'bool'], -'intl_error_name' => ['string', 'errorCode'=>'int'], -'intl_get_error_code' => ['int'], -'intl_get_error_message' => ['string'], -'intl_is_failure' => ['bool', 'errorCode'=>'int'], -'IntlBreakIterator::__construct' => ['void'], -'IntlBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], -'IntlBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlBreakIterator::current' => ['int'], -'IntlBreakIterator::first' => ['int'], -'IntlBreakIterator::following' => ['int', 'offset'=>'int'], -'IntlBreakIterator::getErrorCode' => ['int'], -'IntlBreakIterator::getErrorMessage' => ['string'], -'IntlBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], -'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], -'IntlBreakIterator::getText' => ['string'], -'IntlBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], -'IntlBreakIterator::last' => ['int'], -'IntlBreakIterator::next' => ['int', 'offset='=>'int'], -'IntlBreakIterator::preceding' => ['int', 'offset'=>'int'], -'IntlBreakIterator::previous' => ['int'], -'IntlBreakIterator::setText' => ['bool', 'text'=>'string'], -'intlcal_add' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int', 'value'=>'int'], -'intlcal_after' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], -'intlcal_before' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], -'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_get' => ['mixed', 'calendar'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_actual_maximum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_actual_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_available_locales' => ['array'], -'intlcal_get_day_of_week_type' => ['int', 'calendar'=>'IntlCalendar', 'dayOfWeek'=>'int'], -'intlcal_get_first_day_of_week' => ['int', 'calendar'=>'IntlCalendar'], -'intlcal_get_greatest_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_keyword_values_for_locale' => ['Iterator|false', 'keyword'=>'string', 'locale'=>'string', 'onlyCommon'=>'bool'], -'intlcal_get_least_maximum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_locale' => ['string', 'calendar'=>'IntlCalendar', 'type'=>'int'], -'intlcal_get_maximum' => ['int|false', 'calendar'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_minimal_days_in_first_week' => ['int', 'calendar'=>'IntlCalendar'], -'intlcal_get_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_now' => ['float'], -'intlcal_get_repeated_wall_time_option' => ['int', 'calendar'=>'IntlCalendar'], -'intlcal_get_skipped_wall_time_option' => ['int', 'calendar'=>'IntlCalendar'], -'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_in_daylight_time' => ['bool', 'calendar'=>'IntlCalendar'], -'intlcal_is_equivalent_to' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], -'intlcal_is_lenient' => ['bool', 'calendar'=>'IntlCalendar'], -'intlcal_is_set' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int'], -'intlcal_is_weekend' => ['bool', 'calendar'=>'IntlCalendar', 'timestamp='=>'float'], -'intlcal_roll' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int', 'value'=>'mixed'], -'intlcal_set' => ['bool', 'calendar'=>'IntlCalendar', 'year'=>'int', 'month'=>'int'], -'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_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::after' => ['bool', 'other'=>'IntlCalendar'], -'IntlCalendar::before' => ['bool', 'other'=>'IntlCalendar'], -'IntlCalendar::clear' => ['bool', 'field='=>'int'], -'IntlCalendar::createInstance' => ['IntlCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], -'IntlCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], -'IntlCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], -'IntlCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], -'IntlCalendar::get' => ['int', 'field'=>'int'], -'IntlCalendar::getActualMaximum' => ['int', 'field'=>'int'], -'IntlCalendar::getActualMinimum' => ['int', 'field'=>'int'], -'IntlCalendar::getAvailableLocales' => ['array'], -'IntlCalendar::getDayOfWeekType' => ['int', 'dayOfWeek'=>'int'], -'IntlCalendar::getErrorCode' => ['int'], -'IntlCalendar::getErrorMessage' => ['string'], -'IntlCalendar::getFirstDayOfWeek' => ['int'], -'IntlCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], -'IntlCalendar::getKeywordValuesForLocale' => ['Iterator|false', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], -'IntlCalendar::getLeastMaximum' => ['int', 'field'=>'int'], -'IntlCalendar::getLocale' => ['string', 'localeType'=>'int'], -'IntlCalendar::getMaximum' => ['int|false', 'field'=>'int'], -'IntlCalendar::getMinimalDaysInFirstWeek' => ['int'], -'IntlCalendar::getMinimum' => ['int', 'field'=>'int'], -'IntlCalendar::getNow' => ['float'], -'IntlCalendar::getRepeatedWallTimeOption' => ['int'], -'IntlCalendar::getSkippedWallTimeOption' => ['int'], -'IntlCalendar::getTime' => ['float'], -'IntlCalendar::getTimeZone' => ['IntlTimeZone'], -'IntlCalendar::getType' => ['string'], -'IntlCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], -'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::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::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::getIntPropertyMaxValue' => ['int', 'property'=>'int'], -'IntlChar::getIntPropertyMinValue' => ['int', 'property'=>'int'], -'IntlChar::getIntPropertyMxValue' => ['int', 'property'=>'int'], -'IntlChar::getIntPropertyValue' => ['int', 'char'=>'int|string', 'property'=>'int'], -'IntlChar::getNumericValue' => ['float', 'char'=>'int|string'], -'IntlChar::getPropertyEnum' => ['int', 'alias'=>'string'], -'IntlChar::getPropertyName' => ['string|false', 'property'=>'int', 'namechoice='=>'int'], -'IntlChar::getPropertyValueEnum' => ['int', 'property'=>'int', 'name'=>'string'], -'IntlChar::getPropertyValueName' => ['string|false', 'prop'=>'int', 'value'=>'int', 'namechoice='=>'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'], -'IntlCodePointBreakIterator::__construct' => ['void'], -'IntlCodePointBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlCodePointBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], -'IntlCodePointBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlCodePointBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlCodePointBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlCodePointBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlCodePointBreakIterator::current' => ['int'], -'IntlCodePointBreakIterator::first' => ['int'], -'IntlCodePointBreakIterator::following' => ['int', 'offset'=>'string'], -'IntlCodePointBreakIterator::getErrorCode' => ['int'], -'IntlCodePointBreakIterator::getErrorMessage' => ['string'], -'IntlCodePointBreakIterator::getLastCodePoint' => ['int'], -'IntlCodePointBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], -'IntlCodePointBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'string'], -'IntlCodePointBreakIterator::getText' => ['string'], -'IntlCodePointBreakIterator::isBoundary' => ['bool', 'offset'=>'string'], -'IntlCodePointBreakIterator::last' => ['int'], -'IntlCodePointBreakIterator::next' => ['int', 'offset='=>'string'], -'IntlCodePointBreakIterator::preceding' => ['int', 'offset'=>'string'], -'IntlCodePointBreakIterator::previous' => ['int'], -'IntlCodePointBreakIterator::setText' => ['bool', 'text'=>'string'], -'IntlDateFormatter::__construct' => ['void', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'null|int|IntlCalendar', 'pattern='=>'string'], -'IntlDateFormatter::create' => ['IntlDateFormatter|false', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'int|IntlCalendar', 'pattern='=>'string'], -'IntlDateFormatter::format' => ['string|false', 'args'=>''], -'IntlDateFormatter::formatObject' => ['string|false', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'], -'IntlDateFormatter::getCalendar' => ['int'], -'IntlDateFormatter::getCalendarObject' => ['IntlCalendar'], -'IntlDateFormatter::getDateType' => ['int'], -'IntlDateFormatter::getErrorCode' => ['int'], -'IntlDateFormatter::getErrorMessage' => ['string'], -'IntlDateFormatter::getLocale' => ['string|false'], -'IntlDateFormatter::getPattern' => ['string'], -'IntlDateFormatter::getTimeType' => ['int'], -'IntlDateFormatter::getTimeZone' => ['IntlTimeZone|false'], -'IntlDateFormatter::getTimeZoneId' => ['string'], -'IntlDateFormatter::isLenient' => ['bool'], -'IntlDateFormatter::localtime' => ['array', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'], -'IntlDateFormatter::parse' => ['int|false', 'text_to_parse'=>'string', '&rw_parse_pos='=>'int'], -'IntlDateFormatter::setCalendar' => ['bool', 'calendar'=>''], -'IntlDateFormatter::setLenient' => ['bool', 'lenient'=>'bool'], -'IntlDateFormatter::setPattern' => ['bool', 'pattern'=>'string'], -'IntlDateFormatter::setTimeZone' => ['bool', 'timezone'=>''], -'IntlDateFormatter::setTimeZoneId' => ['bool', 'zone'=>'string', 'fmt='=>'IntlDateFormatter'], -'IntlException::__clone' => ['void'], -'IntlException::__construct' => ['void'], -'IntlException::__toString' => ['string'], -'IntlException::__wakeup' => ['void'], -'IntlException::getCode' => ['int'], -'IntlException::getFile' => ['string'], -'IntlException::getLine' => ['int'], -'IntlException::getMessage' => ['string'], -'IntlException::getPrevious' => ['?Throwable'], -'IntlException::getTrace' => ['list\',args?:array}>'], -'IntlException::getTraceAsString' => ['string'], -'intlgregcal_create_instance' => ['IntlGregorianCalendar', 'timezoneOrYear='=>'mixed', 'localeOrMonth='=>'string'], -'intlgregcal_get_gregorian_change' => ['float', 'calendar'=>'IntlGregorianCalendar'], -'intlgregcal_is_leap_year' => ['bool', 'calendar'=>'int'], -'intlgregcal_set_gregorian_change' => ['void', 'calendar'=>'IntlGregorianCalendar', 'timestamp'=>'float'], -'IntlGregorianCalendar::__construct' => ['void'], -'IntlGregorianCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'], -'IntlGregorianCalendar::after' => ['bool', 'other'=>'IntlCalendar'], -'IntlGregorianCalendar::before' => ['bool', 'other'=>'IntlCalendar'], -'IntlGregorianCalendar::clear' => ['bool', 'field='=>'int'], -'IntlGregorianCalendar::createInstance' => ['IntlGregorianCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], -'IntlGregorianCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], -'IntlGregorianCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], -'IntlGregorianCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], -'IntlGregorianCalendar::get' => ['int', 'field'=>'int'], -'IntlGregorianCalendar::getActualMaximum' => ['int', 'field'=>'int'], -'IntlGregorianCalendar::getActualMinimum' => ['int', 'field'=>'int'], -'IntlGregorianCalendar::getAvailableLocales' => ['array'], -'IntlGregorianCalendar::getDayOfWeekType' => ['int', 'dayOfWeek'=>'int'], -'IntlGregorianCalendar::getErrorCode' => ['int'], -'IntlGregorianCalendar::getErrorMessage' => ['string'], -'IntlGregorianCalendar::getFirstDayOfWeek' => ['int'], -'IntlGregorianCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], -'IntlGregorianCalendar::getGregorianChange' => ['float'], -'IntlGregorianCalendar::getKeywordValuesForLocale' => ['Iterator', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], -'IntlGregorianCalendar::getLeastMaximum' => ['int', 'field'=>'int'], -'IntlGregorianCalendar::getLocale' => ['string', 'localeType'=>'int'], -'IntlGregorianCalendar::getMaximum' => ['int', 'field'=>'int'], -'IntlGregorianCalendar::getMinimalDaysInFirstWeek' => ['int'], -'IntlGregorianCalendar::getMinimum' => ['int', 'field'=>'int'], -'IntlGregorianCalendar::getNow' => ['float'], -'IntlGregorianCalendar::getRepeatedWallTimeOption' => ['int'], -'IntlGregorianCalendar::getSkippedWallTimeOption' => ['int'], -'IntlGregorianCalendar::getTime' => ['float'], -'IntlGregorianCalendar::getTimeZone' => ['IntlTimeZone'], -'IntlGregorianCalendar::getType' => ['string'], -'IntlGregorianCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], -'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::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::toDateTime' => ['DateTime'], -'IntlIterator::__construct' => ['void'], -'IntlIterator::current' => ['mixed'], -'IntlIterator::key' => ['string'], -'IntlIterator::next' => ['void'], -'IntlIterator::rewind' => ['void'], -'IntlIterator::valid' => ['bool'], -'IntlPartsIterator::getBreakIterator' => ['IntlBreakIterator'], -'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules'=>'string', 'areCompiled='=>'string'], -'IntlRuleBasedBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlRuleBasedBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], -'IntlRuleBasedBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlRuleBasedBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlRuleBasedBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlRuleBasedBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], -'IntlRuleBasedBreakIterator::current' => ['int'], -'IntlRuleBasedBreakIterator::first' => ['int'], -'IntlRuleBasedBreakIterator::following' => ['int', 'offset'=>'int'], -'IntlRuleBasedBreakIterator::getBinaryRules' => ['string'], -'IntlRuleBasedBreakIterator::getErrorCode' => ['int'], -'IntlRuleBasedBreakIterator::getErrorMessage' => ['string'], -'IntlRuleBasedBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], -'IntlRuleBasedBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], -'IntlRuleBasedBreakIterator::getRules' => ['string'], -'IntlRuleBasedBreakIterator::getRuleStatus' => ['int'], -'IntlRuleBasedBreakIterator::getRuleStatusVec' => ['array'], -'IntlRuleBasedBreakIterator::getText' => ['string'], -'IntlRuleBasedBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], -'IntlRuleBasedBreakIterator::last' => ['int'], -'IntlRuleBasedBreakIterator::next' => ['int', 'offset='=>'int'], -'IntlRuleBasedBreakIterator::preceding' => ['int', 'offset'=>'int'], -'IntlRuleBasedBreakIterator::previous' => ['int'], -'IntlRuleBasedBreakIterator::setText' => ['bool', 'text'=>'string'], -'IntlTimeZone::countEquivalentIDs' => ['int|false', 'zoneId'=>'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::getDSTSavings' => ['int'], -'IntlTimeZone::getEquivalentID' => ['string|false', 'zoneId'=>'string', 'index'=>'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::getRawOffset' => ['int'], -'IntlTimeZone::getRegion' => ['string|false', 'zoneId'=>'string'], -'IntlTimeZone::getTZDataVersion' => ['string'], -'IntlTimeZone::getUnknown' => ['IntlTimeZone'], -'IntlTimeZone::getWindowsID' => ['string|false', 'timezone'=>'string'], -'IntlTimeZone::hasSameRules' => ['bool', 'otherTimeZone'=>'IntlTimeZone'], -'IntlTimeZone::toDateTimeZone' => ['DateTimeZone|false'], -'IntlTimeZone::useDaylightTime' => ['bool'], -'intltz_count_equivalent_ids' => ['int', 'timezoneId'=>'string'], -'intltz_create_enumeration' => ['IntlIterator', 'countryOrRawOffset'=>'mixed'], -'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_dst_savings' => ['int', 'timezone'=>'IntlTimeZone'], -'intltz_get_equivalent_id' => ['string', 'timezoneId'=>'string', 'offset'=>'int'], -'intltz_get_error_code' => ['int', 'timezone'=>'IntlTimeZone'], -'intltz_get_error_message' => ['string', 'timezone'=>'IntlTimeZone'], -'intltz_get_id' => ['string', 'timezone'=>'IntlTimeZone'], -'intltz_get_offset' => ['int', 'timezone'=>'IntlTimeZone', 'timestamp'=>'float', 'local'=>'bool', '&rawOffset'=>'int', '&dstOffset'=>'int'], -'intltz_get_raw_offset' => ['int', 'timezone'=>'IntlTimeZone'], -'intltz_get_tz_data_version' => ['string', 'object'=>'IntlTimeZone'], -'intltz_getGMT' => ['IntlTimeZone'], -'intltz_has_same_rules' => ['bool', 'timezone'=>'IntlTimeZone', 'other'=>'IntlTimeZone'], -'intltz_to_date_time_zone' => ['DateTimeZone', 'timezone'=>'IntlTimeZone'], -'intltz_use_daylight_time' => ['bool', 'timezone'=>'IntlTimeZone'], -'intlz_create_default' => ['IntlTimeZone'], -'intval' => ['int', 'value'=>'mixed', 'base='=>'int'], -'InvalidArgumentException::__clone' => ['void'], -'InvalidArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?InvalidArgumentException'], -'InvalidArgumentException::__toString' => ['string'], -'InvalidArgumentException::getCode' => ['int'], -'InvalidArgumentException::getFile' => ['string'], -'InvalidArgumentException::getLine' => ['int'], -'InvalidArgumentException::getMessage' => ['string'], -'InvalidArgumentException::getPrevious' => ['Throwable|InvalidArgumentException|null'], -'InvalidArgumentException::getTrace' => ['list\',args?:array}>'], -'InvalidArgumentException::getTraceAsString' => ['string'], -'ip2long' => ['int|false', 'ip'=>'string'], -'iptcembed' => ['string|bool', 'iptc_data'=>'string', 'filename'=>'string', 'spool='=>'int'], -'iptcparse' => ['array|false', 'iptc_block'=>'string'], -'is_a' => ['bool', 'object_or_class'=>'mixed', 'class'=>'string', 'allow_string='=>'bool'], -'is_array' => ['bool', 'value'=>'mixed'], -'is_bool' => ['bool', 'value'=>'mixed'], -'is_callable' => ['bool', 'value'=>'callable|mixed', 'syntax_only='=>'bool', '&w_callable_name='=>'string'], -'is_countable' => ['bool', 'value'=>'mixed'], -'is_dir' => ['bool', 'filename'=>'string'], -'is_double' => ['bool', 'value'=>'mixed'], -'is_executable' => ['bool', 'filename'=>'string'], -'is_file' => ['bool', 'filename'=>'string'], -'is_finite' => ['bool', 'num'=>'float'], -'is_float' => ['bool', 'value'=>'mixed'], -'is_infinite' => ['bool', 'num'=>'float'], -'is_int' => ['bool', 'value'=>'mixed'], -'is_integer' => ['bool', 'value'=>'mixed'], -'is_iterable' => ['bool', 'value'=>'mixed'], -'is_link' => ['bool', 'filename'=>'string'], -'is_long' => ['bool', 'value'=>'mixed'], -'is_nan' => ['bool', 'num'=>'float'], -'is_null' => ['bool', 'value'=>'mixed'], -'is_numeric' => ['bool', 'value'=>'mixed'], -'is_object' => ['bool', 'value'=>'mixed'], -'is_readable' => ['bool', 'filename'=>'string'], -'is_real' => ['bool', 'value'=>'mixed'], -'is_resource' => ['bool', 'value'=>'mixed'], -'is_scalar' => ['bool', 'value'=>'mixed'], -'is_soap_fault' => ['bool', 'object'=>'mixed'], -'is_string' => ['bool', 'value'=>'mixed'], -'is_subclass_of' => ['bool', 'object_or_class'=>'object|string', 'class'=>'class-string', 'allow_string='=>'bool'], -'is_tainted' => ['bool', 'string'=>'string'], -'is_uploaded_file' => ['bool', 'filename'=>'string'], -'is_writable' => ['bool', 'filename'=>'string'], -'is_writeable' => ['bool', 'filename'=>'string'], -'isset' => ['bool', 'value'=>'mixed', '...rest='=>'mixed'], -'Iterator::current' => ['mixed'], -'Iterator::key' => ['mixed'], -'Iterator::next' => ['void'], -'Iterator::rewind' => ['void'], -'Iterator::valid' => ['bool'], -'iterator_apply' => ['0|positive-int', 'iterator'=>'Traversable', 'callback'=>'callable(mixed):bool', 'args='=>'array'], -'iterator_count' => ['0|positive-int', 'iterator'=>'Traversable'], -'iterator_to_array' => ['array', 'iterator'=>'Traversable', 'preserve_keys='=>'bool'], -'IteratorAggregate::getIterator' => ['Traversable'], -'IteratorIterator::__construct' => ['void', 'it'=>'Traversable'], -'IteratorIterator::current' => ['mixed'], -'IteratorIterator::getInnerIterator' => ['Iterator'], -'IteratorIterator::key' => ['mixed'], -'IteratorIterator::next' => ['void'], -'IteratorIterator::rewind' => ['void'], -'IteratorIterator::valid' => ['bool'], -'java_last_exception_clear' => ['void'], -'java_last_exception_get' => ['object'], -'java_reload' => ['array', 'new_jarpath'=>'string'], -'java_require' => ['array', 'new_classpath'=>'string'], -'java_set_encoding' => ['array', 'encoding'=>'string'], -'java_set_ignore_case' => ['void', 'ignore'=>'bool'], -'java_throw_exceptions' => ['void', 'throw'=>'bool'], -'JavaException::getCause' => ['object'], -'jddayofweek' => ['mixed', 'julian_day'=>'int', 'mode='=>'int'], -'jdmonthname' => ['string', 'julian_day'=>'int', 'mode'=>'int'], -'jdtofrench' => ['string', 'julian_day'=>'int'], -'jdtogregorian' => ['string', 'julian_day'=>'int'], -'jdtojewish' => ['string', 'julian_day'=>'int', 'hebrew='=>'bool', 'flags='=>'int'], -'jdtojulian' => ['string', 'julian_day'=>'int'], -'jdtounix' => ['int|false', 'julian_day'=>'int'], -'jewishtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], -'jobqueue_license_info' => ['array'], -'join' => ['string', 'separator'=>'string', 'array'=>'array'], -'join\'1' => ['string', 'separator'=>'array'], -'json_decode' => ['mixed', 'json'=>'string', 'associative='=>'bool', 'depth='=>'int', 'flags='=>'int'], -'json_encode' => ['string|false', 'value'=>'mixed', 'flags='=>'int', 'depth='=>'int'], -'json_last_error' => ['int'], -'json_last_error_msg' => ['string'], -'JsonException::__clone' => ['void'], -'JsonException::__construct' => ['void'], -'JsonException::__toString' => ['string'], -'JsonException::__wakeup' => ['void'], -'JsonException::getCode' => ['int'], -'JsonException::getFile' => ['string'], -'JsonException::getLine' => ['int'], -'JsonException::getMessage' => ['string'], -'JsonException::getPrevious' => ['?Throwable'], -'JsonException::getTrace' => ['list\',args?:array}>'], -'JsonException::getTraceAsString' => ['string'], -'JsonIncrementalParser::__construct' => ['void', 'depth'=>'', 'options'=>''], -'JsonIncrementalParser::get' => ['', 'options'=>''], -'JsonIncrementalParser::getError' => [''], -'JsonIncrementalParser::parse' => ['', 'json'=>''], -'JsonIncrementalParser::parseFile' => ['', 'filename'=>''], -'JsonIncrementalParser::reset' => [''], -'JsonSerializable::jsonSerialize' => ['mixed'], -'Judy::__construct' => ['void', 'judy_type'=>'int'], -'Judy::__destruct' => ['void'], -'Judy::byCount' => ['int', 'nth_index'=>'int'], -'Judy::count' => ['int', 'index_start='=>'int', 'index_end='=>'int'], -'Judy::first' => ['mixed', 'index='=>'mixed'], -'Judy::firstEmpty' => ['mixed', 'index='=>'mixed'], -'Judy::free' => ['int'], -'Judy::getType' => ['int'], -'Judy::last' => ['mixed', 'index='=>'string'], -'Judy::lastEmpty' => ['mixed', 'index='=>'int'], -'Judy::memoryUsage' => ['int'], -'Judy::next' => ['mixed', 'index'=>'mixed'], -'Judy::nextEmpty' => ['mixed', 'index'=>'mixed'], -'Judy::offsetExists' => ['bool', 'offset'=>'mixed'], -'Judy::offsetGet' => ['mixed', 'offset'=>'mixed'], -'Judy::offsetSet' => ['bool', 'offset'=>'mixed', 'value'=>'mixed'], -'Judy::offsetUnset' => ['bool', 'offset'=>'mixed'], -'Judy::prev' => ['mixed', 'index'=>'mixed'], -'Judy::prevEmpty' => ['mixed', 'index'=>'mixed'], -'Judy::size' => ['int'], -'judy_type' => ['int', 'array'=>'judy'], -'judy_version' => ['string'], -'juliantojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], -'kadm5_chpass_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'password'=>'string'], -'kadm5_create_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'password='=>'string', 'options='=>'array'], -'kadm5_delete_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string'], -'kadm5_destroy' => ['bool', 'handle'=>'resource'], -'kadm5_flush' => ['bool', 'handle'=>'resource'], -'kadm5_get_policies' => ['array', 'handle'=>'resource'], -'kadm5_get_principal' => ['array', 'handle'=>'resource', 'principal'=>'string'], -'kadm5_get_principals' => ['array', 'handle'=>'resource'], -'kadm5_init_with_password' => ['resource', 'admin_server'=>'string', 'realm'=>'string', 'principal'=>'string', 'password'=>'string'], -'kadm5_modify_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'options'=>'array'], -'key' => ['int|string|null', 'array'=>'array|object'], -'key_exists' => ['bool', 'key'=>'string|int', 'array'=>'array'], -'krsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], -'ksort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], -'KTaglib_ID3v2_AttachedPictureFrame::getDescription' => ['string'], -'KTaglib_ID3v2_AttachedPictureFrame::getMimeType' => ['string'], -'KTaglib_ID3v2_AttachedPictureFrame::getType' => ['int'], -'KTaglib_ID3v2_AttachedPictureFrame::savePicture' => ['bool', 'filename'=>'string'], -'KTaglib_ID3v2_AttachedPictureFrame::setMimeType' => ['string', 'type'=>'string'], -'KTaglib_ID3v2_AttachedPictureFrame::setPicture' => ['', 'filename'=>'string'], -'KTaglib_ID3v2_AttachedPictureFrame::setType' => ['', 'type'=>'int'], -'KTaglib_ID3v2_Frame::__toString' => ['string'], -'KTaglib_ID3v2_Frame::getDescription' => ['string'], -'KTaglib_ID3v2_Frame::getMimeType' => ['string'], -'KTaglib_ID3v2_Frame::getSize' => ['int'], -'KTaglib_ID3v2_Frame::getType' => ['int'], -'KTaglib_ID3v2_Frame::savePicture' => ['bool', 'filename'=>'string'], -'KTaglib_ID3v2_Frame::setMimeType' => ['string', 'type'=>'string'], -'KTaglib_ID3v2_Frame::setPicture' => ['void', 'filename'=>'string'], -'KTaglib_ID3v2_Frame::setType' => ['void', 'type'=>'int'], -'KTaglib_ID3v2_Tag::addFrame' => ['bool', 'frame'=>'KTaglib_ID3v2_Frame'], -'KTaglib_ID3v2_Tag::getFrameList' => ['array'], -'KTaglib_MPEG_AudioProperties::getBitrate' => ['int'], -'KTaglib_MPEG_AudioProperties::getChannels' => ['int'], -'KTaglib_MPEG_AudioProperties::getLayer' => ['int'], -'KTaglib_MPEG_AudioProperties::getLength' => ['int'], -'KTaglib_MPEG_AudioProperties::getSampleBitrate' => ['int'], -'KTaglib_MPEG_AudioProperties::getVersion' => ['int'], -'KTaglib_MPEG_AudioProperties::isCopyrighted' => ['bool'], -'KTaglib_MPEG_AudioProperties::isOriginal' => ['bool'], -'KTaglib_MPEG_AudioProperties::isProtectionEnabled' => ['bool'], -'KTaglib_MPEG_File::getAudioProperties' => ['KTaglib_MPEG_File'], -'KTaglib_MPEG_File::getID3v1Tag' => ['KTaglib_ID3v1_Tag', 'create='=>'bool'], -'KTaglib_MPEG_File::getID3v2Tag' => ['KTaglib_ID3v2_Tag', 'create='=>'bool'], -'KTaglib_Tag::getAlbum' => ['string'], -'KTaglib_Tag::getArtist' => ['string'], -'KTaglib_Tag::getComment' => ['string'], -'KTaglib_Tag::getGenre' => ['string'], -'KTaglib_Tag::getTitle' => ['string'], -'KTaglib_Tag::getTrack' => ['int'], -'KTaglib_Tag::getYear' => ['int'], -'KTaglib_Tag::isEmpty' => ['bool'], -'labelcacheObj::freeCache' => ['bool'], -'labelObj::__construct' => ['void'], -'labelObj::convertToString' => ['string'], -'labelObj::deleteStyle' => ['int', 'index'=>'int'], -'labelObj::free' => ['void'], -'labelObj::getBinding' => ['string', 'labelbinding'=>'mixed'], -'labelObj::getExpressionString' => ['string'], -'labelObj::getStyle' => ['styleObj', 'index'=>'int'], -'labelObj::getTextString' => ['string'], -'labelObj::moveStyleDown' => ['int', 'index'=>'int'], -'labelObj::moveStyleUp' => ['int', 'index'=>'int'], -'labelObj::removeBinding' => ['int', 'labelbinding'=>'mixed'], -'labelObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'labelObj::setBinding' => ['int', 'labelbinding'=>'mixed', 'value'=>'string'], -'labelObj::setExpression' => ['int', 'expression'=>'string'], -'labelObj::setText' => ['int', 'text'=>'string'], -'labelObj::updateFromString' => ['int', 'snippet'=>'string'], -'Lapack::eigenValues' => ['array', 'a'=>'array', 'left='=>'array', 'right='=>'array'], -'Lapack::identity' => ['array', 'n'=>'int'], -'Lapack::leastSquaresByFactorisation' => ['array', 'a'=>'array', 'b'=>'array'], -'Lapack::leastSquaresBySVD' => ['array', 'a'=>'array', 'b'=>'array'], -'Lapack::pseudoInverse' => ['array', 'a'=>'array'], -'Lapack::singularValues' => ['array', 'a'=>'array'], -'Lapack::solveLinearEquation' => ['array', 'a'=>'array', 'b'=>'array'], -'layerObj::addFeature' => ['int', 'shape'=>'shapeObj'], -'layerObj::applySLD' => ['int', 'sldxml'=>'string', 'namedlayer'=>'string'], -'layerObj::applySLDURL' => ['int', 'sldurl'=>'string', 'namedlayer'=>'string'], -'layerObj::clearProcessing' => ['void'], -'layerObj::close' => ['void'], -'layerObj::convertToString' => ['string'], -'layerObj::draw' => ['int', 'image'=>'imageObj'], -'layerObj::drawQuery' => ['int', 'image'=>'imageObj'], -'layerObj::free' => ['void'], -'layerObj::generateSLD' => ['string'], -'layerObj::getClass' => ['classObj', 'classIndex'=>'int'], -'layerObj::getClassIndex' => ['int', 'shape'=>'', 'classgroup'=>'', 'numclasses'=>''], -'layerObj::getExtent' => ['rectObj'], -'layerObj::getFilterString' => ['?string'], -'layerObj::getGridIntersectionCoordinates' => ['array'], -'layerObj::getItems' => ['array'], -'layerObj::getMetaData' => ['int', 'name'=>'string'], -'layerObj::getNumResults' => ['int'], -'layerObj::getProcessing' => ['array'], -'layerObj::getProjection' => ['string'], -'layerObj::getResult' => ['resultObj', 'index'=>'int'], -'layerObj::getResultsBounds' => ['rectObj'], -'layerObj::getShape' => ['shapeObj', 'result'=>'resultObj'], -'layerObj::getWMSFeatureInfoURL' => ['string', 'clickX'=>'int', 'clickY'=>'int', 'featureCount'=>'int', 'infoFormat'=>'string'], -'layerObj::isVisible' => ['bool'], -'layerObj::moveclassdown' => ['int', 'index'=>'int'], -'layerObj::moveclassup' => ['int', 'index'=>'int'], -'layerObj::ms_newLayerObj' => ['layerObj', 'map'=>'mapObj', 'layer'=>'layerObj'], -'layerObj::nextShape' => ['shapeObj'], -'layerObj::open' => ['int'], -'layerObj::queryByAttributes' => ['int', 'qitem'=>'string', 'qstring'=>'string', 'mode'=>'int'], -'layerObj::queryByFeatures' => ['int', 'slayer'=>'int'], -'layerObj::queryByPoint' => ['int', 'point'=>'pointObj', 'mode'=>'int', 'buffer'=>'float'], -'layerObj::queryByRect' => ['int', 'rect'=>'rectObj'], -'layerObj::queryByShape' => ['int', 'shape'=>'shapeObj'], -'layerObj::removeClass' => ['?classObj', 'index'=>'int'], -'layerObj::removeMetaData' => ['int', 'name'=>'string'], -'layerObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'layerObj::setConnectionType' => ['int', 'connectiontype'=>'int', 'plugin_library'=>'string'], -'layerObj::setFilter' => ['int', 'expression'=>'string'], -'layerObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], -'layerObj::setProjection' => ['int', 'proj_params'=>'string'], -'layerObj::setWKTProjection' => ['int', 'proj_params'=>'string'], -'layerObj::updateFromString' => ['int', 'snippet'=>'string'], -'lcfirst' => ['string', 'string'=>'string'], -'lcg_value' => ['float'], -'lchgrp' => ['bool', 'filename'=>'string', 'group'=>'string|int'], -'lchown' => ['bool', 'filename'=>'string', 'user'=>'string|int'], -'ldap_8859_to_t61' => ['string', 'value'=>'string'], -'ldap_add' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], -'ldap_add_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], -'ldap_bind' => ['bool', 'ldap'=>'LDAP\Connection', 'dn='=>'string|null', 'password='=>'string|null'], -'ldap_bind_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn='=>'string|null', 'password='=>'string|null', 'controls='=>'?array'], -'ldap_close' => ['bool', 'ldap'=>'LDAP\Connection'], -'ldap_compare' => ['bool|int', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'attribute'=>'string', 'value'=>'string', 'controls='=>'?array'], -'ldap_connect' => ['LDAP\Connection|false', 'uri='=>'string', 'port='=>'int', 'wallet='=>'string', 'password='=>'string', 'auth_mode='=>'int'], -'ldap_count_entries' => ['int|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], -'ldap_delete' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'controls='=>'?array'], -'ldap_delete_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'controls='=>'?array'], -'ldap_dn2ufn' => ['string', 'dn'=>'string'], -'ldap_err2str' => ['string', 'errno'=>'int'], -'ldap_errno' => ['int', 'ldap'=>'LDAP\Connection'], -'ldap_error' => ['string', 'ldap'=>'LDAP\Connection'], -'ldap_escape' => ['string', 'value'=>'string', 'ignore='=>'string', 'flags='=>'int'], -'ldap_exop' => ['mixed', 'ldap'=>'LDAP\Connection', 'request_oid'=>'string', 'request_data='=>'string', 'controls='=>'?array', '&w_response_data='=>'string', '&w_response_oid='=>'string'], -'ldap_exop_passwd' => ['bool|string', 'ldap'=>'LDAP\Connection', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array|null'], -'ldap_exop_refresh' => ['int|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'ttl'=>'int'], -'ldap_exop_whoami' => ['string|false', 'ldap'=>'LDAP\Connection'], -'ldap_explode_dn' => ['array|false', 'dn'=>'string', 'with_attrib'=>'int'], -'ldap_first_attribute' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], -'ldap_first_entry' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], -'ldap_first_reference' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], -'ldap_free_result' => ['bool', 'result'=>'LDAP\Result'], -'ldap_get_attributes' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], -'ldap_get_dn' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], -'ldap_get_entries' => ['array|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], -'ldap_get_option' => ['bool', 'ldap'=>'LDAP\Connection', 'option'=>'int', '&w_value='=>'array|string|int|null'], -'ldap_get_values' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', 'attribute'=>'string'], -'ldap_get_values_len' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', 'attribute'=>'string'], -'ldap_list' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], -'ldap_mod_add' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], -'ldap_mod_add_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], -'ldap_mod_del' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], -'ldap_mod_del_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], -'ldap_mod_replace' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], -'ldap_mod_replace_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], -'ldap_modify' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], -'ldap_modify_batch' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'modifications_info'=>'array', 'controls='=>'?array'], -'ldap_next_attribute' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], -'ldap_next_entry' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], -'ldap_next_reference' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], -'ldap_parse_exop' => ['bool', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result', '&w_response_data='=>'string', '&w_response_oid='=>'string'], -'ldap_parse_reference' => ['bool', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', '&w_referrals'=>'array'], -'ldap_parse_result' => ['bool', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result', '&w_error_code'=>'int', '&w_matched_dn='=>'string', '&w_error_message='=>'string', '&w_referrals='=>'array', '&w_controls='=>'array'], -'ldap_read' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], -'ldap_rename' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'?array'], -'ldap_rename_ext' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'?array'], -'ldap_sasl_bind' => ['bool', 'ldap'=>'LDAP\Connection', 'dn='=>'string', 'password='=>'string', 'mech='=>'string', 'realm='=>'string', 'authc_id='=>'string', 'authz_id='=>'string', 'props='=>'string'], -'ldap_search' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], -'ldap_set_option' => ['bool', 'ldap'=>'LDAP\Connection|null', 'option'=>'int', 'value'=>'mixed'], -'ldap_set_rebind_proc' => ['bool', 'ldap'=>'LDAP\Connection', 'callback'=>'?callable'], -'ldap_start_tls' => ['bool', 'ldap'=>'LDAP\Connection'], -'ldap_t61_to_8859' => ['string', 'value'=>'string'], -'ldap_unbind' => ['bool', 'ldap'=>'LDAP\Connection'], -'leak' => ['', 'num_bytes'=>'int'], -'leak_variable' => ['', 'variable'=>'', 'leak_data'=>'bool'], -'legendObj::convertToString' => ['string'], -'legendObj::free' => ['void'], -'legendObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'legendObj::updateFromString' => ['int', 'snippet'=>'string'], -'LengthException::__clone' => ['void'], -'LengthException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?LengthException'], -'LengthException::__toString' => ['string'], -'LengthException::getCode' => ['int'], -'LengthException::getFile' => ['string'], -'LengthException::getLine' => ['int'], -'LengthException::getMessage' => ['string'], -'LengthException::getPrevious' => ['Throwable|LengthException|null'], -'LengthException::getTrace' => ['list\',args?:array}>'], -'LengthException::getTraceAsString' => ['string'], -'LevelDB::__construct' => ['void', 'name'=>'string', 'options='=>'array', 'read_options='=>'array', 'write_options='=>'array'], -'LevelDB::close' => [''], -'LevelDB::compactRange' => ['', 'start'=>'', 'limit'=>''], -'LevelDB::delete' => ['bool', 'key'=>'string', 'write_options='=>'array'], -'LevelDB::destroy' => ['', 'name'=>'', 'options='=>'array'], -'LevelDB::get' => ['bool|string', 'key'=>'string', 'read_options='=>'array'], -'LevelDB::getApproximateSizes' => ['', 'start'=>'', 'limit'=>''], -'LevelDB::getIterator' => ['LevelDBIterator', 'options='=>'array'], -'LevelDB::getProperty' => ['mixed', 'name'=>'string'], -'LevelDB::getSnapshot' => ['LevelDBSnapshot'], -'LevelDB::put' => ['', 'key'=>'string', 'value'=>'string', 'write_options='=>'array'], -'LevelDB::repair' => ['', 'name'=>'', 'options='=>'array'], -'LevelDB::set' => ['', 'key'=>'string', 'value'=>'string', 'write_options='=>'array'], -'LevelDB::write' => ['', 'batch'=>'LevelDBWriteBatch', 'write_options='=>'array'], -'LevelDBIterator::__construct' => ['void', 'db'=>'LevelDB', 'read_options='=>'array'], -'LevelDBIterator::current' => ['mixed'], -'LevelDBIterator::destroy' => [''], -'LevelDBIterator::getError' => [''], -'LevelDBIterator::key' => ['int|string'], -'LevelDBIterator::last' => [''], -'LevelDBIterator::next' => ['void'], -'LevelDBIterator::prev' => [''], -'LevelDBIterator::rewind' => ['void'], -'LevelDBIterator::seek' => ['', 'key'=>''], -'LevelDBIterator::valid' => ['bool'], -'LevelDBSnapshot::__construct' => ['void', 'db'=>'LevelDB'], -'LevelDBSnapshot::release' => [''], -'LevelDBWriteBatch::__construct' => ['void', 'name'=>'', 'options='=>'array', 'read_options='=>'array', 'write_options='=>'array'], -'LevelDBWriteBatch::clear' => [''], -'LevelDBWriteBatch::delete' => ['', 'key'=>'', 'write_options='=>'array'], -'LevelDBWriteBatch::put' => ['', 'key'=>'', 'value'=>'', 'write_options='=>'array'], -'LevelDBWriteBatch::set' => ['', 'key'=>'', 'value'=>'', 'write_options='=>'array'], -'levenshtein' => ['int', 'string1'=>'string', 'string2'=>'string'], -'levenshtein\'1' => ['int', 'string1'=>'string', 'string2'=>'string', 'insertion_cost'=>'int', 'repetition_cost'=>'int', 'deletion_cost'=>'int'], -'libxml_clear_errors' => ['void'], -'libxml_disable_entity_loader' => ['bool', 'disable='=>'bool'], -'libxml_get_errors' => ['array'], -'libxml_get_last_error' => ['LibXMLError|false'], -'libxml_set_external_entity_loader' => ['bool', 'resolver_function'=>'callable'], -'libxml_set_streams_context' => ['void', 'context'=>'resource'], -'libxml_use_internal_errors' => ['bool', 'use_errors='=>'bool'], -'LimitIterator::__construct' => ['void', 'iterator'=>'Iterator', 'offset='=>'int', 'count='=>'int'], -'LimitIterator::current' => ['mixed'], -'LimitIterator::getInnerIterator' => ['Iterator'], -'LimitIterator::getPosition' => ['int'], -'LimitIterator::key' => ['mixed'], -'LimitIterator::next' => ['void'], -'LimitIterator::rewind' => ['void'], -'LimitIterator::seek' => ['int', 'position'=>'int'], -'LimitIterator::valid' => ['bool'], -'lineObj::__construct' => ['void'], -'lineObj::add' => ['int', 'point'=>'pointObj'], -'lineObj::addXY' => ['int', 'x'=>'float', 'y'=>'float', 'm'=>'float'], -'lineObj::addXYZ' => ['int', 'x'=>'float', 'y'=>'float', 'z'=>'float', 'm'=>'float'], -'lineObj::ms_newLineObj' => ['lineObj'], -'lineObj::point' => ['pointObj', 'i'=>'int'], -'lineObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], -'link' => ['bool', 'target'=>'string', 'link'=>'string'], -'linkinfo' => ['int|false', 'path'=>'string'], -'litespeed_request_headers' => ['array'], -'litespeed_response_headers' => ['array'], -'Locale::acceptFromHttp' => ['string|false', 'header'=>'string'], -'Locale::canonicalize' => ['string', 'locale'=>'string'], -'Locale::composeLocale' => ['string', 'subtags'=>'array'], -'Locale::filterMatches' => ['bool', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'], -'Locale::getAllVariants' => ['array', 'locale'=>'string'], -'Locale::getDefault' => ['string'], -'Locale::getDisplayLanguage' => ['string', 'locale'=>'string', 'in_locale='=>'string'], -'Locale::getDisplayName' => ['string', 'locale'=>'string', 'in_locale='=>'string'], -'Locale::getDisplayRegion' => ['string', 'locale'=>'string', 'in_locale='=>'string'], -'Locale::getDisplayScript' => ['string', 'locale'=>'string', 'in_locale='=>'string'], -'Locale::getDisplayVariant' => ['string', 'locale'=>'string', 'in_locale='=>'string'], -'Locale::getKeywords' => ['array|false', 'locale'=>'string'], -'Locale::getPrimaryLanguage' => ['string', 'locale'=>'string'], -'Locale::getRegion' => ['string', 'locale'=>'string'], -'Locale::getScript' => ['string', 'locale'=>'string'], -'Locale::lookup' => ['string', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'default='=>'string'], -'Locale::parseLocale' => ['array', 'locale'=>'string'], -'Locale::setDefault' => ['bool', 'locale'=>'string'], -'locale_accept_from_http' => ['string|false', 'header'=>'string'], -'locale_canonicalize' => ['?string', 'locale'=>'string'], -'locale_compose' => ['string|false', 'subtags'=>'array'], -'locale_filter_matches' => ['?bool', 'languageTag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'], -'locale_get_all_variants' => ['?array', 'locale'=>'string'], -'locale_get_default' => ['string'], -'locale_get_display_language' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], -'locale_get_display_name' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], -'locale_get_display_region' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], -'locale_get_display_script' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], -'locale_get_display_variant' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], -'locale_get_keywords' => ['array|false|null', 'locale'=>'string'], -'locale_get_primary_language' => ['?string', 'locale'=>'string'], -'locale_get_region' => ['?string', 'locale'=>'string'], -'locale_get_script' => ['?string', 'locale'=>'string'], -'locale_lookup' => ['?string', 'languageTag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'defaultLocale='=>'string'], -'locale_parse' => ['?array', 'locale'=>'string'], -'locale_set_default' => ['bool', 'locale'=>'string'], -'localeconv' => ['array'], -'localtime' => ['array', 'timestamp='=>'int', 'associative='=>'bool'], -'log' => ['float', 'num'=>'float', 'base='=>'float'], -'log10' => ['float', 'num'=>'float'], -'log1p' => ['float', 'num'=>'float'], -'LogicException::__clone' => ['void'], -'LogicException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?LogicException'], -'LogicException::__toString' => ['string'], -'LogicException::getCode' => ['int'], -'LogicException::getFile' => ['string'], -'LogicException::getLine' => ['int'], -'LogicException::getMessage' => ['string'], -'LogicException::getPrevious' => ['Throwable|LogicException|null'], -'LogicException::getTrace' => ['list\',args?:array}>'], -'LogicException::getTraceAsString' => ['string'], -'long2ip' => ['string', 'ip'=>'string|int'], -'lstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'filename'=>'string'], -'ltrim' => ['string', 'string'=>'string', 'characters='=>'string'], -'Lua::__call' => ['mixed', 'lua_func'=>'callable', 'args='=>'array', 'use_self='=>'int'], -'Lua::__construct' => ['void', 'lua_script_file'=>'string'], -'Lua::assign' => ['?Lua', 'name'=>'string', 'value'=>'mixed'], -'Lua::call' => ['mixed', 'lua_func'=>'callable', 'args='=>'array', 'use_self='=>'int'], -'Lua::eval' => ['mixed', 'statements'=>'string'], -'Lua::getVersion' => ['string'], -'Lua::include' => ['mixed', 'file'=>'string'], -'Lua::registerCallback' => ['Lua|null|false', 'name'=>'string', 'function'=>'callable'], -'LuaClosure::__invoke' => ['void', 'arg'=>'mixed', '...args='=>'mixed'], -'lzf_compress' => ['string', 'data'=>'string'], -'lzf_decompress' => ['string', 'data'=>'string'], -'lzf_optimized_for' => ['int'], -'m_checkstatus' => ['int', 'conn'=>'resource', 'identifier'=>'int'], -'m_completeauthorizations' => ['int', 'conn'=>'resource', 'array'=>'int'], -'m_connect' => ['int', 'conn'=>'resource'], -'m_connectionerror' => ['string', 'conn'=>'resource'], -'m_deletetrans' => ['bool', 'conn'=>'resource', 'identifier'=>'int'], -'m_destroyconn' => ['bool', 'conn'=>'resource'], -'m_destroyengine' => ['void'], -'m_getcell' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column'=>'string', 'row'=>'int'], -'m_getcellbynum' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column'=>'int', 'row'=>'int'], -'m_getcommadelimited' => ['string', 'conn'=>'resource', 'identifier'=>'int'], -'m_getheader' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column_num'=>'int'], -'m_initconn' => ['resource'], -'m_initengine' => ['int', 'location'=>'string'], -'m_iscommadelimited' => ['int', 'conn'=>'resource', 'identifier'=>'int'], -'m_maxconntimeout' => ['bool', 'conn'=>'resource', 'secs'=>'int'], -'m_monitor' => ['int', 'conn'=>'resource'], -'m_numcolumns' => ['int', 'conn'=>'resource', 'identifier'=>'int'], -'m_numrows' => ['int', 'conn'=>'resource', 'identifier'=>'int'], -'m_parsecommadelimited' => ['int', 'conn'=>'resource', 'identifier'=>'int'], -'m_responsekeys' => ['array', 'conn'=>'resource', 'identifier'=>'int'], -'m_responseparam' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'key'=>'string'], -'m_returnstatus' => ['int', 'conn'=>'resource', 'identifier'=>'int'], -'m_setblocking' => ['int', 'conn'=>'resource', 'tf'=>'int'], -'m_setdropfile' => ['int', 'conn'=>'resource', 'directory'=>'string'], -'m_setip' => ['int', 'conn'=>'resource', 'host'=>'string', 'port'=>'int'], -'m_setssl' => ['int', 'conn'=>'resource', 'host'=>'string', 'port'=>'int'], -'m_setssl_cafile' => ['int', 'conn'=>'resource', 'cafile'=>'string'], -'m_setssl_files' => ['int', 'conn'=>'resource', 'sslkeyfile'=>'string', 'sslcertfile'=>'string'], -'m_settimeout' => ['int', 'conn'=>'resource', 'seconds'=>'int'], -'m_sslcert_gen_hash' => ['string', 'filename'=>'string'], -'m_transactionssent' => ['int', 'conn'=>'resource'], -'m_transinqueue' => ['int', 'conn'=>'resource'], -'m_transkeyval' => ['int', 'conn'=>'resource', 'identifier'=>'int', 'key'=>'string', 'value'=>'string'], -'m_transnew' => ['int', 'conn'=>'resource'], -'m_transsend' => ['int', 'conn'=>'resource', 'identifier'=>'int'], -'m_uwait' => ['int', 'microsecs'=>'int'], -'m_validateidentifier' => ['int', 'conn'=>'resource', 'tf'=>'int'], -'m_verifyconnection' => ['bool', 'conn'=>'resource', 'tf'=>'int'], -'m_verifysslcert' => ['bool', 'conn'=>'resource', 'tf'=>'int'], -'magic_quotes_runtime' => ['bool', 'new_setting'=>'bool'], -'mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array|null', 'additional_params='=>'string'], -'mailparse_determine_best_xfer_encoding' => ['string', 'fp'=>'resource'], -'mailparse_msg_create' => ['resource'], -'mailparse_msg_extract_part' => ['void', 'mimemail'=>'resource', 'msgbody'=>'string', 'callbackfunc='=>'callable'], -'mailparse_msg_extract_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'mixed', 'callbackfunc='=>'callable'], -'mailparse_msg_extract_whole_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'string', 'callbackfunc='=>'callable'], -'mailparse_msg_free' => ['bool', 'mimemail'=>'resource'], -'mailparse_msg_get_part' => ['resource', 'mimemail'=>'resource', 'mimesection'=>'string'], -'mailparse_msg_get_part_data' => ['array', 'mimemail'=>'resource'], -'mailparse_msg_get_structure' => ['array', 'mimemail'=>'resource'], -'mailparse_msg_parse' => ['bool', 'mimemail'=>'resource', 'data'=>'string'], -'mailparse_msg_parse_file' => ['resource|false', 'filename'=>'string'], -'mailparse_rfc822_parse_addresses' => ['array', 'addresses'=>'string'], -'mailparse_stream_encode' => ['bool', 'sourcefp'=>'resource', 'destfp'=>'resource', 'encoding'=>'string'], -'mailparse_uudecode_all' => ['array', 'fp'=>'resource'], -'mapObj::__construct' => ['void', 'map_file_name'=>'string', 'new_map_path'=>'string'], -'mapObj::appendOutputFormat' => ['int', 'outputFormat'=>'outputformatObj'], -'mapObj::applyconfigoptions' => ['int'], -'mapObj::applySLD' => ['int', 'sldxml'=>'string'], -'mapObj::applySLDURL' => ['int', 'sldurl'=>'string'], -'mapObj::convertToString' => ['string'], -'mapObj::draw' => ['?imageObj'], -'mapObj::drawLabelCache' => ['int', 'image'=>'imageObj'], -'mapObj::drawLegend' => ['imageObj'], -'mapObj::drawQuery' => ['?imageObj'], -'mapObj::drawReferenceMap' => ['imageObj'], -'mapObj::drawScaleBar' => ['imageObj'], -'mapObj::embedLegend' => ['int', 'image'=>'imageObj'], -'mapObj::embedScalebar' => ['int', 'image'=>'imageObj'], -'mapObj::free' => ['void'], -'mapObj::generateSLD' => ['string'], -'mapObj::getAllGroupNames' => ['array'], -'mapObj::getAllLayerNames' => ['array'], -'mapObj::getColorbyIndex' => ['colorObj', 'iCloIndex'=>'int'], -'mapObj::getConfigOption' => ['string', 'key'=>'string'], -'mapObj::getLabel' => ['labelcacheMemberObj', 'index'=>'int'], -'mapObj::getLayer' => ['layerObj', 'index'=>'int'], -'mapObj::getLayerByName' => ['layerObj', 'layer_name'=>'string'], -'mapObj::getLayersDrawingOrder' => ['array'], -'mapObj::getLayersIndexByGroup' => ['array', 'groupname'=>'string'], -'mapObj::getMetaData' => ['int', 'name'=>'string'], -'mapObj::getNumSymbols' => ['int'], -'mapObj::getOutputFormat' => ['?outputformatObj', 'index'=>'int'], -'mapObj::getProjection' => ['string'], -'mapObj::getSymbolByName' => ['int', 'symbol_name'=>'string'], -'mapObj::getSymbolObjectById' => ['symbolObj', 'symbolid'=>'int'], -'mapObj::loadMapContext' => ['int', 'filename'=>'string', 'unique_layer_name'=>'bool'], -'mapObj::loadOWSParameters' => ['int', 'request'=>'OwsrequestObj', 'version'=>'string'], -'mapObj::moveLayerDown' => ['int', 'layerindex'=>'int'], -'mapObj::moveLayerUp' => ['int', 'layerindex'=>'int'], -'mapObj::ms_newMapObjFromString' => ['mapObj', 'map_file_string'=>'string', 'new_map_path'=>'string'], -'mapObj::offsetExtent' => ['int', 'x'=>'float', 'y'=>'float'], -'mapObj::owsDispatch' => ['int', 'request'=>'OwsrequestObj'], -'mapObj::prepareImage' => ['imageObj'], -'mapObj::prepareQuery' => ['void'], -'mapObj::processLegendTemplate' => ['string', 'params'=>'array'], -'mapObj::processQueryTemplate' => ['string', 'params'=>'array', 'generateimages'=>'bool'], -'mapObj::processTemplate' => ['string', 'params'=>'array', 'generateimages'=>'bool'], -'mapObj::queryByFeatures' => ['int', 'slayer'=>'int'], -'mapObj::queryByIndex' => ['int', 'layerindex'=>'', 'tileindex'=>'', 'shapeindex'=>'', 'addtoquery'=>''], -'mapObj::queryByPoint' => ['int', 'point'=>'pointObj', 'mode'=>'int', 'buffer'=>'float'], -'mapObj::queryByRect' => ['int', 'rect'=>'rectObj'], -'mapObj::queryByShape' => ['int', 'shape'=>'shapeObj'], -'mapObj::removeLayer' => ['layerObj', 'nIndex'=>'int'], -'mapObj::removeMetaData' => ['int', 'name'=>'string'], -'mapObj::removeOutputFormat' => ['int', 'name'=>'string'], -'mapObj::save' => ['int', 'filename'=>'string'], -'mapObj::saveMapContext' => ['int', 'filename'=>'string'], -'mapObj::saveQuery' => ['int', 'filename'=>'string', 'results'=>'int'], -'mapObj::scaleExtent' => ['int', 'zoomfactor'=>'float', 'minscaledenom'=>'float', 'maxscaledenom'=>'float'], -'mapObj::selectOutputFormat' => ['int', 'type'=>'string'], -'mapObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'mapObj::setCenter' => ['int', 'center'=>'pointObj'], -'mapObj::setConfigOption' => ['int', 'key'=>'string', 'value'=>'string'], -'mapObj::setExtent' => ['void', 'minx'=>'float', 'miny'=>'float', 'maxx'=>'float', 'maxy'=>'float'], -'mapObj::setFontSet' => ['int', 'fileName'=>'string'], -'mapObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], -'mapObj::setProjection' => ['int', 'proj_params'=>'string', 'bSetUnitsAndExtents'=>'bool'], -'mapObj::setRotation' => ['int', 'rotation_angle'=>'float'], -'mapObj::setSize' => ['int', 'width'=>'int', 'height'=>'int'], -'mapObj::setSymbolSet' => ['int', 'fileName'=>'string'], -'mapObj::setWKTProjection' => ['int', 'proj_params'=>'string', 'bSetUnitsAndExtents'=>'bool'], -'mapObj::zoomPoint' => ['int', 'nZoomFactor'=>'int', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'], -'mapObj::zoomRectangle' => ['int', 'oPixelExt'=>'rectObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'], -'mapObj::zoomScale' => ['int', 'nScaleDenom'=>'float', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj', 'oMaxGeorefExt'=>'rectObj'], -'max' => ['mixed', 'value'=>'non-empty-array'], -'max\'1' => ['mixed', 'value'=>'', 'values'=>'', '...args='=>''], -'maxdb::__construct' => ['void', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], -'maxdb::affected_rows' => ['int', 'link'=>''], -'maxdb::auto_commit' => ['bool', 'link'=>'', 'mode'=>'bool'], -'maxdb::change_user' => ['bool', 'link'=>'', 'user'=>'string', 'password'=>'string', 'database'=>'string'], -'maxdb::character_set_name' => ['string', 'link'=>''], -'maxdb::close' => ['bool', 'link'=>''], -'maxdb::commit' => ['bool', 'link'=>''], -'maxdb::disable_reads_from_master' => ['', 'link'=>''], -'maxdb::errno' => ['int', 'link'=>''], -'maxdb::error' => ['string', 'link'=>''], -'maxdb::field_count' => ['int', 'link'=>''], -'maxdb::get_host_info' => ['string', 'link'=>''], -'maxdb::info' => ['string', 'link'=>''], -'maxdb::insert_id' => ['', 'link'=>''], -'maxdb::kill' => ['bool', 'link'=>'', 'processid'=>'int'], -'maxdb::more_results' => ['bool', 'link'=>''], -'maxdb::multi_query' => ['bool', 'link'=>'', 'query'=>'string'], -'maxdb::next_result' => ['bool', 'link'=>''], -'maxdb::num_rows' => ['int', 'result'=>''], -'maxdb::options' => ['bool', 'link'=>'', 'option'=>'int', 'value'=>''], -'maxdb::ping' => ['bool', 'link'=>''], -'maxdb::prepare' => ['maxdb_stmt', 'link'=>'', 'query'=>'string'], -'maxdb::protocol_version' => ['string', 'link'=>''], -'maxdb::query' => ['', 'link'=>'', 'query'=>'string', 'resultmode='=>'int'], -'maxdb::real_connect' => ['bool', 'link'=>'', 'hostname='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], -'maxdb::real_escape_string' => ['string', 'link'=>'', 'escapestr'=>'string'], -'maxdb::real_query' => ['bool', 'link'=>'', 'query'=>'string'], -'maxdb::rollback' => ['bool', 'link'=>''], -'maxdb::rpl_query_type' => ['int', 'link'=>''], -'maxdb::select_db' => ['bool', 'link'=>'', 'dbname'=>'string'], -'maxdb::send_query' => ['bool', 'link'=>'', 'query'=>'string'], -'maxdb::server_info' => ['string', 'link'=>''], -'maxdb::server_version' => ['int', 'link'=>''], -'maxdb::sqlstate' => ['string', 'link'=>''], -'maxdb::ssl_set' => ['bool', 'link'=>'', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], -'maxdb::stat' => ['string', 'link'=>''], -'maxdb::stmt_init' => ['object', 'link'=>''], -'maxdb::store_result' => ['bool', 'link'=>''], -'maxdb::thread_id' => ['int', 'link'=>''], -'maxdb::use_result' => ['resource', 'link'=>''], -'maxdb::warning_count' => ['int', 'link'=>''], -'maxdb_affected_rows' => ['int', 'link'=>'resource'], -'maxdb_autocommit' => ['bool', 'link'=>'', 'mode'=>'bool'], -'maxdb_change_user' => ['bool', 'link'=>'', 'user'=>'string', 'password'=>'string', 'database'=>'string'], -'maxdb_character_set_name' => ['string', 'link'=>''], -'maxdb_close' => ['bool', 'link'=>''], -'maxdb_commit' => ['bool', 'link'=>''], -'maxdb_connect' => ['resource', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], -'maxdb_connect_errno' => ['int'], -'maxdb_connect_error' => ['string'], -'maxdb_data_seek' => ['bool', 'result'=>'', 'offset'=>'int'], -'maxdb_debug' => ['void', 'debug'=>'string'], -'maxdb_disable_reads_from_master' => ['', 'link'=>''], -'maxdb_disable_rpl_parse' => ['bool', 'link'=>'resource'], -'maxdb_dump_debug_info' => ['bool', 'link'=>'resource'], -'maxdb_embedded_connect' => ['resource', 'dbname='=>'string'], -'maxdb_enable_reads_from_master' => ['bool', 'link'=>'resource'], -'maxdb_enable_rpl_parse' => ['bool', 'link'=>'resource'], -'maxdb_errno' => ['int', 'link'=>'resource'], -'maxdb_error' => ['string', 'link'=>'resource'], -'maxdb_fetch_array' => ['', 'result'=>'', 'resulttype='=>'int'], -'maxdb_fetch_assoc' => ['array', 'result'=>''], -'maxdb_fetch_field' => ['', 'result'=>''], -'maxdb_fetch_field_direct' => ['', 'result'=>'', 'fieldnr'=>'int'], -'maxdb_fetch_fields' => ['', 'result'=>''], -'maxdb_fetch_lengths' => ['array', 'result'=>'resource'], -'maxdb_fetch_object' => ['object', 'result'=>'object'], -'maxdb_fetch_row' => ['', 'result'=>''], -'maxdb_field_count' => ['int', 'link'=>''], -'maxdb_field_seek' => ['bool', 'result'=>'', 'fieldnr'=>'int'], -'maxdb_field_tell' => ['int', 'result'=>'resource'], -'maxdb_free_result' => ['', 'result'=>''], -'maxdb_get_client_info' => ['string'], -'maxdb_get_client_version' => ['int'], -'maxdb_get_host_info' => ['string', 'link'=>'resource'], -'maxdb_get_proto_info' => ['string', 'link'=>'resource'], -'maxdb_get_server_info' => ['string', 'link'=>'resource'], -'maxdb_get_server_version' => ['int', 'link'=>'resource'], -'maxdb_info' => ['string', 'link'=>'resource'], -'maxdb_init' => ['resource'], -'maxdb_insert_id' => ['mixed', 'link'=>'resource'], -'maxdb_kill' => ['bool', 'link'=>'', 'processid'=>'int'], -'maxdb_master_query' => ['bool', 'link'=>'resource', 'query'=>'string'], -'maxdb_more_results' => ['bool', 'link'=>'resource'], -'maxdb_multi_query' => ['bool', 'link'=>'', 'query'=>'string'], -'maxdb_next_result' => ['bool', 'link'=>'resource'], -'maxdb_num_fields' => ['int', 'result'=>'resource'], -'maxdb_num_rows' => ['int', 'result'=>'resource'], -'maxdb_options' => ['bool', 'link'=>'', 'option'=>'int', 'value'=>''], -'maxdb_ping' => ['bool', 'link'=>''], -'maxdb_prepare' => ['maxdb_stmt', 'link'=>'', 'query'=>'string'], -'maxdb_query' => ['', 'link'=>'', 'query'=>'string', 'resultmode='=>'int'], -'maxdb_real_connect' => ['bool', 'link'=>'', 'hostname='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], -'maxdb_real_escape_string' => ['string', 'link'=>'', 'escapestr'=>'string'], -'maxdb_real_query' => ['bool', 'link'=>'', 'query'=>'string'], -'maxdb_report' => ['bool', 'flags'=>'int'], -'maxdb_result::current_field' => ['int', 'result'=>''], -'maxdb_result::data_seek' => ['bool', 'result'=>'', 'offset'=>'int'], -'maxdb_result::fetch_array' => ['', 'result'=>'', 'resulttype='=>'int'], -'maxdb_result::fetch_assoc' => ['array', 'result'=>''], -'maxdb_result::fetch_field' => ['', 'result'=>''], -'maxdb_result::fetch_field_direct' => ['', 'result'=>'', 'fieldnr'=>'int'], -'maxdb_result::fetch_fields' => ['', 'result'=>''], -'maxdb_result::fetch_object' => ['object', 'result'=>'object'], -'maxdb_result::fetch_row' => ['', 'result'=>''], -'maxdb_result::field_count' => ['int', 'result'=>''], -'maxdb_result::field_seek' => ['bool', 'result'=>'', 'fieldnr'=>'int'], -'maxdb_result::free' => ['', 'result'=>''], -'maxdb_result::lengths' => ['array', 'result'=>''], -'maxdb_rollback' => ['bool', 'link'=>''], -'maxdb_rpl_parse_enabled' => ['int', 'link'=>'resource'], -'maxdb_rpl_probe' => ['bool', 'link'=>'resource'], -'maxdb_rpl_query_type' => ['int', 'link'=>''], -'maxdb_select_db' => ['bool', 'link'=>'resource', 'dbname'=>'string'], -'maxdb_send_query' => ['bool', 'link'=>'', 'query'=>'string'], -'maxdb_server_end' => ['void'], -'maxdb_server_init' => ['bool', 'server='=>'array', 'groups='=>'array'], -'maxdb_sqlstate' => ['string', 'link'=>'resource'], -'maxdb_ssl_set' => ['bool', 'link'=>'', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], -'maxdb_stat' => ['string', 'link'=>''], -'maxdb_stmt::affected_rows' => ['int', 'stmt'=>''], -'maxdb_stmt::bind_param' => ['bool', 'stmt'=>'', 'types'=>'string', '&...rw_var'=>''], -'maxdb_stmt::bind_param\'1' => ['bool', 'stmt'=>'', 'types'=>'string', '&rw_var'=>'array'], -'maxdb_stmt::bind_result' => ['bool', 'stmt'=>'', '&w_var1'=>'', '&...w_vars='=>''], -'maxdb_stmt::close' => ['bool', 'stmt'=>''], -'maxdb_stmt::close_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int'], -'maxdb_stmt::data_seek' => ['bool', 'statement'=>'', 'offset'=>'int'], -'maxdb_stmt::errno' => ['int', 'stmt'=>''], -'maxdb_stmt::error' => ['string', 'stmt'=>''], -'maxdb_stmt::execute' => ['bool', 'stmt'=>''], -'maxdb_stmt::fetch' => ['bool', 'stmt'=>''], -'maxdb_stmt::free_result' => ['', 'stmt'=>''], -'maxdb_stmt::num_rows' => ['int', 'stmt'=>''], -'maxdb_stmt::param_count' => ['int', 'stmt'=>''], -'maxdb_stmt::prepare' => ['', 'stmt'=>'', 'query'=>'string'], -'maxdb_stmt::reset' => ['bool', 'stmt'=>''], -'maxdb_stmt::result_metadata' => ['resource', 'stmt'=>''], -'maxdb_stmt::send_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int', 'data'=>'string'], -'maxdb_stmt::stmt_send_long_data' => ['bool', 'param_nr'=>'int', 'data'=>'string'], -'maxdb_stmt::store_result' => ['bool'], -'maxdb_stmt_affected_rows' => ['int', 'stmt'=>'resource'], -'maxdb_stmt_bind_param' => ['bool', 'stmt'=>'', 'types'=>'string', 'var1'=>'', '...args='=>'', 'var='=>'array'], -'maxdb_stmt_bind_result' => ['bool', 'stmt'=>'', '&w_var1'=>'', '&...w_vars='=>''], -'maxdb_stmt_close' => ['bool', 'stmt'=>''], -'maxdb_stmt_close_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int'], -'maxdb_stmt_data_seek' => ['bool', 'statement'=>'', 'offset'=>'int'], -'maxdb_stmt_errno' => ['int', 'stmt'=>'resource'], -'maxdb_stmt_error' => ['string', 'stmt'=>'resource'], -'maxdb_stmt_execute' => ['bool', 'stmt'=>''], -'maxdb_stmt_fetch' => ['bool', 'stmt'=>''], -'maxdb_stmt_free_result' => ['', 'stmt'=>''], -'maxdb_stmt_init' => ['object', 'link'=>''], -'maxdb_stmt_num_rows' => ['int', 'stmt'=>'resource'], -'maxdb_stmt_param_count' => ['int', 'stmt'=>'resource'], -'maxdb_stmt_prepare' => ['', 'stmt'=>'', 'query'=>'string'], -'maxdb_stmt_reset' => ['bool', 'stmt'=>''], -'maxdb_stmt_result_metadata' => ['resource', 'stmt'=>''], -'maxdb_stmt_send_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int', 'data'=>'string'], -'maxdb_stmt_sqlstate' => ['string', 'stmt'=>'resource'], -'maxdb_stmt_store_result' => ['bool', 'stmt'=>''], -'maxdb_store_result' => ['bool', 'link'=>''], -'maxdb_thread_id' => ['int', 'link'=>'resource'], -'maxdb_thread_safe' => ['bool'], -'maxdb_use_result' => ['resource', 'link'=>''], -'maxdb_warning_count' => ['int', 'link'=>'resource'], -'mb_check_encoding' => ['bool', 'value='=>'array|string|null', 'encoding='=>'string|null'], -'mb_chr' => ['string|false', 'codepoint'=>'int', 'encoding='=>'string|null'], -'mb_convert_case' => ['string', 'string'=>'string', 'mode'=>'int', 'encoding='=>'string|null'], -'mb_convert_encoding' => ['string|false', 'string'=>'string', 'to_encoding'=>'string', 'from_encoding='=>'array|string|null'], -'mb_convert_encoding\'1' => ['array', 'string'=>'array', 'to_encoding'=>'string', 'from_encoding='=>'array|string|null'], -'mb_convert_kana' => ['string', 'string'=>'string', 'mode='=>'string', 'encoding='=>'string|null'], -'mb_convert_variables' => ['string|false', 'to_encoding'=>'string', 'from_encoding'=>'array|string', '&rw_var'=>'string|array|object', '&...rw_vars='=>'string|array|object'], -'mb_decode_mimeheader' => ['string', 'string'=>'string'], -'mb_decode_numericentity' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string|null'], -'mb_detect_encoding' => ['string|false', 'string'=>'string', 'encodings='=>'array|string|null', 'strict='=>'bool'], -'mb_detect_order' => ['bool|list', 'encoding='=>'array|string|null'], -'mb_encode_mimeheader' => ['string', 'string'=>'string', 'charset='=>'string|null', 'transfer_encoding='=>'string|null', 'newline='=>'string', 'indent='=>'int'], -'mb_encode_numericentity' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string|null', 'hex='=>'bool'], -'mb_encoding_aliases' => ['list|false', 'encoding'=>'string'], -'mb_ereg' => ['bool', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], -'mb_ereg_match' => ['bool', 'pattern'=>'string', 'string'=>'string', 'options='=>'string|null'], -'mb_ereg_replace' => ['string|false|null', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string|null'], -'mb_ereg_replace_callback' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable', 'string'=>'string', 'options='=>'string|null'], -'mb_ereg_search' => ['bool', 'pattern='=>'string|null', 'options='=>'string|null'], -'mb_ereg_search_getpos' => ['int'], -'mb_ereg_search_getregs' => ['string[]|false'], -'mb_ereg_search_init' => ['bool', 'string'=>'string', 'pattern='=>'string|null', 'options='=>'string|null'], -'mb_ereg_search_pos' => ['int[]|false', 'pattern='=>'string|null', 'options='=>'string|null'], -'mb_ereg_search_regs' => ['string[]|false', 'pattern='=>'string|null', 'options='=>'string|null'], -'mb_ereg_search_setpos' => ['bool', 'offset'=>'int'], -'mb_eregi' => ['bool', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], -'mb_eregi_replace' => ['string|false|null', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string|null'], -'mb_get_info' => ['array|string|int|false', 'type='=>'string'], -'mb_http_input' => ['array|string|false', 'type='=>'string|null'], -'mb_http_output' => ['string|bool', 'encoding='=>'string|null'], -'mb_internal_encoding' => ['string|bool', 'encoding='=>'string|null'], -'mb_language' => ['string|bool', 'language='=>'string|null'], -'mb_list_encodings' => ['list'], -'mb_ord' => ['int|false', 'string'=>'string', 'encoding='=>'string|null'], -'mb_output_handler' => ['string', 'string'=>'string', 'status'=>'int'], -'mb_parse_str' => ['bool', 'string'=>'string', '&w_result'=>'array'], -'mb_preferred_mime_name' => ['string|false', 'encoding'=>'string'], -'mb_regex_encoding' => ['string|bool', 'encoding='=>'string|null'], -'mb_regex_set_options' => ['string', 'options='=>'string|null'], -'mb_scrub' => ['string', 'string'=>'string', 'encoding='=>'string|null'], -'mb_send_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array', 'additional_params='=>'string|null'], -'mb_split' => ['list|false', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'], -'mb_str_split' => ['list', 'string'=>'string', 'length='=>'positive-int', 'encoding='=>'string|null'], -'mb_strcut' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string|null'], -'mb_strimwidth' => ['string', 'string'=>'string', 'start'=>'int', 'width'=>'int', 'trim_marker='=>'string', 'encoding='=>'string|null'], -'mb_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], -'mb_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], -'mb_strlen' => ['0|positive-int', 'string'=>'string', 'encoding='=>'string|null'], -'mb_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], -'mb_strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], -'mb_strrichr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], -'mb_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], -'mb_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], -'mb_strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], -'mb_strtolower' => ['lowercase-string', 'string'=>'string', 'encoding='=>'string|null'], -'mb_strtoupper' => ['string', 'string'=>'string', 'encoding='=>'string|null'], -'mb_strwidth' => ['int', 'string'=>'string', 'encoding='=>'string|null'], -'mb_substitute_character' => ['bool|int|string', 'substitute_character='=>'int|string|null'], -'mb_substr' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string|null'], -'mb_substr_count' => ['int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string|null'], -'mcrypt_cbc' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], -'mcrypt_cfb' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], -'mcrypt_create_iv' => ['string|false', 'size'=>'int', 'source='=>'int'], -'mcrypt_decrypt' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'string', 'iv='=>'string'], -'mcrypt_ecb' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], -'mcrypt_enc_get_algorithms_name' => ['string', 'td'=>'resource'], -'mcrypt_enc_get_block_size' => ['int', 'td'=>'resource'], -'mcrypt_enc_get_iv_size' => ['int', 'td'=>'resource'], -'mcrypt_enc_get_key_size' => ['int', 'td'=>'resource'], -'mcrypt_enc_get_modes_name' => ['string', 'td'=>'resource'], -'mcrypt_enc_get_supported_key_sizes' => ['array', 'td'=>'resource'], -'mcrypt_enc_is_block_algorithm' => ['bool', 'td'=>'resource'], -'mcrypt_enc_is_block_algorithm_mode' => ['bool', 'td'=>'resource'], -'mcrypt_enc_is_block_mode' => ['bool', 'td'=>'resource'], -'mcrypt_enc_self_test' => ['int|false', 'td'=>'resource'], -'mcrypt_encrypt' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'string', 'iv='=>'string'], -'mcrypt_generic' => ['string', 'td'=>'resource', 'data'=>'string'], -'mcrypt_generic_deinit' => ['bool', 'td'=>'resource'], -'mcrypt_generic_end' => ['bool', 'td'=>'resource'], -'mcrypt_generic_init' => ['int|false', 'td'=>'resource', 'key'=>'string', 'iv'=>'string'], -'mcrypt_get_block_size' => ['int', 'cipher'=>'int|string', 'module'=>'string'], -'mcrypt_get_cipher_name' => ['string|false', 'cipher'=>'int|string'], -'mcrypt_get_iv_size' => ['int|false', 'cipher'=>'int|string', 'module'=>'string'], -'mcrypt_get_key_size' => ['int', 'cipher'=>'int|string', 'module'=>'string'], -'mcrypt_list_algorithms' => ['array', 'lib_dir='=>'string'], -'mcrypt_list_modes' => ['array', 'lib_dir='=>'string'], -'mcrypt_module_close' => ['bool', 'td'=>'resource'], -'mcrypt_module_get_algo_block_size' => ['int', 'algorithm'=>'string', 'lib_dir='=>'string'], -'mcrypt_module_get_algo_key_size' => ['int', 'algorithm'=>'string', 'lib_dir='=>'string'], -'mcrypt_module_get_supported_key_sizes' => ['array', 'algorithm'=>'string', 'lib_dir='=>'string'], -'mcrypt_module_is_block_algorithm' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'], -'mcrypt_module_is_block_algorithm_mode' => ['bool', 'mode'=>'string', 'lib_dir='=>'string'], -'mcrypt_module_is_block_mode' => ['bool', 'mode'=>'string', 'lib_dir='=>'string'], -'mcrypt_module_open' => ['resource|false', 'cipher'=>'string', 'cipher_directory'=>'string', 'mode'=>'string', 'mode_directory'=>'string'], -'mcrypt_module_self_test' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'], -'mcrypt_ofb' => ['string', 'cipher'=>'int|string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], -'md5' => ['string', 'string'=>'string', 'binary='=>'bool'], -'md5_file' => ['string|false', 'filename'=>'string', 'binary='=>'bool'], -'mdecrypt_generic' => ['string', 'td'=>'resource', 'data'=>'string'], -'Memcache::add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], -'Memcache::addServer' => ['bool', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable', 'timeoutms='=>'int'], -'Memcache::append' => [''], -'Memcache::cas' => [''], -'Memcache::close' => ['bool'], -'Memcache::connect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], -'Memcache::decrement' => ['int', 'key'=>'string', 'value='=>'int'], -'Memcache::delete' => ['bool', 'key'=>'string', 'timeout='=>'int'], -'Memcache::findServer' => [''], -'Memcache::flush' => ['bool'], -'Memcache::get' => ['string|array|false', 'key'=>'string', 'flags='=>'array', 'keys='=>'array'], -'Memcache::get\'1' => ['array', 'key'=>'string[]', 'flags='=>'int[]'], -'Memcache::getExtendedStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], -'Memcache::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'], -'Memcache::getStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], -'Memcache::getVersion' => ['string'], -'Memcache::increment' => ['int', 'key'=>'string', 'value='=>'int'], -'Memcache::pconnect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], -'Memcache::prepend' => ['string'], -'Memcache::replace' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], -'Memcache::set' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], -'Memcache::setCompressThreshold' => ['bool', 'threshold'=>'int', 'min_savings='=>'float'], -'Memcache::setFailureCallback' => [''], -'Memcache::setServerParams' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable'], -'memcache_add' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], -'memcache_add_server' => ['bool', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable', 'timeoutms='=>'int'], -'memcache_append' => ['', 'memcache_obj'=>'Memcache'], -'memcache_cas' => ['', 'memcache_obj'=>'Memcache'], -'memcache_close' => ['bool', 'memcache_obj'=>'Memcache'], -'memcache_connect' => ['Memcache|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], -'memcache_debug' => ['bool', 'on_off'=>'bool'], -'memcache_decrement' => ['int', 'memcache_obj'=>'Memcache', 'key'=>'string', 'value='=>'int'], -'memcache_delete' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'timeout='=>'int'], -'memcache_flush' => ['bool', 'memcache_obj'=>'Memcache'], -'memcache_get' => ['string', 'memcache_obj'=>'Memcache', 'key'=>'string', 'flags='=>'int'], -'memcache_get\'1' => ['array', 'memcache_obj'=>'Memcache', 'key'=>'string[]', 'flags='=>'int[]'], -'memcache_get_extended_stats' => ['array', 'memcache_obj'=>'Memcache', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], -'memcache_get_server_status' => ['int', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int'], -'memcache_get_stats' => ['array', 'memcache_obj'=>'Memcache', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], -'memcache_get_version' => ['string', 'memcache_obj'=>'Memcache'], -'memcache_increment' => ['int', 'memcache_obj'=>'Memcache', 'key'=>'string', 'value='=>'int'], -'memcache_pconnect' => ['Memcache|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], -'memcache_prepend' => ['string', 'memcache_obj'=>'Memcache'], -'memcache_replace' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], -'memcache_set' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], -'memcache_set_compress_threshold' => ['bool', 'memcache_obj'=>'Memcache', 'threshold'=>'int', 'min_savings='=>'float'], -'memcache_set_failure_callback' => ['', 'memcache_obj'=>'Memcache'], -'memcache_set_server_params' => ['bool', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable'], -'Memcached::__construct' => ['void', 'persistent_id='=>'mixed|string', 'on_new_object_cb='=>'mixed'], -'Memcached::add' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], -'Memcached::addByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], -'Memcached::addServer' => ['bool', 'host'=>'string', 'port'=>'int', 'weight='=>'int'], -'Memcached::addServers' => ['bool', 'servers'=>'array'], -'Memcached::append' => ['bool', 'key'=>'string', 'value'=>'string'], -'Memcached::appendByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'string'], -'Memcached::cas' => ['bool', 'cas_token'=>'float', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], -'Memcached::casByKey' => ['bool', 'cas_token'=>'float', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], -'Memcached::decrement' => ['int|false', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], -'Memcached::decrementByKey' => ['int|false', 'server_key'=>'string', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], -'Memcached::delete' => ['bool', 'key'=>'string', 'time='=>'int'], -'Memcached::deleteByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'time='=>'int'], -'Memcached::deleteMulti' => ['array', 'keys'=>'array', 'time='=>'int'], -'Memcached::deleteMultiByKey' => ['bool', 'server_key'=>'string', 'keys'=>'array', 'time='=>'int'], -'Memcached::fetch' => ['array|false'], -'Memcached::fetchAll' => ['array|false'], -'Memcached::flush' => ['bool', 'delay='=>'int'], -'Memcached::flushBuffers' => [''], -'Memcached::get' => ['mixed|false', 'key'=>'string', 'cache_cb='=>'?callable', 'flags='=>'int'], -'Memcached::getAllKeys' => ['array|false'], -'Memcached::getByKey' => ['mixed|false', 'server_key'=>'string', 'key'=>'string', 'value_cb='=>'?callable', 'flags='=>'int'], -'Memcached::getDelayed' => ['bool', 'keys'=>'array', 'with_cas='=>'bool', 'value_cb='=>'callable'], -'Memcached::getDelayedByKey' => ['bool', 'server_key'=>'string', 'keys'=>'array', 'with_cas='=>'bool', 'value_cb='=>'?callable'], -'Memcached::getLastDisconnectedServer' => [''], -'Memcached::getLastErrorCode' => [''], -'Memcached::getLastErrorErrno' => [''], -'Memcached::getLastErrorMessage' => [''], -'Memcached::getMulti' => ['array|false', 'keys'=>'array', 'flags='=>'int'], -'Memcached::getMultiByKey' => ['array|false', 'server_key'=>'string', 'keys'=>'array', 'flags='=>'int'], -'Memcached::getOption' => ['mixed|false', 'option'=>'int'], -'Memcached::getResultCode' => ['int'], -'Memcached::getResultMessage' => ['string'], -'Memcached::getServerByKey' => ['array', 'server_key'=>'string'], -'Memcached::getServerList' => ['array'], -'Memcached::getStats' => ['array', 'type='=>'?string'], -'Memcached::getVersion' => ['array'], -'Memcached::increment' => ['int|false', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], -'Memcached::incrementByKey' => ['int|false', 'server_key'=>'string', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], -'Memcached::isPersistent' => ['bool'], -'Memcached::isPristine' => ['bool'], -'Memcached::prepend' => ['bool', 'key'=>'string', 'value'=>'string'], -'Memcached::prependByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'string'], -'Memcached::quit' => ['bool'], -'Memcached::replace' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], -'Memcached::replaceByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], -'Memcached::resetServerList' => ['bool'], -'Memcached::set' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], -'Memcached::setBucket' => ['', 'host_map'=>'array', 'forward_map'=>'array', 'replicas'=>''], -'Memcached::setByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], -'Memcached::setEncodingKey' => ['', 'key'=>''], -'Memcached::setMulti' => ['bool', 'items'=>'array', 'expiration='=>'int'], -'Memcached::setMultiByKey' => ['bool', 'server_key'=>'string', 'items'=>'array', 'expiration='=>'int'], -'Memcached::setOption' => ['bool', 'option'=>'int', 'value'=>'mixed'], -'Memcached::setOptions' => ['bool', 'options'=>'array'], -'Memcached::setSaslAuthData' => ['void', 'username'=>'string', 'password'=>'string'], -'Memcached::touch' => ['bool', 'key'=>'string', 'expiration'=>'int'], -'Memcached::touchByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'expiration'=>'int'], -'MemcachePool::add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], -'MemcachePool::addServer' => ['bool', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'?callable', 'timeoutms='=>'int'], -'MemcachePool::append' => [''], -'MemcachePool::cas' => [''], -'MemcachePool::close' => ['bool'], -'MemcachePool::connect' => ['bool', 'host'=>'string', 'port'=>'int', 'timeout='=>'int'], -'MemcachePool::decrement' => ['int|false', 'key'=>'', 'value='=>'int|mixed'], -'MemcachePool::delete' => ['bool', 'key'=>'', 'timeout='=>'int|mixed'], -'MemcachePool::findServer' => [''], -'MemcachePool::flush' => ['bool'], -'MemcachePool::get' => ['array|string|false', 'key'=>'array|string', '&flags='=>'array|int'], -'MemcachePool::getExtendedStats' => ['array|false', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], -'MemcachePool::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'], -'MemcachePool::getStats' => ['array|false', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], -'MemcachePool::getVersion' => ['string|false'], -'MemcachePool::increment' => ['int|false', 'key'=>'', 'value='=>'int|mixed'], -'MemcachePool::prepend' => ['string'], -'MemcachePool::replace' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], -'MemcachePool::set' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], -'MemcachePool::setCompressThreshold' => ['bool', 'thresold'=>'int', 'min_saving='=>'float'], -'MemcachePool::setFailureCallback' => [''], -'MemcachePool::setServerParams' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'?callable'], -'memory_get_peak_usage' => ['int', 'real_usage='=>'bool'], -'memory_get_usage' => ['int', 'real_usage='=>'bool'], -'MessageFormatter::__construct' => ['void', 'locale'=>'string', 'pattern'=>'string'], -'MessageFormatter::create' => ['MessageFormatter', 'locale'=>'string', 'pattern'=>'string'], -'MessageFormatter::format' => ['false|string', 'args'=>'array'], -'MessageFormatter::formatMessage' => ['false|string', 'locale'=>'string', 'pattern'=>'string', 'args'=>'array'], -'MessageFormatter::getErrorCode' => ['int'], -'MessageFormatter::getErrorMessage' => ['string'], -'MessageFormatter::getLocale' => ['string'], -'MessageFormatter::getPattern' => ['string'], -'MessageFormatter::parse' => ['array|false', 'value'=>'string'], -'MessageFormatter::parseMessage' => ['array|false', 'locale'=>'string', 'pattern'=>'string', 'source'=>'string'], -'MessageFormatter::setPattern' => ['bool', 'pattern'=>'string'], -'metaphone' => ['string|false', 'string'=>'string', 'max_phonemes='=>'int'], -'method_exists' => ['bool', 'object_or_class'=>'object|class-string|interface-string', 'method'=>'string'], -'mhash' => ['string', 'algo'=>'int', 'data'=>'string', 'key='=>'string'], -'mhash_count' => ['int'], -'mhash_get_block_size' => ['int|false', 'algo'=>'int'], -'mhash_get_hash_name' => ['string|false', 'algo'=>'int'], -'mhash_keygen_s2k' => ['string|false', 'algo'=>'int', 'password'=>'string', 'salt'=>'string', 'length'=>'int'], -'microtime' => ['string', 'as_float='=>'false'], -'microtime\'1' => ['float', 'as_float='=>'true'], -'mime_content_type' => ['string|false', 'filename'=>'string|resource'], -'min' => ['mixed', 'value'=>'non-empty-array'], -'min\'1' => ['mixed', 'value'=>'', 'values'=>'', '...args='=>''], -'ming_keypress' => ['int', 'char'=>'string'], -'ming_setcubicthreshold' => ['void', 'threshold'=>'int'], -'ming_setscale' => ['void', 'scale'=>'float'], -'ming_setswfcompression' => ['void', 'level'=>'int'], -'ming_useconstants' => ['void', 'use'=>'int'], -'ming_useswfversion' => ['void', 'version'=>'int'], -'mkdir' => ['bool', 'directory'=>'string', 'permissions='=>'int', 'recursive='=>'bool', 'context='=>'resource'], -'mktime' => ['int|false', 'hour'=>'int', 'minute='=>'int|null', 'second='=>'int|null', 'month='=>'int|null', 'day='=>'int|null', 'year='=>'int|null'], -'money_format' => ['string', 'format'=>'string', 'value'=>'float'], -'Mongo::__construct' => ['void', 'server='=>'string', 'options='=>'array', 'driver_options='=>'array'], -'Mongo::__get' => ['MongoDB', 'dbname'=>'string'], -'Mongo::__toString' => ['string'], -'Mongo::close' => ['bool'], -'Mongo::connect' => ['bool'], -'Mongo::connectUtil' => ['bool'], -'Mongo::dropDB' => ['array', 'db'=>'mixed'], -'Mongo::forceError' => ['bool'], -'Mongo::getConnections' => ['array'], -'Mongo::getHosts' => ['array'], -'Mongo::getPoolSize' => ['int'], -'Mongo::getReadPreference' => ['array'], -'Mongo::getSlave' => ['?string'], -'Mongo::getSlaveOkay' => ['bool'], -'Mongo::getWriteConcern' => ['array'], -'Mongo::killCursor' => ['', 'server_hash'=>'string', 'id'=>'MongoInt64|int'], -'Mongo::lastError' => ['?array'], -'Mongo::listDBs' => ['array'], -'Mongo::pairConnect' => ['bool'], -'Mongo::pairPersistConnect' => ['bool', 'username='=>'string', 'password='=>'string'], -'Mongo::persistConnect' => ['bool', 'username='=>'string', 'password='=>'string'], -'Mongo::poolDebug' => ['array'], -'Mongo::prevError' => ['array'], -'Mongo::resetError' => ['array'], -'Mongo::selectCollection' => ['MongoCollection', 'db'=>'string', 'collection'=>'string'], -'Mongo::selectDB' => ['MongoDB', 'name'=>'string'], -'Mongo::setPoolSize' => ['bool', 'size'=>'int'], -'Mongo::setReadPreference' => ['bool', 'readPreference'=>'string', 'tags='=>'array'], -'Mongo::setSlaveOkay' => ['bool', 'ok='=>'bool'], -'Mongo::switchSlave' => ['string'], -'MongoBinData::__construct' => ['void', 'data'=>'string', 'type='=>'int'], -'MongoBinData::__toString' => ['string'], -'MongoClient::__construct' => ['void', 'server='=>'string', 'options='=>'array', 'driver_options='=>'array'], -'MongoClient::__get' => ['MongoDB', 'dbname'=>'string'], -'MongoClient::__toString' => ['string'], -'MongoClient::close' => ['bool', 'connection='=>'bool|string'], -'MongoClient::connect' => ['bool'], -'MongoClient::dropDB' => ['array', 'db'=>'mixed'], -'MongoClient::getConnections' => ['array'], -'MongoClient::getHosts' => ['array'], -'MongoClient::getReadPreference' => ['array'], -'MongoClient::getWriteConcern' => ['array'], -'MongoClient::killCursor' => ['bool', 'server_hash'=>'string', 'id'=>'int|MongoInt64'], -'MongoClient::listDBs' => ['array'], -'MongoClient::selectCollection' => ['MongoCollection', 'db'=>'string', 'collection'=>'string'], -'MongoClient::selectDB' => ['MongoDB', 'name'=>'string'], -'MongoClient::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], -'MongoClient::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], -'MongoClient::switchSlave' => ['string'], -'MongoCode::__construct' => ['void', 'code'=>'string', 'scope='=>'array'], -'MongoCode::__toString' => ['string'], -'MongoCollection::__construct' => ['void', 'db'=>'MongoDB', 'name'=>'string'], -'MongoCollection::__get' => ['MongoCollection', 'name'=>'string'], -'MongoCollection::__toString' => ['string'], -'MongoCollection::aggregate' => ['array', 'op'=>'array', 'op='=>'array', '...args='=>'array'], -'MongoCollection::aggregate\'1' => ['array', 'pipeline'=>'array', 'options='=>'array'], -'MongoCollection::aggregateCursor' => ['MongoCommandCursor', 'command'=>'array', 'options='=>'array'], -'MongoCollection::batchInsert' => ['array|bool', 'a'=>'array', 'options='=>'array'], -'MongoCollection::count' => ['int', 'query='=>'array', 'limit='=>'int', 'skip='=>'int'], -'MongoCollection::createDBRef' => ['array', 'a'=>'array'], -'MongoCollection::createIndex' => ['array', 'keys'=>'array', 'options='=>'array'], -'MongoCollection::deleteIndex' => ['array', 'keys'=>'string|array'], -'MongoCollection::deleteIndexes' => ['array'], -'MongoCollection::distinct' => ['array|false', 'key'=>'string', 'query='=>'array'], -'MongoCollection::drop' => ['array'], -'MongoCollection::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'], -'MongoCollection::find' => ['MongoCursor', 'query='=>'array', 'fields='=>'array'], -'MongoCollection::findAndModify' => ['array', 'query'=>'array', 'update='=>'array', 'fields='=>'array', 'options='=>'array'], -'MongoCollection::findOne' => ['?array', 'query='=>'array', 'fields='=>'array'], -'MongoCollection::getDBRef' => ['array', 'ref'=>'array'], -'MongoCollection::getIndexInfo' => ['array'], -'MongoCollection::getName' => ['string'], -'MongoCollection::getReadPreference' => ['array'], -'MongoCollection::getSlaveOkay' => ['bool'], -'MongoCollection::getWriteConcern' => ['array'], -'MongoCollection::group' => ['array', 'keys'=>'mixed', 'initial'=>'array', 'reduce'=>'MongoCode', 'options='=>'array'], -'MongoCollection::insert' => ['bool|array', 'a'=>'array|object', 'options='=>'array'], -'MongoCollection::parallelCollectionScan' => ['MongoCommandCursor[]', 'num_cursors'=>'int'], -'MongoCollection::remove' => ['bool|array', 'criteria='=>'array', 'options='=>'array'], -'MongoCollection::save' => ['bool|array', 'a'=>'array|object', 'options='=>'array'], -'MongoCollection::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], -'MongoCollection::setSlaveOkay' => ['bool', 'ok='=>'bool'], -'MongoCollection::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], -'MongoCollection::toIndexString' => ['string', 'keys'=>'mixed'], -'MongoCollection::update' => ['bool', 'criteria'=>'array', 'newobj'=>'array', 'options='=>'array'], -'MongoCollection::validate' => ['array', 'scan_data='=>'bool'], -'MongoCommandCursor::__construct' => ['void', 'connection'=>'MongoClient', 'ns'=>'string', 'command'=>'array'], -'MongoCommandCursor::batchSize' => ['MongoCommandCursor', 'batchSize'=>'int'], -'MongoCommandCursor::createFromDocument' => ['MongoCommandCursor', 'connection'=>'MongoClient', 'hash'=>'string', 'document'=>'array'], -'MongoCommandCursor::current' => ['array'], -'MongoCommandCursor::dead' => ['bool'], -'MongoCommandCursor::getReadPreference' => ['array'], -'MongoCommandCursor::info' => ['array'], -'MongoCommandCursor::key' => ['int'], -'MongoCommandCursor::next' => ['void'], -'MongoCommandCursor::rewind' => ['array'], -'MongoCommandCursor::setReadPreference' => ['MongoCommandCursor', 'read_preference'=>'string', 'tags='=>'array'], -'MongoCommandCursor::timeout' => ['MongoCommandCursor', 'ms'=>'int'], -'MongoCommandCursor::valid' => ['bool'], -'MongoCursor::__construct' => ['void', 'connection'=>'MongoClient', 'ns'=>'string', 'query='=>'array', 'fields='=>'array'], -'MongoCursor::addOption' => ['MongoCursor', 'key'=>'string', 'value'=>'mixed'], -'MongoCursor::awaitData' => ['MongoCursor', 'wait='=>'bool'], -'MongoCursor::batchSize' => ['MongoCursor', 'num'=>'int'], -'MongoCursor::count' => ['int', 'foundonly='=>'bool'], -'MongoCursor::current' => ['array'], -'MongoCursor::dead' => ['bool'], -'MongoCursor::doQuery' => ['void'], -'MongoCursor::explain' => ['array'], -'MongoCursor::fields' => ['MongoCursor', 'f'=>'array'], -'MongoCursor::getNext' => ['array'], -'MongoCursor::getReadPreference' => ['array'], -'MongoCursor::hasNext' => ['bool'], -'MongoCursor::hint' => ['MongoCursor', 'key_pattern'=>'string|array|object'], -'MongoCursor::immortal' => ['MongoCursor', 'liveforever='=>'bool'], -'MongoCursor::info' => ['array'], -'MongoCursor::key' => ['string'], -'MongoCursor::limit' => ['MongoCursor', 'num'=>'int'], -'MongoCursor::maxTimeMS' => ['MongoCursor', 'ms'=>'int'], -'MongoCursor::next' => ['array'], -'MongoCursor::partial' => ['MongoCursor', 'okay='=>'bool'], -'MongoCursor::reset' => ['void'], -'MongoCursor::rewind' => ['void'], -'MongoCursor::setFlag' => ['MongoCursor', 'flag'=>'int', 'set='=>'bool'], -'MongoCursor::setReadPreference' => ['MongoCursor', 'read_preference'=>'string', 'tags='=>'array'], -'MongoCursor::skip' => ['MongoCursor', 'num'=>'int'], -'MongoCursor::slaveOkay' => ['MongoCursor', 'okay='=>'bool'], -'MongoCursor::snapshot' => ['MongoCursor'], -'MongoCursor::sort' => ['MongoCursor', 'fields'=>'array'], -'MongoCursor::tailable' => ['MongoCursor', 'tail='=>'bool'], -'MongoCursor::timeout' => ['MongoCursor', 'ms'=>'int'], -'MongoCursor::valid' => ['bool'], -'MongoCursorException::__clone' => ['void'], -'MongoCursorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'MongoCursorException::__toString' => ['string'], -'MongoCursorException::__wakeup' => ['void'], -'MongoCursorException::getCode' => ['int'], -'MongoCursorException::getFile' => ['string'], -'MongoCursorException::getHost' => ['string'], -'MongoCursorException::getLine' => ['int'], -'MongoCursorException::getMessage' => ['string'], -'MongoCursorException::getPrevious' => ['Exception|Throwable'], -'MongoCursorException::getTrace' => ['list\',args?:array}>'], -'MongoCursorException::getTraceAsString' => ['string'], -'MongoCursorInterface::__construct' => ['void'], -'MongoCursorInterface::batchSize' => ['MongoCursorInterface', 'batchSize'=>'int'], -'MongoCursorInterface::current' => ['mixed'], -'MongoCursorInterface::dead' => ['bool'], -'MongoCursorInterface::getReadPreference' => ['array'], -'MongoCursorInterface::info' => ['array'], -'MongoCursorInterface::key' => ['int|string'], -'MongoCursorInterface::next' => ['void'], -'MongoCursorInterface::rewind' => ['void'], -'MongoCursorInterface::setReadPreference' => ['MongoCursorInterface', 'read_preference'=>'string', 'tags='=>'array'], -'MongoCursorInterface::timeout' => ['MongoCursorInterface', 'ms'=>'int'], -'MongoCursorInterface::valid' => ['bool'], -'MongoDate::__construct' => ['void', 'second='=>'int', 'usecond='=>'int'], -'MongoDate::__toString' => ['string'], -'MongoDate::toDateTime' => ['DateTime'], -'MongoDB::__construct' => ['void', 'conn'=>'MongoClient', 'name'=>'string'], -'MongoDB::__get' => ['MongoCollection', 'name'=>'string'], -'MongoDB::__toString' => ['string'], -'MongoDB::authenticate' => ['array', 'username'=>'string', 'password'=>'string'], -'MongoDB::command' => ['array', 'command'=>'array'], -'MongoDB::createCollection' => ['MongoCollection', 'name'=>'string', 'capped='=>'bool', 'size='=>'int', 'max='=>'int'], -'MongoDB::createDBRef' => ['array', 'collection'=>'string', 'a'=>'mixed'], -'MongoDB::drop' => ['array'], -'MongoDB::dropCollection' => ['array', 'coll'=>'MongoCollection|string'], -'MongoDB::execute' => ['array', 'code'=>'MongoCode|string', 'args='=>'array'], -'MongoDB::forceError' => ['bool'], -'MongoDB::getCollectionInfo' => ['array', 'options='=>'array'], -'MongoDB::getCollectionNames' => ['array', 'options='=>'array'], -'MongoDB::getDBRef' => ['array', 'ref'=>'array'], -'MongoDB::getGridFS' => ['MongoGridFS', 'prefix='=>'string'], -'MongoDB::getProfilingLevel' => ['int'], -'MongoDB::getReadPreference' => ['array'], -'MongoDB::getSlaveOkay' => ['bool'], -'MongoDB::getWriteConcern' => ['array'], -'MongoDB::lastError' => ['array'], -'MongoDB::listCollections' => ['array'], -'MongoDB::prevError' => ['array'], -'MongoDB::repair' => ['array', 'preserve_cloned_files='=>'bool', 'backup_original_files='=>'bool'], -'MongoDB::resetError' => ['array'], -'MongoDB::selectCollection' => ['MongoCollection', 'name'=>'string'], -'MongoDB::setProfilingLevel' => ['int', 'level'=>'int'], -'MongoDB::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], -'MongoDB::setSlaveOkay' => ['bool', 'ok='=>'bool'], -'MongoDB::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], -'MongoDB\BSON\Binary::__construct' => ['void', 'data'=>'string', 'type'=>'int'], -'MongoDB\BSON\Binary::__toString' => ['string'], -'MongoDB\BSON\Binary::getData' => ['string'], -'MongoDB\BSON\Binary::getType' => ['int'], -'MongoDB\BSON\binary::jsonSerialize' => ['mixed'], -'MongoDB\BSON\binary::serialize' => ['string'], -'MongoDB\BSON\binary::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\binaryinterface::__toString' => ['string'], -'MongoDB\BSON\binaryinterface::getData' => ['string'], -'MongoDB\BSON\binaryinterface::getType' => ['int'], -'MongoDB\BSON\dbpointer::__construct' => ['void'], -'MongoDB\BSON\dbpointer::__toString' => ['string'], -'MongoDB\BSON\dbpointer::jsonSerialize' => ['mixed'], -'MongoDB\BSON\dbpointer::serialize' => ['string'], -'MongoDB\BSON\dbpointer::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\Decimal128::__construct' => ['void', 'value='=>'string'], -'MongoDB\BSON\Decimal128::__toString' => ['string'], -'MongoDB\BSON\decimal128::jsonSerialize' => ['mixed'], -'MongoDB\BSON\decimal128::serialize' => ['string'], -'MongoDB\BSON\decimal128::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\decimal128interface::__toString' => ['string'], -'MongoDB\BSON\fromJSON' => ['string', 'json'=>'string'], -'MongoDB\BSON\fromPHP' => ['string', 'value'=>'array|object'], -'MongoDB\BSON\int64::__construct' => ['void'], -'MongoDB\BSON\int64::__toString' => ['string'], -'MongoDB\BSON\int64::jsonSerialize' => ['mixed'], -'MongoDB\BSON\int64::serialize' => ['string'], -'MongoDB\BSON\int64::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\Javascript::__construct' => ['void', 'code'=>'string', 'scope='=>'array|object'], -'MongoDB\BSON\javascript::__toString' => ['string'], -'MongoDB\BSON\javascript::getCode' => ['string'], -'MongoDB\BSON\javascript::getScope' => ['?object'], -'MongoDB\BSON\javascript::jsonSerialize' => ['mixed'], -'MongoDB\BSON\javascript::serialize' => ['string'], -'MongoDB\BSON\javascript::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\javascriptinterface::__toString' => ['string'], -'MongoDB\BSON\javascriptinterface::getCode' => ['string'], -'MongoDB\BSON\javascriptinterface::getScope' => ['?object'], -'MongoDB\BSON\maxkey::__construct' => ['void'], -'MongoDB\BSON\maxkey::jsonSerialize' => ['mixed'], -'MongoDB\BSON\maxkey::serialize' => ['string'], -'MongoDB\BSON\maxkey::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\minkey::__construct' => ['void'], -'MongoDB\BSON\minkey::jsonSerialize' => ['mixed'], -'MongoDB\BSON\minkey::serialize' => ['string'], -'MongoDB\BSON\minkey::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\ObjectId::__construct' => ['void', 'id='=>'string'], -'MongoDB\BSON\ObjectId::__toString' => ['string'], -'MongoDB\BSON\objectid::getTimestamp' => ['int'], -'MongoDB\BSON\objectid::jsonSerialize' => ['mixed'], -'MongoDB\BSON\objectid::serialize' => ['string'], -'MongoDB\BSON\objectid::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\objectidinterface::__toString' => ['string'], -'MongoDB\BSON\objectidinterface::getTimestamp' => ['int'], -'MongoDB\BSON\Regex::__construct' => ['void', 'pattern'=>'string', 'flags='=>'string'], -'MongoDB\BSON\Regex::__toString' => ['string'], -'MongoDB\BSON\Regex::getFlags' => ['string'], -'MongoDB\BSON\Regex::getPattern' => ['string'], -'MongoDB\BSON\regex::jsonSerialize' => ['mixed'], -'MongoDB\BSON\regex::serialize' => ['string'], -'MongoDB\BSON\regex::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\regexinterface::__toString' => ['string'], -'MongoDB\BSON\regexinterface::getFlags' => ['string'], -'MongoDB\BSON\regexinterface::getPattern' => ['string'], -'MongoDB\BSON\Serializable::bsonSerialize' => ['array|object'], -'MongoDB\BSON\symbol::__construct' => ['void'], -'MongoDB\BSON\symbol::__toString' => ['string'], -'MongoDB\BSON\symbol::jsonSerialize' => ['mixed'], -'MongoDB\BSON\symbol::serialize' => ['string'], -'MongoDB\BSON\symbol::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\Timestamp::__construct' => ['void', 'increment'=>'int', 'timestamp'=>'int'], -'MongoDB\BSON\Timestamp::__toString' => ['string'], -'MongoDB\BSON\timestamp::getIncrement' => ['int'], -'MongoDB\BSON\timestamp::getTimestamp' => ['int'], -'MongoDB\BSON\timestamp::jsonSerialize' => ['mixed'], -'MongoDB\BSON\timestamp::serialize' => ['string'], -'MongoDB\BSON\timestamp::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\timestampinterface::__toString' => ['string'], -'MongoDB\BSON\timestampinterface::getIncrement' => ['int'], -'MongoDB\BSON\timestampinterface::getTimestamp' => ['int'], -'MongoDB\BSON\toJSON' => ['string', 'bson'=>'string'], -'MongoDB\BSON\toPHP' => ['object', 'bson'=>'string', 'typeMap='=>'array'], -'MongoDB\BSON\undefined::__construct' => ['void'], -'MongoDB\BSON\undefined::__toString' => ['string'], -'MongoDB\BSON\undefined::jsonSerialize' => ['mixed'], -'MongoDB\BSON\undefined::serialize' => ['string'], -'MongoDB\BSON\undefined::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\Unserializable::bsonUnserialize' => ['void', 'data'=>'array'], -'MongoDB\BSON\UTCDateTime::__construct' => ['void', 'milliseconds='=>'int|DateTimeInterface'], -'MongoDB\BSON\UTCDateTime::__toString' => ['string'], -'MongoDB\BSON\utcdatetime::jsonSerialize' => ['mixed'], -'MongoDB\BSON\utcdatetime::serialize' => ['string'], -'MongoDB\BSON\UTCDateTime::toDateTime' => ['DateTime'], -'MongoDB\BSON\utcdatetime::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\BSON\utcdatetimeinterface::__toString' => ['string'], -'MongoDB\BSON\utcdatetimeinterface::toDateTime' => ['DateTime'], -'MongoDB\Driver\BulkWrite::__construct' => ['void', 'ordered='=>'bool'], -'MongoDB\Driver\BulkWrite::count' => ['int'], -'MongoDB\Driver\BulkWrite::delete' => ['void', 'filter'=>'array|object', 'deleteOptions='=>'array'], -'MongoDB\Driver\BulkWrite::insert' => ['void|MongoDB\BSON\ObjectId', 'document'=>'array|object'], -'MongoDB\Driver\BulkWrite::update' => ['void', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array'], -'MongoDB\Driver\Command::__construct' => ['void', 'document'=>'array|object'], -'MongoDB\Driver\Cursor::__construct' => ['void', 'server'=>'Server', 'responseDocument'=>'string'], -'MongoDB\Driver\Cursor::getId' => ['MongoDB\Driver\CursorId'], -'MongoDB\Driver\Cursor::getServer' => ['MongoDB\Driver\Server'], -'MongoDB\Driver\Cursor::isDead' => ['bool'], -'MongoDB\Driver\Cursor::setTypeMap' => ['void', 'typemap'=>'array'], -'MongoDB\Driver\Cursor::toArray' => ['array'], -'MongoDB\Driver\CursorId::__construct' => ['void', 'id'=>'string'], -'MongoDB\Driver\CursorId::__toString' => ['string'], -'MongoDB\Driver\CursorId::serialize' => ['string'], -'MongoDB\Driver\CursorId::unserialize' => ['void', 'serialized'=>'string'], -'mongodb\driver\exception\commandexception::getResultDocument' => ['object'], -'MongoDB\Driver\Exception\RuntimeException::__clone' => ['void'], -'MongoDB\Driver\Exception\RuntimeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?RuntimeException|?Throwable'], -'MongoDB\Driver\Exception\RuntimeException::__toString' => ['string'], -'MongoDB\Driver\Exception\RuntimeException::__wakeup' => ['void'], -'MongoDB\Driver\Exception\RuntimeException::getCode' => ['int'], -'MongoDB\Driver\Exception\RuntimeException::getFile' => ['string'], -'MongoDB\Driver\Exception\RuntimeException::getLine' => ['int'], -'MongoDB\Driver\Exception\RuntimeException::getMessage' => ['string'], -'MongoDB\Driver\Exception\RuntimeException::getPrevious' => ['RuntimeException|Throwable'], -'MongoDB\Driver\Exception\RuntimeException::getTrace' => ['list\',args?:array}>'], -'MongoDB\Driver\Exception\RuntimeException::getTraceAsString' => ['string'], -'mongodb\driver\exception\runtimeexception::hasErrorLabel' => ['bool', 'errorLabel'=>'string'], -'MongoDB\Driver\Exception\WriteException::__clone' => ['void'], -'MongoDB\Driver\Exception\WriteException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?RuntimeException|?Throwable'], -'MongoDB\Driver\Exception\WriteException::__toString' => ['string'], -'MongoDB\Driver\Exception\WriteException::__wakeup' => ['void'], -'MongoDB\Driver\Exception\WriteException::getCode' => ['int'], -'MongoDB\Driver\Exception\WriteException::getFile' => ['string'], -'MongoDB\Driver\Exception\WriteException::getLine' => ['int'], -'MongoDB\Driver\Exception\WriteException::getMessage' => ['string'], -'MongoDB\Driver\Exception\WriteException::getPrevious' => ['RuntimeException|Throwable'], -'MongoDB\Driver\Exception\WriteException::getTrace' => ['list\',args?:array}>'], -'MongoDB\Driver\Exception\WriteException::getTraceAsString' => ['string'], -'MongoDB\Driver\Exception\WriteException::getWriteResult' => ['MongoDB\Driver\WriteResult'], -'MongoDB\Driver\Manager::__construct' => ['void', 'uri'=>'string', 'options='=>'array', 'driverOptions='=>'array'], -'MongoDB\Driver\Manager::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'bulk'=>'MongoDB\Driver\BulkWrite', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], -'MongoDB\Driver\Manager::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'readPreference='=>'MongoDB\Driver\ReadPreference'], -'MongoDB\Driver\Manager::executeDelete' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'deleteOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], -'MongoDB\Driver\Manager::executeInsert' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'document'=>'array|object', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], -'MongoDB\Driver\Manager::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'query'=>'MongoDB\Driver\Query', 'readPreference='=>'MongoDB\Driver\ReadPreference'], -'mongodb\driver\manager::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], -'mongodb\driver\manager::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], -'MongoDB\Driver\Manager::executeUpdate' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], -'mongodb\driver\manager::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], -'MongoDB\Driver\Manager::getReadConcern' => ['MongoDB\Driver\ReadConcern'], -'MongoDB\Driver\Manager::getReadPreference' => ['MongoDB\Driver\ReadPreference'], -'MongoDB\Driver\Manager::getServers' => ['MongoDB\Driver\Server[]'], -'MongoDB\Driver\Manager::getWriteConcern' => ['MongoDB\Driver\WriteConcern'], -'MongoDB\Driver\Manager::selectServer' => ['MongoDB\Driver\Server', 'readPreference'=>'MongoDB\Driver\ReadPreference'], -'mongodb\driver\manager::startSession' => ['MongoDB\Driver\Session', 'options='=>'array'], -'mongodb\driver\monitoring\commandfailedevent::getCommandName' => ['string'], -'mongodb\driver\monitoring\commandfailedevent::getDurationMicros' => ['int'], -'mongodb\driver\monitoring\commandfailedevent::getError' => ['Exception'], -'mongodb\driver\monitoring\commandfailedevent::getOperationId' => ['string'], -'mongodb\driver\monitoring\commandfailedevent::getReply' => ['object'], -'mongodb\driver\monitoring\commandfailedevent::getRequestId' => ['string'], -'mongodb\driver\monitoring\commandfailedevent::getServer' => ['MongoDB\Driver\Server'], -'mongodb\driver\monitoring\commandstartedevent::getCommand' => ['object'], -'mongodb\driver\monitoring\commandstartedevent::getCommandName' => ['string'], -'mongodb\driver\monitoring\commandstartedevent::getDatabaseName' => ['string'], -'mongodb\driver\monitoring\commandstartedevent::getOperationId' => ['string'], -'mongodb\driver\monitoring\commandstartedevent::getRequestId' => ['string'], -'mongodb\driver\monitoring\commandstartedevent::getServer' => ['MongoDB\Driver\Server'], -'mongodb\driver\monitoring\commandsubscriber::commandFailed' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandFailedEvent'], -'mongodb\driver\monitoring\commandsubscriber::commandStarted' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandStartedEvent'], -'mongodb\driver\monitoring\commandsubscriber::commandSucceeded' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandSucceededEvent'], -'mongodb\driver\monitoring\commandsucceededevent::getCommandName' => ['string'], -'mongodb\driver\monitoring\commandsucceededevent::getDurationMicros' => ['int'], -'mongodb\driver\monitoring\commandsucceededevent::getOperationId' => ['string'], -'mongodb\driver\monitoring\commandsucceededevent::getReply' => ['object'], -'mongodb\driver\monitoring\commandsucceededevent::getRequestId' => ['string'], -'mongodb\driver\monitoring\commandsucceededevent::getServer' => ['MongoDB\Driver\Server'], -'MongoDB\Driver\Query::__construct' => ['void', 'filter'=>'array|object', 'queryOptions='=>'array'], -'MongoDB\Driver\ReadConcern::__construct' => ['void', 'level='=>'string'], -'MongoDB\Driver\ReadConcern::bsonSerialize' => ['object'], -'MongoDB\Driver\ReadConcern::getLevel' => ['?string'], -'MongoDB\Driver\ReadConcern::isDefault' => ['bool'], -'MongoDB\Driver\ReadConcern::serialize' => ['string'], -'MongoDB\Driver\ReadConcern::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\Driver\ReadPreference::__construct' => ['void', 'mode'=>'string|int', 'tagSets='=>'array', 'options='=>'array'], -'MongoDB\Driver\ReadPreference::bsonSerialize' => ['object'], -'MongoDB\Driver\ReadPreference::getHedge' => ['object|null'], -'MongoDB\Driver\ReadPreference::getMaxStalenessSeconds' => ['int'], -'MongoDB\Driver\ReadPreference::getMode' => ['int'], -'MongoDB\Driver\ReadPreference::getModeString' => ['string'], -'MongoDB\Driver\ReadPreference::getTagSets' => ['array'], -'MongoDB\Driver\ReadPreference::serialize' => ['string'], -'MongoDB\Driver\ReadPreference::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\Driver\Server::__construct' => ['void', 'host'=>'string', 'port'=>'string', 'options='=>'array', 'driverOptions='=>'array'], -'MongoDB\Driver\Server::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'zwrite'=>'BulkWrite'], -'MongoDB\Driver\Server::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command'], -'MongoDB\Driver\Server::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'zquery'=>'Query'], -'mongodb\driver\server::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], -'mongodb\driver\server::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], -'mongodb\driver\server::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], -'MongoDB\Driver\Server::getHost' => ['string'], -'MongoDB\Driver\Server::getInfo' => ['array'], -'MongoDB\Driver\Server::getLatency' => ['int'], -'MongoDB\Driver\Server::getPort' => ['int'], -'MongoDB\Driver\Server::getState' => [''], -'MongoDB\Driver\Server::getTags' => ['array'], -'MongoDB\Driver\Server::getType' => ['int'], -'MongoDB\Driver\Server::isArbiter' => ['bool'], -'MongoDB\Driver\Server::isDelayed' => [''], -'MongoDB\Driver\Server::isHidden' => ['bool'], -'MongoDB\Driver\Server::isPassive' => ['bool'], -'MongoDB\Driver\Server::isPrimary' => ['bool'], -'MongoDB\Driver\Server::isSecondary' => ['bool'], -'mongodb\driver\session::__construct' => ['void'], -'mongodb\driver\session::abortTransaction' => ['void'], -'mongodb\driver\session::advanceClusterTime' => ['void', 'clusterTime'=>'array|object'], -'mongodb\driver\session::advanceOperationTime' => ['void', 'operationTime'=>'MongoDB\BSON\TimestampInterface'], -'mongodb\driver\session::commitTransaction' => ['void'], -'mongodb\driver\session::endSession' => ['void'], -'mongodb\driver\session::getClusterTime' => ['?object'], -'mongodb\driver\session::getLogicalSessionId' => ['object'], -'mongodb\driver\session::getOperationTime' => ['MongoDB\BSON\Timestamp|null'], -'mongodb\driver\session::getTransactionOptions' => ['array|null'], -'mongodb\driver\session::getTransactionState' => ['string'], -'mongodb\driver\session::startTransaction' => ['void', 'options'=>'array|object'], -'MongoDB\Driver\WriteConcern::__construct' => ['void', 'wstring'=>'string|int', 'wtimeout='=>'int', 'journal='=>'bool'], -'MongoDB\Driver\WriteConcern::bsonSerialize' => ['object'], -'MongoDB\Driver\WriteConcern::getJournal' => ['?bool'], -'MongoDB\Driver\WriteConcern::getJurnal' => ['?bool'], -'MongoDB\Driver\WriteConcern::getW' => ['int|null|string'], -'MongoDB\Driver\WriteConcern::getWtimeout' => ['int'], -'MongoDB\Driver\WriteConcern::isDefault' => ['bool'], -'MongoDB\Driver\WriteConcern::serialize' => ['string'], -'MongoDB\Driver\WriteConcern::unserialize' => ['void', 'serialized'=>'string'], -'MongoDB\Driver\WriteConcernError::getCode' => ['int'], -'MongoDB\Driver\WriteConcernError::getInfo' => ['mixed'], -'MongoDB\Driver\WriteConcernError::getMessage' => ['string'], -'MongoDB\Driver\WriteError::getCode' => ['int'], -'MongoDB\Driver\WriteError::getIndex' => ['int'], -'MongoDB\Driver\WriteError::getInfo' => ['mixed'], -'MongoDB\Driver\WriteError::getMessage' => ['string'], -'MongoDB\Driver\WriteException::getWriteResult' => [''], -'MongoDB\Driver\WriteResult::getDeletedCount' => ['?int'], -'MongoDB\Driver\WriteResult::getInfo' => [''], -'MongoDB\Driver\WriteResult::getInsertedCount' => ['?int'], -'MongoDB\Driver\WriteResult::getMatchedCount' => ['?int'], -'MongoDB\Driver\WriteResult::getModifiedCount' => ['?int'], -'MongoDB\Driver\WriteResult::getServer' => ['MongoDB\Driver\Server'], -'MongoDB\Driver\WriteResult::getUpsertedCount' => ['?int'], -'MongoDB\Driver\WriteResult::getUpsertedIds' => ['array'], -'MongoDB\Driver\WriteResult::getWriteConcernError' => ['MongoDB\Driver\WriteConcernError|null'], -'MongoDB\Driver\WriteResult::getWriteErrors' => ['MongoDB\Driver\WriteError[]'], -'MongoDB\Driver\WriteResult::isAcknowledged' => ['bool'], -'MongoDBRef::create' => ['array', 'collection'=>'string', 'id'=>'mixed', 'database='=>'string'], -'MongoDBRef::get' => ['?array', 'db'=>'MongoDB', 'ref'=>'array'], -'MongoDBRef::isRef' => ['bool', 'ref'=>'mixed'], -'MongoDeleteBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], -'MongoException::__clone' => ['void'], -'MongoException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'MongoException::__toString' => ['string'], -'MongoException::__wakeup' => ['void'], -'MongoException::getCode' => ['int'], -'MongoException::getFile' => ['string'], -'MongoException::getLine' => ['int'], -'MongoException::getMessage' => ['string'], -'MongoException::getPrevious' => ['Exception|Throwable'], -'MongoException::getTrace' => ['list\',args?:array}>'], -'MongoException::getTraceAsString' => ['string'], -'MongoGridFS::__construct' => ['void', 'db'=>'MongoDB', 'prefix='=>'string', 'chunks='=>'mixed'], -'MongoGridFS::__get' => ['MongoCollection', 'name'=>'string'], -'MongoGridFS::__toString' => ['string'], -'MongoGridFS::aggregate' => ['array', 'pipeline'=>'array', 'op'=>'array', 'pipelineOperators'=>'array'], -'MongoGridFS::aggregateCursor' => ['MongoCommandCursor', 'pipeline'=>'array', 'options'=>'array'], -'MongoGridFS::batchInsert' => ['mixed', 'a'=>'array', 'options='=>'array'], -'MongoGridFS::count' => ['int', 'query='=>'stdClass|array'], -'MongoGridFS::createDBRef' => ['array', 'a'=>'array'], -'MongoGridFS::createIndex' => ['array', 'keys'=>'array', 'options='=>'array'], -'MongoGridFS::delete' => ['bool', 'id'=>'mixed'], -'MongoGridFS::deleteIndex' => ['array', 'keys'=>'array|string'], -'MongoGridFS::deleteIndexes' => ['array'], -'MongoGridFS::distinct' => ['array|bool', 'key'=>'string', 'query='=>'?array'], -'MongoGridFS::drop' => ['array'], -'MongoGridFS::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'], -'MongoGridFS::find' => ['MongoGridFSCursor', 'query='=>'array', 'fields='=>'array'], -'MongoGridFS::findAndModify' => ['array', 'query'=>'array', 'update='=>'?array', 'fields='=>'?array', 'options='=>'?array'], -'MongoGridFS::findOne' => ['?MongoGridFSFile', 'query='=>'mixed', 'fields='=>'mixed'], -'MongoGridFS::get' => ['?MongoGridFSFile', 'id'=>'mixed'], -'MongoGridFS::getDBRef' => ['array', 'ref'=>'array'], -'MongoGridFS::getIndexInfo' => ['array'], -'MongoGridFS::getName' => ['string'], -'MongoGridFS::getReadPreference' => ['array'], -'MongoGridFS::getSlaveOkay' => ['bool'], -'MongoGridFS::group' => ['array', 'keys'=>'mixed', 'initial'=>'array', 'reduce'=>'MongoCode', 'condition='=>'array'], -'MongoGridFS::insert' => ['array|bool', 'a'=>'array|object', 'options='=>'array'], -'MongoGridFS::put' => ['mixed', 'filename'=>'string', 'extra='=>'array'], -'MongoGridFS::remove' => ['bool', 'criteria='=>'array', 'options='=>'array'], -'MongoGridFS::save' => ['array|bool', 'a'=>'array|object', 'options='=>'array'], -'MongoGridFS::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags'=>'array'], -'MongoGridFS::setSlaveOkay' => ['bool', 'ok='=>'bool'], -'MongoGridFS::storeBytes' => ['mixed', 'bytes'=>'string', 'extra='=>'array', 'options='=>'array'], -'MongoGridFS::storeFile' => ['mixed', 'filename'=>'string', 'extra='=>'array', 'options='=>'array'], -'MongoGridFS::storeUpload' => ['mixed', 'name'=>'string', 'filename='=>'string'], -'MongoGridFS::toIndexString' => ['string', 'keys'=>'mixed'], -'MongoGridFS::update' => ['bool', 'criteria'=>'array', 'newobj'=>'array', 'options='=>'array'], -'MongoGridFS::validate' => ['array', 'scan_data='=>'bool'], -'MongoGridFSCursor::__construct' => ['void', 'gridfs'=>'MongoGridFS', 'connection'=>'resource', 'ns'=>'string', 'query'=>'array', 'fields'=>'array'], -'MongoGridFSCursor::addOption' => ['MongoCursor', 'key'=>'string', 'value'=>'mixed'], -'MongoGridFSCursor::awaitData' => ['MongoCursor', 'wait='=>'bool'], -'MongoGridFSCursor::batchSize' => ['MongoCursor', 'batchSize'=>'int'], -'MongoGridFSCursor::count' => ['int', 'all='=>'bool'], -'MongoGridFSCursor::current' => ['MongoGridFSFile'], -'MongoGridFSCursor::dead' => ['bool'], -'MongoGridFSCursor::doQuery' => ['void'], -'MongoGridFSCursor::explain' => ['array'], -'MongoGridFSCursor::fields' => ['MongoCursor', 'f'=>'array'], -'MongoGridFSCursor::getNext' => ['MongoGridFSFile'], -'MongoGridFSCursor::getReadPreference' => ['array'], -'MongoGridFSCursor::hasNext' => ['bool'], -'MongoGridFSCursor::hint' => ['MongoCursor', 'key_pattern'=>'mixed'], -'MongoGridFSCursor::immortal' => ['MongoCursor', 'liveForever='=>'bool'], -'MongoGridFSCursor::info' => ['array'], -'MongoGridFSCursor::key' => ['string'], -'MongoGridFSCursor::limit' => ['MongoCursor', 'num'=>'int'], -'MongoGridFSCursor::maxTimeMS' => ['MongoCursor', 'ms'=>'int'], -'MongoGridFSCursor::next' => ['void'], -'MongoGridFSCursor::partial' => ['MongoCursor', 'okay='=>'bool'], -'MongoGridFSCursor::reset' => ['void'], -'MongoGridFSCursor::rewind' => ['void'], -'MongoGridFSCursor::setFlag' => ['MongoCursor', 'flag'=>'int', 'set='=>'bool'], -'MongoGridFSCursor::setReadPreference' => ['MongoCursor', 'read_preference'=>'string', 'tags'=>'array'], -'MongoGridFSCursor::skip' => ['MongoCursor', 'num'=>'int'], -'MongoGridFSCursor::slaveOkay' => ['MongoCursor', 'okay='=>'bool'], -'MongoGridFSCursor::snapshot' => ['MongoCursor'], -'MongoGridFSCursor::sort' => ['MongoCursor', 'fields'=>'array'], -'MongoGridFSCursor::tailable' => ['MongoCursor', 'tail='=>'bool'], -'MongoGridFSCursor::timeout' => ['MongoCursor', 'ms'=>'int'], -'MongoGridFSCursor::valid' => ['bool'], -'MongoGridfsFile::__construct' => ['void', 'gridfs'=>'MongoGridFS', 'file'=>'array'], -'MongoGridFSFile::getBytes' => ['string'], -'MongoGridFSFile::getFilename' => ['string'], -'MongoGridFSFile::getResource' => ['resource'], -'MongoGridFSFile::getSize' => ['int'], -'MongoGridFSFile::write' => ['int', 'filename='=>'string'], -'MongoId::__construct' => ['void', 'id='=>'string|MongoId'], -'MongoId::__set_state' => ['MongoId', 'props'=>'array'], -'MongoId::__toString' => ['string'], -'MongoId::getHostname' => ['string'], -'MongoId::getInc' => ['int'], -'MongoId::getPID' => ['int'], -'MongoId::getTimestamp' => ['int'], -'MongoId::isValid' => ['bool', 'value'=>'mixed'], -'MongoInsertBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], -'MongoInt32::__construct' => ['void', 'value'=>'string'], -'MongoInt32::__toString' => ['string'], -'MongoInt64::__construct' => ['void', 'value'=>'string'], -'MongoInt64::__toString' => ['string'], -'MongoLog::getCallback' => ['callable'], -'MongoLog::getLevel' => ['int'], -'MongoLog::getModule' => ['int'], -'MongoLog::setCallback' => ['void', 'log_function'=>'callable'], -'MongoLog::setLevel' => ['void', 'level'=>'int'], -'MongoLog::setModule' => ['void', 'module'=>'int'], -'MongoPool::getSize' => ['int'], -'MongoPool::info' => ['array'], -'MongoPool::setSize' => ['bool', 'size'=>'int'], -'MongoRegex::__construct' => ['void', 'regex'=>'string'], -'MongoRegex::__toString' => ['string'], -'MongoResultException::__clone' => ['void'], -'MongoResultException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'MongoResultException::__toString' => ['string'], -'MongoResultException::__wakeup' => ['void'], -'MongoResultException::getCode' => ['int'], -'MongoResultException::getDocument' => ['array'], -'MongoResultException::getFile' => ['string'], -'MongoResultException::getLine' => ['int'], -'MongoResultException::getMessage' => ['string'], -'MongoResultException::getPrevious' => ['Exception|Throwable'], -'MongoResultException::getTrace' => ['list\',args?:array}>'], -'MongoResultException::getTraceAsString' => ['string'], -'MongoTimestamp::__construct' => ['void', 'second='=>'int', 'inc='=>'int'], -'MongoTimestamp::__toString' => ['string'], -'MongoUpdateBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], -'MongoUpdateBatch::add' => ['bool', 'item'=>'array'], -'MongoUpdateBatch::execute' => ['array', 'write_options'=>'array'], -'MongoWriteBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'batch_type'=>'string', 'write_options'=>'array'], -'MongoWriteBatch::add' => ['bool', 'item'=>'array'], -'MongoWriteBatch::execute' => ['array', 'write_options'=>'array'], -'MongoWriteConcernException::__clone' => ['void'], -'MongoWriteConcernException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'MongoWriteConcernException::__toString' => ['string'], -'MongoWriteConcernException::__wakeup' => ['void'], -'MongoWriteConcernException::getCode' => ['int'], -'MongoWriteConcernException::getDocument' => ['array'], -'MongoWriteConcernException::getFile' => ['string'], -'MongoWriteConcernException::getLine' => ['int'], -'MongoWriteConcernException::getMessage' => ['string'], -'MongoWriteConcernException::getPrevious' => ['Exception|Throwable'], -'MongoWriteConcernException::getTrace' => ['list\',args?:array}>'], -'MongoWriteConcernException::getTraceAsString' => ['string'], -'monitor_custom_event' => ['void', 'class'=>'string', 'text'=>'string', 'severe='=>'int', 'user_data='=>'mixed'], -'monitor_httperror_event' => ['void', 'error_code'=>'int', 'url'=>'string', 'severe='=>'int'], -'monitor_license_info' => ['array'], -'monitor_pass_error' => ['void', 'errno'=>'int', 'errstr'=>'string', 'errfile'=>'string', 'errline'=>'int'], -'monitor_set_aggregation_hint' => ['void', 'hint'=>'string'], -'move_uploaded_file' => ['bool', 'from'=>'string', 'to'=>'string'], -'mqseries_back' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_begin' => ['void', 'hconn'=>'resource', 'beginoptions'=>'array', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_close' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'options'=>'int', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_cmit' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_conn' => ['void', 'qmanagername'=>'string', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_connx' => ['void', 'qmanagername'=>'string', 'connoptions'=>'array', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_disc' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_get' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'md'=>'array', 'gmo'=>'array', 'bufferlength'=>'int', 'msg'=>'string', 'data_length'=>'int', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_inq' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'selectorcount'=>'int', 'selectors'=>'array', 'intattrcount'=>'int', 'intattr'=>'resource', 'charattrlength'=>'int', 'charattr'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_open' => ['void', 'hconn'=>'resource', 'objdesc'=>'array', 'option'=>'int', 'hobj'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_put' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'md'=>'array', 'pmo'=>'array', 'message'=>'string', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_put1' => ['void', 'hconn'=>'resource', 'objdesc'=>'resource', 'msgdesc'=>'resource', 'pmo'=>'resource', 'buffer'=>'string', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_set' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'selectorcount'=>'int', 'selectors'=>'array', 'intattrcount'=>'int', 'intattrs'=>'array', 'charattrlength'=>'int', 'charattrs'=>'array', 'compcode'=>'resource', 'reason'=>'resource'], -'mqseries_strerror' => ['string', 'reason'=>'int'], -'ms_GetErrorObj' => ['errorObj'], -'ms_GetVersion' => ['string'], -'ms_GetVersionInt' => ['int'], -'ms_iogetStdoutBufferBytes' => ['int'], -'ms_iogetstdoutbufferstring' => ['void'], -'ms_ioinstallstdinfrombuffer' => ['void'], -'ms_ioinstallstdouttobuffer' => ['void'], -'ms_ioresethandlers' => ['void'], -'ms_iostripstdoutbuffercontentheaders' => ['void'], -'ms_iostripstdoutbuffercontenttype' => ['string'], -'ms_ResetErrorList' => ['void'], -'ms_TokenizeMap' => ['array', 'map_file_name'=>'string'], -'msession_connect' => ['bool', 'host'=>'string', 'port'=>'string'], -'msession_count' => ['int'], -'msession_create' => ['bool', 'session'=>'string', 'classname='=>'string', 'data='=>'string'], -'msession_destroy' => ['bool', 'name'=>'string'], -'msession_disconnect' => ['void'], -'msession_find' => ['array', 'name'=>'string', 'value'=>'string'], -'msession_get' => ['string', 'session'=>'string', 'name'=>'string', 'value'=>'string'], -'msession_get_array' => ['array', 'session'=>'string'], -'msession_get_data' => ['string', 'session'=>'string'], -'msession_inc' => ['string', 'session'=>'string', 'name'=>'string'], -'msession_list' => ['array'], -'msession_listvar' => ['array', 'name'=>'string'], -'msession_lock' => ['int', 'name'=>'string'], -'msession_plugin' => ['string', 'session'=>'string', 'value'=>'string', 'param='=>'string'], -'msession_randstr' => ['string', 'param'=>'int'], -'msession_set' => ['bool', 'session'=>'string', 'name'=>'string', 'value'=>'string'], -'msession_set_array' => ['void', 'session'=>'string', 'tuples'=>'array'], -'msession_set_data' => ['bool', 'session'=>'string', 'value'=>'string'], -'msession_timeout' => ['int', 'session'=>'string', 'param='=>'int'], -'msession_uniq' => ['string', 'param'=>'int', 'classname='=>'string', 'data='=>'string'], -'msession_unlock' => ['int', 'session'=>'string', 'key'=>'int'], -'msg_get_queue' => ['resource', 'key'=>'int', 'permissions='=>'int'], -'msg_queue_exists' => ['bool', 'key'=>'int'], -'msg_receive' => ['bool', 'queue'=>'resource', 'desired_message_type'=>'int', '&w_received_message_type'=>'int', 'max_message_size'=>'int', '&w_message'=>'mixed', 'unserialize='=>'bool', 'flags='=>'int', '&w_error_code='=>'int'], -'msg_remove_queue' => ['bool', 'queue'=>'resource'], -'msg_send' => ['bool', 'queue'=>'resource', 'message_type'=>'int', 'message'=>'mixed', 'serialize='=>'bool', 'blocking='=>'bool', '&w_error_code='=>'int'], -'msg_set_queue' => ['bool', 'queue'=>'resource', 'data'=>'array'], -'msg_stat_queue' => ['array', 'queue'=>'resource'], -'msgfmt_create' => ['?MessageFormatter', 'locale'=>'string', 'pattern'=>'string'], -'msgfmt_format' => ['string|false', 'formatter'=>'MessageFormatter', 'values'=>'array'], -'msgfmt_format_message' => ['string|false', 'locale'=>'string', 'pattern'=>'string', 'values'=>'array'], -'msgfmt_get_error_code' => ['int', 'formatter'=>'MessageFormatter'], -'msgfmt_get_error_message' => ['string', 'formatter'=>'MessageFormatter'], -'msgfmt_get_locale' => ['string', 'formatter'=>'MessageFormatter'], -'msgfmt_get_pattern' => ['string', 'formatter'=>'MessageFormatter'], -'msgfmt_parse' => ['array|false', 'formatter'=>'MessageFormatter', 'string'=>'string'], -'msgfmt_parse_message' => ['array|false', 'locale'=>'string', 'pattern'=>'string', 'message'=>'string'], -'msgfmt_set_pattern' => ['bool', 'formatter'=>'MessageFormatter', 'pattern'=>'string'], -'msql_affected_rows' => ['int', 'result'=>'resource'], -'msql_close' => ['bool', 'link_identifier='=>'?resource'], -'msql_connect' => ['resource', 'hostname='=>'string'], -'msql_create_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], -'msql_data_seek' => ['bool', 'result'=>'resource', 'row_number'=>'int'], -'msql_db_query' => ['resource', 'database'=>'string', 'query'=>'string', 'link_identifier='=>'?resource'], -'msql_drop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], -'msql_error' => ['string'], -'msql_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], -'msql_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], -'msql_fetch_object' => ['object', 'result'=>'resource'], -'msql_fetch_row' => ['array', 'result'=>'resource'], -'msql_field_flags' => ['string', 'result'=>'resource', 'field_offset'=>'int'], -'msql_field_len' => ['int', 'result'=>'resource', 'field_offset'=>'int'], -'msql_field_name' => ['string', 'result'=>'resource', 'field_offset'=>'int'], -'msql_field_seek' => ['bool', 'result'=>'resource', 'field_offset'=>'int'], -'msql_field_table' => ['int', 'result'=>'resource', 'field_offset'=>'int'], -'msql_field_type' => ['string', 'result'=>'resource', 'field_offset'=>'int'], -'msql_free_result' => ['bool', 'result'=>'resource'], -'msql_list_dbs' => ['resource', 'link_identifier='=>'?resource'], -'msql_list_fields' => ['resource', 'database'=>'string', 'tablename'=>'string', 'link_identifier='=>'?resource'], -'msql_list_tables' => ['resource', 'database'=>'string', 'link_identifier='=>'?resource'], -'msql_num_fields' => ['int', 'result'=>'resource'], -'msql_num_rows' => ['int', 'query_identifier'=>'resource'], -'msql_pconnect' => ['resource', 'hostname='=>'string'], -'msql_query' => ['resource', 'query'=>'string', 'link_identifier='=>'?resource'], -'msql_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field='=>'mixed'], -'msql_select_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], -'mt_getrandmax' => ['int'], -'mt_rand' => ['int', 'min'=>'int', 'max'=>'int'], -'mt_rand\'1' => ['int'], -'mt_srand' => ['void', 'seed='=>'int', 'mode='=>'int'], -'MultipleIterator::__construct' => ['void', 'flags='=>'int'], -'MultipleIterator::attachIterator' => ['void', 'iterator'=>'Iterator', 'infos='=>'string'], -'MultipleIterator::containsIterator' => ['bool', 'iterator'=>'Iterator'], -'MultipleIterator::countIterators' => ['int'], -'MultipleIterator::current' => ['array|false'], -'MultipleIterator::detachIterator' => ['void', 'iterator'=>'Iterator'], -'MultipleIterator::getFlags' => ['int'], -'MultipleIterator::key' => ['array'], -'MultipleIterator::next' => ['void'], -'MultipleIterator::rewind' => ['void'], -'MultipleIterator::setFlags' => ['int', 'flags'=>'int'], -'MultipleIterator::valid' => ['bool'], -'Mutex::create' => ['long', 'lock='=>'bool'], -'Mutex::destroy' => ['bool', 'mutex'=>'long'], -'Mutex::lock' => ['bool', 'mutex'=>'long'], -'Mutex::trylock' => ['bool', 'mutex'=>'long'], -'Mutex::unlock' => ['bool', 'mutex'=>'long', 'destroy='=>'bool'], -'mysql_xdevapi\baseresult::getWarnings' => ['array'], -'mysql_xdevapi\baseresult::getWarningsCount' => ['integer'], -'mysql_xdevapi\collection::add' => ['mysql_xdevapi\CollectionAdd', 'document'=>'mixed'], -'mysql_xdevapi\collection::addOrReplaceOne' => ['mysql_xdevapi\Result', 'id'=>'string', 'doc'=>'string'], -'mysql_xdevapi\collection::count' => ['integer'], -'mysql_xdevapi\collection::createIndex' => ['void', 'index_name'=>'string', 'index_desc_json'=>'string'], -'mysql_xdevapi\collection::dropIndex' => ['bool', 'index_name'=>'string'], -'mysql_xdevapi\collection::existsInDatabase' => ['bool'], -'mysql_xdevapi\collection::find' => ['mysql_xdevapi\CollectionFind', 'search_condition='=>'string'], -'mysql_xdevapi\collection::getName' => ['string'], -'mysql_xdevapi\collection::getOne' => ['Document', 'id'=>'string'], -'mysql_xdevapi\collection::getSchema' => ['mysql_xdevapi\schema'], -'mysql_xdevapi\collection::getSession' => ['Session'], -'mysql_xdevapi\collection::modify' => ['mysql_xdevapi\CollectionModify', 'search_condition'=>'string'], -'mysql_xdevapi\collection::remove' => ['mysql_xdevapi\CollectionRemove', 'search_condition'=>'string'], -'mysql_xdevapi\collection::removeOne' => ['mysql_xdevapi\Result', 'id'=>'string'], -'mysql_xdevapi\collection::replaceOne' => ['mysql_xdevapi\Result', 'id'=>'string', 'doc'=>'string'], -'mysql_xdevapi\collectionadd::execute' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\collectionfind::bind' => ['mysql_xdevapi\CollectionFind', 'placeholder_values'=>'array'], -'mysql_xdevapi\collectionfind::execute' => ['mysql_xdevapi\DocResult'], -'mysql_xdevapi\collectionfind::fields' => ['mysql_xdevapi\CollectionFind', 'projection'=>'string'], -'mysql_xdevapi\collectionfind::groupBy' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], -'mysql_xdevapi\collectionfind::having' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], -'mysql_xdevapi\collectionfind::limit' => ['mysql_xdevapi\CollectionFind', 'rows'=>'integer'], -'mysql_xdevapi\collectionfind::lockExclusive' => ['mysql_xdevapi\CollectionFind', 'lock_waiting_option='=>'integer'], -'mysql_xdevapi\collectionfind::lockShared' => ['mysql_xdevapi\CollectionFind', 'lock_waiting_option='=>'integer'], -'mysql_xdevapi\collectionfind::offset' => ['mysql_xdevapi\CollectionFind', 'position'=>'integer'], -'mysql_xdevapi\collectionfind::sort' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], -'mysql_xdevapi\collectionmodify::arrayAppend' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], -'mysql_xdevapi\collectionmodify::arrayInsert' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], -'mysql_xdevapi\collectionmodify::bind' => ['mysql_xdevapi\CollectionModify', 'placeholder_values'=>'array'], -'mysql_xdevapi\collectionmodify::execute' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\collectionmodify::limit' => ['mysql_xdevapi\CollectionModify', 'rows'=>'integer'], -'mysql_xdevapi\collectionmodify::patch' => ['mysql_xdevapi\CollectionModify', 'document'=>'string'], -'mysql_xdevapi\collectionmodify::replace' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], -'mysql_xdevapi\collectionmodify::set' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], -'mysql_xdevapi\collectionmodify::skip' => ['mysql_xdevapi\CollectionModify', 'position'=>'integer'], -'mysql_xdevapi\collectionmodify::sort' => ['mysql_xdevapi\CollectionModify', 'sort_expr'=>'string'], -'mysql_xdevapi\collectionmodify::unset' => ['mysql_xdevapi\CollectionModify', 'fields'=>'array'], -'mysql_xdevapi\collectionremove::bind' => ['mysql_xdevapi\CollectionRemove', 'placeholder_values'=>'array'], -'mysql_xdevapi\collectionremove::execute' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\collectionremove::limit' => ['mysql_xdevapi\CollectionRemove', 'rows'=>'integer'], -'mysql_xdevapi\collectionremove::sort' => ['mysql_xdevapi\CollectionRemove', 'sort_expr'=>'string'], -'mysql_xdevapi\columnresult::getCharacterSetName' => ['string'], -'mysql_xdevapi\columnresult::getCollationName' => ['string'], -'mysql_xdevapi\columnresult::getColumnLabel' => ['string'], -'mysql_xdevapi\columnresult::getColumnName' => ['string'], -'mysql_xdevapi\columnresult::getFractionalDigits' => ['integer'], -'mysql_xdevapi\columnresult::getLength' => ['integer'], -'mysql_xdevapi\columnresult::getSchemaName' => ['string'], -'mysql_xdevapi\columnresult::getTableLabel' => ['string'], -'mysql_xdevapi\columnresult::getTableName' => ['string'], -'mysql_xdevapi\columnresult::getType' => ['integer'], -'mysql_xdevapi\columnresult::isNumberSigned' => ['integer'], -'mysql_xdevapi\columnresult::isPadded' => ['integer'], -'mysql_xdevapi\crudoperationbindable::bind' => ['mysql_xdevapi\CrudOperationBindable', 'placeholder_values'=>'array'], -'mysql_xdevapi\crudoperationlimitable::limit' => ['mysql_xdevapi\CrudOperationLimitable', 'rows'=>'integer'], -'mysql_xdevapi\crudoperationskippable::skip' => ['mysql_xdevapi\CrudOperationSkippable', 'skip'=>'integer'], -'mysql_xdevapi\crudoperationsortable::sort' => ['mysql_xdevapi\CrudOperationSortable', 'sort_expr'=>'string'], -'mysql_xdevapi\databaseobject::existsInDatabase' => ['bool'], -'mysql_xdevapi\databaseobject::getName' => ['string'], -'mysql_xdevapi\databaseobject::getSession' => ['mysql_xdevapi\Session'], -'mysql_xdevapi\docresult::fetchAll' => ['Array'], -'mysql_xdevapi\docresult::fetchOne' => ['Object'], -'mysql_xdevapi\docresult::getWarnings' => ['Array'], -'mysql_xdevapi\docresult::getWarningsCount' => ['integer'], -'mysql_xdevapi\executable::execute' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\getsession' => ['mysql_xdevapi\Session', 'uri'=>'string'], -'mysql_xdevapi\result::getAutoIncrementValue' => ['int'], -'mysql_xdevapi\result::getGeneratedIds' => ['ArrayOfInt'], -'mysql_xdevapi\result::getWarnings' => ['array'], -'mysql_xdevapi\result::getWarningsCount' => ['integer'], -'mysql_xdevapi\rowresult::fetchAll' => ['array'], -'mysql_xdevapi\rowresult::fetchOne' => ['object'], -'mysql_xdevapi\rowresult::getColumnCount' => ['integer'], -'mysql_xdevapi\rowresult::getColumnNames' => ['array'], -'mysql_xdevapi\rowresult::getColumns' => ['array'], -'mysql_xdevapi\rowresult::getWarnings' => ['array'], -'mysql_xdevapi\rowresult::getWarningsCount' => ['integer'], -'mysql_xdevapi\schema::createCollection' => ['mysql_xdevapi\Collection', 'name'=>'string'], -'mysql_xdevapi\schema::dropCollection' => ['bool', 'collection_name'=>'string'], -'mysql_xdevapi\schema::existsInDatabase' => ['bool'], -'mysql_xdevapi\schema::getCollection' => ['mysql_xdevapi\Collection', 'name'=>'string'], -'mysql_xdevapi\schema::getCollectionAsTable' => ['mysql_xdevapi\Table', 'name'=>'string'], -'mysql_xdevapi\schema::getCollections' => ['array'], -'mysql_xdevapi\schema::getName' => ['string'], -'mysql_xdevapi\schema::getSession' => ['mysql_xdevapi\Session'], -'mysql_xdevapi\schema::getTable' => ['mysql_xdevapi\Table', 'name'=>'string'], -'mysql_xdevapi\schema::getTables' => ['array'], -'mysql_xdevapi\schemaobject::getSchema' => ['mysql_xdevapi\Schema'], -'mysql_xdevapi\session::close' => ['bool'], -'mysql_xdevapi\session::commit' => ['Object'], -'mysql_xdevapi\session::createSchema' => ['mysql_xdevapi\Schema', 'schema_name'=>'string'], -'mysql_xdevapi\session::dropSchema' => ['bool', 'schema_name'=>'string'], -'mysql_xdevapi\session::executeSql' => ['Object', 'statement'=>'string'], -'mysql_xdevapi\session::generateUUID' => ['string'], -'mysql_xdevapi\session::getClientId' => ['integer'], -'mysql_xdevapi\session::getSchema' => ['mysql_xdevapi\Schema', 'schema_name'=>'string'], -'mysql_xdevapi\session::getSchemas' => ['array'], -'mysql_xdevapi\session::getServerVersion' => ['integer'], -'mysql_xdevapi\session::killClient' => ['object', 'client_id'=>'integer'], -'mysql_xdevapi\session::listClients' => ['array'], -'mysql_xdevapi\session::quoteName' => ['string', 'name'=>'string'], -'mysql_xdevapi\session::releaseSavepoint' => ['void', 'name'=>'string'], -'mysql_xdevapi\session::rollback' => ['void'], -'mysql_xdevapi\session::rollbackTo' => ['void', 'name'=>'string'], -'mysql_xdevapi\session::setSavepoint' => ['string', 'name='=>'string'], -'mysql_xdevapi\session::sql' => ['mysql_xdevapi\SqlStatement', 'query'=>'string'], -'mysql_xdevapi\session::startTransaction' => ['void'], -'mysql_xdevapi\sqlstatement::bind' => ['mysql_xdevapi\SqlStatement', 'param'=>'string'], -'mysql_xdevapi\sqlstatement::execute' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\sqlstatement::getNextResult' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\sqlstatement::getResult' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\sqlstatement::hasMoreResults' => ['bool'], -'mysql_xdevapi\sqlstatementresult::fetchAll' => ['array'], -'mysql_xdevapi\sqlstatementresult::fetchOne' => ['object'], -'mysql_xdevapi\sqlstatementresult::getAffectedItemsCount' => ['integer'], -'mysql_xdevapi\sqlstatementresult::getColumnCount' => ['integer'], -'mysql_xdevapi\sqlstatementresult::getColumnNames' => ['array'], -'mysql_xdevapi\sqlstatementresult::getColumns' => ['Array'], -'mysql_xdevapi\sqlstatementresult::getGeneratedIds' => ['array'], -'mysql_xdevapi\sqlstatementresult::getLastInsertId' => ['String'], -'mysql_xdevapi\sqlstatementresult::getWarnings' => ['array'], -'mysql_xdevapi\sqlstatementresult::getWarningsCount' => ['integer'], -'mysql_xdevapi\sqlstatementresult::hasData' => ['bool'], -'mysql_xdevapi\sqlstatementresult::nextResult' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\statement::getNextResult' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\statement::getResult' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\statement::hasMoreResults' => ['bool'], -'mysql_xdevapi\table::count' => ['integer'], -'mysql_xdevapi\table::delete' => ['mysql_xdevapi\TableDelete'], -'mysql_xdevapi\table::existsInDatabase' => ['bool'], -'mysql_xdevapi\table::getName' => ['string'], -'mysql_xdevapi\table::getSchema' => ['mysql_xdevapi\Schema'], -'mysql_xdevapi\table::getSession' => ['mysql_xdevapi\Session'], -'mysql_xdevapi\table::insert' => ['mysql_xdevapi\TableInsert', 'columns'=>'mixed', '...args='=>'mixed'], -'mysql_xdevapi\table::isView' => ['bool'], -'mysql_xdevapi\table::select' => ['mysql_xdevapi\TableSelect', 'columns'=>'mixed', '...args='=>'mixed'], -'mysql_xdevapi\table::update' => ['mysql_xdevapi\TableUpdate'], -'mysql_xdevapi\tabledelete::bind' => ['mysql_xdevapi\TableDelete', 'placeholder_values'=>'array'], -'mysql_xdevapi\tabledelete::execute' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\tabledelete::limit' => ['mysql_xdevapi\TableDelete', 'rows'=>'integer'], -'mysql_xdevapi\tabledelete::offset' => ['mysql_xdevapi\TableDelete', 'position'=>'integer'], -'mysql_xdevapi\tabledelete::orderby' => ['mysql_xdevapi\TableDelete', 'orderby_expr'=>'string'], -'mysql_xdevapi\tabledelete::where' => ['mysql_xdevapi\TableDelete', 'where_expr'=>'string'], -'mysql_xdevapi\tableinsert::execute' => ['mysql_xdevapi\Result'], -'mysql_xdevapi\tableinsert::values' => ['mysql_xdevapi\TableInsert', 'row_values'=>'array'], -'mysql_xdevapi\tableselect::bind' => ['mysql_xdevapi\TableSelect', 'placeholder_values'=>'array'], -'mysql_xdevapi\tableselect::execute' => ['mysql_xdevapi\RowResult'], -'mysql_xdevapi\tableselect::groupBy' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'mixed'], -'mysql_xdevapi\tableselect::having' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'string'], -'mysql_xdevapi\tableselect::limit' => ['mysql_xdevapi\TableSelect', 'rows'=>'integer'], -'mysql_xdevapi\tableselect::lockExclusive' => ['mysql_xdevapi\TableSelect', 'lock_waiting_option='=>'integer'], -'mysql_xdevapi\tableselect::lockShared' => ['mysql_xdevapi\TableSelect', 'lock_waiting_option='=>'integer'], -'mysql_xdevapi\tableselect::offset' => ['mysql_xdevapi\TableSelect', 'position'=>'integer'], -'mysql_xdevapi\tableselect::orderby' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'mixed', '...args='=>'mixed'], -'mysql_xdevapi\tableselect::where' => ['mysql_xdevapi\TableSelect', 'where_expr'=>'string'], -'mysql_xdevapi\tableupdate::bind' => ['mysql_xdevapi\TableUpdate', 'placeholder_values'=>'array'], -'mysql_xdevapi\tableupdate::execute' => ['mysql_xdevapi\TableUpdate'], -'mysql_xdevapi\tableupdate::limit' => ['mysql_xdevapi\TableUpdate', 'rows'=>'integer'], -'mysql_xdevapi\tableupdate::orderby' => ['mysql_xdevapi\TableUpdate', 'orderby_expr'=>'mixed', '...args='=>'mixed'], -'mysql_xdevapi\tableupdate::set' => ['mysql_xdevapi\TableUpdate', 'table_field'=>'string', 'expression_or_literal'=>'string'], -'mysql_xdevapi\tableupdate::where' => ['mysql_xdevapi\TableUpdate', 'where_expr'=>'string'], -'mysqli::__construct' => ['void', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], -'mysqli::autocommit' => ['bool', 'enable'=>'bool'], -'mysqli::begin_transaction' => ['bool', 'flags='=>'int', 'name='=>'?string'], -'mysqli::change_user' => ['bool', 'username'=>'string', 'password'=>'string', 'database'=>'?string'], -'mysqli::character_set_name' => ['string'], -'mysqli::close' => ['bool'], -'mysqli::commit' => ['bool', 'flags='=>'int', 'name='=>'?string'], -'mysqli::connect' => ['bool', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], -'mysqli::debug' => ['bool', 'options'=>'string'], -'mysqli::disable_reads_from_master' => ['bool'], -'mysqli::dump_debug_info' => ['bool'], -'mysqli::escape_string' => ['string', 'string'=>'string'], -'mysqli::get_charset' => ['object'], -'mysqli::get_client_info' => ['string'], -'mysqli::get_connection_stats' => ['array'], -'mysqli::get_warnings' => ['mysqli_warning'], -'mysqli::init' => ['false|null'], -'mysqli::kill' => ['bool', 'process_id'=>'int'], -'mysqli::more_results' => ['bool'], -'mysqli::multi_query' => ['bool', 'query'=>'string'], -'mysqli::next_result' => ['bool'], -'mysqli::options' => ['bool', 'option'=>'int', 'value'=>'string|int'], -'mysqli::ping' => ['bool'], -'mysqli::poll' => ['int|false', '&w_read'=>'array', '&w_write'=>'array', '&w_error'=>'array', 'seconds'=>'int', 'microseconds='=>'int'], -'mysqli::prepare' => ['mysqli_stmt|false', 'query'=>'string'], -'mysqli::query' => ['bool|mysqli_result', 'query'=>'string', 'result_mode='=>'int'], -'mysqli::real_connect' => ['bool', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null', 'flags='=>'int'], -'mysqli::real_escape_string' => ['string', 'string'=>'string'], -'mysqli::real_query' => ['bool', 'query'=>'string'], -'mysqli::reap_async_query' => ['mysqli_result|false'], -'mysqli::refresh' => ['bool', 'flags'=>'int'], -'mysqli::release_savepoint' => ['bool', 'name'=>'string'], -'mysqli::rollback' => ['bool', 'flags='=>'int', 'name='=>'?string'], -'mysqli::rpl_query_type' => ['int', 'query'=>'string'], -'mysqli::savepoint' => ['bool', 'name'=>'string'], -'mysqli::select_db' => ['bool', 'database'=>'string'], -'mysqli::send_query' => ['bool', 'query'=>'string'], -'mysqli::set_charset' => ['bool', 'charset'=>'string'], -'mysqli::set_local_infile_default' => ['void'], -'mysqli::set_local_infile_handler' => ['bool', 'read_func='=>'callable'], -'mysqli::set_opt' => ['bool', 'option'=>'int', 'value'=>'string|int'], -'mysqli::ssl_set' => ['bool', 'key'=>'?string', 'certificate'=>'?string', 'ca_certificate'=>'?string', 'ca_path'=>'?string', 'cipher_algos'=>'?string'], -'mysqli::stat' => ['string|false'], -'mysqli::stmt_init' => ['mysqli_stmt'], -'mysqli::store_result' => ['mysqli_result|false', 'mode='=>'int'], -'mysqli::thread_safe' => ['bool'], -'mysqli::use_result' => ['mysqli_result|false'], -'mysqli_affected_rows' => ['int', 'mysql'=>'mysqli'], -'mysqli_autocommit' => ['bool', 'mysql'=>'mysqli', 'enable'=>'bool'], -'mysqli_begin_transaction' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], -'mysqli_change_user' => ['bool', 'mysql'=>'mysqli', 'username'=>'string', 'password'=>'string', 'database'=>'?string'], -'mysqli_character_set_name' => ['string', 'mysql'=>'mysqli'], -'mysqli_close' => ['bool', 'mysql'=>'mysqli'], -'mysqli_commit' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], -'mysqli_connect' => ['mysqli|false', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], -'mysqli_connect_errno' => ['int'], -'mysqli_connect_error' => ['?string'], -'mysqli_data_seek' => ['bool', 'result'=>'mysqli_result', 'offset'=>'int'], -'mysqli_debug' => ['bool', 'options'=>'string'], -'mysqli_disable_reads_from_master' => ['bool', 'link'=>'mysqli'], -'mysqli_disable_rpl_parse' => ['bool', 'link'=>'mysqli'], -'mysqli_driver::embedded_server_end' => ['void'], -'mysqli_driver::embedded_server_start' => ['bool', 'start'=>'int', 'arguments'=>'array', 'groups'=>'array'], -'mysqli_dump_debug_info' => ['bool', 'mysql'=>'mysqli'], -'mysqli_embedded_server_end' => ['void'], -'mysqli_embedded_server_start' => ['bool', 'start'=>'int', 'arguments'=>'array', 'groups'=>'array'], -'mysqli_enable_reads_from_master' => ['bool', 'link'=>'mysqli'], -'mysqli_enable_rpl_parse' => ['bool', 'link'=>'mysqli'], -'mysqli_errno' => ['int', 'mysql'=>'mysqli'], -'mysqli_error' => ['string', 'mysql'=>'mysqli'], -'mysqli_error_list' => ['array', 'mysql'=>'mysqli'], -'mysqli_escape_string' => ['string', 'mysql'=>'mysqli', 'string'=>'string'], -'mysqli_execute' => ['bool', 'statement'=>'mysqli_stmt', 'params='=>'list|null'], -'mysqli_fetch_all' => ['list>', 'result'=>'mysqli_result', 'mode='=>'3'], -'mysqli_fetch_all\'1' => ['list>', 'result'=>'mysqli_result', 'mode='=>'1'], -'mysqli_fetch_all\'2' => ['list>', 'result'=>'mysqli_result', 'mode='=>'2'], -'mysqli_fetch_array' => ['array|false|null', 'result'=>'mysqli_result', 'mode='=>'3'], -'mysqli_fetch_array\'1' => ['array|false|null', 'result'=>'mysqli_result', 'mode='=>'1'], -'mysqli_fetch_array\'2' => ['list|false|null', 'result'=>'mysqli_result', 'mode='=>'2'], -'mysqli_fetch_assoc' => ['array|false|null', 'result'=>'mysqli_result'], -'mysqli_fetch_column' => ['null|int|float|string|false', 'result'=>'mysqli_result', 'column='=>'int'], -'mysqli_fetch_field' => ['object|false', 'result'=>'mysqli_result'], -'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_row' => ['list|false|null', 'result'=>'mysqli_result'], -'mysqli_field_count' => ['int', 'mysql'=>'mysqli'], -'mysqli_field_seek' => ['bool', 'result'=>'mysqli_result', 'index'=>'int'], -'mysqli_field_tell' => ['int', 'result'=>'mysqli_result'], -'mysqli_free_result' => ['void', 'result'=>'mysqli_result'], -'mysqli_get_cache_stats' => ['array|false'], -'mysqli_get_charset' => ['?object', 'mysql'=>'mysqli'], -'mysqli_get_client_info' => ['string', 'mysql='=>'?mysqli'], -'mysqli_get_client_stats' => ['array'], -'mysqli_get_client_version' => ['int', 'link'=>'mysqli'], -'mysqli_get_connection_stats' => ['array', 'mysql'=>'mysqli'], -'mysqli_get_host_info' => ['string', 'mysql'=>'mysqli'], -'mysqli_get_links_stats' => ['array'], -'mysqli_get_proto_info' => ['int', 'mysql'=>'mysqli'], -'mysqli_get_server_info' => ['string', 'mysql'=>'mysqli'], -'mysqli_get_server_version' => ['int', 'mysql'=>'mysqli'], -'mysqli_get_warnings' => ['mysqli_warning', 'mysql'=>'mysqli'], -'mysqli_info' => ['?string', 'mysql'=>'mysqli'], -'mysqli_init' => ['mysqli|false'], -'mysqli_insert_id' => ['int|string', 'mysql'=>'mysqli'], -'mysqli_kill' => ['bool', 'mysql'=>'mysqli', 'process_id'=>'int'], -'mysqli_link_construct' => ['object'], -'mysqli_master_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], -'mysqli_more_results' => ['bool', 'mysql'=>'mysqli'], -'mysqli_multi_query' => ['bool', 'mysql'=>'mysqli', 'query'=>'string'], -'mysqli_next_result' => ['bool', 'mysql'=>'mysqli'], -'mysqli_num_fields' => ['int', 'result'=>'mysqli_result'], -'mysqli_num_rows' => ['int', 'result'=>'mysqli_result'], -'mysqli_options' => ['bool', 'mysql'=>'mysqli', 'option'=>'int', 'value'=>'string|int'], -'mysqli_ping' => ['bool', 'mysql'=>'mysqli'], -'mysqli_poll' => ['int|false', 'read'=>'array', 'write'=>'array', 'error'=>'array', 'seconds'=>'int', 'microseconds='=>'int'], -'mysqli_prepare' => ['mysqli_stmt|false', 'mysql'=>'mysqli', 'query'=>'string'], -'mysqli_query' => ['mysqli_result|bool', 'mysql'=>'mysqli', 'query'=>'string', 'result_mode='=>'int'], -'mysqli_real_connect' => ['bool', 'mysql='=>'mysqli', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null', 'flags='=>'int'], -'mysqli_real_escape_string' => ['string', 'mysql'=>'mysqli', 'string'=>'string'], -'mysqli_real_query' => ['bool', 'mysql'=>'mysqli', 'query'=>'string'], -'mysqli_reap_async_query' => ['mysqli_result|false', 'mysql'=>'mysqli'], -'mysqli_refresh' => ['bool', 'mysql'=>'mysqli', 'flags'=>'int'], -'mysqli_release_savepoint' => ['bool', 'mysql'=>'mysqli', 'name'=>'string'], -'mysqli_report' => ['bool', 'flags'=>'int'], -'mysqli_result::__construct' => ['void', 'mysql'=>'mysqli', 'result_mode='=>'int'], -'mysqli_result::close' => ['void'], -'mysqli_result::data_seek' => ['bool', 'offset'=>'int'], -'mysqli_result::fetch_all' => ['list>', 'mode='=>'3'], -'mysqli_result::fetch_all\'1' => ['list>', 'mode='=>'1'], -'mysqli_result::fetch_all\'2' => ['list>', 'mode='=>'2'], -'mysqli_result::fetch_array' => ['array|false|null', 'mode='=>'3'], -'mysqli_result::fetch_array\'1' => ['array|false|null', 'mode='=>'1'], -'mysqli_result::fetch_array\'2' => ['list|false|null', 'mode='=>'2'], -'mysqli_result::fetch_assoc' => ['array|false|null'], -'mysqli_result::fetch_column' => ['null|int|float|string|false', 'column='=>'int'], -'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_row' => ['list|false|null'], -'mysqli_result::field_seek' => ['bool', 'index'=>'int'], -'mysqli_result::free' => ['void'], -'mysqli_result::free_result' => ['void'], -'mysqli_rollback' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], -'mysqli_rpl_parse_enabled' => ['int', 'link'=>'mysqli'], -'mysqli_rpl_probe' => ['bool', 'link'=>'mysqli'], -'mysqli_rpl_query_type' => ['int', 'link'=>'mysqli', 'query'=>'string'], -'mysqli_savepoint' => ['bool', 'mysql'=>'mysqli', 'name'=>'string'], -'mysqli_savepoint_libmysql' => ['bool'], -'mysqli_select_db' => ['bool', 'mysql'=>'mysqli', 'database'=>'string'], -'mysqli_send_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], -'mysqli_set_charset' => ['bool', 'mysql'=>'mysqli', 'charset'=>'string'], -'mysqli_set_local_infile_default' => ['void', 'link'=>'mysqli'], -'mysqli_set_local_infile_handler' => ['bool', 'link'=>'mysqli', 'read_func'=>'callable'], -'mysqli_set_opt' => ['bool', 'mysql'=>'mysqli', 'option'=>'int', 'value'=>'string|int'], -'mysqli_slave_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], -'mysqli_sqlstate' => ['string', 'mysql'=>'mysqli'], -'mysqli_ssl_set' => ['bool', 'mysql'=>'mysqli', 'key'=>'?string', 'certificate'=>'?string', 'ca_certificate'=>'?string', 'ca_path'=>'?string', 'cipher_algos'=>'?string'], -'mysqli_stat' => ['string|false', 'mysql'=>'mysqli'], -'mysqli_stmt::__construct' => ['void', 'mysql'=>'mysqli', 'query'=>'string'], -'mysqli_stmt::attr_get' => ['int', 'attribute'=>'int'], -'mysqli_stmt::attr_set' => ['bool', 'attribute'=>'int', 'value'=>'int'], -'mysqli_stmt::bind_param' => ['bool', 'types'=>'string', '&vars'=>'mixed', '&...args='=>'mixed'], -'mysqli_stmt::bind_result' => ['bool', '&w_var1'=>'', '&...w_vars='=>''], -'mysqli_stmt::close' => ['bool'], -'mysqli_stmt::data_seek' => ['void', 'offset'=>'int'], -'mysqli_stmt::execute' => ['bool', 'params='=>'list|null'], -'mysqli_stmt::fetch' => ['bool|null'], -'mysqli_stmt::free_result' => ['void'], -'mysqli_stmt::get_result' => ['mysqli_result|false'], -'mysqli_stmt::get_warnings' => ['object'], -'mysqli_stmt::more_results' => ['bool'], -'mysqli_stmt::next_result' => ['bool'], -'mysqli_stmt::num_rows' => ['int'], -'mysqli_stmt::prepare' => ['bool', 'query'=>'string'], -'mysqli_stmt::reset' => ['bool'], -'mysqli_stmt::result_metadata' => ['mysqli_result|false'], -'mysqli_stmt::send_long_data' => ['bool', 'param_num'=>'int', 'data'=>'string'], -'mysqli_stmt::store_result' => ['bool'], -'mysqli_stmt_affected_rows' => ['int|string', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_attr_get' => ['int', 'statement'=>'mysqli_stmt', 'attribute'=>'int'], -'mysqli_stmt_attr_set' => ['bool', 'statement'=>'mysqli_stmt', 'attribute'=>'int', 'value'=>'int'], -'mysqli_stmt_bind_param' => ['bool', 'statement'=>'mysqli_stmt', 'types'=>'string', '&vars'=>'mixed', '&...args='=>'mixed'], -'mysqli_stmt_bind_result' => ['bool', 'statement'=>'mysqli_stmt', '&w_var1'=>'', '&...w_vars='=>''], -'mysqli_stmt_close' => ['bool', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_data_seek' => ['void', 'statement'=>'mysqli_stmt', 'offset'=>'int'], -'mysqli_stmt_errno' => ['int', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_error' => ['string', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_error_list' => ['array', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_execute' => ['bool', 'statement'=>'mysqli_stmt', 'params='=>'list|null'], -'mysqli_stmt_fetch' => ['bool|null', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_field_count' => ['int', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_free_result' => ['void', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_get_result' => ['mysqli_result|false', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_get_warnings' => ['object', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_init' => ['mysqli_stmt', 'mysql'=>'mysqli'], -'mysqli_stmt_insert_id' => ['mixed', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_more_results' => ['bool', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_next_result' => ['bool', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_num_rows' => ['int', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_param_count' => ['int', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_prepare' => ['bool', 'statement'=>'mysqli_stmt', 'query'=>'string'], -'mysqli_stmt_reset' => ['bool', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_result_metadata' => ['mysqli_result|false', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_send_long_data' => ['bool', 'statement'=>'mysqli_stmt', 'param_num'=>'int', 'data'=>'string'], -'mysqli_stmt_sqlstate' => ['string', 'statement'=>'mysqli_stmt'], -'mysqli_stmt_store_result' => ['bool', 'statement'=>'mysqli_stmt'], -'mysqli_store_result' => ['mysqli_result|false', 'mysql'=>'mysqli', 'mode='=>'int'], -'mysqli_thread_id' => ['int', 'mysql'=>'mysqli'], -'mysqli_thread_safe' => ['bool'], -'mysqli_use_result' => ['mysqli_result|false', 'mysql'=>'mysqli'], -'mysqli_warning::__construct' => ['void'], -'mysqli_warning::next' => ['bool'], -'mysqli_warning_count' => ['int', 'mysql'=>'mysqli'], -'mysqlnd_memcache_get_config' => ['array', 'connection'=>'mixed'], -'mysqlnd_memcache_set' => ['bool', 'mysql_connection'=>'mixed', 'memcache_connection='=>'Memcached', 'pattern='=>'string', 'callback='=>'callable'], -'mysqlnd_ms_dump_servers' => ['array', 'connection'=>'mixed'], -'mysqlnd_ms_fabric_select_global' => ['array', 'connection'=>'mixed', 'table_name'=>'mixed'], -'mysqlnd_ms_fabric_select_shard' => ['array', 'connection'=>'mixed', 'table_name'=>'mixed', 'shard_key'=>'mixed'], -'mysqlnd_ms_get_last_gtid' => ['string', 'connection'=>'mixed'], -'mysqlnd_ms_get_last_used_connection' => ['array', 'connection'=>'mixed'], -'mysqlnd_ms_get_stats' => ['array'], -'mysqlnd_ms_match_wild' => ['bool', 'table_name'=>'string', 'wildcard'=>'string'], -'mysqlnd_ms_query_is_select' => ['int', 'query'=>'string'], -'mysqlnd_ms_set_qos' => ['bool', 'connection'=>'mixed', 'service_level'=>'int', 'service_level_option='=>'int', 'option_value='=>'mixed'], -'mysqlnd_ms_set_user_pick_server' => ['bool', 'function'=>'string'], -'mysqlnd_ms_xa_begin' => ['int', 'connection'=>'mixed', 'gtrid'=>'string', 'timeout='=>'int'], -'mysqlnd_ms_xa_commit' => ['int', 'connection'=>'mixed', 'gtrid'=>'string'], -'mysqlnd_ms_xa_gc' => ['int', 'connection'=>'mixed', 'gtrid='=>'string', 'ignore_max_retries='=>'bool'], -'mysqlnd_ms_xa_rollback' => ['int', 'connection'=>'mixed', 'gtrid'=>'string'], -'mysqlnd_qc_change_handler' => ['bool', 'handler'=>''], -'mysqlnd_qc_clear_cache' => ['bool'], -'mysqlnd_qc_get_available_handlers' => ['array'], -'mysqlnd_qc_get_cache_info' => ['array'], -'mysqlnd_qc_get_core_stats' => ['array'], -'mysqlnd_qc_get_handler' => ['array'], -'mysqlnd_qc_get_normalized_query_trace_log' => ['array'], -'mysqlnd_qc_get_query_trace_log' => ['array'], -'mysqlnd_qc_set_cache_condition' => ['bool', 'condition_type'=>'int', 'condition'=>'mixed', 'condition_option'=>'mixed'], -'mysqlnd_qc_set_is_select' => ['mixed', 'callback'=>'string'], -'mysqlnd_qc_set_storage_handler' => ['bool', 'handler'=>'string'], -'mysqlnd_qc_set_user_handlers' => ['bool', 'get_hash'=>'string', 'find_query_in_cache'=>'string', 'return_to_cache'=>'string', 'add_query_to_cache_if_not_exists'=>'string', 'query_is_select'=>'string', 'update_query_run_time_stats'=>'string', 'get_stats'=>'string', 'clear_cache'=>'string'], -'mysqlnd_uh_convert_to_mysqlnd' => ['resource', '&rw_mysql_connection'=>'mysqli'], -'mysqlnd_uh_set_connection_proxy' => ['bool', '&rw_connection_proxy'=>'MysqlndUhConnection', '&rw_mysqli_connection='=>'mysqli'], -'mysqlnd_uh_set_statement_proxy' => ['bool', '&rw_statement_proxy'=>'MysqlndUhStatement'], -'MysqlndUhConnection::__construct' => ['void'], -'MysqlndUhConnection::changeUser' => ['bool', 'connection'=>'mysqlnd_connection', 'user'=>'string', 'password'=>'string', 'database'=>'string', 'silent'=>'bool', 'passwd_len'=>'int'], -'MysqlndUhConnection::charsetName' => ['string', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::close' => ['bool', 'connection'=>'mysqlnd_connection', 'close_type'=>'int'], -'MysqlndUhConnection::connect' => ['bool', 'connection'=>'mysqlnd_connection', 'host'=>'string', 'use'=>'string', 'password'=>'string', 'database'=>'string', 'port'=>'int', 'socket'=>'string', 'mysql_flags'=>'int'], -'MysqlndUhConnection::endPSession' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::escapeString' => ['string', 'connection'=>'mysqlnd_connection', 'escape_string'=>'string'], -'MysqlndUhConnection::getAffectedRows' => ['int', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getErrorNumber' => ['int', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getErrorString' => ['string', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getFieldCount' => ['int', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getHostInformation' => ['string', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getLastInsertId' => ['int', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getLastMessage' => ['void', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getProtocolInformation' => ['string', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getServerInformation' => ['string', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getServerStatistics' => ['string', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getServerVersion' => ['int', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getSqlstate' => ['string', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getStatistics' => ['array', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getThreadId' => ['int', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::getWarningCount' => ['int', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::init' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::killConnection' => ['bool', 'connection'=>'mysqlnd_connection', 'pid'=>'int'], -'MysqlndUhConnection::listFields' => ['array', 'connection'=>'mysqlnd_connection', 'table'=>'string', 'achtung_wild'=>'string'], -'MysqlndUhConnection::listMethod' => ['void', 'connection'=>'mysqlnd_connection', 'query'=>'string', 'achtung_wild'=>'string', 'par1'=>'string'], -'MysqlndUhConnection::moreResults' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::nextResult' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::ping' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::query' => ['bool', 'connection'=>'mysqlnd_connection', 'query'=>'string'], -'MysqlndUhConnection::queryReadResultsetHeader' => ['bool', 'connection'=>'mysqlnd_connection', 'mysqlnd_stmt'=>'mysqlnd_statement'], -'MysqlndUhConnection::reapQuery' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::refreshServer' => ['bool', 'connection'=>'mysqlnd_connection', 'options'=>'int'], -'MysqlndUhConnection::restartPSession' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::selectDb' => ['bool', 'connection'=>'mysqlnd_connection', 'database'=>'string'], -'MysqlndUhConnection::sendClose' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::sendQuery' => ['bool', 'connection'=>'mysqlnd_connection', 'query'=>'string'], -'MysqlndUhConnection::serverDumpDebugInformation' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::setAutocommit' => ['bool', 'connection'=>'mysqlnd_connection', 'mode'=>'int'], -'MysqlndUhConnection::setCharset' => ['bool', 'connection'=>'mysqlnd_connection', 'charset'=>'string'], -'MysqlndUhConnection::setClientOption' => ['bool', 'connection'=>'mysqlnd_connection', 'option'=>'int', 'value'=>'int'], -'MysqlndUhConnection::setServerOption' => ['void', 'connection'=>'mysqlnd_connection', 'option'=>'int'], -'MysqlndUhConnection::shutdownServer' => ['void', 'MYSQLND_UH_RES_MYSQLND_NAME'=>'string', 'level'=>'string'], -'MysqlndUhConnection::simpleCommand' => ['bool', 'connection'=>'mysqlnd_connection', 'command'=>'int', 'arg'=>'string', 'ok_packet'=>'int', 'silent'=>'bool', 'ignore_upsert_status'=>'bool'], -'MysqlndUhConnection::simpleCommandHandleResponse' => ['bool', 'connection'=>'mysqlnd_connection', 'ok_packet'=>'int', 'silent'=>'bool', 'command'=>'int', 'ignore_upsert_status'=>'bool'], -'MysqlndUhConnection::sslSet' => ['bool', 'connection'=>'mysqlnd_connection', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], -'MysqlndUhConnection::stmtInit' => ['resource', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::storeResult' => ['resource', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::txCommit' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::txRollback' => ['bool', 'connection'=>'mysqlnd_connection'], -'MysqlndUhConnection::useResult' => ['resource', 'connection'=>'mysqlnd_connection'], -'MysqlndUhPreparedStatement::__construct' => ['void'], -'MysqlndUhPreparedStatement::execute' => ['bool', 'statement'=>'mysqlnd_prepared_statement'], -'MysqlndUhPreparedStatement::prepare' => ['bool', 'statement'=>'mysqlnd_prepared_statement', 'query'=>'string'], -'natcasesort' => ['bool', '&rw_array'=>'array'], -'natsort' => ['bool', '&rw_array'=>'array'], -'ncurses_addch' => ['int', 'ch'=>'int'], -'ncurses_addchnstr' => ['int', 's'=>'string', 'n'=>'int'], -'ncurses_addchstr' => ['int', 's'=>'string'], -'ncurses_addnstr' => ['int', 's'=>'string', 'n'=>'int'], -'ncurses_addstr' => ['int', 'text'=>'string'], -'ncurses_assume_default_colors' => ['int', 'fg'=>'int', 'bg'=>'int'], -'ncurses_attroff' => ['int', 'attributes'=>'int'], -'ncurses_attron' => ['int', 'attributes'=>'int'], -'ncurses_attrset' => ['int', 'attributes'=>'int'], -'ncurses_baudrate' => ['int'], -'ncurses_beep' => ['int'], -'ncurses_bkgd' => ['int', 'attrchar'=>'int'], -'ncurses_bkgdset' => ['void', 'attrchar'=>'int'], -'ncurses_border' => ['int', 'left'=>'int', 'right'=>'int', 'top'=>'int', 'bottom'=>'int', 'tl_corner'=>'int', 'tr_corner'=>'int', 'bl_corner'=>'int', 'br_corner'=>'int'], -'ncurses_bottom_panel' => ['int', 'panel'=>'resource'], -'ncurses_can_change_color' => ['bool'], -'ncurses_cbreak' => ['bool'], -'ncurses_clear' => ['bool'], -'ncurses_clrtobot' => ['bool'], -'ncurses_clrtoeol' => ['bool'], -'ncurses_color_content' => ['int', 'color'=>'int', 'r'=>'int', 'g'=>'int', 'b'=>'int'], -'ncurses_color_set' => ['int', 'pair'=>'int'], -'ncurses_curs_set' => ['int', 'visibility'=>'int'], -'ncurses_def_prog_mode' => ['bool'], -'ncurses_def_shell_mode' => ['bool'], -'ncurses_define_key' => ['int', 'definition'=>'string', 'keycode'=>'int'], -'ncurses_del_panel' => ['bool', 'panel'=>'resource'], -'ncurses_delay_output' => ['int', 'milliseconds'=>'int'], -'ncurses_delch' => ['bool'], -'ncurses_deleteln' => ['bool'], -'ncurses_delwin' => ['bool', 'window'=>'resource'], -'ncurses_doupdate' => ['bool'], -'ncurses_echo' => ['bool'], -'ncurses_echochar' => ['int', 'character'=>'int'], -'ncurses_end' => ['int'], -'ncurses_erase' => ['bool'], -'ncurses_erasechar' => ['string'], -'ncurses_filter' => ['void'], -'ncurses_flash' => ['bool'], -'ncurses_flushinp' => ['bool'], -'ncurses_getch' => ['int'], -'ncurses_getmaxyx' => ['void', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], -'ncurses_getmouse' => ['bool', 'mevent'=>'array'], -'ncurses_getyx' => ['void', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], -'ncurses_halfdelay' => ['int', 'tenth'=>'int'], -'ncurses_has_colors' => ['bool'], -'ncurses_has_ic' => ['bool'], -'ncurses_has_il' => ['bool'], -'ncurses_has_key' => ['int', 'keycode'=>'int'], -'ncurses_hide_panel' => ['int', 'panel'=>'resource'], -'ncurses_hline' => ['int', 'charattr'=>'int', 'n'=>'int'], -'ncurses_inch' => ['string'], -'ncurses_init' => ['void'], -'ncurses_init_color' => ['int', 'color'=>'int', 'r'=>'int', 'g'=>'int', 'b'=>'int'], -'ncurses_init_pair' => ['int', 'pair'=>'int', 'fg'=>'int', 'bg'=>'int'], -'ncurses_insch' => ['int', 'character'=>'int'], -'ncurses_insdelln' => ['int', 'count'=>'int'], -'ncurses_insertln' => ['int'], -'ncurses_insstr' => ['int', 'text'=>'string'], -'ncurses_instr' => ['int', 'buffer'=>'string'], -'ncurses_isendwin' => ['bool'], -'ncurses_keyok' => ['int', 'keycode'=>'int', 'enable'=>'bool'], -'ncurses_keypad' => ['int', 'window'=>'resource', 'bf'=>'bool'], -'ncurses_killchar' => ['string'], -'ncurses_longname' => ['string'], -'ncurses_meta' => ['int', 'window'=>'resource', '_8bit'=>'bool'], -'ncurses_mouse_trafo' => ['bool', 'y'=>'int', 'x'=>'int', 'toscreen'=>'bool'], -'ncurses_mouseinterval' => ['int', 'milliseconds'=>'int'], -'ncurses_mousemask' => ['int', 'newmask'=>'int', 'oldmask'=>'int'], -'ncurses_move' => ['int', 'y'=>'int', 'x'=>'int'], -'ncurses_move_panel' => ['int', 'panel'=>'resource', 'startx'=>'int', 'starty'=>'int'], -'ncurses_mvaddch' => ['int', 'y'=>'int', 'x'=>'int', 'c'=>'int'], -'ncurses_mvaddchnstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string', 'n'=>'int'], -'ncurses_mvaddchstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string'], -'ncurses_mvaddnstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string', 'n'=>'int'], -'ncurses_mvaddstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string'], -'ncurses_mvcur' => ['int', 'old_y'=>'int', 'old_x'=>'int', 'new_y'=>'int', 'new_x'=>'int'], -'ncurses_mvdelch' => ['int', 'y'=>'int', 'x'=>'int'], -'ncurses_mvgetch' => ['int', 'y'=>'int', 'x'=>'int'], -'ncurses_mvhline' => ['int', 'y'=>'int', 'x'=>'int', 'attrchar'=>'int', 'n'=>'int'], -'ncurses_mvinch' => ['int', 'y'=>'int', 'x'=>'int'], -'ncurses_mvvline' => ['int', 'y'=>'int', 'x'=>'int', 'attrchar'=>'int', 'n'=>'int'], -'ncurses_mvwaddstr' => ['int', 'window'=>'resource', 'y'=>'int', 'x'=>'int', 'text'=>'string'], -'ncurses_napms' => ['int', 'milliseconds'=>'int'], -'ncurses_new_panel' => ['resource', 'window'=>'resource'], -'ncurses_newpad' => ['resource', 'rows'=>'int', 'cols'=>'int'], -'ncurses_newwin' => ['resource', 'rows'=>'int', 'cols'=>'int', 'y'=>'int', 'x'=>'int'], -'ncurses_nl' => ['bool'], -'ncurses_nocbreak' => ['bool'], -'ncurses_noecho' => ['bool'], -'ncurses_nonl' => ['bool'], -'ncurses_noqiflush' => ['void'], -'ncurses_noraw' => ['bool'], -'ncurses_pair_content' => ['int', 'pair'=>'int', 'f'=>'int', 'b'=>'int'], -'ncurses_panel_above' => ['resource', 'panel'=>'resource'], -'ncurses_panel_below' => ['resource', 'panel'=>'resource'], -'ncurses_panel_window' => ['resource', 'panel'=>'resource'], -'ncurses_pnoutrefresh' => ['int', 'pad'=>'resource', 'pminrow'=>'int', 'pmincol'=>'int', 'sminrow'=>'int', 'smincol'=>'int', 'smaxrow'=>'int', 'smaxcol'=>'int'], -'ncurses_prefresh' => ['int', 'pad'=>'resource', 'pminrow'=>'int', 'pmincol'=>'int', 'sminrow'=>'int', 'smincol'=>'int', 'smaxrow'=>'int', 'smaxcol'=>'int'], -'ncurses_putp' => ['int', 'text'=>'string'], -'ncurses_qiflush' => ['void'], -'ncurses_raw' => ['bool'], -'ncurses_refresh' => ['int', 'ch'=>'int'], -'ncurses_replace_panel' => ['int', 'panel'=>'resource', 'window'=>'resource'], -'ncurses_reset_prog_mode' => ['int'], -'ncurses_reset_shell_mode' => ['int'], -'ncurses_resetty' => ['bool'], -'ncurses_savetty' => ['bool'], -'ncurses_scr_dump' => ['int', 'filename'=>'string'], -'ncurses_scr_init' => ['int', 'filename'=>'string'], -'ncurses_scr_restore' => ['int', 'filename'=>'string'], -'ncurses_scr_set' => ['int', 'filename'=>'string'], -'ncurses_scrl' => ['int', 'count'=>'int'], -'ncurses_show_panel' => ['int', 'panel'=>'resource'], -'ncurses_slk_attr' => ['int'], -'ncurses_slk_attroff' => ['int', 'intarg'=>'int'], -'ncurses_slk_attron' => ['int', 'intarg'=>'int'], -'ncurses_slk_attrset' => ['int', 'intarg'=>'int'], -'ncurses_slk_clear' => ['bool'], -'ncurses_slk_color' => ['int', 'intarg'=>'int'], -'ncurses_slk_init' => ['bool', 'format'=>'int'], -'ncurses_slk_noutrefresh' => ['bool'], -'ncurses_slk_refresh' => ['int'], -'ncurses_slk_restore' => ['int'], -'ncurses_slk_set' => ['bool', 'labelnr'=>'int', 'label'=>'string', 'format'=>'int'], -'ncurses_slk_touch' => ['int'], -'ncurses_standend' => ['int'], -'ncurses_standout' => ['int'], -'ncurses_start_color' => ['int'], -'ncurses_termattrs' => ['bool'], -'ncurses_termname' => ['string'], -'ncurses_timeout' => ['void', 'millisec'=>'int'], -'ncurses_top_panel' => ['int', 'panel'=>'resource'], -'ncurses_typeahead' => ['int', 'fd'=>'int'], -'ncurses_ungetch' => ['int', 'keycode'=>'int'], -'ncurses_ungetmouse' => ['bool', 'mevent'=>'array'], -'ncurses_update_panels' => ['void'], -'ncurses_use_default_colors' => ['bool'], -'ncurses_use_env' => ['void', 'flag'=>'bool'], -'ncurses_use_extended_names' => ['int', 'flag'=>'bool'], -'ncurses_vidattr' => ['int', 'intarg'=>'int'], -'ncurses_vline' => ['int', 'charattr'=>'int', 'n'=>'int'], -'ncurses_waddch' => ['int', 'window'=>'resource', 'ch'=>'int'], -'ncurses_waddstr' => ['int', 'window'=>'resource', 'string'=>'string', 'n='=>'int'], -'ncurses_wattroff' => ['int', 'window'=>'resource', 'attrs'=>'int'], -'ncurses_wattron' => ['int', 'window'=>'resource', 'attrs'=>'int'], -'ncurses_wattrset' => ['int', 'window'=>'resource', 'attrs'=>'int'], -'ncurses_wborder' => ['int', 'window'=>'resource', 'left'=>'int', 'right'=>'int', 'top'=>'int', 'bottom'=>'int', 'tl_corner'=>'int', 'tr_corner'=>'int', 'bl_corner'=>'int', 'br_corner'=>'int'], -'ncurses_wclear' => ['int', 'window'=>'resource'], -'ncurses_wcolor_set' => ['int', 'window'=>'resource', 'color_pair'=>'int'], -'ncurses_werase' => ['int', 'window'=>'resource'], -'ncurses_wgetch' => ['int', 'window'=>'resource'], -'ncurses_whline' => ['int', 'window'=>'resource', 'charattr'=>'int', 'n'=>'int'], -'ncurses_wmouse_trafo' => ['bool', 'window'=>'resource', 'y'=>'int', 'x'=>'int', 'toscreen'=>'bool'], -'ncurses_wmove' => ['int', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], -'ncurses_wnoutrefresh' => ['int', 'window'=>'resource'], -'ncurses_wrefresh' => ['int', 'window'=>'resource'], -'ncurses_wstandend' => ['int', 'window'=>'resource'], -'ncurses_wstandout' => ['int', 'window'=>'resource'], -'ncurses_wvline' => ['int', 'window'=>'resource', 'charattr'=>'int', 'n'=>'int'], -'net_get_interfaces' => ['array>|false'], -'newrelic_add_custom_parameter' => ['bool', 'key'=>'string', 'value'=>'bool|float|int|string'], -'newrelic_add_custom_tracer' => ['bool', 'function_name'=>'string'], -'newrelic_background_job' => ['void', 'flag='=>'bool'], -'newrelic_capture_params' => ['void', 'enable='=>'bool'], -'newrelic_custom_metric' => ['bool', 'metric_name'=>'string', 'value'=>'float'], -'newrelic_disable_autorum' => ['true'], -'newrelic_end_of_transaction' => ['void'], -'newrelic_end_transaction' => ['bool', 'ignore='=>'bool'], -'newrelic_get_browser_timing_footer' => ['string', 'include_tags='=>'bool'], -'newrelic_get_browser_timing_header' => ['string', 'include_tags='=>'bool'], -'newrelic_ignore_apdex' => ['void'], -'newrelic_ignore_transaction' => ['void'], -'newrelic_name_transaction' => ['bool', 'name'=>'string'], -'newrelic_notice_error' => ['void', 'message'=>'string', 'exception='=>'Exception|Throwable'], -'newrelic_notice_error\'1' => ['void', 'unused_1'=>'string', 'message'=>'string', 'unused_2'=>'string', 'unused_3'=>'int', 'unused_4='=>''], -'newrelic_record_custom_event' => ['void', 'name'=>'string', 'attributes'=>'array'], -'newrelic_record_datastore_segment' => ['mixed', 'func'=>'callable', 'parameters'=>'array'], -'newrelic_set_appname' => ['bool', 'name'=>'string', 'license='=>'string', 'xmit='=>'bool'], -'newrelic_set_user_attributes' => ['bool', 'user'=>'string', 'account'=>'string', 'product'=>'string'], -'newrelic_start_transaction' => ['bool', 'appname'=>'string', 'license='=>'string'], -'newt_bell' => ['void'], -'newt_button' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], -'newt_button_bar' => ['resource', 'buttons'=>'array'], -'newt_centered_window' => ['int', 'width'=>'int', 'height'=>'int', 'title='=>'string'], -'newt_checkbox' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'def_value'=>'string', 'seq='=>'string'], -'newt_checkbox_get_value' => ['string', 'checkbox'=>'resource'], -'newt_checkbox_set_flags' => ['void', 'checkbox'=>'resource', 'flags'=>'int', 'sense'=>'int'], -'newt_checkbox_set_value' => ['void', 'checkbox'=>'resource', 'value'=>'string'], -'newt_checkbox_tree' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'flags='=>'int'], -'newt_checkbox_tree_add_item' => ['void', 'checkboxtree'=>'resource', 'text'=>'string', 'data'=>'mixed', 'flags'=>'int', 'index'=>'int', '...args='=>'int'], -'newt_checkbox_tree_find_item' => ['array', 'checkboxtree'=>'resource', 'data'=>'mixed'], -'newt_checkbox_tree_get_current' => ['mixed', 'checkboxtree'=>'resource'], -'newt_checkbox_tree_get_entry_value' => ['string', 'checkboxtree'=>'resource', 'data'=>'mixed'], -'newt_checkbox_tree_get_multi_selection' => ['array', 'checkboxtree'=>'resource', 'seqnum'=>'string'], -'newt_checkbox_tree_get_selection' => ['array', 'checkboxtree'=>'resource'], -'newt_checkbox_tree_multi' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'seq'=>'string', 'flags='=>'int'], -'newt_checkbox_tree_set_current' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed'], -'newt_checkbox_tree_set_entry' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed', 'text'=>'string'], -'newt_checkbox_tree_set_entry_value' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed', 'value'=>'string'], -'newt_checkbox_tree_set_width' => ['void', 'checkbox_tree'=>'resource', 'width'=>'int'], -'newt_clear_key_buffer' => ['void'], -'newt_cls' => ['void'], -'newt_compact_button' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], -'newt_component_add_callback' => ['void', 'component'=>'resource', 'func_name'=>'mixed', 'data'=>'mixed'], -'newt_component_takes_focus' => ['void', 'component'=>'resource', 'takes_focus'=>'bool'], -'newt_create_grid' => ['resource', 'cols'=>'int', 'rows'=>'int'], -'newt_cursor_off' => ['void'], -'newt_cursor_on' => ['void'], -'newt_delay' => ['void', 'microseconds'=>'int'], -'newt_draw_form' => ['void', 'form'=>'resource'], -'newt_draw_root_text' => ['void', 'left'=>'int', 'top'=>'int', 'text'=>'string'], -'newt_entry' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'init_value='=>'string', 'flags='=>'int'], -'newt_entry_get_value' => ['string', 'entry'=>'resource'], -'newt_entry_set' => ['void', 'entry'=>'resource', 'value'=>'string', 'cursor_at_end='=>'bool'], -'newt_entry_set_filter' => ['void', 'entry'=>'resource', 'filter'=>'callable', 'data'=>'mixed'], -'newt_entry_set_flags' => ['void', 'entry'=>'resource', 'flags'=>'int', 'sense'=>'int'], -'newt_finished' => ['int'], -'newt_form' => ['resource', 'vert_bar='=>'resource', 'help='=>'string', 'flags='=>'int'], -'newt_form_add_component' => ['void', 'form'=>'resource', 'component'=>'resource'], -'newt_form_add_components' => ['void', 'form'=>'resource', 'components'=>'array'], -'newt_form_add_hot_key' => ['void', 'form'=>'resource', 'key'=>'int'], -'newt_form_destroy' => ['void', 'form'=>'resource'], -'newt_form_get_current' => ['resource', 'form'=>'resource'], -'newt_form_run' => ['void', 'form'=>'resource', 'exit_struct'=>'array'], -'newt_form_set_background' => ['void', 'from'=>'resource', 'background'=>'int'], -'newt_form_set_height' => ['void', 'form'=>'resource', 'height'=>'int'], -'newt_form_set_size' => ['void', 'form'=>'resource'], -'newt_form_set_timer' => ['void', 'form'=>'resource', 'milliseconds'=>'int'], -'newt_form_set_width' => ['void', 'form'=>'resource', 'width'=>'int'], -'newt_form_watch_fd' => ['void', 'form'=>'resource', 'stream'=>'resource', 'flags='=>'int'], -'newt_get_screen_size' => ['void', 'cols'=>'int', 'rows'=>'int'], -'newt_grid_add_components_to_form' => ['void', 'grid'=>'resource', 'form'=>'resource', 'recurse'=>'bool'], -'newt_grid_basic_window' => ['resource', 'text'=>'resource', 'middle'=>'resource', 'buttons'=>'resource'], -'newt_grid_free' => ['void', 'grid'=>'resource', 'recurse'=>'bool'], -'newt_grid_get_size' => ['void', 'grid'=>'resource', 'width'=>'int', 'height'=>'int'], -'newt_grid_h_close_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], -'newt_grid_h_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], -'newt_grid_place' => ['void', 'grid'=>'resource', 'left'=>'int', 'top'=>'int'], -'newt_grid_set_field' => ['void', 'grid'=>'resource', 'col'=>'int', 'row'=>'int', 'type'=>'int', 'value'=>'resource', 'pad_left'=>'int', 'pad_top'=>'int', 'pad_right'=>'int', 'pad_bottom'=>'int', 'anchor'=>'int', 'flags='=>'int'], -'newt_grid_simple_window' => ['resource', 'text'=>'resource', 'middle'=>'resource', 'buttons'=>'resource'], -'newt_grid_v_close_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], -'newt_grid_v_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], -'newt_grid_wrapped_window' => ['void', 'grid'=>'resource', 'title'=>'string'], -'newt_grid_wrapped_window_at' => ['void', 'grid'=>'resource', 'title'=>'string', 'left'=>'int', 'top'=>'int'], -'newt_init' => ['int'], -'newt_label' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], -'newt_label_set_text' => ['void', 'label'=>'resource', 'text'=>'string'], -'newt_listbox' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'flags='=>'int'], -'newt_listbox_append_entry' => ['void', 'listbox'=>'resource', 'text'=>'string', 'data'=>'mixed'], -'newt_listbox_clear' => ['void', 'listobx'=>'resource'], -'newt_listbox_clear_selection' => ['void', 'listbox'=>'resource'], -'newt_listbox_delete_entry' => ['void', 'listbox'=>'resource', 'key'=>'mixed'], -'newt_listbox_get_current' => ['string', 'listbox'=>'resource'], -'newt_listbox_get_selection' => ['array', 'listbox'=>'resource'], -'newt_listbox_insert_entry' => ['void', 'listbox'=>'resource', 'text'=>'string', 'data'=>'mixed', 'key'=>'mixed'], -'newt_listbox_item_count' => ['int', 'listbox'=>'resource'], -'newt_listbox_select_item' => ['void', 'listbox'=>'resource', 'key'=>'mixed', 'sense'=>'int'], -'newt_listbox_set_current' => ['void', 'listbox'=>'resource', 'num'=>'int'], -'newt_listbox_set_current_by_key' => ['void', 'listbox'=>'resource', 'key'=>'mixed'], -'newt_listbox_set_data' => ['void', 'listbox'=>'resource', 'num'=>'int', 'data'=>'mixed'], -'newt_listbox_set_entry' => ['void', 'listbox'=>'resource', 'num'=>'int', 'text'=>'string'], -'newt_listbox_set_width' => ['void', 'listbox'=>'resource', 'width'=>'int'], -'newt_listitem' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'is_default'=>'bool', 'prev_item'=>'resource', 'data'=>'mixed', 'flags='=>'int'], -'newt_listitem_get_data' => ['mixed', 'item'=>'resource'], -'newt_listitem_set' => ['void', 'item'=>'resource', 'text'=>'string'], -'newt_open_window' => ['int', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'height'=>'int', 'title='=>'string'], -'newt_pop_help_line' => ['void'], -'newt_pop_window' => ['void'], -'newt_push_help_line' => ['void', 'text='=>'string'], -'newt_radio_get_current' => ['resource', 'set_member'=>'resource'], -'newt_radiobutton' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'is_default'=>'bool', 'prev_button='=>'resource'], -'newt_redraw_help_line' => ['void'], -'newt_reflow_text' => ['string', 'text'=>'string', 'width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'actual_width'=>'int', 'actual_height'=>'int'], -'newt_refresh' => ['void'], -'newt_resize_screen' => ['void', 'redraw='=>'bool'], -'newt_resume' => ['void'], -'newt_run_form' => ['resource', 'form'=>'resource'], -'newt_scale' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'full_value'=>'int'], -'newt_scale_set' => ['void', 'scale'=>'resource', 'amount'=>'int'], -'newt_scrollbar_set' => ['void', 'scrollbar'=>'resource', 'where'=>'int', 'total'=>'int'], -'newt_set_help_callback' => ['void', 'function'=>'mixed'], -'newt_set_suspend_callback' => ['void', 'function'=>'callable', 'data'=>'mixed'], -'newt_suspend' => ['void'], -'newt_textbox' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'height'=>'int', 'flags='=>'int'], -'newt_textbox_get_num_lines' => ['int', 'textbox'=>'resource'], -'newt_textbox_reflowed' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'char', 'width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'flags='=>'int'], -'newt_textbox_set_height' => ['void', 'textbox'=>'resource', 'height'=>'int'], -'newt_textbox_set_text' => ['void', 'textbox'=>'resource', 'text'=>'string'], -'newt_vertical_scrollbar' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'normal_colorset='=>'int', 'thumb_colorset='=>'int'], -'newt_wait_for_key' => ['void'], -'newt_win_choice' => ['int', 'title'=>'string', 'button1_text'=>'string', 'button2_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], -'newt_win_entries' => ['int', 'title'=>'string', 'text'=>'string', 'suggested_width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'data_width'=>'int', 'items'=>'array', 'button1'=>'string', '...args='=>'string'], -'newt_win_menu' => ['int', 'title'=>'string', 'text'=>'string', 'suggestedwidth'=>'int', 'flexdown'=>'int', 'flexup'=>'int', 'maxlistheight'=>'int', 'items'=>'array', 'listitem'=>'int', 'button1='=>'string', '...args='=>'string'], -'newt_win_message' => ['void', 'title'=>'string', 'button_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], -'newt_win_messagev' => ['void', 'title'=>'string', 'button_text'=>'string', 'format'=>'string', 'args'=>'array'], -'newt_win_ternary' => ['int', 'title'=>'string', 'button1_text'=>'string', 'button2_text'=>'string', 'button3_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], -'next' => ['mixed', '&r_array'=>'array|object'], -'ngettext' => ['string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int'], -'nl2br' => ['string', 'string'=>'string', 'use_xhtml='=>'bool'], -'nl_langinfo' => ['string|false', 'item'=>'int'], -'NoRewindIterator::__construct' => ['void', 'iterator'=>'Iterator'], -'NoRewindIterator::current' => ['mixed'], -'NoRewindIterator::getInnerIterator' => ['Iterator'], -'NoRewindIterator::key' => ['mixed'], -'NoRewindIterator::next' => ['void'], -'NoRewindIterator::rewind' => ['void'], -'NoRewindIterator::valid' => ['bool'], -'Normalizer::getRawDecomposition' => ['string|null', 'input'=>'string'], -'Normalizer::isNormalized' => ['bool', 'input'=>'string', 'form='=>'int'], -'Normalizer::normalize' => ['string', 'input'=>'string', 'form='=>'int'], -'normalizer_get_raw_decomposition' => ['string|null', 'string'=>'string'], -'normalizer_is_normalized' => ['bool', 'string'=>'string', 'form='=>'int'], -'normalizer_normalize' => ['string', 'string'=>'string', 'form='=>'int'], -'notes_body' => ['array', 'server'=>'string', 'mailbox'=>'string', 'msg_number'=>'int'], -'notes_copy_db' => ['bool', 'from_database_name'=>'string', 'to_database_name'=>'string'], -'notes_create_db' => ['bool', 'database_name'=>'string'], -'notes_create_note' => ['bool', 'database_name'=>'string', 'form_name'=>'string'], -'notes_drop_db' => ['bool', 'database_name'=>'string'], -'notes_find_note' => ['int', 'database_name'=>'string', 'name'=>'string', 'type='=>'string'], -'notes_header_info' => ['object', 'server'=>'string', 'mailbox'=>'string', 'msg_number'=>'int'], -'notes_list_msgs' => ['bool', 'db'=>'string'], -'notes_mark_read' => ['bool', 'database_name'=>'string', 'user_name'=>'string', 'note_id'=>'string'], -'notes_mark_unread' => ['bool', 'database_name'=>'string', 'user_name'=>'string', 'note_id'=>'string'], -'notes_nav_create' => ['bool', 'database_name'=>'string', 'name'=>'string'], -'notes_search' => ['array', 'database_name'=>'string', 'keywords'=>'string'], -'notes_unread' => ['array', 'database_name'=>'string', 'user_name'=>'string'], -'notes_version' => ['float', 'database_name'=>'string'], -'nsapi_request_headers' => ['array'], -'nsapi_response_headers' => ['array'], -'nsapi_virtual' => ['bool', 'uri'=>'string'], -'nthmac' => ['string', 'clent'=>'string', 'data'=>'string'], -'number_format' => ['string', 'num'=>'float|int', 'decimals='=>'int', 'decimal_separator='=>'?string', 'thousands_separator='=>'?string'], -'NumberFormatter::__construct' => ['void', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], -'NumberFormatter::create' => ['NumberFormatter|false', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], -'NumberFormatter::format' => ['string|false', 'num'=>'', 'type='=>'int'], -'NumberFormatter::formatCurrency' => ['string|false', 'num'=>'float', 'currency'=>'string'], -'NumberFormatter::getAttribute' => ['int|false', 'attr'=>'int'], -'NumberFormatter::getErrorCode' => ['int'], -'NumberFormatter::getErrorMessage' => ['string'], -'NumberFormatter::getLocale' => ['string', 'type='=>'int'], -'NumberFormatter::getPattern' => ['string|false'], -'NumberFormatter::getSymbol' => ['string|false', 'attr'=>'int'], -'NumberFormatter::getTextAttribute' => ['string|false', 'attr'=>'int'], -'NumberFormatter::parse' => ['float|false', 'string'=>'string', 'type='=>'int', '&rw_position='=>'int'], -'NumberFormatter::parseCurrency' => ['float|false', 'string'=>'string', '&w_currency'=>'string', '&rw_position='=>'int'], -'NumberFormatter::setAttribute' => ['bool', 'attr'=>'int', 'value'=>''], -'NumberFormatter::setPattern' => ['bool', 'pattern'=>'string'], -'NumberFormatter::setSymbol' => ['bool', 'attr'=>'int', 'symbol'=>'string'], -'NumberFormatter::setTextAttribute' => ['bool', 'attr'=>'int', 'value'=>'string'], -'numfmt_create' => ['NumberFormatter|false', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], -'numfmt_format' => ['string|false', 'formatter'=>'NumberFormatter', 'num'=>'int|float', 'type='=>'int'], -'numfmt_format_currency' => ['string|false', 'formatter'=>'NumberFormatter', 'amount'=>'float', 'currency'=>'string'], -'numfmt_get_attribute' => ['int|false', 'formatter'=>'NumberFormatter', 'attribute'=>'int'], -'numfmt_get_error_code' => ['int', 'formatter'=>'NumberFormatter'], -'numfmt_get_error_message' => ['string', 'formatter'=>'NumberFormatter'], -'numfmt_get_locale' => ['string', 'formatter'=>'NumberFormatter', 'type='=>'int'], -'numfmt_get_pattern' => ['string|false', 'formatter'=>'NumberFormatter'], -'numfmt_get_symbol' => ['string|false', 'formatter'=>'NumberFormatter', 'symbol'=>'int'], -'numfmt_get_text_attribute' => ['string|false', 'formatter'=>'NumberFormatter', 'attribute'=>'int'], -'numfmt_parse' => ['float|int|false', 'formatter'=>'NumberFormatter', 'string'=>'string', 'type='=>'int', '&rw_offset='=>'int'], -'numfmt_parse_currency' => ['float|false', 'formatter'=>'NumberFormatter', 'string'=>'string', '&w_currency'=>'string', '&rw_offset='=>'int'], -'numfmt_set_attribute' => ['bool', 'formatter'=>'NumberFormatter', 'attribute'=>'int', 'value'=>'int'], -'numfmt_set_pattern' => ['bool', 'formatter'=>'NumberFormatter', 'pattern'=>'string'], -'numfmt_set_symbol' => ['bool', 'formatter'=>'NumberFormatter', 'symbol'=>'int', 'value'=>'string'], -'numfmt_set_text_attribute' => ['bool', 'formatter'=>'NumberFormatter', 'attribute'=>'int', 'value'=>'string'], -'OAuth::__construct' => ['void', 'consumer_key'=>'string', 'consumer_secret'=>'string', 'signature_method='=>'string', 'auth_type='=>'int'], -'OAuth::__destruct' => ['void'], -'OAuth::disableDebug' => ['bool'], -'OAuth::disableRedirects' => ['bool'], -'OAuth::disableSSLChecks' => ['bool'], -'OAuth::enableDebug' => ['bool'], -'OAuth::enableRedirects' => ['bool'], -'OAuth::enableSSLChecks' => ['bool'], -'OAuth::fetch' => ['mixed', 'protected_resource_url'=>'string', 'extra_parameters='=>'array', 'http_method='=>'string', 'http_headers='=>'array'], -'OAuth::generateSignature' => ['string', 'http_method'=>'string', 'url'=>'string', 'extra_parameters='=>'mixed'], -'OAuth::getAccessToken' => ['array|false', 'access_token_url'=>'string', 'auth_session_handle='=>'string', 'verifier_token='=>'string', 'http_method='=>'string'], -'OAuth::getCAPath' => ['array'], -'OAuth::getLastResponse' => ['string'], -'OAuth::getLastResponseHeaders' => ['string|false'], -'OAuth::getLastResponseInfo' => ['array'], -'OAuth::getRequestHeader' => ['string|false', 'http_method'=>'string', 'url'=>'string', 'extra_parameters='=>'mixed'], -'OAuth::getRequestToken' => ['array|false', 'request_token_url'=>'string', 'callback_url='=>'string', 'http_method='=>'string'], -'OAuth::setAuthType' => ['bool', 'auth_type'=>'int'], -'OAuth::setCAPath' => ['mixed', 'ca_path='=>'string', 'ca_info='=>'string'], -'OAuth::setNonce' => ['mixed', 'nonce'=>'string'], -'OAuth::setRequestEngine' => ['void', 'reqengine'=>'int'], -'OAuth::setRSACertificate' => ['mixed', 'cert'=>'string'], -'OAuth::setSSLChecks' => ['bool', 'sslcheck'=>'int'], -'OAuth::setTimeout' => ['void', 'timeout'=>'int'], -'OAuth::setTimestamp' => ['mixed', 'timestamp'=>'string'], -'OAuth::setToken' => ['bool', 'token'=>'string', 'token_secret'=>'string'], -'OAuth::setVersion' => ['bool', 'version'=>'string'], -'oauth_get_sbs' => ['string', 'http_method'=>'string', 'uri'=>'string', 'request_parameters='=>'array'], -'oauth_urlencode' => ['string', 'uri'=>'string'], -'OAuthProvider::__construct' => ['void', 'params_array='=>'array'], -'OAuthProvider::addRequiredParameter' => ['bool', 'req_params'=>'string'], -'OAuthProvider::callconsumerHandler' => ['void'], -'OAuthProvider::callTimestampNonceHandler' => ['void'], -'OAuthProvider::calltokenHandler' => ['void'], -'OAuthProvider::checkOAuthRequest' => ['void', 'uri='=>'string', 'method='=>'string'], -'OAuthProvider::consumerHandler' => ['void', 'callback_function'=>'callable'], -'OAuthProvider::generateToken' => ['string', 'size'=>'int', 'strong='=>'bool'], -'OAuthProvider::is2LeggedEndpoint' => ['void', 'params_array'=>'mixed'], -'OAuthProvider::isRequestTokenEndpoint' => ['void', 'will_issue_request_token'=>'bool'], -'OAuthProvider::removeRequiredParameter' => ['bool', 'req_params'=>'string'], -'OAuthProvider::reportProblem' => ['string', 'oauthexception'=>'string', 'send_headers='=>'bool'], -'OAuthProvider::setParam' => ['bool', 'param_key'=>'string', 'param_val='=>'mixed'], -'OAuthProvider::setRequestTokenPath' => ['bool', 'path'=>'string'], -'OAuthProvider::timestampNonceHandler' => ['void', 'callback_function'=>'callable'], -'OAuthProvider::tokenHandler' => ['void', 'callback_function'=>'callable'], -'ob_clean' => ['bool'], -'ob_deflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'], -'ob_end_clean' => ['bool'], -'ob_end_flush' => ['bool'], -'ob_etaghandler' => ['string', 'data'=>'string', 'mode'=>'int'], -'ob_flush' => ['bool'], -'ob_get_clean' => ['string|false'], -'ob_get_contents' => ['string|false'], -'ob_get_flush' => ['string|false'], -'ob_get_length' => ['int|false'], -'ob_get_level' => ['int'], -'ob_get_status' => ['array', 'full_status='=>'bool'], -'ob_gzhandler' => ['string|false', 'data'=>'string', 'flags'=>'int'], -'ob_iconv_handler' => ['string', 'contents'=>'string', 'status'=>'int'], -'ob_implicit_flush' => ['void', 'enable='=>'bool'], -'ob_inflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'], -'ob_list_handlers' => ['false|list'], -'ob_start' => ['bool', 'callback='=>'string|array|?callable', 'chunk_size='=>'int', 'flags='=>'int'], -'ob_tidyhandler' => ['string', 'input'=>'string', 'mode='=>'int'], -'oci_bind_array_by_name' => ['bool', 'statement'=>'resource', 'param'=>'string', '&rw_var'=>'array', 'max_array_length'=>'int', 'max_item_length='=>'int', 'type='=>'int'], -'oci_bind_by_name' => ['bool', 'statement'=>'resource', 'param'=>'string', '&rw_var'=>'mixed', 'max_length='=>'int', 'type='=>'int'], -'oci_cancel' => ['bool', 'statement'=>'resource'], -'oci_client_version' => ['string'], -'oci_close' => ['bool', 'connection'=>'resource'], -'OCICollection::append' => ['bool', 'value'=>'mixed'], -'OCICollection::assign' => ['bool', 'from'=>'OCI_Collection'], -'OCICollection::assignElem' => ['bool', 'index'=>'int', 'value'=>'mixed'], -'OCICollection::free' => ['bool'], -'OCICollection::getElem' => ['mixed', 'index'=>'int'], -'OCICollection::max' => ['int|false'], -'OCICollection::size' => ['int|false'], -'OCICollection::trim' => ['bool', 'num'=>'int'], -'oci_collection_append' => ['bool', 'collection'=>'string'], -'oci_collection_assign' => ['bool', 'to'=>'object'], -'oci_collection_element_assign' => ['bool', 'collection'=>'int', 'index'=>'string'], -'oci_collection_element_get' => ['string', 'collection'=>'int'], -'oci_collection_max' => ['int'], -'oci_collection_size' => ['int'], -'oci_collection_trim' => ['bool', 'collection'=>'int'], -'oci_commit' => ['bool', 'connection'=>'resource'], -'oci_connect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], -'oci_define_by_name' => ['bool', 'statement'=>'resource', 'column'=>'string', '&w_var'=>'mixed', 'type='=>'int'], -'oci_error' => ['array|false', 'connection_or_statement='=>'resource'], -'oci_execute' => ['bool', 'statement'=>'resource', 'mode='=>'int'], -'oci_fetch' => ['bool', 'statement'=>'resource'], -'oci_fetch_all' => ['int|false', 'statement'=>'resource', '&w_output'=>'array', 'offset='=>'int', 'limit='=>'int', 'flags='=>'int'], -'oci_fetch_array' => ['array|false', 'statement'=>'resource', 'mode='=>'int'], -'oci_fetch_assoc' => ['array|false', 'statement'=>'resource'], -'oci_fetch_object' => ['object|false', 'statement'=>'resource'], -'oci_fetch_row' => ['array|false', 'statement'=>'resource'], -'oci_field_is_null' => ['bool', 'statement'=>'resource', 'column'=>'mixed'], -'oci_field_name' => ['string|false', 'statement'=>'resource', 'column'=>'mixed'], -'oci_field_precision' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], -'oci_field_scale' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], -'oci_field_size' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], -'oci_field_type' => ['mixed|false', 'statement'=>'resource', 'column'=>'mixed'], -'oci_field_type_raw' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], -'oci_free_collection' => ['bool'], -'oci_free_cursor' => ['bool', 'statement'=>'resource'], -'oci_free_descriptor' => ['bool'], -'oci_free_statement' => ['bool', 'statement'=>'resource'], -'oci_get_implicit' => ['bool', 'stmt'=>''], -'oci_get_implicit_resultset' => ['resource|false', 'statement'=>'resource'], -'oci_internal_debug' => ['void', 'onoff'=>'bool'], -'OCILob::append' => ['bool', 'lob_from'=>'OCILob'], -'OCILob::close' => ['bool'], -'OCILob::eof' => ['bool'], -'OCILob::erase' => ['int|false', 'offset='=>'int', 'length='=>'int'], -'OCILob::export' => ['bool', 'filename'=>'string', 'start='=>'int', 'length='=>'int'], -'OCILob::flush' => ['bool', 'flag='=>'int'], -'OCILob::free' => ['bool'], -'OCILob::getbuffering' => ['bool'], -'OCILob::import' => ['bool', 'filename'=>'string'], -'OCILob::load' => ['string|false'], -'OCILob::read' => ['string|false', 'length'=>'int'], -'OCILob::rewind' => ['bool'], -'OCILob::save' => ['bool', 'data'=>'string', 'offset='=>'int'], -'OCILob::savefile' => ['bool', 'filename'=>''], -'OCILob::seek' => ['bool', 'offset'=>'int', 'whence='=>'int'], -'OCILob::setbuffering' => ['bool', 'on_off'=>'bool'], -'OCILob::size' => ['int|false'], -'OCILob::tell' => ['int|false'], -'OCILob::truncate' => ['bool', 'length='=>'int'], -'OCILob::write' => ['int|false', 'data'=>'string', 'length='=>'int'], -'OCILob::writeTemporary' => ['bool', 'data'=>'string', 'lob_type='=>'int'], -'OCILob::writetofile' => ['bool', 'filename'=>'', 'start'=>'', 'length'=>''], -'oci_lob_append' => ['bool', 'to'=>'object'], -'oci_lob_close' => ['bool'], -'oci_lob_copy' => ['bool', 'to'=>'OCILob', 'from'=>'OCILob', 'length='=>'int'], -'oci_lob_eof' => ['bool'], -'oci_lob_erase' => ['int', 'lob'=>'int', 'offset'=>'int'], -'oci_lob_export' => ['bool', 'lob'=>'string', 'filename'=>'int', 'offset'=>'int'], -'oci_lob_flush' => ['bool', 'lob'=>'int'], -'oci_lob_import' => ['bool', 'lob'=>'string'], -'oci_lob_is_equal' => ['bool', 'lob1'=>'OCILob', 'lob2'=>'OCILob'], -'oci_lob_load' => ['string'], -'oci_lob_read' => ['string', 'lob'=>'int'], -'oci_lob_rewind' => ['bool'], -'oci_lob_save' => ['bool', 'lob'=>'string', 'data'=>'int'], -'oci_lob_seek' => ['bool', 'lob'=>'int', 'offset'=>'int'], -'oci_lob_size' => ['int'], -'oci_lob_tell' => ['int'], -'oci_lob_truncate' => ['bool', 'lob'=>'int'], -'oci_lob_write' => ['int', 'lob'=>'string', 'data'=>'int'], -'oci_lob_write_temporary' => ['bool', 'value'=>'string', 'lob_type'=>'int'], -'oci_new_collection' => ['OCICollection|false', 'connection'=>'resource', 'type_name'=>'string', 'schema='=>'string'], -'oci_new_connect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], -'oci_new_cursor' => ['resource|false', 'connection'=>'resource'], -'oci_new_descriptor' => ['OCILob|false', 'connection'=>'resource', 'type='=>'int'], -'oci_num_fields' => ['int|false', 'statement'=>'resource'], -'oci_num_rows' => ['int|false', 'statement'=>'resource'], -'oci_parse' => ['resource|false', 'connection'=>'resource', 'sql'=>'string'], -'oci_password_change' => ['bool', 'connection'=>'resource', 'username'=>'string', 'old_password'=>'string', 'new_password'=>'string'], -'oci_pconnect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], -'oci_register_taf_callback' => ['bool', 'connection'=>'resource', 'callback='=>'callable'], -'oci_result' => ['mixed|false', 'statement'=>'resource', 'column'=>'mixed'], -'oci_rollback' => ['bool', 'connection'=>'resource'], -'oci_server_version' => ['string|false', 'connection'=>'resource'], -'oci_set_action' => ['bool', 'connection'=>'resource', 'action'=>'string'], -'oci_set_call_timeout' => ['bool', 'connection'=>'resource', 'timeout'=>'int'], -'oci_set_client_identifier' => ['bool', 'connection'=>'resource', 'client_id'=>'string'], -'oci_set_client_info' => ['bool', 'connection'=>'resource', 'client_info'=>'string'], -'oci_set_db_operation' => ['bool', 'connection'=>'resource', 'action'=>'string'], -'oci_set_edition' => ['bool', 'edition'=>'string'], -'oci_set_module_name' => ['bool', 'connection'=>'resource', 'name'=>'string'], -'oci_set_prefetch' => ['bool', 'statement'=>'resource', 'rows'=>'int'], -'oci_statement_type' => ['string|false', 'statement'=>'resource'], -'oci_unregister_taf_callback' => ['bool', 'connection'=>'resource'], -'ocifetchinto' => ['int|bool', 'statement'=>'resource', '&w_result'=>'array', 'mode='=>'int'], -'ocigetbufferinglob' => ['bool'], -'ocisetbufferinglob' => ['bool', 'lob'=>'bool'], -'octdec' => ['int|float', 'octal_string'=>'string'], -'odbc_autocommit' => ['mixed', 'odbc'=>'resource', 'enable='=>'bool'], -'odbc_binmode' => ['bool', 'statement'=>'resource', 'mode'=>'int'], -'odbc_close' => ['void', 'odbc'=>'resource'], -'odbc_close_all' => ['void'], -'odbc_columnprivileges' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'column'=>'string'], -'odbc_columns' => ['resource|false', 'odbc'=>'resource', 'catalog='=>'string', 'schema='=>'string', 'table='=>'string', 'column='=>'string'], -'odbc_commit' => ['bool', 'odbc'=>'resource'], -'odbc_connect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'], -'odbc_cursor' => ['string', 'statement'=>'resource'], -'odbc_data_source' => ['array|false', 'odbc'=>'resource', 'fetch_type'=>'int'], -'odbc_do' => ['resource', 'odbc'=>'resource', 'query'=>'string', 'flags='=>'int'], -'odbc_error' => ['string', 'odbc='=>'resource'], -'odbc_errormsg' => ['string', 'odbc='=>'resource'], -'odbc_exec' => ['resource', 'odbc'=>'resource', 'query'=>'string', 'flags='=>'int'], -'odbc_execute' => ['bool', 'statement'=>'resource', 'params='=>'array'], -'odbc_fetch_array' => ['array|false', 'statement'=>'resource', 'row='=>'int'], -'odbc_fetch_into' => ['int', 'statement'=>'resource', '&w_array'=>'array', 'row='=>'int'], -'odbc_fetch_object' => ['object|false', 'statement'=>'resource', 'row='=>'int'], -'odbc_fetch_row' => ['bool', 'statement'=>'resource', 'row='=>'int'], -'odbc_field_len' => ['int|false', 'statement'=>'resource', 'field'=>'int'], -'odbc_field_name' => ['string|false', 'statement'=>'resource', 'field'=>'int'], -'odbc_field_num' => ['int|false', 'statement'=>'resource', 'field'=>'string'], -'odbc_field_precision' => ['int', 'statement'=>'resource', 'field'=>'int'], -'odbc_field_scale' => ['int|false', 'statement'=>'resource', 'field'=>'int'], -'odbc_field_type' => ['string|false', 'statement'=>'resource', 'field'=>'int'], -'odbc_foreignkeys' => ['resource|false', 'odbc'=>'resource', 'pk_catalog'=>'string', 'pk_schema'=>'string', 'pk_table'=>'string', 'fk_catalog'=>'string', 'fk_schema'=>'string', 'fk_table'=>'string'], -'odbc_free_result' => ['bool', 'statement'=>'resource'], -'odbc_gettypeinfo' => ['resource', 'odbc'=>'resource', 'data_type='=>'int'], -'odbc_longreadlen' => ['bool', 'statement'=>'resource', 'length'=>'int'], -'odbc_next_result' => ['bool', 'statement'=>'resource'], -'odbc_num_fields' => ['int', 'statement'=>'resource'], -'odbc_num_rows' => ['int', 'statement'=>'resource'], -'odbc_pconnect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'], -'odbc_prepare' => ['resource|false', 'odbc'=>'resource', 'query'=>'string'], -'odbc_primarykeys' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string'], -'odbc_procedurecolumns' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'procedure'=>'string', 'column'=>'string'], -'odbc_procedures' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'procedure'=>'string'], -'odbc_result' => ['mixed|false', 'statement'=>'resource', 'field'=>'mixed'], -'odbc_result_all' => ['int|false', 'statement'=>'resource', 'format='=>'string'], -'odbc_rollback' => ['bool', 'odbc'=>'resource'], -'odbc_setoption' => ['bool', 'odbc'=>'resource', 'which'=>'int', 'option'=>'int', 'value'=>'int'], -'odbc_specialcolumns' => ['resource|false', 'odbc'=>'resource', 'type'=>'int', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'scope'=>'int', 'nullable'=>'int'], -'odbc_statistics' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'unique'=>'int', 'accuracy'=>'int'], -'odbc_tableprivileges' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string'], -'odbc_tables' => ['resource|false', 'odbc'=>'resource', 'catalog='=>'string', 'schema='=>'string', 'table='=>'string', 'types='=>'string'], -'opcache_compile_file' => ['bool', 'filename'=>'string'], -'opcache_get_configuration' => ['array'], -'opcache_get_status' => ['array|false', 'include_scripts='=>'bool'], -'opcache_invalidate' => ['bool', 'filename'=>'string', 'force='=>'bool'], -'opcache_is_script_cached' => ['bool', 'filename'=>'string'], -'opcache_reset' => ['bool'], -'openal_buffer_create' => ['resource'], -'openal_buffer_data' => ['bool', 'buffer'=>'resource', 'format'=>'int', 'data'=>'string', 'freq'=>'int'], -'openal_buffer_destroy' => ['bool', 'buffer'=>'resource'], -'openal_buffer_get' => ['int', 'buffer'=>'resource', 'property'=>'int'], -'openal_buffer_loadwav' => ['bool', 'buffer'=>'resource', 'wavfile'=>'string'], -'openal_context_create' => ['resource', 'device'=>'resource'], -'openal_context_current' => ['bool', 'context'=>'resource'], -'openal_context_destroy' => ['bool', 'context'=>'resource'], -'openal_context_process' => ['bool', 'context'=>'resource'], -'openal_context_suspend' => ['bool', 'context'=>'resource'], -'openal_device_close' => ['bool', 'device'=>'resource'], -'openal_device_open' => ['resource|false', 'device_desc='=>'string'], -'openal_listener_get' => ['mixed', 'property'=>'int'], -'openal_listener_set' => ['bool', 'property'=>'int', 'setting'=>'mixed'], -'openal_source_create' => ['resource'], -'openal_source_destroy' => ['bool', 'source'=>'resource'], -'openal_source_get' => ['mixed', 'source'=>'resource', 'property'=>'int'], -'openal_source_pause' => ['bool', 'source'=>'resource'], -'openal_source_play' => ['bool', 'source'=>'resource'], -'openal_source_rewind' => ['bool', 'source'=>'resource'], -'openal_source_set' => ['bool', 'source'=>'resource', 'property'=>'int', 'setting'=>'mixed'], -'openal_source_stop' => ['bool', 'source'=>'resource'], -'openal_stream' => ['resource', 'source'=>'resource', 'format'=>'int', 'rate'=>'int'], -'opendir' => ['resource|false', 'directory'=>'string', 'context='=>'resource'], -'openlog' => ['bool', 'prefix'=>'string', 'flags'=>'int', 'facility'=>'int'], -'openssl_cipher_iv_length' => ['int|false', 'cipher_algo'=>'string'], -'openssl_csr_export' => ['bool', 'csr'=>'OpenSSLCertificateSigningRequest|string', '&w_output'=>'string', 'no_text='=>'bool'], -'openssl_csr_export_to_file' => ['bool', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'output_filename'=>'string', 'no_text='=>'bool'], -'openssl_csr_get_public_key' => ['OpenSSLAsymmetricKey|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'short_names='=>'bool'], -'openssl_csr_get_subject' => ['array|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'short_names='=>'bool'], -'openssl_csr_new' => ['OpenSSLCertificateSigningRequest|false', 'distinguished_names'=>'array', '&w_private_key'=>'OpenSSLAsymmetricKey', 'options='=>'array|null', 'extra_attributes='=>'array|null'], -'openssl_csr_sign' => ['OpenSSLCertificate|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'ca_certificate'=>'OpenSSLCertificate|string|null', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'days'=>'int', 'options='=>'array|null', 'serial='=>'int'], -'openssl_decrypt' => ['string|false', 'data'=>'string', 'cipher_algo'=>'string', 'passphrase'=>'string', 'options='=>'int', 'iv='=>'string', 'tag='=>'string', 'aad='=>'string'], -'openssl_dh_compute_key' => ['string|false', 'public_key'=>'string', 'private_key'=>'OpenSSLAsymmetricKey'], -'openssl_digest' => ['string|false', 'data'=>'string', 'digest_algo'=>'string', 'binary='=>'bool'], -'openssl_encrypt' => ['string|false', 'data'=>'string', 'cipher_algo'=>'string', 'passphrase'=>'string', 'options='=>'int', 'iv='=>'string', '&w_tag='=>'string', 'aad='=>'string', 'tag_length='=>'int'], -'openssl_error_string' => ['string|false'], -'openssl_free_key' => ['void', 'key'=>'OpenSSLAsymmetricKey'], -'openssl_get_cert_locations' => ['array'], -'openssl_get_cipher_methods' => ['array', 'aliases='=>'bool'], -'openssl_get_curve_names' => ['list'], -'openssl_get_md_methods' => ['array', 'aliases='=>'bool'], -'openssl_get_privatekey' => ['OpenSSLAsymmetricKey|false', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase='=>'?string'], -'openssl_get_publickey' => ['OpenSSLAsymmetricKey|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], -'openssl_open' => ['bool', 'data'=>'string', '&w_output'=>'string', 'encrypted_key'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'cipher_algo'=>'string', 'iv='=>'string|null'], -'openssl_pbkdf2' => ['string|false', 'password'=>'string', 'salt'=>'string', 'key_length'=>'int', 'iterations'=>'int', 'digest_algo='=>'string'], -'openssl_pkcs12_export' => ['bool', 'certificate'=>'OpenSSLCertificate|string', '&w_output'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase'=>'string', 'options='=>'array'], -'openssl_pkcs12_export_to_file' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'output_filename'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase'=>'string', 'options='=>'array'], -'openssl_pkcs12_read' => ['bool', 'pkcs12'=>'string', '&w_certificates'=>'array', 'passphrase'=>'string'], -'openssl_pkcs7_decrypt' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|string', 'private_key='=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string|null'], -'openssl_pkcs7_encrypt' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|list|string', 'headers'=>'array|null', 'flags='=>'int', 'cipher_algo='=>'int'], -'openssl_pkcs7_read' => ['bool', 'input_filename'=>'string', '&w_certificates'=>'array'], -'openssl_pkcs7_sign' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'headers'=>'array|null', 'flags='=>'int', 'untrusted_certificates_filename='=>'string|null'], -'openssl_pkcs7_verify' => ['bool|int', 'input_filename'=>'string', 'flags'=>'int', 'signers_certificates_filename='=>'string', 'ca_info='=>'array', 'untrusted_certificates_filename='=>'string', 'content='=>'string', 'output_filename='=>'string'], -'openssl_pkey_derive' => ['string|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'key_length='=>'int'], -'openssl_pkey_export' => ['bool', 'key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', '&w_output'=>'string', 'passphrase='=>'string|null', 'options='=>'array|null'], -'openssl_pkey_export_to_file' => ['bool', 'key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'output_filename'=>'string', 'passphrase='=>'string|null', 'options='=>'array|null'], -'openssl_pkey_free' => ['void', 'key'=>'OpenSSLAsymmetricKey'], -'openssl_pkey_get_details' => ['array|false', 'key'=>'OpenSSLAsymmetricKey'], -'openssl_pkey_get_private' => ['OpenSSLAsymmetricKey|false', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string', 'passphrase='=>'?string'], -'openssl_pkey_get_public' => ['OpenSSLAsymmetricKey|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], -'openssl_pkey_new' => ['OpenSSLAsymmetricKey|false', 'options='=>'array|null'], -'openssl_private_decrypt' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], -'openssl_private_encrypt' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], -'openssl_public_decrypt' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], -'openssl_public_encrypt' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], -'openssl_random_pseudo_bytes' => ['string|false', 'length'=>'int', '&w_strong_result='=>'bool'], -'openssl_seal' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&w_encrypted_keys'=>'array', 'public_key'=>'list', 'cipher_algo'=>'string', '&rw_iv='=>'string'], -'openssl_sign' => ['bool', 'data'=>'string', '&w_signature'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'algorithm='=>'int|string'], -'openssl_spki_export' => ['?string', 'spki'=>'string'], -'openssl_spki_export_challenge' => ['?string', 'spki'=>'string'], -'openssl_spki_new' => ['string|false', 'private_key'=>'OpenSSLAsymmetricKey', 'challenge'=>'string', 'digest_algo='=>'int'], -'openssl_spki_verify' => ['bool', 'spki'=>'string'], -'openssl_verify' => ['-1|0|1|false', 'data'=>'string', 'signature'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'algorithm='=>'int|string'], -'openssl_x509_check_private_key' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], -'openssl_x509_checkpurpose' => ['bool|int', 'certificate'=>'OpenSSLCertificate|string', 'purpose'=>'int', 'ca_info='=>'array', 'untrusted_certificates_file='=>'string|null'], -'openssl_x509_export' => ['bool', 'certificate'=>'OpenSSLCertificate|string', '&w_output'=>'string', 'no_text='=>'bool'], -'openssl_x509_export_to_file' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'output_filename'=>'string', 'no_text='=>'bool'], -'openssl_x509_fingerprint' => ['string|false', 'certificate'=>'OpenSSLCertificate|string', 'digest_algo='=>'string', 'binary='=>'bool'], -'openssl_x509_free' => ['void', 'certificate'=>'OpenSSLCertificate'], -'openssl_x509_parse' => ['array|false', 'certificate'=>'OpenSSLCertificate|string', 'short_names='=>'bool'], -'openssl_x509_read' => ['OpenSSLCertificate|false', 'certificate'=>'OpenSSLCertificate|string'], -'ord' => ['int', 'character'=>'string'], -'OuterIterator::current' => ['mixed'], -'OuterIterator::getInnerIterator' => ['Iterator'], -'OuterIterator::key' => ['int|string'], -'OuterIterator::next' => ['void'], -'OuterIterator::rewind' => ['void'], -'OuterIterator::valid' => ['bool'], -'OutOfBoundsException::__clone' => ['void'], -'OutOfBoundsException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OutOfBoundsException'], -'OutOfBoundsException::__toString' => ['string'], -'OutOfBoundsException::getCode' => ['int'], -'OutOfBoundsException::getFile' => ['string'], -'OutOfBoundsException::getLine' => ['int'], -'OutOfBoundsException::getMessage' => ['string'], -'OutOfBoundsException::getPrevious' => ['Throwable|OutOfBoundsException|null'], -'OutOfBoundsException::getTrace' => ['list\',args?:array}>'], -'OutOfBoundsException::getTraceAsString' => ['string'], -'OutOfRangeException::__clone' => ['void'], -'OutOfRangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OutOfRangeException'], -'OutOfRangeException::__toString' => ['string'], -'OutOfRangeException::getCode' => ['int'], -'OutOfRangeException::getFile' => ['string'], -'OutOfRangeException::getLine' => ['int'], -'OutOfRangeException::getMessage' => ['string'], -'OutOfRangeException::getPrevious' => ['Throwable|OutOfRangeException|null'], -'OutOfRangeException::getTrace' => ['list\',args?:array}>'], -'OutOfRangeException::getTraceAsString' => ['string'], -'output_add_rewrite_var' => ['bool', 'name'=>'string', 'value'=>'string'], -'output_cache_disable' => ['void'], -'output_cache_disable_compression' => ['void'], -'output_cache_exists' => ['bool', 'key'=>'string', 'lifetime'=>'int'], -'output_cache_fetch' => ['string', 'key'=>'string', 'function'=>'', 'lifetime'=>'int'], -'output_cache_get' => ['mixed|false', 'key'=>'string', 'lifetime'=>'int'], -'output_cache_output' => ['string', 'key'=>'string', 'function'=>'', 'lifetime'=>'int'], -'output_cache_put' => ['bool', 'key'=>'string', 'data'=>'mixed'], -'output_cache_remove' => ['bool', 'filename'=>''], -'output_cache_remove_key' => ['bool', 'key'=>'string'], -'output_cache_remove_url' => ['bool', 'url'=>'string'], -'output_cache_stop' => ['void'], -'output_reset_rewrite_vars' => ['bool'], -'outputformatObj::getOption' => ['string', 'property_name'=>'string'], -'outputformatObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'outputformatObj::setOption' => ['void', 'property_name'=>'string', 'new_value'=>'string'], -'outputformatObj::validate' => ['int'], -'OverflowException::__clone' => ['void'], -'OverflowException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OverflowException'], -'OverflowException::__toString' => ['string'], -'OverflowException::getCode' => ['int'], -'OverflowException::getFile' => ['string'], -'OverflowException::getLine' => ['int'], -'OverflowException::getMessage' => ['string'], -'OverflowException::getPrevious' => ['Throwable|OverflowException|null'], -'OverflowException::getTrace' => ['list\',args?:array}>'], -'OverflowException::getTraceAsString' => ['string'], -'overload' => ['', 'class_name'=>'string'], -'override_function' => ['bool', 'function_name'=>'string', 'function_args'=>'string', 'function_code'=>'string'], -'OwsrequestObj::__construct' => ['void'], -'OwsrequestObj::addParameter' => ['int', 'name'=>'string', 'value'=>'string'], -'OwsrequestObj::getName' => ['string', 'index'=>'int'], -'OwsrequestObj::getValue' => ['string', 'index'=>'int'], -'OwsrequestObj::getValueByName' => ['string', 'name'=>'string'], -'OwsrequestObj::loadParams' => ['int'], -'OwsrequestObj::setParameter' => ['int', 'name'=>'string', 'value'=>'string'], -'pack' => ['string|false', 'format'=>'string', '...values='=>'mixed'], -'parallel\Future::done' => ['bool'], -'parallel\Future::select' => ['mixed', '&resolving'=>'parallel\Future[]', '&w_resolved'=>'parallel\Future[]', '&w_errored'=>'parallel\Future[]', '&w_timedout='=>'parallel\Future[]', 'timeout='=>'int'], -'parallel\Future::value' => ['mixed', 'timeout='=>'int'], -'parallel\Runtime::__construct' => ['void', 'arg'=>'string|array'], -'parallel\Runtime::__construct\'1' => ['void', 'bootstrap'=>'string', 'configuration'=>'array'], -'parallel\Runtime::close' => ['void'], -'parallel\Runtime::kill' => ['void'], -'parallel\Runtime::run' => ['?parallel\Future', 'closure'=>'Closure', 'args='=>'array'], -'ParentIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'], -'ParentIterator::accept' => ['bool'], -'ParentIterator::getChildren' => ['ParentIterator'], -'ParentIterator::hasChildren' => ['bool'], -'ParentIterator::next' => ['void'], -'ParentIterator::rewind' => ['void'], -'ParentIterator::valid' => [''], -'Parle\Lexer::advance' => ['void'], -'Parle\Lexer::build' => ['void'], -'Parle\Lexer::callout' => ['void', 'id'=>'int', 'callback'=>'callable'], -'Parle\Lexer::consume' => ['void', 'data'=>'string'], -'Parle\Lexer::dump' => ['void'], -'Parle\Lexer::getToken' => ['Parle\Token'], -'Parle\Lexer::insertMacro' => ['void', 'name'=>'string', 'regex'=>'string'], -'Parle\Lexer::push' => ['void', 'regex'=>'string', 'id'=>'int'], -'Parle\Lexer::reset' => ['void', 'pos'=>'int'], -'Parle\Parser::advance' => ['void'], -'Parle\Parser::build' => ['void'], -'Parle\Parser::consume' => ['void', 'data'=>'string', 'lexer'=>'Parle\Lexer'], -'Parle\Parser::dump' => ['void'], -'Parle\Parser::errorInfo' => ['Parle\ErrorInfo'], -'Parle\Parser::left' => ['void', 'token'=>'string'], -'Parle\Parser::nonassoc' => ['void', 'token'=>'string'], -'Parle\Parser::precedence' => ['void', 'token'=>'string'], -'Parle\Parser::push' => ['int', 'name'=>'string', 'rule'=>'string'], -'Parle\Parser::reset' => ['void', 'tokenId'=>'int'], -'Parle\Parser::right' => ['void', 'token'=>'string'], -'Parle\Parser::sigil' => ['string', 'idx'=>'array'], -'Parle\Parser::token' => ['void', 'token'=>'string'], -'Parle\Parser::tokenId' => ['int', 'token'=>'string'], -'Parle\Parser::trace' => ['string'], -'Parle\Parser::validate' => ['bool', 'data'=>'string', 'lexer'=>'Parle\Lexer'], -'Parle\RLexer::advance' => ['void'], -'Parle\RLexer::build' => ['void'], -'Parle\RLexer::callout' => ['void', 'id'=>'int', 'callback'=>'callable'], -'Parle\RLexer::consume' => ['void', 'data'=>'string'], -'Parle\RLexer::dump' => ['void'], -'Parle\RLexer::getToken' => ['Parle\Token'], -'parle\rlexer::insertMacro' => ['void', 'name'=>'string', 'regex'=>'string'], -'Parle\RLexer::push' => ['void', 'state'=>'string', 'regex'=>'string', 'newState'=>'string'], -'Parle\RLexer::pushState' => ['int', 'state'=>'string'], -'Parle\RLexer::reset' => ['void', 'pos'=>'int'], -'Parle\RParser::advance' => ['void'], -'Parle\RParser::build' => ['void'], -'Parle\RParser::consume' => ['void', 'data'=>'string', 'lexer'=>'Parle\Lexer'], -'Parle\RParser::dump' => ['void'], -'Parle\RParser::errorInfo' => ['Parle\ErrorInfo'], -'Parle\RParser::left' => ['void', 'token'=>'string'], -'Parle\RParser::nonassoc' => ['void', 'token'=>'string'], -'Parle\RParser::precedence' => ['void', 'token'=>'string'], -'Parle\RParser::push' => ['int', 'name'=>'string', 'rule'=>'string'], -'Parle\RParser::reset' => ['void', 'tokenId'=>'int'], -'Parle\RParser::right' => ['void', 'token'=>'string'], -'Parle\RParser::sigil' => ['string', 'idx'=>'array'], -'Parle\RParser::token' => ['void', 'token'=>'string'], -'Parle\RParser::tokenId' => ['int', 'token'=>'string'], -'Parle\RParser::trace' => ['string'], -'Parle\RParser::validate' => ['bool', 'data'=>'string', 'lexer'=>'Parle\Lexer'], -'Parle\Stack::pop' => ['void'], -'Parle\Stack::push' => ['void', 'item'=>'mixed'], -'parse_ini_file' => ['array|false', 'filename'=>'string', 'process_sections='=>'bool', 'scanner_mode='=>'int'], -'parse_ini_string' => ['array|false', 'ini_string'=>'string', 'process_sections='=>'bool', 'scanner_mode='=>'int'], -'parse_str' => ['void', 'string'=>'string', '&w_result'=>'array'], -'parse_url' => ['mixed|false', 'url'=>'string', 'component='=>'int'], -'ParseError::__clone' => ['void'], -'ParseError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?ParseError'], -'ParseError::__toString' => ['string'], -'ParseError::getCode' => ['int'], -'ParseError::getFile' => ['string'], -'ParseError::getLine' => ['int'], -'ParseError::getMessage' => ['string'], -'ParseError::getPrevious' => ['Throwable|ParseError|null'], -'ParseError::getTrace' => ['list\',args?:array}>'], -'ParseError::getTraceAsString' => ['string'], -'parsekit_compile_file' => ['array', 'filename'=>'string', 'errors='=>'array', 'options='=>'int'], -'parsekit_compile_string' => ['array', 'phpcode'=>'string', 'errors='=>'array', 'options='=>'int'], -'parsekit_func_arginfo' => ['array', 'function'=>'mixed'], -'passthru' => ['void', 'command'=>'string', '&w_result_code='=>'int'], -'password_get_info' => ['array', 'hash'=>'string'], -'password_hash' => ['string', 'password'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], -'password_make_salt' => ['bool', 'password'=>'string', 'hash'=>'string'], -'password_needs_rehash' => ['bool', 'hash'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], -'password_verify' => ['bool', 'password'=>'string', 'hash'=>'string'], -'pathinfo' => ['array|string', 'path'=>'string', 'flags='=>'int'], -'pclose' => ['int', 'handle'=>'resource'], -'pcnlt_sigwaitinfo' => ['int', 'set'=>'array', '&w_siginfo'=>'array'], -'pcntl_alarm' => ['int', 'seconds'=>'int'], -'pcntl_async_signals' => ['bool', 'enable='=>'bool'], -'pcntl_errno' => ['int'], -'pcntl_exec' => ['null|false', 'path'=>'string', 'args='=>'array', 'env_vars='=>'array'], -'pcntl_fork' => ['int'], -'pcntl_get_last_error' => ['int'], -'pcntl_getpriority' => ['int', 'process_id='=>'int', 'mode='=>'int'], -'pcntl_setpriority' => ['bool', 'priority'=>'int', 'process_id='=>'int', 'mode='=>'int'], -'pcntl_signal' => ['bool', 'signal'=>'int', 'handler'=>'callable():void|callable(int):void|callable(int,array):void|int', 'restart_syscalls='=>'bool'], -'pcntl_signal_dispatch' => ['bool'], -'pcntl_signal_get_handler' => ['int|string', 'signal'=>'int'], -'pcntl_sigprocmask' => ['bool', 'mode'=>'int', 'signals'=>'array', '&w_old_signals='=>'array'], -'pcntl_sigtimedwait' => ['int', 'signals'=>'array', '&w_info='=>'array', 'seconds='=>'int', 'nanoseconds='=>'int'], -'pcntl_sigwaitinfo' => ['int', 'signals'=>'array', '&w_info='=>'array'], -'pcntl_strerror' => ['string|false', 'error_code'=>'int'], -'pcntl_wait' => ['int', '&w_status'=>'int', 'flags='=>'int', '&w_resource_usage='=>'array'], -'pcntl_waitpid' => ['int', 'process_id'=>'int', '&w_status'=>'int', 'flags='=>'int', '&w_resource_usage='=>'array'], -'pcntl_wexitstatus' => ['int', 'status'=>'int'], -'pcntl_wifcontinued' => ['bool', 'status'=>'int'], -'pcntl_wifexited' => ['bool', 'status'=>'int'], -'pcntl_wifsignaled' => ['bool', 'status'=>'int'], -'pcntl_wifstopped' => ['bool', 'status'=>'int'], -'pcntl_wstopsig' => ['int', 'status'=>'int'], -'pcntl_wtermsig' => ['int', 'status'=>'int'], -'PDF_activate_item' => ['bool', 'pdfdoc'=>'resource', 'id'=>'int'], -'PDF_add_launchlink' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], -'PDF_add_locallink' => ['bool', 'pdfdoc'=>'resource', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'page'=>'int', 'dest'=>'string'], -'PDF_add_nameddest' => ['bool', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], -'PDF_add_note' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], -'PDF_add_pdflink' => ['bool', 'pdfdoc'=>'resource', 'bottom_left_x'=>'float', 'bottom_left_y'=>'float', 'up_right_x'=>'float', 'up_right_y'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], -'PDF_add_table_cell' => ['int', 'pdfdoc'=>'resource', 'table'=>'int', 'column'=>'int', 'row'=>'int', 'text'=>'string', 'optlist'=>'string'], -'PDF_add_textflow' => ['int', 'pdfdoc'=>'resource', 'textflow'=>'int', 'text'=>'string', 'optlist'=>'string'], -'PDF_add_thumbnail' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int'], -'PDF_add_weblink' => ['bool', 'pdfdoc'=>'resource', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'url'=>'string'], -'PDF_arc' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], -'PDF_arcn' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], -'PDF_attach_file' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'description'=>'string', 'author'=>'string', 'mimetype'=>'string', 'icon'=>'string'], -'PDF_begin_document' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string'], -'PDF_begin_font' => ['bool', 'pdfdoc'=>'resource', 'filename'=>'string', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float', 'optlist'=>'string'], -'PDF_begin_glyph' => ['bool', 'pdfdoc'=>'resource', 'glyphname'=>'string', 'wx'=>'float', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float'], -'PDF_begin_item' => ['int', 'pdfdoc'=>'resource', 'tag'=>'string', 'optlist'=>'string'], -'PDF_begin_layer' => ['bool', 'pdfdoc'=>'resource', 'layer'=>'int'], -'PDF_begin_page' => ['bool', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float'], -'PDF_begin_page_ext' => ['bool', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], -'PDF_begin_pattern' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], -'PDF_begin_template' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float'], -'PDF_begin_template_ext' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], -'PDF_circle' => ['bool', 'pdfdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float'], -'PDF_clip' => ['bool', 'p'=>'resource'], -'PDF_close' => ['bool', 'p'=>'resource'], -'PDF_close_image' => ['bool', 'p'=>'resource', 'image'=>'int'], -'PDF_close_pdi' => ['bool', 'p'=>'resource', 'doc'=>'int'], -'PDF_close_pdi_page' => ['bool', 'p'=>'resource', 'page'=>'int'], -'PDF_closepath' => ['bool', 'p'=>'resource'], -'PDF_closepath_fill_stroke' => ['bool', 'p'=>'resource'], -'PDF_closepath_stroke' => ['bool', 'p'=>'resource'], -'PDF_concat' => ['bool', 'p'=>'resource', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], -'PDF_continue_text' => ['bool', 'p'=>'resource', 'text'=>'string'], -'PDF_create_3dview' => ['int', 'pdfdoc'=>'resource', 'username'=>'string', 'optlist'=>'string'], -'PDF_create_action' => ['int', 'pdfdoc'=>'resource', 'type'=>'string', 'optlist'=>'string'], -'PDF_create_annotation' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'type'=>'string', 'optlist'=>'string'], -'PDF_create_bookmark' => ['int', 'pdfdoc'=>'resource', 'text'=>'string', 'optlist'=>'string'], -'PDF_create_field' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'name'=>'string', 'type'=>'string', 'optlist'=>'string'], -'PDF_create_fieldgroup' => ['bool', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], -'PDF_create_gstate' => ['int', 'pdfdoc'=>'resource', 'optlist'=>'string'], -'PDF_create_pvf' => ['bool', 'pdfdoc'=>'resource', 'filename'=>'string', 'data'=>'string', 'optlist'=>'string'], -'PDF_create_textflow' => ['int', 'pdfdoc'=>'resource', 'text'=>'string', 'optlist'=>'string'], -'PDF_curveto' => ['bool', 'p'=>'resource', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], -'PDF_define_layer' => ['int', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], -'PDF_delete' => ['bool', 'pdfdoc'=>'resource'], -'PDF_delete_pvf' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string'], -'PDF_delete_table' => ['bool', 'pdfdoc'=>'resource', 'table'=>'int', 'optlist'=>'string'], -'PDF_delete_textflow' => ['bool', 'pdfdoc'=>'resource', 'textflow'=>'int'], -'PDF_encoding_set_char' => ['bool', 'pdfdoc'=>'resource', 'encoding'=>'string', 'slot'=>'int', 'glyphname'=>'string', 'uv'=>'int'], -'PDF_end_document' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], -'PDF_end_font' => ['bool', 'pdfdoc'=>'resource'], -'PDF_end_glyph' => ['bool', 'pdfdoc'=>'resource'], -'PDF_end_item' => ['bool', 'pdfdoc'=>'resource', 'id'=>'int'], -'PDF_end_layer' => ['bool', 'pdfdoc'=>'resource'], -'PDF_end_page' => ['bool', 'p'=>'resource'], -'PDF_end_page_ext' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], -'PDF_end_pattern' => ['bool', 'p'=>'resource'], -'PDF_end_template' => ['bool', 'p'=>'resource'], -'PDF_endpath' => ['bool', 'p'=>'resource'], -'PDF_fill' => ['bool', 'p'=>'resource'], -'PDF_fill_imageblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'image'=>'int', 'optlist'=>'string'], -'PDF_fill_pdfblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'contents'=>'int', 'optlist'=>'string'], -'PDF_fill_stroke' => ['bool', 'p'=>'resource'], -'PDF_fill_textblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'text'=>'string', 'optlist'=>'string'], -'PDF_findfont' => ['int', 'p'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'embed'=>'int'], -'PDF_fit_image' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], -'PDF_fit_pdi_page' => ['bool', 'pdfdoc'=>'resource', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], -'PDF_fit_table' => ['string', 'pdfdoc'=>'resource', 'table'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], -'PDF_fit_textflow' => ['string', 'pdfdoc'=>'resource', 'textflow'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], -'PDF_fit_textline' => ['bool', 'pdfdoc'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], -'PDF_get_apiname' => ['string', 'pdfdoc'=>'resource'], -'PDF_get_buffer' => ['string', 'p'=>'resource'], -'PDF_get_errmsg' => ['string', 'pdfdoc'=>'resource'], -'PDF_get_errnum' => ['int', 'pdfdoc'=>'resource'], -'PDF_get_majorversion' => ['int'], -'PDF_get_minorversion' => ['int'], -'PDF_get_parameter' => ['string', 'p'=>'resource', 'key'=>'string', 'modifier'=>'float'], -'PDF_get_pdi_parameter' => ['string', 'p'=>'resource', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], -'PDF_get_pdi_value' => ['float', 'p'=>'resource', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], -'PDF_get_value' => ['float', 'p'=>'resource', 'key'=>'string', 'modifier'=>'float'], -'PDF_info_font' => ['float', 'pdfdoc'=>'resource', 'font'=>'int', 'keyword'=>'string', 'optlist'=>'string'], -'PDF_info_matchbox' => ['float', 'pdfdoc'=>'resource', 'boxname'=>'string', 'num'=>'int', 'keyword'=>'string'], -'PDF_info_table' => ['float', 'pdfdoc'=>'resource', 'table'=>'int', 'keyword'=>'string'], -'PDF_info_textflow' => ['float', 'pdfdoc'=>'resource', 'textflow'=>'int', 'keyword'=>'string'], -'PDF_info_textline' => ['float', 'pdfdoc'=>'resource', 'text'=>'string', 'keyword'=>'string', 'optlist'=>'string'], -'PDF_initgraphics' => ['bool', 'p'=>'resource'], -'PDF_lineto' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], -'PDF_load_3ddata' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string'], -'PDF_load_font' => ['int', 'pdfdoc'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'optlist'=>'string'], -'PDF_load_iccprofile' => ['int', 'pdfdoc'=>'resource', 'profilename'=>'string', 'optlist'=>'string'], -'PDF_load_image' => ['int', 'pdfdoc'=>'resource', 'imagetype'=>'string', 'filename'=>'string', 'optlist'=>'string'], -'PDF_makespotcolor' => ['int', 'p'=>'resource', 'spotname'=>'string'], -'PDF_moveto' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], -'PDF_new' => ['resource'], -'PDF_open_ccitt' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'bitreverse'=>'int', 'k'=>'int', 'blackls1'=>'int'], -'PDF_open_file' => ['bool', 'p'=>'resource', 'filename'=>'string'], -'PDF_open_image' => ['int', 'p'=>'resource', 'imagetype'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], -'PDF_open_image_file' => ['int', 'p'=>'resource', 'imagetype'=>'string', 'filename'=>'string', 'stringparam'=>'string', 'intparam'=>'int'], -'PDF_open_memory_image' => ['int', 'p'=>'resource', 'image'=>'resource'], -'PDF_open_pdi' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string', 'length'=>'int'], -'PDF_open_pdi_document' => ['int', 'p'=>'resource', 'filename'=>'string', 'optlist'=>'string'], -'PDF_open_pdi_page' => ['int', 'p'=>'resource', 'doc'=>'int', 'pagenumber'=>'int', 'optlist'=>'string'], -'PDF_pcos_get_number' => ['float', 'p'=>'resource', 'doc'=>'int', 'path'=>'string'], -'PDF_pcos_get_stream' => ['string', 'p'=>'resource', 'doc'=>'int', 'optlist'=>'string', 'path'=>'string'], -'PDF_pcos_get_string' => ['string', 'p'=>'resource', 'doc'=>'int', 'path'=>'string'], -'PDF_place_image' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], -'PDF_place_pdi_page' => ['bool', 'pdfdoc'=>'resource', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'sx'=>'float', 'sy'=>'float'], -'PDF_process_pdi' => ['int', 'pdfdoc'=>'resource', 'doc'=>'int', 'page'=>'int', 'optlist'=>'string'], -'PDF_rect' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], -'PDF_restore' => ['bool', 'p'=>'resource'], -'PDF_resume_page' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], -'PDF_rotate' => ['bool', 'p'=>'resource', 'phi'=>'float'], -'PDF_save' => ['bool', 'p'=>'resource'], -'PDF_scale' => ['bool', 'p'=>'resource', 'sx'=>'float', 'sy'=>'float'], -'PDF_set_border_color' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'PDF_set_border_dash' => ['bool', 'pdfdoc'=>'resource', 'black'=>'float', 'white'=>'float'], -'PDF_set_border_style' => ['bool', 'pdfdoc'=>'resource', 'style'=>'string', 'width'=>'float'], -'PDF_set_gstate' => ['bool', 'pdfdoc'=>'resource', 'gstate'=>'int'], -'PDF_set_info' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], -'PDF_set_layer_dependency' => ['bool', 'pdfdoc'=>'resource', 'type'=>'string', 'optlist'=>'string'], -'PDF_set_parameter' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], -'PDF_set_text_pos' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], -'PDF_set_value' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'float'], -'PDF_setcolor' => ['bool', 'p'=>'resource', 'fstype'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], -'PDF_setdash' => ['bool', 'pdfdoc'=>'resource', 'b'=>'float', 'w'=>'float'], -'PDF_setdashpattern' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], -'PDF_setflat' => ['bool', 'pdfdoc'=>'resource', 'flatness'=>'float'], -'PDF_setfont' => ['bool', 'pdfdoc'=>'resource', 'font'=>'int', 'fontsize'=>'float'], -'PDF_setgray' => ['bool', 'p'=>'resource', 'g'=>'float'], -'PDF_setgray_fill' => ['bool', 'p'=>'resource', 'g'=>'float'], -'PDF_setgray_stroke' => ['bool', 'p'=>'resource', 'g'=>'float'], -'PDF_setlinecap' => ['bool', 'p'=>'resource', 'linecap'=>'int'], -'PDF_setlinejoin' => ['bool', 'p'=>'resource', 'value'=>'int'], -'PDF_setlinewidth' => ['bool', 'p'=>'resource', 'width'=>'float'], -'PDF_setmatrix' => ['bool', 'p'=>'resource', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], -'PDF_setmiterlimit' => ['bool', 'pdfdoc'=>'resource', 'miter'=>'float'], -'PDF_setrgbcolor' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'PDF_setrgbcolor_fill' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'PDF_setrgbcolor_stroke' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'PDF_shading' => ['int', 'pdfdoc'=>'resource', 'shtype'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], -'PDF_shading_pattern' => ['int', 'pdfdoc'=>'resource', 'shading'=>'int', 'optlist'=>'string'], -'PDF_shfill' => ['bool', 'pdfdoc'=>'resource', 'shading'=>'int'], -'PDF_show' => ['bool', 'pdfdoc'=>'resource', 'text'=>'string'], -'PDF_show_boxed' => ['int', 'p'=>'resource', 'text'=>'string', 'left'=>'float', 'top'=>'float', 'width'=>'float', 'height'=>'float', 'mode'=>'string', 'feature'=>'string'], -'PDF_show_xy' => ['bool', 'p'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float'], -'PDF_skew' => ['bool', 'p'=>'resource', 'alpha'=>'float', 'beta'=>'float'], -'PDF_stringwidth' => ['float', 'p'=>'resource', 'text'=>'string', 'font'=>'int', 'fontsize'=>'float'], -'PDF_stroke' => ['bool', 'p'=>'resource'], -'PDF_suspend_page' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], -'PDF_translate' => ['bool', 'p'=>'resource', 'tx'=>'float', 'ty'=>'float'], -'PDF_utf16_to_utf8' => ['string', 'pdfdoc'=>'resource', 'utf16string'=>'string'], -'PDF_utf32_to_utf16' => ['string', 'pdfdoc'=>'resource', 'utf32string'=>'string', 'ordering'=>'string'], -'PDF_utf8_to_utf16' => ['string', 'pdfdoc'=>'resource', 'utf8string'=>'string', 'ordering'=>'string'], -'PDFlib::activate_item' => ['bool', 'id'=>''], -'PDFlib::add_launchlink' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], -'PDFlib::add_locallink' => ['bool', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'page'=>'int', 'dest'=>'string'], -'PDFlib::add_nameddest' => ['bool', 'name'=>'string', 'optlist'=>'string'], -'PDFlib::add_note' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], -'PDFlib::add_pdflink' => ['bool', 'bottom_left_x'=>'float', 'bottom_left_y'=>'float', 'up_right_x'=>'float', 'up_right_y'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], -'PDFlib::add_table_cell' => ['int', 'table'=>'int', 'column'=>'int', 'row'=>'int', 'text'=>'string', 'optlist'=>'string'], -'PDFlib::add_textflow' => ['int', 'textflow'=>'int', 'text'=>'string', 'optlist'=>'string'], -'PDFlib::add_thumbnail' => ['bool', 'image'=>'int'], -'PDFlib::add_weblink' => ['bool', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'url'=>'string'], -'PDFlib::arc' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], -'PDFlib::arcn' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], -'PDFlib::attach_file' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'description'=>'string', 'author'=>'string', 'mimetype'=>'string', 'icon'=>'string'], -'PDFlib::begin_document' => ['int', 'filename'=>'string', 'optlist'=>'string'], -'PDFlib::begin_font' => ['bool', 'filename'=>'string', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float', 'optlist'=>'string'], -'PDFlib::begin_glyph' => ['bool', 'glyphname'=>'string', 'wx'=>'float', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float'], -'PDFlib::begin_item' => ['int', 'tag'=>'string', 'optlist'=>'string'], -'PDFlib::begin_layer' => ['bool', 'layer'=>'int'], -'PDFlib::begin_page' => ['bool', 'width'=>'float', 'height'=>'float'], -'PDFlib::begin_page_ext' => ['bool', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], -'PDFlib::begin_pattern' => ['int', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], -'PDFlib::begin_template' => ['int', 'width'=>'float', 'height'=>'float'], -'PDFlib::begin_template_ext' => ['int', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], -'PDFlib::circle' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float'], -'PDFlib::clip' => ['bool'], -'PDFlib::close' => ['bool'], -'PDFlib::close_image' => ['bool', 'image'=>'int'], -'PDFlib::close_pdi' => ['bool', 'doc'=>'int'], -'PDFlib::close_pdi_page' => ['bool', 'page'=>'int'], -'PDFlib::closepath' => ['bool'], -'PDFlib::closepath_fill_stroke' => ['bool'], -'PDFlib::closepath_stroke' => ['bool'], -'PDFlib::concat' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], -'PDFlib::continue_text' => ['bool', 'text'=>'string'], -'PDFlib::create_3dview' => ['int', 'username'=>'string', 'optlist'=>'string'], -'PDFlib::create_action' => ['int', 'type'=>'string', 'optlist'=>'string'], -'PDFlib::create_annotation' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'type'=>'string', 'optlist'=>'string'], -'PDFlib::create_bookmark' => ['int', 'text'=>'string', 'optlist'=>'string'], -'PDFlib::create_field' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'name'=>'string', 'type'=>'string', 'optlist'=>'string'], -'PDFlib::create_fieldgroup' => ['bool', 'name'=>'string', 'optlist'=>'string'], -'PDFlib::create_gstate' => ['int', 'optlist'=>'string'], -'PDFlib::create_pvf' => ['bool', 'filename'=>'string', 'data'=>'string', 'optlist'=>'string'], -'PDFlib::create_textflow' => ['int', 'text'=>'string', 'optlist'=>'string'], -'PDFlib::curveto' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], -'PDFlib::define_layer' => ['int', 'name'=>'string', 'optlist'=>'string'], -'PDFlib::delete' => ['bool'], -'PDFlib::delete_pvf' => ['int', 'filename'=>'string'], -'PDFlib::delete_table' => ['bool', 'table'=>'int', 'optlist'=>'string'], -'PDFlib::delete_textflow' => ['bool', 'textflow'=>'int'], -'PDFlib::encoding_set_char' => ['bool', 'encoding'=>'string', 'slot'=>'int', 'glyphname'=>'string', 'uv'=>'int'], -'PDFlib::end_document' => ['bool', 'optlist'=>'string'], -'PDFlib::end_font' => ['bool'], -'PDFlib::end_glyph' => ['bool'], -'PDFlib::end_item' => ['bool', 'id'=>'int'], -'PDFlib::end_layer' => ['bool'], -'PDFlib::end_page' => ['bool', 'p'=>''], -'PDFlib::end_page_ext' => ['bool', 'optlist'=>'string'], -'PDFlib::end_pattern' => ['bool', 'p'=>''], -'PDFlib::end_template' => ['bool', 'p'=>''], -'PDFlib::endpath' => ['bool', 'p'=>''], -'PDFlib::fill' => ['bool'], -'PDFlib::fill_imageblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'image'=>'int', 'optlist'=>'string'], -'PDFlib::fill_pdfblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'contents'=>'int', 'optlist'=>'string'], -'PDFlib::fill_stroke' => ['bool'], -'PDFlib::fill_textblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'text'=>'string', 'optlist'=>'string'], -'PDFlib::findfont' => ['int', 'fontname'=>'string', 'encoding'=>'string', 'embed'=>'int'], -'PDFlib::fit_image' => ['bool', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], -'PDFlib::fit_pdi_page' => ['bool', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], -'PDFlib::fit_table' => ['string', 'table'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], -'PDFlib::fit_textflow' => ['string', 'textflow'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], -'PDFlib::fit_textline' => ['bool', 'text'=>'string', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], -'PDFlib::get_apiname' => ['string'], -'PDFlib::get_buffer' => ['string'], -'PDFlib::get_errmsg' => ['string'], -'PDFlib::get_errnum' => ['int'], -'PDFlib::get_majorversion' => ['int'], -'PDFlib::get_minorversion' => ['int'], -'PDFlib::get_parameter' => ['string', 'key'=>'string', 'modifier'=>'float'], -'PDFlib::get_pdi_parameter' => ['string', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], -'PDFlib::get_pdi_value' => ['float', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], -'PDFlib::get_value' => ['float', 'key'=>'string', 'modifier'=>'float'], -'PDFlib::info_font' => ['float', 'font'=>'int', 'keyword'=>'string', 'optlist'=>'string'], -'PDFlib::info_matchbox' => ['float', 'boxname'=>'string', 'num'=>'int', 'keyword'=>'string'], -'PDFlib::info_table' => ['float', 'table'=>'int', 'keyword'=>'string'], -'PDFlib::info_textflow' => ['float', 'textflow'=>'int', 'keyword'=>'string'], -'PDFlib::info_textline' => ['float', 'text'=>'string', 'keyword'=>'string', 'optlist'=>'string'], -'PDFlib::initgraphics' => ['bool'], -'PDFlib::lineto' => ['bool', 'x'=>'float', 'y'=>'float'], -'PDFlib::load_3ddata' => ['int', 'filename'=>'string', 'optlist'=>'string'], -'PDFlib::load_font' => ['int', 'fontname'=>'string', 'encoding'=>'string', 'optlist'=>'string'], -'PDFlib::load_iccprofile' => ['int', 'profilename'=>'string', 'optlist'=>'string'], -'PDFlib::load_image' => ['int', 'imagetype'=>'string', 'filename'=>'string', 'optlist'=>'string'], -'PDFlib::makespotcolor' => ['int', 'spotname'=>'string'], -'PDFlib::moveto' => ['bool', 'x'=>'float', 'y'=>'float'], -'PDFlib::open_ccitt' => ['int', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'BitReverse'=>'int', 'k'=>'int', 'Blackls1'=>'int'], -'PDFlib::open_file' => ['bool', 'filename'=>'string'], -'PDFlib::open_image' => ['int', 'imagetype'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], -'PDFlib::open_image_file' => ['int', 'imagetype'=>'string', 'filename'=>'string', 'stringparam'=>'string', 'intparam'=>'int'], -'PDFlib::open_memory_image' => ['int', 'image'=>'resource'], -'PDFlib::open_pdi' => ['int', 'filename'=>'string', 'optlist'=>'string', 'length'=>'int'], -'PDFlib::open_pdi_document' => ['int', 'filename'=>'string', 'optlist'=>'string'], -'PDFlib::open_pdi_page' => ['int', 'doc'=>'int', 'pagenumber'=>'int', 'optlist'=>'string'], -'PDFlib::pcos_get_number' => ['float', 'doc'=>'int', 'path'=>'string'], -'PDFlib::pcos_get_stream' => ['string', 'doc'=>'int', 'optlist'=>'string', 'path'=>'string'], -'PDFlib::pcos_get_string' => ['string', 'doc'=>'int', 'path'=>'string'], -'PDFlib::place_image' => ['bool', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], -'PDFlib::place_pdi_page' => ['bool', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'sx'=>'float', 'sy'=>'float'], -'PDFlib::process_pdi' => ['int', 'doc'=>'int', 'page'=>'int', 'optlist'=>'string'], -'PDFlib::rect' => ['bool', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], -'PDFlib::restore' => ['bool', 'p'=>''], -'PDFlib::resume_page' => ['bool', 'optlist'=>'string'], -'PDFlib::rotate' => ['bool', 'phi'=>'float'], -'PDFlib::save' => ['bool', 'p'=>''], -'PDFlib::scale' => ['bool', 'sx'=>'float', 'sy'=>'float'], -'PDFlib::set_border_color' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'PDFlib::set_border_dash' => ['bool', 'black'=>'float', 'white'=>'float'], -'PDFlib::set_border_style' => ['bool', 'style'=>'string', 'width'=>'float'], -'PDFlib::set_gstate' => ['bool', 'gstate'=>'int'], -'PDFlib::set_info' => ['bool', 'key'=>'string', 'value'=>'string'], -'PDFlib::set_layer_dependency' => ['bool', 'type'=>'string', 'optlist'=>'string'], -'PDFlib::set_parameter' => ['bool', 'key'=>'string', 'value'=>'string'], -'PDFlib::set_text_pos' => ['bool', 'x'=>'float', 'y'=>'float'], -'PDFlib::set_value' => ['bool', 'key'=>'string', 'value'=>'float'], -'PDFlib::setcolor' => ['bool', 'fstype'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], -'PDFlib::setdash' => ['bool', 'b'=>'float', 'w'=>'float'], -'PDFlib::setdashpattern' => ['bool', 'optlist'=>'string'], -'PDFlib::setflat' => ['bool', 'flatness'=>'float'], -'PDFlib::setfont' => ['bool', 'font'=>'int', 'fontsize'=>'float'], -'PDFlib::setgray' => ['bool', 'g'=>'float'], -'PDFlib::setgray_fill' => ['bool', 'g'=>'float'], -'PDFlib::setgray_stroke' => ['bool', 'g'=>'float'], -'PDFlib::setlinecap' => ['bool', 'linecap'=>'int'], -'PDFlib::setlinejoin' => ['bool', 'value'=>'int'], -'PDFlib::setlinewidth' => ['bool', 'width'=>'float'], -'PDFlib::setmatrix' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], -'PDFlib::setmiterlimit' => ['bool', 'miter'=>'float'], -'PDFlib::setrgbcolor' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'PDFlib::setrgbcolor_fill' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'PDFlib::setrgbcolor_stroke' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'PDFlib::shading' => ['int', 'shtype'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], -'PDFlib::shading_pattern' => ['int', 'shading'=>'int', 'optlist'=>'string'], -'PDFlib::shfill' => ['bool', 'shading'=>'int'], -'PDFlib::show' => ['bool', 'text'=>'string'], -'PDFlib::show_boxed' => ['int', 'text'=>'string', 'left'=>'float', 'top'=>'float', 'width'=>'float', 'height'=>'float', 'mode'=>'string', 'feature'=>'string'], -'PDFlib::show_xy' => ['bool', 'text'=>'string', 'x'=>'float', 'y'=>'float'], -'PDFlib::skew' => ['bool', 'alpha'=>'float', 'beta'=>'float'], -'PDFlib::stringwidth' => ['float', 'text'=>'string', 'font'=>'int', 'fontsize'=>'float'], -'PDFlib::stroke' => ['bool', 'p'=>''], -'PDFlib::suspend_page' => ['bool', 'optlist'=>'string'], -'PDFlib::translate' => ['bool', 'tx'=>'float', 'ty'=>'float'], -'PDFlib::utf16_to_utf8' => ['string', 'utf16string'=>'string'], -'PDFlib::utf32_to_utf16' => ['string', 'utf32string'=>'string', 'ordering'=>'string'], -'PDFlib::utf8_to_utf16' => ['string', 'utf8string'=>'string', 'ordering'=>'string'], -'PDO::__construct' => ['void', 'dsn'=>'string', 'username='=>'?string', 'passwd='=>'?string', 'options='=>'?array'], -'PDO::__sleep' => ['list'], -'PDO::__wakeup' => ['void'], -'PDO::beginTransaction' => ['bool'], -'PDO::commit' => ['bool'], -'PDO::cubrid_schema' => ['array', 'schema_type'=>'int', 'table_name='=>'string', 'col_name='=>'string'], -'PDO::errorCode' => ['?string'], -'PDO::errorInfo' => ['array{0: ?string, 1: ?int, 2: ?string, 3?: mixed, 4?: mixed}'], -'PDO::exec' => ['int|false', 'query'=>'string'], -'PDO::getAttribute' => ['', 'attribute'=>'int'], -'PDO::getAvailableDrivers' => ['array'], -'PDO::inTransaction' => ['bool'], -'PDO::lastInsertId' => ['string', 'name='=>'string|null'], -'PDO::pgsqlCopyFromArray' => ['bool', 'table_name'=>'string', 'rows'=>'array', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], -'PDO::pgsqlCopyFromFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], -'PDO::pgsqlCopyToArray' => ['array', 'table_name'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], -'PDO::pgsqlCopyToFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], -'PDO::pgsqlGetNotify' => ['array{message:string,pid:int,payload?:string}|false', 'result_type='=>'PDO::FETCH_*', 'ms_timeout='=>'int'], -'PDO::pgsqlGetPid' => ['int'], -'PDO::pgsqlLOBCreate' => ['string'], -'PDO::pgsqlLOBOpen' => ['resource', 'oid'=>'string', 'mode='=>'string'], -'PDO::pgsqlLOBUnlink' => ['bool', 'oid'=>'string'], -'PDO::prepare' => ['PDOStatement|false', 'statement'=>'string', 'options='=>'array'], -'PDO::query' => ['PDOStatement|false', 'sql'=>'string'], -'PDO::query\'1' => ['PDOStatement|false', 'sql'=>'string', 'fetch_column'=>'int', 'colno='=>'int'], -'PDO::query\'2' => ['PDOStatement|false', 'sql'=>'string', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs'=>'array'], -'PDO::query\'3' => ['PDOStatement|false', 'sql'=>'string', 'fetch_into'=>'int', 'object'=>'object'], -'PDO::quote' => ['string|false', 'string'=>'string', 'paramtype='=>'int'], -'PDO::rollBack' => ['bool'], -'PDO::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>''], -'PDO::sqliteCreateAggregate' => ['bool', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], -'PDO::sqliteCreateCollation' => ['bool', 'name'=>'string', 'callback'=>'callable'], -'PDO::sqliteCreateFunction' => ['bool', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], -'pdo_drivers' => ['array'], -'PDOException::getCode' => ['int|string'], -'PDOException::getFile' => ['string'], -'PDOException::getLine' => ['int'], -'PDOException::getMessage' => ['string'], -'PDOException::getPrevious' => ['?Throwable'], -'PDOException::getTrace' => ['list\',args?:array}>'], -'PDOException::getTraceAsString' => ['string'], -'PDOStatement::__sleep' => ['list'], -'PDOStatement::__wakeup' => ['void'], -'PDOStatement::bindColumn' => ['bool', 'column'=>'mixed', '&rw_var'=>'mixed', 'type='=>'int', 'maxLength='=>'int', 'driverOptions='=>'mixed'], -'PDOStatement::bindParam' => ['bool', 'param,'=>'string|int', '&rw_var'=>'mixed', 'type='=>'int', 'maxLength='=>'int', 'driverOptions='=>'mixed'], -'PDOStatement::bindValue' => ['bool', 'param'=>'string|int', 'value'=>'mixed', 'type='=>'int'], -'PDOStatement::closeCursor' => ['bool'], -'PDOStatement::columnCount' => ['int'], -'PDOStatement::debugDumpParams' => ['bool|null'], -'PDOStatement::errorCode' => ['string|null'], -'PDOStatement::errorInfo' => ['array{0: ?string, 1: ?int, 2: ?string, 3?: mixed, 4?: mixed}'], -'PDOStatement::execute' => ['bool', 'params='=>'?array'], -'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', 'ctorArgs='=>'?array'], -'PDOStatement::getAttribute' => ['mixed', 'attribute'=>'int'], -'PDOStatement::getColumnMeta' => ['array|false', 'column'=>'int'], -'PDOStatement::nextRowset' => ['bool'], -'PDOStatement::rowCount' => ['int'], -'PDOStatement::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>'mixed'], -'PDOStatement::setFetchMode' => ['bool', 'mode'=>'int', '...args='=> 'mixed'], -'pfsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float'], -'pg_affected_rows' => ['int', 'result'=>'\PgSql\Result'], -'pg_cancel_query' => ['bool', 'connection'=>'\PgSql\Connection'], -'pg_client_encoding' => ['string', 'connection='=>'\PgSql\Connection'], -'pg_close' => ['bool', 'connection='=>'\PgSql\Connection'], -'pg_connect' => ['\PgSql\Connection|false', 'connection_string'=>'string', 'flags='=>'int'], -'pg_connect_poll' => ['int', 'connection'=>'\PgSql\Connection'], -'pg_connection_busy' => ['bool', 'connection'=>'\PgSql\Connection'], -'pg_connection_reset' => ['bool', 'connection'=>'\PgSql\Connection'], -'pg_connection_status' => ['int', 'connection'=>'\PgSql\Connection'], -'pg_consume_input' => ['bool', 'connection'=>'\PgSql\Connection'], -'pg_convert' => ['array|false', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'values'=>'array', 'flags='=>'int'], -'pg_copy_from' => ['bool', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'rows'=>'array', 'separator='=>'string', 'null_as='=>'string'], -'pg_copy_to' => ['array|false', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'separator='=>'string', 'null_as='=>'string'], -'pg_dbname' => ['string', 'connection='=>'\PgSql\Connection'], -'pg_delete' => ['string|bool', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'conditions'=>'array', 'flags='=>'int'], -'pg_end_copy' => ['bool', 'connection='=>'\PgSql\Connection'], -'pg_escape_bytea' => ['string', 'connection'=>'\PgSql\Connection', 'string'=>'string'], -'pg_escape_bytea\'1' => ['string', 'connection'=>'string'], -'pg_escape_identifier' => ['string|false', 'connection'=>'\PgSql\Connection', 'string'=>'string'], -'pg_escape_identifier\'1' => ['string|false', 'connection'=>'string'], -'pg_escape_literal' => ['string|false', 'connection'=>'\PgSql\Connection', 'string'=>'string'], -'pg_escape_literal\'1' => ['string|false', 'connection'=>'string'], -'pg_escape_string' => ['string', 'connection'=>'\PgSql\Connection', 'string'=>'string'], -'pg_escape_string\'1' => ['string', 'connection'=>'string'], -'pg_exec' => ['\PgSql\Result|false', 'connection'=>'\PgSql\Connection', 'query'=>'string'], -'pg_execute' => ['\PgSql\Result|false', 'connection'=>'\PgSql\Connection', 'statement_name'=>'string', 'params'=>'array'], -'pg_execute\'1' => ['\PgSql\Result|false', 'connection'=>'string', 'statement_name'=>'array'], -'pg_fetch_all' => ['array', 'result'=>'\PgSql\Result', 'result_type='=>'int'], -'pg_fetch_all_columns' => ['array', 'result'=>'\PgSql\Result', 'field='=>'int'], -'pg_fetch_array' => ['array|false', 'result'=>'\PgSql\Result', 'row='=>'?int', 'mode='=>'int'], -'pg_fetch_assoc' => ['array|false', 'result'=>'\PgSql\Result', 'row='=>'?int'], -'pg_fetch_object' => ['object|false', 'result'=>'\PgSql\Result', 'row='=>'?int', 'class='=>'string', 'constructor_args='=>'array'], -'pg_fetch_result' => ['string|false|null', 'result'=>'\PgSql\Result', 'row'=>'string|int'], -'pg_fetch_result\'1' => ['string|false|null', 'result'=>'\PgSql\Result', 'row'=>'?int', 'field'=>'string|int'], -'pg_fetch_row' => ['array|false', 'result'=>'\PgSql\Result', 'row='=>'?int', 'mode='=>'int'], -'pg_field_is_null' => ['int|false', 'result'=>'\PgSql\Result', 'row'=>'string|int'], -'pg_field_is_null\'1' => ['int|false', 'result'=>'\PgSql\Result', 'row'=>'int', 'field'=>'string|int'], -'pg_field_name' => ['string', 'result'=>'\PgSql\Result', 'field'=>'int'], -'pg_field_num' => ['int', 'result'=>'\PgSql\Result', 'field'=>'string'], -'pg_field_prtlen' => ['int|false', 'result'=>'\PgSql\Result', 'row'=>'string|int'], -'pg_field_prtlen\'1' => ['int|false', 'result'=>'\PgSql\Result', 'row'=>'int', 'field'=>'string|int'], -'pg_field_size' => ['int', 'result'=>'\PgSql\Result', 'field'=>'int'], -'pg_field_table' => ['string|int|false', 'result'=>'\PgSql\Result', 'field'=>'int', 'oid_only='=>'bool'], -'pg_field_type' => ['string', 'result'=>'\PgSql\Result', 'field'=>'int'], -'pg_field_type_oid' => ['int|string', 'result'=>'\PgSql\Result', 'field'=>'int'], -'pg_flush' => ['int|bool', 'connection'=>'\PgSql\Connection'], -'pg_free_result' => ['bool', 'result'=>'\PgSql\Result'], -'pg_get_notify' => ['array|false', 'result'=>'\PgSql\Result', 'mode='=>'int'], -'pg_get_pid' => ['int', 'connection'=>'\PgSql\Connection'], -'pg_get_result' => ['\PgSql\Result|false', 'connection='=>'\PgSql\Connection'], -'pg_host' => ['string', 'connection='=>'\PgSql\Connection'], -'pg_insert' => ['\PgSql\Result|string|false', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'values'=>'array', 'flags='=>'int'], -'pg_last_error' => ['string', 'connection='=>'\PgSql\Connection', 'operation='=>'int'], -'pg_last_notice' => ['string|array|bool', 'connection'=>'\PgSql\Connection', 'mode='=>'int'], -'pg_last_oid' => ['string|int|false', 'result'=>'\PgSql\Result'], -'pg_lo_close' => ['bool', 'lob'=>'\PgSql\Lob'], -'pg_lo_create' => ['int|string|false', 'connection='=>'\PgSql\Connection', 'oid='=>'int|string'], -'pg_lo_export' => ['bool', 'connection'=>'\PgSql\Connection', 'oid'=>'int|string', 'filename'=>'string'], -'pg_lo_export\'1' => ['bool', 'connection'=>'int|string', 'oid'=>'string'], -'pg_lo_import' => ['int|string|false', 'connection'=>'\PgSql\Connection', 'filename'=>'string', 'oid'=>'string|int'], -'pg_lo_import\'1' => ['int|string|false', 'connection'=>'string', 'filename'=>'string|int'], -'pg_lo_open' => ['\PgSql\Lob|false', 'connection'=>'\PgSql\Connection', 'oid'=>'int|string', 'mode'=>'string'], -'pg_lo_open\'1' => ['\PgSql\Lob|false', 'connection'=>'int|string', 'oid'=>'string'], -'pg_lo_read' => ['string|false', 'lob'=>'\PgSql\Lob', 'length='=>'int'], -'pg_lo_read_all' => ['int', 'lob'=>'\PgSql\Lob'], -'pg_lo_seek' => ['bool', 'lob'=>'\PgSql\Lob', 'offset'=>'int', 'whence='=>'int'], -'pg_lo_tell' => ['int', 'lob'=>'\PgSql\Lob'], -'pg_lo_truncate' => ['bool', 'lob'=>'\PgSql\Lob', 'size'=>'int'], -'pg_lo_unlink' => ['bool', 'connection'=>'\PgSql\Connection', 'oid'=>'int|string'], -'pg_lo_unlink\'1' => ['bool', 'connection'=>'int|string'], -'pg_lo_write' => ['int|false', 'lob'=>'\PgSql\Lob', 'data'=>'string', 'length='=>'int'], -'pg_meta_data' => ['array|false', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'extended='=>'bool'], -'pg_num_fields' => ['int', 'result'=>'\PgSql\Result'], -'pg_num_rows' => ['int', 'result'=>'\PgSql\Result'], -'pg_options' => ['string', 'connection='=>'\PgSql\Connection'], -'pg_parameter_status' => ['string|false', 'connection'=>'\PgSql\Connection', 'name'=>'string'], -'pg_parameter_status\'1' => ['string|false', 'connection'=>'string'], -'pg_pconnect' => ['\PgSql\Connection|false', 'connection_string'=>'string', 'flags='=>'string', 'port='=>'string|int', 'options='=>'string', 'tty='=>'string', 'database='=>'string'], -'pg_ping' => ['bool', 'connection='=>'\PgSql\Connection'], -'pg_port' => ['int', 'connection='=>'\PgSql\Connection'], -'pg_prepare' => ['\PgSql\Result|false', 'connection'=>'\PgSql\Connection', 'statement_name'=>'string', 'query'=>'string'], -'pg_prepare\'1' => ['\PgSql\Result|false', 'connection'=>'string', 'statement_name'=>'string'], -'pg_put_line' => ['bool', 'connection'=>'\PgSql\Connection', 'data'=>'string'], -'pg_put_line\'1' => ['bool', 'connection'=>'string'], -'pg_query' => ['\PgSql\Result|false', 'connection'=>'\PgSql\Connection', 'query'=>'string'], -'pg_query\'1' => ['\PgSql\Result|false', 'connection'=>'string'], -'pg_query_params' => ['\PgSql\Result|false', 'connection'=>'\PgSql\Connection', 'query'=>'string', 'params'=>'array'], -'pg_query_params\'1' => ['\PgSql\Result|false', 'connection'=>'string', 'query'=>'array'], -'pg_result_error' => ['string|false', 'result'=>'\PgSql\Result'], -'pg_result_error_field' => ['string|false|null', 'result'=>'\PgSql\Result', 'field_code'=>'int'], -'pg_result_seek' => ['bool', 'result'=>'\PgSql\Result', 'row'=>'int'], -'pg_result_status' => ['string|int', 'result'=>'\PgSql\Result', 'mode='=>'int'], -'pg_select' => ['string|array|false', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'assoc_array'=>'array', 'options='=>'int', 'result_type='=>'int'], -'pg_send_execute' => ['bool|int', 'connection'=>'\PgSql\Connection', 'query'=>'string', 'params'=>'array'], -'pg_send_prepare' => ['bool|int', 'connection'=>'\PgSql\Connection', 'statement_name'=>'string', 'query'=>'string'], -'pg_send_query' => ['bool|int', 'connection'=>'\PgSql\Connection', 'query'=>'string'], -'pg_send_query_params' => ['bool|int', 'connection'=>'\PgSql\Connection', 'query'=>'string', 'params'=>'array'], -'pg_set_client_encoding' => ['int', 'connection'=>'\PgSql\Connection', 'encoding'=>'string'], -'pg_set_client_encoding\'1' => ['int', 'connection'=>'string'], -'pg_set_error_verbosity' => ['int|false', 'connection'=>'\PgSql\Connection', 'verbosity'=>'int'], -'pg_set_error_verbosity\'1' => ['int|false', 'connection'=>'int'], -'pg_socket' => ['resource|false', 'connection'=>'\PgSql\Connection'], -'pg_trace' => ['bool', 'filename'=>'string', 'mode='=>'string', 'connection='=>'\PgSql\Connection'], -'pg_transaction_status' => ['int', 'connection'=>'\PgSql\Connection'], -'pg_tty' => ['string', 'connection='=>'\PgSql\Connection'], -'pg_unescape_bytea' => ['string', 'string'=>'string'], -'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::apiVersion' => ['string'], -'Phar::buildFromDirectory' => ['array', 'base_dir'=>'string', 'regex='=>'string'], -'Phar::buildFromIterator' => ['array', 'iter'=>'Iterator', 'base_directory='=>'string'], -'Phar::canCompress' => ['bool', 'method='=>'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::decompress' => ['Phar', 'extension='=>'string'], -'Phar::decompressFiles' => ['bool'], -'Phar::delete' => ['bool', 'entry'=>'string'], -'Phar::delMetadata' => ['bool'], -'Phar::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'], -'Phar::getAlias' => ['string'], -'Phar::getMetadata' => ['mixed', 'unserializeOptions='=>'array'], -'Phar::getModified' => ['bool'], -'Phar::getPath' => ['string'], -'Phar::getSignature' => ['array{hash:string, hash_type:string}'], -'Phar::getStub' => ['string'], -'Phar::getSupportedCompression' => ['array'], -'Phar::getSupportedSignatures' => ['array'], -'Phar::getVersion' => ['string'], -'Phar::hasMetadata' => ['bool'], -'Phar::interceptFileFuncs' => ['void'], -'Phar::isBuffering' => ['bool'], -'Phar::isCompressed' => ['mixed|false'], -'Phar::isFileFormat' => ['bool', 'format'=>'int'], -'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::setAlias' => ['bool', 'alias'=>'string'], -'Phar::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], -'Phar::setMetadata' => ['void', 'metadata'=>''], -'Phar::setSignatureAlgorithm' => ['void', 'sigtype'=>'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'], -'PharData::compress' => ['PharData', 'compression'=>'int', 'extension='=>'string'], -'PharData::compressFiles' => ['bool', '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::decompress' => ['PharData', 'extension='=>'string'], -'PharData::decompressFiles' => ['bool'], -'PharData::delete' => ['bool', 'entry'=>'string'], -'PharData::delMetadata' => ['bool'], -'PharData::extractTo' => ['bool', 'pathto'=>'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::setAlias' => ['bool', 'alias'=>'string'], -'PharData::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], -'phardata::setMetadata' => ['void', 'metadata'=>'mixed'], -'phardata::setSignatureAlgorithm' => ['void', 'sigtype'=>'int'], -'PharData::setStub' => ['bool', 'stub'=>'string', 'length='=>'int'], -'PharFileInfo::__construct' => ['void', 'entry'=>'string'], -'PharFileInfo::chmod' => ['void', 'permissions'=>'int'], -'PharFileInfo::compress' => ['bool', 'compression'=>'int'], -'PharFileInfo::decompress' => ['bool'], -'PharFileInfo::delMetadata' => ['bool'], -'PharFileInfo::getCompressedSize' => ['int'], -'PharFileInfo::getContent' => ['string'], -'PharFileInfo::getCRC32' => ['int'], -'PharFileInfo::getMetadata' => ['mixed', 'unserializeOptions='=>'array'], -'PharFileInfo::getPharFlags' => ['int'], -'PharFileInfo::hasMetadata' => ['bool'], -'PharFileInfo::isCompressed' => ['bool', 'compression_type='=>'int'], -'PharFileInfo::isCompressedBZIP2' => ['bool'], -'PharFileInfo::isCompressedGZ' => ['bool'], -'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'], -'phdfs::copy' => ['bool', 'source_file'=>'string', 'destination_file'=>'string'], -'phdfs::create_directory' => ['bool', 'path'=>'string'], -'phdfs::delete' => ['bool', 'path'=>'string'], -'phdfs::disconnect' => ['bool'], -'phdfs::exists' => ['bool', 'path'=>'string'], -'phdfs::file_info' => ['array', 'path'=>'string'], -'phdfs::list_directory' => ['array', 'path'=>'string'], -'phdfs::read' => ['string', 'path'=>'string', 'length='=>'string'], -'phdfs::rename' => ['bool', 'old_path'=>'string', 'new_path'=>'string'], -'phdfs::tell' => ['int', 'path'=>'string'], -'phdfs::write' => ['bool', 'path'=>'string', 'buffer'=>'string', 'mode='=>'string'], -'php_check_syntax' => ['bool', 'filename'=>'string', 'error_message='=>'string'], -'php_ini_loaded_file' => ['string|false'], -'php_ini_scanned_files' => ['string|false'], -'php_logo_guid' => ['string'], -'php_sapi_name' => ['string'], -'php_strip_whitespace' => ['string', 'filename'=>'string'], -'php_uname' => ['string', 'mode='=>'string'], -'php_user_filter::filter' => ['int', 'in'=>'resource', 'out'=>'resource', '&rw_consumed'=>'int', 'closing'=>'bool'], -'php_user_filter::onClose' => ['void'], -'php_user_filter::onCreate' => ['bool'], -'phpcredits' => ['bool', 'flags='=>'int'], -'phpdbg_break_file' => ['void', 'file'=>'string', 'line'=>'int'], -'phpdbg_break_function' => ['void', 'function'=>'string'], -'phpdbg_break_method' => ['void', 'class'=>'string', 'method'=>'string'], -'phpdbg_break_next' => ['void'], -'phpdbg_clear' => ['void'], -'phpdbg_color' => ['void', 'element'=>'int', 'color'=>'string'], -'phpdbg_end_oplog' => ['array', 'options='=>'array'], -'phpdbg_exec' => ['mixed', 'context='=>'string'], -'phpdbg_get_executable' => ['array', 'options='=>'array'], -'phpdbg_prompt' => ['void', 'string'=>'string'], -'phpdbg_start_oplog' => ['void'], -'phpinfo' => ['bool', 'flags='=>'int'], -'PhpToken::tokenize' => ['list', 'code'=>'string', 'flags='=>'int'], -'PhpToken::is' => ['bool', 'kind'=>'string|int|string[]|int[]'], -'PhpToken::isIgnorable' => ['bool'], -'PhpToken::getTokenName' => ['string'], -'phpversion' => ['string|false', 'extension='=>'string'], -'pht\AtomicInteger::__construct' => ['void', 'value='=>'int'], -'pht\AtomicInteger::dec' => ['void'], -'pht\AtomicInteger::get' => ['int'], -'pht\AtomicInteger::inc' => ['void'], -'pht\AtomicInteger::lock' => ['void'], -'pht\AtomicInteger::set' => ['void', 'value'=>'int'], -'pht\AtomicInteger::unlock' => ['void'], -'pht\HashTable::lock' => ['void'], -'pht\HashTable::size' => ['int'], -'pht\HashTable::unlock' => ['void'], -'pht\Queue::front' => ['mixed'], -'pht\Queue::lock' => ['void'], -'pht\Queue::pop' => ['mixed'], -'pht\Queue::push' => ['void', 'value'=>'mixed'], -'pht\Queue::size' => ['int'], -'pht\Queue::unlock' => ['void'], -'pht\Runnable::run' => ['void'], -'pht\thread::addClassTask' => ['void', 'className'=>'string', '...ctorArgs='=>'mixed'], -'pht\thread::addFileTask' => ['void', 'fileName'=>'string', '...globals='=>'mixed'], -'pht\thread::addFunctionTask' => ['void', 'func'=>'callable', '...funcArgs='=>'mixed'], -'pht\thread::join' => ['void'], -'pht\thread::start' => ['void'], -'pht\thread::taskCount' => ['int'], -'pht\threaded::lock' => ['void'], -'pht\threaded::unlock' => ['void'], -'pht\Vector::__construct' => ['void', 'size='=>'int', 'value='=>'mixed'], -'pht\Vector::deleteAt' => ['void', 'offset'=>'int'], -'pht\Vector::insertAt' => ['void', 'value'=>'mixed', 'offset'=>'int'], -'pht\Vector::lock' => ['void'], -'pht\Vector::pop' => ['mixed'], -'pht\Vector::push' => ['void', 'value'=>'mixed'], -'pht\Vector::resize' => ['void', 'size'=>'int', 'value='=>'mixed'], -'pht\Vector::shift' => ['mixed'], -'pht\Vector::size' => ['int'], -'pht\Vector::unlock' => ['void'], -'pht\Vector::unshift' => ['void', 'value'=>'mixed'], -'pht\Vector::updateAt' => ['void', 'value'=>'mixed', 'offset'=>'int'], -'pi' => ['float'], -'pointObj::__construct' => ['void'], -'pointObj::distanceToLine' => ['float', 'p1'=>'pointObj', 'p2'=>'pointObj'], -'pointObj::distanceToPoint' => ['float', 'poPoint'=>'pointObj'], -'pointObj::distanceToShape' => ['float', 'shape'=>'shapeObj'], -'pointObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'], -'pointObj::ms_newPointObj' => ['pointObj'], -'pointObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], -'pointObj::setXY' => ['int', 'x'=>'float', 'y'=>'float', 'm'=>'float'], -'pointObj::setXYZ' => ['int', 'x'=>'float', 'y'=>'float', 'z'=>'float', 'm'=>'float'], -'Pool::__construct' => ['void', 'size'=>'int', 'class'=>'string', 'ctor='=>'array'], -'Pool::collect' => ['int', 'collector='=>'Callable'], -'Pool::resize' => ['void', 'size'=>'int'], -'Pool::shutdown' => ['void'], -'Pool::submit' => ['int', 'task'=>'Threaded'], -'Pool::submitTo' => ['int', 'worker'=>'int', 'task'=>'Threaded'], -'popen' => ['resource|false', 'command'=>'string', 'mode'=>'string'], -'pos' => ['mixed', 'array'=>'array'], -'posix_access' => ['bool', 'filename'=>'string', 'flags='=>'int'], -'posix_ctermid' => ['string|false'], -'posix_errno' => ['int'], -'posix_get_last_error' => ['int'], -'posix_getcwd' => ['string|false'], -'posix_getegid' => ['int'], -'posix_geteuid' => ['int'], -'posix_getgid' => ['int'], -'posix_getgrgid' => ['array{name: string, passwd: string, gid: int, members: list}|false', 'group_id'=>'int'], -'posix_getgrnam' => ['array{name: string, passwd: string, gid: int, members: list}|false', 'name'=>'string'], -'posix_getgroups' => ['list|false'], -'posix_getlogin' => ['string|false'], -'posix_getpgid' => ['int|false', 'process_id'=>'int'], -'posix_getpgrp' => ['int'], -'posix_getpid' => ['int'], -'posix_getppid' => ['int'], -'posix_getpwnam' => ['array{name: string, passwd: string, uid: int, gid: int, gecos: string, dir: string, shell: string}|false', 'username'=>'string'], -'posix_getpwuid' => ['array{name: string, passwd: string, uid: int, gid: int, gecos: string, dir: string, shell: string}|false', 'user_id'=>'int'], -'posix_getrlimit' => ['array{"soft core": string, "hard core": string, "soft data": string, "hard data": string, "soft stack": integer, "hard stack": string, "soft totalmem": string, "hard totalmem": string, "soft rss": string, "hard rss": string, "soft maxproc": integer, "hard maxproc": integer, "soft memlock": integer, "hard memlock": integer, "soft cpu": string, "hard cpu": string, "soft filesize": string, "hard filesize": string, "soft openfiles": integer, "hard openfiles": integer}|false'], -'posix_getsid' => ['int|false', 'process_id'=>'int'], -'posix_getuid' => ['int'], -'posix_initgroups' => ['bool', 'username'=>'string', 'group_id'=>'int'], -'posix_isatty' => ['bool', 'file_descriptor'=>'resource|int'], -'posix_kill' => ['bool', 'process_id'=>'int', 'signal'=>'int'], -'posix_mkfifo' => ['bool', 'filename'=>'string', 'permissions'=>'int'], -'posix_mknod' => ['bool', 'filename'=>'string', 'flags'=>'int', 'major='=>'int', 'minor='=>'int'], -'posix_setegid' => ['bool', 'group_id'=>'int'], -'posix_seteuid' => ['bool', 'user_id'=>'int'], -'posix_setgid' => ['bool', 'group_id'=>'int'], -'posix_setpgid' => ['bool', 'process_id'=>'int', 'process_group_id'=>'int'], -'posix_setrlimit' => ['bool', 'resource'=>'int', 'soft_limit'=>'int', 'hard_limit'=>'int'], -'posix_setsid' => ['int'], -'posix_setuid' => ['bool', 'user_id'=>'int'], -'posix_strerror' => ['string', 'error_code'=>'int'], -'posix_times' => ['array{ticks: int, utime: int, stime: int, cutime: int, cstime: int}|false'], -'posix_ttyname' => ['string|false', 'file_descriptor'=>'resource|int'], -'posix_uname' => ['array{sysname: string, nodename: string, release: string, version: string, machine: string, domainname: string}|false'], -'Postal\Expand::expand_address' => ['string[]', 'address'=>'string', 'options='=>'array'], -'Postal\Parser::parse_address' => ['array', 'address'=>'string', 'options='=>'array'], -'pow' => ['float|int', 'num'=>'int|float', 'exponent'=>'int|float'], -'preg_filter' => ['null|string|string[]', 'pattern'=>'mixed', 'replacement'=>'mixed', 'subject'=>'mixed', 'limit='=>'int', '&w_count='=>'int'], -'preg_grep' => ['array|false', 'pattern'=>'string', 'array'=>'array', 'flags='=>'int'], -'preg_last_error' => ['int'], -'preg_match' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'string[]', 'flags='=>'0', 'offset='=>'int'], -'preg_match\'1' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'array', 'flags='=>'int', 'offset='=>'int'], -'preg_match_all' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'array', 'flags='=>'int', 'offset='=>'int'], -'preg_quote' => ['string', 'str'=>'string', 'delimiter='=>'string'], -'preg_replace' => ['string|string[]|null', 'pattern'=>'string|array', 'replacement'=>'string|array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], -'preg_replace_callback' => ['string|null', 'pattern'=>'string|array', 'callback'=>'callable(string[]):string', 'subject'=>'string', 'limit='=>'int', '&w_count='=>'int'], -'preg_replace_callback\'1' => ['string[]|null', 'pattern'=>'string|array', 'callback'=>'callable(string[]):string', 'subject'=>'string[]', 'limit='=>'int', '&w_count='=>'int'], -'preg_replace_callback_array' => ['string|string[]|null', 'pattern'=>'array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], -'preg_split' => ['list|false', 'pattern'=>'string', 'subject'=>'string', 'limit'=>'int', 'flags='=>'null'], -'preg_split\'1' => ['list|list>|false', 'pattern'=>'string', 'subject'=>'string', 'limit='=>'int', 'flags='=>'int'], -'prev' => ['mixed', '&r_array'=>'array|object'], -'print' => ['int', 'arg'=>'string'], -'print_r' => ['string', 'value'=>'mixed'], -'print_r\'1' => ['true', 'value'=>'mixed', 'return='=>'bool'], -'printf' => ['int', 'format'=>'string', '...values='=>'string|int|float'], -'proc_close' => ['int', 'process'=>'resource'], -'proc_get_status' => ['array{command: string, pid: int, running: bool, signaled: bool, stopped: bool, exitcode: int, termsig: int, stopsig: int}', 'process'=>'resource'], -'proc_nice' => ['bool', 'priority'=>'int'], -'proc_open' => ['resource|false', 'command'=>'string|array', 'descriptor_spec'=>'array', '&pipes'=>'resource[]', 'cwd='=>'?string', 'env_vars='=>'?array', 'options='=>'?array'], -'proc_terminate' => ['bool', 'process'=>'resource', 'signal='=>'int'], -'projectionObj::__construct' => ['void', 'projectionString'=>'string'], -'projectionObj::getUnits' => ['int'], -'projectionObj::ms_newProjectionObj' => ['projectionObj', 'projectionString'=>'string'], -'property_exists' => ['bool', 'object_or_class'=>'object|string', 'property'=>'string'], -'ps_add_bookmark' => ['int', 'psdoc'=>'resource', 'text'=>'string', 'parent='=>'int', 'open='=>'int'], -'ps_add_launchlink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], -'ps_add_locallink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'page'=>'int', 'dest'=>'string'], -'ps_add_note' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], -'ps_add_pdflink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], -'ps_add_weblink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'url'=>'string'], -'ps_arc' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'alpha'=>'float', 'beta'=>'float'], -'ps_arcn' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'alpha'=>'float', 'beta'=>'float'], -'ps_begin_page' => ['bool', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float'], -'ps_begin_pattern' => ['int', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], -'ps_begin_template' => ['int', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float'], -'ps_circle' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float'], -'ps_clip' => ['bool', 'psdoc'=>'resource'], -'ps_close' => ['bool', 'psdoc'=>'resource'], -'ps_close_image' => ['void', 'psdoc'=>'resource', 'imageid'=>'int'], -'ps_closepath' => ['bool', 'psdoc'=>'resource'], -'ps_closepath_stroke' => ['bool', 'psdoc'=>'resource'], -'ps_continue_text' => ['bool', 'psdoc'=>'resource', 'text'=>'string'], -'ps_curveto' => ['bool', 'psdoc'=>'resource', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], -'ps_delete' => ['bool', 'psdoc'=>'resource'], -'ps_end_page' => ['bool', 'psdoc'=>'resource'], -'ps_end_pattern' => ['bool', 'psdoc'=>'resource'], -'ps_end_template' => ['bool', 'psdoc'=>'resource'], -'ps_fill' => ['bool', 'psdoc'=>'resource'], -'ps_fill_stroke' => ['bool', 'psdoc'=>'resource'], -'ps_findfont' => ['int', 'psdoc'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'embed='=>'bool'], -'ps_get_buffer' => ['string', 'psdoc'=>'resource'], -'ps_get_parameter' => ['string', 'psdoc'=>'resource', 'name'=>'string', 'modifier='=>'float'], -'ps_get_value' => ['float', 'psdoc'=>'resource', 'name'=>'string', 'modifier='=>'float'], -'ps_hyphenate' => ['array', 'psdoc'=>'resource', 'text'=>'string'], -'ps_include_file' => ['bool', 'psdoc'=>'resource', 'file'=>'string'], -'ps_lineto' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], -'ps_makespotcolor' => ['int', 'psdoc'=>'resource', 'name'=>'string', 'reserved='=>'int'], -'ps_moveto' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], -'ps_new' => ['resource'], -'ps_open_file' => ['bool', 'psdoc'=>'resource', 'filename='=>'string'], -'ps_open_image' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], -'ps_open_image_file' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'filename'=>'string', 'stringparam='=>'string', 'intparam='=>'int'], -'ps_open_memory_image' => ['int', 'psdoc'=>'resource', 'gd'=>'int'], -'ps_place_image' => ['bool', 'psdoc'=>'resource', 'imageid'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], -'ps_rect' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], -'ps_restore' => ['bool', 'psdoc'=>'resource'], -'ps_rotate' => ['bool', 'psdoc'=>'resource', 'rot'=>'float'], -'ps_save' => ['bool', 'psdoc'=>'resource'], -'ps_scale' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], -'ps_set_border_color' => ['bool', 'psdoc'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], -'ps_set_border_dash' => ['bool', 'psdoc'=>'resource', 'black'=>'float', 'white'=>'float'], -'ps_set_border_style' => ['bool', 'psdoc'=>'resource', 'style'=>'string', 'width'=>'float'], -'ps_set_info' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], -'ps_set_parameter' => ['bool', 'psdoc'=>'resource', 'name'=>'string', 'value'=>'string'], -'ps_set_text_pos' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], -'ps_set_value' => ['bool', 'psdoc'=>'resource', 'name'=>'string', 'value'=>'float'], -'ps_setcolor' => ['bool', 'psdoc'=>'resource', 'type'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], -'ps_setdash' => ['bool', 'psdoc'=>'resource', 'on'=>'float', 'off'=>'float'], -'ps_setflat' => ['bool', 'psdoc'=>'resource', 'value'=>'float'], -'ps_setfont' => ['bool', 'psdoc'=>'resource', 'fontid'=>'int', 'size'=>'float'], -'ps_setgray' => ['bool', 'psdoc'=>'resource', 'gray'=>'float'], -'ps_setlinecap' => ['bool', 'psdoc'=>'resource', 'type'=>'int'], -'ps_setlinejoin' => ['bool', 'psdoc'=>'resource', 'type'=>'int'], -'ps_setlinewidth' => ['bool', 'psdoc'=>'resource', 'width'=>'float'], -'ps_setmiterlimit' => ['bool', 'psdoc'=>'resource', 'value'=>'float'], -'ps_setoverprintmode' => ['bool', 'psdoc'=>'resource', 'mode'=>'int'], -'ps_setpolydash' => ['bool', 'psdoc'=>'resource', 'arr'=>'float'], -'ps_shading' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], -'ps_shading_pattern' => ['int', 'psdoc'=>'resource', 'shadingid'=>'int', 'optlist'=>'string'], -'ps_shfill' => ['bool', 'psdoc'=>'resource', 'shadingid'=>'int'], -'ps_show' => ['bool', 'psdoc'=>'resource', 'text'=>'string'], -'ps_show2' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'length'=>'int'], -'ps_show_boxed' => ['int', 'psdoc'=>'resource', 'text'=>'string', 'left'=>'float', 'bottom'=>'float', 'width'=>'float', 'height'=>'float', 'hmode'=>'string', 'feature='=>'string'], -'ps_show_xy' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float'], -'ps_show_xy2' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'length'=>'int', 'xcoor'=>'float', 'ycoor'=>'float'], -'ps_string_geometry' => ['array', 'psdoc'=>'resource', 'text'=>'string', 'fontid='=>'int', 'size='=>'float'], -'ps_stringwidth' => ['float', 'psdoc'=>'resource', 'text'=>'string', 'fontid='=>'int', 'size='=>'float'], -'ps_stroke' => ['bool', 'psdoc'=>'resource'], -'ps_symbol' => ['bool', 'psdoc'=>'resource', 'ord'=>'int'], -'ps_symbol_name' => ['string', 'psdoc'=>'resource', 'ord'=>'int', 'fontid='=>'int'], -'ps_symbol_width' => ['float', 'psdoc'=>'resource', 'ord'=>'int', 'fontid='=>'int', 'size='=>'float'], -'ps_translate' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], -'pspell_add_to_personal' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], -'pspell_add_to_session' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], -'pspell_check' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], -'pspell_clear_session' => ['bool', 'dictionary'=>'PSpell\Dictionary'], -'pspell_config_create' => ['int|false', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string'], -'pspell_config_data_dir' => ['bool', 'config'=>'PSpell\Config', 'directory'=>'string'], -'pspell_config_dict_dir' => ['bool', 'config'=>'PSpell\Config', 'directory'=>'string'], -'pspell_config_ignore' => ['bool', 'config'=>'PSpell\Config', 'min_length'=>'int'], -'pspell_config_mode' => ['bool', 'config'=>'PSpell\Config', 'mode'=>'int'], -'pspell_config_personal' => ['bool', 'config'=>'PSpell\Config', 'filename'=>'string'], -'pspell_config_repl' => ['bool', 'config'=>'PSpell\Config', 'filename'=>'string'], -'pspell_config_runtogether' => ['bool', 'config'=>'PSpell\Config', 'allow'=>'bool'], -'pspell_config_save_repl' => ['bool', 'config'=>'PSpell\Config', 'save'=>'bool'], -'pspell_new' => ['int|false', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string', 'mode='=>'int'], -'pspell_new_config' => ['int|false', 'config'=>'PSpell\Config'], -'pspell_new_personal' => ['int|false', 'filename'=>'string', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string', 'mode='=>'int'], -'pspell_save_wordlist' => ['bool', 'dictionary'=>'PSpell\Dictionary'], -'pspell_store_replacement' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'misspelled'=>'string', 'correct'=>'string'], -'pspell_suggest' => ['array', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], -'putenv' => ['bool', 'assignment'=>'string'], -'px_close' => ['bool', 'pxdoc'=>'resource'], -'px_create_fp' => ['bool', 'pxdoc'=>'resource', 'file'=>'resource', 'fielddesc'=>'array'], -'px_date2string' => ['string', 'pxdoc'=>'resource', 'value'=>'int', 'format'=>'string'], -'px_delete' => ['bool', 'pxdoc'=>'resource'], -'px_delete_record' => ['bool', 'pxdoc'=>'resource', 'num'=>'int'], -'px_get_field' => ['array', 'pxdoc'=>'resource', 'fieldno'=>'int'], -'px_get_info' => ['array', 'pxdoc'=>'resource'], -'px_get_parameter' => ['string', 'pxdoc'=>'resource', 'name'=>'string'], -'px_get_record' => ['array', 'pxdoc'=>'resource', 'num'=>'int', 'mode='=>'int'], -'px_get_schema' => ['array', 'pxdoc'=>'resource', 'mode='=>'int'], -'px_get_value' => ['float', 'pxdoc'=>'resource', 'name'=>'string'], -'px_insert_record' => ['int', 'pxdoc'=>'resource', 'data'=>'array'], -'px_new' => ['resource'], -'px_numfields' => ['int', 'pxdoc'=>'resource'], -'px_numrecords' => ['int', 'pxdoc'=>'resource'], -'px_open_fp' => ['bool', 'pxdoc'=>'resource', 'file'=>'resource'], -'px_put_record' => ['bool', 'pxdoc'=>'resource', 'record'=>'array', 'recpos='=>'int'], -'px_retrieve_record' => ['array', 'pxdoc'=>'resource', 'num'=>'int', 'mode='=>'int'], -'px_set_blob_file' => ['bool', 'pxdoc'=>'resource', 'filename'=>'string'], -'px_set_parameter' => ['bool', 'pxdoc'=>'resource', 'name'=>'string', 'value'=>'string'], -'px_set_tablename' => ['void', 'pxdoc'=>'resource', 'name'=>'string'], -'px_set_targetencoding' => ['bool', 'pxdoc'=>'resource', 'encoding'=>'string'], -'px_set_value' => ['bool', 'pxdoc'=>'resource', 'name'=>'string', 'value'=>'float'], -'px_timestamp2string' => ['string', 'pxdoc'=>'resource', 'value'=>'float', 'format'=>'string'], -'px_update_record' => ['bool', 'pxdoc'=>'resource', 'data'=>'array', 'num'=>'int'], -'qdom_error' => ['string'], -'qdom_tree' => ['QDomDocument', 'doc'=>'string'], -'querymapObj::convertToString' => ['string'], -'querymapObj::free' => ['void'], -'querymapObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'querymapObj::updateFromString' => ['int', 'snippet'=>'string'], -'QuickHashIntHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], -'QuickHashIntHash::add' => ['bool', 'key'=>'int', 'value='=>'int'], -'QuickHashIntHash::delete' => ['bool', 'key'=>'int'], -'QuickHashIntHash::exists' => ['bool', 'key'=>'int'], -'QuickHashIntHash::get' => ['int', 'key'=>'int'], -'QuickHashIntHash::getSize' => ['int'], -'QuickHashIntHash::loadFromFile' => ['QuickHashIntHash', 'filename'=>'string', 'options='=>'int'], -'QuickHashIntHash::loadFromString' => ['QuickHashIntHash', 'contents'=>'string', 'options='=>'int'], -'QuickHashIntHash::saveToFile' => ['void', 'filename'=>'string'], -'QuickHashIntHash::saveToString' => ['string'], -'QuickHashIntHash::set' => ['bool', 'key'=>'int', 'value'=>'int'], -'QuickHashIntHash::update' => ['bool', 'key'=>'int', 'value'=>'int'], -'QuickHashIntSet::__construct' => ['void', 'size'=>'int', 'options='=>'int'], -'QuickHashIntSet::add' => ['bool', 'key'=>'int'], -'QuickHashIntSet::delete' => ['bool', 'key'=>'int'], -'QuickHashIntSet::exists' => ['bool', 'key'=>'int'], -'QuickHashIntSet::getSize' => ['int'], -'QuickHashIntSet::loadFromFile' => ['QuickHashIntSet', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], -'QuickHashIntSet::loadFromString' => ['QuickHashIntSet', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], -'QuickHashIntSet::saveToFile' => ['void', 'filename'=>'string'], -'QuickHashIntSet::saveToString' => ['string'], -'QuickHashIntStringHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], -'QuickHashIntStringHash::add' => ['bool', 'key'=>'int', 'value'=>'string'], -'QuickHashIntStringHash::delete' => ['bool', 'key'=>'int'], -'QuickHashIntStringHash::exists' => ['bool', 'key'=>'int'], -'QuickHashIntStringHash::get' => ['mixed', 'key'=>'int'], -'QuickHashIntStringHash::getSize' => ['int'], -'QuickHashIntStringHash::loadFromFile' => ['QuickHashIntStringHash', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], -'QuickHashIntStringHash::loadFromString' => ['QuickHashIntStringHash', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], -'QuickHashIntStringHash::saveToFile' => ['void', 'filename'=>'string'], -'QuickHashIntStringHash::saveToString' => ['string'], -'QuickHashIntStringHash::set' => ['int', 'key'=>'int', 'value'=>'string'], -'QuickHashIntStringHash::update' => ['bool', 'key'=>'int', 'value'=>'string'], -'QuickHashStringIntHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], -'QuickHashStringIntHash::add' => ['bool', 'key'=>'string', 'value'=>'int'], -'QuickHashStringIntHash::delete' => ['bool', 'key'=>'string'], -'QuickHashStringIntHash::exists' => ['bool', 'key'=>'string'], -'QuickHashStringIntHash::get' => ['mixed', 'key'=>'string'], -'QuickHashStringIntHash::getSize' => ['int'], -'QuickHashStringIntHash::loadFromFile' => ['QuickHashStringIntHash', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], -'QuickHashStringIntHash::loadFromString' => ['QuickHashStringIntHash', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], -'QuickHashStringIntHash::saveToFile' => ['void', 'filename'=>'string'], -'QuickHashStringIntHash::saveToString' => ['string'], -'QuickHashStringIntHash::set' => ['int', 'key'=>'string', 'value'=>'int'], -'QuickHashStringIntHash::update' => ['bool', 'key'=>'string', 'value'=>'int'], -'quoted_printable_decode' => ['string', 'string'=>'string'], -'quoted_printable_encode' => ['string', 'string'=>'string'], -'quotemeta' => ['string', 'string'=>'string'], -'rad2deg' => ['float', 'num'=>'float'], -'radius_acct_open' => ['resource|false'], -'radius_add_server' => ['bool', 'radius_handle'=>'resource', 'hostname'=>'string', 'port'=>'int', 'secret'=>'string', 'timeout'=>'int', 'max_tries'=>'int'], -'radius_auth_open' => ['resource|false'], -'radius_close' => ['bool', 'radius_handle'=>'resource'], -'radius_config' => ['bool', 'radius_handle'=>'resource', 'file'=>'string'], -'radius_create_request' => ['bool', 'radius_handle'=>'resource', 'type'=>'int'], -'radius_cvt_addr' => ['string', 'data'=>'string'], -'radius_cvt_int' => ['int', 'data'=>'string'], -'radius_cvt_string' => ['string', 'data'=>'string'], -'radius_demangle' => ['string', 'radius_handle'=>'resource', 'mangled'=>'string'], -'radius_demangle_mppe_key' => ['string', 'radius_handle'=>'resource', 'mangled'=>'string'], -'radius_get_attr' => ['mixed', 'radius_handle'=>'resource'], -'radius_get_tagged_attr_data' => ['string', 'data'=>'string'], -'radius_get_tagged_attr_tag' => ['int', 'data'=>'string'], -'radius_get_vendor_attr' => ['array', 'data'=>'string'], -'radius_put_addr' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'addr'=>'string'], -'radius_put_attr' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'string'], -'radius_put_int' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'int'], -'radius_put_string' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'string'], -'radius_put_vendor_addr' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'addr'=>'string'], -'radius_put_vendor_attr' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'string'], -'radius_put_vendor_int' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'int'], -'radius_put_vendor_string' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'string'], -'radius_request_authenticator' => ['string', 'radius_handle'=>'resource'], -'radius_salt_encrypt_attr' => ['string', 'radius_handle'=>'resource', 'data'=>'string'], -'radius_send_request' => ['int|false', 'radius_handle'=>'resource'], -'radius_server_secret' => ['string', 'radius_handle'=>'resource'], -'radius_strerror' => ['string', 'radius_handle'=>'resource'], -'rand' => ['int', 'min'=>'int', 'max'=>'int'], -'rand\'1' => ['int'], -'random_bytes' => ['non-empty-string', 'length'=>'positive-int'], -'random_int' => ['int', 'min'=>'int', 'max'=>'int'], -'range' => ['array', 'start'=>'mixed', 'end'=>'mixed', 'step='=>'int|float'], -'RangeException::__clone' => ['void'], -'RangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?RangeException'], -'RangeException::__toString' => ['string'], -'RangeException::getCode' => ['int'], -'RangeException::getFile' => ['string'], -'RangeException::getLine' => ['int'], -'RangeException::getMessage' => ['string'], -'RangeException::getPrevious' => ['Throwable|RangeException|null'], -'RangeException::getTrace' => ['list\',args?:array}>'], -'RangeException::getTraceAsString' => ['string'], -'rar_allow_broken_set' => ['bool', 'rarfile'=>'RarArchive', 'allow_broken'=>'bool'], -'rar_broken_is' => ['bool', 'rarfile'=>'rararchive'], -'rar_close' => ['bool', 'rarfile'=>'rararchive'], -'rar_comment_get' => ['string', 'rarfile'=>'rararchive'], -'rar_entry_get' => ['RarEntry', 'rarfile'=>'RarArchive', 'entryname'=>'string'], -'rar_list' => ['RarArchive', 'rarfile'=>'rararchive'], -'rar_open' => ['RarArchive', 'filename'=>'string', 'password='=>'string', 'volume_callback='=>'callable'], -'rar_solid_is' => ['bool', 'rarfile'=>'rararchive'], -'rar_wrapper_cache_stats' => ['string'], -'RarArchive::__toString' => ['string'], -'RarArchive::close' => ['bool'], -'RarArchive::getComment' => ['string|null'], -'RarArchive::getEntries' => ['RarEntry[]|false'], -'RarArchive::getEntry' => ['RarEntry|false', 'entryname'=>'string'], -'RarArchive::isBroken' => ['bool'], -'RarArchive::isSolid' => ['bool'], -'RarArchive::open' => ['RarArchive|false', 'filename'=>'string', 'password='=>'string', 'volume_callback='=>'callable'], -'RarArchive::setAllowBroken' => ['bool', 'allow_broken'=>'bool'], -'RarEntry::__toString' => ['string'], -'RarEntry::extract' => ['bool', 'dir'=>'string', 'filepath='=>'string', 'password='=>'string', 'extended_data='=>'bool'], -'RarEntry::getAttr' => ['int|false'], -'RarEntry::getCrc' => ['string|false'], -'RarEntry::getFileTime' => ['string|false'], -'RarEntry::getHostOs' => ['int|false'], -'RarEntry::getMethod' => ['int|false'], -'RarEntry::getName' => ['string|false'], -'RarEntry::getPackedSize' => ['int|false'], -'RarEntry::getStream' => ['resource|false', 'password='=>'string'], -'RarEntry::getUnpackedSize' => ['int|false'], -'RarEntry::getVersion' => ['int|false'], -'RarEntry::isDirectory' => ['bool'], -'RarEntry::isEncrypted' => ['bool'], -'RarException::getCode' => ['int'], -'RarException::getFile' => ['string'], -'RarException::getLine' => ['int'], -'RarException::getMessage' => ['string'], -'RarException::getPrevious' => ['Exception|Throwable'], -'RarException::getTrace' => ['list\',args?:array}>'], -'RarException::getTraceAsString' => ['string'], -'RarException::isUsingExceptions' => ['bool'], -'RarException::setUsingExceptions' => ['RarEntry', 'using_exceptions'=>'bool'], -'rawurldecode' => ['string', 'string'=>'string'], -'rawurlencode' => ['string', 'string'=>'string'], -'rd_kafka_err2str' => ['string', 'err'=>'int'], -'rd_kafka_errno' => ['int'], -'rd_kafka_errno2err' => ['int', 'errnox'=>'int'], -'rd_kafka_offset_tail' => ['int', 'cnt'=>'int'], -'RdKafka::addBrokers' => ['int', 'broker_list'=>'string'], -'RdKafka::flush' => ['int', 'timeout_ms'=>'int'], -'RdKafka::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], -'RdKafka::getOutQLen' => ['int'], -'RdKafka::newQueue' => ['RdKafka\Queue'], -'RdKafka::newTopic' => ['RdKafka\Topic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], -'RdKafka::poll' => ['void', 'timeout_ms'=>'int'], -'RdKafka::setLogLevel' => ['void', 'level'=>'int'], -'RdKafka\Conf::dump' => ['array'], -'RdKafka\Conf::set' => ['void', 'name'=>'string', 'value'=>'string'], -'RdKafka\Conf::setDefaultTopicConf' => ['void', 'topic_conf'=>'RdKafka\TopicConf'], -'RdKafka\Conf::setDrMsgCb' => ['void', 'callback'=>'callable'], -'RdKafka\Conf::setErrorCb' => ['void', 'callback'=>'callable'], -'RdKafka\Conf::setRebalanceCb' => ['void', 'callback'=>'callable'], -'RdKafka\Conf::setStatsCb' => ['void', 'callback'=>'callable'], -'RdKafka\Consumer::__construct' => ['void', 'conf='=>'?RdKafka\Conf'], -'RdKafka\Consumer::addBrokers' => ['int', 'broker_list'=>'string'], -'RdKafka\Consumer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], -'RdKafka\Consumer::getOutQLen' => ['int'], -'RdKafka\Consumer::newQueue' => ['RdKafka\Queue'], -'RdKafka\Consumer::newTopic' => ['RdKafka\ConsumerTopic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], -'RdKafka\Consumer::poll' => ['void', 'timeout_ms'=>'int'], -'RdKafka\Consumer::setLogLevel' => ['void', 'level'=>'int'], -'RdKafka\ConsumerTopic::__construct' => ['void'], -'RdKafka\ConsumerTopic::consume' => ['RdKafka\Message', 'partition'=>'int', 'timeout_ms'=>'int'], -'RdKafka\ConsumerTopic::consumeQueueStart' => ['void', 'partition'=>'int', 'offset'=>'int', 'queue'=>'RdKafka\Queue'], -'RdKafka\ConsumerTopic::consumeStart' => ['void', 'partition'=>'int', 'offset'=>'int'], -'RdKafka\ConsumerTopic::consumeStop' => ['void', 'partition'=>'int'], -'RdKafka\ConsumerTopic::getName' => ['string'], -'RdKafka\ConsumerTopic::offsetStore' => ['void', 'partition'=>'int', 'offset'=>'int'], -'RdKafka\KafkaConsumer::__construct' => ['void', 'conf'=>'RdKafka\Conf'], -'RdKafka\KafkaConsumer::assign' => ['void', 'topic_partitions='=>'RdKafka\TopicPartition[]|null'], -'RdKafka\KafkaConsumer::commit' => ['void', 'message_or_offsets='=>'RdKafka\Message|RdKafka\TopicPartition[]|null'], -'RdKafka\KafkaConsumer::commitAsync' => ['void', 'message_or_offsets='=>'RdKafka\Message|RdKafka\TopicPartition[]|null'], -'RdKafka\KafkaConsumer::consume' => ['RdKafka\Message', 'timeout_ms'=>'int'], -'RdKafka\KafkaConsumer::getAssignment' => ['RdKafka\TopicPartition[]'], -'RdKafka\KafkaConsumer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\KafkaConsumerTopic', 'timeout_ms'=>'int'], -'RdKafka\KafkaConsumer::getSubscription' => ['array'], -'RdKafka\KafkaConsumer::subscribe' => ['void', 'topics'=>'array'], -'RdKafka\KafkaConsumer::unsubscribe' => ['void'], -'RdKafka\KafkaConsumerTopic::getName' => ['string'], -'RdKafka\KafkaConsumerTopic::offsetStore' => ['void', 'partition'=>'int', 'offset'=>'int'], -'RdKafka\Message::errstr' => ['string'], -'RdKafka\Metadata::getBrokers' => ['RdKafka\Metadata\Collection'], -'RdKafka\Metadata::getOrigBrokerId' => ['int'], -'RdKafka\Metadata::getOrigBrokerName' => ['string'], -'RdKafka\Metadata::getTopics' => ['RdKafka\Metadata\Collection|RdKafka\Metadata\Topic[]'], -'RdKafka\Metadata\Collection::__construct' => ['void'], -'RdKafka\Metadata\Collection::count' => ['int'], -'RdKafka\Metadata\Collection::current' => ['mixed'], -'RdKafka\Metadata\Collection::key' => ['mixed'], -'RdKafka\Metadata\Collection::next' => ['void'], -'RdKafka\Metadata\Collection::rewind' => ['void'], -'RdKafka\Metadata\Collection::valid' => ['bool'], -'RdKafka\Metadata\Partition::getErr' => ['mixed'], -'RdKafka\Metadata\Partition::getId' => ['int'], -'RdKafka\Metadata\Partition::getIsrs' => ['mixed'], -'RdKafka\Metadata\Partition::getLeader' => ['mixed'], -'RdKafka\Metadata\Partition::getReplicas' => ['mixed'], -'RdKafka\Metadata\Topic::getErr' => ['mixed'], -'RdKafka\Metadata\Topic::getPartitions' => ['RdKafka\Metadata\Partition[]'], -'RdKafka\Metadata\Topic::getTopic' => ['string'], -'RdKafka\Producer::__construct' => ['void', 'conf='=>'?RdKafka\Conf'], -'RdKafka\Producer::addBrokers' => ['int', 'broker_list'=>'string'], -'RdKafka\Producer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], -'RdKafka\Producer::getOutQLen' => ['int'], -'RdKafka\Producer::newQueue' => ['RdKafka\Queue'], -'RdKafka\Producer::newTopic' => ['RdKafka\ProducerTopic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], -'RdKafka\Producer::poll' => ['void', 'timeout_ms'=>'int'], -'RdKafka\Producer::setLogLevel' => ['void', 'level'=>'int'], -'RdKafka\ProducerTopic::__construct' => ['void'], -'RdKafka\ProducerTopic::getName' => ['string'], -'RdKafka\ProducerTopic::produce' => ['void', 'partition'=>'int', 'msgflags'=>'int', 'payload'=>'string', 'key='=>'?string'], -'RdKafka\ProducerTopic::producev' => ['void', 'partition'=>'int', 'msgflags'=>'int', 'payload'=>'string', 'key='=>'?string', 'headers='=>'?array', 'timestamp_ms='=>'?int', 'opaque='=>'?string'], -'RdKafka\Queue::__construct' => ['void'], -'RdKafka\Queue::consume' => ['?RdKafka\Message', 'timeout_ms'=>'string'], -'RdKafka\Topic::getName' => ['string'], -'RdKafka\TopicConf::dump' => ['array'], -'RdKafka\TopicConf::set' => ['void', 'name'=>'string', 'value'=>'string'], -'RdKafka\TopicConf::setPartitioner' => ['void', 'partitioner'=>'int'], -'RdKafka\TopicPartition::__construct' => ['void', 'topic'=>'string', 'partition'=>'int', 'offset='=>'int'], -'RdKafka\TopicPartition::getOffset' => ['int'], -'RdKafka\TopicPartition::getPartition' => ['int'], -'RdKafka\TopicPartition::getTopic' => ['string'], -'RdKafka\TopicPartition::setOffset' => ['void', 'offset'=>'string'], -'RdKafka\TopicPartition::setPartition' => ['void', 'partition'=>'string'], -'RdKafka\TopicPartition::setTopic' => ['void', 'topic_name'=>'string'], -'readdir' => ['string|false', 'dir_handle='=>'resource'], -'readfile' => ['int|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], -'readgzfile' => ['int|false', 'filename'=>'string', 'use_include_path='=>'int'], -'readline' => ['string|false', 'prompt='=>'?string'], -'readline_add_history' => ['bool', 'prompt'=>'string'], -'readline_callback_handler_install' => ['bool', 'prompt'=>'string', 'callback'=>'callable'], -'readline_callback_handler_remove' => ['bool'], -'readline_callback_read_char' => ['void'], -'readline_clear_history' => ['bool'], -'readline_completion_function' => ['bool', 'callback'=>'callable'], -'readline_info' => ['mixed', 'var_name='=>'string', 'value='=>'string|int|bool'], -'readline_list_history' => ['array'], -'readline_on_new_line' => ['void'], -'readline_read_history' => ['bool', 'filename='=>'string'], -'readline_redisplay' => ['void'], -'readline_write_history' => ['bool', 'filename='=>'string'], -'readlink' => ['string|false', 'path'=>'string'], -'realpath' => ['string|false', 'path'=>'string'], -'realpath_cache_get' => ['array'], -'realpath_cache_size' => ['int'], -'recode' => ['string', 'request'=>'string', 'string'=>'string'], -'recode_file' => ['bool', 'request'=>'string', 'input'=>'resource', 'output'=>'resource'], -'recode_string' => ['string|false', 'request'=>'string', 'string'=>'string'], -'rectObj::__construct' => ['void'], -'rectObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'], -'rectObj::fit' => ['float', 'width'=>'int', 'height'=>'int'], -'rectObj::ms_newRectObj' => ['rectObj'], -'rectObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], -'rectObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'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::count' => ['int'], -'RecursiveArrayIterator::current' => ['mixed'], -'RecursiveArrayIterator::getArrayCopy' => ['array'], -'RecursiveArrayIterator::getChildren' => ['RecursiveArrayIterator'], -'RecursiveArrayIterator::getFlags' => ['void'], -'RecursiveArrayIterator::hasChildren' => ['bool'], -'RecursiveArrayIterator::key' => ['false|int|string'], -'RecursiveArrayIterator::ksort' => ['void'], -'RecursiveArrayIterator::natcasesort' => ['void'], -'RecursiveArrayIterator::natsort' => ['void'], -'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::rewind' => ['void'], -'RecursiveArrayIterator::seek' => ['void', 'position'=>'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::valid' => ['bool'], -'RecursiveCachingIterator::__construct' => ['void', 'it'=>'Iterator', 'flags='=>'int'], -'RecursiveCachingIterator::__toString' => ['string'], -'RecursiveCachingIterator::count' => ['int'], -'RecursiveCachingIterator::current' => ['void'], -'RecursiveCachingIterator::getCache' => ['array'], -'RecursiveCachingIterator::getChildren' => ['RecursiveCachingIterator'], -'RecursiveCachingIterator::getFlags' => ['int'], -'RecursiveCachingIterator::getInnerIterator' => ['Iterator'], -'RecursiveCachingIterator::hasChildren' => ['bool'], -'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::rewind' => ['void'], -'RecursiveCachingIterator::setFlags' => ['void', 'flags'=>'int'], -'RecursiveCachingIterator::valid' => ['bool'], -'RecursiveCallbackFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'func'=>'callable'], -'RecursiveCallbackFilterIterator::accept' => ['bool'], -'RecursiveCallbackFilterIterator::current' => ['mixed'], -'RecursiveCallbackFilterIterator::getChildren' => ['RecursiveCallbackFilterIterator'], -'RecursiveCallbackFilterIterator::getInnerIterator' => ['Iterator'], -'RecursiveCallbackFilterIterator::hasChildren' => ['bool'], -'RecursiveCallbackFilterIterator::key' => ['bool|float|int|string'], -'RecursiveCallbackFilterIterator::next' => ['void'], -'RecursiveCallbackFilterIterator::rewind' => ['void'], -'RecursiveCallbackFilterIterator::valid' => ['bool'], -'RecursiveDirectoryIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], -'RecursiveDirectoryIterator::__toString' => ['string'], -'RecursiveDirectoryIterator::_bad_state_ex' => [''], -'RecursiveDirectoryIterator::current' => ['string|SplFileInfo|FilesystemIterator'], -'RecursiveDirectoryIterator::getATime' => ['int'], -'RecursiveDirectoryIterator::getBasename' => ['string', 'suffix='=>'string'], -'RecursiveDirectoryIterator::getChildren' => ['RecursiveDirectoryIterator'], -'RecursiveDirectoryIterator::getCTime' => ['int'], -'RecursiveDirectoryIterator::getExtension' => ['string'], -'RecursiveDirectoryIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], -'RecursiveDirectoryIterator::getFilename' => ['string'], -'RecursiveDirectoryIterator::getFlags' => ['int'], -'RecursiveDirectoryIterator::getGroup' => ['int'], -'RecursiveDirectoryIterator::getInode' => ['int'], -'RecursiveDirectoryIterator::getLinkTarget' => ['string'], -'RecursiveDirectoryIterator::getMTime' => ['int'], -'RecursiveDirectoryIterator::getOwner' => ['int'], -'RecursiveDirectoryIterator::getPath' => ['string'], -'RecursiveDirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], -'RecursiveDirectoryIterator::getPathname' => ['string'], -'RecursiveDirectoryIterator::getPerms' => ['int'], -'RecursiveDirectoryIterator::getRealPath' => ['string'], -'RecursiveDirectoryIterator::getSize' => ['int'], -'RecursiveDirectoryIterator::getSubPath' => ['string'], -'RecursiveDirectoryIterator::getSubPathname' => ['string'], -'RecursiveDirectoryIterator::getType' => ['string'], -'RecursiveDirectoryIterator::hasChildren' => ['bool', 'allow_links='=>'bool'], -'RecursiveDirectoryIterator::isDir' => ['bool'], -'RecursiveDirectoryIterator::isDot' => ['bool'], -'RecursiveDirectoryIterator::isExecutable' => ['bool'], -'RecursiveDirectoryIterator::isFile' => ['bool'], -'RecursiveDirectoryIterator::isLink' => ['bool'], -'RecursiveDirectoryIterator::isReadable' => ['bool'], -'RecursiveDirectoryIterator::isWritable' => ['bool'], -'RecursiveDirectoryIterator::key' => ['string'], -'RecursiveDirectoryIterator::next' => ['void'], -'RecursiveDirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'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::valid' => ['bool'], -'RecursiveFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'], -'RecursiveFilterIterator::accept' => ['bool'], -'RecursiveFilterIterator::current' => ['mixed'], -'RecursiveFilterIterator::getChildren' => ['RecursiveFilterIterator'], -'RecursiveFilterIterator::getInnerIterator' => ['Iterator'], -'RecursiveFilterIterator::hasChildren' => ['bool'], -'RecursiveFilterIterator::key' => ['mixed'], -'RecursiveFilterIterator::next' => ['void'], -'RecursiveFilterIterator::rewind' => ['void'], -'RecursiveFilterIterator::valid' => ['bool'], -'RecursiveIterator::__construct' => ['void'], -'RecursiveIterator::current' => ['mixed'], -'RecursiveIterator::getChildren' => ['RecursiveIterator'], -'RecursiveIterator::hasChildren' => ['bool'], -'RecursiveIterator::key' => ['int|string'], -'RecursiveIterator::next' => ['void'], -'RecursiveIterator::rewind' => ['void'], -'RecursiveIterator::valid' => ['bool'], -'RecursiveIteratorIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'mode='=>'int', 'flags='=>'int'], -'RecursiveIteratorIterator::beginChildren' => ['void'], -'RecursiveIteratorIterator::beginIteration' => ['RecursiveIterator'], -'RecursiveIteratorIterator::callGetChildren' => ['RecursiveIterator'], -'RecursiveIteratorIterator::callHasChildren' => ['bool'], -'RecursiveIteratorIterator::current' => ['mixed'], -'RecursiveIteratorIterator::endChildren' => ['void'], -'RecursiveIteratorIterator::endIteration' => ['RecursiveIterator'], -'RecursiveIteratorIterator::getDepth' => ['int'], -'RecursiveIteratorIterator::getInnerIterator' => ['RecursiveIterator'], -'RecursiveIteratorIterator::getMaxDepth' => ['int|false'], -'RecursiveIteratorIterator::getSubIterator' => ['RecursiveIterator', 'level='=>'int'], -'RecursiveIteratorIterator::key' => ['mixed'], -'RecursiveIteratorIterator::next' => ['void'], -'RecursiveIteratorIterator::nextElement' => ['void'], -'RecursiveIteratorIterator::rewind' => ['void'], -'RecursiveIteratorIterator::setMaxDepth' => ['void', 'max_depth='=>'int'], -'RecursiveIteratorIterator::valid' => ['bool'], -'RecursiveRegexIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], -'RecursiveRegexIterator::accept' => ['bool'], -'RecursiveRegexIterator::current' => [''], -'RecursiveRegexIterator::getChildren' => ['RecursiveRegexIterator'], -'RecursiveRegexIterator::getFlags' => ['int'], -'RecursiveRegexIterator::getInnerIterator' => ['Iterator'], -'RecursiveRegexIterator::getMode' => ['int'], -'RecursiveRegexIterator::getPregFlags' => ['int'], -'RecursiveRegexIterator::getRegex' => ['string'], -'RecursiveRegexIterator::hasChildren' => ['bool'], -'RecursiveRegexIterator::key' => [''], -'RecursiveRegexIterator::next' => [''], -'RecursiveRegexIterator::rewind' => [''], -'RecursiveRegexIterator::setFlags' => ['void', 'new_flags'=>'int'], -'RecursiveRegexIterator::setMode' => ['void', 'new_mode'=>'int'], -'RecursiveRegexIterator::setPregFlags' => ['void', 'new_flags'=>'int'], -'RecursiveRegexIterator::valid' => [''], -'RecursiveTreeIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'flags='=>'int', 'cit_flags='=>'int', 'mode'=>'int'], -'RecursiveTreeIterator::beginChildren' => ['void'], -'RecursiveTreeIterator::beginIteration' => ['RecursiveIterator'], -'RecursiveTreeIterator::callGetChildren' => ['RecursiveIterator'], -'RecursiveTreeIterator::callHasChildren' => ['bool'], -'RecursiveTreeIterator::current' => ['string'], -'RecursiveTreeIterator::endChildren' => ['void'], -'RecursiveTreeIterator::endIteration' => ['void'], -'RecursiveTreeIterator::getDepth' => ['int'], -'RecursiveTreeIterator::getEntry' => ['string'], -'RecursiveTreeIterator::getInnerIterator' => ['RecursiveIterator'], -'RecursiveTreeIterator::getMaxDepth' => ['false|int'], -'RecursiveTreeIterator::getPostfix' => ['string'], -'RecursiveTreeIterator::getPrefix' => ['string'], -'RecursiveTreeIterator::getSubIterator' => ['RecursiveIterator', 'level='=>'int'], -'RecursiveTreeIterator::key' => ['string'], -'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::valid' => ['bool'], -'Redis::__construct' => ['void'], -'Redis::__destruct' => ['void'], -'Redis::_prefix' => ['string', 'value'=>'mixed'], -'Redis::_serialize' => ['mixed', 'value'=>'mixed'], -'Redis::_unserialize' => ['mixed', 'value'=>'string'], -'Redis::append' => ['int', 'key'=>'string', 'value'=>'string'], -'Redis::auth' => ['bool', 'password'=>'string'], -'Redis::bgRewriteAOF' => ['bool'], -'Redis::bgSave' => ['bool'], -'Redis::bitCount' => ['int', 'key'=>'string'], -'Redis::bitOp' => ['int', 'operation'=>'string', 'ret_key'=>'string', 'key'=>'string', '...other_keys='=>'string'], -'Redis::bitpos' => ['int', 'key'=>'string', 'bit'=>'int', 'start='=>'int', 'end='=>'int'], -'Redis::blPop' => ['array', 'keys'=>'string[]', 'timeout'=>'int'], -'Redis::blPop\'1' => ['array', 'key'=>'string', 'timeout_or_key'=>'int|string', '...extra_args'=>'int|string'], -'Redis::brPop' => ['array', 'keys'=>'string[]', 'timeout'=>'int'], -'Redis::brPop\'1' => ['array', 'key'=>'string', 'timeout_or_key'=>'int|string', '...extra_args'=>'int|string'], -'Redis::brpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'], -'Redis::clearLastError' => ['bool'], -'Redis::client' => ['mixed', 'command'=>'string', 'arg='=>'string'], -'Redis::close' => ['bool'], -'Redis::command' => ['', '...args'=>''], -'Redis::config' => ['string', 'operation'=>'string', 'key'=>'string', 'value='=>'string'], -'Redis::connect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'reserved='=>'null', 'retry_interval='=>'?int', 'read_timeout='=>'float'], -'Redis::dbSize' => ['int'], -'Redis::debug' => ['', 'key'=>''], -'Redis::decr' => ['int', 'key'=>'string'], -'Redis::decrBy' => ['int', 'key'=>'string', 'value'=>'int'], -'Redis::decrByFloat' => ['float', 'key'=>'string', 'value'=>'float'], -'Redis::del' => ['int', 'key'=>'string', '...args'=>'string'], -'Redis::del\'1' => ['int', 'key'=>'string[]'], -'Redis::delete' => ['int', 'key'=>'string', '...args'=>'string'], -'Redis::delete\'1' => ['int', 'key'=>'string[]'], -'Redis::discard' => [''], -'Redis::dump' => ['string|false', 'key'=>'string'], -'Redis::echo' => ['string', 'message'=>'string'], -'Redis::eval' => ['mixed', 'script'=>'', 'args='=>'', 'numKeys='=>''], -'Redis::evalSha' => ['mixed', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], -'Redis::evaluate' => ['mixed', 'script'=>'string', 'args='=>'array', 'numKeys='=>'int'], -'Redis::evaluateSha' => ['', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], -'Redis::exec' => ['array'], -'Redis::exists' => ['int', 'keys'=>'string|string[]'], -'Redis::exists\'1' => ['int', '...keys'=>'string'], -'Redis::expire' => ['bool', 'key'=>'string', 'ttl'=>'int'], -'Redis::expireAt' => ['bool', 'key'=>'string', 'expiry'=>'int'], -'Redis::flushAll' => ['bool', 'async='=>'bool'], -'Redis::flushDb' => ['bool', 'async='=>'bool'], -'Redis::geoAdd' => ['int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'member'=>'string', '...other_triples='=>'string|int|float'], -'Redis::geoDist' => ['float', 'key'=>'string', 'member1'=>'string', 'member2'=>'string', 'unit='=>'string'], -'Redis::geoHash' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], -'Redis::geoPos' => ['array', 'key'=>'string', 'member'=>'string', '...members='=>'string'], -'Redis::geoRadius' => ['array|int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'unit'=>'float', 'options='=>'array'], -'Redis::geoRadiusByMember' => ['array|int', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'units'=>'string', 'options='=>'array'], -'Redis::get' => ['string|false', 'key'=>'string'], -'Redis::getAuth' => ['string|false|null'], -'Redis::getBit' => ['int', 'key'=>'string', 'offset'=>'int'], -'Redis::getDBNum' => ['int|false'], -'Redis::getHost' => ['string|false'], -'Redis::getKeys' => ['array', 'pattern'=>'string'], -'Redis::getLastError' => ['?string'], -'Redis::getMode' => ['int'], -'Redis::getMultiple' => ['array', 'keys'=>'string[]'], -'Redis::getOption' => ['int', 'name'=>'int'], -'Redis::getPersistentID' => ['string|false|null'], -'Redis::getPort' => ['int|false'], -'Redis::getRange' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'Redis::getReadTimeout' => ['float|false'], -'Redis::getSet' => ['string', 'key'=>'string', 'string'=>'string'], -'Redis::getTimeout' => ['float|false'], -'Redis::hDel' => ['int|false', 'key'=>'string', 'hashKey1'=>'string', '...otherHashKeys='=>'string'], -'Redis::hExists' => ['bool', 'key'=>'string', 'hashKey'=>'string'], -'Redis::hGet' => ['string|false', 'key'=>'string', 'hashKey'=>'string'], -'Redis::hGetAll' => ['array', 'key'=>'string'], -'Redis::hIncrBy' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'int'], -'Redis::hIncrByFloat' => ['float', 'key'=>'string', 'field'=>'string', 'increment'=>'float'], -'Redis::hKeys' => ['array', 'key'=>'string'], -'Redis::hLen' => ['int|false', 'key'=>'string'], -'Redis::hMGet' => ['array', 'key'=>'string', 'hashKeys'=>'array'], -'Redis::hMSet' => ['bool', 'key'=>'string', 'hashKeys'=>'array'], -'Redis::hScan' => ['array', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], -'Redis::hSet' => ['int|false', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], -'Redis::hSetNx' => ['bool', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], -'Redis::hStrLen' => ['', 'key'=>'', 'member'=>''], -'Redis::hVals' => ['array', 'key'=>'string'], -'Redis::incr' => ['int', 'key'=>'string'], -'Redis::incrBy' => ['int', 'key'=>'string', 'value'=>'int'], -'Redis::incrByFloat' => ['float', 'key'=>'string', 'value'=>'float'], -'Redis::info' => ['array', 'option='=>'string'], -'Redis::isConnected' => ['bool'], -'Redis::keys' => ['array', 'pattern'=>'string'], -'Redis::lastSave' => ['int'], -'Redis::lGet' => ['string', 'key'=>'string', 'index'=>'int'], -'Redis::lGetRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'Redis::lIndex' => ['string|false', 'key'=>'string', 'index'=>'int'], -'Redis::lInsert' => ['int', 'key'=>'string', 'position'=>'int', 'pivot'=>'string', 'value'=>'string'], -'Redis::listTrim' => ['', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], -'Redis::lLen' => ['int|false', 'key'=>'string'], -'Redis::lPop' => ['string|false', 'key'=>'string'], -'Redis::lPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'Redis::lPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], -'Redis::lRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'Redis::lRem' => ['int|false', 'key'=>'string', 'value'=>'string', 'count'=>'int'], -'Redis::lRemove' => ['int', 'key'=>'string', 'value'=>'string', 'count'=>'int'], -'Redis::lSet' => ['bool', 'key'=>'string', 'index'=>'int', 'value'=>'string'], -'Redis::lSize' => ['int', 'key'=>'string'], -'Redis::lTrim' => ['array|false', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], -'Redis::mGet' => ['array', 'keys'=>'string[]'], -'Redis::migrate' => ['bool', 'host'=>'string', 'port'=>'int', 'key'=>'string|string[]', 'db'=>'int', 'timeout'=>'int', 'copy='=>'bool', 'replace='=>'bool'], -'Redis::move' => ['bool', 'key'=>'string', 'dbindex'=>'int'], -'Redis::mSet' => ['bool', 'pairs'=>'array'], -'Redis::mSetNx' => ['bool', 'pairs'=>'array'], -'Redis::multi' => ['Redis', 'mode='=>'int'], -'Redis::object' => ['string|long|false', 'info'=>'string', 'key'=>'string'], -'Redis::open' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'reserved='=>'null', 'retry_interval='=>'?int', 'read_timeout='=>'float'], -'Redis::pconnect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'persistent_id='=>'string', 'retry_interval='=>'?int'], -'Redis::persist' => ['bool', 'key'=>'string'], -'Redis::pExpire' => ['bool', 'key'=>'string', 'ttl'=>'int'], -'Redis::pexpireAt' => ['bool', 'key'=>'string', 'expiry'=>'int'], -'Redis::pfAdd' => ['bool', 'key'=>'string', 'elements'=>'array'], -'Redis::pfCount' => ['int', 'key'=>'array|string'], -'Redis::pfMerge' => ['bool', 'destkey'=>'string', 'sourcekeys'=>'array'], -'Redis::ping' => ['string'], -'Redis::pipeline' => ['Redis'], -'Redis::popen' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'persistent_id='=>'string', 'retry_interval='=>'?int'], -'Redis::psetex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], -'Redis::psubscribe' => ['', 'patterns'=>'array', 'callback'=>'array|string'], -'Redis::pttl' => ['int|false', 'key'=>'string'], -'Redis::publish' => ['int', 'channel'=>'string', 'message'=>'string'], -'Redis::pubsub' => ['array|int', 'keyword'=>'string', 'argument='=>'array|string'], -'Redis::punsubscribe' => ['', 'pattern'=>'string', '...other_patterns='=>'string'], -'Redis::randomKey' => ['string'], -'Redis::rawCommand' => ['mixed', 'command'=>'string', '...arguments='=>'mixed'], -'Redis::rename' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], -'Redis::renameKey' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], -'Redis::renameNx' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], -'Redis::resetStat' => ['bool'], -'Redis::restore' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], -'Redis::role' => ['array', 'nodeParams'=>'string|array{0:string,1:int}'], -'Redis::rPop' => ['string|false', 'key'=>'string'], -'Redis::rpoplpush' => ['string', 'srcKey'=>'string', 'dstKey'=>'string'], -'Redis::rPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'Redis::rPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], -'Redis::sAdd' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'Redis::sAddArray' => ['bool', 'key'=>'string', 'values'=>'array'], -'Redis::save' => ['bool'], -'Redis::scan' => ['array|false', '&rw_iterator'=>'?int', 'pattern='=>'?string', 'count='=>'?int'], -'Redis::sCard' => ['int', 'key'=>'string'], -'Redis::sContains' => ['', 'key'=>'string', 'value'=>'string'], -'Redis::script' => ['mixed', 'command'=>'string', '...args='=>'mixed'], -'Redis::sDiff' => ['array', 'key1'=>'string', '...other_keys='=>'string'], -'Redis::sDiffStore' => ['int|false', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], -'Redis::select' => ['bool', 'dbindex'=>'int'], -'Redis::sendEcho' => ['string', 'msg'=>'string'], -'Redis::set' => ['bool', 'key'=>'string', 'value'=>'mixed', 'options='=>'array'], -'Redis::set\'1' => ['bool', 'key'=>'string', 'value'=>'mixed', 'timeout='=>'int'], -'Redis::setBit' => ['int', 'key'=>'string', 'offset'=>'int', 'value'=>'int'], -'Redis::setEx' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], -'Redis::setNx' => ['bool', 'key'=>'string', 'value'=>'string'], -'Redis::setOption' => ['bool', 'name'=>'int', 'value'=>'mixed'], -'Redis::setRange' => ['int', 'key'=>'string', 'offset'=>'int', 'end'=>'int'], -'Redis::setTimeout' => ['', 'key'=>'string', 'ttl'=>'int'], -'Redis::sGetMembers' => ['', 'key'=>'string'], -'Redis::sInter' => ['array|false', 'key'=>'string', '...other_keys='=>'string'], -'Redis::sInterStore' => ['int|false', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], -'Redis::sIsMember' => ['bool', 'key'=>'string', 'value'=>'string'], -'Redis::slave' => ['bool', 'host'=>'string', 'port'=>'int'], -'Redis::slave\'1' => ['bool', 'host'=>'string', 'port'=>'int'], -'Redis::slaveof' => ['bool', 'host='=>'string', 'port='=>'int'], -'Redis::slowLog' => ['mixed', 'operation'=>'string', 'length='=>'int'], -'Redis::sMembers' => ['array', 'key'=>'string'], -'Redis::sMove' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string', 'member'=>'string'], -'Redis::sort' => ['array|int', 'key'=>'string', 'options='=>'array'], -'Redis::sortAsc' => ['array', 'key'=>'string', 'pattern='=>'string', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], -'Redis::sortAscAlpha' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], -'Redis::sortDesc' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], -'Redis::sortDescAlpha' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], -'Redis::sPop' => ['string|false', 'key'=>'string'], -'Redis::sRandMember' => ['array|string|false', 'key'=>'string', 'count='=>'int'], -'Redis::sRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], -'Redis::sRemove' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], -'Redis::sScan' => ['array|bool', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], -'Redis::sSize' => ['int', 'key'=>'string'], -'Redis::strLen' => ['int', 'key'=>'string'], -'Redis::subscribe' => ['mixed|null', 'channels'=>'array', 'callback'=>'string|array'], -'Redis::substr' => ['', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'Redis::sUnion' => ['array', 'key'=>'string', '...other_keys='=>'string'], -'Redis::sUnionStore' => ['int', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], -'Redis::swapdb' => ['bool', 'srcdb'=>'int', 'dstdb'=>'int'], -'Redis::time' => ['array'], -'Redis::ttl' => ['int|false', 'key'=>'string'], -'Redis::type' => ['int', 'key'=>'string'], -'Redis::unlink' => ['int', 'key'=>'string', '...args'=>'string'], -'Redis::unlink\'1' => ['int', 'key'=>'string[]'], -'Redis::unsubscribe' => ['', 'channel'=>'string', '...other_channels='=>'string'], -'Redis::unwatch' => [''], -'Redis::wait' => ['int', 'numSlaves'=>'int', 'timeout'=>'int'], -'Redis::watch' => ['void', 'key'=>'string', '...other_keys='=>'string'], -'Redis::xack' => ['', 'str_key'=>'string', 'str_group'=>'string', 'arr_ids'=>'array'], -'Redis::xadd' => ['', 'str_key'=>'string', 'str_id'=>'string', 'arr_fields'=>'array', 'i_maxlen='=>'', 'boo_approximate='=>''], -'Redis::xclaim' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_consumer'=>'string', 'i_min_idle'=>'', 'arr_ids'=>'array', 'arr_opts='=>'array'], -'Redis::xdel' => ['', 'str_key'=>'string', 'arr_ids'=>'array'], -'Redis::xgroup' => ['', 'str_operation'=>'string', 'str_key='=>'string', 'str_arg1='=>'', 'str_arg2='=>'', 'str_arg3='=>''], -'Redis::xinfo' => ['', 'str_cmd'=>'string', 'str_key='=>'string', 'str_group='=>'string'], -'Redis::xlen' => ['', 'key'=>''], -'Redis::xpending' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_start='=>'', 'str_end='=>'', 'i_count='=>'', 'str_consumer='=>'string'], -'Redis::xrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], -'Redis::xread' => ['', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], -'Redis::xreadgroup' => ['', 'str_group'=>'string', 'str_consumer'=>'string', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], -'Redis::xrevrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], -'Redis::xtrim' => ['', 'str_key'=>'string', 'i_maxlen'=>'', 'boo_approximate='=>''], -'Redis::zAdd' => ['int', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], -'Redis::zAdd\'1' => ['int', 'options'=>'array', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], -'Redis::zCard' => ['int', 'key'=>'string'], -'Redis::zCount' => ['int', 'key'=>'string', 'start'=>'string', 'end'=>'string'], -'Redis::zDelete' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], -'Redis::zDeleteRangeByRank' => ['', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'Redis::zDeleteRangeByScore' => ['', 'key'=>'string', 'start'=>'float', 'end'=>'float'], -'Redis::zIncrBy' => ['float', 'key'=>'string', 'value'=>'float', 'member'=>'string'], -'Redis::zInter' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], -'Redis::zInterStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], -'Redis::zLexCount' => ['int', 'key'=>'string', 'min'=>'string', 'max'=>'string'], -'Redis::zRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscores='=>'bool'], -'Redis::zRangeByLex' => ['array|false', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], -'Redis::zRangeByScore' => ['array', 'key'=>'string', 'start'=>'int|string', 'end'=>'int|string', 'options='=>'array'], -'Redis::zRank' => ['int', 'key'=>'string', 'member'=>'string'], -'Redis::zRem' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], -'Redis::zRemove' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], -'Redis::zRemoveRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'Redis::zRemoveRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], -'Redis::zRemRangeByLex' => ['int', 'key'=>'string', 'min'=>'string', 'max'=>'string'], -'Redis::zRemRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'Redis::zRemRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], -'Redis::zReverseRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], -'Redis::zRevRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], -'Redis::zRevRangeByLex' => ['array', 'key'=>'string', 'min'=>'string', 'max'=>'string', 'offset='=>'int', 'limit='=>'int'], -'Redis::zRevRangeByScore' => ['array', 'key'=>'string', 'start'=>'string', 'end'=>'string', 'options='=>'array'], -'Redis::zRevRank' => ['int', 'key'=>'string', 'member'=>'string'], -'Redis::zScan' => ['array|bool', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], -'Redis::zScore' => ['float|false', 'key'=>'string', 'member'=>'string'], -'Redis::zSize' => ['', 'key'=>'string'], -'Redis::zUnion' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], -'Redis::zUnionStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], -'RedisArray::__call' => ['mixed', 'function_name'=>'string', 'arguments'=>'array'], -'RedisArray::__construct' => ['void', 'name='=>'string', 'hosts='=>'?array', 'opts='=>'?array'], -'RedisArray::_continuum' => [''], -'RedisArray::_distributor' => [''], -'RedisArray::_function' => ['string'], -'RedisArray::_hosts' => ['array'], -'RedisArray::_instance' => ['', 'host'=>''], -'RedisArray::_rehash' => ['', 'callable='=>'callable'], -'RedisArray::_target' => ['string', 'key'=>'string'], -'RedisArray::bgsave' => [''], -'RedisArray::del' => ['bool', 'key'=>'string', '...args'=>'string'], -'RedisArray::delete' => ['bool', 'key'=>'string', '...args'=>'string'], -'RedisArray::delete\'1' => ['bool', 'key'=>'string[]'], -'RedisArray::discard' => [''], -'RedisArray::exec' => ['array'], -'RedisArray::flushAll' => ['bool', 'async='=>'bool'], -'RedisArray::flushDb' => ['bool', 'async='=>'bool'], -'RedisArray::getMultiple' => ['', 'keys'=>''], -'RedisArray::getOption' => ['', 'opt'=>''], -'RedisArray::info' => ['array'], -'RedisArray::keys' => ['array', 'pattern'=>''], -'RedisArray::mGet' => ['array', 'keys'=>'string[]'], -'RedisArray::mSet' => ['bool', 'pairs'=>'array'], -'RedisArray::multi' => ['RedisArray', 'host'=>'string', 'mode='=>'int'], -'RedisArray::ping' => ['string'], -'RedisArray::save' => ['bool'], -'RedisArray::select' => ['', 'index'=>''], -'RedisArray::setOption' => ['', 'opt'=>'', 'value'=>''], -'RedisArray::unlink' => ['int', 'key'=>'string', '...other_keys='=>'string'], -'RedisArray::unlink\'1' => ['int', 'key'=>'string[]'], -'RedisArray::unwatch' => [''], -'RedisCluster::__construct' => ['void', 'name'=>'?string', 'seeds='=>'string[]', 'timeout='=>'float', 'readTimeout='=>'float', 'persistent='=>'bool', 'auth='=>'?string'], -'RedisCluster::_masters' => ['array'], -'RedisCluster::_prefix' => ['string', 'value'=>'mixed'], -'RedisCluster::_redir' => [''], -'RedisCluster::_serialize' => ['mixed', 'value'=>'mixed'], -'RedisCluster::_unserialize' => ['mixed', 'value'=>'string'], -'RedisCluster::append' => ['int', 'key'=>'string', 'value'=>'string'], -'RedisCluster::bgrewriteaof' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], -'RedisCluster::bgsave' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], -'RedisCluster::bitCount' => ['int', 'key'=>'string'], -'RedisCluster::bitOp' => ['int', 'operation'=>'string', 'retKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], -'RedisCluster::bitpos' => ['int', 'key'=>'string', 'bit'=>'int', 'start='=>'int', 'end='=>'int'], -'RedisCluster::blPop' => ['array', 'keys'=>'array', 'timeout'=>'int'], -'RedisCluster::brPop' => ['array', 'keys'=>'array', 'timeout'=>'int'], -'RedisCluster::brpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'], -'RedisCluster::clearLastError' => ['bool'], -'RedisCluster::client' => ['', 'nodeParams'=>'string|array{0:string,1:int}', 'subCmd='=>'string', '...args='=>''], -'RedisCluster::close' => [''], -'RedisCluster::cluster' => ['mixed', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'arguments='=>'mixed'], -'RedisCluster::command' => ['array|bool'], -'RedisCluster::config' => ['array|bool', 'nodeParams'=>'string|array{0:string,1:int}', 'operation'=>'string', 'key'=>'string', 'value='=>'string'], -'RedisCluster::dbSize' => ['int', 'nodeParams'=>'string|array{0:string,1:int}'], -'RedisCluster::decr' => ['int', 'key'=>'string'], -'RedisCluster::decrBy' => ['int', 'key'=>'string', 'value'=>'int'], -'RedisCluster::del' => ['int', 'key'=>'string', '...other_keys='=>'string'], -'RedisCluster::del\'1' => ['int', 'key'=>'string[]'], -'RedisCluster::discard' => [''], -'RedisCluster::dump' => ['string|false', 'key'=>'string'], -'RedisCluster::echo' => ['string', 'nodeParams'=>'string|array{0:string,1:int}', 'msg'=>'string'], -'RedisCluster::eval' => ['mixed', 'script'=>'', 'args='=>'', 'numKeys='=>''], -'RedisCluster::evalSha' => ['mixed', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], -'RedisCluster::exec' => ['array|void'], -'RedisCluster::exists' => ['bool', 'key'=>'string'], -'RedisCluster::expire' => ['bool', 'key'=>'string', 'ttl'=>'int'], -'RedisCluster::expireAt' => ['bool', 'key'=>'string', 'timestamp'=>'int'], -'RedisCluster::flushAll' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}', 'async='=>'bool'], -'RedisCluster::flushDB' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}', 'async='=>'bool'], -'RedisCluster::geoAdd' => ['int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'member'=>'string', '...other_members='=>'float|string'], -'RedisCluster::geoDist' => ['', 'key'=>'string', 'member1'=>'string', 'member2'=>'string', 'unit='=>'string'], -'RedisCluster::geohash' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], -'RedisCluster::geopos' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], -'RedisCluster::geoRadius' => ['', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'radiusUnit'=>'string', 'options='=>'array'], -'RedisCluster::geoRadiusByMember' => ['string[]', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'radiusUnit'=>'string', 'options='=>'array'], -'RedisCluster::get' => ['string|false', 'key'=>'string'], -'RedisCluster::getBit' => ['int', 'key'=>'string', 'offset'=>'int'], -'RedisCluster::getLastError' => ['?string'], -'RedisCluster::getMode' => ['int'], -'RedisCluster::getOption' => ['int', 'option'=>'int'], -'RedisCluster::getRange' => ['string', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'RedisCluster::getSet' => ['string', 'key'=>'string', 'value'=>'string'], -'RedisCluster::hDel' => ['int|false', 'key'=>'string', 'hashKey'=>'string', '...other_hashKeys='=>'string[]'], -'RedisCluster::hExists' => ['bool', 'key'=>'string', 'hashKey'=>'string'], -'RedisCluster::hGet' => ['string|false', 'key'=>'string', 'hashKey'=>'string'], -'RedisCluster::hGetAll' => ['array', 'key'=>'string'], -'RedisCluster::hIncrBy' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'int'], -'RedisCluster::hIncrByFloat' => ['float', 'key'=>'string', 'field'=>'string', 'increment'=>'float'], -'RedisCluster::hKeys' => ['array', 'key'=>'string'], -'RedisCluster::hLen' => ['int|false', 'key'=>'string'], -'RedisCluster::hMGet' => ['array', 'key'=>'string', 'hashKeys'=>'array'], -'RedisCluster::hMSet' => ['bool', 'key'=>'string', 'hashKeys'=>'array'], -'RedisCluster::hScan' => ['array', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], -'RedisCluster::hSet' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], -'RedisCluster::hSetNx' => ['bool', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], -'RedisCluster::hStrlen' => ['int', 'key'=>'string', 'member'=>'string'], -'RedisCluster::hVals' => ['array', 'key'=>'string'], -'RedisCluster::incr' => ['int', 'key'=>'string'], -'RedisCluster::incrBy' => ['int', 'key'=>'string', 'value'=>'int'], -'RedisCluster::incrByFloat' => ['float', 'key'=>'string', 'increment'=>'float'], -'RedisCluster::info' => ['array', 'nodeParams'=>'string|array{0:string,1:int}', 'option='=>'string'], -'RedisCluster::keys' => ['array', 'pattern'=>'string'], -'RedisCluster::lastSave' => ['int', 'nodeParams'=>'string|array{0:string,1:int}'], -'RedisCluster::lGet' => ['', 'key'=>'string', 'index'=>'int'], -'RedisCluster::lIndex' => ['string|false', 'key'=>'string', 'index'=>'int'], -'RedisCluster::lInsert' => ['int', 'key'=>'string', 'position'=>'int', 'pivot'=>'string', 'value'=>'string'], -'RedisCluster::lLen' => ['int', 'key'=>'string'], -'RedisCluster::lPop' => ['string|false', 'key'=>'string'], -'RedisCluster::lPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'RedisCluster::lPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], -'RedisCluster::lRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'RedisCluster::lRem' => ['int|false', 'key'=>'string', 'value'=>'string', 'count'=>'int'], -'RedisCluster::lSet' => ['bool', 'key'=>'string', 'index'=>'int', 'value'=>'string'], -'RedisCluster::lTrim' => ['array|false', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], -'RedisCluster::mget' => ['array', 'array'=>'array'], -'RedisCluster::mset' => ['bool', 'array'=>'array'], -'RedisCluster::msetnx' => ['int', 'array'=>'array'], -'RedisCluster::multi' => ['Redis', 'mode='=>'int'], -'RedisCluster::object' => ['string|int|false', 'string'=>'string', 'key'=>'string'], -'RedisCluster::persist' => ['bool', 'key'=>'string'], -'RedisCluster::pExpire' => ['bool', 'key'=>'string', 'ttl'=>'int'], -'RedisCluster::pExpireAt' => ['bool', 'key'=>'string', 'timestamp'=>'int'], -'RedisCluster::pfAdd' => ['bool', 'key'=>'string', 'elements'=>'array'], -'RedisCluster::pfCount' => ['int', 'key'=>'string'], -'RedisCluster::pfMerge' => ['bool', 'destKey'=>'string', 'sourceKeys'=>'array'], -'RedisCluster::ping' => ['string', 'nodeParams'=>'string|array{0:string,1:int}'], -'RedisCluster::psetex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], -'RedisCluster::psubscribe' => ['mixed', 'patterns'=>'array', 'callback'=>'string'], -'RedisCluster::pttl' => ['int', 'key'=>'string'], -'RedisCluster::publish' => ['int', 'channel'=>'string', 'message'=>'string'], -'RedisCluster::pubsub' => ['array', 'nodeParams'=>'string', 'keyword'=>'string', '...argument='=>'string'], -'RedisCluster::punSubscribe' => ['', 'channels'=>'', 'callback'=>''], -'RedisCluster::randomKey' => ['string', 'nodeParams'=>'string|array{0:string,1:int}'], -'RedisCluster::rawCommand' => ['mixed', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'arguments='=>'mixed'], -'RedisCluster::rename' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string'], -'RedisCluster::renameNx' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string'], -'RedisCluster::restore' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], -'RedisCluster::role' => ['array'], -'RedisCluster::rPop' => ['string|false', 'key'=>'string'], -'RedisCluster::rpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string'], -'RedisCluster::rPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'RedisCluster::rPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], -'RedisCluster::sAdd' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'RedisCluster::sAddArray' => ['int|false', 'key'=>'string', 'valueArray'=>'array'], -'RedisCluster::save' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], -'RedisCluster::scan' => ['array|false', '&iterator'=>'int', 'nodeParams'=>'string|array{0:string,1:int}', 'pattern='=>'string', 'count='=>'int'], -'RedisCluster::sCard' => ['int', 'key'=>'string'], -'RedisCluster::script' => ['string|bool|array', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'script='=>'string', '...other_scripts='=>'string[]'], -'RedisCluster::sDiff' => ['list', 'key1'=>'string', 'key2'=>'string', '...other_keys='=>'string'], -'RedisCluster::sDiffStore' => ['int', 'dstKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], -'RedisCluster::set' => ['bool', 'key'=>'string', 'value'=>'string', 'timeout='=>'array|int'], -'RedisCluster::setBit' => ['int', 'key'=>'string', 'offset'=>'int', 'value'=>'bool|int'], -'RedisCluster::setex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], -'RedisCluster::setnx' => ['bool', 'key'=>'string', 'value'=>'string'], -'RedisCluster::setOption' => ['bool', 'option'=>'int', 'value'=>'string|int'], -'RedisCluster::setRange' => ['string', 'key'=>'string', 'offset'=>'int', 'value'=>'string'], -'RedisCluster::sInter' => ['list', 'key'=>'string', '...other_keys='=>'string'], -'RedisCluster::sInterStore' => ['int', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], -'RedisCluster::sIsMember' => ['bool', 'key'=>'string', 'value'=>'string'], -'RedisCluster::slowLog' => ['array|int|bool', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'length='=>'int'], -'RedisCluster::sMembers' => ['list', 'key'=>'string'], -'RedisCluster::sMove' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string', 'member'=>'string'], -'RedisCluster::sort' => ['array', 'key'=>'string', 'option='=>'array'], -'RedisCluster::sPop' => ['string', 'key'=>'string'], -'RedisCluster::sRandMember' => ['array|string', 'key'=>'string', 'count='=>'int'], -'RedisCluster::sRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], -'RedisCluster::sScan' => ['array|false', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'null', 'count='=>'int'], -'RedisCluster::strlen' => ['int', 'key'=>'string'], -'RedisCluster::subscribe' => ['mixed', 'channels'=>'array', 'callback'=>'string'], -'RedisCluster::sUnion' => ['list', 'key1'=>'string', '...other_keys='=>'string'], -'RedisCluster::sUnion\'1' => ['list', 'keys'=>'string[]'], -'RedisCluster::sUnionStore' => ['int', 'dstKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], -'RedisCluster::time' => ['array'], -'RedisCluster::ttl' => ['int', 'key'=>'string'], -'RedisCluster::type' => ['int', 'key'=>'string'], -'RedisCluster::unlink' => ['int', 'key'=>'string', '...other_keys='=>'string'], -'RedisCluster::unSubscribe' => ['', 'channels'=>'', '...other_channels='=>''], -'RedisCluster::unwatch' => [''], -'RedisCluster::watch' => ['void', 'key'=>'string', '...other_keys='=>'string'], -'RedisCluster::xack' => ['', 'str_key'=>'string', 'str_group'=>'string', 'arr_ids'=>'array'], -'RedisCluster::xadd' => ['', 'str_key'=>'string', 'str_id'=>'string', 'arr_fields'=>'array', 'i_maxlen='=>'', 'boo_approximate='=>''], -'RedisCluster::xclaim' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_consumer'=>'string', 'i_min_idle'=>'', 'arr_ids'=>'array', 'arr_opts='=>'array'], -'RedisCluster::xdel' => ['', 'str_key'=>'string', 'arr_ids'=>'array'], -'RedisCluster::xgroup' => ['', 'str_operation'=>'string', 'str_key='=>'string', 'str_arg1='=>'', 'str_arg2='=>'', 'str_arg3='=>''], -'RedisCluster::xinfo' => ['', 'str_cmd'=>'string', 'str_key='=>'string', 'str_group='=>'string'], -'RedisCluster::xlen' => ['', 'key'=>''], -'RedisCluster::xpending' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_start='=>'', 'str_end='=>'', 'i_count='=>'', 'str_consumer='=>'string'], -'RedisCluster::xrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], -'RedisCluster::xread' => ['', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], -'RedisCluster::xreadgroup' => ['', 'str_group'=>'string', 'str_consumer'=>'string', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], -'RedisCluster::xrevrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], -'RedisCluster::xtrim' => ['', 'str_key'=>'string', 'i_maxlen'=>'', 'boo_approximate='=>''], -'RedisCluster::zAdd' => ['int', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], -'RedisCluster::zCard' => ['int', 'key'=>'string'], -'RedisCluster::zCount' => ['int', 'key'=>'string', 'start'=>'string', 'end'=>'string'], -'RedisCluster::zIncrBy' => ['float', 'key'=>'string', 'value'=>'float', 'member'=>'string'], -'RedisCluster::zInterStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], -'RedisCluster::zLexCount' => ['int', 'key'=>'string', 'min'=>'int', 'max'=>'int'], -'RedisCluster::zRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscores='=>'bool'], -'RedisCluster::zRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], -'RedisCluster::zRangeByScore' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'options='=>'array'], -'RedisCluster::zRank' => ['int', 'key'=>'string', 'member'=>'string'], -'RedisCluster::zRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], -'RedisCluster::zRemRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int'], -'RedisCluster::zRemRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'RedisCluster::zRemRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], -'RedisCluster::zRevRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], -'RedisCluster::zRevRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], -'RedisCluster::zRevRangeByScore' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'options='=>'array'], -'RedisCluster::zRevRank' => ['int', 'key'=>'string', 'member'=>'string'], -'RedisCluster::zScan' => ['array|false', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], -'RedisCluster::zScore' => ['float', 'key'=>'string', 'member'=>'string'], -'RedisCluster::zUnionStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], -'Reflection::export' => ['?string', 'r'=>'reflector', 'return='=>'bool'], -'Reflection::getModifierNames' => ['array', 'modifiers'=>'int'], -'ReflectionClass::__clone' => ['void'], -'ReflectionClass::__construct' => ['void', 'argument'=>'object|class-string'], -'ReflectionClass::__toString' => ['string'], -'ReflectionClass::export' => ['?string', 'argument'=>'string|object', 'return='=>'bool'], -'ReflectionClass::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], -'ReflectionClass::getConstant' => ['mixed', 'name'=>'string'], -'ReflectionClass::getConstants' => ['array', 'filter=' => '?int'], -'ReflectionClass::getConstructor' => ['?ReflectionMethod'], -'ReflectionClass::getDefaultProperties' => ['array'], -'ReflectionClass::getDocComment' => ['string|false'], -'ReflectionClass::getEndLine' => ['int|false'], -'ReflectionClass::getExtension' => ['?ReflectionExtension'], -'ReflectionClass::getExtensionName' => ['string|false'], -'ReflectionClass::getFileName' => ['string|false'], -'ReflectionClass::getInterfaceNames' => ['list'], -'ReflectionClass::getInterfaces' => ['array'], -'ReflectionClass::getMethod' => ['ReflectionMethod', 'name'=>'string'], -'ReflectionClass::getMethods' => ['list', 'filter='=>'int'], -'ReflectionClass::getModifiers' => ['int'], -'ReflectionClass::getName' => ['class-string'], -'ReflectionClass::getNamespaceName' => ['string'], -'ReflectionClass::getParentClass' => ['ReflectionClass|false'], -'ReflectionClass::getProperties' => ['list', 'filter='=>'int'], -'ReflectionClass::getProperty' => ['ReflectionProperty', 'name'=>'string'], -'ReflectionClass::getReflectionConstant' => ['ReflectionClassConstant|false', 'name'=>'string'], -'ReflectionClass::getReflectionConstants' => ['list', 'filter='=>'?int'], -'ReflectionClass::getShortName' => ['string'], -'ReflectionClass::getStartLine' => ['int|false'], -'ReflectionClass::getStaticProperties' => ['array'], -'ReflectionClass::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'], -'ReflectionClass::getTraitAliases' => ['array|null'], -'ReflectionClass::getTraitNames' => ['list|null'], -'ReflectionClass::getTraits' => ['array'], -'ReflectionClass::hasConstant' => ['bool', 'name'=>'string'], -'ReflectionClass::hasMethod' => ['bool', 'name'=>'string'], -'ReflectionClass::hasProperty' => ['bool', 'name'=>'string'], -'ReflectionClass::implementsInterface' => ['bool', 'interface_name'=>'interface-string|ReflectionClass'], -'ReflectionClass::inNamespace' => ['bool'], -'ReflectionClass::isAbstract' => ['bool'], -'ReflectionClass::isAnonymous' => ['bool'], -'ReflectionClass::isCloneable' => ['bool'], -'ReflectionClass::isEnum' => ['bool'], -'ReflectionClass::isFinal' => ['bool'], -'ReflectionClass::isInstance' => ['bool', 'object'=>'object'], -'ReflectionClass::isInstantiable' => ['bool'], -'ReflectionClass::isInterface' => ['bool'], -'ReflectionClass::isInternal' => ['bool'], -'ReflectionClass::isIterable' => ['bool'], -'ReflectionClass::isIterateable' => ['bool'], -'ReflectionClass::isSubclassOf' => ['bool', 'class'=>'class-string|ReflectionClass'], -'ReflectionClass::isTrait' => ['bool'], -'ReflectionClass::isUserDefined' => ['bool'], -'ReflectionClass::newInstance' => ['object', '...args='=>'mixed'], -'ReflectionClass::newInstanceArgs' => ['object', 'args='=>'array'], -'ReflectionClass::newInstanceWithoutConstructor' => ['object'], -'ReflectionClass::setStaticPropertyValue' => ['void', 'name'=>'string', 'value'=>'mixed'], -'ReflectionClassConstant::__construct' => ['void', 'class'=>'mixed', 'name'=>'string'], -'ReflectionClassConstant::__toString' => ['string'], -'ReflectionClassConstant::export' => ['string', 'class'=>'mixed', 'name'=>'string', 'return='=>'bool'], -'ReflectionClassConstant::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], -'ReflectionClassConstant::getDeclaringClass' => ['ReflectionClass'], -'ReflectionClassConstant::getDocComment' => ['string|false'], -'ReflectionClassConstant::getModifiers' => ['int'], -'ReflectionClassConstant::getName' => ['string'], -'ReflectionClassConstant::getValue' => ['scalar|array|null'], -'ReflectionClassConstant::isPrivate' => ['bool'], -'ReflectionClassConstant::isProtected' => ['bool'], -'ReflectionClassConstant::isPublic' => ['bool'], -'ReflectionEnum::getBackingType' => ['?ReflectionType'], -'ReflectionEnum::getCase' => ['ReflectionEnumUnitCase', 'name' => 'string'], -'ReflectionEnum::getCases' => ['list'], -'ReflectionEnum::hasCase' => ['bool', 'name' => 'string'], -'ReflectionEnum::isBacked' => ['bool'], -'ReflectionEnumUnitCase::getEnum' => ['ReflectionEnum'], -'ReflectionEnumUnitCase::getValue' => ['UnitEnum'], -'ReflectionEnumBackedCase::getBackingValue' => ['string|int'], -'ReflectionExtension::__clone' => ['void'], -'ReflectionExtension::__construct' => ['void', 'name'=>'string'], -'ReflectionExtension::__toString' => ['string'], -'ReflectionExtension::export' => ['?string', 'name'=>'string', 'return='=>'bool'], -'ReflectionExtension::getClasses' => ['array'], -'ReflectionExtension::getClassNames' => ['list'], -'ReflectionExtension::getConstants' => ['array'], -'ReflectionExtension::getDependencies' => ['array'], -'ReflectionExtension::getFunctions' => ['array'], -'ReflectionExtension::getINIEntries' => ['array'], -'ReflectionExtension::getName' => ['string'], -'ReflectionExtension::getVersion' => ['string'], -'ReflectionExtension::info' => ['void'], -'ReflectionExtension::isPersistent' => ['bool'], -'ReflectionExtension::isTemporary' => ['bool'], -'ReflectionFunction::__construct' => ['void', 'name'=>'callable-string|Closure'], -'ReflectionFunction::__toString' => ['string'], -'ReflectionFunction::export' => ['?string', 'name'=>'string', 'return='=>'bool'], -'ReflectionFunction::getClosure' => ['?Closure'], -'ReflectionFunction::getClosureScopeClass' => ['ReflectionClass'], -'ReflectionFunction::getClosureThis' => ['bool'], -'ReflectionFunction::getDocComment' => ['string|false'], -'ReflectionFunction::getEndLine' => ['int|false'], -'ReflectionFunction::getExtension' => ['?ReflectionExtension'], -'ReflectionFunction::getExtensionName' => ['string|false'], -'ReflectionFunction::getFileName' => ['string|false'], -'ReflectionFunction::getName' => ['callable-string'], -'ReflectionFunction::getNamespaceName' => ['string'], -'ReflectionFunction::getNumberOfParameters' => ['int'], -'ReflectionFunction::getNumberOfRequiredParameters' => ['int'], -'ReflectionFunction::getParameters' => ['list'], -'ReflectionFunction::getReturnType' => ['?ReflectionType'], -'ReflectionFunction::getShortName' => ['string'], -'ReflectionFunction::getStartLine' => ['int|false'], -'ReflectionFunction::getStaticVariables' => ['array'], -'ReflectionFunction::hasReturnType' => ['bool'], -'ReflectionFunction::inNamespace' => ['bool'], -'ReflectionFunction::invoke' => ['mixed', '...args='=>'mixed'], -'ReflectionFunction::invokeArgs' => ['mixed', 'args'=>'array'], -'ReflectionFunction::isClosure' => ['bool'], -'ReflectionFunction::isDeprecated' => ['bool'], -'ReflectionFunction::isDisabled' => ['bool'], -'ReflectionFunction::isGenerator' => ['bool'], -'ReflectionFunction::isInternal' => ['bool'], -'ReflectionFunction::isUserDefined' => ['bool'], -'ReflectionFunction::isVariadic' => ['bool'], -'ReflectionFunction::returnsReference' => ['bool'], -'ReflectionFunctionAbstract::__clone' => ['void'], -'ReflectionFunctionAbstract::__toString' => ['string'], -'ReflectionFunctionAbstract::export' => ['?string'], -'ReflectionFunctionAbstract::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], -'ReflectionFunctionAbstract::getClosureScopeClass' => ['ReflectionClass|null'], -'ReflectionFunctionAbstract::getClosureThis' => ['object|null'], -'ReflectionFunctionAbstract::getDocComment' => ['string|false'], -'ReflectionFunctionAbstract::getEndLine' => ['int|false'], -'ReflectionFunctionAbstract::getExtension' => ['ReflectionExtension'], -'ReflectionFunctionAbstract::getExtensionName' => ['string'], -'ReflectionFunctionAbstract::getFileName' => ['string|false'], -'ReflectionFunctionAbstract::getName' => ['string'], -'ReflectionFunctionAbstract::getNamespaceName' => ['string'], -'ReflectionFunctionAbstract::getNumberOfParameters' => ['int'], -'ReflectionFunctionAbstract::getNumberOfRequiredParameters' => ['int'], -'ReflectionFunctionAbstract::getParameters' => ['list'], -'ReflectionFunctionAbstract::getReturnType' => ['?ReflectionType'], -'ReflectionFunctionAbstract::getShortName' => ['string'], -'ReflectionFunctionAbstract::getStartLine' => ['int|false'], -'ReflectionFunctionAbstract::getStaticVariables' => ['array'], -'ReflectionFunctionAbstract::getTentativeReturnType' => ['?ReflectionType'], -'ReflectionFunctionAbstract::hasReturnType' => ['bool'], -'ReflectionFunctionAbstract::hasTentativeReturnType' => ['bool'], -'ReflectionFunctionAbstract::inNamespace' => ['bool'], -'ReflectionFunctionAbstract::isClosure' => ['bool'], -'ReflectionFunctionAbstract::isDeprecated' => ['bool'], -'ReflectionFunctionAbstract::isGenerator' => ['bool'], -'ReflectionFunctionAbstract::isInternal' => ['bool'], -'ReflectionFunctionAbstract::isStatic' => ['bool'], -'ReflectionFunctionAbstract::isUserDefined' => ['bool'], -'ReflectionFunctionAbstract::isVariadic' => ['bool'], -'ReflectionFunctionAbstract::returnsReference' => ['bool'], -'ReflectionGenerator::__construct' => ['void', 'generator'=>'object'], -'ReflectionGenerator::getExecutingFile' => ['string'], -'ReflectionGenerator::getExecutingGenerator' => ['Generator'], -'ReflectionGenerator::getExecutingLine' => ['int'], -'ReflectionGenerator::getFunction' => ['ReflectionFunctionAbstract'], -'ReflectionGenerator::getThis' => ['?object'], -'ReflectionGenerator::getTrace' => ['array', 'options='=>'int'], -'ReflectionMethod::__construct' => ['void', 'class'=>'class-string|object', 'name'=>'string'], -'ReflectionMethod::__construct\'1' => ['void', 'class_method'=>'string'], -'ReflectionMethod::__toString' => ['string'], -'ReflectionMethod::export' => ['?string', 'class'=>'string', 'name'=>'string', 'return='=>'bool'], -'ReflectionMethod::getClosure' => ['?Closure', 'object='=>'object'], -'ReflectionMethod::getClosureScopeClass' => ['ReflectionClass'], -'ReflectionMethod::getClosureThis' => ['object'], -'ReflectionMethod::getDeclaringClass' => ['ReflectionClass'], -'ReflectionMethod::getDocComment' => ['false|string'], -'ReflectionMethod::getEndLine' => ['false|int'], -'ReflectionMethod::getExtension' => ['ReflectionExtension'], -'ReflectionMethod::getExtensionName' => ['string'], -'ReflectionMethod::getFileName' => ['false|string'], -'ReflectionMethod::getModifiers' => ['int'], -'ReflectionMethod::getName' => ['string'], -'ReflectionMethod::getNamespaceName' => ['string'], -'ReflectionMethod::getNumberOfParameters' => ['int'], -'ReflectionMethod::getNumberOfRequiredParameters' => ['int'], -'ReflectionMethod::getParameters' => ['list<\ReflectionParameter>'], -'ReflectionMethod::getPrototype' => ['ReflectionMethod'], -'ReflectionMethod::getReturnType' => ['?ReflectionType'], -'ReflectionMethod::getShortName' => ['string'], -'ReflectionMethod::getStartLine' => ['false|int'], -'ReflectionMethod::getStaticVariables' => ['array'], -'ReflectionMethod::hasReturnType' => ['bool'], -'ReflectionMethod::inNamespace' => ['bool'], -'ReflectionMethod::invoke' => ['mixed', 'object'=>'?object', '...args='=>'mixed'], -'ReflectionMethod::invokeArgs' => ['mixed', 'object'=>'?object', 'args'=>'array'], -'ReflectionMethod::isAbstract' => ['bool'], -'ReflectionMethod::isClosure' => ['bool'], -'ReflectionMethod::isConstructor' => ['bool'], -'ReflectionMethod::isDeprecated' => ['bool'], -'ReflectionMethod::isDestructor' => ['bool'], -'ReflectionMethod::isFinal' => ['bool'], -'ReflectionMethod::isGenerator' => ['bool'], -'ReflectionMethod::isInternal' => ['bool'], -'ReflectionMethod::isPrivate' => ['bool'], -'ReflectionMethod::isProtected' => ['bool'], -'ReflectionMethod::isPublic' => ['bool'], -'ReflectionMethod::isUserDefined' => ['bool'], -'ReflectionMethod::isVariadic' => ['bool'], -'ReflectionMethod::returnsReference' => ['bool'], -'ReflectionMethod::setAccessible' => ['void', 'visible'=>'bool'], -'ReflectionNamedType::__clone' => ['void'], -'ReflectionNamedType::__toString' => ['string'], -'ReflectionNamedType::allowsNull' => ['bool'], -'ReflectionNamedType::getName' => ['string'], -'ReflectionNamedType::isBuiltin' => ['bool'], -'ReflectionObject::__clone' => ['void'], -'ReflectionObject::__construct' => ['void', 'argument'=>'object'], -'ReflectionObject::__toString' => ['string'], -'ReflectionObject::export' => ['?string', 'argument'=>'object', 'return='=>'bool'], -'ReflectionObject::getConstant' => ['mixed', 'name'=>'string'], -'ReflectionObject::getConstants' => ['array'], -'ReflectionObject::getConstructor' => ['?ReflectionMethod'], -'ReflectionObject::getDefaultProperties' => ['array'], -'ReflectionObject::getDocComment' => ['false|string'], -'ReflectionObject::getEndLine' => ['false|int'], -'ReflectionObject::getExtension' => ['?ReflectionExtension'], -'ReflectionObject::getExtensionName' => ['false|string'], -'ReflectionObject::getFileName' => ['false|string'], -'ReflectionObject::getInterfaceNames' => ['class-string[]'], -'ReflectionObject::getInterfaces' => ['array'], -'ReflectionObject::getMethod' => ['ReflectionMethod', 'name'=>'string'], -'ReflectionObject::getMethods' => ['ReflectionMethod[]', 'filter='=>'int'], -'ReflectionObject::getModifiers' => ['int'], -'ReflectionObject::getName' => ['string'], -'ReflectionObject::getNamespaceName' => ['string'], -'ReflectionObject::getParentClass' => ['ReflectionClass|false'], -'ReflectionObject::getProperties' => ['ReflectionProperty[]', 'filter='=>'int'], -'ReflectionObject::getProperty' => ['ReflectionProperty', 'name'=>'string'], -'ReflectionObject::getReflectionConstant' => ['ReflectionClassConstant', 'name'=>'string'], -'ReflectionObject::getReflectionConstants' => ['list<\ReflectionClassConstant>'], -'ReflectionObject::getShortName' => ['string'], -'ReflectionObject::getStartLine' => ['false|int'], -'ReflectionObject::getStaticProperties' => ['ReflectionProperty[]'], -'ReflectionObject::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'], -'ReflectionObject::getTraitAliases' => ['array'], -'ReflectionObject::getTraitNames' => ['list'], -'ReflectionObject::getTraits' => ['array'], -'ReflectionObject::hasConstant' => ['bool', 'name'=>'string'], -'ReflectionObject::hasMethod' => ['bool', 'name'=>'string'], -'ReflectionObject::hasProperty' => ['bool', 'name'=>'string'], -'ReflectionObject::implementsInterface' => ['bool', 'interface_name'=>'ReflectionClass|string'], -'ReflectionObject::inNamespace' => ['bool'], -'ReflectionObject::isAbstract' => ['bool'], -'ReflectionObject::isAnonymous' => ['bool'], -'ReflectionObject::isCloneable' => ['bool'], -'ReflectionObject::isEnum' => ['bool'], -'ReflectionObject::isFinal' => ['bool'], -'ReflectionObject::isInstance' => ['bool', 'object'=>'object'], -'ReflectionObject::isInstantiable' => ['bool'], -'ReflectionObject::isInterface' => ['bool'], -'ReflectionObject::isInternal' => ['bool'], -'ReflectionObject::isIterable' => ['bool'], -'ReflectionObject::isIterateable' => ['bool'], -'ReflectionObject::isSubclassOf' => ['bool', 'class'=>'ReflectionClass|string'], -'ReflectionObject::isTrait' => ['bool'], -'ReflectionObject::isUserDefined' => ['bool'], -'ReflectionObject::newInstance' => ['object', 'args='=>'mixed', '...args='=>'array'], -'ReflectionObject::newInstanceArgs' => ['object', 'args='=>'array'], -'ReflectionObject::newInstanceWithoutConstructor' => ['object'], -'ReflectionObject::setStaticPropertyValue' => ['void', 'name'=>'string', 'value'=>'string'], -'ReflectionParameter::__clone' => ['void'], -'ReflectionParameter::__construct' => ['void', 'function'=>'', 'parameter'=>''], -'ReflectionParameter::__toString' => ['string'], -'ReflectionParameter::allowsNull' => ['bool'], -'ReflectionParameter::canBePassedByValue' => ['bool'], -'ReflectionParameter::export' => ['?string', 'function'=>'string', 'parameter'=>'string', 'return='=>'bool'], -'ReflectionParameter::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], -'ReflectionParameter::getClass' => ['?ReflectionClass'], -'ReflectionParameter::getDeclaringClass' => ['?ReflectionClass'], -'ReflectionParameter::getDeclaringFunction' => ['ReflectionFunctionAbstract'], -'ReflectionParameter::getDefaultValue' => ['mixed'], -'ReflectionParameter::getDefaultValueConstantName' => ['?string'], -'ReflectionParameter::getName' => ['string'], -'ReflectionParameter::getPosition' => ['int'], -'ReflectionParameter::getType' => ['?ReflectionType'], -'ReflectionParameter::hasType' => ['bool'], -'ReflectionParameter::isArray' => ['bool'], -'ReflectionParameter::isCallable' => ['?bool'], -'ReflectionParameter::isDefaultValueAvailable' => ['bool'], -'ReflectionParameter::isDefaultValueConstant' => ['bool'], -'ReflectionParameter::isOptional' => ['bool'], -'ReflectionParameter::isPassedByReference' => ['bool'], -'ReflectionParameter::isVariadic' => ['bool'], -'ReflectionProperty::__clone' => ['void'], -'ReflectionProperty::__construct' => ['void', 'class'=>'', 'name'=>'string'], -'ReflectionProperty::__toString' => ['string'], -'ReflectionProperty::export' => ['?string', 'class'=>'mixed', 'name'=>'string', 'return='=>'bool'], -'ReflectionProperty::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], -'ReflectionProperty::getDeclaringClass' => ['ReflectionClass'], -'ReflectionProperty::getDocComment' => ['string|false'], -'ReflectionProperty::getModifiers' => ['int'], -'ReflectionProperty::getName' => ['string'], -'ReflectionProperty::getType' => ['?ReflectionType'], -'ReflectionProperty::getValue' => ['mixed', 'object='=>'null|object'], -'ReflectionProperty::hasType' => ['bool'], -'ReflectionProperty::isDefault' => ['bool'], -'ReflectionProperty::isPrivate' => ['bool'], -'ReflectionProperty::isProtected' => ['bool'], -'ReflectionProperty::isPublic' => ['bool'], -'ReflectionProperty::isStatic' => ['bool'], -'ReflectionProperty::setAccessible' => ['void', 'visible'=>'bool'], -'ReflectionProperty::setValue' => ['void', 'object'=>'null|object', 'value'=>''], -'ReflectionProperty::setValue\'1' => ['void', 'value'=>''], -'ReflectionType::__clone' => ['void'], -'ReflectionType::__toString' => ['string'], -'ReflectionType::allowsNull' => ['bool'], -'ReflectionUnionType::getTypes' => ['list'], -'ReflectionZendExtension::__clone' => ['void'], -'ReflectionZendExtension::__construct' => ['void', 'name'=>'string'], -'ReflectionZendExtension::__toString' => ['string'], -'ReflectionZendExtension::export' => ['?string', 'name'=>'string', 'return='=>'bool'], -'ReflectionZendExtension::getAuthor' => ['string'], -'ReflectionZendExtension::getCopyright' => ['string'], -'ReflectionZendExtension::getName' => ['string'], -'ReflectionZendExtension::getURL' => ['string'], -'ReflectionZendExtension::getVersion' => ['string'], -'Reflector::__toString' => ['string'], -'Reflector::export' => ['?string'], -'RegexIterator::__construct' => ['void', 'iterator'=>'Iterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], -'RegexIterator::accept' => ['bool'], -'RegexIterator::current' => ['mixed'], -'RegexIterator::getFlags' => ['int'], -'RegexIterator::getInnerIterator' => ['Iterator'], -'RegexIterator::getMode' => ['int'], -'RegexIterator::getPregFlags' => ['int'], -'RegexIterator::getRegex' => ['string'], -'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::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'], -'register_tick_function' => ['bool', 'callback'=>'callable():void', '...args='=>'mixed'], -'rename' => ['bool', 'from'=>'string', 'to'=>'string', 'context='=>'resource'], -'rename_function' => ['bool', 'original_name'=>'string', 'new_name'=>'string'], -'reset' => ['mixed|false', '&r_array'=>'array|object'], -'ResourceBundle::__construct' => ['void', 'locale'=>'string', 'bundlename'=>'string', 'fallback='=>'bool'], -'ResourceBundle::count' => ['int'], -'ResourceBundle::create' => ['?ResourceBundle', 'locale'=>'string', 'bundlename'=>'string', 'fallback='=>'bool'], -'ResourceBundle::get' => ['', 'index'=>'string|int', 'fallback='=>'bool'], -'ResourceBundle::getErrorCode' => ['int'], -'ResourceBundle::getErrorMessage' => ['string'], -'ResourceBundle::getLocales' => ['array', 'bundlename'=>'string'], -'resourcebundle_count' => ['int', 'bundle'=>'ResourceBundle'], -'resourcebundle_create' => ['?ResourceBundle', 'locale'=>'string', 'bundle'=>'string', 'fallback='=>'bool'], -'resourcebundle_get' => ['mixed|null', 'bundle'=>'ResourceBundle', 'index'=>'string|int', 'fallback='=>'bool'], -'resourcebundle_get_error_code' => ['int', 'bundle'=>'ResourceBundle'], -'resourcebundle_get_error_message' => ['string', 'bundle'=>'ResourceBundle'], -'resourcebundle_locales' => ['array', 'bundle'=>'string'], -'restore_error_handler' => ['true'], -'restore_exception_handler' => ['bool'], -'restore_include_path' => ['void'], -'rewind' => ['bool', 'stream'=>'resource'], -'rewinddir' => ['null|false', 'dir_handle='=>'resource'], -'rmdir' => ['bool', 'directory'=>'string', 'context='=>'resource'], -'round' => ['float', 'num'=>'float', 'precision='=>'int', 'mode='=>'int'], -'rpm_close' => ['bool', 'rpmr'=>'resource'], -'rpm_get_tag' => ['mixed', 'rpmr'=>'resource', 'tagnum'=>'int'], -'rpm_is_valid' => ['bool', 'filename'=>'string'], -'rpm_open' => ['resource|false', 'filename'=>'string'], -'rpm_version' => ['string'], -'rpmaddtag' => ['bool', 'tag'=>'int'], -'rpmdbinfo' => ['array', 'nevr'=>'string', 'full='=>'bool'], -'rpmdbsearch' => ['array', 'pattern'=>'string', 'rpmtag='=>'int', 'rpmmire='=>'int', 'full='=>'bool'], -'rpminfo' => ['array', 'path'=>'string', 'full='=>'bool', 'error='=>'string'], -'rpmvercmp' => ['int', 'evr1'=>'string', 'evr2'=>'string'], -'rrd_create' => ['bool', 'filename'=>'string', 'options'=>'array'], -'rrd_disconnect' => ['void'], -'rrd_error' => ['string'], -'rrd_fetch' => ['array', 'filename'=>'string', 'options'=>'array'], -'rrd_first' => ['int|false', 'file'=>'string', 'raaindex='=>'int'], -'rrd_graph' => ['array|false', 'filename'=>'string', 'options'=>'array'], -'rrd_info' => ['array|false', 'filename'=>'string'], -'rrd_last' => ['int', 'filename'=>'string'], -'rrd_lastupdate' => ['array|false', 'filename'=>'string'], -'rrd_restore' => ['bool', 'xml_file'=>'string', 'rrd_file'=>'string', 'options='=>'array'], -'rrd_tune' => ['bool', 'filename'=>'string', 'options'=>'array'], -'rrd_update' => ['bool', 'filename'=>'string', 'options'=>'array'], -'rrd_version' => ['string'], -'rrd_xport' => ['array|false', 'options'=>'array'], -'rrdc_disconnect' => ['void'], -'RRDCreator::__construct' => ['void', 'path'=>'string', 'starttime='=>'string', 'step='=>'int'], -'RRDCreator::addArchive' => ['void', 'description'=>'string'], -'RRDCreator::addDataSource' => ['void', 'description'=>'string'], -'RRDCreator::save' => ['bool'], -'RRDGraph::__construct' => ['void', 'path'=>'string'], -'RRDGraph::save' => ['array|false'], -'RRDGraph::saveVerbose' => ['array|false'], -'RRDGraph::setOptions' => ['void', 'options'=>'array'], -'RRDUpdater::__construct' => ['void', 'path'=>'string'], -'RRDUpdater::update' => ['bool', 'values'=>'array', 'time='=>'string'], -'rsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], -'rtrim' => ['string', 'string'=>'string', 'characters='=>'string'], -'runkit7_constant_add' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'new_visibility='=>'int'], -'runkit7_constant_redefine' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'new_visibility='=>'?int'], -'runkit7_constant_remove' => ['bool', 'constant_name'=>'string'], -'runkit7_function_add' => ['bool', 'function_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_doc_comment='=>'?string', 'return_by_reference='=>'?bool', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], -'runkit7_function_copy' => ['bool', 'source_name'=>'string', 'target_name'=>'string'], -'runkit7_function_redefine' => ['bool', 'function_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_doc_comment='=>'?string', 'return_by_reference='=>'?bool', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], -'runkit7_function_remove' => ['bool', 'function_name'=>'string'], -'runkit7_function_rename' => ['bool', 'source_name'=>'string', 'target_name'=>'string'], -'runkit7_import' => ['bool', 'filename'=>'string', 'flags='=>'?int'], -'runkit7_method_add' => ['bool', 'class_name'=>'string', 'method_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_flags='=>'int|null|string', 'flags_or_doc_comment='=>'int|null|string', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], -'runkit7_method_copy' => ['bool', 'destination_class'=>'string', 'destination_method'=>'string', 'source_class'=>'string', 'source_method='=>'?string'], -'runkit7_method_redefine' => ['bool', 'class_name'=>'string', 'method_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_flags='=>'int|null|string', 'flags_or_doc_comment='=>'int|null|string', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], -'runkit7_method_remove' => ['bool', 'class_name'=>'string', 'method_name'=>'string'], -'runkit7_method_rename' => ['bool', 'class_name'=>'string', 'source_method_name'=>'string', 'source_target_name'=>'string'], -'runkit7_superglobals' => ['array'], -'runkit7_zval_inspect' => ['array', 'value'=>'mixed'], -'runkit_class_adopt' => ['bool', 'classname'=>'string', 'parentname'=>'string'], -'runkit_class_emancipate' => ['bool', 'classname'=>'string'], -'runkit_constant_add' => ['bool', 'constname'=>'string', 'value'=>'mixed'], -'runkit_constant_redefine' => ['bool', 'constname'=>'string', 'newvalue'=>'mixed'], -'runkit_constant_remove' => ['bool', 'constname'=>'string'], -'runkit_function_add' => ['bool', 'funcname'=>'string', 'arglist'=>'string', 'code'=>'string', 'doccomment='=>'?string'], -'runkit_function_add\'1' => ['bool', 'funcname'=>'string', 'closure'=>'Closure', 'doccomment='=>'?string'], -'runkit_function_copy' => ['bool', 'funcname'=>'string', 'targetname'=>'string'], -'runkit_function_redefine' => ['bool', 'funcname'=>'string', 'arglist'=>'string', 'code'=>'string', 'doccomment='=>'?string'], -'runkit_function_redefine\'1' => ['bool', 'funcname'=>'string', 'closure'=>'Closure', 'doccomment='=>'?string'], -'runkit_function_remove' => ['bool', 'funcname'=>'string'], -'runkit_function_rename' => ['bool', 'funcname'=>'string', 'newname'=>'string'], -'runkit_import' => ['bool', 'filename'=>'string', 'flags='=>'int'], -'runkit_lint' => ['bool', 'code'=>'string'], -'runkit_lint_file' => ['bool', 'filename'=>'string'], -'runkit_method_add' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int', 'doccomment='=>'?string'], -'runkit_method_add\'1' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'closure'=>'Closure', 'flags='=>'int', 'doccomment='=>'?string'], -'runkit_method_copy' => ['bool', 'dclass'=>'string', 'dmethod'=>'string', 'sclass'=>'string', 'smethod='=>'string'], -'runkit_method_redefine' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int', 'doccomment='=>'?string'], -'runkit_method_redefine\'1' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'closure'=>'Closure', 'flags='=>'int', 'doccomment='=>'?string'], -'runkit_method_remove' => ['bool', 'classname'=>'string', 'methodname'=>'string'], -'runkit_method_rename' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'newname'=>'string'], -'runkit_return_value_used' => ['bool'], -'Runkit_Sandbox::__construct' => ['void', 'options='=>'array'], -'runkit_sandbox_output_handler' => ['mixed', 'sandbox'=>'object', 'callback='=>'mixed'], -'Runkit_Sandbox_Parent' => [''], -'Runkit_Sandbox_Parent::__construct' => ['void'], -'runkit_superglobals' => ['array'], -'runkit_zval_inspect' => ['array', 'value'=>'mixed'], -'RuntimeException::__clone' => ['void'], -'RuntimeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?RuntimeException'], -'RuntimeException::__toString' => ['string'], -'RuntimeException::getCode' => ['int'], -'RuntimeException::getFile' => ['string'], -'RuntimeException::getLine' => ['int'], -'RuntimeException::getMessage' => ['string'], -'RuntimeException::getPrevious' => ['Throwable|RuntimeException|null'], -'RuntimeException::getTrace' => ['list\',args?:array}>'], -'RuntimeException::getTraceAsString' => ['string'], -'SAMConnection::commit' => ['bool'], -'SAMConnection::connect' => ['bool', 'protocol'=>'string', 'properties='=>'array'], -'SAMConnection::disconnect' => ['bool'], -'SAMConnection::errno' => ['int'], -'SAMConnection::error' => ['string'], -'SAMConnection::isConnected' => ['bool'], -'SAMConnection::peek' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], -'SAMConnection::peekAll' => ['array', 'target'=>'string', 'properties='=>'array'], -'SAMConnection::receive' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], -'SAMConnection::remove' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], -'SAMConnection::rollback' => ['bool'], -'SAMConnection::send' => ['string', 'target'=>'string', 'msg'=>'sammessage', 'properties='=>'array'], -'SAMConnection::setDebug' => ['', 'switch'=>'bool'], -'SAMConnection::subscribe' => ['string', 'targettopic'=>'string'], -'SAMConnection::unsubscribe' => ['bool', 'subscriptionid'=>'string', 'targettopic='=>'string'], -'SAMMessage::body' => ['string'], -'SAMMessage::header' => ['object'], -'sapi_windows_cp_conv' => ['?string', 'in_codepage'=>'int|string', 'out_codepage'=>'int|string', 'subject'=>'string'], -'sapi_windows_cp_get' => ['int'], -'sapi_windows_cp_is_utf8' => ['bool'], -'sapi_windows_cp_set' => ['bool', 'codepage'=>'int'], -'sapi_windows_vt100_support' => ['bool', 'stream'=>'resource', 'enable='=>'bool'], -'Saxon\SaxonProcessor::__construct' => ['void', 'license='=>'bool', 'cwd='=>'string'], -'Saxon\SaxonProcessor::createAtomicValue' => ['Saxon\XdmValue', 'primitive_type_val'=>'bool|float|int|string'], -'Saxon\SaxonProcessor::newSchemaValidator' => ['Saxon\SchemaValidator'], -'Saxon\SaxonProcessor::newXPathProcessor' => ['Saxon\XPathProcessor'], -'Saxon\SaxonProcessor::newXQueryProcessor' => ['Saxon\XQueryProcessor'], -'Saxon\SaxonProcessor::newXsltProcessor' => ['Saxon\XsltProcessor'], -'Saxon\SaxonProcessor::parseXmlFromFile' => ['Saxon\XdmNode', 'fileName'=>'string'], -'Saxon\SaxonProcessor::parseXmlFromString' => ['Saxon\XdmNode', 'value'=>'string'], -'Saxon\SaxonProcessor::registerPHPFunctions' => ['void', 'library'=>'string'], -'Saxon\SaxonProcessor::setConfigurationProperty' => ['void', 'name'=>'string', 'value'=>'string'], -'Saxon\SaxonProcessor::setcwd' => ['void', 'cwd'=>'string'], -'Saxon\SaxonProcessor::setResourceDirectory' => ['void', 'dir'=>'string'], -'Saxon\SaxonProcessor::version' => ['string'], -'Saxon\SchemaValidator::clearParameters' => ['void'], -'Saxon\SchemaValidator::clearProperties' => ['void'], -'Saxon\SchemaValidator::exceptionClear' => ['void'], -'Saxon\SchemaValidator::getErrorCode' => ['string', 'i'=>'int'], -'Saxon\SchemaValidator::getErrorMessage' => ['string', 'i'=>'int'], -'Saxon\SchemaValidator::getExceptionCount' => ['int'], -'Saxon\SchemaValidator::getValidationReport' => ['Saxon\XdmNode'], -'Saxon\SchemaValidator::registerSchemaFromFile' => ['void', 'fileName'=>'string'], -'Saxon\SchemaValidator::registerSchemaFromString' => ['void', 'schemaStr'=>'string'], -'Saxon\SchemaValidator::setOutputFile' => ['void', 'fileName'=>'string'], -'Saxon\SchemaValidator::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], -'Saxon\SchemaValidator::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], -'Saxon\SchemaValidator::setSourceNode' => ['void', 'node'=>'Saxon\XdmNode'], -'Saxon\SchemaValidator::validate' => ['void', 'filename='=>'?string'], -'Saxon\SchemaValidator::validateToNode' => ['Saxon\XdmNode', 'filename='=>'?string'], -'Saxon\XdmAtomicValue::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], -'Saxon\XdmAtomicValue::getAtomicValue' => ['?Saxon\XdmAtomicValue'], -'Saxon\XdmAtomicValue::getBooleanValue' => ['bool'], -'Saxon\XdmAtomicValue::getDoubleValue' => ['float'], -'Saxon\XdmAtomicValue::getHead' => ['Saxon\XdmItem'], -'Saxon\XdmAtomicValue::getLongValue' => ['int'], -'Saxon\XdmAtomicValue::getNodeValue' => ['?Saxon\XdmNode'], -'Saxon\XdmAtomicValue::getStringValue' => ['string'], -'Saxon\XdmAtomicValue::isAtomic' => ['true'], -'Saxon\XdmAtomicValue::isNode' => ['bool'], -'Saxon\XdmAtomicValue::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], -'Saxon\XdmAtomicValue::size' => ['int'], -'Saxon\XdmItem::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], -'Saxon\XdmItem::getAtomicValue' => ['?Saxon\XdmAtomicValue'], -'Saxon\XdmItem::getHead' => ['Saxon\XdmItem'], -'Saxon\XdmItem::getNodeValue' => ['?Saxon\XdmNode'], -'Saxon\XdmItem::getStringValue' => ['string'], -'Saxon\XdmItem::isAtomic' => ['bool'], -'Saxon\XdmItem::isNode' => ['bool'], -'Saxon\XdmItem::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], -'Saxon\XdmItem::size' => ['int'], -'Saxon\XdmNode::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], -'Saxon\XdmNode::getAtomicValue' => ['?Saxon\XdmAtomicValue'], -'Saxon\XdmNode::getAttributeCount' => ['int'], -'Saxon\XdmNode::getAttributeNode' => ['?Saxon\XdmNode', 'index'=>'int'], -'Saxon\XdmNode::getAttributeValue' => ['?string', 'index'=>'int'], -'Saxon\XdmNode::getChildCount' => ['int'], -'Saxon\XdmNode::getChildNode' => ['?Saxon\XdmNode', 'index'=>'int'], -'Saxon\XdmNode::getHead' => ['Saxon\XdmItem'], -'Saxon\XdmNode::getNodeKind' => ['int'], -'Saxon\XdmNode::getNodeName' => ['string'], -'Saxon\XdmNode::getNodeValue' => ['?Saxon\XdmNode'], -'Saxon\XdmNode::getParent' => ['?Saxon\XdmNode'], -'Saxon\XdmNode::getStringValue' => ['string'], -'Saxon\XdmNode::isAtomic' => ['false'], -'Saxon\XdmNode::isNode' => ['bool'], -'Saxon\XdmNode::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], -'Saxon\XdmNode::size' => ['int'], -'Saxon\XdmValue::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], -'Saxon\XdmValue::getHead' => ['Saxon\XdmItem'], -'Saxon\XdmValue::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], -'Saxon\XdmValue::size' => ['int'], -'Saxon\XPathProcessor::clearParameters' => ['void'], -'Saxon\XPathProcessor::clearProperties' => ['void'], -'Saxon\XPathProcessor::declareNamespace' => ['void', 'prefix'=>'', 'namespace'=>''], -'Saxon\XPathProcessor::effectiveBooleanValue' => ['bool', 'xpathStr'=>'string'], -'Saxon\XPathProcessor::evaluate' => ['Saxon\XdmValue', 'xpathStr'=>'string'], -'Saxon\XPathProcessor::evaluateSingle' => ['Saxon\XdmItem', 'xpathStr'=>'string'], -'Saxon\XPathProcessor::exceptionClear' => ['void'], -'Saxon\XPathProcessor::getErrorCode' => ['string', 'i'=>'int'], -'Saxon\XPathProcessor::getErrorMessage' => ['string', 'i'=>'int'], -'Saxon\XPathProcessor::getExceptionCount' => ['int'], -'Saxon\XPathProcessor::setBaseURI' => ['void', 'uri'=>'string'], -'Saxon\XPathProcessor::setContextFile' => ['void', 'fileName'=>'string'], -'Saxon\XPathProcessor::setContextItem' => ['void', 'item'=>'Saxon\XdmItem'], -'Saxon\XPathProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], -'Saxon\XPathProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], -'Saxon\XQueryProcessor::clearParameters' => ['void'], -'Saxon\XQueryProcessor::clearProperties' => ['void'], -'Saxon\XQueryProcessor::declareNamespace' => ['void', 'prefix'=>'string', 'namespace'=>'string'], -'Saxon\XQueryProcessor::exceptionClear' => ['void'], -'Saxon\XQueryProcessor::getErrorCode' => ['string', 'i'=>'int'], -'Saxon\XQueryProcessor::getErrorMessage' => ['string', 'i'=>'int'], -'Saxon\XQueryProcessor::getExceptionCount' => ['int'], -'Saxon\XQueryProcessor::runQueryToFile' => ['void', 'outfilename'=>'string'], -'Saxon\XQueryProcessor::runQueryToString' => ['?string'], -'Saxon\XQueryProcessor::runQueryToValue' => ['?Saxon\XdmValue'], -'Saxon\XQueryProcessor::setContextItem' => ['void', 'object'=>'Saxon\XdmAtomicValue|Saxon\XdmItem|Saxon\XdmNode|Saxon\XdmValue'], -'Saxon\XQueryProcessor::setContextItemFromFile' => ['void', 'fileName'=>'string'], -'Saxon\XQueryProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], -'Saxon\XQueryProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], -'Saxon\XQueryProcessor::setQueryBaseURI' => ['void', 'uri'=>'string'], -'Saxon\XQueryProcessor::setQueryContent' => ['void', 'string'=>'string'], -'Saxon\XQueryProcessor::setQueryFile' => ['void', 'filename'=>'string'], -'Saxon\XQueryProcessor::setQueryItem' => ['void', 'item'=>'Saxon\XdmItem'], -'Saxon\XsltProcessor::clearParameters' => ['void'], -'Saxon\XsltProcessor::clearProperties' => ['void'], -'Saxon\XsltProcessor::compileFromFile' => ['void', 'fileName'=>'string'], -'Saxon\XsltProcessor::compileFromString' => ['void', 'string'=>'string'], -'Saxon\XsltProcessor::compileFromValue' => ['void', 'node'=>'Saxon\XdmNode'], -'Saxon\XsltProcessor::exceptionClear' => ['void'], -'Saxon\XsltProcessor::getErrorCode' => ['string', 'i'=>'int'], -'Saxon\XsltProcessor::getErrorMessage' => ['string', 'i'=>'int'], -'Saxon\XsltProcessor::getExceptionCount' => ['int'], -'Saxon\XsltProcessor::setOutputFile' => ['void', 'fileName'=>'string'], -'Saxon\XsltProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], -'Saxon\XsltProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], -'Saxon\XsltProcessor::setSourceFromFile' => ['void', 'filename'=>'string'], -'Saxon\XsltProcessor::setSourceFromXdmValue' => ['void', 'value'=>'Saxon\XdmValue'], -'Saxon\XsltProcessor::transformFileToFile' => ['void', 'sourceFileName'=>'string', 'stylesheetFileName'=>'string', 'outputfileName'=>'string'], -'Saxon\XsltProcessor::transformFileToString' => ['?string', 'sourceFileName'=>'string', 'stylesheetFileName'=>'string'], -'Saxon\XsltProcessor::transformFileToValue' => ['Saxon\XdmValue', 'fileName'=>'string'], -'Saxon\XsltProcessor::transformToFile' => ['void'], -'Saxon\XsltProcessor::transformToString' => ['string'], -'Saxon\XsltProcessor::transformToValue' => ['?Saxon\XdmValue'], -'SCA::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], -'SCA::getService' => ['', 'target'=>'string', 'binding='=>'string', 'config='=>'array'], -'SCA_LocalProxy::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], -'SCA_SoapProxy::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], -'scalebarObj::convertToString' => ['string'], -'scalebarObj::free' => ['void'], -'scalebarObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'scalebarObj::setImageColor' => ['int', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'scalebarObj::updateFromString' => ['int', 'snippet'=>'string'], -'scandir' => ['list|false', 'directory'=>'string', 'sorting_order='=>'int', 'context='=>'resource'], -'SDO_DAS_ChangeSummary::beginLogging' => [''], -'SDO_DAS_ChangeSummary::endLogging' => [''], -'SDO_DAS_ChangeSummary::getChangedDataObjects' => ['SDO_List'], -'SDO_DAS_ChangeSummary::getChangeType' => ['int', 'dataobject'=>'sdo_dataobject'], -'SDO_DAS_ChangeSummary::getOldContainer' => ['SDO_DataObject', 'data_object'=>'sdo_dataobject'], -'SDO_DAS_ChangeSummary::getOldValues' => ['SDO_List', 'data_object'=>'sdo_dataobject'], -'SDO_DAS_ChangeSummary::isLogging' => ['bool'], -'SDO_DAS_DataFactory::addPropertyToType' => ['', 'parent_type_namespace_uri'=>'string', 'parent_type_name'=>'string', 'property_name'=>'string', 'type_namespace_uri'=>'string', 'type_name'=>'string', 'options='=>'array'], -'SDO_DAS_DataFactory::addType' => ['', 'type_namespace_uri'=>'string', 'type_name'=>'string', 'options='=>'array'], -'SDO_DAS_DataFactory::getDataFactory' => ['SDO_DAS_DataFactory'], -'SDO_DAS_DataObject::getChangeSummary' => ['SDO_DAS_ChangeSummary'], -'SDO_DAS_Relational::__construct' => ['void', 'database_metadata'=>'array', 'application_root_type='=>'string', 'sdo_containment_references_metadata='=>'array'], -'SDO_DAS_Relational::applyChanges' => ['', 'database_handle'=>'pdo', 'root_data_object'=>'sdodataobject'], -'SDO_DAS_Relational::createRootDataObject' => ['SDODataObject'], -'SDO_DAS_Relational::executePreparedQuery' => ['SDODataObject', 'database_handle'=>'pdo', 'prepared_statement'=>'pdostatement', 'value_list'=>'array', 'column_specifier='=>'array'], -'SDO_DAS_Relational::executeQuery' => ['SDODataObject', 'database_handle'=>'pdo', 'sql_statement'=>'string', 'column_specifier='=>'array'], -'SDO_DAS_Setting::getListIndex' => ['int'], -'SDO_DAS_Setting::getPropertyIndex' => ['int'], -'SDO_DAS_Setting::getPropertyName' => ['string'], -'SDO_DAS_Setting::getValue' => [''], -'SDO_DAS_Setting::isSet' => ['bool'], -'SDO_DAS_XML::addTypes' => ['', 'xsd_file'=>'string'], -'SDO_DAS_XML::create' => ['SDO_DAS_XML', 'xsd_file='=>'mixed', 'key='=>'string'], -'SDO_DAS_XML::createDataObject' => ['SDO_DataObject', 'namespace_uri'=>'string', 'type_name'=>'string'], -'SDO_DAS_XML::createDocument' => ['SDO_DAS_XML_Document', 'document_element_name'=>'string', 'document_element_namespace_uri'=>'string', 'dataobject='=>'sdo_dataobject'], -'SDO_DAS_XML::loadFile' => ['SDO_XMLDocument', 'xml_file'=>'string'], -'SDO_DAS_XML::loadString' => ['SDO_DAS_XML_Document', 'xml_string'=>'string'], -'SDO_DAS_XML::saveFile' => ['', 'xdoc'=>'sdo_xmldocument', 'xml_file'=>'string', 'indent='=>'int'], -'SDO_DAS_XML::saveString' => ['string', 'xdoc'=>'sdo_xmldocument', 'indent='=>'int'], -'SDO_DAS_XML_Document::getRootDataObject' => ['SDO_DataObject'], -'SDO_DAS_XML_Document::getRootElementName' => ['string'], -'SDO_DAS_XML_Document::getRootElementURI' => ['string'], -'SDO_DAS_XML_Document::setEncoding' => ['', 'encoding'=>'string'], -'SDO_DAS_XML_Document::setXMLDeclaration' => ['', 'xmldeclatation'=>'bool'], -'SDO_DAS_XML_Document::setXMLVersion' => ['', 'xmlversion'=>'string'], -'SDO_DataFactory::create' => ['void', 'type_namespace_uri'=>'string', 'type_name'=>'string'], -'SDO_DataObject::clear' => ['void'], -'SDO_DataObject::createDataObject' => ['SDO_DataObject', 'identifier'=>''], -'SDO_DataObject::getContainer' => ['SDO_DataObject'], -'SDO_DataObject::getSequence' => ['SDO_Sequence'], -'SDO_DataObject::getTypeName' => ['string'], -'SDO_DataObject::getTypeNamespaceURI' => ['string'], -'SDO_Exception::getCause' => [''], -'SDO_List::insert' => ['void', 'value'=>'mixed', 'index='=>'int'], -'SDO_Model_Property::getContainingType' => ['SDO_Model_Type'], -'SDO_Model_Property::getDefault' => [''], -'SDO_Model_Property::getName' => ['string'], -'SDO_Model_Property::getType' => ['SDO_Model_Type'], -'SDO_Model_Property::isContainment' => ['bool'], -'SDO_Model_Property::isMany' => ['bool'], -'SDO_Model_ReflectionDataObject::__construct' => ['void', 'data_object'=>'sdo_dataobject'], -'SDO_Model_ReflectionDataObject::export' => ['mixed', 'rdo'=>'sdo_model_reflectiondataobject', 'return='=>'bool'], -'SDO_Model_ReflectionDataObject::getContainmentProperty' => ['SDO_Model_Property'], -'SDO_Model_ReflectionDataObject::getInstanceProperties' => ['array'], -'SDO_Model_ReflectionDataObject::getType' => ['SDO_Model_Type'], -'SDO_Model_Type::getBaseType' => ['SDO_Model_Type'], -'SDO_Model_Type::getName' => ['string'], -'SDO_Model_Type::getNamespaceURI' => ['string'], -'SDO_Model_Type::getProperties' => ['array'], -'SDO_Model_Type::getProperty' => ['SDO_Model_Property', 'identifier'=>''], -'SDO_Model_Type::isAbstractType' => ['bool'], -'SDO_Model_Type::isDataType' => ['bool'], -'SDO_Model_Type::isInstance' => ['bool', 'data_object'=>'sdo_dataobject'], -'SDO_Model_Type::isOpenType' => ['bool'], -'SDO_Model_Type::isSequencedType' => ['bool'], -'SDO_Sequence::getProperty' => ['SDO_Model_Property', 'sequence_index'=>'int'], -'SDO_Sequence::insert' => ['void', 'value'=>'mixed', 'sequenceindex='=>'int', 'propertyidentifier='=>'mixed'], -'SDO_Sequence::move' => ['void', 'toindex'=>'int', 'fromindex'=>'int'], -'SeasLog::__destruct' => ['void'], -'SeasLog::alert' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], -'SeasLog::analyzerCount' => ['mixed', 'level'=>'string', 'log_path='=>'string', 'key_word='=>'string'], -'SeasLog::analyzerDetail' => ['mixed', 'level'=>'string', 'log_path='=>'string', 'key_word='=>'string', 'start='=>'int', 'limit='=>'int', 'order='=>'int'], -'SeasLog::closeLoggerStream' => ['bool', 'model'=>'int', 'logger'=>'string'], -'SeasLog::critical' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], -'SeasLog::debug' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], -'SeasLog::emergency' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], -'SeasLog::error' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], -'SeasLog::flushBuffer' => ['bool'], -'SeasLog::getBasePath' => ['string'], -'SeasLog::getBuffer' => ['array'], -'SeasLog::getBufferEnabled' => ['bool'], -'SeasLog::getDatetimeFormat' => ['string'], -'SeasLog::getLastLogger' => ['string'], -'SeasLog::getRequestID' => ['string'], -'SeasLog::getRequestVariable' => ['bool', 'key'=>'int'], -'SeasLog::info' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], -'SeasLog::log' => ['bool', 'level'=>'string', 'message='=>'string', 'content='=>'array', 'logger='=>'string'], -'SeasLog::notice' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], -'SeasLog::setBasePath' => ['bool', 'base_path'=>'string'], -'SeasLog::setDatetimeFormat' => ['bool', 'format'=>'string'], -'SeasLog::setLogger' => ['bool', 'logger'=>'string'], -'SeasLog::setRequestID' => ['bool', 'request_id'=>'string'], -'SeasLog::setRequestVariable' => ['bool', 'key'=>'int', 'value'=>'string'], -'SeasLog::warning' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], -'seaslog_get_author' => ['string'], -'seaslog_get_version' => ['string'], -'SeekableIterator::__construct' => ['void'], -'SeekableIterator::current' => ['mixed'], -'SeekableIterator::key' => ['int|string'], -'SeekableIterator::next' => ['void'], -'SeekableIterator::rewind' => ['void'], -'SeekableIterator::seek' => ['void', 'position'=>'int'], -'SeekableIterator::valid' => ['bool'], -'sem_acquire' => ['bool', 'semaphore'=>'resource', 'non_blocking='=>'bool'], -'sem_get' => ['resource|false', 'key'=>'int', 'max_acquire='=>'int', 'permissions='=>'int', 'auto_release='=>'int'], -'sem_release' => ['bool', 'semaphore'=>'resource'], -'sem_remove' => ['bool', 'semaphore'=>'resource'], -'Serializable::__construct' => ['void'], -'Serializable::serialize' => ['?string'], -'Serializable::unserialize' => ['void', 'serialized'=>'string'], -'serialize' => ['string', 'value'=>'mixed'], -'ServerRequest::withInput' => ['ServerRequest', 'input'=>'mixed'], -'ServerRequest::withoutParams' => ['ServerRequest', 'params'=>'int|string'], -'ServerRequest::withParam' => ['ServerRequest', 'key'=>'int|string', 'value'=>'mixed'], -'ServerRequest::withParams' => ['ServerRequest', 'params'=>'mixed'], -'ServerRequest::withUrl' => ['ServerRequest', 'url'=>'array'], -'ServerResponse::addHeader' => ['void', 'label'=>'string', 'value'=>'string'], -'ServerResponse::date' => ['string', 'date'=>'string|DateTimeInterface'], -'ServerResponse::getHeader' => ['string', 'label'=>'string'], -'ServerResponse::getHeaders' => ['string[]'], -'ServerResponse::getStatus' => ['int'], -'ServerResponse::getVersion' => ['string'], -'ServerResponse::setHeader' => ['void', 'label'=>'string', 'value'=>'string'], -'ServerResponse::setStatus' => ['void', 'status'=>'int'], -'ServerResponse::setVersion' => ['void', 'version'=>'string'], -'session_abort' => ['bool'], -'session_cache_expire' => ['int', 'value='=>'int'], -'session_cache_limiter' => ['string', 'value='=>'string'], -'session_commit' => ['bool'], -'session_create_id' => ['string', 'prefix='=>'string'], -'session_decode' => ['bool', 'data'=>'string'], -'session_destroy' => ['bool'], -'session_encode' => ['string'], -'session_gc' => ['int|false'], -'session_get_cookie_params' => ['array'], -'session_id' => ['string|false', 'id='=>'string'], -'session_is_registered' => ['bool', 'name'=>'string'], -'session_module_name' => ['string', 'module='=>'string'], -'session_name' => ['string|false', 'name='=>'string'], -'session_pgsql_add_error' => ['bool', 'error_level'=>'int', 'error_message='=>'string'], -'session_pgsql_get_error' => ['array', 'with_error_message='=>'bool'], -'session_pgsql_get_field' => ['string'], -'session_pgsql_reset' => ['bool'], -'session_pgsql_set_field' => ['bool', 'value'=>'string'], -'session_pgsql_status' => ['array'], -'session_regenerate_id' => ['bool', 'delete_old_session='=>'bool'], -'session_register' => ['bool', 'name'=>'mixed', '...args='=>'mixed'], -'session_register_shutdown' => ['void'], -'session_reset' => ['bool'], -'session_save_path' => ['string', 'path='=>'string'], -'session_set_cookie_params' => ['bool', 'lifetime'=>'int', 'path='=>'?string', 'domain='=>'?string', 'secure='=>'?bool', 'httponly='=>'?bool'], -'session_set_cookie_params\'1' => ['bool', 'options'=>'array{lifetime?:?int,path?:?string,domain?:?string,secure?:?bool,httponly?:?bool,samesite?:?string}'], -'session_set_save_handler' => ['bool', 'open'=>'callable(string,string):bool', 'close'=>'callable():bool', 'read'=>'callable(string):string', 'write'=>'callable(string,string):bool', 'destroy'=>'callable(string):bool', 'gc'=>'callable(string):bool', 'create_sid='=>'callable():string', 'validate_sid='=>'callable(string):bool', 'update_timestamp='=>'callable(string):bool'], -'session_set_save_handler\'1' => ['bool', 'open'=>'SessionHandlerInterface', 'close='=>'bool'], -'session_start' => ['bool', 'options='=>'array'], -'session_status' => ['int'], -'session_unregister' => ['bool', 'name'=>'string'], -'session_unset' => ['bool'], -'session_write_close' => ['bool'], -'SessionHandler::close' => ['bool'], -'SessionHandler::create_sid' => ['char'], -'SessionHandler::destroy' => ['bool', 'id'=>'string'], -'SessionHandler::gc' => ['bool', 'maxlifetime'=>'int'], -'SessionHandler::open' => ['bool', 'save_path'=>'string', 'session_name'=>'string'], -'SessionHandler::read' => ['string', 'id'=>'string'], -'SessionHandler::updateTimestamp' => ['bool', 'session_id'=>'string', 'session_data'=>'string'], -'SessionHandler::validateId' => ['bool', 'session_id'=>'string'], -'SessionHandler::write' => ['bool', 'id'=>'string', 'data'=>'string'], -'SessionHandlerInterface::close' => ['bool'], -'SessionHandlerInterface::destroy' => ['bool', 'id'=>'string'], -'SessionHandlerInterface::gc' => ['int|false', 'max_lifetime'=>'int'], -'SessionHandlerInterface::open' => ['bool', 'path'=>'string', 'name'=>'string'], -'SessionHandlerInterface::read' => ['string|false', 'id'=>'string'], -'SessionHandlerInterface::write' => ['bool', 'id'=>'string', 'data'=>'string'], -'SessionIdInterface::create_sid' => ['string'], -'SessionUpdateTimestampHandler::updateTimestamp' => ['bool', 'id'=>'string', 'data'=>'string'], -'SessionUpdateTimestampHandler::validateId' => ['char', 'id'=>'string'], -'SessionUpdateTimestampHandlerInterface::updateTimestamp' => ['bool', 'key'=>'string', 'value'=>'string'], -'SessionUpdateTimestampHandlerInterface::validateId' => ['bool', 'key'=>'string'], -'set_error_handler' => ['null|callable(int,string,string=,int=,array=):bool', 'callback'=>'null|callable(int,string,string=,int=,array=):bool', 'error_levels='=>'int'], -'set_exception_handler' => ['null|callable(Throwable):void', 'callback'=>'null|callable(Throwable):void'], -'set_file_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], -'set_include_path' => ['string|false', 'include_path'=>'string'], -'set_magic_quotes_runtime' => ['bool', 'new_setting'=>'bool'], -'set_time_limit' => ['bool', 'seconds'=>'int'], -'setcookie' => ['bool', 'name'=>'string', 'value='=>'string', 'expires='=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool', 'samesite='=>'string', 'url_encode='=>'int'], -'setcookie\'1' => ['bool', 'name'=>'string', 'value='=>'string', 'options='=>'array'], -'setLeftFill' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], -'setLine' => ['void', 'width'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], -'setlocale' => ['string|false', 'category'=>'int', 'locales'=>'string|0|null', '...rest='=>'string'], -'setlocale\'1' => ['string|false', 'category'=>'int', 'locales'=>'?array'], -'setproctitle' => ['void', 'title'=>'string'], -'setrawcookie' => ['bool', 'name'=>'string', 'value='=>'string', 'expires='=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool'], -'setrawcookie\'1' => ['bool', 'name'=>'string', 'value='=>'string', 'options='=>'array'], -'setRightFill' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], -'setthreadtitle' => ['bool', 'title'=>'string'], -'settype' => ['bool', '&rw_var'=>'mixed', 'type'=>'string'], -'sha1' => ['string', 'string'=>'string', 'binary='=>'bool'], -'sha1_file' => ['string|false', 'filename'=>'string', 'binary='=>'bool'], -'sha256' => ['string', 'string'=>'string', 'raw_output='=>'bool'], -'sha256_file' => ['string', 'filename'=>'string', 'raw_output='=>'bool'], -'shapefileObj::__construct' => ['void', 'filename'=>'string', 'type'=>'int'], -'shapefileObj::addPoint' => ['int', 'point'=>'pointObj'], -'shapefileObj::addShape' => ['int', 'shape'=>'shapeObj'], -'shapefileObj::free' => ['void'], -'shapefileObj::getExtent' => ['rectObj', 'i'=>'int'], -'shapefileObj::getPoint' => ['shapeObj', 'i'=>'int'], -'shapefileObj::getShape' => ['shapeObj', 'i'=>'int'], -'shapefileObj::getTransformed' => ['shapeObj', 'map'=>'mapObj', 'i'=>'int'], -'shapefileObj::ms_newShapefileObj' => ['shapefileObj', 'filename'=>'string', 'type'=>'int'], -'shapeObj::__construct' => ['void', 'type'=>'int'], -'shapeObj::add' => ['int', 'line'=>'lineObj'], -'shapeObj::boundary' => ['shapeObj'], -'shapeObj::contains' => ['bool', 'point'=>'pointObj'], -'shapeObj::containsShape' => ['int', 'shape2'=>'shapeObj'], -'shapeObj::convexhull' => ['shapeObj'], -'shapeObj::crosses' => ['int', 'shape'=>'shapeObj'], -'shapeObj::difference' => ['shapeObj', 'shape'=>'shapeObj'], -'shapeObj::disjoint' => ['int', 'shape'=>'shapeObj'], -'shapeObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj'], -'shapeObj::equals' => ['int', 'shape'=>'shapeObj'], -'shapeObj::free' => ['void'], -'shapeObj::getArea' => ['float'], -'shapeObj::getCentroid' => ['pointObj'], -'shapeObj::getLabelPoint' => ['pointObj'], -'shapeObj::getLength' => ['float'], -'shapeObj::getPointUsingMeasure' => ['pointObj', 'm'=>'float'], -'shapeObj::getValue' => ['string', 'layer'=>'layerObj', 'filedname'=>'string'], -'shapeObj::intersection' => ['shapeObj', 'shape'=>'shapeObj'], -'shapeObj::intersects' => ['bool', 'shape'=>'shapeObj'], -'shapeObj::line' => ['lineObj', 'i'=>'int'], -'shapeObj::ms_shapeObjFromWkt' => ['shapeObj', 'wkt'=>'string'], -'shapeObj::overlaps' => ['int', 'shape'=>'shapeObj'], -'shapeObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], -'shapeObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'shapeObj::setBounds' => ['int'], -'shapeObj::simplify' => ['shapeObj|null', 'tolerance'=>'float'], -'shapeObj::symdifference' => ['shapeObj', 'shape'=>'shapeObj'], -'shapeObj::topologyPreservingSimplify' => ['shapeObj|null', 'tolerance'=>'float'], -'shapeObj::touches' => ['int', 'shape'=>'shapeObj'], -'shapeObj::toWkt' => ['string'], -'shapeObj::union' => ['shapeObj', 'shape'=>'shapeObj'], -'shapeObj::within' => ['int', 'shape2'=>'shapeObj'], -'shell_exec' => ['string|false|null', 'command'=>'string'], -'shm_attach' => ['resource', 'key'=>'int', 'size='=>'int', 'permissions='=>'int'], -'shm_detach' => ['bool', 'shm'=>'resource'], -'shm_get_var' => ['mixed', 'shm'=>'resource', 'key'=>'int'], -'shm_has_var' => ['bool', 'shm'=>'resource', 'key'=>'int'], -'shm_put_var' => ['bool', 'shm'=>'resource', 'key'=>'int', 'value'=>'mixed'], -'shm_remove' => ['bool', 'shm'=>'resource'], -'shm_remove_var' => ['bool', 'shm'=>'resource', 'key'=>'int'], -'shmop_close' => ['void', 'shmop'=>'resource'], -'shmop_delete' => ['bool', 'shmop'=>'resource'], -'shmop_open' => ['resource|false', 'key'=>'int', 'mode'=>'string', 'permissions'=>'int', 'size'=>'int'], -'shmop_read' => ['string|false', 'shmop'=>'resource', 'offset'=>'int', 'size'=>'int'], -'shmop_size' => ['int', 'shmop'=>'resource'], -'shmop_write' => ['int|false', 'shmop'=>'resource', 'data'=>'string', 'offset'=>'int'], -'show_source' => ['string|bool', 'filename'=>'string', 'return='=>'bool'], -'shuffle' => ['bool', '&rw_array'=>'array'], -'signeurlpaiement' => ['string', 'clent'=>'string', 'data'=>'string'], -'similar_text' => ['int', 'string1'=>'string', 'string2'=>'string', '&w_percent='=>'float'], -'simplexml_import_dom' => ['SimpleXMLElement|false', 'node'=>'DOMNode', 'class_name='=>'string'], -'simplexml_load_file' => ['SimpleXMLElement|false', 'filename'=>'string', 'class_name='=>'string', 'options='=>'int', 'namespace_or_prefix='=>'string', 'is_prefix='=>'bool'], -'simplexml_load_string' => ['SimpleXMLElement|false', 'data'=>'string', 'class_name='=>'string', 'options='=>'int', 'namespace_or_prefix='=>'string', 'is_prefix='=>'bool'], -'SimpleXMLElement::__construct' => ['void', 'data'=>'string', 'options='=>'int', 'data_is_url='=>'bool', 'ns='=>'string', 'is_prefix='=>'bool'], -'SimpleXMLElement::__get' => ['SimpleXMLElement', 'name'=>'string'], -'SimpleXMLElement::__toString' => ['string'], -'SimpleXMLElement::addAttribute' => ['void', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], -'SimpleXMLElement::addChild' => ['SimpleXMLElement', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], -'SimpleXMLElement::asXML' => ['bool', 'filename'=>'string'], -'SimpleXMLElement::asXML\'1' => ['string|false'], -'SimpleXMLElement::attributes' => ['?SimpleXMLElement', 'ns='=>'string', 'is_prefix='=>'bool'], -'SimpleXMLElement::children' => ['SimpleXMLElement', 'ns='=>'string', 'is_prefix='=>'bool'], -'SimpleXMLElement::count' => ['int'], -'SimpleXMLElement::getDocNamespaces' => ['string[]', 'recursive='=>'bool', 'from_root='=>'bool'], -'SimpleXMLElement::getName' => ['string'], -'SimpleXMLElement::getNamespaces' => ['string[]', 'recursive='=>'bool'], -'SimpleXMLElement::offsetExists' => ['bool', 'offset'=>'int|string'], -'SimpleXMLElement::offsetGet' => ['SimpleXMLElement', 'offset'=>'int|string'], -'SimpleXMLElement::offsetSet' => ['void', 'offset'=>'int|string', 'value'=>'mixed'], -'SimpleXMLElement::offsetUnset' => ['void', 'offset'=>'int|string'], -'SimpleXMLElement::registerXPathNamespace' => ['bool', 'prefix'=>'string', 'ns'=>'string'], -'SimpleXMLElement::saveXML' => ['mixed', 'filename='=>'string'], -'SimpleXMLElement::xpath' => ['SimpleXMLElement[]|false', 'path'=>'string'], -'sin' => ['float', 'num'=>'float'], -'sinh' => ['float', 'num'=>'float'], -'sizeof' => ['int', 'value'=>'Countable|array', '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'], -'snmp2_real_walk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp2_set' => ['bool', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp2_walk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp3_get' => ['string|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp3_getnext' => ['string|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp3_real_walk' => ['array|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp3_set' => ['bool', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp3_walk' => ['array|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'SNMP::__construct' => ['void', 'version'=>'int', 'hostname'=>'string', 'community'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'SNMP::close' => ['bool'], -'SNMP::get' => ['array|string|false', 'objectId'=>'string|array', 'preserveKeys='=>'bool'], -'SNMP::getErrno' => ['int'], -'SNMP::getError' => ['string'], -'SNMP::getnext' => ['string|array|false', 'objectId'=>'string|array'], -'SNMP::set' => ['bool', 'objectId'=>'string|array', 'type'=>'string|array', 'value'=>'mixed'], -'SNMP::setSecurity' => ['bool', 'securityLevel'=>'string', 'authProtocol='=>'string', 'authPassphrase='=>'string', 'privacyProtocol='=>'string', 'privacyPassphrase='=>'string', 'contextName='=>'string', 'contextEngineId='=>'string'], -'SNMP::walk' => ['array|false', 'objectId'=>'string', 'suffixAsKey='=>'bool', 'maxRepetitions='=>'int', 'nonRepeaters='=>'int'], -'snmp_get_quick_print' => ['bool'], -'snmp_get_valueretrieval' => ['int'], -'snmp_read_mib' => ['bool', 'filename'=>'string'], -'snmp_set_enum_print' => ['bool', 'enable'=>'int'], -'snmp_set_oid_numeric_print' => ['void', 'format'=>'int'], -'snmp_set_oid_output_format' => ['bool', 'format'=>'int'], -'snmp_set_quick_print' => ['bool', 'enable'=>'bool'], -'snmp_set_valueretrieval' => ['bool', 'method='=>'int'], -'snmpget' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmpgetnext' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmprealwalk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmpset' => ['bool', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'mixed', 'timeout='=>'int', 'retries='=>'int'], -'snmpwalk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmpwalkoid' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'SoapClient::__call' => ['', 'function_name'=>'string', 'arguments'=>'array'], -'SoapClient::__construct' => ['void', 'wsdl'=>'mixed', 'options='=>'array|null'], -'SoapClient::__doRequest' => ['?string', 'request'=>'string', 'location'=>'string', 'action'=>'string', 'version'=>'int', 'one_way='=>'bool'], -'SoapClient::__getCookies' => ['array'], -'SoapClient::__getFunctions' => ['?array'], -'SoapClient::__getLastRequest' => ['?string'], -'SoapClient::__getLastRequestHeaders' => ['?string'], -'SoapClient::__getLastResponse' => ['?string'], -'SoapClient::__getLastResponseHeaders' => ['?string'], -'SoapClient::__getTypes' => ['?array'], -'SoapClient::__setCookie' => ['', 'name'=>'string', 'value='=>'string'], -'SoapClient::__setLocation' => ['string', 'new_location='=>'string'], -'SoapClient::__setSoapHeaders' => ['bool', 'soapheaders='=>''], -'SoapClient::__soapCall' => ['', 'function_name'=>'string', 'arguments'=>'array', 'options='=>'array', 'input_headers='=>'SoapHeader|array', '&w_output_headers='=>'array'], -'SoapClient::SoapClient' => ['object', 'wsdl'=>'mixed', 'options='=>'array|null'], -'SoapFault::__clone' => ['void'], -'SoapFault::__construct' => ['void', 'code'=>'array|string|null', 'string'=>'string', 'actor='=>'?string', 'details='=>'?mixed', 'name='=>'?string', 'headerFault='=>'?mixed'], -'SoapFault::__toString' => ['string'], -'SoapFault::__wakeup' => ['void'], -'SoapFault::getCode' => ['int'], -'SoapFault::getFile' => ['string'], -'SoapFault::getLine' => ['int'], -'SoapFault::getMessage' => ['string'], -'SoapFault::getPrevious' => ['?Exception|?Throwable'], -'SoapFault::getTrace' => ['list\',args?:array}>'], -'SoapFault::getTraceAsString' => ['string'], -'SoapFault::SoapFault' => ['object', 'faultcode'=>'string', 'faultstring'=>'string', 'faultactor='=>'?string', 'detail='=>'?mixed', 'faultname='=>'?string', 'headerfault='=>'?mixed'], -'SoapHeader::__construct' => ['void', 'namespace'=>'string', 'name'=>'string', 'data='=>'mixed', 'mustunderstand='=>'bool', 'actor='=>'string'], -'SoapHeader::SoapHeader' => ['object', 'namespace'=>'string', 'name'=>'string', 'data='=>'mixed', 'mustunderstand='=>'bool', 'actor='=>'string'], -'SoapParam::__construct' => ['void', 'data'=>'mixed', 'name'=>'string'], -'SoapParam::SoapParam' => ['object', 'data'=>'mixed', 'name'=>'string'], -'SoapServer::__construct' => ['void', 'wsdl'=>'?string', 'options='=>'array'], -'SoapServer::addFunction' => ['void', 'functions'=>'mixed'], -'SoapServer::addSoapHeader' => ['void', 'object'=>'SoapHeader'], -'SoapServer::fault' => ['void', 'code'=>'string', 'string'=>'string', 'actor='=>'string', 'details='=>'string', 'name='=>'string'], -'SoapServer::getFunctions' => ['array'], -'SoapServer::handle' => ['void', 'soap_request='=>'string'], -'SoapServer::setClass' => ['void', 'class_name'=>'string', '...args='=>'mixed'], -'SoapServer::setObject' => ['void', 'object'=>'object'], -'SoapServer::setPersistence' => ['void', 'mode'=>'int'], -'SoapServer::SoapServer' => ['object', 'wsdl'=>'?string', 'options='=>'array'], -'SoapVar::__construct' => ['void', 'data'=>'mixed', 'encoding'=>'int', 'type_name='=>'string|null', 'type_namespace='=>'string|null', 'node_name='=>'string|null', 'node_namespace='=>'string|null'], -'SoapVar::SoapVar' => ['object', 'data'=>'mixed', 'encoding'=>'int', 'type_name='=>'string|null', 'type_namespace='=>'string|null', 'node_name='=>'string|null', 'node_namespace='=>'string|null'], -'socket_accept' => ['Socket|false', 'socket'=>'Socket'], -'socket_addrinfo_bind' => ['Socket|false', 'address'=>'AddressInfo'], -'socket_addrinfo_connect' => ['Socket|false', 'address'=>'AddressInfo'], -'socket_addrinfo_explain' => ['array', 'address'=>'AddressInfo'], -'socket_addrinfo_lookup' => ['false|AddressInfo[]', 'host='=>'string|null', 'service='=>'mixed', 'hints='=>'array'], -'socket_bind' => ['bool', 'socket'=>'Socket', 'addr'=>'string', 'port='=>'int'], -'socket_clear_error' => ['void', 'socket='=>'Socket'], -'socket_close' => ['void', 'socket'=>'Socket'], -'socket_cmsg_space' => ['int', 'level'=>'int', 'type'=>'int'], -'socket_connect' => ['bool', 'socket'=>'Socket', 'addr'=>'string', 'port='=>'int'], -'socket_create' => ['Socket|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], -'socket_create_listen' => ['Socket|false', 'port'=>'int', 'backlog='=>'int'], -'socket_create_pair' => ['bool', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int', '&w_fd'=>'Socket[]'], -'socket_export_stream' => ['resource|false', 'socket'=>'Socket'], -'socket_get_option' => ['mixed|false', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int'], -'socket_get_status' => ['array', 'stream'=>'Socket'], -'socket_getopt' => ['mixed', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int'], -'socket_getpeername' => ['bool', 'socket'=>'Socket', '&w_addr'=>'string', '&w_port='=>'int'], -'socket_getsockname' => ['bool', 'socket'=>'Socket', '&w_addr'=>'string', '&w_port='=>'int'], -'socket_import_stream' => ['Socket|false|null', 'stream'=>'resource'], -'socket_last_error' => ['int', 'socket='=>'Socket'], -'socket_listen' => ['bool', 'socket'=>'Socket', 'backlog='=>'int'], -'socket_read' => ['string|false', 'socket'=>'Socket', 'length'=>'int', 'type='=>'int'], -'socket_recv' => ['int|false', 'socket'=>'Socket', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int'], -'socket_recvfrom' => ['int|false', 'socket'=>'Socket', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int', '&w_name'=>'string', '&w_port='=>'int'], -'socket_recvmsg' => ['int|false', 'socket'=>'Socket', '&w_message'=>'string', 'flags='=>'int'], -'socket_select' => ['int|false', '&rw_read_fds'=>'Socket[]|null', '&rw_write_fds'=>'Socket[]|null', '&rw_except_fds'=>'Socket[]|null', 'tv_sec'=>'int|null', 'tv_usec='=>'int'], -'socket_send' => ['int|false', 'socket'=>'Socket', 'buf'=>'string', 'length'=>'int', 'flags'=>'int'], -'socket_sendmsg' => ['int|false', 'socket'=>'Socket', 'message'=>'array', 'flags'=>'int'], -'socket_sendto' => ['int|false', 'socket'=>'Socket', 'buf'=>'string', 'length'=>'int', 'flags'=>'int', 'addr'=>'string', 'port='=>'int'], -'socket_set_block' => ['bool', 'socket'=>'Socket'], -'socket_set_blocking' => ['bool', 'socket'=>'Socket', 'mode'=>'int'], -'socket_set_nonblock' => ['bool', 'socket'=>'Socket'], -'socket_set_option' => ['bool', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], -'socket_set_timeout' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], -'socket_setopt' => ['void', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], -'socket_shutdown' => ['bool', 'socket'=>'Socket', 'how='=>'int'], -'socket_strerror' => ['string', 'errno'=>'int'], -'socket_write' => ['int|false', 'socket'=>'Socket', 'data'=>'string', 'length='=>'int|null'], -'socket_wsaprotocol_info_export' => ['string|false', 'socket'=>'Socket', 'process_id'=>'int'], -'socket_wsaprotocol_info_import' => ['Socket|false', 'info_id'=>'string'], -'socket_wsaprotocol_info_release' => ['bool', 'info_id'=>'string'], -'sodium_add' => ['void', '&rw_string1'=>'string', 'string2'=>'string'], -'sodium_base642bin' => ['string', 'string'=>'string', 'id'=>'int', 'ignore='=>'string'], -'sodium_bin2base64' => ['string', 'string'=>'string', 'id'=>'int'], -'sodium_bin2hex' => ['string', 'string'=>'string'], -'sodium_compare' => ['int', 'string1'=>'string', 'string2'=>'string'], -'sodium_crypto_aead_aes256gcm_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_aes256gcm_encrypt' => ['string', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_aes256gcm_is_available' => ['bool'], -'sodium_crypto_aead_aes256gcm_keygen' => ['string'], -'sodium_crypto_aead_chacha20poly1305_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_chacha20poly1305_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_chacha20poly1305_ietf_keygen' => ['string'], -'sodium_crypto_aead_chacha20poly1305_keygen' => ['string'], -'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_xchacha20poly1305_ietf_keygen' => ['string'], -'sodium_crypto_auth' => ['string', 'message'=>'string', 'key'=>'string'], -'sodium_crypto_auth_keygen' => ['string'], -'sodium_crypto_auth_verify' => ['bool', 'mac'=>'string', 'message'=>'string', 'key'=>'string'], -'sodium_crypto_box' => ['string', 'message'=>'string', 'nonce'=>'string', 'key_pair'=>'string'], -'sodium_crypto_box_keypair' => ['string'], -'sodium_crypto_box_keypair_from_secretkey_and_publickey' => ['string', 'secret_key'=>'string', 'public_key'=>'string'], -'sodium_crypto_box_open' => ['string|false', 'ciphertext'=>'string', 'nonce'=>'string', 'key_pair'=>'string'], -'sodium_crypto_box_publickey' => ['string', 'key_pair'=>'string'], -'sodium_crypto_box_publickey_from_secretkey' => ['string', 'secret_key'=>'string'], -'sodium_crypto_box_seal' => ['string', 'message'=>'string', 'public_key'=>'string'], -'sodium_crypto_box_seal_open' => ['string|false', 'ciphertext'=>'string', 'key_pair'=>'string'], -'sodium_crypto_box_secretkey' => ['string', 'key_pair'=>'string'], -'sodium_crypto_box_seed_keypair' => ['string', 'seed'=>'string'], -'sodium_crypto_generichash' => ['string', 'message'=>'string', 'key='=>'?string', 'length='=>'?int'], -'sodium_crypto_generichash_final' => ['string', '&state'=>'string', 'length='=>'?int'], -'sodium_crypto_generichash_init' => ['string', 'key='=>'?string', 'length='=>'?int'], -'sodium_crypto_generichash_keygen' => ['string'], -'sodium_crypto_generichash_update' => ['bool', '&rw_state'=>'string', 'string'=>'string'], -'sodium_crypto_kdf_derive_from_key' => ['string', 'subkey_length'=>'int', 'subkey_id'=>'int', 'context'=>'string', 'key'=>'string'], -'sodium_crypto_kdf_keygen' => ['string'], -'sodium_crypto_kx_client_session_keys' => ['array', 'client_keypair'=>'string', 'server_key'=>'string'], -'sodium_crypto_kx_keypair' => ['string'], -'sodium_crypto_kx_publickey' => ['string', 'key_pair'=>'string'], -'sodium_crypto_kx_secretkey' => ['string', 'key_pair'=>'string'], -'sodium_crypto_kx_seed_keypair' => ['string', 'seed'=>'string'], -'sodium_crypto_kx_server_session_keys' => ['array', 'server_key_pair'=>'string', 'client_key'=>'string'], -'sodium_crypto_pwhash' => ['string', 'length'=>'int', 'password'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int', 'algo='=>'int'], -'sodium_crypto_pwhash_scryptsalsa208sha256' => ['string', 'length'=>'int', 'password'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], -'sodium_crypto_pwhash_scryptsalsa208sha256_str' => ['string', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], -'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify' => ['bool', 'hash'=>'string', 'password'=>'string'], -'sodium_crypto_pwhash_str' => ['string', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], -'sodium_crypto_pwhash_str_needs_rehash' => ['bool', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], -'sodium_crypto_pwhash_str_verify' => ['bool', 'hash'=>'string', 'password'=>'string'], -'sodium_crypto_scalarmult' => ['string', 'n'=>'string', 'p'=>'string'], -'sodium_crypto_scalarmult_base' => ['string', 'secret_key'=>'string'], -'sodium_crypto_secretbox' => ['string', 'message'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_secretbox_keygen' => ['string'], -'sodium_crypto_secretbox_open' => ['string|false', 'ciphertext'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_secretstream_xchacha20poly1305_init_pull' => ['string', 'header'=>'string', 'key'=>'string'], -'sodium_crypto_secretstream_xchacha20poly1305_init_push' => ['array', 'key'=>'string'], -'sodium_crypto_secretstream_xchacha20poly1305_keygen' => ['string'], -'sodium_crypto_secretstream_xchacha20poly1305_pull' => ['array', '&r_state'=>'string', 'ciphertext'=>'string', 'additional_data='=>'string'], -'sodium_crypto_secretstream_xchacha20poly1305_push' => ['string', '&w_state'=>'string', 'message'=>'string', 'additional_data='=>'string', 'tag='=>'int'], -'sodium_crypto_secretstream_xchacha20poly1305_rekey' => ['void', 'state'=>'string'], -'sodium_crypto_shorthash' => ['string', 'message'=>'string', 'key'=>'string'], -'sodium_crypto_shorthash_keygen' => ['string'], -'sodium_crypto_sign' => ['string', 'message'=>'string', 'secret_key'=>'string'], -'sodium_crypto_sign_detached' => ['string', 'message'=>'string', 'secret_key'=>'string'], -'sodium_crypto_sign_ed25519_pk_to_curve25519' => ['string', 'public_key'=>'string'], -'sodium_crypto_sign_ed25519_sk_to_curve25519' => ['string', 'secret_key'=>'string'], -'sodium_crypto_sign_keypair' => ['string'], -'sodium_crypto_sign_keypair_from_secretkey_and_publickey' => ['string', 'secret_key'=>'string', 'public_key'=>'string'], -'sodium_crypto_sign_open' => ['string|false', 'signed_message'=>'string', 'public_key'=>'string'], -'sodium_crypto_sign_publickey' => ['string', 'key_pair'=>'string'], -'sodium_crypto_sign_publickey_from_secretkey' => ['string', 'secret_key'=>'string'], -'sodium_crypto_sign_secretkey' => ['string', 'key_pair'=>'string'], -'sodium_crypto_sign_seed_keypair' => ['string', 'seed'=>'string'], -'sodium_crypto_sign_verify_detached' => ['bool', 'signature'=>'string', 'message'=>'string', 'public_key'=>'string'], -'sodium_crypto_stream' => ['string', 'length'=>'int', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_stream_keygen' => ['string'], -'sodium_crypto_stream_xor' => ['string', 'message'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_hex2bin' => ['string', 'string'=>'string', 'ignore='=>'string'], -'sodium_increment' => ['void', '&rw_string'=>'string'], -'sodium_memcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], -'sodium_memzero' => ['void', '&w_string'=>'string'], -'sodium_pad' => ['string', 'string'=>'string', 'block_size'=>'int'], -'sodium_unpad' => ['string', 'string'=>'string', 'block_size'=>'int'], -'solid_fetch_prev' => ['bool', 'result_id'=>''], -'solr_get_version' => ['string|false'], -'SolrClient::__construct' => ['void', 'clientOptions'=>'array'], -'SolrClient::__destruct' => ['void'], -'SolrClient::addDocument' => ['SolrUpdateResponse', 'doc'=>'SolrInputDocument', 'allowdups='=>'bool', 'commitwithin='=>'int'], -'SolrClient::addDocuments' => ['SolrUpdateResponse', 'docs'=>'array', 'allowdups='=>'bool', 'commitwithin='=>'int'], -'SolrClient::commit' => ['SolrUpdateResponse', 'maxsegments='=>'int', 'waitflush='=>'bool', 'waitsearcher='=>'bool'], -'SolrClient::deleteById' => ['SolrUpdateResponse', 'id'=>'string'], -'SolrClient::deleteByIds' => ['SolrUpdateResponse', 'ids'=>'array'], -'SolrClient::deleteByQueries' => ['SolrUpdateResponse', 'queries'=>'array'], -'SolrClient::deleteByQuery' => ['SolrUpdateResponse', 'query'=>'string'], -'SolrClient::getById' => ['SolrQueryResponse', 'id'=>'string'], -'SolrClient::getByIds' => ['SolrQueryResponse', 'ids'=>'array'], -'SolrClient::getDebug' => ['string'], -'SolrClient::getOptions' => ['array'], -'SolrClient::optimize' => ['SolrUpdateResponse', 'maxsegments='=>'int', 'waitflush='=>'bool', 'waitsearcher='=>'bool'], -'SolrClient::ping' => ['SolrPingResponse'], -'SolrClient::query' => ['SolrQueryResponse', 'query'=>'SolrParams'], -'SolrClient::request' => ['SolrUpdateResponse', 'raw_request'=>'string'], -'SolrClient::rollback' => ['SolrUpdateResponse'], -'SolrClient::setResponseWriter' => ['void', 'responsewriter'=>'string'], -'SolrClient::setServlet' => ['bool', 'type'=>'int', 'value'=>'string'], -'SolrClient::system' => ['SolrGenericResponse'], -'SolrClient::threads' => ['SolrGenericResponse'], -'SolrClientException::__clone' => ['void'], -'SolrClientException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'SolrClientException::__toString' => ['string'], -'SolrClientException::__wakeup' => ['void'], -'SolrClientException::getCode' => ['int'], -'SolrClientException::getFile' => ['string'], -'SolrClientException::getInternalInfo' => ['array'], -'SolrClientException::getLine' => ['int'], -'SolrClientException::getMessage' => ['string'], -'SolrClientException::getPrevious' => ['?Exception|?Throwable'], -'SolrClientException::getTrace' => ['list\',args?:array}>'], -'SolrClientException::getTraceAsString' => ['string'], -'SolrCollapseFunction::__construct' => ['void', 'field'=>'string'], -'SolrCollapseFunction::__toString' => ['string'], -'SolrCollapseFunction::getField' => ['string'], -'SolrCollapseFunction::getHint' => ['string'], -'SolrCollapseFunction::getMax' => ['string'], -'SolrCollapseFunction::getMin' => ['string'], -'SolrCollapseFunction::getNullPolicy' => ['string'], -'SolrCollapseFunction::getSize' => ['int'], -'SolrCollapseFunction::setField' => ['SolrCollapseFunction', 'fieldName'=>'string'], -'SolrCollapseFunction::setHint' => ['SolrCollapseFunction', 'hint'=>'string'], -'SolrCollapseFunction::setMax' => ['SolrCollapseFunction', 'max'=>'string'], -'SolrCollapseFunction::setMin' => ['SolrCollapseFunction', 'min'=>'string'], -'SolrCollapseFunction::setNullPolicy' => ['SolrCollapseFunction', 'nullPolicy'=>'string'], -'SolrCollapseFunction::setSize' => ['SolrCollapseFunction', 'size'=>'int'], -'SolrDisMaxQuery::__construct' => ['void', 'q='=>'string'], -'SolrDisMaxQuery::__destruct' => ['void'], -'SolrDisMaxQuery::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], -'SolrDisMaxQuery::addBigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], -'SolrDisMaxQuery::addBoostQuery' => ['SolrDisMaxQuery', 'field'=>'string', 'value'=>'string', 'boost='=>'string'], -'SolrDisMaxQuery::addExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrDisMaxQuery::addExpandSortField' => ['SolrQuery', 'field'=>'string', 'order'=>'string'], -'SolrDisMaxQuery::addFacetDateField' => ['SolrQuery', 'dateField'=>'string'], -'SolrDisMaxQuery::addFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::addFacetField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addFacetQuery' => ['SolrQuery', 'facetQuery'=>'string'], -'SolrDisMaxQuery::addField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrDisMaxQuery::addGroupField' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::addGroupFunction' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::addGroupQuery' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::addGroupSortField' => ['SolrQuery', 'field'=>'string', 'order'=>'int'], -'SolrDisMaxQuery::addHighlightField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addMltField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addMltQueryField' => ['SolrQuery', 'field'=>'string', 'boost'=>'float'], -'SolrDisMaxQuery::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], -'SolrDisMaxQuery::addPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], -'SolrDisMaxQuery::addQueryField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost='=>'string'], -'SolrDisMaxQuery::addSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], -'SolrDisMaxQuery::addStatsFacet' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addStatsField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addTrigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], -'SolrDisMaxQuery::addUserField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::collapse' => ['SolrQuery', 'collapseFunction'=>'SolrCollapseFunction'], -'SolrDisMaxQuery::get' => ['mixed', 'param_name'=>'string'], -'SolrDisMaxQuery::getExpand' => ['bool'], -'SolrDisMaxQuery::getExpandFilterQueries' => ['array'], -'SolrDisMaxQuery::getExpandQuery' => ['array'], -'SolrDisMaxQuery::getExpandRows' => ['int'], -'SolrDisMaxQuery::getExpandSortFields' => ['array'], -'SolrDisMaxQuery::getFacet' => ['bool'], -'SolrDisMaxQuery::getFacetDateEnd' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetDateFields' => ['array'], -'SolrDisMaxQuery::getFacetDateGap' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetDateHardEnd' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetDateOther' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetDateStart' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetFields' => ['array'], -'SolrDisMaxQuery::getFacetLimit' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetMethod' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetMinCount' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetMissing' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetOffset' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetPrefix' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetQueries' => ['string'], -'SolrDisMaxQuery::getFacetSort' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getFields' => ['string'], -'SolrDisMaxQuery::getFilterQueries' => ['string'], -'SolrDisMaxQuery::getGroup' => ['bool'], -'SolrDisMaxQuery::getGroupCachePercent' => ['int'], -'SolrDisMaxQuery::getGroupFacet' => ['bool'], -'SolrDisMaxQuery::getGroupFields' => ['array'], -'SolrDisMaxQuery::getGroupFormat' => ['string'], -'SolrDisMaxQuery::getGroupFunctions' => ['array'], -'SolrDisMaxQuery::getGroupLimit' => ['int'], -'SolrDisMaxQuery::getGroupMain' => ['bool'], -'SolrDisMaxQuery::getGroupNGroups' => ['bool'], -'SolrDisMaxQuery::getGroupOffset' => ['bool'], -'SolrDisMaxQuery::getGroupQueries' => ['array'], -'SolrDisMaxQuery::getGroupSortFields' => ['array'], -'SolrDisMaxQuery::getGroupTruncate' => ['bool'], -'SolrDisMaxQuery::getHighlight' => ['bool'], -'SolrDisMaxQuery::getHighlightAlternateField' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightFields' => ['array'], -'SolrDisMaxQuery::getHighlightFormatter' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightFragmenter' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightFragsize' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightHighlightMultiTerm' => ['bool'], -'SolrDisMaxQuery::getHighlightMaxAlternateFieldLength' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightMaxAnalyzedChars' => ['int'], -'SolrDisMaxQuery::getHighlightMergeContiguous' => ['bool', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightRegexMaxAnalyzedChars' => ['int'], -'SolrDisMaxQuery::getHighlightRegexPattern' => ['string'], -'SolrDisMaxQuery::getHighlightRegexSlop' => ['float'], -'SolrDisMaxQuery::getHighlightRequireFieldMatch' => ['bool'], -'SolrDisMaxQuery::getHighlightSimplePost' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightSimplePre' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightSnippets' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightUsePhraseHighlighter' => ['bool'], -'SolrDisMaxQuery::getMlt' => ['bool'], -'SolrDisMaxQuery::getMltBoost' => ['bool'], -'SolrDisMaxQuery::getMltCount' => ['int'], -'SolrDisMaxQuery::getMltFields' => ['array'], -'SolrDisMaxQuery::getMltMaxNumQueryTerms' => ['int'], -'SolrDisMaxQuery::getMltMaxNumTokens' => ['int'], -'SolrDisMaxQuery::getMltMaxWordLength' => ['int'], -'SolrDisMaxQuery::getMltMinDocFrequency' => ['int'], -'SolrDisMaxQuery::getMltMinTermFrequency' => ['int'], -'SolrDisMaxQuery::getMltMinWordLength' => ['int'], -'SolrDisMaxQuery::getMltQueryFields' => ['array'], -'SolrDisMaxQuery::getParam' => ['mixed', 'param_name'=>'string'], -'SolrDisMaxQuery::getParams' => ['array'], -'SolrDisMaxQuery::getPreparedParams' => ['array'], -'SolrDisMaxQuery::getQuery' => ['string'], -'SolrDisMaxQuery::getRows' => ['int'], -'SolrDisMaxQuery::getSortFields' => ['array'], -'SolrDisMaxQuery::getStart' => ['int'], -'SolrDisMaxQuery::getStats' => ['bool'], -'SolrDisMaxQuery::getStatsFacets' => ['array'], -'SolrDisMaxQuery::getStatsFields' => ['array'], -'SolrDisMaxQuery::getTerms' => ['bool'], -'SolrDisMaxQuery::getTermsField' => ['string'], -'SolrDisMaxQuery::getTermsIncludeLowerBound' => ['bool'], -'SolrDisMaxQuery::getTermsIncludeUpperBound' => ['bool'], -'SolrDisMaxQuery::getTermsLimit' => ['int'], -'SolrDisMaxQuery::getTermsLowerBound' => ['string'], -'SolrDisMaxQuery::getTermsMaxCount' => ['int'], -'SolrDisMaxQuery::getTermsMinCount' => ['int'], -'SolrDisMaxQuery::getTermsPrefix' => ['string'], -'SolrDisMaxQuery::getTermsReturnRaw' => ['bool'], -'SolrDisMaxQuery::getTermsSort' => ['int'], -'SolrDisMaxQuery::getTermsUpperBound' => ['string'], -'SolrDisMaxQuery::getTimeAllowed' => ['int'], -'SolrDisMaxQuery::removeBigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeBoostQuery' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrDisMaxQuery::removeExpandSortField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeFacetDateField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::removeFacetField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeFacetQuery' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::removeField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrDisMaxQuery::removeHighlightField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeMltField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeMltQueryField' => ['SolrQuery', 'queryField'=>'string'], -'SolrDisMaxQuery::removePhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeQueryField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeSortField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeStatsFacet' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::removeStatsField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeTrigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeUserField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::serialize' => ['string'], -'SolrDisMaxQuery::set' => ['SolrParams', 'name'=>'string', 'value'=>''], -'SolrDisMaxQuery::setBigramPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], -'SolrDisMaxQuery::setBigramPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], -'SolrDisMaxQuery::setBoostFunction' => ['SolrDisMaxQuery', 'function'=>'string'], -'SolrDisMaxQuery::setBoostQuery' => ['SolrDisMaxQuery', 'q'=>'string'], -'SolrDisMaxQuery::setEchoHandler' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setEchoParams' => ['SolrQuery', 'type'=>'string'], -'SolrDisMaxQuery::setExpand' => ['SolrQuery', 'value'=>'bool'], -'SolrDisMaxQuery::setExpandQuery' => ['SolrQuery', 'q'=>'string'], -'SolrDisMaxQuery::setExpandRows' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setExplainOther' => ['SolrQuery', 'query'=>'string'], -'SolrDisMaxQuery::setFacet' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setFacetDateEnd' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetDateGap' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetDateHardEnd' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetDateStart' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetLimit' => ['SolrQuery', 'limit'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetMethod' => ['SolrQuery', 'method'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetMinCount' => ['SolrQuery', 'mincount'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetMissing' => ['SolrQuery', 'flag'=>'bool', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetOffset' => ['SolrQuery', 'offset'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetPrefix' => ['SolrQuery', 'prefix'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetSort' => ['SolrQuery', 'facetSort'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setGroup' => ['SolrQuery', 'value'=>'bool'], -'SolrDisMaxQuery::setGroupCachePercent' => ['SolrQuery', 'percent'=>'int'], -'SolrDisMaxQuery::setGroupFacet' => ['SolrQuery', 'value'=>'bool'], -'SolrDisMaxQuery::setGroupFormat' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::setGroupLimit' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setGroupMain' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::setGroupNGroups' => ['SolrQuery', 'value'=>'bool'], -'SolrDisMaxQuery::setGroupOffset' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setGroupTruncate' => ['SolrQuery', 'value'=>'bool'], -'SolrDisMaxQuery::setHighlight' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setHighlightAlternateField' => ['SolrQuery', 'field'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightFormatter' => ['SolrQuery', 'formatter'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightFragsize' => ['SolrQuery', 'size'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldLength'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag'=>'bool', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxAnalyzedChars'=>'int'], -'SolrDisMaxQuery::setHighlightRegexPattern' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor'=>'float'], -'SolrDisMaxQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setHighlightSimplePost' => ['SolrQuery', 'simplePost'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightSimplePre' => ['SolrQuery', 'simplePre'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightSnippets' => ['SolrQuery', 'value'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setMinimumMatch' => ['SolrDisMaxQuery', 'value'=>'string'], -'SolrDisMaxQuery::setMlt' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setMltBoost' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setMltCount' => ['SolrQuery', 'count'=>'int'], -'SolrDisMaxQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setMltMaxNumTokens' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setMltMaxWordLength' => ['SolrQuery', 'maxWordLength'=>'int'], -'SolrDisMaxQuery::setMltMinDocFrequency' => ['SolrQuery', 'minDocFrequency'=>'int'], -'SolrDisMaxQuery::setMltMinTermFrequency' => ['SolrQuery', 'minTermFrequency'=>'int'], -'SolrDisMaxQuery::setMltMinWordLength' => ['SolrQuery', 'minWordLength'=>'int'], -'SolrDisMaxQuery::setOmitHeader' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], -'SolrDisMaxQuery::setPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], -'SolrDisMaxQuery::setPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], -'SolrDisMaxQuery::setQuery' => ['SolrQuery', 'query'=>'string'], -'SolrDisMaxQuery::setQueryAlt' => ['SolrDisMaxQuery', 'q'=>'string'], -'SolrDisMaxQuery::setQueryPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], -'SolrDisMaxQuery::setRows' => ['SolrQuery', 'rows'=>'int'], -'SolrDisMaxQuery::setShowDebugInfo' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setStart' => ['SolrQuery', 'start'=>'int'], -'SolrDisMaxQuery::setStats' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setTerms' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setTermsField' => ['SolrQuery', 'fieldname'=>'string'], -'SolrDisMaxQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setTermsLimit' => ['SolrQuery', 'limit'=>'int'], -'SolrDisMaxQuery::setTermsLowerBound' => ['SolrQuery', 'lowerBound'=>'string'], -'SolrDisMaxQuery::setTermsMaxCount' => ['SolrQuery', 'frequency'=>'int'], -'SolrDisMaxQuery::setTermsMinCount' => ['SolrQuery', 'frequency'=>'int'], -'SolrDisMaxQuery::setTermsPrefix' => ['SolrQuery', 'prefix'=>'string'], -'SolrDisMaxQuery::setTermsReturnRaw' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setTermsSort' => ['SolrQuery', 'sortType'=>'int'], -'SolrDisMaxQuery::setTermsUpperBound' => ['SolrQuery', 'upperBound'=>'string'], -'SolrDisMaxQuery::setTieBreaker' => ['SolrDisMaxQuery', 'tieBreaker'=>'string'], -'SolrDisMaxQuery::setTimeAllowed' => ['SolrQuery', 'timeAllowed'=>'int'], -'SolrDisMaxQuery::setTrigramPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], -'SolrDisMaxQuery::setTrigramPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], -'SolrDisMaxQuery::setUserFields' => ['SolrDisMaxQuery', 'fields'=>'string'], -'SolrDisMaxQuery::toString' => ['string', 'url_encode='=>'bool'], -'SolrDisMaxQuery::unserialize' => ['void', 'serialized'=>'string'], -'SolrDisMaxQuery::useDisMaxQueryParser' => ['SolrDisMaxQuery'], -'SolrDisMaxQuery::useEDisMaxQueryParser' => ['SolrDisMaxQuery'], -'SolrDocument::__clone' => ['void'], -'SolrDocument::__construct' => ['void'], -'SolrDocument::__destruct' => ['void'], -'SolrDocument::__get' => ['SolrDocumentField', 'fieldname'=>'string'], -'SolrDocument::__isset' => ['bool', 'fieldname'=>'string'], -'SolrDocument::__set' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string'], -'SolrDocument::__unset' => ['bool', 'fieldname'=>'string'], -'SolrDocument::addField' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string'], -'SolrDocument::clear' => ['bool'], -'SolrDocument::current' => ['SolrDocumentField'], -'SolrDocument::deleteField' => ['bool', 'fieldname'=>'string'], -'SolrDocument::fieldExists' => ['bool', 'fieldname'=>'string'], -'SolrDocument::getChildDocuments' => ['SolrInputDocument[]'], -'SolrDocument::getChildDocumentsCount' => ['int'], -'SolrDocument::getField' => ['SolrDocumentField|false', 'fieldname'=>'string'], -'SolrDocument::getFieldCount' => ['int|false'], -'SolrDocument::getFieldNames' => ['array|false'], -'SolrDocument::getInputDocument' => ['SolrInputDocument'], -'SolrDocument::hasChildDocuments' => ['bool'], -'SolrDocument::key' => ['string'], -'SolrDocument::merge' => ['bool', 'sourcedoc'=>'solrdocument', 'overwrite='=>'bool'], -'SolrDocument::next' => ['void'], -'SolrDocument::offsetExists' => ['bool', 'fieldname'=>'string'], -'SolrDocument::offsetGet' => ['SolrDocumentField', 'fieldname'=>'string'], -'SolrDocument::offsetSet' => ['void', 'fieldname'=>'string', 'fieldvalue'=>'string'], -'SolrDocument::offsetUnset' => ['void', 'fieldname'=>'string'], -'SolrDocument::reset' => ['bool'], -'SolrDocument::rewind' => ['void'], -'SolrDocument::serialize' => ['string'], -'SolrDocument::sort' => ['bool', 'sortorderby'=>'int', 'sortdirection='=>'int'], -'SolrDocument::toArray' => ['array'], -'SolrDocument::unserialize' => ['void', 'serialized'=>'string'], -'SolrDocument::valid' => ['bool'], -'SolrDocumentField::__construct' => ['void'], -'SolrDocumentField::__destruct' => ['void'], -'SolrException::__clone' => ['void'], -'SolrException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'SolrException::__toString' => ['string'], -'SolrException::__wakeup' => ['void'], -'SolrException::getCode' => ['int'], -'SolrException::getFile' => ['string'], -'SolrException::getInternalInfo' => ['array'], -'SolrException::getLine' => ['int'], -'SolrException::getMessage' => ['string'], -'SolrException::getPrevious' => ['Exception|Throwable'], -'SolrException::getTrace' => ['list\',args?:array}>'], -'SolrException::getTraceAsString' => ['string'], -'SolrGenericResponse::__construct' => ['void'], -'SolrGenericResponse::__destruct' => ['void'], -'SolrGenericResponse::getDigestedResponse' => ['string'], -'SolrGenericResponse::getHttpStatus' => ['int'], -'SolrGenericResponse::getHttpStatusMessage' => ['string'], -'SolrGenericResponse::getRawRequest' => ['string'], -'SolrGenericResponse::getRawRequestHeaders' => ['string'], -'SolrGenericResponse::getRawResponse' => ['string'], -'SolrGenericResponse::getRawResponseHeaders' => ['string'], -'SolrGenericResponse::getRequestUrl' => ['string'], -'SolrGenericResponse::getResponse' => ['SolrObject'], -'SolrGenericResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], -'SolrGenericResponse::success' => ['bool'], -'SolrIllegalArgumentException::__clone' => ['void'], -'SolrIllegalArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'SolrIllegalArgumentException::__toString' => ['string'], -'SolrIllegalArgumentException::__wakeup' => ['void'], -'SolrIllegalArgumentException::getCode' => ['int'], -'SolrIllegalArgumentException::getFile' => ['string'], -'SolrIllegalArgumentException::getInternalInfo' => ['array'], -'SolrIllegalArgumentException::getLine' => ['int'], -'SolrIllegalArgumentException::getMessage' => ['string'], -'SolrIllegalArgumentException::getPrevious' => ['Exception|Throwable'], -'SolrIllegalArgumentException::getTrace' => ['list\',args?:array}>'], -'SolrIllegalArgumentException::getTraceAsString' => ['string'], -'SolrIllegalOperationException::__clone' => ['void'], -'SolrIllegalOperationException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'SolrIllegalOperationException::__toString' => ['string'], -'SolrIllegalOperationException::__wakeup' => ['void'], -'SolrIllegalOperationException::getCode' => ['int'], -'SolrIllegalOperationException::getFile' => ['string'], -'SolrIllegalOperationException::getInternalInfo' => ['array'], -'SolrIllegalOperationException::getLine' => ['int'], -'SolrIllegalOperationException::getMessage' => ['string'], -'SolrIllegalOperationException::getPrevious' => ['Exception|Throwable'], -'SolrIllegalOperationException::getTrace' => ['list\',args?:array}>'], -'SolrIllegalOperationException::getTraceAsString' => ['string'], -'SolrInputDocument::__clone' => ['void'], -'SolrInputDocument::__construct' => ['void'], -'SolrInputDocument::__destruct' => ['void'], -'SolrInputDocument::addChildDocument' => ['void', 'child'=>'SolrInputDocument'], -'SolrInputDocument::addChildDocuments' => ['void', 'docs'=>'array'], -'SolrInputDocument::addField' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string', 'fieldboostvalue='=>'float'], -'SolrInputDocument::clear' => ['bool'], -'SolrInputDocument::deleteField' => ['bool', 'fieldname'=>'string'], -'SolrInputDocument::fieldExists' => ['bool', 'fieldname'=>'string'], -'SolrInputDocument::getBoost' => ['float|false'], -'SolrInputDocument::getChildDocuments' => ['SolrInputDocument[]'], -'SolrInputDocument::getChildDocumentsCount' => ['int'], -'SolrInputDocument::getField' => ['SolrDocumentField|false', 'fieldname'=>'string'], -'SolrInputDocument::getFieldBoost' => ['float|false', 'fieldname'=>'string'], -'SolrInputDocument::getFieldCount' => ['int|false'], -'SolrInputDocument::getFieldNames' => ['array|false'], -'SolrInputDocument::hasChildDocuments' => ['bool'], -'SolrInputDocument::merge' => ['bool', 'sourcedoc'=>'SolrInputDocument', 'overwrite='=>'bool'], -'SolrInputDocument::reset' => ['bool'], -'SolrInputDocument::setBoost' => ['bool', 'documentboostvalue'=>'float'], -'SolrInputDocument::setFieldBoost' => ['bool', 'fieldname'=>'string', 'fieldboostvalue'=>'float'], -'SolrInputDocument::sort' => ['bool', 'sortorderby'=>'int', 'sortdirection='=>'int'], -'SolrInputDocument::toArray' => ['array|false'], -'SolrModifiableParams::__construct' => ['void'], -'SolrModifiableParams::__destruct' => ['void'], -'SolrModifiableParams::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], -'SolrModifiableParams::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], -'SolrModifiableParams::get' => ['mixed', 'param_name'=>'string'], -'SolrModifiableParams::getParam' => ['mixed', 'param_name'=>'string'], -'SolrModifiableParams::getParams' => ['array'], -'SolrModifiableParams::getPreparedParams' => ['array'], -'SolrModifiableParams::serialize' => ['string'], -'SolrModifiableParams::set' => ['SolrParams', 'name'=>'string', 'value'=>''], -'SolrModifiableParams::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], -'SolrModifiableParams::toString' => ['string', 'url_encode='=>'bool'], -'SolrModifiableParams::unserialize' => ['void', 'serialized'=>'string'], -'SolrObject::__construct' => ['void'], -'SolrObject::__destruct' => ['void'], -'SolrObject::getPropertyNames' => ['array'], -'SolrObject::offsetExists' => ['bool', 'property_name'=>'string'], -'SolrObject::offsetGet' => ['SolrDocumentField', 'property_name'=>'string'], -'SolrObject::offsetSet' => ['void', 'property_name'=>'string', 'property_value'=>'string'], -'SolrObject::offsetUnset' => ['void', 'property_name'=>'string'], -'SolrParams::__construct' => ['void'], -'SolrParams::add' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], -'SolrParams::addParam' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], -'SolrParams::get' => ['mixed', 'param_name'=>'string'], -'SolrParams::getParam' => ['mixed', 'param_name='=>'string'], -'SolrParams::getParams' => ['array'], -'SolrParams::getPreparedParams' => ['array'], -'SolrParams::serialize' => ['string'], -'SolrParams::set' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], -'SolrParams::setParam' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], -'SolrParams::toString' => ['string|false', 'url_encode='=>'bool'], -'SolrParams::unserialize' => ['void', 'serialized'=>'string'], -'SolrPingResponse::__construct' => ['void'], -'SolrPingResponse::__destruct' => ['void'], -'SolrPingResponse::getDigestedResponse' => ['string'], -'SolrPingResponse::getHttpStatus' => ['int'], -'SolrPingResponse::getHttpStatusMessage' => ['string'], -'SolrPingResponse::getRawRequest' => ['string'], -'SolrPingResponse::getRawRequestHeaders' => ['string'], -'SolrPingResponse::getRawResponse' => ['string'], -'SolrPingResponse::getRawResponseHeaders' => ['string'], -'SolrPingResponse::getRequestUrl' => ['string'], -'SolrPingResponse::getResponse' => ['string'], -'SolrPingResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], -'SolrPingResponse::success' => ['bool'], -'SolrQuery::__construct' => ['void', 'q='=>'string'], -'SolrQuery::__destruct' => ['void'], -'SolrQuery::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], -'SolrQuery::addExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrQuery::addExpandSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'string'], -'SolrQuery::addFacetDateField' => ['SolrQuery', 'datefield'=>'string'], -'SolrQuery::addFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], -'SolrQuery::addFacetField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::addFacetQuery' => ['SolrQuery', 'facetquery'=>'string'], -'SolrQuery::addField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::addFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrQuery::addGroupField' => ['SolrQuery', 'value'=>'string'], -'SolrQuery::addGroupFunction' => ['SolrQuery', 'value'=>'string'], -'SolrQuery::addGroupQuery' => ['SolrQuery', 'value'=>'string'], -'SolrQuery::addGroupSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], -'SolrQuery::addHighlightField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::addMltField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::addMltQueryField' => ['SolrQuery', 'field'=>'string', 'boost'=>'float'], -'SolrQuery::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], -'SolrQuery::addSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], -'SolrQuery::addStatsFacet' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::addStatsField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::collapse' => ['SolrQuery', 'collapseFunction'=>'SolrCollapseFunction'], -'SolrQuery::get' => ['mixed', 'param_name'=>'string'], -'SolrQuery::getExpand' => ['bool'], -'SolrQuery::getExpandFilterQueries' => ['array'], -'SolrQuery::getExpandQuery' => ['array'], -'SolrQuery::getExpandRows' => ['int'], -'SolrQuery::getExpandSortFields' => ['array'], -'SolrQuery::getFacet' => ['?bool'], -'SolrQuery::getFacetDateEnd' => ['?string', 'field_override='=>'string'], -'SolrQuery::getFacetDateFields' => ['array'], -'SolrQuery::getFacetDateGap' => ['?string', 'field_override='=>'string'], -'SolrQuery::getFacetDateHardEnd' => ['?string', 'field_override='=>'string'], -'SolrQuery::getFacetDateOther' => ['?string', 'field_override='=>'string'], -'SolrQuery::getFacetDateStart' => ['?string', 'field_override='=>'string'], -'SolrQuery::getFacetFields' => ['array'], -'SolrQuery::getFacetLimit' => ['?int', 'field_override='=>'string'], -'SolrQuery::getFacetMethod' => ['?string', 'field_override='=>'string'], -'SolrQuery::getFacetMinCount' => ['?int', 'field_override='=>'string'], -'SolrQuery::getFacetMissing' => ['?bool', 'field_override='=>'string'], -'SolrQuery::getFacetOffset' => ['?int', 'field_override='=>'string'], -'SolrQuery::getFacetPrefix' => ['?string', 'field_override='=>'string'], -'SolrQuery::getFacetQueries' => ['?array'], -'SolrQuery::getFacetSort' => ['int', 'field_override='=>'string'], -'SolrQuery::getFields' => ['?array'], -'SolrQuery::getFilterQueries' => ['?array'], -'SolrQuery::getGroup' => ['bool'], -'SolrQuery::getGroupCachePercent' => ['int'], -'SolrQuery::getGroupFacet' => ['bool'], -'SolrQuery::getGroupFields' => ['array'], -'SolrQuery::getGroupFormat' => ['string'], -'SolrQuery::getGroupFunctions' => ['array'], -'SolrQuery::getGroupLimit' => ['int'], -'SolrQuery::getGroupMain' => ['bool'], -'SolrQuery::getGroupNGroups' => ['bool'], -'SolrQuery::getGroupOffset' => ['int'], -'SolrQuery::getGroupQueries' => ['array'], -'SolrQuery::getGroupSortFields' => ['array'], -'SolrQuery::getGroupTruncate' => ['bool'], -'SolrQuery::getHighlight' => ['bool'], -'SolrQuery::getHighlightAlternateField' => ['?string', 'field_override='=>'string'], -'SolrQuery::getHighlightFields' => ['?array'], -'SolrQuery::getHighlightFormatter' => ['?string', 'field_override='=>'string'], -'SolrQuery::getHighlightFragmenter' => ['?string', 'field_override='=>'string'], -'SolrQuery::getHighlightFragsize' => ['?int', 'field_override='=>'string'], -'SolrQuery::getHighlightHighlightMultiTerm' => ['?bool'], -'SolrQuery::getHighlightMaxAlternateFieldLength' => ['?int', 'field_override='=>'string'], -'SolrQuery::getHighlightMaxAnalyzedChars' => ['?int'], -'SolrQuery::getHighlightMergeContiguous' => ['?bool', 'field_override='=>'string'], -'SolrQuery::getHighlightRegexMaxAnalyzedChars' => ['?int'], -'SolrQuery::getHighlightRegexPattern' => ['?string'], -'SolrQuery::getHighlightRegexSlop' => ['?float'], -'SolrQuery::getHighlightRequireFieldMatch' => ['?bool'], -'SolrQuery::getHighlightSimplePost' => ['?string', 'field_override='=>'string'], -'SolrQuery::getHighlightSimplePre' => ['?string', 'field_override='=>'string'], -'SolrQuery::getHighlightSnippets' => ['?int', 'field_override='=>'string'], -'SolrQuery::getHighlightUsePhraseHighlighter' => ['?bool'], -'SolrQuery::getMlt' => ['?bool'], -'SolrQuery::getMltBoost' => ['?bool'], -'SolrQuery::getMltCount' => ['?int'], -'SolrQuery::getMltFields' => ['?array'], -'SolrQuery::getMltMaxNumQueryTerms' => ['?int'], -'SolrQuery::getMltMaxNumTokens' => ['?int'], -'SolrQuery::getMltMaxWordLength' => ['?int'], -'SolrQuery::getMltMinDocFrequency' => ['?int'], -'SolrQuery::getMltMinTermFrequency' => ['?int'], -'SolrQuery::getMltMinWordLength' => ['?int'], -'SolrQuery::getMltQueryFields' => ['?array'], -'SolrQuery::getParam' => ['?mixed', 'param_name'=>'string'], -'SolrQuery::getParams' => ['?array'], -'SolrQuery::getPreparedParams' => ['?array'], -'SolrQuery::getQuery' => ['?string'], -'SolrQuery::getRows' => ['?int'], -'SolrQuery::getSortFields' => ['?array'], -'SolrQuery::getStart' => ['?int'], -'SolrQuery::getStats' => ['?bool'], -'SolrQuery::getStatsFacets' => ['?array'], -'SolrQuery::getStatsFields' => ['?array'], -'SolrQuery::getTerms' => ['?bool'], -'SolrQuery::getTermsField' => ['?string'], -'SolrQuery::getTermsIncludeLowerBound' => ['?bool'], -'SolrQuery::getTermsIncludeUpperBound' => ['?bool'], -'SolrQuery::getTermsLimit' => ['?int'], -'SolrQuery::getTermsLowerBound' => ['?string'], -'SolrQuery::getTermsMaxCount' => ['?int'], -'SolrQuery::getTermsMinCount' => ['?int'], -'SolrQuery::getTermsPrefix' => ['?string'], -'SolrQuery::getTermsReturnRaw' => ['?bool'], -'SolrQuery::getTermsSort' => ['?int'], -'SolrQuery::getTermsUpperBound' => ['?string'], -'SolrQuery::getTimeAllowed' => ['?int'], -'SolrQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrQuery::removeExpandSortField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::removeFacetDateField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::removeFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], -'SolrQuery::removeFacetField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::removeFacetQuery' => ['SolrQuery', 'value'=>'string'], -'SolrQuery::removeField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::removeFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrQuery::removeHighlightField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::removeMltField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::removeMltQueryField' => ['SolrQuery', 'queryfield'=>'string'], -'SolrQuery::removeSortField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::removeStatsFacet' => ['SolrQuery', 'value'=>'string'], -'SolrQuery::removeStatsField' => ['SolrQuery', 'field'=>'string'], -'SolrQuery::serialize' => ['string'], -'SolrQuery::set' => ['SolrParams', 'name'=>'string', 'value'=>''], -'SolrQuery::setEchoHandler' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setEchoParams' => ['SolrQuery', 'type'=>'string'], -'SolrQuery::setExpand' => ['SolrQuery', 'value'=>'bool'], -'SolrQuery::setExpandQuery' => ['SolrQuery', 'q'=>'string'], -'SolrQuery::setExpandRows' => ['SolrQuery', 'value'=>'int'], -'SolrQuery::setExplainOther' => ['SolrQuery', 'query'=>'string'], -'SolrQuery::setFacet' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setFacetDateEnd' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], -'SolrQuery::setFacetDateGap' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], -'SolrQuery::setFacetDateHardEnd' => ['SolrQuery', 'value'=>'bool', 'field_override='=>'string'], -'SolrQuery::setFacetDateStart' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], -'SolrQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency'=>'int', 'field_override='=>'string'], -'SolrQuery::setFacetLimit' => ['SolrQuery', 'limit'=>'int', 'field_override='=>'string'], -'SolrQuery::setFacetMethod' => ['SolrQuery', 'method'=>'string', 'field_override='=>'string'], -'SolrQuery::setFacetMinCount' => ['SolrQuery', 'mincount'=>'int', 'field_override='=>'string'], -'SolrQuery::setFacetMissing' => ['SolrQuery', 'flag'=>'bool', 'field_override='=>'string'], -'SolrQuery::setFacetOffset' => ['SolrQuery', 'offset'=>'int', 'field_override='=>'string'], -'SolrQuery::setFacetPrefix' => ['SolrQuery', 'prefix'=>'string', 'field_override='=>'string'], -'SolrQuery::setFacetSort' => ['SolrQuery', 'facetsort'=>'int', 'field_override='=>'string'], -'SolrQuery::setGroup' => ['SolrQuery', 'value'=>'bool'], -'SolrQuery::setGroupCachePercent' => ['SolrQuery', 'percent'=>'int'], -'SolrQuery::setGroupFacet' => ['SolrQuery', 'value'=>'bool'], -'SolrQuery::setGroupFormat' => ['SolrQuery', 'value'=>'string'], -'SolrQuery::setGroupLimit' => ['SolrQuery', 'value'=>'int'], -'SolrQuery::setGroupMain' => ['SolrQuery', 'value'=>'string'], -'SolrQuery::setGroupNGroups' => ['SolrQuery', 'value'=>'bool'], -'SolrQuery::setGroupOffset' => ['SolrQuery', 'value'=>'int'], -'SolrQuery::setGroupTruncate' => ['SolrQuery', 'value'=>'bool'], -'SolrQuery::setHighlight' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setHighlightAlternateField' => ['SolrQuery', 'field'=>'string', 'field_override='=>'string'], -'SolrQuery::setHighlightFormatter' => ['SolrQuery', 'formatter'=>'string', 'field_override='=>'string'], -'SolrQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter'=>'string', 'field_override='=>'string'], -'SolrQuery::setHighlightFragsize' => ['SolrQuery', 'size'=>'int', 'field_override='=>'string'], -'SolrQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldlength'=>'int', 'field_override='=>'string'], -'SolrQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value'=>'int'], -'SolrQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag'=>'bool', 'field_override='=>'string'], -'SolrQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxanalyzedchars'=>'int'], -'SolrQuery::setHighlightRegexPattern' => ['SolrQuery', 'value'=>'string'], -'SolrQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor'=>'float'], -'SolrQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setHighlightSimplePost' => ['SolrQuery', 'simplepost'=>'string', 'field_override='=>'string'], -'SolrQuery::setHighlightSimplePre' => ['SolrQuery', 'simplepre'=>'string', 'field_override='=>'string'], -'SolrQuery::setHighlightSnippets' => ['SolrQuery', 'value'=>'int', 'field_override='=>'string'], -'SolrQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setMlt' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setMltBoost' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setMltCount' => ['SolrQuery', 'count'=>'int'], -'SolrQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value'=>'int'], -'SolrQuery::setMltMaxNumTokens' => ['SolrQuery', 'value'=>'int'], -'SolrQuery::setMltMaxWordLength' => ['SolrQuery', 'maxwordlength'=>'int'], -'SolrQuery::setMltMinDocFrequency' => ['SolrQuery', 'mindocfrequency'=>'int'], -'SolrQuery::setMltMinTermFrequency' => ['SolrQuery', 'mintermfrequency'=>'int'], -'SolrQuery::setMltMinWordLength' => ['SolrQuery', 'minwordlength'=>'int'], -'SolrQuery::setOmitHeader' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], -'SolrQuery::setQuery' => ['SolrQuery', 'query'=>'string'], -'SolrQuery::setRows' => ['SolrQuery', 'rows'=>'int'], -'SolrQuery::setShowDebugInfo' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setStart' => ['SolrQuery', 'start'=>'int'], -'SolrQuery::setStats' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setTerms' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setTermsField' => ['SolrQuery', 'fieldname'=>'string'], -'SolrQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setTermsLimit' => ['SolrQuery', 'limit'=>'int'], -'SolrQuery::setTermsLowerBound' => ['SolrQuery', 'lowerbound'=>'string'], -'SolrQuery::setTermsMaxCount' => ['SolrQuery', 'frequency'=>'int'], -'SolrQuery::setTermsMinCount' => ['SolrQuery', 'frequency'=>'int'], -'SolrQuery::setTermsPrefix' => ['SolrQuery', 'prefix'=>'string'], -'SolrQuery::setTermsReturnRaw' => ['SolrQuery', 'flag'=>'bool'], -'SolrQuery::setTermsSort' => ['SolrQuery', 'sorttype'=>'int'], -'SolrQuery::setTermsUpperBound' => ['SolrQuery', 'upperbound'=>'string'], -'SolrQuery::setTimeAllowed' => ['SolrQuery', 'timeallowed'=>'int'], -'SolrQuery::toString' => ['string', 'url_encode='=>'bool'], -'SolrQuery::unserialize' => ['void', 'serialized'=>'string'], -'SolrQueryResponse::__construct' => ['void'], -'SolrQueryResponse::__destruct' => ['void'], -'SolrQueryResponse::getDigestedResponse' => ['string'], -'SolrQueryResponse::getHttpStatus' => ['int'], -'SolrQueryResponse::getHttpStatusMessage' => ['string'], -'SolrQueryResponse::getRawRequest' => ['string'], -'SolrQueryResponse::getRawRequestHeaders' => ['string'], -'SolrQueryResponse::getRawResponse' => ['string'], -'SolrQueryResponse::getRawResponseHeaders' => ['string'], -'SolrQueryResponse::getRequestUrl' => ['string'], -'SolrQueryResponse::getResponse' => ['SolrObject'], -'SolrQueryResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], -'SolrQueryResponse::success' => ['bool'], -'SolrResponse::getDigestedResponse' => ['string'], -'SolrResponse::getHttpStatus' => ['int'], -'SolrResponse::getHttpStatusMessage' => ['string'], -'SolrResponse::getRawRequest' => ['string'], -'SolrResponse::getRawRequestHeaders' => ['string'], -'SolrResponse::getRawResponse' => ['string'], -'SolrResponse::getRawResponseHeaders' => ['string'], -'SolrResponse::getRequestUrl' => ['string'], -'SolrResponse::getResponse' => ['SolrObject'], -'SolrResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], -'SolrResponse::success' => ['bool'], -'SolrServerException::__clone' => ['void'], -'SolrServerException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'SolrServerException::__toString' => ['string'], -'SolrServerException::__wakeup' => ['void'], -'SolrServerException::getCode' => ['int'], -'SolrServerException::getFile' => ['string'], -'SolrServerException::getInternalInfo' => ['array'], -'SolrServerException::getLine' => ['int'], -'SolrServerException::getMessage' => ['string'], -'SolrServerException::getPrevious' => ['Exception|Throwable'], -'SolrServerException::getTrace' => ['list\',args?:array}>'], -'SolrServerException::getTraceAsString' => ['string'], -'SolrUpdateResponse::__construct' => ['void'], -'SolrUpdateResponse::__destruct' => ['void'], -'SolrUpdateResponse::getDigestedResponse' => ['string'], -'SolrUpdateResponse::getHttpStatus' => ['int'], -'SolrUpdateResponse::getHttpStatusMessage' => ['string'], -'SolrUpdateResponse::getRawRequest' => ['string'], -'SolrUpdateResponse::getRawRequestHeaders' => ['string'], -'SolrUpdateResponse::getRawResponse' => ['string'], -'SolrUpdateResponse::getRawResponseHeaders' => ['string'], -'SolrUpdateResponse::getRequestUrl' => ['string'], -'SolrUpdateResponse::getResponse' => ['SolrObject'], -'SolrUpdateResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], -'SolrUpdateResponse::success' => ['bool'], -'SolrUtils::digestXmlResponse' => ['SolrObject', 'xmlresponse'=>'string', 'parse_mode='=>'int'], -'SolrUtils::escapeQueryChars' => ['string|false', 'string'=>'string'], -'SolrUtils::getSolrVersion' => ['string'], -'SolrUtils::queryPhrase' => ['string', 'string'=>'string'], -'sort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], -'soundex' => ['string', 'string'=>'string'], -'SphinxClient::__construct' => ['void'], -'SphinxClient::addQuery' => ['int', 'query'=>'string', 'index='=>'string', 'comment='=>'string'], -'SphinxClient::buildExcerpts' => ['array', 'docs'=>'array', 'index'=>'string', 'words'=>'string', 'opts='=>'array'], -'SphinxClient::buildKeywords' => ['array', 'query'=>'string', 'index'=>'string', 'hits'=>'bool'], -'SphinxClient::close' => ['bool'], -'SphinxClient::escapeString' => ['string', 'string'=>'string'], -'SphinxClient::getLastError' => ['string'], -'SphinxClient::getLastWarning' => ['string'], -'SphinxClient::open' => ['bool'], -'SphinxClient::query' => ['array', 'query'=>'string', 'index='=>'string', 'comment='=>'string'], -'SphinxClient::resetFilters' => ['void'], -'SphinxClient::resetGroupBy' => ['void'], -'SphinxClient::runQueries' => ['array'], -'SphinxClient::setArrayResult' => ['bool', 'array_result'=>'bool'], -'SphinxClient::setConnectTimeout' => ['bool', 'timeout'=>'float'], -'SphinxClient::setFieldWeights' => ['bool', 'weights'=>'array'], -'SphinxClient::setFilter' => ['bool', 'attribute'=>'string', 'values'=>'array', 'exclude='=>'bool'], -'SphinxClient::setFilterFloatRange' => ['bool', 'attribute'=>'string', 'min'=>'float', 'max'=>'float', 'exclude='=>'bool'], -'SphinxClient::setFilterRange' => ['bool', 'attribute'=>'string', 'min'=>'int', 'max'=>'int', 'exclude='=>'bool'], -'SphinxClient::setGeoAnchor' => ['bool', 'attrlat'=>'string', 'attrlong'=>'string', 'latitude'=>'float', 'longitude'=>'float'], -'SphinxClient::setGroupBy' => ['bool', 'attribute'=>'string', 'func'=>'int', 'groupsort='=>'string'], -'SphinxClient::setGroupDistinct' => ['bool', 'attribute'=>'string'], -'SphinxClient::setIDRange' => ['bool', 'min'=>'int', 'max'=>'int'], -'SphinxClient::setIndexWeights' => ['bool', 'weights'=>'array'], -'SphinxClient::setLimits' => ['bool', 'offset'=>'int', 'limit'=>'int', 'max_matches='=>'int', 'cutoff='=>'int'], -'SphinxClient::setMatchMode' => ['bool', 'mode'=>'int'], -'SphinxClient::setMaxQueryTime' => ['bool', 'qtime'=>'int'], -'SphinxClient::setOverride' => ['bool', 'attribute'=>'string', 'type'=>'int', 'values'=>'array'], -'SphinxClient::setRankingMode' => ['bool', 'ranker'=>'int'], -'SphinxClient::setRetries' => ['bool', 'count'=>'int', 'delay='=>'int'], -'SphinxClient::setSelect' => ['bool', 'clause'=>'string'], -'SphinxClient::setServer' => ['bool', 'server'=>'string', 'port'=>'int'], -'SphinxClient::setSortMode' => ['bool', 'mode'=>'int', 'sortby='=>'string'], -'SphinxClient::status' => ['array'], -'SphinxClient::updateAttributes' => ['int', 'index'=>'string', 'attributes'=>'array', 'values'=>'array', 'mva='=>'bool'], -'spl_autoload' => ['void', 'class'=>'string', 'file_extensions='=>'string'], -'spl_autoload_call' => ['void', 'class'=>'string'], -'spl_autoload_extensions' => ['string', 'file_extensions='=>'string'], -'spl_autoload_functions' => ['false|list'], -'spl_autoload_register' => ['bool', 'callback='=>'callable(string):void', 'throw='=>'bool', 'prepend='=>'bool'], -'spl_autoload_unregister' => ['bool', 'callback'=>'callable(string):void'], -'spl_classes' => ['array'], -'spl_object_hash' => ['string', 'object'=>'object'], -'spl_object_id' => ['int', 'object'=>'object'], -'SplDoublyLinkedList::__construct' => ['void'], -'SplDoublyLinkedList::add' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], -'SplDoublyLinkedList::bottom' => ['mixed'], -'SplDoublyLinkedList::count' => ['int'], -'SplDoublyLinkedList::current' => ['mixed'], -'SplDoublyLinkedList::getIteratorMode' => ['int'], -'SplDoublyLinkedList::isEmpty' => ['bool'], -'SplDoublyLinkedList::key' => ['mixed'], -'SplDoublyLinkedList::next' => ['void'], -'SplDoublyLinkedList::offsetExists' => ['bool', 'index'=>'mixed'], -'SplDoublyLinkedList::offsetGet' => ['mixed', 'index'=>'mixed'], -'SplDoublyLinkedList::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'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::shift' => ['mixed'], -'SplDoublyLinkedList::top' => ['mixed'], -'SplDoublyLinkedList::unserialize' => ['void', 'serialized'=>'string'], -'SplDoublyLinkedList::unshift' => ['bool', 'value'=>'mixed'], -'SplDoublyLinkedList::valid' => ['bool'], -'SplEnum::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], -'SplEnum::getConstList' => ['array', 'include_default='=>'bool'], -'SplFileInfo::__construct' => ['void', 'file_name'=>'string'], -'SplFileInfo::__toString' => ['string'], -'SplFileInfo::__wakeup' => ['void'], -'SplFileInfo::getATime' => ['int'], -'SplFileInfo::getBasename' => ['string', 'suffix='=>'string'], -'SplFileInfo::getCTime' => ['int'], -'SplFileInfo::getExtension' => ['string'], -'SplFileInfo::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], -'SplFileInfo::getFilename' => ['string'], -'SplFileInfo::getGroup' => ['int'], -'SplFileInfo::getInode' => ['int'], -'SplFileInfo::getLinkTarget' => ['string'], -'SplFileInfo::getMTime' => ['int'], -'SplFileInfo::getOwner' => ['int'], -'SplFileInfo::getPath' => ['string'], -'SplFileInfo::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], -'SplFileInfo::getPathname' => ['string'], -'SplFileInfo::getPerms' => ['int'], -'SplFileInfo::getRealPath' => ['string|false'], -'SplFileInfo::getSize' => ['int'], -'SplFileInfo::getType' => ['string'], -'SplFileInfo::isDir' => ['bool'], -'SplFileInfo::isExecutable' => ['bool'], -'SplFileInfo::isFile' => ['bool'], -'SplFileInfo::isLink' => ['bool'], -'SplFileInfo::isReadable' => ['bool'], -'SplFileInfo::isWritable' => ['bool'], -'SplFileInfo::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], -'SplFileInfo::setFileClass' => ['void', 'class_name='=>'string'], -'SplFileInfo::setInfoClass' => ['void', 'class_name='=>'string'], -'SplFileObject::__construct' => ['void', 'filename'=>'string', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>''], -'SplFileObject::__toString' => ['string'], -'SplFileObject::current' => ['string|array|false'], -'SplFileObject::eof' => ['bool'], -'SplFileObject::fflush' => ['bool'], -'SplFileObject::fgetc' => ['string|false'], -'SplFileObject::fgetcsv' => ['list|array{0: null}|false|null', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'SplFileObject::fgets' => ['string|false'], -'SplFileObject::flock' => ['bool', 'operation'=>'int', '&w_wouldblock='=>'int'], -'SplFileObject::fpassthru' => ['int|false'], -'SplFileObject::fputcsv' => ['int|false', 'fields'=>'array', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'SplFileObject::fread' => ['string|false', 'length'=>'int'], -'SplFileObject::fscanf' => ['array|int', 'format'=>'string', '&...w_vars='=>'string|int|float'], -'SplFileObject::fseek' => ['int', 'pos'=>'int', 'whence='=>'int'], -'SplFileObject::fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}'], -'SplFileObject::ftell' => ['int|false'], -'SplFileObject::ftruncate' => ['bool', 'size'=>'int'], -'SplFileObject::fwrite' => ['int', 'string'=>'string', 'length='=>'int'], -'SplFileObject::getATime' => ['int'], -'SplFileObject::getBasename' => ['string', 'suffix='=>'string'], -'SplFileObject::getChildren' => ['null'], -'SplFileObject::getCsvControl' => ['array'], -'SplFileObject::getCTime' => ['int'], -'SplFileObject::getCurrentLine' => ['string|false'], -'SplFileObject::getExtension' => ['string'], -'SplFileObject::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], -'SplFileObject::getFilename' => ['string'], -'SplFileObject::getFlags' => ['int'], -'SplFileObject::getGroup' => ['int'], -'SplFileObject::getInode' => ['int'], -'SplFileObject::getLinkTarget' => ['string'], -'SplFileObject::getMaxLineLen' => ['int'], -'SplFileObject::getMTime' => ['int'], -'SplFileObject::getOwner' => ['int'], -'SplFileObject::getPath' => ['string'], -'SplFileObject::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], -'SplFileObject::getPathname' => ['string'], -'SplFileObject::getPerms' => ['int'], -'SplFileObject::getRealPath' => ['false|string'], -'SplFileObject::getSize' => ['int'], -'SplFileObject::getType' => ['string'], -'SplFileObject::hasChildren' => ['false'], -'SplFileObject::isDir' => ['bool'], -'SplFileObject::isExecutable' => ['bool'], -'SplFileObject::isFile' => ['bool'], -'SplFileObject::isLink' => ['bool'], -'SplFileObject::isReadable' => ['bool'], -'SplFileObject::isWritable' => ['bool'], -'SplFileObject::key' => ['int'], -'SplFileObject::next' => ['void'], -'SplFileObject::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], -'SplFileObject::rewind' => ['void'], -'SplFileObject::seek' => ['void', 'line_pos'=>'int'], -'SplFileObject::setCsvControl' => ['void', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'SplFileObject::setFileClass' => ['void', 'class_name='=>'string'], -'SplFileObject::setFlags' => ['void', 'flags'=>'int'], -'SplFileObject::setInfoClass' => ['void', 'class_name='=>'string'], -'SplFileObject::setMaxLineLen' => ['void', 'max_len'=>'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::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::offsetUnset' => ['void', 'index'=>'int'], -'SplFixedArray::rewind' => ['void'], -'SplFixedArray::setSize' => ['bool', 'size'=>'int'], -'SplFixedArray::toArray' => ['array'], -'SplFixedArray::valid' => ['bool'], -'SplHeap::__construct' => ['void'], -'SplHeap::compare' => ['int', 'value1'=>'mixed', 'value2'=>'mixed'], -'SplHeap::count' => ['int'], -'SplHeap::current' => ['mixed'], -'SplHeap::extract' => ['mixed'], -'SplHeap::insert' => ['bool', 'value'=>'mixed'], -'SplHeap::isCorrupted' => ['bool'], -'SplHeap::isEmpty' => ['bool'], -'SplHeap::key' => ['int'], -'SplHeap::next' => ['void'], -'SplHeap::recoverFromCorruption' => ['int'], -'SplHeap::rewind' => ['void'], -'SplHeap::top' => ['mixed'], -'SplHeap::valid' => ['bool'], -'SplMaxHeap::__construct' => ['void'], -'SplMaxHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], -'SplMinHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], -'SplMinHeap::count' => ['int'], -'SplMinHeap::current' => ['mixed'], -'SplMinHeap::extract' => ['mixed'], -'SplMinHeap::insert' => ['void', 'value'=>'mixed'], -'SplMinHeap::isCorrupted' => ['int'], -'SplMinHeap::isEmpty' => ['bool'], -'SplMinHeap::key' => ['mixed'], -'SplMinHeap::next' => ['void'], -'SplMinHeap::recoverFromCorruption' => ['void'], -'SplMinHeap::rewind' => ['void'], -'SplMinHeap::top' => ['mixed'], -'SplMinHeap::valid' => ['bool'], -'SplObjectStorage::__construct' => ['void'], -'SplObjectStorage::addAll' => ['void', 'os'=>'splobjectstorage'], -'SplObjectStorage::attach' => ['void', 'object'=>'object', 'inf='=>'mixed'], -'SplObjectStorage::contains' => ['bool', 'object'=>'object'], -'SplObjectStorage::count' => ['int'], -'SplObjectStorage::current' => ['object'], -'SplObjectStorage::detach' => ['void', 'object'=>'object'], -'SplObjectStorage::getHash' => ['string', 'object'=>'object'], -'SplObjectStorage::getInfo' => ['mixed'], -'SplObjectStorage::key' => ['int'], -'SplObjectStorage::next' => ['void'], -'SplObjectStorage::offsetExists' => ['bool', 'object'=>'object'], -'SplObjectStorage::offsetGet' => ['mixed', 'object'=>'object'], -'SplObjectStorage::offsetSet' => ['object', 'object'=>'object', 'data='=>'mixed'], -'SplObjectStorage::offsetUnset' => ['object', 'object'=>'object'], -'SplObjectStorage::removeAll' => ['void', 'os'=>'splobjectstorage'], -'SplObjectStorage::removeAllExcept' => ['void', 'os'=>'splobjectstorage'], -'SplObjectStorage::rewind' => ['void'], -'SplObjectStorage::serialize' => ['string'], -'SplObjectStorage::setInfo' => ['void', 'inf'=>'mixed'], -'SplObjectStorage::unserialize' => ['void', 'serialized'=>'string'], -'SplObjectStorage::valid' => ['bool'], -'SplObserver::update' => ['void', 'subject'=>'SplSubject'], -'SplPriorityQueue::__construct' => ['void'], -'SplPriorityQueue::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], -'SplPriorityQueue::count' => ['int'], -'SplPriorityQueue::current' => ['mixed'], -'SplPriorityQueue::extract' => ['mixed'], -'SplPriorityQueue::getExtractFlags' => ['int'], -'SplPriorityQueue::insert' => ['bool', 'value'=>'mixed', 'priority'=>'mixed'], -'SplPriorityQueue::isCorrupted' => ['bool'], -'SplPriorityQueue::isEmpty' => ['bool'], -'SplPriorityQueue::key' => ['mixed'], -'SplPriorityQueue::next' => ['void'], -'SplPriorityQueue::recoverFromCorruption' => ['void'], -'SplPriorityQueue::rewind' => ['void'], -'SplPriorityQueue::setExtractFlags' => ['void', 'flags'=>'int'], -'SplPriorityQueue::top' => ['mixed'], -'SplPriorityQueue::valid' => ['bool'], -'SplQueue::dequeue' => ['mixed'], -'SplQueue::enqueue' => ['void', 'value'=>'mixed'], -'SplQueue::getIteratorMode' => ['int'], -'SplQueue::isEmpty' => ['bool'], -'SplQueue::key' => ['mixed'], -'SplQueue::next' => ['void'], -'SplQueue::offsetExists' => ['bool', 'index'=>'mixed'], -'SplQueue::offsetGet' => ['mixed', 'index'=>'mixed'], -'SplQueue::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], -'SplQueue::offsetUnset' => ['void', 'index'=>'mixed'], -'SplQueue::pop' => ['mixed'], -'SplQueue::prev' => ['void'], -'SplQueue::push' => ['void', 'value'=>'mixed'], -'SplQueue::rewind' => ['void'], -'SplQueue::serialize' => ['string'], -'SplQueue::setIteratorMode' => ['void', 'mode'=>'int'], -'SplQueue::shift' => ['mixed'], -'SplQueue::top' => ['mixed'], -'SplQueue::unserialize' => ['void', 'serialized'=>'string'], -'SplQueue::unshift' => ['bool', 'value'=>'mixed'], -'SplQueue::valid' => ['bool'], -'SplStack::__construct' => ['void'], -'SplStack::add' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], -'SplStack::bottom' => ['mixed'], -'SplStack::count' => ['int'], -'SplStack::current' => ['mixed'], -'SplStack::getIteratorMode' => ['int'], -'SplStack::isEmpty' => ['bool'], -'SplStack::key' => ['mixed'], -'SplStack::next' => ['void'], -'SplStack::offsetExists' => ['bool', 'index'=>'mixed'], -'SplStack::offsetGet' => ['mixed', 'index'=>'mixed'], -'SplStack::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], -'SplStack::offsetUnset' => ['void', 'index'=>'mixed'], -'SplStack::pop' => ['mixed'], -'SplStack::prev' => ['void'], -'SplStack::push' => ['void', 'value'=>'mixed'], -'SplStack::rewind' => ['void'], -'SplStack::serialize' => ['string'], -'SplStack::setIteratorMode' => ['void', 'mode'=>'int'], -'SplStack::shift' => ['mixed'], -'SplStack::top' => ['mixed'], -'SplStack::unserialize' => ['void', 'serialized'=>'string'], -'SplStack::unshift' => ['bool', 'value'=>'mixed'], -'SplStack::valid' => ['bool'], -'SplSubject::attach' => ['void', 'observer'=>'SplObserver'], -'SplSubject::detach' => ['void', 'observer'=>'SplObserver'], -'SplSubject::notify' => ['void'], -'SplTempFileObject::__construct' => ['void', 'max_memory='=>'int'], -'SplTempFileObject::__toString' => ['string'], -'SplTempFileObject::_bad_state_ex' => [''], -'SplTempFileObject::current' => ['array|false|string'], -'SplTempFileObject::eof' => ['bool'], -'SplTempFileObject::fflush' => ['bool'], -'SplTempFileObject::fgetc' => ['false|string'], -'SplTempFileObject::fgetcsv' => ['list|array{0: null}|false|null', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'SplTempFileObject::fgets' => ['string'], -'SplTempFileObject::fgetss' => ['string', 'allowable_tags='=>'string'], -'SplTempFileObject::flock' => ['bool', 'operation'=>'int', '&wouldblock='=>'int'], -'SplTempFileObject::fpassthru' => ['int|false'], -'SplTempFileObject::fputcsv' => ['false|int', 'fields'=>'array', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'SplTempFileObject::fread' => ['false|string', 'length'=>'int'], -'SplTempFileObject::fscanf' => ['bool', 'format'=>'string', '&...w_vars='=>'array|array|array'], -'SplTempFileObject::fseek' => ['int', 'pos'=>'int', 'whence='=>'int'], -'SplTempFileObject::fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}'], -'SplTempFileObject::ftell' => ['int'], -'SplTempFileObject::ftruncate' => ['bool', 'size'=>'int'], -'SplTempFileObject::fwrite' => ['int', 'string'=>'string', 'length='=>'int'], -'SplTempFileObject::getATime' => ['int'], -'SplTempFileObject::getBasename' => ['string', 'suffix='=>'string'], -'SplTempFileObject::getChildren' => ['null'], -'SplTempFileObject::getCsvControl' => ['array'], -'SplTempFileObject::getCTime' => ['int'], -'SplTempFileObject::getCurrentLine' => ['string'], -'SplTempFileObject::getExtension' => ['string'], -'SplTempFileObject::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], -'SplTempFileObject::getFilename' => ['string'], -'SplTempFileObject::getFlags' => ['int'], -'SplTempFileObject::getGroup' => ['int'], -'SplTempFileObject::getInode' => ['int'], -'SplTempFileObject::getLinkTarget' => ['string'], -'SplTempFileObject::getMaxLineLen' => ['int'], -'SplTempFileObject::getMTime' => ['int'], -'SplTempFileObject::getOwner' => ['int'], -'SplTempFileObject::getPath' => ['string'], -'SplTempFileObject::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], -'SplTempFileObject::getPathname' => ['string'], -'SplTempFileObject::getPerms' => ['int'], -'SplTempFileObject::getRealPath' => ['string'], -'SplTempFileObject::getSize' => ['int'], -'SplTempFileObject::getType' => ['string'], -'SplTempFileObject::hasChildren' => ['bool'], -'SplTempFileObject::isDir' => ['bool'], -'SplTempFileObject::isExecutable' => ['bool'], -'SplTempFileObject::isFile' => ['bool'], -'SplTempFileObject::isLink' => ['bool'], -'SplTempFileObject::isReadable' => ['bool'], -'SplTempFileObject::isWritable' => ['bool'], -'SplTempFileObject::key' => ['int'], -'SplTempFileObject::next' => ['void'], -'SplTempFileObject::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], -'SplTempFileObject::rewind' => ['void'], -'SplTempFileObject::seek' => ['void', 'line_pos'=>'int'], -'SplTempFileObject::setCsvControl' => ['void', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'SplTempFileObject::setFileClass' => ['void', 'class_name='=>'string'], -'SplTempFileObject::setFlags' => ['void', 'flags'=>'int'], -'SplTempFileObject::setInfoClass' => ['void', 'class_name='=>'string'], -'SplTempFileObject::setMaxLineLen' => ['void', 'max_len'=>'int'], -'SplTempFileObject::valid' => ['bool'], -'SplType::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], -'Spoofchecker::__construct' => ['void'], -'Spoofchecker::areConfusable' => ['bool', 's1'=>'string', 's2'=>'string', '&w_error='=>'string'], -'Spoofchecker::isSuspicious' => ['bool', 'text'=>'string', '&w_error='=>'string'], -'Spoofchecker::setAllowedLocales' => ['void', 'locale_list'=>'string'], -'Spoofchecker::setChecks' => ['void', 'checks'=>'long'], -'Spoofchecker::setRestrictionLevel' => ['void', 'restriction_level'=>'int'], -'sprintf' => ['string', 'format'=>'string', '...values='=>'string|int|float'], -'SQLite3::__construct' => ['void', 'filename'=>'string', 'flags='=>'int', 'encryptionKey='=>'?string'], -'SQLite3::busyTimeout' => ['bool', 'milliseconds'=>'int'], -'SQLite3::changes' => ['int'], -'SQLite3::close' => ['bool'], -'SQLite3::createAggregate' => ['bool', 'name'=>'string', 'stepCallback'=>'callable', 'finalCallback'=>'callable', 'argCount='=>'int'], -'SQLite3::createCollation' => ['bool', 'name'=>'string', 'callback'=>'callable'], -'SQLite3::createFunction' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argCount='=>'int', 'flags='=>'int'], -'SQLite3::enableExceptions' => ['bool', 'enable='=>'bool'], -'SQLite3::escapeString' => ['string', 'string'=>'string'], -'SQLite3::exec' => ['bool', 'query'=>'string'], -'SQLite3::lastErrorCode' => ['int'], -'SQLite3::lastErrorMsg' => ['string'], -'SQLite3::lastInsertRowID' => ['int'], -'SQLite3::loadExtension' => ['bool', 'name'=>'string'], -'SQLite3::open' => ['void', 'filename'=>'string', 'flags='=>'int', 'encryptionKey='=>'?string'], -'SQLite3::openBlob' => ['resource|false', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'database='=>'string', 'flags='=>'int'], -'SQLite3::prepare' => ['SQLite3Stmt|false', 'query'=>'string'], -'SQLite3::query' => ['SQLite3Result|false', 'query'=>'string'], -'SQLite3::querySingle' => ['array|int|string|bool|float|null|false', 'query'=>'string', 'entireRow='=>'bool'], -'SQLite3::version' => ['array'], -'SQLite3Result::__construct' => ['void'], -'SQLite3Result::columnName' => ['string', 'column'=>'int'], -'SQLite3Result::columnType' => ['int', 'column'=>'int'], -'SQLite3Result::fetchArray' => ['array|false', 'mode='=>'int'], -'SQLite3Result::finalize' => ['bool'], -'SQLite3Result::numColumns' => ['int'], -'SQLite3Result::reset' => ['bool'], -'SQLite3Stmt::__construct' => ['void', 'sqlite3'=>'sqlite3', 'query'=>'string'], -'SQLite3Stmt::bindParam' => ['bool', 'param'=>'string|int', '&rw_var'=>'mixed', 'type='=>'int'], -'SQLite3Stmt::bindValue' => ['bool', 'param'=>'string|int', 'value'=>'mixed', 'type='=>'int'], -'SQLite3Stmt::clear' => ['bool'], -'SQLite3Stmt::close' => ['bool'], -'SQLite3Stmt::execute' => ['false|SQLite3Result'], -'SQLite3Stmt::getSQL' => ['string', 'expand='=>'bool'], -'SQLite3Stmt::paramCount' => ['int'], -'SQLite3Stmt::readOnly' => ['bool'], -'SQLite3Stmt::reset' => ['bool'], -'sqlite_array_query' => ['array|false', 'dbhandle'=>'resource', 'query'=>'string', 'result_type='=>'int', 'decode_binary='=>'bool'], -'sqlite_busy_timeout' => ['void', 'dbhandle'=>'resource', 'milliseconds'=>'int'], -'sqlite_changes' => ['int', 'dbhandle'=>'resource'], -'sqlite_close' => ['void', 'dbhandle'=>'resource'], -'sqlite_column' => ['mixed', 'result'=>'resource', 'index_or_name'=>'mixed', 'decode_binary='=>'bool'], -'sqlite_create_aggregate' => ['void', 'dbhandle'=>'resource', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], -'sqlite_create_function' => ['void', 'dbhandle'=>'resource', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], -'sqlite_current' => ['array|false', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], -'sqlite_error_string' => ['string', 'error_code'=>'int'], -'sqlite_escape_string' => ['string', 'item'=>'string'], -'sqlite_exec' => ['bool', 'dbhandle'=>'resource', 'query'=>'string', 'error_msg='=>'string'], -'sqlite_factory' => ['SQLiteDatabase', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], -'sqlite_fetch_all' => ['array', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], -'sqlite_fetch_array' => ['array|false', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], -'sqlite_fetch_column_types' => ['array|false', 'table_name'=>'string', 'dbhandle'=>'resource', 'result_type='=>'int'], -'sqlite_fetch_object' => ['object', 'result'=>'resource', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], -'sqlite_fetch_single' => ['string', 'result'=>'resource', 'decode_binary='=>'bool'], -'sqlite_fetch_string' => ['string', 'result'=>'resource', 'decode_binary'=>'bool'], -'sqlite_field_name' => ['string', 'result'=>'resource', 'field_index'=>'int'], -'sqlite_has_more' => ['bool', 'result'=>'resource'], -'sqlite_has_prev' => ['bool', 'result'=>'resource'], -'sqlite_key' => ['int', 'result'=>'resource'], -'sqlite_last_error' => ['int', 'dbhandle'=>'resource'], -'sqlite_last_insert_rowid' => ['int', 'dbhandle'=>'resource'], -'sqlite_libencoding' => ['string'], -'sqlite_libversion' => ['string'], -'sqlite_next' => ['bool', 'result'=>'resource'], -'sqlite_num_fields' => ['int', 'result'=>'resource'], -'sqlite_num_rows' => ['int', 'result'=>'resource'], -'sqlite_open' => ['resource|false', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], -'sqlite_popen' => ['resource|false', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], -'sqlite_prev' => ['bool', 'result'=>'resource'], -'sqlite_query' => ['resource|false', 'dbhandle'=>'resource', 'query'=>'resource|string', 'result_type='=>'int', 'error_msg='=>'string'], -'sqlite_rewind' => ['bool', 'result'=>'resource'], -'sqlite_seek' => ['bool', 'result'=>'resource', 'rownum'=>'int'], -'sqlite_single_query' => ['array', 'db'=>'resource', 'query'=>'string', 'first_row_only='=>'bool', 'decode_binary='=>'bool'], -'sqlite_udf_decode_binary' => ['string', 'data'=>'string'], -'sqlite_udf_encode_binary' => ['string', 'data'=>'string'], -'sqlite_unbuffered_query' => ['SQLiteUnbuffered|false', 'dbhandle'=>'resource', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], -'sqlite_valid' => ['bool', 'result'=>'resource'], -'SQLiteDatabase::__construct' => ['void', 'filename'=>'', 'mode='=>'int|mixed', '&error_message'=>''], -'SQLiteDatabase::arrayQuery' => ['array', 'query'=>'string', 'result_type='=>'int', 'decode_binary='=>'bool'], -'SQLiteDatabase::busyTimeout' => ['int', 'milliseconds'=>'int'], -'SQLiteDatabase::changes' => ['int'], -'SQLiteDatabase::createAggregate' => ['', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], -'SQLiteDatabase::createFunction' => ['', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], -'SQLiteDatabase::exec' => ['bool', 'query'=>'string', 'error_msg='=>'string'], -'SQLiteDatabase::fetchColumnTypes' => ['array', 'table_name'=>'string', 'result_type='=>'int'], -'SQLiteDatabase::lastError' => ['int'], -'SQLiteDatabase::lastInsertRowid' => ['int'], -'SQLiteDatabase::query' => ['SQLiteResult|false', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], -'SQLiteDatabase::queryExec' => ['bool', 'query'=>'string', '&w_error_msg='=>'string'], -'SQLiteDatabase::singleQuery' => ['array', 'query'=>'string', 'first_row_only='=>'bool', 'decode_binary='=>'bool'], -'SQLiteDatabase::unbufferedQuery' => ['SQLiteUnbuffered|false', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], -'SQLiteException::__clone' => ['void'], -'SQLiteException::__construct' => ['void', 'message'=>'', 'code'=>'', 'previous'=>''], -'SQLiteException::__toString' => ['string'], -'SQLiteException::__wakeup' => ['void'], -'SQLiteException::getCode' => ['int'], -'SQLiteException::getFile' => ['string'], -'SQLiteException::getLine' => ['int'], -'SQLiteException::getMessage' => ['string'], -'SQLiteException::getPrevious' => ['RuntimeException|Throwable|null'], -'SQLiteException::getTrace' => ['list\',args?:array}>'], -'SQLiteException::getTraceAsString' => ['string'], -'SQLiteResult::__construct' => ['void'], -'SQLiteResult::column' => ['mixed', 'index_or_name'=>'', 'decode_binary='=>'bool'], -'SQLiteResult::count' => ['int'], -'SQLiteResult::current' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], -'SQLiteResult::fetch' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], -'SQLiteResult::fetchAll' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], -'SQLiteResult::fetchObject' => ['object', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], -'SQLiteResult::fetchSingle' => ['string', 'decode_binary='=>'bool'], -'SQLiteResult::fieldName' => ['string', 'field_index'=>'int'], -'SQLiteResult::hasPrev' => ['bool'], -'SQLiteResult::key' => ['mixed|null'], -'SQLiteResult::next' => ['bool'], -'SQLiteResult::numFields' => ['int'], -'SQLiteResult::numRows' => ['int'], -'SQLiteResult::prev' => ['bool'], -'SQLiteResult::rewind' => ['bool'], -'SQLiteResult::seek' => ['bool', 'rownum'=>'int'], -'SQLiteResult::valid' => ['bool'], -'SQLiteUnbuffered::column' => ['void', 'index_or_name'=>'', 'decode_binary='=>'bool'], -'SQLiteUnbuffered::current' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], -'SQLiteUnbuffered::fetch' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], -'SQLiteUnbuffered::fetchAll' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], -'SQLiteUnbuffered::fetchObject' => ['object', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], -'SQLiteUnbuffered::fetchSingle' => ['string', 'decode_binary='=>'bool'], -'SQLiteUnbuffered::fieldName' => ['string', 'field_index'=>'int'], -'SQLiteUnbuffered::next' => ['bool'], -'SQLiteUnbuffered::numFields' => ['int'], -'SQLiteUnbuffered::valid' => ['bool'], -'sqlsrv_begin_transaction' => ['bool', 'conn'=>'resource'], -'sqlsrv_cancel' => ['bool', 'stmt'=>'resource'], -'sqlsrv_client_info' => ['array|false', 'conn'=>'resource'], -'sqlsrv_close' => ['bool', 'conn'=>'?resource'], -'sqlsrv_commit' => ['bool', 'conn'=>'resource'], -'sqlsrv_configure' => ['bool', 'setting'=>'string', 'value'=>'mixed'], -'sqlsrv_connect' => ['resource|false', 'serverName'=>'string', 'connectionInfo='=>'array'], -'sqlsrv_errors' => ['?array', 'errorsOrWarnings='=>'int'], -'sqlsrv_execute' => ['bool', 'stmt'=>'resource'], -'sqlsrv_fetch' => ['?bool', 'stmt'=>'resource', 'row='=>'int', 'offset='=>'int'], -'sqlsrv_fetch_array' => ['array|null|false', 'stmt'=>'resource', 'fetchType='=>'int', 'row='=>'int', 'offset='=>'int'], -'sqlsrv_fetch_object' => ['object|null|false', 'stmt'=>'resource', 'className='=>'string', 'ctorParams='=>'array', 'row='=>'int', 'offset='=>'int'], -'sqlsrv_field_metadata' => ['array|false', 'stmt'=>'resource'], -'sqlsrv_free_stmt' => ['bool', 'stmt'=>'resource'], -'sqlsrv_get_config' => ['mixed', 'setting'=>'string'], -'sqlsrv_get_field' => ['mixed', 'stmt'=>'resource', 'fieldIndex'=>'int', 'getAsType='=>'int'], -'sqlsrv_has_rows' => ['bool', 'stmt'=>'resource'], -'sqlsrv_next_result' => ['?bool', 'stmt'=>'resource'], -'sqlsrv_num_fields' => ['int|false', 'stmt'=>'resource'], -'sqlsrv_num_rows' => ['int|false', 'stmt'=>'resource'], -'sqlsrv_prepare' => ['resource|false', 'conn'=>'resource', 'sql'=>'string', 'params='=>'array', 'options='=>'array'], -'sqlsrv_query' => ['resource|false', 'conn'=>'resource', 'sql'=>'string', 'params='=>'array', 'options='=>'array'], -'sqlsrv_rollback' => ['bool', 'conn'=>'resource'], -'sqlsrv_rows_affected' => ['int|false', 'stmt'=>'resource'], -'sqlsrv_send_stream_data' => ['bool', 'stmt'=>'resource'], -'sqlsrv_server_info' => ['array', 'conn'=>'resource'], -'sqrt' => ['float', 'num'=>'float'], -'srand' => ['void', 'seed='=>'int', 'mode='=>'int'], -'sscanf' => ['list|int|null', 'string'=>'string', 'format'=>'string', '&...w_vars='=>'string|int|float|null'], -'ssdeep_fuzzy_compare' => ['int', 'signature1'=>'string', 'signature2'=>'string'], -'ssdeep_fuzzy_hash' => ['string', 'to_hash'=>'string'], -'ssdeep_fuzzy_hash_filename' => ['string', 'file_name'=>'string'], -'ssh2_auth_agent' => ['bool', 'session'=>'resource', 'username'=>'string'], -'ssh2_auth_hostbased_file' => ['bool', 'session'=>'resource', 'username'=>'string', 'hostname'=>'string', 'pubkeyfile'=>'string', 'privkeyfile'=>'string', 'passphrase='=>'string', 'local_username='=>'string'], -'ssh2_auth_none' => ['bool|string[]', 'session'=>'resource', 'username'=>'string'], -'ssh2_auth_password' => ['bool', 'session'=>'resource', 'username'=>'string', 'password'=>'string'], -'ssh2_auth_pubkey_file' => ['bool', 'session'=>'resource', 'username'=>'string', 'pubkeyfile'=>'string', 'privkeyfile'=>'string', 'passphrase='=>'string'], -'ssh2_connect' => ['resource|false', 'host'=>'string', 'port='=>'int', 'methods='=>'array', 'callbacks='=>'array'], -'ssh2_disconnect' => ['bool', 'session'=>'resource'], -'ssh2_exec' => ['resource|false', 'session'=>'resource', 'command'=>'string', 'pty='=>'string', 'env='=>'array', 'width='=>'int', 'height='=>'int', 'width_height_type='=>'int'], -'ssh2_fetch_stream' => ['resource|false', 'channel'=>'resource', 'streamid'=>'int'], -'ssh2_fingerprint' => ['string|false', 'session'=>'resource', 'flags='=>'int'], -'ssh2_forward_accept' => ['resource|false', 'session'=>'resource'], -'ssh2_forward_listen' => ['resource|false', 'session'=>'resource', 'port'=>'int', 'host='=>'string', 'max_connections='=>'string'], -'ssh2_methods_negotiated' => ['array|false', 'session'=>'resource'], -'ssh2_poll' => ['int', '&polldes'=>'array', 'timeout='=>'int'], -'ssh2_publickey_add' => ['bool', 'pkey'=>'resource', 'algoname'=>'string', 'blob'=>'string', 'overwrite='=>'bool', 'attributes='=>'array'], -'ssh2_publickey_init' => ['resource|false', 'session'=>'resource'], -'ssh2_publickey_list' => ['array|false', 'pkey'=>'resource'], -'ssh2_publickey_remove' => ['bool', 'pkey'=>'resource', 'algoname'=>'string', 'blob'=>'string'], -'ssh2_scp_recv' => ['bool', 'session'=>'resource', 'remote_file'=>'string', 'local_file'=>'string'], -'ssh2_scp_send' => ['bool', 'session'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'create_mode='=>'int'], -'ssh2_sftp' => ['resource|false', 'session'=>'resource'], -'ssh2_sftp_chmod' => ['bool', 'sftp'=>'resource', 'filename'=>'string', 'mode'=>'int'], -'ssh2_sftp_lstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'sftp'=>'resource', 'path'=>'string'], -'ssh2_sftp_mkdir' => ['bool', 'sftp'=>'resource', 'dirname'=>'string', 'mode='=>'int', 'recursive='=>'bool'], -'ssh2_sftp_readlink' => ['string|false', 'sftp'=>'resource', 'link'=>'string'], -'ssh2_sftp_realpath' => ['string|false', 'sftp'=>'resource', 'filename'=>'string'], -'ssh2_sftp_rename' => ['bool', 'sftp'=>'resource', 'from'=>'string', 'to'=>'string'], -'ssh2_sftp_rmdir' => ['bool', 'sftp'=>'resource', 'dirname'=>'string'], -'ssh2_sftp_stat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'sftp'=>'resource', 'path'=>'string'], -'ssh2_sftp_symlink' => ['bool', 'sftp'=>'resource', 'target'=>'string', 'link'=>'string'], -'ssh2_sftp_unlink' => ['bool', 'sftp'=>'resource', 'filename'=>'string'], -'ssh2_shell' => ['resource|false', 'session'=>'resource', 'term_type='=>'string', 'env='=>'array', 'width='=>'int', 'height='=>'int', 'width_height_type='=>'int'], -'ssh2_tunnel' => ['resource|false', 'session'=>'resource', 'host'=>'string', 'port'=>'int'], -'stat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'filename'=>'string'], -'stats_absolute_deviation' => ['float', 'a'=>'array'], -'stats_cdf_beta' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_binomial' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_cauchy' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_chisquare' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], -'stats_cdf_exponential' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], -'stats_cdf_f' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_gamma' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_laplace' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_logistic' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_negative_binomial' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_noncentral_chisquare' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_noncentral_f' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'par4'=>'float', 'which'=>'int'], -'stats_cdf_noncentral_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_normal' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_poisson' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], -'stats_cdf_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], -'stats_cdf_uniform' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_cdf_weibull' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_covariance' => ['float', 'a'=>'array', 'b'=>'array'], -'stats_den_uniform' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], -'stats_dens_beta' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], -'stats_dens_cauchy' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], -'stats_dens_chisquare' => ['float', 'x'=>'float', 'dfr'=>'float'], -'stats_dens_exponential' => ['float', 'x'=>'float', 'scale'=>'float'], -'stats_dens_f' => ['float', 'x'=>'float', 'dfr1'=>'float', 'dfr2'=>'float'], -'stats_dens_gamma' => ['float', 'x'=>'float', 'shape'=>'float', 'scale'=>'float'], -'stats_dens_laplace' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], -'stats_dens_logistic' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], -'stats_dens_negative_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], -'stats_dens_normal' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], -'stats_dens_pmf_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], -'stats_dens_pmf_hypergeometric' => ['float', 'n1'=>'float', 'n2'=>'float', 'N1'=>'float', 'N2'=>'float'], -'stats_dens_pmf_negative_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], -'stats_dens_pmf_poisson' => ['float', 'x'=>'float', 'lb'=>'float'], -'stats_dens_t' => ['float', 'x'=>'float', 'dfr'=>'float'], -'stats_dens_uniform' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], -'stats_dens_weibull' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], -'stats_harmonic_mean' => ['float', 'a'=>'array'], -'stats_kurtosis' => ['float', 'a'=>'array'], -'stats_rand_gen_beta' => ['float', 'a'=>'float', 'b'=>'float'], -'stats_rand_gen_chisquare' => ['float', 'df'=>'float'], -'stats_rand_gen_exponential' => ['float', 'av'=>'float'], -'stats_rand_gen_f' => ['float', 'dfn'=>'float', 'dfd'=>'float'], -'stats_rand_gen_funiform' => ['float', 'low'=>'float', 'high'=>'float'], -'stats_rand_gen_gamma' => ['float', 'a'=>'float', 'r'=>'float'], -'stats_rand_gen_ibinomial' => ['int', 'n'=>'int', 'pp'=>'float'], -'stats_rand_gen_ibinomial_negative' => ['int', 'n'=>'int', 'p'=>'float'], -'stats_rand_gen_int' => ['int'], -'stats_rand_gen_ipoisson' => ['int', 'mu'=>'float'], -'stats_rand_gen_iuniform' => ['int', 'low'=>'int', 'high'=>'int'], -'stats_rand_gen_noncenral_chisquare' => ['float', 'df'=>'float', 'xnonc'=>'float'], -'stats_rand_gen_noncentral_chisquare' => ['float', 'df'=>'float', 'xnonc'=>'float'], -'stats_rand_gen_noncentral_f' => ['float', 'dfn'=>'float', 'dfd'=>'float', 'xnonc'=>'float'], -'stats_rand_gen_noncentral_t' => ['float', 'df'=>'float', 'xnonc'=>'float'], -'stats_rand_gen_normal' => ['float', 'av'=>'float', 'sd'=>'float'], -'stats_rand_gen_t' => ['float', 'df'=>'float'], -'stats_rand_get_seeds' => ['array'], -'stats_rand_phrase_to_seeds' => ['array', 'phrase'=>'string'], -'stats_rand_ranf' => ['float'], -'stats_rand_setall' => ['void', 'iseed1'=>'int', 'iseed2'=>'int'], -'stats_skew' => ['float', 'a'=>'array'], -'stats_standard_deviation' => ['float', 'a'=>'array', 'sample='=>'bool'], -'stats_stat_binomial_coef' => ['float', 'x'=>'int', 'n'=>'int'], -'stats_stat_correlation' => ['float', 'array1'=>'array', 'array2'=>'array'], -'stats_stat_factorial' => ['float', 'n'=>'int'], -'stats_stat_gennch' => ['float', 'n'=>'int'], -'stats_stat_independent_t' => ['float', 'array1'=>'array', 'array2'=>'array'], -'stats_stat_innerproduct' => ['float', 'array1'=>'array', 'array2'=>'array'], -'stats_stat_noncentral_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_stat_paired_t' => ['float', 'array1'=>'array', 'array2'=>'array'], -'stats_stat_percentile' => ['float', 'arr'=>'array', 'perc'=>'float'], -'stats_stat_powersum' => ['float', 'arr'=>'array', 'power'=>'float'], -'stats_variance' => ['float', 'a'=>'array', 'sample='=>'bool'], -'Stomp::__construct' => ['void', 'broker='=>'string', 'username='=>'string', 'password='=>'string', 'headers='=>'array'], -'Stomp::__destruct' => ['bool', 'link'=>''], -'Stomp::abort' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], -'Stomp::ack' => ['bool', 'msg'=>'', 'headers='=>'array', 'link='=>''], -'Stomp::begin' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], -'Stomp::commit' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], -'Stomp::error' => ['string', 'link'=>''], -'Stomp::getReadTimeout' => ['array', 'link'=>''], -'Stomp::getSessionId' => ['string', 'link'=>''], -'Stomp::hasFrame' => ['bool', 'link'=>''], -'Stomp::readFrame' => ['array', 'class_name='=>'string', 'link='=>''], -'Stomp::send' => ['bool', 'destination'=>'string', 'msg'=>'', 'headers='=>'array', 'link='=>''], -'Stomp::setReadTimeout' => ['', 'seconds'=>'int', 'microseconds='=>'int', 'link='=>''], -'Stomp::subscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], -'Stomp::unsubscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], -'stomp_abort' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], -'stomp_ack' => ['bool', 'msg'=>'', 'headers='=>'array', 'link='=>''], -'stomp_begin' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], -'stomp_close' => ['bool', 'link'=>''], -'stomp_commit' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], -'stomp_connect' => ['resource', 'broker='=>'string', 'username='=>'string', 'password='=>'string', 'headers='=>'array'], -'stomp_connect_error' => ['string'], -'stomp_error' => ['string', 'link'=>''], -'stomp_get_read_timeout' => ['array', 'link'=>''], -'stomp_get_session_id' => ['string', 'link'=>''], -'stomp_has_frame' => ['bool', 'link'=>''], -'stomp_read_frame' => ['array', 'class_name='=>'string', 'link='=>''], -'stomp_send' => ['bool', 'destination'=>'string', 'msg'=>'', 'headers='=>'array', 'link='=>''], -'stomp_set_read_timeout' => ['', 'seconds'=>'int', 'microseconds='=>'int', 'link='=>''], -'stomp_subscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], -'stomp_unsubscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], -'stomp_version' => ['string'], -'StompException::getDetails' => ['string'], -'StompFrame::__construct' => ['void', 'command='=>'string', 'headers='=>'array', 'body='=>'string'], -'str_contains' => ['bool', 'haystack'=>'string', 'needle'=>'string'], -'str_ends_with' => ['bool', 'haystack'=>'string', 'needle'=>'string'], -'str_getcsv' => ['non-empty-list', 'string'=>'string', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'str_ireplace' => ['string|string[]', 'search'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', '&w_count='=>'int'], -'str_pad' => ['string', 'string'=>'string', 'length'=>'int', 'pad_string='=>'string', 'pad_type='=>'int'], -'str_repeat' => ['string', 'string'=>'string', 'times'=>'int'], -'str_replace' => ['string|string[]', 'search'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', '&w_count='=>'int'], -'str_rot13' => ['string', 'string'=>'string'], -'str_shuffle' => ['string', 'string'=>'string'], -'str_split' => ['non-empty-list', 'string'=>'string', 'length='=>'positive-int'], -'str_starts_with' => ['bool', 'haystack'=>'string', 'needle'=>'string'], -'str_word_count' => ['array|int', 'string'=>'string', 'format='=>'int', 'characters='=>'string'], -'strcasecmp' => ['int', 'string1'=>'string', 'string2'=>'string'], -'strchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], -'strcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], -'strcoll' => ['int', 'string1'=>'string', 'string2'=>'string'], -'strcspn' => ['int', 'string'=>'string', 'characters'=>'string', 'offset='=>'int', 'length='=>'int'], -'stream_bucket_append' => ['void', 'brigade'=>'resource', 'bucket'=>'object'], -'stream_bucket_make_writeable' => ['?object', 'brigade'=>'resource'], -'stream_bucket_new' => ['object|false', 'stream'=>'resource', 'buffer'=>'string'], -'stream_bucket_prepend' => ['void', 'brigade'=>'resource', 'bucket'=>'object'], -'stream_context_create' => ['resource', 'options='=>'array', 'params='=>'array'], -'stream_context_get_default' => ['resource', 'options='=>'array'], -'stream_context_get_options' => ['array', 'stream_or_context'=>'resource'], -'stream_context_get_params' => ['array', 'context'=>'resource'], -'stream_context_set_default' => ['resource', 'options'=>'array'], -'stream_context_set_option' => ['bool', 'context'=>'', 'wrapper_or_options'=>'string', 'option_name'=>'string', 'value'=>''], -'stream_context_set_option\'1' => ['bool', 'context'=>'', 'wrapper_or_options'=>'array'], -'stream_context_set_params' => ['bool', 'context'=>'resource', 'params'=>'array'], -'stream_copy_to_stream' => ['int|false', 'from'=>'resource', 'to'=>'resource', 'length='=>'int', 'offset='=>'int'], -'stream_encoding' => ['bool', 'stream'=>'resource', 'encoding='=>'string'], -'stream_filter_append' => ['resource|false', 'stream'=>'resource', 'filter_name'=>'string', 'mode='=>'int', 'params='=>'mixed'], -'stream_filter_prepend' => ['resource|false', 'stream'=>'resource', 'filter_name'=>'string', 'mode='=>'int', 'params='=>'mixed'], -'stream_filter_register' => ['bool', 'filter_name'=>'string', 'class'=>'string'], -'stream_filter_remove' => ['bool', 'stream_filter'=>'resource'], -'stream_get_contents' => ['string|false', 'stream'=>'resource', 'length='=>'int', 'offset='=>'int'], -'stream_get_filters' => ['array'], -'stream_get_line' => ['string|false', 'stream'=>'resource', 'length'=>'int', 'ending='=>'string'], -'stream_get_meta_data' => ['array{timed_out:bool,blocked:bool,eof:bool,unread_bytes:int,stream_type:string,wrapper_type:string,wrapper_data:mixed,mode:string,seekable:bool,uri:string,mediatype:string,crypto?:array{protocol:string,cipher_name:string,cipher_bits:int,cipher_version:string}}', 'stream'=>'resource'], -'stream_get_transports' => ['list'], -'stream_get_wrappers' => ['list'], -'stream_is_local' => ['bool', 'stream'=>'resource|string'], -'stream_isatty' => ['bool', 'stream'=>'resource'], -'stream_notification_callback' => ['callback', 'notification_code'=>'int', 'severity'=>'int', 'message'=>'string', 'message_code'=>'int', 'bytes_transferred'=>'int', 'bytes_max'=>'int'], -'stream_register_wrapper' => ['bool', 'protocol'=>'string', 'class'=>'string', 'flags='=>'int'], -'stream_resolve_include_path' => ['string|false', 'filename'=>'string'], -'stream_select' => ['int|false', '&rw_read'=>'resource[]', '&rw_write'=>'?resource[]', '&rw_except'=>'?resource[]', 'seconds'=>'?int', 'microseconds='=>'?int'], -'stream_set_blocking' => ['bool', 'stream'=>'resource', 'enable'=>'bool'], -'stream_set_chunk_size' => ['int|false', 'stream'=>'resource', 'size'=>'int'], -'stream_set_read_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], -'stream_set_timeout' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], -'stream_set_write_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], -'stream_socket_accept' => ['resource|false', 'socket'=>'resource', 'timeout='=>'float', '&w_peer_name='=>'string'], -'stream_socket_client' => ['resource|false', 'address'=>'string', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float', 'flags='=>'int', 'context='=>'resource'], -'stream_socket_enable_crypto' => ['int|bool', 'stream'=>'resource', 'enable'=>'bool', 'crypto_method='=>'int', 'session_stream='=>'resource'], -'stream_socket_get_name' => ['string', 'socket'=>'resource', 'remote'=>'bool'], -'stream_socket_pair' => ['resource[]|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], -'stream_socket_recvfrom' => ['string', 'socket'=>'resource', 'length'=>'int', 'flags='=>'int', '&w_address='=>'string'], -'stream_socket_sendto' => ['int', 'socket'=>'resource', 'data'=>'string', 'flags='=>'int', 'address='=>'string'], -'stream_socket_server' => ['resource|false', 'address'=>'string', '&w_error_code='=>'int', '&w_error_message='=>'string', 'flags='=>'int', 'context='=>'resource'], -'stream_socket_shutdown' => ['bool', 'stream'=>'resource', 'mode'=>'int'], -'stream_supports_lock' => ['bool', 'stream'=>'resource'], -'stream_wrapper_register' => ['bool', 'protocol'=>'string', 'class'=>'string', 'flags='=>'int'], -'stream_wrapper_restore' => ['bool', 'protocol'=>'string'], -'stream_wrapper_unregister' => ['bool', 'protocol'=>'string'], -'streamWrapper::__construct' => ['void'], -'streamWrapper::__destruct' => ['void'], -'streamWrapper::dir_closedir' => ['bool'], -'streamWrapper::dir_opendir' => ['bool', 'path'=>'string', 'options'=>'int'], -'streamWrapper::dir_readdir' => ['string'], -'streamWrapper::dir_rewinddir' => ['bool'], -'streamWrapper::mkdir' => ['bool', 'path'=>'string', 'mode'=>'int', 'options'=>'int'], -'streamWrapper::rename' => ['bool', 'path_from'=>'string', 'path_to'=>'string'], -'streamWrapper::rmdir' => ['bool', 'path'=>'string', 'options'=>'int'], -'streamWrapper::stream_cast' => ['resource', 'cast_as'=>'int'], -'streamWrapper::stream_close' => ['void'], -'streamWrapper::stream_eof' => ['bool'], -'streamWrapper::stream_flush' => ['bool'], -'streamWrapper::stream_lock' => ['bool', 'operation'=>'mode'], -'streamWrapper::stream_metadata' => ['bool', 'path'=>'string', 'option'=>'int', 'value'=>'mixed'], -'streamWrapper::stream_open' => ['bool', 'path'=>'string', 'mode'=>'string', 'options'=>'int', 'opened_path'=>'string'], -'streamWrapper::stream_read' => ['string', 'count'=>'int'], -'streamWrapper::stream_seek' => ['bool', 'offset'=>'int', 'whence'=>'int'], -'streamWrapper::stream_set_option' => ['bool', 'option'=>'int', 'arg1'=>'int', 'arg2'=>'int'], -'streamWrapper::stream_stat' => ['array'], -'streamWrapper::stream_tell' => ['int'], -'streamWrapper::stream_truncate' => ['bool', 'new_size'=>'int'], -'streamWrapper::stream_write' => ['int', 'data'=>'string'], -'streamWrapper::unlink' => ['bool', 'path'=>'string'], -'streamWrapper::url_stat' => ['array', 'path'=>'string', 'flags'=>'int'], -'strftime' => ['string|false', 'format'=>'string', 'timestamp='=>'?int'], -'strip_tags' => ['string', 'string'=>'string', 'allowed_tags='=>'string'], -'stripcslashes' => ['string', 'string'=>'string'], -'stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], -'stripslashes' => ['string', 'string'=>'string'], -'stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], -'strlen' => ['0|positive-int', 'string'=>'string'], -'strnatcasecmp' => ['int', 'string1'=>'string', 'string2'=>'string'], -'strnatcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], -'strncasecmp' => ['int', 'string1'=>'string', 'string2'=>'string', 'length'=>'int'], -'strncmp' => ['int', 'string1'=>'string', 'string2'=>'string', 'length'=>'int'], -'strpbrk' => ['string|false', 'string'=>'string', 'characters'=>'string'], -'strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], -'strptime' => ['array|false', 'timestamp'=>'string', 'format'=>'string'], -'strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string'], -'strrev' => ['string', 'string'=>'string'], -'strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], -'strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], -'strspn' => ['int', 'string'=>'string', 'characters'=>'string', 'offset='=>'int', 'length='=>'int'], -'strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], -'strtok' => ['string|false', 'string'=>'string', 'token'=>'string'], -'strtok\'1' => ['string|false', 'string'=>'string'], -'strtolower' => ['lowercase-string', 'string'=>'string'], -'strtotime' => ['int|false', 'datetime'=>'string', 'baseTimestamp='=>'int'], -'strtoupper' => ['string', 'string'=>'string'], -'strtr' => ['string', 'string'=>'string', 'from'=>'string', 'to'=>'string'], -'strtr\'1' => ['string', 'string'=>'string', 'from'=>'array'], -'strval' => ['string', 'value'=>'mixed'], -'styleObj::__construct' => ['void', 'label'=>'labelObj', 'style'=>'styleObj'], -'styleObj::convertToString' => ['string'], -'styleObj::free' => ['void'], -'styleObj::getBinding' => ['string', 'stylebinding'=>'mixed'], -'styleObj::getGeomTransform' => ['string'], -'styleObj::ms_newStyleObj' => ['styleObj', 'class'=>'classObj', 'style'=>'styleObj'], -'styleObj::removeBinding' => ['int', 'stylebinding'=>'mixed'], -'styleObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'styleObj::setBinding' => ['int', 'stylebinding'=>'mixed', 'value'=>'string'], -'styleObj::setGeomTransform' => ['int', 'value'=>'string'], -'styleObj::updateFromString' => ['int', 'snippet'=>'string'], -'substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int'], -'substr_compare' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset'=>'int', 'length='=>'int', 'case_insensitive='=>'bool'], -'substr_count' => ['int', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'length='=>'int'], -'substr_replace' => ['string|string[]', 'string'=>'string|string[]', 'replace'=>'mixed', 'offset'=>'mixed', 'length='=>'mixed'], -'suhosin_encrypt_cookie' => ['string|false', 'name'=>'string', 'value'=>'string'], -'suhosin_get_raw_cookies' => ['array'], -'SVM::__construct' => ['void'], -'svm::crossvalidate' => ['float', 'problem'=>'array', 'number_of_folds'=>'int'], -'SVM::getOptions' => ['array'], -'SVM::setOptions' => ['bool', 'params'=>'array'], -'svm::train' => ['SVMModel', 'problem'=>'array', 'weights='=>'array'], -'SVMModel::__construct' => ['void', 'filename='=>'string'], -'SVMModel::checkProbabilityModel' => ['bool'], -'SVMModel::getLabels' => ['array'], -'SVMModel::getNrClass' => ['int'], -'SVMModel::getSvmType' => ['int'], -'SVMModel::getSvrProbability' => ['float'], -'SVMModel::load' => ['bool', 'filename'=>'string'], -'SVMModel::predict' => ['float', 'data'=>'array'], -'SVMModel::predict_probability' => ['float', 'data'=>'array'], -'SVMModel::save' => ['bool', 'filename'=>'string'], -'svn_add' => ['bool', 'path'=>'string', 'recursive='=>'bool', 'force='=>'bool'], -'svn_auth_get_parameter' => ['?string', 'key'=>'string'], -'svn_auth_set_parameter' => ['void', 'key'=>'string', 'value'=>'string'], -'svn_blame' => ['array', 'repository_url'=>'string', 'revision_no='=>'int'], -'svn_cat' => ['string', 'repos_url'=>'string', 'revision_no='=>'int'], -'svn_checkout' => ['bool', 'repos'=>'string', 'targetpath'=>'string', 'revision='=>'int', 'flags='=>'int'], -'svn_cleanup' => ['bool', 'workingdir'=>'string'], -'svn_client_version' => ['string'], -'svn_commit' => ['array', 'log'=>'string', 'targets'=>'array', 'dontrecurse='=>'bool'], -'svn_delete' => ['bool', 'path'=>'string', 'force='=>'bool'], -'svn_diff' => ['array', 'path1'=>'string', 'rev1'=>'int', 'path2'=>'string', 'rev2'=>'int'], -'svn_export' => ['bool', 'frompath'=>'string', 'topath'=>'string', 'working_copy='=>'bool', 'revision_no='=>'int'], -'svn_fs_abort_txn' => ['bool', 'txn'=>'resource'], -'svn_fs_apply_text' => ['resource', 'root'=>'resource', 'path'=>'string'], -'svn_fs_begin_txn2' => ['resource', 'repos'=>'resource', 'rev'=>'int'], -'svn_fs_change_node_prop' => ['bool', 'root'=>'resource', 'path'=>'string', 'name'=>'string', 'value'=>'string'], -'svn_fs_check_path' => ['int', 'fsroot'=>'resource', 'path'=>'string'], -'svn_fs_contents_changed' => ['bool', 'root1'=>'resource', 'path1'=>'string', 'root2'=>'resource', 'path2'=>'string'], -'svn_fs_copy' => ['bool', 'from_root'=>'resource', 'from_path'=>'string', 'to_root'=>'resource', 'to_path'=>'string'], -'svn_fs_delete' => ['bool', 'root'=>'resource', 'path'=>'string'], -'svn_fs_dir_entries' => ['array', 'fsroot'=>'resource', 'path'=>'string'], -'svn_fs_file_contents' => ['resource', 'fsroot'=>'resource', 'path'=>'string'], -'svn_fs_file_length' => ['int', 'fsroot'=>'resource', 'path'=>'string'], -'svn_fs_is_dir' => ['bool', 'root'=>'resource', 'path'=>'string'], -'svn_fs_is_file' => ['bool', 'root'=>'resource', 'path'=>'string'], -'svn_fs_make_dir' => ['bool', 'root'=>'resource', 'path'=>'string'], -'svn_fs_make_file' => ['bool', 'root'=>'resource', 'path'=>'string'], -'svn_fs_node_created_rev' => ['int', 'fsroot'=>'resource', 'path'=>'string'], -'svn_fs_node_prop' => ['string', 'fsroot'=>'resource', 'path'=>'string', 'propname'=>'string'], -'svn_fs_props_changed' => ['bool', 'root1'=>'resource', 'path1'=>'string', 'root2'=>'resource', 'path2'=>'string'], -'svn_fs_revision_prop' => ['string', 'fs'=>'resource', 'revnum'=>'int', 'propname'=>'string'], -'svn_fs_revision_root' => ['resource', 'fs'=>'resource', 'revnum'=>'int'], -'svn_fs_txn_root' => ['resource', 'txn'=>'resource'], -'svn_fs_youngest_rev' => ['int', 'fs'=>'resource'], -'svn_import' => ['bool', 'path'=>'string', 'url'=>'string', 'nonrecursive'=>'bool'], -'svn_log' => ['array', 'repos_url'=>'string', 'start_revision='=>'int', 'end_revision='=>'int', 'limit='=>'int', 'flags='=>'int'], -'svn_ls' => ['array', 'repos_url'=>'string', 'revision_no='=>'int', 'recurse='=>'bool', 'peg='=>'bool'], -'svn_mkdir' => ['bool', 'path'=>'string', 'log_message='=>'string'], -'svn_move' => ['mixed', 'src_path'=>'string', 'dst_path'=>'string', 'force='=>'bool'], -'svn_propget' => ['mixed', 'path'=>'string', 'property_name'=>'string', 'recurse='=>'bool', 'revision'=>'int'], -'svn_proplist' => ['mixed', 'path'=>'string', 'recurse='=>'bool', 'revision'=>'int'], -'svn_repos_create' => ['resource', 'path'=>'string', 'config='=>'array', 'fsconfig='=>'array'], -'svn_repos_fs' => ['resource', 'repos'=>'resource'], -'svn_repos_fs_begin_txn_for_commit' => ['resource', 'repos'=>'resource', 'rev'=>'int', 'author'=>'string', 'log_msg'=>'string'], -'svn_repos_fs_commit_txn' => ['int', 'txn'=>'resource'], -'svn_repos_hotcopy' => ['bool', 'repospath'=>'string', 'destpath'=>'string', 'cleanlogs'=>'bool'], -'svn_repos_open' => ['resource', 'path'=>'string'], -'svn_repos_recover' => ['bool', 'path'=>'string'], -'svn_revert' => ['bool', 'path'=>'string', 'recursive='=>'bool'], -'svn_status' => ['array', 'path'=>'string', 'flags='=>'int'], -'svn_update' => ['int|false', 'path'=>'string', 'revno='=>'int', 'recurse='=>'bool'], -'swf_actiongeturl' => ['', 'url'=>'string', 'target'=>'string'], -'swf_actiongotoframe' => ['', 'framenumber'=>'int'], -'swf_actiongotolabel' => ['', 'label'=>'string'], -'swf_actionnextframe' => [''], -'swf_actionplay' => [''], -'swf_actionprevframe' => [''], -'swf_actionsettarget' => ['', 'target'=>'string'], -'swf_actionstop' => [''], -'swf_actiontogglequality' => [''], -'swf_actionwaitforframe' => ['', 'framenumber'=>'int', 'skipcount'=>'int'], -'swf_addbuttonrecord' => ['', 'states'=>'int', 'shapeid'=>'int', 'depth'=>'int'], -'swf_addcolor' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], -'swf_closefile' => ['', 'return_file='=>'int'], -'swf_definebitmap' => ['', 'objid'=>'int', 'image_name'=>'string'], -'swf_definefont' => ['', 'fontid'=>'int', 'fontname'=>'string'], -'swf_defineline' => ['', 'objid'=>'int', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'width'=>'float'], -'swf_definepoly' => ['', 'objid'=>'int', 'coords'=>'array', 'npoints'=>'int', 'width'=>'float'], -'swf_definerect' => ['', 'objid'=>'int', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'width'=>'float'], -'swf_definetext' => ['', 'objid'=>'int', 'string'=>'string', 'docenter'=>'int'], -'swf_endbutton' => [''], -'swf_enddoaction' => [''], -'swf_endshape' => [''], -'swf_endsymbol' => [''], -'swf_fontsize' => ['', 'size'=>'float'], -'swf_fontslant' => ['', 'slant'=>'float'], -'swf_fonttracking' => ['', 'tracking'=>'float'], -'swf_getbitmapinfo' => ['array', 'bitmapid'=>'int'], -'swf_getfontinfo' => ['array'], -'swf_getframe' => ['int'], -'swf_labelframe' => ['', 'name'=>'string'], -'swf_lookat' => ['', 'view_x'=>'float', 'view_y'=>'float', 'view_z'=>'float', 'reference_x'=>'float', 'reference_y'=>'float', 'reference_z'=>'float', 'twist'=>'float'], -'swf_modifyobject' => ['', 'depth'=>'int', 'how'=>'int'], -'swf_mulcolor' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], -'swf_nextid' => ['int'], -'swf_oncondition' => ['', 'transition'=>'int'], -'swf_openfile' => ['', 'filename'=>'string', 'width'=>'float', 'height'=>'float', 'framerate'=>'float', 'r'=>'float', 'g'=>'float', 'b'=>'float'], -'swf_ortho' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float', 'zmin'=>'float', 'zmax'=>'float'], -'swf_ortho2' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float'], -'swf_perspective' => ['', 'fovy'=>'float', 'aspect'=>'float', 'near'=>'float', 'far'=>'float'], -'swf_placeobject' => ['', 'objid'=>'int', 'depth'=>'int'], -'swf_polarview' => ['', 'dist'=>'float', 'azimuth'=>'float', 'incidence'=>'float', 'twist'=>'float'], -'swf_popmatrix' => [''], -'swf_posround' => ['', 'round'=>'int'], -'swf_pushmatrix' => [''], -'swf_removeobject' => ['', 'depth'=>'int'], -'swf_rotate' => ['', 'angle'=>'float', 'axis'=>'string'], -'swf_scale' => ['', 'x'=>'float', 'y'=>'float', 'z'=>'float'], -'swf_setfont' => ['', 'fontid'=>'int'], -'swf_setframe' => ['', 'framenumber'=>'int'], -'swf_shapearc' => ['', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'ang1'=>'float', 'ang2'=>'float'], -'swf_shapecurveto' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], -'swf_shapecurveto3' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], -'swf_shapefillbitmapclip' => ['', 'bitmapid'=>'int'], -'swf_shapefillbitmaptile' => ['', 'bitmapid'=>'int'], -'swf_shapefilloff' => [''], -'swf_shapefillsolid' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], -'swf_shapelinesolid' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float', 'width'=>'float'], -'swf_shapelineto' => ['', 'x'=>'float', 'y'=>'float'], -'swf_shapemoveto' => ['', 'x'=>'float', 'y'=>'float'], -'swf_showframe' => [''], -'swf_startbutton' => ['', 'objid'=>'int', 'type'=>'int'], -'swf_startdoaction' => [''], -'swf_startshape' => ['', 'objid'=>'int'], -'swf_startsymbol' => ['', 'objid'=>'int'], -'swf_textwidth' => ['float', 'string'=>'string'], -'swf_translate' => ['', 'x'=>'float', 'y'=>'float', 'z'=>'float'], -'swf_viewport' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float'], -'SWFAction::__construct' => ['void', 'script'=>'string'], -'SWFBitmap::__construct' => ['void', 'file'=>'', 'alphafile='=>''], -'SWFBitmap::getHeight' => ['float'], -'SWFBitmap::getWidth' => ['float'], -'SWFButton::__construct' => ['void'], -'SWFButton::addAction' => ['void', 'action'=>'swfaction', 'flags'=>'int'], -'SWFButton::addASound' => ['SWFSoundInstance', 'sound'=>'swfsound', 'flags'=>'int'], -'SWFButton::addShape' => ['void', 'shape'=>'swfshape', 'flags'=>'int'], -'SWFButton::setAction' => ['void', 'action'=>'swfaction'], -'SWFButton::setDown' => ['void', 'shape'=>'swfshape'], -'SWFButton::setHit' => ['void', 'shape'=>'swfshape'], -'SWFButton::setMenu' => ['void', 'flag'=>'int'], -'SWFButton::setOver' => ['void', 'shape'=>'swfshape'], -'SWFButton::setUp' => ['void', 'shape'=>'swfshape'], -'SWFDisplayItem::addAction' => ['void', 'action'=>'swfaction', 'flags'=>'int'], -'SWFDisplayItem::addColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], -'SWFDisplayItem::endMask' => ['void'], -'SWFDisplayItem::getRot' => ['float'], -'SWFDisplayItem::getX' => ['float'], -'SWFDisplayItem::getXScale' => ['float'], -'SWFDisplayItem::getXSkew' => ['float'], -'SWFDisplayItem::getY' => ['float'], -'SWFDisplayItem::getYScale' => ['float'], -'SWFDisplayItem::getYSkew' => ['float'], -'SWFDisplayItem::move' => ['void', 'dx'=>'float', 'dy'=>'float'], -'SWFDisplayItem::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], -'SWFDisplayItem::multColor' => ['void', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'a='=>'float'], -'SWFDisplayItem::remove' => ['void'], -'SWFDisplayItem::rotate' => ['void', 'angle'=>'float'], -'SWFDisplayItem::rotateTo' => ['void', 'angle'=>'float'], -'SWFDisplayItem::scale' => ['void', 'dx'=>'float', 'dy'=>'float'], -'SWFDisplayItem::scaleTo' => ['void', 'x'=>'float', 'y='=>'float'], -'SWFDisplayItem::setDepth' => ['void', 'depth'=>'int'], -'SWFDisplayItem::setMaskLevel' => ['void', 'level'=>'int'], -'SWFDisplayItem::setMatrix' => ['void', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], -'SWFDisplayItem::setName' => ['void', 'name'=>'string'], -'SWFDisplayItem::setRatio' => ['void', 'ratio'=>'float'], -'SWFDisplayItem::skewX' => ['void', 'ddegrees'=>'float'], -'SWFDisplayItem::skewXTo' => ['void', 'degrees'=>'float'], -'SWFDisplayItem::skewY' => ['void', 'ddegrees'=>'float'], -'SWFDisplayItem::skewYTo' => ['void', 'degrees'=>'float'], -'SWFFill::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], -'SWFFill::rotateTo' => ['void', 'angle'=>'float'], -'SWFFill::scaleTo' => ['void', 'x'=>'float', 'y='=>'float'], -'SWFFill::skewXTo' => ['void', 'x'=>'float'], -'SWFFill::skewYTo' => ['void', 'y'=>'float'], -'SWFFont::__construct' => ['void', 'filename'=>'string'], -'SWFFont::getAscent' => ['float'], -'SWFFont::getDescent' => ['float'], -'SWFFont::getLeading' => ['float'], -'SWFFont::getShape' => ['string', 'code'=>'int'], -'SWFFont::getUTF8Width' => ['float', 'string'=>'string'], -'SWFFont::getWidth' => ['float', 'string'=>'string'], -'SWFFontChar::addChars' => ['void', 'char'=>'string'], -'SWFFontChar::addUTF8Chars' => ['void', 'char'=>'string'], -'SWFGradient::__construct' => ['void'], -'SWFGradient::addEntry' => ['void', 'ratio'=>'float', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], -'SWFMorph::__construct' => ['void'], -'SWFMorph::getShape1' => ['SWFShape'], -'SWFMorph::getShape2' => ['SWFShape'], -'SWFMovie::__construct' => ['void', 'version='=>'int'], -'SWFMovie::add' => ['mixed', 'instance'=>'object'], -'SWFMovie::addExport' => ['void', 'char'=>'swfcharacter', 'name'=>'string'], -'SWFMovie::addFont' => ['mixed', 'font'=>'swffont'], -'SWFMovie::importChar' => ['SWFSprite', 'libswf'=>'string', 'name'=>'string'], -'SWFMovie::importFont' => ['SWFFontChar', 'libswf'=>'string', 'name'=>'string'], -'SWFMovie::labelFrame' => ['void', 'label'=>'string'], -'SWFMovie::namedAnchor' => [''], -'SWFMovie::nextFrame' => ['void'], -'SWFMovie::output' => ['int', 'compression='=>'int'], -'SWFMovie::protect' => [''], -'SWFMovie::remove' => ['void', 'instance'=>'object'], -'SWFMovie::save' => ['int', 'filename'=>'string', 'compression='=>'int'], -'SWFMovie::saveToFile' => ['int', 'x'=>'resource', 'compression='=>'int'], -'SWFMovie::setbackground' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'SWFMovie::setDimension' => ['void', 'width'=>'float', 'height'=>'float'], -'SWFMovie::setFrames' => ['void', 'number'=>'int'], -'SWFMovie::setRate' => ['void', 'rate'=>'float'], -'SWFMovie::startSound' => ['SWFSoundInstance', 'sound'=>'swfsound'], -'SWFMovie::stopSound' => ['void', 'sound'=>'swfsound'], -'SWFMovie::streamMP3' => ['int', 'mp3file'=>'mixed', 'skip='=>'float'], -'SWFMovie::writeExports' => ['void'], -'SWFPrebuiltClip::__construct' => ['void', 'file'=>''], -'SWFShape::__construct' => ['void'], -'SWFShape::addFill' => ['SWFFill', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int', 'bitmap='=>'swfbitmap', 'flags='=>'int', 'gradient='=>'swfgradient'], -'SWFShape::addFill\'1' => ['SWFFill', 'bitmap'=>'SWFBitmap', 'flags='=>'int'], -'SWFShape::addFill\'2' => ['SWFFill', 'gradient'=>'SWFGradient', 'flags='=>'int'], -'SWFShape::drawArc' => ['void', 'r'=>'float', 'startangle'=>'float', 'endangle'=>'float'], -'SWFShape::drawCircle' => ['void', 'r'=>'float'], -'SWFShape::drawCubic' => ['int', 'bx'=>'float', 'by'=>'float', 'cx'=>'float', 'cy'=>'float', 'dx'=>'float', 'dy'=>'float'], -'SWFShape::drawCubicTo' => ['int', 'bx'=>'float', 'by'=>'float', 'cx'=>'float', 'cy'=>'float', 'dx'=>'float', 'dy'=>'float'], -'SWFShape::drawCurve' => ['int', 'controldx'=>'float', 'controldy'=>'float', 'anchordx'=>'float', 'anchordy'=>'float', 'targetdx='=>'float', 'targetdy='=>'float'], -'SWFShape::drawCurveTo' => ['int', 'controlx'=>'float', 'controly'=>'float', 'anchorx'=>'float', 'anchory'=>'float', 'targetx='=>'float', 'targety='=>'float'], -'SWFShape::drawGlyph' => ['void', 'font'=>'swffont', 'character'=>'string', 'size='=>'int'], -'SWFShape::drawLine' => ['void', 'dx'=>'float', 'dy'=>'float'], -'SWFShape::drawLineTo' => ['void', 'x'=>'float', 'y'=>'float'], -'SWFShape::movePen' => ['void', 'dx'=>'float', 'dy'=>'float'], -'SWFShape::movePenTo' => ['void', 'x'=>'float', 'y'=>'float'], -'SWFShape::setLeftFill' => ['', 'fill'=>'swfgradient', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], -'SWFShape::setLine' => ['', 'shape'=>'swfshape', 'width'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], -'SWFShape::setRightFill' => ['', 'fill'=>'swfgradient', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], -'SWFSound' => ['SWFSound', 'filename'=>'string', 'flags='=>'int'], -'SWFSound::__construct' => ['void', 'filename'=>'string', 'flags='=>'int'], -'SWFSoundInstance::loopCount' => ['void', 'point'=>'int'], -'SWFSoundInstance::loopInPoint' => ['void', 'point'=>'int'], -'SWFSoundInstance::loopOutPoint' => ['void', 'point'=>'int'], -'SWFSoundInstance::noMultiple' => ['void'], -'SWFSprite::__construct' => ['void'], -'SWFSprite::add' => ['void', 'object'=>'object'], -'SWFSprite::labelFrame' => ['void', 'label'=>'string'], -'SWFSprite::nextFrame' => ['void'], -'SWFSprite::remove' => ['void', 'object'=>'object'], -'SWFSprite::setFrames' => ['void', 'number'=>'int'], -'SWFSprite::startSound' => ['SWFSoundInstance', 'sount'=>'swfsound'], -'SWFSprite::stopSound' => ['void', 'sount'=>'swfsound'], -'SWFText::__construct' => ['void'], -'SWFText::addString' => ['void', 'string'=>'string'], -'SWFText::addUTF8String' => ['void', 'text'=>'string'], -'SWFText::getAscent' => ['float'], -'SWFText::getDescent' => ['float'], -'SWFText::getLeading' => ['float'], -'SWFText::getUTF8Width' => ['float', 'string'=>'string'], -'SWFText::getWidth' => ['float', 'string'=>'string'], -'SWFText::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], -'SWFText::setColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], -'SWFText::setFont' => ['void', 'font'=>'swffont'], -'SWFText::setHeight' => ['void', 'height'=>'float'], -'SWFText::setSpacing' => ['void', 'spacing'=>'float'], -'SWFTextField::__construct' => ['void', 'flags='=>'int'], -'SWFTextField::addChars' => ['void', 'chars'=>'string'], -'SWFTextField::addString' => ['void', 'string'=>'string'], -'SWFTextField::align' => ['void', 'alignement'=>'int'], -'SWFTextField::setBounds' => ['void', 'width'=>'float', 'height'=>'float'], -'SWFTextField::setColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], -'SWFTextField::setFont' => ['void', 'font'=>'swffont'], -'SWFTextField::setHeight' => ['void', 'height'=>'float'], -'SWFTextField::setIndentation' => ['void', 'width'=>'float'], -'SWFTextField::setLeftMargin' => ['void', 'width'=>'float'], -'SWFTextField::setLineSpacing' => ['void', 'height'=>'float'], -'SWFTextField::setMargins' => ['void', 'left'=>'float', 'right'=>'float'], -'SWFTextField::setName' => ['void', 'name'=>'string'], -'SWFTextField::setPadding' => ['void', 'padding'=>'float'], -'SWFTextField::setRightMargin' => ['void', 'width'=>'float'], -'SWFVideoStream::__construct' => ['void', 'file='=>'string'], -'SWFVideoStream::getNumFrames' => ['int'], -'SWFVideoStream::setDimension' => ['void', 'x'=>'int', 'y'=>'int'], -'Swish::__construct' => ['void', 'index_names'=>'string'], -'Swish::getMetaList' => ['array', 'index_name'=>'string'], -'Swish::getPropertyList' => ['array', 'index_name'=>'string'], -'Swish::prepare' => ['object', 'query='=>'string'], -'Swish::query' => ['object', 'query'=>'string'], -'SwishResult::getMetaList' => ['array'], -'SwishResult::stem' => ['array', 'word'=>'string'], -'SwishResults::getParsedWords' => ['array', 'index_name'=>'string'], -'SwishResults::getRemovedStopwords' => ['array', 'index_name'=>'string'], -'SwishResults::nextResult' => ['object'], -'SwishResults::seekResult' => ['int', 'position'=>'int'], -'SwishSearch::execute' => ['object', 'query='=>'string'], -'SwishSearch::resetLimit' => [''], -'SwishSearch::setLimit' => ['', 'property'=>'string', 'low'=>'string', 'high'=>'string'], -'SwishSearch::setPhraseDelimiter' => ['', 'delimiter'=>'string'], -'SwishSearch::setSort' => ['', 'sort'=>'string'], -'SwishSearch::setStructure' => ['', 'structure'=>'int'], -'swoole\async::dnsLookup' => ['void', 'hostname'=>'string', 'callback'=>'callable'], -'swoole\async::read' => ['bool', 'filename'=>'string', 'callback'=>'callable', 'chunk_size='=>'integer', 'offset='=>'integer'], -'swoole\async::readFile' => ['void', 'filename'=>'string', 'callback'=>'callable'], -'swoole\async::set' => ['void', 'settings'=>'array'], -'swoole\async::write' => ['void', 'filename'=>'string', 'content'=>'string', 'offset='=>'integer', 'callback='=>'callable'], -'swoole\async::writeFile' => ['void', 'filename'=>'string', 'content'=>'string', 'callback='=>'callable', 'flags='=>'string'], -'swoole\atomic::add' => ['integer', 'add_value='=>'integer'], -'swoole\atomic::cmpset' => ['integer', 'cmp_value'=>'integer', 'new_value'=>'integer'], -'swoole\atomic::get' => ['integer'], -'swoole\atomic::set' => ['integer', 'value'=>'integer'], -'swoole\atomic::sub' => ['integer', 'sub_value='=>'integer'], -'swoole\buffer::__destruct' => ['void'], -'swoole\buffer::__toString' => ['string'], -'swoole\buffer::append' => ['integer', 'data'=>'string'], -'swoole\buffer::clear' => ['void'], -'swoole\buffer::expand' => ['integer', 'size'=>'integer'], -'swoole\buffer::read' => ['string', 'offset'=>'integer', 'length'=>'integer'], -'swoole\buffer::recycle' => ['void'], -'swoole\buffer::substr' => ['string', 'offset'=>'integer', 'length='=>'integer', 'remove='=>'bool'], -'swoole\buffer::write' => ['void', 'offset'=>'integer', 'data'=>'string'], -'swoole\channel::__destruct' => ['void'], -'swoole\channel::pop' => ['mixed'], -'swoole\channel::push' => ['bool', 'data'=>'string'], -'swoole\channel::stats' => ['array'], -'swoole\client::__destruct' => ['void'], -'swoole\client::close' => ['bool', 'force='=>'bool'], -'swoole\client::connect' => ['bool', 'host'=>'string', 'port='=>'integer', 'timeout='=>'integer', 'flag='=>'integer'], -'swoole\client::getpeername' => ['array'], -'swoole\client::getsockname' => ['array'], -'swoole\client::isConnected' => ['bool'], -'swoole\client::on' => ['void', 'event'=>'string', 'callback'=>'callable'], -'swoole\client::pause' => ['void'], -'swoole\client::pipe' => ['void', 'socket'=>'string'], -'swoole\client::recv' => ['void', 'size='=>'string', 'flag='=>'string'], -'swoole\client::resume' => ['void'], -'swoole\client::send' => ['integer', 'data'=>'string', 'flag='=>'string'], -'swoole\client::sendfile' => ['bool', 'filename'=>'string', 'offset='=>'int'], -'swoole\client::sendto' => ['bool', 'ip'=>'string', 'port'=>'integer', 'data'=>'string'], -'swoole\client::set' => ['void', 'settings'=>'array'], -'swoole\client::sleep' => ['void'], -'swoole\client::wakeup' => ['void'], -'swoole\connection\iterator::count' => ['int'], -'swoole\connection\iterator::current' => ['Connection'], -'swoole\connection\iterator::key' => ['int'], -'swoole\connection\iterator::next' => ['Connection'], -'swoole\connection\iterator::offsetExists' => ['bool', 'index'=>'int'], -'swoole\connection\iterator::offsetGet' => ['Connection', 'index'=>'string'], -'swoole\connection\iterator::offsetSet' => ['void', 'offset'=>'int', 'connection'=>'mixed'], -'swoole\connection\iterator::offsetUnset' => ['void', 'offset'=>'int'], -'swoole\connection\iterator::rewind' => ['void'], -'swoole\connection\iterator::valid' => ['bool'], -'swoole\coroutine::call_user_func' => ['mixed', 'callback'=>'callable', 'parameter='=>'mixed', '...args='=>'mixed'], -'swoole\coroutine::call_user_func_array' => ['mixed', 'callback'=>'callable', 'param_array'=>'array'], -'swoole\coroutine::cli_wait' => ['ReturnType'], -'swoole\coroutine::create' => ['ReturnType'], -'swoole\coroutine::getuid' => ['ReturnType'], -'swoole\coroutine::resume' => ['ReturnType'], -'swoole\coroutine::suspend' => ['ReturnType'], -'swoole\coroutine\client::__destruct' => ['ReturnType'], -'swoole\coroutine\client::close' => ['ReturnType'], -'swoole\coroutine\client::connect' => ['ReturnType'], -'swoole\coroutine\client::getpeername' => ['ReturnType'], -'swoole\coroutine\client::getsockname' => ['ReturnType'], -'swoole\coroutine\client::isConnected' => ['ReturnType'], -'swoole\coroutine\client::recv' => ['ReturnType'], -'swoole\coroutine\client::send' => ['ReturnType'], -'swoole\coroutine\client::sendfile' => ['ReturnType'], -'swoole\coroutine\client::sendto' => ['ReturnType'], -'swoole\coroutine\client::set' => ['ReturnType'], -'swoole\coroutine\http\client::__destruct' => ['ReturnType'], -'swoole\coroutine\http\client::addFile' => ['ReturnType'], -'swoole\coroutine\http\client::close' => ['ReturnType'], -'swoole\coroutine\http\client::execute' => ['ReturnType'], -'swoole\coroutine\http\client::get' => ['ReturnType'], -'swoole\coroutine\http\client::getDefer' => ['ReturnType'], -'swoole\coroutine\http\client::isConnected' => ['ReturnType'], -'swoole\coroutine\http\client::post' => ['ReturnType'], -'swoole\coroutine\http\client::recv' => ['ReturnType'], -'swoole\coroutine\http\client::set' => ['ReturnType'], -'swoole\coroutine\http\client::setCookies' => ['ReturnType'], -'swoole\coroutine\http\client::setData' => ['ReturnType'], -'swoole\coroutine\http\client::setDefer' => ['ReturnType'], -'swoole\coroutine\http\client::setHeaders' => ['ReturnType'], -'swoole\coroutine\http\client::setMethod' => ['ReturnType'], -'swoole\coroutine\mysql::__destruct' => ['ReturnType'], -'swoole\coroutine\mysql::close' => ['ReturnType'], -'swoole\coroutine\mysql::connect' => ['ReturnType'], -'swoole\coroutine\mysql::getDefer' => ['ReturnType'], -'swoole\coroutine\mysql::query' => ['ReturnType'], -'swoole\coroutine\mysql::recv' => ['ReturnType'], -'swoole\coroutine\mysql::setDefer' => ['ReturnType'], -'swoole\event::add' => ['bool', 'fd'=>'int', 'read_callback'=>'callable', 'write_callback='=>'callable', 'events='=>'string'], -'swoole\event::defer' => ['void', 'callback'=>'mixed'], -'swoole\event::del' => ['bool', 'fd'=>'string'], -'swoole\event::exit' => ['void'], -'swoole\event::set' => ['bool', 'fd'=>'int', 'read_callback='=>'string', 'write_callback='=>'string', 'events='=>'string'], -'swoole\event::wait' => ['void'], -'swoole\event::write' => ['void', 'fd'=>'string', 'data'=>'string'], -'swoole\http\client::__destruct' => ['void'], -'swoole\http\client::addFile' => ['void', 'path'=>'string', 'name'=>'string', 'type='=>'string', 'filename='=>'string', 'offset='=>'string'], -'swoole\http\client::close' => ['void'], -'swoole\http\client::download' => ['void', 'path'=>'string', 'file'=>'string', 'callback'=>'callable', 'offset='=>'integer'], -'swoole\http\client::execute' => ['void', 'path'=>'string', 'callback'=>'string'], -'swoole\http\client::get' => ['void', 'path'=>'string', 'callback'=>'callable'], -'swoole\http\client::isConnected' => ['bool'], -'swoole\http\client::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], -'swoole\http\client::post' => ['void', 'path'=>'string', 'data'=>'string', 'callback'=>'callable'], -'swoole\http\client::push' => ['void', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string'], -'swoole\http\client::set' => ['void', 'settings'=>'array'], -'swoole\http\client::setCookies' => ['void', 'cookies'=>'array'], -'swoole\http\client::setData' => ['ReturnType', 'data'=>'string'], -'swoole\http\client::setHeaders' => ['void', 'headers'=>'array'], -'swoole\http\client::setMethod' => ['void', 'method'=>'string'], -'swoole\http\client::upgrade' => ['void', 'path'=>'string', 'callback'=>'string'], -'swoole\http\request::__destruct' => ['void'], -'swoole\http\request::rawcontent' => ['string'], -'swoole\http\response::__destruct' => ['void'], -'swoole\http\response::cookie' => ['string', 'name'=>'string', 'value='=>'string', 'expires='=>'string', 'path='=>'string', 'domain='=>'string', 'secure='=>'string', 'httponly='=>'string'], -'swoole\http\response::end' => ['void', 'content='=>'string'], -'swoole\http\response::gzip' => ['ReturnType', 'compress_level='=>'string'], -'swoole\http\response::header' => ['void', 'key'=>'string', 'value'=>'string', 'ucwords='=>'string'], -'swoole\http\response::initHeader' => ['ReturnType'], -'swoole\http\response::rawcookie' => ['ReturnType', 'name'=>'string', 'value='=>'string', 'expires='=>'string', 'path='=>'string', 'domain='=>'string', 'secure='=>'string', 'httponly='=>'string'], -'swoole\http\response::sendfile' => ['ReturnType', 'filename'=>'string', 'offset='=>'int'], -'swoole\http\response::status' => ['ReturnType', 'http_code'=>'string'], -'swoole\http\response::write' => ['void', 'content'=>'string'], -'swoole\http\server::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], -'swoole\http\server::start' => ['void'], -'swoole\lock::__destruct' => ['void'], -'swoole\lock::lock' => ['void'], -'swoole\lock::lock_read' => ['void'], -'swoole\lock::trylock' => ['void'], -'swoole\lock::trylock_read' => ['void'], -'swoole\lock::unlock' => ['void'], -'swoole\mmap::open' => ['ReturnType', 'filename'=>'string', 'size='=>'string', 'offset='=>'string'], -'swoole\mysql::__destruct' => ['void'], -'swoole\mysql::close' => ['void'], -'swoole\mysql::connect' => ['void', 'server_config'=>'array', 'callback'=>'callable'], -'swoole\mysql::getBuffer' => ['ReturnType'], -'swoole\mysql::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], -'swoole\mysql::query' => ['ReturnType', 'sql'=>'string', 'callback'=>'callable'], -'swoole\process::__destruct' => ['void'], -'swoole\process::alarm' => ['void', 'interval_usec'=>'integer'], -'swoole\process::close' => ['void'], -'swoole\process::daemon' => ['void', 'nochdir='=>'bool', 'noclose='=>'bool'], -'swoole\process::exec' => ['ReturnType', 'exec_file'=>'string', 'args'=>'string'], -'swoole\process::exit' => ['void', 'exit_code='=>'string'], -'swoole\process::freeQueue' => ['void'], -'swoole\process::kill' => ['void', 'pid'=>'integer', 'signal_no='=>'string'], -'swoole\process::name' => ['void', 'process_name'=>'string'], -'swoole\process::pop' => ['mixed', 'maxsize='=>'integer'], -'swoole\process::push' => ['bool', 'data'=>'string'], -'swoole\process::read' => ['string', 'maxsize='=>'integer'], -'swoole\process::signal' => ['void', 'signal_no'=>'string', 'callback'=>'callable'], -'swoole\process::start' => ['void'], -'swoole\process::statQueue' => ['array'], -'swoole\process::useQueue' => ['bool', 'key'=>'integer', 'mode='=>'integer'], -'swoole\process::wait' => ['array', 'blocking='=>'bool'], -'swoole\process::write' => ['integer', 'data'=>'string'], -'swoole\redis\server::format' => ['ReturnType', 'type'=>'string', 'value='=>'string'], -'swoole\redis\server::setHandler' => ['ReturnType', 'command'=>'string', 'callback'=>'string', 'number_of_string_param='=>'string', 'type_of_array_param='=>'string'], -'swoole\redis\server::start' => ['ReturnType'], -'swoole\serialize::pack' => ['ReturnType', 'data'=>'string', 'is_fast='=>'int'], -'swoole\serialize::unpack' => ['ReturnType', 'data'=>'string', 'args='=>'string'], -'swoole\server::addlistener' => ['void', 'host'=>'string', 'port'=>'integer', 'socket_type'=>'string'], -'swoole\server::addProcess' => ['bool', 'process'=>'swoole_process'], -'swoole\server::after' => ['ReturnType', 'after_time_ms'=>'integer', 'callback'=>'callable', 'param='=>'string'], -'swoole\server::bind' => ['bool', 'fd'=>'integer', 'uid'=>'integer'], -'swoole\server::close' => ['bool', 'fd'=>'integer', 'reset='=>'bool'], -'swoole\server::confirm' => ['bool', 'fd'=>'integer'], -'swoole\server::connection_info' => ['array', 'fd'=>'integer', 'reactor_id='=>'integer'], -'swoole\server::connection_list' => ['array', 'start_fd'=>'integer', 'pagesize='=>'integer'], -'swoole\server::defer' => ['void', 'callback'=>'callable'], -'swoole\server::exist' => ['bool', 'fd'=>'integer'], -'swoole\server::finish' => ['void', 'data'=>'string'], -'swoole\server::getClientInfo' => ['ReturnType', 'fd'=>'integer', 'reactor_id='=>'integer'], -'swoole\server::getClientList' => ['array', 'start_fd'=>'integer', 'pagesize='=>'integer'], -'swoole\server::getLastError' => ['integer'], -'swoole\server::heartbeat' => ['mixed', 'if_close_connection'=>'bool'], -'swoole\server::listen' => ['bool', 'host'=>'string', 'port'=>'integer', 'socket_type'=>'string'], -'swoole\server::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], -'swoole\server::pause' => ['void', 'fd'=>'integer'], -'swoole\server::protect' => ['void', 'fd'=>'integer', 'is_protected='=>'bool'], -'swoole\server::reload' => ['bool'], -'swoole\server::resume' => ['void', 'fd'=>'integer'], -'swoole\server::send' => ['bool', 'fd'=>'integer', 'data'=>'string', 'reactor_id='=>'integer'], -'swoole\server::sendfile' => ['bool', 'fd'=>'integer', 'filename'=>'string', 'offset='=>'integer'], -'swoole\server::sendMessage' => ['bool', 'worker_id'=>'integer', 'data'=>'string'], -'swoole\server::sendto' => ['bool', 'ip'=>'string', 'port'=>'integer', 'data'=>'string', 'server_socket='=>'string'], -'swoole\server::sendwait' => ['bool', 'fd'=>'integer', 'data'=>'string'], -'swoole\server::set' => ['ReturnType', 'settings'=>'array'], -'swoole\server::shutdown' => ['void'], -'swoole\server::start' => ['void'], -'swoole\server::stats' => ['array'], -'swoole\server::stop' => ['bool', 'worker_id='=>'integer'], -'swoole\server::task' => ['mixed', 'data'=>'string', 'dst_worker_id='=>'integer', 'callback='=>'callable'], -'swoole\server::taskwait' => ['void', 'data'=>'string', 'timeout='=>'float', 'worker_id='=>'integer'], -'swoole\server::taskWaitMulti' => ['void', 'tasks'=>'array', 'timeout_ms='=>'double'], -'swoole\server::tick' => ['void', 'interval_ms'=>'integer', 'callback'=>'callable'], -'swoole\server\port::__destruct' => ['void'], -'swoole\server\port::on' => ['ReturnType', 'event_name'=>'string', 'callback'=>'callable'], -'swoole\server\port::set' => ['void', 'settings'=>'array'], -'swoole\table::column' => ['ReturnType', 'name'=>'string', 'type'=>'string', 'size='=>'integer'], -'swoole\table::count' => ['integer'], -'swoole\table::create' => ['void'], -'swoole\table::current' => ['array'], -'swoole\table::decr' => ['ReturnType', 'key'=>'string', 'column'=>'string', 'decrby='=>'integer'], -'swoole\table::del' => ['void', 'key'=>'string'], -'swoole\table::destroy' => ['void'], -'swoole\table::exist' => ['bool', 'key'=>'string'], -'swoole\table::get' => ['integer', 'row_key'=>'string', 'column_key'=>'string'], -'swoole\table::incr' => ['void', 'key'=>'string', 'column'=>'string', 'incrby='=>'integer'], -'swoole\table::key' => ['string'], -'swoole\table::next' => ['ReturnType'], -'swoole\table::rewind' => ['void'], -'swoole\table::set' => ['VOID', 'key'=>'string', 'value'=>'array'], -'swoole\table::valid' => ['bool'], -'swoole\timer::after' => ['void', 'after_time_ms'=>'int', 'callback'=>'callable'], -'swoole\timer::clear' => ['void', 'timer_id'=>'integer'], -'swoole\timer::exists' => ['bool', 'timer_id'=>'integer'], -'swoole\timer::tick' => ['void', 'interval_ms'=>'integer', 'callback'=>'callable', 'param='=>'string'], -'swoole\websocket\server::exist' => ['bool', 'fd'=>'integer'], -'swoole\websocket\server::on' => ['ReturnType', 'event_name'=>'string', 'callback'=>'callable'], -'swoole\websocket\server::pack' => ['binary', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string', 'mask='=>'string'], -'swoole\websocket\server::push' => ['void', 'fd'=>'string', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string'], -'swoole\websocket\server::unpack' => ['string', 'data'=>'binary'], -'swoole_async_dns_lookup' => ['bool', 'hostname'=>'string', 'callback'=>'callable'], -'swoole_async_read' => ['bool', 'filename'=>'string', 'callback'=>'callable', 'chunk_size='=>'int', 'offset='=>'int'], -'swoole_async_readfile' => ['bool', 'filename'=>'string', 'callback'=>'string'], -'swoole_async_set' => ['void', 'settings'=>'array'], -'swoole_async_write' => ['bool', 'filename'=>'string', 'content'=>'string', 'offset='=>'int', 'callback='=>'callable'], -'swoole_async_writefile' => ['bool', 'filename'=>'string', 'content'=>'string', 'callback='=>'callable', 'flags='=>'int'], -'swoole_client_select' => ['int', 'read_array'=>'array', 'write_array'=>'array', 'error_array'=>'array', 'timeout='=>'float'], -'swoole_cpu_num' => ['int'], -'swoole_errno' => ['int'], -'swoole_event_add' => ['int', 'fd'=>'int', 'read_callback='=>'callable', 'write_callback='=>'callable', 'events='=>'int'], -'swoole_event_defer' => ['bool', 'callback'=>'callable'], -'swoole_event_del' => ['bool', 'fd'=>'int'], -'swoole_event_exit' => ['void'], -'swoole_event_set' => ['bool', 'fd'=>'int', 'read_callback='=>'callable', 'write_callback='=>'callable', 'events='=>'int'], -'swoole_event_wait' => ['void'], -'swoole_event_write' => ['bool', 'fd'=>'int', 'data'=>'string'], -'swoole_get_local_ip' => ['array'], -'swoole_last_error' => ['int'], -'swoole_load_module' => ['mixed', 'filename'=>'string'], -'swoole_select' => ['int', 'read_array'=>'array', 'write_array'=>'array', 'error_array'=>'array', 'timeout='=>'float'], -'swoole_set_process_name' => ['void', 'process_name'=>'string', 'size='=>'int'], -'swoole_strerror' => ['string', 'errno'=>'int', 'error_type='=>'int'], -'swoole_timer_after' => ['int', 'ms'=>'int', 'callback'=>'callable', 'param='=>'mixed'], -'swoole_timer_exists' => ['bool', 'timer_id'=>'int'], -'swoole_timer_tick' => ['int', 'ms'=>'int', 'callback'=>'callable', 'param='=>'mixed'], -'swoole_version' => ['string'], -'symbolObj::__construct' => ['void', 'map'=>'mapObj', 'symbolname'=>'string'], -'symbolObj::free' => ['void'], -'symbolObj::getPatternArray' => ['array'], -'symbolObj::getPointsArray' => ['array'], -'symbolObj::ms_newSymbolObj' => ['int', 'map'=>'mapObj', 'symbolname'=>'string'], -'symbolObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'symbolObj::setImagePath' => ['int', 'filename'=>'string'], -'symbolObj::setPattern' => ['int', 'int'=>'array'], -'symbolObj::setPoints' => ['int', 'double'=>'array'], -'symlink' => ['bool', 'target'=>'string', 'link'=>'string'], -'SyncEvent::__construct' => ['void', 'name='=>'string', 'manual='=>'bool'], -'SyncEvent::fire' => ['bool'], -'SyncEvent::reset' => ['bool'], -'SyncEvent::wait' => ['bool', 'wait='=>'int'], -'SyncMutex::__construct' => ['void', 'name='=>'string'], -'SyncMutex::lock' => ['bool', 'wait='=>'int'], -'SyncMutex::unlock' => ['bool', 'all='=>'bool'], -'SyncReaderWriter::__construct' => ['void', 'name='=>'string', 'autounlock='=>'bool'], -'SyncReaderWriter::readlock' => ['bool', 'wait='=>'int'], -'SyncReaderWriter::readunlock' => ['bool'], -'SyncReaderWriter::writelock' => ['bool', 'wait='=>'int'], -'SyncReaderWriter::writeunlock' => ['bool'], -'SyncSemaphore::__construct' => ['void', 'name='=>'string', 'initialval='=>'int', 'autounlock='=>'bool'], -'SyncSemaphore::lock' => ['bool', 'wait='=>'int'], -'SyncSemaphore::unlock' => ['bool', '&w_prevcount='=>'int'], -'SyncSharedMemory::__construct' => ['void', 'name'=>'string', 'size'=>'int'], -'SyncSharedMemory::first' => ['bool'], -'SyncSharedMemory::read' => ['string', 'start='=>'int', 'length='=>'int'], -'SyncSharedMemory::size' => ['int'], -'SyncSharedMemory::write' => ['int', 'string='=>'string', 'start='=>'int'], -'sys_get_temp_dir' => ['string'], -'sys_getloadavg' => ['array'], -'syslog' => ['bool', 'priority'=>'int', 'message'=>'string'], -'system' => ['string|false', 'command'=>'string', '&w_result_code='=>'int'], -'taint' => ['bool', '&rw_string'=>'string', '&...w_other_strings='=>'string'], -'tan' => ['float', 'num'=>'float'], -'tanh' => ['float', 'num'=>'float'], -'tcpwrap_check' => ['bool', 'daemon'=>'string', 'address'=>'string', 'user='=>'string', 'nodns='=>'bool'], -'tempnam' => ['string|false', 'directory'=>'string', 'prefix'=>'string'], -'textdomain' => ['string', 'domain'=>'string'], -'Thread::__construct' => ['void'], -'Thread::addRef' => ['void'], -'Thread::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], -'Thread::count' => ['int'], -'Thread::delRef' => ['void'], -'Thread::detach' => ['void'], -'Thread::extend' => ['bool', 'class'=>'string'], -'Thread::getCreatorId' => ['int'], -'Thread::getCurrentThread' => ['Thread'], -'Thread::getCurrentThreadId' => ['int'], -'Thread::getRefCount' => ['int'], -'Thread::getTerminationInfo' => ['array'], -'Thread::getThreadId' => ['int'], -'Thread::globally' => ['mixed'], -'Thread::isGarbage' => ['bool'], -'Thread::isJoined' => ['bool'], -'Thread::isRunning' => ['bool'], -'Thread::isStarted' => ['bool'], -'Thread::isTerminated' => ['bool'], -'Thread::isWaiting' => ['bool'], -'Thread::join' => ['bool'], -'Thread::kill' => ['void'], -'Thread::lock' => ['bool'], -'Thread::merge' => ['bool', 'from'=>'', 'overwrite='=>'mixed'], -'Thread::notify' => ['bool'], -'Thread::notifyOne' => ['bool'], -'Thread::offsetExists' => ['bool', 'offset'=>'mixed'], -'Thread::offsetGet' => ['mixed', 'offset'=>'mixed'], -'Thread::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], -'Thread::offsetUnset' => ['void', 'offset'=>'mixed'], -'Thread::pop' => ['bool'], -'Thread::run' => ['void'], -'Thread::setGarbage' => ['void'], -'Thread::shift' => ['bool'], -'Thread::start' => ['bool', 'options='=>'int'], -'Thread::synchronized' => ['mixed', 'block'=>'Closure', '_='=>'mixed'], -'Thread::unlock' => ['bool'], -'Thread::wait' => ['bool', 'timeout='=>'int'], -'Threaded::__construct' => ['void'], -'Threaded::addRef' => ['void'], -'Threaded::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], -'Threaded::count' => ['int'], -'Threaded::delRef' => ['void'], -'Threaded::extend' => ['bool', 'class'=>'string'], -'Threaded::from' => ['Threaded', 'run'=>'Closure', 'construct='=>'Closure', 'args='=>'array'], -'Threaded::getRefCount' => ['int'], -'Threaded::getTerminationInfo' => ['array'], -'Threaded::isGarbage' => ['bool'], -'Threaded::isRunning' => ['bool'], -'Threaded::isTerminated' => ['bool'], -'Threaded::isWaiting' => ['bool'], -'Threaded::lock' => ['bool'], -'Threaded::merge' => ['bool', 'from'=>'mixed', 'overwrite='=>'bool'], -'Threaded::notify' => ['bool'], -'Threaded::notifyOne' => ['bool'], -'Threaded::offsetExists' => ['bool', 'offset'=>'mixed'], -'Threaded::offsetGet' => ['mixed', 'offset'=>'mixed'], -'Threaded::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], -'Threaded::offsetUnset' => ['void', 'offset'=>'mixed'], -'Threaded::pop' => ['bool'], -'Threaded::run' => ['void'], -'Threaded::setGarbage' => ['void'], -'Threaded::shift' => ['mixed'], -'Threaded::synchronized' => ['mixed', 'block'=>'Closure', '...args='=>'mixed'], -'Threaded::unlock' => ['bool'], -'Threaded::wait' => ['bool', 'timeout='=>'int'], -'Throwable::__toString' => ['string'], -'Throwable::getCode' => ['int|string'], -'Throwable::getFile' => ['string'], -'Throwable::getLine' => ['int'], -'Throwable::getMessage' => ['string'], -'Throwable::getPrevious' => ['?Throwable'], -'Throwable::getTrace' => ['list\',args?:array}>'], -'Throwable::getTraceAsString' => ['string'], -'tidy::__construct' => ['void', 'filename='=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], -'tidy::body' => ['tidyNode'], -'tidy::cleanRepair' => ['bool'], -'tidy::diagnose' => ['bool'], -'tidy::getConfig' => ['array'], -'tidy::getHtmlVer' => ['int'], -'tidy::getOpt' => ['mixed', 'option'=>'string'], -'tidy::getOptDoc' => ['string', 'option'=>'string'], -'tidy::getRelease' => ['string'], -'tidy::getStatus' => ['int'], -'tidy::head' => ['tidyNode'], -'tidy::html' => ['tidyNode'], -'tidy::htmlver' => ['int'], -'tidy::isXhtml' => ['bool'], -'tidy::isXml' => ['bool'], -'tidy::parseFile' => ['bool', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], -'tidy::parseString' => ['bool', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], -'tidy::repairFile' => ['string', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], -'tidy::repairString' => ['string', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], -'tidy::root' => ['tidyNode'], -'tidy_access_count' => ['int', 'tidy'=>'tidy'], -'tidy_clean_repair' => ['bool', 'tidy'=>'tidy'], -'tidy_config_count' => ['int', 'tidy'=>'tidy'], -'tidy_diagnose' => ['bool', 'tidy'=>'tidy'], -'tidy_error_count' => ['int', 'tidy'=>'tidy'], -'tidy_get_body' => ['?tidyNode', 'tidy'=>'tidy'], -'tidy_get_config' => ['array', 'tidy'=>'tidy'], -'tidy_get_error_buffer' => ['string', 'tidy'=>'tidy'], -'tidy_get_head' => ['?tidyNode', 'tidy'=>'tidy'], -'tidy_get_html' => ['?tidyNode', 'tidy'=>'tidy'], -'tidy_get_html_ver' => ['int', 'tidy'=>'tidy'], -'tidy_get_opt_doc' => ['string', 'tidy'=>'tidy', 'option'=>'string'], -'tidy_get_output' => ['string', 'tidy'=>'tidy'], -'tidy_get_release' => ['string'], -'tidy_get_root' => ['?tidyNode', 'tidy'=>'tidy'], -'tidy_get_status' => ['int', 'tidy'=>'tidy'], -'tidy_getopt' => ['mixed', 'tidy'=>'string', 'option'=>'tidy'], -'tidy_is_xhtml' => ['bool', 'tidy'=>'tidy'], -'tidy_is_xml' => ['bool', 'tidy'=>'tidy'], -'tidy_load_config' => ['void', 'filename'=>'string', 'encoding'=>'string'], -'tidy_parse_file' => ['tidy', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], -'tidy_parse_string' => ['tidy', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], -'tidy_repair_file' => ['string', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], -'tidy_repair_string' => ['string', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], -'tidy_reset_config' => ['bool'], -'tidy_save_config' => ['bool', 'filename'=>'string'], -'tidy_set_encoding' => ['bool', 'encoding'=>'string'], -'tidy_setopt' => ['bool', 'option'=>'string', 'value'=>'mixed'], -'tidy_warning_count' => ['int', 'tidy'=>'tidy'], -'tidyNode::__construct' => ['void'], -'tidyNode::getParent' => ['tidyNode'], -'tidyNode::hasChildren' => ['bool'], -'tidyNode::hasSiblings' => ['bool'], -'tidyNode::isAsp' => ['bool'], -'tidyNode::isComment' => ['bool'], -'tidyNode::isHtml' => ['bool'], -'tidyNode::isJste' => ['bool'], -'tidyNode::isPhp' => ['bool'], -'tidyNode::isText' => ['bool'], -'time' => ['positive-int'], -'time_nanosleep' => ['array{0:0|positive-int,1:0|positive-int}|bool', 'seconds'=>'positive-int', 'nanoseconds'=>'positive-int'], -'time_sleep_until' => ['bool', 'timestamp'=>'float'], -'timezone_abbreviations_list' => ['array>|false'], -'timezone_identifiers_list' => ['list', 'timezoneGroup='=>'int', 'countryCode='=>'?string'], -'timezone_location_get' => ['array|false', 'object'=>'DateTimeZone'], -'timezone_name_from_abbr' => ['string|false', 'abbr'=>'string', 'utcOffset='=>'int', 'isDST='=>'int'], -'timezone_name_get' => ['string', 'object'=>'DateTimeZone'], -'timezone_offset_get' => ['int|false', 'object'=>'DateTimeZone', 'datetime'=>'DateTimeInterface'], -'timezone_open' => ['DateTimeZone|false', 'timezone'=>'string'], -'timezone_transitions_get' => ['list|false', 'object'=>'DateTimeZone', 'timestampBegin='=>'int', 'timestampEnd='=>'int'], -'timezone_version_get' => ['string'], -'tmpfile' => ['resource|false'], -'token_get_all' => ['list', 'code'=>'string', 'flags='=>'int'], -'token_name' => ['string', 'id'=>'int'], -'TokyoTyrant::__construct' => ['void', 'host='=>'string', 'port='=>'int', 'options='=>'array'], -'TokyoTyrant::add' => ['int|float', 'key'=>'string', 'increment'=>'float', 'type='=>'int'], -'TokyoTyrant::connect' => ['TokyoTyrant', 'host'=>'string', 'port='=>'int', 'options='=>'array'], -'TokyoTyrant::connectUri' => ['TokyoTyrant', 'uri'=>'string'], -'TokyoTyrant::copy' => ['TokyoTyrant', 'path'=>'string'], -'TokyoTyrant::ext' => ['string', 'name'=>'string', 'options'=>'int', 'key'=>'string', 'value'=>'string'], -'TokyoTyrant::fwmKeys' => ['array', 'prefix'=>'string', 'max_recs'=>'int'], -'TokyoTyrant::get' => ['array', 'keys'=>'mixed'], -'TokyoTyrant::getIterator' => ['TokyoTyrantIterator'], -'TokyoTyrant::num' => ['int'], -'TokyoTyrant::out' => ['string', 'keys'=>'mixed'], -'TokyoTyrant::put' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], -'TokyoTyrant::putCat' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], -'TokyoTyrant::putKeep' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], -'TokyoTyrant::putNr' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], -'TokyoTyrant::putShl' => ['mixed', 'key'=>'string', 'value'=>'string', 'width'=>'int'], -'TokyoTyrant::restore' => ['mixed', 'log_dir'=>'string', 'timestamp'=>'int', 'check_consistency='=>'bool'], -'TokyoTyrant::setMaster' => ['mixed', 'host'=>'string', 'port'=>'int', 'timestamp'=>'int', 'check_consistency='=>'bool'], -'TokyoTyrant::size' => ['int', 'key'=>'string'], -'TokyoTyrant::stat' => ['array'], -'TokyoTyrant::sync' => ['mixed'], -'TokyoTyrant::tune' => ['TokyoTyrant', 'timeout'=>'float', 'options='=>'int'], -'TokyoTyrant::vanish' => ['mixed'], -'TokyoTyrantIterator::__construct' => ['void', 'object'=>'mixed'], -'TokyoTyrantIterator::current' => ['mixed'], -'TokyoTyrantIterator::key' => ['mixed'], -'TokyoTyrantIterator::next' => ['mixed'], -'TokyoTyrantIterator::rewind' => ['void'], -'TokyoTyrantIterator::valid' => ['bool'], -'TokyoTyrantQuery::__construct' => ['void', 'table'=>'TokyoTyrantTable'], -'TokyoTyrantQuery::addCond' => ['mixed', 'name'=>'string', 'op'=>'int', 'expr'=>'string'], -'TokyoTyrantQuery::count' => ['int'], -'TokyoTyrantQuery::current' => ['array'], -'TokyoTyrantQuery::hint' => ['string'], -'TokyoTyrantQuery::key' => ['string'], -'TokyoTyrantQuery::metaSearch' => ['array', 'queries'=>'array', 'type'=>'int'], -'TokyoTyrantQuery::next' => ['array'], -'TokyoTyrantQuery::out' => ['TokyoTyrantQuery'], -'TokyoTyrantQuery::rewind' => ['bool'], -'TokyoTyrantQuery::search' => ['array'], -'TokyoTyrantQuery::setLimit' => ['mixed', 'max='=>'int', 'skip='=>'int'], -'TokyoTyrantQuery::setOrder' => ['mixed', 'name'=>'string', 'type'=>'int'], -'TokyoTyrantQuery::valid' => ['bool'], -'TokyoTyrantTable::add' => ['void', 'key'=>'string', 'increment'=>'mixed', 'type='=>'string'], -'TokyoTyrantTable::genUid' => ['int'], -'TokyoTyrantTable::get' => ['array', 'keys'=>'mixed'], -'TokyoTyrantTable::getIterator' => ['TokyoTyrantIterator'], -'TokyoTyrantTable::getQuery' => ['TokyoTyrantQuery'], -'TokyoTyrantTable::out' => ['void', 'keys'=>'mixed'], -'TokyoTyrantTable::put' => ['int', 'key'=>'string', 'columns'=>'array'], -'TokyoTyrantTable::putCat' => ['void', 'key'=>'string', 'columns'=>'array'], -'TokyoTyrantTable::putKeep' => ['void', 'key'=>'string', 'columns'=>'array'], -'TokyoTyrantTable::putNr' => ['void', 'keys'=>'mixed', 'value='=>'string'], -'TokyoTyrantTable::putShl' => ['void', 'key'=>'string', 'value'=>'string', 'width'=>'int'], -'TokyoTyrantTable::setIndex' => ['mixed', 'column'=>'string', 'type'=>'int'], -'touch' => ['bool', 'filename'=>'string', 'mtime='=>'int', 'atime='=>'int'], -'trader_acos' => ['array', 'real'=>'array'], -'trader_ad' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array'], -'trader_add' => ['array', 'real0'=>'array', 'real1'=>'array'], -'trader_adosc' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int'], -'trader_adx' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], -'trader_adxr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], -'trader_apo' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'mAType='=>'int'], -'trader_aroon' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], -'trader_aroonosc' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], -'trader_asin' => ['array', 'real'=>'array'], -'trader_atan' => ['array', 'real'=>'array'], -'trader_atr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], -'trader_avgprice' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_bbands' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDevUp='=>'float', 'nbDevDn='=>'float', 'mAType='=>'int'], -'trader_beta' => ['array', 'real0'=>'array', 'real1'=>'array', 'timePeriod='=>'int'], -'trader_bop' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cci' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], -'trader_cdl2crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdl3blackcrows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdl3inside' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdl3linestrike' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdl3outside' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdl3starsinsouth' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdl3whitesoldiers' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlabandonedbaby' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], -'trader_cdladvanceblock' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlbelthold' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlbreakaway' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlclosingmarubozu' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlconcealbabyswall' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlcounterattack' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdldarkcloudcover' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], -'trader_cdldoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdldojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdldragonflydoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlengulfing' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdleveningdojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], -'trader_cdleveningstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], -'trader_cdlgapsidesidewhite' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlgravestonedoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlhammer' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlhangingman' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlharami' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlharamicross' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlhighwave' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlhikkake' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlhikkakemod' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlhomingpigeon' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlidentical3crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlinneck' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlinvertedhammer' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlkicking' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlkickingbylength' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlladderbottom' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdllongleggeddoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdllongline' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlmarubozu' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlmatchinglow' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlmathold' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], -'trader_cdlmorningdojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], -'trader_cdlmorningstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], -'trader_cdlonneck' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlpiercing' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlrickshawman' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlrisefall3methods' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlseparatinglines' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlshootingstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlshortline' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlspinningtop' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlstalledpattern' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlsticksandwich' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdltakuri' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdltasukigap' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlthrusting' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdltristar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlunique3river' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlupsidegap2crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_cdlxsidegap3methods' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_ceil' => ['array', 'real'=>'array'], -'trader_cmo' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_correl' => ['array', 'real0'=>'array', 'real1'=>'array', 'timePeriod='=>'int'], -'trader_cos' => ['array', 'real'=>'array'], -'trader_cosh' => ['array', 'real'=>'array'], -'trader_dema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_div' => ['array', 'real0'=>'array', 'real1'=>'array'], -'trader_dx' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], -'trader_ema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_errno' => ['int'], -'trader_exp' => ['array', 'real'=>'array'], -'trader_floor' => ['array', 'real'=>'array'], -'trader_get_compat' => ['int'], -'trader_get_unstable_period' => ['int', 'functionId'=>'int'], -'trader_ht_dcperiod' => ['array', 'real'=>'array'], -'trader_ht_dcphase' => ['array', 'real'=>'array'], -'trader_ht_phasor' => ['array', 'real'=>'array'], -'trader_ht_sine' => ['array', 'real'=>'array'], -'trader_ht_trendline' => ['array', 'real'=>'array'], -'trader_ht_trendmode' => ['array', 'real'=>'array'], -'trader_kama' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_linearreg' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_linearreg_angle' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_linearreg_intercept' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_linearreg_slope' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_ln' => ['array', 'real'=>'array'], -'trader_log10' => ['array', 'real'=>'array'], -'trader_ma' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'mAType='=>'int'], -'trader_macd' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'signalPeriod='=>'int'], -'trader_macdext' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'fastMAType='=>'int', 'slowPeriod='=>'int', 'slowMAType='=>'int', 'signalPeriod='=>'int', 'signalMAType='=>'int'], -'trader_macdfix' => ['array', 'real'=>'array', 'signalPeriod='=>'int'], -'trader_mama' => ['array', 'real'=>'array', 'fastLimit='=>'float', 'slowLimit='=>'float'], -'trader_mavp' => ['array', 'real'=>'array', 'periods'=>'array', 'minPeriod='=>'int', 'maxPeriod='=>'int', 'mAType='=>'int'], -'trader_max' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_maxindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_medprice' => ['array', 'high'=>'array', 'low'=>'array'], -'trader_mfi' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array', 'timePeriod='=>'int'], -'trader_midpoint' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_midprice' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], -'trader_min' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_minindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_minmax' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_minmaxindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_minus_di' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], -'trader_minus_dm' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], -'trader_mom' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_mult' => ['array', 'real0'=>'array', 'real1'=>'array'], -'trader_natr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], -'trader_obv' => ['array', 'real'=>'array', 'volume'=>'array'], -'trader_plus_di' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], -'trader_plus_dm' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], -'trader_ppo' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'mAType='=>'int'], -'trader_roc' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_rocp' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_rocr' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_rocr100' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_rsi' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_sar' => ['array', 'high'=>'array', 'low'=>'array', 'acceleration='=>'float', 'maximum='=>'float'], -'trader_sarext' => ['array', 'high'=>'array', 'low'=>'array', 'startValue='=>'float', 'offsetOnReverse='=>'float', 'accelerationInitLong='=>'float', 'accelerationLong='=>'float', 'accelerationMaxLong='=>'float', 'accelerationInitShort='=>'float', 'accelerationShort='=>'float', 'accelerationMaxShort='=>'float'], -'trader_set_compat' => ['void', 'compatId'=>'int'], -'trader_set_unstable_period' => ['void', 'functionId'=>'int', 'timePeriod'=>'int'], -'trader_sin' => ['array', 'real'=>'array'], -'trader_sinh' => ['array', 'real'=>'array'], -'trader_sma' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_sqrt' => ['array', 'real'=>'array'], -'trader_stddev' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDev='=>'float'], -'trader_stoch' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'fastK_Period='=>'int', 'slowK_Period='=>'int', 'slowK_MAType='=>'int', 'slowD_Period='=>'int', 'slowD_MAType='=>'int'], -'trader_stochf' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'fastK_Period='=>'int', 'fastD_Period='=>'int', 'fastD_MAType='=>'int'], -'trader_stochrsi' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'fastK_Period='=>'int', 'fastD_Period='=>'int', 'fastD_MAType='=>'int'], -'trader_sub' => ['array', 'real0'=>'array', 'real1'=>'array'], -'trader_sum' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_t3' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'vFactor='=>'float'], -'trader_tan' => ['array', 'real'=>'array'], -'trader_tanh' => ['array', 'real'=>'array'], -'trader_tema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_trange' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_trima' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_trix' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_tsf' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trader_typprice' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_ultosc' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod1='=>'int', 'timePeriod2='=>'int', 'timePeriod3='=>'int'], -'trader_var' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDev='=>'float'], -'trader_wclprice' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], -'trader_willr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], -'trader_wma' => ['array', 'real'=>'array', 'timePeriod='=>'int'], -'trait_exists' => ['bool', 'trait'=>'string', 'autoload='=>'bool'], -'Transliterator::create' => ['?Transliterator', 'id'=>'string', 'direction='=>'int'], -'Transliterator::createFromRules' => ['?Transliterator', 'rules'=>'string', 'direction='=>'int'], -'Transliterator::createInverse' => ['Transliterator'], -'Transliterator::getErrorCode' => ['int'], -'Transliterator::getErrorMessage' => ['string'], -'Transliterator::listIDs' => ['array'], -'Transliterator::transliterate' => ['string|false', 'subject'=>'string', 'start='=>'int', 'end='=>'int'], -'transliterator_create' => ['?Transliterator', 'id'=>'string', 'direction='=>'int'], -'transliterator_create_from_rules' => ['?Transliterator', 'rules'=>'string', 'direction='=>'int'], -'transliterator_create_inverse' => ['?Transliterator', 'transliterator'=>'Transliterator'], -'transliterator_get_error_code' => ['int', 'transliterator'=>'Transliterator'], -'transliterator_get_error_message' => ['string', 'transliterator'=>'Transliterator'], -'transliterator_list_ids' => ['array'], -'transliterator_transliterate' => ['string|false', 'transliterator'=>'Transliterator|string', 'string'=>'string', 'start='=>'int', 'end='=>'int'], -'trigger_error' => ['bool', 'message'=>'string', 'error_level='=>'256|512|1024|16384'], -'trim' => ['string', 'string'=>'string', 'characters='=>'string'], -'TypeError::__clone' => ['void'], -'TypeError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?TypeError'], -'TypeError::__toString' => ['string'], -'TypeError::getCode' => ['int'], -'TypeError::getFile' => ['string'], -'TypeError::getLine' => ['int'], -'TypeError::getMessage' => ['string'], -'TypeError::getPrevious' => ['Throwable|TypeError|null'], -'TypeError::getTrace' => ['list\',args?:array}>'], -'TypeError::getTraceAsString' => ['string'], -'uasort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], -'ucfirst' => ['string', 'string'=>'string'], -'UConverter::__construct' => ['void', 'destination_encoding='=>'string', 'source_encoding='=>'string'], -'UConverter::convert' => ['string', 'string'=>'string', 'reverse='=>'bool'], -'UConverter::fromUCallback' => ['mixed', 'reason'=>'int', 'source'=>'string', 'codePoint'=>'string', '&w_error'=>'int'], -'UConverter::getAliases' => ['array', 'name'=>'string'], -'UConverter::getAvailable' => ['array'], -'UConverter::getDestinationEncoding' => ['string'], -'UConverter::getDestinationType' => ['int'], -'UConverter::getErrorCode' => ['int'], -'UConverter::getErrorMessage' => ['string'], -'UConverter::getSourceEncoding' => ['string'], -'UConverter::getSourceType' => ['int'], -'UConverter::getStandards' => ['array'], -'UConverter::getSubstChars' => ['string'], -'UConverter::reasonText' => ['string', 'reason='=>'int'], -'UConverter::setDestinationEncoding' => ['bool', 'encoding'=>'string'], -'UConverter::setSourceEncoding' => ['bool', 'encoding'=>'string'], -'UConverter::setSubstChars' => ['bool', 'chars'=>'string'], -'UConverter::toUCallback' => ['mixed', 'reason'=>'int', 'source'=>'string', 'codeUnits'=>'string', '&w_error'=>'int'], -'UConverter::transcode' => ['string', 'string'=>'string', 'toEncoding'=>'string', 'fromEncoding'=>'string', 'options='=>'?array'], -'ucwords' => ['string', 'string'=>'string', 'separators='=>'string'], -'udm_add_search_limit' => ['bool', 'agent'=>'resource', 'var'=>'int', 'value'=>'string'], -'udm_alloc_agent' => ['resource', 'dbaddr'=>'string', 'dbmode='=>'string'], -'udm_alloc_agent_array' => ['resource', 'databases'=>'array'], -'udm_api_version' => ['int'], -'udm_cat_list' => ['array', 'agent'=>'resource', 'category'=>'string'], -'udm_cat_path' => ['array', 'agent'=>'resource', 'category'=>'string'], -'udm_check_charset' => ['bool', 'agent'=>'resource', 'charset'=>'string'], -'udm_check_stored' => ['int', 'agent'=>'', 'link'=>'int', 'doc_id'=>'string'], -'udm_clear_search_limits' => ['bool', 'agent'=>'resource'], -'udm_close_stored' => ['int', 'agent'=>'', 'link'=>'int'], -'udm_crc32' => ['int', 'agent'=>'resource', 'string'=>'string'], -'udm_errno' => ['int', 'agent'=>'resource'], -'udm_error' => ['string', 'agent'=>'resource'], -'udm_find' => ['resource', 'agent'=>'resource', 'query'=>'string'], -'udm_free_agent' => ['int', 'agent'=>'resource'], -'udm_free_ispell_data' => ['bool', 'agent'=>'int'], -'udm_free_res' => ['bool', 'res'=>'resource'], -'udm_get_doc_count' => ['int', 'agent'=>'resource'], -'udm_get_res_field' => ['string', 'res'=>'resource', 'row'=>'int', 'field'=>'int'], -'udm_get_res_param' => ['string', 'res'=>'resource', 'param'=>'int'], -'udm_hash32' => ['int', 'agent'=>'resource', 'string'=>'string'], -'udm_load_ispell_data' => ['bool', 'agent'=>'resource', 'var'=>'int', 'val1'=>'string', 'val2'=>'string', 'flag'=>'int'], -'udm_open_stored' => ['int', 'agent'=>'', 'storedaddr'=>'string'], -'udm_set_agent_param' => ['bool', 'agent'=>'resource', 'var'=>'int', 'val'=>'string'], -'ui\area::onDraw' => ['', 'pen'=>'UI\Draw\Pen', 'areaSize'=>'UI\Size', 'clipPoint'=>'UI\Point', 'clipSize'=>'UI\Size'], -'ui\area::onKey' => ['', 'key'=>'string', 'ext'=>'int', 'flags'=>'int'], -'ui\area::onMouse' => ['', 'areaPoint'=>'UI\Point', 'areaSize'=>'UI\Size', 'flags'=>'int'], -'ui\area::redraw' => [''], -'ui\area::scrollTo' => ['', 'point'=>'UI\Point', 'size'=>'UI\Size'], -'ui\area::setSize' => ['', 'size'=>'UI\Size'], -'ui\control::destroy' => [''], -'ui\control::disable' => [''], -'ui\control::enable' => [''], -'ui\control::getParent' => ['UI\Control'], -'ui\control::getTopLevel' => ['int'], -'ui\control::hide' => [''], -'ui\control::isEnabled' => ['bool'], -'ui\control::isVisible' => ['bool'], -'ui\control::setParent' => ['', 'parent'=>'UI\Control'], -'ui\control::show' => [''], -'ui\controls\box::append' => ['int', 'control'=>'Control', 'stretchy='=>'bool'], -'ui\controls\box::delete' => ['bool', 'index'=>'int'], -'ui\controls\box::getOrientation' => ['int'], -'ui\controls\box::isPadded' => ['bool'], -'ui\controls\box::setPadded' => ['', 'padded'=>'bool'], -'ui\controls\button::getText' => ['string'], -'ui\controls\button::onClick' => [''], -'ui\controls\button::setText' => ['', 'text'=>'string'], -'ui\controls\check::getText' => ['string'], -'ui\controls\check::isChecked' => ['bool'], -'ui\controls\check::onToggle' => [''], -'ui\controls\check::setChecked' => ['', 'checked'=>'bool'], -'ui\controls\check::setText' => ['', 'text'=>'string'], -'ui\controls\colorbutton::getColor' => ['UI\Color'], -'ui\controls\colorbutton::onChange' => [''], -'ui\controls\combo::append' => ['', 'text'=>'string'], -'ui\controls\combo::getSelected' => ['int'], -'ui\controls\combo::onSelected' => [''], -'ui\controls\combo::setSelected' => ['', 'index'=>'int'], -'ui\controls\editablecombo::append' => ['', 'text'=>'string'], -'ui\controls\editablecombo::getText' => ['string'], -'ui\controls\editablecombo::onChange' => [''], -'ui\controls\editablecombo::setText' => ['', 'text'=>'string'], -'ui\controls\entry::getText' => ['string'], -'ui\controls\entry::isReadOnly' => ['bool'], -'ui\controls\entry::onChange' => [''], -'ui\controls\entry::setReadOnly' => ['', 'readOnly'=>'bool'], -'ui\controls\entry::setText' => ['', 'text'=>'string'], -'ui\controls\form::append' => ['int', 'label'=>'string', 'control'=>'UI\Control', 'stretchy='=>'bool'], -'ui\controls\form::delete' => ['bool', 'index'=>'int'], -'ui\controls\form::isPadded' => ['bool'], -'ui\controls\form::setPadded' => ['', 'padded'=>'bool'], -'ui\controls\grid::append' => ['', 'control'=>'UI\Control', 'left'=>'int', 'top'=>'int', 'xspan'=>'int', 'yspan'=>'int', 'hexpand'=>'bool', 'halign'=>'int', 'vexpand'=>'bool', 'valign'=>'int'], -'ui\controls\grid::isPadded' => ['bool'], -'ui\controls\grid::setPadded' => ['', 'padding'=>'bool'], -'ui\controls\group::append' => ['', 'control'=>'UI\Control'], -'ui\controls\group::getTitle' => ['string'], -'ui\controls\group::hasMargin' => ['bool'], -'ui\controls\group::setMargin' => ['', 'margin'=>'bool'], -'ui\controls\group::setTitle' => ['', 'title'=>'string'], -'ui\controls\label::getText' => ['string'], -'ui\controls\label::setText' => ['', 'text'=>'string'], -'ui\controls\multilineentry::append' => ['', 'text'=>'string'], -'ui\controls\multilineentry::getText' => ['string'], -'ui\controls\multilineentry::isReadOnly' => ['bool'], -'ui\controls\multilineentry::onChange' => [''], -'ui\controls\multilineentry::setReadOnly' => ['', 'readOnly'=>'bool'], -'ui\controls\multilineentry::setText' => ['', 'text'=>'string'], -'ui\controls\progress::getValue' => ['int'], -'ui\controls\progress::setValue' => ['', 'value'=>'int'], -'ui\controls\radio::append' => ['', 'text'=>'string'], -'ui\controls\radio::getSelected' => ['int'], -'ui\controls\radio::onSelected' => [''], -'ui\controls\radio::setSelected' => ['', 'index'=>'int'], -'ui\controls\slider::getValue' => ['int'], -'ui\controls\slider::onChange' => [''], -'ui\controls\slider::setValue' => ['', 'value'=>'int'], -'ui\controls\spin::getValue' => ['int'], -'ui\controls\spin::onChange' => [''], -'ui\controls\spin::setValue' => ['', 'value'=>'int'], -'ui\controls\tab::append' => ['int', 'name'=>'string', 'control'=>'UI\Control'], -'ui\controls\tab::delete' => ['bool', 'index'=>'int'], -'ui\controls\tab::hasMargin' => ['bool', 'page'=>'int'], -'ui\controls\tab::insertAt' => ['', 'name'=>'string', 'page'=>'int', 'control'=>'UI\Control'], -'ui\controls\tab::pages' => ['int'], -'ui\controls\tab::setMargin' => ['', 'page'=>'int', 'margin'=>'bool'], -'ui\draw\brush::getColor' => ['UI\Draw\Color'], -'ui\draw\brush\gradient::delStop' => ['int', 'index'=>'int'], -'ui\draw\color::getChannel' => ['float', 'channel'=>'int'], -'ui\draw\color::setChannel' => ['void', 'channel'=>'int', 'value'=>'float'], -'ui\draw\matrix::invert' => [''], -'ui\draw\matrix::isInvertible' => ['bool'], -'ui\draw\matrix::multiply' => ['UI\Draw\Matrix', 'matrix'=>'UI\Draw\Matrix'], -'ui\draw\matrix::rotate' => ['', 'point'=>'UI\Point', 'amount'=>'float'], -'ui\draw\matrix::scale' => ['', 'center'=>'UI\Point', 'point'=>'UI\Point'], -'ui\draw\matrix::skew' => ['', 'point'=>'UI\Point', 'amount'=>'UI\Point'], -'ui\draw\matrix::translate' => ['', 'point'=>'UI\Point'], -'ui\draw\path::addRectangle' => ['', 'point'=>'UI\Point', 'size'=>'UI\Size'], -'ui\draw\path::arcTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], -'ui\draw\path::bezierTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], -'ui\draw\path::closeFigure' => [''], -'ui\draw\path::end' => [''], -'ui\draw\path::lineTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], -'ui\draw\path::newFigure' => ['', 'point'=>'UI\Point'], -'ui\draw\path::newFigureWithArc' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], -'ui\draw\pen::clip' => ['', 'path'=>'UI\Draw\Path'], -'ui\draw\pen::restore' => [''], -'ui\draw\pen::save' => [''], -'ui\draw\pen::transform' => ['', 'matrix'=>'UI\Draw\Matrix'], -'ui\draw\pen::write' => ['', 'point'=>'UI\Point', 'layout'=>'UI\Draw\Text\Layout'], -'ui\draw\stroke::getCap' => ['int'], -'ui\draw\stroke::getJoin' => ['int'], -'ui\draw\stroke::getMiterLimit' => ['float'], -'ui\draw\stroke::getThickness' => ['float'], -'ui\draw\stroke::setCap' => ['', 'cap'=>'int'], -'ui\draw\stroke::setJoin' => ['', 'join'=>'int'], -'ui\draw\stroke::setMiterLimit' => ['', 'limit'=>'float'], -'ui\draw\stroke::setThickness' => ['', 'thickness'=>'float'], -'ui\draw\text\font::getAscent' => ['float'], -'ui\draw\text\font::getDescent' => ['float'], -'ui\draw\text\font::getLeading' => ['float'], -'ui\draw\text\font::getUnderlinePosition' => ['float'], -'ui\draw\text\font::getUnderlineThickness' => ['float'], -'ui\draw\text\font\descriptor::getFamily' => ['string'], -'ui\draw\text\font\descriptor::getItalic' => ['int'], -'ui\draw\text\font\descriptor::getSize' => ['float'], -'ui\draw\text\font\descriptor::getStretch' => ['int'], -'ui\draw\text\font\descriptor::getWeight' => ['int'], -'ui\draw\text\font\fontfamilies' => ['array'], -'ui\draw\text\layout::setWidth' => ['', 'width'=>'float'], -'ui\executor::kill' => ['void'], -'ui\executor::onExecute' => ['void'], -'ui\menu::append' => ['UI\MenuItem', 'name'=>'string', 'type='=>'string'], -'ui\menu::appendAbout' => ['UI\MenuItem', 'type='=>'string'], -'ui\menu::appendCheck' => ['UI\MenuItem', 'name'=>'string', 'type='=>'string'], -'ui\menu::appendPreferences' => ['UI\MenuItem', 'type='=>'string'], -'ui\menu::appendQuit' => ['UI\MenuItem', 'type='=>'string'], -'ui\menu::appendSeparator' => [''], -'ui\menuitem::disable' => [''], -'ui\menuitem::enable' => [''], -'ui\menuitem::isChecked' => ['bool'], -'ui\menuitem::onClick' => [''], -'ui\menuitem::setChecked' => ['', 'checked'=>'bool'], -'ui\point::getX' => ['float'], -'ui\point::getY' => ['float'], -'ui\point::setX' => ['', 'point'=>'float'], -'ui\point::setY' => ['', 'point'=>'float'], -'ui\quit' => ['void'], -'ui\run' => ['void', 'flags='=>'int'], -'ui\size::getHeight' => ['float'], -'ui\size::getWidth' => ['float'], -'ui\size::setHeight' => ['', 'size'=>'float'], -'ui\size::setWidth' => ['', 'size'=>'float'], -'ui\window::add' => ['', 'control'=>'UI\Control'], -'ui\window::error' => ['', 'title'=>'string', 'msg'=>'string'], -'ui\window::getSize' => ['UI\Size'], -'ui\window::getTitle' => ['string'], -'ui\window::hasBorders' => ['bool'], -'ui\window::hasMargin' => ['bool'], -'ui\window::isFullScreen' => ['bool'], -'ui\window::msg' => ['', 'title'=>'string', 'msg'=>'string'], -'ui\window::onClosing' => ['int'], -'ui\window::open' => ['string'], -'ui\window::save' => ['string'], -'ui\window::setBorders' => ['', 'borders'=>'bool'], -'ui\window::setFullScreen' => ['', 'full'=>'bool'], -'ui\window::setMargin' => ['', 'margin'=>'bool'], -'ui\window::setSize' => ['', 'size'=>'UI\Size'], -'ui\window::setTitle' => ['', 'title'=>'string'], -'uksort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], -'umask' => ['int', 'mask='=>'int'], -'UnderflowException::__clone' => ['void'], -'UnderflowException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?UnderflowException'], -'UnderflowException::__toString' => ['string'], -'UnderflowException::getCode' => ['int'], -'UnderflowException::getFile' => ['string'], -'UnderflowException::getLine' => ['int'], -'UnderflowException::getMessage' => ['string'], -'UnderflowException::getPrevious' => ['Throwable|UnderflowException|null'], -'UnderflowException::getTrace' => ['list\',args?:array}>'], -'UnderflowException::getTraceAsString' => ['string'], -'UnexpectedValueException::__clone' => ['void'], -'UnexpectedValueException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?UnexpectedValueException'], -'UnexpectedValueException::__toString' => ['string'], -'UnexpectedValueException::getCode' => ['int'], -'UnexpectedValueException::getFile' => ['string'], -'UnexpectedValueException::getLine' => ['int'], -'UnexpectedValueException::getMessage' => ['string'], -'UnexpectedValueException::getPrevious' => ['Throwable|UnexpectedValueException|null'], -'UnexpectedValueException::getTrace' => ['list\',args?:array}>'], -'UnexpectedValueException::getTraceAsString' => ['string'], -'uniqid' => ['non-empty-string', 'prefix='=>'string', 'more_entropy='=>'bool'], -'unixtojd' => ['int', 'timestamp='=>'int'], -'unlink' => ['bool', 'filename'=>'string', 'context='=>'resource'], -'unpack' => ['array|false', 'format'=>'string', 'string'=>'string', 'offset='=>'int'], -'unregister_tick_function' => ['void', 'callback'=>'callable'], -'unserialize' => ['mixed', 'data'=>'string', 'options='=>'array{allowed_classes?:string[]|bool}'], -'unset' => ['void', 'var='=>'mixed', '...args='=>'mixed'], -'untaint' => ['bool', '&rw_string'=>'string', '&...rw_strings='=>'string'], -'uopz_allow_exit' => ['void', 'allow'=>'bool'], -'uopz_backup' => ['void', 'class'=>'string', 'function'=>'string'], -'uopz_backup\'1' => ['void', 'function'=>'string'], -'uopz_compose' => ['void', 'name'=>'string', 'classes'=>'array', 'methods='=>'array', 'properties='=>'array', 'flags='=>'int'], -'uopz_copy' => ['Closure', 'class'=>'string', 'function'=>'string'], -'uopz_copy\'1' => ['Closure', 'function'=>'string'], -'uopz_delete' => ['void', 'class'=>'string', 'function'=>'string'], -'uopz_delete\'1' => ['void', 'function'=>'string'], -'uopz_extend' => ['bool', 'class'=>'string', 'parent'=>'string'], -'uopz_flags' => ['int', 'class'=>'string', 'function'=>'string', 'flags'=>'int'], -'uopz_flags\'1' => ['int', 'function'=>'string', 'flags'=>'int'], -'uopz_function' => ['void', 'class'=>'string', 'function'=>'string', 'handler'=>'Closure', 'modifiers='=>'int'], -'uopz_function\'1' => ['void', 'function'=>'string', 'handler'=>'Closure', 'modifiers='=>'int'], -'uopz_get_exit_status' => ['?int'], -'uopz_get_hook' => ['?Closure', 'class'=>'string', 'function'=>'string'], -'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_static' => ['?array', 'class'=>'string', 'function'=>'string'], -'uopz_implement' => ['bool', 'class'=>'string', 'interface'=>'string'], -'uopz_overload' => ['void', 'opcode'=>'int', 'callable'=>'Callable'], -'uopz_redefine' => ['bool', 'class'=>'string', 'constant'=>'string', 'value'=>'mixed'], -'uopz_redefine\'1' => ['bool', 'constant'=>'string', 'value'=>'mixed'], -'uopz_rename' => ['void', 'class'=>'string', 'function'=>'string', 'rename'=>'string'], -'uopz_rename\'1' => ['void', 'function'=>'string', 'rename'=>'string'], -'uopz_restore' => ['void', 'class'=>'string', 'function'=>'string'], -'uopz_restore\'1' => ['void', 'function'=>'string'], -'uopz_set_hook' => ['bool', 'class'=>'string', 'function'=>'string', 'hook'=>'Closure'], -'uopz_set_hook\'1' => ['bool', 'function'=>'string', 'hook'=>'Closure'], -'uopz_set_mock' => ['void', 'class'=>'string', 'mock'=>'object|string'], -'uopz_set_property' => ['void', 'class'=>'object|string', 'property'=>'string', 'value'=>'mixed'], -'uopz_set_return' => ['bool', 'class'=>'string', 'function'=>'string', 'value'=>'mixed', 'execute='=>'bool'], -'uopz_set_return\'1' => ['bool', 'function'=>'string', 'value'=>'mixed', 'execute='=>'bool'], -'uopz_set_static' => ['void', 'class'=>'string', 'function'=>'string', 'static'=>'array'], -'uopz_undefine' => ['bool', 'class'=>'string', 'constant'=>'string'], -'uopz_undefine\'1' => ['bool', 'constant'=>'string'], -'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\'1' => ['bool', 'function'=>'string'], -'urldecode' => ['string', 'string'=>'string'], -'urlencode' => ['string', 'string'=>'string'], -'use_soap_error_handler' => ['bool', 'enable='=>'bool'], -'user_error' => ['void', 'message'=>'string', 'error_level='=>'int'], -'usleep' => ['void', 'microseconds'=>'positive-int|0'], -'usort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], -'utf8_decode' => ['string', 'string'=>'string'], -'utf8_encode' => ['string', 'string'=>'string'], -'V8Js::__construct' => ['void', 'object_name='=>'string', 'variables='=>'array', 'extensions='=>'array', 'report_uncaught_exceptions='=>'bool', 'snapshot_blob='=>'string'], -'V8Js::clearPendingException' => [''], -'V8Js::compileString' => ['resource', 'script'=>'', 'identifier='=>'string'], -'V8Js::createSnapshot' => ['false|string', 'embed_source'=>'string'], -'V8Js::executeScript' => ['', 'script'=>'resource', 'flags='=>'int', 'time_limit='=>'int', 'memory_limit='=>'int'], -'V8Js::executeString' => ['mixed', 'script'=>'string', 'identifier='=>'string', 'flags='=>'int'], -'V8Js::getExtensions' => ['string[]'], -'V8Js::getPendingException' => ['?V8JsException'], -'V8Js::registerExtension' => ['bool', 'extension_name'=>'string', 'script'=>'string', 'dependencies='=>'array', 'auto_enable='=>'bool'], -'V8Js::setAverageObjectSize' => ['', 'average_object_size'=>'int'], -'V8Js::setMemoryLimit' => ['', 'limit'=>'int'], -'V8Js::setModuleLoader' => ['', 'loader'=>'callable'], -'V8Js::setModuleNormaliser' => ['', 'normaliser'=>'callable'], -'V8Js::setTimeLimit' => ['', 'limit'=>'int'], -'V8JsException::getJsFileName' => ['string'], -'V8JsException::getJsLineNumber' => ['int'], -'V8JsException::getJsSourceLine' => ['int'], -'V8JsException::getJsTrace' => ['string'], -'V8JsScriptException::__clone' => ['void'], -'V8JsScriptException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'V8JsScriptException::__toString' => ['string'], -'V8JsScriptException::__wakeup' => ['void'], -'V8JsScriptException::getCode' => ['int'], -'V8JsScriptException::getFile' => ['string'], -'V8JsScriptException::getJsEndColumn' => ['int'], -'V8JsScriptException::getJsFileName' => ['string'], -'V8JsScriptException::getJsLineNumber' => ['int'], -'V8JsScriptException::getJsSourceLine' => ['string'], -'V8JsScriptException::getJsStartColumn' => ['int'], -'V8JsScriptException::getJsTrace' => ['string'], -'V8JsScriptException::getLine' => ['int'], -'V8JsScriptException::getMessage' => ['string'], -'V8JsScriptException::getPrevious' => ['Exception|Throwable'], -'V8JsScriptException::getTrace' => ['list\',args?:array}>'], -'V8JsScriptException::getTraceAsString' => ['string'], -'var_dump' => ['void', 'value'=>'mixed', '...values='=>'mixed'], -'var_export' => ['?string', 'value'=>'mixed', 'return='=>'bool'], -'VARIANT::__construct' => ['void', 'value='=>'mixed', 'type='=>'int', 'codepage='=>'int'], -'variant_abs' => ['mixed', 'value'=>'mixed'], -'variant_add' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_and' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_cast' => ['VARIANT', 'variant'=>'VARIANT', 'type'=>'int'], -'variant_cat' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_cmp' => ['int', 'left'=>'mixed', 'right'=>'mixed', 'locale_id='=>'int', 'flags='=>'int'], -'variant_date_from_timestamp' => ['VARIANT', 'timestamp'=>'int'], -'variant_date_to_timestamp' => ['int', 'variant'=>'VARIANT'], -'variant_div' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_eqv' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_fix' => ['mixed', 'value'=>'mixed'], -'variant_get_type' => ['int', 'variant'=>'VARIANT'], -'variant_idiv' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_imp' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_int' => ['mixed', 'value'=>'mixed'], -'variant_mod' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_mul' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_neg' => ['mixed', 'value'=>'mixed'], -'variant_not' => ['mixed', 'value'=>'mixed'], -'variant_or' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_pow' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_round' => ['mixed', 'value'=>'mixed', 'decimals'=>'int'], -'variant_set' => ['void', 'variant'=>'object', 'value'=>'mixed'], -'variant_set_type' => ['void', 'variant'=>'object', 'type'=>'int'], -'variant_sub' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_xor' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'VarnishAdmin::__construct' => ['void', 'args='=>'array'], -'VarnishAdmin::auth' => ['bool'], -'VarnishAdmin::ban' => ['int', 'vcl_regex'=>'string'], -'VarnishAdmin::banUrl' => ['int', 'vcl_regex'=>'string'], -'VarnishAdmin::clearPanic' => ['int'], -'VarnishAdmin::connect' => ['bool'], -'VarnishAdmin::disconnect' => ['bool'], -'VarnishAdmin::getPanic' => ['string'], -'VarnishAdmin::getParams' => ['array'], -'VarnishAdmin::isRunning' => ['bool'], -'VarnishAdmin::setCompat' => ['void', 'compat'=>'int'], -'VarnishAdmin::setHost' => ['void', 'host'=>'string'], -'VarnishAdmin::setIdent' => ['void', 'ident'=>'string'], -'VarnishAdmin::setParam' => ['int', 'name'=>'string', 'value'=>'string|int'], -'VarnishAdmin::setPort' => ['void', 'port'=>'int'], -'VarnishAdmin::setSecret' => ['void', 'secret'=>'string'], -'VarnishAdmin::setTimeout' => ['void', 'timeout'=>'int'], -'VarnishAdmin::start' => ['int'], -'VarnishAdmin::stop' => ['int'], -'VarnishLog::__construct' => ['void', 'args='=>'array'], -'VarnishLog::getLine' => ['array'], -'VarnishLog::getTagName' => ['string', 'index'=>'int'], -'VarnishStat::__construct' => ['void', 'args='=>'array'], -'VarnishStat::getSnapshot' => ['array'], -'version_compare' => ['bool', 'version1'=>'string', 'version2'=>'string', 'operator'=>'\'<\'|\'lt\'|\'<=\'|\'le\'|\'>\'|\'gt\'|\'>=\'|\'ge\'|\'==\'|\'=\'|\'eq\'|\'!=\'|\'<>\'|\'ne\''], -'version_compare\'1' => ['int', 'version1'=>'string', 'version2'=>'string'], -'vfprintf' => ['int', 'stream'=>'resource', 'format'=>'string', 'values'=>'array'], -'virtual' => ['bool', 'uri'=>'string'], -'vpopmail_add_alias_domain' => ['bool', 'domain'=>'string', 'aliasdomain'=>'string'], -'vpopmail_add_alias_domain_ex' => ['bool', 'olddomain'=>'string', 'newdomain'=>'string'], -'vpopmail_add_domain' => ['bool', 'domain'=>'string', 'dir'=>'string', 'uid'=>'int', 'gid'=>'int'], -'vpopmail_add_domain_ex' => ['bool', 'domain'=>'string', 'passwd'=>'string', 'quota='=>'string', 'bounce='=>'string', 'apop='=>'bool'], -'vpopmail_add_user' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'gecos='=>'string', 'apop='=>'bool'], -'vpopmail_alias_add' => ['bool', 'user'=>'string', 'domain'=>'string', 'alias'=>'string'], -'vpopmail_alias_del' => ['bool', 'user'=>'string', 'domain'=>'string'], -'vpopmail_alias_del_domain' => ['bool', 'domain'=>'string'], -'vpopmail_alias_get' => ['array', 'alias'=>'string', 'domain'=>'string'], -'vpopmail_alias_get_all' => ['array', 'domain'=>'string'], -'vpopmail_auth_user' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'apop='=>'string'], -'vpopmail_del_domain' => ['bool', 'domain'=>'string'], -'vpopmail_del_domain_ex' => ['bool', 'domain'=>'string'], -'vpopmail_del_user' => ['bool', 'user'=>'string', 'domain'=>'string'], -'vpopmail_error' => ['string'], -'vpopmail_passwd' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'apop='=>'bool'], -'vpopmail_set_user_quota' => ['bool', 'user'=>'string', 'domain'=>'string', 'quota'=>'string'], -'vprintf' => ['int', 'format'=>'string', 'values'=>'array'], -'vsprintf' => ['string', 'format'=>'string', 'values'=>'array'], -'Vtiful\Kernel\Chart::__construct' => ['void', 'handle'=>'resource', 'type'=>'int'], -'Vtiful\Kernel\Chart::axisNameX' => ['Vtiful\Kernel\Chart', 'name'=>'string'], -'Vtiful\Kernel\Chart::axisNameY' => ['Vtiful\Kernel\Chart', 'name'=>'string'], -'Vtiful\Kernel\Chart::legendSetPosition' => ['Vtiful\Kernel\Chart', 'type'=>'int'], -'Vtiful\Kernel\Chart::series' => ['Vtiful\Kernel\Chart', 'value'=>'string', 'categories='=>'string'], -'Vtiful\Kernel\Chart::seriesName' => ['Vtiful\Kernel\Chart', 'value'=>'string'], -'Vtiful\Kernel\Chart::style' => ['Vtiful\Kernel\Chart', 'style'=>'int'], -'Vtiful\Kernel\Chart::title' => ['Vtiful\Kernel\Chart', 'title'=>'string'], -'Vtiful\Kernel\Chart::toResource' => ['resource'], -'Vtiful\Kernel\Excel::__construct' => ['void', 'config'=>'array'], -'Vtiful\Kernel\Excel::activateSheet' => ['bool', 'sheet_name'=>'string'], -'Vtiful\Kernel\Excel::addSheet' => ['Vtiful\Kernel\Excel', 'sheet_name='=>'?string'], -'Vtiful\Kernel\Excel::autoFilter' => ['Vtiful\Kernel\Excel', 'range'=>'string'], -'Vtiful\Kernel\Excel::checkoutSheet' => ['Vtiful\Kernel\Excel', 'sheet_name'=>'string'], -'Vtiful\Kernel\Excel::close' => ['Vtiful\Kernel\Excel'], -'Vtiful\Kernel\Excel::columnIndexFromString' => ['int', 'index'=>'string'], -'Vtiful\Kernel\Excel::constMemory' => ['Vtiful\Kernel\Excel', 'file_name'=>'string', 'sheet_name='=>'?string'], -'Vtiful\Kernel\Excel::data' => ['Vtiful\Kernel\Excel', 'data'=>'array'], -'Vtiful\Kernel\Excel::defaultFormat' => ['Vtiful\Kernel\Excel', 'format_handle'=>'resource'], -'Vtiful\Kernel\Excel::existSheet' => ['bool', 'sheet_name'=>'string'], -'Vtiful\Kernel\Excel::fileName' => ['Vtiful\Kernel\Excel', 'file_name'=>'string', 'sheet_name='=>'?string'], -'Vtiful\Kernel\Excel::freezePanes' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int'], -'Vtiful\Kernel\Excel::getHandle' => ['resource'], -'Vtiful\Kernel\Excel::getSheetData' => ['array|false'], -'Vtiful\Kernel\Excel::gridline' => ['Vtiful\Kernel\Excel', 'option='=>'int'], -'Vtiful\Kernel\Excel::header' => ['Vtiful\Kernel\Excel', 'header'=>'array', 'format_handle='=>'?resource'], -'Vtiful\Kernel\Excel::insertChart' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'chart_resource'=>'resource'], -'Vtiful\Kernel\Excel::insertComment' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'comment'=>'string'], -'Vtiful\Kernel\Excel::insertDate' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'timestamp'=>'int', 'format='=>'?string', 'format_handle='=>'?resource'], -'Vtiful\Kernel\Excel::insertFormula' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'formula'=>'string', 'format_handle='=>'?resource'], -'Vtiful\Kernel\Excel::insertImage' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'image'=>'string', 'width='=>'?float', 'height='=>'?float'], -'Vtiful\Kernel\Excel::insertText' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'data'=>'int|string|double', 'format='=>'?string', 'format_handle='=>'?resource'], -'Vtiful\Kernel\Excel::insertUrl' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'url'=>'string', 'text='=>'?string', 'tool_tip='=>'?string', 'format='=>'?resource'], -'Vtiful\Kernel\Excel::mergeCells' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'data'=>'string', 'format_handle='=>'?resource'], -'Vtiful\Kernel\Excel::nextCellCallback' => ['void', 'fci'=>'callable(int,int,mixed)', 'sheet_name='=>'?string'], -'Vtiful\Kernel\Excel::nextRow' => ['array|false', 'zv_type_t='=>'?array'], -'Vtiful\Kernel\Excel::openFile' => ['Vtiful\Kernel\Excel', 'zs_file_name'=>'string'], -'Vtiful\Kernel\Excel::openSheet' => ['Vtiful\Kernel\Excel', 'zs_sheet_name='=>'?string', 'zl_flag='=>'?int'], -'Vtiful\Kernel\Excel::output' => ['string'], -'Vtiful\Kernel\Excel::protection' => ['Vtiful\Kernel\Excel', 'password='=>'?string'], -'Vtiful\Kernel\Excel::putCSV' => ['bool', 'fp'=>'resource', 'delimiter_str='=>'?string', 'enclosure_str='=>'?string', 'escape_str='=>'?string'], -'Vtiful\Kernel\Excel::putCSVCallback' => ['bool', 'callback'=>'callable(array):array', 'fp'=>'resource', 'delimiter_str='=>'?string', 'enclosure_str='=>'?string', 'escape_str='=>'?string'], -'Vtiful\Kernel\Excel::setColumn' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'width'=>'float', 'format_handle='=>'?resource'], -'Vtiful\Kernel\Excel::setCurrentSheetHide' => ['Vtiful\Kernel\Excel'], -'Vtiful\Kernel\Excel::setCurrentSheetIsFirst' => ['Vtiful\Kernel\Excel'], -'Vtiful\Kernel\Excel::setGlobalType' => ['Vtiful\Kernel\Excel', 'zv_type_t'=>'int'], -'Vtiful\Kernel\Excel::setLandscape' => ['Vtiful\Kernel\Excel'], -'Vtiful\Kernel\Excel::setMargins' => ['Vtiful\Kernel\Excel', 'left='=>'?float', 'right='=>'?float', 'top='=>'?float', 'bottom='=>'?float'], -'Vtiful\Kernel\Excel::setPaper' => ['Vtiful\Kernel\Excel', 'paper'=>'int'], -'Vtiful\Kernel\Excel::setPortrait' => ['Vtiful\Kernel\Excel'], -'Vtiful\Kernel\Excel::setRow' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'height'=>'float', 'format_handle='=>'?resource'], -'Vtiful\Kernel\Excel::setSkipRows' => ['Vtiful\Kernel\Excel', 'zv_skip_t'=>'int'], -'Vtiful\Kernel\Excel::setType' => ['Vtiful\Kernel\Excel', 'zv_type_t'=>'array'], -'Vtiful\Kernel\Excel::sheetList' => ['array'], -'Vtiful\Kernel\Excel::showComment' => ['Vtiful\Kernel\Excel'], -'Vtiful\Kernel\Excel::stringFromColumnIndex' => ['string', 'index'=>'int'], -'Vtiful\Kernel\Excel::timestampFromDateDouble' => ['int', 'index'=>'?float'], -'Vtiful\Kernel\Excel::validation' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'validation_resource'=>'resource'], -'Vtiful\Kernel\Excel::zoom' => ['Vtiful\Kernel\Excel', 'scale'=>'int'], -'Vtiful\Kernel\Format::__construct' => ['void', 'handle'=>'resource'], -'Vtiful\Kernel\Format::align' => ['Vtiful\Kernel\Format', '...style'=>'int'], -'Vtiful\Kernel\Format::background' => ['Vtiful\Kernel\Format', 'color'=>'int', 'pattern='=>'int'], -'Vtiful\Kernel\Format::bold' => ['Vtiful\Kernel\Format'], -'Vtiful\Kernel\Format::border' => ['Vtiful\Kernel\Format', 'style'=>'int'], -'Vtiful\Kernel\Format::font' => ['Vtiful\Kernel\Format', 'font'=>'string'], -'Vtiful\Kernel\Format::fontColor' => ['Vtiful\Kernel\Format', 'color'=>'int'], -'Vtiful\Kernel\Format::fontSize' => ['Vtiful\Kernel\Format', 'size'=>'float'], -'Vtiful\Kernel\Format::italic' => ['Vtiful\Kernel\Format'], -'Vtiful\Kernel\Format::number' => ['Vtiful\Kernel\Format', 'format'=>'string'], -'Vtiful\Kernel\Format::strikeout' => ['Vtiful\Kernel\Format'], -'Vtiful\Kernel\Format::toResource' => ['resource'], -'Vtiful\Kernel\Format::underline' => ['Vtiful\Kernel\Format', 'style'=>'int'], -'Vtiful\Kernel\Format::unlocked' => ['Vtiful\Kernel\Format'], -'Vtiful\Kernel\Format::wrap' => ['Vtiful\Kernel\Format'], -'Vtiful\Kernel\Validation::__construct' => ['void'], -'Vtiful\Kernel\Validation::criteriaType' => ['?Vtiful\Kernel\Validation', 'type'=>'int'], -'Vtiful\Kernel\Validation::maximumFormula' => ['?Vtiful\Kernel\Validation', 'maximum_formula'=>'string'], -'Vtiful\Kernel\Validation::maximumNumber' => ['?Vtiful\Kernel\Validation', 'maximum_number'=>'float'], -'Vtiful\Kernel\Validation::minimumFormula' => ['?Vtiful\Kernel\Validation', 'minimum_formula'=>'string'], -'Vtiful\Kernel\Validation::minimumNumber' => ['?Vtiful\Kernel\Validation', 'minimum_number'=>'float'], -'Vtiful\Kernel\Validation::toResource' => ['resource'], -'Vtiful\Kernel\Validation::validationType' => ['?Vtiful\Kernel\Validation', 'type'=>'int'], -'Vtiful\Kernel\Validation::valueList' => ['?Vtiful\Kernel\Validation', 'value_list'=>'array'], -'Vtiful\Kernel\Validation::valueNumber' => ['?Vtiful\Kernel\Validation', 'value_number'=>'int'], -'w32api_deftype' => ['bool', 'typename'=>'string', 'member1_type'=>'string', 'member1_name'=>'string', '...args='=>'string'], -'w32api_init_dtype' => ['resource', 'typename'=>'string', 'value'=>'', '...args='=>''], -'w32api_invoke_function' => ['', 'funcname'=>'string', 'argument'=>'', '...args='=>''], -'w32api_register_function' => ['bool', 'library'=>'string', 'function_name'=>'string', 'return_type'=>'string'], -'w32api_set_call_method' => ['', 'method'=>'int'], -'wddx_add_vars' => ['bool', 'packet_id'=>'resource', 'var_names'=>'mixed', '...vars='=>'mixed'], -'wddx_deserialize' => ['mixed', 'packet'=>'string'], -'wddx_packet_end' => ['string', 'packet_id'=>'resource'], -'wddx_packet_start' => ['resource|false', 'comment='=>'string'], -'wddx_serialize_value' => ['string|false', 'value'=>'mixed', 'comment='=>'string'], -'wddx_serialize_vars' => ['string|false', 'var_name'=>'mixed', '...vars='=>'mixed'], -'WeakMap::__construct' => ['void'], -'WeakMap::count' => ['int'], -'WeakMap::current' => ['mixed'], -'WeakMap::key' => ['object'], -'WeakMap::next' => ['void'], -'WeakMap::offsetExists' => ['bool', 'object'=>'object'], -'WeakMap::offsetGet' => ['mixed', 'object'=>'object'], -'WeakMap::offsetSet' => ['void', 'object'=>'object', 'value'=>'mixed'], -'WeakMap::offsetUnset' => ['void', 'object'=>'object'], -'WeakMap::rewind' => ['void'], -'WeakMap::valid' => ['bool'], -'Weakref::acquire' => ['bool'], -'Weakref::get' => ['object'], -'Weakref::release' => ['bool'], -'Weakref::valid' => ['bool'], -'webObj::convertToString' => ['string'], -'webObj::free' => ['void'], -'webObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], -'webObj::updateFromString' => ['int', 'snippet'=>'string'], -'win32_continue_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], -'win32_create_service' => ['int|false', 'details'=>'array', 'machine='=>'string'], -'win32_delete_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], -'win32_get_last_control_message' => ['int'], -'win32_pause_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], -'win32_ps_list_procs' => ['array'], -'win32_ps_stat_mem' => ['array'], -'win32_ps_stat_proc' => ['array', 'pid='=>'int'], -'win32_query_service_status' => ['array|false|int', 'servicename'=>'string', 'machine='=>'string'], -'win32_send_custom_control' => ['int', 'servicename'=>'string', 'control'=>'int', 'machine='=>'string'], -'win32_set_service_exit_code' => ['int', 'exitCode='=>'int'], -'win32_set_service_exit_mode' => ['bool', 'gracefulMode='=>'bool'], -'win32_set_service_status' => ['bool|int', 'status'=>'int', 'checkpoint='=>'int'], -'win32_start_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], -'win32_start_service_ctrl_dispatcher' => ['bool|int', 'name'=>'string'], -'win32_stop_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], -'wincache_fcache_fileinfo' => ['array|false', 'summaryonly='=>'bool'], -'wincache_fcache_meminfo' => ['array|false'], -'wincache_lock' => ['bool', 'key'=>'string', 'isglobal='=>'bool'], -'wincache_ocache_fileinfo' => ['array|false', 'summaryonly='=>'bool'], -'wincache_ocache_meminfo' => ['array|false'], -'wincache_refresh_if_changed' => ['bool', 'files='=>'array'], -'wincache_rplist_fileinfo' => ['array|false', 'summaryonly='=>'bool'], -'wincache_rplist_meminfo' => ['array|false'], -'wincache_scache_info' => ['array|false', 'summaryonly='=>'bool'], -'wincache_scache_meminfo' => ['array|false'], -'wincache_ucache_add' => ['bool', 'key'=>'string', 'value'=>'mixed', 'ttl='=>'int'], -'wincache_ucache_add\'1' => ['bool', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], -'wincache_ucache_cas' => ['bool', 'key'=>'string', 'old_value'=>'int', 'new_value'=>'int'], -'wincache_ucache_clear' => ['bool'], -'wincache_ucache_dec' => ['int|false', 'key'=>'string', 'dec_by='=>'int', 'success='=>'bool'], -'wincache_ucache_delete' => ['bool', 'key'=>'mixed'], -'wincache_ucache_exists' => ['bool', 'key'=>'string'], -'wincache_ucache_get' => ['mixed', 'key'=>'mixed', '&w_success='=>'bool'], -'wincache_ucache_inc' => ['int|false', 'key'=>'string', 'inc_by='=>'int', 'success='=>'bool'], -'wincache_ucache_info' => ['array|false', 'summaryonly='=>'bool', 'key='=>'string'], -'wincache_ucache_meminfo' => ['array|false'], -'wincache_ucache_set' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int'], -'wincache_ucache_set\'1' => ['bool', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], -'wincache_unlock' => ['bool', 'key'=>'string'], -'wkhtmltox\image\converter::convert' => ['?string'], -'wkhtmltox\image\converter::getVersion' => ['string'], -'wkhtmltox\pdf\converter::add' => ['void', 'object'=>'wkhtmltox\PDF\Object'], -'wkhtmltox\pdf\converter::convert' => ['?string'], -'wkhtmltox\pdf\converter::getVersion' => ['string'], -'wordwrap' => ['string', 'string'=>'string', 'width='=>'int', 'break='=>'string', 'cut_long_words='=>'bool'], -'Worker::__construct' => ['void'], -'Worker::addRef' => ['void'], -'Worker::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], -'Worker::collect' => ['int', 'collector='=>'Callable'], -'Worker::count' => ['int'], -'Worker::delRef' => ['void'], -'Worker::detach' => ['void'], -'Worker::extend' => ['bool', 'class'=>'string'], -'Worker::getCreatorId' => ['int'], -'Worker::getCurrentThread' => ['Thread'], -'Worker::getCurrentThreadId' => ['int'], -'Worker::getRefCount' => ['int'], -'Worker::getStacked' => ['int'], -'Worker::getTerminationInfo' => ['array'], -'Worker::getThreadId' => ['int'], -'Worker::globally' => ['mixed'], -'Worker::isGarbage' => ['bool'], -'Worker::isJoined' => ['bool'], -'Worker::isRunning' => ['bool'], -'Worker::isShutdown' => ['bool'], -'Worker::isStarted' => ['bool'], -'Worker::isTerminated' => ['bool'], -'Worker::isWaiting' => ['bool'], -'Worker::isWorking' => ['bool'], -'Worker::join' => ['bool'], -'Worker::kill' => ['bool'], -'Worker::lock' => ['bool'], -'Worker::merge' => ['bool', 'from'=>'', 'overwrite='=>'mixed'], -'Worker::notify' => ['bool'], -'Worker::notifyOne' => ['bool'], -'Worker::offsetExists' => ['bool', 'offset'=>'mixed'], -'Worker::offsetGet' => ['mixed', 'offset'=>'mixed'], -'Worker::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], -'Worker::offsetUnset' => ['void', 'offset'=>'mixed'], -'Worker::pop' => ['bool'], -'Worker::run' => ['void'], -'Worker::setGarbage' => ['void'], -'Worker::shift' => ['bool'], -'Worker::shutdown' => ['bool'], -'Worker::stack' => ['int', '&rw_work'=>'Threaded'], -'Worker::start' => ['bool', 'options='=>'int'], -'Worker::synchronized' => ['mixed', 'block'=>'Closure', '_='=>'mixed'], -'Worker::unlock' => ['bool'], -'Worker::unstack' => ['int', '&rw_work='=>'Threaded'], -'Worker::wait' => ['bool', 'timeout='=>'int'], -'xattr_get' => ['string', 'filename'=>'string', 'name'=>'string', 'flags='=>'int'], -'xattr_list' => ['array', 'filename'=>'string', 'flags='=>'int'], -'xattr_remove' => ['bool', 'filename'=>'string', 'name'=>'string', 'flags='=>'int'], -'xattr_set' => ['bool', 'filename'=>'string', 'name'=>'string', 'value'=>'string', 'flags='=>'int'], -'xattr_supported' => ['bool', 'filename'=>'string', 'flags='=>'int'], -'xcache_asm' => ['string', 'filename'=>'string'], -'xcache_clear_cache' => ['void', 'type'=>'int', 'id='=>'int'], -'xcache_coredump' => ['string', 'op_type'=>'int'], -'xcache_count' => ['int', 'type'=>'int'], -'xcache_coverager_decode' => ['array', 'data'=>'string'], -'xcache_coverager_get' => ['array', 'clean='=>'bool'], -'xcache_coverager_start' => ['void', 'clean='=>'bool'], -'xcache_coverager_stop' => ['void', 'clean='=>'bool'], -'xcache_dasm_file' => ['string', 'filename'=>'string'], -'xcache_dasm_string' => ['string', 'code'=>'string'], -'xcache_dec' => ['int', 'name'=>'string', 'value='=>'int|mixed', 'ttl='=>'int'], -'xcache_decode' => ['bool', 'filename'=>'string'], -'xcache_encode' => ['string', 'filename'=>'string'], -'xcache_get' => ['mixed', 'name'=>'string'], -'xcache_get_data_type' => ['string', 'type'=>'int'], -'xcache_get_op_spec' => ['string', 'op_type'=>'int'], -'xcache_get_op_type' => ['string', 'op_type'=>'int'], -'xcache_get_opcode' => ['string', 'opcode'=>'int'], -'xcache_get_opcode_spec' => ['string', 'opcode'=>'int'], -'xcache_inc' => ['int', 'name'=>'string', 'value='=>'int|mixed', 'ttl='=>'int'], -'xcache_info' => ['array', 'type'=>'int', 'id'=>'int'], -'xcache_is_autoglobal' => ['string', 'name'=>'string'], -'xcache_isset' => ['bool', 'name'=>'string'], -'xcache_list' => ['array', 'type'=>'int', 'id'=>'int'], -'xcache_set' => ['bool', 'name'=>'string', 'value'=>'mixed', 'ttl='=>'int'], -'xcache_unset' => ['bool', 'name'=>'string'], -'xcache_unset_by_prefix' => ['bool', 'prefix'=>'string'], -'Xcom::__construct' => ['void', 'fabric_url='=>'string', 'fabric_token='=>'string', 'capability_token='=>'string'], -'Xcom::decode' => ['object', 'avro_msg'=>'string', 'json_schema'=>'string'], -'Xcom::encode' => ['string', 'data'=>'stdClass', 'avro_schema'=>'string'], -'Xcom::getDebugOutput' => ['string'], -'Xcom::getLastResponse' => ['string'], -'Xcom::getLastResponseInfo' => ['array'], -'Xcom::getOnboardingURL' => ['string', 'capability_name'=>'string', 'agreement_url'=>'string'], -'Xcom::send' => ['int', 'topic'=>'string', 'data'=>'mixed', 'json_schema='=>'string', 'http_headers='=>'array'], -'Xcom::sendAsync' => ['int', 'topic'=>'string', 'data'=>'mixed', 'json_schema='=>'string', 'http_headers='=>'array'], -'xdebug_break' => ['bool'], -'xdebug_call_class' => ['string', 'depth='=>'int'], -'xdebug_call_file' => ['string', 'depth='=>'int'], -'xdebug_call_function' => ['string', 'depth='=>'int'], -'xdebug_call_line' => ['int', 'depth='=>'int'], -'xdebug_clear_aggr_profiling_data' => ['bool'], -'xdebug_code_coverage_started' => ['bool'], -'xdebug_debug_zval' => ['void', '...varName'=>'string'], -'xdebug_debug_zval_stdout' => ['void', '...varName'=>'string'], -'xdebug_disable' => ['void'], -'xdebug_dump_aggr_profiling_data' => ['bool'], -'xdebug_dump_superglobals' => ['void'], -'xdebug_enable' => ['void'], -'xdebug_get_code_coverage' => ['array'], -'xdebug_get_collected_errors' => ['string', 'clean='=>'bool'], -'xdebug_get_declared_vars' => ['array'], -'xdebug_get_formatted_function_stack' => [''], -'xdebug_get_function_count' => ['int'], -'xdebug_get_function_stack' => ['array', 'message='=>'string', 'options='=>'int'], -'xdebug_get_headers' => ['array'], -'xdebug_get_monitored_functions' => ['array'], -'xdebug_get_profiler_filename' => ['string|false'], -'xdebug_get_stack_depth' => ['int'], -'xdebug_get_tracefile_name' => ['string'], -'xdebug_is_debugger_active' => ['bool'], -'xdebug_is_enabled' => ['bool'], -'xdebug_memory_usage' => ['int'], -'xdebug_peak_memory_usage' => ['int'], -'xdebug_print_function_stack' => ['array', 'message='=>'string', 'options='=>'int'], -'xdebug_set_filter' => ['void', 'group'=>'int', 'list_type'=>'int', 'configuration'=>'array'], -'xdebug_start_code_coverage' => ['void', 'options='=>'int'], -'xdebug_start_error_collection' => ['void'], -'xdebug_start_function_monitor' => ['void', 'list_of_functions_to_monitor'=>'string[]'], -'xdebug_start_trace' => ['void', 'trace_file'=>'', 'options='=>'int|mixed'], -'xdebug_stop_code_coverage' => ['void', 'cleanup='=>'bool'], -'xdebug_stop_error_collection' => ['void'], -'xdebug_stop_function_monitor' => ['void'], -'xdebug_stop_trace' => ['void'], -'xdebug_time_index' => ['float'], -'xdebug_var_dump' => ['void', '...var'=>''], -'xdiff_file_bdiff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], -'xdiff_file_bdiff_size' => ['int', 'file'=>'string'], -'xdiff_file_bpatch' => ['bool', 'file'=>'string', 'patch'=>'string', 'dest'=>'string'], -'xdiff_file_diff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string', 'context='=>'int', 'minimal='=>'bool'], -'xdiff_file_diff_binary' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], -'xdiff_file_merge3' => ['mixed', 'old_file'=>'string', 'new_file1'=>'string', 'new_file2'=>'string', 'dest'=>'string'], -'xdiff_file_patch' => ['mixed', 'file'=>'string', 'patch'=>'string', 'dest'=>'string', 'flags='=>'int'], -'xdiff_file_patch_binary' => ['bool', 'file'=>'string', 'patch'=>'string', 'dest'=>'string'], -'xdiff_file_rabdiff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], -'xdiff_string_bdiff' => ['string', 'old_data'=>'string', 'new_data'=>'string'], -'xdiff_string_bdiff_size' => ['int', 'patch'=>'string'], -'xdiff_string_bpatch' => ['string', 'string'=>'string', 'patch'=>'string'], -'xdiff_string_diff' => ['string', 'old_data'=>'string', 'new_data'=>'string', 'context='=>'int', 'minimal='=>'bool'], -'xdiff_string_diff_binary' => ['string', 'old_data'=>'string', 'new_data'=>'string'], -'xdiff_string_merge3' => ['mixed', 'old_data'=>'string', 'new_data1'=>'string', 'new_data2'=>'string', 'error='=>'string'], -'xdiff_string_patch' => ['string', 'string'=>'string', 'patch'=>'string', 'flags='=>'int', '&w_error='=>'string'], -'xdiff_string_patch_binary' => ['string', 'string'=>'string', 'patch'=>'string'], -'xdiff_string_rabdiff' => ['string', 'old_data'=>'string', 'new_data'=>'string'], -'xhprof_disable' => ['array'], -'xhprof_enable' => ['void', 'flags='=>'int', 'options='=>'array'], -'xhprof_sample_disable' => ['array'], -'xhprof_sample_enable' => ['void'], -'xlswriter_get_author' => ['string'], -'xlswriter_get_version' => ['string'], -'xml_error_string' => ['?string', 'error_code'=>'int'], -'xml_get_current_byte_index' => ['int|false', 'parser'=>'XMLParser'], -'xml_get_current_column_number' => ['int|false', 'parser'=>'XMLParser'], -'xml_get_current_line_number' => ['int|false', 'parser'=>'XMLParser'], -'xml_get_error_code' => ['int|false', 'parser'=>'XMLParser'], -'xml_parse' => ['int', 'parser'=>'XMLParser', 'data'=>'string', 'is_final='=>'bool'], -'xml_parse_into_struct' => ['int', 'parser'=>'XMLParser', 'data'=>'string', '&w_values'=>'array', '&w_index='=>'array'], -'xml_parser_create' => ['XMLParser', 'encoding='=>'string'], -'xml_parser_create_ns' => ['XMLParser', 'encoding='=>'string', 'separator='=>'string'], -'xml_parser_free' => ['bool', 'parser'=>'XMLParser'], -'xml_parser_get_option' => ['mixed|false', 'parser'=>'XMLParser', 'option'=>'int'], -'xml_parser_set_option' => ['bool', 'parser'=>'XMLParser', 'option'=>'int', 'value'=>'mixed'], -'xml_set_character_data_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], -'xml_set_default_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], -'xml_set_element_handler' => ['bool', 'parser'=>'XMLParser', 'start_handler'=>'callable', 'end_handler'=>'callable'], -'xml_set_end_namespace_decl_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], -'xml_set_external_entity_ref_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], -'xml_set_notation_decl_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], -'xml_set_object' => ['bool', 'parser'=>'XMLParser', 'object'=>'object'], -'xml_set_processing_instruction_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], -'xml_set_start_namespace_decl_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], -'xml_set_unparsed_entity_decl_handler' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], -'XMLDiff\Base::__construct' => ['void', 'nsname'=>'string'], -'XMLDiff\Base::diff' => ['mixed', 'from'=>'mixed', 'to'=>'mixed'], -'XMLDiff\Base::merge' => ['mixed', 'src'=>'mixed', 'diff'=>'mixed'], -'XMLDiff\DOM::diff' => ['DOMDocument', 'from'=>'DOMDocument', 'to'=>'DOMDocument'], -'XMLDiff\DOM::merge' => ['DOMDocument', 'src'=>'DOMDocument', 'diff'=>'DOMDocument'], -'XMLDiff\File::diff' => ['string', 'from'=>'string', 'to'=>'string'], -'XMLDiff\File::merge' => ['string', 'src'=>'string', 'diff'=>'string'], -'XMLDiff\Memory::diff' => ['string', 'from'=>'string', 'to'=>'string'], -'XMLDiff\Memory::merge' => ['string', 'src'=>'string', 'diff'=>'string'], -'XMLReader::close' => ['bool'], -'XMLReader::expand' => ['DOMNode|false', 'basenode='=>'DOMNode'], -'XMLReader::getAttribute' => ['?string', 'name'=>'string'], -'XMLReader::getAttributeNo' => ['?string', 'index'=>'int'], -'XMLReader::getAttributeNs' => ['?string', 'name'=>'string', 'namespaceuri'=>'string'], -'XMLReader::getParserProperty' => ['bool', 'property'=>'int'], -'XMLReader::isValid' => ['bool'], -'XMLReader::lookupNamespace' => ['?string', 'prefix'=>'string'], -'XMLReader::moveToAttribute' => ['bool', 'name'=>'string'], -'XMLReader::moveToAttributeNo' => ['bool', 'index'=>'int'], -'XMLReader::moveToAttributeNs' => ['bool', 'localname'=>'string', 'namespaceuri'=>'string'], -'XMLReader::moveToElement' => ['bool'], -'XMLReader::moveToFirstAttribute' => ['bool'], -'XMLReader::moveToNextAttribute' => ['bool'], -'XMLReader::next' => ['bool', 'localname='=>'string'], -'XMLReader::open' => ['bool', 'uri'=>'string', 'encoding='=>'?string', 'options='=>'int'], -'XMLReader::read' => ['bool'], -'XMLReader::readInnerXML' => ['string'], -'XMLReader::readOuterXML' => ['string'], -'XMLReader::readString' => ['string'], -'XMLReader::setParserProperty' => ['bool', 'property'=>'int', 'value'=>'bool'], -'XMLReader::setRelaxNGSchema' => ['bool', 'filename'=>'string'], -'XMLReader::setRelaxNGSchemaSource' => ['bool', 'source'=>'string'], -'XMLReader::setSchema' => ['bool', 'filename'=>'string'], -'XMLReader::XML' => ['bool', 'source'=>'string', 'encoding='=>'?string', 'options='=>'int'], -'xmlrpc_decode' => ['mixed', 'xml'=>'string', 'encoding='=>'string'], -'xmlrpc_decode_request' => ['?array', 'xml'=>'string', '&w_method'=>'string', 'encoding='=>'string'], -'xmlrpc_encode' => ['string', 'value'=>'mixed'], -'xmlrpc_encode_request' => ['string', 'method'=>'string', 'params'=>'mixed', 'output_options='=>'array'], -'xmlrpc_get_type' => ['string', 'value'=>'mixed'], -'xmlrpc_is_fault' => ['bool', 'arg'=>'array'], -'xmlrpc_parse_method_descriptions' => ['array', 'xml'=>'string'], -'xmlrpc_server_add_introspection_data' => ['int', 'server'=>'resource', 'desc'=>'array'], -'xmlrpc_server_call_method' => ['string', 'server'=>'resource', 'xml'=>'string', 'user_data'=>'mixed', 'output_options='=>'array'], -'xmlrpc_server_create' => ['resource'], -'xmlrpc_server_destroy' => ['int', 'server'=>'resource'], -'xmlrpc_server_register_introspection_callback' => ['bool', 'server'=>'resource', 'function'=>'string'], -'xmlrpc_server_register_method' => ['bool', 'server'=>'resource', 'method_name'=>'string', 'function'=>'string'], -'xmlrpc_set_type' => ['bool', '&rw_value'=>'string|DateTime', 'type'=>'string'], -'XMLWriter::endAttribute' => ['bool'], -'XMLWriter::endCdata' => ['bool'], -'XMLWriter::endComment' => ['bool'], -'XMLWriter::endDocument' => ['bool'], -'XMLWriter::endDtd' => ['bool'], -'XMLWriter::endDtdAttlist' => ['bool'], -'XMLWriter::endDtdElement' => ['bool'], -'XMLWriter::endDtdEntity' => ['bool'], -'XMLWriter::endElement' => ['bool'], -'XMLWriter::endPi' => ['bool'], -'XMLWriter::flush' => ['string|int', 'empty='=>'bool'], -'XMLWriter::fullEndElement' => ['bool'], -'XMLWriter::openMemory' => ['bool'], -'XMLWriter::openUri' => ['bool', 'uri'=>'string'], -'XMLWriter::outputMemory' => ['string', 'flush='=>'bool'], -'XMLWriter::setIndent' => ['bool', 'enable'=>'bool'], -'XMLWriter::setIndentString' => ['bool', 'indentation'=>'string'], -'XMLWriter::startAttribute' => ['bool', 'name'=>'string'], -'XMLWriter::startAttributeNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], -'XMLWriter::startCdata' => ['bool'], -'XMLWriter::startComment' => ['bool'], -'XMLWriter::startDocument' => ['bool', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], -'XMLWriter::startDtd' => ['bool', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], -'XMLWriter::startDtdAttlist' => ['bool', 'name'=>'string'], -'XMLWriter::startDtdElement' => ['bool', 'qualifiedName'=>'string'], -'XMLWriter::startDtdEntity' => ['bool', 'name'=>'string', 'isParam'=>'bool'], -'XMLWriter::startElement' => ['bool', 'name'=>'string'], -'XMLWriter::startElementNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], -'XMLWriter::startPi' => ['bool', 'target'=>'string'], -'XMLWriter::text' => ['bool', 'content'=>'string'], -'XMLWriter::writeAttribute' => ['bool', 'name'=>'string', 'value'=>'string'], -'XMLWriter::writeAttributeNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], -'XMLWriter::writeCdata' => ['bool', 'content'=>'string'], -'XMLWriter::writeComment' => ['bool', 'content'=>'string'], -'XMLWriter::writeDtd' => ['bool', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], -'XMLWriter::writeDtdAttlist' => ['bool', 'name'=>'string', 'content'=>'string'], -'XMLWriter::writeDtdElement' => ['bool', 'name'=>'string', 'content'=>'string'], -'XMLWriter::writeDtdEntity' => ['bool', 'name'=>'string', 'content'=>'string', 'isParam='=>'bool', 'publicId='=>'?string', 'systemId='=>'?string', 'notationData='=>'?string'], -'XMLWriter::writeElement' => ['bool', 'name'=>'string', 'content='=>'?string'], -'XMLWriter::writeElementNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'content='=>'?string'], -'XMLWriter::writePi' => ['bool', 'target'=>'string', 'content'=>'string'], -'XMLWriter::writeRaw' => ['bool', 'content'=>'string'], -'xmlwriter_end_attribute' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_end_cdata' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_end_comment' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_end_document' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_end_dtd' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_end_dtd_attlist' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_end_dtd_element' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_end_dtd_entity' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_end_element' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_end_pi' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_flush' => ['string|int', 'writer'=>'XMLWriter', 'empty='=>'bool'], -'xmlwriter_full_end_element' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_open_memory' => ['XMLWriter|false'], -'xmlwriter_open_uri' => ['XMLWriter|false', 'uri'=>'string'], -'xmlwriter_output_memory' => ['string', 'writer'=>'XMLWriter', 'flush='=>'bool'], -'xmlwriter_set_indent' => ['bool', 'writer'=>'XMLWriter', 'enable'=>'bool'], -'xmlwriter_set_indent_string' => ['bool', 'writer'=>'XMLWriter', 'indentation'=>'string'], -'xmlwriter_start_attribute' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], -'xmlwriter_start_attribute_ns' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], -'xmlwriter_start_cdata' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_start_comment' => ['bool', 'writer'=>'XMLWriter'], -'xmlwriter_start_document' => ['bool', 'writer'=>'XMLWriter', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], -'xmlwriter_start_dtd' => ['bool', 'writer'=>'XMLWriter', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], -'xmlwriter_start_dtd_attlist' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], -'xmlwriter_start_dtd_element' => ['bool', 'writer'=>'XMLWriter', 'qualifiedName'=>'string'], -'xmlwriter_start_dtd_entity' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'isParam'=>'bool'], -'xmlwriter_start_element' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], -'xmlwriter_start_element_ns' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], -'xmlwriter_start_pi' => ['bool', 'writer'=>'XMLWriter', 'target'=>'string'], -'xmlwriter_text' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], -'xmlwriter_write_attribute' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'value'=>'string'], -'xmlwriter_write_attribute_ns' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], -'xmlwriter_write_cdata' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], -'xmlwriter_write_comment' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], -'xmlwriter_write_dtd' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], -'xmlwriter_write_dtd_attlist' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string'], -'xmlwriter_write_dtd_element' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string'], -'xmlwriter_write_dtd_entity' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string', 'isParam='=>'bool', 'publicId='=>'?string', 'systemId='=>'?string', 'notationData='=>'?string'], -'xmlwriter_write_element' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content='=>'?string'], -'xmlwriter_write_element_ns' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'content='=>'?string'], -'xmlwriter_write_pi' => ['bool', 'writer'=>'XMLWriter', 'target'=>'string', 'content'=>'string'], -'xmlwriter_write_raw' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], -'xpath_new_context' => ['XPathContext', 'dom_document'=>'DOMDocument'], -'xpath_register_ns' => ['bool', 'xpath_context'=>'xpathcontext', 'prefix'=>'string', 'uri'=>'string'], -'xpath_register_ns_auto' => ['bool', 'xpath_context'=>'xpathcontext', 'context_node='=>'object'], -'xptr_new_context' => ['XPathContext'], -'xsl_xsltprocessor_get_parameter' => ['string', 'namespace'=>'string', 'name'=>'string'], -'xsl_xsltprocessor_get_security_prefs' => ['int'], -'xsl_xsltprocessor_has_exslt_support' => ['bool'], -'xsl_xsltprocessor_register_php_functions' => ['', 'restrict'=>''], -'xsl_xsltprocessor_remove_parameter' => ['bool', 'namespace'=>'string', 'name'=>'string'], -'xsl_xsltprocessor_set_parameter' => ['bool', 'namespace'=>'string', 'name'=>'', 'value'=>'string'], -'xsl_xsltprocessor_set_profiling' => ['bool', 'filename'=>'string'], -'xsl_xsltprocessor_set_security_prefs' => ['int', 'securityprefs'=>'int'], -'xsl_xsltprocessor_transform_to_uri' => ['int', 'doc'=>'DOMDocument', 'uri'=>'string'], -'xsl_xsltprocessor_transform_to_xml' => ['string', 'doc'=>'DOMDocument'], -'xslt_backend_info' => ['string'], -'xslt_backend_name' => ['string'], -'xslt_backend_version' => ['string'], -'xslt_create' => ['resource'], -'xslt_errno' => ['int', 'xh'=>''], -'xslt_error' => ['string', 'xh'=>''], -'xslt_free' => ['', 'xh'=>''], -'xslt_getopt' => ['int', 'processor'=>''], -'xslt_process' => ['', 'xh'=>'', 'xmlcontainer'=>'string', 'xslcontainer'=>'string', 'resultcontainer='=>'string', 'arguments='=>'array', 'parameters='=>'array'], -'xslt_set_base' => ['', 'xh'=>'', 'uri'=>'string'], -'xslt_set_encoding' => ['', 'xh'=>'', 'encoding'=>'string'], -'xslt_set_error_handler' => ['', 'xh'=>'', 'handler'=>''], -'xslt_set_log' => ['', 'xh'=>'', 'log='=>''], -'xslt_set_object' => ['bool', 'processor'=>'', 'object'=>'object'], -'xslt_set_sax_handler' => ['', 'xh'=>'', 'handlers'=>'array'], -'xslt_set_sax_handlers' => ['', 'processor'=>'', 'handlers'=>'array'], -'xslt_set_scheme_handler' => ['', 'xh'=>'', 'handlers'=>'array'], -'xslt_set_scheme_handlers' => ['', 'xh'=>'', 'handlers'=>'array'], -'xslt_setopt' => ['', 'processor'=>'', 'newmask'=>'int'], -'XSLTProcessor::getParameter' => ['string|false', 'namespace'=>'string', 'name'=>'string'], -'XsltProcessor::getSecurityPrefs' => ['int'], -'XSLTProcessor::hasExsltSupport' => ['bool'], -'XSLTProcessor::importStylesheet' => ['bool', 'stylesheet'=>'object'], -'XSLTProcessor::registerPHPFunctions' => ['void', 'functions='=>'mixed'], -'XSLTProcessor::removeParameter' => ['bool', 'namespace'=>'string', 'name'=>'string'], -'XSLTProcessor::setParameter' => ['bool', 'namespace'=>'string', 'name'=>'string', 'value'=>'string'], -'XSLTProcessor::setParameter\'1' => ['bool', 'namespace'=>'string', 'options'=>'array'], -'XSLTProcessor::setProfiling' => ['bool', 'filename'=>'string'], -'XsltProcessor::setSecurityPrefs' => ['int', 'preferences'=>'int'], -'XSLTProcessor::transformToDoc' => ['DOMDocument|false', 'document'=>'DOMNode'], -'XSLTProcessor::transformToURI' => ['int', 'document'=>'DOMDocument', 'uri'=>'string'], -'XSLTProcessor::transformToXML' => ['string|false', 'document'=>'DOMDocument'], -'yac::__construct' => ['void', 'prefix='=>'string'], -'yac::__get' => ['mixed', 'key'=>'string'], -'yac::__set' => ['mixed', 'key'=>'string', 'value'=>'mixed'], -'yac::delete' => ['bool', 'keys'=>'string|array', 'ttl='=>'int'], -'yac::dump' => ['mixed', 'num'=>'int'], -'yac::flush' => ['bool'], -'yac::get' => ['mixed', 'key'=>'string|array', 'cas='=>'int'], -'yac::info' => ['array'], -'Yaconf::get' => ['mixed', 'name'=>'string', 'default_value='=>'mixed'], -'Yaconf::has' => ['bool', 'name'=>'string'], -'Yaf\Action_Abstract::__clone' => ['void'], -'Yaf\Action_Abstract::__construct' => ['void', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract', 'view'=>'Yaf\View_Interface', 'invokeArgs='=>'?array'], -'Yaf\Action_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], -'Yaf\Action_Abstract::execute' => ['mixed'], -'Yaf\Action_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], -'Yaf\Action_Abstract::getController' => ['Yaf\Controller_Abstract'], -'Yaf\Action_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], -'Yaf\Action_Abstract::getInvokeArgs' => ['array'], -'Yaf\Action_Abstract::getModuleName' => ['string'], -'Yaf\Action_Abstract::getRequest' => ['Yaf\Request_Abstract'], -'Yaf\Action_Abstract::getResponse' => ['Yaf\Response_Abstract'], -'Yaf\Action_Abstract::getView' => ['Yaf\View_Interface'], -'Yaf\Action_Abstract::getViewpath' => ['string'], -'Yaf\Action_Abstract::init' => [''], -'Yaf\Action_Abstract::initView' => ['Yaf\Response_Abstract', 'options='=>'?array'], -'Yaf\Action_Abstract::redirect' => ['bool', 'url'=>'string'], -'Yaf\Action_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], -'Yaf\Action_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], -'Yaf\Application::__clone' => ['void'], -'Yaf\Application::__construct' => ['void', 'config'=>'array|string', 'envrion='=>'string'], -'Yaf\Application::__destruct' => ['void'], -'Yaf\Application::__sleep' => ['string[]'], -'Yaf\Application::__wakeup' => ['void'], -'Yaf\Application::app' => ['?Yaf\Application'], -'Yaf\Application::bootstrap' => ['Yaf\Application', 'bootstrap='=>'?Yaf\Bootstrap_Abstract'], -'Yaf\Application::clearLastError' => ['void'], -'Yaf\Application::environ' => ['string'], -'Yaf\Application::execute' => ['void', 'entry'=>'callable', '_='=>'string'], -'Yaf\Application::getAppDirectory' => ['string'], -'Yaf\Application::getConfig' => ['Yaf\Config_Abstract'], -'Yaf\Application::getDispatcher' => ['Yaf\Dispatcher'], -'Yaf\Application::getLastErrorMsg' => ['string'], -'Yaf\Application::getLastErrorNo' => ['int'], -'Yaf\Application::getModules' => ['array'], -'Yaf\Application::run' => ['void'], -'Yaf\Application::setAppDirectory' => ['Yaf\Application', 'directory'=>'string'], -'Yaf\Config\Ini::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], -'Yaf\Config\Ini::__get' => ['', 'name='=>'mixed'], -'Yaf\Config\Ini::__isset' => ['', 'name'=>'string'], -'Yaf\Config\Ini::__set' => ['void', 'name'=>'', 'value'=>''], -'Yaf\Config\Ini::count' => ['int'], -'Yaf\Config\Ini::current' => ['mixed'], -'Yaf\Config\Ini::get' => ['mixed', 'name='=>'mixed'], -'Yaf\Config\Ini::key' => ['int|string'], -'Yaf\Config\Ini::next' => ['void'], -'Yaf\Config\Ini::offsetExists' => ['bool', 'name'=>'mixed'], -'Yaf\Config\Ini::offsetGet' => ['mixed', 'name'=>'mixed'], -'Yaf\Config\Ini::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], -'Yaf\Config\Ini::offsetUnset' => ['void', 'name'=>'mixed'], -'Yaf\Config\Ini::readonly' => ['bool'], -'Yaf\Config\Ini::rewind' => ['void'], -'Yaf\Config\Ini::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], -'Yaf\Config\Ini::toArray' => ['array'], -'Yaf\Config\Ini::valid' => ['bool'], -'Yaf\Config\Simple::__construct' => ['void', 'array'=>'array', 'readonly='=>'string'], -'Yaf\Config\Simple::__get' => ['', 'name='=>'mixed'], -'Yaf\Config\Simple::__isset' => ['', 'name'=>'string'], -'Yaf\Config\Simple::__set' => ['void', 'name'=>'', 'value'=>''], -'Yaf\Config\Simple::count' => ['int'], -'Yaf\Config\Simple::current' => ['mixed'], -'Yaf\Config\Simple::get' => ['mixed', 'name='=>'mixed'], -'Yaf\Config\Simple::key' => ['int|string'], -'Yaf\Config\Simple::next' => ['void'], -'Yaf\Config\Simple::offsetExists' => ['bool', 'name'=>'mixed'], -'Yaf\Config\Simple::offsetGet' => ['mixed', 'name'=>'mixed'], -'Yaf\Config\Simple::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], -'Yaf\Config\Simple::offsetUnset' => ['void', 'name'=>'mixed'], -'Yaf\Config\Simple::readonly' => ['bool'], -'Yaf\Config\Simple::rewind' => ['void'], -'Yaf\Config\Simple::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], -'Yaf\Config\Simple::toArray' => ['array'], -'Yaf\Config\Simple::valid' => ['bool'], -'Yaf\Config_Abstract::__construct' => ['void'], -'Yaf\Config_Abstract::get' => ['mixed', 'name='=>'string'], -'Yaf\Config_Abstract::readonly' => ['bool'], -'Yaf\Config_Abstract::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], -'Yaf\Config_Abstract::toArray' => ['array'], -'Yaf\Controller_Abstract::__clone' => ['void'], -'Yaf\Controller_Abstract::__construct' => ['void', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract', 'view'=>'Yaf\View_Interface', 'invokeArgs='=>'?array'], -'Yaf\Controller_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], -'Yaf\Controller_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], -'Yaf\Controller_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], -'Yaf\Controller_Abstract::getInvokeArgs' => ['array'], -'Yaf\Controller_Abstract::getModuleName' => ['string'], -'Yaf\Controller_Abstract::getRequest' => ['Yaf\Request_Abstract'], -'Yaf\Controller_Abstract::getResponse' => ['Yaf\Response_Abstract'], -'Yaf\Controller_Abstract::getView' => ['Yaf\View_Interface'], -'Yaf\Controller_Abstract::getViewpath' => ['string'], -'Yaf\Controller_Abstract::init' => [''], -'Yaf\Controller_Abstract::initView' => ['Yaf\Response_Abstract', 'options='=>'?array'], -'Yaf\Controller_Abstract::redirect' => ['bool', 'url'=>'string'], -'Yaf\Controller_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], -'Yaf\Controller_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], -'Yaf\Dispatcher::__clone' => ['void'], -'Yaf\Dispatcher::__construct' => ['void'], -'Yaf\Dispatcher::__sleep' => ['list'], -'Yaf\Dispatcher::__wakeup' => ['void'], -'Yaf\Dispatcher::autoRender' => ['Yaf\Dispatcher', 'flag='=>'bool'], -'Yaf\Dispatcher::catchException' => ['Yaf\Dispatcher', 'flag='=>'bool'], -'Yaf\Dispatcher::disableView' => ['bool'], -'Yaf\Dispatcher::dispatch' => ['Yaf\Response_Abstract', 'request'=>'Yaf\Request_Abstract'], -'Yaf\Dispatcher::enableView' => ['Yaf\Dispatcher'], -'Yaf\Dispatcher::flushInstantly' => ['Yaf\Dispatcher', 'flag='=>'bool'], -'Yaf\Dispatcher::getApplication' => ['Yaf\Application'], -'Yaf\Dispatcher::getInstance' => ['Yaf\Dispatcher'], -'Yaf\Dispatcher::getRequest' => ['Yaf\Request_Abstract'], -'Yaf\Dispatcher::getRouter' => ['Yaf\Router'], -'Yaf\Dispatcher::initView' => ['Yaf\View_Interface', 'templates_dir'=>'string', 'options='=>'?array'], -'Yaf\Dispatcher::registerPlugin' => ['Yaf\Dispatcher', 'plugin'=>'Yaf\Plugin_Abstract'], -'Yaf\Dispatcher::returnResponse' => ['Yaf\Dispatcher', 'flag'=>'bool'], -'Yaf\Dispatcher::setDefaultAction' => ['Yaf\Dispatcher', 'action'=>'string'], -'Yaf\Dispatcher::setDefaultController' => ['Yaf\Dispatcher', 'controller'=>'string'], -'Yaf\Dispatcher::setDefaultModule' => ['Yaf\Dispatcher', 'module'=>'string'], -'Yaf\Dispatcher::setErrorHandler' => ['Yaf\Dispatcher', 'callback'=>'callable', 'error_types'=>'int'], -'Yaf\Dispatcher::setRequest' => ['Yaf\Dispatcher', 'request'=>'Yaf\Request_Abstract'], -'Yaf\Dispatcher::setView' => ['Yaf\Dispatcher', 'view'=>'Yaf\View_Interface'], -'Yaf\Dispatcher::throwException' => ['Yaf\Dispatcher', 'flag='=>'bool'], -'Yaf\Loader::__clone' => ['void'], -'Yaf\Loader::__construct' => ['void'], -'Yaf\Loader::__sleep' => ['list'], -'Yaf\Loader::__wakeup' => ['void'], -'Yaf\Loader::autoload' => ['bool', 'class_name'=>'string'], -'Yaf\Loader::clearLocalNamespace' => [''], -'Yaf\Loader::getInstance' => ['Yaf\Loader', 'local_library_path='=>'string', 'global_library_path='=>'string'], -'Yaf\Loader::getLibraryPath' => ['string', 'is_global='=>'bool'], -'Yaf\Loader::getLocalNamespace' => ['string'], -'Yaf\Loader::import' => ['bool', 'file'=>'string'], -'Yaf\Loader::isLocalName' => ['bool', 'class_name'=>'string'], -'Yaf\Loader::registerLocalNamespace' => ['bool', 'name_prefix'=>'string|string[]'], -'Yaf\Loader::setLibraryPath' => ['Yaf\Loader', 'directory'=>'string', 'global='=>'bool'], -'Yaf\Plugin_Abstract::dispatchLoopShutdown' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], -'Yaf\Plugin_Abstract::dispatchLoopStartup' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], -'Yaf\Plugin_Abstract::postDispatch' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], -'Yaf\Plugin_Abstract::preDispatch' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], -'Yaf\Plugin_Abstract::preResponse' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], -'Yaf\Plugin_Abstract::routerShutdown' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], -'Yaf\Plugin_Abstract::routerStartup' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], -'Yaf\Registry::__clone' => ['void'], -'Yaf\Registry::__construct' => ['void'], -'Yaf\Registry::del' => ['bool|void', 'name'=>'string'], -'Yaf\Registry::get' => ['mixed', 'name'=>'string'], -'Yaf\Registry::has' => ['bool', 'name'=>'string'], -'Yaf\Registry::set' => ['bool', 'name'=>'string', 'value'=>'mixed'], -'Yaf\Request\Http::__clone' => ['void'], -'Yaf\Request\Http::__construct' => ['void', 'request_uri'=>'string', 'base_uri'=>'string'], -'Yaf\Request\Http::get' => ['mixed', 'name'=>'string', 'default='=>'string'], -'Yaf\Request\Http::getActionName' => ['string'], -'Yaf\Request\Http::getBaseUri' => ['string'], -'Yaf\Request\Http::getControllerName' => ['string'], -'Yaf\Request\Http::getCookie' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request\Http::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request\Http::getException' => ['Yaf\Exception'], -'Yaf\Request\Http::getFiles' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request\Http::getLanguage' => ['string'], -'Yaf\Request\Http::getMethod' => ['string'], -'Yaf\Request\Http::getModuleName' => ['string'], -'Yaf\Request\Http::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], -'Yaf\Request\Http::getParams' => ['array'], -'Yaf\Request\Http::getPost' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request\Http::getQuery' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request\Http::getRequest' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request\Http::getRequestUri' => ['string'], -'Yaf\Request\Http::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request\Http::isCli' => ['bool'], -'Yaf\Request\Http::isDispatched' => ['bool'], -'Yaf\Request\Http::isGet' => ['bool'], -'Yaf\Request\Http::isHead' => ['bool'], -'Yaf\Request\Http::isOptions' => ['bool'], -'Yaf\Request\Http::isPost' => ['bool'], -'Yaf\Request\Http::isPut' => ['bool'], -'Yaf\Request\Http::isRouted' => ['bool'], -'Yaf\Request\Http::isXmlHttpRequest' => ['bool'], -'Yaf\Request\Http::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], -'Yaf\Request\Http::setBaseUri' => ['bool', 'uri'=>'string'], -'Yaf\Request\Http::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], -'Yaf\Request\Http::setDispatched' => ['bool'], -'Yaf\Request\Http::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], -'Yaf\Request\Http::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], -'Yaf\Request\Http::setRequestUri' => ['', 'uri'=>'string'], -'Yaf\Request\Http::setRouted' => ['Yaf\Request_Abstract|bool'], -'Yaf\Request\Simple::__clone' => ['void'], -'Yaf\Request\Simple::__construct' => ['void', 'method'=>'string', 'controller'=>'string', 'action'=>'string', 'params='=>'string'], -'Yaf\Request\Simple::get' => ['mixed', 'name'=>'string', 'default='=>'string'], -'Yaf\Request\Simple::getActionName' => ['string'], -'Yaf\Request\Simple::getBaseUri' => ['string'], -'Yaf\Request\Simple::getControllerName' => ['string'], -'Yaf\Request\Simple::getCookie' => ['mixed', 'name='=>'string', 'default='=>'string'], -'Yaf\Request\Simple::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request\Simple::getException' => ['Yaf\Exception'], -'Yaf\Request\Simple::getFiles' => ['array', 'name='=>'mixed', 'default='=>'null'], -'Yaf\Request\Simple::getLanguage' => ['string'], -'Yaf\Request\Simple::getMethod' => ['string'], -'Yaf\Request\Simple::getModuleName' => ['string'], -'Yaf\Request\Simple::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], -'Yaf\Request\Simple::getParams' => ['array'], -'Yaf\Request\Simple::getPost' => ['mixed', 'name='=>'string', 'default='=>'string'], -'Yaf\Request\Simple::getQuery' => ['mixed', 'name='=>'string', 'default='=>'string'], -'Yaf\Request\Simple::getRequest' => ['mixed', 'name='=>'string', 'default='=>'string'], -'Yaf\Request\Simple::getRequestUri' => ['string'], -'Yaf\Request\Simple::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request\Simple::isCli' => ['bool'], -'Yaf\Request\Simple::isDispatched' => ['bool'], -'Yaf\Request\Simple::isGet' => ['bool'], -'Yaf\Request\Simple::isHead' => ['bool'], -'Yaf\Request\Simple::isOptions' => ['bool'], -'Yaf\Request\Simple::isPost' => ['bool'], -'Yaf\Request\Simple::isPut' => ['bool'], -'Yaf\Request\Simple::isRouted' => ['bool'], -'Yaf\Request\Simple::isXmlHttpRequest' => ['bool'], -'Yaf\Request\Simple::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], -'Yaf\Request\Simple::setBaseUri' => ['bool', 'uri'=>'string'], -'Yaf\Request\Simple::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], -'Yaf\Request\Simple::setDispatched' => ['bool'], -'Yaf\Request\Simple::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], -'Yaf\Request\Simple::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], -'Yaf\Request\Simple::setRequestUri' => ['', 'uri'=>'string'], -'Yaf\Request\Simple::setRouted' => ['Yaf\Request_Abstract|bool'], -'Yaf\Request_Abstract::getActionName' => ['string'], -'Yaf\Request_Abstract::getBaseUri' => ['string'], -'Yaf\Request_Abstract::getControllerName' => ['string'], -'Yaf\Request_Abstract::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request_Abstract::getException' => ['Yaf\Exception'], -'Yaf\Request_Abstract::getLanguage' => ['string'], -'Yaf\Request_Abstract::getMethod' => ['string'], -'Yaf\Request_Abstract::getModuleName' => ['string'], -'Yaf\Request_Abstract::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], -'Yaf\Request_Abstract::getParams' => ['array'], -'Yaf\Request_Abstract::getRequestUri' => ['string'], -'Yaf\Request_Abstract::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf\Request_Abstract::isCli' => ['bool'], -'Yaf\Request_Abstract::isDispatched' => ['bool'], -'Yaf\Request_Abstract::isGet' => ['bool'], -'Yaf\Request_Abstract::isHead' => ['bool'], -'Yaf\Request_Abstract::isOptions' => ['bool'], -'Yaf\Request_Abstract::isPost' => ['bool'], -'Yaf\Request_Abstract::isPut' => ['bool'], -'Yaf\Request_Abstract::isRouted' => ['bool'], -'Yaf\Request_Abstract::isXmlHttpRequest' => ['bool'], -'Yaf\Request_Abstract::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], -'Yaf\Request_Abstract::setBaseUri' => ['bool', 'uri'=>'string'], -'Yaf\Request_Abstract::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], -'Yaf\Request_Abstract::setDispatched' => ['bool'], -'Yaf\Request_Abstract::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], -'Yaf\Request_Abstract::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], -'Yaf\Request_Abstract::setRequestUri' => ['', 'uri'=>'string'], -'Yaf\Request_Abstract::setRouted' => ['Yaf\Request_Abstract|bool'], -'Yaf\Response\Cli::__clone' => ['void'], -'Yaf\Response\Cli::__construct' => ['void'], -'Yaf\Response\Cli::__destruct' => ['void'], -'Yaf\Response\Cli::__toString' => ['string'], -'Yaf\Response\Cli::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf\Response\Cli::clearBody' => ['bool', 'key='=>'string'], -'Yaf\Response\Cli::getBody' => ['mixed', 'key='=>'?string'], -'Yaf\Response\Cli::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf\Response\Cli::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf\Response\Http::__clone' => ['void'], -'Yaf\Response\Http::__construct' => ['void'], -'Yaf\Response\Http::__destruct' => ['void'], -'Yaf\Response\Http::__toString' => ['string'], -'Yaf\Response\Http::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf\Response\Http::clearBody' => ['bool', 'key='=>'string'], -'Yaf\Response\Http::clearHeaders' => ['Yaf\Response_Abstract|false', 'name='=>'string'], -'Yaf\Response\Http::getBody' => ['mixed', 'key='=>'?string'], -'Yaf\Response\Http::getHeader' => ['mixed', 'name='=>'string'], -'Yaf\Response\Http::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf\Response\Http::response' => ['bool'], -'Yaf\Response\Http::setAllHeaders' => ['bool', 'headers'=>'array'], -'Yaf\Response\Http::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf\Response\Http::setHeader' => ['bool', 'name'=>'string', 'value'=>'string', 'replace='=>'bool', 'response_code='=>'int'], -'Yaf\Response\Http::setRedirect' => ['bool', 'url'=>'string'], -'Yaf\Response_Abstract::__clone' => ['void'], -'Yaf\Response_Abstract::__construct' => ['void'], -'Yaf\Response_Abstract::__destruct' => ['void'], -'Yaf\Response_Abstract::__toString' => ['void'], -'Yaf\Response_Abstract::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf\Response_Abstract::clearBody' => ['bool', 'key='=>'string'], -'Yaf\Response_Abstract::getBody' => ['mixed', 'key='=>'?string'], -'Yaf\Response_Abstract::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf\Response_Abstract::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf\Route\Map::__construct' => ['void', 'controller_prefer='=>'bool', 'delimiter='=>'string'], -'Yaf\Route\Map::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], -'Yaf\Route\Map::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], -'Yaf\Route\Regex::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'map='=>'?array', 'verify='=>'?array', 'reverse='=>'string'], -'Yaf\Route\Regex::addConfig' => ['Yaf\Router|bool', 'config'=>'Yaf\Config_Abstract'], -'Yaf\Route\Regex::addRoute' => ['Yaf\Router|bool', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], -'Yaf\Route\Regex::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], -'Yaf\Route\Regex::getCurrentRoute' => ['string'], -'Yaf\Route\Regex::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], -'Yaf\Route\Regex::getRoutes' => ['Yaf\Route_Interface[]'], -'Yaf\Route\Regex::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], -'Yaf\Route\Rewrite::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'verify='=>'?array', 'reverse='=>'string'], -'Yaf\Route\Rewrite::addConfig' => ['Yaf\Router|bool', 'config'=>'Yaf\Config_Abstract'], -'Yaf\Route\Rewrite::addRoute' => ['Yaf\Router|bool', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], -'Yaf\Route\Rewrite::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], -'Yaf\Route\Rewrite::getCurrentRoute' => ['string'], -'Yaf\Route\Rewrite::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], -'Yaf\Route\Rewrite::getRoutes' => ['Yaf\Route_Interface[]'], -'Yaf\Route\Rewrite::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], -'Yaf\Route\Simple::__construct' => ['void', 'module_name'=>'string', 'controller_name'=>'string', 'action_name'=>'string'], -'Yaf\Route\Simple::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], -'Yaf\Route\Simple::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], -'Yaf\Route\Supervar::__construct' => ['void', 'supervar_name'=>'string'], -'Yaf\Route\Supervar::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], -'Yaf\Route\Supervar::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], -'Yaf\Route_Interface::__construct' => ['Yaf\Route_Interface'], -'Yaf\Route_Interface::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], -'Yaf\Route_Interface::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], -'Yaf\Route_Static::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], -'Yaf\Route_Static::match' => ['bool', 'uri'=>'string'], -'Yaf\Route_Static::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], -'Yaf\Router::__construct' => ['void'], -'Yaf\Router::addConfig' => ['Yaf\Router|false', 'config'=>'Yaf\Config_Abstract'], -'Yaf\Router::addRoute' => ['Yaf\Router|false', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], -'Yaf\Router::getCurrentRoute' => ['string'], -'Yaf\Router::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], -'Yaf\Router::getRoutes' => ['Yaf\Route_Interface[]'], -'Yaf\Router::route' => ['Yaf\Router|false', 'request'=>'Yaf\Request_Abstract'], -'Yaf\Session::__clone' => ['void'], -'Yaf\Session::__construct' => ['void'], -'Yaf\Session::__get' => ['void', 'name'=>''], -'Yaf\Session::__isset' => ['void', 'name'=>''], -'Yaf\Session::__set' => ['void', 'name'=>'', 'value'=>''], -'Yaf\Session::__sleep' => ['list'], -'Yaf\Session::__unset' => ['void', 'name'=>''], -'Yaf\Session::__wakeup' => ['void'], -'Yaf\Session::count' => ['int'], -'Yaf\Session::current' => ['mixed'], -'Yaf\Session::del' => ['Yaf\Session|false', 'name'=>'string'], -'Yaf\Session::get' => ['mixed', 'name'=>'string'], -'Yaf\Session::getInstance' => ['Yaf\Session'], -'Yaf\Session::has' => ['bool', 'name'=>'string'], -'Yaf\Session::key' => ['int|string'], -'Yaf\Session::next' => ['void'], -'Yaf\Session::offsetExists' => ['bool', 'name'=>'mixed'], -'Yaf\Session::offsetGet' => ['mixed', 'name'=>'mixed'], -'Yaf\Session::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], -'Yaf\Session::offsetUnset' => ['void', 'name'=>'mixed'], -'Yaf\Session::rewind' => ['void'], -'Yaf\Session::set' => ['Yaf\Session|false', 'name'=>'string', 'value'=>'mixed'], -'Yaf\Session::start' => ['Yaf\Session'], -'Yaf\Session::valid' => ['bool'], -'Yaf\View\Simple::__construct' => ['void', 'template_dir'=>'string', 'options='=>'?array'], -'Yaf\View\Simple::__get' => ['mixed', 'name='=>'null'], -'Yaf\View\Simple::__isset' => ['', 'name'=>'string'], -'Yaf\View\Simple::__set' => ['void', 'name'=>'string', 'value='=>'mixed'], -'Yaf\View\Simple::assign' => ['Yaf\View\Simple', 'name'=>'array|string', 'value='=>'mixed'], -'Yaf\View\Simple::assignRef' => ['Yaf\View\Simple', 'name'=>'string', '&value'=>'mixed'], -'Yaf\View\Simple::clear' => ['Yaf\View\Simple', 'name='=>'string'], -'Yaf\View\Simple::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'?array'], -'Yaf\View\Simple::eval' => ['bool|void', 'tpl_str'=>'string', 'vars='=>'?array'], -'Yaf\View\Simple::getScriptPath' => ['string'], -'Yaf\View\Simple::render' => ['string|void', 'tpl'=>'string', 'tpl_vars='=>'?array'], -'Yaf\View\Simple::setScriptPath' => ['Yaf\View\Simple', 'template_dir'=>'string'], -'Yaf\View_Interface::assign' => ['bool', 'name'=>'array|string', 'value'=>'mixed'], -'Yaf\View_Interface::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'?array'], -'Yaf\View_Interface::getScriptPath' => ['string'], -'Yaf\View_Interface::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'?array'], -'Yaf\View_Interface::setScriptPath' => ['void', 'template_dir'=>'string'], -'Yaf_Action_Abstract::__clone' => ['void'], -'Yaf_Action_Abstract::__construct' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract', 'view'=>'Yaf_View_Interface', 'invokeArgs='=>'?array'], -'Yaf_Action_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], -'Yaf_Action_Abstract::execute' => ['mixed', 'arg='=>'mixed', '...args='=>'mixed'], -'Yaf_Action_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], -'Yaf_Action_Abstract::getController' => ['Yaf_Controller_Abstract'], -'Yaf_Action_Abstract::getControllerName' => ['string'], -'Yaf_Action_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], -'Yaf_Action_Abstract::getInvokeArgs' => ['array'], -'Yaf_Action_Abstract::getModuleName' => ['string'], -'Yaf_Action_Abstract::getRequest' => ['Yaf_Request_Abstract'], -'Yaf_Action_Abstract::getResponse' => ['Yaf_Response_Abstract'], -'Yaf_Action_Abstract::getView' => ['Yaf_View_Interface'], -'Yaf_Action_Abstract::getViewpath' => ['string'], -'Yaf_Action_Abstract::init' => [''], -'Yaf_Action_Abstract::initView' => ['Yaf_Response_Abstract', 'options='=>'?array'], -'Yaf_Action_Abstract::redirect' => ['bool', 'url'=>'string'], -'Yaf_Action_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], -'Yaf_Action_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], -'Yaf_Application::__clone' => ['void'], -'Yaf_Application::__construct' => ['void', 'config'=>'mixed', 'envrion='=>'string'], -'Yaf_Application::__destruct' => ['void'], -'Yaf_Application::__sleep' => ['list'], -'Yaf_Application::__wakeup' => ['void'], -'Yaf_Application::app' => ['?Yaf_Application'], -'Yaf_Application::bootstrap' => ['Yaf_Application', 'bootstrap='=>'Yaf_Bootstrap_Abstract'], -'Yaf_Application::clearLastError' => ['Yaf_Application'], -'Yaf_Application::environ' => ['string'], -'Yaf_Application::execute' => ['void', 'entry'=>'callable', '...args'=>'string'], -'Yaf_Application::getAppDirectory' => ['Yaf_Application'], -'Yaf_Application::getConfig' => ['Yaf_Config_Abstract'], -'Yaf_Application::getDispatcher' => ['Yaf_Dispatcher'], -'Yaf_Application::getLastErrorMsg' => ['string'], -'Yaf_Application::getLastErrorNo' => ['int'], -'Yaf_Application::getModules' => ['array'], -'Yaf_Application::run' => ['void'], -'Yaf_Application::setAppDirectory' => ['Yaf_Application', 'directory'=>'string'], -'Yaf_Config_Abstract::__construct' => ['void'], -'Yaf_Config_Abstract::get' => ['mixed', 'name'=>'string', 'value'=>'mixed'], -'Yaf_Config_Abstract::readonly' => ['bool'], -'Yaf_Config_Abstract::set' => ['Yaf_Config_Abstract'], -'Yaf_Config_Abstract::toArray' => ['array'], -'Yaf_Config_Ini::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], -'Yaf_Config_Ini::__get' => ['void', 'name='=>'string'], -'Yaf_Config_Ini::__isset' => ['void', 'name'=>'string'], -'Yaf_Config_Ini::__set' => ['void', 'name'=>'string', 'value'=>'mixed'], -'Yaf_Config_Ini::count' => ['void'], -'Yaf_Config_Ini::current' => ['void'], -'Yaf_Config_Ini::get' => ['mixed', 'name='=>'mixed'], -'Yaf_Config_Ini::key' => ['void'], -'Yaf_Config_Ini::next' => ['void'], -'Yaf_Config_Ini::offsetExists' => ['void', 'name'=>'string'], -'Yaf_Config_Ini::offsetGet' => ['void', 'name'=>'string'], -'Yaf_Config_Ini::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], -'Yaf_Config_Ini::offsetUnset' => ['void', 'name'=>'string'], -'Yaf_Config_Ini::readonly' => ['void'], -'Yaf_Config_Ini::rewind' => ['void'], -'Yaf_Config_Ini::set' => ['Yaf_Config_Abstract', 'name'=>'string', 'value'=>'mixed'], -'Yaf_Config_Ini::toArray' => ['array'], -'Yaf_Config_Ini::valid' => ['void'], -'Yaf_Config_Simple::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], -'Yaf_Config_Simple::__get' => ['void', 'name='=>'string'], -'Yaf_Config_Simple::__isset' => ['void', 'name'=>'string'], -'Yaf_Config_Simple::__set' => ['void', 'name'=>'string', 'value'=>'string'], -'Yaf_Config_Simple::count' => ['void'], -'Yaf_Config_Simple::current' => ['void'], -'Yaf_Config_Simple::get' => ['mixed', 'name='=>'mixed'], -'Yaf_Config_Simple::key' => ['void'], -'Yaf_Config_Simple::next' => ['void'], -'Yaf_Config_Simple::offsetExists' => ['void', 'name'=>'string'], -'Yaf_Config_Simple::offsetGet' => ['void', 'name'=>'string'], -'Yaf_Config_Simple::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], -'Yaf_Config_Simple::offsetUnset' => ['void', 'name'=>'string'], -'Yaf_Config_Simple::readonly' => ['void'], -'Yaf_Config_Simple::rewind' => ['void'], -'Yaf_Config_Simple::set' => ['Yaf_Config_Abstract', 'name'=>'string', 'value'=>'mixed'], -'Yaf_Config_Simple::toArray' => ['array'], -'Yaf_Config_Simple::valid' => ['void'], -'Yaf_Controller_Abstract::__clone' => ['void'], -'Yaf_Controller_Abstract::__construct' => ['void'], -'Yaf_Controller_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'array'], -'Yaf_Controller_Abstract::forward' => ['void', 'action'=>'string', 'parameters='=>'array'], -'Yaf_Controller_Abstract::forward\'1' => ['void', 'controller'=>'string', 'action'=>'string', 'parameters='=>'array'], -'Yaf_Controller_Abstract::forward\'2' => ['void', 'module'=>'string', 'controller'=>'string', 'action'=>'string', 'parameters='=>'array'], -'Yaf_Controller_Abstract::getInvokeArg' => ['void', 'name'=>'string'], -'Yaf_Controller_Abstract::getInvokeArgs' => ['void'], -'Yaf_Controller_Abstract::getModuleName' => ['string'], -'Yaf_Controller_Abstract::getName' => ['string'], -'Yaf_Controller_Abstract::getRequest' => ['Yaf_Request_Abstract'], -'Yaf_Controller_Abstract::getResponse' => ['Yaf_Response_Abstract'], -'Yaf_Controller_Abstract::getView' => ['Yaf_View_Interface'], -'Yaf_Controller_Abstract::getViewpath' => ['void'], -'Yaf_Controller_Abstract::init' => ['void'], -'Yaf_Controller_Abstract::initView' => ['void', 'options='=>'array'], -'Yaf_Controller_Abstract::redirect' => ['bool', 'url'=>'string'], -'Yaf_Controller_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'array'], -'Yaf_Controller_Abstract::setViewpath' => ['void', 'view_directory'=>'string'], -'Yaf_Dispatcher::__clone' => ['void'], -'Yaf_Dispatcher::__construct' => ['void'], -'Yaf_Dispatcher::__sleep' => ['list'], -'Yaf_Dispatcher::__wakeup' => ['void'], -'Yaf_Dispatcher::autoRender' => ['Yaf_Dispatcher', 'flag='=>'bool'], -'Yaf_Dispatcher::catchException' => ['Yaf_Dispatcher', 'flag='=>'bool'], -'Yaf_Dispatcher::disableView' => ['bool'], -'Yaf_Dispatcher::dispatch' => ['Yaf_Response_Abstract', 'request'=>'Yaf_Request_Abstract'], -'Yaf_Dispatcher::enableView' => ['Yaf_Dispatcher'], -'Yaf_Dispatcher::flushInstantly' => ['Yaf_Dispatcher', 'flag='=>'bool'], -'Yaf_Dispatcher::getApplication' => ['Yaf_Application'], -'Yaf_Dispatcher::getDefaultAction' => ['string'], -'Yaf_Dispatcher::getDefaultController' => ['string'], -'Yaf_Dispatcher::getDefaultModule' => ['string'], -'Yaf_Dispatcher::getInstance' => ['Yaf_Dispatcher'], -'Yaf_Dispatcher::getRequest' => ['Yaf_Request_Abstract'], -'Yaf_Dispatcher::getRouter' => ['Yaf_Router'], -'Yaf_Dispatcher::initView' => ['Yaf_View_Interface', 'templates_dir'=>'string', 'options='=>'array'], -'Yaf_Dispatcher::registerPlugin' => ['Yaf_Dispatcher', 'plugin'=>'Yaf_Plugin_Abstract'], -'Yaf_Dispatcher::returnResponse' => ['Yaf_Dispatcher', 'flag'=>'bool'], -'Yaf_Dispatcher::setDefaultAction' => ['Yaf_Dispatcher', 'action'=>'string'], -'Yaf_Dispatcher::setDefaultController' => ['Yaf_Dispatcher', 'controller'=>'string'], -'Yaf_Dispatcher::setDefaultModule' => ['Yaf_Dispatcher', 'module'=>'string'], -'Yaf_Dispatcher::setErrorHandler' => ['Yaf_Dispatcher', 'callback'=>'callable', 'error_types'=>'int'], -'Yaf_Dispatcher::setRequest' => ['Yaf_Dispatcher', 'request'=>'Yaf_Request_Abstract'], -'Yaf_Dispatcher::setView' => ['Yaf_Dispatcher', 'view'=>'Yaf_View_Interface'], -'Yaf_Dispatcher::throwException' => ['Yaf_Dispatcher', 'flag='=>'bool'], -'Yaf_Exception::__construct' => ['void'], -'Yaf_Exception::getPrevious' => ['void'], -'Yaf_Loader::__clone' => ['void'], -'Yaf_Loader::__construct' => ['void'], -'Yaf_Loader::__sleep' => ['list'], -'Yaf_Loader::__wakeup' => ['void'], -'Yaf_Loader::autoload' => ['void'], -'Yaf_Loader::clearLocalNamespace' => ['void'], -'Yaf_Loader::getInstance' => ['Yaf_Loader'], -'Yaf_Loader::getLibraryPath' => ['Yaf_Loader', 'is_global='=>'bool'], -'Yaf_Loader::getLocalNamespace' => ['void'], -'Yaf_Loader::getNamespacePath' => ['string', 'namespaces'=>'string'], -'Yaf_Loader::import' => ['bool'], -'Yaf_Loader::isLocalName' => ['bool'], -'Yaf_Loader::registerLocalNamespace' => ['void', 'prefix'=>'mixed'], -'Yaf_Loader::registerNamespace' => ['bool', 'namespaces'=>'string|array', 'path='=>'string'], -'Yaf_Loader::setLibraryPath' => ['Yaf_Loader', 'directory'=>'string', 'is_global='=>'bool'], -'Yaf_Plugin_Abstract::dispatchLoopShutdown' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], -'Yaf_Plugin_Abstract::dispatchLoopStartup' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], -'Yaf_Plugin_Abstract::postDispatch' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], -'Yaf_Plugin_Abstract::preDispatch' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], -'Yaf_Plugin_Abstract::preResponse' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], -'Yaf_Plugin_Abstract::routerShutdown' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], -'Yaf_Plugin_Abstract::routerStartup' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], -'Yaf_Registry::__clone' => ['void'], -'Yaf_Registry::__construct' => ['void'], -'Yaf_Registry::del' => ['void', 'name'=>'string'], -'Yaf_Registry::get' => ['mixed', 'name'=>'string'], -'Yaf_Registry::has' => ['bool', 'name'=>'string'], -'Yaf_Registry::set' => ['bool', 'name'=>'string', 'value'=>'string'], -'Yaf_Request_Abstract::clearParams' => ['bool'], -'Yaf_Request_Abstract::getActionName' => ['void'], -'Yaf_Request_Abstract::getBaseUri' => ['void'], -'Yaf_Request_Abstract::getControllerName' => ['void'], -'Yaf_Request_Abstract::getEnv' => ['void', 'name'=>'string', 'default='=>'string'], -'Yaf_Request_Abstract::getException' => ['void'], -'Yaf_Request_Abstract::getLanguage' => ['void'], -'Yaf_Request_Abstract::getMethod' => ['void'], -'Yaf_Request_Abstract::getModuleName' => ['void'], -'Yaf_Request_Abstract::getParam' => ['void', 'name'=>'string', 'default='=>'string'], -'Yaf_Request_Abstract::getParams' => ['void'], -'Yaf_Request_Abstract::getRequestUri' => ['void'], -'Yaf_Request_Abstract::getServer' => ['void', 'name'=>'string', 'default='=>'string'], -'Yaf_Request_Abstract::isCli' => ['void'], -'Yaf_Request_Abstract::isDispatched' => ['void'], -'Yaf_Request_Abstract::isGet' => ['void'], -'Yaf_Request_Abstract::isHead' => ['void'], -'Yaf_Request_Abstract::isOptions' => ['void'], -'Yaf_Request_Abstract::isPost' => ['void'], -'Yaf_Request_Abstract::isPut' => ['void'], -'Yaf_Request_Abstract::isRouted' => ['void'], -'Yaf_Request_Abstract::isXmlHttpRequest' => ['void'], -'Yaf_Request_Abstract::setActionName' => ['void', 'action'=>'string'], -'Yaf_Request_Abstract::setBaseUri' => ['bool', 'uir'=>'string'], -'Yaf_Request_Abstract::setControllerName' => ['void', 'controller'=>'string'], -'Yaf_Request_Abstract::setDispatched' => ['void'], -'Yaf_Request_Abstract::setModuleName' => ['void', 'module'=>'string'], -'Yaf_Request_Abstract::setParam' => ['void', 'name'=>'string', 'value='=>'string'], -'Yaf_Request_Abstract::setRequestUri' => ['void', 'uir'=>'string'], -'Yaf_Request_Abstract::setRouted' => ['void', 'flag='=>'string'], -'Yaf_Request_Http::__clone' => ['void'], -'Yaf_Request_Http::__construct' => ['void'], -'Yaf_Request_Http::get' => ['mixed', 'name'=>'string', 'default='=>'string'], -'Yaf_Request_Http::getActionName' => ['string'], -'Yaf_Request_Http::getBaseUri' => ['string'], -'Yaf_Request_Http::getControllerName' => ['string'], -'Yaf_Request_Http::getCookie' => ['mixed', 'name'=>'string', 'default='=>'string'], -'Yaf_Request_Http::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf_Request_Http::getException' => ['Yaf_Exception'], -'Yaf_Request_Http::getFiles' => ['void'], -'Yaf_Request_Http::getLanguage' => ['string'], -'Yaf_Request_Http::getMethod' => ['string'], -'Yaf_Request_Http::getModuleName' => ['string'], -'Yaf_Request_Http::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], -'Yaf_Request_Http::getParams' => ['array'], -'Yaf_Request_Http::getPost' => ['mixed', 'name'=>'string', 'default='=>'string'], -'Yaf_Request_Http::getQuery' => ['mixed', 'name'=>'string', 'default='=>'string'], -'Yaf_Request_Http::getRaw' => ['mixed'], -'Yaf_Request_Http::getRequest' => ['void'], -'Yaf_Request_Http::getRequestUri' => ['string'], -'Yaf_Request_Http::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf_Request_Http::isCli' => ['bool'], -'Yaf_Request_Http::isDispatched' => ['bool'], -'Yaf_Request_Http::isGet' => ['bool'], -'Yaf_Request_Http::isHead' => ['bool'], -'Yaf_Request_Http::isOptions' => ['bool'], -'Yaf_Request_Http::isPost' => ['bool'], -'Yaf_Request_Http::isPut' => ['bool'], -'Yaf_Request_Http::isRouted' => ['bool'], -'Yaf_Request_Http::isXmlHttpRequest' => ['bool'], -'Yaf_Request_Http::setActionName' => ['Yaf_Request_Abstract|bool', 'action'=>'string'], -'Yaf_Request_Http::setBaseUri' => ['bool', 'uri'=>'string'], -'Yaf_Request_Http::setControllerName' => ['Yaf_Request_Abstract|bool', 'controller'=>'string'], -'Yaf_Request_Http::setDispatched' => ['bool'], -'Yaf_Request_Http::setModuleName' => ['Yaf_Request_Abstract|bool', 'module'=>'string'], -'Yaf_Request_Http::setParam' => ['Yaf_Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], -'Yaf_Request_Http::setRequestUri' => ['', 'uri'=>'string'], -'Yaf_Request_Http::setRouted' => ['Yaf_Request_Abstract|bool'], -'Yaf_Request_Simple::__clone' => ['void'], -'Yaf_Request_Simple::__construct' => ['void'], -'Yaf_Request_Simple::get' => ['void'], -'Yaf_Request_Simple::getActionName' => ['string'], -'Yaf_Request_Simple::getBaseUri' => ['string'], -'Yaf_Request_Simple::getControllerName' => ['string'], -'Yaf_Request_Simple::getCookie' => ['void'], -'Yaf_Request_Simple::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf_Request_Simple::getException' => ['Yaf_Exception'], -'Yaf_Request_Simple::getFiles' => ['void'], -'Yaf_Request_Simple::getLanguage' => ['string'], -'Yaf_Request_Simple::getMethod' => ['string'], -'Yaf_Request_Simple::getModuleName' => ['string'], -'Yaf_Request_Simple::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], -'Yaf_Request_Simple::getParams' => ['array'], -'Yaf_Request_Simple::getPost' => ['void'], -'Yaf_Request_Simple::getQuery' => ['void'], -'Yaf_Request_Simple::getRequest' => ['void'], -'Yaf_Request_Simple::getRequestUri' => ['string'], -'Yaf_Request_Simple::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], -'Yaf_Request_Simple::isCli' => ['bool'], -'Yaf_Request_Simple::isDispatched' => ['bool'], -'Yaf_Request_Simple::isGet' => ['bool'], -'Yaf_Request_Simple::isHead' => ['bool'], -'Yaf_Request_Simple::isOptions' => ['bool'], -'Yaf_Request_Simple::isPost' => ['bool'], -'Yaf_Request_Simple::isPut' => ['bool'], -'Yaf_Request_Simple::isRouted' => ['bool'], -'Yaf_Request_Simple::isXmlHttpRequest' => ['void'], -'Yaf_Request_Simple::setActionName' => ['Yaf_Request_Abstract|bool', 'action'=>'string'], -'Yaf_Request_Simple::setBaseUri' => ['bool', 'uri'=>'string'], -'Yaf_Request_Simple::setControllerName' => ['Yaf_Request_Abstract|bool', 'controller'=>'string'], -'Yaf_Request_Simple::setDispatched' => ['bool'], -'Yaf_Request_Simple::setModuleName' => ['Yaf_Request_Abstract|bool', 'module'=>'string'], -'Yaf_Request_Simple::setParam' => ['Yaf_Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], -'Yaf_Request_Simple::setRequestUri' => ['', 'uri'=>'string'], -'Yaf_Request_Simple::setRouted' => ['Yaf_Request_Abstract|bool'], -'Yaf_Response_Abstract::__clone' => ['void'], -'Yaf_Response_Abstract::__construct' => ['void'], -'Yaf_Response_Abstract::__destruct' => ['void'], -'Yaf_Response_Abstract::__toString' => ['string'], -'Yaf_Response_Abstract::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf_Response_Abstract::clearBody' => ['bool', 'key='=>'string'], -'Yaf_Response_Abstract::clearHeaders' => ['void'], -'Yaf_Response_Abstract::getBody' => ['mixed', 'key='=>'string'], -'Yaf_Response_Abstract::getHeader' => ['void'], -'Yaf_Response_Abstract::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf_Response_Abstract::response' => ['void'], -'Yaf_Response_Abstract::setAllHeaders' => ['void'], -'Yaf_Response_Abstract::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf_Response_Abstract::setHeader' => ['void'], -'Yaf_Response_Abstract::setRedirect' => ['void'], -'Yaf_Response_Cli::__clone' => ['void'], -'Yaf_Response_Cli::__construct' => ['void'], -'Yaf_Response_Cli::__destruct' => ['void'], -'Yaf_Response_Cli::__toString' => ['string'], -'Yaf_Response_Cli::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf_Response_Cli::clearBody' => ['bool', 'key='=>'string'], -'Yaf_Response_Cli::getBody' => ['mixed', 'key='=>'?string'], -'Yaf_Response_Cli::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf_Response_Cli::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf_Response_Http::__clone' => ['void'], -'Yaf_Response_Http::__construct' => ['void'], -'Yaf_Response_Http::__destruct' => ['void'], -'Yaf_Response_Http::__toString' => ['string'], -'Yaf_Response_Http::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf_Response_Http::clearBody' => ['bool', 'key='=>'string'], -'Yaf_Response_Http::clearHeaders' => ['Yaf_Response_Abstract|false', 'name='=>'string'], -'Yaf_Response_Http::getBody' => ['mixed', 'key='=>'?string'], -'Yaf_Response_Http::getHeader' => ['mixed', 'name='=>'string'], -'Yaf_Response_Http::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf_Response_Http::response' => ['bool'], -'Yaf_Response_Http::setAllHeaders' => ['bool', 'headers'=>'array'], -'Yaf_Response_Http::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], -'Yaf_Response_Http::setHeader' => ['bool', 'name'=>'string', 'value'=>'string', 'replace='=>'bool', 'response_code='=>'int'], -'Yaf_Response_Http::setRedirect' => ['bool', 'url'=>'string'], -'Yaf_Route_Interface::__construct' => ['void'], -'Yaf_Route_Interface::assemble' => ['string', 'info'=>'array', 'query='=>'array'], -'Yaf_Route_Interface::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], -'Yaf_Route_Map::__construct' => ['void', 'controller_prefer='=>'string', 'delimiter='=>'string'], -'Yaf_Route_Map::assemble' => ['string', 'info'=>'array', 'query='=>'array'], -'Yaf_Route_Map::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], -'Yaf_Route_Regex::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'map='=>'array', 'verify='=>'array', 'reverse='=>'string'], -'Yaf_Route_Regex::addConfig' => ['Yaf_Router|bool', 'config'=>'Yaf_Config_Abstract'], -'Yaf_Route_Regex::addRoute' => ['Yaf_Router|bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], -'Yaf_Route_Regex::assemble' => ['string', 'info'=>'array', 'query='=>'array'], -'Yaf_Route_Regex::getCurrentRoute' => ['string'], -'Yaf_Route_Regex::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], -'Yaf_Route_Regex::getRoutes' => ['Yaf_Route_Interface[]'], -'Yaf_Route_Regex::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], -'Yaf_Route_Rewrite::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'verify='=>'array'], -'Yaf_Route_Rewrite::addConfig' => ['Yaf_Router|bool', 'config'=>'Yaf_Config_Abstract'], -'Yaf_Route_Rewrite::addRoute' => ['Yaf_Router|bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], -'Yaf_Route_Rewrite::assemble' => ['string', 'info'=>'array', 'query='=>'array'], -'Yaf_Route_Rewrite::getCurrentRoute' => ['string'], -'Yaf_Route_Rewrite::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], -'Yaf_Route_Rewrite::getRoutes' => ['Yaf_Route_Interface[]'], -'Yaf_Route_Rewrite::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], -'Yaf_Route_Simple::__construct' => ['void', 'module_name'=>'string', 'controller_name'=>'string', 'action_name'=>'string'], -'Yaf_Route_Simple::assemble' => ['string', 'info'=>'array', 'query='=>'array'], -'Yaf_Route_Simple::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], -'Yaf_Route_Static::assemble' => ['string', 'info'=>'array', 'query='=>'array'], -'Yaf_Route_Static::match' => ['void', 'uri'=>'string'], -'Yaf_Route_Static::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], -'Yaf_Route_Supervar::__construct' => ['void', 'supervar_name'=>'string'], -'Yaf_Route_Supervar::assemble' => ['string', 'info'=>'array', 'query='=>'array'], -'Yaf_Route_Supervar::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], -'Yaf_Router::__construct' => ['void'], -'Yaf_Router::addConfig' => ['bool', 'config'=>'Yaf_Config_Abstract'], -'Yaf_Router::addRoute' => ['bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], -'Yaf_Router::getCurrentRoute' => ['string'], -'Yaf_Router::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], -'Yaf_Router::getRoutes' => ['mixed'], -'Yaf_Router::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], -'Yaf_Session::__clone' => ['void'], -'Yaf_Session::__construct' => ['void'], -'Yaf_Session::__get' => ['void', 'name'=>'string'], -'Yaf_Session::__isset' => ['void', 'name'=>'string'], -'Yaf_Session::__set' => ['void', 'name'=>'string', 'value'=>'string'], -'Yaf_Session::__sleep' => ['list'], -'Yaf_Session::__unset' => ['void', 'name'=>'string'], -'Yaf_Session::__wakeup' => ['void'], -'Yaf_Session::count' => ['void'], -'Yaf_Session::current' => ['void'], -'Yaf_Session::del' => ['void', 'name'=>'string'], -'Yaf_Session::get' => ['mixed', 'name'=>'string'], -'Yaf_Session::getInstance' => ['void'], -'Yaf_Session::has' => ['void', 'name'=>'string'], -'Yaf_Session::key' => ['void'], -'Yaf_Session::next' => ['void'], -'Yaf_Session::offsetExists' => ['void', 'name'=>'string'], -'Yaf_Session::offsetGet' => ['void', 'name'=>'string'], -'Yaf_Session::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], -'Yaf_Session::offsetUnset' => ['void', 'name'=>'string'], -'Yaf_Session::rewind' => ['void'], -'Yaf_Session::set' => ['Yaf_Session|bool', 'name'=>'string', 'value'=>'mixed'], -'Yaf_Session::start' => ['void'], -'Yaf_Session::valid' => ['void'], -'Yaf_View_Interface::assign' => ['bool', 'name'=>'string', 'value='=>'string'], -'Yaf_View_Interface::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'array'], -'Yaf_View_Interface::getScriptPath' => ['string'], -'Yaf_View_Interface::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'array'], -'Yaf_View_Interface::setScriptPath' => ['void', 'template_dir'=>'string'], -'Yaf_View_Simple::__construct' => ['void', 'tempalte_dir'=>'string', 'options='=>'array'], -'Yaf_View_Simple::__get' => ['void', 'name='=>'string'], -'Yaf_View_Simple::__isset' => ['void', 'name'=>'string'], -'Yaf_View_Simple::__set' => ['void', 'name'=>'string', 'value'=>'mixed'], -'Yaf_View_Simple::assign' => ['bool', 'name'=>'string', 'value='=>'mixed'], -'Yaf_View_Simple::assignRef' => ['bool', 'name'=>'string', '&rw_value'=>'mixed'], -'Yaf_View_Simple::clear' => ['bool', 'name='=>'string'], -'Yaf_View_Simple::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'array'], -'Yaf_View_Simple::eval' => ['string', 'tpl_content'=>'string', 'tpl_vars='=>'array'], -'Yaf_View_Simple::getScriptPath' => ['string'], -'Yaf_View_Simple::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'array'], -'Yaf_View_Simple::setScriptPath' => ['bool', 'template_dir'=>'string'], -'yaml_emit' => ['string', 'data'=>'mixed', 'encoding='=>'int', 'linebreak='=>'int'], -'yaml_emit_file' => ['bool', 'filename'=>'string', 'data'=>'mixed', 'encoding='=>'int', 'linebreak='=>'int'], -'yaml_parse' => ['mixed|false', 'input'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], -'yaml_parse_file' => ['mixed|false', 'filename'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], -'yaml_parse_url' => ['mixed|false', 'url'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], -'Yar_Client::__call' => ['void', 'method'=>'string', 'parameters'=>'array'], -'Yar_Client::__construct' => ['void', 'url'=>'string'], -'Yar_Client::setOpt' => ['Yar_Client|false', 'name'=>'int', 'value'=>'mixed'], -'Yar_Client_Exception::__clone' => ['void'], -'Yar_Client_Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'Yar_Client_Exception::__toString' => ['string'], -'Yar_Client_Exception::__wakeup' => ['void'], -'Yar_Client_Exception::getCode' => ['int'], -'Yar_Client_Exception::getFile' => ['string'], -'Yar_Client_Exception::getLine' => ['int'], -'Yar_Client_Exception::getMessage' => ['string'], -'Yar_Client_Exception::getPrevious' => ['?Exception|?Throwable'], -'Yar_Client_Exception::getTrace' => ['list\',args?:array}>'], -'Yar_Client_Exception::getTraceAsString' => ['string'], -'Yar_Client_Exception::getType' => ['string'], -'Yar_Concurrent_Client::call' => ['int', 'uri'=>'string', 'method'=>'string', 'parameters'=>'array', 'callback='=>'callable'], -'Yar_Concurrent_Client::loop' => ['bool', 'callback='=>'callable', 'error_callback='=>'callable'], -'Yar_Concurrent_Client::reset' => ['bool'], -'Yar_Server::__construct' => ['void', 'object'=>'Object'], -'Yar_Server::handle' => ['bool'], -'Yar_Server_Exception::__clone' => ['void'], -'Yar_Server_Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], -'Yar_Server_Exception::__toString' => ['string'], -'Yar_Server_Exception::__wakeup' => ['void'], -'Yar_Server_Exception::getCode' => ['int'], -'Yar_Server_Exception::getFile' => ['string'], -'Yar_Server_Exception::getLine' => ['int'], -'Yar_Server_Exception::getMessage' => ['string'], -'Yar_Server_Exception::getPrevious' => ['?Exception|?Throwable'], -'Yar_Server_Exception::getTrace' => ['list\',args?:array}>'], -'Yar_Server_Exception::getTraceAsString' => ['string'], -'Yar_Server_Exception::getType' => ['string'], -'yaz_addinfo' => ['string', 'id'=>'resource'], -'yaz_ccl_conf' => ['void', 'id'=>'resource', 'config'=>'array'], -'yaz_ccl_parse' => ['bool', 'id'=>'resource', 'query'=>'string', '&w_result'=>'array'], -'yaz_close' => ['bool', 'id'=>'resource'], -'yaz_connect' => ['mixed', 'zurl'=>'string', 'options='=>'mixed'], -'yaz_database' => ['bool', 'id'=>'resource', 'databases'=>'string'], -'yaz_element' => ['bool', 'id'=>'resource', 'elementset'=>'string'], -'yaz_errno' => ['int', 'id'=>'resource'], -'yaz_error' => ['string', 'id'=>'resource'], -'yaz_es' => ['void', 'id'=>'resource', 'type'=>'string', 'args'=>'array'], -'yaz_es_result' => ['array', 'id'=>'resource'], -'yaz_get_option' => ['string', 'id'=>'resource', 'name'=>'string'], -'yaz_hits' => ['int', 'id'=>'resource', 'searchresult='=>'array'], -'yaz_itemorder' => ['void', 'id'=>'resource', 'args'=>'array'], -'yaz_present' => ['bool', 'id'=>'resource'], -'yaz_range' => ['void', 'id'=>'resource', 'start'=>'int', 'number'=>'int'], -'yaz_record' => ['string', 'id'=>'resource', 'pos'=>'int', 'type'=>'string'], -'yaz_scan' => ['void', 'id'=>'resource', 'type'=>'string', 'startterm'=>'string', 'flags='=>'array'], -'yaz_scan_result' => ['array', 'id'=>'resource', 'result='=>'array'], -'yaz_schema' => ['void', 'id'=>'resource', 'schema'=>'string'], -'yaz_search' => ['bool', 'id'=>'resource', 'type'=>'string', 'query'=>'string'], -'yaz_set_option' => ['', 'id'=>'', 'name'=>'string', 'value'=>'string', 'options'=>'array'], -'yaz_sort' => ['void', 'id'=>'resource', 'criteria'=>'string'], -'yaz_syntax' => ['void', 'id'=>'resource', 'syntax'=>'string'], -'yaz_wait' => ['mixed', '&rw_options='=>'array'], -'yp_all' => ['void', 'domain'=>'string', 'map'=>'string', 'callback'=>'string'], -'yp_cat' => ['array', 'domain'=>'string', 'map'=>'string'], -'yp_err_string' => ['string', 'errorcode'=>'int'], -'yp_errno' => ['int'], -'yp_first' => ['array', 'domain'=>'string', 'map'=>'string'], -'yp_get_default_domain' => ['string'], -'yp_master' => ['string', 'domain'=>'string', 'map'=>'string'], -'yp_match' => ['string', 'domain'=>'string', 'map'=>'string', 'key'=>'string'], -'yp_next' => ['array', 'domain'=>'string', 'map'=>'string', 'key'=>'string'], -'yp_order' => ['int', 'domain'=>'string', 'map'=>'string'], -'zem_get_extension_info_by_id' => [''], -'zem_get_extension_info_by_name' => [''], -'zem_get_extensions_info' => [''], -'zem_get_license_info' => [''], -'zend_current_obfuscation_level' => ['int'], -'zend_disk_cache_clear' => ['bool', 'namespace='=>'mixed|string'], -'zend_disk_cache_delete' => ['mixed|null', 'key'=>'string'], -'zend_disk_cache_fetch' => ['mixed|null', 'key'=>'string'], -'zend_disk_cache_store' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int|mixed'], -'zend_get_id' => ['array', 'all_ids='=>'all_ids|false'], -'zend_is_configuration_changed' => [''], -'zend_loader_current_file' => ['string'], -'zend_loader_enabled' => ['bool'], -'zend_loader_file_encoded' => ['bool'], -'zend_loader_file_licensed' => ['array'], -'zend_loader_install_license' => ['bool', 'license_file'=>'string', 'override'=>'bool'], -'zend_logo_guid' => ['string'], -'zend_obfuscate_class_name' => ['string', 'class_name'=>'string'], -'zend_obfuscate_function_name' => ['string', 'function_name'=>'string'], -'zend_optimizer_version' => ['string'], -'zend_runtime_obfuscate' => ['void'], -'zend_send_buffer' => ['null|false', 'buffer'=>'string', 'mime_type='=>'string', 'custom_headers='=>'string'], -'zend_send_file' => ['null|false', 'filename'=>'string', 'mime_type='=>'string', 'custom_headers='=>'string'], -'zend_set_configuration_changed' => [''], -'zend_shm_cache_clear' => ['bool', 'namespace='=>'mixed|string'], -'zend_shm_cache_delete' => ['mixed|null', 'key'=>'string'], -'zend_shm_cache_fetch' => ['mixed|null', 'key'=>'string'], -'zend_shm_cache_store' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int|mixed'], -'zend_thread_id' => ['int'], -'zend_version' => ['string'], -'ZendAPI_Job::addJobToQueue' => ['int', 'jobqueue_url'=>'string', 'password'=>'string'], -'ZendAPI_Job::getApplicationID' => [''], -'ZendAPI_Job::getEndTime' => [''], -'ZendAPI_Job::getGlobalVariables' => [''], -'ZendAPI_Job::getHost' => [''], -'ZendAPI_Job::getID' => [''], -'ZendAPI_Job::getInterval' => [''], -'ZendAPI_Job::getJobDependency' => [''], -'ZendAPI_Job::getJobName' => [''], -'ZendAPI_Job::getJobPriority' => [''], -'ZendAPI_Job::getJobStatus' => ['int'], -'ZendAPI_Job::getLastPerformedStatus' => ['int'], -'ZendAPI_Job::getOutput' => ['An'], -'ZendAPI_Job::getPreserved' => [''], -'ZendAPI_Job::getProperties' => ['array'], -'ZendAPI_Job::getScheduledTime' => [''], -'ZendAPI_Job::getScript' => [''], -'ZendAPI_Job::getTimeToNextRepeat' => ['int'], -'ZendAPI_Job::getUserVariables' => [''], -'ZendAPI_Job::setApplicationID' => ['', 'app_id'=>''], -'ZendAPI_Job::setGlobalVariables' => ['', 'vars'=>''], -'ZendAPI_Job::setJobDependency' => ['', 'job_id'=>''], -'ZendAPI_Job::setJobName' => ['', 'name'=>''], -'ZendAPI_Job::setJobPriority' => ['', 'priority'=>'int'], -'ZendAPI_Job::setPreserved' => ['', 'preserved'=>''], -'ZendAPI_Job::setRecurrenceData' => ['', 'interval'=>'', 'end_time='=>'mixed'], -'ZendAPI_Job::setScheduledTime' => ['', 'timestamp'=>''], -'ZendAPI_Job::setScript' => ['', 'script'=>''], -'ZendAPI_Job::setUserVariables' => ['', 'vars'=>''], -'ZendAPI_Job::ZendAPI_Job' => ['Job', 'script'=>'script'], -'ZendAPI_Queue::addJob' => ['int', '&job'=>'Job'], -'ZendAPI_Queue::getAllApplicationIDs' => ['array'], -'ZendAPI_Queue::getAllhosts' => ['array'], -'ZendAPI_Queue::getHistoricJobs' => ['array', 'status'=>'int', 'start_time'=>'', 'end_time'=>'', 'index'=>'int', 'count'=>'int', '&total'=>'int'], -'ZendAPI_Queue::getJob' => ['Job', 'job_id'=>'int'], -'ZendAPI_Queue::getJobsInQueue' => ['array', 'filter_options='=>'array', 'max_jobs='=>'int', 'with_globals_and_output='=>'bool'], -'ZendAPI_Queue::getLastError' => ['string'], -'ZendAPI_Queue::getNumOfJobsInQueue' => ['int', 'filter_options='=>'array'], -'ZendAPI_Queue::getStatistics' => ['array'], -'ZendAPI_Queue::isScriptExists' => ['bool', 'path'=>'string'], -'ZendAPI_Queue::isSuspend' => ['bool'], -'ZendAPI_Queue::login' => ['bool', 'password'=>'string', 'application_id='=>'int'], -'ZendAPI_Queue::removeJob' => ['bool', 'job_id'=>'array|int'], -'ZendAPI_Queue::requeueJob' => ['bool', 'job'=>'Job'], -'ZendAPI_Queue::resumeJob' => ['bool', 'job_id'=>'array|int'], -'ZendAPI_Queue::resumeQueue' => ['bool'], -'ZendAPI_Queue::setMaxHistoryTime' => ['bool'], -'ZendAPI_Queue::suspendJob' => ['bool', 'job_id'=>'array|int'], -'ZendAPI_Queue::suspendQueue' => ['bool'], -'ZendAPI_Queue::updateJob' => ['int', '&job'=>'Job'], -'ZendAPI_Queue::zendapi_queue' => ['ZendAPI_Queue', 'queue_url'=>'string'], -'zip_close' => ['void', 'zip'=>'resource'], -'zip_entry_close' => ['bool', 'zip_ent'=>'resource'], -'zip_entry_compressedsize' => ['int', 'zip_entry'=>'resource'], -'zip_entry_compressionmethod' => ['string', 'zip_entry'=>'resource'], -'zip_entry_filesize' => ['int', 'zip_entry'=>'resource'], -'zip_entry_name' => ['string', 'zip_entry'=>'resource'], -'zip_entry_open' => ['bool', 'zip_dp'=>'resource', 'zip_entry'=>'resource', 'mode='=>'string'], -'zip_entry_read' => ['string|false', 'zip_entry'=>'resource', 'len='=>'int'], -'zip_open' => ['resource|int|false', 'filename'=>'string'], -'zip_read' => ['resource', 'zip'=>'resource'], -'ZipArchive::addEmptyDir' => ['bool', 'dirname'=>'string'], -'ZipArchive::addFile' => ['bool', 'filepath'=>'string', 'entryname='=>'string', 'start='=>'int', 'length='=>'int'], -'ZipArchive::addFromString' => ['bool', 'entryname'=>'string', 'content'=>'string'], -'ZipArchive::addGlob' => ['bool', 'pattern'=>'string', 'flags='=>'int', 'options='=>'array'], -'ZipArchive::addPattern' => ['bool', 'pattern'=>'string', 'path='=>'string', 'options='=>'array'], -'ZipArchive::close' => ['bool'], -'ZipArchive::count' => ['int'], -'ZipArchive::createEmptyDir' => ['bool', 'dirname'=>'string'], -'ZipArchive::deleteIndex' => ['bool', 'index'=>'int'], -'ZipArchive::deleteName' => ['bool', 'name'=>'string'], -'ZipArchive::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string[]|string'], -'ZipArchive::getArchiveComment' => ['string|false', 'flags='=>'int'], -'ZipArchive::getCommentIndex' => ['string|false', 'index'=>'int', 'flags='=>'int'], -'ZipArchive::getCommentName' => ['string|false', 'name'=>'string', 'flags='=>'int'], -'ZipArchive::getExternalAttributesIndex' => ['bool', 'index'=>'int', '&w_opsys'=>'int', '&w_attr'=>'int', 'flags='=>'int'], -'ZipArchive::getExternalAttributesName' => ['bool', 'name'=>'string', '&w_opsys'=>'int', '&w_attr'=>'int', 'flags='=>'int'], -'ZipArchive::getFromIndex' => ['string|false', 'index'=>'int', 'length='=>'int', 'flags='=>'int'], -'ZipArchive::getFromName' => ['string|false', 'entryname'=>'string', 'length='=>'int', 'flags='=>'int'], -'ZipArchive::getNameIndex' => ['string|false', 'index'=>'int', 'flags='=>'int'], -'ZipArchive::getStatusString' => ['string|false'], -'ZipArchive::getStream' => ['resource|false', 'entryname'=>'string'], -'ZipArchive::isCompressionMethodSupported' => ['bool', 'method'=>'int', 'encode='=>'bool'], -'ZipArchive::isEncryptionMethodSupported' => ['bool', 'method'=>'int', 'encode='=>'bool'], -'ZipArchive::locateName' => ['int|false', 'filename'=>'string', 'flags='=>'int'], -'ZipArchive::open' => ['int|bool', 'source'=>'string', 'flags='=>'int'], -'ZipArchive::registerCancelCallback' => ['bool', 'callback'=>'callable'], -'ZipArchive::registerProgressCallback' => ['bool', 'rate'=>'float', 'callback'=>'callable'], -'ZipArchive::renameIndex' => ['bool', 'index'=>'int', 'new_name'=>'string'], -'ZipArchive::renameName' => ['bool', 'name'=>'string', 'new_name'=>'string'], -'ZipArchive::replaceFile' => ['bool', 'filename'=>'string', 'index'=>'int', 'start='=>'int', 'length='=>'int', 'flags='=>'int'], -'ZipArchive::setArchiveComment' => ['bool', 'comment'=>'string'], -'ZipArchive::setCommentIndex' => ['bool', 'index'=>'int', 'comment'=>'string'], -'ZipArchive::setCommentName' => ['bool', 'name'=>'string', 'comment'=>'string'], -'ZipArchive::setCompressionIndex' => ['bool', 'index'=>'int', 'comp_method'=>'int', 'comp_flags='=>'int'], -'ZipArchive::setCompressionName' => ['bool', 'name'=>'string', 'comp_method'=>'int', 'comp_flags='=>'int'], -'ZipArchive::setEncryptionIndex' => ['bool', 'index'=>'int', 'method'=>'string', 'password='=>'string'], -'ZipArchive::setEncryptionName' => ['bool', 'name'=>'string', 'method'=>'int', 'password='=>'string'], -'ZipArchive::setExternalAttributesIndex' => ['bool', 'index'=>'int', 'opsys'=>'int', 'attr'=>'int', 'flags='=>'int'], -'ZipArchive::setExternalAttributesName' => ['bool', 'name'=>'string', 'opsys'=>'int', 'attr'=>'int', 'flags='=>'int'], -'ZipArchive::setMtimeIndex' => ['bool', 'index'=>'int', 'timestamp'=>'int', 'flags='=>'int'], -'ZipArchive::setMtimeName' => ['bool', 'name'=>'string', 'timestamp'=>'int', 'flags='=>'int'], -'ZipArchive::setPassword' => ['bool', 'password'=>'string'], -'ZipArchive::statIndex' => ['array|false', 'index'=>'int', 'flags='=>'int'], -'ZipArchive::statName' => ['array|false', 'filename'=>'string', 'flags='=>'int'], -'ZipArchive::unchangeAll' => ['bool'], -'ZipArchive::unchangeArchive' => ['bool'], -'ZipArchive::unchangeIndex' => ['bool', 'index'=>'int'], -'ZipArchive::unchangeName' => ['bool', 'name'=>'string'], -'zlib_decode' => ['string|false', 'data'=>'string', 'max_length='=>'int'], -'zlib_encode' => ['string', 'data'=>'string', 'encoding'=>'int', 'level='=>'string|int'], -'zlib_get_coding_type' => ['string|false'], -'ZMQ::__construct' => ['void'], -'ZMQContext::__construct' => ['void', 'io_threads='=>'int', 'is_persistent='=>'bool'], -'ZMQContext::getOpt' => ['int|string', 'key'=>'string'], -'ZMQContext::getSocket' => ['ZMQSocket', 'type'=>'int', 'persistent_id='=>'string', 'on_new_socket='=>'callable'], -'ZMQContext::isPersistent' => ['bool'], -'ZMQContext::setOpt' => ['ZMQContext', 'key'=>'int', 'value'=>'mixed'], -'ZMQDevice::__construct' => ['void', 'frontend'=>'ZMQSocket', 'backend'=>'ZMQSocket', 'listener='=>'ZMQSocket'], -'ZMQDevice::getIdleTimeout' => ['ZMQDevice'], -'ZMQDevice::getTimerTimeout' => ['ZMQDevice'], -'ZMQDevice::run' => ['void'], -'ZMQDevice::setIdleCallback' => ['ZMQDevice', 'cb_func'=>'callable', 'timeout'=>'int', 'user_data='=>'mixed'], -'ZMQDevice::setIdleTimeout' => ['ZMQDevice', 'timeout'=>'int'], -'ZMQDevice::setTimerCallback' => ['ZMQDevice', 'cb_func'=>'callable', 'timeout'=>'int', 'user_data='=>'mixed'], -'ZMQDevice::setTimerTimeout' => ['ZMQDevice', 'timeout'=>'int'], -'ZMQPoll::add' => ['string', 'entry'=>'mixed', 'type'=>'int'], -'ZMQPoll::clear' => ['ZMQPoll'], -'ZMQPoll::count' => ['int'], -'ZMQPoll::getLastErrors' => ['array'], -'ZMQPoll::poll' => ['int', '&w_readable'=>'array', '&w_writable'=>'array', 'timeout='=>'int'], -'ZMQPoll::remove' => ['bool', 'item'=>'mixed'], -'ZMQSocket::__construct' => ['void', 'context'=>'ZMQContext', 'type'=>'int', 'persistent_id='=>'string', 'on_new_socket='=>'callable'], -'ZMQSocket::bind' => ['ZMQSocket', 'dsn'=>'string', 'force='=>'bool'], -'ZMQSocket::connect' => ['ZMQSocket', 'dsn'=>'string', 'force='=>'bool'], -'ZMQSocket::disconnect' => ['ZMQSocket', 'dsn'=>'string'], -'ZMQSocket::getEndpoints' => ['array'], -'ZMQSocket::getPersistentId' => ['?string'], -'ZMQSocket::getSocketType' => ['int'], -'ZMQSocket::getSockOpt' => ['int|string', 'key'=>'string'], -'ZMQSocket::isPersistent' => ['bool'], -'ZMQSocket::recv' => ['string', 'mode='=>'int'], -'ZMQSocket::recvMulti' => ['string[]', 'mode='=>'int'], -'ZMQSocket::send' => ['ZMQSocket', 'message'=>'array', 'mode='=>'int'], -'ZMQSocket::send\'1' => ['ZMQSocket', 'message'=>'string', 'mode='=>'int'], -'ZMQSocket::sendmulti' => ['ZMQSocket', 'message'=>'array', 'mode='=>'int'], -'ZMQSocket::setSockOpt' => ['ZMQSocket', 'key'=>'int', 'value'=>'mixed'], -'ZMQSocket::unbind' => ['ZMQSocket', 'dsn'=>'string'], -'Zookeeper::addAuth' => ['bool', 'scheme'=>'string', 'cert'=>'string', 'completion_cb='=>'callable'], -'Zookeeper::close' => ['void'], -'Zookeeper::connect' => ['void', 'host'=>'string', 'watcher_cb='=>'callable', 'recv_timeout='=>'int'], -'Zookeeper::create' => ['string', 'path'=>'string', 'value'=>'string', 'acls'=>'array', 'flags='=>'int'], -'Zookeeper::delete' => ['bool', 'path'=>'string', 'version='=>'int'], -'Zookeeper::exists' => ['bool', 'path'=>'string', 'watcher_cb='=>'callable'], -'Zookeeper::get' => ['string', 'path'=>'string', 'watcher_cb='=>'callable', 'stat='=>'array', 'max_size='=>'int'], -'Zookeeper::getAcl' => ['array', 'path'=>'string'], -'Zookeeper::getChildren' => ['array|false', 'path'=>'string', 'watcher_cb='=>'callable'], -'Zookeeper::getClientId' => ['int'], -'Zookeeper::getConfig' => ['ZookeeperConfig'], -'Zookeeper::getRecvTimeout' => ['int'], -'Zookeeper::getState' => ['int'], -'Zookeeper::isRecoverable' => ['bool'], -'Zookeeper::set' => ['bool', 'path'=>'string', 'value'=>'string', 'version='=>'int', 'stat='=>'array'], -'Zookeeper::setAcl' => ['bool', 'path'=>'string', 'version'=>'int', 'acl'=>'array'], -'Zookeeper::setDebugLevel' => ['bool', 'logLevel'=>'int'], -'Zookeeper::setDeterministicConnOrder' => ['bool', 'yesOrNo'=>'bool'], -'Zookeeper::setLogStream' => ['bool', 'stream'=>'resource'], -'Zookeeper::setWatcher' => ['bool', 'watcher_cb'=>'callable'], -'zookeeper_dispatch' => ['void'], -'ZookeeperConfig::add' => ['void', 'members'=>'string', 'version='=>'int', 'stat='=>'array'], -'ZookeeperConfig::get' => ['string', 'watcher_cb='=>'callable', 'stat='=>'array'], -'ZookeeperConfig::remove' => ['void', 'id_list'=>'string', 'version='=>'int', 'stat='=>'array'], -'ZookeeperConfig::set' => ['void', 'members'=>'string', 'version='=>'int', 'stat='=>'array'], -]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_71_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_71_delta.php deleted file mode 100644 index 89451449..00000000 --- a/vendor/vimeo/psalm/dictionaries/CallMap_71_delta.php +++ /dev/null @@ -1,76 +0,0 @@ - [ - 'Closure::fromCallable' => ['Closure', 'callable'=>'callable'], - 'curl_multi_errno' => ['int|false', 'mh'=>'resource'], - 'curl_share_errno' => ['int|false', 'sh'=>'resource'], - 'curl_share_strerror' => ['?string', 'error_code'=>'int'], - 'getenv\'1' => ['array'], - 'hash_hkdf' => ['string|false', 'algo'=>'string', 'key'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'], - 'is_iterable' => ['bool', 'value'=>'mixed'], - 'openssl_get_curve_names' => ['list'], - 'pcntl_async_signals' => ['bool', 'enable='=>'bool'], - 'pcntl_signal_get_handler' => ['int|string', 'signal'=>'int'], - 'sapi_windows_cp_conv' => ['?string', 'in_codepage'=>'int|string', 'out_codepage'=>'int|string', 'subject'=>'string'], - 'sapi_windows_cp_get' => ['int'], - 'sapi_windows_cp_is_utf8' => ['bool'], - 'sapi_windows_cp_set' => ['bool', 'codepage'=>'int'], - 'session_create_id' => ['string', 'prefix='=>'string'], - 'session_gc' => ['int|false'], - ], - 'changed' => [ - 'DateTimeZone::listIdentifiers' => [ - 'old' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string'], - 'new' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string|null'], - ], - 'SQLite3::createFunction' => [ - 'old' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argCount='=>'int'], - 'new' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argCount='=>'int', 'flags='=>'int'], - ], - 'get_headers' => [ - 'old' => ['array|false', 'url'=>'string', 'associative='=>'int'], - 'new' => ['array|false', 'url'=>'string', 'associative='=>'int', 'context='=>'resource'], - ], - 'getopt' => [ - 'old' => ['array|array|array>|false', 'short_options'=>'string', 'long_options='=>'array'], - 'new' => ['array|array|array>|false', 'short_options'=>'string', 'long_options='=>'array', '&w_rest_index='=>'int'], - ], - 'pg_fetch_all' => [ - 'old' => ['array', 'result'=>'resource'], - 'new' => ['array', 'result'=>'resource', 'result_type='=>'int'], - ], - 'pg_last_error' => [ - 'old' => ['string', 'connection='=>'resource'], - 'new' => ['string', 'connection='=>'resource', 'operation='=>'int'], - ], - 'pg_select' => [ - 'old' => ['string|array|false', 'connection'=>'resource', 'table_name'=>'string', 'assoc_array'=>'array', 'options='=>'int'], - 'new' => ['string|array|false', 'connection'=>'resource', 'table_name'=>'string', 'assoc_array'=>'array', 'options='=>'int', 'result_type='=>'int'], - ], - 'timezone_identifiers_list' => [ - 'old' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string'], - 'new' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'?string'], - ], - 'unpack' => [ - 'old' => ['array', 'format'=>'string', 'string'=>'string'], - 'new' => ['array|false', 'format'=>'string', 'string'=>'string', 'offset='=>'int'], - ], - ], - 'removed' => [ - ], -]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_72_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_72_delta.php deleted file mode 100644 index fe0b3b24..00000000 --- a/vendor/vimeo/psalm/dictionaries/CallMap_72_delta.php +++ /dev/null @@ -1,230 +0,0 @@ - [ - 'DOMNodeList::count' => ['int'], - 'ReflectionClass::isIterable' => ['bool'], - 'ZipArchive::count' => ['int'], - 'ZipArchive::setEncryptionIndex' => ['bool', 'index'=>'int', 'method'=>'string', 'password='=>'string'], - 'ZipArchive::setEncryptionName' => ['bool', 'name'=>'string', 'method'=>'int', 'password='=>'string'], - 'ftp_append' => ['bool', 'ftp'=>'resource', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int'], - 'hash_hmac_algos' => ['list'], - 'imagebmp' => ['bool', 'image'=>'resource', 'file='=>'resource|string|null', 'compressed='=>'int'], - 'imagecreatefrombmp' => ['resource|false', 'filename'=>'string'], - 'imageopenpolygon' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'], - 'imageresolution' => ['array|bool', 'image'=>'resource', 'resolution_x='=>'int', 'resolution_y='=>'int'], - 'imagesetclip' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int'], - 'ldap_exop' => ['mixed', 'ldap'=>'resource', 'reqoid'=>'string', 'reqdata='=>'string', 'serverctrls='=>'array|null', '&w_response_data='=>'string', '&w_response_oid='=>'string'], - 'ldap_exop_passwd' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string'], - 'ldap_exop_refresh' => ['int|false', 'ldap'=>'resource', 'dn'=>'string', 'ttl'=>'int'], - 'ldap_exop_whoami' => ['string|false', 'ldap'=>'resource'], - 'ldap_parse_exop' => ['bool', 'ldap'=>'resource', 'result'=>'resource', '&w_response_data='=>'string', '&w_response_oid='=>'string'], - 'mb_chr' => ['string|false', 'codepoint'=>'int', 'encoding='=>'string'], - 'mb_convert_encoding\'1' => ['array', 'string'=>'array', 'to_encoding'=>'string', 'from_encoding='=>'mixed'], - 'mb_ord' => ['int|false', 'string'=>'string', 'encoding='=>'string'], - 'mb_scrub' => ['string', 'string'=>'string', 'encoding='=>'string'], - 'oci_register_taf_callback' => ['bool', 'connection'=>'resource', 'callback='=>'callable'], - 'oci_unregister_taf_callback' => ['bool', 'connection'=>'resource'], - 'sapi_windows_vt100_support' => ['bool', 'stream'=>'resource', 'enable='=>'bool'], - 'socket_addrinfo_bind' => ['?resource', 'addrinfo'=>'resource'], - 'socket_addrinfo_connect' => ['resource', 'addrinfo'=>'resource'], - 'socket_addrinfo_explain' => ['array', 'addrinfo'=>'resource'], - 'socket_addrinfo_lookup' => ['resource[]', 'node'=>'string', 'service='=>'mixed', 'hints='=>'array'], - 'sodium_add' => ['void', '&rw_string1'=>'string', 'string2'=>'string'], - 'sodium_base642bin' => ['string', 'string'=>'string', 'id'=>'int', 'ignore='=>'string'], - 'sodium_bin2base64' => ['string', 'string'=>'string', 'id'=>'int'], - 'sodium_bin2hex' => ['string', 'string'=>'string'], - 'sodium_compare' => ['int', 'string1'=>'string', 'string2'=>'string'], - 'sodium_crypto_aead_aes256gcm_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_aes256gcm_encrypt' => ['string', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_aes256gcm_is_available' => ['bool'], - 'sodium_crypto_aead_aes256gcm_keygen' => ['string'], - 'sodium_crypto_aead_chacha20poly1305_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_chacha20poly1305_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_chacha20poly1305_ietf_keygen' => ['string'], - 'sodium_crypto_aead_chacha20poly1305_keygen' => ['string'], - 'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => ['string|false', 'ciphertext'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => ['string|false', 'message'=>'string', 'additional_data'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_xchacha20poly1305_ietf_keygen' => ['string'], - 'sodium_crypto_auth' => ['string', 'message'=>'string', 'key'=>'string'], - 'sodium_crypto_auth_keygen' => ['string'], - 'sodium_crypto_auth_verify' => ['bool', 'mac'=>'string', 'message'=>'string', 'key'=>'string'], - 'sodium_crypto_box' => ['string', 'message'=>'string', 'nonce'=>'string', 'key_pair'=>'string'], - 'sodium_crypto_box_keypair' => ['string'], - 'sodium_crypto_box_keypair_from_secretkey_and_publickey' => ['string', 'secret_key'=>'string', 'public_key'=>'string'], - 'sodium_crypto_box_open' => ['string|false', 'ciphertext'=>'string', 'nonce'=>'string', 'key_pair'=>'string'], - 'sodium_crypto_box_publickey' => ['string', 'key_pair'=>'string'], - 'sodium_crypto_box_publickey_from_secretkey' => ['string', 'secret_key'=>'string'], - 'sodium_crypto_box_seal' => ['string', 'message'=>'string', 'public_key'=>'string'], - 'sodium_crypto_box_seal_open' => ['string|false', 'ciphertext'=>'string', 'key_pair'=>'string'], - 'sodium_crypto_box_secretkey' => ['string', 'key_pair'=>'string'], - 'sodium_crypto_box_seed_keypair' => ['string', 'seed'=>'string'], - 'sodium_crypto_generichash' => ['string', 'message'=>'string', 'key='=>'?string', 'length='=>'?int'], - 'sodium_crypto_generichash_final' => ['string', '&state'=>'string', 'length='=>'?int'], - 'sodium_crypto_generichash_init' => ['string', 'key='=>'?string', 'length='=>'?int'], - 'sodium_crypto_generichash_keygen' => ['string'], - 'sodium_crypto_generichash_update' => ['bool', '&rw_state'=>'string', 'string'=>'string'], - 'sodium_crypto_kdf_derive_from_key' => ['string', 'subkey_length'=>'int', 'subkey_id'=>'int', 'context'=>'string', 'key'=>'string'], - 'sodium_crypto_kdf_keygen' => ['string'], - 'sodium_crypto_kx_client_session_keys' => ['array', 'client_keypair'=>'string', 'server_key'=>'string'], - 'sodium_crypto_kx_keypair' => ['string'], - 'sodium_crypto_kx_publickey' => ['string', 'key_pair'=>'string'], - 'sodium_crypto_kx_secretkey' => ['string', 'key_pair'=>'string'], - 'sodium_crypto_kx_seed_keypair' => ['string', 'seed'=>'string'], - 'sodium_crypto_kx_server_session_keys' => ['array', 'server_key_pair'=>'string', 'client_key'=>'string'], - 'sodium_crypto_pwhash' => ['string', 'length'=>'int', 'password'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int', 'algo='=>'int'], - 'sodium_crypto_pwhash_scryptsalsa208sha256' => ['string', 'length'=>'int', 'password'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'sodium_crypto_pwhash_scryptsalsa208sha256_str' => ['string', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify' => ['bool', 'hash'=>'string', 'password'=>'string'], - 'sodium_crypto_pwhash_str' => ['string', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'sodium_crypto_pwhash_str_needs_rehash' => ['bool', 'password'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'sodium_crypto_pwhash_str_verify' => ['bool', 'hash'=>'string', 'password'=>'string'], - 'sodium_crypto_scalarmult' => ['string', 'n'=>'string', 'p'=>'string'], - 'sodium_crypto_scalarmult_base' => ['string', 'secret_key'=>'string'], - 'sodium_crypto_secretbox' => ['string', 'message'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_secretbox_keygen' => ['string'], - 'sodium_crypto_secretbox_open' => ['string|false', 'ciphertext'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_secretstream_xchacha20poly1305_init_pull' => ['string', 'header'=>'string', 'key'=>'string'], - 'sodium_crypto_secretstream_xchacha20poly1305_init_push' => ['array', 'key'=>'string'], - 'sodium_crypto_secretstream_xchacha20poly1305_keygen' => ['string'], - 'sodium_crypto_secretstream_xchacha20poly1305_pull' => ['array', '&r_state'=>'string', 'ciphertext'=>'string', 'additional_data='=>'string'], - 'sodium_crypto_secretstream_xchacha20poly1305_push' => ['string', '&w_state'=>'string', 'message'=>'string', 'additional_data='=>'string', 'tag='=>'int'], - 'sodium_crypto_secretstream_xchacha20poly1305_rekey' => ['void', 'state'=>'string'], - 'sodium_crypto_shorthash' => ['string', 'message'=>'string', 'key'=>'string'], - 'sodium_crypto_shorthash_keygen' => ['string'], - 'sodium_crypto_sign' => ['string', 'message'=>'string', 'secret_key'=>'string'], - 'sodium_crypto_sign_detached' => ['string', 'message'=>'string', 'secret_key'=>'string'], - 'sodium_crypto_sign_ed25519_pk_to_curve25519' => ['string', 'public_key'=>'string'], - 'sodium_crypto_sign_ed25519_sk_to_curve25519' => ['string', 'secret_key'=>'string'], - 'sodium_crypto_sign_keypair' => ['string'], - 'sodium_crypto_sign_keypair_from_secretkey_and_publickey' => ['string', 'secret_key'=>'string', 'public_key'=>'string'], - 'sodium_crypto_sign_open' => ['string|false', 'signed_message'=>'string', 'public_key'=>'string'], - 'sodium_crypto_sign_publickey' => ['string', 'key_pair'=>'string'], - 'sodium_crypto_sign_publickey_from_secretkey' => ['string', 'secret_key'=>'string'], - 'sodium_crypto_sign_secretkey' => ['string', 'key_pair'=>'string'], - 'sodium_crypto_sign_seed_keypair' => ['string', 'seed'=>'string'], - 'sodium_crypto_sign_verify_detached' => ['bool', 'signature'=>'string', 'message'=>'string', 'public_key'=>'string'], - 'sodium_crypto_stream' => ['string', 'length'=>'int', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_stream_keygen' => ['string'], - 'sodium_crypto_stream_xor' => ['string', 'message'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_hex2bin' => ['string', 'string'=>'string', 'ignore='=>'string'], - 'sodium_increment' => ['void', '&rw_string'=>'string'], - 'sodium_memcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], - 'sodium_memzero' => ['void', '&w_string'=>'string'], - 'sodium_pad' => ['string', 'string'=>'string', 'block_size'=>'int'], - 'sodium_unpad' => ['string', 'string'=>'string', 'block_size'=>'int'], - 'stream_isatty' => ['bool', 'stream'=>'resource'], - ], - 'changed' => [ - 'SQLite3::openBlob' => [ - 'old' => ['resource|false', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'dbname='=>'string'], - 'new' => ['resource|false', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'database='=>'string', 'flags='=>'int'], - ], - 'hash_copy' => [ - 'old' => ['resource', 'context'=>'resource'], - 'new' => ['HashContext', 'context'=>'HashContext'], - ], - 'hash_final' => [ - 'old' => ['string', 'context'=>'resource', 'raw_output='=>'bool'], - 'new' => ['string', 'context'=>'HashContext', 'binary='=>'bool'], - ], - 'hash_init' => [ - 'old' => ['resource', 'algo'=>'string', 'options='=>'int', 'key='=>'string'], - 'new' => ['HashContext|false', 'algo'=>'string', 'flags='=>'int', 'key='=>'string'], - ], - 'hash_update' => [ - 'old' => ['bool', 'context'=>'resource', 'data'=>'string'], - 'new' => ['bool', 'context'=>'HashContext', 'data'=>'string'], - ], - 'hash_update_file' => [ - 'old' => ['bool', 'hcontext'=>'resource', 'filename'=>'string', 'scontext='=>'resource'], - 'new' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'stream_context='=>'resource'], - ], - 'hash_update_stream' => [ - 'old' => ['int', 'context'=>'resource', 'handle'=>'resource', 'length='=>'int'], - 'new' => ['int', 'context'=>'HashContext', 'stream'=>'resource', 'length='=>'int'], - ], - 'mb_check_encoding' => [ - 'old' => ['bool', 'value='=>'string', 'encoding='=>'string'], - 'new' => ['bool', 'value='=>'array|string', 'encoding='=>'string'], - ], - ], - 'removed' => [ - 'Sodium\add' => ['void', '&left'=>'string', 'right'=>'string'], - 'Sodium\bin2hex' => ['string', 'binary'=>'string'], - 'Sodium\compare' => ['int', 'left'=>'string', 'right'=>'string'], - 'Sodium\crypto_aead_aes256gcm_decrypt' => ['string|false', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], - 'Sodium\crypto_aead_aes256gcm_encrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], - 'Sodium\crypto_aead_aes256gcm_is_available' => ['bool'], - 'Sodium\crypto_aead_chacha20poly1305_decrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], - 'Sodium\crypto_aead_chacha20poly1305_encrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], - 'Sodium\crypto_auth' => ['string', 'msg'=>'string', 'key'=>'string'], - 'Sodium\crypto_auth_verify' => ['bool', 'mac'=>'string', 'msg'=>'string', 'key'=>'string'], - 'Sodium\crypto_box' => ['string', 'msg'=>'string', 'nonce'=>'string', 'keypair'=>'string'], - 'Sodium\crypto_box_keypair' => ['string'], - 'Sodium\crypto_box_keypair_from_secretkey_and_publickey' => ['string', 'secretkey'=>'string', 'publickey'=>'string'], - 'Sodium\crypto_box_open' => ['string', 'msg'=>'string', 'nonce'=>'string', 'keypair'=>'string'], - 'Sodium\crypto_box_publickey' => ['string', 'keypair'=>'string'], - 'Sodium\crypto_box_publickey_from_secretkey' => ['string', 'secretkey'=>'string'], - 'Sodium\crypto_box_seal' => ['string', 'message'=>'string', 'publickey'=>'string'], - 'Sodium\crypto_box_seal_open' => ['string', 'encrypted'=>'string', 'keypair'=>'string'], - 'Sodium\crypto_box_secretkey' => ['string', 'keypair'=>'string'], - 'Sodium\crypto_box_seed_keypair' => ['string', 'seed'=>'string'], - 'Sodium\crypto_generichash' => ['string', 'input'=>'string', 'key='=>'string', 'length='=>'int'], - 'Sodium\crypto_generichash_final' => ['string', 'state'=>'string', 'length='=>'int'], - 'Sodium\crypto_generichash_init' => ['string', 'key='=>'string', 'length='=>'int'], - 'Sodium\crypto_generichash_update' => ['bool', '&hashState'=>'string', 'append'=>'string'], - 'Sodium\crypto_kx' => ['string', 'secretkey'=>'string', 'publickey'=>'string', 'client_publickey'=>'string', 'server_publickey'=>'string'], - 'Sodium\crypto_pwhash' => ['string', 'out_len'=>'int', 'passwd'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'Sodium\crypto_pwhash_scryptsalsa208sha256' => ['string', 'out_len'=>'int', 'passwd'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'Sodium\crypto_pwhash_scryptsalsa208sha256_str' => ['string', 'passwd'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'Sodium\crypto_pwhash_scryptsalsa208sha256_str_verify' => ['bool', 'hash'=>'string', 'passwd'=>'string'], - 'Sodium\crypto_pwhash_str' => ['string', 'passwd'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'Sodium\crypto_pwhash_str_verify' => ['bool', 'hash'=>'string', 'passwd'=>'string'], - 'Sodium\crypto_scalarmult' => ['string', 'ecdhA'=>'string', 'ecdhB'=>'string'], - 'Sodium\crypto_scalarmult_base' => ['string', 'sk'=>'string'], - 'Sodium\crypto_secretbox' => ['string', 'plaintext'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'Sodium\crypto_secretbox_open' => ['string', 'ciphertext'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'Sodium\crypto_shorthash' => ['string', 'message'=>'string', 'key'=>'string'], - 'Sodium\crypto_sign' => ['string', 'message'=>'string', 'secretkey'=>'string'], - 'Sodium\crypto_sign_detached' => ['string', 'message'=>'string', 'secretkey'=>'string'], - 'Sodium\crypto_sign_ed25519_pk_to_curve25519' => ['string', 'sign_pk'=>'string'], - 'Sodium\crypto_sign_ed25519_sk_to_curve25519' => ['string', 'sign_sk'=>'string'], - 'Sodium\crypto_sign_keypair' => ['string'], - 'Sodium\crypto_sign_keypair_from_secretkey_and_publickey' => ['string', 'secretkey'=>'string', 'publickey'=>'string'], - 'Sodium\crypto_sign_open' => ['string|false', 'signed_message'=>'string', 'publickey'=>'string'], - 'Sodium\crypto_sign_publickey' => ['string', 'keypair'=>'string'], - 'Sodium\crypto_sign_publickey_from_secretkey' => ['string', 'secretkey'=>'string'], - 'Sodium\crypto_sign_secretkey' => ['string', 'keypair'=>'string'], - 'Sodium\crypto_sign_seed_keypair' => ['string', 'seed'=>'string'], - 'Sodium\crypto_sign_verify_detached' => ['bool', 'signature'=>'string', 'msg'=>'string', 'publickey'=>'string'], - 'Sodium\crypto_stream' => ['string', 'length'=>'int', 'nonce'=>'string', 'key'=>'string'], - 'Sodium\crypto_stream_xor' => ['string', 'plaintext'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'Sodium\hex2bin' => ['string', 'hex'=>'string'], - 'Sodium\increment' => ['string', '&nonce'=>'string'], - 'Sodium\library_version_major' => ['int'], - 'Sodium\library_version_minor' => ['int'], - 'Sodium\memcmp' => ['int', 'left'=>'string', 'right'=>'string'], - 'Sodium\memzero' => ['void', '&target'=>'string'], - 'Sodium\randombytes_buf' => ['string', 'length'=>'int'], - 'Sodium\randombytes_random16' => ['int|string'], - 'Sodium\randombytes_uniform' => ['int', 'upperBoundNonInclusive'=>'int'], - 'Sodium\version_string' => ['string'], - ], -]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_73_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_73_delta.php deleted file mode 100644 index 91002d47..00000000 --- a/vendor/vimeo/psalm/dictionaries/CallMap_73_delta.php +++ /dev/null @@ -1,72 +0,0 @@ - [ - 'DateTime::createFromImmutable' => ['static', 'object'=>'DateTimeImmutable'], - 'JsonException::__clone' => ['void'], - 'JsonException::__construct' => ['void'], - 'JsonException::__toString' => ['string'], - 'JsonException::__wakeup' => ['void'], - 'JsonException::getCode' => ['int'], - 'JsonException::getFile' => ['string'], - 'JsonException::getLine' => ['int'], - 'JsonException::getMessage' => ['string'], - 'JsonException::getPrevious' => ['?Throwable'], - 'JsonException::getTrace' => ['list\',args?:array}>'], - 'JsonException::getTraceAsString' => ['string'], - 'SplPriorityQueue::isCorrupted' => ['bool'], - 'array_key_first' => ['int|string|null', 'array'=>'array'], - 'array_key_last' => ['int|string|null', 'array'=>'array'], - 'fpm_get_status' => ['array|false'], - 'gc_status' => ['array{runs:int,collected:int,threshold:int,roots:int}'], - 'gmp_binomial' => ['GMP|false', 'n'=>'GMP|string|int', 'k'=>'int'], - 'gmp_kronecker' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_lcm' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_perfect_power' => ['bool', 'num'=>'GMP|string|int'], - 'hrtime' => ['array{0:int,1:int}|false', 'as_number='=>'false'], - 'hrtime\'1' => ['int|float|false', 'as_number='=>'true'], - 'is_countable' => ['bool', 'value'=>'mixed'], - 'net_get_interfaces' => ['array>|false'], - 'openssl_pkey_derive' => ['string|false', 'public_key'=>'mixed', 'private_key'=>'mixed', 'key_length='=>'?int'], - 'session_set_cookie_params\'1' => ['bool', 'options'=>'array{lifetime?:?int,path?:?string,domain?:?string,secure?:?bool,httponly?:?bool,samesite?:?string}'], - 'setcookie\'1' => ['bool', 'name'=>'string', 'value='=>'string', 'options='=>'array'], - 'setrawcookie\'1' => ['bool', 'name'=>'string', 'value='=>'string', 'options='=>'array'], - 'socket_wsaprotocol_info_export' => ['string|false', 'socket'=>'resource', 'process_id'=>'int'], - 'socket_wsaprotocol_info_import' => ['resource|false', 'info_id'=>'string'], - 'socket_wsaprotocol_info_release' => ['bool', 'info_id'=>'string'], - ], - 'changed' => [ - 'array_push' => [ - 'old' => ['int', '&rw_array'=>'array', '...values'=>'mixed'], - 'new' => ['int', '&rw_array'=>'array', '...values='=>'mixed'], - ], - 'array_unshift' => [ - 'old' => ['int', '&rw_array'=>'array', '...values'=>'mixed'], - 'new' => ['int', '&rw_array'=>'array', '...values='=>'mixed'], - ], - 'bcscale' => [ - 'old' => ['int', 'scale'=>'int'], - 'new' => ['int', 'scale='=>'int'], - ], - 'ldap_exop_passwd' => [ - 'old' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string'], - 'new' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array'], - ], - ], - 'removed' => [ - ], -]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_74_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_74_delta.php deleted file mode 100644 index af5e0d97..00000000 --- a/vendor/vimeo/psalm/dictionaries/CallMap_74_delta.php +++ /dev/null @@ -1,50 +0,0 @@ - [ - 'ReflectionProperty::getType' => ['?ReflectionType'], - 'mb_str_split' => ['list|false', 'string'=>'string', 'length='=>'positive-int', 'encoding='=>'string'], - ], - 'changed' => [ - 'array_merge' => [ - 'old' => ['array', '...arrays'=>'array'], - 'new' => ['array', '...arrays='=>'array'], - ], - 'array_merge_recursive' => [ - 'old' => ['array', '...arrays'=>'array'], - 'new' => ['array', '...arrays='=>'array'], - ], - 'gzread' => [ - 'old' => ['string|0', 'stream'=>'resource', 'length'=>'int'], - 'new' => ['string|false', 'stream'=>'resource', 'length'=>'int'], - ], - 'password_hash' => [ - 'old' => ['string|false', 'password'=>'string', 'algo'=>'int', 'options='=>'array'], - 'new' => ['string|false', 'password'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], - ], - 'password_needs_rehash' => [ - 'old' => ['bool', 'hash'=>'string', 'algo'=>'int', 'options='=>'array'], - 'new' => ['bool', 'hash'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], - ], - 'proc_open' => [ - 'old' => ['resource|false', 'command'=>'string', 'descriptor_spec'=>'array', '&pipes'=>'resource[]', 'cwd='=>'?string', 'env_vars='=>'?array', 'options='=>'?array'], - 'new' => ['resource|false', 'command'=>'string|array', 'descriptor_spec'=>'array', '&pipes'=>'resource[]', 'cwd='=>'?string', 'env_vars='=>'?array', 'options='=>'?array'], - ], - ], - 'removed' => [ - ], -]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php deleted file mode 100644 index afeb1bc4..00000000 --- a/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php +++ /dev/null @@ -1,1683 +0,0 @@ - [ - 'DateTime::createFromInterface' => ['self', 'object'=>'DateTimeInterface'], - 'DateTimeImmutable::createFromInterface' => ['self', 'object'=>'DateTimeInterface'], - 'PhpToken::getTokenName' => ['string'], - 'PhpToken::is' => ['bool', 'kind'=>'string|int|string[]|int[]'], - 'PhpToken::isIgnorable' => ['bool'], - 'PhpToken::tokenize' => ['list', 'code'=>'string', 'flags='=>'int'], - 'ReflectionClass::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], - 'ReflectionClassConstant::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], - 'ReflectionFunctionAbstract::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], - 'ReflectionParameter::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], - 'ReflectionProperty::getAttributes' => ['list', 'name='=>'?string', 'flags='=>'int'], - 'ReflectionUnionType::getTypes' => ['list'], - 'fdiv' => ['float', 'num1'=>'float', 'num2'=>'float'], - 'get_debug_type' => ['string', 'value'=>'mixed'], - 'get_resource_id' => ['int', 'resource'=>'resource'], - 'imagegetinterpolation' => ['int', 'image'=>'GdImage'], - 'str_contains' => ['bool', 'haystack'=>'string', 'needle'=>'string'], - 'str_ends_with' => ['bool', 'haystack'=>'string', 'needle'=>'string'], - 'str_starts_with' => ['bool', 'haystack'=>'string', 'needle'=>'string'], - ], - 'changed' => [ - 'DateTime::format' => [ - 'old' => ['string|false', 'format'=>'string'], - 'new' => ['string', 'format'=>'string'], - ], - 'DateTimeImmutable::format' => [ - 'old' => ['string|false', 'format'=>'string'], - 'new' => ['string', 'format'=>'string'], - ], - 'DateTimeZone::listIdentifiers' => [ - 'old' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string|null'], - 'new' => ['list', 'timezoneGroup='=>'int', 'countryCode='=>'string|null'], - ], - 'PDOStatement::bindColumn' => [ - 'old' => ['bool', 'column'=>'mixed', '&rw_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'], - 'new' => ['bool', 'column'=>'mixed', '&rw_var'=>'mixed', 'type='=>'int', 'maxLength='=>'int', 'driverOptions='=>'mixed'], - ], - 'PDOStatement::bindParam' => [ - 'old' => ['bool', 'paramno'=>'mixed', '&rw_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'], - 'new' => ['bool', 'param,'=>'string|int', '&rw_var'=>'mixed', 'type='=>'int', 'maxLength='=>'int', 'driverOptions='=>'mixed'], - ], - 'PDOStatement::bindValue' => [ - 'old' => ['bool', 'paramno'=>'mixed', 'param'=>'mixed', 'type='=>'int'], - 'new' => ['bool', 'param'=>'string|int', 'value'=>'mixed', 'type='=>'int'], - ], - 'PDOStatement::debugDumpParams' => [ - 'old' => ['void'], - 'new' => ['bool|null'], - ], - 'PDOStatement::errorCode' => [ - 'old' => ['string'], - 'new' => ['string|null'], - ], - 'PDOStatement::execute' => [ - 'old' => ['bool', 'bound_input_params='=>'?array'], - 'new' => ['bool', 'params='=>'?array'], - ], - 'PDOStatement::fetch' => [ - 'old' => ['mixed', 'how='=>'int', 'orientation='=>'int', 'offset='=>'int'], - 'new' => ['mixed', 'mode='=>'int', 'cursorOrientation='=>'int', 'cursorOffset='=>'int'], - ], - 'PDOStatement::fetchAll' => [ - 'old' => ['array|false', 'how='=>'int', 'fetch_argument='=>'int|string|callable', 'ctor_args='=>'?array'], - 'new' => ['array', 'mode='=>'int', '...args='=>'mixed'], - ], - 'PDOStatement::fetchColumn' => [ - 'old' => ['string|int|float|bool|null', 'column_number='=>'int'], - 'new' => ['mixed', 'column='=>'int'], - ], - 'PDOStatement::fetchObject' => [ - 'old' => ['object|false', 'class_name='=>'string', 'ctor_args='=>'array'], - 'new' => ['object|false', 'class='=>'?string', 'ctorArgs='=>'?array'], - ], - 'PDOStatement::setFetchMode' => [ - 'old' => ['bool', 'mode'=>'int'], - 'new' => ['bool', 'mode'=>'int', '...args='=>'mixed'], - ], - 'Phar::getMetadata' => [ - 'old' => ['mixed'], - 'new' => ['mixed', 'unserializeOptions='=>'array'], - ], - 'PharFileInfo::getMetadata' => [ - 'old' => ['mixed'], - 'new' => ['mixed', 'unserializeOptions='=>'array'], - ], - 'ReflectionClass::getConstants' => [ - 'old' => ['array'], - 'new' => ['array', 'filter='=>'?int'], - ], - 'ReflectionClass::getReflectionConstants' => [ - 'old' => ['list'], - 'new' => ['list', 'filter='=>'?int'], - ], - 'ReflectionClass::newInstanceArgs' => [ - 'old' => ['object', 'args='=>'list'], - 'new' => ['object', 'args='=>'array'], - ], - 'ReflectionProperty::getValue' => [ - 'old' => ['mixed', 'object='=>'object'], - 'new' => ['mixed', 'object='=>'null|object'], - ], - 'XMLWriter::flush' => [ - 'old' => ['string|int|false', 'empty='=>'bool'], - 'new' => ['string|int', 'empty='=>'bool'], - ], - 'SoapClient::__doRequest' => [ - 'old' => ['?string', 'request'=>'string', 'location'=>'string', 'action'=>'string', 'version'=>'int', 'one_way='=>'int'], - 'new' => ['?string', 'request'=>'string', 'location'=>'string', 'action'=>'string', 'version'=>'int', 'one_way='=>'bool'], - ], - 'XMLWriter::startAttributeNs' => [ - 'old' => ['bool', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string'], - 'new' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], - ], - 'XMLWriter::writeAttributeNs' => [ - 'old' => ['bool', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], - 'new' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], - ], - 'XMLWriter::writeDtdEntity' => [ - 'old' => ['bool', 'name'=>'string', 'content'=>'string', 'isParam'=>'bool', 'publicId'=>'string', 'systemId'=>'string', 'notationData'=>'string'], - 'new' => ['bool', 'name'=>'string', 'content'=>'string', 'isParam='=>'bool', 'publicId='=>'?string', 'systemId='=>'?string', 'notationData='=>'?string'], - ], - 'array_column' => [ - 'old' => ['array', 'array'=>'array', 'column_key'=>'mixed', 'index_key='=>'mixed'], - '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'], - ], - 'array_diff' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], - ], - 'array_diff_assoc' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], - ], - 'array_diff_key' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], - ], - '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'], - ], - 'array_intersect_assoc' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], - ], - 'array_intersect_key' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], - ], - 'bcadd' => [ - 'old' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], - 'new' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], - ], - 'bccomp' => [ - 'old' => ['int', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], - 'new' => ['int', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], - ], - 'bcdiv' => [ - 'old' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int'], - 'new' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int|null'], - ], - 'bcmod' => [ - 'old' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int'], - 'new' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int|null'], - ], - 'bcmul' => [ - 'old' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], - 'new' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], - ], - 'bcpow' => [ - 'old' => ['numeric-string', 'num'=>'numeric-string', 'exponent'=>'numeric-string', 'scale='=>'int'], - 'new' => ['numeric-string', 'num'=>'numeric-string', 'exponent'=>'numeric-string', 'scale='=>'int|null'], - ], - 'bcpowmod' => [ - 'old' => ['numeric-string|false', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'modulus'=>'numeric-string', 'scale='=>'int'], - 'new' => ['numeric-string|false', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'modulus'=>'numeric-string', 'scale='=>'int|null'], - ], - 'bcscale' => [ - 'old' => ['int', 'scale='=>'int'], - 'new' => ['int', 'scale='=>'int|null'], - ], - 'bcsqrt' => [ - 'old' => ['numeric-string', 'num'=>'numeric-string', 'scale='=>'int'], - 'new' => ['numeric-string|null', 'num'=>'numeric-string', 'scale='=>'int|null'], - ], - 'bcsub' => [ - 'old' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], - 'new' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int|null'], - ], - 'com_load_typelib' => [ - 'old' => ['bool', 'typelib_name'=>'string', 'case_insensitive='=>'bool'], - 'new' => ['bool', 'typelib_name'=>'string', 'case_insensitive='=>'true'], - ], - 'count' => [ - 'old' => ['int', 'value'=>'Countable|array|SimpleXMLElement|ResourceBundle', 'mode='=>'int'], - 'new' => ['int', 'value'=>'Countable|array', 'mode='=>'int'], - ], - 'count_chars' => [ - 'old' => ['array|false', 'input'=>'string', 'mode='=>'0|1|2'], - 'new' => ['array', 'input'=>'string', 'mode='=>'0|1|2'], - ], - 'count_chars\'1' => [ - 'old' => ['string|false', 'input'=>'string', 'mode='=>'3|4'], - 'new' => ['string', 'input'=>'string', 'mode='=>'3|4'], - ], - 'curl_close' => [ - 'old' => ['void', 'ch'=>'resource'], - 'new' => ['void', 'handle'=>'CurlHandle'], - ], - 'curl_copy_handle' => [ - 'old' => ['resource', 'ch'=>'resource'], - 'new' => ['CurlHandle', 'handle'=>'CurlHandle'], - ], - 'curl_errno' => [ - 'old' => ['int', 'ch'=>'resource'], - 'new' => ['int', 'handle'=>'CurlHandle'], - ], - 'curl_error' => [ - 'old' => ['string', 'ch'=>'resource'], - 'new' => ['string', 'handle'=>'CurlHandle'], - ], - 'curl_escape' => [ - 'old' => ['string|false', 'ch'=>'resource', 'string'=>'string'], - 'new' => ['string|false', 'handle'=>'CurlHandle', 'string'=>'string'], - ], - 'curl_exec' => [ - 'old' => ['bool|string', 'ch'=>'resource'], - 'new' => ['bool|string', 'handle'=>'CurlHandle'], - ], - 'curl_file_create' => [ - 'old' => ['CURLFile', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'], - 'new' => ['CURLFile', 'filename'=>'string', 'mime_type='=>'string|null', 'posted_filename='=>'string|null'], - ], - 'curl_getinfo' => [ - 'old' => ['mixed', 'ch'=>'resource', 'option='=>'int'], - 'new' => ['mixed', 'handle'=>'CurlHandle', 'option='=>'int'], - ], - 'curl_init' => [ - 'old' => ['resource|false', 'url='=>'string'], - 'new' => ['CurlHandle|false', 'url='=>'string'], - ], - 'curl_multi_add_handle' => [ - 'old' => ['int', 'mh'=>'resource', 'ch'=>'resource'], - 'new' => ['int', 'multi_handle'=>'CurlMultiHandle', 'handle'=>'CurlHandle'], - ], - 'curl_multi_close' => [ - 'old' => ['void', 'mh'=>'resource'], - 'new' => ['void', 'multi_handle'=>'CurlMultiHandle'], - ], - 'curl_multi_errno' => [ - 'old' => ['int|false', 'mh'=>'resource'], - 'new' => ['int', 'multi_handle'=>'CurlMultiHandle'], - ], - 'curl_multi_exec' => [ - 'old' => ['int', 'mh'=>'resource', '&w_still_running'=>'int'], - 'new' => ['int', 'multi_handle'=>'CurlMultiHandle', '&w_still_running'=>'int'], - ], - 'curl_multi_getcontent' => [ - 'old' => ['?string', 'ch'=>'resource'], - 'new' => ['?string', 'handle'=>'CurlHandle'], - ], - 'curl_multi_info_read' => [ - 'old' => ['array|false', 'mh'=>'resource', '&w_msgs_in_queue='=>'int'], - 'new' => ['array|false', 'multi_handle'=>'CurlMultiHandle', '&w_queued_messages='=>'int'], - ], - 'curl_multi_init' => [ - 'old' => ['resource|false'], - 'new' => ['CurlMultiHandle|false'], - ], - 'curl_multi_remove_handle' => [ - 'old' => ['int', 'mh'=>'resource', 'ch'=>'resource'], - 'new' => ['int', 'multi_handle'=>'CurlMultiHandle', 'handle'=>'CurlHandle'], - ], - 'curl_multi_select' => [ - 'old' => ['int', 'mh'=>'resource', 'timeout='=>'float'], - 'new' => ['int', 'multi_handle'=>'CurlMultiHandle', 'timeout='=>'float'], - ], - 'curl_multi_setopt' => [ - 'old' => ['bool', 'mh'=>'resource', 'option'=>'int', 'value'=>'mixed'], - 'new' => ['bool', 'multi_handle'=>'CurlMultiHandle', 'option'=>'int', 'value'=>'mixed'], - ], - 'curl_pause' => [ - 'old' => ['int', 'ch'=>'resource', 'bitmask'=>'int'], - 'new' => ['int', 'handle'=>'CurlHandle', 'flags'=>'int'], - ], - 'curl_reset' => [ - 'old' => ['void', 'ch'=>'resource'], - 'new' => ['void', 'handle'=>'CurlHandle'], - ], - 'curl_setopt' => [ - 'old' => ['bool', 'ch'=>'resource', 'option'=>'int', 'value'=>'callable|mixed'], - 'new' => ['bool', 'handle'=>'CurlHandle', 'option'=>'int', 'value'=>'callable|mixed'], - ], - 'curl_setopt_array' => [ - 'old' => ['bool', 'ch'=>'resource', 'options'=>'array'], - 'new' => ['bool', 'handle'=>'CurlHandle', 'options'=>'array'], - ], - 'curl_share_close' => [ - 'old' => ['void', 'sh'=>'resource'], - 'new' => ['void', 'share_handle'=>'CurlShareHandle'], - ], - 'curl_share_errno' => [ - 'old' => ['int|false', 'sh'=>'resource'], - 'new' => ['int', 'share_handle'=>'CurlShareHandle'], - ], - 'curl_share_init' => [ - 'old' => ['resource'], - 'new' => ['CurlShareHandle'], - ], - 'curl_share_setopt' => [ - 'old' => ['bool', 'sh'=>'resource', 'option'=>'int', 'value'=>'mixed'], - 'new' => ['bool', 'share_handle'=>'CurlShareHandle', 'option'=>'int', 'value'=>'mixed'], - ], - 'curl_unescape' => [ - 'old' => ['string|false', 'ch'=>'resource', 'string'=>'string'], - 'new' => ['string|false', 'handle'=>'CurlShareHandle', 'string'=>'string'], - ], - 'date' => [ - 'old' => ['string', 'format'=>'string', 'timestamp='=>'int'], - 'new' => ['string', 'format'=>'string', 'timestamp='=>'?int'], - ], - 'date_format' => [ - 'old' => ['string|false', 'object'=>'DateTimeInterface', 'format'=>'string'], - 'new' => ['string', 'object'=>'DateTimeInterface', 'format'=>'string'], - ], - 'datefmt_create' => [ - 'old' => ['?IntlDateFormatter', 'locale'=>'?string', 'dateType'=>'int', 'timeType'=>'int', 'timezone='=>'DateTimeZone|IntlTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'string'], - 'new' => ['?IntlDateFormatter', 'locale'=>'?string', 'dateType='=>'int', 'timeType='=>'int', 'timezone='=>'DateTimeZone|IntlTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'?string'], - ], - 'dom_import_simplexml' => [ - 'old' => ['DOMElement|null', 'node'=>'SimpleXMLElement'], - 'new' => ['DOMElement', 'node'=>'SimpleXMLElement'], - ], - 'explode' => [ - 'old' => ['list|false', 'separator'=>'string', 'string'=>'string', 'limit='=>'int'], - 'new' => ['list', 'separator'=>'string', 'string'=>'string', 'limit='=>'int'], - ], - 'get_class_methods' => [ - 'old' => ['list|null', 'object_or_class'=>'mixed'], - 'new' => ['list', 'object_or_class'=>'object|class-string'], - ], - 'get_parent_class' => [ - 'old' => ['class-string|false', 'object_or_class='=>'mixed'], - 'new' => ['class-string|false', 'object_or_class='=>'object|class-string'], - ], - 'gmdate' => [ - 'old' => ['string', 'format'=>'string', 'timestamp='=>'int'], - 'new' => ['string', 'format'=>'string', 'timestamp='=>'int|null'], - ], - 'gmmktime' => [ - 'old' => ['int|false', 'hour='=>'int', 'minute='=>'int', 'second='=>'int', 'month='=>'int', 'day='=>'int', 'year='=>'int'], - 'new' => ['int|false', 'hour'=>'int', 'minute='=>'int|null', 'second='=>'int|null', 'month='=>'int|null', 'day='=>'int|null', 'year='=>'int|null'], - ], - 'gmp_binomial' => [ - 'old' => ['GMP|false', 'n'=>'GMP|string|int', 'k'=>'int'], - 'new' => ['GMP', 'n'=>'GMP|string|int', 'k'=>'int'], - ], - 'gmstrftime' => [ - 'old' => ['string|false', 'format'=>'string', 'timestamp='=>'int'], - 'new' => ['string|false', 'format'=>'string', 'timestamp='=>'?int'], - ], - 'hash_init' => [ - 'old' => ['HashContext|false', 'algo'=>'string', 'flags='=>'int', 'key='=>'string'], - 'new' => ['HashContext', 'algo'=>'string', 'flags='=>'int', 'key='=>'string'], - ], - 'hash_update_file' => [ - 'old' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'stream_context='=>'resource'], - 'new' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'stream_context='=>'?resource'], - ], - 'imageaffine' => [ - 'old' => ['resource|false', 'src'=>'resource', 'affine'=>'array', 'clip='=>'array'], - 'new' => ['false|GdImage', 'image'=>'GdImage', 'affine'=>'array', 'clip='=>'?array'], - ], - 'imagealphablending' => [ - 'old' => ['bool', 'image'=>'resource', 'enable'=>'bool'], - 'new' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], - ], - 'imageantialias' => [ - 'old' => ['bool', 'image'=>'resource', 'enable'=>'bool'], - 'new' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], - ], - 'imagearc' => [ - 'old' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int'], - ], - 'imagebmp' => [ - 'old' => ['bool', 'image'=>'resource', 'file='=>'resource|string|null', 'compressed='=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'file='=>'resource|string|null', 'compressed='=>'bool'], - ], - 'imagechar' => [ - 'old' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], - ], - 'imagecharup' => [ - 'old' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], - ], - 'imagecolorallocate' => [ - 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - ], - 'imagecolorallocatealpha' => [ - 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - ], - 'imagecolorat' => [ - 'old' => ['int|false', 'image'=>'resource', 'x'=>'int', 'y'=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int'], - ], - 'imagecolorclosest' => [ - 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - ], - 'imagecolorclosestalpha' => [ - 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - ], - 'imagecolorclosesthwb' => [ - 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - ], - 'imagecolordeallocate' => [ - 'old' => ['bool', 'image'=>'resource', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'color'=>'int'], - ], - 'imagecolorexact' => [ - 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - ], - 'imagecolorexactalpha' => [ - 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - ], - 'imagecolormatch' => [ - 'old' => ['bool', 'image1'=>'resource', 'image2'=>'resource'], - 'new' => ['bool', 'image1'=>'GdImage', 'image2'=>'GdImage'], - ], - 'imagecolorresolve' => [ - 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - ], - 'imagecolorresolvealpha' => [ - 'old' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - ], - 'imagecolorset' => [ - 'old' => ['void', 'image'=>'resource', 'color'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], - 'new' => ['void', 'image'=>'GdImage', 'color'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], - ], - 'imagecolorsforindex' => [ - 'old' => ['array|false', 'image'=>'resource', 'color'=>'int'], - 'new' => ['array|false', 'image'=>'GdImage', 'color'=>'int'], - ], - 'imagecolorstotal' => [ - 'old' => ['int|false', 'image'=>'resource'], - 'new' => ['int|false', 'image'=>'GdImage'], - ], - 'imagecolortransparent' => [ - 'old' => ['int|false', 'image'=>'resource', 'color='=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'color='=>'int'], - ], - 'imageconvolution' => [ - 'old' => ['bool', 'image'=>'resource', 'matrix'=>'array', 'divisor'=>'float', 'offset'=>'float'], - 'new' => ['bool', 'image'=>'GdImage', 'matrix'=>'array', 'divisor'=>'float', 'offset'=>'float'], - ], - 'imagecopy' => [ - 'old' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int'], - 'new' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int'], - ], - 'imagecopymerge' => [ - 'old' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], - 'new' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], - ], - 'imagecopymergegray' => [ - 'old' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], - 'new' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], - ], - 'imagecopyresampled' => [ - 'old' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], - 'new' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], - ], - 'imagecopyresized' => [ - 'old' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], - 'new' => ['bool', 'dst_image'=>'GdImage', 'src_image'=>'GdImage', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], - ], - 'imagecreate' => [ - 'old' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'], - 'new' => ['false|GdImage', 'width'=>'int', 'height'=>'int'], - ], - 'imagecreatefrombmp' => [ - 'old' => ['resource|false', 'filename'=>'string'], - 'new' => ['false|GdImage', 'filename'=>'string'], - ], - 'imagecreatefromgd' => [ - 'old' => ['resource|false', 'filename'=>'string'], - 'new' => ['false|GdImage', 'filename'=>'string'], - ], - 'imagecreatefromgd2' => [ - 'old' => ['resource|false', 'filename'=>'string'], - 'new' => ['false|GdImage', 'filename'=>'string'], - ], - 'imagecreatefromgd2part' => [ - 'old' => ['resource|false', 'filename'=>'string', 'srcx'=>'int', 'srcy'=>'int', 'width'=>'int', 'height'=>'int'], - 'new' => ['false|GdImage', 'filename'=>'string', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int'], - ], - 'imagecreatefromgif' => [ - 'old' => ['resource|false', 'filename'=>'string'], - 'new' => ['false|GdImage', 'filename'=>'string'], - ], - 'imagecreatefromjpeg' => [ - 'old' => ['resource|false', 'filename'=>'string'], - 'new' => ['false|GdImage', 'filename'=>'string'], - ], - 'imagecreatefrompng' => [ - 'old' => ['resource|false', 'filename'=>'string'], - 'new' => ['false|GdImage', 'filename'=>'string'], - ], - 'imagecreatefromstring' => [ - 'old' => ['resource|false', 'image'=>'string'], - 'new' => ['false|GdImage', 'data'=>'string'], - ], - 'imagecreatefromwbmp' => [ - 'old' => ['resource|false', 'filename'=>'string'], - 'new' => ['false|GdImage', 'filename'=>'string'], - ], - 'imagecreatefromwebp' => [ - 'old' => ['resource|false', 'filename'=>'string'], - 'new' => ['false|GdImage', 'filename'=>'string'], - ], - 'imagecreatefromxbm' => [ - 'old' => ['resource|false', 'filename'=>'string'], - 'new' => ['false|GdImage', 'filename'=>'string'], - ], - 'imagecreatefromxpm' => [ - 'old' => ['resource|false', 'filename'=>'string'], - 'new' => ['false|GdImage', 'filename'=>'string'], - ], - 'imagecreatetruecolor' => [ - 'old' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'], - 'new' => ['false|GdImage', 'width'=>'int', 'height'=>'int'], - ], - 'imagecrop' => [ - 'old' => ['resource|false', 'im'=>'resource', 'rect'=>'array'], - 'new' => ['false|GdImage', 'image'=>'GdImage', 'rectangle'=>'array'], - ], - 'imagecropauto' => [ - 'old' => ['resource|false', 'im'=>'resource', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'], - 'new' => ['false|GdImage', 'image'=>'GdImage', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'], - ], - 'imagedashedline' => [ - 'old' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - ], - 'imagedestroy' => [ - 'old' => ['bool', 'image'=>'resource'], - 'new' => ['bool', 'image'=>'GdImage'], - ], - 'imageellipse' => [ - 'old' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], - ], - 'imagefill' => [ - 'old' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'color'=>'int'], - ], - 'imagefilledarc' => [ - 'old' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int', 'style'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int', 'style'=>'int'], - ], - 'imagefilledellipse' => [ - 'old' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], - ], - 'imagefilledpolygon' => [ - 'old' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], - ], - 'imagefilledrectangle' => [ - 'old' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - ], - 'imagefilltoborder' => [ - 'old' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'border_color'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'border_color'=>'int', 'color'=>'int'], - ], - 'imagefilter' => [ - 'old' => ['bool', 'image'=>'resource', 'filter'=>'int', 'args='=>'int', 'arg2='=>'int', 'arg3='=>'int', 'arg4='=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'filter'=>'int', 'args='=>'int', 'arg2='=>'int', 'arg3='=>'int', 'arg4='=>'int'], - ], - 'imageflip' => [ - 'old' => ['bool', 'image'=>'resource', 'mode'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'mode'=>'int'], - ], - 'imagefttext' => [ - 'old' => ['array|false', 'image'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string', 'options='=>'array'], - 'new' => ['array|false', 'image'=>'GdImage', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string', 'options='=>'array'], - ], - 'imagegammacorrect' => [ - 'old' => ['bool', 'image'=>'resource', 'input_gamma'=>'float', 'output_gamma'=>'float'], - 'new' => ['bool', 'image'=>'GdImage', 'input_gamma'=>'float', 'output_gamma'=>'float'], - ], - 'imagegd' => [ - 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null'], - 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null'], - ], - 'imagegd2' => [ - 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'chunk_size='=>'int', 'mode='=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'chunk_size='=>'int', 'mode='=>'int'], - ], - 'imagegetclip' => [ - 'old' => ['array|false', 'im'=>'resource'], - 'new' => ['array', 'image'=>'GdImage'], - ], - 'imagegif' => [ - 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null'], - 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null'], - ], - 'imagegrabscreen' => [ - 'old' => ['false|resource'], - 'new' => ['false|GdImage'], - ], - 'imagegrabwindow' => [ - 'old' => ['false|resource', 'window_handle'=>'int', 'client_area='=>'int'], - 'new' => ['false|GdImage', 'handle'=>'int', 'client_area='=>'int'], - ], - 'imageinterlace' => [ - 'old' => ['int|false', 'image'=>'resource', 'enable='=>'int'], - 'new' => ['int|false', 'image'=>'GdImage', 'enable='=>'int'], - ], - 'imageistruecolor' => [ - 'old' => ['bool', 'image'=>'resource'], - 'new' => ['bool', 'image'=>'GdImage'], - ], - 'imagejpeg' => [ - 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int'], - ], - 'imagelayereffect' => [ - 'old' => ['bool', 'image'=>'resource', 'effect'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'effect'=>'int'], - ], - 'imageline' => [ - 'old' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - ], - 'imageopenpolygon' => [ - 'old' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'], - ], - 'imagepalettecopy' => [ - 'old' => ['void', 'dst'=>'resource', 'src'=>'resource'], - 'new' => ['void', 'dst'=>'GdImage', 'src'=>'GdImage'], - ], - 'imagepalettetotruecolor' => [ - 'old' => ['bool', 'image'=>'resource'], - 'new' => ['bool', 'image'=>'GdImage'], - ], - 'imagepng' => [ - 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int', 'filters='=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int', 'filters='=>'int'], - ], - 'imagepolygon' => [ - 'old' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], - ], - 'imagerectangle' => [ - 'old' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - ], - 'imageresolution' => [ - 'old' => ['array|bool', 'image'=>'resource', 'resolution_x='=>'int', 'resolution_y='=>'int'], - 'new' => ['array|bool', 'image'=>'GdImage', 'resolution_x='=>'int', 'resolution_y='=>'int'], - ], - 'imagerotate' => [ - 'old' => ['resource|false', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'], - 'new' => ['false|GdImage', 'image'=>'GdImage', 'angle'=>'float', 'background_color'=>'int', 'ignore_transparent='=>'int'], - ], - 'imagesavealpha' => [ - 'old' => ['bool', 'image'=>'resource', 'enable'=>'bool'], - 'new' => ['bool', 'image'=>'GdImage', 'enable'=>'bool'], - ], - 'imagescale' => [ - 'old' => ['resource|false', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'], - 'new' => ['false|GdImage', 'image'=>'GdImage', 'width'=>'int', 'height='=>'int', 'mode='=>'int'], - ], - 'imagesetbrush' => [ - 'old' => ['bool', 'image'=>'resource', 'brush'=>'resource'], - 'new' => ['bool', 'image'=>'GdImage', 'brush'=>'GdImage'], - ], - 'imagesetclip' => [ - 'old' => ['bool', 'image'=>'resource', 'x1'=>'int', 'x2'=>'int', 'y1'=>'int', 'y2'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'x1'=>'int', 'x2'=>'int', 'y1'=>'int', 'y2'=>'int'], - ], - 'imagesetinterpolation' => [ - 'old' => ['bool', 'image'=>'resource', 'method'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'method'=>'int'], - ], - 'imagesetpixel' => [ - 'old' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'x'=>'int', 'y'=>'int', 'color'=>'int'], - ], - 'imagesetstyle' => [ - 'old' => ['bool', 'image'=>'resource', 'style'=>'non-empty-array'], - 'new' => ['bool', 'image'=>'GdImage', 'style'=>'non-empty-array'], - ], - 'imagesetthickness' => [ - 'old' => ['bool', 'image'=>'resource', 'thickness'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'thickness'=>'int'], - ], - 'imagesettile' => [ - 'old' => ['bool', 'image'=>'resource', 'tile'=>'resource'], - 'new' => ['bool', 'image'=>'GdImage', 'tile'=>'GdImage'], - ], - 'imagestring' => [ - 'old' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], - ], - 'imagestringup' => [ - 'old' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], - ], - 'imagesx' => [ - 'old' => ['int|false', 'image'=>'resource'], - 'new' => ['int|false', 'image'=>'GdImage'], - ], - 'imagesy' => [ - 'old' => ['int|false', 'image'=>'resource'], - 'new' => ['int|false', 'image'=>'GdImage'], - ], - 'imagetruecolortopalette' => [ - 'old' => ['bool', 'image'=>'resource', 'dither'=>'bool', 'num_colors'=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'dither'=>'bool', 'num_colors'=>'int'], - ], - 'imagettftext' => [ - 'old' => ['false|array', 'image'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string'], - 'new' => ['false|array', 'image'=>'GdImage', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string'], - ], - 'imagewbmp' => [ - 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'foreground_color='=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'foreground_color='=>'int'], - ], - 'imagewebp' => [ - 'old' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'file='=>'string|resource|null', 'quality='=>'int'], - ], - 'imagexbm' => [ - 'old' => ['bool', 'image'=>'resource', 'filename='=>'?string', 'foreground_color='=>'int'], - 'new' => ['bool', 'image'=>'GdImage', 'filename='=>'?string', 'foreground_color='=>'int'], - ], - 'ldap_exop_passwd' => [ - 'old' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array'], - 'new' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array|null'], - ], - 'ldap_set_rebind_proc' => [ - 'old' => ['bool', 'ldap'=>'resource', 'callback'=>'callable'], - 'new' => ['bool', 'ldap'=>'resource', 'callback'=>'?callable'], - ], - 'mb_check_encoding' => [ - 'old' => ['bool', 'value='=>'array|string', 'encoding='=>'string'], - 'new' => ['bool', 'value='=>'array|string|null', 'encoding='=>'string|null'], - ], - 'mb_chr' => [ - 'old' => ['string|false', 'codepoint'=>'int', 'encoding='=>'string'], - 'new' => ['string|false', 'codepoint'=>'int', 'encoding='=>'string|null'], - ], - 'mb_convert_case' => [ - 'old' => ['string', 'string'=>'string', 'mode'=>'int', 'encoding='=>'string'], - 'new' => ['string', 'string'=>'string', 'mode'=>'int', 'encoding='=>'string|null'], - ], - 'mb_convert_encoding' => [ - 'old' => ['string|false', 'string'=>'string', 'to_encoding'=>'string', 'from_encoding='=>'mixed'], - 'new' => ['string|false', 'string'=>'string', 'to_encoding'=>'string', 'from_encoding='=>'array|string|null'], - ], - 'mb_convert_encoding\'1' => [ - 'old' => ['array', 'string'=>'array', 'to_encoding'=>'string', 'from_encoding='=>'mixed'], - 'new' => ['array', 'string'=>'array', 'to_encoding'=>'string', 'from_encoding='=>'array|string|null'], - ], - 'mb_convert_kana' => [ - 'old' => ['string', 'string'=>'string', 'mode='=>'string', 'encoding='=>'string'], - 'new' => ['string', 'string'=>'string', 'mode='=>'string', 'encoding='=>'string|null'], - ], - 'mb_decode_numericentity' => [ - 'old' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string'], - 'new' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string|null'], - ], - 'mb_detect_encoding' => [ - 'old' => ['string|false', 'string'=>'string', 'encodings='=>'mixed', 'strict='=>'bool'], - 'new' => ['string|false', 'string'=>'string', 'encodings='=>'array|string|null', 'strict='=>'bool'], - ], - 'mb_detect_order' => [ - 'old' => ['bool|list', 'encoding='=>'mixed'], - 'new' => ['bool|list', 'encoding='=>'array|string|null'], - ], - 'mb_encode_mimeheader' => [ - 'old' => ['string', 'string'=>'string', 'charset='=>'string', 'transfer_encoding='=>'string', 'newline='=>'string', 'indent='=>'int'], - 'new' => ['string', 'string'=>'string', 'charset='=>'string|null', 'transfer_encoding='=>'string|null', 'newline='=>'string', 'indent='=>'int'], - ], - 'mb_encode_numericentity' => [ - 'old' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string', 'hex='=>'bool'], - 'new' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string|null', 'hex='=>'bool'], - ], - 'mb_ereg' => [ - 'old' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], - 'new' => ['bool', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], - ], - 'mb_ereg_match' => [ - 'old' => ['bool', 'pattern'=>'string', 'string'=>'string', 'options='=>'string'], - 'new' => ['bool', 'pattern'=>'string', 'string'=>'string', 'options='=>'string|null'], - ], - 'mb_ereg_replace' => [ - 'old' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string'], - 'new' => ['string|false|null', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string|null'], - ], - 'mb_ereg_replace_callback' => [ - 'old' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable', 'string'=>'string', 'options='=>'string'], - 'new' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable', 'string'=>'string', 'options='=>'string|null'], - ], - 'mb_ereg_search' => [ - 'old' => ['bool', 'pattern='=>'string', 'options='=>'string'], - 'new' => ['bool', 'pattern='=>'string|null', 'options='=>'string|null'], - ], - 'mb_ereg_search_init' => [ - 'old' => ['bool', 'string'=>'string', 'pattern='=>'string', 'options='=>'string'], - 'new' => ['bool', 'string'=>'string', 'pattern='=>'string|null', 'options='=>'string|null'], - ], - 'mb_ereg_search_pos' => [ - 'old' => ['int[]|false', 'pattern='=>'string', 'options='=>'string'], - 'new' => ['int[]|false', 'pattern='=>'string|null', 'options='=>'string|null'], - ], - 'mb_ereg_search_regs' => [ - 'old' => ['string[]|false', 'pattern='=>'string', 'options='=>'string'], - 'new' => ['string[]|false', 'pattern='=>'string|null', 'options='=>'string|null'], - ], - 'mb_eregi' => [ - 'old' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array'], - 'new' => ['bool', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], - ], - 'mb_eregi_replace' => [ - 'old' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string'], - 'new' => ['string|false|null', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string|null'], - ], - 'mb_http_input' => [ - 'old' => ['string|false', 'type='=>'string'], - 'new' => ['array|string|false', 'type='=>'string|null'], - ], - 'mb_http_output' => [ - 'old' => ['string|bool', 'encoding='=>'string'], - 'new' => ['string|bool', 'encoding='=>'string|null'], - ], - 'mb_internal_encoding' => [ - 'old' => ['string|bool', 'encoding='=>'string'], - 'new' => ['string|bool', 'encoding='=>'string|null'], - ], - 'mb_language' => [ - 'old' => ['string|bool', 'language='=>'string'], - 'new' => ['string|bool', 'language='=>'string|null'], - ], - 'mb_ord' => [ - 'old' => ['int|false', 'string'=>'string', 'encoding='=>'string'], - 'new' => ['int|false', 'string'=>'string', 'encoding='=>'string|null'], - ], - 'mb_parse_str' => [ - 'old' => ['bool', 'string'=>'string', '&w_result='=>'array'], - 'new' => ['bool', 'string'=>'string', '&w_result'=>'array'], - ], - 'mb_regex_encoding' => [ - 'old' => ['string|bool', 'encoding='=>'string'], - 'new' => ['string|bool', 'encoding='=>'string|null'], - ], - 'mb_regex_set_options' => [ - 'old' => ['string', 'options='=>'string'], - 'new' => ['string', 'options='=>'string|null'], - ], - 'mb_scrub' => [ - 'old' => ['string', 'string'=>'string', 'encoding='=>'string'], - 'new' => ['string', 'string'=>'string', 'encoding='=>'string|null'], - ], - 'mb_send_mail' => [ - 'old' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array', 'additional_params='=>'string'], - 'new' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array', 'additional_params='=>'string|null'], - ], - 'mb_str_split' => [ - 'old' => ['list|false', 'string'=>'string', 'length='=>'positive-int', 'encoding='=>'string'], - 'new' => ['list', 'string'=>'string', 'length='=>'positive-int', 'encoding='=>'string|null'], - ], - 'mb_strcut' => [ - 'old' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'], - 'new' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string|null'], - ], - 'mb_strimwidth' => [ - 'old' => ['string', 'string'=>'string', 'start'=>'int', 'width'=>'int', 'trim_marker='=>'string', 'encoding='=>'string'], - 'new' => ['string', 'string'=>'string', 'start'=>'int', 'width'=>'int', 'trim_marker='=>'string', 'encoding='=>'string|null'], - ], - 'mb_stripos' => [ - 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], - 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], - ], - 'mb_stristr' => [ - 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], - 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], - ], - 'mb_strlen' => [ - 'old' => ['0|positive-int', 'string'=>'string', 'encoding='=>'string'], - 'new' => ['0|positive-int', 'string'=>'string', 'encoding='=>'string|null'], - ], - 'mb_strpos' => [ - 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], - 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], - ], - 'mb_strrchr' => [ - 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], - 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], - ], - 'mb_strrichr' => [ - 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], - 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], - ], - 'mb_strripos' => [ - 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], - 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], - ], - 'mb_strrpos' => [ - 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], - 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string|null'], - ], - 'mb_strstr' => [ - 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], - 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string|null'], - ], - 'mb_strtolower' => [ - 'old' => ['lowercase-string', 'string'=>'string', 'encoding='=>'string'], - 'new' => ['lowercase-string', 'string'=>'string', 'encoding='=>'string|null'], - ], - 'mb_strtoupper' => [ - 'old' => ['string', 'string'=>'string', 'encoding='=>'string'], - 'new' => ['string', 'string'=>'string', 'encoding='=>'string|null'], - ], - 'mb_strwidth' => [ - 'old' => ['int', 'string'=>'string', 'encoding='=>'string'], - 'new' => ['int', 'string'=>'string', 'encoding='=>'string|null'], - ], - 'mb_substitute_character' => [ - 'old' => ['bool|int|string', 'substitute_character='=>'mixed'], - 'new' => ['bool|int|string', 'substitute_character='=>'int|string|null'], - ], - 'mb_substr' => [ - 'old' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'], - 'new' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string|null'], - ], - 'mb_substr_count' => [ - 'old' => ['int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'], - 'new' => ['int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string|null'], - ], - 'mktime' => [ - 'old' => ['int|false', 'hour='=>'int', 'minute='=>'int', 'second='=>'int', 'month='=>'int', 'day='=>'int', 'year='=>'int'], - 'new' => ['int|false', 'hour'=>'int', 'minute='=>'int|null', 'second='=>'int|null', 'month='=>'int|null', 'day='=>'int|null', 'year='=>'int|null'], - ], - 'mysqli::__construct' => [ - 'old' => ['void', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], - 'new' => ['void', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], - ], - 'mysqli::begin_transaction' => [ - 'old' => ['bool', 'flags='=>'int', 'name='=>'string'], - 'new' => ['bool', 'flags='=>'int', 'name='=>'?string'], - ], - 'mysqli::commit' => [ - 'old' => ['bool', 'flags='=>'int', 'name='=>'string'], - 'new' => ['bool', 'flags='=>'int', 'name='=>'?string'], - ], - 'mysqli::connect' => [ - 'old' => ['null|false', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], - 'new' => ['null|false', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], - ], - 'mysqli::rollback' => [ - 'old' => ['bool', 'flags='=>'int', 'name='=>'string'], - 'new' => ['bool', 'flags='=>'int', 'name='=>'?string'], - ], - 'mysqli_begin_transaction' => [ - 'old' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], - 'new' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], - ], - 'mysqli_commit' => [ - 'old' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], - 'new' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], - ], - 'mysqli_connect' => [ - 'old' => ['mysqli|false', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], - 'new' => ['mysqli|false', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], - ], - 'mysqli_rollback' => [ - 'old' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], - 'new' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'?string'], - ], - 'number_format' => [ - 'old' => ['string', 'num'=>'float|int', 'decimals='=>'int'], - 'new' => ['string', 'num'=>'float|int', 'decimals='=>'int', 'decimal_separator='=>'?string', 'thousands_separator='=>'?string'], - ], - 'ob_implicit_flush' => [ - 'old' => ['void', 'enable='=>'int'], - 'new' => ['void', 'enable='=>'bool'], - ], - 'openssl_csr_export' => [ - 'old' => ['bool', 'csr'=>'string|resource', '&w_output'=>'string', 'no_text='=>'bool'], - 'new' => ['bool', 'csr'=>'OpenSSLCertificateSigningRequest|string', '&w_output'=>'string', 'no_text='=>'bool'], - ], - 'openssl_csr_export_to_file' => [ - 'old' => ['bool', 'csr'=>'string|resource', 'output_filename'=>'string', 'no_text='=>'bool'], - 'new' => ['bool', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'output_filename'=>'string', 'no_text='=>'bool'], - ], - 'openssl_csr_get_public_key' => [ - 'old' => ['resource|false', 'csr'=>'string|resource', 'short_names='=>'bool'], - 'new' => ['OpenSSLAsymmetricKey|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'short_names='=>'bool'], - ], - 'openssl_csr_get_subject' => [ - 'old' => ['array|false', 'csr'=>'string|resource', 'short_names='=>'bool'], - 'new' => ['array|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'short_names='=>'bool'], - ], - 'openssl_csr_new' => [ - 'old' => ['resource|false', 'distinguished_names'=>'array', '&w_private_key'=>'resource', 'options='=>'array', 'extra_attributes='=>'array'], - 'new' => ['OpenSSLCertificateSigningRequest|false', 'distinguished_names'=>'array', '&w_private_key'=>'OpenSSLAsymmetricKey', 'options='=>'array|null', 'extra_attributes='=>'array|null'], - ], - 'openssl_csr_sign' => [ - 'old' => ['resource|false', 'csr'=>'string|resource', 'ca_certificate'=>'string|resource|null', 'private_key'=>'string|resource|array', 'days'=>'int', 'options='=>'array', 'serial='=>'int'], - 'new' => ['OpenSSLCertificate|false', 'csr'=>'OpenSSLCertificateSigningRequest|string', 'ca_certificate'=>'OpenSSLCertificate|string|null', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'days'=>'int', 'options='=>'array|null', 'serial='=>'int'], - ], - 'openssl_dh_compute_key' => [ - 'old' => ['string|false', 'public_key'=>'string', 'private_key'=>'resource'], - 'new' => ['string|false', 'public_key'=>'string', 'private_key'=>'OpenSSLAsymmetricKey'], - ], - 'openssl_free_key' => [ - 'old' => ['void', 'key'=>'resource'], - 'new' => ['void', 'key'=>'OpenSSLAsymmetricKey'], - ], - 'openssl_get_privatekey' => [ - 'old' => ['resource|false', 'private_key'=>'string', 'passphrase='=>'string'], - 'new' => ['OpenSSLAsymmetricKey|false', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase='=>'?string'], - ], - 'openssl_get_publickey' => [ - 'old' => ['resource|false', 'public_key'=>'resource|string'], - 'new' => ['OpenSSLAsymmetricKey|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], - ], - 'openssl_open' => [ - 'old' => ['bool', 'data'=>'string', '&w_output'=>'string', 'encrypted_key'=>'string', 'private_key'=>'string|array|resource', 'cipher_algo='=>'string', 'iv='=>'string'], - 'new' => ['bool', 'data'=>'string', '&w_output'=>'string', 'encrypted_key'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'cipher_algo'=>'string', 'iv='=>'string|null'], - ], - 'openssl_pkcs12_export' => [ - 'old' => ['bool', 'certificate'=>'string|resource', '&w_output'=>'string', 'private_key'=>'string|array|resource', 'passphrase'=>'string', 'options='=>'array'], - 'new' => ['bool', 'certificate'=>'OpenSSLCertificate|string', '&w_output'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase'=>'string', 'options='=>'array'], - ], - 'openssl_pkcs12_export_to_file' => [ - 'old' => ['bool', 'certificate'=>'string|resource', 'output_filename'=>'string', 'private_key'=>'string|array|resource', 'passphrase'=>'string', 'options='=>'array'], - 'new' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'output_filename'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'passphrase'=>'string', 'options='=>'array'], - ], - 'openssl_pkcs7_decrypt' => [ - 'old' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource', 'private_key='=>'string|resource|array'], - 'new' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|string', 'private_key='=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string|null'], - ], - 'openssl_pkcs7_encrypt' => [ - 'old' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'cipher_algo='=>'int'], - 'new' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|list|string', 'headers'=>'array|null', 'flags='=>'int', 'cipher_algo='=>'int'], - ], - 'openssl_pkcs7_sign' => [ - 'old' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource', 'private_key'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'untrusted_certificates_filename='=>'string'], - 'new' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'OpenSSLCertificate|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'headers'=>'array|null', 'flags='=>'int', 'untrusted_certificates_filename='=>'string|null'], - ], - 'openssl_pkey_derive' => [ - 'old' => ['string|false', 'public_key'=>'mixed', 'private_key'=>'mixed', 'key_length='=>'?int'], - 'new' => ['string|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'key_length='=>'int'], - ], - 'openssl_pkey_export' => [ - 'old' => ['bool', 'key'=>'resource', '&w_output'=>'string', 'passphrase='=>'string|null', 'options='=>'array'], - 'new' => ['bool', 'key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', '&w_output'=>'string', 'passphrase='=>'string|null', 'options='=>'array|null'], - ], - 'openssl_pkey_export_to_file' => [ - 'old' => ['bool', 'key'=>'resource|string|array', 'output_filename'=>'string', 'passphrase='=>'string|null', 'options='=>'array'], - 'new' => ['bool', 'key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'output_filename'=>'string', 'passphrase='=>'string|null', 'options='=>'array|null'], - ], - 'openssl_pkey_free' => [ - 'old' => ['void', 'key'=>'resource'], - 'new' => ['void', 'key'=>'OpenSSLAsymmetricKey'], - ], - 'openssl_pkey_get_details' => [ - 'old' => ['array|false', 'key'=>'resource'], - 'new' => ['array|false', 'key'=>'OpenSSLAsymmetricKey'], - ], - 'openssl_pkey_get_private' => [ - 'old' => ['resource|false', 'private_key'=>'string', 'passphrase='=>'string'], - 'new' => ['OpenSSLAsymmetricKey|false', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string', 'passphrase='=>'?string'], - ], - 'openssl_pkey_get_public' => [ - 'old' => ['resource|false', 'public_key'=>'resource|string'], - 'new' => ['OpenSSLAsymmetricKey|false', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], - ], - 'openssl_pkey_new' => [ - 'old' => ['resource|false', 'options='=>'array'], - 'new' => ['OpenSSLAsymmetricKey|false', 'options='=>'array|null'], - ], - 'openssl_private_decrypt' => [ - 'old' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'private_key'=>'string|resource|array', 'padding='=>'int'], - 'new' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], - ], - 'openssl_private_encrypt' => [ - 'old' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'private_key'=>'string|resource|array', 'padding='=>'int'], - 'new' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], - ], - 'openssl_public_decrypt' => [ - 'old' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'public_key'=>'string|resource', 'padding='=>'int'], - 'new' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], - ], - 'openssl_public_encrypt' => [ - 'old' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'public_key'=>'string|resource', 'padding='=>'int'], - 'new' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'padding='=>'int'], - ], - 'openssl_seal' => [ - 'old' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&w_encrypted_keys'=>'array', 'public_key'=>'array', 'cipher_algo='=>'string', '&rw_iv='=>'string'], - 'new' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&w_encrypted_keys'=>'array', 'public_key'=>'list', 'cipher_algo'=>'string', '&rw_iv='=>'string'], - ], - 'openssl_sign' => [ - 'old' => ['bool', 'data'=>'string', '&w_signature'=>'string', 'private_key'=>'resource|string', 'algorithm='=>'int|string'], - 'new' => ['bool', 'data'=>'string', '&w_signature'=>'string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'algorithm='=>'int|string'], - ], - 'openssl_spki_new' => [ - 'old' => ['?string', 'private_key'=>'resource', 'challenge'=>'string', 'digest_algo='=>'int'], - 'new' => ['string|false', 'private_key'=>'OpenSSLAsymmetricKey', 'challenge'=>'string', 'digest_algo='=>'int'], - ], - 'openssl_verify' => [ - 'old' => ['-1|0|1', 'data'=>'string', 'signature'=>'string', 'public_key'=>'resource|string', 'algorithm='=>'int|string'], - 'new' => ['-1|0|1|false', 'data'=>'string', 'signature'=>'string', 'public_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string', 'algorithm='=>'int|string'], - ], - 'openssl_x509_check_private_key' => [ - 'old' => ['bool', 'certificate'=>'string|resource', 'private_key'=>'string|resource|array'], - 'new' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'private_key'=>'OpenSSLAsymmetricKey|OpenSSLCertificate|array{OpenSSLAsymmetricKey|OpenSSLCertificate|string, string}|string'], - ], - 'openssl_x509_checkpurpose' => [ - 'old' => ['bool|int', 'certificate'=>'string|resource', 'purpose'=>'int', 'ca_info='=>'array', 'untrusted_certificates_file='=>'string'], - 'new' => ['bool|int', 'certificate'=>'OpenSSLCertificate|string', 'purpose'=>'int', 'ca_info='=>'array', 'untrusted_certificates_file='=>'string|null'], - ], - 'openssl_x509_export' => [ - 'old' => ['bool', 'certificate'=>'string|resource', '&w_output'=>'string', 'no_text='=>'bool'], - 'new' => ['bool', 'certificate'=>'OpenSSLCertificate|string', '&w_output'=>'string', 'no_text='=>'bool'], - ], - 'openssl_x509_export_to_file' => [ - 'old' => ['bool', 'certificate'=>'string|resource', 'output_filename'=>'string', 'no_text='=>'bool'], - 'new' => ['bool', 'certificate'=>'OpenSSLCertificate|string', 'output_filename'=>'string', 'no_text='=>'bool'], - ], - 'openssl_x509_fingerprint' => [ - 'old' => ['string|false', 'certificate'=>'string|resource', 'digest_algo='=>'string', 'binary='=>'bool'], - 'new' => ['string|false', 'certificate'=>'OpenSSLCertificate|string', 'digest_algo='=>'string', 'binary='=>'bool'], - ], - 'openssl_x509_free' => [ - 'old' => ['void', 'certificate'=>'resource'], - 'new' => ['void', 'certificate'=>'OpenSSLCertificate'], - ], - 'openssl_x509_parse' => [ - 'old' => ['array|false', 'certificate'=>'string|resource', 'short_names='=>'bool'], - 'new' => ['array|false', 'certificate'=>'OpenSSLCertificate|string', 'short_names='=>'bool'], - ], - 'openssl_x509_read' => [ - 'old' => ['resource|false', 'certificate'=>'string|resource'], - 'new' => ['OpenSSLCertificate|false', 'certificate'=>'OpenSSLCertificate|string'], - ], - 'parse_str' => [ - 'old' => ['void', 'string'=>'string', '&w_result='=>'array'], - 'new' => ['void', 'string'=>'string', '&w_result'=>'array'], - ], - 'password_hash' => [ - 'old' => ['string|false', 'password'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], - 'new' => ['string', 'password'=>'string', 'algo'=>'int|string|null', 'options='=>'array'], - ], - 'proc_get_status' => [ - 'old' => ['array{command: string, pid: int, running: bool, signaled: bool, stopped: bool, exitcode: int, termsig: int, stopsig: int}|false', 'process'=>'resource'], - 'new' => ['array{command: string, pid: int, running: bool, signaled: bool, stopped: bool, exitcode: int, termsig: int, stopsig: int}', 'process'=>'resource'], - ], - 'session_set_cookie_params' => [ - 'old' => ['bool', 'lifetime'=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool'], - 'new' => ['bool', 'lifetime'=>'int', 'path='=>'?string', 'domain='=>'?string', 'secure='=>'?bool', 'httponly='=>'?bool'], - ], - 'socket_accept' => [ - 'old' => ['resource|false', 'socket'=>'resource'], - 'new' => ['Socket|false', 'socket'=>'Socket'], - ], - 'socket_addrinfo_bind' => [ - 'old' => ['?resource', 'addrinfo'=>'resource'], - 'new' => ['Socket|false', 'address'=>'AddressInfo'], - ], - 'socket_addrinfo_connect' => [ - 'old' => ['resource', 'addrinfo'=>'resource'], - 'new' => ['Socket|false', 'address'=>'AddressInfo'], - ], - 'socket_addrinfo_explain' => [ - 'old' => ['array', 'addrinfo'=>'resource'], - 'new' => ['array', 'address'=>'AddressInfo'], - ], - 'socket_addrinfo_lookup' => [ - 'old' => ['resource[]', 'node'=>'string', 'service='=>'mixed', 'hints='=>'array'], - 'new' => ['false|AddressInfo[]', 'host='=>'string|null', 'service='=>'mixed', 'hints='=>'array'], - ], - 'socket_bind' => [ - 'old' => ['bool', 'socket'=>'resource', 'addr'=>'string', 'port='=>'int'], - 'new' => ['bool', 'socket'=>'Socket', 'addr'=>'string', 'port='=>'int'], - ], - 'socket_clear_error' => [ - 'old' => ['void', 'socket='=>'resource'], - 'new' => ['void', 'socket='=>'Socket'], - ], - 'socket_close' => [ - 'old' => ['void', 'socket'=>'resource'], - 'new' => ['void', 'socket'=>'Socket'], - ], - 'socket_connect' => [ - 'old' => ['bool', 'socket'=>'resource', 'addr'=>'string', 'port='=>'int'], - 'new' => ['bool', 'socket'=>'Socket', 'addr'=>'string', 'port='=>'int'], - ], - 'socket_create' => [ - 'old' => ['resource|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], - 'new' => ['Socket|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], - ], - 'socket_create_listen' => [ - 'old' => ['resource|false', 'port'=>'int', 'backlog='=>'int'], - 'new' => ['Socket|false', 'port'=>'int', 'backlog='=>'int'], - ], - 'socket_create_pair' => [ - 'old' => ['bool', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int', '&w_fd'=>'resource[]'], - 'new' => ['bool', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int', '&w_fd'=>'Socket[]'], - ], - 'socket_export_stream' => [ - 'old' => ['resource|false', 'socket'=>'resource'], - 'new' => ['resource|false', 'socket'=>'Socket'], - ], - 'socket_get_option' => [ - 'old' => ['mixed|false', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int'], - 'new' => ['mixed|false', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int'], - ], - 'socket_get_status' => [ - 'old' => ['array', 'stream'=>'resource'], - 'new' => ['array', 'stream'=>'Socket'], - ], - 'socket_getopt' => [ - 'old' => ['mixed', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int'], - 'new' => ['mixed', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int'], - ], - 'socket_getpeername' => [ - 'old' => ['bool', 'socket'=>'resource', '&w_addr'=>'string', '&w_port='=>'int'], - 'new' => ['bool', 'socket'=>'Socket', '&w_addr'=>'string', '&w_port='=>'int'], - ], - 'socket_getsockname' => [ - 'old' => ['bool', 'socket'=>'resource', '&w_addr'=>'string', '&w_port='=>'int'], - 'new' => ['bool', 'socket'=>'Socket', '&w_addr'=>'string', '&w_port='=>'int'], - ], - 'socket_import_stream' => [ - 'old' => ['resource|false|null', 'stream'=>'resource'], - 'new' => ['Socket|false|null', 'stream'=>'resource'], - ], - 'socket_last_error' => [ - 'old' => ['int', 'socket='=>'resource'], - 'new' => ['int', 'socket='=>'Socket'], - ], - 'socket_listen' => [ - 'old' => ['bool', 'socket'=>'resource', 'backlog='=>'int'], - 'new' => ['bool', 'socket'=>'Socket', 'backlog='=>'int'], - ], - 'socket_read' => [ - 'old' => ['string|false', 'socket'=>'resource', 'length'=>'int', 'type='=>'int'], - 'new' => ['string|false', 'socket'=>'Socket', 'length'=>'int', 'type='=>'int'], - ], - 'socket_recv' => [ - 'old' => ['int|false', 'socket'=>'resource', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int'], - 'new' => ['int|false', 'socket'=>'Socket', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int'], - ], - 'socket_recvfrom' => [ - 'old' => ['int|false', 'socket'=>'resource', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int', '&w_name'=>'string', '&w_port='=>'int'], - 'new' => ['int|false', 'socket'=>'Socket', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int', '&w_name'=>'string', '&w_port='=>'int'], - ], - 'socket_recvmsg' => [ - 'old' => ['int|false', 'socket'=>'resource', '&w_message'=>'string', 'flags='=>'int'], - 'new' => ['int|false', 'socket'=>'Socket', '&w_message'=>'string', 'flags='=>'int'], - ], - 'socket_select' => [ - 'old' => ['int|false', '&rw_read_fds'=>'resource[]|null', '&rw_write_fds'=>'resource[]|null', '&rw_except_fds'=>'resource[]|null', 'tv_sec'=>'int|null', 'tv_usec='=>'int'], - 'new' => ['int|false', '&rw_read_fds'=>'Socket[]|null', '&rw_write_fds'=>'Socket[]|null', '&rw_except_fds'=>'Socket[]|null', 'tv_sec'=>'int|null', 'tv_usec='=>'int'], - ], - 'socket_send' => [ - 'old' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'length'=>'int', 'flags'=>'int'], - 'new' => ['int|false', 'socket'=>'Socket', 'buf'=>'string', 'length'=>'int', 'flags'=>'int'], - ], - 'socket_sendmsg' => [ - 'old' => ['int|false', 'socket'=>'resource', 'message'=>'array', 'flags'=>'int'], - 'new' => ['int|false', 'socket'=>'Socket', 'message'=>'array', 'flags'=>'int'], - ], - 'socket_sendto' => [ - 'old' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'length'=>'int', 'flags'=>'int', 'addr'=>'string', 'port='=>'int'], - 'new' => ['int|false', 'socket'=>'Socket', 'buf'=>'string', 'length'=>'int', 'flags'=>'int', 'addr'=>'string', 'port='=>'int'], - ], - 'socket_set_block' => [ - 'old' => ['bool', 'socket'=>'resource'], - 'new' => ['bool', 'socket'=>'Socket'], - ], - 'socket_set_blocking' => [ - 'old' => ['bool', 'socket'=>'resource', 'mode'=>'int'], - 'new' => ['bool', 'socket'=>'Socket', 'mode'=>'int'], - ], - 'socket_set_nonblock' => [ - 'old' => ['bool', 'socket'=>'resource'], - 'new' => ['bool', 'socket'=>'Socket'], - ], - 'socket_set_option' => [ - 'old' => ['bool', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], - 'new' => ['bool', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], - ], - 'socket_set_timeout' => [ - 'old' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], - 'new' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], - ], - 'socket_setopt' => [ - 'old' => ['void', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], - 'new' => ['void', 'socket'=>'Socket', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], - ], - 'socket_shutdown' => [ - 'old' => ['bool', 'socket'=>'resource', 'how='=>'int'], - 'new' => ['bool', 'socket'=>'Socket', 'how='=>'int'], - ], - 'socket_strerror' => [ - 'old' => ['string', 'errno'=>'int'], - 'new' => ['string', 'errno'=>'int'], - ], - 'socket_write' => [ - 'old' => ['int|false', 'socket'=>'resource', 'data'=>'string', 'length='=>'int'], - 'new' => ['int|false', 'socket'=>'Socket', 'data'=>'string', 'length='=>'int|null'], - ], - 'socket_wsaprotocol_info_export' => [ - 'old' => ['string|false', 'socket'=>'resource', 'process_id'=>'int'], - 'new' => ['string|false', 'socket'=>'Socket', 'process_id'=>'int'], - ], - 'socket_wsaprotocol_info_import' => [ - 'old' => ['resource|false', 'info_id'=>'string'], - 'new' => ['Socket|false', 'info_id'=>'string'], - ], - 'strchr' => [ - 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], - 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], - ], - 'strftime' => [ - 'old' => ['string|false', 'format'=>'string', 'timestamp='=>'int'], - 'new' => ['string|false', 'format'=>'string', 'timestamp='=>'?int'], - ], - 'stripos' => [ - 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], - 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], - ], - 'stristr' => [ - 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], - 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], - ], - 'strpos' => [ - 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], - 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], - ], - 'strrchr' => [ - 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int'], - 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string'], - ], - 'strripos' => [ - 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], - 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], - ], - 'strrpos' => [ - 'old' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], - 'new' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], - ], - 'strstr' => [ - 'old' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], - 'new' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], - ], - 'timezone_identifiers_list' => [ - 'old' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'?string'], - 'new' => ['list', 'timezoneGroup='=>'int', 'countryCode='=>'?string'], - ], - 'xml_get_current_byte_index' => [ - 'old' => ['int|false', 'parser'=>'resource'], - 'new' => ['int|false', 'parser'=>'XMLParser'], - ], - 'xml_get_current_column_number' => [ - 'old' => ['int|false', 'parser'=>'resource'], - 'new' => ['int|false', 'parser'=>'XMLParser'], - ], - 'xml_get_current_line_number' => [ - 'old' => ['int|false', 'parser'=>'resource'], - 'new' => ['int|false', 'parser'=>'XMLParser'], - ], - 'xml_get_error_code' => [ - 'old' => ['int|false', 'parser'=>'resource'], - 'new' => ['int|false', 'parser'=>'XMLParser'], - ], - 'xml_parse' => [ - 'old' => ['int', 'parser'=>'resource', 'data'=>'string', 'is_final='=>'bool'], - 'new' => ['int', 'parser'=>'XMLParser', 'data'=>'string', 'is_final='=>'bool'], - ], - 'xml_parse_into_struct' => [ - 'old' => ['int', 'parser'=>'resource', 'data'=>'string', '&w_values'=>'array', '&w_index='=>'array'], - 'new' => ['int', 'parser'=>'XMLParser', 'data'=>'string', '&w_values'=>'array', '&w_index='=>'array'], - ], - 'xml_parser_create' => [ - 'old' => ['resource', 'encoding='=>'string'], - 'new' => ['XMLParser', 'encoding='=>'string'], - ], - 'xml_parser_create_ns' => [ - 'old' => ['resource', 'encoding='=>'string', 'separator='=>'string'], - 'new' => ['XMLParser', 'encoding='=>'string', 'separator='=>'string'], - ], - 'xml_parser_free' => [ - 'old' => ['bool', 'parser'=>'resource'], - 'new' => ['bool', 'parser'=>'XMLParser'], - ], - 'xml_parser_get_option' => [ - 'old' => ['mixed|false', 'parser'=>'resource', 'option'=>'int'], - 'new' => ['mixed|false', 'parser'=>'XMLParser', 'option'=>'int'], - ], - 'xml_parser_set_option' => [ - 'old' => ['bool', 'parser'=>'resource', 'option'=>'int', 'value'=>'mixed'], - 'new' => ['bool', 'parser'=>'XMLParser', 'option'=>'int', 'value'=>'mixed'], - ], - 'xml_set_character_data_handler' => [ - 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], - ], - 'xml_set_default_handler' => [ - 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], - ], - 'xml_set_element_handler' => [ - 'old' => ['bool', 'parser'=>'resource', 'start_handler'=>'callable', 'end_handler'=>'callable'], - 'new' => ['bool', 'parser'=>'XMLParser', 'start_handler'=>'callable', 'end_handler'=>'callable'], - ], - 'xml_set_end_namespace_decl_handler' => [ - 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], - ], - 'xml_set_external_entity_ref_handler' => [ - 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], - ], - 'xml_set_notation_decl_handler' => [ - 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], - ], - 'xml_set_object' => [ - 'old' => ['bool', 'parser'=>'resource', 'object'=>'object'], - 'new' => ['bool', 'parser'=>'XMLParser', 'object'=>'object'], - ], - 'xml_set_processing_instruction_handler' => [ - 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], - ], - 'xml_set_start_namespace_decl_handler' => [ - 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], - ], - 'xml_set_unparsed_entity_decl_handler' => [ - 'old' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'new' => ['bool', 'parser'=>'XMLParser', 'handler'=>'callable'], - ], - 'xmlwriter_end_attribute' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_end_cdata' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_end_comment' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_end_document' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_end_dtd' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_end_dtd_attlist' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_end_dtd_element' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_end_dtd_entity' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_end_element' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_end_pi' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_flush' => [ - 'old' => ['string|int|false', 'writer'=>'resource', 'empty='=>'bool'], - 'new' => ['string|int', 'writer'=>'XMLWriter', 'empty='=>'bool'], - ], - 'xmlwriter_full_end_element' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_open_memory' => [ - 'old' => ['resource|false'], - 'new' => ['XMLWriter|false'], - ], - 'xmlwriter_open_uri' => [ - 'old' => ['resource|false', 'uri'=>'string'], - 'new' => ['XMLWriter|false', 'uri'=>'string'], - ], - 'xmlwriter_output_memory' => [ - 'old' => ['string', 'writer'=>'resource', 'flush='=>'bool'], - 'new' => ['string', 'writer'=>'XMLWriter', 'flush='=>'bool'], - ], - 'xmlwriter_set_indent' => [ - 'old' => ['bool', 'writer'=>'resource', 'enable'=>'bool'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'enable'=>'bool'], - ], - 'xmlwriter_set_indent_string' => [ - 'old' => ['bool', 'writer'=>'resource', 'indentation'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'indentation'=>'string'], - ], - 'xmlwriter_start_attribute' => [ - 'old' => ['bool', 'writer'=>'resource', 'name'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], - ], - 'xmlwriter_start_attribute_ns' => [ - 'old' => ['bool', 'writer'=>'resource', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], - ], - 'xmlwriter_start_cdata' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_start_comment' => [ - 'old' => ['bool', 'writer'=>'resource'], - 'new' => ['bool', 'writer'=>'XMLWriter'], - ], - 'xmlwriter_start_document' => [ - 'old' => ['bool', 'writer'=>'resource', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], - ], - 'xmlwriter_start_dtd' => [ - 'old' => ['bool', 'writer'=>'resource', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], - ], - 'xmlwriter_start_dtd_attlist' => [ - 'old' => ['bool', 'writer'=>'resource', 'name'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], - ], - 'xmlwriter_start_dtd_element' => [ - 'old' => ['bool', 'writer'=>'resource', 'qualifiedName'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'qualifiedName'=>'string'], - ], - 'xmlwriter_start_dtd_entity' => [ - 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'isParam'=>'bool'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'isParam'=>'bool'], - ], - 'xmlwriter_start_element' => [ - 'old' => ['bool', 'writer'=>'resource', 'name'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string'], - ], - 'xmlwriter_start_element_ns' => [ - 'old' => ['bool', 'writer'=>'resource', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], - ], - 'xmlwriter_start_pi' => [ - 'old' => ['bool', 'writer'=>'resource', 'target'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'target'=>'string'], - ], - 'xmlwriter_text' => [ - 'old' => ['bool', 'writer'=>'resource', 'content'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], - ], - 'xmlwriter_write_attribute' => [ - 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'value'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'value'=>'string'], - ], - 'xmlwriter_write_attribute_ns' => [ - 'old' => ['bool', 'writer'=>'resource', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], - ], - 'xmlwriter_write_cdata' => [ - 'old' => ['bool', 'writer'=>'resource', 'content'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], - ], - 'xmlwriter_write_comment' => [ - 'old' => ['bool', 'writer'=>'resource', 'content'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], - ], - 'xmlwriter_write_dtd' => [ - 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], - ], - 'xmlwriter_write_dtd_attlist' => [ - 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string'], - ], - 'xmlwriter_write_dtd_element' => [ - 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string'], - ], - 'xmlwriter_write_dtd_entity' => [ - 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string', 'isParam'=>'bool', 'publicId'=>'string', 'systemId'=>'string', 'notationData'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content'=>'string', 'isParam='=>'bool', 'publicId='=>'?string', 'systemId='=>'?string', 'notationData='=>'?string'], - ], - 'xmlwriter_write_element' => [ - 'old' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'?string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'name'=>'string', 'content='=>'?string'], - ], - 'xmlwriter_write_element_ns' => [ - 'old' => ['bool', 'writer'=>'resource', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'string', 'content'=>'?string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'content='=>'?string'], - ], - 'xmlwriter_write_pi' => [ - 'old' => ['bool', 'writer'=>'resource', 'target'=>'string', 'content'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'target'=>'string', 'content'=>'string'], - ], - 'xmlwriter_write_raw' => [ - 'old' => ['bool', 'writer'=>'resource', 'content'=>'string'], - 'new' => ['bool', 'writer'=>'XMLWriter', 'content'=>'string'], - ], - ], - 'removed' => [ - 'PDOStatement::setFetchMode\'1' => ['bool', 'fetch_column'=>'int', 'colno'=>'int'], - 'PDOStatement::setFetchMode\'2' => ['bool', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs'=>'array'], - 'PDOStatement::setFetchMode\'3' => ['bool', 'fetch_into'=>'int', 'object'=>'object'], - 'ReflectionType::isBuiltin' => ['bool'], - 'SplFileObject::fgetss' => ['string|false', 'allowable_tags='=>'string'], - 'create_function' => ['string', 'args'=>'string', 'code'=>'string'], - 'each' => ['array{0:int|string,key:int|string,1:mixed,value:mixed}', '&r_arr'=>'array'], - 'gmp_random' => ['GMP', 'limiter='=>'int'], - 'gzgetss' => ['string|false', 'zp'=>'resource', 'length'=>'int', 'allowable_tags='=>'string'], - 'image2wbmp' => ['bool', 'im'=>'resource', 'filename='=>'?string', 'threshold='=>'int'], - 'jpeg2wbmp' => ['bool', 'jpegname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'], - 'ldap_control_paged_result' => ['bool', 'link_identifier'=>'resource', 'pagesize'=>'int', 'iscritical='=>'bool', 'cookie='=>'string'], - 'ldap_control_paged_result_response' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', '&w_cookie'=>'string', '&w_estimated'=>'int'], - 'ldap_sort' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', 'sortfilter'=>'string'], - 'number_format\'1' => ['string', 'num'=>'float|int', 'decimals'=>'int', 'decimal_separator'=>'?string', 'thousands_separator'=>'?string'], - 'png2wbmp' => ['bool', 'pngname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'], - 'read_exif_data' => ['array', 'filename'=>'string', 'sections_needed='=>'string', 'sub_arrays='=>'bool', 'read_thumbnail='=>'bool'], - 'SimpleXMLIterator::rewind' => ['void'], - 'SimpleXMLIterator::valid' => ['bool'], - 'SimpleXMLIterator::current' => ['?SimpleXMLIterator'], - 'SimpleXMLIterator::key' => ['string|false'], - 'SimpleXMLIterator::next' => ['void'], - 'SimpleXMLIterator::hasChildren' => ['bool'], - 'SimpleXMLIterator::getChildren' => ['SimpleXMLIterator'], - ], -]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php deleted file mode 100644 index b6cae16f..00000000 --- a/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php +++ /dev/null @@ -1,1133 +0,0 @@ - [ - 'array_is_list' => ['bool', 'array' => 'array'], - 'enum_exists' => ['bool', 'enum' => 'class-string', 'autoload=' => 'bool'], - 'fsync' => ['bool', 'stream' => 'resource'], - 'fdatasync' => ['bool', 'stream' => 'resource'], - 'imageavif' => ['bool', 'image'=>'GdImage', 'file='=>'resource|string|null', 'quality='=>'int', 'speed='=>'int'], - 'imagecreatefromavif' => ['false|GdImage', 'filename'=>'string'], - 'mysqli_fetch_column' => ['null|int|float|string|false', 'result'=>'mysqli_result', 'column='=>'int'], - 'mysqli_result::fetch_column' => ['null|int|float|string|false', 'column='=>'int'], - 'CURLStringFile::__construct' => ['void', 'data'=>'string', 'postname'=>'string', 'mime='=>'string'], - 'Fiber::__construct' => ['void', 'callback'=>'callable'], - 'Fiber::start' => ['mixed', '...args'=>'mixed'], - 'Fiber::resume' => ['mixed', 'value='=>'null|mixed'], - 'Fiber::throw' => ['mixed', 'exception'=>'Throwable'], - 'Fiber::isStarted' => ['bool'], - 'Fiber::isSuspended' => ['bool'], - 'Fiber::isRunning' => ['bool'], - 'Fiber::isTerminated' => ['bool'], - 'Fiber::getReturn' => ['mixed'], - 'Fiber::getCurrent' => ['?self'], - 'Fiber::suspend' => ['mixed', 'value='=>'null|mixed'], - 'FiberError::__construct' => ['void'], - 'ReflectionClass::isEnum' => ['bool'], - 'ReflectionEnum::getBackingType' => ['?ReflectionType'], - 'ReflectionEnum::getCase' => ['ReflectionEnumUnitCase', 'name' => 'string'], - 'ReflectionEnum::getCases' => ['list'], - 'ReflectionEnum::hasCase' => ['bool', 'name' => 'string'], - 'ReflectionEnum::isBacked' => ['bool'], - 'ReflectionEnumUnitCase::getEnum' => ['ReflectionEnum'], - 'ReflectionEnumUnitCase::getValue' => ['UnitEnum'], - 'ReflectionEnumBackedCase::getBackingValue' => ['string|int'], - 'ReflectionFunctionAbstract::getTentativeReturnType' => ['?ReflectionType'], - 'ReflectionFunctionAbstract::hasTentativeReturnType' => ['bool'], - 'ReflectionFunctionAbstract::isStatic' => ['bool'], - 'ReflectionObject::isEnum' => ['bool'], - ], - - 'changed' => [ - 'finfo_buffer' => [ - 'old' => ['string|false', 'finfo'=>'resource', 'string'=>'string', 'flags='=>'int', 'context='=>'resource'], - 'new' => ['string|false', 'finfo'=>'finfo', 'string'=>'string', 'flags='=>'int', 'context='=>'resource'], - ], - 'finfo_close' => [ - 'old' => ['bool', 'finfo'=>'resource'], - 'new' => ['bool', 'finfo'=>'finfo'], - ], - 'finfo_file' => [ - 'old' => ['string|false', 'finfo'=>'resource', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], - 'new' => ['string|false', 'finfo'=>'finfo', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], - ], - 'finfo_open' => [ - 'old' => ['resource|false', 'flags='=>'int', 'magic_database='=>'string'], - 'new' => ['finfo|false', 'flags='=>'int', 'magic_database='=>'string'], - ], - 'finfo_set_flags' => [ - 'old' => ['bool', 'finfo'=>'resource', 'flags'=>'int'], - 'new' => ['bool', 'finfo'=>'finfo', 'flags'=>'int'], - ], - 'fputcsv' => [ - 'old' => ['int|false', 'stream'=>'resource', 'fields'=>'array', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'new' => ['int|false', 'stream'=>'resource', 'fields'=>'array', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string', 'eol='=>'string'], - ], - 'ftp_connect' => [ - 'old' => ['resource|false', 'hostname' => 'string', 'port=' => 'int', 'timeout=' => 'int'], - 'new' => ['FTP\Connection|false', 'hostname' => 'string', 'port=' => 'int', 'timeout=' => 'int'], - ], - 'ftp_ssl_connect' => [ - 'old' => ['resource|false', 'hostname' => 'string', 'port=' => 'int', 'timeout=' => 'int'], - 'new' => ['FTP\Connection|false', 'hostname' => 'string', 'port=' => 'int', 'timeout=' => 'int'], - ], - 'ftp_login' => [ - 'old' => ['bool', 'ftp' => 'resource', 'username' => 'string', 'password' => 'string'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'username' => 'string', 'password' => 'string'], - ], - 'ftp_pwd' => [ - 'old' => ['string|false', 'ftp' => 'resource'], - 'new' => ['string|false', 'ftp' => 'FTP\Connection'], - ], - 'ftp_cdup' => [ - 'old' => ['bool', 'ftp' => 'resource'], - 'new' => ['bool', 'ftp' => 'FTP\Connection'], - ], - 'ftp_chdir' => [ - 'old' => ['bool', 'ftp' => 'resource', 'directory' => 'string'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'directory' => 'string'], - ], - 'ftp_exec' => [ - 'old' => ['bool', 'ftp' => 'resource', 'command' => 'string'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'command' => 'string'], - ], - 'ftp_raw' => [ - 'old' => ['?array', 'ftp' => 'resource', 'command' => 'string'], - 'new' => ['?array', 'ftp' => 'FTP\Connection', 'command' => 'string'], - ], - 'ftp_mkdir' => [ - 'old' => ['string|false', 'ftp' => 'resource', 'directory' => 'string'], - 'new' => ['string|false', 'ftp' => 'FTP\Connection', 'directory' => 'string'], - ], - 'ftp_rmdir' => [ - 'old' => ['bool', 'ftp' => 'resource', 'directory' => 'string'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'directory' => 'string'], - ], - 'ftp_chmod' => [ - 'old' => ['int|false', 'ftp' => 'resource', 'permissions' => 'int', 'filename' => 'string'], - 'new' => ['int|false', 'ftp' => 'FTP\Connection', 'permissions' => 'int', 'filename' => 'string'], - ], - 'ftp_alloc' => [ - 'old' => ['bool', 'ftp' => 'resource', 'size' => 'int', '&w_response=' => 'string'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'size' => 'int', '&w_response=' => 'string'], - ], - 'ftp_nlist' => [ - 'old' => ['array|false', 'ftp' => 'resource', 'directory' => 'string'], - 'new' => ['array|false', 'ftp' => 'FTP\Connection', 'directory' => 'string'], - ], - 'ftp_rawlist' => [ - 'old' => ['array|false', 'ftp' => 'resource', 'directory' => 'string', 'recursive=' => 'bool'], - 'new' => ['array|false', 'ftp' => 'FTP\Connection', 'directory' => 'string', 'recursive=' => 'bool'], - ], - 'ftp_mlsd' => [ - 'old' => ['array|false', 'ftp' => 'resource', 'directory' => 'string'], - 'new' => ['array|false', 'ftp' => 'FTP\Connection', 'directory' => 'string'], - ], - 'ftp_systype' => [ - 'old' => ['string|false', 'ftp' => 'resource'], - 'new' => ['string|false', 'ftp' => 'FTP\Connection'], - ], - 'ftp_fget' => [ - 'old' => ['bool', 'ftp' => 'resource', 'stream' => 'resource', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'stream' => 'resource', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - ], - 'ftp_nb_fget' => [ - 'old' => ['int', 'ftp' => 'resource', 'stream' => 'resource', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - 'new' => ['int', 'ftp' => 'FTP\Connection', 'stream' => 'resource', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - ], - 'ftp_pasv' => [ - 'old' => ['bool', 'ftp' => 'resource', 'enable' => 'bool'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'enable' => 'bool'], - ], - 'ftp_get' => [ - 'old' => ['bool', 'ftp' => 'resource', 'local_filename' => 'string', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'local_filename' => 'string', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - ], - 'ftp_nb_get' => [ - 'old' => ['int', 'ftp' => 'resource', 'local_filename' => 'string', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - 'new' => ['int', 'ftp' => 'FTP\Connection', 'local_filename' => 'string', 'remote_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - ], - 'ftp_nb_continue' => [ - 'old' => ['int', 'ftp' => 'resource'], - 'new' => ['int', 'ftp' => 'FTP\Connection'], - ], - 'ftp_fput' => [ - 'old' => ['bool', 'ftp' => 'resource', 'remote_filename' => 'string', 'stream' => 'resource', 'mode=' => 'int', 'offset=' => 'int'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'remote_filename' => 'string', 'stream' => 'resource', 'mode=' => 'int', 'offset=' => 'int'], - ], - 'ftp_nb_fput' => [ - 'old' => ['int', 'ftp' => 'resource', 'remote_filename' => 'string', 'stream' => 'resource', 'mode=' => 'int', 'offset=' => 'int'], - 'new' => ['int', 'ftp' => 'FTP\Connection', 'remote_filename' => 'string', 'stream' => 'resource', 'mode=' => 'int', 'offset=' => 'int'], - ], - 'ftp_put' => [ - 'old' => ['bool', 'ftp' => 'resource', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - ], - 'ftp_append' => [ - 'old' => ['bool', 'ftp' => 'resource', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int'], - ], - 'ftp_nb_put' => [ - 'old' => ['int', 'ftp' => 'resource', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - 'new' => ['int', 'ftp' => 'FTP\Connection', 'remote_filename' => 'string', 'local_filename' => 'string', 'mode=' => 'int', 'offset=' => 'int'], - ], - 'ftp_size' => [ - 'old' => ['int', 'ftp' => 'resource', 'filename' => 'string'], - 'new' => ['int', 'ftp' => 'FTP\Connection', 'filename' => 'string'], - ], - 'ftp_mdtm' => [ - 'old' => ['int', 'ftp' => 'resource', 'filename' => 'string'], - 'new' => ['int', 'ftp' => 'FTP\Connection', 'filename' => 'string'], - ], - 'ftp_rename' => [ - 'old' => ['bool', 'ftp' => 'resource', 'from' => 'string', 'to' => 'string'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'from' => 'string', 'to' => 'string'], - ], - 'ftp_delete' => [ - 'old' => ['bool', 'ftp' => 'resource', 'filename' => 'string'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'filename' => 'string'], - ], - 'ftp_site' => [ - 'old' => ['bool', 'ftp' => 'resource', 'command' => 'string'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'command' => 'string'], - ], - 'ftp_close' => [ - 'old' => ['bool', 'ftp' => 'resource'], - 'new' => ['bool', 'ftp' => 'FTP\Connection'], - ], - 'ftp_quit' => [ - 'old' => ['bool', 'ftp' => 'resource'], - 'new' => ['bool', 'ftp' => 'FTP\Connection'], - ], - 'ftp_set_option' => [ - 'old' => ['bool', 'ftp' => 'resource', 'option' => 'int', 'value' => 'mixed'], - 'new' => ['bool', 'ftp' => 'FTP\Connection', 'option' => 'int', 'value' => 'mixed'], - ], - 'ftp_get_option' => [ - 'old' => ['mixed|false', 'ftp' => 'resource', 'option' => 'int'], - 'new' => ['mixed|false', 'ftp' => 'FTP\Connection', 'option' => 'int'], - ], - 'hash' => [ - 'old' => ['string|false', 'algo'=>'string', 'data'=>'string', 'binary='=>'bool'], - 'new' => ['string|false', 'algo'=>'string', 'data'=>'string', 'binary='=>'bool', 'options='=>'array'], - ], - 'hash_file' => [ - 'old' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'binary='=>'bool'], - 'new' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'binary='=>'bool', 'options='=>'array'], - ], - 'hash_init' => [ - 'old' => ['HashContext', 'algo'=>'string', 'flags='=>'int', 'key='=>'string'], - 'new' => ['HashContext', 'algo'=>'string', 'flags='=>'int', 'key='=>'string', 'options='=>'array'], - ], - 'imap_append' => [ - 'old' => ['bool', 'imap'=>'resource', 'folder'=>'string', 'message'=>'string', 'options='=>'string', 'internal_date='=>'string'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'folder'=>'string', 'message'=>'string', 'options='=>'string', 'internal_date='=>'string'], - ], - 'imap_body' => [ - 'old' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'new' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], - ], - 'imap_bodystruct' => [ - 'old' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string'], - 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string'], - ], - 'imap_check' => [ - 'old' => ['stdClass|false', 'imap'=>'resource'], - 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection'], - ], - 'imap_clearflag_full' => [ - 'old' => ['bool', 'imap'=>'resource', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], - ], - 'imap_close' => [ - 'old' => ['bool', 'imap'=>'resource', 'flags='=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'flags='=>'int'], - ], - 'imap_create' => [ - 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], - ], - 'imap_createmailbox' => [ - 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], - ], - 'imap_delete' => [ - 'old' => ['bool', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], - ], - 'imap_deletemailbox' => [ - 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], - ], - 'imap_expunge' => [ - 'old' => ['bool', 'imap'=>'resource'], - 'new' => ['bool', 'imap'=>'IMAP\Connection'], - ], - 'imap_fetch_overview' => [ - 'old' => ['array|false', 'imap'=>'resource', 'sequence'=>'string', 'flags='=>'int'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flags='=>'int'], - ], - 'imap_fetchbody' => [ - 'old' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], - 'new' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], - ], - 'imap_fetchheader' => [ - 'old' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'new' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], - ], - 'imap_fetchmime' => [ - 'old' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], - 'new' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], - ], - 'imap_fetchstructure' => [ - 'old' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], - ], - 'imap_fetchtext' => [ - 'old' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'new' => ['string|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], - ], - 'imap_gc' => [ - 'old' => ['bool', 'imap'=>'resource', 'flags'=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'flags'=>'int'], - ], - 'imap_get_quota' => [ - 'old' => ['array|false', 'imap'=>'resource', 'quota_root'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'quota_root'=>'string'], - ], - 'imap_get_quotaroot' => [ - 'old' => ['array|false', 'imap'=>'resource', 'mailbox'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], - ], - 'imap_getacl' => [ - 'old' => ['array|false', 'imap'=>'resource', 'mailbox'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], - ], - 'imap_getmailboxes' => [ - 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], - ], - 'imap_getsubscribed' => [ - 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], - ], - 'imap_headerinfo' => [ - 'old' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string|null'], - 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string|null'], - ], - 'imap_headers' => [ - 'old' => ['array|false', 'imap'=>'resource'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection'], - ], - 'imap_list' => [ - 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], - ], - 'imap_listmailbox' => [ - 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], - ], - 'imap_listscan' => [ - 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], - ], - 'imap_listsubscribed' => [ - 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], - ], - 'imap_lsub' => [ - 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string'], - ], - 'imap_mail_copy' => [ - 'old' => ['bool', 'imap'=>'resource', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], - ], - 'imap_mail_move' => [ - 'old' => ['bool', 'imap'=>'resource', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], - ], - 'imap_mailboxmsginfo' => [ - 'old' => ['stdClass|false', 'imap'=>'resource'], - 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection'], - ], - 'imap_msgno' => [ - 'old' => ['int|false', 'imap'=>'resource', 'message_uid'=>'int'], - 'new' => ['int|false', 'imap'=>'IMAP\Connection', 'message_uid'=>'int'], - ], - 'imap_num_msg' => [ - 'old' => ['int|false', 'imap'=>'resource'], - 'new' => ['int|false', 'imap'=>'IMAP\Connection'], - ], - 'imap_num_recent' => [ - 'old' => ['int|false', 'imap'=>'resource'], - 'new' => ['int|false', 'imap'=>'IMAP\Connection'], - ], - 'imap_open' => [ - 'old' => ['resource|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'flags='=>'int', 'retries='=>'int', 'options='=>'?array'], - 'new' => ['IMAP\Connection|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'flags='=>'int', 'retries='=>'int', 'options='=>'?array'], - ], - 'imap_ping' => [ - 'old' => ['bool', 'imap'=>'resource'], - 'new' => ['bool', 'imap'=>'IMAP\Connection'], - ], - 'imap_rename' => [ - 'old' => ['bool', 'imap'=>'resource', 'from'=>'string', 'to'=>'string'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'from'=>'string', 'to'=>'string'], - ], - 'imap_renamemailbox' => [ - 'old' => ['bool', 'imap'=>'resource', 'from'=>'string', 'to'=>'string'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'from'=>'string', 'to'=>'string'], - ], - 'imap_reopen' => [ - 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string', 'flags='=>'int', 'retries='=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'flags='=>'int', 'retries='=>'int'], - ], - 'imap_savebody' => [ - 'old' => ['bool', 'imap'=>'resource', 'file'=>'string|resource', 'message_num'=>'int', 'section='=>'string', 'flags='=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'file'=>'string|resource', 'message_num'=>'int', 'section='=>'string', 'flags='=>'int'], - ], - 'imap_scan' => [ - 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], - ], - 'imap_scanmailbox' => [ - 'old' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], - ], - 'imap_search' => [ - 'old' => ['array|false', 'imap'=>'resource', 'criteria'=>'string', 'flags='=>'int', 'charset='=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'criteria'=>'string', 'flags='=>'int', 'charset='=>'string'], - ], - 'imap_set_quota' => [ - 'old' => ['bool', 'imap'=>'resource', 'quota_root'=>'string', 'mailbox_size'=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'quota_root'=>'string', 'mailbox_size'=>'int'], - ], - 'imap_setacl' => [ - 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string', 'user_id'=>'string', 'rights'=>'string'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'user_id'=>'string', 'rights'=>'string'], - ], - 'imap_setflag_full' => [ - 'old' => ['bool', 'imap'=>'resource', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], - ], - 'imap_sort' => [ - 'old' => ['array|false', 'imap'=>'resource', 'criteria'=>'int', 'reverse'=>'int', 'flags='=>'int', 'search_criteria='=>'string', 'charset='=>'string'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'criteria'=>'int', 'reverse'=>'int', 'flags='=>'int', 'search_criteria='=>'string', 'charset='=>'string'], - ], - 'imap_status' => [ - 'old' => ['stdClass|false', 'imap'=>'resource', 'mailbox'=>'string', 'flags'=>'int'], - 'new' => ['stdClass|false', 'imap'=>'IMAP\Connection', 'mailbox'=>'string', 'flags'=>'int'], - ], - 'imap_subscribe' => [ - 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], - ], - 'imap_thread' => [ - 'old' => ['array|false', 'imap'=>'resource', 'flags='=>'int'], - 'new' => ['array|false', 'imap'=>'IMAP\Connection', 'flags='=>'int'], - ], - 'imap_uid' => [ - 'old' => ['int|false', 'imap'=>'resource', 'message_num'=>'int'], - 'new' => ['int|false', 'imap'=>'IMAP\Connection', 'message_num'=>'int'], - ], - 'imap_undelete' => [ - 'old' => ['bool', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'message_num'=>'int', 'flags='=>'int'], - ], - 'imap_unsubscribe' => [ - 'old' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], - 'new' => ['bool', 'imap'=>'IMAP\Connection', 'mailbox'=>'string'], - ], - 'ini_set' => [ - 'old' => ['string|false', 'option'=>'string', 'value'=>'string'], - 'new' => ['string|false', 'option'=>'string', 'value'=>'string|int|float|bool|null'], - ], - 'ldap_add' => [ - 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], - ], - 'ldap_add_ext' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], - 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], - ], - 'ldap_bind' => [ - 'old' => ['bool', 'ldap'=>'resource', 'dn='=>'string|null', 'password='=>'string|null'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn='=>'string|null', 'password='=>'string|null'], - ], - 'ldap_bind_ext' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'dn='=>'string|null', 'password='=>'string|null', 'controls='=>'array'], - 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn='=>'string|null', 'password='=>'string|null', 'controls='=>'?array'], - ], - 'ldap_close' => [ - 'old' => ['bool', 'ldap'=>'resource'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection'], - ], - 'ldap_compare' => [ - 'old' => ['bool|int', 'ldap'=>'resource', 'dn'=>'string', 'attribute'=>'string', 'value'=>'string'], - 'new' => ['bool|int', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'attribute'=>'string', 'value'=>'string', 'controls='=>'?array'], - ], - 'ldap_connect' => [ - 'old' => ['resource|false', 'uri='=>'string', 'port='=>'int', 'wallet='=>'string', 'password='=>'string', 'auth_mode='=>'int'], - 'new' => ['LDAP\Connection|false', 'uri='=>'string', 'port='=>'int', 'wallet='=>'string', 'password='=>'string', 'auth_mode='=>'int'], - ], - 'ldap_count_entries' => [ - 'old' => ['int|false', 'ldap'=>'resource', 'result'=>'resource'], - 'new' => ['int|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], - ], - 'ldap_delete' => [ - 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'controls='=>'?array'], - ], - 'ldap_delete_ext' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'controls='=>'array'], - 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'controls='=>'?array'], - ], - 'ldap_errno' => [ - 'old' => ['int', 'ldap'=>'resource'], - 'new' => ['int', 'ldap'=>'LDAP\Connection'], - ], - 'ldap_error' => [ - 'old' => ['string', 'ldap'=>'resource'], - 'new' => ['string', 'ldap'=>'LDAP\Connection'], - ], - 'ldap_exop' => [ - 'old' => ['mixed', 'ldap'=>'resource', 'reqoid'=>'string', 'reqdata='=>'string', 'serverctrls='=>'array|null', '&w_response_data='=>'string', '&w_response_oid='=>'string'], - 'new' => ['mixed', 'ldap'=>'LDAP\Connection', 'request_oid'=>'string', 'request_data='=>'string', 'controls='=>'?array', '&w_response_data='=>'string', '&w_response_oid='=>'string'], - ], - 'ldap_exop_passwd' => [ - 'old' => ['bool|string', 'ldap'=>'resource', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array|null'], - 'new' => ['bool|string', 'ldap'=>'LDAP\Connection', 'user='=>'string', 'old_password='=>'string', 'new_password='=>'string', '&w_controls='=>'array|null'], - ], - 'ldap_exop_refresh' => [ - 'old' => ['int|false', 'ldap'=>'resource', 'dn'=>'string', 'ttl'=>'int'], - 'new' => ['int|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'ttl'=>'int'], - ], - 'ldap_exop_whoami' => [ - 'old' => ['string|false', 'ldap'=>'resource'], - 'new' => ['string|false', 'ldap'=>'LDAP\Connection'], - ], - 'ldap_first_attribute' => [ - 'old' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], - 'new' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], - ], - 'ldap_first_entry' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], - 'new' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], - ], - 'ldap_first_reference' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], - 'new' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], - ], - 'ldap_free_result' => [ - 'old' => ['bool', 'ldap'=>'resource'], - 'new' => ['bool', 'result'=>'LDAP\Result'], - ], - 'ldap_get_attributes' => [ - 'old' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource'], - 'new' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], - ], - 'ldap_get_dn' => [ - 'old' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], - 'new' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], - ], - 'ldap_get_entries' => [ - 'old' => ['array|false', 'ldap'=>'resource', 'result'=>'resource'], - 'new' => ['array|false', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result'], - ], - 'ldap_get_option' => [ - 'old' => ['bool', 'ldap'=>'resource', 'option'=>'int', '&w_value'=>'mixed'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'option'=>'int', '&w_value='=>'array|string|int|null'], - ], - 'ldap_get_values' => [ - 'old' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource', 'attribute'=>'string'], - 'new' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', 'attribute'=>'string'], - ], - 'ldap_get_values_len' => [ - 'old' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource', 'attribute'=>'string'], - 'new' => ['array|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', 'attribute'=>'string'], - ], - 'ldap_list' => [ - 'old' => ['resource|false', 'ldap'=>'resource|array', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], - 'new' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], - ], - 'ldap_mod_add' => [ - 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], - ], - 'ldap_mod_add_ext' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], - 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], - ], - 'ldap_mod_del' => [ - 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], - ], - 'ldap_mod_del_ext' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], - 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], - ], - 'ldap_mod_replace' => [ - 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], - ], - 'ldap_mod_replace_ext' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], - 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], - ], - 'ldap_modify' => [ - 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'entry'=>'array', 'controls='=>'?array'], - ], - 'ldap_modify_batch' => [ - 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'modifications_info'=>'array'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'modifications_info'=>'array', 'controls='=>'?array'], - ], - 'ldap_next_attribute' => [ - 'old' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], - 'new' => ['string|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], - ], - 'ldap_next_entry' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], - 'new' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], - ], - 'ldap_next_reference' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'entry'=>'resource'], - 'new' => ['LDAP\ResultEntry|false', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry'], - ], - 'ldap_parse_exop' => [ - 'old' => ['bool', 'ldap'=>'resource', 'result'=>'resource', '&w_response_data='=>'string', '&w_response_oid='=>'string'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result', '&w_response_data='=>'string', '&w_response_oid='=>'string'], - ], - 'ldap_parse_reference' => [ - 'old' => ['bool', 'ldap'=>'resource', 'entry'=>'resource', 'referrals'=>'array'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'entry'=>'LDAP\ResultEntry', '&w_referrals'=>'array'], - ], - 'ldap_parse_result' => [ - 'old' => ['bool', 'ldap'=>'resource', 'result'=>'resource', '&w_error_code'=>'int', '&w_matched_dn='=>'string', '&w_error_message='=>'string', '&w_referrals='=>'array', '&w_controls='=>'array'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'result'=>'LDAP\Result', '&w_error_code'=>'int', '&w_matched_dn='=>'string', '&w_error_message='=>'string', '&w_referrals='=>'array', '&w_controls='=>'array'], - ], - 'ldap_read' => [ - 'old' => ['resource|false', 'ldap'=>'resource|array', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], - 'new' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], - ], - 'ldap_rename' => [ - 'old' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'?array'], - ], - 'ldap_rename_ext' => [ - 'old' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'array'], - 'new' => ['LDAP\Result|false', 'ldap'=>'LDAP\Connection', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'?array'], - ], - 'ldap_sasl_bind' => [ - 'old' => ['bool', 'ldap'=>'resource', 'dn='=>'string', 'password='=>'string', 'mech='=>'string', 'realm='=>'string', 'authc_id='=>'string', 'authz_id='=>'string', 'props='=>'string'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'dn='=>'string', 'password='=>'string', 'mech='=>'string', 'realm='=>'string', 'authc_id='=>'string', 'authz_id='=>'string', 'props='=>'string'], - ], - 'ldap_search' => [ - 'old' => ['resource|false', 'ldap'=>'resource|resource[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], - 'new' => ['LDAP\Result|LDAP\Result[]|false', 'ldap'=>'LDAP\Connection|LDAP\Connection[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'controls='=>'?array'], - ], - 'ldap_set_option' => [ - 'old' => ['bool', 'ldap'=>'resource|null', 'option'=>'int', 'value'=>'mixed'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection|null', 'option'=>'int', 'value'=>'mixed'], - ], - 'ldap_set_rebind_proc' => [ - 'old' => ['bool', 'ldap'=>'resource', 'callback'=>'?callable'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection', 'callback'=>'?callable'], - ], - 'ldap_start_tls' => [ - 'old' => ['bool', 'ldap'=>'resource'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection'], - ], - 'ldap_unbind' => [ - 'old' => ['bool', 'ldap'=>'resource'], - 'new' => ['bool', 'ldap'=>'LDAP\Connection'], - ], - 'mysqli::connect' => [ - 'old' => ['null|false', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], - 'new' => ['bool', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null'], - ], - 'mysqli_execute' => [ - 'old' => ['bool', 'statement' => 'mysqli_stmt'], - 'new' => ['bool', 'statement' => 'mysqli_stmt', 'params=' => 'list|null'], - ], - 'mysqli_stmt_execute' => [ - 'old' => ['bool', 'statement' => 'mysqli_stmt'], - 'new' => ['bool', 'statement' => 'mysqli_stmt', 'params=' => 'list|null'], - ], - 'mysqli_stmt::execute' => [ - 'old' => ['bool'], - 'new' => ['bool', 'params=' => 'list|null'], - ], - 'pg_affected_rows' => [ - 'old' => ['int', 'result' => 'resource'], - 'new' => ['int', 'result' => '\PgSql\Result'], - ], - 'pg_cancel_query' => [ - 'old' => ['bool', 'connection' => 'resource'], - 'new' => ['bool', 'connection' => '\PgSql\Connection'], - ], - 'pg_client_encoding' => [ - 'old' => ['string', 'connection=' => 'resource'], - 'new' => ['string', 'connection=' => '\PgSql\Connection'], - ], - 'pg_close' => [ - 'old' => ['bool', 'connection=' => 'resource'], - 'new' => ['bool', 'connection=' => '\PgSql\Connection'], - ], - 'pg_connect' => [ - 'old' => ['resource|false', 'connection_string' => 'string', 'flags=' => 'int'], - 'new' => ['\PgSql\Connection|false', 'connection_string' => 'string', 'flags=' => 'int'], - ], - 'pg_connect_poll' => [ - 'old' => ['int', 'connection' => 'resource'], - 'new' => ['int', 'connection' => '\PgSql\Connection'], - ], - 'pg_connection_busy' => [ - 'old' => ['bool', 'connection' => 'resource'], - 'new' => ['bool', 'connection' => '\PgSql\Connection'], - ], - 'pg_connection_reset' => [ - 'old' => ['bool', 'connection' => 'resource'], - 'new' => ['bool', 'connection' => '\PgSql\Connection'], - ], - 'pg_connection_status' => [ - 'old' => ['int', 'connection' => 'resource'], - 'new' => ['int', 'connection' => '\PgSql\Connection'], - ], - 'pg_consume_input' => [ - 'old' => ['bool', 'connection' => 'resource'], - 'new' => ['bool', 'connection' => '\PgSql\Connection'], - ], - 'pg_convert' => [ - 'old' => ['array|false', 'connection' => 'resource', 'table_name' => 'string', 'values' => 'array', 'flags=' => 'int'], - 'new' => ['array|false', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'values' => 'array', 'flags=' => 'int'], - ], - 'pg_copy_from' => [ - 'old' => ['bool', 'connection' => 'resource', 'table_name' => 'string', 'rows' => 'array', 'separator=' => 'string', 'null_as=' => 'string'], - 'new' => ['bool', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'rows' => 'array', 'separator=' => 'string', 'null_as=' => 'string'], - ], - 'pg_copy_to' => [ - 'old' => ['array|false', 'connection' => 'resource', 'table_name' => 'string', 'separator=' => 'string', 'null_as=' => 'string'], - 'new' => ['array|false', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'separator=' => 'string', 'null_as=' => 'string'], - ], - 'pg_dbname' => [ - 'old' => ['string', 'connection=' => 'resource'], - 'new' => ['string', 'connection=' => '\PgSql\Connection'], - ], - 'pg_delete' => [ - 'old' => ['string|bool', 'connection' => 'resource', 'table_name' => 'string', 'conditions' => 'array', 'flags=' => 'int'], - 'new' => ['string|bool', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'conditions' => 'array', 'flags=' => 'int'], - ], - 'pg_end_copy' => [ - 'old' => ['bool', 'connection=' => 'resource'], - 'new' => ['bool', 'connection=' => '\PgSql\Connection'], - ], - 'pg_escape_bytea' => [ - 'old' => ['string', 'connection' => 'resource', 'string' => 'string'], - 'new' => ['string', 'connection' => '\PgSql\Connection', 'string' => 'string'], - ], - 'pg_escape_identifier' => [ - 'old' => ['string|false', 'connection' => 'resource', 'string' => 'string'], - 'new' => ['string|false', 'connection' => '\PgSql\Connection', 'string' => 'string'], - ], - 'pg_escape_literal' => [ - 'old' => ['string|false', 'connection' => 'resource', 'string' => 'string'], - 'new' => ['string|false', 'connection' => '\PgSql\Connection', 'string' => 'string'], - ], - 'pg_escape_string' => [ - 'old' => ['string', 'connection' => 'resource', 'string' => 'string'], - 'new' => ['string', 'connection' => '\PgSql\Connection', 'string' => 'string'], - ], - 'pg_exec' => [ - 'old' => ['resource|false', 'connection' => 'resource', 'query' => 'string'], - 'new' => ['\PgSql\Result|false', 'connection' => '\PgSql\Connection', 'query' => 'string'], - ], - 'pg_execute' => [ - 'old' => ['resource|false', 'connection' => 'resource', 'statement_name' => 'string', 'params' => 'array'], - 'new' => ['\PgSql\Result|false', 'connection' => '\PgSql\Connection', 'statement_name' => 'string', 'params' => 'array'], - ], - 'pg_execute\'1' => [ - 'old' => ['resource|false', 'connection' => 'string', 'statement_name' => 'array'], - 'new' => ['\PgSql\Result|false', 'connection' => 'string', 'statement_name' => 'array'], - ], - 'pg_fetch_all' => [ - 'old' => ['array', 'result' => 'resource', 'result_type=' => 'int'], - 'new' => ['array', 'result' => '\PgSql\Result', 'result_type=' => 'int'], - ], - 'pg_fetch_all_columns' => [ - 'old' => ['array', 'result' => 'resource', 'field=' => 'int'], - 'new' => ['array', 'result' => '\PgSql\Result', 'field=' => 'int'], - ], - 'pg_fetch_array' => [ - 'old' => ['array|false', 'result' => 'resource', 'row=' => '?int', 'mode=' => 'int'], - 'new' => ['array|false', 'result' => '\PgSql\Result', 'row=' => '?int', 'mode=' => 'int'], - ], - 'pg_fetch_assoc' => [ - 'old' => ['array|false', 'result' => 'resource', 'row=' => '?int'], - 'new' => ['array|false', 'result' => '\PgSql\Result', 'row=' => '?int'], - ], - 'pg_fetch_object' => [ - 'old' => ['object|false', 'result' => 'resource', 'row=' => '?int', 'class=' => 'string', 'constructor_args=' => 'array'], - 'new' => ['object|false', 'result' => '\PgSql\Result', 'row=' => '?int', 'class=' => 'string', 'constructor_args=' => 'array'], - ], - 'pg_fetch_result' => [ - 'old' => ['string|false|null', 'result' => 'resource', 'row' => 'string|int'], - 'new' => ['string|false|null', 'result' => '\PgSql\Result', 'row' => 'string|int'], - ], - 'pg_fetch_result\'1' => [ - 'old' => ['string|false|null', 'result' => 'resource', 'row' => '?int', 'field' => 'string|int'], - 'new' => ['string|false|null', 'result' => '\PgSql\Result', 'row' => '?int', 'field' => 'string|int'], - ], - 'pg_fetch_row' => [ - 'old' => ['array|false', 'result' => 'resource', 'row=' => '?int', 'mode=' => 'int'], - 'new' => ['array|false', 'result' => '\PgSql\Result', 'row=' => '?int', 'mode=' => 'int'], - ], - 'pg_field_is_null' => [ - 'old' => ['int|false', 'result' => 'resource', 'row'=>'string|int'], - 'new' => ['int|false', 'result' => '\PgSql\Result', 'row'=>'string|int'], - ], - 'pg_field_is_null\'1' => [ - 'old' => ['int|false', 'result' => 'resource', 'row' => 'int', 'field' => 'string|int'], - 'new' => ['int|false', 'result' => '\PgSql\Result', 'row' => 'int', 'field' => 'string|int'], - ], - 'pg_field_name' => [ - 'old' => ['string', 'result' => 'resource', 'field' => 'int'], - 'new' => ['string', 'result' => '\PgSql\Result', 'field' => 'int'], - ], - 'pg_field_num' => [ - 'old' => ['int', 'result' => 'resource', 'field' => 'string'], - 'new' => ['int', 'result' => '\PgSql\Result', 'field' => 'string'], - ], - 'pg_field_prtlen' => [ - 'old' => ['int|false', 'result' => 'resource', 'row' => 'string|int'], - 'new' => ['int|false', 'result' => '\PgSql\Result', 'row' => 'string|int'], - ], - 'pg_field_prtlen\'1' => [ - 'old' => ['int|false', 'result' => 'resource', 'row' => 'int', 'field' => 'string|int'], - 'new' => ['int|false', 'result' => '\PgSql\Result', 'row' => 'int', 'field' => 'string|int'], - ], - 'pg_field_size' => [ - 'old' => ['int', 'result' => 'resource', 'field' => 'int'], - 'new' => ['int', 'result' => '\PgSql\Result', 'field' => 'int'], - ], - 'pg_field_table' => [ - 'old' => ['string|int|false', 'result' => 'resource', 'field' => 'int', 'oid_only=' => 'bool'], - 'new' => ['string|int|false', 'result' => '\PgSql\Result', 'field' => 'int', 'oid_only=' => 'bool'], - ], - 'pg_field_type' => [ - 'old' => ['string', 'result' => 'resource', 'field' => 'int'], - 'new' => ['string', 'result' => '\PgSql\Result', 'field' => 'int'], - ], - 'pg_field_type_oid' => [ - 'old' => ['int|string', 'result' => 'resource', 'field' => 'int'], - 'new' => ['int|string', 'result' => '\PgSql\Result', 'field' => 'int'], - ], - 'pg_flush' => [ - 'old' => ['int|bool', 'connection' => 'resource'], - 'new' => ['int|bool', 'connection' => '\PgSql\Connection'], - ], - 'pg_free_result' => [ - 'old' => ['bool', 'result' => 'resource'], - 'new' => ['bool', 'result' => '\PgSql\Result'], - ], - 'pg_get_notify' => [ - 'old' => ['array|false', 'result' => 'resource', 'mode=' => 'int'], - 'new' => ['array|false', 'result' => '\PgSql\Result', 'mode=' => 'int'], - ], - 'pg_get_pid' => [ - 'old' => ['int', 'connection' => 'resource'], - 'new' => ['int', 'connection' => '\PgSql\Connection'], - ], - 'pg_get_result' => [ - 'old' => ['resource|false', 'connection=' => 'resource'], - 'new' => ['\PgSql\Result|false', 'connection=' => '\PgSql\Connection'], - ], - 'pg_host' => [ - 'old' => ['string', 'connection=' => 'resource'], - 'new' => ['string', 'connection=' => '\PgSql\Connection'], - ], - 'pg_insert' => [ - 'old' => ['resource|string|false', 'connection' => 'resource', 'table_name' => 'string', 'values' => 'array', 'flags=' => 'int'], - 'new' => ['\PgSql\Result|string|false', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'values' => 'array', 'flags=' => 'int'], - ], - 'pg_last_error' => [ - 'old' => ['string', 'connection=' => 'resource', 'operation=' => 'int'], - 'new' => ['string', 'connection=' => '\PgSql\Connection', 'operation=' => 'int'], - ], - 'pg_last_notice' => [ - 'old' => ['string|array|bool', 'connection' => 'resource', 'mode=' => 'int'], - 'new' => ['string|array|bool', 'connection' => '\PgSql\Connection', 'mode=' => 'int'], - ], - 'pg_last_oid' => [ - 'old' => ['string|int|false', 'result' => 'resource'], - 'new' => ['string|int|false', 'result' => '\PgSql\Result'], - ], - 'pg_lo_close' => [ - 'old' => ['bool', 'lob' => 'resource'], - 'new' => ['bool', 'lob' => '\PgSql\Lob'], - ], - 'pg_lo_create' => [ - 'old' => ['int|string|false', 'connection=' => 'resource', 'oid=' => 'int|string'], - 'new' => ['int|string|false', 'connection=' => '\PgSql\Connection', 'oid=' => 'int|string'], - ], - 'pg_lo_export' => [ - 'old' => ['bool', 'connection' => 'resource', 'oid' => 'int|string', 'filename' => 'string'], - 'new' => ['bool', 'connection' => '\PgSql\Connection', 'oid' => 'int|string', 'filename' => 'string'], - ], - 'pg_lo_import' => [ - 'old' => ['int|string|false', 'connection' => 'resource', 'filename' => 'string', 'oid' => 'string|int'], - 'new' => ['int|string|false', 'connection' => '\PgSql\Connection', 'filename' => 'string', 'oid' => 'string|int'], - ], - 'pg_lo_open' => [ - 'old' => ['resource|false', 'connection' => 'resource', 'oid' => 'int|string', 'mode' => 'string'], - 'new' => ['\PgSql\Lob|false', 'connection' => '\PgSql\Connection', 'oid' => 'int|string', 'mode' => 'string'], - ], - 'pg_lo_open\'1' => [ - 'old' => ['resource|false', 'connection' => 'int|string', 'oid' => 'string'], - 'new' => ['\PgSql\Lob|false', 'connection' => 'int|string', 'oid' => 'string'], - ], - 'pg_lo_read' => [ - 'old' => ['string|false', 'lob' => 'resource', 'length=' => 'int'], - 'new' => ['string|false', 'lob' => '\PgSql\Lob', 'length=' => 'int'], - ], - 'pg_lo_read_all' => [ - 'old' => ['int', 'lob' => 'resource'], - 'new' => ['int', 'lob' => '\PgSql\Lob'], - ], - 'pg_lo_seek' => [ - 'old' => ['bool', 'lob' => 'resource', 'offset' => 'int', 'whence=' => 'int'], - 'new' => ['bool', 'lob' => '\PgSql\Lob', 'offset' => 'int', 'whence=' => 'int'], - ], - 'pg_lo_tell' => [ - 'old' => ['int', 'lob' => 'resource'], - 'new' => ['int', 'lob' => '\PgSql\Lob'], - ], - 'pg_lo_truncate' => [ - 'old' => ['bool', 'lob' => 'resource', 'size' => 'int'], - 'new' => ['bool', 'lob' => '\PgSql\Lob', 'size' => 'int'], - ], - 'pg_lo_unlink' => [ - 'old' => ['bool', 'connection' => 'resource', 'oid' => 'int|string'], - 'new' => ['bool', 'connection' => '\PgSql\Connection', 'oid' => 'int|string'], - ], - 'pg_lo_write' => [ - 'old' => ['int|false', 'lob' => 'resource', 'data' => 'string', 'length=' => 'int'], - 'new' => ['int|false', 'lob' => '\PgSql\Lob', 'data' => 'string', 'length=' => 'int'], - ], - 'pg_meta_data' => [ - 'old' => ['array|false', 'connection' => 'resource', 'table_name' => 'string', 'extended=' => 'bool'], - 'new' => ['array|false', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'extended=' => 'bool'], - ], - 'pg_num_fields' => [ - 'old' => ['int', 'result' => 'resource'], - 'new' => ['int', 'result' => '\PgSql\Result'], - ], - 'pg_num_rows' => [ - 'old' => ['int', 'result' => 'resource'], - 'new' => ['int', 'result' => '\PgSql\Result'], - ], - 'pg_options' => [ - 'old' => ['string', 'connection=' => 'resource'], - 'new' => ['string', 'connection=' => '\PgSql\Connection'], - ], - 'pg_parameter_status' => [ - 'old' => ['string|false', 'connection' => 'resource', 'name' => 'string'], - 'new' => ['string|false', 'connection' => '\PgSql\Connection', 'name' => 'string'], - ], - 'pg_pconnect' => [ - 'old' => ['resource|false', 'connection_string' => 'string', 'flags=' => 'string', 'port=' => 'string|int', 'options=' => 'string', 'tty=' => 'string', 'database=' => 'string'], - 'new' => ['\PgSql\Connection|false', 'connection_string' => 'string', 'flags=' => 'string', 'port=' => 'string|int', 'options=' => 'string', 'tty=' => 'string', 'database=' => 'string'], - ], - 'pg_ping' => [ - 'old' => ['bool', 'connection=' => 'resource'], - 'new' => ['bool', 'connection=' => '\PgSql\Connection'], - ], - 'pg_port' => [ - 'old' => ['int', 'connection=' => 'resource'], - 'new' => ['int', 'connection=' => '\PgSql\Connection'], - ], - 'pg_prepare' => [ - 'old' => ['resource|false', 'connection' => 'resource', 'statement_name' => 'string', 'query' => 'string'], - 'new' => ['\PgSql\Result|false', 'connection' => '\PgSql\Connection', 'statement_name' => 'string', 'query' => 'string'], - ], - 'pg_prepare\'1' => [ - 'old' => ['resource|false', 'connection' => 'string', 'statement_name' => 'string'], - 'new' => ['\PgSql\Result|false', 'connection' => 'string', 'statement_name' => 'string'], - ], - 'pg_put_line' => [ - 'old' => ['bool', 'connection' => 'resource', 'data' => 'string'], - 'new' => ['bool', 'connection' => '\PgSql\Connection', 'data' => 'string'], - ], - 'pg_query' => [ - 'old' => ['resource|false', 'connection' => 'resource', 'query' => 'string'], - 'new' => ['\PgSql\Result|false', 'connection' => '\PgSql\Connection', 'query' => 'string'], - ], - 'pg_query\'1' => [ - 'old' => ['resource|false', 'connection' => 'string'], - 'new' => ['\PgSql\Result|false', 'connection' => 'string'], - ], - 'pg_query_params' => [ - 'old' => ['resource|false', 'connection' => 'resource', 'query' => 'string', 'params' => 'array'], - 'new' => ['\PgSql\Result|false', 'connection' => '\PgSql\Connection', 'query' => 'string', 'params' => 'array'], - ], - 'pg_query_params\'1' => [ - 'old' => ['resource|false', 'connection' => 'string', 'query' => 'array'], - 'new' => ['\PgSql\Result|false', 'connection' => 'string', 'query' => 'array'], - ], - 'pg_result_error' => [ - 'old' => ['string|false', 'result' => 'resource'], - 'new' => ['string|false', 'result' => '\PgSql\Result'], - ], - 'pg_result_error_field' => [ - 'old' => ['string|false|null', 'result' => 'resource', 'field_code' => 'int'], - 'new' => ['string|false|null', 'result' => '\PgSql\Result', 'field_code' => 'int'], - ], - 'pg_result_seek' => [ - 'old' => ['bool', 'result' => 'resource', 'row' => 'int'], - 'new' => ['bool', 'result' => '\PgSql\Result', 'row' => 'int'], - ], - 'pg_result_status' => [ - 'old' => ['string|int', 'result' => 'resource', 'mode=' => 'int'], - 'new' => ['string|int', 'result' => '\PgSql\Result', 'mode=' => 'int'], - ], - 'pg_select' => [ - 'old' => ['string|array|false', 'connection' => 'resource', 'table_name' => 'string', 'assoc_array' => 'array', 'options=' => 'int', 'result_type=' => 'int'], - 'new' => ['string|array|false', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'assoc_array' => 'array', 'options=' => 'int', 'result_type=' => 'int'], - ], - 'pg_send_execute' => [ - 'old' => ['bool|int', 'connection' => 'resource', 'query' => 'string', 'params' => 'array'], - 'new' => ['bool|int', 'connection' => '\PgSql\Connection', 'query' => 'string', 'params' => 'array'], - ], - 'pg_send_prepare' => [ - 'old' => ['bool|int', 'connection' => 'resource', 'statement_name' => 'string', 'query' => 'string'], - 'new' => ['bool|int', 'connection' => '\PgSql\Connection', 'statement_name' => 'string', 'query' => 'string'], - ], - 'pg_send_query' => [ - 'old' => ['bool|int', 'connection' => 'resource', 'query' => 'string'], - 'new' => ['bool|int', 'connection' => '\PgSql\Connection', 'query' => 'string'], - ], - 'pg_send_query_params' => [ - 'old' => ['bool|int', 'connection' => 'resource', 'query' => 'string', 'params' => 'array'], - 'new' => ['bool|int', 'connection' => '\PgSql\Connection', 'query' => 'string', 'params' => 'array'], - ], - 'pg_set_client_encoding' => [ - 'old' => ['int', 'connection' => 'resource', 'encoding' => 'string'], - 'new' => ['int', 'connection' => '\PgSql\Connection', 'encoding' => 'string'], - ], - 'pg_set_error_verbosity' => [ - 'old' => ['int|false', 'connection' => 'resource', 'verbosity' => 'int'], - 'new' => ['int|false', 'connection' => '\PgSql\Connection', 'verbosity' => 'int'], - ], - 'pg_socket' => [ - 'old' => ['resource|false', 'connection' => 'resource'], - 'new' => ['resource|false', 'connection' => '\PgSql\Connection'], - ], - 'pg_trace' => [ - 'old' => ['bool', 'filename' => 'string', 'mode=' => 'string', 'connection=' => 'resource'], - 'new' => ['bool', 'filename' => 'string', 'mode=' => 'string', 'connection=' => '\PgSql\Connection'], - ], - 'pg_transaction_status' => [ - 'old' => ['int', 'connection' => 'resource'], - 'new' => ['int', 'connection' => '\PgSql\Connection'], - ], - 'pg_tty' => [ - 'old' => ['string', 'connection=' => 'resource'], - 'new' => ['string', 'connection=' => '\PgSql\Connection'], - ], - 'pg_untrace' => [ - 'old' => ['bool', 'connection=' => 'resource'], - 'new' => ['bool', 'connection=' => '\PgSql\Connection'], - ], - 'pg_update' => [ - 'old' => ['string|bool', 'connection' => 'resource', 'table_name' => 'string', 'values' => 'array', 'conditions' => 'array', 'flags=' => 'int'], - 'new' => ['string|bool', 'connection' => '\PgSql\Connection', 'table_name' => 'string', 'values' => 'array', 'conditions' => 'array', 'flags=' => 'int'], - ], - 'pg_version' => [ - 'old' => ['array', 'connection=' => 'resource'], - 'new' => ['array', 'connection=' => '\PgSql\Connection'], - ], - 'pspell_add_to_personal' => [ - 'old' => ['bool', 'dictionary'=>'int', 'word'=>'string'], - 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], - ], - 'pspell_add_to_session' => [ - 'old' => ['bool', 'dictionary'=>'int', 'word'=>'string'], - 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], - ], - 'pspell_check' => [ - 'old' => ['bool', 'dictionary'=>'int', 'word'=>'string'], - 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], - ], - 'pspell_clear_session' => [ - 'old' => ['bool', 'dictionary'=>'int'], - 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary'], - ], - 'pspell_config_data_dir' => [ - 'old' => ['bool', 'config'=>'int', 'directory'=>'string'], - 'new' => ['bool', 'config'=>'PSpell\Config', 'directory'=>'string'], - ], - 'pspell_config_dict_dir' => [ - 'old' => ['bool', 'config'=>'int', 'directory'=>'string'], - 'new' => ['bool', 'config'=>'PSpell\Config', 'directory'=>'string'], - ], - 'pspell_config_ignore' => [ - 'old' => ['bool', 'config'=>'int', 'min_length'=>'int'], - 'new' => ['bool', 'config'=>'PSpell\Config', 'min_length'=>'int'], - ], - 'pspell_config_mode' => [ - 'old' => ['bool', 'config'=>'int', 'mode'=>'int'], - 'new' => ['bool', 'config'=>'PSpell\Config', 'mode'=>'int'], - ], - 'pspell_config_personal' => [ - 'old' => ['bool', 'config'=>'int', 'filename'=>'string'], - 'new' => ['bool', 'config'=>'PSpell\Config', 'filename'=>'string'], - ], - 'pspell_config_repl' => [ - 'old' => ['bool', 'config'=>'int', 'filename'=>'string'], - 'new' => ['bool', 'config'=>'PSpell\Config', 'filename'=>'string'], - ], - 'pspell_config_runtogether' => [ - 'old' => ['bool', 'config'=>'int', 'allow'=>'bool'], - 'new' => ['bool', 'config'=>'PSpell\Config', 'allow'=>'bool'], - ], - 'pspell_config_save_repl' => [ - 'old' => ['bool', 'config'=>'int', 'save'=>'bool'], - 'new' => ['bool', 'config'=>'PSpell\Config', 'save'=>'bool'], - ], - 'pspell_new_config' => [ - 'old' => ['int|false', 'config'=>'int'], - 'new' => ['int|false', 'config'=>'PSpell\Config'], - ], - 'pspell_save_wordlist' => [ - 'old' => ['bool', 'dictionary'=>'int'], - 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary'], - ], - 'pspell_store_replacement' => [ - 'old' => ['bool', 'dictionary'=>'int', 'misspelled'=>'string', 'correct'=>'string'], - 'new' => ['bool', 'dictionary'=>'PSpell\Dictionary', 'misspelled'=>'string', 'correct'=>'string'], - ], - 'pspell_suggest' => [ - 'old' => ['array', 'dictionary'=>'int', 'word'=>'string'], - 'new' => ['array', 'dictionary'=>'PSpell\Dictionary', 'word'=>'string'], - ], - ], - - 'removed' => [ - 'ReflectionMethod::isStatic' => ['bool'], - ], -]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_historical.php b/vendor/vimeo/psalm/dictionaries/CallMap_historical.php deleted file mode 100644 index a5c4875a..00000000 --- a/vendor/vimeo/psalm/dictionaries/CallMap_historical.php +++ /dev/null @@ -1,16618 +0,0 @@ - ['void', 'content_type='=>'string', 'content_encoding='=>'string', 'headers='=>'array', 'delivery_mode='=>'int', 'priority='=>'int', 'correlation_id='=>'string', 'reply_to='=>'string', 'expiration='=>'string', 'message_id='=>'string', 'timestamp='=>'int', 'type='=>'string', 'user_id='=>'string', 'app_id='=>'string', 'cluster_id='=>'string'], - 'AMQPBasicProperties::getAppId' => ['string'], - 'AMQPBasicProperties::getClusterId' => ['string'], - 'AMQPBasicProperties::getContentEncoding' => ['string'], - 'AMQPBasicProperties::getContentType' => ['string'], - 'AMQPBasicProperties::getCorrelationId' => ['string'], - 'AMQPBasicProperties::getDeliveryMode' => ['int'], - 'AMQPBasicProperties::getExpiration' => ['string'], - 'AMQPBasicProperties::getHeaders' => ['array'], - 'AMQPBasicProperties::getMessageId' => ['string'], - 'AMQPBasicProperties::getPriority' => ['int'], - 'AMQPBasicProperties::getReplyTo' => ['string'], - 'AMQPBasicProperties::getTimestamp' => ['string'], - 'AMQPBasicProperties::getType' => ['string'], - 'AMQPBasicProperties::getUserId' => ['string'], - 'AMQPChannel::__construct' => ['void', 'amqp_connection'=>'AMQPConnection'], - 'AMQPChannel::basicRecover' => ['', 'requeue='=>'bool'], - 'AMQPChannel::close' => [''], - 'AMQPChannel::commitTransaction' => ['bool'], - 'AMQPChannel::confirmSelect' => [''], - 'AMQPChannel::getChannelId' => ['int'], - 'AMQPChannel::getConnection' => ['AMQPConnection'], - 'AMQPChannel::getConsumers' => ['AMQPQueue[]'], - 'AMQPChannel::getPrefetchCount' => ['int'], - 'AMQPChannel::getPrefetchSize' => ['int'], - 'AMQPChannel::isConnected' => ['bool'], - 'AMQPChannel::qos' => ['bool', 'size'=>'int', 'count'=>'int'], - 'AMQPChannel::rollbackTransaction' => ['bool'], - 'AMQPChannel::setConfirmCallback' => ['', 'ack_callback='=>'?callable', 'nack_callback='=>'?callable'], - 'AMQPChannel::setPrefetchCount' => ['bool', 'count'=>'int'], - 'AMQPChannel::setPrefetchSize' => ['bool', 'size'=>'int'], - 'AMQPChannel::setReturnCallback' => ['', 'return_callback='=>'?callable'], - 'AMQPChannel::startTransaction' => ['bool'], - 'AMQPChannel::waitForBasicReturn' => ['', 'timeout='=>'float'], - 'AMQPChannel::waitForConfirm' => ['', 'timeout='=>'float'], - 'AMQPConnection::__construct' => ['void', 'credentials='=>'array'], - 'AMQPConnection::connect' => ['bool'], - 'AMQPConnection::disconnect' => ['bool'], - 'AMQPConnection::getCACert' => ['string'], - 'AMQPConnection::getCert' => ['string'], - 'AMQPConnection::getHeartbeatInterval' => ['int'], - 'AMQPConnection::getHost' => ['string'], - 'AMQPConnection::getKey' => ['string'], - 'AMQPConnection::getLogin' => ['string'], - 'AMQPConnection::getMaxChannels' => ['?int'], - 'AMQPConnection::getMaxFrameSize' => ['int'], - 'AMQPConnection::getPassword' => ['string'], - 'AMQPConnection::getPort' => ['int'], - 'AMQPConnection::getReadTimeout' => ['float'], - 'AMQPConnection::getTimeout' => ['float'], - 'AMQPConnection::getUsedChannels' => ['int'], - 'AMQPConnection::getVerify' => ['bool'], - 'AMQPConnection::getVhost' => ['string'], - 'AMQPConnection::getWriteTimeout' => ['float'], - 'AMQPConnection::isConnected' => ['bool'], - 'AMQPConnection::isPersistent' => ['?bool'], - 'AMQPConnection::pconnect' => ['bool'], - 'AMQPConnection::pdisconnect' => ['bool'], - 'AMQPConnection::preconnect' => ['bool'], - 'AMQPConnection::reconnect' => ['bool'], - 'AMQPConnection::setCACert' => ['', 'cacert'=>'string'], - 'AMQPConnection::setCert' => ['', 'cert'=>'string'], - 'AMQPConnection::setHost' => ['bool', 'host'=>'string'], - 'AMQPConnection::setKey' => ['', 'key'=>'string'], - 'AMQPConnection::setLogin' => ['bool', 'login'=>'string'], - 'AMQPConnection::setPassword' => ['bool', 'password'=>'string'], - 'AMQPConnection::setPort' => ['bool', 'port'=>'int'], - 'AMQPConnection::setReadTimeout' => ['bool', 'timeout'=>'int'], - 'AMQPConnection::setTimeout' => ['bool', 'timeout'=>'int'], - 'AMQPConnection::setVerify' => ['', 'verify'=>'bool'], - 'AMQPConnection::setVhost' => ['bool', 'vhost'=>'string'], - 'AMQPConnection::setWriteTimeout' => ['bool', 'timeout'=>'int'], - 'AMQPDecimal::__construct' => ['void', 'exponent'=>'', 'significand'=>''], - 'AMQPDecimal::getExponent' => ['int'], - 'AMQPDecimal::getSignificand' => ['int'], - 'AMQPEnvelope::__construct' => ['void'], - 'AMQPEnvelope::getAppId' => ['string'], - 'AMQPEnvelope::getBody' => ['string'], - 'AMQPEnvelope::getClusterId' => ['string'], - 'AMQPEnvelope::getConsumerTag' => ['string'], - 'AMQPEnvelope::getContentEncoding' => ['string'], - 'AMQPEnvelope::getContentType' => ['string'], - 'AMQPEnvelope::getCorrelationId' => ['string'], - 'AMQPEnvelope::getDeliveryMode' => ['int'], - 'AMQPEnvelope::getDeliveryTag' => ['string'], - 'AMQPEnvelope::getExchangeName' => ['string'], - 'AMQPEnvelope::getExpiration' => ['string'], - 'AMQPEnvelope::getHeader' => ['string|false', 'header_key'=>'string'], - 'AMQPEnvelope::getHeaders' => ['array'], - 'AMQPEnvelope::getMessageId' => ['string'], - 'AMQPEnvelope::getPriority' => ['int'], - 'AMQPEnvelope::getReplyTo' => ['string'], - 'AMQPEnvelope::getRoutingKey' => ['string'], - 'AMQPEnvelope::getTimeStamp' => ['string'], - 'AMQPEnvelope::getType' => ['string'], - 'AMQPEnvelope::getUserId' => ['string'], - 'AMQPEnvelope::hasHeader' => ['bool', 'header_key'=>'string'], - 'AMQPEnvelope::isRedelivery' => ['bool'], - 'AMQPExchange::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'], - 'AMQPExchange::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], - 'AMQPExchange::declareExchange' => ['bool'], - 'AMQPExchange::delete' => ['bool', 'exchangeName='=>'string', 'flags='=>'int'], - 'AMQPExchange::getArgument' => ['int|string|false', 'key'=>'string'], - 'AMQPExchange::getArguments' => ['array'], - 'AMQPExchange::getChannel' => ['AMQPChannel'], - 'AMQPExchange::getConnection' => ['AMQPConnection'], - 'AMQPExchange::getFlags' => ['int'], - 'AMQPExchange::getName' => ['string'], - 'AMQPExchange::getType' => ['string'], - 'AMQPExchange::hasArgument' => ['bool', 'key'=>'string'], - 'AMQPExchange::publish' => ['bool', 'message'=>'string', 'routing_key='=>'string', 'flags='=>'int', 'attributes='=>'array'], - 'AMQPExchange::setArgument' => ['bool', 'key'=>'string', 'value'=>'int|string'], - 'AMQPExchange::setArguments' => ['bool', 'arguments'=>'array'], - 'AMQPExchange::setFlags' => ['bool', 'flags'=>'int'], - 'AMQPExchange::setName' => ['bool', 'exchange_name'=>'string'], - 'AMQPExchange::setType' => ['bool', 'exchange_type'=>'string'], - 'AMQPExchange::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], - 'AMQPQueue::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'], - 'AMQPQueue::ack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], - 'AMQPQueue::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], - 'AMQPQueue::cancel' => ['bool', 'consumer_tag='=>'string'], - 'AMQPQueue::consume' => ['void', 'callback='=>'?callable', 'flags='=>'int', 'consumerTag='=>'string'], - 'AMQPQueue::declareQueue' => ['int'], - 'AMQPQueue::delete' => ['int', 'flags='=>'int'], - 'AMQPQueue::get' => ['AMQPEnvelope|false', 'flags='=>'int'], - 'AMQPQueue::getArgument' => ['int|string|false', 'key'=>'string'], - 'AMQPQueue::getArguments' => ['array'], - 'AMQPQueue::getChannel' => ['AMQPChannel'], - 'AMQPQueue::getConnection' => ['AMQPConnection'], - 'AMQPQueue::getConsumerTag' => ['?string'], - 'AMQPQueue::getFlags' => ['int'], - 'AMQPQueue::getName' => ['string'], - 'AMQPQueue::hasArgument' => ['bool', 'key'=>'string'], - 'AMQPQueue::nack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], - 'AMQPQueue::purge' => ['bool'], - 'AMQPQueue::reject' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'], - 'AMQPQueue::setArgument' => ['bool', 'key'=>'string', 'value'=>'mixed'], - 'AMQPQueue::setArguments' => ['bool', 'arguments'=>'array'], - 'AMQPQueue::setFlags' => ['bool', 'flags'=>'int'], - 'AMQPQueue::setName' => ['bool', 'queue_name'=>'string'], - 'AMQPQueue::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'], - 'AMQPTimestamp::__construct' => ['void', 'timestamp'=>'string'], - 'AMQPTimestamp::__toString' => ['string'], - 'AMQPTimestamp::getTimestamp' => ['string'], - 'APCIterator::__construct' => ['void', 'cache'=>'string', 'search='=>'null|string|string[]', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'], - 'APCIterator::current' => ['mixed|false'], - 'APCIterator::getTotalCount' => ['int|false'], - 'APCIterator::getTotalHits' => ['int|false'], - 'APCIterator::getTotalSize' => ['int|false'], - 'APCIterator::key' => ['string'], - 'APCIterator::next' => ['void'], - 'APCIterator::rewind' => ['void'], - 'APCIterator::valid' => ['bool'], - 'APCuIterator::__construct' => ['void', 'search='=>'string|string[]|null', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'], - 'APCuIterator::current' => ['mixed'], - 'APCuIterator::getTotalCount' => ['int'], - 'APCuIterator::getTotalHits' => ['int'], - 'APCuIterator::getTotalSize' => ['int'], - 'APCuIterator::key' => ['string'], - 'APCuIterator::next' => ['void'], - 'APCuIterator::rewind' => ['void'], - 'APCuIterator::valid' => ['bool'], - 'AppendIterator::__construct' => ['void'], - 'AppendIterator::append' => ['void', 'iterator'=>'Iterator'], - 'AppendIterator::current' => ['mixed'], - 'AppendIterator::getArrayIterator' => ['ArrayIterator'], - 'AppendIterator::getInnerIterator' => ['Iterator'], - 'AppendIterator::getIteratorIndex' => ['int'], - 'AppendIterator::key' => ['int|string|float|bool'], - 'AppendIterator::next' => ['void'], - 'AppendIterator::rewind' => ['void'], - 'AppendIterator::valid' => ['bool'], - 'ArgumentCountError::__clone' => ['void'], - 'ArgumentCountError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], - 'ArgumentCountError::__toString' => ['string'], - 'ArgumentCountError::__wakeup' => ['void'], - 'ArgumentCountError::getCode' => ['int'], - 'ArgumentCountError::getFile' => ['string'], - 'ArgumentCountError::getLine' => ['int'], - 'ArgumentCountError::getMessage' => ['string'], - 'ArgumentCountError::getPrevious' => ['?Throwable'], - 'ArgumentCountError::getTrace' => ['list\',args?:array}>'], - 'ArgumentCountError::getTraceAsString' => ['string'], - 'ArithmeticError::__clone' => ['void'], - 'ArithmeticError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], - 'ArithmeticError::__toString' => ['string'], - 'ArithmeticError::__wakeup' => ['void'], - 'ArithmeticError::getCode' => ['int'], - 'ArithmeticError::getFile' => ['string'], - 'ArithmeticError::getLine' => ['int'], - 'ArithmeticError::getMessage' => ['string'], - 'ArithmeticError::getPrevious' => ['?Throwable'], - 'ArithmeticError::getTrace' => ['list\',args?:array}>'], - 'ArithmeticError::getTraceAsString' => ['string'], - 'ArrayAccess::offsetExists' => ['bool', 'offset'=>'mixed'], - 'ArrayAccess::offsetGet' => ['mixed', 'offset'=>'mixed'], - 'ArrayAccess::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], - 'ArrayAccess::offsetUnset' => ['void', 'offset'=>'mixed'], - 'ArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'], - 'ArrayIterator::append' => ['void', 'value'=>'mixed'], - 'ArrayIterator::asort' => ['void'], - 'ArrayIterator::count' => ['int'], - 'ArrayIterator::current' => ['mixed'], - 'ArrayIterator::getArrayCopy' => ['array'], - 'ArrayIterator::getFlags' => ['int'], - 'ArrayIterator::key' => ['int|string|false'], - 'ArrayIterator::ksort' => ['void'], - 'ArrayIterator::natcasesort' => ['void'], - 'ArrayIterator::natsort' => ['void'], - '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::rewind' => ['void'], - 'ArrayIterator::seek' => ['void', 'position'=>'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::valid' => ['bool'], - 'ArrayObject::__construct' => ['void', 'input='=>'array|object', 'flags='=>'int', 'iterator_class='=>'string'], - 'ArrayObject::append' => ['void', 'value'=>'mixed'], - 'ArrayObject::asort' => ['void'], - 'ArrayObject::count' => ['int'], - 'ArrayObject::exchangeArray' => ['array', 'ar'=>'mixed'], - 'ArrayObject::getArrayCopy' => ['array'], - 'ArrayObject::getFlags' => ['int'], - 'ArrayObject::getIterator' => ['ArrayIterator'], - 'ArrayObject::getIteratorClass' => ['string'], - 'ArrayObject::ksort' => ['void'], - 'ArrayObject::natcasesort' => ['void'], - 'ArrayObject::natsort' => ['void'], - '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::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'], - 'BadFunctionCallException::__clone' => ['void'], - 'BadFunctionCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?BadFunctionCallException'], - 'BadFunctionCallException::__toString' => ['string'], - 'BadFunctionCallException::getCode' => ['int'], - 'BadFunctionCallException::getFile' => ['string'], - 'BadFunctionCallException::getLine' => ['int'], - 'BadFunctionCallException::getMessage' => ['string'], - 'BadFunctionCallException::getPrevious' => ['?Throwable|?BadFunctionCallException'], - 'BadFunctionCallException::getTrace' => ['list\',args?:array}>'], - 'BadFunctionCallException::getTraceAsString' => ['string'], - 'BadMethodCallException::__clone' => ['void'], - 'BadMethodCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?BadMethodCallException'], - 'BadMethodCallException::__toString' => ['string'], - 'BadMethodCallException::getCode' => ['int'], - 'BadMethodCallException::getFile' => ['string'], - 'BadMethodCallException::getLine' => ['int'], - 'BadMethodCallException::getMessage' => ['string'], - 'BadMethodCallException::getPrevious' => ['?Throwable|?BadMethodCallException'], - 'BadMethodCallException::getTrace' => ['list\',args?:array}>'], - 'BadMethodCallException::getTraceAsString' => ['string'], - 'COM::__call' => ['', 'name'=>'', 'args'=>''], - 'COM::__construct' => ['void', 'module_name'=>'string', 'server_name='=>'mixed', 'codepage='=>'int', 'typelib='=>'string'], - 'COM::__get' => ['', 'name'=>''], - 'COM::__set' => ['void', 'name'=>'', 'value'=>''], - 'COMPersistHelper::GetCurFile' => ['string'], - 'COMPersistHelper::GetCurFileName' => ['string'], - 'COMPersistHelper::GetMaxStreamSize' => ['int'], - 'COMPersistHelper::InitNew' => ['int'], - 'COMPersistHelper::LoadFromFile' => ['bool', 'filename'=>'string', 'flags'=>'int'], - 'COMPersistHelper::LoadFromStream' => ['', 'stream'=>''], - '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::__wakeup' => ['void'], - 'CURLFile::getFilename' => ['string'], - 'CURLFile::getMimeType' => ['string'], - 'CURLFile::getPostFilename' => ['string'], - 'CURLFile::setMimeType' => ['void', 'mime'=>'string'], - 'CURLFile::setPostFilename' => ['void', 'name'=>'string'], - 'CachingIterator::__construct' => ['void', 'iterator'=>'Iterator', 'flags='=>''], - 'CachingIterator::__toString' => ['string'], - 'CachingIterator::count' => ['int'], - 'CachingIterator::current' => ['mixed'], - 'CachingIterator::getCache' => ['array'], - 'CachingIterator::getFlags' => ['int'], - 'CachingIterator::getInnerIterator' => ['Iterator'], - '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::rewind' => ['void'], - 'CachingIterator::setFlags' => ['void', 'flags'=>'int'], - 'CachingIterator::valid' => ['bool'], - 'Cairo::availableFonts' => ['array'], - 'Cairo::availableSurfaces' => ['array'], - 'Cairo::statusToString' => ['string', 'status'=>'int'], - 'Cairo::version' => ['int'], - 'Cairo::versionString' => ['string'], - 'CairoContext::__construct' => ['void', 'surface'=>'CairoSurface'], - 'CairoContext::appendPath' => ['', 'path'=>'cairopath', 'context'=>'cairocontext'], - 'CairoContext::arc' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], - 'CairoContext::arcNegative' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], - 'CairoContext::clip' => ['', 'context'=>'cairocontext'], - 'CairoContext::clipExtents' => ['array', 'context'=>'cairocontext'], - 'CairoContext::clipPreserve' => ['', 'context'=>'cairocontext'], - 'CairoContext::clipRectangleList' => ['array', 'context'=>'cairocontext'], - 'CairoContext::closePath' => ['', 'context'=>'cairocontext'], - 'CairoContext::copyPage' => ['', 'context'=>'cairocontext'], - 'CairoContext::copyPath' => ['CairoPath', 'context'=>'cairocontext'], - 'CairoContext::copyPathFlat' => ['CairoPath', 'context'=>'cairocontext'], - 'CairoContext::curveTo' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float', 'context'=>'cairocontext'], - 'CairoContext::deviceToUser' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], - 'CairoContext::deviceToUserDistance' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], - 'CairoContext::fill' => ['', 'context'=>'cairocontext'], - 'CairoContext::fillExtents' => ['array', 'context'=>'cairocontext'], - 'CairoContext::fillPreserve' => ['', 'context'=>'cairocontext'], - 'CairoContext::fontExtents' => ['array', 'context'=>'cairocontext'], - 'CairoContext::getAntialias' => ['int', 'context'=>'cairocontext'], - 'CairoContext::getCurrentPoint' => ['array', 'context'=>'cairocontext'], - 'CairoContext::getDash' => ['array', 'context'=>'cairocontext'], - 'CairoContext::getDashCount' => ['int', 'context'=>'cairocontext'], - 'CairoContext::getFillRule' => ['int', 'context'=>'cairocontext'], - 'CairoContext::getFontFace' => ['', 'context'=>'cairocontext'], - 'CairoContext::getFontMatrix' => ['', 'context'=>'cairocontext'], - 'CairoContext::getFontOptions' => ['', 'context'=>'cairocontext'], - 'CairoContext::getGroupTarget' => ['', 'context'=>'cairocontext'], - 'CairoContext::getLineCap' => ['int', 'context'=>'cairocontext'], - 'CairoContext::getLineJoin' => ['int', 'context'=>'cairocontext'], - 'CairoContext::getLineWidth' => ['float', 'context'=>'cairocontext'], - 'CairoContext::getMatrix' => ['', 'context'=>'cairocontext'], - 'CairoContext::getMiterLimit' => ['float', 'context'=>'cairocontext'], - 'CairoContext::getOperator' => ['int', 'context'=>'cairocontext'], - 'CairoContext::getScaledFont' => ['', 'context'=>'cairocontext'], - 'CairoContext::getSource' => ['', 'context'=>'cairocontext'], - 'CairoContext::getTarget' => ['', 'context'=>'cairocontext'], - 'CairoContext::getTolerance' => ['float', 'context'=>'cairocontext'], - 'CairoContext::glyphPath' => ['', 'glyphs'=>'array', 'context'=>'cairocontext'], - 'CairoContext::hasCurrentPoint' => ['bool', 'context'=>'cairocontext'], - 'CairoContext::identityMatrix' => ['', 'context'=>'cairocontext'], - 'CairoContext::inFill' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'CairoContext::inStroke' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'CairoContext::lineTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'CairoContext::mask' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], - 'CairoContext::maskSurface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], - 'CairoContext::moveTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'CairoContext::newPath' => ['', 'context'=>'cairocontext'], - 'CairoContext::newSubPath' => ['', 'context'=>'cairocontext'], - 'CairoContext::paint' => ['', 'context'=>'cairocontext'], - 'CairoContext::paintWithAlpha' => ['', 'alpha'=>'string', 'context'=>'cairocontext'], - 'CairoContext::pathExtents' => ['array', 'context'=>'cairocontext'], - 'CairoContext::popGroup' => ['', 'context'=>'cairocontext'], - 'CairoContext::popGroupToSource' => ['', 'context'=>'cairocontext'], - 'CairoContext::pushGroup' => ['', 'context'=>'cairocontext'], - 'CairoContext::pushGroupWithContent' => ['', 'content'=>'string', 'context'=>'cairocontext'], - 'CairoContext::rectangle' => ['', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string', 'context'=>'cairocontext'], - 'CairoContext::relCurveTo' => ['', 'x1'=>'string', 'y1'=>'string', 'x2'=>'string', 'y2'=>'string', 'x3'=>'string', 'y3'=>'string', 'context'=>'cairocontext'], - 'CairoContext::relLineTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'CairoContext::relMoveTo' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'CairoContext::resetClip' => ['', 'context'=>'cairocontext'], - 'CairoContext::restore' => ['', 'context'=>'cairocontext'], - 'CairoContext::rotate' => ['', 'angle'=>'string', 'context'=>'cairocontext'], - 'CairoContext::save' => ['', 'context'=>'cairocontext'], - 'CairoContext::scale' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'CairoContext::selectFontFace' => ['', 'family'=>'string', 'slant='=>'string', 'weight='=>'string', 'context='=>'cairocontext'], - 'CairoContext::setAntialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], - 'CairoContext::setDash' => ['', 'dashes'=>'array', 'offset='=>'string', 'context='=>'cairocontext'], - 'CairoContext::setFillRule' => ['', 'setting'=>'string', 'context'=>'cairocontext'], - 'CairoContext::setFontFace' => ['', 'fontface'=>'cairofontface', 'context'=>'cairocontext'], - 'CairoContext::setFontMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], - 'CairoContext::setFontOptions' => ['', 'fontoptions'=>'cairofontoptions', 'context'=>'cairocontext'], - 'CairoContext::setFontSize' => ['', 'size'=>'string', 'context'=>'cairocontext'], - 'CairoContext::setLineCap' => ['', 'setting'=>'string', 'context'=>'cairocontext'], - 'CairoContext::setLineJoin' => ['', 'setting'=>'string', 'context'=>'cairocontext'], - 'CairoContext::setLineWidth' => ['', 'width'=>'string', 'context'=>'cairocontext'], - 'CairoContext::setMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], - 'CairoContext::setMiterLimit' => ['', 'limit'=>'string', 'context'=>'cairocontext'], - 'CairoContext::setOperator' => ['', 'setting'=>'string', 'context'=>'cairocontext'], - 'CairoContext::setScaledFont' => ['', 'scaledfont'=>'cairoscaledfont', 'context'=>'cairocontext'], - 'CairoContext::setSource' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], - 'CairoContext::setSourceRGB' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], - 'CairoContext::setSourceRGBA' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], - 'CairoContext::setSourceSurface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], - 'CairoContext::setTolerance' => ['', 'tolerance'=>'string', 'context'=>'cairocontext'], - 'CairoContext::showPage' => ['', 'context'=>'cairocontext'], - 'CairoContext::showText' => ['', 'text'=>'string', 'context'=>'cairocontext'], - 'CairoContext::status' => ['int', 'context'=>'cairocontext'], - 'CairoContext::stroke' => ['', 'context'=>'cairocontext'], - 'CairoContext::strokeExtents' => ['array', 'context'=>'cairocontext'], - 'CairoContext::strokePreserve' => ['', 'context'=>'cairocontext'], - 'CairoContext::textExtents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], - 'CairoContext::textPath' => ['', 'string'=>'string', 'context'=>'cairocontext', 'text'=>'string'], - 'CairoContext::transform' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], - 'CairoContext::translate' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'CairoContext::userToDevice' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'CairoContext::userToDeviceDistance' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'CairoFontFace::__construct' => ['void'], - 'CairoFontFace::getType' => ['int'], - 'CairoFontFace::status' => ['int', 'fontface'=>'cairofontface'], - 'CairoFontOptions::__construct' => ['void'], - 'CairoFontOptions::equal' => ['bool', 'other'=>'string'], - 'CairoFontOptions::getAntialias' => ['int', 'context'=>'cairocontext'], - 'CairoFontOptions::getHintMetrics' => ['int'], - 'CairoFontOptions::getHintStyle' => ['int'], - 'CairoFontOptions::getSubpixelOrder' => ['int'], - 'CairoFontOptions::hash' => ['int'], - 'CairoFontOptions::merge' => ['void', 'other'=>'string'], - 'CairoFontOptions::setAntialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], - 'CairoFontOptions::setHintMetrics' => ['void', 'hint_metrics'=>'string'], - 'CairoFontOptions::setHintStyle' => ['void', 'hint_style'=>'string'], - 'CairoFontOptions::setSubpixelOrder' => ['void', 'subpixel_order'=>'string'], - 'CairoFontOptions::status' => ['int', 'context'=>'cairocontext'], - 'CairoFormat::strideForWidth' => ['int', 'format'=>'int', 'width'=>'int'], - 'CairoGradientPattern::addColorStopRgb' => ['void', 'offset'=>'string', 'red'=>'string', 'green'=>'string', 'blue'=>'string'], - 'CairoGradientPattern::addColorStopRgba' => ['void', 'offset'=>'string', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string'], - 'CairoGradientPattern::getColorStopCount' => ['int'], - 'CairoGradientPattern::getColorStopRgba' => ['array', 'index'=>'string'], - 'CairoGradientPattern::getExtend' => ['int'], - 'CairoGradientPattern::setExtend' => ['void', 'extend'=>'int'], - 'CairoImageSurface::__construct' => ['void', 'format'=>'int', 'width'=>'int', 'height'=>'int'], - 'CairoImageSurface::createForData' => ['void', 'data'=>'string', 'format'=>'int', 'width'=>'int', 'height'=>'int', 'stride='=>'int'], - 'CairoImageSurface::createFromPng' => ['CairoImageSurface', 'file'=>'string'], - 'CairoImageSurface::getData' => ['string'], - 'CairoImageSurface::getFormat' => ['int'], - 'CairoImageSurface::getHeight' => ['int'], - 'CairoImageSurface::getStride' => ['int'], - 'CairoImageSurface::getWidth' => ['int'], - 'CairoLinearGradient::__construct' => ['void', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float'], - 'CairoLinearGradient::getPoints' => ['array'], - 'CairoMatrix::__construct' => ['void', 'xx='=>'float', 'yx='=>'float', 'xy='=>'float', 'yy='=>'float', 'x0='=>'float', 'y0='=>'float'], - 'CairoMatrix::initIdentity' => ['object'], - 'CairoMatrix::initRotate' => ['object', 'radians'=>'float'], - 'CairoMatrix::initScale' => ['object', 'sx'=>'float', 'sy'=>'float'], - 'CairoMatrix::initTranslate' => ['object', 'tx'=>'float', 'ty'=>'float'], - 'CairoMatrix::invert' => ['void'], - 'CairoMatrix::multiply' => ['CairoMatrix', 'matrix1'=>'cairomatrix', 'matrix2'=>'cairomatrix'], - 'CairoMatrix::rotate' => ['', 'sx'=>'string', 'sy'=>'string', 'context'=>'cairocontext', 'angle'=>'string'], - 'CairoMatrix::scale' => ['', 'sx'=>'float', 'sy'=>'float', 'context'=>'cairocontext'], - 'CairoMatrix::transformDistance' => ['array', 'dx'=>'string', 'dy'=>'string'], - 'CairoMatrix::transformPoint' => ['array', 'dx'=>'string', 'dy'=>'string'], - 'CairoMatrix::translate' => ['', 'tx'=>'string', 'ty'=>'string', 'context'=>'cairocontext', 'x'=>'string', 'y'=>'string'], - 'CairoPattern::__construct' => ['void'], - 'CairoPattern::getMatrix' => ['', 'context'=>'cairocontext'], - 'CairoPattern::getType' => ['int'], - 'CairoPattern::setMatrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], - 'CairoPattern::status' => ['int', 'context'=>'cairocontext'], - 'CairoPdfSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], - 'CairoPdfSurface::setSize' => ['void', 'width'=>'string', 'height'=>'string'], - 'CairoPsSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], - 'CairoPsSurface::dscBeginPageSetup' => ['void'], - 'CairoPsSurface::dscBeginSetup' => ['void'], - 'CairoPsSurface::dscComment' => ['void', 'comment'=>'string'], - 'CairoPsSurface::getEps' => ['bool'], - 'CairoPsSurface::getLevels' => ['array'], - 'CairoPsSurface::levelToString' => ['string', 'level'=>'int'], - 'CairoPsSurface::restrictToLevel' => ['void', 'level'=>'string'], - 'CairoPsSurface::setEps' => ['void', 'level'=>'string'], - 'CairoPsSurface::setSize' => ['void', 'width'=>'string', 'height'=>'string'], - 'CairoRadialGradient::__construct' => ['void', 'x0'=>'float', 'y0'=>'float', 'r0'=>'float', 'x1'=>'float', 'y1'=>'float', 'r1'=>'float'], - 'CairoRadialGradient::getCircles' => ['array'], - 'CairoScaledFont::__construct' => ['void', 'font_face'=>'CairoFontFace', 'matrix'=>'CairoMatrix', 'ctm'=>'CairoMatrix', 'options'=>'CairoFontOptions'], - 'CairoScaledFont::extents' => ['array'], - 'CairoScaledFont::getCtm' => ['CairoMatrix'], - 'CairoScaledFont::getFontFace' => ['', 'context'=>'cairocontext'], - 'CairoScaledFont::getFontMatrix' => ['', 'context'=>'cairocontext'], - 'CairoScaledFont::getFontOptions' => ['', 'context'=>'cairocontext'], - 'CairoScaledFont::getScaleMatrix' => ['void'], - 'CairoScaledFont::getType' => ['int'], - 'CairoScaledFont::glyphExtents' => ['array', 'glyphs'=>'string'], - 'CairoScaledFont::status' => ['int', 'context'=>'cairocontext'], - 'CairoScaledFont::textExtents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], - 'CairoSolidPattern::__construct' => ['void', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha='=>'float'], - 'CairoSolidPattern::getRgba' => ['array'], - 'CairoSurface::__construct' => ['void'], - 'CairoSurface::copyPage' => ['', 'context'=>'cairocontext'], - 'CairoSurface::createSimilar' => ['void', 'other'=>'cairosurface', 'content'=>'int', 'width'=>'string', 'height'=>'string'], - 'CairoSurface::finish' => ['void'], - 'CairoSurface::flush' => ['void'], - 'CairoSurface::getContent' => ['int'], - 'CairoSurface::getDeviceOffset' => ['array'], - 'CairoSurface::getFontOptions' => ['', 'context'=>'cairocontext'], - 'CairoSurface::getType' => ['int'], - 'CairoSurface::markDirty' => ['void'], - 'CairoSurface::markDirtyRectangle' => ['void', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string'], - 'CairoSurface::setDeviceOffset' => ['void', 'x'=>'string', 'y'=>'string'], - 'CairoSurface::setFallbackResolution' => ['void', 'x'=>'string', 'y'=>'string'], - 'CairoSurface::showPage' => ['', 'context'=>'cairocontext'], - 'CairoSurface::status' => ['int', 'context'=>'cairocontext'], - 'CairoSurface::writeToPng' => ['void', 'file'=>'string'], - 'CairoSurfacePattern::__construct' => ['void', 'surface'=>'CairoSurface'], - 'CairoSurfacePattern::getExtend' => ['int'], - 'CairoSurfacePattern::getFilter' => ['int'], - 'CairoSurfacePattern::getSurface' => ['void'], - 'CairoSurfacePattern::setExtend' => ['void', 'extend'=>'int'], - 'CairoSurfacePattern::setFilter' => ['void', 'filter'=>'string'], - 'CairoSvgSurface::__construct' => ['void', 'file'=>'string', 'width'=>'float', 'height'=>'float'], - 'CairoSvgSurface::getVersions' => ['array'], - 'CairoSvgSurface::restrictToVersion' => ['void', 'version'=>'string'], - 'CairoSvgSurface::versionToString' => ['string', 'version'=>'int'], - 'CallbackFilterIterator::__construct' => ['void', 'iterator'=>'Iterator', 'func'=>'callable(mixed):bool|callable(mixed,mixed):bool|callable(mixed,mixed,mixed):bool'], - 'CallbackFilterIterator::accept' => ['bool'], - 'CallbackFilterIterator::current' => ['mixed'], - 'CallbackFilterIterator::getInnerIterator' => ['Iterator'], - 'CallbackFilterIterator::key' => ['mixed'], - 'CallbackFilterIterator::next' => ['void'], - 'CallbackFilterIterator::rewind' => ['void'], - 'CallbackFilterIterator::valid' => ['bool'], - 'ClosedGeneratorException::__clone' => ['void'], - 'ClosedGeneratorException::__toString' => ['string'], - 'ClosedGeneratorException::getCode' => ['int'], - 'ClosedGeneratorException::getFile' => ['string'], - 'ClosedGeneratorException::getLine' => ['int'], - 'ClosedGeneratorException::getMessage' => ['string'], - 'ClosedGeneratorException::getPrevious' => ['Throwable|ClosedGeneratorException|null'], - 'ClosedGeneratorException::getTrace' => ['list\',args?:array}>'], - 'ClosedGeneratorException::getTraceAsString' => ['string'], - 'Closure::__construct' => ['void'], - 'Closure::__invoke' => ['', '...args='=>''], - 'Closure::bind' => ['Closure|false', 'old'=>'Closure', 'to'=>'?object', 'scope='=>'object|string'], - 'Closure::bindTo' => ['Closure|false', 'new'=>'?object', 'newscope='=>'object|string'], - 'Closure::call' => ['', 'to'=>'object', '...parameters='=>''], - 'Collator::__construct' => ['void', 'locale'=>'string'], - 'Collator::asort' => ['bool', '&rw_arr'=>'array', 'sort_flag='=>'int'], - 'Collator::compare' => ['int|false', 'string1'=>'string', 'string2'=>'string'], - 'Collator::create' => ['?Collator', 'locale'=>'string'], - 'Collator::getAttribute' => ['int|false', 'attr'=>'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::setStrength' => ['bool', 'strength'=>'int'], - 'Collator::sort' => ['bool', '&rw_arr'=>'array', 'sort_flags='=>'int'], - 'Collator::sortWithSortKeys' => ['bool', '&rw_arr'=>'array'], - 'Collectable::isGarbage' => ['bool'], - 'Collectable::setGarbage' => ['void'], - 'Cond::broadcast' => ['bool', 'condition'=>'long'], - 'Cond::create' => ['long'], - 'Cond::destroy' => ['bool', 'condition'=>'long'], - 'Cond::signal' => ['bool', 'condition'=>'long'], - 'Cond::wait' => ['bool', 'condition'=>'long', 'mutex'=>'long', 'timeout='=>'long'], - 'Couchbase\AnalyticsQuery::__construct' => ['void'], - 'Couchbase\AnalyticsQuery::fromString' => ['Couchbase\AnalyticsQuery', 'statement'=>'string'], - 'Couchbase\BooleanFieldSearchQuery::__construct' => ['void'], - 'Couchbase\BooleanFieldSearchQuery::boost' => ['Couchbase\BooleanFieldSearchQuery', 'boost'=>'float'], - 'Couchbase\BooleanFieldSearchQuery::field' => ['Couchbase\BooleanFieldSearchQuery', 'field'=>'string'], - 'Couchbase\BooleanFieldSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\BooleanSearchQuery::__construct' => ['void'], - 'Couchbase\BooleanSearchQuery::boost' => ['Couchbase\BooleanSearchQuery', 'boost'=>'float'], - 'Couchbase\BooleanSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\BooleanSearchQuery::must' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], - 'Couchbase\BooleanSearchQuery::mustNot' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], - 'Couchbase\BooleanSearchQuery::should' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array'], - 'Couchbase\Bucket::__construct' => ['void'], - 'Couchbase\Bucket::__get' => ['int', 'name'=>'string'], - 'Couchbase\Bucket::__set' => ['int', 'name'=>'string', 'value'=>'int'], - 'Couchbase\Bucket::append' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], - 'Couchbase\Bucket::counter' => ['Couchbase\Document|array', 'ids'=>'array|string', 'delta='=>'int', 'options='=>'array'], - 'Couchbase\Bucket::decryptFields' => ['array', 'document'=>'array', 'fieldOptions'=>'', 'prefix='=>'string'], - 'Couchbase\Bucket::diag' => ['array', 'reportId='=>'string'], - 'Couchbase\Bucket::encryptFields' => ['array', 'document'=>'array', 'fieldOptions'=>'', 'prefix='=>'string'], - 'Couchbase\Bucket::get' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], - 'Couchbase\Bucket::getAndLock' => ['Couchbase\Document|array', 'ids'=>'array|string', 'lockTime'=>'int', 'options='=>'array'], - 'Couchbase\Bucket::getAndTouch' => ['Couchbase\Document|array', 'ids'=>'array|string', 'expiry'=>'int', 'options='=>'array'], - 'Couchbase\Bucket::getFromReplica' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], - 'Couchbase\Bucket::getName' => ['string'], - 'Couchbase\Bucket::insert' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], - 'Couchbase\Bucket::listExists' => ['bool', 'id'=>'string', 'value'=>'mixed'], - 'Couchbase\Bucket::listGet' => ['mixed', 'id'=>'string', 'index'=>'int'], - 'Couchbase\Bucket::listPush' => ['', 'id'=>'string', 'value'=>'mixed'], - 'Couchbase\Bucket::listRemove' => ['', 'id'=>'string', 'index'=>'int'], - 'Couchbase\Bucket::listSet' => ['', 'id'=>'string', 'index'=>'int', 'value'=>'mixed'], - 'Couchbase\Bucket::listShift' => ['', 'id'=>'string', 'value'=>'mixed'], - 'Couchbase\Bucket::listSize' => ['int', 'id'=>'string'], - 'Couchbase\Bucket::lookupIn' => ['Couchbase\LookupInBuilder', 'id'=>'string'], - 'Couchbase\Bucket::manager' => ['Couchbase\BucketManager'], - 'Couchbase\Bucket::mapAdd' => ['', 'id'=>'string', 'key'=>'string', 'value'=>'mixed'], - 'Couchbase\Bucket::mapGet' => ['mixed', 'id'=>'string', 'key'=>'string'], - 'Couchbase\Bucket::mapRemove' => ['', 'id'=>'string', 'key'=>'string'], - 'Couchbase\Bucket::mapSize' => ['int', 'id'=>'string'], - 'Couchbase\Bucket::mutateIn' => ['Couchbase\MutateInBuilder', 'id'=>'string', 'cas'=>'string'], - 'Couchbase\Bucket::ping' => ['array', 'services='=>'int', 'reportId='=>'string'], - 'Couchbase\Bucket::prepend' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], - 'Couchbase\Bucket::query' => ['object', 'query'=>'Couchbase\AnalyticsQuery|Couchbase\N1qlQuery|Couchbase\SearchQuery|Couchbase\SpatialViewQuery|Couchbase\ViewQuery', 'jsonAsArray='=>'bool'], - 'Couchbase\Bucket::queueAdd' => ['', 'id'=>'string', 'value'=>'mixed'], - 'Couchbase\Bucket::queueExists' => ['bool', 'id'=>'string', 'value'=>'mixed'], - 'Couchbase\Bucket::queueRemove' => ['mixed', 'id'=>'string'], - 'Couchbase\Bucket::queueSize' => ['int', 'id'=>'string'], - 'Couchbase\Bucket::remove' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], - 'Couchbase\Bucket::replace' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], - 'Couchbase\Bucket::retrieveIn' => ['Couchbase\DocumentFragment', 'id'=>'string', '...paths='=>'array'], - 'Couchbase\Bucket::setAdd' => ['', 'id'=>'string', 'value'=>'bool|float|int|string'], - 'Couchbase\Bucket::setExists' => ['bool', 'id'=>'string', 'value'=>'bool|float|int|string'], - 'Couchbase\Bucket::setRemove' => ['', 'id'=>'string', 'value'=>'bool|float|int|string'], - 'Couchbase\Bucket::setSize' => ['int', 'id'=>'string'], - 'Couchbase\Bucket::setTranscoder' => ['', 'encoder'=>'callable', 'decoder'=>'callable'], - 'Couchbase\Bucket::touch' => ['Couchbase\Document|array', 'ids'=>'array|string', 'expiry'=>'int', 'options='=>'array'], - 'Couchbase\Bucket::unlock' => ['Couchbase\Document|array', 'ids'=>'array|string', 'options='=>'array'], - 'Couchbase\Bucket::upsert' => ['Couchbase\Document|array', 'ids'=>'array|string', 'value'=>'mixed', 'options='=>'array'], - 'Couchbase\BucketManager::__construct' => ['void'], - 'Couchbase\BucketManager::createN1qlIndex' => ['', 'name'=>'string', 'fields'=>'array', 'whereClause='=>'string', 'ignoreIfExist='=>'bool', 'defer='=>'bool'], - 'Couchbase\BucketManager::createN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfExist='=>'bool', 'defer='=>'bool'], - 'Couchbase\BucketManager::dropN1qlIndex' => ['', 'name'=>'string', 'ignoreIfNotExist='=>'bool'], - 'Couchbase\BucketManager::dropN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfNotExist='=>'bool'], - 'Couchbase\BucketManager::flush' => [''], - 'Couchbase\BucketManager::getDesignDocument' => ['array', 'name'=>'string'], - 'Couchbase\BucketManager::info' => ['array'], - 'Couchbase\BucketManager::insertDesignDocument' => ['', 'name'=>'string', 'document'=>'array'], - 'Couchbase\BucketManager::listDesignDocuments' => ['array'], - 'Couchbase\BucketManager::listN1qlIndexes' => ['array'], - 'Couchbase\BucketManager::removeDesignDocument' => ['', 'name'=>'string'], - 'Couchbase\BucketManager::upsertDesignDocument' => ['', 'name'=>'string', 'document'=>'array'], - 'Couchbase\ClassicAuthenticator::bucket' => ['', 'name'=>'string', 'password'=>'string'], - 'Couchbase\ClassicAuthenticator::cluster' => ['', 'username'=>'string', 'password'=>'string'], - 'Couchbase\Cluster::__construct' => ['void', 'connstr'=>'string'], - 'Couchbase\Cluster::authenticate' => ['null', 'authenticator'=>'Couchbase\Authenticator'], - 'Couchbase\Cluster::authenticateAs' => ['null', 'username'=>'string', 'password'=>'string'], - 'Couchbase\Cluster::manager' => ['Couchbase\ClusterManager', 'username='=>'string', 'password='=>'string'], - 'Couchbase\Cluster::openBucket' => ['Couchbase\Bucket', 'name='=>'string', 'password='=>'string'], - 'Couchbase\ClusterManager::__construct' => ['void'], - 'Couchbase\ClusterManager::createBucket' => ['', 'name'=>'string', 'options='=>'array'], - 'Couchbase\ClusterManager::getUser' => ['array', 'username'=>'string', 'domain='=>'int'], - 'Couchbase\ClusterManager::info' => ['array'], - 'Couchbase\ClusterManager::listBuckets' => ['array'], - 'Couchbase\ClusterManager::listUsers' => ['array', 'domain='=>'int'], - 'Couchbase\ClusterManager::removeBucket' => ['', 'name'=>'string'], - 'Couchbase\ClusterManager::removeUser' => ['', 'name'=>'string', 'domain='=>'int'], - 'Couchbase\ClusterManager::upsertUser' => ['', 'name'=>'string', 'settings'=>'Couchbase\UserSettings', 'domain='=>'int'], - 'Couchbase\ConjunctionSearchQuery::__construct' => ['void'], - 'Couchbase\ConjunctionSearchQuery::boost' => ['Couchbase\ConjunctionSearchQuery', 'boost'=>'float'], - 'Couchbase\ConjunctionSearchQuery::every' => ['Couchbase\ConjunctionSearchQuery', '...queries='=>'array'], - 'Couchbase\ConjunctionSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\DateRangeSearchFacet::__construct' => ['void'], - 'Couchbase\DateRangeSearchFacet::addRange' => ['Couchbase\DateRangeSearchFacet', 'name'=>'string', 'start'=>'int|string', 'end'=>'int|string'], - 'Couchbase\DateRangeSearchFacet::jsonSerialize' => ['array'], - 'Couchbase\DateRangeSearchQuery::__construct' => ['void'], - 'Couchbase\DateRangeSearchQuery::boost' => ['Couchbase\DateRangeSearchQuery', 'boost'=>'float'], - 'Couchbase\DateRangeSearchQuery::dateTimeParser' => ['Couchbase\DateRangeSearchQuery', 'dateTimeParser'=>'string'], - 'Couchbase\DateRangeSearchQuery::end' => ['Couchbase\DateRangeSearchQuery', 'end'=>'int|string', 'inclusive='=>'bool'], - 'Couchbase\DateRangeSearchQuery::field' => ['Couchbase\DateRangeSearchQuery', 'field'=>'string'], - 'Couchbase\DateRangeSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\DateRangeSearchQuery::start' => ['Couchbase\DateRangeSearchQuery', 'start'=>'int|string', 'inclusive='=>'bool'], - 'Couchbase\DisjunctionSearchQuery::__construct' => ['void'], - 'Couchbase\DisjunctionSearchQuery::boost' => ['Couchbase\DisjunctionSearchQuery', 'boost'=>'float'], - 'Couchbase\DisjunctionSearchQuery::either' => ['Couchbase\DisjunctionSearchQuery', '...queries='=>'array'], - 'Couchbase\DisjunctionSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\DisjunctionSearchQuery::min' => ['Couchbase\DisjunctionSearchQuery', 'min'=>'int'], - 'Couchbase\DocIdSearchQuery::__construct' => ['void'], - 'Couchbase\DocIdSearchQuery::boost' => ['Couchbase\DocIdSearchQuery', 'boost'=>'float'], - 'Couchbase\DocIdSearchQuery::docIds' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array'], - 'Couchbase\DocIdSearchQuery::field' => ['Couchbase\DocIdSearchQuery', 'field'=>'string'], - 'Couchbase\DocIdSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\GeoBoundingBoxSearchQuery::__construct' => ['void'], - 'Couchbase\GeoBoundingBoxSearchQuery::boost' => ['Couchbase\GeoBoundingBoxSearchQuery', 'boost'=>'float'], - 'Couchbase\GeoBoundingBoxSearchQuery::field' => ['Couchbase\GeoBoundingBoxSearchQuery', 'field'=>'string'], - 'Couchbase\GeoBoundingBoxSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\GeoDistanceSearchQuery::__construct' => ['void'], - 'Couchbase\GeoDistanceSearchQuery::boost' => ['Couchbase\GeoDistanceSearchQuery', 'boost'=>'float'], - 'Couchbase\GeoDistanceSearchQuery::field' => ['Couchbase\GeoDistanceSearchQuery', 'field'=>'string'], - 'Couchbase\GeoDistanceSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\LookupInBuilder::__construct' => ['void'], - 'Couchbase\LookupInBuilder::execute' => ['Couchbase\DocumentFragment'], - 'Couchbase\LookupInBuilder::exists' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], - 'Couchbase\LookupInBuilder::get' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], - 'Couchbase\LookupInBuilder::getCount' => ['Couchbase\LookupInBuilder', 'path'=>'string', 'options='=>'array'], - 'Couchbase\MatchAllSearchQuery::__construct' => ['void'], - 'Couchbase\MatchAllSearchQuery::boost' => ['Couchbase\MatchAllSearchQuery', 'boost'=>'float'], - 'Couchbase\MatchAllSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\MatchNoneSearchQuery::__construct' => ['void'], - 'Couchbase\MatchNoneSearchQuery::boost' => ['Couchbase\MatchNoneSearchQuery', 'boost'=>'float'], - 'Couchbase\MatchNoneSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\MatchPhraseSearchQuery::__construct' => ['void'], - 'Couchbase\MatchPhraseSearchQuery::analyzer' => ['Couchbase\MatchPhraseSearchQuery', 'analyzer'=>'string'], - 'Couchbase\MatchPhraseSearchQuery::boost' => ['Couchbase\MatchPhraseSearchQuery', 'boost'=>'float'], - 'Couchbase\MatchPhraseSearchQuery::field' => ['Couchbase\MatchPhraseSearchQuery', 'field'=>'string'], - 'Couchbase\MatchPhraseSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\MatchSearchQuery::__construct' => ['void'], - 'Couchbase\MatchSearchQuery::analyzer' => ['Couchbase\MatchSearchQuery', 'analyzer'=>'string'], - 'Couchbase\MatchSearchQuery::boost' => ['Couchbase\MatchSearchQuery', 'boost'=>'float'], - 'Couchbase\MatchSearchQuery::field' => ['Couchbase\MatchSearchQuery', 'field'=>'string'], - 'Couchbase\MatchSearchQuery::fuzziness' => ['Couchbase\MatchSearchQuery', 'fuzziness'=>'int'], - 'Couchbase\MatchSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\MatchSearchQuery::prefixLength' => ['Couchbase\MatchSearchQuery', 'prefixLength'=>'int'], - 'Couchbase\MutateInBuilder::__construct' => ['void'], - 'Couchbase\MutateInBuilder::arrayAddUnique' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], - 'Couchbase\MutateInBuilder::arrayAppend' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], - 'Couchbase\MutateInBuilder::arrayAppendAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array|bool'], - 'Couchbase\MutateInBuilder::arrayInsert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array'], - 'Couchbase\MutateInBuilder::arrayInsertAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array'], - 'Couchbase\MutateInBuilder::arrayPrepend' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], - 'Couchbase\MutateInBuilder::arrayPrependAll' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'values'=>'array', 'options='=>'array|bool'], - 'Couchbase\MutateInBuilder::counter' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'delta'=>'int', 'options='=>'array|bool'], - 'Couchbase\MutateInBuilder::execute' => ['Couchbase\DocumentFragment'], - 'Couchbase\MutateInBuilder::insert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], - 'Couchbase\MutateInBuilder::modeDocument' => ['', 'mode'=>'int'], - 'Couchbase\MutateInBuilder::remove' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'options='=>'array'], - 'Couchbase\MutateInBuilder::replace' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array'], - 'Couchbase\MutateInBuilder::upsert' => ['Couchbase\MutateInBuilder', 'path'=>'string', 'value'=>'mixed', 'options='=>'array|bool'], - 'Couchbase\MutateInBuilder::withExpiry' => ['Couchbase\MutateInBuilder', 'expiry'=>'Couchbase\expiry'], - 'Couchbase\MutationState::__construct' => ['void'], - 'Couchbase\MutationState::add' => ['', 'source'=>'Couchbase\Document|Couchbase\DocumentFragment|array'], - 'Couchbase\MutationState::from' => ['Couchbase\MutationState', 'source'=>'Couchbase\Document|Couchbase\DocumentFragment|array'], - 'Couchbase\MutationToken::__construct' => ['void'], - 'Couchbase\MutationToken::bucketName' => ['string'], - 'Couchbase\MutationToken::from' => ['', 'bucketName'=>'string', 'vbucketId'=>'int', 'vbucketUuid'=>'string', 'sequenceNumber'=>'string'], - 'Couchbase\MutationToken::sequenceNumber' => ['string'], - 'Couchbase\MutationToken::vbucketId' => ['int'], - 'Couchbase\MutationToken::vbucketUuid' => ['string'], - 'Couchbase\N1qlIndex::__construct' => ['void'], - 'Couchbase\N1qlQuery::__construct' => ['void'], - 'Couchbase\N1qlQuery::adhoc' => ['Couchbase\N1qlQuery', 'adhoc'=>'bool'], - 'Couchbase\N1qlQuery::consistency' => ['Couchbase\N1qlQuery', 'consistency'=>'int'], - 'Couchbase\N1qlQuery::consistentWith' => ['Couchbase\N1qlQuery', 'state'=>'Couchbase\MutationState'], - 'Couchbase\N1qlQuery::crossBucket' => ['Couchbase\N1qlQuery', 'crossBucket'=>'bool'], - 'Couchbase\N1qlQuery::fromString' => ['Couchbase\N1qlQuery', 'statement'=>'string'], - 'Couchbase\N1qlQuery::maxParallelism' => ['Couchbase\N1qlQuery', 'maxParallelism'=>'int'], - 'Couchbase\N1qlQuery::namedParams' => ['Couchbase\N1qlQuery', 'params'=>'array'], - 'Couchbase\N1qlQuery::pipelineBatch' => ['Couchbase\N1qlQuery', 'pipelineBatch'=>'int'], - 'Couchbase\N1qlQuery::pipelineCap' => ['Couchbase\N1qlQuery', 'pipelineCap'=>'int'], - 'Couchbase\N1qlQuery::positionalParams' => ['Couchbase\N1qlQuery', 'params'=>'array'], - 'Couchbase\N1qlQuery::profile' => ['', 'profileType'=>'string'], - 'Couchbase\N1qlQuery::readonly' => ['Couchbase\N1qlQuery', 'readonly'=>'bool'], - 'Couchbase\N1qlQuery::scanCap' => ['Couchbase\N1qlQuery', 'scanCap'=>'int'], - 'Couchbase\NumericRangeSearchFacet::__construct' => ['void'], - 'Couchbase\NumericRangeSearchFacet::addRange' => ['Couchbase\NumericRangeSearchFacet', 'name'=>'string', 'min'=>'float', 'max'=>'float'], - 'Couchbase\NumericRangeSearchFacet::jsonSerialize' => ['array'], - 'Couchbase\NumericRangeSearchQuery::__construct' => ['void'], - 'Couchbase\NumericRangeSearchQuery::boost' => ['Couchbase\NumericRangeSearchQuery', 'boost'=>'float'], - 'Couchbase\NumericRangeSearchQuery::field' => ['Couchbase\NumericRangeSearchQuery', 'field'=>'string'], - 'Couchbase\NumericRangeSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\NumericRangeSearchQuery::max' => ['Couchbase\NumericRangeSearchQuery', 'max'=>'float', 'inclusive='=>'bool'], - 'Couchbase\NumericRangeSearchQuery::min' => ['Couchbase\NumericRangeSearchQuery', 'min'=>'float', 'inclusive='=>'bool'], - 'Couchbase\PasswordAuthenticator::password' => ['Couchbase\PasswordAuthenticator', 'password'=>'string'], - 'Couchbase\PasswordAuthenticator::username' => ['Couchbase\PasswordAuthenticator', 'username'=>'string'], - 'Couchbase\PhraseSearchQuery::__construct' => ['void'], - 'Couchbase\PhraseSearchQuery::boost' => ['Couchbase\PhraseSearchQuery', 'boost'=>'float'], - 'Couchbase\PhraseSearchQuery::field' => ['Couchbase\PhraseSearchQuery', 'field'=>'string'], - 'Couchbase\PhraseSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\PrefixSearchQuery::__construct' => ['void'], - 'Couchbase\PrefixSearchQuery::boost' => ['Couchbase\PrefixSearchQuery', 'boost'=>'float'], - 'Couchbase\PrefixSearchQuery::field' => ['Couchbase\PrefixSearchQuery', 'field'=>'string'], - 'Couchbase\PrefixSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\QueryStringSearchQuery::__construct' => ['void'], - 'Couchbase\QueryStringSearchQuery::boost' => ['Couchbase\QueryStringSearchQuery', 'boost'=>'float'], - 'Couchbase\QueryStringSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\RegexpSearchQuery::__construct' => ['void'], - 'Couchbase\RegexpSearchQuery::boost' => ['Couchbase\RegexpSearchQuery', 'boost'=>'float'], - 'Couchbase\RegexpSearchQuery::field' => ['Couchbase\RegexpSearchQuery', 'field'=>'string'], - 'Couchbase\RegexpSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\SearchQuery::__construct' => ['void', 'indexName'=>'string', 'queryPart'=>'Couchbase\SearchQueryPart'], - 'Couchbase\SearchQuery::addFacet' => ['Couchbase\SearchQuery', 'name'=>'string', 'facet'=>'Couchbase\SearchFacet'], - 'Couchbase\SearchQuery::boolean' => ['Couchbase\BooleanSearchQuery'], - 'Couchbase\SearchQuery::booleanField' => ['Couchbase\BooleanFieldSearchQuery', 'value'=>'bool'], - 'Couchbase\SearchQuery::conjuncts' => ['Couchbase\ConjunctionSearchQuery', '...queries='=>'array'], - 'Couchbase\SearchQuery::consistentWith' => ['Couchbase\SearchQuery', 'state'=>'Couchbase\MutationState'], - 'Couchbase\SearchQuery::dateRange' => ['Couchbase\DateRangeSearchQuery'], - 'Couchbase\SearchQuery::dateRangeFacet' => ['Couchbase\DateRangeSearchFacet', 'field'=>'string', 'limit'=>'int'], - 'Couchbase\SearchQuery::disjuncts' => ['Couchbase\DisjunctionSearchQuery', '...queries='=>'array'], - 'Couchbase\SearchQuery::docId' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array'], - 'Couchbase\SearchQuery::explain' => ['Couchbase\SearchQuery', 'explain'=>'bool'], - 'Couchbase\SearchQuery::fields' => ['Couchbase\SearchQuery', '...fields='=>'array'], - 'Couchbase\SearchQuery::geoBoundingBox' => ['Couchbase\GeoBoundingBoxSearchQuery', 'topLeftLongitude'=>'float', 'topLeftLatitude'=>'float', 'bottomRightLongitude'=>'float', 'bottomRightLatitude'=>'float'], - 'Couchbase\SearchQuery::geoDistance' => ['Couchbase\GeoDistanceSearchQuery', 'longitude'=>'float', 'latitude'=>'float', 'distance'=>'string'], - 'Couchbase\SearchQuery::highlight' => ['Couchbase\SearchQuery', 'style'=>'string', '...fields='=>'array'], - 'Couchbase\SearchQuery::jsonSerialize' => ['array'], - 'Couchbase\SearchQuery::limit' => ['Couchbase\SearchQuery', 'limit'=>'int'], - 'Couchbase\SearchQuery::match' => ['Couchbase\MatchSearchQuery', 'match'=>'string'], - 'Couchbase\SearchQuery::matchAll' => ['Couchbase\MatchAllSearchQuery'], - 'Couchbase\SearchQuery::matchNone' => ['Couchbase\MatchNoneSearchQuery'], - 'Couchbase\SearchQuery::matchPhrase' => ['Couchbase\MatchPhraseSearchQuery', '...terms='=>'array'], - 'Couchbase\SearchQuery::numericRange' => ['Couchbase\NumericRangeSearchQuery'], - 'Couchbase\SearchQuery::numericRangeFacet' => ['Couchbase\NumericRangeSearchFacet', 'field'=>'string', 'limit'=>'int'], - 'Couchbase\SearchQuery::prefix' => ['Couchbase\PrefixSearchQuery', 'prefix'=>'string'], - 'Couchbase\SearchQuery::queryString' => ['Couchbase\QueryStringSearchQuery', 'queryString'=>'string'], - 'Couchbase\SearchQuery::regexp' => ['Couchbase\RegexpSearchQuery', 'regexp'=>'string'], - 'Couchbase\SearchQuery::serverSideTimeout' => ['Couchbase\SearchQuery', 'serverSideTimeout'=>'int'], - 'Couchbase\SearchQuery::skip' => ['Couchbase\SearchQuery', 'skip'=>'int'], - 'Couchbase\SearchQuery::sort' => ['Couchbase\SearchQuery', '...sort='=>'array'], - 'Couchbase\SearchQuery::term' => ['Couchbase\TermSearchQuery', 'term'=>'string'], - 'Couchbase\SearchQuery::termFacet' => ['Couchbase\TermSearchFacet', 'field'=>'string', 'limit'=>'int'], - 'Couchbase\SearchQuery::termRange' => ['Couchbase\TermRangeSearchQuery'], - 'Couchbase\SearchQuery::wildcard' => ['Couchbase\WildcardSearchQuery', 'wildcard'=>'string'], - 'Couchbase\SearchSort::__construct' => ['void'], - 'Couchbase\SearchSort::field' => ['Couchbase\SearchSortField', 'field'=>'string'], - 'Couchbase\SearchSort::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], - 'Couchbase\SearchSort::id' => ['Couchbase\SearchSortId'], - 'Couchbase\SearchSort::score' => ['Couchbase\SearchSortScore'], - 'Couchbase\SearchSortField::__construct' => ['void'], - 'Couchbase\SearchSortField::descending' => ['Couchbase\SearchSortField', 'descending'=>'bool'], - 'Couchbase\SearchSortField::field' => ['Couchbase\SearchSortField', 'field'=>'string'], - 'Couchbase\SearchSortField::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], - 'Couchbase\SearchSortField::id' => ['Couchbase\SearchSortId'], - 'Couchbase\SearchSortField::jsonSerialize' => ['mixed'], - 'Couchbase\SearchSortField::missing' => ['', 'missing'=>'string'], - 'Couchbase\SearchSortField::mode' => ['', 'mode'=>'string'], - 'Couchbase\SearchSortField::score' => ['Couchbase\SearchSortScore'], - 'Couchbase\SearchSortField::type' => ['', 'type'=>'string'], - 'Couchbase\SearchSortGeoDistance::__construct' => ['void'], - 'Couchbase\SearchSortGeoDistance::descending' => ['Couchbase\SearchSortGeoDistance', 'descending'=>'bool'], - 'Couchbase\SearchSortGeoDistance::field' => ['Couchbase\SearchSortField', 'field'=>'string'], - 'Couchbase\SearchSortGeoDistance::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], - 'Couchbase\SearchSortGeoDistance::id' => ['Couchbase\SearchSortId'], - 'Couchbase\SearchSortGeoDistance::jsonSerialize' => ['mixed'], - 'Couchbase\SearchSortGeoDistance::score' => ['Couchbase\SearchSortScore'], - 'Couchbase\SearchSortGeoDistance::unit' => ['Couchbase\SearchSortGeoDistance', 'unit'=>'string'], - 'Couchbase\SearchSortId::__construct' => ['void'], - 'Couchbase\SearchSortId::descending' => ['Couchbase\SearchSortId', 'descending'=>'bool'], - 'Couchbase\SearchSortId::field' => ['Couchbase\SearchSortField', 'field'=>'string'], - 'Couchbase\SearchSortId::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], - 'Couchbase\SearchSortId::id' => ['Couchbase\SearchSortId'], - 'Couchbase\SearchSortId::jsonSerialize' => ['mixed'], - 'Couchbase\SearchSortId::score' => ['Couchbase\SearchSortScore'], - 'Couchbase\SearchSortScore::__construct' => ['void'], - 'Couchbase\SearchSortScore::descending' => ['Couchbase\SearchSortScore', 'descending'=>'bool'], - 'Couchbase\SearchSortScore::field' => ['Couchbase\SearchSortField', 'field'=>'string'], - 'Couchbase\SearchSortScore::geoDistance' => ['Couchbase\SearchSortGeoDistance', 'field'=>'string', 'longitude'=>'float', 'latitude'=>'float'], - 'Couchbase\SearchSortScore::id' => ['Couchbase\SearchSortId'], - 'Couchbase\SearchSortScore::jsonSerialize' => ['mixed'], - 'Couchbase\SearchSortScore::score' => ['Couchbase\SearchSortScore'], - 'Couchbase\SpatialViewQuery::__construct' => ['void'], - 'Couchbase\SpatialViewQuery::bbox' => ['Couchbase\SpatialViewQuery', 'bbox'=>'array'], - 'Couchbase\SpatialViewQuery::consistency' => ['Couchbase\SpatialViewQuery', 'consistency'=>'int'], - 'Couchbase\SpatialViewQuery::custom' => ['', 'customParameters'=>'array'], - 'Couchbase\SpatialViewQuery::encode' => ['array'], - 'Couchbase\SpatialViewQuery::endRange' => ['Couchbase\SpatialViewQuery', 'range'=>'array'], - 'Couchbase\SpatialViewQuery::limit' => ['Couchbase\SpatialViewQuery', 'limit'=>'int'], - 'Couchbase\SpatialViewQuery::order' => ['Couchbase\SpatialViewQuery', 'order'=>'int'], - 'Couchbase\SpatialViewQuery::skip' => ['Couchbase\SpatialViewQuery', 'skip'=>'int'], - 'Couchbase\SpatialViewQuery::startRange' => ['Couchbase\SpatialViewQuery', 'range'=>'array'], - 'Couchbase\TermRangeSearchQuery::__construct' => ['void'], - 'Couchbase\TermRangeSearchQuery::boost' => ['Couchbase\TermRangeSearchQuery', 'boost'=>'float'], - 'Couchbase\TermRangeSearchQuery::field' => ['Couchbase\TermRangeSearchQuery', 'field'=>'string'], - 'Couchbase\TermRangeSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\TermRangeSearchQuery::max' => ['Couchbase\TermRangeSearchQuery', 'max'=>'string', 'inclusive='=>'bool'], - 'Couchbase\TermRangeSearchQuery::min' => ['Couchbase\TermRangeSearchQuery', 'min'=>'string', 'inclusive='=>'bool'], - 'Couchbase\TermSearchFacet::__construct' => ['void'], - 'Couchbase\TermSearchFacet::jsonSerialize' => ['array'], - 'Couchbase\TermSearchQuery::__construct' => ['void'], - 'Couchbase\TermSearchQuery::boost' => ['Couchbase\TermSearchQuery', 'boost'=>'float'], - 'Couchbase\TermSearchQuery::field' => ['Couchbase\TermSearchQuery', 'field'=>'string'], - 'Couchbase\TermSearchQuery::fuzziness' => ['Couchbase\TermSearchQuery', 'fuzziness'=>'int'], - 'Couchbase\TermSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\TermSearchQuery::prefixLength' => ['Couchbase\TermSearchQuery', 'prefixLength'=>'int'], - 'Couchbase\UserSettings::fullName' => ['Couchbase\UserSettings', 'fullName'=>'string'], - 'Couchbase\UserSettings::password' => ['Couchbase\UserSettings', 'password'=>'string'], - 'Couchbase\UserSettings::role' => ['Couchbase\UserSettings', 'role'=>'string', 'bucket='=>'string'], - 'Couchbase\ViewQuery::__construct' => ['void'], - 'Couchbase\ViewQuery::consistency' => ['Couchbase\ViewQuery', 'consistency'=>'int'], - 'Couchbase\ViewQuery::custom' => ['Couchbase\ViewQuery', 'customParameters'=>'array'], - 'Couchbase\ViewQuery::encode' => ['array'], - 'Couchbase\ViewQuery::from' => ['Couchbase\ViewQuery', 'designDocumentName'=>'string', 'viewName'=>'string'], - 'Couchbase\ViewQuery::fromSpatial' => ['Couchbase\SpatialViewQuery', 'designDocumentName'=>'string', 'viewName'=>'string'], - 'Couchbase\ViewQuery::group' => ['Couchbase\ViewQuery', 'group'=>'bool'], - 'Couchbase\ViewQuery::groupLevel' => ['Couchbase\ViewQuery', 'groupLevel'=>'int'], - 'Couchbase\ViewQuery::idRange' => ['Couchbase\ViewQuery', 'startKeyDocumentId'=>'string', 'endKeyDocumentId'=>'string'], - 'Couchbase\ViewQuery::key' => ['Couchbase\ViewQuery', 'key'=>'mixed'], - 'Couchbase\ViewQuery::keys' => ['Couchbase\ViewQuery', 'keys'=>'array'], - 'Couchbase\ViewQuery::limit' => ['Couchbase\ViewQuery', 'limit'=>'int'], - 'Couchbase\ViewQuery::order' => ['Couchbase\ViewQuery', 'order'=>'int'], - 'Couchbase\ViewQuery::range' => ['Couchbase\ViewQuery', 'startKey'=>'mixed', 'endKey'=>'mixed', 'inclusiveEnd='=>'bool'], - 'Couchbase\ViewQuery::reduce' => ['Couchbase\ViewQuery', 'reduce'=>'bool'], - 'Couchbase\ViewQuery::skip' => ['Couchbase\ViewQuery', 'skip'=>'int'], - 'Couchbase\ViewQueryEncodable::encode' => ['array'], - 'Couchbase\WildcardSearchQuery::__construct' => ['void'], - 'Couchbase\WildcardSearchQuery::boost' => ['Couchbase\WildcardSearchQuery', 'boost'=>'float'], - 'Couchbase\WildcardSearchQuery::field' => ['Couchbase\WildcardSearchQuery', 'field'=>'string'], - 'Couchbase\WildcardSearchQuery::jsonSerialize' => ['array'], - 'Couchbase\basicDecoderV1' => ['mixed', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int', 'options'=>'array'], - 'Couchbase\basicEncoderV1' => ['array', 'value'=>'mixed', 'options'=>'array'], - 'Couchbase\defaultDecoder' => ['mixed', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int'], - 'Couchbase\defaultEncoder' => ['array', 'value'=>'mixed'], - 'Couchbase\fastlzCompress' => ['string', 'data'=>'string'], - 'Couchbase\fastlzDecompress' => ['string', 'data'=>'string'], - 'Couchbase\passthruDecoder' => ['string', 'bytes'=>'string', 'flags'=>'int', 'datatype'=>'int'], - 'Couchbase\passthruEncoder' => ['array', 'value'=>'string'], - 'Couchbase\zlibCompress' => ['string', 'data'=>'string'], - 'Couchbase\zlibDecompress' => ['string', 'data'=>'string'], - 'Countable::count' => ['int'], - 'DOMAttr::__construct' => ['void', 'name'=>'string', 'value='=>'string'], - 'DOMAttr::getLineNo' => ['int'], - 'DOMAttr::getNodePath' => ['?string'], - 'DOMAttr::hasAttributes' => ['bool'], - 'DOMAttr::hasChildNodes' => ['bool'], - 'DOMAttr::insertBefore' => ['DOMNode', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode'], - 'DOMAttr::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'], - 'DOMAttr::isId' => ['bool'], - 'DOMAttr::isSameNode' => ['bool', 'node'=>'DOMNode'], - 'DOMAttr::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], - 'DOMAttr::lookupNamespaceUri' => ['string', 'prefix'=>'string'], - 'DOMAttr::lookupPrefix' => ['string', 'namespaceuri'=>'string'], - 'DOMAttr::normalize' => ['void'], - 'DOMAttr::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], - 'DOMAttr::replaceChild' => ['DOMNode', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], - 'DOMCdataSection::__construct' => ['void', 'value'=>'string'], - 'DOMCharacterData::appendData' => ['void', 'data'=>'string'], - 'DOMCharacterData::deleteData' => ['void', 'offset'=>'int', 'count'=>'int'], - 'DOMCharacterData::insertData' => ['void', 'offset'=>'int', 'data'=>'string'], - 'DOMCharacterData::replaceData' => ['void', 'offset'=>'int', 'count'=>'int', 'data'=>'string'], - 'DOMCharacterData::substringData' => ['string', 'offset'=>'int', 'count'=>'int'], - 'DOMComment::__construct' => ['void', 'value='=>'string'], - 'DOMDocument::__construct' => ['void', 'version='=>'string', 'encoding='=>'string'], - 'DOMDocument::createAttribute' => ['DOMAttr|false', 'name'=>'string'], - 'DOMDocument::createAttributeNS' => ['DOMAttr|false', 'namespaceuri'=>'string', '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', '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', 'localname'=>'string'], - 'DOMDocument::importNode' => ['DOMNode|false', 'importednode'=>'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::relaxNGValidate' => ['bool', 'filename'=>'string'], - 'DOMDocument::relaxNGValidateSource' => ['bool', 'source'=>'string'], - 'DOMDocument::save' => ['int|false', 'filename'=>'string', 'options='=>'int'], - 'DOMDocument::saveHTML' => ['string|false', 'node='=>'?DOMNode'], - 'DOMDocument::saveHTMLFile' => ['int|false', 'filename'=>'string'], - 'DOMDocument::saveXML' => ['string|false', 'node='=>'?DOMNode', 'options='=>'int'], - 'DOMDocument::schemaValidate' => ['bool', 'filename'=>'string', 'flags='=>'int'], - 'DOMDocument::schemaValidateSource' => ['bool', 'source'=>'string', 'flags='=>'int'], - 'DOMDocument::validate' => ['bool'], - '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', 'localname'=>'string'], - 'DOMElement::getAttributeNode' => ['DOMAttr', 'name'=>'string'], - 'DOMElement::getAttributeNodeNS' => ['DOMAttr', 'namespaceuri'=>'string', 'localname'=>'string'], - 'DOMElement::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'], - 'DOMElement::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string', 'localname'=>'string'], - 'DOMElement::get_attribute' => ['string', 'name'=>'string'], - 'DOMElement::get_attribute_node' => ['DomAttribute', 'name'=>'string'], - 'DOMElement::get_elements_by_tagname' => ['array', 'name'=>'string'], - 'DOMElement::hasAttribute' => ['bool', 'name'=>'string'], - 'DOMElement::hasAttributeNS' => ['bool', 'namespaceuri'=>'string', 'localname'=>'string'], - 'DOMElement::has_attribute' => ['bool', 'name'=>'string'], - 'DOMElement::removeAttribute' => ['bool', 'name'=>'string'], - 'DOMElement::removeAttributeNS' => ['bool', 'namespaceuri'=>'string', 'localname'=>'string'], - 'DOMElement::removeAttributeNode' => ['bool', 'oldnode'=>'DOMAttr'], - 'DOMElement::remove_attribute' => ['bool', 'name'=>'string'], - 'DOMElement::setAttribute' => ['DOMAttr|false', 'name'=>'string', 'value'=>'string'], - 'DOMElement::setAttributeNS' => ['void', 'namespaceuri'=>'string', '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::set_attribute' => ['DomAttribute', 'name'=>'string', 'value'=>'string'], - 'DOMElement::set_attribute_node' => ['DomNode', 'attr'=>'DOMNode'], - 'DOMElement::tagname' => ['string'], - '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::hasFeature' => ['bool', 'feature'=>'string', 'version'=>'string'], - 'DOMNamedNodeMap::count' => ['int'], - 'DOMNamedNodeMap::getNamedItem' => ['?DOMNode', 'name'=>'string'], - 'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespaceuri'=>'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::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::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], - 'DOMNode::lookupNamespaceURI' => ['string', 'prefix'=>'string'], - 'DOMNode::lookupPrefix' => ['string', 'namespaceuri'=>'string'], - 'DOMNode::normalize' => ['void'], - 'DOMNode::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], - 'DOMNode::replaceChild' => ['DOMNode|false', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], - 'DOMNodeList::item' => ['?DOMNode', 'index'=>'int'], - 'DOMProcessingInstruction::__construct' => ['void', 'name'=>'string', 'value'=>'string'], - 'DOMText::__construct' => ['void', 'value='=>'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'], - '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::__set_state' => ['DateInterval', 'array'=>'array'], - 'DateInterval::__wakeup' => ['void'], - 'DateInterval::createFromDateString' => ['DateInterval|false', 'time'=>'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'], - 'DatePeriod::__construct\'2' => ['void', 'iso'=>'string', 'options='=>'int'], - 'DatePeriod::__wakeup' => ['void'], - 'DatePeriod::getDateInterval' => ['DateInterval'], - 'DatePeriod::getEndDate' => ['?DateTimeInterface'], - 'DatePeriod::getStartDate' => ['DateTimeInterface'], - 'DateTime::__construct' => ['void', 'time='=>'string'], - 'DateTime::__construct\'1' => ['void', 'time'=>'?string', 'timezone'=>'?DateTimeZone'], - 'DateTime::__set_state' => ['static', 'array'=>'array'], - '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::format' => ['string|false', 'format'=>'string'], - 'DateTime::getLastErrors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], - 'DateTime::getOffset' => ['int'], - 'DateTime::getTimestamp' => ['int|false'], - 'DateTime::getTimezone' => ['DateTimeZone|false'], - 'DateTime::modify' => ['static|false', 'modify'=>'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::setTimezone' => ['static', 'timezone'=>'DateTimeZone'], - 'DateTime::sub' => ['static', 'interval'=>'DateInterval'], - 'DateTimeImmutable::__construct' => ['void', 'time='=>'string'], - 'DateTimeImmutable::__construct\'1' => ['void', 'time'=>'?string', 'timezone'=>'?DateTimeZone'], - 'DateTimeImmutable::__set_state' => ['static', 'array'=>'array'], - 'DateTimeImmutable::__wakeup' => ['void'], - 'DateTimeImmutable::add' => ['static', 'interval'=>'DateInterval'], - 'DateTimeImmutable::createFromFormat' => ['static|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'], - 'DateTimeImmutable::createFromMutable' => ['static', 'datetime'=>'DateTime'], - 'DateTimeImmutable::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], - 'DateTimeImmutable::format' => ['string|false', 'format'=>'string'], - 'DateTimeImmutable::getLastErrors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], - 'DateTimeImmutable::getOffset' => ['int'], - 'DateTimeImmutable::getTimestamp' => ['int|false'], - 'DateTimeImmutable::getTimezone' => ['DateTimeZone|false'], - 'DateTimeImmutable::modify' => ['static', 'modify'=>'string'], - 'DateTimeImmutable::setDate' => ['static|false', 'year'=>'int', 'month'=>'int', 'day'=>'int'], - 'DateTimeImmutable::setISODate' => ['static|false', 'year'=>'int', 'week'=>'int', 'day='=>'int'], - 'DateTimeImmutable::setTime' => ['static|false', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], - 'DateTimeImmutable::setTimestamp' => ['static|false', 'unixtimestamp'=>'int'], - 'DateTimeImmutable::setTimezone' => ['static|false', 'timezone'=>'DateTimeZone'], - 'DateTimeImmutable::sub' => ['static|false', 'interval'=>'DateInterval'], - 'DateTimeInterface::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], - 'DateTimeInterface::format' => ['string', 'format'=>'string'], - 'DateTimeInterface::getOffset' => ['int'], - 'DateTimeInterface::getTimestamp' => ['int|false'], - 'DateTimeInterface::getTimezone' => ['DateTimeZone|false'], - 'DateTimeZone::__construct' => ['void', 'timezone'=>'string'], - 'DateTimeZone::__set_state' => ['DateTimeZone', 'array'=>'array'], - 'DateTimeZone::__wakeup' => ['void'], - 'DateTimeZone::getLocation' => ['array|false'], - 'DateTimeZone::getName' => ['string'], - 'DateTimeZone::getOffset' => ['int|false', 'datetime'=>'DateTimeInterface'], - 'DateTimeZone::getTransitions' => ['list|false', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'], - 'DateTimeZone::listAbbreviations' => ['array>|false'], - '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::__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::getFilename' => ['string'], - 'DirectoryIterator::getGroup' => ['int'], - 'DirectoryIterator::getInode' => ['int'], - 'DirectoryIterator::getLinkTarget' => ['string'], - 'DirectoryIterator::getMTime' => ['int'], - 'DirectoryIterator::getOwner' => ['int'], - 'DirectoryIterator::getPath' => ['string'], - 'DirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'DirectoryIterator::getPathname' => ['string'], - 'DirectoryIterator::getPerms' => ['int'], - 'DirectoryIterator::getRealPath' => ['string'], - 'DirectoryIterator::getSize' => ['int'], - 'DirectoryIterator::getType' => ['string'], - 'DirectoryIterator::isDir' => ['bool'], - 'DirectoryIterator::isDot' => ['bool'], - 'DirectoryIterator::isExecutable' => ['bool'], - 'DirectoryIterator::isFile' => ['bool'], - 'DirectoryIterator::isLink' => ['bool'], - 'DirectoryIterator::isReadable' => ['bool'], - 'DirectoryIterator::isWritable' => ['bool'], - 'DirectoryIterator::key' => ['string'], - 'DirectoryIterator::next' => ['void'], - 'DirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], - 'DirectoryIterator::rewind' => ['void'], - 'DirectoryIterator::seek' => ['void', 'position'=>'int'], - 'DirectoryIterator::setFileClass' => ['void', 'class_name='=>'string'], - 'DirectoryIterator::setInfoClass' => ['void', 'class_name='=>'string'], - 'DirectoryIterator::valid' => ['bool'], - 'DomAttribute::name' => ['string'], - 'DomAttribute::set_value' => ['bool', 'content'=>'string'], - 'DomAttribute::specified' => ['bool'], - 'DomAttribute::value' => ['string'], - 'DomDocumentType::entities' => ['array'], - 'DomDocumentType::internal_subset' => ['bool'], - 'DomDocumentType::name' => ['string'], - 'DomDocumentType::notations' => ['array'], - 'DomDocumentType::public_id' => ['string'], - 'DomDocumentType::system_id' => ['string'], - 'DomNode::add_namespace' => ['bool', 'uri'=>'string', 'prefix'=>'string'], - 'DomNode::append_child' => ['DOMNode', 'newnode'=>'DOMNode'], - 'DomProcessingInstruction::data' => ['string'], - 'DomProcessingInstruction::target' => ['string'], - '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'], - 'DomainException::__clone' => ['void'], - 'DomainException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?DomainException'], - 'DomainException::__toString' => ['string'], - 'DomainException::__wakeup' => ['void'], - 'DomainException::getCode' => ['int'], - 'DomainException::getFile' => ['string'], - 'DomainException::getLine' => ['int'], - 'DomainException::getMessage' => ['string'], - 'DomainException::getPrevious' => ['Throwable|DomainException|null'], - 'DomainException::getTrace' => ['list\',args?:array}>'], - 'DomainException::getTraceAsString' => ['string'], - 'Ds\Collection::clear' => ['void'], - 'Ds\Collection::copy' => ['Ds\Collection'], - 'Ds\Collection::isEmpty' => ['bool'], - 'Ds\Collection::toArray' => ['array'], - 'Ds\Deque::__construct' => ['void', 'values='=>'mixed'], - 'Ds\Deque::allocate' => ['void', 'capacity'=>'int'], - 'Ds\Deque::apply' => ['void', 'callback'=>'callable'], - 'Ds\Deque::capacity' => ['int'], - 'Ds\Deque::clear' => ['void'], - 'Ds\Deque::contains' => ['bool', '...values='=>'mixed'], - 'Ds\Deque::copy' => ['Ds\Deque'], - 'Ds\Deque::count' => ['int'], - 'Ds\Deque::filter' => ['Ds\Deque', 'callback='=>'callable'], - 'Ds\Deque::find' => ['mixed', 'value'=>'mixed'], - 'Ds\Deque::first' => ['mixed'], - 'Ds\Deque::get' => ['void', 'index'=>'int'], - 'Ds\Deque::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], - 'Ds\Deque::isEmpty' => ['bool'], - 'Ds\Deque::join' => ['string', 'glue='=>'string'], - 'Ds\Deque::jsonSerialize' => ['array'], - 'Ds\Deque::last' => ['mixed'], - 'Ds\Deque::map' => ['Ds\Deque', 'callback'=>'callable'], - 'Ds\Deque::merge' => ['Ds\Deque', 'values'=>'mixed'], - 'Ds\Deque::pop' => ['mixed'], - 'Ds\Deque::push' => ['void', '...values='=>'mixed'], - 'Ds\Deque::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], - 'Ds\Deque::remove' => ['mixed', 'index'=>'int'], - 'Ds\Deque::reverse' => ['void'], - 'Ds\Deque::reversed' => ['Ds\Deque'], - 'Ds\Deque::rotate' => ['void', 'rotations'=>'int'], - 'Ds\Deque::set' => ['void', 'index'=>'int', 'value'=>'mixed'], - 'Ds\Deque::shift' => ['mixed'], - 'Ds\Deque::slice' => ['Ds\Deque', 'index'=>'int', 'length='=>'?int'], - 'Ds\Deque::sort' => ['void', 'comparator='=>'callable'], - 'Ds\Deque::sorted' => ['Ds\Deque', 'comparator='=>'callable'], - 'Ds\Deque::sum' => ['int|float'], - 'Ds\Deque::toArray' => ['array'], - 'Ds\Deque::unshift' => ['void', '...values='=>'mixed'], - 'Ds\Hashable::equals' => ['bool', 'object'=>'mixed'], - 'Ds\Hashable::hash' => ['mixed'], - 'Ds\Map::__construct' => ['void', 'values='=>'mixed'], - 'Ds\Map::allocate' => ['void', 'capacity'=>'int'], - 'Ds\Map::apply' => ['void', 'callback'=>'callable'], - 'Ds\Map::capacity' => ['int'], - 'Ds\Map::clear' => ['void'], - 'Ds\Map::copy' => ['Ds\Map'], - 'Ds\Map::count' => ['int'], - 'Ds\Map::diff' => ['Ds\Map', 'map'=>'Ds\Map'], - 'Ds\Map::filter' => ['Ds\Map', 'callback='=>'callable'], - 'Ds\Map::first' => ['Ds\Pair'], - 'Ds\Map::get' => ['mixed', 'key'=>'mixed', 'default='=>'mixed'], - 'Ds\Map::hasKey' => ['bool', 'key'=>'mixed'], - 'Ds\Map::hasValue' => ['bool', 'value'=>'mixed'], - 'Ds\Map::intersect' => ['Ds\Map', 'map'=>'Ds\Map'], - 'Ds\Map::isEmpty' => ['bool'], - 'Ds\Map::jsonSerialize' => ['array'], - 'Ds\Map::keys' => ['Ds\Set'], - 'Ds\Map::ksort' => ['void', 'comparator='=>'callable'], - 'Ds\Map::ksorted' => ['Ds\Map', 'comparator='=>'callable'], - 'Ds\Map::last' => ['Ds\Pair'], - 'Ds\Map::map' => ['Ds\Map', 'callback'=>'callable'], - 'Ds\Map::merge' => ['Ds\Map', 'values'=>'mixed'], - 'Ds\Map::pairs' => ['Ds\Sequence'], - 'Ds\Map::put' => ['void', 'key'=>'mixed', 'value'=>'mixed'], - 'Ds\Map::putAll' => ['void', 'values'=>'mixed'], - 'Ds\Map::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], - 'Ds\Map::remove' => ['mixed', 'key'=>'mixed', 'default='=>'mixed'], - 'Ds\Map::reverse' => ['void'], - 'Ds\Map::reversed' => ['Ds\Map'], - 'Ds\Map::skip' => ['Ds\Pair', 'position'=>'int'], - 'Ds\Map::slice' => ['Ds\Map', 'index'=>'int', 'length='=>'?int'], - 'Ds\Map::sort' => ['void', 'comparator='=>'callable'], - 'Ds\Map::sorted' => ['Ds\Map', 'comparator='=>'callable'], - 'Ds\Map::sum' => ['int|float'], - 'Ds\Map::toArray' => ['array'], - 'Ds\Map::union' => ['Ds\Map', 'map'=>'Ds\Map'], - 'Ds\Map::values' => ['Ds\Sequence'], - 'Ds\Map::xor' => ['Ds\Map', 'map'=>'Ds\Map'], - 'Ds\Pair::__construct' => ['void', 'key='=>'mixed', 'value='=>'mixed'], - 'Ds\Pair::clear' => ['void'], - 'Ds\Pair::copy' => ['Ds\Pair'], - 'Ds\Pair::isEmpty' => ['bool'], - 'Ds\Pair::jsonSerialize' => ['array'], - 'Ds\Pair::toArray' => ['array'], - 'Ds\PriorityQueue::__construct' => ['void'], - 'Ds\PriorityQueue::allocate' => ['void', 'capacity'=>'int'], - 'Ds\PriorityQueue::capacity' => ['int'], - 'Ds\PriorityQueue::clear' => ['void'], - 'Ds\PriorityQueue::copy' => ['Ds\PriorityQueue'], - 'Ds\PriorityQueue::count' => ['int'], - 'Ds\PriorityQueue::isEmpty' => ['bool'], - 'Ds\PriorityQueue::jsonSerialize' => ['array'], - 'Ds\PriorityQueue::peek' => ['mixed'], - 'Ds\PriorityQueue::pop' => ['mixed'], - 'Ds\PriorityQueue::push' => ['void', 'value'=>'mixed', 'priority'=>'int'], - 'Ds\PriorityQueue::toArray' => ['array'], - 'Ds\Queue::__construct' => ['void', 'values='=>'mixed'], - 'Ds\Queue::allocate' => ['void', 'capacity'=>'int'], - 'Ds\Queue::capacity' => ['int'], - 'Ds\Queue::clear' => ['void'], - 'Ds\Queue::copy' => ['Ds\Queue'], - 'Ds\Queue::count' => ['int'], - 'Ds\Queue::isEmpty' => ['bool'], - 'Ds\Queue::jsonSerialize' => ['array'], - 'Ds\Queue::peek' => ['mixed'], - 'Ds\Queue::pop' => ['mixed'], - 'Ds\Queue::push' => ['void', '...values='=>'mixed'], - 'Ds\Queue::toArray' => ['array'], - 'Ds\Sequence::allocate' => ['void', 'capacity'=>'int'], - 'Ds\Sequence::apply' => ['void', 'callback'=>'callable'], - 'Ds\Sequence::capacity' => ['int'], - 'Ds\Sequence::contains' => ['bool', '...values='=>'mixed'], - 'Ds\Sequence::filter' => ['Ds\Sequence', 'callback='=>'callable'], - 'Ds\Sequence::find' => ['mixed', 'value'=>'mixed'], - 'Ds\Sequence::first' => ['mixed'], - 'Ds\Sequence::get' => ['mixed', 'index'=>'int'], - 'Ds\Sequence::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], - 'Ds\Sequence::join' => ['string', 'glue='=>'string'], - 'Ds\Sequence::last' => ['void'], - 'Ds\Sequence::map' => ['Ds\Sequence', 'callback'=>'callable'], - 'Ds\Sequence::merge' => ['Ds\Sequence', 'values'=>'mixed'], - 'Ds\Sequence::pop' => ['mixed'], - 'Ds\Sequence::push' => ['void', '...values='=>'mixed'], - 'Ds\Sequence::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], - 'Ds\Sequence::remove' => ['mixed', 'index'=>'int'], - 'Ds\Sequence::reverse' => ['void'], - 'Ds\Sequence::reversed' => ['Ds\Sequence'], - 'Ds\Sequence::rotate' => ['void', 'rotations'=>'int'], - 'Ds\Sequence::set' => ['void', 'index'=>'int', 'value'=>'mixed'], - 'Ds\Sequence::shift' => ['mixed'], - 'Ds\Sequence::slice' => ['Ds\Sequence', 'index'=>'int', 'length='=>'?int'], - 'Ds\Sequence::sort' => ['void', 'comparator='=>'callable'], - 'Ds\Sequence::sorted' => ['Ds\Sequence', 'comparator='=>'callable'], - 'Ds\Sequence::sum' => ['int|float'], - 'Ds\Sequence::unshift' => ['void', '...values='=>'mixed'], - 'Ds\Set::__construct' => ['void', 'values='=>'mixed'], - 'Ds\Set::add' => ['void', '...values='=>'mixed'], - 'Ds\Set::allocate' => ['void', 'capacity'=>'int'], - 'Ds\Set::capacity' => ['int'], - 'Ds\Set::clear' => ['void'], - 'Ds\Set::contains' => ['bool', '...values='=>'mixed'], - 'Ds\Set::copy' => ['Ds\Set'], - 'Ds\Set::count' => ['int'], - 'Ds\Set::diff' => ['Ds\Set', 'set'=>'Ds\Set'], - 'Ds\Set::filter' => ['Ds\Set', 'callback='=>'callable'], - 'Ds\Set::first' => ['mixed'], - 'Ds\Set::get' => ['mixed', 'index'=>'int'], - 'Ds\Set::intersect' => ['Ds\Set', 'set'=>'Ds\Set'], - 'Ds\Set::isEmpty' => ['bool'], - 'Ds\Set::join' => ['string', 'glue='=>'string'], - 'Ds\Set::jsonSerialize' => ['array'], - 'Ds\Set::last' => ['mixed'], - 'Ds\Set::merge' => ['Ds\Set', 'values'=>'mixed'], - 'Ds\Set::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], - 'Ds\Set::remove' => ['void', '...values='=>'mixed'], - 'Ds\Set::reverse' => ['void'], - 'Ds\Set::reversed' => ['Ds\Set'], - 'Ds\Set::slice' => ['Ds\Set', 'index'=>'int', 'length='=>'?int'], - 'Ds\Set::sort' => ['void', 'comparator='=>'callable'], - 'Ds\Set::sorted' => ['Ds\Set', 'comparator='=>'callable'], - 'Ds\Set::sum' => ['int|float'], - 'Ds\Set::toArray' => ['array'], - 'Ds\Set::union' => ['Ds\Set', 'set'=>'Ds\Set'], - 'Ds\Set::xor' => ['Ds\Set', 'set'=>'Ds\Set'], - 'Ds\Stack::__construct' => ['void', 'values='=>'mixed'], - 'Ds\Stack::allocate' => ['void', 'capacity'=>'int'], - 'Ds\Stack::capacity' => ['int'], - 'Ds\Stack::clear' => ['void'], - 'Ds\Stack::copy' => ['Ds\Stack'], - 'Ds\Stack::count' => ['int'], - 'Ds\Stack::isEmpty' => ['bool'], - 'Ds\Stack::jsonSerialize' => ['array'], - 'Ds\Stack::peek' => ['mixed'], - 'Ds\Stack::pop' => ['mixed'], - 'Ds\Stack::push' => ['void', '...values='=>'mixed'], - 'Ds\Stack::toArray' => ['array'], - 'Ds\Vector::__construct' => ['void', 'values='=>'mixed'], - 'Ds\Vector::allocate' => ['void', 'capacity'=>'int'], - 'Ds\Vector::apply' => ['void', 'callback'=>'callable'], - 'Ds\Vector::capacity' => ['int'], - 'Ds\Vector::clear' => ['void'], - 'Ds\Vector::contains' => ['bool', '...values='=>'mixed'], - 'Ds\Vector::copy' => ['Ds\Vector'], - 'Ds\Vector::count' => ['int'], - 'Ds\Vector::filter' => ['Ds\Vector', 'callback='=>'callable'], - 'Ds\Vector::find' => ['mixed', 'value'=>'mixed'], - 'Ds\Vector::first' => ['mixed'], - 'Ds\Vector::get' => ['mixed', 'index'=>'int'], - 'Ds\Vector::insert' => ['void', 'index'=>'int', '...values='=>'mixed'], - 'Ds\Vector::isEmpty' => ['bool'], - 'Ds\Vector::join' => ['string', 'glue='=>'string'], - 'Ds\Vector::jsonSerialize' => ['array'], - 'Ds\Vector::last' => ['mixed'], - 'Ds\Vector::map' => ['Ds\Vector', 'callback'=>'callable'], - 'Ds\Vector::merge' => ['Ds\Vector', 'values'=>'mixed'], - 'Ds\Vector::pop' => ['mixed'], - 'Ds\Vector::push' => ['void', '...values='=>'mixed'], - 'Ds\Vector::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'], - 'Ds\Vector::remove' => ['mixed', 'index'=>'int'], - 'Ds\Vector::reverse' => ['void'], - 'Ds\Vector::reversed' => ['Ds\Vector'], - 'Ds\Vector::rotate' => ['void', 'rotations'=>'int'], - 'Ds\Vector::set' => ['void', 'index'=>'int', 'value'=>'mixed'], - 'Ds\Vector::shift' => ['mixed'], - 'Ds\Vector::slice' => ['Ds\Vector', 'index'=>'int', 'length='=>'?int'], - 'Ds\Vector::sort' => ['void', 'comparator='=>'callable'], - 'Ds\Vector::sorted' => ['Ds\Vector', 'comparator='=>'callable'], - 'Ds\Vector::sum' => ['int|float'], - 'Ds\Vector::toArray' => ['array'], - 'Ds\Vector::unshift' => ['void', '...values='=>'mixed'], - 'EmptyIterator::current' => ['mixed'], - 'EmptyIterator::key' => ['mixed'], - 'EmptyIterator::next' => ['void'], - 'EmptyIterator::rewind' => ['void'], - 'EmptyIterator::valid' => ['bool'], - 'Error::__clone' => ['void'], - 'Error::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Error'], - 'Error::__toString' => ['string'], - 'Error::getCode' => ['int'], - 'Error::getFile' => ['string'], - 'Error::getLine' => ['int'], - 'Error::getMessage' => ['string'], - 'Error::getPrevious' => ['Throwable|Error|null'], - 'Error::getTrace' => ['list\',args?:array}>'], - 'Error::getTraceAsString' => ['string'], - 'ErrorException::__clone' => ['void'], - 'ErrorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'severity='=>'int', 'filename='=>'string', 'line='=>'int', 'previous='=>'?Throwable|?ErrorException'], - 'ErrorException::__toString' => ['string'], - 'ErrorException::getCode' => ['int'], - 'ErrorException::getFile' => ['string'], - 'ErrorException::getLine' => ['int'], - 'ErrorException::getMessage' => ['string'], - 'ErrorException::getPrevious' => ['Throwable|ErrorException|null'], - 'ErrorException::getSeverity' => ['int'], - 'ErrorException::getTrace' => ['list\',args?:array}>'], - 'ErrorException::getTraceAsString' => ['string'], - 'Ev::backend' => ['int'], - 'Ev::depth' => ['int'], - 'Ev::embeddableBackends' => ['int'], - 'Ev::feedSignal' => ['void', 'signum'=>'int'], - 'Ev::feedSignalEvent' => ['void', 'signum'=>'int'], - 'Ev::iteration' => ['int'], - 'Ev::now' => ['float'], - 'Ev::nowUpdate' => ['void'], - 'Ev::recommendedBackends' => ['int'], - 'Ev::resume' => ['void'], - 'Ev::run' => ['void', 'flags='=>'int'], - 'Ev::sleep' => ['void', 'seconds'=>'float'], - 'Ev::stop' => ['void', 'how='=>'int'], - 'Ev::supportedBackends' => ['int'], - 'Ev::suspend' => ['void'], - 'Ev::time' => ['float'], - 'Ev::verify' => ['void'], - 'EvCheck::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvCheck::clear' => ['int'], - 'EvCheck::createStopped' => ['EvCheck', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvCheck::feed' => ['void', 'events'=>'int'], - 'EvCheck::getLoop' => ['EvLoop'], - 'EvCheck::invoke' => ['void', 'events'=>'int'], - 'EvCheck::keepAlive' => ['void', 'value'=>'bool'], - 'EvCheck::setCallback' => ['void', 'callback'=>'callable'], - 'EvCheck::start' => ['void'], - 'EvCheck::stop' => ['void'], - 'EvChild::__construct' => ['void', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvChild::clear' => ['int'], - 'EvChild::createStopped' => ['EvChild', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvChild::feed' => ['void', 'events'=>'int'], - 'EvChild::getLoop' => ['EvLoop'], - 'EvChild::invoke' => ['void', 'events'=>'int'], - 'EvChild::keepAlive' => ['void', 'value'=>'bool'], - 'EvChild::set' => ['void', 'pid'=>'int', 'trace'=>'bool'], - 'EvChild::setCallback' => ['void', 'callback'=>'callable'], - 'EvChild::start' => ['void'], - 'EvChild::stop' => ['void'], - 'EvEmbed::__construct' => ['void', 'other'=>'object', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvEmbed::clear' => ['int'], - 'EvEmbed::createStopped' => ['EvEmbed', 'other'=>'object', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvEmbed::feed' => ['void', 'events'=>'int'], - 'EvEmbed::getLoop' => ['EvLoop'], - 'EvEmbed::invoke' => ['void', 'events'=>'int'], - 'EvEmbed::keepAlive' => ['void', 'value'=>'bool'], - 'EvEmbed::set' => ['void', 'other'=>'object'], - 'EvEmbed::setCallback' => ['void', 'callback'=>'callable'], - 'EvEmbed::start' => ['void'], - 'EvEmbed::stop' => ['void'], - 'EvEmbed::sweep' => ['void'], - 'EvFork::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvFork::clear' => ['int'], - 'EvFork::createStopped' => ['EvFork', 'callback'=>'callable', 'data='=>'string', 'priority='=>'string'], - 'EvFork::feed' => ['void', 'events'=>'int'], - 'EvFork::getLoop' => ['EvLoop'], - 'EvFork::invoke' => ['void', 'events'=>'int'], - 'EvFork::keepAlive' => ['void', 'value'=>'bool'], - 'EvFork::setCallback' => ['void', 'callback'=>'callable'], - 'EvFork::start' => ['void'], - 'EvFork::stop' => ['void'], - 'EvIdle::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvIdle::clear' => ['int'], - 'EvIdle::createStopped' => ['EvIdle', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvIdle::feed' => ['void', 'events'=>'int'], - 'EvIdle::getLoop' => ['EvLoop'], - 'EvIdle::invoke' => ['void', 'events'=>'int'], - 'EvIdle::keepAlive' => ['void', 'value'=>'bool'], - 'EvIdle::setCallback' => ['void', 'callback'=>'callable'], - 'EvIdle::start' => ['void'], - 'EvIdle::stop' => ['void'], - 'EvIo::__construct' => ['void', 'fd'=>'mixed', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvIo::clear' => ['int'], - 'EvIo::createStopped' => ['EvIo', 'fd'=>'resource', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvIo::feed' => ['void', 'events'=>'int'], - 'EvIo::getLoop' => ['EvLoop'], - 'EvIo::invoke' => ['void', 'events'=>'int'], - 'EvIo::keepAlive' => ['void', 'value'=>'bool'], - 'EvIo::set' => ['void', 'fd'=>'resource', 'events'=>'int'], - 'EvIo::setCallback' => ['void', 'callback'=>'callable'], - 'EvIo::start' => ['void'], - 'EvIo::stop' => ['void'], - 'EvLoop::__construct' => ['void', 'flags='=>'int', 'data='=>'mixed', 'io_interval='=>'float', 'timeout_interval='=>'float'], - 'EvLoop::backend' => ['int'], - 'EvLoop::check' => ['EvCheck', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::child' => ['EvChild', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::defaultLoop' => ['EvLoop', 'flags='=>'int', 'data='=>'mixed', 'io_interval='=>'float', 'timeout_interval='=>'float'], - 'EvLoop::embed' => ['EvEmbed', 'other'=>'EvLoop', 'callback='=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::fork' => ['EvFork', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::idle' => ['EvIdle', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::invokePending' => ['void'], - 'EvLoop::io' => ['EvIo', 'fd'=>'resource', 'events'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::loopFork' => ['void'], - 'EvLoop::now' => ['float'], - 'EvLoop::nowUpdate' => ['void'], - 'EvLoop::periodic' => ['EvPeriodic', 'offset'=>'float', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::prepare' => ['EvPrepare', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::resume' => ['void'], - 'EvLoop::run' => ['void', 'flags='=>'int'], - 'EvLoop::signal' => ['EvSignal', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::stat' => ['EvStat', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::stop' => ['void', 'how='=>'int'], - 'EvLoop::suspend' => ['void'], - 'EvLoop::timer' => ['EvTimer', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvLoop::verify' => ['void'], - 'EvPeriodic::__construct' => ['void', 'offset'=>'float', 'interval'=>'string', 'reschedule_cb'=>'callable', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvPeriodic::again' => ['void'], - 'EvPeriodic::at' => ['float'], - 'EvPeriodic::clear' => ['int'], - 'EvPeriodic::createStopped' => ['EvPeriodic', 'offset'=>'float', 'interval'=>'float', 'reschedule_cb'=>'callable', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvPeriodic::feed' => ['void', 'events'=>'int'], - 'EvPeriodic::getLoop' => ['EvLoop'], - 'EvPeriodic::invoke' => ['void', 'events'=>'int'], - 'EvPeriodic::keepAlive' => ['void', 'value'=>'bool'], - 'EvPeriodic::set' => ['void', 'offset'=>'float', 'interval'=>'float'], - 'EvPeriodic::setCallback' => ['void', 'callback'=>'callable'], - 'EvPeriodic::start' => ['void'], - 'EvPeriodic::stop' => ['void'], - 'EvPrepare::__construct' => ['void', 'callback'=>'string', 'data='=>'string', 'priority='=>'string'], - 'EvPrepare::clear' => ['int'], - 'EvPrepare::createStopped' => ['EvPrepare', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvPrepare::feed' => ['void', 'events'=>'int'], - 'EvPrepare::getLoop' => ['EvLoop'], - 'EvPrepare::invoke' => ['void', 'events'=>'int'], - 'EvPrepare::keepAlive' => ['void', 'value'=>'bool'], - 'EvPrepare::setCallback' => ['void', 'callback'=>'callable'], - 'EvPrepare::start' => ['void'], - 'EvPrepare::stop' => ['void'], - 'EvSignal::__construct' => ['void', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvSignal::clear' => ['int'], - 'EvSignal::createStopped' => ['EvSignal', 'signum'=>'int', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvSignal::feed' => ['void', 'events'=>'int'], - 'EvSignal::getLoop' => ['EvLoop'], - 'EvSignal::invoke' => ['void', 'events'=>'int'], - 'EvSignal::keepAlive' => ['void', 'value'=>'bool'], - 'EvSignal::set' => ['void', 'signum'=>'int'], - 'EvSignal::setCallback' => ['void', 'callback'=>'callable'], - 'EvSignal::start' => ['void'], - 'EvSignal::stop' => ['void'], - 'EvStat::__construct' => ['void', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvStat::attr' => ['array'], - 'EvStat::clear' => ['int'], - 'EvStat::createStopped' => ['EvStat', 'path'=>'string', 'interval'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvStat::feed' => ['void', 'events'=>'int'], - 'EvStat::getLoop' => ['EvLoop'], - 'EvStat::invoke' => ['void', 'events'=>'int'], - 'EvStat::keepAlive' => ['void', 'value'=>'bool'], - 'EvStat::prev' => ['array'], - 'EvStat::set' => ['void', 'path'=>'string', 'interval'=>'float'], - 'EvStat::setCallback' => ['void', 'callback'=>'callable'], - 'EvStat::start' => ['void'], - 'EvStat::stat' => ['bool'], - 'EvStat::stop' => ['void'], - 'EvTimer::__construct' => ['void', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvTimer::again' => ['void'], - 'EvTimer::clear' => ['int'], - 'EvTimer::createStopped' => ['EvTimer', 'after'=>'float', 'repeat'=>'float', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'], - 'EvTimer::feed' => ['void', 'events'=>'int'], - 'EvTimer::getLoop' => ['EvLoop'], - 'EvTimer::invoke' => ['void', 'events'=>'int'], - 'EvTimer::keepAlive' => ['void', 'value'=>'bool'], - 'EvTimer::set' => ['void', 'after'=>'float', 'repeat'=>'float'], - 'EvTimer::setCallback' => ['void', 'callback'=>'callable'], - 'EvTimer::start' => ['void'], - 'EvTimer::stop' => ['void'], - 'EvWatcher::__construct' => ['void'], - 'EvWatcher::clear' => ['int'], - 'EvWatcher::feed' => ['void', 'revents'=>'int'], - 'EvWatcher::getLoop' => ['EvLoop'], - 'EvWatcher::invoke' => ['void', 'revents'=>'int'], - 'EvWatcher::keepalive' => ['bool', 'value='=>'bool'], - 'EvWatcher::setCallback' => ['void', 'callback'=>'callable'], - 'EvWatcher::start' => ['void'], - 'EvWatcher::stop' => ['void'], - 'Event::__construct' => ['void', 'base'=>'EventBase', 'fd'=>'mixed', 'what'=>'int', 'cb'=>'callable', 'arg='=>'mixed'], - 'Event::add' => ['bool', 'timeout='=>'float'], - 'Event::addSignal' => ['bool', 'timeout='=>'float'], - 'Event::addTimer' => ['bool', 'timeout='=>'float'], - 'Event::del' => ['bool'], - 'Event::delSignal' => ['bool'], - 'Event::delTimer' => ['bool'], - 'Event::free' => ['void'], - 'Event::getSupportedMethods' => ['array'], - 'Event::pending' => ['bool', 'flags'=>'int'], - 'Event::set' => ['bool', 'base'=>'EventBase', 'fd'=>'mixed', 'what='=>'int', 'cb='=>'callable', 'arg='=>'mixed'], - 'Event::setPriority' => ['bool', 'priority'=>'int'], - 'Event::setTimer' => ['bool', 'base'=>'EventBase', 'cb'=>'callable', 'arg='=>'mixed'], - 'Event::signal' => ['Event', 'base'=>'EventBase', 'signum'=>'int', 'cb'=>'callable', 'arg='=>'mixed'], - 'Event::timer' => ['Event', 'base'=>'EventBase', 'cb'=>'callable', 'arg='=>'mixed'], - 'EventBase::__construct' => ['void', 'cfg='=>'EventConfig'], - 'EventBase::dispatch' => ['void'], - 'EventBase::exit' => ['bool', 'timeout='=>'float'], - 'EventBase::free' => ['void'], - 'EventBase::getFeatures' => ['int'], - 'EventBase::getMethod' => ['string', 'cfg='=>'EventConfig'], - 'EventBase::getTimeOfDayCached' => ['float'], - 'EventBase::gotExit' => ['bool'], - 'EventBase::gotStop' => ['bool'], - 'EventBase::loop' => ['bool', 'flags='=>'int'], - 'EventBase::priorityInit' => ['bool', 'n_priorities'=>'int'], - 'EventBase::reInit' => ['bool'], - 'EventBase::stop' => ['bool'], - 'EventBuffer::__construct' => ['void'], - 'EventBuffer::add' => ['bool', 'data'=>'string'], - 'EventBuffer::addBuffer' => ['bool', 'buf'=>'EventBuffer'], - 'EventBuffer::appendFrom' => ['int', 'buf'=>'EventBuffer', 'length'=>'int'], - 'EventBuffer::copyout' => ['int', '&w_data'=>'string', 'max_bytes'=>'int'], - 'EventBuffer::drain' => ['bool', 'length'=>'int'], - 'EventBuffer::enableLocking' => ['void'], - 'EventBuffer::expand' => ['bool', 'length'=>'int'], - 'EventBuffer::freeze' => ['bool', 'at_front'=>'bool'], - 'EventBuffer::lock' => ['void'], - 'EventBuffer::prepend' => ['bool', 'data'=>'string'], - 'EventBuffer::prependBuffer' => ['bool', 'buf'=>'EventBuffer'], - 'EventBuffer::pullup' => ['string', 'size'=>'int'], - 'EventBuffer::read' => ['string', 'max_bytes'=>'int'], - 'EventBuffer::readFrom' => ['int', 'fd'=>'mixed', 'howmuch'=>'int'], - 'EventBuffer::readLine' => ['string', 'eol_style'=>'int'], - 'EventBuffer::search' => ['mixed', 'what'=>'string', 'start='=>'int', 'end='=>'int'], - 'EventBuffer::searchEol' => ['mixed', 'start='=>'int', 'eol_style='=>'int'], - 'EventBuffer::substr' => ['string', 'start'=>'int', 'length='=>'int'], - 'EventBuffer::unfreeze' => ['bool', 'at_front'=>'bool'], - 'EventBuffer::unlock' => ['bool'], - 'EventBuffer::write' => ['int', 'fd'=>'mixed', 'howmuch='=>'int'], - 'EventBufferEvent::__construct' => ['void', 'base'=>'EventBase', 'socket='=>'mixed', 'options='=>'int', 'readcb='=>'callable', 'writecb='=>'callable', 'eventcb='=>'callable'], - 'EventBufferEvent::close' => ['void'], - 'EventBufferEvent::connect' => ['bool', 'addr'=>'string'], - 'EventBufferEvent::connectHost' => ['bool', 'dns_base'=>'EventDnsBase', 'hostname'=>'string', 'port'=>'int', 'family='=>'int'], - 'EventBufferEvent::createPair' => ['array', 'base'=>'EventBase', 'options='=>'int'], - 'EventBufferEvent::disable' => ['bool', 'events'=>'int'], - 'EventBufferEvent::enable' => ['bool', 'events'=>'int'], - 'EventBufferEvent::free' => ['void'], - 'EventBufferEvent::getDnsErrorString' => ['string'], - 'EventBufferEvent::getEnabled' => ['int'], - 'EventBufferEvent::getInput' => ['EventBuffer'], - 'EventBufferEvent::getOutput' => ['EventBuffer'], - 'EventBufferEvent::read' => ['string', 'size'=>'int'], - 'EventBufferEvent::readBuffer' => ['bool', 'buf'=>'EventBuffer'], - 'EventBufferEvent::setCallbacks' => ['void', 'readcb'=>'callable', 'writecb'=>'callable', 'eventcb'=>'callable', 'arg='=>'string'], - 'EventBufferEvent::setPriority' => ['bool', 'priority'=>'int'], - 'EventBufferEvent::setTimeouts' => ['bool', 'timeout_read'=>'float', 'timeout_write'=>'float'], - 'EventBufferEvent::setWatermark' => ['void', 'events'=>'int', 'lowmark'=>'int', 'highmark'=>'int'], - 'EventBufferEvent::sslError' => ['string'], - 'EventBufferEvent::sslFilter' => ['EventBufferEvent', 'base'=>'EventBase', 'underlying'=>'EventBufferEvent', 'ctx'=>'EventSslContext', 'state'=>'int', 'options='=>'int'], - 'EventBufferEvent::sslGetCipherInfo' => ['string'], - 'EventBufferEvent::sslGetCipherName' => ['string'], - 'EventBufferEvent::sslGetCipherVersion' => ['string'], - 'EventBufferEvent::sslGetProtocol' => ['string'], - 'EventBufferEvent::sslRenegotiate' => ['void'], - 'EventBufferEvent::sslSocket' => ['EventBufferEvent', 'base'=>'EventBase', 'socket'=>'mixed', 'ctx'=>'EventSslContext', 'state'=>'int', 'options='=>'int'], - 'EventBufferEvent::write' => ['bool', 'data'=>'string'], - 'EventBufferEvent::writeBuffer' => ['bool', 'buf'=>'EventBuffer'], - 'EventConfig::__construct' => ['void'], - 'EventConfig::avoidMethod' => ['bool', 'method'=>'string'], - 'EventConfig::requireFeatures' => ['bool', 'feature'=>'int'], - 'EventConfig::setMaxDispatchInterval' => ['void', 'max_interval'=>'int', 'max_callbacks'=>'int', 'min_priority'=>'int'], - 'EventDnsBase::__construct' => ['void', 'base'=>'EventBase', 'initialize'=>'bool'], - 'EventDnsBase::addNameserverIp' => ['bool', 'ip'=>'string'], - 'EventDnsBase::addSearch' => ['void', 'domain'=>'string'], - 'EventDnsBase::clearSearch' => ['void'], - 'EventDnsBase::countNameservers' => ['int'], - 'EventDnsBase::loadHosts' => ['bool', 'hosts'=>'string'], - 'EventDnsBase::parseResolvConf' => ['bool', 'flags'=>'int', 'filename'=>'string'], - 'EventDnsBase::setOption' => ['bool', 'option'=>'string', 'value'=>'string'], - 'EventDnsBase::setSearchNdots' => ['bool', 'ndots'=>'int'], - 'EventHttp::__construct' => ['void', 'base'=>'EventBase', 'ctx='=>'EventSslContext'], - 'EventHttp::accept' => ['bool', 'socket'=>'mixed'], - 'EventHttp::addServerAlias' => ['bool', 'alias'=>'string'], - 'EventHttp::bind' => ['void', 'address'=>'string', 'port'=>'int'], - 'EventHttp::removeServerAlias' => ['bool', 'alias'=>'string'], - 'EventHttp::setAllowedMethods' => ['void', 'methods'=>'int'], - 'EventHttp::setCallback' => ['void', 'path'=>'string', 'cb'=>'string', 'arg='=>'string'], - 'EventHttp::setDefaultCallback' => ['void', 'cb'=>'string', 'arg='=>'string'], - 'EventHttp::setMaxBodySize' => ['void', 'value'=>'int'], - 'EventHttp::setMaxHeadersSize' => ['void', 'value'=>'int'], - 'EventHttp::setTimeout' => ['void', 'value'=>'int'], - 'EventHttpConnection::__construct' => ['void', 'base'=>'EventBase', 'dns_base'=>'EventDnsBase', 'address'=>'string', 'port'=>'int', 'ctx='=>'EventSslContext'], - 'EventHttpConnection::getBase' => ['EventBase'], - 'EventHttpConnection::getPeer' => ['void', '&w_address'=>'string', '&w_port'=>'int'], - 'EventHttpConnection::makeRequest' => ['bool', 'req'=>'EventHttpRequest', 'type'=>'int', 'uri'=>'string'], - 'EventHttpConnection::setCloseCallback' => ['void', 'callback'=>'callable', 'data='=>'mixed'], - 'EventHttpConnection::setLocalAddress' => ['void', 'address'=>'string'], - 'EventHttpConnection::setLocalPort' => ['void', 'port'=>'int'], - 'EventHttpConnection::setMaxBodySize' => ['void', 'max_size'=>'string'], - 'EventHttpConnection::setMaxHeadersSize' => ['void', 'max_size'=>'string'], - 'EventHttpConnection::setRetries' => ['void', 'retries'=>'int'], - 'EventHttpConnection::setTimeout' => ['void', 'timeout'=>'int'], - 'EventHttpRequest::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed'], - 'EventHttpRequest::addHeader' => ['bool', 'key'=>'string', 'value'=>'string', 'type'=>'int'], - 'EventHttpRequest::cancel' => ['void'], - 'EventHttpRequest::clearHeaders' => ['void'], - 'EventHttpRequest::closeConnection' => ['void'], - 'EventHttpRequest::findHeader' => ['void', 'key'=>'string', 'type'=>'string'], - 'EventHttpRequest::free' => ['void'], - 'EventHttpRequest::getBufferEvent' => ['EventBufferEvent'], - 'EventHttpRequest::getCommand' => ['void'], - 'EventHttpRequest::getConnection' => ['EventHttpConnection'], - 'EventHttpRequest::getHost' => ['string'], - 'EventHttpRequest::getInputBuffer' => ['EventBuffer'], - 'EventHttpRequest::getInputHeaders' => ['array'], - 'EventHttpRequest::getOutputBuffer' => ['EventBuffer'], - 'EventHttpRequest::getOutputHeaders' => ['void'], - 'EventHttpRequest::getResponseCode' => ['int'], - 'EventHttpRequest::getUri' => ['string'], - 'EventHttpRequest::removeHeader' => ['void', 'key'=>'string', 'type'=>'string'], - 'EventHttpRequest::sendError' => ['void', 'error'=>'int', 'reason='=>'string'], - 'EventHttpRequest::sendReply' => ['void', 'code'=>'int', 'reason'=>'string', 'buf='=>'EventBuffer'], - 'EventHttpRequest::sendReplyChunk' => ['void', 'buf'=>'EventBuffer'], - 'EventHttpRequest::sendReplyEnd' => ['void'], - 'EventHttpRequest::sendReplyStart' => ['void', 'code'=>'int', 'reason'=>'string'], - 'EventListener::__construct' => ['void', 'base'=>'EventBase', 'cb'=>'callable', 'data'=>'mixed', 'flags'=>'int', 'backlog'=>'int', 'target'=>'mixed'], - 'EventListener::disable' => ['bool'], - 'EventListener::enable' => ['bool'], - 'EventListener::getBase' => ['void'], - 'EventListener::getSocketName' => ['bool', '&w_address'=>'string', '&w_port='=>'mixed'], - 'EventListener::setCallback' => ['void', 'cb'=>'callable', 'arg='=>'mixed'], - 'EventListener::setErrorCallback' => ['void', 'cb'=>'string'], - 'EventSslContext::__construct' => ['void', 'method'=>'string', 'options'=>'string'], - 'EventUtil::__construct' => ['void'], - 'EventUtil::getLastSocketErrno' => ['int', 'socket='=>'mixed'], - 'EventUtil::getLastSocketError' => ['string', 'socket='=>'mixed'], - 'EventUtil::getSocketFd' => ['int', 'socket'=>'mixed'], - 'EventUtil::getSocketName' => ['bool', 'socket'=>'mixed', '&w_address'=>'string', '&w_port='=>'mixed'], - 'EventUtil::setSocketOption' => ['bool', 'socket'=>'mixed', 'level'=>'int', 'optname'=>'int', 'optval'=>'mixed'], - 'EventUtil::sslRandPoll' => ['void'], - 'Exception::__clone' => ['void'], - 'Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?Exception'], - 'Exception::__toString' => ['string'], - 'Exception::getCode' => ['int|string'], - 'Exception::getFile' => ['string'], - 'Exception::getLine' => ['int'], - 'Exception::getMessage' => ['string'], - 'Exception::getPrevious' => ['?Throwable|?Exception'], - 'Exception::getTrace' => ['list\',args?:array}>'], - 'Exception::getTraceAsString' => ['string'], - 'FANNConnection::__construct' => ['void', 'from_neuron'=>'int', 'to_neuron'=>'int', 'weight'=>'float'], - 'FANNConnection::getFromNeuron' => ['int'], - 'FANNConnection::getToNeuron' => ['int'], - 'FANNConnection::getWeight' => ['void'], - 'FANNConnection::setWeight' => ['bool', 'weight'=>'float'], - 'FilesystemIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], - 'FilesystemIterator::__toString' => ['string'], - 'FilesystemIterator::_bad_state_ex' => [''], - 'FilesystemIterator::current' => ['mixed'], - 'FilesystemIterator::getATime' => ['int'], - 'FilesystemIterator::getBasename' => ['string', 'suffix='=>'string'], - 'FilesystemIterator::getCTime' => ['int'], - 'FilesystemIterator::getExtension' => ['string'], - 'FilesystemIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'FilesystemIterator::getFilename' => ['string'], - 'FilesystemIterator::getFlags' => ['int'], - 'FilesystemIterator::getGroup' => ['int'], - 'FilesystemIterator::getInode' => ['int'], - 'FilesystemIterator::getLinkTarget' => ['string'], - 'FilesystemIterator::getMTime' => ['int'], - 'FilesystemIterator::getOwner' => ['int'], - 'FilesystemIterator::getPath' => ['string'], - 'FilesystemIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'FilesystemIterator::getPathname' => ['string'], - 'FilesystemIterator::getPerms' => ['int'], - 'FilesystemIterator::getRealPath' => ['string'], - 'FilesystemIterator::getSize' => ['int'], - 'FilesystemIterator::getType' => ['string'], - 'FilesystemIterator::isDir' => ['bool'], - 'FilesystemIterator::isDot' => ['bool'], - 'FilesystemIterator::isExecutable' => ['bool'], - 'FilesystemIterator::isFile' => ['bool'], - 'FilesystemIterator::isLink' => ['bool'], - 'FilesystemIterator::isReadable' => ['bool'], - 'FilesystemIterator::isWritable' => ['bool'], - 'FilesystemIterator::key' => ['string'], - 'FilesystemIterator::next' => ['void'], - 'FilesystemIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'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::valid' => ['bool'], - 'FilterIterator::__construct' => ['void', 'iterator'=>'Iterator'], - 'FilterIterator::accept' => ['bool'], - 'FilterIterator::current' => ['mixed'], - 'FilterIterator::getInnerIterator' => ['Iterator'], - 'FilterIterator::key' => ['mixed'], - 'FilterIterator::next' => ['void'], - 'FilterIterator::rewind' => ['void'], - 'FilterIterator::valid' => ['bool'], - 'GEOSGeometry::__toString' => ['string'], - 'GEOSGeometry::area' => ['float'], - 'GEOSGeometry::boundary' => ['GEOSGeometry'], - 'GEOSGeometry::buffer' => ['GEOSGeometry', 'dist'=>'float', 'styleArray='=>'array'], - 'GEOSGeometry::centroid' => ['GEOSGeometry'], - 'GEOSGeometry::checkValidity' => ['array{valid: bool, reason?: string, location?: GEOSGeometry}'], - 'GEOSGeometry::contains' => ['bool', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::convexHull' => ['GEOSGeometry'], - 'GEOSGeometry::coordinateDimension' => ['int'], - 'GEOSGeometry::coveredBy' => ['bool', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::covers' => ['bool', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::crosses' => ['bool', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::delaunayTriangulation' => ['GEOSGeometry', 'tolerance'=>'float', 'onlyEdges'=>'bool'], - 'GEOSGeometry::difference' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::dimension' => ['int'], - 'GEOSGeometry::disjoint' => ['bool', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::distance' => ['float', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::endPoint' => ['GEOSGeometry'], - 'GEOSGeometry::envelope' => ['GEOSGeometry'], - 'GEOSGeometry::equals' => ['bool', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::equalsExact' => ['bool', 'geom'=>'GEOSGeometry', 'tolerance'=>'float'], - 'GEOSGeometry::exteriorRing' => ['GEOSGeometry'], - 'GEOSGeometry::extractUniquePoints' => ['GEOSGeometry'], - 'GEOSGeometry::geometryN' => ['GEOSGeometry', 'num'=>'int'], - 'GEOSGeometry::getSRID' => ['int'], - 'GEOSGeometry::getX' => ['float'], - 'GEOSGeometry::getY' => ['float'], - 'GEOSGeometry::hasZ' => ['bool'], - 'GEOSGeometry::hausdorffDistance' => ['float', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::interiorRingN' => ['GEOSGeometry', 'num'=>'int'], - 'GEOSGeometry::interpolate' => ['GEOSGeometry', 'dist'=>'float', 'normalized'=>'bool'], - 'GEOSGeometry::intersection' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::intersects' => ['bool', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::isClosed' => ['bool'], - 'GEOSGeometry::isEmpty' => ['bool'], - 'GEOSGeometry::isRing' => ['bool'], - 'GEOSGeometry::isSimple' => ['bool'], - 'GEOSGeometry::length' => ['float'], - 'GEOSGeometry::node' => ['GEOSGeometry'], - 'GEOSGeometry::normalize' => ['GEOSGeometry'], - 'GEOSGeometry::numCoordinates' => ['int'], - 'GEOSGeometry::numGeometries' => ['int'], - 'GEOSGeometry::numInteriorRings' => ['int'], - 'GEOSGeometry::numPoints' => ['int'], - 'GEOSGeometry::offsetCurve' => ['GEOSGeometry', 'dist'=>'float', 'styleArray'=>'array'], - 'GEOSGeometry::overlaps' => ['bool', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::pointN' => ['GEOSGeometry', 'num'=>'int'], - 'GEOSGeometry::pointOnSurface' => ['GEOSGeometry'], - 'GEOSGeometry::project' => ['float', 'other'=>'GEOSGeometry', 'normalized'=>'bool'], - 'GEOSGeometry::relate' => ['string|bool', 'otherGeom'=>'GEOSGeometry', 'pattern'=>'string'], - 'GEOSGeometry::relateBoundaryNodeRule' => ['string', 'otherGeom'=>'GEOSGeometry', 'rule'=>'int'], - 'GEOSGeometry::setSRID' => ['void', 'srid'=>'int'], - 'GEOSGeometry::simplify' => ['GEOSGeometry', 'tolerance'=>'float', 'preserveTopology='=>'bool'], - 'GEOSGeometry::snapTo' => ['GEOSGeometry', 'geom'=>'GEOSGeometry', 'tolerance'=>'float'], - 'GEOSGeometry::startPoint' => ['GEOSGeometry'], - 'GEOSGeometry::symDifference' => ['GEOSGeometry', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::touches' => ['bool', 'geom'=>'GEOSGeometry'], - 'GEOSGeometry::typeId' => ['int'], - 'GEOSGeometry::typeName' => ['string'], - 'GEOSGeometry::union' => ['GEOSGeometry', 'otherGeom='=>'GEOSGeometry'], - 'GEOSGeometry::voronoiDiagram' => ['GEOSGeometry', 'tolerance'=>'float', 'onlyEdges'=>'bool', 'extent'=>'GEOSGeometry|null'], - 'GEOSGeometry::within' => ['bool', 'geom'=>'GEOSGeometry'], - 'GEOSLineMerge' => ['array', 'geom'=>'GEOSGeometry'], - 'GEOSPolygonize' => ['array{rings: GEOSGeometry[], cut_edges?: GEOSGeometry[], dangles: GEOSGeometry[], invalid_rings: GEOSGeometry[]}', 'geom'=>'GEOSGeometry'], - 'GEOSRelateMatch' => ['bool', 'matrix'=>'string', 'pattern'=>'string'], - 'GEOSSharedPaths' => ['GEOSGeometry', 'geom1'=>'GEOSGeometry', 'geom2'=>'GEOSGeometry'], - 'GEOSVersion' => ['string'], - 'GEOSWKBReader::__construct' => ['void'], - 'GEOSWKBReader::read' => ['GEOSGeometry', 'wkb'=>'string'], - 'GEOSWKBReader::readHEX' => ['GEOSGeometry', 'wkb'=>'string'], - 'GEOSWKBWriter::__construct' => ['void'], - 'GEOSWKBWriter::getByteOrder' => ['int'], - 'GEOSWKBWriter::getIncludeSRID' => ['bool'], - 'GEOSWKBWriter::getOutputDimension' => ['int'], - 'GEOSWKBWriter::setByteOrder' => ['void', 'byteOrder'=>'int'], - 'GEOSWKBWriter::setIncludeSRID' => ['void', 'inc'=>'bool'], - 'GEOSWKBWriter::setOutputDimension' => ['void', 'dim'=>'int'], - 'GEOSWKBWriter::write' => ['string', 'geom'=>'GEOSGeometry'], - 'GEOSWKBWriter::writeHEX' => ['string', 'geom'=>'GEOSGeometry'], - 'GEOSWKTReader::__construct' => ['void'], - 'GEOSWKTReader::read' => ['GEOSGeometry', 'wkt'=>'string'], - 'GEOSWKTWriter::__construct' => ['void'], - 'GEOSWKTWriter::getOutputDimension' => ['int'], - 'GEOSWKTWriter::setOld3D' => ['void', 'val'=>'bool'], - 'GEOSWKTWriter::setOutputDimension' => ['void', 'dim'=>'int'], - 'GEOSWKTWriter::setRoundingPrecision' => ['void', 'prec'=>'int'], - 'GEOSWKTWriter::setTrim' => ['void', 'trim'=>'bool'], - 'GEOSWKTWriter::write' => ['string', 'geom'=>'GEOSGeometry'], - 'GMP::__construct' => ['void'], - 'GMP::__toString' => ['numeric-string'], - 'GMP::serialize' => ['string'], - 'GMP::unserialize' => ['void', 'serialized'=>'string'], - 'GearmanClient::__construct' => ['void'], - 'GearmanClient::addOptions' => ['bool', 'options'=>'int'], - 'GearmanClient::addServer' => ['bool', 'host='=>'string', 'port='=>'int'], - 'GearmanClient::addServers' => ['bool', 'servers='=>'string'], - 'GearmanClient::addTask' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], - 'GearmanClient::addTaskBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], - 'GearmanClient::addTaskHigh' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], - 'GearmanClient::addTaskHighBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], - 'GearmanClient::addTaskLow' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], - 'GearmanClient::addTaskLowBackground' => ['GearmanTask|false', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], - 'GearmanClient::addTaskStatus' => ['GearmanTask', 'job_handle'=>'string', 'context='=>'string'], - 'GearmanClient::clearCallbacks' => ['bool'], - 'GearmanClient::clone' => ['GearmanClient'], - 'GearmanClient::context' => ['string'], - 'GearmanClient::data' => ['string'], - 'GearmanClient::do' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], - 'GearmanClient::doBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], - 'GearmanClient::doHigh' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], - 'GearmanClient::doHighBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], - 'GearmanClient::doJobHandle' => ['string'], - 'GearmanClient::doLow' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], - 'GearmanClient::doLowBackground' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], - 'GearmanClient::doNormal' => ['string', 'function_name'=>'string', 'workload'=>'string', 'unique='=>'string'], - 'GearmanClient::doStatus' => ['array'], - 'GearmanClient::echo' => ['bool', 'workload'=>'string'], - 'GearmanClient::error' => ['string'], - 'GearmanClient::getErrno' => ['int'], - 'GearmanClient::jobStatus' => ['array', 'job_handle'=>'string'], - 'GearmanClient::options' => [''], - 'GearmanClient::ping' => ['bool', 'workload'=>'string'], - 'GearmanClient::removeOptions' => ['bool', 'options'=>'int'], - 'GearmanClient::returnCode' => ['int'], - 'GearmanClient::runTasks' => ['bool'], - 'GearmanClient::setClientCallback' => ['void', 'callback'=>'callable'], - 'GearmanClient::setCompleteCallback' => ['bool', 'callback'=>'callable'], - 'GearmanClient::setContext' => ['bool', 'context'=>'string'], - 'GearmanClient::setCreatedCallback' => ['bool', 'callback'=>'string'], - 'GearmanClient::setData' => ['bool', 'data'=>'string'], - 'GearmanClient::setDataCallback' => ['bool', 'callback'=>'callable'], - 'GearmanClient::setExceptionCallback' => ['bool', 'callback'=>'callable'], - 'GearmanClient::setFailCallback' => ['bool', 'callback'=>'callable'], - 'GearmanClient::setOptions' => ['bool', 'options'=>'int'], - 'GearmanClient::setStatusCallback' => ['bool', 'callback'=>'callable'], - 'GearmanClient::setTimeout' => ['bool', 'timeout'=>'int'], - 'GearmanClient::setWarningCallback' => ['bool', 'callback'=>'callable'], - 'GearmanClient::setWorkloadCallback' => ['bool', 'callback'=>'callable'], - 'GearmanClient::timeout' => ['int'], - 'GearmanClient::wait' => [''], - 'GearmanJob::__construct' => ['void'], - 'GearmanJob::complete' => ['bool', 'result'=>'string'], - 'GearmanJob::data' => ['bool', 'data'=>'string'], - 'GearmanJob::exception' => ['bool', 'exception'=>'string'], - 'GearmanJob::fail' => ['bool'], - 'GearmanJob::functionName' => ['string'], - 'GearmanJob::handle' => ['string'], - 'GearmanJob::returnCode' => ['int'], - 'GearmanJob::sendComplete' => ['bool', 'result'=>'string'], - 'GearmanJob::sendData' => ['bool', 'data'=>'string'], - 'GearmanJob::sendException' => ['bool', 'exception'=>'string'], - 'GearmanJob::sendFail' => ['bool'], - 'GearmanJob::sendStatus' => ['bool', 'numerator'=>'int', 'denominator'=>'int'], - 'GearmanJob::sendWarning' => ['bool', 'warning'=>'string'], - 'GearmanJob::setReturn' => ['bool', 'gearman_return_t'=>'string'], - 'GearmanJob::status' => ['bool', 'numerator'=>'int', 'denominator'=>'int'], - 'GearmanJob::unique' => ['string'], - 'GearmanJob::warning' => ['bool', 'warning'=>'string'], - 'GearmanJob::workload' => ['string'], - 'GearmanJob::workloadSize' => ['int'], - 'GearmanTask::__construct' => ['void'], - 'GearmanTask::create' => ['GearmanTask'], - 'GearmanTask::data' => ['string|false'], - 'GearmanTask::dataSize' => ['int|false'], - 'GearmanTask::function' => ['string'], - 'GearmanTask::functionName' => ['string'], - 'GearmanTask::isKnown' => ['bool'], - 'GearmanTask::isRunning' => ['bool'], - 'GearmanTask::jobHandle' => ['string'], - 'GearmanTask::recvData' => ['array|false', 'data_len'=>'int'], - 'GearmanTask::returnCode' => ['int'], - 'GearmanTask::sendData' => ['int', 'data'=>'string'], - 'GearmanTask::sendWorkload' => ['int|false', 'data'=>'string'], - 'GearmanTask::taskDenominator' => ['int|false'], - 'GearmanTask::taskNumerator' => ['int|false'], - 'GearmanTask::unique' => ['string|false'], - 'GearmanTask::uuid' => ['string'], - 'GearmanWorker::__construct' => ['void'], - 'GearmanWorker::addFunction' => ['bool', 'function_name'=>'string', 'function'=>'callable', 'context='=>'mixed', 'timeout='=>'int'], - 'GearmanWorker::addOptions' => ['bool', 'option'=>'int'], - 'GearmanWorker::addServer' => ['bool', 'host='=>'string', 'port='=>'int'], - 'GearmanWorker::addServers' => ['bool', 'servers'=>'string'], - 'GearmanWorker::clone' => ['void'], - 'GearmanWorker::echo' => ['bool', 'workload'=>'string'], - 'GearmanWorker::error' => ['string'], - 'GearmanWorker::getErrno' => ['int'], - 'GearmanWorker::grabJob' => [''], - 'GearmanWorker::options' => ['int'], - 'GearmanWorker::register' => ['bool', 'function_name'=>'string', 'timeout='=>'int'], - 'GearmanWorker::removeOptions' => ['bool', 'option'=>'int'], - 'GearmanWorker::returnCode' => ['int'], - 'GearmanWorker::setId' => ['bool', 'id'=>'string'], - 'GearmanWorker::setOptions' => ['bool', 'option'=>'int'], - 'GearmanWorker::setTimeout' => ['bool', 'timeout'=>'int'], - 'GearmanWorker::timeout' => ['int'], - 'GearmanWorker::unregister' => ['bool', 'function_name'=>'string'], - 'GearmanWorker::unregisterAll' => ['bool'], - 'GearmanWorker::wait' => ['bool'], - 'GearmanWorker::work' => ['bool'], - 'Gender\Gender::__construct' => ['void', 'dsn='=>'string'], - 'Gender\Gender::connect' => ['bool', 'dsn'=>'string'], - 'Gender\Gender::country' => ['array', 'country'=>'int'], - 'Gender\Gender::get' => ['int', 'name'=>'string', 'country='=>'int'], - 'Gender\Gender::isNick' => ['array', 'name0'=>'string', 'name1'=>'string', 'country='=>'int'], - 'Gender\Gender::similarNames' => ['array', 'name'=>'string', 'country='=>'int'], - 'Generator::__wakeup' => ['void'], - 'Generator::current' => ['mixed'], - 'Generator::getReturn' => ['mixed'], - 'Generator::key' => ['mixed'], - 'Generator::next' => ['void'], - 'Generator::rewind' => ['void'], - 'Generator::send' => ['mixed', 'value'=>'mixed'], - 'Generator::throw' => ['mixed', 'exception'=>'Exception|Throwable'], - 'Generator::valid' => ['bool'], - 'GlobIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], - 'GlobIterator::count' => ['int'], - 'GlobIterator::current' => ['FilesystemIterator|SplFileInfo|string'], - 'GlobIterator::getATime' => [''], - 'GlobIterator::getBasename' => ['', 'suffix='=>'string'], - 'GlobIterator::getCTime' => [''], - 'GlobIterator::getExtension' => [''], - 'GlobIterator::getFileInfo' => [''], - 'GlobIterator::getFilename' => [''], - 'GlobIterator::getFlags' => ['int'], - 'GlobIterator::getGroup' => [''], - 'GlobIterator::getInode' => [''], - 'GlobIterator::getLinkTarget' => [''], - 'GlobIterator::getMTime' => [''], - 'GlobIterator::getOwner' => [''], - 'GlobIterator::getPath' => [''], - 'GlobIterator::getPathInfo' => [''], - 'GlobIterator::getPathname' => [''], - 'GlobIterator::getPerms' => [''], - 'GlobIterator::getRealPath' => [''], - 'GlobIterator::getSize' => [''], - 'GlobIterator::getType' => [''], - 'GlobIterator::isDir' => [''], - 'GlobIterator::isDot' => [''], - 'GlobIterator::isExecutable' => [''], - 'GlobIterator::isFile' => [''], - 'GlobIterator::isLink' => [''], - 'GlobIterator::isReadable' => [''], - 'GlobIterator::isWritable' => [''], - 'GlobIterator::key' => ['string'], - 'GlobIterator::next' => ['void'], - 'GlobIterator::openFile' => [''], - 'GlobIterator::rewind' => ['void'], - 'GlobIterator::seek' => ['void', 'position'=>'int'], - 'GlobIterator::setFileClass' => [''], - 'GlobIterator::setFlags' => ['void', 'flags='=>'int'], - 'GlobIterator::setInfoClass' => [''], - 'GlobIterator::valid' => [''], - 'Gmagick::__construct' => ['void', 'filename='=>'string'], - 'Gmagick::addimage' => ['Gmagick', 'gmagick'=>'gmagick'], - 'Gmagick::addnoiseimage' => ['Gmagick', 'noise'=>'int'], - 'Gmagick::annotateimage' => ['Gmagick', 'gmagickdraw'=>'gmagickdraw', 'x'=>'float', 'y'=>'float', 'angle'=>'float', 'text'=>'string'], - 'Gmagick::blurimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], - 'Gmagick::borderimage' => ['Gmagick', 'color'=>'gmagickpixel', 'width'=>'int', 'height'=>'int'], - 'Gmagick::charcoalimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float'], - 'Gmagick::chopimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], - 'Gmagick::clear' => ['Gmagick'], - 'Gmagick::commentimage' => ['Gmagick', 'comment'=>'string'], - 'Gmagick::compositeimage' => ['Gmagick', 'source'=>'gmagick', 'compose'=>'int', 'x'=>'int', 'y'=>'int'], - 'Gmagick::cropimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], - 'Gmagick::cropthumbnailimage' => ['Gmagick', 'width'=>'int', 'height'=>'int'], - 'Gmagick::current' => ['Gmagick'], - 'Gmagick::cyclecolormapimage' => ['Gmagick', 'displace'=>'int'], - 'Gmagick::deconstructimages' => ['Gmagick'], - 'Gmagick::despeckleimage' => ['Gmagick'], - 'Gmagick::destroy' => ['bool'], - 'Gmagick::drawimage' => ['Gmagick', 'gmagickdraw'=>'gmagickdraw'], - 'Gmagick::edgeimage' => ['Gmagick', 'radius'=>'float'], - 'Gmagick::embossimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float'], - 'Gmagick::enhanceimage' => ['Gmagick'], - 'Gmagick::equalizeimage' => ['Gmagick'], - 'Gmagick::flipimage' => ['Gmagick'], - 'Gmagick::flopimage' => ['Gmagick'], - 'Gmagick::frameimage' => ['Gmagick', 'color'=>'gmagickpixel', 'width'=>'int', 'height'=>'int', 'inner_bevel'=>'int', 'outer_bevel'=>'int'], - 'Gmagick::gammaimage' => ['Gmagick', 'gamma'=>'float'], - 'Gmagick::getcopyright' => ['string'], - 'Gmagick::getfilename' => ['string'], - 'Gmagick::getimagebackgroundcolor' => ['GmagickPixel'], - 'Gmagick::getimageblueprimary' => ['array'], - 'Gmagick::getimagebordercolor' => ['GmagickPixel'], - 'Gmagick::getimagechanneldepth' => ['int', 'channel_type'=>'int'], - 'Gmagick::getimagecolors' => ['int'], - 'Gmagick::getimagecolorspace' => ['int'], - 'Gmagick::getimagecompose' => ['int'], - 'Gmagick::getimagedelay' => ['int'], - 'Gmagick::getimagedepth' => ['int'], - 'Gmagick::getimagedispose' => ['int'], - 'Gmagick::getimageextrema' => ['array'], - 'Gmagick::getimagefilename' => ['string'], - 'Gmagick::getimageformat' => ['string'], - 'Gmagick::getimagegamma' => ['float'], - 'Gmagick::getimagegreenprimary' => ['array'], - 'Gmagick::getimageheight' => ['int'], - 'Gmagick::getimagehistogram' => ['array'], - 'Gmagick::getimageindex' => ['int'], - 'Gmagick::getimageinterlacescheme' => ['int'], - 'Gmagick::getimageiterations' => ['int'], - 'Gmagick::getimagematte' => ['int'], - 'Gmagick::getimagemattecolor' => ['GmagickPixel'], - 'Gmagick::getimageprofile' => ['string', 'name'=>'string'], - 'Gmagick::getimageredprimary' => ['array'], - 'Gmagick::getimagerenderingintent' => ['int'], - 'Gmagick::getimageresolution' => ['array'], - 'Gmagick::getimagescene' => ['int'], - 'Gmagick::getimagesignature' => ['string'], - 'Gmagick::getimagetype' => ['int'], - 'Gmagick::getimageunits' => ['int'], - 'Gmagick::getimagewhitepoint' => ['array'], - 'Gmagick::getimagewidth' => ['int'], - 'Gmagick::getpackagename' => ['string'], - 'Gmagick::getquantumdepth' => ['array'], - 'Gmagick::getreleasedate' => ['string'], - 'Gmagick::getsamplingfactors' => ['array'], - 'Gmagick::getsize' => ['array'], - 'Gmagick::getversion' => ['array'], - 'Gmagick::hasnextimage' => ['bool'], - 'Gmagick::haspreviousimage' => ['bool'], - 'Gmagick::implodeimage' => ['mixed', 'radius'=>'float'], - 'Gmagick::labelimage' => ['mixed', 'label'=>'string'], - 'Gmagick::levelimage' => ['mixed', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'int'], - 'Gmagick::magnifyimage' => ['mixed'], - 'Gmagick::mapimage' => ['Gmagick', 'gmagick'=>'gmagick', 'dither'=>'bool'], - 'Gmagick::medianfilterimage' => ['void', 'radius'=>'float'], - 'Gmagick::minifyimage' => ['Gmagick'], - 'Gmagick::modulateimage' => ['Gmagick', 'brightness'=>'float', 'saturation'=>'float', 'hue'=>'float'], - 'Gmagick::motionblurimage' => ['Gmagick', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float'], - 'Gmagick::newimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'background'=>'string', 'format='=>'string'], - 'Gmagick::nextimage' => ['bool'], - 'Gmagick::normalizeimage' => ['Gmagick', 'channel='=>'int'], - 'Gmagick::oilpaintimage' => ['Gmagick', 'radius'=>'float'], - 'Gmagick::previousimage' => ['bool'], - 'Gmagick::profileimage' => ['Gmagick', 'name'=>'string', 'profile'=>'string'], - 'Gmagick::quantizeimage' => ['Gmagick', 'numcolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], - 'Gmagick::quantizeimages' => ['Gmagick', 'numcolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], - 'Gmagick::queryfontmetrics' => ['array', 'draw'=>'gmagickdraw', 'text'=>'string'], - 'Gmagick::queryfonts' => ['array', 'pattern='=>'string'], - 'Gmagick::queryformats' => ['array', 'pattern='=>'string'], - 'Gmagick::radialblurimage' => ['Gmagick', 'angle'=>'float', 'channel='=>'int'], - 'Gmagick::raiseimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int', 'raise'=>'bool'], - 'Gmagick::read' => ['Gmagick', 'filename'=>'string'], - 'Gmagick::readimage' => ['Gmagick', 'filename'=>'string'], - 'Gmagick::readimageblob' => ['Gmagick', 'imagecontents'=>'string', 'filename='=>'string'], - 'Gmagick::readimagefile' => ['Gmagick', 'fp'=>'resource', 'filename='=>'string'], - 'Gmagick::reducenoiseimage' => ['Gmagick', 'radius'=>'float'], - 'Gmagick::removeimage' => ['Gmagick'], - 'Gmagick::removeimageprofile' => ['string', 'name'=>'string'], - 'Gmagick::resampleimage' => ['Gmagick', 'xresolution'=>'float', 'yresolution'=>'float', 'filter'=>'int', 'blur'=>'float'], - 'Gmagick::resizeimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'filter'=>'int', 'blur'=>'float', 'fit='=>'bool'], - 'Gmagick::rollimage' => ['Gmagick', 'x'=>'int', 'y'=>'int'], - 'Gmagick::rotateimage' => ['Gmagick', 'color'=>'mixed', 'degrees'=>'float'], - 'Gmagick::scaleimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'fit='=>'bool'], - 'Gmagick::separateimagechannel' => ['Gmagick', 'channel'=>'int'], - 'Gmagick::setCompressionQuality' => ['Gmagick', 'quality'=>'int'], - 'Gmagick::setfilename' => ['Gmagick', 'filename'=>'string'], - 'Gmagick::setimagebackgroundcolor' => ['Gmagick', 'color'=>'gmagickpixel'], - 'Gmagick::setimageblueprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], - 'Gmagick::setimagebordercolor' => ['Gmagick', 'color'=>'gmagickpixel'], - 'Gmagick::setimagechanneldepth' => ['Gmagick', 'channel'=>'int', 'depth'=>'int'], - 'Gmagick::setimagecolorspace' => ['Gmagick', 'colorspace'=>'int'], - 'Gmagick::setimagecompose' => ['Gmagick', 'composite'=>'int'], - 'Gmagick::setimagedelay' => ['Gmagick', 'delay'=>'int'], - 'Gmagick::setimagedepth' => ['Gmagick', 'depth'=>'int'], - 'Gmagick::setimagedispose' => ['Gmagick', 'disposetype'=>'int'], - 'Gmagick::setimagefilename' => ['Gmagick', 'filename'=>'string'], - 'Gmagick::setimageformat' => ['Gmagick', 'imageformat'=>'string'], - 'Gmagick::setimagegamma' => ['Gmagick', 'gamma'=>'float'], - 'Gmagick::setimagegreenprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], - 'Gmagick::setimageindex' => ['Gmagick', 'index'=>'int'], - 'Gmagick::setimageinterlacescheme' => ['Gmagick', 'interlace'=>'int'], - 'Gmagick::setimageiterations' => ['Gmagick', 'iterations'=>'int'], - 'Gmagick::setimageprofile' => ['Gmagick', 'name'=>'string', 'profile'=>'string'], - 'Gmagick::setimageredprimary' => ['Gmagick', 'x'=>'float', 'y'=>'float'], - 'Gmagick::setimagerenderingintent' => ['Gmagick', 'rendering_intent'=>'int'], - 'Gmagick::setimageresolution' => ['Gmagick', 'xresolution'=>'float', 'yresolution'=>'float'], - 'Gmagick::setimagescene' => ['Gmagick', 'scene'=>'int'], - 'Gmagick::setimagetype' => ['Gmagick', 'imgtype'=>'int'], - 'Gmagick::setimageunits' => ['Gmagick', 'resolution'=>'int'], - 'Gmagick::setimagewhitepoint' => ['Gmagick', 'x'=>'float', 'y'=>'float'], - 'Gmagick::setsamplingfactors' => ['Gmagick', 'factors'=>'array'], - 'Gmagick::setsize' => ['Gmagick', 'columns'=>'int', 'rows'=>'int'], - 'Gmagick::shearimage' => ['Gmagick', 'color'=>'mixed', 'xshear'=>'float', 'yshear'=>'float'], - 'Gmagick::solarizeimage' => ['Gmagick', 'threshold'=>'int'], - 'Gmagick::spreadimage' => ['Gmagick', 'radius'=>'float'], - 'Gmagick::stripimage' => ['Gmagick'], - 'Gmagick::swirlimage' => ['Gmagick', 'degrees'=>'float'], - 'Gmagick::thumbnailimage' => ['Gmagick', 'width'=>'int', 'height'=>'int', 'fit='=>'bool'], - 'Gmagick::trimimage' => ['Gmagick', 'fuzz'=>'float'], - 'Gmagick::write' => ['Gmagick', 'filename'=>'string'], - 'Gmagick::writeimage' => ['Gmagick', 'filename'=>'string', 'all_frames='=>'bool'], - 'GmagickDraw::annotate' => ['GmagickDraw', 'x'=>'float', 'y'=>'float', 'text'=>'string'], - 'GmagickDraw::arc' => ['GmagickDraw', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float', 'sd'=>'float', 'ed'=>'float'], - 'GmagickDraw::bezier' => ['GmagickDraw', 'coordinate_array'=>'array'], - 'GmagickDraw::ellipse' => ['GmagickDraw', 'ox'=>'float', 'oy'=>'float', 'rx'=>'float', 'ry'=>'float', 'start'=>'float', 'end'=>'float'], - 'GmagickDraw::getfillcolor' => ['GmagickPixel'], - 'GmagickDraw::getfillopacity' => ['float'], - 'GmagickDraw::getfont' => ['string|false'], - 'GmagickDraw::getfontsize' => ['float'], - 'GmagickDraw::getfontstyle' => ['int'], - 'GmagickDraw::getfontweight' => ['int'], - 'GmagickDraw::getstrokecolor' => ['GmagickPixel'], - 'GmagickDraw::getstrokeopacity' => ['float'], - 'GmagickDraw::getstrokewidth' => ['float'], - 'GmagickDraw::gettextdecoration' => ['int'], - 'GmagickDraw::gettextencoding' => ['string|false'], - 'GmagickDraw::line' => ['GmagickDraw', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float'], - 'GmagickDraw::point' => ['GmagickDraw', 'x'=>'float', 'y'=>'float'], - 'GmagickDraw::polygon' => ['GmagickDraw', 'coordinates'=>'array'], - 'GmagickDraw::polyline' => ['GmagickDraw', 'coordinate_array'=>'array'], - 'GmagickDraw::rectangle' => ['GmagickDraw', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], - 'GmagickDraw::rotate' => ['GmagickDraw', 'degrees'=>'float'], - 'GmagickDraw::roundrectangle' => ['GmagickDraw', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'rx'=>'float', 'ry'=>'float'], - 'GmagickDraw::scale' => ['GmagickDraw', 'x'=>'float', 'y'=>'float'], - 'GmagickDraw::setfillcolor' => ['GmagickDraw', 'color'=>'string'], - 'GmagickDraw::setfillopacity' => ['GmagickDraw', 'fill_opacity'=>'float'], - 'GmagickDraw::setfont' => ['GmagickDraw', 'font'=>'string'], - 'GmagickDraw::setfontsize' => ['GmagickDraw', 'pointsize'=>'float'], - 'GmagickDraw::setfontstyle' => ['GmagickDraw', 'style'=>'int'], - 'GmagickDraw::setfontweight' => ['GmagickDraw', 'weight'=>'int'], - 'GmagickDraw::setstrokecolor' => ['GmagickDraw', 'color'=>'gmagickpixel'], - 'GmagickDraw::setstrokeopacity' => ['GmagickDraw', 'stroke_opacity'=>'float'], - 'GmagickDraw::setstrokewidth' => ['GmagickDraw', 'width'=>'float'], - 'GmagickDraw::settextdecoration' => ['GmagickDraw', 'decoration'=>'int'], - 'GmagickDraw::settextencoding' => ['GmagickDraw', 'encoding'=>'string'], - 'GmagickPixel::__construct' => ['void', 'color='=>'string'], - 'GmagickPixel::getcolor' => ['mixed', 'as_array='=>'bool', 'normalize_array='=>'bool'], - 'GmagickPixel::getcolorcount' => ['int'], - 'GmagickPixel::getcolorvalue' => ['float', 'color'=>'int'], - 'GmagickPixel::setcolor' => ['GmagickPixel', 'color'=>'string'], - 'GmagickPixel::setcolorvalue' => ['GmagickPixel', 'color'=>'int', 'value'=>'float'], - 'Grpc\Call::__construct' => ['void', 'channel'=>'Grpc\Channel', 'method'=>'string', 'absolute_deadline'=>'Grpc\Timeval', 'host_override='=>'mixed'], - 'Grpc\Call::cancel' => [''], - 'Grpc\Call::getPeer' => ['string'], - 'Grpc\Call::setCredentials' => ['int', 'creds_obj'=>'Grpc\CallCredentials'], - 'Grpc\Call::startBatch' => ['object', 'batch'=>'array'], - 'Grpc\CallCredentials::createComposite' => ['Grpc\CallCredentials', 'cred1'=>'Grpc\CallCredentials', 'cred2'=>'Grpc\CallCredentials'], - 'Grpc\CallCredentials::createFromPlugin' => ['Grpc\CallCredentials', 'callback'=>'Closure'], - 'Grpc\Channel::__construct' => ['void', 'target'=>'string', 'args='=>'array'], - 'Grpc\Channel::close' => [''], - 'Grpc\Channel::getConnectivityState' => ['int', 'try_to_connect='=>'bool'], - 'Grpc\Channel::getTarget' => ['string'], - 'Grpc\Channel::watchConnectivityState' => ['bool', 'last_state'=>'int', 'deadline_obj'=>'Grpc\Timeval'], - 'Grpc\ChannelCredentials::createComposite' => ['Grpc\ChannelCredentials', 'cred1'=>'Grpc\ChannelCredentials', 'cred2'=>'Grpc\CallCredentials'], - 'Grpc\ChannelCredentials::createDefault' => ['Grpc\ChannelCredentials'], - 'Grpc\ChannelCredentials::createInsecure' => ['null'], - 'Grpc\ChannelCredentials::createSsl' => ['Grpc\ChannelCredentials', 'pem_root_certs'=>'string', 'pem_private_key='=>'string', 'pem_cert_chain='=>'string'], - 'Grpc\ChannelCredentials::setDefaultRootsPem' => ['', 'pem_roots'=>'string'], - 'Grpc\Server::__construct' => ['void', 'args'=>'array'], - 'Grpc\Server::addHttp2Port' => ['bool', 'addr'=>'string'], - 'Grpc\Server::addSecureHttp2Port' => ['bool', 'addr'=>'string', 'creds_obj'=>'Grpc\ServerCredentials'], - 'Grpc\Server::requestCall' => ['', 'tag_new'=>'int', 'tag_cancel'=>'int'], - 'Grpc\Server::start' => [''], - 'Grpc\ServerCredentials::createSsl' => ['object', 'pem_root_certs'=>'string', 'pem_private_key'=>'string', 'pem_cert_chain'=>'string'], - 'Grpc\Timeval::__construct' => ['void', 'usec'=>'int'], - 'Grpc\Timeval::add' => ['Grpc\Timeval', 'other'=>'Grpc\Timeval'], - 'Grpc\Timeval::compare' => ['int', 'a'=>'Grpc\Timeval', 'b'=>'Grpc\Timeval'], - 'Grpc\Timeval::infFuture' => ['Grpc\Timeval'], - 'Grpc\Timeval::infPast' => ['Grpc\Timeval'], - 'Grpc\Timeval::now' => ['Grpc\Timeval'], - 'Grpc\Timeval::similar' => ['bool', 'a'=>'Grpc\Timeval', 'b'=>'Grpc\Timeval', 'threshold'=>'Grpc\Timeval'], - 'Grpc\Timeval::sleepUntil' => [''], - 'Grpc\Timeval::subtract' => ['Grpc\Timeval', 'other'=>'Grpc\Timeval'], - 'Grpc\Timeval::zero' => ['Grpc\Timeval'], - 'HRTime\PerformanceCounter::getElapsedTicks' => ['int'], - 'HRTime\PerformanceCounter::getFrequency' => ['int'], - 'HRTime\PerformanceCounter::getLastElapsedTicks' => ['int'], - 'HRTime\PerformanceCounter::getTicks' => ['int'], - 'HRTime\PerformanceCounter::getTicksSince' => ['int', 'start'=>'int'], - 'HRTime\PerformanceCounter::isRunning' => ['bool'], - 'HRTime\PerformanceCounter::start' => ['void'], - 'HRTime\PerformanceCounter::stop' => ['void'], - 'HRTime\StopWatch::getElapsedTicks' => ['int'], - 'HRTime\StopWatch::getElapsedTime' => ['float', 'unit='=>'int'], - 'HRTime\StopWatch::getLastElapsedTicks' => ['int'], - 'HRTime\StopWatch::getLastElapsedTime' => ['float', 'unit='=>'int'], - 'HRTime\StopWatch::isRunning' => ['bool'], - 'HRTime\StopWatch::start' => ['void'], - 'HRTime\StopWatch::stop' => ['void'], - 'HaruAnnotation::setBorderStyle' => ['bool', 'width'=>'float', 'dash_on'=>'int', 'dash_off'=>'int'], - 'HaruAnnotation::setHighlightMode' => ['bool', 'mode'=>'int'], - 'HaruAnnotation::setIcon' => ['bool', 'icon'=>'int'], - 'HaruAnnotation::setOpened' => ['bool', 'opened'=>'bool'], - 'HaruDestination::setFit' => ['bool'], - 'HaruDestination::setFitB' => ['bool'], - 'HaruDestination::setFitBH' => ['bool', 'top'=>'float'], - 'HaruDestination::setFitBV' => ['bool', 'left'=>'float'], - 'HaruDestination::setFitH' => ['bool', 'top'=>'float'], - 'HaruDestination::setFitR' => ['bool', 'left'=>'float', 'bottom'=>'float', 'right'=>'float', 'top'=>'float'], - 'HaruDestination::setFitV' => ['bool', 'left'=>'float'], - 'HaruDestination::setXYZ' => ['bool', 'left'=>'float', 'top'=>'float', 'zoom'=>'float'], - 'HaruDoc::__construct' => ['void'], - 'HaruDoc::addPage' => ['object'], - 'HaruDoc::addPageLabel' => ['bool', 'first_page'=>'int', 'style'=>'int', 'first_num'=>'int', 'prefix='=>'string'], - 'HaruDoc::createOutline' => ['object', 'title'=>'string', 'parent_outline='=>'object', 'encoder='=>'object'], - 'HaruDoc::getCurrentEncoder' => ['object'], - 'HaruDoc::getCurrentPage' => ['object'], - 'HaruDoc::getEncoder' => ['object', 'encoding'=>'string'], - 'HaruDoc::getFont' => ['object', 'fontname'=>'string', 'encoding='=>'string'], - 'HaruDoc::getInfoAttr' => ['string', 'type'=>'int'], - 'HaruDoc::getPageLayout' => ['int'], - 'HaruDoc::getPageMode' => ['int'], - 'HaruDoc::getStreamSize' => ['int'], - 'HaruDoc::insertPage' => ['object', 'page'=>'object'], - 'HaruDoc::loadJPEG' => ['object', 'filename'=>'string'], - 'HaruDoc::loadPNG' => ['object', 'filename'=>'string', 'deferred='=>'bool'], - 'HaruDoc::loadRaw' => ['object', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'color_space'=>'int'], - 'HaruDoc::loadTTC' => ['string', 'fontfile'=>'string', 'index'=>'int', 'embed='=>'bool'], - 'HaruDoc::loadTTF' => ['string', 'fontfile'=>'string', 'embed='=>'bool'], - 'HaruDoc::loadType1' => ['string', 'afmfile'=>'string', 'pfmfile='=>'string'], - 'HaruDoc::output' => ['bool'], - 'HaruDoc::readFromStream' => ['string', 'bytes'=>'int'], - 'HaruDoc::resetError' => ['bool'], - 'HaruDoc::resetStream' => ['bool'], - 'HaruDoc::save' => ['bool', 'file'=>'string'], - 'HaruDoc::saveToStream' => ['bool'], - 'HaruDoc::setCompressionMode' => ['bool', 'mode'=>'int'], - 'HaruDoc::setCurrentEncoder' => ['bool', 'encoding'=>'string'], - 'HaruDoc::setEncryptionMode' => ['bool', 'mode'=>'int', 'key_len='=>'int'], - 'HaruDoc::setInfoAttr' => ['bool', 'type'=>'int', 'info'=>'string'], - 'HaruDoc::setInfoDateAttr' => ['bool', 'type'=>'int', 'year'=>'int', 'month'=>'int', 'day'=>'int', 'hour'=>'int', 'min'=>'int', 'sec'=>'int', 'ind'=>'string', 'off_hour'=>'int', 'off_min'=>'int'], - 'HaruDoc::setOpenAction' => ['bool', 'destination'=>'object'], - 'HaruDoc::setPageLayout' => ['bool', 'layout'=>'int'], - 'HaruDoc::setPageMode' => ['bool', 'mode'=>'int'], - 'HaruDoc::setPagesConfiguration' => ['bool', 'page_per_pages'=>'int'], - 'HaruDoc::setPassword' => ['bool', 'owner_password'=>'string', 'user_password'=>'string'], - 'HaruDoc::setPermission' => ['bool', 'permission'=>'int'], - 'HaruDoc::useCNSEncodings' => ['bool'], - 'HaruDoc::useCNSFonts' => ['bool'], - 'HaruDoc::useCNTEncodings' => ['bool'], - 'HaruDoc::useCNTFonts' => ['bool'], - 'HaruDoc::useJPEncodings' => ['bool'], - 'HaruDoc::useJPFonts' => ['bool'], - 'HaruDoc::useKREncodings' => ['bool'], - 'HaruDoc::useKRFonts' => ['bool'], - 'HaruEncoder::getByteType' => ['int', 'text'=>'string', 'index'=>'int'], - 'HaruEncoder::getType' => ['int'], - 'HaruEncoder::getUnicode' => ['int', 'character'=>'int'], - 'HaruEncoder::getWritingMode' => ['int'], - 'HaruFont::getAscent' => ['int'], - 'HaruFont::getCapHeight' => ['int'], - 'HaruFont::getDescent' => ['int'], - 'HaruFont::getEncodingName' => ['string'], - 'HaruFont::getFontName' => ['string'], - 'HaruFont::getTextWidth' => ['array', 'text'=>'string'], - 'HaruFont::getUnicodeWidth' => ['int', 'character'=>'int'], - 'HaruFont::getXHeight' => ['int'], - 'HaruFont::measureText' => ['int', 'text'=>'string', 'width'=>'float', 'font_size'=>'float', 'char_space'=>'float', 'word_space'=>'float', 'word_wrap='=>'bool'], - 'HaruImage::getBitsPerComponent' => ['int'], - 'HaruImage::getColorSpace' => ['string'], - 'HaruImage::getHeight' => ['int'], - 'HaruImage::getSize' => ['array'], - 'HaruImage::getWidth' => ['int'], - 'HaruImage::setColorMask' => ['bool', 'rmin'=>'int', 'rmax'=>'int', 'gmin'=>'int', 'gmax'=>'int', 'bmin'=>'int', 'bmax'=>'int'], - 'HaruImage::setMaskImage' => ['bool', 'mask_image'=>'object'], - 'HaruOutline::setDestination' => ['bool', 'destination'=>'object'], - 'HaruOutline::setOpened' => ['bool', 'opened'=>'bool'], - 'HaruPage::arc' => ['bool', 'x'=>'float', 'y'=>'float', 'ray'=>'float', 'ang1'=>'float', 'ang2'=>'float'], - 'HaruPage::beginText' => ['bool'], - 'HaruPage::circle' => ['bool', 'x'=>'float', 'y'=>'float', 'ray'=>'float'], - 'HaruPage::closePath' => ['bool'], - 'HaruPage::concat' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], - 'HaruPage::createDestination' => ['object'], - 'HaruPage::createLinkAnnotation' => ['object', 'rectangle'=>'array', 'destination'=>'object'], - 'HaruPage::createTextAnnotation' => ['object', 'rectangle'=>'array', 'text'=>'string', 'encoder='=>'object'], - 'HaruPage::createURLAnnotation' => ['object', 'rectangle'=>'array', 'url'=>'string'], - 'HaruPage::curveTo' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], - 'HaruPage::curveTo2' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], - 'HaruPage::curveTo3' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x3'=>'float', 'y3'=>'float'], - 'HaruPage::drawImage' => ['bool', 'image'=>'object', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], - 'HaruPage::ellipse' => ['bool', 'x'=>'float', 'y'=>'float', 'xray'=>'float', 'yray'=>'float'], - 'HaruPage::endPath' => ['bool'], - 'HaruPage::endText' => ['bool'], - 'HaruPage::eoFillStroke' => ['bool', 'close_path='=>'bool'], - 'HaruPage::eofill' => ['bool'], - 'HaruPage::fill' => ['bool'], - 'HaruPage::fillStroke' => ['bool', 'close_path='=>'bool'], - 'HaruPage::getCMYKFill' => ['array'], - 'HaruPage::getCMYKStroke' => ['array'], - 'HaruPage::getCharSpace' => ['float'], - 'HaruPage::getCurrentFont' => ['object'], - 'HaruPage::getCurrentFontSize' => ['float'], - 'HaruPage::getCurrentPos' => ['array'], - 'HaruPage::getCurrentTextPos' => ['array'], - 'HaruPage::getDash' => ['array'], - 'HaruPage::getFillingColorSpace' => ['int'], - 'HaruPage::getFlatness' => ['float'], - 'HaruPage::getGMode' => ['int'], - 'HaruPage::getGrayFill' => ['float'], - 'HaruPage::getGrayStroke' => ['float'], - 'HaruPage::getHeight' => ['float'], - 'HaruPage::getHorizontalScaling' => ['float'], - 'HaruPage::getLineCap' => ['int'], - 'HaruPage::getLineJoin' => ['int'], - 'HaruPage::getLineWidth' => ['float'], - 'HaruPage::getMiterLimit' => ['float'], - 'HaruPage::getRGBFill' => ['array'], - 'HaruPage::getRGBStroke' => ['array'], - 'HaruPage::getStrokingColorSpace' => ['int'], - 'HaruPage::getTextLeading' => ['float'], - 'HaruPage::getTextMatrix' => ['array'], - 'HaruPage::getTextRenderingMode' => ['int'], - 'HaruPage::getTextRise' => ['float'], - 'HaruPage::getTextWidth' => ['float', 'text'=>'string'], - 'HaruPage::getTransMatrix' => ['array'], - 'HaruPage::getWidth' => ['float'], - 'HaruPage::getWordSpace' => ['float'], - 'HaruPage::lineTo' => ['bool', 'x'=>'float', 'y'=>'float'], - 'HaruPage::measureText' => ['int', 'text'=>'string', 'width'=>'float', 'wordwrap='=>'bool'], - 'HaruPage::moveTextPos' => ['bool', 'x'=>'float', 'y'=>'float', 'set_leading='=>'bool'], - 'HaruPage::moveTo' => ['bool', 'x'=>'float', 'y'=>'float'], - 'HaruPage::moveToNextLine' => ['bool'], - 'HaruPage::rectangle' => ['bool', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], - 'HaruPage::setCMYKFill' => ['bool', 'c'=>'float', 'm'=>'float', 'y'=>'float', 'k'=>'float'], - 'HaruPage::setCMYKStroke' => ['bool', 'c'=>'float', 'm'=>'float', 'y'=>'float', 'k'=>'float'], - 'HaruPage::setCharSpace' => ['bool', 'char_space'=>'float'], - 'HaruPage::setDash' => ['bool', 'pattern'=>'array', 'phase'=>'int'], - 'HaruPage::setFlatness' => ['bool', 'flatness'=>'float'], - 'HaruPage::setFontAndSize' => ['bool', 'font'=>'object', 'size'=>'float'], - 'HaruPage::setGrayFill' => ['bool', 'value'=>'float'], - 'HaruPage::setGrayStroke' => ['bool', 'value'=>'float'], - 'HaruPage::setHeight' => ['bool', 'height'=>'float'], - 'HaruPage::setHorizontalScaling' => ['bool', 'scaling'=>'float'], - 'HaruPage::setLineCap' => ['bool', 'cap'=>'int'], - 'HaruPage::setLineJoin' => ['bool', 'join'=>'int'], - 'HaruPage::setLineWidth' => ['bool', 'width'=>'float'], - 'HaruPage::setMiterLimit' => ['bool', 'limit'=>'float'], - 'HaruPage::setRGBFill' => ['bool', 'r'=>'float', 'g'=>'float', 'b'=>'float'], - 'HaruPage::setRGBStroke' => ['bool', 'r'=>'float', 'g'=>'float', 'b'=>'float'], - 'HaruPage::setRotate' => ['bool', 'angle'=>'int'], - 'HaruPage::setSize' => ['bool', 'size'=>'int', 'direction'=>'int'], - 'HaruPage::setSlideShow' => ['bool', 'type'=>'int', 'disp_time'=>'float', 'trans_time'=>'float'], - 'HaruPage::setTextLeading' => ['bool', 'text_leading'=>'float'], - 'HaruPage::setTextMatrix' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], - 'HaruPage::setTextRenderingMode' => ['bool', 'mode'=>'int'], - 'HaruPage::setTextRise' => ['bool', 'rise'=>'float'], - 'HaruPage::setWidth' => ['bool', 'width'=>'float'], - 'HaruPage::setWordSpace' => ['bool', 'word_space'=>'float'], - 'HaruPage::showText' => ['bool', 'text'=>'string'], - 'HaruPage::showTextNextLine' => ['bool', 'text'=>'string', 'word_space='=>'float', 'char_space='=>'float'], - 'HaruPage::stroke' => ['bool', 'close_path='=>'bool'], - 'HaruPage::textOut' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'], - 'HaruPage::textRect' => ['bool', 'left'=>'float', 'top'=>'float', 'right'=>'float', 'bottom'=>'float', 'text'=>'string', 'align='=>'int'], - 'HttpDeflateStream::__construct' => ['void', 'flags='=>'int'], - 'HttpDeflateStream::factory' => ['HttpDeflateStream', 'flags='=>'int', 'class_name='=>'string'], - 'HttpDeflateStream::finish' => ['string', 'data='=>'string'], - 'HttpDeflateStream::flush' => ['string|false', 'data='=>'string'], - 'HttpDeflateStream::update' => ['string|false', 'data'=>'string'], - 'HttpInflateStream::__construct' => ['void', 'flags='=>'int'], - 'HttpInflateStream::factory' => ['HttpInflateStream', 'flags='=>'int', 'class_name='=>'string'], - 'HttpInflateStream::finish' => ['string', 'data='=>'string'], - 'HttpInflateStream::flush' => ['string|false', 'data='=>'string'], - 'HttpInflateStream::update' => ['string|false', 'data'=>'string'], - 'HttpMessage::__construct' => ['void', 'message='=>'string'], - 'HttpMessage::__toString' => ['string'], - 'HttpMessage::addHeaders' => ['void', 'headers'=>'array', 'append='=>'bool'], - 'HttpMessage::count' => ['int'], - 'HttpMessage::current' => ['mixed'], - 'HttpMessage::detach' => ['HttpMessage'], - 'HttpMessage::factory' => ['?HttpMessage', 'raw_message='=>'string', 'class_name='=>'string'], - 'HttpMessage::fromEnv' => ['?HttpMessage', 'message_type'=>'int', 'class_name='=>'string'], - 'HttpMessage::fromString' => ['?HttpMessage', 'raw_message='=>'string', 'class_name='=>'string'], - 'HttpMessage::getBody' => ['string'], - 'HttpMessage::getHeader' => ['?string', 'header'=>'string'], - 'HttpMessage::getHeaders' => ['array'], - 'HttpMessage::getHttpVersion' => ['string'], - 'HttpMessage::getInfo' => [''], - 'HttpMessage::getParentMessage' => ['HttpMessage'], - 'HttpMessage::getRequestMethod' => ['string|false'], - 'HttpMessage::getRequestUrl' => ['string|false'], - 'HttpMessage::getResponseCode' => ['int'], - 'HttpMessage::getResponseStatus' => ['string'], - 'HttpMessage::getType' => ['int'], - 'HttpMessage::guessContentType' => ['string|false', 'magic_file'=>'string', 'magic_mode='=>'int'], - 'HttpMessage::key' => ['int|string'], - 'HttpMessage::next' => ['void'], - 'HttpMessage::prepend' => ['void', 'message'=>'HttpMessage', 'top='=>'bool'], - 'HttpMessage::reverse' => ['HttpMessage'], - 'HttpMessage::rewind' => ['void'], - 'HttpMessage::send' => ['bool'], - 'HttpMessage::serialize' => ['string'], - 'HttpMessage::setBody' => ['void', 'body'=>'string'], - 'HttpMessage::setHeaders' => ['void', 'headers'=>'array'], - 'HttpMessage::setHttpVersion' => ['bool', 'version'=>'string'], - 'HttpMessage::setInfo' => ['', 'http_info'=>''], - 'HttpMessage::setRequestMethod' => ['bool', 'method'=>'string'], - 'HttpMessage::setRequestUrl' => ['bool', 'url'=>'string'], - 'HttpMessage::setResponseCode' => ['bool', 'code'=>'int'], - 'HttpMessage::setResponseStatus' => ['bool', 'status'=>'string'], - 'HttpMessage::setType' => ['void', 'type'=>'int'], - 'HttpMessage::toMessageTypeObject' => ['HttpRequest|HttpResponse|null'], - 'HttpMessage::toString' => ['string', 'include_parent='=>'bool'], - 'HttpMessage::unserialize' => ['void', 'serialized'=>'string'], - 'HttpMessage::valid' => ['bool'], - 'HttpQueryString::__construct' => ['void', 'global='=>'bool', 'add='=>'mixed'], - 'HttpQueryString::__toString' => ['string'], - 'HttpQueryString::factory' => ['', 'global'=>'', 'params'=>'', 'class_name'=>''], - 'HttpQueryString::get' => ['mixed', 'key='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], - 'HttpQueryString::getArray' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], - 'HttpQueryString::getBool' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], - 'HttpQueryString::getFloat' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], - 'HttpQueryString::getInt' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], - 'HttpQueryString::getObject' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], - 'HttpQueryString::getString' => ['', 'name'=>'', 'defval'=>'', 'delete'=>''], - 'HttpQueryString::mod' => ['HttpQueryString', 'params'=>'mixed'], - 'HttpQueryString::offsetExists' => ['bool', 'offset'=>'mixed'], - 'HttpQueryString::offsetGet' => ['mixed', 'offset'=>'mixed'], - 'HttpQueryString::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], - 'HttpQueryString::offsetUnset' => ['void', 'offset'=>'mixed'], - 'HttpQueryString::serialize' => ['string'], - 'HttpQueryString::set' => ['string', 'params'=>'mixed'], - 'HttpQueryString::singleton' => ['HttpQueryString', 'global='=>'bool'], - 'HttpQueryString::toArray' => ['array'], - 'HttpQueryString::toString' => ['string'], - 'HttpQueryString::unserialize' => ['void', 'serialized'=>'string'], - 'HttpQueryString::xlate' => ['bool', 'ie'=>'string', 'oe'=>'string'], - 'HttpRequest::__construct' => ['void', 'url='=>'string', 'request_method='=>'int', 'options='=>'array'], - 'HttpRequest::addBody' => ['', 'request_body_data'=>''], - 'HttpRequest::addCookies' => ['bool', 'cookies'=>'array'], - 'HttpRequest::addHeaders' => ['bool', 'headers'=>'array'], - 'HttpRequest::addPostFields' => ['bool', 'post_data'=>'array'], - 'HttpRequest::addPostFile' => ['bool', 'name'=>'string', 'file'=>'string', 'content_type='=>'string'], - 'HttpRequest::addPutData' => ['bool', 'put_data'=>'string'], - 'HttpRequest::addQueryData' => ['bool', 'query_params'=>'array'], - 'HttpRequest::addRawPostData' => ['bool', 'raw_post_data'=>'string'], - 'HttpRequest::addSslOptions' => ['bool', 'options'=>'array'], - 'HttpRequest::clearHistory' => ['void'], - 'HttpRequest::enableCookies' => ['bool'], - 'HttpRequest::encodeBody' => ['', 'fields'=>'', 'files'=>''], - 'HttpRequest::factory' => ['', 'url'=>'', 'method'=>'', 'options'=>'', 'class_name'=>''], - 'HttpRequest::flushCookies' => [''], - 'HttpRequest::get' => ['', 'url'=>'', 'options'=>'', '&info'=>''], - 'HttpRequest::getBody' => [''], - 'HttpRequest::getContentType' => ['string'], - 'HttpRequest::getCookies' => ['array'], - 'HttpRequest::getHeaders' => ['array'], - 'HttpRequest::getHistory' => ['HttpMessage'], - 'HttpRequest::getMethod' => ['int'], - 'HttpRequest::getOptions' => ['array'], - 'HttpRequest::getPostFields' => ['array'], - 'HttpRequest::getPostFiles' => ['array'], - 'HttpRequest::getPutData' => ['string'], - 'HttpRequest::getPutFile' => ['string'], - 'HttpRequest::getQueryData' => ['string'], - 'HttpRequest::getRawPostData' => ['string'], - 'HttpRequest::getRawRequestMessage' => ['string'], - 'HttpRequest::getRawResponseMessage' => ['string'], - 'HttpRequest::getRequestMessage' => ['HttpMessage'], - 'HttpRequest::getResponseBody' => ['string'], - 'HttpRequest::getResponseCode' => ['int'], - 'HttpRequest::getResponseCookies' => ['stdClass[]', 'flags='=>'int', 'allowed_extras='=>'array'], - 'HttpRequest::getResponseData' => ['array'], - 'HttpRequest::getResponseHeader' => ['mixed', 'name='=>'string'], - 'HttpRequest::getResponseInfo' => ['mixed', 'name='=>'string'], - 'HttpRequest::getResponseMessage' => ['HttpMessage'], - 'HttpRequest::getResponseStatus' => ['string'], - 'HttpRequest::getSslOptions' => ['array'], - 'HttpRequest::getUrl' => ['string'], - 'HttpRequest::head' => ['', 'url'=>'', 'options'=>'', '&info'=>''], - 'HttpRequest::methodExists' => ['', 'method'=>''], - 'HttpRequest::methodName' => ['', 'method_id'=>''], - 'HttpRequest::methodRegister' => ['', 'method_name'=>''], - 'HttpRequest::methodUnregister' => ['', 'method'=>''], - 'HttpRequest::postData' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], - 'HttpRequest::postFields' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], - 'HttpRequest::putData' => ['', 'url'=>'', 'data'=>'', 'options'=>'', '&info'=>''], - 'HttpRequest::putFile' => ['', 'url'=>'', 'file'=>'', 'options'=>'', '&info'=>''], - 'HttpRequest::putStream' => ['', 'url'=>'', 'stream'=>'', 'options'=>'', '&info'=>''], - 'HttpRequest::resetCookies' => ['bool', 'session_only='=>'bool'], - 'HttpRequest::send' => ['HttpMessage'], - 'HttpRequest::setBody' => ['bool', 'request_body_data='=>'string'], - 'HttpRequest::setContentType' => ['bool', 'content_type'=>'string'], - 'HttpRequest::setCookies' => ['bool', 'cookies='=>'array'], - 'HttpRequest::setHeaders' => ['bool', 'headers='=>'array'], - 'HttpRequest::setMethod' => ['bool', 'request_method'=>'int'], - 'HttpRequest::setOptions' => ['bool', 'options='=>'array'], - 'HttpRequest::setPostFields' => ['bool', 'post_data'=>'array'], - 'HttpRequest::setPostFiles' => ['bool', 'post_files'=>'array'], - 'HttpRequest::setPutData' => ['bool', 'put_data='=>'string'], - 'HttpRequest::setPutFile' => ['bool', 'file='=>'string'], - 'HttpRequest::setQueryData' => ['bool', 'query_data'=>'mixed'], - 'HttpRequest::setRawPostData' => ['bool', 'raw_post_data='=>'string'], - 'HttpRequest::setSslOptions' => ['bool', 'options='=>'array'], - 'HttpRequest::setUrl' => ['bool', 'url'=>'string'], - 'HttpRequestDataShare::__construct' => ['void'], - 'HttpRequestDataShare::__destruct' => ['void'], - 'HttpRequestDataShare::attach' => ['', 'request'=>'HttpRequest'], - 'HttpRequestDataShare::count' => ['int'], - 'HttpRequestDataShare::detach' => ['', 'request'=>'HttpRequest'], - 'HttpRequestDataShare::factory' => ['', 'global'=>'', 'class_name'=>''], - 'HttpRequestDataShare::reset' => [''], - 'HttpRequestDataShare::singleton' => ['', 'global'=>''], - 'HttpRequestPool::__construct' => ['void', 'request='=>'HttpRequest'], - 'HttpRequestPool::__destruct' => ['void'], - 'HttpRequestPool::attach' => ['bool', 'request'=>'HttpRequest'], - 'HttpRequestPool::count' => ['int'], - 'HttpRequestPool::current' => ['mixed'], - 'HttpRequestPool::detach' => ['bool', 'request'=>'HttpRequest'], - 'HttpRequestPool::enableEvents' => ['', 'enable'=>''], - 'HttpRequestPool::enablePipelining' => ['', 'enable'=>''], - 'HttpRequestPool::getAttachedRequests' => ['array'], - 'HttpRequestPool::getFinishedRequests' => ['array'], - 'HttpRequestPool::key' => ['int|string'], - 'HttpRequestPool::next' => ['void'], - 'HttpRequestPool::reset' => ['void'], - 'HttpRequestPool::rewind' => ['void'], - 'HttpRequestPool::send' => ['bool'], - 'HttpRequestPool::socketPerform' => ['bool'], - 'HttpRequestPool::socketSelect' => ['bool', 'timeout='=>'float'], - 'HttpRequestPool::valid' => ['bool'], - 'HttpResponse::capture' => ['void'], - 'HttpResponse::getBufferSize' => ['int'], - 'HttpResponse::getCache' => ['bool'], - 'HttpResponse::getCacheControl' => ['string'], - 'HttpResponse::getContentDisposition' => ['string'], - 'HttpResponse::getContentType' => ['string'], - 'HttpResponse::getData' => ['string'], - 'HttpResponse::getETag' => ['string'], - 'HttpResponse::getFile' => ['string'], - 'HttpResponse::getGzip' => ['bool'], - 'HttpResponse::getHeader' => ['mixed', 'name='=>'string'], - 'HttpResponse::getLastModified' => ['int'], - 'HttpResponse::getRequestBody' => ['string'], - 'HttpResponse::getRequestBodyStream' => ['resource'], - 'HttpResponse::getRequestHeaders' => ['array'], - 'HttpResponse::getStream' => ['resource'], - 'HttpResponse::getThrottleDelay' => ['float'], - 'HttpResponse::guessContentType' => ['string|false', 'magic_file'=>'string', 'magic_mode='=>'int'], - 'HttpResponse::redirect' => ['void', 'url='=>'string', 'params='=>'array', 'session='=>'bool', 'status='=>'int'], - 'HttpResponse::send' => ['bool', 'clean_ob='=>'bool'], - 'HttpResponse::setBufferSize' => ['bool', 'bytes'=>'int'], - 'HttpResponse::setCache' => ['bool', 'cache'=>'bool'], - 'HttpResponse::setCacheControl' => ['bool', 'control'=>'string', 'max_age='=>'int', 'must_revalidate='=>'bool'], - 'HttpResponse::setContentDisposition' => ['bool', 'filename'=>'string', 'inline='=>'bool'], - 'HttpResponse::setContentType' => ['bool', 'content_type'=>'string'], - 'HttpResponse::setData' => ['bool', 'data'=>'mixed'], - 'HttpResponse::setETag' => ['bool', 'etag'=>'string'], - 'HttpResponse::setFile' => ['bool', 'file'=>'string'], - 'HttpResponse::setGzip' => ['bool', 'gzip'=>'bool'], - 'HttpResponse::setHeader' => ['bool', 'name'=>'string', 'value='=>'mixed', 'replace='=>'bool'], - 'HttpResponse::setLastModified' => ['bool', 'timestamp'=>'int'], - 'HttpResponse::setStream' => ['bool', 'stream'=>'resource'], - 'HttpResponse::setThrottleDelay' => ['bool', 'seconds'=>'float'], - 'HttpResponse::status' => ['bool', 'status'=>'int'], - 'HttpUtil::buildCookie' => ['', 'cookie_array'=>''], - 'HttpUtil::buildStr' => ['', 'query'=>'', 'prefix'=>'', 'arg_sep'=>''], - 'HttpUtil::buildUrl' => ['', 'url'=>'', 'parts'=>'', 'flags'=>'', '&composed'=>''], - 'HttpUtil::chunkedDecode' => ['', 'encoded_string'=>''], - 'HttpUtil::date' => ['', 'timestamp'=>''], - 'HttpUtil::deflate' => ['', 'plain'=>'', 'flags'=>''], - 'HttpUtil::inflate' => ['', 'encoded'=>''], - 'HttpUtil::matchEtag' => ['', 'plain_etag'=>'', 'for_range'=>''], - 'HttpUtil::matchModified' => ['', 'last_modified'=>'', 'for_range'=>''], - 'HttpUtil::matchRequestHeader' => ['', 'header_name'=>'', 'header_value'=>'', 'case_sensitive'=>''], - 'HttpUtil::negotiateCharset' => ['', 'supported'=>'', '&result'=>''], - 'HttpUtil::negotiateContentType' => ['', 'supported'=>'', '&result'=>''], - 'HttpUtil::negotiateLanguage' => ['', 'supported'=>'', '&result'=>''], - 'HttpUtil::parseCookie' => ['', 'cookie_string'=>''], - 'HttpUtil::parseHeaders' => ['', 'headers_string'=>''], - 'HttpUtil::parseMessage' => ['', 'message_string'=>''], - 'HttpUtil::parseParams' => ['', 'param_string'=>'', 'flags'=>''], - 'HttpUtil::support' => ['', 'feature'=>''], - 'Imagick::__construct' => ['void', 'files='=>'string|string[]'], - 'Imagick::__toString' => ['string'], - 'Imagick::adaptiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], - 'Imagick::adaptiveResizeImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool'], - 'Imagick::adaptiveSharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], - 'Imagick::adaptiveThresholdImage' => ['bool', 'width'=>'int', 'height'=>'int', 'offset'=>'int'], - 'Imagick::addImage' => ['bool', 'source'=>'Imagick'], - 'Imagick::addNoiseImage' => ['bool', 'noise_type'=>'int', 'channel='=>'int'], - 'Imagick::affineTransformImage' => ['bool', 'matrix'=>'ImagickDraw'], - 'Imagick::animateImages' => ['bool', 'x_server'=>'string'], - 'Imagick::annotateImage' => ['bool', 'draw_settings'=>'ImagickDraw', 'x'=>'float', 'y'=>'float', 'angle'=>'float', 'text'=>'string'], - 'Imagick::appendImages' => ['Imagick', 'stack'=>'bool'], - 'Imagick::autoGammaImage' => ['bool', 'channel='=>'int'], - 'Imagick::autoLevelImage' => ['void', 'CHANNEL='=>'string'], - 'Imagick::autoOrient' => ['bool'], - 'Imagick::averageImages' => ['Imagick'], - 'Imagick::blackThresholdImage' => ['bool', 'threshold'=>'mixed'], - 'Imagick::blueShiftImage' => ['void', 'factor='=>'float'], - 'Imagick::blurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], - 'Imagick::borderImage' => ['bool', 'bordercolor'=>'mixed', 'width'=>'int', 'height'=>'int'], - 'Imagick::brightnessContrastImage' => ['void', 'brightness'=>'string', 'contrast'=>'string', 'CHANNEL='=>'string'], - 'Imagick::charcoalImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'], - 'Imagick::chopImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], - 'Imagick::clampImage' => ['void', 'CHANNEL='=>'string'], - 'Imagick::clear' => ['bool'], - 'Imagick::clipImage' => ['bool'], - 'Imagick::clipImagePath' => ['void', 'pathname'=>'string', 'inside'=>'string'], - 'Imagick::clipPathImage' => ['bool', 'pathname'=>'string', 'inside'=>'bool'], - 'Imagick::clone' => ['Imagick'], - 'Imagick::clutImage' => ['bool', 'lookup_table'=>'Imagick', 'channel='=>'float'], - 'Imagick::coalesceImages' => ['Imagick'], - 'Imagick::colorFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'], - 'Imagick::colorMatrixImage' => ['void', 'color_matrix'=>'string'], - 'Imagick::colorizeImage' => ['bool', 'colorize'=>'mixed', 'opacity'=>'mixed'], - 'Imagick::combineImages' => ['Imagick', 'channeltype'=>'int'], - 'Imagick::commentImage' => ['bool', 'comment'=>'string'], - 'Imagick::compareImageChannels' => ['array{Imagick, float}', 'image'=>'Imagick', 'channeltype'=>'int', 'metrictype'=>'int'], - 'Imagick::compareImageLayers' => ['Imagick', 'method'=>'int'], - 'Imagick::compareImages' => ['array{Imagick, float}', 'compare'=>'Imagick', 'metric'=>'int'], - 'Imagick::compositeImage' => ['bool', 'composite_object'=>'Imagick', 'composite'=>'int', 'x'=>'int', 'y'=>'int', 'channel='=>'int'], - 'Imagick::compositeImageGravity' => ['bool', 'Imagick'=>'Imagick', 'COMPOSITE_CONSTANT'=>'int', 'GRAVITY_CONSTANT'=>'int'], - 'Imagick::contrastImage' => ['bool', 'sharpen'=>'bool'], - 'Imagick::contrastStretchImage' => ['bool', 'black_point'=>'float', 'white_point'=>'float', 'channel='=>'int'], - 'Imagick::convolveImage' => ['bool', 'kernel'=>'array', 'channel='=>'int'], - 'Imagick::count' => ['void', 'mode='=>'string'], - 'Imagick::cropImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], - 'Imagick::cropThumbnailImage' => ['bool', 'width'=>'int', 'height'=>'int', 'legacy='=>'bool'], - 'Imagick::current' => ['Imagick'], - 'Imagick::cycleColormapImage' => ['bool', 'displace'=>'int'], - 'Imagick::decipherImage' => ['bool', 'passphrase'=>'string'], - 'Imagick::deconstructImages' => ['Imagick'], - 'Imagick::deleteImageArtifact' => ['bool', 'artifact'=>'string'], - 'Imagick::deleteImageProperty' => ['void', 'name'=>'string'], - 'Imagick::deskewImage' => ['bool', 'threshold'=>'float'], - 'Imagick::despeckleImage' => ['bool'], - 'Imagick::destroy' => ['bool'], - 'Imagick::displayImage' => ['bool', 'servername'=>'string'], - 'Imagick::displayImages' => ['bool', 'servername'=>'string'], - 'Imagick::distortImage' => ['bool', 'method'=>'int', 'arguments'=>'array', 'bestfit'=>'bool'], - 'Imagick::drawImage' => ['bool', 'draw'=>'ImagickDraw'], - 'Imagick::edgeImage' => ['bool', 'radius'=>'float'], - 'Imagick::embossImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'], - 'Imagick::encipherImage' => ['bool', 'passphrase'=>'string'], - 'Imagick::enhanceImage' => ['bool'], - 'Imagick::equalizeImage' => ['bool'], - 'Imagick::evaluateImage' => ['bool', 'op'=>'int', 'constant'=>'float', 'channel='=>'int'], - 'Imagick::evaluateImages' => ['bool', 'EVALUATE_CONSTANT'=>'int'], - 'Imagick::exportImagePixels' => ['list', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int'], - 'Imagick::extentImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], - 'Imagick::filter' => ['void', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'int'], - 'Imagick::flattenImages' => ['Imagick'], - 'Imagick::flipImage' => ['bool'], - 'Imagick::floodFillPaintImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'target'=>'mixed', 'x'=>'int', 'y'=>'int', 'invert'=>'bool', 'channel='=>'int'], - 'Imagick::flopImage' => ['bool'], - 'Imagick::forwardFourierTransformimage' => ['void', 'magnitude'=>'bool'], - 'Imagick::frameImage' => ['bool', 'matte_color'=>'mixed', 'width'=>'int', 'height'=>'int', 'inner_bevel'=>'int', 'outer_bevel'=>'int'], - 'Imagick::functionImage' => ['bool', 'function'=>'int', 'arguments'=>'array', 'channel='=>'int'], - 'Imagick::fxImage' => ['Imagick', 'expression'=>'string', 'channel='=>'int'], - 'Imagick::gammaImage' => ['bool', 'gamma'=>'float', 'channel='=>'int'], - 'Imagick::gaussianBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], - 'Imagick::getColorspace' => ['int'], - 'Imagick::getCompression' => ['int'], - 'Imagick::getCompressionQuality' => ['int'], - 'Imagick::getConfigureOptions' => ['string'], - 'Imagick::getCopyright' => ['string'], - 'Imagick::getFeatures' => ['string'], - 'Imagick::getFilename' => ['string'], - 'Imagick::getFont' => ['string|false'], - 'Imagick::getFormat' => ['string'], - 'Imagick::getGravity' => ['int'], - 'Imagick::getHDRIEnabled' => ['int'], - 'Imagick::getHomeURL' => ['string'], - 'Imagick::getImage' => ['Imagick'], - 'Imagick::getImageAlphaChannel' => ['int'], - 'Imagick::getImageArtifact' => ['string', 'artifact'=>'string'], - 'Imagick::getImageAttribute' => ['string', 'key'=>'string'], - 'Imagick::getImageBackgroundColor' => ['ImagickPixel'], - 'Imagick::getImageBlob' => ['string'], - 'Imagick::getImageBluePrimary' => ['array{x:float, y:float}'], - 'Imagick::getImageBorderColor' => ['ImagickPixel'], - 'Imagick::getImageChannelDepth' => ['int', 'channel'=>'int'], - 'Imagick::getImageChannelDistortion' => ['float', 'reference'=>'Imagick', 'channel'=>'int', 'metric'=>'int'], - 'Imagick::getImageChannelDistortions' => ['float', 'reference'=>'Imagick', 'metric'=>'int', 'channel='=>'int'], - 'Imagick::getImageChannelExtrema' => ['array{minima:int, maxima:int}', 'channel'=>'int'], - 'Imagick::getImageChannelKurtosis' => ['array{kurtosis:float, skewness:float}', 'channel='=>'int'], - 'Imagick::getImageChannelMean' => ['array{mean:float, standardDeviation:float}', 'channel'=>'int'], - 'Imagick::getImageChannelRange' => ['array{minima:float, maxima:float}', 'channel'=>'int'], - 'Imagick::getImageChannelStatistics' => ['array'], - 'Imagick::getImageClipMask' => ['Imagick'], - 'Imagick::getImageColormapColor' => ['ImagickPixel', 'index'=>'int'], - 'Imagick::getImageColors' => ['int'], - 'Imagick::getImageColorspace' => ['int'], - 'Imagick::getImageCompose' => ['int'], - 'Imagick::getImageCompression' => ['int'], - 'Imagick::getImageCompressionQuality' => ['int'], - 'Imagick::getImageDelay' => ['int'], - 'Imagick::getImageDepth' => ['int'], - 'Imagick::getImageDispose' => ['int'], - 'Imagick::getImageDistortion' => ['float', 'reference'=>'magickwand', 'metric'=>'int'], - 'Imagick::getImageExtrema' => ['array{min:int, max:int}'], - 'Imagick::getImageFilename' => ['string'], - 'Imagick::getImageFormat' => ['string'], - 'Imagick::getImageGamma' => ['float'], - 'Imagick::getImageGeometry' => ['array{width:int, height:int}'], - 'Imagick::getImageGravity' => ['int'], - 'Imagick::getImageGreenPrimary' => ['array{x:float, y:float}'], - 'Imagick::getImageHeight' => ['int'], - 'Imagick::getImageHistogram' => ['list'], - 'Imagick::getImageIndex' => ['int'], - 'Imagick::getImageInterlaceScheme' => ['int'], - 'Imagick::getImageInterpolateMethod' => ['int'], - 'Imagick::getImageIterations' => ['int'], - 'Imagick::getImageLength' => ['int'], - 'Imagick::getImageMagickLicense' => ['string'], - 'Imagick::getImageMatte' => ['bool'], - 'Imagick::getImageMatteColor' => ['ImagickPixel'], - 'Imagick::getImageMimeType' => ['string'], - 'Imagick::getImageOrientation' => ['int'], - 'Imagick::getImagePage' => ['array{width:int, height:int, x:int, y:int}'], - 'Imagick::getImagePixelColor' => ['ImagickPixel', 'x'=>'int', 'y'=>'int'], - 'Imagick::getImageProfile' => ['string', 'name'=>'string'], - 'Imagick::getImageProfiles' => ['array', 'pattern='=>'string', 'only_names='=>'bool'], - 'Imagick::getImageProperties' => ['array', 'pattern='=>'string', 'only_names='=>'bool'], - 'Imagick::getImageProperty' => ['string|false', 'name'=>'string'], - 'Imagick::getImageRedPrimary' => ['array{x:float, y:float}'], - 'Imagick::getImageRegion' => ['Imagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], - 'Imagick::getImageRenderingIntent' => ['int'], - 'Imagick::getImageResolution' => ['array{x:float, y:float}'], - 'Imagick::getImageScene' => ['int'], - 'Imagick::getImageSignature' => ['string'], - 'Imagick::getImageSize' => ['int'], - 'Imagick::getImageTicksPerSecond' => ['int'], - 'Imagick::getImageTotalInkDensity' => ['float'], - 'Imagick::getImageType' => ['int'], - 'Imagick::getImageUnits' => ['int'], - 'Imagick::getImageVirtualPixelMethod' => ['int'], - 'Imagick::getImageWhitePoint' => ['array{x:float, y:float}'], - 'Imagick::getImageWidth' => ['int'], - 'Imagick::getImagesBlob' => ['string'], - 'Imagick::getInterlaceScheme' => ['int'], - 'Imagick::getIteratorIndex' => ['int'], - 'Imagick::getNumberImages' => ['int'], - 'Imagick::getOption' => ['string', 'key'=>'string'], - 'Imagick::getPackageName' => ['string'], - 'Imagick::getPage' => ['array{width:int, height:int, x:int, y:int}'], - 'Imagick::getPixelIterator' => ['ImagickPixelIterator'], - 'Imagick::getPixelRegionIterator' => ['ImagickPixelIterator', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'], - 'Imagick::getPointSize' => ['float'], - 'Imagick::getQuantum' => ['int'], - 'Imagick::getQuantumDepth' => ['array{quantumDepthLong:int, quantumDepthString:string}'], - 'Imagick::getQuantumRange' => ['array{quantumRangeLong:int, quantumRangeString:string}'], - 'Imagick::getRegistry' => ['string|false', 'key'=>'string'], - 'Imagick::getReleaseDate' => ['string'], - 'Imagick::getResource' => ['int', 'type'=>'int'], - 'Imagick::getResourceLimit' => ['int', 'type'=>'int'], - 'Imagick::getSamplingFactors' => ['array'], - 'Imagick::getSize' => ['array{columns:int, rows: int}'], - 'Imagick::getSizeOffset' => ['int'], - 'Imagick::getVersion' => ['array{versionNumber: int, versionString:string}'], - 'Imagick::haldClutImage' => ['bool', 'clut'=>'Imagick', 'channel='=>'int'], - 'Imagick::hasNextImage' => ['bool'], - 'Imagick::hasPreviousImage' => ['bool'], - 'Imagick::identifyFormat' => ['string|false', 'embedText'=>'string'], - 'Imagick::identifyImage' => ['array', 'appendrawoutput='=>'bool'], - 'Imagick::identifyImageType' => ['int'], - 'Imagick::implodeImage' => ['bool', 'radius'=>'float'], - 'Imagick::importImagePixels' => ['bool', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int', 'pixels'=>'list'], - 'Imagick::inverseFourierTransformImage' => ['void', 'complement'=>'string', 'magnitude'=>'string'], - 'Imagick::key' => ['int|string'], - 'Imagick::labelImage' => ['bool', 'label'=>'string'], - 'Imagick::levelImage' => ['bool', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'int'], - 'Imagick::linearStretchImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float'], - 'Imagick::liquidRescaleImage' => ['bool', 'width'=>'int', 'height'=>'int', 'delta_x'=>'float', 'rigidity'=>'float'], - 'Imagick::listRegistry' => ['array'], - 'Imagick::localContrastImage' => ['bool', 'radius'=>'float', 'strength'=>'float'], - 'Imagick::magnifyImage' => ['bool'], - 'Imagick::mapImage' => ['bool', 'map'=>'Imagick', 'dither'=>'bool'], - 'Imagick::matteFloodfillImage' => ['bool', 'alpha'=>'float', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'], - 'Imagick::medianFilterImage' => ['bool', 'radius'=>'float'], - 'Imagick::mergeImageLayers' => ['Imagick', 'layer_method'=>'int'], - 'Imagick::minifyImage' => ['bool'], - 'Imagick::modulateImage' => ['bool', 'brightness'=>'float', 'saturation'=>'float', 'hue'=>'float'], - 'Imagick::montageImage' => ['Imagick', 'draw'=>'ImagickDraw', 'tile_geometry'=>'string', 'thumbnail_geometry'=>'string', 'mode'=>'int', 'frame'=>'string'], - 'Imagick::morphImages' => ['Imagick', 'number_frames'=>'int'], - 'Imagick::morphology' => ['void', 'morphologyMethod'=>'int', 'iterations'=>'int', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'string'], - 'Imagick::mosaicImages' => ['Imagick'], - 'Imagick::motionBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float', 'channel='=>'int'], - 'Imagick::negateImage' => ['bool', 'gray'=>'bool', 'channel='=>'int'], - 'Imagick::newImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'background'=>'mixed', 'format='=>'string'], - 'Imagick::newPseudoImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'pseudostring'=>'string'], - 'Imagick::next' => ['void'], - 'Imagick::nextImage' => ['bool'], - 'Imagick::normalizeImage' => ['bool', 'channel='=>'int'], - 'Imagick::oilPaintImage' => ['bool', 'radius'=>'float'], - 'Imagick::opaquePaintImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'invert'=>'bool', 'channel='=>'int'], - 'Imagick::optimizeImageLayers' => ['bool'], - 'Imagick::orderedPosterizeImage' => ['bool', 'threshold_map'=>'string', 'channel='=>'int'], - 'Imagick::paintFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int', 'channel='=>'int'], - 'Imagick::paintOpaqueImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'channel='=>'int'], - 'Imagick::paintTransparentImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float'], - 'Imagick::pingImage' => ['bool', 'filename'=>'string'], - 'Imagick::pingImageBlob' => ['bool', 'image'=>'string'], - 'Imagick::pingImageFile' => ['bool', 'filehandle'=>'resource', 'filename='=>'string'], - 'Imagick::polaroidImage' => ['bool', 'properties'=>'ImagickDraw', 'angle'=>'float'], - 'Imagick::posterizeImage' => ['bool', 'levels'=>'int', 'dither'=>'bool'], - 'Imagick::previewImages' => ['bool', 'preview'=>'int'], - 'Imagick::previousImage' => ['bool'], - 'Imagick::profileImage' => ['bool', 'name'=>'string', 'profile'=>'string'], - 'Imagick::quantizeImage' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], - 'Imagick::quantizeImages' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'], - 'Imagick::queryFontMetrics' => ['array', 'properties'=>'ImagickDraw', 'text'=>'string', 'multiline='=>'bool'], - 'Imagick::queryFonts' => ['array', 'pattern='=>'string'], - 'Imagick::queryFormats' => ['list', 'pattern='=>'string'], - 'Imagick::radialBlurImage' => ['bool', 'angle'=>'float', 'channel='=>'int'], - 'Imagick::raiseImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int', 'raise'=>'bool'], - 'Imagick::randomThresholdImage' => ['bool', 'low'=>'float', 'high'=>'float', 'channel='=>'int'], - 'Imagick::readImage' => ['bool', 'filename'=>'string'], - 'Imagick::readImageBlob' => ['bool', 'image'=>'string', 'filename='=>'string'], - 'Imagick::readImageFile' => ['bool', 'filehandle'=>'resource', 'filename='=>'string'], - 'Imagick::readImages' => ['Imagick', 'filenames'=>'string'], - 'Imagick::recolorImage' => ['bool', 'matrix'=>'list'], - 'Imagick::reduceNoiseImage' => ['bool', 'radius'=>'float'], - 'Imagick::remapImage' => ['bool', 'replacement'=>'Imagick', 'dither'=>'int'], - 'Imagick::removeImage' => ['bool'], - 'Imagick::removeImageProfile' => ['string', 'name'=>'string'], - 'Imagick::render' => ['bool'], - 'Imagick::resampleImage' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float', 'filter'=>'int', 'blur'=>'float'], - 'Imagick::resetImagePage' => ['bool', 'page'=>'string'], - 'Imagick::resetIterator' => [''], - 'Imagick::resizeImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'filter'=>'int', 'blur'=>'float', 'bestfit='=>'bool'], - 'Imagick::rewind' => ['void'], - 'Imagick::rollImage' => ['bool', 'x'=>'int', 'y'=>'int'], - 'Imagick::rotateImage' => ['bool', 'background'=>'mixed', 'degrees'=>'float'], - 'Imagick::rotationalBlurImage' => ['void', 'angle'=>'string', 'CHANNEL='=>'string'], - 'Imagick::roundCorners' => ['bool', 'x_rounding'=>'float', 'y_rounding'=>'float', 'stroke_width='=>'float', 'displace='=>'float', 'size_correction='=>'float'], - 'Imagick::roundCornersImage' => ['', 'xRounding'=>'', 'yRounding'=>'', 'strokeWidth'=>'', 'displace'=>'', 'sizeCorrection'=>''], - 'Imagick::sampleImage' => ['bool', 'columns'=>'int', 'rows'=>'int'], - 'Imagick::scaleImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'bestfit='=>'bool'], - 'Imagick::segmentImage' => ['bool', 'colorspace'=>'int', 'cluster_threshold'=>'float', 'smooth_threshold'=>'float', 'verbose='=>'bool'], - 'Imagick::selectiveBlurImage' => ['void', 'radius'=>'float', 'sigma'=>'float', 'threshold'=>'float', 'CHANNEL'=>'int'], - 'Imagick::separateImageChannel' => ['bool', 'channel'=>'int'], - 'Imagick::sepiaToneImage' => ['bool', 'threshold'=>'float'], - 'Imagick::setAntiAlias' => ['int', 'antialias'=>'bool'], - 'Imagick::setBackgroundColor' => ['bool', 'background'=>'mixed'], - 'Imagick::setColorspace' => ['bool', 'colorspace'=>'int'], - 'Imagick::setCompression' => ['bool', 'compression'=>'int'], - 'Imagick::setCompressionQuality' => ['bool', 'quality'=>'int'], - 'Imagick::setFilename' => ['bool', 'filename'=>'string'], - 'Imagick::setFirstIterator' => ['bool'], - 'Imagick::setFont' => ['bool', 'font'=>'string'], - 'Imagick::setFormat' => ['bool', 'format'=>'string'], - 'Imagick::setGravity' => ['bool', 'gravity'=>'int'], - 'Imagick::setImage' => ['bool', 'replace'=>'Imagick'], - 'Imagick::setImageAlpha' => ['bool', 'alpha'=>'float'], - 'Imagick::setImageAlphaChannel' => ['bool', 'mode'=>'int'], - 'Imagick::setImageArtifact' => ['bool', 'artifact'=>'string', 'value'=>'string'], - 'Imagick::setImageAttribute' => ['void', 'key'=>'string', 'value'=>'string'], - 'Imagick::setImageBackgroundColor' => ['bool', 'background'=>'mixed'], - 'Imagick::setImageBias' => ['bool', 'bias'=>'float'], - 'Imagick::setImageBiasQuantum' => ['void', 'bias'=>'string'], - 'Imagick::setImageBluePrimary' => ['bool', 'x'=>'float', 'y'=>'float'], - 'Imagick::setImageBorderColor' => ['bool', 'border'=>'mixed'], - 'Imagick::setImageChannelDepth' => ['bool', 'channel'=>'int', 'depth'=>'int'], - 'Imagick::setImageChannelMask' => ['', 'channel'=>'int'], - 'Imagick::setImageClipMask' => ['bool', 'clip_mask'=>'Imagick'], - 'Imagick::setImageColormapColor' => ['bool', 'index'=>'int', 'color'=>'ImagickPixel'], - 'Imagick::setImageColorspace' => ['bool', 'colorspace'=>'int'], - 'Imagick::setImageCompose' => ['bool', 'compose'=>'int'], - 'Imagick::setImageCompression' => ['bool', 'compression'=>'int'], - 'Imagick::setImageCompressionQuality' => ['bool', 'quality'=>'int'], - 'Imagick::setImageDelay' => ['bool', 'delay'=>'int'], - 'Imagick::setImageDepth' => ['bool', 'depth'=>'int'], - 'Imagick::setImageDispose' => ['bool', 'dispose'=>'int'], - 'Imagick::setImageExtent' => ['bool', 'columns'=>'int', 'rows'=>'int'], - 'Imagick::setImageFilename' => ['bool', 'filename'=>'string'], - 'Imagick::setImageFormat' => ['bool', 'format'=>'string'], - 'Imagick::setImageGamma' => ['bool', 'gamma'=>'float'], - 'Imagick::setImageGravity' => ['bool', 'gravity'=>'int'], - 'Imagick::setImageGreenPrimary' => ['bool', 'x'=>'float', 'y'=>'float'], - 'Imagick::setImageIndex' => ['bool', 'index'=>'int'], - 'Imagick::setImageInterlaceScheme' => ['bool', 'interlace_scheme'=>'int'], - 'Imagick::setImageInterpolateMethod' => ['bool', 'method'=>'int'], - 'Imagick::setImageIterations' => ['bool', 'iterations'=>'int'], - 'Imagick::setImageMatte' => ['bool', 'matte'=>'bool'], - 'Imagick::setImageMatteColor' => ['bool', 'matte'=>'mixed'], - 'Imagick::setImageOpacity' => ['bool', 'opacity'=>'float'], - 'Imagick::setImageOrientation' => ['bool', 'orientation'=>'int'], - 'Imagick::setImagePage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], - 'Imagick::setImageProfile' => ['bool', 'name'=>'string', 'profile'=>'string'], - 'Imagick::setImageProgressMonitor' => ['', 'filename'=>''], - 'Imagick::setImageProperty' => ['bool', 'name'=>'string', 'value'=>'string'], - 'Imagick::setImageRedPrimary' => ['bool', 'x'=>'float', 'y'=>'float'], - 'Imagick::setImageRenderingIntent' => ['bool', 'rendering_intent'=>'int'], - 'Imagick::setImageResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'], - 'Imagick::setImageScene' => ['bool', 'scene'=>'int'], - 'Imagick::setImageTicksPerSecond' => ['bool', 'ticks_per_second'=>'int'], - 'Imagick::setImageType' => ['bool', 'image_type'=>'int'], - 'Imagick::setImageUnits' => ['bool', 'units'=>'int'], - 'Imagick::setImageVirtualPixelMethod' => ['bool', 'method'=>'int'], - 'Imagick::setImageWhitePoint' => ['bool', 'x'=>'float', 'y'=>'float'], - 'Imagick::setInterlaceScheme' => ['bool', 'interlace_scheme'=>'int'], - 'Imagick::setIteratorIndex' => ['bool', 'index'=>'int'], - 'Imagick::setLastIterator' => ['bool'], - 'Imagick::setOption' => ['bool', 'key'=>'string', 'value'=>'string'], - 'Imagick::setPage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], - 'Imagick::setPointSize' => ['bool', 'point_size'=>'float'], - 'Imagick::setProgressMonitor' => ['void', 'callback'=>'callable'], - 'Imagick::setRegistry' => ['void', 'key'=>'string', 'value'=>'string'], - 'Imagick::setResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'], - 'Imagick::setResourceLimit' => ['bool', 'type'=>'int', 'limit'=>'int'], - 'Imagick::setSamplingFactors' => ['bool', 'factors'=>'list'], - 'Imagick::setSize' => ['bool', 'columns'=>'int', 'rows'=>'int'], - 'Imagick::setSizeOffset' => ['bool', 'columns'=>'int', 'rows'=>'int', 'offset'=>'int'], - 'Imagick::setType' => ['bool', 'image_type'=>'int'], - 'Imagick::shadeImage' => ['bool', 'gray'=>'bool', 'azimuth'=>'float', 'elevation'=>'float'], - 'Imagick::shadowImage' => ['bool', 'opacity'=>'float', 'sigma'=>'float', 'x'=>'int', 'y'=>'int'], - 'Imagick::sharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'], - 'Imagick::shaveImage' => ['bool', 'columns'=>'int', 'rows'=>'int'], - 'Imagick::shearImage' => ['bool', 'background'=>'mixed', 'x_shear'=>'float', 'y_shear'=>'float'], - 'Imagick::sigmoidalContrastImage' => ['bool', 'sharpen'=>'bool', 'alpha'=>'float', 'beta'=>'float', 'channel='=>'int'], - 'Imagick::similarityImage' => ['Imagick', 'Imagick'=>'Imagick', '&bestMatch'=>'array', '&similarity'=>'float', 'similarity_threshold'=>'float', 'metric'=>'int'], - 'Imagick::sketchImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float'], - 'Imagick::smushImages' => ['Imagick', 'stack'=>'string', 'offset'=>'string'], - 'Imagick::solarizeImage' => ['bool', 'threshold'=>'int'], - 'Imagick::sparseColorImage' => ['bool', 'sparse_method'=>'int', 'arguments'=>'array', 'channel='=>'int'], - 'Imagick::spliceImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], - 'Imagick::spreadImage' => ['bool', 'radius'=>'float'], - 'Imagick::statisticImage' => ['void', 'type'=>'int', 'width'=>'int', 'height'=>'int', 'CHANNEL='=>'string'], - 'Imagick::steganoImage' => ['Imagick', 'watermark_wand'=>'Imagick', 'offset'=>'int'], - 'Imagick::stereoImage' => ['bool', 'offset_wand'=>'Imagick'], - 'Imagick::stripImage' => ['bool'], - 'Imagick::subImageMatch' => ['Imagick', 'Imagick'=>'Imagick', '&w_offset='=>'array', '&w_similarity='=>'float'], - 'Imagick::swirlImage' => ['bool', 'degrees'=>'float'], - 'Imagick::textureImage' => ['bool', 'texture_wand'=>'Imagick'], - 'Imagick::thresholdImage' => ['bool', 'threshold'=>'float', 'channel='=>'int'], - 'Imagick::thumbnailImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool', 'fill='=>'bool', 'legacy='=>'bool'], - 'Imagick::tintImage' => ['bool', 'tint'=>'mixed', 'opacity'=>'mixed'], - 'Imagick::transformImage' => ['Imagick', 'crop'=>'string', 'geometry'=>'string'], - 'Imagick::transformImageColorspace' => ['bool', 'colorspace'=>'int'], - 'Imagick::transparentPaintImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float', 'invert'=>'bool'], - 'Imagick::transposeImage' => ['bool'], - 'Imagick::transverseImage' => ['bool'], - 'Imagick::trimImage' => ['bool', 'fuzz'=>'float'], - 'Imagick::uniqueImageColors' => ['bool'], - 'Imagick::unsharpMaskImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'amount'=>'float', 'threshold'=>'float', 'channel='=>'int'], - 'Imagick::valid' => ['bool'], - 'Imagick::vignetteImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float', 'x'=>'int', 'y'=>'int'], - 'Imagick::waveImage' => ['bool', 'amplitude'=>'float', 'length'=>'float'], - 'Imagick::whiteThresholdImage' => ['bool', 'threshold'=>'mixed'], - 'Imagick::writeImage' => ['bool', 'filename='=>'string'], - 'Imagick::writeImageFile' => ['bool', 'filehandle'=>'resource'], - 'Imagick::writeImages' => ['bool', 'filename'=>'string', 'adjoin'=>'bool'], - 'Imagick::writeImagesFile' => ['bool', 'filehandle'=>'resource'], - 'ImagickDraw::__construct' => ['void'], - 'ImagickDraw::affine' => ['bool', 'affine'=>'array'], - 'ImagickDraw::annotation' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'], - 'ImagickDraw::arc' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float', 'sd'=>'float', 'ed'=>'float'], - 'ImagickDraw::bezier' => ['bool', 'coordinates'=>'list'], - 'ImagickDraw::circle' => ['bool', 'ox'=>'float', 'oy'=>'float', 'px'=>'float', 'py'=>'float'], - 'ImagickDraw::clear' => ['bool'], - 'ImagickDraw::clone' => ['ImagickDraw'], - 'ImagickDraw::color' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'], - 'ImagickDraw::comment' => ['bool', 'comment'=>'string'], - 'ImagickDraw::composite' => ['bool', 'compose'=>'int', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float', 'compositewand'=>'Imagick'], - 'ImagickDraw::destroy' => ['bool'], - 'ImagickDraw::ellipse' => ['bool', 'ox'=>'float', 'oy'=>'float', 'rx'=>'float', 'ry'=>'float', 'start'=>'float', 'end'=>'float'], - 'ImagickDraw::getBorderColor' => ['ImagickPixel'], - 'ImagickDraw::getClipPath' => ['string|false'], - 'ImagickDraw::getClipRule' => ['int'], - 'ImagickDraw::getClipUnits' => ['int'], - 'ImagickDraw::getDensity' => ['?string'], - 'ImagickDraw::getFillColor' => ['ImagickPixel'], - 'ImagickDraw::getFillOpacity' => ['float'], - 'ImagickDraw::getFillRule' => ['int'], - 'ImagickDraw::getFont' => ['string|false'], - 'ImagickDraw::getFontFamily' => ['string|false'], - 'ImagickDraw::getFontResolution' => ['array'], - 'ImagickDraw::getFontSize' => ['float'], - 'ImagickDraw::getFontStretch' => ['int'], - 'ImagickDraw::getFontStyle' => ['int'], - 'ImagickDraw::getFontWeight' => ['int'], - 'ImagickDraw::getGravity' => ['int'], - 'ImagickDraw::getOpacity' => ['float'], - 'ImagickDraw::getStrokeAntialias' => ['bool'], - 'ImagickDraw::getStrokeColor' => ['ImagickPixel'], - 'ImagickDraw::getStrokeDashArray' => ['array'], - 'ImagickDraw::getStrokeDashOffset' => ['float'], - 'ImagickDraw::getStrokeLineCap' => ['int'], - 'ImagickDraw::getStrokeLineJoin' => ['int'], - 'ImagickDraw::getStrokeMiterLimit' => ['int'], - 'ImagickDraw::getStrokeOpacity' => ['float'], - 'ImagickDraw::getStrokeWidth' => ['float'], - 'ImagickDraw::getTextAlignment' => ['int'], - 'ImagickDraw::getTextAntialias' => ['bool'], - 'ImagickDraw::getTextDecoration' => ['int'], - 'ImagickDraw::getTextDirection' => ['bool'], - 'ImagickDraw::getTextEncoding' => ['string'], - 'ImagickDraw::getTextInterlineSpacing' => ['float'], - 'ImagickDraw::getTextInterwordSpacing' => ['float'], - 'ImagickDraw::getTextKerning' => ['float'], - 'ImagickDraw::getTextUnderColor' => ['ImagickPixel'], - 'ImagickDraw::getVectorGraphics' => ['string'], - 'ImagickDraw::line' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float'], - 'ImagickDraw::matte' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'], - 'ImagickDraw::pathClose' => ['bool'], - 'ImagickDraw::pathCurveToAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathCurveToQuadraticBezierAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathCurveToQuadraticBezierRelative' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathCurveToQuadraticBezierSmoothRelative' => ['bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathCurveToRelative' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathCurveToSmoothAbsolute' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathCurveToSmoothRelative' => ['bool', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathEllipticArcAbsolute' => ['bool', 'rx'=>'float', 'ry'=>'float', 'x_axis_rotation'=>'float', 'large_arc_flag'=>'bool', 'sweep_flag'=>'bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathEllipticArcRelative' => ['bool', 'rx'=>'float', 'ry'=>'float', 'x_axis_rotation'=>'float', 'large_arc_flag'=>'bool', 'sweep_flag'=>'bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathFinish' => ['bool'], - 'ImagickDraw::pathLineToAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathLineToHorizontalAbsolute' => ['bool', 'x'=>'float'], - 'ImagickDraw::pathLineToHorizontalRelative' => ['bool', 'x'=>'float'], - 'ImagickDraw::pathLineToRelative' => ['bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathLineToVerticalAbsolute' => ['bool', 'y'=>'float'], - 'ImagickDraw::pathLineToVerticalRelative' => ['bool', 'y'=>'float'], - 'ImagickDraw::pathMoveToAbsolute' => ['bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathMoveToRelative' => ['bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::pathStart' => ['bool'], - 'ImagickDraw::point' => ['bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::polygon' => ['bool', 'coordinates'=>'list'], - 'ImagickDraw::polyline' => ['bool', 'coordinates'=>'list'], - 'ImagickDraw::pop' => ['bool'], - 'ImagickDraw::popClipPath' => ['bool'], - 'ImagickDraw::popDefs' => ['bool'], - 'ImagickDraw::popPattern' => ['bool'], - 'ImagickDraw::push' => ['bool'], - 'ImagickDraw::pushClipPath' => ['bool', 'clip_mask_id'=>'string'], - 'ImagickDraw::pushDefs' => ['bool'], - 'ImagickDraw::pushPattern' => ['bool', 'pattern_id'=>'string', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], - 'ImagickDraw::rectangle' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], - 'ImagickDraw::render' => ['bool'], - 'ImagickDraw::resetVectorGraphics' => ['void'], - 'ImagickDraw::rotate' => ['bool', 'degrees'=>'float'], - 'ImagickDraw::roundRectangle' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'rx'=>'float', 'ry'=>'float'], - 'ImagickDraw::scale' => ['bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::setBorderColor' => ['bool', 'color'=>'ImagickPixel|string'], - 'ImagickDraw::setClipPath' => ['bool', 'clip_mask'=>'string'], - 'ImagickDraw::setClipRule' => ['bool', 'fill_rule'=>'int'], - 'ImagickDraw::setClipUnits' => ['bool', 'clip_units'=>'int'], - 'ImagickDraw::setDensity' => ['bool', 'density_string'=>'string'], - 'ImagickDraw::setFillAlpha' => ['bool', 'opacity'=>'float'], - 'ImagickDraw::setFillColor' => ['bool', 'fill_pixel'=>'ImagickPixel|string'], - 'ImagickDraw::setFillOpacity' => ['bool', 'fillopacity'=>'float'], - 'ImagickDraw::setFillPatternURL' => ['bool', 'fill_url'=>'string'], - 'ImagickDraw::setFillRule' => ['bool', 'fill_rule'=>'int'], - 'ImagickDraw::setFont' => ['bool', 'font_name'=>'string'], - 'ImagickDraw::setFontFamily' => ['bool', 'font_family'=>'string'], - 'ImagickDraw::setFontResolution' => ['bool', 'x'=>'float', 'y'=>'float'], - 'ImagickDraw::setFontSize' => ['bool', 'pointsize'=>'float'], - 'ImagickDraw::setFontStretch' => ['bool', 'fontstretch'=>'int'], - 'ImagickDraw::setFontStyle' => ['bool', 'style'=>'int'], - 'ImagickDraw::setFontWeight' => ['bool', 'font_weight'=>'int'], - 'ImagickDraw::setGravity' => ['bool', 'gravity'=>'int'], - 'ImagickDraw::setOpacity' => ['void', 'opacity'=>'float'], - 'ImagickDraw::setResolution' => ['void', 'x_resolution'=>'float', 'y_resolution'=>'float'], - 'ImagickDraw::setStrokeAlpha' => ['bool', 'opacity'=>'float'], - 'ImagickDraw::setStrokeAntialias' => ['bool', 'stroke_antialias'=>'bool'], - 'ImagickDraw::setStrokeColor' => ['bool', 'stroke_pixel'=>'ImagickPixel|string'], - 'ImagickDraw::setStrokeDashArray' => ['bool', 'dasharray'=>'list'], - 'ImagickDraw::setStrokeDashOffset' => ['bool', 'dash_offset'=>'float'], - 'ImagickDraw::setStrokeLineCap' => ['bool', 'linecap'=>'int'], - 'ImagickDraw::setStrokeLineJoin' => ['bool', 'linejoin'=>'int'], - 'ImagickDraw::setStrokeMiterLimit' => ['bool', 'miterlimit'=>'int'], - 'ImagickDraw::setStrokeOpacity' => ['bool', 'stroke_opacity'=>'float'], - 'ImagickDraw::setStrokePatternURL' => ['bool', 'stroke_url'=>'string'], - 'ImagickDraw::setStrokeWidth' => ['bool', 'stroke_width'=>'float'], - 'ImagickDraw::setTextAlignment' => ['bool', 'alignment'=>'int'], - 'ImagickDraw::setTextAntialias' => ['bool', 'antialias'=>'bool'], - 'ImagickDraw::setTextDecoration' => ['bool', 'decoration'=>'int'], - 'ImagickDraw::setTextDirection' => ['bool', 'direction'=>'int'], - 'ImagickDraw::setTextEncoding' => ['bool', 'encoding'=>'string'], - 'ImagickDraw::setTextInterlineSpacing' => ['void', 'spacing'=>'float'], - 'ImagickDraw::setTextInterwordSpacing' => ['void', 'spacing'=>'float'], - 'ImagickDraw::setTextKerning' => ['void', 'kerning'=>'float'], - 'ImagickDraw::setTextUnderColor' => ['bool', 'under_color'=>'ImagickPixel|string'], - 'ImagickDraw::setVectorGraphics' => ['bool', 'xml'=>'string'], - 'ImagickDraw::setViewbox' => ['bool', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int'], - 'ImagickDraw::skewX' => ['bool', 'degrees'=>'float'], - 'ImagickDraw::skewY' => ['bool', 'degrees'=>'float'], - 'ImagickDraw::translate' => ['bool', 'x'=>'float', 'y'=>'float'], - 'ImagickKernel::addKernel' => ['void', 'ImagickKernel'=>'ImagickKernel'], - 'ImagickKernel::addUnityKernel' => ['void'], - 'ImagickKernel::fromBuiltin' => ['ImagickKernel', 'kernelType'=>'string', 'kernelString'=>'string'], - 'ImagickKernel::fromMatrix' => ['ImagickKernel', 'matrix'=>'list>', 'origin='=>'array'], - 'ImagickKernel::getMatrix' => ['list>'], - 'ImagickKernel::scale' => ['void'], - 'ImagickKernel::separate' => ['ImagickKernel[]'], - 'ImagickKernel::seperate' => ['void'], - 'ImagickPixel::__construct' => ['void', 'color='=>'string'], - 'ImagickPixel::clear' => ['bool'], - 'ImagickPixel::clone' => ['void'], - 'ImagickPixel::destroy' => ['bool'], - 'ImagickPixel::getColor' => ['array{r: int|float, g: int|float, b: int|float, a: int|float}', 'normalized='=>'0|1|2'], - 'ImagickPixel::getColorAsString' => ['string'], - 'ImagickPixel::getColorCount' => ['int'], - 'ImagickPixel::getColorQuantum' => ['mixed'], - 'ImagickPixel::getColorValue' => ['float', 'color'=>'int'], - 'ImagickPixel::getColorValueQuantum' => ['mixed'], - 'ImagickPixel::getHSL' => ['array{hue: float, saturation: float, luminosity: float}'], - 'ImagickPixel::getIndex' => ['int'], - 'ImagickPixel::isPixelSimilar' => ['bool', 'color'=>'ImagickPixel', 'fuzz'=>'float'], - 'ImagickPixel::isPixelSimilarQuantum' => ['bool', 'color'=>'string', 'fuzz='=>'string'], - 'ImagickPixel::isSimilar' => ['bool', 'color'=>'ImagickPixel', 'fuzz'=>'float'], - 'ImagickPixel::setColor' => ['bool', 'color'=>'string'], - 'ImagickPixel::setColorFromPixel' => ['bool', 'srcPixel'=>'ImagickPixel'], - 'ImagickPixel::setColorValue' => ['bool', 'color'=>'int', 'value'=>'float'], - 'ImagickPixel::setColorValueQuantum' => ['void', 'color'=>'int', 'value'=>'mixed'], - 'ImagickPixel::setHSL' => ['bool', 'hue'=>'float', 'saturation'=>'float', 'luminosity'=>'float'], - 'ImagickPixel::setIndex' => ['void', 'index'=>'int'], - 'ImagickPixel::setcolorcount' => ['void', 'colorCount'=>'string'], - 'ImagickPixelIterator::__construct' => ['void', 'wand'=>'Imagick'], - 'ImagickPixelIterator::clear' => ['bool'], - 'ImagickPixelIterator::current' => ['mixed'], - 'ImagickPixelIterator::destroy' => ['bool'], - 'ImagickPixelIterator::getCurrentIteratorRow' => ['array'], - 'ImagickPixelIterator::getIteratorRow' => ['int'], - 'ImagickPixelIterator::getNextIteratorRow' => ['array'], - 'ImagickPixelIterator::getPreviousIteratorRow' => ['array'], - 'ImagickPixelIterator::getpixeliterator' => ['', 'Imagick'=>'Imagick'], - 'ImagickPixelIterator::getpixelregioniterator' => ['', 'Imagick'=>'Imagick', 'x'=>'', 'y'=>'', 'columns'=>'', 'rows'=>''], - 'ImagickPixelIterator::key' => ['int|string'], - 'ImagickPixelIterator::newPixelIterator' => ['bool', 'wand'=>'Imagick'], - 'ImagickPixelIterator::newPixelRegionIterator' => ['bool', 'wand'=>'Imagick', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'], - 'ImagickPixelIterator::next' => ['void'], - 'ImagickPixelIterator::resetIterator' => ['bool'], - 'ImagickPixelIterator::rewind' => ['void'], - 'ImagickPixelIterator::setIteratorFirstRow' => ['bool'], - 'ImagickPixelIterator::setIteratorLastRow' => ['bool'], - 'ImagickPixelIterator::setIteratorRow' => ['bool', 'row'=>'int'], - 'ImagickPixelIterator::syncIterator' => ['bool'], - 'ImagickPixelIterator::valid' => ['bool'], - 'InfiniteIterator::__construct' => ['void', 'iterator'=>'Iterator'], - 'InfiniteIterator::current' => ['mixed'], - 'InfiniteIterator::getInnerIterator' => ['Iterator'], - 'InfiniteIterator::key' => ['bool|float|int|string'], - 'InfiniteIterator::next' => ['void'], - 'InfiniteIterator::rewind' => ['void'], - 'InfiniteIterator::valid' => ['bool'], - 'IntlBreakIterator::__construct' => ['void'], - 'IntlBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], - 'IntlBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlBreakIterator::current' => ['int'], - 'IntlBreakIterator::first' => ['int'], - 'IntlBreakIterator::following' => ['int', 'offset'=>'int'], - 'IntlBreakIterator::getErrorCode' => ['int'], - 'IntlBreakIterator::getErrorMessage' => ['string'], - 'IntlBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], - 'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], - 'IntlBreakIterator::getText' => ['string'], - 'IntlBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], - 'IntlBreakIterator::last' => ['int'], - 'IntlBreakIterator::next' => ['int', 'offset='=>'int'], - 'IntlBreakIterator::preceding' => ['int', 'offset'=>'int'], - 'IntlBreakIterator::previous' => ['int'], - 'IntlBreakIterator::setText' => ['bool', 'text'=>'string'], - 'IntlCalendar::__construct' => ['void'], - 'IntlCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'], - 'IntlCalendar::after' => ['bool', 'other'=>'IntlCalendar'], - 'IntlCalendar::before' => ['bool', 'other'=>'IntlCalendar'], - 'IntlCalendar::clear' => ['bool', 'field='=>'int'], - 'IntlCalendar::createInstance' => ['IntlCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], - 'IntlCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], - 'IntlCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], - 'IntlCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], - 'IntlCalendar::get' => ['int', 'field'=>'int'], - 'IntlCalendar::getActualMaximum' => ['int', 'field'=>'int'], - 'IntlCalendar::getActualMinimum' => ['int', 'field'=>'int'], - 'IntlCalendar::getAvailableLocales' => ['array'], - 'IntlCalendar::getDayOfWeekType' => ['int', 'dayOfWeek'=>'int'], - 'IntlCalendar::getErrorCode' => ['int'], - 'IntlCalendar::getErrorMessage' => ['string'], - 'IntlCalendar::getFirstDayOfWeek' => ['int'], - 'IntlCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], - 'IntlCalendar::getKeywordValuesForLocale' => ['Iterator|false', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], - 'IntlCalendar::getLeastMaximum' => ['int', 'field'=>'int'], - 'IntlCalendar::getLocale' => ['string', 'localeType'=>'int'], - 'IntlCalendar::getMaximum' => ['int|false', 'field'=>'int'], - 'IntlCalendar::getMinimalDaysInFirstWeek' => ['int'], - 'IntlCalendar::getMinimum' => ['int', 'field'=>'int'], - 'IntlCalendar::getNow' => ['float'], - 'IntlCalendar::getRepeatedWallTimeOption' => ['int'], - 'IntlCalendar::getSkippedWallTimeOption' => ['int'], - 'IntlCalendar::getTime' => ['float'], - 'IntlCalendar::getTimeZone' => ['IntlTimeZone'], - 'IntlCalendar::getType' => ['string'], - 'IntlCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], - '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::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::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::getIntPropertyMaxValue' => ['int', 'property'=>'int'], - 'IntlChar::getIntPropertyMinValue' => ['int', 'property'=>'int'], - 'IntlChar::getIntPropertyMxValue' => ['int', 'property'=>'int'], - 'IntlChar::getIntPropertyValue' => ['int', 'char'=>'int|string', 'property'=>'int'], - 'IntlChar::getNumericValue' => ['float', 'char'=>'int|string'], - 'IntlChar::getPropertyEnum' => ['int', 'alias'=>'string'], - 'IntlChar::getPropertyName' => ['string|false', 'property'=>'int', 'namechoice='=>'int'], - 'IntlChar::getPropertyValueEnum' => ['int', 'property'=>'int', 'name'=>'string'], - 'IntlChar::getPropertyValueName' => ['string|false', 'prop'=>'int', 'value'=>'int', 'namechoice='=>'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'], - 'IntlCodePointBreakIterator::__construct' => ['void'], - 'IntlCodePointBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlCodePointBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], - 'IntlCodePointBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlCodePointBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlCodePointBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlCodePointBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlCodePointBreakIterator::current' => ['int'], - 'IntlCodePointBreakIterator::first' => ['int'], - 'IntlCodePointBreakIterator::following' => ['int', 'offset'=>'string'], - 'IntlCodePointBreakIterator::getErrorCode' => ['int'], - 'IntlCodePointBreakIterator::getErrorMessage' => ['string'], - 'IntlCodePointBreakIterator::getLastCodePoint' => ['int'], - 'IntlCodePointBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], - 'IntlCodePointBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'string'], - 'IntlCodePointBreakIterator::getText' => ['string'], - 'IntlCodePointBreakIterator::isBoundary' => ['bool', 'offset'=>'string'], - 'IntlCodePointBreakIterator::last' => ['int'], - 'IntlCodePointBreakIterator::next' => ['int', 'offset='=>'string'], - 'IntlCodePointBreakIterator::preceding' => ['int', 'offset'=>'string'], - 'IntlCodePointBreakIterator::previous' => ['int'], - 'IntlCodePointBreakIterator::setText' => ['bool', 'text'=>'string'], - 'IntlDateFormatter::__construct' => ['void', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'null|int|IntlCalendar', 'pattern='=>'string'], - 'IntlDateFormatter::create' => ['IntlDateFormatter|false', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'int|IntlCalendar', 'pattern='=>'string'], - 'IntlDateFormatter::format' => ['string|false', 'args'=>''], - 'IntlDateFormatter::formatObject' => ['string|false', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'], - 'IntlDateFormatter::getCalendar' => ['int'], - 'IntlDateFormatter::getCalendarObject' => ['IntlCalendar'], - 'IntlDateFormatter::getDateType' => ['int'], - 'IntlDateFormatter::getErrorCode' => ['int'], - 'IntlDateFormatter::getErrorMessage' => ['string'], - 'IntlDateFormatter::getLocale' => ['string|false'], - 'IntlDateFormatter::getPattern' => ['string'], - 'IntlDateFormatter::getTimeType' => ['int'], - 'IntlDateFormatter::getTimeZone' => ['IntlTimeZone|false'], - 'IntlDateFormatter::getTimeZoneId' => ['string'], - 'IntlDateFormatter::isLenient' => ['bool'], - 'IntlDateFormatter::localtime' => ['array', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'], - 'IntlDateFormatter::parse' => ['int|false', 'text_to_parse'=>'string', '&rw_parse_pos='=>'int'], - 'IntlDateFormatter::setCalendar' => ['bool', 'calendar'=>''], - 'IntlDateFormatter::setLenient' => ['bool', 'lenient'=>'bool'], - 'IntlDateFormatter::setPattern' => ['bool', 'pattern'=>'string'], - 'IntlDateFormatter::setTimeZone' => ['bool', 'timezone'=>''], - 'IntlDateFormatter::setTimeZoneId' => ['bool', 'zone'=>'string', 'fmt='=>'IntlDateFormatter'], - 'IntlException::__clone' => ['void'], - 'IntlException::__construct' => ['void'], - 'IntlException::__toString' => ['string'], - 'IntlException::__wakeup' => ['void'], - 'IntlException::getCode' => ['int'], - 'IntlException::getFile' => ['string'], - 'IntlException::getLine' => ['int'], - 'IntlException::getMessage' => ['string'], - 'IntlException::getPrevious' => ['?Throwable'], - 'IntlException::getTrace' => ['list\',args?:array}>'], - 'IntlException::getTraceAsString' => ['string'], - 'IntlGregorianCalendar::__construct' => ['void'], - 'IntlGregorianCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'], - 'IntlGregorianCalendar::after' => ['bool', 'other'=>'IntlCalendar'], - 'IntlGregorianCalendar::before' => ['bool', 'other'=>'IntlCalendar'], - 'IntlGregorianCalendar::clear' => ['bool', 'field='=>'int'], - 'IntlGregorianCalendar::createInstance' => ['IntlGregorianCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], - 'IntlGregorianCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], - 'IntlGregorianCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], - 'IntlGregorianCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], - 'IntlGregorianCalendar::get' => ['int', 'field'=>'int'], - 'IntlGregorianCalendar::getActualMaximum' => ['int', 'field'=>'int'], - 'IntlGregorianCalendar::getActualMinimum' => ['int', 'field'=>'int'], - 'IntlGregorianCalendar::getAvailableLocales' => ['array'], - 'IntlGregorianCalendar::getDayOfWeekType' => ['int', 'dayOfWeek'=>'int'], - 'IntlGregorianCalendar::getErrorCode' => ['int'], - 'IntlGregorianCalendar::getErrorMessage' => ['string'], - 'IntlGregorianCalendar::getFirstDayOfWeek' => ['int'], - 'IntlGregorianCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], - 'IntlGregorianCalendar::getGregorianChange' => ['float'], - 'IntlGregorianCalendar::getKeywordValuesForLocale' => ['Iterator', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], - 'IntlGregorianCalendar::getLeastMaximum' => ['int', 'field'=>'int'], - 'IntlGregorianCalendar::getLocale' => ['string', 'localeType'=>'int'], - 'IntlGregorianCalendar::getMaximum' => ['int', 'field'=>'int'], - 'IntlGregorianCalendar::getMinimalDaysInFirstWeek' => ['int'], - 'IntlGregorianCalendar::getMinimum' => ['int', 'field'=>'int'], - 'IntlGregorianCalendar::getNow' => ['float'], - 'IntlGregorianCalendar::getRepeatedWallTimeOption' => ['int'], - 'IntlGregorianCalendar::getSkippedWallTimeOption' => ['int'], - 'IntlGregorianCalendar::getTime' => ['float'], - 'IntlGregorianCalendar::getTimeZone' => ['IntlTimeZone'], - 'IntlGregorianCalendar::getType' => ['string'], - 'IntlGregorianCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], - '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::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::toDateTime' => ['DateTime'], - 'IntlIterator::__construct' => ['void'], - 'IntlIterator::current' => ['mixed'], - 'IntlIterator::key' => ['string'], - 'IntlIterator::next' => ['void'], - 'IntlIterator::rewind' => ['void'], - 'IntlIterator::valid' => ['bool'], - 'IntlPartsIterator::getBreakIterator' => ['IntlBreakIterator'], - 'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules'=>'string', 'areCompiled='=>'string'], - 'IntlRuleBasedBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlRuleBasedBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], - 'IntlRuleBasedBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlRuleBasedBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlRuleBasedBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlRuleBasedBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale='=>'string'], - 'IntlRuleBasedBreakIterator::current' => ['int'], - 'IntlRuleBasedBreakIterator::first' => ['int'], - 'IntlRuleBasedBreakIterator::following' => ['int', 'offset'=>'int'], - 'IntlRuleBasedBreakIterator::getBinaryRules' => ['string'], - 'IntlRuleBasedBreakIterator::getErrorCode' => ['int'], - 'IntlRuleBasedBreakIterator::getErrorMessage' => ['string'], - 'IntlRuleBasedBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], - 'IntlRuleBasedBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], - 'IntlRuleBasedBreakIterator::getRuleStatus' => ['int'], - 'IntlRuleBasedBreakIterator::getRuleStatusVec' => ['array'], - 'IntlRuleBasedBreakIterator::getRules' => ['string'], - 'IntlRuleBasedBreakIterator::getText' => ['string'], - 'IntlRuleBasedBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], - 'IntlRuleBasedBreakIterator::last' => ['int'], - 'IntlRuleBasedBreakIterator::next' => ['int', 'offset='=>'int'], - 'IntlRuleBasedBreakIterator::preceding' => ['int', 'offset'=>'int'], - 'IntlRuleBasedBreakIterator::previous' => ['int'], - 'IntlRuleBasedBreakIterator::setText' => ['bool', 'text'=>'string'], - 'IntlTimeZone::countEquivalentIDs' => ['int|false', 'zoneId'=>'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::getDSTSavings' => ['int'], - 'IntlTimeZone::getDisplayName' => ['string|false', 'isDaylight='=>'bool', 'style='=>'int', 'locale='=>'string'], - 'IntlTimeZone::getEquivalentID' => ['string|false', 'zoneId'=>'string', 'index'=>'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::getRawOffset' => ['int'], - 'IntlTimeZone::getRegion' => ['string|false', 'zoneId'=>'string'], - 'IntlTimeZone::getTZDataVersion' => ['string'], - 'IntlTimeZone::getUnknown' => ['IntlTimeZone'], - 'IntlTimeZone::getWindowsID' => ['string|false', 'timezone'=>'string'], - 'IntlTimeZone::hasSameRules' => ['bool', 'otherTimeZone'=>'IntlTimeZone'], - 'IntlTimeZone::toDateTimeZone' => ['DateTimeZone|false'], - 'IntlTimeZone::useDaylightTime' => ['bool'], - 'InvalidArgumentException::__clone' => ['void'], - 'InvalidArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?InvalidArgumentException'], - 'InvalidArgumentException::__toString' => ['string'], - 'InvalidArgumentException::getCode' => ['int'], - 'InvalidArgumentException::getFile' => ['string'], - 'InvalidArgumentException::getLine' => ['int'], - 'InvalidArgumentException::getMessage' => ['string'], - 'InvalidArgumentException::getPrevious' => ['Throwable|InvalidArgumentException|null'], - 'InvalidArgumentException::getTrace' => ['list\',args?:array}>'], - 'InvalidArgumentException::getTraceAsString' => ['string'], - 'Iterator::current' => ['mixed'], - 'Iterator::key' => ['mixed'], - 'Iterator::next' => ['void'], - 'Iterator::rewind' => ['void'], - 'Iterator::valid' => ['bool'], - 'IteratorAggregate::getIterator' => ['Traversable'], - 'IteratorIterator::__construct' => ['void', 'it'=>'Traversable'], - 'IteratorIterator::current' => ['mixed'], - 'IteratorIterator::getInnerIterator' => ['Iterator'], - 'IteratorIterator::key' => ['mixed'], - 'IteratorIterator::next' => ['void'], - 'IteratorIterator::rewind' => ['void'], - 'IteratorIterator::valid' => ['bool'], - 'JavaException::getCause' => ['object'], - 'JsonIncrementalParser::__construct' => ['void', 'depth'=>'', 'options'=>''], - 'JsonIncrementalParser::get' => ['', 'options'=>''], - 'JsonIncrementalParser::getError' => [''], - 'JsonIncrementalParser::parse' => ['', 'json'=>''], - 'JsonIncrementalParser::parseFile' => ['', 'filename'=>''], - 'JsonIncrementalParser::reset' => [''], - 'JsonSerializable::jsonSerialize' => ['mixed'], - 'Judy::__construct' => ['void', 'judy_type'=>'int'], - 'Judy::__destruct' => ['void'], - 'Judy::byCount' => ['int', 'nth_index'=>'int'], - 'Judy::count' => ['int', 'index_start='=>'int', 'index_end='=>'int'], - 'Judy::first' => ['mixed', 'index='=>'mixed'], - 'Judy::firstEmpty' => ['mixed', 'index='=>'mixed'], - 'Judy::free' => ['int'], - 'Judy::getType' => ['int'], - 'Judy::last' => ['mixed', 'index='=>'string'], - 'Judy::lastEmpty' => ['mixed', 'index='=>'int'], - 'Judy::memoryUsage' => ['int'], - 'Judy::next' => ['mixed', 'index'=>'mixed'], - 'Judy::nextEmpty' => ['mixed', 'index'=>'mixed'], - 'Judy::offsetExists' => ['bool', 'offset'=>'mixed'], - 'Judy::offsetGet' => ['mixed', 'offset'=>'mixed'], - 'Judy::offsetSet' => ['bool', 'offset'=>'mixed', 'value'=>'mixed'], - 'Judy::offsetUnset' => ['bool', 'offset'=>'mixed'], - 'Judy::prev' => ['mixed', 'index'=>'mixed'], - 'Judy::prevEmpty' => ['mixed', 'index'=>'mixed'], - 'Judy::size' => ['int'], - 'KTaglib_ID3v2_AttachedPictureFrame::getDescription' => ['string'], - 'KTaglib_ID3v2_AttachedPictureFrame::getMimeType' => ['string'], - 'KTaglib_ID3v2_AttachedPictureFrame::getType' => ['int'], - 'KTaglib_ID3v2_AttachedPictureFrame::savePicture' => ['bool', 'filename'=>'string'], - 'KTaglib_ID3v2_AttachedPictureFrame::setMimeType' => ['string', 'type'=>'string'], - 'KTaglib_ID3v2_AttachedPictureFrame::setPicture' => ['', 'filename'=>'string'], - 'KTaglib_ID3v2_AttachedPictureFrame::setType' => ['', 'type'=>'int'], - 'KTaglib_ID3v2_Frame::__toString' => ['string'], - 'KTaglib_ID3v2_Frame::getDescription' => ['string'], - 'KTaglib_ID3v2_Frame::getMimeType' => ['string'], - 'KTaglib_ID3v2_Frame::getSize' => ['int'], - 'KTaglib_ID3v2_Frame::getType' => ['int'], - 'KTaglib_ID3v2_Frame::savePicture' => ['bool', 'filename'=>'string'], - 'KTaglib_ID3v2_Frame::setMimeType' => ['string', 'type'=>'string'], - 'KTaglib_ID3v2_Frame::setPicture' => ['void', 'filename'=>'string'], - 'KTaglib_ID3v2_Frame::setType' => ['void', 'type'=>'int'], - 'KTaglib_ID3v2_Tag::addFrame' => ['bool', 'frame'=>'KTaglib_ID3v2_Frame'], - 'KTaglib_ID3v2_Tag::getFrameList' => ['array'], - 'KTaglib_MPEG_AudioProperties::getBitrate' => ['int'], - 'KTaglib_MPEG_AudioProperties::getChannels' => ['int'], - 'KTaglib_MPEG_AudioProperties::getLayer' => ['int'], - 'KTaglib_MPEG_AudioProperties::getLength' => ['int'], - 'KTaglib_MPEG_AudioProperties::getSampleBitrate' => ['int'], - 'KTaglib_MPEG_AudioProperties::getVersion' => ['int'], - 'KTaglib_MPEG_AudioProperties::isCopyrighted' => ['bool'], - 'KTaglib_MPEG_AudioProperties::isOriginal' => ['bool'], - 'KTaglib_MPEG_AudioProperties::isProtectionEnabled' => ['bool'], - 'KTaglib_MPEG_File::getAudioProperties' => ['KTaglib_MPEG_File'], - 'KTaglib_MPEG_File::getID3v1Tag' => ['KTaglib_ID3v1_Tag', 'create='=>'bool'], - 'KTaglib_MPEG_File::getID3v2Tag' => ['KTaglib_ID3v2_Tag', 'create='=>'bool'], - 'KTaglib_Tag::getAlbum' => ['string'], - 'KTaglib_Tag::getArtist' => ['string'], - 'KTaglib_Tag::getComment' => ['string'], - 'KTaglib_Tag::getGenre' => ['string'], - 'KTaglib_Tag::getTitle' => ['string'], - 'KTaglib_Tag::getTrack' => ['int'], - 'KTaglib_Tag::getYear' => ['int'], - 'KTaglib_Tag::isEmpty' => ['bool'], - 'Lapack::eigenValues' => ['array', 'a'=>'array', 'left='=>'array', 'right='=>'array'], - 'Lapack::identity' => ['array', 'n'=>'int'], - 'Lapack::leastSquaresByFactorisation' => ['array', 'a'=>'array', 'b'=>'array'], - 'Lapack::leastSquaresBySVD' => ['array', 'a'=>'array', 'b'=>'array'], - 'Lapack::pseudoInverse' => ['array', 'a'=>'array'], - 'Lapack::singularValues' => ['array', 'a'=>'array'], - 'Lapack::solveLinearEquation' => ['array', 'a'=>'array', 'b'=>'array'], - 'LengthException::__clone' => ['void'], - 'LengthException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?LengthException'], - 'LengthException::__toString' => ['string'], - 'LengthException::getCode' => ['int'], - 'LengthException::getFile' => ['string'], - 'LengthException::getLine' => ['int'], - 'LengthException::getMessage' => ['string'], - 'LengthException::getPrevious' => ['Throwable|LengthException|null'], - 'LengthException::getTrace' => ['list\',args?:array}>'], - 'LengthException::getTraceAsString' => ['string'], - 'LevelDB::__construct' => ['void', 'name'=>'string', 'options='=>'array', 'read_options='=>'array', 'write_options='=>'array'], - 'LevelDB::close' => [''], - 'LevelDB::compactRange' => ['', 'start'=>'', 'limit'=>''], - 'LevelDB::delete' => ['bool', 'key'=>'string', 'write_options='=>'array'], - 'LevelDB::destroy' => ['', 'name'=>'', 'options='=>'array'], - 'LevelDB::get' => ['bool|string', 'key'=>'string', 'read_options='=>'array'], - 'LevelDB::getApproximateSizes' => ['', 'start'=>'', 'limit'=>''], - 'LevelDB::getIterator' => ['LevelDBIterator', 'options='=>'array'], - 'LevelDB::getProperty' => ['mixed', 'name'=>'string'], - 'LevelDB::getSnapshot' => ['LevelDBSnapshot'], - 'LevelDB::put' => ['', 'key'=>'string', 'value'=>'string', 'write_options='=>'array'], - 'LevelDB::repair' => ['', 'name'=>'', 'options='=>'array'], - 'LevelDB::set' => ['', 'key'=>'string', 'value'=>'string', 'write_options='=>'array'], - 'LevelDB::write' => ['', 'batch'=>'LevelDBWriteBatch', 'write_options='=>'array'], - 'LevelDBIterator::__construct' => ['void', 'db'=>'LevelDB', 'read_options='=>'array'], - 'LevelDBIterator::current' => ['mixed'], - 'LevelDBIterator::destroy' => [''], - 'LevelDBIterator::getError' => [''], - 'LevelDBIterator::key' => ['int|string'], - 'LevelDBIterator::last' => [''], - 'LevelDBIterator::next' => ['void'], - 'LevelDBIterator::prev' => [''], - 'LevelDBIterator::rewind' => ['void'], - 'LevelDBIterator::seek' => ['', 'key'=>''], - 'LevelDBIterator::valid' => ['bool'], - 'LevelDBSnapshot::__construct' => ['void', 'db'=>'LevelDB'], - 'LevelDBSnapshot::release' => [''], - 'LevelDBWriteBatch::__construct' => ['void', 'name'=>'', 'options='=>'array', 'read_options='=>'array', 'write_options='=>'array'], - 'LevelDBWriteBatch::clear' => [''], - 'LevelDBWriteBatch::delete' => ['', 'key'=>'', 'write_options='=>'array'], - 'LevelDBWriteBatch::put' => ['', 'key'=>'', 'value'=>'', 'write_options='=>'array'], - 'LevelDBWriteBatch::set' => ['', 'key'=>'', 'value'=>'', 'write_options='=>'array'], - 'LimitIterator::__construct' => ['void', 'iterator'=>'Iterator', 'offset='=>'int', 'count='=>'int'], - 'LimitIterator::current' => ['mixed'], - 'LimitIterator::getInnerIterator' => ['Iterator'], - 'LimitIterator::getPosition' => ['int'], - 'LimitIterator::key' => ['mixed'], - 'LimitIterator::next' => ['void'], - 'LimitIterator::rewind' => ['void'], - 'LimitIterator::seek' => ['int', 'position'=>'int'], - 'LimitIterator::valid' => ['bool'], - 'Locale::acceptFromHttp' => ['string|false', 'header'=>'string'], - 'Locale::canonicalize' => ['string', 'locale'=>'string'], - 'Locale::composeLocale' => ['string', 'subtags'=>'array'], - 'Locale::filterMatches' => ['bool', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'], - 'Locale::getAllVariants' => ['array', 'locale'=>'string'], - 'Locale::getDefault' => ['string'], - 'Locale::getDisplayLanguage' => ['string', 'locale'=>'string', 'in_locale='=>'string'], - 'Locale::getDisplayName' => ['string', 'locale'=>'string', 'in_locale='=>'string'], - 'Locale::getDisplayRegion' => ['string', 'locale'=>'string', 'in_locale='=>'string'], - 'Locale::getDisplayScript' => ['string', 'locale'=>'string', 'in_locale='=>'string'], - 'Locale::getDisplayVariant' => ['string', 'locale'=>'string', 'in_locale='=>'string'], - 'Locale::getKeywords' => ['array|false', 'locale'=>'string'], - 'Locale::getPrimaryLanguage' => ['string', 'locale'=>'string'], - 'Locale::getRegion' => ['string', 'locale'=>'string'], - 'Locale::getScript' => ['string', 'locale'=>'string'], - 'Locale::lookup' => ['string', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'default='=>'string'], - 'Locale::parseLocale' => ['array', 'locale'=>'string'], - 'Locale::setDefault' => ['bool', 'locale'=>'string'], - 'LogicException::__clone' => ['void'], - 'LogicException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?LogicException'], - 'LogicException::__toString' => ['string'], - 'LogicException::getCode' => ['int'], - 'LogicException::getFile' => ['string'], - 'LogicException::getLine' => ['int'], - 'LogicException::getMessage' => ['string'], - 'LogicException::getPrevious' => ['Throwable|LogicException|null'], - 'LogicException::getTrace' => ['list\',args?:array}>'], - 'LogicException::getTraceAsString' => ['string'], - 'Lua::__call' => ['mixed', 'lua_func'=>'callable', 'args='=>'array', 'use_self='=>'int'], - 'Lua::__construct' => ['void', 'lua_script_file'=>'string'], - 'Lua::assign' => ['?Lua', 'name'=>'string', 'value'=>'mixed'], - 'Lua::call' => ['mixed', 'lua_func'=>'callable', 'args='=>'array', 'use_self='=>'int'], - 'Lua::eval' => ['mixed', 'statements'=>'string'], - 'Lua::getVersion' => ['string'], - 'Lua::include' => ['mixed', 'file'=>'string'], - 'Lua::registerCallback' => ['Lua|null|false', 'name'=>'string', 'function'=>'callable'], - 'LuaClosure::__invoke' => ['void', 'arg'=>'mixed', '...args='=>'mixed'], - 'Memcache::add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], - 'Memcache::addServer' => ['bool', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable', 'timeoutms='=>'int'], - 'Memcache::append' => [''], - 'Memcache::cas' => [''], - 'Memcache::close' => ['bool'], - 'Memcache::connect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], - 'Memcache::decrement' => ['int', 'key'=>'string', 'value='=>'int'], - 'Memcache::delete' => ['bool', 'key'=>'string', 'timeout='=>'int'], - 'Memcache::findServer' => [''], - 'Memcache::flush' => ['bool'], - 'Memcache::get' => ['string|array|false', 'key'=>'string', 'flags='=>'array', 'keys='=>'array'], - 'Memcache::get\'1' => ['array', 'key'=>'string[]', 'flags='=>'int[]'], - 'Memcache::getExtendedStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], - 'Memcache::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'], - 'Memcache::getStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], - 'Memcache::getVersion' => ['string'], - 'Memcache::increment' => ['int', 'key'=>'string', 'value='=>'int'], - 'Memcache::pconnect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], - 'Memcache::prepend' => ['string'], - 'Memcache::replace' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], - 'Memcache::set' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], - 'Memcache::setCompressThreshold' => ['bool', 'threshold'=>'int', 'min_savings='=>'float'], - 'Memcache::setFailureCallback' => [''], - 'Memcache::setServerParams' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable'], - 'MemcachePool::add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], - 'MemcachePool::addServer' => ['bool', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'?callable', 'timeoutms='=>'int'], - 'MemcachePool::append' => [''], - 'MemcachePool::cas' => [''], - 'MemcachePool::close' => ['bool'], - 'MemcachePool::connect' => ['bool', 'host'=>'string', 'port'=>'int', 'timeout='=>'int'], - 'MemcachePool::decrement' => ['int|false', 'key'=>'', 'value='=>'int|mixed'], - 'MemcachePool::delete' => ['bool', 'key'=>'', 'timeout='=>'int|mixed'], - 'MemcachePool::findServer' => [''], - 'MemcachePool::flush' => ['bool'], - 'MemcachePool::get' => ['array|string|false', 'key'=>'array|string', '&flags='=>'array|int'], - 'MemcachePool::getExtendedStats' => ['array|false', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], - 'MemcachePool::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'], - 'MemcachePool::getStats' => ['array|false', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], - 'MemcachePool::getVersion' => ['string|false'], - 'MemcachePool::increment' => ['int|false', 'key'=>'', 'value='=>'int|mixed'], - 'MemcachePool::prepend' => ['string'], - 'MemcachePool::replace' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], - 'MemcachePool::set' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], - 'MemcachePool::setCompressThreshold' => ['bool', 'thresold'=>'int', 'min_saving='=>'float'], - 'MemcachePool::setFailureCallback' => [''], - 'MemcachePool::setServerParams' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'?callable'], - 'Memcached::__construct' => ['void', 'persistent_id='=>'mixed|string', 'on_new_object_cb='=>'mixed'], - 'Memcached::add' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], - 'Memcached::addByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], - 'Memcached::addServer' => ['bool', 'host'=>'string', 'port'=>'int', 'weight='=>'int'], - 'Memcached::addServers' => ['bool', 'servers'=>'array'], - 'Memcached::append' => ['bool', 'key'=>'string', 'value'=>'string'], - 'Memcached::appendByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'string'], - 'Memcached::cas' => ['bool', 'cas_token'=>'float', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], - 'Memcached::casByKey' => ['bool', 'cas_token'=>'float', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], - 'Memcached::decrement' => ['int|false', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], - 'Memcached::decrementByKey' => ['int|false', 'server_key'=>'string', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], - 'Memcached::delete' => ['bool', 'key'=>'string', 'time='=>'int'], - 'Memcached::deleteByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'time='=>'int'], - 'Memcached::deleteMulti' => ['array', 'keys'=>'array', 'time='=>'int'], - 'Memcached::deleteMultiByKey' => ['bool', 'server_key'=>'string', 'keys'=>'array', 'time='=>'int'], - 'Memcached::fetch' => ['array|false'], - 'Memcached::fetchAll' => ['array|false'], - 'Memcached::flush' => ['bool', 'delay='=>'int'], - 'Memcached::flushBuffers' => [''], - 'Memcached::get' => ['mixed|false', 'key'=>'string', 'cache_cb='=>'?callable', 'flags='=>'int'], - 'Memcached::getAllKeys' => ['array|false'], - 'Memcached::getByKey' => ['mixed|false', 'server_key'=>'string', 'key'=>'string', 'value_cb='=>'?callable', 'flags='=>'int'], - 'Memcached::getDelayed' => ['bool', 'keys'=>'array', 'with_cas='=>'bool', 'value_cb='=>'callable'], - 'Memcached::getDelayedByKey' => ['bool', 'server_key'=>'string', 'keys'=>'array', 'with_cas='=>'bool', 'value_cb='=>'?callable'], - 'Memcached::getLastDisconnectedServer' => [''], - 'Memcached::getLastErrorCode' => [''], - 'Memcached::getLastErrorErrno' => [''], - 'Memcached::getLastErrorMessage' => [''], - 'Memcached::getMulti' => ['array|false', 'keys'=>'array', 'flags='=>'int'], - 'Memcached::getMultiByKey' => ['array|false', 'server_key'=>'string', 'keys'=>'array', 'flags='=>'int'], - 'Memcached::getOption' => ['mixed|false', 'option'=>'int'], - 'Memcached::getResultCode' => ['int'], - 'Memcached::getResultMessage' => ['string'], - 'Memcached::getServerByKey' => ['array', 'server_key'=>'string'], - 'Memcached::getServerList' => ['array'], - 'Memcached::getStats' => ['array', 'type='=>'?string'], - 'Memcached::getVersion' => ['array'], - 'Memcached::increment' => ['int|false', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], - 'Memcached::incrementByKey' => ['int|false', 'server_key'=>'string', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'], - 'Memcached::isPersistent' => ['bool'], - 'Memcached::isPristine' => ['bool'], - 'Memcached::prepend' => ['bool', 'key'=>'string', 'value'=>'string'], - 'Memcached::prependByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'string'], - 'Memcached::quit' => ['bool'], - 'Memcached::replace' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], - 'Memcached::replaceByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], - 'Memcached::resetServerList' => ['bool'], - 'Memcached::set' => ['bool', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], - 'Memcached::setBucket' => ['', 'host_map'=>'array', 'forward_map'=>'array', 'replicas'=>''], - 'Memcached::setByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'value'=>'mixed', 'expiration='=>'int'], - 'Memcached::setEncodingKey' => ['', 'key'=>''], - 'Memcached::setMulti' => ['bool', 'items'=>'array', 'expiration='=>'int'], - 'Memcached::setMultiByKey' => ['bool', 'server_key'=>'string', 'items'=>'array', 'expiration='=>'int'], - 'Memcached::setOption' => ['bool', 'option'=>'int', 'value'=>'mixed'], - 'Memcached::setOptions' => ['bool', 'options'=>'array'], - 'Memcached::setSaslAuthData' => ['void', 'username'=>'string', 'password'=>'string'], - 'Memcached::touch' => ['bool', 'key'=>'string', 'expiration'=>'int'], - 'Memcached::touchByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'expiration'=>'int'], - 'MessageFormatter::__construct' => ['void', 'locale'=>'string', 'pattern'=>'string'], - 'MessageFormatter::create' => ['MessageFormatter', 'locale'=>'string', 'pattern'=>'string'], - 'MessageFormatter::format' => ['false|string', 'args'=>'array'], - 'MessageFormatter::formatMessage' => ['false|string', 'locale'=>'string', 'pattern'=>'string', 'args'=>'array'], - 'MessageFormatter::getErrorCode' => ['int'], - 'MessageFormatter::getErrorMessage' => ['string'], - 'MessageFormatter::getLocale' => ['string'], - 'MessageFormatter::getPattern' => ['string'], - 'MessageFormatter::parse' => ['array|false', 'value'=>'string'], - 'MessageFormatter::parseMessage' => ['array|false', 'locale'=>'string', 'pattern'=>'string', 'source'=>'string'], - 'MessageFormatter::setPattern' => ['bool', 'pattern'=>'string'], - 'Mongo::__construct' => ['void', 'server='=>'string', 'options='=>'array', 'driver_options='=>'array'], - 'Mongo::__get' => ['MongoDB', 'dbname'=>'string'], - 'Mongo::__toString' => ['string'], - 'Mongo::close' => ['bool'], - 'Mongo::connect' => ['bool'], - 'Mongo::connectUtil' => ['bool'], - 'Mongo::dropDB' => ['array', 'db'=>'mixed'], - 'Mongo::forceError' => ['bool'], - 'Mongo::getConnections' => ['array'], - 'Mongo::getHosts' => ['array'], - 'Mongo::getPoolSize' => ['int'], - 'Mongo::getReadPreference' => ['array'], - 'Mongo::getSlave' => ['?string'], - 'Mongo::getSlaveOkay' => ['bool'], - 'Mongo::getWriteConcern' => ['array'], - 'Mongo::killCursor' => ['', 'server_hash'=>'string', 'id'=>'MongoInt64|int'], - 'Mongo::lastError' => ['?array'], - 'Mongo::listDBs' => ['array'], - 'Mongo::pairConnect' => ['bool'], - 'Mongo::pairPersistConnect' => ['bool', 'username='=>'string', 'password='=>'string'], - 'Mongo::persistConnect' => ['bool', 'username='=>'string', 'password='=>'string'], - 'Mongo::poolDebug' => ['array'], - 'Mongo::prevError' => ['array'], - 'Mongo::resetError' => ['array'], - 'Mongo::selectCollection' => ['MongoCollection', 'db'=>'string', 'collection'=>'string'], - 'Mongo::selectDB' => ['MongoDB', 'name'=>'string'], - 'Mongo::setPoolSize' => ['bool', 'size'=>'int'], - 'Mongo::setReadPreference' => ['bool', 'readPreference'=>'string', 'tags='=>'array'], - 'Mongo::setSlaveOkay' => ['bool', 'ok='=>'bool'], - 'Mongo::switchSlave' => ['string'], - 'MongoBinData::__construct' => ['void', 'data'=>'string', 'type='=>'int'], - 'MongoBinData::__toString' => ['string'], - 'MongoClient::__construct' => ['void', 'server='=>'string', 'options='=>'array', 'driver_options='=>'array'], - 'MongoClient::__get' => ['MongoDB', 'dbname'=>'string'], - 'MongoClient::__toString' => ['string'], - 'MongoClient::close' => ['bool', 'connection='=>'bool|string'], - 'MongoClient::connect' => ['bool'], - 'MongoClient::dropDB' => ['array', 'db'=>'mixed'], - 'MongoClient::getConnections' => ['array'], - 'MongoClient::getHosts' => ['array'], - 'MongoClient::getReadPreference' => ['array'], - 'MongoClient::getWriteConcern' => ['array'], - 'MongoClient::killCursor' => ['bool', 'server_hash'=>'string', 'id'=>'int|MongoInt64'], - 'MongoClient::listDBs' => ['array'], - 'MongoClient::selectCollection' => ['MongoCollection', 'db'=>'string', 'collection'=>'string'], - 'MongoClient::selectDB' => ['MongoDB', 'name'=>'string'], - 'MongoClient::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], - 'MongoClient::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], - 'MongoClient::switchSlave' => ['string'], - 'MongoCode::__construct' => ['void', 'code'=>'string', 'scope='=>'array'], - 'MongoCode::__toString' => ['string'], - 'MongoCollection::__construct' => ['void', 'db'=>'MongoDB', 'name'=>'string'], - 'MongoCollection::__get' => ['MongoCollection', 'name'=>'string'], - 'MongoCollection::__toString' => ['string'], - 'MongoCollection::aggregate' => ['array', 'op'=>'array', 'op='=>'array', '...args='=>'array'], - 'MongoCollection::aggregate\'1' => ['array', 'pipeline'=>'array', 'options='=>'array'], - 'MongoCollection::aggregateCursor' => ['MongoCommandCursor', 'command'=>'array', 'options='=>'array'], - 'MongoCollection::batchInsert' => ['array|bool', 'a'=>'array', 'options='=>'array'], - 'MongoCollection::count' => ['int', 'query='=>'array', 'limit='=>'int', 'skip='=>'int'], - 'MongoCollection::createDBRef' => ['array', 'a'=>'array'], - 'MongoCollection::createIndex' => ['array', 'keys'=>'array', 'options='=>'array'], - 'MongoCollection::deleteIndex' => ['array', 'keys'=>'string|array'], - 'MongoCollection::deleteIndexes' => ['array'], - 'MongoCollection::distinct' => ['array|false', 'key'=>'string', 'query='=>'array'], - 'MongoCollection::drop' => ['array'], - 'MongoCollection::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'], - 'MongoCollection::find' => ['MongoCursor', 'query='=>'array', 'fields='=>'array'], - 'MongoCollection::findAndModify' => ['array', 'query'=>'array', 'update='=>'array', 'fields='=>'array', 'options='=>'array'], - 'MongoCollection::findOne' => ['?array', 'query='=>'array', 'fields='=>'array'], - 'MongoCollection::getDBRef' => ['array', 'ref'=>'array'], - 'MongoCollection::getIndexInfo' => ['array'], - 'MongoCollection::getName' => ['string'], - 'MongoCollection::getReadPreference' => ['array'], - 'MongoCollection::getSlaveOkay' => ['bool'], - 'MongoCollection::getWriteConcern' => ['array'], - 'MongoCollection::group' => ['array', 'keys'=>'mixed', 'initial'=>'array', 'reduce'=>'MongoCode', 'options='=>'array'], - 'MongoCollection::insert' => ['bool|array', 'a'=>'array|object', 'options='=>'array'], - 'MongoCollection::parallelCollectionScan' => ['MongoCommandCursor[]', 'num_cursors'=>'int'], - 'MongoCollection::remove' => ['bool|array', 'criteria='=>'array', 'options='=>'array'], - 'MongoCollection::save' => ['bool|array', 'a'=>'array|object', 'options='=>'array'], - 'MongoCollection::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], - 'MongoCollection::setSlaveOkay' => ['bool', 'ok='=>'bool'], - 'MongoCollection::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], - 'MongoCollection::toIndexString' => ['string', 'keys'=>'mixed'], - 'MongoCollection::update' => ['bool', 'criteria'=>'array', 'newobj'=>'array', 'options='=>'array'], - 'MongoCollection::validate' => ['array', 'scan_data='=>'bool'], - 'MongoCommandCursor::__construct' => ['void', 'connection'=>'MongoClient', 'ns'=>'string', 'command'=>'array'], - 'MongoCommandCursor::batchSize' => ['MongoCommandCursor', 'batchSize'=>'int'], - 'MongoCommandCursor::createFromDocument' => ['MongoCommandCursor', 'connection'=>'MongoClient', 'hash'=>'string', 'document'=>'array'], - 'MongoCommandCursor::current' => ['array'], - 'MongoCommandCursor::dead' => ['bool'], - 'MongoCommandCursor::getReadPreference' => ['array'], - 'MongoCommandCursor::info' => ['array'], - 'MongoCommandCursor::key' => ['int'], - 'MongoCommandCursor::next' => ['void'], - 'MongoCommandCursor::rewind' => ['array'], - 'MongoCommandCursor::setReadPreference' => ['MongoCommandCursor', 'read_preference'=>'string', 'tags='=>'array'], - 'MongoCommandCursor::timeout' => ['MongoCommandCursor', 'ms'=>'int'], - 'MongoCommandCursor::valid' => ['bool'], - 'MongoCursor::__construct' => ['void', 'connection'=>'MongoClient', 'ns'=>'string', 'query='=>'array', 'fields='=>'array'], - 'MongoCursor::addOption' => ['MongoCursor', 'key'=>'string', 'value'=>'mixed'], - 'MongoCursor::awaitData' => ['MongoCursor', 'wait='=>'bool'], - 'MongoCursor::batchSize' => ['MongoCursor', 'num'=>'int'], - 'MongoCursor::count' => ['int', 'foundonly='=>'bool'], - 'MongoCursor::current' => ['array'], - 'MongoCursor::dead' => ['bool'], - 'MongoCursor::doQuery' => ['void'], - 'MongoCursor::explain' => ['array'], - 'MongoCursor::fields' => ['MongoCursor', 'f'=>'array'], - 'MongoCursor::getNext' => ['array'], - 'MongoCursor::getReadPreference' => ['array'], - 'MongoCursor::hasNext' => ['bool'], - 'MongoCursor::hint' => ['MongoCursor', 'key_pattern'=>'string|array|object'], - 'MongoCursor::immortal' => ['MongoCursor', 'liveforever='=>'bool'], - 'MongoCursor::info' => ['array'], - 'MongoCursor::key' => ['string'], - 'MongoCursor::limit' => ['MongoCursor', 'num'=>'int'], - 'MongoCursor::maxTimeMS' => ['MongoCursor', 'ms'=>'int'], - 'MongoCursor::next' => ['array'], - 'MongoCursor::partial' => ['MongoCursor', 'okay='=>'bool'], - 'MongoCursor::reset' => ['void'], - 'MongoCursor::rewind' => ['void'], - 'MongoCursor::setFlag' => ['MongoCursor', 'flag'=>'int', 'set='=>'bool'], - 'MongoCursor::setReadPreference' => ['MongoCursor', 'read_preference'=>'string', 'tags='=>'array'], - 'MongoCursor::skip' => ['MongoCursor', 'num'=>'int'], - 'MongoCursor::slaveOkay' => ['MongoCursor', 'okay='=>'bool'], - 'MongoCursor::snapshot' => ['MongoCursor'], - 'MongoCursor::sort' => ['MongoCursor', 'fields'=>'array'], - 'MongoCursor::tailable' => ['MongoCursor', 'tail='=>'bool'], - 'MongoCursor::timeout' => ['MongoCursor', 'ms'=>'int'], - 'MongoCursor::valid' => ['bool'], - 'MongoCursorException::__clone' => ['void'], - 'MongoCursorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'MongoCursorException::__toString' => ['string'], - 'MongoCursorException::__wakeup' => ['void'], - 'MongoCursorException::getCode' => ['int'], - 'MongoCursorException::getFile' => ['string'], - 'MongoCursorException::getHost' => ['string'], - 'MongoCursorException::getLine' => ['int'], - 'MongoCursorException::getMessage' => ['string'], - 'MongoCursorException::getPrevious' => ['Exception|Throwable'], - 'MongoCursorException::getTrace' => ['list\',args?:array}>'], - 'MongoCursorException::getTraceAsString' => ['string'], - 'MongoCursorInterface::__construct' => ['void'], - 'MongoCursorInterface::batchSize' => ['MongoCursorInterface', 'batchSize'=>'int'], - 'MongoCursorInterface::current' => ['mixed'], - 'MongoCursorInterface::dead' => ['bool'], - 'MongoCursorInterface::getReadPreference' => ['array'], - 'MongoCursorInterface::info' => ['array'], - 'MongoCursorInterface::key' => ['int|string'], - 'MongoCursorInterface::next' => ['void'], - 'MongoCursorInterface::rewind' => ['void'], - 'MongoCursorInterface::setReadPreference' => ['MongoCursorInterface', 'read_preference'=>'string', 'tags='=>'array'], - 'MongoCursorInterface::timeout' => ['MongoCursorInterface', 'ms'=>'int'], - 'MongoCursorInterface::valid' => ['bool'], - 'MongoDB::__construct' => ['void', 'conn'=>'MongoClient', 'name'=>'string'], - 'MongoDB::__get' => ['MongoCollection', 'name'=>'string'], - 'MongoDB::__toString' => ['string'], - 'MongoDB::authenticate' => ['array', 'username'=>'string', 'password'=>'string'], - 'MongoDB::command' => ['array', 'command'=>'array'], - 'MongoDB::createCollection' => ['MongoCollection', 'name'=>'string', 'capped='=>'bool', 'size='=>'int', 'max='=>'int'], - 'MongoDB::createDBRef' => ['array', 'collection'=>'string', 'a'=>'mixed'], - 'MongoDB::drop' => ['array'], - 'MongoDB::dropCollection' => ['array', 'coll'=>'MongoCollection|string'], - 'MongoDB::execute' => ['array', 'code'=>'MongoCode|string', 'args='=>'array'], - 'MongoDB::forceError' => ['bool'], - 'MongoDB::getCollectionInfo' => ['array', 'options='=>'array'], - 'MongoDB::getCollectionNames' => ['array', 'options='=>'array'], - 'MongoDB::getDBRef' => ['array', 'ref'=>'array'], - 'MongoDB::getGridFS' => ['MongoGridFS', 'prefix='=>'string'], - 'MongoDB::getProfilingLevel' => ['int'], - 'MongoDB::getReadPreference' => ['array'], - 'MongoDB::getSlaveOkay' => ['bool'], - 'MongoDB::getWriteConcern' => ['array'], - 'MongoDB::lastError' => ['array'], - 'MongoDB::listCollections' => ['array'], - 'MongoDB::prevError' => ['array'], - 'MongoDB::repair' => ['array', 'preserve_cloned_files='=>'bool', 'backup_original_files='=>'bool'], - 'MongoDB::resetError' => ['array'], - 'MongoDB::selectCollection' => ['MongoCollection', 'name'=>'string'], - 'MongoDB::setProfilingLevel' => ['int', 'level'=>'int'], - 'MongoDB::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'], - 'MongoDB::setSlaveOkay' => ['bool', 'ok='=>'bool'], - 'MongoDB::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'], - 'MongoDBRef::create' => ['array', 'collection'=>'string', 'id'=>'mixed', 'database='=>'string'], - 'MongoDBRef::get' => ['?array', 'db'=>'MongoDB', 'ref'=>'array'], - 'MongoDBRef::isRef' => ['bool', 'ref'=>'mixed'], - 'MongoDB\BSON\Binary::__construct' => ['void', 'data'=>'string', 'type'=>'int'], - 'MongoDB\BSON\Binary::__toString' => ['string'], - 'MongoDB\BSON\Binary::getData' => ['string'], - 'MongoDB\BSON\Binary::getType' => ['int'], - 'MongoDB\BSON\Decimal128::__construct' => ['void', 'value='=>'string'], - 'MongoDB\BSON\Decimal128::__toString' => ['string'], - 'MongoDB\BSON\Javascript::__construct' => ['void', 'code'=>'string', 'scope='=>'array|object'], - 'MongoDB\BSON\ObjectId::__construct' => ['void', 'id='=>'string'], - 'MongoDB\BSON\ObjectId::__toString' => ['string'], - 'MongoDB\BSON\Regex::__construct' => ['void', 'pattern'=>'string', 'flags='=>'string'], - 'MongoDB\BSON\Regex::__toString' => ['string'], - 'MongoDB\BSON\Regex::getFlags' => ['string'], - 'MongoDB\BSON\Regex::getPattern' => ['string'], - 'MongoDB\BSON\Serializable::bsonSerialize' => ['array|object'], - 'MongoDB\BSON\Timestamp::__construct' => ['void', 'increment'=>'int', 'timestamp'=>'int'], - 'MongoDB\BSON\Timestamp::__toString' => ['string'], - 'MongoDB\BSON\UTCDateTime::__construct' => ['void', 'milliseconds='=>'int|DateTimeInterface'], - 'MongoDB\BSON\UTCDateTime::__toString' => ['string'], - 'MongoDB\BSON\UTCDateTime::toDateTime' => ['DateTime'], - 'MongoDB\BSON\Unserializable::bsonUnserialize' => ['void', 'data'=>'array'], - 'MongoDB\BSON\binary::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\binary::serialize' => ['string'], - 'MongoDB\BSON\binary::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\binaryinterface::__toString' => ['string'], - 'MongoDB\BSON\binaryinterface::getData' => ['string'], - 'MongoDB\BSON\binaryinterface::getType' => ['int'], - 'MongoDB\BSON\dbpointer::__construct' => ['void'], - 'MongoDB\BSON\dbpointer::__toString' => ['string'], - 'MongoDB\BSON\dbpointer::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\dbpointer::serialize' => ['string'], - 'MongoDB\BSON\dbpointer::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\decimal128::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\decimal128::serialize' => ['string'], - 'MongoDB\BSON\decimal128::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\decimal128interface::__toString' => ['string'], - 'MongoDB\BSON\fromJSON' => ['string', 'json'=>'string'], - 'MongoDB\BSON\fromPHP' => ['string', 'value'=>'array|object'], - 'MongoDB\BSON\int64::__construct' => ['void'], - 'MongoDB\BSON\int64::__toString' => ['string'], - 'MongoDB\BSON\int64::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\int64::serialize' => ['string'], - 'MongoDB\BSON\int64::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\javascript::__toString' => ['string'], - 'MongoDB\BSON\javascript::getCode' => ['string'], - 'MongoDB\BSON\javascript::getScope' => ['?object'], - 'MongoDB\BSON\javascript::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\javascript::serialize' => ['string'], - 'MongoDB\BSON\javascript::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\javascriptinterface::__toString' => ['string'], - 'MongoDB\BSON\javascriptinterface::getCode' => ['string'], - 'MongoDB\BSON\javascriptinterface::getScope' => ['?object'], - 'MongoDB\BSON\maxkey::__construct' => ['void'], - 'MongoDB\BSON\maxkey::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\maxkey::serialize' => ['string'], - 'MongoDB\BSON\maxkey::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\minkey::__construct' => ['void'], - 'MongoDB\BSON\minkey::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\minkey::serialize' => ['string'], - 'MongoDB\BSON\minkey::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\objectid::getTimestamp' => ['int'], - 'MongoDB\BSON\objectid::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\objectid::serialize' => ['string'], - 'MongoDB\BSON\objectid::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\objectidinterface::__toString' => ['string'], - 'MongoDB\BSON\objectidinterface::getTimestamp' => ['int'], - 'MongoDB\BSON\regex::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\regex::serialize' => ['string'], - 'MongoDB\BSON\regex::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\regexinterface::__toString' => ['string'], - 'MongoDB\BSON\regexinterface::getFlags' => ['string'], - 'MongoDB\BSON\regexinterface::getPattern' => ['string'], - 'MongoDB\BSON\symbol::__construct' => ['void'], - 'MongoDB\BSON\symbol::__toString' => ['string'], - 'MongoDB\BSON\symbol::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\symbol::serialize' => ['string'], - 'MongoDB\BSON\symbol::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\timestamp::getIncrement' => ['int'], - 'MongoDB\BSON\timestamp::getTimestamp' => ['int'], - 'MongoDB\BSON\timestamp::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\timestamp::serialize' => ['string'], - 'MongoDB\BSON\timestamp::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\timestampinterface::__toString' => ['string'], - 'MongoDB\BSON\timestampinterface::getIncrement' => ['int'], - 'MongoDB\BSON\timestampinterface::getTimestamp' => ['int'], - 'MongoDB\BSON\toJSON' => ['string', 'bson'=>'string'], - 'MongoDB\BSON\toPHP' => ['object', 'bson'=>'string', 'typeMap='=>'array'], - 'MongoDB\BSON\undefined::__construct' => ['void'], - 'MongoDB\BSON\undefined::__toString' => ['string'], - 'MongoDB\BSON\undefined::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\undefined::serialize' => ['string'], - 'MongoDB\BSON\undefined::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\utcdatetime::jsonSerialize' => ['mixed'], - 'MongoDB\BSON\utcdatetime::serialize' => ['string'], - 'MongoDB\BSON\utcdatetime::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\BSON\utcdatetimeinterface::__toString' => ['string'], - 'MongoDB\BSON\utcdatetimeinterface::toDateTime' => ['DateTime'], - 'MongoDB\Driver\BulkWrite::__construct' => ['void', 'ordered='=>'bool'], - 'MongoDB\Driver\BulkWrite::count' => ['int'], - 'MongoDB\Driver\BulkWrite::delete' => ['void', 'filter'=>'array|object', 'deleteOptions='=>'array'], - 'MongoDB\Driver\BulkWrite::insert' => ['void|MongoDB\BSON\ObjectId', 'document'=>'array|object'], - 'MongoDB\Driver\BulkWrite::update' => ['void', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array'], - 'MongoDB\Driver\Command::__construct' => ['void', 'document'=>'array|object'], - 'MongoDB\Driver\Cursor::__construct' => ['void', 'server'=>'Server', 'responseDocument'=>'string'], - 'MongoDB\Driver\Cursor::getId' => ['MongoDB\Driver\CursorId'], - 'MongoDB\Driver\Cursor::getServer' => ['MongoDB\Driver\Server'], - 'MongoDB\Driver\Cursor::isDead' => ['bool'], - 'MongoDB\Driver\Cursor::setTypeMap' => ['void', 'typemap'=>'array'], - 'MongoDB\Driver\Cursor::toArray' => ['array'], - 'MongoDB\Driver\CursorId::__construct' => ['void', 'id'=>'string'], - 'MongoDB\Driver\CursorId::__toString' => ['string'], - 'MongoDB\Driver\CursorId::serialize' => ['string'], - 'MongoDB\Driver\CursorId::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\Driver\Exception\RuntimeException::__clone' => ['void'], - 'MongoDB\Driver\Exception\RuntimeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?RuntimeException|?Throwable'], - 'MongoDB\Driver\Exception\RuntimeException::__toString' => ['string'], - 'MongoDB\Driver\Exception\RuntimeException::__wakeup' => ['void'], - 'MongoDB\Driver\Exception\RuntimeException::getCode' => ['int'], - 'MongoDB\Driver\Exception\RuntimeException::getFile' => ['string'], - 'MongoDB\Driver\Exception\RuntimeException::getLine' => ['int'], - 'MongoDB\Driver\Exception\RuntimeException::getMessage' => ['string'], - 'MongoDB\Driver\Exception\RuntimeException::getPrevious' => ['RuntimeException|Throwable'], - 'MongoDB\Driver\Exception\RuntimeException::getTrace' => ['list\',args?:array}>'], - 'MongoDB\Driver\Exception\RuntimeException::getTraceAsString' => ['string'], - 'MongoDB\Driver\Exception\WriteException::__clone' => ['void'], - 'MongoDB\Driver\Exception\WriteException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?RuntimeException|?Throwable'], - 'MongoDB\Driver\Exception\WriteException::__toString' => ['string'], - 'MongoDB\Driver\Exception\WriteException::__wakeup' => ['void'], - 'MongoDB\Driver\Exception\WriteException::getCode' => ['int'], - 'MongoDB\Driver\Exception\WriteException::getFile' => ['string'], - 'MongoDB\Driver\Exception\WriteException::getLine' => ['int'], - 'MongoDB\Driver\Exception\WriteException::getMessage' => ['string'], - 'MongoDB\Driver\Exception\WriteException::getPrevious' => ['RuntimeException|Throwable'], - 'MongoDB\Driver\Exception\WriteException::getTrace' => ['list\',args?:array}>'], - 'MongoDB\Driver\Exception\WriteException::getTraceAsString' => ['string'], - 'MongoDB\Driver\Exception\WriteException::getWriteResult' => ['MongoDB\Driver\WriteResult'], - 'MongoDB\Driver\Manager::__construct' => ['void', 'uri'=>'string', 'options='=>'array', 'driverOptions='=>'array'], - 'MongoDB\Driver\Manager::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'bulk'=>'MongoDB\Driver\BulkWrite', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], - 'MongoDB\Driver\Manager::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'readPreference='=>'MongoDB\Driver\ReadPreference'], - 'MongoDB\Driver\Manager::executeDelete' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'deleteOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], - 'MongoDB\Driver\Manager::executeInsert' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'document'=>'array|object', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], - 'MongoDB\Driver\Manager::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'query'=>'MongoDB\Driver\Query', 'readPreference='=>'MongoDB\Driver\ReadPreference'], - 'MongoDB\Driver\Manager::executeUpdate' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], - 'MongoDB\Driver\Manager::getReadConcern' => ['MongoDB\Driver\ReadConcern'], - 'MongoDB\Driver\Manager::getReadPreference' => ['MongoDB\Driver\ReadPreference'], - 'MongoDB\Driver\Manager::getServers' => ['MongoDB\Driver\Server[]'], - 'MongoDB\Driver\Manager::getWriteConcern' => ['MongoDB\Driver\WriteConcern'], - 'MongoDB\Driver\Manager::selectServer' => ['MongoDB\Driver\Server', 'readPreference'=>'MongoDB\Driver\ReadPreference'], - 'MongoDB\Driver\Query::__construct' => ['void', 'filter'=>'array|object', 'queryOptions='=>'array'], - 'MongoDB\Driver\ReadConcern::__construct' => ['void', 'level='=>'string'], - 'MongoDB\Driver\ReadConcern::bsonSerialize' => ['object'], - 'MongoDB\Driver\ReadConcern::getLevel' => ['?string'], - 'MongoDB\Driver\ReadConcern::isDefault' => ['bool'], - 'MongoDB\Driver\ReadConcern::serialize' => ['string'], - 'MongoDB\Driver\ReadConcern::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\Driver\ReadPreference::__construct' => ['void', 'mode'=>'string|int', 'tagSets='=>'array', 'options='=>'array'], - 'MongoDB\Driver\ReadPreference::bsonSerialize' => ['object'], - 'MongoDB\Driver\ReadPreference::getHedge' => ['object|null'], - 'MongoDB\Driver\ReadPreference::getMaxStalenessSeconds' => ['int'], - 'MongoDB\Driver\ReadPreference::getMode' => ['int'], - 'MongoDB\Driver\ReadPreference::getModeString' => ['string'], - 'MongoDB\Driver\ReadPreference::getTagSets' => ['array'], - 'MongoDB\Driver\ReadPreference::serialize' => ['string'], - 'MongoDB\Driver\ReadPreference::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\Driver\Server::__construct' => ['void', 'host'=>'string', 'port'=>'string', 'options='=>'array', 'driverOptions='=>'array'], - 'MongoDB\Driver\Server::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'zwrite'=>'BulkWrite'], - 'MongoDB\Driver\Server::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command'], - 'MongoDB\Driver\Server::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'zquery'=>'Query'], - 'MongoDB\Driver\Server::getHost' => ['string'], - 'MongoDB\Driver\Server::getInfo' => ['array'], - 'MongoDB\Driver\Server::getLatency' => ['int'], - 'MongoDB\Driver\Server::getPort' => ['int'], - 'MongoDB\Driver\Server::getState' => [''], - 'MongoDB\Driver\Server::getTags' => ['array'], - 'MongoDB\Driver\Server::getType' => ['int'], - 'MongoDB\Driver\Server::isArbiter' => ['bool'], - 'MongoDB\Driver\Server::isDelayed' => [''], - 'MongoDB\Driver\Server::isHidden' => ['bool'], - 'MongoDB\Driver\Server::isPassive' => ['bool'], - 'MongoDB\Driver\Server::isPrimary' => ['bool'], - 'MongoDB\Driver\Server::isSecondary' => ['bool'], - 'MongoDB\Driver\WriteConcern::__construct' => ['void', 'wstring'=>'string|int', 'wtimeout='=>'int', 'journal='=>'bool'], - 'MongoDB\Driver\WriteConcern::bsonSerialize' => ['object'], - 'MongoDB\Driver\WriteConcern::getJournal' => ['?bool'], - 'MongoDB\Driver\WriteConcern::getJurnal' => ['?bool'], - 'MongoDB\Driver\WriteConcern::getW' => ['int|null|string'], - 'MongoDB\Driver\WriteConcern::getWtimeout' => ['int'], - 'MongoDB\Driver\WriteConcern::isDefault' => ['bool'], - 'MongoDB\Driver\WriteConcern::serialize' => ['string'], - 'MongoDB\Driver\WriteConcern::unserialize' => ['void', 'serialized'=>'string'], - 'MongoDB\Driver\WriteConcernError::getCode' => ['int'], - 'MongoDB\Driver\WriteConcernError::getInfo' => ['mixed'], - 'MongoDB\Driver\WriteConcernError::getMessage' => ['string'], - 'MongoDB\Driver\WriteError::getCode' => ['int'], - 'MongoDB\Driver\WriteError::getIndex' => ['int'], - 'MongoDB\Driver\WriteError::getInfo' => ['mixed'], - 'MongoDB\Driver\WriteError::getMessage' => ['string'], - 'MongoDB\Driver\WriteException::getWriteResult' => [''], - 'MongoDB\Driver\WriteResult::getDeletedCount' => ['?int'], - 'MongoDB\Driver\WriteResult::getInfo' => [''], - 'MongoDB\Driver\WriteResult::getInsertedCount' => ['?int'], - 'MongoDB\Driver\WriteResult::getMatchedCount' => ['?int'], - 'MongoDB\Driver\WriteResult::getModifiedCount' => ['?int'], - 'MongoDB\Driver\WriteResult::getServer' => ['MongoDB\Driver\Server'], - 'MongoDB\Driver\WriteResult::getUpsertedCount' => ['?int'], - 'MongoDB\Driver\WriteResult::getUpsertedIds' => ['array'], - 'MongoDB\Driver\WriteResult::getWriteConcernError' => ['MongoDB\Driver\WriteConcernError|null'], - 'MongoDB\Driver\WriteResult::getWriteErrors' => ['MongoDB\Driver\WriteError[]'], - 'MongoDB\Driver\WriteResult::isAcknowledged' => ['bool'], - 'MongoDate::__construct' => ['void', 'second='=>'int', 'usecond='=>'int'], - 'MongoDate::__toString' => ['string'], - 'MongoDate::toDateTime' => ['DateTime'], - 'MongoDeleteBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], - 'MongoException::__clone' => ['void'], - 'MongoException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'MongoException::__toString' => ['string'], - 'MongoException::__wakeup' => ['void'], - 'MongoException::getCode' => ['int'], - 'MongoException::getFile' => ['string'], - 'MongoException::getLine' => ['int'], - 'MongoException::getMessage' => ['string'], - 'MongoException::getPrevious' => ['Exception|Throwable'], - 'MongoException::getTrace' => ['list\',args?:array}>'], - 'MongoException::getTraceAsString' => ['string'], - 'MongoGridFS::__construct' => ['void', 'db'=>'MongoDB', 'prefix='=>'string', 'chunks='=>'mixed'], - 'MongoGridFS::__get' => ['MongoCollection', 'name'=>'string'], - 'MongoGridFS::__toString' => ['string'], - 'MongoGridFS::aggregate' => ['array', 'pipeline'=>'array', 'op'=>'array', 'pipelineOperators'=>'array'], - 'MongoGridFS::aggregateCursor' => ['MongoCommandCursor', 'pipeline'=>'array', 'options'=>'array'], - 'MongoGridFS::batchInsert' => ['mixed', 'a'=>'array', 'options='=>'array'], - 'MongoGridFS::count' => ['int', 'query='=>'stdClass|array'], - 'MongoGridFS::createDBRef' => ['array', 'a'=>'array'], - 'MongoGridFS::createIndex' => ['array', 'keys'=>'array', 'options='=>'array'], - 'MongoGridFS::delete' => ['bool', 'id'=>'mixed'], - 'MongoGridFS::deleteIndex' => ['array', 'keys'=>'array|string'], - 'MongoGridFS::deleteIndexes' => ['array'], - 'MongoGridFS::distinct' => ['array|bool', 'key'=>'string', 'query='=>'?array'], - 'MongoGridFS::drop' => ['array'], - 'MongoGridFS::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'], - 'MongoGridFS::find' => ['MongoGridFSCursor', 'query='=>'array', 'fields='=>'array'], - 'MongoGridFS::findAndModify' => ['array', 'query'=>'array', 'update='=>'?array', 'fields='=>'?array', 'options='=>'?array'], - 'MongoGridFS::findOne' => ['?MongoGridFSFile', 'query='=>'mixed', 'fields='=>'mixed'], - 'MongoGridFS::get' => ['?MongoGridFSFile', 'id'=>'mixed'], - 'MongoGridFS::getDBRef' => ['array', 'ref'=>'array'], - 'MongoGridFS::getIndexInfo' => ['array'], - 'MongoGridFS::getName' => ['string'], - 'MongoGridFS::getReadPreference' => ['array'], - 'MongoGridFS::getSlaveOkay' => ['bool'], - 'MongoGridFS::group' => ['array', 'keys'=>'mixed', 'initial'=>'array', 'reduce'=>'MongoCode', 'condition='=>'array'], - 'MongoGridFS::insert' => ['array|bool', 'a'=>'array|object', 'options='=>'array'], - 'MongoGridFS::put' => ['mixed', 'filename'=>'string', 'extra='=>'array'], - 'MongoGridFS::remove' => ['bool', 'criteria='=>'array', 'options='=>'array'], - 'MongoGridFS::save' => ['array|bool', 'a'=>'array|object', 'options='=>'array'], - 'MongoGridFS::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags'=>'array'], - 'MongoGridFS::setSlaveOkay' => ['bool', 'ok='=>'bool'], - 'MongoGridFS::storeBytes' => ['mixed', 'bytes'=>'string', 'extra='=>'array', 'options='=>'array'], - 'MongoGridFS::storeFile' => ['mixed', 'filename'=>'string', 'extra='=>'array', 'options='=>'array'], - 'MongoGridFS::storeUpload' => ['mixed', 'name'=>'string', 'filename='=>'string'], - 'MongoGridFS::toIndexString' => ['string', 'keys'=>'mixed'], - 'MongoGridFS::update' => ['bool', 'criteria'=>'array', 'newobj'=>'array', 'options='=>'array'], - 'MongoGridFS::validate' => ['array', 'scan_data='=>'bool'], - 'MongoGridFSCursor::__construct' => ['void', 'gridfs'=>'MongoGridFS', 'connection'=>'resource', 'ns'=>'string', 'query'=>'array', 'fields'=>'array'], - 'MongoGridFSCursor::addOption' => ['MongoCursor', 'key'=>'string', 'value'=>'mixed'], - 'MongoGridFSCursor::awaitData' => ['MongoCursor', 'wait='=>'bool'], - 'MongoGridFSCursor::batchSize' => ['MongoCursor', 'batchSize'=>'int'], - 'MongoGridFSCursor::count' => ['int', 'all='=>'bool'], - 'MongoGridFSCursor::current' => ['MongoGridFSFile'], - 'MongoGridFSCursor::dead' => ['bool'], - 'MongoGridFSCursor::doQuery' => ['void'], - 'MongoGridFSCursor::explain' => ['array'], - 'MongoGridFSCursor::fields' => ['MongoCursor', 'f'=>'array'], - 'MongoGridFSCursor::getNext' => ['MongoGridFSFile'], - 'MongoGridFSCursor::getReadPreference' => ['array'], - 'MongoGridFSCursor::hasNext' => ['bool'], - 'MongoGridFSCursor::hint' => ['MongoCursor', 'key_pattern'=>'mixed'], - 'MongoGridFSCursor::immortal' => ['MongoCursor', 'liveForever='=>'bool'], - 'MongoGridFSCursor::info' => ['array'], - 'MongoGridFSCursor::key' => ['string'], - 'MongoGridFSCursor::limit' => ['MongoCursor', 'num'=>'int'], - 'MongoGridFSCursor::maxTimeMS' => ['MongoCursor', 'ms'=>'int'], - 'MongoGridFSCursor::next' => ['void'], - 'MongoGridFSCursor::partial' => ['MongoCursor', 'okay='=>'bool'], - 'MongoGridFSCursor::reset' => ['void'], - 'MongoGridFSCursor::rewind' => ['void'], - 'MongoGridFSCursor::setFlag' => ['MongoCursor', 'flag'=>'int', 'set='=>'bool'], - 'MongoGridFSCursor::setReadPreference' => ['MongoCursor', 'read_preference'=>'string', 'tags'=>'array'], - 'MongoGridFSCursor::skip' => ['MongoCursor', 'num'=>'int'], - 'MongoGridFSCursor::slaveOkay' => ['MongoCursor', 'okay='=>'bool'], - 'MongoGridFSCursor::snapshot' => ['MongoCursor'], - 'MongoGridFSCursor::sort' => ['MongoCursor', 'fields'=>'array'], - 'MongoGridFSCursor::tailable' => ['MongoCursor', 'tail='=>'bool'], - 'MongoGridFSCursor::timeout' => ['MongoCursor', 'ms'=>'int'], - 'MongoGridFSCursor::valid' => ['bool'], - 'MongoGridFSFile::getBytes' => ['string'], - 'MongoGridFSFile::getFilename' => ['string'], - 'MongoGridFSFile::getResource' => ['resource'], - 'MongoGridFSFile::getSize' => ['int'], - 'MongoGridFSFile::write' => ['int', 'filename='=>'string'], - 'MongoGridfsFile::__construct' => ['void', 'gridfs'=>'MongoGridFS', 'file'=>'array'], - 'MongoId::__construct' => ['void', 'id='=>'string|MongoId'], - 'MongoId::__set_state' => ['MongoId', 'props'=>'array'], - 'MongoId::__toString' => ['string'], - 'MongoId::getHostname' => ['string'], - 'MongoId::getInc' => ['int'], - 'MongoId::getPID' => ['int'], - 'MongoId::getTimestamp' => ['int'], - 'MongoId::isValid' => ['bool', 'value'=>'mixed'], - 'MongoInsertBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], - 'MongoInt32::__construct' => ['void', 'value'=>'string'], - 'MongoInt32::__toString' => ['string'], - 'MongoInt64::__construct' => ['void', 'value'=>'string'], - 'MongoInt64::__toString' => ['string'], - 'MongoLog::getCallback' => ['callable'], - 'MongoLog::getLevel' => ['int'], - 'MongoLog::getModule' => ['int'], - 'MongoLog::setCallback' => ['void', 'log_function'=>'callable'], - 'MongoLog::setLevel' => ['void', 'level'=>'int'], - 'MongoLog::setModule' => ['void', 'module'=>'int'], - 'MongoPool::getSize' => ['int'], - 'MongoPool::info' => ['array'], - 'MongoPool::setSize' => ['bool', 'size'=>'int'], - 'MongoRegex::__construct' => ['void', 'regex'=>'string'], - 'MongoRegex::__toString' => ['string'], - 'MongoResultException::__clone' => ['void'], - 'MongoResultException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'MongoResultException::__toString' => ['string'], - 'MongoResultException::__wakeup' => ['void'], - 'MongoResultException::getCode' => ['int'], - 'MongoResultException::getDocument' => ['array'], - 'MongoResultException::getFile' => ['string'], - 'MongoResultException::getLine' => ['int'], - 'MongoResultException::getMessage' => ['string'], - 'MongoResultException::getPrevious' => ['Exception|Throwable'], - 'MongoResultException::getTrace' => ['list\',args?:array}>'], - 'MongoResultException::getTraceAsString' => ['string'], - 'MongoTimestamp::__construct' => ['void', 'second='=>'int', 'inc='=>'int'], - 'MongoTimestamp::__toString' => ['string'], - 'MongoUpdateBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'write_options='=>'array'], - 'MongoUpdateBatch::add' => ['bool', 'item'=>'array'], - 'MongoUpdateBatch::execute' => ['array', 'write_options'=>'array'], - 'MongoWriteBatch::__construct' => ['void', 'collection'=>'MongoCollection', 'batch_type'=>'string', 'write_options'=>'array'], - 'MongoWriteBatch::add' => ['bool', 'item'=>'array'], - 'MongoWriteBatch::execute' => ['array', 'write_options'=>'array'], - 'MongoWriteConcernException::__clone' => ['void'], - 'MongoWriteConcernException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'MongoWriteConcernException::__toString' => ['string'], - 'MongoWriteConcernException::__wakeup' => ['void'], - 'MongoWriteConcernException::getCode' => ['int'], - 'MongoWriteConcernException::getDocument' => ['array'], - 'MongoWriteConcernException::getFile' => ['string'], - 'MongoWriteConcernException::getLine' => ['int'], - 'MongoWriteConcernException::getMessage' => ['string'], - 'MongoWriteConcernException::getPrevious' => ['Exception|Throwable'], - 'MongoWriteConcernException::getTrace' => ['list\',args?:array}>'], - 'MongoWriteConcernException::getTraceAsString' => ['string'], - 'MultipleIterator::__construct' => ['void', 'flags='=>'int'], - 'MultipleIterator::attachIterator' => ['void', 'iterator'=>'Iterator', 'infos='=>'string'], - 'MultipleIterator::containsIterator' => ['bool', 'iterator'=>'Iterator'], - 'MultipleIterator::countIterators' => ['int'], - 'MultipleIterator::current' => ['array|false'], - 'MultipleIterator::detachIterator' => ['void', 'iterator'=>'Iterator'], - 'MultipleIterator::getFlags' => ['int'], - 'MultipleIterator::key' => ['array'], - 'MultipleIterator::next' => ['void'], - 'MultipleIterator::rewind' => ['void'], - 'MultipleIterator::setFlags' => ['int', 'flags'=>'int'], - 'MultipleIterator::valid' => ['bool'], - 'Mutex::create' => ['long', 'lock='=>'bool'], - 'Mutex::destroy' => ['bool', 'mutex'=>'long'], - 'Mutex::lock' => ['bool', 'mutex'=>'long'], - 'Mutex::trylock' => ['bool', 'mutex'=>'long'], - 'Mutex::unlock' => ['bool', 'mutex'=>'long', 'destroy='=>'bool'], - 'MysqlndUhConnection::__construct' => ['void'], - 'MysqlndUhConnection::changeUser' => ['bool', 'connection'=>'mysqlnd_connection', 'user'=>'string', 'password'=>'string', 'database'=>'string', 'silent'=>'bool', 'passwd_len'=>'int'], - 'MysqlndUhConnection::charsetName' => ['string', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::close' => ['bool', 'connection'=>'mysqlnd_connection', 'close_type'=>'int'], - 'MysqlndUhConnection::connect' => ['bool', 'connection'=>'mysqlnd_connection', 'host'=>'string', 'use'=>'string', 'password'=>'string', 'database'=>'string', 'port'=>'int', 'socket'=>'string', 'mysql_flags'=>'int'], - 'MysqlndUhConnection::endPSession' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::escapeString' => ['string', 'connection'=>'mysqlnd_connection', 'escape_string'=>'string'], - 'MysqlndUhConnection::getAffectedRows' => ['int', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getErrorNumber' => ['int', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getErrorString' => ['string', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getFieldCount' => ['int', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getHostInformation' => ['string', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getLastInsertId' => ['int', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getLastMessage' => ['void', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getProtocolInformation' => ['string', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getServerInformation' => ['string', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getServerStatistics' => ['string', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getServerVersion' => ['int', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getSqlstate' => ['string', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getStatistics' => ['array', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getThreadId' => ['int', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::getWarningCount' => ['int', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::init' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::killConnection' => ['bool', 'connection'=>'mysqlnd_connection', 'pid'=>'int'], - 'MysqlndUhConnection::listFields' => ['array', 'connection'=>'mysqlnd_connection', 'table'=>'string', 'achtung_wild'=>'string'], - 'MysqlndUhConnection::listMethod' => ['void', 'connection'=>'mysqlnd_connection', 'query'=>'string', 'achtung_wild'=>'string', 'par1'=>'string'], - 'MysqlndUhConnection::moreResults' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::nextResult' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::ping' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::query' => ['bool', 'connection'=>'mysqlnd_connection', 'query'=>'string'], - 'MysqlndUhConnection::queryReadResultsetHeader' => ['bool', 'connection'=>'mysqlnd_connection', 'mysqlnd_stmt'=>'mysqlnd_statement'], - 'MysqlndUhConnection::reapQuery' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::refreshServer' => ['bool', 'connection'=>'mysqlnd_connection', 'options'=>'int'], - 'MysqlndUhConnection::restartPSession' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::selectDb' => ['bool', 'connection'=>'mysqlnd_connection', 'database'=>'string'], - 'MysqlndUhConnection::sendClose' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::sendQuery' => ['bool', 'connection'=>'mysqlnd_connection', 'query'=>'string'], - 'MysqlndUhConnection::serverDumpDebugInformation' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::setAutocommit' => ['bool', 'connection'=>'mysqlnd_connection', 'mode'=>'int'], - 'MysqlndUhConnection::setCharset' => ['bool', 'connection'=>'mysqlnd_connection', 'charset'=>'string'], - 'MysqlndUhConnection::setClientOption' => ['bool', 'connection'=>'mysqlnd_connection', 'option'=>'int', 'value'=>'int'], - 'MysqlndUhConnection::setServerOption' => ['void', 'connection'=>'mysqlnd_connection', 'option'=>'int'], - 'MysqlndUhConnection::shutdownServer' => ['void', 'MYSQLND_UH_RES_MYSQLND_NAME'=>'string', 'level'=>'string'], - 'MysqlndUhConnection::simpleCommand' => ['bool', 'connection'=>'mysqlnd_connection', 'command'=>'int', 'arg'=>'string', 'ok_packet'=>'int', 'silent'=>'bool', 'ignore_upsert_status'=>'bool'], - 'MysqlndUhConnection::simpleCommandHandleResponse' => ['bool', 'connection'=>'mysqlnd_connection', 'ok_packet'=>'int', 'silent'=>'bool', 'command'=>'int', 'ignore_upsert_status'=>'bool'], - 'MysqlndUhConnection::sslSet' => ['bool', 'connection'=>'mysqlnd_connection', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], - 'MysqlndUhConnection::stmtInit' => ['resource', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::storeResult' => ['resource', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::txCommit' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::txRollback' => ['bool', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhConnection::useResult' => ['resource', 'connection'=>'mysqlnd_connection'], - 'MysqlndUhPreparedStatement::__construct' => ['void'], - 'MysqlndUhPreparedStatement::execute' => ['bool', 'statement'=>'mysqlnd_prepared_statement'], - 'MysqlndUhPreparedStatement::prepare' => ['bool', 'statement'=>'mysqlnd_prepared_statement', 'query'=>'string'], - 'NoRewindIterator::__construct' => ['void', 'iterator'=>'Iterator'], - 'NoRewindIterator::current' => ['mixed'], - 'NoRewindIterator::getInnerIterator' => ['Iterator'], - 'NoRewindIterator::key' => ['mixed'], - 'NoRewindIterator::next' => ['void'], - 'NoRewindIterator::rewind' => ['void'], - 'NoRewindIterator::valid' => ['bool'], - 'Normalizer::getRawDecomposition' => ['string|null', 'input'=>'string'], - 'Normalizer::isNormalized' => ['bool', 'input'=>'string', 'form='=>'int'], - 'Normalizer::normalize' => ['string', 'input'=>'string', 'form='=>'int'], - 'NumberFormatter::__construct' => ['void', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], - 'NumberFormatter::create' => ['NumberFormatter|false', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], - 'NumberFormatter::format' => ['string|false', 'num'=>'', 'type='=>'int'], - 'NumberFormatter::formatCurrency' => ['string|false', 'num'=>'float', 'currency'=>'string'], - 'NumberFormatter::getAttribute' => ['int|false', 'attr'=>'int'], - 'NumberFormatter::getErrorCode' => ['int'], - 'NumberFormatter::getErrorMessage' => ['string'], - 'NumberFormatter::getLocale' => ['string', 'type='=>'int'], - 'NumberFormatter::getPattern' => ['string|false'], - 'NumberFormatter::getSymbol' => ['string|false', 'attr'=>'int'], - 'NumberFormatter::getTextAttribute' => ['string|false', 'attr'=>'int'], - 'NumberFormatter::parse' => ['float|false', 'string'=>'string', 'type='=>'int', '&rw_position='=>'int'], - 'NumberFormatter::parseCurrency' => ['float|false', 'string'=>'string', '&w_currency'=>'string', '&rw_position='=>'int'], - 'NumberFormatter::setAttribute' => ['bool', 'attr'=>'int', 'value'=>''], - 'NumberFormatter::setPattern' => ['bool', 'pattern'=>'string'], - 'NumberFormatter::setSymbol' => ['bool', 'attr'=>'int', 'symbol'=>'string'], - 'NumberFormatter::setTextAttribute' => ['bool', 'attr'=>'int', 'value'=>'string'], - 'OAuth::__construct' => ['void', 'consumer_key'=>'string', 'consumer_secret'=>'string', 'signature_method='=>'string', 'auth_type='=>'int'], - 'OAuth::__destruct' => ['void'], - 'OAuth::disableDebug' => ['bool'], - 'OAuth::disableRedirects' => ['bool'], - 'OAuth::disableSSLChecks' => ['bool'], - 'OAuth::enableDebug' => ['bool'], - 'OAuth::enableRedirects' => ['bool'], - 'OAuth::enableSSLChecks' => ['bool'], - 'OAuth::fetch' => ['mixed', 'protected_resource_url'=>'string', 'extra_parameters='=>'array', 'http_method='=>'string', 'http_headers='=>'array'], - 'OAuth::generateSignature' => ['string', 'http_method'=>'string', 'url'=>'string', 'extra_parameters='=>'mixed'], - 'OAuth::getAccessToken' => ['array|false', 'access_token_url'=>'string', 'auth_session_handle='=>'string', 'verifier_token='=>'string', 'http_method='=>'string'], - 'OAuth::getCAPath' => ['array'], - 'OAuth::getLastResponse' => ['string'], - 'OAuth::getLastResponseHeaders' => ['string|false'], - 'OAuth::getLastResponseInfo' => ['array'], - 'OAuth::getRequestHeader' => ['string|false', 'http_method'=>'string', 'url'=>'string', 'extra_parameters='=>'mixed'], - 'OAuth::getRequestToken' => ['array|false', 'request_token_url'=>'string', 'callback_url='=>'string', 'http_method='=>'string'], - 'OAuth::setAuthType' => ['bool', 'auth_type'=>'int'], - 'OAuth::setCAPath' => ['mixed', 'ca_path='=>'string', 'ca_info='=>'string'], - 'OAuth::setNonce' => ['mixed', 'nonce'=>'string'], - 'OAuth::setRSACertificate' => ['mixed', 'cert'=>'string'], - 'OAuth::setRequestEngine' => ['void', 'reqengine'=>'int'], - 'OAuth::setSSLChecks' => ['bool', 'sslcheck'=>'int'], - 'OAuth::setTimeout' => ['void', 'timeout'=>'int'], - 'OAuth::setTimestamp' => ['mixed', 'timestamp'=>'string'], - 'OAuth::setToken' => ['bool', 'token'=>'string', 'token_secret'=>'string'], - 'OAuth::setVersion' => ['bool', 'version'=>'string'], - 'OAuthProvider::__construct' => ['void', 'params_array='=>'array'], - 'OAuthProvider::addRequiredParameter' => ['bool', 'req_params'=>'string'], - 'OAuthProvider::callTimestampNonceHandler' => ['void'], - 'OAuthProvider::callconsumerHandler' => ['void'], - 'OAuthProvider::calltokenHandler' => ['void'], - 'OAuthProvider::checkOAuthRequest' => ['void', 'uri='=>'string', 'method='=>'string'], - 'OAuthProvider::consumerHandler' => ['void', 'callback_function'=>'callable'], - 'OAuthProvider::generateToken' => ['string', 'size'=>'int', 'strong='=>'bool'], - 'OAuthProvider::is2LeggedEndpoint' => ['void', 'params_array'=>'mixed'], - 'OAuthProvider::isRequestTokenEndpoint' => ['void', 'will_issue_request_token'=>'bool'], - 'OAuthProvider::removeRequiredParameter' => ['bool', 'req_params'=>'string'], - 'OAuthProvider::reportProblem' => ['string', 'oauthexception'=>'string', 'send_headers='=>'bool'], - 'OAuthProvider::setParam' => ['bool', 'param_key'=>'string', 'param_val='=>'mixed'], - 'OAuthProvider::setRequestTokenPath' => ['bool', 'path'=>'string'], - 'OAuthProvider::timestampNonceHandler' => ['void', 'callback_function'=>'callable'], - 'OAuthProvider::tokenHandler' => ['void', 'callback_function'=>'callable'], - 'OCICollection::append' => ['bool', 'value'=>'mixed'], - 'OCICollection::assign' => ['bool', 'from'=>'OCI_Collection'], - 'OCICollection::assignElem' => ['bool', 'index'=>'int', 'value'=>'mixed'], - 'OCICollection::free' => ['bool'], - 'OCICollection::getElem' => ['mixed', 'index'=>'int'], - 'OCICollection::max' => ['int|false'], - 'OCICollection::size' => ['int|false'], - 'OCICollection::trim' => ['bool', 'num'=>'int'], - 'OCILob::append' => ['bool', 'lob_from'=>'OCILob'], - 'OCILob::close' => ['bool'], - 'OCILob::eof' => ['bool'], - 'OCILob::erase' => ['int|false', 'offset='=>'int', 'length='=>'int'], - 'OCILob::export' => ['bool', 'filename'=>'string', 'start='=>'int', 'length='=>'int'], - 'OCILob::flush' => ['bool', 'flag='=>'int'], - 'OCILob::free' => ['bool'], - 'OCILob::getbuffering' => ['bool'], - 'OCILob::import' => ['bool', 'filename'=>'string'], - 'OCILob::load' => ['string|false'], - 'OCILob::read' => ['string|false', 'length'=>'int'], - 'OCILob::rewind' => ['bool'], - 'OCILob::save' => ['bool', 'data'=>'string', 'offset='=>'int'], - 'OCILob::savefile' => ['bool', 'filename'=>''], - 'OCILob::seek' => ['bool', 'offset'=>'int', 'whence='=>'int'], - 'OCILob::setbuffering' => ['bool', 'on_off'=>'bool'], - 'OCILob::size' => ['int|false'], - 'OCILob::tell' => ['int|false'], - 'OCILob::truncate' => ['bool', 'length='=>'int'], - 'OCILob::write' => ['int|false', 'data'=>'string', 'length='=>'int'], - 'OCILob::writeTemporary' => ['bool', 'data'=>'string', 'lob_type='=>'int'], - 'OCILob::writetofile' => ['bool', 'filename'=>'', 'start'=>'', 'length'=>''], - 'OutOfBoundsException::__clone' => ['void'], - 'OutOfBoundsException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OutOfBoundsException'], - 'OutOfBoundsException::__toString' => ['string'], - 'OutOfBoundsException::getCode' => ['int'], - 'OutOfBoundsException::getFile' => ['string'], - 'OutOfBoundsException::getLine' => ['int'], - 'OutOfBoundsException::getMessage' => ['string'], - 'OutOfBoundsException::getPrevious' => ['Throwable|OutOfBoundsException|null'], - 'OutOfBoundsException::getTrace' => ['list\',args?:array}>'], - 'OutOfBoundsException::getTraceAsString' => ['string'], - 'OutOfRangeException::__clone' => ['void'], - 'OutOfRangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OutOfRangeException'], - 'OutOfRangeException::__toString' => ['string'], - 'OutOfRangeException::getCode' => ['int'], - 'OutOfRangeException::getFile' => ['string'], - 'OutOfRangeException::getLine' => ['int'], - 'OutOfRangeException::getMessage' => ['string'], - 'OutOfRangeException::getPrevious' => ['Throwable|OutOfRangeException|null'], - 'OutOfRangeException::getTrace' => ['list\',args?:array}>'], - 'OutOfRangeException::getTraceAsString' => ['string'], - 'OuterIterator::current' => ['mixed'], - 'OuterIterator::getInnerIterator' => ['Iterator'], - 'OuterIterator::key' => ['int|string'], - 'OuterIterator::next' => ['void'], - 'OuterIterator::rewind' => ['void'], - 'OuterIterator::valid' => ['bool'], - 'OverflowException::__clone' => ['void'], - 'OverflowException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OverflowException'], - 'OverflowException::__toString' => ['string'], - 'OverflowException::getCode' => ['int'], - 'OverflowException::getFile' => ['string'], - 'OverflowException::getLine' => ['int'], - 'OverflowException::getMessage' => ['string'], - 'OverflowException::getPrevious' => ['Throwable|OverflowException|null'], - 'OverflowException::getTrace' => ['list\',args?:array}>'], - 'OverflowException::getTraceAsString' => ['string'], - 'OwsrequestObj::__construct' => ['void'], - 'OwsrequestObj::addParameter' => ['int', 'name'=>'string', 'value'=>'string'], - 'OwsrequestObj::getName' => ['string', 'index'=>'int'], - 'OwsrequestObj::getValue' => ['string', 'index'=>'int'], - 'OwsrequestObj::getValueByName' => ['string', 'name'=>'string'], - 'OwsrequestObj::loadParams' => ['int'], - 'OwsrequestObj::setParameter' => ['int', 'name'=>'string', 'value'=>'string'], - 'PDF_activate_item' => ['bool', 'pdfdoc'=>'resource', 'id'=>'int'], - 'PDF_add_launchlink' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], - 'PDF_add_locallink' => ['bool', 'pdfdoc'=>'resource', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'page'=>'int', 'dest'=>'string'], - 'PDF_add_nameddest' => ['bool', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], - 'PDF_add_note' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], - 'PDF_add_pdflink' => ['bool', 'pdfdoc'=>'resource', 'bottom_left_x'=>'float', 'bottom_left_y'=>'float', 'up_right_x'=>'float', 'up_right_y'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], - 'PDF_add_table_cell' => ['int', 'pdfdoc'=>'resource', 'table'=>'int', 'column'=>'int', 'row'=>'int', 'text'=>'string', 'optlist'=>'string'], - 'PDF_add_textflow' => ['int', 'pdfdoc'=>'resource', 'textflow'=>'int', 'text'=>'string', 'optlist'=>'string'], - 'PDF_add_thumbnail' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int'], - 'PDF_add_weblink' => ['bool', 'pdfdoc'=>'resource', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'url'=>'string'], - 'PDF_arc' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], - 'PDF_arcn' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], - 'PDF_attach_file' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'description'=>'string', 'author'=>'string', 'mimetype'=>'string', 'icon'=>'string'], - 'PDF_begin_document' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string'], - 'PDF_begin_font' => ['bool', 'pdfdoc'=>'resource', 'filename'=>'string', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float', 'optlist'=>'string'], - 'PDF_begin_glyph' => ['bool', 'pdfdoc'=>'resource', 'glyphname'=>'string', 'wx'=>'float', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float'], - 'PDF_begin_item' => ['int', 'pdfdoc'=>'resource', 'tag'=>'string', 'optlist'=>'string'], - 'PDF_begin_layer' => ['bool', 'pdfdoc'=>'resource', 'layer'=>'int'], - 'PDF_begin_page' => ['bool', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float'], - 'PDF_begin_page_ext' => ['bool', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], - 'PDF_begin_pattern' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], - 'PDF_begin_template' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float'], - 'PDF_begin_template_ext' => ['int', 'pdfdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], - 'PDF_circle' => ['bool', 'pdfdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'r'=>'float'], - 'PDF_clip' => ['bool', 'p'=>'resource'], - 'PDF_close' => ['bool', 'p'=>'resource'], - 'PDF_close_image' => ['bool', 'p'=>'resource', 'image'=>'int'], - 'PDF_close_pdi' => ['bool', 'p'=>'resource', 'doc'=>'int'], - 'PDF_close_pdi_page' => ['bool', 'p'=>'resource', 'page'=>'int'], - 'PDF_closepath' => ['bool', 'p'=>'resource'], - 'PDF_closepath_fill_stroke' => ['bool', 'p'=>'resource'], - 'PDF_closepath_stroke' => ['bool', 'p'=>'resource'], - 'PDF_concat' => ['bool', 'p'=>'resource', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], - 'PDF_continue_text' => ['bool', 'p'=>'resource', 'text'=>'string'], - 'PDF_create_3dview' => ['int', 'pdfdoc'=>'resource', 'username'=>'string', 'optlist'=>'string'], - 'PDF_create_action' => ['int', 'pdfdoc'=>'resource', 'type'=>'string', 'optlist'=>'string'], - 'PDF_create_annotation' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'type'=>'string', 'optlist'=>'string'], - 'PDF_create_bookmark' => ['int', 'pdfdoc'=>'resource', 'text'=>'string', 'optlist'=>'string'], - 'PDF_create_field' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'name'=>'string', 'type'=>'string', 'optlist'=>'string'], - 'PDF_create_fieldgroup' => ['bool', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], - 'PDF_create_gstate' => ['int', 'pdfdoc'=>'resource', 'optlist'=>'string'], - 'PDF_create_pvf' => ['bool', 'pdfdoc'=>'resource', 'filename'=>'string', 'data'=>'string', 'optlist'=>'string'], - 'PDF_create_textflow' => ['int', 'pdfdoc'=>'resource', 'text'=>'string', 'optlist'=>'string'], - 'PDF_curveto' => ['bool', 'p'=>'resource', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], - 'PDF_define_layer' => ['int', 'pdfdoc'=>'resource', 'name'=>'string', 'optlist'=>'string'], - 'PDF_delete' => ['bool', 'pdfdoc'=>'resource'], - 'PDF_delete_pvf' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string'], - 'PDF_delete_table' => ['bool', 'pdfdoc'=>'resource', 'table'=>'int', 'optlist'=>'string'], - 'PDF_delete_textflow' => ['bool', 'pdfdoc'=>'resource', 'textflow'=>'int'], - 'PDF_encoding_set_char' => ['bool', 'pdfdoc'=>'resource', 'encoding'=>'string', 'slot'=>'int', 'glyphname'=>'string', 'uv'=>'int'], - 'PDF_end_document' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], - 'PDF_end_font' => ['bool', 'pdfdoc'=>'resource'], - 'PDF_end_glyph' => ['bool', 'pdfdoc'=>'resource'], - 'PDF_end_item' => ['bool', 'pdfdoc'=>'resource', 'id'=>'int'], - 'PDF_end_layer' => ['bool', 'pdfdoc'=>'resource'], - 'PDF_end_page' => ['bool', 'p'=>'resource'], - 'PDF_end_page_ext' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], - 'PDF_end_pattern' => ['bool', 'p'=>'resource'], - 'PDF_end_template' => ['bool', 'p'=>'resource'], - 'PDF_endpath' => ['bool', 'p'=>'resource'], - 'PDF_fill' => ['bool', 'p'=>'resource'], - 'PDF_fill_imageblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'image'=>'int', 'optlist'=>'string'], - 'PDF_fill_pdfblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'contents'=>'int', 'optlist'=>'string'], - 'PDF_fill_stroke' => ['bool', 'p'=>'resource'], - 'PDF_fill_textblock' => ['int', 'pdfdoc'=>'resource', 'page'=>'int', 'blockname'=>'string', 'text'=>'string', 'optlist'=>'string'], - 'PDF_findfont' => ['int', 'p'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'embed'=>'int'], - 'PDF_fit_image' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], - 'PDF_fit_pdi_page' => ['bool', 'pdfdoc'=>'resource', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], - 'PDF_fit_table' => ['string', 'pdfdoc'=>'resource', 'table'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], - 'PDF_fit_textflow' => ['string', 'pdfdoc'=>'resource', 'textflow'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], - 'PDF_fit_textline' => ['bool', 'pdfdoc'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], - 'PDF_get_apiname' => ['string', 'pdfdoc'=>'resource'], - 'PDF_get_buffer' => ['string', 'p'=>'resource'], - 'PDF_get_errmsg' => ['string', 'pdfdoc'=>'resource'], - 'PDF_get_errnum' => ['int', 'pdfdoc'=>'resource'], - 'PDF_get_majorversion' => ['int'], - 'PDF_get_minorversion' => ['int'], - 'PDF_get_parameter' => ['string', 'p'=>'resource', 'key'=>'string', 'modifier'=>'float'], - 'PDF_get_pdi_parameter' => ['string', 'p'=>'resource', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], - 'PDF_get_pdi_value' => ['float', 'p'=>'resource', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], - 'PDF_get_value' => ['float', 'p'=>'resource', 'key'=>'string', 'modifier'=>'float'], - 'PDF_info_font' => ['float', 'pdfdoc'=>'resource', 'font'=>'int', 'keyword'=>'string', 'optlist'=>'string'], - 'PDF_info_matchbox' => ['float', 'pdfdoc'=>'resource', 'boxname'=>'string', 'num'=>'int', 'keyword'=>'string'], - 'PDF_info_table' => ['float', 'pdfdoc'=>'resource', 'table'=>'int', 'keyword'=>'string'], - 'PDF_info_textflow' => ['float', 'pdfdoc'=>'resource', 'textflow'=>'int', 'keyword'=>'string'], - 'PDF_info_textline' => ['float', 'pdfdoc'=>'resource', 'text'=>'string', 'keyword'=>'string', 'optlist'=>'string'], - 'PDF_initgraphics' => ['bool', 'p'=>'resource'], - 'PDF_lineto' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], - 'PDF_load_3ddata' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string'], - 'PDF_load_font' => ['int', 'pdfdoc'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'optlist'=>'string'], - 'PDF_load_iccprofile' => ['int', 'pdfdoc'=>'resource', 'profilename'=>'string', 'optlist'=>'string'], - 'PDF_load_image' => ['int', 'pdfdoc'=>'resource', 'imagetype'=>'string', 'filename'=>'string', 'optlist'=>'string'], - 'PDF_makespotcolor' => ['int', 'p'=>'resource', 'spotname'=>'string'], - 'PDF_moveto' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], - 'PDF_new' => ['resource'], - 'PDF_open_ccitt' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'bitreverse'=>'int', 'k'=>'int', 'blackls1'=>'int'], - 'PDF_open_file' => ['bool', 'p'=>'resource', 'filename'=>'string'], - 'PDF_open_image' => ['int', 'p'=>'resource', 'imagetype'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], - 'PDF_open_image_file' => ['int', 'p'=>'resource', 'imagetype'=>'string', 'filename'=>'string', 'stringparam'=>'string', 'intparam'=>'int'], - 'PDF_open_memory_image' => ['int', 'p'=>'resource', 'image'=>'resource'], - 'PDF_open_pdi' => ['int', 'pdfdoc'=>'resource', 'filename'=>'string', 'optlist'=>'string', 'length'=>'int'], - 'PDF_open_pdi_document' => ['int', 'p'=>'resource', 'filename'=>'string', 'optlist'=>'string'], - 'PDF_open_pdi_page' => ['int', 'p'=>'resource', 'doc'=>'int', 'pagenumber'=>'int', 'optlist'=>'string'], - 'PDF_pcos_get_number' => ['float', 'p'=>'resource', 'doc'=>'int', 'path'=>'string'], - 'PDF_pcos_get_stream' => ['string', 'p'=>'resource', 'doc'=>'int', 'optlist'=>'string', 'path'=>'string'], - 'PDF_pcos_get_string' => ['string', 'p'=>'resource', 'doc'=>'int', 'path'=>'string'], - 'PDF_place_image' => ['bool', 'pdfdoc'=>'resource', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], - 'PDF_place_pdi_page' => ['bool', 'pdfdoc'=>'resource', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'sx'=>'float', 'sy'=>'float'], - 'PDF_process_pdi' => ['int', 'pdfdoc'=>'resource', 'doc'=>'int', 'page'=>'int', 'optlist'=>'string'], - 'PDF_rect' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], - 'PDF_restore' => ['bool', 'p'=>'resource'], - 'PDF_resume_page' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], - 'PDF_rotate' => ['bool', 'p'=>'resource', 'phi'=>'float'], - 'PDF_save' => ['bool', 'p'=>'resource'], - 'PDF_scale' => ['bool', 'p'=>'resource', 'sx'=>'float', 'sy'=>'float'], - 'PDF_set_border_color' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'PDF_set_border_dash' => ['bool', 'pdfdoc'=>'resource', 'black'=>'float', 'white'=>'float'], - 'PDF_set_border_style' => ['bool', 'pdfdoc'=>'resource', 'style'=>'string', 'width'=>'float'], - 'PDF_set_gstate' => ['bool', 'pdfdoc'=>'resource', 'gstate'=>'int'], - 'PDF_set_info' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], - 'PDF_set_layer_dependency' => ['bool', 'pdfdoc'=>'resource', 'type'=>'string', 'optlist'=>'string'], - 'PDF_set_parameter' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], - 'PDF_set_text_pos' => ['bool', 'p'=>'resource', 'x'=>'float', 'y'=>'float'], - 'PDF_set_value' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'float'], - 'PDF_setcolor' => ['bool', 'p'=>'resource', 'fstype'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], - 'PDF_setdash' => ['bool', 'pdfdoc'=>'resource', 'b'=>'float', 'w'=>'float'], - 'PDF_setdashpattern' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], - 'PDF_setflat' => ['bool', 'pdfdoc'=>'resource', 'flatness'=>'float'], - 'PDF_setfont' => ['bool', 'pdfdoc'=>'resource', 'font'=>'int', 'fontsize'=>'float'], - 'PDF_setgray' => ['bool', 'p'=>'resource', 'g'=>'float'], - 'PDF_setgray_fill' => ['bool', 'p'=>'resource', 'g'=>'float'], - 'PDF_setgray_stroke' => ['bool', 'p'=>'resource', 'g'=>'float'], - 'PDF_setlinecap' => ['bool', 'p'=>'resource', 'linecap'=>'int'], - 'PDF_setlinejoin' => ['bool', 'p'=>'resource', 'value'=>'int'], - 'PDF_setlinewidth' => ['bool', 'p'=>'resource', 'width'=>'float'], - 'PDF_setmatrix' => ['bool', 'p'=>'resource', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], - 'PDF_setmiterlimit' => ['bool', 'pdfdoc'=>'resource', 'miter'=>'float'], - 'PDF_setrgbcolor' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'PDF_setrgbcolor_fill' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'PDF_setrgbcolor_stroke' => ['bool', 'p'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'PDF_shading' => ['int', 'pdfdoc'=>'resource', 'shtype'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], - 'PDF_shading_pattern' => ['int', 'pdfdoc'=>'resource', 'shading'=>'int', 'optlist'=>'string'], - 'PDF_shfill' => ['bool', 'pdfdoc'=>'resource', 'shading'=>'int'], - 'PDF_show' => ['bool', 'pdfdoc'=>'resource', 'text'=>'string'], - 'PDF_show_boxed' => ['int', 'p'=>'resource', 'text'=>'string', 'left'=>'float', 'top'=>'float', 'width'=>'float', 'height'=>'float', 'mode'=>'string', 'feature'=>'string'], - 'PDF_show_xy' => ['bool', 'p'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float'], - 'PDF_skew' => ['bool', 'p'=>'resource', 'alpha'=>'float', 'beta'=>'float'], - 'PDF_stringwidth' => ['float', 'p'=>'resource', 'text'=>'string', 'font'=>'int', 'fontsize'=>'float'], - 'PDF_stroke' => ['bool', 'p'=>'resource'], - 'PDF_suspend_page' => ['bool', 'pdfdoc'=>'resource', 'optlist'=>'string'], - 'PDF_translate' => ['bool', 'p'=>'resource', 'tx'=>'float', 'ty'=>'float'], - 'PDF_utf16_to_utf8' => ['string', 'pdfdoc'=>'resource', 'utf16string'=>'string'], - 'PDF_utf32_to_utf16' => ['string', 'pdfdoc'=>'resource', 'utf32string'=>'string', 'ordering'=>'string'], - 'PDF_utf8_to_utf16' => ['string', 'pdfdoc'=>'resource', 'utf8string'=>'string', 'ordering'=>'string'], - 'PDFlib::activate_item' => ['bool', 'id'=>''], - 'PDFlib::add_launchlink' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], - 'PDFlib::add_locallink' => ['bool', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'page'=>'int', 'dest'=>'string'], - 'PDFlib::add_nameddest' => ['bool', 'name'=>'string', 'optlist'=>'string'], - 'PDFlib::add_note' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], - 'PDFlib::add_pdflink' => ['bool', 'bottom_left_x'=>'float', 'bottom_left_y'=>'float', 'up_right_x'=>'float', 'up_right_y'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], - 'PDFlib::add_table_cell' => ['int', 'table'=>'int', 'column'=>'int', 'row'=>'int', 'text'=>'string', 'optlist'=>'string'], - 'PDFlib::add_textflow' => ['int', 'textflow'=>'int', 'text'=>'string', 'optlist'=>'string'], - 'PDFlib::add_thumbnail' => ['bool', 'image'=>'int'], - 'PDFlib::add_weblink' => ['bool', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'url'=>'string'], - 'PDFlib::arc' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], - 'PDFlib::arcn' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'alpha'=>'float', 'beta'=>'float'], - 'PDFlib::attach_file' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'description'=>'string', 'author'=>'string', 'mimetype'=>'string', 'icon'=>'string'], - 'PDFlib::begin_document' => ['int', 'filename'=>'string', 'optlist'=>'string'], - 'PDFlib::begin_font' => ['bool', 'filename'=>'string', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float', 'optlist'=>'string'], - 'PDFlib::begin_glyph' => ['bool', 'glyphname'=>'string', 'wx'=>'float', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float'], - 'PDFlib::begin_item' => ['int', 'tag'=>'string', 'optlist'=>'string'], - 'PDFlib::begin_layer' => ['bool', 'layer'=>'int'], - 'PDFlib::begin_page' => ['bool', 'width'=>'float', 'height'=>'float'], - 'PDFlib::begin_page_ext' => ['bool', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], - 'PDFlib::begin_pattern' => ['int', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], - 'PDFlib::begin_template' => ['int', 'width'=>'float', 'height'=>'float'], - 'PDFlib::begin_template_ext' => ['int', 'width'=>'float', 'height'=>'float', 'optlist'=>'string'], - 'PDFlib::circle' => ['bool', 'x'=>'float', 'y'=>'float', 'r'=>'float'], - 'PDFlib::clip' => ['bool'], - 'PDFlib::close' => ['bool'], - 'PDFlib::close_image' => ['bool', 'image'=>'int'], - 'PDFlib::close_pdi' => ['bool', 'doc'=>'int'], - 'PDFlib::close_pdi_page' => ['bool', 'page'=>'int'], - 'PDFlib::closepath' => ['bool'], - 'PDFlib::closepath_fill_stroke' => ['bool'], - 'PDFlib::closepath_stroke' => ['bool'], - 'PDFlib::concat' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], - 'PDFlib::continue_text' => ['bool', 'text'=>'string'], - 'PDFlib::create_3dview' => ['int', 'username'=>'string', 'optlist'=>'string'], - 'PDFlib::create_action' => ['int', 'type'=>'string', 'optlist'=>'string'], - 'PDFlib::create_annotation' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'type'=>'string', 'optlist'=>'string'], - 'PDFlib::create_bookmark' => ['int', 'text'=>'string', 'optlist'=>'string'], - 'PDFlib::create_field' => ['bool', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'name'=>'string', 'type'=>'string', 'optlist'=>'string'], - 'PDFlib::create_fieldgroup' => ['bool', 'name'=>'string', 'optlist'=>'string'], - 'PDFlib::create_gstate' => ['int', 'optlist'=>'string'], - 'PDFlib::create_pvf' => ['bool', 'filename'=>'string', 'data'=>'string', 'optlist'=>'string'], - 'PDFlib::create_textflow' => ['int', 'text'=>'string', 'optlist'=>'string'], - 'PDFlib::curveto' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], - 'PDFlib::define_layer' => ['int', 'name'=>'string', 'optlist'=>'string'], - 'PDFlib::delete' => ['bool'], - 'PDFlib::delete_pvf' => ['int', 'filename'=>'string'], - 'PDFlib::delete_table' => ['bool', 'table'=>'int', 'optlist'=>'string'], - 'PDFlib::delete_textflow' => ['bool', 'textflow'=>'int'], - 'PDFlib::encoding_set_char' => ['bool', 'encoding'=>'string', 'slot'=>'int', 'glyphname'=>'string', 'uv'=>'int'], - 'PDFlib::end_document' => ['bool', 'optlist'=>'string'], - 'PDFlib::end_font' => ['bool'], - 'PDFlib::end_glyph' => ['bool'], - 'PDFlib::end_item' => ['bool', 'id'=>'int'], - 'PDFlib::end_layer' => ['bool'], - 'PDFlib::end_page' => ['bool', 'p'=>''], - 'PDFlib::end_page_ext' => ['bool', 'optlist'=>'string'], - 'PDFlib::end_pattern' => ['bool', 'p'=>''], - 'PDFlib::end_template' => ['bool', 'p'=>''], - 'PDFlib::endpath' => ['bool', 'p'=>''], - 'PDFlib::fill' => ['bool'], - 'PDFlib::fill_imageblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'image'=>'int', 'optlist'=>'string'], - 'PDFlib::fill_pdfblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'contents'=>'int', 'optlist'=>'string'], - 'PDFlib::fill_stroke' => ['bool'], - 'PDFlib::fill_textblock' => ['int', 'page'=>'int', 'blockname'=>'string', 'text'=>'string', 'optlist'=>'string'], - 'PDFlib::findfont' => ['int', 'fontname'=>'string', 'encoding'=>'string', 'embed'=>'int'], - 'PDFlib::fit_image' => ['bool', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], - 'PDFlib::fit_pdi_page' => ['bool', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], - 'PDFlib::fit_table' => ['string', 'table'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], - 'PDFlib::fit_textflow' => ['string', 'textflow'=>'int', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'optlist'=>'string'], - 'PDFlib::fit_textline' => ['bool', 'text'=>'string', 'x'=>'float', 'y'=>'float', 'optlist'=>'string'], - 'PDFlib::get_apiname' => ['string'], - 'PDFlib::get_buffer' => ['string'], - 'PDFlib::get_errmsg' => ['string'], - 'PDFlib::get_errnum' => ['int'], - 'PDFlib::get_majorversion' => ['int'], - 'PDFlib::get_minorversion' => ['int'], - 'PDFlib::get_parameter' => ['string', 'key'=>'string', 'modifier'=>'float'], - 'PDFlib::get_pdi_parameter' => ['string', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], - 'PDFlib::get_pdi_value' => ['float', 'key'=>'string', 'doc'=>'int', 'page'=>'int', 'reserved'=>'int'], - 'PDFlib::get_value' => ['float', 'key'=>'string', 'modifier'=>'float'], - 'PDFlib::info_font' => ['float', 'font'=>'int', 'keyword'=>'string', 'optlist'=>'string'], - 'PDFlib::info_matchbox' => ['float', 'boxname'=>'string', 'num'=>'int', 'keyword'=>'string'], - 'PDFlib::info_table' => ['float', 'table'=>'int', 'keyword'=>'string'], - 'PDFlib::info_textflow' => ['float', 'textflow'=>'int', 'keyword'=>'string'], - 'PDFlib::info_textline' => ['float', 'text'=>'string', 'keyword'=>'string', 'optlist'=>'string'], - 'PDFlib::initgraphics' => ['bool'], - 'PDFlib::lineto' => ['bool', 'x'=>'float', 'y'=>'float'], - 'PDFlib::load_3ddata' => ['int', 'filename'=>'string', 'optlist'=>'string'], - 'PDFlib::load_font' => ['int', 'fontname'=>'string', 'encoding'=>'string', 'optlist'=>'string'], - 'PDFlib::load_iccprofile' => ['int', 'profilename'=>'string', 'optlist'=>'string'], - 'PDFlib::load_image' => ['int', 'imagetype'=>'string', 'filename'=>'string', 'optlist'=>'string'], - 'PDFlib::makespotcolor' => ['int', 'spotname'=>'string'], - 'PDFlib::moveto' => ['bool', 'x'=>'float', 'y'=>'float'], - 'PDFlib::open_ccitt' => ['int', 'filename'=>'string', 'width'=>'int', 'height'=>'int', 'BitReverse'=>'int', 'k'=>'int', 'Blackls1'=>'int'], - 'PDFlib::open_file' => ['bool', 'filename'=>'string'], - 'PDFlib::open_image' => ['int', 'imagetype'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], - 'PDFlib::open_image_file' => ['int', 'imagetype'=>'string', 'filename'=>'string', 'stringparam'=>'string', 'intparam'=>'int'], - 'PDFlib::open_memory_image' => ['int', 'image'=>'resource'], - 'PDFlib::open_pdi' => ['int', 'filename'=>'string', 'optlist'=>'string', 'length'=>'int'], - 'PDFlib::open_pdi_document' => ['int', 'filename'=>'string', 'optlist'=>'string'], - 'PDFlib::open_pdi_page' => ['int', 'doc'=>'int', 'pagenumber'=>'int', 'optlist'=>'string'], - 'PDFlib::pcos_get_number' => ['float', 'doc'=>'int', 'path'=>'string'], - 'PDFlib::pcos_get_stream' => ['string', 'doc'=>'int', 'optlist'=>'string', 'path'=>'string'], - 'PDFlib::pcos_get_string' => ['string', 'doc'=>'int', 'path'=>'string'], - 'PDFlib::place_image' => ['bool', 'image'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], - 'PDFlib::place_pdi_page' => ['bool', 'page'=>'int', 'x'=>'float', 'y'=>'float', 'sx'=>'float', 'sy'=>'float'], - 'PDFlib::process_pdi' => ['int', 'doc'=>'int', 'page'=>'int', 'optlist'=>'string'], - 'PDFlib::rect' => ['bool', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], - 'PDFlib::restore' => ['bool', 'p'=>''], - 'PDFlib::resume_page' => ['bool', 'optlist'=>'string'], - 'PDFlib::rotate' => ['bool', 'phi'=>'float'], - 'PDFlib::save' => ['bool', 'p'=>''], - 'PDFlib::scale' => ['bool', 'sx'=>'float', 'sy'=>'float'], - 'PDFlib::set_border_color' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'PDFlib::set_border_dash' => ['bool', 'black'=>'float', 'white'=>'float'], - 'PDFlib::set_border_style' => ['bool', 'style'=>'string', 'width'=>'float'], - 'PDFlib::set_gstate' => ['bool', 'gstate'=>'int'], - 'PDFlib::set_info' => ['bool', 'key'=>'string', 'value'=>'string'], - 'PDFlib::set_layer_dependency' => ['bool', 'type'=>'string', 'optlist'=>'string'], - 'PDFlib::set_parameter' => ['bool', 'key'=>'string', 'value'=>'string'], - 'PDFlib::set_text_pos' => ['bool', 'x'=>'float', 'y'=>'float'], - 'PDFlib::set_value' => ['bool', 'key'=>'string', 'value'=>'float'], - 'PDFlib::setcolor' => ['bool', 'fstype'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], - 'PDFlib::setdash' => ['bool', 'b'=>'float', 'w'=>'float'], - 'PDFlib::setdashpattern' => ['bool', 'optlist'=>'string'], - 'PDFlib::setflat' => ['bool', 'flatness'=>'float'], - 'PDFlib::setfont' => ['bool', 'font'=>'int', 'fontsize'=>'float'], - 'PDFlib::setgray' => ['bool', 'g'=>'float'], - 'PDFlib::setgray_fill' => ['bool', 'g'=>'float'], - 'PDFlib::setgray_stroke' => ['bool', 'g'=>'float'], - 'PDFlib::setlinecap' => ['bool', 'linecap'=>'int'], - 'PDFlib::setlinejoin' => ['bool', 'value'=>'int'], - 'PDFlib::setlinewidth' => ['bool', 'width'=>'float'], - 'PDFlib::setmatrix' => ['bool', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'e'=>'float', 'f'=>'float'], - 'PDFlib::setmiterlimit' => ['bool', 'miter'=>'float'], - 'PDFlib::setrgbcolor' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'PDFlib::setrgbcolor_fill' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'PDFlib::setrgbcolor_stroke' => ['bool', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'PDFlib::shading' => ['int', 'shtype'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], - 'PDFlib::shading_pattern' => ['int', 'shading'=>'int', 'optlist'=>'string'], - 'PDFlib::shfill' => ['bool', 'shading'=>'int'], - 'PDFlib::show' => ['bool', 'text'=>'string'], - 'PDFlib::show_boxed' => ['int', 'text'=>'string', 'left'=>'float', 'top'=>'float', 'width'=>'float', 'height'=>'float', 'mode'=>'string', 'feature'=>'string'], - 'PDFlib::show_xy' => ['bool', 'text'=>'string', 'x'=>'float', 'y'=>'float'], - 'PDFlib::skew' => ['bool', 'alpha'=>'float', 'beta'=>'float'], - 'PDFlib::stringwidth' => ['float', 'text'=>'string', 'font'=>'int', 'fontsize'=>'float'], - 'PDFlib::stroke' => ['bool', 'p'=>''], - 'PDFlib::suspend_page' => ['bool', 'optlist'=>'string'], - 'PDFlib::translate' => ['bool', 'tx'=>'float', 'ty'=>'float'], - 'PDFlib::utf16_to_utf8' => ['string', 'utf16string'=>'string'], - 'PDFlib::utf32_to_utf16' => ['string', 'utf32string'=>'string', 'ordering'=>'string'], - 'PDFlib::utf8_to_utf16' => ['string', 'utf8string'=>'string', 'ordering'=>'string'], - 'PDO::__construct' => ['void', 'dsn'=>'string', 'username='=>'?string', 'passwd='=>'?string', 'options='=>'?array'], - 'PDO::__sleep' => ['list'], - 'PDO::__wakeup' => ['void'], - 'PDO::beginTransaction' => ['bool'], - 'PDO::commit' => ['bool'], - 'PDO::cubrid_schema' => ['array', 'schema_type'=>'int', 'table_name='=>'string', 'col_name='=>'string'], - 'PDO::errorCode' => ['?string'], - 'PDO::errorInfo' => ['array{0: ?string, 1: ?int, 2: ?string, 3?: mixed, 4?: mixed}'], - 'PDO::exec' => ['int|false', 'query'=>'string'], - 'PDO::getAttribute' => ['', 'attribute'=>'int'], - 'PDO::getAvailableDrivers' => ['array'], - 'PDO::inTransaction' => ['bool'], - 'PDO::lastInsertId' => ['string', 'name='=>'string|null'], - 'PDO::pgsqlCopyFromArray' => ['bool', 'table_name'=>'string', 'rows'=>'array', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], - 'PDO::pgsqlCopyFromFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], - 'PDO::pgsqlCopyToArray' => ['array', 'table_name'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], - 'PDO::pgsqlCopyToFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'], - 'PDO::pgsqlGetNotify' => ['array{message:string,pid:int,payload?:string}|false', 'result_type='=>'PDO::FETCH_*', 'ms_timeout='=>'int'], - 'PDO::pgsqlGetPid' => ['int'], - 'PDO::pgsqlLOBCreate' => ['string'], - 'PDO::pgsqlLOBOpen' => ['resource', 'oid'=>'string', 'mode='=>'string'], - 'PDO::pgsqlLOBUnlink' => ['bool', 'oid'=>'string'], - 'PDO::prepare' => ['PDOStatement|false', 'statement'=>'string', 'options='=>'array'], - 'PDO::query' => ['PDOStatement|false', 'sql'=>'string'], - 'PDO::query\'1' => ['PDOStatement|false', 'sql'=>'string', 'fetch_column'=>'int', 'colno='=>'int'], - 'PDO::query\'2' => ['PDOStatement|false', 'sql'=>'string', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs'=>'array'], - 'PDO::query\'3' => ['PDOStatement|false', 'sql'=>'string', 'fetch_into'=>'int', 'object'=>'object'], - 'PDO::quote' => ['string|false', 'string'=>'string', 'paramtype='=>'int'], - 'PDO::rollBack' => ['bool'], - 'PDO::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>''], - 'PDO::sqliteCreateAggregate' => ['bool', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], - 'PDO::sqliteCreateCollation' => ['bool', 'name'=>'string', 'callback'=>'callable'], - 'PDO::sqliteCreateFunction' => ['bool', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], - 'PDOException::getCode' => ['int|string'], - 'PDOException::getFile' => ['string'], - 'PDOException::getLine' => ['int'], - 'PDOException::getMessage' => ['string'], - 'PDOException::getPrevious' => ['?Throwable'], - 'PDOException::getTrace' => ['list\',args?:array}>'], - 'PDOException::getTraceAsString' => ['string'], - 'PDOStatement::__sleep' => ['list'], - 'PDOStatement::__wakeup' => ['void'], - 'PDOStatement::bindColumn' => ['bool', 'column'=>'mixed', '&rw_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'], - 'PDOStatement::bindParam' => ['bool', 'paramno'=>'mixed', '&rw_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'], - 'PDOStatement::bindValue' => ['bool', 'paramno'=>'mixed', 'param'=>'mixed', 'type='=>'int'], - 'PDOStatement::closeCursor' => ['bool'], - 'PDOStatement::columnCount' => ['int'], - 'PDOStatement::debugDumpParams' => ['void'], - 'PDOStatement::errorCode' => ['string'], - 'PDOStatement::errorInfo' => ['array{0: ?string, 1: ?int, 2: ?string, 3?: mixed, 4?: mixed}'], - 'PDOStatement::execute' => ['bool', 'bound_input_params='=>'?array'], - '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_name='=>'string', 'ctor_args='=>'array'], - 'PDOStatement::getAttribute' => ['mixed', 'attribute'=>'int'], - 'PDOStatement::getColumnMeta' => ['array|false', 'column'=>'int'], - 'PDOStatement::nextRowset' => ['bool'], - 'PDOStatement::rowCount' => ['int'], - 'PDOStatement::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>'mixed'], - 'PDOStatement::setFetchMode' => ['bool', 'mode'=>'int'], - 'PDOStatement::setFetchMode\'1' => ['bool', 'fetch_column'=>'int', 'colno'=>'int'], - 'PDOStatement::setFetchMode\'2' => ['bool', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs'=>'array'], - 'PDOStatement::setFetchMode\'3' => ['bool', 'fetch_into'=>'int', 'object'=>'object'], - 'ParentIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'], - 'ParentIterator::accept' => ['bool'], - 'ParentIterator::getChildren' => ['ParentIterator'], - 'ParentIterator::hasChildren' => ['bool'], - 'ParentIterator::next' => ['void'], - 'ParentIterator::rewind' => ['void'], - 'ParentIterator::valid' => [''], - 'Parle\Lexer::advance' => ['void'], - 'Parle\Lexer::build' => ['void'], - 'Parle\Lexer::callout' => ['void', 'id'=>'int', 'callback'=>'callable'], - 'Parle\Lexer::consume' => ['void', 'data'=>'string'], - 'Parle\Lexer::dump' => ['void'], - 'Parle\Lexer::getToken' => ['Parle\Token'], - 'Parle\Lexer::insertMacro' => ['void', 'name'=>'string', 'regex'=>'string'], - 'Parle\Lexer::push' => ['void', 'regex'=>'string', 'id'=>'int'], - 'Parle\Lexer::reset' => ['void', 'pos'=>'int'], - 'Parle\Parser::advance' => ['void'], - 'Parle\Parser::build' => ['void'], - 'Parle\Parser::consume' => ['void', 'data'=>'string', 'lexer'=>'Parle\Lexer'], - 'Parle\Parser::dump' => ['void'], - 'Parle\Parser::errorInfo' => ['Parle\ErrorInfo'], - 'Parle\Parser::left' => ['void', 'token'=>'string'], - 'Parle\Parser::nonassoc' => ['void', 'token'=>'string'], - 'Parle\Parser::precedence' => ['void', 'token'=>'string'], - 'Parle\Parser::push' => ['int', 'name'=>'string', 'rule'=>'string'], - 'Parle\Parser::reset' => ['void', 'tokenId'=>'int'], - 'Parle\Parser::right' => ['void', 'token'=>'string'], - 'Parle\Parser::sigil' => ['string', 'idx'=>'array'], - 'Parle\Parser::token' => ['void', 'token'=>'string'], - 'Parle\Parser::tokenId' => ['int', 'token'=>'string'], - 'Parle\Parser::trace' => ['string'], - 'Parle\Parser::validate' => ['bool', 'data'=>'string', 'lexer'=>'Parle\Lexer'], - 'Parle\RLexer::advance' => ['void'], - 'Parle\RLexer::build' => ['void'], - 'Parle\RLexer::callout' => ['void', 'id'=>'int', 'callback'=>'callable'], - 'Parle\RLexer::consume' => ['void', 'data'=>'string'], - 'Parle\RLexer::dump' => ['void'], - 'Parle\RLexer::getToken' => ['Parle\Token'], - 'Parle\RLexer::push' => ['void', 'state'=>'string', 'regex'=>'string', 'newState'=>'string'], - 'Parle\RLexer::pushState' => ['int', 'state'=>'string'], - 'Parle\RLexer::reset' => ['void', 'pos'=>'int'], - 'Parle\RParser::advance' => ['void'], - 'Parle\RParser::build' => ['void'], - 'Parle\RParser::consume' => ['void', 'data'=>'string', 'lexer'=>'Parle\Lexer'], - 'Parle\RParser::dump' => ['void'], - 'Parle\RParser::errorInfo' => ['Parle\ErrorInfo'], - 'Parle\RParser::left' => ['void', 'token'=>'string'], - 'Parle\RParser::nonassoc' => ['void', 'token'=>'string'], - 'Parle\RParser::precedence' => ['void', 'token'=>'string'], - 'Parle\RParser::push' => ['int', 'name'=>'string', 'rule'=>'string'], - 'Parle\RParser::reset' => ['void', 'tokenId'=>'int'], - 'Parle\RParser::right' => ['void', 'token'=>'string'], - 'Parle\RParser::sigil' => ['string', 'idx'=>'array'], - 'Parle\RParser::token' => ['void', 'token'=>'string'], - 'Parle\RParser::tokenId' => ['int', 'token'=>'string'], - 'Parle\RParser::trace' => ['string'], - 'Parle\RParser::validate' => ['bool', 'data'=>'string', 'lexer'=>'Parle\Lexer'], - 'Parle\Stack::pop' => ['void'], - 'Parle\Stack::push' => ['void', 'item'=>'mixed'], - 'ParseError::__clone' => ['void'], - 'ParseError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?ParseError'], - 'ParseError::__toString' => ['string'], - 'ParseError::getCode' => ['int'], - 'ParseError::getFile' => ['string'], - 'ParseError::getLine' => ['int'], - 'ParseError::getMessage' => ['string'], - 'ParseError::getPrevious' => ['Throwable|ParseError|null'], - '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::apiVersion' => ['string'], - 'Phar::buildFromDirectory' => ['array', 'base_dir'=>'string', 'regex='=>'string'], - 'Phar::buildFromIterator' => ['array', 'iter'=>'Iterator', 'base_directory='=>'string'], - 'Phar::canCompress' => ['bool', 'method='=>'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::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::getAlias' => ['string'], - 'Phar::getMetadata' => ['mixed'], - 'Phar::getModified' => ['bool'], - 'Phar::getPath' => ['string'], - 'Phar::getSignature' => ['array{hash:string, hash_type:string}'], - 'Phar::getStub' => ['string'], - 'Phar::getSupportedCompression' => ['array'], - 'Phar::getSupportedSignatures' => ['array'], - 'Phar::getVersion' => ['string'], - 'Phar::hasMetadata' => ['bool'], - 'Phar::interceptFileFuncs' => ['void'], - 'Phar::isBuffering' => ['bool'], - 'Phar::isCompressed' => ['mixed|false'], - 'Phar::isFileFormat' => ['bool', 'format'=>'int'], - '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::setAlias' => ['bool', 'alias'=>'string'], - 'Phar::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], - 'Phar::setMetadata' => ['void', 'metadata'=>''], - 'Phar::setSignatureAlgorithm' => ['void', 'sigtype'=>'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'], - 'PharData::compress' => ['PharData', 'compression'=>'int', 'extension='=>'string'], - 'PharData::compressFiles' => ['bool', '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::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::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::setAlias' => ['bool', 'alias'=>'string'], - 'PharData::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], - 'PharData::setStub' => ['bool', 'stub'=>'string', 'length='=>'int'], - 'PharFileInfo::__construct' => ['void', 'entry'=>'string'], - 'PharFileInfo::chmod' => ['void', 'permissions'=>'int'], - 'PharFileInfo::compress' => ['bool', 'compression'=>'int'], - 'PharFileInfo::decompress' => ['bool'], - 'PharFileInfo::delMetadata' => ['bool'], - 'PharFileInfo::getCRC32' => ['int'], - 'PharFileInfo::getCompressedSize' => ['int'], - 'PharFileInfo::getContent' => ['string'], - 'PharFileInfo::getMetadata' => ['mixed'], - '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::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'], - 'Pool::shutdown' => ['void'], - 'Pool::submit' => ['int', 'task'=>'Threaded'], - 'Pool::submitTo' => ['int', 'worker'=>'int', 'task'=>'Threaded'], - 'Postal\Expand::expand_address' => ['string[]', 'address'=>'string', 'options='=>'array'], - 'Postal\Parser::parse_address' => ['array', 'address'=>'string', 'options='=>'array'], - 'QuickHashIntHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], - 'QuickHashIntHash::add' => ['bool', 'key'=>'int', 'value='=>'int'], - 'QuickHashIntHash::delete' => ['bool', 'key'=>'int'], - 'QuickHashIntHash::exists' => ['bool', 'key'=>'int'], - 'QuickHashIntHash::get' => ['int', 'key'=>'int'], - 'QuickHashIntHash::getSize' => ['int'], - 'QuickHashIntHash::loadFromFile' => ['QuickHashIntHash', 'filename'=>'string', 'options='=>'int'], - 'QuickHashIntHash::loadFromString' => ['QuickHashIntHash', 'contents'=>'string', 'options='=>'int'], - 'QuickHashIntHash::saveToFile' => ['void', 'filename'=>'string'], - 'QuickHashIntHash::saveToString' => ['string'], - 'QuickHashIntHash::set' => ['bool', 'key'=>'int', 'value'=>'int'], - 'QuickHashIntHash::update' => ['bool', 'key'=>'int', 'value'=>'int'], - 'QuickHashIntSet::__construct' => ['void', 'size'=>'int', 'options='=>'int'], - 'QuickHashIntSet::add' => ['bool', 'key'=>'int'], - 'QuickHashIntSet::delete' => ['bool', 'key'=>'int'], - 'QuickHashIntSet::exists' => ['bool', 'key'=>'int'], - 'QuickHashIntSet::getSize' => ['int'], - 'QuickHashIntSet::loadFromFile' => ['QuickHashIntSet', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], - 'QuickHashIntSet::loadFromString' => ['QuickHashIntSet', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], - 'QuickHashIntSet::saveToFile' => ['void', 'filename'=>'string'], - 'QuickHashIntSet::saveToString' => ['string'], - 'QuickHashIntStringHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], - 'QuickHashIntStringHash::add' => ['bool', 'key'=>'int', 'value'=>'string'], - 'QuickHashIntStringHash::delete' => ['bool', 'key'=>'int'], - 'QuickHashIntStringHash::exists' => ['bool', 'key'=>'int'], - 'QuickHashIntStringHash::get' => ['mixed', 'key'=>'int'], - 'QuickHashIntStringHash::getSize' => ['int'], - 'QuickHashIntStringHash::loadFromFile' => ['QuickHashIntStringHash', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], - 'QuickHashIntStringHash::loadFromString' => ['QuickHashIntStringHash', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], - 'QuickHashIntStringHash::saveToFile' => ['void', 'filename'=>'string'], - 'QuickHashIntStringHash::saveToString' => ['string'], - 'QuickHashIntStringHash::set' => ['int', 'key'=>'int', 'value'=>'string'], - 'QuickHashIntStringHash::update' => ['bool', 'key'=>'int', 'value'=>'string'], - 'QuickHashStringIntHash::__construct' => ['void', 'size'=>'int', 'options='=>'int'], - 'QuickHashStringIntHash::add' => ['bool', 'key'=>'string', 'value'=>'int'], - 'QuickHashStringIntHash::delete' => ['bool', 'key'=>'string'], - 'QuickHashStringIntHash::exists' => ['bool', 'key'=>'string'], - 'QuickHashStringIntHash::get' => ['mixed', 'key'=>'string'], - 'QuickHashStringIntHash::getSize' => ['int'], - 'QuickHashStringIntHash::loadFromFile' => ['QuickHashStringIntHash', 'filename'=>'string', 'size='=>'int', 'options='=>'int'], - 'QuickHashStringIntHash::loadFromString' => ['QuickHashStringIntHash', 'contents'=>'string', 'size='=>'int', 'options='=>'int'], - 'QuickHashStringIntHash::saveToFile' => ['void', 'filename'=>'string'], - 'QuickHashStringIntHash::saveToString' => ['string'], - 'QuickHashStringIntHash::set' => ['int', 'key'=>'string', 'value'=>'int'], - 'QuickHashStringIntHash::update' => ['bool', 'key'=>'string', 'value'=>'int'], - 'RRDCreator::__construct' => ['void', 'path'=>'string', 'starttime='=>'string', 'step='=>'int'], - 'RRDCreator::addArchive' => ['void', 'description'=>'string'], - 'RRDCreator::addDataSource' => ['void', 'description'=>'string'], - 'RRDCreator::save' => ['bool'], - 'RRDGraph::__construct' => ['void', 'path'=>'string'], - 'RRDGraph::save' => ['array|false'], - 'RRDGraph::saveVerbose' => ['array|false'], - 'RRDGraph::setOptions' => ['void', 'options'=>'array'], - 'RRDUpdater::__construct' => ['void', 'path'=>'string'], - 'RRDUpdater::update' => ['bool', 'values'=>'array', 'time='=>'string'], - 'RangeException::__clone' => ['void'], - 'RangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?RangeException'], - 'RangeException::__toString' => ['string'], - 'RangeException::getCode' => ['int'], - 'RangeException::getFile' => ['string'], - 'RangeException::getLine' => ['int'], - 'RangeException::getMessage' => ['string'], - 'RangeException::getPrevious' => ['Throwable|RangeException|null'], - 'RangeException::getTrace' => ['list\',args?:array}>'], - 'RangeException::getTraceAsString' => ['string'], - 'RarArchive::__toString' => ['string'], - 'RarArchive::close' => ['bool'], - 'RarArchive::getComment' => ['string|null'], - 'RarArchive::getEntries' => ['RarEntry[]|false'], - 'RarArchive::getEntry' => ['RarEntry|false', 'entryname'=>'string'], - 'RarArchive::isBroken' => ['bool'], - 'RarArchive::isSolid' => ['bool'], - 'RarArchive::open' => ['RarArchive|false', 'filename'=>'string', 'password='=>'string', 'volume_callback='=>'callable'], - 'RarArchive::setAllowBroken' => ['bool', 'allow_broken'=>'bool'], - 'RarEntry::__toString' => ['string'], - 'RarEntry::extract' => ['bool', 'dir'=>'string', 'filepath='=>'string', 'password='=>'string', 'extended_data='=>'bool'], - 'RarEntry::getAttr' => ['int|false'], - 'RarEntry::getCrc' => ['string|false'], - 'RarEntry::getFileTime' => ['string|false'], - 'RarEntry::getHostOs' => ['int|false'], - 'RarEntry::getMethod' => ['int|false'], - 'RarEntry::getName' => ['string|false'], - 'RarEntry::getPackedSize' => ['int|false'], - 'RarEntry::getStream' => ['resource|false', 'password='=>'string'], - 'RarEntry::getUnpackedSize' => ['int|false'], - 'RarEntry::getVersion' => ['int|false'], - 'RarEntry::isDirectory' => ['bool'], - 'RarEntry::isEncrypted' => ['bool'], - 'RarException::getCode' => ['int'], - 'RarException::getFile' => ['string'], - 'RarException::getLine' => ['int'], - 'RarException::getMessage' => ['string'], - 'RarException::getPrevious' => ['Exception|Throwable'], - 'RarException::getTrace' => ['list\',args?:array}>'], - 'RarException::getTraceAsString' => ['string'], - 'RarException::isUsingExceptions' => ['bool'], - 'RarException::setUsingExceptions' => ['RarEntry', 'using_exceptions'=>'bool'], - 'RdKafka::addBrokers' => ['int', 'broker_list'=>'string'], - 'RdKafka::flush' => ['int', 'timeout_ms'=>'int'], - 'RdKafka::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], - 'RdKafka::getOutQLen' => ['int'], - 'RdKafka::newQueue' => ['RdKafka\Queue'], - 'RdKafka::newTopic' => ['RdKafka\Topic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], - 'RdKafka::poll' => ['void', 'timeout_ms'=>'int'], - 'RdKafka::setLogLevel' => ['void', 'level'=>'int'], - 'RdKafka\Conf::dump' => ['array'], - 'RdKafka\Conf::set' => ['void', 'name'=>'string', 'value'=>'string'], - 'RdKafka\Conf::setDefaultTopicConf' => ['void', 'topic_conf'=>'RdKafka\TopicConf'], - 'RdKafka\Conf::setDrMsgCb' => ['void', 'callback'=>'callable'], - 'RdKafka\Conf::setErrorCb' => ['void', 'callback'=>'callable'], - 'RdKafka\Conf::setRebalanceCb' => ['void', 'callback'=>'callable'], - 'RdKafka\Conf::setStatsCb' => ['void', 'callback'=>'callable'], - 'RdKafka\Consumer::__construct' => ['void', 'conf='=>'?RdKafka\Conf'], - 'RdKafka\Consumer::addBrokers' => ['int', 'broker_list'=>'string'], - 'RdKafka\Consumer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], - 'RdKafka\Consumer::getOutQLen' => ['int'], - 'RdKafka\Consumer::newQueue' => ['RdKafka\Queue'], - 'RdKafka\Consumer::newTopic' => ['RdKafka\ConsumerTopic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], - 'RdKafka\Consumer::poll' => ['void', 'timeout_ms'=>'int'], - 'RdKafka\Consumer::setLogLevel' => ['void', 'level'=>'int'], - 'RdKafka\ConsumerTopic::__construct' => ['void'], - 'RdKafka\ConsumerTopic::consume' => ['RdKafka\Message', 'partition'=>'int', 'timeout_ms'=>'int'], - 'RdKafka\ConsumerTopic::consumeQueueStart' => ['void', 'partition'=>'int', 'offset'=>'int', 'queue'=>'RdKafka\Queue'], - 'RdKafka\ConsumerTopic::consumeStart' => ['void', 'partition'=>'int', 'offset'=>'int'], - 'RdKafka\ConsumerTopic::consumeStop' => ['void', 'partition'=>'int'], - 'RdKafka\ConsumerTopic::getName' => ['string'], - 'RdKafka\ConsumerTopic::offsetStore' => ['void', 'partition'=>'int', 'offset'=>'int'], - 'RdKafka\KafkaConsumer::__construct' => ['void', 'conf'=>'RdKafka\Conf'], - 'RdKafka\KafkaConsumer::assign' => ['void', 'topic_partitions='=>'RdKafka\TopicPartition[]|null'], - 'RdKafka\KafkaConsumer::commit' => ['void', 'message_or_offsets='=>'RdKafka\Message|RdKafka\TopicPartition[]|null'], - 'RdKafka\KafkaConsumer::commitAsync' => ['void', 'message_or_offsets='=>'RdKafka\Message|RdKafka\TopicPartition[]|null'], - 'RdKafka\KafkaConsumer::consume' => ['RdKafka\Message', 'timeout_ms'=>'int'], - 'RdKafka\KafkaConsumer::getAssignment' => ['RdKafka\TopicPartition[]'], - 'RdKafka\KafkaConsumer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\KafkaConsumerTopic', 'timeout_ms'=>'int'], - 'RdKafka\KafkaConsumer::getSubscription' => ['array'], - 'RdKafka\KafkaConsumer::subscribe' => ['void', 'topics'=>'array'], - 'RdKafka\KafkaConsumer::unsubscribe' => ['void'], - 'RdKafka\KafkaConsumerTopic::getName' => ['string'], - 'RdKafka\KafkaConsumerTopic::offsetStore' => ['void', 'partition'=>'int', 'offset'=>'int'], - 'RdKafka\Message::errstr' => ['string'], - 'RdKafka\Metadata::getBrokers' => ['RdKafka\Metadata\Collection'], - 'RdKafka\Metadata::getOrigBrokerId' => ['int'], - 'RdKafka\Metadata::getOrigBrokerName' => ['string'], - 'RdKafka\Metadata::getTopics' => ['RdKafka\Metadata\Collection|RdKafka\Metadata\Topic[]'], - 'RdKafka\Metadata\Collection::__construct' => ['void'], - 'RdKafka\Metadata\Collection::count' => ['int'], - 'RdKafka\Metadata\Collection::current' => ['mixed'], - 'RdKafka\Metadata\Collection::key' => ['mixed'], - 'RdKafka\Metadata\Collection::next' => ['void'], - 'RdKafka\Metadata\Collection::rewind' => ['void'], - 'RdKafka\Metadata\Collection::valid' => ['bool'], - 'RdKafka\Metadata\Partition::getErr' => ['mixed'], - 'RdKafka\Metadata\Partition::getId' => ['int'], - 'RdKafka\Metadata\Partition::getIsrs' => ['mixed'], - 'RdKafka\Metadata\Partition::getLeader' => ['mixed'], - 'RdKafka\Metadata\Partition::getReplicas' => ['mixed'], - 'RdKafka\Metadata\Topic::getErr' => ['mixed'], - 'RdKafka\Metadata\Topic::getPartitions' => ['RdKafka\Metadata\Partition[]'], - 'RdKafka\Metadata\Topic::getTopic' => ['string'], - 'RdKafka\Producer::__construct' => ['void', 'conf='=>'?RdKafka\Conf'], - 'RdKafka\Producer::addBrokers' => ['int', 'broker_list'=>'string'], - 'RdKafka\Producer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'?RdKafka\Topic', 'timeout_ms'=>'int'], - 'RdKafka\Producer::getOutQLen' => ['int'], - 'RdKafka\Producer::newQueue' => ['RdKafka\Queue'], - 'RdKafka\Producer::newTopic' => ['RdKafka\ProducerTopic', 'topic_name'=>'string', 'topic_conf='=>'?RdKafka\TopicConf'], - 'RdKafka\Producer::poll' => ['void', 'timeout_ms'=>'int'], - 'RdKafka\Producer::setLogLevel' => ['void', 'level'=>'int'], - 'RdKafka\ProducerTopic::__construct' => ['void'], - 'RdKafka\ProducerTopic::getName' => ['string'], - 'RdKafka\ProducerTopic::produce' => ['void', 'partition'=>'int', 'msgflags'=>'int', 'payload'=>'string', 'key='=>'?string'], - 'RdKafka\ProducerTopic::producev' => ['void', 'partition'=>'int', 'msgflags'=>'int', 'payload'=>'string', 'key='=>'?string', 'headers='=>'?array', 'timestamp_ms='=>'?int', 'opaque='=>'?string'], - 'RdKafka\Queue::__construct' => ['void'], - 'RdKafka\Queue::consume' => ['?RdKafka\Message', 'timeout_ms'=>'string'], - 'RdKafka\Topic::getName' => ['string'], - 'RdKafka\TopicConf::dump' => ['array'], - 'RdKafka\TopicConf::set' => ['void', 'name'=>'string', 'value'=>'string'], - 'RdKafka\TopicConf::setPartitioner' => ['void', 'partitioner'=>'int'], - 'RdKafka\TopicPartition::__construct' => ['void', 'topic'=>'string', 'partition'=>'int', 'offset='=>'int'], - 'RdKafka\TopicPartition::getOffset' => ['int'], - 'RdKafka\TopicPartition::getPartition' => ['int'], - 'RdKafka\TopicPartition::getTopic' => ['string'], - 'RdKafka\TopicPartition::setOffset' => ['void', 'offset'=>'string'], - 'RdKafka\TopicPartition::setPartition' => ['void', 'partition'=>'string'], - 'RdKafka\TopicPartition::setTopic' => ['void', 'topic_name'=>'string'], - 'RecursiveArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'], - 'RecursiveArrayIterator::append' => ['void', 'value'=>'mixed'], - 'RecursiveArrayIterator::asort' => ['void'], - 'RecursiveArrayIterator::count' => ['int'], - 'RecursiveArrayIterator::current' => ['mixed'], - 'RecursiveArrayIterator::getArrayCopy' => ['array'], - 'RecursiveArrayIterator::getChildren' => ['RecursiveArrayIterator'], - 'RecursiveArrayIterator::getFlags' => ['void'], - 'RecursiveArrayIterator::hasChildren' => ['bool'], - 'RecursiveArrayIterator::key' => ['false|int|string'], - 'RecursiveArrayIterator::ksort' => ['void'], - 'RecursiveArrayIterator::natcasesort' => ['void'], - 'RecursiveArrayIterator::natsort' => ['void'], - '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::rewind' => ['void'], - 'RecursiveArrayIterator::seek' => ['void', 'position'=>'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::valid' => ['bool'], - 'RecursiveCachingIterator::__construct' => ['void', 'it'=>'Iterator', 'flags='=>'int'], - 'RecursiveCachingIterator::__toString' => ['string'], - 'RecursiveCachingIterator::count' => ['int'], - 'RecursiveCachingIterator::current' => ['void'], - 'RecursiveCachingIterator::getCache' => ['array'], - 'RecursiveCachingIterator::getChildren' => ['RecursiveCachingIterator'], - 'RecursiveCachingIterator::getFlags' => ['int'], - 'RecursiveCachingIterator::getInnerIterator' => ['Iterator'], - 'RecursiveCachingIterator::hasChildren' => ['bool'], - '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::rewind' => ['void'], - 'RecursiveCachingIterator::setFlags' => ['void', 'flags'=>'int'], - 'RecursiveCachingIterator::valid' => ['bool'], - 'RecursiveCallbackFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'func'=>'callable'], - 'RecursiveCallbackFilterIterator::accept' => ['bool'], - 'RecursiveCallbackFilterIterator::current' => ['mixed'], - 'RecursiveCallbackFilterIterator::getChildren' => ['RecursiveCallbackFilterIterator'], - 'RecursiveCallbackFilterIterator::getInnerIterator' => ['Iterator'], - 'RecursiveCallbackFilterIterator::hasChildren' => ['bool'], - 'RecursiveCallbackFilterIterator::key' => ['bool|float|int|string'], - 'RecursiveCallbackFilterIterator::next' => ['void'], - 'RecursiveCallbackFilterIterator::rewind' => ['void'], - 'RecursiveCallbackFilterIterator::valid' => ['bool'], - 'RecursiveDirectoryIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], - 'RecursiveDirectoryIterator::__toString' => ['string'], - 'RecursiveDirectoryIterator::_bad_state_ex' => [''], - 'RecursiveDirectoryIterator::current' => ['string|SplFileInfo|FilesystemIterator'], - 'RecursiveDirectoryIterator::getATime' => ['int'], - 'RecursiveDirectoryIterator::getBasename' => ['string', 'suffix='=>'string'], - 'RecursiveDirectoryIterator::getCTime' => ['int'], - 'RecursiveDirectoryIterator::getChildren' => ['RecursiveDirectoryIterator'], - 'RecursiveDirectoryIterator::getExtension' => ['string'], - 'RecursiveDirectoryIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'RecursiveDirectoryIterator::getFilename' => ['string'], - 'RecursiveDirectoryIterator::getFlags' => ['int'], - 'RecursiveDirectoryIterator::getGroup' => ['int'], - 'RecursiveDirectoryIterator::getInode' => ['int'], - 'RecursiveDirectoryIterator::getLinkTarget' => ['string'], - 'RecursiveDirectoryIterator::getMTime' => ['int'], - 'RecursiveDirectoryIterator::getOwner' => ['int'], - 'RecursiveDirectoryIterator::getPath' => ['string'], - 'RecursiveDirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'RecursiveDirectoryIterator::getPathname' => ['string'], - 'RecursiveDirectoryIterator::getPerms' => ['int'], - 'RecursiveDirectoryIterator::getRealPath' => ['string'], - 'RecursiveDirectoryIterator::getSize' => ['int'], - 'RecursiveDirectoryIterator::getSubPath' => ['string'], - 'RecursiveDirectoryIterator::getSubPathname' => ['string'], - 'RecursiveDirectoryIterator::getType' => ['string'], - 'RecursiveDirectoryIterator::hasChildren' => ['bool', 'allow_links='=>'bool'], - 'RecursiveDirectoryIterator::isDir' => ['bool'], - 'RecursiveDirectoryIterator::isDot' => ['bool'], - 'RecursiveDirectoryIterator::isExecutable' => ['bool'], - 'RecursiveDirectoryIterator::isFile' => ['bool'], - 'RecursiveDirectoryIterator::isLink' => ['bool'], - 'RecursiveDirectoryIterator::isReadable' => ['bool'], - 'RecursiveDirectoryIterator::isWritable' => ['bool'], - 'RecursiveDirectoryIterator::key' => ['string'], - 'RecursiveDirectoryIterator::next' => ['void'], - 'RecursiveDirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'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::valid' => ['bool'], - 'RecursiveFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'], - 'RecursiveFilterIterator::accept' => ['bool'], - 'RecursiveFilterIterator::current' => ['mixed'], - 'RecursiveFilterIterator::getChildren' => ['RecursiveFilterIterator'], - 'RecursiveFilterIterator::getInnerIterator' => ['Iterator'], - 'RecursiveFilterIterator::hasChildren' => ['bool'], - 'RecursiveFilterIterator::key' => ['mixed'], - 'RecursiveFilterIterator::next' => ['void'], - 'RecursiveFilterIterator::rewind' => ['void'], - 'RecursiveFilterIterator::valid' => ['bool'], - 'RecursiveIterator::__construct' => ['void'], - 'RecursiveIterator::current' => ['mixed'], - 'RecursiveIterator::getChildren' => ['RecursiveIterator'], - 'RecursiveIterator::hasChildren' => ['bool'], - 'RecursiveIterator::key' => ['int|string'], - 'RecursiveIterator::next' => ['void'], - 'RecursiveIterator::rewind' => ['void'], - 'RecursiveIterator::valid' => ['bool'], - 'RecursiveIteratorIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'mode='=>'int', 'flags='=>'int'], - 'RecursiveIteratorIterator::beginChildren' => ['void'], - 'RecursiveIteratorIterator::beginIteration' => ['RecursiveIterator'], - 'RecursiveIteratorIterator::callGetChildren' => ['RecursiveIterator'], - 'RecursiveIteratorIterator::callHasChildren' => ['bool'], - 'RecursiveIteratorIterator::current' => ['mixed'], - 'RecursiveIteratorIterator::endChildren' => ['void'], - 'RecursiveIteratorIterator::endIteration' => ['RecursiveIterator'], - 'RecursiveIteratorIterator::getDepth' => ['int'], - 'RecursiveIteratorIterator::getInnerIterator' => ['RecursiveIterator'], - 'RecursiveIteratorIterator::getMaxDepth' => ['int|false'], - 'RecursiveIteratorIterator::getSubIterator' => ['RecursiveIterator', 'level='=>'int'], - 'RecursiveIteratorIterator::key' => ['mixed'], - 'RecursiveIteratorIterator::next' => ['void'], - 'RecursiveIteratorIterator::nextElement' => ['void'], - 'RecursiveIteratorIterator::rewind' => ['void'], - 'RecursiveIteratorIterator::setMaxDepth' => ['void', 'max_depth='=>'int'], - 'RecursiveIteratorIterator::valid' => ['bool'], - 'RecursiveRegexIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], - 'RecursiveRegexIterator::accept' => ['bool'], - 'RecursiveRegexIterator::current' => [''], - 'RecursiveRegexIterator::getChildren' => ['RecursiveRegexIterator'], - 'RecursiveRegexIterator::getFlags' => ['int'], - 'RecursiveRegexIterator::getInnerIterator' => ['Iterator'], - 'RecursiveRegexIterator::getMode' => ['int'], - 'RecursiveRegexIterator::getPregFlags' => ['int'], - 'RecursiveRegexIterator::getRegex' => ['string'], - 'RecursiveRegexIterator::hasChildren' => ['bool'], - 'RecursiveRegexIterator::key' => [''], - 'RecursiveRegexIterator::next' => [''], - 'RecursiveRegexIterator::rewind' => [''], - 'RecursiveRegexIterator::setFlags' => ['void', 'new_flags'=>'int'], - 'RecursiveRegexIterator::setMode' => ['void', 'new_mode'=>'int'], - 'RecursiveRegexIterator::setPregFlags' => ['void', 'new_flags'=>'int'], - 'RecursiveRegexIterator::valid' => [''], - 'RecursiveTreeIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'flags='=>'int', 'cit_flags='=>'int', 'mode'=>'int'], - 'RecursiveTreeIterator::beginChildren' => ['void'], - 'RecursiveTreeIterator::beginIteration' => ['RecursiveIterator'], - 'RecursiveTreeIterator::callGetChildren' => ['RecursiveIterator'], - 'RecursiveTreeIterator::callHasChildren' => ['bool'], - 'RecursiveTreeIterator::current' => ['string'], - 'RecursiveTreeIterator::endChildren' => ['void'], - 'RecursiveTreeIterator::endIteration' => ['void'], - 'RecursiveTreeIterator::getDepth' => ['int'], - 'RecursiveTreeIterator::getEntry' => ['string'], - 'RecursiveTreeIterator::getInnerIterator' => ['RecursiveIterator'], - 'RecursiveTreeIterator::getMaxDepth' => ['false|int'], - 'RecursiveTreeIterator::getPostfix' => ['string'], - 'RecursiveTreeIterator::getPrefix' => ['string'], - 'RecursiveTreeIterator::getSubIterator' => ['RecursiveIterator', 'level='=>'int'], - 'RecursiveTreeIterator::key' => ['string'], - '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::valid' => ['bool'], - 'Redis::__construct' => ['void'], - 'Redis::__destruct' => ['void'], - 'Redis::_prefix' => ['string', 'value'=>'mixed'], - 'Redis::_serialize' => ['mixed', 'value'=>'mixed'], - 'Redis::_unserialize' => ['mixed', 'value'=>'string'], - 'Redis::append' => ['int', 'key'=>'string', 'value'=>'string'], - 'Redis::auth' => ['bool', 'password'=>'string'], - 'Redis::bgRewriteAOF' => ['bool'], - 'Redis::bgSave' => ['bool'], - 'Redis::bitCount' => ['int', 'key'=>'string'], - 'Redis::bitOp' => ['int', 'operation'=>'string', 'ret_key'=>'string', 'key'=>'string', '...other_keys='=>'string'], - 'Redis::bitpos' => ['int', 'key'=>'string', 'bit'=>'int', 'start='=>'int', 'end='=>'int'], - 'Redis::blPop' => ['array', 'keys'=>'string[]', 'timeout'=>'int'], - 'Redis::blPop\'1' => ['array', 'key'=>'string', 'timeout_or_key'=>'int|string', '...extra_args'=>'int|string'], - 'Redis::brPop' => ['array', 'keys'=>'string[]', 'timeout'=>'int'], - 'Redis::brPop\'1' => ['array', 'key'=>'string', 'timeout_or_key'=>'int|string', '...extra_args'=>'int|string'], - 'Redis::brpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'], - 'Redis::clearLastError' => ['bool'], - 'Redis::client' => ['mixed', 'command'=>'string', 'arg='=>'string'], - 'Redis::close' => ['bool'], - 'Redis::command' => ['', '...args'=>''], - 'Redis::config' => ['string', 'operation'=>'string', 'key'=>'string', 'value='=>'string'], - 'Redis::connect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'reserved='=>'null', 'retry_interval='=>'?int', 'read_timeout='=>'float'], - 'Redis::dbSize' => ['int'], - 'Redis::debug' => ['', 'key'=>''], - 'Redis::decr' => ['int', 'key'=>'string'], - 'Redis::decrBy' => ['int', 'key'=>'string', 'value'=>'int'], - 'Redis::decrByFloat' => ['float', 'key'=>'string', 'value'=>'float'], - 'Redis::del' => ['int', 'key'=>'string', '...args'=>'string'], - 'Redis::del\'1' => ['int', 'key'=>'string[]'], - 'Redis::delete' => ['int', 'key'=>'string', '...args'=>'string'], - 'Redis::delete\'1' => ['int', 'key'=>'string[]'], - 'Redis::discard' => [''], - 'Redis::dump' => ['string|false', 'key'=>'string'], - 'Redis::echo' => ['string', 'message'=>'string'], - 'Redis::eval' => ['mixed', 'script'=>'', 'args='=>'', 'numKeys='=>''], - 'Redis::evalSha' => ['mixed', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], - 'Redis::evaluate' => ['mixed', 'script'=>'string', 'args='=>'array', 'numKeys='=>'int'], - 'Redis::evaluateSha' => ['', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], - 'Redis::exec' => ['array'], - 'Redis::exists' => ['int', 'keys'=>'string|string[]'], - 'Redis::exists\'1' => ['int', '...keys'=>'string'], - 'Redis::expire' => ['bool', 'key'=>'string', 'ttl'=>'int'], - 'Redis::expireAt' => ['bool', 'key'=>'string', 'expiry'=>'int'], - 'Redis::flushAll' => ['bool', 'async='=>'bool'], - 'Redis::flushDb' => ['bool', 'async='=>'bool'], - 'Redis::geoAdd' => ['int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'member'=>'string', '...other_triples='=>'string|int|float'], - 'Redis::geoDist' => ['float', 'key'=>'string', 'member1'=>'string', 'member2'=>'string', 'unit='=>'string'], - 'Redis::geoHash' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], - 'Redis::geoPos' => ['array', 'key'=>'string', 'member'=>'string', '...members='=>'string'], - 'Redis::geoRadius' => ['array|int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'unit'=>'float', 'options='=>'array'], - 'Redis::geoRadiusByMember' => ['array|int', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'units'=>'string', 'options='=>'array'], - 'Redis::get' => ['string|false', 'key'=>'string'], - 'Redis::getAuth' => ['string|false|null'], - 'Redis::getBit' => ['int', 'key'=>'string', 'offset'=>'int'], - 'Redis::getDBNum' => ['int|false'], - 'Redis::getHost' => ['string|false'], - 'Redis::getKeys' => ['array', 'pattern'=>'string'], - 'Redis::getLastError' => ['?string'], - 'Redis::getMode' => ['int'], - 'Redis::getMultiple' => ['array', 'keys'=>'string[]'], - 'Redis::getOption' => ['int', 'name'=>'int'], - 'Redis::getPersistentID' => ['string|false|null'], - 'Redis::getPort' => ['int|false'], - 'Redis::getRange' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], - 'Redis::getReadTimeout' => ['float|false'], - 'Redis::getSet' => ['string', 'key'=>'string', 'string'=>'string'], - 'Redis::getTimeout' => ['float|false'], - 'Redis::hDel' => ['int|false', 'key'=>'string', 'hashKey1'=>'string', '...otherHashKeys='=>'string'], - 'Redis::hExists' => ['bool', 'key'=>'string', 'hashKey'=>'string'], - 'Redis::hGet' => ['string|false', 'key'=>'string', 'hashKey'=>'string'], - 'Redis::hGetAll' => ['array', 'key'=>'string'], - 'Redis::hIncrBy' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'int'], - 'Redis::hIncrByFloat' => ['float', 'key'=>'string', 'field'=>'string', 'increment'=>'float'], - 'Redis::hKeys' => ['array', 'key'=>'string'], - 'Redis::hLen' => ['int|false', 'key'=>'string'], - 'Redis::hMGet' => ['array', 'key'=>'string', 'hashKeys'=>'array'], - 'Redis::hMSet' => ['bool', 'key'=>'string', 'hashKeys'=>'array'], - 'Redis::hScan' => ['array', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], - 'Redis::hSet' => ['int|false', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], - 'Redis::hSetNx' => ['bool', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], - 'Redis::hStrLen' => ['', 'key'=>'', 'member'=>''], - 'Redis::hVals' => ['array', 'key'=>'string'], - 'Redis::incr' => ['int', 'key'=>'string'], - 'Redis::incrBy' => ['int', 'key'=>'string', 'value'=>'int'], - 'Redis::incrByFloat' => ['float', 'key'=>'string', 'value'=>'float'], - 'Redis::info' => ['array', 'option='=>'string'], - 'Redis::isConnected' => ['bool'], - 'Redis::keys' => ['array', 'pattern'=>'string'], - 'Redis::lGet' => ['string', 'key'=>'string', 'index'=>'int'], - 'Redis::lGetRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], - 'Redis::lIndex' => ['string|false', 'key'=>'string', 'index'=>'int'], - 'Redis::lInsert' => ['int', 'key'=>'string', 'position'=>'int', 'pivot'=>'string', 'value'=>'string'], - 'Redis::lLen' => ['int|false', 'key'=>'string'], - 'Redis::lPop' => ['string|false', 'key'=>'string'], - 'Redis::lPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], - 'Redis::lPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], - 'Redis::lRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], - 'Redis::lRem' => ['int|false', 'key'=>'string', 'value'=>'string', 'count'=>'int'], - 'Redis::lRemove' => ['int', 'key'=>'string', 'value'=>'string', 'count'=>'int'], - 'Redis::lSet' => ['bool', 'key'=>'string', 'index'=>'int', 'value'=>'string'], - 'Redis::lSize' => ['int', 'key'=>'string'], - 'Redis::lTrim' => ['array|false', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], - 'Redis::lastSave' => ['int'], - 'Redis::listTrim' => ['', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], - 'Redis::mGet' => ['array', 'keys'=>'string[]'], - 'Redis::mSet' => ['bool', 'pairs'=>'array'], - 'Redis::mSetNx' => ['bool', 'pairs'=>'array'], - 'Redis::migrate' => ['bool', 'host'=>'string', 'port'=>'int', 'key'=>'string|string[]', 'db'=>'int', 'timeout'=>'int', 'copy='=>'bool', 'replace='=>'bool'], - 'Redis::move' => ['bool', 'key'=>'string', 'dbindex'=>'int'], - 'Redis::multi' => ['Redis', 'mode='=>'int'], - 'Redis::object' => ['string|long|false', 'info'=>'string', 'key'=>'string'], - 'Redis::open' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'reserved='=>'null', 'retry_interval='=>'?int', 'read_timeout='=>'float'], - 'Redis::pExpire' => ['bool', 'key'=>'string', 'ttl'=>'int'], - 'Redis::pconnect' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'persistent_id='=>'string', 'retry_interval='=>'?int'], - 'Redis::persist' => ['bool', 'key'=>'string'], - 'Redis::pexpireAt' => ['bool', 'key'=>'string', 'expiry'=>'int'], - 'Redis::pfAdd' => ['bool', 'key'=>'string', 'elements'=>'array'], - 'Redis::pfCount' => ['int', 'key'=>'array|string'], - 'Redis::pfMerge' => ['bool', 'destkey'=>'string', 'sourcekeys'=>'array'], - 'Redis::ping' => ['string'], - 'Redis::pipeline' => ['Redis'], - 'Redis::popen' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'float', 'persistent_id='=>'string', 'retry_interval='=>'?int'], - 'Redis::psetex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], - 'Redis::psubscribe' => ['', 'patterns'=>'array', 'callback'=>'array|string'], - 'Redis::pttl' => ['int|false', 'key'=>'string'], - 'Redis::publish' => ['int', 'channel'=>'string', 'message'=>'string'], - 'Redis::pubsub' => ['array|int', 'keyword'=>'string', 'argument='=>'array|string'], - 'Redis::punsubscribe' => ['', 'pattern'=>'string', '...other_patterns='=>'string'], - 'Redis::rPop' => ['string|false', 'key'=>'string'], - 'Redis::rPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], - 'Redis::rPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], - 'Redis::randomKey' => ['string'], - 'Redis::rawCommand' => ['mixed', 'command'=>'string', '...arguments='=>'mixed'], - 'Redis::rename' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], - 'Redis::renameKey' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], - 'Redis::renameNx' => ['bool', 'srckey'=>'string', 'dstkey'=>'string'], - 'Redis::resetStat' => ['bool'], - 'Redis::restore' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], - 'Redis::role' => ['array', 'nodeParams'=>'string|array{0:string,1:int}'], - 'Redis::rpoplpush' => ['string', 'srcKey'=>'string', 'dstKey'=>'string'], - 'Redis::sAdd' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], - 'Redis::sAddArray' => ['bool', 'key'=>'string', 'values'=>'array'], - 'Redis::sCard' => ['int', 'key'=>'string'], - 'Redis::sContains' => ['', 'key'=>'string', 'value'=>'string'], - 'Redis::sDiff' => ['array', 'key1'=>'string', '...other_keys='=>'string'], - 'Redis::sDiffStore' => ['int|false', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], - 'Redis::sGetMembers' => ['', 'key'=>'string'], - 'Redis::sInter' => ['array|false', 'key'=>'string', '...other_keys='=>'string'], - 'Redis::sInterStore' => ['int|false', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], - 'Redis::sIsMember' => ['bool', 'key'=>'string', 'value'=>'string'], - 'Redis::sMembers' => ['array', 'key'=>'string'], - 'Redis::sMove' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string', 'member'=>'string'], - 'Redis::sPop' => ['string|false', 'key'=>'string'], - 'Redis::sRandMember' => ['array|string|false', 'key'=>'string', 'count='=>'int'], - 'Redis::sRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], - 'Redis::sRemove' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], - 'Redis::sScan' => ['array|bool', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], - 'Redis::sSize' => ['int', 'key'=>'string'], - 'Redis::sUnion' => ['array', 'key'=>'string', '...other_keys='=>'string'], - 'Redis::sUnionStore' => ['int', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], - 'Redis::save' => ['bool'], - 'Redis::scan' => ['array|false', '&rw_iterator'=>'?int', 'pattern='=>'?string', 'count='=>'?int'], - 'Redis::script' => ['mixed', 'command'=>'string', '...args='=>'mixed'], - 'Redis::select' => ['bool', 'dbindex'=>'int'], - 'Redis::sendEcho' => ['string', 'msg'=>'string'], - 'Redis::set' => ['bool', 'key'=>'string', 'value'=>'mixed', 'options='=>'array'], - 'Redis::set\'1' => ['bool', 'key'=>'string', 'value'=>'mixed', 'timeout='=>'int'], - 'Redis::setBit' => ['int', 'key'=>'string', 'offset'=>'int', 'value'=>'int'], - 'Redis::setEx' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], - 'Redis::setNx' => ['bool', 'key'=>'string', 'value'=>'string'], - 'Redis::setOption' => ['bool', 'name'=>'int', 'value'=>'mixed'], - 'Redis::setRange' => ['int', 'key'=>'string', 'offset'=>'int', 'end'=>'int'], - 'Redis::setTimeout' => ['', 'key'=>'string', 'ttl'=>'int'], - 'Redis::slave' => ['bool', 'host'=>'string', 'port'=>'int'], - 'Redis::slave\'1' => ['bool', 'host'=>'string', 'port'=>'int'], - 'Redis::slaveof' => ['bool', 'host='=>'string', 'port='=>'int'], - 'Redis::slowLog' => ['mixed', 'operation'=>'string', 'length='=>'int'], - 'Redis::sort' => ['array|int', 'key'=>'string', 'options='=>'array'], - 'Redis::sortAsc' => ['array', 'key'=>'string', 'pattern='=>'string', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], - 'Redis::sortAscAlpha' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], - 'Redis::sortDesc' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], - 'Redis::sortDescAlpha' => ['array', 'key'=>'string', 'pattern='=>'', 'get='=>'string', 'start='=>'int', 'end='=>'int', 'getList='=>'bool'], - 'Redis::strLen' => ['int', 'key'=>'string'], - 'Redis::subscribe' => ['mixed|null', 'channels'=>'array', 'callback'=>'string|array'], - 'Redis::substr' => ['', 'key'=>'string', 'start'=>'int', 'end'=>'int'], - 'Redis::swapdb' => ['bool', 'srcdb'=>'int', 'dstdb'=>'int'], - 'Redis::time' => ['array'], - 'Redis::ttl' => ['int|false', 'key'=>'string'], - 'Redis::type' => ['int', 'key'=>'string'], - 'Redis::unlink' => ['int', 'key'=>'string', '...args'=>'string'], - 'Redis::unlink\'1' => ['int', 'key'=>'string[]'], - 'Redis::unsubscribe' => ['', 'channel'=>'string', '...other_channels='=>'string'], - 'Redis::unwatch' => [''], - 'Redis::wait' => ['int', 'numSlaves'=>'int', 'timeout'=>'int'], - 'Redis::watch' => ['void', 'key'=>'string', '...other_keys='=>'string'], - 'Redis::xack' => ['', 'str_key'=>'string', 'str_group'=>'string', 'arr_ids'=>'array'], - 'Redis::xadd' => ['', 'str_key'=>'string', 'str_id'=>'string', 'arr_fields'=>'array', 'i_maxlen='=>'', 'boo_approximate='=>''], - 'Redis::xclaim' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_consumer'=>'string', 'i_min_idle'=>'', 'arr_ids'=>'array', 'arr_opts='=>'array'], - 'Redis::xdel' => ['', 'str_key'=>'string', 'arr_ids'=>'array'], - 'Redis::xgroup' => ['', 'str_operation'=>'string', 'str_key='=>'string', 'str_arg1='=>'', 'str_arg2='=>'', 'str_arg3='=>''], - 'Redis::xinfo' => ['', 'str_cmd'=>'string', 'str_key='=>'string', 'str_group='=>'string'], - 'Redis::xlen' => ['', 'key'=>''], - 'Redis::xpending' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_start='=>'', 'str_end='=>'', 'i_count='=>'', 'str_consumer='=>'string'], - 'Redis::xrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], - 'Redis::xread' => ['', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], - 'Redis::xreadgroup' => ['', 'str_group'=>'string', 'str_consumer'=>'string', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], - 'Redis::xrevrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], - 'Redis::xtrim' => ['', 'str_key'=>'string', 'i_maxlen'=>'', 'boo_approximate='=>''], - 'Redis::zAdd' => ['int', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], - 'Redis::zAdd\'1' => ['int', 'options'=>'array', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], - 'Redis::zCard' => ['int', 'key'=>'string'], - 'Redis::zCount' => ['int', 'key'=>'string', 'start'=>'string', 'end'=>'string'], - 'Redis::zDelete' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], - 'Redis::zDeleteRangeByRank' => ['', 'key'=>'string', 'start'=>'int', 'end'=>'int'], - 'Redis::zDeleteRangeByScore' => ['', 'key'=>'string', 'start'=>'float', 'end'=>'float'], - 'Redis::zIncrBy' => ['float', 'key'=>'string', 'value'=>'float', 'member'=>'string'], - 'Redis::zInter' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], - 'Redis::zInterStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], - 'Redis::zLexCount' => ['int', 'key'=>'string', 'min'=>'string', 'max'=>'string'], - 'Redis::zRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscores='=>'bool'], - 'Redis::zRangeByLex' => ['array|false', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], - 'Redis::zRangeByScore' => ['array', 'key'=>'string', 'start'=>'int|string', 'end'=>'int|string', 'options='=>'array'], - 'Redis::zRank' => ['int', 'key'=>'string', 'member'=>'string'], - 'Redis::zRem' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], - 'Redis::zRemRangeByLex' => ['int', 'key'=>'string', 'min'=>'string', 'max'=>'string'], - 'Redis::zRemRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], - 'Redis::zRemRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], - 'Redis::zRemove' => ['int', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], - 'Redis::zRemoveRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], - 'Redis::zRemoveRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], - 'Redis::zRevRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], - 'Redis::zRevRangeByLex' => ['array', 'key'=>'string', 'min'=>'string', 'max'=>'string', 'offset='=>'int', 'limit='=>'int'], - 'Redis::zRevRangeByScore' => ['array', 'key'=>'string', 'start'=>'string', 'end'=>'string', 'options='=>'array'], - 'Redis::zRevRank' => ['int', 'key'=>'string', 'member'=>'string'], - 'Redis::zReverseRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], - 'Redis::zScan' => ['array|bool', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], - 'Redis::zScore' => ['float|false', 'key'=>'string', 'member'=>'string'], - 'Redis::zSize' => ['', 'key'=>'string'], - 'Redis::zUnion' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], - 'Redis::zUnionStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], - 'RedisArray::__call' => ['mixed', 'function_name'=>'string', 'arguments'=>'array'], - 'RedisArray::__construct' => ['void', 'name='=>'string', 'hosts='=>'?array', 'opts='=>'?array'], - 'RedisArray::_continuum' => [''], - 'RedisArray::_distributor' => [''], - 'RedisArray::_function' => ['string'], - 'RedisArray::_hosts' => ['array'], - 'RedisArray::_instance' => ['', 'host'=>''], - 'RedisArray::_rehash' => ['', 'callable='=>'callable'], - 'RedisArray::_target' => ['string', 'key'=>'string'], - 'RedisArray::bgsave' => [''], - 'RedisArray::del' => ['bool', 'key'=>'string', '...args'=>'string'], - 'RedisArray::delete' => ['bool', 'key'=>'string', '...args'=>'string'], - 'RedisArray::delete\'1' => ['bool', 'key'=>'string[]'], - 'RedisArray::discard' => [''], - 'RedisArray::exec' => ['array'], - 'RedisArray::flushAll' => ['bool', 'async='=>'bool'], - 'RedisArray::flushDb' => ['bool', 'async='=>'bool'], - 'RedisArray::getMultiple' => ['', 'keys'=>''], - 'RedisArray::getOption' => ['', 'opt'=>''], - 'RedisArray::info' => ['array'], - 'RedisArray::keys' => ['array', 'pattern'=>''], - 'RedisArray::mGet' => ['array', 'keys'=>'string[]'], - 'RedisArray::mSet' => ['bool', 'pairs'=>'array'], - 'RedisArray::multi' => ['RedisArray', 'host'=>'string', 'mode='=>'int'], - 'RedisArray::ping' => ['string'], - 'RedisArray::save' => ['bool'], - 'RedisArray::select' => ['', 'index'=>''], - 'RedisArray::setOption' => ['', 'opt'=>'', 'value'=>''], - 'RedisArray::unlink' => ['int', 'key'=>'string', '...other_keys='=>'string'], - 'RedisArray::unlink\'1' => ['int', 'key'=>'string[]'], - 'RedisArray::unwatch' => [''], - 'RedisCluster::__construct' => ['void', 'name'=>'?string', 'seeds='=>'string[]', 'timeout='=>'float', 'readTimeout='=>'float', 'persistent='=>'bool', 'auth='=>'?string'], - 'RedisCluster::_masters' => ['array'], - 'RedisCluster::_prefix' => ['string', 'value'=>'mixed'], - 'RedisCluster::_redir' => [''], - 'RedisCluster::_serialize' => ['mixed', 'value'=>'mixed'], - 'RedisCluster::_unserialize' => ['mixed', 'value'=>'string'], - 'RedisCluster::append' => ['int', 'key'=>'string', 'value'=>'string'], - 'RedisCluster::bgrewriteaof' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], - 'RedisCluster::bgsave' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], - 'RedisCluster::bitCount' => ['int', 'key'=>'string'], - 'RedisCluster::bitOp' => ['int', 'operation'=>'string', 'retKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], - 'RedisCluster::bitpos' => ['int', 'key'=>'string', 'bit'=>'int', 'start='=>'int', 'end='=>'int'], - 'RedisCluster::blPop' => ['array', 'keys'=>'array', 'timeout'=>'int'], - 'RedisCluster::brPop' => ['array', 'keys'=>'array', 'timeout'=>'int'], - 'RedisCluster::brpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'], - 'RedisCluster::clearLastError' => ['bool'], - 'RedisCluster::client' => ['', 'nodeParams'=>'string|array{0:string,1:int}', 'subCmd='=>'string', '...args='=>''], - 'RedisCluster::close' => [''], - 'RedisCluster::cluster' => ['mixed', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'arguments='=>'mixed'], - 'RedisCluster::command' => ['array|bool'], - 'RedisCluster::config' => ['array|bool', 'nodeParams'=>'string|array{0:string,1:int}', 'operation'=>'string', 'key'=>'string', 'value='=>'string'], - 'RedisCluster::dbSize' => ['int', 'nodeParams'=>'string|array{0:string,1:int}'], - 'RedisCluster::decr' => ['int', 'key'=>'string'], - 'RedisCluster::decrBy' => ['int', 'key'=>'string', 'value'=>'int'], - 'RedisCluster::del' => ['int', 'key'=>'string', '...other_keys='=>'string'], - 'RedisCluster::del\'1' => ['int', 'key'=>'string[]'], - 'RedisCluster::discard' => [''], - 'RedisCluster::dump' => ['string|false', 'key'=>'string'], - 'RedisCluster::echo' => ['string', 'nodeParams'=>'string|array{0:string,1:int}', 'msg'=>'string'], - 'RedisCluster::eval' => ['mixed', 'script'=>'', 'args='=>'', 'numKeys='=>''], - 'RedisCluster::evalSha' => ['mixed', 'scriptSha'=>'string', 'args='=>'array', 'numKeys='=>'int'], - 'RedisCluster::exec' => ['array|void'], - 'RedisCluster::exists' => ['bool', 'key'=>'string'], - 'RedisCluster::expire' => ['bool', 'key'=>'string', 'ttl'=>'int'], - 'RedisCluster::expireAt' => ['bool', 'key'=>'string', 'timestamp'=>'int'], - 'RedisCluster::flushAll' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}', 'async='=>'bool'], - 'RedisCluster::flushDB' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}', 'async='=>'bool'], - 'RedisCluster::geoAdd' => ['int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'member'=>'string', '...other_members='=>'float|string'], - 'RedisCluster::geoDist' => ['', 'key'=>'string', 'member1'=>'string', 'member2'=>'string', 'unit='=>'string'], - 'RedisCluster::geoRadius' => ['', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'radiusUnit'=>'string', 'options='=>'array'], - 'RedisCluster::geoRadiusByMember' => ['string[]', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'radiusUnit'=>'string', 'options='=>'array'], - 'RedisCluster::geohash' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], - 'RedisCluster::geopos' => ['array', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'], - 'RedisCluster::get' => ['string|false', 'key'=>'string'], - 'RedisCluster::getBit' => ['int', 'key'=>'string', 'offset'=>'int'], - 'RedisCluster::getLastError' => ['?string'], - 'RedisCluster::getMode' => ['int'], - 'RedisCluster::getOption' => ['int', 'option'=>'int'], - 'RedisCluster::getRange' => ['string', 'key'=>'string', 'start'=>'int', 'end'=>'int'], - 'RedisCluster::getSet' => ['string', 'key'=>'string', 'value'=>'string'], - 'RedisCluster::hDel' => ['int|false', 'key'=>'string', 'hashKey'=>'string', '...other_hashKeys='=>'string[]'], - 'RedisCluster::hExists' => ['bool', 'key'=>'string', 'hashKey'=>'string'], - 'RedisCluster::hGet' => ['string|false', 'key'=>'string', 'hashKey'=>'string'], - 'RedisCluster::hGetAll' => ['array', 'key'=>'string'], - 'RedisCluster::hIncrBy' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'int'], - 'RedisCluster::hIncrByFloat' => ['float', 'key'=>'string', 'field'=>'string', 'increment'=>'float'], - 'RedisCluster::hKeys' => ['array', 'key'=>'string'], - 'RedisCluster::hLen' => ['int|false', 'key'=>'string'], - 'RedisCluster::hMGet' => ['array', 'key'=>'string', 'hashKeys'=>'array'], - 'RedisCluster::hMSet' => ['bool', 'key'=>'string', 'hashKeys'=>'array'], - 'RedisCluster::hScan' => ['array', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], - 'RedisCluster::hSet' => ['int', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], - 'RedisCluster::hSetNx' => ['bool', 'key'=>'string', 'hashKey'=>'string', 'value'=>'string'], - 'RedisCluster::hStrlen' => ['int', 'key'=>'string', 'member'=>'string'], - 'RedisCluster::hVals' => ['array', 'key'=>'string'], - 'RedisCluster::incr' => ['int', 'key'=>'string'], - 'RedisCluster::incrBy' => ['int', 'key'=>'string', 'value'=>'int'], - 'RedisCluster::incrByFloat' => ['float', 'key'=>'string', 'increment'=>'float'], - 'RedisCluster::info' => ['array', 'nodeParams'=>'string|array{0:string,1:int}', 'option='=>'string'], - 'RedisCluster::keys' => ['array', 'pattern'=>'string'], - 'RedisCluster::lGet' => ['', 'key'=>'string', 'index'=>'int'], - 'RedisCluster::lIndex' => ['string|false', 'key'=>'string', 'index'=>'int'], - 'RedisCluster::lInsert' => ['int', 'key'=>'string', 'position'=>'int', 'pivot'=>'string', 'value'=>'string'], - 'RedisCluster::lLen' => ['int', 'key'=>'string'], - 'RedisCluster::lPop' => ['string|false', 'key'=>'string'], - 'RedisCluster::lPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], - 'RedisCluster::lPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], - 'RedisCluster::lRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], - 'RedisCluster::lRem' => ['int|false', 'key'=>'string', 'value'=>'string', 'count'=>'int'], - 'RedisCluster::lSet' => ['bool', 'key'=>'string', 'index'=>'int', 'value'=>'string'], - 'RedisCluster::lTrim' => ['array|false', 'key'=>'string', 'start'=>'int', 'stop'=>'int'], - 'RedisCluster::lastSave' => ['int', 'nodeParams'=>'string|array{0:string,1:int}'], - 'RedisCluster::mget' => ['array', 'array'=>'array'], - 'RedisCluster::mset' => ['bool', 'array'=>'array'], - 'RedisCluster::msetnx' => ['int', 'array'=>'array'], - 'RedisCluster::multi' => ['Redis', 'mode='=>'int'], - 'RedisCluster::object' => ['string|int|false', 'string'=>'string', 'key'=>'string'], - 'RedisCluster::pExpire' => ['bool', 'key'=>'string', 'ttl'=>'int'], - 'RedisCluster::pExpireAt' => ['bool', 'key'=>'string', 'timestamp'=>'int'], - 'RedisCluster::persist' => ['bool', 'key'=>'string'], - 'RedisCluster::pfAdd' => ['bool', 'key'=>'string', 'elements'=>'array'], - 'RedisCluster::pfCount' => ['int', 'key'=>'string'], - 'RedisCluster::pfMerge' => ['bool', 'destKey'=>'string', 'sourceKeys'=>'array'], - 'RedisCluster::ping' => ['string', 'nodeParams'=>'string|array{0:string,1:int}'], - 'RedisCluster::psetex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], - 'RedisCluster::psubscribe' => ['mixed', 'patterns'=>'array', 'callback'=>'string'], - 'RedisCluster::pttl' => ['int', 'key'=>'string'], - 'RedisCluster::publish' => ['int', 'channel'=>'string', 'message'=>'string'], - 'RedisCluster::pubsub' => ['array', 'nodeParams'=>'string', 'keyword'=>'string', '...argument='=>'string'], - 'RedisCluster::punSubscribe' => ['', 'channels'=>'', 'callback'=>''], - 'RedisCluster::rPop' => ['string|false', 'key'=>'string'], - 'RedisCluster::rPush' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], - 'RedisCluster::rPushx' => ['int|false', 'key'=>'string', 'value'=>'string'], - 'RedisCluster::randomKey' => ['string', 'nodeParams'=>'string|array{0:string,1:int}'], - 'RedisCluster::rawCommand' => ['mixed', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'arguments='=>'mixed'], - 'RedisCluster::rename' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string'], - 'RedisCluster::renameNx' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string'], - 'RedisCluster::restore' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], - 'RedisCluster::role' => ['array'], - 'RedisCluster::rpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string'], - 'RedisCluster::sAdd' => ['int|false', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], - 'RedisCluster::sAddArray' => ['int|false', 'key'=>'string', 'valueArray'=>'array'], - 'RedisCluster::sCard' => ['int', 'key'=>'string'], - 'RedisCluster::sDiff' => ['list', 'key1'=>'string', 'key2'=>'string', '...other_keys='=>'string'], - 'RedisCluster::sDiffStore' => ['int', 'dstKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], - 'RedisCluster::sInter' => ['list', 'key'=>'string', '...other_keys='=>'string'], - 'RedisCluster::sInterStore' => ['int', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], - 'RedisCluster::sIsMember' => ['bool', 'key'=>'string', 'value'=>'string'], - 'RedisCluster::sMembers' => ['list', 'key'=>'string'], - 'RedisCluster::sMove' => ['bool', 'srcKey'=>'string', 'dstKey'=>'string', 'member'=>'string'], - 'RedisCluster::sPop' => ['string', 'key'=>'string'], - 'RedisCluster::sRandMember' => ['array|string', 'key'=>'string', 'count='=>'int'], - 'RedisCluster::sRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], - 'RedisCluster::sScan' => ['array|false', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'null', 'count='=>'int'], - 'RedisCluster::sUnion' => ['list', 'key1'=>'string', '...other_keys='=>'string'], - 'RedisCluster::sUnion\'1' => ['list', 'keys'=>'string[]'], - 'RedisCluster::sUnionStore' => ['int', 'dstKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'], - 'RedisCluster::save' => ['bool', 'nodeParams'=>'string|array{0:string,1:int}'], - 'RedisCluster::scan' => ['array|false', '&iterator'=>'int', 'nodeParams'=>'string|array{0:string,1:int}', 'pattern='=>'string', 'count='=>'int'], - 'RedisCluster::script' => ['string|bool|array', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'script='=>'string', '...other_scripts='=>'string[]'], - 'RedisCluster::set' => ['bool', 'key'=>'string', 'value'=>'string', 'timeout='=>'array|int'], - 'RedisCluster::setBit' => ['int', 'key'=>'string', 'offset'=>'int', 'value'=>'bool|int'], - 'RedisCluster::setOption' => ['bool', 'option'=>'int', 'value'=>'string|int'], - 'RedisCluster::setRange' => ['string', 'key'=>'string', 'offset'=>'int', 'value'=>'string'], - 'RedisCluster::setex' => ['bool', 'key'=>'string', 'ttl'=>'int', 'value'=>'string'], - 'RedisCluster::setnx' => ['bool', 'key'=>'string', 'value'=>'string'], - 'RedisCluster::slowLog' => ['array|int|bool', 'nodeParams'=>'string|array{0:string,1:int}', 'command'=>'string', 'length='=>'int'], - 'RedisCluster::sort' => ['array', 'key'=>'string', 'option='=>'array'], - 'RedisCluster::strlen' => ['int', 'key'=>'string'], - 'RedisCluster::subscribe' => ['mixed', 'channels'=>'array', 'callback'=>'string'], - 'RedisCluster::time' => ['array'], - 'RedisCluster::ttl' => ['int', 'key'=>'string'], - 'RedisCluster::type' => ['int', 'key'=>'string'], - 'RedisCluster::unSubscribe' => ['', 'channels'=>'', '...other_channels='=>''], - 'RedisCluster::unlink' => ['int', 'key'=>'string', '...other_keys='=>'string'], - 'RedisCluster::unwatch' => [''], - 'RedisCluster::watch' => ['void', 'key'=>'string', '...other_keys='=>'string'], - 'RedisCluster::xack' => ['', 'str_key'=>'string', 'str_group'=>'string', 'arr_ids'=>'array'], - 'RedisCluster::xadd' => ['', 'str_key'=>'string', 'str_id'=>'string', 'arr_fields'=>'array', 'i_maxlen='=>'', 'boo_approximate='=>''], - 'RedisCluster::xclaim' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_consumer'=>'string', 'i_min_idle'=>'', 'arr_ids'=>'array', 'arr_opts='=>'array'], - 'RedisCluster::xdel' => ['', 'str_key'=>'string', 'arr_ids'=>'array'], - 'RedisCluster::xgroup' => ['', 'str_operation'=>'string', 'str_key='=>'string', 'str_arg1='=>'', 'str_arg2='=>'', 'str_arg3='=>''], - 'RedisCluster::xinfo' => ['', 'str_cmd'=>'string', 'str_key='=>'string', 'str_group='=>'string'], - 'RedisCluster::xlen' => ['', 'key'=>''], - 'RedisCluster::xpending' => ['', 'str_key'=>'string', 'str_group'=>'string', 'str_start='=>'', 'str_end='=>'', 'i_count='=>'', 'str_consumer='=>'string'], - 'RedisCluster::xrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], - 'RedisCluster::xread' => ['', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], - 'RedisCluster::xreadgroup' => ['', 'str_group'=>'string', 'str_consumer'=>'string', 'arr_streams'=>'array', 'i_count='=>'', 'i_block='=>''], - 'RedisCluster::xrevrange' => ['', 'str_key'=>'string', 'str_start'=>'', 'str_end'=>'', 'i_count='=>''], - 'RedisCluster::xtrim' => ['', 'str_key'=>'string', 'i_maxlen'=>'', 'boo_approximate='=>''], - 'RedisCluster::zAdd' => ['int', 'key'=>'string', 'score1'=>'float', 'value1'=>'string', 'score2='=>'float', 'value2='=>'string', 'scoreN='=>'float', 'valueN='=>'string'], - 'RedisCluster::zCard' => ['int', 'key'=>'string'], - 'RedisCluster::zCount' => ['int', 'key'=>'string', 'start'=>'string', 'end'=>'string'], - 'RedisCluster::zIncrBy' => ['float', 'key'=>'string', 'value'=>'float', 'member'=>'string'], - 'RedisCluster::zInterStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], - 'RedisCluster::zLexCount' => ['int', 'key'=>'string', 'min'=>'int', 'max'=>'int'], - 'RedisCluster::zRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscores='=>'bool'], - 'RedisCluster::zRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], - 'RedisCluster::zRangeByScore' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'options='=>'array'], - 'RedisCluster::zRank' => ['int', 'key'=>'string', 'member'=>'string'], - 'RedisCluster::zRem' => ['int', 'key'=>'string', 'member1'=>'string', '...other_members='=>'string'], - 'RedisCluster::zRemRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int'], - 'RedisCluster::zRemRangeByRank' => ['int', 'key'=>'string', 'start'=>'int', 'end'=>'int'], - 'RedisCluster::zRemRangeByScore' => ['int', 'key'=>'string', 'start'=>'float|string', 'end'=>'float|string'], - 'RedisCluster::zRevRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'withscore='=>'bool'], - 'RedisCluster::zRevRangeByLex' => ['array', 'key'=>'string', 'min'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], - 'RedisCluster::zRevRangeByScore' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'options='=>'array'], - 'RedisCluster::zRevRank' => ['int', 'key'=>'string', 'member'=>'string'], - 'RedisCluster::zScan' => ['array|false', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], - 'RedisCluster::zScore' => ['float', 'key'=>'string', 'member'=>'string'], - 'RedisCluster::zUnionStore' => ['int', 'Output'=>'string', 'ZSetKeys'=>'array', 'Weights='=>'?array', 'aggregateFunction='=>'string'], - 'Reflection::export' => ['?string', 'r'=>'reflector', 'return='=>'bool'], - 'Reflection::getModifierNames' => ['array', 'modifiers'=>'int'], - 'ReflectionClass::__clone' => ['void'], - 'ReflectionClass::__construct' => ['void', 'argument'=>'object|class-string'], - 'ReflectionClass::__toString' => ['string'], - 'ReflectionClass::export' => ['?string', 'argument'=>'string|object', 'return='=>'bool'], - 'ReflectionClass::getConstant' => ['mixed', 'name'=>'string'], - 'ReflectionClass::getConstants' => ['array'], - 'ReflectionClass::getConstructor' => ['?ReflectionMethod'], - 'ReflectionClass::getDefaultProperties' => ['array'], - 'ReflectionClass::getDocComment' => ['string|false'], - 'ReflectionClass::getEndLine' => ['int|false'], - 'ReflectionClass::getExtension' => ['?ReflectionExtension'], - 'ReflectionClass::getExtensionName' => ['string|false'], - 'ReflectionClass::getFileName' => ['string|false'], - 'ReflectionClass::getInterfaceNames' => ['list'], - 'ReflectionClass::getInterfaces' => ['array'], - 'ReflectionClass::getMethod' => ['ReflectionMethod', 'name'=>'string'], - 'ReflectionClass::getMethods' => ['list', 'filter='=>'int'], - 'ReflectionClass::getModifiers' => ['int'], - 'ReflectionClass::getName' => ['class-string'], - 'ReflectionClass::getNamespaceName' => ['string'], - 'ReflectionClass::getParentClass' => ['ReflectionClass|false'], - 'ReflectionClass::getProperties' => ['list', 'filter='=>'int'], - 'ReflectionClass::getProperty' => ['ReflectionProperty', 'name'=>'string'], - 'ReflectionClass::getReflectionConstant' => ['ReflectionClassConstant|false', 'name'=>'string'], - 'ReflectionClass::getReflectionConstants' => ['list'], - 'ReflectionClass::getShortName' => ['string'], - 'ReflectionClass::getStartLine' => ['int|false'], - 'ReflectionClass::getStaticProperties' => ['array'], - 'ReflectionClass::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'], - 'ReflectionClass::getTraitAliases' => ['array|null'], - 'ReflectionClass::getTraitNames' => ['list|null'], - 'ReflectionClass::getTraits' => ['array'], - 'ReflectionClass::hasConstant' => ['bool', 'name'=>'string'], - 'ReflectionClass::hasMethod' => ['bool', 'name'=>'string'], - 'ReflectionClass::hasProperty' => ['bool', 'name'=>'string'], - 'ReflectionClass::implementsInterface' => ['bool', 'interface_name'=>'interface-string|ReflectionClass'], - 'ReflectionClass::inNamespace' => ['bool'], - 'ReflectionClass::isAbstract' => ['bool'], - 'ReflectionClass::isAnonymous' => ['bool'], - 'ReflectionClass::isCloneable' => ['bool'], - 'ReflectionClass::isFinal' => ['bool'], - 'ReflectionClass::isInstance' => ['bool', 'object'=>'object'], - 'ReflectionClass::isInstantiable' => ['bool'], - 'ReflectionClass::isInterface' => ['bool'], - 'ReflectionClass::isInternal' => ['bool'], - 'ReflectionClass::isIterateable' => ['bool'], - 'ReflectionClass::isSubclassOf' => ['bool', 'class'=>'class-string|ReflectionClass'], - 'ReflectionClass::isTrait' => ['bool'], - 'ReflectionClass::isUserDefined' => ['bool'], - 'ReflectionClass::newInstance' => ['object', '...args='=>'mixed'], - 'ReflectionClass::newInstanceArgs' => ['object', 'args='=>'list'], - 'ReflectionClass::newInstanceWithoutConstructor' => ['object'], - 'ReflectionClass::setStaticPropertyValue' => ['void', 'name'=>'string', 'value'=>'mixed'], - 'ReflectionClassConstant::__construct' => ['void', 'class'=>'mixed', 'name'=>'string'], - 'ReflectionClassConstant::__toString' => ['string'], - 'ReflectionClassConstant::export' => ['string', 'class'=>'mixed', 'name'=>'string', 'return='=>'bool'], - 'ReflectionClassConstant::getDeclaringClass' => ['ReflectionClass'], - 'ReflectionClassConstant::getDocComment' => ['string|false'], - 'ReflectionClassConstant::getModifiers' => ['int'], - 'ReflectionClassConstant::getName' => ['string'], - 'ReflectionClassConstant::getValue' => ['scalar|array|null'], - 'ReflectionClassConstant::isPrivate' => ['bool'], - 'ReflectionClassConstant::isProtected' => ['bool'], - 'ReflectionClassConstant::isPublic' => ['bool'], - 'ReflectionExtension::__clone' => ['void'], - 'ReflectionExtension::__construct' => ['void', 'name'=>'string'], - 'ReflectionExtension::__toString' => ['string'], - 'ReflectionExtension::export' => ['?string', 'name'=>'string', 'return='=>'bool'], - 'ReflectionExtension::getClassNames' => ['list'], - 'ReflectionExtension::getClasses' => ['array'], - 'ReflectionExtension::getConstants' => ['array'], - 'ReflectionExtension::getDependencies' => ['array'], - 'ReflectionExtension::getFunctions' => ['array'], - 'ReflectionExtension::getINIEntries' => ['array'], - 'ReflectionExtension::getName' => ['string'], - 'ReflectionExtension::getVersion' => ['string'], - 'ReflectionExtension::info' => ['void'], - 'ReflectionExtension::isPersistent' => ['bool'], - 'ReflectionExtension::isTemporary' => ['bool'], - 'ReflectionFunction::__construct' => ['void', 'name'=>'callable-string|Closure'], - 'ReflectionFunction::__toString' => ['string'], - 'ReflectionFunction::export' => ['?string', 'name'=>'string', 'return='=>'bool'], - 'ReflectionFunction::getClosure' => ['?Closure'], - 'ReflectionFunction::getClosureScopeClass' => ['ReflectionClass'], - 'ReflectionFunction::getClosureThis' => ['bool'], - 'ReflectionFunction::getDocComment' => ['string|false'], - 'ReflectionFunction::getEndLine' => ['int|false'], - 'ReflectionFunction::getExtension' => ['?ReflectionExtension'], - 'ReflectionFunction::getExtensionName' => ['string|false'], - 'ReflectionFunction::getFileName' => ['string|false'], - 'ReflectionFunction::getName' => ['callable-string'], - 'ReflectionFunction::getNamespaceName' => ['string'], - 'ReflectionFunction::getNumberOfParameters' => ['int'], - 'ReflectionFunction::getNumberOfRequiredParameters' => ['int'], - 'ReflectionFunction::getParameters' => ['list'], - 'ReflectionFunction::getReturnType' => ['?ReflectionType'], - 'ReflectionFunction::getShortName' => ['string'], - 'ReflectionFunction::getStartLine' => ['int|false'], - 'ReflectionFunction::getStaticVariables' => ['array'], - 'ReflectionFunction::hasReturnType' => ['bool'], - 'ReflectionFunction::inNamespace' => ['bool'], - 'ReflectionFunction::invoke' => ['mixed', '...args='=>'mixed'], - 'ReflectionFunction::invokeArgs' => ['mixed', 'args'=>'array'], - 'ReflectionFunction::isClosure' => ['bool'], - 'ReflectionFunction::isDeprecated' => ['bool'], - 'ReflectionFunction::isDisabled' => ['bool'], - 'ReflectionFunction::isGenerator' => ['bool'], - 'ReflectionFunction::isInternal' => ['bool'], - 'ReflectionFunction::isUserDefined' => ['bool'], - 'ReflectionFunction::isVariadic' => ['bool'], - 'ReflectionFunction::returnsReference' => ['bool'], - 'ReflectionFunctionAbstract::__clone' => ['void'], - 'ReflectionFunctionAbstract::__toString' => ['string'], - 'ReflectionFunctionAbstract::export' => ['?string'], - 'ReflectionFunctionAbstract::getClosureScopeClass' => ['ReflectionClass|null'], - 'ReflectionFunctionAbstract::getClosureThis' => ['object|null'], - 'ReflectionFunctionAbstract::getDocComment' => ['string|false'], - 'ReflectionFunctionAbstract::getEndLine' => ['int|false'], - 'ReflectionFunctionAbstract::getExtension' => ['ReflectionExtension'], - 'ReflectionFunctionAbstract::getExtensionName' => ['string'], - 'ReflectionFunctionAbstract::getFileName' => ['string|false'], - 'ReflectionFunctionAbstract::getName' => ['string'], - 'ReflectionFunctionAbstract::getNamespaceName' => ['string'], - 'ReflectionFunctionAbstract::getNumberOfParameters' => ['int'], - 'ReflectionFunctionAbstract::getNumberOfRequiredParameters' => ['int'], - 'ReflectionFunctionAbstract::getParameters' => ['list'], - 'ReflectionFunctionAbstract::getReturnType' => ['?ReflectionType'], - 'ReflectionFunctionAbstract::getShortName' => ['string'], - 'ReflectionFunctionAbstract::getStartLine' => ['int|false'], - 'ReflectionFunctionAbstract::getStaticVariables' => ['array'], - 'ReflectionFunctionAbstract::hasReturnType' => ['bool'], - 'ReflectionFunctionAbstract::inNamespace' => ['bool'], - 'ReflectionFunctionAbstract::isClosure' => ['bool'], - 'ReflectionFunctionAbstract::isDeprecated' => ['bool'], - 'ReflectionFunctionAbstract::isGenerator' => ['bool'], - 'ReflectionFunctionAbstract::isInternal' => ['bool'], - 'ReflectionFunctionAbstract::isUserDefined' => ['bool'], - 'ReflectionFunctionAbstract::isVariadic' => ['bool'], - 'ReflectionFunctionAbstract::returnsReference' => ['bool'], - 'ReflectionGenerator::__construct' => ['void', 'generator'=>'object'], - 'ReflectionGenerator::getExecutingFile' => ['string'], - 'ReflectionGenerator::getExecutingGenerator' => ['Generator'], - 'ReflectionGenerator::getExecutingLine' => ['int'], - 'ReflectionGenerator::getFunction' => ['ReflectionFunctionAbstract'], - 'ReflectionGenerator::getThis' => ['?object'], - 'ReflectionGenerator::getTrace' => ['array', 'options='=>'int'], - 'ReflectionMethod::__construct' => ['void', 'class'=>'class-string|object', 'name'=>'string'], - 'ReflectionMethod::__construct\'1' => ['void', 'class_method'=>'string'], - 'ReflectionMethod::__toString' => ['string'], - 'ReflectionMethod::export' => ['?string', 'class'=>'string', 'name'=>'string', 'return='=>'bool'], - 'ReflectionMethod::getClosure' => ['?Closure', 'object='=>'object'], - 'ReflectionMethod::getClosureScopeClass' => ['ReflectionClass'], - 'ReflectionMethod::getClosureThis' => ['object'], - 'ReflectionMethod::getDeclaringClass' => ['ReflectionClass'], - 'ReflectionMethod::getDocComment' => ['false|string'], - 'ReflectionMethod::getEndLine' => ['false|int'], - 'ReflectionMethod::getExtension' => ['ReflectionExtension'], - 'ReflectionMethod::getExtensionName' => ['string'], - 'ReflectionMethod::getFileName' => ['false|string'], - 'ReflectionMethod::getModifiers' => ['int'], - 'ReflectionMethod::getName' => ['string'], - 'ReflectionMethod::getNamespaceName' => ['string'], - 'ReflectionMethod::getNumberOfParameters' => ['int'], - 'ReflectionMethod::getNumberOfRequiredParameters' => ['int'], - 'ReflectionMethod::getParameters' => ['list<\ReflectionParameter>'], - 'ReflectionMethod::getPrototype' => ['ReflectionMethod'], - 'ReflectionMethod::getReturnType' => ['?ReflectionType'], - 'ReflectionMethod::getShortName' => ['string'], - 'ReflectionMethod::getStartLine' => ['false|int'], - 'ReflectionMethod::getStaticVariables' => ['array'], - 'ReflectionMethod::hasReturnType' => ['bool'], - 'ReflectionMethod::inNamespace' => ['bool'], - 'ReflectionMethod::invoke' => ['mixed', 'object'=>'?object', '...args='=>'mixed'], - 'ReflectionMethod::invokeArgs' => ['mixed', 'object'=>'?object', 'args'=>'array'], - 'ReflectionMethod::isAbstract' => ['bool'], - 'ReflectionMethod::isClosure' => ['bool'], - 'ReflectionMethod::isConstructor' => ['bool'], - 'ReflectionMethod::isDeprecated' => ['bool'], - 'ReflectionMethod::isDestructor' => ['bool'], - 'ReflectionMethod::isFinal' => ['bool'], - 'ReflectionMethod::isGenerator' => ['bool'], - 'ReflectionMethod::isInternal' => ['bool'], - 'ReflectionMethod::isPrivate' => ['bool'], - 'ReflectionMethod::isProtected' => ['bool'], - 'ReflectionMethod::isPublic' => ['bool'], - 'ReflectionMethod::isStatic' => ['bool'], - 'ReflectionMethod::isUserDefined' => ['bool'], - 'ReflectionMethod::isVariadic' => ['bool'], - 'ReflectionMethod::returnsReference' => ['bool'], - 'ReflectionMethod::setAccessible' => ['void', 'visible'=>'bool'], - 'ReflectionNamedType::__clone' => ['void'], - 'ReflectionNamedType::__toString' => ['string'], - 'ReflectionNamedType::allowsNull' => ['bool'], - 'ReflectionNamedType::getName' => ['string'], - 'ReflectionNamedType::isBuiltin' => ['bool'], - 'ReflectionObject::__clone' => ['void'], - 'ReflectionObject::__construct' => ['void', 'argument'=>'object'], - 'ReflectionObject::__toString' => ['string'], - 'ReflectionObject::export' => ['?string', 'argument'=>'object', 'return='=>'bool'], - 'ReflectionObject::getConstant' => ['mixed', 'name'=>'string'], - 'ReflectionObject::getConstants' => ['array'], - 'ReflectionObject::getConstructor' => ['?ReflectionMethod'], - 'ReflectionObject::getDefaultProperties' => ['array'], - 'ReflectionObject::getDocComment' => ['false|string'], - 'ReflectionObject::getEndLine' => ['false|int'], - 'ReflectionObject::getExtension' => ['?ReflectionExtension'], - 'ReflectionObject::getExtensionName' => ['false|string'], - 'ReflectionObject::getFileName' => ['false|string'], - 'ReflectionObject::getInterfaceNames' => ['class-string[]'], - 'ReflectionObject::getInterfaces' => ['array'], - 'ReflectionObject::getMethod' => ['ReflectionMethod', 'name'=>'string'], - 'ReflectionObject::getMethods' => ['ReflectionMethod[]', 'filter='=>'int'], - 'ReflectionObject::getModifiers' => ['int'], - 'ReflectionObject::getName' => ['string'], - 'ReflectionObject::getNamespaceName' => ['string'], - 'ReflectionObject::getParentClass' => ['ReflectionClass|false'], - 'ReflectionObject::getProperties' => ['ReflectionProperty[]', 'filter='=>'int'], - 'ReflectionObject::getProperty' => ['ReflectionProperty', 'name'=>'string'], - 'ReflectionObject::getReflectionConstant' => ['ReflectionClassConstant', 'name'=>'string'], - 'ReflectionObject::getReflectionConstants' => ['list<\ReflectionClassConstant>'], - 'ReflectionObject::getShortName' => ['string'], - 'ReflectionObject::getStartLine' => ['false|int'], - 'ReflectionObject::getStaticProperties' => ['ReflectionProperty[]'], - 'ReflectionObject::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'], - 'ReflectionObject::getTraitAliases' => ['array'], - 'ReflectionObject::getTraitNames' => ['list'], - 'ReflectionObject::getTraits' => ['array'], - 'ReflectionObject::hasConstant' => ['bool', 'name'=>'string'], - 'ReflectionObject::hasMethod' => ['bool', 'name'=>'string'], - 'ReflectionObject::hasProperty' => ['bool', 'name'=>'string'], - 'ReflectionObject::implementsInterface' => ['bool', 'interface_name'=>'ReflectionClass|string'], - 'ReflectionObject::inNamespace' => ['bool'], - 'ReflectionObject::isAbstract' => ['bool'], - 'ReflectionObject::isAnonymous' => ['bool'], - 'ReflectionObject::isCloneable' => ['bool'], - 'ReflectionObject::isFinal' => ['bool'], - 'ReflectionObject::isInstance' => ['bool', 'object'=>'object'], - 'ReflectionObject::isInstantiable' => ['bool'], - 'ReflectionObject::isInterface' => ['bool'], - 'ReflectionObject::isInternal' => ['bool'], - 'ReflectionObject::isIterable' => ['bool'], - 'ReflectionObject::isIterateable' => ['bool'], - 'ReflectionObject::isSubclassOf' => ['bool', 'class'=>'ReflectionClass|string'], - 'ReflectionObject::isTrait' => ['bool'], - 'ReflectionObject::isUserDefined' => ['bool'], - 'ReflectionObject::newInstance' => ['object', 'args='=>'mixed', '...args='=>'array'], - 'ReflectionObject::newInstanceArgs' => ['object', 'args='=>'array'], - 'ReflectionObject::newInstanceWithoutConstructor' => ['object'], - 'ReflectionObject::setStaticPropertyValue' => ['void', 'name'=>'string', 'value'=>'string'], - 'ReflectionParameter::__clone' => ['void'], - 'ReflectionParameter::__construct' => ['void', 'function'=>'', 'parameter'=>''], - 'ReflectionParameter::__toString' => ['string'], - 'ReflectionParameter::allowsNull' => ['bool'], - 'ReflectionParameter::canBePassedByValue' => ['bool'], - 'ReflectionParameter::export' => ['?string', 'function'=>'string', 'parameter'=>'string', 'return='=>'bool'], - 'ReflectionParameter::getClass' => ['?ReflectionClass'], - 'ReflectionParameter::getDeclaringClass' => ['?ReflectionClass'], - 'ReflectionParameter::getDeclaringFunction' => ['ReflectionFunctionAbstract'], - 'ReflectionParameter::getDefaultValue' => ['mixed'], - 'ReflectionParameter::getDefaultValueConstantName' => ['?string'], - 'ReflectionParameter::getName' => ['string'], - 'ReflectionParameter::getPosition' => ['int'], - 'ReflectionParameter::getType' => ['?ReflectionType'], - 'ReflectionParameter::hasType' => ['bool'], - 'ReflectionParameter::isArray' => ['bool'], - 'ReflectionParameter::isCallable' => ['?bool'], - 'ReflectionParameter::isDefaultValueAvailable' => ['bool'], - 'ReflectionParameter::isDefaultValueConstant' => ['bool'], - 'ReflectionParameter::isOptional' => ['bool'], - 'ReflectionParameter::isPassedByReference' => ['bool'], - 'ReflectionParameter::isVariadic' => ['bool'], - 'ReflectionProperty::__clone' => ['void'], - 'ReflectionProperty::__construct' => ['void', 'class'=>'', 'name'=>'string'], - 'ReflectionProperty::__toString' => ['string'], - 'ReflectionProperty::export' => ['?string', 'class'=>'mixed', 'name'=>'string', 'return='=>'bool'], - 'ReflectionProperty::getDeclaringClass' => ['ReflectionClass'], - 'ReflectionProperty::getDocComment' => ['string|false'], - 'ReflectionProperty::getModifiers' => ['int'], - 'ReflectionProperty::getName' => ['string'], - 'ReflectionProperty::getValue' => ['mixed', 'object='=>'object'], - 'ReflectionProperty::hasType' => ['bool'], - 'ReflectionProperty::isDefault' => ['bool'], - 'ReflectionProperty::isPrivate' => ['bool'], - 'ReflectionProperty::isProtected' => ['bool'], - 'ReflectionProperty::isPublic' => ['bool'], - 'ReflectionProperty::isStatic' => ['bool'], - 'ReflectionProperty::setAccessible' => ['void', 'visible'=>'bool'], - 'ReflectionProperty::setValue' => ['void', 'object'=>'null|object', 'value'=>''], - 'ReflectionProperty::setValue\'1' => ['void', 'value'=>''], - 'ReflectionType::__clone' => ['void'], - 'ReflectionType::__toString' => ['string'], - 'ReflectionType::allowsNull' => ['bool'], - 'ReflectionType::isBuiltin' => ['bool'], - 'ReflectionZendExtension::__clone' => ['void'], - 'ReflectionZendExtension::__construct' => ['void', 'name'=>'string'], - 'ReflectionZendExtension::__toString' => ['string'], - 'ReflectionZendExtension::export' => ['?string', 'name'=>'string', 'return='=>'bool'], - 'ReflectionZendExtension::getAuthor' => ['string'], - 'ReflectionZendExtension::getCopyright' => ['string'], - 'ReflectionZendExtension::getName' => ['string'], - 'ReflectionZendExtension::getURL' => ['string'], - 'ReflectionZendExtension::getVersion' => ['string'], - 'Reflector::__toString' => ['string'], - 'Reflector::export' => ['?string'], - 'RegexIterator::__construct' => ['void', 'iterator'=>'Iterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], - 'RegexIterator::accept' => ['bool'], - 'RegexIterator::current' => ['mixed'], - 'RegexIterator::getFlags' => ['int'], - 'RegexIterator::getInnerIterator' => ['Iterator'], - 'RegexIterator::getMode' => ['int'], - 'RegexIterator::getPregFlags' => ['int'], - 'RegexIterator::getRegex' => ['string'], - '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::valid' => ['bool'], - 'ResourceBundle::__construct' => ['void', 'locale'=>'string', 'bundlename'=>'string', 'fallback='=>'bool'], - 'ResourceBundle::count' => ['int'], - 'ResourceBundle::create' => ['?ResourceBundle', 'locale'=>'string', 'bundlename'=>'string', 'fallback='=>'bool'], - 'ResourceBundle::get' => ['', 'index'=>'string|int', 'fallback='=>'bool'], - 'ResourceBundle::getErrorCode' => ['int'], - 'ResourceBundle::getErrorMessage' => ['string'], - 'ResourceBundle::getLocales' => ['array', 'bundlename'=>'string'], - 'Runkit_Sandbox::__construct' => ['void', 'options='=>'array'], - 'Runkit_Sandbox_Parent' => [''], - 'Runkit_Sandbox_Parent::__construct' => ['void'], - 'RuntimeException::__clone' => ['void'], - 'RuntimeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?RuntimeException'], - 'RuntimeException::__toString' => ['string'], - 'RuntimeException::getCode' => ['int'], - 'RuntimeException::getFile' => ['string'], - 'RuntimeException::getLine' => ['int'], - 'RuntimeException::getMessage' => ['string'], - 'RuntimeException::getPrevious' => ['Throwable|RuntimeException|null'], - 'RuntimeException::getTrace' => ['list\',args?:array}>'], - 'RuntimeException::getTraceAsString' => ['string'], - 'SAMConnection::commit' => ['bool'], - 'SAMConnection::connect' => ['bool', 'protocol'=>'string', 'properties='=>'array'], - 'SAMConnection::disconnect' => ['bool'], - 'SAMConnection::errno' => ['int'], - 'SAMConnection::error' => ['string'], - 'SAMConnection::isConnected' => ['bool'], - 'SAMConnection::peek' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], - 'SAMConnection::peekAll' => ['array', 'target'=>'string', 'properties='=>'array'], - 'SAMConnection::receive' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], - 'SAMConnection::remove' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], - 'SAMConnection::rollback' => ['bool'], - 'SAMConnection::send' => ['string', 'target'=>'string', 'msg'=>'sammessage', 'properties='=>'array'], - 'SAMConnection::setDebug' => ['', 'switch'=>'bool'], - 'SAMConnection::subscribe' => ['string', 'targettopic'=>'string'], - 'SAMConnection::unsubscribe' => ['bool', 'subscriptionid'=>'string', 'targettopic='=>'string'], - 'SAMMessage::body' => ['string'], - 'SAMMessage::header' => ['object'], - 'SCA::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], - 'SCA::getService' => ['', 'target'=>'string', 'binding='=>'string', 'config='=>'array'], - 'SCA_LocalProxy::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], - 'SCA_SoapProxy::createDataObject' => ['SDO_DataObject', 'type_namespace_uri'=>'string', 'type_name'=>'string'], - 'SDO_DAS_ChangeSummary::beginLogging' => [''], - 'SDO_DAS_ChangeSummary::endLogging' => [''], - 'SDO_DAS_ChangeSummary::getChangeType' => ['int', 'dataobject'=>'sdo_dataobject'], - 'SDO_DAS_ChangeSummary::getChangedDataObjects' => ['SDO_List'], - 'SDO_DAS_ChangeSummary::getOldContainer' => ['SDO_DataObject', 'data_object'=>'sdo_dataobject'], - 'SDO_DAS_ChangeSummary::getOldValues' => ['SDO_List', 'data_object'=>'sdo_dataobject'], - 'SDO_DAS_ChangeSummary::isLogging' => ['bool'], - 'SDO_DAS_DataFactory::addPropertyToType' => ['', 'parent_type_namespace_uri'=>'string', 'parent_type_name'=>'string', 'property_name'=>'string', 'type_namespace_uri'=>'string', 'type_name'=>'string', 'options='=>'array'], - 'SDO_DAS_DataFactory::addType' => ['', 'type_namespace_uri'=>'string', 'type_name'=>'string', 'options='=>'array'], - 'SDO_DAS_DataFactory::getDataFactory' => ['SDO_DAS_DataFactory'], - 'SDO_DAS_DataObject::getChangeSummary' => ['SDO_DAS_ChangeSummary'], - 'SDO_DAS_Relational::__construct' => ['void', 'database_metadata'=>'array', 'application_root_type='=>'string', 'sdo_containment_references_metadata='=>'array'], - 'SDO_DAS_Relational::applyChanges' => ['', 'database_handle'=>'pdo', 'root_data_object'=>'sdodataobject'], - 'SDO_DAS_Relational::createRootDataObject' => ['SDODataObject'], - 'SDO_DAS_Relational::executePreparedQuery' => ['SDODataObject', 'database_handle'=>'pdo', 'prepared_statement'=>'pdostatement', 'value_list'=>'array', 'column_specifier='=>'array'], - 'SDO_DAS_Relational::executeQuery' => ['SDODataObject', 'database_handle'=>'pdo', 'sql_statement'=>'string', 'column_specifier='=>'array'], - 'SDO_DAS_Setting::getListIndex' => ['int'], - 'SDO_DAS_Setting::getPropertyIndex' => ['int'], - 'SDO_DAS_Setting::getPropertyName' => ['string'], - 'SDO_DAS_Setting::getValue' => [''], - 'SDO_DAS_Setting::isSet' => ['bool'], - 'SDO_DAS_XML::addTypes' => ['', 'xsd_file'=>'string'], - 'SDO_DAS_XML::create' => ['SDO_DAS_XML', 'xsd_file='=>'mixed', 'key='=>'string'], - 'SDO_DAS_XML::createDataObject' => ['SDO_DataObject', 'namespace_uri'=>'string', 'type_name'=>'string'], - 'SDO_DAS_XML::createDocument' => ['SDO_DAS_XML_Document', 'document_element_name'=>'string', 'document_element_namespace_uri'=>'string', 'dataobject='=>'sdo_dataobject'], - 'SDO_DAS_XML::loadFile' => ['SDO_XMLDocument', 'xml_file'=>'string'], - 'SDO_DAS_XML::loadString' => ['SDO_DAS_XML_Document', 'xml_string'=>'string'], - 'SDO_DAS_XML::saveFile' => ['', 'xdoc'=>'sdo_xmldocument', 'xml_file'=>'string', 'indent='=>'int'], - 'SDO_DAS_XML::saveString' => ['string', 'xdoc'=>'sdo_xmldocument', 'indent='=>'int'], - 'SDO_DAS_XML_Document::getRootDataObject' => ['SDO_DataObject'], - 'SDO_DAS_XML_Document::getRootElementName' => ['string'], - 'SDO_DAS_XML_Document::getRootElementURI' => ['string'], - 'SDO_DAS_XML_Document::setEncoding' => ['', 'encoding'=>'string'], - 'SDO_DAS_XML_Document::setXMLDeclaration' => ['', 'xmldeclatation'=>'bool'], - 'SDO_DAS_XML_Document::setXMLVersion' => ['', 'xmlversion'=>'string'], - 'SDO_DataFactory::create' => ['void', 'type_namespace_uri'=>'string', 'type_name'=>'string'], - 'SDO_DataObject::clear' => ['void'], - 'SDO_DataObject::createDataObject' => ['SDO_DataObject', 'identifier'=>''], - 'SDO_DataObject::getContainer' => ['SDO_DataObject'], - 'SDO_DataObject::getSequence' => ['SDO_Sequence'], - 'SDO_DataObject::getTypeName' => ['string'], - 'SDO_DataObject::getTypeNamespaceURI' => ['string'], - 'SDO_Exception::getCause' => [''], - 'SDO_List::insert' => ['void', 'value'=>'mixed', 'index='=>'int'], - 'SDO_Model_Property::getContainingType' => ['SDO_Model_Type'], - 'SDO_Model_Property::getDefault' => [''], - 'SDO_Model_Property::getName' => ['string'], - 'SDO_Model_Property::getType' => ['SDO_Model_Type'], - 'SDO_Model_Property::isContainment' => ['bool'], - 'SDO_Model_Property::isMany' => ['bool'], - 'SDO_Model_ReflectionDataObject::__construct' => ['void', 'data_object'=>'sdo_dataobject'], - 'SDO_Model_ReflectionDataObject::export' => ['mixed', 'rdo'=>'sdo_model_reflectiondataobject', 'return='=>'bool'], - 'SDO_Model_ReflectionDataObject::getContainmentProperty' => ['SDO_Model_Property'], - 'SDO_Model_ReflectionDataObject::getInstanceProperties' => ['array'], - 'SDO_Model_ReflectionDataObject::getType' => ['SDO_Model_Type'], - 'SDO_Model_Type::getBaseType' => ['SDO_Model_Type'], - 'SDO_Model_Type::getName' => ['string'], - 'SDO_Model_Type::getNamespaceURI' => ['string'], - 'SDO_Model_Type::getProperties' => ['array'], - 'SDO_Model_Type::getProperty' => ['SDO_Model_Property', 'identifier'=>''], - 'SDO_Model_Type::isAbstractType' => ['bool'], - 'SDO_Model_Type::isDataType' => ['bool'], - 'SDO_Model_Type::isInstance' => ['bool', 'data_object'=>'sdo_dataobject'], - 'SDO_Model_Type::isOpenType' => ['bool'], - 'SDO_Model_Type::isSequencedType' => ['bool'], - 'SDO_Sequence::getProperty' => ['SDO_Model_Property', 'sequence_index'=>'int'], - 'SDO_Sequence::insert' => ['void', 'value'=>'mixed', 'sequenceindex='=>'int', 'propertyidentifier='=>'mixed'], - 'SDO_Sequence::move' => ['void', 'toindex'=>'int', 'fromindex'=>'int'], - 'SNMP::__construct' => ['void', 'version'=>'int', 'hostname'=>'string', 'community'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'SNMP::close' => ['bool'], - 'SNMP::get' => ['array|string|false', 'objectId'=>'string|array', 'preserveKeys='=>'bool'], - 'SNMP::getErrno' => ['int'], - 'SNMP::getError' => ['string'], - 'SNMP::getnext' => ['string|array|false', 'objectId'=>'string|array'], - 'SNMP::set' => ['bool', 'objectId'=>'string|array', 'type'=>'string|array', 'value'=>'mixed'], - 'SNMP::setSecurity' => ['bool', 'securityLevel'=>'string', 'authProtocol='=>'string', 'authPassphrase='=>'string', 'privacyProtocol='=>'string', 'privacyPassphrase='=>'string', 'contextName='=>'string', 'contextEngineId='=>'string'], - 'SNMP::walk' => ['array|false', 'objectId'=>'string', 'suffixAsKey='=>'bool', 'maxRepetitions='=>'int', 'nonRepeaters='=>'int'], - 'SQLite3::__construct' => ['void', 'filename'=>'string', 'flags='=>'int', 'encryptionKey='=>'?string'], - 'SQLite3::busyTimeout' => ['bool', 'milliseconds'=>'int'], - 'SQLite3::changes' => ['int'], - 'SQLite3::close' => ['bool'], - 'SQLite3::createAggregate' => ['bool', 'name'=>'string', 'stepCallback'=>'callable', 'finalCallback'=>'callable', 'argCount='=>'int'], - 'SQLite3::createCollation' => ['bool', 'name'=>'string', 'callback'=>'callable'], - 'SQLite3::createFunction' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argCount='=>'int'], - 'SQLite3::enableExceptions' => ['bool', 'enable='=>'bool'], - 'SQLite3::escapeString' => ['string', 'string'=>'string'], - 'SQLite3::exec' => ['bool', 'query'=>'string'], - 'SQLite3::lastErrorCode' => ['int'], - 'SQLite3::lastErrorMsg' => ['string'], - 'SQLite3::lastInsertRowID' => ['int'], - 'SQLite3::loadExtension' => ['bool', 'name'=>'string'], - 'SQLite3::open' => ['void', 'filename'=>'string', 'flags='=>'int', 'encryptionKey='=>'?string'], - 'SQLite3::openBlob' => ['resource|false', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'dbname='=>'string'], - 'SQLite3::prepare' => ['SQLite3Stmt|false', 'query'=>'string'], - 'SQLite3::query' => ['SQLite3Result|false', 'query'=>'string'], - 'SQLite3::querySingle' => ['array|int|string|bool|float|null|false', 'query'=>'string', 'entireRow='=>'bool'], - 'SQLite3::version' => ['array'], - 'SQLite3Result::__construct' => ['void'], - 'SQLite3Result::columnName' => ['string', 'column'=>'int'], - 'SQLite3Result::columnType' => ['int', 'column'=>'int'], - 'SQLite3Result::fetchArray' => ['array|false', 'mode='=>'int'], - 'SQLite3Result::finalize' => ['bool'], - 'SQLite3Result::numColumns' => ['int'], - 'SQLite3Result::reset' => ['bool'], - 'SQLite3Stmt::__construct' => ['void', 'sqlite3'=>'sqlite3', 'query'=>'string'], - 'SQLite3Stmt::bindParam' => ['bool', 'param'=>'string|int', '&rw_var'=>'mixed', 'type='=>'int'], - 'SQLite3Stmt::bindValue' => ['bool', 'param'=>'string|int', 'value'=>'mixed', 'type='=>'int'], - 'SQLite3Stmt::clear' => ['bool'], - 'SQLite3Stmt::close' => ['bool'], - 'SQLite3Stmt::execute' => ['false|SQLite3Result'], - 'SQLite3Stmt::getSQL' => ['string', 'expand='=>'bool'], - 'SQLite3Stmt::paramCount' => ['int'], - 'SQLite3Stmt::readOnly' => ['bool'], - 'SQLite3Stmt::reset' => ['bool'], - 'SQLiteDatabase::__construct' => ['void', 'filename'=>'', 'mode='=>'int|mixed', '&error_message'=>''], - 'SQLiteDatabase::arrayQuery' => ['array', 'query'=>'string', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'SQLiteDatabase::busyTimeout' => ['int', 'milliseconds'=>'int'], - 'SQLiteDatabase::changes' => ['int'], - 'SQLiteDatabase::createAggregate' => ['', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], - 'SQLiteDatabase::createFunction' => ['', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], - 'SQLiteDatabase::exec' => ['bool', 'query'=>'string', 'error_msg='=>'string'], - 'SQLiteDatabase::fetchColumnTypes' => ['array', 'table_name'=>'string', 'result_type='=>'int'], - 'SQLiteDatabase::lastError' => ['int'], - 'SQLiteDatabase::lastInsertRowid' => ['int'], - 'SQLiteDatabase::query' => ['SQLiteResult|false', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], - 'SQLiteDatabase::queryExec' => ['bool', 'query'=>'string', '&w_error_msg='=>'string'], - 'SQLiteDatabase::singleQuery' => ['array', 'query'=>'string', 'first_row_only='=>'bool', 'decode_binary='=>'bool'], - 'SQLiteDatabase::unbufferedQuery' => ['SQLiteUnbuffered|false', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], - 'SQLiteException::__clone' => ['void'], - 'SQLiteException::__construct' => ['void', 'message'=>'', 'code'=>'', 'previous'=>''], - 'SQLiteException::__toString' => ['string'], - 'SQLiteException::__wakeup' => ['void'], - 'SQLiteException::getCode' => ['int'], - 'SQLiteException::getFile' => ['string'], - 'SQLiteException::getLine' => ['int'], - 'SQLiteException::getMessage' => ['string'], - 'SQLiteException::getPrevious' => ['RuntimeException|Throwable|null'], - 'SQLiteException::getTrace' => ['list\',args?:array}>'], - 'SQLiteException::getTraceAsString' => ['string'], - 'SQLiteResult::__construct' => ['void'], - 'SQLiteResult::column' => ['mixed', 'index_or_name'=>'', 'decode_binary='=>'bool'], - 'SQLiteResult::count' => ['int'], - 'SQLiteResult::current' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'SQLiteResult::fetch' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'SQLiteResult::fetchAll' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'SQLiteResult::fetchObject' => ['object', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], - 'SQLiteResult::fetchSingle' => ['string', 'decode_binary='=>'bool'], - 'SQLiteResult::fieldName' => ['string', 'field_index'=>'int'], - 'SQLiteResult::hasPrev' => ['bool'], - 'SQLiteResult::key' => ['mixed|null'], - 'SQLiteResult::next' => ['bool'], - 'SQLiteResult::numFields' => ['int'], - 'SQLiteResult::numRows' => ['int'], - 'SQLiteResult::prev' => ['bool'], - 'SQLiteResult::rewind' => ['bool'], - 'SQLiteResult::seek' => ['bool', 'rownum'=>'int'], - 'SQLiteResult::valid' => ['bool'], - 'SQLiteUnbuffered::column' => ['void', 'index_or_name'=>'', 'decode_binary='=>'bool'], - 'SQLiteUnbuffered::current' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'SQLiteUnbuffered::fetch' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'SQLiteUnbuffered::fetchAll' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'SQLiteUnbuffered::fetchObject' => ['object', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], - 'SQLiteUnbuffered::fetchSingle' => ['string', 'decode_binary='=>'bool'], - 'SQLiteUnbuffered::fieldName' => ['string', 'field_index'=>'int'], - 'SQLiteUnbuffered::next' => ['bool'], - 'SQLiteUnbuffered::numFields' => ['int'], - 'SQLiteUnbuffered::valid' => ['bool'], - 'SVM::__construct' => ['void'], - 'SVM::getOptions' => ['array'], - 'SVM::setOptions' => ['bool', 'params'=>'array'], - 'SVMModel::__construct' => ['void', 'filename='=>'string'], - 'SVMModel::checkProbabilityModel' => ['bool'], - 'SVMModel::getLabels' => ['array'], - 'SVMModel::getNrClass' => ['int'], - 'SVMModel::getSvmType' => ['int'], - 'SVMModel::getSvrProbability' => ['float'], - 'SVMModel::load' => ['bool', 'filename'=>'string'], - 'SVMModel::predict' => ['float', 'data'=>'array'], - 'SVMModel::predict_probability' => ['float', 'data'=>'array'], - 'SVMModel::save' => ['bool', 'filename'=>'string'], - 'SWFAction::__construct' => ['void', 'script'=>'string'], - 'SWFBitmap::__construct' => ['void', 'file'=>'', 'alphafile='=>''], - 'SWFBitmap::getHeight' => ['float'], - 'SWFBitmap::getWidth' => ['float'], - 'SWFButton::__construct' => ['void'], - 'SWFButton::addASound' => ['SWFSoundInstance', 'sound'=>'swfsound', 'flags'=>'int'], - 'SWFButton::addAction' => ['void', 'action'=>'swfaction', 'flags'=>'int'], - 'SWFButton::addShape' => ['void', 'shape'=>'swfshape', 'flags'=>'int'], - 'SWFButton::setAction' => ['void', 'action'=>'swfaction'], - 'SWFButton::setDown' => ['void', 'shape'=>'swfshape'], - 'SWFButton::setHit' => ['void', 'shape'=>'swfshape'], - 'SWFButton::setMenu' => ['void', 'flag'=>'int'], - 'SWFButton::setOver' => ['void', 'shape'=>'swfshape'], - 'SWFButton::setUp' => ['void', 'shape'=>'swfshape'], - 'SWFDisplayItem::addAction' => ['void', 'action'=>'swfaction', 'flags'=>'int'], - 'SWFDisplayItem::addColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], - 'SWFDisplayItem::endMask' => ['void'], - 'SWFDisplayItem::getRot' => ['float'], - 'SWFDisplayItem::getX' => ['float'], - 'SWFDisplayItem::getXScale' => ['float'], - 'SWFDisplayItem::getXSkew' => ['float'], - 'SWFDisplayItem::getY' => ['float'], - 'SWFDisplayItem::getYScale' => ['float'], - 'SWFDisplayItem::getYSkew' => ['float'], - 'SWFDisplayItem::move' => ['void', 'dx'=>'float', 'dy'=>'float'], - 'SWFDisplayItem::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], - 'SWFDisplayItem::multColor' => ['void', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'a='=>'float'], - 'SWFDisplayItem::remove' => ['void'], - 'SWFDisplayItem::rotate' => ['void', 'angle'=>'float'], - 'SWFDisplayItem::rotateTo' => ['void', 'angle'=>'float'], - 'SWFDisplayItem::scale' => ['void', 'dx'=>'float', 'dy'=>'float'], - 'SWFDisplayItem::scaleTo' => ['void', 'x'=>'float', 'y='=>'float'], - 'SWFDisplayItem::setDepth' => ['void', 'depth'=>'int'], - 'SWFDisplayItem::setMaskLevel' => ['void', 'level'=>'int'], - 'SWFDisplayItem::setMatrix' => ['void', 'a'=>'float', 'b'=>'float', 'c'=>'float', 'd'=>'float', 'x'=>'float', 'y'=>'float'], - 'SWFDisplayItem::setName' => ['void', 'name'=>'string'], - 'SWFDisplayItem::setRatio' => ['void', 'ratio'=>'float'], - 'SWFDisplayItem::skewX' => ['void', 'ddegrees'=>'float'], - 'SWFDisplayItem::skewXTo' => ['void', 'degrees'=>'float'], - 'SWFDisplayItem::skewY' => ['void', 'ddegrees'=>'float'], - 'SWFDisplayItem::skewYTo' => ['void', 'degrees'=>'float'], - 'SWFFill::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], - 'SWFFill::rotateTo' => ['void', 'angle'=>'float'], - 'SWFFill::scaleTo' => ['void', 'x'=>'float', 'y='=>'float'], - 'SWFFill::skewXTo' => ['void', 'x'=>'float'], - 'SWFFill::skewYTo' => ['void', 'y'=>'float'], - 'SWFFont::__construct' => ['void', 'filename'=>'string'], - 'SWFFont::getAscent' => ['float'], - 'SWFFont::getDescent' => ['float'], - 'SWFFont::getLeading' => ['float'], - 'SWFFont::getShape' => ['string', 'code'=>'int'], - 'SWFFont::getUTF8Width' => ['float', 'string'=>'string'], - 'SWFFont::getWidth' => ['float', 'string'=>'string'], - 'SWFFontChar::addChars' => ['void', 'char'=>'string'], - 'SWFFontChar::addUTF8Chars' => ['void', 'char'=>'string'], - 'SWFGradient::__construct' => ['void'], - 'SWFGradient::addEntry' => ['void', 'ratio'=>'float', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], - 'SWFMorph::__construct' => ['void'], - 'SWFMorph::getShape1' => ['SWFShape'], - 'SWFMorph::getShape2' => ['SWFShape'], - 'SWFMovie::__construct' => ['void', 'version='=>'int'], - 'SWFMovie::add' => ['mixed', 'instance'=>'object'], - 'SWFMovie::addExport' => ['void', 'char'=>'swfcharacter', 'name'=>'string'], - 'SWFMovie::addFont' => ['mixed', 'font'=>'swffont'], - 'SWFMovie::importChar' => ['SWFSprite', 'libswf'=>'string', 'name'=>'string'], - 'SWFMovie::importFont' => ['SWFFontChar', 'libswf'=>'string', 'name'=>'string'], - 'SWFMovie::labelFrame' => ['void', 'label'=>'string'], - 'SWFMovie::namedAnchor' => [''], - 'SWFMovie::nextFrame' => ['void'], - 'SWFMovie::output' => ['int', 'compression='=>'int'], - 'SWFMovie::protect' => [''], - 'SWFMovie::remove' => ['void', 'instance'=>'object'], - 'SWFMovie::save' => ['int', 'filename'=>'string', 'compression='=>'int'], - 'SWFMovie::saveToFile' => ['int', 'x'=>'resource', 'compression='=>'int'], - 'SWFMovie::setDimension' => ['void', 'width'=>'float', 'height'=>'float'], - 'SWFMovie::setFrames' => ['void', 'number'=>'int'], - 'SWFMovie::setRate' => ['void', 'rate'=>'float'], - 'SWFMovie::setbackground' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'SWFMovie::startSound' => ['SWFSoundInstance', 'sound'=>'swfsound'], - 'SWFMovie::stopSound' => ['void', 'sound'=>'swfsound'], - 'SWFMovie::streamMP3' => ['int', 'mp3file'=>'mixed', 'skip='=>'float'], - 'SWFMovie::writeExports' => ['void'], - 'SWFPrebuiltClip::__construct' => ['void', 'file'=>''], - 'SWFShape::__construct' => ['void'], - 'SWFShape::addFill' => ['SWFFill', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int', 'bitmap='=>'swfbitmap', 'flags='=>'int', 'gradient='=>'swfgradient'], - 'SWFShape::addFill\'1' => ['SWFFill', 'bitmap'=>'SWFBitmap', 'flags='=>'int'], - 'SWFShape::addFill\'2' => ['SWFFill', 'gradient'=>'SWFGradient', 'flags='=>'int'], - 'SWFShape::drawArc' => ['void', 'r'=>'float', 'startangle'=>'float', 'endangle'=>'float'], - 'SWFShape::drawCircle' => ['void', 'r'=>'float'], - 'SWFShape::drawCubic' => ['int', 'bx'=>'float', 'by'=>'float', 'cx'=>'float', 'cy'=>'float', 'dx'=>'float', 'dy'=>'float'], - 'SWFShape::drawCubicTo' => ['int', 'bx'=>'float', 'by'=>'float', 'cx'=>'float', 'cy'=>'float', 'dx'=>'float', 'dy'=>'float'], - 'SWFShape::drawCurve' => ['int', 'controldx'=>'float', 'controldy'=>'float', 'anchordx'=>'float', 'anchordy'=>'float', 'targetdx='=>'float', 'targetdy='=>'float'], - 'SWFShape::drawCurveTo' => ['int', 'controlx'=>'float', 'controly'=>'float', 'anchorx'=>'float', 'anchory'=>'float', 'targetx='=>'float', 'targety='=>'float'], - 'SWFShape::drawGlyph' => ['void', 'font'=>'swffont', 'character'=>'string', 'size='=>'int'], - 'SWFShape::drawLine' => ['void', 'dx'=>'float', 'dy'=>'float'], - 'SWFShape::drawLineTo' => ['void', 'x'=>'float', 'y'=>'float'], - 'SWFShape::movePen' => ['void', 'dx'=>'float', 'dy'=>'float'], - 'SWFShape::movePenTo' => ['void', 'x'=>'float', 'y'=>'float'], - 'SWFShape::setLeftFill' => ['', 'fill'=>'swfgradient', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], - 'SWFShape::setLine' => ['', 'shape'=>'swfshape', 'width'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], - 'SWFShape::setRightFill' => ['', 'fill'=>'swfgradient', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], - 'SWFSound' => ['SWFSound', 'filename'=>'string', 'flags='=>'int'], - 'SWFSound::__construct' => ['void', 'filename'=>'string', 'flags='=>'int'], - 'SWFSoundInstance::loopCount' => ['void', 'point'=>'int'], - 'SWFSoundInstance::loopInPoint' => ['void', 'point'=>'int'], - 'SWFSoundInstance::loopOutPoint' => ['void', 'point'=>'int'], - 'SWFSoundInstance::noMultiple' => ['void'], - 'SWFSprite::__construct' => ['void'], - 'SWFSprite::add' => ['void', 'object'=>'object'], - 'SWFSprite::labelFrame' => ['void', 'label'=>'string'], - 'SWFSprite::nextFrame' => ['void'], - 'SWFSprite::remove' => ['void', 'object'=>'object'], - 'SWFSprite::setFrames' => ['void', 'number'=>'int'], - 'SWFSprite::startSound' => ['SWFSoundInstance', 'sount'=>'swfsound'], - 'SWFSprite::stopSound' => ['void', 'sount'=>'swfsound'], - 'SWFText::__construct' => ['void'], - 'SWFText::addString' => ['void', 'string'=>'string'], - 'SWFText::addUTF8String' => ['void', 'text'=>'string'], - 'SWFText::getAscent' => ['float'], - 'SWFText::getDescent' => ['float'], - 'SWFText::getLeading' => ['float'], - 'SWFText::getUTF8Width' => ['float', 'string'=>'string'], - 'SWFText::getWidth' => ['float', 'string'=>'string'], - 'SWFText::moveTo' => ['void', 'x'=>'float', 'y'=>'float'], - 'SWFText::setColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], - 'SWFText::setFont' => ['void', 'font'=>'swffont'], - 'SWFText::setHeight' => ['void', 'height'=>'float'], - 'SWFText::setSpacing' => ['void', 'spacing'=>'float'], - 'SWFTextField::__construct' => ['void', 'flags='=>'int'], - 'SWFTextField::addChars' => ['void', 'chars'=>'string'], - 'SWFTextField::addString' => ['void', 'string'=>'string'], - 'SWFTextField::align' => ['void', 'alignement'=>'int'], - 'SWFTextField::setBounds' => ['void', 'width'=>'float', 'height'=>'float'], - 'SWFTextField::setColor' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], - 'SWFTextField::setFont' => ['void', 'font'=>'swffont'], - 'SWFTextField::setHeight' => ['void', 'height'=>'float'], - 'SWFTextField::setIndentation' => ['void', 'width'=>'float'], - 'SWFTextField::setLeftMargin' => ['void', 'width'=>'float'], - 'SWFTextField::setLineSpacing' => ['void', 'height'=>'float'], - 'SWFTextField::setMargins' => ['void', 'left'=>'float', 'right'=>'float'], - 'SWFTextField::setName' => ['void', 'name'=>'string'], - 'SWFTextField::setPadding' => ['void', 'padding'=>'float'], - 'SWFTextField::setRightMargin' => ['void', 'width'=>'float'], - 'SWFVideoStream::__construct' => ['void', 'file='=>'string'], - 'SWFVideoStream::getNumFrames' => ['int'], - 'SWFVideoStream::setDimension' => ['void', 'x'=>'int', 'y'=>'int'], - 'Saxon\SaxonProcessor::__construct' => ['void', 'license='=>'bool', 'cwd='=>'string'], - 'Saxon\SaxonProcessor::createAtomicValue' => ['Saxon\XdmValue', 'primitive_type_val'=>'bool|float|int|string'], - 'Saxon\SaxonProcessor::newSchemaValidator' => ['Saxon\SchemaValidator'], - 'Saxon\SaxonProcessor::newXPathProcessor' => ['Saxon\XPathProcessor'], - 'Saxon\SaxonProcessor::newXQueryProcessor' => ['Saxon\XQueryProcessor'], - 'Saxon\SaxonProcessor::newXsltProcessor' => ['Saxon\XsltProcessor'], - 'Saxon\SaxonProcessor::parseXmlFromFile' => ['Saxon\XdmNode', 'fileName'=>'string'], - 'Saxon\SaxonProcessor::parseXmlFromString' => ['Saxon\XdmNode', 'value'=>'string'], - 'Saxon\SaxonProcessor::registerPHPFunctions' => ['void', 'library'=>'string'], - 'Saxon\SaxonProcessor::setConfigurationProperty' => ['void', 'name'=>'string', 'value'=>'string'], - 'Saxon\SaxonProcessor::setResourceDirectory' => ['void', 'dir'=>'string'], - 'Saxon\SaxonProcessor::setcwd' => ['void', 'cwd'=>'string'], - 'Saxon\SaxonProcessor::version' => ['string'], - 'Saxon\SchemaValidator::clearParameters' => ['void'], - 'Saxon\SchemaValidator::clearProperties' => ['void'], - 'Saxon\SchemaValidator::exceptionClear' => ['void'], - 'Saxon\SchemaValidator::getErrorCode' => ['string', 'i'=>'int'], - 'Saxon\SchemaValidator::getErrorMessage' => ['string', 'i'=>'int'], - 'Saxon\SchemaValidator::getExceptionCount' => ['int'], - 'Saxon\SchemaValidator::getValidationReport' => ['Saxon\XdmNode'], - 'Saxon\SchemaValidator::registerSchemaFromFile' => ['void', 'fileName'=>'string'], - 'Saxon\SchemaValidator::registerSchemaFromString' => ['void', 'schemaStr'=>'string'], - 'Saxon\SchemaValidator::setOutputFile' => ['void', 'fileName'=>'string'], - 'Saxon\SchemaValidator::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], - 'Saxon\SchemaValidator::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], - 'Saxon\SchemaValidator::setSourceNode' => ['void', 'node'=>'Saxon\XdmNode'], - 'Saxon\SchemaValidator::validate' => ['void', 'filename='=>'?string'], - 'Saxon\SchemaValidator::validateToNode' => ['Saxon\XdmNode', 'filename='=>'?string'], - 'Saxon\XPathProcessor::clearParameters' => ['void'], - 'Saxon\XPathProcessor::clearProperties' => ['void'], - 'Saxon\XPathProcessor::declareNamespace' => ['void', 'prefix'=>'', 'namespace'=>''], - 'Saxon\XPathProcessor::effectiveBooleanValue' => ['bool', 'xpathStr'=>'string'], - 'Saxon\XPathProcessor::evaluate' => ['Saxon\XdmValue', 'xpathStr'=>'string'], - 'Saxon\XPathProcessor::evaluateSingle' => ['Saxon\XdmItem', 'xpathStr'=>'string'], - 'Saxon\XPathProcessor::exceptionClear' => ['void'], - 'Saxon\XPathProcessor::getErrorCode' => ['string', 'i'=>'int'], - 'Saxon\XPathProcessor::getErrorMessage' => ['string', 'i'=>'int'], - 'Saxon\XPathProcessor::getExceptionCount' => ['int'], - 'Saxon\XPathProcessor::setBaseURI' => ['void', 'uri'=>'string'], - 'Saxon\XPathProcessor::setContextFile' => ['void', 'fileName'=>'string'], - 'Saxon\XPathProcessor::setContextItem' => ['void', 'item'=>'Saxon\XdmItem'], - 'Saxon\XPathProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], - 'Saxon\XPathProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], - 'Saxon\XQueryProcessor::clearParameters' => ['void'], - 'Saxon\XQueryProcessor::clearProperties' => ['void'], - 'Saxon\XQueryProcessor::declareNamespace' => ['void', 'prefix'=>'string', 'namespace'=>'string'], - 'Saxon\XQueryProcessor::exceptionClear' => ['void'], - 'Saxon\XQueryProcessor::getErrorCode' => ['string', 'i'=>'int'], - 'Saxon\XQueryProcessor::getErrorMessage' => ['string', 'i'=>'int'], - 'Saxon\XQueryProcessor::getExceptionCount' => ['int'], - 'Saxon\XQueryProcessor::runQueryToFile' => ['void', 'outfilename'=>'string'], - 'Saxon\XQueryProcessor::runQueryToString' => ['?string'], - 'Saxon\XQueryProcessor::runQueryToValue' => ['?Saxon\XdmValue'], - 'Saxon\XQueryProcessor::setContextItem' => ['void', 'object'=>'Saxon\XdmAtomicValue|Saxon\XdmItem|Saxon\XdmNode|Saxon\XdmValue'], - 'Saxon\XQueryProcessor::setContextItemFromFile' => ['void', 'fileName'=>'string'], - 'Saxon\XQueryProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], - 'Saxon\XQueryProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], - 'Saxon\XQueryProcessor::setQueryBaseURI' => ['void', 'uri'=>'string'], - 'Saxon\XQueryProcessor::setQueryContent' => ['void', 'string'=>'string'], - 'Saxon\XQueryProcessor::setQueryFile' => ['void', 'filename'=>'string'], - 'Saxon\XQueryProcessor::setQueryItem' => ['void', 'item'=>'Saxon\XdmItem'], - 'Saxon\XdmAtomicValue::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], - 'Saxon\XdmAtomicValue::getAtomicValue' => ['?Saxon\XdmAtomicValue'], - 'Saxon\XdmAtomicValue::getBooleanValue' => ['bool'], - 'Saxon\XdmAtomicValue::getDoubleValue' => ['float'], - 'Saxon\XdmAtomicValue::getHead' => ['Saxon\XdmItem'], - 'Saxon\XdmAtomicValue::getLongValue' => ['int'], - 'Saxon\XdmAtomicValue::getNodeValue' => ['?Saxon\XdmNode'], - 'Saxon\XdmAtomicValue::getStringValue' => ['string'], - 'Saxon\XdmAtomicValue::isAtomic' => ['true'], - 'Saxon\XdmAtomicValue::isNode' => ['bool'], - 'Saxon\XdmAtomicValue::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], - 'Saxon\XdmAtomicValue::size' => ['int'], - 'Saxon\XdmItem::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], - 'Saxon\XdmItem::getAtomicValue' => ['?Saxon\XdmAtomicValue'], - 'Saxon\XdmItem::getHead' => ['Saxon\XdmItem'], - 'Saxon\XdmItem::getNodeValue' => ['?Saxon\XdmNode'], - 'Saxon\XdmItem::getStringValue' => ['string'], - 'Saxon\XdmItem::isAtomic' => ['bool'], - 'Saxon\XdmItem::isNode' => ['bool'], - 'Saxon\XdmItem::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], - 'Saxon\XdmItem::size' => ['int'], - 'Saxon\XdmNode::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], - 'Saxon\XdmNode::getAtomicValue' => ['?Saxon\XdmAtomicValue'], - 'Saxon\XdmNode::getAttributeCount' => ['int'], - 'Saxon\XdmNode::getAttributeNode' => ['?Saxon\XdmNode', 'index'=>'int'], - 'Saxon\XdmNode::getAttributeValue' => ['?string', 'index'=>'int'], - 'Saxon\XdmNode::getChildCount' => ['int'], - 'Saxon\XdmNode::getChildNode' => ['?Saxon\XdmNode', 'index'=>'int'], - 'Saxon\XdmNode::getHead' => ['Saxon\XdmItem'], - 'Saxon\XdmNode::getNodeKind' => ['int'], - 'Saxon\XdmNode::getNodeName' => ['string'], - 'Saxon\XdmNode::getNodeValue' => ['?Saxon\XdmNode'], - 'Saxon\XdmNode::getParent' => ['?Saxon\XdmNode'], - 'Saxon\XdmNode::getStringValue' => ['string'], - 'Saxon\XdmNode::isAtomic' => ['false'], - 'Saxon\XdmNode::isNode' => ['bool'], - 'Saxon\XdmNode::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], - 'Saxon\XdmNode::size' => ['int'], - 'Saxon\XdmValue::addXdmItem' => ['', 'item'=>'Saxon\XdmItem'], - 'Saxon\XdmValue::getHead' => ['Saxon\XdmItem'], - 'Saxon\XdmValue::itemAt' => ['Saxon\XdmItem', 'index'=>'int'], - 'Saxon\XdmValue::size' => ['int'], - 'Saxon\XsltProcessor::clearParameters' => ['void'], - 'Saxon\XsltProcessor::clearProperties' => ['void'], - 'Saxon\XsltProcessor::compileFromFile' => ['void', 'fileName'=>'string'], - 'Saxon\XsltProcessor::compileFromString' => ['void', 'string'=>'string'], - 'Saxon\XsltProcessor::compileFromValue' => ['void', 'node'=>'Saxon\XdmNode'], - 'Saxon\XsltProcessor::exceptionClear' => ['void'], - 'Saxon\XsltProcessor::getErrorCode' => ['string', 'i'=>'int'], - 'Saxon\XsltProcessor::getErrorMessage' => ['string', 'i'=>'int'], - 'Saxon\XsltProcessor::getExceptionCount' => ['int'], - 'Saxon\XsltProcessor::setOutputFile' => ['void', 'fileName'=>'string'], - 'Saxon\XsltProcessor::setParameter' => ['void', 'name'=>'string', 'value'=>'Saxon\XdmValue'], - 'Saxon\XsltProcessor::setProperty' => ['void', 'name'=>'string', 'value'=>'string'], - 'Saxon\XsltProcessor::setSourceFromFile' => ['void', 'filename'=>'string'], - 'Saxon\XsltProcessor::setSourceFromXdmValue' => ['void', 'value'=>'Saxon\XdmValue'], - 'Saxon\XsltProcessor::transformFileToFile' => ['void', 'sourceFileName'=>'string', 'stylesheetFileName'=>'string', 'outputfileName'=>'string'], - 'Saxon\XsltProcessor::transformFileToString' => ['?string', 'sourceFileName'=>'string', 'stylesheetFileName'=>'string'], - 'Saxon\XsltProcessor::transformFileToValue' => ['Saxon\XdmValue', 'fileName'=>'string'], - 'Saxon\XsltProcessor::transformToFile' => ['void'], - 'Saxon\XsltProcessor::transformToString' => ['string'], - 'Saxon\XsltProcessor::transformToValue' => ['?Saxon\XdmValue'], - 'SeasLog::__destruct' => ['void'], - 'SeasLog::alert' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], - 'SeasLog::analyzerCount' => ['mixed', 'level'=>'string', 'log_path='=>'string', 'key_word='=>'string'], - 'SeasLog::analyzerDetail' => ['mixed', 'level'=>'string', 'log_path='=>'string', 'key_word='=>'string', 'start='=>'int', 'limit='=>'int', 'order='=>'int'], - 'SeasLog::closeLoggerStream' => ['bool', 'model'=>'int', 'logger'=>'string'], - 'SeasLog::critical' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], - 'SeasLog::debug' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], - 'SeasLog::emergency' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], - 'SeasLog::error' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], - 'SeasLog::flushBuffer' => ['bool'], - 'SeasLog::getBasePath' => ['string'], - 'SeasLog::getBuffer' => ['array'], - 'SeasLog::getBufferEnabled' => ['bool'], - 'SeasLog::getDatetimeFormat' => ['string'], - 'SeasLog::getLastLogger' => ['string'], - 'SeasLog::getRequestID' => ['string'], - 'SeasLog::getRequestVariable' => ['bool', 'key'=>'int'], - 'SeasLog::info' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], - 'SeasLog::log' => ['bool', 'level'=>'string', 'message='=>'string', 'content='=>'array', 'logger='=>'string'], - 'SeasLog::notice' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], - 'SeasLog::setBasePath' => ['bool', 'base_path'=>'string'], - 'SeasLog::setDatetimeFormat' => ['bool', 'format'=>'string'], - 'SeasLog::setLogger' => ['bool', 'logger'=>'string'], - 'SeasLog::setRequestID' => ['bool', 'request_id'=>'string'], - 'SeasLog::setRequestVariable' => ['bool', 'key'=>'int', 'value'=>'string'], - 'SeasLog::warning' => ['bool', 'message'=>'string', 'content='=>'array', 'logger='=>'string'], - 'SeekableIterator::__construct' => ['void'], - 'SeekableIterator::current' => ['mixed'], - 'SeekableIterator::key' => ['int|string'], - 'SeekableIterator::next' => ['void'], - 'SeekableIterator::rewind' => ['void'], - 'SeekableIterator::seek' => ['void', 'position'=>'int'], - 'SeekableIterator::valid' => ['bool'], - 'Serializable::__construct' => ['void'], - 'Serializable::serialize' => ['?string'], - 'Serializable::unserialize' => ['void', 'serialized'=>'string'], - 'ServerRequest::withInput' => ['ServerRequest', 'input'=>'mixed'], - 'ServerRequest::withParam' => ['ServerRequest', 'key'=>'int|string', 'value'=>'mixed'], - 'ServerRequest::withParams' => ['ServerRequest', 'params'=>'mixed'], - 'ServerRequest::withUrl' => ['ServerRequest', 'url'=>'array'], - 'ServerRequest::withoutParams' => ['ServerRequest', 'params'=>'int|string'], - 'ServerResponse::addHeader' => ['void', 'label'=>'string', 'value'=>'string'], - 'ServerResponse::date' => ['string', 'date'=>'string|DateTimeInterface'], - 'ServerResponse::getHeader' => ['string', 'label'=>'string'], - 'ServerResponse::getHeaders' => ['string[]'], - 'ServerResponse::getStatus' => ['int'], - 'ServerResponse::getVersion' => ['string'], - 'ServerResponse::setHeader' => ['void', 'label'=>'string', 'value'=>'string'], - 'ServerResponse::setStatus' => ['void', 'status'=>'int'], - 'ServerResponse::setVersion' => ['void', 'version'=>'string'], - 'SessionHandler::close' => ['bool'], - 'SessionHandler::create_sid' => ['char'], - 'SessionHandler::destroy' => ['bool', 'id'=>'string'], - 'SessionHandler::gc' => ['bool', 'maxlifetime'=>'int'], - 'SessionHandler::open' => ['bool', 'save_path'=>'string', 'session_name'=>'string'], - 'SessionHandler::read' => ['string', 'id'=>'string'], - 'SessionHandler::updateTimestamp' => ['bool', 'session_id'=>'string', 'session_data'=>'string'], - 'SessionHandler::validateId' => ['bool', 'session_id'=>'string'], - 'SessionHandler::write' => ['bool', 'id'=>'string', 'data'=>'string'], - 'SessionHandlerInterface::close' => ['bool'], - 'SessionHandlerInterface::destroy' => ['bool', 'id'=>'string'], - 'SessionHandlerInterface::gc' => ['int|false', 'max_lifetime'=>'int'], - 'SessionHandlerInterface::open' => ['bool', 'path'=>'string', 'name'=>'string'], - 'SessionHandlerInterface::read' => ['string|false', 'id'=>'string'], - 'SessionHandlerInterface::write' => ['bool', 'id'=>'string', 'data'=>'string'], - 'SessionIdInterface::create_sid' => ['string'], - 'SessionUpdateTimestampHandler::updateTimestamp' => ['bool', 'id'=>'string', 'data'=>'string'], - 'SessionUpdateTimestampHandler::validateId' => ['char', 'id'=>'string'], - 'SessionUpdateTimestampHandlerInterface::updateTimestamp' => ['bool', 'key'=>'string', 'value'=>'string'], - 'SessionUpdateTimestampHandlerInterface::validateId' => ['bool', 'key'=>'string'], - 'SimpleXMLElement::__construct' => ['void', 'data'=>'string', 'options='=>'int', 'data_is_url='=>'bool', 'ns='=>'string', 'is_prefix='=>'bool'], - 'SimpleXMLElement::__get' => ['SimpleXMLElement', 'name'=>'string'], - 'SimpleXMLElement::__toString' => ['string'], - 'SimpleXMLElement::addAttribute' => ['void', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], - 'SimpleXMLElement::addChild' => ['SimpleXMLElement', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], - 'SimpleXMLElement::asXML' => ['bool', 'filename'=>'string'], - 'SimpleXMLElement::asXML\'1' => ['string|false'], - 'SimpleXMLElement::attributes' => ['?SimpleXMLElement', 'ns='=>'string', 'is_prefix='=>'bool'], - 'SimpleXMLElement::children' => ['SimpleXMLElement', 'ns='=>'string', 'is_prefix='=>'bool'], - 'SimpleXMLElement::count' => ['int'], - 'SimpleXMLElement::getDocNamespaces' => ['string[]', 'recursive='=>'bool', 'from_root='=>'bool'], - 'SimpleXMLElement::getName' => ['string'], - 'SimpleXMLElement::getNamespaces' => ['string[]', 'recursive='=>'bool'], - 'SimpleXMLElement::offsetExists' => ['bool', 'offset'=>'int|string'], - 'SimpleXMLElement::offsetGet' => ['SimpleXMLElement', 'offset'=>'int|string'], - 'SimpleXMLElement::offsetSet' => ['void', 'offset'=>'int|string', 'value'=>'mixed'], - 'SimpleXMLElement::offsetUnset' => ['void', 'offset'=>'int|string'], - 'SimpleXMLElement::registerXPathNamespace' => ['bool', 'prefix'=>'string', 'ns'=>'string'], - 'SimpleXMLElement::saveXML' => ['mixed', 'filename='=>'string'], - 'SimpleXMLElement::xpath' => ['SimpleXMLElement[]|false', 'path'=>'string'], - 'SimpleXMLIterator::current' => ['?SimpleXMLIterator'], - 'SimpleXMLIterator::getChildren' => ['SimpleXMLIterator'], - 'SimpleXMLIterator::hasChildren' => ['bool'], - 'SimpleXMLIterator::key' => ['string|false'], - 'SimpleXMLIterator::next' => ['void'], - 'SimpleXMLIterator::rewind' => ['void'], - 'SimpleXMLIterator::valid' => ['bool'], - 'SoapClient::SoapClient' => ['object', 'wsdl'=>'mixed', 'options='=>'array|null'], - 'SoapClient::__call' => ['', 'function_name'=>'string', 'arguments'=>'array'], - 'SoapClient::__construct' => ['void', 'wsdl'=>'mixed', 'options='=>'array|null'], - 'SoapClient::__doRequest' => ['?string', 'request'=>'string', 'location'=>'string', 'action'=>'string', 'version'=>'int', 'one_way='=>'int'], - 'SoapClient::__getCookies' => ['array'], - 'SoapClient::__getFunctions' => ['?array'], - 'SoapClient::__getLastRequest' => ['?string'], - 'SoapClient::__getLastRequestHeaders' => ['?string'], - 'SoapClient::__getLastResponse' => ['?string'], - 'SoapClient::__getLastResponseHeaders' => ['?string'], - 'SoapClient::__getTypes' => ['?array'], - 'SoapClient::__setCookie' => ['', 'name'=>'string', 'value='=>'string'], - 'SoapClient::__setLocation' => ['string', 'new_location='=>'string'], - 'SoapClient::__setSoapHeaders' => ['bool', 'soapheaders='=>''], - 'SoapClient::__soapCall' => ['', 'function_name'=>'string', 'arguments'=>'array', 'options='=>'array', 'input_headers='=>'SoapHeader|array', '&w_output_headers='=>'array'], - 'SoapFault::SoapFault' => ['object', 'faultcode'=>'string', 'faultstring'=>'string', 'faultactor='=>'?string', 'detail='=>'?mixed', 'faultname='=>'?string', 'headerfault='=>'?mixed'], - 'SoapFault::__clone' => ['void'], - 'SoapFault::__construct' => ['void', 'code'=>'array|string|null', 'string'=>'string', 'actor='=>'?string', 'details='=>'?mixed', 'name='=>'?string', 'headerFault='=>'?mixed'], - 'SoapFault::__toString' => ['string'], - 'SoapFault::__wakeup' => ['void'], - 'SoapFault::getCode' => ['int'], - 'SoapFault::getFile' => ['string'], - 'SoapFault::getLine' => ['int'], - 'SoapFault::getMessage' => ['string'], - 'SoapFault::getPrevious' => ['?Exception|?Throwable'], - 'SoapFault::getTrace' => ['list\',args?:array}>'], - 'SoapFault::getTraceAsString' => ['string'], - 'SoapHeader::SoapHeader' => ['object', 'namespace'=>'string', 'name'=>'string', 'data='=>'mixed', 'mustunderstand='=>'bool', 'actor='=>'string'], - 'SoapHeader::__construct' => ['void', 'namespace'=>'string', 'name'=>'string', 'data='=>'mixed', 'mustunderstand='=>'bool', 'actor='=>'string'], - 'SoapParam::SoapParam' => ['object', 'data'=>'mixed', 'name'=>'string'], - 'SoapParam::__construct' => ['void', 'data'=>'mixed', 'name'=>'string'], - 'SoapServer::SoapServer' => ['object', 'wsdl'=>'?string', 'options='=>'array'], - 'SoapServer::__construct' => ['void', 'wsdl'=>'?string', 'options='=>'array'], - 'SoapServer::addFunction' => ['void', 'functions'=>'mixed'], - 'SoapServer::addSoapHeader' => ['void', 'object'=>'SoapHeader'], - 'SoapServer::fault' => ['void', 'code'=>'string', 'string'=>'string', 'actor='=>'string', 'details='=>'string', 'name='=>'string'], - 'SoapServer::getFunctions' => ['array'], - 'SoapServer::handle' => ['void', 'soap_request='=>'string'], - 'SoapServer::setClass' => ['void', 'class_name'=>'string', '...args='=>'mixed'], - 'SoapServer::setObject' => ['void', 'object'=>'object'], - 'SoapServer::setPersistence' => ['void', 'mode'=>'int'], - 'SoapVar::SoapVar' => ['object', 'data'=>'mixed', 'encoding'=>'int', 'type_name='=>'string|null', 'type_namespace='=>'string|null', 'node_name='=>'string|null', 'node_namespace='=>'string|null'], - 'SoapVar::__construct' => ['void', 'data'=>'mixed', 'encoding'=>'int', 'type_name='=>'string|null', 'type_namespace='=>'string|null', 'node_name='=>'string|null', 'node_namespace='=>'string|null'], - 'Sodium\add' => ['void', '&left'=>'string', 'right'=>'string'], - 'Sodium\bin2hex' => ['string', 'binary'=>'string'], - 'Sodium\compare' => ['int', 'left'=>'string', 'right'=>'string'], - 'Sodium\crypto_aead_aes256gcm_decrypt' => ['string|false', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], - 'Sodium\crypto_aead_aes256gcm_encrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], - 'Sodium\crypto_aead_aes256gcm_is_available' => ['bool'], - 'Sodium\crypto_aead_chacha20poly1305_decrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], - 'Sodium\crypto_aead_chacha20poly1305_encrypt' => ['string', 'msg'=>'string', 'nonce'=>'string', 'key'=>'string', 'ad='=>'string'], - 'Sodium\crypto_auth' => ['string', 'msg'=>'string', 'key'=>'string'], - 'Sodium\crypto_auth_verify' => ['bool', 'mac'=>'string', 'msg'=>'string', 'key'=>'string'], - 'Sodium\crypto_box' => ['string', 'msg'=>'string', 'nonce'=>'string', 'keypair'=>'string'], - 'Sodium\crypto_box_keypair' => ['string'], - 'Sodium\crypto_box_keypair_from_secretkey_and_publickey' => ['string', 'secretkey'=>'string', 'publickey'=>'string'], - 'Sodium\crypto_box_open' => ['string', 'msg'=>'string', 'nonce'=>'string', 'keypair'=>'string'], - 'Sodium\crypto_box_publickey' => ['string', 'keypair'=>'string'], - 'Sodium\crypto_box_publickey_from_secretkey' => ['string', 'secretkey'=>'string'], - 'Sodium\crypto_box_seal' => ['string', 'message'=>'string', 'publickey'=>'string'], - 'Sodium\crypto_box_seal_open' => ['string', 'encrypted'=>'string', 'keypair'=>'string'], - 'Sodium\crypto_box_secretkey' => ['string', 'keypair'=>'string'], - 'Sodium\crypto_box_seed_keypair' => ['string', 'seed'=>'string'], - 'Sodium\crypto_generichash' => ['string', 'input'=>'string', 'key='=>'string', 'length='=>'int'], - 'Sodium\crypto_generichash_final' => ['string', 'state'=>'string', 'length='=>'int'], - 'Sodium\crypto_generichash_init' => ['string', 'key='=>'string', 'length='=>'int'], - 'Sodium\crypto_generichash_update' => ['bool', '&hashState'=>'string', 'append'=>'string'], - 'Sodium\crypto_kx' => ['string', 'secretkey'=>'string', 'publickey'=>'string', 'client_publickey'=>'string', 'server_publickey'=>'string'], - 'Sodium\crypto_pwhash' => ['string', 'out_len'=>'int', 'passwd'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'Sodium\crypto_pwhash_scryptsalsa208sha256' => ['string', 'out_len'=>'int', 'passwd'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'Sodium\crypto_pwhash_scryptsalsa208sha256_str' => ['string', 'passwd'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'Sodium\crypto_pwhash_scryptsalsa208sha256_str_verify' => ['bool', 'hash'=>'string', 'passwd'=>'string'], - 'Sodium\crypto_pwhash_str' => ['string', 'passwd'=>'string', 'opslimit'=>'int', 'memlimit'=>'int'], - 'Sodium\crypto_pwhash_str_verify' => ['bool', 'hash'=>'string', 'passwd'=>'string'], - 'Sodium\crypto_scalarmult' => ['string', 'ecdhA'=>'string', 'ecdhB'=>'string'], - 'Sodium\crypto_scalarmult_base' => ['string', 'sk'=>'string'], - 'Sodium\crypto_secretbox' => ['string', 'plaintext'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'Sodium\crypto_secretbox_open' => ['string', 'ciphertext'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'Sodium\crypto_shorthash' => ['string', 'message'=>'string', 'key'=>'string'], - 'Sodium\crypto_sign' => ['string', 'message'=>'string', 'secretkey'=>'string'], - 'Sodium\crypto_sign_detached' => ['string', 'message'=>'string', 'secretkey'=>'string'], - 'Sodium\crypto_sign_ed25519_pk_to_curve25519' => ['string', 'sign_pk'=>'string'], - 'Sodium\crypto_sign_ed25519_sk_to_curve25519' => ['string', 'sign_sk'=>'string'], - 'Sodium\crypto_sign_keypair' => ['string'], - 'Sodium\crypto_sign_keypair_from_secretkey_and_publickey' => ['string', 'secretkey'=>'string', 'publickey'=>'string'], - 'Sodium\crypto_sign_open' => ['string|false', 'signed_message'=>'string', 'publickey'=>'string'], - 'Sodium\crypto_sign_publickey' => ['string', 'keypair'=>'string'], - 'Sodium\crypto_sign_publickey_from_secretkey' => ['string', 'secretkey'=>'string'], - 'Sodium\crypto_sign_secretkey' => ['string', 'keypair'=>'string'], - 'Sodium\crypto_sign_seed_keypair' => ['string', 'seed'=>'string'], - 'Sodium\crypto_sign_verify_detached' => ['bool', 'signature'=>'string', 'msg'=>'string', 'publickey'=>'string'], - 'Sodium\crypto_stream' => ['string', 'length'=>'int', 'nonce'=>'string', 'key'=>'string'], - 'Sodium\crypto_stream_xor' => ['string', 'plaintext'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'Sodium\hex2bin' => ['string', 'hex'=>'string'], - 'Sodium\increment' => ['string', '&nonce'=>'string'], - 'Sodium\library_version_major' => ['int'], - 'Sodium\library_version_minor' => ['int'], - 'Sodium\memcmp' => ['int', 'left'=>'string', 'right'=>'string'], - 'Sodium\memzero' => ['void', '&target'=>'string'], - 'Sodium\randombytes_buf' => ['string', 'length'=>'int'], - 'Sodium\randombytes_random16' => ['int|string'], - 'Sodium\randombytes_uniform' => ['int', 'upperBoundNonInclusive'=>'int'], - 'Sodium\version_string' => ['string'], - 'SolrClient::__construct' => ['void', 'clientOptions'=>'array'], - 'SolrClient::__destruct' => ['void'], - 'SolrClient::addDocument' => ['SolrUpdateResponse', 'doc'=>'SolrInputDocument', 'allowdups='=>'bool', 'commitwithin='=>'int'], - 'SolrClient::addDocuments' => ['SolrUpdateResponse', 'docs'=>'array', 'allowdups='=>'bool', 'commitwithin='=>'int'], - 'SolrClient::commit' => ['SolrUpdateResponse', 'maxsegments='=>'int', 'waitflush='=>'bool', 'waitsearcher='=>'bool'], - 'SolrClient::deleteById' => ['SolrUpdateResponse', 'id'=>'string'], - 'SolrClient::deleteByIds' => ['SolrUpdateResponse', 'ids'=>'array'], - 'SolrClient::deleteByQueries' => ['SolrUpdateResponse', 'queries'=>'array'], - 'SolrClient::deleteByQuery' => ['SolrUpdateResponse', 'query'=>'string'], - 'SolrClient::getById' => ['SolrQueryResponse', 'id'=>'string'], - 'SolrClient::getByIds' => ['SolrQueryResponse', 'ids'=>'array'], - 'SolrClient::getDebug' => ['string'], - 'SolrClient::getOptions' => ['array'], - 'SolrClient::optimize' => ['SolrUpdateResponse', 'maxsegments='=>'int', 'waitflush='=>'bool', 'waitsearcher='=>'bool'], - 'SolrClient::ping' => ['SolrPingResponse'], - 'SolrClient::query' => ['SolrQueryResponse', 'query'=>'SolrParams'], - 'SolrClient::request' => ['SolrUpdateResponse', 'raw_request'=>'string'], - 'SolrClient::rollback' => ['SolrUpdateResponse'], - 'SolrClient::setResponseWriter' => ['void', 'responsewriter'=>'string'], - 'SolrClient::setServlet' => ['bool', 'type'=>'int', 'value'=>'string'], - 'SolrClient::system' => ['SolrGenericResponse'], - 'SolrClient::threads' => ['SolrGenericResponse'], - 'SolrClientException::__clone' => ['void'], - 'SolrClientException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'SolrClientException::__toString' => ['string'], - 'SolrClientException::__wakeup' => ['void'], - 'SolrClientException::getCode' => ['int'], - 'SolrClientException::getFile' => ['string'], - 'SolrClientException::getInternalInfo' => ['array'], - 'SolrClientException::getLine' => ['int'], - 'SolrClientException::getMessage' => ['string'], - 'SolrClientException::getPrevious' => ['?Exception|?Throwable'], - 'SolrClientException::getTrace' => ['list\',args?:array}>'], - 'SolrClientException::getTraceAsString' => ['string'], - 'SolrCollapseFunction::__construct' => ['void', 'field'=>'string'], - 'SolrCollapseFunction::__toString' => ['string'], - 'SolrCollapseFunction::getField' => ['string'], - 'SolrCollapseFunction::getHint' => ['string'], - 'SolrCollapseFunction::getMax' => ['string'], - 'SolrCollapseFunction::getMin' => ['string'], - 'SolrCollapseFunction::getNullPolicy' => ['string'], - 'SolrCollapseFunction::getSize' => ['int'], - 'SolrCollapseFunction::setField' => ['SolrCollapseFunction', 'fieldName'=>'string'], - 'SolrCollapseFunction::setHint' => ['SolrCollapseFunction', 'hint'=>'string'], - 'SolrCollapseFunction::setMax' => ['SolrCollapseFunction', 'max'=>'string'], - 'SolrCollapseFunction::setMin' => ['SolrCollapseFunction', 'min'=>'string'], - 'SolrCollapseFunction::setNullPolicy' => ['SolrCollapseFunction', 'nullPolicy'=>'string'], - 'SolrCollapseFunction::setSize' => ['SolrCollapseFunction', 'size'=>'int'], - 'SolrDisMaxQuery::__construct' => ['void', 'q='=>'string'], - 'SolrDisMaxQuery::__destruct' => ['void'], - 'SolrDisMaxQuery::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], - 'SolrDisMaxQuery::addBigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], - 'SolrDisMaxQuery::addBoostQuery' => ['SolrDisMaxQuery', 'field'=>'string', 'value'=>'string', 'boost='=>'string'], - 'SolrDisMaxQuery::addExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], - 'SolrDisMaxQuery::addExpandSortField' => ['SolrQuery', 'field'=>'string', 'order'=>'string'], - 'SolrDisMaxQuery::addFacetDateField' => ['SolrQuery', 'dateField'=>'string'], - 'SolrDisMaxQuery::addFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::addFacetField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::addFacetQuery' => ['SolrQuery', 'facetQuery'=>'string'], - 'SolrDisMaxQuery::addField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::addFilterQuery' => ['SolrQuery', 'fq'=>'string'], - 'SolrDisMaxQuery::addGroupField' => ['SolrQuery', 'value'=>'string'], - 'SolrDisMaxQuery::addGroupFunction' => ['SolrQuery', 'value'=>'string'], - 'SolrDisMaxQuery::addGroupQuery' => ['SolrQuery', 'value'=>'string'], - 'SolrDisMaxQuery::addGroupSortField' => ['SolrQuery', 'field'=>'string', 'order'=>'int'], - 'SolrDisMaxQuery::addHighlightField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::addMltField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::addMltQueryField' => ['SolrQuery', 'field'=>'string', 'boost'=>'float'], - 'SolrDisMaxQuery::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], - 'SolrDisMaxQuery::addPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], - 'SolrDisMaxQuery::addQueryField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost='=>'string'], - 'SolrDisMaxQuery::addSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], - 'SolrDisMaxQuery::addStatsFacet' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::addStatsField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::addTrigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], - 'SolrDisMaxQuery::addUserField' => ['SolrDisMaxQuery', 'field'=>'string'], - 'SolrDisMaxQuery::collapse' => ['SolrQuery', 'collapseFunction'=>'SolrCollapseFunction'], - 'SolrDisMaxQuery::get' => ['mixed', 'param_name'=>'string'], - 'SolrDisMaxQuery::getExpand' => ['bool'], - 'SolrDisMaxQuery::getExpandFilterQueries' => ['array'], - 'SolrDisMaxQuery::getExpandQuery' => ['array'], - 'SolrDisMaxQuery::getExpandRows' => ['int'], - 'SolrDisMaxQuery::getExpandSortFields' => ['array'], - 'SolrDisMaxQuery::getFacet' => ['bool'], - 'SolrDisMaxQuery::getFacetDateEnd' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetDateFields' => ['array'], - 'SolrDisMaxQuery::getFacetDateGap' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetDateHardEnd' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetDateOther' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetDateStart' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetFields' => ['array'], - 'SolrDisMaxQuery::getFacetLimit' => ['int', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetMethod' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetMinCount' => ['int', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetMissing' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetOffset' => ['int', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetPrefix' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFacetQueries' => ['string'], - 'SolrDisMaxQuery::getFacetSort' => ['int', 'field_override'=>'string'], - 'SolrDisMaxQuery::getFields' => ['string'], - 'SolrDisMaxQuery::getFilterQueries' => ['string'], - 'SolrDisMaxQuery::getGroup' => ['bool'], - 'SolrDisMaxQuery::getGroupCachePercent' => ['int'], - 'SolrDisMaxQuery::getGroupFacet' => ['bool'], - 'SolrDisMaxQuery::getGroupFields' => ['array'], - 'SolrDisMaxQuery::getGroupFormat' => ['string'], - 'SolrDisMaxQuery::getGroupFunctions' => ['array'], - 'SolrDisMaxQuery::getGroupLimit' => ['int'], - 'SolrDisMaxQuery::getGroupMain' => ['bool'], - 'SolrDisMaxQuery::getGroupNGroups' => ['bool'], - 'SolrDisMaxQuery::getGroupOffset' => ['bool'], - 'SolrDisMaxQuery::getGroupQueries' => ['array'], - 'SolrDisMaxQuery::getGroupSortFields' => ['array'], - 'SolrDisMaxQuery::getGroupTruncate' => ['bool'], - 'SolrDisMaxQuery::getHighlight' => ['bool'], - 'SolrDisMaxQuery::getHighlightAlternateField' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getHighlightFields' => ['array'], - 'SolrDisMaxQuery::getHighlightFormatter' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getHighlightFragmenter' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getHighlightFragsize' => ['int', 'field_override'=>'string'], - 'SolrDisMaxQuery::getHighlightHighlightMultiTerm' => ['bool'], - 'SolrDisMaxQuery::getHighlightMaxAlternateFieldLength' => ['int', 'field_override'=>'string'], - 'SolrDisMaxQuery::getHighlightMaxAnalyzedChars' => ['int'], - 'SolrDisMaxQuery::getHighlightMergeContiguous' => ['bool', 'field_override'=>'string'], - 'SolrDisMaxQuery::getHighlightRegexMaxAnalyzedChars' => ['int'], - 'SolrDisMaxQuery::getHighlightRegexPattern' => ['string'], - 'SolrDisMaxQuery::getHighlightRegexSlop' => ['float'], - 'SolrDisMaxQuery::getHighlightRequireFieldMatch' => ['bool'], - 'SolrDisMaxQuery::getHighlightSimplePost' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getHighlightSimplePre' => ['string', 'field_override'=>'string'], - 'SolrDisMaxQuery::getHighlightSnippets' => ['int', 'field_override'=>'string'], - 'SolrDisMaxQuery::getHighlightUsePhraseHighlighter' => ['bool'], - 'SolrDisMaxQuery::getMlt' => ['bool'], - 'SolrDisMaxQuery::getMltBoost' => ['bool'], - 'SolrDisMaxQuery::getMltCount' => ['int'], - 'SolrDisMaxQuery::getMltFields' => ['array'], - 'SolrDisMaxQuery::getMltMaxNumQueryTerms' => ['int'], - 'SolrDisMaxQuery::getMltMaxNumTokens' => ['int'], - 'SolrDisMaxQuery::getMltMaxWordLength' => ['int'], - 'SolrDisMaxQuery::getMltMinDocFrequency' => ['int'], - 'SolrDisMaxQuery::getMltMinTermFrequency' => ['int'], - 'SolrDisMaxQuery::getMltMinWordLength' => ['int'], - 'SolrDisMaxQuery::getMltQueryFields' => ['array'], - 'SolrDisMaxQuery::getParam' => ['mixed', 'param_name'=>'string'], - 'SolrDisMaxQuery::getParams' => ['array'], - 'SolrDisMaxQuery::getPreparedParams' => ['array'], - 'SolrDisMaxQuery::getQuery' => ['string'], - 'SolrDisMaxQuery::getRows' => ['int'], - 'SolrDisMaxQuery::getSortFields' => ['array'], - 'SolrDisMaxQuery::getStart' => ['int'], - 'SolrDisMaxQuery::getStats' => ['bool'], - 'SolrDisMaxQuery::getStatsFacets' => ['array'], - 'SolrDisMaxQuery::getStatsFields' => ['array'], - 'SolrDisMaxQuery::getTerms' => ['bool'], - 'SolrDisMaxQuery::getTermsField' => ['string'], - 'SolrDisMaxQuery::getTermsIncludeLowerBound' => ['bool'], - 'SolrDisMaxQuery::getTermsIncludeUpperBound' => ['bool'], - 'SolrDisMaxQuery::getTermsLimit' => ['int'], - 'SolrDisMaxQuery::getTermsLowerBound' => ['string'], - 'SolrDisMaxQuery::getTermsMaxCount' => ['int'], - 'SolrDisMaxQuery::getTermsMinCount' => ['int'], - 'SolrDisMaxQuery::getTermsPrefix' => ['string'], - 'SolrDisMaxQuery::getTermsReturnRaw' => ['bool'], - 'SolrDisMaxQuery::getTermsSort' => ['int'], - 'SolrDisMaxQuery::getTermsUpperBound' => ['string'], - 'SolrDisMaxQuery::getTimeAllowed' => ['int'], - 'SolrDisMaxQuery::removeBigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeBoostQuery' => ['SolrDisMaxQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], - 'SolrDisMaxQuery::removeExpandSortField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeFacetDateField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::removeFacetField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeFacetQuery' => ['SolrQuery', 'value'=>'string'], - 'SolrDisMaxQuery::removeField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeFilterQuery' => ['SolrQuery', 'fq'=>'string'], - 'SolrDisMaxQuery::removeHighlightField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeMltField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeMltQueryField' => ['SolrQuery', 'queryField'=>'string'], - 'SolrDisMaxQuery::removePhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeQueryField' => ['SolrDisMaxQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeSortField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeStatsFacet' => ['SolrQuery', 'value'=>'string'], - 'SolrDisMaxQuery::removeStatsField' => ['SolrQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeTrigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], - 'SolrDisMaxQuery::removeUserField' => ['SolrDisMaxQuery', 'field'=>'string'], - 'SolrDisMaxQuery::serialize' => ['string'], - 'SolrDisMaxQuery::set' => ['SolrParams', 'name'=>'string', 'value'=>''], - 'SolrDisMaxQuery::setBigramPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], - 'SolrDisMaxQuery::setBigramPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], - 'SolrDisMaxQuery::setBoostFunction' => ['SolrDisMaxQuery', 'function'=>'string'], - 'SolrDisMaxQuery::setBoostQuery' => ['SolrDisMaxQuery', 'q'=>'string'], - 'SolrDisMaxQuery::setEchoHandler' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setEchoParams' => ['SolrQuery', 'type'=>'string'], - 'SolrDisMaxQuery::setExpand' => ['SolrQuery', 'value'=>'bool'], - 'SolrDisMaxQuery::setExpandQuery' => ['SolrQuery', 'q'=>'string'], - 'SolrDisMaxQuery::setExpandRows' => ['SolrQuery', 'value'=>'int'], - 'SolrDisMaxQuery::setExplainOther' => ['SolrQuery', 'query'=>'string'], - 'SolrDisMaxQuery::setFacet' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setFacetDateEnd' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetDateGap' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetDateHardEnd' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetDateStart' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency'=>'int', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetLimit' => ['SolrQuery', 'limit'=>'int', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetMethod' => ['SolrQuery', 'method'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetMinCount' => ['SolrQuery', 'mincount'=>'int', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetMissing' => ['SolrQuery', 'flag'=>'bool', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetOffset' => ['SolrQuery', 'offset'=>'int', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetPrefix' => ['SolrQuery', 'prefix'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setFacetSort' => ['SolrQuery', 'facetSort'=>'int', 'field_override'=>'string'], - 'SolrDisMaxQuery::setGroup' => ['SolrQuery', 'value'=>'bool'], - 'SolrDisMaxQuery::setGroupCachePercent' => ['SolrQuery', 'percent'=>'int'], - 'SolrDisMaxQuery::setGroupFacet' => ['SolrQuery', 'value'=>'bool'], - 'SolrDisMaxQuery::setGroupFormat' => ['SolrQuery', 'value'=>'string'], - 'SolrDisMaxQuery::setGroupLimit' => ['SolrQuery', 'value'=>'int'], - 'SolrDisMaxQuery::setGroupMain' => ['SolrQuery', 'value'=>'string'], - 'SolrDisMaxQuery::setGroupNGroups' => ['SolrQuery', 'value'=>'bool'], - 'SolrDisMaxQuery::setGroupOffset' => ['SolrQuery', 'value'=>'int'], - 'SolrDisMaxQuery::setGroupTruncate' => ['SolrQuery', 'value'=>'bool'], - 'SolrDisMaxQuery::setHighlight' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setHighlightAlternateField' => ['SolrQuery', 'field'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setHighlightFormatter' => ['SolrQuery', 'formatter'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setHighlightFragsize' => ['SolrQuery', 'size'=>'int', 'field_override'=>'string'], - 'SolrDisMaxQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldLength'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value'=>'int'], - 'SolrDisMaxQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag'=>'bool', 'field_override'=>'string'], - 'SolrDisMaxQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxAnalyzedChars'=>'int'], - 'SolrDisMaxQuery::setHighlightRegexPattern' => ['SolrQuery', 'value'=>'string'], - 'SolrDisMaxQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor'=>'float'], - 'SolrDisMaxQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setHighlightSimplePost' => ['SolrQuery', 'simplePost'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setHighlightSimplePre' => ['SolrQuery', 'simplePre'=>'string', 'field_override'=>'string'], - 'SolrDisMaxQuery::setHighlightSnippets' => ['SolrQuery', 'value'=>'int', 'field_override'=>'string'], - 'SolrDisMaxQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setMinimumMatch' => ['SolrDisMaxQuery', 'value'=>'string'], - 'SolrDisMaxQuery::setMlt' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setMltBoost' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setMltCount' => ['SolrQuery', 'count'=>'int'], - 'SolrDisMaxQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value'=>'int'], - 'SolrDisMaxQuery::setMltMaxNumTokens' => ['SolrQuery', 'value'=>'int'], - 'SolrDisMaxQuery::setMltMaxWordLength' => ['SolrQuery', 'maxWordLength'=>'int'], - 'SolrDisMaxQuery::setMltMinDocFrequency' => ['SolrQuery', 'minDocFrequency'=>'int'], - 'SolrDisMaxQuery::setMltMinTermFrequency' => ['SolrQuery', 'minTermFrequency'=>'int'], - 'SolrDisMaxQuery::setMltMinWordLength' => ['SolrQuery', 'minWordLength'=>'int'], - 'SolrDisMaxQuery::setOmitHeader' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], - 'SolrDisMaxQuery::setPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], - 'SolrDisMaxQuery::setPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], - 'SolrDisMaxQuery::setQuery' => ['SolrQuery', 'query'=>'string'], - 'SolrDisMaxQuery::setQueryAlt' => ['SolrDisMaxQuery', 'q'=>'string'], - 'SolrDisMaxQuery::setQueryPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], - 'SolrDisMaxQuery::setRows' => ['SolrQuery', 'rows'=>'int'], - 'SolrDisMaxQuery::setShowDebugInfo' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setStart' => ['SolrQuery', 'start'=>'int'], - 'SolrDisMaxQuery::setStats' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setTerms' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setTermsField' => ['SolrQuery', 'fieldname'=>'string'], - 'SolrDisMaxQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setTermsLimit' => ['SolrQuery', 'limit'=>'int'], - 'SolrDisMaxQuery::setTermsLowerBound' => ['SolrQuery', 'lowerBound'=>'string'], - 'SolrDisMaxQuery::setTermsMaxCount' => ['SolrQuery', 'frequency'=>'int'], - 'SolrDisMaxQuery::setTermsMinCount' => ['SolrQuery', 'frequency'=>'int'], - 'SolrDisMaxQuery::setTermsPrefix' => ['SolrQuery', 'prefix'=>'string'], - 'SolrDisMaxQuery::setTermsReturnRaw' => ['SolrQuery', 'flag'=>'bool'], - 'SolrDisMaxQuery::setTermsSort' => ['SolrQuery', 'sortType'=>'int'], - 'SolrDisMaxQuery::setTermsUpperBound' => ['SolrQuery', 'upperBound'=>'string'], - 'SolrDisMaxQuery::setTieBreaker' => ['SolrDisMaxQuery', 'tieBreaker'=>'string'], - 'SolrDisMaxQuery::setTimeAllowed' => ['SolrQuery', 'timeAllowed'=>'int'], - 'SolrDisMaxQuery::setTrigramPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], - 'SolrDisMaxQuery::setTrigramPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], - 'SolrDisMaxQuery::setUserFields' => ['SolrDisMaxQuery', 'fields'=>'string'], - 'SolrDisMaxQuery::toString' => ['string', 'url_encode='=>'bool'], - 'SolrDisMaxQuery::unserialize' => ['void', 'serialized'=>'string'], - 'SolrDisMaxQuery::useDisMaxQueryParser' => ['SolrDisMaxQuery'], - 'SolrDisMaxQuery::useEDisMaxQueryParser' => ['SolrDisMaxQuery'], - 'SolrDocument::__clone' => ['void'], - 'SolrDocument::__construct' => ['void'], - 'SolrDocument::__destruct' => ['void'], - 'SolrDocument::__get' => ['SolrDocumentField', 'fieldname'=>'string'], - 'SolrDocument::__isset' => ['bool', 'fieldname'=>'string'], - 'SolrDocument::__set' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string'], - 'SolrDocument::__unset' => ['bool', 'fieldname'=>'string'], - 'SolrDocument::addField' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string'], - 'SolrDocument::clear' => ['bool'], - 'SolrDocument::current' => ['SolrDocumentField'], - 'SolrDocument::deleteField' => ['bool', 'fieldname'=>'string'], - 'SolrDocument::fieldExists' => ['bool', 'fieldname'=>'string'], - 'SolrDocument::getChildDocuments' => ['SolrInputDocument[]'], - 'SolrDocument::getChildDocumentsCount' => ['int'], - 'SolrDocument::getField' => ['SolrDocumentField|false', 'fieldname'=>'string'], - 'SolrDocument::getFieldCount' => ['int|false'], - 'SolrDocument::getFieldNames' => ['array|false'], - 'SolrDocument::getInputDocument' => ['SolrInputDocument'], - 'SolrDocument::hasChildDocuments' => ['bool'], - 'SolrDocument::key' => ['string'], - 'SolrDocument::merge' => ['bool', 'sourcedoc'=>'solrdocument', 'overwrite='=>'bool'], - 'SolrDocument::next' => ['void'], - 'SolrDocument::offsetExists' => ['bool', 'fieldname'=>'string'], - 'SolrDocument::offsetGet' => ['SolrDocumentField', 'fieldname'=>'string'], - 'SolrDocument::offsetSet' => ['void', 'fieldname'=>'string', 'fieldvalue'=>'string'], - 'SolrDocument::offsetUnset' => ['void', 'fieldname'=>'string'], - 'SolrDocument::reset' => ['bool'], - 'SolrDocument::rewind' => ['void'], - 'SolrDocument::serialize' => ['string'], - 'SolrDocument::sort' => ['bool', 'sortorderby'=>'int', 'sortdirection='=>'int'], - 'SolrDocument::toArray' => ['array'], - 'SolrDocument::unserialize' => ['void', 'serialized'=>'string'], - 'SolrDocument::valid' => ['bool'], - 'SolrDocumentField::__construct' => ['void'], - 'SolrDocumentField::__destruct' => ['void'], - 'SolrException::__clone' => ['void'], - 'SolrException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'SolrException::__toString' => ['string'], - 'SolrException::__wakeup' => ['void'], - 'SolrException::getCode' => ['int'], - 'SolrException::getFile' => ['string'], - 'SolrException::getInternalInfo' => ['array'], - 'SolrException::getLine' => ['int'], - 'SolrException::getMessage' => ['string'], - 'SolrException::getPrevious' => ['Exception|Throwable'], - 'SolrException::getTrace' => ['list\',args?:array}>'], - 'SolrException::getTraceAsString' => ['string'], - 'SolrGenericResponse::__construct' => ['void'], - 'SolrGenericResponse::__destruct' => ['void'], - 'SolrGenericResponse::getDigestedResponse' => ['string'], - 'SolrGenericResponse::getHttpStatus' => ['int'], - 'SolrGenericResponse::getHttpStatusMessage' => ['string'], - 'SolrGenericResponse::getRawRequest' => ['string'], - 'SolrGenericResponse::getRawRequestHeaders' => ['string'], - 'SolrGenericResponse::getRawResponse' => ['string'], - 'SolrGenericResponse::getRawResponseHeaders' => ['string'], - 'SolrGenericResponse::getRequestUrl' => ['string'], - 'SolrGenericResponse::getResponse' => ['SolrObject'], - 'SolrGenericResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], - 'SolrGenericResponse::success' => ['bool'], - 'SolrIllegalArgumentException::__clone' => ['void'], - 'SolrIllegalArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'SolrIllegalArgumentException::__toString' => ['string'], - 'SolrIllegalArgumentException::__wakeup' => ['void'], - 'SolrIllegalArgumentException::getCode' => ['int'], - 'SolrIllegalArgumentException::getFile' => ['string'], - 'SolrIllegalArgumentException::getInternalInfo' => ['array'], - 'SolrIllegalArgumentException::getLine' => ['int'], - 'SolrIllegalArgumentException::getMessage' => ['string'], - 'SolrIllegalArgumentException::getPrevious' => ['Exception|Throwable'], - 'SolrIllegalArgumentException::getTrace' => ['list\',args?:array}>'], - 'SolrIllegalArgumentException::getTraceAsString' => ['string'], - 'SolrIllegalOperationException::__clone' => ['void'], - 'SolrIllegalOperationException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'SolrIllegalOperationException::__toString' => ['string'], - 'SolrIllegalOperationException::__wakeup' => ['void'], - 'SolrIllegalOperationException::getCode' => ['int'], - 'SolrIllegalOperationException::getFile' => ['string'], - 'SolrIllegalOperationException::getInternalInfo' => ['array'], - 'SolrIllegalOperationException::getLine' => ['int'], - 'SolrIllegalOperationException::getMessage' => ['string'], - 'SolrIllegalOperationException::getPrevious' => ['Exception|Throwable'], - 'SolrIllegalOperationException::getTrace' => ['list\',args?:array}>'], - 'SolrIllegalOperationException::getTraceAsString' => ['string'], - 'SolrInputDocument::__clone' => ['void'], - 'SolrInputDocument::__construct' => ['void'], - 'SolrInputDocument::__destruct' => ['void'], - 'SolrInputDocument::addChildDocument' => ['void', 'child'=>'SolrInputDocument'], - 'SolrInputDocument::addChildDocuments' => ['void', 'docs'=>'array'], - 'SolrInputDocument::addField' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string', 'fieldboostvalue='=>'float'], - 'SolrInputDocument::clear' => ['bool'], - 'SolrInputDocument::deleteField' => ['bool', 'fieldname'=>'string'], - 'SolrInputDocument::fieldExists' => ['bool', 'fieldname'=>'string'], - 'SolrInputDocument::getBoost' => ['float|false'], - 'SolrInputDocument::getChildDocuments' => ['SolrInputDocument[]'], - 'SolrInputDocument::getChildDocumentsCount' => ['int'], - 'SolrInputDocument::getField' => ['SolrDocumentField|false', 'fieldname'=>'string'], - 'SolrInputDocument::getFieldBoost' => ['float|false', 'fieldname'=>'string'], - 'SolrInputDocument::getFieldCount' => ['int|false'], - 'SolrInputDocument::getFieldNames' => ['array|false'], - 'SolrInputDocument::hasChildDocuments' => ['bool'], - 'SolrInputDocument::merge' => ['bool', 'sourcedoc'=>'SolrInputDocument', 'overwrite='=>'bool'], - 'SolrInputDocument::reset' => ['bool'], - 'SolrInputDocument::setBoost' => ['bool', 'documentboostvalue'=>'float'], - 'SolrInputDocument::setFieldBoost' => ['bool', 'fieldname'=>'string', 'fieldboostvalue'=>'float'], - 'SolrInputDocument::sort' => ['bool', 'sortorderby'=>'int', 'sortdirection='=>'int'], - 'SolrInputDocument::toArray' => ['array|false'], - 'SolrModifiableParams::__construct' => ['void'], - 'SolrModifiableParams::__destruct' => ['void'], - 'SolrModifiableParams::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], - 'SolrModifiableParams::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], - 'SolrModifiableParams::get' => ['mixed', 'param_name'=>'string'], - 'SolrModifiableParams::getParam' => ['mixed', 'param_name'=>'string'], - 'SolrModifiableParams::getParams' => ['array'], - 'SolrModifiableParams::getPreparedParams' => ['array'], - 'SolrModifiableParams::serialize' => ['string'], - 'SolrModifiableParams::set' => ['SolrParams', 'name'=>'string', 'value'=>''], - 'SolrModifiableParams::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], - 'SolrModifiableParams::toString' => ['string', 'url_encode='=>'bool'], - 'SolrModifiableParams::unserialize' => ['void', 'serialized'=>'string'], - 'SolrObject::__construct' => ['void'], - 'SolrObject::__destruct' => ['void'], - 'SolrObject::getPropertyNames' => ['array'], - 'SolrObject::offsetExists' => ['bool', 'property_name'=>'string'], - 'SolrObject::offsetGet' => ['SolrDocumentField', 'property_name'=>'string'], - 'SolrObject::offsetSet' => ['void', 'property_name'=>'string', 'property_value'=>'string'], - 'SolrObject::offsetUnset' => ['void', 'property_name'=>'string'], - 'SolrParams::__construct' => ['void'], - 'SolrParams::add' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], - 'SolrParams::addParam' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], - 'SolrParams::get' => ['mixed', 'param_name'=>'string'], - 'SolrParams::getParam' => ['mixed', 'param_name='=>'string'], - 'SolrParams::getParams' => ['array'], - 'SolrParams::getPreparedParams' => ['array'], - 'SolrParams::serialize' => ['string'], - 'SolrParams::set' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], - 'SolrParams::setParam' => ['SolrParams|false', 'name'=>'string', 'value'=>'string'], - 'SolrParams::toString' => ['string|false', 'url_encode='=>'bool'], - 'SolrParams::unserialize' => ['void', 'serialized'=>'string'], - 'SolrPingResponse::__construct' => ['void'], - 'SolrPingResponse::__destruct' => ['void'], - 'SolrPingResponse::getDigestedResponse' => ['string'], - 'SolrPingResponse::getHttpStatus' => ['int'], - 'SolrPingResponse::getHttpStatusMessage' => ['string'], - 'SolrPingResponse::getRawRequest' => ['string'], - 'SolrPingResponse::getRawRequestHeaders' => ['string'], - 'SolrPingResponse::getRawResponse' => ['string'], - 'SolrPingResponse::getRawResponseHeaders' => ['string'], - 'SolrPingResponse::getRequestUrl' => ['string'], - 'SolrPingResponse::getResponse' => ['string'], - 'SolrPingResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], - 'SolrPingResponse::success' => ['bool'], - 'SolrQuery::__construct' => ['void', 'q='=>'string'], - 'SolrQuery::__destruct' => ['void'], - 'SolrQuery::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], - 'SolrQuery::addExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], - 'SolrQuery::addExpandSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'string'], - 'SolrQuery::addFacetDateField' => ['SolrQuery', 'datefield'=>'string'], - 'SolrQuery::addFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], - 'SolrQuery::addFacetField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::addFacetQuery' => ['SolrQuery', 'facetquery'=>'string'], - 'SolrQuery::addField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::addFilterQuery' => ['SolrQuery', 'fq'=>'string'], - 'SolrQuery::addGroupField' => ['SolrQuery', 'value'=>'string'], - 'SolrQuery::addGroupFunction' => ['SolrQuery', 'value'=>'string'], - 'SolrQuery::addGroupQuery' => ['SolrQuery', 'value'=>'string'], - 'SolrQuery::addGroupSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], - 'SolrQuery::addHighlightField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::addMltField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::addMltQueryField' => ['SolrQuery', 'field'=>'string', 'boost'=>'float'], - 'SolrQuery::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], - 'SolrQuery::addSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], - 'SolrQuery::addStatsFacet' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::addStatsField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::collapse' => ['SolrQuery', 'collapseFunction'=>'SolrCollapseFunction'], - 'SolrQuery::get' => ['mixed', 'param_name'=>'string'], - 'SolrQuery::getExpand' => ['bool'], - 'SolrQuery::getExpandFilterQueries' => ['array'], - 'SolrQuery::getExpandQuery' => ['array'], - 'SolrQuery::getExpandRows' => ['int'], - 'SolrQuery::getExpandSortFields' => ['array'], - 'SolrQuery::getFacet' => ['?bool'], - 'SolrQuery::getFacetDateEnd' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getFacetDateFields' => ['array'], - 'SolrQuery::getFacetDateGap' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getFacetDateHardEnd' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getFacetDateOther' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getFacetDateStart' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getFacetFields' => ['array'], - 'SolrQuery::getFacetLimit' => ['?int', 'field_override='=>'string'], - 'SolrQuery::getFacetMethod' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getFacetMinCount' => ['?int', 'field_override='=>'string'], - 'SolrQuery::getFacetMissing' => ['?bool', 'field_override='=>'string'], - 'SolrQuery::getFacetOffset' => ['?int', 'field_override='=>'string'], - 'SolrQuery::getFacetPrefix' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getFacetQueries' => ['?array'], - 'SolrQuery::getFacetSort' => ['int', 'field_override='=>'string'], - 'SolrQuery::getFields' => ['?array'], - 'SolrQuery::getFilterQueries' => ['?array'], - 'SolrQuery::getGroup' => ['bool'], - 'SolrQuery::getGroupCachePercent' => ['int'], - 'SolrQuery::getGroupFacet' => ['bool'], - 'SolrQuery::getGroupFields' => ['array'], - 'SolrQuery::getGroupFormat' => ['string'], - 'SolrQuery::getGroupFunctions' => ['array'], - 'SolrQuery::getGroupLimit' => ['int'], - 'SolrQuery::getGroupMain' => ['bool'], - 'SolrQuery::getGroupNGroups' => ['bool'], - 'SolrQuery::getGroupOffset' => ['int'], - 'SolrQuery::getGroupQueries' => ['array'], - 'SolrQuery::getGroupSortFields' => ['array'], - 'SolrQuery::getGroupTruncate' => ['bool'], - 'SolrQuery::getHighlight' => ['bool'], - 'SolrQuery::getHighlightAlternateField' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getHighlightFields' => ['?array'], - 'SolrQuery::getHighlightFormatter' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getHighlightFragmenter' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getHighlightFragsize' => ['?int', 'field_override='=>'string'], - 'SolrQuery::getHighlightHighlightMultiTerm' => ['?bool'], - 'SolrQuery::getHighlightMaxAlternateFieldLength' => ['?int', 'field_override='=>'string'], - 'SolrQuery::getHighlightMaxAnalyzedChars' => ['?int'], - 'SolrQuery::getHighlightMergeContiguous' => ['?bool', 'field_override='=>'string'], - 'SolrQuery::getHighlightRegexMaxAnalyzedChars' => ['?int'], - 'SolrQuery::getHighlightRegexPattern' => ['?string'], - 'SolrQuery::getHighlightRegexSlop' => ['?float'], - 'SolrQuery::getHighlightRequireFieldMatch' => ['?bool'], - 'SolrQuery::getHighlightSimplePost' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getHighlightSimplePre' => ['?string', 'field_override='=>'string'], - 'SolrQuery::getHighlightSnippets' => ['?int', 'field_override='=>'string'], - 'SolrQuery::getHighlightUsePhraseHighlighter' => ['?bool'], - 'SolrQuery::getMlt' => ['?bool'], - 'SolrQuery::getMltBoost' => ['?bool'], - 'SolrQuery::getMltCount' => ['?int'], - 'SolrQuery::getMltFields' => ['?array'], - 'SolrQuery::getMltMaxNumQueryTerms' => ['?int'], - 'SolrQuery::getMltMaxNumTokens' => ['?int'], - 'SolrQuery::getMltMaxWordLength' => ['?int'], - 'SolrQuery::getMltMinDocFrequency' => ['?int'], - 'SolrQuery::getMltMinTermFrequency' => ['?int'], - 'SolrQuery::getMltMinWordLength' => ['?int'], - 'SolrQuery::getMltQueryFields' => ['?array'], - 'SolrQuery::getParam' => ['?mixed', 'param_name'=>'string'], - 'SolrQuery::getParams' => ['?array'], - 'SolrQuery::getPreparedParams' => ['?array'], - 'SolrQuery::getQuery' => ['?string'], - 'SolrQuery::getRows' => ['?int'], - 'SolrQuery::getSortFields' => ['?array'], - 'SolrQuery::getStart' => ['?int'], - 'SolrQuery::getStats' => ['?bool'], - 'SolrQuery::getStatsFacets' => ['?array'], - 'SolrQuery::getStatsFields' => ['?array'], - 'SolrQuery::getTerms' => ['?bool'], - 'SolrQuery::getTermsField' => ['?string'], - 'SolrQuery::getTermsIncludeLowerBound' => ['?bool'], - 'SolrQuery::getTermsIncludeUpperBound' => ['?bool'], - 'SolrQuery::getTermsLimit' => ['?int'], - 'SolrQuery::getTermsLowerBound' => ['?string'], - 'SolrQuery::getTermsMaxCount' => ['?int'], - 'SolrQuery::getTermsMinCount' => ['?int'], - 'SolrQuery::getTermsPrefix' => ['?string'], - 'SolrQuery::getTermsReturnRaw' => ['?bool'], - 'SolrQuery::getTermsSort' => ['?int'], - 'SolrQuery::getTermsUpperBound' => ['?string'], - 'SolrQuery::getTimeAllowed' => ['?int'], - 'SolrQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], - 'SolrQuery::removeExpandSortField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::removeFacetDateField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::removeFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], - 'SolrQuery::removeFacetField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::removeFacetQuery' => ['SolrQuery', 'value'=>'string'], - 'SolrQuery::removeField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::removeFilterQuery' => ['SolrQuery', 'fq'=>'string'], - 'SolrQuery::removeHighlightField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::removeMltField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::removeMltQueryField' => ['SolrQuery', 'queryfield'=>'string'], - 'SolrQuery::removeSortField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::removeStatsFacet' => ['SolrQuery', 'value'=>'string'], - 'SolrQuery::removeStatsField' => ['SolrQuery', 'field'=>'string'], - 'SolrQuery::serialize' => ['string'], - 'SolrQuery::set' => ['SolrParams', 'name'=>'string', 'value'=>''], - 'SolrQuery::setEchoHandler' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setEchoParams' => ['SolrQuery', 'type'=>'string'], - 'SolrQuery::setExpand' => ['SolrQuery', 'value'=>'bool'], - 'SolrQuery::setExpandQuery' => ['SolrQuery', 'q'=>'string'], - 'SolrQuery::setExpandRows' => ['SolrQuery', 'value'=>'int'], - 'SolrQuery::setExplainOther' => ['SolrQuery', 'query'=>'string'], - 'SolrQuery::setFacet' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setFacetDateEnd' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], - 'SolrQuery::setFacetDateGap' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], - 'SolrQuery::setFacetDateHardEnd' => ['SolrQuery', 'value'=>'bool', 'field_override='=>'string'], - 'SolrQuery::setFacetDateStart' => ['SolrQuery', 'value'=>'string', 'field_override='=>'string'], - 'SolrQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency'=>'int', 'field_override='=>'string'], - 'SolrQuery::setFacetLimit' => ['SolrQuery', 'limit'=>'int', 'field_override='=>'string'], - 'SolrQuery::setFacetMethod' => ['SolrQuery', 'method'=>'string', 'field_override='=>'string'], - 'SolrQuery::setFacetMinCount' => ['SolrQuery', 'mincount'=>'int', 'field_override='=>'string'], - 'SolrQuery::setFacetMissing' => ['SolrQuery', 'flag'=>'bool', 'field_override='=>'string'], - 'SolrQuery::setFacetOffset' => ['SolrQuery', 'offset'=>'int', 'field_override='=>'string'], - 'SolrQuery::setFacetPrefix' => ['SolrQuery', 'prefix'=>'string', 'field_override='=>'string'], - 'SolrQuery::setFacetSort' => ['SolrQuery', 'facetsort'=>'int', 'field_override='=>'string'], - 'SolrQuery::setGroup' => ['SolrQuery', 'value'=>'bool'], - 'SolrQuery::setGroupCachePercent' => ['SolrQuery', 'percent'=>'int'], - 'SolrQuery::setGroupFacet' => ['SolrQuery', 'value'=>'bool'], - 'SolrQuery::setGroupFormat' => ['SolrQuery', 'value'=>'string'], - 'SolrQuery::setGroupLimit' => ['SolrQuery', 'value'=>'int'], - 'SolrQuery::setGroupMain' => ['SolrQuery', 'value'=>'string'], - 'SolrQuery::setGroupNGroups' => ['SolrQuery', 'value'=>'bool'], - 'SolrQuery::setGroupOffset' => ['SolrQuery', 'value'=>'int'], - 'SolrQuery::setGroupTruncate' => ['SolrQuery', 'value'=>'bool'], - 'SolrQuery::setHighlight' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setHighlightAlternateField' => ['SolrQuery', 'field'=>'string', 'field_override='=>'string'], - 'SolrQuery::setHighlightFormatter' => ['SolrQuery', 'formatter'=>'string', 'field_override='=>'string'], - 'SolrQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter'=>'string', 'field_override='=>'string'], - 'SolrQuery::setHighlightFragsize' => ['SolrQuery', 'size'=>'int', 'field_override='=>'string'], - 'SolrQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldlength'=>'int', 'field_override='=>'string'], - 'SolrQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value'=>'int'], - 'SolrQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag'=>'bool', 'field_override='=>'string'], - 'SolrQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxanalyzedchars'=>'int'], - 'SolrQuery::setHighlightRegexPattern' => ['SolrQuery', 'value'=>'string'], - 'SolrQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor'=>'float'], - 'SolrQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setHighlightSimplePost' => ['SolrQuery', 'simplepost'=>'string', 'field_override='=>'string'], - 'SolrQuery::setHighlightSimplePre' => ['SolrQuery', 'simplepre'=>'string', 'field_override='=>'string'], - 'SolrQuery::setHighlightSnippets' => ['SolrQuery', 'value'=>'int', 'field_override='=>'string'], - 'SolrQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setMlt' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setMltBoost' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setMltCount' => ['SolrQuery', 'count'=>'int'], - 'SolrQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value'=>'int'], - 'SolrQuery::setMltMaxNumTokens' => ['SolrQuery', 'value'=>'int'], - 'SolrQuery::setMltMaxWordLength' => ['SolrQuery', 'maxwordlength'=>'int'], - 'SolrQuery::setMltMinDocFrequency' => ['SolrQuery', 'mindocfrequency'=>'int'], - 'SolrQuery::setMltMinTermFrequency' => ['SolrQuery', 'mintermfrequency'=>'int'], - 'SolrQuery::setMltMinWordLength' => ['SolrQuery', 'minwordlength'=>'int'], - 'SolrQuery::setOmitHeader' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], - 'SolrQuery::setQuery' => ['SolrQuery', 'query'=>'string'], - 'SolrQuery::setRows' => ['SolrQuery', 'rows'=>'int'], - 'SolrQuery::setShowDebugInfo' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setStart' => ['SolrQuery', 'start'=>'int'], - 'SolrQuery::setStats' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setTerms' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setTermsField' => ['SolrQuery', 'fieldname'=>'string'], - 'SolrQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setTermsLimit' => ['SolrQuery', 'limit'=>'int'], - 'SolrQuery::setTermsLowerBound' => ['SolrQuery', 'lowerbound'=>'string'], - 'SolrQuery::setTermsMaxCount' => ['SolrQuery', 'frequency'=>'int'], - 'SolrQuery::setTermsMinCount' => ['SolrQuery', 'frequency'=>'int'], - 'SolrQuery::setTermsPrefix' => ['SolrQuery', 'prefix'=>'string'], - 'SolrQuery::setTermsReturnRaw' => ['SolrQuery', 'flag'=>'bool'], - 'SolrQuery::setTermsSort' => ['SolrQuery', 'sorttype'=>'int'], - 'SolrQuery::setTermsUpperBound' => ['SolrQuery', 'upperbound'=>'string'], - 'SolrQuery::setTimeAllowed' => ['SolrQuery', 'timeallowed'=>'int'], - 'SolrQuery::toString' => ['string', 'url_encode='=>'bool'], - 'SolrQuery::unserialize' => ['void', 'serialized'=>'string'], - 'SolrQueryResponse::__construct' => ['void'], - 'SolrQueryResponse::__destruct' => ['void'], - 'SolrQueryResponse::getDigestedResponse' => ['string'], - 'SolrQueryResponse::getHttpStatus' => ['int'], - 'SolrQueryResponse::getHttpStatusMessage' => ['string'], - 'SolrQueryResponse::getRawRequest' => ['string'], - 'SolrQueryResponse::getRawRequestHeaders' => ['string'], - 'SolrQueryResponse::getRawResponse' => ['string'], - 'SolrQueryResponse::getRawResponseHeaders' => ['string'], - 'SolrQueryResponse::getRequestUrl' => ['string'], - 'SolrQueryResponse::getResponse' => ['SolrObject'], - 'SolrQueryResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], - 'SolrQueryResponse::success' => ['bool'], - 'SolrResponse::getDigestedResponse' => ['string'], - 'SolrResponse::getHttpStatus' => ['int'], - 'SolrResponse::getHttpStatusMessage' => ['string'], - 'SolrResponse::getRawRequest' => ['string'], - 'SolrResponse::getRawRequestHeaders' => ['string'], - 'SolrResponse::getRawResponse' => ['string'], - 'SolrResponse::getRawResponseHeaders' => ['string'], - 'SolrResponse::getRequestUrl' => ['string'], - 'SolrResponse::getResponse' => ['SolrObject'], - 'SolrResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], - 'SolrResponse::success' => ['bool'], - 'SolrServerException::__clone' => ['void'], - 'SolrServerException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'SolrServerException::__toString' => ['string'], - 'SolrServerException::__wakeup' => ['void'], - 'SolrServerException::getCode' => ['int'], - 'SolrServerException::getFile' => ['string'], - 'SolrServerException::getInternalInfo' => ['array'], - 'SolrServerException::getLine' => ['int'], - 'SolrServerException::getMessage' => ['string'], - 'SolrServerException::getPrevious' => ['Exception|Throwable'], - 'SolrServerException::getTrace' => ['list\',args?:array}>'], - 'SolrServerException::getTraceAsString' => ['string'], - 'SolrUpdateResponse::__construct' => ['void'], - 'SolrUpdateResponse::__destruct' => ['void'], - 'SolrUpdateResponse::getDigestedResponse' => ['string'], - 'SolrUpdateResponse::getHttpStatus' => ['int'], - 'SolrUpdateResponse::getHttpStatusMessage' => ['string'], - 'SolrUpdateResponse::getRawRequest' => ['string'], - 'SolrUpdateResponse::getRawRequestHeaders' => ['string'], - 'SolrUpdateResponse::getRawResponse' => ['string'], - 'SolrUpdateResponse::getRawResponseHeaders' => ['string'], - 'SolrUpdateResponse::getRequestUrl' => ['string'], - 'SolrUpdateResponse::getResponse' => ['SolrObject'], - 'SolrUpdateResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], - 'SolrUpdateResponse::success' => ['bool'], - 'SolrUtils::digestXmlResponse' => ['SolrObject', 'xmlresponse'=>'string', 'parse_mode='=>'int'], - 'SolrUtils::escapeQueryChars' => ['string|false', 'string'=>'string'], - 'SolrUtils::getSolrVersion' => ['string'], - 'SolrUtils::queryPhrase' => ['string', 'string'=>'string'], - 'SphinxClient::__construct' => ['void'], - 'SphinxClient::addQuery' => ['int', 'query'=>'string', 'index='=>'string', 'comment='=>'string'], - 'SphinxClient::buildExcerpts' => ['array', 'docs'=>'array', 'index'=>'string', 'words'=>'string', 'opts='=>'array'], - 'SphinxClient::buildKeywords' => ['array', 'query'=>'string', 'index'=>'string', 'hits'=>'bool'], - 'SphinxClient::close' => ['bool'], - 'SphinxClient::escapeString' => ['string', 'string'=>'string'], - 'SphinxClient::getLastError' => ['string'], - 'SphinxClient::getLastWarning' => ['string'], - 'SphinxClient::open' => ['bool'], - 'SphinxClient::query' => ['array', 'query'=>'string', 'index='=>'string', 'comment='=>'string'], - 'SphinxClient::resetFilters' => ['void'], - 'SphinxClient::resetGroupBy' => ['void'], - 'SphinxClient::runQueries' => ['array'], - 'SphinxClient::setArrayResult' => ['bool', 'array_result'=>'bool'], - 'SphinxClient::setConnectTimeout' => ['bool', 'timeout'=>'float'], - 'SphinxClient::setFieldWeights' => ['bool', 'weights'=>'array'], - 'SphinxClient::setFilter' => ['bool', 'attribute'=>'string', 'values'=>'array', 'exclude='=>'bool'], - 'SphinxClient::setFilterFloatRange' => ['bool', 'attribute'=>'string', 'min'=>'float', 'max'=>'float', 'exclude='=>'bool'], - 'SphinxClient::setFilterRange' => ['bool', 'attribute'=>'string', 'min'=>'int', 'max'=>'int', 'exclude='=>'bool'], - 'SphinxClient::setGeoAnchor' => ['bool', 'attrlat'=>'string', 'attrlong'=>'string', 'latitude'=>'float', 'longitude'=>'float'], - 'SphinxClient::setGroupBy' => ['bool', 'attribute'=>'string', 'func'=>'int', 'groupsort='=>'string'], - 'SphinxClient::setGroupDistinct' => ['bool', 'attribute'=>'string'], - 'SphinxClient::setIDRange' => ['bool', 'min'=>'int', 'max'=>'int'], - 'SphinxClient::setIndexWeights' => ['bool', 'weights'=>'array'], - 'SphinxClient::setLimits' => ['bool', 'offset'=>'int', 'limit'=>'int', 'max_matches='=>'int', 'cutoff='=>'int'], - 'SphinxClient::setMatchMode' => ['bool', 'mode'=>'int'], - 'SphinxClient::setMaxQueryTime' => ['bool', 'qtime'=>'int'], - 'SphinxClient::setOverride' => ['bool', 'attribute'=>'string', 'type'=>'int', 'values'=>'array'], - 'SphinxClient::setRankingMode' => ['bool', 'ranker'=>'int'], - 'SphinxClient::setRetries' => ['bool', 'count'=>'int', 'delay='=>'int'], - 'SphinxClient::setSelect' => ['bool', 'clause'=>'string'], - 'SphinxClient::setServer' => ['bool', 'server'=>'string', 'port'=>'int'], - 'SphinxClient::setSortMode' => ['bool', 'mode'=>'int', 'sortby='=>'string'], - '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::bottom' => ['mixed'], - 'SplDoublyLinkedList::count' => ['int'], - 'SplDoublyLinkedList::current' => ['mixed'], - 'SplDoublyLinkedList::getIteratorMode' => ['int'], - 'SplDoublyLinkedList::isEmpty' => ['bool'], - 'SplDoublyLinkedList::key' => ['mixed'], - 'SplDoublyLinkedList::next' => ['void'], - 'SplDoublyLinkedList::offsetExists' => ['bool', 'index'=>'mixed'], - 'SplDoublyLinkedList::offsetGet' => ['mixed', 'index'=>'mixed'], - 'SplDoublyLinkedList::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'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::shift' => ['mixed'], - 'SplDoublyLinkedList::top' => ['mixed'], - 'SplDoublyLinkedList::unserialize' => ['void', 'serialized'=>'string'], - 'SplDoublyLinkedList::unshift' => ['bool', 'value'=>'mixed'], - 'SplDoublyLinkedList::valid' => ['bool'], - 'SplEnum::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], - 'SplEnum::getConstList' => ['array', 'include_default='=>'bool'], - 'SplFileInfo::__construct' => ['void', 'file_name'=>'string'], - 'SplFileInfo::__toString' => ['string'], - 'SplFileInfo::__wakeup' => ['void'], - 'SplFileInfo::getATime' => ['int'], - 'SplFileInfo::getBasename' => ['string', 'suffix='=>'string'], - 'SplFileInfo::getCTime' => ['int'], - 'SplFileInfo::getExtension' => ['string'], - 'SplFileInfo::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'SplFileInfo::getFilename' => ['string'], - 'SplFileInfo::getGroup' => ['int'], - 'SplFileInfo::getInode' => ['int'], - 'SplFileInfo::getLinkTarget' => ['string'], - 'SplFileInfo::getMTime' => ['int'], - 'SplFileInfo::getOwner' => ['int'], - 'SplFileInfo::getPath' => ['string'], - 'SplFileInfo::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'SplFileInfo::getPathname' => ['string'], - 'SplFileInfo::getPerms' => ['int'], - 'SplFileInfo::getRealPath' => ['string|false'], - 'SplFileInfo::getSize' => ['int'], - 'SplFileInfo::getType' => ['string'], - 'SplFileInfo::isDir' => ['bool'], - 'SplFileInfo::isExecutable' => ['bool'], - 'SplFileInfo::isFile' => ['bool'], - 'SplFileInfo::isLink' => ['bool'], - 'SplFileInfo::isReadable' => ['bool'], - 'SplFileInfo::isWritable' => ['bool'], - 'SplFileInfo::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], - 'SplFileInfo::setFileClass' => ['void', 'class_name='=>'string'], - 'SplFileInfo::setInfoClass' => ['void', 'class_name='=>'string'], - 'SplFileObject::__construct' => ['void', 'filename'=>'string', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>''], - 'SplFileObject::__toString' => ['string'], - 'SplFileObject::current' => ['string|array|false'], - 'SplFileObject::eof' => ['bool'], - 'SplFileObject::fflush' => ['bool'], - 'SplFileObject::fgetc' => ['string|false'], - 'SplFileObject::fgetcsv' => ['list|array{0: null}|false|null', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'SplFileObject::fgets' => ['string|false'], - 'SplFileObject::fgetss' => ['string|false', 'allowable_tags='=>'string'], - 'SplFileObject::flock' => ['bool', 'operation'=>'int', '&w_wouldblock='=>'int'], - 'SplFileObject::fpassthru' => ['int|false'], - 'SplFileObject::fputcsv' => ['int|false', 'fields'=>'array', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'SplFileObject::fread' => ['string|false', 'length'=>'int'], - 'SplFileObject::fscanf' => ['array|int', 'format'=>'string', '&...w_vars='=>'string|int|float'], - 'SplFileObject::fseek' => ['int', 'pos'=>'int', 'whence='=>'int'], - 'SplFileObject::fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}'], - 'SplFileObject::ftell' => ['int|false'], - 'SplFileObject::ftruncate' => ['bool', 'size'=>'int'], - 'SplFileObject::fwrite' => ['int', 'string'=>'string', 'length='=>'int'], - 'SplFileObject::getATime' => ['int'], - 'SplFileObject::getBasename' => ['string', 'suffix='=>'string'], - 'SplFileObject::getCTime' => ['int'], - 'SplFileObject::getChildren' => ['null'], - 'SplFileObject::getCsvControl' => ['array'], - 'SplFileObject::getCurrentLine' => ['string|false'], - 'SplFileObject::getExtension' => ['string'], - 'SplFileObject::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'SplFileObject::getFilename' => ['string'], - 'SplFileObject::getFlags' => ['int'], - 'SplFileObject::getGroup' => ['int'], - 'SplFileObject::getInode' => ['int'], - 'SplFileObject::getLinkTarget' => ['string'], - 'SplFileObject::getMTime' => ['int'], - 'SplFileObject::getMaxLineLen' => ['int'], - 'SplFileObject::getOwner' => ['int'], - 'SplFileObject::getPath' => ['string'], - 'SplFileObject::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'SplFileObject::getPathname' => ['string'], - 'SplFileObject::getPerms' => ['int'], - 'SplFileObject::getRealPath' => ['false|string'], - 'SplFileObject::getSize' => ['int'], - 'SplFileObject::getType' => ['string'], - 'SplFileObject::hasChildren' => ['false'], - 'SplFileObject::isDir' => ['bool'], - 'SplFileObject::isExecutable' => ['bool'], - 'SplFileObject::isFile' => ['bool'], - 'SplFileObject::isLink' => ['bool'], - 'SplFileObject::isReadable' => ['bool'], - 'SplFileObject::isWritable' => ['bool'], - 'SplFileObject::key' => ['int'], - 'SplFileObject::next' => ['void'], - 'SplFileObject::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], - 'SplFileObject::rewind' => ['void'], - 'SplFileObject::seek' => ['void', 'line_pos'=>'int'], - 'SplFileObject::setCsvControl' => ['void', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'SplFileObject::setFileClass' => ['void', 'class_name='=>'string'], - 'SplFileObject::setFlags' => ['void', 'flags'=>'int'], - 'SplFileObject::setInfoClass' => ['void', 'class_name='=>'string'], - 'SplFileObject::setMaxLineLen' => ['void', 'max_len'=>'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::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::offsetUnset' => ['void', 'index'=>'int'], - 'SplFixedArray::rewind' => ['void'], - 'SplFixedArray::setSize' => ['bool', 'size'=>'int'], - 'SplFixedArray::toArray' => ['array'], - 'SplFixedArray::valid' => ['bool'], - 'SplHeap::__construct' => ['void'], - 'SplHeap::compare' => ['int', 'value1'=>'mixed', 'value2'=>'mixed'], - 'SplHeap::count' => ['int'], - 'SplHeap::current' => ['mixed'], - 'SplHeap::extract' => ['mixed'], - 'SplHeap::insert' => ['bool', 'value'=>'mixed'], - 'SplHeap::isCorrupted' => ['bool'], - 'SplHeap::isEmpty' => ['bool'], - 'SplHeap::key' => ['int'], - 'SplHeap::next' => ['void'], - 'SplHeap::recoverFromCorruption' => ['int'], - 'SplHeap::rewind' => ['void'], - 'SplHeap::top' => ['mixed'], - 'SplHeap::valid' => ['bool'], - 'SplMaxHeap::__construct' => ['void'], - 'SplMaxHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], - 'SplMinHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], - 'SplMinHeap::count' => ['int'], - 'SplMinHeap::current' => ['mixed'], - 'SplMinHeap::extract' => ['mixed'], - 'SplMinHeap::insert' => ['void', 'value'=>'mixed'], - 'SplMinHeap::isCorrupted' => ['int'], - 'SplMinHeap::isEmpty' => ['bool'], - 'SplMinHeap::key' => ['mixed'], - 'SplMinHeap::next' => ['void'], - 'SplMinHeap::recoverFromCorruption' => ['void'], - 'SplMinHeap::rewind' => ['void'], - 'SplMinHeap::top' => ['mixed'], - 'SplMinHeap::valid' => ['bool'], - 'SplObjectStorage::__construct' => ['void'], - 'SplObjectStorage::addAll' => ['void', 'os'=>'splobjectstorage'], - 'SplObjectStorage::attach' => ['void', 'object'=>'object', 'inf='=>'mixed'], - 'SplObjectStorage::contains' => ['bool', 'object'=>'object'], - 'SplObjectStorage::count' => ['int'], - 'SplObjectStorage::current' => ['object'], - 'SplObjectStorage::detach' => ['void', 'object'=>'object'], - 'SplObjectStorage::getHash' => ['string', 'object'=>'object'], - 'SplObjectStorage::getInfo' => ['mixed'], - 'SplObjectStorage::key' => ['int'], - 'SplObjectStorage::next' => ['void'], - 'SplObjectStorage::offsetExists' => ['bool', 'object'=>'object'], - 'SplObjectStorage::offsetGet' => ['mixed', 'object'=>'object'], - 'SplObjectStorage::offsetSet' => ['object', 'object'=>'object', 'data='=>'mixed'], - 'SplObjectStorage::offsetUnset' => ['object', 'object'=>'object'], - 'SplObjectStorage::removeAll' => ['void', 'os'=>'splobjectstorage'], - 'SplObjectStorage::removeAllExcept' => ['void', 'os'=>'splobjectstorage'], - 'SplObjectStorage::rewind' => ['void'], - 'SplObjectStorage::serialize' => ['string'], - 'SplObjectStorage::setInfo' => ['void', 'inf'=>'mixed'], - 'SplObjectStorage::unserialize' => ['void', 'serialized'=>'string'], - 'SplObjectStorage::valid' => ['bool'], - 'SplObserver::update' => ['void', 'subject'=>'SplSubject'], - 'SplPriorityQueue::__construct' => ['void'], - 'SplPriorityQueue::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], - 'SplPriorityQueue::count' => ['int'], - 'SplPriorityQueue::current' => ['mixed'], - 'SplPriorityQueue::extract' => ['mixed'], - 'SplPriorityQueue::getExtractFlags' => ['int'], - 'SplPriorityQueue::insert' => ['bool', 'value'=>'mixed', 'priority'=>'mixed'], - 'SplPriorityQueue::isEmpty' => ['bool'], - 'SplPriorityQueue::key' => ['mixed'], - 'SplPriorityQueue::next' => ['void'], - 'SplPriorityQueue::recoverFromCorruption' => ['void'], - 'SplPriorityQueue::rewind' => ['void'], - 'SplPriorityQueue::setExtractFlags' => ['void', 'flags'=>'int'], - 'SplPriorityQueue::top' => ['mixed'], - 'SplPriorityQueue::valid' => ['bool'], - 'SplQueue::dequeue' => ['mixed'], - 'SplQueue::enqueue' => ['void', 'value'=>'mixed'], - 'SplQueue::getIteratorMode' => ['int'], - 'SplQueue::isEmpty' => ['bool'], - 'SplQueue::key' => ['mixed'], - 'SplQueue::next' => ['void'], - 'SplQueue::offsetExists' => ['bool', 'index'=>'mixed'], - 'SplQueue::offsetGet' => ['mixed', 'index'=>'mixed'], - 'SplQueue::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], - 'SplQueue::offsetUnset' => ['void', 'index'=>'mixed'], - 'SplQueue::pop' => ['mixed'], - 'SplQueue::prev' => ['void'], - 'SplQueue::push' => ['void', 'value'=>'mixed'], - 'SplQueue::rewind' => ['void'], - 'SplQueue::serialize' => ['string'], - 'SplQueue::setIteratorMode' => ['void', 'mode'=>'int'], - 'SplQueue::shift' => ['mixed'], - 'SplQueue::top' => ['mixed'], - 'SplQueue::unserialize' => ['void', 'serialized'=>'string'], - 'SplQueue::unshift' => ['bool', 'value'=>'mixed'], - 'SplQueue::valid' => ['bool'], - 'SplStack::__construct' => ['void'], - 'SplStack::add' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], - 'SplStack::bottom' => ['mixed'], - 'SplStack::count' => ['int'], - 'SplStack::current' => ['mixed'], - 'SplStack::getIteratorMode' => ['int'], - 'SplStack::isEmpty' => ['bool'], - 'SplStack::key' => ['mixed'], - 'SplStack::next' => ['void'], - 'SplStack::offsetExists' => ['bool', 'index'=>'mixed'], - 'SplStack::offsetGet' => ['mixed', 'index'=>'mixed'], - 'SplStack::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], - 'SplStack::offsetUnset' => ['void', 'index'=>'mixed'], - 'SplStack::pop' => ['mixed'], - 'SplStack::prev' => ['void'], - 'SplStack::push' => ['void', 'value'=>'mixed'], - 'SplStack::rewind' => ['void'], - 'SplStack::serialize' => ['string'], - 'SplStack::setIteratorMode' => ['void', 'mode'=>'int'], - 'SplStack::shift' => ['mixed'], - 'SplStack::top' => ['mixed'], - 'SplStack::unserialize' => ['void', 'serialized'=>'string'], - 'SplStack::unshift' => ['bool', 'value'=>'mixed'], - 'SplStack::valid' => ['bool'], - 'SplSubject::attach' => ['void', 'observer'=>'SplObserver'], - 'SplSubject::detach' => ['void', 'observer'=>'SplObserver'], - 'SplSubject::notify' => ['void'], - 'SplTempFileObject::__construct' => ['void', 'max_memory='=>'int'], - 'SplTempFileObject::__toString' => ['string'], - 'SplTempFileObject::_bad_state_ex' => [''], - 'SplTempFileObject::current' => ['array|false|string'], - 'SplTempFileObject::eof' => ['bool'], - 'SplTempFileObject::fflush' => ['bool'], - 'SplTempFileObject::fgetc' => ['false|string'], - 'SplTempFileObject::fgetcsv' => ['list|array{0: null}|false|null', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'SplTempFileObject::fgets' => ['string'], - 'SplTempFileObject::fgetss' => ['string', 'allowable_tags='=>'string'], - 'SplTempFileObject::flock' => ['bool', 'operation'=>'int', '&wouldblock='=>'int'], - 'SplTempFileObject::fpassthru' => ['int|false'], - 'SplTempFileObject::fputcsv' => ['false|int', 'fields'=>'array', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'SplTempFileObject::fread' => ['false|string', 'length'=>'int'], - 'SplTempFileObject::fscanf' => ['bool', 'format'=>'string', '&...w_vars='=>'array|array|array'], - 'SplTempFileObject::fseek' => ['int', 'pos'=>'int', 'whence='=>'int'], - 'SplTempFileObject::fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}'], - 'SplTempFileObject::ftell' => ['int'], - 'SplTempFileObject::ftruncate' => ['bool', 'size'=>'int'], - 'SplTempFileObject::fwrite' => ['int', 'string'=>'string', 'length='=>'int'], - 'SplTempFileObject::getATime' => ['int'], - 'SplTempFileObject::getBasename' => ['string', 'suffix='=>'string'], - 'SplTempFileObject::getCTime' => ['int'], - 'SplTempFileObject::getChildren' => ['null'], - 'SplTempFileObject::getCsvControl' => ['array'], - 'SplTempFileObject::getCurrentLine' => ['string'], - 'SplTempFileObject::getExtension' => ['string'], - 'SplTempFileObject::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'SplTempFileObject::getFilename' => ['string'], - 'SplTempFileObject::getFlags' => ['int'], - 'SplTempFileObject::getGroup' => ['int'], - 'SplTempFileObject::getInode' => ['int'], - 'SplTempFileObject::getLinkTarget' => ['string'], - 'SplTempFileObject::getMTime' => ['int'], - 'SplTempFileObject::getMaxLineLen' => ['int'], - 'SplTempFileObject::getOwner' => ['int'], - 'SplTempFileObject::getPath' => ['string'], - 'SplTempFileObject::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], - 'SplTempFileObject::getPathname' => ['string'], - 'SplTempFileObject::getPerms' => ['int'], - 'SplTempFileObject::getRealPath' => ['string'], - 'SplTempFileObject::getSize' => ['int'], - 'SplTempFileObject::getType' => ['string'], - 'SplTempFileObject::hasChildren' => ['bool'], - 'SplTempFileObject::isDir' => ['bool'], - 'SplTempFileObject::isExecutable' => ['bool'], - 'SplTempFileObject::isFile' => ['bool'], - 'SplTempFileObject::isLink' => ['bool'], - 'SplTempFileObject::isReadable' => ['bool'], - 'SplTempFileObject::isWritable' => ['bool'], - 'SplTempFileObject::key' => ['int'], - 'SplTempFileObject::next' => ['void'], - 'SplTempFileObject::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], - 'SplTempFileObject::rewind' => ['void'], - 'SplTempFileObject::seek' => ['void', 'line_pos'=>'int'], - 'SplTempFileObject::setCsvControl' => ['void', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'SplTempFileObject::setFileClass' => ['void', 'class_name='=>'string'], - 'SplTempFileObject::setFlags' => ['void', 'flags'=>'int'], - 'SplTempFileObject::setInfoClass' => ['void', 'class_name='=>'string'], - 'SplTempFileObject::setMaxLineLen' => ['void', 'max_len'=>'int'], - 'SplTempFileObject::valid' => ['bool'], - 'SplType::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], - 'Spoofchecker::__construct' => ['void'], - 'Spoofchecker::areConfusable' => ['bool', 's1'=>'string', 's2'=>'string', '&w_error='=>'string'], - 'Spoofchecker::isSuspicious' => ['bool', 'text'=>'string', '&w_error='=>'string'], - 'Spoofchecker::setAllowedLocales' => ['void', 'locale_list'=>'string'], - 'Spoofchecker::setChecks' => ['void', 'checks'=>'long'], - 'Spoofchecker::setRestrictionLevel' => ['void', 'restriction_level'=>'int'], - 'Stomp::__construct' => ['void', 'broker='=>'string', 'username='=>'string', 'password='=>'string', 'headers='=>'array'], - 'Stomp::__destruct' => ['bool', 'link'=>''], - 'Stomp::abort' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], - 'Stomp::ack' => ['bool', 'msg'=>'', 'headers='=>'array', 'link='=>''], - 'Stomp::begin' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], - 'Stomp::commit' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], - 'Stomp::error' => ['string', 'link'=>''], - 'Stomp::getReadTimeout' => ['array', 'link'=>''], - 'Stomp::getSessionId' => ['string', 'link'=>''], - 'Stomp::hasFrame' => ['bool', 'link'=>''], - 'Stomp::readFrame' => ['array', 'class_name='=>'string', 'link='=>''], - 'Stomp::send' => ['bool', 'destination'=>'string', 'msg'=>'', 'headers='=>'array', 'link='=>''], - 'Stomp::setReadTimeout' => ['', 'seconds'=>'int', 'microseconds='=>'int', 'link='=>''], - 'Stomp::subscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], - 'Stomp::unsubscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], - 'StompException::getDetails' => ['string'], - 'StompFrame::__construct' => ['void', 'command='=>'string', 'headers='=>'array', 'body='=>'string'], - 'Swish::__construct' => ['void', 'index_names'=>'string'], - 'Swish::getMetaList' => ['array', 'index_name'=>'string'], - 'Swish::getPropertyList' => ['array', 'index_name'=>'string'], - 'Swish::prepare' => ['object', 'query='=>'string'], - 'Swish::query' => ['object', 'query'=>'string'], - 'SwishResult::getMetaList' => ['array'], - 'SwishResult::stem' => ['array', 'word'=>'string'], - 'SwishResults::getParsedWords' => ['array', 'index_name'=>'string'], - 'SwishResults::getRemovedStopwords' => ['array', 'index_name'=>'string'], - 'SwishResults::nextResult' => ['object'], - 'SwishResults::seekResult' => ['int', 'position'=>'int'], - 'SwishSearch::execute' => ['object', 'query='=>'string'], - 'SwishSearch::resetLimit' => [''], - 'SwishSearch::setLimit' => ['', 'property'=>'string', 'low'=>'string', 'high'=>'string'], - 'SwishSearch::setPhraseDelimiter' => ['', 'delimiter'=>'string'], - 'SwishSearch::setSort' => ['', 'sort'=>'string'], - 'SwishSearch::setStructure' => ['', 'structure'=>'int'], - 'SyncEvent::__construct' => ['void', 'name='=>'string', 'manual='=>'bool'], - 'SyncEvent::fire' => ['bool'], - 'SyncEvent::reset' => ['bool'], - 'SyncEvent::wait' => ['bool', 'wait='=>'int'], - 'SyncMutex::__construct' => ['void', 'name='=>'string'], - 'SyncMutex::lock' => ['bool', 'wait='=>'int'], - 'SyncMutex::unlock' => ['bool', 'all='=>'bool'], - 'SyncReaderWriter::__construct' => ['void', 'name='=>'string', 'autounlock='=>'bool'], - 'SyncReaderWriter::readlock' => ['bool', 'wait='=>'int'], - 'SyncReaderWriter::readunlock' => ['bool'], - 'SyncReaderWriter::writelock' => ['bool', 'wait='=>'int'], - 'SyncReaderWriter::writeunlock' => ['bool'], - 'SyncSemaphore::__construct' => ['void', 'name='=>'string', 'initialval='=>'int', 'autounlock='=>'bool'], - 'SyncSemaphore::lock' => ['bool', 'wait='=>'int'], - 'SyncSemaphore::unlock' => ['bool', '&w_prevcount='=>'int'], - 'SyncSharedMemory::__construct' => ['void', 'name'=>'string', 'size'=>'int'], - 'SyncSharedMemory::first' => ['bool'], - 'SyncSharedMemory::read' => ['string', 'start='=>'int', 'length='=>'int'], - 'SyncSharedMemory::size' => ['int'], - 'SyncSharedMemory::write' => ['int', 'string='=>'string', 'start='=>'int'], - 'Thread::__construct' => ['void'], - 'Thread::addRef' => ['void'], - 'Thread::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], - 'Thread::count' => ['int'], - 'Thread::delRef' => ['void'], - 'Thread::detach' => ['void'], - 'Thread::extend' => ['bool', 'class'=>'string'], - 'Thread::getCreatorId' => ['int'], - 'Thread::getCurrentThread' => ['Thread'], - 'Thread::getCurrentThreadId' => ['int'], - 'Thread::getRefCount' => ['int'], - 'Thread::getTerminationInfo' => ['array'], - 'Thread::getThreadId' => ['int'], - 'Thread::globally' => ['mixed'], - 'Thread::isGarbage' => ['bool'], - 'Thread::isJoined' => ['bool'], - 'Thread::isRunning' => ['bool'], - 'Thread::isStarted' => ['bool'], - 'Thread::isTerminated' => ['bool'], - 'Thread::isWaiting' => ['bool'], - 'Thread::join' => ['bool'], - 'Thread::kill' => ['void'], - 'Thread::lock' => ['bool'], - 'Thread::merge' => ['bool', 'from'=>'', 'overwrite='=>'mixed'], - 'Thread::notify' => ['bool'], - 'Thread::notifyOne' => ['bool'], - 'Thread::offsetExists' => ['bool', 'offset'=>'mixed'], - 'Thread::offsetGet' => ['mixed', 'offset'=>'mixed'], - 'Thread::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], - 'Thread::offsetUnset' => ['void', 'offset'=>'mixed'], - 'Thread::pop' => ['bool'], - 'Thread::run' => ['void'], - 'Thread::setGarbage' => ['void'], - 'Thread::shift' => ['bool'], - 'Thread::start' => ['bool', 'options='=>'int'], - 'Thread::synchronized' => ['mixed', 'block'=>'Closure', '_='=>'mixed'], - 'Thread::unlock' => ['bool'], - 'Thread::wait' => ['bool', 'timeout='=>'int'], - 'Threaded::__construct' => ['void'], - 'Threaded::addRef' => ['void'], - 'Threaded::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], - 'Threaded::count' => ['int'], - 'Threaded::delRef' => ['void'], - 'Threaded::extend' => ['bool', 'class'=>'string'], - 'Threaded::from' => ['Threaded', 'run'=>'Closure', 'construct='=>'Closure', 'args='=>'array'], - 'Threaded::getRefCount' => ['int'], - 'Threaded::getTerminationInfo' => ['array'], - 'Threaded::isGarbage' => ['bool'], - 'Threaded::isRunning' => ['bool'], - 'Threaded::isTerminated' => ['bool'], - 'Threaded::isWaiting' => ['bool'], - 'Threaded::lock' => ['bool'], - 'Threaded::merge' => ['bool', 'from'=>'mixed', 'overwrite='=>'bool'], - 'Threaded::notify' => ['bool'], - 'Threaded::notifyOne' => ['bool'], - 'Threaded::offsetExists' => ['bool', 'offset'=>'mixed'], - 'Threaded::offsetGet' => ['mixed', 'offset'=>'mixed'], - 'Threaded::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], - 'Threaded::offsetUnset' => ['void', 'offset'=>'mixed'], - 'Threaded::pop' => ['bool'], - 'Threaded::run' => ['void'], - 'Threaded::setGarbage' => ['void'], - 'Threaded::shift' => ['mixed'], - 'Threaded::synchronized' => ['mixed', 'block'=>'Closure', '...args='=>'mixed'], - 'Threaded::unlock' => ['bool'], - 'Threaded::wait' => ['bool', 'timeout='=>'int'], - 'Throwable::__toString' => ['string'], - 'Throwable::getCode' => ['int|string'], - 'Throwable::getFile' => ['string'], - 'Throwable::getLine' => ['int'], - 'Throwable::getMessage' => ['string'], - 'Throwable::getPrevious' => ['?Throwable'], - 'Throwable::getTrace' => ['list\',args?:array}>'], - 'Throwable::getTraceAsString' => ['string'], - 'TokyoTyrant::__construct' => ['void', 'host='=>'string', 'port='=>'int', 'options='=>'array'], - 'TokyoTyrant::add' => ['int|float', 'key'=>'string', 'increment'=>'float', 'type='=>'int'], - 'TokyoTyrant::connect' => ['TokyoTyrant', 'host'=>'string', 'port='=>'int', 'options='=>'array'], - 'TokyoTyrant::connectUri' => ['TokyoTyrant', 'uri'=>'string'], - 'TokyoTyrant::copy' => ['TokyoTyrant', 'path'=>'string'], - 'TokyoTyrant::ext' => ['string', 'name'=>'string', 'options'=>'int', 'key'=>'string', 'value'=>'string'], - 'TokyoTyrant::fwmKeys' => ['array', 'prefix'=>'string', 'max_recs'=>'int'], - 'TokyoTyrant::get' => ['array', 'keys'=>'mixed'], - 'TokyoTyrant::getIterator' => ['TokyoTyrantIterator'], - 'TokyoTyrant::num' => ['int'], - 'TokyoTyrant::out' => ['string', 'keys'=>'mixed'], - 'TokyoTyrant::put' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], - 'TokyoTyrant::putCat' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], - 'TokyoTyrant::putKeep' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], - 'TokyoTyrant::putNr' => ['TokyoTyrant', 'keys'=>'mixed', 'value='=>'string'], - 'TokyoTyrant::putShl' => ['mixed', 'key'=>'string', 'value'=>'string', 'width'=>'int'], - 'TokyoTyrant::restore' => ['mixed', 'log_dir'=>'string', 'timestamp'=>'int', 'check_consistency='=>'bool'], - 'TokyoTyrant::setMaster' => ['mixed', 'host'=>'string', 'port'=>'int', 'timestamp'=>'int', 'check_consistency='=>'bool'], - 'TokyoTyrant::size' => ['int', 'key'=>'string'], - 'TokyoTyrant::stat' => ['array'], - 'TokyoTyrant::sync' => ['mixed'], - 'TokyoTyrant::tune' => ['TokyoTyrant', 'timeout'=>'float', 'options='=>'int'], - 'TokyoTyrant::vanish' => ['mixed'], - 'TokyoTyrantIterator::__construct' => ['void', 'object'=>'mixed'], - 'TokyoTyrantIterator::current' => ['mixed'], - 'TokyoTyrantIterator::key' => ['mixed'], - 'TokyoTyrantIterator::next' => ['mixed'], - 'TokyoTyrantIterator::rewind' => ['void'], - 'TokyoTyrantIterator::valid' => ['bool'], - 'TokyoTyrantQuery::__construct' => ['void', 'table'=>'TokyoTyrantTable'], - 'TokyoTyrantQuery::addCond' => ['mixed', 'name'=>'string', 'op'=>'int', 'expr'=>'string'], - 'TokyoTyrantQuery::count' => ['int'], - 'TokyoTyrantQuery::current' => ['array'], - 'TokyoTyrantQuery::hint' => ['string'], - 'TokyoTyrantQuery::key' => ['string'], - 'TokyoTyrantQuery::metaSearch' => ['array', 'queries'=>'array', 'type'=>'int'], - 'TokyoTyrantQuery::next' => ['array'], - 'TokyoTyrantQuery::out' => ['TokyoTyrantQuery'], - 'TokyoTyrantQuery::rewind' => ['bool'], - 'TokyoTyrantQuery::search' => ['array'], - 'TokyoTyrantQuery::setLimit' => ['mixed', 'max='=>'int', 'skip='=>'int'], - 'TokyoTyrantQuery::setOrder' => ['mixed', 'name'=>'string', 'type'=>'int'], - 'TokyoTyrantQuery::valid' => ['bool'], - 'TokyoTyrantTable::add' => ['void', 'key'=>'string', 'increment'=>'mixed', 'type='=>'string'], - 'TokyoTyrantTable::genUid' => ['int'], - 'TokyoTyrantTable::get' => ['array', 'keys'=>'mixed'], - 'TokyoTyrantTable::getIterator' => ['TokyoTyrantIterator'], - 'TokyoTyrantTable::getQuery' => ['TokyoTyrantQuery'], - 'TokyoTyrantTable::out' => ['void', 'keys'=>'mixed'], - 'TokyoTyrantTable::put' => ['int', 'key'=>'string', 'columns'=>'array'], - 'TokyoTyrantTable::putCat' => ['void', 'key'=>'string', 'columns'=>'array'], - 'TokyoTyrantTable::putKeep' => ['void', 'key'=>'string', 'columns'=>'array'], - 'TokyoTyrantTable::putNr' => ['void', 'keys'=>'mixed', 'value='=>'string'], - 'TokyoTyrantTable::putShl' => ['void', 'key'=>'string', 'value'=>'string', 'width'=>'int'], - 'TokyoTyrantTable::setIndex' => ['mixed', 'column'=>'string', 'type'=>'int'], - 'Transliterator::create' => ['?Transliterator', 'id'=>'string', 'direction='=>'int'], - 'Transliterator::createFromRules' => ['?Transliterator', 'rules'=>'string', 'direction='=>'int'], - 'Transliterator::createInverse' => ['Transliterator'], - 'Transliterator::getErrorCode' => ['int'], - 'Transliterator::getErrorMessage' => ['string'], - 'Transliterator::listIDs' => ['array'], - 'Transliterator::transliterate' => ['string|false', 'subject'=>'string', 'start='=>'int', 'end='=>'int'], - 'TypeError::__clone' => ['void'], - 'TypeError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?TypeError'], - 'TypeError::__toString' => ['string'], - 'TypeError::getCode' => ['int'], - 'TypeError::getFile' => ['string'], - 'TypeError::getLine' => ['int'], - 'TypeError::getMessage' => ['string'], - 'TypeError::getPrevious' => ['Throwable|TypeError|null'], - 'TypeError::getTrace' => ['list\',args?:array}>'], - 'TypeError::getTraceAsString' => ['string'], - 'UConverter::__construct' => ['void', 'destination_encoding='=>'string', 'source_encoding='=>'string'], - 'UConverter::convert' => ['string', 'string'=>'string', 'reverse='=>'bool'], - 'UConverter::fromUCallback' => ['mixed', 'reason'=>'int', 'source'=>'string', 'codePoint'=>'string', '&w_error'=>'int'], - 'UConverter::getAliases' => ['array', 'name'=>'string'], - 'UConverter::getAvailable' => ['array'], - 'UConverter::getDestinationEncoding' => ['string'], - 'UConverter::getDestinationType' => ['int'], - 'UConverter::getErrorCode' => ['int'], - 'UConverter::getErrorMessage' => ['string'], - 'UConverter::getSourceEncoding' => ['string'], - 'UConverter::getSourceType' => ['int'], - 'UConverter::getStandards' => ['array'], - 'UConverter::getSubstChars' => ['string'], - 'UConverter::reasonText' => ['string', 'reason='=>'int'], - 'UConverter::setDestinationEncoding' => ['bool', 'encoding'=>'string'], - 'UConverter::setSourceEncoding' => ['bool', 'encoding'=>'string'], - 'UConverter::setSubstChars' => ['bool', 'chars'=>'string'], - 'UConverter::toUCallback' => ['mixed', 'reason'=>'int', 'source'=>'string', 'codeUnits'=>'string', '&w_error'=>'int'], - 'UConverter::transcode' => ['string', 'string'=>'string', 'toEncoding'=>'string', 'fromEncoding'=>'string', 'options='=>'?array'], - 'UnderflowException::__clone' => ['void'], - 'UnderflowException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?UnderflowException'], - 'UnderflowException::__toString' => ['string'], - 'UnderflowException::getCode' => ['int'], - 'UnderflowException::getFile' => ['string'], - 'UnderflowException::getLine' => ['int'], - 'UnderflowException::getMessage' => ['string'], - 'UnderflowException::getPrevious' => ['Throwable|UnderflowException|null'], - 'UnderflowException::getTrace' => ['list\',args?:array}>'], - 'UnderflowException::getTraceAsString' => ['string'], - 'UnexpectedValueException::__clone' => ['void'], - 'UnexpectedValueException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?UnexpectedValueException'], - 'UnexpectedValueException::__toString' => ['string'], - 'UnexpectedValueException::getCode' => ['int'], - 'UnexpectedValueException::getFile' => ['string'], - 'UnexpectedValueException::getLine' => ['int'], - 'UnexpectedValueException::getMessage' => ['string'], - 'UnexpectedValueException::getPrevious' => ['Throwable|UnexpectedValueException|null'], - 'UnexpectedValueException::getTrace' => ['list\',args?:array}>'], - 'UnexpectedValueException::getTraceAsString' => ['string'], - 'V8Js::__construct' => ['void', 'object_name='=>'string', 'variables='=>'array', 'extensions='=>'array', 'report_uncaught_exceptions='=>'bool', 'snapshot_blob='=>'string'], - 'V8Js::clearPendingException' => [''], - 'V8Js::compileString' => ['resource', 'script'=>'', 'identifier='=>'string'], - 'V8Js::createSnapshot' => ['false|string', 'embed_source'=>'string'], - 'V8Js::executeScript' => ['', 'script'=>'resource', 'flags='=>'int', 'time_limit='=>'int', 'memory_limit='=>'int'], - 'V8Js::executeString' => ['mixed', 'script'=>'string', 'identifier='=>'string', 'flags='=>'int'], - 'V8Js::getExtensions' => ['string[]'], - 'V8Js::getPendingException' => ['?V8JsException'], - 'V8Js::registerExtension' => ['bool', 'extension_name'=>'string', 'script'=>'string', 'dependencies='=>'array', 'auto_enable='=>'bool'], - 'V8Js::setAverageObjectSize' => ['', 'average_object_size'=>'int'], - 'V8Js::setMemoryLimit' => ['', 'limit'=>'int'], - 'V8Js::setModuleLoader' => ['', 'loader'=>'callable'], - 'V8Js::setModuleNormaliser' => ['', 'normaliser'=>'callable'], - 'V8Js::setTimeLimit' => ['', 'limit'=>'int'], - 'V8JsException::getJsFileName' => ['string'], - 'V8JsException::getJsLineNumber' => ['int'], - 'V8JsException::getJsSourceLine' => ['int'], - 'V8JsException::getJsTrace' => ['string'], - 'V8JsScriptException::__clone' => ['void'], - 'V8JsScriptException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'V8JsScriptException::__toString' => ['string'], - 'V8JsScriptException::__wakeup' => ['void'], - 'V8JsScriptException::getCode' => ['int'], - 'V8JsScriptException::getFile' => ['string'], - 'V8JsScriptException::getJsEndColumn' => ['int'], - 'V8JsScriptException::getJsFileName' => ['string'], - 'V8JsScriptException::getJsLineNumber' => ['int'], - 'V8JsScriptException::getJsSourceLine' => ['string'], - 'V8JsScriptException::getJsStartColumn' => ['int'], - 'V8JsScriptException::getJsTrace' => ['string'], - 'V8JsScriptException::getLine' => ['int'], - 'V8JsScriptException::getMessage' => ['string'], - 'V8JsScriptException::getPrevious' => ['Exception|Throwable'], - 'V8JsScriptException::getTrace' => ['list\',args?:array}>'], - 'V8JsScriptException::getTraceAsString' => ['string'], - 'VARIANT::__construct' => ['void', 'value='=>'mixed', 'type='=>'int', 'codepage='=>'int'], - 'VarnishAdmin::__construct' => ['void', 'args='=>'array'], - 'VarnishAdmin::auth' => ['bool'], - 'VarnishAdmin::ban' => ['int', 'vcl_regex'=>'string'], - 'VarnishAdmin::banUrl' => ['int', 'vcl_regex'=>'string'], - 'VarnishAdmin::clearPanic' => ['int'], - 'VarnishAdmin::connect' => ['bool'], - 'VarnishAdmin::disconnect' => ['bool'], - 'VarnishAdmin::getPanic' => ['string'], - 'VarnishAdmin::getParams' => ['array'], - 'VarnishAdmin::isRunning' => ['bool'], - 'VarnishAdmin::setCompat' => ['void', 'compat'=>'int'], - 'VarnishAdmin::setHost' => ['void', 'host'=>'string'], - 'VarnishAdmin::setIdent' => ['void', 'ident'=>'string'], - 'VarnishAdmin::setParam' => ['int', 'name'=>'string', 'value'=>'string|int'], - 'VarnishAdmin::setPort' => ['void', 'port'=>'int'], - 'VarnishAdmin::setSecret' => ['void', 'secret'=>'string'], - 'VarnishAdmin::setTimeout' => ['void', 'timeout'=>'int'], - 'VarnishAdmin::start' => ['int'], - 'VarnishAdmin::stop' => ['int'], - 'VarnishLog::__construct' => ['void', 'args='=>'array'], - 'VarnishLog::getLine' => ['array'], - 'VarnishLog::getTagName' => ['string', 'index'=>'int'], - 'VarnishStat::__construct' => ['void', 'args='=>'array'], - 'VarnishStat::getSnapshot' => ['array'], - 'Vtiful\Kernel\Chart::__construct' => ['void', 'handle'=>'resource', 'type'=>'int'], - 'Vtiful\Kernel\Chart::axisNameX' => ['Vtiful\Kernel\Chart', 'name'=>'string'], - 'Vtiful\Kernel\Chart::axisNameY' => ['Vtiful\Kernel\Chart', 'name'=>'string'], - 'Vtiful\Kernel\Chart::legendSetPosition' => ['Vtiful\Kernel\Chart', 'type'=>'int'], - 'Vtiful\Kernel\Chart::series' => ['Vtiful\Kernel\Chart', 'value'=>'string', 'categories='=>'string'], - 'Vtiful\Kernel\Chart::seriesName' => ['Vtiful\Kernel\Chart', 'value'=>'string'], - 'Vtiful\Kernel\Chart::style' => ['Vtiful\Kernel\Chart', 'style'=>'int'], - 'Vtiful\Kernel\Chart::title' => ['Vtiful\Kernel\Chart', 'title'=>'string'], - 'Vtiful\Kernel\Chart::toResource' => ['resource'], - 'Vtiful\Kernel\Excel::__construct' => ['void', 'config'=>'array'], - 'Vtiful\Kernel\Excel::activateSheet' => ['bool', 'sheet_name'=>'string'], - 'Vtiful\Kernel\Excel::addSheet' => ['Vtiful\Kernel\Excel', 'sheet_name='=>'?string'], - 'Vtiful\Kernel\Excel::autoFilter' => ['Vtiful\Kernel\Excel', 'range'=>'string'], - 'Vtiful\Kernel\Excel::checkoutSheet' => ['Vtiful\Kernel\Excel', 'sheet_name'=>'string'], - 'Vtiful\Kernel\Excel::close' => ['Vtiful\Kernel\Excel'], - 'Vtiful\Kernel\Excel::columnIndexFromString' => ['int', 'index'=>'string'], - 'Vtiful\Kernel\Excel::constMemory' => ['Vtiful\Kernel\Excel', 'file_name'=>'string', 'sheet_name='=>'?string'], - 'Vtiful\Kernel\Excel::data' => ['Vtiful\Kernel\Excel', 'data'=>'array'], - 'Vtiful\Kernel\Excel::defaultFormat' => ['Vtiful\Kernel\Excel', 'format_handle'=>'resource'], - 'Vtiful\Kernel\Excel::existSheet' => ['bool', 'sheet_name'=>'string'], - 'Vtiful\Kernel\Excel::fileName' => ['Vtiful\Kernel\Excel', 'file_name'=>'string', 'sheet_name='=>'?string'], - 'Vtiful\Kernel\Excel::freezePanes' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int'], - 'Vtiful\Kernel\Excel::getHandle' => ['resource'], - 'Vtiful\Kernel\Excel::getSheetData' => ['array|false'], - 'Vtiful\Kernel\Excel::gridline' => ['Vtiful\Kernel\Excel', 'option='=>'int'], - 'Vtiful\Kernel\Excel::header' => ['Vtiful\Kernel\Excel', 'header'=>'array', 'format_handle='=>'?resource'], - 'Vtiful\Kernel\Excel::insertChart' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'chart_resource'=>'resource'], - 'Vtiful\Kernel\Excel::insertComment' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'comment'=>'string'], - 'Vtiful\Kernel\Excel::insertDate' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'timestamp'=>'int', 'format='=>'?string', 'format_handle='=>'?resource'], - 'Vtiful\Kernel\Excel::insertFormula' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'formula'=>'string', 'format_handle='=>'?resource'], - 'Vtiful\Kernel\Excel::insertImage' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'image'=>'string', 'width='=>'?float', 'height='=>'?float'], - 'Vtiful\Kernel\Excel::insertText' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'data'=>'int|string|double', 'format='=>'?string', 'format_handle='=>'?resource'], - 'Vtiful\Kernel\Excel::insertUrl' => ['Vtiful\Kernel\Excel', 'row'=>'int', 'column'=>'int', 'url'=>'string', 'text='=>'?string', 'tool_tip='=>'?string', 'format='=>'?resource'], - 'Vtiful\Kernel\Excel::mergeCells' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'data'=>'string', 'format_handle='=>'?resource'], - 'Vtiful\Kernel\Excel::nextCellCallback' => ['void', 'fci'=>'callable(int,int,mixed)', 'sheet_name='=>'?string'], - 'Vtiful\Kernel\Excel::nextRow' => ['array|false', 'zv_type_t='=>'?array'], - 'Vtiful\Kernel\Excel::openFile' => ['Vtiful\Kernel\Excel', 'zs_file_name'=>'string'], - 'Vtiful\Kernel\Excel::openSheet' => ['Vtiful\Kernel\Excel', 'zs_sheet_name='=>'?string', 'zl_flag='=>'?int'], - 'Vtiful\Kernel\Excel::output' => ['string'], - 'Vtiful\Kernel\Excel::protection' => ['Vtiful\Kernel\Excel', 'password='=>'?string'], - 'Vtiful\Kernel\Excel::putCSV' => ['bool', 'fp'=>'resource', 'delimiter_str='=>'?string', 'enclosure_str='=>'?string', 'escape_str='=>'?string'], - 'Vtiful\Kernel\Excel::putCSVCallback' => ['bool', 'callback'=>'callable(array):array', 'fp'=>'resource', 'delimiter_str='=>'?string', 'enclosure_str='=>'?string', 'escape_str='=>'?string'], - 'Vtiful\Kernel\Excel::setColumn' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'width'=>'float', 'format_handle='=>'?resource'], - 'Vtiful\Kernel\Excel::setCurrentSheetHide' => ['Vtiful\Kernel\Excel'], - 'Vtiful\Kernel\Excel::setCurrentSheetIsFirst' => ['Vtiful\Kernel\Excel'], - 'Vtiful\Kernel\Excel::setGlobalType' => ['Vtiful\Kernel\Excel', 'zv_type_t'=>'int'], - 'Vtiful\Kernel\Excel::setLandscape' => ['Vtiful\Kernel\Excel'], - 'Vtiful\Kernel\Excel::setMargins' => ['Vtiful\Kernel\Excel', 'left='=>'?float', 'right='=>'?float', 'top='=>'?float', 'bottom='=>'?float'], - 'Vtiful\Kernel\Excel::setPaper' => ['Vtiful\Kernel\Excel', 'paper'=>'int'], - 'Vtiful\Kernel\Excel::setPortrait' => ['Vtiful\Kernel\Excel'], - 'Vtiful\Kernel\Excel::setRow' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'height'=>'float', 'format_handle='=>'?resource'], - 'Vtiful\Kernel\Excel::setSkipRows' => ['Vtiful\Kernel\Excel', 'zv_skip_t'=>'int'], - 'Vtiful\Kernel\Excel::setType' => ['Vtiful\Kernel\Excel', 'zv_type_t'=>'array'], - 'Vtiful\Kernel\Excel::sheetList' => ['array'], - 'Vtiful\Kernel\Excel::showComment' => ['Vtiful\Kernel\Excel'], - 'Vtiful\Kernel\Excel::stringFromColumnIndex' => ['string', 'index'=>'int'], - 'Vtiful\Kernel\Excel::timestampFromDateDouble' => ['int', 'index'=>'?float'], - 'Vtiful\Kernel\Excel::validation' => ['Vtiful\Kernel\Excel', 'range'=>'string', 'validation_resource'=>'resource'], - 'Vtiful\Kernel\Excel::zoom' => ['Vtiful\Kernel\Excel', 'scale'=>'int'], - 'Vtiful\Kernel\Format::__construct' => ['void', 'handle'=>'resource'], - 'Vtiful\Kernel\Format::align' => ['Vtiful\Kernel\Format', '...style'=>'int'], - 'Vtiful\Kernel\Format::background' => ['Vtiful\Kernel\Format', 'color'=>'int', 'pattern='=>'int'], - 'Vtiful\Kernel\Format::bold' => ['Vtiful\Kernel\Format'], - 'Vtiful\Kernel\Format::border' => ['Vtiful\Kernel\Format', 'style'=>'int'], - 'Vtiful\Kernel\Format::font' => ['Vtiful\Kernel\Format', 'font'=>'string'], - 'Vtiful\Kernel\Format::fontColor' => ['Vtiful\Kernel\Format', 'color'=>'int'], - 'Vtiful\Kernel\Format::fontSize' => ['Vtiful\Kernel\Format', 'size'=>'float'], - 'Vtiful\Kernel\Format::italic' => ['Vtiful\Kernel\Format'], - 'Vtiful\Kernel\Format::number' => ['Vtiful\Kernel\Format', 'format'=>'string'], - 'Vtiful\Kernel\Format::strikeout' => ['Vtiful\Kernel\Format'], - 'Vtiful\Kernel\Format::toResource' => ['resource'], - 'Vtiful\Kernel\Format::underline' => ['Vtiful\Kernel\Format', 'style'=>'int'], - 'Vtiful\Kernel\Format::unlocked' => ['Vtiful\Kernel\Format'], - 'Vtiful\Kernel\Format::wrap' => ['Vtiful\Kernel\Format'], - 'Vtiful\Kernel\Validation::__construct' => ['void'], - 'Vtiful\Kernel\Validation::criteriaType' => ['?Vtiful\Kernel\Validation', 'type'=>'int'], - 'Vtiful\Kernel\Validation::maximumFormula' => ['?Vtiful\Kernel\Validation', 'maximum_formula'=>'string'], - 'Vtiful\Kernel\Validation::maximumNumber' => ['?Vtiful\Kernel\Validation', 'maximum_number'=>'float'], - 'Vtiful\Kernel\Validation::minimumFormula' => ['?Vtiful\Kernel\Validation', 'minimum_formula'=>'string'], - 'Vtiful\Kernel\Validation::minimumNumber' => ['?Vtiful\Kernel\Validation', 'minimum_number'=>'float'], - 'Vtiful\Kernel\Validation::toResource' => ['resource'], - 'Vtiful\Kernel\Validation::validationType' => ['?Vtiful\Kernel\Validation', 'type'=>'int'], - 'Vtiful\Kernel\Validation::valueList' => ['?Vtiful\Kernel\Validation', 'value_list'=>'array'], - 'Vtiful\Kernel\Validation::valueNumber' => ['?Vtiful\Kernel\Validation', 'value_number'=>'int'], - 'WeakMap::__construct' => ['void'], - 'WeakMap::count' => ['int'], - 'WeakMap::current' => ['mixed'], - 'WeakMap::key' => ['object'], - 'WeakMap::next' => ['void'], - 'WeakMap::offsetExists' => ['bool', 'object'=>'object'], - 'WeakMap::offsetGet' => ['mixed', 'object'=>'object'], - 'WeakMap::offsetSet' => ['void', 'object'=>'object', 'value'=>'mixed'], - 'WeakMap::offsetUnset' => ['void', 'object'=>'object'], - 'WeakMap::rewind' => ['void'], - 'WeakMap::valid' => ['bool'], - 'Weakref::acquire' => ['bool'], - 'Weakref::get' => ['object'], - 'Weakref::release' => ['bool'], - 'Weakref::valid' => ['bool'], - 'Worker::__construct' => ['void'], - 'Worker::addRef' => ['void'], - 'Worker::chunk' => ['array', 'size'=>'int', 'preserve'=>'bool'], - 'Worker::collect' => ['int', 'collector='=>'Callable'], - 'Worker::count' => ['int'], - 'Worker::delRef' => ['void'], - 'Worker::detach' => ['void'], - 'Worker::extend' => ['bool', 'class'=>'string'], - 'Worker::getCreatorId' => ['int'], - 'Worker::getCurrentThread' => ['Thread'], - 'Worker::getCurrentThreadId' => ['int'], - 'Worker::getRefCount' => ['int'], - 'Worker::getStacked' => ['int'], - 'Worker::getTerminationInfo' => ['array'], - 'Worker::getThreadId' => ['int'], - 'Worker::globally' => ['mixed'], - 'Worker::isGarbage' => ['bool'], - 'Worker::isJoined' => ['bool'], - 'Worker::isRunning' => ['bool'], - 'Worker::isShutdown' => ['bool'], - 'Worker::isStarted' => ['bool'], - 'Worker::isTerminated' => ['bool'], - 'Worker::isWaiting' => ['bool'], - 'Worker::isWorking' => ['bool'], - 'Worker::join' => ['bool'], - 'Worker::kill' => ['bool'], - 'Worker::lock' => ['bool'], - 'Worker::merge' => ['bool', 'from'=>'', 'overwrite='=>'mixed'], - 'Worker::notify' => ['bool'], - 'Worker::notifyOne' => ['bool'], - 'Worker::offsetExists' => ['bool', 'offset'=>'mixed'], - 'Worker::offsetGet' => ['mixed', 'offset'=>'mixed'], - 'Worker::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], - 'Worker::offsetUnset' => ['void', 'offset'=>'mixed'], - 'Worker::pop' => ['bool'], - 'Worker::run' => ['void'], - 'Worker::setGarbage' => ['void'], - 'Worker::shift' => ['bool'], - 'Worker::shutdown' => ['bool'], - 'Worker::stack' => ['int', '&rw_work'=>'Threaded'], - 'Worker::start' => ['bool', 'options='=>'int'], - 'Worker::synchronized' => ['mixed', 'block'=>'Closure', '_='=>'mixed'], - 'Worker::unlock' => ['bool'], - 'Worker::unstack' => ['int', '&rw_work='=>'Threaded'], - 'Worker::wait' => ['bool', 'timeout='=>'int'], - 'XMLDiff\Base::__construct' => ['void', 'nsname'=>'string'], - 'XMLDiff\Base::diff' => ['mixed', 'from'=>'mixed', 'to'=>'mixed'], - 'XMLDiff\Base::merge' => ['mixed', 'src'=>'mixed', 'diff'=>'mixed'], - 'XMLDiff\DOM::diff' => ['DOMDocument', 'from'=>'DOMDocument', 'to'=>'DOMDocument'], - 'XMLDiff\DOM::merge' => ['DOMDocument', 'src'=>'DOMDocument', 'diff'=>'DOMDocument'], - 'XMLDiff\File::diff' => ['string', 'from'=>'string', 'to'=>'string'], - 'XMLDiff\File::merge' => ['string', 'src'=>'string', 'diff'=>'string'], - 'XMLDiff\Memory::diff' => ['string', 'from'=>'string', 'to'=>'string'], - 'XMLDiff\Memory::merge' => ['string', 'src'=>'string', 'diff'=>'string'], - 'XMLReader::XML' => ['bool', 'source'=>'string', 'encoding='=>'?string', 'options='=>'int'], - 'XMLReader::close' => ['bool'], - 'XMLReader::expand' => ['DOMNode|false', 'basenode='=>'DOMNode'], - 'XMLReader::getAttribute' => ['?string', 'name'=>'string'], - 'XMLReader::getAttributeNo' => ['?string', 'index'=>'int'], - 'XMLReader::getAttributeNs' => ['?string', 'name'=>'string', 'namespaceuri'=>'string'], - 'XMLReader::getParserProperty' => ['bool', 'property'=>'int'], - 'XMLReader::isValid' => ['bool'], - 'XMLReader::lookupNamespace' => ['?string', 'prefix'=>'string'], - 'XMLReader::moveToAttribute' => ['bool', 'name'=>'string'], - 'XMLReader::moveToAttributeNo' => ['bool', 'index'=>'int'], - 'XMLReader::moveToAttributeNs' => ['bool', 'localname'=>'string', 'namespaceuri'=>'string'], - 'XMLReader::moveToElement' => ['bool'], - 'XMLReader::moveToFirstAttribute' => ['bool'], - 'XMLReader::moveToNextAttribute' => ['bool'], - 'XMLReader::next' => ['bool', 'localname='=>'string'], - 'XMLReader::open' => ['bool', 'uri'=>'string', 'encoding='=>'?string', 'options='=>'int'], - 'XMLReader::read' => ['bool'], - 'XMLReader::readInnerXML' => ['string'], - 'XMLReader::readOuterXML' => ['string'], - 'XMLReader::readString' => ['string'], - 'XMLReader::setParserProperty' => ['bool', 'property'=>'int', 'value'=>'bool'], - 'XMLReader::setRelaxNGSchema' => ['bool', 'filename'=>'string'], - 'XMLReader::setRelaxNGSchemaSource' => ['bool', 'source'=>'string'], - 'XMLReader::setSchema' => ['bool', 'filename'=>'string'], - 'XMLWriter::endAttribute' => ['bool'], - 'XMLWriter::endCdata' => ['bool'], - 'XMLWriter::endComment' => ['bool'], - 'XMLWriter::endDocument' => ['bool'], - 'XMLWriter::endDtd' => ['bool'], - 'XMLWriter::endDtdAttlist' => ['bool'], - 'XMLWriter::endDtdElement' => ['bool'], - 'XMLWriter::endDtdEntity' => ['bool'], - 'XMLWriter::endElement' => ['bool'], - 'XMLWriter::endPi' => ['bool'], - 'XMLWriter::flush' => ['string|int|false', 'empty='=>'bool'], - 'XMLWriter::fullEndElement' => ['bool'], - 'XMLWriter::openMemory' => ['bool'], - 'XMLWriter::openUri' => ['bool', 'uri'=>'string'], - 'XMLWriter::outputMemory' => ['string', 'flush='=>'bool'], - 'XMLWriter::setIndent' => ['bool', 'enable'=>'bool'], - 'XMLWriter::setIndentString' => ['bool', 'indentation'=>'string'], - 'XMLWriter::startAttribute' => ['bool', 'name'=>'string'], - 'XMLWriter::startAttributeNs' => ['bool', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string'], - 'XMLWriter::startCdata' => ['bool'], - 'XMLWriter::startComment' => ['bool'], - 'XMLWriter::startDocument' => ['bool', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], - 'XMLWriter::startDtd' => ['bool', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], - 'XMLWriter::startDtdAttlist' => ['bool', 'name'=>'string'], - 'XMLWriter::startDtdElement' => ['bool', 'qualifiedName'=>'string'], - 'XMLWriter::startDtdEntity' => ['bool', 'name'=>'string', 'isParam'=>'bool'], - 'XMLWriter::startElement' => ['bool', 'name'=>'string'], - 'XMLWriter::startElementNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], - 'XMLWriter::startPi' => ['bool', 'target'=>'string'], - 'XMLWriter::text' => ['bool', 'content'=>'string'], - 'XMLWriter::writeAttribute' => ['bool', 'name'=>'string', 'value'=>'string'], - 'XMLWriter::writeAttributeNs' => ['bool', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], - 'XMLWriter::writeCdata' => ['bool', 'content'=>'string'], - 'XMLWriter::writeComment' => ['bool', 'content'=>'string'], - 'XMLWriter::writeDtd' => ['bool', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], - 'XMLWriter::writeDtdAttlist' => ['bool', 'name'=>'string', 'content'=>'string'], - 'XMLWriter::writeDtdElement' => ['bool', 'name'=>'string', 'content'=>'string'], - 'XMLWriter::writeDtdEntity' => ['bool', 'name'=>'string', 'content'=>'string', 'isParam'=>'bool', 'publicId'=>'string', 'systemId'=>'string', 'notationData'=>'string'], - 'XMLWriter::writeElement' => ['bool', 'name'=>'string', 'content='=>'?string'], - 'XMLWriter::writeElementNs' => ['bool', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string', 'content='=>'?string'], - 'XMLWriter::writePi' => ['bool', 'target'=>'string', 'content'=>'string'], - 'XMLWriter::writeRaw' => ['bool', 'content'=>'string'], - 'XSLTProcessor::getParameter' => ['string|false', 'namespace'=>'string', 'name'=>'string'], - 'XSLTProcessor::hasExsltSupport' => ['bool'], - 'XSLTProcessor::importStylesheet' => ['bool', 'stylesheet'=>'object'], - 'XSLTProcessor::registerPHPFunctions' => ['void', 'functions='=>'mixed'], - 'XSLTProcessor::removeParameter' => ['bool', 'namespace'=>'string', 'name'=>'string'], - 'XSLTProcessor::setParameter' => ['bool', 'namespace'=>'string', 'name'=>'string', 'value'=>'string'], - 'XSLTProcessor::setParameter\'1' => ['bool', 'namespace'=>'string', 'options'=>'array'], - 'XSLTProcessor::setProfiling' => ['bool', 'filename'=>'string'], - 'XSLTProcessor::transformToDoc' => ['DOMDocument|false', 'document'=>'DOMNode'], - 'XSLTProcessor::transformToURI' => ['int', 'document'=>'DOMDocument', 'uri'=>'string'], - 'XSLTProcessor::transformToXML' => ['string|false', 'document'=>'DOMDocument'], - 'Xcom::__construct' => ['void', 'fabric_url='=>'string', 'fabric_token='=>'string', 'capability_token='=>'string'], - 'Xcom::decode' => ['object', 'avro_msg'=>'string', 'json_schema'=>'string'], - 'Xcom::encode' => ['string', 'data'=>'stdClass', 'avro_schema'=>'string'], - 'Xcom::getDebugOutput' => ['string'], - 'Xcom::getLastResponse' => ['string'], - 'Xcom::getLastResponseInfo' => ['array'], - 'Xcom::getOnboardingURL' => ['string', 'capability_name'=>'string', 'agreement_url'=>'string'], - 'Xcom::send' => ['int', 'topic'=>'string', 'data'=>'mixed', 'json_schema='=>'string', 'http_headers='=>'array'], - 'Xcom::sendAsync' => ['int', 'topic'=>'string', 'data'=>'mixed', 'json_schema='=>'string', 'http_headers='=>'array'], - 'XsltProcessor::getSecurityPrefs' => ['int'], - 'XsltProcessor::setSecurityPrefs' => ['int', 'preferences'=>'int'], - 'Yaconf::get' => ['mixed', 'name'=>'string', 'default_value='=>'mixed'], - 'Yaconf::has' => ['bool', 'name'=>'string'], - 'Yaf\Action_Abstract::__clone' => ['void'], - 'Yaf\Action_Abstract::__construct' => ['void', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract', 'view'=>'Yaf\View_Interface', 'invokeArgs='=>'?array'], - 'Yaf\Action_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], - 'Yaf\Action_Abstract::execute' => ['mixed'], - 'Yaf\Action_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], - 'Yaf\Action_Abstract::getController' => ['Yaf\Controller_Abstract'], - 'Yaf\Action_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], - 'Yaf\Action_Abstract::getInvokeArgs' => ['array'], - 'Yaf\Action_Abstract::getModuleName' => ['string'], - 'Yaf\Action_Abstract::getRequest' => ['Yaf\Request_Abstract'], - 'Yaf\Action_Abstract::getResponse' => ['Yaf\Response_Abstract'], - 'Yaf\Action_Abstract::getView' => ['Yaf\View_Interface'], - 'Yaf\Action_Abstract::getViewpath' => ['string'], - 'Yaf\Action_Abstract::init' => [''], - 'Yaf\Action_Abstract::initView' => ['Yaf\Response_Abstract', 'options='=>'?array'], - 'Yaf\Action_Abstract::redirect' => ['bool', 'url'=>'string'], - 'Yaf\Action_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], - 'Yaf\Action_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], - 'Yaf\Application::__clone' => ['void'], - 'Yaf\Application::__construct' => ['void', 'config'=>'array|string', 'envrion='=>'string'], - 'Yaf\Application::__destruct' => ['void'], - 'Yaf\Application::__sleep' => ['string[]'], - 'Yaf\Application::__wakeup' => ['void'], - 'Yaf\Application::app' => ['?Yaf\Application'], - 'Yaf\Application::bootstrap' => ['Yaf\Application', 'bootstrap='=>'?Yaf\Bootstrap_Abstract'], - 'Yaf\Application::clearLastError' => ['void'], - 'Yaf\Application::environ' => ['string'], - 'Yaf\Application::execute' => ['void', 'entry'=>'callable', '_='=>'string'], - 'Yaf\Application::getAppDirectory' => ['string'], - 'Yaf\Application::getConfig' => ['Yaf\Config_Abstract'], - 'Yaf\Application::getDispatcher' => ['Yaf\Dispatcher'], - 'Yaf\Application::getLastErrorMsg' => ['string'], - 'Yaf\Application::getLastErrorNo' => ['int'], - 'Yaf\Application::getModules' => ['array'], - 'Yaf\Application::run' => ['void'], - 'Yaf\Application::setAppDirectory' => ['Yaf\Application', 'directory'=>'string'], - 'Yaf\Config\Ini::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], - 'Yaf\Config\Ini::__get' => ['', 'name='=>'mixed'], - 'Yaf\Config\Ini::__isset' => ['', 'name'=>'string'], - 'Yaf\Config\Ini::__set' => ['void', 'name'=>'', 'value'=>''], - 'Yaf\Config\Ini::count' => ['int'], - 'Yaf\Config\Ini::current' => ['mixed'], - 'Yaf\Config\Ini::get' => ['mixed', 'name='=>'mixed'], - 'Yaf\Config\Ini::key' => ['int|string'], - 'Yaf\Config\Ini::next' => ['void'], - 'Yaf\Config\Ini::offsetExists' => ['bool', 'name'=>'mixed'], - 'Yaf\Config\Ini::offsetGet' => ['mixed', 'name'=>'mixed'], - 'Yaf\Config\Ini::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], - 'Yaf\Config\Ini::offsetUnset' => ['void', 'name'=>'mixed'], - 'Yaf\Config\Ini::readonly' => ['bool'], - 'Yaf\Config\Ini::rewind' => ['void'], - 'Yaf\Config\Ini::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], - 'Yaf\Config\Ini::toArray' => ['array'], - 'Yaf\Config\Ini::valid' => ['bool'], - 'Yaf\Config\Simple::__construct' => ['void', 'array'=>'array', 'readonly='=>'string'], - 'Yaf\Config\Simple::__get' => ['', 'name='=>'mixed'], - 'Yaf\Config\Simple::__isset' => ['', 'name'=>'string'], - 'Yaf\Config\Simple::__set' => ['void', 'name'=>'', 'value'=>''], - 'Yaf\Config\Simple::count' => ['int'], - 'Yaf\Config\Simple::current' => ['mixed'], - 'Yaf\Config\Simple::get' => ['mixed', 'name='=>'mixed'], - 'Yaf\Config\Simple::key' => ['int|string'], - 'Yaf\Config\Simple::next' => ['void'], - 'Yaf\Config\Simple::offsetExists' => ['bool', 'name'=>'mixed'], - 'Yaf\Config\Simple::offsetGet' => ['mixed', 'name'=>'mixed'], - 'Yaf\Config\Simple::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], - 'Yaf\Config\Simple::offsetUnset' => ['void', 'name'=>'mixed'], - 'Yaf\Config\Simple::readonly' => ['bool'], - 'Yaf\Config\Simple::rewind' => ['void'], - 'Yaf\Config\Simple::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], - 'Yaf\Config\Simple::toArray' => ['array'], - 'Yaf\Config\Simple::valid' => ['bool'], - 'Yaf\Config_Abstract::__construct' => ['void'], - 'Yaf\Config_Abstract::get' => ['mixed', 'name='=>'string'], - 'Yaf\Config_Abstract::readonly' => ['bool'], - 'Yaf\Config_Abstract::set' => ['Yaf\Config_Abstract', 'name'=>'string', 'value'=>'mixed'], - 'Yaf\Config_Abstract::toArray' => ['array'], - 'Yaf\Controller_Abstract::__clone' => ['void'], - 'Yaf\Controller_Abstract::__construct' => ['void', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract', 'view'=>'Yaf\View_Interface', 'invokeArgs='=>'?array'], - 'Yaf\Controller_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], - 'Yaf\Controller_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], - 'Yaf\Controller_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], - 'Yaf\Controller_Abstract::getInvokeArgs' => ['array'], - 'Yaf\Controller_Abstract::getModuleName' => ['string'], - 'Yaf\Controller_Abstract::getRequest' => ['Yaf\Request_Abstract'], - 'Yaf\Controller_Abstract::getResponse' => ['Yaf\Response_Abstract'], - 'Yaf\Controller_Abstract::getView' => ['Yaf\View_Interface'], - 'Yaf\Controller_Abstract::getViewpath' => ['string'], - 'Yaf\Controller_Abstract::init' => [''], - 'Yaf\Controller_Abstract::initView' => ['Yaf\Response_Abstract', 'options='=>'?array'], - 'Yaf\Controller_Abstract::redirect' => ['bool', 'url'=>'string'], - 'Yaf\Controller_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], - 'Yaf\Controller_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], - 'Yaf\Dispatcher::__clone' => ['void'], - 'Yaf\Dispatcher::__construct' => ['void'], - 'Yaf\Dispatcher::__sleep' => ['list'], - 'Yaf\Dispatcher::__wakeup' => ['void'], - 'Yaf\Dispatcher::autoRender' => ['Yaf\Dispatcher', 'flag='=>'bool'], - 'Yaf\Dispatcher::catchException' => ['Yaf\Dispatcher', 'flag='=>'bool'], - 'Yaf\Dispatcher::disableView' => ['bool'], - 'Yaf\Dispatcher::dispatch' => ['Yaf\Response_Abstract', 'request'=>'Yaf\Request_Abstract'], - 'Yaf\Dispatcher::enableView' => ['Yaf\Dispatcher'], - 'Yaf\Dispatcher::flushInstantly' => ['Yaf\Dispatcher', 'flag='=>'bool'], - 'Yaf\Dispatcher::getApplication' => ['Yaf\Application'], - 'Yaf\Dispatcher::getInstance' => ['Yaf\Dispatcher'], - 'Yaf\Dispatcher::getRequest' => ['Yaf\Request_Abstract'], - 'Yaf\Dispatcher::getRouter' => ['Yaf\Router'], - 'Yaf\Dispatcher::initView' => ['Yaf\View_Interface', 'templates_dir'=>'string', 'options='=>'?array'], - 'Yaf\Dispatcher::registerPlugin' => ['Yaf\Dispatcher', 'plugin'=>'Yaf\Plugin_Abstract'], - 'Yaf\Dispatcher::returnResponse' => ['Yaf\Dispatcher', 'flag'=>'bool'], - 'Yaf\Dispatcher::setDefaultAction' => ['Yaf\Dispatcher', 'action'=>'string'], - 'Yaf\Dispatcher::setDefaultController' => ['Yaf\Dispatcher', 'controller'=>'string'], - 'Yaf\Dispatcher::setDefaultModule' => ['Yaf\Dispatcher', 'module'=>'string'], - 'Yaf\Dispatcher::setErrorHandler' => ['Yaf\Dispatcher', 'callback'=>'callable', 'error_types'=>'int'], - 'Yaf\Dispatcher::setRequest' => ['Yaf\Dispatcher', 'request'=>'Yaf\Request_Abstract'], - 'Yaf\Dispatcher::setView' => ['Yaf\Dispatcher', 'view'=>'Yaf\View_Interface'], - 'Yaf\Dispatcher::throwException' => ['Yaf\Dispatcher', 'flag='=>'bool'], - 'Yaf\Loader::__clone' => ['void'], - 'Yaf\Loader::__construct' => ['void'], - 'Yaf\Loader::__sleep' => ['list'], - 'Yaf\Loader::__wakeup' => ['void'], - 'Yaf\Loader::autoload' => ['bool', 'class_name'=>'string'], - 'Yaf\Loader::clearLocalNamespace' => [''], - 'Yaf\Loader::getInstance' => ['Yaf\Loader', 'local_library_path='=>'string', 'global_library_path='=>'string'], - 'Yaf\Loader::getLibraryPath' => ['string', 'is_global='=>'bool'], - 'Yaf\Loader::getLocalNamespace' => ['string'], - 'Yaf\Loader::import' => ['bool', 'file'=>'string'], - 'Yaf\Loader::isLocalName' => ['bool', 'class_name'=>'string'], - 'Yaf\Loader::registerLocalNamespace' => ['bool', 'name_prefix'=>'string|string[]'], - 'Yaf\Loader::setLibraryPath' => ['Yaf\Loader', 'directory'=>'string', 'global='=>'bool'], - 'Yaf\Plugin_Abstract::dispatchLoopShutdown' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], - 'Yaf\Plugin_Abstract::dispatchLoopStartup' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], - 'Yaf\Plugin_Abstract::postDispatch' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], - 'Yaf\Plugin_Abstract::preDispatch' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], - 'Yaf\Plugin_Abstract::preResponse' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], - 'Yaf\Plugin_Abstract::routerShutdown' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], - 'Yaf\Plugin_Abstract::routerStartup' => ['bool', 'request'=>'Yaf\Request_Abstract', 'response'=>'Yaf\Response_Abstract'], - 'Yaf\Registry::__clone' => ['void'], - 'Yaf\Registry::__construct' => ['void'], - 'Yaf\Registry::del' => ['bool|void', 'name'=>'string'], - 'Yaf\Registry::get' => ['mixed', 'name'=>'string'], - 'Yaf\Registry::has' => ['bool', 'name'=>'string'], - 'Yaf\Registry::set' => ['bool', 'name'=>'string', 'value'=>'mixed'], - 'Yaf\Request\Http::__clone' => ['void'], - 'Yaf\Request\Http::__construct' => ['void', 'request_uri'=>'string', 'base_uri'=>'string'], - 'Yaf\Request\Http::get' => ['mixed', 'name'=>'string', 'default='=>'string'], - 'Yaf\Request\Http::getActionName' => ['string'], - 'Yaf\Request\Http::getBaseUri' => ['string'], - 'Yaf\Request\Http::getControllerName' => ['string'], - 'Yaf\Request\Http::getCookie' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request\Http::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request\Http::getException' => ['Yaf\Exception'], - 'Yaf\Request\Http::getFiles' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request\Http::getLanguage' => ['string'], - 'Yaf\Request\Http::getMethod' => ['string'], - 'Yaf\Request\Http::getModuleName' => ['string'], - 'Yaf\Request\Http::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], - 'Yaf\Request\Http::getParams' => ['array'], - 'Yaf\Request\Http::getPost' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request\Http::getQuery' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request\Http::getRequest' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request\Http::getRequestUri' => ['string'], - 'Yaf\Request\Http::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request\Http::isCli' => ['bool'], - 'Yaf\Request\Http::isDispatched' => ['bool'], - 'Yaf\Request\Http::isGet' => ['bool'], - 'Yaf\Request\Http::isHead' => ['bool'], - 'Yaf\Request\Http::isOptions' => ['bool'], - 'Yaf\Request\Http::isPost' => ['bool'], - 'Yaf\Request\Http::isPut' => ['bool'], - 'Yaf\Request\Http::isRouted' => ['bool'], - 'Yaf\Request\Http::isXmlHttpRequest' => ['bool'], - 'Yaf\Request\Http::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], - 'Yaf\Request\Http::setBaseUri' => ['bool', 'uri'=>'string'], - 'Yaf\Request\Http::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], - 'Yaf\Request\Http::setDispatched' => ['bool'], - 'Yaf\Request\Http::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], - 'Yaf\Request\Http::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], - 'Yaf\Request\Http::setRequestUri' => ['', 'uri'=>'string'], - 'Yaf\Request\Http::setRouted' => ['Yaf\Request_Abstract|bool'], - 'Yaf\Request\Simple::__clone' => ['void'], - 'Yaf\Request\Simple::__construct' => ['void', 'method'=>'string', 'controller'=>'string', 'action'=>'string', 'params='=>'string'], - 'Yaf\Request\Simple::get' => ['mixed', 'name'=>'string', 'default='=>'string'], - 'Yaf\Request\Simple::getActionName' => ['string'], - 'Yaf\Request\Simple::getBaseUri' => ['string'], - 'Yaf\Request\Simple::getControllerName' => ['string'], - 'Yaf\Request\Simple::getCookie' => ['mixed', 'name='=>'string', 'default='=>'string'], - 'Yaf\Request\Simple::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request\Simple::getException' => ['Yaf\Exception'], - 'Yaf\Request\Simple::getFiles' => ['array', 'name='=>'mixed', 'default='=>'null'], - 'Yaf\Request\Simple::getLanguage' => ['string'], - 'Yaf\Request\Simple::getMethod' => ['string'], - 'Yaf\Request\Simple::getModuleName' => ['string'], - 'Yaf\Request\Simple::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], - 'Yaf\Request\Simple::getParams' => ['array'], - 'Yaf\Request\Simple::getPost' => ['mixed', 'name='=>'string', 'default='=>'string'], - 'Yaf\Request\Simple::getQuery' => ['mixed', 'name='=>'string', 'default='=>'string'], - 'Yaf\Request\Simple::getRequest' => ['mixed', 'name='=>'string', 'default='=>'string'], - 'Yaf\Request\Simple::getRequestUri' => ['string'], - 'Yaf\Request\Simple::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request\Simple::isCli' => ['bool'], - 'Yaf\Request\Simple::isDispatched' => ['bool'], - 'Yaf\Request\Simple::isGet' => ['bool'], - 'Yaf\Request\Simple::isHead' => ['bool'], - 'Yaf\Request\Simple::isOptions' => ['bool'], - 'Yaf\Request\Simple::isPost' => ['bool'], - 'Yaf\Request\Simple::isPut' => ['bool'], - 'Yaf\Request\Simple::isRouted' => ['bool'], - 'Yaf\Request\Simple::isXmlHttpRequest' => ['bool'], - 'Yaf\Request\Simple::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], - 'Yaf\Request\Simple::setBaseUri' => ['bool', 'uri'=>'string'], - 'Yaf\Request\Simple::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], - 'Yaf\Request\Simple::setDispatched' => ['bool'], - 'Yaf\Request\Simple::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], - 'Yaf\Request\Simple::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], - 'Yaf\Request\Simple::setRequestUri' => ['', 'uri'=>'string'], - 'Yaf\Request\Simple::setRouted' => ['Yaf\Request_Abstract|bool'], - 'Yaf\Request_Abstract::getActionName' => ['string'], - 'Yaf\Request_Abstract::getBaseUri' => ['string'], - 'Yaf\Request_Abstract::getControllerName' => ['string'], - 'Yaf\Request_Abstract::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request_Abstract::getException' => ['Yaf\Exception'], - 'Yaf\Request_Abstract::getLanguage' => ['string'], - 'Yaf\Request_Abstract::getMethod' => ['string'], - 'Yaf\Request_Abstract::getModuleName' => ['string'], - 'Yaf\Request_Abstract::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], - 'Yaf\Request_Abstract::getParams' => ['array'], - 'Yaf\Request_Abstract::getRequestUri' => ['string'], - 'Yaf\Request_Abstract::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf\Request_Abstract::isCli' => ['bool'], - 'Yaf\Request_Abstract::isDispatched' => ['bool'], - 'Yaf\Request_Abstract::isGet' => ['bool'], - 'Yaf\Request_Abstract::isHead' => ['bool'], - 'Yaf\Request_Abstract::isOptions' => ['bool'], - 'Yaf\Request_Abstract::isPost' => ['bool'], - 'Yaf\Request_Abstract::isPut' => ['bool'], - 'Yaf\Request_Abstract::isRouted' => ['bool'], - 'Yaf\Request_Abstract::isXmlHttpRequest' => ['bool'], - 'Yaf\Request_Abstract::setActionName' => ['Yaf\Request_Abstract|bool', 'action'=>'string'], - 'Yaf\Request_Abstract::setBaseUri' => ['bool', 'uri'=>'string'], - 'Yaf\Request_Abstract::setControllerName' => ['Yaf\Request_Abstract|bool', 'controller'=>'string'], - 'Yaf\Request_Abstract::setDispatched' => ['bool'], - 'Yaf\Request_Abstract::setModuleName' => ['Yaf\Request_Abstract|bool', 'module'=>'string'], - 'Yaf\Request_Abstract::setParam' => ['Yaf\Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], - 'Yaf\Request_Abstract::setRequestUri' => ['', 'uri'=>'string'], - 'Yaf\Request_Abstract::setRouted' => ['Yaf\Request_Abstract|bool'], - 'Yaf\Response\Cli::__clone' => ['void'], - 'Yaf\Response\Cli::__construct' => ['void'], - 'Yaf\Response\Cli::__destruct' => ['void'], - 'Yaf\Response\Cli::__toString' => ['string'], - 'Yaf\Response\Cli::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf\Response\Cli::clearBody' => ['bool', 'key='=>'string'], - 'Yaf\Response\Cli::getBody' => ['mixed', 'key='=>'?string'], - 'Yaf\Response\Cli::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf\Response\Cli::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf\Response\Http::__clone' => ['void'], - 'Yaf\Response\Http::__construct' => ['void'], - 'Yaf\Response\Http::__destruct' => ['void'], - 'Yaf\Response\Http::__toString' => ['string'], - 'Yaf\Response\Http::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf\Response\Http::clearBody' => ['bool', 'key='=>'string'], - 'Yaf\Response\Http::clearHeaders' => ['Yaf\Response_Abstract|false', 'name='=>'string'], - 'Yaf\Response\Http::getBody' => ['mixed', 'key='=>'?string'], - 'Yaf\Response\Http::getHeader' => ['mixed', 'name='=>'string'], - 'Yaf\Response\Http::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf\Response\Http::response' => ['bool'], - 'Yaf\Response\Http::setAllHeaders' => ['bool', 'headers'=>'array'], - 'Yaf\Response\Http::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf\Response\Http::setHeader' => ['bool', 'name'=>'string', 'value'=>'string', 'replace='=>'bool', 'response_code='=>'int'], - 'Yaf\Response\Http::setRedirect' => ['bool', 'url'=>'string'], - 'Yaf\Response_Abstract::__clone' => ['void'], - 'Yaf\Response_Abstract::__construct' => ['void'], - 'Yaf\Response_Abstract::__destruct' => ['void'], - 'Yaf\Response_Abstract::__toString' => ['void'], - 'Yaf\Response_Abstract::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf\Response_Abstract::clearBody' => ['bool', 'key='=>'string'], - 'Yaf\Response_Abstract::getBody' => ['mixed', 'key='=>'?string'], - 'Yaf\Response_Abstract::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf\Response_Abstract::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf\Route\Map::__construct' => ['void', 'controller_prefer='=>'bool', 'delimiter='=>'string'], - 'Yaf\Route\Map::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], - 'Yaf\Route\Map::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], - 'Yaf\Route\Regex::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'map='=>'?array', 'verify='=>'?array', 'reverse='=>'string'], - 'Yaf\Route\Regex::addConfig' => ['Yaf\Router|bool', 'config'=>'Yaf\Config_Abstract'], - 'Yaf\Route\Regex::addRoute' => ['Yaf\Router|bool', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], - 'Yaf\Route\Regex::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], - 'Yaf\Route\Regex::getCurrentRoute' => ['string'], - 'Yaf\Route\Regex::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], - 'Yaf\Route\Regex::getRoutes' => ['Yaf\Route_Interface[]'], - 'Yaf\Route\Regex::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], - 'Yaf\Route\Rewrite::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'verify='=>'?array', 'reverse='=>'string'], - 'Yaf\Route\Rewrite::addConfig' => ['Yaf\Router|bool', 'config'=>'Yaf\Config_Abstract'], - 'Yaf\Route\Rewrite::addRoute' => ['Yaf\Router|bool', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], - 'Yaf\Route\Rewrite::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], - 'Yaf\Route\Rewrite::getCurrentRoute' => ['string'], - 'Yaf\Route\Rewrite::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], - 'Yaf\Route\Rewrite::getRoutes' => ['Yaf\Route_Interface[]'], - 'Yaf\Route\Rewrite::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], - 'Yaf\Route\Simple::__construct' => ['void', 'module_name'=>'string', 'controller_name'=>'string', 'action_name'=>'string'], - 'Yaf\Route\Simple::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], - 'Yaf\Route\Simple::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], - 'Yaf\Route\Supervar::__construct' => ['void', 'supervar_name'=>'string'], - 'Yaf\Route\Supervar::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], - 'Yaf\Route\Supervar::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], - 'Yaf\Route_Interface::__construct' => ['Yaf\Route_Interface'], - 'Yaf\Route_Interface::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], - 'Yaf\Route_Interface::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], - 'Yaf\Route_Static::assemble' => ['bool', 'info'=>'array', 'query='=>'?array'], - 'Yaf\Route_Static::match' => ['bool', 'uri'=>'string'], - 'Yaf\Route_Static::route' => ['bool', 'request'=>'Yaf\Request_Abstract'], - 'Yaf\Router::__construct' => ['void'], - 'Yaf\Router::addConfig' => ['Yaf\Router|false', 'config'=>'Yaf\Config_Abstract'], - 'Yaf\Router::addRoute' => ['Yaf\Router|false', 'name'=>'string', 'route'=>'Yaf\Route_Interface'], - 'Yaf\Router::getCurrentRoute' => ['string'], - 'Yaf\Router::getRoute' => ['Yaf\Route_Interface', 'name'=>'string'], - 'Yaf\Router::getRoutes' => ['Yaf\Route_Interface[]'], - 'Yaf\Router::route' => ['Yaf\Router|false', 'request'=>'Yaf\Request_Abstract'], - 'Yaf\Session::__clone' => ['void'], - 'Yaf\Session::__construct' => ['void'], - 'Yaf\Session::__get' => ['void', 'name'=>''], - 'Yaf\Session::__isset' => ['void', 'name'=>''], - 'Yaf\Session::__set' => ['void', 'name'=>'', 'value'=>''], - 'Yaf\Session::__sleep' => ['list'], - 'Yaf\Session::__unset' => ['void', 'name'=>''], - 'Yaf\Session::__wakeup' => ['void'], - 'Yaf\Session::count' => ['int'], - 'Yaf\Session::current' => ['mixed'], - 'Yaf\Session::del' => ['Yaf\Session|false', 'name'=>'string'], - 'Yaf\Session::get' => ['mixed', 'name'=>'string'], - 'Yaf\Session::getInstance' => ['Yaf\Session'], - 'Yaf\Session::has' => ['bool', 'name'=>'string'], - 'Yaf\Session::key' => ['int|string'], - 'Yaf\Session::next' => ['void'], - 'Yaf\Session::offsetExists' => ['bool', 'name'=>'mixed'], - 'Yaf\Session::offsetGet' => ['mixed', 'name'=>'mixed'], - 'Yaf\Session::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], - 'Yaf\Session::offsetUnset' => ['void', 'name'=>'mixed'], - 'Yaf\Session::rewind' => ['void'], - 'Yaf\Session::set' => ['Yaf\Session|false', 'name'=>'string', 'value'=>'mixed'], - 'Yaf\Session::start' => ['Yaf\Session'], - 'Yaf\Session::valid' => ['bool'], - 'Yaf\View\Simple::__construct' => ['void', 'template_dir'=>'string', 'options='=>'?array'], - 'Yaf\View\Simple::__get' => ['mixed', 'name='=>'null'], - 'Yaf\View\Simple::__isset' => ['', 'name'=>'string'], - 'Yaf\View\Simple::__set' => ['void', 'name'=>'string', 'value='=>'mixed'], - 'Yaf\View\Simple::assign' => ['Yaf\View\Simple', 'name'=>'array|string', 'value='=>'mixed'], - 'Yaf\View\Simple::assignRef' => ['Yaf\View\Simple', 'name'=>'string', '&value'=>'mixed'], - 'Yaf\View\Simple::clear' => ['Yaf\View\Simple', 'name='=>'string'], - 'Yaf\View\Simple::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'?array'], - 'Yaf\View\Simple::eval' => ['bool|void', 'tpl_str'=>'string', 'vars='=>'?array'], - 'Yaf\View\Simple::getScriptPath' => ['string'], - 'Yaf\View\Simple::render' => ['string|void', 'tpl'=>'string', 'tpl_vars='=>'?array'], - 'Yaf\View\Simple::setScriptPath' => ['Yaf\View\Simple', 'template_dir'=>'string'], - 'Yaf\View_Interface::assign' => ['bool', 'name'=>'array|string', 'value'=>'mixed'], - 'Yaf\View_Interface::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'?array'], - 'Yaf\View_Interface::getScriptPath' => ['string'], - 'Yaf\View_Interface::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'?array'], - 'Yaf\View_Interface::setScriptPath' => ['void', 'template_dir'=>'string'], - 'Yaf_Action_Abstract::__clone' => ['void'], - 'Yaf_Action_Abstract::__construct' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract', 'view'=>'Yaf_View_Interface', 'invokeArgs='=>'?array'], - 'Yaf_Action_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'?array'], - 'Yaf_Action_Abstract::execute' => ['mixed', 'arg='=>'mixed', '...args='=>'mixed'], - 'Yaf_Action_Abstract::forward' => ['bool', 'module'=>'string', 'controller='=>'string', 'action='=>'string', 'parameters='=>'?array'], - 'Yaf_Action_Abstract::getController' => ['Yaf_Controller_Abstract'], - 'Yaf_Action_Abstract::getControllerName' => ['string'], - 'Yaf_Action_Abstract::getInvokeArg' => ['mixed|null', 'name'=>'string'], - 'Yaf_Action_Abstract::getInvokeArgs' => ['array'], - 'Yaf_Action_Abstract::getModuleName' => ['string'], - 'Yaf_Action_Abstract::getRequest' => ['Yaf_Request_Abstract'], - 'Yaf_Action_Abstract::getResponse' => ['Yaf_Response_Abstract'], - 'Yaf_Action_Abstract::getView' => ['Yaf_View_Interface'], - 'Yaf_Action_Abstract::getViewpath' => ['string'], - 'Yaf_Action_Abstract::init' => [''], - 'Yaf_Action_Abstract::initView' => ['Yaf_Response_Abstract', 'options='=>'?array'], - 'Yaf_Action_Abstract::redirect' => ['bool', 'url'=>'string'], - 'Yaf_Action_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'?array'], - 'Yaf_Action_Abstract::setViewpath' => ['bool', 'view_directory'=>'string'], - 'Yaf_Application::__clone' => ['void'], - 'Yaf_Application::__construct' => ['void', 'config'=>'mixed', 'envrion='=>'string'], - 'Yaf_Application::__destruct' => ['void'], - 'Yaf_Application::__sleep' => ['list'], - 'Yaf_Application::__wakeup' => ['void'], - 'Yaf_Application::app' => ['?Yaf_Application'], - 'Yaf_Application::bootstrap' => ['Yaf_Application', 'bootstrap='=>'Yaf_Bootstrap_Abstract'], - 'Yaf_Application::clearLastError' => ['Yaf_Application'], - 'Yaf_Application::environ' => ['string'], - 'Yaf_Application::execute' => ['void', 'entry'=>'callable', '...args'=>'string'], - 'Yaf_Application::getAppDirectory' => ['Yaf_Application'], - 'Yaf_Application::getConfig' => ['Yaf_Config_Abstract'], - 'Yaf_Application::getDispatcher' => ['Yaf_Dispatcher'], - 'Yaf_Application::getLastErrorMsg' => ['string'], - 'Yaf_Application::getLastErrorNo' => ['int'], - 'Yaf_Application::getModules' => ['array'], - 'Yaf_Application::run' => ['void'], - 'Yaf_Application::setAppDirectory' => ['Yaf_Application', 'directory'=>'string'], - 'Yaf_Config_Abstract::__construct' => ['void'], - 'Yaf_Config_Abstract::get' => ['mixed', 'name'=>'string', 'value'=>'mixed'], - 'Yaf_Config_Abstract::readonly' => ['bool'], - 'Yaf_Config_Abstract::set' => ['Yaf_Config_Abstract'], - 'Yaf_Config_Abstract::toArray' => ['array'], - 'Yaf_Config_Ini::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], - 'Yaf_Config_Ini::__get' => ['void', 'name='=>'string'], - 'Yaf_Config_Ini::__isset' => ['void', 'name'=>'string'], - 'Yaf_Config_Ini::__set' => ['void', 'name'=>'string', 'value'=>'mixed'], - 'Yaf_Config_Ini::count' => ['void'], - 'Yaf_Config_Ini::current' => ['void'], - 'Yaf_Config_Ini::get' => ['mixed', 'name='=>'mixed'], - 'Yaf_Config_Ini::key' => ['void'], - 'Yaf_Config_Ini::next' => ['void'], - 'Yaf_Config_Ini::offsetExists' => ['void', 'name'=>'string'], - 'Yaf_Config_Ini::offsetGet' => ['void', 'name'=>'string'], - 'Yaf_Config_Ini::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], - 'Yaf_Config_Ini::offsetUnset' => ['void', 'name'=>'string'], - 'Yaf_Config_Ini::readonly' => ['void'], - 'Yaf_Config_Ini::rewind' => ['void'], - 'Yaf_Config_Ini::set' => ['Yaf_Config_Abstract', 'name'=>'string', 'value'=>'mixed'], - 'Yaf_Config_Ini::toArray' => ['array'], - 'Yaf_Config_Ini::valid' => ['void'], - 'Yaf_Config_Simple::__construct' => ['void', 'config_file'=>'string', 'section='=>'string'], - 'Yaf_Config_Simple::__get' => ['void', 'name='=>'string'], - 'Yaf_Config_Simple::__isset' => ['void', 'name'=>'string'], - 'Yaf_Config_Simple::__set' => ['void', 'name'=>'string', 'value'=>'string'], - 'Yaf_Config_Simple::count' => ['void'], - 'Yaf_Config_Simple::current' => ['void'], - 'Yaf_Config_Simple::get' => ['mixed', 'name='=>'mixed'], - 'Yaf_Config_Simple::key' => ['void'], - 'Yaf_Config_Simple::next' => ['void'], - 'Yaf_Config_Simple::offsetExists' => ['void', 'name'=>'string'], - 'Yaf_Config_Simple::offsetGet' => ['void', 'name'=>'string'], - 'Yaf_Config_Simple::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], - 'Yaf_Config_Simple::offsetUnset' => ['void', 'name'=>'string'], - 'Yaf_Config_Simple::readonly' => ['void'], - 'Yaf_Config_Simple::rewind' => ['void'], - 'Yaf_Config_Simple::set' => ['Yaf_Config_Abstract', 'name'=>'string', 'value'=>'mixed'], - 'Yaf_Config_Simple::toArray' => ['array'], - 'Yaf_Config_Simple::valid' => ['void'], - 'Yaf_Controller_Abstract::__clone' => ['void'], - 'Yaf_Controller_Abstract::__construct' => ['void'], - 'Yaf_Controller_Abstract::display' => ['bool', 'tpl'=>'string', 'parameters='=>'array'], - 'Yaf_Controller_Abstract::forward' => ['void', 'action'=>'string', 'parameters='=>'array'], - 'Yaf_Controller_Abstract::forward\'1' => ['void', 'controller'=>'string', 'action'=>'string', 'parameters='=>'array'], - 'Yaf_Controller_Abstract::forward\'2' => ['void', 'module'=>'string', 'controller'=>'string', 'action'=>'string', 'parameters='=>'array'], - 'Yaf_Controller_Abstract::getInvokeArg' => ['void', 'name'=>'string'], - 'Yaf_Controller_Abstract::getInvokeArgs' => ['void'], - 'Yaf_Controller_Abstract::getModuleName' => ['string'], - 'Yaf_Controller_Abstract::getName' => ['string'], - 'Yaf_Controller_Abstract::getRequest' => ['Yaf_Request_Abstract'], - 'Yaf_Controller_Abstract::getResponse' => ['Yaf_Response_Abstract'], - 'Yaf_Controller_Abstract::getView' => ['Yaf_View_Interface'], - 'Yaf_Controller_Abstract::getViewpath' => ['void'], - 'Yaf_Controller_Abstract::init' => ['void'], - 'Yaf_Controller_Abstract::initView' => ['void', 'options='=>'array'], - 'Yaf_Controller_Abstract::redirect' => ['bool', 'url'=>'string'], - 'Yaf_Controller_Abstract::render' => ['string', 'tpl'=>'string', 'parameters='=>'array'], - 'Yaf_Controller_Abstract::setViewpath' => ['void', 'view_directory'=>'string'], - 'Yaf_Dispatcher::__clone' => ['void'], - 'Yaf_Dispatcher::__construct' => ['void'], - 'Yaf_Dispatcher::__sleep' => ['list'], - 'Yaf_Dispatcher::__wakeup' => ['void'], - 'Yaf_Dispatcher::autoRender' => ['Yaf_Dispatcher', 'flag='=>'bool'], - 'Yaf_Dispatcher::catchException' => ['Yaf_Dispatcher', 'flag='=>'bool'], - 'Yaf_Dispatcher::disableView' => ['bool'], - 'Yaf_Dispatcher::dispatch' => ['Yaf_Response_Abstract', 'request'=>'Yaf_Request_Abstract'], - 'Yaf_Dispatcher::enableView' => ['Yaf_Dispatcher'], - 'Yaf_Dispatcher::flushInstantly' => ['Yaf_Dispatcher', 'flag='=>'bool'], - 'Yaf_Dispatcher::getApplication' => ['Yaf_Application'], - 'Yaf_Dispatcher::getDefaultAction' => ['string'], - 'Yaf_Dispatcher::getDefaultController' => ['string'], - 'Yaf_Dispatcher::getDefaultModule' => ['string'], - 'Yaf_Dispatcher::getInstance' => ['Yaf_Dispatcher'], - 'Yaf_Dispatcher::getRequest' => ['Yaf_Request_Abstract'], - 'Yaf_Dispatcher::getRouter' => ['Yaf_Router'], - 'Yaf_Dispatcher::initView' => ['Yaf_View_Interface', 'templates_dir'=>'string', 'options='=>'array'], - 'Yaf_Dispatcher::registerPlugin' => ['Yaf_Dispatcher', 'plugin'=>'Yaf_Plugin_Abstract'], - 'Yaf_Dispatcher::returnResponse' => ['Yaf_Dispatcher', 'flag'=>'bool'], - 'Yaf_Dispatcher::setDefaultAction' => ['Yaf_Dispatcher', 'action'=>'string'], - 'Yaf_Dispatcher::setDefaultController' => ['Yaf_Dispatcher', 'controller'=>'string'], - 'Yaf_Dispatcher::setDefaultModule' => ['Yaf_Dispatcher', 'module'=>'string'], - 'Yaf_Dispatcher::setErrorHandler' => ['Yaf_Dispatcher', 'callback'=>'callable', 'error_types'=>'int'], - 'Yaf_Dispatcher::setRequest' => ['Yaf_Dispatcher', 'request'=>'Yaf_Request_Abstract'], - 'Yaf_Dispatcher::setView' => ['Yaf_Dispatcher', 'view'=>'Yaf_View_Interface'], - 'Yaf_Dispatcher::throwException' => ['Yaf_Dispatcher', 'flag='=>'bool'], - 'Yaf_Exception::__construct' => ['void'], - 'Yaf_Exception::getPrevious' => ['void'], - 'Yaf_Loader::__clone' => ['void'], - 'Yaf_Loader::__construct' => ['void'], - 'Yaf_Loader::__sleep' => ['list'], - 'Yaf_Loader::__wakeup' => ['void'], - 'Yaf_Loader::autoload' => ['void'], - 'Yaf_Loader::clearLocalNamespace' => ['void'], - 'Yaf_Loader::getInstance' => ['Yaf_Loader'], - 'Yaf_Loader::getLibraryPath' => ['Yaf_Loader', 'is_global='=>'bool'], - 'Yaf_Loader::getLocalNamespace' => ['void'], - 'Yaf_Loader::getNamespacePath' => ['string', 'namespaces'=>'string'], - 'Yaf_Loader::import' => ['bool'], - 'Yaf_Loader::isLocalName' => ['bool'], - 'Yaf_Loader::registerLocalNamespace' => ['void', 'prefix'=>'mixed'], - 'Yaf_Loader::registerNamespace' => ['bool', 'namespaces'=>'string|array', 'path='=>'string'], - 'Yaf_Loader::setLibraryPath' => ['Yaf_Loader', 'directory'=>'string', 'is_global='=>'bool'], - 'Yaf_Plugin_Abstract::dispatchLoopShutdown' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], - 'Yaf_Plugin_Abstract::dispatchLoopStartup' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], - 'Yaf_Plugin_Abstract::postDispatch' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], - 'Yaf_Plugin_Abstract::preDispatch' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], - 'Yaf_Plugin_Abstract::preResponse' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], - 'Yaf_Plugin_Abstract::routerShutdown' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], - 'Yaf_Plugin_Abstract::routerStartup' => ['void', 'request'=>'Yaf_Request_Abstract', 'response'=>'Yaf_Response_Abstract'], - 'Yaf_Registry::__clone' => ['void'], - 'Yaf_Registry::__construct' => ['void'], - 'Yaf_Registry::del' => ['void', 'name'=>'string'], - 'Yaf_Registry::get' => ['mixed', 'name'=>'string'], - 'Yaf_Registry::has' => ['bool', 'name'=>'string'], - 'Yaf_Registry::set' => ['bool', 'name'=>'string', 'value'=>'string'], - 'Yaf_Request_Abstract::clearParams' => ['bool'], - 'Yaf_Request_Abstract::getActionName' => ['void'], - 'Yaf_Request_Abstract::getBaseUri' => ['void'], - 'Yaf_Request_Abstract::getControllerName' => ['void'], - 'Yaf_Request_Abstract::getEnv' => ['void', 'name'=>'string', 'default='=>'string'], - 'Yaf_Request_Abstract::getException' => ['void'], - 'Yaf_Request_Abstract::getLanguage' => ['void'], - 'Yaf_Request_Abstract::getMethod' => ['void'], - 'Yaf_Request_Abstract::getModuleName' => ['void'], - 'Yaf_Request_Abstract::getParam' => ['void', 'name'=>'string', 'default='=>'string'], - 'Yaf_Request_Abstract::getParams' => ['void'], - 'Yaf_Request_Abstract::getRequestUri' => ['void'], - 'Yaf_Request_Abstract::getServer' => ['void', 'name'=>'string', 'default='=>'string'], - 'Yaf_Request_Abstract::isCli' => ['void'], - 'Yaf_Request_Abstract::isDispatched' => ['void'], - 'Yaf_Request_Abstract::isGet' => ['void'], - 'Yaf_Request_Abstract::isHead' => ['void'], - 'Yaf_Request_Abstract::isOptions' => ['void'], - 'Yaf_Request_Abstract::isPost' => ['void'], - 'Yaf_Request_Abstract::isPut' => ['void'], - 'Yaf_Request_Abstract::isRouted' => ['void'], - 'Yaf_Request_Abstract::isXmlHttpRequest' => ['void'], - 'Yaf_Request_Abstract::setActionName' => ['void', 'action'=>'string'], - 'Yaf_Request_Abstract::setBaseUri' => ['bool', 'uir'=>'string'], - 'Yaf_Request_Abstract::setControllerName' => ['void', 'controller'=>'string'], - 'Yaf_Request_Abstract::setDispatched' => ['void'], - 'Yaf_Request_Abstract::setModuleName' => ['void', 'module'=>'string'], - 'Yaf_Request_Abstract::setParam' => ['void', 'name'=>'string', 'value='=>'string'], - 'Yaf_Request_Abstract::setRequestUri' => ['void', 'uir'=>'string'], - 'Yaf_Request_Abstract::setRouted' => ['void', 'flag='=>'string'], - 'Yaf_Request_Http::__clone' => ['void'], - 'Yaf_Request_Http::__construct' => ['void'], - 'Yaf_Request_Http::get' => ['mixed', 'name'=>'string', 'default='=>'string'], - 'Yaf_Request_Http::getActionName' => ['string'], - 'Yaf_Request_Http::getBaseUri' => ['string'], - 'Yaf_Request_Http::getControllerName' => ['string'], - 'Yaf_Request_Http::getCookie' => ['mixed', 'name'=>'string', 'default='=>'string'], - 'Yaf_Request_Http::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf_Request_Http::getException' => ['Yaf_Exception'], - 'Yaf_Request_Http::getFiles' => ['void'], - 'Yaf_Request_Http::getLanguage' => ['string'], - 'Yaf_Request_Http::getMethod' => ['string'], - 'Yaf_Request_Http::getModuleName' => ['string'], - 'Yaf_Request_Http::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], - 'Yaf_Request_Http::getParams' => ['array'], - 'Yaf_Request_Http::getPost' => ['mixed', 'name'=>'string', 'default='=>'string'], - 'Yaf_Request_Http::getQuery' => ['mixed', 'name'=>'string', 'default='=>'string'], - 'Yaf_Request_Http::getRaw' => ['mixed'], - 'Yaf_Request_Http::getRequest' => ['void'], - 'Yaf_Request_Http::getRequestUri' => ['string'], - 'Yaf_Request_Http::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf_Request_Http::isCli' => ['bool'], - 'Yaf_Request_Http::isDispatched' => ['bool'], - 'Yaf_Request_Http::isGet' => ['bool'], - 'Yaf_Request_Http::isHead' => ['bool'], - 'Yaf_Request_Http::isOptions' => ['bool'], - 'Yaf_Request_Http::isPost' => ['bool'], - 'Yaf_Request_Http::isPut' => ['bool'], - 'Yaf_Request_Http::isRouted' => ['bool'], - 'Yaf_Request_Http::isXmlHttpRequest' => ['bool'], - 'Yaf_Request_Http::setActionName' => ['Yaf_Request_Abstract|bool', 'action'=>'string'], - 'Yaf_Request_Http::setBaseUri' => ['bool', 'uri'=>'string'], - 'Yaf_Request_Http::setControllerName' => ['Yaf_Request_Abstract|bool', 'controller'=>'string'], - 'Yaf_Request_Http::setDispatched' => ['bool'], - 'Yaf_Request_Http::setModuleName' => ['Yaf_Request_Abstract|bool', 'module'=>'string'], - 'Yaf_Request_Http::setParam' => ['Yaf_Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], - 'Yaf_Request_Http::setRequestUri' => ['', 'uri'=>'string'], - 'Yaf_Request_Http::setRouted' => ['Yaf_Request_Abstract|bool'], - 'Yaf_Request_Simple::__clone' => ['void'], - 'Yaf_Request_Simple::__construct' => ['void'], - 'Yaf_Request_Simple::get' => ['void'], - 'Yaf_Request_Simple::getActionName' => ['string'], - 'Yaf_Request_Simple::getBaseUri' => ['string'], - 'Yaf_Request_Simple::getControllerName' => ['string'], - 'Yaf_Request_Simple::getCookie' => ['void'], - 'Yaf_Request_Simple::getEnv' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf_Request_Simple::getException' => ['Yaf_Exception'], - 'Yaf_Request_Simple::getFiles' => ['void'], - 'Yaf_Request_Simple::getLanguage' => ['string'], - 'Yaf_Request_Simple::getMethod' => ['string'], - 'Yaf_Request_Simple::getModuleName' => ['string'], - 'Yaf_Request_Simple::getParam' => ['mixed', 'name'=>'string', 'default='=>'mixed'], - 'Yaf_Request_Simple::getParams' => ['array'], - 'Yaf_Request_Simple::getPost' => ['void'], - 'Yaf_Request_Simple::getQuery' => ['void'], - 'Yaf_Request_Simple::getRequest' => ['void'], - 'Yaf_Request_Simple::getRequestUri' => ['string'], - 'Yaf_Request_Simple::getServer' => ['mixed', 'name='=>'string', 'default='=>'mixed'], - 'Yaf_Request_Simple::isCli' => ['bool'], - 'Yaf_Request_Simple::isDispatched' => ['bool'], - 'Yaf_Request_Simple::isGet' => ['bool'], - 'Yaf_Request_Simple::isHead' => ['bool'], - 'Yaf_Request_Simple::isOptions' => ['bool'], - 'Yaf_Request_Simple::isPost' => ['bool'], - 'Yaf_Request_Simple::isPut' => ['bool'], - 'Yaf_Request_Simple::isRouted' => ['bool'], - 'Yaf_Request_Simple::isXmlHttpRequest' => ['void'], - 'Yaf_Request_Simple::setActionName' => ['Yaf_Request_Abstract|bool', 'action'=>'string'], - 'Yaf_Request_Simple::setBaseUri' => ['bool', 'uri'=>'string'], - 'Yaf_Request_Simple::setControllerName' => ['Yaf_Request_Abstract|bool', 'controller'=>'string'], - 'Yaf_Request_Simple::setDispatched' => ['bool'], - 'Yaf_Request_Simple::setModuleName' => ['Yaf_Request_Abstract|bool', 'module'=>'string'], - 'Yaf_Request_Simple::setParam' => ['Yaf_Request_Abstract|bool', 'name'=>'array|string', 'value='=>'string'], - 'Yaf_Request_Simple::setRequestUri' => ['', 'uri'=>'string'], - 'Yaf_Request_Simple::setRouted' => ['Yaf_Request_Abstract|bool'], - 'Yaf_Response_Abstract::__clone' => ['void'], - 'Yaf_Response_Abstract::__construct' => ['void'], - 'Yaf_Response_Abstract::__destruct' => ['void'], - 'Yaf_Response_Abstract::__toString' => ['string'], - 'Yaf_Response_Abstract::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf_Response_Abstract::clearBody' => ['bool', 'key='=>'string'], - 'Yaf_Response_Abstract::clearHeaders' => ['void'], - 'Yaf_Response_Abstract::getBody' => ['mixed', 'key='=>'string'], - 'Yaf_Response_Abstract::getHeader' => ['void'], - 'Yaf_Response_Abstract::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf_Response_Abstract::response' => ['void'], - 'Yaf_Response_Abstract::setAllHeaders' => ['void'], - 'Yaf_Response_Abstract::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf_Response_Abstract::setHeader' => ['void'], - 'Yaf_Response_Abstract::setRedirect' => ['void'], - 'Yaf_Response_Cli::__clone' => ['void'], - 'Yaf_Response_Cli::__construct' => ['void'], - 'Yaf_Response_Cli::__destruct' => ['void'], - 'Yaf_Response_Cli::__toString' => ['string'], - 'Yaf_Response_Cli::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf_Response_Cli::clearBody' => ['bool', 'key='=>'string'], - 'Yaf_Response_Cli::getBody' => ['mixed', 'key='=>'?string'], - 'Yaf_Response_Cli::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf_Response_Cli::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf_Response_Http::__clone' => ['void'], - 'Yaf_Response_Http::__construct' => ['void'], - 'Yaf_Response_Http::__destruct' => ['void'], - 'Yaf_Response_Http::__toString' => ['string'], - 'Yaf_Response_Http::appendBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf_Response_Http::clearBody' => ['bool', 'key='=>'string'], - 'Yaf_Response_Http::clearHeaders' => ['Yaf_Response_Abstract|false', 'name='=>'string'], - 'Yaf_Response_Http::getBody' => ['mixed', 'key='=>'?string'], - 'Yaf_Response_Http::getHeader' => ['mixed', 'name='=>'string'], - 'Yaf_Response_Http::prependBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf_Response_Http::response' => ['bool'], - 'Yaf_Response_Http::setAllHeaders' => ['bool', 'headers'=>'array'], - 'Yaf_Response_Http::setBody' => ['bool', 'content'=>'string', 'key='=>'string'], - 'Yaf_Response_Http::setHeader' => ['bool', 'name'=>'string', 'value'=>'string', 'replace='=>'bool', 'response_code='=>'int'], - 'Yaf_Response_Http::setRedirect' => ['bool', 'url'=>'string'], - 'Yaf_Route_Interface::__construct' => ['void'], - 'Yaf_Route_Interface::assemble' => ['string', 'info'=>'array', 'query='=>'array'], - 'Yaf_Route_Interface::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], - 'Yaf_Route_Map::__construct' => ['void', 'controller_prefer='=>'string', 'delimiter='=>'string'], - 'Yaf_Route_Map::assemble' => ['string', 'info'=>'array', 'query='=>'array'], - 'Yaf_Route_Map::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], - 'Yaf_Route_Regex::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'map='=>'array', 'verify='=>'array', 'reverse='=>'string'], - 'Yaf_Route_Regex::addConfig' => ['Yaf_Router|bool', 'config'=>'Yaf_Config_Abstract'], - 'Yaf_Route_Regex::addRoute' => ['Yaf_Router|bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], - 'Yaf_Route_Regex::assemble' => ['string', 'info'=>'array', 'query='=>'array'], - 'Yaf_Route_Regex::getCurrentRoute' => ['string'], - 'Yaf_Route_Regex::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], - 'Yaf_Route_Regex::getRoutes' => ['Yaf_Route_Interface[]'], - 'Yaf_Route_Regex::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], - 'Yaf_Route_Rewrite::__construct' => ['void', 'match'=>'string', 'route'=>'array', 'verify='=>'array'], - 'Yaf_Route_Rewrite::addConfig' => ['Yaf_Router|bool', 'config'=>'Yaf_Config_Abstract'], - 'Yaf_Route_Rewrite::addRoute' => ['Yaf_Router|bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], - 'Yaf_Route_Rewrite::assemble' => ['string', 'info'=>'array', 'query='=>'array'], - 'Yaf_Route_Rewrite::getCurrentRoute' => ['string'], - 'Yaf_Route_Rewrite::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], - 'Yaf_Route_Rewrite::getRoutes' => ['Yaf_Route_Interface[]'], - 'Yaf_Route_Rewrite::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], - 'Yaf_Route_Simple::__construct' => ['void', 'module_name'=>'string', 'controller_name'=>'string', 'action_name'=>'string'], - 'Yaf_Route_Simple::assemble' => ['string', 'info'=>'array', 'query='=>'array'], - 'Yaf_Route_Simple::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], - 'Yaf_Route_Static::assemble' => ['string', 'info'=>'array', 'query='=>'array'], - 'Yaf_Route_Static::match' => ['void', 'uri'=>'string'], - 'Yaf_Route_Static::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], - 'Yaf_Route_Supervar::__construct' => ['void', 'supervar_name'=>'string'], - 'Yaf_Route_Supervar::assemble' => ['string', 'info'=>'array', 'query='=>'array'], - 'Yaf_Route_Supervar::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], - 'Yaf_Router::__construct' => ['void'], - 'Yaf_Router::addConfig' => ['bool', 'config'=>'Yaf_Config_Abstract'], - 'Yaf_Router::addRoute' => ['bool', 'name'=>'string', 'route'=>'Yaf_Route_Interface'], - 'Yaf_Router::getCurrentRoute' => ['string'], - 'Yaf_Router::getRoute' => ['Yaf_Route_Interface', 'name'=>'string'], - 'Yaf_Router::getRoutes' => ['mixed'], - 'Yaf_Router::route' => ['bool', 'request'=>'Yaf_Request_Abstract'], - 'Yaf_Session::__clone' => ['void'], - 'Yaf_Session::__construct' => ['void'], - 'Yaf_Session::__get' => ['void', 'name'=>'string'], - 'Yaf_Session::__isset' => ['void', 'name'=>'string'], - 'Yaf_Session::__set' => ['void', 'name'=>'string', 'value'=>'string'], - 'Yaf_Session::__sleep' => ['list'], - 'Yaf_Session::__unset' => ['void', 'name'=>'string'], - 'Yaf_Session::__wakeup' => ['void'], - 'Yaf_Session::count' => ['void'], - 'Yaf_Session::current' => ['void'], - 'Yaf_Session::del' => ['void', 'name'=>'string'], - 'Yaf_Session::get' => ['mixed', 'name'=>'string'], - 'Yaf_Session::getInstance' => ['void'], - 'Yaf_Session::has' => ['void', 'name'=>'string'], - 'Yaf_Session::key' => ['void'], - 'Yaf_Session::next' => ['void'], - 'Yaf_Session::offsetExists' => ['void', 'name'=>'string'], - 'Yaf_Session::offsetGet' => ['void', 'name'=>'string'], - 'Yaf_Session::offsetSet' => ['void', 'name'=>'string', 'value'=>'string'], - 'Yaf_Session::offsetUnset' => ['void', 'name'=>'string'], - 'Yaf_Session::rewind' => ['void'], - 'Yaf_Session::set' => ['Yaf_Session|bool', 'name'=>'string', 'value'=>'mixed'], - 'Yaf_Session::start' => ['void'], - 'Yaf_Session::valid' => ['void'], - 'Yaf_View_Interface::assign' => ['bool', 'name'=>'string', 'value='=>'string'], - 'Yaf_View_Interface::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'array'], - 'Yaf_View_Interface::getScriptPath' => ['string'], - 'Yaf_View_Interface::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'array'], - 'Yaf_View_Interface::setScriptPath' => ['void', 'template_dir'=>'string'], - 'Yaf_View_Simple::__construct' => ['void', 'tempalte_dir'=>'string', 'options='=>'array'], - 'Yaf_View_Simple::__get' => ['void', 'name='=>'string'], - 'Yaf_View_Simple::__isset' => ['void', 'name'=>'string'], - 'Yaf_View_Simple::__set' => ['void', 'name'=>'string', 'value'=>'mixed'], - 'Yaf_View_Simple::assign' => ['bool', 'name'=>'string', 'value='=>'mixed'], - 'Yaf_View_Simple::assignRef' => ['bool', 'name'=>'string', '&rw_value'=>'mixed'], - 'Yaf_View_Simple::clear' => ['bool', 'name='=>'string'], - 'Yaf_View_Simple::display' => ['bool', 'tpl'=>'string', 'tpl_vars='=>'array'], - 'Yaf_View_Simple::eval' => ['string', 'tpl_content'=>'string', 'tpl_vars='=>'array'], - 'Yaf_View_Simple::getScriptPath' => ['string'], - 'Yaf_View_Simple::render' => ['string', 'tpl'=>'string', 'tpl_vars='=>'array'], - 'Yaf_View_Simple::setScriptPath' => ['bool', 'template_dir'=>'string'], - 'Yar_Client::__call' => ['void', 'method'=>'string', 'parameters'=>'array'], - 'Yar_Client::__construct' => ['void', 'url'=>'string'], - 'Yar_Client::setOpt' => ['Yar_Client|false', 'name'=>'int', 'value'=>'mixed'], - 'Yar_Client_Exception::__clone' => ['void'], - 'Yar_Client_Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'Yar_Client_Exception::__toString' => ['string'], - 'Yar_Client_Exception::__wakeup' => ['void'], - 'Yar_Client_Exception::getCode' => ['int'], - 'Yar_Client_Exception::getFile' => ['string'], - 'Yar_Client_Exception::getLine' => ['int'], - 'Yar_Client_Exception::getMessage' => ['string'], - 'Yar_Client_Exception::getPrevious' => ['?Exception|?Throwable'], - 'Yar_Client_Exception::getTrace' => ['list\',args?:array}>'], - 'Yar_Client_Exception::getTraceAsString' => ['string'], - 'Yar_Client_Exception::getType' => ['string'], - 'Yar_Concurrent_Client::call' => ['int', 'uri'=>'string', 'method'=>'string', 'parameters'=>'array', 'callback='=>'callable'], - 'Yar_Concurrent_Client::loop' => ['bool', 'callback='=>'callable', 'error_callback='=>'callable'], - 'Yar_Concurrent_Client::reset' => ['bool'], - 'Yar_Server::__construct' => ['void', 'object'=>'Object'], - 'Yar_Server::handle' => ['bool'], - 'Yar_Server_Exception::__clone' => ['void'], - 'Yar_Server_Exception::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Exception|?Throwable'], - 'Yar_Server_Exception::__toString' => ['string'], - 'Yar_Server_Exception::__wakeup' => ['void'], - 'Yar_Server_Exception::getCode' => ['int'], - 'Yar_Server_Exception::getFile' => ['string'], - 'Yar_Server_Exception::getLine' => ['int'], - 'Yar_Server_Exception::getMessage' => ['string'], - 'Yar_Server_Exception::getPrevious' => ['?Exception|?Throwable'], - 'Yar_Server_Exception::getTrace' => ['list\',args?:array}>'], - 'Yar_Server_Exception::getTraceAsString' => ['string'], - 'Yar_Server_Exception::getType' => ['string'], - 'ZMQ::__construct' => ['void'], - 'ZMQContext::__construct' => ['void', 'io_threads='=>'int', 'is_persistent='=>'bool'], - 'ZMQContext::getOpt' => ['int|string', 'key'=>'string'], - 'ZMQContext::getSocket' => ['ZMQSocket', 'type'=>'int', 'persistent_id='=>'string', 'on_new_socket='=>'callable'], - 'ZMQContext::isPersistent' => ['bool'], - 'ZMQContext::setOpt' => ['ZMQContext', 'key'=>'int', 'value'=>'mixed'], - 'ZMQDevice::__construct' => ['void', 'frontend'=>'ZMQSocket', 'backend'=>'ZMQSocket', 'listener='=>'ZMQSocket'], - 'ZMQDevice::getIdleTimeout' => ['ZMQDevice'], - 'ZMQDevice::getTimerTimeout' => ['ZMQDevice'], - 'ZMQDevice::run' => ['void'], - 'ZMQDevice::setIdleCallback' => ['ZMQDevice', 'cb_func'=>'callable', 'timeout'=>'int', 'user_data='=>'mixed'], - 'ZMQDevice::setIdleTimeout' => ['ZMQDevice', 'timeout'=>'int'], - 'ZMQDevice::setTimerCallback' => ['ZMQDevice', 'cb_func'=>'callable', 'timeout'=>'int', 'user_data='=>'mixed'], - 'ZMQDevice::setTimerTimeout' => ['ZMQDevice', 'timeout'=>'int'], - 'ZMQPoll::add' => ['string', 'entry'=>'mixed', 'type'=>'int'], - 'ZMQPoll::clear' => ['ZMQPoll'], - 'ZMQPoll::count' => ['int'], - 'ZMQPoll::getLastErrors' => ['array'], - 'ZMQPoll::poll' => ['int', '&w_readable'=>'array', '&w_writable'=>'array', 'timeout='=>'int'], - 'ZMQPoll::remove' => ['bool', 'item'=>'mixed'], - 'ZMQSocket::__construct' => ['void', 'context'=>'ZMQContext', 'type'=>'int', 'persistent_id='=>'string', 'on_new_socket='=>'callable'], - 'ZMQSocket::bind' => ['ZMQSocket', 'dsn'=>'string', 'force='=>'bool'], - 'ZMQSocket::connect' => ['ZMQSocket', 'dsn'=>'string', 'force='=>'bool'], - 'ZMQSocket::disconnect' => ['ZMQSocket', 'dsn'=>'string'], - 'ZMQSocket::getEndpoints' => ['array'], - 'ZMQSocket::getPersistentId' => ['?string'], - 'ZMQSocket::getSockOpt' => ['int|string', 'key'=>'string'], - 'ZMQSocket::getSocketType' => ['int'], - 'ZMQSocket::isPersistent' => ['bool'], - 'ZMQSocket::recv' => ['string', 'mode='=>'int'], - 'ZMQSocket::recvMulti' => ['string[]', 'mode='=>'int'], - 'ZMQSocket::send' => ['ZMQSocket', 'message'=>'array', 'mode='=>'int'], - 'ZMQSocket::send\'1' => ['ZMQSocket', 'message'=>'string', 'mode='=>'int'], - 'ZMQSocket::sendmulti' => ['ZMQSocket', 'message'=>'array', 'mode='=>'int'], - 'ZMQSocket::setSockOpt' => ['ZMQSocket', 'key'=>'int', 'value'=>'mixed'], - 'ZMQSocket::unbind' => ['ZMQSocket', 'dsn'=>'string'], - 'ZendAPI_Job::ZendAPI_Job' => ['Job', 'script'=>'script'], - 'ZendAPI_Job::addJobToQueue' => ['int', 'jobqueue_url'=>'string', 'password'=>'string'], - 'ZendAPI_Job::getApplicationID' => [''], - 'ZendAPI_Job::getEndTime' => [''], - 'ZendAPI_Job::getGlobalVariables' => [''], - 'ZendAPI_Job::getHost' => [''], - 'ZendAPI_Job::getID' => [''], - 'ZendAPI_Job::getInterval' => [''], - 'ZendAPI_Job::getJobDependency' => [''], - 'ZendAPI_Job::getJobName' => [''], - 'ZendAPI_Job::getJobPriority' => [''], - 'ZendAPI_Job::getJobStatus' => ['int'], - 'ZendAPI_Job::getLastPerformedStatus' => ['int'], - 'ZendAPI_Job::getOutput' => ['An'], - 'ZendAPI_Job::getPreserved' => [''], - 'ZendAPI_Job::getProperties' => ['array'], - 'ZendAPI_Job::getScheduledTime' => [''], - 'ZendAPI_Job::getScript' => [''], - 'ZendAPI_Job::getTimeToNextRepeat' => ['int'], - 'ZendAPI_Job::getUserVariables' => [''], - 'ZendAPI_Job::setApplicationID' => ['', 'app_id'=>''], - 'ZendAPI_Job::setGlobalVariables' => ['', 'vars'=>''], - 'ZendAPI_Job::setJobDependency' => ['', 'job_id'=>''], - 'ZendAPI_Job::setJobName' => ['', 'name'=>''], - 'ZendAPI_Job::setJobPriority' => ['', 'priority'=>'int'], - 'ZendAPI_Job::setPreserved' => ['', 'preserved'=>''], - 'ZendAPI_Job::setRecurrenceData' => ['', 'interval'=>'', 'end_time='=>'mixed'], - 'ZendAPI_Job::setScheduledTime' => ['', 'timestamp'=>''], - 'ZendAPI_Job::setScript' => ['', 'script'=>''], - 'ZendAPI_Job::setUserVariables' => ['', 'vars'=>''], - 'ZendAPI_Queue::addJob' => ['int', '&job'=>'Job'], - 'ZendAPI_Queue::getAllApplicationIDs' => ['array'], - 'ZendAPI_Queue::getAllhosts' => ['array'], - 'ZendAPI_Queue::getHistoricJobs' => ['array', 'status'=>'int', 'start_time'=>'', 'end_time'=>'', 'index'=>'int', 'count'=>'int', '&total'=>'int'], - 'ZendAPI_Queue::getJob' => ['Job', 'job_id'=>'int'], - 'ZendAPI_Queue::getJobsInQueue' => ['array', 'filter_options='=>'array', 'max_jobs='=>'int', 'with_globals_and_output='=>'bool'], - 'ZendAPI_Queue::getLastError' => ['string'], - 'ZendAPI_Queue::getNumOfJobsInQueue' => ['int', 'filter_options='=>'array'], - 'ZendAPI_Queue::getStatistics' => ['array'], - 'ZendAPI_Queue::isScriptExists' => ['bool', 'path'=>'string'], - 'ZendAPI_Queue::isSuspend' => ['bool'], - 'ZendAPI_Queue::login' => ['bool', 'password'=>'string', 'application_id='=>'int'], - 'ZendAPI_Queue::removeJob' => ['bool', 'job_id'=>'array|int'], - 'ZendAPI_Queue::requeueJob' => ['bool', 'job'=>'Job'], - 'ZendAPI_Queue::resumeJob' => ['bool', 'job_id'=>'array|int'], - 'ZendAPI_Queue::resumeQueue' => ['bool'], - 'ZendAPI_Queue::setMaxHistoryTime' => ['bool'], - 'ZendAPI_Queue::suspendJob' => ['bool', 'job_id'=>'array|int'], - 'ZendAPI_Queue::suspendQueue' => ['bool'], - 'ZendAPI_Queue::updateJob' => ['int', '&job'=>'Job'], - 'ZendAPI_Queue::zendapi_queue' => ['ZendAPI_Queue', 'queue_url'=>'string'], - 'ZipArchive::addEmptyDir' => ['bool', 'dirname'=>'string'], - 'ZipArchive::addFile' => ['bool', 'filepath'=>'string', 'entryname='=>'string', 'start='=>'int', 'length='=>'int'], - 'ZipArchive::addFromString' => ['bool', 'entryname'=>'string', 'content'=>'string'], - 'ZipArchive::addGlob' => ['bool', 'pattern'=>'string', 'flags='=>'int', 'options='=>'array'], - 'ZipArchive::addPattern' => ['bool', 'pattern'=>'string', 'path='=>'string', 'options='=>'array'], - 'ZipArchive::close' => ['bool'], - 'ZipArchive::createEmptyDir' => ['bool', 'dirname'=>'string'], - 'ZipArchive::deleteIndex' => ['bool', 'index'=>'int'], - 'ZipArchive::deleteName' => ['bool', 'name'=>'string'], - 'ZipArchive::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string[]|string'], - 'ZipArchive::getArchiveComment' => ['string|false', 'flags='=>'int'], - 'ZipArchive::getCommentIndex' => ['string|false', 'index'=>'int', 'flags='=>'int'], - 'ZipArchive::getCommentName' => ['string|false', 'name'=>'string', 'flags='=>'int'], - 'ZipArchive::getExternalAttributesIndex' => ['bool', 'index'=>'int', '&w_opsys'=>'int', '&w_attr'=>'int', 'flags='=>'int'], - 'ZipArchive::getExternalAttributesName' => ['bool', 'name'=>'string', '&w_opsys'=>'int', '&w_attr'=>'int', 'flags='=>'int'], - 'ZipArchive::getFromIndex' => ['string|false', 'index'=>'int', 'length='=>'int', 'flags='=>'int'], - 'ZipArchive::getFromName' => ['string|false', 'entryname'=>'string', 'length='=>'int', 'flags='=>'int'], - 'ZipArchive::getNameIndex' => ['string|false', 'index'=>'int', 'flags='=>'int'], - 'ZipArchive::getStatusString' => ['string|false'], - 'ZipArchive::getStream' => ['resource|false', 'entryname'=>'string'], - 'ZipArchive::isCompressionMethodSupported' => ['bool', 'method'=>'int', 'encode='=>'bool'], - 'ZipArchive::isEncryptionMethodSupported' => ['bool', 'method'=>'int', 'encode='=>'bool'], - 'ZipArchive::locateName' => ['int|false', 'filename'=>'string', 'flags='=>'int'], - 'ZipArchive::open' => ['int|bool', 'source'=>'string', 'flags='=>'int'], - 'ZipArchive::registerCancelCallback' => ['bool', 'callback'=>'callable'], - 'ZipArchive::registerProgressCallback' => ['bool', 'rate'=>'float', 'callback'=>'callable'], - 'ZipArchive::renameIndex' => ['bool', 'index'=>'int', 'new_name'=>'string'], - 'ZipArchive::renameName' => ['bool', 'name'=>'string', 'new_name'=>'string'], - 'ZipArchive::replaceFile' => ['bool', 'filename'=>'string', 'index'=>'int', 'start='=>'int', 'length='=>'int', 'flags='=>'int'], - 'ZipArchive::setArchiveComment' => ['bool', 'comment'=>'string'], - 'ZipArchive::setCommentIndex' => ['bool', 'index'=>'int', 'comment'=>'string'], - 'ZipArchive::setCommentName' => ['bool', 'name'=>'string', 'comment'=>'string'], - 'ZipArchive::setCompressionIndex' => ['bool', 'index'=>'int', 'comp_method'=>'int', 'comp_flags='=>'int'], - 'ZipArchive::setCompressionName' => ['bool', 'name'=>'string', 'comp_method'=>'int', 'comp_flags='=>'int'], - 'ZipArchive::setExternalAttributesIndex' => ['bool', 'index'=>'int', 'opsys'=>'int', 'attr'=>'int', 'flags='=>'int'], - 'ZipArchive::setExternalAttributesName' => ['bool', 'name'=>'string', 'opsys'=>'int', 'attr'=>'int', 'flags='=>'int'], - 'ZipArchive::setMtimeIndex' => ['bool', 'index'=>'int', 'timestamp'=>'int', 'flags='=>'int'], - 'ZipArchive::setMtimeName' => ['bool', 'name'=>'string', 'timestamp'=>'int', 'flags='=>'int'], - 'ZipArchive::setPassword' => ['bool', 'password'=>'string'], - 'ZipArchive::statIndex' => ['array|false', 'index'=>'int', 'flags='=>'int'], - 'ZipArchive::statName' => ['array|false', 'filename'=>'string', 'flags='=>'int'], - 'ZipArchive::unchangeAll' => ['bool'], - 'ZipArchive::unchangeArchive' => ['bool'], - 'ZipArchive::unchangeIndex' => ['bool', 'index'=>'int'], - 'ZipArchive::unchangeName' => ['bool', 'name'=>'string'], - 'Zookeeper::addAuth' => ['bool', 'scheme'=>'string', 'cert'=>'string', 'completion_cb='=>'callable'], - 'Zookeeper::close' => ['void'], - 'Zookeeper::connect' => ['void', 'host'=>'string', 'watcher_cb='=>'callable', 'recv_timeout='=>'int'], - 'Zookeeper::create' => ['string', 'path'=>'string', 'value'=>'string', 'acls'=>'array', 'flags='=>'int'], - 'Zookeeper::delete' => ['bool', 'path'=>'string', 'version='=>'int'], - 'Zookeeper::exists' => ['bool', 'path'=>'string', 'watcher_cb='=>'callable'], - 'Zookeeper::get' => ['string', 'path'=>'string', 'watcher_cb='=>'callable', 'stat='=>'array', 'max_size='=>'int'], - 'Zookeeper::getAcl' => ['array', 'path'=>'string'], - 'Zookeeper::getChildren' => ['array|false', 'path'=>'string', 'watcher_cb='=>'callable'], - 'Zookeeper::getClientId' => ['int'], - 'Zookeeper::getConfig' => ['ZookeeperConfig'], - 'Zookeeper::getRecvTimeout' => ['int'], - 'Zookeeper::getState' => ['int'], - 'Zookeeper::isRecoverable' => ['bool'], - 'Zookeeper::set' => ['bool', 'path'=>'string', 'value'=>'string', 'version='=>'int', 'stat='=>'array'], - 'Zookeeper::setAcl' => ['bool', 'path'=>'string', 'version'=>'int', 'acl'=>'array'], - 'Zookeeper::setDebugLevel' => ['bool', 'logLevel'=>'int'], - 'Zookeeper::setDeterministicConnOrder' => ['bool', 'yesOrNo'=>'bool'], - 'Zookeeper::setLogStream' => ['bool', 'stream'=>'resource'], - 'Zookeeper::setWatcher' => ['bool', 'watcher_cb'=>'callable'], - 'ZookeeperConfig::add' => ['void', 'members'=>'string', 'version='=>'int', 'stat='=>'array'], - 'ZookeeperConfig::get' => ['string', 'watcher_cb='=>'callable', 'stat='=>'array'], - 'ZookeeperConfig::remove' => ['void', 'id_list'=>'string', 'version='=>'int', 'stat='=>'array'], - 'ZookeeperConfig::set' => ['void', 'members'=>'string', 'version='=>'int', 'stat='=>'array'], - '_' => ['string', 'message'=>'string'], - '__halt_compiler' => ['void'], - 'abs' => ['0|positive-int', 'num'=>'int'], - 'abs\'1' => ['float', 'num'=>'float'], - 'abs\'2' => ['numeric', 'num'=>'numeric'], - 'accelerator_get_configuration' => ['array'], - 'accelerator_get_scripts' => ['array'], - 'accelerator_get_status' => ['array', 'fetch_scripts'=>'bool'], - 'accelerator_reset' => [''], - 'accelerator_set_status' => ['void', 'status'=>'bool'], - 'acos' => ['float', 'num'=>'float'], - 'acosh' => ['float', 'num'=>'float'], - 'addcslashes' => ['string', 'string'=>'string', 'characters'=>'string'], - 'addslashes' => ['string', 'string'=>'string'], - 'apache_child_terminate' => ['bool'], - 'apache_get_modules' => ['array'], - 'apache_get_version' => ['string|false'], - 'apache_getenv' => ['string|false', 'variable'=>'string', 'walk_to_top='=>'bool'], - 'apache_lookup_uri' => ['object', 'filename'=>'string'], - 'apache_note' => ['string|false', 'note_name'=>'string', 'note_value='=>'string'], - 'apache_request_headers' => ['array|false'], - 'apache_reset_timeout' => ['bool'], - 'apache_response_headers' => ['array|false'], - 'apache_setenv' => ['bool', 'variable'=>'string', 'value'=>'string', 'walk_to_top='=>'bool'], - 'apc_add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'ttl='=>'int'], - 'apc_add\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], - 'apc_bin_dump' => ['string|false|null', 'files='=>'array', 'user_vars='=>'array'], - 'apc_bin_dumpfile' => ['int|false', 'files'=>'array', 'user_vars'=>'array', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], - 'apc_bin_load' => ['bool', 'data'=>'string', 'flags='=>'int'], - 'apc_bin_loadfile' => ['bool', 'filename'=>'string', 'context='=>'resource', 'flags='=>'int'], - 'apc_cache_info' => ['array|false', 'cache_type='=>'string', 'limited='=>'bool'], - 'apc_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'], - 'apc_clear_cache' => ['bool', 'cache_type='=>'string'], - 'apc_compile_file' => ['bool', 'filename'=>'string', 'atomic='=>'bool'], - 'apc_dec' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool'], - 'apc_define_constants' => ['bool', 'key'=>'string', 'constants'=>'array', 'case_sensitive='=>'bool'], - 'apc_delete' => ['bool', 'key'=>'string|string[]|APCIterator'], - 'apc_delete_file' => ['bool|string[]', 'keys'=>'mixed'], - 'apc_exists' => ['bool', 'keys'=>'string'], - 'apc_exists\'1' => ['array', 'keys'=>'string[]'], - 'apc_fetch' => ['mixed|false', 'key'=>'string', '&w_success='=>'bool'], - 'apc_fetch\'1' => ['array|false', 'key'=>'string[]', '&w_success='=>'bool'], - 'apc_inc' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool'], - 'apc_load_constants' => ['bool', 'key'=>'string', 'case_sensitive='=>'bool'], - 'apc_sma_info' => ['array|false', 'limited='=>'bool'], - 'apc_store' => ['bool', 'key'=>'string', 'var'=>'', 'ttl='=>'int'], - 'apc_store\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], - 'apcu_add' => ['bool', 'key'=>'string', 'var'=>'', 'ttl='=>'int'], - 'apcu_add\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], - 'apcu_cache_info' => ['array|false', 'limited='=>'bool'], - 'apcu_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'], - 'apcu_clear_cache' => ['bool'], - 'apcu_dec' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'], - 'apcu_delete' => ['bool', 'key'=>'string|APCuIterator'], - 'apcu_delete\'1' => ['list', 'key'=>'string[]'], - 'apcu_enabled' => ['bool'], - 'apcu_entry' => ['mixed', 'key'=>'string', 'generator'=>'callable', 'ttl='=>'int'], - 'apcu_exists' => ['bool', 'keys'=>'string'], - 'apcu_exists\'1' => ['array', 'keys'=>'string[]'], - 'apcu_fetch' => ['mixed|false', 'key'=>'string', '&w_success='=>'bool'], - 'apcu_fetch\'1' => ['array|false', 'key'=>'string[]', '&w_success='=>'bool'], - 'apcu_inc' => ['int|false', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'], - 'apcu_key_info' => ['?array', 'key'=>'string'], - 'apcu_sma_info' => ['array|false', 'limited='=>'bool'], - 'apcu_store' => ['bool', 'key'=>'string', 'var='=>'', 'ttl='=>'int'], - 'apcu_store\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], - 'apd_breakpoint' => ['bool', 'debug_level'=>'int'], - 'apd_callstack' => ['array'], - 'apd_clunk' => ['void', 'warning'=>'string', 'delimiter='=>'string'], - 'apd_continue' => ['bool', 'debug_level'=>'int'], - 'apd_croak' => ['void', 'warning'=>'string', 'delimiter='=>'string'], - 'apd_dump_function_table' => ['void'], - 'apd_dump_persistent_resources' => ['array'], - 'apd_dump_regular_resources' => ['array'], - 'apd_echo' => ['bool', 'output'=>'string'], - 'apd_get_active_symbols' => ['array'], - 'apd_set_pprof_trace' => ['string', 'dump_directory='=>'string', 'fragment='=>'string'], - '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_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_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_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'], - 'array_merge' => ['array', '...arrays'=>'array'], - 'array_merge_recursive' => ['array', '...arrays'=>'array'], - 'array_multisort' => ['bool', '&rw_array'=>'array', 'rest='=>'array|int', 'array1_sort_flags='=>'array|int', '...args='=>'array|int'], - 'array_pad' => ['array', 'array'=>'array', 'length'=>'int', 'value'=>'mixed'], - 'array_pop' => ['mixed', '&rw_array'=>'array'], - 'array_product' => ['int|float', 'array'=>'array'], - 'array_push' => ['int', '&rw_array'=>'array', '...values'=>'mixed'], - 'array_rand' => ['int|string|array|array', 'array'=>'non-empty-array', 'num'=>'int'], - 'array_rand\'1' => ['int|string', 'array'=>'array'], - 'array_reduce' => ['mixed', 'array'=>'array', 'callback'=>'callable(mixed,mixed):mixed', 'initial='=>'mixed'], - 'array_replace' => ['array', 'array'=>'array', '...replacements='=>'array'], - 'array_replace_recursive' => ['array', 'array'=>'array', '...replacements='=>'array'], - 'array_reverse' => ['array', 'array'=>'array', 'preserve_keys='=>'bool'], - 'array_search' => ['int|string|false', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'], - 'array_shift' => ['mixed|null', '&rw_array'=>'array'], - '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_unique' => ['array', 'array'=>'array', 'flags='=>'0'], - 'array_unique\'1' => ['array', 'array'=>'array', 'flags='=>'1'], - 'array_unique\'2' => ['array', 'array'=>'array', 'flags='=>'2|5'], - 'array_unshift' => ['int', '&rw_array'=>'array', '...values'=>'mixed'], - 'array_values' => ['list', 'array'=>'array'], - 'array_walk' => ['bool', '&rw_array'=>'array', 'callback'=>'callable', 'arg='=>'mixed'], - 'array_walk\'1' => ['bool', '&rw_array'=>'object', 'callback'=>'callable', 'arg='=>'mixed'], - 'array_walk_recursive' => ['bool', '&rw_array'=>'array', 'callback'=>'callable', 'arg='=>'mixed'], - 'array_walk_recursive\'1' => ['bool', '&rw_array'=>'object', 'callback'=>'callable', 'arg='=>'mixed'], - 'arsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], - 'asin' => ['float', 'num'=>'float'], - 'asinh' => ['float', 'num'=>'float'], - 'asort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], - 'assert' => ['bool', 'assertion'=>'string|bool|int', 'description='=>'string|Throwable|null'], - 'assert_options' => ['mixed|false', 'option'=>'int', 'value='=>'mixed'], - 'ast\Node::__construct' => ['void', 'kind='=>'int', 'flags='=>'int', 'children='=>'ast\Node\Decl[]|ast\Node[]|int[]|string[]|float[]|bool[]|null[]', 'start_line='=>'int'], - 'ast\get_kind_name' => ['string', 'kind'=>'int'], - 'ast\get_metadata' => ['array'], - 'ast\get_supported_versions' => ['array', 'exclude_deprecated='=>'bool'], - 'ast\kind_uses_flags' => ['bool', 'kind'=>'int'], - 'ast\parse_code' => ['ast\Node', 'code'=>'string', 'version'=>'int', 'filename='=>'string'], - 'ast\parse_file' => ['ast\Node', 'filename'=>'string', 'version'=>'int'], - 'atan' => ['float', 'num'=>'float'], - 'atan2' => ['float', 'y'=>'float', 'x'=>'float'], - 'atanh' => ['float', 'num'=>'float'], - 'base64_decode' => ['string|false', 'string'=>'string', 'strict='=>'bool'], - 'base64_encode' => ['string', 'string'=>'string'], - 'base_convert' => ['string', 'num'=>'string', 'from_base'=>'int', 'to_base'=>'int'], - 'basename' => ['string', 'path'=>'string', 'suffix='=>'string'], - 'bbcode_add_element' => ['bool', 'bbcode_container'=>'resource', 'tag_name'=>'string', 'tag_rules'=>'array'], - 'bbcode_add_smiley' => ['bool', 'bbcode_container'=>'resource', 'smiley'=>'string', 'replace_by'=>'string'], - 'bbcode_create' => ['resource', 'bbcode_initial_tags='=>'array'], - 'bbcode_destroy' => ['bool', 'bbcode_container'=>'resource'], - 'bbcode_parse' => ['string', 'bbcode_container'=>'resource', 'to_parse'=>'string'], - 'bbcode_set_arg_parser' => ['bool', 'bbcode_container'=>'resource', 'bbcode_arg_parser'=>'resource'], - 'bbcode_set_flags' => ['bool', 'bbcode_container'=>'resource', 'flags'=>'int', 'mode='=>'int'], - 'bcadd' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], - 'bccomp' => ['int', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], - 'bcdiv' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int'], - 'bcmod' => ['numeric-string|null', 'dividend'=>'numeric-string', 'divisor'=>'numeric-string', 'scale='=>'int'], - 'bcmul' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], - 'bcompiler_load' => ['bool', 'filename'=>'string'], - 'bcompiler_load_exe' => ['bool', 'filename'=>'string'], - 'bcompiler_parse_class' => ['bool', 'class'=>'string', 'callback'=>'string'], - 'bcompiler_read' => ['bool', 'filehandle'=>'resource'], - 'bcompiler_write_class' => ['bool', 'filehandle'=>'resource', 'classname'=>'string', 'extends='=>'string'], - 'bcompiler_write_constant' => ['bool', 'filehandle'=>'resource', 'constantname'=>'string'], - 'bcompiler_write_exe_footer' => ['bool', 'filehandle'=>'resource', 'startpos'=>'int'], - 'bcompiler_write_file' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], - 'bcompiler_write_footer' => ['bool', 'filehandle'=>'resource'], - 'bcompiler_write_function' => ['bool', 'filehandle'=>'resource', 'functionname'=>'string'], - 'bcompiler_write_functions_from_file' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], - 'bcompiler_write_header' => ['bool', 'filehandle'=>'resource', 'write_ver='=>'string'], - 'bcompiler_write_included_filename' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'], - 'bcpow' => ['numeric-string', 'num'=>'numeric-string', 'exponent'=>'numeric-string', 'scale='=>'int'], - 'bcpowmod' => ['numeric-string|false', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'modulus'=>'numeric-string', 'scale='=>'int'], - 'bcscale' => ['int', 'scale'=>'int'], - 'bcsqrt' => ['numeric-string', 'num'=>'numeric-string', 'scale='=>'int'], - 'bcsub' => ['numeric-string', 'num1'=>'numeric-string', 'num2'=>'numeric-string', 'scale='=>'int'], - 'bin2hex' => ['string', 'string'=>'string'], - 'bind_textdomain_codeset' => ['string', 'domain'=>'string', 'codeset'=>'string'], - 'bindec' => ['float|int', 'binary_string'=>'string'], - 'bindtextdomain' => ['string', 'domain'=>'string', 'directory'=>'string'], - 'birdstep_autocommit' => ['bool', 'index'=>'int'], - 'birdstep_close' => ['bool', 'id'=>'int'], - 'birdstep_commit' => ['bool', 'index'=>'int'], - 'birdstep_connect' => ['int', 'server'=>'string', 'user'=>'string', 'pass'=>'string'], - 'birdstep_exec' => ['int', 'index'=>'int', 'exec_str'=>'string'], - 'birdstep_fetch' => ['bool', 'index'=>'int'], - 'birdstep_fieldname' => ['string', 'index'=>'int', 'col'=>'int'], - 'birdstep_fieldnum' => ['int', 'index'=>'int'], - 'birdstep_freeresult' => ['bool', 'index'=>'int'], - 'birdstep_off_autocommit' => ['bool', 'index'=>'int'], - 'birdstep_result' => ['', 'index'=>'int', 'col'=>''], - 'birdstep_rollback' => ['bool', 'index'=>'int'], - 'blenc_encrypt' => ['string', 'plaintext'=>'string', 'encodedfile'=>'string', 'encryption_key='=>'string'], - 'boolval' => ['bool', 'value'=>'mixed'], - 'bson_decode' => ['array', 'bson'=>'string'], - 'bson_encode' => ['string', 'anything'=>'mixed'], - 'bzclose' => ['bool', 'bz'=>'resource'], - 'bzcompress' => ['string|int', 'data'=>'string', 'block_size='=>'int', 'work_factor='=>'int'], - 'bzdecompress' => ['string|int', 'data'=>'string', 'use_less_memory='=>'int'], - 'bzerrno' => ['int', 'bz'=>'resource'], - 'bzerror' => ['array', 'bz'=>'resource'], - 'bzerrstr' => ['string', 'bz'=>'resource'], - 'bzflush' => ['bool', 'bz'=>'resource'], - 'bzopen' => ['resource|false', 'file'=>'string|resource', 'mode'=>'string'], - 'bzread' => ['string|false', 'bz'=>'resource', 'length='=>'int'], - 'bzwrite' => ['int|false', 'bz'=>'resource', 'data'=>'string', 'length='=>'int'], - 'cairo_append_path' => ['', 'path'=>'cairopath', 'context'=>'cairocontext'], - 'cairo_arc' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], - 'cairo_arc_negative' => ['', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'angle1'=>'float', 'angle2'=>'float', 'context'=>'cairocontext'], - 'cairo_available_fonts' => ['array'], - 'cairo_available_surfaces' => ['array'], - 'cairo_clip' => ['', 'context'=>'cairocontext'], - 'cairo_clip_extents' => ['array', 'context'=>'cairocontext'], - 'cairo_clip_preserve' => ['', 'context'=>'cairocontext'], - 'cairo_clip_rectangle_list' => ['array', 'context'=>'cairocontext'], - 'cairo_close_path' => ['', 'context'=>'cairocontext'], - 'cairo_copy_page' => ['', 'context'=>'cairocontext'], - 'cairo_copy_path' => ['CairoPath', 'context'=>'cairocontext'], - 'cairo_copy_path_flat' => ['CairoPath', 'context'=>'cairocontext'], - 'cairo_create' => ['CairoContext', 'surface'=>'cairosurface'], - 'cairo_curve_to' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float', 'context'=>'cairocontext'], - 'cairo_device_to_user' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], - 'cairo_device_to_user_distance' => ['array', 'x'=>'float', 'y'=>'float', 'context'=>'cairocontext'], - 'cairo_fill' => ['', 'context'=>'cairocontext'], - 'cairo_fill_extents' => ['array', 'context'=>'cairocontext'], - 'cairo_fill_preserve' => ['', 'context'=>'cairocontext'], - 'cairo_font_extents' => ['array', 'context'=>'cairocontext'], - 'cairo_font_face_get_type' => ['int', 'fontface'=>'cairofontface'], - 'cairo_font_face_status' => ['int', 'fontface'=>'cairofontface'], - 'cairo_font_options_create' => ['CairoFontOptions'], - 'cairo_font_options_equal' => ['bool', 'options'=>'cairofontoptions', 'other'=>'cairofontoptions'], - 'cairo_font_options_get_antialias' => ['int', 'options'=>'cairofontoptions'], - 'cairo_font_options_get_hint_metrics' => ['int', 'options'=>'cairofontoptions'], - 'cairo_font_options_get_hint_style' => ['int', 'options'=>'cairofontoptions'], - 'cairo_font_options_get_subpixel_order' => ['int', 'options'=>'cairofontoptions'], - 'cairo_font_options_hash' => ['int', 'options'=>'cairofontoptions'], - 'cairo_font_options_merge' => ['void', 'options'=>'cairofontoptions', 'other'=>'cairofontoptions'], - 'cairo_font_options_set_antialias' => ['void', 'options'=>'cairofontoptions', 'antialias'=>'int'], - 'cairo_font_options_set_hint_metrics' => ['void', 'options'=>'cairofontoptions', 'hint_metrics'=>'int'], - 'cairo_font_options_set_hint_style' => ['void', 'options'=>'cairofontoptions', 'hint_style'=>'int'], - 'cairo_font_options_set_subpixel_order' => ['void', 'options'=>'cairofontoptions', 'subpixel_order'=>'int'], - 'cairo_font_options_status' => ['int', 'options'=>'cairofontoptions'], - 'cairo_format_stride_for_width' => ['int', 'format'=>'int', 'width'=>'int'], - 'cairo_get_antialias' => ['int', 'context'=>'cairocontext'], - 'cairo_get_current_point' => ['array', 'context'=>'cairocontext'], - 'cairo_get_dash' => ['array', 'context'=>'cairocontext'], - 'cairo_get_dash_count' => ['int', 'context'=>'cairocontext'], - 'cairo_get_fill_rule' => ['int', 'context'=>'cairocontext'], - 'cairo_get_font_face' => ['', 'context'=>'cairocontext'], - 'cairo_get_font_matrix' => ['', 'context'=>'cairocontext'], - 'cairo_get_font_options' => ['', 'context'=>'cairocontext'], - 'cairo_get_group_target' => ['', 'context'=>'cairocontext'], - 'cairo_get_line_cap' => ['int', 'context'=>'cairocontext'], - 'cairo_get_line_join' => ['int', 'context'=>'cairocontext'], - 'cairo_get_line_width' => ['float', 'context'=>'cairocontext'], - 'cairo_get_matrix' => ['', 'context'=>'cairocontext'], - 'cairo_get_miter_limit' => ['float', 'context'=>'cairocontext'], - 'cairo_get_operator' => ['int', 'context'=>'cairocontext'], - 'cairo_get_scaled_font' => ['', 'context'=>'cairocontext'], - 'cairo_get_source' => ['', 'context'=>'cairocontext'], - 'cairo_get_target' => ['', 'context'=>'cairocontext'], - 'cairo_get_tolerance' => ['float', 'context'=>'cairocontext'], - 'cairo_glyph_path' => ['', 'glyphs'=>'array', 'context'=>'cairocontext'], - 'cairo_has_current_point' => ['bool', 'context'=>'cairocontext'], - 'cairo_identity_matrix' => ['', 'context'=>'cairocontext'], - 'cairo_image_surface_create' => ['CairoImageSurface', 'format'=>'int', 'width'=>'int', 'height'=>'int'], - 'cairo_image_surface_create_for_data' => ['CairoImageSurface', 'data'=>'string', 'format'=>'int', 'width'=>'int', 'height'=>'int', 'stride='=>'int'], - 'cairo_image_surface_create_from_png' => ['CairoImageSurface', 'file'=>'string'], - 'cairo_image_surface_get_data' => ['string', 'surface'=>'cairoimagesurface'], - 'cairo_image_surface_get_format' => ['int', 'surface'=>'cairoimagesurface'], - 'cairo_image_surface_get_height' => ['int', 'surface'=>'cairoimagesurface'], - 'cairo_image_surface_get_stride' => ['int', 'surface'=>'cairoimagesurface'], - 'cairo_image_surface_get_width' => ['int', 'surface'=>'cairoimagesurface'], - 'cairo_in_fill' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'cairo_in_stroke' => ['bool', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'cairo_line_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'cairo_mask' => ['', 'pattern'=>'cairopattern', 'context'=>'cairocontext'], - 'cairo_mask_surface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], - 'cairo_matrix_create_scale' => ['object', 'sx'=>'float', 'sy'=>'float'], - 'cairo_matrix_init' => ['object', 'xx='=>'float', 'yx='=>'float', 'xy='=>'float', 'yy='=>'float', 'x0='=>'float', 'y0='=>'float'], - 'cairo_matrix_init_identity' => ['object'], - 'cairo_matrix_init_rotate' => ['object', 'radians'=>'float'], - 'cairo_matrix_init_scale' => ['object', 'sx'=>'float', 'sy'=>'float'], - 'cairo_matrix_init_translate' => ['object', 'tx'=>'float', 'ty'=>'float'], - 'cairo_matrix_invert' => ['void', 'matrix'=>'cairomatrix'], - 'cairo_matrix_multiply' => ['CairoMatrix', 'matrix1'=>'cairomatrix', 'matrix2'=>'cairomatrix'], - 'cairo_matrix_rotate' => ['', 'matrix'=>'cairomatrix', 'radians'=>'float'], - 'cairo_matrix_scale' => ['', 'sx'=>'float', 'sy'=>'float', 'context'=>'cairocontext'], - 'cairo_matrix_transform_distance' => ['array', 'matrix'=>'cairomatrix', 'dx'=>'float', 'dy'=>'float'], - 'cairo_matrix_transform_point' => ['array', 'matrix'=>'cairomatrix', 'dx'=>'float', 'dy'=>'float'], - 'cairo_matrix_translate' => ['void', 'matrix'=>'cairomatrix', 'tx'=>'float', 'ty'=>'float'], - 'cairo_move_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'cairo_new_path' => ['', 'context'=>'cairocontext'], - 'cairo_new_sub_path' => ['', 'context'=>'cairocontext'], - 'cairo_paint' => ['', 'context'=>'cairocontext'], - 'cairo_paint_with_alpha' => ['', 'alpha'=>'string', 'context'=>'cairocontext'], - 'cairo_path_extents' => ['array', 'context'=>'cairocontext'], - 'cairo_pattern_add_color_stop_rgb' => ['void', 'pattern'=>'cairogradientpattern', 'offset'=>'float', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'cairo_pattern_add_color_stop_rgba' => ['void', 'pattern'=>'cairogradientpattern', 'offset'=>'float', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha'=>'float'], - 'cairo_pattern_create_for_surface' => ['CairoPattern', 'surface'=>'cairosurface'], - 'cairo_pattern_create_linear' => ['CairoPattern', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float'], - 'cairo_pattern_create_radial' => ['CairoPattern', 'x0'=>'float', 'y0'=>'float', 'r0'=>'float', 'x1'=>'float', 'y1'=>'float', 'r1'=>'float'], - 'cairo_pattern_create_rgb' => ['CairoPattern', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'cairo_pattern_create_rgba' => ['CairoPattern', 'red'=>'float', 'green'=>'float', 'blue'=>'float', 'alpha'=>'float'], - 'cairo_pattern_get_color_stop_count' => ['int', 'pattern'=>'cairogradientpattern'], - 'cairo_pattern_get_color_stop_rgba' => ['array', 'pattern'=>'cairogradientpattern', 'index'=>'int'], - 'cairo_pattern_get_extend' => ['int', 'pattern'=>'string'], - 'cairo_pattern_get_filter' => ['int', 'pattern'=>'cairosurfacepattern'], - 'cairo_pattern_get_linear_points' => ['array', 'pattern'=>'cairolineargradient'], - 'cairo_pattern_get_matrix' => ['CairoMatrix', 'pattern'=>'cairopattern'], - 'cairo_pattern_get_radial_circles' => ['array', 'pattern'=>'cairoradialgradient'], - 'cairo_pattern_get_rgba' => ['array', 'pattern'=>'cairosolidpattern'], - 'cairo_pattern_get_surface' => ['CairoSurface', 'pattern'=>'cairosurfacepattern'], - 'cairo_pattern_get_type' => ['int', 'pattern'=>'cairopattern'], - 'cairo_pattern_set_extend' => ['void', 'pattern'=>'string', 'extend'=>'string'], - 'cairo_pattern_set_filter' => ['void', 'pattern'=>'cairosurfacepattern', 'filter'=>'int'], - 'cairo_pattern_set_matrix' => ['void', 'pattern'=>'cairopattern', 'matrix'=>'cairomatrix'], - 'cairo_pattern_status' => ['int', 'pattern'=>'cairopattern'], - 'cairo_pdf_surface_create' => ['CairoPdfSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], - 'cairo_pdf_surface_set_size' => ['void', 'surface'=>'cairopdfsurface', 'width'=>'float', 'height'=>'float'], - 'cairo_pop_group' => ['', 'context'=>'cairocontext'], - 'cairo_pop_group_to_source' => ['', 'context'=>'cairocontext'], - 'cairo_ps_get_levels' => ['array'], - 'cairo_ps_level_to_string' => ['string', 'level'=>'int'], - 'cairo_ps_surface_create' => ['CairoPsSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], - 'cairo_ps_surface_dsc_begin_page_setup' => ['void', 'surface'=>'cairopssurface'], - 'cairo_ps_surface_dsc_begin_setup' => ['void', 'surface'=>'cairopssurface'], - 'cairo_ps_surface_dsc_comment' => ['void', 'surface'=>'cairopssurface', 'comment'=>'string'], - 'cairo_ps_surface_get_eps' => ['bool', 'surface'=>'cairopssurface'], - 'cairo_ps_surface_restrict_to_level' => ['void', 'surface'=>'cairopssurface', 'level'=>'int'], - 'cairo_ps_surface_set_eps' => ['void', 'surface'=>'cairopssurface', 'level'=>'bool'], - 'cairo_ps_surface_set_size' => ['void', 'surface'=>'cairopssurface', 'width'=>'float', 'height'=>'float'], - 'cairo_push_group' => ['', 'context'=>'cairocontext'], - 'cairo_push_group_with_content' => ['', 'content'=>'string', 'context'=>'cairocontext'], - 'cairo_rectangle' => ['', 'x'=>'string', 'y'=>'string', 'width'=>'string', 'height'=>'string', 'context'=>'cairocontext'], - 'cairo_rel_curve_to' => ['', 'x1'=>'string', 'y1'=>'string', 'x2'=>'string', 'y2'=>'string', 'x3'=>'string', 'y3'=>'string', 'context'=>'cairocontext'], - 'cairo_rel_line_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'cairo_rel_move_to' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'cairo_reset_clip' => ['', 'context'=>'cairocontext'], - 'cairo_restore' => ['', 'context'=>'cairocontext'], - 'cairo_rotate' => ['', 'sx'=>'string', 'sy'=>'string', 'context'=>'cairocontext', 'angle'=>'string'], - 'cairo_save' => ['', 'context'=>'cairocontext'], - 'cairo_scale' => ['', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'cairo_scaled_font_create' => ['CairoScaledFont', 'fontface'=>'cairofontface', 'matrix'=>'cairomatrix', 'ctm'=>'cairomatrix', 'fontoptions'=>'cairofontoptions'], - 'cairo_scaled_font_extents' => ['array', 'scaledfont'=>'cairoscaledfont'], - 'cairo_scaled_font_get_ctm' => ['CairoMatrix', 'scaledfont'=>'cairoscaledfont'], - 'cairo_scaled_font_get_font_face' => ['CairoFontFace', 'scaledfont'=>'cairoscaledfont'], - 'cairo_scaled_font_get_font_matrix' => ['CairoFontOptions', 'scaledfont'=>'cairoscaledfont'], - 'cairo_scaled_font_get_font_options' => ['CairoFontOptions', 'scaledfont'=>'cairoscaledfont'], - 'cairo_scaled_font_get_scale_matrix' => ['CairoMatrix', 'scaledfont'=>'cairoscaledfont'], - 'cairo_scaled_font_get_type' => ['int', 'scaledfont'=>'cairoscaledfont'], - 'cairo_scaled_font_glyph_extents' => ['array', 'scaledfont'=>'cairoscaledfont', 'glyphs'=>'array'], - 'cairo_scaled_font_status' => ['int', 'scaledfont'=>'cairoscaledfont'], - 'cairo_scaled_font_text_extents' => ['array', 'scaledfont'=>'cairoscaledfont', 'text'=>'string'], - 'cairo_select_font_face' => ['', 'family'=>'string', 'slant='=>'string', 'weight='=>'string', 'context='=>'cairocontext'], - 'cairo_set_antialias' => ['', 'antialias='=>'string', 'context='=>'cairocontext'], - 'cairo_set_dash' => ['', 'dashes'=>'array', 'offset='=>'string', 'context='=>'cairocontext'], - 'cairo_set_fill_rule' => ['', 'setting'=>'string', 'context'=>'cairocontext'], - 'cairo_set_font_face' => ['', 'fontface'=>'cairofontface', 'context'=>'cairocontext'], - 'cairo_set_font_matrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], - 'cairo_set_font_options' => ['', 'fontoptions'=>'cairofontoptions', 'context'=>'cairocontext'], - 'cairo_set_font_size' => ['', 'size'=>'string', 'context'=>'cairocontext'], - 'cairo_set_line_cap' => ['', 'setting'=>'string', 'context'=>'cairocontext'], - 'cairo_set_line_join' => ['', 'setting'=>'string', 'context'=>'cairocontext'], - 'cairo_set_line_width' => ['', 'width'=>'string', 'context'=>'cairocontext'], - 'cairo_set_matrix' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], - 'cairo_set_miter_limit' => ['', 'limit'=>'string', 'context'=>'cairocontext'], - 'cairo_set_operator' => ['', 'setting'=>'string', 'context'=>'cairocontext'], - 'cairo_set_scaled_font' => ['', 'scaledfont'=>'cairoscaledfont', 'context'=>'cairocontext'], - 'cairo_set_source' => ['', 'red'=>'string', 'green'=>'string', 'blue'=>'string', 'alpha'=>'string', 'context'=>'cairocontext', 'pattern'=>'cairopattern'], - 'cairo_set_source_surface' => ['', 'surface'=>'cairosurface', 'x='=>'string', 'y='=>'string', 'context='=>'cairocontext'], - 'cairo_set_tolerance' => ['', 'tolerance'=>'string', 'context'=>'cairocontext'], - 'cairo_show_page' => ['', 'context'=>'cairocontext'], - 'cairo_show_text' => ['', 'text'=>'string', 'context'=>'cairocontext'], - 'cairo_status' => ['int', 'context'=>'cairocontext'], - 'cairo_status_to_string' => ['string', 'status'=>'int'], - 'cairo_stroke' => ['', 'context'=>'cairocontext'], - 'cairo_stroke_extents' => ['array', 'context'=>'cairocontext'], - 'cairo_stroke_preserve' => ['', 'context'=>'cairocontext'], - 'cairo_surface_copy_page' => ['void', 'surface'=>'cairosurface'], - 'cairo_surface_create_similar' => ['CairoSurface', 'surface'=>'cairosurface', 'content'=>'int', 'width'=>'float', 'height'=>'float'], - 'cairo_surface_finish' => ['void', 'surface'=>'cairosurface'], - 'cairo_surface_flush' => ['void', 'surface'=>'cairosurface'], - 'cairo_surface_get_content' => ['int', 'surface'=>'cairosurface'], - 'cairo_surface_get_device_offset' => ['array', 'surface'=>'cairosurface'], - 'cairo_surface_get_font_options' => ['CairoFontOptions', 'surface'=>'cairosurface'], - 'cairo_surface_get_type' => ['int', 'surface'=>'cairosurface'], - 'cairo_surface_mark_dirty' => ['void', 'surface'=>'cairosurface'], - 'cairo_surface_mark_dirty_rectangle' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], - 'cairo_surface_set_device_offset' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float'], - 'cairo_surface_set_fallback_resolution' => ['void', 'surface'=>'cairosurface', 'x'=>'float', 'y'=>'float'], - 'cairo_surface_show_page' => ['void', 'surface'=>'cairosurface'], - 'cairo_surface_status' => ['int', 'surface'=>'cairosurface'], - 'cairo_surface_write_to_png' => ['void', 'surface'=>'cairosurface', 'stream'=>'resource'], - 'cairo_svg_get_versions' => ['array'], - 'cairo_svg_surface_create' => ['CairoSvgSurface', 'file'=>'string', 'width'=>'float', 'height'=>'float'], - 'cairo_svg_surface_get_versions' => ['array'], - 'cairo_svg_surface_restrict_to_version' => ['void', 'surface'=>'cairosvgsurface', 'version'=>'int'], - 'cairo_svg_version_to_string' => ['string', 'version'=>'int'], - 'cairo_text_extents' => ['array', 'text'=>'string', 'context'=>'cairocontext'], - 'cairo_text_path' => ['', 'string'=>'string', 'context'=>'cairocontext', 'text'=>'string'], - 'cairo_transform' => ['', 'matrix'=>'cairomatrix', 'context'=>'cairocontext'], - 'cairo_translate' => ['', 'tx'=>'string', 'ty'=>'string', 'context'=>'cairocontext', 'x'=>'string', 'y'=>'string'], - 'cairo_user_to_device' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'cairo_user_to_device_distance' => ['array', 'x'=>'string', 'y'=>'string', 'context'=>'cairocontext'], - 'cairo_version' => ['int'], - 'cairo_version_string' => ['string'], - 'cal_days_in_month' => ['int', 'calendar'=>'int', 'month'=>'int', 'year'=>'int'], - 'cal_from_jd' => ['false|array{date:string,month:int,day:int,year:int,dow:int,abbrevdayname:string,dayname:string,abbrevmonth:string,monthname:string}', 'julian_day'=>'int', 'calendar'=>'int'], - 'cal_info' => ['array', 'calendar='=>'int'], - 'cal_to_jd' => ['int', 'calendar'=>'int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], - 'calcul_hmac' => ['string', 'clent'=>'string', 'siretcode'=>'string', 'price'=>'string', 'reference'=>'string', 'validity'=>'string', 'taxation'=>'string', 'devise'=>'string', 'language'=>'string'], - 'calculhmac' => ['string', 'clent'=>'string', 'data'=>'string'], - 'call_user_func' => ['mixed|false', 'callback'=>'callable', '...args='=>'mixed'], - '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'], - 'ceil' => ['float', 'num'=>'float'], - 'chdb::__construct' => ['void', 'pathname'=>'string'], - 'chdb::get' => ['string', 'key'=>'string'], - 'chdb_create' => ['bool', 'pathname'=>'string', 'data'=>'array'], - 'chdir' => ['bool', 'directory'=>'string'], - 'checkdate' => ['bool', 'month'=>'int', 'day'=>'int', 'year'=>'int'], - 'checkdnsrr' => ['bool', 'hostname'=>'string', 'type='=>'string'], - 'chgrp' => ['bool', 'filename'=>'string', 'group'=>'string|int'], - 'chmod' => ['bool', 'filename'=>'string', 'permissions'=>'int'], - 'chop' => ['string', 'string'=>'string', 'characters='=>'string'], - 'chown' => ['bool', 'filename'=>'string', 'user'=>'string|int'], - 'chr' => ['string', 'codepoint'=>'int'], - 'chroot' => ['bool', 'directory'=>'string'], - 'chunk_split' => ['string', 'string'=>'string', 'length='=>'int', 'separator='=>'string'], - 'classObj::__construct' => ['void', 'layer'=>'layerObj', 'class'=>'classObj'], - 'classObj::addLabel' => ['int', 'label'=>'labelObj'], - 'classObj::convertToString' => ['string'], - 'classObj::createLegendIcon' => ['imageObj', 'width'=>'int', 'height'=>'int'], - 'classObj::deletestyle' => ['int', 'index'=>'int'], - 'classObj::drawLegendIcon' => ['int', 'width'=>'int', 'height'=>'int', 'im'=>'imageObj', 'dstX'=>'int', 'dstY'=>'int'], - 'classObj::free' => ['void'], - 'classObj::getExpressionString' => ['string'], - 'classObj::getLabel' => ['labelObj', 'index'=>'int'], - 'classObj::getMetaData' => ['int', 'name'=>'string'], - 'classObj::getStyle' => ['styleObj', 'index'=>'int'], - 'classObj::getTextString' => ['string'], - 'classObj::movestyledown' => ['int', 'index'=>'int'], - 'classObj::movestyleup' => ['int', 'index'=>'int'], - 'classObj::ms_newClassObj' => ['classObj', 'layer'=>'layerObj', 'class'=>'classObj'], - 'classObj::removeLabel' => ['labelObj', 'index'=>'int'], - 'classObj::removeMetaData' => ['int', 'name'=>'string'], - 'classObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'classObj::setExpression' => ['int', 'expression'=>'string'], - 'classObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], - 'classObj::settext' => ['int', 'text'=>'string'], - 'classObj::updateFromString' => ['int', 'snippet'=>'string'], - 'class_alias' => ['bool', 'class'=>'string', 'alias'=>'string', 'autoload='=>'bool'], - 'class_exists' => ['bool', 'class'=>'string', 'autoload='=>'bool'], - 'class_implements' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], - 'class_parents' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], - 'class_uses' => ['array|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'], - 'classkit_import' => ['array', 'filename'=>'string'], - 'classkit_method_add' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int'], - 'classkit_method_copy' => ['bool', 'dclass'=>'string', 'dmethod'=>'string', 'sclass'=>'string', 'smethod='=>'string'], - 'classkit_method_redefine' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int'], - 'classkit_method_remove' => ['bool', 'classname'=>'string', 'methodname'=>'string'], - 'classkit_method_rename' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'newname'=>'string'], - 'clearstatcache' => ['void', 'clear_realpath_cache='=>'bool', 'filename='=>'string'], - 'cli_get_process_title' => ['?string'], - 'cli_set_process_title' => ['bool', 'title'=>'string'], - 'closedir' => ['void', 'dir_handle='=>'resource'], - 'closelog' => ['bool'], - 'clusterObj::convertToString' => ['string'], - 'clusterObj::getFilterString' => ['string'], - 'clusterObj::getGroupString' => ['string'], - 'clusterObj::setFilter' => ['int', 'expression'=>'string'], - 'clusterObj::setGroup' => ['int', 'expression'=>'string'], - 'collator_asort' => ['bool', 'object'=>'collator', '&rw_array'=>'array', 'flags='=>'int'], - 'collator_compare' => ['int', 'object'=>'collator', 'string1'=>'string', 'string2'=>'string'], - 'collator_create' => ['?Collator', 'locale'=>'string'], - 'collator_get_attribute' => ['int|false', 'object'=>'collator', 'attribute'=>'int'], - 'collator_get_error_code' => ['int', 'object'=>'collator'], - 'collator_get_error_message' => ['string', 'object'=>'collator'], - 'collator_get_locale' => ['string', 'object'=>'collator', 'type'=>'int'], - 'collator_get_sort_key' => ['string', 'object'=>'collator', 'string'=>'string'], - 'collator_get_strength' => ['int|false', 'object'=>'collator'], - 'collator_set_attribute' => ['bool', 'object'=>'collator', 'attribute'=>'int', 'value'=>'int'], - 'collator_set_strength' => ['bool', 'object'=>'collator', 'strength'=>'int'], - 'collator_sort' => ['bool', 'object'=>'collator', '&rw_array'=>'array', 'flags='=>'int'], - 'collator_sort_with_sort_keys' => ['bool', 'object'=>'collator', '&rw_array'=>'array'], - 'colorObj::setHex' => ['int', 'hex'=>'string'], - 'colorObj::toHex' => ['string'], - 'com_addref' => [''], - 'com_create_guid' => ['string'], - 'com_event_sink' => ['bool', 'variant'=>'VARIANT', 'sink_object'=>'object', 'sink_interface='=>'mixed'], - 'com_get_active_object' => ['VARIANT', 'prog_id'=>'string', 'codepage='=>'int'], - 'com_isenum' => ['bool', 'com_module'=>'variant'], - 'com_load_typelib' => ['bool', 'typelib_name'=>'string', 'case_insensitive='=>'bool'], - 'com_message_pump' => ['bool', 'timeout_milliseconds='=>'int'], - 'com_print_typeinfo' => ['bool', 'variant'=>'object', 'dispatch_interface='=>'string', 'display_sink='=>'bool'], - 'commonmark\cql::__invoke' => ['', 'root'=>'CommonMark\Node', 'handler'=>'callable'], - 'commonmark\interfaces\ivisitable::accept' => ['void', 'visitor'=>'CommonMark\Interfaces\IVisitor'], - 'commonmark\interfaces\ivisitor::enter' => ['?int|IVisitable', 'visitable'=>'IVisitable'], - 'commonmark\interfaces\ivisitor::leave' => ['?int|IVisitable', 'visitable'=>'IVisitable'], - 'commonmark\node::accept' => ['void', 'visitor'=>'CommonMark\Interfaces\IVisitor'], - 'commonmark\node::appendChild' => ['CommonMark\Node', 'child'=>'CommonMark\Node'], - 'commonmark\node::insertAfter' => ['CommonMark\Node', 'sibling'=>'CommonMark\Node'], - 'commonmark\node::insertBefore' => ['CommonMark\Node', 'sibling'=>'CommonMark\Node'], - 'commonmark\node::prependChild' => ['CommonMark\Node', 'child'=>'CommonMark\Node'], - 'commonmark\node::replace' => ['CommonMark\Node', 'target'=>'CommonMark\Node'], - 'commonmark\node::unlink' => ['void'], - 'commonmark\parse' => ['CommonMark\Node', 'content'=>'string', 'options='=>'int'], - 'commonmark\parser::finish' => ['CommonMark\Node'], - 'commonmark\parser::parse' => ['void', 'buffer'=>'string'], - 'commonmark\render' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], - 'commonmark\render\html' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int'], - 'commonmark\render\latex' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], - 'commonmark\render\man' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], - 'commonmark\render\xml' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int'], - 'compact' => ['array', 'var_name'=>'string|array', '...var_names='=>'string|array'], - 'componere\abstract\definition::addInterface' => ['Componere\Abstract\Definition', 'interface'=>'string'], - 'componere\abstract\definition::addMethod' => ['Componere\Abstract\Definition', 'name'=>'string', 'method'=>'Componere\Method'], - 'componere\abstract\definition::addTrait' => ['Componere\Abstract\Definition', 'trait'=>'string'], - 'componere\abstract\definition::getReflector' => ['ReflectionClass'], - 'componere\cast' => ['object', 'arg1'=>'string', 'object'=>'object'], - 'componere\cast_by_ref' => ['object', 'arg1'=>'string', 'object'=>'object'], - 'componere\definition::addConstant' => ['Componere\Definition', 'name'=>'string', 'value'=>'Componere\Value'], - 'componere\definition::addProperty' => ['Componere\Definition', 'name'=>'string', 'value'=>'Componere\Value'], - 'componere\definition::getClosure' => ['Closure', 'name'=>'string'], - 'componere\definition::getClosures' => ['Closure[]'], - 'componere\definition::isRegistered' => ['bool'], - 'componere\definition::register' => ['void'], - 'componere\method::getReflector' => ['ReflectionMethod'], - 'componere\method::setPrivate' => ['Method'], - 'componere\method::setProtected' => ['Method'], - 'componere\method::setStatic' => ['Method'], - 'componere\patch::apply' => ['void'], - 'componere\patch::derive' => ['Componere\Patch', 'instance'=>'object'], - 'componere\patch::getClosure' => ['Closure', 'name'=>'string'], - 'componere\patch::getClosures' => ['Closure[]'], - 'componere\patch::isApplied' => ['bool'], - 'componere\patch::revert' => ['void'], - 'componere\value::hasDefault' => ['bool'], - 'componere\value::isPrivate' => ['bool'], - 'componere\value::isProtected' => ['bool'], - 'componere\value::isStatic' => ['bool'], - 'componere\value::setPrivate' => ['Value'], - 'componere\value::setProtected' => ['Value'], - 'componere\value::setStatic' => ['Value'], - 'confirm_pdo_ibm_compiled' => [''], - 'connection_aborted' => ['int'], - 'connection_status' => ['int'], - 'connection_timeout' => ['int'], - 'constant' => ['mixed', 'name'=>'string'], - 'convert_cyr_string' => ['string', 'string'=>'string', 'from'=>'string', 'to'=>'string'], - 'convert_uudecode' => ['string', 'string'=>'string'], - 'convert_uuencode' => ['string', 'string'=>'string'], - 'copy' => ['bool', 'from'=>'string', 'to'=>'string', 'context='=>'resource'], - 'cos' => ['float', 'num'=>'float'], - 'cosh' => ['float', 'num'=>'float'], - 'count' => ['int', 'value'=>'Countable|array|SimpleXMLElement|ResourceBundle', 'mode='=>'int'], - 'count_chars' => ['array|false', 'input'=>'string', 'mode='=>'0|1|2'], - 'count_chars\'1' => ['string|false', 'input'=>'string', 'mode='=>'3|4'], - 'crack_check' => ['bool', 'dictionary'=>'', 'password'=>'string'], - 'crack_closedict' => ['bool', 'dictionary='=>'resource'], - 'crack_getlastmessage' => ['string'], - 'crack_opendict' => ['resource|false', 'dictionary'=>'string'], - 'crash' => [''], - 'crc32' => ['int', 'string'=>'string'], - 'create_function' => ['string', 'args'=>'string', 'code'=>'string'], - 'crypt' => ['string', 'string'=>'string', 'salt='=>'string'], - 'ctype_alnum' => ['bool', 'text'=>'string|int'], - 'ctype_alpha' => ['bool', 'text'=>'string|int'], - 'ctype_cntrl' => ['bool', 'text'=>'string|int'], - 'ctype_digit' => ['bool', 'text'=>'string|int'], - 'ctype_graph' => ['bool', 'text'=>'string|int'], - 'ctype_lower' => ['bool', 'text'=>'string|int'], - 'ctype_print' => ['bool', 'text'=>'string|int'], - 'ctype_punct' => ['bool', 'text'=>'string|int'], - 'ctype_space' => ['bool', 'text'=>'string|int'], - 'ctype_upper' => ['bool', 'text'=>'string|int'], - 'ctype_xdigit' => ['bool', 'text'=>'string|int'], - 'cubrid_affected_rows' => ['int', 'req_identifier='=>''], - 'cubrid_bind' => ['bool', 'req_identifier'=>'resource', 'bind_param'=>'int', 'bind_value'=>'mixed', 'bind_value_type='=>'string'], - 'cubrid_client_encoding' => ['string', 'conn_identifier='=>''], - 'cubrid_close' => ['bool', 'conn_identifier='=>''], - 'cubrid_close_prepare' => ['bool', 'req_identifier'=>'resource'], - 'cubrid_close_request' => ['bool', 'req_identifier'=>'resource'], - 'cubrid_col_get' => ['array', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string'], - 'cubrid_col_size' => ['int', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string'], - 'cubrid_column_names' => ['array', 'req_identifier'=>'resource'], - 'cubrid_column_types' => ['array', 'req_identifier'=>'resource'], - 'cubrid_commit' => ['bool', 'conn_identifier'=>'resource'], - 'cubrid_connect' => ['resource', 'host'=>'string', 'port'=>'int', 'dbname'=>'string', 'userid='=>'string', 'passwd='=>'string'], - 'cubrid_connect_with_url' => ['resource', 'conn_url'=>'string', 'userid='=>'string', 'passwd='=>'string'], - 'cubrid_current_oid' => ['string', 'req_identifier'=>'resource'], - 'cubrid_data_seek' => ['bool', 'req_identifier'=>'', 'row_number'=>'int'], - 'cubrid_db_name' => ['string', 'result'=>'array', 'index'=>'int'], - 'cubrid_db_parameter' => ['array', 'conn_identifier'=>'resource'], - 'cubrid_disconnect' => ['bool', 'conn_identifier'=>'resource'], - 'cubrid_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], - 'cubrid_errno' => ['int', 'conn_identifier='=>''], - 'cubrid_error' => ['string', 'connection='=>''], - 'cubrid_error_code' => ['int'], - 'cubrid_error_code_facility' => ['int'], - 'cubrid_error_msg' => ['string'], - 'cubrid_execute' => ['bool', 'conn_identifier'=>'', 'sql'=>'string', 'option='=>'int', 'request_identifier='=>''], - 'cubrid_fetch' => ['mixed', 'result'=>'resource', 'type='=>'int'], - 'cubrid_fetch_array' => ['array', 'result'=>'resource', 'type='=>'int'], - 'cubrid_fetch_assoc' => ['array', 'result'=>'resource'], - 'cubrid_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], - 'cubrid_fetch_lengths' => ['array', 'result'=>'resource'], - 'cubrid_fetch_object' => ['object', 'result'=>'resource', 'class_name='=>'string', 'params='=>'array'], - 'cubrid_fetch_row' => ['array', 'result'=>'resource'], - 'cubrid_field_flags' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'cubrid_field_len' => ['int', 'result'=>'resource', 'field_offset'=>'int'], - 'cubrid_field_name' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'cubrid_field_seek' => ['bool', 'result'=>'resource', 'field_offset='=>'int'], - 'cubrid_field_table' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'cubrid_field_type' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'cubrid_free_result' => ['bool', 'req_identifier'=>'resource'], - 'cubrid_get' => ['mixed', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr='=>'mixed'], - 'cubrid_get_autocommit' => ['bool', 'conn_identifier'=>'resource'], - 'cubrid_get_charset' => ['string', 'conn_identifier'=>'resource'], - 'cubrid_get_class_name' => ['string', 'conn_identifier'=>'resource', 'oid'=>'string'], - 'cubrid_get_client_info' => ['string'], - 'cubrid_get_db_parameter' => ['array', 'conn_identifier'=>'resource'], - 'cubrid_get_query_timeout' => ['int', 'req_identifier'=>'resource'], - 'cubrid_get_server_info' => ['string', 'conn_identifier'=>'resource'], - 'cubrid_insert_id' => ['string', 'conn_identifier='=>'resource'], - 'cubrid_is_instance' => ['int', 'conn_identifier'=>'resource', 'oid'=>'string'], - 'cubrid_list_dbs' => ['array', 'conn_identifier'=>'resource'], - 'cubrid_load_from_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string', 'file_name'=>'string'], - 'cubrid_lob2_bind' => ['bool', 'req_identifier'=>'resource', 'bind_index'=>'int', 'bind_value'=>'mixed', 'bind_value_type='=>'string'], - 'cubrid_lob2_close' => ['bool', 'lob_identifier'=>'resource'], - 'cubrid_lob2_export' => ['bool', 'lob_identifier'=>'resource', 'file_name'=>'string'], - 'cubrid_lob2_import' => ['bool', 'lob_identifier'=>'resource', 'file_name'=>'string'], - 'cubrid_lob2_new' => ['resource', 'conn_identifier='=>'resource', 'type='=>'string'], - 'cubrid_lob2_read' => ['string', 'lob_identifier'=>'resource', 'length'=>'int'], - 'cubrid_lob2_seek' => ['bool', 'lob_identifier'=>'resource', 'offset'=>'int', 'origin='=>'int'], - 'cubrid_lob2_seek64' => ['bool', 'lob_identifier'=>'resource', 'offset'=>'string', 'origin='=>'int'], - 'cubrid_lob2_size' => ['int', 'lob_identifier'=>'resource'], - 'cubrid_lob2_size64' => ['string', 'lob_identifier'=>'resource'], - 'cubrid_lob2_tell' => ['int', 'lob_identifier'=>'resource'], - 'cubrid_lob2_tell64' => ['string', 'lob_identifier'=>'resource'], - 'cubrid_lob2_write' => ['bool', 'lob_identifier'=>'resource', 'buf'=>'string'], - 'cubrid_lob_close' => ['bool', 'lob_identifier_array'=>'array'], - 'cubrid_lob_export' => ['bool', 'conn_identifier'=>'resource', 'lob_identifier'=>'resource', 'path_name'=>'string'], - 'cubrid_lob_get' => ['array', 'conn_identifier'=>'resource', 'sql'=>'string'], - 'cubrid_lob_send' => ['bool', 'conn_identifier'=>'resource', 'lob_identifier'=>'resource'], - 'cubrid_lob_size' => ['string', 'lob_identifier'=>'resource'], - 'cubrid_lock_read' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], - 'cubrid_lock_write' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string'], - 'cubrid_move_cursor' => ['int', 'req_identifier'=>'resource', 'offset'=>'int', 'origin='=>'int'], - 'cubrid_new_glo' => ['string', 'conn_identifier'=>'', 'class_name'=>'string', 'file_name'=>'string'], - 'cubrid_next_result' => ['bool', 'result'=>'resource'], - 'cubrid_num_cols' => ['int', 'req_identifier'=>'resource'], - 'cubrid_num_fields' => ['int', 'result'=>'resource'], - 'cubrid_num_rows' => ['int', 'req_identifier'=>'resource'], - 'cubrid_pconnect' => ['resource', 'host'=>'string', 'port'=>'int', 'dbname'=>'string', 'userid='=>'string', 'passwd='=>'string'], - 'cubrid_pconnect_with_url' => ['resource', 'conn_url'=>'string', 'userid='=>'string', 'passwd='=>'string'], - 'cubrid_ping' => ['bool', 'conn_identifier='=>''], - 'cubrid_prepare' => ['resource', 'conn_identifier'=>'resource', 'prepare_stmt'=>'string', 'option='=>'int'], - 'cubrid_put' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr='=>'string', 'value='=>'mixed'], - 'cubrid_query' => ['resource', 'query'=>'string', 'conn_identifier='=>''], - 'cubrid_real_escape_string' => ['string', 'unescaped_string'=>'string', 'conn_identifier='=>''], - 'cubrid_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field='=>''], - 'cubrid_rollback' => ['bool', 'conn_identifier'=>'resource'], - 'cubrid_save_to_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string', 'file_name'=>'string'], - 'cubrid_schema' => ['array', 'conn_identifier'=>'resource', 'schema_type'=>'int', 'class_name='=>'string', 'attr_name='=>'string'], - 'cubrid_send_glo' => ['int', 'conn_identifier'=>'', 'oid'=>'string'], - 'cubrid_seq_add' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'seq_element'=>'string'], - 'cubrid_seq_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int'], - 'cubrid_seq_insert' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int', 'seq_element'=>'string'], - 'cubrid_seq_put' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'index'=>'int', 'seq_element'=>'string'], - 'cubrid_set_add' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'set_element'=>'string'], - 'cubrid_set_autocommit' => ['bool', 'conn_identifier'=>'resource', 'mode'=>'bool'], - 'cubrid_set_db_parameter' => ['bool', 'conn_identifier'=>'resource', 'param_type'=>'int', 'param_value'=>'int'], - 'cubrid_set_drop' => ['bool', 'conn_identifier'=>'resource', 'oid'=>'string', 'attr_name'=>'string', 'set_element'=>'string'], - 'cubrid_set_query_timeout' => ['bool', 'req_identifier'=>'resource', 'timeout'=>'int'], - 'cubrid_unbuffered_query' => ['resource', 'query'=>'string', 'conn_identifier='=>''], - 'cubrid_version' => ['string'], - 'curl_close' => ['void', 'ch'=>'resource'], - 'curl_copy_handle' => ['resource', 'ch'=>'resource'], - 'curl_errno' => ['int', 'ch'=>'resource'], - 'curl_error' => ['string', 'ch'=>'resource'], - 'curl_escape' => ['string|false', 'ch'=>'resource', 'string'=>'string'], - 'curl_exec' => ['bool|string', 'ch'=>'resource'], - 'curl_file_create' => ['CURLFile', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'], - 'curl_getinfo' => ['mixed', 'ch'=>'resource', 'option='=>'int'], - 'curl_init' => ['resource|false', 'url='=>'string'], - 'curl_multi_add_handle' => ['int', 'mh'=>'resource', 'ch'=>'resource'], - 'curl_multi_close' => ['void', 'mh'=>'resource'], - 'curl_multi_exec' => ['int', 'mh'=>'resource', '&w_still_running'=>'int'], - 'curl_multi_getcontent' => ['?string', 'ch'=>'resource'], - 'curl_multi_info_read' => ['array|false', 'mh'=>'resource', '&w_msgs_in_queue='=>'int'], - 'curl_multi_init' => ['resource|false'], - 'curl_multi_remove_handle' => ['int', 'mh'=>'resource', 'ch'=>'resource'], - 'curl_multi_select' => ['int', 'mh'=>'resource', 'timeout='=>'float'], - 'curl_multi_setopt' => ['bool', 'mh'=>'resource', 'option'=>'int', 'value'=>'mixed'], - 'curl_multi_strerror' => ['?string', 'error_code'=>'int'], - 'curl_pause' => ['int', 'ch'=>'resource', 'bitmask'=>'int'], - 'curl_reset' => ['void', 'ch'=>'resource'], - 'curl_setopt' => ['bool', 'ch'=>'resource', 'option'=>'int', 'value'=>'callable|mixed'], - 'curl_setopt_array' => ['bool', 'ch'=>'resource', 'options'=>'array'], - 'curl_share_close' => ['void', 'sh'=>'resource'], - 'curl_share_init' => ['resource'], - 'curl_share_setopt' => ['bool', 'sh'=>'resource', 'option'=>'int', 'value'=>'mixed'], - 'curl_strerror' => ['?string', 'error_code'=>'int'], - 'curl_unescape' => ['string|false', 'ch'=>'resource', 'string'=>'string'], - 'curl_version' => ['array', 'version='=>'int'], - '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'], - 'cyrus_bind' => ['bool', 'connection'=>'resource', 'callbacks'=>'array'], - 'cyrus_close' => ['bool', 'connection'=>'resource'], - 'cyrus_connect' => ['resource', 'host='=>'string', 'port='=>'string', 'flags='=>'int'], - 'cyrus_query' => ['array', 'connection'=>'resource', 'query'=>'string'], - 'cyrus_unbind' => ['bool', 'connection'=>'resource', 'trigger_name'=>'string'], - 'date' => ['string', 'format'=>'string', 'timestamp='=>'int'], - 'date_add' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'], - 'date_create' => ['DateTime|false', 'datetime='=>'string', 'timezone='=>'?DateTimeZone'], - 'date_create_from_format' => ['DateTime|false', 'format'=>'string', 'datetime'=>'string', 'timezone='=>'?\DateTimeZone'], - 'date_create_immutable' => ['DateTimeImmutable|false', 'datetime='=>'string', 'timezone='=>'?DateTimeZone'], - 'date_create_immutable_from_format' => ['DateTimeImmutable|false', 'format'=>'string', 'datetime'=>'string', 'timezone='=>'?DateTimeZone'], - 'date_date_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'month'=>'int', 'day'=>'int'], - 'date_default_timezone_get' => ['string'], - 'date_default_timezone_set' => ['bool', 'timezoneId'=>'string'], - 'date_diff' => ['DateInterval|false', 'baseObject'=>'DateTimeInterface', 'targetObject'=>'DateTimeInterface', 'absolute='=>'bool'], - 'date_format' => ['string|false', 'object'=>'DateTimeInterface', 'format'=>'string'], - 'date_get_last_errors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}'], - 'date_interval_create_from_date_string' => ['DateInterval', 'datetime'=>'string'], - 'date_interval_format' => ['string', 'object'=>'DateInterval', 'format'=>'string'], - 'date_isodate_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'week'=>'int', 'dayOfWeek='=>'int|mixed'], - 'date_modify' => ['DateTime|false', 'object'=>'DateTime', 'modifier'=>'string'], - 'date_offset_get' => ['int|false', 'object'=>'DateTimeInterface'], - 'date_parse' => ['array|false', 'datetime'=>'string'], - 'date_parse_from_format' => ['array', 'format'=>'string', 'datetime'=>'string'], - 'date_sub' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'], - 'date_sun_info' => ['array|false', 'timestamp'=>'int', 'latitude'=>'float', 'longitude'=>'float'], - 'date_sunrise' => ['mixed', 'timestamp'=>'int', 'returnFormat='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'utcOffset='=>'float'], - 'date_sunset' => ['mixed', 'timestamp'=>'int', 'returnFormat='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'utcOffset='=>'float'], - 'date_time_set' => ['DateTime|false', 'object'=>'', 'hour'=>'', 'minute'=>'', 'second='=>'', 'microsecond='=>''], - 'date_timestamp_get' => ['int', 'object'=>'DateTimeInterface'], - 'date_timestamp_set' => ['DateTime|false', 'object'=>'DateTime', 'timestamp'=>'int'], - 'date_timezone_get' => ['DateTimeZone|false', 'object'=>'DateTimeInterface'], - 'date_timezone_set' => ['DateTime|false', 'object'=>'DateTime', 'timezone'=>'DateTimeZone'], - 'datefmt_create' => ['?IntlDateFormatter', 'locale'=>'?string', 'dateType'=>'int', 'timeType'=>'int', 'timezone='=>'DateTimeZone|IntlTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'string'], - 'datefmt_format' => ['string|false', 'formatter'=>'IntlDateFormatter', 'datetime'=>'DateTime|IntlCalendar|array|int'], - 'datefmt_format_object' => ['string|false', 'datetime'=>'object', 'format='=>'mixed', 'locale='=>'string'], - 'datefmt_get_calendar' => ['int', 'formatter'=>'IntlDateFormatter'], - 'datefmt_get_calendar_object' => ['IntlCalendar|false|null', 'formatter'=>'IntlDateFormatter'], - 'datefmt_get_datetype' => ['int', 'formatter'=>'IntlDateFormatter'], - 'datefmt_get_error_code' => ['int', 'formatter'=>'IntlDateFormatter'], - 'datefmt_get_error_message' => ['string', 'formatter'=>'IntlDateFormatter'], - 'datefmt_get_locale' => ['string|false', 'formatter'=>'IntlDateFormatter', 'type='=>'int'], - 'datefmt_get_pattern' => ['string', 'formatter'=>'IntlDateFormatter'], - 'datefmt_get_timetype' => ['int', 'formatter'=>'IntlDateFormatter'], - 'datefmt_get_timezone' => ['IntlTimeZone|false', 'formatter'=>'IntlDateFormatter'], - 'datefmt_get_timezone_id' => ['string|false', 'formatter'=>'IntlDateFormatter'], - 'datefmt_is_lenient' => ['bool', 'formatter'=>'IntlDateFormatter'], - 'datefmt_localtime' => ['array|false', 'formatter'=>'IntlDateFormatter', 'string'=>'string', '&rw_offset='=>'int'], - 'datefmt_parse' => ['int|false', 'formatter'=>'IntlDateFormatter', 'string'=>'string', '&rw_offset='=>'int'], - 'datefmt_set_calendar' => ['bool', 'formatter'=>'IntlDateFormatter', 'calendar'=>'int'], - 'datefmt_set_lenient' => ['?bool', '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_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_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_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_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_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_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_pclose' => ['bool', 'resource'=>'resource'], - '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_primarykeys' => [''], - '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_rollback' => ['bool', 'connection'=>'resource'], - 'db2_server_info' => ['object|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_specialcolumns' => [''], - '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_tableprivileges' => [''], - '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'], - 'dba_fetch' => ['string|false', 'key'=>'string', 'skip'=>'int', 'dba'=>'resource'], - 'dba_fetch\'1' => ['string|false', 'key'=>'string', 'skip'=>'resource'], - 'dba_firstkey' => ['string', 'dba'=>'resource'], - 'dba_handlers' => ['array', 'full_info='=>'bool'], - 'dba_insert' => ['bool', 'key'=>'string', 'value'=>'string', 'dba'=>'resource'], - 'dba_key_split' => ['array|false', 'key'=>'string'], - 'dba_list' => ['array'], - 'dba_nextkey' => ['string', 'dba'=>'resource'], - 'dba_open' => ['resource', 'path'=>'string', 'mode'=>'string', 'handler='=>'string', '...handler_params='=>'string'], - 'dba_optimize' => ['bool', 'dba'=>'resource'], - 'dba_popen' => ['resource', 'path'=>'string', 'mode'=>'string', 'handler='=>'string', '...handler_params='=>'string'], - 'dba_replace' => ['bool', 'key'=>'string', 'value'=>'string', 'dba'=>'resource'], - 'dba_sync' => ['bool', 'dba'=>'resource'], - 'dbase_add_record' => ['bool', 'dbase_identifier'=>'resource', 'record'=>'array'], - 'dbase_close' => ['bool', 'dbase_identifier'=>'resource'], - 'dbase_create' => ['resource|false', 'filename'=>'string', 'fields'=>'array'], - 'dbase_delete_record' => ['bool', 'dbase_identifier'=>'resource', 'record_number'=>'int'], - 'dbase_get_header_info' => ['array', 'dbase_identifier'=>'resource'], - 'dbase_get_record' => ['array', 'dbase_identifier'=>'resource', 'record_number'=>'int'], - 'dbase_get_record_with_names' => ['array', 'dbase_identifier'=>'resource', 'record_number'=>'int'], - 'dbase_numfields' => ['int', 'dbase_identifier'=>'resource'], - 'dbase_numrecords' => ['int', 'dbase_identifier'=>'resource'], - 'dbase_open' => ['resource|false', 'filename'=>'string', 'mode'=>'int'], - 'dbase_pack' => ['bool', 'dbase_identifier'=>'resource'], - 'dbase_replace_record' => ['bool', 'dbase_identifier'=>'resource', 'record'=>'array', 'record_number'=>'int'], - 'dbplus_add' => ['int', 'relation'=>'resource', 'tuple'=>'array'], - 'dbplus_aql' => ['resource', 'query'=>'string', 'server='=>'string', 'dbpath='=>'string'], - 'dbplus_chdir' => ['string', 'newdir='=>'string'], - 'dbplus_close' => ['mixed', 'relation'=>'resource'], - 'dbplus_curr' => ['int', 'relation'=>'resource', 'tuple'=>'array'], - 'dbplus_errcode' => ['string', 'errno='=>'int'], - 'dbplus_errno' => ['int'], - 'dbplus_find' => ['int', 'relation'=>'resource', 'constraints'=>'array', 'tuple'=>'mixed'], - 'dbplus_first' => ['int', 'relation'=>'resource', 'tuple'=>'array'], - 'dbplus_flush' => ['int', 'relation'=>'resource'], - 'dbplus_freealllocks' => ['int'], - 'dbplus_freelock' => ['int', 'relation'=>'resource', 'tuple'=>'string'], - 'dbplus_freerlocks' => ['int', 'relation'=>'resource'], - 'dbplus_getlock' => ['int', 'relation'=>'resource', 'tuple'=>'string'], - 'dbplus_getunique' => ['int', 'relation'=>'resource', 'uniqueid'=>'int'], - 'dbplus_info' => ['int', 'relation'=>'resource', 'key'=>'string', 'result'=>'array'], - 'dbplus_last' => ['int', 'relation'=>'resource', 'tuple'=>'array'], - 'dbplus_lockrel' => ['int', 'relation'=>'resource'], - 'dbplus_next' => ['int', 'relation'=>'resource', 'tuple'=>'array'], - 'dbplus_open' => ['resource', 'name'=>'string'], - 'dbplus_prev' => ['int', 'relation'=>'resource', 'tuple'=>'array'], - 'dbplus_rchperm' => ['int', 'relation'=>'resource', 'mask'=>'int', 'user'=>'string', 'group'=>'string'], - 'dbplus_rcreate' => ['resource', 'name'=>'string', 'domlist'=>'mixed', 'overwrite='=>'bool'], - 'dbplus_rcrtexact' => ['mixed', 'name'=>'string', 'relation'=>'resource', 'overwrite='=>'bool'], - 'dbplus_rcrtlike' => ['mixed', 'name'=>'string', 'relation'=>'resource', 'overwrite='=>'int'], - 'dbplus_resolve' => ['array', 'relation_name'=>'string'], - 'dbplus_restorepos' => ['int', 'relation'=>'resource', 'tuple'=>'array'], - 'dbplus_rkeys' => ['mixed', 'relation'=>'resource', 'domlist'=>'mixed'], - 'dbplus_ropen' => ['resource', 'name'=>'string'], - 'dbplus_rquery' => ['resource', 'query'=>'string', 'dbpath='=>'string'], - 'dbplus_rrename' => ['int', 'relation'=>'resource', 'name'=>'string'], - 'dbplus_rsecindex' => ['mixed', 'relation'=>'resource', 'domlist'=>'mixed', 'type'=>'int'], - 'dbplus_runlink' => ['int', 'relation'=>'resource'], - 'dbplus_rzap' => ['int', 'relation'=>'resource'], - 'dbplus_savepos' => ['int', 'relation'=>'resource'], - 'dbplus_setindex' => ['int', 'relation'=>'resource', 'idx_name'=>'string'], - 'dbplus_setindexbynumber' => ['int', 'relation'=>'resource', 'idx_number'=>'int'], - 'dbplus_sql' => ['resource', 'query'=>'string', 'server='=>'string', 'dbpath='=>'string'], - 'dbplus_tcl' => ['string', 'sid'=>'int', 'script'=>'string'], - 'dbplus_tremove' => ['int', 'relation'=>'resource', 'tuple'=>'array', 'current='=>'array'], - 'dbplus_undo' => ['int', 'relation'=>'resource'], - 'dbplus_undoprepare' => ['int', 'relation'=>'resource'], - 'dbplus_unlockrel' => ['int', 'relation'=>'resource'], - 'dbplus_unselect' => ['int', 'relation'=>'resource'], - 'dbplus_update' => ['int', 'relation'=>'resource', 'old'=>'array', 'new'=>'array'], - 'dbplus_xlockrel' => ['int', 'relation'=>'resource'], - 'dbplus_xunlockrel' => ['int', 'relation'=>'resource'], - 'dbx_close' => ['int', 'link_identifier'=>'object'], - 'dbx_compare' => ['int', 'row_a'=>'array', 'row_b'=>'array', 'column_key'=>'string', 'flags='=>'int'], - 'dbx_connect' => ['object', 'module'=>'mixed', 'host'=>'string', 'database'=>'string', 'username'=>'string', 'password'=>'string', 'persistent='=>'int'], - 'dbx_error' => ['string', 'link_identifier'=>'object'], - 'dbx_escape_string' => ['string', 'link_identifier'=>'object', 'text'=>'string'], - 'dbx_fetch_row' => ['mixed', 'result_identifier'=>'object'], - 'dbx_query' => ['mixed', 'link_identifier'=>'object', 'sql_statement'=>'string', 'flags='=>'int'], - 'dbx_sort' => ['bool', 'result'=>'object', 'user_compare_function'=>'string'], - 'dcgettext' => ['string', 'domain'=>'string', 'message'=>'string', 'category'=>'int'], - 'dcngettext' => ['string', 'domain'=>'string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int', 'category'=>'int'], - 'deaggregate' => ['', 'object'=>'object', 'class_name='=>'string'], - 'debug_backtrace' => ['list', 'options='=>'int', 'limit='=>'int'], - 'debug_print_backtrace' => ['void', 'options='=>'int', 'limit='=>'int'], - 'debug_zval_dump' => ['void', '...value'=>'mixed'], - 'debugger_connect' => [''], - 'debugger_connector_pid' => [''], - 'debugger_get_server_start_time' => [''], - 'debugger_print' => [''], - 'debugger_start_debug' => [''], - 'decbin' => ['string', 'num'=>'int'], - 'dechex' => ['string', 'num'=>'int'], - 'decoct' => ['string', 'num'=>'int'], - 'define' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'case_insensitive='=>'bool'], - 'define_syslog_variables' => ['void'], - 'defined' => ['bool', 'constant_name'=>'string'], - 'deflate_add' => ['string|false', 'context'=>'resource', 'data'=>'string', 'flush_mode='=>'int'], - 'deflate_init' => ['resource|false', 'encoding'=>'int', 'options='=>'array'], - 'deg2rad' => ['float', 'num'=>'float'], - 'dgettext' => ['string', 'domain'=>'string', 'message'=>'string'], - 'dio_close' => ['void', 'fd'=>'resource'], - 'dio_fcntl' => ['mixed', 'fd'=>'resource', 'cmd'=>'int', 'args='=>'mixed'], - 'dio_open' => ['resource|false', 'filename'=>'string', 'flags'=>'int', 'mode='=>'int'], - 'dio_read' => ['string', 'fd'=>'resource', 'length='=>'int'], - 'dio_seek' => ['int', 'fd'=>'resource', 'pos'=>'int', 'whence='=>'int'], - 'dio_stat' => ['?array', 'fd'=>'resource'], - 'dio_tcsetattr' => ['bool', 'fd'=>'resource', 'options'=>'array'], - 'dio_truncate' => ['bool', 'fd'=>'resource', 'offset'=>'int'], - 'dio_write' => ['int', 'fd'=>'resource', 'data'=>'string', 'length='=>'int'], - 'dir' => ['Directory|false', 'directory'=>'string', 'context='=>'resource'], - 'dirname' => ['string', 'path'=>'string', 'levels='=>'int'], - 'disk_free_space' => ['float|false', 'directory'=>'string'], - 'disk_total_space' => ['float|false', 'directory'=>'string'], - 'diskfreespace' => ['float|false', 'directory'=>'string'], - 'display_disabled_function' => [''], - 'dl' => ['bool', 'extension_filename'=>'string'], - 'dngettext' => ['string', 'domain'=>'string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int'], - 'dns_check_record' => ['bool', 'hostname'=>'string', 'type='=>'string'], - 'dns_get_mx' => ['bool', 'hostname'=>'string', '&w_hosts'=>'array', '&w_weights'=>'array'], - 'dns_get_record' => ['list|false', 'hostname'=>'string', 'type='=>'int', '&w_authoritative_name_servers='=>'array', '&w_additional_records='=>'array', 'raw='=>'bool'], - 'dom_document_relaxNG_validate_file' => ['bool', 'filename'=>'string'], - 'dom_document_relaxNG_validate_xml' => ['bool', 'source'=>'string'], - 'dom_document_schema_validate' => ['bool', 'source'=>'string', 'flags'=>'int'], - 'dom_document_schema_validate_file' => ['bool', 'filename'=>'string', 'flags'=>'int'], - 'dom_document_xinclude' => ['int', 'options'=>'int'], - 'dom_import_simplexml' => ['DOMElement|null', 'node'=>'SimpleXMLElement'], - 'dom_xpath_evaluate' => ['', 'expr'=>'string', 'context'=>'DOMNode', 'registernodens'=>'bool'], - 'dom_xpath_query' => ['DOMNodeList', 'expr'=>'string', 'context'=>'DOMNode', 'registernodens'=>'bool'], - 'dom_xpath_register_ns' => ['bool', 'prefix'=>'string', 'uri'=>'string'], - 'dom_xpath_register_php_functions' => [''], - 'domxml_new_doc' => ['DomDocument', 'version'=>'string'], - 'domxml_open_file' => ['DomDocument', 'filename'=>'string', 'mode='=>'int', 'error='=>'array'], - 'domxml_open_mem' => ['DomDocument', 'string'=>'string', 'mode='=>'int', 'error='=>'array'], - 'domxml_version' => ['string'], - 'domxml_xmltree' => ['DomDocument', 'string'=>'string'], - 'domxml_xslt_stylesheet' => ['DomXsltStylesheet', 'xsl_buf'=>'string'], - 'domxml_xslt_stylesheet_doc' => ['DomXsltStylesheet', 'xsl_doc'=>'DOMDocument'], - 'domxml_xslt_stylesheet_file' => ['DomXsltStylesheet', 'xsl_file'=>'string'], - 'domxml_xslt_version' => ['int'], - 'dotnet_load' => ['int', 'assembly_name'=>'string', 'datatype_name='=>'string', 'codepage='=>'int'], - 'doubleval' => ['float', 'value'=>'mixed'], - 'each' => ['array{0:int|string,key:int|string,1:mixed,value:mixed}', '&r_arr'=>'array'], - 'easter_date' => ['int', 'year='=>'int'], - 'easter_days' => ['int', 'year='=>'int', 'mode='=>'int'], - 'echo' => ['void', 'arg1'=>'string', '...args='=>'string'], - 'eio_busy' => ['resource', 'delay'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_cancel' => ['void', 'req'=>'resource'], - 'eio_chmod' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_chown' => ['resource', 'path'=>'string', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_close' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_custom' => ['resource', 'execute'=>'callable', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], - 'eio_dup2' => ['resource', 'fd'=>'mixed', 'fd2'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_event_loop' => ['bool'], - 'eio_fallocate' => ['resource', 'fd'=>'mixed', 'mode'=>'int', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_fchmod' => ['resource', 'fd'=>'mixed', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_fchown' => ['resource', 'fd'=>'mixed', 'uid'=>'int', 'gid='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_fdatasync' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_fstat' => ['resource', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], - 'eio_fstatvfs' => ['resource', 'fd'=>'mixed', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], - 'eio_fsync' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_ftruncate' => ['resource', 'fd'=>'mixed', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_futime' => ['resource', 'fd'=>'mixed', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_get_event_stream' => ['mixed'], - 'eio_get_last_error' => ['string', 'req'=>'resource'], - 'eio_grp' => ['resource', 'callback'=>'callable', 'data='=>'string'], - 'eio_grp_add' => ['void', 'grp'=>'resource', 'req'=>'resource'], - 'eio_grp_cancel' => ['void', 'grp'=>'resource'], - 'eio_grp_limit' => ['void', 'grp'=>'resource', 'limit'=>'int'], - 'eio_init' => ['void'], - 'eio_link' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_lstat' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], - 'eio_mkdir' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_mknod' => ['resource', 'path'=>'string', 'mode'=>'int', 'dev'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_nop' => ['resource', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_npending' => ['int'], - 'eio_nready' => ['int'], - 'eio_nreqs' => ['int'], - 'eio_nthreads' => ['int'], - 'eio_open' => ['resource', 'path'=>'string', 'flags'=>'int', 'mode'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], - 'eio_poll' => ['int'], - 'eio_read' => ['resource', 'fd'=>'mixed', 'length'=>'int', 'offset'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], - 'eio_readahead' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_readdir' => ['resource', 'path'=>'string', 'flags'=>'int', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], - 'eio_readlink' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], - 'eio_realpath' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'string'], - 'eio_rename' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_rmdir' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_seek' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'whence'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_sendfile' => ['resource', 'out_fd'=>'mixed', 'in_fd'=>'mixed', 'offset'=>'int', 'length'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'string'], - 'eio_set_max_idle' => ['void', 'nthreads'=>'int'], - 'eio_set_max_parallel' => ['void', 'nthreads'=>'int'], - 'eio_set_max_poll_reqs' => ['void', 'nreqs'=>'int'], - 'eio_set_max_poll_time' => ['void', 'nseconds'=>'float'], - 'eio_set_min_parallel' => ['void', 'nthreads'=>'string'], - 'eio_stat' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], - 'eio_statvfs' => ['resource', 'path'=>'string', 'pri'=>'int', 'callback'=>'callable', 'data='=>'mixed'], - 'eio_symlink' => ['resource', 'path'=>'string', 'new_path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_sync' => ['resource', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_sync_file_range' => ['resource', 'fd'=>'mixed', 'offset'=>'int', 'nbytes'=>'int', 'flags'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_syncfs' => ['resource', 'fd'=>'mixed', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_truncate' => ['resource', 'path'=>'string', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_unlink' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_utime' => ['resource', 'path'=>'string', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'eio_write' => ['resource', 'fd'=>'mixed', 'string'=>'string', 'length='=>'int', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], - 'empty' => ['bool', 'value'=>'mixed'], - 'enchant_broker_describe' => ['array', 'broker'=>'resource'], - 'enchant_broker_dict_exists' => ['bool', 'broker'=>'resource', 'tag'=>'string'], - 'enchant_broker_free' => ['bool', 'broker'=>'resource'], - 'enchant_broker_free_dict' => ['bool', 'dictionary'=>'resource'], - 'enchant_broker_get_dict_path' => ['string', 'broker'=>'resource', 'type'=>'int'], - 'enchant_broker_get_error' => ['string|false', 'broker'=>'resource'], - 'enchant_broker_init' => ['resource|false'], - 'enchant_broker_list_dicts' => ['array|false', 'broker'=>'resource'], - 'enchant_broker_request_dict' => ['resource|false', 'broker'=>'resource', 'tag'=>'string'], - 'enchant_broker_request_pwl_dict' => ['resource|false', 'broker'=>'resource', 'filename'=>'string'], - 'enchant_broker_set_dict_path' => ['bool', 'broker'=>'resource', 'type'=>'int', 'path'=>'string'], - 'enchant_broker_set_ordering' => ['bool', 'broker'=>'resource', 'tag'=>'string', 'ordering'=>'string'], - 'enchant_dict_add_to_personal' => ['void', 'dictionary'=>'resource', 'word'=>'string'], - 'enchant_dict_add_to_session' => ['void', 'dictionary'=>'resource', 'word'=>'string'], - 'enchant_dict_check' => ['bool', 'dictionary'=>'resource', 'word'=>'string'], - 'enchant_dict_describe' => ['array', 'dictionary'=>'resource'], - 'enchant_dict_get_error' => ['string', 'dictionary'=>'resource'], - 'enchant_dict_is_in_session' => ['bool', 'dictionary'=>'resource', 'word'=>'string'], - 'enchant_dict_quick_check' => ['bool', 'dictionary'=>'resource', 'word'=>'string', '&w_suggestions='=>'array'], - 'enchant_dict_store_replacement' => ['void', 'dictionary'=>'resource', 'misspelled'=>'string', 'correct'=>'string'], - 'enchant_dict_suggest' => ['array', 'dictionary'=>'resource', 'word'=>'string'], - 'end' => ['mixed|false', '&r_array'=>'array|object'], - 'error_clear_last' => ['void'], - 'error_get_last' => ['?array{type:int,message:string,file:string,line:int}'], - 'error_log' => ['bool', 'message'=>'string', 'message_type='=>'int', 'destination='=>'string', 'additional_headers='=>'string'], - 'error_reporting' => ['int', 'error_level='=>'int'], - 'escapeshellarg' => ['string', 'arg'=>'string'], - 'escapeshellcmd' => ['string', 'command'=>'string'], - 'eval' => ['mixed', 'code_str'=>'string'], - 'event_add' => ['bool', 'event'=>'resource', 'timeout='=>'int'], - 'event_base_free' => ['void', 'event_base'=>'resource'], - 'event_base_loop' => ['int', 'event_base'=>'resource', 'flags='=>'int'], - 'event_base_loopbreak' => ['bool', 'event_base'=>'resource'], - 'event_base_loopexit' => ['bool', 'event_base'=>'resource', 'timeout='=>'int'], - 'event_base_new' => ['resource|false'], - 'event_base_priority_init' => ['bool', 'event_base'=>'resource', 'npriorities'=>'int'], - 'event_base_reinit' => ['bool', 'event_base'=>'resource'], - 'event_base_set' => ['bool', 'event'=>'resource', 'event_base'=>'resource'], - 'event_buffer_base_set' => ['bool', 'bevent'=>'resource', 'event_base'=>'resource'], - 'event_buffer_disable' => ['bool', 'bevent'=>'resource', 'events'=>'int'], - 'event_buffer_enable' => ['bool', 'bevent'=>'resource', 'events'=>'int'], - 'event_buffer_fd_set' => ['void', 'bevent'=>'resource', 'fd'=>'resource'], - 'event_buffer_free' => ['void', 'bevent'=>'resource'], - 'event_buffer_new' => ['resource|false', 'stream'=>'resource', 'readcb'=>'callable|null', 'writecb'=>'callable|null', 'errorcb'=>'callable', 'arg='=>'mixed'], - 'event_buffer_priority_set' => ['bool', 'bevent'=>'resource', 'priority'=>'int'], - 'event_buffer_read' => ['string', 'bevent'=>'resource', 'data_size'=>'int'], - 'event_buffer_set_callback' => ['bool', 'event'=>'resource', 'readcb'=>'mixed', 'writecb'=>'mixed', 'errorcb'=>'mixed', 'arg='=>'mixed'], - 'event_buffer_timeout_set' => ['void', 'bevent'=>'resource', 'read_timeout'=>'int', 'write_timeout'=>'int'], - 'event_buffer_watermark_set' => ['void', 'bevent'=>'resource', 'events'=>'int', 'lowmark'=>'int', 'highmark'=>'int'], - 'event_buffer_write' => ['bool', 'bevent'=>'resource', 'data'=>'string', 'data_size='=>'int'], - 'event_del' => ['bool', 'event'=>'resource'], - 'event_free' => ['void', 'event'=>'resource'], - 'event_new' => ['resource|false'], - 'event_priority_set' => ['bool', 'event'=>'resource', 'priority'=>'int'], - 'event_set' => ['bool', 'event'=>'resource', 'fd'=>'int|resource', 'events'=>'int', 'callback'=>'callable', 'arg='=>'mixed'], - 'event_timer_add' => ['bool', 'event'=>'resource', 'timeout='=>'int'], - 'event_timer_del' => ['bool', 'event'=>'resource'], - 'event_timer_new' => ['resource|false'], - 'event_timer_pending' => ['bool', 'event'=>'resource', 'timeout='=>'int'], - 'event_timer_set' => ['bool', 'event'=>'resource', 'callback'=>'callable', 'arg='=>'mixed'], - 'exec' => ['string|false', 'command'=>'string', '&w_output='=>'array', '&w_result_code='=>'int'], - 'exif_imagetype' => ['int|false', 'filename'=>'string'], - 'exif_read_data' => ['array|false', 'file'=>'string|resource', 'required_sections='=>'string', 'as_arrays='=>'bool', 'read_thumbnail='=>'bool'], - 'exif_tagname' => ['string|false', 'index'=>'int'], - 'exif_thumbnail' => ['string|false', 'file'=>'string', '&w_width='=>'int', '&w_height='=>'int', '&w_image_type='=>'int'], - 'exit' => ['', 'status'=>'string|int'], - 'exp' => ['float', 'num'=>'float'], - 'expect_expectl' => ['int', 'expect'=>'resource', 'cases'=>'array', 'match='=>'array'], - 'expect_popen' => ['resource|false', 'command'=>'string'], - 'explode' => ['list|false', 'separator'=>'string', 'string'=>'string', 'limit='=>'int'], - 'expm1' => ['float', 'num'=>'float'], - 'extension_loaded' => ['bool', 'extension'=>'string'], - 'extract' => ['int', '&rw_array'=>'array', 'flags='=>'int', 'prefix='=>'string'], - 'ezmlm_hash' => ['int', 'addr'=>'string'], - 'fam_cancel_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], - 'fam_close' => ['void', 'fam'=>'resource'], - 'fam_monitor_collection' => ['resource', 'fam'=>'resource', 'dirname'=>'string', 'depth'=>'int', 'mask'=>'string'], - 'fam_monitor_directory' => ['resource', 'fam'=>'resource', 'dirname'=>'string'], - 'fam_monitor_file' => ['resource', 'fam'=>'resource', 'filename'=>'string'], - 'fam_next_event' => ['array', 'fam'=>'resource'], - 'fam_open' => ['resource|false', 'appname='=>'string'], - 'fam_pending' => ['int', 'fam'=>'resource'], - 'fam_resume_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], - 'fam_suspend_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'], - 'fann_cascadetrain_on_data' => ['bool', 'ann'=>'resource', 'data'=>'resource', 'max_neurons'=>'int', 'neurons_between_reports'=>'int', 'desired_error'=>'float'], - 'fann_cascadetrain_on_file' => ['bool', 'ann'=>'resource', 'filename'=>'string', 'max_neurons'=>'int', 'neurons_between_reports'=>'int', 'desired_error'=>'float'], - 'fann_clear_scaling_params' => ['bool', 'ann'=>'resource'], - 'fann_copy' => ['resource|false', 'ann'=>'resource'], - 'fann_create_from_file' => ['resource', 'configuration_file'=>'string'], - 'fann_create_shortcut' => ['resource|false', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], - 'fann_create_shortcut_array' => ['resource|false', 'num_layers'=>'int', 'layers'=>'array'], - 'fann_create_sparse' => ['resource|false', 'connection_rate'=>'float', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], - 'fann_create_sparse_array' => ['resource|false', 'connection_rate'=>'float', 'num_layers'=>'int', 'layers'=>'array'], - 'fann_create_standard' => ['resource|false', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], - 'fann_create_standard_array' => ['resource|false', 'num_layers'=>'int', 'layers'=>'array'], - 'fann_create_train' => ['resource', 'num_data'=>'int', 'num_input'=>'int', 'num_output'=>'int'], - 'fann_create_train_from_callback' => ['resource', 'num_data'=>'int', 'num_input'=>'int', 'num_output'=>'int', 'user_function'=>'callable'], - 'fann_descale_input' => ['bool', 'ann'=>'resource', 'input_vector'=>'array'], - 'fann_descale_output' => ['bool', 'ann'=>'resource', 'output_vector'=>'array'], - 'fann_descale_train' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], - 'fann_destroy' => ['bool', 'ann'=>'resource'], - 'fann_destroy_train' => ['bool', 'train_data'=>'resource'], - 'fann_duplicate_train_data' => ['resource', 'data'=>'resource'], - 'fann_get_MSE' => ['float|false', 'ann'=>'resource'], - 'fann_get_activation_function' => ['int|false', 'ann'=>'resource', 'layer'=>'int', 'neuron'=>'int'], - 'fann_get_activation_steepness' => ['float|false', 'ann'=>'resource', 'layer'=>'int', 'neuron'=>'int'], - 'fann_get_bias_array' => ['array', 'ann'=>'resource'], - 'fann_get_bit_fail' => ['int|false', 'ann'=>'resource'], - 'fann_get_bit_fail_limit' => ['float|false', 'ann'=>'resource'], - 'fann_get_cascade_activation_functions' => ['array|false', 'ann'=>'resource'], - 'fann_get_cascade_activation_functions_count' => ['int|false', 'ann'=>'resource'], - 'fann_get_cascade_activation_steepnesses' => ['array|false', 'ann'=>'resource'], - 'fann_get_cascade_activation_steepnesses_count' => ['int|false', 'ann'=>'resource'], - 'fann_get_cascade_candidate_change_fraction' => ['float|false', 'ann'=>'resource'], - 'fann_get_cascade_candidate_limit' => ['float|false', 'ann'=>'resource'], - 'fann_get_cascade_candidate_stagnation_epochs' => ['float|false', 'ann'=>'resource'], - 'fann_get_cascade_max_cand_epochs' => ['int|false', 'ann'=>'resource'], - 'fann_get_cascade_max_out_epochs' => ['int|false', 'ann'=>'resource'], - 'fann_get_cascade_min_cand_epochs' => ['int|false', 'ann'=>'resource'], - 'fann_get_cascade_min_out_epochs' => ['int|false', 'ann'=>'resource'], - 'fann_get_cascade_num_candidate_groups' => ['int|false', 'ann'=>'resource'], - 'fann_get_cascade_num_candidates' => ['int|false', 'ann'=>'resource'], - 'fann_get_cascade_output_change_fraction' => ['float|false', 'ann'=>'resource'], - 'fann_get_cascade_output_stagnation_epochs' => ['int|false', 'ann'=>'resource'], - 'fann_get_cascade_weight_multiplier' => ['float|false', 'ann'=>'resource'], - 'fann_get_connection_array' => ['array', 'ann'=>'resource'], - 'fann_get_connection_rate' => ['float|false', 'ann'=>'resource'], - 'fann_get_errno' => ['int|false', 'errdat'=>'resource'], - 'fann_get_errstr' => ['string|false', 'errdat'=>'resource'], - 'fann_get_layer_array' => ['array', 'ann'=>'resource'], - 'fann_get_learning_momentum' => ['float|false', 'ann'=>'resource'], - 'fann_get_learning_rate' => ['float|false', 'ann'=>'resource'], - 'fann_get_network_type' => ['int|false', 'ann'=>'resource'], - 'fann_get_num_input' => ['int|false', 'ann'=>'resource'], - 'fann_get_num_layers' => ['int|false', 'ann'=>'resource'], - 'fann_get_num_output' => ['int|false', 'ann'=>'resource'], - 'fann_get_quickprop_decay' => ['float|false', 'ann'=>'resource'], - 'fann_get_quickprop_mu' => ['float|false', 'ann'=>'resource'], - 'fann_get_rprop_decrease_factor' => ['float|false', 'ann'=>'resource'], - 'fann_get_rprop_delta_max' => ['float|false', 'ann'=>'resource'], - 'fann_get_rprop_delta_min' => ['float|false', 'ann'=>'resource'], - 'fann_get_rprop_delta_zero' => ['float|false', 'ann'=>'resource'], - 'fann_get_rprop_increase_factor' => ['float|false', 'ann'=>'resource'], - 'fann_get_sarprop_step_error_shift' => ['float|false', 'ann'=>'resource'], - 'fann_get_sarprop_step_error_threshold_factor' => ['float|false', 'ann'=>'resource'], - 'fann_get_sarprop_temperature' => ['float|false', 'ann'=>'resource'], - 'fann_get_sarprop_weight_decay_shift' => ['float|false', 'ann'=>'resource'], - 'fann_get_total_connections' => ['int|false', 'ann'=>'resource'], - 'fann_get_total_neurons' => ['int|false', 'ann'=>'resource'], - 'fann_get_train_error_function' => ['int|false', 'ann'=>'resource'], - 'fann_get_train_stop_function' => ['int|false', 'ann'=>'resource'], - 'fann_get_training_algorithm' => ['int|false', 'ann'=>'resource'], - 'fann_init_weights' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], - 'fann_length_train_data' => ['int|false', 'data'=>'resource'], - 'fann_merge_train_data' => ['resource|false', 'data1'=>'resource', 'data2'=>'resource'], - 'fann_num_input_train_data' => ['int|false', 'data'=>'resource'], - 'fann_num_output_train_data' => ['int|false', 'data'=>'resource'], - 'fann_print_error' => ['void', 'errdat'=>'string'], - 'fann_randomize_weights' => ['bool', 'ann'=>'resource', 'min_weight'=>'float', 'max_weight'=>'float'], - 'fann_read_train_from_file' => ['resource', 'filename'=>'string'], - 'fann_reset_MSE' => ['bool', 'ann'=>'string'], - 'fann_reset_errno' => ['void', 'errdat'=>'resource'], - 'fann_reset_errstr' => ['void', 'errdat'=>'resource'], - 'fann_run' => ['array|false', 'ann'=>'resource', 'input'=>'array'], - 'fann_save' => ['bool', 'ann'=>'resource', 'configuration_file'=>'string'], - 'fann_save_train' => ['bool', 'data'=>'resource', 'file_name'=>'string'], - 'fann_scale_input' => ['bool', 'ann'=>'resource', 'input_vector'=>'array'], - 'fann_scale_input_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], - 'fann_scale_output' => ['bool', 'ann'=>'resource', 'output_vector'=>'array'], - 'fann_scale_output_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], - 'fann_scale_train' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], - 'fann_scale_train_data' => ['bool', 'train_data'=>'resource', 'new_min'=>'float', 'new_max'=>'float'], - 'fann_set_activation_function' => ['bool', 'ann'=>'resource', 'activation_function'=>'int', 'layer'=>'int', 'neuron'=>'int'], - 'fann_set_activation_function_hidden' => ['bool', 'ann'=>'resource', 'activation_function'=>'int'], - 'fann_set_activation_function_layer' => ['bool', 'ann'=>'resource', 'activation_function'=>'int', 'layer'=>'int'], - 'fann_set_activation_function_output' => ['bool', 'ann'=>'resource', 'activation_function'=>'int'], - 'fann_set_activation_steepness' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float', 'layer'=>'int', 'neuron'=>'int'], - 'fann_set_activation_steepness_hidden' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float'], - 'fann_set_activation_steepness_layer' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float', 'layer'=>'int'], - 'fann_set_activation_steepness_output' => ['bool', 'ann'=>'resource', 'activation_steepness'=>'float'], - 'fann_set_bit_fail_limit' => ['bool', 'ann'=>'resource', 'bit_fail_limit'=>'float'], - 'fann_set_callback' => ['bool', 'ann'=>'resource', 'callback'=>'callable'], - 'fann_set_cascade_activation_functions' => ['bool', 'ann'=>'resource', 'cascade_activation_functions'=>'array'], - 'fann_set_cascade_activation_steepnesses' => ['bool', 'ann'=>'resource', 'cascade_activation_steepnesses_count'=>'array'], - 'fann_set_cascade_candidate_change_fraction' => ['bool', 'ann'=>'resource', 'cascade_candidate_change_fraction'=>'float'], - 'fann_set_cascade_candidate_limit' => ['bool', 'ann'=>'resource', 'cascade_candidate_limit'=>'float'], - 'fann_set_cascade_candidate_stagnation_epochs' => ['bool', 'ann'=>'resource', 'cascade_candidate_stagnation_epochs'=>'int'], - 'fann_set_cascade_max_cand_epochs' => ['bool', 'ann'=>'resource', 'cascade_max_cand_epochs'=>'int'], - 'fann_set_cascade_max_out_epochs' => ['bool', 'ann'=>'resource', 'cascade_max_out_epochs'=>'int'], - 'fann_set_cascade_min_cand_epochs' => ['bool', 'ann'=>'resource', 'cascade_min_cand_epochs'=>'int'], - 'fann_set_cascade_min_out_epochs' => ['bool', 'ann'=>'resource', 'cascade_min_out_epochs'=>'int'], - 'fann_set_cascade_num_candidate_groups' => ['bool', 'ann'=>'resource', 'cascade_num_candidate_groups'=>'int'], - 'fann_set_cascade_output_change_fraction' => ['bool', 'ann'=>'resource', 'cascade_output_change_fraction'=>'float'], - 'fann_set_cascade_output_stagnation_epochs' => ['bool', 'ann'=>'resource', 'cascade_output_stagnation_epochs'=>'int'], - 'fann_set_cascade_weight_multiplier' => ['bool', 'ann'=>'resource', 'cascade_weight_multiplier'=>'float'], - 'fann_set_error_log' => ['void', 'errdat'=>'resource', 'log_file'=>'string'], - 'fann_set_input_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_input_min'=>'float', 'new_input_max'=>'float'], - 'fann_set_learning_momentum' => ['bool', 'ann'=>'resource', 'learning_momentum'=>'float'], - 'fann_set_learning_rate' => ['bool', 'ann'=>'resource', 'learning_rate'=>'float'], - 'fann_set_output_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_output_min'=>'float', 'new_output_max'=>'float'], - 'fann_set_quickprop_decay' => ['bool', 'ann'=>'resource', 'quickprop_decay'=>'float'], - 'fann_set_quickprop_mu' => ['bool', 'ann'=>'resource', 'quickprop_mu'=>'float'], - 'fann_set_rprop_decrease_factor' => ['bool', 'ann'=>'resource', 'rprop_decrease_factor'=>'float'], - 'fann_set_rprop_delta_max' => ['bool', 'ann'=>'resource', 'rprop_delta_max'=>'float'], - 'fann_set_rprop_delta_min' => ['bool', 'ann'=>'resource', 'rprop_delta_min'=>'float'], - 'fann_set_rprop_delta_zero' => ['bool', 'ann'=>'resource', 'rprop_delta_zero'=>'float'], - 'fann_set_rprop_increase_factor' => ['bool', 'ann'=>'resource', 'rprop_increase_factor'=>'float'], - 'fann_set_sarprop_step_error_shift' => ['bool', 'ann'=>'resource', 'sarprop_step_error_shift'=>'float'], - 'fann_set_sarprop_step_error_threshold_factor' => ['bool', 'ann'=>'resource', 'sarprop_step_error_threshold_factor'=>'float'], - 'fann_set_sarprop_temperature' => ['bool', 'ann'=>'resource', 'sarprop_temperature'=>'float'], - 'fann_set_sarprop_weight_decay_shift' => ['bool', 'ann'=>'resource', 'sarprop_weight_decay_shift'=>'float'], - 'fann_set_scaling_params' => ['bool', 'ann'=>'resource', 'train_data'=>'resource', 'new_input_min'=>'float', 'new_input_max'=>'float', 'new_output_min'=>'float', 'new_output_max'=>'float'], - 'fann_set_train_error_function' => ['bool', 'ann'=>'resource', 'error_function'=>'int'], - 'fann_set_train_stop_function' => ['bool', 'ann'=>'resource', 'stop_function'=>'int'], - 'fann_set_training_algorithm' => ['bool', 'ann'=>'resource', 'training_algorithm'=>'int'], - 'fann_set_weight' => ['bool', 'ann'=>'resource', 'from_neuron'=>'int', 'to_neuron'=>'int', 'weight'=>'float'], - 'fann_set_weight_array' => ['bool', 'ann'=>'resource', 'connections'=>'array'], - 'fann_shuffle_train_data' => ['bool', 'train_data'=>'resource'], - 'fann_subset_train_data' => ['resource', 'data'=>'resource', 'pos'=>'int', 'length'=>'int'], - 'fann_test' => ['bool', 'ann'=>'resource', 'input'=>'array', 'desired_output'=>'array'], - 'fann_test_data' => ['float|false', 'ann'=>'resource', 'data'=>'resource'], - 'fann_train' => ['bool', 'ann'=>'resource', 'input'=>'array', 'desired_output'=>'array'], - 'fann_train_epoch' => ['float|false', 'ann'=>'resource', 'data'=>'resource'], - 'fann_train_on_data' => ['bool', 'ann'=>'resource', 'data'=>'resource', 'max_epochs'=>'int', 'epochs_between_reports'=>'int', 'desired_error'=>'float'], - 'fann_train_on_file' => ['bool', 'ann'=>'resource', 'filename'=>'string', 'max_epochs'=>'int', 'epochs_between_reports'=>'int', 'desired_error'=>'float'], - 'fastcgi_finish_request' => ['bool'], - 'fbsql_affected_rows' => ['int', 'link_identifier='=>'?resource'], - 'fbsql_autocommit' => ['bool', 'link_identifier'=>'resource', 'onoff='=>'bool'], - 'fbsql_blob_size' => ['int', 'blob_handle'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_change_user' => ['bool', 'user'=>'string', 'password'=>'string', 'database='=>'string', 'link_identifier='=>'?resource'], - 'fbsql_clob_size' => ['int', 'clob_handle'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_close' => ['bool', 'link_identifier='=>'?resource'], - 'fbsql_commit' => ['bool', 'link_identifier='=>'?resource'], - 'fbsql_connect' => ['resource', 'hostname='=>'string', 'username='=>'string', 'password='=>'string'], - 'fbsql_create_blob' => ['string', 'blob_data'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_create_clob' => ['string', 'clob_data'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_create_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource', 'database_options='=>'string'], - 'fbsql_data_seek' => ['bool', 'result'=>'resource', 'row_number'=>'int'], - 'fbsql_database' => ['string', 'link_identifier'=>'resource', 'database='=>'string'], - 'fbsql_database_password' => ['string', 'link_identifier'=>'resource', 'database_password='=>'string'], - 'fbsql_db_query' => ['resource', 'database'=>'string', 'query'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_db_status' => ['int', 'database_name'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_drop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_errno' => ['int', 'link_identifier='=>'?resource'], - 'fbsql_error' => ['string', 'link_identifier='=>'?resource'], - 'fbsql_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], - 'fbsql_fetch_assoc' => ['array', 'result'=>'resource'], - 'fbsql_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], - 'fbsql_fetch_lengths' => ['array', 'result'=>'resource'], - 'fbsql_fetch_object' => ['object', 'result'=>'resource'], - 'fbsql_fetch_row' => ['array', 'result'=>'resource'], - 'fbsql_field_flags' => ['string', 'result'=>'resource', 'field_offset='=>'int'], - 'fbsql_field_len' => ['int', 'result'=>'resource', 'field_offset='=>'int'], - 'fbsql_field_name' => ['string', 'result'=>'resource', 'field_index='=>'int'], - 'fbsql_field_seek' => ['bool', 'result'=>'resource', 'field_offset='=>'int'], - 'fbsql_field_table' => ['string', 'result'=>'resource', 'field_offset='=>'int'], - 'fbsql_field_type' => ['string', 'result'=>'resource', 'field_offset='=>'int'], - 'fbsql_free_result' => ['bool', 'result'=>'resource'], - 'fbsql_get_autostart_info' => ['array', 'link_identifier='=>'?resource'], - 'fbsql_hostname' => ['string', 'link_identifier'=>'resource', 'host_name='=>'string'], - 'fbsql_insert_id' => ['int', 'link_identifier='=>'?resource'], - 'fbsql_list_dbs' => ['resource', 'link_identifier='=>'?resource'], - 'fbsql_list_fields' => ['resource', 'database_name'=>'string', 'table_name'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_list_tables' => ['resource', 'database'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_next_result' => ['bool', 'result'=>'resource'], - 'fbsql_num_fields' => ['int', 'result'=>'resource'], - 'fbsql_num_rows' => ['int', 'result'=>'resource'], - 'fbsql_password' => ['string', 'link_identifier'=>'resource', 'password='=>'string'], - 'fbsql_pconnect' => ['resource', 'hostname='=>'string', 'username='=>'string', 'password='=>'string'], - 'fbsql_query' => ['resource', 'query'=>'string', 'link_identifier='=>'?resource', 'batch_size='=>'int'], - 'fbsql_read_blob' => ['string', 'blob_handle'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_read_clob' => ['string', 'clob_handle'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_result' => ['mixed', 'result'=>'resource', 'row='=>'int', 'field='=>'mixed'], - 'fbsql_rollback' => ['bool', 'link_identifier='=>'?resource'], - 'fbsql_rows_fetched' => ['int', 'result'=>'resource'], - 'fbsql_select_db' => ['bool', 'database_name='=>'string', 'link_identifier='=>'?resource'], - 'fbsql_set_characterset' => ['void', 'link_identifier'=>'resource', 'characterset'=>'int', 'in_out_both='=>'int'], - 'fbsql_set_lob_mode' => ['bool', 'result'=>'resource', 'lob_mode'=>'int'], - 'fbsql_set_password' => ['bool', 'link_identifier'=>'resource', 'user'=>'string', 'password'=>'string', 'old_password'=>'string'], - 'fbsql_set_transaction' => ['void', 'link_identifier'=>'resource', 'locking'=>'int', 'isolation'=>'int'], - 'fbsql_start_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource', 'database_options='=>'string'], - 'fbsql_stop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], - 'fbsql_table_name' => ['string', 'result'=>'resource', 'index'=>'int'], - 'fbsql_username' => ['string', 'link_identifier'=>'resource', 'username='=>'string'], - 'fbsql_warnings' => ['bool', 'onoff='=>'bool'], - 'fclose' => ['bool', 'stream'=>'resource'], - 'fdf_add_doc_javascript' => ['bool', 'fdf_document'=>'resource', 'script_name'=>'string', 'script_code'=>'string'], - 'fdf_add_template' => ['bool', 'fdf_document'=>'resource', 'newpage'=>'int', 'filename'=>'string', 'template'=>'string', 'rename'=>'int'], - 'fdf_close' => ['void', 'fdf_document'=>'resource'], - 'fdf_create' => ['resource'], - 'fdf_enum_values' => ['bool', 'fdf_document'=>'resource', 'function'=>'callable', 'userdata='=>'mixed'], - 'fdf_errno' => ['int'], - 'fdf_error' => ['string', 'error_code='=>'int'], - 'fdf_get_ap' => ['bool', 'fdf_document'=>'resource', 'field'=>'string', 'face'=>'int', 'filename'=>'string'], - 'fdf_get_attachment' => ['array', 'fdf_document'=>'resource', 'fieldname'=>'string', 'savepath'=>'string'], - 'fdf_get_encoding' => ['string', 'fdf_document'=>'resource'], - 'fdf_get_file' => ['string', 'fdf_document'=>'resource'], - 'fdf_get_flags' => ['int', 'fdf_document'=>'resource', 'fieldname'=>'string', 'whichflags'=>'int'], - 'fdf_get_opt' => ['mixed', 'fdf_document'=>'resource', 'fieldname'=>'string', 'element='=>'int'], - 'fdf_get_status' => ['string', 'fdf_document'=>'resource'], - 'fdf_get_value' => ['mixed', 'fdf_document'=>'resource', 'fieldname'=>'string', 'which='=>'int'], - 'fdf_get_version' => ['string', 'fdf_document='=>'resource'], - 'fdf_header' => ['void'], - 'fdf_next_field_name' => ['string', 'fdf_document'=>'resource', 'fieldname='=>'string'], - 'fdf_open' => ['resource|false', 'filename'=>'string'], - 'fdf_open_string' => ['resource', 'fdf_data'=>'string'], - 'fdf_remove_item' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'item'=>'int'], - 'fdf_save' => ['bool', 'fdf_document'=>'resource', 'filename='=>'string'], - 'fdf_save_string' => ['string', 'fdf_document'=>'resource'], - 'fdf_set_ap' => ['bool', 'fdf_document'=>'resource', 'field_name'=>'string', 'face'=>'int', 'filename'=>'string', 'page_number'=>'int'], - 'fdf_set_encoding' => ['bool', 'fdf_document'=>'resource', 'encoding'=>'string'], - 'fdf_set_file' => ['bool', 'fdf_document'=>'resource', 'url'=>'string', 'target_frame='=>'string'], - 'fdf_set_flags' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'whichflags'=>'int', 'newflags'=>'int'], - 'fdf_set_javascript_action' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'trigger'=>'int', 'script'=>'string'], - 'fdf_set_on_import_javascript' => ['bool', 'fdf_document'=>'resource', 'script'=>'string', 'before_data_import'=>'bool'], - 'fdf_set_opt' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'element'=>'int', 'string1'=>'string', 'string2'=>'string'], - 'fdf_set_status' => ['bool', 'fdf_document'=>'resource', 'status'=>'string'], - 'fdf_set_submit_form_action' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'trigger'=>'int', 'script'=>'string', 'flags'=>'int'], - 'fdf_set_target_frame' => ['bool', 'fdf_document'=>'resource', 'frame_name'=>'string'], - 'fdf_set_value' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'value'=>'mixed', 'isname='=>'int'], - 'fdf_set_version' => ['bool', 'fdf_document'=>'resource', 'version'=>'string'], - 'feof' => ['bool', 'stream'=>'resource'], - 'fflush' => ['bool', 'stream'=>'resource'], - 'ffmpeg_animated_gif::__construct' => ['void', 'output_file_path'=>'string', 'width'=>'int', 'height'=>'int', 'frame_rate'=>'int', 'loop_count='=>'int'], - 'ffmpeg_animated_gif::addFrame' => ['', 'frame_to_add'=>'ffmpeg_frame'], - 'ffmpeg_frame::__construct' => ['void', 'gd_image'=>'resource'], - 'ffmpeg_frame::crop' => ['', 'crop_top'=>'int', 'crop_bottom='=>'int', 'crop_left='=>'int', 'crop_right='=>'int'], - 'ffmpeg_frame::getHeight' => ['int'], - 'ffmpeg_frame::getPTS' => ['int'], - 'ffmpeg_frame::getPresentationTimestamp' => ['int'], - 'ffmpeg_frame::getWidth' => ['int'], - 'ffmpeg_frame::resize' => ['', 'width'=>'int', 'height'=>'int', 'crop_top='=>'int', 'crop_bottom='=>'int', 'crop_left='=>'int', 'crop_right='=>'int'], - 'ffmpeg_frame::toGDImage' => ['resource'], - 'ffmpeg_movie::__construct' => ['void', 'path_to_media'=>'string', 'persistent'=>'bool'], - 'ffmpeg_movie::getArtist' => ['string'], - 'ffmpeg_movie::getAudioBitRate' => ['int'], - 'ffmpeg_movie::getAudioChannels' => ['int'], - 'ffmpeg_movie::getAudioCodec' => ['string'], - 'ffmpeg_movie::getAudioSampleRate' => ['int'], - 'ffmpeg_movie::getAuthor' => ['string'], - 'ffmpeg_movie::getBitRate' => ['int'], - 'ffmpeg_movie::getComment' => ['string'], - 'ffmpeg_movie::getCopyright' => ['string'], - 'ffmpeg_movie::getDuration' => ['int'], - 'ffmpeg_movie::getFilename' => ['string'], - 'ffmpeg_movie::getFrame' => ['ffmpeg_frame|false', 'framenumber'=>'int'], - 'ffmpeg_movie::getFrameCount' => ['int'], - 'ffmpeg_movie::getFrameHeight' => ['int'], - 'ffmpeg_movie::getFrameNumber' => ['int'], - 'ffmpeg_movie::getFrameRate' => ['int'], - 'ffmpeg_movie::getFrameWidth' => ['int'], - 'ffmpeg_movie::getGenre' => ['string'], - 'ffmpeg_movie::getNextKeyFrame' => ['ffmpeg_frame|false'], - 'ffmpeg_movie::getPixelFormat' => [''], - 'ffmpeg_movie::getTitle' => ['string'], - 'ffmpeg_movie::getTrackNumber' => ['int|string'], - 'ffmpeg_movie::getVideoBitRate' => ['int'], - 'ffmpeg_movie::getVideoCodec' => ['string'], - 'ffmpeg_movie::getYear' => ['int|string'], - 'ffmpeg_movie::hasAudio' => ['bool'], - 'ffmpeg_movie::hasVideo' => ['bool'], - 'fgetc' => ['string|false', 'stream'=>'resource'], - 'fgetcsv' => ['list|array{0: null}|false|null', 'stream'=>'resource', 'length='=>'int', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'fgets' => ['string|false', 'stream'=>'resource', 'length='=>'int'], - 'fgetss' => ['string|false', 'fp'=>'resource', 'length='=>'int', 'allowable_tags='=>'string'], - 'file' => ['list|false', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], - 'file_exists' => ['bool', 'filename'=>'string'], - 'file_get_contents' => ['string|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'?resource', 'offset='=>'int', 'length='=>'int'], - 'file_put_contents' => ['int|false', 'filename'=>'string', 'data'=>'string|resource|array', 'flags='=>'int', 'context='=>'resource'], - 'fileatime' => ['int|false', 'filename'=>'string'], - 'filectime' => ['int|false', 'filename'=>'string'], - 'filegroup' => ['int|false', 'filename'=>'string'], - 'fileinode' => ['int|false', 'filename'=>'string'], - 'filemtime' => ['int|false', 'filename'=>'string'], - 'fileowner' => ['int|false', 'filename'=>'string'], - 'fileperms' => ['int|false', 'filename'=>'string'], - 'filepro' => ['bool', 'directory'=>'string'], - 'filepro_fieldcount' => ['int'], - 'filepro_fieldname' => ['string', 'field_number'=>'int'], - 'filepro_fieldtype' => ['string', 'field_number'=>'int'], - 'filepro_fieldwidth' => ['int', 'field_number'=>'int'], - 'filepro_retrieve' => ['string', 'row_number'=>'int', 'field_number'=>'int'], - 'filepro_rowcount' => ['int'], - 'filesize' => ['int|false', 'filename'=>'string'], - 'filetype' => ['string|false', 'filename'=>'string'], - 'filter_has_var' => ['bool', 'input_type'=>'int', 'var_name'=>'string'], - 'filter_id' => ['int|false', 'name'=>'string'], - 'filter_input' => ['mixed|false', 'type'=>'int', 'var_name'=>'string', 'filter='=>'int', 'options='=>'array|int'], - 'filter_input_array' => ['mixed|false', 'type'=>'int', 'options='=>'int|array', 'add_empty='=>'bool'], - 'filter_list' => ['array'], - 'filter_var' => ['mixed|false', 'value'=>'mixed', 'filter='=>'int', 'options='=>'array|int'], - 'filter_var_array' => ['array|false|null', 'array'=>'array', 'options='=>'array|int', 'add_empty='=>'bool'], - 'finfo::__construct' => ['void', 'options='=>'int', 'magic_file='=>'string'], - 'finfo::buffer' => ['string|false', 'string'=>'string', 'options='=>'int', 'context='=>'resource'], - 'finfo::file' => ['string|false', 'file_name'=>'string', 'options='=>'int', 'context='=>'resource'], - 'finfo::finfo' => ['void', 'options='=>'int', 'magic_file='=>'string'], - 'finfo::set_flags' => ['bool', 'options'=>'int'], - 'finfo_buffer' => ['string|false', 'finfo'=>'resource', 'string'=>'string', 'flags='=>'int', 'context='=>'resource'], - 'finfo_close' => ['bool', 'finfo'=>'resource'], - 'finfo_file' => ['string|false', 'finfo'=>'resource', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'], - 'finfo_open' => ['resource|false', 'flags='=>'int', 'magic_database='=>'string'], - 'finfo_set_flags' => ['bool', 'finfo'=>'resource', 'flags'=>'int'], - 'floatval' => ['float', 'value'=>'mixed'], - 'flock' => ['bool', 'stream'=>'resource', 'operation'=>'int', '&w_would_block='=>'int'], - 'floor' => ['float', 'num'=>'float'], - 'flush' => ['void'], - 'fmod' => ['float', 'num1'=>'float', 'num2'=>'float'], - 'fnmatch' => ['bool', 'pattern'=>'string', 'filename'=>'string', 'flags='=>'int'], - 'fopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'bool', 'context='=>'resource|null'], - 'forward_static_call' => ['mixed|false', 'callback'=>'callable', '...args='=>'mixed'], - 'forward_static_call_array' => ['mixed|false', 'callback'=>'callable', 'args'=>'list'], - 'fpassthru' => ['int|false', 'stream'=>'resource'], - 'fprintf' => ['int', 'stream'=>'resource', 'format'=>'string', '...values='=>'string|int|float'], - 'fputcsv' => ['int|false', 'stream'=>'resource', 'fields'=>'array', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'fputs' => ['int|false', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], - 'fread' => ['string|false', 'stream'=>'resource', 'length'=>'int'], - 'frenchtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], - 'fribidi_log2vis' => ['string', 'string'=>'string', 'direction'=>'string', 'charset'=>'int'], - 'fscanf' => ['list', 'stream'=>'resource', 'format'=>'string'], - 'fscanf\'1' => ['int', 'stream'=>'resource', 'format'=>'string', '&...w_vars='=>'string|int|float'], - 'fseek' => ['int', 'stream'=>'resource', 'offset'=>'int', 'whence='=>'int'], - 'fsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float'], - 'fstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'stream'=>'resource'], - 'ftell' => ['int|false', 'stream'=>'resource'], - 'ftok' => ['int', 'filename'=>'string', 'project_id'=>'string'], - 'ftp_alloc' => ['bool', 'ftp'=>'resource', 'size'=>'int', '&w_response='=>'string'], - 'ftp_cdup' => ['bool', 'ftp'=>'resource'], - 'ftp_chdir' => ['bool', 'ftp'=>'resource', 'directory'=>'string'], - 'ftp_chmod' => ['int|false', 'ftp'=>'resource', 'permissions'=>'int', 'filename'=>'string'], - 'ftp_close' => ['bool', 'ftp'=>'resource'], - 'ftp_connect' => ['resource|false', 'hostname'=>'string', 'port='=>'int', 'timeout='=>'int'], - 'ftp_delete' => ['bool', 'ftp'=>'resource', 'filename'=>'string'], - 'ftp_exec' => ['bool', 'ftp'=>'resource', 'command'=>'string'], - 'ftp_fget' => ['bool', 'ftp'=>'resource', 'stream'=>'resource', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], - 'ftp_fput' => ['bool', 'ftp'=>'resource', 'remote_filename'=>'string', 'stream'=>'resource', 'mode='=>'int', 'offset='=>'int'], - 'ftp_get' => ['bool', 'ftp'=>'resource', 'local_filename'=>'string', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], - 'ftp_get_option' => ['mixed|false', 'ftp'=>'resource', 'option'=>'int'], - 'ftp_login' => ['bool', 'ftp'=>'resource', 'username'=>'string', 'password'=>'string'], - 'ftp_mdtm' => ['int', 'ftp'=>'resource', 'filename'=>'string'], - 'ftp_mkdir' => ['string|false', 'ftp'=>'resource', 'directory'=>'string'], - 'ftp_mlsd' => ['array|false', 'ftp'=>'resource', 'directory'=>'string'], - 'ftp_nb_continue' => ['int', 'ftp'=>'resource'], - 'ftp_nb_fget' => ['int', 'ftp'=>'resource', 'stream'=>'resource', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], - 'ftp_nb_fput' => ['int', 'ftp'=>'resource', 'remote_filename'=>'string', 'stream'=>'resource', 'mode='=>'int', 'offset='=>'int'], - 'ftp_nb_get' => ['int', 'ftp'=>'resource', 'local_filename'=>'string', 'remote_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], - 'ftp_nb_put' => ['int', 'ftp'=>'resource', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], - 'ftp_nlist' => ['array|false', 'ftp'=>'resource', 'directory'=>'string'], - 'ftp_pasv' => ['bool', 'ftp'=>'resource', 'enable'=>'bool'], - 'ftp_put' => ['bool', 'ftp'=>'resource', 'remote_filename'=>'string', 'local_filename'=>'string', 'mode='=>'int', 'offset='=>'int'], - 'ftp_pwd' => ['string|false', 'ftp'=>'resource'], - 'ftp_quit' => ['bool', 'ftp'=>'resource'], - 'ftp_raw' => ['?array', 'ftp'=>'resource', 'command'=>'string'], - 'ftp_rawlist' => ['array|false', 'ftp'=>'resource', 'directory'=>'string', 'recursive='=>'bool'], - 'ftp_rename' => ['bool', 'ftp'=>'resource', 'from'=>'string', 'to'=>'string'], - 'ftp_rmdir' => ['bool', 'ftp'=>'resource', 'directory'=>'string'], - 'ftp_set_option' => ['bool', 'ftp'=>'resource', 'option'=>'int', 'value'=>'mixed'], - 'ftp_site' => ['bool', 'ftp'=>'resource', 'command'=>'string'], - 'ftp_size' => ['int', 'ftp'=>'resource', 'filename'=>'string'], - 'ftp_ssl_connect' => ['resource|false', 'hostname'=>'string', 'port='=>'int', 'timeout='=>'int'], - 'ftp_systype' => ['string|false', 'ftp'=>'resource'], - 'ftruncate' => ['bool', 'stream'=>'resource', 'size'=>'int'], - 'func_get_arg' => ['mixed|false', 'position'=>'int'], - 'func_get_args' => ['list'], - 'func_num_args' => ['int'], - 'function_exists' => ['bool', 'function'=>'string'], - 'fwrite' => ['int|false', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], - 'gc_collect_cycles' => ['int'], - 'gc_disable' => ['void'], - 'gc_enable' => ['void'], - 'gc_enabled' => ['bool'], - 'gc_mem_caches' => ['int'], - 'gd_info' => ['array'], - 'gearman_bugreport' => [''], - 'gearman_client_add_options' => ['', 'client_object'=>'', 'option'=>''], - 'gearman_client_add_server' => ['', 'client_object'=>'', 'host'=>'', 'port'=>''], - 'gearman_client_add_servers' => ['', 'client_object'=>'', 'servers'=>''], - 'gearman_client_add_task' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], - 'gearman_client_add_task_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], - 'gearman_client_add_task_high' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], - 'gearman_client_add_task_high_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], - 'gearman_client_add_task_low' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], - 'gearman_client_add_task_low_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'context'=>'', 'unique'=>''], - 'gearman_client_add_task_status' => ['', 'client_object'=>'', 'job_handle'=>'', 'context'=>''], - 'gearman_client_clear_fn' => ['', 'client_object'=>''], - 'gearman_client_clone' => ['', 'client_object'=>''], - 'gearman_client_context' => ['', 'client_object'=>''], - 'gearman_client_create' => ['', 'client_object'=>''], - 'gearman_client_do' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], - 'gearman_client_do_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], - 'gearman_client_do_high' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], - 'gearman_client_do_high_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], - 'gearman_client_do_job_handle' => ['', 'client_object'=>''], - 'gearman_client_do_low' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], - 'gearman_client_do_low_background' => ['', 'client_object'=>'', 'function_name'=>'', 'workload'=>'', 'unique'=>''], - 'gearman_client_do_normal' => ['', 'client_object'=>'', 'function_name'=>'string', 'workload'=>'string', 'unique'=>'string'], - 'gearman_client_do_status' => ['', 'client_object'=>''], - 'gearman_client_echo' => ['', 'client_object'=>'', 'workload'=>''], - 'gearman_client_errno' => ['', 'client_object'=>''], - 'gearman_client_error' => ['', 'client_object'=>''], - 'gearman_client_job_status' => ['', 'client_object'=>'', 'job_handle'=>''], - 'gearman_client_options' => ['', 'client_object'=>''], - 'gearman_client_remove_options' => ['', 'client_object'=>'', 'option'=>''], - 'gearman_client_return_code' => ['', 'client_object'=>''], - 'gearman_client_run_tasks' => ['', 'data'=>''], - 'gearman_client_set_complete_fn' => ['', 'client_object'=>'', 'callback'=>''], - 'gearman_client_set_context' => ['', 'client_object'=>'', 'context'=>''], - 'gearman_client_set_created_fn' => ['', 'client_object'=>'', 'callback'=>''], - 'gearman_client_set_data_fn' => ['', 'client_object'=>'', 'callback'=>''], - 'gearman_client_set_exception_fn' => ['', 'client_object'=>'', 'callback'=>''], - 'gearman_client_set_fail_fn' => ['', 'client_object'=>'', 'callback'=>''], - 'gearman_client_set_options' => ['', 'client_object'=>'', 'option'=>''], - 'gearman_client_set_status_fn' => ['', 'client_object'=>'', 'callback'=>''], - 'gearman_client_set_timeout' => ['', 'client_object'=>'', 'timeout'=>''], - 'gearman_client_set_warning_fn' => ['', 'client_object'=>'', 'callback'=>''], - 'gearman_client_set_workload_fn' => ['', 'client_object'=>'', 'callback'=>''], - 'gearman_client_timeout' => ['', 'client_object'=>''], - 'gearman_client_wait' => ['', 'client_object'=>''], - 'gearman_job_function_name' => ['', 'job_object'=>''], - 'gearman_job_handle' => ['string'], - 'gearman_job_return_code' => ['', 'job_object'=>''], - 'gearman_job_send_complete' => ['', 'job_object'=>'', 'result'=>''], - 'gearman_job_send_data' => ['', 'job_object'=>'', 'data'=>''], - 'gearman_job_send_exception' => ['', 'job_object'=>'', 'exception'=>''], - 'gearman_job_send_fail' => ['', 'job_object'=>''], - 'gearman_job_send_status' => ['', 'job_object'=>'', 'numerator'=>'', 'denominator'=>''], - 'gearman_job_send_warning' => ['', 'job_object'=>'', 'warning'=>''], - 'gearman_job_status' => ['array', 'job_handle'=>'string'], - 'gearman_job_unique' => ['', 'job_object'=>''], - 'gearman_job_workload' => ['', 'job_object'=>''], - 'gearman_job_workload_size' => ['', 'job_object'=>''], - 'gearman_task_data' => ['', 'task_object'=>''], - 'gearman_task_data_size' => ['', 'task_object'=>''], - 'gearman_task_denominator' => ['', 'task_object'=>''], - 'gearman_task_function_name' => ['', 'task_object'=>''], - 'gearman_task_is_known' => ['', 'task_object'=>''], - 'gearman_task_is_running' => ['', 'task_object'=>''], - 'gearman_task_job_handle' => ['', 'task_object'=>''], - 'gearman_task_numerator' => ['', 'task_object'=>''], - 'gearman_task_recv_data' => ['', 'task_object'=>'', 'data_len'=>''], - 'gearman_task_return_code' => ['', 'task_object'=>''], - 'gearman_task_send_workload' => ['', 'task_object'=>'', 'data'=>''], - 'gearman_task_unique' => ['', 'task_object'=>''], - 'gearman_verbose_name' => ['', 'verbose'=>''], - 'gearman_version' => [''], - 'gearman_worker_add_function' => ['', 'worker_object'=>'', 'function_name'=>'', 'function'=>'', 'data'=>'', 'timeout'=>''], - 'gearman_worker_add_options' => ['', 'worker_object'=>'', 'option'=>''], - 'gearman_worker_add_server' => ['', 'worker_object'=>'', 'host'=>'', 'port'=>''], - 'gearman_worker_add_servers' => ['', 'worker_object'=>'', 'servers'=>''], - 'gearman_worker_clone' => ['', 'worker_object'=>''], - 'gearman_worker_create' => [''], - 'gearman_worker_echo' => ['', 'worker_object'=>'', 'workload'=>''], - 'gearman_worker_errno' => ['', 'worker_object'=>''], - 'gearman_worker_error' => ['', 'worker_object'=>''], - 'gearman_worker_grab_job' => ['', 'worker_object'=>''], - 'gearman_worker_options' => ['', 'worker_object'=>''], - 'gearman_worker_register' => ['', 'worker_object'=>'', 'function_name'=>'', 'timeout'=>''], - 'gearman_worker_remove_options' => ['', 'worker_object'=>'', 'option'=>''], - 'gearman_worker_return_code' => ['', 'worker_object'=>''], - 'gearman_worker_set_options' => ['', 'worker_object'=>'', 'option'=>''], - 'gearman_worker_set_timeout' => ['', 'worker_object'=>'', 'timeout'=>''], - 'gearman_worker_timeout' => ['', 'worker_object'=>''], - 'gearman_worker_unregister' => ['', 'worker_object'=>'', 'function_name'=>''], - 'gearman_worker_unregister_all' => ['', 'worker_object'=>''], - 'gearman_worker_wait' => ['', 'worker_object'=>''], - 'gearman_worker_work' => ['', 'worker_object'=>''], - 'geoip_asnum_by_name' => ['string|false', 'hostname'=>'string'], - 'geoip_continent_code_by_name' => ['string|false', 'hostname'=>'string'], - 'geoip_country_code3_by_name' => ['string|false', 'hostname'=>'string'], - 'geoip_country_code_by_name' => ['string|false', 'hostname'=>'string'], - 'geoip_country_name_by_name' => ['string|false', 'hostname'=>'string'], - 'geoip_database_info' => ['string', 'database='=>'int'], - 'geoip_db_avail' => ['bool', 'database'=>'int'], - 'geoip_db_filename' => ['string', 'database'=>'int'], - 'geoip_db_get_all_info' => ['array'], - 'geoip_domain_by_name' => ['string', 'hostname'=>'string'], - 'geoip_id_by_name' => ['int', 'hostname'=>'string'], - 'geoip_isp_by_name' => ['string|false', 'hostname'=>'string'], - 'geoip_netspeedcell_by_name' => ['string|false', 'hostname'=>'string'], - 'geoip_org_by_name' => ['string|false', 'hostname'=>'string'], - 'geoip_record_by_name' => ['array|false', 'hostname'=>'string'], - 'geoip_region_by_name' => ['array|false', 'hostname'=>'string'], - 'geoip_region_name_by_code' => ['string|false', 'country_code'=>'string', 'region_code'=>'string'], - 'geoip_setup_custom_directory' => ['void', 'path'=>'string'], - 'geoip_time_zone_by_country_and_region' => ['string|false', 'country_code'=>'string', 'region_code='=>'string'], - 'get_browser' => ['array|object|false', 'user_agent='=>'?string', 'return_array='=>'bool'], - 'get_call_stack' => [''], - 'get_called_class' => ['class-string'], - 'get_cfg_var' => ['string|false', 'option'=>'string'], - 'get_class' => ['class-string', 'object='=>'object'], - 'get_class_methods' => ['list|null', 'object_or_class'=>'mixed'], - 'get_class_vars' => ['array', 'class'=>'string'], - 'get_current_user' => ['string'], - 'get_declared_classes' => ['list'], - 'get_declared_interfaces' => ['list'], - 'get_declared_traits' => ['list|null'], - 'get_defined_constants' => ['array', 'categorize='=>'bool'], - 'get_defined_functions' => ['array>', 'exclude_disabled='=>'bool'], - 'get_defined_vars' => ['array'], - 'get_extension_funcs' => ['list|false', 'extension'=>'string'], - 'get_headers' => ['array|false', 'url'=>'string', 'associative='=>'int'], - 'get_html_translation_table' => ['array', 'table='=>'int', 'flags='=>'int', 'encoding='=>'string'], - 'get_include_path' => ['string'], - 'get_included_files' => ['list'], - 'get_loaded_extensions' => ['list', 'zend_extensions='=>'bool'], - 'get_magic_quotes_gpc' => ['int|false'], - 'get_magic_quotes_runtime' => ['int|false'], - 'get_meta_tags' => ['array', 'filename'=>'string', 'use_include_path='=>'bool'], - 'get_object_vars' => ['array', 'object'=>'object'], - 'get_parent_class' => ['class-string|false', 'object_or_class='=>'mixed'], - 'get_required_files' => ['list'], - 'get_resource_type' => ['string', 'resource'=>'resource'], - 'get_resources' => ['array', 'type='=>'string'], - 'getallheaders' => ['array|false'], - 'getcwd' => ['string|false'], - 'getdate' => ['array{seconds: int<0, 59>, minutes: int<0, 59>, hours: int<0, 23>, mday: int<1, 31>, wday: int<0, 6>, mon: int<1, 12>, year: int, yday: int<0, 365>, weekday: "Monday"|"Tuesday"|"Wednesday"|"Thursday"|"Friday"|"Saturday"|"Sunday", month: "January"|"February"|"March"|"April"|"May"|"June"|"July"|"August"|"September"|"October"|"November"|"December", 0: int}', 'timestamp='=>'int'], - 'getenv' => ['string|false', 'name'=>'string', 'local_only='=>'bool'], - 'gethostbyaddr' => ['string|false', 'ip'=>'string'], - 'gethostbyname' => ['string', 'hostname'=>'string'], - 'gethostbynamel' => ['list|false', 'hostname'=>'string'], - 'gethostname' => ['string|false'], - 'getimagesize' => ['array|false', 'filename'=>'string', '&w_image_info='=>'array'], - 'getimagesizefromstring' => ['array|false', 'string'=>'string', '&w_image_info='=>'array'], - 'getlastmod' => ['int|false'], - 'getmxrr' => ['bool', 'hostname'=>'string', '&w_hosts'=>'array', '&w_weights='=>'array'], - 'getmygid' => ['int|false'], - 'getmyinode' => ['int|false'], - 'getmypid' => ['int|false'], - 'getmyuid' => ['int|false'], - 'getopt' => ['array|array|array>|false', 'short_options'=>'string', 'long_options='=>'array'], - 'getprotobyname' => ['int|false', 'protocol'=>'string'], - 'getprotobynumber' => ['string', 'protocol'=>'int'], - 'getrandmax' => ['int'], - 'getrusage' => ['array', 'mode='=>'int'], - 'getservbyname' => ['int|false', 'service'=>'string', 'protocol'=>'string'], - 'getservbyport' => ['string|false', 'port'=>'int', 'protocol'=>'string'], - 'gettext' => ['string', 'message'=>'string'], - 'gettimeofday' => ['array'], - 'gettimeofday\'1' => ['float', 'as_float='=>'true'], - 'gettype' => ['string', 'value'=>'mixed'], - 'glob' => ['list|false', 'pattern'=>'string', 'flags='=>'int'], - 'gmdate' => ['string', 'format'=>'string', 'timestamp='=>'int'], - 'gmmktime' => ['int|false', 'hour='=>'int', 'minute='=>'int', 'second='=>'int', 'month='=>'int', 'day='=>'int', 'year='=>'int'], - 'gmp_abs' => ['GMP', 'num'=>'GMP|string|int'], - 'gmp_add' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_and' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_clrbit' => ['void', 'num'=>'GMP|string|int', 'index'=>'int'], - 'gmp_cmp' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_com' => ['GMP', 'num'=>'GMP|string|int'], - 'gmp_div' => ['GMP', 'num1'=>'GMP|resource|string', 'num2'=>'GMP|resource|string', 'rounding_mode='=>'int'], - 'gmp_div_q' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], - 'gmp_div_qr' => ['array{0: GMP, 1: GMP}', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], - 'gmp_div_r' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int', 'rounding_mode='=>'int'], - 'gmp_divexact' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_export' => ['string|false', 'num'=>'GMP|string|int', 'word_size='=>'int', 'flags='=>'int'], - 'gmp_fact' => ['GMP', 'num'=>'int'], - 'gmp_gcd' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_gcdext' => ['array', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_hamdist' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_import' => ['GMP|false', 'data'=>'string', 'word_size='=>'int', 'flags='=>'int'], - 'gmp_init' => ['GMP', 'num'=>'int|string', 'base='=>'int'], - 'gmp_intval' => ['int', 'num'=>'GMP|string|int'], - 'gmp_invert' => ['GMP|false', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_jacobi' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_legendre' => ['int', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_mod' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_mul' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_neg' => ['GMP', 'num'=>'GMP|string|int'], - 'gmp_nextprime' => ['GMP', 'num'=>'GMP|string|int'], - 'gmp_or' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_perfect_square' => ['bool', 'num'=>'GMP|string|int'], - 'gmp_popcount' => ['int', 'num'=>'GMP|string|int'], - 'gmp_pow' => ['GMP', 'num'=>'GMP|string|int', 'exponent'=>'int'], - 'gmp_powm' => ['GMP', 'num'=>'GMP|string|int', 'exponent'=>'GMP|string|int', 'modulus'=>'GMP|string|int'], - 'gmp_prob_prime' => ['int', 'num'=>'GMP|string|int', 'repetitions='=>'int'], - 'gmp_random' => ['GMP', 'limiter='=>'int'], - 'gmp_random_bits' => ['GMP', 'bits'=>'int'], - 'gmp_random_range' => ['GMP', 'min'=>'GMP|string|int', 'max'=>'GMP|string|int'], - 'gmp_random_seed' => ['void', 'seed'=>'GMP|string|int'], - 'gmp_root' => ['GMP', 'num'=>'GMP|string|int', 'nth'=>'int'], - 'gmp_rootrem' => ['array{0: GMP, 1: GMP}', 'num'=>'GMP|string|int', 'nth'=>'int'], - 'gmp_scan0' => ['int', 'num1'=>'GMP|string|int', 'start'=>'int'], - 'gmp_scan1' => ['int', 'num1'=>'GMP|string|int', 'start'=>'int'], - 'gmp_setbit' => ['void', 'num'=>'GMP|string|int', 'index'=>'int', 'value='=>'bool'], - 'gmp_sign' => ['int', 'num'=>'GMP|string|int'], - 'gmp_sqrt' => ['GMP', 'num'=>'GMP|string|int'], - 'gmp_sqrtrem' => ['array{0: GMP, 1: GMP}', 'num'=>'GMP|string|int'], - 'gmp_strval' => ['numeric-string', 'num'=>'GMP|string|int', 'base='=>'int'], - 'gmp_sub' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmp_testbit' => ['bool', 'num'=>'GMP|string|int', 'index'=>'int'], - 'gmp_xor' => ['GMP', 'num1'=>'GMP|string|int', 'num2'=>'GMP|string|int'], - 'gmstrftime' => ['string|false', 'format'=>'string', 'timestamp='=>'int'], - 'gnupg::adddecryptkey' => ['bool', 'fingerprint'=>'string', 'passphrase'=>'string'], - 'gnupg::addencryptkey' => ['bool', 'fingerprint'=>'string'], - 'gnupg::addsignkey' => ['bool', 'fingerprint'=>'string', 'passphrase='=>'string'], - 'gnupg::cleardecryptkeys' => ['bool'], - 'gnupg::clearencryptkeys' => ['bool'], - 'gnupg::clearsignkeys' => ['bool'], - 'gnupg::decrypt' => ['string|false', 'text'=>'string'], - 'gnupg::decryptverify' => ['array|false', 'text'=>'string', '&plaintext'=>'string'], - 'gnupg::encrypt' => ['string|false', 'plaintext'=>'string'], - 'gnupg::encryptsign' => ['string|false', 'plaintext'=>'string'], - 'gnupg::export' => ['string|false', 'fingerprint'=>'string'], - 'gnupg::geterror' => ['string|false'], - 'gnupg::getprotocol' => ['int'], - 'gnupg::import' => ['array|false', 'keydata'=>'string'], - 'gnupg::init' => ['resource'], - 'gnupg::keyinfo' => ['array', 'pattern'=>'string'], - 'gnupg::setarmor' => ['bool', 'armor'=>'int'], - 'gnupg::seterrormode' => ['void', 'errormode'=>'int'], - 'gnupg::setsignmode' => ['bool', 'signmode'=>'int'], - 'gnupg::sign' => ['string|false', 'plaintext'=>'string'], - 'gnupg::verify' => ['array|false', 'signed_text'=>'string', 'signature'=>'string', '&plaintext='=>'string'], - 'gnupg_adddecryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase'=>'string'], - 'gnupg_addencryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string'], - 'gnupg_addsignkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase='=>'string'], - 'gnupg_cleardecryptkeys' => ['bool', 'identifier'=>'resource'], - 'gnupg_clearencryptkeys' => ['bool', 'identifier'=>'resource'], - 'gnupg_clearsignkeys' => ['bool', 'identifier'=>'resource'], - 'gnupg_decrypt' => ['string', 'identifier'=>'resource', 'text'=>'string'], - 'gnupg_decryptverify' => ['array', 'identifier'=>'resource', 'text'=>'string', 'plaintext'=>'string'], - 'gnupg_encrypt' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], - 'gnupg_encryptsign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], - 'gnupg_export' => ['string', 'identifier'=>'resource', 'fingerprint'=>'string'], - 'gnupg_geterror' => ['string', 'identifier'=>'resource'], - 'gnupg_getprotocol' => ['int', 'identifier'=>'resource'], - 'gnupg_import' => ['array', 'identifier'=>'resource', 'keydata'=>'string'], - 'gnupg_init' => ['resource'], - 'gnupg_keyinfo' => ['array', 'identifier'=>'resource', 'pattern'=>'string'], - 'gnupg_setarmor' => ['bool', 'identifier'=>'resource', 'armor'=>'int'], - 'gnupg_seterrormode' => ['void', 'identifier'=>'resource', 'errormode'=>'int'], - 'gnupg_setsignmode' => ['bool', 'identifier'=>'resource', 'signmode'=>'int'], - 'gnupg_sign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'], - 'gnupg_verify' => ['array', 'identifier'=>'resource', 'signed_text'=>'string', 'signature'=>'string', 'plaintext='=>'string'], - 'gopher_parsedir' => ['array', 'dirent'=>'string'], - 'grapheme_extract' => ['string|false', 'haystack'=>'string', 'size'=>'int', 'type='=>'int', 'offset='=>'int', '&w_next='=>'int'], - 'grapheme_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], - 'grapheme_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'beforeNeedle='=>'bool'], - 'grapheme_strlen' => ['0|positive-int|false|null', 'string'=>'string'], - 'grapheme_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], - 'grapheme_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], - 'grapheme_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], - 'grapheme_strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'beforeNeedle='=>'bool'], - 'grapheme_substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int'], - 'gregoriantojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], - 'gridObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'gupnp_context_get_host_ip' => ['string', 'context'=>'resource'], - 'gupnp_context_get_port' => ['int', 'context'=>'resource'], - 'gupnp_context_get_subscription_timeout' => ['int', 'context'=>'resource'], - 'gupnp_context_host_path' => ['bool', 'context'=>'resource', 'local_path'=>'string', 'server_path'=>'string'], - 'gupnp_context_new' => ['resource', 'host_ip='=>'string', 'port='=>'int'], - 'gupnp_context_set_subscription_timeout' => ['void', 'context'=>'resource', 'timeout'=>'int'], - 'gupnp_context_timeout_add' => ['bool', 'context'=>'resource', 'timeout'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], - 'gupnp_context_unhost_path' => ['bool', 'context'=>'resource', 'server_path'=>'string'], - 'gupnp_control_point_browse_start' => ['bool', 'cpoint'=>'resource'], - 'gupnp_control_point_browse_stop' => ['bool', 'cpoint'=>'resource'], - 'gupnp_control_point_callback_set' => ['bool', 'cpoint'=>'resource', 'signal'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], - 'gupnp_control_point_new' => ['resource', 'context'=>'resource', 'target'=>'string'], - 'gupnp_device_action_callback_set' => ['bool', 'root_device'=>'resource', 'signal'=>'int', 'action_name'=>'string', 'callback'=>'mixed', 'arg='=>'mixed'], - 'gupnp_device_info_get' => ['array', 'root_device'=>'resource'], - 'gupnp_device_info_get_service' => ['resource', 'root_device'=>'resource', 'type'=>'string'], - 'gupnp_root_device_get_available' => ['bool', 'root_device'=>'resource'], - 'gupnp_root_device_get_relative_location' => ['string', 'root_device'=>'resource'], - 'gupnp_root_device_new' => ['resource', 'context'=>'resource', 'location'=>'string', 'description_dir'=>'string'], - 'gupnp_root_device_set_available' => ['bool', 'root_device'=>'resource', 'available'=>'bool'], - 'gupnp_root_device_start' => ['bool', 'root_device'=>'resource'], - 'gupnp_root_device_stop' => ['bool', 'root_device'=>'resource'], - 'gupnp_service_action_get' => ['mixed', 'action'=>'resource', 'name'=>'string', 'type'=>'int'], - 'gupnp_service_action_return' => ['bool', 'action'=>'resource'], - 'gupnp_service_action_return_error' => ['bool', 'action'=>'resource', 'error_code'=>'int', 'error_description='=>'string'], - 'gupnp_service_action_set' => ['bool', 'action'=>'resource', 'name'=>'string', 'type'=>'int', 'value'=>'mixed'], - 'gupnp_service_freeze_notify' => ['bool', 'service'=>'resource'], - 'gupnp_service_info_get' => ['array', 'proxy'=>'resource'], - 'gupnp_service_info_get_introspection' => ['mixed', 'proxy'=>'resource', 'callback='=>'mixed', 'arg='=>'mixed'], - 'gupnp_service_introspection_get_state_variable' => ['array', 'introspection'=>'resource', 'variable_name'=>'string'], - 'gupnp_service_notify' => ['bool', 'service'=>'resource', 'name'=>'string', 'type'=>'int', 'value'=>'mixed'], - 'gupnp_service_proxy_action_get' => ['mixed', 'proxy'=>'resource', 'action'=>'string', 'name'=>'string', 'type'=>'int'], - 'gupnp_service_proxy_action_set' => ['bool', 'proxy'=>'resource', 'action'=>'string', 'name'=>'string', 'value'=>'mixed', 'type'=>'int'], - 'gupnp_service_proxy_add_notify' => ['bool', 'proxy'=>'resource', 'value'=>'string', 'type'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], - 'gupnp_service_proxy_callback_set' => ['bool', 'proxy'=>'resource', 'signal'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], - 'gupnp_service_proxy_get_subscribed' => ['bool', 'proxy'=>'resource'], - 'gupnp_service_proxy_remove_notify' => ['bool', 'proxy'=>'resource', 'value'=>'string'], - 'gupnp_service_proxy_send_action' => ['array', 'proxy'=>'resource', 'action'=>'string', 'in_params'=>'array', 'out_params'=>'array'], - 'gupnp_service_proxy_set_subscribed' => ['bool', 'proxy'=>'resource', 'subscribed'=>'bool'], - 'gupnp_service_thaw_notify' => ['bool', 'service'=>'resource'], - 'gzclose' => ['bool', 'stream'=>'resource'], - 'gzcompress' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], - 'gzdecode' => ['string|false', 'data'=>'string', 'max_length='=>'int'], - 'gzdeflate' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], - 'gzencode' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], - 'gzeof' => ['bool|int', 'stream'=>'resource'], - 'gzfile' => ['list', 'filename'=>'string', 'use_include_path='=>'int'], - 'gzgetc' => ['string|false', 'stream'=>'resource'], - 'gzgets' => ['string|false', 'stream'=>'resource', 'length='=>'int'], - 'gzgetss' => ['string|false', 'zp'=>'resource', 'length'=>'int', 'allowable_tags='=>'string'], - 'gzinflate' => ['string|false', 'data'=>'string', 'max_length='=>'int'], - 'gzopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'int'], - 'gzpassthru' => ['int|false', 'stream'=>'resource'], - 'gzputs' => ['int', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], - 'gzread' => ['string|0', 'stream'=>'resource', 'length'=>'int'], - 'gzrewind' => ['bool', 'stream'=>'resource'], - 'gzseek' => ['int', 'stream'=>'resource', 'offset'=>'int', 'whence='=>'int'], - 'gztell' => ['int|false', 'stream'=>'resource'], - 'gzuncompress' => ['string|false', 'data'=>'string', 'max_length='=>'int'], - 'gzwrite' => ['int', 'stream'=>'resource', 'data'=>'string', 'length='=>'int'], - 'hash' => ['string|false', 'algo'=>'string', 'data'=>'string', 'binary='=>'bool'], - 'hashTableObj::clear' => ['void'], - 'hashTableObj::get' => ['string', 'key'=>'string'], - 'hashTableObj::nextkey' => ['string', 'previousKey'=>'string'], - 'hashTableObj::remove' => ['int', 'key'=>'string'], - 'hashTableObj::set' => ['int', 'key'=>'string', 'value'=>'string'], - 'hash_algos' => ['list'], - 'hash_copy' => ['resource', 'context'=>'resource'], - 'hash_equals' => ['bool', 'known_string'=>'string', 'user_string'=>'string'], - 'hash_file' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'binary='=>'bool'], - 'hash_final' => ['string', 'context'=>'resource', 'raw_output='=>'bool'], - 'hash_hmac' => ['string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'binary='=>'bool'], - 'hash_hmac_file' => ['string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'binary='=>'bool'], - 'hash_init' => ['resource', 'algo'=>'string', 'options='=>'int', 'key='=>'string'], - 'hash_pbkdf2' => ['string', 'algo'=>'string', 'password'=>'string', 'salt'=>'string', 'iterations'=>'int', 'length='=>'int', 'binary='=>'bool'], - 'hash_update' => ['bool', 'context'=>'resource', 'data'=>'string'], - 'hash_update_file' => ['bool', 'hcontext'=>'resource', 'filename'=>'string', 'scontext='=>'resource'], - 'hash_update_stream' => ['int', 'context'=>'resource', 'handle'=>'resource', 'length='=>'int'], - 'header' => ['void', 'header'=>'string', 'replace='=>'bool', 'response_code='=>'int'], - 'header_register_callback' => ['bool', 'callback'=>'callable():void'], - 'header_remove' => ['void', 'name='=>'string'], - 'headers_list' => ['list'], - 'headers_sent' => ['bool', '&w_filename='=>'string', '&w_line='=>'int'], - 'hebrev' => ['string', 'string'=>'string', 'max_chars_per_line='=>'int'], - 'hebrevc' => ['string', 'string'=>'string', 'max_chars_per_line='=>'int'], - 'hex2bin' => ['string|false', 'string'=>'string'], - 'hexdec' => ['int|float', 'hex_string'=>'string'], - 'highlight_file' => ['string|bool', 'filename'=>'string', 'return='=>'bool'], - 'highlight_string' => ['string|bool', 'string'=>'string', 'return='=>'bool'], - 'html_entity_decode' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string'], - 'htmlentities' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string', 'double_encode='=>'bool'], - 'htmlspecialchars' => ['string', 'string'=>'string', 'flags='=>'int', 'encoding='=>'string|null', 'double_encode='=>'bool'], - 'htmlspecialchars_decode' => ['string', 'string'=>'string', 'flags='=>'int'], - 'http\Client::__construct' => ['void', 'driver='=>'string', 'persistent_handle_id='=>'string'], - 'http\Client::addCookies' => ['http\Client', 'cookies='=>'?array'], - 'http\Client::addSslOptions' => ['http\Client', 'ssl_options='=>'?array'], - 'http\Client::attach' => ['void', 'observer'=>'SplObserver'], - 'http\Client::configure' => ['http\Client', 'settings'=>'array'], - 'http\Client::count' => ['int'], - 'http\Client::dequeue' => ['http\Client', 'request'=>'http\Client\Request'], - 'http\Client::detach' => ['void', 'observer'=>'SplObserver'], - 'http\Client::enableEvents' => ['http\Client', 'enable='=>'mixed'], - 'http\Client::enablePipelining' => ['http\Client', 'enable='=>'mixed'], - 'http\Client::enqueue' => ['http\Client', 'request'=>'http\Client\Request', 'callable='=>'mixed'], - 'http\Client::getAvailableConfiguration' => ['array'], - 'http\Client::getAvailableDrivers' => ['array'], - 'http\Client::getAvailableOptions' => ['array'], - 'http\Client::getCookies' => ['array'], - 'http\Client::getHistory' => ['http\Message'], - 'http\Client::getObservers' => ['SplObjectStorage'], - 'http\Client::getOptions' => ['array'], - 'http\Client::getProgressInfo' => ['null|object', 'request'=>'http\Client\Request'], - 'http\Client::getResponse' => ['http\Client\Response|null', 'request='=>'?http\Client\Request'], - 'http\Client::getSslOptions' => ['array'], - 'http\Client::getTransferInfo' => ['object', 'request'=>'http\Client\Request'], - 'http\Client::notify' => ['void', 'request='=>'?http\Client\Request'], - 'http\Client::once' => ['bool'], - 'http\Client::requeue' => ['http\Client', 'request'=>'http\Client\Request', 'callable='=>'mixed'], - 'http\Client::reset' => ['http\Client'], - 'http\Client::send' => ['http\Client'], - 'http\Client::setCookies' => ['http\Client', 'cookies='=>'?array'], - 'http\Client::setDebug' => ['http\Client', 'callback'=>'callable'], - 'http\Client::setOptions' => ['http\Client', 'options='=>'?array'], - 'http\Client::setSslOptions' => ['http\Client', 'ssl_option='=>'?array'], - 'http\Client::wait' => ['bool', 'timeout='=>'mixed'], - 'http\Client\Curl\User::init' => ['', 'run'=>'callable'], - 'http\Client\Curl\User::once' => [''], - 'http\Client\Curl\User::send' => [''], - 'http\Client\Curl\User::socket' => ['', 'socket'=>'resource', 'action'=>'int'], - 'http\Client\Curl\User::timer' => ['', 'timeout_ms'=>'int'], - 'http\Client\Curl\User::wait' => ['', 'timeout_ms='=>'mixed'], - 'http\Client\Request::__construct' => ['void', 'method='=>'mixed', 'url='=>'mixed', 'headers='=>'?array', 'body='=>'?http\Message\Body'], - 'http\Client\Request::__toString' => ['string'], - 'http\Client\Request::addBody' => ['http\Message', 'body'=>'http\Message\Body'], - 'http\Client\Request::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], - 'http\Client\Request::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], - 'http\Client\Request::addQuery' => ['http\Client\Request', 'query_data'=>'mixed'], - 'http\Client\Request::addSslOptions' => ['http\Client\Request', 'ssl_options='=>'?array'], - 'http\Client\Request::count' => ['int'], - 'http\Client\Request::current' => ['mixed'], - 'http\Client\Request::detach' => ['http\Message'], - 'http\Client\Request::getBody' => ['http\Message\Body'], - 'http\Client\Request::getContentType' => ['null|string'], - 'http\Client\Request::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], - 'http\Client\Request::getHeaders' => ['array'], - 'http\Client\Request::getHttpVersion' => ['string'], - 'http\Client\Request::getInfo' => ['null|string'], - 'http\Client\Request::getOptions' => ['array'], - 'http\Client\Request::getParentMessage' => ['http\Message'], - 'http\Client\Request::getQuery' => ['null|string'], - 'http\Client\Request::getRequestMethod' => ['false|string'], - 'http\Client\Request::getRequestUrl' => ['false|string'], - 'http\Client\Request::getResponseCode' => ['false|int'], - 'http\Client\Request::getResponseStatus' => ['false|string'], - 'http\Client\Request::getSslOptions' => ['array'], - 'http\Client\Request::getType' => ['int'], - 'http\Client\Request::isMultipart' => ['bool', '&boundary='=>'mixed'], - 'http\Client\Request::key' => ['int|string'], - 'http\Client\Request::next' => ['void'], - 'http\Client\Request::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], - 'http\Client\Request::reverse' => ['http\Message'], - 'http\Client\Request::rewind' => ['void'], - 'http\Client\Request::serialize' => ['string'], - 'http\Client\Request::setBody' => ['http\Message', 'body'=>'http\Message\Body'], - 'http\Client\Request::setContentType' => ['http\Client\Request', 'content_type'=>'string'], - 'http\Client\Request::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], - 'http\Client\Request::setHeaders' => ['http\Message', 'headers'=>'array'], - 'http\Client\Request::setHttpVersion' => ['http\Message', 'http_version'=>'string'], - 'http\Client\Request::setInfo' => ['http\Message', 'http_info'=>'string'], - 'http\Client\Request::setOptions' => ['http\Client\Request', 'options='=>'?array'], - 'http\Client\Request::setQuery' => ['http\Client\Request', 'query_data='=>'mixed'], - 'http\Client\Request::setRequestMethod' => ['http\Message', 'request_method'=>'string'], - 'http\Client\Request::setRequestUrl' => ['http\Message', 'url'=>'string'], - 'http\Client\Request::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], - 'http\Client\Request::setResponseStatus' => ['http\Message', 'response_status'=>'string'], - 'http\Client\Request::setSslOptions' => ['http\Client\Request', 'ssl_options='=>'?array'], - 'http\Client\Request::setType' => ['http\Message', 'type'=>'int'], - 'http\Client\Request::splitMultipartBody' => ['http\Message'], - 'http\Client\Request::toCallback' => ['http\Message', 'callback'=>'callable'], - 'http\Client\Request::toStream' => ['http\Message', 'stream'=>'resource'], - 'http\Client\Request::toString' => ['string', 'include_parent='=>'mixed'], - 'http\Client\Request::unserialize' => ['void', 'serialized'=>'string'], - 'http\Client\Request::valid' => ['bool'], - 'http\Client\Response::__construct' => ['Iterator'], - 'http\Client\Response::__toString' => ['string'], - 'http\Client\Response::addBody' => ['http\Message', 'body'=>'http\Message\Body'], - 'http\Client\Response::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], - 'http\Client\Response::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], - 'http\Client\Response::count' => ['int'], - 'http\Client\Response::current' => ['mixed'], - 'http\Client\Response::detach' => ['http\Message'], - 'http\Client\Response::getBody' => ['http\Message\Body'], - 'http\Client\Response::getCookies' => ['array', 'flags='=>'mixed', 'allowed_extras='=>'mixed'], - 'http\Client\Response::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], - 'http\Client\Response::getHeaders' => ['array'], - 'http\Client\Response::getHttpVersion' => ['string'], - 'http\Client\Response::getInfo' => ['null|string'], - 'http\Client\Response::getParentMessage' => ['http\Message'], - 'http\Client\Response::getRequestMethod' => ['false|string'], - 'http\Client\Response::getRequestUrl' => ['false|string'], - 'http\Client\Response::getResponseCode' => ['false|int'], - 'http\Client\Response::getResponseStatus' => ['false|string'], - 'http\Client\Response::getTransferInfo' => ['mixed|object', 'element='=>'mixed'], - 'http\Client\Response::getType' => ['int'], - 'http\Client\Response::isMultipart' => ['bool', '&boundary='=>'mixed'], - 'http\Client\Response::key' => ['int|string'], - 'http\Client\Response::next' => ['void'], - 'http\Client\Response::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], - 'http\Client\Response::reverse' => ['http\Message'], - 'http\Client\Response::rewind' => ['void'], - 'http\Client\Response::serialize' => ['string'], - 'http\Client\Response::setBody' => ['http\Message', 'body'=>'http\Message\Body'], - 'http\Client\Response::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], - 'http\Client\Response::setHeaders' => ['http\Message', 'headers'=>'array'], - 'http\Client\Response::setHttpVersion' => ['http\Message', 'http_version'=>'string'], - 'http\Client\Response::setInfo' => ['http\Message', 'http_info'=>'string'], - 'http\Client\Response::setRequestMethod' => ['http\Message', 'request_method'=>'string'], - 'http\Client\Response::setRequestUrl' => ['http\Message', 'url'=>'string'], - 'http\Client\Response::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], - 'http\Client\Response::setResponseStatus' => ['http\Message', 'response_status'=>'string'], - 'http\Client\Response::setType' => ['http\Message', 'type'=>'int'], - 'http\Client\Response::splitMultipartBody' => ['http\Message'], - 'http\Client\Response::toCallback' => ['http\Message', 'callback'=>'callable'], - 'http\Client\Response::toStream' => ['http\Message', 'stream'=>'resource'], - 'http\Client\Response::toString' => ['string', 'include_parent='=>'mixed'], - 'http\Client\Response::unserialize' => ['void', 'serialized'=>'string'], - 'http\Client\Response::valid' => ['bool'], - 'http\Cookie::__construct' => ['void', 'cookie_string='=>'mixed', 'parser_flags='=>'int', 'allowed_extras='=>'array'], - 'http\Cookie::__toString' => ['string'], - 'http\Cookie::addCookie' => ['http\Cookie', 'cookie_name'=>'string', 'cookie_value'=>'string'], - 'http\Cookie::addCookies' => ['http\Cookie', 'cookies'=>'array'], - 'http\Cookie::addExtra' => ['http\Cookie', 'extra_name'=>'string', 'extra_value'=>'string'], - 'http\Cookie::addExtras' => ['http\Cookie', 'extras'=>'array'], - 'http\Cookie::getCookie' => ['null|string', 'name'=>'string'], - 'http\Cookie::getCookies' => ['array'], - 'http\Cookie::getDomain' => ['string'], - 'http\Cookie::getExpires' => ['int'], - 'http\Cookie::getExtra' => ['string', 'name'=>'string'], - 'http\Cookie::getExtras' => ['array'], - 'http\Cookie::getFlags' => ['int'], - 'http\Cookie::getMaxAge' => ['int'], - 'http\Cookie::getPath' => ['string'], - 'http\Cookie::setCookie' => ['http\Cookie', 'cookie_name'=>'string', 'cookie_value='=>'mixed'], - 'http\Cookie::setCookies' => ['http\Cookie', 'cookies='=>'mixed'], - 'http\Cookie::setDomain' => ['http\Cookie', 'value='=>'mixed'], - 'http\Cookie::setExpires' => ['http\Cookie', 'value='=>'mixed'], - 'http\Cookie::setExtra' => ['http\Cookie', 'extra_name'=>'string', 'extra_value='=>'mixed'], - 'http\Cookie::setExtras' => ['http\Cookie', 'extras='=>'mixed'], - 'http\Cookie::setFlags' => ['http\Cookie', 'value='=>'mixed'], - 'http\Cookie::setMaxAge' => ['http\Cookie', 'value='=>'mixed'], - 'http\Cookie::setPath' => ['http\Cookie', 'value='=>'mixed'], - 'http\Cookie::toArray' => ['array'], - 'http\Cookie::toString' => ['string'], - 'http\Encoding\Stream::__construct' => ['void', 'flags='=>'mixed'], - 'http\Encoding\Stream::done' => ['bool'], - 'http\Encoding\Stream::finish' => ['string'], - 'http\Encoding\Stream::flush' => ['string'], - 'http\Encoding\Stream::update' => ['string', 'data'=>'string'], - 'http\Encoding\Stream\Debrotli::__construct' => ['void', 'flags='=>'int'], - 'http\Encoding\Stream\Debrotli::decode' => ['string', 'data'=>'string'], - 'http\Encoding\Stream\Debrotli::done' => ['bool'], - 'http\Encoding\Stream\Debrotli::finish' => ['string'], - 'http\Encoding\Stream\Debrotli::flush' => ['string'], - 'http\Encoding\Stream\Debrotli::update' => ['string', 'data'=>'string'], - 'http\Encoding\Stream\Dechunk::__construct' => ['void', 'flags='=>'mixed'], - 'http\Encoding\Stream\Dechunk::decode' => ['false|string', 'data'=>'string', '&decoded_len='=>'mixed'], - 'http\Encoding\Stream\Dechunk::done' => ['bool'], - 'http\Encoding\Stream\Dechunk::finish' => ['string'], - 'http\Encoding\Stream\Dechunk::flush' => ['string'], - 'http\Encoding\Stream\Dechunk::update' => ['string', 'data'=>'string'], - 'http\Encoding\Stream\Deflate::__construct' => ['void', 'flags='=>'mixed'], - 'http\Encoding\Stream\Deflate::done' => ['bool'], - 'http\Encoding\Stream\Deflate::encode' => ['string', 'data'=>'string', 'flags='=>'mixed'], - 'http\Encoding\Stream\Deflate::finish' => ['string'], - 'http\Encoding\Stream\Deflate::flush' => ['string'], - 'http\Encoding\Stream\Deflate::update' => ['string', 'data'=>'string'], - 'http\Encoding\Stream\Enbrotli::__construct' => ['void', 'flags='=>'int'], - 'http\Encoding\Stream\Enbrotli::done' => ['bool'], - 'http\Encoding\Stream\Enbrotli::encode' => ['string', 'data'=>'string', 'flags='=>'int'], - 'http\Encoding\Stream\Enbrotli::finish' => ['string'], - 'http\Encoding\Stream\Enbrotli::flush' => ['string'], - 'http\Encoding\Stream\Enbrotli::update' => ['string', 'data'=>'string'], - 'http\Encoding\Stream\Inflate::__construct' => ['void', 'flags='=>'mixed'], - 'http\Encoding\Stream\Inflate::decode' => ['string', 'data'=>'string'], - 'http\Encoding\Stream\Inflate::done' => ['bool'], - 'http\Encoding\Stream\Inflate::finish' => ['string'], - 'http\Encoding\Stream\Inflate::flush' => ['string'], - 'http\Encoding\Stream\Inflate::update' => ['string', 'data'=>'string'], - 'http\Env::getRequestBody' => ['http\Message\Body', 'body_class_name='=>'mixed'], - 'http\Env::getRequestHeader' => ['array|null|string', 'header_name='=>'mixed'], - 'http\Env::getResponseCode' => ['int'], - 'http\Env::getResponseHeader' => ['array|null|string', 'header_name='=>'mixed'], - 'http\Env::getResponseStatusForAllCodes' => ['array'], - 'http\Env::getResponseStatusForCode' => ['string', 'code'=>'int'], - 'http\Env::negotiate' => ['null|string', 'params'=>'string', 'supported'=>'array', 'primary_type_separator='=>'mixed', '&result_array='=>'mixed'], - 'http\Env::negotiateCharset' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], - 'http\Env::negotiateContentType' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], - 'http\Env::negotiateEncoding' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], - 'http\Env::negotiateLanguage' => ['null|string', 'supported'=>'array', '&result_array='=>'mixed'], - 'http\Env::setResponseCode' => ['bool', 'code'=>'int'], - 'http\Env::setResponseHeader' => ['bool', 'header_name'=>'string', 'header_value='=>'mixed', 'response_code='=>'mixed', 'replace_header='=>'mixed'], - 'http\Env\Request::__construct' => ['void'], - 'http\Env\Request::__toString' => ['string'], - 'http\Env\Request::addBody' => ['http\Message', 'body'=>'http\Message\Body'], - 'http\Env\Request::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], - 'http\Env\Request::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], - 'http\Env\Request::count' => ['int'], - 'http\Env\Request::current' => ['mixed'], - 'http\Env\Request::detach' => ['http\Message'], - 'http\Env\Request::getBody' => ['http\Message\Body'], - 'http\Env\Request::getCookie' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], - 'http\Env\Request::getFiles' => ['array'], - 'http\Env\Request::getForm' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], - 'http\Env\Request::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], - 'http\Env\Request::getHeaders' => ['array'], - 'http\Env\Request::getHttpVersion' => ['string'], - 'http\Env\Request::getInfo' => ['null|string'], - 'http\Env\Request::getParentMessage' => ['http\Message'], - 'http\Env\Request::getQuery' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool'], - 'http\Env\Request::getRequestMethod' => ['false|string'], - 'http\Env\Request::getRequestUrl' => ['false|string'], - 'http\Env\Request::getResponseCode' => ['false|int'], - 'http\Env\Request::getResponseStatus' => ['false|string'], - 'http\Env\Request::getType' => ['int'], - 'http\Env\Request::isMultipart' => ['bool', '&boundary='=>'mixed'], - 'http\Env\Request::key' => ['int|string'], - 'http\Env\Request::next' => ['void'], - 'http\Env\Request::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], - 'http\Env\Request::reverse' => ['http\Message'], - 'http\Env\Request::rewind' => ['void'], - 'http\Env\Request::serialize' => ['string'], - 'http\Env\Request::setBody' => ['http\Message', 'body'=>'http\Message\Body'], - 'http\Env\Request::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], - 'http\Env\Request::setHeaders' => ['http\Message', 'headers'=>'array'], - 'http\Env\Request::setHttpVersion' => ['http\Message', 'http_version'=>'string'], - 'http\Env\Request::setInfo' => ['http\Message', 'http_info'=>'string'], - 'http\Env\Request::setRequestMethod' => ['http\Message', 'request_method'=>'string'], - 'http\Env\Request::setRequestUrl' => ['http\Message', 'url'=>'string'], - 'http\Env\Request::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], - 'http\Env\Request::setResponseStatus' => ['http\Message', 'response_status'=>'string'], - 'http\Env\Request::setType' => ['http\Message', 'type'=>'int'], - 'http\Env\Request::splitMultipartBody' => ['http\Message'], - 'http\Env\Request::toCallback' => ['http\Message', 'callback'=>'callable'], - 'http\Env\Request::toStream' => ['http\Message', 'stream'=>'resource'], - 'http\Env\Request::toString' => ['string', 'include_parent='=>'mixed'], - 'http\Env\Request::unserialize' => ['void', 'serialized'=>'string'], - 'http\Env\Request::valid' => ['bool'], - 'http\Env\Response::__construct' => ['void'], - 'http\Env\Response::__invoke' => ['bool', 'data'=>'string', 'ob_flags='=>'int'], - 'http\Env\Response::__toString' => ['string'], - 'http\Env\Response::addBody' => ['http\Message', 'body'=>'http\Message\Body'], - 'http\Env\Response::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], - 'http\Env\Response::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], - 'http\Env\Response::count' => ['int'], - 'http\Env\Response::current' => ['mixed'], - 'http\Env\Response::detach' => ['http\Message'], - 'http\Env\Response::getBody' => ['http\Message\Body'], - 'http\Env\Response::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], - 'http\Env\Response::getHeaders' => ['array'], - 'http\Env\Response::getHttpVersion' => ['string'], - 'http\Env\Response::getInfo' => ['?string'], - 'http\Env\Response::getParentMessage' => ['http\Message'], - 'http\Env\Response::getRequestMethod' => ['false|string'], - 'http\Env\Response::getRequestUrl' => ['false|string'], - 'http\Env\Response::getResponseCode' => ['false|int'], - 'http\Env\Response::getResponseStatus' => ['false|string'], - 'http\Env\Response::getType' => ['int'], - 'http\Env\Response::isCachedByETag' => ['int', 'header_name='=>'string'], - 'http\Env\Response::isCachedByLastModified' => ['int', 'header_name='=>'string'], - 'http\Env\Response::isMultipart' => ['bool', '&boundary='=>'mixed'], - 'http\Env\Response::key' => ['int|string'], - 'http\Env\Response::next' => ['void'], - 'http\Env\Response::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], - 'http\Env\Response::reverse' => ['http\Message'], - 'http\Env\Response::rewind' => ['void'], - 'http\Env\Response::send' => ['bool', 'stream='=>'resource'], - 'http\Env\Response::serialize' => ['string'], - 'http\Env\Response::setBody' => ['http\Message', 'body'=>'http\Message\Body'], - 'http\Env\Response::setCacheControl' => ['http\Env\Response', 'cache_control'=>'string'], - 'http\Env\Response::setContentDisposition' => ['http\Env\Response', 'disposition_params'=>'array'], - 'http\Env\Response::setContentEncoding' => ['http\Env\Response', 'content_encoding'=>'int'], - 'http\Env\Response::setContentType' => ['http\Env\Response', 'content_type'=>'string'], - 'http\Env\Response::setCookie' => ['http\Env\Response', 'cookie'=>'mixed'], - 'http\Env\Response::setEnvRequest' => ['http\Env\Response', 'env_request'=>'http\Message'], - 'http\Env\Response::setEtag' => ['http\Env\Response', 'etag'=>'string'], - 'http\Env\Response::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], - 'http\Env\Response::setHeaders' => ['http\Message', 'headers'=>'array'], - 'http\Env\Response::setHttpVersion' => ['http\Message', 'http_version'=>'string'], - 'http\Env\Response::setInfo' => ['http\Message', 'http_info'=>'string'], - 'http\Env\Response::setLastModified' => ['http\Env\Response', 'last_modified'=>'int'], - 'http\Env\Response::setRequestMethod' => ['http\Message', 'request_method'=>'string'], - 'http\Env\Response::setRequestUrl' => ['http\Message', 'url'=>'string'], - 'http\Env\Response::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], - 'http\Env\Response::setResponseStatus' => ['http\Message', 'response_status'=>'string'], - 'http\Env\Response::setThrottleRate' => ['http\Env\Response', 'chunk_size'=>'int', 'delay='=>'float|int'], - 'http\Env\Response::setType' => ['http\Message', 'type'=>'int'], - 'http\Env\Response::splitMultipartBody' => ['http\Message'], - 'http\Env\Response::toCallback' => ['http\Message', 'callback'=>'callable'], - 'http\Env\Response::toStream' => ['http\Message', 'stream'=>'resource'], - 'http\Env\Response::toString' => ['string', 'include_parent='=>'mixed'], - 'http\Env\Response::unserialize' => ['void', 'serialized'=>'string'], - 'http\Env\Response::valid' => ['bool'], - 'http\Header::__construct' => ['void', 'name='=>'mixed', 'value='=>'mixed'], - 'http\Header::__toString' => ['string'], - 'http\Header::getParams' => ['http\Params', 'param_sep='=>'mixed', 'arg_sep='=>'mixed', 'val_sep='=>'mixed', 'flags='=>'mixed'], - 'http\Header::match' => ['bool', 'value'=>'string', 'flags='=>'mixed'], - 'http\Header::negotiate' => ['null|string', 'supported'=>'array', '&result='=>'mixed'], - 'http\Header::parse' => ['array|false', 'string'=>'string', 'header_class='=>'mixed'], - 'http\Header::serialize' => ['string'], - 'http\Header::toString' => ['string'], - 'http\Header::unserialize' => ['void', 'serialized'=>'string'], - 'http\Header\Parser::getState' => ['int'], - 'http\Header\Parser::parse' => ['int', 'data'=>'string', 'flags'=>'int', '&headers'=>'array'], - 'http\Header\Parser::stream' => ['int', 'stream'=>'resource', 'flags'=>'int', '&headers'=>'array'], - 'http\Message::__construct' => ['void', 'message='=>'mixed', 'greedy='=>'bool'], - 'http\Message::__toString' => ['string'], - 'http\Message::addBody' => ['http\Message', 'body'=>'http\Message\Body'], - 'http\Message::addHeader' => ['http\Message', 'header'=>'string', 'value'=>'mixed'], - 'http\Message::addHeaders' => ['http\Message', 'headers'=>'array', 'append='=>'mixed'], - 'http\Message::count' => ['int'], - 'http\Message::current' => ['mixed'], - 'http\Message::detach' => ['http\Message'], - 'http\Message::getBody' => ['http\Message\Body'], - 'http\Message::getHeader' => ['http\Header|mixed', 'header'=>'string', 'into_class='=>'mixed'], - 'http\Message::getHeaders' => ['array'], - 'http\Message::getHttpVersion' => ['string'], - 'http\Message::getInfo' => ['null|string'], - 'http\Message::getParentMessage' => ['http\Message'], - 'http\Message::getRequestMethod' => ['false|string'], - 'http\Message::getRequestUrl' => ['false|string'], - 'http\Message::getResponseCode' => ['false|int'], - 'http\Message::getResponseStatus' => ['false|string'], - 'http\Message::getType' => ['int'], - 'http\Message::isMultipart' => ['bool', '&boundary='=>'mixed'], - 'http\Message::key' => ['int|string'], - 'http\Message::next' => ['void'], - 'http\Message::prepend' => ['http\Message', 'message'=>'http\Message', 'top='=>'mixed'], - 'http\Message::reverse' => ['http\Message'], - 'http\Message::rewind' => ['void'], - 'http\Message::serialize' => ['string'], - 'http\Message::setBody' => ['http\Message', 'body'=>'http\Message\Body'], - 'http\Message::setHeader' => ['http\Message', 'header'=>'string', 'value='=>'mixed'], - 'http\Message::setHeaders' => ['http\Message', 'headers'=>'array'], - 'http\Message::setHttpVersion' => ['http\Message', 'http_version'=>'string'], - 'http\Message::setInfo' => ['http\Message', 'http_info'=>'string'], - 'http\Message::setRequestMethod' => ['http\Message', 'request_method'=>'string'], - 'http\Message::setRequestUrl' => ['http\Message', 'url'=>'string'], - 'http\Message::setResponseCode' => ['http\Message', 'response_code'=>'int', 'strict='=>'mixed'], - 'http\Message::setResponseStatus' => ['http\Message', 'response_status'=>'string'], - 'http\Message::setType' => ['http\Message', 'type'=>'int'], - 'http\Message::splitMultipartBody' => ['http\Message'], - 'http\Message::toCallback' => ['http\Message', 'callback'=>'callable'], - 'http\Message::toStream' => ['http\Message', 'stream'=>'resource'], - 'http\Message::toString' => ['string', 'include_parent='=>'mixed'], - 'http\Message::unserialize' => ['void', 'serialized'=>'string'], - 'http\Message::valid' => ['bool'], - 'http\Message\Body::__construct' => ['void', 'stream='=>'resource'], - 'http\Message\Body::__toString' => ['string'], - 'http\Message\Body::addForm' => ['http\Message\Body', 'fields='=>'?array', 'files='=>'?array'], - 'http\Message\Body::addPart' => ['http\Message\Body', 'message'=>'http\Message'], - 'http\Message\Body::append' => ['http\Message\Body', 'string'=>'string'], - 'http\Message\Body::etag' => ['false|string'], - 'http\Message\Body::getBoundary' => ['null|string'], - 'http\Message\Body::getResource' => ['resource'], - 'http\Message\Body::serialize' => ['string'], - 'http\Message\Body::stat' => ['int|object', 'field='=>'mixed'], - 'http\Message\Body::toCallback' => ['http\Message\Body', 'callback'=>'callable', 'offset='=>'mixed', 'maxlen='=>'mixed'], - 'http\Message\Body::toStream' => ['http\Message\Body', 'stream'=>'resource', 'offset='=>'mixed', 'maxlen='=>'mixed'], - 'http\Message\Body::toString' => ['string'], - 'http\Message\Body::unserialize' => ['void', 'serialized'=>'string'], - 'http\Message\Parser::getState' => ['int'], - 'http\Message\Parser::parse' => ['int', 'data'=>'string', 'flags'=>'int', '&message'=>'http\Message'], - 'http\Message\Parser::stream' => ['int', 'stream'=>'resource', 'flags'=>'int', '&message'=>'http\Message'], - 'http\Params::__construct' => ['void', 'params='=>'mixed', 'param_sep='=>'mixed', 'arg_sep='=>'mixed', 'val_sep='=>'mixed', 'flags='=>'mixed'], - 'http\Params::__toString' => ['string'], - 'http\Params::offsetExists' => ['bool', 'name'=>'mixed'], - 'http\Params::offsetGet' => ['mixed', 'name'=>'mixed'], - 'http\Params::offsetSet' => ['void', 'name'=>'mixed', 'value'=>'mixed'], - 'http\Params::offsetUnset' => ['void', 'name'=>'mixed'], - 'http\Params::toArray' => ['array'], - 'http\Params::toString' => ['string'], - 'http\QueryString::__construct' => ['void', 'querystring'=>'string'], - 'http\QueryString::__toString' => ['string'], - 'http\QueryString::get' => ['http\QueryString|string|mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool|false'], - 'http\QueryString::getArray' => ['array|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], - 'http\QueryString::getBool' => ['bool|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], - 'http\QueryString::getFloat' => ['float|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], - 'http\QueryString::getGlobalInstance' => ['http\QueryString'], - 'http\QueryString::getInt' => ['int|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], - 'http\QueryString::getIterator' => ['IteratorAggregate'], - 'http\QueryString::getObject' => ['object|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], - 'http\QueryString::getString' => ['string|mixed', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], - 'http\QueryString::mod' => ['http\QueryString', 'params='=>'mixed'], - 'http\QueryString::offsetExists' => ['bool', 'offset'=>'mixed'], - 'http\QueryString::offsetGet' => ['mixed|null', 'offset'=>'mixed'], - 'http\QueryString::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'], - 'http\QueryString::offsetUnset' => ['void', 'offset'=>'mixed'], - 'http\QueryString::serialize' => ['string'], - 'http\QueryString::set' => ['http\QueryString', 'params'=>'mixed'], - 'http\QueryString::toArray' => ['array'], - 'http\QueryString::toString' => ['string'], - 'http\QueryString::unserialize' => ['void', 'serialized'=>'string'], - 'http\QueryString::xlate' => ['http\QueryString'], - 'http\Url::__construct' => ['void', 'old_url='=>'mixed', 'new_url='=>'mixed', 'flags='=>'int'], - 'http\Url::__toString' => ['string'], - 'http\Url::mod' => ['http\Url', 'parts'=>'mixed', 'flags='=>'float|int|mixed'], - 'http\Url::toArray' => ['string[]'], - 'http\Url::toString' => ['string'], - 'http_build_cookie' => ['string', 'cookie'=>'array'], - 'http_build_query' => ['string', 'data'=>'array|object', 'numeric_prefix='=>'string', 'arg_separator='=>'string', 'encoding_type='=>'int'], - 'http_build_str' => ['string', 'query'=>'array', 'prefix='=>'?string', 'arg_separator='=>'string'], - 'http_build_url' => ['string', 'url='=>'string|array', 'parts='=>'string|array', 'flags='=>'int', 'new_url='=>'array'], - 'http_cache_etag' => ['bool', 'etag='=>'string'], - 'http_cache_last_modified' => ['bool', 'timestamp_or_expires='=>'int'], - 'http_chunked_decode' => ['string|false', 'encoded'=>'string'], - 'http_date' => ['string', 'timestamp='=>'int'], - 'http_deflate' => ['?string', 'data'=>'string', 'flags='=>'int'], - 'http_get' => ['string', 'url'=>'string', 'options='=>'array', 'info='=>'array'], - 'http_get_request_body' => ['?string'], - 'http_get_request_body_stream' => ['?resource'], - 'http_get_request_headers' => ['array'], - 'http_head' => ['string', 'url'=>'string', 'options='=>'array', 'info='=>'array'], - 'http_inflate' => ['?string', 'data'=>'string'], - 'http_match_etag' => ['bool', 'etag'=>'string', 'for_range='=>'bool'], - 'http_match_modified' => ['bool', 'timestamp='=>'int', 'for_range='=>'bool'], - 'http_match_request_header' => ['bool', 'header'=>'string', 'value'=>'string', 'match_case='=>'bool'], - 'http_negotiate_charset' => ['string', 'supported'=>'array', 'result='=>'array'], - 'http_negotiate_content_type' => ['string', 'supported'=>'array', 'result='=>'array'], - 'http_negotiate_language' => ['string', 'supported'=>'array', 'result='=>'array'], - 'http_parse_cookie' => ['stdClass|false', 'cookie'=>'string', 'flags='=>'int', 'allowed_extras='=>'array'], - 'http_parse_headers' => ['array|false', 'header'=>'string'], - 'http_parse_message' => ['object', 'message'=>'string'], - 'http_parse_params' => ['stdClass', 'param'=>'string', 'flags='=>'int'], - 'http_persistent_handles_clean' => ['string', 'ident='=>'string'], - 'http_persistent_handles_count' => ['stdClass|false'], - 'http_persistent_handles_ident' => ['string|false', 'ident='=>'string'], - 'http_post_data' => ['string', 'url'=>'string', 'data'=>'string', 'options='=>'array', 'info='=>'array'], - 'http_post_fields' => ['string', 'url'=>'string', 'data'=>'array', 'files='=>'array', 'options='=>'array', 'info='=>'array'], - 'http_put_data' => ['string', 'url'=>'string', 'data'=>'string', 'options='=>'array', 'info='=>'array'], - 'http_put_file' => ['string', 'url'=>'string', 'file'=>'string', 'options='=>'array', 'info='=>'array'], - 'http_put_stream' => ['string', 'url'=>'string', 'stream'=>'resource', 'options='=>'array', 'info='=>'array'], - 'http_redirect' => ['int|false', 'url='=>'string', 'params='=>'array', 'session='=>'bool', 'status='=>'int'], - 'http_request' => ['string', 'method'=>'int', 'url'=>'string', 'body='=>'string', 'options='=>'array', 'info='=>'array'], - 'http_request_body_encode' => ['string|false', 'fields'=>'array', 'files'=>'array'], - 'http_request_method_exists' => ['bool', 'method'=>'mixed'], - 'http_request_method_name' => ['string|false', 'method'=>'int'], - 'http_request_method_register' => ['int|false', 'method'=>'string'], - 'http_request_method_unregister' => ['bool', 'method'=>'mixed'], - 'http_response_code' => ['int|bool', 'response_code='=>'int'], - 'http_send_content_disposition' => ['bool', 'filename'=>'string', 'inline='=>'bool'], - 'http_send_content_type' => ['bool', 'content_type='=>'string'], - 'http_send_data' => ['bool', 'data'=>'string'], - 'http_send_file' => ['bool', 'file'=>'string'], - 'http_send_last_modified' => ['bool', 'timestamp='=>'int'], - 'http_send_status' => ['bool', 'status'=>'int'], - 'http_send_stream' => ['bool', 'stream'=>'resource'], - 'http_support' => ['int', 'feature='=>'int'], - 'http_throttle' => ['void', 'sec'=>'float', 'bytes='=>'int'], - 'hw_Array2Objrec' => ['string', 'object_array'=>'array'], - 'hw_Children' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_ChildrenObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_Close' => ['bool', 'connection'=>'int'], - 'hw_Connect' => ['int', 'host'=>'string', 'port'=>'int', 'username='=>'string', 'password='=>'string'], - 'hw_Deleteobject' => ['bool', 'connection'=>'int', 'object_to_delete'=>'int'], - 'hw_DocByAnchor' => ['int', 'connection'=>'int', 'anchorid'=>'int'], - 'hw_DocByAnchorObj' => ['string', 'connection'=>'int', 'anchorid'=>'int'], - 'hw_Document_Attributes' => ['string', 'hw_document'=>'int'], - 'hw_Document_BodyTag' => ['string', 'hw_document'=>'int', 'prefix='=>'string'], - 'hw_Document_Content' => ['string', 'hw_document'=>'int'], - 'hw_Document_SetContent' => ['bool', 'hw_document'=>'int', 'content'=>'string'], - 'hw_Document_Size' => ['int', 'hw_document'=>'int'], - 'hw_EditText' => ['bool', 'connection'=>'int', 'hw_document'=>'int'], - 'hw_Error' => ['int', 'connection'=>'int'], - 'hw_ErrorMsg' => ['string', 'connection'=>'int'], - 'hw_Free_Document' => ['bool', 'hw_document'=>'int'], - 'hw_GetAnchors' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetAnchorsObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetAndLock' => ['string', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetChildColl' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetChildCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetChildDocColl' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetChildDocCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetObject' => ['', 'connection'=>'int', 'objectid'=>'', 'query='=>'string'], - 'hw_GetObjectByQuery' => ['array', 'connection'=>'int', 'query'=>'string', 'max_hits'=>'int'], - 'hw_GetObjectByQueryColl' => ['array', 'connection'=>'int', 'objectid'=>'int', 'query'=>'string', 'max_hits'=>'int'], - 'hw_GetObjectByQueryCollObj' => ['array', 'connection'=>'int', 'objectid'=>'int', 'query'=>'string', 'max_hits'=>'int'], - 'hw_GetObjectByQueryObj' => ['array', 'connection'=>'int', 'query'=>'string', 'max_hits'=>'int'], - 'hw_GetParents' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetParentsObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetRemote' => ['int', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetSrcByDestObj' => ['array', 'connection'=>'int', 'objectid'=>'int'], - 'hw_GetText' => ['int', 'connection'=>'int', 'objectid'=>'int', 'prefix='=>''], - 'hw_Identify' => ['string', 'link'=>'int', 'username'=>'string', 'password'=>'string'], - 'hw_InCollections' => ['array', 'connection'=>'int', 'object_id_array'=>'array', 'collection_id_array'=>'array', 'return_collections'=>'int'], - 'hw_Info' => ['string', 'connection'=>'int'], - 'hw_InsColl' => ['int', 'connection'=>'int', 'objectid'=>'int', 'object_array'=>'array'], - 'hw_InsDoc' => ['int', 'connection'=>'', 'parentid'=>'int', 'object_record'=>'string', 'text='=>'string'], - 'hw_InsertDocument' => ['int', 'connection'=>'int', 'parent_id'=>'int', 'hw_document'=>'int'], - 'hw_InsertObject' => ['int', 'connection'=>'int', 'object_rec'=>'string', 'parameter'=>'string'], - 'hw_Modifyobject' => ['bool', 'connection'=>'int', 'object_to_change'=>'int', 'remove'=>'array', 'add'=>'array', 'mode='=>'int'], - 'hw_New_Document' => ['int', 'object_record'=>'string', 'document_data'=>'string', 'document_size'=>'int'], - 'hw_Output_Document' => ['bool', 'hw_document'=>'int'], - 'hw_PipeDocument' => ['int', 'connection'=>'int', 'objectid'=>'int', 'url_prefixes='=>'array'], - 'hw_Root' => ['int'], - 'hw_Unlock' => ['bool', 'connection'=>'int', 'objectid'=>'int'], - 'hw_Who' => ['array', 'connection'=>'int'], - 'hw_api::checkin' => ['bool', 'parameter'=>'array'], - 'hw_api::checkout' => ['bool', 'parameter'=>'array'], - 'hw_api::children' => ['array', 'parameter'=>'array'], - 'hw_api::content' => ['HW_API_Content', 'parameter'=>'array'], - 'hw_api::copy' => ['hw_api_content', 'parameter'=>'array'], - 'hw_api::dbstat' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::dcstat' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::dstanchors' => ['array', 'parameter'=>'array'], - 'hw_api::dstofsrcanchor' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::find' => ['array', 'parameter'=>'array'], - 'hw_api::ftstat' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::hwstat' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::identify' => ['bool', 'parameter'=>'array'], - 'hw_api::info' => ['array', 'parameter'=>'array'], - 'hw_api::insert' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::insertanchor' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::insertcollection' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::insertdocument' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::link' => ['bool', 'parameter'=>'array'], - 'hw_api::lock' => ['bool', 'parameter'=>'array'], - 'hw_api::move' => ['bool', 'parameter'=>'array'], - 'hw_api::object' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::objectbyanchor' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::parents' => ['array', 'parameter'=>'array'], - 'hw_api::remove' => ['bool', 'parameter'=>'array'], - 'hw_api::replace' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::setcommittedversion' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::srcanchors' => ['array', 'parameter'=>'array'], - 'hw_api::srcsofdst' => ['array', 'parameter'=>'array'], - 'hw_api::unlock' => ['bool', 'parameter'=>'array'], - 'hw_api::user' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api::userlist' => ['array', 'parameter'=>'array'], - 'hw_api_attribute' => ['HW_API_Attribute', 'name='=>'string', 'value='=>'string'], - 'hw_api_attribute::key' => ['string'], - 'hw_api_attribute::langdepvalue' => ['string', 'language'=>'string'], - 'hw_api_attribute::value' => ['string'], - 'hw_api_attribute::values' => ['array'], - 'hw_api_content' => ['HW_API_Content', 'content'=>'string', 'mimetype'=>'string'], - 'hw_api_content::mimetype' => ['string'], - 'hw_api_content::read' => ['string', 'buffer'=>'string', 'length'=>'int'], - 'hw_api_error::count' => ['int'], - 'hw_api_error::reason' => ['HW_API_Reason'], - 'hw_api_object' => ['hw_api_object', 'parameter'=>'array'], - 'hw_api_object::assign' => ['bool', 'parameter'=>'array'], - 'hw_api_object::attreditable' => ['bool', 'parameter'=>'array'], - 'hw_api_object::count' => ['int', 'parameter'=>'array'], - 'hw_api_object::insert' => ['bool', 'attribute'=>'hw_api_attribute'], - 'hw_api_object::remove' => ['bool', 'name'=>'string'], - 'hw_api_object::title' => ['string', 'parameter'=>'array'], - 'hw_api_object::value' => ['string', 'name'=>'string'], - 'hw_api_reason::description' => ['string'], - 'hw_api_reason::type' => ['HW_API_Reason'], - 'hw_changeobject' => ['bool', 'link'=>'int', 'objid'=>'int', 'attributes'=>'array'], - 'hw_connection_info' => ['', 'link'=>'int'], - 'hw_cp' => ['int', 'connection'=>'int', 'object_id_array'=>'array', 'destination_id'=>'int'], - 'hw_dummy' => ['string', 'link'=>'int', 'id'=>'int', 'msgid'=>'int'], - 'hw_getrellink' => ['string', 'link'=>'int', 'rootid'=>'int', 'sourceid'=>'int', 'destid'=>'int'], - 'hw_getremotechildren' => ['', 'connection'=>'int', 'object_record'=>'string'], - 'hw_getusername' => ['string', 'connection'=>'int'], - 'hw_insertanchors' => ['bool', 'hwdoc'=>'int', 'anchorecs'=>'array', 'dest'=>'array', 'urlprefixes='=>'array'], - 'hw_mapid' => ['int', 'connection'=>'int', 'server_id'=>'int', 'object_id'=>'int'], - 'hw_mv' => ['int', 'connection'=>'int', 'object_id_array'=>'array', 'source_id'=>'int', 'destination_id'=>'int'], - 'hw_objrec2array' => ['array', 'object_record'=>'string', 'format='=>'array'], - 'hw_pConnect' => ['int', 'host'=>'string', 'port'=>'int', 'username='=>'string', 'password='=>'string'], - 'hw_setlinkroot' => ['int', 'link'=>'int', 'rootid'=>'int'], - 'hw_stat' => ['string', 'link'=>'int'], - 'hwapi_attribute_new' => ['HW_API_Attribute', 'name='=>'string', 'value='=>'string'], - 'hwapi_content_new' => ['HW_API_Content', 'content'=>'string', 'mimetype'=>'string'], - 'hwapi_hgcsp' => ['HW_API', 'hostname'=>'string', 'port='=>'int'], - 'hwapi_object_new' => ['hw_api_object', 'parameter'=>'array'], - 'hypot' => ['float', 'x'=>'float', 'y'=>'float'], - 'ibase_add_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password'=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], - 'ibase_affected_rows' => ['int', 'link_identifier='=>'resource'], - 'ibase_backup' => ['mixed', 'service_handle'=>'resource', 'source_db'=>'string', 'dest_file'=>'string', 'options='=>'int', 'verbose='=>'bool'], - 'ibase_blob_add' => ['void', 'blob_handle'=>'resource', 'data'=>'string'], - 'ibase_blob_cancel' => ['bool', 'blob_handle'=>'resource'], - 'ibase_blob_close' => ['string|bool', 'blob_handle'=>'resource'], - 'ibase_blob_create' => ['resource', 'link_identifier='=>'resource'], - 'ibase_blob_echo' => ['bool', 'link_identifier'=>'', 'blob_id'=>'string'], - 'ibase_blob_echo\'1' => ['bool', 'blob_id'=>'string'], - 'ibase_blob_get' => ['string|false', 'blob_handle'=>'resource', 'length'=>'int'], - 'ibase_blob_import' => ['string|false', 'link_identifier'=>'resource', 'file_handle'=>'resource'], - 'ibase_blob_info' => ['array', 'link_identifier'=>'resource', 'blob_id'=>'string'], - 'ibase_blob_info\'1' => ['array', 'blob_id'=>'string'], - 'ibase_blob_open' => ['resource|false', 'link_identifier'=>'', 'blob_id'=>'string'], - 'ibase_blob_open\'1' => ['resource', 'blob_id'=>'string'], - 'ibase_close' => ['bool', 'link_identifier='=>'resource'], - 'ibase_commit' => ['bool', 'link_identifier='=>'resource'], - 'ibase_commit_ret' => ['bool', 'link_identifier='=>'resource'], - 'ibase_connect' => ['resource|false', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'buffers='=>'int', 'dialect='=>'int', 'role='=>'string'], - 'ibase_db_info' => ['string', 'service_handle'=>'resource', 'db'=>'string', 'action'=>'int', 'argument='=>'int'], - 'ibase_delete_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password='=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], - 'ibase_drop_db' => ['bool', 'link_identifier='=>'resource'], - 'ibase_errcode' => ['int|false'], - 'ibase_errmsg' => ['string|false'], - 'ibase_execute' => ['resource|false', 'query'=>'resource', 'bind_arg='=>'mixed', '...args='=>'mixed'], - 'ibase_fetch_assoc' => ['array|false', 'result'=>'resource', 'fetch_flags='=>'int'], - 'ibase_fetch_object' => ['object|false', 'result'=>'resource', 'fetch_flags='=>'int'], - 'ibase_fetch_row' => ['array|false', 'result'=>'resource', 'fetch_flags='=>'int'], - 'ibase_field_info' => ['array', 'query_result'=>'resource', 'field_number'=>'int'], - 'ibase_free_event_handler' => ['bool', 'event'=>'resource'], - 'ibase_free_query' => ['bool', 'query'=>'resource'], - 'ibase_free_result' => ['bool', 'result'=>'resource'], - 'ibase_gen_id' => ['int|string', 'generator'=>'string', 'increment='=>'int', 'link_identifier='=>'resource'], - 'ibase_maintain_db' => ['bool', 'service_handle'=>'resource', 'db'=>'string', 'action'=>'int', 'argument='=>'int'], - 'ibase_modify_user' => ['bool', 'service_handle'=>'resource', 'user_name'=>'string', 'password'=>'string', 'first_name='=>'string', 'middle_name='=>'string', 'last_name='=>'string'], - 'ibase_name_result' => ['bool', 'result'=>'resource', 'name'=>'string'], - 'ibase_num_fields' => ['int', 'query_result'=>'resource'], - 'ibase_num_params' => ['int', 'query'=>'resource'], - 'ibase_num_rows' => ['int', 'result_identifier'=>''], - 'ibase_param_info' => ['array', 'query'=>'resource', 'field_number'=>'int'], - 'ibase_pconnect' => ['resource|false', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'buffers='=>'int', 'dialect='=>'int', 'role='=>'string'], - 'ibase_prepare' => ['resource|false', 'link_identifier'=>'', 'query'=>'string', 'trans_identifier'=>''], - 'ibase_query' => ['resource|false', 'link_identifier='=>'resource', 'string='=>'string', 'bind_arg='=>'int', '...args='=>''], - 'ibase_restore' => ['mixed', 'service_handle'=>'resource', 'source_file'=>'string', 'dest_db'=>'string', 'options='=>'int', 'verbose='=>'bool'], - 'ibase_rollback' => ['bool', 'link_identifier='=>'resource'], - 'ibase_rollback_ret' => ['bool', 'link_identifier='=>'resource'], - 'ibase_server_info' => ['string', 'service_handle'=>'resource', 'action'=>'int'], - 'ibase_service_attach' => ['resource', 'host'=>'string', 'dba_username'=>'string', 'dba_password'=>'string'], - 'ibase_service_detach' => ['bool', 'service_handle'=>'resource'], - 'ibase_set_event_handler' => ['resource', 'link_identifier'=>'', 'callback'=>'callable', 'event='=>'string', '...args='=>''], - 'ibase_set_event_handler\'1' => ['resource', 'callback'=>'callable', 'event'=>'string', '...args'=>''], - 'ibase_timefmt' => ['bool', 'format'=>'string', 'columntype='=>'int'], - 'ibase_trans' => ['resource|false', 'trans_args='=>'int', 'link_identifier='=>'', '...args='=>''], - 'ibase_wait_event' => ['string', 'link_identifier'=>'', 'event='=>'string', '...args='=>''], - 'ibase_wait_event\'1' => ['string', 'event'=>'string', '...args'=>''], - 'iconv' => ['string|false', 'from_encoding'=>'string', 'to_encoding'=>'string', 'string'=>'string'], - 'iconv_get_encoding' => ['mixed', 'type='=>'string'], - 'iconv_mime_decode' => ['string|false', 'string'=>'string', 'mode='=>'int', 'encoding='=>'string'], - 'iconv_mime_decode_headers' => ['array|false', 'headers'=>'string', 'mode='=>'int', 'encoding='=>'string'], - 'iconv_mime_encode' => ['string|false', 'field_name'=>'string', 'field_value'=>'string', 'options='=>'array'], - 'iconv_set_encoding' => ['bool', 'type'=>'string', 'encoding'=>'string'], - 'iconv_strlen' => ['0|positive-int|false', 'string'=>'string', 'encoding='=>'string'], - 'iconv_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], - 'iconv_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'], - 'iconv_substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int', 'encoding='=>'string'], - 'id3_get_frame_long_name' => ['string', 'frameid'=>'string'], - 'id3_get_frame_short_name' => ['string', 'frameid'=>'string'], - 'id3_get_genre_id' => ['int', 'genre'=>'string'], - 'id3_get_genre_list' => ['array'], - 'id3_get_genre_name' => ['string', 'genre_id'=>'int'], - 'id3_get_tag' => ['array', 'filename'=>'string', 'version='=>'int'], - 'id3_get_version' => ['int', 'filename'=>'string'], - 'id3_remove_tag' => ['bool', 'filename'=>'string', 'version='=>'int'], - 'id3_set_tag' => ['bool', 'filename'=>'string', 'tag'=>'array', 'version='=>'int'], - 'idate' => ['int', 'format'=>'string', 'timestamp='=>'int'], - 'idn_strerror' => ['string', 'errorcode'=>'int'], - 'idn_to_ascii' => ['string|false', 'domain'=>'string', 'flags='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'], - 'idn_to_utf8' => ['string|false', 'domain'=>'string', 'flags='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'], - 'ifx_affected_rows' => ['int', 'result_id'=>'resource'], - 'ifx_blobinfile_mode' => ['bool', 'mode'=>'int'], - 'ifx_byteasvarchar' => ['bool', 'mode'=>'int'], - 'ifx_close' => ['bool', 'link_identifier='=>'resource'], - 'ifx_connect' => ['resource', 'database='=>'string', 'userid='=>'string', 'password='=>'string'], - 'ifx_copy_blob' => ['int', 'bid'=>'int'], - 'ifx_create_blob' => ['int', 'type'=>'int', 'mode'=>'int', 'param'=>'string'], - 'ifx_create_char' => ['int', 'param'=>'string'], - 'ifx_do' => ['bool', 'result_id'=>'resource'], - 'ifx_error' => ['string', 'link_identifier='=>'resource'], - 'ifx_errormsg' => ['string', 'errorcode='=>'int'], - 'ifx_fetch_row' => ['array', 'result_id'=>'resource', 'position='=>'mixed'], - 'ifx_fieldproperties' => ['array', 'result_id'=>'resource'], - 'ifx_fieldtypes' => ['array', 'result_id'=>'resource'], - 'ifx_free_blob' => ['bool', 'bid'=>'int'], - 'ifx_free_char' => ['bool', 'bid'=>'int'], - 'ifx_free_result' => ['bool', 'result_id'=>'resource'], - 'ifx_get_blob' => ['string', 'bid'=>'int'], - 'ifx_get_char' => ['string', 'bid'=>'int'], - 'ifx_getsqlca' => ['array', 'result_id'=>'resource'], - 'ifx_htmltbl_result' => ['int', 'result_id'=>'resource', 'html_table_options='=>'string'], - 'ifx_nullformat' => ['bool', 'mode'=>'int'], - 'ifx_num_fields' => ['int', 'result_id'=>'resource'], - 'ifx_num_rows' => ['int', 'result_id'=>'resource'], - 'ifx_pconnect' => ['resource', 'database='=>'string', 'userid='=>'string', 'password='=>'string'], - 'ifx_prepare' => ['resource', 'query'=>'string', 'link_identifier'=>'resource', 'cursor_def='=>'int', 'blobidarray='=>'mixed'], - 'ifx_query' => ['resource', 'query'=>'string', 'link_identifier'=>'resource', 'cursor_type='=>'int', 'blobidarray='=>'mixed'], - 'ifx_textasvarchar' => ['bool', 'mode'=>'int'], - 'ifx_update_blob' => ['bool', 'bid'=>'int', 'content'=>'string'], - 'ifx_update_char' => ['bool', 'bid'=>'int', 'content'=>'string'], - 'ifxus_close_slob' => ['bool', 'bid'=>'int'], - 'ifxus_create_slob' => ['int', 'mode'=>'int'], - 'ifxus_free_slob' => ['bool', 'bid'=>'int'], - 'ifxus_open_slob' => ['int', 'bid'=>'int', 'mode'=>'int'], - 'ifxus_read_slob' => ['string', 'bid'=>'int', 'nbytes'=>'int'], - 'ifxus_seek_slob' => ['int', 'bid'=>'int', 'mode'=>'int', 'offset'=>'int'], - 'ifxus_tell_slob' => ['int', 'bid'=>'int'], - 'ifxus_write_slob' => ['int', 'bid'=>'int', 'content'=>'string'], - 'igbinary_serialize' => ['string|false', 'value'=>'mixed'], - 'igbinary_unserialize' => ['mixed', 'string'=>'string'], - 'ignore_user_abort' => ['int', 'enable='=>'bool'], - 'iis_add_server' => ['int', 'path'=>'string', 'comment'=>'string', 'server_ip'=>'string', 'port'=>'int', 'host_name'=>'string', 'rights'=>'int', 'start_server'=>'int'], - 'iis_get_dir_security' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string'], - 'iis_get_script_map' => ['string', 'server_instance'=>'int', 'virtual_path'=>'string', 'script_extension'=>'string'], - 'iis_get_server_by_comment' => ['int', 'comment'=>'string'], - 'iis_get_server_by_path' => ['int', 'path'=>'string'], - 'iis_get_server_rights' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string'], - 'iis_get_service_state' => ['int', 'service_id'=>'string'], - 'iis_remove_server' => ['int', 'server_instance'=>'int'], - 'iis_set_app_settings' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'application_scope'=>'string'], - 'iis_set_dir_security' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'directory_flags'=>'int'], - 'iis_set_script_map' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'script_extension'=>'string', 'engine_path'=>'string', 'allow_scripting'=>'int'], - 'iis_set_server_rights' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string', 'directory_flags'=>'int'], - 'iis_start_server' => ['int', 'server_instance'=>'int'], - 'iis_start_service' => ['int', 'service_id'=>'string'], - 'iis_stop_server' => ['int', 'server_instance'=>'int'], - 'iis_stop_service' => ['int', 'service_id'=>'string'], - 'image2wbmp' => ['bool', 'im'=>'resource', 'filename='=>'?string', 'threshold='=>'int'], - 'imageObj::pasteImage' => ['void', 'srcImg'=>'imageObj', 'transparentColorHex'=>'int', 'dstX'=>'int', 'dstY'=>'int', 'angle'=>'int'], - 'imageObj::saveImage' => ['int', 'filename'=>'string', 'oMap'=>'mapObj'], - 'imageObj::saveWebImage' => ['string'], - 'image_type_to_extension' => ['string', 'image_type'=>'int', 'include_dot='=>'bool'], - 'image_type_to_mime_type' => ['string', 'image_type'=>'int'], - 'imageaffine' => ['resource|false', 'src'=>'resource', 'affine'=>'array', 'clip='=>'array'], - 'imageaffinematrixconcat' => ['array{0:float,1:float,2:float,3:float,4:float,5:float}|false', 'matrix1'=>'array', 'matrix2'=>'array'], - 'imageaffinematrixget' => ['array{0:float,1:float,2:float,3:float,4:float,5:float}|false', 'type'=>'int', 'options'=>'array|float'], - 'imagealphablending' => ['bool', 'image'=>'resource', 'enable'=>'bool'], - 'imageantialias' => ['bool', 'image'=>'resource', 'enable'=>'bool'], - 'imagearc' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int'], - 'imagechar' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], - 'imagecharup' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'char'=>'string', 'color'=>'int'], - 'imagecolorallocate' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'imagecolorallocatealpha' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - 'imagecolorat' => ['int|false', 'image'=>'resource', 'x'=>'int', 'y'=>'int'], - 'imagecolorclosest' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'imagecolorclosestalpha' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - 'imagecolorclosesthwb' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'imagecolordeallocate' => ['bool', 'image'=>'resource', 'color'=>'int'], - 'imagecolorexact' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'imagecolorexactalpha' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - 'imagecolormatch' => ['bool', 'image1'=>'resource', 'image2'=>'resource'], - 'imagecolorresolve' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'imagecolorresolvealpha' => ['int|false', 'image'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], - 'imagecolorset' => ['void', 'image'=>'resource', 'color'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], - 'imagecolorsforindex' => ['array|false', 'image'=>'resource', 'color'=>'int'], - 'imagecolorstotal' => ['int|false', 'image'=>'resource'], - 'imagecolortransparent' => ['int|false', 'image'=>'resource', 'color='=>'int'], - 'imageconvolution' => ['bool', 'image'=>'resource', 'matrix'=>'array', 'divisor'=>'float', 'offset'=>'float'], - 'imagecopy' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int'], - 'imagecopymerge' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], - 'imagecopymergegray' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_width'=>'int', 'src_height'=>'int', 'pct'=>'int'], - 'imagecopyresampled' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], - 'imagecopyresized' => ['bool', 'dst_image'=>'resource', 'src_image'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_width'=>'int', 'dst_height'=>'int', 'src_width'=>'int', 'src_height'=>'int'], - 'imagecreate' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'], - 'imagecreatefromgd' => ['resource|false', 'filename'=>'string'], - 'imagecreatefromgd2' => ['resource|false', 'filename'=>'string'], - 'imagecreatefromgd2part' => ['resource|false', 'filename'=>'string', 'srcx'=>'int', 'srcy'=>'int', 'width'=>'int', 'height'=>'int'], - 'imagecreatefromgif' => ['resource|false', 'filename'=>'string'], - 'imagecreatefromjpeg' => ['resource|false', 'filename'=>'string'], - 'imagecreatefrompng' => ['resource|false', 'filename'=>'string'], - 'imagecreatefromstring' => ['resource|false', 'image'=>'string'], - 'imagecreatefromwbmp' => ['resource|false', 'filename'=>'string'], - 'imagecreatefromwebp' => ['resource|false', 'filename'=>'string'], - 'imagecreatefromxbm' => ['resource|false', 'filename'=>'string'], - 'imagecreatefromxpm' => ['resource|false', 'filename'=>'string'], - 'imagecreatetruecolor' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'], - 'imagecrop' => ['resource|false', 'im'=>'resource', 'rect'=>'array'], - 'imagecropauto' => ['resource|false', 'im'=>'resource', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'], - 'imagedashedline' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - 'imagedestroy' => ['bool', 'image'=>'resource'], - 'imageellipse' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], - 'imagefill' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'color'=>'int'], - 'imagefilledarc' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'start_angle'=>'int', 'end_angle'=>'int', 'color'=>'int', 'style'=>'int'], - 'imagefilledellipse' => ['bool', 'image'=>'resource', 'center_x'=>'int', 'center_y'=>'int', 'width'=>'int', 'height'=>'int', 'color'=>'int'], - 'imagefilledpolygon' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], - 'imagefilledrectangle' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - 'imagefilltoborder' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'border_color'=>'int', 'color'=>'int'], - 'imagefilter' => ['bool', 'image'=>'resource', 'filter'=>'int', 'args='=>'int', 'arg2='=>'int', 'arg3='=>'int', 'arg4='=>'int'], - 'imageflip' => ['bool', 'image'=>'resource', 'mode'=>'int'], - 'imagefontheight' => ['int', 'font'=>'int'], - 'imagefontwidth' => ['int', 'font'=>'int'], - 'imageftbbox' => ['array|false', 'size'=>'float', 'angle'=>'float', 'font_filename'=>'string', 'string'=>'string', 'options='=>'array'], - 'imagefttext' => ['array|false', 'image'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string', 'options='=>'array'], - 'imagegammacorrect' => ['bool', 'image'=>'resource', 'input_gamma'=>'float', 'output_gamma'=>'float'], - 'imagegd' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null'], - 'imagegd2' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'chunk_size='=>'int', 'mode='=>'int'], - 'imagegetclip' => ['array|false', 'im'=>'resource'], - 'imagegif' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null'], - 'imagegrabscreen' => ['false|resource'], - 'imagegrabwindow' => ['false|resource', 'window_handle'=>'int', 'client_area='=>'int'], - 'imageinterlace' => ['int|false', 'image'=>'resource', 'enable='=>'int'], - 'imageistruecolor' => ['bool', 'image'=>'resource'], - 'imagejpeg' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int'], - 'imagelayereffect' => ['bool', 'image'=>'resource', 'effect'=>'int'], - 'imageline' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - 'imageloadfont' => ['int|false', 'filename'=>'string'], - 'imagepalettecopy' => ['void', 'dst'=>'resource', 'src'=>'resource'], - 'imagepalettetotruecolor' => ['bool', 'image'=>'resource'], - 'imagepng' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int', 'filters='=>'int'], - 'imagepolygon' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points_or_color'=>'int', 'color'=>'int'], - 'imagerectangle' => ['bool', 'image'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'color'=>'int'], - 'imagerotate' => ['resource|false', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'], - 'imagesavealpha' => ['bool', 'image'=>'resource', 'enable'=>'bool'], - 'imagescale' => ['resource|false', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'], - 'imagesetbrush' => ['bool', 'image'=>'resource', 'brush'=>'resource'], - 'imagesetinterpolation' => ['bool', 'image'=>'resource', 'method'=>'int'], - 'imagesetpixel' => ['bool', 'image'=>'resource', 'x'=>'int', 'y'=>'int', 'color'=>'int'], - 'imagesetstyle' => ['bool', 'image'=>'resource', 'style'=>'non-empty-array'], - 'imagesetthickness' => ['bool', 'image'=>'resource', 'thickness'=>'int'], - 'imagesettile' => ['bool', 'image'=>'resource', 'tile'=>'resource'], - 'imagestring' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], - 'imagestringup' => ['bool', 'image'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'string'=>'string', 'color'=>'int'], - 'imagesx' => ['int|false', 'image'=>'resource'], - 'imagesy' => ['int|false', 'image'=>'resource'], - 'imagetruecolortopalette' => ['bool', 'image'=>'resource', 'dither'=>'bool', 'num_colors'=>'int'], - 'imagettfbbox' => ['false|array', 'size'=>'float', 'angle'=>'float', 'font_filename'=>'string', 'string'=>'string'], - 'imagettftext' => ['false|array', 'image'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'color'=>'int', 'font_filename'=>'string', 'text'=>'string'], - 'imagetypes' => ['int'], - 'imagewbmp' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'foreground_color='=>'int'], - 'imagewebp' => ['bool', 'image'=>'resource', 'file='=>'string|resource|null', 'quality='=>'int'], - 'imagexbm' => ['bool', 'image'=>'resource', 'filename='=>'?string', 'foreground_color='=>'int'], - 'imap_8bit' => ['string|false', 'string'=>'string'], - 'imap_alerts' => ['array|false'], - 'imap_append' => ['bool', 'imap'=>'resource', 'folder'=>'string', 'message'=>'string', 'options='=>'string', 'internal_date='=>'string'], - 'imap_base64' => ['string|false', 'string'=>'string'], - 'imap_binary' => ['string|false', 'string'=>'string'], - 'imap_body' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'imap_bodystruct' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string'], - 'imap_check' => ['stdClass|false', 'imap'=>'resource'], - 'imap_clearflag_full' => ['bool', 'imap'=>'resource', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], - 'imap_close' => ['bool', 'imap'=>'resource', 'flags='=>'int'], - 'imap_create' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], - 'imap_createmailbox' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], - 'imap_delete' => ['bool', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'imap_deletemailbox' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], - 'imap_errors' => ['array|false'], - 'imap_expunge' => ['bool', 'imap'=>'resource'], - 'imap_fetch_overview' => ['array|false', 'imap'=>'resource', 'sequence'=>'string', 'flags='=>'int'], - 'imap_fetchbody' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], - 'imap_fetchheader' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'imap_fetchmime' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'section'=>'string', 'flags='=>'int'], - 'imap_fetchstructure' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'imap_fetchtext' => ['string|false', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'imap_gc' => ['bool', 'imap'=>'resource', 'flags'=>'int'], - 'imap_get_quota' => ['array|false', 'imap'=>'resource', 'quota_root'=>'string'], - 'imap_get_quotaroot' => ['array|false', 'imap'=>'resource', 'mailbox'=>'string'], - 'imap_getacl' => ['array|false', 'imap'=>'resource', 'mailbox'=>'string'], - 'imap_getmailboxes' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'imap_getsubscribed' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'imap_header' => ['stdClass|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string'], - 'imap_headerinfo' => ['stdClass|false', 'imap'=>'resource', 'message_num'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string|null'], - 'imap_headers' => ['array|false', 'imap'=>'resource'], - 'imap_last_error' => ['string|false'], - 'imap_list' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'imap_listmailbox' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'imap_listscan' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], - 'imap_listsubscribed' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'imap_lsub' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string'], - 'imap_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string', 'cc='=>'string', 'bcc='=>'string', 'return_path='=>'string'], - 'imap_mail_compose' => ['string|false', 'envelope'=>'array', 'bodies'=>'array'], - 'imap_mail_copy' => ['bool', 'imap'=>'resource', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], - 'imap_mail_move' => ['bool', 'imap'=>'resource', 'message_nums'=>'string', 'mailbox'=>'string', 'flags='=>'int'], - 'imap_mailboxmsginfo' => ['stdClass|false', 'imap'=>'resource'], - 'imap_mime_header_decode' => ['array|false', 'string'=>'string'], - 'imap_msgno' => ['int|false', 'imap'=>'resource', 'message_uid'=>'int'], - 'imap_mutf7_to_utf8' => ['string|false', 'string'=>'string'], - 'imap_num_msg' => ['int|false', 'imap'=>'resource'], - 'imap_num_recent' => ['int|false', 'imap'=>'resource'], - 'imap_open' => ['resource|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'flags='=>'int', 'retries='=>'int', 'options='=>'?array'], - 'imap_ping' => ['bool', 'imap'=>'resource'], - 'imap_qprint' => ['string|false', 'string'=>'string'], - 'imap_rename' => ['bool', 'imap'=>'resource', 'from'=>'string', 'to'=>'string'], - 'imap_renamemailbox' => ['bool', 'imap'=>'resource', 'from'=>'string', 'to'=>'string'], - 'imap_reopen' => ['bool', 'imap'=>'resource', 'mailbox'=>'string', 'flags='=>'int', 'retries='=>'int'], - 'imap_rfc822_parse_adrlist' => ['array', 'string'=>'string', 'default_hostname'=>'string'], - 'imap_rfc822_parse_headers' => ['stdClass', 'headers'=>'string', 'default_hostname='=>'string'], - 'imap_rfc822_write_address' => ['string|false', 'mailbox'=>'?string', 'hostname'=>'?string', 'personal'=>'?string'], - 'imap_savebody' => ['bool', 'imap'=>'resource', 'file'=>'string|resource', 'message_num'=>'int', 'section='=>'string', 'flags='=>'int'], - 'imap_scan' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], - 'imap_scanmailbox' => ['array|false', 'imap'=>'resource', 'reference'=>'string', 'pattern'=>'string', 'content'=>'string'], - 'imap_search' => ['array|false', 'imap'=>'resource', 'criteria'=>'string', 'flags='=>'int', 'charset='=>'string'], - 'imap_set_quota' => ['bool', 'imap'=>'resource', 'quota_root'=>'string', 'mailbox_size'=>'int'], - 'imap_setacl' => ['bool', 'imap'=>'resource', 'mailbox'=>'string', 'user_id'=>'string', 'rights'=>'string'], - 'imap_setflag_full' => ['bool', 'imap'=>'resource', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], - 'imap_sort' => ['array|false', 'imap'=>'resource', 'criteria'=>'int', 'reverse'=>'int', 'flags='=>'int', 'search_criteria='=>'string', 'charset='=>'string'], - 'imap_status' => ['stdClass|false', 'imap'=>'resource', 'mailbox'=>'string', 'flags'=>'int'], - 'imap_subscribe' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], - 'imap_thread' => ['array|false', 'imap'=>'resource', 'flags='=>'int'], - 'imap_timeout' => ['int|bool', 'timeout_type'=>'int', 'timeout='=>'int'], - 'imap_uid' => ['int|false', 'imap'=>'resource', 'message_num'=>'int'], - 'imap_undelete' => ['bool', 'imap'=>'resource', 'message_num'=>'int', 'flags='=>'int'], - 'imap_unsubscribe' => ['bool', 'imap'=>'resource', 'mailbox'=>'string'], - 'imap_utf7_decode' => ['string|false', 'string'=>'string'], - 'imap_utf7_encode' => ['string', 'string'=>'string'], - 'imap_utf8' => ['string', 'mime_encoded_text'=>'string'], - 'imap_utf8_to_mutf7' => ['string|false', 'string'=>'string'], - 'implode' => ['string', 'separator'=>'string', 'array'=>'array'], - 'implode\'1' => ['string', 'separator'=>'array'], - 'import_request_variables' => ['bool', 'types'=>'string', 'prefix='=>'string'], - 'in_array' => ['bool', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'], - 'inclued_get_data' => ['array'], - 'inet_ntop' => ['string|false', 'ip'=>'string'], - 'inet_pton' => ['string|false', 'ip'=>'string'], - 'inflate_add' => ['string|false', 'context'=>'resource', 'data'=>'string', 'flush_mode='=>'int'], - 'inflate_get_read_len' => ['int|false', 'context'=>'resource'], - 'inflate_get_status' => ['int|false', 'context'=>'resource'], - 'inflate_init' => ['resource|false', 'encoding'=>'int', 'options='=>'array'], - 'ingres_autocommit' => ['bool', 'link'=>'resource'], - 'ingres_autocommit_state' => ['bool', 'link'=>'resource'], - 'ingres_charset' => ['string', 'link'=>'resource'], - 'ingres_close' => ['bool', 'link'=>'resource'], - 'ingres_commit' => ['bool', 'link'=>'resource'], - 'ingres_connect' => ['resource', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'options='=>'array'], - 'ingres_cursor' => ['string', 'result'=>'resource'], - 'ingres_errno' => ['int', 'link='=>'resource'], - 'ingres_error' => ['string', 'link='=>'resource'], - 'ingres_errsqlstate' => ['string', 'link='=>'resource'], - 'ingres_escape_string' => ['string', 'link'=>'resource', 'source_string'=>'string'], - 'ingres_execute' => ['bool', 'result'=>'resource', 'params='=>'array', 'types='=>'string'], - 'ingres_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], - 'ingres_fetch_assoc' => ['array', 'result'=>'resource'], - 'ingres_fetch_object' => ['object', 'result'=>'resource', 'result_type='=>'int'], - 'ingres_fetch_proc_return' => ['int', 'result'=>'resource'], - 'ingres_fetch_row' => ['array', 'result'=>'resource'], - 'ingres_field_length' => ['int', 'result'=>'resource', 'index'=>'int'], - 'ingres_field_name' => ['string', 'result'=>'resource', 'index'=>'int'], - 'ingres_field_nullable' => ['bool', 'result'=>'resource', 'index'=>'int'], - 'ingres_field_precision' => ['int', 'result'=>'resource', 'index'=>'int'], - 'ingres_field_scale' => ['int', 'result'=>'resource', 'index'=>'int'], - 'ingres_field_type' => ['string', 'result'=>'resource', 'index'=>'int'], - 'ingres_free_result' => ['bool', 'result'=>'resource'], - 'ingres_next_error' => ['bool', 'link='=>'resource'], - 'ingres_num_fields' => ['int', 'result'=>'resource'], - 'ingres_num_rows' => ['int', 'result'=>'resource'], - 'ingres_pconnect' => ['resource', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'options='=>'array'], - 'ingres_prepare' => ['mixed', 'link'=>'resource', 'query'=>'string'], - 'ingres_query' => ['mixed', 'link'=>'resource', 'query'=>'string', 'params='=>'array', 'types='=>'string'], - 'ingres_result_seek' => ['bool', 'result'=>'resource', 'position'=>'int'], - 'ingres_rollback' => ['bool', 'link'=>'resource'], - 'ingres_set_environment' => ['bool', 'link'=>'resource', 'options'=>'array'], - 'ingres_unbuffered_query' => ['mixed', 'link'=>'resource', 'query'=>'string', 'params='=>'array', 'types='=>'string'], - 'ini_alter' => ['string|false', 'option'=>'string', 'value'=>'string'], - 'ini_get' => ['string|false', 'option'=>'string'], - 'ini_get_all' => ['array|false', 'extension='=>'?string', 'details='=>'bool'], - 'ini_restore' => ['void', 'option'=>'string'], - 'ini_set' => ['string|false', 'option'=>'string', 'value'=>'string'], - 'inotify_add_watch' => ['int', 'inotify_instance'=>'resource', 'pathname'=>'string', 'mask'=>'int'], - 'inotify_init' => ['resource|false'], - 'inotify_queue_len' => ['int', 'inotify_instance'=>'resource'], - 'inotify_read' => ['array|false', 'inotify_instance'=>'resource'], - 'inotify_rm_watch' => ['bool', 'inotify_instance'=>'resource', 'watch_descriptor'=>'int'], - 'intdiv' => ['int', 'num1'=>'int', 'num2'=>'int'], - 'interface_exists' => ['bool', 'interface'=>'string', 'autoload='=>'bool'], - 'intl_error_name' => ['string', 'errorCode'=>'int'], - 'intl_get_error_code' => ['int'], - 'intl_get_error_message' => ['string'], - 'intl_is_failure' => ['bool', 'errorCode'=>'int'], - 'intlcal_add' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int', 'value'=>'int'], - 'intlcal_after' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], - 'intlcal_before' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], - '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_get' => ['mixed', 'calendar'=>'IntlCalendar', 'field'=>'int'], - 'intlcal_get_actual_maximum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], - 'intlcal_get_actual_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], - 'intlcal_get_available_locales' => ['array'], - 'intlcal_get_day_of_week_type' => ['int', 'calendar'=>'IntlCalendar', 'dayOfWeek'=>'int'], - 'intlcal_get_first_day_of_week' => ['int', 'calendar'=>'IntlCalendar'], - 'intlcal_get_greatest_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], - 'intlcal_get_keyword_values_for_locale' => ['Iterator|false', 'keyword'=>'string', 'locale'=>'string', 'onlyCommon'=>'bool'], - 'intlcal_get_least_maximum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], - 'intlcal_get_locale' => ['string', 'calendar'=>'IntlCalendar', 'type'=>'int'], - 'intlcal_get_maximum' => ['int|false', 'calendar'=>'IntlCalendar', 'field'=>'int'], - 'intlcal_get_minimal_days_in_first_week' => ['int', 'calendar'=>'IntlCalendar'], - 'intlcal_get_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], - 'intlcal_get_now' => ['float'], - 'intlcal_get_repeated_wall_time_option' => ['int', 'calendar'=>'IntlCalendar'], - 'intlcal_get_skipped_wall_time_option' => ['int', 'calendar'=>'IntlCalendar'], - '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_in_daylight_time' => ['bool', 'calendar'=>'IntlCalendar'], - 'intlcal_is_equivalent_to' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], - 'intlcal_is_lenient' => ['bool', 'calendar'=>'IntlCalendar'], - 'intlcal_is_set' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int'], - 'intlcal_is_weekend' => ['bool', 'calendar'=>'IntlCalendar', 'timestamp='=>'float'], - 'intlcal_roll' => ['bool', 'calendar'=>'IntlCalendar', 'field'=>'int', 'value'=>'mixed'], - 'intlcal_set' => ['bool', 'calendar'=>'IntlCalendar', 'year'=>'int', 'month'=>'int'], - '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_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_get_gregorian_change' => ['float', 'calendar'=>'IntlGregorianCalendar'], - 'intlgregcal_is_leap_year' => ['bool', 'calendar'=>'int'], - 'intlgregcal_set_gregorian_change' => ['void', 'calendar'=>'IntlGregorianCalendar', 'timestamp'=>'float'], - 'intltz_count_equivalent_ids' => ['int', 'timezoneId'=>'string'], - 'intltz_create_enumeration' => ['IntlIterator', 'countryOrRawOffset'=>'mixed'], - '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_dst_savings' => ['int', 'timezone'=>'IntlTimeZone'], - 'intltz_get_equivalent_id' => ['string', 'timezoneId'=>'string', 'offset'=>'int'], - 'intltz_get_error_code' => ['int', 'timezone'=>'IntlTimeZone'], - 'intltz_get_error_message' => ['string', 'timezone'=>'IntlTimeZone'], - 'intltz_get_id' => ['string', 'timezone'=>'IntlTimeZone'], - 'intltz_get_offset' => ['int', 'timezone'=>'IntlTimeZone', 'timestamp'=>'float', 'local'=>'bool', '&rawOffset'=>'int', '&dstOffset'=>'int'], - 'intltz_get_raw_offset' => ['int', 'timezone'=>'IntlTimeZone'], - 'intltz_get_tz_data_version' => ['string', 'object'=>'IntlTimeZone'], - 'intltz_has_same_rules' => ['bool', 'timezone'=>'IntlTimeZone', 'other'=>'IntlTimeZone'], - 'intltz_to_date_time_zone' => ['DateTimeZone', 'timezone'=>'IntlTimeZone'], - 'intltz_use_daylight_time' => ['bool', 'timezone'=>'IntlTimeZone'], - 'intlz_create_default' => ['IntlTimeZone'], - 'intval' => ['int', 'value'=>'mixed', 'base='=>'int'], - 'ip2long' => ['int|false', 'ip'=>'string'], - 'iptcembed' => ['string|bool', 'iptc_data'=>'string', 'filename'=>'string', 'spool='=>'int'], - 'iptcparse' => ['array|false', 'iptc_block'=>'string'], - 'is_a' => ['bool', 'object_or_class'=>'mixed', 'class'=>'string', 'allow_string='=>'bool'], - 'is_array' => ['bool', 'value'=>'mixed'], - 'is_bool' => ['bool', 'value'=>'mixed'], - 'is_callable' => ['bool', 'value'=>'callable|mixed', 'syntax_only='=>'bool', '&w_callable_name='=>'string'], - 'is_dir' => ['bool', 'filename'=>'string'], - 'is_double' => ['bool', 'value'=>'mixed'], - 'is_executable' => ['bool', 'filename'=>'string'], - 'is_file' => ['bool', 'filename'=>'string'], - 'is_finite' => ['bool', 'num'=>'float'], - 'is_float' => ['bool', 'value'=>'mixed'], - 'is_infinite' => ['bool', 'num'=>'float'], - 'is_int' => ['bool', 'value'=>'mixed'], - 'is_integer' => ['bool', 'value'=>'mixed'], - 'is_link' => ['bool', 'filename'=>'string'], - 'is_long' => ['bool', 'value'=>'mixed'], - 'is_nan' => ['bool', 'num'=>'float'], - 'is_null' => ['bool', 'value'=>'mixed'], - 'is_numeric' => ['bool', 'value'=>'mixed'], - 'is_object' => ['bool', 'value'=>'mixed'], - 'is_readable' => ['bool', 'filename'=>'string'], - 'is_real' => ['bool', 'value'=>'mixed'], - 'is_resource' => ['bool', 'value'=>'mixed'], - 'is_scalar' => ['bool', 'value'=>'mixed'], - 'is_soap_fault' => ['bool', 'object'=>'mixed'], - 'is_string' => ['bool', 'value'=>'mixed'], - 'is_subclass_of' => ['bool', 'object_or_class'=>'object|string', 'class'=>'class-string', 'allow_string='=>'bool'], - 'is_tainted' => ['bool', 'string'=>'string'], - 'is_uploaded_file' => ['bool', 'filename'=>'string'], - 'is_writable' => ['bool', 'filename'=>'string'], - 'is_writeable' => ['bool', 'filename'=>'string'], - 'isset' => ['bool', 'value'=>'mixed', '...rest='=>'mixed'], - 'iterator_apply' => ['0|positive-int', 'iterator'=>'Traversable', 'callback'=>'callable(mixed):bool', 'args='=>'array'], - 'iterator_count' => ['0|positive-int', 'iterator'=>'Traversable'], - 'iterator_to_array' => ['array', 'iterator'=>'Traversable', 'preserve_keys='=>'bool'], - 'java_last_exception_clear' => ['void'], - 'java_last_exception_get' => ['object'], - 'java_reload' => ['array', 'new_jarpath'=>'string'], - 'java_require' => ['array', 'new_classpath'=>'string'], - 'java_set_encoding' => ['array', 'encoding'=>'string'], - 'java_set_ignore_case' => ['void', 'ignore'=>'bool'], - 'java_throw_exceptions' => ['void', 'throw'=>'bool'], - 'jddayofweek' => ['mixed', 'julian_day'=>'int', 'mode='=>'int'], - 'jdmonthname' => ['string', 'julian_day'=>'int', 'mode'=>'int'], - 'jdtofrench' => ['string', 'julian_day'=>'int'], - 'jdtogregorian' => ['string', 'julian_day'=>'int'], - 'jdtojewish' => ['string', 'julian_day'=>'int', 'hebrew='=>'bool', 'flags='=>'int'], - 'jdtojulian' => ['string', 'julian_day'=>'int'], - 'jdtounix' => ['int|false', 'julian_day'=>'int'], - 'jewishtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], - 'jobqueue_license_info' => ['array'], - 'join' => ['string', 'separator'=>'string', 'array'=>'array'], - 'join\'1' => ['string', 'separator'=>'array'], - 'jpeg2wbmp' => ['bool', 'jpegname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'], - 'json_decode' => ['mixed', 'json'=>'string', 'associative='=>'bool', 'depth='=>'int', 'flags='=>'int'], - 'json_encode' => ['string|false', 'value'=>'mixed', 'flags='=>'int', 'depth='=>'int'], - 'json_last_error' => ['int'], - 'json_last_error_msg' => ['string'], - 'judy_type' => ['int', 'array'=>'judy'], - 'judy_version' => ['string'], - 'juliantojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], - 'kadm5_chpass_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'password'=>'string'], - 'kadm5_create_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'password='=>'string', 'options='=>'array'], - 'kadm5_delete_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string'], - 'kadm5_destroy' => ['bool', 'handle'=>'resource'], - 'kadm5_flush' => ['bool', 'handle'=>'resource'], - 'kadm5_get_policies' => ['array', 'handle'=>'resource'], - 'kadm5_get_principal' => ['array', 'handle'=>'resource', 'principal'=>'string'], - 'kadm5_get_principals' => ['array', 'handle'=>'resource'], - 'kadm5_init_with_password' => ['resource', 'admin_server'=>'string', 'realm'=>'string', 'principal'=>'string', 'password'=>'string'], - 'kadm5_modify_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'options'=>'array'], - 'key' => ['int|string|null', 'array'=>'array|object'], - 'key_exists' => ['bool', 'key'=>'string|int', 'array'=>'array'], - 'krsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], - 'ksort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], - 'labelObj::__construct' => ['void'], - 'labelObj::convertToString' => ['string'], - 'labelObj::deleteStyle' => ['int', 'index'=>'int'], - 'labelObj::free' => ['void'], - 'labelObj::getBinding' => ['string', 'labelbinding'=>'mixed'], - 'labelObj::getExpressionString' => ['string'], - 'labelObj::getStyle' => ['styleObj', 'index'=>'int'], - 'labelObj::getTextString' => ['string'], - 'labelObj::moveStyleDown' => ['int', 'index'=>'int'], - 'labelObj::moveStyleUp' => ['int', 'index'=>'int'], - 'labelObj::removeBinding' => ['int', 'labelbinding'=>'mixed'], - 'labelObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'labelObj::setBinding' => ['int', 'labelbinding'=>'mixed', 'value'=>'string'], - 'labelObj::setExpression' => ['int', 'expression'=>'string'], - 'labelObj::setText' => ['int', 'text'=>'string'], - 'labelObj::updateFromString' => ['int', 'snippet'=>'string'], - 'labelcacheObj::freeCache' => ['bool'], - 'layerObj::addFeature' => ['int', 'shape'=>'shapeObj'], - 'layerObj::applySLD' => ['int', 'sldxml'=>'string', 'namedlayer'=>'string'], - 'layerObj::applySLDURL' => ['int', 'sldurl'=>'string', 'namedlayer'=>'string'], - 'layerObj::clearProcessing' => ['void'], - 'layerObj::close' => ['void'], - 'layerObj::convertToString' => ['string'], - 'layerObj::draw' => ['int', 'image'=>'imageObj'], - 'layerObj::drawQuery' => ['int', 'image'=>'imageObj'], - 'layerObj::free' => ['void'], - 'layerObj::generateSLD' => ['string'], - 'layerObj::getClass' => ['classObj', 'classIndex'=>'int'], - 'layerObj::getClassIndex' => ['int', 'shape'=>'', 'classgroup'=>'', 'numclasses'=>''], - 'layerObj::getExtent' => ['rectObj'], - 'layerObj::getFilterString' => ['?string'], - 'layerObj::getGridIntersectionCoordinates' => ['array'], - 'layerObj::getItems' => ['array'], - 'layerObj::getMetaData' => ['int', 'name'=>'string'], - 'layerObj::getNumResults' => ['int'], - 'layerObj::getProcessing' => ['array'], - 'layerObj::getProjection' => ['string'], - 'layerObj::getResult' => ['resultObj', 'index'=>'int'], - 'layerObj::getResultsBounds' => ['rectObj'], - 'layerObj::getShape' => ['shapeObj', 'result'=>'resultObj'], - 'layerObj::getWMSFeatureInfoURL' => ['string', 'clickX'=>'int', 'clickY'=>'int', 'featureCount'=>'int', 'infoFormat'=>'string'], - 'layerObj::isVisible' => ['bool'], - 'layerObj::moveclassdown' => ['int', 'index'=>'int'], - 'layerObj::moveclassup' => ['int', 'index'=>'int'], - 'layerObj::ms_newLayerObj' => ['layerObj', 'map'=>'mapObj', 'layer'=>'layerObj'], - 'layerObj::nextShape' => ['shapeObj'], - 'layerObj::open' => ['int'], - 'layerObj::queryByAttributes' => ['int', 'qitem'=>'string', 'qstring'=>'string', 'mode'=>'int'], - 'layerObj::queryByFeatures' => ['int', 'slayer'=>'int'], - 'layerObj::queryByPoint' => ['int', 'point'=>'pointObj', 'mode'=>'int', 'buffer'=>'float'], - 'layerObj::queryByRect' => ['int', 'rect'=>'rectObj'], - 'layerObj::queryByShape' => ['int', 'shape'=>'shapeObj'], - 'layerObj::removeClass' => ['?classObj', 'index'=>'int'], - 'layerObj::removeMetaData' => ['int', 'name'=>'string'], - 'layerObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'layerObj::setConnectionType' => ['int', 'connectiontype'=>'int', 'plugin_library'=>'string'], - 'layerObj::setFilter' => ['int', 'expression'=>'string'], - 'layerObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], - 'layerObj::setProjection' => ['int', 'proj_params'=>'string'], - 'layerObj::setWKTProjection' => ['int', 'proj_params'=>'string'], - 'layerObj::updateFromString' => ['int', 'snippet'=>'string'], - 'lcfirst' => ['string', 'string'=>'string'], - 'lcg_value' => ['float'], - 'lchgrp' => ['bool', 'filename'=>'string', 'group'=>'string|int'], - 'lchown' => ['bool', 'filename'=>'string', 'user'=>'string|int'], - 'ldap_8859_to_t61' => ['string', 'value'=>'string'], - 'ldap_add' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], - 'ldap_add_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], - 'ldap_bind' => ['bool', 'ldap'=>'resource', 'dn='=>'string|null', 'password='=>'string|null'], - 'ldap_bind_ext' => ['resource|false', 'ldap'=>'resource', 'dn='=>'string|null', 'password='=>'string|null', 'controls='=>'array'], - 'ldap_close' => ['bool', 'ldap'=>'resource'], - 'ldap_compare' => ['bool|int', 'ldap'=>'resource', 'dn'=>'string', 'attribute'=>'string', 'value'=>'string'], - 'ldap_connect' => ['resource|false', 'uri='=>'string', 'port='=>'int', 'wallet='=>'string', 'password='=>'string', 'auth_mode='=>'int'], - 'ldap_control_paged_result' => ['bool', 'link_identifier'=>'resource', 'pagesize'=>'int', 'iscritical='=>'bool', 'cookie='=>'string'], - 'ldap_control_paged_result_response' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', '&w_cookie'=>'string', '&w_estimated'=>'int'], - 'ldap_count_entries' => ['int|false', 'ldap'=>'resource', 'result'=>'resource'], - 'ldap_delete' => ['bool', 'ldap'=>'resource', 'dn'=>'string'], - 'ldap_delete_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'controls='=>'array'], - 'ldap_dn2ufn' => ['string', 'dn'=>'string'], - 'ldap_err2str' => ['string', 'errno'=>'int'], - 'ldap_errno' => ['int', 'ldap'=>'resource'], - 'ldap_error' => ['string', 'ldap'=>'resource'], - 'ldap_escape' => ['string', 'value'=>'string', 'ignore='=>'string', 'flags='=>'int'], - 'ldap_explode_dn' => ['array|false', 'dn'=>'string', 'with_attrib'=>'int'], - 'ldap_first_attribute' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], - 'ldap_first_entry' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], - 'ldap_first_reference' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], - 'ldap_free_result' => ['bool', 'ldap'=>'resource'], - 'ldap_get_attributes' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource'], - 'ldap_get_dn' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], - 'ldap_get_entries' => ['array|false', 'ldap'=>'resource', 'result'=>'resource'], - 'ldap_get_option' => ['bool', 'ldap'=>'resource', 'option'=>'int', '&w_value'=>'mixed'], - 'ldap_get_values' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource', 'attribute'=>'string'], - 'ldap_get_values_len' => ['array|false', 'ldap'=>'resource', 'entry'=>'resource', 'attribute'=>'string'], - 'ldap_list' => ['resource|false', 'ldap'=>'resource|array', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], - 'ldap_mod_add' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], - 'ldap_mod_add_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], - 'ldap_mod_del' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], - 'ldap_mod_del_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], - 'ldap_mod_replace' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], - 'ldap_mod_replace_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array', 'controls='=>'array'], - 'ldap_modify' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'entry'=>'array'], - 'ldap_modify_batch' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'modifications_info'=>'array'], - 'ldap_next_attribute' => ['string|false', 'ldap'=>'resource', 'entry'=>'resource'], - 'ldap_next_entry' => ['resource|false', 'ldap'=>'resource', 'result'=>'resource'], - 'ldap_next_reference' => ['resource|false', 'ldap'=>'resource', 'entry'=>'resource'], - 'ldap_parse_reference' => ['bool', 'ldap'=>'resource', 'entry'=>'resource', 'referrals'=>'array'], - 'ldap_parse_result' => ['bool', 'ldap'=>'resource', 'result'=>'resource', '&w_error_code'=>'int', '&w_matched_dn='=>'string', '&w_error_message='=>'string', '&w_referrals='=>'array', '&w_controls='=>'array'], - 'ldap_read' => ['resource|false', 'ldap'=>'resource|array', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], - 'ldap_rename' => ['bool', 'ldap'=>'resource', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool'], - 'ldap_rename_ext' => ['resource|false', 'ldap'=>'resource', 'dn'=>'string', 'new_rdn'=>'string', 'new_parent'=>'string', 'delete_old_rdn'=>'bool', 'controls='=>'array'], - 'ldap_sasl_bind' => ['bool', 'ldap'=>'resource', 'dn='=>'string', 'password='=>'string', 'mech='=>'string', 'realm='=>'string', 'authc_id='=>'string', 'authz_id='=>'string', 'props='=>'string'], - 'ldap_search' => ['resource|false', 'ldap'=>'resource|resource[]', 'base'=>'string', 'filter'=>'string', 'attributes='=>'array', 'attributes_only='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], - 'ldap_set_option' => ['bool', 'ldap'=>'resource|null', 'option'=>'int', 'value'=>'mixed'], - 'ldap_set_rebind_proc' => ['bool', 'ldap'=>'resource', 'callback'=>'callable'], - 'ldap_sort' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', 'sortfilter'=>'string'], - 'ldap_start_tls' => ['bool', 'ldap'=>'resource'], - 'ldap_t61_to_8859' => ['string', 'value'=>'string'], - 'ldap_unbind' => ['bool', 'ldap'=>'resource'], - 'leak' => ['', 'num_bytes'=>'int'], - 'leak_variable' => ['', 'variable'=>'', 'leak_data'=>'bool'], - 'legendObj::convertToString' => ['string'], - 'legendObj::free' => ['void'], - 'legendObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'legendObj::updateFromString' => ['int', 'snippet'=>'string'], - 'levenshtein' => ['int', 'string1'=>'string', 'string2'=>'string'], - 'levenshtein\'1' => ['int', 'string1'=>'string', 'string2'=>'string', 'insertion_cost'=>'int', 'repetition_cost'=>'int', 'deletion_cost'=>'int'], - 'libxml_clear_errors' => ['void'], - 'libxml_disable_entity_loader' => ['bool', 'disable='=>'bool'], - 'libxml_get_errors' => ['array'], - 'libxml_get_last_error' => ['LibXMLError|false'], - 'libxml_set_external_entity_loader' => ['bool', 'resolver_function'=>'callable'], - 'libxml_set_streams_context' => ['void', 'context'=>'resource'], - 'libxml_use_internal_errors' => ['bool', 'use_errors='=>'bool'], - 'lineObj::__construct' => ['void'], - 'lineObj::add' => ['int', 'point'=>'pointObj'], - 'lineObj::addXY' => ['int', 'x'=>'float', 'y'=>'float', 'm'=>'float'], - 'lineObj::addXYZ' => ['int', 'x'=>'float', 'y'=>'float', 'z'=>'float', 'm'=>'float'], - 'lineObj::ms_newLineObj' => ['lineObj'], - 'lineObj::point' => ['pointObj', 'i'=>'int'], - 'lineObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], - 'link' => ['bool', 'target'=>'string', 'link'=>'string'], - 'linkinfo' => ['int|false', 'path'=>'string'], - 'litespeed_request_headers' => ['array'], - 'litespeed_response_headers' => ['array'], - 'locale_accept_from_http' => ['string|false', 'header'=>'string'], - 'locale_canonicalize' => ['?string', 'locale'=>'string'], - 'locale_compose' => ['string|false', 'subtags'=>'array'], - 'locale_filter_matches' => ['?bool', 'languageTag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'], - 'locale_get_all_variants' => ['?array', 'locale'=>'string'], - 'locale_get_default' => ['string'], - 'locale_get_display_language' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], - 'locale_get_display_name' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], - 'locale_get_display_region' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], - 'locale_get_display_script' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], - 'locale_get_display_variant' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], - 'locale_get_keywords' => ['array|false|null', 'locale'=>'string'], - 'locale_get_primary_language' => ['?string', 'locale'=>'string'], - 'locale_get_region' => ['?string', 'locale'=>'string'], - 'locale_get_script' => ['?string', 'locale'=>'string'], - 'locale_lookup' => ['?string', 'languageTag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'defaultLocale='=>'string'], - 'locale_parse' => ['?array', 'locale'=>'string'], - 'locale_set_default' => ['bool', 'locale'=>'string'], - 'localeconv' => ['array'], - 'localtime' => ['array', 'timestamp='=>'int', 'associative='=>'bool'], - 'log' => ['float', 'num'=>'float', 'base='=>'float'], - 'log10' => ['float', 'num'=>'float'], - 'log1p' => ['float', 'num'=>'float'], - 'long2ip' => ['string', 'ip'=>'string|int'], - 'lstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'filename'=>'string'], - 'ltrim' => ['string', 'string'=>'string', 'characters='=>'string'], - 'lzf_compress' => ['string', 'data'=>'string'], - 'lzf_decompress' => ['string', 'data'=>'string'], - 'lzf_optimized_for' => ['int'], - 'm_checkstatus' => ['int', 'conn'=>'resource', 'identifier'=>'int'], - 'm_completeauthorizations' => ['int', 'conn'=>'resource', 'array'=>'int'], - 'm_connect' => ['int', 'conn'=>'resource'], - 'm_connectionerror' => ['string', 'conn'=>'resource'], - 'm_deletetrans' => ['bool', 'conn'=>'resource', 'identifier'=>'int'], - 'm_destroyconn' => ['bool', 'conn'=>'resource'], - 'm_destroyengine' => ['void'], - 'm_getcell' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column'=>'string', 'row'=>'int'], - 'm_getcellbynum' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column'=>'int', 'row'=>'int'], - 'm_getcommadelimited' => ['string', 'conn'=>'resource', 'identifier'=>'int'], - 'm_getheader' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'column_num'=>'int'], - 'm_initconn' => ['resource'], - 'm_initengine' => ['int', 'location'=>'string'], - 'm_iscommadelimited' => ['int', 'conn'=>'resource', 'identifier'=>'int'], - 'm_maxconntimeout' => ['bool', 'conn'=>'resource', 'secs'=>'int'], - 'm_monitor' => ['int', 'conn'=>'resource'], - 'm_numcolumns' => ['int', 'conn'=>'resource', 'identifier'=>'int'], - 'm_numrows' => ['int', 'conn'=>'resource', 'identifier'=>'int'], - 'm_parsecommadelimited' => ['int', 'conn'=>'resource', 'identifier'=>'int'], - 'm_responsekeys' => ['array', 'conn'=>'resource', 'identifier'=>'int'], - 'm_responseparam' => ['string', 'conn'=>'resource', 'identifier'=>'int', 'key'=>'string'], - 'm_returnstatus' => ['int', 'conn'=>'resource', 'identifier'=>'int'], - 'm_setblocking' => ['int', 'conn'=>'resource', 'tf'=>'int'], - 'm_setdropfile' => ['int', 'conn'=>'resource', 'directory'=>'string'], - 'm_setip' => ['int', 'conn'=>'resource', 'host'=>'string', 'port'=>'int'], - 'm_setssl' => ['int', 'conn'=>'resource', 'host'=>'string', 'port'=>'int'], - 'm_setssl_cafile' => ['int', 'conn'=>'resource', 'cafile'=>'string'], - 'm_setssl_files' => ['int', 'conn'=>'resource', 'sslkeyfile'=>'string', 'sslcertfile'=>'string'], - 'm_settimeout' => ['int', 'conn'=>'resource', 'seconds'=>'int'], - 'm_sslcert_gen_hash' => ['string', 'filename'=>'string'], - 'm_transactionssent' => ['int', 'conn'=>'resource'], - 'm_transinqueue' => ['int', 'conn'=>'resource'], - 'm_transkeyval' => ['int', 'conn'=>'resource', 'identifier'=>'int', 'key'=>'string', 'value'=>'string'], - 'm_transnew' => ['int', 'conn'=>'resource'], - 'm_transsend' => ['int', 'conn'=>'resource', 'identifier'=>'int'], - 'm_uwait' => ['int', 'microsecs'=>'int'], - 'm_validateidentifier' => ['int', 'conn'=>'resource', 'tf'=>'int'], - 'm_verifyconnection' => ['bool', 'conn'=>'resource', 'tf'=>'int'], - 'm_verifysslcert' => ['bool', 'conn'=>'resource', 'tf'=>'int'], - 'magic_quotes_runtime' => ['bool', 'new_setting'=>'bool'], - 'mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array|null', 'additional_params='=>'string'], - 'mailparse_determine_best_xfer_encoding' => ['string', 'fp'=>'resource'], - 'mailparse_msg_create' => ['resource'], - 'mailparse_msg_extract_part' => ['void', 'mimemail'=>'resource', 'msgbody'=>'string', 'callbackfunc='=>'callable'], - 'mailparse_msg_extract_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'mixed', 'callbackfunc='=>'callable'], - 'mailparse_msg_extract_whole_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'string', 'callbackfunc='=>'callable'], - 'mailparse_msg_free' => ['bool', 'mimemail'=>'resource'], - 'mailparse_msg_get_part' => ['resource', 'mimemail'=>'resource', 'mimesection'=>'string'], - 'mailparse_msg_get_part_data' => ['array', 'mimemail'=>'resource'], - 'mailparse_msg_get_structure' => ['array', 'mimemail'=>'resource'], - 'mailparse_msg_parse' => ['bool', 'mimemail'=>'resource', 'data'=>'string'], - 'mailparse_msg_parse_file' => ['resource|false', 'filename'=>'string'], - 'mailparse_rfc822_parse_addresses' => ['array', 'addresses'=>'string'], - 'mailparse_stream_encode' => ['bool', 'sourcefp'=>'resource', 'destfp'=>'resource', 'encoding'=>'string'], - 'mailparse_uudecode_all' => ['array', 'fp'=>'resource'], - 'mapObj::__construct' => ['void', 'map_file_name'=>'string', 'new_map_path'=>'string'], - 'mapObj::appendOutputFormat' => ['int', 'outputFormat'=>'outputformatObj'], - 'mapObj::applySLD' => ['int', 'sldxml'=>'string'], - 'mapObj::applySLDURL' => ['int', 'sldurl'=>'string'], - 'mapObj::applyconfigoptions' => ['int'], - 'mapObj::convertToString' => ['string'], - 'mapObj::draw' => ['?imageObj'], - 'mapObj::drawLabelCache' => ['int', 'image'=>'imageObj'], - 'mapObj::drawLegend' => ['imageObj'], - 'mapObj::drawQuery' => ['?imageObj'], - 'mapObj::drawReferenceMap' => ['imageObj'], - 'mapObj::drawScaleBar' => ['imageObj'], - 'mapObj::embedLegend' => ['int', 'image'=>'imageObj'], - 'mapObj::embedScalebar' => ['int', 'image'=>'imageObj'], - 'mapObj::free' => ['void'], - 'mapObj::generateSLD' => ['string'], - 'mapObj::getAllGroupNames' => ['array'], - 'mapObj::getAllLayerNames' => ['array'], - 'mapObj::getColorbyIndex' => ['colorObj', 'iCloIndex'=>'int'], - 'mapObj::getConfigOption' => ['string', 'key'=>'string'], - 'mapObj::getLabel' => ['labelcacheMemberObj', 'index'=>'int'], - 'mapObj::getLayer' => ['layerObj', 'index'=>'int'], - 'mapObj::getLayerByName' => ['layerObj', 'layer_name'=>'string'], - 'mapObj::getLayersDrawingOrder' => ['array'], - 'mapObj::getLayersIndexByGroup' => ['array', 'groupname'=>'string'], - 'mapObj::getMetaData' => ['int', 'name'=>'string'], - 'mapObj::getNumSymbols' => ['int'], - 'mapObj::getOutputFormat' => ['?outputformatObj', 'index'=>'int'], - 'mapObj::getProjection' => ['string'], - 'mapObj::getSymbolByName' => ['int', 'symbol_name'=>'string'], - 'mapObj::getSymbolObjectById' => ['symbolObj', 'symbolid'=>'int'], - 'mapObj::loadMapContext' => ['int', 'filename'=>'string', 'unique_layer_name'=>'bool'], - 'mapObj::loadOWSParameters' => ['int', 'request'=>'OwsrequestObj', 'version'=>'string'], - 'mapObj::moveLayerDown' => ['int', 'layerindex'=>'int'], - 'mapObj::moveLayerUp' => ['int', 'layerindex'=>'int'], - 'mapObj::ms_newMapObjFromString' => ['mapObj', 'map_file_string'=>'string', 'new_map_path'=>'string'], - 'mapObj::offsetExtent' => ['int', 'x'=>'float', 'y'=>'float'], - 'mapObj::owsDispatch' => ['int', 'request'=>'OwsrequestObj'], - 'mapObj::prepareImage' => ['imageObj'], - 'mapObj::prepareQuery' => ['void'], - 'mapObj::processLegendTemplate' => ['string', 'params'=>'array'], - 'mapObj::processQueryTemplate' => ['string', 'params'=>'array', 'generateimages'=>'bool'], - 'mapObj::processTemplate' => ['string', 'params'=>'array', 'generateimages'=>'bool'], - 'mapObj::queryByFeatures' => ['int', 'slayer'=>'int'], - 'mapObj::queryByIndex' => ['int', 'layerindex'=>'', 'tileindex'=>'', 'shapeindex'=>'', 'addtoquery'=>''], - 'mapObj::queryByPoint' => ['int', 'point'=>'pointObj', 'mode'=>'int', 'buffer'=>'float'], - 'mapObj::queryByRect' => ['int', 'rect'=>'rectObj'], - 'mapObj::queryByShape' => ['int', 'shape'=>'shapeObj'], - 'mapObj::removeLayer' => ['layerObj', 'nIndex'=>'int'], - 'mapObj::removeMetaData' => ['int', 'name'=>'string'], - 'mapObj::removeOutputFormat' => ['int', 'name'=>'string'], - 'mapObj::save' => ['int', 'filename'=>'string'], - 'mapObj::saveMapContext' => ['int', 'filename'=>'string'], - 'mapObj::saveQuery' => ['int', 'filename'=>'string', 'results'=>'int'], - 'mapObj::scaleExtent' => ['int', 'zoomfactor'=>'float', 'minscaledenom'=>'float', 'maxscaledenom'=>'float'], - 'mapObj::selectOutputFormat' => ['int', 'type'=>'string'], - 'mapObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'mapObj::setCenter' => ['int', 'center'=>'pointObj'], - 'mapObj::setConfigOption' => ['int', 'key'=>'string', 'value'=>'string'], - 'mapObj::setExtent' => ['void', 'minx'=>'float', 'miny'=>'float', 'maxx'=>'float', 'maxy'=>'float'], - 'mapObj::setFontSet' => ['int', 'fileName'=>'string'], - 'mapObj::setMetaData' => ['int', 'name'=>'string', 'value'=>'string'], - 'mapObj::setProjection' => ['int', 'proj_params'=>'string', 'bSetUnitsAndExtents'=>'bool'], - 'mapObj::setRotation' => ['int', 'rotation_angle'=>'float'], - 'mapObj::setSize' => ['int', 'width'=>'int', 'height'=>'int'], - 'mapObj::setSymbolSet' => ['int', 'fileName'=>'string'], - 'mapObj::setWKTProjection' => ['int', 'proj_params'=>'string', 'bSetUnitsAndExtents'=>'bool'], - 'mapObj::zoomPoint' => ['int', 'nZoomFactor'=>'int', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'], - 'mapObj::zoomRectangle' => ['int', 'oPixelExt'=>'rectObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'], - 'mapObj::zoomScale' => ['int', 'nScaleDenom'=>'float', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj', 'oMaxGeorefExt'=>'rectObj'], - 'max' => ['mixed', 'value'=>'non-empty-array'], - 'max\'1' => ['mixed', 'value'=>'', 'values'=>'', '...args='=>''], - 'maxdb::__construct' => ['void', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], - 'maxdb::affected_rows' => ['int', 'link'=>''], - 'maxdb::auto_commit' => ['bool', 'link'=>'', 'mode'=>'bool'], - 'maxdb::change_user' => ['bool', 'link'=>'', 'user'=>'string', 'password'=>'string', 'database'=>'string'], - 'maxdb::character_set_name' => ['string', 'link'=>''], - 'maxdb::close' => ['bool', 'link'=>''], - 'maxdb::commit' => ['bool', 'link'=>''], - 'maxdb::disable_reads_from_master' => ['', 'link'=>''], - 'maxdb::errno' => ['int', 'link'=>''], - 'maxdb::error' => ['string', 'link'=>''], - 'maxdb::field_count' => ['int', 'link'=>''], - 'maxdb::get_host_info' => ['string', 'link'=>''], - 'maxdb::info' => ['string', 'link'=>''], - 'maxdb::insert_id' => ['', 'link'=>''], - 'maxdb::kill' => ['bool', 'link'=>'', 'processid'=>'int'], - 'maxdb::more_results' => ['bool', 'link'=>''], - 'maxdb::multi_query' => ['bool', 'link'=>'', 'query'=>'string'], - 'maxdb::next_result' => ['bool', 'link'=>''], - 'maxdb::num_rows' => ['int', 'result'=>''], - 'maxdb::options' => ['bool', 'link'=>'', 'option'=>'int', 'value'=>''], - 'maxdb::ping' => ['bool', 'link'=>''], - 'maxdb::prepare' => ['maxdb_stmt', 'link'=>'', 'query'=>'string'], - 'maxdb::protocol_version' => ['string', 'link'=>''], - 'maxdb::query' => ['', 'link'=>'', 'query'=>'string', 'resultmode='=>'int'], - 'maxdb::real_connect' => ['bool', 'link'=>'', 'hostname='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], - 'maxdb::real_escape_string' => ['string', 'link'=>'', 'escapestr'=>'string'], - 'maxdb::real_query' => ['bool', 'link'=>'', 'query'=>'string'], - 'maxdb::rollback' => ['bool', 'link'=>''], - 'maxdb::rpl_query_type' => ['int', 'link'=>''], - 'maxdb::select_db' => ['bool', 'link'=>'', 'dbname'=>'string'], - 'maxdb::send_query' => ['bool', 'link'=>'', 'query'=>'string'], - 'maxdb::server_info' => ['string', 'link'=>''], - 'maxdb::server_version' => ['int', 'link'=>''], - 'maxdb::sqlstate' => ['string', 'link'=>''], - 'maxdb::ssl_set' => ['bool', 'link'=>'', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], - 'maxdb::stat' => ['string', 'link'=>''], - 'maxdb::stmt_init' => ['object', 'link'=>''], - 'maxdb::store_result' => ['bool', 'link'=>''], - 'maxdb::thread_id' => ['int', 'link'=>''], - 'maxdb::use_result' => ['resource', 'link'=>''], - 'maxdb::warning_count' => ['int', 'link'=>''], - 'maxdb_affected_rows' => ['int', 'link'=>'resource'], - 'maxdb_autocommit' => ['bool', 'link'=>'', 'mode'=>'bool'], - 'maxdb_change_user' => ['bool', 'link'=>'', 'user'=>'string', 'password'=>'string', 'database'=>'string'], - 'maxdb_character_set_name' => ['string', 'link'=>''], - 'maxdb_close' => ['bool', 'link'=>''], - 'maxdb_commit' => ['bool', 'link'=>''], - 'maxdb_connect' => ['resource', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], - 'maxdb_connect_errno' => ['int'], - 'maxdb_connect_error' => ['string'], - 'maxdb_data_seek' => ['bool', 'result'=>'', 'offset'=>'int'], - 'maxdb_debug' => ['void', 'debug'=>'string'], - 'maxdb_disable_reads_from_master' => ['', 'link'=>''], - 'maxdb_disable_rpl_parse' => ['bool', 'link'=>'resource'], - 'maxdb_dump_debug_info' => ['bool', 'link'=>'resource'], - 'maxdb_embedded_connect' => ['resource', 'dbname='=>'string'], - 'maxdb_enable_reads_from_master' => ['bool', 'link'=>'resource'], - 'maxdb_enable_rpl_parse' => ['bool', 'link'=>'resource'], - 'maxdb_errno' => ['int', 'link'=>'resource'], - 'maxdb_error' => ['string', 'link'=>'resource'], - 'maxdb_fetch_array' => ['', 'result'=>'', 'resulttype='=>'int'], - 'maxdb_fetch_assoc' => ['array', 'result'=>''], - 'maxdb_fetch_field' => ['', 'result'=>''], - 'maxdb_fetch_field_direct' => ['', 'result'=>'', 'fieldnr'=>'int'], - 'maxdb_fetch_fields' => ['', 'result'=>''], - 'maxdb_fetch_lengths' => ['array', 'result'=>'resource'], - 'maxdb_fetch_object' => ['object', 'result'=>'object'], - 'maxdb_fetch_row' => ['', 'result'=>''], - 'maxdb_field_count' => ['int', 'link'=>''], - 'maxdb_field_seek' => ['bool', 'result'=>'', 'fieldnr'=>'int'], - 'maxdb_field_tell' => ['int', 'result'=>'resource'], - 'maxdb_free_result' => ['', 'result'=>''], - 'maxdb_get_client_info' => ['string'], - 'maxdb_get_client_version' => ['int'], - 'maxdb_get_host_info' => ['string', 'link'=>'resource'], - 'maxdb_get_proto_info' => ['string', 'link'=>'resource'], - 'maxdb_get_server_info' => ['string', 'link'=>'resource'], - 'maxdb_get_server_version' => ['int', 'link'=>'resource'], - 'maxdb_info' => ['string', 'link'=>'resource'], - 'maxdb_init' => ['resource'], - 'maxdb_insert_id' => ['mixed', 'link'=>'resource'], - 'maxdb_kill' => ['bool', 'link'=>'', 'processid'=>'int'], - 'maxdb_master_query' => ['bool', 'link'=>'resource', 'query'=>'string'], - 'maxdb_more_results' => ['bool', 'link'=>'resource'], - 'maxdb_multi_query' => ['bool', 'link'=>'', 'query'=>'string'], - 'maxdb_next_result' => ['bool', 'link'=>'resource'], - 'maxdb_num_fields' => ['int', 'result'=>'resource'], - 'maxdb_num_rows' => ['int', 'result'=>'resource'], - 'maxdb_options' => ['bool', 'link'=>'', 'option'=>'int', 'value'=>''], - 'maxdb_ping' => ['bool', 'link'=>''], - 'maxdb_prepare' => ['maxdb_stmt', 'link'=>'', 'query'=>'string'], - 'maxdb_query' => ['', 'link'=>'', 'query'=>'string', 'resultmode='=>'int'], - 'maxdb_real_connect' => ['bool', 'link'=>'', 'hostname='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], - 'maxdb_real_escape_string' => ['string', 'link'=>'', 'escapestr'=>'string'], - 'maxdb_real_query' => ['bool', 'link'=>'', 'query'=>'string'], - 'maxdb_report' => ['bool', 'flags'=>'int'], - 'maxdb_result::current_field' => ['int', 'result'=>''], - 'maxdb_result::data_seek' => ['bool', 'result'=>'', 'offset'=>'int'], - 'maxdb_result::fetch_array' => ['', 'result'=>'', 'resulttype='=>'int'], - 'maxdb_result::fetch_assoc' => ['array', 'result'=>''], - 'maxdb_result::fetch_field' => ['', 'result'=>''], - 'maxdb_result::fetch_field_direct' => ['', 'result'=>'', 'fieldnr'=>'int'], - 'maxdb_result::fetch_fields' => ['', 'result'=>''], - 'maxdb_result::fetch_object' => ['object', 'result'=>'object'], - 'maxdb_result::fetch_row' => ['', 'result'=>''], - 'maxdb_result::field_count' => ['int', 'result'=>''], - 'maxdb_result::field_seek' => ['bool', 'result'=>'', 'fieldnr'=>'int'], - 'maxdb_result::free' => ['', 'result'=>''], - 'maxdb_result::lengths' => ['array', 'result'=>''], - 'maxdb_rollback' => ['bool', 'link'=>''], - 'maxdb_rpl_parse_enabled' => ['int', 'link'=>'resource'], - 'maxdb_rpl_probe' => ['bool', 'link'=>'resource'], - 'maxdb_rpl_query_type' => ['int', 'link'=>''], - 'maxdb_select_db' => ['bool', 'link'=>'resource', 'dbname'=>'string'], - 'maxdb_send_query' => ['bool', 'link'=>'', 'query'=>'string'], - 'maxdb_server_end' => ['void'], - 'maxdb_server_init' => ['bool', 'server='=>'array', 'groups='=>'array'], - 'maxdb_sqlstate' => ['string', 'link'=>'resource'], - 'maxdb_ssl_set' => ['bool', 'link'=>'', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], - 'maxdb_stat' => ['string', 'link'=>''], - 'maxdb_stmt::affected_rows' => ['int', 'stmt'=>''], - 'maxdb_stmt::bind_param' => ['bool', 'stmt'=>'', 'types'=>'string', '&...rw_var'=>''], - 'maxdb_stmt::bind_param\'1' => ['bool', 'stmt'=>'', 'types'=>'string', '&rw_var'=>'array'], - 'maxdb_stmt::bind_result' => ['bool', 'stmt'=>'', '&w_var1'=>'', '&...w_vars='=>''], - 'maxdb_stmt::close' => ['bool', 'stmt'=>''], - 'maxdb_stmt::close_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int'], - 'maxdb_stmt::data_seek' => ['bool', 'statement'=>'', 'offset'=>'int'], - 'maxdb_stmt::errno' => ['int', 'stmt'=>''], - 'maxdb_stmt::error' => ['string', 'stmt'=>''], - 'maxdb_stmt::execute' => ['bool', 'stmt'=>''], - 'maxdb_stmt::fetch' => ['bool', 'stmt'=>''], - 'maxdb_stmt::free_result' => ['', 'stmt'=>''], - 'maxdb_stmt::num_rows' => ['int', 'stmt'=>''], - 'maxdb_stmt::param_count' => ['int', 'stmt'=>''], - 'maxdb_stmt::prepare' => ['', 'stmt'=>'', 'query'=>'string'], - 'maxdb_stmt::reset' => ['bool', 'stmt'=>''], - 'maxdb_stmt::result_metadata' => ['resource', 'stmt'=>''], - 'maxdb_stmt::send_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int', 'data'=>'string'], - 'maxdb_stmt::stmt_send_long_data' => ['bool', 'param_nr'=>'int', 'data'=>'string'], - 'maxdb_stmt::store_result' => ['bool'], - 'maxdb_stmt_affected_rows' => ['int', 'stmt'=>'resource'], - 'maxdb_stmt_bind_param' => ['bool', 'stmt'=>'', 'types'=>'string', 'var1'=>'', '...args='=>'', 'var='=>'array'], - 'maxdb_stmt_bind_result' => ['bool', 'stmt'=>'', '&w_var1'=>'', '&...w_vars='=>''], - 'maxdb_stmt_close' => ['bool', 'stmt'=>''], - 'maxdb_stmt_close_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int'], - 'maxdb_stmt_data_seek' => ['bool', 'statement'=>'', 'offset'=>'int'], - 'maxdb_stmt_errno' => ['int', 'stmt'=>'resource'], - 'maxdb_stmt_error' => ['string', 'stmt'=>'resource'], - 'maxdb_stmt_execute' => ['bool', 'stmt'=>''], - 'maxdb_stmt_fetch' => ['bool', 'stmt'=>''], - 'maxdb_stmt_free_result' => ['', 'stmt'=>''], - 'maxdb_stmt_init' => ['object', 'link'=>''], - 'maxdb_stmt_num_rows' => ['int', 'stmt'=>'resource'], - 'maxdb_stmt_param_count' => ['int', 'stmt'=>'resource'], - 'maxdb_stmt_prepare' => ['', 'stmt'=>'', 'query'=>'string'], - 'maxdb_stmt_reset' => ['bool', 'stmt'=>''], - 'maxdb_stmt_result_metadata' => ['resource', 'stmt'=>''], - 'maxdb_stmt_send_long_data' => ['bool', 'stmt'=>'', 'param_nr'=>'int', 'data'=>'string'], - 'maxdb_stmt_sqlstate' => ['string', 'stmt'=>'resource'], - 'maxdb_stmt_store_result' => ['bool', 'stmt'=>''], - 'maxdb_store_result' => ['bool', 'link'=>''], - 'maxdb_thread_id' => ['int', 'link'=>'resource'], - 'maxdb_thread_safe' => ['bool'], - 'maxdb_use_result' => ['resource', 'link'=>''], - 'maxdb_warning_count' => ['int', 'link'=>'resource'], - 'mb_check_encoding' => ['bool', 'value='=>'string', 'encoding='=>'string'], - 'mb_convert_case' => ['string', 'string'=>'string', 'mode'=>'int', 'encoding='=>'string'], - 'mb_convert_encoding' => ['string|false', 'string'=>'string', 'to_encoding'=>'string', 'from_encoding='=>'mixed'], - 'mb_convert_kana' => ['string', 'string'=>'string', 'mode='=>'string', 'encoding='=>'string'], - 'mb_convert_variables' => ['string|false', 'to_encoding'=>'string', 'from_encoding'=>'array|string', '&rw_var'=>'string|array|object', '&...rw_vars='=>'string|array|object'], - 'mb_decode_mimeheader' => ['string', 'string'=>'string'], - 'mb_decode_numericentity' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string'], - 'mb_detect_encoding' => ['string|false', 'string'=>'string', 'encodings='=>'mixed', 'strict='=>'bool'], - 'mb_detect_order' => ['bool|list', 'encoding='=>'mixed'], - 'mb_encode_mimeheader' => ['string', 'string'=>'string', 'charset='=>'string', 'transfer_encoding='=>'string', 'newline='=>'string', 'indent='=>'int'], - 'mb_encode_numericentity' => ['string', 'string'=>'string', 'map'=>'array', 'encoding='=>'string', 'hex='=>'bool'], - 'mb_encoding_aliases' => ['list|false', 'encoding'=>'string'], - 'mb_ereg' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array|null'], - 'mb_ereg_match' => ['bool', 'pattern'=>'string', 'string'=>'string', 'options='=>'string'], - 'mb_ereg_replace' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string'], - 'mb_ereg_replace_callback' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable', 'string'=>'string', 'options='=>'string'], - 'mb_ereg_search' => ['bool', 'pattern='=>'string', 'options='=>'string'], - 'mb_ereg_search_getpos' => ['int'], - 'mb_ereg_search_getregs' => ['string[]|false'], - 'mb_ereg_search_init' => ['bool', 'string'=>'string', 'pattern='=>'string', 'options='=>'string'], - 'mb_ereg_search_pos' => ['int[]|false', 'pattern='=>'string', 'options='=>'string'], - 'mb_ereg_search_regs' => ['string[]|false', 'pattern='=>'string', 'options='=>'string'], - 'mb_ereg_search_setpos' => ['bool', 'offset'=>'int'], - 'mb_eregi' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_matches='=>'array'], - 'mb_eregi_replace' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'options='=>'string'], - 'mb_get_info' => ['array|string|int|false', 'type='=>'string'], - 'mb_http_input' => ['string|false', 'type='=>'string'], - 'mb_http_output' => ['string|bool', 'encoding='=>'string'], - 'mb_internal_encoding' => ['string|bool', 'encoding='=>'string'], - 'mb_language' => ['string|bool', 'language='=>'string'], - 'mb_list_encodings' => ['list'], - 'mb_output_handler' => ['string', 'string'=>'string', 'status'=>'int'], - 'mb_parse_str' => ['bool', 'string'=>'string', '&w_result='=>'array'], - 'mb_preferred_mime_name' => ['string|false', 'encoding'=>'string'], - 'mb_regex_encoding' => ['string|bool', 'encoding='=>'string'], - 'mb_regex_set_options' => ['string', 'options='=>'string'], - 'mb_send_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array', 'additional_params='=>'string'], - 'mb_split' => ['list|false', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'], - 'mb_strcut' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'], - 'mb_strimwidth' => ['string', 'string'=>'string', 'start'=>'int', 'width'=>'int', 'trim_marker='=>'string', 'encoding='=>'string'], - 'mb_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], - 'mb_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], - 'mb_strlen' => ['0|positive-int', 'string'=>'string', 'encoding='=>'string'], - 'mb_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], - 'mb_strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], - 'mb_strrichr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], - 'mb_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], - 'mb_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], - 'mb_strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool', 'encoding='=>'string'], - 'mb_strtolower' => ['lowercase-string', 'string'=>'string', 'encoding='=>'string'], - 'mb_strtoupper' => ['string', 'string'=>'string', 'encoding='=>'string'], - 'mb_strwidth' => ['int', 'string'=>'string', 'encoding='=>'string'], - 'mb_substitute_character' => ['bool|int|string', 'substitute_character='=>'mixed'], - 'mb_substr' => ['string', 'string'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'], - 'mb_substr_count' => ['int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'], - 'mcrypt_cbc' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], - 'mcrypt_cfb' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], - 'mcrypt_create_iv' => ['string|false', 'size'=>'int', 'source='=>'int'], - 'mcrypt_decrypt' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'string', 'iv='=>'string'], - 'mcrypt_ecb' => ['string', 'cipher'=>'string|int', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], - 'mcrypt_enc_get_algorithms_name' => ['string', 'td'=>'resource'], - 'mcrypt_enc_get_block_size' => ['int', 'td'=>'resource'], - 'mcrypt_enc_get_iv_size' => ['int', 'td'=>'resource'], - 'mcrypt_enc_get_key_size' => ['int', 'td'=>'resource'], - 'mcrypt_enc_get_modes_name' => ['string', 'td'=>'resource'], - 'mcrypt_enc_get_supported_key_sizes' => ['array', 'td'=>'resource'], - 'mcrypt_enc_is_block_algorithm' => ['bool', 'td'=>'resource'], - 'mcrypt_enc_is_block_algorithm_mode' => ['bool', 'td'=>'resource'], - 'mcrypt_enc_is_block_mode' => ['bool', 'td'=>'resource'], - 'mcrypt_enc_self_test' => ['int|false', 'td'=>'resource'], - 'mcrypt_encrypt' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'string', 'iv='=>'string'], - 'mcrypt_generic' => ['string', 'td'=>'resource', 'data'=>'string'], - 'mcrypt_generic_deinit' => ['bool', 'td'=>'resource'], - 'mcrypt_generic_end' => ['bool', 'td'=>'resource'], - 'mcrypt_generic_init' => ['int|false', 'td'=>'resource', 'key'=>'string', 'iv'=>'string'], - 'mcrypt_get_block_size' => ['int', 'cipher'=>'int|string', 'module'=>'string'], - 'mcrypt_get_cipher_name' => ['string|false', 'cipher'=>'int|string'], - 'mcrypt_get_iv_size' => ['int|false', 'cipher'=>'int|string', 'module'=>'string'], - 'mcrypt_get_key_size' => ['int', 'cipher'=>'int|string', 'module'=>'string'], - 'mcrypt_list_algorithms' => ['array', 'lib_dir='=>'string'], - 'mcrypt_list_modes' => ['array', 'lib_dir='=>'string'], - 'mcrypt_module_close' => ['bool', 'td'=>'resource'], - 'mcrypt_module_get_algo_block_size' => ['int', 'algorithm'=>'string', 'lib_dir='=>'string'], - 'mcrypt_module_get_algo_key_size' => ['int', 'algorithm'=>'string', 'lib_dir='=>'string'], - 'mcrypt_module_get_supported_key_sizes' => ['array', 'algorithm'=>'string', 'lib_dir='=>'string'], - 'mcrypt_module_is_block_algorithm' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'], - 'mcrypt_module_is_block_algorithm_mode' => ['bool', 'mode'=>'string', 'lib_dir='=>'string'], - 'mcrypt_module_is_block_mode' => ['bool', 'mode'=>'string', 'lib_dir='=>'string'], - 'mcrypt_module_open' => ['resource|false', 'cipher'=>'string', 'cipher_directory'=>'string', 'mode'=>'string', 'mode_directory'=>'string'], - 'mcrypt_module_self_test' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'], - 'mcrypt_ofb' => ['string', 'cipher'=>'int|string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], - 'md5' => ['string', 'string'=>'string', 'binary='=>'bool'], - 'md5_file' => ['string|false', 'filename'=>'string', 'binary='=>'bool'], - 'mdecrypt_generic' => ['string', 'td'=>'resource', 'data'=>'string'], - 'memcache_add' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], - 'memcache_add_server' => ['bool', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable', 'timeoutms='=>'int'], - 'memcache_append' => ['', 'memcache_obj'=>'Memcache'], - 'memcache_cas' => ['', 'memcache_obj'=>'Memcache'], - 'memcache_close' => ['bool', 'memcache_obj'=>'Memcache'], - 'memcache_connect' => ['Memcache|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], - 'memcache_debug' => ['bool', 'on_off'=>'bool'], - 'memcache_decrement' => ['int', 'memcache_obj'=>'Memcache', 'key'=>'string', 'value='=>'int'], - 'memcache_delete' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'timeout='=>'int'], - 'memcache_flush' => ['bool', 'memcache_obj'=>'Memcache'], - 'memcache_get' => ['string', 'memcache_obj'=>'Memcache', 'key'=>'string', 'flags='=>'int'], - 'memcache_get\'1' => ['array', 'memcache_obj'=>'Memcache', 'key'=>'string[]', 'flags='=>'int[]'], - 'memcache_get_extended_stats' => ['array', 'memcache_obj'=>'Memcache', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], - 'memcache_get_server_status' => ['int', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int'], - 'memcache_get_stats' => ['array', 'memcache_obj'=>'Memcache', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], - 'memcache_get_version' => ['string', 'memcache_obj'=>'Memcache'], - 'memcache_increment' => ['int', 'memcache_obj'=>'Memcache', 'key'=>'string', 'value='=>'int'], - 'memcache_pconnect' => ['Memcache|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], - 'memcache_prepend' => ['string', 'memcache_obj'=>'Memcache'], - 'memcache_replace' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], - 'memcache_set' => ['bool', 'memcache_obj'=>'Memcache', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'], - 'memcache_set_compress_threshold' => ['bool', 'memcache_obj'=>'Memcache', 'threshold'=>'int', 'min_savings='=>'float'], - 'memcache_set_failure_callback' => ['', 'memcache_obj'=>'Memcache'], - 'memcache_set_server_params' => ['bool', 'memcache_obj'=>'Memcache', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable'], - 'memory_get_peak_usage' => ['int', 'real_usage='=>'bool'], - 'memory_get_usage' => ['int', 'real_usage='=>'bool'], - 'metaphone' => ['string|false', 'string'=>'string', 'max_phonemes='=>'int'], - 'method_exists' => ['bool', 'object_or_class'=>'object|class-string|interface-string', 'method'=>'string'], - 'mhash' => ['string', 'algo'=>'int', 'data'=>'string', 'key='=>'string'], - 'mhash_count' => ['int'], - 'mhash_get_block_size' => ['int|false', 'algo'=>'int'], - 'mhash_get_hash_name' => ['string|false', 'algo'=>'int'], - 'mhash_keygen_s2k' => ['string|false', 'algo'=>'int', 'password'=>'string', 'salt'=>'string', 'length'=>'int'], - 'microtime' => ['string', 'as_float='=>'false'], - 'microtime\'1' => ['float', 'as_float='=>'true'], - 'mime_content_type' => ['string|false', 'filename'=>'string|resource'], - 'min' => ['mixed', 'value'=>'non-empty-array'], - 'min\'1' => ['mixed', 'value'=>'', 'values'=>'', '...args='=>''], - 'ming_keypress' => ['int', 'char'=>'string'], - 'ming_setcubicthreshold' => ['void', 'threshold'=>'int'], - 'ming_setscale' => ['void', 'scale'=>'float'], - 'ming_setswfcompression' => ['void', 'level'=>'int'], - 'ming_useconstants' => ['void', 'use'=>'int'], - 'ming_useswfversion' => ['void', 'version'=>'int'], - 'mkdir' => ['bool', 'directory'=>'string', 'permissions='=>'int', 'recursive='=>'bool', 'context='=>'resource'], - 'mktime' => ['int|false', 'hour='=>'int', 'minute='=>'int', 'second='=>'int', 'month='=>'int', 'day='=>'int', 'year='=>'int'], - 'money_format' => ['string', 'format'=>'string', 'value'=>'float'], - 'mongodb\driver\exception\commandexception::getResultDocument' => ['object'], - 'mongodb\driver\exception\runtimeexception::hasErrorLabel' => ['bool', 'errorLabel'=>'string'], - 'mongodb\driver\manager::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], - 'mongodb\driver\manager::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], - 'mongodb\driver\manager::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], - 'mongodb\driver\manager::startSession' => ['MongoDB\Driver\Session', 'options='=>'array'], - 'mongodb\driver\monitoring\commandfailedevent::getCommandName' => ['string'], - 'mongodb\driver\monitoring\commandfailedevent::getDurationMicros' => ['int'], - 'mongodb\driver\monitoring\commandfailedevent::getError' => ['Exception'], - 'mongodb\driver\monitoring\commandfailedevent::getOperationId' => ['string'], - 'mongodb\driver\monitoring\commandfailedevent::getReply' => ['object'], - 'mongodb\driver\monitoring\commandfailedevent::getRequestId' => ['string'], - 'mongodb\driver\monitoring\commandfailedevent::getServer' => ['MongoDB\Driver\Server'], - 'mongodb\driver\monitoring\commandstartedevent::getCommand' => ['object'], - 'mongodb\driver\monitoring\commandstartedevent::getCommandName' => ['string'], - 'mongodb\driver\monitoring\commandstartedevent::getDatabaseName' => ['string'], - 'mongodb\driver\monitoring\commandstartedevent::getOperationId' => ['string'], - 'mongodb\driver\monitoring\commandstartedevent::getRequestId' => ['string'], - 'mongodb\driver\monitoring\commandstartedevent::getServer' => ['MongoDB\Driver\Server'], - 'mongodb\driver\monitoring\commandsubscriber::commandFailed' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandFailedEvent'], - 'mongodb\driver\monitoring\commandsubscriber::commandStarted' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandStartedEvent'], - 'mongodb\driver\monitoring\commandsubscriber::commandSucceeded' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandSucceededEvent'], - 'mongodb\driver\monitoring\commandsucceededevent::getCommandName' => ['string'], - 'mongodb\driver\monitoring\commandsucceededevent::getDurationMicros' => ['int'], - 'mongodb\driver\monitoring\commandsucceededevent::getOperationId' => ['string'], - 'mongodb\driver\monitoring\commandsucceededevent::getReply' => ['object'], - 'mongodb\driver\monitoring\commandsucceededevent::getRequestId' => ['string'], - 'mongodb\driver\monitoring\commandsucceededevent::getServer' => ['MongoDB\Driver\Server'], - 'mongodb\driver\server::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], - 'mongodb\driver\server::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], - 'mongodb\driver\server::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], - 'mongodb\driver\session::__construct' => ['void'], - 'mongodb\driver\session::abortTransaction' => ['void'], - 'mongodb\driver\session::advanceClusterTime' => ['void', 'clusterTime'=>'array|object'], - 'mongodb\driver\session::advanceOperationTime' => ['void', 'operationTime'=>'MongoDB\BSON\TimestampInterface'], - 'mongodb\driver\session::commitTransaction' => ['void'], - 'mongodb\driver\session::endSession' => ['void'], - 'mongodb\driver\session::getClusterTime' => ['?object'], - 'mongodb\driver\session::getLogicalSessionId' => ['object'], - 'mongodb\driver\session::getOperationTime' => ['MongoDB\BSON\Timestamp|null'], - 'mongodb\driver\session::getTransactionOptions' => ['array|null'], - 'mongodb\driver\session::getTransactionState' => ['string'], - 'mongodb\driver\session::startTransaction' => ['void', 'options'=>'array|object'], - 'monitor_custom_event' => ['void', 'class'=>'string', 'text'=>'string', 'severe='=>'int', 'user_data='=>'mixed'], - 'monitor_httperror_event' => ['void', 'error_code'=>'int', 'url'=>'string', 'severe='=>'int'], - 'monitor_license_info' => ['array'], - 'monitor_pass_error' => ['void', 'errno'=>'int', 'errstr'=>'string', 'errfile'=>'string', 'errline'=>'int'], - 'monitor_set_aggregation_hint' => ['void', 'hint'=>'string'], - 'move_uploaded_file' => ['bool', 'from'=>'string', 'to'=>'string'], - 'mqseries_back' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_begin' => ['void', 'hconn'=>'resource', 'beginoptions'=>'array', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_close' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'options'=>'int', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_cmit' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_conn' => ['void', 'qmanagername'=>'string', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_connx' => ['void', 'qmanagername'=>'string', 'connoptions'=>'array', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_disc' => ['void', 'hconn'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_get' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'md'=>'array', 'gmo'=>'array', 'bufferlength'=>'int', 'msg'=>'string', 'data_length'=>'int', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_inq' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'selectorcount'=>'int', 'selectors'=>'array', 'intattrcount'=>'int', 'intattr'=>'resource', 'charattrlength'=>'int', 'charattr'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_open' => ['void', 'hconn'=>'resource', 'objdesc'=>'array', 'option'=>'int', 'hobj'=>'resource', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_put' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'md'=>'array', 'pmo'=>'array', 'message'=>'string', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_put1' => ['void', 'hconn'=>'resource', 'objdesc'=>'resource', 'msgdesc'=>'resource', 'pmo'=>'resource', 'buffer'=>'string', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_set' => ['void', 'hconn'=>'resource', 'hobj'=>'resource', 'selectorcount'=>'int', 'selectors'=>'array', 'intattrcount'=>'int', 'intattrs'=>'array', 'charattrlength'=>'int', 'charattrs'=>'array', 'compcode'=>'resource', 'reason'=>'resource'], - 'mqseries_strerror' => ['string', 'reason'=>'int'], - 'ms_GetErrorObj' => ['errorObj'], - 'ms_GetVersion' => ['string'], - 'ms_GetVersionInt' => ['int'], - 'ms_ResetErrorList' => ['void'], - 'ms_TokenizeMap' => ['array', 'map_file_name'=>'string'], - 'ms_iogetStdoutBufferBytes' => ['int'], - 'ms_iogetstdoutbufferstring' => ['void'], - 'ms_ioinstallstdinfrombuffer' => ['void'], - 'ms_ioinstallstdouttobuffer' => ['void'], - 'ms_ioresethandlers' => ['void'], - 'ms_iostripstdoutbuffercontentheaders' => ['void'], - 'ms_iostripstdoutbuffercontenttype' => ['string'], - 'msession_connect' => ['bool', 'host'=>'string', 'port'=>'string'], - 'msession_count' => ['int'], - 'msession_create' => ['bool', 'session'=>'string', 'classname='=>'string', 'data='=>'string'], - 'msession_destroy' => ['bool', 'name'=>'string'], - 'msession_disconnect' => ['void'], - 'msession_find' => ['array', 'name'=>'string', 'value'=>'string'], - 'msession_get' => ['string', 'session'=>'string', 'name'=>'string', 'value'=>'string'], - 'msession_get_array' => ['array', 'session'=>'string'], - 'msession_get_data' => ['string', 'session'=>'string'], - 'msession_inc' => ['string', 'session'=>'string', 'name'=>'string'], - 'msession_list' => ['array'], - 'msession_listvar' => ['array', 'name'=>'string'], - 'msession_lock' => ['int', 'name'=>'string'], - 'msession_plugin' => ['string', 'session'=>'string', 'value'=>'string', 'param='=>'string'], - 'msession_randstr' => ['string', 'param'=>'int'], - 'msession_set' => ['bool', 'session'=>'string', 'name'=>'string', 'value'=>'string'], - 'msession_set_array' => ['void', 'session'=>'string', 'tuples'=>'array'], - 'msession_set_data' => ['bool', 'session'=>'string', 'value'=>'string'], - 'msession_timeout' => ['int', 'session'=>'string', 'param='=>'int'], - 'msession_uniq' => ['string', 'param'=>'int', 'classname='=>'string', 'data='=>'string'], - 'msession_unlock' => ['int', 'session'=>'string', 'key'=>'int'], - 'msg_get_queue' => ['resource', 'key'=>'int', 'permissions='=>'int'], - 'msg_queue_exists' => ['bool', 'key'=>'int'], - 'msg_receive' => ['bool', 'queue'=>'resource', 'desired_message_type'=>'int', '&w_received_message_type'=>'int', 'max_message_size'=>'int', '&w_message'=>'mixed', 'unserialize='=>'bool', 'flags='=>'int', '&w_error_code='=>'int'], - 'msg_remove_queue' => ['bool', 'queue'=>'resource'], - 'msg_send' => ['bool', 'queue'=>'resource', 'message_type'=>'int', 'message'=>'mixed', 'serialize='=>'bool', 'blocking='=>'bool', '&w_error_code='=>'int'], - 'msg_set_queue' => ['bool', 'queue'=>'resource', 'data'=>'array'], - 'msg_stat_queue' => ['array', 'queue'=>'resource'], - 'msgfmt_create' => ['?MessageFormatter', 'locale'=>'string', 'pattern'=>'string'], - 'msgfmt_format' => ['string|false', 'formatter'=>'MessageFormatter', 'values'=>'array'], - 'msgfmt_format_message' => ['string|false', 'locale'=>'string', 'pattern'=>'string', 'values'=>'array'], - 'msgfmt_get_error_code' => ['int', 'formatter'=>'MessageFormatter'], - 'msgfmt_get_error_message' => ['string', 'formatter'=>'MessageFormatter'], - 'msgfmt_get_locale' => ['string', 'formatter'=>'MessageFormatter'], - 'msgfmt_get_pattern' => ['string', 'formatter'=>'MessageFormatter'], - 'msgfmt_parse' => ['array|false', 'formatter'=>'MessageFormatter', 'string'=>'string'], - 'msgfmt_parse_message' => ['array|false', 'locale'=>'string', 'pattern'=>'string', 'message'=>'string'], - 'msgfmt_set_pattern' => ['bool', 'formatter'=>'MessageFormatter', 'pattern'=>'string'], - 'msql_affected_rows' => ['int', 'result'=>'resource'], - 'msql_close' => ['bool', 'link_identifier='=>'?resource'], - 'msql_connect' => ['resource', 'hostname='=>'string'], - 'msql_create_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], - 'msql_data_seek' => ['bool', 'result'=>'resource', 'row_number'=>'int'], - 'msql_db_query' => ['resource', 'database'=>'string', 'query'=>'string', 'link_identifier='=>'?resource'], - 'msql_drop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], - 'msql_error' => ['string'], - 'msql_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], - 'msql_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], - 'msql_fetch_object' => ['object', 'result'=>'resource'], - 'msql_fetch_row' => ['array', 'result'=>'resource'], - 'msql_field_flags' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'msql_field_len' => ['int', 'result'=>'resource', 'field_offset'=>'int'], - 'msql_field_name' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'msql_field_seek' => ['bool', 'result'=>'resource', 'field_offset'=>'int'], - 'msql_field_table' => ['int', 'result'=>'resource', 'field_offset'=>'int'], - 'msql_field_type' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'msql_free_result' => ['bool', 'result'=>'resource'], - 'msql_list_dbs' => ['resource', 'link_identifier='=>'?resource'], - 'msql_list_fields' => ['resource', 'database'=>'string', 'tablename'=>'string', 'link_identifier='=>'?resource'], - 'msql_list_tables' => ['resource', 'database'=>'string', 'link_identifier='=>'?resource'], - 'msql_num_fields' => ['int', 'result'=>'resource'], - 'msql_num_rows' => ['int', 'query_identifier'=>'resource'], - 'msql_pconnect' => ['resource', 'hostname='=>'string'], - 'msql_query' => ['resource', 'query'=>'string', 'link_identifier='=>'?resource'], - 'msql_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field='=>'mixed'], - 'msql_select_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'?resource'], - 'mt_getrandmax' => ['int'], - 'mt_rand' => ['int', 'min'=>'int', 'max'=>'int'], - 'mt_rand\'1' => ['int'], - 'mt_srand' => ['void', 'seed='=>'int', 'mode='=>'int'], - 'mysql_xdevapi\baseresult::getWarnings' => ['array'], - 'mysql_xdevapi\baseresult::getWarningsCount' => ['integer'], - 'mysql_xdevapi\collection::add' => ['mysql_xdevapi\CollectionAdd', 'document'=>'mixed'], - 'mysql_xdevapi\collection::addOrReplaceOne' => ['mysql_xdevapi\Result', 'id'=>'string', 'doc'=>'string'], - 'mysql_xdevapi\collection::count' => ['integer'], - 'mysql_xdevapi\collection::createIndex' => ['void', 'index_name'=>'string', 'index_desc_json'=>'string'], - 'mysql_xdevapi\collection::dropIndex' => ['bool', 'index_name'=>'string'], - 'mysql_xdevapi\collection::existsInDatabase' => ['bool'], - 'mysql_xdevapi\collection::find' => ['mysql_xdevapi\CollectionFind', 'search_condition='=>'string'], - 'mysql_xdevapi\collection::getName' => ['string'], - 'mysql_xdevapi\collection::getOne' => ['Document', 'id'=>'string'], - 'mysql_xdevapi\collection::getSchema' => ['mysql_xdevapi\schema'], - 'mysql_xdevapi\collection::getSession' => ['Session'], - 'mysql_xdevapi\collection::modify' => ['mysql_xdevapi\CollectionModify', 'search_condition'=>'string'], - 'mysql_xdevapi\collection::remove' => ['mysql_xdevapi\CollectionRemove', 'search_condition'=>'string'], - 'mysql_xdevapi\collection::removeOne' => ['mysql_xdevapi\Result', 'id'=>'string'], - 'mysql_xdevapi\collection::replaceOne' => ['mysql_xdevapi\Result', 'id'=>'string', 'doc'=>'string'], - 'mysql_xdevapi\collectionadd::execute' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\collectionfind::bind' => ['mysql_xdevapi\CollectionFind', 'placeholder_values'=>'array'], - 'mysql_xdevapi\collectionfind::execute' => ['mysql_xdevapi\DocResult'], - 'mysql_xdevapi\collectionfind::fields' => ['mysql_xdevapi\CollectionFind', 'projection'=>'string'], - 'mysql_xdevapi\collectionfind::groupBy' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], - 'mysql_xdevapi\collectionfind::having' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], - 'mysql_xdevapi\collectionfind::limit' => ['mysql_xdevapi\CollectionFind', 'rows'=>'integer'], - 'mysql_xdevapi\collectionfind::lockExclusive' => ['mysql_xdevapi\CollectionFind', 'lock_waiting_option='=>'integer'], - 'mysql_xdevapi\collectionfind::lockShared' => ['mysql_xdevapi\CollectionFind', 'lock_waiting_option='=>'integer'], - 'mysql_xdevapi\collectionfind::offset' => ['mysql_xdevapi\CollectionFind', 'position'=>'integer'], - 'mysql_xdevapi\collectionfind::sort' => ['mysql_xdevapi\CollectionFind', 'sort_expr'=>'string'], - 'mysql_xdevapi\collectionmodify::arrayAppend' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], - 'mysql_xdevapi\collectionmodify::arrayInsert' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], - 'mysql_xdevapi\collectionmodify::bind' => ['mysql_xdevapi\CollectionModify', 'placeholder_values'=>'array'], - 'mysql_xdevapi\collectionmodify::execute' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\collectionmodify::limit' => ['mysql_xdevapi\CollectionModify', 'rows'=>'integer'], - 'mysql_xdevapi\collectionmodify::patch' => ['mysql_xdevapi\CollectionModify', 'document'=>'string'], - 'mysql_xdevapi\collectionmodify::replace' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], - 'mysql_xdevapi\collectionmodify::set' => ['mysql_xdevapi\CollectionModify', 'collection_field'=>'string', 'expression_or_literal'=>'string'], - 'mysql_xdevapi\collectionmodify::skip' => ['mysql_xdevapi\CollectionModify', 'position'=>'integer'], - 'mysql_xdevapi\collectionmodify::sort' => ['mysql_xdevapi\CollectionModify', 'sort_expr'=>'string'], - 'mysql_xdevapi\collectionmodify::unset' => ['mysql_xdevapi\CollectionModify', 'fields'=>'array'], - 'mysql_xdevapi\collectionremove::bind' => ['mysql_xdevapi\CollectionRemove', 'placeholder_values'=>'array'], - 'mysql_xdevapi\collectionremove::execute' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\collectionremove::limit' => ['mysql_xdevapi\CollectionRemove', 'rows'=>'integer'], - 'mysql_xdevapi\collectionremove::sort' => ['mysql_xdevapi\CollectionRemove', 'sort_expr'=>'string'], - 'mysql_xdevapi\columnresult::getCharacterSetName' => ['string'], - 'mysql_xdevapi\columnresult::getCollationName' => ['string'], - 'mysql_xdevapi\columnresult::getColumnLabel' => ['string'], - 'mysql_xdevapi\columnresult::getColumnName' => ['string'], - 'mysql_xdevapi\columnresult::getFractionalDigits' => ['integer'], - 'mysql_xdevapi\columnresult::getLength' => ['integer'], - 'mysql_xdevapi\columnresult::getSchemaName' => ['string'], - 'mysql_xdevapi\columnresult::getTableLabel' => ['string'], - 'mysql_xdevapi\columnresult::getTableName' => ['string'], - 'mysql_xdevapi\columnresult::getType' => ['integer'], - 'mysql_xdevapi\columnresult::isNumberSigned' => ['integer'], - 'mysql_xdevapi\columnresult::isPadded' => ['integer'], - 'mysql_xdevapi\crudoperationbindable::bind' => ['mysql_xdevapi\CrudOperationBindable', 'placeholder_values'=>'array'], - 'mysql_xdevapi\crudoperationlimitable::limit' => ['mysql_xdevapi\CrudOperationLimitable', 'rows'=>'integer'], - 'mysql_xdevapi\crudoperationskippable::skip' => ['mysql_xdevapi\CrudOperationSkippable', 'skip'=>'integer'], - 'mysql_xdevapi\crudoperationsortable::sort' => ['mysql_xdevapi\CrudOperationSortable', 'sort_expr'=>'string'], - 'mysql_xdevapi\databaseobject::existsInDatabase' => ['bool'], - 'mysql_xdevapi\databaseobject::getName' => ['string'], - 'mysql_xdevapi\databaseobject::getSession' => ['mysql_xdevapi\Session'], - 'mysql_xdevapi\docresult::fetchAll' => ['Array'], - 'mysql_xdevapi\docresult::fetchOne' => ['Object'], - 'mysql_xdevapi\docresult::getWarnings' => ['Array'], - 'mysql_xdevapi\docresult::getWarningsCount' => ['integer'], - 'mysql_xdevapi\executable::execute' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\getsession' => ['mysql_xdevapi\Session', 'uri'=>'string'], - 'mysql_xdevapi\result::getAutoIncrementValue' => ['int'], - 'mysql_xdevapi\result::getGeneratedIds' => ['ArrayOfInt'], - 'mysql_xdevapi\result::getWarnings' => ['array'], - 'mysql_xdevapi\result::getWarningsCount' => ['integer'], - 'mysql_xdevapi\rowresult::fetchAll' => ['array'], - 'mysql_xdevapi\rowresult::fetchOne' => ['object'], - 'mysql_xdevapi\rowresult::getColumnCount' => ['integer'], - 'mysql_xdevapi\rowresult::getColumnNames' => ['array'], - 'mysql_xdevapi\rowresult::getColumns' => ['array'], - 'mysql_xdevapi\rowresult::getWarnings' => ['array'], - 'mysql_xdevapi\rowresult::getWarningsCount' => ['integer'], - 'mysql_xdevapi\schema::createCollection' => ['mysql_xdevapi\Collection', 'name'=>'string'], - 'mysql_xdevapi\schema::dropCollection' => ['bool', 'collection_name'=>'string'], - 'mysql_xdevapi\schema::existsInDatabase' => ['bool'], - 'mysql_xdevapi\schema::getCollection' => ['mysql_xdevapi\Collection', 'name'=>'string'], - 'mysql_xdevapi\schema::getCollectionAsTable' => ['mysql_xdevapi\Table', 'name'=>'string'], - 'mysql_xdevapi\schema::getCollections' => ['array'], - 'mysql_xdevapi\schema::getName' => ['string'], - 'mysql_xdevapi\schema::getSession' => ['mysql_xdevapi\Session'], - 'mysql_xdevapi\schema::getTable' => ['mysql_xdevapi\Table', 'name'=>'string'], - 'mysql_xdevapi\schema::getTables' => ['array'], - 'mysql_xdevapi\schemaobject::getSchema' => ['mysql_xdevapi\Schema'], - 'mysql_xdevapi\session::close' => ['bool'], - 'mysql_xdevapi\session::commit' => ['Object'], - 'mysql_xdevapi\session::createSchema' => ['mysql_xdevapi\Schema', 'schema_name'=>'string'], - 'mysql_xdevapi\session::dropSchema' => ['bool', 'schema_name'=>'string'], - 'mysql_xdevapi\session::executeSql' => ['Object', 'statement'=>'string'], - 'mysql_xdevapi\session::generateUUID' => ['string'], - 'mysql_xdevapi\session::getClientId' => ['integer'], - 'mysql_xdevapi\session::getSchema' => ['mysql_xdevapi\Schema', 'schema_name'=>'string'], - 'mysql_xdevapi\session::getSchemas' => ['array'], - 'mysql_xdevapi\session::getServerVersion' => ['integer'], - 'mysql_xdevapi\session::killClient' => ['object', 'client_id'=>'integer'], - 'mysql_xdevapi\session::listClients' => ['array'], - 'mysql_xdevapi\session::quoteName' => ['string', 'name'=>'string'], - 'mysql_xdevapi\session::releaseSavepoint' => ['void', 'name'=>'string'], - 'mysql_xdevapi\session::rollback' => ['void'], - 'mysql_xdevapi\session::rollbackTo' => ['void', 'name'=>'string'], - 'mysql_xdevapi\session::setSavepoint' => ['string', 'name='=>'string'], - 'mysql_xdevapi\session::sql' => ['mysql_xdevapi\SqlStatement', 'query'=>'string'], - 'mysql_xdevapi\session::startTransaction' => ['void'], - 'mysql_xdevapi\sqlstatement::bind' => ['mysql_xdevapi\SqlStatement', 'param'=>'string'], - 'mysql_xdevapi\sqlstatement::execute' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\sqlstatement::getNextResult' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\sqlstatement::getResult' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\sqlstatement::hasMoreResults' => ['bool'], - 'mysql_xdevapi\sqlstatementresult::fetchAll' => ['array'], - 'mysql_xdevapi\sqlstatementresult::fetchOne' => ['object'], - 'mysql_xdevapi\sqlstatementresult::getAffectedItemsCount' => ['integer'], - 'mysql_xdevapi\sqlstatementresult::getColumnCount' => ['integer'], - 'mysql_xdevapi\sqlstatementresult::getColumnNames' => ['array'], - 'mysql_xdevapi\sqlstatementresult::getColumns' => ['Array'], - 'mysql_xdevapi\sqlstatementresult::getGeneratedIds' => ['array'], - 'mysql_xdevapi\sqlstatementresult::getLastInsertId' => ['String'], - 'mysql_xdevapi\sqlstatementresult::getWarnings' => ['array'], - 'mysql_xdevapi\sqlstatementresult::getWarningsCount' => ['integer'], - 'mysql_xdevapi\sqlstatementresult::hasData' => ['bool'], - 'mysql_xdevapi\sqlstatementresult::nextResult' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\statement::getNextResult' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\statement::getResult' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\statement::hasMoreResults' => ['bool'], - 'mysql_xdevapi\table::count' => ['integer'], - 'mysql_xdevapi\table::delete' => ['mysql_xdevapi\TableDelete'], - 'mysql_xdevapi\table::existsInDatabase' => ['bool'], - 'mysql_xdevapi\table::getName' => ['string'], - 'mysql_xdevapi\table::getSchema' => ['mysql_xdevapi\Schema'], - 'mysql_xdevapi\table::getSession' => ['mysql_xdevapi\Session'], - 'mysql_xdevapi\table::insert' => ['mysql_xdevapi\TableInsert', 'columns'=>'mixed', '...args='=>'mixed'], - 'mysql_xdevapi\table::isView' => ['bool'], - 'mysql_xdevapi\table::select' => ['mysql_xdevapi\TableSelect', 'columns'=>'mixed', '...args='=>'mixed'], - 'mysql_xdevapi\table::update' => ['mysql_xdevapi\TableUpdate'], - 'mysql_xdevapi\tabledelete::bind' => ['mysql_xdevapi\TableDelete', 'placeholder_values'=>'array'], - 'mysql_xdevapi\tabledelete::execute' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\tabledelete::limit' => ['mysql_xdevapi\TableDelete', 'rows'=>'integer'], - 'mysql_xdevapi\tabledelete::offset' => ['mysql_xdevapi\TableDelete', 'position'=>'integer'], - 'mysql_xdevapi\tabledelete::orderby' => ['mysql_xdevapi\TableDelete', 'orderby_expr'=>'string'], - 'mysql_xdevapi\tabledelete::where' => ['mysql_xdevapi\TableDelete', 'where_expr'=>'string'], - 'mysql_xdevapi\tableinsert::execute' => ['mysql_xdevapi\Result'], - 'mysql_xdevapi\tableinsert::values' => ['mysql_xdevapi\TableInsert', 'row_values'=>'array'], - 'mysql_xdevapi\tableselect::bind' => ['mysql_xdevapi\TableSelect', 'placeholder_values'=>'array'], - 'mysql_xdevapi\tableselect::execute' => ['mysql_xdevapi\RowResult'], - 'mysql_xdevapi\tableselect::groupBy' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'mixed'], - 'mysql_xdevapi\tableselect::having' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'string'], - 'mysql_xdevapi\tableselect::limit' => ['mysql_xdevapi\TableSelect', 'rows'=>'integer'], - 'mysql_xdevapi\tableselect::lockExclusive' => ['mysql_xdevapi\TableSelect', 'lock_waiting_option='=>'integer'], - 'mysql_xdevapi\tableselect::lockShared' => ['mysql_xdevapi\TableSelect', 'lock_waiting_option='=>'integer'], - 'mysql_xdevapi\tableselect::offset' => ['mysql_xdevapi\TableSelect', 'position'=>'integer'], - 'mysql_xdevapi\tableselect::orderby' => ['mysql_xdevapi\TableSelect', 'sort_expr'=>'mixed', '...args='=>'mixed'], - 'mysql_xdevapi\tableselect::where' => ['mysql_xdevapi\TableSelect', 'where_expr'=>'string'], - 'mysql_xdevapi\tableupdate::bind' => ['mysql_xdevapi\TableUpdate', 'placeholder_values'=>'array'], - 'mysql_xdevapi\tableupdate::execute' => ['mysql_xdevapi\TableUpdate'], - 'mysql_xdevapi\tableupdate::limit' => ['mysql_xdevapi\TableUpdate', 'rows'=>'integer'], - 'mysql_xdevapi\tableupdate::orderby' => ['mysql_xdevapi\TableUpdate', 'orderby_expr'=>'mixed', '...args='=>'mixed'], - 'mysql_xdevapi\tableupdate::set' => ['mysql_xdevapi\TableUpdate', 'table_field'=>'string', 'expression_or_literal'=>'string'], - 'mysql_xdevapi\tableupdate::where' => ['mysql_xdevapi\TableUpdate', 'where_expr'=>'string'], - 'mysqli::__construct' => ['void', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], - 'mysqli::autocommit' => ['bool', 'enable'=>'bool'], - 'mysqli::begin_transaction' => ['bool', 'flags='=>'int', 'name='=>'string'], - 'mysqli::change_user' => ['bool', 'username'=>'string', 'password'=>'string', 'database'=>'?string'], - 'mysqli::character_set_name' => ['string'], - 'mysqli::close' => ['bool'], - 'mysqli::commit' => ['bool', 'flags='=>'int', 'name='=>'string'], - 'mysqli::connect' => ['null|false', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], - 'mysqli::debug' => ['bool', 'options'=>'string'], - 'mysqli::disable_reads_from_master' => ['bool'], - 'mysqli::dump_debug_info' => ['bool'], - 'mysqli::escape_string' => ['string', 'string'=>'string'], - 'mysqli::get_charset' => ['object'], - 'mysqli::get_client_info' => ['string'], - 'mysqli::get_connection_stats' => ['array'], - 'mysqli::get_warnings' => ['mysqli_warning'], - 'mysqli::init' => ['false|null'], - 'mysqli::kill' => ['bool', 'process_id'=>'int'], - 'mysqli::more_results' => ['bool'], - 'mysqli::multi_query' => ['bool', 'query'=>'string'], - 'mysqli::next_result' => ['bool'], - 'mysqli::options' => ['bool', 'option'=>'int', 'value'=>'string|int'], - 'mysqli::ping' => ['bool'], - 'mysqli::poll' => ['int|false', '&w_read'=>'array', '&w_write'=>'array', '&w_error'=>'array', 'seconds'=>'int', 'microseconds='=>'int'], - 'mysqli::prepare' => ['mysqli_stmt|false', 'query'=>'string'], - 'mysqli::query' => ['bool|mysqli_result', 'query'=>'string', 'result_mode='=>'int'], - 'mysqli::real_connect' => ['bool', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null', 'flags='=>'int'], - 'mysqli::real_escape_string' => ['string', 'string'=>'string'], - 'mysqli::real_query' => ['bool', 'query'=>'string'], - 'mysqli::reap_async_query' => ['mysqli_result|false'], - 'mysqli::refresh' => ['bool', 'flags'=>'int'], - 'mysqli::release_savepoint' => ['bool', 'name'=>'string'], - 'mysqli::rollback' => ['bool', 'flags='=>'int', 'name='=>'string'], - 'mysqli::rpl_query_type' => ['int', 'query'=>'string'], - 'mysqli::savepoint' => ['bool', 'name'=>'string'], - 'mysqli::select_db' => ['bool', 'database'=>'string'], - 'mysqli::send_query' => ['bool', 'query'=>'string'], - 'mysqli::set_charset' => ['bool', 'charset'=>'string'], - 'mysqli::set_local_infile_default' => ['void'], - 'mysqli::set_local_infile_handler' => ['bool', 'read_func='=>'callable'], - 'mysqli::set_opt' => ['bool', 'option'=>'int', 'value'=>'string|int'], - 'mysqli::ssl_set' => ['bool', 'key'=>'?string', 'certificate'=>'?string', 'ca_certificate'=>'?string', 'ca_path'=>'?string', 'cipher_algos'=>'?string'], - 'mysqli::stat' => ['string|false'], - 'mysqli::stmt_init' => ['mysqli_stmt'], - 'mysqli::store_result' => ['mysqli_result|false', 'mode='=>'int'], - 'mysqli::thread_safe' => ['bool'], - 'mysqli::use_result' => ['mysqli_result|false'], - 'mysqli_affected_rows' => ['int', 'mysql'=>'mysqli'], - 'mysqli_autocommit' => ['bool', 'mysql'=>'mysqli', 'enable'=>'bool'], - 'mysqli_begin_transaction' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], - 'mysqli_change_user' => ['bool', 'mysql'=>'mysqli', 'username'=>'string', 'password'=>'string', 'database'=>'?string'], - 'mysqli_character_set_name' => ['string', 'mysql'=>'mysqli'], - 'mysqli_close' => ['bool', 'mysql'=>'mysqli'], - 'mysqli_commit' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], - 'mysqli_connect' => ['mysqli|false', 'hostname='=>'string', 'username='=>'string', 'password='=>'string', 'database='=>'string', 'port='=>'int', 'socket='=>'string'], - 'mysqli_connect_errno' => ['int'], - 'mysqli_connect_error' => ['?string'], - 'mysqli_data_seek' => ['bool', 'result'=>'mysqli_result', 'offset'=>'int'], - 'mysqli_debug' => ['bool', 'options'=>'string'], - 'mysqli_disable_reads_from_master' => ['bool', 'link'=>'mysqli'], - 'mysqli_disable_rpl_parse' => ['bool', 'link'=>'mysqli'], - 'mysqli_driver::embedded_server_end' => ['void'], - 'mysqli_driver::embedded_server_start' => ['bool', 'start'=>'int', 'arguments'=>'array', 'groups'=>'array'], - 'mysqli_dump_debug_info' => ['bool', 'mysql'=>'mysqli'], - 'mysqli_embedded_server_end' => ['void'], - 'mysqli_embedded_server_start' => ['bool', 'start'=>'int', 'arguments'=>'array', 'groups'=>'array'], - 'mysqli_enable_reads_from_master' => ['bool', 'link'=>'mysqli'], - 'mysqli_enable_rpl_parse' => ['bool', 'link'=>'mysqli'], - 'mysqli_errno' => ['int', 'mysql'=>'mysqli'], - 'mysqli_error' => ['string', 'mysql'=>'mysqli'], - 'mysqli_error_list' => ['array', 'mysql'=>'mysqli'], - 'mysqli_escape_string' => ['string', 'mysql'=>'mysqli', 'string'=>'string'], - 'mysqli_execute' => ['bool', 'statement'=>'mysqli_stmt'], - 'mysqli_fetch_all' => ['list>', 'result'=>'mysqli_result', 'mode='=>'3'], - 'mysqli_fetch_all\'1' => ['list>', 'result'=>'mysqli_result', 'mode='=>'1'], - 'mysqli_fetch_all\'2' => ['list>', 'result'=>'mysqli_result', 'mode='=>'2'], - 'mysqli_fetch_array' => ['array|false|null', 'result'=>'mysqli_result', 'mode='=>'3'], - 'mysqli_fetch_array\'1' => ['array|false|null', 'result'=>'mysqli_result', 'mode='=>'1'], - 'mysqli_fetch_array\'2' => ['list|false|null', 'result'=>'mysqli_result', 'mode='=>'2'], - 'mysqli_fetch_assoc' => ['array|false|null', 'result'=>'mysqli_result'], - 'mysqli_fetch_field' => ['object|false', 'result'=>'mysqli_result'], - '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_row' => ['list|false|null', 'result'=>'mysqli_result'], - 'mysqli_field_count' => ['int', 'mysql'=>'mysqli'], - 'mysqli_field_seek' => ['bool', 'result'=>'mysqli_result', 'index'=>'int'], - 'mysqli_field_tell' => ['int', 'result'=>'mysqli_result'], - 'mysqli_free_result' => ['void', 'result'=>'mysqli_result'], - 'mysqli_get_cache_stats' => ['array|false'], - 'mysqli_get_charset' => ['?object', 'mysql'=>'mysqli'], - 'mysqli_get_client_info' => ['string', 'mysql='=>'?mysqli'], - 'mysqli_get_client_stats' => ['array'], - 'mysqli_get_client_version' => ['int', 'link'=>'mysqli'], - 'mysqli_get_connection_stats' => ['array', 'mysql'=>'mysqli'], - 'mysqli_get_host_info' => ['string', 'mysql'=>'mysqli'], - 'mysqli_get_links_stats' => ['array'], - 'mysqli_get_proto_info' => ['int', 'mysql'=>'mysqli'], - 'mysqli_get_server_info' => ['string', 'mysql'=>'mysqli'], - 'mysqli_get_server_version' => ['int', 'mysql'=>'mysqli'], - 'mysqli_get_warnings' => ['mysqli_warning', 'mysql'=>'mysqli'], - 'mysqli_info' => ['?string', 'mysql'=>'mysqli'], - 'mysqli_init' => ['mysqli|false'], - 'mysqli_insert_id' => ['int|string', 'mysql'=>'mysqli'], - 'mysqli_kill' => ['bool', 'mysql'=>'mysqli', 'process_id'=>'int'], - 'mysqli_link_construct' => ['object'], - 'mysqli_master_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], - 'mysqli_more_results' => ['bool', 'mysql'=>'mysqli'], - 'mysqli_multi_query' => ['bool', 'mysql'=>'mysqli', 'query'=>'string'], - 'mysqli_next_result' => ['bool', 'mysql'=>'mysqli'], - 'mysqli_num_fields' => ['int', 'result'=>'mysqli_result'], - 'mysqli_num_rows' => ['int', 'result'=>'mysqli_result'], - 'mysqli_options' => ['bool', 'mysql'=>'mysqli', 'option'=>'int', 'value'=>'string|int'], - 'mysqli_ping' => ['bool', 'mysql'=>'mysqli'], - 'mysqli_poll' => ['int|false', 'read'=>'array', 'write'=>'array', 'error'=>'array', 'seconds'=>'int', 'microseconds='=>'int'], - 'mysqli_prepare' => ['mysqli_stmt|false', 'mysql'=>'mysqli', 'query'=>'string'], - 'mysqli_query' => ['mysqli_result|bool', 'mysql'=>'mysqli', 'query'=>'string', 'result_mode='=>'int'], - 'mysqli_real_connect' => ['bool', 'mysql='=>'mysqli', 'hostname='=>'string|null', 'username='=>'string|null', 'password='=>'string|null', 'database='=>'string|null', 'port='=>'int|null', 'socket='=>'string|null', 'flags='=>'int'], - 'mysqli_real_escape_string' => ['string', 'mysql'=>'mysqli', 'string'=>'string'], - 'mysqli_real_query' => ['bool', 'mysql'=>'mysqli', 'query'=>'string'], - 'mysqli_reap_async_query' => ['mysqli_result|false', 'mysql'=>'mysqli'], - 'mysqli_refresh' => ['bool', 'mysql'=>'mysqli', 'flags'=>'int'], - 'mysqli_release_savepoint' => ['bool', 'mysql'=>'mysqli', 'name'=>'string'], - 'mysqli_report' => ['bool', 'flags'=>'int'], - 'mysqli_result::__construct' => ['void', 'mysql'=>'mysqli', 'result_mode='=>'int'], - 'mysqli_result::close' => ['void'], - 'mysqli_result::data_seek' => ['bool', 'offset'=>'int'], - 'mysqli_result::fetch_all' => ['list>', 'mode='=>'3'], - 'mysqli_result::fetch_all\'1' => ['list>', 'mode='=>'1'], - 'mysqli_result::fetch_all\'2' => ['list>', 'mode='=>'2'], - 'mysqli_result::fetch_array' => ['array|false|null', 'mode='=>'3'], - 'mysqli_result::fetch_array\'1' => ['array|false|null', 'mode='=>'1'], - 'mysqli_result::fetch_array\'2' => ['list|false|null', 'mode='=>'2'], - 'mysqli_result::fetch_assoc' => ['array|false|null'], - '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_row' => ['list|false|null'], - 'mysqli_result::field_seek' => ['bool', 'index'=>'int'], - 'mysqli_result::free' => ['void'], - 'mysqli_result::free_result' => ['void'], - 'mysqli_rollback' => ['bool', 'mysql'=>'mysqli', 'flags='=>'int', 'name='=>'string'], - 'mysqli_rpl_parse_enabled' => ['int', 'link'=>'mysqli'], - 'mysqli_rpl_probe' => ['bool', 'link'=>'mysqli'], - 'mysqli_rpl_query_type' => ['int', 'link'=>'mysqli', 'query'=>'string'], - 'mysqli_savepoint' => ['bool', 'mysql'=>'mysqli', 'name'=>'string'], - 'mysqli_savepoint_libmysql' => ['bool'], - 'mysqli_select_db' => ['bool', 'mysql'=>'mysqli', 'database'=>'string'], - 'mysqli_send_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], - 'mysqli_set_charset' => ['bool', 'mysql'=>'mysqli', 'charset'=>'string'], - 'mysqli_set_local_infile_default' => ['void', 'link'=>'mysqli'], - 'mysqli_set_local_infile_handler' => ['bool', 'link'=>'mysqli', 'read_func'=>'callable'], - 'mysqli_set_opt' => ['bool', 'mysql'=>'mysqli', 'option'=>'int', 'value'=>'string|int'], - 'mysqli_slave_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], - 'mysqli_sqlstate' => ['string', 'mysql'=>'mysqli'], - 'mysqli_ssl_set' => ['bool', 'mysql'=>'mysqli', 'key'=>'?string', 'certificate'=>'?string', 'ca_certificate'=>'?string', 'ca_path'=>'?string', 'cipher_algos'=>'?string'], - 'mysqli_stat' => ['string|false', 'mysql'=>'mysqli'], - 'mysqli_stmt::__construct' => ['void', 'mysql'=>'mysqli', 'query'=>'string'], - 'mysqli_stmt::attr_get' => ['int', 'attribute'=>'int'], - 'mysqli_stmt::attr_set' => ['bool', 'attribute'=>'int', 'value'=>'int'], - 'mysqli_stmt::bind_param' => ['bool', 'types'=>'string', '&vars'=>'mixed', '&...args='=>'mixed'], - 'mysqli_stmt::bind_result' => ['bool', '&w_var1'=>'', '&...w_vars='=>''], - 'mysqli_stmt::close' => ['bool'], - 'mysqli_stmt::data_seek' => ['void', 'offset'=>'int'], - 'mysqli_stmt::execute' => ['bool'], - 'mysqli_stmt::fetch' => ['bool|null'], - 'mysqli_stmt::free_result' => ['void'], - 'mysqli_stmt::get_result' => ['mysqli_result|false'], - 'mysqli_stmt::get_warnings' => ['object'], - 'mysqli_stmt::more_results' => ['bool'], - 'mysqli_stmt::next_result' => ['bool'], - 'mysqli_stmt::num_rows' => ['int'], - 'mysqli_stmt::prepare' => ['bool', 'query'=>'string'], - 'mysqli_stmt::reset' => ['bool'], - 'mysqli_stmt::result_metadata' => ['mysqli_result|false'], - 'mysqli_stmt::send_long_data' => ['bool', 'param_num'=>'int', 'data'=>'string'], - 'mysqli_stmt::store_result' => ['bool'], - 'mysqli_stmt_affected_rows' => ['int|string', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_attr_get' => ['int', 'statement'=>'mysqli_stmt', 'attribute'=>'int'], - 'mysqli_stmt_attr_set' => ['bool', 'statement'=>'mysqli_stmt', 'attribute'=>'int', 'value'=>'int'], - 'mysqli_stmt_bind_param' => ['bool', 'statement'=>'mysqli_stmt', 'types'=>'string', '&vars'=>'mixed', '&...args='=>'mixed'], - 'mysqli_stmt_bind_result' => ['bool', 'statement'=>'mysqli_stmt', '&w_var1'=>'', '&...w_vars='=>''], - 'mysqli_stmt_close' => ['bool', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_data_seek' => ['void', 'statement'=>'mysqli_stmt', 'offset'=>'int'], - 'mysqli_stmt_errno' => ['int', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_error' => ['string', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_error_list' => ['array', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_execute' => ['bool', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_fetch' => ['bool|null', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_field_count' => ['int', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_free_result' => ['void', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_get_result' => ['mysqli_result|false', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_get_warnings' => ['object', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_init' => ['mysqli_stmt', 'mysql'=>'mysqli'], - 'mysqli_stmt_insert_id' => ['mixed', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_more_results' => ['bool', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_next_result' => ['bool', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_num_rows' => ['int', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_param_count' => ['int', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_prepare' => ['bool', 'statement'=>'mysqli_stmt', 'query'=>'string'], - 'mysqli_stmt_reset' => ['bool', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_result_metadata' => ['mysqli_result|false', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_send_long_data' => ['bool', 'statement'=>'mysqli_stmt', 'param_num'=>'int', 'data'=>'string'], - 'mysqli_stmt_sqlstate' => ['string', 'statement'=>'mysqli_stmt'], - 'mysqli_stmt_store_result' => ['bool', 'statement'=>'mysqli_stmt'], - 'mysqli_store_result' => ['mysqli_result|false', 'mysql'=>'mysqli', 'mode='=>'int'], - 'mysqli_thread_id' => ['int', 'mysql'=>'mysqli'], - 'mysqli_thread_safe' => ['bool'], - 'mysqli_use_result' => ['mysqli_result|false', 'mysql'=>'mysqli'], - 'mysqli_warning::__construct' => ['void'], - 'mysqli_warning::next' => ['bool'], - 'mysqli_warning_count' => ['int', 'mysql'=>'mysqli'], - 'mysqlnd_memcache_get_config' => ['array', 'connection'=>'mixed'], - 'mysqlnd_memcache_set' => ['bool', 'mysql_connection'=>'mixed', 'memcache_connection='=>'Memcached', 'pattern='=>'string', 'callback='=>'callable'], - 'mysqlnd_ms_dump_servers' => ['array', 'connection'=>'mixed'], - 'mysqlnd_ms_fabric_select_global' => ['array', 'connection'=>'mixed', 'table_name'=>'mixed'], - 'mysqlnd_ms_fabric_select_shard' => ['array', 'connection'=>'mixed', 'table_name'=>'mixed', 'shard_key'=>'mixed'], - 'mysqlnd_ms_get_last_gtid' => ['string', 'connection'=>'mixed'], - 'mysqlnd_ms_get_last_used_connection' => ['array', 'connection'=>'mixed'], - 'mysqlnd_ms_get_stats' => ['array'], - 'mysqlnd_ms_match_wild' => ['bool', 'table_name'=>'string', 'wildcard'=>'string'], - 'mysqlnd_ms_query_is_select' => ['int', 'query'=>'string'], - 'mysqlnd_ms_set_qos' => ['bool', 'connection'=>'mixed', 'service_level'=>'int', 'service_level_option='=>'int', 'option_value='=>'mixed'], - 'mysqlnd_ms_set_user_pick_server' => ['bool', 'function'=>'string'], - 'mysqlnd_ms_xa_begin' => ['int', 'connection'=>'mixed', 'gtrid'=>'string', 'timeout='=>'int'], - 'mysqlnd_ms_xa_commit' => ['int', 'connection'=>'mixed', 'gtrid'=>'string'], - 'mysqlnd_ms_xa_gc' => ['int', 'connection'=>'mixed', 'gtrid='=>'string', 'ignore_max_retries='=>'bool'], - 'mysqlnd_ms_xa_rollback' => ['int', 'connection'=>'mixed', 'gtrid'=>'string'], - 'mysqlnd_qc_change_handler' => ['bool', 'handler'=>''], - 'mysqlnd_qc_clear_cache' => ['bool'], - 'mysqlnd_qc_get_available_handlers' => ['array'], - 'mysqlnd_qc_get_cache_info' => ['array'], - 'mysqlnd_qc_get_core_stats' => ['array'], - 'mysqlnd_qc_get_handler' => ['array'], - 'mysqlnd_qc_get_normalized_query_trace_log' => ['array'], - 'mysqlnd_qc_get_query_trace_log' => ['array'], - 'mysqlnd_qc_set_cache_condition' => ['bool', 'condition_type'=>'int', 'condition'=>'mixed', 'condition_option'=>'mixed'], - 'mysqlnd_qc_set_is_select' => ['mixed', 'callback'=>'string'], - 'mysqlnd_qc_set_storage_handler' => ['bool', 'handler'=>'string'], - 'mysqlnd_qc_set_user_handlers' => ['bool', 'get_hash'=>'string', 'find_query_in_cache'=>'string', 'return_to_cache'=>'string', 'add_query_to_cache_if_not_exists'=>'string', 'query_is_select'=>'string', 'update_query_run_time_stats'=>'string', 'get_stats'=>'string', 'clear_cache'=>'string'], - 'mysqlnd_uh_convert_to_mysqlnd' => ['resource', '&rw_mysql_connection'=>'mysqli'], - 'mysqlnd_uh_set_connection_proxy' => ['bool', '&rw_connection_proxy'=>'MysqlndUhConnection', '&rw_mysqli_connection='=>'mysqli'], - 'mysqlnd_uh_set_statement_proxy' => ['bool', '&rw_statement_proxy'=>'MysqlndUhStatement'], - 'natcasesort' => ['bool', '&rw_array'=>'array'], - 'natsort' => ['bool', '&rw_array'=>'array'], - 'ncurses_addch' => ['int', 'ch'=>'int'], - 'ncurses_addchnstr' => ['int', 's'=>'string', 'n'=>'int'], - 'ncurses_addchstr' => ['int', 's'=>'string'], - 'ncurses_addnstr' => ['int', 's'=>'string', 'n'=>'int'], - 'ncurses_addstr' => ['int', 'text'=>'string'], - 'ncurses_assume_default_colors' => ['int', 'fg'=>'int', 'bg'=>'int'], - 'ncurses_attroff' => ['int', 'attributes'=>'int'], - 'ncurses_attron' => ['int', 'attributes'=>'int'], - 'ncurses_attrset' => ['int', 'attributes'=>'int'], - 'ncurses_baudrate' => ['int'], - 'ncurses_beep' => ['int'], - 'ncurses_bkgd' => ['int', 'attrchar'=>'int'], - 'ncurses_bkgdset' => ['void', 'attrchar'=>'int'], - 'ncurses_border' => ['int', 'left'=>'int', 'right'=>'int', 'top'=>'int', 'bottom'=>'int', 'tl_corner'=>'int', 'tr_corner'=>'int', 'bl_corner'=>'int', 'br_corner'=>'int'], - 'ncurses_bottom_panel' => ['int', 'panel'=>'resource'], - 'ncurses_can_change_color' => ['bool'], - 'ncurses_cbreak' => ['bool'], - 'ncurses_clear' => ['bool'], - 'ncurses_clrtobot' => ['bool'], - 'ncurses_clrtoeol' => ['bool'], - 'ncurses_color_content' => ['int', 'color'=>'int', 'r'=>'int', 'g'=>'int', 'b'=>'int'], - 'ncurses_color_set' => ['int', 'pair'=>'int'], - 'ncurses_curs_set' => ['int', 'visibility'=>'int'], - 'ncurses_def_prog_mode' => ['bool'], - 'ncurses_def_shell_mode' => ['bool'], - 'ncurses_define_key' => ['int', 'definition'=>'string', 'keycode'=>'int'], - 'ncurses_del_panel' => ['bool', 'panel'=>'resource'], - 'ncurses_delay_output' => ['int', 'milliseconds'=>'int'], - 'ncurses_delch' => ['bool'], - 'ncurses_deleteln' => ['bool'], - 'ncurses_delwin' => ['bool', 'window'=>'resource'], - 'ncurses_doupdate' => ['bool'], - 'ncurses_echo' => ['bool'], - 'ncurses_echochar' => ['int', 'character'=>'int'], - 'ncurses_end' => ['int'], - 'ncurses_erase' => ['bool'], - 'ncurses_erasechar' => ['string'], - 'ncurses_filter' => ['void'], - 'ncurses_flash' => ['bool'], - 'ncurses_flushinp' => ['bool'], - 'ncurses_getch' => ['int'], - 'ncurses_getmaxyx' => ['void', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], - 'ncurses_getmouse' => ['bool', 'mevent'=>'array'], - 'ncurses_getyx' => ['void', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], - 'ncurses_halfdelay' => ['int', 'tenth'=>'int'], - 'ncurses_has_colors' => ['bool'], - 'ncurses_has_ic' => ['bool'], - 'ncurses_has_il' => ['bool'], - 'ncurses_has_key' => ['int', 'keycode'=>'int'], - 'ncurses_hide_panel' => ['int', 'panel'=>'resource'], - 'ncurses_hline' => ['int', 'charattr'=>'int', 'n'=>'int'], - 'ncurses_inch' => ['string'], - 'ncurses_init' => ['void'], - 'ncurses_init_color' => ['int', 'color'=>'int', 'r'=>'int', 'g'=>'int', 'b'=>'int'], - 'ncurses_init_pair' => ['int', 'pair'=>'int', 'fg'=>'int', 'bg'=>'int'], - 'ncurses_insch' => ['int', 'character'=>'int'], - 'ncurses_insdelln' => ['int', 'count'=>'int'], - 'ncurses_insertln' => ['int'], - 'ncurses_insstr' => ['int', 'text'=>'string'], - 'ncurses_instr' => ['int', 'buffer'=>'string'], - 'ncurses_isendwin' => ['bool'], - 'ncurses_keyok' => ['int', 'keycode'=>'int', 'enable'=>'bool'], - 'ncurses_keypad' => ['int', 'window'=>'resource', 'bf'=>'bool'], - 'ncurses_killchar' => ['string'], - 'ncurses_longname' => ['string'], - 'ncurses_meta' => ['int', 'window'=>'resource', '_8bit'=>'bool'], - 'ncurses_mouse_trafo' => ['bool', 'y'=>'int', 'x'=>'int', 'toscreen'=>'bool'], - 'ncurses_mouseinterval' => ['int', 'milliseconds'=>'int'], - 'ncurses_mousemask' => ['int', 'newmask'=>'int', 'oldmask'=>'int'], - 'ncurses_move' => ['int', 'y'=>'int', 'x'=>'int'], - 'ncurses_move_panel' => ['int', 'panel'=>'resource', 'startx'=>'int', 'starty'=>'int'], - 'ncurses_mvaddch' => ['int', 'y'=>'int', 'x'=>'int', 'c'=>'int'], - 'ncurses_mvaddchnstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string', 'n'=>'int'], - 'ncurses_mvaddchstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string'], - 'ncurses_mvaddnstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string', 'n'=>'int'], - 'ncurses_mvaddstr' => ['int', 'y'=>'int', 'x'=>'int', 's'=>'string'], - 'ncurses_mvcur' => ['int', 'old_y'=>'int', 'old_x'=>'int', 'new_y'=>'int', 'new_x'=>'int'], - 'ncurses_mvdelch' => ['int', 'y'=>'int', 'x'=>'int'], - 'ncurses_mvgetch' => ['int', 'y'=>'int', 'x'=>'int'], - 'ncurses_mvhline' => ['int', 'y'=>'int', 'x'=>'int', 'attrchar'=>'int', 'n'=>'int'], - 'ncurses_mvinch' => ['int', 'y'=>'int', 'x'=>'int'], - 'ncurses_mvvline' => ['int', 'y'=>'int', 'x'=>'int', 'attrchar'=>'int', 'n'=>'int'], - 'ncurses_mvwaddstr' => ['int', 'window'=>'resource', 'y'=>'int', 'x'=>'int', 'text'=>'string'], - 'ncurses_napms' => ['int', 'milliseconds'=>'int'], - 'ncurses_new_panel' => ['resource', 'window'=>'resource'], - 'ncurses_newpad' => ['resource', 'rows'=>'int', 'cols'=>'int'], - 'ncurses_newwin' => ['resource', 'rows'=>'int', 'cols'=>'int', 'y'=>'int', 'x'=>'int'], - 'ncurses_nl' => ['bool'], - 'ncurses_nocbreak' => ['bool'], - 'ncurses_noecho' => ['bool'], - 'ncurses_nonl' => ['bool'], - 'ncurses_noqiflush' => ['void'], - 'ncurses_noraw' => ['bool'], - 'ncurses_pair_content' => ['int', 'pair'=>'int', 'f'=>'int', 'b'=>'int'], - 'ncurses_panel_above' => ['resource', 'panel'=>'resource'], - 'ncurses_panel_below' => ['resource', 'panel'=>'resource'], - 'ncurses_panel_window' => ['resource', 'panel'=>'resource'], - 'ncurses_pnoutrefresh' => ['int', 'pad'=>'resource', 'pminrow'=>'int', 'pmincol'=>'int', 'sminrow'=>'int', 'smincol'=>'int', 'smaxrow'=>'int', 'smaxcol'=>'int'], - 'ncurses_prefresh' => ['int', 'pad'=>'resource', 'pminrow'=>'int', 'pmincol'=>'int', 'sminrow'=>'int', 'smincol'=>'int', 'smaxrow'=>'int', 'smaxcol'=>'int'], - 'ncurses_putp' => ['int', 'text'=>'string'], - 'ncurses_qiflush' => ['void'], - 'ncurses_raw' => ['bool'], - 'ncurses_refresh' => ['int', 'ch'=>'int'], - 'ncurses_replace_panel' => ['int', 'panel'=>'resource', 'window'=>'resource'], - 'ncurses_reset_prog_mode' => ['int'], - 'ncurses_reset_shell_mode' => ['int'], - 'ncurses_resetty' => ['bool'], - 'ncurses_savetty' => ['bool'], - 'ncurses_scr_dump' => ['int', 'filename'=>'string'], - 'ncurses_scr_init' => ['int', 'filename'=>'string'], - 'ncurses_scr_restore' => ['int', 'filename'=>'string'], - 'ncurses_scr_set' => ['int', 'filename'=>'string'], - 'ncurses_scrl' => ['int', 'count'=>'int'], - 'ncurses_show_panel' => ['int', 'panel'=>'resource'], - 'ncurses_slk_attr' => ['int'], - 'ncurses_slk_attroff' => ['int', 'intarg'=>'int'], - 'ncurses_slk_attron' => ['int', 'intarg'=>'int'], - 'ncurses_slk_attrset' => ['int', 'intarg'=>'int'], - 'ncurses_slk_clear' => ['bool'], - 'ncurses_slk_color' => ['int', 'intarg'=>'int'], - 'ncurses_slk_init' => ['bool', 'format'=>'int'], - 'ncurses_slk_noutrefresh' => ['bool'], - 'ncurses_slk_refresh' => ['int'], - 'ncurses_slk_restore' => ['int'], - 'ncurses_slk_set' => ['bool', 'labelnr'=>'int', 'label'=>'string', 'format'=>'int'], - 'ncurses_slk_touch' => ['int'], - 'ncurses_standend' => ['int'], - 'ncurses_standout' => ['int'], - 'ncurses_start_color' => ['int'], - 'ncurses_termattrs' => ['bool'], - 'ncurses_termname' => ['string'], - 'ncurses_timeout' => ['void', 'millisec'=>'int'], - 'ncurses_top_panel' => ['int', 'panel'=>'resource'], - 'ncurses_typeahead' => ['int', 'fd'=>'int'], - 'ncurses_ungetch' => ['int', 'keycode'=>'int'], - 'ncurses_ungetmouse' => ['bool', 'mevent'=>'array'], - 'ncurses_update_panels' => ['void'], - 'ncurses_use_default_colors' => ['bool'], - 'ncurses_use_env' => ['void', 'flag'=>'bool'], - 'ncurses_use_extended_names' => ['int', 'flag'=>'bool'], - 'ncurses_vidattr' => ['int', 'intarg'=>'int'], - 'ncurses_vline' => ['int', 'charattr'=>'int', 'n'=>'int'], - 'ncurses_waddch' => ['int', 'window'=>'resource', 'ch'=>'int'], - 'ncurses_waddstr' => ['int', 'window'=>'resource', 'string'=>'string', 'n='=>'int'], - 'ncurses_wattroff' => ['int', 'window'=>'resource', 'attrs'=>'int'], - 'ncurses_wattron' => ['int', 'window'=>'resource', 'attrs'=>'int'], - 'ncurses_wattrset' => ['int', 'window'=>'resource', 'attrs'=>'int'], - 'ncurses_wborder' => ['int', 'window'=>'resource', 'left'=>'int', 'right'=>'int', 'top'=>'int', 'bottom'=>'int', 'tl_corner'=>'int', 'tr_corner'=>'int', 'bl_corner'=>'int', 'br_corner'=>'int'], - 'ncurses_wclear' => ['int', 'window'=>'resource'], - 'ncurses_wcolor_set' => ['int', 'window'=>'resource', 'color_pair'=>'int'], - 'ncurses_werase' => ['int', 'window'=>'resource'], - 'ncurses_wgetch' => ['int', 'window'=>'resource'], - 'ncurses_whline' => ['int', 'window'=>'resource', 'charattr'=>'int', 'n'=>'int'], - 'ncurses_wmouse_trafo' => ['bool', 'window'=>'resource', 'y'=>'int', 'x'=>'int', 'toscreen'=>'bool'], - 'ncurses_wmove' => ['int', 'window'=>'resource', 'y'=>'int', 'x'=>'int'], - 'ncurses_wnoutrefresh' => ['int', 'window'=>'resource'], - 'ncurses_wrefresh' => ['int', 'window'=>'resource'], - 'ncurses_wstandend' => ['int', 'window'=>'resource'], - 'ncurses_wstandout' => ['int', 'window'=>'resource'], - 'ncurses_wvline' => ['int', 'window'=>'resource', 'charattr'=>'int', 'n'=>'int'], - 'newrelic_add_custom_parameter' => ['bool', 'key'=>'string', 'value'=>'bool|float|int|string'], - 'newrelic_add_custom_tracer' => ['bool', 'function_name'=>'string'], - 'newrelic_background_job' => ['void', 'flag='=>'bool'], - 'newrelic_capture_params' => ['void', 'enable='=>'bool'], - 'newrelic_custom_metric' => ['bool', 'metric_name'=>'string', 'value'=>'float'], - 'newrelic_disable_autorum' => ['true'], - 'newrelic_end_of_transaction' => ['void'], - 'newrelic_end_transaction' => ['bool', 'ignore='=>'bool'], - 'newrelic_get_browser_timing_footer' => ['string', 'include_tags='=>'bool'], - 'newrelic_get_browser_timing_header' => ['string', 'include_tags='=>'bool'], - 'newrelic_ignore_apdex' => ['void'], - 'newrelic_ignore_transaction' => ['void'], - 'newrelic_name_transaction' => ['bool', 'name'=>'string'], - 'newrelic_notice_error' => ['void', 'message'=>'string', 'exception='=>'Exception|Throwable'], - 'newrelic_notice_error\'1' => ['void', 'unused_1'=>'string', 'message'=>'string', 'unused_2'=>'string', 'unused_3'=>'int', 'unused_4='=>''], - 'newrelic_record_custom_event' => ['void', 'name'=>'string', 'attributes'=>'array'], - 'newrelic_record_datastore_segment' => ['mixed', 'func'=>'callable', 'parameters'=>'array'], - 'newrelic_set_appname' => ['bool', 'name'=>'string', 'license='=>'string', 'xmit='=>'bool'], - 'newrelic_set_user_attributes' => ['bool', 'user'=>'string', 'account'=>'string', 'product'=>'string'], - 'newrelic_start_transaction' => ['bool', 'appname'=>'string', 'license='=>'string'], - 'newt_bell' => ['void'], - 'newt_button' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], - 'newt_button_bar' => ['resource', 'buttons'=>'array'], - 'newt_centered_window' => ['int', 'width'=>'int', 'height'=>'int', 'title='=>'string'], - 'newt_checkbox' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'def_value'=>'string', 'seq='=>'string'], - 'newt_checkbox_get_value' => ['string', 'checkbox'=>'resource'], - 'newt_checkbox_set_flags' => ['void', 'checkbox'=>'resource', 'flags'=>'int', 'sense'=>'int'], - 'newt_checkbox_set_value' => ['void', 'checkbox'=>'resource', 'value'=>'string'], - 'newt_checkbox_tree' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'flags='=>'int'], - 'newt_checkbox_tree_add_item' => ['void', 'checkboxtree'=>'resource', 'text'=>'string', 'data'=>'mixed', 'flags'=>'int', 'index'=>'int', '...args='=>'int'], - 'newt_checkbox_tree_find_item' => ['array', 'checkboxtree'=>'resource', 'data'=>'mixed'], - 'newt_checkbox_tree_get_current' => ['mixed', 'checkboxtree'=>'resource'], - 'newt_checkbox_tree_get_entry_value' => ['string', 'checkboxtree'=>'resource', 'data'=>'mixed'], - 'newt_checkbox_tree_get_multi_selection' => ['array', 'checkboxtree'=>'resource', 'seqnum'=>'string'], - 'newt_checkbox_tree_get_selection' => ['array', 'checkboxtree'=>'resource'], - 'newt_checkbox_tree_multi' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'seq'=>'string', 'flags='=>'int'], - 'newt_checkbox_tree_set_current' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed'], - 'newt_checkbox_tree_set_entry' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed', 'text'=>'string'], - 'newt_checkbox_tree_set_entry_value' => ['void', 'checkboxtree'=>'resource', 'data'=>'mixed', 'value'=>'string'], - 'newt_checkbox_tree_set_width' => ['void', 'checkbox_tree'=>'resource', 'width'=>'int'], - 'newt_clear_key_buffer' => ['void'], - 'newt_cls' => ['void'], - 'newt_compact_button' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], - 'newt_component_add_callback' => ['void', 'component'=>'resource', 'func_name'=>'mixed', 'data'=>'mixed'], - 'newt_component_takes_focus' => ['void', 'component'=>'resource', 'takes_focus'=>'bool'], - 'newt_create_grid' => ['resource', 'cols'=>'int', 'rows'=>'int'], - 'newt_cursor_off' => ['void'], - 'newt_cursor_on' => ['void'], - 'newt_delay' => ['void', 'microseconds'=>'int'], - 'newt_draw_form' => ['void', 'form'=>'resource'], - 'newt_draw_root_text' => ['void', 'left'=>'int', 'top'=>'int', 'text'=>'string'], - 'newt_entry' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'init_value='=>'string', 'flags='=>'int'], - 'newt_entry_get_value' => ['string', 'entry'=>'resource'], - 'newt_entry_set' => ['void', 'entry'=>'resource', 'value'=>'string', 'cursor_at_end='=>'bool'], - 'newt_entry_set_filter' => ['void', 'entry'=>'resource', 'filter'=>'callable', 'data'=>'mixed'], - 'newt_entry_set_flags' => ['void', 'entry'=>'resource', 'flags'=>'int', 'sense'=>'int'], - 'newt_finished' => ['int'], - 'newt_form' => ['resource', 'vert_bar='=>'resource', 'help='=>'string', 'flags='=>'int'], - 'newt_form_add_component' => ['void', 'form'=>'resource', 'component'=>'resource'], - 'newt_form_add_components' => ['void', 'form'=>'resource', 'components'=>'array'], - 'newt_form_add_hot_key' => ['void', 'form'=>'resource', 'key'=>'int'], - 'newt_form_destroy' => ['void', 'form'=>'resource'], - 'newt_form_get_current' => ['resource', 'form'=>'resource'], - 'newt_form_run' => ['void', 'form'=>'resource', 'exit_struct'=>'array'], - 'newt_form_set_background' => ['void', 'from'=>'resource', 'background'=>'int'], - 'newt_form_set_height' => ['void', 'form'=>'resource', 'height'=>'int'], - 'newt_form_set_size' => ['void', 'form'=>'resource'], - 'newt_form_set_timer' => ['void', 'form'=>'resource', 'milliseconds'=>'int'], - 'newt_form_set_width' => ['void', 'form'=>'resource', 'width'=>'int'], - 'newt_form_watch_fd' => ['void', 'form'=>'resource', 'stream'=>'resource', 'flags='=>'int'], - 'newt_get_screen_size' => ['void', 'cols'=>'int', 'rows'=>'int'], - 'newt_grid_add_components_to_form' => ['void', 'grid'=>'resource', 'form'=>'resource', 'recurse'=>'bool'], - 'newt_grid_basic_window' => ['resource', 'text'=>'resource', 'middle'=>'resource', 'buttons'=>'resource'], - 'newt_grid_free' => ['void', 'grid'=>'resource', 'recurse'=>'bool'], - 'newt_grid_get_size' => ['void', 'grid'=>'resource', 'width'=>'int', 'height'=>'int'], - 'newt_grid_h_close_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], - 'newt_grid_h_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], - 'newt_grid_place' => ['void', 'grid'=>'resource', 'left'=>'int', 'top'=>'int'], - 'newt_grid_set_field' => ['void', 'grid'=>'resource', 'col'=>'int', 'row'=>'int', 'type'=>'int', 'value'=>'resource', 'pad_left'=>'int', 'pad_top'=>'int', 'pad_right'=>'int', 'pad_bottom'=>'int', 'anchor'=>'int', 'flags='=>'int'], - 'newt_grid_simple_window' => ['resource', 'text'=>'resource', 'middle'=>'resource', 'buttons'=>'resource'], - 'newt_grid_v_close_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], - 'newt_grid_v_stacked' => ['resource', 'element1_type'=>'int', 'element1'=>'resource', '...args='=>'resource'], - 'newt_grid_wrapped_window' => ['void', 'grid'=>'resource', 'title'=>'string'], - 'newt_grid_wrapped_window_at' => ['void', 'grid'=>'resource', 'title'=>'string', 'left'=>'int', 'top'=>'int'], - 'newt_init' => ['int'], - 'newt_label' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string'], - 'newt_label_set_text' => ['void', 'label'=>'resource', 'text'=>'string'], - 'newt_listbox' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'flags='=>'int'], - 'newt_listbox_append_entry' => ['void', 'listbox'=>'resource', 'text'=>'string', 'data'=>'mixed'], - 'newt_listbox_clear' => ['void', 'listobx'=>'resource'], - 'newt_listbox_clear_selection' => ['void', 'listbox'=>'resource'], - 'newt_listbox_delete_entry' => ['void', 'listbox'=>'resource', 'key'=>'mixed'], - 'newt_listbox_get_current' => ['string', 'listbox'=>'resource'], - 'newt_listbox_get_selection' => ['array', 'listbox'=>'resource'], - 'newt_listbox_insert_entry' => ['void', 'listbox'=>'resource', 'text'=>'string', 'data'=>'mixed', 'key'=>'mixed'], - 'newt_listbox_item_count' => ['int', 'listbox'=>'resource'], - 'newt_listbox_select_item' => ['void', 'listbox'=>'resource', 'key'=>'mixed', 'sense'=>'int'], - 'newt_listbox_set_current' => ['void', 'listbox'=>'resource', 'num'=>'int'], - 'newt_listbox_set_current_by_key' => ['void', 'listbox'=>'resource', 'key'=>'mixed'], - 'newt_listbox_set_data' => ['void', 'listbox'=>'resource', 'num'=>'int', 'data'=>'mixed'], - 'newt_listbox_set_entry' => ['void', 'listbox'=>'resource', 'num'=>'int', 'text'=>'string'], - 'newt_listbox_set_width' => ['void', 'listbox'=>'resource', 'width'=>'int'], - 'newt_listitem' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'is_default'=>'bool', 'prev_item'=>'resource', 'data'=>'mixed', 'flags='=>'int'], - 'newt_listitem_get_data' => ['mixed', 'item'=>'resource'], - 'newt_listitem_set' => ['void', 'item'=>'resource', 'text'=>'string'], - 'newt_open_window' => ['int', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'height'=>'int', 'title='=>'string'], - 'newt_pop_help_line' => ['void'], - 'newt_pop_window' => ['void'], - 'newt_push_help_line' => ['void', 'text='=>'string'], - 'newt_radio_get_current' => ['resource', 'set_member'=>'resource'], - 'newt_radiobutton' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'string', 'is_default'=>'bool', 'prev_button='=>'resource'], - 'newt_redraw_help_line' => ['void'], - 'newt_reflow_text' => ['string', 'text'=>'string', 'width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'actual_width'=>'int', 'actual_height'=>'int'], - 'newt_refresh' => ['void'], - 'newt_resize_screen' => ['void', 'redraw='=>'bool'], - 'newt_resume' => ['void'], - 'newt_run_form' => ['resource', 'form'=>'resource'], - 'newt_scale' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'full_value'=>'int'], - 'newt_scale_set' => ['void', 'scale'=>'resource', 'amount'=>'int'], - 'newt_scrollbar_set' => ['void', 'scrollbar'=>'resource', 'where'=>'int', 'total'=>'int'], - 'newt_set_help_callback' => ['void', 'function'=>'mixed'], - 'newt_set_suspend_callback' => ['void', 'function'=>'callable', 'data'=>'mixed'], - 'newt_suspend' => ['void'], - 'newt_textbox' => ['resource', 'left'=>'int', 'top'=>'int', 'width'=>'int', 'height'=>'int', 'flags='=>'int'], - 'newt_textbox_get_num_lines' => ['int', 'textbox'=>'resource'], - 'newt_textbox_reflowed' => ['resource', 'left'=>'int', 'top'=>'int', 'text'=>'char', 'width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'flags='=>'int'], - 'newt_textbox_set_height' => ['void', 'textbox'=>'resource', 'height'=>'int'], - 'newt_textbox_set_text' => ['void', 'textbox'=>'resource', 'text'=>'string'], - 'newt_vertical_scrollbar' => ['resource', 'left'=>'int', 'top'=>'int', 'height'=>'int', 'normal_colorset='=>'int', 'thumb_colorset='=>'int'], - 'newt_wait_for_key' => ['void'], - 'newt_win_choice' => ['int', 'title'=>'string', 'button1_text'=>'string', 'button2_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], - 'newt_win_entries' => ['int', 'title'=>'string', 'text'=>'string', 'suggested_width'=>'int', 'flex_down'=>'int', 'flex_up'=>'int', 'data_width'=>'int', 'items'=>'array', 'button1'=>'string', '...args='=>'string'], - 'newt_win_menu' => ['int', 'title'=>'string', 'text'=>'string', 'suggestedwidth'=>'int', 'flexdown'=>'int', 'flexup'=>'int', 'maxlistheight'=>'int', 'items'=>'array', 'listitem'=>'int', 'button1='=>'string', '...args='=>'string'], - 'newt_win_message' => ['void', 'title'=>'string', 'button_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], - 'newt_win_messagev' => ['void', 'title'=>'string', 'button_text'=>'string', 'format'=>'string', 'args'=>'array'], - 'newt_win_ternary' => ['int', 'title'=>'string', 'button1_text'=>'string', 'button2_text'=>'string', 'button3_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'], - 'next' => ['mixed', '&r_array'=>'array|object'], - 'ngettext' => ['string', 'singular'=>'string', 'plural'=>'string', 'count'=>'int'], - 'nl2br' => ['string', 'string'=>'string', 'use_xhtml='=>'bool'], - 'nl_langinfo' => ['string|false', 'item'=>'int'], - 'normalizer_get_raw_decomposition' => ['string|null', 'string'=>'string'], - 'normalizer_is_normalized' => ['bool', 'string'=>'string', 'form='=>'int'], - 'normalizer_normalize' => ['string', 'string'=>'string', 'form='=>'int'], - 'notes_body' => ['array', 'server'=>'string', 'mailbox'=>'string', 'msg_number'=>'int'], - 'notes_copy_db' => ['bool', 'from_database_name'=>'string', 'to_database_name'=>'string'], - 'notes_create_db' => ['bool', 'database_name'=>'string'], - 'notes_create_note' => ['bool', 'database_name'=>'string', 'form_name'=>'string'], - 'notes_drop_db' => ['bool', 'database_name'=>'string'], - 'notes_find_note' => ['int', 'database_name'=>'string', 'name'=>'string', 'type='=>'string'], - 'notes_header_info' => ['object', 'server'=>'string', 'mailbox'=>'string', 'msg_number'=>'int'], - 'notes_list_msgs' => ['bool', 'db'=>'string'], - 'notes_mark_read' => ['bool', 'database_name'=>'string', 'user_name'=>'string', 'note_id'=>'string'], - 'notes_mark_unread' => ['bool', 'database_name'=>'string', 'user_name'=>'string', 'note_id'=>'string'], - 'notes_nav_create' => ['bool', 'database_name'=>'string', 'name'=>'string'], - 'notes_search' => ['array', 'database_name'=>'string', 'keywords'=>'string'], - 'notes_unread' => ['array', 'database_name'=>'string', 'user_name'=>'string'], - 'notes_version' => ['float', 'database_name'=>'string'], - 'nsapi_request_headers' => ['array'], - 'nsapi_response_headers' => ['array'], - 'nsapi_virtual' => ['bool', 'uri'=>'string'], - 'nthmac' => ['string', 'clent'=>'string', 'data'=>'string'], - 'number_format' => ['string', 'num'=>'float|int', 'decimals='=>'int'], - 'number_format\'1' => ['string', 'num'=>'float|int', 'decimals'=>'int', 'decimal_separator'=>'?string', 'thousands_separator'=>'?string'], - 'numfmt_create' => ['NumberFormatter|false', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], - 'numfmt_format' => ['string|false', 'formatter'=>'NumberFormatter', 'num'=>'int|float', 'type='=>'int'], - 'numfmt_format_currency' => ['string|false', 'formatter'=>'NumberFormatter', 'amount'=>'float', 'currency'=>'string'], - 'numfmt_get_attribute' => ['int|false', 'formatter'=>'NumberFormatter', 'attribute'=>'int'], - 'numfmt_get_error_code' => ['int', 'formatter'=>'NumberFormatter'], - 'numfmt_get_error_message' => ['string', 'formatter'=>'NumberFormatter'], - 'numfmt_get_locale' => ['string', 'formatter'=>'NumberFormatter', 'type='=>'int'], - 'numfmt_get_pattern' => ['string|false', 'formatter'=>'NumberFormatter'], - 'numfmt_get_symbol' => ['string|false', 'formatter'=>'NumberFormatter', 'symbol'=>'int'], - 'numfmt_get_text_attribute' => ['string|false', 'formatter'=>'NumberFormatter', 'attribute'=>'int'], - 'numfmt_parse' => ['float|int|false', 'formatter'=>'NumberFormatter', 'string'=>'string', 'type='=>'int', '&rw_offset='=>'int'], - 'numfmt_parse_currency' => ['float|false', 'formatter'=>'NumberFormatter', 'string'=>'string', '&w_currency'=>'string', '&rw_offset='=>'int'], - 'numfmt_set_attribute' => ['bool', 'formatter'=>'NumberFormatter', 'attribute'=>'int', 'value'=>'int'], - 'numfmt_set_pattern' => ['bool', 'formatter'=>'NumberFormatter', 'pattern'=>'string'], - 'numfmt_set_symbol' => ['bool', 'formatter'=>'NumberFormatter', 'symbol'=>'int', 'value'=>'string'], - 'numfmt_set_text_attribute' => ['bool', 'formatter'=>'NumberFormatter', 'attribute'=>'int', 'value'=>'string'], - 'oauth_get_sbs' => ['string', 'http_method'=>'string', 'uri'=>'string', 'request_parameters='=>'array'], - 'oauth_urlencode' => ['string', 'uri'=>'string'], - 'ob_clean' => ['bool'], - 'ob_deflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'], - 'ob_end_clean' => ['bool'], - 'ob_end_flush' => ['bool'], - 'ob_etaghandler' => ['string', 'data'=>'string', 'mode'=>'int'], - 'ob_flush' => ['bool'], - 'ob_get_clean' => ['string|false'], - 'ob_get_contents' => ['string|false'], - 'ob_get_flush' => ['string|false'], - 'ob_get_length' => ['int|false'], - 'ob_get_level' => ['int'], - 'ob_get_status' => ['array', 'full_status='=>'bool'], - 'ob_gzhandler' => ['string|false', 'data'=>'string', 'flags'=>'int'], - 'ob_iconv_handler' => ['string', 'contents'=>'string', 'status'=>'int'], - 'ob_implicit_flush' => ['void', 'enable='=>'int'], - 'ob_inflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'], - 'ob_list_handlers' => ['false|list'], - 'ob_start' => ['bool', 'callback='=>'string|array|?callable', 'chunk_size='=>'int', 'flags='=>'int'], - 'ob_tidyhandler' => ['string', 'input'=>'string', 'mode='=>'int'], - 'oci_bind_array_by_name' => ['bool', 'statement'=>'resource', 'param'=>'string', '&rw_var'=>'array', 'max_array_length'=>'int', 'max_item_length='=>'int', 'type='=>'int'], - 'oci_bind_by_name' => ['bool', 'statement'=>'resource', 'param'=>'string', '&rw_var'=>'mixed', 'max_length='=>'int', 'type='=>'int'], - 'oci_cancel' => ['bool', 'statement'=>'resource'], - 'oci_client_version' => ['string'], - 'oci_close' => ['bool', 'connection'=>'resource'], - 'oci_collection_append' => ['bool', 'collection'=>'string'], - 'oci_collection_assign' => ['bool', 'to'=>'object'], - 'oci_collection_element_assign' => ['bool', 'collection'=>'int', 'index'=>'string'], - 'oci_collection_element_get' => ['string', 'collection'=>'int'], - 'oci_collection_max' => ['int'], - 'oci_collection_size' => ['int'], - 'oci_collection_trim' => ['bool', 'collection'=>'int'], - 'oci_commit' => ['bool', 'connection'=>'resource'], - 'oci_connect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], - 'oci_define_by_name' => ['bool', 'statement'=>'resource', 'column'=>'string', '&w_var'=>'mixed', 'type='=>'int'], - 'oci_error' => ['array|false', 'connection_or_statement='=>'resource'], - 'oci_execute' => ['bool', 'statement'=>'resource', 'mode='=>'int'], - 'oci_fetch' => ['bool', 'statement'=>'resource'], - 'oci_fetch_all' => ['int|false', 'statement'=>'resource', '&w_output'=>'array', 'offset='=>'int', 'limit='=>'int', 'flags='=>'int'], - 'oci_fetch_array' => ['array|false', 'statement'=>'resource', 'mode='=>'int'], - 'oci_fetch_assoc' => ['array|false', 'statement'=>'resource'], - 'oci_fetch_object' => ['object|false', 'statement'=>'resource'], - 'oci_fetch_row' => ['array|false', 'statement'=>'resource'], - 'oci_field_is_null' => ['bool', 'statement'=>'resource', 'column'=>'mixed'], - 'oci_field_name' => ['string|false', 'statement'=>'resource', 'column'=>'mixed'], - 'oci_field_precision' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], - 'oci_field_scale' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], - 'oci_field_size' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], - 'oci_field_type' => ['mixed|false', 'statement'=>'resource', 'column'=>'mixed'], - 'oci_field_type_raw' => ['int|false', 'statement'=>'resource', 'column'=>'mixed'], - 'oci_free_collection' => ['bool'], - 'oci_free_cursor' => ['bool', 'statement'=>'resource'], - 'oci_free_descriptor' => ['bool'], - 'oci_free_statement' => ['bool', 'statement'=>'resource'], - 'oci_get_implicit' => ['bool', 'stmt'=>''], - 'oci_get_implicit_resultset' => ['resource|false', 'statement'=>'resource'], - 'oci_internal_debug' => ['void', 'onoff'=>'bool'], - 'oci_lob_append' => ['bool', 'to'=>'object'], - 'oci_lob_close' => ['bool'], - 'oci_lob_copy' => ['bool', 'to'=>'OCILob', 'from'=>'OCILob', 'length='=>'int'], - 'oci_lob_eof' => ['bool'], - 'oci_lob_erase' => ['int', 'lob'=>'int', 'offset'=>'int'], - 'oci_lob_export' => ['bool', 'lob'=>'string', 'filename'=>'int', 'offset'=>'int'], - 'oci_lob_flush' => ['bool', 'lob'=>'int'], - 'oci_lob_import' => ['bool', 'lob'=>'string'], - 'oci_lob_is_equal' => ['bool', 'lob1'=>'OCILob', 'lob2'=>'OCILob'], - 'oci_lob_load' => ['string'], - 'oci_lob_read' => ['string', 'lob'=>'int'], - 'oci_lob_rewind' => ['bool'], - 'oci_lob_save' => ['bool', 'lob'=>'string', 'data'=>'int'], - 'oci_lob_seek' => ['bool', 'lob'=>'int', 'offset'=>'int'], - 'oci_lob_size' => ['int'], - 'oci_lob_tell' => ['int'], - 'oci_lob_truncate' => ['bool', 'lob'=>'int'], - 'oci_lob_write' => ['int', 'lob'=>'string', 'data'=>'int'], - 'oci_lob_write_temporary' => ['bool', 'value'=>'string', 'lob_type'=>'int'], - 'oci_new_collection' => ['OCICollection|false', 'connection'=>'resource', 'type_name'=>'string', 'schema='=>'string'], - 'oci_new_connect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], - 'oci_new_cursor' => ['resource|false', 'connection'=>'resource'], - 'oci_new_descriptor' => ['OCILob|false', 'connection'=>'resource', 'type='=>'int'], - 'oci_num_fields' => ['int|false', 'statement'=>'resource'], - 'oci_num_rows' => ['int|false', 'statement'=>'resource'], - 'oci_parse' => ['resource|false', 'connection'=>'resource', 'sql'=>'string'], - 'oci_password_change' => ['bool', 'connection'=>'resource', 'username'=>'string', 'old_password'=>'string', 'new_password'=>'string'], - 'oci_pconnect' => ['resource|false', 'username'=>'string', 'password'=>'string', 'connection_string='=>'string', 'encoding='=>'string', 'session_mode='=>'int'], - 'oci_result' => ['mixed|false', 'statement'=>'resource', 'column'=>'mixed'], - 'oci_rollback' => ['bool', 'connection'=>'resource'], - 'oci_server_version' => ['string|false', 'connection'=>'resource'], - 'oci_set_action' => ['bool', 'connection'=>'resource', 'action'=>'string'], - 'oci_set_call_timeout' => ['bool', 'connection'=>'resource', 'timeout'=>'int'], - 'oci_set_client_identifier' => ['bool', 'connection'=>'resource', 'client_id'=>'string'], - 'oci_set_client_info' => ['bool', 'connection'=>'resource', 'client_info'=>'string'], - 'oci_set_db_operation' => ['bool', 'connection'=>'resource', 'action'=>'string'], - 'oci_set_edition' => ['bool', 'edition'=>'string'], - 'oci_set_module_name' => ['bool', 'connection'=>'resource', 'name'=>'string'], - 'oci_set_prefetch' => ['bool', 'statement'=>'resource', 'rows'=>'int'], - 'oci_statement_type' => ['string|false', 'statement'=>'resource'], - 'ocifetchinto' => ['int|bool', 'statement'=>'resource', '&w_result'=>'array', 'mode='=>'int'], - 'ocigetbufferinglob' => ['bool'], - 'ocisetbufferinglob' => ['bool', 'lob'=>'bool'], - 'octdec' => ['int|float', 'octal_string'=>'string'], - 'odbc_autocommit' => ['mixed', 'odbc'=>'resource', 'enable='=>'bool'], - 'odbc_binmode' => ['bool', 'statement'=>'resource', 'mode'=>'int'], - 'odbc_close' => ['void', 'odbc'=>'resource'], - 'odbc_close_all' => ['void'], - 'odbc_columnprivileges' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'column'=>'string'], - 'odbc_columns' => ['resource|false', 'odbc'=>'resource', 'catalog='=>'string', 'schema='=>'string', 'table='=>'string', 'column='=>'string'], - 'odbc_commit' => ['bool', 'odbc'=>'resource'], - 'odbc_connect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'], - 'odbc_cursor' => ['string', 'statement'=>'resource'], - 'odbc_data_source' => ['array|false', 'odbc'=>'resource', 'fetch_type'=>'int'], - 'odbc_do' => ['resource', 'odbc'=>'resource', 'query'=>'string', 'flags='=>'int'], - 'odbc_error' => ['string', 'odbc='=>'resource'], - 'odbc_errormsg' => ['string', 'odbc='=>'resource'], - 'odbc_exec' => ['resource', 'odbc'=>'resource', 'query'=>'string', 'flags='=>'int'], - 'odbc_execute' => ['bool', 'statement'=>'resource', 'params='=>'array'], - 'odbc_fetch_array' => ['array|false', 'statement'=>'resource', 'row='=>'int'], - 'odbc_fetch_into' => ['int', 'statement'=>'resource', '&w_array'=>'array', 'row='=>'int'], - 'odbc_fetch_object' => ['object|false', 'statement'=>'resource', 'row='=>'int'], - 'odbc_fetch_row' => ['bool', 'statement'=>'resource', 'row='=>'int'], - 'odbc_field_len' => ['int|false', 'statement'=>'resource', 'field'=>'int'], - 'odbc_field_name' => ['string|false', 'statement'=>'resource', 'field'=>'int'], - 'odbc_field_num' => ['int|false', 'statement'=>'resource', 'field'=>'string'], - 'odbc_field_precision' => ['int', 'statement'=>'resource', 'field'=>'int'], - 'odbc_field_scale' => ['int|false', 'statement'=>'resource', 'field'=>'int'], - 'odbc_field_type' => ['string|false', 'statement'=>'resource', 'field'=>'int'], - 'odbc_foreignkeys' => ['resource|false', 'odbc'=>'resource', 'pk_catalog'=>'string', 'pk_schema'=>'string', 'pk_table'=>'string', 'fk_catalog'=>'string', 'fk_schema'=>'string', 'fk_table'=>'string'], - 'odbc_free_result' => ['bool', 'statement'=>'resource'], - 'odbc_gettypeinfo' => ['resource', 'odbc'=>'resource', 'data_type='=>'int'], - 'odbc_longreadlen' => ['bool', 'statement'=>'resource', 'length'=>'int'], - 'odbc_next_result' => ['bool', 'statement'=>'resource'], - 'odbc_num_fields' => ['int', 'statement'=>'resource'], - 'odbc_num_rows' => ['int', 'statement'=>'resource'], - 'odbc_pconnect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'], - 'odbc_prepare' => ['resource|false', 'odbc'=>'resource', 'query'=>'string'], - 'odbc_primarykeys' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string'], - 'odbc_procedurecolumns' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'procedure'=>'string', 'column'=>'string'], - 'odbc_procedures' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'procedure'=>'string'], - 'odbc_result' => ['mixed|false', 'statement'=>'resource', 'field'=>'mixed'], - 'odbc_result_all' => ['int|false', 'statement'=>'resource', 'format='=>'string'], - 'odbc_rollback' => ['bool', 'odbc'=>'resource'], - 'odbc_setoption' => ['bool', 'odbc'=>'resource', 'which'=>'int', 'option'=>'int', 'value'=>'int'], - 'odbc_specialcolumns' => ['resource|false', 'odbc'=>'resource', 'type'=>'int', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'scope'=>'int', 'nullable'=>'int'], - 'odbc_statistics' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'unique'=>'int', 'accuracy'=>'int'], - 'odbc_tableprivileges' => ['resource|false', 'odbc'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string'], - 'odbc_tables' => ['resource|false', 'odbc'=>'resource', 'catalog='=>'string', 'schema='=>'string', 'table='=>'string', 'types='=>'string'], - 'opcache_compile_file' => ['bool', 'filename'=>'string'], - 'opcache_get_configuration' => ['array'], - 'opcache_get_status' => ['array|false', 'include_scripts='=>'bool'], - 'opcache_invalidate' => ['bool', 'filename'=>'string', 'force='=>'bool'], - 'opcache_is_script_cached' => ['bool', 'filename'=>'string'], - 'opcache_reset' => ['bool'], - 'openal_buffer_create' => ['resource'], - 'openal_buffer_data' => ['bool', 'buffer'=>'resource', 'format'=>'int', 'data'=>'string', 'freq'=>'int'], - 'openal_buffer_destroy' => ['bool', 'buffer'=>'resource'], - 'openal_buffer_get' => ['int', 'buffer'=>'resource', 'property'=>'int'], - 'openal_buffer_loadwav' => ['bool', 'buffer'=>'resource', 'wavfile'=>'string'], - 'openal_context_create' => ['resource', 'device'=>'resource'], - 'openal_context_current' => ['bool', 'context'=>'resource'], - 'openal_context_destroy' => ['bool', 'context'=>'resource'], - 'openal_context_process' => ['bool', 'context'=>'resource'], - 'openal_context_suspend' => ['bool', 'context'=>'resource'], - 'openal_device_close' => ['bool', 'device'=>'resource'], - 'openal_device_open' => ['resource|false', 'device_desc='=>'string'], - 'openal_listener_get' => ['mixed', 'property'=>'int'], - 'openal_listener_set' => ['bool', 'property'=>'int', 'setting'=>'mixed'], - 'openal_source_create' => ['resource'], - 'openal_source_destroy' => ['bool', 'source'=>'resource'], - 'openal_source_get' => ['mixed', 'source'=>'resource', 'property'=>'int'], - 'openal_source_pause' => ['bool', 'source'=>'resource'], - 'openal_source_play' => ['bool', 'source'=>'resource'], - 'openal_source_rewind' => ['bool', 'source'=>'resource'], - 'openal_source_set' => ['bool', 'source'=>'resource', 'property'=>'int', 'setting'=>'mixed'], - 'openal_source_stop' => ['bool', 'source'=>'resource'], - 'openal_stream' => ['resource', 'source'=>'resource', 'format'=>'int', 'rate'=>'int'], - 'opendir' => ['resource|false', 'directory'=>'string', 'context='=>'resource'], - 'openlog' => ['bool', 'prefix'=>'string', 'flags'=>'int', 'facility'=>'int'], - 'openssl_cipher_iv_length' => ['int|false', 'cipher_algo'=>'string'], - 'openssl_csr_export' => ['bool', 'csr'=>'string|resource', '&w_output'=>'string', 'no_text='=>'bool'], - 'openssl_csr_export_to_file' => ['bool', 'csr'=>'string|resource', 'output_filename'=>'string', 'no_text='=>'bool'], - 'openssl_csr_get_public_key' => ['resource|false', 'csr'=>'string|resource', 'short_names='=>'bool'], - 'openssl_csr_get_subject' => ['array|false', 'csr'=>'string|resource', 'short_names='=>'bool'], - 'openssl_csr_new' => ['resource|false', 'distinguished_names'=>'array', '&w_private_key'=>'resource', 'options='=>'array', 'extra_attributes='=>'array'], - 'openssl_csr_sign' => ['resource|false', 'csr'=>'string|resource', 'ca_certificate'=>'string|resource|null', 'private_key'=>'string|resource|array', 'days'=>'int', 'options='=>'array', 'serial='=>'int'], - 'openssl_decrypt' => ['string|false', 'data'=>'string', 'cipher_algo'=>'string', 'passphrase'=>'string', 'options='=>'int', 'iv='=>'string', 'tag='=>'string', 'aad='=>'string'], - 'openssl_dh_compute_key' => ['string|false', 'public_key'=>'string', 'private_key'=>'resource'], - 'openssl_digest' => ['string|false', 'data'=>'string', 'digest_algo'=>'string', 'binary='=>'bool'], - 'openssl_encrypt' => ['string|false', 'data'=>'string', 'cipher_algo'=>'string', 'passphrase'=>'string', 'options='=>'int', 'iv='=>'string', '&w_tag='=>'string', 'aad='=>'string', 'tag_length='=>'int'], - 'openssl_error_string' => ['string|false'], - 'openssl_free_key' => ['void', 'key'=>'resource'], - 'openssl_get_cert_locations' => ['array'], - 'openssl_get_cipher_methods' => ['array', 'aliases='=>'bool'], - 'openssl_get_md_methods' => ['array', 'aliases='=>'bool'], - 'openssl_get_privatekey' => ['resource|false', 'private_key'=>'string', 'passphrase='=>'string'], - 'openssl_get_publickey' => ['resource|false', 'public_key'=>'resource|string'], - 'openssl_open' => ['bool', 'data'=>'string', '&w_output'=>'string', 'encrypted_key'=>'string', 'private_key'=>'string|array|resource', 'cipher_algo='=>'string', 'iv='=>'string'], - 'openssl_pbkdf2' => ['string|false', 'password'=>'string', 'salt'=>'string', 'key_length'=>'int', 'iterations'=>'int', 'digest_algo='=>'string'], - 'openssl_pkcs12_export' => ['bool', 'certificate'=>'string|resource', '&w_output'=>'string', 'private_key'=>'string|array|resource', 'passphrase'=>'string', 'options='=>'array'], - 'openssl_pkcs12_export_to_file' => ['bool', 'certificate'=>'string|resource', 'output_filename'=>'string', 'private_key'=>'string|array|resource', 'passphrase'=>'string', 'options='=>'array'], - 'openssl_pkcs12_read' => ['bool', 'pkcs12'=>'string', '&w_certificates'=>'array', 'passphrase'=>'string'], - 'openssl_pkcs7_decrypt' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource', 'private_key='=>'string|resource|array'], - 'openssl_pkcs7_encrypt' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'cipher_algo='=>'int'], - 'openssl_pkcs7_read' => ['bool', 'input_filename'=>'string', '&w_certificates'=>'array'], - 'openssl_pkcs7_sign' => ['bool', 'input_filename'=>'string', 'output_filename'=>'string', 'certificate'=>'string|resource', 'private_key'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'untrusted_certificates_filename='=>'string'], - 'openssl_pkcs7_verify' => ['bool|int', 'input_filename'=>'string', 'flags'=>'int', 'signers_certificates_filename='=>'string', 'ca_info='=>'array', 'untrusted_certificates_filename='=>'string', 'content='=>'string', 'output_filename='=>'string'], - 'openssl_pkey_export' => ['bool', 'key'=>'resource', '&w_output'=>'string', 'passphrase='=>'string|null', 'options='=>'array'], - 'openssl_pkey_export_to_file' => ['bool', 'key'=>'resource|string|array', 'output_filename'=>'string', 'passphrase='=>'string|null', 'options='=>'array'], - 'openssl_pkey_free' => ['void', 'key'=>'resource'], - 'openssl_pkey_get_details' => ['array|false', 'key'=>'resource'], - 'openssl_pkey_get_private' => ['resource|false', 'private_key'=>'string', 'passphrase='=>'string'], - 'openssl_pkey_get_public' => ['resource|false', 'public_key'=>'resource|string'], - 'openssl_pkey_new' => ['resource|false', 'options='=>'array'], - 'openssl_private_decrypt' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'private_key'=>'string|resource|array', 'padding='=>'int'], - 'openssl_private_encrypt' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'private_key'=>'string|resource|array', 'padding='=>'int'], - 'openssl_public_decrypt' => ['bool', 'data'=>'string', '&w_decrypted_data'=>'string', 'public_key'=>'string|resource', 'padding='=>'int'], - 'openssl_public_encrypt' => ['bool', 'data'=>'string', '&w_encrypted_data'=>'string', 'public_key'=>'string|resource', 'padding='=>'int'], - 'openssl_random_pseudo_bytes' => ['string|false', 'length'=>'int', '&w_strong_result='=>'bool'], - 'openssl_seal' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&w_encrypted_keys'=>'array', 'public_key'=>'array', 'cipher_algo='=>'string', '&rw_iv='=>'string'], - 'openssl_sign' => ['bool', 'data'=>'string', '&w_signature'=>'string', 'private_key'=>'resource|string', 'algorithm='=>'int|string'], - 'openssl_spki_export' => ['?string', 'spki'=>'string'], - 'openssl_spki_export_challenge' => ['?string', 'spki'=>'string'], - 'openssl_spki_new' => ['?string', 'private_key'=>'resource', 'challenge'=>'string', 'digest_algo='=>'int'], - 'openssl_spki_verify' => ['bool', 'spki'=>'string'], - 'openssl_verify' => ['-1|0|1', 'data'=>'string', 'signature'=>'string', 'public_key'=>'resource|string', 'algorithm='=>'int|string'], - 'openssl_x509_check_private_key' => ['bool', 'certificate'=>'string|resource', 'private_key'=>'string|resource|array'], - 'openssl_x509_checkpurpose' => ['bool|int', 'certificate'=>'string|resource', 'purpose'=>'int', 'ca_info='=>'array', 'untrusted_certificates_file='=>'string'], - 'openssl_x509_export' => ['bool', 'certificate'=>'string|resource', '&w_output'=>'string', 'no_text='=>'bool'], - 'openssl_x509_export_to_file' => ['bool', 'certificate'=>'string|resource', 'output_filename'=>'string', 'no_text='=>'bool'], - 'openssl_x509_fingerprint' => ['string|false', 'certificate'=>'string|resource', 'digest_algo='=>'string', 'binary='=>'bool'], - 'openssl_x509_free' => ['void', 'certificate'=>'resource'], - 'openssl_x509_parse' => ['array|false', 'certificate'=>'string|resource', 'short_names='=>'bool'], - 'openssl_x509_read' => ['resource|false', 'certificate'=>'string|resource'], - 'ord' => ['int', 'character'=>'string'], - 'output_add_rewrite_var' => ['bool', 'name'=>'string', 'value'=>'string'], - 'output_cache_disable' => ['void'], - 'output_cache_disable_compression' => ['void'], - 'output_cache_exists' => ['bool', 'key'=>'string', 'lifetime'=>'int'], - 'output_cache_fetch' => ['string', 'key'=>'string', 'function'=>'', 'lifetime'=>'int'], - 'output_cache_get' => ['mixed|false', 'key'=>'string', 'lifetime'=>'int'], - 'output_cache_output' => ['string', 'key'=>'string', 'function'=>'', 'lifetime'=>'int'], - 'output_cache_put' => ['bool', 'key'=>'string', 'data'=>'mixed'], - 'output_cache_remove' => ['bool', 'filename'=>''], - 'output_cache_remove_key' => ['bool', 'key'=>'string'], - 'output_cache_remove_url' => ['bool', 'url'=>'string'], - 'output_cache_stop' => ['void'], - 'output_reset_rewrite_vars' => ['bool'], - 'outputformatObj::getOption' => ['string', 'property_name'=>'string'], - 'outputformatObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'outputformatObj::setOption' => ['void', 'property_name'=>'string', 'new_value'=>'string'], - 'outputformatObj::validate' => ['int'], - 'overload' => ['', 'class_name'=>'string'], - 'override_function' => ['bool', 'function_name'=>'string', 'function_args'=>'string', 'function_code'=>'string'], - 'pack' => ['string|false', 'format'=>'string', '...values='=>'mixed'], - 'parallel\Future::done' => ['bool'], - 'parallel\Future::select' => ['mixed', '&resolving'=>'parallel\Future[]', '&w_resolved'=>'parallel\Future[]', '&w_errored'=>'parallel\Future[]', '&w_timedout='=>'parallel\Future[]', 'timeout='=>'int'], - 'parallel\Future::value' => ['mixed', 'timeout='=>'int'], - 'parallel\Runtime::__construct' => ['void', 'arg'=>'string|array'], - 'parallel\Runtime::__construct\'1' => ['void', 'bootstrap'=>'string', 'configuration'=>'array'], - 'parallel\Runtime::close' => ['void'], - 'parallel\Runtime::kill' => ['void'], - 'parallel\Runtime::run' => ['?parallel\Future', 'closure'=>'Closure', 'args='=>'array'], - 'parle\rlexer::insertMacro' => ['void', 'name'=>'string', 'regex'=>'string'], - 'parse_ini_file' => ['array|false', 'filename'=>'string', 'process_sections='=>'bool', 'scanner_mode='=>'int'], - 'parse_ini_string' => ['array|false', 'ini_string'=>'string', 'process_sections='=>'bool', 'scanner_mode='=>'int'], - 'parse_str' => ['void', 'string'=>'string', '&w_result='=>'array'], - 'parse_url' => ['mixed|false', 'url'=>'string', 'component='=>'int'], - 'parsekit_compile_file' => ['array', 'filename'=>'string', 'errors='=>'array', 'options='=>'int'], - 'parsekit_compile_string' => ['array', 'phpcode'=>'string', 'errors='=>'array', 'options='=>'int'], - 'parsekit_func_arginfo' => ['array', 'function'=>'mixed'], - 'passthru' => ['void', 'command'=>'string', '&w_result_code='=>'int'], - 'password_get_info' => ['array', 'hash'=>'string'], - 'password_hash' => ['string|false', 'password'=>'string', 'algo'=>'int', 'options='=>'array'], - 'password_make_salt' => ['bool', 'password'=>'string', 'hash'=>'string'], - 'password_needs_rehash' => ['bool', 'hash'=>'string', 'algo'=>'int', 'options='=>'array'], - 'password_verify' => ['bool', 'password'=>'string', 'hash'=>'string'], - 'pathinfo' => ['array|string', 'path'=>'string', 'flags='=>'int'], - 'pclose' => ['int', 'handle'=>'resource'], - 'pcnlt_sigwaitinfo' => ['int', 'set'=>'array', '&w_siginfo'=>'array'], - 'pcntl_alarm' => ['int', 'seconds'=>'int'], - 'pcntl_errno' => ['int'], - 'pcntl_exec' => ['null|false', 'path'=>'string', 'args='=>'array', 'env_vars='=>'array'], - 'pcntl_fork' => ['int'], - 'pcntl_get_last_error' => ['int'], - 'pcntl_getpriority' => ['int', 'process_id='=>'int', 'mode='=>'int'], - 'pcntl_setpriority' => ['bool', 'priority'=>'int', 'process_id='=>'int', 'mode='=>'int'], - 'pcntl_signal' => ['bool', 'signal'=>'int', 'handler'=>'callable():void|callable(int):void|callable(int,array):void|int', 'restart_syscalls='=>'bool'], - 'pcntl_signal_dispatch' => ['bool'], - 'pcntl_sigprocmask' => ['bool', 'mode'=>'int', 'signals'=>'array', '&w_old_signals='=>'array'], - 'pcntl_sigtimedwait' => ['int', 'signals'=>'array', '&w_info='=>'array', 'seconds='=>'int', 'nanoseconds='=>'int'], - 'pcntl_sigwaitinfo' => ['int', 'signals'=>'array', '&w_info='=>'array'], - 'pcntl_strerror' => ['string|false', 'error_code'=>'int'], - 'pcntl_wait' => ['int', '&w_status'=>'int', 'flags='=>'int', '&w_resource_usage='=>'array'], - 'pcntl_waitpid' => ['int', 'process_id'=>'int', '&w_status'=>'int', 'flags='=>'int', '&w_resource_usage='=>'array'], - 'pcntl_wexitstatus' => ['int', 'status'=>'int'], - 'pcntl_wifcontinued' => ['bool', 'status'=>'int'], - 'pcntl_wifexited' => ['bool', 'status'=>'int'], - 'pcntl_wifsignaled' => ['bool', 'status'=>'int'], - 'pcntl_wifstopped' => ['bool', 'status'=>'int'], - 'pcntl_wstopsig' => ['int', 'status'=>'int'], - 'pcntl_wtermsig' => ['int', 'status'=>'int'], - 'pdo_drivers' => ['array'], - 'pfsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float'], - 'pg_affected_rows' => ['int', 'result'=>'resource'], - 'pg_cancel_query' => ['bool', 'connection'=>'resource'], - 'pg_client_encoding' => ['string', 'connection='=>'resource'], - 'pg_close' => ['bool', 'connection='=>'resource'], - 'pg_connect' => ['resource|false', 'connection_string'=>'string', 'flags='=>'int'], - 'pg_connect_poll' => ['int', 'connection'=>'resource'], - 'pg_connection_busy' => ['bool', 'connection'=>'resource'], - 'pg_connection_reset' => ['bool', 'connection'=>'resource'], - 'pg_connection_status' => ['int', 'connection'=>'resource'], - 'pg_consume_input' => ['bool', 'connection'=>'resource'], - 'pg_convert' => ['array|false', 'connection'=>'resource', 'table_name'=>'string', 'values'=>'array', 'flags='=>'int'], - 'pg_copy_from' => ['bool', 'connection'=>'resource', 'table_name'=>'string', 'rows'=>'array', 'separator='=>'string', 'null_as='=>'string'], - 'pg_copy_to' => ['array|false', 'connection'=>'resource', 'table_name'=>'string', 'separator='=>'string', 'null_as='=>'string'], - 'pg_dbname' => ['string', 'connection='=>'resource'], - 'pg_delete' => ['string|bool', 'connection'=>'resource', 'table_name'=>'string', 'conditions'=>'array', 'flags='=>'int'], - 'pg_end_copy' => ['bool', 'connection='=>'resource'], - 'pg_escape_bytea' => ['string', 'connection'=>'resource', 'string'=>'string'], - 'pg_escape_bytea\'1' => ['string', 'connection'=>'string'], - 'pg_escape_identifier' => ['string|false', 'connection'=>'resource', 'string'=>'string'], - 'pg_escape_identifier\'1' => ['string|false', 'connection'=>'string'], - 'pg_escape_literal' => ['string|false', 'connection'=>'resource', 'string'=>'string'], - 'pg_escape_literal\'1' => ['string|false', 'connection'=>'string'], - 'pg_escape_string' => ['string', 'connection'=>'resource', 'string'=>'string'], - 'pg_escape_string\'1' => ['string', 'connection'=>'string'], - 'pg_exec' => ['resource|false', 'connection'=>'resource', 'query'=>'string'], - 'pg_execute' => ['resource|false', 'connection'=>'resource', 'statement_name'=>'string', 'params'=>'array'], - 'pg_execute\'1' => ['resource|false', 'connection'=>'string', 'statement_name'=>'array'], - 'pg_fetch_all' => ['array', 'result'=>'resource'], - 'pg_fetch_all_columns' => ['array', 'result'=>'resource', 'field='=>'int'], - 'pg_fetch_array' => ['array|false', 'result'=>'resource', 'row='=>'?int', 'mode='=>'int'], - 'pg_fetch_assoc' => ['array|false', 'result'=>'resource', 'row='=>'?int'], - 'pg_fetch_object' => ['object|false', 'result'=>'resource', 'row='=>'?int', 'class='=>'string', 'constructor_args='=>'array'], - 'pg_fetch_result' => ['string|false|null', 'result'=>'resource', 'row'=>'string|int'], - 'pg_fetch_result\'1' => ['string|false|null', 'result'=>'resource', 'row'=>'?int', 'field'=>'string|int'], - 'pg_fetch_row' => ['array|false', 'result'=>'resource', 'row='=>'?int', 'mode='=>'int'], - 'pg_field_is_null' => ['int|false', 'result'=>'resource', 'row'=>'string|int'], - 'pg_field_is_null\'1' => ['int|false', 'result'=>'resource', 'row'=>'int', 'field'=>'string|int'], - 'pg_field_name' => ['string', 'result'=>'resource', 'field'=>'int'], - 'pg_field_num' => ['int', 'result'=>'resource', 'field'=>'string'], - 'pg_field_prtlen' => ['int|false', 'result'=>'resource', 'row'=>'string|int'], - 'pg_field_prtlen\'1' => ['int|false', 'result'=>'resource', 'row'=>'int', 'field'=>'string|int'], - 'pg_field_size' => ['int', 'result'=>'resource', 'field'=>'int'], - 'pg_field_table' => ['string|int|false', 'result'=>'resource', 'field'=>'int', 'oid_only='=>'bool'], - 'pg_field_type' => ['string', 'result'=>'resource', 'field'=>'int'], - 'pg_field_type_oid' => ['int|string', 'result'=>'resource', 'field'=>'int'], - 'pg_flush' => ['int|bool', 'connection'=>'resource'], - 'pg_free_result' => ['bool', 'result'=>'resource'], - 'pg_get_notify' => ['array|false', 'result'=>'resource', 'mode='=>'int'], - 'pg_get_pid' => ['int', 'connection'=>'resource'], - 'pg_get_result' => ['resource|false', 'connection='=>'resource'], - 'pg_host' => ['string', 'connection='=>'resource'], - 'pg_insert' => ['resource|string|false', 'connection'=>'resource', 'table_name'=>'string', 'values'=>'array', 'flags='=>'int'], - 'pg_last_error' => ['string', 'connection='=>'resource'], - 'pg_last_notice' => ['string|array|bool', 'connection'=>'resource', 'mode='=>'int'], - 'pg_last_oid' => ['string|int|false', 'result'=>'resource'], - 'pg_lo_close' => ['bool', 'lob'=>'resource'], - 'pg_lo_create' => ['int|string|false', 'connection='=>'resource', 'oid='=>'int|string'], - 'pg_lo_export' => ['bool', 'connection'=>'resource', 'oid'=>'int|string', 'filename'=>'string'], - 'pg_lo_export\'1' => ['bool', 'connection'=>'int|string', 'oid'=>'string'], - 'pg_lo_import' => ['int|string|false', 'connection'=>'resource', 'filename'=>'string', 'oid'=>'string|int'], - 'pg_lo_import\'1' => ['int|string|false', 'connection'=>'string', 'filename'=>'string|int'], - 'pg_lo_open' => ['resource|false', 'connection'=>'resource', 'oid'=>'int|string', 'mode'=>'string'], - 'pg_lo_open\'1' => ['resource|false', 'connection'=>'int|string', 'oid'=>'string'], - 'pg_lo_read' => ['string|false', 'lob'=>'resource', 'length='=>'int'], - 'pg_lo_read_all' => ['int', 'lob'=>'resource'], - 'pg_lo_seek' => ['bool', 'lob'=>'resource', 'offset'=>'int', 'whence='=>'int'], - 'pg_lo_tell' => ['int', 'lob'=>'resource'], - 'pg_lo_truncate' => ['bool', 'lob'=>'resource', 'size'=>'int'], - 'pg_lo_unlink' => ['bool', 'connection'=>'resource', 'oid'=>'int|string'], - 'pg_lo_unlink\'1' => ['bool', 'connection'=>'int|string'], - 'pg_lo_write' => ['int|false', 'lob'=>'resource', 'data'=>'string', 'length='=>'int'], - 'pg_meta_data' => ['array|false', 'connection'=>'resource', 'table_name'=>'string', 'extended='=>'bool'], - 'pg_num_fields' => ['int', 'result'=>'resource'], - 'pg_num_rows' => ['int', 'result'=>'resource'], - 'pg_options' => ['string', 'connection='=>'resource'], - 'pg_parameter_status' => ['string|false', 'connection'=>'resource', 'name'=>'string'], - 'pg_parameter_status\'1' => ['string|false', 'connection'=>'string'], - 'pg_pconnect' => ['resource|false', 'connection_string'=>'string', 'flags='=>'string', 'port='=>'string|int', 'options='=>'string', 'tty='=>'string', 'database='=>'string'], - 'pg_ping' => ['bool', 'connection='=>'resource'], - 'pg_port' => ['int', 'connection='=>'resource'], - 'pg_prepare' => ['resource|false', 'connection'=>'resource', 'statement_name'=>'string', 'query'=>'string'], - 'pg_prepare\'1' => ['resource|false', 'connection'=>'string', 'statement_name'=>'string'], - 'pg_put_line' => ['bool', 'connection'=>'resource', 'data'=>'string'], - 'pg_put_line\'1' => ['bool', 'connection'=>'string'], - 'pg_query' => ['resource|false', 'connection'=>'resource', 'query'=>'string'], - 'pg_query\'1' => ['resource|false', 'connection'=>'string'], - 'pg_query_params' => ['resource|false', 'connection'=>'resource', 'query'=>'string', 'params'=>'array'], - 'pg_query_params\'1' => ['resource|false', 'connection'=>'string', 'query'=>'array'], - 'pg_result_error' => ['string|false', 'result'=>'resource'], - 'pg_result_error_field' => ['string|false|null', 'result'=>'resource', 'field_code'=>'int'], - 'pg_result_seek' => ['bool', 'result'=>'resource', 'row'=>'int'], - 'pg_result_status' => ['string|int', 'result'=>'resource', 'mode='=>'int'], - 'pg_select' => ['string|array|false', 'connection'=>'resource', 'table_name'=>'string', 'assoc_array'=>'array', 'options='=>'int'], - 'pg_send_execute' => ['bool|int', 'connection'=>'resource', 'query'=>'string', 'params'=>'array'], - 'pg_send_prepare' => ['bool|int', 'connection'=>'resource', 'statement_name'=>'string', 'query'=>'string'], - 'pg_send_query' => ['bool|int', 'connection'=>'resource', 'query'=>'string'], - 'pg_send_query_params' => ['bool|int', 'connection'=>'resource', 'query'=>'string', 'params'=>'array'], - 'pg_set_client_encoding' => ['int', 'connection'=>'resource', 'encoding'=>'string'], - 'pg_set_client_encoding\'1' => ['int', 'connection'=>'string'], - 'pg_set_error_verbosity' => ['int|false', 'connection'=>'resource', 'verbosity'=>'int'], - 'pg_set_error_verbosity\'1' => ['int|false', 'connection'=>'int'], - 'pg_socket' => ['resource|false', 'connection'=>'resource'], - 'pg_trace' => ['bool', 'filename'=>'string', 'mode='=>'string', 'connection='=>'resource'], - 'pg_transaction_status' => ['int', 'connection'=>'resource'], - 'pg_tty' => ['string', 'connection='=>'resource'], - 'pg_unescape_bytea' => ['string', 'string'=>'string'], - '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'], - 'phdfs::copy' => ['bool', 'source_file'=>'string', 'destination_file'=>'string'], - 'phdfs::create_directory' => ['bool', 'path'=>'string'], - 'phdfs::delete' => ['bool', 'path'=>'string'], - 'phdfs::disconnect' => ['bool'], - 'phdfs::exists' => ['bool', 'path'=>'string'], - 'phdfs::file_info' => ['array', 'path'=>'string'], - 'phdfs::list_directory' => ['array', 'path'=>'string'], - 'phdfs::read' => ['string', 'path'=>'string', 'length='=>'string'], - 'phdfs::rename' => ['bool', 'old_path'=>'string', 'new_path'=>'string'], - 'phdfs::tell' => ['int', 'path'=>'string'], - 'phdfs::write' => ['bool', 'path'=>'string', 'buffer'=>'string', 'mode='=>'string'], - 'php_check_syntax' => ['bool', 'filename'=>'string', 'error_message='=>'string'], - 'php_ini_loaded_file' => ['string|false'], - 'php_ini_scanned_files' => ['string|false'], - 'php_logo_guid' => ['string'], - 'php_sapi_name' => ['string'], - 'php_strip_whitespace' => ['string', 'filename'=>'string'], - 'php_uname' => ['string', 'mode='=>'string'], - 'php_user_filter::filter' => ['int', 'in'=>'resource', 'out'=>'resource', '&rw_consumed'=>'int', 'closing'=>'bool'], - 'php_user_filter::onClose' => ['void'], - 'php_user_filter::onCreate' => ['bool'], - 'phpcredits' => ['bool', 'flags='=>'int'], - 'phpdbg_break_file' => ['void', 'file'=>'string', 'line'=>'int'], - 'phpdbg_break_function' => ['void', 'function'=>'string'], - 'phpdbg_break_method' => ['void', 'class'=>'string', 'method'=>'string'], - 'phpdbg_break_next' => ['void'], - 'phpdbg_clear' => ['void'], - 'phpdbg_color' => ['void', 'element'=>'int', 'color'=>'string'], - 'phpdbg_end_oplog' => ['array', 'options='=>'array'], - 'phpdbg_exec' => ['mixed', 'context='=>'string'], - 'phpdbg_get_executable' => ['array', 'options='=>'array'], - 'phpdbg_prompt' => ['void', 'string'=>'string'], - 'phpdbg_start_oplog' => ['void'], - 'phpinfo' => ['bool', 'flags='=>'int'], - 'phpversion' => ['string|false', 'extension='=>'string'], - 'pht\AtomicInteger::__construct' => ['void', 'value='=>'int'], - 'pht\AtomicInteger::dec' => ['void'], - 'pht\AtomicInteger::get' => ['int'], - 'pht\AtomicInteger::inc' => ['void'], - 'pht\AtomicInteger::lock' => ['void'], - 'pht\AtomicInteger::set' => ['void', 'value'=>'int'], - 'pht\AtomicInteger::unlock' => ['void'], - 'pht\HashTable::lock' => ['void'], - 'pht\HashTable::size' => ['int'], - 'pht\HashTable::unlock' => ['void'], - 'pht\Queue::front' => ['mixed'], - 'pht\Queue::lock' => ['void'], - 'pht\Queue::pop' => ['mixed'], - 'pht\Queue::push' => ['void', 'value'=>'mixed'], - 'pht\Queue::size' => ['int'], - 'pht\Queue::unlock' => ['void'], - 'pht\Runnable::run' => ['void'], - 'pht\Vector::__construct' => ['void', 'size='=>'int', 'value='=>'mixed'], - 'pht\Vector::deleteAt' => ['void', 'offset'=>'int'], - 'pht\Vector::insertAt' => ['void', 'value'=>'mixed', 'offset'=>'int'], - 'pht\Vector::lock' => ['void'], - 'pht\Vector::pop' => ['mixed'], - 'pht\Vector::push' => ['void', 'value'=>'mixed'], - 'pht\Vector::resize' => ['void', 'size'=>'int', 'value='=>'mixed'], - 'pht\Vector::shift' => ['mixed'], - 'pht\Vector::size' => ['int'], - 'pht\Vector::unlock' => ['void'], - 'pht\Vector::unshift' => ['void', 'value'=>'mixed'], - 'pht\Vector::updateAt' => ['void', 'value'=>'mixed', 'offset'=>'int'], - 'pht\thread::addClassTask' => ['void', 'className'=>'string', '...ctorArgs='=>'mixed'], - 'pht\thread::addFileTask' => ['void', 'fileName'=>'string', '...globals='=>'mixed'], - 'pht\thread::addFunctionTask' => ['void', 'func'=>'callable', '...funcArgs='=>'mixed'], - 'pht\thread::join' => ['void'], - 'pht\thread::start' => ['void'], - 'pht\thread::taskCount' => ['int'], - 'pht\threaded::lock' => ['void'], - 'pht\threaded::unlock' => ['void'], - 'pi' => ['float'], - 'png2wbmp' => ['bool', 'pngname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'], - 'pointObj::__construct' => ['void'], - 'pointObj::distanceToLine' => ['float', 'p1'=>'pointObj', 'p2'=>'pointObj'], - 'pointObj::distanceToPoint' => ['float', 'poPoint'=>'pointObj'], - 'pointObj::distanceToShape' => ['float', 'shape'=>'shapeObj'], - 'pointObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'], - 'pointObj::ms_newPointObj' => ['pointObj'], - 'pointObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], - 'pointObj::setXY' => ['int', 'x'=>'float', 'y'=>'float', 'm'=>'float'], - 'pointObj::setXYZ' => ['int', 'x'=>'float', 'y'=>'float', 'z'=>'float', 'm'=>'float'], - 'popen' => ['resource|false', 'command'=>'string', 'mode'=>'string'], - 'pos' => ['mixed', 'array'=>'array'], - 'posix_access' => ['bool', 'filename'=>'string', 'flags='=>'int'], - 'posix_ctermid' => ['string|false'], - 'posix_errno' => ['int'], - 'posix_get_last_error' => ['int'], - 'posix_getcwd' => ['string|false'], - 'posix_getegid' => ['int'], - 'posix_geteuid' => ['int'], - 'posix_getgid' => ['int'], - 'posix_getgrgid' => ['array{name: string, passwd: string, gid: int, members: list}|false', 'group_id'=>'int'], - 'posix_getgrnam' => ['array{name: string, passwd: string, gid: int, members: list}|false', 'name'=>'string'], - 'posix_getgroups' => ['list|false'], - 'posix_getlogin' => ['string|false'], - 'posix_getpgid' => ['int|false', 'process_id'=>'int'], - 'posix_getpgrp' => ['int'], - 'posix_getpid' => ['int'], - 'posix_getppid' => ['int'], - 'posix_getpwnam' => ['array{name: string, passwd: string, uid: int, gid: int, gecos: string, dir: string, shell: string}|false', 'username'=>'string'], - 'posix_getpwuid' => ['array{name: string, passwd: string, uid: int, gid: int, gecos: string, dir: string, shell: string}|false', 'user_id'=>'int'], - 'posix_getrlimit' => ['array{"soft core": string, "hard core": string, "soft data": string, "hard data": string, "soft stack": integer, "hard stack": string, "soft totalmem": string, "hard totalmem": string, "soft rss": string, "hard rss": string, "soft maxproc": integer, "hard maxproc": integer, "soft memlock": integer, "hard memlock": integer, "soft cpu": string, "hard cpu": string, "soft filesize": string, "hard filesize": string, "soft openfiles": integer, "hard openfiles": integer}|false'], - 'posix_getsid' => ['int|false', 'process_id'=>'int'], - 'posix_getuid' => ['int'], - 'posix_initgroups' => ['bool', 'username'=>'string', 'group_id'=>'int'], - 'posix_isatty' => ['bool', 'file_descriptor'=>'resource|int'], - 'posix_kill' => ['bool', 'process_id'=>'int', 'signal'=>'int'], - 'posix_mkfifo' => ['bool', 'filename'=>'string', 'permissions'=>'int'], - 'posix_mknod' => ['bool', 'filename'=>'string', 'flags'=>'int', 'major='=>'int', 'minor='=>'int'], - 'posix_setegid' => ['bool', 'group_id'=>'int'], - 'posix_seteuid' => ['bool', 'user_id'=>'int'], - 'posix_setgid' => ['bool', 'group_id'=>'int'], - 'posix_setpgid' => ['bool', 'process_id'=>'int', 'process_group_id'=>'int'], - 'posix_setrlimit' => ['bool', 'resource'=>'int', 'soft_limit'=>'int', 'hard_limit'=>'int'], - 'posix_setsid' => ['int'], - 'posix_setuid' => ['bool', 'user_id'=>'int'], - 'posix_strerror' => ['string', 'error_code'=>'int'], - 'posix_times' => ['array{ticks: int, utime: int, stime: int, cutime: int, cstime: int}|false'], - 'posix_ttyname' => ['string|false', 'file_descriptor'=>'resource|int'], - 'posix_uname' => ['array{sysname: string, nodename: string, release: string, version: string, machine: string, domainname: string}|false'], - 'pow' => ['float|int', 'num'=>'int|float', 'exponent'=>'int|float'], - 'preg_filter' => ['null|string|string[]', 'pattern'=>'mixed', 'replacement'=>'mixed', 'subject'=>'mixed', 'limit='=>'int', '&w_count='=>'int'], - 'preg_grep' => ['array|false', 'pattern'=>'string', 'array'=>'array', 'flags='=>'int'], - 'preg_last_error' => ['int'], - 'preg_match' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'string[]', 'flags='=>'0', 'offset='=>'int'], - 'preg_match\'1' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'array', 'flags='=>'int', 'offset='=>'int'], - 'preg_match_all' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_matches='=>'array', 'flags='=>'int', 'offset='=>'int'], - 'preg_quote' => ['string', 'str'=>'string', 'delimiter='=>'string'], - 'preg_replace' => ['string|string[]|null', 'pattern'=>'string|array', 'replacement'=>'string|array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], - 'preg_replace_callback' => ['string|null', 'pattern'=>'string|array', 'callback'=>'callable(string[]):string', 'subject'=>'string', 'limit='=>'int', '&w_count='=>'int'], - 'preg_replace_callback\'1' => ['string[]|null', 'pattern'=>'string|array', 'callback'=>'callable(string[]):string', 'subject'=>'string[]', 'limit='=>'int', '&w_count='=>'int'], - 'preg_replace_callback_array' => ['string|string[]|null', 'pattern'=>'array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], - 'preg_split' => ['list|false', 'pattern'=>'string', 'subject'=>'string', 'limit'=>'int', 'flags='=>'null'], - 'preg_split\'1' => ['list|list>|false', 'pattern'=>'string', 'subject'=>'string', 'limit='=>'int', 'flags='=>'int'], - 'prev' => ['mixed', '&r_array'=>'array|object'], - 'print' => ['int', 'arg'=>'string'], - 'print_r' => ['string', 'value'=>'mixed'], - 'print_r\'1' => ['true', 'value'=>'mixed', 'return='=>'bool'], - 'printf' => ['int', 'format'=>'string', '...values='=>'string|int|float'], - 'proc_close' => ['int', 'process'=>'resource'], - 'proc_get_status' => ['array{command: string, pid: int, running: bool, signaled: bool, stopped: bool, exitcode: int, termsig: int, stopsig: int}|false', 'process'=>'resource'], - 'proc_nice' => ['bool', 'priority'=>'int'], - 'proc_open' => ['resource|false', 'command'=>'string', 'descriptor_spec'=>'array', '&pipes'=>'resource[]', 'cwd='=>'?string', 'env_vars='=>'?array', 'options='=>'?array'], - 'proc_terminate' => ['bool', 'process'=>'resource', 'signal='=>'int'], - 'projectionObj::__construct' => ['void', 'projectionString'=>'string'], - 'projectionObj::getUnits' => ['int'], - 'projectionObj::ms_newProjectionObj' => ['projectionObj', 'projectionString'=>'string'], - 'property_exists' => ['bool', 'object_or_class'=>'object|string', 'property'=>'string'], - 'ps_add_bookmark' => ['int', 'psdoc'=>'resource', 'text'=>'string', 'parent='=>'int', 'open='=>'int'], - 'ps_add_launchlink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'], - 'ps_add_locallink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'page'=>'int', 'dest'=>'string'], - 'ps_add_note' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'contents'=>'string', 'title'=>'string', 'icon'=>'string', 'open'=>'int'], - 'ps_add_pdflink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string', 'page'=>'int', 'dest'=>'string'], - 'ps_add_weblink' => ['bool', 'psdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'url'=>'string'], - 'ps_arc' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'alpha'=>'float', 'beta'=>'float'], - 'ps_arcn' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float', 'alpha'=>'float', 'beta'=>'float'], - 'ps_begin_page' => ['bool', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float'], - 'ps_begin_pattern' => ['int', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float', 'xstep'=>'float', 'ystep'=>'float', 'painttype'=>'int'], - 'ps_begin_template' => ['int', 'psdoc'=>'resource', 'width'=>'float', 'height'=>'float'], - 'ps_circle' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'radius'=>'float'], - 'ps_clip' => ['bool', 'psdoc'=>'resource'], - 'ps_close' => ['bool', 'psdoc'=>'resource'], - 'ps_close_image' => ['void', 'psdoc'=>'resource', 'imageid'=>'int'], - 'ps_closepath' => ['bool', 'psdoc'=>'resource'], - 'ps_closepath_stroke' => ['bool', 'psdoc'=>'resource'], - 'ps_continue_text' => ['bool', 'psdoc'=>'resource', 'text'=>'string'], - 'ps_curveto' => ['bool', 'psdoc'=>'resource', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], - 'ps_delete' => ['bool', 'psdoc'=>'resource'], - 'ps_end_page' => ['bool', 'psdoc'=>'resource'], - 'ps_end_pattern' => ['bool', 'psdoc'=>'resource'], - 'ps_end_template' => ['bool', 'psdoc'=>'resource'], - 'ps_fill' => ['bool', 'psdoc'=>'resource'], - 'ps_fill_stroke' => ['bool', 'psdoc'=>'resource'], - 'ps_findfont' => ['int', 'psdoc'=>'resource', 'fontname'=>'string', 'encoding'=>'string', 'embed='=>'bool'], - 'ps_get_buffer' => ['string', 'psdoc'=>'resource'], - 'ps_get_parameter' => ['string', 'psdoc'=>'resource', 'name'=>'string', 'modifier='=>'float'], - 'ps_get_value' => ['float', 'psdoc'=>'resource', 'name'=>'string', 'modifier='=>'float'], - 'ps_hyphenate' => ['array', 'psdoc'=>'resource', 'text'=>'string'], - 'ps_include_file' => ['bool', 'psdoc'=>'resource', 'file'=>'string'], - 'ps_lineto' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], - 'ps_makespotcolor' => ['int', 'psdoc'=>'resource', 'name'=>'string', 'reserved='=>'int'], - 'ps_moveto' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], - 'ps_new' => ['resource'], - 'ps_open_file' => ['bool', 'psdoc'=>'resource', 'filename='=>'string'], - 'ps_open_image' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'source'=>'string', 'data'=>'string', 'length'=>'int', 'width'=>'int', 'height'=>'int', 'components'=>'int', 'bpc'=>'int', 'params'=>'string'], - 'ps_open_image_file' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'filename'=>'string', 'stringparam='=>'string', 'intparam='=>'int'], - 'ps_open_memory_image' => ['int', 'psdoc'=>'resource', 'gd'=>'int'], - 'ps_place_image' => ['bool', 'psdoc'=>'resource', 'imageid'=>'int', 'x'=>'float', 'y'=>'float', 'scale'=>'float'], - 'ps_rect' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float'], - 'ps_restore' => ['bool', 'psdoc'=>'resource'], - 'ps_rotate' => ['bool', 'psdoc'=>'resource', 'rot'=>'float'], - 'ps_save' => ['bool', 'psdoc'=>'resource'], - 'ps_scale' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], - 'ps_set_border_color' => ['bool', 'psdoc'=>'resource', 'red'=>'float', 'green'=>'float', 'blue'=>'float'], - 'ps_set_border_dash' => ['bool', 'psdoc'=>'resource', 'black'=>'float', 'white'=>'float'], - 'ps_set_border_style' => ['bool', 'psdoc'=>'resource', 'style'=>'string', 'width'=>'float'], - 'ps_set_info' => ['bool', 'p'=>'resource', 'key'=>'string', 'value'=>'string'], - 'ps_set_parameter' => ['bool', 'psdoc'=>'resource', 'name'=>'string', 'value'=>'string'], - 'ps_set_text_pos' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], - 'ps_set_value' => ['bool', 'psdoc'=>'resource', 'name'=>'string', 'value'=>'float'], - 'ps_setcolor' => ['bool', 'psdoc'=>'resource', 'type'=>'string', 'colorspace'=>'string', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float'], - 'ps_setdash' => ['bool', 'psdoc'=>'resource', 'on'=>'float', 'off'=>'float'], - 'ps_setflat' => ['bool', 'psdoc'=>'resource', 'value'=>'float'], - 'ps_setfont' => ['bool', 'psdoc'=>'resource', 'fontid'=>'int', 'size'=>'float'], - 'ps_setgray' => ['bool', 'psdoc'=>'resource', 'gray'=>'float'], - 'ps_setlinecap' => ['bool', 'psdoc'=>'resource', 'type'=>'int'], - 'ps_setlinejoin' => ['bool', 'psdoc'=>'resource', 'type'=>'int'], - 'ps_setlinewidth' => ['bool', 'psdoc'=>'resource', 'width'=>'float'], - 'ps_setmiterlimit' => ['bool', 'psdoc'=>'resource', 'value'=>'float'], - 'ps_setoverprintmode' => ['bool', 'psdoc'=>'resource', 'mode'=>'int'], - 'ps_setpolydash' => ['bool', 'psdoc'=>'resource', 'arr'=>'float'], - 'ps_shading' => ['int', 'psdoc'=>'resource', 'type'=>'string', 'x0'=>'float', 'y0'=>'float', 'x1'=>'float', 'y1'=>'float', 'c1'=>'float', 'c2'=>'float', 'c3'=>'float', 'c4'=>'float', 'optlist'=>'string'], - 'ps_shading_pattern' => ['int', 'psdoc'=>'resource', 'shadingid'=>'int', 'optlist'=>'string'], - 'ps_shfill' => ['bool', 'psdoc'=>'resource', 'shadingid'=>'int'], - 'ps_show' => ['bool', 'psdoc'=>'resource', 'text'=>'string'], - 'ps_show2' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'length'=>'int'], - 'ps_show_boxed' => ['int', 'psdoc'=>'resource', 'text'=>'string', 'left'=>'float', 'bottom'=>'float', 'width'=>'float', 'height'=>'float', 'hmode'=>'string', 'feature='=>'string'], - 'ps_show_xy' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'x'=>'float', 'y'=>'float'], - 'ps_show_xy2' => ['bool', 'psdoc'=>'resource', 'text'=>'string', 'length'=>'int', 'xcoor'=>'float', 'ycoor'=>'float'], - 'ps_string_geometry' => ['array', 'psdoc'=>'resource', 'text'=>'string', 'fontid='=>'int', 'size='=>'float'], - 'ps_stringwidth' => ['float', 'psdoc'=>'resource', 'text'=>'string', 'fontid='=>'int', 'size='=>'float'], - 'ps_stroke' => ['bool', 'psdoc'=>'resource'], - 'ps_symbol' => ['bool', 'psdoc'=>'resource', 'ord'=>'int'], - 'ps_symbol_name' => ['string', 'psdoc'=>'resource', 'ord'=>'int', 'fontid='=>'int'], - 'ps_symbol_width' => ['float', 'psdoc'=>'resource', 'ord'=>'int', 'fontid='=>'int', 'size='=>'float'], - 'ps_translate' => ['bool', 'psdoc'=>'resource', 'x'=>'float', 'y'=>'float'], - 'pspell_add_to_personal' => ['bool', 'dictionary'=>'int', 'word'=>'string'], - 'pspell_add_to_session' => ['bool', 'dictionary'=>'int', 'word'=>'string'], - 'pspell_check' => ['bool', 'dictionary'=>'int', 'word'=>'string'], - 'pspell_clear_session' => ['bool', 'dictionary'=>'int'], - 'pspell_config_create' => ['int|false', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string'], - 'pspell_config_data_dir' => ['bool', 'config'=>'int', 'directory'=>'string'], - 'pspell_config_dict_dir' => ['bool', 'config'=>'int', 'directory'=>'string'], - 'pspell_config_ignore' => ['bool', 'config'=>'int', 'min_length'=>'int'], - 'pspell_config_mode' => ['bool', 'config'=>'int', 'mode'=>'int'], - 'pspell_config_personal' => ['bool', 'config'=>'int', 'filename'=>'string'], - 'pspell_config_repl' => ['bool', 'config'=>'int', 'filename'=>'string'], - 'pspell_config_runtogether' => ['bool', 'config'=>'int', 'allow'=>'bool'], - 'pspell_config_save_repl' => ['bool', 'config'=>'int', 'save'=>'bool'], - 'pspell_new' => ['int|false', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string', 'mode='=>'int'], - 'pspell_new_config' => ['int|false', 'config'=>'int'], - 'pspell_new_personal' => ['int|false', 'filename'=>'string', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string', 'mode='=>'int'], - 'pspell_save_wordlist' => ['bool', 'dictionary'=>'int'], - 'pspell_store_replacement' => ['bool', 'dictionary'=>'int', 'misspelled'=>'string', 'correct'=>'string'], - 'pspell_suggest' => ['array', 'dictionary'=>'int', 'word'=>'string'], - 'putenv' => ['bool', 'assignment'=>'string'], - 'px_close' => ['bool', 'pxdoc'=>'resource'], - 'px_create_fp' => ['bool', 'pxdoc'=>'resource', 'file'=>'resource', 'fielddesc'=>'array'], - 'px_date2string' => ['string', 'pxdoc'=>'resource', 'value'=>'int', 'format'=>'string'], - 'px_delete' => ['bool', 'pxdoc'=>'resource'], - 'px_delete_record' => ['bool', 'pxdoc'=>'resource', 'num'=>'int'], - 'px_get_field' => ['array', 'pxdoc'=>'resource', 'fieldno'=>'int'], - 'px_get_info' => ['array', 'pxdoc'=>'resource'], - 'px_get_parameter' => ['string', 'pxdoc'=>'resource', 'name'=>'string'], - 'px_get_record' => ['array', 'pxdoc'=>'resource', 'num'=>'int', 'mode='=>'int'], - 'px_get_schema' => ['array', 'pxdoc'=>'resource', 'mode='=>'int'], - 'px_get_value' => ['float', 'pxdoc'=>'resource', 'name'=>'string'], - 'px_insert_record' => ['int', 'pxdoc'=>'resource', 'data'=>'array'], - 'px_new' => ['resource'], - 'px_numfields' => ['int', 'pxdoc'=>'resource'], - 'px_numrecords' => ['int', 'pxdoc'=>'resource'], - 'px_open_fp' => ['bool', 'pxdoc'=>'resource', 'file'=>'resource'], - 'px_put_record' => ['bool', 'pxdoc'=>'resource', 'record'=>'array', 'recpos='=>'int'], - 'px_retrieve_record' => ['array', 'pxdoc'=>'resource', 'num'=>'int', 'mode='=>'int'], - 'px_set_blob_file' => ['bool', 'pxdoc'=>'resource', 'filename'=>'string'], - 'px_set_parameter' => ['bool', 'pxdoc'=>'resource', 'name'=>'string', 'value'=>'string'], - 'px_set_tablename' => ['void', 'pxdoc'=>'resource', 'name'=>'string'], - 'px_set_targetencoding' => ['bool', 'pxdoc'=>'resource', 'encoding'=>'string'], - 'px_set_value' => ['bool', 'pxdoc'=>'resource', 'name'=>'string', 'value'=>'float'], - 'px_timestamp2string' => ['string', 'pxdoc'=>'resource', 'value'=>'float', 'format'=>'string'], - 'px_update_record' => ['bool', 'pxdoc'=>'resource', 'data'=>'array', 'num'=>'int'], - 'qdom_error' => ['string'], - 'qdom_tree' => ['QDomDocument', 'doc'=>'string'], - 'querymapObj::convertToString' => ['string'], - 'querymapObj::free' => ['void'], - 'querymapObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'querymapObj::updateFromString' => ['int', 'snippet'=>'string'], - 'quoted_printable_decode' => ['string', 'string'=>'string'], - 'quoted_printable_encode' => ['string', 'string'=>'string'], - 'quotemeta' => ['string', 'string'=>'string'], - 'rad2deg' => ['float', 'num'=>'float'], - 'radius_acct_open' => ['resource|false'], - 'radius_add_server' => ['bool', 'radius_handle'=>'resource', 'hostname'=>'string', 'port'=>'int', 'secret'=>'string', 'timeout'=>'int', 'max_tries'=>'int'], - 'radius_auth_open' => ['resource|false'], - 'radius_close' => ['bool', 'radius_handle'=>'resource'], - 'radius_config' => ['bool', 'radius_handle'=>'resource', 'file'=>'string'], - 'radius_create_request' => ['bool', 'radius_handle'=>'resource', 'type'=>'int'], - 'radius_cvt_addr' => ['string', 'data'=>'string'], - 'radius_cvt_int' => ['int', 'data'=>'string'], - 'radius_cvt_string' => ['string', 'data'=>'string'], - 'radius_demangle' => ['string', 'radius_handle'=>'resource', 'mangled'=>'string'], - 'radius_demangle_mppe_key' => ['string', 'radius_handle'=>'resource', 'mangled'=>'string'], - 'radius_get_attr' => ['mixed', 'radius_handle'=>'resource'], - 'radius_get_tagged_attr_data' => ['string', 'data'=>'string'], - 'radius_get_tagged_attr_tag' => ['int', 'data'=>'string'], - 'radius_get_vendor_attr' => ['array', 'data'=>'string'], - 'radius_put_addr' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'addr'=>'string'], - 'radius_put_attr' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'string'], - 'radius_put_int' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'int'], - 'radius_put_string' => ['bool', 'radius_handle'=>'resource', 'type'=>'int', 'value'=>'string'], - 'radius_put_vendor_addr' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'addr'=>'string'], - 'radius_put_vendor_attr' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'string'], - 'radius_put_vendor_int' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'int'], - 'radius_put_vendor_string' => ['bool', 'radius_handle'=>'resource', 'vendor'=>'int', 'type'=>'int', 'value'=>'string'], - 'radius_request_authenticator' => ['string', 'radius_handle'=>'resource'], - 'radius_salt_encrypt_attr' => ['string', 'radius_handle'=>'resource', 'data'=>'string'], - 'radius_send_request' => ['int|false', 'radius_handle'=>'resource'], - 'radius_server_secret' => ['string', 'radius_handle'=>'resource'], - 'radius_strerror' => ['string', 'radius_handle'=>'resource'], - 'rand' => ['int', 'min'=>'int', 'max'=>'int'], - 'rand\'1' => ['int'], - 'random_bytes' => ['non-empty-string', 'length'=>'positive-int'], - 'random_int' => ['int', 'min'=>'int', 'max'=>'int'], - 'range' => ['array', 'start'=>'mixed', 'end'=>'mixed', 'step='=>'int|float'], - 'rar_allow_broken_set' => ['bool', 'rarfile'=>'RarArchive', 'allow_broken'=>'bool'], - 'rar_broken_is' => ['bool', 'rarfile'=>'rararchive'], - 'rar_close' => ['bool', 'rarfile'=>'rararchive'], - 'rar_comment_get' => ['string', 'rarfile'=>'rararchive'], - 'rar_entry_get' => ['RarEntry', 'rarfile'=>'RarArchive', 'entryname'=>'string'], - 'rar_list' => ['RarArchive', 'rarfile'=>'rararchive'], - 'rar_open' => ['RarArchive', 'filename'=>'string', 'password='=>'string', 'volume_callback='=>'callable'], - 'rar_solid_is' => ['bool', 'rarfile'=>'rararchive'], - 'rar_wrapper_cache_stats' => ['string'], - 'rawurldecode' => ['string', 'string'=>'string'], - 'rawurlencode' => ['string', 'string'=>'string'], - 'rd_kafka_err2str' => ['string', 'err'=>'int'], - 'rd_kafka_errno' => ['int'], - 'rd_kafka_errno2err' => ['int', 'errnox'=>'int'], - 'rd_kafka_offset_tail' => ['int', 'cnt'=>'int'], - 'read_exif_data' => ['array', 'filename'=>'string', 'sections_needed='=>'string', 'sub_arrays='=>'bool', 'read_thumbnail='=>'bool'], - 'readdir' => ['string|false', 'dir_handle='=>'resource'], - 'readfile' => ['int|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], - 'readgzfile' => ['int|false', 'filename'=>'string', 'use_include_path='=>'int'], - 'readline' => ['string|false', 'prompt='=>'?string'], - 'readline_add_history' => ['bool', 'prompt'=>'string'], - 'readline_callback_handler_install' => ['bool', 'prompt'=>'string', 'callback'=>'callable'], - 'readline_callback_handler_remove' => ['bool'], - 'readline_callback_read_char' => ['void'], - 'readline_clear_history' => ['bool'], - 'readline_completion_function' => ['bool', 'callback'=>'callable'], - 'readline_info' => ['mixed', 'var_name='=>'string', 'value='=>'string|int|bool'], - 'readline_list_history' => ['array'], - 'readline_on_new_line' => ['void'], - 'readline_read_history' => ['bool', 'filename='=>'string'], - 'readline_redisplay' => ['void'], - 'readline_write_history' => ['bool', 'filename='=>'string'], - 'readlink' => ['string|false', 'path'=>'string'], - 'realpath' => ['string|false', 'path'=>'string'], - 'realpath_cache_get' => ['array'], - 'realpath_cache_size' => ['int'], - 'recode' => ['string', 'request'=>'string', 'string'=>'string'], - 'recode_file' => ['bool', 'request'=>'string', 'input'=>'resource', 'output'=>'resource'], - 'recode_string' => ['string|false', 'request'=>'string', 'string'=>'string'], - 'rectObj::__construct' => ['void'], - 'rectObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'], - 'rectObj::fit' => ['float', 'width'=>'int', 'height'=>'int'], - 'rectObj::ms_newRectObj' => ['rectObj'], - 'rectObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], - 'rectObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'rectObj::setextent' => ['void', 'minx'=>'float', 'miny'=>'float', 'maxx'=>'float', 'maxy'=>'float'], - 'register_event_handler' => ['bool', 'event_handler_func'=>'string', 'handler_register_name'=>'string', 'event_type_mask'=>'int'], - 'register_shutdown_function' => ['void', 'callback'=>'callable', '...args='=>'mixed'], - 'register_tick_function' => ['bool', 'callback'=>'callable():void', '...args='=>'mixed'], - 'rename' => ['bool', 'from'=>'string', 'to'=>'string', 'context='=>'resource'], - 'rename_function' => ['bool', 'original_name'=>'string', 'new_name'=>'string'], - 'reset' => ['mixed|false', '&r_array'=>'array|object'], - 'resourcebundle_count' => ['int', 'bundle'=>'ResourceBundle'], - 'resourcebundle_create' => ['?ResourceBundle', 'locale'=>'string', 'bundle'=>'string', 'fallback='=>'bool'], - 'resourcebundle_get' => ['mixed|null', 'bundle'=>'ResourceBundle', 'index'=>'string|int', 'fallback='=>'bool'], - 'resourcebundle_get_error_code' => ['int', 'bundle'=>'ResourceBundle'], - 'resourcebundle_get_error_message' => ['string', 'bundle'=>'ResourceBundle'], - 'resourcebundle_locales' => ['array', 'bundle'=>'string'], - 'restore_error_handler' => ['true'], - 'restore_exception_handler' => ['bool'], - 'restore_include_path' => ['void'], - 'rewind' => ['bool', 'stream'=>'resource'], - 'rewinddir' => ['null|false', 'dir_handle='=>'resource'], - 'rmdir' => ['bool', 'directory'=>'string', 'context='=>'resource'], - 'round' => ['float', 'num'=>'float', 'precision='=>'int', 'mode='=>'int'], - 'rpm_close' => ['bool', 'rpmr'=>'resource'], - 'rpm_get_tag' => ['mixed', 'rpmr'=>'resource', 'tagnum'=>'int'], - 'rpm_is_valid' => ['bool', 'filename'=>'string'], - 'rpm_open' => ['resource|false', 'filename'=>'string'], - 'rpm_version' => ['string'], - 'rpmaddtag' => ['bool', 'tag'=>'int'], - 'rpmdbinfo' => ['array', 'nevr'=>'string', 'full='=>'bool'], - 'rpmdbsearch' => ['array', 'pattern'=>'string', 'rpmtag='=>'int', 'rpmmire='=>'int', 'full='=>'bool'], - 'rpminfo' => ['array', 'path'=>'string', 'full='=>'bool', 'error='=>'string'], - 'rpmvercmp' => ['int', 'evr1'=>'string', 'evr2'=>'string'], - 'rrd_create' => ['bool', 'filename'=>'string', 'options'=>'array'], - 'rrd_disconnect' => ['void'], - 'rrd_error' => ['string'], - 'rrd_fetch' => ['array', 'filename'=>'string', 'options'=>'array'], - 'rrd_first' => ['int|false', 'file'=>'string', 'raaindex='=>'int'], - 'rrd_graph' => ['array|false', 'filename'=>'string', 'options'=>'array'], - 'rrd_info' => ['array|false', 'filename'=>'string'], - 'rrd_last' => ['int', 'filename'=>'string'], - 'rrd_lastupdate' => ['array|false', 'filename'=>'string'], - 'rrd_restore' => ['bool', 'xml_file'=>'string', 'rrd_file'=>'string', 'options='=>'array'], - 'rrd_tune' => ['bool', 'filename'=>'string', 'options'=>'array'], - 'rrd_update' => ['bool', 'filename'=>'string', 'options'=>'array'], - 'rrd_version' => ['string'], - 'rrd_xport' => ['array|false', 'options'=>'array'], - 'rrdc_disconnect' => ['void'], - 'rsort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], - 'rtrim' => ['string', 'string'=>'string', 'characters='=>'string'], - 'runkit7_constant_add' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'new_visibility='=>'int'], - 'runkit7_constant_redefine' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'new_visibility='=>'?int'], - 'runkit7_constant_remove' => ['bool', 'constant_name'=>'string'], - 'runkit7_function_add' => ['bool', 'function_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_doc_comment='=>'?string', 'return_by_reference='=>'?bool', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], - 'runkit7_function_copy' => ['bool', 'source_name'=>'string', 'target_name'=>'string'], - 'runkit7_function_redefine' => ['bool', 'function_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_doc_comment='=>'?string', 'return_by_reference='=>'?bool', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], - 'runkit7_function_remove' => ['bool', 'function_name'=>'string'], - 'runkit7_function_rename' => ['bool', 'source_name'=>'string', 'target_name'=>'string'], - 'runkit7_import' => ['bool', 'filename'=>'string', 'flags='=>'?int'], - 'runkit7_method_add' => ['bool', 'class_name'=>'string', 'method_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_flags='=>'int|null|string', 'flags_or_doc_comment='=>'int|null|string', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], - 'runkit7_method_copy' => ['bool', 'destination_class'=>'string', 'destination_method'=>'string', 'source_class'=>'string', 'source_method='=>'?string'], - 'runkit7_method_redefine' => ['bool', 'class_name'=>'string', 'method_name'=>'string', 'argument_list_or_closure'=>'Closure|string', 'code_or_flags='=>'int|null|string', 'flags_or_doc_comment='=>'int|null|string', 'doc_comment='=>'?string', 'return_type='=>'?string', 'is_strict='=>'?bool'], - 'runkit7_method_remove' => ['bool', 'class_name'=>'string', 'method_name'=>'string'], - 'runkit7_method_rename' => ['bool', 'class_name'=>'string', 'source_method_name'=>'string', 'source_target_name'=>'string'], - 'runkit7_superglobals' => ['array'], - 'runkit7_zval_inspect' => ['array', 'value'=>'mixed'], - 'runkit_class_adopt' => ['bool', 'classname'=>'string', 'parentname'=>'string'], - 'runkit_class_emancipate' => ['bool', 'classname'=>'string'], - 'runkit_constant_add' => ['bool', 'constname'=>'string', 'value'=>'mixed'], - 'runkit_constant_redefine' => ['bool', 'constname'=>'string', 'newvalue'=>'mixed'], - 'runkit_constant_remove' => ['bool', 'constname'=>'string'], - 'runkit_function_add' => ['bool', 'funcname'=>'string', 'arglist'=>'string', 'code'=>'string', 'doccomment='=>'?string'], - 'runkit_function_add\'1' => ['bool', 'funcname'=>'string', 'closure'=>'Closure', 'doccomment='=>'?string'], - 'runkit_function_copy' => ['bool', 'funcname'=>'string', 'targetname'=>'string'], - 'runkit_function_redefine' => ['bool', 'funcname'=>'string', 'arglist'=>'string', 'code'=>'string', 'doccomment='=>'?string'], - 'runkit_function_redefine\'1' => ['bool', 'funcname'=>'string', 'closure'=>'Closure', 'doccomment='=>'?string'], - 'runkit_function_remove' => ['bool', 'funcname'=>'string'], - 'runkit_function_rename' => ['bool', 'funcname'=>'string', 'newname'=>'string'], - 'runkit_import' => ['bool', 'filename'=>'string', 'flags='=>'int'], - 'runkit_lint' => ['bool', 'code'=>'string'], - 'runkit_lint_file' => ['bool', 'filename'=>'string'], - 'runkit_method_add' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int', 'doccomment='=>'?string'], - 'runkit_method_add\'1' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'closure'=>'Closure', 'flags='=>'int', 'doccomment='=>'?string'], - 'runkit_method_copy' => ['bool', 'dclass'=>'string', 'dmethod'=>'string', 'sclass'=>'string', 'smethod='=>'string'], - 'runkit_method_redefine' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int', 'doccomment='=>'?string'], - 'runkit_method_redefine\'1' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'closure'=>'Closure', 'flags='=>'int', 'doccomment='=>'?string'], - 'runkit_method_remove' => ['bool', 'classname'=>'string', 'methodname'=>'string'], - 'runkit_method_rename' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'newname'=>'string'], - 'runkit_return_value_used' => ['bool'], - 'runkit_sandbox_output_handler' => ['mixed', 'sandbox'=>'object', 'callback='=>'mixed'], - 'runkit_superglobals' => ['array'], - 'runkit_zval_inspect' => ['array', 'value'=>'mixed'], - 'scalebarObj::convertToString' => ['string'], - 'scalebarObj::free' => ['void'], - 'scalebarObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'scalebarObj::setImageColor' => ['int', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], - 'scalebarObj::updateFromString' => ['int', 'snippet'=>'string'], - 'scandir' => ['list|false', 'directory'=>'string', 'sorting_order='=>'int', 'context='=>'resource'], - 'seaslog_get_author' => ['string'], - 'seaslog_get_version' => ['string'], - 'sem_acquire' => ['bool', 'semaphore'=>'resource', 'non_blocking='=>'bool'], - 'sem_get' => ['resource|false', 'key'=>'int', 'max_acquire='=>'int', 'permissions='=>'int', 'auto_release='=>'int'], - 'sem_release' => ['bool', 'semaphore'=>'resource'], - 'sem_remove' => ['bool', 'semaphore'=>'resource'], - 'serialize' => ['string', 'value'=>'mixed'], - 'session_abort' => ['bool'], - 'session_cache_expire' => ['int', 'value='=>'int'], - 'session_cache_limiter' => ['string', 'value='=>'string'], - 'session_commit' => ['bool'], - 'session_decode' => ['bool', 'data'=>'string'], - 'session_destroy' => ['bool'], - 'session_encode' => ['string'], - 'session_get_cookie_params' => ['array'], - 'session_id' => ['string|false', 'id='=>'string'], - 'session_is_registered' => ['bool', 'name'=>'string'], - 'session_module_name' => ['string', 'module='=>'string'], - 'session_name' => ['string|false', 'name='=>'string'], - 'session_pgsql_add_error' => ['bool', 'error_level'=>'int', 'error_message='=>'string'], - 'session_pgsql_get_error' => ['array', 'with_error_message='=>'bool'], - 'session_pgsql_get_field' => ['string'], - 'session_pgsql_reset' => ['bool'], - 'session_pgsql_set_field' => ['bool', 'value'=>'string'], - 'session_pgsql_status' => ['array'], - 'session_regenerate_id' => ['bool', 'delete_old_session='=>'bool'], - 'session_register' => ['bool', 'name'=>'mixed', '...args='=>'mixed'], - 'session_register_shutdown' => ['void'], - 'session_reset' => ['bool'], - 'session_save_path' => ['string', 'path='=>'string'], - 'session_set_cookie_params' => ['bool', 'lifetime'=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool'], - 'session_set_save_handler' => ['bool', 'open'=>'callable(string,string):bool', 'close'=>'callable():bool', 'read'=>'callable(string):string', 'write'=>'callable(string,string):bool', 'destroy'=>'callable(string):bool', 'gc'=>'callable(string):bool', 'create_sid='=>'callable():string', 'validate_sid='=>'callable(string):bool', 'update_timestamp='=>'callable(string):bool'], - 'session_set_save_handler\'1' => ['bool', 'open'=>'SessionHandlerInterface', 'close='=>'bool'], - 'session_start' => ['bool', 'options='=>'array'], - 'session_status' => ['int'], - 'session_unregister' => ['bool', 'name'=>'string'], - 'session_unset' => ['bool'], - 'session_write_close' => ['bool'], - 'setLeftFill' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], - 'setLine' => ['void', 'width'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], - 'setRightFill' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], - 'set_error_handler' => ['null|callable(int,string,string=,int=,array=):bool', 'callback'=>'null|callable(int,string,string=,int=,array=):bool', 'error_levels='=>'int'], - 'set_exception_handler' => ['null|callable(Throwable):void', 'callback'=>'null|callable(Throwable):void'], - 'set_file_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], - 'set_include_path' => ['string|false', 'include_path'=>'string'], - 'set_magic_quotes_runtime' => ['bool', 'new_setting'=>'bool'], - 'set_time_limit' => ['bool', 'seconds'=>'int'], - 'setcookie' => ['bool', 'name'=>'string', 'value='=>'string', 'expires='=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool', 'samesite='=>'string', 'url_encode='=>'int'], - 'setlocale' => ['string|false', 'category'=>'int', 'locales'=>'string|0|null', '...rest='=>'string'], - 'setlocale\'1' => ['string|false', 'category'=>'int', 'locales'=>'?array'], - 'setproctitle' => ['void', 'title'=>'string'], - 'setrawcookie' => ['bool', 'name'=>'string', 'value='=>'string', 'expires='=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool'], - 'setthreadtitle' => ['bool', 'title'=>'string'], - 'settype' => ['bool', '&rw_var'=>'mixed', 'type'=>'string'], - 'sha1' => ['string', 'string'=>'string', 'binary='=>'bool'], - 'sha1_file' => ['string|false', 'filename'=>'string', 'binary='=>'bool'], - 'sha256' => ['string', 'string'=>'string', 'raw_output='=>'bool'], - 'sha256_file' => ['string', 'filename'=>'string', 'raw_output='=>'bool'], - 'shapeObj::__construct' => ['void', 'type'=>'int'], - 'shapeObj::add' => ['int', 'line'=>'lineObj'], - 'shapeObj::boundary' => ['shapeObj'], - 'shapeObj::contains' => ['bool', 'point'=>'pointObj'], - 'shapeObj::containsShape' => ['int', 'shape2'=>'shapeObj'], - 'shapeObj::convexhull' => ['shapeObj'], - 'shapeObj::crosses' => ['int', 'shape'=>'shapeObj'], - 'shapeObj::difference' => ['shapeObj', 'shape'=>'shapeObj'], - 'shapeObj::disjoint' => ['int', 'shape'=>'shapeObj'], - 'shapeObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj'], - 'shapeObj::equals' => ['int', 'shape'=>'shapeObj'], - 'shapeObj::free' => ['void'], - 'shapeObj::getArea' => ['float'], - 'shapeObj::getCentroid' => ['pointObj'], - 'shapeObj::getLabelPoint' => ['pointObj'], - 'shapeObj::getLength' => ['float'], - 'shapeObj::getPointUsingMeasure' => ['pointObj', 'm'=>'float'], - 'shapeObj::getValue' => ['string', 'layer'=>'layerObj', 'filedname'=>'string'], - 'shapeObj::intersection' => ['shapeObj', 'shape'=>'shapeObj'], - 'shapeObj::intersects' => ['bool', 'shape'=>'shapeObj'], - 'shapeObj::line' => ['lineObj', 'i'=>'int'], - 'shapeObj::ms_shapeObjFromWkt' => ['shapeObj', 'wkt'=>'string'], - 'shapeObj::overlaps' => ['int', 'shape'=>'shapeObj'], - 'shapeObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'], - 'shapeObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'shapeObj::setBounds' => ['int'], - 'shapeObj::simplify' => ['shapeObj|null', 'tolerance'=>'float'], - 'shapeObj::symdifference' => ['shapeObj', 'shape'=>'shapeObj'], - 'shapeObj::toWkt' => ['string'], - 'shapeObj::topologyPreservingSimplify' => ['shapeObj|null', 'tolerance'=>'float'], - 'shapeObj::touches' => ['int', 'shape'=>'shapeObj'], - 'shapeObj::union' => ['shapeObj', 'shape'=>'shapeObj'], - 'shapeObj::within' => ['int', 'shape2'=>'shapeObj'], - 'shapefileObj::__construct' => ['void', 'filename'=>'string', 'type'=>'int'], - 'shapefileObj::addPoint' => ['int', 'point'=>'pointObj'], - 'shapefileObj::addShape' => ['int', 'shape'=>'shapeObj'], - 'shapefileObj::free' => ['void'], - 'shapefileObj::getExtent' => ['rectObj', 'i'=>'int'], - 'shapefileObj::getPoint' => ['shapeObj', 'i'=>'int'], - 'shapefileObj::getShape' => ['shapeObj', 'i'=>'int'], - 'shapefileObj::getTransformed' => ['shapeObj', 'map'=>'mapObj', 'i'=>'int'], - 'shapefileObj::ms_newShapefileObj' => ['shapefileObj', 'filename'=>'string', 'type'=>'int'], - 'shell_exec' => ['string|false|null', 'command'=>'string'], - 'shm_attach' => ['resource', 'key'=>'int', 'size='=>'int', 'permissions='=>'int'], - 'shm_detach' => ['bool', 'shm'=>'resource'], - 'shm_get_var' => ['mixed', 'shm'=>'resource', 'key'=>'int'], - 'shm_has_var' => ['bool', 'shm'=>'resource', 'key'=>'int'], - 'shm_put_var' => ['bool', 'shm'=>'resource', 'key'=>'int', 'value'=>'mixed'], - 'shm_remove' => ['bool', 'shm'=>'resource'], - 'shm_remove_var' => ['bool', 'shm'=>'resource', 'key'=>'int'], - 'shmop_close' => ['void', 'shmop'=>'resource'], - 'shmop_delete' => ['bool', 'shmop'=>'resource'], - 'shmop_open' => ['resource|false', 'key'=>'int', 'mode'=>'string', 'permissions'=>'int', 'size'=>'int'], - 'shmop_read' => ['string|false', 'shmop'=>'resource', 'offset'=>'int', 'size'=>'int'], - 'shmop_size' => ['int', 'shmop'=>'resource'], - 'shmop_write' => ['int|false', 'shmop'=>'resource', 'data'=>'string', 'offset'=>'int'], - 'show_source' => ['string|bool', 'filename'=>'string', 'return='=>'bool'], - 'shuffle' => ['bool', '&rw_array'=>'array'], - 'signeurlpaiement' => ['string', 'clent'=>'string', 'data'=>'string'], - 'similar_text' => ['int', 'string1'=>'string', 'string2'=>'string', '&w_percent='=>'float'], - 'simplexml_import_dom' => ['SimpleXMLElement|false', 'node'=>'DOMNode', 'class_name='=>'string'], - 'simplexml_load_file' => ['SimpleXMLElement|false', 'filename'=>'string', 'class_name='=>'string', 'options='=>'int', 'namespace_or_prefix='=>'string', 'is_prefix='=>'bool'], - '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'], - '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'], - 'snmp2_real_walk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmp2_set' => ['bool', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmp2_walk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmp3_get' => ['string|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmp3_getnext' => ['string|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmp3_real_walk' => ['array|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmp3_set' => ['bool', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmp3_walk' => ['array|false', 'hostname'=>'string', 'security_name'=>'string', 'security_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'privacy_protocol'=>'string', 'privacy_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmp_get_quick_print' => ['bool'], - 'snmp_get_valueretrieval' => ['int'], - 'snmp_read_mib' => ['bool', 'filename'=>'string'], - 'snmp_set_enum_print' => ['bool', 'enable'=>'int'], - 'snmp_set_oid_numeric_print' => ['void', 'format'=>'int'], - 'snmp_set_oid_output_format' => ['bool', 'format'=>'int'], - 'snmp_set_quick_print' => ['bool', 'enable'=>'bool'], - 'snmp_set_valueretrieval' => ['bool', 'method='=>'int'], - 'snmpget' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmpgetnext' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmprealwalk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmpset' => ['bool', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'mixed', 'timeout='=>'int', 'retries='=>'int'], - 'snmpwalk' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'snmpwalkoid' => ['array|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], - 'socket_accept' => ['resource|false', 'socket'=>'resource'], - 'socket_bind' => ['bool', 'socket'=>'resource', 'addr'=>'string', 'port='=>'int'], - 'socket_clear_error' => ['void', 'socket='=>'resource'], - 'socket_close' => ['void', 'socket'=>'resource'], - 'socket_cmsg_space' => ['int', 'level'=>'int', 'type'=>'int'], - 'socket_connect' => ['bool', 'socket'=>'resource', 'addr'=>'string', 'port='=>'int'], - 'socket_create' => ['resource|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], - 'socket_create_listen' => ['resource|false', 'port'=>'int', 'backlog='=>'int'], - 'socket_create_pair' => ['bool', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int', '&w_fd'=>'resource[]'], - 'socket_export_stream' => ['resource|false', 'socket'=>'resource'], - 'socket_get_option' => ['mixed|false', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int'], - 'socket_get_status' => ['array', 'stream'=>'resource'], - 'socket_getopt' => ['mixed', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int'], - 'socket_getpeername' => ['bool', 'socket'=>'resource', '&w_addr'=>'string', '&w_port='=>'int'], - 'socket_getsockname' => ['bool', 'socket'=>'resource', '&w_addr'=>'string', '&w_port='=>'int'], - 'socket_import_stream' => ['resource|false|null', 'stream'=>'resource'], - 'socket_last_error' => ['int', 'socket='=>'resource'], - 'socket_listen' => ['bool', 'socket'=>'resource', 'backlog='=>'int'], - 'socket_read' => ['string|false', 'socket'=>'resource', 'length'=>'int', 'type='=>'int'], - 'socket_recv' => ['int|false', 'socket'=>'resource', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int'], - 'socket_recvfrom' => ['int|false', 'socket'=>'resource', '&w_buf'=>'string', 'length'=>'int', 'flags'=>'int', '&w_name'=>'string', '&w_port='=>'int'], - 'socket_recvmsg' => ['int|false', 'socket'=>'resource', '&w_message'=>'string', 'flags='=>'int'], - 'socket_select' => ['int|false', '&rw_read_fds'=>'resource[]|null', '&rw_write_fds'=>'resource[]|null', '&rw_except_fds'=>'resource[]|null', 'tv_sec'=>'int|null', 'tv_usec='=>'int'], - 'socket_send' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'length'=>'int', 'flags'=>'int'], - 'socket_sendmsg' => ['int|false', 'socket'=>'resource', 'message'=>'array', 'flags'=>'int'], - 'socket_sendto' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'length'=>'int', 'flags'=>'int', 'addr'=>'string', 'port='=>'int'], - 'socket_set_block' => ['bool', 'socket'=>'resource'], - 'socket_set_blocking' => ['bool', 'socket'=>'resource', 'mode'=>'int'], - 'socket_set_nonblock' => ['bool', 'socket'=>'resource'], - 'socket_set_option' => ['bool', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], - 'socket_set_timeout' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], - 'socket_setopt' => ['void', 'socket'=>'resource', 'level'=>'int', 'optname'=>'int', 'optval'=>'int|string|array'], - 'socket_shutdown' => ['bool', 'socket'=>'resource', 'how='=>'int'], - 'socket_strerror' => ['string', 'errno'=>'int'], - 'socket_write' => ['int|false', 'socket'=>'resource', 'data'=>'string', 'length='=>'int'], - 'solid_fetch_prev' => ['bool', 'result_id'=>''], - 'solr_get_version' => ['string|false'], - 'sort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], - 'soundex' => ['string', 'string'=>'string'], - 'spl_autoload' => ['void', 'class'=>'string', 'file_extensions='=>'string'], - 'spl_autoload_call' => ['void', 'class'=>'string'], - 'spl_autoload_extensions' => ['string', 'file_extensions='=>'string'], - 'spl_autoload_functions' => ['false|list'], - 'spl_autoload_register' => ['bool', 'callback='=>'callable(string):void', 'throw='=>'bool', 'prepend='=>'bool'], - 'spl_autoload_unregister' => ['bool', 'callback'=>'callable(string):void'], - 'spl_classes' => ['array'], - 'spl_object_hash' => ['string', 'object'=>'object'], - 'spl_object_id' => ['int', 'object'=>'object'], - 'sprintf' => ['string', 'format'=>'string', '...values='=>'string|int|float'], - 'sqlite_array_query' => ['array|false', 'dbhandle'=>'resource', 'query'=>'string', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'sqlite_busy_timeout' => ['void', 'dbhandle'=>'resource', 'milliseconds'=>'int'], - 'sqlite_changes' => ['int', 'dbhandle'=>'resource'], - 'sqlite_close' => ['void', 'dbhandle'=>'resource'], - 'sqlite_column' => ['mixed', 'result'=>'resource', 'index_or_name'=>'mixed', 'decode_binary='=>'bool'], - 'sqlite_create_aggregate' => ['void', 'dbhandle'=>'resource', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], - 'sqlite_create_function' => ['void', 'dbhandle'=>'resource', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], - 'sqlite_current' => ['array|false', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'sqlite_error_string' => ['string', 'error_code'=>'int'], - 'sqlite_escape_string' => ['string', 'item'=>'string'], - 'sqlite_exec' => ['bool', 'dbhandle'=>'resource', 'query'=>'string', 'error_msg='=>'string'], - 'sqlite_factory' => ['SQLiteDatabase', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], - 'sqlite_fetch_all' => ['array', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'sqlite_fetch_array' => ['array|false', 'result'=>'resource', 'result_type='=>'int', 'decode_binary='=>'bool'], - 'sqlite_fetch_column_types' => ['array|false', 'table_name'=>'string', 'dbhandle'=>'resource', 'result_type='=>'int'], - 'sqlite_fetch_object' => ['object', 'result'=>'resource', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], - 'sqlite_fetch_single' => ['string', 'result'=>'resource', 'decode_binary='=>'bool'], - 'sqlite_fetch_string' => ['string', 'result'=>'resource', 'decode_binary'=>'bool'], - 'sqlite_field_name' => ['string', 'result'=>'resource', 'field_index'=>'int'], - 'sqlite_has_more' => ['bool', 'result'=>'resource'], - 'sqlite_has_prev' => ['bool', 'result'=>'resource'], - 'sqlite_key' => ['int', 'result'=>'resource'], - 'sqlite_last_error' => ['int', 'dbhandle'=>'resource'], - 'sqlite_last_insert_rowid' => ['int', 'dbhandle'=>'resource'], - 'sqlite_libencoding' => ['string'], - 'sqlite_libversion' => ['string'], - 'sqlite_next' => ['bool', 'result'=>'resource'], - 'sqlite_num_fields' => ['int', 'result'=>'resource'], - 'sqlite_num_rows' => ['int', 'result'=>'resource'], - 'sqlite_open' => ['resource|false', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], - 'sqlite_popen' => ['resource|false', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], - 'sqlite_prev' => ['bool', 'result'=>'resource'], - 'sqlite_query' => ['resource|false', 'dbhandle'=>'resource', 'query'=>'resource|string', 'result_type='=>'int', 'error_msg='=>'string'], - 'sqlite_rewind' => ['bool', 'result'=>'resource'], - 'sqlite_seek' => ['bool', 'result'=>'resource', 'rownum'=>'int'], - 'sqlite_single_query' => ['array', 'db'=>'resource', 'query'=>'string', 'first_row_only='=>'bool', 'decode_binary='=>'bool'], - 'sqlite_udf_decode_binary' => ['string', 'data'=>'string'], - 'sqlite_udf_encode_binary' => ['string', 'data'=>'string'], - 'sqlite_unbuffered_query' => ['SQLiteUnbuffered|false', 'dbhandle'=>'resource', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], - 'sqlite_valid' => ['bool', 'result'=>'resource'], - 'sqlsrv_begin_transaction' => ['bool', 'conn'=>'resource'], - 'sqlsrv_cancel' => ['bool', 'stmt'=>'resource'], - 'sqlsrv_client_info' => ['array|false', 'conn'=>'resource'], - 'sqlsrv_close' => ['bool', 'conn'=>'?resource'], - 'sqlsrv_commit' => ['bool', 'conn'=>'resource'], - 'sqlsrv_configure' => ['bool', 'setting'=>'string', 'value'=>'mixed'], - 'sqlsrv_connect' => ['resource|false', 'serverName'=>'string', 'connectionInfo='=>'array'], - 'sqlsrv_errors' => ['?array', 'errorsOrWarnings='=>'int'], - 'sqlsrv_execute' => ['bool', 'stmt'=>'resource'], - 'sqlsrv_fetch' => ['?bool', 'stmt'=>'resource', 'row='=>'int', 'offset='=>'int'], - 'sqlsrv_fetch_array' => ['array|null|false', 'stmt'=>'resource', 'fetchType='=>'int', 'row='=>'int', 'offset='=>'int'], - 'sqlsrv_fetch_object' => ['object|null|false', 'stmt'=>'resource', 'className='=>'string', 'ctorParams='=>'array', 'row='=>'int', 'offset='=>'int'], - 'sqlsrv_field_metadata' => ['array|false', 'stmt'=>'resource'], - 'sqlsrv_free_stmt' => ['bool', 'stmt'=>'resource'], - 'sqlsrv_get_config' => ['mixed', 'setting'=>'string'], - 'sqlsrv_get_field' => ['mixed', 'stmt'=>'resource', 'fieldIndex'=>'int', 'getAsType='=>'int'], - 'sqlsrv_has_rows' => ['bool', 'stmt'=>'resource'], - 'sqlsrv_next_result' => ['?bool', 'stmt'=>'resource'], - 'sqlsrv_num_fields' => ['int|false', 'stmt'=>'resource'], - 'sqlsrv_num_rows' => ['int|false', 'stmt'=>'resource'], - 'sqlsrv_prepare' => ['resource|false', 'conn'=>'resource', 'sql'=>'string', 'params='=>'array', 'options='=>'array'], - 'sqlsrv_query' => ['resource|false', 'conn'=>'resource', 'sql'=>'string', 'params='=>'array', 'options='=>'array'], - 'sqlsrv_rollback' => ['bool', 'conn'=>'resource'], - 'sqlsrv_rows_affected' => ['int|false', 'stmt'=>'resource'], - 'sqlsrv_send_stream_data' => ['bool', 'stmt'=>'resource'], - 'sqlsrv_server_info' => ['array', 'conn'=>'resource'], - 'sqrt' => ['float', 'num'=>'float'], - 'srand' => ['void', 'seed='=>'int', 'mode='=>'int'], - 'sscanf' => ['list|int|null', 'string'=>'string', 'format'=>'string', '&...w_vars='=>'string|int|float|null'], - 'ssdeep_fuzzy_compare' => ['int', 'signature1'=>'string', 'signature2'=>'string'], - 'ssdeep_fuzzy_hash' => ['string', 'to_hash'=>'string'], - 'ssdeep_fuzzy_hash_filename' => ['string', 'file_name'=>'string'], - 'ssh2_auth_agent' => ['bool', 'session'=>'resource', 'username'=>'string'], - 'ssh2_auth_hostbased_file' => ['bool', 'session'=>'resource', 'username'=>'string', 'hostname'=>'string', 'pubkeyfile'=>'string', 'privkeyfile'=>'string', 'passphrase='=>'string', 'local_username='=>'string'], - 'ssh2_auth_none' => ['bool|string[]', 'session'=>'resource', 'username'=>'string'], - 'ssh2_auth_password' => ['bool', 'session'=>'resource', 'username'=>'string', 'password'=>'string'], - 'ssh2_auth_pubkey_file' => ['bool', 'session'=>'resource', 'username'=>'string', 'pubkeyfile'=>'string', 'privkeyfile'=>'string', 'passphrase='=>'string'], - 'ssh2_connect' => ['resource|false', 'host'=>'string', 'port='=>'int', 'methods='=>'array', 'callbacks='=>'array'], - 'ssh2_disconnect' => ['bool', 'session'=>'resource'], - 'ssh2_exec' => ['resource|false', 'session'=>'resource', 'command'=>'string', 'pty='=>'string', 'env='=>'array', 'width='=>'int', 'height='=>'int', 'width_height_type='=>'int'], - 'ssh2_fetch_stream' => ['resource|false', 'channel'=>'resource', 'streamid'=>'int'], - 'ssh2_fingerprint' => ['string|false', 'session'=>'resource', 'flags='=>'int'], - 'ssh2_forward_accept' => ['resource|false', 'session'=>'resource'], - 'ssh2_forward_listen' => ['resource|false', 'session'=>'resource', 'port'=>'int', 'host='=>'string', 'max_connections='=>'string'], - 'ssh2_methods_negotiated' => ['array|false', 'session'=>'resource'], - 'ssh2_poll' => ['int', '&polldes'=>'array', 'timeout='=>'int'], - 'ssh2_publickey_add' => ['bool', 'pkey'=>'resource', 'algoname'=>'string', 'blob'=>'string', 'overwrite='=>'bool', 'attributes='=>'array'], - 'ssh2_publickey_init' => ['resource|false', 'session'=>'resource'], - 'ssh2_publickey_list' => ['array|false', 'pkey'=>'resource'], - 'ssh2_publickey_remove' => ['bool', 'pkey'=>'resource', 'algoname'=>'string', 'blob'=>'string'], - 'ssh2_scp_recv' => ['bool', 'session'=>'resource', 'remote_file'=>'string', 'local_file'=>'string'], - 'ssh2_scp_send' => ['bool', 'session'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'create_mode='=>'int'], - 'ssh2_sftp' => ['resource|false', 'session'=>'resource'], - 'ssh2_sftp_chmod' => ['bool', 'sftp'=>'resource', 'filename'=>'string', 'mode'=>'int'], - 'ssh2_sftp_lstat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'sftp'=>'resource', 'path'=>'string'], - 'ssh2_sftp_mkdir' => ['bool', 'sftp'=>'resource', 'dirname'=>'string', 'mode='=>'int', 'recursive='=>'bool'], - 'ssh2_sftp_readlink' => ['string|false', 'sftp'=>'resource', 'link'=>'string'], - 'ssh2_sftp_realpath' => ['string|false', 'sftp'=>'resource', 'filename'=>'string'], - 'ssh2_sftp_rename' => ['bool', 'sftp'=>'resource', 'from'=>'string', 'to'=>'string'], - 'ssh2_sftp_rmdir' => ['bool', 'sftp'=>'resource', 'dirname'=>'string'], - 'ssh2_sftp_stat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'sftp'=>'resource', 'path'=>'string'], - 'ssh2_sftp_symlink' => ['bool', 'sftp'=>'resource', 'target'=>'string', 'link'=>'string'], - 'ssh2_sftp_unlink' => ['bool', 'sftp'=>'resource', 'filename'=>'string'], - 'ssh2_shell' => ['resource|false', 'session'=>'resource', 'term_type='=>'string', 'env='=>'array', 'width='=>'int', 'height='=>'int', 'width_height_type='=>'int'], - 'ssh2_tunnel' => ['resource|false', 'session'=>'resource', 'host'=>'string', 'port'=>'int'], - 'stat' => ['array{0: int, 1: int, 2: int, 3: int, 4: int, 5: int, 6: int, 7: int, 8: int, 9: int, 10: int, 11: int, 12: int, dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int}|false', 'filename'=>'string'], - 'stats_absolute_deviation' => ['float', 'a'=>'array'], - 'stats_cdf_beta' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_binomial' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_cauchy' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_chisquare' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], - 'stats_cdf_exponential' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], - 'stats_cdf_f' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_gamma' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_laplace' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_logistic' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_negative_binomial' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_noncentral_chisquare' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_noncentral_f' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'par4'=>'float', 'which'=>'int'], - 'stats_cdf_noncentral_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_normal' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_poisson' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], - 'stats_cdf_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'which'=>'int'], - 'stats_cdf_uniform' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_cdf_weibull' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_covariance' => ['float', 'a'=>'array', 'b'=>'array'], - 'stats_den_uniform' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], - 'stats_dens_beta' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], - 'stats_dens_cauchy' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], - 'stats_dens_chisquare' => ['float', 'x'=>'float', 'dfr'=>'float'], - 'stats_dens_exponential' => ['float', 'x'=>'float', 'scale'=>'float'], - 'stats_dens_f' => ['float', 'x'=>'float', 'dfr1'=>'float', 'dfr2'=>'float'], - 'stats_dens_gamma' => ['float', 'x'=>'float', 'shape'=>'float', 'scale'=>'float'], - 'stats_dens_laplace' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], - 'stats_dens_logistic' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], - 'stats_dens_negative_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], - 'stats_dens_normal' => ['float', 'x'=>'float', 'ave'=>'float', 'stdev'=>'float'], - 'stats_dens_pmf_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], - 'stats_dens_pmf_hypergeometric' => ['float', 'n1'=>'float', 'n2'=>'float', 'N1'=>'float', 'N2'=>'float'], - 'stats_dens_pmf_negative_binomial' => ['float', 'x'=>'float', 'n'=>'float', 'pi'=>'float'], - 'stats_dens_pmf_poisson' => ['float', 'x'=>'float', 'lb'=>'float'], - 'stats_dens_t' => ['float', 'x'=>'float', 'dfr'=>'float'], - 'stats_dens_uniform' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], - 'stats_dens_weibull' => ['float', 'x'=>'float', 'a'=>'float', 'b'=>'float'], - 'stats_harmonic_mean' => ['float', 'a'=>'array'], - 'stats_kurtosis' => ['float', 'a'=>'array'], - 'stats_rand_gen_beta' => ['float', 'a'=>'float', 'b'=>'float'], - 'stats_rand_gen_chisquare' => ['float', 'df'=>'float'], - 'stats_rand_gen_exponential' => ['float', 'av'=>'float'], - 'stats_rand_gen_f' => ['float', 'dfn'=>'float', 'dfd'=>'float'], - 'stats_rand_gen_funiform' => ['float', 'low'=>'float', 'high'=>'float'], - 'stats_rand_gen_gamma' => ['float', 'a'=>'float', 'r'=>'float'], - 'stats_rand_gen_ibinomial' => ['int', 'n'=>'int', 'pp'=>'float'], - 'stats_rand_gen_ibinomial_negative' => ['int', 'n'=>'int', 'p'=>'float'], - 'stats_rand_gen_int' => ['int'], - 'stats_rand_gen_ipoisson' => ['int', 'mu'=>'float'], - 'stats_rand_gen_iuniform' => ['int', 'low'=>'int', 'high'=>'int'], - 'stats_rand_gen_noncenral_chisquare' => ['float', 'df'=>'float', 'xnonc'=>'float'], - 'stats_rand_gen_noncentral_chisquare' => ['float', 'df'=>'float', 'xnonc'=>'float'], - 'stats_rand_gen_noncentral_f' => ['float', 'dfn'=>'float', 'dfd'=>'float', 'xnonc'=>'float'], - 'stats_rand_gen_noncentral_t' => ['float', 'df'=>'float', 'xnonc'=>'float'], - 'stats_rand_gen_normal' => ['float', 'av'=>'float', 'sd'=>'float'], - 'stats_rand_gen_t' => ['float', 'df'=>'float'], - 'stats_rand_get_seeds' => ['array'], - 'stats_rand_phrase_to_seeds' => ['array', 'phrase'=>'string'], - 'stats_rand_ranf' => ['float'], - 'stats_rand_setall' => ['void', 'iseed1'=>'int', 'iseed2'=>'int'], - 'stats_skew' => ['float', 'a'=>'array'], - 'stats_standard_deviation' => ['float', 'a'=>'array', 'sample='=>'bool'], - 'stats_stat_binomial_coef' => ['float', 'x'=>'int', 'n'=>'int'], - 'stats_stat_correlation' => ['float', 'array1'=>'array', 'array2'=>'array'], - 'stats_stat_factorial' => ['float', 'n'=>'int'], - 'stats_stat_gennch' => ['float', 'n'=>'int'], - 'stats_stat_independent_t' => ['float', 'array1'=>'array', 'array2'=>'array'], - 'stats_stat_innerproduct' => ['float', 'array1'=>'array', 'array2'=>'array'], - 'stats_stat_noncentral_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], - 'stats_stat_paired_t' => ['float', 'array1'=>'array', 'array2'=>'array'], - 'stats_stat_percentile' => ['float', 'arr'=>'array', 'perc'=>'float'], - 'stats_stat_powersum' => ['float', 'arr'=>'array', 'power'=>'float'], - 'stats_variance' => ['float', 'a'=>'array', 'sample='=>'bool'], - 'stomp_abort' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], - 'stomp_ack' => ['bool', 'msg'=>'', 'headers='=>'array', 'link='=>''], - 'stomp_begin' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], - 'stomp_close' => ['bool', 'link'=>''], - 'stomp_commit' => ['bool', 'transaction_id'=>'string', 'headers='=>'array', 'link='=>''], - 'stomp_connect' => ['resource', 'broker='=>'string', 'username='=>'string', 'password='=>'string', 'headers='=>'array'], - 'stomp_connect_error' => ['string'], - 'stomp_error' => ['string', 'link'=>''], - 'stomp_get_read_timeout' => ['array', 'link'=>''], - 'stomp_get_session_id' => ['string', 'link'=>''], - 'stomp_has_frame' => ['bool', 'link'=>''], - 'stomp_read_frame' => ['array', 'class_name='=>'string', 'link='=>''], - 'stomp_send' => ['bool', 'destination'=>'string', 'msg'=>'', 'headers='=>'array', 'link='=>''], - 'stomp_set_read_timeout' => ['', 'seconds'=>'int', 'microseconds='=>'int', 'link='=>''], - 'stomp_subscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], - 'stomp_unsubscribe' => ['bool', 'destination'=>'string', 'headers='=>'array', 'link='=>''], - 'stomp_version' => ['string'], - 'str_getcsv' => ['non-empty-list', 'string'=>'string', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'str_ireplace' => ['string|string[]', 'search'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', '&w_count='=>'int'], - 'str_pad' => ['string', 'string'=>'string', 'length'=>'int', 'pad_string='=>'string', 'pad_type='=>'int'], - 'str_repeat' => ['string', 'string'=>'string', 'times'=>'int'], - 'str_replace' => ['string|string[]', 'search'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', '&w_count='=>'int'], - 'str_rot13' => ['string', 'string'=>'string'], - 'str_shuffle' => ['string', 'string'=>'string'], - 'str_split' => ['non-empty-list', 'string'=>'string', 'length='=>'positive-int'], - 'str_word_count' => ['array|int', 'string'=>'string', 'format='=>'int', 'characters='=>'string'], - 'strcasecmp' => ['int', 'string1'=>'string', 'string2'=>'string'], - 'strchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], - 'strcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], - 'strcoll' => ['int', 'string1'=>'string', 'string2'=>'string'], - 'strcspn' => ['int', 'string'=>'string', 'characters'=>'string', 'offset='=>'int', 'length='=>'int'], - 'streamWrapper::__construct' => ['void'], - 'streamWrapper::__destruct' => ['void'], - 'streamWrapper::dir_closedir' => ['bool'], - 'streamWrapper::dir_opendir' => ['bool', 'path'=>'string', 'options'=>'int'], - 'streamWrapper::dir_readdir' => ['string'], - 'streamWrapper::dir_rewinddir' => ['bool'], - 'streamWrapper::mkdir' => ['bool', 'path'=>'string', 'mode'=>'int', 'options'=>'int'], - 'streamWrapper::rename' => ['bool', 'path_from'=>'string', 'path_to'=>'string'], - 'streamWrapper::rmdir' => ['bool', 'path'=>'string', 'options'=>'int'], - 'streamWrapper::stream_cast' => ['resource', 'cast_as'=>'int'], - 'streamWrapper::stream_close' => ['void'], - 'streamWrapper::stream_eof' => ['bool'], - 'streamWrapper::stream_flush' => ['bool'], - 'streamWrapper::stream_lock' => ['bool', 'operation'=>'mode'], - 'streamWrapper::stream_metadata' => ['bool', 'path'=>'string', 'option'=>'int', 'value'=>'mixed'], - 'streamWrapper::stream_open' => ['bool', 'path'=>'string', 'mode'=>'string', 'options'=>'int', 'opened_path'=>'string'], - 'streamWrapper::stream_read' => ['string', 'count'=>'int'], - 'streamWrapper::stream_seek' => ['bool', 'offset'=>'int', 'whence'=>'int'], - 'streamWrapper::stream_set_option' => ['bool', 'option'=>'int', 'arg1'=>'int', 'arg2'=>'int'], - 'streamWrapper::stream_stat' => ['array'], - 'streamWrapper::stream_tell' => ['int'], - 'streamWrapper::stream_truncate' => ['bool', 'new_size'=>'int'], - 'streamWrapper::stream_write' => ['int', 'data'=>'string'], - 'streamWrapper::unlink' => ['bool', 'path'=>'string'], - 'streamWrapper::url_stat' => ['array', 'path'=>'string', 'flags'=>'int'], - 'stream_bucket_append' => ['void', 'brigade'=>'resource', 'bucket'=>'object'], - 'stream_bucket_make_writeable' => ['?object', 'brigade'=>'resource'], - 'stream_bucket_new' => ['object|false', 'stream'=>'resource', 'buffer'=>'string'], - 'stream_bucket_prepend' => ['void', 'brigade'=>'resource', 'bucket'=>'object'], - 'stream_context_create' => ['resource', 'options='=>'array', 'params='=>'array'], - 'stream_context_get_default' => ['resource', 'options='=>'array'], - 'stream_context_get_options' => ['array', 'stream_or_context'=>'resource'], - 'stream_context_get_params' => ['array', 'context'=>'resource'], - 'stream_context_set_default' => ['resource', 'options'=>'array'], - 'stream_context_set_option' => ['bool', 'context'=>'', 'wrapper_or_options'=>'string', 'option_name'=>'string', 'value'=>''], - 'stream_context_set_option\'1' => ['bool', 'context'=>'', 'wrapper_or_options'=>'array'], - 'stream_context_set_params' => ['bool', 'context'=>'resource', 'params'=>'array'], - 'stream_copy_to_stream' => ['int|false', 'from'=>'resource', 'to'=>'resource', 'length='=>'int', 'offset='=>'int'], - 'stream_encoding' => ['bool', 'stream'=>'resource', 'encoding='=>'string'], - 'stream_filter_append' => ['resource|false', 'stream'=>'resource', 'filter_name'=>'string', 'mode='=>'int', 'params='=>'mixed'], - 'stream_filter_prepend' => ['resource|false', 'stream'=>'resource', 'filter_name'=>'string', 'mode='=>'int', 'params='=>'mixed'], - 'stream_filter_register' => ['bool', 'filter_name'=>'string', 'class'=>'string'], - 'stream_filter_remove' => ['bool', 'stream_filter'=>'resource'], - 'stream_get_contents' => ['string|false', 'stream'=>'resource', 'length='=>'int', 'offset='=>'int'], - 'stream_get_filters' => ['array'], - 'stream_get_line' => ['string|false', 'stream'=>'resource', 'length'=>'int', 'ending='=>'string'], - 'stream_get_meta_data' => ['array{timed_out:bool,blocked:bool,eof:bool,unread_bytes:int,stream_type:string,wrapper_type:string,wrapper_data:mixed,mode:string,seekable:bool,uri:string,mediatype:string,crypto?:array{protocol:string,cipher_name:string,cipher_bits:int,cipher_version:string}}', 'stream'=>'resource'], - 'stream_get_transports' => ['list'], - 'stream_get_wrappers' => ['list'], - 'stream_is_local' => ['bool', 'stream'=>'resource|string'], - 'stream_notification_callback' => ['callback', 'notification_code'=>'int', 'severity'=>'int', 'message'=>'string', 'message_code'=>'int', 'bytes_transferred'=>'int', 'bytes_max'=>'int'], - 'stream_register_wrapper' => ['bool', 'protocol'=>'string', 'class'=>'string', 'flags='=>'int'], - 'stream_resolve_include_path' => ['string|false', 'filename'=>'string'], - 'stream_select' => ['int|false', '&rw_read'=>'resource[]', '&rw_write'=>'?resource[]', '&rw_except'=>'?resource[]', 'seconds'=>'?int', 'microseconds='=>'?int'], - 'stream_set_blocking' => ['bool', 'stream'=>'resource', 'enable'=>'bool'], - 'stream_set_chunk_size' => ['int|false', 'stream'=>'resource', 'size'=>'int'], - 'stream_set_read_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], - 'stream_set_timeout' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], - 'stream_set_write_buffer' => ['int', 'stream'=>'resource', 'size'=>'int'], - 'stream_socket_accept' => ['resource|false', 'socket'=>'resource', 'timeout='=>'float', '&w_peer_name='=>'string'], - 'stream_socket_client' => ['resource|false', 'address'=>'string', '&w_error_code='=>'int', '&w_error_message='=>'string', 'timeout='=>'float', 'flags='=>'int', 'context='=>'resource'], - 'stream_socket_enable_crypto' => ['int|bool', 'stream'=>'resource', 'enable'=>'bool', 'crypto_method='=>'int', 'session_stream='=>'resource'], - 'stream_socket_get_name' => ['string', 'socket'=>'resource', 'remote'=>'bool'], - 'stream_socket_pair' => ['resource[]|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], - 'stream_socket_recvfrom' => ['string', 'socket'=>'resource', 'length'=>'int', 'flags='=>'int', '&w_address='=>'string'], - 'stream_socket_sendto' => ['int', 'socket'=>'resource', 'data'=>'string', 'flags='=>'int', 'address='=>'string'], - 'stream_socket_server' => ['resource|false', 'address'=>'string', '&w_error_code='=>'int', '&w_error_message='=>'string', 'flags='=>'int', 'context='=>'resource'], - 'stream_socket_shutdown' => ['bool', 'stream'=>'resource', 'mode'=>'int'], - 'stream_supports_lock' => ['bool', 'stream'=>'resource'], - 'stream_wrapper_register' => ['bool', 'protocol'=>'string', 'class'=>'string', 'flags='=>'int'], - 'stream_wrapper_restore' => ['bool', 'protocol'=>'string'], - 'stream_wrapper_unregister' => ['bool', 'protocol'=>'string'], - 'strftime' => ['string|false', 'format'=>'string', 'timestamp='=>'int'], - 'strip_tags' => ['string', 'string'=>'string', 'allowed_tags='=>'string'], - 'stripcslashes' => ['string', 'string'=>'string'], - 'stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], - 'stripslashes' => ['string', 'string'=>'string'], - 'stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], - 'strlen' => ['0|positive-int', 'string'=>'string'], - 'strnatcasecmp' => ['int', 'string1'=>'string', 'string2'=>'string'], - 'strnatcmp' => ['int', 'string1'=>'string', 'string2'=>'string'], - 'strncasecmp' => ['int', 'string1'=>'string', 'string2'=>'string', 'length'=>'int'], - 'strncmp' => ['int', 'string1'=>'string', 'string2'=>'string', 'length'=>'int'], - 'strpbrk' => ['string|false', 'string'=>'string', 'characters'=>'string'], - 'strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], - 'strptime' => ['array|false', 'timestamp'=>'string', 'format'=>'string'], - 'strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int'], - 'strrev' => ['string', 'string'=>'string'], - 'strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], - 'strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], - 'strspn' => ['int', 'string'=>'string', 'characters'=>'string', 'offset='=>'int', 'length='=>'int'], - 'strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string|int', 'before_needle='=>'bool'], - 'strtok' => ['string|false', 'string'=>'string', 'token'=>'string'], - 'strtok\'1' => ['string|false', 'string'=>'string'], - 'strtolower' => ['lowercase-string', 'string'=>'string'], - 'strtotime' => ['int|false', 'datetime'=>'string', 'baseTimestamp='=>'int'], - 'strtoupper' => ['string', 'string'=>'string'], - 'strtr' => ['string', 'string'=>'string', 'from'=>'string', 'to'=>'string'], - 'strtr\'1' => ['string', 'string'=>'string', 'from'=>'array'], - 'strval' => ['string', 'value'=>'mixed'], - 'styleObj::__construct' => ['void', 'label'=>'labelObj', 'style'=>'styleObj'], - 'styleObj::convertToString' => ['string'], - 'styleObj::free' => ['void'], - 'styleObj::getBinding' => ['string', 'stylebinding'=>'mixed'], - 'styleObj::getGeomTransform' => ['string'], - 'styleObj::ms_newStyleObj' => ['styleObj', 'class'=>'classObj', 'style'=>'styleObj'], - 'styleObj::removeBinding' => ['int', 'stylebinding'=>'mixed'], - 'styleObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'styleObj::setBinding' => ['int', 'stylebinding'=>'mixed', 'value'=>'string'], - 'styleObj::setGeomTransform' => ['int', 'value'=>'string'], - 'styleObj::updateFromString' => ['int', 'snippet'=>'string'], - 'substr' => ['string|false', 'string'=>'string', 'offset'=>'int', 'length='=>'int'], - 'substr_compare' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset'=>'int', 'length='=>'int', 'case_insensitive='=>'bool'], - 'substr_count' => ['int', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'length='=>'int'], - 'substr_replace' => ['string|string[]', 'string'=>'string|string[]', 'replace'=>'mixed', 'offset'=>'mixed', 'length='=>'mixed'], - 'suhosin_encrypt_cookie' => ['string|false', 'name'=>'string', 'value'=>'string'], - 'suhosin_get_raw_cookies' => ['array'], - 'svm::crossvalidate' => ['float', 'problem'=>'array', 'number_of_folds'=>'int'], - 'svm::train' => ['SVMModel', 'problem'=>'array', 'weights='=>'array'], - 'svn_add' => ['bool', 'path'=>'string', 'recursive='=>'bool', 'force='=>'bool'], - 'svn_auth_get_parameter' => ['?string', 'key'=>'string'], - 'svn_auth_set_parameter' => ['void', 'key'=>'string', 'value'=>'string'], - 'svn_blame' => ['array', 'repository_url'=>'string', 'revision_no='=>'int'], - 'svn_cat' => ['string', 'repos_url'=>'string', 'revision_no='=>'int'], - 'svn_checkout' => ['bool', 'repos'=>'string', 'targetpath'=>'string', 'revision='=>'int', 'flags='=>'int'], - 'svn_cleanup' => ['bool', 'workingdir'=>'string'], - 'svn_client_version' => ['string'], - 'svn_commit' => ['array', 'log'=>'string', 'targets'=>'array', 'dontrecurse='=>'bool'], - 'svn_delete' => ['bool', 'path'=>'string', 'force='=>'bool'], - 'svn_diff' => ['array', 'path1'=>'string', 'rev1'=>'int', 'path2'=>'string', 'rev2'=>'int'], - 'svn_export' => ['bool', 'frompath'=>'string', 'topath'=>'string', 'working_copy='=>'bool', 'revision_no='=>'int'], - 'svn_fs_abort_txn' => ['bool', 'txn'=>'resource'], - 'svn_fs_apply_text' => ['resource', 'root'=>'resource', 'path'=>'string'], - 'svn_fs_begin_txn2' => ['resource', 'repos'=>'resource', 'rev'=>'int'], - 'svn_fs_change_node_prop' => ['bool', 'root'=>'resource', 'path'=>'string', 'name'=>'string', 'value'=>'string'], - 'svn_fs_check_path' => ['int', 'fsroot'=>'resource', 'path'=>'string'], - 'svn_fs_contents_changed' => ['bool', 'root1'=>'resource', 'path1'=>'string', 'root2'=>'resource', 'path2'=>'string'], - 'svn_fs_copy' => ['bool', 'from_root'=>'resource', 'from_path'=>'string', 'to_root'=>'resource', 'to_path'=>'string'], - 'svn_fs_delete' => ['bool', 'root'=>'resource', 'path'=>'string'], - 'svn_fs_dir_entries' => ['array', 'fsroot'=>'resource', 'path'=>'string'], - 'svn_fs_file_contents' => ['resource', 'fsroot'=>'resource', 'path'=>'string'], - 'svn_fs_file_length' => ['int', 'fsroot'=>'resource', 'path'=>'string'], - 'svn_fs_is_dir' => ['bool', 'root'=>'resource', 'path'=>'string'], - 'svn_fs_is_file' => ['bool', 'root'=>'resource', 'path'=>'string'], - 'svn_fs_make_dir' => ['bool', 'root'=>'resource', 'path'=>'string'], - 'svn_fs_make_file' => ['bool', 'root'=>'resource', 'path'=>'string'], - 'svn_fs_node_created_rev' => ['int', 'fsroot'=>'resource', 'path'=>'string'], - 'svn_fs_node_prop' => ['string', 'fsroot'=>'resource', 'path'=>'string', 'propname'=>'string'], - 'svn_fs_props_changed' => ['bool', 'root1'=>'resource', 'path1'=>'string', 'root2'=>'resource', 'path2'=>'string'], - 'svn_fs_revision_prop' => ['string', 'fs'=>'resource', 'revnum'=>'int', 'propname'=>'string'], - 'svn_fs_revision_root' => ['resource', 'fs'=>'resource', 'revnum'=>'int'], - 'svn_fs_txn_root' => ['resource', 'txn'=>'resource'], - 'svn_fs_youngest_rev' => ['int', 'fs'=>'resource'], - 'svn_import' => ['bool', 'path'=>'string', 'url'=>'string', 'nonrecursive'=>'bool'], - 'svn_log' => ['array', 'repos_url'=>'string', 'start_revision='=>'int', 'end_revision='=>'int', 'limit='=>'int', 'flags='=>'int'], - 'svn_ls' => ['array', 'repos_url'=>'string', 'revision_no='=>'int', 'recurse='=>'bool', 'peg='=>'bool'], - 'svn_mkdir' => ['bool', 'path'=>'string', 'log_message='=>'string'], - 'svn_move' => ['mixed', 'src_path'=>'string', 'dst_path'=>'string', 'force='=>'bool'], - 'svn_propget' => ['mixed', 'path'=>'string', 'property_name'=>'string', 'recurse='=>'bool', 'revision'=>'int'], - 'svn_proplist' => ['mixed', 'path'=>'string', 'recurse='=>'bool', 'revision'=>'int'], - 'svn_repos_create' => ['resource', 'path'=>'string', 'config='=>'array', 'fsconfig='=>'array'], - 'svn_repos_fs' => ['resource', 'repos'=>'resource'], - 'svn_repos_fs_begin_txn_for_commit' => ['resource', 'repos'=>'resource', 'rev'=>'int', 'author'=>'string', 'log_msg'=>'string'], - 'svn_repos_fs_commit_txn' => ['int', 'txn'=>'resource'], - 'svn_repos_hotcopy' => ['bool', 'repospath'=>'string', 'destpath'=>'string', 'cleanlogs'=>'bool'], - 'svn_repos_open' => ['resource', 'path'=>'string'], - 'svn_repos_recover' => ['bool', 'path'=>'string'], - 'svn_revert' => ['bool', 'path'=>'string', 'recursive='=>'bool'], - 'svn_status' => ['array', 'path'=>'string', 'flags='=>'int'], - 'svn_update' => ['int|false', 'path'=>'string', 'revno='=>'int', 'recurse='=>'bool'], - 'swf_actiongeturl' => ['', 'url'=>'string', 'target'=>'string'], - 'swf_actiongotoframe' => ['', 'framenumber'=>'int'], - 'swf_actiongotolabel' => ['', 'label'=>'string'], - 'swf_actionnextframe' => [''], - 'swf_actionplay' => [''], - 'swf_actionprevframe' => [''], - 'swf_actionsettarget' => ['', 'target'=>'string'], - 'swf_actionstop' => [''], - 'swf_actiontogglequality' => [''], - 'swf_actionwaitforframe' => ['', 'framenumber'=>'int', 'skipcount'=>'int'], - 'swf_addbuttonrecord' => ['', 'states'=>'int', 'shapeid'=>'int', 'depth'=>'int'], - 'swf_addcolor' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], - 'swf_closefile' => ['', 'return_file='=>'int'], - 'swf_definebitmap' => ['', 'objid'=>'int', 'image_name'=>'string'], - 'swf_definefont' => ['', 'fontid'=>'int', 'fontname'=>'string'], - 'swf_defineline' => ['', 'objid'=>'int', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'width'=>'float'], - 'swf_definepoly' => ['', 'objid'=>'int', 'coords'=>'array', 'npoints'=>'int', 'width'=>'float'], - 'swf_definerect' => ['', 'objid'=>'int', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'width'=>'float'], - 'swf_definetext' => ['', 'objid'=>'int', 'string'=>'string', 'docenter'=>'int'], - 'swf_endbutton' => [''], - 'swf_enddoaction' => [''], - 'swf_endshape' => [''], - 'swf_endsymbol' => [''], - 'swf_fontsize' => ['', 'size'=>'float'], - 'swf_fontslant' => ['', 'slant'=>'float'], - 'swf_fonttracking' => ['', 'tracking'=>'float'], - 'swf_getbitmapinfo' => ['array', 'bitmapid'=>'int'], - 'swf_getfontinfo' => ['array'], - 'swf_getframe' => ['int'], - 'swf_labelframe' => ['', 'name'=>'string'], - 'swf_lookat' => ['', 'view_x'=>'float', 'view_y'=>'float', 'view_z'=>'float', 'reference_x'=>'float', 'reference_y'=>'float', 'reference_z'=>'float', 'twist'=>'float'], - 'swf_modifyobject' => ['', 'depth'=>'int', 'how'=>'int'], - 'swf_mulcolor' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], - 'swf_nextid' => ['int'], - 'swf_oncondition' => ['', 'transition'=>'int'], - 'swf_openfile' => ['', 'filename'=>'string', 'width'=>'float', 'height'=>'float', 'framerate'=>'float', 'r'=>'float', 'g'=>'float', 'b'=>'float'], - 'swf_ortho' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float', 'zmin'=>'float', 'zmax'=>'float'], - 'swf_ortho2' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float'], - 'swf_perspective' => ['', 'fovy'=>'float', 'aspect'=>'float', 'near'=>'float', 'far'=>'float'], - 'swf_placeobject' => ['', 'objid'=>'int', 'depth'=>'int'], - 'swf_polarview' => ['', 'dist'=>'float', 'azimuth'=>'float', 'incidence'=>'float', 'twist'=>'float'], - 'swf_popmatrix' => [''], - 'swf_posround' => ['', 'round'=>'int'], - 'swf_pushmatrix' => [''], - 'swf_removeobject' => ['', 'depth'=>'int'], - 'swf_rotate' => ['', 'angle'=>'float', 'axis'=>'string'], - 'swf_scale' => ['', 'x'=>'float', 'y'=>'float', 'z'=>'float'], - 'swf_setfont' => ['', 'fontid'=>'int'], - 'swf_setframe' => ['', 'framenumber'=>'int'], - 'swf_shapearc' => ['', 'x'=>'float', 'y'=>'float', 'r'=>'float', 'ang1'=>'float', 'ang2'=>'float'], - 'swf_shapecurveto' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float'], - 'swf_shapecurveto3' => ['', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x3'=>'float', 'y3'=>'float'], - 'swf_shapefillbitmapclip' => ['', 'bitmapid'=>'int'], - 'swf_shapefillbitmaptile' => ['', 'bitmapid'=>'int'], - 'swf_shapefilloff' => [''], - 'swf_shapefillsolid' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float'], - 'swf_shapelinesolid' => ['', 'r'=>'float', 'g'=>'float', 'b'=>'float', 'a'=>'float', 'width'=>'float'], - 'swf_shapelineto' => ['', 'x'=>'float', 'y'=>'float'], - 'swf_shapemoveto' => ['', 'x'=>'float', 'y'=>'float'], - 'swf_showframe' => [''], - 'swf_startbutton' => ['', 'objid'=>'int', 'type'=>'int'], - 'swf_startdoaction' => [''], - 'swf_startshape' => ['', 'objid'=>'int'], - 'swf_startsymbol' => ['', 'objid'=>'int'], - 'swf_textwidth' => ['float', 'string'=>'string'], - 'swf_translate' => ['', 'x'=>'float', 'y'=>'float', 'z'=>'float'], - 'swf_viewport' => ['', 'xmin'=>'float', 'xmax'=>'float', 'ymin'=>'float', 'ymax'=>'float'], - 'swoole\async::dnsLookup' => ['void', 'hostname'=>'string', 'callback'=>'callable'], - 'swoole\async::read' => ['bool', 'filename'=>'string', 'callback'=>'callable', 'chunk_size='=>'integer', 'offset='=>'integer'], - 'swoole\async::readFile' => ['void', 'filename'=>'string', 'callback'=>'callable'], - 'swoole\async::set' => ['void', 'settings'=>'array'], - 'swoole\async::write' => ['void', 'filename'=>'string', 'content'=>'string', 'offset='=>'integer', 'callback='=>'callable'], - 'swoole\async::writeFile' => ['void', 'filename'=>'string', 'content'=>'string', 'callback='=>'callable', 'flags='=>'string'], - 'swoole\atomic::add' => ['integer', 'add_value='=>'integer'], - 'swoole\atomic::cmpset' => ['integer', 'cmp_value'=>'integer', 'new_value'=>'integer'], - 'swoole\atomic::get' => ['integer'], - 'swoole\atomic::set' => ['integer', 'value'=>'integer'], - 'swoole\atomic::sub' => ['integer', 'sub_value='=>'integer'], - 'swoole\buffer::__destruct' => ['void'], - 'swoole\buffer::__toString' => ['string'], - 'swoole\buffer::append' => ['integer', 'data'=>'string'], - 'swoole\buffer::clear' => ['void'], - 'swoole\buffer::expand' => ['integer', 'size'=>'integer'], - 'swoole\buffer::read' => ['string', 'offset'=>'integer', 'length'=>'integer'], - 'swoole\buffer::recycle' => ['void'], - 'swoole\buffer::substr' => ['string', 'offset'=>'integer', 'length='=>'integer', 'remove='=>'bool'], - 'swoole\buffer::write' => ['void', 'offset'=>'integer', 'data'=>'string'], - 'swoole\channel::__destruct' => ['void'], - 'swoole\channel::pop' => ['mixed'], - 'swoole\channel::push' => ['bool', 'data'=>'string'], - 'swoole\channel::stats' => ['array'], - 'swoole\client::__destruct' => ['void'], - 'swoole\client::close' => ['bool', 'force='=>'bool'], - 'swoole\client::connect' => ['bool', 'host'=>'string', 'port='=>'integer', 'timeout='=>'integer', 'flag='=>'integer'], - 'swoole\client::getpeername' => ['array'], - 'swoole\client::getsockname' => ['array'], - 'swoole\client::isConnected' => ['bool'], - 'swoole\client::on' => ['void', 'event'=>'string', 'callback'=>'callable'], - 'swoole\client::pause' => ['void'], - 'swoole\client::pipe' => ['void', 'socket'=>'string'], - 'swoole\client::recv' => ['void', 'size='=>'string', 'flag='=>'string'], - 'swoole\client::resume' => ['void'], - 'swoole\client::send' => ['integer', 'data'=>'string', 'flag='=>'string'], - 'swoole\client::sendfile' => ['bool', 'filename'=>'string', 'offset='=>'int'], - 'swoole\client::sendto' => ['bool', 'ip'=>'string', 'port'=>'integer', 'data'=>'string'], - 'swoole\client::set' => ['void', 'settings'=>'array'], - 'swoole\client::sleep' => ['void'], - 'swoole\client::wakeup' => ['void'], - 'swoole\connection\iterator::count' => ['int'], - 'swoole\connection\iterator::current' => ['Connection'], - 'swoole\connection\iterator::key' => ['int'], - 'swoole\connection\iterator::next' => ['Connection'], - 'swoole\connection\iterator::offsetExists' => ['bool', 'index'=>'int'], - 'swoole\connection\iterator::offsetGet' => ['Connection', 'index'=>'string'], - 'swoole\connection\iterator::offsetSet' => ['void', 'offset'=>'int', 'connection'=>'mixed'], - 'swoole\connection\iterator::offsetUnset' => ['void', 'offset'=>'int'], - 'swoole\connection\iterator::rewind' => ['void'], - 'swoole\connection\iterator::valid' => ['bool'], - 'swoole\coroutine::call_user_func' => ['mixed', 'callback'=>'callable', 'parameter='=>'mixed', '...args='=>'mixed'], - 'swoole\coroutine::call_user_func_array' => ['mixed', 'callback'=>'callable', 'param_array'=>'array'], - 'swoole\coroutine::cli_wait' => ['ReturnType'], - 'swoole\coroutine::create' => ['ReturnType'], - 'swoole\coroutine::getuid' => ['ReturnType'], - 'swoole\coroutine::resume' => ['ReturnType'], - 'swoole\coroutine::suspend' => ['ReturnType'], - 'swoole\coroutine\client::__destruct' => ['ReturnType'], - 'swoole\coroutine\client::close' => ['ReturnType'], - 'swoole\coroutine\client::connect' => ['ReturnType'], - 'swoole\coroutine\client::getpeername' => ['ReturnType'], - 'swoole\coroutine\client::getsockname' => ['ReturnType'], - 'swoole\coroutine\client::isConnected' => ['ReturnType'], - 'swoole\coroutine\client::recv' => ['ReturnType'], - 'swoole\coroutine\client::send' => ['ReturnType'], - 'swoole\coroutine\client::sendfile' => ['ReturnType'], - 'swoole\coroutine\client::sendto' => ['ReturnType'], - 'swoole\coroutine\client::set' => ['ReturnType'], - 'swoole\coroutine\http\client::__destruct' => ['ReturnType'], - 'swoole\coroutine\http\client::addFile' => ['ReturnType'], - 'swoole\coroutine\http\client::close' => ['ReturnType'], - 'swoole\coroutine\http\client::execute' => ['ReturnType'], - 'swoole\coroutine\http\client::get' => ['ReturnType'], - 'swoole\coroutine\http\client::getDefer' => ['ReturnType'], - 'swoole\coroutine\http\client::isConnected' => ['ReturnType'], - 'swoole\coroutine\http\client::post' => ['ReturnType'], - 'swoole\coroutine\http\client::recv' => ['ReturnType'], - 'swoole\coroutine\http\client::set' => ['ReturnType'], - 'swoole\coroutine\http\client::setCookies' => ['ReturnType'], - 'swoole\coroutine\http\client::setData' => ['ReturnType'], - 'swoole\coroutine\http\client::setDefer' => ['ReturnType'], - 'swoole\coroutine\http\client::setHeaders' => ['ReturnType'], - 'swoole\coroutine\http\client::setMethod' => ['ReturnType'], - 'swoole\coroutine\mysql::__destruct' => ['ReturnType'], - 'swoole\coroutine\mysql::close' => ['ReturnType'], - 'swoole\coroutine\mysql::connect' => ['ReturnType'], - 'swoole\coroutine\mysql::getDefer' => ['ReturnType'], - 'swoole\coroutine\mysql::query' => ['ReturnType'], - 'swoole\coroutine\mysql::recv' => ['ReturnType'], - 'swoole\coroutine\mysql::setDefer' => ['ReturnType'], - 'swoole\event::add' => ['bool', 'fd'=>'int', 'read_callback'=>'callable', 'write_callback='=>'callable', 'events='=>'string'], - 'swoole\event::defer' => ['void', 'callback'=>'mixed'], - 'swoole\event::del' => ['bool', 'fd'=>'string'], - 'swoole\event::exit' => ['void'], - 'swoole\event::set' => ['bool', 'fd'=>'int', 'read_callback='=>'string', 'write_callback='=>'string', 'events='=>'string'], - 'swoole\event::wait' => ['void'], - 'swoole\event::write' => ['void', 'fd'=>'string', 'data'=>'string'], - 'swoole\http\client::__destruct' => ['void'], - 'swoole\http\client::addFile' => ['void', 'path'=>'string', 'name'=>'string', 'type='=>'string', 'filename='=>'string', 'offset='=>'string'], - 'swoole\http\client::close' => ['void'], - 'swoole\http\client::download' => ['void', 'path'=>'string', 'file'=>'string', 'callback'=>'callable', 'offset='=>'integer'], - 'swoole\http\client::execute' => ['void', 'path'=>'string', 'callback'=>'string'], - 'swoole\http\client::get' => ['void', 'path'=>'string', 'callback'=>'callable'], - 'swoole\http\client::isConnected' => ['bool'], - 'swoole\http\client::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], - 'swoole\http\client::post' => ['void', 'path'=>'string', 'data'=>'string', 'callback'=>'callable'], - 'swoole\http\client::push' => ['void', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string'], - 'swoole\http\client::set' => ['void', 'settings'=>'array'], - 'swoole\http\client::setCookies' => ['void', 'cookies'=>'array'], - 'swoole\http\client::setData' => ['ReturnType', 'data'=>'string'], - 'swoole\http\client::setHeaders' => ['void', 'headers'=>'array'], - 'swoole\http\client::setMethod' => ['void', 'method'=>'string'], - 'swoole\http\client::upgrade' => ['void', 'path'=>'string', 'callback'=>'string'], - 'swoole\http\request::__destruct' => ['void'], - 'swoole\http\request::rawcontent' => ['string'], - 'swoole\http\response::__destruct' => ['void'], - 'swoole\http\response::cookie' => ['string', 'name'=>'string', 'value='=>'string', 'expires='=>'string', 'path='=>'string', 'domain='=>'string', 'secure='=>'string', 'httponly='=>'string'], - 'swoole\http\response::end' => ['void', 'content='=>'string'], - 'swoole\http\response::gzip' => ['ReturnType', 'compress_level='=>'string'], - 'swoole\http\response::header' => ['void', 'key'=>'string', 'value'=>'string', 'ucwords='=>'string'], - 'swoole\http\response::initHeader' => ['ReturnType'], - 'swoole\http\response::rawcookie' => ['ReturnType', 'name'=>'string', 'value='=>'string', 'expires='=>'string', 'path='=>'string', 'domain='=>'string', 'secure='=>'string', 'httponly='=>'string'], - 'swoole\http\response::sendfile' => ['ReturnType', 'filename'=>'string', 'offset='=>'int'], - 'swoole\http\response::status' => ['ReturnType', 'http_code'=>'string'], - 'swoole\http\response::write' => ['void', 'content'=>'string'], - 'swoole\http\server::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], - 'swoole\http\server::start' => ['void'], - 'swoole\lock::__destruct' => ['void'], - 'swoole\lock::lock' => ['void'], - 'swoole\lock::lock_read' => ['void'], - 'swoole\lock::trylock' => ['void'], - 'swoole\lock::trylock_read' => ['void'], - 'swoole\lock::unlock' => ['void'], - 'swoole\mmap::open' => ['ReturnType', 'filename'=>'string', 'size='=>'string', 'offset='=>'string'], - 'swoole\mysql::__destruct' => ['void'], - 'swoole\mysql::close' => ['void'], - 'swoole\mysql::connect' => ['void', 'server_config'=>'array', 'callback'=>'callable'], - 'swoole\mysql::getBuffer' => ['ReturnType'], - 'swoole\mysql::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], - 'swoole\mysql::query' => ['ReturnType', 'sql'=>'string', 'callback'=>'callable'], - 'swoole\process::__destruct' => ['void'], - 'swoole\process::alarm' => ['void', 'interval_usec'=>'integer'], - 'swoole\process::close' => ['void'], - 'swoole\process::daemon' => ['void', 'nochdir='=>'bool', 'noclose='=>'bool'], - 'swoole\process::exec' => ['ReturnType', 'exec_file'=>'string', 'args'=>'string'], - 'swoole\process::exit' => ['void', 'exit_code='=>'string'], - 'swoole\process::freeQueue' => ['void'], - 'swoole\process::kill' => ['void', 'pid'=>'integer', 'signal_no='=>'string'], - 'swoole\process::name' => ['void', 'process_name'=>'string'], - 'swoole\process::pop' => ['mixed', 'maxsize='=>'integer'], - 'swoole\process::push' => ['bool', 'data'=>'string'], - 'swoole\process::read' => ['string', 'maxsize='=>'integer'], - 'swoole\process::signal' => ['void', 'signal_no'=>'string', 'callback'=>'callable'], - 'swoole\process::start' => ['void'], - 'swoole\process::statQueue' => ['array'], - 'swoole\process::useQueue' => ['bool', 'key'=>'integer', 'mode='=>'integer'], - 'swoole\process::wait' => ['array', 'blocking='=>'bool'], - 'swoole\process::write' => ['integer', 'data'=>'string'], - 'swoole\redis\server::format' => ['ReturnType', 'type'=>'string', 'value='=>'string'], - 'swoole\redis\server::setHandler' => ['ReturnType', 'command'=>'string', 'callback'=>'string', 'number_of_string_param='=>'string', 'type_of_array_param='=>'string'], - 'swoole\redis\server::start' => ['ReturnType'], - 'swoole\serialize::pack' => ['ReturnType', 'data'=>'string', 'is_fast='=>'int'], - 'swoole\serialize::unpack' => ['ReturnType', 'data'=>'string', 'args='=>'string'], - 'swoole\server::addProcess' => ['bool', 'process'=>'swoole_process'], - 'swoole\server::addlistener' => ['void', 'host'=>'string', 'port'=>'integer', 'socket_type'=>'string'], - 'swoole\server::after' => ['ReturnType', 'after_time_ms'=>'integer', 'callback'=>'callable', 'param='=>'string'], - 'swoole\server::bind' => ['bool', 'fd'=>'integer', 'uid'=>'integer'], - 'swoole\server::close' => ['bool', 'fd'=>'integer', 'reset='=>'bool'], - 'swoole\server::confirm' => ['bool', 'fd'=>'integer'], - 'swoole\server::connection_info' => ['array', 'fd'=>'integer', 'reactor_id='=>'integer'], - 'swoole\server::connection_list' => ['array', 'start_fd'=>'integer', 'pagesize='=>'integer'], - 'swoole\server::defer' => ['void', 'callback'=>'callable'], - 'swoole\server::exist' => ['bool', 'fd'=>'integer'], - 'swoole\server::finish' => ['void', 'data'=>'string'], - 'swoole\server::getClientInfo' => ['ReturnType', 'fd'=>'integer', 'reactor_id='=>'integer'], - 'swoole\server::getClientList' => ['array', 'start_fd'=>'integer', 'pagesize='=>'integer'], - 'swoole\server::getLastError' => ['integer'], - 'swoole\server::heartbeat' => ['mixed', 'if_close_connection'=>'bool'], - 'swoole\server::listen' => ['bool', 'host'=>'string', 'port'=>'integer', 'socket_type'=>'string'], - 'swoole\server::on' => ['void', 'event_name'=>'string', 'callback'=>'callable'], - 'swoole\server::pause' => ['void', 'fd'=>'integer'], - 'swoole\server::protect' => ['void', 'fd'=>'integer', 'is_protected='=>'bool'], - 'swoole\server::reload' => ['bool'], - 'swoole\server::resume' => ['void', 'fd'=>'integer'], - 'swoole\server::send' => ['bool', 'fd'=>'integer', 'data'=>'string', 'reactor_id='=>'integer'], - 'swoole\server::sendMessage' => ['bool', 'worker_id'=>'integer', 'data'=>'string'], - 'swoole\server::sendfile' => ['bool', 'fd'=>'integer', 'filename'=>'string', 'offset='=>'integer'], - 'swoole\server::sendto' => ['bool', 'ip'=>'string', 'port'=>'integer', 'data'=>'string', 'server_socket='=>'string'], - 'swoole\server::sendwait' => ['bool', 'fd'=>'integer', 'data'=>'string'], - 'swoole\server::set' => ['ReturnType', 'settings'=>'array'], - 'swoole\server::shutdown' => ['void'], - 'swoole\server::start' => ['void'], - 'swoole\server::stats' => ['array'], - 'swoole\server::stop' => ['bool', 'worker_id='=>'integer'], - 'swoole\server::task' => ['mixed', 'data'=>'string', 'dst_worker_id='=>'integer', 'callback='=>'callable'], - 'swoole\server::taskWaitMulti' => ['void', 'tasks'=>'array', 'timeout_ms='=>'double'], - 'swoole\server::taskwait' => ['void', 'data'=>'string', 'timeout='=>'float', 'worker_id='=>'integer'], - 'swoole\server::tick' => ['void', 'interval_ms'=>'integer', 'callback'=>'callable'], - 'swoole\server\port::__destruct' => ['void'], - 'swoole\server\port::on' => ['ReturnType', 'event_name'=>'string', 'callback'=>'callable'], - 'swoole\server\port::set' => ['void', 'settings'=>'array'], - 'swoole\table::column' => ['ReturnType', 'name'=>'string', 'type'=>'string', 'size='=>'integer'], - 'swoole\table::count' => ['integer'], - 'swoole\table::create' => ['void'], - 'swoole\table::current' => ['array'], - 'swoole\table::decr' => ['ReturnType', 'key'=>'string', 'column'=>'string', 'decrby='=>'integer'], - 'swoole\table::del' => ['void', 'key'=>'string'], - 'swoole\table::destroy' => ['void'], - 'swoole\table::exist' => ['bool', 'key'=>'string'], - 'swoole\table::get' => ['integer', 'row_key'=>'string', 'column_key'=>'string'], - 'swoole\table::incr' => ['void', 'key'=>'string', 'column'=>'string', 'incrby='=>'integer'], - 'swoole\table::key' => ['string'], - 'swoole\table::next' => ['ReturnType'], - 'swoole\table::rewind' => ['void'], - 'swoole\table::set' => ['VOID', 'key'=>'string', 'value'=>'array'], - 'swoole\table::valid' => ['bool'], - 'swoole\timer::after' => ['void', 'after_time_ms'=>'int', 'callback'=>'callable'], - 'swoole\timer::clear' => ['void', 'timer_id'=>'integer'], - 'swoole\timer::exists' => ['bool', 'timer_id'=>'integer'], - 'swoole\timer::tick' => ['void', 'interval_ms'=>'integer', 'callback'=>'callable', 'param='=>'string'], - 'swoole\websocket\server::exist' => ['bool', 'fd'=>'integer'], - 'swoole\websocket\server::on' => ['ReturnType', 'event_name'=>'string', 'callback'=>'callable'], - 'swoole\websocket\server::pack' => ['binary', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string', 'mask='=>'string'], - 'swoole\websocket\server::push' => ['void', 'fd'=>'string', 'data'=>'string', 'opcode='=>'string', 'finish='=>'string'], - 'swoole\websocket\server::unpack' => ['string', 'data'=>'binary'], - 'swoole_async_dns_lookup' => ['bool', 'hostname'=>'string', 'callback'=>'callable'], - 'swoole_async_read' => ['bool', 'filename'=>'string', 'callback'=>'callable', 'chunk_size='=>'int', 'offset='=>'int'], - 'swoole_async_readfile' => ['bool', 'filename'=>'string', 'callback'=>'string'], - 'swoole_async_set' => ['void', 'settings'=>'array'], - 'swoole_async_write' => ['bool', 'filename'=>'string', 'content'=>'string', 'offset='=>'int', 'callback='=>'callable'], - 'swoole_async_writefile' => ['bool', 'filename'=>'string', 'content'=>'string', 'callback='=>'callable', 'flags='=>'int'], - 'swoole_client_select' => ['int', 'read_array'=>'array', 'write_array'=>'array', 'error_array'=>'array', 'timeout='=>'float'], - 'swoole_cpu_num' => ['int'], - 'swoole_errno' => ['int'], - 'swoole_event_add' => ['int', 'fd'=>'int', 'read_callback='=>'callable', 'write_callback='=>'callable', 'events='=>'int'], - 'swoole_event_defer' => ['bool', 'callback'=>'callable'], - 'swoole_event_del' => ['bool', 'fd'=>'int'], - 'swoole_event_exit' => ['void'], - 'swoole_event_set' => ['bool', 'fd'=>'int', 'read_callback='=>'callable', 'write_callback='=>'callable', 'events='=>'int'], - 'swoole_event_wait' => ['void'], - 'swoole_event_write' => ['bool', 'fd'=>'int', 'data'=>'string'], - 'swoole_get_local_ip' => ['array'], - 'swoole_last_error' => ['int'], - 'swoole_load_module' => ['mixed', 'filename'=>'string'], - 'swoole_select' => ['int', 'read_array'=>'array', 'write_array'=>'array', 'error_array'=>'array', 'timeout='=>'float'], - 'swoole_set_process_name' => ['void', 'process_name'=>'string', 'size='=>'int'], - 'swoole_strerror' => ['string', 'errno'=>'int', 'error_type='=>'int'], - 'swoole_timer_after' => ['int', 'ms'=>'int', 'callback'=>'callable', 'param='=>'mixed'], - 'swoole_timer_exists' => ['bool', 'timer_id'=>'int'], - 'swoole_timer_tick' => ['int', 'ms'=>'int', 'callback'=>'callable', 'param='=>'mixed'], - 'swoole_version' => ['string'], - 'symbolObj::__construct' => ['void', 'map'=>'mapObj', 'symbolname'=>'string'], - 'symbolObj::free' => ['void'], - 'symbolObj::getPatternArray' => ['array'], - 'symbolObj::getPointsArray' => ['array'], - 'symbolObj::ms_newSymbolObj' => ['int', 'map'=>'mapObj', 'symbolname'=>'string'], - 'symbolObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'symbolObj::setImagePath' => ['int', 'filename'=>'string'], - 'symbolObj::setPattern' => ['int', 'int'=>'array'], - 'symbolObj::setPoints' => ['int', 'double'=>'array'], - 'symlink' => ['bool', 'target'=>'string', 'link'=>'string'], - 'sys_get_temp_dir' => ['string'], - 'sys_getloadavg' => ['array'], - 'syslog' => ['bool', 'priority'=>'int', 'message'=>'string'], - 'system' => ['string|false', 'command'=>'string', '&w_result_code='=>'int'], - 'taint' => ['bool', '&rw_string'=>'string', '&...w_other_strings='=>'string'], - 'tan' => ['float', 'num'=>'float'], - 'tanh' => ['float', 'num'=>'float'], - 'tcpwrap_check' => ['bool', 'daemon'=>'string', 'address'=>'string', 'user='=>'string', 'nodns='=>'bool'], - 'tempnam' => ['string|false', 'directory'=>'string', 'prefix'=>'string'], - 'textdomain' => ['string', 'domain'=>'string'], - 'tidy::__construct' => ['void', 'filename='=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], - 'tidy::body' => ['tidyNode'], - 'tidy::cleanRepair' => ['bool'], - 'tidy::diagnose' => ['bool'], - 'tidy::getConfig' => ['array'], - 'tidy::getHtmlVer' => ['int'], - 'tidy::getOpt' => ['mixed', 'option'=>'string'], - 'tidy::getOptDoc' => ['string', 'option'=>'string'], - 'tidy::getRelease' => ['string'], - 'tidy::getStatus' => ['int'], - 'tidy::head' => ['tidyNode'], - 'tidy::html' => ['tidyNode'], - 'tidy::htmlver' => ['int'], - 'tidy::isXhtml' => ['bool'], - 'tidy::isXml' => ['bool'], - 'tidy::parseFile' => ['bool', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], - 'tidy::parseString' => ['bool', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], - 'tidy::repairFile' => ['string', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], - 'tidy::repairString' => ['string', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], - 'tidy::root' => ['tidyNode'], - 'tidyNode::__construct' => ['void'], - 'tidyNode::getParent' => ['tidyNode'], - 'tidyNode::hasChildren' => ['bool'], - 'tidyNode::hasSiblings' => ['bool'], - 'tidyNode::isAsp' => ['bool'], - 'tidyNode::isComment' => ['bool'], - 'tidyNode::isHtml' => ['bool'], - 'tidyNode::isJste' => ['bool'], - 'tidyNode::isPhp' => ['bool'], - 'tidyNode::isText' => ['bool'], - 'tidy_access_count' => ['int', 'tidy'=>'tidy'], - 'tidy_clean_repair' => ['bool', 'tidy'=>'tidy'], - 'tidy_config_count' => ['int', 'tidy'=>'tidy'], - 'tidy_diagnose' => ['bool', 'tidy'=>'tidy'], - 'tidy_error_count' => ['int', 'tidy'=>'tidy'], - 'tidy_get_body' => ['?tidyNode', 'tidy'=>'tidy'], - 'tidy_get_config' => ['array', 'tidy'=>'tidy'], - 'tidy_get_error_buffer' => ['string', 'tidy'=>'tidy'], - 'tidy_get_head' => ['?tidyNode', 'tidy'=>'tidy'], - 'tidy_get_html' => ['?tidyNode', 'tidy'=>'tidy'], - 'tidy_get_html_ver' => ['int', 'tidy'=>'tidy'], - 'tidy_get_opt_doc' => ['string', 'tidy'=>'tidy', 'option'=>'string'], - 'tidy_get_output' => ['string', 'tidy'=>'tidy'], - 'tidy_get_release' => ['string'], - 'tidy_get_root' => ['?tidyNode', 'tidy'=>'tidy'], - 'tidy_get_status' => ['int', 'tidy'=>'tidy'], - 'tidy_getopt' => ['mixed', 'tidy'=>'string', 'option'=>'tidy'], - 'tidy_is_xhtml' => ['bool', 'tidy'=>'tidy'], - 'tidy_is_xml' => ['bool', 'tidy'=>'tidy'], - 'tidy_load_config' => ['void', 'filename'=>'string', 'encoding'=>'string'], - 'tidy_parse_file' => ['tidy', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], - 'tidy_parse_string' => ['tidy', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], - 'tidy_repair_file' => ['string', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'useIncludePath='=>'bool'], - 'tidy_repair_string' => ['string', 'string'=>'string', 'config='=>'', 'encoding='=>'string'], - 'tidy_reset_config' => ['bool'], - 'tidy_save_config' => ['bool', 'filename'=>'string'], - 'tidy_set_encoding' => ['bool', 'encoding'=>'string'], - 'tidy_setopt' => ['bool', 'option'=>'string', 'value'=>'mixed'], - 'tidy_warning_count' => ['int', 'tidy'=>'tidy'], - 'time' => ['positive-int'], - 'time_nanosleep' => ['array{0:0|positive-int,1:0|positive-int}|bool', 'seconds'=>'positive-int', 'nanoseconds'=>'positive-int'], - 'time_sleep_until' => ['bool', 'timestamp'=>'float'], - 'timezone_abbreviations_list' => ['array>|false'], - 'timezone_identifiers_list' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string'], - 'timezone_location_get' => ['array|false', 'object'=>'DateTimeZone'], - 'timezone_name_from_abbr' => ['string|false', 'abbr'=>'string', 'utcOffset='=>'int', 'isDST='=>'int'], - 'timezone_name_get' => ['string', 'object'=>'DateTimeZone'], - 'timezone_offset_get' => ['int|false', 'object'=>'DateTimeZone', 'datetime'=>'DateTimeInterface'], - 'timezone_open' => ['DateTimeZone|false', 'timezone'=>'string'], - 'timezone_transitions_get' => ['list|false', 'object'=>'DateTimeZone', 'timestampBegin='=>'int', 'timestampEnd='=>'int'], - 'timezone_version_get' => ['string'], - 'tmpfile' => ['resource|false'], - 'token_get_all' => ['list', 'code'=>'string', 'flags='=>'int'], - 'token_name' => ['string', 'id'=>'int'], - 'touch' => ['bool', 'filename'=>'string', 'mtime='=>'int', 'atime='=>'int'], - 'trader_acos' => ['array', 'real'=>'array'], - 'trader_ad' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array'], - 'trader_add' => ['array', 'real0'=>'array', 'real1'=>'array'], - 'trader_adosc' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int'], - 'trader_adx' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], - 'trader_adxr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], - 'trader_apo' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'mAType='=>'int'], - 'trader_aroon' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], - 'trader_aroonosc' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], - 'trader_asin' => ['array', 'real'=>'array'], - 'trader_atan' => ['array', 'real'=>'array'], - 'trader_atr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], - 'trader_avgprice' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_bbands' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDevUp='=>'float', 'nbDevDn='=>'float', 'mAType='=>'int'], - 'trader_beta' => ['array', 'real0'=>'array', 'real1'=>'array', 'timePeriod='=>'int'], - 'trader_bop' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cci' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], - 'trader_cdl2crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdl3blackcrows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdl3inside' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdl3linestrike' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdl3outside' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdl3starsinsouth' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdl3whitesoldiers' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlabandonedbaby' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], - 'trader_cdladvanceblock' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlbelthold' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlbreakaway' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlclosingmarubozu' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlconcealbabyswall' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlcounterattack' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdldarkcloudcover' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], - 'trader_cdldoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdldojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdldragonflydoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlengulfing' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdleveningdojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], - 'trader_cdleveningstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], - 'trader_cdlgapsidesidewhite' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlgravestonedoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlhammer' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlhangingman' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlharami' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlharamicross' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlhighwave' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlhikkake' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlhikkakemod' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlhomingpigeon' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlidentical3crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlinneck' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlinvertedhammer' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlkicking' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlkickingbylength' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlladderbottom' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdllongleggeddoji' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdllongline' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlmarubozu' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlmatchinglow' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlmathold' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], - 'trader_cdlmorningdojistar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], - 'trader_cdlmorningstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'penetration='=>'float'], - 'trader_cdlonneck' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlpiercing' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlrickshawman' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlrisefall3methods' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlseparatinglines' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlshootingstar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlshortline' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlspinningtop' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlstalledpattern' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlsticksandwich' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdltakuri' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdltasukigap' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlthrusting' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdltristar' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlunique3river' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlupsidegap2crows' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_cdlxsidegap3methods' => ['array', 'open'=>'array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_ceil' => ['array', 'real'=>'array'], - 'trader_cmo' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_correl' => ['array', 'real0'=>'array', 'real1'=>'array', 'timePeriod='=>'int'], - 'trader_cos' => ['array', 'real'=>'array'], - 'trader_cosh' => ['array', 'real'=>'array'], - 'trader_dema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_div' => ['array', 'real0'=>'array', 'real1'=>'array'], - 'trader_dx' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], - 'trader_ema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_errno' => ['int'], - 'trader_exp' => ['array', 'real'=>'array'], - 'trader_floor' => ['array', 'real'=>'array'], - 'trader_get_compat' => ['int'], - 'trader_get_unstable_period' => ['int', 'functionId'=>'int'], - 'trader_ht_dcperiod' => ['array', 'real'=>'array'], - 'trader_ht_dcphase' => ['array', 'real'=>'array'], - 'trader_ht_phasor' => ['array', 'real'=>'array'], - 'trader_ht_sine' => ['array', 'real'=>'array'], - 'trader_ht_trendline' => ['array', 'real'=>'array'], - 'trader_ht_trendmode' => ['array', 'real'=>'array'], - 'trader_kama' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_linearreg' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_linearreg_angle' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_linearreg_intercept' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_linearreg_slope' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_ln' => ['array', 'real'=>'array'], - 'trader_log10' => ['array', 'real'=>'array'], - 'trader_ma' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'mAType='=>'int'], - 'trader_macd' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'signalPeriod='=>'int'], - 'trader_macdext' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'fastMAType='=>'int', 'slowPeriod='=>'int', 'slowMAType='=>'int', 'signalPeriod='=>'int', 'signalMAType='=>'int'], - 'trader_macdfix' => ['array', 'real'=>'array', 'signalPeriod='=>'int'], - 'trader_mama' => ['array', 'real'=>'array', 'fastLimit='=>'float', 'slowLimit='=>'float'], - 'trader_mavp' => ['array', 'real'=>'array', 'periods'=>'array', 'minPeriod='=>'int', 'maxPeriod='=>'int', 'mAType='=>'int'], - 'trader_max' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_maxindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_medprice' => ['array', 'high'=>'array', 'low'=>'array'], - 'trader_mfi' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'volume'=>'array', 'timePeriod='=>'int'], - 'trader_midpoint' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_midprice' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], - 'trader_min' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_minindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_minmax' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_minmaxindex' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_minus_di' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], - 'trader_minus_dm' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], - 'trader_mom' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_mult' => ['array', 'real0'=>'array', 'real1'=>'array'], - 'trader_natr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], - 'trader_obv' => ['array', 'real'=>'array', 'volume'=>'array'], - 'trader_plus_di' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], - 'trader_plus_dm' => ['array', 'high'=>'array', 'low'=>'array', 'timePeriod='=>'int'], - 'trader_ppo' => ['array', 'real'=>'array', 'fastPeriod='=>'int', 'slowPeriod='=>'int', 'mAType='=>'int'], - 'trader_roc' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_rocp' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_rocr' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_rocr100' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_rsi' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_sar' => ['array', 'high'=>'array', 'low'=>'array', 'acceleration='=>'float', 'maximum='=>'float'], - 'trader_sarext' => ['array', 'high'=>'array', 'low'=>'array', 'startValue='=>'float', 'offsetOnReverse='=>'float', 'accelerationInitLong='=>'float', 'accelerationLong='=>'float', 'accelerationMaxLong='=>'float', 'accelerationInitShort='=>'float', 'accelerationShort='=>'float', 'accelerationMaxShort='=>'float'], - 'trader_set_compat' => ['void', 'compatId'=>'int'], - 'trader_set_unstable_period' => ['void', 'functionId'=>'int', 'timePeriod'=>'int'], - 'trader_sin' => ['array', 'real'=>'array'], - 'trader_sinh' => ['array', 'real'=>'array'], - 'trader_sma' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_sqrt' => ['array', 'real'=>'array'], - 'trader_stddev' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDev='=>'float'], - 'trader_stoch' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'fastK_Period='=>'int', 'slowK_Period='=>'int', 'slowK_MAType='=>'int', 'slowD_Period='=>'int', 'slowD_MAType='=>'int'], - 'trader_stochf' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'fastK_Period='=>'int', 'fastD_Period='=>'int', 'fastD_MAType='=>'int'], - 'trader_stochrsi' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'fastK_Period='=>'int', 'fastD_Period='=>'int', 'fastD_MAType='=>'int'], - 'trader_sub' => ['array', 'real0'=>'array', 'real1'=>'array'], - 'trader_sum' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_t3' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'vFactor='=>'float'], - 'trader_tan' => ['array', 'real'=>'array'], - 'trader_tanh' => ['array', 'real'=>'array'], - 'trader_tema' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_trange' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_trima' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_trix' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_tsf' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trader_typprice' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_ultosc' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod1='=>'int', 'timePeriod2='=>'int', 'timePeriod3='=>'int'], - 'trader_var' => ['array', 'real'=>'array', 'timePeriod='=>'int', 'nbDev='=>'float'], - 'trader_wclprice' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array'], - 'trader_willr' => ['array', 'high'=>'array', 'low'=>'array', 'close'=>'array', 'timePeriod='=>'int'], - 'trader_wma' => ['array', 'real'=>'array', 'timePeriod='=>'int'], - 'trait_exists' => ['bool', 'trait'=>'string', 'autoload='=>'bool'], - 'transliterator_create' => ['?Transliterator', 'id'=>'string', 'direction='=>'int'], - 'transliterator_create_from_rules' => ['?Transliterator', 'rules'=>'string', 'direction='=>'int'], - 'transliterator_create_inverse' => ['?Transliterator', 'transliterator'=>'Transliterator'], - 'transliterator_get_error_code' => ['int', 'transliterator'=>'Transliterator'], - 'transliterator_get_error_message' => ['string', 'transliterator'=>'Transliterator'], - 'transliterator_list_ids' => ['array'], - 'transliterator_transliterate' => ['string|false', 'transliterator'=>'Transliterator|string', 'string'=>'string', 'start='=>'int', 'end='=>'int'], - 'trigger_error' => ['bool', 'message'=>'string', 'error_level='=>'256|512|1024|16384'], - 'trim' => ['string', 'string'=>'string', 'characters='=>'string'], - 'uasort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], - 'ucfirst' => ['string', 'string'=>'string'], - 'ucwords' => ['string', 'string'=>'string', 'separators='=>'string'], - 'udm_add_search_limit' => ['bool', 'agent'=>'resource', 'var'=>'int', 'value'=>'string'], - 'udm_alloc_agent' => ['resource', 'dbaddr'=>'string', 'dbmode='=>'string'], - 'udm_alloc_agent_array' => ['resource', 'databases'=>'array'], - 'udm_api_version' => ['int'], - 'udm_cat_list' => ['array', 'agent'=>'resource', 'category'=>'string'], - 'udm_cat_path' => ['array', 'agent'=>'resource', 'category'=>'string'], - 'udm_check_charset' => ['bool', 'agent'=>'resource', 'charset'=>'string'], - 'udm_check_stored' => ['int', 'agent'=>'', 'link'=>'int', 'doc_id'=>'string'], - 'udm_clear_search_limits' => ['bool', 'agent'=>'resource'], - 'udm_close_stored' => ['int', 'agent'=>'', 'link'=>'int'], - 'udm_crc32' => ['int', 'agent'=>'resource', 'string'=>'string'], - 'udm_errno' => ['int', 'agent'=>'resource'], - 'udm_error' => ['string', 'agent'=>'resource'], - 'udm_find' => ['resource', 'agent'=>'resource', 'query'=>'string'], - 'udm_free_agent' => ['int', 'agent'=>'resource'], - 'udm_free_ispell_data' => ['bool', 'agent'=>'int'], - 'udm_free_res' => ['bool', 'res'=>'resource'], - 'udm_get_doc_count' => ['int', 'agent'=>'resource'], - 'udm_get_res_field' => ['string', 'res'=>'resource', 'row'=>'int', 'field'=>'int'], - 'udm_get_res_param' => ['string', 'res'=>'resource', 'param'=>'int'], - 'udm_hash32' => ['int', 'agent'=>'resource', 'string'=>'string'], - 'udm_load_ispell_data' => ['bool', 'agent'=>'resource', 'var'=>'int', 'val1'=>'string', 'val2'=>'string', 'flag'=>'int'], - 'udm_open_stored' => ['int', 'agent'=>'', 'storedaddr'=>'string'], - 'udm_set_agent_param' => ['bool', 'agent'=>'resource', 'var'=>'int', 'val'=>'string'], - 'ui\area::onDraw' => ['', 'pen'=>'UI\Draw\Pen', 'areaSize'=>'UI\Size', 'clipPoint'=>'UI\Point', 'clipSize'=>'UI\Size'], - 'ui\area::onKey' => ['', 'key'=>'string', 'ext'=>'int', 'flags'=>'int'], - 'ui\area::onMouse' => ['', 'areaPoint'=>'UI\Point', 'areaSize'=>'UI\Size', 'flags'=>'int'], - 'ui\area::redraw' => [''], - 'ui\area::scrollTo' => ['', 'point'=>'UI\Point', 'size'=>'UI\Size'], - 'ui\area::setSize' => ['', 'size'=>'UI\Size'], - 'ui\control::destroy' => [''], - 'ui\control::disable' => [''], - 'ui\control::enable' => [''], - 'ui\control::getParent' => ['UI\Control'], - 'ui\control::getTopLevel' => ['int'], - 'ui\control::hide' => [''], - 'ui\control::isEnabled' => ['bool'], - 'ui\control::isVisible' => ['bool'], - 'ui\control::setParent' => ['', 'parent'=>'UI\Control'], - 'ui\control::show' => [''], - 'ui\controls\box::append' => ['int', 'control'=>'Control', 'stretchy='=>'bool'], - 'ui\controls\box::delete' => ['bool', 'index'=>'int'], - 'ui\controls\box::getOrientation' => ['int'], - 'ui\controls\box::isPadded' => ['bool'], - 'ui\controls\box::setPadded' => ['', 'padded'=>'bool'], - 'ui\controls\button::getText' => ['string'], - 'ui\controls\button::onClick' => [''], - 'ui\controls\button::setText' => ['', 'text'=>'string'], - 'ui\controls\check::getText' => ['string'], - 'ui\controls\check::isChecked' => ['bool'], - 'ui\controls\check::onToggle' => [''], - 'ui\controls\check::setChecked' => ['', 'checked'=>'bool'], - 'ui\controls\check::setText' => ['', 'text'=>'string'], - 'ui\controls\colorbutton::getColor' => ['UI\Color'], - 'ui\controls\colorbutton::onChange' => [''], - 'ui\controls\combo::append' => ['', 'text'=>'string'], - 'ui\controls\combo::getSelected' => ['int'], - 'ui\controls\combo::onSelected' => [''], - 'ui\controls\combo::setSelected' => ['', 'index'=>'int'], - 'ui\controls\editablecombo::append' => ['', 'text'=>'string'], - 'ui\controls\editablecombo::getText' => ['string'], - 'ui\controls\editablecombo::onChange' => [''], - 'ui\controls\editablecombo::setText' => ['', 'text'=>'string'], - 'ui\controls\entry::getText' => ['string'], - 'ui\controls\entry::isReadOnly' => ['bool'], - 'ui\controls\entry::onChange' => [''], - 'ui\controls\entry::setReadOnly' => ['', 'readOnly'=>'bool'], - 'ui\controls\entry::setText' => ['', 'text'=>'string'], - 'ui\controls\form::append' => ['int', 'label'=>'string', 'control'=>'UI\Control', 'stretchy='=>'bool'], - 'ui\controls\form::delete' => ['bool', 'index'=>'int'], - 'ui\controls\form::isPadded' => ['bool'], - 'ui\controls\form::setPadded' => ['', 'padded'=>'bool'], - 'ui\controls\grid::append' => ['', 'control'=>'UI\Control', 'left'=>'int', 'top'=>'int', 'xspan'=>'int', 'yspan'=>'int', 'hexpand'=>'bool', 'halign'=>'int', 'vexpand'=>'bool', 'valign'=>'int'], - 'ui\controls\grid::isPadded' => ['bool'], - 'ui\controls\grid::setPadded' => ['', 'padding'=>'bool'], - 'ui\controls\group::append' => ['', 'control'=>'UI\Control'], - 'ui\controls\group::getTitle' => ['string'], - 'ui\controls\group::hasMargin' => ['bool'], - 'ui\controls\group::setMargin' => ['', 'margin'=>'bool'], - 'ui\controls\group::setTitle' => ['', 'title'=>'string'], - 'ui\controls\label::getText' => ['string'], - 'ui\controls\label::setText' => ['', 'text'=>'string'], - 'ui\controls\multilineentry::append' => ['', 'text'=>'string'], - 'ui\controls\multilineentry::getText' => ['string'], - 'ui\controls\multilineentry::isReadOnly' => ['bool'], - 'ui\controls\multilineentry::onChange' => [''], - 'ui\controls\multilineentry::setReadOnly' => ['', 'readOnly'=>'bool'], - 'ui\controls\multilineentry::setText' => ['', 'text'=>'string'], - 'ui\controls\progress::getValue' => ['int'], - 'ui\controls\progress::setValue' => ['', 'value'=>'int'], - 'ui\controls\radio::append' => ['', 'text'=>'string'], - 'ui\controls\radio::getSelected' => ['int'], - 'ui\controls\radio::onSelected' => [''], - 'ui\controls\radio::setSelected' => ['', 'index'=>'int'], - 'ui\controls\slider::getValue' => ['int'], - 'ui\controls\slider::onChange' => [''], - 'ui\controls\slider::setValue' => ['', 'value'=>'int'], - 'ui\controls\spin::getValue' => ['int'], - 'ui\controls\spin::onChange' => [''], - 'ui\controls\spin::setValue' => ['', 'value'=>'int'], - 'ui\controls\tab::append' => ['int', 'name'=>'string', 'control'=>'UI\Control'], - 'ui\controls\tab::delete' => ['bool', 'index'=>'int'], - 'ui\controls\tab::hasMargin' => ['bool', 'page'=>'int'], - 'ui\controls\tab::insertAt' => ['', 'name'=>'string', 'page'=>'int', 'control'=>'UI\Control'], - 'ui\controls\tab::pages' => ['int'], - 'ui\controls\tab::setMargin' => ['', 'page'=>'int', 'margin'=>'bool'], - 'ui\draw\brush::getColor' => ['UI\Draw\Color'], - 'ui\draw\brush\gradient::delStop' => ['int', 'index'=>'int'], - 'ui\draw\color::getChannel' => ['float', 'channel'=>'int'], - 'ui\draw\color::setChannel' => ['void', 'channel'=>'int', 'value'=>'float'], - 'ui\draw\matrix::invert' => [''], - 'ui\draw\matrix::isInvertible' => ['bool'], - 'ui\draw\matrix::multiply' => ['UI\Draw\Matrix', 'matrix'=>'UI\Draw\Matrix'], - 'ui\draw\matrix::rotate' => ['', 'point'=>'UI\Point', 'amount'=>'float'], - 'ui\draw\matrix::scale' => ['', 'center'=>'UI\Point', 'point'=>'UI\Point'], - 'ui\draw\matrix::skew' => ['', 'point'=>'UI\Point', 'amount'=>'UI\Point'], - 'ui\draw\matrix::translate' => ['', 'point'=>'UI\Point'], - 'ui\draw\path::addRectangle' => ['', 'point'=>'UI\Point', 'size'=>'UI\Size'], - 'ui\draw\path::arcTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], - 'ui\draw\path::bezierTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], - 'ui\draw\path::closeFigure' => [''], - 'ui\draw\path::end' => [''], - 'ui\draw\path::lineTo' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], - 'ui\draw\path::newFigure' => ['', 'point'=>'UI\Point'], - 'ui\draw\path::newFigureWithArc' => ['', 'point'=>'UI\Point', 'radius'=>'float', 'angle'=>'float', 'sweep'=>'float', 'negative'=>'float'], - 'ui\draw\pen::clip' => ['', 'path'=>'UI\Draw\Path'], - 'ui\draw\pen::restore' => [''], - 'ui\draw\pen::save' => [''], - 'ui\draw\pen::transform' => ['', 'matrix'=>'UI\Draw\Matrix'], - 'ui\draw\pen::write' => ['', 'point'=>'UI\Point', 'layout'=>'UI\Draw\Text\Layout'], - 'ui\draw\stroke::getCap' => ['int'], - 'ui\draw\stroke::getJoin' => ['int'], - 'ui\draw\stroke::getMiterLimit' => ['float'], - 'ui\draw\stroke::getThickness' => ['float'], - 'ui\draw\stroke::setCap' => ['', 'cap'=>'int'], - 'ui\draw\stroke::setJoin' => ['', 'join'=>'int'], - 'ui\draw\stroke::setMiterLimit' => ['', 'limit'=>'float'], - 'ui\draw\stroke::setThickness' => ['', 'thickness'=>'float'], - 'ui\draw\text\font::getAscent' => ['float'], - 'ui\draw\text\font::getDescent' => ['float'], - 'ui\draw\text\font::getLeading' => ['float'], - 'ui\draw\text\font::getUnderlinePosition' => ['float'], - 'ui\draw\text\font::getUnderlineThickness' => ['float'], - 'ui\draw\text\font\descriptor::getFamily' => ['string'], - 'ui\draw\text\font\descriptor::getItalic' => ['int'], - 'ui\draw\text\font\descriptor::getSize' => ['float'], - 'ui\draw\text\font\descriptor::getStretch' => ['int'], - 'ui\draw\text\font\descriptor::getWeight' => ['int'], - 'ui\draw\text\font\fontfamilies' => ['array'], - 'ui\draw\text\layout::setWidth' => ['', 'width'=>'float'], - 'ui\executor::kill' => ['void'], - 'ui\executor::onExecute' => ['void'], - 'ui\menu::append' => ['UI\MenuItem', 'name'=>'string', 'type='=>'string'], - 'ui\menu::appendAbout' => ['UI\MenuItem', 'type='=>'string'], - 'ui\menu::appendCheck' => ['UI\MenuItem', 'name'=>'string', 'type='=>'string'], - 'ui\menu::appendPreferences' => ['UI\MenuItem', 'type='=>'string'], - 'ui\menu::appendQuit' => ['UI\MenuItem', 'type='=>'string'], - 'ui\menu::appendSeparator' => [''], - 'ui\menuitem::disable' => [''], - 'ui\menuitem::enable' => [''], - 'ui\menuitem::isChecked' => ['bool'], - 'ui\menuitem::onClick' => [''], - 'ui\menuitem::setChecked' => ['', 'checked'=>'bool'], - 'ui\point::getX' => ['float'], - 'ui\point::getY' => ['float'], - 'ui\point::setX' => ['', 'point'=>'float'], - 'ui\point::setY' => ['', 'point'=>'float'], - 'ui\quit' => ['void'], - 'ui\run' => ['void', 'flags='=>'int'], - 'ui\size::getHeight' => ['float'], - 'ui\size::getWidth' => ['float'], - 'ui\size::setHeight' => ['', 'size'=>'float'], - 'ui\size::setWidth' => ['', 'size'=>'float'], - 'ui\window::add' => ['', 'control'=>'UI\Control'], - 'ui\window::error' => ['', 'title'=>'string', 'msg'=>'string'], - 'ui\window::getSize' => ['UI\Size'], - 'ui\window::getTitle' => ['string'], - 'ui\window::hasBorders' => ['bool'], - 'ui\window::hasMargin' => ['bool'], - 'ui\window::isFullScreen' => ['bool'], - 'ui\window::msg' => ['', 'title'=>'string', 'msg'=>'string'], - 'ui\window::onClosing' => ['int'], - 'ui\window::open' => ['string'], - 'ui\window::save' => ['string'], - 'ui\window::setBorders' => ['', 'borders'=>'bool'], - 'ui\window::setFullScreen' => ['', 'full'=>'bool'], - 'ui\window::setMargin' => ['', 'margin'=>'bool'], - 'ui\window::setSize' => ['', 'size'=>'UI\Size'], - 'ui\window::setTitle' => ['', 'title'=>'string'], - 'uksort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], - 'umask' => ['int', 'mask='=>'int'], - 'uniqid' => ['non-empty-string', 'prefix='=>'string', 'more_entropy='=>'bool'], - 'unixtojd' => ['int', 'timestamp='=>'int'], - 'unlink' => ['bool', 'filename'=>'string', 'context='=>'resource'], - 'unpack' => ['array', 'format'=>'string', 'string'=>'string'], - 'unregister_tick_function' => ['void', 'callback'=>'callable'], - 'unserialize' => ['mixed', 'data'=>'string', 'options='=>'array{allowed_classes?:string[]|bool}'], - 'unset' => ['void', 'var='=>'mixed', '...args='=>'mixed'], - 'untaint' => ['bool', '&rw_string'=>'string', '&...rw_strings='=>'string'], - 'uopz_allow_exit' => ['void', 'allow'=>'bool'], - 'uopz_backup' => ['void', 'class'=>'string', 'function'=>'string'], - 'uopz_backup\'1' => ['void', 'function'=>'string'], - 'uopz_compose' => ['void', 'name'=>'string', 'classes'=>'array', 'methods='=>'array', 'properties='=>'array', 'flags='=>'int'], - 'uopz_copy' => ['Closure', 'class'=>'string', 'function'=>'string'], - 'uopz_copy\'1' => ['Closure', 'function'=>'string'], - 'uopz_delete' => ['void', 'class'=>'string', 'function'=>'string'], - 'uopz_delete\'1' => ['void', 'function'=>'string'], - 'uopz_extend' => ['bool', 'class'=>'string', 'parent'=>'string'], - 'uopz_flags' => ['int', 'class'=>'string', 'function'=>'string', 'flags'=>'int'], - 'uopz_flags\'1' => ['int', 'function'=>'string', 'flags'=>'int'], - 'uopz_function' => ['void', 'class'=>'string', 'function'=>'string', 'handler'=>'Closure', 'modifiers='=>'int'], - 'uopz_function\'1' => ['void', 'function'=>'string', 'handler'=>'Closure', 'modifiers='=>'int'], - 'uopz_get_exit_status' => ['?int'], - 'uopz_get_hook' => ['?Closure', 'class'=>'string', 'function'=>'string'], - '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_static' => ['?array', 'class'=>'string', 'function'=>'string'], - 'uopz_implement' => ['bool', 'class'=>'string', 'interface'=>'string'], - 'uopz_overload' => ['void', 'opcode'=>'int', 'callable'=>'Callable'], - 'uopz_redefine' => ['bool', 'class'=>'string', 'constant'=>'string', 'value'=>'mixed'], - 'uopz_redefine\'1' => ['bool', 'constant'=>'string', 'value'=>'mixed'], - 'uopz_rename' => ['void', 'class'=>'string', 'function'=>'string', 'rename'=>'string'], - 'uopz_rename\'1' => ['void', 'function'=>'string', 'rename'=>'string'], - 'uopz_restore' => ['void', 'class'=>'string', 'function'=>'string'], - 'uopz_restore\'1' => ['void', 'function'=>'string'], - 'uopz_set_hook' => ['bool', 'class'=>'string', 'function'=>'string', 'hook'=>'Closure'], - 'uopz_set_hook\'1' => ['bool', 'function'=>'string', 'hook'=>'Closure'], - 'uopz_set_mock' => ['void', 'class'=>'string', 'mock'=>'object|string'], - 'uopz_set_property' => ['void', 'class'=>'object|string', 'property'=>'string', 'value'=>'mixed'], - 'uopz_set_return' => ['bool', 'class'=>'string', 'function'=>'string', 'value'=>'mixed', 'execute='=>'bool'], - 'uopz_set_return\'1' => ['bool', 'function'=>'string', 'value'=>'mixed', 'execute='=>'bool'], - 'uopz_set_static' => ['void', 'class'=>'string', 'function'=>'string', 'static'=>'array'], - 'uopz_undefine' => ['bool', 'class'=>'string', 'constant'=>'string'], - 'uopz_undefine\'1' => ['bool', 'constant'=>'string'], - '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\'1' => ['bool', 'function'=>'string'], - 'urldecode' => ['string', 'string'=>'string'], - 'urlencode' => ['string', 'string'=>'string'], - 'use_soap_error_handler' => ['bool', 'enable='=>'bool'], - 'user_error' => ['void', 'message'=>'string', 'error_level='=>'int'], - 'usleep' => ['void', 'microseconds'=>'positive-int|0'], - 'usort' => ['bool', '&rw_array'=>'array', 'callback'=>'callable(mixed,mixed):int'], - 'utf8_decode' => ['string', 'string'=>'string'], - 'utf8_encode' => ['string', 'string'=>'string'], - 'var_dump' => ['void', 'value'=>'mixed', '...values='=>'mixed'], - 'var_export' => ['?string', 'value'=>'mixed', 'return='=>'bool'], - 'variant_abs' => ['mixed', 'value'=>'mixed'], - 'variant_add' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_and' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_cast' => ['VARIANT', 'variant'=>'VARIANT', 'type'=>'int'], - 'variant_cat' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_cmp' => ['int', 'left'=>'mixed', 'right'=>'mixed', 'locale_id='=>'int', 'flags='=>'int'], - 'variant_date_from_timestamp' => ['VARIANT', 'timestamp'=>'int'], - 'variant_date_to_timestamp' => ['int', 'variant'=>'VARIANT'], - 'variant_div' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_eqv' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_fix' => ['mixed', 'value'=>'mixed'], - 'variant_get_type' => ['int', 'variant'=>'VARIANT'], - 'variant_idiv' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_imp' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_int' => ['mixed', 'value'=>'mixed'], - 'variant_mod' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_mul' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_neg' => ['mixed', 'value'=>'mixed'], - 'variant_not' => ['mixed', 'value'=>'mixed'], - 'variant_or' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_pow' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_round' => ['mixed', 'value'=>'mixed', 'decimals'=>'int'], - 'variant_set' => ['void', 'variant'=>'object', 'value'=>'mixed'], - 'variant_set_type' => ['void', 'variant'=>'object', 'type'=>'int'], - 'variant_sub' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'variant_xor' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], - 'version_compare' => ['bool', 'version1'=>'string', 'version2'=>'string', 'operator'=>'\'<\'|\'lt\'|\'<=\'|\'le\'|\'>\'|\'gt\'|\'>=\'|\'ge\'|\'==\'|\'=\'|\'eq\'|\'!=\'|\'<>\'|\'ne\''], - 'version_compare\'1' => ['int', 'version1'=>'string', 'version2'=>'string'], - 'vfprintf' => ['int', 'stream'=>'resource', 'format'=>'string', 'values'=>'array'], - 'virtual' => ['bool', 'uri'=>'string'], - 'vpopmail_add_alias_domain' => ['bool', 'domain'=>'string', 'aliasdomain'=>'string'], - 'vpopmail_add_alias_domain_ex' => ['bool', 'olddomain'=>'string', 'newdomain'=>'string'], - 'vpopmail_add_domain' => ['bool', 'domain'=>'string', 'dir'=>'string', 'uid'=>'int', 'gid'=>'int'], - 'vpopmail_add_domain_ex' => ['bool', 'domain'=>'string', 'passwd'=>'string', 'quota='=>'string', 'bounce='=>'string', 'apop='=>'bool'], - 'vpopmail_add_user' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'gecos='=>'string', 'apop='=>'bool'], - 'vpopmail_alias_add' => ['bool', 'user'=>'string', 'domain'=>'string', 'alias'=>'string'], - 'vpopmail_alias_del' => ['bool', 'user'=>'string', 'domain'=>'string'], - 'vpopmail_alias_del_domain' => ['bool', 'domain'=>'string'], - 'vpopmail_alias_get' => ['array', 'alias'=>'string', 'domain'=>'string'], - 'vpopmail_alias_get_all' => ['array', 'domain'=>'string'], - 'vpopmail_auth_user' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'apop='=>'string'], - 'vpopmail_del_domain' => ['bool', 'domain'=>'string'], - 'vpopmail_del_domain_ex' => ['bool', 'domain'=>'string'], - 'vpopmail_del_user' => ['bool', 'user'=>'string', 'domain'=>'string'], - 'vpopmail_error' => ['string'], - 'vpopmail_passwd' => ['bool', 'user'=>'string', 'domain'=>'string', 'password'=>'string', 'apop='=>'bool'], - 'vpopmail_set_user_quota' => ['bool', 'user'=>'string', 'domain'=>'string', 'quota'=>'string'], - 'vprintf' => ['int', 'format'=>'string', 'values'=>'array'], - 'vsprintf' => ['string', 'format'=>'string', 'values'=>'array'], - 'w32api_deftype' => ['bool', 'typename'=>'string', 'member1_type'=>'string', 'member1_name'=>'string', '...args='=>'string'], - 'w32api_init_dtype' => ['resource', 'typename'=>'string', 'value'=>'', '...args='=>''], - 'w32api_invoke_function' => ['', 'funcname'=>'string', 'argument'=>'', '...args='=>''], - 'w32api_register_function' => ['bool', 'library'=>'string', 'function_name'=>'string', 'return_type'=>'string'], - 'w32api_set_call_method' => ['', 'method'=>'int'], - 'wddx_add_vars' => ['bool', 'packet_id'=>'resource', 'var_names'=>'mixed', '...vars='=>'mixed'], - 'wddx_deserialize' => ['mixed', 'packet'=>'string'], - 'wddx_packet_end' => ['string', 'packet_id'=>'resource'], - 'wddx_packet_start' => ['resource|false', 'comment='=>'string'], - 'wddx_serialize_value' => ['string|false', 'value'=>'mixed', 'comment='=>'string'], - 'wddx_serialize_vars' => ['string|false', 'var_name'=>'mixed', '...vars='=>'mixed'], - 'webObj::convertToString' => ['string'], - 'webObj::free' => ['void'], - 'webObj::set' => ['int', 'property_name'=>'string', 'new_value'=>''], - 'webObj::updateFromString' => ['int', 'snippet'=>'string'], - 'win32_continue_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], - 'win32_create_service' => ['int|false', 'details'=>'array', 'machine='=>'string'], - 'win32_delete_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], - 'win32_get_last_control_message' => ['int'], - 'win32_pause_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], - 'win32_ps_list_procs' => ['array'], - 'win32_ps_stat_mem' => ['array'], - 'win32_ps_stat_proc' => ['array', 'pid='=>'int'], - 'win32_query_service_status' => ['array|false|int', 'servicename'=>'string', 'machine='=>'string'], - 'win32_send_custom_control' => ['int', 'servicename'=>'string', 'control'=>'int', 'machine='=>'string'], - 'win32_set_service_exit_code' => ['int', 'exitCode='=>'int'], - 'win32_set_service_exit_mode' => ['bool', 'gracefulMode='=>'bool'], - 'win32_set_service_status' => ['bool|int', 'status'=>'int', 'checkpoint='=>'int'], - 'win32_start_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], - 'win32_start_service_ctrl_dispatcher' => ['bool|int', 'name'=>'string'], - 'win32_stop_service' => ['int|false', 'servicename'=>'string', 'machine='=>'string'], - 'wincache_fcache_fileinfo' => ['array|false', 'summaryonly='=>'bool'], - 'wincache_fcache_meminfo' => ['array|false'], - 'wincache_lock' => ['bool', 'key'=>'string', 'isglobal='=>'bool'], - 'wincache_ocache_fileinfo' => ['array|false', 'summaryonly='=>'bool'], - 'wincache_ocache_meminfo' => ['array|false'], - 'wincache_refresh_if_changed' => ['bool', 'files='=>'array'], - 'wincache_rplist_fileinfo' => ['array|false', 'summaryonly='=>'bool'], - 'wincache_rplist_meminfo' => ['array|false'], - 'wincache_scache_info' => ['array|false', 'summaryonly='=>'bool'], - 'wincache_scache_meminfo' => ['array|false'], - 'wincache_ucache_add' => ['bool', 'key'=>'string', 'value'=>'mixed', 'ttl='=>'int'], - 'wincache_ucache_add\'1' => ['bool', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], - 'wincache_ucache_cas' => ['bool', 'key'=>'string', 'old_value'=>'int', 'new_value'=>'int'], - 'wincache_ucache_clear' => ['bool'], - 'wincache_ucache_dec' => ['int|false', 'key'=>'string', 'dec_by='=>'int', 'success='=>'bool'], - 'wincache_ucache_delete' => ['bool', 'key'=>'mixed'], - 'wincache_ucache_exists' => ['bool', 'key'=>'string'], - 'wincache_ucache_get' => ['mixed', 'key'=>'mixed', '&w_success='=>'bool'], - 'wincache_ucache_inc' => ['int|false', 'key'=>'string', 'inc_by='=>'int', 'success='=>'bool'], - 'wincache_ucache_info' => ['array|false', 'summaryonly='=>'bool', 'key='=>'string'], - 'wincache_ucache_meminfo' => ['array|false'], - 'wincache_ucache_set' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int'], - 'wincache_ucache_set\'1' => ['bool', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'], - 'wincache_unlock' => ['bool', 'key'=>'string'], - 'wkhtmltox\image\converter::convert' => ['?string'], - 'wkhtmltox\image\converter::getVersion' => ['string'], - 'wkhtmltox\pdf\converter::add' => ['void', 'object'=>'wkhtmltox\PDF\Object'], - 'wkhtmltox\pdf\converter::convert' => ['?string'], - 'wkhtmltox\pdf\converter::getVersion' => ['string'], - 'wordwrap' => ['string', 'string'=>'string', 'width='=>'int', 'break='=>'string', 'cut_long_words='=>'bool'], - 'xattr_get' => ['string', 'filename'=>'string', 'name'=>'string', 'flags='=>'int'], - 'xattr_list' => ['array', 'filename'=>'string', 'flags='=>'int'], - 'xattr_remove' => ['bool', 'filename'=>'string', 'name'=>'string', 'flags='=>'int'], - 'xattr_set' => ['bool', 'filename'=>'string', 'name'=>'string', 'value'=>'string', 'flags='=>'int'], - 'xattr_supported' => ['bool', 'filename'=>'string', 'flags='=>'int'], - 'xcache_asm' => ['string', 'filename'=>'string'], - 'xcache_clear_cache' => ['void', 'type'=>'int', 'id='=>'int'], - 'xcache_coredump' => ['string', 'op_type'=>'int'], - 'xcache_count' => ['int', 'type'=>'int'], - 'xcache_coverager_decode' => ['array', 'data'=>'string'], - 'xcache_coverager_get' => ['array', 'clean='=>'bool'], - 'xcache_coverager_start' => ['void', 'clean='=>'bool'], - 'xcache_coverager_stop' => ['void', 'clean='=>'bool'], - 'xcache_dasm_file' => ['string', 'filename'=>'string'], - 'xcache_dasm_string' => ['string', 'code'=>'string'], - 'xcache_dec' => ['int', 'name'=>'string', 'value='=>'int|mixed', 'ttl='=>'int'], - 'xcache_decode' => ['bool', 'filename'=>'string'], - 'xcache_encode' => ['string', 'filename'=>'string'], - 'xcache_get' => ['mixed', 'name'=>'string'], - 'xcache_get_data_type' => ['string', 'type'=>'int'], - 'xcache_get_op_spec' => ['string', 'op_type'=>'int'], - 'xcache_get_op_type' => ['string', 'op_type'=>'int'], - 'xcache_get_opcode' => ['string', 'opcode'=>'int'], - 'xcache_get_opcode_spec' => ['string', 'opcode'=>'int'], - 'xcache_inc' => ['int', 'name'=>'string', 'value='=>'int|mixed', 'ttl='=>'int'], - 'xcache_info' => ['array', 'type'=>'int', 'id'=>'int'], - 'xcache_is_autoglobal' => ['string', 'name'=>'string'], - 'xcache_isset' => ['bool', 'name'=>'string'], - 'xcache_list' => ['array', 'type'=>'int', 'id'=>'int'], - 'xcache_set' => ['bool', 'name'=>'string', 'value'=>'mixed', 'ttl='=>'int'], - 'xcache_unset' => ['bool', 'name'=>'string'], - 'xcache_unset_by_prefix' => ['bool', 'prefix'=>'string'], - 'xdebug_break' => ['bool'], - 'xdebug_call_class' => ['string', 'depth='=>'int'], - 'xdebug_call_file' => ['string', 'depth='=>'int'], - 'xdebug_call_function' => ['string', 'depth='=>'int'], - 'xdebug_call_line' => ['int', 'depth='=>'int'], - 'xdebug_clear_aggr_profiling_data' => ['bool'], - 'xdebug_code_coverage_started' => ['bool'], - 'xdebug_debug_zval' => ['void', '...varName'=>'string'], - 'xdebug_debug_zval_stdout' => ['void', '...varName'=>'string'], - 'xdebug_disable' => ['void'], - 'xdebug_dump_aggr_profiling_data' => ['bool'], - 'xdebug_dump_superglobals' => ['void'], - 'xdebug_enable' => ['void'], - 'xdebug_get_code_coverage' => ['array'], - 'xdebug_get_collected_errors' => ['string', 'clean='=>'bool'], - 'xdebug_get_declared_vars' => ['array'], - 'xdebug_get_formatted_function_stack' => [''], - 'xdebug_get_function_count' => ['int'], - 'xdebug_get_function_stack' => ['array', 'message='=>'string', 'options='=>'int'], - 'xdebug_get_headers' => ['array'], - 'xdebug_get_monitored_functions' => ['array'], - 'xdebug_get_profiler_filename' => ['string|false'], - 'xdebug_get_stack_depth' => ['int'], - 'xdebug_get_tracefile_name' => ['string'], - 'xdebug_is_debugger_active' => ['bool'], - 'xdebug_is_enabled' => ['bool'], - 'xdebug_memory_usage' => ['int'], - 'xdebug_peak_memory_usage' => ['int'], - 'xdebug_print_function_stack' => ['array', 'message='=>'string', 'options='=>'int'], - 'xdebug_set_filter' => ['void', 'group'=>'int', 'list_type'=>'int', 'configuration'=>'array'], - 'xdebug_start_code_coverage' => ['void', 'options='=>'int'], - 'xdebug_start_error_collection' => ['void'], - 'xdebug_start_function_monitor' => ['void', 'list_of_functions_to_monitor'=>'string[]'], - 'xdebug_start_trace' => ['void', 'trace_file'=>'', 'options='=>'int|mixed'], - 'xdebug_stop_code_coverage' => ['void', 'cleanup='=>'bool'], - 'xdebug_stop_error_collection' => ['void'], - 'xdebug_stop_function_monitor' => ['void'], - 'xdebug_stop_trace' => ['void'], - 'xdebug_time_index' => ['float'], - 'xdebug_var_dump' => ['void', '...var'=>''], - 'xdiff_file_bdiff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], - 'xdiff_file_bdiff_size' => ['int', 'file'=>'string'], - 'xdiff_file_bpatch' => ['bool', 'file'=>'string', 'patch'=>'string', 'dest'=>'string'], - 'xdiff_file_diff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string', 'context='=>'int', 'minimal='=>'bool'], - 'xdiff_file_diff_binary' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], - 'xdiff_file_merge3' => ['mixed', 'old_file'=>'string', 'new_file1'=>'string', 'new_file2'=>'string', 'dest'=>'string'], - 'xdiff_file_patch' => ['mixed', 'file'=>'string', 'patch'=>'string', 'dest'=>'string', 'flags='=>'int'], - 'xdiff_file_patch_binary' => ['bool', 'file'=>'string', 'patch'=>'string', 'dest'=>'string'], - 'xdiff_file_rabdiff' => ['bool', 'old_file'=>'string', 'new_file'=>'string', 'dest'=>'string'], - 'xdiff_string_bdiff' => ['string', 'old_data'=>'string', 'new_data'=>'string'], - 'xdiff_string_bdiff_size' => ['int', 'patch'=>'string'], - 'xdiff_string_bpatch' => ['string', 'string'=>'string', 'patch'=>'string'], - 'xdiff_string_diff' => ['string', 'old_data'=>'string', 'new_data'=>'string', 'context='=>'int', 'minimal='=>'bool'], - 'xdiff_string_diff_binary' => ['string', 'old_data'=>'string', 'new_data'=>'string'], - 'xdiff_string_merge3' => ['mixed', 'old_data'=>'string', 'new_data1'=>'string', 'new_data2'=>'string', 'error='=>'string'], - 'xdiff_string_patch' => ['string', 'string'=>'string', 'patch'=>'string', 'flags='=>'int', '&w_error='=>'string'], - 'xdiff_string_patch_binary' => ['string', 'string'=>'string', 'patch'=>'string'], - 'xdiff_string_rabdiff' => ['string', 'old_data'=>'string', 'new_data'=>'string'], - 'xhprof_disable' => ['array'], - 'xhprof_enable' => ['void', 'flags='=>'int', 'options='=>'array'], - 'xhprof_sample_disable' => ['array'], - 'xhprof_sample_enable' => ['void'], - 'xlswriter_get_author' => ['string'], - 'xlswriter_get_version' => ['string'], - 'xml_error_string' => ['?string', 'error_code'=>'int'], - 'xml_get_current_byte_index' => ['int|false', 'parser'=>'resource'], - 'xml_get_current_column_number' => ['int|false', 'parser'=>'resource'], - 'xml_get_current_line_number' => ['int|false', 'parser'=>'resource'], - 'xml_get_error_code' => ['int|false', 'parser'=>'resource'], - 'xml_parse' => ['int', 'parser'=>'resource', 'data'=>'string', 'is_final='=>'bool'], - 'xml_parse_into_struct' => ['int', 'parser'=>'resource', 'data'=>'string', '&w_values'=>'array', '&w_index='=>'array'], - 'xml_parser_create' => ['resource', 'encoding='=>'string'], - 'xml_parser_create_ns' => ['resource', 'encoding='=>'string', 'separator='=>'string'], - 'xml_parser_free' => ['bool', 'parser'=>'resource'], - 'xml_parser_get_option' => ['mixed|false', 'parser'=>'resource', 'option'=>'int'], - 'xml_parser_set_option' => ['bool', 'parser'=>'resource', 'option'=>'int', 'value'=>'mixed'], - 'xml_set_character_data_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'xml_set_default_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'xml_set_element_handler' => ['bool', 'parser'=>'resource', 'start_handler'=>'callable', 'end_handler'=>'callable'], - 'xml_set_end_namespace_decl_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'xml_set_external_entity_ref_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'xml_set_notation_decl_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'xml_set_object' => ['bool', 'parser'=>'resource', 'object'=>'object'], - 'xml_set_processing_instruction_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'xml_set_start_namespace_decl_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'xml_set_unparsed_entity_decl_handler' => ['bool', 'parser'=>'resource', 'handler'=>'callable'], - 'xmlrpc_decode' => ['mixed', 'xml'=>'string', 'encoding='=>'string'], - 'xmlrpc_decode_request' => ['?array', 'xml'=>'string', '&w_method'=>'string', 'encoding='=>'string'], - 'xmlrpc_encode' => ['string', 'value'=>'mixed'], - 'xmlrpc_encode_request' => ['string', 'method'=>'string', 'params'=>'mixed', 'output_options='=>'array'], - 'xmlrpc_get_type' => ['string', 'value'=>'mixed'], - 'xmlrpc_is_fault' => ['bool', 'arg'=>'array'], - 'xmlrpc_parse_method_descriptions' => ['array', 'xml'=>'string'], - 'xmlrpc_server_add_introspection_data' => ['int', 'server'=>'resource', 'desc'=>'array'], - 'xmlrpc_server_call_method' => ['string', 'server'=>'resource', 'xml'=>'string', 'user_data'=>'mixed', 'output_options='=>'array'], - 'xmlrpc_server_create' => ['resource'], - 'xmlrpc_server_destroy' => ['int', 'server'=>'resource'], - 'xmlrpc_server_register_introspection_callback' => ['bool', 'server'=>'resource', 'function'=>'string'], - 'xmlrpc_server_register_method' => ['bool', 'server'=>'resource', 'method_name'=>'string', 'function'=>'string'], - 'xmlrpc_set_type' => ['bool', '&rw_value'=>'string|DateTime', 'type'=>'string'], - 'xmlwriter_end_attribute' => ['bool', 'writer'=>'resource'], - 'xmlwriter_end_cdata' => ['bool', 'writer'=>'resource'], - 'xmlwriter_end_comment' => ['bool', 'writer'=>'resource'], - 'xmlwriter_end_document' => ['bool', 'writer'=>'resource'], - 'xmlwriter_end_dtd' => ['bool', 'writer'=>'resource'], - 'xmlwriter_end_dtd_attlist' => ['bool', 'writer'=>'resource'], - 'xmlwriter_end_dtd_element' => ['bool', 'writer'=>'resource'], - 'xmlwriter_end_dtd_entity' => ['bool', 'writer'=>'resource'], - 'xmlwriter_end_element' => ['bool', 'writer'=>'resource'], - 'xmlwriter_end_pi' => ['bool', 'writer'=>'resource'], - 'xmlwriter_flush' => ['string|int|false', 'writer'=>'resource', 'empty='=>'bool'], - 'xmlwriter_full_end_element' => ['bool', 'writer'=>'resource'], - 'xmlwriter_open_memory' => ['resource|false'], - 'xmlwriter_open_uri' => ['resource|false', 'uri'=>'string'], - 'xmlwriter_output_memory' => ['string', 'writer'=>'resource', 'flush='=>'bool'], - 'xmlwriter_set_indent' => ['bool', 'writer'=>'resource', 'enable'=>'bool'], - 'xmlwriter_set_indent_string' => ['bool', 'writer'=>'resource', 'indentation'=>'string'], - 'xmlwriter_start_attribute' => ['bool', 'writer'=>'resource', 'name'=>'string'], - 'xmlwriter_start_attribute_ns' => ['bool', 'writer'=>'resource', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string'], - 'xmlwriter_start_cdata' => ['bool', 'writer'=>'resource'], - 'xmlwriter_start_comment' => ['bool', 'writer'=>'resource'], - 'xmlwriter_start_document' => ['bool', 'writer'=>'resource', 'version='=>'?string', 'encoding='=>'?string', 'standalone='=>'?string'], - 'xmlwriter_start_dtd' => ['bool', 'writer'=>'resource', 'qualifiedName'=>'string', 'publicId='=>'?string', 'systemId='=>'?string'], - 'xmlwriter_start_dtd_attlist' => ['bool', 'writer'=>'resource', 'name'=>'string'], - 'xmlwriter_start_dtd_element' => ['bool', 'writer'=>'resource', 'qualifiedName'=>'string'], - 'xmlwriter_start_dtd_entity' => ['bool', 'writer'=>'resource', 'name'=>'string', 'isParam'=>'bool'], - 'xmlwriter_start_element' => ['bool', 'writer'=>'resource', 'name'=>'string'], - 'xmlwriter_start_element_ns' => ['bool', 'writer'=>'resource', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'?string'], - 'xmlwriter_start_pi' => ['bool', 'writer'=>'resource', 'target'=>'string'], - 'xmlwriter_text' => ['bool', 'writer'=>'resource', 'content'=>'string'], - 'xmlwriter_write_attribute' => ['bool', 'writer'=>'resource', 'name'=>'string', 'value'=>'string'], - 'xmlwriter_write_attribute_ns' => ['bool', 'writer'=>'resource', 'prefix'=>'string', 'name'=>'string', 'namespace'=>'?string', 'value'=>'string'], - 'xmlwriter_write_cdata' => ['bool', 'writer'=>'resource', 'content'=>'string'], - 'xmlwriter_write_comment' => ['bool', 'writer'=>'resource', 'content'=>'string'], - 'xmlwriter_write_dtd' => ['bool', 'writer'=>'resource', 'name'=>'string', 'publicId='=>'?string', 'systemId='=>'?string', 'content='=>'?string'], - 'xmlwriter_write_dtd_attlist' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string'], - 'xmlwriter_write_dtd_element' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string'], - 'xmlwriter_write_dtd_entity' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'string', 'isParam'=>'bool', 'publicId'=>'string', 'systemId'=>'string', 'notationData'=>'string'], - 'xmlwriter_write_element' => ['bool', 'writer'=>'resource', 'name'=>'string', 'content'=>'?string'], - 'xmlwriter_write_element_ns' => ['bool', 'writer'=>'resource', 'prefix'=>'?string', 'name'=>'string', 'namespace'=>'string', 'content'=>'?string'], - 'xmlwriter_write_pi' => ['bool', 'writer'=>'resource', 'target'=>'string', 'content'=>'string'], - 'xmlwriter_write_raw' => ['bool', 'writer'=>'resource', 'content'=>'string'], - 'xpath_new_context' => ['XPathContext', 'dom_document'=>'DOMDocument'], - 'xpath_register_ns' => ['bool', 'xpath_context'=>'xpathcontext', 'prefix'=>'string', 'uri'=>'string'], - 'xpath_register_ns_auto' => ['bool', 'xpath_context'=>'xpathcontext', 'context_node='=>'object'], - 'xptr_new_context' => ['XPathContext'], - 'xsl_xsltprocessor_get_parameter' => ['string', 'namespace'=>'string', 'name'=>'string'], - 'xsl_xsltprocessor_get_security_prefs' => ['int'], - 'xsl_xsltprocessor_has_exslt_support' => ['bool'], - 'xsl_xsltprocessor_register_php_functions' => ['', 'restrict'=>''], - 'xsl_xsltprocessor_remove_parameter' => ['bool', 'namespace'=>'string', 'name'=>'string'], - 'xsl_xsltprocessor_set_parameter' => ['bool', 'namespace'=>'string', 'name'=>'', 'value'=>'string'], - 'xsl_xsltprocessor_set_profiling' => ['bool', 'filename'=>'string'], - 'xsl_xsltprocessor_set_security_prefs' => ['int', 'securityprefs'=>'int'], - 'xsl_xsltprocessor_transform_to_uri' => ['int', 'doc'=>'DOMDocument', 'uri'=>'string'], - 'xsl_xsltprocessor_transform_to_xml' => ['string', 'doc'=>'DOMDocument'], - 'xslt_backend_info' => ['string'], - 'xslt_backend_name' => ['string'], - 'xslt_backend_version' => ['string'], - 'xslt_create' => ['resource'], - 'xslt_errno' => ['int', 'xh'=>''], - 'xslt_error' => ['string', 'xh'=>''], - 'xslt_free' => ['', 'xh'=>''], - 'xslt_getopt' => ['int', 'processor'=>''], - 'xslt_process' => ['', 'xh'=>'', 'xmlcontainer'=>'string', 'xslcontainer'=>'string', 'resultcontainer='=>'string', 'arguments='=>'array', 'parameters='=>'array'], - 'xslt_set_base' => ['', 'xh'=>'', 'uri'=>'string'], - 'xslt_set_encoding' => ['', 'xh'=>'', 'encoding'=>'string'], - 'xslt_set_error_handler' => ['', 'xh'=>'', 'handler'=>''], - 'xslt_set_log' => ['', 'xh'=>'', 'log='=>''], - 'xslt_set_object' => ['bool', 'processor'=>'', 'object'=>'object'], - 'xslt_set_sax_handler' => ['', 'xh'=>'', 'handlers'=>'array'], - 'xslt_set_sax_handlers' => ['', 'processor'=>'', 'handlers'=>'array'], - 'xslt_set_scheme_handler' => ['', 'xh'=>'', 'handlers'=>'array'], - 'xslt_set_scheme_handlers' => ['', 'xh'=>'', 'handlers'=>'array'], - 'xslt_setopt' => ['', 'processor'=>'', 'newmask'=>'int'], - 'yac::__construct' => ['void', 'prefix='=>'string'], - 'yac::__get' => ['mixed', 'key'=>'string'], - 'yac::__set' => ['mixed', 'key'=>'string', 'value'=>'mixed'], - 'yac::delete' => ['bool', 'keys'=>'string|array', 'ttl='=>'int'], - 'yac::dump' => ['mixed', 'num'=>'int'], - 'yac::flush' => ['bool'], - 'yac::get' => ['mixed', 'key'=>'string|array', 'cas='=>'int'], - 'yac::info' => ['array'], - 'yaml_emit' => ['string', 'data'=>'mixed', 'encoding='=>'int', 'linebreak='=>'int'], - 'yaml_emit_file' => ['bool', 'filename'=>'string', 'data'=>'mixed', 'encoding='=>'int', 'linebreak='=>'int'], - 'yaml_parse' => ['mixed|false', 'input'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], - 'yaml_parse_file' => ['mixed|false', 'filename'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], - 'yaml_parse_url' => ['mixed|false', 'url'=>'string', 'pos='=>'int', '&w_ndocs='=>'int', 'callbacks='=>'array'], - 'yaz_addinfo' => ['string', 'id'=>'resource'], - 'yaz_ccl_conf' => ['void', 'id'=>'resource', 'config'=>'array'], - 'yaz_ccl_parse' => ['bool', 'id'=>'resource', 'query'=>'string', '&w_result'=>'array'], - 'yaz_close' => ['bool', 'id'=>'resource'], - 'yaz_connect' => ['mixed', 'zurl'=>'string', 'options='=>'mixed'], - 'yaz_database' => ['bool', 'id'=>'resource', 'databases'=>'string'], - 'yaz_element' => ['bool', 'id'=>'resource', 'elementset'=>'string'], - 'yaz_errno' => ['int', 'id'=>'resource'], - 'yaz_error' => ['string', 'id'=>'resource'], - 'yaz_es' => ['void', 'id'=>'resource', 'type'=>'string', 'args'=>'array'], - 'yaz_es_result' => ['array', 'id'=>'resource'], - 'yaz_get_option' => ['string', 'id'=>'resource', 'name'=>'string'], - 'yaz_hits' => ['int', 'id'=>'resource', 'searchresult='=>'array'], - 'yaz_itemorder' => ['void', 'id'=>'resource', 'args'=>'array'], - 'yaz_present' => ['bool', 'id'=>'resource'], - 'yaz_range' => ['void', 'id'=>'resource', 'start'=>'int', 'number'=>'int'], - 'yaz_record' => ['string', 'id'=>'resource', 'pos'=>'int', 'type'=>'string'], - 'yaz_scan' => ['void', 'id'=>'resource', 'type'=>'string', 'startterm'=>'string', 'flags='=>'array'], - 'yaz_scan_result' => ['array', 'id'=>'resource', 'result='=>'array'], - 'yaz_schema' => ['void', 'id'=>'resource', 'schema'=>'string'], - 'yaz_search' => ['bool', 'id'=>'resource', 'type'=>'string', 'query'=>'string'], - 'yaz_set_option' => ['', 'id'=>'', 'name'=>'string', 'value'=>'string', 'options'=>'array'], - 'yaz_sort' => ['void', 'id'=>'resource', 'criteria'=>'string'], - 'yaz_syntax' => ['void', 'id'=>'resource', 'syntax'=>'string'], - 'yaz_wait' => ['mixed', '&rw_options='=>'array'], - 'yp_all' => ['void', 'domain'=>'string', 'map'=>'string', 'callback'=>'string'], - 'yp_cat' => ['array', 'domain'=>'string', 'map'=>'string'], - 'yp_err_string' => ['string', 'errorcode'=>'int'], - 'yp_errno' => ['int'], - 'yp_first' => ['array', 'domain'=>'string', 'map'=>'string'], - 'yp_get_default_domain' => ['string'], - 'yp_master' => ['string', 'domain'=>'string', 'map'=>'string'], - 'yp_match' => ['string', 'domain'=>'string', 'map'=>'string', 'key'=>'string'], - 'yp_next' => ['array', 'domain'=>'string', 'map'=>'string', 'key'=>'string'], - 'yp_order' => ['int', 'domain'=>'string', 'map'=>'string'], - 'zem_get_extension_info_by_id' => [''], - 'zem_get_extension_info_by_name' => [''], - 'zem_get_extensions_info' => [''], - 'zem_get_license_info' => [''], - 'zend_current_obfuscation_level' => ['int'], - 'zend_disk_cache_clear' => ['bool', 'namespace='=>'mixed|string'], - 'zend_disk_cache_delete' => ['mixed|null', 'key'=>'string'], - 'zend_disk_cache_fetch' => ['mixed|null', 'key'=>'string'], - 'zend_disk_cache_store' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int|mixed'], - 'zend_get_id' => ['array', 'all_ids='=>'all_ids|false'], - 'zend_is_configuration_changed' => [''], - 'zend_loader_current_file' => ['string'], - 'zend_loader_enabled' => ['bool'], - 'zend_loader_file_encoded' => ['bool'], - 'zend_loader_file_licensed' => ['array'], - 'zend_loader_install_license' => ['bool', 'license_file'=>'string', 'override'=>'bool'], - 'zend_logo_guid' => ['string'], - 'zend_obfuscate_class_name' => ['string', 'class_name'=>'string'], - 'zend_obfuscate_function_name' => ['string', 'function_name'=>'string'], - 'zend_optimizer_version' => ['string'], - 'zend_runtime_obfuscate' => ['void'], - 'zend_send_buffer' => ['null|false', 'buffer'=>'string', 'mime_type='=>'string', 'custom_headers='=>'string'], - 'zend_send_file' => ['null|false', 'filename'=>'string', 'mime_type='=>'string', 'custom_headers='=>'string'], - 'zend_set_configuration_changed' => [''], - 'zend_shm_cache_clear' => ['bool', 'namespace='=>'mixed|string'], - 'zend_shm_cache_delete' => ['mixed|null', 'key'=>'string'], - 'zend_shm_cache_fetch' => ['mixed|null', 'key'=>'string'], - 'zend_shm_cache_store' => ['bool', 'key'=>'', 'value'=>'', 'ttl='=>'int|mixed'], - 'zend_thread_id' => ['int'], - 'zend_version' => ['string'], - 'zip_close' => ['void', 'zip'=>'resource'], - 'zip_entry_close' => ['bool', 'zip_ent'=>'resource'], - 'zip_entry_compressedsize' => ['int', 'zip_entry'=>'resource'], - 'zip_entry_compressionmethod' => ['string', 'zip_entry'=>'resource'], - 'zip_entry_filesize' => ['int', 'zip_entry'=>'resource'], - 'zip_entry_name' => ['string', 'zip_entry'=>'resource'], - 'zip_entry_open' => ['bool', 'zip_dp'=>'resource', 'zip_entry'=>'resource', 'mode='=>'string'], - 'zip_entry_read' => ['string|false', 'zip_entry'=>'resource', 'len='=>'int'], - 'zip_open' => ['resource|int|false', 'filename'=>'string'], - 'zip_read' => ['resource', 'zip'=>'resource'], - 'zlib_decode' => ['string|false', 'data'=>'string', 'max_length='=>'int'], - 'zlib_encode' => ['string', 'data'=>'string', 'encoding'=>'int', 'level='=>'string|int'], - 'zlib_get_coding_type' => ['string|false'], - 'zookeeper_dispatch' => ['void'], -]; diff --git a/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php b/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php deleted file mode 100644 index 3838720a..00000000 --- a/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php +++ /dev/null @@ -1,65 +0,0 @@ ->> - */ -return [ -'exec' => [['shell']], -'create_function' => [[], ['eval']], -'file_get_contents' => [['file']], -'file_put_contents' => [['file']], -'fopen' => [['file']], -'unlink' => [['file']], -'copy' => [['file'], ['file']], -'file' => [['file']], -'link' => [['file'], ['file']], -'mkdir' => [['file']], -'move_uploaded_file' => [['file'], ['file']], -'parse_ini_file' => [['file']], -'chown' => [['file']], -'lchown' => [['file']], -'readfile' => [['file']], -'rename' => [['file'], ['file']], -'rmdir' => [['file']], -'header' => [['header']], -'symlink' => [['file']], -'tempnam' => [['file']], -'igbinary_unserialize' => [['unserialize']], -'ldap_search' => [[], ['ldap'], ['ldap']], -'mysqli_query' => [[], ['sql']], -'mysqli::query' => [['sql']], -'mysqli_real_query' => [[], ['sql']], -'mysqli::real_query' => [['sql']], -'mysqli_multi_query' => [[], ['sql']], -'mysqli::multi_query' => [['sql']], -'mysqli_prepare' => [[], ['sql']], -'mysqli::prepare' => [['sql']], -'mysqli_stmt::__construct' => [[], ['sql']], -'mysqli_stmt_prepare' => [[], ['sql']], -'mysqli_stmt::prepare' => [['sql']], -'passthru' => [['shell']], -'pcntl_exec' => [['shell']], -'PDO::prepare' => [['sql']], -'PDO::query' => [['sql']], -'PDO::exec' => [['sql']], -'pg_exec' => [[], ['sql']], -'pg_prepare' => [[], [], ['sql']], -'pg_put_line' => [[], ['sql']], -'pg_query' => [[], ['sql']], -'pg_query_params' => [[], ['sql']], -'pg_send_prepare' => [[], [], ['sql']], -'pg_send_query' => [[], ['sql']], -'pg_send_query_params' => [[], ['sql'], []], -'setcookie' => [['cookie'], ['cookie']], -'shell_exec' => [['shell']], -'system' => [['shell']], -'unserialize' => [['unserialize']], -'popen' => [['shell']], -'proc_open' => [['shell']], -'curl_init' => [['ssrf']], -'curl_setopt' => [[], [], ['ssrf']], -]; diff --git a/vendor/vimeo/psalm/dictionaries/PropertyMap.php b/vendor/vimeo/psalm/dictionaries/PropertyMap.php deleted file mode 100644 index f769b171..00000000 --- a/vendor/vimeo/psalm/dictionaries/PropertyMap.php +++ /dev/null @@ -1,542 +0,0 @@ - [ - 'name' => 'string', - ], - 'limititerator' => [ - 'name' => 'string', - ], - 'solrdocumentfield' => [ - 'name' => 'string', - 'boost' => 'float', - 'values' => 'array', - ], - 'domprocessinginstruction' => [ - 'target' => 'string', - 'data' => 'string', - ], - 'recursivearrayiterator' => [ - 'name' => 'string', - ], - 'eventbuffer' => [ - 'length' => 'int', - 'contiguous-space' => 'int', - ], - 'mongocursor' => [ - 'slaveokay' => 'boolean', - 'timeout' => 'integer', - ], - 'domxpath' => [ - 'document' => 'DOMDocument', - ], - 'domentity' => [ - 'publicId' => 'string', - 'systemId' => 'string', - 'notationName' => 'string', - 'actualEncoding' => 'string', - 'encoding' => 'string', - 'version' => 'string', - ], - 'splminheap' => [ - 'name' => 'string', - ], - 'mongodb-driver-exception-writeexception' => [ - 'writeresult' => 'MongoDBDriverWriteResult', - ], - 'ziparchive' => [ - 'status' => 'int', - 'statusSys' => 'int', - 'numFiles' => 'int', - 'filename' => 'string', - 'comment' => 'string', - ], - 'solrexception' => [ - 'sourceline' => 'integer', - 'sourcefile' => 'string', - 'zif-name' => 'string', - ], - 'arrayiterator' => [ - 'name' => 'string', - ], - 'mongoid' => [ - 'id' => 'string', - ], - 'dateinterval' => [ - 'y' => 'integer', - 'm' => 'integer', - 'd' => 'integer', - 'h' => 'integer', - 'i' => 'integer', - 's' => 'integer', - 'f' => 'float', // only present from 7.1 onwards - 'invert' => 'integer', - 'days' => 'false|int', - ], - 'tokyotyrantexception' => [ - 'code' => 'int', - ], - 'tidy' => [ - 'errorbuffer' => 'string', - ], - 'filteriterator' => [ - 'name' => 'string', - ], - 'parentiterator' => [ - 'name' => 'string', - ], - 'recursiveregexiterator' => [ - 'name' => 'string', - ], - 'error' => [ - 'message' => 'string', - 'code' => 'int', - 'file' => 'string', - 'line' => 'int', - ], - 'domexception' => [ - 'code' => 'int', - ], - 'domentityreference' => [ - 'name' => 'string', - ], - 'spldoublylinkedlist' => [ - 'name' => 'string', - ], - 'domdocumentfragment' => [ - 'name' => 'string', - ], - 'collator' => [ - 'name' => 'string', - ], - 'streamwrapper' => [ - 'context' => 'resource', - ], - 'pdostatement' => [ - 'querystring' => 'string', - ], - 'domnotation' => [ - 'publicId' => 'string', - 'systemId' => 'string', - ], - 'snmpexception' => [ - 'code' => 'string', - ], - 'directoryiterator' => [ - 'name' => 'string', - ], - 'splqueue' => [ - 'name' => 'string', - ], - 'locale' => [ - 'name' => 'string', - ], - 'directory' => [ - 'path' => 'string', - 'handle' => 'resource', - ], - 'splheap' => [ - 'name' => 'string', - ], - 'domnodelist' => [ - 'length' => 'int', - ], - 'mongodb' => [ - 'w' => 'integer', - 'wtimeout' => 'integer', - ], - 'splpriorityqueue' => [ - 'name' => 'string', - ], - 'mongoclient' => [ - 'connected' => 'boolean', - 'status' => 'string', - ], - 'domdocument' => [ - 'actualEncoding' => 'string', - 'config' => 'null', - 'doctype' => 'DOMDocumentType', - 'documentElement' => 'DOMElement', - 'documentURI' => 'string', - 'encoding' => 'string', - 'firstElementChild' => 'DOMElement|null', - 'formatOutput' => 'bool', - 'childElementCount' => 'int', - 'implementation' => 'DOMImplementation', - 'lastElementChild' => 'DOMElement|null', - 'preserveWhiteSpace' => 'bool', - 'recover' => 'bool', - 'resolveExternals' => 'bool', - 'standalone' => 'bool', - 'strictErrorChecking' => 'bool', - 'substituteEntities' => 'bool', - 'validateOnParse' => 'bool', - 'version' => 'string', - 'xmlEncoding' => 'string', - 'xmlStandalone' => 'bool', - 'xmlVersion' => 'string', - 'ownerDocument' => 'null', - 'parentNode' => 'null', - ], - 'libxmlerror' => [ - 'level' => 'int', - 'code' => 'int', - 'column' => 'int', - 'message' => 'string', - 'file' => 'string', - 'line' => 'int', - ], - 'domimplementation' => [ - 'name' => 'string', - ], - 'normalizer' => [ - 'name' => 'string', - ], - 'norewinditerator' => [ - 'name' => 'string', - ], - 'event' => [ - 'pending' => 'bool', - ], - 'domdocumenttype' => [ - 'publicId' => 'string', - 'systemId' => 'string', - 'name' => 'string', - 'entities' => 'DOMNamedNodeMap', - 'notations' => 'DOMNamedNodeMap', - 'internalSubset' => 'string', - ], - 'errorexception' => [ - 'severity' => 'int', - ], - 'recursivedirectoryiterator' => [ - 'name' => 'string', - ], - 'domcharacterdata' => [ - 'data' => 'string', - 'length' => 'int', - ], - 'mongocollection' => [ - 'db' => 'MongoDB', - 'w' => 'integer', - 'wtimeout' => 'integer', - ], - 'mongoint64' => [ - 'value' => 'string', - ], - 'mysqli' => [ - 'affected_rows' => 'int', - 'client_info' => 'string', - 'client_version' => 'int', - 'connect_errno' => 'int', - 'connect_error' => '?string', - 'errno' => 'int', - 'error' => 'string', - 'error_list' => 'array', - 'field_count' => 'int', - 'host_info' => 'string', - 'info' => 'string', - 'insert_id' => 'int|string', - 'protocol_version' => 'string', - 'server_info' => 'string', - 'server_version' => 'int', - 'sqlstate' => 'string', - 'thread_id' => 'int', - 'warning_count' => 'int', - ], - 'mysqli_driver' => [ - 'client_info' => 'string', - 'client_version' => 'string', - 'driver_version' => 'string', - 'embedded' => 'string', - 'reconnect' => 'bool', - 'report_mode' => 'int' - ], - 'mysqli_result' => [ - 'current_field' => 'int', - 'field_count' => 'int', - 'lengths' => 'array|null', - 'num_rows' => 'int', - 'type' => 'mixed', - ], - 'mysqli_sql_exception' => [ - 'sqlstate' => 'string' - ], - 'mysqli_stmt' => [ - 'affected_rows' => 'int', - 'errno' => 'int', - 'error' => 'string', - 'error_list' => 'array', - 'field_count' => 'int', - 'id' => 'mixed', - 'insert_id' => 'int', - 'num_rows' => 'int', - 'param_count' => 'int', - 'sqlstate' => 'string', - ], - 'mysqli_warning' => [ - 'errno' => 'int', - 'message' => 'string', - 'sqlstate' => 'string', - ], - 'eventlistener' => [ - 'fd' => 'int', - ], - 'splmaxheap' => [ - 'name' => 'string', - ], - 'regexiterator' => [ - 'name' => 'string', - ], - 'domelement' => [ - 'schemaTypeInfo' => 'bool', - 'tagName' => 'string', - 'attributes' => 'DOMNamedNodeMap', - 'childElementCount' => 'int', - 'firstElementChild' => 'DOMElement|null', - 'lastElementChild' => 'DOMElement|null', - 'nextElementSibling' => 'DOMElement|null', - 'previousElementSibling' => 'DOMElement|null', - ], - 'tidynode' => [ - 'value' => 'string', - 'name' => 'string', - 'type' => 'int', - 'line' => 'int', - 'column' => 'int', - 'proprietary' => 'bool', - 'id' => 'int', - 'attribute' => 'array', - 'child' => '?array', - ], - 'recursivecachingiterator' => [ - 'name' => 'string', - ], - 'solrresponse' => [ - 'http-status' => 'integer', - 'parser-mode' => 'integer', - 'success' => 'bool', - 'http-status-message' => 'string', - 'http-request-url' => 'string', - 'http-raw-request-headers' => 'string', - 'http-raw-request' => 'string', - 'http-raw-response-headers' => 'string', - 'http-raw-response' => 'string', - 'http-digested-response' => 'string', - ], - 'domnamednodemap' => [ - 'length' => 'int', - ], - 'splstack' => [ - 'name' => 'string', - ], - 'numberformatter' => [ - 'name' => 'string', - ], - 'eventsslcontext' => [ - 'local-cert' => 'string', - 'local-pk' => 'string', - ], - 'pdoexception' => [ - 'errorinfo' => 'array', - 'code' => 'int|string', - ], - 'domnode' => [ - 'nodeName' => 'string', - 'nodeValue' => 'string|null', - 'nodeType' => 'int', - 'parentNode' => 'DOMNode|null', - 'childNodes' => 'DomNodeList', - 'firstChild' => 'DOMNode|null', - 'lastChild' => 'DOMNode|null', - 'previousSibling' => 'DOMNode|null', - 'nextSibling' => 'DOMNode|null', - 'attributes' => 'null', - 'ownerDocument' => 'DOMDocument|null', - 'namespaceURI' => 'string|null', - 'prefix' => 'string', - 'localName' => 'string', - 'baseURI' => 'string|null', - 'textContent' => 'string', - ], - 'domattr' => [ - 'name' => 'string', - 'ownerElement' => 'DOMElement', - 'schemaTypeInfo' => 'bool', - 'specified' => 'bool', - 'value' => 'string', - ], - 'simplexmliterator' => [ - 'name' => 'string', - ], - 'snmp' => [ - 'max-oids' => 'int', - 'valueretrieval' => 'int', - 'quick-print' => 'bool', - 'enum-print' => 'bool', - 'oid-output-format' => 'int', - 'oid-increasing-check' => 'bool', - 'exceptions-enabled' => 'int', - 'info' => 'array', - ], - 'mongoint32' => [ - 'value' => 'string', - ], - 'xmlreader' => [ - 'attributeCount' => 'int', - 'baseURI' => 'string', - 'depth' => 'int', - 'hasAttributes' => 'bool', - 'hasValue' => 'bool', - 'isDefault' => 'bool', - 'isEmptyElement' => 'bool', - 'localName' => 'string', - 'name' => 'string', - 'namespaceURI' => 'string', - 'nodeType' => 'int', - 'prefix' => 'string', - 'value' => 'string', - 'xmlLang' => 'string', - ], - 'eventbufferevent' => [ - 'fd' => 'integer', - 'priority' => 'integer', - 'input' => 'EventBuffer', - 'output' => 'EventBuffer', - ], - 'domtext' => [ - 'wholeText' => 'string', - ], - 'exception' => [ - 'message' => 'string', - 'code' => 'int', - 'file' => 'string', - 'line' => 'int', - ], - 'reflectionclass' => [ - 'name' => 'string', - ], - 'reflectionmethod' => [ - 'class' => 'string', - 'name' => 'string', - ], - 'reflectionparameter' => [ - 'name' => 'string', - ], - 'reflectionproperty' => [ - 'name' => 'string', - 'class' => 'string', - ], - 'phpparser\\node\\expr\\array_' => [ - 'items' => 'array', - ], - 'phpparser\\node\\expr\\list_' => [ - 'items' => 'array', - ], - 'phpparser\\node\\expr\\arrowfunction' => [ - 'params' => 'list', - ], - 'phpparser\\node\\expr\\closure' => [ - 'params' => 'list', - ], - 'phpparser\\node\\name' => [ - 'parts' => 'non-empty-list', - ], - 'phpparser\\node\\stmt\\namespace_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\if_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\elseif_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\else_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\for_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\foreach_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\trycatch' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\catch_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\finally_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\case_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\while_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\do_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\class_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\trait_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\stmt\\interface_' => [ - 'stmts' => 'list', - ], - 'phpparser\\node\\matcharm' => [ - 'conds' => 'null|non-empty-list', - ], - 'phpparser\\node\\expr\\shellexec' => [ - 'parts' => 'list', - ], - 'rdkafka\\message' => [ - 'err' => 'int', - 'topic_name' => 'string', - 'partition' => 'int', - 'payload' => 'string', - 'key' => 'string|null', - 'offset' => 'int', - 'timestamp' => 'int', - 'headers' => 'array|null', - ], - 'soapfault' => [ - 'faultcode' => 'string|null', - 'faultcodens' => 'string|null', - 'faultstring' => 'string', - 'faultactor' => 'string|null', - 'detail' => 'mixed|null', - '_name' => 'string', - 'headerfault' => 'mixed|null', - ], -]; diff --git a/vendor/vimeo/psalm/psalm b/vendor/vimeo/psalm/psalm deleted file mode 100755 index a633cb87..00000000 --- a/vendor/vimeo/psalm/psalm +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env php - - */ - public $uses; - - /** - * @var array - */ - public $uses_flipped; - - /** - * @var array - */ - public $functions; - - /** - * @var array - */ - public $functions_flipped; - - /** - * @var array - */ - public $constants; - - /** - * @var array - */ - public $constants_flipped; - - /** @var string|null */ - public $namespace; - - /** @var ?int */ - public $namespace_first_stmt_start; - - /** @var ?int */ - public $uses_start; - - /** @var ?int */ - public $uses_end; - - /** - * @param array $uses - * @param array $functions - * @param array $constants - * @param array $uses_flipped - * @param array $functions_flipped - * @param array $constants_flipped - */ - public function __construct( - ?string $namespace = null, - array $uses = [], - array $functions = [], - array $constants = [], - array $uses_flipped = [], - array $functions_flipped = [], - array $constants_flipped = [] - ) { - $this->namespace = $namespace; - $this->uses = $uses; - $this->functions = $functions; - $this->constants = $constants; - $this->uses_flipped = $uses_flipped; - $this->functions_flipped = $functions_flipped; - $this->constants_flipped = $constants_flipped; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/CodeLocation.php b/vendor/vimeo/psalm/src/Psalm/CodeLocation.php deleted file mode 100644 index 82c6bdad..00000000 --- a/vendor/vimeo/psalm/src/Psalm/CodeLocation.php +++ /dev/null @@ -1,392 +0,0 @@ -file_start = (int)$stmt->getAttribute('startFilePos'); - $this->file_end = (int)$stmt->getAttribute('endFilePos'); - $this->raw_file_start = $this->file_start; - $this->raw_file_end = $this->file_end; - $this->file_path = $file_source->getFilePath(); - $this->file_name = $file_source->getFileName(); - $this->single_line = $single_line; - $this->regex_type = $regex_type; - $this->previous_location = $previous_location; - $this->text = $selected_text; - - $doc_comment = $stmt->getDocComment(); - - $this->docblock_start = $doc_comment ? $doc_comment->getStartFilePos() : null; - $this->docblock_start_line_number = $doc_comment ? $doc_comment->getStartLine() : null; - - $this->preview_start = $this->docblock_start ?: $this->file_start; - - $this->raw_line_number = $stmt->getLine(); - } - - public function setCommentLine(int $line): void - { - $this->docblock_line_number = $line; - } - - private function calculateRealLocation(): void - { - if ($this->have_recalculated) { - return; - } - - $this->have_recalculated = true; - - $this->selection_start = $this->file_start; - $this->selection_end = $this->file_end + 1; - - $project_analyzer = ProjectAnalyzer::getInstance(); - - $codebase = $project_analyzer->getCodebase(); - - $file_contents = $codebase->getFileContents($this->file_path); - - $file_length = strlen($file_contents); - - $search_limit = $this->single_line ? $this->selection_start : $this->selection_end; - - if ($search_limit <= $file_length) { - $preview_end = strpos( - $file_contents, - "\n", - $search_limit - ); - } else { - $preview_end = false; - } - - // if the string didn't contain a newline - if ($preview_end === false) { - $preview_end = $this->selection_end; - } - - $this->preview_end = $preview_end; - - if ($this->docblock_line_number && - $this->docblock_start_line_number && - $this->preview_start < $this->selection_start - ) { - $preview_lines = explode( - "\n", - mb_strcut( - $file_contents, - $this->preview_start, - $this->selection_start - $this->preview_start - 1 - ) - ); - - $preview_offset = 0; - - $comment_line_offset = $this->docblock_line_number - $this->docblock_start_line_number; - - for ($i = 0; $i < $comment_line_offset; ++$i) { - $preview_offset += strlen($preview_lines[$i]) + 1; - } - - if (!isset($preview_lines[$i])) { - throw new Exception('Should have offset'); - } - - $key_line = $preview_lines[$i]; - - $indentation = (int)strpos($key_line, '@'); - - $key_line = trim(preg_replace('@\**/\s*@', '', mb_strcut($key_line, $indentation))); - - $this->selection_start = $preview_offset + $indentation + $this->preview_start; - $this->selection_end = $this->selection_start + strlen($key_line); - } - - if ($this->regex_type !== null) { - switch ($this->regex_type) { - case self::VAR_TYPE: - $regex = '/@(?:psalm-)?var[ \t]+' . CommentAnalyzer::TYPE_REGEX . '/'; - break; - - case self::FUNCTION_RETURN_TYPE: - $regex = '/\\:\s+(\\??\s*[A-Za-z0-9_\\\\\[\]]+)/'; - break; - - case self::FUNCTION_PARAM_TYPE: - $regex = '/^(\\??\s*[A-Za-z0-9_\\\\\[\]]+)\s/'; - break; - - case self::FUNCTION_PHPDOC_RETURN_TYPE: - $regex = '/@(?:psalm-)?return[ \t]+' . CommentAnalyzer::TYPE_REGEX . '/'; - break; - - case self::FUNCTION_PHPDOC_METHOD: - $regex = '/@(?:psalm-)?method[ \t]+(.*)/'; - break; - - case self::FUNCTION_PHPDOC_PARAM_TYPE: - $regex = '/@(?:psalm-)?param[ \t]+' . CommentAnalyzer::TYPE_REGEX . '/'; - break; - - case self::FUNCTION_PARAM_VAR: - $regex = '/(\$[^ ]*)/'; - break; - - case self::CATCH_VAR: - $regex = '/(\$[^ ^\)]*)/'; - break; - - default: - throw new UnexpectedValueException('Unrecognised regex type ' . $this->regex_type); - } - - $preview_snippet = mb_strcut( - $file_contents, - $this->selection_start, - $this->selection_end - $this->selection_start - ); - - if ($this->text) { - $regex = '/(' . str_replace(',', ',[ ]*', preg_quote($this->text, '/')) . ')/'; - } - - if (preg_match($regex, $preview_snippet, $matches, PREG_OFFSET_CAPTURE)) { - if (!isset($matches[1]) || $matches[1][1] === -1) { - throw new LogicException( - "Failed to match anything to 1st capturing group, " - . "or regex doesn't contain 1st capturing group, regex type " . $this->regex_type - ); - } - $this->selection_start = $this->selection_start + $matches[1][1]; - $this->selection_end = $this->selection_start + strlen($matches[1][0]); - } - } - - // reset preview start to beginning of line - $this->preview_start = (int)strrpos( - $file_contents, - "\n", - min($this->preview_start, $this->selection_start) - strlen($file_contents) - ) + 1; - - $this->selection_start = max($this->preview_start, $this->selection_start); - $this->selection_end = min($this->preview_end, $this->selection_end); - - if ($this->preview_end - $this->selection_end > 200) { - $this->preview_end = (int)strrpos( - $file_contents, - "\n", - $this->selection_end + 200 - strlen($file_contents) - ); - - // if the line is over 200 characters long - if ($this->preview_end < $this->selection_end) { - $this->preview_end = $this->selection_end + 50; - } - } - - $this->snippet = mb_strcut($file_contents, $this->preview_start, $this->preview_end - $this->preview_start); - // text is within snippet. It's 50% faster to cut it from the snippet than from the full text - $selection_length = $this->selection_end - $this->selection_start; - $this->text = mb_strcut($this->snippet, $this->selection_start - $this->preview_start, $selection_length); - - // reset preview start to beginning of line - if ($file_contents !== '') { - $this->column_from = $this->selection_start - - (int)strrpos($file_contents, "\n", $this->selection_start - strlen($file_contents)); - } else { - $this->column_from = $this->selection_start; - } - - $newlines = substr_count($this->text, "\n"); - - if ($newlines) { - $last_newline_pos = strrpos($file_contents, "\n", $this->selection_end - strlen($file_contents) - 1); - $this->column_to = $this->selection_end - (int)$last_newline_pos; - } else { - $this->column_to = $this->column_from + strlen($this->text); - } - - $this->end_line_number = $this->getLineNumber() + $newlines; - } - - public function getLineNumber(): int - { - return $this->docblock_line_number ?: $this->raw_line_number; - } - - public function getEndLineNumber(): int - { - $this->calculateRealLocation(); - - return $this->end_line_number; - } - - public function getSnippet(): string - { - $this->calculateRealLocation(); - - return $this->snippet; - } - - public function getSelectedText(): string - { - $this->calculateRealLocation(); - - return (string)$this->text; - } - - public function getColumn(): int - { - $this->calculateRealLocation(); - - return $this->column_from; - } - - public function getEndColumn(): int - { - $this->calculateRealLocation(); - - return $this->column_to; - } - - /** - * @return array{0: int, 1: int} - */ - public function getSelectionBounds(): array - { - $this->calculateRealLocation(); - - return [$this->selection_start, $this->selection_end]; - } - - /** - * @return array{0: int, 1: int} - */ - public function getSnippetBounds(): array - { - $this->calculateRealLocation(); - - return [$this->preview_start, $this->preview_end]; - } - - public function getHash(): string - { - return $this->file_name . ' ' . $this->raw_file_start . $this->raw_file_end; - } - - public function getShortSummary(): string - { - return $this->file_name . ':' . $this->getLineNumber() . ':' . $this->getColumn(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php b/vendor/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php deleted file mode 100644 index 224b740a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php +++ /dev/null @@ -1,30 +0,0 @@ -file_start = $file_start; - // matches how CodeLocation works - $this->file_end = $file_end - 1; - - $this->raw_file_start = $file_start; - $this->raw_file_end = $file_end; - $this->raw_line_number = $line_number; - - $this->file_path = $file_source->getFilePath(); - $this->file_name = $file_source->getFileName(); - $this->single_line = false; - - $this->preview_start = $this->file_start; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php b/vendor/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php deleted file mode 100644 index eedae0bb..00000000 --- a/vendor/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php +++ /dev/null @@ -1,35 +0,0 @@ -file_start = (int)$error->getAttributes()['startFilePos']; - /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ - $this->file_end = (int)$error->getAttributes()['endFilePos']; - $this->raw_file_start = $this->file_start; - $this->raw_file_end = $this->file_end; - $this->file_path = $file_path; - $this->file_name = $file_name; - $this->single_line = false; - - $this->preview_start = $this->file_start; - $this->raw_line_number = substr_count( - substr($file_contents, 0, $this->file_start), - "\n" - ) + 1; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/CodeLocation/Raw.php b/vendor/vimeo/psalm/src/Psalm/CodeLocation/Raw.php deleted file mode 100644 index f75a5d38..00000000 --- a/vendor/vimeo/psalm/src/Psalm/CodeLocation/Raw.php +++ /dev/null @@ -1,33 +0,0 @@ -file_start = $file_start; - $this->file_end = $file_end; - $this->raw_file_start = $this->file_start; - $this->raw_file_end = $this->file_end; - $this->file_path = $file_path; - $this->file_name = $file_name; - $this->single_line = false; - - $this->preview_start = $this->file_start; - $this->raw_line_number = substr_count( - substr($file_contents, 0, $this->file_start), - "\n" - ) + 1; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Codebase.php b/vendor/vimeo/psalm/src/Psalm/Codebase.php deleted file mode 100644 index cb72efa8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Codebase.php +++ /dev/null @@ -1,2013 +0,0 @@ -> - */ - public $use_referencing_locations = []; - - /** - * @var FileStorageProvider - */ - public $file_storage_provider; - - /** - * @var ClassLikeStorageProvider - */ - public $classlike_storage_provider; - - /** - * @var bool - */ - public $collect_references = false; - - /** - * @var bool - */ - public $collect_locations = false; - - /** - * @var null|'always'|'auto' - */ - public $find_unused_code; - - /** - * @var FileProvider - */ - public $file_provider; - - /** - * @var FileReferenceProvider - */ - public $file_reference_provider; - - /** - * @var StatementsProvider - */ - public $statements_provider; - - /** - * @var Progress - */ - private $progress; - - /** - * @var array - */ - private static $stubbed_constants = []; - - /** - * Whether to register autoloaded information - * - * @var bool - */ - public $register_autoload_files = false; - - /** - * Whether to log functions just at the file level or globally (for stubs) - * - * @var bool - */ - public $register_stub_files = false; - - /** - * @var bool - */ - public $find_unused_variables = false; - - /** - * @var Scanner - */ - public $scanner; - - /** - * @var Analyzer - */ - public $analyzer; - - /** - * @var Functions - */ - public $functions; - - /** - * @var ClassLikes - */ - public $classlikes; - - /** - * @var Methods - */ - public $methods; - - /** - * @var Properties - */ - public $properties; - - /** - * @var Populator - */ - public $populator; - - /** - * @var ?TaintFlowGraph - */ - public $taint_flow_graph; - - /** - * @var bool - */ - public $server_mode = false; - - /** - * @var bool - */ - public $store_node_types = false; - - /** - * Whether or not to infer types from usage. Computationally expensive, so turned off by default - * - * @var bool - */ - public $infer_types_from_usage = false; - - /** - * @var bool - */ - public $alter_code = false; - - /** - * @var bool - */ - public $diff_methods = false; - - /** - * @var array - */ - public $methods_to_move = []; - - /** - * @var array - */ - public $methods_to_rename = []; - - /** - * @var array - */ - public $properties_to_move = []; - - /** - * @var array - */ - public $properties_to_rename = []; - - /** - * @var array - */ - public $class_constants_to_move = []; - - /** - * @var array - */ - public $class_constants_to_rename = []; - - /** - * @var array - */ - public $classes_to_move = []; - - /** - * @var array - */ - public $call_transforms = []; - - /** - * @var array - */ - public $property_transforms = []; - - /** - * @var array - */ - public $class_constant_transforms = []; - - /** - * @var array - */ - public $class_transforms = []; - - /** - * @var bool - */ - public $allow_backwards_incompatible_changes = true; - - /** - * @var int - * @deprecated Removed in Psalm 5, use Codebase::$analysis_php_version_id - */ - public $php_major_version = PHP_MAJOR_VERSION; - - /** - * @var int - * @deprecated Removed in Psalm 5, use Codebase::$analysis_php_version_id - */ - public $php_minor_version = PHP_MINOR_VERSION; - - /** @var int */ - public $analysis_php_version_id = PHP_VERSION_ID; - - /** @var 'cli'|'config'|'composer'|'tests'|'runtime' */ - public $php_version_source = 'runtime'; - - /** - * @var bool - */ - public $track_unused_suppressions = false; - - public function __construct( - Config $config, - Providers $providers, - ?Progress $progress = null - ) { - if ($progress === null) { - $progress = new VoidProgress(); - } - - $this->config = $config; - $this->file_storage_provider = $providers->file_storage_provider; - $this->classlike_storage_provider = $providers->classlike_storage_provider; - $this->progress = $progress; - $this->file_provider = $providers->file_provider; - $this->file_reference_provider = $providers->file_reference_provider; - $this->statements_provider = $providers->statements_provider; - - self::$stubbed_constants = []; - - $reflection = new Reflection($providers->classlike_storage_provider, $this); - - $this->scanner = new Scanner( - $this, - $config, - $providers->file_storage_provider, - $providers->file_provider, - $reflection, - $providers->file_reference_provider, - $progress - ); - - $this->loadAnalyzer(); - - $this->functions = new Functions($providers->file_storage_provider, $reflection); - - $this->classlikes = new ClassLikes( - $this->config, - $providers->classlike_storage_provider, - $providers->file_reference_provider, - $providers->statements_provider, - $this->scanner - ); - - $this->properties = new Properties( - $providers->classlike_storage_provider, - $providers->file_reference_provider, - $this->classlikes - ); - - $this->methods = new Methods( - $providers->classlike_storage_provider, - $providers->file_reference_provider, - $this->classlikes - ); - - $this->populator = new Populator( - $config, - $providers->classlike_storage_provider, - $providers->file_storage_provider, - $this->classlikes, - $providers->file_reference_provider, - $progress - ); - - $this->loadAnalyzer(); - } - - private function loadAnalyzer(): void - { - $this->analyzer = new Analyzer( - $this->config, - $this->file_provider, - $this->file_storage_provider, - $this->progress - ); - } - - /** - * @param array $candidate_files - * - */ - public function reloadFiles(ProjectAnalyzer $project_analyzer, array $candidate_files): void - { - $this->loadAnalyzer(); - - $this->file_reference_provider->loadReferenceCache(false); - - FunctionLikeAnalyzer::clearCache(); - - if (!$this->statements_provider->parser_cache_provider) { - $diff_files = $candidate_files; - } else { - $diff_files = []; - - $parser_cache_provider = $this->statements_provider->parser_cache_provider; - - foreach ($candidate_files as $candidate_file_path) { - if ($parser_cache_provider->loadExistingFileContentsFromCache($candidate_file_path) - !== $this->file_provider->getContents($candidate_file_path) - ) { - $diff_files[] = $candidate_file_path; - } - } - } - - $referenced_files = $project_analyzer->getReferencedFilesFromDiff($diff_files, false); - - foreach ($diff_files as $diff_file_path) { - $this->invalidateInformationForFile($diff_file_path); - } - - foreach ($referenced_files as $referenced_file_path) { - if (in_array($referenced_file_path, $diff_files, true)) { - continue; - } - - $file_storage = $this->file_storage_provider->get($referenced_file_path); - - foreach ($file_storage->classlikes_in_file as $fq_classlike_name) { - $this->classlike_storage_provider->remove($fq_classlike_name); - $this->classlikes->removeClassLike($fq_classlike_name); - } - - $this->file_storage_provider->remove($referenced_file_path); - $this->scanner->removeFile($referenced_file_path); - } - - $referenced_files = array_combine($referenced_files, $referenced_files); - - $this->scanner->addFilesToDeepScan($referenced_files); - $this->addFilesToAnalyze(array_combine($candidate_files, $candidate_files)); - - $this->scanner->scanFiles($this->classlikes); - - $this->file_reference_provider->updateReferenceCache($this, $referenced_files); - - $this->populator->populateCodebase(); - } - - public function enterServerMode(): void - { - $this->server_mode = true; - $this->store_node_types = true; - } - - public function collectLocations(): void - { - $this->collect_locations = true; - $this->classlikes->collect_locations = true; - $this->methods->collect_locations = true; - $this->properties->collect_locations = true; - } - - /** - * @param 'always'|'auto' $find_unused_code - * - */ - public function reportUnusedCode(string $find_unused_code = 'auto'): void - { - $this->collect_references = true; - $this->classlikes->collect_references = true; - $this->find_unused_code = $find_unused_code; - $this->find_unused_variables = true; - } - - public function reportUnusedVariables(): void - { - $this->collect_references = true; - $this->find_unused_variables = true; - } - - /** - * @param array $files_to_analyze - * - */ - public function addFilesToAnalyze(array $files_to_analyze): void - { - $this->scanner->addFilesToDeepScan($files_to_analyze); - $this->analyzer->addFilesToAnalyze($files_to_analyze); - } - - /** - * Scans all files their related files - * - */ - public function scanFiles(int $threads = 1): void - { - $has_changes = $this->scanner->scanFiles($this->classlikes, $threads); - - if ($has_changes) { - $this->populator->populateCodebase(); - } - } - - public function getFileContents(string $file_path): string - { - return $this->file_provider->getContents($file_path); - } - - /** - * @return list - */ - public function getStatementsForFile(string $file_path): array - { - return $this->statements_provider->getStatementsForFile( - $file_path, - $this->php_major_version . '.' . $this->php_minor_version, - $this->progress - ); - } - - public function createClassLikeStorage(string $fq_classlike_name): ClassLikeStorage - { - return $this->classlike_storage_provider->create($fq_classlike_name); - } - - public function cacheClassLikeStorage(ClassLikeStorage $classlike_storage, string $file_path): void - { - $file_contents = $this->file_provider->getContents($file_path); - - if ($this->classlike_storage_provider->cache) { - $this->classlike_storage_provider->cache->writeToCache($classlike_storage, $file_path, $file_contents); - } - } - - public function exhumeClassLikeStorage(string $fq_classlike_name, string $file_path): void - { - $file_contents = $this->file_provider->getContents($file_path); - $storage = $this->classlike_storage_provider->exhume( - $fq_classlike_name, - $file_path, - $file_contents - ); - - if ($storage->is_trait) { - $this->classlikes->addFullyQualifiedTraitName($storage->name, $file_path); - } elseif ($storage->is_interface) { - $this->classlikes->addFullyQualifiedInterfaceName($storage->name, $file_path); - } else { - $this->classlikes->addFullyQualifiedClassName($storage->name, $file_path); - } - } - - public static function getPsalmTypeFromReflection(?ReflectionType $type): Union - { - return Reflection::getPsalmTypeFromReflectionType($type); - } - - public function createFileStorageForPath(string $file_path): FileStorage - { - return $this->file_storage_provider->create($file_path); - } - - /** - * @return array - */ - public function findReferencesToSymbol(string $symbol): array - { - if (!$this->collect_locations) { - throw new UnexpectedValueException('Should not be checking references'); - } - - if (strpos($symbol, '::$') !== false) { - return $this->findReferencesToProperty($symbol); - } - - if (strpos($symbol, '::') !== false) { - return $this->findReferencesToMethod($symbol); - } - - return $this->findReferencesToClassLike($symbol); - } - - /** - * @return array - */ - public function findReferencesToMethod(string $method_id): array - { - return $this->file_reference_provider->getClassMethodLocations(strtolower($method_id)); - } - - /** - * @return array - */ - public function findReferencesToProperty(string $property_id): array - { - [$fq_class_name, $property_name] = explode('::', $property_id); - - return $this->file_reference_provider->getClassPropertyLocations( - strtolower($fq_class_name) . '::' . $property_name - ); - } - - /** - * @return CodeLocation[] - * - * @psalm-return array - */ - public function findReferencesToClassLike(string $fq_class_name): array - { - $fq_class_name_lc = strtolower($fq_class_name); - $locations = $this->file_reference_provider->getClassLocations($fq_class_name_lc); - - if (isset($this->use_referencing_locations[$fq_class_name_lc])) { - $locations = array_merge($locations, $this->use_referencing_locations[$fq_class_name_lc]); - } - - return $locations; - } - - public function getClosureStorage(string $file_path, string $closure_id): FunctionStorage - { - $file_storage = $this->file_storage_provider->get($file_path); - - // closures can be returned here - if (isset($file_storage->functions[$closure_id])) { - return $file_storage->functions[$closure_id]; - } - - throw new UnexpectedValueException( - 'Expecting ' . $closure_id . ' to have storage in ' . $file_path - ); - } - - public function addGlobalConstantType(string $const_id, Union $type): void - { - self::$stubbed_constants[$const_id] = $type; - } - - public function getStubbedConstantType(string $const_id): ?Union - { - return self::$stubbed_constants[$const_id] ?? null; - } - - /** - * @return array - */ - public function getAllStubbedConstants(): array - { - return self::$stubbed_constants; - } - - public function fileExists(string $file_path): bool - { - return $this->file_provider->fileExists($file_path); - } - - /** - * Check whether a class/interface exists - */ - public function classOrInterfaceExists( - string $fq_class_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - return $this->classlikes->classOrInterfaceExists( - $fq_class_name, - $code_location, - $calling_fq_class_name, - $calling_method_id - ); - } - - /** - * Check whether a class/interface exists - */ - public function classOrInterfaceOrEnumExists( - string $fq_class_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - return $this->classlikes->classOrInterfaceOrEnumExists( - $fq_class_name, - $code_location, - $calling_fq_class_name, - $calling_method_id - ); - } - - public function classExtendsOrImplements(string $fq_class_name, string $possible_parent): bool - { - return $this->classlikes->classExtends($fq_class_name, $possible_parent) - || $this->classlikes->classImplements($fq_class_name, $possible_parent); - } - - /** - * Determine whether or not a given class exists - */ - public function classExists( - string $fq_class_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - return $this->classlikes->classExists( - $fq_class_name, - $code_location, - $calling_fq_class_name, - $calling_method_id - ); - } - - /** - * Determine whether or not a class extends a parent - * - * @throws UnpopulatedClasslikeException when called on unpopulated class - * @throws InvalidArgumentException when class does not exist - */ - public function classExtends(string $fq_class_name, string $possible_parent): bool - { - return $this->classlikes->classExtends($fq_class_name, $possible_parent, true); - } - - /** - * Check whether a class implements an interface - */ - public function classImplements(string $fq_class_name, string $interface): bool - { - return $this->classlikes->classImplements($fq_class_name, $interface); - } - - public function interfaceExists( - string $fq_interface_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - return $this->classlikes->interfaceExists( - $fq_interface_name, - $code_location, - $calling_fq_class_name, - $calling_method_id - ); - } - - public function interfaceExtends(string $interface_name, string $possible_parent): bool - { - return $this->classlikes->interfaceExtends($interface_name, $possible_parent); - } - - /** - * @return array all interfaces extended by $interface_name - */ - public function getParentInterfaces(string $fq_interface_name): array - { - return $this->classlikes->getParentInterfaces( - $this->classlikes->getUnAliasedName($fq_interface_name) - ); - } - - /** - * Determine whether or not a class has the correct casing - */ - public function classHasCorrectCasing(string $fq_class_name): bool - { - return $this->classlikes->classHasCorrectCasing($fq_class_name); - } - - public function interfaceHasCorrectCasing(string $fq_interface_name): bool - { - return $this->classlikes->interfaceHasCorrectCasing($fq_interface_name); - } - - public function traitHasCorrectCase(string $fq_trait_name): bool - { - return $this->classlikes->traitHasCorrectCase($fq_trait_name); - } - - /** - * Given a function id, return the function like storage for - * a method, closure, or function. - * - * @param non-empty-string $function_id - * - * @return FunctionStorage|MethodStorage - */ - public function getFunctionLikeStorage( - StatementsAnalyzer $statements_analyzer, - string $function_id - ): FunctionLikeStorage { - $doesMethodExist = - MethodIdentifier::isValidMethodIdReference($function_id) - && $this->methodExists($function_id); - - if ($doesMethodExist) { - $method_id = MethodIdentifier::wrap($function_id); - - $declaring_method_id = $this->methods->getDeclaringMethodId($method_id); - - if (!$declaring_method_id) { - throw new UnexpectedValueException('Declaring method for ' . $method_id . ' cannot be found'); - } - - return $this->methods->getStorage($declaring_method_id); - } - - return $this->functions->getStorage($statements_analyzer, strtolower($function_id)); - } - - /** - * Whether or not a given method exists - * - * @param string|MethodIdentifier $method_id - * @param string|MethodIdentifier|null $calling_method_id - */ - public function methodExists( - $method_id, - ?CodeLocation $code_location = null, - $calling_method_id = null, - ?string $file_path = null, - bool $is_used = true - ): bool { - return $this->methods->methodExists( - MethodIdentifier::wrap($method_id), - is_string($calling_method_id) ? strtolower($calling_method_id) : strtolower((string) $calling_method_id), - $code_location, - null, - $file_path, - true, - $is_used - ); - } - - /** - * @param string|MethodIdentifier $method_id - * - * @return array - */ - public function getMethodParams($method_id): array - { - return $this->methods->getMethodParams(MethodIdentifier::wrap($method_id)); - } - - /** - * @param string|MethodIdentifier $method_id - * - */ - public function isVariadic($method_id): bool - { - return $this->methods->isVariadic(MethodIdentifier::wrap($method_id)); - } - - /** - * @param string|MethodIdentifier $method_id - * @param list $call_args - * - */ - public function getMethodReturnType($method_id, ?string &$self_class, array $call_args = []): ?Union - { - return $this->methods->getMethodReturnType( - MethodIdentifier::wrap($method_id), - $self_class, - null, - $call_args - ); - } - - /** - * @param string|MethodIdentifier $method_id - * - */ - public function getMethodReturnsByRef($method_id): bool - { - return $this->methods->getMethodReturnsByRef(MethodIdentifier::wrap($method_id)); - } - - /** - * @param string|MethodIdentifier $method_id - * @param CodeLocation|null $defined_location - * - */ - public function getMethodReturnTypeLocation( - $method_id, - CodeLocation &$defined_location = null - ): ?CodeLocation { - return $this->methods->getMethodReturnTypeLocation( - MethodIdentifier::wrap($method_id), - $defined_location - ); - } - - /** - * @param string|MethodIdentifier $method_id - * - */ - public function getDeclaringMethodId($method_id): ?string - { - $new_method_id = $this->methods->getDeclaringMethodId(MethodIdentifier::wrap($method_id)); - - return $new_method_id ? (string) $new_method_id : null; - } - - /** - * Get the class this method appears in (vs is declared in, which could give a trait) - * - * @param string|MethodIdentifier $method_id - * - */ - public function getAppearingMethodId($method_id): ?string - { - $new_method_id = $this->methods->getAppearingMethodId(MethodIdentifier::wrap($method_id)); - - return $new_method_id ? (string) $new_method_id : null; - } - - /** - * @param string|MethodIdentifier $method_id - * - * @return array - */ - public function getOverriddenMethodIds($method_id): array - { - return $this->methods->getOverriddenMethodIds(MethodIdentifier::wrap($method_id)); - } - - /** - * @param string|MethodIdentifier $method_id - * - */ - public function getCasedMethodId($method_id): string - { - return $this->methods->getCasedMethodId(MethodIdentifier::wrap($method_id)); - } - - public function invalidateInformationForFile(string $file_path): void - { - $this->scanner->removeFile($file_path); - - try { - $file_storage = $this->file_storage_provider->get($file_path); - } catch (InvalidArgumentException $e) { - return; - } - - foreach ($file_storage->classlikes_in_file as $fq_classlike_name) { - $this->classlike_storage_provider->remove($fq_classlike_name); - $this->classlikes->removeClassLike($fq_classlike_name); - } - - $this->file_storage_provider->remove($file_path); - } - - public function getFunctionStorageForSymbol(string $file_path, string $symbol): ?FunctionLikeStorage - { - if (strpos($symbol, '::')) { - $symbol = substr($symbol, 0, -2); - /** @psalm-suppress ArgumentTypeCoercion */ - $method_id = new MethodIdentifier(...explode('::', $symbol)); - - $declaring_method_id = $this->methods->getDeclaringMethodId($method_id); - - if (!$declaring_method_id) { - return null; - } - - return $this->methods->getStorage($declaring_method_id); - } - - $function_id = strtolower(substr($symbol, 0, -2)); - $file_storage = $this->file_storage_provider->get($file_path); - - if (isset($file_storage->functions[$function_id])) { - return $file_storage->functions[$function_id]; - } - - if (!$function_id) { - return null; - } - - return $this->functions->getStorage(null, $function_id); - } - - /** - * @param string $file_path - * @param string $symbol - * @return array{ type: string, description?: string|null}|null - */ - public function getSymbolInformation(string $file_path, string $symbol): ?array - { - if (is_numeric($symbol[0])) { - return ['type' => preg_replace('/^[^:]*:/', '', $symbol)]; - } - - try { - if (strpos($symbol, '::')) { - if (strpos($symbol, '()')) { - $symbol = substr($symbol, 0, -2); - - /** @psalm-suppress ArgumentTypeCoercion */ - $method_id = new MethodIdentifier(...explode('::', $symbol)); - - $declaring_method_id = $this->methods->getDeclaringMethodId($method_id); - - if (!$declaring_method_id) { - return null; - } - - $storage = $this->methods->getStorage($declaring_method_id); - - return [ - 'type' => 'getSignature(true), - 'description' => $storage->description, - ]; - } - - [, $symbol_name] = explode('::', $symbol); - - if (strpos($symbol, '$') !== false) { - $storage = $this->properties->getStorage($symbol); - - return [ - 'type' => 'getInfo() . ' ' . $symbol_name, - 'description' => $storage->description, - ]; - } - - [$fq_classlike_name, $const_name] = explode('::', $symbol); - - $class_constants = $this->classlikes->getConstantsForClass( - $fq_classlike_name, - ReflectionProperty::IS_PRIVATE - ); - - if (!isset($class_constants[$const_name])) { - return null; - } - - return [ - 'type' => ' $class_constants[$const_name]->description, - ]; - } - - if (strpos($symbol, '()')) { - $function_id = strtolower(substr($symbol, 0, -2)); - $file_storage = $this->file_storage_provider->get($file_path); - - if (isset($file_storage->functions[$function_id])) { - $function_storage = $file_storage->functions[$function_id]; - - return [ - 'type' => 'getSignature(true), - 'description' => $function_storage->description, - ]; - } - - if (!$function_id) { - return null; - } - - $function = $this->functions->getStorage(null, $function_id); - return [ - 'type' => 'getSignature(true), - 'description' => $function->description, - ]; - } - - if (strpos($symbol, '$') === 0) { - $type = VariableFetchAnalyzer::getGlobalType($symbol); - if (!$type->isMixed()) { - return ['type' => 'classlike_storage_provider->get($symbol); - return [ - 'type' => 'abstract ? 'abstract ' : '') . 'class ' . $storage->name, - 'description' => $storage->description, - ]; - } catch (InvalidArgumentException $e) { - } - - if (strpos($symbol, '\\')) { - $const_name_parts = explode('\\', $symbol); - $const_name = array_pop($const_name_parts); - $namespace_name = implode('\\', $const_name_parts); - - $namespace_constants = NamespaceAnalyzer::getConstantsForNamespace( - $namespace_name, - ReflectionProperty::IS_PUBLIC - ); - if (isset($namespace_constants[$const_name])) { - $type = $namespace_constants[$const_name]; - return ['type' => 'file_storage_provider->get($file_path); - if (isset($file_storage->constants[$symbol])) { - return ['type' => 'constants[$symbol]]; - } - $constant = ConstFetchAnalyzer::getGlobalConstType($this, $symbol, $symbol); - - if ($constant) { - return ['type' => 'getMessage()); - - return null; - } - } - - public function getSymbolLocation(string $file_path, string $symbol): ?CodeLocation - { - if (is_numeric($symbol[0])) { - $symbol = preg_replace('/:.*/', '', $symbol); - $symbol_parts = explode('-', $symbol); - - $file_contents = $this->getFileContents($file_path); - - return new Raw( - $file_contents, - $file_path, - $this->config->shortenFileName($file_path), - (int) $symbol_parts[0], - (int) $symbol_parts[1] - ); - } - - try { - if (strpos($symbol, '::')) { - if (strpos($symbol, '()')) { - $symbol = substr($symbol, 0, -2); - - /** @psalm-suppress ArgumentTypeCoercion */ - $method_id = new MethodIdentifier(...explode('::', $symbol)); - - $declaring_method_id = $this->methods->getDeclaringMethodId($method_id); - - if (!$declaring_method_id) { - return null; - } - - $storage = $this->methods->getStorage($declaring_method_id); - - return $storage->location; - } - - if (strpos($symbol, '$') !== false) { - $storage = $this->properties->getStorage($symbol); - - return $storage->location; - } - - [$fq_classlike_name, $const_name] = explode('::', $symbol); - - $class_constants = $this->classlikes->getConstantsForClass( - $fq_classlike_name, - ReflectionProperty::IS_PRIVATE - ); - - if (!isset($class_constants[$const_name])) { - return null; - } - - return $class_constants[$const_name]->location; - } - - if (strpos($symbol, '()')) { - $file_storage = $this->file_storage_provider->get($file_path); - - $function_id = strtolower(substr($symbol, 0, -2)); - - if (isset($file_storage->functions[$function_id])) { - return $file_storage->functions[$function_id]->location; - } - - if (!$function_id) { - return null; - } - - return $this->functions->getStorage(null, $function_id)->location; - } - - return $this->classlike_storage_provider->get($symbol)->location; - } catch (UnexpectedValueException $e) { - error_log($e->getMessage()); - - return null; - } catch (InvalidArgumentException $e) { - return null; - } - } - - /** - * @return array{0: string, 1: Range}|null - */ - public function getReferenceAtPosition(string $file_path, Position $position): ?array - { - $is_open = $this->file_provider->isOpen($file_path); - - if (!$is_open) { - throw new UnanalyzedFileException($file_path . ' is not open'); - } - - $file_contents = $this->getFileContents($file_path); - - $offset = $position->toOffset($file_contents); - - [$reference_map, $type_map] = $this->analyzer->getMapsForFile($file_path); - - $reference = null; - - if (!$reference_map && !$type_map) { - return null; - } - - $reference_start_pos = null; - $reference_end_pos = null; - - ksort($reference_map); - - foreach ($reference_map as $start_pos => [$end_pos, $possible_reference]) { - if ($offset < $start_pos) { - break; - } - - if ($offset > $end_pos) { - continue; - } - $reference_start_pos = $start_pos; - $reference_end_pos = $end_pos; - $reference = $possible_reference; - } - - if ($reference === null || $reference_start_pos === null || $reference_end_pos === null) { - return null; - } - - $range = new Range( - self::getPositionFromOffset($reference_start_pos, $file_contents), - self::getPositionFromOffset($reference_end_pos, $file_contents) - ); - - return [$reference, $range]; - } - - /** - * @return array{0: non-empty-string, 1: int, 2: Range}|null - */ - public function getFunctionArgumentAtPosition(string $file_path, Position $position): ?array - { - $is_open = $this->file_provider->isOpen($file_path); - - if (!$is_open) { - throw new UnanalyzedFileException($file_path . ' is not open'); - } - - $file_contents = $this->getFileContents($file_path); - - $offset = $position->toOffset($file_contents); - - [, , $argument_map] = $this->analyzer->getMapsForFile($file_path); - - $reference = null; - $argument_number = null; - - if (!$argument_map) { - return null; - } - - $start_pos = null; - $end_pos = null; - - ksort($argument_map); - - foreach ($argument_map as $start_pos => [$end_pos, $possible_reference, $possible_argument_number]) { - if ($offset < $start_pos) { - break; - } - - if ($offset > $end_pos) { - continue; - } - - $reference = $possible_reference; - $argument_number = $possible_argument_number; - } - - if ($reference === null || $start_pos === null || $end_pos === null || $argument_number === null) { - return null; - } - - $range = new Range( - self::getPositionFromOffset($start_pos, $file_contents), - self::getPositionFromOffset($end_pos, $file_contents) - ); - - return [$reference, $argument_number, $range]; - } - - /** - * @param non-empty-string $function_symbol - */ - public function getSignatureInformation( - string $function_symbol, - string $file_path = null - ): ?SignatureInformation { - $signature_label = ''; - $signature_documentation = null; - if (strpos($function_symbol, '::') !== false) { - /** @psalm-suppress ArgumentTypeCoercion */ - $method_id = new MethodIdentifier(...explode('::', $function_symbol)); - - $declaring_method_id = $this->methods->getDeclaringMethodId($method_id); - - if ($declaring_method_id === null) { - return null; - } - - $method_storage = $this->methods->getStorage($declaring_method_id); - $params = $method_storage->params; - $signature_label = $method_storage->cased_name; - $signature_documentation = $method_storage->description; - } else { - try { - if ($file_path) { - $function_storage = $this->functions->getStorage( - null, - strtolower($function_symbol), - dirname($file_path), - $file_path - ); - } else { - $function_storage = $this->functions->getStorage(null, strtolower($function_symbol)); - } - $params = $function_storage->params; - $signature_label = $function_storage->cased_name; - $signature_documentation = $function_storage->description; - } catch (Exception $exception) { - if (InternalCallMapHandler::inCallMap($function_symbol)) { - $callables = InternalCallMapHandler::getCallablesFromCallMap($function_symbol); - - if (!$callables || !$callables[0]->params) { - return null; - } - - $params = $callables[0]->params; - } else { - return null; - } - } - } - - $signature_label .= '('; - $parameters = []; - - foreach ($params as $i => $param) { - $parameter_label = ($param->type ?: 'mixed') . ' $' . $param->name; - $parameters[] = new ParameterInformation( - [ - strlen($signature_label), - strlen($signature_label) + strlen($parameter_label), - ], - $param->description ?? null - ); - - $signature_label .= $parameter_label; - - if ($i < (count($params) - 1)) { - $signature_label .= ', '; - } - } - - $signature_label .= ')'; - - return new SignatureInformation( - $signature_label, - $parameters, - $signature_documentation - ); - } - - /** - * @return array{0: string, 1: '->'|'::'|'['|'symbol', 2: int}|null - */ - public function getCompletionDataAtPosition(string $file_path, Position $position): ?array - { - $is_open = $this->file_provider->isOpen($file_path); - - if (!$is_open) { - throw new UnanalyzedFileException($file_path . ' is not open'); - } - - $file_contents = $this->getFileContents($file_path); - - $offset = $position->toOffset($file_contents); - - [$reference_map, $type_map] = $this->analyzer->getMapsForFile($file_path); - - if (!$reference_map && !$type_map) { - return null; - } - - krsort($type_map); - - foreach ($type_map as $start_pos => [$end_pos_excluding_whitespace, $possible_type]) { - if ($offset < $start_pos) { - continue; - } - - $num_whitespace_bytes = preg_match('/\G\s+/', $file_contents, $matches, 0, $end_pos_excluding_whitespace) - ? strlen($matches[0]) - : 0; - $end_pos = $end_pos_excluding_whitespace + $num_whitespace_bytes; - - if ($offset - $end_pos === 1) { - $candidate_gap = substr($file_contents, $end_pos, 1); - - if ($candidate_gap === '[') { - $gap = $candidate_gap; - $recent_type = $possible_type; - - if ($recent_type === 'mixed') { - return null; - } - - return [$recent_type, $gap, $offset]; - } - } - - if ($offset - $end_pos === 2 || $offset - $end_pos === 3) { - $candidate_gap = substr($file_contents, $end_pos, 2); - - if ($candidate_gap === '->' || $candidate_gap === '::') { - $gap = $candidate_gap; - $recent_type = $possible_type; - - if ($recent_type === 'mixed') { - return null; - } - - return [$recent_type, $gap, $offset]; - } - } - } - - foreach ($reference_map as $start_pos => [$end_pos, $possible_reference]) { - if ($offset < $start_pos) { - continue; - } - // If the reference precedes a "::" then treat it as a class reference. - if ($offset - $end_pos === 2 && substr($file_contents, $end_pos, 2) === '::') { - return [$possible_reference, '::', $offset]; - } - - // Only continue for references that are partial / don't exist. - if ($possible_reference[0] !== '*') { - continue; - } - - if ($offset - $end_pos === 0) { - $recent_type = $possible_reference; - - return [$recent_type, 'symbol', $offset]; - } - } - - return null; - } - - public function getTypeContextAtPosition(string $file_path, Position $position): ?Union - { - $file_contents = $this->getFileContents($file_path); - $offset = $position->toOffset($file_contents); - - [$reference_map, $type_map, $argument_map] = $this->analyzer->getMapsForFile($file_path); - if (!$reference_map && !$type_map && !$argument_map) { - return null; - } - foreach ($argument_map as $start_pos => [$end_pos, $function, $argument_num]) { - if ($offset < $start_pos || $offset > $end_pos) { - continue; - } - // First parameter to a function-like - $function_storage = $this->getFunctionStorageForSymbol($file_path, $function . '()'); - if (!$function_storage || !$function_storage->params || !isset($function_storage->params[$argument_num])) { - return null; - } - - return $function_storage->params[$argument_num]->type; - } - - return null; - } - - /** - * @return list - */ - public function getCompletionItemsForClassishThing(string $type_string, string $gap): array - { - $completion_items = []; - - $type = Type::parseString($type_string); - - foreach ($type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TNamedObject) { - try { - $class_storage = $this->classlike_storage_provider->get($atomic_type->value); - - foreach ($class_storage->appearing_method_ids as $declaring_method_id) { - $method_storage = $this->methods->getStorage($declaring_method_id); - - if ($method_storage->is_static || $gap === '->') { - $completion_item = new CompletionItem( - $method_storage->cased_name, - CompletionItemKind::METHOD, - (string)$method_storage, - $method_storage->description, - (string)$method_storage->visibility, - $method_storage->cased_name, - $method_storage->cased_name . (count($method_storage->params) !== 0 ? '($0)' : '()'), - null, - null, - new Command('Trigger parameter hints', 'editor.action.triggerParameterHints'), - null, - 2 - ); - - $completion_item->insertTextFormat = InsertTextFormat::SNIPPET; - - $completion_items[] = $completion_item; - } - } - - foreach ($class_storage->declaring_property_ids as $property_name => $declaring_class) { - $property_storage = $this->properties->getStorage( - $declaring_class . '::$' . $property_name - ); - - if ($property_storage->is_static || $gap === '->') { - $completion_items[] = new CompletionItem( - '$' . $property_name, - CompletionItemKind::PROPERTY, - $property_storage->getInfo(), - $property_storage->description, - (string)$property_storage->visibility, - $property_name, - ($gap === '::' ? '$' : '') . $property_name - ); - } - } - - foreach ($class_storage->constants as $const_name => $const) { - $completion_items[] = new CompletionItem( - $const_name, - CompletionItemKind::VARIABLE, - 'const ' . $const_name, - $const->description, - null, - $const_name, - $const_name - ); - } - } catch (Exception $e) { - error_log($e->getMessage()); - continue; - } - } - } - - return $completion_items; - } - - /** - * @return list - */ - public function getCompletionItemsForPartialSymbol( - string $type_string, - int $offset, - string $file_path - ): array { - $fq_suggestion = false; - - if (($type_string[1] ?? '') === '\\') { - $fq_suggestion = true; - } - - $matching_classlike_names = $this->classlikes->getMatchingClassLikeNames($type_string); - - $completion_items = []; - - $file_storage = $this->file_storage_provider->get($file_path); - - $aliases = null; - - foreach ($file_storage->classlikes_in_file as $fq_class_name => $_) { - try { - $class_storage = $this->classlike_storage_provider->get($fq_class_name); - } catch (Exception $e) { - continue; - } - - if (!$class_storage->stmt_location) { - continue; - } - - if ($offset > $class_storage->stmt_location->raw_file_start - && $offset < $class_storage->stmt_location->raw_file_end - ) { - $aliases = $class_storage->aliases; - break; - } - } - - if (!$aliases) { - foreach ($file_storage->namespace_aliases as $namespace_start => $namespace_aliases) { - if ($namespace_start < $offset) { - $aliases = $namespace_aliases; - break; - } - } - - if (!$aliases) { - $aliases = $file_storage->aliases; - } - } - - foreach ($matching_classlike_names as $fq_class_name) { - $extra_edits = []; - - $insertion_text = Type::getStringFromFQCLN( - $fq_class_name, - $aliases && $aliases->namespace ? $aliases->namespace : null, - $aliases->uses_flipped ?? [], - null - ); - - if ($aliases - && !$fq_suggestion - && $aliases->namespace - && $insertion_text === '\\' . $fq_class_name - && $aliases->namespace_first_stmt_start - ) { - $file_contents = $this->getFileContents($file_path); - - $class_name = preg_replace('/^.*\\\/', '', $fq_class_name); - - if ($aliases->uses_end) { - $position = self::getPositionFromOffset($aliases->uses_end, $file_contents); - $extra_edits[] = new TextEdit( - new Range( - $position, - $position - ), - "\n" . 'use ' . $fq_class_name . ';' - ); - } else { - $position = self::getPositionFromOffset($aliases->namespace_first_stmt_start, $file_contents); - $extra_edits[] = new TextEdit( - new Range( - $position, - $position - ), - 'use ' . $fq_class_name . ';' . "\n" . "\n" - ); - } - - $insertion_text = $class_name; - } - - try { - $class_storage = $this->classlike_storage_provider->get($fq_class_name); - $description = $class_storage->description; - } catch (Exception $e) { - $description = null; - } - - $completion_items[] = new CompletionItem( - $fq_class_name, - CompletionItemKind::CLASS_, - null, - $description, - null, - $fq_class_name, - $insertion_text, - null, - $extra_edits - ); - } - - $functions = $this->functions->getMatchingFunctionNames($type_string, $offset, $file_path, $this); - - $namespace_map = []; - if ($aliases) { - $namespace_map += $aliases->uses_flipped; - if ($aliases->namespace) { - $namespace_map[$aliases->namespace] = ''; - } - } - - // Sort the map by longest first, so we replace most specific - // used namespaces first. - ksort($namespace_map); - $namespace_map = array_reverse($namespace_map); - - foreach ($functions as $function_lowercase => $function) { - // Transform FQFN relative to all uses namespaces - $function_name = $function->cased_name; - if (!$function_name) { - continue; - } - $in_namespace_map = false; - foreach ($namespace_map as $namespace_name => $namespace_alias) { - if (strpos($function_lowercase, $namespace_name . '\\') === 0) { - $function_name = $namespace_alias . '\\' . substr($function_name, strlen($namespace_name) + 1); - $in_namespace_map = true; - } - } - // If the function is not use'd, and it's not a global function - // prepend it with a backslash. - if (!$in_namespace_map && strpos($function_name, '\\') !== false) { - $function_name = '\\' . $function_name; - } - $completion_items[] = new CompletionItem( - $function_name, - CompletionItemKind::FUNCTION, - $function->getSignature(false), - $function->description, - null, - $function_name, - $function_name . (count($function->params) !== 0 ? '($0)' : '()'), - null, - null, - new Command('Trigger parameter hints', 'editor.action.triggerParameterHints'), - null, - 2 - ); - } - - return $completion_items; - } - - /** - * @return list - */ - public function getCompletionItemsForType(Union $type): array - { - $completion_items = []; - foreach ($type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TBool) { - $bools = (string) $atomic_type === 'bool' ? ['true', 'false'] : [(string) $atomic_type]; - foreach ($bools as $property_name) { - $completion_items[] = new CompletionItem( - $property_name, - CompletionItemKind::VALUE, - 'bool', - null, - null, - null, - $property_name - ); - } - } elseif ($atomic_type instanceof TLiteralString) { - $completion_items[] = new CompletionItem( - $atomic_type->value, - CompletionItemKind::VALUE, - $atomic_type->getId(), - null, - null, - null, - "'$atomic_type->value'" - ); - } elseif ($atomic_type instanceof TLiteralInt) { - $completion_items[] = new CompletionItem( - (string) $atomic_type->value, - CompletionItemKind::VALUE, - $atomic_type->getId(), - null, - null, - null, - (string) $atomic_type->value - ); - } elseif ($atomic_type instanceof TClassConstant) { - $const = $atomic_type->fq_classlike_name . '::' . $atomic_type->const_name; - $completion_items[] = new CompletionItem( - $const, - CompletionItemKind::VALUE, - $atomic_type->getId(), - null, - null, - null, - $const - ); - } - } - return $completion_items; - } - - /** - * @return list - */ - public function getCompletionItemsForArrayKeys( - string $type_string - ): array { - $completion_items = []; - $type = Type::parseString($type_string); - foreach ($type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TKeyedArray) { - foreach ($atomic_type->properties as $property_name => $property) { - $completion_items[] = new CompletionItem( - (string) $property_name, - CompletionItemKind::PROPERTY, - (string) $property, - null, - null, - null, - "'$property_name'" - ); - } - } - } - return $completion_items; - } - - private static function getPositionFromOffset(int $offset, string $file_contents): Position - { - $file_contents = substr($file_contents, 0, $offset); - - $offsetLength = $offset - strlen($file_contents); - - //PHP 8.0: Argument #3 ($offset) must be contained in argument #1 ($haystack) - if (($textlen = strlen($file_contents)) < $offsetLength) { - $offsetLength = $textlen; - } - - $before_newline_count = strrpos($file_contents, "\n", $offsetLength); - - return new Position( - substr_count($file_contents, "\n"), - $offset - (int)$before_newline_count - 1 - ); - } - - public function addTemporaryFileChanges(string $file_path, string $new_content): void - { - $this->file_provider->addTemporaryFileChanges($file_path, $new_content); - } - - public function removeTemporaryFileChanges(string $file_path): void - { - $this->file_provider->removeTemporaryFileChanges($file_path); - } - - /** - * Checks if type is a subtype of other - * - * Given two types, checks if `$input_type` is a subtype of `$container_type`. - * If you consider `Union` as a set of types, this will tell you - * if `$input_type` is fully contained in `$container_type`, - * - * $input_type ⊆ $container_type - * - * Useful for emitting issues like InvalidArgument, where argument at the call site - * should be a subset of the function parameter type. - */ - public function isTypeContainedByType( - Union $input_type, - Union $container_type - ): bool { - return UnionTypeComparator::isContainedBy($this, $input_type, $container_type); - } - - /** - * Checks if type has any part that is a subtype of other - * - * Given two types, checks if *any part* of `$input_type` is a subtype of `$container_type`. - * If you consider `Union` as a set of types, this will tell you if intersection - * of `$input_type` with `$container_type` is not empty. - * - * $input_type ∩ $container_type ≠ ∅ , e.g. they are not disjoint. - * - * Useful for emitting issues like PossiblyInvalidArgument, where argument at the call - * site should be a subtype of the function parameter type, but it's has some types that are - * not a subtype of the required type. - */ - public function canTypeBeContainedByType( - Union $input_type, - Union $container_type - ): bool { - return UnionTypeComparator::canBeContainedBy($this, $input_type, $container_type); - } - - /** - * Extracts key and value types from a traversable object (or iterable) - * - * Given an iterable type (*but not TArray*) returns a tuple of it's key/value types. - * First element of the tuple holds key type, second has the value type. - * - * Example: - * ```php - * $codebase->getKeyValueParamsForTraversableObject(Type::parseString('iterable')) - * // returns [Union(TInt), Union(TString)] - * ``` - * - * @return array{Union, Union} - */ - public function getKeyValueParamsForTraversableObject(Atomic $type): array - { - $key_type = null; - $value_type = null; - - ForeachAnalyzer::getKeyValueParamsForTraversableObject($type, $this, $key_type, $value_type); - - return [ - $key_type ?? Type::getMixed(), - $value_type ?? Type::getMixed(), - ]; - } - - /** - * @param array $phantom_classes - * @psalm-suppress PossiblyUnusedMethod part of the public API - */ - public function queueClassLikeForScanning( - string $fq_classlike_name, - bool $analyze_too = false, - bool $store_failure = true, - array $phantom_classes = [] - ): void { - $this->scanner->queueClassLikeForScanning($fq_classlike_name, $analyze_too, $store_failure, $phantom_classes); - } - - /** - * @param array $taints - * - * @psalm-suppress PossiblyUnusedMethod - */ - public function addTaintSource( - Union $expr_type, - string $taint_id, - array $taints = TaintKindGroup::ALL_INPUT, - ?CodeLocation $code_location = null - ): void { - if (!$this->taint_flow_graph) { - return; - } - - $source = new TaintSource( - $taint_id, - $taint_id, - $code_location, - null, - $taints - ); - - $this->taint_flow_graph->addSource($source); - - $expr_type->parent_nodes = [ - $source->id => $source, - ]; - } - - /** - * @param array $taints - * - * @psalm-suppress PossiblyUnusedMethod - */ - public function addTaintSink( - string $taint_id, - array $taints = TaintKindGroup::ALL_INPUT, - ?CodeLocation $code_location = null - ): void { - if (!$this->taint_flow_graph) { - return; - } - - $sink = new TaintSink( - $taint_id, - $taint_id, - $code_location, - null, - $taints - ); - - $this->taint_flow_graph->addSink($sink); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Config.php b/vendor/vimeo/psalm/src/Psalm/Config.php deleted file mode 100644 index d9d81bfd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Config.php +++ /dev/null @@ -1,2403 +0,0 @@ - - */ - public static $ERROR_LEVELS = [ - self::REPORT_INFO, - self::REPORT_ERROR, - self::REPORT_SUPPRESS, - ]; - - /** - * @var array - */ - private const MIXED_ISSUES = [ - 'MixedArgument', - 'MixedArrayAccess', - 'MixedArrayAssignment', - 'MixedArrayOffset', - 'MixedArrayTypeCoercion', - 'MixedAssignment', - 'MixedFunctionCall', - 'MixedInferredReturnType', - 'MixedMethodCall', - 'MixedOperand', - 'MixedPropertyFetch', - 'MixedPropertyAssignment', - 'MixedReturnStatement', - 'MixedStringOffsetAssignment', - 'MixedArgumentTypeCoercion', - 'MixedPropertyTypeCoercion', - 'MixedReturnTypeCoercion', - ]; - - /** - * These are special object classes that allow any and all properties to be get/set on them - * @var array - */ - protected $universal_object_crates = [ - stdClass::class, - SimpleXMLElement::class, - SimpleXMLIterator::class, - ]; - - /** - * @var static|null - */ - private static $instance; - - /** - * Whether or not to use types as defined in docblocks - * - * @var bool - */ - public $use_docblock_types = true; - - /** - * Whether or not to use types as defined in property docblocks. - * This is distinct from the above because you may want to use - * property docblocks, but not function docblocks. - * - * @var bool - */ - public $use_docblock_property_types = false; - - /** - * Whether or not to throw an exception on first error - * - * @var bool - */ - public $throw_exception = false; - - /** - * Whether or not to load Xdebug stub - * - * @deprecated going to be removed in Psalm 5 - * - * @var bool|null - */ - public $load_xdebug_stub; - - /** - * The directory to store PHP Parser (and other) caches - * - * @var string|null - */ - public $cache_directory; - - /** - * The directory to store all Psalm project caches - * - * @var string|null - */ - public $global_cache_directory; - - /** - * Path to the autoader - * - * @var string|null - */ - public $autoloader; - - /** - * @var ProjectFileFilter|null - */ - protected $project_files; - - /** - * @var ProjectFileFilter|null - */ - protected $extra_files; - - /** - * The base directory of this config file - * - * @var string - */ - public $base_dir; - - /** - * The PHP version to assume as declared in the config file - * - * @var string|null - */ - private $configured_php_version; - - /** - * @var array - */ - private $file_extensions = ['php']; - - /** - * @var array> - */ - private $filetype_scanners = []; - - /** - * @var array> - */ - private $filetype_analyzers = []; - - /** - * @var array - */ - private $filetype_scanner_paths = []; - - /** - * @var array - */ - private $filetype_analyzer_paths = []; - - /** - * @var array - */ - private $issue_handlers = []; - - /** - * @var array - */ - private $mock_classes = []; - - /** - * @var array - */ - private $preloaded_stub_files = []; - - /** - * @var array - */ - private $stub_files = []; - - /** - * @var bool - */ - public $hide_external_errors = false; - - /** @var bool */ - public $allow_includes = true; - - /** @var 1|2|3|4|5|6|7|8 */ - public $level = 1; - - /** - * @var ?bool - */ - public $show_mixed_issues; - - /** @var bool */ - public $strict_binary_operands = false; - - /** - * @var bool - */ - public $remember_property_assignments_after_call = true; - - /** @var bool */ - public $use_igbinary = false; - - /** - * @var bool - */ - public $allow_phpstorm_generics = false; - - /** - * @var bool - */ - public $allow_string_standin_for_class = false; - - /** - * @var bool - */ - public $disable_suppress_all = false; - - /** - * @var bool - */ - public $use_phpdoc_method_without_magic_or_parent = false; - - /** - * @var bool - */ - public $use_phpdoc_property_without_magic_or_parent = false; - - /** - * @var bool - */ - public $skip_checks_on_unresolvable_includes = false; - - /** - * @var bool - */ - public $seal_all_methods = false; - - /** - * @var bool - */ - public $seal_all_properties = false; - - /** - * @var bool - */ - public $memoize_method_calls = false; - - /** - * @var bool - */ - public $hoist_constants = false; - - /** - * @var bool - */ - public $add_param_default_to_docblock_type = false; - - /** - * @var bool - */ - public $disable_var_parsing = false; - - /** - * @var bool - */ - public $check_for_throws_docblock = false; - - /** - * @var bool - */ - public $check_for_throws_in_global_scope = false; - - /** - * @var bool - */ - public $ignore_internal_falsable_issues = true; - - /** - * @var bool - */ - public $ignore_internal_nullable_issues = true; - - /** - * @var array - */ - public $ignored_exceptions = []; - - /** - * @var array - */ - public $ignored_exceptions_in_global_scope = []; - - /** - * @var array - */ - public $ignored_exceptions_and_descendants = []; - - /** - * @var array - */ - public $ignored_exceptions_and_descendants_in_global_scope = []; - - /** - * @var bool - */ - public $infer_property_types_from_constructor = true; - - /** - * @var bool - */ - public $ensure_array_string_offsets_exist = false; - - /** - * @var bool - */ - public $ensure_array_int_offsets_exist = false; - - /** - * @var array - */ - public $forbidden_functions = []; - - /** - * @var bool - */ - public $forbid_echo = false; - - /** - * @var bool - */ - public $find_unused_code = false; - - /** - * @var bool - */ - public $find_unused_variables = false; - - /** - * @var bool - */ - public $find_unused_psalm_suppress = false; - - /** - * @var bool - */ - public $run_taint_analysis = false; - - /** @var bool */ - public $use_phpstorm_meta_path = true; - - /** - * @var bool - */ - public $resolve_from_config_file = true; - - /** - * @var bool - */ - public $restrict_return_types = false; - - /** - * @var bool - */ - public $limit_method_complexity = false; - - /** - * @var int - */ - public $max_graph_size = 200; - - /** - * @var int - */ - public $max_avg_path_length = 70; - - /** - * @var int - */ - public $max_shaped_array_size = 100; - - /** - * @var string[] - */ - public $plugin_paths = []; - - /** - * @var array - */ - private $plugin_classes = []; - - /** - * @var bool - */ - public $allow_internal_named_arg_calls = true; - - /** - * @var bool - */ - public $allow_named_arg_calls = true; - - /** @var array */ - private $predefined_constants = []; - - /** @var array */ - private $predefined_functions = []; - - /** @var ClassLoader|null */ - private $composer_class_loader; - - /** - * Custom functions that always exit - * - * @var array - */ - public $exit_functions = []; - - /** - * @var string - */ - public $hash = ''; - - /** @var string|null */ - public $error_baseline; - - /** - * @var bool - */ - public $include_php_versions_in_error_baseline = false; - - /** @var string */ - public $shepherd_host = 'shepherd.dev'; - - /** - * @var array - */ - public $globals = []; - - /** - * @var int - */ - public $max_string_length = 1000; - - /** @var ?IncludeCollector */ - private $include_collector; - - /** - * @var TaintAnalysisFileFilter|null - */ - protected $taint_analysis_ignored_files; - - /** - * @var bool whether to emit a backtrace of emitted issues to stderr - */ - public $debug_emitted_issues = false; - - /** - * @var bool - */ - private $report_info = true; - - /** - * @var EventDispatcher - */ - public $eventDispatcher; - - /** @var list */ - public $config_issues = []; - - /** - * @var 'default'|'never'|'always' - */ - public $trigger_error_exits = 'default'; - - /** - * @var string[] - */ - public $internal_stubs = []; - - /** @var ?int */ - public $threads; - - protected function __construct() - { - self::$instance = $this; - $this->eventDispatcher = new EventDispatcher(); - } - - /** - * Gets a Config object from an XML file. - * - * Searches up a folder hierarchy for the most immediate config. - * - * @throws ConfigException if a config path is not found - * - */ - public static function getConfigForPath(string $path, string $current_dir): Config - { - $config_path = self::locateConfigFile($path); - - if (!$config_path) { - throw new ConfigNotFoundException('Config not found for path ' . $path); - } - - return self::loadFromXMLFile($config_path, $current_dir); - } - - /** - * Searches up a folder hierarchy for the most immediate config. - * - * @throws ConfigException - * - */ - public static function locateConfigFile(string $path): ?string - { - $dir_path = realpath($path); - - if ($dir_path === false) { - throw new ConfigNotFoundException('Config not found for path ' . $path); - } - - if (!is_dir($dir_path)) { - $dir_path = dirname($dir_path); - } - - do { - $maybe_path = $dir_path . DIRECTORY_SEPARATOR . self::DEFAULT_FILE_NAME; - - if (file_exists($maybe_path) || file_exists($maybe_path .= '.dist')) { - return $maybe_path; - } - - $dir_path = dirname($dir_path); - } while (dirname($dir_path) !== $dir_path); - - return null; - } - - /** - * Creates a new config object from the file - */ - public static function loadFromXMLFile(string $file_path, string $current_dir): Config - { - $file_contents = file_get_contents($file_path); - - $base_dir = dirname($file_path) . DIRECTORY_SEPARATOR; - - if ($file_contents === false) { - throw new InvalidArgumentException('Cannot open ' . $file_path); - } - - if ($file_contents === '') { - throw new InvalidArgumentException('Invalid empty file ' . $file_path); - } - - try { - $config = self::loadFromXML($base_dir, $file_contents, $current_dir, $file_path); - $config->hash = sha1($file_contents . PSALM_VERSION); - } catch (ConfigException $e) { - throw new ConfigException( - 'Problem parsing ' . $file_path . ":\n" . ' ' . $e->getMessage() - ); - } - - return $config; - } - - /** - * Computes the hash to use for a cache folder from CLI flags and from the config file's xml contents - */ - public function computeHash(): string - { - return sha1($this->hash . ':' . $this->level); - } - - /** - * Creates a new config object from an XML string - * @param string|null $current_dir Current working directory, if different to $base_dir - * @param non-empty-string $file_contents - * - * @throws ConfigException - */ - public static function loadFromXML( - string $base_dir, - string $file_contents, - ?string $current_dir = null, - ?string $file_path = null - ): Config { - if ($current_dir === null) { - $current_dir = $base_dir; - } - - self::validateXmlConfig($base_dir, $file_contents); - - return self::fromXmlAndPaths($base_dir, $file_contents, $current_dir, $file_path); - } - - /** - * @param non-empty-string $file_contents - */ - private static function loadDomDocument(string $base_dir, string $file_contents): DOMDocument - { - $dom_document = new DOMDocument(); - - // there's no obvious way to set xml:base for a document when loading it from string - // so instead we're changing the current directory instead to be able to process XIncludes - $oldpwd = getcwd(); - chdir($base_dir); - - $dom_document->loadXML($file_contents, LIBXML_NONET); - $dom_document->xinclude(LIBXML_NOWARNING | LIBXML_NONET); - - chdir($oldpwd); - return $dom_document; - } - - /** - * @param non-empty-string $file_contents - * - * @throws ConfigException - */ - private static function validateXmlConfig(string $base_dir, string $file_contents): void - { - $schema_path = dirname(__DIR__, 2). '/config.xsd'; - - if (!file_exists($schema_path)) { - throw new ConfigException('Cannot locate config schema'); - } - - // Enable user error handling - $prev_xml_internal_errors = libxml_use_internal_errors(true); - libxml_clear_errors(); - - $dom_document = self::loadDomDocument($base_dir, $file_contents); - - $psalm_nodes = $dom_document->getElementsByTagName('psalm'); - - /** @var DomElement|null */ - $psalm_node = $psalm_nodes->item(0); - - if (!$psalm_node) { - throw new ConfigException( - 'Missing psalm node' - ); - } - - if (!$psalm_node->hasAttribute('xmlns')) { - $psalm_node->setAttribute('xmlns', self::CONFIG_NAMESPACE); - - $old_dom_document = $dom_document; - $old_file_contents = $old_dom_document->saveXML(); - assert($old_file_contents !== false && $old_file_contents !== ''); - $dom_document = self::loadDomDocument($base_dir, $old_file_contents); - } - - $dom_document->schemaValidate($schema_path); // If it returns false it will generate errors handled below - - $errors = libxml_get_errors(); - libxml_clear_errors(); - libxml_use_internal_errors($prev_xml_internal_errors); - foreach ($errors as $error) { - if ($error->level === LIBXML_ERR_FATAL || $error->level === LIBXML_ERR_ERROR) { - throw new ConfigException( - 'Error on line ' . $error->line . ":\n" . ' ' . $error->message - ); - } - } - } - - /** - * @param positive-int $line_number 1-based line number - * @return int 0-based byte offset - * @throws OutOfBoundsException - */ - private static function lineNumberToByteOffset(string $string, int $line_number): int - { - if ($line_number === 1) { - return 0; - } - - $offset = 0; - - for ($i = 0; $i < $line_number - 1; $i++) { - $newline_offset = strpos($string, "\n", $offset); - if (false === $newline_offset) { - throw new OutOfBoundsException( - 'Line ' . $line_number . ' is not found in a string with ' . ($i + 1) . ' lines' - ); - } - $offset = $newline_offset + 1; - } - - if ($offset > strlen($string)) { - throw new OutOfBoundsException('Line ' . $line_number . ' is not found'); - } - - return $offset; - } - - private static function processConfigDeprecations( - self $config, - DOMDocument $dom_document, - string $file_contents, - string $config_path - ): void { - $config->config_issues = []; - - // Attributes to be removed in Psalm 5 - $deprecated_attributes = [ - 'allowCoercionFromStringToClassConst', - 'allowPhpStormGenerics', - 'forbidEcho', - 'loadXdebugStub', - 'totallyTyped' - ]; - - $deprecated_elements = [ - 'exitFunctions', - ]; - - $psalm_element_item = $dom_document->getElementsByTagName('psalm')->item(0); - assert($psalm_element_item !== null); - $attributes = $psalm_element_item->attributes; - - foreach ($attributes as $attribute) { - if (in_array($attribute->name, $deprecated_attributes, true)) { - $line = $attribute->getLineNo(); - assert($line > 0); // getLineNo() always returns non-zero for nodes loaded from file - - $offset = self::lineNumberToByteOffset($file_contents, $line); - $attribute_start = strrpos($file_contents, $attribute->name, $offset - strlen($file_contents)) ?: 0; - $attribute_end = $attribute_start + strlen($attribute->name) - 1; - - $config->config_issues[] = new ConfigIssue( - 'Attribute "' . $attribute->name . '" is deprecated ' - . 'and is going to be removed in the next major version', - new Raw( - $file_contents, - $config_path, - basename($config_path), - $attribute_start, - $attribute_end - ) - ); - } - } - - foreach ($deprecated_elements as $deprecated_element) { - $deprecated_elements_xml = $dom_document->getElementsByTagNameNS( - self::CONFIG_NAMESPACE, - $deprecated_element - ); - if ($deprecated_elements_xml->length) { - $deprecated_element_xml = $deprecated_elements_xml->item(0); - assert($deprecated_element_xml !== null); - $line = $deprecated_element_xml->getLineNo(); - assert($line > 0); - - $offset = self::lineNumberToByteOffset($file_contents, $line); - $element_start = strpos($file_contents, $deprecated_element, $offset) ?: 0; - $element_end = $element_start + strlen($deprecated_element) - 1; - - $config->config_issues[] = new ConfigIssue( - 'Element "' . $deprecated_element . '" is deprecated ' - . 'and is going to be removed in the next major version', - new Raw( - $file_contents, - $config_path, - basename($config_path), - $element_start, - $element_end - ) - ); - } - } - } - - /** - * @param non-empty-string $file_contents - * - * @psalm-suppress MixedMethodCall - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArgument - * @psalm-suppress MixedPropertyFetch - * - * @throws ConfigException - */ - private static function fromXmlAndPaths( - string $base_dir, - string $file_contents, - string $current_dir, - ?string $config_path - ): self { - $config = new static(); - - $dom_document = self::loadDomDocument($base_dir, $file_contents); - - if (null !== $config_path) { - self::processConfigDeprecations( - $config, - $dom_document, - $file_contents, - $config_path - ); - } - - $config_xml = simplexml_import_dom($dom_document); - - $booleanAttributes = [ - 'useDocblockTypes' => 'use_docblock_types', - 'useDocblockPropertyTypes' => 'use_docblock_property_types', - 'throwExceptionOnError' => 'throw_exception', - 'hideExternalErrors' => 'hide_external_errors', - 'resolveFromConfigFile' => 'resolve_from_config_file', - 'allowFileIncludes' => 'allow_includes', - 'strictBinaryOperands' => 'strict_binary_operands', - 'rememberPropertyAssignmentsAfterCall' => 'remember_property_assignments_after_call', - 'disableVarParsing' => 'disable_var_parsing', - 'allowPhpStormGenerics' => 'allow_phpstorm_generics', - 'allowStringToStandInForClass' => 'allow_string_standin_for_class', - 'disableSuppressAll' => 'disable_suppress_all', - 'usePhpDocMethodsWithoutMagicCall' => 'use_phpdoc_method_without_magic_or_parent', - 'usePhpDocPropertiesWithoutMagicCall' => 'use_phpdoc_property_without_magic_or_parent', - 'memoizeMethodCallResults' => 'memoize_method_calls', - 'hoistConstants' => 'hoist_constants', - 'addParamDefaultToDocblockType' => 'add_param_default_to_docblock_type', - 'checkForThrowsDocblock' => 'check_for_throws_docblock', - 'checkForThrowsInGlobalScope' => 'check_for_throws_in_global_scope', - 'forbidEcho' => 'forbid_echo', - 'ignoreInternalFunctionFalseReturn' => 'ignore_internal_falsable_issues', - 'ignoreInternalFunctionNullReturn' => 'ignore_internal_nullable_issues', - 'includePhpVersionsInErrorBaseline' => 'include_php_versions_in_error_baseline', - 'loadXdebugStub' => 'load_xdebug_stub', - 'ensureArrayStringOffsetsExist' => 'ensure_array_string_offsets_exist', - 'ensureArrayIntOffsetsExist' => 'ensure_array_int_offsets_exist', - 'reportMixedIssues' => 'show_mixed_issues', - 'skipChecksOnUnresolvableIncludes' => 'skip_checks_on_unresolvable_includes', - 'sealAllMethods' => 'seal_all_methods', - 'sealAllProperties' => 'seal_all_properties', - 'runTaintAnalysis' => 'run_taint_analysis', - 'usePhpStormMetaPath' => 'use_phpstorm_meta_path', - 'allowInternalNamedArgumentsCalls' => 'allow_internal_named_arg_calls', - 'allowNamedArgumentCalls' => 'allow_named_arg_calls', - 'findUnusedPsalmSuppress' => 'find_unused_psalm_suppress', - 'reportInfo' => 'report_info', - 'restrictReturnTypes' => 'restrict_return_types', - 'limitMethodComplexity' => 'limit_method_complexity', - ]; - - foreach ($booleanAttributes as $xmlName => $internalName) { - if (isset($config_xml[$xmlName])) { - $attribute_text = (string) $config_xml[$xmlName]; - $config->setBooleanAttribute( - $internalName, - $attribute_text === 'true' || $attribute_text === '1' - ); - } - } - - if ($config->resolve_from_config_file) { - $config->base_dir = $base_dir; - } else { - $config->base_dir = $current_dir; - $base_dir = $current_dir; - } - - if (isset($config_xml['phpVersion'])) { - $config->configured_php_version = (string) $config_xml['phpVersion']; - } - - if (isset($config_xml['autoloader'])) { - $autoloader_path = $config->base_dir . DIRECTORY_SEPARATOR . $config_xml['autoloader']; - - if (!file_exists($autoloader_path)) { - throw new ConfigException('Cannot locate autoloader'); - } - - $config->autoloader = realpath($autoloader_path); - } - - if (isset($config_xml['cacheDirectory'])) { - $config->cache_directory = (string)$config_xml['cacheDirectory']; - } elseif ($user_cache_dir = (new Xdg())->getHomeCacheDir()) { - $config->cache_directory = $user_cache_dir . '/psalm'; - } else { - $config->cache_directory = sys_get_temp_dir() . '/psalm'; - } - - $config->global_cache_directory = $config->cache_directory; - - $config->cache_directory .= DIRECTORY_SEPARATOR . sha1($base_dir); - - $cwd = null; - - if ($config->resolve_from_config_file) { - $cwd = getcwd(); - chdir($config->base_dir); - } - - if (is_dir($config->cache_directory) === false && @mkdir($config->cache_directory, 0777, true) === false) { - error_log('Could not create cache directory: ' . $config->cache_directory); - } - - if ($cwd) { - chdir($cwd); - } - - if (isset($config_xml['serializer'])) { - $attribute_text = (string) $config_xml['serializer']; - $config->use_igbinary = $attribute_text === 'igbinary'; - } elseif ($igbinary_version = phpversion('igbinary')) { - $config->use_igbinary = version_compare($igbinary_version, '2.0.5') >= 0; - } - - - if (isset($config_xml['findUnusedCode'])) { - $attribute_text = (string) $config_xml['findUnusedCode']; - $config->find_unused_code = $attribute_text === 'true' || $attribute_text === '1'; - $config->find_unused_variables = $config->find_unused_code; - } - - if (isset($config_xml['findUnusedVariablesAndParams'])) { - $attribute_text = (string) $config_xml['findUnusedVariablesAndParams']; - $config->find_unused_variables = $attribute_text === 'true' || $attribute_text === '1'; - } - - if (isset($config_xml['errorLevel'])) { - $attribute_text = (int) $config_xml['errorLevel']; - - if (!in_array($attribute_text, [1, 2, 3, 4, 5, 6, 7, 8], true)) { - throw new ConfigException( - 'Invalid error level ' . $config_xml['errorLevel'] - ); - } - - $config->level = $attribute_text; - } elseif (isset($config_xml['totallyTyped'])) { - $totally_typed = (string) $config_xml['totallyTyped']; - - if ($totally_typed === 'true' || $totally_typed === '1') { - $config->level = 1; - } else { - $config->level = 2; - - if ($config->show_mixed_issues === null) { - $config->show_mixed_issues = false; - } - } - } else { - $config->level = 2; - } - - // turn on unused variable detection in level 1 - if (!isset($config_xml['findUnusedCode']) - && !isset($config_xml['findUnusedVariablesAndParams']) - && $config->level === 1 - && $config->show_mixed_issues !== false - ) { - $config->find_unused_variables = true; - } - - if (isset($config_xml['errorBaseline'])) { - $attribute_text = (string) $config_xml['errorBaseline']; - $config->error_baseline = $attribute_text; - } - - if (isset($config_xml['maxStringLength'])) { - $attribute_text = (int)$config_xml['maxStringLength']; - $config->max_string_length = $attribute_text; - } - - if (isset($config_xml['maxShapedArraySize'])) { - $attribute_text = (int)$config_xml['maxShapedArraySize']; - $config->max_shaped_array_size = $attribute_text; - } - - if (isset($config_xml['inferPropertyTypesFromConstructor'])) { - $attribute_text = (string) $config_xml['inferPropertyTypesFromConstructor']; - $config->infer_property_types_from_constructor = $attribute_text === 'true' || $attribute_text === '1'; - } - - if (isset($config_xml['triggerErrorExits'])) { - $attribute_text = (string) $config_xml['triggerErrorExits']; - if ($attribute_text === 'always' || $attribute_text === 'never') { - $config->trigger_error_exits = $attribute_text; - } - } - - if (isset($config_xml->projectFiles)) { - $config->project_files = ProjectFileFilter::loadFromXMLElement($config_xml->projectFiles, $base_dir, true); - } - - if (isset($config_xml->extraFiles)) { - $config->extra_files = ProjectFileFilter::loadFromXMLElement($config_xml->extraFiles, $base_dir, true); - } - - if (isset($config_xml->taintAnalysis->ignoreFiles)) { - $config->taint_analysis_ignored_files = TaintAnalysisFileFilter::loadFromXMLElement( - $config_xml->taintAnalysis->ignoreFiles, - $base_dir, - false - ); - } - - if (isset($config_xml->fileExtensions)) { - $config->file_extensions = []; - - $config->loadFileExtensions($config_xml->fileExtensions->extension); - } - - if (isset($config_xml->mockClasses) && isset($config_xml->mockClasses->class)) { - /** @var SimpleXMLElement $mock_class */ - foreach ($config_xml->mockClasses->class as $mock_class) { - $config->mock_classes[] = strtolower((string)$mock_class['name']); - } - } - - if (isset($config_xml->universalObjectCrates) && isset($config_xml->universalObjectCrates->class)) { - /** @var SimpleXMLElement $universal_object_crate */ - foreach ($config_xml->universalObjectCrates->class as $universal_object_crate) { - /** @var string $classString */ - $classString = $universal_object_crate['name']; - $config->addUniversalObjectCrate($classString); - } - } - - if (isset($config_xml->ignoreExceptions)) { - if (isset($config_xml->ignoreExceptions->class)) { - /** @var SimpleXMLElement $exception_class */ - foreach ($config_xml->ignoreExceptions->class as $exception_class) { - $exception_name = (string) $exception_class['name']; - $global_attribute_text = (string) $exception_class['onlyGlobalScope']; - if ($global_attribute_text !== 'true' && $global_attribute_text !== '1') { - $config->ignored_exceptions[$exception_name] = true; - } - $config->ignored_exceptions_in_global_scope[$exception_name] = true; - } - } - if (isset($config_xml->ignoreExceptions->classAndDescendants)) { - /** @var SimpleXMLElement $exception_class */ - foreach ($config_xml->ignoreExceptions->classAndDescendants as $exception_class) { - $exception_name = (string) $exception_class['name']; - $global_attribute_text = (string) $exception_class['onlyGlobalScope']; - if ($global_attribute_text !== 'true' && $global_attribute_text !== '1') { - $config->ignored_exceptions_and_descendants[$exception_name] = true; - } - $config->ignored_exceptions_and_descendants_in_global_scope[$exception_name] = true; - } - } - } - - if (isset($config_xml->forbiddenFunctions) && isset($config_xml->forbiddenFunctions->function)) { - /** @var SimpleXMLElement $forbidden_function */ - foreach ($config_xml->forbiddenFunctions->function as $forbidden_function) { - $config->forbidden_functions[strtolower((string) $forbidden_function['name'])] = true; - } - } - - if (isset($config_xml->exitFunctions) && isset($config_xml->exitFunctions->function)) { - /** @var SimpleXMLElement $exit_function */ - foreach ($config_xml->exitFunctions->function as $exit_function) { - $config->exit_functions[strtolower((string) $exit_function['name'])] = true; - } - } - - if (isset($config_xml->stubs) && isset($config_xml->stubs->file)) { - /** @var SimpleXMLElement $stub_file */ - foreach ($config_xml->stubs->file as $stub_file) { - $stub_file_name = (string)$stub_file['name']; - if (!Path::isAbsolute($stub_file_name)) { - $stub_file_name = $config->base_dir . DIRECTORY_SEPARATOR . $stub_file_name; - } - $file_path = realpath($stub_file_name); - - if (!$file_path) { - throw new ConfigException( - 'Cannot resolve stubfile path ' - . rtrim($config->base_dir, DIRECTORY_SEPARATOR) - . DIRECTORY_SEPARATOR - . $stub_file['name'] - ); - } - - if (isset($stub_file['preloadClasses'])) { - $preload_classes = (string)$stub_file['preloadClasses']; - - if ($preload_classes === 'true' || $preload_classes === '1') { - $config->addPreloadedStubFile($file_path); - } else { - $config->addStubFile($file_path); - } - } else { - $config->addStubFile($file_path); - } - } - } - - // this plugin loading system borrows heavily from etsy/phan - if (isset($config_xml->plugins)) { - if (isset($config_xml->plugins->plugin)) { - /** @var SimpleXMLElement $plugin */ - foreach ($config_xml->plugins->plugin as $plugin) { - $plugin_file_name = (string) $plugin['filename']; - - $path = Path::isAbsolute($plugin_file_name) - ? $plugin_file_name - : $config->base_dir . $plugin_file_name; - - $config->addPluginPath($path); - } - } - if (isset($config_xml->plugins->pluginClass)) { - /** @var SimpleXMLElement $plugin */ - foreach ($config_xml->plugins->pluginClass as $plugin) { - $plugin_class_name = $plugin['class']; - // any child elements are used as plugin configuration - $plugin_config = null; - if ($plugin->count()) { - $plugin_config = $plugin->children(); - } - - $config->addPluginClass((string) $plugin_class_name, $plugin_config); - } - } - } - - if (isset($config_xml->issueHandlers)) { - foreach ($config_xml->issueHandlers as $issue_handlers) { - /** @var SimpleXMLElement $issue_handler */ - foreach ($issue_handlers->children() as $key => $issue_handler) { - if ($key === 'PluginIssue') { - $custom_class_name = (string) $issue_handler['name']; - /** @var string $key */ - $config->issue_handlers[$custom_class_name] = IssueHandler::loadFromXMLElement( - $issue_handler, - $base_dir - ); - } else { - /** @var string $key */ - $config->issue_handlers[$key] = IssueHandler::loadFromXMLElement( - $issue_handler, - $base_dir - ); - } - } - } - } - - if (isset($config_xml->globals) && isset($config_xml->globals->var)) { - /** @var SimpleXMLElement $var */ - foreach ($config_xml->globals->var as $var) { - $config->globals['$' . (string) $var['name']] = (string) $var['type']; - } - } - - if (isset($config_xml['threads'])) { - $config->threads = (int)$config_xml['threads']; - } - - return $config; - } - - public static function getInstance(): Config - { - if (self::$instance) { - return self::$instance; - } - - throw new UnexpectedValueException('No config initialized'); - } - - public function setComposerClassLoader(?ClassLoader $loader = null): void - { - $this->composer_class_loader = $loader; - } - - public function setAdvancedErrorLevel(string $issue_key, array $config, ?string $default_error_level = null): void - { - $this->issue_handlers[$issue_key] = new IssueHandler(); - if ($default_error_level !== null) { - $this->issue_handlers[$issue_key]->setErrorLevel($default_error_level); - } - $this->issue_handlers[$issue_key]->setCustomLevels($config, $this->base_dir); - } - - public function setCustomErrorLevel(string $issue_key, string $error_level): void - { - $this->issue_handlers[$issue_key] = new IssueHandler(); - $this->issue_handlers[$issue_key]->setErrorLevel($error_level); - } - - /** - * @throws ConfigException if a Config file could not be found - * - */ - private function loadFileExtensions(SimpleXMLElement $extensions): void - { - foreach ($extensions as $extension) { - $extension_name = preg_replace('/^\.?/', '', (string)$extension['name']); - $this->file_extensions[] = $extension_name; - - if (isset($extension['scanner'])) { - $path = $this->base_dir . (string)$extension['scanner']; - - if (!file_exists($path)) { - throw new ConfigException('Error parsing config: cannot find file ' . $path); - } - - $this->filetype_scanner_paths[$extension_name] = $path; - } - - if (isset($extension['checker'])) { - $path = $this->base_dir . (string)$extension['checker']; - - if (!file_exists($path)) { - throw new ConfigException('Error parsing config: cannot find file ' . $path); - } - - $this->filetype_analyzer_paths[$extension_name] = $path; - } - } - } - - public function addPluginPath(string $path): void - { - if (!file_exists($path)) { - throw new InvalidArgumentException('Cannot find plugin file ' . $path); - } - - $this->plugin_paths[] = $path; - } - - public function addPluginClass(string $class_name, ?SimpleXMLElement $plugin_config = null): void - { - $this->plugin_classes[] = ['class' => $class_name, 'config' => $plugin_config]; - } - - /** @return array */ - public function getPluginClasses(): array - { - return $this->plugin_classes; - } - - /** - * Initialises all the plugins (done once the config is fully loaded) - */ - public function initializePlugins(ProjectAnalyzer $project_analyzer): void - { - $codebase = $project_analyzer->getCodebase(); - - $project_analyzer->progress->debug('Initializing plugins...' . PHP_EOL); - - $socket = new PluginRegistrationSocket($this, $codebase); - // initialize plugin classes earlier to let them hook into subsequent load process - foreach ($this->plugin_classes as $plugin_class_entry) { - $plugin_class_name = $plugin_class_entry['class']; - $plugin_config = $plugin_class_entry['config']; - - try { - // Below will attempt to load plugins from the project directory first. - // Failing that, it will use registered autoload chain, which will load - // plugins from Psalm directory or phar file. If that fails as well, it - // will fall back to project autoloader. It may seem that the last step - // will always fail, but it's only true if project uses Composer autoloader - if ($this->composer_class_loader - && ($plugin_class_path = $this->composer_class_loader->findFile($plugin_class_name)) - ) { - $project_analyzer->progress->debug( - 'Loading plugin ' . $plugin_class_name . ' via require' . PHP_EOL - ); - - self::requirePath($plugin_class_path); - } else { - if (!class_exists($plugin_class_name)) { - throw new UnexpectedValueException($plugin_class_name . ' is not a known class'); - } - } - - /** - * @psalm-suppress InvalidStringClass - * - * @var PluginEntryPointInterface - */ - $plugin_object = new $plugin_class_name; - $plugin_object($socket, $plugin_config); - } catch (Throwable $e) { - throw new ConfigException('Failed to load plugin ' . $plugin_class_name, 0, $e); - } - - $project_analyzer->progress->debug('Loaded plugin ' . $plugin_class_name . ' successfully' . PHP_EOL); - } - - foreach ($this->filetype_scanner_paths as $extension => $path) { - $fq_class_name = $this->getPluginClassForPath( - $codebase, - $path, - FileScanner::class - ); - - self::requirePath($path); - - $this->filetype_scanners[$extension] = $fq_class_name; - } - - foreach ($this->filetype_analyzer_paths as $extension => $path) { - $fq_class_name = $this->getPluginClassForPath( - $codebase, - $path, - FileAnalyzer::class - ); - - self::requirePath($path); - - $this->filetype_analyzers[$extension] = $fq_class_name; - } - - foreach ($this->plugin_paths as $path) { - try { - $plugin_object = new FileBasedPluginAdapter($path, $this, $codebase); - $plugin_object($socket); - } catch (Throwable $e) { - throw new ConfigException('Failed to load plugin ' . $path, 0, $e); - } - } - // populate additional aspects after plugins have been initialized - foreach ($socket->getAdditionalFileExtensions() as $fileExtension) { - $this->file_extensions[] = $fileExtension; - } - foreach ($socket->getAdditionalFileTypeScanners() as $extension => $className) { - $this->filetype_scanners[$extension] = $className; - } - foreach ($socket->getAdditionalFileTypeAnalyzers() as $extension => $className) { - $this->filetype_analyzers[$extension] = $className; - } - - new HtmlFunctionTainter(); - - $socket->registerHooksFromClass(HtmlFunctionTainter::class); - } - - private static function requirePath(string $path): void - { - /** @psalm-suppress UnresolvableInclude */ - require_once($path); - } - - /** - * @template T - * - * @param T::class $must_extend - * - * @return class-string - */ - private function getPluginClassForPath(Codebase $codebase, string $path, string $must_extend): string - { - $file_storage = $codebase->createFileStorageForPath($path); - $file_to_scan = new FileScanner($path, $this->shortenFileName($path), true); - $file_to_scan->scan( - $codebase, - $file_storage - ); - - $declared_classes = ClassLikeAnalyzer::getClassesForFile($codebase, $path); - - if (!count($declared_classes)) { - throw new InvalidArgumentException( - 'Plugins must have at least one class in the file - ' . $path . ' has ' . - count($declared_classes) - ); - } - - $fq_class_name = reset($declared_classes); - - if (!$codebase->classlikes->classExtends( - $fq_class_name, - $must_extend - ) - ) { - throw new InvalidArgumentException( - 'This plugin must extend ' . $must_extend . ' - ' . $path . ' does not' - ); - } - - /** - * @var class-string - */ - return $fq_class_name; - } - - public function shortenFileName(string $to): string - { - if (!is_file($to)) { - return preg_replace('/^' . preg_quote($this->base_dir, '/') . '/', '', $to); - } - - $from = $this->base_dir; - - // some compatibility fixes for Windows paths - $from = is_dir($from) ? rtrim($from, '\/') . '/' : $from; - $to = is_dir($to) ? rtrim($to, '\/') . '/' : $to; - $from = str_replace('\\', '/', $from); - $to = str_replace('\\', '/', $to); - - $from = explode('/', $from); - $to = explode('/', $to); - $relPath = $to; - - foreach ($from as $depth => $dir) { - // find first non-matching dir - if ($dir === $to[$depth]) { - // ignore this directory - array_shift($relPath); - } else { - // get number of remaining dirs to $from - $remaining = count($from) - $depth; - if ($remaining > 1) { - // add traversals up to first matching dir - $padLength = (count($relPath) + $remaining - 1) * -1; - $relPath = array_pad($relPath, $padLength, '..'); - break; - } - } - } - - return implode('/', $relPath); - } - - public function reportIssueInFile(string $issue_type, string $file_path): bool - { - if (($this->show_mixed_issues === false || $this->level > 2) - && in_array($issue_type, self::MIXED_ISSUES, true) - ) { - return false; - } - - if ($this->mustBeIgnored($file_path)) { - return false; - } - - $dependent_files = [strtolower($file_path) => $file_path]; - - $project_analyzer = ProjectAnalyzer::getInstance(); - - $codebase = $project_analyzer->getCodebase(); - - if (!$this->hide_external_errors) { - try { - $file_storage = $codebase->file_storage_provider->get($file_path); - $dependent_files += $file_storage->required_by_file_paths; - } catch (InvalidArgumentException $e) { - // do nothing - } - } - - $any_file_path_matched = false; - - foreach ($dependent_files as $dependent_file_path) { - if (((!$project_analyzer->full_run && $codebase->analyzer->canReportIssues($dependent_file_path)) - || $project_analyzer->canReportIssues($dependent_file_path)) - && ($file_path === $dependent_file_path || !$this->mustBeIgnored($dependent_file_path)) - ) { - $any_file_path_matched = true; - break; - } - } - - if (!$any_file_path_matched) { - return false; - } - - if ($this->getReportingLevelForFile($issue_type, $file_path) === self::REPORT_SUPPRESS) { - return false; - } - - return true; - } - - public function isInProjectDirs(string $file_path): bool - { - return $this->project_files && $this->project_files->allows($file_path); - } - - public function isInExtraDirs(string $file_path): bool - { - return $this->extra_files && $this->extra_files->allows($file_path); - } - - public function mustBeIgnored(string $file_path): bool - { - return $this->project_files && $this->project_files->forbids($file_path); - } - - public function trackTaintsInPath(string $file_path): bool - { - return !$this->taint_analysis_ignored_files - || $this->taint_analysis_ignored_files->allows($file_path); - } - - public function getReportingLevelForIssue(CodeIssue $e): string - { - $fqcn_parts = explode('\\', get_class($e)); - $issue_type = array_pop($fqcn_parts); - - $reporting_level = null; - - if ($e instanceof ClassIssue) { - $reporting_level = $this->getReportingLevelForClass($issue_type, $e->fq_classlike_name); - } elseif ($e instanceof MethodIssue) { - $reporting_level = $this->getReportingLevelForMethod($issue_type, $e->method_id); - } elseif ($e instanceof FunctionIssue) { - $reporting_level = $this->getReportingLevelForFunction($issue_type, $e->function_id); - } elseif ($e instanceof PropertyIssue) { - $reporting_level = $this->getReportingLevelForProperty($issue_type, $e->property_id); - } elseif ($e instanceof ArgumentIssue && $e->function_id) { - $reporting_level = $this->getReportingLevelForArgument($issue_type, $e->function_id); - } elseif ($e instanceof VariableIssue) { - $reporting_level = $this->getReportingLevelForVariable($issue_type, $e->var_name); - } - - if ($reporting_level === null) { - $reporting_level = $this->getReportingLevelForFile($issue_type, $e->getFilePath()); - } - - if (!$this->report_info && $reporting_level === self::REPORT_INFO) { - $reporting_level = self::REPORT_SUPPRESS; - } - - $parent_issue_type = self::getParentIssueType($issue_type); - - if ($parent_issue_type && $reporting_level === self::REPORT_ERROR) { - $parent_reporting_level = $this->getReportingLevelForFile($parent_issue_type, $e->getFilePath()); - - if ($parent_reporting_level !== $reporting_level) { - return $parent_reporting_level; - } - } - - return $reporting_level; - } - - /** - * @psalm-pure - */ - public static function getParentIssueType(string $issue_type): ?string - { - if ($issue_type === 'PossiblyUndefinedIntArrayOffset' - || $issue_type === 'PossiblyUndefinedStringArrayOffset' - ) { - return 'PossiblyUndefinedArrayOffset'; - } - - if ($issue_type === 'PossiblyNullReference') { - return 'NullReference'; - } - - if ($issue_type === 'PossiblyFalseReference') { - return null; - } - - if ($issue_type === 'PossiblyUndefinedArrayOffset') { - return null; - } - - if (strpos($issue_type, 'Possibly') === 0) { - $stripped_issue_type = preg_replace('/^Possibly(False|Null)?/', '', $issue_type); - - if (strpos($stripped_issue_type, 'Invalid') === false && strpos($stripped_issue_type, 'Un') !== 0) { - $stripped_issue_type = 'Invalid' . $stripped_issue_type; - } - - return $stripped_issue_type; - } - - if (strpos($issue_type, 'Tainted') === 0) { - return 'TaintedInput'; - } - - if (preg_match('/^(False|Null)[A-Z]/', $issue_type) && !strpos($issue_type, 'Reference')) { - return preg_replace('/^(False|Null)/', 'Invalid', $issue_type); - } - - if ($issue_type === 'UndefinedInterfaceMethod') { - return 'UndefinedMethod'; - } - - if ($issue_type === 'UndefinedMagicPropertyFetch') { - return 'UndefinedPropertyFetch'; - } - - if ($issue_type === 'UndefinedMagicPropertyAssignment') { - return 'UndefinedPropertyAssignment'; - } - - if ($issue_type === 'UndefinedMagicMethod') { - return 'UndefinedMethod'; - } - - if ($issue_type === 'PossibleRawObjectIteration') { - return 'RawObjectIteration'; - } - - if ($issue_type === 'UninitializedProperty') { - return 'PropertyNotSetInConstructor'; - } - - if ($issue_type === 'InvalidDocblockParamName') { - return 'InvalidDocblock'; - } - - if ($issue_type === 'UnusedClosureParam') { - return 'UnusedParam'; - } - - if ($issue_type === 'UnusedConstructor') { - return 'UnusedMethod'; - } - - if ($issue_type === 'StringIncrement') { - return 'InvalidOperand'; - } - - if ($issue_type === 'InvalidLiteralArgument') { - return 'InvalidArgument'; - } - - if ($issue_type === 'RedundantConditionGivenDocblockType') { - return 'RedundantCondition'; - } - - if ($issue_type === 'RedundantFunctionCallGivenDocblockType') { - return 'RedundantFunctionCall'; - } - - if ($issue_type === 'RedundantCastGivenDocblockType') { - return 'RedundantCast'; - } - - if ($issue_type === 'TraitMethodSignatureMismatch') { - return 'MethodSignatureMismatch'; - } - - if ($issue_type === 'ImplementedParamTypeMismatch') { - return 'MoreSpecificImplementedParamType'; - } - - if ($issue_type === 'UndefinedDocblockClass') { - return 'UndefinedClass'; - } - - if ($issue_type === 'UnusedForeachValue') { - return 'UnusedVariable'; - } - - return null; - } - - public function getReportingLevelForFile(string $issue_type, string $file_path): string - { - if (isset($this->issue_handlers[$issue_type])) { - return $this->issue_handlers[$issue_type]->getReportingLevelForFile($file_path); - } - - // this string is replaced by scoper for Phars, so be careful - $issue_class = 'Psalm\\Issue\\' . $issue_type; - - if (!class_exists($issue_class) || !is_a($issue_class, CodeIssue::class, true)) { - return self::REPORT_ERROR; - } - - /** @var int */ - $issue_level = $issue_class::ERROR_LEVEL; - - if ($issue_level > 0 && $issue_level < $this->level) { - return self::REPORT_INFO; - } - - return self::REPORT_ERROR; - } - - public function getReportingLevelForClass(string $issue_type, string $fq_classlike_name): ?string - { - if (isset($this->issue_handlers[$issue_type])) { - return $this->issue_handlers[$issue_type]->getReportingLevelForClass($fq_classlike_name); - } - - return null; - } - - public function getReportingLevelForMethod(string $issue_type, string $method_id): ?string - { - if (isset($this->issue_handlers[$issue_type])) { - return $this->issue_handlers[$issue_type]->getReportingLevelForMethod($method_id); - } - - return null; - } - - public function getReportingLevelForFunction(string $issue_type, string $function_id): ?string - { - $level = null; - if (isset($this->issue_handlers[$issue_type])) { - $level = $this->issue_handlers[$issue_type]->getReportingLevelForFunction($function_id); - - if ($level === null && $issue_type === 'UndefinedFunction') { - // undefined functions trigger global namespace fallback - // so we should also check reporting levels for the symbol in global scope - $root_function_id = preg_replace('/.*\\\/', '', $function_id); - if ($root_function_id !== $function_id) { - /** @psalm-suppress PossiblyUndefinedStringArrayOffset https://github.com/vimeo/psalm/issues/7656 */ - $level = $this->issue_handlers[$issue_type]->getReportingLevelForFunction($root_function_id); - } - } - } - - return $level; - } - - public function getReportingLevelForArgument(string $issue_type, string $function_id): ?string - { - if (isset($this->issue_handlers[$issue_type])) { - return $this->issue_handlers[$issue_type]->getReportingLevelForArgument($function_id); - } - - return null; - } - - public function getReportingLevelForProperty(string $issue_type, string $property_id): ?string - { - if (isset($this->issue_handlers[$issue_type])) { - return $this->issue_handlers[$issue_type]->getReportingLevelForProperty($property_id); - } - - return null; - } - - public function getReportingLevelForVariable(string $issue_type, string $var_name): ?string - { - if (isset($this->issue_handlers[$issue_type])) { - return $this->issue_handlers[$issue_type]->getReportingLevelForVariable($var_name); - } - - return null; - } - - /** - * @return array - */ - public function getProjectDirectories(): array - { - if (!$this->project_files) { - return []; - } - - return $this->project_files->getDirectories(); - } - - /** - * @return array - */ - public function getProjectFiles(): array - { - if (!$this->project_files) { - return []; - } - - return $this->project_files->getFiles(); - } - - /** - * @return array - */ - public function getExtraDirectories(): array - { - if (!$this->extra_files) { - return []; - } - - return $this->extra_files->getDirectories(); - } - - public function reportTypeStatsForFile(string $file_path): bool - { - return $this->project_files - && $this->project_files->allows($file_path) - && $this->project_files->reportTypeStats($file_path); - } - - public function useStrictTypesForFile(string $file_path): bool - { - return $this->project_files && $this->project_files->useStrictTypes($file_path); - } - - /** - * @return array - */ - public function getFileExtensions(): array - { - return $this->file_extensions; - } - - /** - * @return array> - */ - public function getFiletypeScanners(): array - { - return $this->filetype_scanners; - } - - /** - * @return array> - */ - public function getFiletypeAnalyzers(): array - { - return $this->filetype_analyzers; - } - - /** - * @return array - */ - public function getMockClasses(): array - { - return $this->mock_classes; - } - - public function visitPreloadedStubFiles(Codebase $codebase, ?Progress $progress = null): void - { - if ($progress === null) { - $progress = new VoidProgress(); - } - - $core_generic_files = []; - - if (PHP_VERSION_ID < 80000 && $codebase->php_major_version >= 8) { - $stringable_path = dirname(__DIR__, 2) . '/stubs/Php80.phpstub'; - - if (!file_exists($stringable_path)) { - throw new UnexpectedValueException('Cannot locate PHP 8.0 classes'); - } - - $core_generic_files[] = $stringable_path; - } - - if (PHP_VERSION_ID < 80100 && $codebase->php_major_version >= 8 && $codebase->php_minor_version >= 1) { - $stringable_path = dirname(__DIR__, 2) . '/stubs/Php81.phpstub'; - - if (!file_exists($stringable_path)) { - throw new UnexpectedValueException('Cannot locate PHP 8.1 classes'); - } - - $core_generic_files[] = $stringable_path; - } - - $stub_files = array_merge($core_generic_files, $this->preloaded_stub_files); - - if (!$stub_files) { - return; - } - - foreach ($stub_files as $file_path) { - $file_path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $file_path); - $codebase->scanner->addFileToDeepScan($file_path); - } - - $progress->debug('Registering preloaded stub files' . "\n"); - - $codebase->register_stub_files = true; - - $codebase->scanFiles(); - - $codebase->register_stub_files = false; - - $progress->debug('Finished registering preloaded stub files' . "\n"); - } - - public function visitStubFiles(Codebase $codebase, ?Progress $progress = null): void - { - if ($progress === null) { - $progress = new VoidProgress(); - } - - $codebase->register_stub_files = true; - - $dir_lvl_2 = dirname(__DIR__, 2); - $this->internal_stubs = [ - $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'CoreGenericFunctions.phpstub', - $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'CoreGenericClasses.phpstub', - $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'CoreGenericIterators.phpstub', - $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'CoreImmutableClasses.phpstub', - $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'DOM.phpstub', - $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'Reflection.phpstub', - $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'SPL.phpstub', - ]; - - if (PHP_VERSION_ID >= 80000 && $codebase->php_major_version >= 8) { - $stringable_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'Php80.phpstub'; - $this->internal_stubs[] = $stringable_path; - } - - if (PHP_VERSION_ID >= 80100 && $codebase->php_major_version >= 8 && $codebase->php_minor_version >= 1) { - $stringable_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'Php81.phpstub'; - $this->internal_stubs[] = $stringable_path; - } - - if (extension_loaded('PDO')) { - $ext_pdo_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'pdo.phpstub'; - $this->internal_stubs[] = $ext_pdo_path; - } - - if (extension_loaded('soap')) { - $ext_soap_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'soap.phpstub'; - $this->internal_stubs[] = $ext_soap_path; - } - - if (extension_loaded('ds')) { - $ext_ds_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'ext-ds.phpstub'; - $this->internal_stubs[] = $ext_ds_path; - } - - if (extension_loaded('mongodb')) { - $ext_mongodb_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'mongodb.phpstub'; - $this->internal_stubs[] = $ext_mongodb_path; - } - - if ($this->load_xdebug_stub) { - $xdebug_stub_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'Xdebug.phpstub'; - $this->internal_stubs[] = $xdebug_stub_path; - } - - if (extension_loaded('mysqli')) { - $ext_mysqli_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'mysqli.phpstub'; - $this->internal_stubs[] = $ext_mysqli_path; - } - - if (extension_loaded('decimal')) { - $ext_decimal_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'decimal.phpstub'; - $this->internal_stubs[] = $ext_decimal_path; - } - - // phpredis - if (extension_loaded('redis')) { - $ext_phpredis_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'phpredis.phpstub'; - $this->internal_stubs[] = $ext_phpredis_path; - } - - if (extension_loaded('apcu')) { - $ext_apcu_path = $dir_lvl_2 . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'ext-apcu.phpstub'; - $this->internal_stubs[] = $ext_apcu_path; - } - - foreach ($this->internal_stubs as $stub_path) { - if (!file_exists($stub_path)) { - throw new UnexpectedValueException('Cannot locate ' . $stub_path); - } - } - - $stub_files = array_merge($this->internal_stubs, $this->stub_files); - - $phpstorm_meta_path = $this->base_dir . DIRECTORY_SEPARATOR . '.phpstorm.meta.php'; - - if ($this->use_phpstorm_meta_path) { - if (is_file($phpstorm_meta_path)) { - $stub_files[] = $phpstorm_meta_path; - } elseif (is_dir($phpstorm_meta_path)) { - $phpstorm_meta_path = realpath($phpstorm_meta_path); - - foreach (glob($phpstorm_meta_path . '/*.meta.php', GLOB_NOSORT) as $glob) { - if (is_file($glob) && realpath(dirname($glob)) === $phpstorm_meta_path) { - $stub_files[] = $glob; - } - } - } - } - - foreach ($stub_files as $file_path) { - $file_path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $file_path); - $codebase->scanner->addFileToDeepScan($file_path); - } - - $progress->debug('Registering stub files' . "\n"); - - $codebase->scanFiles(); - - $progress->debug('Finished registering stub files' . "\n"); - - $codebase->register_stub_files = false; - } - - public function getCacheDirectory(): ?string - { - return $this->cache_directory; - } - - public function getGlobalCacheDirectory(): ?string - { - return $this->global_cache_directory; - } - - /** - * @return array - */ - public function getPredefinedConstants(): array - { - return $this->predefined_constants; - } - - public function collectPredefinedConstants(): void - { - $this->predefined_constants = get_defined_constants(); - } - - /** - * @return array - */ - public function getPredefinedFunctions(): array - { - return $this->predefined_functions; - } - - public function collectPredefinedFunctions(): void - { - $defined_functions = get_defined_functions(); - - if (isset($defined_functions['user'])) { - foreach ($defined_functions['user'] as $function_name) { - $this->predefined_functions[$function_name] = true; - } - } - - if (isset($defined_functions['internal'])) { - foreach ($defined_functions['internal'] as $function_name) { - $this->predefined_functions[$function_name] = true; - } - } - } - - public function setIncludeCollector(IncludeCollector $include_collector): void - { - $this->include_collector = $include_collector; - } - - public function visitComposerAutoloadFiles(ProjectAnalyzer $project_analyzer, ?Progress $progress = null): void - { - if ($progress === null) { - $progress = new VoidProgress(); - } - - if (!$this->include_collector) { - throw new LogicException("IncludeCollector should be set at this point"); - } - - $vendor_autoload_files_path - = $this->base_dir . DIRECTORY_SEPARATOR . 'vendor' - . DIRECTORY_SEPARATOR . 'composer' . DIRECTORY_SEPARATOR . 'autoload_files.php'; - - if (file_exists($vendor_autoload_files_path)) { - $this->include_collector->runAndCollect( - function () use ($vendor_autoload_files_path) { - /** - * @psalm-suppress UnresolvableInclude - * @var string[] - */ - return require $vendor_autoload_files_path; - } - ); - } - - $codebase = $project_analyzer->getCodebase(); - - $this->collectPredefinedFunctions(); - - if ($this->autoloader) { - // somee classes that we think are missing may not actually be missing - // as they might be autoloadable once we require the autoloader below - $codebase->classlikes->forgetMissingClassLikes(); - - $this->include_collector->runAndCollect( - function (): void { - // do this in a separate method so scope does not leak - /** @psalm-suppress UnresolvableInclude */ - require $this->autoloader; - } - ); - } - - $this->collectPredefinedConstants(); - - $autoload_included_files = $this->include_collector->getFilteredIncludedFiles(); - - if ($autoload_included_files) { - $codebase->register_autoload_files = true; - - $progress->debug('Registering autoloaded files' . "\n"); - foreach ($autoload_included_files as $file_path) { - $file_path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $file_path); - $progress->debug(' ' . $file_path . "\n"); - $codebase->scanner->addFileToDeepScan($file_path); - } - - $codebase->scanner->scanFiles($codebase->classlikes); - - $progress->debug('Finished registering autoloaded files' . "\n"); - - $codebase->register_autoload_files = false; - } - } - - /** - * @return string|false - */ - public function getComposerFilePathForClassLike(string $fq_classlike_name) - { - if (!$this->composer_class_loader) { - return false; - } - - return $this->composer_class_loader->findFile($fq_classlike_name); - } - - public function getPotentialComposerFilePathForClassLike(string $class): ?string - { - if (!$this->composer_class_loader) { - return null; - } - - $psr4_prefixes = $this->composer_class_loader->getPrefixesPsr4(); - - // PSR-4 lookup - $logicalPathPsr4 = str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php'; - - $candidate_path = null; - - $maxDepth = 0; - - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($psr4_prefixes[$search])) { - $depth = substr_count($search, '\\'); - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - - foreach ($psr4_prefixes[$search] as $dir) { - $dir = realpath($dir); - - if ($dir - && $depth > $maxDepth - && $this->isInProjectDirs($dir . DIRECTORY_SEPARATOR . 'testdummy.php') - ) { - $maxDepth = $depth; - $candidate_path = realpath($dir) . $pathEnd; - } - } - } - } - - return $candidate_path; - } - - public static function removeCacheDirectory(string $dir): void - { - clearstatcache(true, $dir); - if (is_dir($dir)) { - $objects = scandir($dir, SCANDIR_SORT_NONE); - - if ($objects === false) { - throw new UnexpectedValueException('Not expecting false here'); - } - - foreach ($objects as $object) { - if ($object === '.' || $object === '..') { - continue; - } - - // if it was deleted in the meantime/race condition with other psalm process - if (!file_exists($dir . '/' . $object)) { - continue; - } - - if (filetype($dir . '/' . $object) === 'dir') { - self::removeCacheDirectory($dir . '/' . $object); - } else { - unlink($dir . '/' . $object); - } - } - - reset($objects); - - // may have been removed in the meantime - clearstatcache(true, $dir); - if (is_dir($dir)) { - rmdir($dir); - } - } - } - - public function setServerMode(): void - { - $this->cache_directory .= '-s'; - } - - public function addStubFile(string $stub_file): void - { - $this->stub_files[$stub_file] = $stub_file; - } - - public function hasStubFile(string $stub_file): bool - { - return isset($this->stub_files[$stub_file]); - } - - /** - * @return array - */ - public function getStubFiles(): array - { - return $this->stub_files; - } - - public function addPreloadedStubFile(string $stub_file): void - { - $this->preloaded_stub_files[$stub_file] = $stub_file; - } - - public function getPhpVersion(): ?string - { - return $this->getPhpVersionFromConfig() ?? $this->getPHPVersionFromComposerJson(); - } - - public function getPhpVersionFromConfig(): ?string - { - return $this->configured_php_version; - } - - private function setBooleanAttribute(string $name, bool $value): void - { - $this->$name = $value; - } - - /** - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArrayAccess - */ - public function getPHPVersionFromComposerJson(): ?string - { - $composer_json_path = Composer::getJsonFilePath($this->base_dir); - - if (file_exists($composer_json_path)) { - if (!$composer_json = json_decode(file_get_contents($composer_json_path), true)) { - throw new UnexpectedValueException('Invalid composer.json at ' . $composer_json_path); - } - $php_version = $composer_json['require']['php'] ?? null; - - if (is_string($php_version)) { - $version_parser = new VersionParser(); - - $constraint = $version_parser->parseConstraints($php_version); - - foreach (['5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1'] as $candidate) { - if ($constraint->matches(new Constraint('<=', "$candidate.0.0-dev")) - || $constraint->matches(new Constraint('<=', "$candidate.999")) - ) { - return $candidate; - } - } - } - } - - return null; - } - - public function addUniversalObjectCrate(string $class): void - { - if (!class_exists($class)) { - throw new UnexpectedValueException($class . ' is not a known class'); - } - $this->universal_object_crates[] = $class; - } - - /** - * @return array - */ - public function getUniversalObjectCrates(): array - { - return array_map('strtolower', $this->universal_object_crates); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/Creator.php b/vendor/vimeo/psalm/src/Psalm/Config/Creator.php deleted file mode 100644 index f67eb5cf..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Config/Creator.php +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - - - - -'; - - /** - * @return non-empty-string - */ - public static function getContents( - string $current_dir, - ?string $suggested_dir, - int $level, - string $vendor_dir - ): string { - $paths = self::getPaths($current_dir, $suggested_dir); - - $template = str_replace( - '', - implode("\n ", $paths), - self::TEMPLATE - ); - - if (is_dir($current_dir . DIRECTORY_SEPARATOR . $vendor_dir)) { - $template = str_replace( - '', - '', - $template - ); - } else { - $template = str_replace( - '', - '', - $template - ); - } - - /** @var non-empty-string */ - return str_replace( - 'errorLevel="1"', - 'errorLevel="' . $level . '"', - $template - ); - } - - public static function createBareConfig( - string $current_dir, - ?string $suggested_dir, - string $vendor_dir - ): Config { - $config_contents = self::getContents($current_dir, $suggested_dir, 1, $vendor_dir); - - return Config::loadFromXML($current_dir, $config_contents); - } - - /** - * @param array $issues - */ - public static function getLevel(array $issues, int $counted_types): int - { - if ($counted_types === 0) { - $counted_types = 1; - } - - $issues_at_level = []; - - foreach ($issues as $issue) { - $issue_type = $issue->type; - $issue_level = $issue->error_level; - - if ($issue_level < 1) { - continue; - } - - // exclude some directories that are probably ignorable - if (strpos($issue->file_path, 'vendor') || strpos($issue->file_path, 'stub')) { - continue; - } - - if (!isset($issues_at_level[$issue_level][$issue_type])) { - $issues_at_level[$issue_level][$issue_type] = 0; - } - - $issues_at_level[$issue_level][$issue_type] += 100/$counted_types; - } - - foreach ($issues_at_level as $level => $issues) { - ksort($issues); - - // remove any issues where < 0.1% of expressions are affected - $filtered_issues = array_filter( - $issues, - function ($amount): bool { - return $amount > 0.1; - } - ); - - if (array_sum($filtered_issues) > 0.5) { - $issues_at_level[$level] = $filtered_issues; - } else { - unset($issues_at_level[$level]); - } - } - - if (!$issues_at_level) { - return 1; - } - - if (count($issues_at_level) === 1) { - return array_keys($issues_at_level)[0] + 1; - } - - return max(...array_keys($issues_at_level)) + 1; - } - - /** - * @return non-empty-list - */ - public static function getPaths(string $current_dir, ?string $suggested_dir): array - { - $replacements = []; - - if ($suggested_dir) { - if (is_dir($current_dir . DIRECTORY_SEPARATOR . $suggested_dir)) { - $replacements[] = ''; - } else { - $bad_dir_path = $current_dir . DIRECTORY_SEPARATOR . $suggested_dir; - - throw new ConfigCreationException( - 'The given path "' . $bad_dir_path . '" does not appear to be a directory' - ); - } - } elseif (is_dir($current_dir . DIRECTORY_SEPARATOR . 'src')) { - $replacements[] = ''; - } else { - $composer_json_location = Composer::getJsonFilePath($current_dir); - - if (!file_exists($composer_json_location)) { - throw new ConfigCreationException( - 'Problem during config autodiscovery - could not find composer.json during initialization.' - ); - } - - if (!$composer_json = json_decode(file_get_contents($composer_json_location), true)) { - throw new ConfigCreationException('Invalid composer.json at ' . $composer_json_location); - } - - if (!is_array($composer_json)) { - throw new ConfigCreationException('Invalid composer.json at ' . $composer_json_location); - } - - $replacements = self::getPsr4Or0Paths($current_dir, $composer_json); - - if (!$replacements) { - throw new ConfigCreationException( - 'Could not located any PSR-0 or PSR-4-compatible paths in ' . $composer_json_location - ); - } - } - - return $replacements; - } - - /** - * @return list - * @psalm-suppress MixedAssignment - * @psalm-suppress MixedArgument - */ - private static function getPsr4Or0Paths(string $current_dir, array $composer_json): array - { - $psr_paths = array_merge( - $composer_json['autoload']['psr-4'] ?? [], - $composer_json['autoload']['psr-0'] ?? [] - ); - - if (!$psr_paths) { - return self::guessPhpFileDirs($current_dir); - } - - $nodes = []; - - foreach ($psr_paths as $paths) { - if (!is_array($paths)) { - $paths = [$paths]; - } - - foreach ($paths as $path) { - if ($path === '') { - $nodes = array_merge( - $nodes, - self::guessPhpFileDirs($current_dir) - ); - - continue; - } - - $path = preg_replace('@[\\\\/]$@', '', $path); - - if ($path !== 'tests') { - $nodes[] = ''; - } - } - } - - $nodes = array_unique($nodes); - - sort($nodes); - - return $nodes; - } - - /** - * @return list - */ - private static function guessPhpFileDirs(string $current_dir): array - { - $nodes = []; - - /** @var string[] */ - $php_files = array_merge( - glob($current_dir . DIRECTORY_SEPARATOR . '*.php', GLOB_NOSORT), - glob($current_dir . DIRECTORY_SEPARATOR . '**/*.php', GLOB_NOSORT), - glob($current_dir . DIRECTORY_SEPARATOR . '**/**/*.php', GLOB_NOSORT) - ); - - foreach ($php_files as $php_file) { - $php_file = str_replace($current_dir . DIRECTORY_SEPARATOR, '', $php_file); - - $parts = explode(DIRECTORY_SEPARATOR, $php_file); - - if (!$parts[0]) { - array_shift($parts); - } - - if ($parts[0] === 'vendor' || $parts[0] === 'tests') { - continue; - } - - if (count($parts) === 1) { - $nodes[] = ''; - } else { - $nodes[] = ''; - } - } - - return array_values(array_unique($nodes)); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php b/vendor/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php deleted file mode 100644 index 7d226a21..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php +++ /dev/null @@ -1,68 +0,0 @@ -error_level = (string) $config['type']; - - if (!in_array($filter->error_level, Config::$ERROR_LEVELS, true)) { - throw new ConfigException('Unexpected error level ' . $filter->error_level); - } - } else { - throw new ConfigException(' element expects a level'); - } - - return $filter; - } - - /** - * @return static - */ - public static function loadFromXMLElement( - SimpleXMLElement $e, - string $base_dir, - bool $inclusive - ): ErrorLevelFileFilter { - $filter = parent::loadFromXMLElement($e, $base_dir, $inclusive); - - if (isset($e['type'])) { - $filter->error_level = (string) $e['type']; - - if (!in_array($filter->error_level, Config::$ERROR_LEVELS, true)) { - throw new ConfigException('Unexpected error level ' . $filter->error_level); - } - } else { - throw new ConfigException(' element expects a level'); - } - - return $filter; - } - - public function getErrorLevel(): string - { - return $this->error_level; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/FileFilter.php b/vendor/vimeo/psalm/src/Psalm/Config/FileFilter.php deleted file mode 100644 index 76f53d6b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Config/FileFilter.php +++ /dev/null @@ -1,559 +0,0 @@ - - */ - protected $directories = []; - - /** - * @var array - */ - protected $files = []; - - /** - * @var array - */ - protected $fq_classlike_names = []; - - /** - * @var array - */ - protected $fq_classlike_patterns = []; - - /** - * @var array - */ - protected $method_ids = []; - - /** - * @var array - */ - protected $property_ids = []; - - /** - * @var array - */ - protected $var_names = []; - - /** - * @var array - */ - protected $files_lowercase = []; - - /** - * @var bool - */ - protected $inclusive; - - /** - * @var array - */ - protected $ignore_type_stats = []; - - /** - * @var array - */ - protected $declare_strict_types = []; - - public function __construct(bool $inclusive) - { - $this->inclusive = $inclusive; - } - - /** - * @return static - */ - public static function loadFromArray( - array $config, - string $base_dir, - bool $inclusive - ) { - $allow_missing_files = ($config['allowMissingFiles'] ?? false) === true; - - $filter = new static($inclusive); - - if (isset($config['directory']) && is_iterable($config['directory'])) { - /** @var array $directory */ - foreach ($config['directory'] as $directory) { - $directory_path = (string) ($directory['name'] ?? ''); - $ignore_type_stats = (bool) ($directory['ignoreTypeStats'] ?? false); - $declare_strict_types = (bool) ($directory['useStrictTypes'] ?? false); - - if ($directory_path[0] === '/' && DIRECTORY_SEPARATOR === '/') { - $prospective_directory_path = $directory_path; - } else { - $prospective_directory_path = $base_dir . DIRECTORY_SEPARATOR . $directory_path; - } - - if (strpos($prospective_directory_path, '*') !== false) { - $globs = array_map( - 'realpath', - glob($prospective_directory_path, GLOB_ONLYDIR) - ); - - if (empty($globs)) { - if ($allow_missing_files) { - continue; - } - - throw new ConfigException( - 'Could not resolve config path to ' . $base_dir - . DIRECTORY_SEPARATOR . $directory_path - ); - } - - foreach ($globs as $glob_index => $directory_path) { - if (!$directory_path) { - if ($allow_missing_files) { - continue; - } - - throw new ConfigException( - 'Could not resolve config path to ' . $base_dir - . DIRECTORY_SEPARATOR . $directory_path . ':' . $glob_index - ); - } - - if ($ignore_type_stats && $filter instanceof ProjectFileFilter) { - $filter->ignore_type_stats[$directory_path] = true; - } - - if ($declare_strict_types && $filter instanceof ProjectFileFilter) { - $filter->declare_strict_types[$directory_path] = true; - } - - $filter->addDirectory($directory_path); - } - continue; - } - - $directory_path = realpath($prospective_directory_path); - - if (!$directory_path) { - if ($allow_missing_files) { - continue; - } - - throw new ConfigException( - 'Could not resolve config path to ' . $prospective_directory_path - ); - } - - if (!is_dir($directory_path)) { - throw new ConfigException( - $base_dir . DIRECTORY_SEPARATOR . $directory_path - . ' is not a directory' - ); - } - - /** @var RecursiveDirectoryIterator */ - $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory_path)); - $iterator->rewind(); - - while ($iterator->valid()) { - if (!$iterator->isDot() && $iterator->isLink()) { - $linked_path = readlink($iterator->getPathname()); - - if (stripos($linked_path, $directory_path) !== 0) { - if ($ignore_type_stats && $filter instanceof ProjectFileFilter) { - $filter->ignore_type_stats[$directory_path] = true; - } - - if ($declare_strict_types && $filter instanceof ProjectFileFilter) { - $filter->declare_strict_types[$directory_path] = true; - } - - if (is_dir($linked_path)) { - $filter->addDirectory($linked_path); - } - } - } - - $iterator->next(); - } - - if ($ignore_type_stats && $filter instanceof ProjectFileFilter) { - $filter->ignore_type_stats[$directory_path] = true; - } - - if ($declare_strict_types && $filter instanceof ProjectFileFilter) { - $filter->declare_strict_types[$directory_path] = true; - } - - $filter->addDirectory($directory_path); - } - } - - if (isset($config['file']) && is_iterable($config['file'])) { - /** @var array $file */ - foreach ($config['file'] as $file) { - $file_path = (string) ($file['name'] ?? ''); - - if ($file_path[0] === '/' && DIRECTORY_SEPARATOR === '/') { - $prospective_file_path = $file_path; - } else { - $prospective_file_path = $base_dir . DIRECTORY_SEPARATOR . $file_path; - } - - if (strpos($prospective_file_path, '*') !== false) { - $globs = array_map( - 'realpath', - array_filter( - glob($prospective_file_path, GLOB_NOSORT), - 'file_exists' - ) - ); - - if (empty($globs)) { - if ($allow_missing_files) { - continue; - } - - throw new ConfigException( - 'Could not resolve config path to ' . $base_dir . DIRECTORY_SEPARATOR . - $file_path - ); - } - - foreach ($globs as $glob_index => $file_path) { - if (!$file_path && !$allow_missing_files) { - throw new ConfigException( - 'Could not resolve config path to ' . $base_dir . DIRECTORY_SEPARATOR . - $file_path . ':' . $glob_index - ); - } - $filter->addFile($file_path); - } - continue; - } - - $file_path = realpath($prospective_file_path); - - if (!$file_path && !$allow_missing_files) { - throw new ConfigException( - 'Could not resolve config path to ' . $prospective_file_path - ); - } - - $filter->addFile($file_path); - } - } - - if (isset($config['referencedClass']) && is_iterable($config['referencedClass'])) { - /** @var array $referenced_class */ - foreach ($config['referencedClass'] as $referenced_class) { - $class_name = strtolower((string) ($referenced_class['name'] ?? '')); - - if (strpos($class_name, '*') !== false) { - $regex = '/' . str_replace('*', '.*', str_replace('\\', '\\\\', $class_name)) . '/i'; - $filter->fq_classlike_patterns[] = $regex; - } else { - $filter->fq_classlike_names[] = $class_name; - } - } - } - - if (isset($config['referencedMethod']) && is_iterable($config['referencedMethod'])) { - /** @var array $referenced_method */ - foreach ($config['referencedMethod'] as $referenced_method) { - $method_id = (string) ($referenced_method['name'] ?? ''); - - if (!preg_match('/^[^:]+::[^:]+$/', $method_id) && !static::isRegularExpression($method_id)) { - throw new ConfigException( - 'Invalid referencedMethod ' . $method_id - ); - } - - $filter->method_ids[] = strtolower($method_id); - } - } - - if (isset($config['referencedFunction']) && is_iterable($config['referencedFunction'])) { - /** @var array $referenced_function */ - foreach ($config['referencedFunction'] as $referenced_function) { - $filter->method_ids[] = strtolower((string) ($referenced_function['name'] ?? '')); - } - } - - if (isset($config['referencedProperty']) && is_iterable($config['referencedProperty'])) { - /** @var array $referenced_property */ - foreach ($config['referencedProperty'] as $referenced_property) { - $filter->property_ids[] = strtolower((string) ($referenced_property['name'] ?? '')); - } - } - - if (isset($config['referencedVariable']) && is_iterable($config['referencedVariable'])) { - /** @var array $referenced_variable */ - foreach ($config['referencedVariable'] as $referenced_variable) { - $filter->var_names[] = strtolower((string) ($referenced_variable['name'] ?? '')); - } - } - - return $filter; - } - - /** - * @return static - */ - public static function loadFromXMLElement( - SimpleXMLElement $e, - string $base_dir, - bool $inclusive - ) { - $config = []; - $config['allowMissingFiles'] = ((string) $e['allowMissingFiles']) === 'true'; - - if ($e->directory) { - $config['directory'] = []; - /** @var SimpleXMLElement $directory */ - foreach ($e->directory as $directory) { - $config['directory'][] = [ - 'name' => (string) $directory['name'], - 'ignoreTypeStats' => strtolower((string) ($directory['ignoreTypeStats'] ?? '')) === 'true', - 'useStrictTypes' => strtolower((string) ($directory['useStrictTypes'] ?? '')) === 'true', - ]; - } - } - - if ($e->file) { - $config['file'] = []; - /** @var SimpleXMLElement $file */ - foreach ($e->file as $file) { - $config['file'][]['name'] = (string) $file['name']; - } - } - - if ($e->referencedClass) { - $config['referencedClass'] = []; - /** @var SimpleXMLElement $referenced_class */ - foreach ($e->referencedClass as $referenced_class) { - $config['referencedClass'][]['name'] = strtolower((string)$referenced_class['name']); - } - } - - if ($e->referencedMethod) { - $config['referencedMethod'] = []; - /** @var SimpleXMLElement $referenced_method */ - foreach ($e->referencedMethod as $referenced_method) { - $config['referencedMethod'][]['name'] = (string)$referenced_method['name']; - } - } - - if ($e->referencedFunction) { - $config['referencedFunction'] = []; - /** @var SimpleXMLElement $referenced_function */ - foreach ($e->referencedFunction as $referenced_function) { - $config['referencedFunction'][]['name'] = strtolower((string)$referenced_function['name']); - } - } - - if ($e->referencedProperty) { - $config['referencedProperty'] = []; - /** @var SimpleXMLElement $referenced_property */ - foreach ($e->referencedProperty as $referenced_property) { - $config['referencedProperty'][]['name'] = strtolower((string)$referenced_property['name']); - } - } - - if ($e->referencedVariable) { - $config['referencedVariable'] = []; - - /** @var SimpleXMLElement $referenced_variable */ - foreach ($e->referencedVariable as $referenced_variable) { - $config['referencedVariable'][]['name'] = strtolower((string)$referenced_variable['name']); - } - } - - return self::loadFromArray($config, $base_dir, $inclusive); - } - - private static function isRegularExpression(string $string): bool - { - set_error_handler( - function (): bool { - return false; - }, - E_WARNING - ); - $is_regexp = preg_match($string, '') !== false; - restore_error_handler(); - - return $is_regexp; - } - - /** - * @psalm-pure - */ - protected static function slashify(string $str): string - { - return preg_replace('/\/?$/', DIRECTORY_SEPARATOR, $str); - } - - public function allows(string $file_name, bool $case_sensitive = false): bool - { - if ($this->inclusive) { - foreach ($this->directories as $include_dir) { - if ($case_sensitive) { - if (strpos($file_name, $include_dir) === 0) { - return true; - } - } else { - if (stripos($file_name, $include_dir) === 0) { - return true; - } - } - } - - if ($case_sensitive) { - if (in_array($file_name, $this->files, true)) { - return true; - } - } else { - if (in_array(strtolower($file_name), $this->files_lowercase, true)) { - return true; - } - } - - return false; - } - - // exclusive - foreach ($this->directories as $exclude_dir) { - if ($case_sensitive) { - if (strpos($file_name, $exclude_dir) === 0) { - return false; - } - } else { - if (stripos($file_name, $exclude_dir) === 0) { - return false; - } - } - } - - if ($case_sensitive) { - if (in_array($file_name, $this->files, true)) { - return false; - } - } else { - if (in_array(strtolower($file_name), $this->files_lowercase, true)) { - return false; - } - } - - return true; - } - - public function allowsClass(string $fq_classlike_name): bool - { - if ($this->fq_classlike_patterns) { - foreach ($this->fq_classlike_patterns as $pattern) { - if (preg_match($pattern, $fq_classlike_name)) { - return true; - } - } - } - - return in_array(strtolower($fq_classlike_name), $this->fq_classlike_names, true); - } - - public function allowsMethod(string $method_id): bool - { - if (!$this->method_ids) { - return false; - } - - if (preg_match('/^[^:]+::[^:]+$/', $method_id)) { - $method_stub = '*::' . explode('::', $method_id)[1]; - - foreach ($this->method_ids as $config_method_id) { - if ($config_method_id === $method_id) { - return true; - } - - if ($config_method_id === $method_stub) { - return true; - } - - if ($config_method_id[0] === '/' && preg_match($config_method_id, $method_id)) { - return true; - } - } - - return false; - } - - return in_array($method_id, $this->method_ids, true); - } - - public function allowsProperty(string $property_id): bool - { - return in_array(strtolower($property_id), $this->property_ids, true); - } - - public function allowsVariable(string $var_name): bool - { - return in_array(strtolower($var_name), $this->var_names, true); - } - - /** - * @return array - */ - public function getDirectories(): array - { - return $this->directories; - } - - /** - * @return array - */ - public function getFiles(): array - { - return $this->files; - } - - public function addFile(string $file_name): void - { - $this->files[] = $file_name; - $this->files_lowercase[] = strtolower($file_name); - } - - public function addDirectory(string $dir_name): void - { - $this->directories[] = self::slashify($dir_name); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/IssueHandler.php b/vendor/vimeo/psalm/src/Psalm/Config/IssueHandler.php deleted file mode 100644 index cdc2c288..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Config/IssueHandler.php +++ /dev/null @@ -1,174 +0,0 @@ - - */ - private $custom_levels = []; - - public static function loadFromXMLElement(SimpleXMLElement $e, string $base_dir): IssueHandler - { - $handler = new self(); - - if (isset($e['errorLevel'])) { - $handler->error_level = (string) $e['errorLevel']; - - if (!in_array($handler->error_level, Config::$ERROR_LEVELS, true)) { - throw new ConfigException('Unexpected error level ' . $handler->error_level); - } - } - - /** @var SimpleXMLElement $error_level */ - foreach ($e->errorLevel as $error_level) { - $handler->custom_levels[] = ErrorLevelFileFilter::loadFromXMLElement($error_level, $base_dir, true); - } - - return $handler; - } - - public function setCustomLevels(array $customLevels, string $base_dir): void - { - /** @var array $customLevel */ - foreach ($customLevels as $customLevel) { - $this->custom_levels[] = ErrorLevelFileFilter::loadFromArray($customLevel, $base_dir, true); - } - } - - public function setErrorLevel(string $error_level): void - { - if (!in_array($error_level, Config::$ERROR_LEVELS, true)) { - throw new ConfigException('Unexpected error level ' . $error_level); - } - - $this->error_level = $error_level; - } - - public function getReportingLevelForFile(string $file_path): string - { - foreach ($this->custom_levels as $custom_level) { - if ($custom_level->allows($file_path)) { - return $custom_level->getErrorLevel(); - } - } - - return $this->error_level; - } - - public function getReportingLevelForClass(string $fq_classlike_name): ?string - { - foreach ($this->custom_levels as $custom_level) { - if ($custom_level->allowsClass($fq_classlike_name)) { - return $custom_level->getErrorLevel(); - } - } - - return null; - } - - public function getReportingLevelForMethod(string $method_id): ?string - { - foreach ($this->custom_levels as $custom_level) { - if ($custom_level->allowsMethod(strtolower($method_id))) { - return $custom_level->getErrorLevel(); - } - } - - return null; - } - - public function getReportingLevelForFunction(string $function_id): ?string - { - foreach ($this->custom_levels as $custom_level) { - if ($custom_level->allowsMethod(strtolower($function_id))) { - return $custom_level->getErrorLevel(); - } - } - - return null; - } - - public function getReportingLevelForArgument(string $function_id): ?string - { - foreach ($this->custom_levels as $custom_level) { - if ($custom_level->allowsMethod(strtolower($function_id))) { - return $custom_level->getErrorLevel(); - } - } - - return null; - } - - public function getReportingLevelForProperty(string $property_id): ?string - { - foreach ($this->custom_levels as $custom_level) { - if ($custom_level->allowsProperty($property_id)) { - return $custom_level->getErrorLevel(); - } - } - - return null; - } - - public function getReportingLevelForVariable(string $var_name): ?string - { - foreach ($this->custom_levels as $custom_level) { - if ($custom_level->allowsVariable($var_name)) { - return $custom_level->getErrorLevel(); - } - } - - return null; - } - - /** - * @return array - */ - public static function getAllIssueTypes(): array - { - return array_filter( - array_map( - function (string $file_name): string { - return substr($file_name, 0, -4); - }, - scandir(dirname(__DIR__) . '/Issue', SCANDIR_SORT_NONE) - ), - function (string $issue_name): bool { - return $issue_name !== '' - && $issue_name !== 'MethodIssue' - && $issue_name !== 'PropertyIssue' - && $issue_name !== 'FunctionIssue' - && $issue_name !== 'ArgumentIssue' - && $issue_name !== 'VariableIssue' - && $issue_name !== 'ClassIssue' - && $issue_name !== 'CodeIssue' - && $issue_name !== 'PsalmInternalError' - && $issue_name !== 'ParseError' - && $issue_name !== 'PluginIssue' - && $issue_name !== 'MixedIssue' - && $issue_name !== 'MixedIssueTrait'; - } - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php b/vendor/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php deleted file mode 100644 index 9afa3d6b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php +++ /dev/null @@ -1,95 +0,0 @@ -ignoreFiles)) { - if (!$inclusive) { - throw new ConfigException('Cannot nest ignoreFiles inside itself'); - } - - /** @var SimpleXMLElement $e->ignoreFiles */ - $filter->file_filter = static::loadFromXMLElement($e->ignoreFiles, $base_dir, false); - } - - return $filter; - } - - public function allows(string $file_name, bool $case_sensitive = false): bool - { - if ($this->inclusive && $this->file_filter) { - if (!$this->file_filter->allows($file_name, $case_sensitive)) { - return false; - } - } - - return parent::allows($file_name, $case_sensitive); - } - - public function forbids(string $file_name, bool $case_sensitive = false): bool - { - if ($this->inclusive && $this->file_filter) { - if (!$this->file_filter->allows($file_name, $case_sensitive)) { - return true; - } - } - - return false; - } - - public function reportTypeStats(string $file_name, bool $case_sensitive = false): bool - { - foreach ($this->ignore_type_stats as $exclude_dir => $_) { - if ($case_sensitive) { - if (strpos($file_name, $exclude_dir) === 0) { - return false; - } - } else { - if (stripos($file_name, $exclude_dir) === 0) { - return false; - } - } - } - - return true; - } - - public function useStrictTypes(string $file_name, bool $case_sensitive = false): bool - { - foreach ($this->declare_strict_types as $exclude_dir => $_) { - if ($case_sensitive) { - if (strpos($file_name, $exclude_dir) === 0) { - return true; - } - } else { - if (stripos($file_name, $exclude_dir) === 0) { - return true; - } - } - } - - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php b/vendor/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php deleted file mode 100644 index 61a9d0fe..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php +++ /dev/null @@ -1,7 +0,0 @@ - - */ - public $vars_in_scope = []; - - /** - * @var array - */ - public $vars_possibly_in_scope = []; - - /** - * Whether or not we're inside the conditional of an if/where etc. - * - * This changes whether or not the context is cloned - * - * @var bool - */ - public $inside_conditional = false; - - /** - * Whether or not we're inside an isset call - * - * Inside issets Psalm is more lenient about certain things - * - * @var bool - */ - public $inside_isset = false; - - /** - * Whether or not we're inside an unset call, where - * we don't care about possibly undefined variables - * - * @var bool - */ - public $inside_unset = false; - - /** - * Whether or not we're inside an class_exists call, where - * we don't care about possibly undefined classes - * - * @var bool - */ - public $inside_class_exists = false; - - /** - * Whether or not we're inside a function/method call - * - * @var bool - */ - public $inside_call = false; - - /** - * Whether or not we're inside any other situation that treats a variable as used - * - * @var bool - */ - public $inside_general_use = false; - - /** - * Whether or not we're inside a return expression - * - * @var bool - */ - public $inside_return = false; - - /** - * Whether or not we're inside a throw - * - * @var bool - */ - public $inside_throw = false; - - /** - * Whether or not we're inside an assignment - * - * @var bool - */ - public $inside_assignment = false; - - /** - * Whether or not we're inside a try block. - * - * @var bool - */ - public $inside_try = false; - - /** - * @var null|CodeLocation - */ - public $include_location; - - /** - * @var string|null - * The name of the current class. Null if outside a class. - */ - public $self; - - /** - * @var string|null - */ - public $parent; - - /** - * @var bool - */ - public $check_classes = true; - - /** - * @var bool - */ - public $check_variables = true; - - /** - * @var bool - */ - public $check_methods = true; - - /** - * @var bool - */ - public $check_consts = true; - - /** - * @var bool - */ - public $check_functions = true; - - /** - * A list of classes checked with class_exists - * - * @var array - */ - public $phantom_classes = []; - - /** - * A list of files checked with file_exists - * - * @var array - */ - public $phantom_files = []; - - /** - * A list of clauses in Conjunctive Normal Form - * - * @var list - */ - public $clauses = []; - - /** - * A list of hashed clauses that have already been factored in - * - * @var list - */ - public $reconciled_expression_clauses = []; - - /** - * Whether or not to do a deep analysis and collect mutations to this context - * - * @var bool - */ - public $collect_mutations = false; - - /** - * Whether or not to do a deep analysis and collect initializations from private or final methods - * - * @var bool - */ - public $collect_initializations = false; - - /** - * Whether or not to do a deep analysis and collect initializations from public non-final methods - * - * @var bool - */ - public $collect_nonprivate_initializations = false; - - /** - * Stored to prevent re-analysing methods when checking for initialised properties - * - * @var array|null - */ - public $initialized_methods; - - /** - * @var array - */ - public $constants = []; - - /** - * Whether or not to track exceptions - * - * @var bool - */ - public $collect_exceptions = false; - - /** - * A list of variables that have been referenced - * - * @var array - */ - public $referenced_var_ids = []; - - /** - * A list of variables that have been passed by reference (where we know their type) - * - * @var array - */ - public $byref_constraints = []; - - /** - * If this context inherits from a context, it is here - * - * @var Context|null - */ - public $parent_context; - - /** - * A list of vars that have been assigned to - * - * @var array - */ - public $assigned_var_ids = []; - - /** - * A list of vars that have been may have been assigned to - * - * @var array - */ - public $possibly_assigned_var_ids = []; - - /** - * A list of classes or interfaces that may have been thrown - * - * @var array> - */ - public $possibly_thrown_exceptions = []; - - /** - * @var bool - */ - public $is_global = false; - - /** - * @var array - */ - public $protected_var_ids = []; - - /** - * If we've branched from the main scope, a byte offset for where that branch happened - * - * @var int|null - */ - public $branch_point; - - /** - * What does break mean in this context? - * - * 'loop' means we're breaking out of a loop, - * 'switch' means we're breaking out of a switch - * - * @var list<'loop'|'switch'> - */ - public $break_types = []; - - /** - * @var bool - */ - public $inside_loop = false; - - /** - * @var LoopScope|null - */ - public $loop_scope; - - /** - * @var CaseScope|null - */ - public $case_scope; - - /** - * @var FinallyScope|null - */ - public $finally_scope; - - /** - * @var Context|null - */ - public $if_context; - - /** - * @var IfScope|null - */ - public $if_scope; - - /** - * @var bool - */ - public $strict_types = false; - - /** - * @var string|null - */ - public $calling_function_id; - - /** - * @var lowercase-string|null - */ - public $calling_method_id; - - /** - * @var bool - */ - public $inside_negation = false; - - /** - * @var bool - */ - public $ignore_variable_property = false; - - /** - * @var bool - */ - public $ignore_variable_method = false; - - /** - * @var bool - */ - public $pure = false; - - /** - * @var bool - * Set by @psalm-immutable - */ - public $mutation_free = false; - - /** - * @var bool - * Set by @psalm-external-mutation-free - */ - public $external_mutation_free = false; - - /** - * @var bool - */ - public $error_suppressing = false; - - /** - * @var bool - */ - public $has_returned = false; - - /** - * @var array - */ - public $vars_from_global = []; - - public function __construct(?string $self = null) - { - $this->self = $self; - } - - public function __destruct() - { - $this->case_scope = null; - $this->parent_context = null; - } - - public function __clone() - { - foreach ($this->clauses as &$clause) { - $clause = clone $clause; - } - - foreach ($this->constants as &$constant) { - $constant = clone $constant; - } - } - - /** - * Updates the parent context, looking at the changes within a block and then applying those changes, where - * necessary, to the parent context - * - * @param bool $has_leaving_statements whether or not the parent scope is abandoned between - * $start_context and $end_context - * @param array $updated_vars - * - */ - public function update( - Context $start_context, - Context $end_context, - bool $has_leaving_statements, - array $vars_to_update, - array &$updated_vars - ): void { - foreach ($start_context->vars_in_scope as $var_id => $old_type) { - // this is only true if there was some sort of type negation - if (in_array($var_id, $vars_to_update, true)) { - // if we're leaving, we're effectively deleting the possibility of the if types - $new_type = !$has_leaving_statements && $end_context->hasVariable($var_id) - ? $end_context->vars_in_scope[$var_id] - : null; - - $existing_type = $this->vars_in_scope[$var_id] ?? null; - - if (!$existing_type) { - if ($new_type) { - $this->vars_in_scope[$var_id] = clone $new_type; - $updated_vars[$var_id] = true; - } - - continue; - } - - $existing_type = clone $existing_type; - - // if the type changed within the block of statements, process the replacement - // also never allow ourselves to remove all types from a union - if ((!$new_type || !$old_type->equals($new_type)) - && ($new_type || count($existing_type->getAtomicTypes()) > 1) - ) { - $existing_type->substitute($old_type, $new_type); - - if ($new_type && $new_type->from_docblock) { - $existing_type->setFromDocblock(); - } - - $updated_vars[$var_id] = true; - } - - $this->vars_in_scope[$var_id] = $existing_type; - } - } - } - - /** - * @param array $new_vars_in_scope - * - * @return array - */ - public function getRedefinedVars(array $new_vars_in_scope, bool $include_new_vars = false): array - { - $redefined_vars = []; - - foreach ($this->vars_in_scope as $var_id => $this_type) { - if (!isset($new_vars_in_scope[$var_id])) { - if ($include_new_vars) { - $redefined_vars[$var_id] = $this_type; - } - continue; - } - - $new_type = $new_vars_in_scope[$var_id]; - - if (!$this_type->equals($new_type)) { - $redefined_vars[$var_id] = $this_type; - } - } - - return $redefined_vars; - } - - /** - * @return list - */ - public static function getNewOrUpdatedVarIds(Context $original_context, Context $new_context): array - { - $redefined_var_ids = []; - - foreach ($new_context->vars_in_scope as $var_id => $context_type) { - if (!isset($original_context->vars_in_scope[$var_id]) - || ($original_context->assigned_var_ids[$var_id] ?? 0) - !== ($new_context->assigned_var_ids[$var_id] ?? 0) - || !$original_context->vars_in_scope[$var_id]->equals($context_type) - ) { - $redefined_var_ids[] = $var_id; - } - } - - return $redefined_var_ids; - } - - public function remove(string $remove_var_id): void - { - unset( - $this->referenced_var_ids[$remove_var_id], - $this->vars_possibly_in_scope[$remove_var_id] - ); - - if (isset($this->vars_in_scope[$remove_var_id])) { - $existing_type = $this->vars_in_scope[$remove_var_id]; - unset($this->vars_in_scope[$remove_var_id]); - - $this->removeDescendents($remove_var_id, $existing_type); - } - } - - /** - * @param Clause[] $clauses - * @param array $changed_var_ids - * - * @return array{list, list} - * - * @psalm-pure - */ - public static function removeReconciledClauses(array $clauses, array $changed_var_ids): array - { - $included_clauses = []; - $rejected_clauses = []; - - foreach ($clauses as $c) { - if ($c->wedge) { - $included_clauses[] = $c; - continue; - } - - foreach ($c->possibilities as $key => $_) { - if (isset($changed_var_ids[$key])) { - $rejected_clauses[] = $c; - continue 2; - } - } - - $included_clauses[] = $c; - } - - return [$included_clauses, $rejected_clauses]; - } - - /** - * @param Clause[] $clauses - * - * @return list - */ - public static function filterClauses( - string $remove_var_id, - array $clauses, - ?Union $new_type = null, - ?StatementsAnalyzer $statements_analyzer = null - ): array { - $new_type_string = $new_type ? $new_type->getId() : ''; - - $clauses_to_keep = []; - - foreach ($clauses as $clause) { - $clause = $clause->calculateNegation(); - - $quoted_remove_var_id = preg_quote($remove_var_id, '/'); - - foreach ($clause->possibilities as $var_id => $_) { - if (preg_match('/' . $quoted_remove_var_id . '[\]\[\-]/', $var_id)) { - break 2; - } - } - - if (!isset($clause->possibilities[$remove_var_id]) || - $clause->possibilities[$remove_var_id] === [$new_type_string] - ) { - $clauses_to_keep[] = $clause; - } elseif ($statements_analyzer && - $new_type && - !$new_type->hasMixed() - ) { - $type_changed = false; - - // if the clause contains any possibilities that would be altered - // by the new type - foreach ($clause->possibilities[$remove_var_id] as $type) { - // if we're negating a type, we generally don't need the clause anymore - if ($type[0] === '!' && $type !== '!falsy' && $type !== '!empty') { - $type_changed = true; - break; - } - - $result_type = AssertionReconciler::reconcile( - $type, - clone $new_type, - null, - $statements_analyzer, - false, - [], - null, - [], - $failed_reconciliation - ); - - if ($result_type->getId() !== $new_type_string) { - $type_changed = true; - break; - } - } - - if (!$type_changed) { - $clauses_to_keep[] = $clause; - } - } - } - - return $clauses_to_keep; - } - - public function removeVarFromConflictingClauses( - string $remove_var_id, - ?Union $new_type = null, - ?StatementsAnalyzer $statements_analyzer = null - ): void { - $this->clauses = self::filterClauses($remove_var_id, $this->clauses, $new_type, $statements_analyzer); - - if ($this->parent_context) { - $this->parent_context->removeVarFromConflictingClauses($remove_var_id); - } - } - - /** - * This method is used after assignments to variables to remove any existing - * items in $vars_in_scope that are now made redundant by an update to some data - */ - public function removeDescendents( - string $remove_var_id, - ?Union $existing_type = null, - ?Union $new_type = null, - ?StatementsAnalyzer $statements_analyzer = null - ): void { - if (!$existing_type && isset($this->vars_in_scope[$remove_var_id])) { - $existing_type = $this->vars_in_scope[$remove_var_id]; - } - - if (!$existing_type) { - return; - } - - $existing_type->allow_mutations = true; - - $this->removeVarFromConflictingClauses( - $remove_var_id, - $existing_type->hasMixed() - || ($new_type && $existing_type->from_docblock !== $new_type->from_docblock) - ? null - : $new_type, - $statements_analyzer - ); - - foreach ($this->vars_in_scope as $var_id => $type) { - if (preg_match('/' . preg_quote($remove_var_id, '/') . '[\]\[\-]/', $var_id)) { - unset($this->vars_in_scope[$var_id]); - } - - foreach ($type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof DependentType - && $atomic_type->getVarId() === $remove_var_id - ) { - $type->addType($atomic_type->getReplacement()); - } - } - } - } - - public function removeMutableObjectVars(bool $methods_only = false): void - { - $vars_to_remove = []; - - foreach ($this->vars_in_scope as $var_id => $type) { - if ($type->has_mutations - && (strpos($var_id, '->') !== false || strpos($var_id, '::') !== false) - && (!$methods_only || strpos($var_id, '()')) - ) { - $vars_to_remove[] = $var_id; - } - } - - if (!$vars_to_remove) { - return; - } - - foreach ($vars_to_remove as $var_id) { - unset($this->vars_in_scope[$var_id], $this->vars_possibly_in_scope[$var_id]); - } - - $clauses_to_keep = []; - - foreach ($this->clauses as $clause) { - $abandon_clause = false; - - foreach (array_keys($clause->possibilities) as $key) { - if ((strpos($key, '->') !== false || strpos($key, '::') !== false) - && (!$methods_only || strpos($key, '()')) - ) { - $abandon_clause = true; - break; - } - } - - if (!$abandon_clause) { - $clauses_to_keep[] = $clause; - } - } - - $this->clauses = $clauses_to_keep; - - if ($this->parent_context) { - $this->parent_context->removeMutableObjectVars($methods_only); - } - } - - public function updateChecks(Context $op_context): void - { - $this->check_classes = $this->check_classes && $op_context->check_classes; - $this->check_variables = $this->check_variables && $op_context->check_variables; - $this->check_methods = $this->check_methods && $op_context->check_methods; - $this->check_functions = $this->check_functions && $op_context->check_functions; - $this->check_consts = $this->check_consts && $op_context->check_consts; - } - - public function isPhantomClass(string $class_name): bool - { - return isset($this->phantom_classes[strtolower($class_name)]); - } - - public function hasVariable(string $var_name): bool - { - if (!$var_name) { - return false; - } - - $stripped_var = preg_replace('/(->|\[).*$/', '', $var_name); - - if ($stripped_var !== '$this' || $var_name !== $stripped_var) { - $this->referenced_var_ids[$var_name] = true; - - if (!isset($this->vars_possibly_in_scope[$var_name]) - && !isset($this->vars_in_scope[$var_name]) - ) { - return false; - } - } - - return isset($this->vars_in_scope[$var_name]); - } - - public function getScopeSummary(): string - { - $summary = []; - foreach ($this->vars_possibly_in_scope as $k => $_) { - $summary[$k] = true; - } - foreach ($this->vars_in_scope as $k => $v) { - $summary[$k] = $v->getId(); - } - - return json_encode($summary); - } - - public function defineGlobals(): void - { - $globals = [ - '$argv' => new Union([ - new TArray([Type::getInt(), Type::getString()]), - ]), - '$argc' => Type::getInt(), - ]; - - $config = Config::getInstance(); - - foreach ($config->globals as $global_id => $type_string) { - $globals[$global_id] = Type::parseString($type_string); - } - - foreach ($globals as $global_id => $type) { - $this->vars_in_scope[$global_id] = $type; - $this->vars_possibly_in_scope[$global_id] = true; - } - } - - public function mergeExceptions(Context $other_context): void - { - foreach ($other_context->possibly_thrown_exceptions as $possibly_thrown_exception => $codelocations) { - foreach ($codelocations as $hash => $codelocation) { - $this->possibly_thrown_exceptions[$possibly_thrown_exception][$hash] = $codelocation; - } - } - } - - public function isSuppressingExceptions(StatementsAnalyzer $statements_analyzer): bool - { - if (!$this->collect_exceptions) { - return true; - } - - $issue_type = $this->is_global ? 'UncaughtThrowInGlobalScope' : 'MissingThrowsDocblock'; - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - $suppressed_issue_position = array_search($issue_type, $suppressed_issues, true); - if ($suppressed_issue_position !== false) { - if (is_int($suppressed_issue_position)) { - $file = $statements_analyzer->getFileAnalyzer()->getFilePath(); - IssueBuffer::addUsedSuppressions([ - $file => [$suppressed_issue_position => true], - ]); - } - return true; - } - - return false; - } - - public function mergeFunctionExceptions( - FunctionLikeStorage $function_storage, - CodeLocation $codelocation - ): void { - $hash = $codelocation->getHash(); - foreach ($function_storage->throws as $possibly_thrown_exception => $_) { - $this->possibly_thrown_exceptions[$possibly_thrown_exception][$hash] = $codelocation; - } - } - - public function insideUse(): bool - { - return $this->inside_assignment - || $this->inside_return - || $this->inside_call - || $this->inside_general_use - || $this->inside_conditional - || $this->inside_throw - || $this->inside_isset; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/DocComment.php b/vendor/vimeo/psalm/src/Psalm/DocComment.php deleted file mode 100644 index ae3cd6ca..00000000 --- a/vendor/vimeo/psalm/src/Psalm/DocComment.php +++ /dev/null @@ -1,245 +0,0 @@ ->} - * @psalm-suppress PossiblyUnusedMethod - * - * @deprecated use parsePreservingLength instead, going to be removed in Psalm 5 - * - * @psalm-pure - */ - public static function parse(string $docblock, ?int $line_number = null, bool $preserve_format = false): array - { - // Strip off comments. - $docblock = trim($docblock); - $docblock = preg_replace('@^/\*\*@', '', $docblock); - $docblock = preg_replace('@\*/$@', '', $docblock); - $docblock = preg_replace('@^[ \t]*\*@m', '', $docblock); - - // Normalize multi-line @specials. - $lines = explode("\n", $docblock); - - $line_map = []; - - $last = false; - foreach ($lines as $k => $line) { - if (preg_match('/^\s?@\w/i', $line)) { - $last = $k; - } elseif (preg_match('/^\s*$/', $line)) { - $last = false; - } elseif ($last !== false) { - $old_last_line = $lines[$last]; - $lines[$last] = rtrim($old_last_line) - . ($preserve_format || trim($old_last_line) === '@return' ? "\n" . $line : ' ' . trim($line)); - - if ($line_number) { - $old_line_number = $line_map[$old_last_line]; - unset($line_map[$old_last_line]); - $line_map[$lines[$last]] = $old_line_number; - } - - unset($lines[$k]); - } - - if ($line_number) { - $line_map[$line] = $line_number++; - } - } - - $special = []; - - if ($preserve_format) { - foreach ($lines as $m => $line) { - if (preg_match('/^\s?@([\w\-:]+)[\t ]*(.*)$/sm', $line, $matches)) { - [$full_match, $type, $data] = $matches; - - $docblock = str_replace($full_match, '', $docblock); - - if (empty($special[$type])) { - $special[$type] = []; - } - - $line_number = $line_map && isset($line_map[$full_match]) ? $line_map[$full_match] : $m; - - $special[$type][$line_number] = rtrim($data); - } - } - } else { - $docblock = implode("\n", $lines); - - // Parse @specials. - if (preg_match_all('/^\s?@([\w\-:]+)[\t ]*([^\n]*)/m', $docblock, $matches, PREG_SET_ORDER)) { - $docblock = preg_replace('/^\s?@([\w\-:]+)\s*([^\n]*)/m', '', $docblock); - foreach ($matches as $m => $match) { - [$_, $type, $data] = $match; - - if (empty($special[$type])) { - $special[$type] = []; - } - - $line_number = $line_map && isset($line_map[$_]) ? $line_map[$_] : $m; - - $special[$type][$line_number] = $data; - } - } - } - - $docblock = str_replace("\t", ' ', $docblock); - - // Smush the whole docblock to the left edge. - $min_indent = 80; - $indent = 0; - foreach (array_filter(explode("\n", $docblock)) as $line) { - for ($ii = 0, $iiMax = strlen($line); $ii < $iiMax; ++$ii) { - if ($line[$ii] !== ' ') { - break; - } - ++$indent; - } - - $min_indent = min($indent, $min_indent); - } - - $docblock = preg_replace('/^' . str_repeat(' ', $min_indent) . '/m', '', $docblock); - $docblock = rtrim($docblock); - - // Trim any empty lines off the front, but leave the indent level if there - // is one. - $docblock = preg_replace('/^\s*\n/', '', $docblock); - - foreach ($special as $special_key => $_) { - if (strpos($special_key, 'psalm-') === 0) { - $special_key = substr($special_key, 6); - - if (!in_array( - $special_key, - self::PSALM_ANNOTATIONS, - true - )) { - throw new DocblockParseException('Unrecognised annotation @psalm-' . $special_key); - } - } - } - - return [ - 'description' => $docblock, - 'specials' => $special, - ]; - } - - /** - * Parse a docblock comment into its parts. - */ - public static function parsePreservingLength(Doc $docblock): ParsedDocblock - { - $parsed_docblock = DocblockParser::parse( - $docblock->getText(), - $docblock->getStartFilePos() - ); - - foreach ($parsed_docblock->tags as $special_key => $_) { - if (strpos($special_key, 'psalm-') === 0) { - $special_key = substr($special_key, 6); - - if (!in_array( - $special_key, - self::PSALM_ANNOTATIONS, - true - )) { - throw new DocblockParseException('Unrecognised annotation @psalm-' . $special_key); - } - } - } - - return $parsed_docblock; - } - - /** - * @psalm-pure - * @return array - */ - public static function parseSuppressList(string $suppress_entry): array - { - preg_match( - '/ - (?(DEFINE) - # either a single issue or comma separated list of issues - (? (?&issue) \s* , \s* (?&issue_list) | (?&issue) ) - - # definition of a single issue - (? [A-Za-z0-9_-]+ ) - ) - ^ (?P (?&issue_list) ) (?P .* ) $ - /xm', - $suppress_entry, - $matches - ); - - if (!isset($matches['issues'])) { - return []; - } - - $issue_offset = 0; - $ret = []; - - foreach (explode(',', $matches['issues']) as $suppressed_issue) { - $issue_offset += strspn($suppressed_issue, "\t\n\f\r "); - $ret[$issue_offset] = trim($suppressed_issue); - $issue_offset += strlen($suppressed_issue) + 1; - } - - return $ret; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/ErrorBaseline.php b/vendor/vimeo/psalm/src/Psalm/ErrorBaseline.php deleted file mode 100644 index 9759ab94..00000000 --- a/vendor/vimeo/psalm/src/Psalm/ErrorBaseline.php +++ /dev/null @@ -1,331 +0,0 @@ -}>> $existingIssues - * - * - * @psalm-pure - */ - public static function countTotalIssues(array $existingIssues): int - { - $totalIssues = 0; - - foreach ($existingIssues as $existingIssue) { - $totalIssues += array_reduce( - $existingIssue, - /** - * @param array{o:int, s:array} $existingIssue - */ - function (int $carry, array $existingIssue): int { - return $carry + $existingIssue['o']; - }, - 0 - ); - } - - return $totalIssues; - } - - /** - * @param array> $issues - * - */ - public static function create( - FileProvider $fileProvider, - string $baselineFile, - array $issues, - bool $include_php_versions - ): void { - $groupedIssues = self::countIssueTypesByFile($issues); - - self::writeToFile($fileProvider, $baselineFile, $groupedIssues, $include_php_versions); - } - - /** - * @return array}>> - * - * @throws ConfigException - */ - public static function read(FileProvider $fileProvider, string $baselineFile): array - { - if (!$fileProvider->fileExists($baselineFile)) { - throw new ConfigException("{$baselineFile} does not exist or is not readable"); - } - - $xmlSource = $fileProvider->getContents($baselineFile); - - if ($xmlSource === '') { - throw new ConfigException('Baseline file is empty'); - } - - $baselineDoc = new DOMDocument(); - $baselineDoc->loadXML($xmlSource, LIBXML_NOBLANKS); - - $filesElement = $baselineDoc->getElementsByTagName('files'); - - if ($filesElement->length === 0) { - throw new ConfigException('Baseline file does not contain '); - } - - $files = []; - - /** @var DOMElement $filesElement */ - $filesElement = $filesElement[0]; - - foreach ($filesElement->getElementsByTagName('file') as $file) { - $fileName = $file->getAttribute('src'); - - $fileName = str_replace('\\', '/', $fileName); - - $files[$fileName] = []; - - foreach ($file->childNodes as $issue) { - if (!$issue instanceof DOMElement) { - continue; - } - - $issueType = $issue->tagName; - - $files[$fileName][$issueType] = [ - 'o' => (int)$issue->getAttribute('occurrences'), - 's' => [], - ]; - $codeSamples = $issue->getElementsByTagName('code'); - - foreach ($codeSamples as $codeSample) { - $files[$fileName][$issueType]['s'][] = trim($codeSample->textContent); - } - } - } - - return $files; - } - - /** - * @param array> $issues - * - * @return array}>> - * - * @throws ConfigException - */ - public static function update( - FileProvider $fileProvider, - string $baselineFile, - array $issues, - bool $include_php_versions - ): array { - $existingIssues = self::read($fileProvider, $baselineFile); - $newIssues = self::countIssueTypesByFile($issues); - - foreach ($existingIssues as $file => &$existingIssuesCount) { - if (!isset($newIssues[$file])) { - unset($existingIssues[$file]); - - continue; - } - - foreach ($existingIssuesCount as $issueType => $existingIssueType) { - if (!isset($newIssues[$file][$issueType])) { - unset($existingIssuesCount[$issueType]); - - continue; - } - - $existingIssuesCount[$issueType]['o'] = min( - $existingIssueType['o'], - $newIssues[$file][$issueType]['o'] - ); - $existingIssuesCount[$issueType]['s'] = array_intersect( - $existingIssueType['s'], - $newIssues[$file][$issueType]['s'] - ); - } - } - - $groupedIssues = array_filter($existingIssues); - - self::writeToFile($fileProvider, $baselineFile, $groupedIssues, $include_php_versions); - - return $groupedIssues; - } - - /** - * @param array> $issues - * - * @return array}>> - */ - private static function countIssueTypesByFile(array $issues): array - { - if ($issues === []) { - return []; - } - $groupedIssues = array_reduce( - array_merge(...array_values($issues)), - /** - * @param array}>> $carry - * - * @return array}>> - */ - function (array $carry, IssueData $issue): array { - if ($issue->severity !== Config::REPORT_ERROR) { - return $carry; - } - - $fileName = $issue->file_name; - $fileName = str_replace('\\', '/', $fileName); - $issueType = $issue->type; - - if (!isset($carry[$fileName])) { - $carry[$fileName] = []; - } - - if (!isset($carry[$fileName][$issueType])) { - $carry[$fileName][$issueType] = ['o' => 0, 's' => []]; - } - - ++$carry[$fileName][$issueType]['o']; - - if (!strpos($issue->selected_text, "\n")) { - $carry[$fileName][$issueType]['s'][] = $issue->selected_text; - } - - return $carry; - }, - [] - ); - - // Sort files first - ksort($groupedIssues); - - foreach ($groupedIssues as &$issues) { - ksort($issues); - } - - return $groupedIssues; - } - - /** - * @param array}>> $groupedIssues - * - */ - private static function writeToFile( - FileProvider $fileProvider, - string $baselineFile, - array $groupedIssues, - bool $include_php_versions - ): void { - $baselineDoc = new DOMDocument('1.0', 'UTF-8'); - $filesNode = $baselineDoc->createElement('files'); - $filesNode->setAttribute('psalm-version', PSALM_VERSION); - - if ($include_php_versions) { - $extensions = array_merge(get_loaded_extensions(), get_loaded_extensions(true)); - - usort($extensions, 'strnatcasecmp'); - - $filesNode->setAttribute('php-version', implode(';' . "\n\t", array_merge( - [ - ('php:' . PHP_VERSION), - ], - array_map( - function (string $extension): string { - return $extension . ':' . phpversion($extension); - }, - $extensions - ) - ))); - } - - foreach ($groupedIssues as $file => $issueTypes) { - $fileNode = $baselineDoc->createElement('file'); - - $fileNode->setAttribute('src', $file); - - foreach ($issueTypes as $issueType => $existingIssueType) { - $issueNode = $baselineDoc->createElement($issueType); - - $issueNode->setAttribute('occurrences', (string)$existingIssueType['o']); - - sort($existingIssueType['s']); - - foreach ($existingIssueType['s'] as $selection) { - $codeNode = $baselineDoc->createElement('code'); - - /** @todo in major version release (e.g. Psalm 5) replace $selection with trim($selection) - * This will be a minor BC break as baselines generated will then not be compatible with Psalm - * versions from before PR https://github.com/vimeo/psalm/pull/6000 - */ - $codeNode->textContent = $selection; - $issueNode->appendChild($codeNode); - } - $fileNode->appendChild($issueNode); - } - - $filesNode->appendChild($fileNode); - } - - $baselineDoc->appendChild($filesNode); - $baselineDoc->formatOutput = true; - - $xml = preg_replace_callback( - '/)\n)/', - /** - * @param string[] $matches - */ - function (array $matches): string { - return - 'saveXML() - ); - - if ($xml === null) { - throw new RuntimeException('Failed to reformat opening attributes!'); - } - - $fileProvider->setContents($baselineFile, $xml); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php b/vendor/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php deleted file mode 100644 index 2056b1a3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php +++ /dev/null @@ -1,9 +0,0 @@ -path = $path; - $this->config = $config; - $this->codebase = $codebase; - } - - public function __invoke(RegistrationInterface $registration, ?SimpleXMLElement $config = null): void - { - $fq_class_name = $this->getPluginClassForPath($this->path); - - /** @psalm-suppress UnresolvableInclude */ - require_once($this->path); - - assert(class_exists($fq_class_name)); - - $registration->registerHooksFromClass($fq_class_name); - } - - private function getPluginClassForPath(string $path): string - { - $codebase = $this->codebase; - - $path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $path); - - $file_storage = $codebase->createFileStorageForPath($path); - $file_to_scan = new FileScanner($path, $this->config->shortenFileName($path), true); - $file_to_scan->scan( - $codebase, - $file_storage - ); - - $declared_classes = ClassLikeAnalyzer::getClassesForFile($codebase, $path); - - return reset($declared_classes); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/FileManipulation.php b/vendor/vimeo/psalm/src/Psalm/FileManipulation.php deleted file mode 100644 index d9e7884d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/FileManipulation.php +++ /dev/null @@ -1,83 +0,0 @@ -start = $start; - $this->end = $end; - $this->insertion_text = $insertion_text; - $this->preserve_indentation = $preserve_indentation; - $this->remove_trailing_newline = $remove_trailing_newline; - } - - public function getKey(): string - { - return $this->start === $this->end - ? ($this->start . ':' . sha1($this->insertion_text)) - : ($this->start . ':' . $this->end); - } - - public function transform(string $existing_contents): string - { - if ($this->preserve_indentation) { - $newline_pos = strrpos($existing_contents, "\n", $this->start - strlen($existing_contents)); - - $newline_pos = $newline_pos !== false ? $newline_pos + 1 : 0; - - $indentation = substr($existing_contents, $newline_pos, $this->start - $newline_pos); - - if (trim($indentation) === '') { - $this->insertion_text .= $indentation; - } - } - - if ($this->remove_trailing_newline - && strlen($existing_contents) > $this->end - && $existing_contents[$this->end] === "\n" - ) { - $newline_pos = strrpos($existing_contents, "\n", $this->start - strlen($existing_contents)); - - $newline_pos = $newline_pos !== false ? $newline_pos + 1 : 0; - - $indentation = substr($existing_contents, $newline_pos, $this->start - $newline_pos); - - if (trim($indentation) === '') { - $this->start -= strlen($indentation); - $this->end++; - } - } - - return substr($existing_contents, 0, $this->start) - . $this->insertion_text - . substr($existing_contents, $this->end); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/FileSource.php b/vendor/vimeo/psalm/src/Psalm/FileSource.php deleted file mode 100644 index 9d1c5ff9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/FileSource.php +++ /dev/null @@ -1,16 +0,0 @@ ->> $all_types - * - * @return array>> - * - * @psalm-pure - */ - public static function negateTypes(array $all_types): array - { - return array_filter( - array_map( - /** - * @param non-empty-list> $anded_types - * - * @return list> - */ - function (array $anded_types): array { - if (count($anded_types) > 1) { - $new_anded_types = []; - - foreach ($anded_types as $orred_types) { - if (count($orred_types) > 1) { - return []; - } - - $new_anded_types[] = self::negateType($orred_types[0]); - } - - return [$new_anded_types]; - } - - $new_orred_types = []; - - foreach ($anded_types[0] as $orred_type) { - $new_orred_types[] = [self::negateType($orred_type)]; - } - - return $new_orred_types; - }, - $all_types - ) - ); - } - - /** - * @psalm-pure - */ - public static function negateType(string $type): string - { - if ($type === 'mixed') { - return $type; - } - - return $type[0] === '!' ? substr($type, 1) : '!' . $type; - } - - /** - * This is a very simple simplification heuristic - * for CNF formulae. - * - * It simplifies formulae: - * ($a) && ($a || $b) => $a - * (!$a) && (!$b) && ($a || $b || $c) => $c - * - * @param list $clauses - * - * @return list - * - * @psalm-pure - */ - public static function simplifyCNF(array $clauses): array - { - $clause_count = count($clauses); - - //65536 seems to be a significant threshold, when put at 65537, the code https://psalm.dev/r/216f362ea6 goes - //from seconds in analysis to many minutes - if ($clause_count > 65536) { - return []; - } - - if ($clause_count > 50) { - $all_has_unknown = true; - - foreach ($clauses as $clause) { - $clause_has_unknown = false; - foreach ($clause->possibilities as $key => $_) { - if ($key[0] === '*') { - $clause_has_unknown = true; - break; - } - } - - if (!$clause_has_unknown) { - $all_has_unknown = false; - break; - } - } - - if ($all_has_unknown) { - return $clauses; - } - } - - $cloned_clauses = []; - - // avoid strict duplicates - foreach ($clauses as $clause) { - $unique_clause = $clause->makeUnique(); - $cloned_clauses[$unique_clause->hash] = $unique_clause; - } - - // remove impossible types - foreach ($cloned_clauses as $clause_a_hash => $clause_a) { - if (!$clause_a->reconcilable || $clause_a->wedge) { - continue; - } - $clause_a_keys = array_keys($clause_a->possibilities); - - if (count($clause_a->possibilities) !== 1 || count(array_values($clause_a->possibilities)[0]) !== 1) { - foreach ($cloned_clauses as $clause_b) { - if ($clause_a === $clause_b || !$clause_b->reconcilable || $clause_b->wedge) { - continue; - } - - if ($clause_a_keys === array_keys($clause_b->possibilities)) { - $opposing_keys = []; - - foreach ($clause_a->possibilities as $key => $a_possibilities) { - $b_possibilities = $clause_b->possibilities[$key]; - - if ($a_possibilities === $b_possibilities) { - continue; - } - - if (count($a_possibilities) === 1 && count($b_possibilities) === 1) { - if ($a_possibilities[0] === '!' . $b_possibilities[0] - || $b_possibilities[0] === '!' . $a_possibilities[0] - ) { - $opposing_keys[] = $key; - continue; - } - } - - continue 2; - } - - if (count($opposing_keys) === 1) { - unset($cloned_clauses[$clause_a_hash]); - - $clause_a = $clause_a->removePossibilities($opposing_keys[0]); - - if (!$clause_a) { - continue 2; - } - - $cloned_clauses[$clause_a->hash] = $clause_a; - } - } - } - - continue; - } - - $clause_var = array_keys($clause_a->possibilities)[0]; - $only_type = array_pop(array_values($clause_a->possibilities)[0]); - $negated_clause_type = self::negateType($only_type); - - foreach ($cloned_clauses as $clause_b_hash => $clause_b) { - if ($clause_a === $clause_b || !$clause_b->reconcilable || $clause_b->wedge) { - continue; - } - - if (isset($clause_b->possibilities[$clause_var]) && - in_array($negated_clause_type, $clause_b->possibilities[$clause_var], true) - ) { - $clause_var_possibilities = array_values( - array_filter( - $clause_b->possibilities[$clause_var], - function (string $possible_type) use ($negated_clause_type): bool { - return $possible_type !== $negated_clause_type; - } - ) - ); - - unset($cloned_clauses[$clause_b_hash]); - - if (!$clause_var_possibilities) { - $updated_clause = $clause_b->removePossibilities($clause_var); - - if ($updated_clause) { - $cloned_clauses[$updated_clause->hash] = $updated_clause; - } - } else { - $updated_clause = $clause_b->addPossibilities( - $clause_var, - $clause_var_possibilities - ); - - $cloned_clauses[$updated_clause->hash] = $updated_clause; - } - } - } - } - - $simplified_clauses = []; - - foreach ($cloned_clauses as $clause_a) { - $is_redundant = false; - - foreach ($cloned_clauses as $clause_b) { - if ($clause_a === $clause_b - || !$clause_b->reconcilable - || $clause_b->wedge - || $clause_a->wedge - ) { - continue; - } - - if ($clause_a->contains($clause_b)) { - $is_redundant = true; - break; - } - } - - if (!$is_redundant) { - $simplified_clauses[] = $clause_a; - } - } - - return $simplified_clauses; - } - - /** - * Look for clauses with only one possible value - * - * @param list $clauses - * @param array $cond_referenced_var_ids - * @param array>> $active_truths - * - * @return array>> - */ - public static function getTruthsFromFormula( - array $clauses, - ?int $creating_conditional_id = null, - array &$cond_referenced_var_ids = [], - array &$active_truths = [] - ): array { - $truths = []; - $active_truths = []; - - if ($clauses === []) { - return []; - } - - foreach ($clauses as $clause) { - if (!$clause->reconcilable || count($clause->possibilities) !== 1) { - continue; - } - - foreach ($clause->possibilities as $var => $possible_types) { - if ($var[0] === '*') { - continue; - } - - // if there's only one possible type, return it - if (count($possible_types) === 1) { - $possible_type = array_pop($possible_types); - - if (isset($truths[$var]) && !isset($clause->redefined_vars[$var])) { - $truths[$var][] = [$possible_type]; - } else { - $truths[$var] = [[$possible_type]]; - } - - if ($creating_conditional_id && $creating_conditional_id === $clause->creating_conditional_id) { - if (!isset($active_truths[$var])) { - $active_truths[$var] = []; - } - - $active_truths[$var][count($truths[$var]) - 1] = [$possible_type]; - } - } else { - // if there's only one active clause, return all the non-negation clause members ORed together - $things_that_can_be_said = array_filter( - $possible_types, - function (string $possible_type): bool { - return $possible_type[0] !== '!'; - } - ); - - if ($things_that_can_be_said && count($things_that_can_be_said) === count($possible_types)) { - $things_that_can_be_said = array_unique($things_that_can_be_said); - - if ($clause->generated && count($possible_types) > 1) { - unset($cond_referenced_var_ids[$var]); - } - - /** @var array $things_that_can_be_said */ - $truths[$var] = [$things_that_can_be_said]; - - if ($creating_conditional_id && $creating_conditional_id === $clause->creating_conditional_id) { - $active_truths[$var] = [$things_that_can_be_said]; - } - } - } - } - } - - return $truths; - } - - /** - * @param non-empty-list $clauses - * - * @return list - * - * @psalm-pure - */ - public static function groupImpossibilities(array $clauses): array - { - $complexity = 1; - - $seed_clauses = []; - - $clause = array_pop($clauses); - - if (!$clause->wedge) { - if ($clause->impossibilities === null) { - throw new UnexpectedValueException('$clause->impossibilities should not be null'); - } - - foreach ($clause->impossibilities as $var => $impossible_types) { - foreach ($impossible_types as $impossible_type) { - $seed_clause = new Clause( - [$var => [$impossible_type]], - $clause->creating_conditional_id, - $clause->creating_object_id - ); - - $seed_clauses[] = $seed_clause; - - ++$complexity; - } - } - } - - if (!$clauses || !$seed_clauses) { - return $seed_clauses; - } - - while ($clauses) { - $clause = array_pop($clauses); - - $new_clauses = []; - - foreach ($seed_clauses as $grouped_clause) { - if ($clause->impossibilities === null) { - throw new UnexpectedValueException('$clause->impossibilities should not be null'); - } - - foreach ($clause->impossibilities as $var => $impossible_types) { - foreach ($impossible_types as $impossible_type) { - $new_clause_possibilities = $grouped_clause->possibilities; - - if (isset($grouped_clause->possibilities[$var])) { - $new_clause_possibilities[$var] = array_values( - array_unique( - array_merge([$impossible_type], $new_clause_possibilities[$var]) - ) - ); - - $removed_indexes = []; - - for ($i = 0, $l = count($new_clause_possibilities[$var]); $i < $l; $i++) { - for ($j = $i + 1; $j < $l; $j++) { - $ith = $new_clause_possibilities[$var][$i]; - $jth = $new_clause_possibilities[$var][$j]; - - if ($ith === '!' . $jth || $jth === '!' . $ith) { - $removed_indexes[$i] = true; - $removed_indexes[$j] = true; - } - } - } - - if ($removed_indexes) { - $new_possibilities = array_values( - array_diff_key( - $new_clause_possibilities[$var], - $removed_indexes - ) - ); - - if (!$new_possibilities) { - unset($new_clause_possibilities[$var]); - } else { - $new_clause_possibilities[$var] = $new_possibilities; - } - } - } else { - $new_clause_possibilities[$var] = [$impossible_type]; - } - - if (!$new_clause_possibilities) { - continue; - } - - $new_clause = new Clause( - $new_clause_possibilities, - $grouped_clause->creating_conditional_id, - $clause->creating_object_id, - false, - true, - true, - [] - ); - - $new_clauses[] = $new_clause; - - ++$complexity; - - if ($complexity > 20000) { - throw new ComplicatedExpressionException(); - } - } - } - } - - $seed_clauses = $new_clauses; - } - - return $seed_clauses; - } - - /** - * @param list $left_clauses - * @param list $right_clauses - * - * @return list - * - * @psalm-pure - */ - public static function combineOredClauses( - array $left_clauses, - array $right_clauses, - int $conditional_object_id - ): array { - if (count($left_clauses) > 60000 || count($right_clauses) > 60000) { - return []; - } - - $clauses = []; - - $all_wedges = true; - $has_wedge = false; - - foreach ($left_clauses as $left_clause) { - foreach ($right_clauses as $right_clause) { - $all_wedges = $all_wedges && ($left_clause->wedge && $right_clause->wedge); - $has_wedge = $has_wedge || ($left_clause->wedge && $right_clause->wedge); - } - } - - if ($all_wedges) { - return [new Clause([], $conditional_object_id, $conditional_object_id, true)]; - } - - foreach ($left_clauses as $left_clause) { - foreach ($right_clauses as $right_clause) { - if ($left_clause->wedge && $right_clause->wedge) { - // handled below - continue; - } - - /** @var array> */ - $possibilities = []; - - $can_reconcile = true; - - if ($left_clause->wedge || - $right_clause->wedge || - !$left_clause->reconcilable || - !$right_clause->reconcilable - ) { - $can_reconcile = false; - } - - foreach ($left_clause->possibilities as $var => $possible_types) { - if (isset($right_clause->redefined_vars[$var])) { - continue; - } - - if (isset($possibilities[$var])) { - $possibilities[$var] = array_merge($possibilities[$var], $possible_types); - } else { - $possibilities[$var] = $possible_types; - } - } - - foreach ($right_clause->possibilities as $var => $possible_types) { - if (isset($possibilities[$var])) { - $possibilities[$var] = array_merge($possibilities[$var], $possible_types); - } else { - $possibilities[$var] = $possible_types; - } - } - - if (count($left_clauses) > 1 || count($right_clauses) > 1) { - foreach ($possibilities as $var => $p) { - $possibilities[$var] = array_values(array_unique($p)); - } - } - - foreach ($possibilities as $var_possibilities) { - if (count($var_possibilities) === 2) { - if ($var_possibilities[0] === '!' . $var_possibilities[1] - || $var_possibilities[1] === '!' . $var_possibilities[0] - ) { - continue 2; - } - } - } - - $creating_conditional_id = - $right_clause->creating_conditional_id === $left_clause->creating_conditional_id - ? $right_clause->creating_conditional_id - : $conditional_object_id; - - $clauses[] = new Clause( - $possibilities, - $creating_conditional_id, - $creating_conditional_id, - false, - $can_reconcile, - $right_clause->generated - || $left_clause->generated - || count($left_clauses) > 1 - || count($right_clauses) > 1, - [] - ); - } - } - - if ($has_wedge) { - $clauses[] = new Clause([], $conditional_object_id, $conditional_object_id, true); - } - - return $clauses; - } - - /** - * Negates a set of clauses - * negateClauses([$a || $b]) => !$a && !$b - * negateClauses([$a, $b]) => !$a || !$b - * negateClauses([$a, $b || $c]) => - * (!$a || !$b) && - * (!$a || !$c) - * negateClauses([$a, $b || $c, $d || $e || $f]) => - * (!$a || !$b || !$d) && - * (!$a || !$b || !$e) && - * (!$a || !$b || !$f) && - * (!$a || !$c || !$d) && - * (!$a || !$c || !$e) && - * (!$a || !$c || !$f) - * - * @param list $clauses - * - * @return non-empty-list - */ - public static function negateFormula(array $clauses): array - { - $clauses = array_filter( - $clauses, - function ($clause) { - return $clause->reconcilable; - } - ); - - if (!$clauses) { - $cond_id = mt_rand(0, 100000000); - return [new Clause([], $cond_id, $cond_id, true)]; - } - - $clauses_with_impossibilities = []; - - foreach ($clauses as $clause) { - $clauses_with_impossibilities[] = $clause->calculateNegation(); - } - - unset($clauses); - - $impossible_clauses = self::groupImpossibilities($clauses_with_impossibilities); - - if (!$impossible_clauses) { - $cond_id = mt_rand(0, 100000000); - return [new Clause([], $cond_id, $cond_id, true)]; - } - - $negated = self::simplifyCNF($impossible_clauses); - - if (!$negated) { - $cond_id = mt_rand(0, 100000000); - return [new Clause([], $cond_id, $cond_id, true)]; - } - - return $negated; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php deleted file mode 100644 index b6504af7..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php +++ /dev/null @@ -1,457 +0,0 @@ - - */ - public static function getFormula( - int $conditional_object_id, - int $creating_object_id, - PhpParser\Node\Expr $conditional, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase = null, - bool $inside_negation = false, - bool $cache = true - ): array { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd || - $conditional instanceof PhpParser\Node\Expr\BinaryOp\LogicalAnd - ) { - $left_assertions = self::getFormula( - $conditional_object_id, - spl_object_id($conditional->left), - $conditional->left, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - - $right_assertions = self::getFormula( - $conditional_object_id, - spl_object_id($conditional->right), - $conditional->right, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - - return array_merge( - $left_assertions, - $right_assertions - ); - } - - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr || - $conditional instanceof PhpParser\Node\Expr\BinaryOp\LogicalOr - ) { - $left_clauses = self::getFormula( - $conditional_object_id, - spl_object_id($conditional->left), - $conditional->left, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - - $right_clauses = self::getFormula( - $conditional_object_id, - spl_object_id($conditional->right), - $conditional->right, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - - return Algebra::combineOredClauses($left_clauses, $right_clauses, $conditional_object_id); - } - - if ($conditional instanceof PhpParser\Node\Expr\BooleanNot) { - if ($conditional->expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr) { - $and_expr = new VirtualBooleanAnd( - new VirtualBooleanNot( - $conditional->expr->left, - $conditional->getAttributes() - ), - new VirtualBooleanNot( - $conditional->expr->right, - $conditional->getAttributes() - ), - $conditional->expr->getAttributes() - ); - - return self::getFormula( - $conditional_object_id, - $conditional_object_id, - $and_expr, - $this_class_name, - $source, - $codebase, - $inside_negation, - false - ); - } - - if ($conditional->expr instanceof PhpParser\Node\Expr\Isset_ - && count($conditional->expr->vars) > 1 - ) { - $anded_assertions = null; - - if ($cache && $source instanceof StatementsAnalyzer) { - $anded_assertions = $source->node_data->getAssertions($conditional->expr); - } - - if ($anded_assertions === null) { - $anded_assertions = AssertionFinder::scrapeAssertions( - $conditional->expr, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - - if ($cache && $source instanceof StatementsAnalyzer) { - $source->node_data->setAssertions($conditional->expr, $anded_assertions); - } - } - - $clauses = []; - - foreach ($anded_assertions as $assertions) { - foreach ($assertions as $var => $anded_types) { - $redefined = false; - - if ($var[0] === '=') { - /** @var string */ - $var = substr($var, 1); - $redefined = true; - } - - foreach ($anded_types as $orred_types) { - $clauses[] = new Clause( - [$var => $orred_types], - $conditional_object_id, - spl_object_id($conditional->expr), - false, - true, - $orred_types[0][0] === '=' - || $orred_types[0][0] === '~' - || (strlen($orred_types[0]) > 1 - && ($orred_types[0][1] === '=' - || $orred_types[0][1] === '~')), - $redefined ? [$var => true] : [] - ); - } - } - } - - return Algebra::negateFormula($clauses); - } - - if ($conditional->expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd) { - $and_expr = new VirtualBooleanOr( - new VirtualBooleanNot( - $conditional->expr->left, - $conditional->getAttributes() - ), - new VirtualBooleanNot( - $conditional->expr->right, - $conditional->getAttributes() - ), - $conditional->expr->getAttributes() - ); - - return self::getFormula( - $conditional_object_id, - spl_object_id($conditional->expr), - $and_expr, - $this_class_name, - $source, - $codebase, - $inside_negation, - false - ); - } - - return Algebra::negateFormula( - self::getFormula( - $conditional_object_id, - spl_object_id($conditional->expr), - $conditional->expr, - $this_class_name, - $source, - $codebase, - !$inside_negation - ) - ); - } - - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical - || $conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal - ) { - $false_pos = AssertionFinder::hasFalseVariable($conditional); - $true_pos = AssertionFinder::hasTrueVariable($conditional); - - if ($false_pos === AssertionFinder::ASSIGNMENT_TO_RIGHT - && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal - || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd - || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $conditional->left instanceof PhpParser\Node\Expr\BooleanNot) - ) { - return Algebra::negateFormula( - self::getFormula( - $conditional_object_id, - spl_object_id($conditional->left), - $conditional->left, - $this_class_name, - $source, - $codebase, - !$inside_negation, - $cache - ) - ); - } - - if ($false_pos === AssertionFinder::ASSIGNMENT_TO_LEFT - && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal - || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd - || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $conditional->right instanceof PhpParser\Node\Expr\BooleanNot) - ) { - return Algebra::negateFormula( - self::getFormula( - $conditional_object_id, - spl_object_id($conditional->right), - $conditional->right, - $this_class_name, - $source, - $codebase, - !$inside_negation, - $cache - ) - ); - } - - if ($true_pos === AssertionFinder::ASSIGNMENT_TO_RIGHT - && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal - || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd - || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $conditional->left instanceof PhpParser\Node\Expr\BooleanNot) - ) { - return self::getFormula( - $conditional_object_id, - spl_object_id($conditional->left), - $conditional->left, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - } - - if ($true_pos === AssertionFinder::ASSIGNMENT_TO_LEFT - && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal - || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd - || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $conditional->right instanceof PhpParser\Node\Expr\BooleanNot) - ) { - return self::getFormula( - $conditional_object_id, - spl_object_id($conditional->right), - $conditional->right, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - } - } - - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical - || $conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual - ) { - $false_pos = AssertionFinder::hasFalseVariable($conditional); - $true_pos = AssertionFinder::hasTrueVariable($conditional); - - if ($true_pos === AssertionFinder::ASSIGNMENT_TO_RIGHT - && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual - || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd - || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $conditional->left instanceof PhpParser\Node\Expr\BooleanNot) - ) { - return Algebra::negateFormula( - self::getFormula( - $conditional_object_id, - spl_object_id($conditional->left), - $conditional->left, - $this_class_name, - $source, - $codebase, - !$inside_negation, - $cache - ) - ); - } - - if ($true_pos === AssertionFinder::ASSIGNMENT_TO_LEFT - && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual - || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd - || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $conditional->right instanceof PhpParser\Node\Expr\BooleanNot) - ) { - return Algebra::negateFormula( - self::getFormula( - $conditional_object_id, - spl_object_id($conditional->right), - $conditional->right, - $this_class_name, - $source, - $codebase, - !$inside_negation, - $cache - ) - ); - } - - if ($false_pos === AssertionFinder::ASSIGNMENT_TO_RIGHT - && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual - || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd - || $conditional->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $conditional->left instanceof PhpParser\Node\Expr\BooleanNot) - ) { - return self::getFormula( - $conditional_object_id, - spl_object_id($conditional->left), - $conditional->left, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - } - - if ($false_pos === AssertionFinder::ASSIGNMENT_TO_LEFT - && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual - || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd - || $conditional->right instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $conditional->right instanceof PhpParser\Node\Expr\BooleanNot) - ) { - return self::getFormula( - $conditional_object_id, - spl_object_id($conditional->right), - $conditional->right, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - } - } - - if ($conditional instanceof PhpParser\Node\Expr\Cast\Bool_) { - return self::getFormula( - $conditional_object_id, - spl_object_id($conditional->expr), - $conditional->expr, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - } - - $anded_assertions = null; - - if ($cache && $source instanceof StatementsAnalyzer) { - $anded_assertions = $source->node_data->getAssertions($conditional); - } - - if ($anded_assertions === null) { - $anded_assertions = AssertionFinder::scrapeAssertions( - $conditional, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache - ); - - if ($cache && $source instanceof StatementsAnalyzer) { - $source->node_data->setAssertions($conditional, $anded_assertions); - } - } - - $clauses = []; - - foreach ($anded_assertions as $assertions) { - foreach ($assertions as $var => $anded_types) { - $redefined = false; - - if ($var[0] === '=') { - /** @var string */ - $var = substr($var, 1); - $redefined = true; - } - - foreach ($anded_types as $orred_types) { - $clauses[] = new Clause( - [$var => $orred_types], - $conditional_object_id, - $creating_object_id, - false, - true, - $orred_types[0][0] === '=' - || $orred_types[0][0] === '~' - || (strlen($orred_types[0]) > 1 - && ($orred_types[0][1] === '=' - || $orred_types[0][1] === '~')), - $redefined ? [$var => true] : [] - ); - } - } - } - - if ($clauses) { - return $clauses; - } - - /** @psalm-suppress MixedOperand */ - $conditional_ref = '*' . $conditional->getAttribute('startFilePos') - . ':' . $conditional->getAttribute('endFilePos'); - - return [new Clause([$conditional_ref => ['!falsy']], $conditional_object_id, $creating_object_id)]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php deleted file mode 100644 index a7f2a543..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php +++ /dev/null @@ -1,174 +0,0 @@ - $formula_1 - * @param list $formula_2 - * @param array $new_assigned_var_ids - */ - public static function checkForParadox( - array $formula_1, - array $formula_2, - StatementsAnalyzer $statements_analyzer, - PhpParser\Node $stmt, - array $new_assigned_var_ids - ): void { - try { - $negated_formula2 = Algebra::negateFormula($formula_2); - } catch (ComplicatedExpressionException $e) { - return; - } - - $formula_1_hashes = []; - - foreach ($formula_1 as $formula_1_clause) { - $formula_1_hashes[$formula_1_clause->hash] = true; - } - - $formula_2_hashes = []; - - foreach ($formula_2 as $formula_2_clause) { - $hash = $formula_2_clause->hash; - - if (!$formula_2_clause->generated - && !$formula_2_clause->wedge - && $formula_2_clause->reconcilable - && (isset($formula_1_hashes[$hash]) || isset($formula_2_hashes[$hash])) - && !array_intersect_key($new_assigned_var_ids, $formula_2_clause->possibilities) - ) { - IssueBuffer::maybeAdd( - new RedundantCondition( - $formula_2_clause . ' has already been asserted', - new CodeLocation($statements_analyzer, $stmt), - null - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - foreach ($formula_2_clause->possibilities as $key => $values) { - if (!$formula_2_clause->generated - && count($values) > 1 - && !isset($new_assigned_var_ids[$key]) - && count(array_unique($values)) < count($values) - ) { - IssueBuffer::maybeAdd( - new ParadoxicalCondition( - 'Found a redundant condition when evaluating assertion (' . $formula_2_clause . ')', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - $formula_2_hashes[$hash] = true; - } - - // remove impossible types - foreach ($negated_formula2 as $negated_clause_2) { - if (count($negated_formula2) === 1) { - foreach ($negated_clause_2->possibilities as $key => $values) { - if (count($values) > 1 - && !isset($new_assigned_var_ids[$key]) - && count(array_unique($values)) < count($values) - ) { - IssueBuffer::maybeAdd( - new RedundantCondition( - 'Found a redundant condition when evaluating ' . $key, - new CodeLocation($statements_analyzer, $stmt), - null - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - if (!$negated_clause_2->reconcilable || $negated_clause_2->wedge) { - continue; - } - - foreach ($formula_1 as $clause_1) { - if ($negated_clause_2 === $clause_1 || !$clause_1->reconcilable || $clause_1->wedge) { - continue; - } - - $negated_clause_2_contains_1_possibilities = true; - - foreach ($clause_1->possibilities as $key => $keyed_possibilities) { - if (!isset($negated_clause_2->possibilities[$key])) { - $negated_clause_2_contains_1_possibilities = false; - break; - } - - if ($negated_clause_2->possibilities[$key] != $keyed_possibilities) { - $negated_clause_2_contains_1_possibilities = false; - break; - } - foreach ($keyed_possibilities as $possibility) { - if (preg_match('@^!?in-array-@', $possibility)) { - $negated_clause_2_contains_1_possibilities = false; - break; - } - } - } - - if ($negated_clause_2_contains_1_possibilities) { - $mini_formula_2 = Algebra::negateFormula([$negated_clause_2]); - - if (!$mini_formula_2[0]->wedge) { - if (count($mini_formula_2) > 1) { - $paradox_message = 'Condition ((' . implode(') && (', $mini_formula_2) . '))' - . ' contradicts a previously-established condition (' . $clause_1 . ')'; - } else { - $paradox_message = 'Condition (' . $mini_formula_2[0] . ')' - . ' contradicts a previously-established condition (' . $clause_1 . ')'; - } - } else { - $paradox_message = 'Condition not(' . $negated_clause_2 . ')' - . ' contradicts a previously-established condition (' . $clause_1 . ')'; - } - - IssueBuffer::maybeAdd( - new ParadoxicalCondition( - $paradox_message, - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php deleted file mode 100644 index 3ce5ca40..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php +++ /dev/null @@ -1,394 +0,0 @@ - 'class', - 2 => 'function', - 4 => 'method', - 8 => 'property', - 16 => 'class constant', - 32 => 'function/method parameter', - 40 => 'promoted property', - ]; - - // Copied from Attribute class since that class might not exist at runtime - public const TARGET_CLASS = 1; - public const TARGET_FUNCTION = 2; - public const TARGET_METHOD = 4; - public const TARGET_PROPERTY = 8; - public const TARGET_CLASS_CONSTANT = 16; - public const TARGET_PARAMETER = 32; - public const TARGET_ALL = 63; - public const IS_REPEATABLE = 64; - - /** - * @param array $attribute_groups - * @param key-of $target - * @param array $suppressed_issues - */ - public static function analyze( - SourceAnalyzer $source, - Context $context, - HasAttributesInterface $storage, - array $attribute_groups, - int $target, - array $suppressed_issues - ): void { - $codebase = $source->getCodebase(); - $appearing_non_repeatable_attributes = []; - foreach (self::iterateAttributeNodes($attribute_groups) as $attribute) { - if ($attribute->name instanceof FullyQualified) { - $fq_attribute_name = (string) $attribute->name; - } else { - $fq_attribute_name = ClassLikeAnalyzer::getFQCLNFromNameObject($attribute->name, $source->getAliases()); - } - - $attribute_name = (string) $attribute->name; - $attribute_name_location = new CodeLocation($source, $attribute->name); - - $attribute_class_storage = $codebase->classlikes->classExists($fq_attribute_name) - ? $codebase->classlike_storage_provider->get($fq_attribute_name) - : null; - - $attribute_class_flags = self::getAttributeClassFlags( - $source, - $attribute_name, - $fq_attribute_name, - $attribute_name_location, - $attribute_class_storage, - $suppressed_issues - ); - - self::analyzeAttributeConstruction( - $source, - $context, - $fq_attribute_name, - $attribute, - $suppressed_issues, - $storage instanceof ClassLikeStorage ? $storage : null - ); - - if (($attribute_class_flags & self::IS_REPEATABLE) === 0) { - // Not IS_REPEATABLE - if (isset($appearing_non_repeatable_attributes[$fq_attribute_name])) { - IssueBuffer::maybeAdd( - new InvalidAttribute( - "Attribute {$attribute_name} is not repeatable", - $attribute_name_location - ), - $suppressed_issues - ); - } - $appearing_non_repeatable_attributes[$fq_attribute_name] = true; - } - - if (($attribute_class_flags & $target) === 0) { - IssueBuffer::maybeAdd( - new InvalidAttribute( - "Attribute {$attribute_name} cannot be used on a " - . self::TARGET_DESCRIPTIONS[$target], - $attribute_name_location - ), - $suppressed_issues - ); - } - } - } - - /** - * @param array $suppressed_issues - */ - private static function analyzeAttributeConstruction( - SourceAnalyzer $source, - Context $context, - string $fq_attribute_name, - Attribute $attribute, - array $suppressed_issues, - ?ClassLikeStorage $classlike_storage = null - ): void { - $attribute_name_location = new CodeLocation($source, $attribute->name); - - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $source, - $fq_attribute_name, - $attribute_name_location, - null, - null, - $suppressed_issues, - new ClassLikeNameOptions( - false, - false, - false, - false, - false, - true - ) - ) === false) { - return; - } - - if (strtolower($fq_attribute_name) === 'attribute' && $classlike_storage) { - if ($classlike_storage->is_trait) { - IssueBuffer::maybeAdd( - new InvalidAttribute( - 'Traits cannot act as attribute classes', - $attribute_name_location - ), - $suppressed_issues - ); - } elseif ($classlike_storage->is_interface) { - IssueBuffer::maybeAdd( - new InvalidAttribute( - 'Interfaces cannot act as attribute classes', - $attribute_name_location - ), - $suppressed_issues - ); - } elseif ($classlike_storage->abstract) { - IssueBuffer::maybeAdd( - new InvalidAttribute( - 'Abstract classes cannot act as attribute classes', - $attribute_name_location - ), - $suppressed_issues - ); - } elseif (isset($classlike_storage->methods['__construct']) - && $classlike_storage->methods['__construct']->visibility !== ClassLikeAnalyzer::VISIBILITY_PUBLIC - ) { - IssueBuffer::maybeAdd( - new InvalidAttribute( - 'Classes with protected/private constructors cannot act as attribute classes', - $attribute_name_location - ), - $suppressed_issues - ); - } elseif ($classlike_storage->is_enum) { - IssueBuffer::maybeAdd( - new InvalidAttribute( - 'Enums cannot act as attribute classes', - $attribute_name_location - ), - $suppressed_issues - ); - } - } - - $statements_analyzer = new StatementsAnalyzer( - $source, - new NodeDataProvider() - ); - $statements_analyzer->addSuppressedIssues(array_values($suppressed_issues)); - - $had_returned = $context->has_returned; - $context->has_returned = false; - - IssueBuffer::startRecording(); - $statements_analyzer->analyze( - [new Expression(new New_($attribute->name, $attribute->args, $attribute->getAttributes()))], - // Use a new Context for the Attribute attribute so that it can't access `self` - strtolower($fq_attribute_name) === "attribute" ? new Context() : $context - ); - $context->has_returned = $had_returned; - - $issues = IssueBuffer::clearRecordingLevel(); - IssueBuffer::stopRecording(); - foreach ($issues as $issue) { - if ($issue instanceof UndefinedClass && $issue->fq_classlike_name === $fq_attribute_name) { - // Remove UndefinedClass for the attribute, since we already added UndefinedAttribute - continue; - } - IssueBuffer::bubbleUp($issue); - } - } - - /** - * @param array $suppressed_issues - */ - private static function getAttributeClassFlags( - SourceAnalyzer $source, - string $attribute_name, - string $fq_attribute_name, - CodeLocation $attribute_name_location, - ?ClassLikeStorage $attribute_class_storage, - array $suppressed_issues - ): int { - if (strtolower($fq_attribute_name) === "attribute") { - // We override this here because we still want to analyze attributes - // for PHP 7.4 when the Attribute class doesn't yet exist. - return self::TARGET_CLASS; - } - - if ($attribute_class_storage === null) { - return self::TARGET_ALL; // Defaults to TARGET_ALL - } - - foreach ($attribute_class_storage->attributes as $attribute_attribute) { - if ($attribute_attribute->fq_class_name === 'Attribute') { - if (!$attribute_attribute->args) { - return self::TARGET_ALL; // Defaults to TARGET_ALL - } - - $first_arg = reset($attribute_attribute->args); - - $first_arg_type = $first_arg->type; - - if ($first_arg_type instanceof UnresolvedConstantComponent) { - $first_arg_type = new Union([ - ConstantTypeResolver::resolve( - $source->getCodebase()->classlikes, - $first_arg_type, - $source instanceof StatementsAnalyzer ? $source : null - ) - ]); - } - - if (!$first_arg_type->isSingleIntLiteral()) { - return self::TARGET_ALL; // Fall back to default if it's invalid - } - - return $first_arg_type->getSingleIntLiteral()->value; - } - } - - IssueBuffer::maybeAdd( - new InvalidAttribute( - "The class {$attribute_name} doesn't have the Attribute attribute", - $attribute_name_location - ), - $suppressed_issues - ); - - return self::TARGET_ALL; // Fall back to default if it's invalid - } - - /** - * @param iterable $attribute_groups - * - * @return Generator - */ - private static function iterateAttributeNodes(iterable $attribute_groups): Generator - { - foreach ($attribute_groups as $attribute_group) { - foreach ($attribute_group->attrs as $attribute) { - yield $attribute; - } - } - } - - /** - * Analyze Reflection getAttributes method calls. - - * @param list $args - */ - public static function analyzeGetAttributes( - StatementsAnalyzer $statements_analyzer, - string $method_id, - array $args - ): void { - if (count($args) !== 1) { - // We skip this analysis if $flags is specified on getAttributes, since the only option - // is ReflectionAttribute::IS_INSTANCEOF, which causes getAttributes to return children. - // When returning children we don't want to limit this since a child could add a target. - return; - } - - switch ($method_id) { - case "ReflectionClass::getattributes": - $target = self::TARGET_CLASS; - break; - case "ReflectionFunction::getattributes": - $target = self::TARGET_FUNCTION; - break; - case "ReflectionMethod::getattributes": - $target = self::TARGET_METHOD; - break; - case "ReflectionProperty::getattributes": - $target = self::TARGET_PROPERTY; - break; - case "ReflectionClassConstant::getattributes": - $target = self::TARGET_CLASS_CONSTANT; - break; - case "ReflectionParameter::getattributes": - $target = self::TARGET_PARAMETER; - break; - default: - return; - } - - $arg = $args[0]; - if ($arg->name !== null) { - for (; !empty($args) && ($arg->name->name ?? null) !== "name"; $arg = array_shift($args)); - if ($arg->name->name ?? null !== "name") { - // No named argument for "name" parameter - return; - } - } - - $arg_type = $statements_analyzer->getNodeTypeProvider()->getType($arg->value); - if ($arg_type === null || !$arg_type->isSingle() || !$arg_type->hasLiteralString()) { - return; - } - - $class_string = $arg_type->getSingleAtomic(); - assert($class_string instanceof TLiteralString); - - $codebase = $statements_analyzer->getCodebase(); - - if (!$codebase->classExists($class_string->value)) { - return; - } - - $class_storage = $codebase->classlike_storage_provider->get($class_string->value); - $arg_location = new CodeLocation($statements_analyzer, $arg); - $class_attribute_target = self::getAttributeClassFlags( - $statements_analyzer, - $class_string->value, - $class_string->value, - $arg_location, - $class_storage, - $statements_analyzer->getSuppressedIssues() - ); - - if (($class_attribute_target & $target) === 0) { - IssueBuffer::maybeAdd( - new InvalidAttribute( - "Attribute {$class_string->value} cannot be used on a " - . self::TARGET_DESCRIPTIONS[$target], - $arg_location - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php deleted file mode 100644 index 8f2ca0ee..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php +++ /dev/null @@ -1,162 +0,0 @@ - - */ - private $aliased_classes = []; - - /** - * @var array - */ - private $aliased_class_locations = []; - - /** - * @var array - */ - private $aliased_classes_flipped = []; - - /** - * @var array - */ - private $aliased_classes_flipped_replaceable = []; - - /** - * @var array - */ - private $aliased_functions = []; - - /** - * @var array - */ - private $aliased_constants = []; - - public function visitUse(PhpParser\Node\Stmt\Use_ $stmt): void - { - $codebase = $this->getCodebase(); - - foreach ($stmt->uses as $use) { - $use_path = implode('\\', $use->name->parts); - $use_path_lc = strtolower($use_path); - $use_alias = $use->alias->name ?? $use->name->getLast(); - $use_alias_lc = strtolower($use_alias); - - switch ($use->type !== PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN ? $use->type : $stmt->type) { - case PhpParser\Node\Stmt\Use_::TYPE_FUNCTION: - $this->aliased_functions[$use_alias_lc] = $use_path; - break; - - case PhpParser\Node\Stmt\Use_::TYPE_CONSTANT: - $this->aliased_constants[$use_alias] = $use_path; - break; - - case PhpParser\Node\Stmt\Use_::TYPE_NORMAL: - $codebase->analyzer->addOffsetReference( - $this->getFilePath(), - (int) $use->getAttribute('startFilePos'), - (int) $use->getAttribute('endFilePos'), - $use_path - ); - if ($codebase->collect_locations) { - // register the path - $codebase->use_referencing_locations[$use_path_lc][] = - new CodeLocation($this, $use); - } - - if ($codebase->alter_code) { - if (isset($codebase->class_transforms[$use_path_lc])) { - $new_fq_class_name = $codebase->class_transforms[$use_path_lc]; - - $file_manipulations = []; - - $file_manipulations[] = new FileManipulation( - (int) $use->getAttribute('startFilePos'), - (int) $use->getAttribute('endFilePos') + 1, - $new_fq_class_name . ($use->alias ? ' as ' . $use_alias : '') - ); - - FileManipulationBuffer::add($this->getFilePath(), $file_manipulations); - } - - $this->aliased_classes_flipped_replaceable[$use_path_lc] = $use_alias; - } - - $this->aliased_classes[$use_alias_lc] = $use_path; - $this->aliased_class_locations[$use_alias_lc] = new CodeLocation($this, $stmt); - $this->aliased_classes_flipped[$use_path_lc] = $use_alias; - break; - } - } - } - - public function visitGroupUse(PhpParser\Node\Stmt\GroupUse $stmt): void - { - $use_prefix = implode('\\', $stmt->prefix->parts); - - $codebase = $this->getCodebase(); - - foreach ($stmt->uses as $use) { - $use_path = $use_prefix . '\\' . implode('\\', $use->name->parts); - $use_alias = $use->alias->name ?? $use->name->getLast(); - - switch ($use->type !== PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN ? $use->type : $stmt->type) { - case PhpParser\Node\Stmt\Use_::TYPE_FUNCTION: - $this->aliased_functions[strtolower($use_alias)] = $use_path; - break; - - case PhpParser\Node\Stmt\Use_::TYPE_CONSTANT: - $this->aliased_constants[$use_alias] = $use_path; - break; - - case PhpParser\Node\Stmt\Use_::TYPE_NORMAL: - if ($codebase->collect_locations) { - // register the path - $codebase->use_referencing_locations[strtolower($use_path)][] = - new CodeLocation($this, $use); - } - - $this->aliased_classes[strtolower($use_alias)] = $use_path; - $this->aliased_classes_flipped[strtolower($use_path)] = $use_alias; - break; - } - } - } - - /** - * @return array - */ - public function getAliasedClassesFlipped(): array - { - return $this->aliased_classes_flipped; - } - - /** - * @return array - */ - public function getAliasedClassesFlippedReplaceable(): array - { - return $this->aliased_classes_flipped_replaceable; - } - - public function getAliases(): Aliases - { - return new Aliases( - $this->getNamespace(), - $this->aliased_classes, - $this->aliased_functions, - $this->aliased_constants - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php deleted file mode 100644 index cb4e6349..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php +++ /dev/null @@ -1,2638 +0,0 @@ - - */ - public $inferred_property_types = []; - - /** - * @param PhpParser\Node\Stmt\Class_|PhpParser\Node\Stmt\Enum_ $class - */ - public function __construct(PhpParser\Node\Stmt $class, SourceAnalyzer $source, ?string $fq_class_name) - { - if (!$fq_class_name) { - if (!$class instanceof PhpParser\Node\Stmt\Class_) { - throw new UnexpectedValueException('Anonymous enums are not allowed'); - } - - $fq_class_name = self::getAnonymousClassName($class, $source->getFilePath()); - } - - parent::__construct($class, $source, $fq_class_name); - - if ($this->class instanceof PhpParser\Node\Stmt\Class_ && $this->class->extends) { - $this->parent_fq_class_name = self::getFQCLNFromNameObject( - $this->class->extends, - $this->source->getAliases() - ); - } - } - - /** @return non-empty-string */ - public static function getAnonymousClassName(PhpParser\Node\Stmt\Class_ $class, string $file_path): string - { - return preg_replace('/[^A-Za-z0-9]/', '_', $file_path) - . '_' . $class->getLine() . '_' . (int)$class->getAttribute('startFilePos'); - } - - public function analyze( - ?Context $class_context = null, - ?Context $global_context = null - ): void { - $class = $this->class; - - if (!$class instanceof PhpParser\Node\Stmt\Class_ && !$class instanceof PhpParser\Node\Stmt\Enum_) { - throw new LogicException('Something went badly wrong'); - } - - $fq_class_name = $class_context && $class_context->self ? $class_context->self : $this->fq_class_name; - - $storage = $this->storage; - - if ($storage->has_visitor_issues) { - return; - } - - if ($class->name - && (preg_match( - '/(^|\\\)(int|float|bool|string|void|null|false|true|object|mixed)$/i', - $fq_class_name - ) || strtolower($fq_class_name) === 'resource') - ) { - $class_name_parts = explode('\\', $fq_class_name); - $class_name = array_pop($class_name_parts); - - IssueBuffer::maybeAdd( - new ReservedWord( - $class_name . ' is a reserved word', - new CodeLocation( - $this, - $class->name, - null, - true - ), - $class_name - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - - return; - } - - $project_analyzer = $this->file_analyzer->project_analyzer; - $codebase = $this->getCodebase(); - - if ($codebase->alter_code && $class->name && $codebase->classes_to_move) { - if (isset($codebase->classes_to_move[strtolower($this->fq_class_name)])) { - $destination_class = $codebase->classes_to_move[strtolower($this->fq_class_name)]; - - $source_class_parts = explode('\\', $this->fq_class_name); - $destination_class_parts = explode('\\', $destination_class); - - array_pop($source_class_parts); - array_pop($destination_class_parts); - - $source_ns = implode('\\', $source_class_parts); - $destination_ns = implode('\\', $destination_class_parts); - - if (strtolower($source_ns) !== strtolower($destination_ns)) { - if ($storage->namespace_name_location) { - $bounds = $storage->namespace_name_location->getSelectionBounds(); - - $file_manipulations = [ - new FileManipulation( - $bounds[0], - $bounds[1], - $destination_ns - ) - ]; - - FileManipulationBuffer::add( - $this->getFilePath(), - $file_manipulations - ); - } elseif (!$source_ns) { - $first_statement_pos = $this->getFileAnalyzer()->getFirstStatementOffset(); - - if ($first_statement_pos === -1) { - $first_statement_pos = (int) $class->getAttribute('startFilePos'); - } - - $file_manipulations = [ - new FileManipulation( - $first_statement_pos, - $first_statement_pos, - 'namespace ' . $destination_ns . ';' . "\n\n", - true - ) - ]; - - FileManipulationBuffer::add( - $this->getFilePath(), - $file_manipulations - ); - } - } - } - - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $this, - $class->name, - $this->fq_class_name, - null - ); - } - - foreach ($storage->docblock_issues as $docblock_issue) { - IssueBuffer::maybeAdd($docblock_issue); - } - - $classlike_storage_provider = $codebase->classlike_storage_provider; - - $parent_fq_class_name = $this->parent_fq_class_name; - - if ($class instanceof PhpParser\Node\Stmt\Class_ && $class->extends && $parent_fq_class_name) { - $this->checkParentClass( - $class, - $class->extends, - $fq_class_name, - $parent_fq_class_name, - $storage, - $codebase, - $class_context - ); - } - - - if ($storage->template_types) { - foreach ($storage->template_types as $param_name => $_) { - $fq_classlike_name = Type::getFQCLNFromString( - $param_name, - $this->getAliases() - ); - - if ($codebase->classOrInterfaceExists($fq_classlike_name)) { - IssueBuffer::maybeAdd( - new ReservedWord( - 'Cannot use ' . $param_name . ' as template name since the class already exists', - new CodeLocation($this, $this->class), - 'resource' - ), - $this->getSuppressedIssues() - ); - } - } - } - - if (($storage->templatedMixins || $storage->namedMixins) - && $storage->mixin_declaring_fqcln === $storage->name) { - /** @var non-empty-array $mixins */ - $mixins = array_merge($storage->templatedMixins, $storage->namedMixins); - $union = new Union($mixins); - - $static_self = new TNamedObject($storage->name); - $static_self->was_static = true; - - $union = TypeExpander::expandUnion( - $codebase, - $union, - $storage->name, - $static_self, - null - ); - - $union->check( - $this, - new CodeLocation( - $this, - $class->name ?: $class, - null, - true - ), - $this->getSuppressedIssues() - ); - } - - if ($storage->template_extended_params) { - foreach ($storage->template_extended_params as $type_map) { - foreach ($type_map as $atomic_type) { - $atomic_type->check( - $this, - new CodeLocation( - $this, - $class->name ?: $class, - null, - true - ), - $this->getSuppressedIssues() - ); - } - } - } - - if (!$class_context) { - $class_context = new Context($this->fq_class_name); - $class_context->parent = $parent_fq_class_name; - } - - if ($global_context) { - $class_context->strict_types = $global_context->strict_types; - } - - if ($this->checkImplementedInterfaces( - $class_context, - $class, - $codebase, - $fq_class_name, - $storage - ) === false) { - return; - } - - if ($storage->invalid_dependencies) { - return; - } - - if ($this->leftover_stmts) { - (new StatementsAnalyzer( - $this, - new NodeDataProvider() - ))->analyze( - $this->leftover_stmts, - $class_context - ); - } - - if (!$storage->abstract) { - foreach ($storage->declaring_method_ids as $declaring_method_id) { - $method_storage = $codebase->methods->getStorage($declaring_method_id); - - $declaring_class_name = $declaring_method_id->fq_class_name; - $method_name_lc = $declaring_method_id->method_name; - - if ($method_storage->abstract) { - if (IssueBuffer::accepts( - new UnimplementedAbstractMethod( - 'Method ' . $method_name_lc . ' is not defined on class ' . - $this->fq_class_name . ', defined abstract in ' . $declaring_class_name, - new CodeLocation( - $this, - $class->name ?? $class, - $class_context->include_location, - true - ) - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - )) { - return; - } - } - } - } - - AttributesAnalyzer::analyze( - $this, - $class_context, - $storage, - $class->attrGroups, - AttributesAnalyzer::TARGET_CLASS, - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - - self::addContextProperties( - $this, - $storage, - $class_context, - $this->fq_class_name, - $this->parent_fq_class_name, - $class->stmts - ); - - $constructor_analyzer = null; - $member_stmts = []; - - foreach ($class->stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod) { - $method_analyzer = $this->analyzeClassMethod( - $stmt, - $storage, - $this, - $class_context, - $global_context - ); - - if ($stmt->name->name === '__construct') { - $constructor_analyzer = $method_analyzer; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\TraitUse) { - if ($this->analyzeTraitUse( - $this->source->getAliases(), - $stmt, - $project_analyzer, - $storage, - $class_context, - $global_context, - $constructor_analyzer - ) === false) { - return; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Property) { - foreach ($stmt->props as $prop) { - if ($storage->is_enum) { - if (IssueBuffer::accepts(new NoEnumProperties( - 'Enums cannot have properties', - new CodeLocation($this, $prop), - $fq_class_name - ))) { - // fall through - } - continue; - } - if ($prop->default) { - $member_stmts[] = $stmt; - } - - if ($codebase->alter_code) { - $property_id = strtolower($this->fq_class_name) . '::$' . $prop->name; - - $property_storage = $codebase->properties->getStorage($property_id); - - if ($property_storage->type - && $property_storage->type_location - && $property_storage->type_location !== $property_storage->signature_type_location - ) { - $replace_type = TypeExpander::expandUnion( - $codebase, - $property_storage->type, - $this->getFQCLN(), - $this->getFQCLN(), - $this->getParentFQCLN() - ); - - $codebase->classlikes->handleDocblockTypeInMigration( - $codebase, - $this, - $replace_type, - $property_storage->type_location, - null - ); - } - - foreach ($codebase->properties_to_rename as $original_property_id => $new_property_name) { - if ($property_id === $original_property_id) { - $file_manipulations = [ - new FileManipulation( - (int) $prop->name->getAttribute('startFilePos'), - (int) $prop->name->getAttribute('endFilePos') + 1, - '$' . $new_property_name - ) - ]; - - FileManipulationBuffer::add( - $this->getFilePath(), - $file_manipulations - ); - } - } - } - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\ClassConst) { - $member_stmts[] = $stmt; - - foreach ($stmt->consts as $const) { - $const_id = strtolower($this->fq_class_name) . '::' . $const->name; - - foreach ($codebase->class_constants_to_rename as $original_const_id => $new_const_name) { - if ($const_id === $original_const_id) { - $file_manipulations = [ - new FileManipulation( - (int) $const->name->getAttribute('startFilePos'), - (int) $const->name->getAttribute('endFilePos') + 1, - $new_const_name - ) - ]; - - FileManipulationBuffer::add( - $this->getFilePath(), - $file_manipulations - ); - } - } - } - } - } - - $statements_analyzer = new StatementsAnalyzer($this, new NodeDataProvider()); - $statements_analyzer->analyze($member_stmts, $class_context, $global_context, true); - - $config = Config::getInstance(); - - if ($class instanceof PhpParser\Node\Stmt\Class_) { - $this->checkPropertyInitialization( - $codebase, - $config, - $storage, - $class_context, - $global_context, - $constructor_analyzer - ); - } - - if ($class instanceof PhpParser\Node\Stmt\Enum_) { - $this->checkEnum(); - } - - foreach ($class->stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\Property) { - $this->analyzeProperty($this, $stmt, $class_context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\TraitUse) { - foreach ($stmt->traits as $trait) { - $fq_trait_name = self::getFQCLNFromNameObject( - $trait, - $this->source->getAliases() - ); - - try { - $trait_file_analyzer = $project_analyzer->getFileAnalyzerForClassLike($fq_trait_name); - } catch (Exception $e) { - continue; - } - - $trait_storage = $codebase->classlike_storage_provider->get($fq_trait_name); - $trait_node = $codebase->classlikes->getTraitNode($fq_trait_name); - $trait_aliases = $trait_storage->aliases; - - if ($trait_aliases === null) { - continue; - } - - $trait_analyzer = new TraitAnalyzer( - $trait_node, - $trait_file_analyzer, - $fq_trait_name, - $trait_aliases - ); - - $fq_trait_name_lc = strtolower($fq_trait_name); - - if (isset($storage->template_type_uses_count[$fq_trait_name_lc])) { - $this->checkTemplateParams( - $codebase, - $storage, - $trait_storage, - new CodeLocation( - $this, - $trait - ), - $storage->template_type_uses_count[$fq_trait_name_lc] - ); - } - - foreach ($trait_node->stmts as $trait_stmt) { - if ($trait_stmt instanceof PhpParser\Node\Stmt\Property) { - $this->analyzeProperty($trait_analyzer, $trait_stmt, $class_context); - } - } - - $trait_file_analyzer->clearSourceBeforeDestruction(); - } - } - } - - $pseudo_methods = $storage->pseudo_methods + $storage->pseudo_static_methods; - - foreach ($pseudo_methods as $pseudo_method_name => $pseudo_method_storage) { - $pseudo_method_id = new MethodIdentifier( - $this->fq_class_name, - $pseudo_method_name - ); - - $overridden_method_ids = $codebase->methods->getOverriddenMethodIds($pseudo_method_id); - - if ($overridden_method_ids - && $pseudo_method_name !== '__construct' - && $pseudo_method_storage->location - ) { - foreach ($overridden_method_ids as $overridden_method_id) { - $parent_method_storage = $codebase->methods->getStorage($overridden_method_id); - - $overridden_fq_class_name = $overridden_method_id->fq_class_name; - - $parent_storage = $classlike_storage_provider->get($overridden_fq_class_name); - - MethodComparator::compare( - $codebase, - null, - $storage, - $parent_storage, - $pseudo_method_storage, - $parent_method_storage, - $this->fq_class_name, - $pseudo_method_storage->visibility ?: 0, - $storage->location ?: $pseudo_method_storage->location, - $storage->suppressed_issues, - true, - false - ); - } - } - } - - $event = new AfterClassLikeAnalysisEvent( - $class, - $storage, - $this, - $codebase, - [] - ); - - if ($codebase->config->eventDispatcher->dispatchAfterClassLikeAnalysis($event) === false) { - return; - } - $file_manipulations = $event->getFileReplacements(); - if ($file_manipulations) { - FileManipulationBuffer::add( - $this->getFilePath(), - $file_manipulations - ); - } - } - - public static function addContextProperties( - StatementsSource $statements_source, - ClassLikeStorage $storage, - Context $class_context, - string $fq_class_name, - ?string $parent_fq_class_name, - array $stmts = [] - ): void { - $codebase = $statements_source->getCodebase(); - - foreach ($storage->appearing_property_ids as $property_name => $appearing_property_id) { - $property_class_name = $codebase->properties->getDeclaringClassForProperty( - $appearing_property_id, - true - ); - - if ($property_class_name === null) { - continue; - } - - $property_class_storage = $codebase->classlike_storage_provider->get($property_class_name); - - $property_storage = $property_class_storage->properties[$property_name]; - - if (isset($storage->overridden_property_ids[$property_name])) { - foreach ($storage->overridden_property_ids[$property_name] as $overridden_property_id) { - [$guide_class_name] = explode('::$', $overridden_property_id); - $guide_class_storage = $codebase->classlike_storage_provider->get($guide_class_name); - $guide_property_storage = $guide_class_storage->properties[$property_name]; - - if ($property_storage->visibility > $guide_property_storage->visibility - && $property_storage->location - ) { - IssueBuffer::maybeAdd( - new OverriddenPropertyAccess( - 'Property ' . $fq_class_name . '::$' . $property_name - . ' has different access level than ' - . $storage->name . '::$' . $property_name, - $property_storage->location - ) - ); - } - - if ((($property_storage->signature_type && !$guide_property_storage->signature_type) - || (!$property_storage->signature_type && $guide_property_storage->signature_type) - || ($property_storage->signature_type - && !$property_storage->signature_type->equals( - $guide_property_storage->signature_type - ))) - && $property_storage->location - ) { - IssueBuffer::maybeAdd( - new NonInvariantPropertyType( - 'Property ' . $fq_class_name . '::$' . $property_name - . ' has type ' - . ($property_storage->signature_type - ? $property_storage->signature_type->getId() - : '' - ) - . ", not invariant with " . $guide_class_name . '::$' - . $property_name . ' of type ' - . ($guide_property_storage->signature_type - ? $guide_property_storage->signature_type->getId() - : '' - ), - $property_storage->location - ), - $property_storage->suppressed_issues - ); - } - - if ($property_storage->type === null) { - // Property type not set, no need to check for docblock invariance - continue; - } - - $property_type = clone $property_storage->type; - - $guide_property_type = $guide_property_storage->type === null - ? Type::getMixed() - : clone $guide_property_storage->type; - - // Set upper bounds for all templates - $lower_bounds = []; - $extended_templates = $storage->template_extended_params ?? []; - foreach ($extended_templates as $et_name => $et_array) { - foreach ($et_array as $et_class_name => $extended_template) { - if (!isset($lower_bounds[$et_class_name][$et_name])) { - $lower_bounds[$et_class_name][$et_name] = $extended_template; - } - } - } - - // Get actual types used for templates (to support @template-covariant) - $template_standins = new TemplateResult($lower_bounds, []); - TemplateStandinTypeReplacer::replace( - $guide_property_type, - $template_standins, - $codebase, - null, - $property_type - ); - - // Iterate over parent classes to find template-covariants, and replace the upper bound with the - // standin. Since @template-covariant allows child classes, we want to use the standin type - // instead of the template extended type. - $parent_class = $storage->parent_class; - while ($parent_class !== null) { - $parent_storage = $codebase->classlike_storage_provider->get($parent_class); - foreach ($parent_storage->template_covariants ?? [] as $pt_offset => $covariant) { - if ($covariant) { - // If template_covariants is set template_types should also be set - assert($parent_storage->template_types !== null); - $pt_name = array_keys($parent_storage->template_types)[$pt_offset]; - if (isset($template_standins->lower_bounds[$pt_name][$parent_class])) { - $lower_bounds[$pt_name][$parent_class] = - TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $template_standins->lower_bounds[$pt_name][$parent_class], - $codebase - ); - } - } - } - $parent_class = $parent_storage->parent_class; - } - - $template_result = new TemplateResult([], $lower_bounds); - - TemplateInferredTypeReplacer::replace( - $guide_property_type, - $template_result, - $codebase - ); - TemplateInferredTypeReplacer::replace( - $property_type, - $template_result, - $codebase - ); - - if ($property_storage->location - && !$property_type->equals($guide_property_type, false) - && $guide_class_storage->user_defined - ) { - IssueBuffer::maybeAdd( - new NonInvariantDocblockPropertyType( - 'Property ' . $fq_class_name . '::$' . $property_name - . ' has type ' . $property_type->getId() - . ", not invariant with " . $guide_class_name . '::$' - . $property_name . ' of type ' - . $guide_property_type->getId(), - $property_storage->location - ), - $property_storage->suppressed_issues - ); - } - } - } - - if ($property_storage->type) { - $property_type = clone $property_storage->type; - - if (!$property_type->isMixed() - && !$property_storage->is_promoted - && !$property_storage->has_default - && !($property_type->isNullable() && $property_type->from_docblock) - ) { - $property_type->initialized = false; - $property_type->from_property = true; - $property_type->from_static_property = $property_storage->is_static === true; - } - } else { - $property_type = Type::getMixed(); - - if (!$property_storage->has_default && !$property_storage->is_promoted) { - $property_type->initialized = false; - $property_type->from_property = true; - $property_type->from_static_property = $property_storage->is_static === true; - } - } - - $property_type_location = $property_storage->type_location; - - $fleshed_out_type = !$property_type->isMixed() - ? TypeExpander::expandUnion( - $codebase, - $property_type, - $fq_class_name, - $fq_class_name, - $parent_fq_class_name, - true, - false, - $storage->final - ) - : $property_type; - - $class_template_params = ClassTemplateParamCollector::collect( - $codebase, - $property_class_storage, - $storage, - null, - new TNamedObject($fq_class_name), - true - ); - - if ($class_template_params) { - $this_object_type = self::getThisObjectType( - $storage, - $fq_class_name - ); - - if (!$this_object_type instanceof TGenericObject) { - $type_params = []; - - foreach ($class_template_params as $type_map) { - $type_params[] = clone array_values($type_map)[0]; - } - - $this_object_type = new TGenericObject($this_object_type->value, $type_params); - } - - $fleshed_out_type = AtomicPropertyFetchAnalyzer::localizePropertyType( - $codebase, - $fleshed_out_type, - $this_object_type, - $storage, - $property_class_storage - ); - } - - if ($property_type_location && !$fleshed_out_type->isMixed()) { - $stmt = array_filter( - $stmts, - function ($stmt) use ($property_name): bool { - return $stmt instanceof PhpParser\Node\Stmt\Property - && isset($stmt->props[0]->name->name) - && $stmt->props[0]->name->name === $property_name; - } - ); - - $suppressed = []; - if (count($stmt) > 0) { - $stmt = array_pop($stmt); - - $docComment = $stmt->getDocComment(); - if ($docComment) { - try { - $docBlock = DocComment::parsePreservingLength($docComment); - $suppressed = $docBlock->tags['psalm-suppress'] ?? []; - } catch (DocblockParseException $e) { - // do nothing to keep original behavior - } - } - } - - $fleshed_out_type->check( - $statements_source, - $property_type_location, - $storage->suppressed_issues + $statements_source->getSuppressedIssues() + $suppressed, - [], - false - ); - - if ($property_storage->signature_type) { - $union_comparison_result = new TypeComparisonResult(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $fleshed_out_type, - $property_storage->signature_type, - false, - false, - $union_comparison_result - ) && !$union_comparison_result->type_coerced_from_mixed - ) { - IssueBuffer::maybeAdd( - new MismatchingDocblockPropertyType( - 'Parameter ' - . $property_class_name . '::$' . $property_name - . ' has wrong type \'' . $fleshed_out_type . - '\', should be \'' . $property_storage->signature_type . '\'', - $property_type_location - ) - ); - } - } - } - - if ($property_storage->is_static) { - $property_id = $fq_class_name . '::$' . $property_name; - - $class_context->vars_in_scope[$property_id] = $fleshed_out_type; - } else { - $class_context->vars_in_scope['$this->' . $property_name] = $fleshed_out_type; - } - } - - foreach ($storage->pseudo_property_get_types as $property_name => $property_type) { - $property_name = substr($property_name, 1); - - if (isset($class_context->vars_in_scope['$this->' . $property_name])) { - $fleshed_out_type = !$property_type->isMixed() - ? TypeExpander::expandUnion( - $codebase, - $property_type, - $fq_class_name, - $fq_class_name, - $parent_fq_class_name - ) - : $property_type; - - $class_context->vars_in_scope['$this->' . $property_name] = $fleshed_out_type; - } - } - } - - private function checkPropertyInitialization( - Codebase $codebase, - Config $config, - ClassLikeStorage $storage, - Context $class_context, - ?Context $global_context = null, - ?MethodAnalyzer $constructor_analyzer = null - ): void { - if (!$config->reportIssueInFile('PropertyNotSetInConstructor', $this->getFilePath())) { - return; - } - - if (!isset($storage->declaring_method_ids['__construct']) - && !$config->reportIssueInFile('MissingConstructor', $this->getFilePath()) - ) { - return; - } - - $fq_class_name = $class_context->self ?: $this->fq_class_name; - $fq_class_name_lc = strtolower($fq_class_name); - - $included_file_path = $this->getFilePath(); - - $method_already_analyzed = $codebase->analyzer->isMethodAlreadyAnalyzed( - $included_file_path, - $fq_class_name_lc . '::__construct', - true - ); - - if ($method_already_analyzed && !$codebase->diff_methods) { - // this can happen when re-analysing a class that has been include()d inside another - return; - } - - /** @var PhpParser\Node\Stmt\Class_ */ - $class = $this->class; - $classlike_storage_provider = $codebase->classlike_storage_provider; - $class_storage = $classlike_storage_provider->get($fq_class_name_lc); - - $constructor_appearing_fqcln = $fq_class_name_lc; - - $uninitialized_variables = []; - $uninitialized_properties = []; - $uninitialized_typed_properties = []; - $uninitialized_private_properties = false; - - foreach ($storage->appearing_property_ids as $property_name => $appearing_property_id) { - $property_class_name = $codebase->properties->getDeclaringClassForProperty( - $appearing_property_id, - true - ); - - if ($property_class_name === null) { - continue; - } - - $property_class_storage = $classlike_storage_provider->get($property_class_name); - - $property = $property_class_storage->properties[$property_name]; - - $property_is_initialized = isset($property_class_storage->initialized_properties[$property_name]); - - if ($property->is_static) { - continue; - } - - if ($property->has_default || $property_is_initialized) { - continue; - } - - if ($property->type && $property->type->from_docblock && $property->type->isNullable()) { - continue; - } - - if ($codebase->diff_methods && $method_already_analyzed && $property->location) { - [$start, $end] = $property->location->getSelectionBounds(); - - $existing_issues = $codebase->analyzer->getExistingIssuesForFile( - $this->getFilePath(), - $start, - $end, - 'PropertyNotSetInConstructor' - ); - - if ($existing_issues) { - IssueBuffer::addIssues([$this->getFilePath() => $existing_issues]); - continue; - } - } - - if ($property->location) { - $codebase->analyzer->removeExistingDataForFile( - $this->getFilePath(), - $property->location->raw_file_start, - $property->location->raw_file_end, - 'PropertyNotSetInConstructor' - ); - } - - $codebase->file_reference_provider->addMethodReferenceToMissingClassMember( - $fq_class_name_lc . '::__construct', - strtolower($property_class_name) . '::$' . $property_name - ); - - if ($property->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE) { - $uninitialized_private_properties = true; - } - - $uninitialized_variables[] = '$this->' . $property_name; - $uninitialized_properties[$property_class_name . '::$' . $property_name] = $property; - - if ($property->type && !$property->type->isMixed()) { - $uninitialized_typed_properties[$property_class_name . '::$' . $property_name] = $property; - } - } - - if (!$uninitialized_properties) { - return; - } - - if (!$storage->abstract - && !$constructor_analyzer - && isset($storage->declaring_method_ids['__construct']) - && isset($storage->appearing_method_ids['__construct']) - && $class->extends - ) { - $constructor_declaring_fqcln = $storage->declaring_method_ids['__construct']->fq_class_name; - $constructor_appearing_fqcln = $storage->appearing_method_ids['__construct']->fq_class_name; - - $constructor_class_storage = $classlike_storage_provider->get($constructor_declaring_fqcln); - - // ignore oldstyle constructors and classes without any declared properties - if ($constructor_class_storage->user_defined - && !$constructor_class_storage->stubbed - && isset($constructor_class_storage->methods['__construct']) - ) { - $constructor_storage = $constructor_class_storage->methods['__construct']; - - $fake_constructor_params = array_map( - function (FunctionLikeParameter $param): PhpParser\Node\Param { - $fake_param = (new PhpParser\Builder\Param($param->name)); - if ($param->signature_type) { - $fake_param->setType((string)$param->signature_type); - } - - $node = $fake_param->getNode(); - - $attributes = $param->location - ? [ - 'startFilePos' => $param->location->raw_file_start, - 'endFilePos' => $param->location->raw_file_end, - 'startLine' => $param->location->raw_line_number - ] - : []; - - $node->setAttributes($attributes); - - return $node; - }, - $constructor_storage->params - ); - - $fake_constructor_stmt_args = array_map( - function (FunctionLikeParameter $param): PhpParser\Node\Arg { - $attributes = $param->location - ? [ - 'startFilePos' => $param->location->raw_file_start, - 'endFilePos' => $param->location->raw_file_end, - 'startLine' => $param->location->raw_line_number - ] - : []; - - return new VirtualArg( - new VirtualVariable($param->name, $attributes), - false, - $param->is_variadic, - $attributes - ); - }, - $constructor_storage->params - ); - - $fake_constructor_attributes = [ - 'startLine' => $class->extends->getLine(), - 'startFilePos' => $class->extends->getAttribute('startFilePos'), - 'endFilePos' => $class->extends->getAttribute('endFilePos'), - ]; - - $fake_call_attributes = $fake_constructor_attributes - + [ - 'comments' => [new PhpParser\Comment\Doc( - '/** @psalm-suppress InaccessibleMethod */', - $class->extends->getLine(), - (int) $class->extends->getAttribute('startFilePos') - )], - ]; - - $fake_constructor_stmts = [ - new VirtualExpression( - new VirtualStaticCall( - new VirtualFullyQualified($constructor_declaring_fqcln), - new VirtualIdentifier('__construct', $fake_constructor_attributes), - $fake_constructor_stmt_args, - $fake_call_attributes - ), - $fake_call_attributes - ), - ]; - - $fake_stmt = new VirtualClassMethod( - new VirtualIdentifier('__construct'), - [ - 'type' => PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC, - 'params' => $fake_constructor_params, - 'stmts' => $fake_constructor_stmts, - ], - $fake_constructor_attributes - ); - - $codebase->analyzer->disableMixedCounts(); - - $was_collecting_initializations = $class_context->collect_initializations; - - $class_context->collect_initializations = true; - $class_context->collect_nonprivate_initializations = !$uninitialized_private_properties; - - $constructor_analyzer = $this->analyzeClassMethod( - $fake_stmt, - $storage, - $this, - $class_context, - $global_context, - true - ); - - $class_context->collect_initializations = $was_collecting_initializations; - - $codebase->analyzer->enableMixedCounts(); - } - } - - if ($constructor_analyzer) { - $method_context = clone $class_context; - $method_context->collect_initializations = true; - $method_context->collect_nonprivate_initializations = !$uninitialized_private_properties; - $method_context->self = $fq_class_name; - - $this_atomic_object_type = new TNamedObject($fq_class_name); - $this_atomic_object_type->was_static = !$storage->final; - - $method_context->vars_in_scope['$this'] = new Union([$this_atomic_object_type]); - $method_context->vars_possibly_in_scope['$this'] = true; - $method_context->calling_method_id = strtolower($fq_class_name) . '::__construct'; - - $constructor_analyzer->analyze( - $method_context, - new NodeDataProvider(), - $global_context, - true - ); - - foreach ($uninitialized_properties as $property_id => $property_storage) { - [, $property_name] = explode('::$', $property_id); - - if (!isset($method_context->vars_in_scope['$this->' . $property_name])) { - $end_type = Type::getVoid(); - $end_type->initialized = false; - } else { - $end_type = $method_context->vars_in_scope['$this->' . $property_name]; - } - - $constructor_class_property_storage = $property_storage; - - $error_location = $property_storage->location; - - if ($storage->declaring_property_ids[$property_name] !== $fq_class_name) { - $error_location = $storage->location ?: $storage->stmt_location; - } - - if ($fq_class_name_lc !== $constructor_appearing_fqcln - && $property_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE - ) { - $a_class_storage = $classlike_storage_provider->get( - $end_type->initialized_class ?: $constructor_appearing_fqcln - ); - - if (!isset($a_class_storage->declaring_property_ids[$property_name])) { - $constructor_class_property_storage = null; - } else { - $declaring_property_class = $a_class_storage->declaring_property_ids[$property_name]; - $constructor_class_property_storage = $classlike_storage_provider - ->get($declaring_property_class) - ->properties[$property_name]; - } - } - - if ($property_storage->location - && $error_location - && (!$end_type->initialized || $property_storage !== $constructor_class_property_storage) - ) { - if ($property_storage->type) { - $expected_visibility = $uninitialized_private_properties - ? 'private or final ' - : ''; - - IssueBuffer::maybeAdd( - new PropertyNotSetInConstructor( - 'Property ' . $class_storage->name . '::$' . $property_name - . ' is not defined in constructor of ' - . $this->fq_class_name . ' or in any ' . $expected_visibility - . 'methods called in the constructor', - $error_location, - $property_id - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } elseif (!$property_storage->has_default) { - if (isset($this->inferred_property_types[$property_name])) { - $this->inferred_property_types[$property_name]->addType(new TNull()); - $this->inferred_property_types[$property_name]->setFromDocblock(); - } - } - } - } - - $codebase->analyzer->setAnalyzedMethod( - $included_file_path, - $fq_class_name_lc . '::__construct', - true - ); - - return; - } - - if (!$storage->abstract && $uninitialized_typed_properties) { - foreach ($uninitialized_typed_properties as $id => $uninitialized_property) { - if ($uninitialized_property->location) { - IssueBuffer::maybeAdd( - new MissingConstructor( - $class_storage->name . ' has an uninitialized property ' . $id . - ', but no constructor', - $uninitialized_property->location, - $class_storage->name . '::' . $uninitialized_variables[0] - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - } - } - } - - /** - * @return false|null - */ - private function analyzeTraitUse( - Aliases $aliases, - PhpParser\Node\Stmt\TraitUse $stmt, - ProjectAnalyzer $project_analyzer, - ClassLikeStorage $storage, - Context $class_context, - ?Context $global_context = null, - ?MethodAnalyzer &$constructor_analyzer = null, - ?TraitAnalyzer $previous_trait_analyzer = null - ): ?bool { - $codebase = $this->getCodebase(); - - $previous_context_include_location = $class_context->include_location; - - foreach ($stmt->traits as $trait_name) { - $trait_location = new CodeLocation($this, $trait_name, null, true); - $class_context->include_location = new CodeLocation($this, $trait_name, null, true); - - $fq_trait_name = self::getFQCLNFromNameObject( - $trait_name, - $aliases - ); - - if (!$codebase->classlikes->hasFullyQualifiedTraitName($fq_trait_name, $trait_location)) { - IssueBuffer::maybeAdd( - new UndefinedTrait( - 'Trait ' . $fq_trait_name . ' does not exist', - new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - - return false; - } - - if (!$codebase->traitHasCorrectCase($fq_trait_name)) { - if (IssueBuffer::accepts( - new UndefinedTrait( - 'Trait ' . $fq_trait_name . ' has wrong casing', - new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - )) { - return false; - } - - continue; - } - - $fq_trait_name_resolved = $codebase->classlikes->getUnAliasedName($fq_trait_name); - $trait_storage = $codebase->classlike_storage_provider->get($fq_trait_name_resolved); - - if ($trait_storage->deprecated) { - IssueBuffer::maybeAdd( - new DeprecatedTrait( - 'Trait ' . $fq_trait_name . ' is deprecated', - new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - if ($trait_storage->extension_requirement !== null) { - $extension_requirement = $codebase->classlikes->getUnAliasedName( - $trait_storage->extension_requirement - ); - $extensionRequirementMet = in_array($extension_requirement, $storage->parent_classes); - - if (!$extensionRequirementMet) { - IssueBuffer::maybeAdd( - new ExtensionRequirementViolation( - $fq_trait_name . ' requires using class to extend ' . $extension_requirement - . ', but ' . $storage->name . ' does not', - new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - } - - foreach ($trait_storage->implementation_requirements as $implementation_requirement) { - $implementation_requirement = $codebase->classlikes->getUnAliasedName($implementation_requirement); - $implementationRequirementMet = in_array($implementation_requirement, $storage->class_implements); - - if (!$implementationRequirementMet) { - IssueBuffer::maybeAdd( - new ImplementationRequirementViolation( - $fq_trait_name . ' requires using class to implement ' - . $implementation_requirement . ', but ' . $storage->name . ' does not', - new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - } - - if ($storage->mutation_free && !$trait_storage->mutation_free) { - IssueBuffer::maybeAdd( - new MutableDependency( - $storage->name . ' is marked @psalm-immutable but ' . $fq_trait_name . ' is not', - new CodeLocation($previous_trait_analyzer ?? $this, $trait_name) - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - $trait_file_analyzer = $project_analyzer->getFileAnalyzerForClassLike($fq_trait_name_resolved); - $trait_node = $codebase->classlikes->getTraitNode($fq_trait_name_resolved); - $trait_aliases = $trait_storage->aliases; - if ($trait_aliases === null) { - continue; - } - - $trait_analyzer = new TraitAnalyzer( - $trait_node, - $trait_file_analyzer, - $fq_trait_name_resolved, - $trait_aliases - ); - - foreach ($trait_node->stmts as $trait_stmt) { - if ($trait_stmt instanceof PhpParser\Node\Stmt\ClassMethod) { - $trait_method_analyzer = $this->analyzeClassMethod( - $trait_stmt, - $storage, - $trait_analyzer, - $class_context, - $global_context - ); - - if ($trait_stmt->name->name === '__construct') { - $constructor_analyzer = $trait_method_analyzer; - } - } elseif ($trait_stmt instanceof PhpParser\Node\Stmt\TraitUse) { - if ($this->analyzeTraitUse( - $trait_aliases, - $trait_stmt, - $project_analyzer, - $storage, - $class_context, - $global_context, - $constructor_analyzer, - $trait_analyzer - ) === false) { - return false; - } - } - } - - $trait_file_analyzer->clearSourceBeforeDestruction(); - } - - $class_context->include_location = $previous_context_include_location; - - return null; - } - - private function analyzeProperty( - SourceAnalyzer $source, - PhpParser\Node\Stmt\Property $stmt, - Context $context - ): void { - $fq_class_name = $source->getFQCLN(); - $property_name = $stmt->props[0]->name->name; - - $codebase = $this->getCodebase(); - - $property_id = $fq_class_name . '::$' . $property_name; - - $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( - $property_id, - true - ); - - if (!$declaring_property_class) { - return; - } - - $fq_class_name = $declaring_property_class; - - // gets inherited property type - $class_property_type = $codebase->properties->getPropertyType($property_id, false, $source, $context); - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $property_storage = $class_storage->properties[$property_name]; - - AttributesAnalyzer::analyze( - $source, - $context, - $property_storage, - $stmt->attrGroups, - AttributesAnalyzer::TARGET_PROPERTY, - $property_storage->suppressed_issues + $this->getSuppressedIssues() - ); - - if ($class_property_type && ($property_storage->type_location || !$codebase->alter_code)) { - return; - } - - $message = 'Property ' . $property_id . ' does not have a declared type'; - - $suggested_type = $property_storage->suggested_type; - - if (isset($this->inferred_property_types[$property_name])) { - $suggested_type = Type::combineUnionTypes( - $suggested_type, - $this->inferred_property_types[$property_name] ?? null, - $codebase - ); - } - - if ($suggested_type && !$property_storage->has_default && $property_storage->is_static) { - $suggested_type->addType(new TNull()); - } - - if ($suggested_type && !$suggested_type->isNull()) { - $message .= ' - consider ' . str_replace( - ['', ''], - '', - (string)$suggested_type - ); - } - - $project_analyzer = ProjectAnalyzer::getInstance(); - - if ($codebase->alter_code - && $source === $this - && isset($project_analyzer->getIssuesToFix()['MissingPropertyType']) - && !in_array('MissingPropertyType', $this->getSuppressedIssues()) - && $suggested_type - ) { - if ($suggested_type->hasMixed() || $suggested_type->isNull()) { - return; - } - - self::addOrUpdatePropertyType( - $project_analyzer, - $stmt, - $suggested_type, - $this, - $suggested_type->from_docblock - ); - - return; - } - - IssueBuffer::maybeAdd( - new MissingPropertyType( - $message, - new CodeLocation($source, $stmt->props[0]->name), - $property_id - ), - $this->source->getSuppressedIssues() + $property_storage->suppressed_issues - ); - } - - private static function addOrUpdatePropertyType( - ProjectAnalyzer $project_analyzer, - PhpParser\Node\Stmt\Property $property, - Union $inferred_type, - StatementsSource $source, - bool $docblock_only = false - ): void { - $manipulator = PropertyDocblockManipulator::getForProperty( - $project_analyzer, - $source->getFilePath(), - $property - ); - - $codebase = $project_analyzer->getCodebase(); - - $allow_native_type = !$docblock_only - && $codebase->php_major_version >= 7 - && ($codebase->php_major_version > 7 || $codebase->php_minor_version >= 4) - && $codebase->allow_backwards_incompatible_changes; - - $manipulator->setType( - $allow_native_type - ? (string) $inferred_type->toPhpString( - $source->getNamespace(), - $source->getAliasedClassesFlipped(), - $source->getFQCLN(), - $codebase->php_major_version, - $codebase->php_minor_version - ) : null, - $inferred_type->toNamespacedString( - $source->getNamespace(), - $source->getAliasedClassesFlipped(), - $source->getFQCLN(), - false - ), - $inferred_type->toNamespacedString( - $source->getNamespace(), - $source->getAliasedClassesFlipped(), - $source->getFQCLN(), - true - ), - $inferred_type->canBeFullyExpressedInPhp($codebase->php_major_version, $codebase->php_minor_version) - ); - } - - private function analyzeClassMethod( - PhpParser\Node\Stmt\ClassMethod $stmt, - ClassLikeStorage $class_storage, - SourceAnalyzer $source, - Context $class_context, - ?Context $global_context = null, - bool $is_fake = false - ): ?MethodAnalyzer { - $config = Config::getInstance(); - - if ($stmt->stmts === null && !$stmt->isAbstract()) { - IssueBuffer::maybeAdd( - new ParseError( - 'Non-abstract class method must have statements', - new CodeLocation($this, $stmt) - ) - ); - - return null; - } - - try { - $method_analyzer = new MethodAnalyzer($stmt, $source); - } catch (UnexpectedValueException $e) { - IssueBuffer::maybeAdd( - new ParseError( - 'Problem loading method: ' . $e->getMessage(), - new CodeLocation($this, $stmt) - ) - ); - - return null; - } - - $actual_method_id = $method_analyzer->getMethodId(); - - $project_analyzer = $source->getProjectAnalyzer(); - $codebase = $source->getCodebase(); - - $analyzed_method_id = $actual_method_id; - - $included_file_path = $source->getFilePath(); - - if ($class_context->self && strtolower($class_context->self) !== strtolower((string) $source->getFQCLN())) { - $analyzed_method_id = $method_analyzer->getMethodId($class_context->self); - - $declaring_method_id = $codebase->methods->getDeclaringMethodId($analyzed_method_id); - - if ((string) $actual_method_id !== (string) $declaring_method_id) { - // the method is an abstract trait method - - $declaring_method_storage = $method_analyzer->getFunctionLikeStorage(); - - if (!$declaring_method_storage instanceof MethodStorage) { - throw new LogicException('This should never happen'); - } - - if ($declaring_method_id && $declaring_method_storage->abstract) { - $implementer_method_storage = $codebase->methods->getStorage($declaring_method_id); - $declaring_storage = $codebase->classlike_storage_provider->get( - $actual_method_id->fq_class_name - ); - - MethodComparator::compare( - $codebase, - null, - $class_storage, - $declaring_storage, - $implementer_method_storage, - $declaring_method_storage, - $this->fq_class_name, - $implementer_method_storage->visibility, - new CodeLocation($source, $stmt), - $implementer_method_storage->suppressed_issues, - false - ); - } - - return null; - } - } - - $trait_safe_method_id = strtolower((string) $analyzed_method_id); - - $actual_method_id_str = strtolower((string) $actual_method_id); - - if ($actual_method_id_str !== $trait_safe_method_id) { - $trait_safe_method_id .= '&' . $actual_method_id_str; - } - - $method_already_analyzed = $codebase->analyzer->isMethodAlreadyAnalyzed( - $included_file_path, - $trait_safe_method_id - ); - - $start = (int)$stmt->getAttribute('startFilePos'); - $end = (int)$stmt->getAttribute('endFilePos'); - - $comments = $stmt->getComments(); - - if ($comments) { - $start = $comments[0]->getStartFilePos(); - } - - if ($codebase->diff_methods - && $method_already_analyzed - && !$class_context->collect_initializations - && !$class_context->collect_mutations - && !$is_fake - ) { - $project_analyzer->progress->debug( - 'Skipping analysis of pre-analyzed method ' . $analyzed_method_id . "\n" - ); - - $existing_issues = $codebase->analyzer->getExistingIssuesForFile( - $source->getFilePath(), - $start, - $end - ); - - IssueBuffer::addIssues([$source->getFilePath() => $existing_issues]); - - return $method_analyzer; - } - - $codebase->analyzer->removeExistingDataForFile( - $source->getFilePath(), - $start, - $end - ); - - $method_context = clone $class_context; - - foreach ($method_context->vars_in_scope as $context_var_id => $context_type) { - $method_context->vars_in_scope[$context_var_id] = clone $context_type; - - if ($context_type->from_property && $stmt->name->name !== '__construct') { - $method_context->vars_in_scope[$context_var_id]->initialized = true; - } - } - - $method_context->collect_exceptions = $config->check_for_throws_docblock; - - $type_provider = new NodeDataProvider(); - - $method_analyzer->analyze( - $method_context, - $type_provider, - $global_context ? clone $global_context : null - ); - - if ($stmt->name->name !== '__construct' - && $config->reportIssueInFile('InvalidReturnType', $source->getFilePath()) - && $class_context->self - ) { - self::analyzeClassMethodReturnType( - $stmt, - $method_analyzer, - $source, - $type_provider, - $codebase, - $class_storage, - $class_context->self, - $analyzed_method_id, - $actual_method_id, - $method_context->has_returned - ); - } - - if (!$method_already_analyzed - && !$class_context->collect_initializations - && !$class_context->collect_mutations - && !$is_fake - ) { - $codebase->analyzer->setAnalyzedMethod($included_file_path, $trait_safe_method_id); - } - - return $method_analyzer; - } - - private static function getThisObjectType( - ClassLikeStorage $class_storage, - string $original_fq_classlike_name - ): TNamedObject { - if ($class_storage->template_types) { - $template_params = []; - - foreach ($class_storage->template_types as $param_name => $template_map) { - $key = array_keys($template_map)[0]; - - $template_params[] = new Union([ - new TTemplateParam( - $param_name, - reset($template_map), - $key - ) - ]); - } - - return new TGenericObject( - $original_fq_classlike_name, - $template_params - ); - } - - return new TNamedObject($original_fq_classlike_name); - } - - public static function analyzeClassMethodReturnType( - PhpParser\Node\Stmt\ClassMethod $stmt, - MethodAnalyzer $method_analyzer, - SourceAnalyzer $source, - NodeDataProvider $type_provider, - Codebase $codebase, - ClassLikeStorage $class_storage, - string $fq_classlike_name, - MethodIdentifier $analyzed_method_id, - MethodIdentifier $actual_method_id, - bool $did_explicitly_return - ): void { - $secondary_return_type_location = null; - - $actual_method_storage = $codebase->methods->getStorage($actual_method_id); - - $return_type_location = $codebase->methods->getMethodReturnTypeLocation( - $actual_method_id, - $secondary_return_type_location - ); - - $original_fq_classlike_name = $fq_classlike_name; - - $return_type = $codebase->methods->getMethodReturnType( - $analyzed_method_id, - $fq_classlike_name, - $method_analyzer - ); - - if ($return_type && $class_storage->template_extended_params) { - $declaring_method_id = $codebase->methods->getDeclaringMethodId($analyzed_method_id); - - if ($declaring_method_id) { - $declaring_class_name = $declaring_method_id->fq_class_name; - - $class_storage = $codebase->classlike_storage_provider->get($declaring_class_name); - } - - $this_object_type = self::getThisObjectType( - $class_storage, - $original_fq_classlike_name - ); - - $class_template_params = ClassTemplateParamCollector::collect( - $codebase, - $class_storage, - $codebase->classlike_storage_provider->get($original_fq_classlike_name), - strtolower($stmt->name->name), - $this_object_type - ) ?: []; - - $template_result = new TemplateResult( - $class_template_params ?: [], - [] - ); - - $return_type = TemplateStandinTypeReplacer::replace( - $return_type, - $template_result, - $codebase, - null, - null, - null, - $original_fq_classlike_name - ); - } - - $overridden_method_ids = $class_storage->overridden_method_ids[strtolower($stmt->name->name)] ?? []; - - if (!$return_type - && !$class_storage->is_interface - && $overridden_method_ids - ) { - foreach ($overridden_method_ids as $interface_method_id) { - $interface_class = $interface_method_id->fq_class_name; - - if (!$codebase->classlikes->interfaceExists($interface_class)) { - continue; - } - - $interface_return_type = $codebase->methods->getMethodReturnType( - $interface_method_id, - $interface_class - ); - - $interface_return_type_location = $codebase->methods->getMethodReturnTypeLocation( - $interface_method_id - ); - - ReturnTypeAnalyzer::verifyReturnType( - $stmt, - $stmt->getStmts() ?: [], - $source, - $type_provider, - $method_analyzer, - $interface_return_type, - $interface_class, - $original_fq_classlike_name, - $interface_return_type_location, - [$analyzed_method_id->__toString()], - $did_explicitly_return - ); - } - } - - $overridden_method_ids = array_map( - function ($method_id) { - return $method_id->__toString(); - }, - $overridden_method_ids - ); - - if ($actual_method_storage->overridden_downstream) { - $overridden_method_ids['overridden::downstream'] = 'overridden::downstream'; - } - - - ReturnTypeAnalyzer::verifyReturnType( - $stmt, - $stmt->getStmts() ?: [], - $source, - $type_provider, - $method_analyzer, - $return_type, - $fq_classlike_name, - $original_fq_classlike_name, - $return_type_location, - $overridden_method_ids, - $did_explicitly_return - ); - } - - private function checkTemplateParams( - Codebase $codebase, - ClassLikeStorage $storage, - ClassLikeStorage $parent_storage, - CodeLocation $code_location, - int $given_param_count - ): void { - $expected_param_count = $parent_storage->template_types === null - ? 0 - : count($parent_storage->template_types); - - if ($expected_param_count > $given_param_count) { - IssueBuffer::maybeAdd( - new MissingTemplateParam( - $storage->name . ' has missing template params when extending ' . $parent_storage->name - . ' , expecting ' . $expected_param_count, - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } elseif ($expected_param_count < $given_param_count) { - IssueBuffer::maybeAdd( - new TooManyTemplateParams( - $storage->name . ' has too many template params when extending ' . $parent_storage->name - . ' , expecting ' . $expected_param_count, - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - $storage_param_count = ($storage->template_types ? count($storage->template_types) : 0); - - if ($parent_storage->enforce_template_inheritance - && $expected_param_count !== $storage_param_count - ) { - if ($expected_param_count > $storage_param_count) { - IssueBuffer::maybeAdd( - new MissingTemplateParam( - $storage->name . ' requires the same number of template params as ' . $parent_storage->name - . ' but saw ' . $storage_param_count, - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new TooManyTemplateParams( - $storage->name . ' requires the same number of template params as ' . $parent_storage->name - . ' but saw ' . $storage_param_count, - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - } - - if ($parent_storage->template_types && $storage->template_extended_params) { - $i = 0; - - $previous_extended = []; - - foreach ($parent_storage->template_types as $template_name => $type_map) { - // declares the variables - foreach ($type_map as $declaring_class => $template_type) { - } - - if (isset($storage->template_extended_params[$parent_storage->name][$template_name])) { - $extended_type = $storage->template_extended_params[$parent_storage->name][$template_name]; - - if (isset($parent_storage->template_covariants[$i]) - && !$parent_storage->template_covariants[$i] - ) { - foreach ($extended_type->getAtomicTypes() as $t) { - if ($t instanceof TTemplateParam - && $storage->template_types - && $storage->template_covariants - && ($local_offset - = array_search($t->param_name, array_keys($storage->template_types))) - !== false - && !empty($storage->template_covariants[$local_offset]) - ) { - IssueBuffer::maybeAdd( - new InvalidTemplateParam( - 'Cannot extend an invariant template param ' . $template_name - . ' into a covariant context', - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - } - } - - if ($parent_storage->enforce_template_inheritance) { - foreach ($extended_type->getAtomicTypes() as $t) { - if (!$t instanceof TTemplateParam - || !isset($storage->template_types[$t->param_name]) - ) { - IssueBuffer::maybeAdd( - new InvalidTemplateParam( - 'Cannot extend a strictly-enforced parent template param ' - . $template_name - . ' with a non-template type', - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } elseif ($storage->template_types[$t->param_name][$storage->name]->getId() - !== $template_type->getId() - ) { - IssueBuffer::maybeAdd( - new InvalidTemplateParam( - 'Cannot extend a strictly-enforced parent template param ' - . $template_name - . ' with constraint ' . $template_type->getId() - . ' with a child template param ' . $t->param_name - . ' with different constraint ' - . $storage->template_types[$t->param_name][$storage->name]->getId(), - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - } - } - - if (!$template_type->isMixed()) { - $template_type_copy = clone $template_type; - - $template_result = new TemplateResult( - $previous_extended ?: [], - [] - ); - - $template_type_copy = TemplateStandinTypeReplacer::replace( - $template_type_copy, - $template_result, - $codebase, - null, - $extended_type, - null, - null - ); - - if (!UnionTypeComparator::isContainedBy($codebase, $extended_type, $template_type_copy)) { - IssueBuffer::maybeAdd( - new InvalidTemplateParam( - 'Extended template param ' . $template_name - . ' expects type ' . $template_type_copy->getId() - . ', type ' . $extended_type->getId() . ' given', - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } else { - $previous_extended[$template_name] = [ - $declaring_class => $extended_type - ]; - } - } else { - $previous_extended[$template_name] = [ - $declaring_class => $extended_type - ]; - } - } - - $i++; - } - } - } - - /** - * @param PhpParser\Node\Stmt\Class_|PhpParser\Node\Stmt\Enum_ $class - */ - private function checkImplementedInterfaces( - Context $class_context, - PhpParser\Node\Stmt $class, - Codebase $codebase, - string $fq_class_name, - ClassLikeStorage $storage - ): bool { - $classlike_storage_provider = $codebase->classlike_storage_provider; - - foreach ($class->implements as $interface_name) { - $fq_interface_name = self::getFQCLNFromNameObject( - $interface_name, - $this->source->getAliases() - ); - - $fq_interface_name_lc = strtolower($fq_interface_name); - - $codebase->analyzer->addNodeReference( - $this->getFilePath(), - $interface_name, - $codebase->classlikes->interfaceExists($fq_interface_name) - ? $fq_interface_name - : '*' - . ($interface_name instanceof PhpParser\Node\Name\FullyQualified - ? '\\' - : $this->getNamespace() . '-') - . implode('\\', $interface_name->parts) - ); - - $interface_location = new CodeLocation($this, $interface_name); - - if (self::checkFullyQualifiedClassLikeName( - $this, - $fq_interface_name, - $interface_location, - null, - null, - $this->getSuppressedIssues() - ) === false) { - return false; - } - - if ($codebase->store_node_types && $fq_class_name) { - $bounds = $interface_location->getSelectionBounds(); - - $codebase->analyzer->addOffsetReference( - $this->getFilePath(), - $bounds[0], - $bounds[1], - $fq_interface_name - ); - } - - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $this, - $interface_name, - $fq_interface_name, - null - ); - - try { - $interface_storage = $classlike_storage_provider->get($fq_interface_name); - } catch (InvalidArgumentException $e) { - return false; - } - - $code_location = new CodeLocation( - $this, - $interface_name, - $class_context->include_location, - true - ); - - if (!$interface_storage->is_interface) { - IssueBuffer::maybeAdd( - new UndefinedInterface( - $fq_interface_name . ' is not an interface', - $code_location, - $fq_interface_name - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - if (isset($storage->template_type_implements_count[$fq_interface_name_lc])) { - $this->checkTemplateParams( - $codebase, - $storage, - $interface_storage, - $code_location, - $storage->template_type_implements_count[$fq_interface_name_lc] - ); - } - } - - foreach ($storage->class_implements as $fq_interface_name_lc => $fq_interface_name) { - try { - $interface_storage = $classlike_storage_provider->get($fq_interface_name_lc); - } catch (InvalidArgumentException $e) { - return false; - } - - $code_location = new CodeLocation( - $this, - $class->name ?? $class, - $class_context->include_location, - true - ); - - if ($fq_interface_name_lc === 'traversable' - && !$storage->abstract - && !isset($storage->class_implements['iteratoraggregate']) - && !isset($storage->class_implements['iterator']) - && !isset($storage->parent_classes['pdostatement']) - && !isset($storage->parent_classes['ds\collection']) - && !isset($storage->parent_classes['domnodelist']) - && !isset($storage->parent_classes['dateperiod']) - ) { - IssueBuffer::maybeAdd( - new InvalidTraversableImplementation( - 'Traversable should be implemented by implementing IteratorAggregate or Iterator', - $code_location, - $fq_class_name - ) - ); - } - - if ($interface_storage->deprecated) { - IssueBuffer::maybeAdd( - new DeprecatedInterface( - $fq_interface_name . ' is marked deprecated', - $code_location, - $fq_interface_name - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - if ($interface_storage->external_mutation_free - && !$storage->external_mutation_free - ) { - IssueBuffer::maybeAdd( - new MissingImmutableAnnotation( - $fq_interface_name . ' is marked @psalm-immutable, but ' - . $fq_class_name . ' is not marked @psalm-immutable', - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - foreach ($interface_storage->methods as $interface_method_name_lc => $interface_method_storage) { - if ($interface_method_storage->visibility === self::VISIBILITY_PUBLIC) { - $implementer_declaring_method_id = $codebase->methods->getDeclaringMethodId( - new MethodIdentifier( - $this->fq_class_name, - $interface_method_name_lc - ) - ); - - $implementer_method_storage = null; - $implementer_classlike_storage = null; - - if ($implementer_declaring_method_id) { - $implementer_fq_class_name = $implementer_declaring_method_id->fq_class_name; - $implementer_method_storage = $codebase->methods->getStorage( - $implementer_declaring_method_id - ); - $implementer_classlike_storage = $classlike_storage_provider->get( - $implementer_fq_class_name - ); - } - - if ($storage->is_enum) { - if ($interface_method_name_lc === 'cases') { - continue; - } - if ($storage->enum_type - && in_array($interface_method_name_lc, ['from', 'tryfrom'], true) - ) { - continue; - } - } - - if (!$implementer_method_storage) { - IssueBuffer::maybeAdd( - new UnimplementedInterfaceMethod( - 'Method ' . $interface_method_name_lc . ' is not defined on class ' . - $storage->name, - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - - return true; - } - - $implementer_appearing_method_id = $codebase->methods->getAppearingMethodId( - new MethodIdentifier( - $this->fq_class_name, - $interface_method_name_lc - ) - ); - - $implementer_visibility = $implementer_method_storage->visibility; - - if ($implementer_appearing_method_id - && $implementer_appearing_method_id !== $implementer_declaring_method_id - ) { - $appearing_fq_class_name = $implementer_appearing_method_id->fq_class_name; - $appearing_method_name = $implementer_appearing_method_id->method_name; - - $appearing_class_storage = $classlike_storage_provider->get( - $appearing_fq_class_name - ); - - if (isset($appearing_class_storage->trait_visibility_map[$appearing_method_name])) { - $implementer_visibility - = $appearing_class_storage->trait_visibility_map[$appearing_method_name]; - } - } - - if ($implementer_visibility !== self::VISIBILITY_PUBLIC) { - IssueBuffer::maybeAdd( - new InaccessibleMethod( - 'Interface-defined method ' . $implementer_method_storage->cased_name - . ' must be public in ' . $storage->name, - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - - return true; - } - - if ($interface_method_storage->is_static && !$implementer_method_storage->is_static) { - IssueBuffer::maybeAdd( - new MethodSignatureMismatch( - 'Method ' . $implementer_method_storage->cased_name - . ' should be static like ' - . $storage->name . '::' . $interface_method_storage->cased_name, - $code_location - ), - $implementer_method_storage->suppressed_issues - ); - - return true; - } - - if ($storage->abstract && $implementer_method_storage === $interface_method_storage) { - continue; - } - - MethodComparator::compare( - $codebase, - null, - $implementer_classlike_storage ?? $storage, - $interface_storage, - $implementer_method_storage, - $interface_method_storage, - $this->fq_class_name, - $implementer_visibility, - $code_location, - $implementer_method_storage->suppressed_issues, - false - ); - } - } - } - - return true; - } - - private function checkParentClass( - Class_ $class, - PhpParser\Node\Name $extended_class, - string $fq_class_name, - string $parent_fq_class_name, - ClassLikeStorage $storage, - Codebase $codebase, - ?Context $class_context - ): void { - $classlike_storage_provider = $codebase->classlike_storage_provider; - - if (!$parent_fq_class_name) { - throw new UnexpectedValueException('Parent class should be filled in for ' . $fq_class_name); - } - - $parent_reference_location = new CodeLocation($this, $extended_class); - - if (self::checkFullyQualifiedClassLikeName( - $this->getSource(), - $parent_fq_class_name, - $parent_reference_location, - null, - null, - $storage->suppressed_issues + $this->getSuppressedIssues() - ) === false) { - return; - } - - if ($codebase->alter_code && $codebase->classes_to_move) { - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $this, - $extended_class, - $parent_fq_class_name, - null - ); - } - - try { - $parent_class_storage = $classlike_storage_provider->get($parent_fq_class_name); - - $code_location = new CodeLocation( - $this, - $extended_class, - $class_context->include_location ?? null, - true - ); - - if ($parent_class_storage->is_trait || $parent_class_storage->is_interface) { - IssueBuffer::maybeAdd( - new UndefinedClass( - $parent_fq_class_name . ' is not a class', - $code_location, - $parent_fq_class_name . ' as class' - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - if ($parent_class_storage->final) { - IssueBuffer::maybeAdd( - new InvalidExtendClass( - 'Class ' . $fq_class_name . ' may not inherit from final class ' . $parent_fq_class_name, - $code_location, - $fq_class_name - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - if ($parent_class_storage->deprecated) { - IssueBuffer::maybeAdd( - new DeprecatedClass( - $parent_fq_class_name . ' is marked deprecated', - $code_location, - $parent_fq_class_name - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - if (!NamespaceAnalyzer::isWithinAny($fq_class_name, $parent_class_storage->internal)) { - IssueBuffer::maybeAdd( - new InternalClass( - $parent_fq_class_name . ' is internal to ' - . InternalClass::listToPhrase($parent_class_storage->internal) - . ' but called from ' . $fq_class_name, - $code_location, - $parent_fq_class_name - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - if ($parent_class_storage->external_mutation_free - && !$storage->external_mutation_free - ) { - IssueBuffer::maybeAdd( - new MissingImmutableAnnotation( - $parent_fq_class_name . ' is marked @psalm-immutable, but ' - . $fq_class_name . ' is not marked @psalm-immutable', - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - if ($storage->mutation_free - && !$parent_class_storage->mutation_free - ) { - IssueBuffer::maybeAdd( - new MutableDependency( - $fq_class_name . ' is marked @psalm-immutable but ' . $parent_fq_class_name . ' is not', - $code_location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - - if ($codebase->store_node_types) { - $codebase->analyzer->addNodeReference( - $this->getFilePath(), - $extended_class, - $codebase->classlikes->classExists($parent_fq_class_name) - ? $parent_fq_class_name - : '*' - . ($extended_class instanceof PhpParser\Node\Name\FullyQualified - ? '\\' - : $this->getNamespace() . '-') - . implode('\\', $extended_class->parts) - ); - } - - if ($storage->template_extended_count !== null || $parent_class_storage->enforce_template_inheritance) { - $code_location = new CodeLocation( - $this, - $class->name ?: $class, - $class_context->include_location ?? null, - true - ); - - $this->checkTemplateParams( - $codebase, - $storage, - $parent_class_storage, - $code_location, - $storage->template_extended_count ?? 0 - ); - } - } catch (InvalidArgumentException $e) { - // do nothing - } - } - - private function checkEnum(): void - { - $storage = $this->storage; - - $seen_values = []; - foreach ($storage->enum_cases as $case_storage) { - if ($case_storage->value !== null && $storage->enum_type === null) { - if (IssueBuffer::accepts( - new InvalidEnumCaseValue( - 'Case of a non-backed enum should not have a value', - $case_storage->stmt_location, - $storage->name - ) - )) { - } - } elseif ($case_storage->value === null && $storage->enum_type !== null) { - if (IssueBuffer::accepts( - new InvalidEnumCaseValue( - 'Case of a backed enum should have a value', - $case_storage->stmt_location, - $storage->name - ) - )) { - } - } elseif ($case_storage->value !== null && $storage->enum_type !== null) { - if ((is_int($case_storage->value) && $storage->enum_type === 'string') - || (is_string($case_storage->value) && $storage->enum_type === 'int') - ) { - if (IssueBuffer::accepts( - new InvalidEnumCaseValue( - 'Enum case value type should be ' . $storage->enum_type, - $case_storage->stmt_location, - $storage->name - ) - )) { - } - } - } - - if ($case_storage->value !== null) { - if (in_array($case_storage->value, $seen_values, true)) { - if (IssueBuffer::accepts( - new DuplicateEnumCaseValue( - 'Enum case values should be unique', - $case_storage->stmt_location, - $storage->name - ) - )) { - } - } else { - $seen_values[] = $case_storage->value; - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php deleted file mode 100644 index 0b4934e8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php +++ /dev/null @@ -1,648 +0,0 @@ - 'int', - 'string' => 'string', - 'float' => 'float', - 'bool' => 'bool', - 'false' => 'false', - 'object' => 'object', - 'empty' => 'empty', - 'callable' => 'callable', - 'array' => 'array', - 'iterable' => 'iterable', - 'null' => 'null', - 'mixed' => 'mixed', - ]; - - public const GETTYPE_TYPES = [ - 'boolean' => true, - 'integer' => true, - 'double' => true, - 'string' => true, - 'array' => true, - 'object' => true, - 'resource' => true, - 'resource (closed)' => true, - 'NULL' => true, - 'unknown type' => true, - ]; - - /** - * @var PhpParser\Node\Stmt\ClassLike - */ - protected $class; - - /** @var FileAnalyzer */ - public $file_analyzer; - - /** - * @var string - */ - protected $fq_class_name; - - /** - * The parent class - * - * @var string|null - */ - protected $parent_fq_class_name; - - /** - * @var PhpParser\Node\Stmt[] - */ - protected $leftover_stmts = []; - - /** @var ClassLikeStorage */ - protected $storage; - - public function __construct(PhpParser\Node\Stmt\ClassLike $class, SourceAnalyzer $source, string $fq_class_name) - { - $this->class = $class; - $this->source = $source; - $this->file_analyzer = $source->getFileAnalyzer(); - $this->fq_class_name = $fq_class_name; - $codebase = $source->getCodebase(); - $this->storage = $codebase->classlike_storage_provider->get($fq_class_name); - } - - public function __destruct() - { - unset($this->source); - unset($this->file_analyzer); - } - - public function getMethodMutations( - string $method_name, - Context $context - ): void { - $project_analyzer = $this->getFileAnalyzer()->project_analyzer; - $codebase = $project_analyzer->getCodebase(); - - foreach ($this->class->stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod && - strtolower($stmt->name->name) === strtolower($method_name) - ) { - $method_analyzer = new MethodAnalyzer($stmt, $this); - - $method_analyzer->analyze($context, new NodeDataProvider(), null, true); - - $context->clauses = []; - } elseif ($stmt instanceof PhpParser\Node\Stmt\TraitUse) { - foreach ($stmt->traits as $trait) { - $fq_trait_name = self::getFQCLNFromNameObject( - $trait, - $this->source->getAliases() - ); - - $trait_file_analyzer = $project_analyzer->getFileAnalyzerForClassLike($fq_trait_name); - $trait_node = $codebase->classlikes->getTraitNode($fq_trait_name); - $trait_storage = $codebase->classlike_storage_provider->get($fq_trait_name); - $trait_aliases = $trait_storage->aliases; - - if ($trait_aliases === null) { - continue; - } - - $trait_analyzer = new TraitAnalyzer( - $trait_node, - $trait_file_analyzer, - $fq_trait_name, - $trait_aliases - ); - - foreach ($trait_node->stmts as $trait_stmt) { - if ($trait_stmt instanceof PhpParser\Node\Stmt\ClassMethod && - strtolower($trait_stmt->name->name) === strtolower($method_name) - ) { - $method_analyzer = new MethodAnalyzer($trait_stmt, $trait_analyzer); - - $actual_method_id = $method_analyzer->getMethodId(); - - if ($context->self && $context->self !== $this->fq_class_name) { - $analyzed_method_id = $method_analyzer->getMethodId($context->self); - $declaring_method_id = $codebase->methods->getDeclaringMethodId($analyzed_method_id); - - if ((string) $actual_method_id !== (string) $declaring_method_id) { - break; - } - } - - $method_analyzer->analyze( - $context, - new NodeDataProvider(), - null, - true - ); - } - } - - $trait_file_analyzer->clearSourceBeforeDestruction(); - } - } - } - } - - public function getFunctionLikeAnalyzer(string $method_name): ?MethodAnalyzer - { - foreach ($this->class->stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod && - strtolower($stmt->name->name) === strtolower($method_name) - ) { - return new MethodAnalyzer($stmt, $this); - } - } - - return null; - } - - /** - * @param array $suppressed_issues - */ - public static function checkFullyQualifiedClassLikeName( - StatementsSource $statements_source, - string $fq_class_name, - CodeLocation $code_location, - ?string $calling_fq_class_name, - ?string $calling_method_id, - array $suppressed_issues, - ?ClassLikeNameOptions $options = null - ): ?bool { - if ($options === null) { - $options = new ClassLikeNameOptions(); - } - - $codebase = $statements_source->getCodebase(); - if ($fq_class_name === '') { - if (IssueBuffer::accepts( - new UndefinedClass( - 'Class or interface does not exist', - $code_location, - 'empty string' - ), - $suppressed_issues - )) { - return false; - } - - return null; - } - - $fq_class_name = preg_replace('/^\\\/', '', $fq_class_name); - - if (in_array($fq_class_name, ['callable', 'iterable', 'self', 'static', 'parent'], true)) { - return true; - } - - if (preg_match( - '/(^|\\\)(int|float|bool|string|void|null|false|true|object|mixed)$/i', - $fq_class_name - ) || strtolower($fq_class_name) === 'resource' - ) { - $class_name_parts = explode('\\', $fq_class_name); - $class_name = array_pop($class_name_parts); - - IssueBuffer::maybeAdd( - new ReservedWord( - $class_name . ' is a reserved word', - $code_location, - $class_name - ), - $suppressed_issues - ); - - return null; - } - - $class_exists = $codebase->classlikes->classExists( - $fq_class_name, - !$options->inferred ? $code_location : null, - $calling_fq_class_name, - $calling_method_id - ); - - $interface_exists = $codebase->classlikes->interfaceExists( - $fq_class_name, - !$options->inferred ? $code_location : null, - $calling_fq_class_name, - $calling_method_id - ); - - $enum_exists = $codebase->classlikes->enumExists( - $fq_class_name, - !$options->inferred ? $code_location : null, - $calling_fq_class_name, - $calling_method_id - ); - - if (!$class_exists - && !($interface_exists && $options->allow_interface) - && !($enum_exists && $options->allow_enum) - ) { - if (!$options->allow_trait || !$codebase->classlikes->traitExists($fq_class_name, $code_location)) { - if ($options->from_docblock) { - if (IssueBuffer::accepts( - new UndefinedDocblockClass( - 'Docblock-defined class, interface or enum named ' . $fq_class_name . ' does not exist', - $code_location, - $fq_class_name - ), - $suppressed_issues - )) { - return false; - } - } elseif ($options->from_attribute) { - if (IssueBuffer::accepts( - new UndefinedAttributeClass( - 'Attribute class ' . $fq_class_name . ' does not exist', - $code_location, - $fq_class_name - ), - $suppressed_issues - )) { - return false; - } - } else { - if (IssueBuffer::accepts( - new UndefinedClass( - 'Class, interface or enum named ' . $fq_class_name . ' does not exist', - $code_location, - $fq_class_name - ), - $suppressed_issues - )) { - return false; - } - } - } - - return null; - } - - $aliased_name = $codebase->classlikes->getUnAliasedName( - $fq_class_name - ); - - try { - $class_storage = $codebase->classlike_storage_provider->get($aliased_name); - } catch (InvalidArgumentException $e) { - if (!$options->inferred) { - throw $e; - } - - return null; - } - - foreach ($class_storage->invalid_dependencies as $dependency_class_name) { - // if the implemented/extended class is stubbed, it may not yet have - // been hydrated - if ($codebase->classlike_storage_provider->has($dependency_class_name)) { - continue; - } - - if (IssueBuffer::accepts( - new MissingDependency( - $fq_class_name . ' depends on class or interface ' - . $dependency_class_name . ' that does not exist', - $code_location, - $fq_class_name - ), - $suppressed_issues - )) { - return false; - } - } - - if (!$options->inferred) { - if (($class_exists && !$codebase->classHasCorrectCasing($fq_class_name)) - || ($interface_exists && !$codebase->interfaceHasCorrectCasing($fq_class_name)) - || ($enum_exists && !$codebase->classlikes->enumHasCorrectCasing($fq_class_name)) - ) { - if ($codebase->classlikes->isUserDefined(strtolower($aliased_name))) { - IssueBuffer::maybeAdd( - new InvalidClass( - 'Class, interface or enum ' . $fq_class_name . ' has wrong casing', - $code_location, - $fq_class_name - ), - $suppressed_issues - ); - } - } - } - - if (!$options->inferred) { - $event = new AfterClassLikeExistenceCheckEvent( - $fq_class_name, - $code_location, - $statements_source, - $codebase, - [] - ); - - $codebase->config->eventDispatcher->dispatchAfterClassLikeExistenceCheck($event); - - $file_manipulations = $event->getFileReplacements(); - if ($file_manipulations) { - FileManipulationBuffer::add($code_location->file_path, $file_manipulations); - } - } - - return true; - } - - /** - * Gets the fully-qualified class name from a Name object - * - * - */ - public static function getFQCLNFromNameObject( - PhpParser\Node\Name $class_name, - Aliases $aliases - ): string { - /** @var string|null */ - $resolved_name = $class_name->getAttribute('resolvedName'); - - if ($resolved_name) { - return $resolved_name; - } - - if ($class_name instanceof PhpParser\Node\Name\FullyQualified) { - return implode('\\', $class_name->parts); - } - - if (in_array($class_name->parts[0], ['self', 'static', 'parent'], true)) { - return $class_name->parts[0]; - } - - return Type::getFQCLNFromString( - implode('\\', $class_name->parts), - $aliases - ); - } - - /** - * @return array - */ - public function getAliasedClassesFlipped(): array - { - if ($this->source instanceof NamespaceAnalyzer || $this->source instanceof FileAnalyzer) { - return $this->source->getAliasedClassesFlipped(); - } - - return []; - } - - /** - * @return array - */ - public function getAliasedClassesFlippedReplaceable(): array - { - if ($this->source instanceof NamespaceAnalyzer || $this->source instanceof FileAnalyzer) { - return $this->source->getAliasedClassesFlippedReplaceable(); - } - - return []; - } - - public function getFQCLN(): string - { - return $this->fq_class_name; - } - - public function getClassName(): ?string - { - return $this->class->name->name ?? null; - } - - /** - * @return array>|null - */ - public function getTemplateTypeMap(): ?array - { - return $this->storage->template_types; - } - - public function getParentFQCLN(): ?string - { - return $this->parent_fq_class_name; - } - - public function isStatic(): bool - { - return false; - } - - /** - * Gets the Psalm type from a particular value - * - * @param mixed $value - * - */ - public static function getTypeFromValue($value): Union - { - switch (gettype($value)) { - case 'boolean': - if ($value) { - return Type::getTrue(); - } - - return Type::getFalse(); - - case 'integer': - return Type::getInt(false, $value); - - case 'double': - return Type::getFloat($value); - - case 'string': - return Type::getString($value); - - case 'array': - return Type::getArray(); - - case 'NULL': - return Type::getNull(); - - default: - return Type::getMixed(); - } - } - - /** - * @param string[] $suppressed_issues - */ - public static function checkPropertyVisibility( - string $property_id, - Context $context, - SourceAnalyzer $source, - CodeLocation $code_location, - array $suppressed_issues, - bool $emit_issues = true - ): ?bool { - [$fq_class_name, $property_name] = explode('::$', $property_id); - - $codebase = $source->getCodebase(); - - if ($codebase->properties->property_visibility_provider->has($fq_class_name)) { - $property_visible = $codebase->properties->property_visibility_provider->isPropertyVisible( - $source, - $fq_class_name, - $property_name, - true, - $context, - $code_location - ); - - if ($property_visible !== null) { - return $property_visible; - } - } - - $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( - $property_id, - true - ); - $appearing_property_class = $codebase->properties->getAppearingClassForProperty( - $property_id, - true - ); - - if (!$declaring_property_class || !$appearing_property_class) { - throw new UnexpectedValueException( - 'Appearing/Declaring classes are not defined for ' . $property_id - ); - } - - // if the calling class is the same, we know the property exists, so it must be visible - if ($appearing_property_class === $context->self) { - return $emit_issues ? null : true; - } - - if ($source->getSource() instanceof TraitAnalyzer - && strtolower($declaring_property_class) === strtolower((string) $source->getFQCLN()) - ) { - return $emit_issues ? null : true; - } - - $class_storage = $codebase->classlike_storage_provider->get($declaring_property_class); - - if (!isset($class_storage->properties[$property_name])) { - throw new UnexpectedValueException('$storage should not be null for ' . $property_id); - } - - $storage = $class_storage->properties[$property_name]; - - switch ($storage->visibility) { - case self::VISIBILITY_PUBLIC: - return $emit_issues ? null : true; - - case self::VISIBILITY_PRIVATE: - if ($emit_issues && IssueBuffer::accepts( - new InaccessibleProperty( - 'Cannot access private property ' . $property_id . ' from context ' . $context->self, - $code_location - ), - $suppressed_issues - )) { - // fall through - } - - return null; - case self::VISIBILITY_PROTECTED: - if (!$context->self) { - if ($emit_issues && IssueBuffer::accepts( - new InaccessibleProperty( - 'Cannot access protected property ' . $property_id, - $code_location - ), - $suppressed_issues - )) { - // fall through - } - - return null; - } - - if ($codebase->classExtends($appearing_property_class, $context->self)) { - return $emit_issues ? null : true; - } - - if (!$codebase->classExtends($context->self, $appearing_property_class)) { - if ($emit_issues && IssueBuffer::accepts( - new InaccessibleProperty( - 'Cannot access protected property ' . $property_id . ' from context ' . $context->self, - $code_location - ), - $suppressed_issues - )) { - // fall through - } - - return null; - } - } - - return $emit_issues ? null : true; - } - - /** - * @return array - */ - public static function getClassesForFile(Codebase $codebase, string $file_path): array - { - try { - return $codebase->file_storage_provider->get($file_path)->classlikes_in_file; - } catch (InvalidArgumentException $e) { - return []; - } - } - - public function getFileAnalyzer(): FileAnalyzer - { - return $this->file_analyzer; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php deleted file mode 100644 index dff50564..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php +++ /dev/null @@ -1,40 +0,0 @@ -inferred = $inferred; - $this->allow_trait = $allow_trait; - $this->allow_interface = $allow_interface; - $this->allow_enum = $allow_enum; - $this->from_docblock = $from_docblock; - $this->from_attribute = $from_attribute; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php deleted file mode 100644 index 1b36c9be..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php +++ /dev/null @@ -1,343 +0,0 @@ - - */ -class ClosureAnalyzer extends FunctionLikeAnalyzer -{ - /** - * @param PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\ArrowFunction $function - */ - public function __construct(PhpParser\Node\FunctionLike $function, SourceAnalyzer $source) - { - $codebase = $source->getCodebase(); - - $function_id = strtolower($source->getFilePath()) - . ':' . $function->getLine() - . ':' . (int)$function->getAttribute('startFilePos') - . ':-:closure'; - - $storage = $codebase->getClosureStorage($source->getFilePath(), $function_id); - - parent::__construct($function, $source, $storage); - } - - public function getTemplateTypeMap(): ?array - { - return $this->source->getTemplateTypeMap(); - } - - /** - * @return non-empty-lowercase-string - */ - public function getClosureId(): string - { - return strtolower($this->getFilePath()) - . ':' . $this->function->getLine() - . ':' . (int)$this->function->getAttribute('startFilePos') - . ':-:closure'; - } - - /** - * @param PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\ArrowFunction $stmt - */ - public static function analyzeExpression( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\FunctionLike $stmt, - Context $context - ): bool { - $closure_analyzer = new ClosureAnalyzer($stmt, $statements_analyzer); - - if ($stmt instanceof PhpParser\Node\Expr\Closure - && self::analyzeClosureUses($statements_analyzer, $stmt, $context) === false - ) { - return false; - } - - $use_context = new Context($context->self); - - $codebase = $statements_analyzer->getCodebase(); - - if (!$statements_analyzer->isStatic()) { - if ($context->collect_mutations && - $context->self && - $codebase->classExtends( - $context->self, - (string)$statements_analyzer->getFQCLN() - ) - ) { - /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ - $use_context->vars_in_scope['$this'] = clone $context->vars_in_scope['$this']; - } elseif ($context->self) { - $this_atomic = new TNamedObject($context->self); - $this_atomic->was_static = true; - - $use_context->vars_in_scope['$this'] = new Union([$this_atomic]); - } - } - - foreach ($context->vars_in_scope as $var => $type) { - if (strpos($var, '$this->') === 0) { - $use_context->vars_in_scope[$var] = clone $type; - } - } - - if ($context->self) { - $self_class_storage = $codebase->classlike_storage_provider->get($context->self); - - ClassAnalyzer::addContextProperties( - $statements_analyzer, - $self_class_storage, - $use_context, - $context->self, - $statements_analyzer->getParentFQCLN() - ); - } - - foreach ($context->vars_possibly_in_scope as $var => $_) { - if (strpos($var, '$this->') === 0) { - $use_context->vars_possibly_in_scope[$var] = true; - } - } - - if ($stmt instanceof PhpParser\Node\Expr\Closure) { - foreach ($stmt->uses as $use) { - if (!is_string($use->var->name)) { - continue; - } - - $use_var_id = '$' . $use->var->name; - - // insert the ref into the current context if passed by ref, as whatever we're passing - // the closure to could execute it straight away. - if ($use->byRef && !$context->hasVariable($use_var_id)) { - $context->vars_in_scope[$use_var_id] = Type::getMixed(); - } - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - && $context->hasVariable($use_var_id) - ) { - $parent_nodes = $context->vars_in_scope[$use_var_id]->parent_nodes; - - foreach ($parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - new DataFlowNode('closure-use', 'closure use', null), - 'closure-use' - ); - } - } - - $use_context->vars_in_scope[$use_var_id] = - $context->hasVariable($use_var_id) && !$use->byRef - ? clone $context->vars_in_scope[$use_var_id] - : Type::getMixed(); - - if ($use->byRef) { - $use_context->vars_in_scope[$use_var_id]->by_ref = true; - } - - $use_context->vars_possibly_in_scope[$use_var_id] = true; - - foreach ($context->vars_in_scope as $var_id => $type) { - if (preg_match('/^\$' . $use->var->name . '[\[\-]/', $var_id)) { - $use_context->vars_in_scope[$var_id] = clone $type; - $use_context->vars_possibly_in_scope[$var_id] = true; - } - } - } - } else { - $traverser = new PhpParser\NodeTraverser; - - $short_closure_visitor = new ShortClosureVisitor(); - - $traverser->addVisitor($short_closure_visitor); - $traverser->traverse($stmt->getStmts()); - - foreach ($short_closure_visitor->getUsedVariables() as $use_var_id => $_) { - if ($context->hasVariable($use_var_id)) { - $use_context->vars_in_scope[$use_var_id] = clone $context->vars_in_scope[$use_var_id]; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - $parent_nodes = $context->vars_in_scope[$use_var_id]->parent_nodes; - - foreach ($parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - new DataFlowNode('closure-use', 'closure use', null), - 'closure-use' - ); - } - } - } - - $use_context->vars_possibly_in_scope[$use_var_id] = true; - } - } - - $use_context->calling_method_id = $context->calling_method_id; - - $closure_analyzer->analyze($use_context, $statements_analyzer->node_data, $context, false); - - if ($closure_analyzer->inferred_impure - && $statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - ) { - $statements_analyzer->getSource()->inferred_impure = true; - } - - if ($closure_analyzer->inferred_has_mutation - && $statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - } - - if (!$statements_analyzer->node_data->getType($stmt)) { - $statements_analyzer->node_data->setType($stmt, Type::getClosure()); - } - - return true; - } - - /** - * @return false|null - */ - public static function analyzeClosureUses( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\Closure $stmt, - Context $context - ): ?bool { - $param_names = array_map( - function (PhpParser\Node\Param $p): string { - if (!$p->var instanceof PhpParser\Node\Expr\Variable - || !is_string($p->var->name) - ) { - return ''; - } - return $p->var->name; - }, - $stmt->params - ); - - foreach ($stmt->uses as $use) { - if (!is_string($use->var->name)) { - continue; - } - - $use_var_id = '$' . $use->var->name; - - if (in_array($use->var->name, $param_names)) { - if (IssueBuffer::accepts( - new DuplicateParam( - 'Closure use duplicates param name ' . $use_var_id, - new CodeLocation($statements_analyzer->getSource(), $use->var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } - - if (!$context->hasVariable($use_var_id)) { - if ($use_var_id === '$argv' || $use_var_id === '$argc') { - continue; - } - - if ($use->byRef) { - $context->vars_in_scope[$use_var_id] = Type::getMixed(); - $context->vars_possibly_in_scope[$use_var_id] = true; - - if (!$statements_analyzer->hasVariable($use_var_id)) { - $statements_analyzer->registerVariable( - $use_var_id, - new CodeLocation($statements_analyzer, $use->var), - null - ); - } - - return null; - } - - if (!isset($context->vars_possibly_in_scope[$use_var_id])) { - if ($context->check_variables) { - if (IssueBuffer::accepts( - new UndefinedVariable( - 'Cannot find referenced variable ' . $use_var_id, - new CodeLocation($statements_analyzer->getSource(), $use->var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - return null; - } - } - - $first_appearance = $statements_analyzer->getFirstAppearance($use_var_id); - - if ($first_appearance) { - if (IssueBuffer::accepts( - new PossiblyUndefinedVariable( - 'Possibly undefined variable ' . $use_var_id . ', first seen on line ' . - $first_appearance->getLineNumber(), - new CodeLocation($statements_analyzer->getSource(), $use->var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - continue; - } - - if ($context->check_variables) { - if (IssueBuffer::accepts( - new UndefinedVariable( - 'Cannot find referenced variable ' . $use_var_id, - new CodeLocation($statements_analyzer->getSource(), $use->var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - continue; - } - } elseif ($use->byRef) { - $new_type = Type::getMixed(); - $new_type->parent_nodes = $context->vars_in_scope[$use_var_id]->parent_nodes; - - $context->remove($use_var_id); - - $context->vars_in_scope[$use_var_id] = $new_type; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php deleted file mode 100644 index 5af3a43e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php +++ /dev/null @@ -1,391 +0,0 @@ -\[\]\-\{\}:|?\\\\]*|\$[a-zA-Z_0-9_]+)'; - - /** - * @param array>|null $template_type_map - * @param array $type_aliases - * - * @throws DocblockParseException if there was a problem parsing the docblock - * - * @return list - */ - public static function getTypeFromComment( - PhpParser\Comment\Doc $comment, - FileSource $source, - Aliases $aliases, - ?array $template_type_map = null, - ?array $type_aliases = null - ): array { - $parsed_docblock = DocComment::parsePreservingLength($comment); - - return self::arrayToDocblocks( - $comment, - $parsed_docblock, - $source, - $aliases, - $template_type_map, - $type_aliases - ); - } - - /** - * @param array>|null $template_type_map - * @param array $type_aliases - * - * @return list - * - * @throws DocblockParseException if there was a problem parsing the docblock - */ - public static function arrayToDocblocks( - PhpParser\Comment\Doc $comment, - ParsedDocblock $parsed_docblock, - FileSource $source, - Aliases $aliases, - ?array $template_type_map = null, - ?array $type_aliases = null - ): array { - $var_id = null; - - $var_type_tokens = null; - $original_type = null; - - $var_comments = []; - - $comment_text = $comment->getText(); - - $var_line_number = $comment->getStartLine(); - - if (isset($parsed_docblock->combined_tags['var'])) { - foreach ($parsed_docblock->combined_tags['var'] as $offset => $var_line) { - $var_line = trim($var_line); - - if (!$var_line) { - continue; - } - - $type_start = null; - $type_end = null; - - $line_parts = self::splitDocLine($var_line); - - $line_number = $comment->getStartLine() + substr_count( - $comment_text, - "\n", - 0, - $offset - $comment->getStartFilePos() - ); - $description = $parsed_docblock->description; - - if ($line_parts[0]) { - $type_start = $offset; - $type_end = $type_start + strlen($line_parts[0]); - - $line_parts[0] = self::sanitizeDocblockType($line_parts[0]); - - if ($line_parts[0] === '' - || ($line_parts[0][0] === '$' - && !preg_match('/^\$this(\||$)/', $line_parts[0])) - ) { - throw new IncorrectDocblockException('Misplaced variable'); - } - - try { - $var_type_tokens = TypeTokenizer::getFullyQualifiedTokens( - $line_parts[0], - $aliases, - $template_type_map, - $type_aliases - ); - } catch (TypeParseTreeException $e) { - throw new DocblockParseException($line_parts[0] . ' is not a valid type'); - } - - $original_type = $line_parts[0]; - - $var_line_number = $line_number; - - if (count($line_parts) > 1) { - if ($line_parts[1][0] === '$') { - $var_id = $line_parts[1]; - $description = trim(substr($var_line, strlen($line_parts[0]) + strlen($line_parts[1]) + 2)); - } else { - $description = trim(substr($var_line, strlen($line_parts[0]) + 1)); - } - $description = preg_replace('/\\n \\*\\s+/um', ' ', $description); - } - } - - if (!$var_type_tokens || !$original_type) { - continue; - } - - try { - $defined_type = TypeParser::parseTokens( - $var_type_tokens, - null, - $template_type_map ?: [], - $type_aliases ?: [] - ); - } catch (TypeParseTreeException $e) { - throw new DocblockParseException( - $line_parts[0] . - ' is not a valid type' . - ' (from ' . - $source->getFilePath() . - ':' . - $comment->getStartLine() . - ')' - ); - } - - $defined_type->setFromDocblock(); - - $var_comment = new VarDocblockComment(); - $var_comment->type = $defined_type; - $var_comment->var_id = $var_id; - $var_comment->line_number = $var_line_number; - $var_comment->type_start = $type_start; - $var_comment->type_end = $type_end; - $var_comment->description = $description; - - self::decorateVarDocblockComment($var_comment, $parsed_docblock); - - $var_comments[] = $var_comment; - } - } - - if (!$var_comments - && (isset($parsed_docblock->tags['deprecated']) - || isset($parsed_docblock->tags['internal']) - || isset($parsed_docblock->tags['readonly']) - || isset($parsed_docblock->tags['psalm-readonly']) - || isset($parsed_docblock->tags['psalm-readonly-allow-private-mutation']) - || isset($parsed_docblock->tags['psalm-allow-private-mutation']) - || isset($parsed_docblock->tags['psalm-taint-escape']) - || isset($parsed_docblock->tags['psalm-internal']) - || isset($parsed_docblock->tags['psalm-suppress']) - || $parsed_docblock->description) - ) { - $var_comment = new VarDocblockComment(); - - self::decorateVarDocblockComment($var_comment, $parsed_docblock); - - $var_comments[] = $var_comment; - } - - return $var_comments; - } - - private static function decorateVarDocblockComment( - VarDocblockComment $var_comment, - ParsedDocblock $parsed_docblock - ): void { - $var_comment->deprecated = isset($parsed_docblock->tags['deprecated']); - $var_comment->internal = isset($parsed_docblock->tags['internal']); - $var_comment->readonly = isset($parsed_docblock->tags['readonly']) - || isset($parsed_docblock->tags['psalm-readonly']) - || isset($parsed_docblock->tags['psalm-readonly-allow-private-mutation']); - - $var_comment->allow_private_mutation - = isset($parsed_docblock->tags['psalm-allow-private-mutation']) - || isset($parsed_docblock->tags['psalm-readonly-allow-private-mutation']); - - if (!$var_comment->description) { - $var_comment->description = $parsed_docblock->description; - } - - if (isset($parsed_docblock->tags['psalm-taint-escape'])) { - foreach ($parsed_docblock->tags['psalm-taint-escape'] as $param) { - $param = trim($param); - $var_comment->removed_taints[] = $param; - } - } - - if (count($var_comment->psalm_internal = DocblockParser::handlePsalmInternal($parsed_docblock)) !== 0) { - $var_comment->internal = true; - } - - if (isset($parsed_docblock->tags['psalm-suppress'])) { - foreach ($parsed_docblock->tags['psalm-suppress'] as $offset => $suppress_entry) { - foreach (DocComment::parseSuppressList($suppress_entry) as $issue_offset => $suppressed_issue) { - $var_comment->suppressed_issues[$issue_offset + $offset] = $suppressed_issue; - } - } - } - } - - /** - * @psalm-pure - */ - public static function sanitizeDocblockType(string $docblock_type): string - { - $docblock_type = preg_replace('@^[ \t]*\*@m', '', $docblock_type); - $docblock_type = preg_replace('/,\n\s+\}/', '}', $docblock_type); - return str_replace("\n", '', $docblock_type); - } - - /** - * @throws DocblockParseException if an invalid string is found - * - * @return non-empty-list - * - * @psalm-pure - */ - public static function splitDocLine(string $return_block): array - { - $brackets = ''; - - $type = ''; - - $expects_callable_return = false; - - $return_block = str_replace("\t", ' ', $return_block); - - $quote_char = null; - $escaped = false; - - for ($i = 0, $l = strlen($return_block); $i < $l; ++$i) { - $char = $return_block[$i]; - $next_char = $i < $l - 1 ? $return_block[$i + 1] : null; - $last_char = $i > 0 ? $return_block[$i - 1] : null; - - if ($quote_char) { - if ($char === $quote_char && !$escaped) { - $quote_char = null; - - $type .= $char; - - continue; - } - - if ($char === '\\' && !$escaped && ($next_char === $quote_char || $next_char === '\\')) { - $escaped = true; - - $type .= $char; - - continue; - } - - $escaped = false; - - $type .= $char; - - continue; - } - - if ($char === '"' || $char === '\'') { - $quote_char = $char; - - $type .= $char; - - continue; - } - - if ($char === ':' && $last_char === ')') { - $expects_callable_return = true; - - $type .= $char; - - continue; - } - - if ($char === '[' || $char === '{' || $char === '(' || $char === '<') { - $brackets .= $char; - } elseif ($char === ']' || $char === '}' || $char === ')' || $char === '>') { - $last_bracket = substr($brackets, -1); - $brackets = substr($brackets, 0, -1); - - if (($char === ']' && $last_bracket !== '[') - || ($char === '}' && $last_bracket !== '{') - || ($char === ')' && $last_bracket !== '(') - || ($char === '>' && $last_bracket !== '<') - ) { - throw new DocblockParseException('Invalid string ' . $return_block); - } - } elseif ($char === ' ') { - if ($brackets) { - $expects_callable_return = false; - $type .= ' '; - continue; - } - - if ($next_char === '|' || $next_char === '&') { - $nexter_char = $i < $l - 2 ? $return_block[$i + 2] : null; - - if ($nexter_char === ' ') { - ++$i; - $type .= $next_char . ' '; - continue; - } - } - - if ($last_char === '|' || $last_char === '&') { - $type .= ' '; - continue; - } - - if ($next_char === ':') { - ++$i; - $type .= ' :'; - $expects_callable_return = true; - continue; - } - - if ($expects_callable_return) { - $type .= ' '; - $expects_callable_return = false; - continue; - } - - $remaining = trim(preg_replace('@^[ \t]*\* *@m', ' ', substr($return_block, $i + 1))); - - if ($remaining) { - return array_merge([rtrim($type)], preg_split('/[ \s]+/', $remaining)); - } - - return [$type]; - } - - $expects_callable_return = false; - - $type .= $char; - } - - return [$type]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php deleted file mode 100644 index a33ac969..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php +++ /dev/null @@ -1,90 +0,0 @@ -label = $label; - $this->line_from = $line_from; - $this->line_to = $line_to; - $this->file_name = $file_name; - $this->file_path = $file_path; - $this->snippet = $snippet; - $this->from = $from; - $this->to = $to; - $this->snippet_from = $snippet_from; - $this->column_from = $column_from; - $this->column_to = $column_to; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php deleted file mode 100644 index 0d57d4c2..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php +++ /dev/null @@ -1,682 +0,0 @@ - - */ - private $required_file_paths = []; - - /** - * @var array - */ - private $parent_file_paths = []; - - /** - * @var array - */ - private $suppressed_issues = []; - - /** - * @var array> - */ - private $namespace_aliased_classes = []; - - /** - * @var array> - */ - private $namespace_aliased_classes_flipped = []; - - /** - * @var array> - */ - private $namespace_aliased_classes_flipped_replaceable = []; - - /** - * @var array - */ - public $interface_analyzers_to_analyze = []; - - /** - * @var array - */ - public $class_analyzers_to_analyze = []; - - /** - * @var null|Context - */ - public $context; - - /** - * @var ProjectAnalyzer - */ - public $project_analyzer; - - /** - * @var Codebase - */ - public $codebase; - - /** - * @var int - */ - private $first_statement_offset = -1; - - /** @var ?NodeDataProvider */ - private $node_data; - - /** @var ?Union */ - private $return_type; - - public function __construct(ProjectAnalyzer $project_analyzer, string $file_path, string $file_name) - { - $this->source = $this; - $this->file_path = $file_path; - $this->file_name = $file_name; - $this->project_analyzer = $project_analyzer; - $this->codebase = $project_analyzer->getCodebase(); - } - - public function analyze( - ?Context $file_context = null, - ?Context $global_context = null - ): void { - $codebase = $this->project_analyzer->getCodebase(); - - $file_storage = $codebase->file_storage_provider->get($this->file_path); - - if (!$file_storage->deep_scan && !$codebase->server_mode) { - throw new UnpreparedAnalysisException('File ' . $this->file_path . ' has not been properly scanned'); - } - - if ($file_storage->has_visitor_issues) { - return; - } - - if ($file_context) { - $this->context = $file_context; - } - - if (!$this->context) { - $this->context = new Context(); - } - - if ($codebase->config->useStrictTypesForFile($this->file_path)) { - $this->context->strict_types = true; - } - - $this->context->is_global = true; - $this->context->defineGlobals(); - $this->context->collect_exceptions = $codebase->config->check_for_throws_in_global_scope; - - try { - $stmts = $codebase->getStatementsForFile($this->file_path); - } catch (PhpParser\Error $e) { - return; - } - - $event = new BeforeFileAnalysisEvent($this, $this->context, $file_storage, $codebase); - - $codebase->config->eventDispatcher->dispatchBeforeFileAnalysis($event); - - if ($codebase->alter_code) { - foreach ($stmts as $stmt) { - if (!$stmt instanceof PhpParser\Node\Stmt\Declare_) { - $this->first_statement_offset = (int) $stmt->getAttribute('startFilePos'); - break; - } - } - } - - $leftover_stmts = $this->populateCheckers($stmts); - - $this->node_data = new NodeDataProvider(); - $statements_analyzer = new StatementsAnalyzer($this, $this->node_data); - - foreach ($file_storage->docblock_issues as $docblock_issue) { - IssueBuffer::maybeAdd($docblock_issue); - } - - // if there are any leftover statements, evaluate them, - // in turn causing the classes/interfaces be evaluated - if ($leftover_stmts) { - $statements_analyzer->analyze($leftover_stmts, $this->context, $global_context, true); - - foreach ($leftover_stmts as $leftover_stmt) { - if ($leftover_stmt instanceof PhpParser\Node\Stmt\Return_) { - if ($leftover_stmt->expr) { - $this->return_type = - $statements_analyzer->node_data->getType($leftover_stmt->expr) ?? Type::getMixed(); - } else { - $this->return_type = Type::getVoid(); - } - - break; - } - } - } - - // check any leftover interfaces not already evaluated - foreach ($this->interface_analyzers_to_analyze as $interface_analyzer) { - $interface_analyzer->analyze(); - } - - // check any leftover classes not already evaluated - - foreach ($this->class_analyzers_to_analyze as $class_analyzer) { - $class_analyzer->analyze(null, $this->context); - } - - if ($codebase->config->check_for_throws_in_global_scope) { - $uncaught_throws = $statements_analyzer->getUncaughtThrows($this->context); - foreach ($uncaught_throws as $possibly_thrown_exception => $codelocations) { - foreach ($codelocations as $codelocation) { - // issues are suppressed in ThrowAnalyzer, CallAnalyzer, etc. - IssueBuffer::maybeAdd( - new UncaughtThrowInGlobalScope( - $possibly_thrown_exception . ' is thrown but not caught in global scope', - $codelocation - ) - ); - } - } - } - - // validate type imports - if ($file_storage->type_aliases) { - foreach ($file_storage->type_aliases as $alias) { - if ($alias instanceof LinkableTypeAlias) { - $location = new DocblockTypeLocation( - $this->getSource(), - $alias->start_offset, - $alias->end_offset, - $alias->line_number - ); - $fq_source_classlike = $alias->declaring_fq_classlike_name; - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $this->getSource(), - $fq_source_classlike, - $location, - null, - null, - $this->suppressed_issues, - new ClassLikeNameOptions( - true, - false, - true, - true, - true - ) - ) === false) { - continue; - } - - $referenced_class_storage = $codebase->classlike_storage_provider->get($fq_source_classlike); - if (!isset($referenced_class_storage->type_aliases[$alias->alias_name])) { - IssueBuffer::maybeAdd( - new InvalidTypeImport( - 'Type alias ' . $alias->alias_name - . ' imported from ' . $fq_source_classlike - . ' is not defined on the source class', - $location - ) - ); - } - } - } - } - - $event = new AfterFileAnalysisEvent($this, $this->context, $file_storage, $codebase, $stmts); - $codebase->config->eventDispatcher->dispatchAfterFileAnalysis($event); - - $this->class_analyzers_to_analyze = []; - $this->interface_analyzers_to_analyze = []; - } - - /** - * @param array $stmts - * - * @return list - */ - public function populateCheckers(array $stmts): array - { - $leftover_stmts = []; - - foreach ($stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\Trait_) { - $leftover_stmts[] = $stmt; - } elseif ($stmt instanceof PhpParser\Node\Stmt\ClassLike) { - $this->populateClassLikeAnalyzers($stmt); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Namespace_) { - $namespace_name = $stmt->name ? implode('\\', $stmt->name->parts) : ''; - - $namespace_analyzer = new NamespaceAnalyzer($stmt, $this); - $namespace_analyzer->collectAnalyzableInformation(); - - $this->namespace_aliased_classes[$namespace_name] = $namespace_analyzer->getAliases()->uses; - $this->namespace_aliased_classes_flipped[$namespace_name] = - $namespace_analyzer->getAliasedClassesFlipped(); - $this->namespace_aliased_classes_flipped_replaceable[$namespace_name] = - $namespace_analyzer->getAliasedClassesFlippedReplaceable(); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Use_) { - $this->visitUse($stmt); - } elseif ($stmt instanceof PhpParser\Node\Stmt\GroupUse) { - $this->visitGroupUse($stmt); - } else { - if ($stmt instanceof PhpParser\Node\Stmt\If_) { - foreach ($stmt->stmts as $if_stmt) { - if ($if_stmt instanceof PhpParser\Node\Stmt\ClassLike) { - $this->populateClassLikeAnalyzers($if_stmt); - } - } - } - - $leftover_stmts[] = $stmt; - } - } - - return $leftover_stmts; - } - - private function populateClassLikeAnalyzers(PhpParser\Node\Stmt\ClassLike $stmt): void - { - if ($stmt instanceof PhpParser\Node\Stmt\Class_ || $stmt instanceof PhpParser\Node\Stmt\Enum_) { - if (!$stmt->name) { - return; - } - - // this can happen when stubbing - if (!$this->codebase->classExists($stmt->name->name) - && !$this->codebase->classlikes->enumExists($stmt->name->name) - ) { - return; - } - - - $class_analyzer = new ClassAnalyzer($stmt, $this, $stmt->name->name); - - $fq_class_name = $class_analyzer->getFQCLN(); - - $this->class_analyzers_to_analyze[strtolower($fq_class_name)] = $class_analyzer; - } elseif ($stmt instanceof PhpParser\Node\Stmt\Interface_) { - if (!$stmt->name) { - return; - } - - // this can happen when stubbing - if (!$this->codebase->interfaceExists($stmt->name->name)) { - return; - } - - $class_analyzer = new InterfaceAnalyzer($stmt, $this, $stmt->name->name); - - $fq_class_name = $class_analyzer->getFQCLN(); - - $this->interface_analyzers_to_analyze[strtolower($fq_class_name)] = $class_analyzer; - } - } - - public function addNamespacedClassAnalyzer(string $fq_class_name, ClassAnalyzer $class_analyzer): void - { - $this->class_analyzers_to_analyze[strtolower($fq_class_name)] = $class_analyzer; - } - - public function addNamespacedInterfaceAnalyzer(string $fq_class_name, InterfaceAnalyzer $interface_analyzer): void - { - $this->interface_analyzers_to_analyze[strtolower($fq_class_name)] = $interface_analyzer; - } - - public function getMethodMutations( - MethodIdentifier $method_id, - Context $this_context, - bool $from_project_analyzer = false - ): void { - $fq_class_name = $method_id->fq_class_name; - $method_name = $method_id->method_name; - $fq_class_name_lc = strtolower($fq_class_name); - - if (isset($this->class_analyzers_to_analyze[$fq_class_name_lc])) { - $class_analyzer_to_examine = $this->class_analyzers_to_analyze[$fq_class_name_lc]; - } else { - if (!$from_project_analyzer) { - $this->project_analyzer->getMethodMutations( - $method_id, - $this_context, - $this->getRootFilePath(), - $this->getRootFileName() - ); - } - - return; - } - - $call_context = new Context($this_context->self); - $call_context->collect_mutations = $this_context->collect_mutations; - $call_context->collect_initializations = $this_context->collect_initializations; - $call_context->collect_nonprivate_initializations = $this_context->collect_nonprivate_initializations; - $call_context->initialized_methods = $this_context->initialized_methods; - $call_context->include_location = $this_context->include_location; - $call_context->calling_method_id = $this_context->calling_method_id; - - foreach ($this_context->vars_possibly_in_scope as $var => $_) { - if (strpos($var, '$this->') === 0) { - $call_context->vars_possibly_in_scope[$var] = true; - } - } - - foreach ($this_context->vars_in_scope as $var => $type) { - if (strpos($var, '$this->') === 0) { - $call_context->vars_in_scope[$var] = $type; - } - } - - if (!isset($this_context->vars_in_scope['$this'])) { - throw new UnexpectedValueException('Should exist'); - } - - $call_context->vars_in_scope['$this'] = $this_context->vars_in_scope['$this']; - - $class_analyzer_to_examine->getMethodMutations($method_name, $call_context); - - foreach ($call_context->vars_possibly_in_scope as $var => $_) { - $this_context->vars_possibly_in_scope[$var] = true; - } - - foreach ($call_context->vars_in_scope as $var => $type) { - $this_context->vars_in_scope[$var] = $type; - } - } - - public function getFunctionLikeAnalyzer(MethodIdentifier $method_id): ?MethodAnalyzer - { - $fq_class_name = $method_id->fq_class_name; - $method_name = $method_id->method_name; - - $fq_class_name_lc = strtolower($fq_class_name); - - if (!isset($this->class_analyzers_to_analyze[$fq_class_name_lc])) { - return null; - } - - $class_analyzer_to_examine = $this->class_analyzers_to_analyze[$fq_class_name_lc]; - - return $class_analyzer_to_examine->getFunctionLikeAnalyzer($method_name); - } - - public function getNamespace(): ?string - { - return null; - } - - /** - * @return array - */ - public function getAliasedClassesFlipped(?string $namespace_name = null): array - { - if ($namespace_name && isset($this->namespace_aliased_classes_flipped[$namespace_name])) { - return $this->namespace_aliased_classes_flipped[$namespace_name]; - } - - return $this->aliased_classes_flipped; - } - - /** - * @return array - */ - public function getAliasedClassesFlippedReplaceable(?string $namespace_name = null): array - { - if ($namespace_name && isset($this->namespace_aliased_classes_flipped_replaceable[$namespace_name])) { - return $this->namespace_aliased_classes_flipped_replaceable[$namespace_name]; - } - - return $this->aliased_classes_flipped_replaceable; - } - - public static function clearCache(): void - { - TypeTokenizer::clearCache(); - Reflection::clearCache(); - Functions::clearCache(); - IssueBuffer::clearCache(); - FileManipulationBuffer::clearCache(); - FunctionLikeAnalyzer::clearCache(); - ClassLikeStorageProvider::deleteAll(); - FileStorageProvider::deleteAll(); - FileReferenceProvider::clearCache(); - InternalCallMapHandler::clearCache(); - } - - public function getFileName(): string - { - return $this->file_name; - } - - public function getFilePath(): string - { - return $this->file_path; - } - - public function getRootFileName(): string - { - return $this->root_file_name ?: $this->file_name; - } - - public function getRootFilePath(): string - { - return $this->root_file_path ?: $this->file_path; - } - - public function setRootFilePath(string $file_path, string $file_name): void - { - $this->root_file_name = $file_name; - $this->root_file_path = $file_path; - } - - public function addRequiredFilePath(string $file_path): void - { - $this->required_file_paths[$file_path] = true; - } - - public function addParentFilePath(string $file_path): void - { - $this->parent_file_paths[$file_path] = true; - } - - public function hasParentFilePath(string $file_path): bool - { - return $this->file_path === $file_path || isset($this->parent_file_paths[$file_path]); - } - - public function hasAlreadyRequiredFilePath(string $file_path): bool - { - return isset($this->required_file_paths[$file_path]); - } - - /** - * @return list - */ - public function getRequiredFilePaths(): array - { - return array_keys($this->required_file_paths); - } - - /** - * @return list - */ - public function getParentFilePaths(): array - { - return array_keys($this->parent_file_paths); - } - - public function getRequireNesting(): int - { - return count($this->parent_file_paths); - } - - /** - * @return array - */ - public function getSuppressedIssues(): array - { - return $this->suppressed_issues; - } - - /** - * @param array $new_issues - */ - public function addSuppressedIssues(array $new_issues): void - { - if (isset($new_issues[0])) { - $new_issues = array_combine($new_issues, $new_issues); - } - - $this->suppressed_issues = $new_issues + $this->suppressed_issues; - } - - /** - * @param array $new_issues - */ - public function removeSuppressedIssues(array $new_issues): void - { - if (isset($new_issues[0])) { - $new_issues = array_combine($new_issues, $new_issues); - } - - $this->suppressed_issues = array_diff_key($this->suppressed_issues, $new_issues); - } - - public function getFQCLN(): ?string - { - return null; - } - - public function getParentFQCLN(): ?string - { - return null; - } - - public function getClassName(): ?string - { - return null; - } - - /** - * @return array>|null - */ - public function getTemplateTypeMap(): ?array - { - return null; - } - - public function isStatic(): bool - { - return false; - } - - /** - * @psalm-mutation-free - */ - public function getFileAnalyzer(): FileAnalyzer - { - return $this; - } - - /** - * @psalm-mutation-free - */ - public function getProjectAnalyzer(): ProjectAnalyzer - { - return $this->project_analyzer; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - public function getFirstStatementOffset(): int - { - return $this->first_statement_offset; - } - - public function getNodeTypeProvider(): NodeTypeProvider - { - if (!$this->node_data) { - throw new UnexpectedValueException('There should be a node type provider'); - } - - return $this->node_data; - } - - public function getReturnType(): ?Union - { - return $this->return_type; - } - - public function clearSourceBeforeDestruction(): void - { - unset($this->source); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php deleted file mode 100644 index c11aa47c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php +++ /dev/null @@ -1,124 +0,0 @@ - - */ -class FunctionAnalyzer extends FunctionLikeAnalyzer -{ - public function __construct(PhpParser\Node\Stmt\Function_ $function, SourceAnalyzer $source) - { - $codebase = $source->getCodebase(); - - $file_storage_provider = $codebase->file_storage_provider; - - $file_storage = $file_storage_provider->get($source->getFilePath()); - - $namespace = $source->getNamespace(); - - $function_id = ($namespace ? strtolower($namespace) . '\\' : '') . strtolower($function->name->name); - - if (!isset($file_storage->functions[$function_id])) { - throw new UnexpectedValueException( - 'Function ' . $function_id . ' should be defined in ' . $source->getFilePath() - ); - } - - $storage = $file_storage->functions[$function_id]; - - parent::__construct($function, $source, $storage); - } - - /** - * @return non-empty-lowercase-string - * @throws UnexpectedValueException if function is closure or arrow function. - */ - public function getFunctionId(): string - { - $namespace = $this->source->getNamespace(); - - /** @var non-empty-lowercase-string */ - return ($namespace ? strtolower($namespace) . '\\' : '') . strtolower($this->function->name->name); - } - - public static function analyzeStatement( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Stmt\Function_ $stmt, - Context $context - ): void { - foreach ($stmt->stmts as $function_stmt) { - if ($function_stmt instanceof PhpParser\Node\Stmt\Global_) { - foreach ($function_stmt->vars as $var) { - if ($var instanceof PhpParser\Node\Expr\Variable) { - if (is_string($var->name)) { - $var_id = '$' . $var->name; - - // registers variable in global context - $context->hasVariable($var_id); - } - } - } - } elseif (!$function_stmt instanceof PhpParser\Node\Stmt\Nop) { - break; - } - } - - $codebase = $statements_analyzer->getCodebase(); - - if (!$codebase->register_stub_files - && !$codebase->register_autoload_files - ) { - $function_name = strtolower($stmt->name->name); - - if ($ns = $statements_analyzer->getNamespace()) { - $fq_function_name = strtolower($ns) . '\\' . $function_name; - } else { - $fq_function_name = $function_name; - } - - $function_context = new Context($context->self); - $function_context->strict_types = $context->strict_types; - $config = Config::getInstance(); - $function_context->collect_exceptions = $config->check_for_throws_docblock; - - if ($function_analyzer = $statements_analyzer->getFunctionAnalyzer($fq_function_name)) { - $function_analyzer->analyze( - $function_context, - $statements_analyzer->node_data, - $context - ); - - if ($config->reportIssueInFile('InvalidReturnType', $statements_analyzer->getFilePath())) { - $method_id = $function_analyzer->getId(); - - $function_storage = $codebase->functions->getStorage( - $statements_analyzer, - strtolower($method_id) - ); - - $return_type = $function_storage->return_type; - $return_type_location = $function_storage->return_type_location; - - $function_analyzer->verifyReturnType( - $stmt->getStmts(), - $statements_analyzer, - $return_type, - $statements_analyzer->getFQCLN(), - $return_type_location, - $function_context->has_returned - ); - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php deleted file mode 100644 index d6f1d7eb..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php +++ /dev/null @@ -1,978 +0,0 @@ -getSuppressedIssues(); - $codebase = $source->getCodebase(); - $project_analyzer = $source->getProjectAnalyzer(); - - $function_like_storage = null; - - if ($source instanceof StatementsAnalyzer) { - $function_like_storage = $function_like_analyzer->getFunctionLikeStorage($source); - } elseif ($source instanceof ClassAnalyzer - || $source instanceof TraitAnalyzer - ) { - $function_like_storage = $function_like_analyzer->getFunctionLikeStorage(); - } - - $cased_method_id = $function_like_analyzer->getCorrectlyCasedMethodId(); - - if (!$function->getStmts() && - ( - $function instanceof ClassMethod && - ($source instanceof InterfaceAnalyzer || $function->isAbstract()) - ) - ) { - if (!$return_type) { - IssueBuffer::maybeAdd( - new MissingReturnType( - 'Method ' . $cased_method_id . ' does not have a return type', - new CodeLocation($function_like_analyzer, $function->name, null, true) - ), - $suppressed_issues - ); - } - - return null; - } - - $is_to_string = $function instanceof ClassMethod && strtolower($function->name->name) === '__tostring'; - - if ($function instanceof ClassMethod - && strpos($function->name->name, '__') === 0 - && !$is_to_string - && !$return_type - ) { - // do not check __construct, __set, __get, __call etc. - return null; - } - - if (!$return_type_location) { - $return_type_location = new CodeLocation( - $function_like_analyzer, - $function instanceof Closure || $function instanceof ArrowFunction ? $function : $function->name - ); - } - - $inferred_yield_types = []; - - $inferred_return_type_parts = ReturnTypeCollector::getReturnTypes( - $codebase, - $type_provider, - $function_stmts, - $inferred_yield_types, - true - ); - - if (!$inferred_return_type_parts) { - $did_explicitly_return = true; - } - - if ((!$return_type || $return_type->from_docblock) - && ScopeAnalyzer::getControlActions( - $function_stmts, - $type_provider, - $codebase->config->exit_functions, - [] - ) !== [ScopeAnalyzer::ACTION_END] - && !$inferred_yield_types - && count($inferred_return_type_parts) - && !$did_explicitly_return - ) { - // only add null if we have a return statement elsewhere and it wasn't void - foreach ($inferred_return_type_parts as $inferred_return_type_part) { - if (!$inferred_return_type_part->isVoid()) { - $atomic_null = new TNull(); - $atomic_null->from_docblock = true; - $inferred_return_type_parts[] = new Union([$atomic_null]); - break; - } - } - } - - $control_actions = ScopeAnalyzer::getControlActions( - $function_stmts, - $type_provider, - $codebase->config->exit_functions, - [], - false - ); - - $function_always_exits = $control_actions === [ScopeAnalyzer::ACTION_END]; - - $function_returns_implicitly = (bool)array_diff( - $control_actions, - [ScopeAnalyzer::ACTION_END, ScopeAnalyzer::ACTION_RETURN] - ); - - /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ - if ($return_type - && (!$return_type->from_docblock - || ($return_type->isNullable() - && !$return_type->hasTemplate() - && !$return_type->getAtomicTypes()['null']->from_docblock - ) - ) - && !$return_type->isVoid() - && !$inferred_yield_types - && (!$function_like_storage || !$function_like_storage->has_yield) - && $function_returns_implicitly - ) { - if (IssueBuffer::accepts( - new InvalidReturnType( - 'Not all code paths of ' . $cased_method_id . ' end in a return statement, return type ' - . $return_type . ' expected', - $return_type_location - ), - $suppressed_issues - )) { - return false; - } - - return null; - } - - - if ($return_type - && $return_type->isNever() - && !$inferred_yield_types - && !$function_always_exits - ) { - if (IssueBuffer::accepts( - new InvalidReturnType( - $cased_method_id . ' is not expected to return any values but it does, ' - . 'either implicitly or explicitly', - $return_type_location - ), - $suppressed_issues - )) { - return false; - } - - return null; - } - - $number_of_types = count($inferred_return_type_parts); - // we filter TNever and TEmpty that have no bearing on the return type - if ($number_of_types > 1) { - $inferred_return_type_parts = array_filter( - $inferred_return_type_parts, - static function (Union $union_type): bool { - return !($union_type->isNever() || $union_type->isEmpty()); - } - ); - } - - $inferred_return_type_parts = array_values($inferred_return_type_parts); - - $inferred_return_type = $inferred_return_type_parts - ? Type::combineUnionTypeArray($inferred_return_type_parts, $codebase) - : Type::getVoid(); - - if ($function_always_exits) { - $inferred_return_type = new Union([new TNever]); - } - - $inferred_yield_type = $inferred_yield_types - ? Type::combineUnionTypeArray($inferred_yield_types, $codebase) - : null; - - if ($inferred_yield_type) { - $inferred_return_type = $inferred_yield_type; - } - - $unsafe_return_type = false; - - // prevent any return types that do not return a value from being used in PHP typehints - if ($codebase->alter_code - && $inferred_return_type->isNullable() - && !$inferred_yield_types - ) { - foreach ($inferred_return_type_parts as $inferred_return_type_part) { - if ($inferred_return_type_part->isVoid()) { - $unsafe_return_type = true; - break; - } - } - } - - $inferred_return_type = TypeExpander::expandUnion( - $codebase, - $inferred_return_type, - $source->getFQCLN(), - $source->getFQCLN(), - $source->getParentFQCLN() - ); - - // hack until we have proper yield type collection - if ($function_like_storage - && $function_like_storage->has_yield - && !$inferred_yield_type - && !$inferred_return_type->isVoid() - ) { - $inferred_return_type = new Union([new TNamedObject('Generator')]); - } - - if ($is_to_string) { - $union_comparison_results = new TypeComparisonResult(); - if (!$inferred_return_type->hasMixed() && - !UnionTypeComparator::isContainedBy( - $codebase, - $inferred_return_type, - Type::getString(), - $inferred_return_type->ignore_nullable_issues, - $inferred_return_type->ignore_falsable_issues, - $union_comparison_results - ) - ) { - if (IssueBuffer::accepts( - new InvalidToString( - '__toString methods must return a string, ' . $inferred_return_type . ' returned', - $return_type_location - ), - $suppressed_issues - )) { - return false; - } - } - - if ($union_comparison_results->to_string_cast) { - IssueBuffer::maybeAdd( - new ImplicitToStringCast( - 'The declared return type for ' . $cased_method_id . ' expects string, ' . - '\'' . $inferred_return_type . '\' provided with a __toString method', - $return_type_location - ), - $suppressed_issues - ); - } - - return null; - } - - if (!$return_type) { - if ($function instanceof Closure || $function instanceof ArrowFunction) { - if (!$closure_inside_call || $inferred_return_type->isMixed()) { - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['MissingClosureReturnType']) - && !in_array('MissingClosureReturnType', $suppressed_issues) - ) { - if ($inferred_return_type->hasMixed() || $inferred_return_type->isNull()) { - return null; - } - - self::addOrUpdateReturnType( - $function, - $project_analyzer, - $inferred_return_type, - $source, - ($project_analyzer->only_replace_php_types_with_non_docblock_types - || $unsafe_return_type) - && $inferred_return_type->from_docblock, - $function_like_storage - ); - - return null; - } - - IssueBuffer::maybeAdd( - new MissingClosureReturnType( - 'Closure does not have a return type, expecting ' . $inferred_return_type->getId(), - new CodeLocation($function_like_analyzer, $function, null, true) - ), - $suppressed_issues, - !$inferred_return_type->hasMixed() && !$inferred_return_type->isNull() - ); - } - - return null; - } - - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['MissingReturnType']) - && !in_array('MissingReturnType', $suppressed_issues) - ) { - if ($inferred_return_type->hasMixed() || $inferred_return_type->isNull()) { - return null; - } - - self::addOrUpdateReturnType( - $function, - $project_analyzer, - $inferred_return_type, - $source, - $compatible_method_ids - || !$did_explicitly_return - || (($project_analyzer->only_replace_php_types_with_non_docblock_types - || $unsafe_return_type) - && $inferred_return_type->from_docblock), - $function_like_storage - ); - - return null; - } - - IssueBuffer::maybeAdd( - new MissingReturnType( - 'Method ' . $cased_method_id . ' does not have a return type' . - (!$inferred_return_type->hasMixed() ? ', expecting ' . $inferred_return_type->getId() : ''), - new CodeLocation($function_like_analyzer, $function->name, null, true) - ), - $suppressed_issues, - !$inferred_return_type->hasMixed() && !$inferred_return_type->isNull() - ); - - return null; - } - - $self_fq_class_name = $fq_class_name ?: $source->getFQCLN(); - - $parent_class = null; - - $classlike_storage = null; - - if ($self_fq_class_name) { - $classlike_storage = $codebase->classlike_storage_provider->get($self_fq_class_name); - $parent_class = $classlike_storage->parent_class; - } - - // passing it through fleshOutTypes eradicates errant $ vars - $declared_return_type = TypeExpander::expandUnion( - $codebase, - $return_type, - $self_fq_class_name, - $static_fq_class_name, - $parent_class, - true, - true, - ($function_like_storage instanceof MethodStorage && $function_like_storage->final) - || ($classlike_storage && $classlike_storage->final) - ); - - if (!$inferred_return_type_parts - && !$inferred_return_type->isNever() - && !$inferred_yield_types - && (!$function_like_storage || !$function_like_storage->has_yield) - ) { - if ($declared_return_type->isVoid() || $declared_return_type->isNever()) { - return null; - } - - if (ScopeAnalyzer::onlyThrowsOrExits($type_provider, $function_stmts)) { - // if there's a single throw statement, it's presumably an exception saying this method is not to be - // used - return null; - } - - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['InvalidReturnType']) - && !in_array('InvalidReturnType', $suppressed_issues) - ) { - self::addOrUpdateReturnType( - $function, - $project_analyzer, - Type::getVoid(), - $source, - $compatible_method_ids - || (($project_analyzer->only_replace_php_types_with_non_docblock_types - || $unsafe_return_type) - && $inferred_return_type->from_docblock) - ); - - return null; - } - - if (!$declared_return_type->from_docblock || !$declared_return_type->isNullable()) { - if (IssueBuffer::accepts( - new InvalidReturnType( - 'No return statements were found for method ' . $cased_method_id . - ' but return type \'' . $declared_return_type . '\' was expected', - $return_type_location - ), - $suppressed_issues, - true - )) { - return false; - } - } - - return null; - } - - if (!$declared_return_type->hasMixed()) { - if ($inferred_return_type->isVoid() - && ($declared_return_type->isVoid() || ($function_like_storage && $function_like_storage->has_yield)) - ) { - return null; - } - - if ($inferred_return_type->hasMixed() || $inferred_return_type->isEmpty()) { - if (IssueBuffer::accepts( - new MixedInferredReturnType( - 'Could not verify return type \'' . $declared_return_type . '\' for ' . - $cased_method_id, - $return_type_location - ), - $suppressed_issues - )) { - return false; - } - - return null; - } - - $union_comparison_results = new TypeComparisonResult(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $inferred_return_type, - $declared_return_type, - true, - true, - $union_comparison_results - )) { - // is the declared return type more specific than the inferred one? - if ($union_comparison_results->type_coerced) { - if ($union_comparison_results->type_coerced_from_mixed) { - if (!$union_comparison_results->type_coerced_from_as_mixed) { - if (IssueBuffer::accepts( - new MixedReturnTypeCoercion( - 'The declared return type \'' . $declared_return_type->getId() . '\' for ' - . $cased_method_id . ' is more specific than the inferred return type ' - . '\'' . $inferred_return_type->getId() . '\'', - $return_type_location - ), - $suppressed_issues - )) { - return false; - } - } - } else { - if (IssueBuffer::accepts( - new MoreSpecificReturnType( - 'The declared return type \'' . $declared_return_type->getId() . '\' for ' - . $cased_method_id . ' is more specific than the inferred return type ' - . '\'' . $inferred_return_type->getId() . '\'', - $return_type_location - ), - $suppressed_issues - )) { - return false; - } - } - } else { - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['InvalidReturnType']) - && !in_array('InvalidReturnType', $suppressed_issues) - ) { - self::addOrUpdateReturnType( - $function, - $project_analyzer, - $inferred_return_type, - $source, - ($project_analyzer->only_replace_php_types_with_non_docblock_types - || $unsafe_return_type) - && $inferred_return_type->from_docblock, - $function_like_storage - ); - - return null; - } - - if (IssueBuffer::accepts( - new InvalidReturnType( - 'The declared return type \'' - . $declared_return_type->getId() - . '\' for ' . $cased_method_id - . ' is incorrect, got \'' - . $inferred_return_type->getId() . '\'', - $return_type_location - ), - $suppressed_issues, - true - )) { - return false; - } - } - } elseif (!$inferred_return_type->hasMixed() - && !UnionTypeComparator::isContainedBy( - $codebase, - $declared_return_type, - $inferred_return_type, - false, - false - ) - ) { - if ($codebase->alter_code) { - if (isset($project_analyzer->getIssuesToFix()['LessSpecificReturnType']) - && !in_array('LessSpecificReturnType', $suppressed_issues) - && !($function_like_storage instanceof MethodStorage && $function_like_storage->inheritdoc) - ) { - self::addOrUpdateReturnType( - $function, - $project_analyzer, - $inferred_return_type, - $source, - $compatible_method_ids - || (($project_analyzer->only_replace_php_types_with_non_docblock_types - || $unsafe_return_type) - && $inferred_return_type->from_docblock), - $function_like_storage - ); - } - } else { - if ($function instanceof Function_ - || $function instanceof Closure - || $function instanceof ArrowFunction - || $function->isPrivate() - ) { - $check_for_less_specific_type = true; - } elseif ($source instanceof StatementsAnalyzer) { - if ($function_like_storage instanceof MethodStorage) { - $check_for_less_specific_type = !$function_like_storage->overridden_somewhere; - } else { - $check_for_less_specific_type = false; - } - } else { - $check_for_less_specific_type = false; - } - - if ($check_for_less_specific_type - && (Config::getInstance()->restrict_return_types - || (!$inferred_return_type->isNullable() && $declared_return_type->isNullable()) - || (!$inferred_return_type->isFalsable() && $declared_return_type->isFalsable())) - ) { - if (IssueBuffer::accepts( - new LessSpecificReturnType( - 'The inferred return type \'' - . $inferred_return_type->getId() - . '\' for ' . $cased_method_id - . ' is more specific than the declared return type \'' - . $declared_return_type->getId() . '\'', - $return_type_location - ), - $suppressed_issues, - !($function_like_storage instanceof MethodStorage && $function_like_storage->inheritdoc) - )) { - return false; - } - } - } - } - - if ($union_comparison_results->to_string_cast) { - IssueBuffer::maybeAdd( - new ImplicitToStringCast( - 'The declared return type for ' . $cased_method_id . ' expects \'' . - $declared_return_type . '\', ' . '\'' . $inferred_return_type . - '\' provided with a __toString method', - $return_type_location - ), - $suppressed_issues - ); - } - - if (!$inferred_return_type->ignore_nullable_issues - && $inferred_return_type->isNullable() - && !$declared_return_type->isNullable() - && !$declared_return_type->hasTemplate() - && !$declared_return_type->isVoid() - ) { - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['InvalidNullableReturnType']) - && !in_array('InvalidNullableReturnType', $suppressed_issues) - && !$inferred_return_type->isNull() - ) { - self::addOrUpdateReturnType( - $function, - $project_analyzer, - $inferred_return_type, - $source, - ($project_analyzer->only_replace_php_types_with_non_docblock_types - || $unsafe_return_type) - && $inferred_return_type->from_docblock, - $function_like_storage - ); - - return null; - } - - if (IssueBuffer::accepts( - new InvalidNullableReturnType( - 'The declared return type \'' . $declared_return_type . '\' for ' . $cased_method_id . - ' is not nullable, but \'' . $inferred_return_type . '\' contains null', - $return_type_location - ), - $suppressed_issues, - !$inferred_return_type->isNull() - )) { - return false; - } - } - - if (!$inferred_return_type->ignore_falsable_issues - && $inferred_return_type->isFalsable() - && !$declared_return_type->isFalsable() - && !$declared_return_type->hasBool() - && !$declared_return_type->hasScalar() - ) { - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['InvalidFalsableReturnType']) - ) { - self::addOrUpdateReturnType( - $function, - $project_analyzer, - $inferred_return_type, - $source, - ($project_analyzer->only_replace_php_types_with_non_docblock_types - || $unsafe_return_type) - && $inferred_return_type->from_docblock, - $function_like_storage - ); - - return null; - } - - if (IssueBuffer::accepts( - new InvalidFalsableReturnType( - 'The declared return type \'' . $declared_return_type . '\' for ' . $cased_method_id . - ' does not allow false, but \'' . $inferred_return_type . '\' contains false', - $return_type_location - ), - $suppressed_issues, - true - )) { - return false; - } - } - } - - return null; - } - - /** - * @param Closure|Function_|ClassMethod|ArrowFunction $function - * - * @return false|null - */ - public static function checkReturnType( - FunctionLike $function, - ProjectAnalyzer $project_analyzer, - FunctionLikeAnalyzer $function_like_analyzer, - FunctionLikeStorage $storage, - Context $context - ): ?bool { - $codebase = $project_analyzer->getCodebase(); - - if (!$storage->return_type || !$storage->return_type_location) { - return null; - } - - $parent_class = null; - - $classlike_storage = null; - - if ($context->self) { - $classlike_storage = $codebase->classlike_storage_provider->get($context->self); - $parent_class = $classlike_storage->parent_class; - } - - if (!$storage->signature_return_type || $storage->signature_return_type === $storage->return_type) { - foreach ($storage->return_type->getAtomicTypes() as $type) { - if ($type instanceof TNamedObject - && 'parent' === $type->value - && null === $parent_class - ) { - if (IssueBuffer::accepts( - new InvalidParent( - 'Cannot use parent as a return type when class has no parent', - $storage->return_type_location - ), - $storage->suppressed_issues - )) { - return false; - } - return null; - } - } - - $fleshed_out_return_type = TypeExpander::expandUnion( - $codebase, - $storage->return_type, - $classlike_storage->name ?? null, - $classlike_storage->name ?? null, - $parent_class - ); - - $fleshed_out_return_type->check( - $function_like_analyzer, - $storage->return_type_location, - $storage->suppressed_issues, - [], - false, - false, - false, - $context->calling_method_id - ); - - return null; - } - - $fleshed_out_signature_type = TypeExpander::expandUnion( - $codebase, - $storage->signature_return_type, - $classlike_storage->name ?? null, - $classlike_storage->name ?? null, - $parent_class - ); - - if ($fleshed_out_signature_type->check( - $function_like_analyzer, - $storage->signature_return_type_location ?: $storage->return_type_location, - $storage->suppressed_issues, - [], - false - ) === false) { - return false; - } - - if ($function instanceof Closure || $function instanceof ArrowFunction) { - return null; - } - - $fleshed_out_return_type = TypeExpander::expandUnion( - $codebase, - $storage->return_type, - $classlike_storage->name ?? null, - $classlike_storage->name ?? null, - $parent_class, - true, - true - ); - - if ($fleshed_out_return_type->check( - $function_like_analyzer, - $storage->return_type_location, - $storage->suppressed_issues, - [], - false, - $storage instanceof MethodStorage && $storage->inherited_return_type - ) === false) { - return false; - } - - if ($classlike_storage && $context->self) { - $class_template_params = ClassTemplateParamCollector::collect( - $codebase, - $classlike_storage, - $codebase->classlike_storage_provider->get($context->self), - strtolower($function->name->name), - new TNamedObject($context->self), - true - ); - - $class_template_params = $class_template_params ?: []; - - if ($class_template_params) { - $template_result = new TemplateResult( - $class_template_params, - [] - ); - - $fleshed_out_return_type = TemplateStandinTypeReplacer::replace( - $fleshed_out_return_type, - $template_result, - $codebase, - null, - null, - null - ); - } - } - - $union_comparison_result = new TypeComparisonResult(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $fleshed_out_return_type, - $fleshed_out_signature_type, - false, - false, - $union_comparison_result - ) && !$union_comparison_result->type_coerced_from_mixed - ) { - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['MismatchingDocblockReturnType']) - ) { - self::addOrUpdateReturnType( - $function, - $project_analyzer, - $storage->signature_return_type, - $function_like_analyzer->getSource() - ); - - return null; - } - - if (IssueBuffer::accepts( - new MismatchingDocblockReturnType( - 'Docblock has incorrect return type \'' . $storage->return_type->getId() . - '\', should be \'' . $storage->signature_return_type->getId() . '\'', - $storage->return_type_location - ), - $storage->suppressed_issues, - true - )) { - return false; - } - } - - return null; - } - - /** - * @param Closure|Function_|ClassMethod|ArrowFunction $function - * - */ - private static function addOrUpdateReturnType( - FunctionLike $function, - ProjectAnalyzer $project_analyzer, - Union $inferred_return_type, - StatementsSource $source, - bool $docblock_only = false, - ?FunctionLikeStorage $function_like_storage = null - ): void { - $manipulator = FunctionDocblockManipulator::getForFunction( - $project_analyzer, - $source->getFilePath(), - $function - ); - - $codebase = $project_analyzer->getCodebase(); - $is_final = true; - $fqcln = $source->getFQCLN(); - - if ($fqcln !== null && $function instanceof ClassMethod) { - $class_storage = $codebase->classlike_storage_provider->get($fqcln); - $is_final = $function->isFinal() || $class_storage->final; - } - - $allow_native_type = !$docblock_only - && $codebase->php_major_version >= 7 - && ( - $codebase->allow_backwards_incompatible_changes - || $is_final - || !$function instanceof PhpParser\Node\Stmt\ClassMethod - ); - - $manipulator->setReturnType( - $allow_native_type - ? (string) $inferred_return_type->toPhpString( - $source->getNamespace(), - $source->getAliasedClassesFlipped(), - $source->getFQCLN(), - $codebase->php_major_version, - $codebase->php_minor_version - ) : null, - $inferred_return_type->toNamespacedString( - $source->getNamespace(), - $source->getAliasedClassesFlipped(), - $source->getFQCLN(), - false - ), - $inferred_return_type->toNamespacedString( - $source->getNamespace(), - $source->getAliasedClassesFlipped(), - $source->getFQCLN(), - true - ), - $inferred_return_type->canBeFullyExpressedInPhp($codebase->php_major_version, $codebase->php_minor_version), - $function_like_storage->return_type_description ?? null - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php deleted file mode 100644 index f0ab1bc8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php +++ /dev/null @@ -1,384 +0,0 @@ - $stmts - * @param list $yield_types - * - * @return list a list of return types - * - * @psalm-suppress ComplexMethod to be refactored - * - * TODO: This would probably benefit from using the list of exit_functions - */ - public static function getReturnTypes( - Codebase $codebase, - NodeDataProvider $nodes, - array $stmts, - array &$yield_types, - bool $collapse_types = false - ): array { - $return_types = []; - - foreach ($stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\Return_) { - if (!$stmt->expr) { - $return_types[] = Type::getVoid(); - } elseif ($stmt_type = $nodes->getType($stmt)) { - $return_types[] = $stmt_type; - - $yield_types = array_merge($yield_types, self::getYieldTypeFromExpression($stmt->expr, $nodes)); - } elseif ($stmt->expr instanceof PhpParser\Node\Scalar\String_) { - $return_types[] = Type::getString(); - } elseif ($stmt->expr instanceof PhpParser\Node\Scalar\LNumber) { - $return_types[] = Type::getInt(); - } elseif ($stmt->expr instanceof PhpParser\Node\Expr\ConstFetch) { - if ((string)$stmt->expr->name === 'true') { - $return_types[] = Type::getTrue(); - } elseif ((string)$stmt->expr->name === 'false') { - $return_types[] = Type::getFalse(); - } elseif ((string)$stmt->expr->name === 'null') { - $return_types[] = Type::getNull(); - } - } else { - $return_types[] = Type::getMixed(); - } - - break; - } - - if ($stmt instanceof PhpParser\Node\Stmt\Break_ - || $stmt instanceof PhpParser\Node\Stmt\Continue_ - ) { - break; - } - - if ($stmt instanceof PhpParser\Node\Stmt\Throw_) { - if ($collapse_types) { - $return_types[] = Type::getNever(); - } - - break; - } - - if ($stmt instanceof PhpParser\Node\Stmt\Expression) { - if ($stmt->expr instanceof PhpParser\Node\Expr\Exit_) { - if ($collapse_types) { - $return_types[] = Type::getNever(); - } - - break; - } - - if ($stmt->expr instanceof PhpParser\Node\Expr\Assign) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - [$stmt->expr->expr], - $yield_types - ) - ); - } - - $yield_types = array_merge($yield_types, self::getYieldTypeFromExpression($stmt->expr, $nodes)); - } elseif ($stmt instanceof PhpParser\Node\Stmt\If_) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $stmt->stmts, - $yield_types - ) - ); - - foreach ($stmt->elseifs as $elseif) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $elseif->stmts, - $yield_types - ) - ); - } - - if ($stmt->else) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $stmt->else->stmts, - $yield_types - ) - ); - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\TryCatch) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $stmt->stmts, - $yield_types - ) - ); - - foreach ($stmt->catches as $catch) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $catch->stmts, - $yield_types - ) - ); - } - - if ($stmt->finally) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $stmt->finally->stmts, - $yield_types - ) - ); - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\For_) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $stmt->stmts, - $yield_types - ) - ); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Foreach_) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $stmt->stmts, - $yield_types - ) - ); - } elseif ($stmt instanceof PhpParser\Node\Stmt\While_) { - $yield_types = array_merge($yield_types, self::getYieldTypeFromExpression($stmt->cond, $nodes)); - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $stmt->stmts, - $yield_types - ) - ); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Do_) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $stmt->stmts, - $yield_types - ) - ); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Switch_) { - foreach ($stmt->cases as $case) { - $return_types = array_merge( - $return_types, - self::getReturnTypes( - $codebase, - $nodes, - $case->stmts, - $yield_types - ) - ); - } - } - } - - // if we're at the top level and we're not ending in a return, make sure to add possible null - if ($collapse_types) { - // if it's a generator, boil everything down to a single generator return type - if ($yield_types) { - $yield_types = self::processYieldTypes($codebase, $return_types, $yield_types); - } - } - - return $return_types; - } - - /** - * @param list $return_types - * @param non-empty-list $yield_types - * @return non-empty-list - */ - private static function processYieldTypes( - Codebase $codebase, - array $return_types, - array $yield_types - ): array { - $key_type = null; - $value_type = null; - - $yield_type = Type::combineUnionTypeArray($yield_types, null); - - foreach ($yield_type->getAtomicTypes() as $type) { - if ($type instanceof TKeyedArray) { - $type = $type->getGenericArrayType(); - } - - if ($type instanceof TList) { - $type = new TArray([Type::getInt(), $type->type_param]); - } - - if ($type instanceof TArray) { - [$key_type_param, $value_type_param] = $type->type_params; - - $key_type = Type::combineUnionTypes(clone $key_type_param, $key_type); - $value_type = Type::combineUnionTypes(clone $value_type_param, $value_type); - } elseif ($type instanceof TIterable - || $type instanceof TNamedObject - ) { - ForeachAnalyzer::getKeyValueParamsForTraversableObject( - $type, - $codebase, - $key_type, - $value_type - ); - } - } - - return [ - new Union([ - new TGenericObject( - 'Generator', - [ - $key_type ?? Type::getMixed(), - $value_type ?? Type::getMixed(), - Type::getMixed(), - $return_types ? Type::combineUnionTypeArray($return_types, null) : Type::getVoid() - ] - ), - ]) - ]; - } - - /** - * @return list - */ - protected static function getYieldTypeFromExpression( - PhpParser\Node\Expr $stmt, - NodeDataProvider $nodes - ): array { - if ($stmt instanceof PhpParser\Node\Expr\Yield_) { - $key_type = null; - - if ($stmt->key && ($stmt_key_type = $nodes->getType($stmt->key))) { - $key_type = $stmt_key_type; - } - - if ($stmt->value - && $value_type = $nodes->getType($stmt->value) - ) { - $generator_type = new TGenericObject( - 'Generator', - [ - $key_type ? clone $key_type : Type::getInt(), - clone $value_type, - Type::getMixed(), - Type::getMixed() - ] - ); - - return [new Union([$generator_type])]; - } - - return [Type::getMixed()]; - } - - if ($stmt instanceof PhpParser\Node\Expr\YieldFrom) { - if ($stmt_expr_type = $nodes->getType($stmt->expr)) { - return [$stmt_expr_type]; - } - - return [Type::getMixed()]; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) { - return array_merge( - self::getYieldTypeFromExpression($stmt->left, $nodes), - self::getYieldTypeFromExpression($stmt->right, $nodes) - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\Assign) { - return self::getYieldTypeFromExpression($stmt->expr, $nodes); - } - - if ($stmt instanceof PhpParser\Node\Expr\MethodCall - || $stmt instanceof PhpParser\Node\Expr\FuncCall - || $stmt instanceof PhpParser\Node\Expr\StaticCall - || $stmt instanceof PhpParser\Node\Expr\New_ - ) { - if ($stmt->isFirstClassCallable()) { - return []; - } - - $yield_types = []; - - foreach ($stmt->getArgs() as $arg) { - $yield_types = array_merge($yield_types, self::getYieldTypeFromExpression($arg->value, $nodes)); - } - - return $yield_types; - } - - if ($stmt instanceof PhpParser\Node\Expr\Array_) { - $yield_types = []; - - foreach ($stmt->items as $item) { - if ($item instanceof PhpParser\Node\Expr\ArrayItem) { - $yield_types = array_merge($yield_types, self::getYieldTypeFromExpression($item->value, $nodes)); - } - } - - return $yield_types; - } - - return []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php deleted file mode 100644 index 385a954c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php +++ /dev/null @@ -1,2023 +0,0 @@ - - */ - protected $suppressed_issues; - - /** - * @var bool - */ - protected $is_static = false; - - /** - * @var ?array - */ - protected $return_vars_in_scope = []; - - /** - * @var ?array - */ - protected $return_vars_possibly_in_scope = []; - - /** - * @var Union|null - */ - private $local_return_type; - - /** - * @var array - */ - protected static $no_effects_hashes = []; - - /** - * @var bool - */ - public $track_mutations = false; - - /** - * @var bool - */ - public $inferred_impure = false; - - /** - * @var bool - */ - public $inferred_has_mutation = false; - - /** - * Holds param nodes for functions with func_get_args calls - * - * @var array - */ - public $param_nodes = []; - - /** - * @var FunctionLikeStorage - */ - protected $storage; - - /** - * @param TFunction $function - */ - public function __construct($function, SourceAnalyzer $source, FunctionLikeStorage $storage) - { - $this->function = $function; - $this->source = $source; - $this->suppressed_issues = $source->getSuppressedIssues(); - $this->codebase = $source->getCodebase(); - $this->storage = $storage; - } - - /** - * @param bool $add_mutations whether or not to add mutations to this method - * - * @return false|null - * - * @psalm-suppress PossiblyUnusedReturnValue unused but seems important - */ - public function analyze( - Context $context, - NodeDataProvider $type_provider, - ?Context $global_context = null, - bool $add_mutations = false - ): ?bool { - $storage = $this->storage; - - $function_stmts = $this->function->getStmts() ?: []; - - if ($this->function instanceof ArrowFunction - && isset($function_stmts[0]) - && $function_stmts[0] instanceof PhpParser\Node\Stmt\Return_ - && $function_stmts[0]->expr - ) { - $function_stmts[0]->setAttributes($function_stmts[0]->expr->getAttributes()); - } - - if ($global_context) { - foreach ($global_context->constants as $const_name => $var_type) { - if (!$context->hasVariable($const_name)) { - $context->vars_in_scope[$const_name] = clone $var_type; - } - } - } - - $codebase = $this->codebase; - $project_analyzer = $this->getProjectAnalyzer(); - - if ($codebase->track_unused_suppressions && !isset($storage->suppressed_issues[0])) { - if (count($storage->suppressed_issues) === 1 // UnusedPsalmSuppress by itself should be marked as unused - || !in_array("UnusedPsalmSuppress", $storage->suppressed_issues) - ) { - foreach ($storage->suppressed_issues as $offset => $issue_name) { - IssueBuffer::addUnusedSuppression($this->getFilePath(), $offset, $issue_name); - } - } - } - - foreach ($storage->docblock_issues as $docblock_issue) { - IssueBuffer::maybeAdd($docblock_issue); - } - - $function_information = $this->getFunctionInformation( - $context, - $codebase, - $type_provider, - $storage, - $add_mutations - ); - - if ($function_information === null) { - return null; - } - - [ - $real_method_id, - $method_id, - $appearing_class_storage, - $hash, - $cased_method_id, - $overridden_method_ids - ] = $function_information; - - $this->suppressed_issues = $this->getSource()->getSuppressedIssues() + $storage->suppressed_issues; - if ($appearing_class_storage) { - $this->suppressed_issues += $appearing_class_storage->suppressed_issues; - } - - if ($storage instanceof MethodStorage && $storage->is_static) { - $this->is_static = true; - } - - $statements_analyzer = new StatementsAnalyzer($this, $type_provider); - - if ($this instanceof ClosureAnalyzer && $this->function instanceof Closure) { - $byref_uses = []; - - foreach ($this->function->uses as $use) { - if (!is_string($use->var->name)) { - continue; - } - - $use_var_id = '$' . $use->var->name; - - $use_location = new CodeLocation($this, $use); - - $use_assignment = null; - - if ($statements_analyzer->data_flow_graph) { - $use_assignment = DataFlowNode::getForAssignment( - $use_var_id, - $use_location - ); - - $statements_analyzer->data_flow_graph->addNode($use_assignment); - - $context->vars_in_scope[$use_var_id]->parent_nodes += [$use_assignment->id => $use_assignment]; - } - - if ($use->byRef) { - $byref_uses[$use_var_id] = true; - - if ($statements_analyzer->data_flow_graph && $use_assignment) { - $statements_analyzer->data_flow_graph->addPath( - $use_assignment, - new DataFlowNode('closure-use', 'closure use', null), - 'closure-use' - ); - } - } else { - $statements_analyzer->registerVariable($use_var_id, $use_location, null); - } - } - - $statements_analyzer->setByRefUses($byref_uses); - } - - if ($storage->template_types) { - foreach ($storage->template_types as $param_name => $_) { - $fq_classlike_name = Type::getFQCLNFromString( - $param_name, - $this->getAliases() - ); - - if ($codebase->classOrInterfaceExists($fq_classlike_name)) { - IssueBuffer::maybeAdd( - new ReservedWord( - 'Cannot use ' . $param_name . ' as template name since the class already exists', - new CodeLocation($this, $this->function), - 'resource' - ), - $this->getSuppressedIssues() - ); - } - } - } - - $template_types = $storage->template_types; - - if ($appearing_class_storage && $appearing_class_storage->template_types) { - $template_types = array_merge($template_types ?: [], $appearing_class_storage->template_types); - } - - $params = $storage->params; - - if ($codebase->alter_code) { - $this->alterParams($codebase, $storage, $params, $context); - } - - foreach ($codebase->methods_to_rename as $original_method_id => $new_method_name) { - if ($this instanceof MethodAnalyzer - && strtolower((string) $this->getMethodId()) === $original_method_id - ) { - $file_manipulations = [ - new FileManipulation( - (int) $this->function->name->getAttribute('startFilePos'), - (int) $this->function->name->getAttribute('endFilePos') + 1, - $new_method_name - ) - ]; - - FileManipulationBuffer::add( - $this->getFilePath(), - $file_manipulations - ); - } - } - - if ($storage instanceof MethodStorage - && $method_id instanceof MethodIdentifier - && $overridden_method_ids - ) { - $params = $codebase->methods->getMethodParams( - $method_id, - $this - ); - } - - $check_stmts = $this->processParams( - $statements_analyzer, - $storage, - $cased_method_id, - $params, - array_values($this->function->params), - $context, - (bool) $template_types - ); - - if ($storage->pure) { - $context->pure = true; - } - - if ($storage->mutation_free - && $cased_method_id - && !strpos($cased_method_id, '__construct') - && !($storage instanceof MethodStorage && $storage->mutation_free_inferred) - ) { - $context->mutation_free = true; - } - - if ($storage instanceof MethodStorage - && $storage->external_mutation_free - && !$storage->mutation_free_inferred - ) { - $context->external_mutation_free = true; - } - - if ($storage->unused_docblock_params) { - foreach ($storage->unused_docblock_params as $param_name => $param_location) { - if (IssueBuffer::accepts( - new InvalidDocblockParamName( - 'Incorrect param name $' . $param_name . ' in docblock for ' . $cased_method_id, - $param_location - ) - )) { - } - } - } - - if ($storage->signature_return_type && $storage->signature_return_type_location) { - [$start, $end] = $storage->signature_return_type_location->getSelectionBounds(); - - $codebase->analyzer->addOffsetReference( - $this->getFilePath(), - $start, - $end, - (string) $storage->signature_return_type - ); - } - - if ($storage instanceof MethodStorage && $storage->location && !$storage->allow_named_arg_calls) { - foreach ($overridden_method_ids as $overridden_method_id) { - $overridden_storage = $codebase->methods->getStorage($overridden_method_id); - if ($overridden_storage->allow_named_arg_calls) { - IssueBuffer::maybeAdd(new MethodSignatureMismatch( - 'Method ' . (string) $method_id . ' should accept named arguments ' - . ' as ' . (string) $overridden_method_id . ' does', - $storage->location - )); - } - } - } - - if (ReturnTypeAnalyzer::checkReturnType( - $this->function, - $project_analyzer, - $this, - $storage, - $context - ) === false) { - $check_stmts = false; - } - - if (!$check_stmts) { - return false; - } - - if ($context->collect_initializations || $context->collect_mutations) { - $statements_analyzer->addSuppressedIssues([ - 'DocblockTypeContradiction', - 'InvalidReturnStatement', - 'RedundantCondition', - 'RedundantConditionGivenDocblockType', - 'TypeDoesNotContainNull', - 'TypeDoesNotContainType', - 'LoopInvalidation', - ]); - - if ($context->collect_initializations) { - $statements_analyzer->addSuppressedIssues([ - 'UndefinedInterfaceMethod', - 'UndefinedMethod', - 'PossiblyUndefinedMethod', - ]); - } - } elseif ($cased_method_id && strpos($cased_method_id, '__destruct')) { - $statements_analyzer->addSuppressedIssues([ - 'InvalidPropertyAssignmentValue', - 'PossiblyNullPropertyAssignmentValue', - ]); - } - - $time = microtime(true); - - $project_analyzer = $statements_analyzer->getProjectAnalyzer(); - - if ($codebase->alter_code - && (isset($project_analyzer->getIssuesToFix()['MissingPureAnnotation']) - || isset($project_analyzer->getIssuesToFix()['MissingImmutableAnnotation'])) - ) { - $this->track_mutations = true; - } elseif ($this->function instanceof Closure - || $this->function instanceof ArrowFunction - ) { - $this->track_mutations = true; - } - - if ($this->function instanceof ArrowFunction && $storage->return_type && $storage->return_type->isNever()) { - // ArrowFunction perform a return implicitly so if the return type is never, we have to suppress the error - // note: the never can only come from phpdoc. PHP will refuse short closures with never in signature - $statements_analyzer->addSuppressedIssues(['NoValue']); - } - - $statements_analyzer->analyze($function_stmts, $context, $global_context, true); - - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['MissingPureAnnotation']) - && !$this->inferred_impure - && ($this->function instanceof Function_ - || $this->function instanceof ClassMethod) - && $storage->params - && !$overridden_method_ids - ) { - $manipulator = FunctionDocblockManipulator::getForFunction( - $project_analyzer, - $this->source->getFilePath(), - $this->function - ); - - $yield_types = []; - - $inferred_return_types = ReturnTypeCollector::getReturnTypes( - $codebase, - $type_provider, - $function_stmts, - $yield_types, - true - ); - - $inferred_return_type = $inferred_return_types - ? Type::combineUnionTypeArray( - $inferred_return_types, - $codebase - ) - : Type::getVoid(); - - if (!$inferred_return_type->isVoid() - && !$inferred_return_type->isFalse() - && !$inferred_return_type->isNull() - && !$inferred_return_type->isSingleIntLiteral() - && !$inferred_return_type->isSingleStringLiteral() - && !$inferred_return_type->isTrue() - && $inferred_return_type->getId() !== 'array' - ) { - $manipulator->makePure(); - } - } - - if ($this->inferred_has_mutation && $context->self) { - $this->codebase->analyzer->addMutableClass($context->self); - } - - if (!$context->collect_initializations - && !$context->collect_mutations - && $project_analyzer->debug_performance - && $cased_method_id - ) { - $traverser = new PhpParser\NodeTraverser; - - $node_counter = new NodeCounterVisitor(); - $traverser->addVisitor($node_counter); - $traverser->traverse($function_stmts); - - if ($node_counter->count > 5) { - $time_taken = microtime(true) - $time; - $codebase->analyzer->addFunctionTiming($cased_method_id, $time_taken / $node_counter->count); - } - } - - $final_actions = ScopeAnalyzer::getControlActions( - $this->function->getStmts() ?: [], - null, - $codebase->config->exit_functions, - [] - ); - - if ($final_actions !== [ScopeAnalyzer::ACTION_END]) { - $this->examineParamTypes($statements_analyzer, $context, $codebase); - } - - foreach ($params as $function_param) { - // only complain if there's no type defined by a parent type - if (!$function_param->type - && $function_param->location - ) { - if ($this->function instanceof Closure - || $this->function instanceof ArrowFunction - ) { - IssueBuffer::maybeAdd( - new MissingClosureParamType( - 'Parameter $' . $function_param->name . ' has no provided type', - $function_param->location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new MissingParamType( - 'Parameter $' . $function_param->name . ' has no provided type', - $function_param->location - ), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - } - } - - if ($this->function instanceof Closure - || $this->function instanceof ArrowFunction - ) { - $this->verifyReturnType( - $function_stmts, - $statements_analyzer, - $storage->return_type, - $this->source->getFQCLN(), - $storage->return_type_location, - $context->has_returned, - $global_context && ($global_context->inside_call || $global_context->inside_return) - ); - - $closure_yield_types = []; - - $closure_return_types = ReturnTypeCollector::getReturnTypes( - $codebase, - $type_provider, - $function_stmts, - $closure_yield_types, - true - ); - - $closure_return_type = $closure_return_types - ? Type::combineUnionTypeArray( - $closure_return_types, - $codebase - ) - : Type::getVoid(); - - $closure_yield_type = $closure_yield_types - ? Type::combineUnionTypeArray( - $closure_yield_types, - $codebase - ) - : null; - - if ($closure_yield_type) { - $closure_return_type = $closure_yield_type; - } - - if ($function_type = $statements_analyzer->node_data->getType($this->function)) { - /** - * @var TClosure - */ - $closure_atomic = $function_type->getSingleAtomic(); - - if (($storage->return_type === $storage->signature_return_type) - && (!$storage->return_type - || $storage->return_type->hasMixed() - || UnionTypeComparator::isContainedBy( - $codebase, - $closure_return_type, - $storage->return_type - )) - ) { - $closure_atomic->return_type = $closure_return_type; - } - - $closure_atomic->is_pure = !$this->inferred_impure; - } - } - - if ($codebase->collect_references - && !$context->collect_initializations - && !$context->collect_mutations - && $codebase->find_unused_variables - && $context->check_variables - ) { - $this->checkParamReferences( - $statements_analyzer, - $storage, - $appearing_class_storage, - $context - ); - } - - foreach ($storage->throws as $expected_exception => $_) { - if (($expected_exception === 'self' - || $expected_exception === 'static') - && $context->self - ) { - $expected_exception = $context->self; - } - - if (isset($storage->throw_locations[$expected_exception])) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $expected_exception, - $storage->throw_locations[$expected_exception], - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions( - false, - false, - true, - true, - true - ) - )) { - $input_type = new Union([new TNamedObject($expected_exception)]); - $container_type = new Union([new TNamedObject('Exception'), new TNamedObject('Throwable')]); - - if (!UnionTypeComparator::isContainedBy($codebase, $input_type, $container_type)) { - IssueBuffer::maybeAdd( - new InvalidThrow( - 'Class supplied for @throws ' . $expected_exception - . ' does not implement Throwable', - $storage->throw_locations[$expected_exception], - $expected_exception - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($codebase->alter_code) { - $codebase->classlikes->handleDocblockTypeInMigration( - $codebase, - $this, - $input_type, - $storage->throw_locations[$expected_exception], - $context->calling_method_id - ); - } - } - } - } - - $missingThrowsDocblockErrors = []; - foreach ($statements_analyzer->getUncaughtThrows($context) as $possibly_thrown_exception => $codelocations) { - $is_expected = false; - - foreach ($storage->throws as $expected_exception => $_) { - if ($expected_exception === $possibly_thrown_exception - || $codebase->classExtendsOrImplements($possibly_thrown_exception, $expected_exception) - ) { - $is_expected = true; - break; - } - } - - if (!$is_expected) { - $missingThrowsDocblockErrors[] = $possibly_thrown_exception; - foreach ($codelocations as $codelocation) { - // issues are suppressed in ThrowAnalyzer, CallAnalyzer, etc. - IssueBuffer::maybeAdd( - new MissingThrowsDocblock( - $possibly_thrown_exception . ' is thrown but not caught - please either catch' - . ' or add a @throws annotation', - $codelocation - ) - ); - } - } - } - - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['MissingThrowsDocblock']) - ) { - $manipulator = FunctionDocblockManipulator::getForFunction( - $project_analyzer, - $this->source->getFilePath(), - $this->function - ); - $manipulator->addThrowsDocblock($missingThrowsDocblockErrors); - } - - if ($codebase->taint_flow_graph - && $this->function instanceof ClassMethod - && $cased_method_id - && $storage->specialize_call - && isset($context->vars_in_scope['$this']) - && $context->vars_in_scope['$this']->parent_nodes - ) { - $method_source = DataFlowNode::getForMethodReturn( - (string) $method_id, - $cased_method_id, - $storage->location - ); - - $codebase->taint_flow_graph->addNode($method_source); - - foreach ($context->vars_in_scope['$this']->parent_nodes as $parent_node) { - $codebase->taint_flow_graph->addPath( - $parent_node, - $method_source, - '$this' - ); - } - } - - if ($add_mutations) { - if ($this->return_vars_in_scope !== null) { - $context->vars_in_scope = TypeAnalyzer::combineKeyedTypes( - $context->vars_in_scope, - $this->return_vars_in_scope - ); - } - - if ($this->return_vars_possibly_in_scope !== null) { - $context->vars_possibly_in_scope = array_merge( - $context->vars_possibly_in_scope, - $this->return_vars_possibly_in_scope - ); - } - - foreach ($context->vars_in_scope as $var => $_) { - if (strpos($var, '$this->') !== 0 && $var !== '$this') { - unset($context->vars_in_scope[$var]); - } - } - - foreach ($context->vars_possibly_in_scope as $var => $_) { - if (strpos($var, '$this->') !== 0 && $var !== '$this') { - unset($context->vars_possibly_in_scope[$var]); - } - } - - if ($hash - && $real_method_id - && $this instanceof MethodAnalyzer - && !$context->collect_initializations - ) { - $new_hash = md5($real_method_id . '::' . $context->getScopeSummary()); - - if ($new_hash === $hash) { - self::$no_effects_hashes[$hash] = true; - } - } - } - - $event = new AfterFunctionLikeAnalysisEvent( - $this->function, - $storage, - $this, - $codebase, - [], - $type_provider, - $context - ); - - if ($codebase->config->eventDispatcher->dispatchAfterFunctionLikeAnalysis($event) === false) { - return false; - } - - $file_manipulations = $event->getFileReplacements(); - - if ($file_manipulations) { - FileManipulationBuffer::add( - $this->getFilePath(), - $file_manipulations - ); - } - - AttributesAnalyzer::analyze( - $this, - $context, - $storage, - $this->function->attrGroups, - $storage instanceof MethodStorage ? AttributesAnalyzer::TARGET_METHOD : AttributesAnalyzer::TARGET_FUNCTION, - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - - return null; - } - - private function checkParamReferences( - StatementsAnalyzer $statements_analyzer, - FunctionLikeStorage $storage, - ?ClassLikeStorage $class_storage, - Context $context - ): void { - $codebase = $statements_analyzer->getCodebase(); - - $unused_params = []; - - foreach ($statements_analyzer->getUnusedVarLocations() as [$var_name, $original_location]) { - if (!array_key_exists(substr($var_name, 1), $storage->param_lookup)) { - continue; - } - - if (strpos($var_name, '$_') === 0 || (strpos($var_name, '$unused') === 0 && $var_name !== '$unused')) { - continue; - } - - $position = array_search(substr($var_name, 1), array_keys($storage->param_lookup), true); - - if ($position === false) { - throw new UnexpectedValueException('$position should not be false here'); - } - - if ($storage->params[$position]->by_ref) { - continue; - } - - if ($storage->params[$position]->promoted_property) { - continue; - } - - $did_match_param = false; - - foreach ($this->function->params as $param) { - if ($param->var->getAttribute('endFilePos') === $original_location->raw_file_end) { - $did_match_param = true; - break; - } - } - - if (!$did_match_param) { - continue; - } - - $assignment_node = DataFlowNode::getForAssignment($var_name, $original_location); - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - && $statements_analyzer->data_flow_graph->isVariableUsed($assignment_node) - ) { - continue; - } - - if (!$storage instanceof MethodStorage - || !$storage->cased_name - || $storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE - ) { - if ($this instanceof ClosureAnalyzer) { - IssueBuffer::maybeAdd( - new UnusedClosureParam( - 'Param ' . $var_name . ' is never referenced in this method', - $original_location - ), - $this->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new UnusedParam( - 'Param ' . $var_name . ' is never referenced in this method', - $original_location - ), - $this->getSuppressedIssues() - ); - } - } else { - $fq_class_name = (string)$context->self; - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $method_name_lc = strtolower($storage->cased_name); - - if ($storage->abstract) { - continue; - } - - if (isset($class_storage->overridden_method_ids[$method_name_lc])) { - $parent_method_id = end($class_storage->overridden_method_ids[$method_name_lc]); - - if ($parent_method_id) { - $parent_method_storage = $codebase->methods->getStorage($parent_method_id); - - // if the parent method has a param at that position and isn't abstract - if (!$parent_method_storage->abstract - && isset($parent_method_storage->params[$position]) - ) { - continue; - } - } - } - - $unused_params[$position] = $original_location; - } - } - - if ($storage instanceof MethodStorage - && $this instanceof MethodAnalyzer - && $class_storage - && $storage->cased_name - && $storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PRIVATE - ) { - $method_id_lc = strtolower((string) $this->getMethodId()); - - foreach ($storage->params as $i => $_) { - if (!isset($unused_params[$i])) { - $codebase->file_reference_provider->addMethodParamUse( - $method_id_lc, - $i, - $method_id_lc - ); - - $method_name_lc = strtolower($storage->cased_name); - - if (!isset($class_storage->overridden_method_ids[$method_name_lc])) { - continue; - } - - foreach ($class_storage->overridden_method_ids[$method_name_lc] as $parent_method_id) { - $codebase->file_reference_provider->addMethodParamUse( - strtolower((string) $parent_method_id), - $i, - $method_id_lc - ); - } - } - } - } - } - - /** - * @param list $params - * @param list $param_stmts - */ - private function processParams( - StatementsAnalyzer $statements_analyzer, - FunctionLikeStorage $storage, - ?string $cased_method_id, - array $params, - array $param_stmts, - Context $context, - bool $has_template_types - ): bool { - $check_stmts = true; - $codebase = $statements_analyzer->getCodebase(); - $project_analyzer = $statements_analyzer->getProjectAnalyzer(); - - foreach ($params as $offset => $function_param) { - $signature_type = $function_param->signature_type; - $signature_type_location = $function_param->signature_type_location; - - if ($signature_type && $signature_type_location && $signature_type->hasObjectType()) { - $referenced_type = $signature_type; - if ($referenced_type->isNullable()) { - $referenced_type = clone $referenced_type; - $referenced_type->removeType('null'); - } - [$start, $end] = $signature_type_location->getSelectionBounds(); - $codebase->analyzer->addOffsetReference( - $this->getFilePath(), - $start, - $end, - (string) $referenced_type - ); - } - - if ($signature_type) { - $signature_type = TypeExpander::expandUnion( - $codebase, - $signature_type, - $context->self, - $context->self, - $this->getParentFQCLN() - ); - } - - if ($function_param->type) { - $param_type = clone $function_param->type; - - $param_type = TypeExpander::expandUnion( - $codebase, - $param_type, - $context->self, - $context->self, - $this->getParentFQCLN(), - true, - false, - false, - true - ); - - if ($function_param->type_location) { - if ($param_type->check( - $this, - $function_param->type_location, - $storage->suppressed_issues, - [], - false, - false, - $this->function instanceof ClassMethod - && strtolower($this->function->name->name) !== '__construct', - $context->calling_method_id - ) === false) { - $check_stmts = false; - } - } - } else { - $param_type = Type::getMixed(); - } - - $var_type = $param_type; - - if ($function_param->is_variadic) { - if ($storage->allow_named_arg_calls) { - $var_type = new Union([ - new TArray([Type::getArrayKey(), $param_type]), - ]); - } else { - $var_type = new Union([ - new TList($param_type), - ]); - } - } - - if ($statements_analyzer->data_flow_graph - && $function_param->location - ) { - //don't add to taint flow graph if the type can't transmit taints - if (!$statements_analyzer->data_flow_graph instanceof TaintFlowGraph - || $function_param->type === null - || !$function_param->type->isSingle() - || (!$function_param->type->isInt() - && !$function_param->type->isFloat() - && !$function_param->type->isBool()) - ) { - $param_assignment = DataFlowNode::getForAssignment( - '$' . $function_param->name, - $function_param->location - ); - - $statements_analyzer->data_flow_graph->addNode($param_assignment); - - if ($cased_method_id) { - $type_source = DataFlowNode::getForMethodArgument( - $cased_method_id, - $cased_method_id, - $offset, - $function_param->location, - null - ); - - $statements_analyzer->data_flow_graph->addPath($type_source, $param_assignment, 'param'); - } - - if ($function_param->by_ref - && $codebase->find_unused_variables - ) { - $statements_analyzer->data_flow_graph->addPath( - $param_assignment, - new DataFlowNode('variable-use', 'variable use', null), - 'variable-use' - ); - } - - if ($storage->variadic) { - $this->param_nodes += [$param_assignment->id => $param_assignment]; - } - - $var_type->parent_nodes += [$param_assignment->id => $param_assignment]; - } - } - - $context->vars_in_scope['$' . $function_param->name] = $var_type; - $context->vars_possibly_in_scope['$' . $function_param->name] = true; - - if ($function_param->by_ref) { - $context->vars_in_scope['$' . $function_param->name]->by_ref = true; - } - - $parser_param = $this->function->getParams()[$offset] ?? null; - - if ($function_param->location) { - $statements_analyzer->registerVariable( - '$' . $function_param->name, - $function_param->location, - null - ); - } - - if (!$function_param->type_location || !$function_param->location) { - if ($parser_param && $parser_param->default) { - ExpressionAnalyzer::analyze($statements_analyzer, $parser_param->default, $context); - } - - continue; - } - - if ($signature_type) { - $union_comparison_result = new TypeComparisonResult(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $param_type, - $signature_type, - false, - false, - $union_comparison_result - ) && !$union_comparison_result->type_coerced_from_mixed - ) { - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['MismatchingDocblockParamType']) - ) { - $this->addOrUpdateParamType($project_analyzer, $function_param->name, $signature_type, true); - - continue; - } - - IssueBuffer::maybeAdd( - new MismatchingDocblockParamType( - 'Parameter $' . $function_param->name . ' has wrong type \'' . $param_type . - '\', should be \'' . $signature_type . '\'', - $function_param->type_location - ), - $storage->suppressed_issues, - true - ); - - if ($signature_type->check( - $this, - $function_param->type_location, - $storage->suppressed_issues, - [], - false - ) === false) { - $check_stmts = false; - } - - continue; - } - } - - if ($parser_param && $parser_param->default) { - ExpressionAnalyzer::analyze($statements_analyzer, $parser_param->default, $context); - - $default_type = $statements_analyzer->node_data->getType($parser_param->default); - - if ($default_type - && !$default_type->hasMixed() - && !UnionTypeComparator::isContainedBy( - $codebase, - $default_type, - $param_type, - false, - false, - null, - true - ) - ) { - IssueBuffer::maybeAdd( - new InvalidParamDefault( - 'Default value type ' . $default_type->getId() . ' for argument ' . ($offset + 1) - . ' of method ' . $cased_method_id - . ' does not match the given type ' . $param_type->getId(), - $function_param->type_location - ) - ); - } - } - - if ($has_template_types) { - $substituted_type = clone $param_type; - if ($substituted_type->check( - $this->source, - $function_param->type_location, - $this->suppressed_issues, - [], - false - ) === false) { - $check_stmts = false; - } - } else { - if ($param_type->isVoid()) { - IssueBuffer::maybeAdd( - new ReservedWord( - 'Parameter cannot be void', - $function_param->type_location, - 'void' - ), - $this->suppressed_issues - ); - } - - if ($param_type->check( - $this->source, - $function_param->type_location, - $this->suppressed_issues, - [], - false - ) === false) { - $check_stmts = false; - } - } - - if ($codebase->collect_locations) { - if ($function_param->type_location !== $function_param->signature_type_location && - $function_param->signature_type_location && - $function_param->signature_type - ) { - if ($function_param->signature_type->check( - $this->source, - $function_param->signature_type_location, - $this->suppressed_issues, - [], - false - ) === false) { - $check_stmts = false; - } - } - } - - if ($function_param->by_ref) { - // register by ref params as having been used, to avoid false positives - // @todo change the assignment analysis *just* for byref params - // so that we don't have to do this - $context->hasVariable('$' . $function_param->name); - } - - if (count($param_stmts) === count($params)) { - AttributesAnalyzer::analyze( - $this, - $context, - $function_param, - $param_stmts[$offset]->attrGroups, - AttributesAnalyzer::TARGET_PARAMETER - | ($function_param->promoted_property ? AttributesAnalyzer::TARGET_PROPERTY : 0), - $storage->suppressed_issues + $this->getSuppressedIssues() - ); - } - } - - return $check_stmts; - } - - /** - * @param FunctionLikeParameter[] $params - */ - private function alterParams( - Codebase $codebase, - FunctionLikeStorage $storage, - array $params, - Context $context - ): void { - foreach ($this->function->params as $param) { - $param_name_node = null; - - if ($param->type instanceof PhpParser\Node\Name) { - $param_name_node = $param->type; - } elseif ($param->type instanceof PhpParser\Node\NullableType - && $param->type->type instanceof PhpParser\Node\Name - ) { - $param_name_node = $param->type->type; - } - - if ($param_name_node) { - $resolved_name = ClassLikeAnalyzer::getFQCLNFromNameObject($param_name_node, $this->getAliases()); - - $parent_fqcln = $this->getParentFQCLN(); - - if ($resolved_name === 'self' && $context->self) { - $resolved_name = $context->self; - } elseif ($resolved_name === 'parent' && $parent_fqcln) { - $resolved_name = $parent_fqcln; - } - - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $this, - $param_name_node, - $resolved_name, - $context->calling_method_id, - false, - true - ); - } - } - - if ($this->function->returnType) { - $return_name_node = null; - - if ($this->function->returnType instanceof PhpParser\Node\Name) { - $return_name_node = $this->function->returnType; - } elseif ($this->function->returnType instanceof PhpParser\Node\NullableType - && $this->function->returnType->type instanceof PhpParser\Node\Name - ) { - $return_name_node = $this->function->returnType->type; - } - - if ($return_name_node) { - $resolved_name = ClassLikeAnalyzer::getFQCLNFromNameObject($return_name_node, $this->getAliases()); - - $parent_fqcln = $this->getParentFQCLN(); - - if ($resolved_name === 'self' && $context->self) { - $resolved_name = $context->self; - } elseif ($resolved_name === 'parent' && $parent_fqcln) { - $resolved_name = $parent_fqcln; - } - - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $this, - $return_name_node, - $resolved_name, - $context->calling_method_id, - false, - true - ); - } - } - - if ($storage->return_type - && $storage->return_type_location - && $storage->return_type_location !== $storage->signature_return_type_location - ) { - $replace_type = TypeExpander::expandUnion( - $codebase, - $storage->return_type, - $context->self, - 'static', - $this->getParentFQCLN(), - false - ); - - $codebase->classlikes->handleDocblockTypeInMigration( - $codebase, - $this, - $replace_type, - $storage->return_type_location, - $context->calling_method_id - ); - } - - foreach ($params as $function_param) { - if ($function_param->type - && $function_param->type_location - && $function_param->type_location !== $function_param->signature_type_location - && $function_param->type_location->file_path === $this->getFilePath() - ) { - $replace_type = TypeExpander::expandUnion( - $codebase, - $function_param->type, - $context->self, - 'static', - $this->getParentFQCLN(), - false - ); - - $codebase->classlikes->handleDocblockTypeInMigration( - $codebase, - $this, - $replace_type, - $function_param->type_location, - $context->calling_method_id - ); - } - } - } - - /** - * @param array $function_stmts - */ - public function verifyReturnType( - array $function_stmts, - StatementsAnalyzer $statements_analyzer, - ?Union $return_type = null, - ?string $fq_class_name = null, - ?CodeLocation $return_type_location = null, - bool $did_explicitly_return = false, - bool $closure_inside_call = false - ): void { - ReturnTypeAnalyzer::verifyReturnType( - $this->function, - $function_stmts, - $statements_analyzer, - $statements_analyzer->node_data, - $this, - $return_type, - $fq_class_name, - $fq_class_name, - $return_type_location, - [], - $did_explicitly_return, - $closure_inside_call - ); - } - - public function addOrUpdateParamType( - ProjectAnalyzer $project_analyzer, - string $param_name, - Union $inferred_return_type, - bool $docblock_only = false - ): void { - $manipulator = FunctionDocblockManipulator::getForFunction( - $project_analyzer, - $this->source->getFilePath(), - $this->function - ); - - $codebase = $project_analyzer->getCodebase(); - $is_final = true; - $fqcln = $this->source->getFQCLN(); - - if ($fqcln !== null && $this instanceof MethodAnalyzer) { - $class_storage = $codebase->classlike_storage_provider->get($fqcln); - $is_final = $this->function->isFinal() || $class_storage->final; - } - - $allow_native_type = !$docblock_only - && $codebase->php_major_version >= 7 - && ( - $codebase->allow_backwards_incompatible_changes - || $is_final - || !$this instanceof MethodAnalyzer - ); - - $manipulator->setParamType( - $param_name, - $allow_native_type - ? $inferred_return_type->toPhpString( - $this->source->getNamespace(), - $this->source->getAliasedClassesFlipped(), - $this->source->getFQCLN(), - $project_analyzer->getCodebase()->php_major_version, - $project_analyzer->getCodebase()->php_minor_version - ) : null, - $inferred_return_type->toNamespacedString( - $this->source->getNamespace(), - $this->source->getAliasedClassesFlipped(), - $this->source->getFQCLN(), - false - ), - $inferred_return_type->toNamespacedString( - $this->source->getNamespace(), - $this->source->getAliasedClassesFlipped(), - $this->source->getFQCLN(), - true - ) - ); - } - - /** - * Adds return types for the given function - */ - public function addReturnTypes(Context $context): void - { - if ($this->return_vars_in_scope !== null) { - $this->return_vars_in_scope = TypeAnalyzer::combineKeyedTypes( - $context->vars_in_scope, - $this->return_vars_in_scope - ); - } else { - $this->return_vars_in_scope = $context->vars_in_scope; - } - - if ($this->return_vars_possibly_in_scope !== null) { - $this->return_vars_possibly_in_scope = array_merge( - $context->vars_possibly_in_scope, - $this->return_vars_possibly_in_scope - ); - } else { - $this->return_vars_possibly_in_scope = $context->vars_possibly_in_scope; - } - } - - public function examineParamTypes( - StatementsAnalyzer $statements_analyzer, - Context $context, - Codebase $codebase, - PhpParser\Node $stmt = null - ): void { - $storage = $this->getFunctionLikeStorage($statements_analyzer); - - foreach ($storage->params as $param) { - if ($param->by_ref && isset($context->vars_in_scope['$' . $param->name]) && !$param->is_variadic) { - $actual_type = $context->vars_in_scope['$' . $param->name]; - $param_out_type = $param->out_type ?: $param->type; - - if ($param_out_type && !$actual_type->hasMixed() && $param->location) { - if (!UnionTypeComparator::isContainedBy( - $codebase, - $actual_type, - $param_out_type, - $actual_type->ignore_nullable_issues, - $actual_type->ignore_falsable_issues - ) - ) { - IssueBuffer::maybeAdd( - new ReferenceConstraintViolation( - 'Variable ' . '$' . $param->name . ' is limited to values of type ' - . $param_out_type->getId() - . ' because it is passed by reference, ' - . $actual_type->getId() . ' type found. Use @param-out to specify ' - . 'a different output type', - $stmt - ? new CodeLocation($this, $stmt) - : $param->location - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - } - } - - public function getMethodName(): ?string - { - if ($this->function instanceof ClassMethod) { - return (string)$this->function->name; - } - - return null; - } - - public function getCorrectlyCasedMethodId(?string $context_self = null): string - { - if ($this->function instanceof ClassMethod) { - $function_name = (string)$this->function->name; - - return ($context_self ?: $this->source->getFQCLN()) . '::' . $function_name; - } - - if ($this->function instanceof Function_) { - $namespace = $this->source->getNamespace(); - - return ($namespace ? $namespace . '\\' : '') . $this->function->name; - } - - if (!$this instanceof ClosureAnalyzer) { - throw new UnexpectedValueException('This is weird'); - } - - return $this->getClosureId(); - } - - public function getFunctionLikeStorage(?StatementsAnalyzer $statements_analyzer = null): FunctionLikeStorage - { - $codebase = $this->codebase; - - if ($this->function instanceof ClassMethod && $this instanceof MethodAnalyzer) { - $method_id = $this->getMethodId(); - $codebase_methods = $codebase->methods; - - try { - return $codebase_methods->getStorage($method_id); - } catch (UnexpectedValueException $e) { - $declaring_method_id = $codebase_methods->getDeclaringMethodId($method_id); - - if ($declaring_method_id === null) { - throw new UnexpectedValueException('Cannot get storage for function that doesn‘t exist'); - } - - // happens for fake constructors - return $codebase_methods->getStorage($declaring_method_id); - } - } - - if ($this instanceof FunctionAnalyzer) { - $function_id = $this->getFunctionId(); - } elseif ($this instanceof ClosureAnalyzer) { - $function_id = $this->getClosureId(); - } else { - throw new UnexpectedValueException('This is weird'); - } - - return $codebase->functions->getStorage($statements_analyzer, $function_id); - } - - /** @return non-empty-string */ - public function getId(): string - { - if ($this instanceof MethodAnalyzer) { - return (string) $this->getMethodId(); - } - - if ($this instanceof FunctionAnalyzer) { - return $this->getFunctionId(); - } - - if ($this instanceof ClosureAnalyzer) { - return $this->getClosureId(); - } - - throw new UnexpectedValueException('This is weird'); - } - - /** - * @return array - */ - public function getAliasedClassesFlipped(): array - { - if ($this->source instanceof NamespaceAnalyzer || - $this->source instanceof FileAnalyzer || - $this->source instanceof ClassLikeAnalyzer - ) { - return $this->source->getAliasedClassesFlipped(); - } - - return []; - } - - /** - * @return array - */ - public function getAliasedClassesFlippedReplaceable(): array - { - if ($this->source instanceof NamespaceAnalyzer || - $this->source instanceof FileAnalyzer || - $this->source instanceof ClassLikeAnalyzer - ) { - return $this->source->getAliasedClassesFlippedReplaceable(); - } - - return []; - } - - /** - * @return array>|null - */ - public function getTemplateTypeMap(): ?array - { - if ($this->source instanceof ClassLikeAnalyzer) { - return ($this->source->getTemplateTypeMap() ?: []) - + ($this->storage->template_types ?: []); - } - - return $this->storage->template_types; - } - - public function isStatic(): bool - { - return $this->is_static; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * Get a list of suppressed issues - * - * @return array - */ - public function getSuppressedIssues(): array - { - return $this->suppressed_issues; - } - - /** - * @param array $new_issues - */ - public function addSuppressedIssues(array $new_issues): void - { - if (isset($new_issues[0])) { - $new_issues = array_combine($new_issues, $new_issues); - } - - $this->suppressed_issues = $new_issues + $this->suppressed_issues; - } - - /** - * @param array $new_issues - */ - public function removeSuppressedIssues(array $new_issues): void - { - if (isset($new_issues[0])) { - $new_issues = array_combine($new_issues, $new_issues); - } - - $this->suppressed_issues = array_diff_key($this->suppressed_issues, $new_issues); - } - - /** - * Adds a suppressed issue, useful when creating a method checker from scratch - * - */ - public function addSuppressedIssue(string $issue_name): void - { - $this->suppressed_issues[] = $issue_name; - } - - public static function clearCache(): void - { - self::$no_effects_hashes = []; - } - - public function getLocalReturnType(Union $storage_return_type, bool $final = false): Union - { - if ($this->local_return_type) { - return $this->local_return_type; - } - - $this->local_return_type = TypeExpander::expandUnion( - $this->codebase, - $storage_return_type, - $this->getFQCLN(), - $this->getFQCLN(), - $this->getParentFQCLN(), - true, - true, - $final - ); - - return $this->local_return_type; - } - - /** - * @return array{ - * MethodIdentifier|null, - * MethodIdentifier|null, - * ClassLikeStorage|null, - * ?string, - * ?string, - * array - * }|null - */ - private function getFunctionInformation( - Context $context, - Codebase $codebase, - NodeDataProvider $type_provider, - FunctionLikeStorage $storage, - bool $add_mutations - ): ?array { - $classlike_storage_provider = $codebase->classlike_storage_provider; - $real_method_id = null; - $method_id = null; - - $cased_method_id = null; - $hash = null; - $appearing_class_storage = null; - $overridden_method_ids = []; - - if ($this instanceof MethodAnalyzer) { - if (!$storage instanceof MethodStorage) { - throw new UnexpectedValueException('$storage must be MethodStorage'); - } - - $real_method_id = $this->getMethodId(); - - $method_id = $this->getMethodId($context->self); - - $fq_class_name = (string)$context->self; - $appearing_class_storage = $classlike_storage_provider->get($fq_class_name); - - if ($add_mutations) { - if (!$context->collect_initializations) { - $hash = md5($real_method_id . '::' . $context->getScopeSummary()); - - // if we know that the function has no effects on vars, we don't bother rechecking - if (isset(self::$no_effects_hashes[$hash])) { - return null; - } - } - } elseif ($context->self) { - if ($appearing_class_storage->template_types) { - $template_params = []; - - foreach ($appearing_class_storage->template_types as $param_name => $template_map) { - $key = array_keys($template_map)[0]; - - $template_params[] = new Union([ - new TTemplateParam( - $param_name, - reset($template_map), - $key - ) - ]); - } - - $this_object_type = new TGenericObject( - $context->self, - $template_params - ); - } else { - $this_object_type = new TNamedObject($context->self); - } - - $this_object_type->was_static = !$storage->final; - - if ($this->storage instanceof MethodStorage && $this->storage->if_this_is_type) { - $template_result = new TemplateResult($this->getTemplateTypeMap() ?? [], []); - - TemplateStandinTypeReplacer::replace( - new Union([$this_object_type]), - $template_result, - $codebase, - null, - $this->storage->if_this_is_type - ); - - foreach ($context->vars_in_scope as $var_name => $var_type) { - if (0 === mb_strpos($var_name, '$this->')) { - TemplateInferredTypeReplacer::replace($var_type, $template_result, $codebase); - } - } - - $context->vars_in_scope['$this'] = $this->storage->if_this_is_type; - } else { - $context->vars_in_scope['$this'] = new Union([$this_object_type]); - } - - if ($codebase->taint_flow_graph - && $storage->specialize_call - && $storage->location - ) { - $new_parent_node = DataFlowNode::getForAssignment('$this in ' . $method_id, $storage->location); - - $codebase->taint_flow_graph->addNode($new_parent_node); - $context->vars_in_scope['$this']->parent_nodes += [$new_parent_node->id => $new_parent_node]; - } - - if ($storage->external_mutation_free - && !$storage->mutation_free_inferred - ) { - $context->vars_in_scope['$this']->reference_free = true; - - if ($this->function->name->name !== '__construct') { - $context->vars_in_scope['$this']->allow_mutations = false; - } - } - - $context->vars_possibly_in_scope['$this'] = true; - } - - if ($appearing_class_storage->has_visitor_issues) { - return null; - } - - $cased_method_id = $fq_class_name . '::' . $storage->cased_name; - - $overridden_method_ids = $codebase->methods->getOverriddenMethodIds($method_id); - - $codeLocation = new CodeLocation( - $this, - $this->function, - null, - true - ); - - if ($overridden_method_ids - && !$context->collect_initializations - && !$context->collect_mutations - ) { - foreach ($overridden_method_ids as $overridden_method_id) { - $parent_method_storage = $codebase->methods->getStorage($overridden_method_id); - - $overridden_fq_class_name = $overridden_method_id->fq_class_name; - - $parent_storage = $classlike_storage_provider->get($overridden_fq_class_name); - - if ($this->function->name->name === '__construct' - && !$parent_storage->preserve_constructor_signature - ) { - continue; - } - - $implementer_visibility = $storage->visibility; - - $implementer_appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); - $implementer_declaring_method_id = $real_method_id; - - $declaring_class_storage = $appearing_class_storage; - - if ($implementer_appearing_method_id - && $implementer_appearing_method_id !== $implementer_declaring_method_id - ) { - $appearing_fq_class_name = $implementer_appearing_method_id->fq_class_name; - $appearing_method_name = $implementer_appearing_method_id->method_name; - - $declaring_fq_class_name = $implementer_declaring_method_id->fq_class_name; - - $appearing_class_storage = $classlike_storage_provider->get( - $appearing_fq_class_name - ); - - $declaring_class_storage = $classlike_storage_provider->get( - $declaring_fq_class_name - ); - - if (isset($appearing_class_storage->trait_visibility_map[$appearing_method_name])) { - $implementer_visibility - = $appearing_class_storage->trait_visibility_map[$appearing_method_name]; - } - } - - // we've already checked this in the class checker - if (!isset($appearing_class_storage->class_implements[strtolower($overridden_fq_class_name)])) { - MethodComparator::compare( - $codebase, - count($overridden_method_ids) === 1 ? $this->function : null, - $declaring_class_storage, - $parent_storage, - $storage, - $parent_method_storage, - $fq_class_name, - $implementer_visibility, - $codeLocation, - $storage->suppressed_issues - ); - } - } - } - - MethodAnalyzer::checkMethodSignatureMustOmitReturnType($storage, $codeLocation); - - if (!$context->calling_method_id || !$context->collect_initializations) { - $context->calling_method_id = strtolower((string)$method_id); - } - } elseif ($this instanceof FunctionAnalyzer) { - $function_name = $this->function->name->name; - $namespace_prefix = $this->getNamespace(); - $cased_method_id = ($namespace_prefix !== null ? $namespace_prefix . '\\' : '') . $function_name; - $context->calling_function_id = strtolower($cased_method_id); - } elseif ($this instanceof ClosureAnalyzer) { - if ($storage->return_type) { - $closure_return_type = TypeExpander::expandUnion( - $codebase, - $storage->return_type, - $context->self, - $context->self, - $this->getParentFQCLN() - ); - } else { - $closure_return_type = Type::getMixed(); - } - - $closure_type = new TClosure( - 'Closure', - $storage->params, - $closure_return_type - ); - - if ($storage instanceof FunctionStorage) { - $closure_type->byref_uses = $storage->byref_uses; - $closure_type->is_pure = $storage->pure; - } - - $type_provider->setType( - $this->function, - new Union([ - $closure_type, - ]) - ); - } else { - throw new UnexpectedValueException('Impossible'); - } - - return [ - $real_method_id, - $method_id, - $appearing_class_storage, - $hash, - $cased_method_id, - $overridden_method_ids - ]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php deleted file mode 100644 index 9c68e2ed..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php +++ /dev/null @@ -1,147 +0,0 @@ -class instanceof PhpParser\Node\Stmt\Interface_) { - throw new LogicException('Something went badly wrong'); - } - - $project_analyzer = $this->file_analyzer->project_analyzer; - $codebase = $project_analyzer->getCodebase(); - $config = $project_analyzer->getConfig(); - - if ($this->class->extends) { - foreach ($this->class->extends as $extended_interface) { - $extended_interface_name = self::getFQCLNFromNameObject( - $extended_interface, - $this->getAliases() - ); - - $parent_reference_location = new CodeLocation($this, $extended_interface); - - if (!$codebase->classOrInterfaceExists( - $extended_interface_name, - $parent_reference_location - )) { - // we should not normally get here - return; - } - - try { - $extended_interface_storage = $codebase->classlike_storage_provider->get($extended_interface_name); - } catch (InvalidArgumentException $e) { - continue; - } - - if (!$extended_interface_storage->is_interface) { - $code_location = new CodeLocation( - $this, - $extended_interface - ); - - IssueBuffer::maybeAdd( - new UndefinedInterface( - $extended_interface_name . ' is not an interface', - $code_location, - $extended_interface_name - ), - $this->getSuppressedIssues() - ); - } - - if ($codebase->store_node_types && $extended_interface_name) { - $bounds = $parent_reference_location->getSelectionBounds(); - - $codebase->analyzer->addOffsetReference( - $this->getFilePath(), - $bounds[0], - $bounds[1], - $extended_interface_name - ); - } - } - } - - $fq_interface_name = $this->getFQCLN(); - - if (!$fq_interface_name) { - throw new UnexpectedValueException('bad'); - } - - $class_storage = $codebase->classlike_storage_provider->get($fq_interface_name); - $interface_context = new Context($this->getFQCLN()); - - AttributesAnalyzer::analyze( - $this, - $interface_context, - $class_storage, - $this->class->attrGroups, - AttributesAnalyzer::TARGET_CLASS, - $class_storage->suppressed_issues + $this->getSuppressedIssues() - ); - - foreach ($this->class->stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod) { - $method_analyzer = new MethodAnalyzer($stmt, $this); - - $type_provider = new NodeDataProvider(); - - $method_analyzer->analyze($interface_context, $type_provider); - - $actual_method_id = $method_analyzer->getMethodId(); - - if ($stmt->name->name !== '__construct' - && $config->reportIssueInFile('InvalidReturnType', $this->getFilePath()) - ) { - ClassAnalyzer::analyzeClassMethodReturnType( - $stmt, - $method_analyzer, - $this, - $type_provider, - $codebase, - $class_storage, - $fq_interface_name, - $actual_method_id, - $actual_method_id, - false - ); - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Property) { - IssueBuffer::maybeAdd( - new ParseError( - 'Interfaces cannot have properties', - new CodeLocation($this, $stmt) - ) - ); - - return; - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php deleted file mode 100644 index 4ab16f26..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php +++ /dev/null @@ -1,175 +0,0 @@ - - */ - public $taint_trace; - - /** - * @var ?list - */ - public $other_references; - - /** - * @var ?string - * @readonly - */ - public $dupe_key; - - /** - * @param ?list $taint_trace - * @param ?list $other_references - */ - public function __construct( - string $severity, - int $line_from, - int $line_to, - string $type, - string $message, - string $file_name, - string $file_path, - string $snippet, - string $selected_text, - int $from, - int $to, - int $snippet_from, - int $snippet_to, - int $column_from, - int $column_to, - int $shortcode = 0, - int $error_level = -1, - ?array $taint_trace = null, - array $other_references = null, - ?string $dupe_key = null - ) { - $this->severity = $severity; - $this->line_from = $line_from; - $this->line_to = $line_to; - $this->type = $type; - $this->message = $message; - $this->file_name = $file_name; - $this->file_path = $file_path; - $this->snippet = $snippet; - $this->selected_text = $selected_text; - $this->from = $from; - $this->to = $to; - $this->snippet_from = $snippet_from; - $this->snippet_to = $snippet_to; - $this->column_from = $column_from; - $this->column_to = $column_to; - $this->shortcode = $shortcode; - $this->error_level = $error_level; - $this->link = $shortcode ? 'https://psalm.dev/' . str_pad((string) $shortcode, 3, "0", STR_PAD_LEFT) : ''; - $this->taint_trace = $taint_trace; - $this->other_references = $other_references; - $this->dupe_key = $dupe_key; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php deleted file mode 100644 index a3b02c14..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php +++ /dev/null @@ -1,290 +0,0 @@ - - */ -class MethodAnalyzer extends FunctionLikeAnalyzer -{ - public function __construct( - PhpParser\Node\Stmt\ClassMethod $function, - SourceAnalyzer $source, - ?MethodStorage $storage = null - ) { - $codebase = $source->getCodebase(); - - $method_name_lc = strtolower((string) $function->name); - - $source_fqcln = (string) $source->getFQCLN(); - - $source_fqcln_lc = strtolower($source_fqcln); - - $method_id = new MethodIdentifier($source_fqcln, $method_name_lc); - - if (!$storage) { - try { - $storage = $codebase->methods->getStorage($method_id); - } catch (UnexpectedValueException $e) { - $class_storage = $codebase->classlike_storage_provider->get($source_fqcln_lc); - - if (!$class_storage->parent_classes) { - throw $e; - } - - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if (!$declaring_method_id) { - throw $e; - } - - // happens for fake constructors - $storage = $codebase->methods->getStorage($declaring_method_id); - } - } - - parent::__construct($function, $source, $storage); - } - - /** - * Determines whether a given method is static or not - * @param array $suppressed_issues - */ - public static function checkStatic( - MethodIdentifier $method_id, - bool $self_call, - bool $is_context_dynamic, - Codebase $codebase, - CodeLocation $code_location, - array $suppressed_issues, - ?bool &$is_dynamic_this_method = false - ): bool { - $codebase_methods = $codebase->methods; - - if ($method_id->fq_class_name === 'Closure' - && $method_id->method_name === 'fromcallable' - ) { - return true; - } - - $original_method_id = $method_id; - - $method_id = $codebase_methods->getDeclaringMethodId($method_id); - - if (!$method_id) { - if (InternalCallMapHandler::inCallMap((string) $original_method_id)) { - return true; - } - - throw new LogicException('Declaring method for ' . $original_method_id . ' should not be null'); - } - - $storage = $codebase_methods->getStorage($method_id); - - if (!$storage->is_static) { - if ($self_call) { - if (!$is_context_dynamic) { - if (IssueBuffer::accepts( - new NonStaticSelfCall( - 'Method ' . $codebase_methods->getCasedMethodId($method_id) . - ' is not static, but is called ' . - 'using self::', - $code_location - ), - $suppressed_issues - )) { - return false; - } - } else { - $is_dynamic_this_method = true; - } - } else { - if (IssueBuffer::accepts( - new InvalidStaticInvocation( - 'Method ' . $codebase_methods->getCasedMethodId($method_id) . - ' is not static, but is called ' . - 'statically', - $code_location - ), - $suppressed_issues - )) { - return false; - } - } - } - - return true; - } - - /** - * @param string[] $suppressed_issues - * @param lowercase-string|null $calling_method_id - * - */ - public static function checkMethodExists( - Codebase $codebase, - MethodIdentifier $method_id, - CodeLocation $code_location, - array $suppressed_issues, - ?string $calling_method_id = null - ): ?bool { - if ($codebase->methods->methodExists( - $method_id, - $calling_method_id, - !$calling_method_id - || $calling_method_id !== strtolower((string) $method_id) - ? $code_location - : null, - null, - $code_location->file_path - )) { - return true; - } - - if (IssueBuffer::accepts( - new UndefinedMethod('Method ' . $method_id . ' does not exist', $code_location, (string) $method_id), - $suppressed_issues - )) { - return false; - } - - return null; - } - - public static function isMethodVisible( - MethodIdentifier $method_id, - Context $context, - StatementsSource $source - ): bool { - $codebase = $source->getCodebase(); - - $fq_classlike_name = $method_id->fq_class_name; - $method_name = $method_id->method_name; - - if ($codebase->methods->visibility_provider->has($fq_classlike_name)) { - $method_visible = $codebase->methods->visibility_provider->isMethodVisible( - $source, - $fq_classlike_name, - $method_name, - $context, - null - ); - - if ($method_visible !== null) { - return $method_visible; - } - } - - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if (!$declaring_method_id) { - // this can happen for methods in the callmap that were not reflected - return true; - } - - $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); - - $appearing_method_class = null; - - if ($appearing_method_id) { - $appearing_method_class = $appearing_method_id->fq_class_name; - - // if the calling class is the same, we know the method exists, so it must be visible - if ($appearing_method_class === $context->self) { - return true; - } - } - - $declaring_method_class = $declaring_method_id->fq_class_name; - - if ($source->getSource() instanceof TraitAnalyzer - && strtolower($declaring_method_class) === strtolower((string) $source->getFQCLN()) - ) { - return true; - } - - $storage = $codebase->methods->getStorage($declaring_method_id); - - switch ($storage->visibility) { - case ClassLikeAnalyzer::VISIBILITY_PUBLIC: - return true; - - case ClassLikeAnalyzer::VISIBILITY_PRIVATE: - return $context->self && $appearing_method_class === $context->self; - - case ClassLikeAnalyzer::VISIBILITY_PROTECTED: - if (!$context->self) { - return false; - } - - if ($appearing_method_class - && $codebase->classExtends($appearing_method_class, $context->self) - ) { - return true; - } - - if ($appearing_method_class - && !$codebase->classExtends($context->self, $appearing_method_class) - ) { - return false; - } - } - - return true; - } - - /** - * Check that __clone, __construct, and __destruct do not have a return type - * hint in their signature. - */ - public static function checkMethodSignatureMustOmitReturnType( - MethodStorage $method_storage, - CodeLocation $code_location - ): void { - if ($method_storage->signature_return_type === null) { - return; - } - - $cased_method_name = $method_storage->cased_name; - $methodsOfInterest = ['__clone', '__construct', '__destruct']; - - if (in_array($cased_method_name, $methodsOfInterest)) { - IssueBuffer::maybeAdd( - new MethodSignatureMustOmitReturnType( - 'Method ' . $cased_method_name . ' must not declare a return type', - $code_location - ) - ); - } - } - - public function getMethodId(?string $context_self = null): MethodIdentifier - { - $function_name = (string)$this->function->name; - - return new MethodIdentifier( - $context_self ?: (string) $this->source->getFQCLN(), - strtolower($function_name) - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php deleted file mode 100644 index 16ff2d9d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php +++ /dev/null @@ -1,1080 +0,0 @@ -name, - strtolower($guide_method_storage->cased_name ?: '') - ); - - $implementer_declaring_method_id = $codebase->methods->getDeclaringMethodId( - $implementer_method_id - ); - - $cased_implementer_method_id = $implementer_classlike_storage->name . '::' - . $implementer_method_storage->cased_name; - - $cased_guide_method_id = $guide_classlike_storage->name . '::' . $guide_method_storage->cased_name; - - $codebase->methods->file_reference_provider->addMethodDependencyToClassMember( - strtolower((string)($implementer_declaring_method_id ?? $implementer_method_id)), - strtolower($guide_classlike_storage->name . '::' . $guide_method_storage->cased_name) - ); - - self::checkForObviousMethodMismatches( - $guide_classlike_storage, - $implementer_classlike_storage, - $guide_method_storage, - $implementer_method_storage, - $guide_method_storage->visibility, - $implementer_visibility, - $cased_guide_method_id, - $cased_implementer_method_id, - $prevent_method_signature_mismatch, - $prevent_abstract_override, - $codebase->php_major_version >= 8, - $code_location, - $suppressed_issues - ); - - if ($guide_method_storage->signature_return_type && $prevent_method_signature_mismatch) { - self::compareMethodSignatureReturnTypes( - $codebase, - $guide_classlike_storage, - $implementer_classlike_storage, - $guide_method_storage, - $implementer_method_storage, - $guide_method_storage->signature_return_type, - $cased_guide_method_id, - $implementer_called_class_name, - $cased_implementer_method_id, - $code_location, - $suppressed_issues - ); - } - - if ($guide_method_storage->return_type - && $implementer_method_storage->return_type - && !$implementer_method_storage->inherited_return_type - && ($guide_method_storage->signature_return_type !== $guide_method_storage->return_type - || $implementer_method_storage->signature_return_type !== $implementer_method_storage->return_type) - && $implementer_classlike_storage->user_defined - && (!$guide_classlike_storage->stubbed || $guide_classlike_storage->template_types) - ) { - self::compareMethodDocblockReturnTypes( - $codebase, - $guide_classlike_storage, - $implementer_classlike_storage, - $implementer_method_storage, - $guide_method_storage->return_type, - $implementer_method_storage->return_type, - $cased_guide_method_id, - $implementer_called_class_name, - $implementer_declaring_method_id, - $code_location, - $suppressed_issues - ); - } - - foreach ($guide_method_storage->params as $i => $guide_param) { - if (!isset($implementer_method_storage->params[$i])) { - if (!$prevent_abstract_override && $i >= $guide_method_storage->required_param_count) { - continue; - } - - if (IssueBuffer::accepts( - new MethodSignatureMismatch( - 'Method ' . $cased_implementer_method_id . ' has fewer parameters than parent method ' . - $cased_guide_method_id, - $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - )) { - return false; - } - - return null; - } - - self::compareMethodParams( - $codebase, - $stmt, - $implementer_classlike_storage, - $guide_classlike_storage, - $implementer_called_class_name, - $guide_method_storage, - $implementer_method_storage, - $guide_param, - $implementer_method_storage->params[$i], - $i, - $cased_guide_method_id, - $cased_implementer_method_id, - $prevent_method_signature_mismatch, - $code_location, - $suppressed_issues - ); - } - - if ($guide_classlike_storage->user_defined - && ($guide_classlike_storage->is_interface - || $guide_classlike_storage->preserve_constructor_signature - || $implementer_method_storage->cased_name !== '__construct') - && $implementer_method_storage->required_param_count > $guide_method_storage->required_param_count - ) { - if ($implementer_method_storage->cased_name !== '__construct') { - if (IssueBuffer::accepts( - new MethodSignatureMismatch( - 'Method ' . $cased_implementer_method_id . ' has more required parameters than parent method ' . - $cased_guide_method_id, - $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - )) { - return false; - } - } else { - if (IssueBuffer::accepts( - new ConstructorSignatureMismatch( - 'Method ' . $cased_implementer_method_id . ' has more required parameters than parent method ' . - $cased_guide_method_id, - $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - )) { - return false; - } - } - - - return null; - } - - return null; - } - - /** - * @param string[] $suppressed_issues - */ - private static function checkForObviousMethodMismatches( - ClassLikeStorage $guide_classlike_storage, - ClassLikeStorage $implementer_classlike_storage, - MethodStorage $guide_method_storage, - MethodStorage $implementer_method_storage, - int $guide_visibility, - int $implementer_visibility, - string $cased_guide_method_id, - string $cased_implementer_method_id, - bool $prevent_method_signature_mismatch, - bool $prevent_abstract_override, - bool $trait_mismatches_are_fatal, - CodeLocation $code_location, - array $suppressed_issues - ): void { - if ($implementer_visibility > $guide_visibility) { - if ($trait_mismatches_are_fatal - || $guide_classlike_storage->is_trait === $implementer_classlike_storage->is_trait - || !in_array($guide_classlike_storage->name, $implementer_classlike_storage->used_traits) - || $implementer_method_storage->defining_fqcln !== $implementer_classlike_storage->name - || (!$implementer_method_storage->abstract - && !$guide_method_storage->abstract) - ) { - IssueBuffer::maybeAdd( - new OverriddenMethodAccess( - 'Method ' . $cased_implementer_method_id . ' has different access level than ' - . $cased_guide_method_id, - $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } elseif (IssueBuffer::accepts( - new TraitMethodSignatureMismatch( - 'Method ' . $cased_implementer_method_id . ' has different access level than ' - . $cased_guide_method_id, - $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - )) { - // fall through - } - } - - if ($guide_method_storage->final - && $prevent_method_signature_mismatch - && $prevent_abstract_override - ) { - IssueBuffer::maybeAdd( - new MethodSignatureMismatch( - 'Method ' . $cased_guide_method_id . ' is declared final and cannot be overridden', - $code_location - ), - $guide_method_storage->final_from_docblock ? - $suppressed_issues + $implementer_classlike_storage->suppressed_issues : - [] - ); - } - - if ($prevent_abstract_override - && !$guide_method_storage->abstract - && $implementer_method_storage->abstract - && !$guide_classlike_storage->abstract - && !$guide_classlike_storage->is_interface - ) { - IssueBuffer::maybeAdd( - new MethodSignatureMismatch( - 'Method ' . $cased_implementer_method_id . ' cannot be abstract when inherited method ' - . $cased_guide_method_id . ' is non-abstract', - $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } - - if ($guide_method_storage->external_mutation_free - && !$implementer_method_storage->external_mutation_free - && !$guide_method_storage->mutation_free_inferred - && $prevent_method_signature_mismatch - ) { - IssueBuffer::maybeAdd( - new MissingImmutableAnnotation( - $cased_guide_method_id . ' is marked @psalm-immutable, but ' - . $implementer_classlike_storage->name . '::' - . ($guide_method_storage->cased_name ?: '') - . ' is not marked @psalm-immutable', - $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } - } - - /** - * @param string[] $suppressed_issues - */ - private static function compareMethodParams( - Codebase $codebase, - ?ClassMethod $stmt, - ClassLikeStorage $implementer_classlike_storage, - ClassLikeStorage $guide_classlike_storage, - string $implementer_called_class_name, - MethodStorage $guide_method_storage, - MethodStorage $implementer_method_storage, - FunctionLikeParameter $guide_param, - FunctionLikeParameter $implementer_param, - int $i, - string $cased_guide_method_id, - string $cased_implementer_method_id, - bool $prevent_method_signature_mismatch, - CodeLocation $code_location, - array $suppressed_issues - ): void { - if ($prevent_method_signature_mismatch) { - if (!$guide_classlike_storage->user_defined - && $guide_param->type - ) { - $implementer_param_type = $implementer_param->signature_type; - - $guide_param_signature_type = $guide_param->type; - - $or_null_guide_param_signature_type = $guide_param->signature_type - ? clone $guide_param->signature_type - : null; - - if ($or_null_guide_param_signature_type) { - $or_null_guide_param_signature_type->addType(new TNull); - } - - if ($cased_guide_method_id === 'Serializable::unserialize') { - $guide_param_signature_type = null; - $or_null_guide_param_signature_type = null; - } - - if (!$guide_param->type->hasMixed() - && !$guide_param->type->from_docblock - && ($implementer_param_type || $guide_param_signature_type) - ) { - $config = Config::getInstance(); - - if ($implementer_param_type - && (!$guide_param_signature_type - || strtolower($implementer_param_type->getId()) - !== strtolower($guide_param_signature_type->getId())) - && (!$or_null_guide_param_signature_type - || strtolower($implementer_param_type->getId()) - !== strtolower($or_null_guide_param_signature_type->getId())) - ) { - if ($implementer_method_storage->cased_name === '__construct') { - IssueBuffer::maybeAdd( - new ConstructorSignatureMismatch( - 'Argument ' . ($i + 1) . ' of ' - . $cased_implementer_method_id . ' has wrong type \'' - . $implementer_param_type . '\', expecting \'' - . $guide_param_signature_type . '\' as defined by ' - . $cased_guide_method_id, - $implementer_param->location - && $config->isInProjectDirs( - $implementer_param->location->file_path - ) - ? $implementer_param->location - : $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new MethodSignatureMismatch( - 'Argument ' . ($i + 1) . ' of ' - . $cased_implementer_method_id . ' has wrong type \'' - . $implementer_param_type . '\', expecting \'' - . $guide_param_signature_type . '\' as defined by ' - . $cased_guide_method_id, - $implementer_param->location - && $config->isInProjectDirs( - $implementer_param->location->file_path - ) - ? $implementer_param->location - : $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } - - - return; - } - } - } - - $config = Config::getInstance(); - - if ($guide_param->name !== $implementer_param->name - && $guide_method_storage->allow_named_arg_calls - && $guide_classlike_storage->user_defined - && $implementer_classlike_storage->user_defined - && $implementer_param->location - && $guide_method_storage->cased_name - && strpos($guide_method_storage->cased_name, '__') !== 0 - && $config->isInProjectDirs( - $implementer_param->location->file_path - ) - ) { - if ($config->allow_named_arg_calls - || ($guide_classlike_storage->location - && !$config->isInProjectDirs($guide_classlike_storage->location->file_path) - ) - ) { - if ($codebase->alter_code) { - $project_analyzer = ProjectAnalyzer::getInstance(); - - if ($stmt && isset($project_analyzer->getIssuesToFix()['ParamNameMismatch'])) { - $param_replacer = new ParamReplacementVisitor( - $implementer_param->name, - $guide_param->name - ); - - $traverser = new NodeTraverser(); - $traverser->addVisitor($param_replacer); - $traverser->traverse([$stmt]); - - if ($replacements = $param_replacer->getReplacements()) { - FileManipulationBuffer::add( - $implementer_param->location->file_path, - $replacements - ); - } - } - } else { - IssueBuffer::maybeAdd( - new ParamNameMismatch( - 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id . ' has wrong name $' - . $implementer_param->name . ', expecting $' - . $guide_param->name . ' as defined by ' - . $cased_guide_method_id, - $implementer_param->location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } - } - } - - if ($guide_classlike_storage->user_defined - && $implementer_param->signature_type - ) { - self::compareMethodSignatureParams( - $codebase, - $i, - $guide_classlike_storage, - $implementer_classlike_storage, - $guide_method_storage, - $implementer_method_storage, - $guide_param, - $implementer_param->signature_type, - $cased_guide_method_id, - $cased_implementer_method_id, - $code_location, - $suppressed_issues - ); - } - } - - if ($implementer_param->type - && $guide_param->type - && $implementer_param->type->getId() !== $guide_param->type->getId() - ) { - self::compareMethodDocblockParams( - $codebase, - $i, - $guide_classlike_storage, - $implementer_classlike_storage, - $implementer_called_class_name, - $guide_method_storage, - $implementer_method_storage, - $cased_guide_method_id, - $cased_implementer_method_id, - $guide_param->type, - $implementer_param->type, - $code_location, - $suppressed_issues - ); - } - - if ($guide_classlike_storage->user_defined && $implementer_param->by_ref !== $guide_param->by_ref) { - $config = Config::getInstance(); - - IssueBuffer::maybeAdd( - new MethodSignatureMismatch( - 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id . ' is' . - ($implementer_param->by_ref ? '' : ' not') . ' passed by reference, but argument ' . - ($i + 1) . ' of ' . $cased_guide_method_id . ' is' . ($guide_param->by_ref ? '' : ' not'), - $implementer_param->location - && $config->isInProjectDirs( - $implementer_param->location->file_path - ) - ? $implementer_param->location - : $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } - } - - /** - * @param string[] $suppressed_issues - */ - private static function compareMethodSignatureParams( - Codebase $codebase, - int $i, - ClassLikeStorage $guide_classlike_storage, - ClassLikeStorage $implementer_classlike_storage, - MethodStorage $guide_method_storage, - MethodStorage $implementer_method_storage, - FunctionLikeParameter $guide_param, - Union $implementer_param_signature_type, - string $cased_guide_method_id, - string $cased_implementer_method_id, - CodeLocation $code_location, - array $suppressed_issues - ): void { - $guide_param_signature_type = $guide_param->signature_type - ? TypeExpander::expandUnion( - $codebase, - $guide_param->signature_type, - $guide_classlike_storage->is_trait && $guide_method_storage->abstract - ? $implementer_classlike_storage->name - : $guide_classlike_storage->name, - $guide_classlike_storage->is_trait && $guide_method_storage->abstract - ? $implementer_classlike_storage->name - : $guide_classlike_storage->name, - $guide_classlike_storage->is_trait && $guide_method_storage->abstract - ? $implementer_classlike_storage->parent_class - : $guide_classlike_storage->parent_class - ) - : null; - - $implementer_param_signature_type = TypeExpander::expandUnion( - $codebase, - $implementer_param_signature_type, - $implementer_classlike_storage->name, - $implementer_classlike_storage->name, - $implementer_classlike_storage->parent_class - ); - - $is_contained_by = (($codebase->php_major_version === 7 - && $codebase->php_minor_version === 4) - || $codebase->php_major_version >= 8) - && $guide_param_signature_type - ? UnionTypeComparator::isContainedBy( - $codebase, - $guide_param_signature_type, - $implementer_param_signature_type - ) - : UnionTypeComparator::isContainedByInPhp( - $guide_param_signature_type, - $implementer_param_signature_type - ); - if (!$is_contained_by) { - $config = Config::getInstance(); - - if ($codebase->php_major_version >= 8 - || $guide_classlike_storage->is_trait === $implementer_classlike_storage->is_trait - || !in_array($guide_classlike_storage->name, $implementer_classlike_storage->used_traits) - || $implementer_method_storage->defining_fqcln !== $implementer_classlike_storage->name - || (!$implementer_method_storage->abstract - && !$guide_method_storage->abstract) - ) { - if ($implementer_method_storage->cased_name === '__construct') { - IssueBuffer::maybeAdd( - new ConstructorSignatureMismatch( - 'Argument ' . ($i + 1) . ' of ' - . $cased_implementer_method_id - . ' has wrong type \'' - . $implementer_param_signature_type . '\', expecting \'' - . $guide_param_signature_type . '\' as defined by ' - . $cased_guide_method_id, - $implementer_method_storage->params[$i]->location - && $config->isInProjectDirs( - $implementer_method_storage->params[$i]->location->file_path - ) - ? $implementer_method_storage->params[$i]->location - : $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new MethodSignatureMismatch( - 'Argument ' . ($i + 1) . ' of ' - . $cased_implementer_method_id - . ' has wrong type \'' - . $implementer_param_signature_type . '\', expecting \'' - . $guide_param_signature_type . '\' as defined by ' - . $cased_guide_method_id, - $implementer_method_storage->params[$i]->location - && $config->isInProjectDirs( - $implementer_method_storage->params[$i]->location->file_path - ) - ? $implementer_method_storage->params[$i]->location - : $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } - } else { - IssueBuffer::maybeAdd( - new TraitMethodSignatureMismatch( - 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id . ' has wrong type \'' . - $implementer_param_signature_type . '\', expecting \'' . - $guide_param_signature_type . '\' as defined by ' . - $cased_guide_method_id, - $implementer_method_storage->params[$i]->location - && $config->isInProjectDirs( - $implementer_method_storage->params[$i]->location->file_path - ) - ? $implementer_method_storage->params[$i]->location - : $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } - } - } - - /** - * @param string[] $suppressed_issues - */ - private static function compareMethodDocblockParams( - Codebase $codebase, - int $i, - ClassLikeStorage $guide_classlike_storage, - ClassLikeStorage $implementer_classlike_storage, - string $implementer_called_class_name, - MethodStorage $guide_method_storage, - MethodStorage $implementer_method_storage, - string $cased_guide_method_id, - string $cased_implementer_method_id, - Union $guide_param_type, - Union $implementer_param_type, - CodeLocation $code_location, - array $suppressed_issues - ): void { - $implementer_method_storage_param_type = TypeExpander::expandUnion( - $codebase, - $implementer_param_type, - $implementer_classlike_storage->name, - $implementer_called_class_name, - $implementer_classlike_storage->parent_class - ); - - $guide_method_storage_param_type = TypeExpander::expandUnion( - $codebase, - $guide_param_type, - $guide_classlike_storage->is_trait && $guide_method_storage->abstract - ? $implementer_classlike_storage->name - : $guide_classlike_storage->name, - $guide_classlike_storage->is_trait && $guide_method_storage->abstract - ? $implementer_classlike_storage->name - : $guide_classlike_storage->name, - $guide_classlike_storage->is_trait && $guide_method_storage->abstract - ? $implementer_classlike_storage->parent_class - : $guide_classlike_storage->parent_class - ); - - $guide_class_name = $guide_classlike_storage->name; - - if ($implementer_classlike_storage->is_trait) { - $implementer_called_class_storage = $codebase->classlike_storage_provider->get( - $implementer_called_class_name - ); - - if (isset( - $implementer_called_class_storage->template_extended_params[$implementer_classlike_storage->name] - )) { - self::transformTemplates( - $implementer_called_class_storage->template_extended_params, - $implementer_classlike_storage->name, - $implementer_method_storage_param_type, - $codebase - ); - - self::transformTemplates( - $implementer_called_class_storage->template_extended_params, - $guide_class_name, - $guide_method_storage_param_type, - $codebase - ); - } - } - - foreach ($implementer_method_storage_param_type->getAtomicTypes() as $k => $t) { - if ($t instanceof TTemplateParam - && strpos($t->defining_class, 'fn-') === 0 - ) { - $implementer_method_storage_param_type->removeType($k); - - foreach ($t->as->getAtomicTypes() as $as_t) { - $implementer_method_storage_param_type->addType($as_t); - } - } - } - - foreach ($guide_method_storage_param_type->getAtomicTypes() as $k => $t) { - if ($t instanceof TTemplateParam - && strpos($t->defining_class, 'fn-') === 0 - ) { - $guide_method_storage_param_type->removeType($k); - - foreach ($t->as->getAtomicTypes() as $as_t) { - $guide_method_storage_param_type->addType($as_t); - } - } - } - - if ($implementer_classlike_storage->template_extended_params) { - self::transformTemplates( - $implementer_classlike_storage->template_extended_params, - $guide_class_name, - $guide_method_storage_param_type, - $codebase - ); - } - - $union_comparison_results = new TypeComparisonResult(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $guide_method_storage_param_type, - $implementer_method_storage_param_type, - !$guide_classlike_storage->user_defined, - !$guide_classlike_storage->user_defined, - $union_comparison_results - )) { - // is the declared return type more specific than the inferred one? - if ($union_comparison_results->type_coerced) { - if ($guide_classlike_storage->user_defined) { - IssueBuffer::maybeAdd( - new MoreSpecificImplementedParamType( - 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id - . ' has the more specific type \'' . - $implementer_method_storage_param_type->getId() . '\', expecting \'' . - $guide_method_storage_param_type->getId() . '\' as defined by ' . - $cased_guide_method_id, - $implementer_method_storage->params[$i]->location - ?: $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } - } else { - if (UnionTypeComparator::isContainedBy( - $codebase, - $implementer_method_storage_param_type, - $guide_method_storage_param_type, - !$guide_classlike_storage->user_defined, - !$guide_classlike_storage->user_defined - )) { - if (IssueBuffer::accepts( - new MoreSpecificImplementedParamType( - 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id - . ' has the more specific type \'' . - $implementer_method_storage_param_type->getId() . '\', expecting \'' . - $guide_method_storage_param_type->getId() . '\' as defined by ' . - $cased_guide_method_id, - $implementer_method_storage->params[$i]->location - ?: $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - )) { - // fall through - } - } else { - if (IssueBuffer::accepts( - new ImplementedParamTypeMismatch( - 'Argument ' . ($i + 1) . ' of ' . $cased_implementer_method_id - . ' has wrong type \'' . - $implementer_method_storage_param_type->getId() . '\', expecting \'' . - $guide_method_storage_param_type->getId() . '\' as defined by ' . - $cased_guide_method_id, - $implementer_method_storage->params[$i]->location - ?: $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - )) { - // fall through - } - } - } - } - } - - /** - * @param string[] $suppressed_issues - */ - private static function compareMethodSignatureReturnTypes( - Codebase $codebase, - ClassLikeStorage $guide_classlike_storage, - ClassLikeStorage $implementer_classlike_storage, - MethodStorage $guide_method_storage, - MethodStorage $implementer_method_storage, - Union $guide_signature_return_type, - string $cased_guide_method_id, - string $implementer_called_class_name, - string $cased_implementer_method_id, - CodeLocation $code_location, - array $suppressed_issues - ): void { - $guide_signature_return_type = TypeExpander::expandUnion( - $codebase, - $guide_signature_return_type, - $guide_classlike_storage->is_trait && $guide_method_storage->abstract - ? $implementer_classlike_storage->name - : $guide_classlike_storage->name, - ($guide_classlike_storage->is_trait && $guide_method_storage->abstract) - || $guide_classlike_storage->final - ? $implementer_classlike_storage->name - : $guide_classlike_storage->name, - $guide_classlike_storage->is_trait && $guide_method_storage->abstract - ? $implementer_classlike_storage->parent_class - : $guide_classlike_storage->parent_class, - true, - true, - $implementer_method_storage->final - ); - - $implementer_signature_return_type = $implementer_method_storage->signature_return_type - ? TypeExpander::expandUnion( - $codebase, - $implementer_method_storage->signature_return_type, - $implementer_classlike_storage->is_trait - ? $implementer_called_class_name - : $implementer_classlike_storage->name, - $implementer_classlike_storage->is_trait - ? $implementer_called_class_name - : $implementer_classlike_storage->name, - $implementer_classlike_storage->parent_class - ) : null; - - $is_contained_by = (($codebase->php_major_version === 7 - && $codebase->php_minor_version === 4) - || $codebase->php_major_version >= 8) - && $implementer_signature_return_type - ? UnionTypeComparator::isContainedBy( - $codebase, - $implementer_signature_return_type, - $guide_signature_return_type - ) - : UnionTypeComparator::isContainedByInPhp($implementer_signature_return_type, $guide_signature_return_type); - - if (!$is_contained_by) { - if ($codebase->php_major_version >= 8 - || $guide_classlike_storage->is_trait === $implementer_classlike_storage->is_trait - || !in_array($guide_classlike_storage->name, $implementer_classlike_storage->used_traits) - || $implementer_method_storage->defining_fqcln !== $implementer_classlike_storage->name - || (!$implementer_method_storage->abstract - && !$guide_method_storage->abstract) - ) { - IssueBuffer::maybeAdd( - new MethodSignatureMismatch( - 'Method ' . $cased_implementer_method_id . ' with return type \'' - . $implementer_signature_return_type . '\' is different to return type \'' - . $guide_signature_return_type . '\' of inherited method ' . $cased_guide_method_id, - $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new TraitMethodSignatureMismatch( - 'Method ' . $cased_implementer_method_id . ' with return type \'' - . $implementer_signature_return_type . '\' is different to return type \'' - . $guide_signature_return_type . '\' of inherited method ' . $cased_guide_method_id, - $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } - } - } - - /** - * @param string[] $suppressed_issues - */ - private static function compareMethodDocblockReturnTypes( - Codebase $codebase, - ClassLikeStorage $guide_classlike_storage, - ClassLikeStorage $implementer_classlike_storage, - MethodStorage $implementer_method_storage, - Union $guide_return_type, - Union $implementer_return_type, - string $cased_guide_method_id, - string $implementer_called_class_name, - ?MethodIdentifier $implementer_declaring_method_id, - CodeLocation $code_location, - array $suppressed_issues - ): void { - $implementer_method_storage_return_type = TypeExpander::expandUnion( - $codebase, - $implementer_return_type, - $implementer_classlike_storage->is_trait - ? $implementer_called_class_name - : $implementer_classlike_storage->name, - $implementer_called_class_name, - $implementer_classlike_storage->parent_class - ); - - $guide_method_storage_return_type = TypeExpander::expandUnion( - $codebase, - $guide_return_type, - $guide_classlike_storage->is_trait - ? $implementer_classlike_storage->name - : $guide_classlike_storage->name, - $guide_classlike_storage->is_trait - || $implementer_method_storage->final - ? $implementer_called_class_name - : $guide_classlike_storage->name, - $guide_classlike_storage->parent_class, - true, - true, - $implementer_method_storage->final - ); - - $guide_class_name = $guide_classlike_storage->name; - - if ($implementer_classlike_storage->template_extended_params) { - self::transformTemplates( - $implementer_classlike_storage->template_extended_params, - $guide_class_name, - $guide_method_storage_return_type, - $codebase - ); - - if ($implementer_method_storage->defining_fqcln) { - self::transformTemplates( - $implementer_classlike_storage->template_extended_params, - $implementer_method_storage->defining_fqcln, - $implementer_method_storage_return_type, - $codebase - ); - } - } - - if ($implementer_classlike_storage->is_trait) { - $implementer_called_class_storage = $codebase->classlike_storage_provider->get( - $implementer_called_class_name - ); - - if ($implementer_called_class_storage->template_extended_params) { - self::transformTemplates( - $implementer_called_class_storage->template_extended_params, - $implementer_classlike_storage->name, - $implementer_method_storage_return_type, - $codebase - ); - - self::transformTemplates( - $implementer_called_class_storage->template_extended_params, - $guide_class_name, - $guide_method_storage_return_type, - $codebase - ); - } - } - - // treat void as null when comparing against docblock implementer - if ($implementer_method_storage_return_type->isVoid()) { - $implementer_method_storage_return_type = Type::getNull(); - } - - if ($guide_method_storage_return_type->isVoid()) { - $guide_method_storage_return_type = Type::getNull(); - } - - $union_comparison_results = new TypeComparisonResult(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $implementer_method_storage_return_type, - $guide_method_storage_return_type, - false, - false, - $union_comparison_results - )) { - // is the declared return type more specific than the inferred one? - if ($union_comparison_results->type_coerced) { - IssueBuffer::maybeAdd( - new LessSpecificImplementedReturnType( - 'The inherited return type \'' . $guide_method_storage_return_type->getId() - . '\' for ' . $cased_guide_method_id . ' is more specific than the implemented ' - . 'return type for ' . $implementer_declaring_method_id . ' \'' - . $implementer_method_storage_return_type->getId() . '\'', - $implementer_method_storage->return_type_location - ?: $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new ImplementedReturnTypeMismatch( - 'The inherited return type \'' . $guide_method_storage_return_type->getId() - . '\' for ' . $cased_guide_method_id . ' is different to the implemented ' - . 'return type for ' . $implementer_declaring_method_id . ' \'' - . $implementer_method_storage_return_type->getId() . '\'', - $implementer_method_storage->return_type_location - ?: $code_location - ), - $suppressed_issues + $implementer_classlike_storage->suppressed_issues - ); - } - } - } - - /** - * @param array> $template_extended_params - */ - private static function transformTemplates( - array $template_extended_params, - string $base_class_name, - Union $templated_type, - Codebase $codebase - ): void { - if (isset($template_extended_params[$base_class_name])) { - $map = $template_extended_params[$base_class_name]; - - $template_types = []; - - foreach ($map as $key => $mapped_type) { - $new_bases = []; - - foreach ($mapped_type->getTemplateTypes() as $mapped_atomic_type) { - if ($mapped_atomic_type->defining_class === $base_class_name) { - continue; - } - - $new_bases[] = $mapped_atomic_type->defining_class; - } - - if ($new_bases) { - $mapped_type = clone $mapped_type; - - foreach ($new_bases as $new_base_class_name) { - self::transformTemplates( - $template_extended_params, - $new_base_class_name, - $mapped_type, - $codebase - ); - } - } - - $template_types[$key][$base_class_name] = $mapped_type; - } - - $template_result = new TemplateResult([], $template_types); - - TemplateInferredTypeReplacer::replace( - $templated_type, - $template_result, - $codebase - ); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php deleted file mode 100644 index 06413e6b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php +++ /dev/null @@ -1,280 +0,0 @@ -> - */ - protected static $public_namespace_constants = []; - - public function __construct(Namespace_ $namespace, FileAnalyzer $source) - { - $this->source = $source; - $this->namespace = $namespace; - $this->namespace_name = $this->namespace->name ? implode('\\', $this->namespace->name->parts) : ''; - } - - public function collectAnalyzableInformation(): void - { - $leftover_stmts = []; - - if (!isset(self::$public_namespace_constants[$this->namespace_name])) { - self::$public_namespace_constants[$this->namespace_name] = []; - } - - $codebase = $this->getCodebase(); - - foreach ($this->namespace->stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\ClassLike) { - $this->collectAnalyzableClassLike($stmt); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Use_) { - $this->visitUse($stmt); - } elseif ($stmt instanceof PhpParser\Node\Stmt\GroupUse) { - $this->visitGroupUse($stmt); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Const_) { - foreach ($stmt->consts as $const) { - self::$public_namespace_constants[$this->namespace_name][$const->name->name] = Type::getMixed(); - } - - $leftover_stmts[] = $stmt; - } else { - $leftover_stmts[] = $stmt; - } - } - - if ($leftover_stmts) { - $statements_analyzer = new StatementsAnalyzer($this, new NodeDataProvider()); - $context = new Context(); - $context->is_global = true; - $context->defineGlobals(); - $context->collect_exceptions = $codebase->config->check_for_throws_in_global_scope; - $statements_analyzer->analyze($leftover_stmts, $context, null, true); - - $file_context = $this->source->context; - if ($file_context) { - $file_context->mergeExceptions($context); - } - } - } - - public function collectAnalyzableClassLike(PhpParser\Node\Stmt\ClassLike $stmt): void - { - if (!$stmt->name) { - throw new UnexpectedValueException('Did not expect anonymous class here'); - } - - $fq_class_name = Type::getFQCLNFromString($stmt->name->name, $this->getAliases()); - - if ($stmt instanceof PhpParser\Node\Stmt\Class_ || $stmt instanceof PhpParser\Node\Stmt\Enum_) { - $this->source->addNamespacedClassAnalyzer( - $fq_class_name, - new ClassAnalyzer($stmt, $this, $fq_class_name) - ); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Interface_) { - $this->source->addNamespacedInterfaceAnalyzer( - $fq_class_name, - new InterfaceAnalyzer($stmt, $this, $fq_class_name) - ); - } - } - - public function getNamespace(): string - { - return $this->namespace_name; - } - - public function setConstType(string $const_name, Union $const_type): void - { - self::$public_namespace_constants[$this->namespace_name][$const_name] = $const_type; - } - - /** - * @return array - */ - public static function getConstantsForNamespace(string $namespace_name, int $visibility): array - { - // @todo this does not allow for loading in namespace constants not already defined in the current sweep - if (!isset(self::$public_namespace_constants[$namespace_name])) { - self::$public_namespace_constants[$namespace_name] = []; - } - - if ($visibility === ReflectionProperty::IS_PUBLIC) { - return self::$public_namespace_constants[$namespace_name]; - } - - throw new InvalidArgumentException('Given $visibility not supported'); - } - - public function getFileAnalyzer(): FileAnalyzer - { - return $this->source; - } - - /** - * Returns true if $calling_identifier is the same as, or is within with $identifier, in a - * case-insensitive comparison. Identifiers can be namespaces, classlikes, functions, or methods. - * - * @psalm-pure - * - * @throws InvalidArgumentException if $identifier is not a valid identifier - */ - public static function isWithin(string $calling_identifier, string $identifier): bool - { - $normalized_calling_ident = self::normalizeIdentifier($calling_identifier); - $normalized_ident = self::normalizeIdentifier($identifier); - - if ($normalized_calling_ident === $normalized_ident) { - return true; - } - - $normalized_calling_ident_parts = self::getIdentifierParts($normalized_calling_ident); - $normalized_ident_parts = self::getIdentifierParts($normalized_ident); - - if (count($normalized_calling_ident_parts) < count($normalized_ident_parts)) { - return false; - } - - for ($i = 0; $i < count($normalized_ident_parts); ++$i) { - if ($normalized_ident_parts[$i] !== $normalized_calling_ident_parts[$i]) { - return false; - } - } - - return true; - } - - /** - * Returns true if $calling_identifier is the same as or is within any identifier - * in $identifiers in a case-insensitive comparison, or if $identifiers is empty. - * Identifiers can be namespaces, classlikes, functions, or methods. - * - * @psalm-pure - * - * @psalm-assert-if-false !empty $identifiers - * - * @param list $identifiers - */ - public static function isWithinAny(string $calling_identifier, array $identifiers): bool - { - if (count($identifiers) === 0) { - return true; - } - - foreach ($identifiers as $identifier) { - if (self::isWithin($calling_identifier, $identifier)) { - return true; - } - } - - return false; - } - - /** - * @param non-empty-string $fullyQualifiedClassName, e.g. '\Psalm\Internal\Analyzer\NamespaceAnalyzer' - * - * @return non-empty-string , e.g. 'Psalm' - * - * @psalm-pure - */ - public static function getNameSpaceRoot(string $fullyQualifiedClassName): string - { - $root_namespace = preg_replace('/^([^\\\]+).*/', '$1', $fullyQualifiedClassName); - if ($root_namespace === "") { - throw new InvalidArgumentException("Invalid classname \"$fullyQualifiedClassName\""); - } - return $root_namespace; - } - - /** - * @return ($lowercase is true ? lowercase-string : string) - * - * @psalm-pure - */ - public static function normalizeIdentifier(string $identifier, bool $lowercase = true): string - { - if ($identifier === "") { - return ""; - } - - $identifier = $identifier[0] === "\\" ? substr($identifier, 1) : $identifier; - return $lowercase ? strtolower($identifier) : $identifier; - } - - /** - * Splits an identifier into parts, eg `Foo\Bar::baz` becomes ["Foo", "\\", "Bar", "::", "baz"]. - * - * @return list - * - * @psalm-pure - */ - public static function getIdentifierParts(string $identifier): array - { - $parts = []; - while (($pos = strpos($identifier, "\\")) !== false) { - if ($pos > 0) { - $part = substr($identifier, 0, $pos); - assert($part !== ""); - $parts[] = $part; - } - $parts[] = "\\"; - $identifier = substr($identifier, $pos + 1); - } - if (($pos = strpos($identifier, "::")) !== false) { - if ($pos > 0) { - $part = substr($identifier, 0, $pos); - assert($part !== ""); - $parts[] = $part; - } - $parts[] = "::"; - $identifier = substr($identifier, $pos + 2); - } - if ($identifier !== "") { - $parts[] = $identifier; - } - - return $parts; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php deleted file mode 100644 index 40b3316d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php +++ /dev/null @@ -1,1527 +0,0 @@ - - */ - private $issues_to_fix = []; - - /** - * @var bool - */ - public $dry_run = false; - - /** - * @var bool - */ - public $full_run = false; - - /** - * @var bool - */ - public $only_replace_php_types_with_non_docblock_types = false; - - /** - * @var ?int - */ - public $onchange_line_limit; - - /** - * @var bool - */ - public $provide_completion = false; - - /** - * @var array - */ - private $project_files = []; - - /** - * @var array - */ - private $extra_files = []; - - /** - * @var array - */ - private $to_refactor = []; - - /** - * @var ?ReportOptions - */ - public $stdout_report_options; - - /** - * @var array - */ - public $generated_report_options; - - /** - * @var array> - */ - private const SUPPORTED_ISSUES_TO_FIX = [ - InvalidFalsableReturnType::class, - InvalidNullableReturnType::class, - InvalidReturnType::class, - LessSpecificReturnType::class, - MismatchingDocblockParamType::class, - MismatchingDocblockReturnType::class, - MissingClosureReturnType::class, - MissingParamType::class, - MissingPropertyType::class, - MissingReturnType::class, - ParamNameMismatch::class, - PossiblyUndefinedGlobalVariable::class, - PossiblyUndefinedVariable::class, - PossiblyUnusedMethod::class, - PossiblyUnusedProperty::class, - RedundantCast::class, - RedundantCastGivenDocblockType::class, - UnusedMethod::class, - UnusedProperty::class, - UnusedVariable::class, - UnnecessaryVarAnnotation::class, - ]; - - /** - * When this is true, the language server will send the diagnostic code with a help link. - * - * @var bool - */ - public $language_server_use_extended_diagnostic_codes = false; - - /** - * If this is true then the language server will send log messages to the client with additional information. - * - * @var bool - */ - public $language_server_verbose = false; - - /** - * @param array $generated_report_options - */ - public function __construct( - Config $config, - Providers $providers, - ?ReportOptions $stdout_report_options = null, - array $generated_report_options = [], - int $threads = 1, - ?Progress $progress = null - ) { - if ($progress === null) { - $progress = new VoidProgress(); - } - - $this->parser_cache_provider = $providers->parser_cache_provider; - $this->project_cache_provider = $providers->project_cache_provider; - $this->file_provider = $providers->file_provider; - $this->classlike_storage_provider = $providers->classlike_storage_provider; - $this->file_reference_provider = $providers->file_reference_provider; - - $this->progress = $progress; - $this->threads = $threads; - $this->config = $config; - - $this->clearCacheDirectoryIfConfigOrComposerLockfileChanged(); - - $this->codebase = new Codebase( - $config, - $providers, - $progress - ); - - $this->stdout_report_options = $stdout_report_options; - $this->generated_report_options = $generated_report_options; - - $file_extensions = $this->config->getFileExtensions(); - - foreach ($this->config->getProjectDirectories() as $dir_name) { - $file_paths = $this->file_provider->getFilesInDir( - $dir_name, - $file_extensions, - [$this->config, 'isInProjectDirs'] - ); - - foreach ($file_paths as $file_path) { - $this->addProjectFile($file_path); - } - } - - foreach ($this->config->getExtraDirectories() as $dir_name) { - $file_paths = $this->file_provider->getFilesInDir( - $dir_name, - $file_extensions, - [$this->config, 'isInExtraDirs'] - ); - - foreach ($file_paths as $file_path) { - $this->addExtraFile($file_path); - } - } - - foreach ($this->config->getProjectFiles() as $file_path) { - $this->addProjectFile($file_path); - } - - self::$instance = $this; - } - - private function clearCacheDirectoryIfConfigOrComposerLockfileChanged(): void - { - if ($this->project_cache_provider - && $this->project_cache_provider->hasLockfileChanged() - ) { - $this->progress->debug( - 'Composer lockfile change detected, clearing cache' . "\n" - ); - - $cache_directory = $this->config->getCacheDirectory(); - if ($cache_directory !== null) { - Config::removeCacheDirectory($cache_directory); - } - - if ($this->file_reference_provider->cache) { - $this->file_reference_provider->cache->hasConfigChanged(); - } - - $this->project_cache_provider->updateComposerLockHash(); - } elseif ($this->file_reference_provider->cache - && $this->file_reference_provider->cache->hasConfigChanged() - ) { - $this->progress->debug( - 'Config change detected, clearing cache' . "\n" - ); - - $cache_directory = $this->config->getCacheDirectory(); - if ($cache_directory !== null) { - Config::removeCacheDirectory($cache_directory); - } - - if ($this->project_cache_provider) { - $this->project_cache_provider->hasLockfileChanged(); - } - } - } - - /** - * @param array $report_file_paths - * @return list - */ - public static function getFileReportOptions(array $report_file_paths, bool $show_info = true): array - { - $report_options = []; - - $mapping = [ - 'checkstyle.xml' => Report::TYPE_CHECKSTYLE, - 'sonarqube.json' => Report::TYPE_SONARQUBE, - 'codeclimate.json' => Report::TYPE_CODECLIMATE, - 'summary.json' => Report::TYPE_JSON_SUMMARY, - 'junit.xml' => Report::TYPE_JUNIT, - '.xml' => Report::TYPE_XML, - '.json' => Report::TYPE_JSON, - '.txt' => Report::TYPE_TEXT, - '.emacs' => Report::TYPE_EMACS, - '.pylint' => Report::TYPE_PYLINT, - '.console' => Report::TYPE_CONSOLE, - '.sarif' => Report::TYPE_SARIF, - 'count.txt' => Report::TYPE_COUNT, - ]; - - foreach ($report_file_paths as $report_file_path) { - foreach ($mapping as $extension => $type) { - if (substr($report_file_path, -strlen($extension)) === $extension) { - $o = new ReportOptions(); - - $o->format = $type; - $o->show_info = $show_info; - $o->output_path = $report_file_path; - $o->use_color = false; - $report_options[] = $o; - continue 2; - } - } - - throw new UnexpectedValueException('Unknown report format ' . $report_file_path); - } - - return $report_options; - } - - private function visitAutoloadFiles(): void - { - $start_time = microtime(true); - - $this->config->visitComposerAutoloadFiles($this, $this->progress); - - $now_time = microtime(true); - - $this->progress->debug( - 'Visiting autoload files took ' . number_format($now_time - $start_time, 3) . 's' . "\n" - ); - } - - public function server(?string $address = '127.0.0.1:12345', bool $socket_server_mode = false): void - { - $this->visitAutoloadFiles(); - $this->codebase->diff_methods = true; - $this->file_reference_provider->loadReferenceCache(); - $this->codebase->enterServerMode(); - - if (ini_get('pcre.jit') === '1' - && PHP_OS === 'Darwin' - && version_compare(PHP_VERSION, '7.3.0') >= 0 - && version_compare(PHP_VERSION, '7.4.0') < 0 - ) { - // do nothing - } else { - $cpu_count = self::getCpuCount(); - - // let's not go crazy - $usable_cpus = $cpu_count - 2; - - if ($usable_cpus > 1) { - $this->threads = $usable_cpus; - } - } - - $this->config->initializePlugins($this); - - foreach ($this->config->getProjectDirectories() as $dir_name) { - $this->checkDirWithConfig($dir_name, $this->config); - } - - @cli_set_process_title('Psalm ' . PSALM_VERSION . ' - PHP Language Server'); - - if (!$socket_server_mode && $address) { - // Connect to a TCP server - $socket = stream_socket_client('tcp://' . $address, $errno, $errstr); - if ($socket === false) { - fwrite(STDERR, "Could not connect to language client. Error $errno\n$errstr"); - exit(1); - } - stream_set_blocking($socket, false); - new LanguageServer( - new ProtocolStreamReader($socket), - new ProtocolStreamWriter($socket), - $this - ); - Loop::run(); - } elseif ($socket_server_mode && $address) { - // Run a TCP Server - $tcpServer = stream_socket_server('tcp://' . $address, $errno, $errstr); - if ($tcpServer === false) { - fwrite(STDERR, "Could not listen on $address. Error $errno\n$errstr"); - exit(1); - } - fwrite(STDOUT, "Server listening on $address\n"); - - $fork_available = true; - if (!extension_loaded('pcntl')) { - fwrite(STDERR, "PCNTL is not available. Only a single connection will be accepted\n"); - $fork_available = false; - } - - $disabled_functions = array_map('trim', explode(',', ini_get('disable_functions'))); - if (in_array('pcntl_fork', $disabled_functions)) { - fwrite( - STDERR, - "pcntl_fork() is disabled by php configuration (disable_functions directive)." - . " Only a single connection will be accepted\n" - ); - $fork_available = false; - } - - while ($socket = stream_socket_accept($tcpServer, -1)) { - fwrite(STDOUT, "Connection accepted\n"); - stream_set_blocking($socket, false); - if ($fork_available) { - // If PCNTL is available, fork a child process for the connection - // An exit notification will only terminate the child process - $pid = pcntl_fork(); - if ($pid === -1) { - fwrite(STDERR, "Could not fork\n"); - exit(1); - } - - if ($pid === 0) { - // Child process - $reader = new ProtocolStreamReader($socket); - $reader->on( - 'close', - function (): void { - fwrite(STDOUT, "Connection closed\n"); - } - ); - new LanguageServer( - $reader, - new ProtocolStreamWriter($socket), - $this - ); - // Just for safety - exit(0); - } - } else { - // If PCNTL is not available, we only accept one connection. - // An exit notification will terminate the server - new LanguageServer( - new ProtocolStreamReader($socket), - new ProtocolStreamWriter($socket), - $this - ); - Loop::run(); - } - } - } else { - // Use STDIO - stream_set_blocking(STDIN, false); - new LanguageServer( - new ProtocolStreamReader(STDIN), - new ProtocolStreamWriter(STDOUT), - $this - ); - Loop::run(); - } - } - - public static function getInstance(): ProjectAnalyzer - { - return self::$instance; - } - - public function canReportIssues(string $file_path): bool - { - return isset($this->project_files[$file_path]); - } - - private function generatePHPVersionMessage(): string - { - $codebase = $this->codebase; - - $version = $codebase->php_major_version . '.' . $codebase->php_minor_version; - - switch ($codebase->php_version_source) { - case 'cli': - $source = '(set by CLI argument)'; - break; - case 'config': - $source = '(set by config file)'; - break; - case 'composer': - $source = '(inferred from composer.json)'; - break; - case 'tests': - $source = '(set by tests)'; - break; - case 'runtime': - $source = '(inferred from current PHP version)'; - break; - } - - return "Target PHP version: $version $source\n"; - } - - public function check(string $base_dir, bool $is_diff = false): void - { - $start_checks = (int)microtime(true); - - if (!$base_dir) { - throw new InvalidArgumentException('Cannot work with empty base_dir'); - } - - $diff_files = null; - $deleted_files = null; - - $this->full_run = true; - - $reference_cache = $this->file_reference_provider->loadReferenceCache(true); - - $this->codebase->diff_methods = $is_diff; - - if ($is_diff - && $reference_cache - && $this->project_cache_provider - && $this->project_cache_provider->canDiffFiles() - ) { - $deleted_files = $this->file_reference_provider->getDeletedReferencedFiles(); - $diff_files = array_merge($deleted_files, $this->getDiffFiles()); - } - - $this->progress->write($this->generatePHPVersionMessage()); - $this->progress->startScanningFiles(); - - $diff_no_files = false; - - if ($diff_files === null - || $deleted_files === null - || count($diff_files) > 200 - ) { - $this->config->visitPreloadedStubFiles($this->codebase, $this->progress); - $this->visitAutoloadFiles(); - - $this->codebase->scanner->addFilesToShallowScan($this->extra_files); - $this->codebase->scanner->addFilesToDeepScan($this->project_files); - $this->codebase->analyzer->addFilesToAnalyze($this->project_files); - - $this->config->initializePlugins($this); - - $this->codebase->scanFiles($this->threads); - - $this->codebase->infer_types_from_usage = true; - } else { - $this->progress->debug(count($diff_files) . ' changed files: ' . "\n"); - $this->progress->debug(' ' . implode("\n ", $diff_files) . "\n"); - - $this->codebase->analyzer->addFilesToShowResults($this->project_files); - - if ($diff_files) { - $file_list = $this->getReferencedFilesFromDiff($diff_files); - - // strip out deleted files - $file_list = array_diff($file_list, $deleted_files); - - if ($file_list) { - $this->config->visitPreloadedStubFiles($this->codebase, $this->progress); - $this->visitAutoloadFiles(); - - $this->checkDiffFilesWithConfig($this->config, $file_list); - - $this->config->initializePlugins($this); - - $this->codebase->scanFiles($this->threads); - } else { - $diff_no_files = true; - } - } else { - $diff_no_files = true; - } - } - - if (!$diff_no_files) { - $this->config->visitStubFiles($this->codebase, $this->progress); - - $event = new AfterCodebasePopulatedEvent($this->codebase); - - $this->config->eventDispatcher->dispatchAfterCodebasePopulated($event); - } - - $this->progress->startAnalyzingFiles(); - - $this->codebase->analyzer->analyzeFiles( - $this, - $this->threads, - $this->codebase->alter_code, - true - ); - - if ($this->parser_cache_provider && !$is_diff) { - $removed_parser_files = $this->parser_cache_provider->deleteOldParserCaches($start_checks); - - if ($removed_parser_files) { - $this->progress->debug('Removed ' . $removed_parser_files . ' old parser caches' . "\n"); - } - } - } - - public function consolidateAnalyzedData(): void - { - $this->codebase->classlikes->consolidateAnalyzedData( - $this->codebase->methods, - $this->progress, - (bool)$this->codebase->find_unused_code - ); - } - - public function trackTaintedInputs(): void - { - $this->codebase->taint_flow_graph = new TaintFlowGraph(); - } - - public function trackUnusedSuppressions(): void - { - $this->codebase->track_unused_suppressions = true; - } - - public function interpretRefactors(): void - { - if (!$this->codebase->alter_code) { - throw new UnexpectedValueException('Should not be checking references'); - } - - // interpret wildcards - foreach ($this->to_refactor as $source => $destination) { - if (($source_pos = strpos($source, '*')) - && ($destination_pos = strpos($destination, '*')) - && $source_pos === (strlen($source) - 1) - && $destination_pos === (strlen($destination) - 1) - ) { - foreach ($this->codebase->classlike_storage_provider->getAll() as $class_storage) { - if (strpos($source, substr($class_storage->name, 0, $source_pos)) === 0) { - $this->to_refactor[$class_storage->name] - = substr($destination, 0, -1) . substr($class_storage->name, $source_pos); - } - } - - unset($this->to_refactor[$source]); - } - } - - foreach ($this->to_refactor as $source => $destination) { - $source_parts = explode('::', $source); - $destination_parts = explode('::', $destination); - - if (!$this->codebase->classlikes->hasFullyQualifiedClassName($source_parts[0])) { - throw new RefactorException( - 'Source class ' . $source_parts[0] . ' doesn’t exist' - ); - } - - if (count($source_parts) === 1 && count($destination_parts) === 1) { - if ($this->codebase->classlikes->hasFullyQualifiedClassName($destination_parts[0])) { - throw new RefactorException( - 'Destination class ' . $destination_parts[0] . ' already exists' - ); - } - - $source_class_storage = $this->codebase->classlike_storage_provider->get($source_parts[0]); - - $destination_parts = explode('\\', $destination, -1); - $destination_ns = implode('\\', $destination_parts); - - $this->codebase->classes_to_move[strtolower($source)] = $destination; - - $destination_class_storage = $this->codebase->classlike_storage_provider->create($destination); - - $destination_class_storage->name = $destination; - - if ($source_class_storage->aliases) { - $destination_class_storage->aliases = clone $source_class_storage->aliases; - $destination_class_storage->aliases->namespace = $destination_ns; - } - - $destination_class_storage->location = $source_class_storage->location; - $destination_class_storage->stmt_location = $source_class_storage->stmt_location; - $destination_class_storage->populated = true; - - $this->codebase->class_transforms[strtolower($source)] = $destination; - - continue; - } - - $source_method_id = new MethodIdentifier( - $source_parts[0], - strtolower($source_parts[1]) - ); - - if ($this->codebase->methods->methodExists($source_method_id)) { - if ($this->codebase->methods->methodExists( - new MethodIdentifier( - $destination_parts[0], - strtolower($destination_parts[1]) - ) - )) { - throw new RefactorException( - 'Destination method ' . $destination . ' already exists' - ); - } - - if (!$this->codebase->classlikes->classExists($destination_parts[0])) { - throw new RefactorException( - 'Destination class ' . $destination_parts[0] . ' doesn’t exist' - ); - } - - $source_lc = strtolower($source); - if (strtolower($source_parts[0]) !== strtolower($destination_parts[0])) { - $source_method_storage = $this->codebase->methods->getStorage($source_method_id); - $destination_class_storage - = $this->codebase->classlike_storage_provider->get($destination_parts[0]); - - if (!$source_method_storage->is_static - && !isset( - $destination_class_storage->parent_classes[strtolower($source_method_id->fq_class_name)] - ) - ) { - throw new RefactorException( - 'Cannot move non-static method ' . $source - . ' into unrelated class ' . $destination_parts[0] - ); - } - - $this->codebase->methods_to_move[$source_lc]= $destination; - } else { - $this->codebase->methods_to_rename[$source_lc] = $destination_parts[1]; - } - - $this->codebase->call_transforms[$source_lc . '\((.*\))'] = $destination . '($1)'; - continue; - } - - if ($source_parts[1][0] === '$') { - if ($destination_parts[1][0] !== '$') { - throw new RefactorException( - 'Destination property must be of the form Foo::$bar' - ); - } - - if (!$this->codebase->properties->propertyExists($source, true)) { - throw new RefactorException( - 'Property ' . $source . ' does not exist' - ); - } - - if ($this->codebase->properties->propertyExists($destination, true)) { - throw new RefactorException( - 'Destination property ' . $destination . ' already exists' - ); - } - - if (!$this->codebase->classlikes->classExists($destination_parts[0])) { - throw new RefactorException( - 'Destination class ' . $destination_parts[0] . ' doesn’t exist' - ); - } - - $source_id = strtolower($source_parts[0]) . '::' . $source_parts[1]; - - if (strtolower($source_parts[0]) !== strtolower($destination_parts[0])) { - $source_storage = $this->codebase->properties->getStorage($source); - - if (!$source_storage->is_static) { - throw new RefactorException( - 'Cannot move non-static property ' . $source - ); - } - - $this->codebase->properties_to_move[$source_id] = $destination; - } else { - $this->codebase->properties_to_rename[$source_id] = substr($destination_parts[1], 1); - } - - $this->codebase->property_transforms[$source_id] = $destination; - continue; - } - - $source_class_constants = $this->codebase->classlikes->getConstantsForClass( - $source_parts[0], - ReflectionProperty::IS_PRIVATE - ); - - if (isset($source_class_constants[$source_parts[1]])) { - if (!$this->codebase->classlikes->hasFullyQualifiedClassName($destination_parts[0])) { - throw new RefactorException( - 'Destination class ' . $destination_parts[0] . ' doesn’t exist' - ); - } - - $destination_class_constants = $this->codebase->classlikes->getConstantsForClass( - $destination_parts[0], - ReflectionProperty::IS_PRIVATE - ); - - if (isset($destination_class_constants[$destination_parts[1]])) { - throw new RefactorException( - 'Destination constant ' . $destination . ' already exists' - ); - } - - $source_id = strtolower($source_parts[0]) . '::' . $source_parts[1]; - - if (strtolower($source_parts[0]) !== strtolower($destination_parts[0])) { - $this->codebase->class_constants_to_move[$source_id] = $destination; - } else { - $this->codebase->class_constants_to_rename[$source_id] = $destination_parts[1]; - } - - $this->codebase->class_constant_transforms[$source_id] = $destination; - continue; - } - - throw new RefactorException( - 'Psalm cannot locate ' . $source - ); - } - } - - public function prepareMigration(): void - { - if (!$this->codebase->alter_code) { - throw new UnexpectedValueException('Should not be checking references'); - } - - $this->codebase->classlikes->moveMethods( - $this->codebase->methods, - $this->progress - ); - - $this->codebase->classlikes->moveProperties( - $this->codebase->properties, - $this->progress - ); - - $this->codebase->classlikes->moveClassConstants( - $this->progress - ); - } - - public function migrateCode(): void - { - if (!$this->codebase->alter_code) { - throw new UnexpectedValueException('Should not be checking references'); - } - - $migration_manipulations = FileManipulationBuffer::getMigrationManipulations( - $this->codebase->file_provider - ); - - if ($migration_manipulations) { - foreach ($migration_manipulations as $file_path => $file_manipulations) { - usort( - $file_manipulations, - function (FileManipulation $a, FileManipulation $b): int { - if ($a->start === $b->start) { - if ($b->end === $a->end) { - return $b->insertion_text > $a->insertion_text ? 1 : -1; - } - - return $b->end > $a->end ? 1 : -1; - } - - return $b->start > $a->start ? 1 : -1; - } - ); - - $existing_contents = $this->codebase->file_provider->getContents($file_path); - - foreach ($file_manipulations as $manipulation) { - $existing_contents = $manipulation->transform($existing_contents); - } - - $this->codebase->file_provider->setContents($file_path, $existing_contents); - } - } - - if ($this->codebase->classes_to_move) { - foreach ($this->codebase->classes_to_move as $source => $destination) { - $source_class_storage = $this->codebase->classlike_storage_provider->get($source); - - if (!$source_class_storage->location) { - continue; - } - - $potential_file_path = $this->config->getPotentialComposerFilePathForClassLike($destination); - - if ($potential_file_path && !file_exists($potential_file_path)) { - $containing_dir = dirname($potential_file_path); - - if (!file_exists($containing_dir)) { - mkdir($containing_dir, 0777, true); - } - - rename($source_class_storage->location->file_path, $potential_file_path); - } - } - } - } - - public function findReferencesTo(string $symbol): void - { - if (!$this->stdout_report_options) { - throw new UnexpectedValueException('Not expecting to emit output'); - } - - $locations = $this->codebase->findReferencesToSymbol($symbol); - - foreach ($locations as $location) { - $snippet = $location->getSnippet(); - - $snippet_bounds = $location->getSnippetBounds(); - $selection_bounds = $location->getSelectionBounds(); - - $selection_start = $selection_bounds[0] - $snippet_bounds[0]; - $selection_length = $selection_bounds[1] - $selection_bounds[0]; - - echo $location->file_name . ':' . $location->getLineNumber() . "\n" . - ( - $this->stdout_report_options->use_color - ? substr($snippet, 0, $selection_start) . - "\e[97;42m" . substr($snippet, $selection_start, $selection_length) . - "\e[0m" . substr($snippet, $selection_length + $selection_start) - : $snippet - ) . "\n" . "\n"; - } - } - - public function checkDir(string $dir_name): void - { - $this->file_reference_provider->loadReferenceCache(); - - $this->config->visitPreloadedStubFiles($this->codebase, $this->progress); - - $this->checkDirWithConfig($dir_name, $this->config, true); - - $this->progress->write($this->generatePHPVersionMessage()); - $this->progress->startScanningFiles(); - - $this->config->initializePlugins($this); - - $this->codebase->scanFiles($this->threads); - - $this->config->visitStubFiles($this->codebase, $this->progress); - - $this->progress->startAnalyzingFiles(); - - $this->codebase->analyzer->analyzeFiles( - $this, - $this->threads, - $this->codebase->alter_code, - $this->codebase->find_unused_code === 'always' - ); - } - - private function checkDirWithConfig(string $dir_name, Config $config, bool $allow_non_project_files = false): void - { - $file_extensions = $config->getFileExtensions(); - $filter = $allow_non_project_files ? null : [$this->config, 'isInProjectDirs']; - - $file_paths = $this->file_provider->getFilesInDir( - $dir_name, - $file_extensions, - $filter - ); - - $files_to_scan = []; - - foreach ($file_paths as $file_path) { - $files_to_scan[$file_path] = $file_path; - } - - $this->codebase->addFilesToAnalyze($files_to_scan); - } - - public function addProjectFile(string $file_path): void - { - $this->project_files[$file_path] = $file_path; - } - - public function addExtraFile(string $file_path): void - { - $this->extra_files[$file_path] = $file_path; - } - - /** - * @return list - */ - protected function getDiffFiles(): array - { - if (!$this->parser_cache_provider || !$this->project_cache_provider) { - throw new UnexpectedValueException('Parser cache provider cannot be null here'); - } - - $diff_files = []; - - $last_run = $this->project_cache_provider->getLastRun(PSALM_VERSION); - - foreach ($this->project_files as $file_path) { - if ($this->file_provider->getModifiedTime($file_path) >= $last_run - && $this->parser_cache_provider->loadExistingFileContentsFromCache($file_path) - !== $this->file_provider->getContents($file_path) - ) { - $diff_files[] = $file_path; - } - } - - return $diff_files; - } - - /** - * @param array $file_list - * - */ - private function checkDiffFilesWithConfig(Config $config, array $file_list = []): void - { - $files_to_scan = []; - - foreach ($file_list as $file_path) { - if (!$this->file_provider->fileExists($file_path)) { - continue; - } - - if (!$config->isInProjectDirs($file_path)) { - $this->progress->debug('skipping ' . $file_path . "\n"); - - continue; - } - - $files_to_scan[$file_path] = $file_path; - } - - $this->codebase->addFilesToAnalyze($files_to_scan); - } - - public function checkFile(string $file_path): void - { - $this->progress->debug('Checking ' . $file_path . "\n"); - - $this->config->visitPreloadedStubFiles($this->codebase, $this->progress); - - $this->config->hide_external_errors = $this->config->isInProjectDirs($file_path); - - $this->codebase->addFilesToAnalyze([$file_path => $file_path]); - - $this->file_reference_provider->loadReferenceCache(); - - $this->progress->write($this->generatePHPVersionMessage()); - $this->progress->startScanningFiles(); - - $this->config->initializePlugins($this); - - $this->codebase->scanFiles($this->threads); - - $this->config->visitStubFiles($this->codebase, $this->progress); - - $this->progress->startAnalyzingFiles(); - - $this->codebase->analyzer->analyzeFiles( - $this, - $this->threads, - $this->codebase->alter_code, - $this->codebase->find_unused_code === 'always' - ); - } - - /** - * @param string[] $paths_to_check - */ - public function checkPaths(array $paths_to_check): void - { - $this->config->visitPreloadedStubFiles($this->codebase, $this->progress); - $this->visitAutoloadFiles(); - - $this->codebase->scanner->addFilesToShallowScan($this->extra_files); - - foreach ($paths_to_check as $path) { - $this->progress->debug('Checking ' . $path . "\n"); - - if (is_dir($path)) { - $this->checkDirWithConfig($path, $this->config, true); - } elseif (is_file($path)) { - $this->codebase->addFilesToAnalyze([$path => $path]); - $this->config->hide_external_errors = $this->config->isInProjectDirs($path); - } - } - - $this->file_reference_provider->loadReferenceCache(); - - $this->progress->write($this->generatePHPVersionMessage()); - $this->progress->startScanningFiles(); - - $this->config->initializePlugins($this); - - - $this->codebase->scanFiles($this->threads); - - $this->config->visitStubFiles($this->codebase, $this->progress); - - $this->progress->startAnalyzingFiles(); - - $this->codebase->analyzer->analyzeFiles( - $this, - $this->threads, - $this->codebase->alter_code, - $this->codebase->find_unused_code === 'always' - ); - - if ($this->stdout_report_options - && in_array( - $this->stdout_report_options->format, - [Report::TYPE_CONSOLE, Report::TYPE_PHP_STORM] - ) - && $this->codebase->collect_references - ) { - fwrite( - STDERR, - PHP_EOL . 'To whom it may concern: Psalm cannot detect unused classes, methods and properties' - . PHP_EOL . 'when analyzing individual files and folders. Run on the full project to enable' - . PHP_EOL . 'complete unused code detection.' . PHP_EOL - ); - } - } - - public function getConfig(): Config - { - return $this->config; - } - - /** - * @param array $diff_files - * - * @return array - */ - public function getReferencedFilesFromDiff(array $diff_files, bool $include_referencing_files = true): array - { - $all_inherited_files_to_check = $diff_files; - - while ($diff_files) { - $diff_file = array_shift($diff_files); - - $dependent_files = $this->file_reference_provider->getFilesInheritingFromFile($diff_file); - - $new_dependent_files = array_diff($dependent_files, $all_inherited_files_to_check); - - $all_inherited_files_to_check = array_merge($all_inherited_files_to_check, $new_dependent_files); - $diff_files = array_merge($diff_files, $new_dependent_files); - } - - $all_files_to_check = $all_inherited_files_to_check; - - if ($include_referencing_files) { - foreach ($all_inherited_files_to_check as $file_name) { - $dependent_files = $this->file_reference_provider->getFilesReferencingFile($file_name); - $all_files_to_check = array_merge($dependent_files, $all_files_to_check); - } - } - - return array_combine($all_files_to_check, $all_files_to_check); - } - - public function fileExists(string $file_path): bool - { - return $this->file_provider->fileExists($file_path); - } - - public function alterCodeAfterCompletion( - bool $dry_run = false, - bool $safe_types = false - ): void { - $this->codebase->alter_code = true; - $this->codebase->infer_types_from_usage = true; - $this->show_issues = false; - $this->dry_run = $dry_run; - $this->only_replace_php_types_with_non_docblock_types = $safe_types; - } - - /** - * @param array $to_refactor - * - */ - public function refactorCodeAfterCompletion(array $to_refactor): void - { - $this->to_refactor = $to_refactor; - $this->codebase->alter_code = true; - $this->show_issues = false; - } - - /** - * @param 'cli'|'config'|'composer'|'tests' $source - */ - public function setPhpVersion(string $version, string $source): void - { - if (!preg_match('/^(5\.[456]|7\.[01234]|8\.[01])(\..*)?$/', $version)) { - throw new UnexpectedValueException('Expecting a version number in the format x.y'); - } - - [$php_major_version, $php_minor_version] = explode('.', $version); - - $php_major_version = (int) $php_major_version; - $php_minor_version = (int) $php_minor_version; - - if ($this->codebase->php_major_version !== $php_major_version - || $this->codebase->php_minor_version !== $php_minor_version - ) { - // reset lexer and parser when php version changes - StatementsProvider::clearLexer(); - StatementsProvider::clearParser(); - } - - $this->codebase->php_major_version = $php_major_version; - $this->codebase->php_minor_version = $php_minor_version; - $this->codebase->analysis_php_version_id = $php_major_version * 10000 + $php_minor_version * 100; - $this->codebase->php_version_source = $source; - } - - /** - * @param array $issues - * @throws UnsupportedIssueToFixException - * - */ - public function setIssuesToFix(array $issues): void - { - $supported_issues_to_fix = static::getSupportedIssuesToFix(); - - $supported_issues_to_fix[] = 'MissingImmutableAnnotation'; - $supported_issues_to_fix[] = 'MissingPureAnnotation'; - $supported_issues_to_fix[] = 'MissingThrowsDocblock'; - - $unsupportedIssues = array_diff(array_keys($issues), $supported_issues_to_fix); - - if (! empty($unsupportedIssues)) { - throw new UnsupportedIssueToFixException( - 'Psalm doesn\'t know how to fix issue(s): ' . implode(', ', $unsupportedIssues) . PHP_EOL - . 'Supported issues to fix are: ' . implode(',', $supported_issues_to_fix) - ); - } - - $this->issues_to_fix = $issues; - } - - public function setAllIssuesToFix(): void - { - $keyed_issues = array_fill_keys(static::getSupportedIssuesToFix(), true); - - $this->setIssuesToFix($keyed_issues); - } - - /** - * @return array - */ - public function getIssuesToFix(): array - { - return $this->issues_to_fix; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - public function getFileAnalyzerForClassLike(string $fq_class_name): FileAnalyzer - { - $fq_class_name_lc = strtolower($fq_class_name); - - $file_path = $this->codebase->scanner->getClassLikeFilePath($fq_class_name_lc); - - return new FileAnalyzer( - $this, - $file_path, - $this->config->shortenFileName($file_path) - ); - } - - public function getMethodMutations( - MethodIdentifier $original_method_id, - Context $this_context, - string $root_file_path, - string $root_file_name - ): void { - $fq_class_name = $original_method_id->fq_class_name; - - $appearing_method_id = $this->codebase->methods->getAppearingMethodId($original_method_id); - - if (!$appearing_method_id) { - // this can happen for some abstract classes implementing (but not fully) interfaces - return; - } - - $appearing_fq_class_name = $appearing_method_id->fq_class_name; - - $appearing_class_storage = $this->classlike_storage_provider->get($appearing_fq_class_name); - - if (!$appearing_class_storage->user_defined) { - return; - } - - $file_analyzer = $this->getFileAnalyzerForClassLike($fq_class_name); - - $file_analyzer->setRootFilePath($root_file_path, $root_file_name); - - if ($appearing_fq_class_name !== $fq_class_name) { - $file_analyzer = $this->getFileAnalyzerForClassLike($appearing_fq_class_name); - } - - $stmts = $this->codebase->getStatementsForFile( - $file_analyzer->getFilePath() - ); - - $file_analyzer->populateCheckers($stmts); - - if (!$this_context->self) { - $this_context->self = $fq_class_name; - $this_context->vars_in_scope['$this'] = Type::parseString($fq_class_name); - } - - $file_analyzer->getMethodMutations($appearing_method_id, $this_context, true); - - $file_analyzer->class_analyzers_to_analyze = []; - $file_analyzer->interface_analyzers_to_analyze = []; - $file_analyzer->clearSourceBeforeDestruction(); - } - - public function getFunctionLikeAnalyzer( - MethodIdentifier $method_id, - string $file_path - ): ?FunctionLikeAnalyzer { - $file_analyzer = new FileAnalyzer( - $this, - $file_path, - $this->config->shortenFileName($file_path) - ); - - $stmts = $this->codebase->getStatementsForFile( - $file_analyzer->getFilePath() - ); - - $file_analyzer->populateCheckers($stmts); - - $function_analyzer = $file_analyzer->getFunctionLikeAnalyzer($method_id); - - $file_analyzer->class_analyzers_to_analyze = []; - $file_analyzer->interface_analyzers_to_analyze = []; - - return $function_analyzer; - } - - /** - * Adapted from https://gist.github.com/divinity76/01ef9ca99c111565a72d3a8a6e42f7fb - * returns number of cpu cores - * Copyleft 2018, license: WTFPL - * @throws RuntimeException - * @throws LogicException - * @psalm-suppress ForbiddenCode - */ - public static function getCpuCount(): int - { - if (defined('PHP_WINDOWS_VERSION_MAJOR')) { - /* - $str = trim((string) shell_exec('wmic cpu get NumberOfCores 2>&1')); - if (!preg_match('/(\d+)/', $str, $matches)) { - throw new RuntimeException('wmic failed to get number of cpu cores on windows!'); - } - return ((int) $matches [1]); - */ - return 1; - } - - if (ini_get('pcre.jit') === '1' - && PHP_OS === 'Darwin' - && version_compare(PHP_VERSION, '7.3.0') >= 0 - && version_compare(PHP_VERSION, '7.4.0') < 0 - ) { - return 1; - } - - if (!extension_loaded('pcntl') || !function_exists('shell_exec')) { - return 1; - } - - $has_nproc = trim((string) @shell_exec('command -v nproc')); - if ($has_nproc) { - $ret = @shell_exec('nproc'); - if (is_string($ret)) { - $ret = trim($ret); - $tmp = filter_var($ret, FILTER_VALIDATE_INT); - if (is_int($tmp)) { - return $tmp; - } - } - } - - $ret = @shell_exec('sysctl -n hw.ncpu'); - if (is_string($ret)) { - $ret = trim($ret); - $tmp = filter_var($ret, FILTER_VALIDATE_INT); - if (is_int($tmp)) { - return $tmp; - } - } - - if (is_readable('/proc/cpuinfo')) { - $cpuinfo = file_get_contents('/proc/cpuinfo'); - $count = substr_count($cpuinfo, 'processor'); - if ($count > 0) { - return $count; - } - } - - throw new LogicException('failed to detect number of CPUs!'); - } - - /** - * @return array - * - * @psalm-pure - */ - public static function getSupportedIssuesToFix(): array - { - return array_map( - /** @param class-string $issue_class */ - function (string $issue_class): string { - $parts = explode('\\', $issue_class); - return end($parts); - }, - self::SUPPORTED_ISSUES_TO_FIX - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php deleted file mode 100644 index 4bbbd9bd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php +++ /dev/null @@ -1,529 +0,0 @@ - $stmts - * - */ - public static function doesEverBreak(array $stmts): bool - { - if (empty($stmts)) { - return false; - } - - for ($i = count($stmts) - 1; $i >= 0; --$i) { - $stmt = $stmts[$i]; - - if ($stmt instanceof PhpParser\Node\Stmt\Break_) { - return true; - } - - if ($stmt instanceof PhpParser\Node\Stmt\If_) { - if (self::doesEverBreak($stmt->stmts)) { - return true; - } - - if ($stmt->else && self::doesEverBreak($stmt->else->stmts)) { - return true; - } - - foreach ($stmt->elseifs as $elseif) { - if (self::doesEverBreak($elseif->stmts)) { - return true; - } - } - } - } - - return false; - } - - /** - * @param array $stmts - * @param array $exit_functions - * @param list<'loop'|'switch'> $break_types - * @param bool $return_is_exit Exit and Throw statements are treated differently from return if this is false - * - * @return list - * - * @psalm-suppress ComplexMethod nothing much we can do - */ - public static function getControlActions( - array $stmts, - ?NodeDataProvider $nodes, - array $exit_functions, - array $break_types, - bool $return_is_exit = true - ): array { - if (empty($stmts)) { - return [self::ACTION_NONE]; - } - - $control_actions = []; - - foreach ($stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\Return_ || - $stmt instanceof PhpParser\Node\Stmt\Throw_ || - ($stmt instanceof PhpParser\Node\Stmt\Expression && $stmt->expr instanceof PhpParser\Node\Expr\Exit_) - ) { - if (!$return_is_exit && $stmt instanceof PhpParser\Node\Stmt\Return_) { - $stmt_return_type = null; - if ($nodes && $stmt->expr) { - $stmt_return_type = $nodes->getType($stmt->expr); - } - - // don't consider a return if the expression never returns (e.g. a throw inside a short closure) - if ($stmt_return_type && ($stmt_return_type->isNever() || $stmt_return_type->isEmpty())) { - return array_values(array_unique(array_merge($control_actions, [self::ACTION_END]))); - } - - return array_values(array_unique(array_merge($control_actions, [self::ACTION_RETURN]))); - } - - return array_values(array_unique(array_merge($control_actions, [self::ACTION_END]))); - } - - if ($stmt instanceof PhpParser\Node\Stmt\Expression) { - // This allows calls to functions that always exit to act as exit statements themselves - if ($nodes - && ($stmt_expr_type = $nodes->getType($stmt->expr)) - && $stmt_expr_type->isNever() - ) { - return array_values(array_unique(array_merge($control_actions, [self::ACTION_END]))); - } - - if ($exit_functions) { - if ($stmt->expr instanceof PhpParser\Node\Expr\FuncCall - || $stmt->expr instanceof PhpParser\Node\Expr\StaticCall - ) { - if ($stmt->expr instanceof PhpParser\Node\Expr\FuncCall) { - /** @var string|null */ - $resolved_name = $stmt->expr->name->getAttribute('resolvedName'); - - if ($resolved_name && isset($exit_functions[strtolower($resolved_name)])) { - return array_values(array_unique(array_merge($control_actions, [self::ACTION_END]))); - } - } elseif ($stmt->expr->class instanceof PhpParser\Node\Name - && $stmt->expr->name instanceof PhpParser\Node\Identifier - ) { - /** @var string|null */ - $resolved_class_name = $stmt->expr->class->getAttribute('resolvedName'); - - if ($resolved_class_name - && isset($exit_functions[strtolower($resolved_class_name . '::' . $stmt->expr->name)]) - ) { - return array_values(array_unique(array_merge($control_actions, [self::ACTION_END]))); - } - } - } - } - - continue; - } - - if ($stmt instanceof PhpParser\Node\Stmt\Continue_) { - $count = !$stmt->num - ? 1 - : ($stmt->num instanceof PhpParser\Node\Scalar\LNumber ? $stmt->num->value : null); - - if ($break_types && $count !== null && count($break_types) >= $count) { - if ($break_types[count($break_types) - $count] === 'switch') { - return array_merge($control_actions, [self::ACTION_LEAVE_SWITCH]); - } - - return array_values($control_actions); - } - - return array_values(array_unique(array_merge($control_actions, [self::ACTION_CONTINUE]))); - } - - if ($stmt instanceof PhpParser\Node\Stmt\Break_) { - $count = !$stmt->num - ? 1 - : ($stmt->num instanceof PhpParser\Node\Scalar\LNumber ? $stmt->num->value : null); - - if ($break_types && $count !== null && count($break_types) >= $count) { - if ($break_types[count($break_types) - $count] === 'switch') { - return array_merge($control_actions, [self::ACTION_LEAVE_SWITCH]); - } - - return array_values($control_actions); - } - - return array_values(array_unique(array_merge($control_actions, [self::ACTION_BREAK]))); - } - - if ($stmt instanceof PhpParser\Node\Stmt\If_) { - $if_statement_actions = self::getControlActions( - $stmt->stmts, - $nodes, - $exit_functions, - $break_types, - $return_is_exit - ); - - $all_leave = !array_filter( - $if_statement_actions, - function ($action) { - return $action === self::ACTION_NONE; - } - ); - - $else_statement_actions = $stmt->else - ? self::getControlActions( - $stmt->else->stmts, - $nodes, - $exit_functions, - $break_types, - $return_is_exit - ) : []; - - $all_leave = $all_leave - && $else_statement_actions - && !array_filter( - $else_statement_actions, - function ($action) { - return $action === self::ACTION_NONE; - } - ); - - $all_elseif_actions = []; - - if ($stmt->elseifs) { - foreach ($stmt->elseifs as $elseif) { - $elseif_control_actions = self::getControlActions( - $elseif->stmts, - $nodes, - $exit_functions, - $break_types, - $return_is_exit - ); - - $all_leave = $all_leave - && !array_filter( - $elseif_control_actions, - function ($action) { - return $action === self::ACTION_NONE; - } - ); - - $all_elseif_actions = array_merge($elseif_control_actions, $all_elseif_actions); - } - } - - if ($all_leave) { - return array_values( - array_unique( - array_merge( - $control_actions, - $if_statement_actions, - $else_statement_actions, - $all_elseif_actions - ) - ) - ); - } - - $control_actions = array_filter( - array_merge( - $control_actions, - $if_statement_actions, - $else_statement_actions, - $all_elseif_actions - ), - function ($action) { - return $action !== self::ACTION_NONE; - } - ); - } - - if ($stmt instanceof PhpParser\Node\Stmt\Switch_) { - $has_ended = false; - $has_non_breaking_default = false; - $has_default_terminator = false; - - $all_case_actions = []; - - // iterate backwards in a case statement - for ($d = count($stmt->cases) - 1; $d >= 0; --$d) { - $case = $stmt->cases[$d]; - - $case_actions = self::getControlActions( - $case->stmts, - $nodes, - $exit_functions, - array_merge($break_types, ['switch']), - $return_is_exit - ); - - if (array_intersect([ - self::ACTION_LEAVE_SWITCH, - self::ACTION_BREAK, - self::ACTION_CONTINUE - ], $case_actions) - ) { - continue 2; - } - - if (!$case->cond) { - $has_non_breaking_default = true; - } - - $case_does_end = !array_diff( - $control_actions, - [self::ACTION_END, self::ACTION_RETURN] - ); - - if ($case_does_end) { - $has_ended = true; - } - - $all_case_actions = array_merge( - $all_case_actions, - $case_actions - ); - - if (!$case_does_end && !$has_ended) { - continue 2; - } - - if ($has_non_breaking_default && $case_does_end) { - $has_default_terminator = true; - } - } - - $all_case_actions = array_filter( - $all_case_actions, - function ($action) { - return $action !== self::ACTION_NONE; - } - ); - - if ($has_default_terminator || $stmt->getAttribute('allMatched', false)) { - return array_values(array_unique(array_merge($control_actions, $all_case_actions))); - } - - $control_actions = array_merge( - $control_actions, - $all_case_actions - ); - } - - if ($stmt instanceof PhpParser\Node\Stmt\Do_ - || $stmt instanceof PhpParser\Node\Stmt\While_ - || $stmt instanceof PhpParser\Node\Stmt\Foreach_ - || $stmt instanceof PhpParser\Node\Stmt\For_ - ) { - $loop_actions = self::getControlActions( - $stmt->stmts, - $nodes, - $exit_functions, - array_merge($break_types, ['loop']), - $return_is_exit - ); - - $control_actions = array_filter( - array_merge($control_actions, $loop_actions), - function ($action) { - return $action !== self::ACTION_NONE; - } - ); - - if ($stmt instanceof PhpParser\Node\Stmt\While_ - && $nodes - && ($stmt_expr_type = $nodes->getType($stmt->cond)) - && $stmt_expr_type->isAlwaysTruthy() - ) { - //infinite while loop that only return don't have an exit path - $have_exit_path = (bool)array_diff( - $control_actions, - [self::ACTION_END, self::ACTION_RETURN] - ); - - if (!$have_exit_path) { - return array_values(array_unique($control_actions)); - } - } - - if ($stmt instanceof PhpParser\Node\Stmt\For_ - && $nodes - ) { - $is_infinite_loop = true; - if ($stmt->cond) { - foreach ($stmt->cond as $cond) { - $stmt_expr_type = $nodes->getType($cond); - if (!$stmt_expr_type || !$stmt_expr_type->isAlwaysTruthy()) { - $is_infinite_loop = false; - } - } - } - - if ($is_infinite_loop) { - //infinite while loop that only return don't have an exit path - $have_exit_path = (bool)array_diff( - $control_actions, - [self::ACTION_END, self::ACTION_RETURN] - ); - - if (!$have_exit_path) { - return array_values(array_unique($control_actions)); - } - } - } - } - - if ($stmt instanceof PhpParser\Node\Stmt\TryCatch) { - $try_statement_actions = self::getControlActions( - $stmt->stmts, - $nodes, - $exit_functions, - $break_types, - $return_is_exit - ); - - $try_leaves = !array_filter( - $try_statement_actions, - function ($action) { - return $action === self::ACTION_NONE; - } - ); - - $all_catch_actions = []; - - if ($stmt->catches) { - $all_leave = $try_leaves; - - foreach ($stmt->catches as $catch) { - $catch_actions = self::getControlActions( - $catch->stmts, - $nodes, - $exit_functions, - $break_types, - $return_is_exit - ); - - $all_leave = $all_leave - && !array_filter( - $catch_actions, - function ($action) { - return $action === self::ACTION_NONE; - } - ); - - if (!$all_leave) { - $control_actions = array_merge($control_actions, $catch_actions); - } else { - $all_catch_actions = array_merge($all_catch_actions, $catch_actions); - } - } - - if ($all_leave && $try_statement_actions !== [self::ACTION_NONE]) { - return array_values( - array_unique( - array_merge( - $control_actions, - $try_statement_actions, - $all_catch_actions - ) - ) - ); - } - } elseif ($try_leaves) { - return array_values(array_unique(array_merge($control_actions, $try_statement_actions))); - } - - if ($stmt->finally && $stmt->finally->stmts) { - $finally_statement_actions = self::getControlActions( - $stmt->finally->stmts, - $nodes, - $exit_functions, - $break_types, - $return_is_exit - ); - - if (!in_array(self::ACTION_NONE, $finally_statement_actions, true)) { - return array_merge( - array_filter( - $control_actions, - function ($action) { - return $action !== self::ACTION_NONE; - } - ), - $finally_statement_actions - ); - } - } - - $control_actions = array_filter( - array_merge($control_actions, $try_statement_actions), - function ($action) { - return $action !== self::ACTION_NONE; - } - ); - } - } - - $control_actions[] = self::ACTION_NONE; - - return array_values(array_unique($control_actions)); - } - - /** - * @param array $stmts - * - */ - public static function onlyThrowsOrExits(NodeTypeProvider $type_provider, array $stmts): bool - { - if (empty($stmts)) { - return false; - } - - for ($i = count($stmts) - 1; $i >= 0; --$i) { - $stmt = $stmts[$i]; - - if ($stmt instanceof PhpParser\Node\Stmt\Throw_ - || ($stmt instanceof PhpParser\Node\Stmt\Expression - && $stmt->expr instanceof PhpParser\Node\Expr\Exit_) - ) { - return true; - } - - if ($stmt instanceof PhpParser\Node\Stmt\Expression) { - $stmt_type = $type_provider->getType($stmt->expr); - - if ($stmt_type && $stmt_type->isNever()) { - return true; - } - } - } - - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php deleted file mode 100644 index 8be2d28a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php +++ /dev/null @@ -1,182 +0,0 @@ -source); - } - - public function getAliases(): Aliases - { - return $this->source->getAliases(); - } - - /** - * @return array - */ - public function getAliasedClassesFlipped(): array - { - return $this->source->getAliasedClassesFlipped(); - } - - /** - * @return array - */ - public function getAliasedClassesFlippedReplaceable(): array - { - return $this->source->getAliasedClassesFlippedReplaceable(); - } - - public function getFQCLN(): ?string - { - return $this->source->getFQCLN(); - } - - public function getClassName(): ?string - { - return $this->source->getClassName(); - } - - public function getParentFQCLN(): ?string - { - return $this->source->getParentFQCLN(); - } - - public function getFileName(): string - { - return $this->source->getFileName(); - } - - public function getFilePath(): string - { - return $this->source->getFilePath(); - } - - public function getRootFileName(): string - { - return $this->source->getRootFileName(); - } - - public function getRootFilePath(): string - { - return $this->source->getRootFilePath(); - } - - public function setRootFilePath(string $file_path, string $file_name): void - { - $this->source->setRootFilePath($file_path, $file_name); - } - - public function hasParentFilePath(string $file_path): bool - { - return $this->source->hasParentFilePath($file_path); - } - - public function hasAlreadyRequiredFilePath(string $file_path): bool - { - return $this->source->hasAlreadyRequiredFilePath($file_path); - } - - public function getRequireNesting(): int - { - return $this->source->getRequireNesting(); - } - - /** - * @psalm-mutation-free - */ - public function getSource(): StatementsSource - { - return $this->source; - } - - /** - * Get a list of suppressed issues - * - * @return array - */ - public function getSuppressedIssues(): array - { - return $this->source->getSuppressedIssues(); - } - - /** - * @param array $new_issues - */ - public function addSuppressedIssues(array $new_issues): void - { - $this->source->addSuppressedIssues($new_issues); - } - - /** - * @param array $new_issues - */ - public function removeSuppressedIssues(array $new_issues): void - { - $this->source->removeSuppressedIssues($new_issues); - } - - public function getNamespace(): ?string - { - return $this->source->getNamespace(); - } - - public function isStatic(): bool - { - return $this->source->isStatic(); - } - - /** - * @psalm-mutation-free - */ - public function getCodebase(): Codebase - { - return $this->source->getCodebase(); - } - - /** - * @psalm-mutation-free - */ - public function getProjectAnalyzer(): ProjectAnalyzer - { - return $this->source->getProjectAnalyzer(); - } - - /** - * @psalm-mutation-free - */ - public function getFileAnalyzer(): FileAnalyzer - { - return $this->source->getFileAnalyzer(); - } - - /** - * @return array>|null - */ - public function getTemplateTypeMap(): ?array - { - return $this->source->getTemplateTypeMap(); - } - - public function getNodeTypeProvider(): NodeTypeProvider - { - return $this->source->getNodeTypeProvider(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php deleted file mode 100644 index aeeb964f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php +++ /dev/null @@ -1,210 +0,0 @@ -break_types[] = 'loop'; - $do_context->inside_loop = true; - - $codebase = $statements_analyzer->getCodebase(); - - if ($codebase->alter_code) { - $do_context->branch_point = $do_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); - } - - $loop_scope = new LoopScope($do_context, $context); - $loop_scope->protected_var_ids = $context->protected_var_ids; - - self::analyzeDoNaively($statements_analyzer, $stmt, $do_context, $loop_scope); - - $mixed_var_ids = []; - - foreach ($do_context->vars_in_scope as $var_id => $type) { - if ($type->hasMixed()) { - $mixed_var_ids[] = $var_id; - } - } - - $cond_id = spl_object_id($stmt->cond); - - $while_clauses = FormulaGenerator::getFormula( - $cond_id, - $cond_id, - $stmt->cond, - $context->self, - $statements_analyzer, - $codebase - ); - - $while_clauses = array_values( - array_filter( - $while_clauses, - function (Clause $c) use ($mixed_var_ids): bool { - $keys = array_keys($c->possibilities); - - $mixed_var_ids = array_diff($mixed_var_ids, $keys); - - foreach ($keys as $key) { - foreach ($mixed_var_ids as $mixed_var_id) { - if (preg_match('/^' . preg_quote($mixed_var_id, '/') . '(\[|-)/', $key)) { - return false; - } - } - } - - return true; - } - ) - ); - - if (!$while_clauses) { - $while_clauses = [new Clause([], $cond_id, $cond_id, true)]; - } - - if (LoopAnalyzer::analyze( - $statements_analyzer, - $stmt->stmts, - WhileAnalyzer::getAndExpressions($stmt->cond), - [], - $loop_scope, - $inner_loop_context, - true, - true - ) === false) { - return false; - } - - // because it's a do {} while, inner loop vars belong to the main context - if (!$inner_loop_context) { - throw new UnexpectedValueException('There should be an inner loop context'); - } - - $negated_while_clauses = Algebra::negateFormula($while_clauses); - - $negated_while_types = Algebra::getTruthsFromFormula( - Algebra::simplifyCNF( - array_merge($context->clauses, $negated_while_clauses) - ) - ); - - if ($negated_while_types) { - $changed_var_ids = []; - - $inner_loop_context->vars_in_scope = - Reconciler::reconcileKeyedTypes( - $negated_while_types, - [], - $inner_loop_context->vars_in_scope, - $changed_var_ids, - [], - $statements_analyzer, - [], - true, - new CodeLocation($statements_analyzer->getSource(), $stmt->cond) - ); - } - - foreach ($inner_loop_context->vars_in_scope as $var_id => $type) { - // if there are break statements in the loop it's not certain - // that the loop has finished executing, so the assertions at the end - // the loop in the while conditional may not hold - if (in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true)) { - if (isset($loop_scope->possibly_defined_loop_parent_vars[$var_id])) { - $context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $type, - $loop_scope->possibly_defined_loop_parent_vars[$var_id] - ); - } - } else { - $context->vars_in_scope[$var_id] = $type; - } - } - - $do_context->loop_scope = null; - - $context->vars_possibly_in_scope = array_merge( - $context->vars_possibly_in_scope, - $do_context->vars_possibly_in_scope - ); - - $context->referenced_var_ids = array_intersect_key( - $do_context->referenced_var_ids, - $context->referenced_var_ids - ); - - if ($context->collect_exceptions) { - $context->mergeExceptions($inner_loop_context); - } - - return null; - } - - private static function analyzeDoNaively( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Stmt\Do_ $stmt, - Context $context, - LoopScope $loop_scope - ): void { - $do_context = clone $context; - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('RedundantCondition', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['RedundantCondition']); - } - if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['RedundantConditionGivenDocblockType']); - } - if (!in_array('TypeDoesNotContainType', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['TypeDoesNotContainType']); - } - - $do_context->loop_scope = $loop_scope; - - $statements_analyzer->analyze($stmt->stmts, $do_context); - - if (!in_array('RedundantCondition', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['RedundantCondition']); - } - if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['RedundantConditionGivenDocblockType']); - } - if (!in_array('TypeDoesNotContainType', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['TypeDoesNotContainType']); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php deleted file mode 100644 index c45ca9b6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php +++ /dev/null @@ -1,190 +0,0 @@ -assigned_var_ids; - $context->assigned_var_ids = []; - - $init_var_types = []; - - foreach ($stmt->init as $init) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $init, $context) === false) { - return false; - } - - if ($init instanceof PhpParser\Node\Expr\Assign - && $init->var instanceof PhpParser\Node\Expr\Variable - && is_string($init->var->name) - && ($init_var_type = $statements_analyzer->node_data->getType($init->expr)) - ) { - $init_var_types[$init->var->name] = $init_var_type; - } - } - - $assigned_var_ids = $context->assigned_var_ids; - - $context->assigned_var_ids = array_merge( - $pre_assigned_var_ids, - $assigned_var_ids - ); - - $while_true = !$stmt->cond && !$stmt->init && !$stmt->loop; - - $pre_context = null; - - if ($while_true) { - $pre_context = clone $context; - } - - $for_context = clone $context; - - $for_context->inside_loop = true; - $for_context->break_types[] = 'loop'; - - $codebase = $statements_analyzer->getCodebase(); - - if ($codebase->alter_code) { - $for_context->branch_point = $for_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); - } - - $loop_scope = new LoopScope($for_context, $context); - - $loop_scope->protected_var_ids = array_merge( - $assigned_var_ids, - $context->protected_var_ids - ); - - if (LoopAnalyzer::analyze( - $statements_analyzer, - $stmt->stmts, - $stmt->cond, - $stmt->loop, - $loop_scope, - $inner_loop_context - ) === false) { - return false; - } - - if (!$inner_loop_context) { - throw new UnexpectedValueException('There should be an inner loop context'); - } - - $always_enters_loop = false; - - foreach ($stmt->cond as $cond) { - if ($cond_type = $statements_analyzer->node_data->getType($cond)) { - $always_enters_loop = $cond_type->isAlwaysTruthy(); - } - - if (count($stmt->init) === 1 - && count($stmt->cond) === 1 - && $cond instanceof PhpParser\Node\Expr\BinaryOp - && $cond->right instanceof PhpParser\Node\Scalar\LNumber - && $cond->left instanceof PhpParser\Node\Expr\Variable - && is_string($cond->left->name) - && isset($init_var_types[$cond->left->name]) - && $init_var_types[$cond->left->name]->isSingleIntLiteral() - ) { - $init_value = $init_var_types[$cond->left->name]->getSingleIntLiteral()->value; - $cond_value = $cond->right->value; - - if ($cond instanceof PhpParser\Node\Expr\BinaryOp\Smaller && $init_value < $cond_value) { - $always_enters_loop = true; - break; - } - - if ($cond instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual && $init_value <= $cond_value) { - $always_enters_loop = true; - break; - } - - if ($cond instanceof PhpParser\Node\Expr\BinaryOp\Greater && $init_value > $cond_value) { - $always_enters_loop = true; - break; - } - - if ($cond instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual && $init_value >= $cond_value) { - $always_enters_loop = true; - break; - } - } - } - - if ($while_true) { - $always_enters_loop = true; - } - - $can_leave_loop = !$while_true - || in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true); - - if ($always_enters_loop && $can_leave_loop) { - foreach ($inner_loop_context->vars_in_scope as $var_id => $type) { - // if there are break statements in the loop it's not certain - // that the loop has finished executing, so the assertions at the end - // the loop in the while conditional may not hold - if (in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true) - || in_array(ScopeAnalyzer::ACTION_CONTINUE, $loop_scope->final_actions, true) - ) { - if (isset($loop_scope->possibly_defined_loop_parent_vars[$var_id])) { - $context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $type, - $loop_scope->possibly_defined_loop_parent_vars[$var_id] - ); - } - } else { - $context->vars_in_scope[$var_id] = $type; - } - } - } - - $for_context->loop_scope = null; - - if ($can_leave_loop) { - $context->vars_possibly_in_scope = array_merge( - $context->vars_possibly_in_scope, - $for_context->vars_possibly_in_scope - ); - } elseif ($pre_context) { - $context->vars_possibly_in_scope = $pre_context->vars_possibly_in_scope; - } - - $context->referenced_var_ids = array_intersect_key( - $for_context->referenced_var_ids, - $context->referenced_var_ids - ); - - if ($context->collect_exceptions) { - $context->mergeExceptions($for_context); - } - - return null; - } -} 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 deleted file mode 100644 index bdcf8341..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php +++ /dev/null @@ -1,1149 +0,0 @@ -getDocComment(); - - $codebase = $statements_analyzer->getCodebase(); - $file_path = $statements_analyzer->getRootFilePath(); - $type_aliases = $codebase->file_storage_provider->get($file_path)->type_aliases; - - if ($doc_comment) { - try { - $var_comments = CommentAnalyzer::getTypeFromComment( - $doc_comment, - $statements_analyzer->getSource(), - $statements_analyzer->getSource()->getAliases(), - $statements_analyzer->getTemplateTypeMap() ?: [], - $type_aliases - ); - } catch (DocblockParseException $e) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $e->getMessage(), - new CodeLocation($statements_analyzer, $stmt) - ) - ); - } - } - - $safe_var_ids = []; - - if ($stmt->keyVar instanceof PhpParser\Node\Expr\Variable && is_string($stmt->keyVar->name)) { - $safe_var_ids['$' . $stmt->keyVar->name] = true; - } - - if ($stmt->valueVar instanceof PhpParser\Node\Expr\Variable && is_string($stmt->valueVar->name)) { - $safe_var_ids['$' . $stmt->valueVar->name] = true; - $statements_analyzer->foreach_var_locations['$' . $stmt->valueVar->name][] = new CodeLocation( - $statements_analyzer, - $stmt->valueVar - ); - } elseif ($stmt->valueVar instanceof PhpParser\Node\Expr\List_) { - foreach ($stmt->valueVar->items as $list_item) { - if (!$list_item) { - continue; - } - - $list_item_key = $list_item->key; - $list_item_value = $list_item->value; - - if ($list_item_value instanceof PhpParser\Node\Expr\Variable && is_string($list_item_value->name)) { - $safe_var_ids['$' . $list_item_value->name] = true; - } - - if ($list_item_key instanceof PhpParser\Node\Expr\Variable && is_string($list_item_key->name)) { - $safe_var_ids['$' . $list_item_key->name] = true; - } - } - } - - foreach ($var_comments as $var_comment) { - if (!$var_comment->var_id || !$var_comment->type) { - continue; - } - - if (isset($safe_var_ids[$var_comment->var_id])) { - continue; - } - - $comment_type = TypeExpander::expandUnion( - $codebase, - $var_comment->type, - $context->self, - $context->self, - $statements_analyzer->getParentFQCLN() - ); - - $type_location = null; - - if ($var_comment->type_start - && $var_comment->type_end - && $var_comment->line_number - ) { - $type_location = new DocblockTypeLocation( - $statements_analyzer, - $var_comment->type_start, - $var_comment->type_end, - $var_comment->line_number - ); - - if ($codebase->alter_code) { - $codebase->classlikes->handleDocblockTypeInMigration( - $codebase, - $statements_analyzer, - $comment_type, - $type_location, - $context->calling_method_id - ); - } - } - - if (isset($context->vars_in_scope[$var_comment->var_id]) - || VariableFetchAnalyzer::isSuperGlobal($var_comment->var_id) - ) { - if ($codebase->find_unused_variables - && $doc_comment - && $type_location - && isset($context->vars_in_scope[$var_comment->var_id]) - && $context->vars_in_scope[$var_comment->var_id]->getId() === $comment_type->getId() - && !$comment_type->isMixed() - ) { - $project_analyzer = $statements_analyzer->getProjectAnalyzer(); - - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['UnnecessaryVarAnnotation']) - ) { - FileManipulationBuffer::addVarAnnotationToRemove($type_location); - } elseif (IssueBuffer::accepts( - new UnnecessaryVarAnnotation( - 'The @var ' . $comment_type . ' annotation for ' - . $var_comment->var_id . ' is unnecessary', - $type_location - ), - $statements_analyzer->getSuppressedIssues(), - true - )) { - // fall through - } - } - - if (isset($context->vars_in_scope[$var_comment->var_id])) { - $comment_type->parent_nodes = $context->vars_in_scope[$var_comment->var_id]->parent_nodes; - } - - $context->vars_in_scope[$var_comment->var_id] = $comment_type; - } - } - - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - $context->inside_general_use = $was_inside_general_use; - - return false; - } - $context->inside_general_use = $was_inside_general_use; - - $key_type = null; - $value_type = null; - $always_non_empty_array = true; - - $var_id = ExpressionIdentifier::getVarId( - $stmt->expr, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { - $iterator_type = $stmt_expr_type; - } elseif ($var_id && $context->hasVariable($var_id)) { - $iterator_type = $context->vars_in_scope[$var_id]; - } else { - $iterator_type = null; - } - - if ($iterator_type) { - if (self::checkIteratorType( - $statements_analyzer, - $stmt, - $stmt->expr, - $iterator_type, - $codebase, - $context, - $key_type, - $value_type, - $always_non_empty_array - ) === false - ) { - return false; - } - } - - $foreach_context = clone $context; - - foreach ($foreach_context->vars_in_scope as $context_var_id => $context_type) { - $foreach_context->vars_in_scope[$context_var_id] = clone $context_type; - } - - $foreach_context->inside_loop = true; - $foreach_context->break_types[] = 'loop'; - - if ($codebase->alter_code) { - $foreach_context->branch_point = - $foreach_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); - } - - if ($stmt->keyVar instanceof PhpParser\Node\Expr\Variable && is_string($stmt->keyVar->name)) { - $key_type = $key_type ?? Type::getMixed(); - - AssignmentAnalyzer::analyze( - $statements_analyzer, - $stmt->keyVar, - $stmt->expr, - $key_type, - $foreach_context, - $doc_comment, - ['$' . $stmt->keyVar->name => true] - ); - } - - $value_type = $value_type ?? Type::getMixed(); - - if ($stmt->byRef) { - $value_type->by_ref = true; - } - - AssignmentAnalyzer::analyze( - $statements_analyzer, - $stmt->valueVar, - $stmt->expr, - $value_type, - $foreach_context, - $doc_comment, - $stmt->valueVar instanceof PhpParser\Node\Expr\Variable - && is_string($stmt->valueVar->name) - ? ['$' . $stmt->valueVar->name => true] - : [] - ); - - foreach ($var_comments as $var_comment) { - if (!$var_comment->var_id || !$var_comment->type) { - continue; - } - - $comment_type = TypeExpander::expandUnion( - $codebase, - $var_comment->type, - $context->self, - $context->self, - $statements_analyzer->getParentFQCLN() - ); - - if (isset($foreach_context->vars_in_scope[$var_comment->var_id])) { - $existing_var_type = $foreach_context->vars_in_scope[$var_comment->var_id]; - $comment_type->parent_nodes = $existing_var_type->parent_nodes; - $comment_type->by_ref = $existing_var_type->by_ref; - } - - $foreach_context->vars_in_scope[$var_comment->var_id] = $comment_type; - } - - $loop_scope = new LoopScope($foreach_context, $context); - - $loop_scope->protected_var_ids = $context->protected_var_ids; - - if (LoopAnalyzer::analyze( - $statements_analyzer, - $stmt->stmts, - [], - [], - $loop_scope, - $inner_loop_context, - false, - $always_non_empty_array - ) === false) { - return false; - } - - if (!$inner_loop_context) { - throw new UnexpectedValueException('There should be an inner loop context'); - } - - $foreach_context->loop_scope = null; - - $context->vars_possibly_in_scope = array_merge( - $foreach_context->vars_possibly_in_scope, - $context->vars_possibly_in_scope - ); - - $context->referenced_var_ids = array_intersect_key( - $foreach_context->referenced_var_ids, - $context->referenced_var_ids - ); - - if ($context->collect_exceptions) { - $context->mergeExceptions($foreach_context); - } - - return null; - } - - /** - * @param PhpParser\Node\Stmt\Foreach_|PhpParser\Node\Expr\YieldFrom $stmt - * @return false|null - */ - public static function checkIteratorType( - StatementsAnalyzer $statements_analyzer, - PhpParser\NodeAbstract $stmt, - PhpParser\Node\Expr $expr, - Union $iterator_type, - Codebase $codebase, - Context $context, - ?Union &$key_type, - ?Union &$value_type, - bool &$always_non_empty_array - ): ?bool { - if ($iterator_type->isNull()) { - if (IssueBuffer::accepts( - new NullIterator( - 'Cannot iterate over null', - new CodeLocation($statements_analyzer->getSource(), $expr) - ), - $statements_analyzer->getSuppressedIssues() - )) { - } - - return false; - } - - if ($iterator_type->isNullable() && !$iterator_type->ignore_nullable_issues) { - IssueBuffer::maybeAdd( - new PossiblyNullIterator( - 'Cannot iterate over nullable var ' . $iterator_type, - new CodeLocation($statements_analyzer->getSource(), $expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return null; - } - - if ($iterator_type->isFalsable() && !$iterator_type->ignore_falsable_issues) { - IssueBuffer::maybeAdd( - new PossiblyFalseIterator( - 'Cannot iterate over falsable var ' . $iterator_type, - new CodeLocation($statements_analyzer->getSource(), $expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return null; - } - - $has_valid_iterator = false; - $invalid_iterator_types = []; - $raw_object_types = []; - - foreach ($iterator_type->getAtomicTypes() as $iterator_atomic_type) { - if ($iterator_atomic_type instanceof TTemplateParam) { - $iterator_atomic_type = $iterator_atomic_type->as->getSingleAtomic(); - } - - // if it's an empty array, we cannot iterate over it - if ($iterator_atomic_type instanceof TArray - && $iterator_atomic_type->type_params[1]->isEmpty() - ) { - $always_non_empty_array = false; - $has_valid_iterator = true; - continue; - } - - if ($iterator_atomic_type instanceof TNull - || $iterator_atomic_type instanceof TFalse - ) { - $always_non_empty_array = false; - continue; - } - - if ($iterator_atomic_type instanceof TArray - || $iterator_atomic_type instanceof TKeyedArray - || $iterator_atomic_type instanceof TList - ) { - if ($iterator_atomic_type instanceof TKeyedArray) { - if (!$iterator_atomic_type->sealed) { - $always_non_empty_array = false; - } - $iterator_atomic_type = $iterator_atomic_type->getGenericArrayType(); - } elseif ($iterator_atomic_type instanceof TList) { - $list_var_id = ExpressionIdentifier::getArrayVarId( - $expr, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if (!$iterator_atomic_type instanceof TNonEmptyList) { - $always_non_empty_array = false; - } - - $iterator_atomic_type = new TArray([ - $list_var_id - ? new Union([ - new TDependentListKey($list_var_id) - ]) - : new Union([new TIntRange(0, null)]), - $iterator_atomic_type->type_param - ]); - } elseif (!$iterator_atomic_type instanceof TNonEmptyArray) { - $always_non_empty_array = false; - } - - $value_type = Type::combineUnionTypes($value_type, clone $iterator_atomic_type->type_params[1]); - - $key_type_part = $iterator_atomic_type->type_params[0]; - - $key_type = Type::combineUnionTypes($key_type, $key_type_part); - - ArrayFetchAnalyzer::taintArrayFetch( - $statements_analyzer, - $expr, - null, - $value_type, - $key_type - ); - - $has_valid_iterator = true; - continue; - } - - $always_non_empty_array = false; - - if ($iterator_atomic_type instanceof Scalar || $iterator_atomic_type instanceof TVoid) { - $invalid_iterator_types[] = $iterator_atomic_type->getKey(); - - $value_type = Type::getMixed(); - } elseif ($iterator_atomic_type instanceof TObject || $iterator_atomic_type instanceof TMixed) { - $has_valid_iterator = true; - $value_type = Type::getMixed(); - $key_type = Type::getMixed(); - - ArrayFetchAnalyzer::taintArrayFetch( - $statements_analyzer, - $expr, - null, - $value_type, - $key_type - ); - - if (!$context->pure) { - if ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - } else { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a possibly-mutating iterator from a pure context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } elseif ($iterator_atomic_type instanceof TIterable) { - if ($iterator_atomic_type->extra_types) { - $iterator_atomic_type_copy = clone $iterator_atomic_type; - $iterator_atomic_type_copy->extra_types = []; - $iterator_atomic_types = [$iterator_atomic_type_copy]; - $iterator_atomic_types = array_merge( - $iterator_atomic_types, - $iterator_atomic_type->extra_types - ); - } else { - $iterator_atomic_types = [$iterator_atomic_type]; - } - - $intersection_value_type = null; - $intersection_key_type = null; - - foreach ($iterator_atomic_types as $iat) { - if (!$iat instanceof TIterable) { - continue; - } - - [$key_type_part, $value_type_part] = $iat->type_params; - - if (!$intersection_value_type) { - $intersection_value_type = $value_type_part; - } else { - $intersection_value_type = Type::intersectUnionTypes( - $intersection_value_type, - $value_type_part, - $codebase - ) ?? Type::getMixed(); - } - - if (!$intersection_key_type) { - $intersection_key_type = $key_type_part; - } else { - $intersection_key_type = Type::intersectUnionTypes( - $intersection_key_type, - $key_type_part, - $codebase - ) ?? Type::getMixed(); - } - } - - if (!$intersection_value_type || !$intersection_key_type) { - throw new UnexpectedValueException('Should not happen'); - } - - $value_type = Type::combineUnionTypes($value_type, $intersection_value_type); - $key_type = Type::combineUnionTypes($key_type, $intersection_key_type); - - ArrayFetchAnalyzer::taintArrayFetch( - $statements_analyzer, - $expr, - null, - $value_type, - $key_type - ); - - $has_valid_iterator = true; - - if (!$context->pure) { - if ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - } else { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a possibly-mutating Traversable::getIterator from a pure context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } elseif ($iterator_atomic_type instanceof TNamedObject) { - if ($iterator_atomic_type->value !== 'Traversable' && - $iterator_atomic_type->value !== $statements_analyzer->getClassName() - ) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $iterator_atomic_type->value, - new CodeLocation($statements_analyzer->getSource(), $expr), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions(true) - ) === false) { - return false; - } - } - - if (AtomicTypeComparator::isContainedBy( - $codebase, - $iterator_atomic_type, - new TIterable([Type::getMixed(), Type::getMixed()]) - )) { - self::handleIterable( - $statements_analyzer, - $iterator_atomic_type, - $expr, - $codebase, - $context, - $key_type, - $value_type, - $has_valid_iterator - ); - } else { - $raw_object_types[] = $iterator_atomic_type->value; - } - - if (!$context->pure) { - if ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - } else { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a possibly-mutating iterator from a pure context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - if ($raw_object_types) { - if ($has_valid_iterator) { - IssueBuffer::maybeAdd( - new PossibleRawObjectIteration( - 'Possibly undesired iteration over regular object ' . reset($raw_object_types), - new CodeLocation($statements_analyzer->getSource(), $expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RawObjectIteration( - 'Possibly undesired iteration over regular object ' . reset($raw_object_types), - new CodeLocation($statements_analyzer->getSource(), $expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($invalid_iterator_types) { - if ($has_valid_iterator) { - IssueBuffer::maybeAdd( - new PossiblyInvalidIterator( - 'Cannot iterate over ' . $invalid_iterator_types[0], - new CodeLocation($statements_analyzer->getSource(), $expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidIterator( - 'Cannot iterate over ' . $invalid_iterator_types[0], - new CodeLocation($statements_analyzer->getSource(), $expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - return null; - } - - public static function handleIterable( - StatementsAnalyzer $statements_analyzer, - TNamedObject $iterator_atomic_type, - PhpParser\Node\Expr $foreach_expr, - Codebase $codebase, - Context $context, - ?Union &$key_type, - ?Union &$value_type, - bool &$has_valid_iterator - ): void { - if ($iterator_atomic_type->extra_types) { - $iterator_atomic_type_copy = clone $iterator_atomic_type; - $iterator_atomic_type_copy->extra_types = []; - $iterator_atomic_types = [$iterator_atomic_type_copy]; - $iterator_atomic_types = array_merge($iterator_atomic_types, $iterator_atomic_type->extra_types); - } else { - $iterator_atomic_types = [$iterator_atomic_type]; - } - - foreach ($iterator_atomic_types as $iterator_atomic_type) { - if ($iterator_atomic_type instanceof TTemplateParam - || $iterator_atomic_type instanceof TObjectWithProperties - ) { - throw new UnexpectedValueException('Shouldn’t get a generic param here'); - } - - - $has_valid_iterator = true; - - if ($iterator_atomic_type instanceof TNamedObject - && strtolower($iterator_atomic_type->value) === 'simplexmlelement' - ) { - $value_type = Type::combineUnionTypes( - $value_type, - new Union([clone $iterator_atomic_type]) - ); - - $key_type = Type::combineUnionTypes( - $key_type, - Type::getString() - ); - } - - if ($iterator_atomic_type instanceof TIterable - || (strtolower($iterator_atomic_type->value) === 'traversable' - || $codebase->classImplements( - $iterator_atomic_type->value, - 'Traversable' - ) || - ( - $codebase->interfaceExists($iterator_atomic_type->value) - && $codebase->interfaceExtends( - $iterator_atomic_type->value, - 'Traversable' - ) - )) - ) { - if (strtolower($iterator_atomic_type->value) === 'iteratoraggregate' - || $codebase->classImplements( - $iterator_atomic_type->value, - 'IteratorAggregate' - ) - || ($codebase->interfaceExists($iterator_atomic_type->value) - && $codebase->interfaceExtends( - $iterator_atomic_type->value, - 'IteratorAggregate' - ) - ) - ) { - $old_data_provider = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $fake_method_call = new VirtualMethodCall( - $foreach_expr, - new VirtualIdentifier('getIterator', $foreach_expr->getAttributes()) - ); - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); - } - - if (!in_array('PossiblyUndefinedMethod', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['PossiblyUndefinedMethod']); - } - - $was_inside_call = $context->inside_call; - - $context->inside_call = true; - - MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_method_call, - $context - ); - - $context->inside_call = $was_inside_call; - - if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['PossiblyInvalidMethodCall']); - } - - if (!in_array('PossiblyUndefinedMethod', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['PossiblyUndefinedMethod']); - } - - $iterator_class_type = $statements_analyzer->node_data->getType($fake_method_call) ?? null; - - $statements_analyzer->node_data = $old_data_provider; - - if ($iterator_class_type) { - foreach ($iterator_class_type->getAtomicTypes() as $array_atomic_type) { - $key_type_part = null; - $value_type_part = null; - - if ($array_atomic_type instanceof TArray - || $array_atomic_type instanceof TKeyedArray - ) { - if ($array_atomic_type instanceof TKeyedArray) { - $array_atomic_type = $array_atomic_type->getGenericArrayType(); - } - - [$key_type_part, $value_type_part] = $array_atomic_type->type_params; - } else { - if ($array_atomic_type instanceof TNamedObject - && $codebase->classExists($array_atomic_type->value) - && $codebase->classImplements( - $array_atomic_type->value, - 'Traversable' - ) - ) { - $generic_storage = $codebase->classlike_storage_provider->get( - $array_atomic_type->value - ); - - // The collection might be an iterator, in which case - // we want to call the iterator function - /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ - if (!isset($generic_storage->template_extended_params['Traversable']) - || ($generic_storage - ->template_extended_params['Traversable']['TKey']->isMixed() - && $generic_storage - ->template_extended_params['Traversable']['TValue']->isMixed()) - ) { - self::handleIterable( - $statements_analyzer, - $array_atomic_type, - $fake_method_call, - $codebase, - $context, - $key_type, - $value_type, - $has_valid_iterator - ); - - continue; - } - } - - if ($array_atomic_type instanceof TIterable - || ($array_atomic_type instanceof TNamedObject - && ($array_atomic_type->value === 'Traversable' - || ($codebase->classOrInterfaceExists($array_atomic_type->value) - && $codebase->classImplements( - $array_atomic_type->value, - 'Traversable' - )))) - ) { - self::getKeyValueParamsForTraversableObject( - $array_atomic_type, - $codebase, - $key_type_part, - $value_type_part - ); - } - } - - if (!$key_type_part || !$value_type_part) { - break; - } - - $key_type = Type::combineUnionTypes($key_type, $key_type_part); - $value_type = Type::combineUnionTypes($value_type, $value_type_part); - } - } - } elseif ($codebase->classImplements( - $iterator_atomic_type->value, - 'Iterator' - ) || - ( - $codebase->interfaceExists($iterator_atomic_type->value) - && $codebase->interfaceExtends( - $iterator_atomic_type->value, - 'Iterator' - ) - ) - ) { - $iterator_value_type = self::getFakeMethodCallType( - $statements_analyzer, - $foreach_expr, - $context, - 'current' - ); - - $iterator_key_type = self::getFakeMethodCallType( - $statements_analyzer, - $foreach_expr, - $context, - 'key' - ); - - if ($iterator_value_type && !$iterator_value_type->isMixed()) { - $value_type = Type::combineUnionTypes($value_type, $iterator_value_type); - } - - if ($iterator_key_type && !$iterator_key_type->isMixed()) { - $key_type = Type::combineUnionTypes($key_type, $iterator_key_type); - } - } - - if (!$key_type && !$value_type) { - self::getKeyValueParamsForTraversableObject( - $iterator_atomic_type, - $codebase, - $key_type, - $value_type - ); - } - - return; - } - - if (!$codebase->classlikes->classOrInterfaceExists($iterator_atomic_type->value)) { - return; - } - } - } - - public static function getKeyValueParamsForTraversableObject( - Atomic $iterator_atomic_type, - Codebase $codebase, - ?Union &$key_type, - ?Union &$value_type - ): void { - if ($iterator_atomic_type instanceof TIterable - || ($iterator_atomic_type instanceof TGenericObject - && strtolower($iterator_atomic_type->value) === 'traversable') - ) { - $value_type = Type::combineUnionTypes($value_type, $iterator_atomic_type->type_params[1]); - $key_type = Type::combineUnionTypes($key_type, $iterator_atomic_type->type_params[0]); - - return; - } - - if ($iterator_atomic_type instanceof TNamedObject - && ( - $codebase->classImplements( - $iterator_atomic_type->value, - 'Traversable' - ) - || $codebase->interfaceExtends( - $iterator_atomic_type->value, - 'Traversable' - ) - ) - ) { - $generic_storage = $codebase->classlike_storage_provider->get( - $iterator_atomic_type->value - ); - - if (!isset($generic_storage->template_extended_params['Traversable'])) { - return; - } - - if ($generic_storage->template_types - || $iterator_atomic_type instanceof TGenericObject - ) { - // if we're just being passed the non-generic class itself, assume - // that it's inside the calling class - $passed_type_params = $iterator_atomic_type instanceof TGenericObject - ? $iterator_atomic_type->type_params - : array_values( - array_map( - /** @param array $arr */ - function (array $arr) use ($iterator_atomic_type): Union { - return $arr[$iterator_atomic_type->value] ?? Type::getMixed(); - }, - $generic_storage->template_types - ) - ); - } else { - $passed_type_params = null; - } - - $key_type = self::getExtendedType( - 'TKey', - 'Traversable', - $generic_storage->name, - $generic_storage->template_extended_params, - $generic_storage->template_types, - $passed_type_params - ); - - $value_type = self::getExtendedType( - 'TValue', - 'Traversable', - $generic_storage->name, - $generic_storage->template_extended_params, - $generic_storage->template_types, - $passed_type_params - ); - - return; - } - } - - private static function getFakeMethodCallType( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $foreach_expr, - Context $context, - string $method_name - ): ?Union { - $old_data_provider = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $fake_method_call = new VirtualMethodCall( - $foreach_expr, - new VirtualIdentifier($method_name, $foreach_expr->getAttributes()) - ); - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); - } - - if (!in_array('PossiblyUndefinedMethod', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['PossiblyUndefinedMethod']); - } - - $was_inside_call = $context->inside_call; - - $context->inside_call = true; - - MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_method_call, - $context - ); - - $context->inside_call = $was_inside_call; - - if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['PossiblyInvalidMethodCall']); - } - - if (!in_array('PossiblyUndefinedMethod', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['PossiblyUndefinedMethod']); - } - - $iterator_class_type = $statements_analyzer->node_data->getType($fake_method_call) ?? null; - - $statements_analyzer->node_data = $old_data_provider; - - return $iterator_class_type; - } - - /** - * @param array> $template_extended_params - * @param array> $class_template_types - * @param array $calling_type_params - */ - private static function getExtendedType( - string $template_name, - string $template_class, - string $calling_class, - array $template_extended_params, - ?array $class_template_types = null, - ?array $calling_type_params = null - ): ?Union { - if ($calling_class === $template_class) { - if (isset($class_template_types[$template_name]) && $calling_type_params) { - $offset = array_search($template_name, array_keys($class_template_types)); - - if ($offset !== false && isset($calling_type_params[$offset])) { - return $calling_type_params[$offset]; - } - } - - return null; - } - - if (isset($template_extended_params[$template_class][$template_name])) { - $extended_type = $template_extended_params[$template_class][$template_name]; - - $return_type = null; - - foreach ($extended_type->getAtomicTypes() as $extended_atomic_type) { - if (!$extended_atomic_type instanceof TTemplateParam) { - $return_type = Type::combineUnionTypes( - $return_type, - $extended_type - ); - - continue; - } - - $candidate_type = self::getExtendedType( - $extended_atomic_type->param_name, - $extended_atomic_type->defining_class, - $calling_class, - $template_extended_params, - $class_template_types, - $calling_type_params - ); - - if ($candidate_type) { - $return_type = Type::combineUnionTypes( - $return_type, - $candidate_type - ); - } - } - - if ($return_type) { - return $return_type; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php deleted file mode 100644 index cd4002e5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php +++ /dev/null @@ -1,377 +0,0 @@ -negated_clauses) { - $entry_clauses = array_merge($outer_context->clauses, $if_scope->negated_clauses); - - $changed_var_ids = []; - - if ($if_scope->negated_types) { - $vars_reconciled = Reconciler::reconcileKeyedTypes( - $if_scope->negated_types, - [], - $outer_context->vars_in_scope, - $changed_var_ids, - [], - $statements_analyzer, - [], - $outer_context->inside_loop, - new CodeLocation( - $statements_analyzer->getSource(), - $cond instanceof PhpParser\Node\Expr\BooleanNot - ? $cond->expr - : $cond, - $outer_context->include_location, - false - ) - ); - - if ($changed_var_ids) { - $outer_context = clone $outer_context; - $outer_context->vars_in_scope = $vars_reconciled; - - $entry_clauses = array_values( - array_filter( - $entry_clauses, - function (Clause $c) use ($changed_var_ids): bool { - return count($c->possibilities) > 1 - || $c->wedge - || !isset($changed_var_ids[array_keys($c->possibilities)[0]]); - } - ) - ); - } - } - } - - // get the first expression in the if, which should be evaluated on its own - // this allows us to update the context of $matches in - // if (!preg_match('/a/', 'aa', $matches)) { - // exit - // } - // echo $matches[0]; - $externally_applied_if_cond_expr = self::getDefinitelyEvaluatedExpressionAfterIf($cond); - - $internally_applied_if_cond_expr = self::getDefinitelyEvaluatedExpressionInsideIf($cond); - - $pre_condition_vars_in_scope = $outer_context->vars_in_scope; - - $referenced_var_ids = $outer_context->referenced_var_ids; - $outer_context->referenced_var_ids = []; - - $pre_assigned_var_ids = $outer_context->assigned_var_ids; - $outer_context->assigned_var_ids = []; - - $if_context = null; - - if ($internally_applied_if_cond_expr !== $externally_applied_if_cond_expr) { - $if_context = clone $outer_context; - } - - $was_inside_conditional = $outer_context->inside_conditional; - - $outer_context->inside_conditional = true; - - if ($externally_applied_if_cond_expr) { - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $externally_applied_if_cond_expr, - $outer_context - ) === false) { - throw new ScopeAnalysisException(); - } - } - - $first_cond_assigned_var_ids = $outer_context->assigned_var_ids; - $outer_context->assigned_var_ids = array_merge( - $pre_assigned_var_ids, - $first_cond_assigned_var_ids - ); - - $first_cond_referenced_var_ids = $outer_context->referenced_var_ids; - $outer_context->referenced_var_ids = array_merge( - $referenced_var_ids, - $first_cond_referenced_var_ids - ); - - $outer_context->inside_conditional = $was_inside_conditional; - - if (!$if_context) { - $if_context = clone $outer_context; - } - - $if_conditional_context = clone $if_context; - $if_conditional_context->if_context = $if_context; - $if_conditional_context->if_scope = $if_scope; - - if ($codebase->alter_code) { - $if_context->branch_point = $branch_point; - } - - // we need to clone the current context so our ongoing updates - // to $outer_context don't mess with elseif/else blocks - $post_if_context = clone $outer_context; - - if ($internally_applied_if_cond_expr !== $cond - || $externally_applied_if_cond_expr !== $cond - ) { - $assigned_var_ids = $first_cond_assigned_var_ids; - $if_conditional_context->assigned_var_ids = []; - - $referenced_var_ids = $first_cond_referenced_var_ids; - $if_conditional_context->referenced_var_ids = []; - - $was_inside_conditional = $if_conditional_context->inside_conditional; - - $if_conditional_context->inside_conditional = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $cond, $if_conditional_context) === false) { - throw new ScopeAnalysisException(); - } - - $if_conditional_context->inside_conditional = $was_inside_conditional; - - /** @var array */ - $more_cond_referenced_var_ids = $if_conditional_context->referenced_var_ids; - $if_conditional_context->referenced_var_ids = array_merge( - $more_cond_referenced_var_ids, - $referenced_var_ids - ); - - $cond_referenced_var_ids = array_merge( - $first_cond_referenced_var_ids, - $more_cond_referenced_var_ids - ); - - /** @var array */ - $more_cond_assigned_var_ids = $if_conditional_context->assigned_var_ids; - $if_conditional_context->assigned_var_ids = array_merge( - $more_cond_assigned_var_ids, - $assigned_var_ids - ); - - $assigned_in_conditional_var_ids = array_merge( - $first_cond_assigned_var_ids, - $more_cond_assigned_var_ids - ); - } else { - $cond_referenced_var_ids = $first_cond_referenced_var_ids; - - $assigned_in_conditional_var_ids = $first_cond_assigned_var_ids; - } - - $newish_var_ids = array_map( - /** - * @param Union $_ - * - * @return true - */ - function (Union $_): bool { - return true; - }, - array_diff_key( - $if_conditional_context->vars_in_scope, - $pre_condition_vars_in_scope, - $cond_referenced_var_ids, - $assigned_in_conditional_var_ids - ) - ); - - self::handleParadoxicalCondition($statements_analyzer, $cond, true); - - // get all the var ids that were referenced in the conditional, but not assigned in it - $cond_referenced_var_ids = array_diff_key($cond_referenced_var_ids, $assigned_in_conditional_var_ids); - - $cond_referenced_var_ids = array_merge($newish_var_ids, $cond_referenced_var_ids); - - return new IfConditionalScope( - $if_context, - $post_if_context, - $cond_referenced_var_ids, - $assigned_in_conditional_var_ids, - $entry_clauses - ); - } - - /** - * Returns statements that are definitely evaluated before any statements after the end of the - * if/elseif/else blocks - */ - private static function getDefinitelyEvaluatedExpressionAfterIf(PhpParser\Node\Expr $stmt): ?PhpParser\Node\Expr - { - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical - ) { - if ($stmt->left instanceof PhpParser\Node\Expr\ConstFetch - && $stmt->left->name->parts === ['true'] - ) { - return self::getDefinitelyEvaluatedExpressionAfterIf($stmt->right); - } - - if ($stmt->right instanceof PhpParser\Node\Expr\ConstFetch - && $stmt->right->name->parts === ['true'] - ) { - return self::getDefinitelyEvaluatedExpressionAfterIf($stmt->left); - } - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) { - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalAnd - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalXor - ) { - return self::getDefinitelyEvaluatedExpressionAfterIf($stmt->left); - } - - return $stmt; - } - - if ($stmt instanceof PhpParser\Node\Expr\BooleanNot) { - $inner_stmt = self::getDefinitelyEvaluatedExpressionInsideIf($stmt->expr); - - if ($inner_stmt !== $stmt->expr) { - return $inner_stmt; - } - } - - return $stmt; - } - - /** - * Returns statements that are definitely evaluated before any statements inside - * the if block - */ - private static function getDefinitelyEvaluatedExpressionInsideIf(PhpParser\Node\Expr $stmt): ?PhpParser\Node\Expr - { - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical - ) { - if ($stmt->left instanceof PhpParser\Node\Expr\ConstFetch - && $stmt->left->name->parts === ['true'] - ) { - return self::getDefinitelyEvaluatedExpressionInsideIf($stmt->right); - } - - if ($stmt->right instanceof PhpParser\Node\Expr\ConstFetch - && $stmt->right->name->parts === ['true'] - ) { - return self::getDefinitelyEvaluatedExpressionInsideIf($stmt->left); - } - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) { - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalOr - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalXor - ) { - return self::getDefinitelyEvaluatedExpressionInsideIf($stmt->left); - } - - return $stmt; - } - - if ($stmt instanceof PhpParser\Node\Expr\BooleanNot) { - $inner_stmt = self::getDefinitelyEvaluatedExpressionAfterIf($stmt->expr); - - if ($inner_stmt !== $stmt->expr) { - return $inner_stmt; - } - } - - return $stmt; - } - - public static function handleParadoxicalCondition( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $stmt, - bool $emit_redundant_with_assignation = false - ): void { - $type = $statements_analyzer->node_data->getType($stmt); - - if ($type !== null) { - if ($type->isAlwaysFalsy()) { - if ($type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - 'Operand of type ' . $type->getId() . ' is always false', - new CodeLocation($statements_analyzer, $stmt), - 'false falsy' - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - 'Operand of type ' . $type->getId() . ' is always false', - new CodeLocation($statements_analyzer, $stmt), - 'false falsy' - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } elseif ($type->isAlwaysTruthy() && - (!$stmt instanceof PhpParser\Node\Expr\Assign || $emit_redundant_with_assignation) - ) { - if ($type->from_docblock) { - IssueBuffer::maybeAdd( - new RedundantConditionGivenDocblockType( - 'Operand of type ' . $type->getId() . ' is always true', - new CodeLocation($statements_analyzer, $stmt), - 'true falsy' - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RedundantCondition( - 'Operand of type ' . $type->getId() . ' is always true', - new CodeLocation($statements_analyzer, $stmt), - 'true falsy' - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php deleted file mode 100644 index f2071b32..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php +++ /dev/null @@ -1,242 +0,0 @@ -getCodebase(); - - if (!$else && !$if_scope->negated_clauses && !$else_context->clauses) { - $if_scope->final_actions = array_merge([ScopeAnalyzer::ACTION_NONE], $if_scope->final_actions); - $if_scope->assigned_var_ids = []; - $if_scope->new_vars = []; - $if_scope->redefined_vars = []; - $if_scope->reasonable_clauses = []; - - return null; - } - - $else_context->clauses = Algebra::simplifyCNF( - array_merge( - $else_context->clauses, - $if_scope->negated_clauses - ) - ); - - $else_types = Algebra::getTruthsFromFormula($else_context->clauses); - - if (!$else && !$else_types) { - $if_scope->final_actions = array_merge([ScopeAnalyzer::ACTION_NONE], $if_scope->final_actions); - $if_scope->assigned_var_ids = []; - $if_scope->new_vars = []; - $if_scope->redefined_vars = []; - $if_scope->reasonable_clauses = []; - - return null; - } - - $original_context = clone $else_context; - - if ($else_types) { - $changed_var_ids = []; - - $else_vars_reconciled = Reconciler::reconcileKeyedTypes( - $else_types, - [], - $else_context->vars_in_scope, - $changed_var_ids, - [], - $statements_analyzer, - $statements_analyzer->getTemplateTypeMap() ?: [], - $else_context->inside_loop, - $else - ? new CodeLocation($statements_analyzer->getSource(), $else, $outer_context->include_location) - : null - ); - - $else_context->vars_in_scope = $else_vars_reconciled; - - $else_context->clauses = Context::removeReconciledClauses($else_context->clauses, $changed_var_ids)[0]; - - foreach ($changed_var_ids as $changed_var_id => $_) { - foreach ($else_context->vars_in_scope as $var_id => $_) { - if (preg_match('/' . preg_quote($changed_var_id, '/') . '[\]\[\-]/', $var_id) - && !array_key_exists($var_id, $changed_var_ids) - ) { - unset($else_context->vars_in_scope[$var_id]); - } - } - } - } - - $old_else_context = clone $else_context; - - $pre_stmts_assigned_var_ids = $else_context->assigned_var_ids; - $else_context->assigned_var_ids = []; - - $pre_possibly_assigned_var_ids = $else_context->possibly_assigned_var_ids; - $else_context->possibly_assigned_var_ids = []; - - if ($else) { - if ($statements_analyzer->analyze( - $else->stmts, - $else_context - ) === false - ) { - return false; - } - } - - /** @var array */ - $new_assigned_var_ids = $else_context->assigned_var_ids; - $else_context->assigned_var_ids = $pre_stmts_assigned_var_ids; - - /** @var array */ - $new_possibly_assigned_var_ids = $else_context->possibly_assigned_var_ids; - $else_context->possibly_assigned_var_ids = $pre_possibly_assigned_var_ids + $new_possibly_assigned_var_ids; - - if ($else) { - foreach ($else_context->byref_constraints as $var_id => $byref_constraint) { - if (isset($outer_context->byref_constraints[$var_id]) - && ($outer_constraint_type = $outer_context->byref_constraints[$var_id]->type) - && $byref_constraint->type - && !UnionTypeComparator::isContainedBy( - $codebase, - $byref_constraint->type, - $outer_constraint_type - ) - ) { - IssueBuffer::maybeAdd( - new ConflictingReferenceConstraint( - 'There is more than one pass-by-reference constraint on ' . $var_id, - new CodeLocation($statements_analyzer, $else, $outer_context->include_location, true) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - $outer_context->byref_constraints[$var_id] = $byref_constraint; - } - } - } - - $final_actions = $else - ? ScopeAnalyzer::getControlActions( - $else->stmts, - $statements_analyzer->node_data, - $codebase->config->exit_functions, - [] - ) - : [ScopeAnalyzer::ACTION_NONE]; - // has a return/throw at end - $has_ending_statements = $final_actions === [ScopeAnalyzer::ACTION_END]; - $has_leaving_statements = $has_ending_statements - || (count($final_actions) && !in_array(ScopeAnalyzer::ACTION_NONE, $final_actions, true)); - - $has_break_statement = $final_actions === [ScopeAnalyzer::ACTION_BREAK]; - $has_continue_statement = $final_actions === [ScopeAnalyzer::ACTION_CONTINUE]; - - $if_scope->final_actions = array_merge($final_actions, $if_scope->final_actions); - - // if it doesn't end in a return - if (!$has_leaving_statements) { - IfAnalyzer::updateIfScope( - $codebase, - $if_scope, - $else_context, - $original_context, - $new_assigned_var_ids, - $new_possibly_assigned_var_ids, - [], - (bool) $else - ); - - $if_scope->reasonable_clauses = []; - } - - // update the parent context as necessary - if ($if_scope->negatable_if_types) { - $outer_context->update( - $old_else_context, - $else_context, - $has_leaving_statements, - array_keys($if_scope->negatable_if_types), - $if_scope->updated_vars - ); - } - - if (!$has_ending_statements) { - $vars_possibly_in_scope = array_diff_key( - $else_context->vars_possibly_in_scope, - $outer_context->vars_possibly_in_scope - ); - - $possibly_assigned_var_ids = $new_possibly_assigned_var_ids; - - if ($has_leaving_statements && $else_context->loop_scope) { - if (!$has_continue_statement && !$has_break_statement) { - $if_scope->new_vars_possibly_in_scope = array_merge( - $vars_possibly_in_scope, - $if_scope->new_vars_possibly_in_scope - ); - - $if_scope->possibly_assigned_var_ids = array_merge( - $possibly_assigned_var_ids, - $if_scope->possibly_assigned_var_ids - ); - } - - $else_context->loop_scope->vars_possibly_in_scope = array_merge( - $vars_possibly_in_scope, - $else_context->loop_scope->vars_possibly_in_scope - ); - } elseif (!$has_leaving_statements) { - $if_scope->new_vars_possibly_in_scope = array_merge( - $vars_possibly_in_scope, - $if_scope->new_vars_possibly_in_scope - ); - - $if_scope->possibly_assigned_var_ids = array_merge( - $possibly_assigned_var_ids, - $if_scope->possibly_assigned_var_ids - ); - } - } - - if ($outer_context->collect_exceptions) { - $outer_context->mergeExceptions($else_context); - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php deleted file mode 100644 index 105bf206..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php +++ /dev/null @@ -1,439 +0,0 @@ -cond, - $else_context, - $codebase, - $if_scope, - $branch_point - ); - - $elseif_context = $if_conditional_scope->if_context; - $cond_referenced_var_ids = $if_conditional_scope->cond_referenced_var_ids; - $assigned_in_conditional_var_ids = $if_conditional_scope->assigned_in_conditional_var_ids; - $entry_clauses = $if_conditional_scope->entry_clauses; - } catch (ScopeAnalysisException $e) { - return false; - } - - $mixed_var_ids = []; - - foreach ($elseif_context->vars_in_scope as $var_id => $type) { - if ($type->hasMixed()) { - $mixed_var_ids[] = $var_id; - } - } - - $elseif_cond_id = spl_object_id($elseif->cond); - - $elseif_clauses = FormulaGenerator::getFormula( - $elseif_cond_id, - $elseif_cond_id, - $elseif->cond, - $else_context->self, - $statements_analyzer, - $codebase - ); - - $elseif_clauses = array_map( - /** - * @return Clause - */ - function (Clause $c) use ($mixed_var_ids, $elseif_cond_id): Clause { - $keys = array_keys($c->possibilities); - - $mixed_var_ids = array_diff($mixed_var_ids, $keys); - - foreach ($keys as $key) { - foreach ($mixed_var_ids as $mixed_var_id) { - if (preg_match('/^' . preg_quote($mixed_var_id, '/') . '(\[|-)/', $key)) { - return new Clause([], $elseif_cond_id, $elseif_cond_id, true); - } - } - } - - return $c; - }, - $elseif_clauses - ); - - $entry_clauses = array_map( - /** - * @return Clause - */ - function (Clause $c) use ($assigned_in_conditional_var_ids, $elseif_cond_id): Clause { - $keys = array_keys($c->possibilities); - - foreach ($keys as $key) { - foreach ($assigned_in_conditional_var_ids as $conditional_assigned_var_id => $_) { - if (preg_match('/^' . preg_quote($conditional_assigned_var_id, '/') . '(\[|-|$)/', $key)) { - return new Clause([], $elseif_cond_id, $elseif_cond_id, true); - } - } - } - - return $c; - }, - $entry_clauses - ); - - // this will see whether any of the clauses in set A conflict with the clauses in set B - AlgebraAnalyzer::checkForParadox( - $entry_clauses, - $elseif_clauses, - $statements_analyzer, - $elseif->cond, - $assigned_in_conditional_var_ids - ); - - $elseif_context_clauses = array_merge($entry_clauses, $elseif_clauses); - - if ($elseif_context->reconciled_expression_clauses) { - $reconciled_expression_clauses = $elseif_context->reconciled_expression_clauses; - - $elseif_context_clauses = array_values( - array_filter( - $elseif_context_clauses, - function ($c) use ($reconciled_expression_clauses): bool { - return !in_array($c->hash, $reconciled_expression_clauses); - } - ) - ); - } - - $elseif_context->clauses = Algebra::simplifyCNF($elseif_context_clauses); - - $active_elseif_types = []; - - try { - if (array_filter( - $entry_clauses, - function ($clause): bool { - return (bool)$clause->possibilities; - } - )) { - $omit_keys = array_reduce( - $entry_clauses, - /** - * @param array $carry - * @return array - */ - function (array $carry, Clause $clause): array { - return array_merge($carry, array_keys($clause->possibilities)); - }, - [] - ); - - $omit_keys = array_combine($omit_keys, $omit_keys); - $omit_keys = array_diff_key($omit_keys, Algebra::getTruthsFromFormula($entry_clauses)); - - $cond_referenced_var_ids = array_diff_key( - $cond_referenced_var_ids, - $omit_keys - ); - } - $reconcilable_elseif_types = Algebra::getTruthsFromFormula( - $elseif_context->clauses, - spl_object_id($elseif->cond), - $cond_referenced_var_ids, - $active_elseif_types - ); - $negated_elseif_types = Algebra::getTruthsFromFormula( - Algebra::negateFormula($elseif_clauses) - ); - } catch (ComplicatedExpressionException $e) { - $reconcilable_elseif_types = []; - $negated_elseif_types = []; - } - - $all_negated_vars = array_unique( - array_merge( - array_keys($negated_elseif_types), - array_keys($if_scope->negated_types) - ) - ); - - foreach ($all_negated_vars as $var_id) { - if (isset($negated_elseif_types[$var_id])) { - if (isset($if_scope->negated_types[$var_id])) { - $if_scope->negated_types[$var_id] = array_merge( - $if_scope->negated_types[$var_id], - $negated_elseif_types[$var_id] - ); - } else { - $if_scope->negated_types[$var_id] = $negated_elseif_types[$var_id]; - } - } - } - - $newly_reconciled_var_ids = []; - - // if the elseif has an || in the conditional, we cannot easily reason about it - if ($reconcilable_elseif_types) { - $elseif_vars_reconciled = Reconciler::reconcileKeyedTypes( - $reconcilable_elseif_types, - $active_elseif_types, - $elseif_context->vars_in_scope, - $newly_reconciled_var_ids, - $cond_referenced_var_ids, - $statements_analyzer, - $statements_analyzer->getTemplateTypeMap() ?: [], - $elseif_context->inside_loop, - new CodeLocation( - $statements_analyzer->getSource(), - $elseif->cond instanceof PhpParser\Node\Expr\BooleanNot - ? $elseif->cond->expr - : $elseif->cond, - $outer_context->include_location - ) - ); - - $elseif_context->vars_in_scope = $elseif_vars_reconciled; - - if ($newly_reconciled_var_ids) { - $elseif_context->clauses = Context::removeReconciledClauses( - $elseif_context->clauses, - $newly_reconciled_var_ids - )[0]; - - foreach ($newly_reconciled_var_ids as $changed_var_id => $_) { - foreach ($elseif_context->vars_in_scope as $var_id => $_) { - if (preg_match('/' . preg_quote($changed_var_id, '/') . '[\]\[\-]/', $var_id) - && !array_key_exists($var_id, $newly_reconciled_var_ids) - && !array_key_exists($var_id, $cond_referenced_var_ids) - ) { - unset($elseif_context->vars_in_scope[$var_id]); - } - } - } - } - } - - $pre_stmts_assigned_var_ids = $elseif_context->assigned_var_ids; - $elseif_context->assigned_var_ids = []; - $pre_stmts_possibly_assigned_var_ids = $elseif_context->possibly_assigned_var_ids; - $elseif_context->possibly_assigned_var_ids = []; - - if ($statements_analyzer->analyze( - $elseif->stmts, - $elseif_context - ) === false - ) { - return false; - } - - /** @var array */ - $new_stmts_assigned_var_ids = $elseif_context->assigned_var_ids; - $elseif_context->assigned_var_ids = $pre_stmts_assigned_var_ids + $new_stmts_assigned_var_ids; - - /** @var array */ - $new_stmts_possibly_assigned_var_ids = $elseif_context->possibly_assigned_var_ids; - $elseif_context->possibly_assigned_var_ids = - $pre_stmts_possibly_assigned_var_ids + $new_stmts_possibly_assigned_var_ids; - - foreach ($elseif_context->byref_constraints as $var_id => $byref_constraint) { - if (isset($outer_context->byref_constraints[$var_id]) - && ($outer_constraint_type = $outer_context->byref_constraints[$var_id]->type) - && $byref_constraint->type - && !UnionTypeComparator::isContainedBy( - $codebase, - $byref_constraint->type, - $outer_constraint_type - ) - ) { - IssueBuffer::maybeAdd( - new ConflictingReferenceConstraint( - 'There is more than one pass-by-reference constraint on ' . $var_id, - new CodeLocation($statements_analyzer, $elseif, $outer_context->include_location, true) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - $outer_context->byref_constraints[$var_id] = $byref_constraint; - } - } - - $final_actions = ScopeAnalyzer::getControlActions( - $elseif->stmts, - $statements_analyzer->node_data, - $codebase->config->exit_functions, - [] - ); - // has a return/throw at end - $has_ending_statements = $final_actions === [ScopeAnalyzer::ACTION_END]; - $has_leaving_statements = $has_ending_statements - || (count($final_actions) && !in_array(ScopeAnalyzer::ACTION_NONE, $final_actions, true)); - - $has_break_statement = $final_actions === [ScopeAnalyzer::ACTION_BREAK]; - $has_continue_statement = $final_actions === [ScopeAnalyzer::ACTION_CONTINUE]; - - $if_scope->final_actions = array_merge($final_actions, $if_scope->final_actions); - - // update the parent context as necessary - if (!$has_leaving_statements) { - IfAnalyzer::updateIfScope( - $codebase, - $if_scope, - $elseif_context, - $outer_context, - array_merge($new_stmts_assigned_var_ids, $assigned_in_conditional_var_ids), - $new_stmts_possibly_assigned_var_ids, - $newly_reconciled_var_ids - ); - - $reasonable_clause_count = count($if_scope->reasonable_clauses); - - if ($reasonable_clause_count && $reasonable_clause_count < 20000 && $elseif_clauses) { - $if_scope->reasonable_clauses = Algebra::combineOredClauses( - $if_scope->reasonable_clauses, - $elseif_clauses, - $elseif_cond_id - ); - } else { - $if_scope->reasonable_clauses = []; - } - } else { - $if_scope->reasonable_clauses = []; - } - - if ($negated_elseif_types) { - if ($has_leaving_statements) { - $newly_reconciled_var_ids = []; - - $leaving_vars_reconciled = Reconciler::reconcileKeyedTypes( - $negated_elseif_types, - [], - $pre_conditional_context->vars_in_scope, - $newly_reconciled_var_ids, - [], - $statements_analyzer, - $statements_analyzer->getTemplateTypeMap() ?: [], - $elseif_context->inside_loop, - new CodeLocation($statements_analyzer->getSource(), $elseif, $outer_context->include_location) - ); - - $implied_outer_context = clone $elseif_context; - $implied_outer_context->vars_in_scope = $leaving_vars_reconciled; - - $updated_vars = []; - - $outer_context->update( - $elseif_context, - $implied_outer_context, - false, - array_keys($negated_elseif_types), - $updated_vars - ); - } - } - - if (!$has_ending_statements) { - $vars_possibly_in_scope = array_diff_key( - $elseif_context->vars_possibly_in_scope, - $outer_context->vars_possibly_in_scope - ); - - $possibly_assigned_var_ids = $new_stmts_possibly_assigned_var_ids; - - if ($has_leaving_statements && $elseif_context->loop_scope) { - if (!$has_continue_statement && !$has_break_statement) { - $if_scope->new_vars_possibly_in_scope = array_merge( - $vars_possibly_in_scope, - $if_scope->new_vars_possibly_in_scope - ); - $if_scope->possibly_assigned_var_ids = array_merge( - $possibly_assigned_var_ids, - $if_scope->possibly_assigned_var_ids - ); - } - - $elseif_context->loop_scope->vars_possibly_in_scope = array_merge( - $vars_possibly_in_scope, - $elseif_context->loop_scope->vars_possibly_in_scope - ); - } elseif (!$has_leaving_statements) { - $if_scope->new_vars_possibly_in_scope = array_merge( - $vars_possibly_in_scope, - $if_scope->new_vars_possibly_in_scope - ); - $if_scope->possibly_assigned_var_ids = array_merge( - $possibly_assigned_var_ids, - $if_scope->possibly_assigned_var_ids - ); - } - } - - if ($outer_context->collect_exceptions) { - $outer_context->mergeExceptions($elseif_context); - } - - try { - $if_scope->negated_clauses = Algebra::simplifyCNF( - array_merge( - $if_scope->negated_clauses, - Algebra::negateFormula($elseif_clauses) - ) - ); - } catch (ComplicatedExpressionException $e) { - $if_scope->negated_clauses = []; - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php deleted file mode 100644 index 005a2722..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php +++ /dev/null @@ -1,532 +0,0 @@ - $pre_assignment_else_redefined_vars - * - * @return false|null - */ - public static function analyze( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Stmt\If_ $stmt, - IfScope $if_scope, - IfConditionalScope $if_conditional_scope, - Context $if_context, - Context $old_if_context, - Context $outer_context, - array $pre_assignment_else_redefined_vars - ): ?bool { - $codebase = $statements_analyzer->getCodebase(); - - $if_context->parent_context = $outer_context; - - $assigned_var_ids = $if_context->assigned_var_ids; - $possibly_assigned_var_ids = $if_context->possibly_assigned_var_ids; - $if_context->assigned_var_ids = []; - $if_context->possibly_assigned_var_ids = []; - - if ($statements_analyzer->analyze( - $stmt->stmts, - $if_context - ) === false - ) { - return false; - } - - $final_actions = ScopeAnalyzer::getControlActions( - $stmt->stmts, - $statements_analyzer->node_data, - $codebase->config->exit_functions, - [] - ); - - $has_ending_statements = $final_actions === [ScopeAnalyzer::ACTION_END]; - - $has_leaving_statements = $has_ending_statements - || (count($final_actions) && !in_array(ScopeAnalyzer::ACTION_NONE, $final_actions, true)); - - $has_break_statement = $final_actions === [ScopeAnalyzer::ACTION_BREAK]; - $has_continue_statement = $final_actions === [ScopeAnalyzer::ACTION_CONTINUE]; - - $if_scope->final_actions = $final_actions; - - /** @var array */ - $new_assigned_var_ids = $if_context->assigned_var_ids; - /** @var array */ - $new_possibly_assigned_var_ids = $if_context->possibly_assigned_var_ids; - - $if_context->assigned_var_ids = array_merge($assigned_var_ids, $new_assigned_var_ids); - $if_context->possibly_assigned_var_ids = array_merge( - $possibly_assigned_var_ids, - $new_possibly_assigned_var_ids - ); - - foreach ($if_context->byref_constraints as $var_id => $byref_constraint) { - if (isset($outer_context->byref_constraints[$var_id]) - && $byref_constraint->type - && ($outer_constraint_type = $outer_context->byref_constraints[$var_id]->type) - && !UnionTypeComparator::isContainedBy( - $codebase, - $byref_constraint->type, - $outer_constraint_type - ) - ) { - IssueBuffer::maybeAdd( - new ConflictingReferenceConstraint( - 'There is more than one pass-by-reference constraint on ' . $var_id - . ' between ' . $byref_constraint->type->getId() - . ' and ' . $outer_constraint_type->getId(), - new CodeLocation($statements_analyzer, $stmt, $outer_context->include_location, true) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - $outer_context->byref_constraints[$var_id] = $byref_constraint; - } - } - - $mic_drop = false; - - if (!$has_leaving_statements) { - self::updateIfScope( - $codebase, - $if_scope, - $if_context, - $outer_context, - $new_assigned_var_ids, - $new_possibly_assigned_var_ids, - $if_scope->if_cond_changed_var_ids - ); - - if ($if_scope->reasonable_clauses) { - // remove all reasonable clauses that would be negated by the if stmts - foreach ($new_assigned_var_ids as $var_id => $_) { - $if_scope->reasonable_clauses = Context::filterClauses( - $var_id, - $if_scope->reasonable_clauses, - $if_context->vars_in_scope[$var_id] ?? null, - $statements_analyzer - ); - } - } - } else { - if (!$has_break_statement) { - $if_scope->reasonable_clauses = []; - - // If we're assigning inside - if ($if_conditional_scope->assigned_in_conditional_var_ids - && $if_scope->post_leaving_if_context - ) { - self::addConditionallyAssignedVarsToContext( - $statements_analyzer, - $stmt->cond, - $if_scope->post_leaving_if_context, - $outer_context, - $if_conditional_scope->assigned_in_conditional_var_ids - ); - } - - if (!$stmt->else && !$stmt->elseifs) { - $mic_drop = self::handleMicDrop( - $statements_analyzer, - $stmt->cond, - $if_scope, - $outer_context, - $new_assigned_var_ids - ); - - $outer_context->clauses = Algebra::simplifyCNF( - array_merge($outer_context->clauses, $if_scope->negated_clauses) - ); - } - } - } - - // update the parent context as necessary, but only if we can safely reason about type negation. - // We only update vars that changed both at the start of the if block and then again by an assignment - // in the if statement. - if ($if_scope->negated_types && !$mic_drop) { - $vars_to_update = array_intersect( - array_keys($pre_assignment_else_redefined_vars), - array_keys($if_scope->negated_types) - ); - - $extra_vars_to_update = []; - - // if there's an object-like array in there, we also need to update the root array variable - foreach ($vars_to_update as $var_id) { - $bracked_pos = strpos($var_id, '['); - if ($bracked_pos !== false) { - $extra_vars_to_update[] = substr($var_id, 0, $bracked_pos); - } - } - - if ($extra_vars_to_update) { - $vars_to_update = array_unique(array_merge($extra_vars_to_update, $vars_to_update)); - } - - //update $if_context vars to include the pre-assignment else vars - if (!$stmt->else && !$has_leaving_statements) { - foreach ($pre_assignment_else_redefined_vars as $var_id => $type) { - if (isset($if_context->vars_in_scope[$var_id])) { - $if_context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $if_context->vars_in_scope[$var_id], - $type, - $codebase - ); - } - } - } - - $outer_context->update( - $old_if_context, - $if_context, - $has_leaving_statements, - $vars_to_update, - $if_scope->updated_vars - ); - } - - if (!$has_ending_statements) { - $vars_possibly_in_scope = array_diff_key( - $if_context->vars_possibly_in_scope, - $outer_context->vars_possibly_in_scope - ); - - if ($if_context->loop_scope) { - if (!$has_continue_statement && !$has_break_statement) { - $if_scope->new_vars_possibly_in_scope = $vars_possibly_in_scope; - } - - $if_context->loop_scope->vars_possibly_in_scope = array_merge( - $vars_possibly_in_scope, - $if_context->loop_scope->vars_possibly_in_scope - ); - } elseif (!$has_leaving_statements) { - $if_scope->new_vars_possibly_in_scope = $vars_possibly_in_scope; - } - } - - if ($outer_context->collect_exceptions) { - $outer_context->mergeExceptions($if_context); - } - - return null; - } - - /** - * This handles the situation when returning inside an - * if block with no else or elseifs - * - * @param array $new_assigned_var_ids - */ - private static function handleMicDrop( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $cond, - IfScope $if_scope, - Context $post_if_context, - array $new_assigned_var_ids - ): bool { - if (!$if_scope->negated_types) { - return false; - } - - $newly_reconciled_var_ids = []; - - $post_if_context_vars_reconciled = Reconciler::reconcileKeyedTypes( - $if_scope->negated_types, - [], - $post_if_context->vars_in_scope, - $newly_reconciled_var_ids, - [], - $statements_analyzer, - $statements_analyzer->getTemplateTypeMap() ?: [], - $post_if_context->inside_loop, - new CodeLocation( - $statements_analyzer->getSource(), - $cond instanceof PhpParser\Node\Expr\BooleanNot - ? $cond->expr - : $cond, - $post_if_context->include_location, - false - ) - ); - - foreach ($newly_reconciled_var_ids as $changed_var_id => $_) { - $post_if_context->removeVarFromConflictingClauses($changed_var_id); - } - - $newly_reconciled_var_ids += $new_assigned_var_ids; - - foreach ($newly_reconciled_var_ids as $var_id => $_) { - $if_scope->negated_clauses = Context::filterClauses( - $var_id, - $if_scope->negated_clauses - ); - } - - foreach ($newly_reconciled_var_ids as $var_id => $_) { - $first_appearance = $statements_analyzer->getFirstAppearance($var_id); - - if ($first_appearance - && isset($post_if_context->vars_in_scope[$var_id]) - && isset($post_if_context_vars_reconciled[$var_id]) - && $post_if_context->vars_in_scope[$var_id]->hasMixed() - && !$post_if_context_vars_reconciled[$var_id]->hasMixed() - ) { - if (!$post_if_context->collect_initializations - && !$post_if_context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - ) { - $parent_source = $statements_analyzer->getSource(); - - $functionlike_storage = $parent_source instanceof FunctionLikeAnalyzer - ? $parent_source->getFunctionLikeStorage($statements_analyzer) - : null; - - if (!$functionlike_storage - || (!$parent_source->getSource() instanceof TraitAnalyzer - && !isset($functionlike_storage->param_lookup[substr($var_id, 1)])) - ) { - $codebase = $statements_analyzer->getCodebase(); - $codebase->analyzer->decrementMixedCount($statements_analyzer->getFilePath()); - } - } - - IssueBuffer::remove( - $statements_analyzer->getFilePath(), - 'MixedAssignment', - $first_appearance->raw_file_start - ); - } - } - - $post_if_context->vars_in_scope = $post_if_context_vars_reconciled; - - return true; - } - - /** - * @param array $assigned_in_conditional_var_ids - */ - public static function addConditionallyAssignedVarsToContext( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $cond, - Context $post_leaving_if_context, - Context $post_if_context, - array $assigned_in_conditional_var_ids - ): void { - // this filters out coercions to expected types in ArgumentAnalyzer - $assigned_in_conditional_var_ids = array_filter($assigned_in_conditional_var_ids); - - if (!$assigned_in_conditional_var_ids) { - return; - } - - $exprs = self::getDefinitelyEvaluatedOredExpressions($cond); - - // if there was no assignment in the first expression it's safe to proceed - $old_node_data = $statements_analyzer->node_data; - $statements_analyzer->node_data = clone $old_node_data; - - IssueBuffer::startRecording(); - - foreach ($exprs as $expr) { - if ($expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd) { - $fake_not = new VirtualBooleanOr( - self::negateExpr($expr->left), - self::negateExpr($expr->right), - $expr->getAttributes() - ); - } else { - $fake_not = self::negateExpr($expr); - } - - $fake_negated_expr = new VirtualFuncCall( - new VirtualFullyQualified('assert'), - [new VirtualArg( - $fake_not, - false, - false, - $expr->getAttributes() - )], - $expr->getAttributes() - ); - - $post_leaving_if_context->inside_negation = !$post_leaving_if_context->inside_negation; - - ExpressionAnalyzer::analyze( - $statements_analyzer, - $fake_negated_expr, - $post_leaving_if_context - ); - - $post_leaving_if_context->inside_negation = !$post_leaving_if_context->inside_negation; - } - - IssueBuffer::clearRecordingLevel(); - IssueBuffer::stopRecording(); - - $statements_analyzer->node_data = $old_node_data; - - foreach ($assigned_in_conditional_var_ids as $var_id => $_) { - if (isset($post_leaving_if_context->vars_in_scope[$var_id])) { - $post_if_context->vars_in_scope[$var_id] = clone $post_leaving_if_context->vars_in_scope[$var_id]; - } - } - } - - /** - * Returns all expressions inside an ored expression - * @return non-empty-list - */ - private static function getDefinitelyEvaluatedOredExpressions(PhpParser\Node\Expr $stmt): array - { - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalOr - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalXor - ) { - return array_merge( - self::getDefinitelyEvaluatedOredExpressions($stmt->left), - self::getDefinitelyEvaluatedOredExpressions($stmt->right) - ); - } - - return [$stmt]; - } - - private static function negateExpr(PhpParser\Node\Expr $expr): PhpParser\Node\Expr - { - if ($expr instanceof PhpParser\Node\Expr\BooleanNot) { - return $expr->expr; - } - - return new VirtualBooleanNot($expr, $expr->getAttributes()); - } - - /** - * @param array $assigned_var_ids - * @param array $possibly_assigned_var_ids - * @param array $newly_reconciled_var_ids - */ - public static function updateIfScope( - Codebase $codebase, - IfScope $if_scope, - Context $if_context, - Context $outer_context, - array $assigned_var_ids, - array $possibly_assigned_var_ids, - array $newly_reconciled_var_ids, - bool $update_new_vars = true - ): void { - $redefined_vars = $if_context->getRedefinedVars($outer_context->vars_in_scope); - - if ($if_scope->new_vars === null) { - if ($update_new_vars) { - $if_scope->new_vars = array_diff_key($if_context->vars_in_scope, $outer_context->vars_in_scope); - } - } else { - foreach ($if_scope->new_vars as $new_var => $type) { - if (!$if_context->hasVariable($new_var)) { - unset($if_scope->new_vars[$new_var]); - } else { - $if_scope->new_vars[$new_var] = Type::combineUnionTypes( - $type, - $if_context->vars_in_scope[$new_var], - $codebase - ); - } - } - } - - $possibly_redefined_vars = $redefined_vars; - - foreach ($possibly_redefined_vars as $var_id => $_) { - if (!isset($possibly_assigned_var_ids[$var_id]) - && isset($newly_reconciled_var_ids[$var_id]) - ) { - unset($possibly_redefined_vars[$var_id]); - } - } - - if ($if_scope->assigned_var_ids === null) { - $if_scope->assigned_var_ids = $assigned_var_ids; - } else { - $if_scope->assigned_var_ids = array_intersect_key($assigned_var_ids, $if_scope->assigned_var_ids); - } - - $if_scope->possibly_assigned_var_ids += $possibly_assigned_var_ids; - - if ($if_scope->redefined_vars === null) { - $if_scope->redefined_vars = $redefined_vars; - $if_scope->possibly_redefined_vars = $possibly_redefined_vars; - } else { - foreach ($if_scope->redefined_vars as $redefined_var => $type) { - if (!isset($redefined_vars[$redefined_var])) { - unset($if_scope->redefined_vars[$redefined_var]); - } else { - $if_scope->redefined_vars[$redefined_var] = Type::combineUnionTypes( - $redefined_vars[$redefined_var], - $type, - $codebase - ); - - if (isset($outer_context->vars_in_scope[$redefined_var]) - && $if_scope->redefined_vars[$redefined_var]->equals( - $outer_context->vars_in_scope[$redefined_var] - ) - ) { - unset($if_scope->redefined_vars[$redefined_var]); - } - } - } - - foreach ($possibly_redefined_vars as $var => $type) { - $if_scope->possibly_redefined_vars[$var] = Type::combineUnionTypes( - $type, - $if_scope->possibly_redefined_vars[$var] ?? null, - $codebase - ); - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php deleted file mode 100644 index 1f9dcc35..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php +++ /dev/null @@ -1,509 +0,0 @@ -getCodebase(); - - $if_scope = new IfScope(); - - // We need to clone the original context for later use if we're exiting in this if conditional - if ($stmt->cond instanceof PhpParser\Node\Expr\BinaryOp - || ($stmt->cond instanceof PhpParser\Node\Expr\BooleanNot - && $stmt->cond->expr instanceof PhpParser\Node\Expr\BinaryOp) - ) { - $final_actions = ScopeAnalyzer::getControlActions( - $stmt->stmts, - null, - $codebase->config->exit_functions, - [] - ); - - $has_leaving_statements = $final_actions === [ScopeAnalyzer::ACTION_END] - || (count($final_actions) && !in_array(ScopeAnalyzer::ACTION_NONE, $final_actions, true)); - - if ($has_leaving_statements) { - $if_scope->post_leaving_if_context = clone $context; - } - } - - try { - $if_conditional_scope = IfConditionalAnalyzer::analyze( - $statements_analyzer, - $stmt->cond, - $context, - $codebase, - $if_scope, - $context->branch_point ?: (int) $stmt->getAttribute('startFilePos') - ); - - $if_context = $if_conditional_scope->if_context; - - $post_if_context = $if_conditional_scope->post_if_context; - $cond_referenced_var_ids = $if_conditional_scope->cond_referenced_var_ids; - $assigned_in_conditional_var_ids = $if_conditional_scope->assigned_in_conditional_var_ids; - } catch (ScopeAnalysisException $e) { - return false; - } - - $mixed_var_ids = []; - - foreach ($if_context->vars_in_scope as $var_id => $type) { - if ($type->isMixed() && isset($context->vars_in_scope[$var_id])) { - $mixed_var_ids[] = $var_id; - } - } - - $cond_object_id = spl_object_id($stmt->cond); - - $if_clauses = FormulaGenerator::getFormula( - $cond_object_id, - $cond_object_id, - $stmt->cond, - $context->self, - $statements_analyzer, - $codebase - ); - - if (count($if_clauses) > 200) { - $if_clauses = []; - } - - $if_clauses = array_map( - /** - * @return Clause - */ - function (Clause $c) use ($mixed_var_ids, $cond_object_id): Clause { - $keys = array_keys($c->possibilities); - - $mixed_var_ids = array_diff($mixed_var_ids, $keys); - - foreach ($keys as $key) { - foreach ($mixed_var_ids as $mixed_var_id) { - if (preg_match('/^' . preg_quote($mixed_var_id, '/') . '(\[|-)/', $key)) { - return new Clause([], $cond_object_id, $cond_object_id, true); - } - } - } - - return $c; - }, - $if_clauses - ); - - $entry_clauses = $context->clauses; - - // this will see whether any of the clauses in set A conflict with the clauses in set B - AlgebraAnalyzer::checkForParadox( - $context->clauses, - $if_clauses, - $statements_analyzer, - $stmt->cond, - $assigned_in_conditional_var_ids - ); - - // if we have assignments in the if, we may have duplicate clauses - if ($assigned_in_conditional_var_ids) { - $if_clauses = Algebra::simplifyCNF($if_clauses); - } - - $if_context_clauses = array_merge($entry_clauses, $if_clauses); - - $if_context->clauses = Algebra::simplifyCNF($if_context_clauses); - - if ($if_context->reconciled_expression_clauses) { - $reconciled_expression_clauses = $if_context->reconciled_expression_clauses; - - $if_context->clauses = array_values( - array_filter( - $if_context->clauses, - function ($c) use ($reconciled_expression_clauses): bool { - return !in_array($c->hash, $reconciled_expression_clauses); - } - ) - ); - - if (count($if_context->clauses) === 1 - && $if_context->clauses[0]->wedge - && !$if_context->clauses[0]->possibilities - ) { - $if_context->clauses = []; - $if_context->reconciled_expression_clauses = []; - } - } - - // define this before we alter local clauses after reconciliation - $if_scope->reasonable_clauses = $if_context->clauses; - - try { - $if_scope->negated_clauses = Algebra::negateFormula($if_clauses); - } catch (ComplicatedExpressionException $e) { - try { - $if_scope->negated_clauses = FormulaGenerator::getFormula( - $cond_object_id, - $cond_object_id, - new VirtualBooleanNot($stmt->cond), - $context->self, - $statements_analyzer, - $codebase, - false - ); - } catch (ComplicatedExpressionException $e) { - $if_scope->negated_clauses = []; - } - } - - $if_scope->negated_types = Algebra::getTruthsFromFormula( - Algebra::simplifyCNF( - array_merge($context->clauses, $if_scope->negated_clauses) - ) - ); - - $active_if_types = []; - - $reconcilable_if_types = Algebra::getTruthsFromFormula( - $if_context->clauses, - spl_object_id($stmt->cond), - $cond_referenced_var_ids, - $active_if_types - ); - - if (array_filter( - $context->clauses, - function ($clause): bool { - return (bool)$clause->possibilities; - } - )) { - $omit_keys = array_reduce( - $context->clauses, - /** - * @param array $carry - * @return array - */ - function (array $carry, Clause $clause): array { - return array_merge($carry, array_keys($clause->possibilities)); - }, - [] - ); - - $omit_keys = array_combine($omit_keys, $omit_keys); - $omit_keys = array_diff_key($omit_keys, Algebra::getTruthsFromFormula($context->clauses)); - - $cond_referenced_var_ids = array_diff_key( - $cond_referenced_var_ids, - $omit_keys - ); - } - - // if the if has an || in the conditional, we cannot easily reason about it - if ($reconcilable_if_types) { - $changed_var_ids = []; - - $if_vars_in_scope_reconciled = - Reconciler::reconcileKeyedTypes( - $reconcilable_if_types, - $active_if_types, - $if_context->vars_in_scope, - $changed_var_ids, - $cond_referenced_var_ids, - $statements_analyzer, - $statements_analyzer->getTemplateTypeMap() ?: [], - $if_context->inside_loop, - $context->check_variables - ? new CodeLocation( - $statements_analyzer->getSource(), - $stmt->cond instanceof PhpParser\Node\Expr\BooleanNot - ? $stmt->cond->expr - : $stmt->cond, - $context->include_location - ) : null - ); - - $if_context->vars_in_scope = $if_vars_in_scope_reconciled; - - foreach ($reconcilable_if_types as $var_id => $_) { - $if_context->vars_possibly_in_scope[$var_id] = true; - } - - if ($changed_var_ids) { - $if_context->clauses = Context::removeReconciledClauses($if_context->clauses, $changed_var_ids)[0]; - - foreach ($changed_var_ids as $changed_var_id => $_) { - foreach ($if_context->vars_in_scope as $var_id => $_) { - if (preg_match('/' . preg_quote($changed_var_id, '/') . '[\]\[\-]/', $var_id) - && !array_key_exists($var_id, $changed_var_ids) - && !array_key_exists($var_id, $cond_referenced_var_ids) - ) { - unset($if_context->vars_in_scope[$var_id]); - } - } - } - } - - $if_scope->if_cond_changed_var_ids = $changed_var_ids; - } - - $if_context->reconciled_expression_clauses = []; - - $old_if_context = clone $if_context; - $context->vars_possibly_in_scope = array_merge( - $if_context->vars_possibly_in_scope, - $context->vars_possibly_in_scope - ); - - $context->referenced_var_ids = array_merge( - $if_context->referenced_var_ids, - $context->referenced_var_ids - ); - - $temp_else_context = clone $post_if_context; - - $changed_var_ids = []; - - if ($if_scope->negated_types) { - $else_vars_reconciled = Reconciler::reconcileKeyedTypes( - $if_scope->negated_types, - [], - $temp_else_context->vars_in_scope, - $changed_var_ids, - [], - $statements_analyzer, - $statements_analyzer->getTemplateTypeMap() ?: [], - $context->inside_loop, - $context->check_variables - ? new CodeLocation( - $statements_analyzer->getSource(), - $stmt->cond instanceof PhpParser\Node\Expr\BooleanNot - ? $stmt->cond->expr - : $stmt->cond, - $context->include_location - ) : null - ); - - $temp_else_context->vars_in_scope = $else_vars_reconciled; - } - - // we calculate the vars redefined in a hypothetical else statement to determine - // which vars of the if we can safely change - $pre_assignment_else_redefined_vars = array_intersect_key( - $temp_else_context->getRedefinedVars($context->vars_in_scope, true), - $changed_var_ids - ); - - // check the if - if (IfAnalyzer::analyze( - $statements_analyzer, - $stmt, - $if_scope, - $if_conditional_scope, - $if_context, - $old_if_context, - $context, - $pre_assignment_else_redefined_vars - ) === false) { - return false; - } - - // this has to go on a separate line because the phar compactor messes with precedence - $scope_to_clone = $if_scope->post_leaving_if_context ?? $post_if_context; - $else_context = clone $scope_to_clone; - - // check the elseifs - foreach ($stmt->elseifs as $elseif) { - if (ElseIfAnalyzer::analyze( - $statements_analyzer, - $elseif, - $if_scope, - $else_context, - $context, - $codebase, - $else_context->branch_point ?: (int) $stmt->getAttribute('startFilePos') - ) === false) { - return false; - } - } - - if ($stmt->else) { - if ($codebase->alter_code) { - $else_context->branch_point = - $else_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); - } - } - - if (ElseAnalyzer::analyze( - $statements_analyzer, - $stmt->else, - $if_scope, - $else_context, - $context - ) === false) { - return false; - } - - if ($context->loop_scope) { - $context->loop_scope->final_actions = array_unique( - array_merge( - $context->loop_scope->final_actions, - $if_scope->final_actions - ) - ); - } - - $context->vars_possibly_in_scope = array_merge( - $context->vars_possibly_in_scope, - $if_scope->new_vars_possibly_in_scope - ); - - $context->possibly_assigned_var_ids = array_merge( - $context->possibly_assigned_var_ids, - $if_scope->possibly_assigned_var_ids ?: [] - ); - - // vars can only be defined/redefined if there was an else (defined in every block) - $context->assigned_var_ids = array_merge( - $context->assigned_var_ids, - $if_scope->assigned_var_ids ?: [] - ); - - if ($if_scope->new_vars) { - foreach ($if_scope->new_vars as $var_id => $type) { - if (isset($context->vars_possibly_in_scope[$var_id]) - && $statements_analyzer->data_flow_graph - ) { - $type->parent_nodes += $statements_analyzer->getParentNodesForPossiblyUndefinedVariable($var_id); - } - - $context->vars_in_scope[$var_id] = $type; - } - } - - if ($if_scope->redefined_vars) { - foreach ($if_scope->redefined_vars as $var_id => $type) { - $context->vars_in_scope[$var_id] = $type; - $if_scope->updated_vars[$var_id] = true; - - if ($if_scope->reasonable_clauses) { - $if_scope->reasonable_clauses = Context::filterClauses( - $var_id, - $if_scope->reasonable_clauses, - $context->vars_in_scope[$var_id] ?? null, - $statements_analyzer - ); - } - } - } - - if ($if_scope->reasonable_clauses - && (count($if_scope->reasonable_clauses) > 1 || !$if_scope->reasonable_clauses[0]->wedge) - ) { - $context->clauses = Algebra::simplifyCNF( - array_merge( - $if_scope->reasonable_clauses, - $context->clauses - ) - ); - } - - if ($if_scope->possibly_redefined_vars) { - foreach ($if_scope->possibly_redefined_vars as $var_id => $type) { - if (isset($context->vars_in_scope[$var_id])) { - if (!$type->failed_reconciliation - && !isset($if_scope->updated_vars[$var_id]) - ) { - $combined_type = Type::combineUnionTypes( - $context->vars_in_scope[$var_id], - $type, - $codebase - ); - - if (!$combined_type->equals($context->vars_in_scope[$var_id])) { - $context->removeDescendents($var_id, $combined_type); - } - - $context->vars_in_scope[$var_id] = $combined_type; - } else { - $context->vars_in_scope[$var_id]->parent_nodes += $type->parent_nodes; - } - } - } - } - - $context->possibly_assigned_var_ids += $if_scope->possibly_assigned_var_ids; - - if (!in_array(ScopeAnalyzer::ACTION_NONE, $if_scope->final_actions, true)) { - $context->has_returned = true; - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php deleted file mode 100644 index 1cfd4023..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php +++ /dev/null @@ -1,735 +0,0 @@ - $stmts - * @param PhpParser\Node\Expr[] $pre_conditions - * @param PhpParser\Node\Expr[] $post_expressions - * - * @return false|null - */ - public static function analyze( - StatementsAnalyzer $statements_analyzer, - array $stmts, - array $pre_conditions, - array $post_expressions, - LoopScope $loop_scope, - Context &$inner_context = null, - bool $is_do = false, - bool $always_enters_loop = false - ): ?bool { - $traverser = new PhpParser\NodeTraverser; - - $assignment_mapper = new AssignmentMapVisitor($loop_scope->loop_context->self); - $traverser->addVisitor($assignment_mapper); - - $traverser->traverse(array_merge($pre_conditions, $stmts, $post_expressions)); - - $assignment_map = $assignment_mapper->getAssignmentMap(); - - $assignment_depth = 0; - - $always_assigned_before_loop_body_vars = []; - - $pre_condition_clauses = []; - - $original_protected_var_ids = $loop_scope->loop_parent_context->protected_var_ids; - - $codebase = $statements_analyzer->getCodebase(); - - $inner_do_context = null; - - if ($pre_conditions) { - foreach ($pre_conditions as $i => $pre_condition) { - $pre_condition_id = spl_object_id($pre_condition); - - $pre_condition_clauses[$i] = FormulaGenerator::getFormula( - $pre_condition_id, - $pre_condition_id, - $pre_condition, - $loop_scope->loop_context->self, - $statements_analyzer, - $codebase - ); - } - } else { - $always_assigned_before_loop_body_vars = Context::getNewOrUpdatedVarIds( - $loop_scope->loop_parent_context, - $loop_scope->loop_context - ); - } - - $final_actions = ScopeAnalyzer::getControlActions( - $stmts, - $statements_analyzer->node_data, - Config::getInstance()->exit_functions, - [] - ); - - $does_always_break = $final_actions === [ScopeAnalyzer::ACTION_BREAK]; - - $has_continue = in_array(ScopeAnalyzer::ACTION_CONTINUE, $final_actions, true); - - if ($assignment_map) { - $first_var_id = array_keys($assignment_map)[0]; - - $assignment_depth = self::getAssignmentMapDepth($first_var_id, $assignment_map); - } - - if ($has_continue) { - // this intuitively feels right to me – if there's a continue statement, - // maybe more assignment intrigue is possible - $assignment_depth++; - } - - $loop_scope->loop_context->parent_context = $loop_scope->loop_parent_context; - - $pre_outer_context = $loop_scope->loop_parent_context; - - if ($assignment_depth === 0 || $does_always_break) { - $inner_context = clone $loop_scope->loop_context; - - foreach ($inner_context->vars_in_scope as $context_var_id => $context_type) { - $inner_context->vars_in_scope[$context_var_id] = clone $context_type; - } - - $inner_context->loop_scope = $loop_scope; - - $inner_context->parent_context = $loop_scope->loop_context; - $old_referenced_var_ids = $inner_context->referenced_var_ids; - $inner_context->referenced_var_ids = []; - - foreach ($pre_conditions as $condition_offset => $pre_condition) { - self::applyPreConditionToLoopContext( - $statements_analyzer, - $pre_condition, - $pre_condition_clauses[$condition_offset], - $inner_context, - $loop_scope->loop_parent_context, - $is_do - ); - } - - $inner_context->protected_var_ids = $loop_scope->protected_var_ids; - - $statements_analyzer->analyze($stmts, $inner_context); - self::updateLoopScopeContexts($loop_scope, $loop_scope->loop_parent_context); - - foreach ($post_expressions as $post_expression) { - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $post_expression, - $loop_scope->loop_context - ) === false - ) { - return false; - } - } - - $inner_context->referenced_var_ids = $old_referenced_var_ids + $inner_context->referenced_var_ids; - - $loop_scope->loop_parent_context->vars_possibly_in_scope = array_merge( - $inner_context->vars_possibly_in_scope, - $loop_scope->loop_parent_context->vars_possibly_in_scope - ); - } else { - $pre_outer_context = clone $loop_scope->loop_parent_context; - - $analyzer = $statements_analyzer->getCodebase()->analyzer; - - $original_mixed_counts = $analyzer->getMixedCountsForFile($statements_analyzer->getFilePath()); - - $pre_condition_vars_in_scope = $loop_scope->loop_context->vars_in_scope; - - IssueBuffer::startRecording(); - - if (!$is_do) { - foreach ($pre_conditions as $condition_offset => $pre_condition) { - self::applyPreConditionToLoopContext( - $statements_analyzer, - $pre_condition, - $pre_condition_clauses[$condition_offset], - $loop_scope->loop_context, - $loop_scope->loop_parent_context, - $is_do - ); - } - } - - // record all the vars that existed before we did the first pass through the loop - $pre_loop_context = clone $loop_scope->loop_context; - - $inner_context = clone $loop_scope->loop_context; - - foreach ($inner_context->vars_in_scope as $context_var_id => $context_type) { - $inner_context->vars_in_scope[$context_var_id] = clone $context_type; - } - - $inner_context->parent_context = $loop_scope->loop_context; - $inner_context->loop_scope = $loop_scope; - - $old_referenced_var_ids = $inner_context->referenced_var_ids; - $inner_context->referenced_var_ids = []; - - $inner_context->protected_var_ids = $loop_scope->protected_var_ids; - - $statements_analyzer->analyze($stmts, $inner_context); - - self::updateLoopScopeContexts($loop_scope, $pre_outer_context); - - $inner_context->protected_var_ids = $original_protected_var_ids; - - if ($is_do) { - $inner_do_context = clone $inner_context; - - foreach ($pre_conditions as $condition_offset => $pre_condition) { - $always_assigned_before_loop_body_vars = array_merge( - self::applyPreConditionToLoopContext( - $statements_analyzer, - $pre_condition, - $pre_condition_clauses[$condition_offset], - $inner_context, - $loop_scope->loop_parent_context, - $is_do - ), - $always_assigned_before_loop_body_vars - ); - } - } - - $always_assigned_before_loop_body_vars = array_unique($always_assigned_before_loop_body_vars); - - foreach ($post_expressions as $post_expression) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $post_expression, $inner_context) === false) { - return false; - } - } - - $inner_context->referenced_var_ids = array_intersect_key( - $old_referenced_var_ids, - $inner_context->referenced_var_ids - ); - - $recorded_issues = IssueBuffer::clearRecordingLevel(); - IssueBuffer::stopRecording(); - - for ($i = 0; $i < $assignment_depth; ++$i) { - $vars_to_remove = []; - - $loop_scope->iteration_count++; - - $has_changes = false; - - // reset the $inner_context to what it was before we started the analysis, - // but union the types with what's in the loop scope - - foreach ($inner_context->vars_in_scope as $var_id => $type) { - if (in_array($var_id, $always_assigned_before_loop_body_vars, true)) { - // set the vars to whatever the while/foreach loop expects them to be - if (!isset($pre_loop_context->vars_in_scope[$var_id]) - || !$type->equals($pre_loop_context->vars_in_scope[$var_id]) - ) { - $has_changes = true; - } - } elseif (isset($pre_outer_context->vars_in_scope[$var_id])) { - if (!$type->equals($pre_outer_context->vars_in_scope[$var_id])) { - $has_changes = true; - - // widen the foreach context type with the initial context type - $inner_context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $inner_context->vars_in_scope[$var_id], - $pre_outer_context->vars_in_scope[$var_id] - ); - - // if there's a change, invalidate related clauses - $pre_loop_context->removeVarFromConflictingClauses($var_id); - - $loop_scope->loop_parent_context->possibly_assigned_var_ids[$var_id] = true; - } - - if (isset($loop_scope->loop_context->vars_in_scope[$var_id]) - && !$type->equals($loop_scope->loop_context->vars_in_scope[$var_id]) - ) { - $has_changes = true; - - // widen the foreach context type with the initial context type - $inner_context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $inner_context->vars_in_scope[$var_id], - $loop_scope->loop_context->vars_in_scope[$var_id] - ); - - // if there's a change, invalidate related clauses - $pre_loop_context->removeVarFromConflictingClauses($var_id); - } - } else { - // give an opportunity to redeemed UndefinedVariable issues - if ($recorded_issues) { - $has_changes = true; - } - - // if we're in a do block we don't want to remove vars before evaluating - // the where conditional - if (!$is_do) { - $vars_to_remove[] = $var_id; - } - } - } - - $inner_context->has_returned = false; - - $loop_scope->loop_parent_context->vars_possibly_in_scope = array_merge( - $inner_context->vars_possibly_in_scope, - $loop_scope->loop_parent_context->vars_possibly_in_scope - ); - - // if there are no changes to the types, no need to re-examine - if (!$has_changes) { - break; - } - - // remove vars that were defined in the foreach - foreach ($vars_to_remove as $var_id) { - unset($inner_context->vars_in_scope[$var_id]); - } - - $inner_context->clauses = $pre_loop_context->clauses; - $inner_context->byref_constraints = $pre_loop_context->byref_constraints; - - $analyzer->setMixedCountsForFile($statements_analyzer->getFilePath(), $original_mixed_counts); - IssueBuffer::startRecording(); - - foreach ($pre_loop_context->vars_in_scope as $var_id => $_) { - if (!isset($pre_condition_vars_in_scope[$var_id]) - && isset($inner_context->vars_in_scope[$var_id]) - && strpos($var_id, '->') === false - && strpos($var_id, '[') === false - ) { - $inner_context->vars_in_scope[$var_id]->possibly_undefined = true; - } - } - - if (!$is_do) { - foreach ($pre_conditions as $condition_offset => $pre_condition) { - self::applyPreConditionToLoopContext( - $statements_analyzer, - $pre_condition, - $pre_condition_clauses[$condition_offset], - $inner_context, - $loop_scope->loop_parent_context, - false - ); - } - } - - foreach ($always_assigned_before_loop_body_vars as $var_id) { - if ((!isset($inner_context->vars_in_scope[$var_id]) - || $inner_context->vars_in_scope[$var_id]->getId() - !== $pre_loop_context->vars_in_scope[$var_id]->getId() - || $inner_context->vars_in_scope[$var_id]->from_docblock - !== $pre_loop_context->vars_in_scope[$var_id]->from_docblock - ) - ) { - if (isset($pre_loop_context->vars_in_scope[$var_id])) { - $inner_context->vars_in_scope[$var_id] = clone $pre_loop_context->vars_in_scope[$var_id]; - } else { - unset($inner_context->vars_in_scope[$var_id]); - } - } - } - - $inner_context->clauses = $pre_loop_context->clauses; - - $inner_context->protected_var_ids = $loop_scope->protected_var_ids; - - $traverser = new PhpParser\NodeTraverser; - - $traverser->addVisitor( - new NodeCleanerVisitor( - $statements_analyzer->node_data - ) - ); - $traverser->traverse($stmts); - - $statements_analyzer->analyze($stmts, $inner_context); - - self::updateLoopScopeContexts($loop_scope, $pre_outer_context); - - $inner_context->protected_var_ids = $original_protected_var_ids; - - if ($is_do) { - $inner_do_context = clone $inner_context; - - foreach ($pre_conditions as $condition_offset => $pre_condition) { - self::applyPreConditionToLoopContext( - $statements_analyzer, - $pre_condition, - $pre_condition_clauses[$condition_offset], - $inner_context, - $loop_scope->loop_parent_context, - $is_do - ); - } - } - - foreach ($post_expressions as $post_expression) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $post_expression, $inner_context) === false) { - return false; - } - } - - $recorded_issues = IssueBuffer::clearRecordingLevel(); - - IssueBuffer::stopRecording(); - } - - if ($recorded_issues) { - foreach ($recorded_issues as $recorded_issue) { - // if we're not in any loops then this will just result in the issue being emitted - IssueBuffer::bubbleUp($recorded_issue); - } - } - } - - $does_sometimes_break = in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true); - $does_always_break = $loop_scope->final_actions === [ScopeAnalyzer::ACTION_BREAK]; - - if ($does_sometimes_break) { - if ($loop_scope->possibly_redefined_loop_parent_vars !== null) { - foreach ($loop_scope->possibly_redefined_loop_parent_vars as $var => $type) { - $loop_scope->loop_parent_context->vars_in_scope[$var] = Type::combineUnionTypes( - $type, - $loop_scope->loop_parent_context->vars_in_scope[$var] - ); - - $loop_scope->loop_parent_context->possibly_assigned_var_ids[$var] = true; - } - } - } - - foreach ($loop_scope->loop_parent_context->vars_in_scope as $var_id => $type) { - if (!isset($loop_scope->loop_context->vars_in_scope[$var_id])) { - continue; - } - - if ($loop_scope->loop_context->vars_in_scope[$var_id]->getId() !== $type->getId()) { - $loop_scope->loop_parent_context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $loop_scope->loop_parent_context->vars_in_scope[$var_id], - $loop_scope->loop_context->vars_in_scope[$var_id] - ); - - $loop_scope->loop_parent_context->removeVarFromConflictingClauses($var_id); - } else { - $loop_scope->loop_parent_context->vars_in_scope[$var_id]->parent_nodes - += $loop_scope->loop_context->vars_in_scope[$var_id]->parent_nodes; - } - } - - if (!$does_always_break) { - foreach ($loop_scope->loop_parent_context->vars_in_scope as $var_id => $type) { - if (!isset($inner_context->vars_in_scope[$var_id])) { - unset($loop_scope->loop_parent_context->vars_in_scope[$var_id]); - continue; - } - - if ($inner_context->vars_in_scope[$var_id]->hasMixed()) { - $inner_context->vars_in_scope[$var_id]->parent_nodes - += $loop_scope->loop_parent_context->vars_in_scope[$var_id]->parent_nodes; - - $loop_scope->loop_parent_context->vars_in_scope[$var_id] = - $inner_context->vars_in_scope[$var_id]; - $loop_scope->loop_parent_context->removeVarFromConflictingClauses($var_id); - - continue; - } - - if ($inner_context->vars_in_scope[$var_id]->getId() !== $type->getId()) { - $loop_scope->loop_parent_context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $loop_scope->loop_parent_context->vars_in_scope[$var_id], - $inner_context->vars_in_scope[$var_id] - ); - - $loop_scope->loop_parent_context->removeVarFromConflictingClauses($var_id); - } else { - $loop_scope->loop_parent_context->vars_in_scope[$var_id]->parent_nodes = array_merge( - $loop_scope->loop_parent_context->vars_in_scope[$var_id]->parent_nodes, - $inner_context->vars_in_scope[$var_id]->parent_nodes - ); - } - } - } - - if ($pre_conditions && $pre_condition_clauses && !ScopeAnalyzer::doesEverBreak($stmts)) { - // if the loop contains an assertion and there are no break statements, we can negate that assertion - // and apply it to the current context - - try { - $negated_pre_condition_clauses = Algebra::negateFormula(array_merge(...$pre_condition_clauses)); - } catch (ComplicatedExpressionException $e) { - $negated_pre_condition_clauses = []; - } - - $negated_pre_condition_types = Algebra::getTruthsFromFormula($negated_pre_condition_clauses); - - if ($negated_pre_condition_types) { - $changed_var_ids = []; - - $vars_in_scope_reconciled = Reconciler::reconcileKeyedTypes( - $negated_pre_condition_types, - [], - $inner_context->vars_in_scope, - $changed_var_ids, - [], - $statements_analyzer, - [], - true, - new CodeLocation($statements_analyzer->getSource(), $pre_conditions[0]) - ); - - foreach ($changed_var_ids as $var_id => $_) { - if (isset($vars_in_scope_reconciled[$var_id]) - && isset($loop_scope->loop_parent_context->vars_in_scope[$var_id]) - ) { - $loop_scope->loop_parent_context->vars_in_scope[$var_id] = $vars_in_scope_reconciled[$var_id]; - } - - $loop_scope->loop_parent_context->removeVarFromConflictingClauses($var_id); - } - } - } - - $loop_scope->loop_context->referenced_var_ids = array_merge( - array_intersect_key( - $inner_context->referenced_var_ids, - $pre_outer_context->vars_in_scope - ), - $loop_scope->loop_context->referenced_var_ids - ); - - if ($always_enters_loop) { - foreach ($inner_context->vars_in_scope as $var_id => $type) { - // if there are break statements in the loop it's not certain - // that the loop has finished executing, so the assertions at the end - // the loop in the while conditional may not hold - if (in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true) - || in_array(ScopeAnalyzer::ACTION_CONTINUE, $loop_scope->final_actions, true) - ) { - if (isset($loop_scope->possibly_defined_loop_parent_vars[$var_id])) { - $loop_scope->loop_parent_context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $type, - $loop_scope->possibly_defined_loop_parent_vars[$var_id] - ); - } - } else { - $loop_scope->loop_parent_context->vars_in_scope[$var_id] = $type; - } - } - } - - if ($inner_do_context) { - $inner_context = $inner_do_context; - } - - return null; - } - - private static function updateLoopScopeContexts( - LoopScope $loop_scope, - Context $pre_outer_context - ): void { - $updated_loop_vars = []; - - if (!in_array(ScopeAnalyzer::ACTION_CONTINUE, $loop_scope->final_actions, true)) { - $loop_scope->loop_context->vars_in_scope = $pre_outer_context->vars_in_scope; - } else { - if ($loop_scope->redefined_loop_vars !== null) { - foreach ($loop_scope->redefined_loop_vars as $var => $type) { - $loop_scope->loop_context->vars_in_scope[$var] = $type; - $updated_loop_vars[$var] = true; - } - } - - if ($loop_scope->possibly_redefined_loop_vars) { - foreach ($loop_scope->possibly_redefined_loop_vars as $var => $type) { - if ($loop_scope->loop_context->hasVariable($var)) { - if (!isset($updated_loop_vars[$var])) { - $loop_scope->loop_context->vars_in_scope[$var] = Type::combineUnionTypes( - $loop_scope->loop_context->vars_in_scope[$var], - $type - ); - } else { - $loop_scope->loop_context->vars_in_scope[$var]->parent_nodes - += $type->parent_nodes; - } - } - } - } - } - - // merge vars possibly in scope at the end of each loop - $loop_scope->loop_context->vars_possibly_in_scope = array_merge( - $loop_scope->loop_context->vars_possibly_in_scope, - $loop_scope->vars_possibly_in_scope - ); - } - - /** - * @param list $pre_condition_clauses - * - * @return list - */ - private static function applyPreConditionToLoopContext( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $pre_condition, - array $pre_condition_clauses, - Context $loop_context, - Context $outer_context, - bool $is_do - ): array { - $pre_referenced_var_ids = $loop_context->referenced_var_ids; - $loop_context->referenced_var_ids = []; - - $was_inside_conditional = $loop_context->inside_conditional; - - $loop_context->inside_conditional = true; - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('RedundantCondition', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['RedundantCondition']); - } - if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['RedundantConditionGivenDocblockType']); - } - if (!in_array('TypeDoesNotContainType', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['TypeDoesNotContainType']); - } - - if (ExpressionAnalyzer::analyze($statements_analyzer, $pre_condition, $loop_context) === false) { - $loop_context->inside_conditional = $was_inside_conditional; - - return []; - } - - $loop_context->inside_conditional = $was_inside_conditional; - - $new_referenced_var_ids = $loop_context->referenced_var_ids; - $loop_context->referenced_var_ids = array_merge($pre_referenced_var_ids, $new_referenced_var_ids); - - $always_assigned_before_loop_body_vars = Context::getNewOrUpdatedVarIds($outer_context, $loop_context); - - $loop_context->clauses = Algebra::simplifyCNF( - array_merge($outer_context->clauses, $pre_condition_clauses) - ); - - $active_while_types = []; - - $reconcilable_while_types = Algebra::getTruthsFromFormula( - $loop_context->clauses, - spl_object_id($pre_condition), - $new_referenced_var_ids - ); - - $changed_var_ids = []; - - if ($reconcilable_while_types) { - $pre_condition_vars_in_scope_reconciled = Reconciler::reconcileKeyedTypes( - $reconcilable_while_types, - $active_while_types, - $loop_context->vars_in_scope, - $changed_var_ids, - $new_referenced_var_ids, - $statements_analyzer, - [], - true, - new CodeLocation($statements_analyzer->getSource(), $pre_condition) - ); - - $loop_context->vars_in_scope = $pre_condition_vars_in_scope_reconciled; - } - - if (!in_array('RedundantCondition', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['RedundantCondition']); - } - if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['RedundantConditionGivenDocblockType']); - } - if (!in_array('TypeDoesNotContainType', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['TypeDoesNotContainType']); - } - - if ($is_do) { - return []; - } - - foreach ($always_assigned_before_loop_body_vars as $var_id) { - $loop_context->clauses = Context::filterClauses( - $var_id, - $loop_context->clauses, - null, - $statements_analyzer - ); - } - - return $always_assigned_before_loop_body_vars; - } - - /** - * @param array> $assignment_map - * - */ - private static function getAssignmentMapDepth(string $first_var_id, array $assignment_map): int - { - $max_depth = 0; - - $assignment_var_ids = $assignment_map[$first_var_id]; - unset($assignment_map[$first_var_id]); - - foreach ($assignment_var_ids as $assignment_var_id => $_) { - $depth = 1; - - if (isset($assignment_map[$assignment_var_id])) { - $depth = 1 + self::getAssignmentMapDepth($assignment_var_id, $assignment_map); - } - - if ($depth > $max_depth) { - $max_depth = $depth; - } - } - - return $max_depth; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php deleted file mode 100644 index fd492eba..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php +++ /dev/null @@ -1,234 +0,0 @@ -getCodebase(); - - $was_inside_conditional = $context->inside_conditional; - - $context->inside_conditional = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->cond, $context) === false) { - $context->inside_conditional = $was_inside_conditional; - - return; - } - - $context->inside_conditional = $was_inside_conditional; - - $switch_var_id = ExpressionIdentifier::getArrayVarId( - $stmt->cond, - null, - $statements_analyzer - ); - - if (!$switch_var_id - && ($stmt->cond instanceof PhpParser\Node\Expr\FuncCall - || $stmt->cond instanceof PhpParser\Node\Expr\MethodCall - || $stmt->cond instanceof PhpParser\Node\Expr\StaticCall - ) - ) { - $switch_var_id = '$__tmp_switch__' . (int) $stmt->cond->getAttribute('startFilePos'); - - $condition_type = $statements_analyzer->node_data->getType($stmt->cond) ?? Type::getMixed(); - - $context->vars_in_scope[$switch_var_id] = $condition_type; - } - - $original_context = clone $context; - - // the last statement always breaks, by default - $last_case_exit_type = 'break'; - - $case_exit_types = new SplFixedArray(count($stmt->cases)); - - $has_default = false; - - $case_action_map = []; - - $config = Config::getInstance(); - - // create a map of case statement -> ultimate exit type - for ($i = count($stmt->cases) - 1; $i >= 0; --$i) { - $case = $stmt->cases[$i]; - - $case_actions = $case_action_map[$i] = ScopeAnalyzer::getControlActions( - $case->stmts, - $statements_analyzer->node_data, - $config->exit_functions, - ['switch'] - ); - - if (!in_array(ScopeAnalyzer::ACTION_NONE, $case_actions, true)) { - if ($case_actions === [ScopeAnalyzer::ACTION_END]) { - $last_case_exit_type = 'return_throw'; - } elseif ($case_actions === [ScopeAnalyzer::ACTION_CONTINUE]) { - $last_case_exit_type = 'continue'; - } elseif (in_array(ScopeAnalyzer::ACTION_LEAVE_SWITCH, $case_actions, true)) { - $last_case_exit_type = 'break'; - } - } elseif (count($case_actions) !== 1) { - $last_case_exit_type = 'hybrid'; - } - - $case_exit_types[$i] = $last_case_exit_type; - } - - $switch_scope = new SwitchScope(); - - $was_caching_assertions = $statements_analyzer->node_data->cache_assertions; - - $statements_analyzer->node_data->cache_assertions = false; - - $all_options_returned = true; - - for ($i = 0, $l = count($stmt->cases); $i < $l; $i++) { - $case = $stmt->cases[$i]; - - /** @var string */ - $case_exit_type = $case_exit_types[$i]; - if ($case_exit_type !== 'return_throw') { - $all_options_returned = false; - } - - $case_actions = $case_action_map[$i]; - - if (!$case->cond) { - $has_default = true; - } - - if (SwitchCaseAnalyzer::analyze( - $statements_analyzer, - $codebase, - $stmt, - $switch_var_id, - $case, - $context, - $original_context, - $case_exit_type, - $case_actions, - $i === $l - 1, - $switch_scope - ) === false - ) { - return; - } - } - - $all_options_matched = $has_default; - - if (!$has_default && $switch_scope->negated_clauses && $switch_var_id) { - $entry_clauses = Algebra::simplifyCNF( - array_merge( - $original_context->clauses, - $switch_scope->negated_clauses - ) - ); - - $reconcilable_if_types = Algebra::getTruthsFromFormula($entry_clauses); - - // if the if has an || in the conditional, we cannot easily reason about it - if ($reconcilable_if_types && isset($reconcilable_if_types[$switch_var_id])) { - $changed_var_ids = []; - - $case_vars_in_scope_reconciled = - Reconciler::reconcileKeyedTypes( - $reconcilable_if_types, - [], - $original_context->vars_in_scope, - $changed_var_ids, - [], - $statements_analyzer, - [], - $original_context->inside_loop - ); - - if (isset($case_vars_in_scope_reconciled[$switch_var_id]) - && $case_vars_in_scope_reconciled[$switch_var_id]->isEmpty() - ) { - $all_options_matched = true; - } - } - } - - if ($was_caching_assertions) { - $statements_analyzer->node_data->cache_assertions = true; - } - - // only update vars if there is a default or all possible cases accounted for - // if the default has a throw/return/continue, that should be handled above - if ($all_options_matched) { - if ($switch_scope->new_vars_in_scope) { - $context->vars_in_scope = array_merge($context->vars_in_scope, $switch_scope->new_vars_in_scope); - } - - if ($switch_scope->redefined_vars) { - $context->vars_in_scope = array_merge($context->vars_in_scope, $switch_scope->redefined_vars); - } - - if ($switch_scope->possibly_redefined_vars) { - foreach ($switch_scope->possibly_redefined_vars as $var_id => $type) { - if (!isset($switch_scope->redefined_vars[$var_id]) - && !isset($switch_scope->new_vars_in_scope[$var_id]) - && isset($context->vars_in_scope[$var_id]) - ) { - $context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $type, - $context->vars_in_scope[$var_id] - ); - } - } - } - - $stmt->setAttribute('allMatched', true); - } elseif ($switch_scope->possibly_redefined_vars) { - foreach ($switch_scope->possibly_redefined_vars as $var_id => $type) { - if (isset($context->vars_in_scope[$var_id])) { - $context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $type, - $context->vars_in_scope[$var_id] - ); - } - } - } - - if ($switch_scope->new_assigned_var_ids) { - $context->assigned_var_ids += $switch_scope->new_assigned_var_ids; - } - - $context->vars_possibly_in_scope = array_merge( - $context->vars_possibly_in_scope, - $switch_scope->new_vars_possibly_in_scope - ); - - //a switch can't return in all options without a default - $context->has_returned = $all_options_returned && $has_default; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php deleted file mode 100644 index d8802a1c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php +++ /dev/null @@ -1,769 +0,0 @@ -alter_code) { - $case_context->branch_point = $case_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); - } - - $case_context->parent_context = $context; - $case_scope = $case_context->case_scope = new CaseScope($case_context); - - $case_equality_expr = null; - - $old_node_data = $statements_analyzer->node_data; - - $fake_switch_condition = false; - - if ($switch_var_id && strpos($switch_var_id, '$__tmp_switch__') === 0) { - $switch_condition = new VirtualVariable( - substr($switch_var_id, 1), - $stmt->cond->getAttributes() - ); - - $fake_switch_condition = true; - } else { - $switch_condition = $stmt->cond; - } - - if ($case->cond) { - $was_inside_conditional = $case_context->inside_conditional; - $case_context->inside_conditional = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $case->cond, $case_context) === false) { - unset($case_scope->parent_context); - unset($case_context->case_scope); - unset($case_context->parent_context); - - return false; - } - - $case_context->inside_conditional = $was_inside_conditional; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $traverser = new PhpParser\NodeTraverser; - $traverser->addVisitor( - new ConditionCloningVisitor( - $statements_analyzer->node_data - ) - ); - - /** @var PhpParser\Node\Expr */ - $switch_condition = $traverser->traverse([$switch_condition])[0]; - - if ($fake_switch_condition) { - $statements_analyzer->node_data->setType( - $switch_condition, - $case_context->vars_in_scope[$switch_var_id] ?? Type::getMixed() - ); - } - - if ($switch_condition instanceof PhpParser\Node\Expr\Variable - && is_string($switch_condition->name) - && isset($context->vars_in_scope['$' . $switch_condition->name]) - ) { - $switch_var_type = $context->vars_in_scope['$' . $switch_condition->name]; - - $type_statements = []; - - foreach ($switch_var_type->getAtomicTypes() as $type) { - if ($type instanceof TDependentGetClass) { - $type_statements[] = new VirtualFuncCall( - new VirtualName(['get_class']), - [ - new VirtualArg( - new VirtualVariable( - substr($type->typeof, 1), - $stmt->cond->getAttributes() - ), - false, - false, - $stmt->cond->getAttributes() - ), - ], - $stmt->cond->getAttributes() - ); - } elseif ($type instanceof TDependentGetType) { - $type_statements[] = new VirtualFuncCall( - new VirtualName(['gettype']), - [ - new VirtualArg( - new VirtualVariable( - substr($type->typeof, 1), - $stmt->cond->getAttributes() - ), - false, - false, - $stmt->cond->getAttributes() - ), - ], - $stmt->cond->getAttributes() - ); - } elseif ($type instanceof TDependentGetDebugType) { - $type_statements[] = new VirtualFuncCall( - new VirtualName(['get_debug_type']), - [ - new VirtualArg( - new VirtualVariable( - substr($type->typeof, 1), - $stmt->cond->getAttributes() - ), - false, - false, - $stmt->cond->getAttributes() - ), - ], - $stmt->cond->getAttributes() - ); - } else { - $type_statements = null; - break; - } - } - - if ($type_statements && count($type_statements) === 1) { - $switch_condition = $type_statements[0]; - - if ($fake_switch_condition) { - $statements_analyzer->node_data->setType( - $switch_condition, - $case_context->vars_in_scope[$switch_var_id] ?? Type::getMixed() - ); - } - } - } - - if ($switch_condition instanceof PhpParser\Node\Expr\ConstFetch - && $switch_condition->name->parts === ['true'] - ) { - $case_equality_expr = $case->cond; - } elseif (($switch_condition_type = $statements_analyzer->node_data->getType($switch_condition)) - && ($case_cond_type = $statements_analyzer->node_data->getType($case->cond)) - && (($switch_condition_type->isString() && $case_cond_type->isString()) - || ($switch_condition_type->isInt() && $case_cond_type->isInt()) - || ($switch_condition_type->isFloat() && $case_cond_type->isFloat()) - ) - ) { - $case_equality_expr = new VirtualIdentical( - $switch_condition, - $case->cond, - $case->cond->getAttributes() - ); - } else { - $case_equality_expr = new VirtualEqual( - $switch_condition, - $case->cond, - $case->cond->getAttributes() - ); - } - } - - $continue_case_equality_expr = false; - - if ($case->stmts) { - $case_stmts = array_merge($switch_scope->leftover_statements, $case->stmts); - } else { - $continue_case_equality_expr = count($switch_scope->leftover_statements) === 1; - $case_stmts = $switch_scope->leftover_statements; - } - - if (!$has_leaving_statements && !$is_last) { - if (!$case_equality_expr) { - $case_equality_expr = new VirtualFuncCall( - new VirtualFullyQualified(['rand']), - [ - new VirtualArg(new VirtualLNumber(0)), - new VirtualArg(new VirtualLNumber(1)), - ], - $case->getAttributes() - ); - } - - $switch_scope->leftover_case_equality_expr = $switch_scope->leftover_case_equality_expr - ? new VirtualBooleanOr( - $switch_scope->leftover_case_equality_expr, - $case_equality_expr, - $case->cond ? $case->cond->getAttributes() : $case->getAttributes() - ) - : $case_equality_expr; - - if ($continue_case_equality_expr - && $switch_scope->leftover_statements[0] instanceof PhpParser\Node\Stmt\If_ - ) { - $case_if_stmt = $switch_scope->leftover_statements[0]; - $case_if_stmt->cond = $switch_scope->leftover_case_equality_expr; - } else { - $case_if_stmt = new VirtualIf( - $switch_scope->leftover_case_equality_expr, - ['stmts' => $case_stmts], - $case->getAttributes() - ); - - $switch_scope->leftover_statements = [$case_if_stmt]; - } - - unset($case_scope->parent_context); - unset($case_context->case_scope); - unset($case_context->parent_context); - - $statements_analyzer->node_data = $old_node_data; - - return null; - } - - if ($switch_scope->leftover_case_equality_expr) { - $case_or_default_equality_expr = $case_equality_expr; - - if (!$case_or_default_equality_expr) { - $case_or_default_equality_expr = new VirtualFuncCall( - new VirtualFullyQualified(['rand']), - [ - new VirtualArg(new VirtualLNumber(0)), - new VirtualArg(new VirtualLNumber(1)), - ], - $case->getAttributes() - ); - } - - $case_equality_expr = new VirtualBooleanOr( - $switch_scope->leftover_case_equality_expr, - $case_or_default_equality_expr, - $case_or_default_equality_expr->getAttributes() - ); - } - - if ($case_equality_expr - && $switch_condition instanceof PhpParser\Node\Expr\Variable - && is_string($switch_condition->name) - && isset($context->vars_in_scope['$' . $switch_condition->name]) - ) { - $new_case_equality_expr = self::simplifyCaseEqualityExpression( - $case_equality_expr, - $switch_condition - ); - - if ($new_case_equality_expr) { - $was_inside_conditional = $case_context->inside_conditional; - - $case_context->inside_conditional = true; - - ExpressionAnalyzer::analyze( - $statements_analyzer, - $new_case_equality_expr->getArgs()[1]->value, - $case_context - ); - - $case_context->inside_conditional = $was_inside_conditional; - - $case_equality_expr = $new_case_equality_expr; - } - } - - $case_context->break_types[] = 'switch'; - - $switch_scope->leftover_statements = []; - $switch_scope->leftover_case_equality_expr = null; - - $case_clauses = []; - - if ($case_equality_expr) { - $case_equality_expr_id = spl_object_id($case_equality_expr); - $case_clauses = FormulaGenerator::getFormula( - $case_equality_expr_id, - $case_equality_expr_id, - $case_equality_expr, - $context->self, - $statements_analyzer, - $codebase, - false, - false - ); - } - - if ($switch_scope->negated_clauses && count($switch_scope->negated_clauses) < 50) { - $entry_clauses = Algebra::simplifyCNF( - array_merge( - $original_context->clauses, - $switch_scope->negated_clauses - ) - ); - } else { - $entry_clauses = $original_context->clauses; - } - - if ($case_clauses && $case->cond) { - // this will see whether any of the clauses in set A conflict with the clauses in set B - AlgebraAnalyzer::checkForParadox( - $entry_clauses, - $case_clauses, - $statements_analyzer, - $case->cond, - [] - ); - - if (count($entry_clauses) + count($case_clauses) < 50) { - $case_context->clauses = Algebra::simplifyCNF(array_merge($entry_clauses, $case_clauses)); - } else { - $case_context->clauses = array_merge($entry_clauses, $case_clauses); - } - } else { - $case_context->clauses = $entry_clauses; - } - - $reconcilable_if_types = Algebra::getTruthsFromFormula($case_context->clauses); - - // if the if has an || in the conditional, we cannot easily reason about it - if ($reconcilable_if_types) { - $changed_var_ids = []; - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('RedundantCondition', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['RedundantCondition']); - } - - if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['RedundantConditionGivenDocblockType']); - } - - $case_vars_in_scope_reconciled = - Reconciler::reconcileKeyedTypes( - $reconcilable_if_types, - [], - $case_context->vars_in_scope, - $changed_var_ids, - $case->cond && $switch_var_id ? [$switch_var_id => true] : [], - $statements_analyzer, - [], - $case_context->inside_loop, - new CodeLocation( - $statements_analyzer->getSource(), - $case->cond ?? $case, - $context->include_location - ) - ); - - if (!in_array('RedundantCondition', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['RedundantCondition']); - } - - if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['RedundantConditionGivenDocblockType']); - } - - $case_context->vars_in_scope = $case_vars_in_scope_reconciled; - foreach ($reconcilable_if_types as $var_id => $_) { - $case_context->vars_possibly_in_scope[$var_id] = true; - } - - if ($changed_var_ids) { - $case_context->clauses = Context::removeReconciledClauses($case_context->clauses, $changed_var_ids)[0]; - } - } - - if ($case_clauses && $case_equality_expr) { - try { - $negated_case_clauses = Algebra::negateFormula($case_clauses); - } catch (ComplicatedExpressionException $e) { - $case_equality_expr_id = spl_object_id($case_equality_expr); - - try { - $negated_case_clauses = FormulaGenerator::getFormula( - $case_equality_expr_id, - $case_equality_expr_id, - new VirtualBooleanNot($case_equality_expr), - $context->self, - $statements_analyzer, - $codebase, - false, - false - ); - } catch (ComplicatedExpressionException $e) { - $negated_case_clauses = []; - } - } - - $switch_scope->negated_clauses = array_merge( - $switch_scope->negated_clauses, - $negated_case_clauses - ); - } - - $pre_possibly_assigned_var_ids = $case_context->possibly_assigned_var_ids; - $case_context->possibly_assigned_var_ids = []; - - $pre_assigned_var_ids = $case_context->assigned_var_ids; - $case_context->assigned_var_ids = []; - - $statements_analyzer->analyze($case_stmts, $case_context); - - $traverser = new PhpParser\NodeTraverser; - $traverser->addVisitor( - new TypeMappingVisitor( - $statements_analyzer->node_data, - $old_node_data - ) - ); - - $traverser->traverse([$case]); - - $statements_analyzer->node_data = $old_node_data; - - /** @var array */ - $new_case_assigned_var_ids = $case_context->assigned_var_ids; - $case_context->assigned_var_ids = $pre_assigned_var_ids + $new_case_assigned_var_ids; - - /** @var array */ - $new_case_possibly_assigned_var_ids = $case_context->possibly_assigned_var_ids; - $case_context->possibly_assigned_var_ids = - $pre_possibly_assigned_var_ids + $new_case_possibly_assigned_var_ids; - - $context->referenced_var_ids = array_merge( - $context->referenced_var_ids, - $case_context->referenced_var_ids - ); - - if ($case_exit_type !== 'return_throw') { - if (self::handleNonReturningCase( - $statements_analyzer, - $switch_var_id, - $case, - $context, - $case_context, - $original_context, - $case_exit_type, - $switch_scope - ) === false) { - unset($case_scope->parent_context); - unset($case_context->case_scope); - unset($case_context->parent_context); - - return false; - } - } - - // augment the information with data from break statements - if ($case_scope->break_vars !== null) { - if ($switch_scope->possibly_redefined_vars === null) { - $switch_scope->possibly_redefined_vars = array_intersect_key( - $case_scope->break_vars, - $context->vars_in_scope - ); - } else { - foreach ($case_scope->break_vars as $var_id => $type) { - if (isset($context->vars_in_scope[$var_id])) { - $switch_scope->possibly_redefined_vars[$var_id] = Type::combineUnionTypes( - clone $type, - $switch_scope->possibly_redefined_vars[$var_id] ?? null - ); - } - } - } - - if ($switch_scope->new_vars_in_scope !== null) { - foreach ($switch_scope->new_vars_in_scope as $var_id => $type) { - if (isset($case_scope->break_vars[$var_id])) { - if (!isset($case_context->vars_in_scope[$var_id])) { - unset($switch_scope->new_vars_in_scope[$var_id]); - } else { - $switch_scope->new_vars_in_scope[$var_id] = Type::combineUnionTypes( - clone $case_scope->break_vars[$var_id], - $type - ); - } - } else { - unset($switch_scope->new_vars_in_scope[$var_id]); - } - } - } - - if ($switch_scope->redefined_vars !== null) { - foreach ($switch_scope->redefined_vars as $var_id => $type) { - if (isset($case_scope->break_vars[$var_id])) { - $switch_scope->redefined_vars[$var_id] = Type::combineUnionTypes( - clone $case_scope->break_vars[$var_id], - $type - ); - } else { - unset($switch_scope->redefined_vars[$var_id]); - } - } - } - } - - unset($case_scope->parent_context); - unset($case_context->case_scope); - unset($case_context->parent_context); - - return null; - } - - /** - * @return null|false - */ - private static function handleNonReturningCase( - StatementsAnalyzer $statements_analyzer, - ?string $switch_var_id, - PhpParser\Node\Stmt\Case_ $case, - Context $context, - Context $case_context, - Context $original_context, - string $case_exit_type, - SwitchScope $switch_scope - ): ?bool { - if (!$case->cond - && $switch_var_id - && isset($case_context->vars_in_scope[$switch_var_id]) - && $case_context->vars_in_scope[$switch_var_id]->isEmpty() - ) { - if (IssueBuffer::accepts( - new ParadoxicalCondition( - 'All possible case statements have been met, default is impossible here', - new CodeLocation($statements_analyzer->getSource(), $case) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } - - // if we're leaving this block, add vars to outer for loop scope - if ($case_exit_type === 'continue') { - if (!$context->loop_scope) { - if (IssueBuffer::accepts( - new ContinueOutsideLoop( - 'Continue called when not in loop', - new CodeLocation($statements_analyzer->getSource(), $case) - ) - )) { - return false; - } - } - } else { - $case_redefined_vars = $case_context->getRedefinedVars($original_context->vars_in_scope); - - if ($switch_scope->possibly_redefined_vars === null) { - $switch_scope->possibly_redefined_vars = $case_redefined_vars; - } else { - foreach ($case_redefined_vars as $var_id => $type) { - $switch_scope->possibly_redefined_vars[$var_id] = Type::combineUnionTypes( - clone $type, - $switch_scope->possibly_redefined_vars[$var_id] ?? null - ); - } - } - - if ($switch_scope->redefined_vars === null) { - $switch_scope->redefined_vars = $case_redefined_vars; - } else { - foreach ($switch_scope->redefined_vars as $var_id => $type) { - if (!isset($case_redefined_vars[$var_id])) { - unset($switch_scope->redefined_vars[$var_id]); - } else { - $switch_scope->redefined_vars[$var_id] = Type::combineUnionTypes( - $type, - clone $case_redefined_vars[$var_id] - ); - } - } - } - - $context_new_vars = array_diff_key($case_context->vars_in_scope, $context->vars_in_scope); - - if ($switch_scope->new_vars_in_scope === null) { - $switch_scope->new_vars_in_scope = $context_new_vars; - $switch_scope->new_vars_possibly_in_scope = array_diff_key( - $case_context->vars_possibly_in_scope, - $context->vars_possibly_in_scope - ); - } else { - foreach ($switch_scope->new_vars_in_scope as $new_var => $type) { - if (!$case_context->hasVariable($new_var)) { - unset($switch_scope->new_vars_in_scope[$new_var]); - } else { - $switch_scope->new_vars_in_scope[$new_var] = - Type::combineUnionTypes(clone $case_context->vars_in_scope[$new_var], $type); - } - } - - $switch_scope->new_vars_possibly_in_scope = array_merge( - array_diff_key( - $case_context->vars_possibly_in_scope, - $context->vars_possibly_in_scope - ), - $switch_scope->new_vars_possibly_in_scope - ); - } - } - - if ($context->collect_exceptions) { - $context->mergeExceptions($case_context); - } - - return null; - } - - private static function simplifyCaseEqualityExpression( - PhpParser\Node\Expr $case_equality_expr, - PhpParser\Node\Expr\Variable $var - ): ?PhpParser\Node\Expr\FuncCall { - if ($case_equality_expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr) { - $nested_or_options = self::getOptionsFromNestedOr($case_equality_expr, $var); - - if ($nested_or_options) { - return new VirtualFuncCall( - new VirtualFullyQualified(['in_array']), - [ - new VirtualArg( - $var, - false, - false, - $var->getAttributes() - ), - new VirtualArg( - new VirtualArray( - $nested_or_options, - $case_equality_expr->getAttributes() - ), - false, - false, - $case_equality_expr->getAttributes() - ), - new VirtualArg( - new VirtualConstFetch( - new VirtualFullyQualified(['true']) - ) - ), - ] - ); - } - } - - return null; - } - - /** - * @param array $in_array_values - * @return ?array - */ - private static function getOptionsFromNestedOr( - PhpParser\Node\Expr $case_equality_expr, - PhpParser\Node\Expr\Variable $var, - array $in_array_values = [] - ): ?array { - if ($case_equality_expr instanceof PhpParser\Node\Expr\BinaryOp\Identical - && $case_equality_expr->left instanceof PhpParser\Node\Expr\Variable - && $case_equality_expr->left->name === $var->name - ) { - $in_array_values[] = new VirtualArrayItem( - $case_equality_expr->right, - null, - false, - $case_equality_expr->right->getAttributes() - ); - - return $in_array_values; - } - - if (!$case_equality_expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr) { - return null; - } - - if (!$case_equality_expr->right instanceof PhpParser\Node\Expr\BinaryOp\Identical - || !$case_equality_expr->right->left instanceof PhpParser\Node\Expr\Variable - || $case_equality_expr->right->left->name !== $var->name - ) { - return null; - } - - $in_array_values[] = new VirtualArrayItem( - $case_equality_expr->right->right, - null, - false, - $case_equality_expr->right->right->getAttributes() - ); - - return self::getOptionsFromNestedOr( - $case_equality_expr->left, - $var, - $in_array_values - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php deleted file mode 100644 index 5074bd68..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php +++ /dev/null @@ -1,516 +0,0 @@ -getCodebase(); - - /** @var int $i */ - foreach ($stmt->catches as $i => $catch) { - $catch_actions[$i] = ScopeAnalyzer::getControlActions( - $catch->stmts, - $statements_analyzer->node_data, - $codebase->config->exit_functions, - [] - ); - $all_catches_leave = $all_catches_leave && !in_array(ScopeAnalyzer::ACTION_NONE, $catch_actions[$i], true); - } - - $existing_thrown_exceptions = $context->possibly_thrown_exceptions; - - /** - * @var array> $context->possibly_thrown_exceptions - */ - $context->possibly_thrown_exceptions = []; - - $old_context = clone $context; - - if ($all_catches_leave && !$stmt->finally) { - $try_context = $context; - } else { - $try_context = clone $context; - - if ($codebase->alter_code) { - $try_context->branch_point = $try_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); - } - - if ($stmt->finally) { - $try_context->finally_scope = new FinallyScope($try_context->vars_in_scope); - } - } - - $assigned_var_ids = $try_context->assigned_var_ids; - $context->assigned_var_ids = []; - - $old_referenced_var_ids = $try_context->referenced_var_ids; - - $was_inside_try = $context->inside_try; - $context->inside_try = true; - if ($statements_analyzer->analyze($stmt->stmts, $context) === false) { - return false; - } - $context->inside_try = $was_inside_try; - - if ($try_context->finally_scope) { - foreach ($context->vars_in_scope as $var_id => $type) { - $try_context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( - $try_context->finally_scope->vars_in_scope[$var_id] ?? null, - $type, - $statements_analyzer->getCodebase() - ); - } - } - - $context->has_returned = false; - - $try_block_control_actions = ScopeAnalyzer::getControlActions( - $stmt->stmts, - $statements_analyzer->node_data, - $codebase->config->exit_functions, - [] - ); - - /** @var array */ - $newly_assigned_var_ids = $context->assigned_var_ids; - - $context->assigned_var_ids = array_merge( - $assigned_var_ids, - $newly_assigned_var_ids - ); - - $possibly_referenced_var_ids = array_merge( - $context->referenced_var_ids, - $old_referenced_var_ids - ); - - if ($try_context !== $context) { - foreach ($context->vars_in_scope as $var_id => $type) { - if (!isset($try_context->vars_in_scope[$var_id])) { - $try_context->vars_in_scope[$var_id] = clone $type; - - $context->vars_in_scope[$var_id]->possibly_undefined = true; - $context->vars_in_scope[$var_id]->possibly_undefined_from_try = true; - } else { - $try_context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $try_context->vars_in_scope[$var_id], - $type - ); - } - } - - $try_context->vars_possibly_in_scope = $context->vars_possibly_in_scope; - $try_context->possibly_thrown_exceptions = $context->possibly_thrown_exceptions; - - $context->referenced_var_ids = array_intersect_key( - $try_context->referenced_var_ids, - $context->referenced_var_ids - ); - } - - $try_leaves_loop = $context->loop_scope - && $context->loop_scope->final_actions - && !in_array(ScopeAnalyzer::ACTION_NONE, $context->loop_scope->final_actions, true); - - if (!$all_catches_leave) { - foreach ($newly_assigned_var_ids as $assigned_var_id => $_) { - $context->removeVarFromConflictingClauses($assigned_var_id); - } - } else { - foreach ($newly_assigned_var_ids as $assigned_var_id => $_) { - $try_context->removeVarFromConflictingClauses($assigned_var_id); - } - } - - // at this point we have two contexts – $context, in which it is assumed that everything was fine, - // and $try_context - which allows all variables to have the union of the values before and after - // the try was applied - $original_context = clone $try_context; - - $issues_to_suppress = [ - 'RedundantCondition', - 'RedundantConditionGivenDocblockType', - 'TypeDoesNotContainNull', - 'TypeDoesNotContainType', - ]; - - $definitely_newly_assigned_var_ids = $newly_assigned_var_ids; - - /** @var int $i */ - foreach ($stmt->catches as $i => $catch) { - $catch_context = clone $original_context; - $catch_context->has_returned = false; - - foreach ($catch_context->vars_in_scope as $var_id => $type) { - if (!isset($old_context->vars_in_scope[$var_id])) { - $type = clone $type; - $type->possibly_undefined_from_try = true; - $catch_context->vars_in_scope[$var_id] = $type; - } else { - $catch_context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $type, - $old_context->vars_in_scope[$var_id] - ); - } - } - - $fq_catch_classes = []; - - if (!$catch->types) { - throw new UnexpectedValueException('Very bad'); - } - - foreach ($catch->types as $catch_type) { - $fq_catch_class = ClassLikeAnalyzer::getFQCLNFromNameObject( - $catch_type, - $statements_analyzer->getAliases() - ); - - $fq_catch_class = $codebase->classlikes->getUnAliasedName($fq_catch_class); - - if ($codebase->alter_code && $fq_catch_class) { - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $catch_type, - $fq_catch_class, - $context->calling_method_id - ); - } - - if ($original_context->check_classes) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $fq_catch_class, - new CodeLocation($statements_analyzer->getSource(), $catch_type, $context->include_location), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions(true) - ) === false) { - // fall through - } - } - - if (($codebase->classExists($fq_catch_class) - && strtolower($fq_catch_class) !== 'exception' - && !($codebase->classExtends($fq_catch_class, 'Exception') - || $codebase->classImplements($fq_catch_class, 'Throwable'))) - || ($codebase->interfaceExists($fq_catch_class) - && strtolower($fq_catch_class) !== 'throwable' - && !$codebase->interfaceExtends($fq_catch_class, 'Throwable')) - ) { - IssueBuffer::maybeAdd( - new InvalidCatch( - 'Class/interface ' . $fq_catch_class . ' cannot be caught', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_catch_class - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $fq_catch_classes[] = $fq_catch_class; - } - - if ($catch_context->collect_exceptions) { - foreach ($fq_catch_classes as $fq_catch_class) { - $fq_catch_class_lower = strtolower($fq_catch_class); - - foreach ($catch_context->possibly_thrown_exceptions as $exception_fqcln => $_) { - $exception_fqcln_lower = strtolower($exception_fqcln); - - if ($exception_fqcln_lower === $fq_catch_class_lower - || ($codebase->classExists($exception_fqcln) - && $codebase->classExtendsOrImplements($exception_fqcln, $fq_catch_class)) - || ($codebase->interfaceExists($exception_fqcln) - && $codebase->interfaceExtends($exception_fqcln, $fq_catch_class)) - ) { - unset($original_context->possibly_thrown_exceptions[$exception_fqcln]); - unset($context->possibly_thrown_exceptions[$exception_fqcln]); - unset($catch_context->possibly_thrown_exceptions[$exception_fqcln]); - } - } - } - - $catch_context->possibly_thrown_exceptions = []; - } - - // discard all clauses because crazy stuff may have happened in try block - $catch_context->clauses = []; - - if ($catch->var && is_string($catch->var->name)) { - $catch_var_id = '$' . $catch->var->name; - - $catch_context->vars_in_scope[$catch_var_id] = new Union( - array_map( - function (string $fq_catch_class) use ($codebase): TNamedObject { - $catch_class_type = new TNamedObject($fq_catch_class); - - if (version_compare(PHP_VERSION, '7.0.0dev', '>=') - && strtolower($fq_catch_class) !== 'throwable' - && $codebase->interfaceExists($fq_catch_class) - && !$codebase->interfaceExtends($fq_catch_class, 'Throwable') - ) { - $catch_class_type->addIntersectionType(new TNamedObject('Throwable')); - } - - return $catch_class_type; - }, - $fq_catch_classes - ) - ); - - // removes dependent vars from $context - $catch_context->removeDescendents( - $catch_var_id, - null, - $catch_context->vars_in_scope[$catch_var_id], - $statements_analyzer - ); - - $catch_context->vars_possibly_in_scope[$catch_var_id] = true; - - $location = new CodeLocation($statements_analyzer->getSource(), $catch->var); - - if (!$statements_analyzer->hasVariable($catch_var_id)) { - $statements_analyzer->registerVariable( - $catch_var_id, - $location, - $catch_context->branch_point - ); - } else { - $statements_analyzer->registerVariableAssignment( - $catch_var_id, - $location - ); - } - - if ($statements_analyzer->data_flow_graph) { - $catch_var_node = DataFlowNode::getForAssignment($catch_var_id, $location); - - $catch_context->vars_in_scope[$catch_var_id]->parent_nodes = [ - $catch_var_node->id => $catch_var_node - ]; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - $statements_analyzer->data_flow_graph->addPath( - $catch_var_node, - new DataFlowNode('variable-use', 'variable use', null), - 'variable-use' - ); - } - } - } - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - foreach ($issues_to_suppress as $issue_to_suppress) { - if (!in_array($issue_to_suppress, $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues([$issue_to_suppress]); - } - } - - $old_catch_assigned_var_ids = $catch_context->referenced_var_ids; - - $catch_context->assigned_var_ids = []; - - $statements_analyzer->analyze($catch->stmts, $catch_context); - - // recalculate in case there's a no-return clause - $catch_actions[$i] = ScopeAnalyzer::getControlActions( - $catch->stmts, - $statements_analyzer->node_data, - $codebase->config->exit_functions, - [] - ); - - foreach ($issues_to_suppress as $issue_to_suppress) { - if (!in_array($issue_to_suppress, $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues([$issue_to_suppress]); - } - } - - /** @var array */ - $new_catch_assigned_var_ids = $catch_context->assigned_var_ids; - - $catch_context->assigned_var_ids += $old_catch_assigned_var_ids; - - $context->referenced_var_ids = array_intersect_key( - $catch_context->referenced_var_ids, - $context->referenced_var_ids - ); - - $possibly_referenced_var_ids = array_merge( - $catch_context->referenced_var_ids, - $possibly_referenced_var_ids - ); - - if ($catch_context->collect_exceptions) { - $context->mergeExceptions($catch_context); - } - - $catch_doesnt_leave_parent_scope = $catch_actions[$i] !== [ScopeAnalyzer::ACTION_END] - && $catch_actions[$i] !== [ScopeAnalyzer::ACTION_CONTINUE] - && $catch_actions[$i] !== [ScopeAnalyzer::ACTION_BREAK]; - - if ($catch_doesnt_leave_parent_scope) { - $definitely_newly_assigned_var_ids = array_intersect_key( - $new_catch_assigned_var_ids, - $definitely_newly_assigned_var_ids - ); - - foreach ($catch_context->vars_in_scope as $var_id => $type) { - if ($try_block_control_actions === [ScopeAnalyzer::ACTION_END]) { - $context->vars_in_scope[$var_id] = $type; - } elseif (isset($context->vars_in_scope[$var_id])) { - $context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $context->vars_in_scope[$var_id], - $type - ); - } - } - - $context->vars_possibly_in_scope = array_merge( - $catch_context->vars_possibly_in_scope, - $context->vars_possibly_in_scope - ); - } else { - if ($stmt->finally) { - $context->vars_possibly_in_scope = array_merge( - $catch_context->vars_possibly_in_scope, - $context->vars_possibly_in_scope - ); - } - } - - if ($try_context->finally_scope) { - foreach ($catch_context->vars_in_scope as $var_id => $type) { - if (isset($try_context->finally_scope->vars_in_scope[$var_id])) { - if ($try_context->finally_scope->vars_in_scope[$var_id] !== $type) { - $try_context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( - $try_context->finally_scope->vars_in_scope[$var_id], - $type, - $statements_analyzer->getCodebase() - ); - } - } else { - $try_context->finally_scope->vars_in_scope[$var_id] = $type; - $type->possibly_undefined = true; - $type->possibly_undefined_from_try = true; - } - } - } - } - - if ($context->loop_scope - && !$try_leaves_loop - && !in_array(ScopeAnalyzer::ACTION_NONE, $context->loop_scope->final_actions, true) - ) { - $context->loop_scope->final_actions[] = ScopeAnalyzer::ACTION_NONE; - } - - $finally_has_returned = false; - if ($stmt->finally) { - if ($try_context->finally_scope) { - $finally_context = clone $context; - - $finally_context->assigned_var_ids = []; - $finally_context->possibly_assigned_var_ids = []; - - $finally_context->vars_in_scope = $try_context->finally_scope->vars_in_scope; - - $statements_analyzer->analyze($stmt->finally->stmts, $finally_context); - - $finally_has_returned = $finally_context->has_returned; - - /** @var string $var_id */ - foreach ($finally_context->assigned_var_ids as $var_id => $_) { - if (isset($context->vars_in_scope[$var_id]) - && isset($finally_context->vars_in_scope[$var_id]) - ) { - if ($context->vars_in_scope[$var_id]->possibly_undefined - && $context->vars_in_scope[$var_id]->possibly_undefined_from_try - ) { - $context->vars_in_scope[$var_id]->possibly_undefined = false; - $context->vars_in_scope[$var_id]->possibly_undefined_from_try = false; - } - - $context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $context->vars_in_scope[$var_id], - $finally_context->vars_in_scope[$var_id], - $codebase - ); - } elseif (isset($finally_context->vars_in_scope[$var_id])) { - $context->vars_in_scope[$var_id] = clone $finally_context->vars_in_scope[$var_id]; - } - } - } - } - - foreach ($definitely_newly_assigned_var_ids as $var_id => $_) { - if (isset($context->vars_in_scope[$var_id])) { - $new_type = clone $context->vars_in_scope[$var_id]; - - if ($new_type->possibly_undefined_from_try) { - $new_type->possibly_undefined = false; - $new_type->possibly_undefined_from_try = false; - } - - $context->vars_in_scope[$var_id] = $new_type; - } - } - - foreach ($existing_thrown_exceptions as $possibly_thrown_exception => $codelocations) { - foreach ($codelocations as $hash => $codelocation) { - $context->possibly_thrown_exceptions[$possibly_thrown_exception][$hash] = $codelocation; - } - } - - $body_has_returned = !in_array(ScopeAnalyzer::ACTION_NONE, $try_block_control_actions, true); - $context->has_returned = ($body_has_returned && $all_catches_leave) || $finally_has_returned; - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php deleted file mode 100644 index a6ef17df..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php +++ /dev/null @@ -1,139 +0,0 @@ -cond instanceof PhpParser\Node\Expr\ConstFetch && $stmt->cond->name->parts === ['true']) - || ($stmt->cond instanceof PhpParser\Node\Scalar\LNumber && $stmt->cond->value > 0); - - $pre_context = null; - - if ($while_true) { - $pre_context = clone $context; - } - - $while_context = clone $context; - - $while_context->inside_loop = true; - $while_context->break_types[] = 'loop'; - - $codebase = $statements_analyzer->getCodebase(); - - if ($codebase->alter_code) { - $while_context->branch_point = $while_context->branch_point ?: (int) $stmt->getAttribute('startFilePos'); - } - - $loop_scope = new LoopScope($while_context, $context); - $loop_scope->protected_var_ids = $context->protected_var_ids; - - if (LoopAnalyzer::analyze( - $statements_analyzer, - $stmt->stmts, - self::getAndExpressions($stmt->cond), - [], - $loop_scope, - $inner_loop_context - ) === false) { - return false; - } - - if (!$inner_loop_context) { - throw new UnexpectedValueException('There should be an inner loop context'); - } - - $always_enters_loop = false; - - if ($stmt_cond_type = $statements_analyzer->node_data->getType($stmt->cond)) { - $always_enters_loop = $stmt_cond_type->isAlwaysTruthy(); - } - - if ($while_true) { - $always_enters_loop = true; - } - - $can_leave_loop = !$while_true - || in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true); - - if ($always_enters_loop && $can_leave_loop) { - foreach ($inner_loop_context->vars_in_scope as $var_id => $type) { - // if there are break statements in the loop it's not certain - // that the loop has finished executing, so the assertions at the end - // the loop in the while conditional may not hold - if (in_array(ScopeAnalyzer::ACTION_BREAK, $loop_scope->final_actions, true) - || in_array(ScopeAnalyzer::ACTION_CONTINUE, $loop_scope->final_actions, true) - ) { - if (isset($loop_scope->possibly_defined_loop_parent_vars[$var_id])) { - $context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $type, - $loop_scope->possibly_defined_loop_parent_vars[$var_id] - ); - } - } else { - $context->vars_in_scope[$var_id] = $type; - } - } - } - - $while_context->loop_scope = null; - - if ($can_leave_loop) { - $context->vars_possibly_in_scope = array_merge( - $context->vars_possibly_in_scope, - $while_context->vars_possibly_in_scope - ); - } elseif ($pre_context) { - $context->vars_possibly_in_scope = $pre_context->vars_possibly_in_scope; - } - - $context->referenced_var_ids = array_intersect_key( - $while_context->referenced_var_ids, - $context->referenced_var_ids - ); - - if ($context->collect_exceptions) { - $context->mergeExceptions($while_context); - } - - return null; - } - - /** - * @return list - */ - public static function getAndExpressions( - PhpParser\Node\Expr $expr - ): array { - if ($expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd) { - return array_merge( - self::getAndExpressions($expr->left), - self::getAndExpressions($expr->right) - ); - } - - return [$expr]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php deleted file mode 100644 index 2a988563..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php +++ /dev/null @@ -1,95 +0,0 @@ -loop_scope; - - $leaving_switch = true; - - if ($loop_scope) { - if ($context->break_types - && end($context->break_types) === 'switch' - && (!$stmt->num instanceof PhpParser\Node\Scalar\LNumber || $stmt->num->value < 2) - ) { - $loop_scope->final_actions[] = ScopeAnalyzer::ACTION_LEAVE_SWITCH; - } else { - $leaving_switch = false; - - $loop_scope->final_actions[] = ScopeAnalyzer::ACTION_BREAK; - } - - $redefined_vars = $context->getRedefinedVars($loop_scope->loop_parent_context->vars_in_scope); - - if ($loop_scope->possibly_redefined_loop_parent_vars === null) { - $loop_scope->possibly_redefined_loop_parent_vars = $redefined_vars; - } else { - foreach ($redefined_vars as $var => $type) { - $loop_scope->possibly_redefined_loop_parent_vars[$var] = Type::combineUnionTypes( - $type, - $loop_scope->possibly_redefined_loop_parent_vars[$var] ?? null - ); - } - } - - if ($loop_scope->iteration_count === 0) { - foreach ($context->vars_in_scope as $var_id => $type) { - if (!isset($loop_scope->loop_parent_context->vars_in_scope[$var_id])) { - $loop_scope->possibly_defined_loop_parent_vars[$var_id] = Type::combineUnionTypes( - $type, - $loop_scope->possibly_defined_loop_parent_vars[$var_id] ?? null - ); - } - } - } - - if ($context->finally_scope) { - foreach ($context->vars_in_scope as $var_id => $type) { - if (isset($context->finally_scope->vars_in_scope[$var_id])) { - $context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( - $context->finally_scope->vars_in_scope[$var_id], - $type, - $statements_analyzer->getCodebase() - ); - } else { - $context->finally_scope->vars_in_scope[$var_id] = $type; - $type->possibly_undefined = true; - $type->possibly_undefined_from_try = true; - } - } - } - } - - $case_scope = $context->case_scope; - if ($case_scope && $leaving_switch) { - foreach ($context->vars_in_scope as $var_id => $type) { - if ($case_scope->parent_context !== $context) { - if ($case_scope->break_vars === null) { - $case_scope->break_vars = []; - } - - $case_scope->break_vars[$var_id] = Type::combineUnionTypes( - $type, - $case_scope->break_vars[$var_id] ?? null - ); - } - } - } - - $context->has_returned = true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php deleted file mode 100644 index 17826f14..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php +++ /dev/null @@ -1,100 +0,0 @@ -num instanceof PhpParser\Node\Scalar\LNumber? $stmt->num->value : 1; - - $loop_scope = $context->loop_scope; - - if ($count === 2 && isset($loop_scope->loop_parent_context->loop_scope)) { - $loop_scope = $loop_scope->loop_parent_context->loop_scope; - } - - if ($count === 3 && isset($loop_scope->loop_parent_context->loop_scope)) { - $loop_scope = $loop_scope->loop_parent_context->loop_scope; - } - - if ($loop_scope === null) { - if (!$context->break_types) { - if (IssueBuffer::accepts( - new ContinueOutsideLoop( - 'Continue call outside loop context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSource()->getSuppressedIssues() - )) { - return; - } - } - } else { - if ($context->break_types - && end($context->break_types) === 'switch' - && $count < 2 - ) { - $loop_scope->final_actions[] = ScopeAnalyzer::ACTION_LEAVE_SWITCH; - } else { - $loop_scope->final_actions[] = ScopeAnalyzer::ACTION_CONTINUE; - } - - $redefined_vars = $context->getRedefinedVars($loop_scope->loop_parent_context->vars_in_scope); - - if ($loop_scope->redefined_loop_vars === null) { - $loop_scope->redefined_loop_vars = $redefined_vars; - } else { - foreach ($loop_scope->redefined_loop_vars as $redefined_var => $type) { - if (!isset($redefined_vars[$redefined_var])) { - unset($loop_scope->redefined_loop_vars[$redefined_var]); - } else { - $loop_scope->redefined_loop_vars[$redefined_var] = Type::combineUnionTypes( - $redefined_vars[$redefined_var], - $type - ); - } - } - } - - foreach ($redefined_vars as $var => $type) { - $loop_scope->possibly_redefined_loop_vars[$var] = Type::combineUnionTypes( - $type, - $loop_scope->possibly_redefined_loop_vars[$var] ?? null - ); - } - - if ($context->finally_scope) { - foreach ($context->vars_in_scope as $var_id => $type) { - if (isset($context->finally_scope->vars_in_scope[$var_id])) { - $context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( - $context->finally_scope->vars_in_scope[$var_id], - $type, - $statements_analyzer->getCodebase() - ); - } else { - $context->finally_scope->vars_in_scope[$var_id] = $type; - $type->possibly_undefined = true; - $type->possibly_undefined_from_try = true; - } - } - } - } - - $context->has_returned = true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php deleted file mode 100644 index 8b9be56b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php +++ /dev/null @@ -1,135 +0,0 @@ -getCodebase(); - - foreach ($stmt->exprs as $i => $expr) { - $context->inside_call = true; - ExpressionAnalyzer::analyze($statements_analyzer, $expr, $context); - $context->inside_call = false; - - $expr_type = $statements_analyzer->node_data->getType($expr); - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { - if ($expr_type && $expr_type->hasObjectType()) { - $expr_type = CastAnalyzer::castStringAttempt( - $statements_analyzer, - $context, - $expr_type, - $expr, - false - ); - } - - $call_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - $echo_param_sink = TaintSink::getForMethodArgument( - 'echo', - 'echo', - (int) $i, - null, - $call_location - ); - - $echo_param_sink->taints = [ - TaintKind::INPUT_HTML, - TaintKind::INPUT_HAS_QUOTES, - TaintKind::USER_SECRET, - TaintKind::SYSTEM_SECRET - ]; - - $statements_analyzer->data_flow_graph->addSink($echo_param_sink); - } - - if (ArgumentAnalyzer::verifyType( - $statements_analyzer, - $expr_type ?? Type::getMixed(), - Type::getString(), - null, - 'echo', - null, - (int)$i, - new CodeLocation($statements_analyzer->getSource(), $expr), - $expr, - $context, - $echo_param, - false, - null, - true, - true, - new CodeLocation($statements_analyzer, $stmt) - ) === false) { - return false; - } - } - - if ($codebase->config->forbid_echo) { - if (IssueBuffer::accepts( - new ForbiddenEcho( - 'Use of echo', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSource()->getSuppressedIssues() - )) { - return false; - } - } elseif (isset($codebase->config->forbidden_functions['echo'])) { - IssueBuffer::maybeAdd( - new ForbiddenCode( - 'Use of echo', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSource()->getSuppressedIssues() - ); - } - - if (!$context->collect_initializations && !$context->collect_mutations) { - if ($context->mutation_free || $context->external_mutation_free) { - IssueBuffer::maybeAdd( - new ImpureFunctionCall( - 'Cannot call echo from a mutation-free context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - } - - return true; - } -} 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 deleted file mode 100644 index 0a92b1a1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php +++ /dev/null @@ -1,607 +0,0 @@ -items)) { - $statements_analyzer->node_data->setType($stmt, Type::getEmptyArray()); - - return true; - } - - $codebase = $statements_analyzer->getCodebase(); - - $array_creation_info = new ArrayCreationInfo(); - - foreach ($stmt->items as $item) { - if ($item === null) { - IssueBuffer::maybeAdd( - new ParseError( - 'Array element cannot be empty', - new CodeLocation($statements_analyzer, $stmt) - ) - ); - - return false; - } - - self::analyzeArrayItem( - $statements_analyzer, - $context, - $array_creation_info, - $item, - $codebase - ); - } - - if ($array_creation_info->item_key_atomic_types) { - $item_key_type = TypeCombiner::combine( - $array_creation_info->item_key_atomic_types, - $codebase, - false, - true, - 30 - ); - } else { - $item_key_type = null; - } - - if ($array_creation_info->item_value_atomic_types) { - $item_value_type = TypeCombiner::combine( - $array_creation_info->item_value_atomic_types, - $codebase, - false, - true, - 30 - ); - } else { - $item_value_type = null; - } - - // if this array looks like an object-like array, let's return that instead - if ($item_value_type - && $item_key_type - && ($item_key_type->hasString() || $item_key_type->hasInt()) - && $array_creation_info->can_create_objectlike - && $array_creation_info->property_types - ) { - $object_like = new TKeyedArray( - $array_creation_info->property_types, - $array_creation_info->class_strings - ); - $object_like->sealed = true; - $object_like->is_list = $array_creation_info->all_list; - - $stmt_type = new Union([$object_like]); - - if ($array_creation_info->parent_taint_nodes) { - $stmt_type->parent_nodes = $array_creation_info->parent_taint_nodes; - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - return true; - } - - if ($array_creation_info->all_list) { - if (empty($array_creation_info->item_key_atomic_types)) { - $array_type = new TList($item_value_type ?? Type::getMixed()); - } else { - $array_type = new TNonEmptyList($item_value_type ?? Type::getMixed()); - $array_type->count = count($array_creation_info->property_types); - } - - $stmt_type = new Union([ - $array_type, - ]); - - if ($array_creation_info->parent_taint_nodes) { - $stmt_type->parent_nodes = $array_creation_info->parent_taint_nodes; - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - return true; - } - - if ($item_key_type) { - $bad_types = []; - $good_types = []; - - foreach ($item_key_type->getAtomicTypes() as $atomic_key_type) { - if ($atomic_key_type instanceof TMixed) { - IssueBuffer::maybeAdd( - new MixedArrayOffset( - 'Cannot create mixed offset – expecting array-key', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - $bad_types[] = $atomic_key_type; - - $good_types[] = new TArrayKey; - - - continue; - } - - if (!$atomic_key_type instanceof TString - && !$atomic_key_type instanceof TInt - && !$atomic_key_type instanceof TArrayKey - && !$atomic_key_type instanceof TTemplateParam - && !( - $atomic_key_type instanceof TObjectWithProperties - && isset($atomic_key_type->methods['__toString']) - ) - ) { - IssueBuffer::maybeAdd( - new InvalidArrayOffset( - 'Cannot create offset of type ' . $item_key_type->getKey() . ', expecting array-key', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - $bad_types[] = $atomic_key_type; - - if ($atomic_key_type instanceof TFalse) { - $good_types[] = new TLiteralInt(0); - } elseif ($atomic_key_type instanceof TTrue) { - $good_types[] = new TLiteralInt(1); - } elseif ($atomic_key_type instanceof TBool) { - $good_types[] = new TLiteralInt(0); - $good_types[] = new TLiteralInt(1); - } elseif ($atomic_key_type instanceof TLiteralFloat) { - $good_types[] = new TLiteralInt((int) $atomic_key_type->value); - } elseif ($atomic_key_type instanceof TFloat) { - $good_types[] = new TInt; - } else { - $good_types[] = new TArrayKey; - } - } - } - - if ($bad_types && $good_types) { - $item_key_type->substitute( - TypeCombiner::combine($bad_types, $codebase), - TypeCombiner::combine($good_types, $codebase) - ); - } - } - - $array_type = new TNonEmptyArray([ - $item_key_type && !$item_key_type->hasMixed() ? $item_key_type : Type::getArrayKey(), - $item_value_type ?? Type::getMixed(), - ]); - - $array_type->count = count($array_creation_info->property_types); - - $stmt_type = new Union([ - $array_type, - ]); - - if ($array_creation_info->parent_taint_nodes) { - $stmt_type->parent_nodes = $array_creation_info->parent_taint_nodes; - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - return true; - } - - private static function analyzeArrayItem( - StatementsAnalyzer $statements_analyzer, - Context $context, - ArrayCreationInfo $array_creation_info, - PhpParser\Node\Expr\ArrayItem $item, - Codebase $codebase - ): void { - if ($item->unpack) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $item->value, $context) === false) { - return; - } - - $unpacked_array_type = $statements_analyzer->node_data->getType($item->value); - - if (!$unpacked_array_type) { - return; - } - - self::handleUnpackedArray( - $statements_analyzer, - $array_creation_info, - $item, - $unpacked_array_type, - $codebase - ); - - if (($data_flow_graph = $statements_analyzer->data_flow_graph) - && $data_flow_graph instanceof VariableUseGraph - && $unpacked_array_type->parent_nodes - ) { - $var_location = new CodeLocation($statements_analyzer->getSource(), $item->value); - - $new_parent_node = DataFlowNode::getForAssignment( - 'array', - $var_location - ); - - $data_flow_graph->addNode($new_parent_node); - - foreach ($unpacked_array_type->parent_nodes as $parent_node) { - $data_flow_graph->addPath( - $parent_node, - $new_parent_node, - 'arrayvalue-assignment' - ); - } - - $array_creation_info->parent_taint_nodes += [$new_parent_node->id => $new_parent_node]; - } - - return; - } - - $item_key_value = null; - $item_key_type = null; - $item_is_list_item = false; - - if ($item->key) { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - if (ExpressionAnalyzer::analyze($statements_analyzer, $item->key, $context) === false) { - $context->inside_general_use = $was_inside_general_use; - - return; - } - $context->inside_general_use = $was_inside_general_use; - - if ($item_key_type = $statements_analyzer->node_data->getType($item->key)) { - $key_type = $item_key_type; - - if ($key_type->isNull()) { - $key_type = Type::getString(''); - } - - if ($item->key instanceof PhpParser\Node\Scalar\String_ - && preg_match('/^(0|[1-9][0-9]*)$/', $item->key->value) - && ( - (int) $item->key->value < PHP_INT_MAX || - $item->key->value === (string) PHP_INT_MAX - ) - ) { - $key_type = Type::getInt(false, (int) $item->key->value); - } - - $array_creation_info->item_key_atomic_types = array_merge( - $array_creation_info->item_key_atomic_types, - array_values($key_type->getAtomicTypes()) - ); - - if ($key_type->isSingleStringLiteral()) { - $item_key_literal_type = $key_type->getSingleStringLiteral(); - $item_key_value = $item_key_literal_type->value; - - if ($item_key_literal_type instanceof TLiteralClassString) { - $array_creation_info->class_strings[$item_key_value] = true; - } - } elseif ($key_type->isSingleIntLiteral()) { - $item_key_value = $key_type->getSingleIntLiteral()->value; - - if ($item_key_value >= $array_creation_info->int_offset) { - if ($item_key_value === $array_creation_info->int_offset) { - $item_is_list_item = true; - } - $array_creation_info->int_offset = $item_key_value + 1; - } - } - } - } else { - $item_is_list_item = true; - $item_key_value = $array_creation_info->int_offset++; - $array_creation_info->item_key_atomic_types[] = new TLiteralInt($item_key_value); - } - - if (ExpressionAnalyzer::analyze($statements_analyzer, $item->value, $context) === false) { - return; - } - - $array_creation_info->all_list = $array_creation_info->all_list && $item_is_list_item; - - if ($item_key_value !== null) { - if (isset($array_creation_info->array_keys[$item_key_value])) { - IssueBuffer::maybeAdd( - new DuplicateArrayKey( - 'Key \'' . $item_key_value . '\' already exists on array', - new CodeLocation($statements_analyzer->getSource(), $item) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $array_creation_info->array_keys[$item_key_value] = true; - } - - - if (($data_flow_graph = $statements_analyzer->data_flow_graph) - && ($data_flow_graph instanceof VariableUseGraph - || !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues())) - ) { - if ($item_value_type = $statements_analyzer->node_data->getType($item->value)) { - if ($item_value_type->parent_nodes - && !($item_value_type->isSingle() - && $item_value_type->hasLiteralValue() - && $data_flow_graph instanceof TaintFlowGraph) - ) { - $var_location = new CodeLocation($statements_analyzer->getSource(), $item); - - $new_parent_node = DataFlowNode::getForAssignment( - 'array' - . ($item_key_value !== null ? '[\'' . $item_key_value . '\']' : ''), - $var_location - ); - - $data_flow_graph->addNode($new_parent_node); - - $event = new AddRemoveTaintsEvent($item, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - foreach ($item_value_type->parent_nodes as $parent_node) { - $data_flow_graph->addPath( - $parent_node, - $new_parent_node, - 'arrayvalue-assignment' - . ($item_key_value !== null ? '-\'' . $item_key_value . '\'' : ''), - $added_taints, - $removed_taints - ); - } - - $array_creation_info->parent_taint_nodes += [$new_parent_node->id => $new_parent_node]; - } - - if ($item_key_type - && $item_key_type->parent_nodes - && $item_key_value === null - && !($item_key_type->isSingle() - && $item_key_type->hasLiteralValue() - && $data_flow_graph instanceof TaintFlowGraph) - ) { - $var_location = new CodeLocation($statements_analyzer->getSource(), $item); - - $new_parent_node = DataFlowNode::getForAssignment( - 'array', - $var_location - ); - - $data_flow_graph->addNode($new_parent_node); - - $event = new AddRemoveTaintsEvent($item, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - foreach ($item_key_type->parent_nodes as $parent_node) { - $data_flow_graph->addPath( - $parent_node, - $new_parent_node, - 'arraykey-assignment', - $added_taints, - $removed_taints - ); - } - - $array_creation_info->parent_taint_nodes += [$new_parent_node->id => $new_parent_node]; - } - } - } - - if ($item->byRef) { - $var_id = ExpressionIdentifier::getArrayVarId( - $item->value, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($var_id) { - $context->removeDescendents( - $var_id, - $context->vars_in_scope[$var_id] ?? null, - null, - $statements_analyzer - ); - - $context->vars_in_scope[$var_id] = Type::getMixed(); - } - } - - $config = $codebase->config; - - if ($item_value_type = $statements_analyzer->node_data->getType($item->value)) { - if ($item_key_value !== null - && count($array_creation_info->property_types) <= $config->max_shaped_array_size - ) { - $array_creation_info->property_types[$item_key_value] = $item_value_type; - } else { - $array_creation_info->can_create_objectlike = false; - } - - $array_creation_info->item_value_atomic_types = array_merge( - $array_creation_info->item_value_atomic_types, - array_values($item_value_type->getAtomicTypes()) - ); - } else { - $array_creation_info->item_value_atomic_types[] = new TMixed(); - - if ($item_key_value !== null - && count($array_creation_info->property_types) <= $config->max_shaped_array_size - ) { - $array_creation_info->property_types[$item_key_value] = Type::getMixed(); - } else { - $array_creation_info->can_create_objectlike = false; - } - } - } - - private static function handleUnpackedArray( - StatementsAnalyzer $statements_analyzer, - ArrayCreationInfo $array_creation_info, - PhpParser\Node\Expr\ArrayItem $item, - Union $unpacked_array_type, - Codebase $codebase - ): void { - foreach ($unpacked_array_type->getAtomicTypes() as $unpacked_atomic_type) { - if ($unpacked_atomic_type instanceof TKeyedArray) { - foreach ($unpacked_atomic_type->properties as $key => $property_value) { - if (is_string($key)) { - if ($codebase->php_major_version < 8 || - ($codebase->php_major_version === 8 && $codebase->php_minor_version < 1) - ) { - IssueBuffer::maybeAdd( - new DuplicateArrayKey( - 'String keys are not supported in unpacked arrays', - new CodeLocation($statements_analyzer->getSource(), $item->value) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - $new_offset = $key; - $array_creation_info->item_key_atomic_types[] = new TLiteralString($new_offset); - } else { - $new_offset = $array_creation_info->int_offset++; - $array_creation_info->item_key_atomic_types[] = new TLiteralInt($new_offset); - } - - $array_creation_info->item_value_atomic_types = array_merge( - $array_creation_info->item_value_atomic_types, - array_values($property_value->getAtomicTypes()) - ); - - $array_creation_info->array_keys[$new_offset] = true; - $array_creation_info->property_types[$new_offset] = $property_value; - } - } else { - $codebase = $statements_analyzer->getCodebase(); - - if ($unpacked_atomic_type instanceof TArray - || $unpacked_atomic_type instanceof TIterable - || ( - $unpacked_atomic_type instanceof TGenericObject - && $unpacked_atomic_type->hasTraversableInterface($codebase) - && count($unpacked_atomic_type->type_params) === 2 - )) { - /** @psalm-suppress PossiblyUndefinedArrayOffset provably true, but Psalm can’t see it */ - if ($unpacked_atomic_type->type_params[1]->isEmpty()) { - continue; - } - $array_creation_info->can_create_objectlike = false; - - if ($unpacked_atomic_type->type_params[0]->hasString()) { - if ($codebase->php_major_version < 8 || - ($codebase->php_major_version === 8 && $codebase->php_minor_version < 1) - ) { - IssueBuffer::maybeAdd( - new DuplicateArrayKey( - 'String keys are not supported in unpacked arrays', - new CodeLocation($statements_analyzer->getSource(), $item->value) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - $array_creation_info->item_key_atomic_types[] = new TString(); - } elseif ($unpacked_atomic_type->type_params[0]->hasInt()) { - $array_creation_info->item_key_atomic_types[] = new TInt(); - } - - $array_creation_info->item_value_atomic_types = array_merge( - $array_creation_info->item_value_atomic_types, - array_values( - isset($unpacked_atomic_type->type_params[1]) - ? $unpacked_atomic_type->type_params[1]->getAtomicTypes() - : [new TMixed()] - ) - ); - } elseif ($unpacked_atomic_type instanceof TList) { - if ($unpacked_atomic_type->type_param->isEmpty()) { - continue; - } - $array_creation_info->can_create_objectlike = false; - - $array_creation_info->item_key_atomic_types[] = new TInt(); - - $array_creation_info->item_value_atomic_types = array_merge( - $array_creation_info->item_value_atomic_types, - array_values($unpacked_atomic_type->type_param->getAtomicTypes()) - ); - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php deleted file mode 100644 index ca0e761b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php +++ /dev/null @@ -1,55 +0,0 @@ - - */ - public $item_key_atomic_types = []; - - /** - * @var list - */ - public $item_value_atomic_types = []; - - /** - * @var array - */ - public $property_types = []; - - /** - * @var array - */ - public $class_strings = []; - - /** - * @var bool - */ - public $can_create_objectlike = true; - - /** - * @var array - */ - public $array_keys = []; - - /** - * @var int - */ - public $int_offset = 0; - - /** - * @var bool - */ - public $all_list = true; - - /** - * @var array - */ - public $parent_taint_nodes = []; -} 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 deleted file mode 100644 index 0fa53eaf..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php +++ /dev/null @@ -1,4122 +0,0 @@ - 0) will be turned into an assertion to make psalm understand that in the - * if block, $a is a positive-int - */ -class AssertionFinder -{ - public const ASSIGNMENT_TO_RIGHT = 1; - public const ASSIGNMENT_TO_LEFT = -1; - - public const IS_TYPE_CHECKS = [ - 'is_string' => ['string', [Type::class, 'getString']], - 'is_int' => ['int', [Type::class, 'getInt']], - 'is_integer' => ['int', [Type::class, 'getInt']], - 'is_long' => ['int', [Type::class, 'getInt']], - 'is_bool' => ['bool', [Type::class, 'getBool']], - 'is_resource' => ['resource', [Type::class, 'getResource']], - 'is_object' => ['object', [Type::class, 'getObject']], - 'array_is_list' => ['list', [Type::class, 'getList']], - 'is_array' => ['array', [Type::class, 'getArray']], - 'is_numeric' => ['numeric', [Type::class, 'getNumeric']], - 'is_null' => ['null', [Type::class, 'getNull']], - 'is_float' => ['float', [Type::class, 'getFloat']], - 'is_real' => ['float', [Type::class, 'getFloat']], - 'is_double' => ['float', [Type::class, 'getFloat']], - 'is_scalar' => ['scalar', [Type::class, 'getScalar']], - 'is_iterable' => ['iterable'], - 'is_countable' => ['countable'], - ]; - - /** - * Gets all the type assertions in a conditional - * - * @return list>>> - */ - public static function scrapeAssertions( - PhpParser\Node\Expr $conditional, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase = null, - bool $inside_negation = false, - bool $cache = true, - bool $inside_conditional = true - ): array { - $if_types = []; - - if ($conditional instanceof PhpParser\Node\Expr\Instanceof_) { - return self::getInstanceofAssertions( - $conditional, - $codebase, - $source, - $this_class_name, - $inside_negation - ); - } - - if ($conditional instanceof PhpParser\Node\Expr\Assign) { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->var, - $this_class_name, - $source - ); - - $candidate_if_types = $inside_conditional - ? self::scrapeAssertions( - $conditional->expr, - $this_class_name, - $source, - $codebase, - $inside_negation, - $cache, - $inside_conditional - ) - : []; - - if ($var_name) { - if ($candidate_if_types) { - $if_types[$var_name] = [['@' . json_encode($candidate_if_types[0])]]; - } else { - $if_types[$var_name] = [['!falsy']]; - } - } - - return $if_types ? [$if_types] : []; - } - - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional, - $this_class_name, - $source - ); - - if ($var_name) { - $if_types[$var_name] = [['!falsy']]; - - if (!$conditional instanceof PhpParser\Node\Expr\MethodCall - && !$conditional instanceof PhpParser\Node\Expr\StaticCall - ) { - return [$if_types]; - } - } - - if ($conditional instanceof PhpParser\Node\Expr\BooleanNot) { - return []; - } - - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical || - $conditional instanceof PhpParser\Node\Expr\BinaryOp\Equal - ) { - return self::scrapeEqualityAssertions( - $conditional, - $this_class_name, - $source, - $codebase, - $cache, - $inside_conditional - ); - } - - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical || - $conditional instanceof PhpParser\Node\Expr\BinaryOp\NotEqual - ) { - return self::scrapeInequalityAssertions( - $conditional, - $this_class_name, - $source, - $codebase, - $cache, - $inside_conditional - ); - } - - //A nullsafe method call basically adds an assertion !null for the checked variable - if ($conditional instanceof PhpParser\Node\Expr\NullsafeMethodCall) { - $if_types = []; - - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->var, - $this_class_name, - $source - ); - - if ($var_name) { - $if_types[$var_name] = [['!null']]; - } - - //we may throw a RedundantNullsafeMethodCall here in the future if $var_name is never null - - return $if_types ? [$if_types] : []; - } - - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater - || $conditional instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual - ) { - return self::getGreaterAssertions( - $conditional, - $source, - $this_class_name - ); - } - - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Smaller - || $conditional instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual - ) { - return self::getSmallerAssertions( - $conditional, - $source, - $this_class_name - ); - } - - if ($conditional instanceof PhpParser\Node\Expr\FuncCall && !$conditional->isFirstClassCallable()) { - return self::processFunctionCall( - $conditional, - $this_class_name, - $source, - $codebase, - $inside_negation - ); - } - - if (($conditional instanceof PhpParser\Node\Expr\MethodCall - || $conditional instanceof PhpParser\Node\Expr\StaticCall) - && !$conditional->isFirstClassCallable() - ) { - $custom_assertions = self::processCustomAssertion($conditional, $this_class_name, $source); - - if ($custom_assertions) { - return $custom_assertions; - } - - return $if_types ? [$if_types] : []; - } - - if ($conditional instanceof PhpParser\Node\Expr\Empty_) { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->expr, - $this_class_name, - $source - ); - - if ($var_name) { - if ($conditional->expr instanceof PhpParser\Node\Expr\Variable - && $source instanceof StatementsAnalyzer - && ($var_type = $source->node_data->getType($conditional->expr)) - && !$var_type->isMixed() - && !$var_type->possibly_undefined - ) { - $if_types[$var_name] = [['falsy']]; - } else { - $if_types[$var_name] = [['empty']]; - } - } - - return $if_types ? [$if_types] : []; - } - - if ($conditional instanceof PhpParser\Node\Expr\Isset_) { - foreach ($conditional->vars as $isset_var) { - $var_name = ExpressionIdentifier::getArrayVarId( - $isset_var, - $this_class_name, - $source - ); - - if ($var_name) { - if ($isset_var instanceof PhpParser\Node\Expr\Variable - && $source instanceof StatementsAnalyzer - && ($var_type = $source->node_data->getType($isset_var)) - && !$var_type->isMixed() - && !$var_type->possibly_undefined - && !$var_type->possibly_undefined_from_try - ) { - $if_types[$var_name] = [['!null']]; - } else { - $if_types[$var_name] = [['isset']]; - } - } else { - // look for any variables we *can* use for an isset assertion - $array_root = $isset_var; - - while ($array_root instanceof PhpParser\Node\Expr\ArrayDimFetch && !$var_name) { - $array_root = $array_root->var; - - $var_name = ExpressionIdentifier::getArrayVarId( - $array_root, - $this_class_name, - $source - ); - } - - if ($var_name) { - $if_types[$var_name] = [['=isset']]; - } - } - } - - return $if_types ? [$if_types] : []; - } - - return []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional - * @return list>>> - */ - private static function scrapeEqualityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase = null, - bool $cache = true, - bool $inside_conditional = true - ): array { - $null_position = self::hasNullVariable($conditional, $source); - - if ($null_position !== null) { - return self::getNullEqualityAssertions( - $conditional, - $this_class_name, - $source, - $codebase, - $null_position - ); - } - - $true_position = self::hasTrueVariable($conditional); - - if ($true_position) { - return self::getTrueEqualityAssertions( - $conditional, - $this_class_name, - $source, - $codebase, - $cache, - $true_position - ); - } - - $false_position = self::hasFalseVariable($conditional); - - if ($false_position) { - return self::getFalseEqualityAssertions( - $conditional, - $this_class_name, - $source, - $codebase, - $cache, - $inside_conditional, - $false_position - ); - } - - $empty_array_position = self::hasEmptyArrayVariable($conditional); - - if ($empty_array_position !== null) { - return self::getEmptyArrayEqualityAssertions( - $conditional, - $this_class_name, - $source, - $codebase, - $empty_array_position - ); - } - - $gettype_position = self::hasGetTypeCheck($conditional); - - if ($gettype_position) { - return self::getGettypeEqualityAssertions( - $conditional, - $this_class_name, - $source, - $gettype_position - ); - } - - $get_debug_type_position = self::hasGetDebugTypeCheck($conditional); - - if ($get_debug_type_position) { - return self::getGetdebugtypeEqualityAssertions( - $conditional, - $this_class_name, - $source, - $get_debug_type_position - ); - } - - if (!$source instanceof StatementsAnalyzer) { - return []; - } - - $count = null; - $count_equality_position = self::hasCountEqualityCheck($conditional, $count); - - if ($count_equality_position) { - $if_types = []; - - if ($count_equality_position === self::ASSIGNMENT_TO_RIGHT) { - $count_expr = $conditional->left; - } elseif ($count_equality_position === self::ASSIGNMENT_TO_LEFT) { - $count_expr = $conditional->right; - } else { - throw new UnexpectedValueException('$count_equality_position value'); - } - - /** @var PhpParser\Node\Expr\FuncCall $count_expr */ - $var_name = ExpressionIdentifier::getArrayVarId( - $count_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - - $var_type = $source->node_data->getType($conditional->left); - $other_type = $source->node_data->getType($conditional->right); - - if ($codebase - && $other_type - && $var_type - && $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical - ) { - self::handleParadoxicalAssertions( - $source, - $var_type, - $this_class_name, - $other_type, - $codebase, - $conditional - ); - } - - if ($var_name) { - if ($count !== 0) { - $if_types[$var_name] = [['=has-exactly-' . $count]]; - } else { - $if_types[$var_name] = [['!non-empty-countable']]; - } - } - - return $if_types ? [$if_types] : []; - } - - $getclass_position = self::hasGetClassCheck($conditional, $source); - - if ($getclass_position) { - return self::getGetclassEqualityAssertions( - $conditional, - $this_class_name, - $source, - $getclass_position - ); - } - - $typed_value_position = self::hasTypedValueComparison($conditional, $source); - - if ($typed_value_position) { - return self::getTypedValueEqualityAssertions( - $conditional, - $this_class_name, - $source, - $codebase, - $typed_value_position - ); - } - - $var_type = $source->node_data->getType($conditional->left); - $other_type = $source->node_data->getType($conditional->right); - - if ($codebase - && $var_type - && $other_type - && $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical - ) { - if (!UnionTypeComparator::canExpressionTypesBeIdentical($codebase, $var_type, $other_type)) { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - $var_type->getId() . ' cannot be identical to ' . $other_type->getId(), - new CodeLocation($source, $conditional), - $var_type->getId() . ' ' . $other_type->getId() - ), - $source->getSuppressedIssues() - ); - } else { - // both side of the Identical can be asserted to the intersection of both - $intersection_type = Type::intersectUnionTypes($var_type, $other_type, $codebase); - - if ($intersection_type !== null && $intersection_type->isSingle()) { - try { - $assertion = $intersection_type->getAssertionString(); - } catch (UnexpectedValueException $e) { - // getAssertionString can't work if the Union has more than one type - return []; - } - $if_types = []; - - $var_name_left = ExpressionIdentifier::getArrayVarId( - $conditional->left, - $this_class_name, - $source - ); - - try { - $var_assertion_different = $var_type->getAssertionString() !== $assertion; - } catch (UnexpectedValueException $e) { - // if getAssertionString threw, it's different - $var_assertion_different = true; - } - - if ($var_name_left && $var_assertion_different) { - $if_types[$var_name_left] = [['='.$assertion]]; - } - - $var_name_right = ExpressionIdentifier::getArrayVarId( - $conditional->right, - $this_class_name, - $source - ); - - - try { - $other_assertion_different = $other_type->getAssertionString() !== $assertion; - } catch (UnexpectedValueException $e) { - // if getAssertionString threw, it's different - $other_assertion_different = true; - } - - if ($var_name_right && $other_assertion_different) { - $if_types[$var_name_right] = [['='.$assertion]]; - } - - return $if_types ? [$if_types] : []; - } - } - } - - return []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional - * @return list>>> - */ - private static function scrapeInequalityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase = null, - bool $cache = true, - bool $inside_conditional = true - ): array { - $null_position = self::hasNullVariable($conditional, $source); - - if ($null_position !== null) { - return self::getNullInequalityAssertions( - $conditional, - $source, - $this_class_name, - $codebase, - $null_position - ); - } - - $false_position = self::hasFalseVariable($conditional); - - if ($false_position) { - return self::getFalseInequalityAssertions( - $conditional, - $cache, - $this_class_name, - $source, - $inside_conditional, - $codebase, - $false_position - ); - } - - $true_position = self::hasTrueVariable($conditional); - - if ($true_position) { - return self::getTrueInequalityAssertions( - $true_position, - $conditional, - $this_class_name, - $source, - $codebase, - $cache, - $inside_conditional - ); - } - - $count = null; - $count_inequality_position = self::hasCountEqualityCheck($conditional, $count); - - if ($count_inequality_position) { - $if_types = []; - - if ($count_inequality_position === self::ASSIGNMENT_TO_RIGHT) { - $count_expr = $conditional->left; - } elseif ($count_inequality_position === self::ASSIGNMENT_TO_LEFT) { - $count_expr = $conditional->right; - } else { - throw new UnexpectedValueException('$count_equality_position value'); - } - - /** @var PhpParser\Node\Expr\FuncCall $count_expr */ - $var_name = ExpressionIdentifier::getArrayVarId( - $count_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - - if ($var_name) { - if ($count) { - $if_types[$var_name] = [['!has-exactly-' . $count]]; - } else { - $if_types[$var_name] = [['non-empty-countable']]; - } - } - - return $if_types ? [$if_types] : []; - } - - $empty_array_position = self::hasEmptyArrayVariable($conditional); - - if ($empty_array_position !== null) { - return self::getEmptyInequalityAssertions( - $conditional, - $this_class_name, - $source, - $codebase, - $empty_array_position - ); - } - - $gettype_position = self::hasGetTypeCheck($conditional); - - if ($gettype_position) { - return self::getGettypeInequalityAssertions( - $conditional, - $this_class_name, - $source, - $gettype_position - ); - } - - $get_debug_type_position = self::hasGetDebugTypeCheck($conditional); - - if ($get_debug_type_position) { - return self::getGetdebugTypeInequalityAssertions( - $conditional, - $this_class_name, - $source, - $get_debug_type_position - ); - } - - if (!$source instanceof StatementsAnalyzer) { - return []; - } - - $getclass_position = self::hasGetClassCheck($conditional, $source); - - if ($getclass_position) { - return self::getGetclassInequalityAssertions( - $conditional, - $this_class_name, - $source, - $getclass_position - ); - } - - $typed_value_position = self::hasTypedValueComparison($conditional, $source); - - if ($typed_value_position) { - return self::getTypedValueInequalityAssertions( - $conditional, - $this_class_name, - $source, - $codebase, - $typed_value_position - ); - } - - return []; - } - - /** - * @return list>>> - */ - public static function processFunctionCall( - PhpParser\Node\Expr\FuncCall $expr, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase = null, - bool $negate = false - ): array { - $first_var_name = isset($expr->getArgs()[0]->value) - ? ExpressionIdentifier::getArrayVarId( - $expr->getArgs()[0]->value, - $this_class_name, - $source - ) - : null; - - $if_types = []; - - $first_var_type = isset($expr->getArgs()[0]->value) - && $source instanceof StatementsAnalyzer - ? $source->node_data->getType($expr->getArgs()[0]->value) - : null; - - if ($tmp_if_types = self::handleIsTypeCheck( - $codebase, - $source, - $expr, - $first_var_name, - $first_var_type, - $expr, - $negate - )) { - $if_types = $tmp_if_types; - } elseif ($source instanceof StatementsAnalyzer && self::hasIsACheck($expr, $source)) { - return self::getIsaAssertions($expr, $source, $this_class_name, $first_var_name); - } elseif (self::hasCallableCheck($expr)) { - if ($first_var_name) { - $if_types[$first_var_name] = [['callable']]; - } elseif ($expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\Array_ - && isset($expr->getArgs()[0]->value->items[0], $expr->getArgs()[0]->value->items[1]) - && $expr->getArgs()[0]->value->items[1]->value instanceof PhpParser\Node\Scalar\String_ - ) { - $first_var_name_in_array_argument = ExpressionIdentifier::getArrayVarId( - $expr->getArgs()[0]->value->items[0]->value, - $this_class_name, - $source - ); - if ($first_var_name_in_array_argument) { - $if_types[$first_var_name_in_array_argument] = [ - ['hasmethod-' . $expr->getArgs()[0]->value->items[1]->value->value] - ]; - } - } - } elseif ($class_exists_check_type = self::hasClassExistsCheck($expr)) { - if ($first_var_name) { - $class_string_type = ($class_exists_check_type === 1 ? 'loaded-' : '') . 'class-string'; - $if_types[$first_var_name] = [[$class_string_type]]; - } - } elseif ($class_exists_check_type = self::hasTraitExistsCheck($expr)) { - if ($first_var_name) { - if ($class_exists_check_type === 2) { - $if_types[$first_var_name] = [['trait-string']]; - } else { - $if_types[$first_var_name] = [['=trait-string']]; - } - } - } elseif (self::hasInterfaceExistsCheck($expr)) { - if ($first_var_name) { - $if_types[$first_var_name] = [['interface-string']]; - } - } elseif (self::hasFunctionExistsCheck($expr)) { - if ($first_var_name) { - $if_types[$first_var_name] = [['callable-string']]; - } - } elseif ($expr->name instanceof PhpParser\Node\Name - && strtolower($expr->name->parts[0]) === 'method_exists' - && isset($expr->getArgs()[1]) - && $expr->getArgs()[1]->value instanceof PhpParser\Node\Scalar\String_ - ) { - if ($first_var_name) { - $if_types[$first_var_name] = [['hasmethod-' . $expr->getArgs()[1]->value->value]]; - } - } elseif (self::hasInArrayCheck($expr) && $source instanceof StatementsAnalyzer) { - return self::getInarrayAssertions($expr, $source, $first_var_name); - } elseif (self::hasArrayKeyExistsCheck($expr)) { - return self::getArrayKeyExistsAssertions( - $expr, - $first_var_type, - $first_var_name, - $source, - $this_class_name - ); - } elseif (self::hasNonEmptyCountCheck($expr)) { - if ($first_var_name) { - $if_types[$first_var_name] = [['non-empty-countable']]; - } - } else { - return self::processCustomAssertion($expr, $this_class_name, $source); - } - - return $if_types ? [$if_types] : []; - } - - private static function processIrreconcilableFunctionCall( - Union $first_var_type, - Union $expected_type, - PhpParser\Node\Expr $expr, - StatementsAnalyzer $source, - Codebase $codebase, - bool $negate - ): void { - if ($first_var_type->hasMixed()) { - return; - } - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $first_var_type, - $expected_type - )) { - return; - } - - if (!$negate) { - if ($first_var_type->from_docblock) { - IssueBuffer::maybeAdd( - new RedundantConditionGivenDocblockType( - 'Docblock type ' . $first_var_type . ' always contains ' . $expected_type, - new CodeLocation($source, $expr), - $first_var_type . ' ' . $expected_type - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RedundantCondition( - $first_var_type . ' always contains ' . $expected_type, - new CodeLocation($source, $expr), - $first_var_type . ' ' . $expected_type - ), - $source->getSuppressedIssues() - ); - } - } else { - if ($first_var_type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - 'Docblock type !' . $first_var_type . ' does not contain ' . $expected_type, - new CodeLocation($source, $expr), - $first_var_type . ' ' . $expected_type - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - '!' . $first_var_type . ' does not contain ' . $expected_type, - new CodeLocation($source, $expr), - $first_var_type . ' ' . $expected_type - ), - $source->getSuppressedIssues() - ); - } - } - } - - /** - * @param PhpParser\Node\Expr\FuncCall|PhpParser\Node\Expr\MethodCall|PhpParser\Node\Expr\StaticCall $expr - * - * @return list>>> - */ - protected static function processCustomAssertion( - PhpParser\Node\Expr $expr, - ?string $this_class_name, - FileSource $source - ): array { - if (!$source instanceof StatementsAnalyzer) { - return []; - } - - $if_true_assertions = $source->node_data->getIfTrueAssertions($expr); - $if_false_assertions = $source->node_data->getIfFalseAssertions($expr); - - if ($if_true_assertions === null && $if_false_assertions === null) { - return []; - } - - $first_var_name = isset($expr->getArgs()[0]->value) - ? ExpressionIdentifier::getArrayVarId( - $expr->getArgs()[0]->value, - $this_class_name, - $source - ) - : null; - - $anded_types = []; - - if ($if_true_assertions) { - foreach ($if_true_assertions as $assertion) { - $if_types = []; - - $assertion = clone $assertion; - - foreach ($assertion->rule as $i => $and_rules) { - foreach ($and_rules as $j => $rule) { - if (strpos($rule, 'class-constant(') === 0) { - $codebase = $source->getCodebase(); - try { - $assertion->rule[$i][$j] = TypeExpander::expandUnion( - $codebase, - Type::parseString(substr($rule, 15, -1)), - null, - null, - null - )->getAssertionString(); - } catch (UnexpectedValueException $e) { - continue; - } - } - } - } - - if (is_int($assertion->var_id) && isset($expr->getArgs()[$assertion->var_id])) { - if ($assertion->var_id === 0) { - $var_name = $first_var_name; - } else { - $var_name = ExpressionIdentifier::getArrayVarId( - $expr->getArgs()[$assertion->var_id]->value, - $this_class_name, - $source - ); - } - - if ($var_name) { - $if_types[$var_name] = [[$assertion->rule[0][0]]]; - } - } elseif ($assertion->var_id === '$this') { - if (!$expr instanceof PhpParser\Node\Expr\MethodCall) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Assertion of $this can be done only on method of a class', - new CodeLocation($source, $expr) - ) - ); - continue; - } - - $var_id = ExpressionIdentifier::getArrayVarId( - $expr->var, - $this_class_name, - $source - ); - - if ($var_id) { - $if_types[$var_id] = [[$assertion->rule[0][0]]]; - } - } elseif (is_string($assertion->var_id)) { - $is_function = substr($assertion->var_id, -2) === '()'; - $exploded_id = explode('->', $assertion->var_id); - $var_id = $exploded_id[0] ?? null; - $property = $exploded_id[1] ?? null; - - if (is_numeric($var_id) && null !== $property && !$is_function) { - $args = $expr->getArgs(); - - if (!array_key_exists($var_id, $args)) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Variable '.$var_id.' is not an argument so cannot be asserted', - new CodeLocation($source, $expr) - ) - ); - continue; - } - - $arg_value = $args[$var_id]->value; - assert($arg_value instanceof PhpParser\Node\Expr\Variable); - - $arg_var_id = ExpressionIdentifier::getArrayVarId($arg_value, null, $source); - - if (null === $arg_var_id) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Variable being asserted as argument ' . ($var_id+1) . ' cannot be found - in local scope', - new CodeLocation($source, $expr) - ) - ); - continue; - } - - if (count($exploded_id) === 2) { - $failedMessage = self::isPropertyImmutableOnArgument( - $property, - $source->getNodeTypeProvider(), - $source->getCodebase()->classlike_storage_provider, - $arg_value - ); - - if (null !== $failedMessage) { - IssueBuffer::maybeAdd( - new InvalidDocblock($failedMessage, new CodeLocation($source, $expr)) - ); - continue; - } - } - - $assertion_var_id = str_replace($var_id, $arg_var_id, $assertion->var_id); - } elseif (!$expr instanceof PhpParser\Node\Expr\FuncCall) { - $assertion_var_id = $assertion->var_id; - - if (strpos($assertion_var_id, 'self::') === 0) { - $assertion_var_id = $this_class_name.'::'.substr($assertion_var_id, 6); - } - } else { - IssueBuffer::maybeAdd( - new InvalidDocblock( - sprintf('Assertion of variable "%s" cannot be recognized', $assertion->var_id), - new CodeLocation($source, $expr) - ) - ); - continue; - } - $if_types[$assertion_var_id] = [[$assertion->rule[0][0]]]; - } - - if ($if_types) { - $anded_types[] = $if_types; - } - } - } - - if ($if_false_assertions) { - foreach ($if_false_assertions as $assertion) { - $if_types = []; - - $assertion = clone $assertion; - - foreach ($assertion->rule as $i => $and_rules) { - foreach ($and_rules as $j => $rule) { - if (strpos($rule, 'class-constant(') === 0) { - $codebase = $source->getCodebase(); - - try { - $assertion->rule[$i][$j] = TypeExpander::expandUnion( - $codebase, - Type::parseString(substr($rule, 15, -1)), - null, - null, - null - )->getAssertionString(); - } catch (UnexpectedValueException $e) { - continue; - } - } - } - } - - if (is_int($assertion->var_id) && isset($expr->getArgs()[$assertion->var_id])) { - if ($assertion->var_id === 0) { - $var_name = $first_var_name; - } else { - $var_name = ExpressionIdentifier::getArrayVarId( - $expr->getArgs()[$assertion->var_id]->value, - $this_class_name, - $source - ); - } - - if ($var_name) { - if ('!' === $assertion->rule[0][0][0]) { - $if_types[$var_name] = [[substr($assertion->rule[0][0], 1)]]; - } else { - $if_types[$var_name] = [['!' . $assertion->rule[0][0]]]; - } - } - } elseif ($assertion->var_id === '$this' && $expr instanceof PhpParser\Node\Expr\MethodCall) { - $var_id = ExpressionIdentifier::getArrayVarId( - $expr->var, - $this_class_name, - $source - ); - - if ($var_id) { - if ('!' === $assertion->rule[0][0][0]) { - $if_types[$var_id] = [[substr($assertion->rule[0][0], 1)]]; - } else { - $if_types[$var_id] = [['!' . $assertion->rule[0][0]]]; - } - } - } elseif (is_string($assertion->var_id)) { - $is_function = substr($assertion->var_id, -2) === '()'; - $exploded_id = explode('->', $assertion->var_id); - $var_id = $exploded_id[0] ?? null; - $property = $exploded_id[1] ?? null; - - if (is_numeric($var_id) && null !== $property && !$is_function) { - $args = $expr->getArgs(); - - if (!array_key_exists($var_id, $args)) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Variable '.$var_id.' is not an argument so cannot be asserted', - new CodeLocation($source, $expr) - ) - ); - continue; - } - /** @var PhpParser\Node\Expr\Variable $arg_value */ - $arg_value = $args[$var_id]->value; - - $arg_var_id = ExpressionIdentifier::getArrayVarId($arg_value, null, $source); - - if (null === $arg_var_id) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Variable being asserted as argument ' . ($var_id+1) . ' cannot be found - in local scope', - new CodeLocation($source, $expr) - ) - ); - continue; - } - - if (count($exploded_id) === 2) { - $failedMessage = self::isPropertyImmutableOnArgument( - $property, - $source->getNodeTypeProvider(), - $source->getCodebase()->classlike_storage_provider, - $arg_value - ); - - if (null !== $failedMessage) { - IssueBuffer::maybeAdd( - new InvalidDocblock($failedMessage, new CodeLocation($source, $expr)) - ); - continue; - } - } - - if ('!' === $assertion->rule[0][0][0]) { - $rule = substr($assertion->rule[0][0], 1); - } else { - $rule = '!' . $assertion->rule[0][0]; - } - $assertion_var_id = str_replace($var_id, $arg_var_id, $assertion->var_id); - - $if_types[$assertion_var_id] = [[$rule]]; - } elseif (!$expr instanceof PhpParser\Node\Expr\FuncCall) { - $var_id = $assertion->var_id; - if (strpos($var_id, 'self::') === 0) { - $var_id = $this_class_name.'::'.substr($var_id, 6); - } - $if_types[$var_id] = [['!'.$assertion->rule[0][0]]]; - } else { - IssueBuffer::maybeAdd( - new InvalidDocblock( - sprintf('Assertion of variable "%s" cannot be recognized', $assertion->var_id), - new CodeLocation($source, $expr) - ) - ); - } - } - - if ($if_types) { - $anded_types[] = $if_types; - } - } - } - - return $anded_types; - } - - /** - * @return list - */ - protected static function getInstanceOfTypes( - PhpParser\Node\Expr\Instanceof_ $stmt, - ?string $this_class_name, - FileSource $source - ): array { - if ($stmt->class instanceof PhpParser\Node\Name) { - if (!in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true)) { - $instanceof_class = ClassLikeAnalyzer::getFQCLNFromNameObject( - $stmt->class, - $source->getAliases() - ); - - if ($source instanceof StatementsAnalyzer) { - $codebase = $source->getCodebase(); - $instanceof_class = $codebase->classlikes->getUnAliasedName($instanceof_class); - } - - return [$instanceof_class]; - } - - if ($this_class_name - && (in_array(strtolower($stmt->class->parts[0]), ['self', 'static'], true))) { - if ($stmt->class->parts[0] === 'static') { - return ['=' . $this_class_name . '&static']; - } - - return [$this_class_name]; - } - } elseif ($source instanceof StatementsAnalyzer) { - $stmt_class_type = $source->node_data->getType($stmt->class); - - if ($stmt_class_type) { - $literal_class_strings = []; - - foreach ($stmt_class_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TLiteralClassString) { - $literal_class_strings[] = $atomic_type->value; - } elseif ($atomic_type instanceof TTemplateParamClass) { - $literal_class_strings[] = $atomic_type->param_name; - } elseif ($atomic_type instanceof TClassString && $atomic_type->as !== 'object') { - $literal_class_strings[] = $atomic_type->as; - } - } - - return $literal_class_strings; - } - } - - return []; - } - - /** - * @param Identical|Equal|NotIdentical|NotEqual $conditional - */ - protected static function hasNullVariable( - PhpParser\Node\Expr\BinaryOp $conditional, - FileSource $source - ): ?int { - if ($conditional->right instanceof PhpParser\Node\Expr\ConstFetch - && strtolower($conditional->right->name->parts[0]) === 'null' - ) { - return self::ASSIGNMENT_TO_RIGHT; - } - - if ($conditional->left instanceof PhpParser\Node\Expr\ConstFetch - && strtolower($conditional->left->name->parts[0]) === 'null' - ) { - return self::ASSIGNMENT_TO_LEFT; - } - - if ($source instanceof StatementsAnalyzer - && ($right_type = $source->node_data->getType($conditional->right)) - && $right_type->isNull() - ) { - return self::ASSIGNMENT_TO_RIGHT; - } - - return null; - } - - /** - * @param Identical|Equal|NotIdentical|NotEqual $conditional - */ - public static function hasFalseVariable( - PhpParser\Node\Expr\BinaryOp $conditional - ): ?int { - if ($conditional->right instanceof PhpParser\Node\Expr\ConstFetch - && strtolower($conditional->right->name->parts[0]) === 'false' - ) { - return self::ASSIGNMENT_TO_RIGHT; - } - - if ($conditional->left instanceof PhpParser\Node\Expr\ConstFetch - && strtolower($conditional->left->name->parts[0]) === 'false' - ) { - return self::ASSIGNMENT_TO_LEFT; - } - - return null; - } - - /** - * @param Identical|Equal|NotIdentical|NotEqual $conditional - */ - public static function hasTrueVariable( - PhpParser\Node\Expr\BinaryOp $conditional - ): ?int { - if ($conditional->right instanceof PhpParser\Node\Expr\ConstFetch - && strtolower($conditional->right->name->parts[0]) === 'true' - ) { - return self::ASSIGNMENT_TO_RIGHT; - } - - if ($conditional->left instanceof PhpParser\Node\Expr\ConstFetch - && strtolower($conditional->left->name->parts[0]) === 'true' - ) { - return self::ASSIGNMENT_TO_LEFT; - } - - return null; - } - - /** - * @param Identical|Equal|NotIdentical|NotEqual $conditional - */ - protected static function hasEmptyArrayVariable( - PhpParser\Node\Expr\BinaryOp $conditional - ): ?int { - if ($conditional->right instanceof PhpParser\Node\Expr\Array_ - && !$conditional->right->items - ) { - return self::ASSIGNMENT_TO_RIGHT; - } - - if ($conditional->left instanceof PhpParser\Node\Expr\Array_ - && !$conditional->left->items - ) { - return self::ASSIGNMENT_TO_LEFT; - } - - return null; - } - - /** - * @param Identical|Equal|NotIdentical|NotEqual $conditional - * @return false|int - */ - protected static function hasGetTypeCheck( - PhpParser\Node\Expr\BinaryOp $conditional - ) { - if ($conditional->right instanceof PhpParser\Node\Expr\FuncCall - && $conditional->right->name instanceof PhpParser\Node\Name - && strtolower($conditional->right->name->parts[0]) === 'gettype' - && $conditional->right->getArgs() - && $conditional->left instanceof PhpParser\Node\Scalar\String_ - ) { - return self::ASSIGNMENT_TO_RIGHT; - } - - if ($conditional->left instanceof PhpParser\Node\Expr\FuncCall - && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'gettype' - && $conditional->left->getArgs() - && $conditional->right instanceof PhpParser\Node\Scalar\String_ - ) { - return self::ASSIGNMENT_TO_LEFT; - } - - return false; - } - - /** - * @param Identical|Equal|NotIdentical|NotEqual $conditional - * @return false|int - */ - protected static function hasGetDebugTypeCheck( - PhpParser\Node\Expr\BinaryOp $conditional - ) { - if ($conditional->right instanceof PhpParser\Node\Expr\FuncCall - && $conditional->right->name instanceof PhpParser\Node\Name - && strtolower($conditional->right->name->parts[0]) === 'get_debug_type' - && $conditional->right->getArgs() - && ($conditional->left instanceof PhpParser\Node\Scalar\String_ - || $conditional->left instanceof PhpParser\Node\Expr\ClassConstFetch) - ) { - return self::ASSIGNMENT_TO_RIGHT; - } - - if ($conditional->left instanceof PhpParser\Node\Expr\FuncCall - && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'get_debug_type' - && $conditional->left->getArgs() - && ($conditional->right instanceof PhpParser\Node\Scalar\String_ - || $conditional->right instanceof PhpParser\Node\Expr\ClassConstFetch) - ) { - return self::ASSIGNMENT_TO_LEFT; - } - - return false; - } - - /** - * @param Identical|Equal|NotIdentical|NotEqual $conditional - * @return false|int - */ - protected static function hasGetClassCheck( - PhpParser\Node\Expr\BinaryOp $conditional, - FileSource $source - ) { - if (!$source instanceof StatementsAnalyzer) { - return false; - } - - $right_get_class = $conditional->right instanceof PhpParser\Node\Expr\FuncCall - && $conditional->right->name instanceof PhpParser\Node\Name - && strtolower($conditional->right->name->parts[0]) === 'get_class'; - - $right_static_class = $conditional->right instanceof PhpParser\Node\Expr\ClassConstFetch - && $conditional->right->class instanceof PhpParser\Node\Name - && $conditional->right->class->parts === ['static'] - && $conditional->right->name instanceof PhpParser\Node\Identifier - && strtolower($conditional->right->name->name) === 'class'; - - $right_variable_class_const = $conditional->right instanceof PhpParser\Node\Expr\ClassConstFetch - && $conditional->right->class instanceof PhpParser\Node\Expr\Variable - && $conditional->right->name instanceof PhpParser\Node\Identifier - && strtolower($conditional->right->name->name) === 'class'; - - $left_class_string = $conditional->left instanceof PhpParser\Node\Expr\ClassConstFetch - && $conditional->left->class instanceof PhpParser\Node\Name - && $conditional->left->name instanceof PhpParser\Node\Identifier - && strtolower($conditional->left->name->name) === 'class'; - - $left_type = $source->node_data->getType($conditional->left); - - $left_class_string_t = false; - - if ($left_type && $left_type->isSingle()) { - foreach ($left_type->getAtomicTypes() as $type_part) { - if ($type_part instanceof TClassString) { - $left_class_string_t = true; - break; - } - } - } - - if (($right_get_class || $right_static_class || $right_variable_class_const) - && ($left_class_string || $left_class_string_t) - ) { - return self::ASSIGNMENT_TO_RIGHT; - } - - $left_get_class = $conditional->left instanceof PhpParser\Node\Expr\FuncCall - && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'get_class'; - - $left_static_class = $conditional->left instanceof PhpParser\Node\Expr\ClassConstFetch - && $conditional->left->class instanceof PhpParser\Node\Name - && $conditional->left->class->parts === ['static'] - && $conditional->left->name instanceof PhpParser\Node\Identifier - && strtolower($conditional->left->name->name) === 'class'; - - $left_variable_class_const = $conditional->left instanceof PhpParser\Node\Expr\ClassConstFetch - && $conditional->left->class instanceof PhpParser\Node\Expr\Variable - && $conditional->left->name instanceof PhpParser\Node\Identifier - && strtolower($conditional->left->name->name) === 'class'; - - $right_class_string = $conditional->right instanceof PhpParser\Node\Expr\ClassConstFetch - && $conditional->right->class instanceof PhpParser\Node\Name - && $conditional->right->name instanceof PhpParser\Node\Identifier - && strtolower($conditional->right->name->name) === 'class'; - - $right_type = $source->node_data->getType($conditional->right); - - $right_class_string_t = false; - - if ($right_type && $right_type->isSingle()) { - foreach ($right_type->getAtomicTypes() as $type_part) { - if ($type_part instanceof TClassString) { - $right_class_string_t = true; - break; - } - } - } - - if (($left_get_class || $left_static_class || $left_variable_class_const) - && ($right_class_string || $right_class_string_t) - ) { - return self::ASSIGNMENT_TO_LEFT; - } - - return false; - } - - /** - * @param Greater|GreaterOrEqual|Smaller|SmallerOrEqual $conditional - * @return false|int - */ - protected static function hasNonEmptyCountEqualityCheck( - PhpParser\Node\Expr\BinaryOp $conditional, - ?int &$min_count - ) { - if ($conditional->left instanceof PhpParser\Node\Expr\FuncCall - && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'count' - && $conditional->left->getArgs() - && ($conditional instanceof BinaryOp\Greater || $conditional instanceof BinaryOp\GreaterOrEqual) - ) { - $assignment_to = self::ASSIGNMENT_TO_RIGHT; - $compare_to = $conditional->right; - $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' - && $conditional->right->getArgs() - && ($conditional instanceof BinaryOp\Smaller || $conditional instanceof BinaryOp\SmallerOrEqual) - ) { - $assignment_to = self::ASSIGNMENT_TO_LEFT; - $compare_to = $conditional->left; - $comparison_adjustment = $conditional instanceof BinaryOp\Smaller ? 1 : 0; - } else { - return false; - } - - // TODO get node type provider here somehow and check literal ints and int ranges - if ($compare_to instanceof PhpParser\Node\Scalar\LNumber - && $compare_to->value > (-1 * $comparison_adjustment) - ) { - $min_count = $compare_to->value + $comparison_adjustment; - - return $assignment_to; - } - - return false; - } - - /** - * @param Greater|GreaterOrEqual|Smaller|SmallerOrEqual $conditional - * @return false|int - */ - protected static function hasLessThanCountEqualityCheck( - PhpParser\Node\Expr\BinaryOp $conditional, - ?int &$max_count - ) { - $left_count = $conditional->left instanceof PhpParser\Node\Expr\FuncCall - && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'count' - && $conditional->left->getArgs(); - - $operator_less_than_or_equal = - $conditional instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual - || $conditional instanceof PhpParser\Node\Expr\BinaryOp\Smaller; - - if ($left_count - && $operator_less_than_or_equal - && $conditional->right instanceof PhpParser\Node\Scalar\LNumber - ) { - $max_count = $conditional->right->value - - ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Smaller ? 1 : 0); - - return self::ASSIGNMENT_TO_RIGHT; - } - - $right_count = $conditional->right instanceof PhpParser\Node\Expr\FuncCall - && $conditional->right->name instanceof PhpParser\Node\Name - && strtolower($conditional->right->name->parts[0]) === 'count' - && $conditional->right->getArgs(); - - $operator_greater_than_or_equal = - $conditional instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual - || $conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater; - - if ($right_count - && $operator_greater_than_or_equal - && $conditional->left instanceof PhpParser\Node\Scalar\LNumber - ) { - $max_count = $conditional->left->value - - ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater ? 1 : 0); - - return self::ASSIGNMENT_TO_LEFT; - } - - return false; - } - - /** - * @param Equal|Identical|NotEqual|NotIdentical $conditional - * @return false|int - */ - protected static function hasCountEqualityCheck( - PhpParser\Node\Expr\BinaryOp $conditional, - ?int &$count - ) { - $left_count = $conditional->left instanceof PhpParser\Node\Expr\FuncCall - && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'count' - && $conditional->left->getArgs(); - - if ($left_count && $conditional->right instanceof PhpParser\Node\Scalar\LNumber) { - $count = $conditional->right->value; - - return self::ASSIGNMENT_TO_RIGHT; - } - - $right_count = $conditional->right instanceof PhpParser\Node\Expr\FuncCall - && $conditional->right->name instanceof PhpParser\Node\Name - && strtolower($conditional->right->name->parts[0]) === 'count' - && $conditional->right->getArgs(); - - if ($right_count && $conditional->left instanceof PhpParser\Node\Scalar\LNumber) { - $count = $conditional->left->value; - - return self::ASSIGNMENT_TO_LEFT; - } - - return false; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Greater|PhpParser\Node\Expr\BinaryOp\GreaterOrEqual $conditional - * @return false|int - */ - protected static function hasSuperiorNumberCheck( - FileSource $source, - PhpParser\Node\Expr\BinaryOp $conditional, - ?int &$literal_value_comparison, - bool &$isset_assert - ) { - $right_assignment = false; - $value_right = null; - if ($source instanceof StatementsAnalyzer - && ($type = $source->node_data->getType($conditional->right)) - && $type->isSingleIntLiteral() - ) { - $right_assignment = true; - $value_right = $type->getSingleIntLiteral()->value; - } elseif ($conditional->right instanceof LNumber) { - $right_assignment = true; - $value_right = $conditional->right->value; - } elseif ($conditional->right instanceof UnaryMinus && $conditional->right->expr instanceof LNumber) { - $right_assignment = true; - $value_right = -$conditional->right->expr->value; - } elseif ($conditional->right instanceof UnaryPlus && $conditional->right->expr instanceof LNumber) { - $right_assignment = true; - $value_right = $conditional->right->expr->value; - } - if ($right_assignment === true && $value_right !== null) { - $isset_assert = $value_right === 0 && $conditional instanceof Greater; - - $literal_value_comparison = $value_right + - ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater ? 1 : 0); - - return self::ASSIGNMENT_TO_RIGHT; - } - - $left_assignment = false; - $value_left = null; - if ($source instanceof StatementsAnalyzer - && ($type = $source->node_data->getType($conditional->left)) - && $type->isSingleIntLiteral() - ) { - $left_assignment = true; - $value_left = $type->getSingleIntLiteral()->value; - } elseif ($conditional->left instanceof LNumber) { - $left_assignment = true; - $value_left = $conditional->left->value; - } elseif ($conditional->left instanceof UnaryMinus && $conditional->left->expr instanceof LNumber) { - $left_assignment = true; - $value_left = -$conditional->left->expr->value; - } elseif ($conditional->left instanceof UnaryPlus && $conditional->left->expr instanceof LNumber) { - $left_assignment = true; - $value_left = $conditional->left->expr->value; - } - if ($left_assignment === true && $value_left !== null) { - $isset_assert = $value_left === 0 && $conditional instanceof Greater; - - $literal_value_comparison = $value_left + - ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater ? -1 : 0); - - return self::ASSIGNMENT_TO_LEFT; - } - - return false; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Smaller|PhpParser\Node\Expr\BinaryOp\SmallerOrEqual $conditional - * @return false|int - */ - protected static function hasInferiorNumberCheck( - FileSource $source, - PhpParser\Node\Expr\BinaryOp $conditional, - ?int &$literal_value_comparison, - bool &$isset_assert - ) { - $right_assignment = false; - $value_right = null; - if ($source instanceof StatementsAnalyzer - && ($type = $source->node_data->getType($conditional->right)) - && $type->isSingleIntLiteral() - ) { - $right_assignment = true; - $value_right = $type->getSingleIntLiteral()->value; - } elseif ($conditional->right instanceof LNumber) { - $right_assignment = true; - $value_right = $conditional->right->value; - } elseif ($conditional->right instanceof UnaryMinus && $conditional->right->expr instanceof LNumber) { - $right_assignment = true; - $value_right = -$conditional->right->expr->value; - } elseif ($conditional->right instanceof UnaryPlus && $conditional->right->expr instanceof LNumber) { - $right_assignment = true; - $value_right = $conditional->right->expr->value; - } - if ($right_assignment === true && $value_right !== null) { - $isset_assert = $value_right === 0 && $conditional instanceof Smaller; - - $literal_value_comparison = $value_right + - ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Smaller ? -1 : 0); - return self::ASSIGNMENT_TO_RIGHT; - } - - $left_assignment = false; - $value_left = null; - if ($source instanceof StatementsAnalyzer - && ($type = $source->node_data->getType($conditional->left)) - && $type->isSingleIntLiteral() - ) { - $left_assignment = true; - $value_left = $type->getSingleIntLiteral()->value; - } elseif ($conditional->left instanceof LNumber) { - $left_assignment = true; - $value_left = $conditional->left->value; - } elseif ($conditional->left instanceof UnaryMinus && $conditional->left->expr instanceof LNumber) { - $left_assignment = true; - $value_left = -$conditional->left->expr->value; - } elseif ($conditional->left instanceof UnaryPlus && $conditional->left->expr instanceof LNumber) { - $left_assignment = true; - $value_left = $conditional->left->expr->value; - } - if ($left_assignment === true && $value_left !== null) { - $isset_assert = $value_left === 0 && $conditional instanceof Smaller; - - $literal_value_comparison = $value_left + - ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Smaller ? 1 : 0); - - return self::ASSIGNMENT_TO_LEFT; - } - - return false; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Greater|PhpParser\Node\Expr\BinaryOp\GreaterOrEqual $conditional - * @return false|int - */ - protected static function hasReconcilableNonEmptyCountEqualityCheck( - PhpParser\Node\Expr\BinaryOp $conditional - ) { - $left_count = $conditional->left instanceof PhpParser\Node\Expr\FuncCall - && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'count'; - - $right_number = $conditional->right instanceof PhpParser\Node\Scalar\LNumber - && $conditional->right->value === ( - $conditional instanceof PhpParser\Node\Expr\BinaryOp\Greater ? 0 : 1); - - if ($left_count && $right_number) { - return self::ASSIGNMENT_TO_RIGHT; - } - - return false; - } - - /** - * @param Identical|Equal|Smaller|SmallerOrEqual|NotIdentical|NotEqual $conditional - * @return false|int - */ - protected static function hasTypedValueComparison( - PhpParser\Node\Expr\BinaryOp $conditional, - FileSource $source - ) { - if (!$source instanceof StatementsAnalyzer) { - return false; - } - - if (($right_type = $source->node_data->getType($conditional->right)) - && ((!$conditional->right instanceof PhpParser\Node\Expr\Variable - && !$conditional->right instanceof PhpParser\Node\Expr\PropertyFetch - && !$conditional->right instanceof PhpParser\Node\Expr\StaticPropertyFetch) - || $conditional->left instanceof PhpParser\Node\Expr\Variable - || $conditional->left instanceof PhpParser\Node\Expr\PropertyFetch - || $conditional->left instanceof PhpParser\Node\Expr\StaticPropertyFetch) - && count($right_type->getAtomicTypes()) === 1 - && !$right_type->hasMixed() - ) { - return self::ASSIGNMENT_TO_RIGHT; - } - - if (($left_type = $source->node_data->getType($conditional->left)) - && !$conditional->left instanceof PhpParser\Node\Expr\Variable - && !$conditional->left instanceof PhpParser\Node\Expr\PropertyFetch - && !$conditional->left instanceof PhpParser\Node\Expr\StaticPropertyFetch - && count($left_type->getAtomicTypes()) === 1 - && !$left_type->hasMixed() - ) { - return self::ASSIGNMENT_TO_LEFT; - } - - return false; - } - - protected static function hasIsACheck( - PhpParser\Node\Expr\FuncCall $stmt, - StatementsAnalyzer $source - ): bool { - if ($stmt->name instanceof PhpParser\Node\Name - && (strtolower($stmt->name->parts[0]) === 'is_a' - || strtolower($stmt->name->parts[0]) === 'is_subclass_of') - && isset($stmt->getArgs()[1]) - ) { - $second_arg = $stmt->getArgs()[1]->value; - - if ($second_arg instanceof PhpParser\Node\Scalar\String_ - || ( - $second_arg instanceof PhpParser\Node\Expr\ClassConstFetch - && $second_arg->class instanceof PhpParser\Node\Name - && $second_arg->name instanceof PhpParser\Node\Identifier - && strtolower($second_arg->name->name) === 'class' - ) - || (($second_arg_type = $source->node_data->getType($second_arg)) - && $second_arg_type->hasString()) - ) { - return true; - } - } - - return false; - } - - /** - * @return array>> - */ - private static function handleIsTypeCheck( - ?Codebase $codebase, - FileSource $source, - PhpParser\Node\Expr\FuncCall $stmt, - ?string $first_var_name, - ?Union $first_var_type, - PhpParser\Node\Expr\FuncCall $expr, - bool $negate - ): array { - $if_types = []; - if ($stmt->name instanceof PhpParser\Node\Name - && ($function_name = strtolower($stmt->name->parts[0])) - && isset(self::IS_TYPE_CHECKS[$function_name]) - && $source instanceof StatementsAnalyzer - && ($source->getNamespace() === null //either the namespace is null - || $stmt->name instanceof PhpParser\Node\Name\FullyQualified //or we have a FQ to base function - || isset($source->getAliases()->functions[$function_name]) //or it is imported - || ($codebase && !$codebase->functions->functionExists( - $source, - strtolower($source->getNamespace()."\\".$function_name) - )) //or this function name does not exist in current namespace - ) - ) { - if ($first_var_name) { - $if_types[$first_var_name] = [[self::IS_TYPE_CHECKS[$function_name][0]]]; - } elseif ($first_var_type - && $codebase - ) { - if (isset(self::IS_TYPE_CHECKS[$function_name][1])) { - $callable = self::IS_TYPE_CHECKS[$function_name][1]; - assert(is_callable($callable)); - $type = $callable(); - assert($type instanceof Union); - self::processIrreconcilableFunctionCall( - $first_var_type, - $type, - $expr, - $source, - $codebase, - $negate - ); - } - } - } - - return $if_types; - } - - protected static function hasCallableCheck(PhpParser\Node\Expr\FuncCall $stmt): bool - { - return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'is_callable'; - } - - /** - * @return Reconciler::RECONCILIATION_* - */ - protected static function hasClassExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): int - { - if ($stmt->name instanceof PhpParser\Node\Name - && strtolower($stmt->name->parts[0]) === 'class_exists' - ) { - if (!isset($stmt->getArgs()[1])) { - return 2; - } - - $second_arg = $stmt->getArgs()[1]->value; - - if ($second_arg instanceof PhpParser\Node\Expr\ConstFetch - && strtolower($second_arg->name->parts[0]) === 'true' - ) { - return 2; - } - - return 1; - } - - return 0; - } - - /** - * @return 0|1|2 - */ - protected static function hasTraitExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): int - { - if ($stmt->name instanceof PhpParser\Node\Name - && strtolower($stmt->name->parts[0]) === 'trait_exists' - ) { - if (!isset($stmt->getArgs()[1])) { - return 2; - } - - $second_arg = $stmt->getArgs()[1]->value; - - if ($second_arg instanceof PhpParser\Node\Expr\ConstFetch - && strtolower($second_arg->name->parts[0]) === 'true' - ) { - return 2; - } - - return 1; - } - - return 0; - } - - protected static function hasInterfaceExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): bool - { - return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'interface_exists'; - } - - protected static function hasFunctionExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): bool - { - return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'function_exists'; - } - - protected static function hasInArrayCheck(PhpParser\Node\Expr\FuncCall $stmt): bool - { - if ($stmt->name instanceof PhpParser\Node\Name - && strtolower($stmt->name->parts[0]) === 'in_array' - && isset($stmt->getArgs()[2]) - ) { - $second_arg = $stmt->getArgs()[2]->value; - - if ($second_arg instanceof PhpParser\Node\Expr\ConstFetch - && strtolower($second_arg->name->parts[0]) === 'true' - ) { - return true; - } - } - - return false; - } - - protected static function hasNonEmptyCountCheck(PhpParser\Node\Expr\FuncCall $stmt): bool - { - return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'count'; - } - - protected static function hasArrayKeyExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): bool - { - return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'array_key_exists'; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional - * @return list>>> - */ - private static function getNullInequalityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - FileSource $source, - ?string $this_class_name, - ?Codebase $codebase, - int $null_position - ): array { - $if_types = []; - - if ($null_position === self::ASSIGNMENT_TO_RIGHT) { - $base_conditional = $conditional->left; - } elseif ($null_position === self::ASSIGNMENT_TO_LEFT) { - $base_conditional = $conditional->right; - } else { - throw new UnexpectedValueException('Bad null variable position'); - } - - $var_name = ExpressionIdentifier::getArrayVarId( - $base_conditional, - $this_class_name, - $source - ); - - if ($var_name) { - if ($base_conditional instanceof PhpParser\Node\Expr\Assign) { - $var_name = '=' . $var_name; - } - - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { - $if_types[$var_name] = [['!null']]; - } else { - $if_types[$var_name] = [['!falsy']]; - } - } - - if ($codebase - && $source instanceof StatementsAnalyzer - && ($var_type = $source->node_data->getType($base_conditional)) - ) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { - $null_type = Type::getNull(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $var_type, - $null_type - ) && !UnionTypeComparator::isContainedBy( - $codebase, - $null_type, - $var_type - )) { - if ($var_type->from_docblock) { - IssueBuffer::maybeAdd( - new RedundantConditionGivenDocblockType( - 'Docblock-defined type ' . $var_type . ' can never contain null', - new CodeLocation($source, $conditional), - $var_type->getId() . ' null' - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RedundantCondition( - $var_type . ' can never contain null', - new CodeLocation($source, $conditional), - $var_type->getId() . ' null' - ), - $source->getSuppressedIssues() - ); - } - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional - * @return list>>> - */ - private static function getFalseInequalityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - bool $cache, - ?string $this_class_name, - FileSource $source, - bool $inside_conditional, - ?Codebase $codebase, - int $false_position - ): array { - $if_types = []; - - if ($false_position === self::ASSIGNMENT_TO_RIGHT) { - $base_conditional = $conditional->left; - } elseif ($false_position === self::ASSIGNMENT_TO_LEFT) { - $base_conditional = $conditional->right; - } else { - throw new UnexpectedValueException('Bad false variable position'); - } - - $var_name = ExpressionIdentifier::getArrayVarId( - $base_conditional, - $this_class_name, - $source - ); - - if ($var_name) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { - $if_types[$var_name] = [['!false']]; - } else { - $if_types[$var_name] = [['!falsy']]; - } - - $if_types = [$if_types]; - } else { - $if_types = null; - - if ($source instanceof StatementsAnalyzer && $cache) { - $if_types = $source->node_data->getAssertions($base_conditional); - } - - if ($if_types === null) { - $if_types = self::scrapeAssertions( - $base_conditional, - $this_class_name, - $source, - $codebase, - false, - $cache, - $inside_conditional - ); - - if ($source instanceof StatementsAnalyzer && $cache) { - $source->node_data->setAssertions($base_conditional, $if_types); - } - } - } - - if ($codebase - && $source instanceof StatementsAnalyzer - && ($var_type = $source->node_data->getType($base_conditional)) - && $conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical - ) { - $config = $source->getCodebase()->config; - - if ($config->strict_binary_operands - && $var_type->isSingle() - && $var_type->hasBool() - && !$var_type->from_docblock - ) { - IssueBuffer::maybeAdd( - new RedundantIdentityWithTrue( - 'The "!== false" part of this comparison is redundant', - new CodeLocation($source, $conditional) - ), - $source->getSuppressedIssues() - ); - } - - $false_type = Type::getFalse(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $var_type, - $false_type - ) && !UnionTypeComparator::isContainedBy( - $codebase, - $false_type, - $var_type - )) { - if ($var_type->from_docblock) { - IssueBuffer::maybeAdd( - new RedundantConditionGivenDocblockType( - 'Docblock-defined type ' . $var_type . ' can never contain false', - new CodeLocation($source, $conditional), - $var_type->getId() . ' false' - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RedundantCondition( - $var_type . ' can never contain false', - new CodeLocation($source, $conditional), - $var_type->getId() . ' false' - ), - $source->getSuppressedIssues() - ); - } - } - } - - return $if_types; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional - * @return list>>> - */ - private static function getTrueInequalityAssertions( - int $true_position, - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase, - bool $cache, - bool $inside_conditional - ): array { - $if_types = []; - - if ($true_position === self::ASSIGNMENT_TO_RIGHT) { - $base_conditional = $conditional->left; - } elseif ($true_position === self::ASSIGNMENT_TO_LEFT) { - $base_conditional = $conditional->right; - } else { - throw new UnexpectedValueException('Bad null variable position'); - } - - if ($base_conditional instanceof PhpParser\Node\Expr\FuncCall) { - $notif_types = self::processFunctionCall( - $base_conditional, - $this_class_name, - $source, - $codebase, - true - ); - } else { - $var_name = ExpressionIdentifier::getArrayVarId( - $base_conditional, - $this_class_name, - $source - ); - - if ($var_name) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { - $if_types[$var_name] = [['!true']]; - } else { - $if_types[$var_name] = [['falsy']]; - } - - $notif_types = []; - } else { - $notif_types = null; - - if ($source instanceof StatementsAnalyzer && $cache) { - $notif_types = $source->node_data->getAssertions($base_conditional); - } - - if ($notif_types === null) { - $notif_types = self::scrapeAssertions( - $base_conditional, - $this_class_name, - $source, - $codebase, - false, - $cache, - $inside_conditional - ); - - if ($source instanceof StatementsAnalyzer && $cache) { - $source->node_data->setAssertions($base_conditional, $notif_types); - } - } - } - } - - if (count($notif_types) === 1) { - $notif_types = $notif_types[0]; - - if (count($notif_types) === 1) { - $if_types = Algebra::negateTypes($notif_types); - } - } - - $if_types = $if_types ? [$if_types] : []; - - if ($codebase - && $source instanceof StatementsAnalyzer - && ($var_type = $source->node_data->getType($base_conditional)) - ) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { - $true_type = Type::getTrue(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $var_type, - $true_type - ) && !UnionTypeComparator::isContainedBy( - $codebase, - $true_type, - $var_type - )) { - if ($var_type->from_docblock) { - IssueBuffer::maybeAdd( - new RedundantConditionGivenDocblockType( - 'Docblock-defined type ' . $var_type . ' can never contain true', - new CodeLocation($source, $conditional), - $var_type->getId() . ' true' - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RedundantCondition( - $var_type . ' can never contain ' . $true_type, - new CodeLocation($source, $conditional), - $var_type->getId() . ' true' - ), - $source->getSuppressedIssues() - ); - } - } - } - } - - return $if_types; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional - * @return list>>> - */ - private static function getEmptyInequalityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase, - int $empty_array_position - ): array { - $if_types = []; - - if ($empty_array_position === self::ASSIGNMENT_TO_RIGHT) { - $base_conditional = $conditional->left; - } elseif ($empty_array_position === self::ASSIGNMENT_TO_LEFT) { - $base_conditional = $conditional->right; - } else { - throw new UnexpectedValueException('Bad empty array variable position'); - } - - $var_name = ExpressionIdentifier::getArrayVarId( - $base_conditional, - $this_class_name, - $source - ); - - if ($var_name) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { - $if_types[$var_name] = [['non-empty-countable']]; - } else { - $if_types[$var_name] = [['!falsy']]; - } - } - - if ($codebase - && $source instanceof StatementsAnalyzer - && ($var_type = $source->node_data->getType($base_conditional)) - ) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) { - $empty_array_type = Type::getEmptyArray(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $var_type, - $empty_array_type - ) && !UnionTypeComparator::isContainedBy( - $codebase, - $empty_array_type, - $var_type - )) { - if ($var_type->from_docblock) { - IssueBuffer::maybeAdd( - new RedundantConditionGivenDocblockType( - 'Docblock-defined type ' . $var_type->getId() . ' can never contain null', - new CodeLocation($source, $conditional), - $var_type->getId() . ' null' - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RedundantCondition( - $var_type->getId() . ' can never contain null', - new CodeLocation($source, $conditional), - $var_type->getId() . ' null' - ), - $source->getSuppressedIssues() - ); - } - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional - * @return list>>> - */ - private static function getGettypeInequalityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - int $gettype_position - ): array { - $if_types = []; - - if ($gettype_position === self::ASSIGNMENT_TO_RIGHT) { - $whichclass_expr = $conditional->left; - $gettype_expr = $conditional->right; - } elseif ($gettype_position === self::ASSIGNMENT_TO_LEFT) { - $whichclass_expr = $conditional->right; - $gettype_expr = $conditional->left; - } else { - throw new UnexpectedValueException('$gettype_position value'); - } - - /** @var PhpParser\Node\Expr\FuncCall $gettype_expr */ - $var_name = ExpressionIdentifier::getArrayVarId( - $gettype_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - - if ($whichclass_expr instanceof PhpParser\Node\Scalar\String_) { - $var_type = $whichclass_expr->value; - } elseif ($whichclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch - && $whichclass_expr->class instanceof PhpParser\Node\Name - ) { - $var_type = ClassLikeAnalyzer::getFQCLNFromNameObject( - $whichclass_expr->class, - $source->getAliases() - ); - } else { - throw new UnexpectedValueException('Shouldn’t get here'); - } - - if (!isset(ClassLikeAnalyzer::GETTYPE_TYPES[$var_type])) { - IssueBuffer::maybeAdd( - new UnevaluatedCode( - 'gettype cannot return this value', - new CodeLocation($source, $whichclass_expr) - ) - ); - } else { - if ($var_name && $var_type) { - if ($var_type === 'class@anonymous') { - $if_types[$var_name] = [['!=object']]; - } elseif ($var_type === 'resource (closed)') { - $if_types[$var_name] = [['!closed-resource']]; - } elseif (strpos($var_type, 'resource (') === 0) { - $if_types[$var_name] = [['!=resource']]; - } else { - $if_types[$var_name] = [['!' . $var_type]]; - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional - * @return list>>> - */ - private static function getGetdebugTypeInequalityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - int $get_debug_type_position - ): array { - $if_types = []; - - if ($get_debug_type_position === self::ASSIGNMENT_TO_RIGHT) { - $whichclass_expr = $conditional->left; - $get_debug_type_expr = $conditional->right; - } elseif ($get_debug_type_position === self::ASSIGNMENT_TO_LEFT) { - $whichclass_expr = $conditional->right; - $get_debug_type_expr = $conditional->left; - } else { - throw new UnexpectedValueException('$gettype_position value'); - } - - /** @var PhpParser\Node\Expr\FuncCall $get_debug_type_expr */ - $var_name = ExpressionIdentifier::getArrayVarId( - $get_debug_type_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - - if ($whichclass_expr instanceof PhpParser\Node\Scalar\String_) { - $var_type = $whichclass_expr->value; - } elseif ($whichclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch - && $whichclass_expr->class instanceof PhpParser\Node\Name - ) { - $var_type = ClassLikeAnalyzer::getFQCLNFromNameObject( - $whichclass_expr->class, - $source->getAliases() - ); - } else { - throw new UnexpectedValueException('Shouldn’t get here'); - } - - if ($var_name && $var_type) { - if ($var_type === 'class@anonymous') { - $if_types[$var_name] = [['!=object']]; - } elseif ($var_type === 'resource (closed)') { - $if_types[$var_name] = [['!closed-resource']]; - } elseif (strpos($var_type, 'resource (') === 0) { - $if_types[$var_name] = [['!=resource']]; - } else { - $if_types[$var_name] = [['!' . $var_type]]; - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional - * @return list>>> - */ - private static function getGetclassInequalityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - StatementsAnalyzer $source, - int $getclass_position - ): array { - $if_types = []; - - if ($getclass_position === self::ASSIGNMENT_TO_RIGHT) { - $whichclass_expr = $conditional->left; - $getclass_expr = $conditional->right; - } elseif ($getclass_position === self::ASSIGNMENT_TO_LEFT) { - $whichclass_expr = $conditional->right; - $getclass_expr = $conditional->left; - } else { - throw new UnexpectedValueException('$getclass_position value'); - } - - if ($getclass_expr instanceof PhpParser\Node\Expr\FuncCall) { - $var_name = ExpressionIdentifier::getArrayVarId( - $getclass_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - } elseif ($getclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch - && $getclass_expr->class instanceof PhpParser\Node\Expr - ) { - $var_name = ExpressionIdentifier::getArrayVarId( - $getclass_expr->class, - $this_class_name, - $source - ); - } else { - $var_name = '$this'; - } - - if ($whichclass_expr instanceof PhpParser\Node\Scalar\String_) { - $var_type = $whichclass_expr->value; - } elseif ($whichclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch - && $whichclass_expr->class instanceof PhpParser\Node\Name - ) { - $var_type = ClassLikeAnalyzer::getFQCLNFromNameObject( - $whichclass_expr->class, - $source->getAliases() - ); - - if ($var_type === 'self' || $var_type === 'static') { - $var_type = $this_class_name; - } elseif ($var_type === 'parent') { - $var_type = null; - } - } else { - $type = $source->node_data->getType($whichclass_expr); - - if ($type && $var_name) { - foreach ($type->getAtomicTypes() as $type_part) { - if ($type_part instanceof TTemplateParamClass) { - $if_types[$var_name] = [['!=' . $type_part->param_name]]; - } - } - } - - return $if_types ? [$if_types] : []; - } - - if ($var_type - && ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $source, - $var_type, - new CodeLocation($source, $whichclass_expr), - null, - null, - $source->getSuppressedIssues() - ) === false - ) { - // fall through - } else { - if ($var_name && $var_type) { - $if_types[$var_name] = [['!=getclass-' . $var_type]]; - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\NotIdentical|PhpParser\Node\Expr\BinaryOp\NotEqual $conditional - * @return list>>> - */ - private static function getTypedValueInequalityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - StatementsAnalyzer $source, - ?Codebase $codebase, - int $typed_value_position - ): array { - $if_types = []; - - if ($typed_value_position === self::ASSIGNMENT_TO_RIGHT) { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->left, - $this_class_name, - $source - ); - - $other_type = $source->node_data->getType($conditional->left); - $var_type = $source->node_data->getType($conditional->right); - } elseif ($typed_value_position === self::ASSIGNMENT_TO_LEFT) { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->right, - $this_class_name, - $source - ); - - $var_type = $source->node_data->getType($conditional->left); - $other_type = $source->node_data->getType($conditional->right); - } else { - throw new UnexpectedValueException('$typed_value_position value'); - } - - if ($var_type) { - if ($var_name) { - $not_identical = $conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical - || ($other_type - && (($var_type->isString() && $other_type->isString()) - || ($var_type->isInt() && $other_type->isInt()) - || ($var_type->isFloat() && $other_type->isFloat()) - ) - ); - - try { - $assertion = $var_type->getAssertionString(); - } catch (UnexpectedValueException $e) { - $assertion = null; - } - - if ($not_identical) { - if ($assertion) { - $if_types[$var_name] = [['!=' . $assertion]]; - } - } else { - if ($assertion) { - $if_types[$var_name] = [['!~' . $assertion]]; - } - } - } - - if ($codebase - && $other_type - && $conditional instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical - ) { - self::handleParadoxicalAssertions( - $source, - $var_type, - $this_class_name, - $other_type, - $codebase, - $conditional - ); - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional - * @return list>>> - */ - private static function getNullEqualityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase, - int $null_position - ): array { - $if_types = []; - - if ($null_position === self::ASSIGNMENT_TO_RIGHT) { - $base_conditional = $conditional->left; - } elseif ($null_position === self::ASSIGNMENT_TO_LEFT) { - $base_conditional = $conditional->right; - } else { - throw new UnexpectedValueException('$null_position value'); - } - - $var_name = ExpressionIdentifier::getArrayVarId( - $base_conditional, - $this_class_name, - $source - ); - - if ($var_name && $base_conditional instanceof PhpParser\Node\Expr\Assign) { - $var_name = '=' . $var_name; - } - - if ($var_name) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical) { - $if_types[$var_name] = [['null']]; - } else { - $if_types[$var_name] = [['falsy']]; - } - } - - if ($codebase - && $source instanceof StatementsAnalyzer - && ($var_type = $source->node_data->getType($base_conditional)) - && $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical - ) { - $null_type = Type::getNull(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $var_type, - $null_type - ) && !UnionTypeComparator::isContainedBy( - $codebase, - $null_type, - $var_type - )) { - if ($var_type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - $var_type . ' does not contain null', - new CodeLocation($source, $conditional), - $var_type . ' null' - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainNull( - $var_type . ' does not contain null', - new CodeLocation($source, $conditional), - $var_type->getId() - ), - $source->getSuppressedIssues() - ); - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional - * @return list>>> - */ - private static function getTrueEqualityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase, - bool $cache, - int $true_position - ): array { - $if_types = []; - - if ($true_position === self::ASSIGNMENT_TO_RIGHT) { - $base_conditional = $conditional->left; - } elseif ($true_position === self::ASSIGNMENT_TO_LEFT) { - $base_conditional = $conditional->right; - } else { - throw new UnexpectedValueException('Unrecognised position'); - } - - if ($base_conditional instanceof PhpParser\Node\Expr\FuncCall) { - $if_types = self::processFunctionCall( - $base_conditional, - $this_class_name, - $source, - $codebase, - false - ); - } else { - $var_name = ExpressionIdentifier::getArrayVarId( - $base_conditional, - $this_class_name, - $source - ); - - if ($var_name) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical) { - $if_types[$var_name] = [['true']]; - } else { - $if_types[$var_name] = [['!falsy']]; - } - - $if_types = [$if_types]; - } else { - $base_assertions = null; - - if ($source instanceof StatementsAnalyzer && $cache) { - $base_assertions = $source->node_data->getAssertions($base_conditional); - } - - if ($base_assertions === null) { - $base_assertions = self::scrapeAssertions( - $base_conditional, - $this_class_name, - $source, - $codebase, - false, - $cache - ); - - if ($source instanceof StatementsAnalyzer && $cache) { - $source->node_data->setAssertions($base_conditional, $base_assertions); - } - } - - $if_types = $base_assertions; - } - } - - if ($codebase - && $source instanceof StatementsAnalyzer - && ($var_type = $source->node_data->getType($base_conditional)) - && $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical - ) { - $config = $source->getCodebase()->config; - - if ($config->strict_binary_operands - && $var_type->isSingle() - && $var_type->hasBool() - && !$var_type->from_docblock - ) { - IssueBuffer::maybeAdd( - new RedundantIdentityWithTrue( - 'The "=== true" part of this comparison is redundant', - new CodeLocation($source, $conditional) - ), - $source->getSuppressedIssues() - ); - } - - $true_type = Type::getTrue(); - - if (!UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $true_type, - $var_type - )) { - if ($var_type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - $var_type . ' does not contain true', - new CodeLocation($source, $conditional), - $var_type . ' true' - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - $var_type . ' does not contain true', - new CodeLocation($source, $conditional), - $var_type . ' true' - ), - $source->getSuppressedIssues() - ); - } - } - } - - return $if_types; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional - * @return list>>> - */ - private static function getFalseEqualityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase, - bool $cache, - bool $inside_conditional, - int $false_position - ): array { - $if_types = []; - - if ($false_position === self::ASSIGNMENT_TO_RIGHT) { - $base_conditional = $conditional->left; - } elseif ($false_position === self::ASSIGNMENT_TO_LEFT) { - $base_conditional = $conditional->right; - } else { - throw new UnexpectedValueException('$false_position value'); - } - - if ($base_conditional instanceof PhpParser\Node\Expr\FuncCall) { - $notif_types = self::processFunctionCall( - $base_conditional, - $this_class_name, - $source, - $codebase, - true - ); - } else { - $var_name = ExpressionIdentifier::getArrayVarId( - $base_conditional, - $this_class_name, - $source - ); - - if ($var_name) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical) { - $if_types[$var_name] = [['false']]; - } else { - $if_types[$var_name] = [['falsy']]; - } - - $notif_types = []; - } else { - $notif_types = null; - - if ($source instanceof StatementsAnalyzer && $cache) { - $notif_types = $source->node_data->getAssertions($base_conditional); - } - - if ($notif_types === null) { - $notif_types = self::scrapeAssertions( - $base_conditional, - $this_class_name, - $source, - $codebase, - false, - $cache, - $inside_conditional - ); - - if ($source instanceof StatementsAnalyzer && $cache) { - $source->node_data->setAssertions($base_conditional, $notif_types); - } - } - } - } - - if (count($notif_types) === 1) { - $notif_types = $notif_types[0]; - - if (count($notif_types) === 1) { - $if_types = Algebra::negateTypes($notif_types); - } - } - - $if_types = $if_types ? [$if_types] : []; - - if ($codebase - && $source instanceof StatementsAnalyzer - && ($var_type = $source->node_data->getType($base_conditional)) - ) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical) { - $false_type = Type::getFalse(); - - if (!UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $false_type, - $var_type - )) { - if ($var_type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - $var_type . ' does not contain false', - new CodeLocation($source, $conditional), - $var_type . ' false' - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - $var_type . ' does not contain false', - new CodeLocation($source, $conditional), - $var_type . ' false' - ), - $source->getSuppressedIssues() - ); - } - } - } - } - - return $if_types; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional - * @return list>>> - */ - private static function getEmptyArrayEqualityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - ?Codebase $codebase, - int $empty_array_position - ): array { - $if_types = []; - - if ($empty_array_position === self::ASSIGNMENT_TO_RIGHT) { - $base_conditional = $conditional->left; - } elseif ($empty_array_position === self::ASSIGNMENT_TO_LEFT) { - $base_conditional = $conditional->right; - } else { - throw new UnexpectedValueException('$empty_array_position value'); - } - - $var_name = ExpressionIdentifier::getArrayVarId( - $base_conditional, - $this_class_name, - $source - ); - - if ($var_name) { - if ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical) { - $if_types[$var_name] = [['!non-empty-countable']]; - } else { - $if_types[$var_name] = [['falsy']]; - } - } - - if ($codebase - && $source instanceof StatementsAnalyzer - && ($var_type = $source->node_data->getType($base_conditional)) - && $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical - ) { - $empty_array_type = Type::getEmptyArray(); - - if (!UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $empty_array_type, - $var_type - )) { - if ($var_type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - $var_type . ' does not contain an empty array', - new CodeLocation($source, $conditional), - null - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - $var_type . ' does not contain empty array', - new CodeLocation($source, $conditional), - null - ), - $source->getSuppressedIssues() - ); - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional - * @return list>>> - */ - private static function getGettypeEqualityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - int $gettype_position - ): array { - $if_types = []; - - if ($gettype_position === self::ASSIGNMENT_TO_RIGHT) { - $string_expr = $conditional->left; - $gettype_expr = $conditional->right; - } elseif ($gettype_position === self::ASSIGNMENT_TO_LEFT) { - $string_expr = $conditional->right; - $gettype_expr = $conditional->left; - } else { - throw new UnexpectedValueException('$gettype_position value'); - } - - /** @var PhpParser\Node\Expr\FuncCall $gettype_expr */ - $var_name = ExpressionIdentifier::getArrayVarId( - $gettype_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - - /** @var PhpParser\Node\Scalar\String_ $string_expr */ - $var_type = $string_expr->value; - - if (!isset(ClassLikeAnalyzer::GETTYPE_TYPES[$var_type])) { - IssueBuffer::maybeAdd( - new UnevaluatedCode( - 'gettype cannot return this value', - new CodeLocation($source, $string_expr) - ) - ); - } else { - if ($var_name && $var_type) { - if ($var_type === 'class@anonymous') { - $if_types[$var_name] = [['=object']]; - } elseif ($var_type === 'resource (closed)') { - $if_types[$var_name] = [['closed-resource']]; - } elseif (strpos($var_type, 'resource (') === 0) { - $if_types[$var_name] = [['=resource']]; - } else { - $if_types[$var_name] = [[$var_type]]; - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional - * @return list>>> - */ - private static function getGetdebugtypeEqualityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - FileSource $source, - int $get_debug_type_position - ): array { - $if_types = []; - - if ($get_debug_type_position === self::ASSIGNMENT_TO_RIGHT) { - $whichclass_expr = $conditional->left; - $get_debug_type_expr = $conditional->right; - } elseif ($get_debug_type_position === self::ASSIGNMENT_TO_LEFT) { - $whichclass_expr = $conditional->right; - $get_debug_type_expr = $conditional->left; - } else { - throw new UnexpectedValueException('$gettype_position value'); - } - - /** @var PhpParser\Node\Expr\FuncCall $get_debug_type_expr */ - $var_name = ExpressionIdentifier::getArrayVarId( - $get_debug_type_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - - if ($whichclass_expr instanceof PhpParser\Node\Scalar\String_) { - $var_type = $whichclass_expr->value; - } elseif ($whichclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch - && $whichclass_expr->class instanceof PhpParser\Node\Name - ) { - $var_type = ClassLikeAnalyzer::getFQCLNFromNameObject( - $whichclass_expr->class, - $source->getAliases() - ); - } else { - throw new UnexpectedValueException('Shouldn’t get here'); - } - - if ($var_name && $var_type) { - if ($var_type === 'class@anonymous') { - $if_types[$var_name] = [['=object']]; - } elseif ($var_type === 'resource (closed)') { - $if_types[$var_name] = [['closed-resource']]; - } elseif (strpos($var_type, 'resource (') === 0) { - $if_types[$var_name] = [['=resource']]; - } else { - $if_types[$var_name] = [[$var_type]]; - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional - * @return list>>> - */ - private static function getGetclassEqualityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - StatementsAnalyzer $source, - int $getclass_position - ): array { - $if_types = []; - - if ($getclass_position === self::ASSIGNMENT_TO_RIGHT) { - $whichclass_expr = $conditional->left; - $getclass_expr = $conditional->right; - } elseif ($getclass_position === self::ASSIGNMENT_TO_LEFT) { - $whichclass_expr = $conditional->right; - $getclass_expr = $conditional->left; - } else { - throw new UnexpectedValueException('$getclass_position value'); - } - - if ($getclass_expr instanceof PhpParser\Node\Expr\FuncCall && isset($getclass_expr->getArgs()[0])) { - $var_name = ExpressionIdentifier::getArrayVarId( - $getclass_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - } elseif ($getclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch - && $getclass_expr->class instanceof PhpParser\Node\Expr - ) { - $var_name = ExpressionIdentifier::getArrayVarId( - $getclass_expr->class, - $this_class_name, - $source - ); - } else { - $var_name = '$this'; - } - - if ($whichclass_expr instanceof PhpParser\Node\Expr\ClassConstFetch - && $whichclass_expr->class instanceof PhpParser\Node\Name - ) { - $var_type = ClassLikeAnalyzer::getFQCLNFromNameObject( - $whichclass_expr->class, - $source->getAliases() - ); - - if ($var_type === 'self' || $var_type === 'static') { - $var_type = $this_class_name; - } elseif ($var_type === 'parent') { - $var_type = null; - } - - if ($var_type) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $source, - $var_type, - new CodeLocation($source, $whichclass_expr), - null, - null, - $source->getSuppressedIssues(), - new ClassLikeNameOptions(true) - ) === false - ) { - return []; - } - } - - if ($var_name && $var_type) { - $if_types[$var_name] = [['=getclass-' . $var_type]]; - } - } else { - $type = $source->node_data->getType($whichclass_expr); - - if ($type && $var_name) { - foreach ($type->getAtomicTypes() as $type_part) { - if ($type_part instanceof TTemplateParamClass) { - $if_types[$var_name] = [['=' . $type_part->param_name]]; - } - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Identical|PhpParser\Node\Expr\BinaryOp\Equal $conditional - * @return list>>> - */ - private static function getTypedValueEqualityAssertions( - PhpParser\Node\Expr\BinaryOp $conditional, - ?string $this_class_name, - StatementsAnalyzer $source, - ?Codebase $codebase, - int $typed_value_position - ): array { - $if_types = []; - - if ($typed_value_position === self::ASSIGNMENT_TO_RIGHT) { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->left, - $this_class_name, - $source - ); - - $other_var_name = ExpressionIdentifier::getArrayVarId( - $conditional->right, - $this_class_name, - $source - ); - - $other_type = $source->node_data->getType($conditional->left); - $var_type = $source->node_data->getType($conditional->right); - } elseif ($typed_value_position === self::ASSIGNMENT_TO_LEFT) { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->right, - $this_class_name, - $source - ); - - $other_var_name = ExpressionIdentifier::getArrayVarId( - $conditional->left, - $this_class_name, - $source - ); - - $var_type = $source->node_data->getType($conditional->left); - $other_type = $source->node_data->getType($conditional->right); - } else { - throw new UnexpectedValueException('$typed_value_position value'); - } - - if ($var_name && $var_type) { - $identical = $conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical - || ($other_type - && (($var_type->isString(true) && $other_type->isString(true)) - || ($var_type->isInt(true) && $other_type->isInt(true)) - || ($var_type->isFloat() && $other_type->isFloat()) - ) - ); - - if ($identical) { - try { - $assertion = $var_type->getAssertionString(true); - } catch (UnexpectedValueException $e) { - $assertion = null; - } - - if ($assertion) { - $if_types[$var_name] = [['=' . $assertion]]; - } - } else { - try { - $assertion = $var_type->getAssertionString(); - } catch (UnexpectedValueException $e) { - $assertion = null; - } - - if ($assertion) { - $if_types[$var_name] = [['~' . $assertion]]; - } - } - - - if ($other_var_name && $other_type && !$other_type->isMixed()) { - if ($identical) { - try { - $assertion = $other_type->getAssertionString(true); - } catch (UnexpectedValueException $e) { - $assertion = null; - } - - if ($assertion) { - $if_types[$other_var_name] = [['=' . $assertion]]; - } - } else { - try { - $assertion = $other_type->getAssertionString(); - } catch (UnexpectedValueException $e) { - $assertion = null; - } - - if ($assertion) { - $if_types[$other_var_name] = [['~' . $assertion]]; - } - } - } - } - - if ($codebase - && $other_type - && $var_type - && ($conditional instanceof PhpParser\Node\Expr\BinaryOp\Identical - || ($other_type->isString() - && $var_type->isString()) - ) - ) { - self::handleParadoxicalAssertions( - $source, - $var_type, - $this_class_name, - $other_type, - $codebase, - $conditional - ); - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\FuncCall $expr - * @param StatementsAnalyzer $source - * @return list>>> - */ - private static function getIsaAssertions( - PhpParser\Node\Expr\FuncCall $expr, - StatementsAnalyzer $source, - ?string $this_class_name, - ?string $first_var_name - ): array { - $if_types = []; - - if ($expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch - && $expr->getArgs()[0]->value->name instanceof PhpParser\Node\Identifier - && strtolower($expr->getArgs()[0]->value->name->name) === 'class' - && $expr->getArgs()[0]->value->class instanceof PhpParser\Node\Name - && count($expr->getArgs()[0]->value->class->parts) === 1 - && strtolower($expr->getArgs()[0]->value->class->parts[0]) === 'static' - ) { - $first_var_name = '$this'; - } - - if ($first_var_name) { - $first_arg = $expr->getArgs()[0]->value; - $second_arg = $expr->getArgs()[1]->value; - $third_arg = $expr->getArgs()[2]->value ?? null; - - if ($third_arg instanceof PhpParser\Node\Expr\ConstFetch) { - if (!in_array(strtolower($third_arg->name->parts[0]), ['true', 'false'])) { - return []; - } - - $third_arg_value = strtolower($third_arg->name->parts[0]); - } else { - $third_arg_value = $expr->name instanceof PhpParser\Node\Name - && strtolower($expr->name->parts[0]) === 'is_subclass_of' - ? 'true' - : 'false'; - } - - $is_a_prefix = $third_arg_value === 'true' ? 'isa-string-' : 'isa-'; - - if (($first_arg_type = $source->node_data->getType($first_arg)) - && $first_arg_type->isSingleStringLiteral() - && $source->getSource()->getSource() instanceof TraitAnalyzer - && $first_arg_type->getSingleStringLiteral()->value === $this_class_name - ) { - // do nothing - } else { - if ($second_arg instanceof PhpParser\Node\Scalar\String_) { - $fq_class_name = $second_arg->value; - if ($fq_class_name[0] === '\\') { - $fq_class_name = substr($fq_class_name, 1); - } - - $if_types[$first_var_name] = [[$is_a_prefix . $fq_class_name]]; - } elseif ($second_arg instanceof PhpParser\Node\Expr\ClassConstFetch - && $second_arg->class instanceof PhpParser\Node\Name - && $second_arg->name instanceof PhpParser\Node\Identifier - && strtolower($second_arg->name->name) === 'class' - ) { - $class_node = $second_arg->class; - - if ($class_node->parts === ['static']) { - if ($this_class_name) { - $if_types[$first_var_name] = [[$is_a_prefix . $this_class_name . '&static']]; - } - } elseif ($class_node->parts === ['self']) { - if ($this_class_name) { - $if_types[$first_var_name] = [[$is_a_prefix . $this_class_name]]; - } - } elseif ($class_node->parts === ['parent']) { - // do nothing - } else { - $if_types[$first_var_name] = [[ - $is_a_prefix - . ClassLikeAnalyzer::getFQCLNFromNameObject( - $class_node, - $source->getAliases() - ) - ]]; - } - } elseif (($second_arg_type = $source->node_data->getType($second_arg)) - && $second_arg_type->hasString() - ) { - $vals = []; - - foreach ($second_arg_type->getAtomicTypes() as $second_arg_atomic_type) { - if ($second_arg_atomic_type instanceof TTemplateParamClass) { - $vals[] = [$is_a_prefix . $second_arg_atomic_type->param_name]; - } - } - - if ($vals) { - $if_types[$first_var_name] = $vals; - } - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\FuncCall $expr - * @param StatementsAnalyzer $source - * @param string|null $first_var_name - * @return list>>> - */ - private static function getInarrayAssertions( - PhpParser\Node\Expr\FuncCall $expr, - StatementsAnalyzer $source, - ?string $first_var_name - ): array { - $if_types = []; - - if ($first_var_name - && ($second_arg_type = $source->node_data->getType($expr->getArgs()[1]->value)) - && isset($expr->getArgs()[0]->value) - && !$expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch - ) { - foreach ($second_arg_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TArray - || $atomic_type instanceof TKeyedArray - || $atomic_type instanceof TList - ) { - $is_sealed = false; - if ($atomic_type instanceof TList) { - $value_type = $atomic_type->type_param; - } elseif ($atomic_type instanceof TKeyedArray) { - $value_type = $atomic_type->getGenericValueType(); - $is_sealed = $atomic_type->sealed; - } else { - $value_type = $atomic_type->type_params[1]; - } - - $assertions = []; - - if (!$is_sealed) { - // `in-array-*` has special handling in the detection of paradoxical - // conditions and the fact the negation doesn't imply anything. - // - // In the vast majority of cases, the negation of `in-array-*` - // (`Algebra::negateType`) doesn't imply anything because: - // - The array can be empty, or - // - The array may have one of the types but not the others. - // - // NOTE: the negation of the negation is the original assertion. - if ($value_type->getId() !== '' && !$value_type->isMixed() && !$value_type->hasTemplate()) { - $assertions[] = 'in-array-' . $value_type->getId(); - } - } else { - foreach ($value_type->getAtomicTypes() as $atomic_value_type) { - if ($atomic_value_type instanceof TLiteralInt - || $atomic_value_type instanceof TLiteralString - || $atomic_value_type instanceof TLiteralFloat - || $atomic_value_type instanceof TEnumCase - ) { - $assertions[] = '=' . $atomic_value_type->getAssertionString(); - } elseif ($atomic_value_type instanceof TFalse - || $atomic_value_type instanceof TTrue - || $atomic_value_type instanceof TNull - ) { - $assertions[] = $atomic_value_type->getAssertionString(); - } elseif (!$atomic_value_type instanceof TMixed) { - // mixed doesn't tell us anything and can be omitted. - // - // For the meaning of in-array, see the above comment. - $assertions[] = 'in-array-' . $value_type->getId(); - } - } - } - - if ($assertions !== []) { - $if_types[$first_var_name] = [$assertions]; - } - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\FuncCall $expr - * @param Union|null $first_var_type - * @param string|null $first_var_name - * @return list>>> - */ - private static function getArrayKeyExistsAssertions( - PhpParser\Node\Expr\FuncCall $expr, - ?Union $first_var_type, - ?string $first_var_name, - FileSource $source, - ?string $this_class_name - ): array { - $if_types = []; - - $literal_assertions = []; - - if (isset($expr->getArgs()[0]) - && isset($expr->getArgs()[1]) - && $first_var_type - && $first_var_name - && !$expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch - && $source instanceof StatementsAnalyzer - && ($second_var_type = $source->node_data->getType($expr->getArgs()[1]->value)) - ) { - foreach ($second_var_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TArray - || $atomic_type instanceof TKeyedArray - ) { - if ($atomic_type instanceof TKeyedArray) { - $key_possibly_undefined = false; - - foreach ($atomic_type->properties as $property_type) { - if ($property_type->possibly_undefined) { - $key_possibly_undefined = true; - break; - } - } - - $key_type = $atomic_type->getGenericKeyType(); - - if ($key_possibly_undefined) { - $key_type->possibly_undefined = true; - } - } else { - $key_type = $atomic_type->type_params[0]; - } - - if ($key_type->allStringLiterals() && !$key_type->possibly_undefined) { - foreach ($key_type->getLiteralStrings() as $array_literal_type) { - $literal_assertions[] = '=' . $array_literal_type->getAssertionString(); - } - } elseif ($key_type->allIntLiterals() && !$key_type->possibly_undefined) { - foreach ($key_type->getLiteralInts() as $array_literal_type) { - $literal_assertions[] = '~' . $array_literal_type->getAssertionString(); - } - } - } - } - } - - if ($literal_assertions && $first_var_name) { - $if_types[$first_var_name] = [$literal_assertions]; - } else { - $array_root = isset($expr->getArgs()[1]->value) - ? ExpressionIdentifier::getArrayVarId( - $expr->getArgs()[1]->value, - $this_class_name, - $source - ) - : null; - - if ($array_root) { - if ($first_var_name === null && isset($expr->getArgs()[0])) { - $first_arg = $expr->getArgs()[0]; - - if ($first_arg->value instanceof PhpParser\Node\Scalar\String_) { - $first_var_name = '\'' . $first_arg->value->value . '\''; - } elseif ($first_arg->value instanceof PhpParser\Node\Scalar\LNumber) { - $first_var_name = (string)$first_arg->value->value; - } - } - - if ($expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch - && $expr->getArgs()[0]->value->name instanceof PhpParser\Node\Identifier - && $expr->getArgs()[0]->value->name->name !== 'class' - ) { - $const_type = null; - - if ($source instanceof StatementsAnalyzer) { - $const_type = $source->node_data->getType($expr->getArgs()[0]->value); - } - - if ($const_type) { - if ($const_type->isSingleStringLiteral()) { - $first_var_name = $const_type->getSingleStringLiteral()->value; - } elseif ($const_type->isSingleIntLiteral()) { - $first_var_name = (string)$const_type->getSingleIntLiteral()->value; - } else { - $first_var_name = null; - } - } else { - $first_var_name = null; - } - } elseif ($expr->getArgs()[0]->value instanceof PhpParser\Node\Expr\Variable - && $source instanceof StatementsAnalyzer - && ($first_var_type = $source->node_data->getType($expr->getArgs()[0]->value)) - ) { - foreach ($first_var_type->getLiteralStrings() as $array_literal_type) { - $if_types[$array_root . "['" . $array_literal_type->value . "']"] = [['array-key-exists']]; - } - foreach ($first_var_type->getLiteralInts() as $array_literal_type) { - $if_types[$array_root . "[" . $array_literal_type->value . "]"] = [['array-key-exists']]; - } - } - - if ($first_var_name !== null - && !strpos($first_var_name, '->') - && !strpos($first_var_name, '[') - ) { - $if_types[$array_root . '[' . $first_var_name . ']'] = [['array-key-exists']]; - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Greater|PhpParser\Node\Expr\BinaryOp\GreaterOrEqual $conditional - * @return list>>> - */ - private static function getGreaterAssertions( - PhpParser\Node\Expr $conditional, - FileSource $source, - ?string $this_class_name - ): array { - $if_types = []; - - $min_count = null; - $count_equality_position = self::hasNonEmptyCountEqualityCheck($conditional, $min_count); - $max_count = null; - $count_inequality_position = self::hasLessThanCountEqualityCheck($conditional, $max_count); - $isset_assert = false; - $superior_value_comparison = null; - $superior_value_position = self::hasSuperiorNumberCheck( - $source, - $conditional, - $superior_value_comparison, - $isset_assert - ); - - if ($count_equality_position) { - if ($count_equality_position === self::ASSIGNMENT_TO_RIGHT) { - $counted_expr = $conditional->left; - } else { - throw new UnexpectedValueException('$count_equality_position value'); - } - - /** @var PhpParser\Node\Expr\FuncCall $counted_expr */ - $var_name = ExpressionIdentifier::getArrayVarId( - $counted_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - - if ($var_name) { - if (self::hasReconcilableNonEmptyCountEqualityCheck($conditional)) { - $if_types[$var_name] = [['non-empty-countable']]; - } else { - if ($min_count) { - $if_types[$var_name] = [['=has-at-least-' . $min_count]]; - } else { - $if_types[$var_name] = [['=non-empty-countable']]; - } - } - } - - return $if_types ? [$if_types] : []; - } - - if ($count_inequality_position) { - if ($count_inequality_position === self::ASSIGNMENT_TO_LEFT) { - $count_expr = $conditional->right; - } else { - throw new UnexpectedValueException('$count_inequality_position value'); - } - - /** @var PhpParser\Node\Expr\FuncCall $count_expr */ - $var_name = ExpressionIdentifier::getArrayVarId( - $count_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - - if ($var_name) { - if ($max_count) { - $if_types[$var_name] = [['!has-at-least-' . ($max_count + 1)]]; - } else { - $if_types[$var_name] = [['!non-empty-countable']]; - } - } - - return $if_types ? [$if_types] : []; - } - - if ($superior_value_position) { - if ($superior_value_position === self::ASSIGNMENT_TO_RIGHT) { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->left, - $this_class_name, - $source - ); - } else { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->right, - $this_class_name, - $source - ); - } - - if ($var_name !== null) { - if ($superior_value_position === self::ASSIGNMENT_TO_RIGHT) { - if ($superior_value_comparison === 0) { - $if_types[$var_name] = [['=positive-numeric', '=int(0)']]; - } elseif ($superior_value_comparison === 1) { - $if_types[$var_name] = [['positive-numeric']]; - } else { - $if_types[$var_name] = [['>' . $superior_value_comparison]]; - } - } else { - $if_types[$var_name] = [['<' . $superior_value_comparison]]; - } - - if ($isset_assert) { - $if_types[$var_name][] = ['=isset']; - } - } - - return $if_types ? [$if_types] : []; - } - - return []; - } - - /** - * @param PhpParser\Node\Expr\BinaryOp\Smaller|PhpParser\Node\Expr\BinaryOp\SmallerOrEqual $conditional - * @return list>>> - */ - private static function getSmallerAssertions( - PhpParser\Node\Expr $conditional, - FileSource $source, - ?string $this_class_name - ): array { - $if_types = []; - $min_count = null; - $count_equality_position = self::hasNonEmptyCountEqualityCheck($conditional, $min_count); - $max_count = null; - $count_inequality_position = self::hasLessThanCountEqualityCheck($conditional, $max_count); - $isset_assert = false; - $inferior_value_comparison = null; - $inferior_value_position = self::hasInferiorNumberCheck( - $source, - $conditional, - $inferior_value_comparison, - $isset_assert - ); - - if ($count_equality_position) { - if ($count_equality_position === self::ASSIGNMENT_TO_LEFT) { - $count_expr = $conditional->right; - } else { - throw new UnexpectedValueException('$count_equality_position value'); - } - - /** @var PhpParser\Node\Expr\FuncCall $count_expr */ - $var_name = ExpressionIdentifier::getArrayVarId( - $count_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - - if ($var_name) { - if ($min_count) { - $if_types[$var_name] = [['=has-at-least-' . $min_count]]; - } else { - $if_types[$var_name] = [['=non-empty-countable']]; - } - } - - return $if_types ? [$if_types] : []; - } - - if ($count_inequality_position) { - if ($count_inequality_position === self::ASSIGNMENT_TO_RIGHT) { - $count_expr = $conditional->left; - } else { - throw new UnexpectedValueException('$count_inequality_position value'); - } - - /** @var PhpParser\Node\Expr\FuncCall $count_expr */ - $var_name = ExpressionIdentifier::getArrayVarId( - $count_expr->getArgs()[0]->value, - $this_class_name, - $source - ); - - if ($var_name) { - if ($max_count) { - $if_types[$var_name] = [['!has-at-least-' . ($max_count + 1)]]; - } else { - $if_types[$var_name] = [['!non-empty-countable']]; - } - } - - return $if_types ? [$if_types] : []; - } - - if ($inferior_value_position) { - if ($inferior_value_position === self::ASSIGNMENT_TO_RIGHT) { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->left, - $this_class_name, - $source - ); - } else { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->right, - $this_class_name, - $source - ); - } - - - if ($var_name !== null) { - if ($inferior_value_position === self::ASSIGNMENT_TO_RIGHT) { - $if_types[$var_name] = [['<' . $inferior_value_comparison]]; - } else { - if ($inferior_value_comparison === 0) { - $if_types[$var_name] = [['=positive-numeric', '=int(0)']]; - } elseif ($inferior_value_comparison === 1) { - $if_types[$var_name] = [['positive-numeric']]; - } else { - $if_types[$var_name] = [['>' . $inferior_value_comparison]]; - } - } - - if ($isset_assert) { - $if_types[$var_name][] = ['=isset']; - } - } - - return $if_types ? [$if_types] : []; - } - - return []; - } - - /** - * @return list>>> - */ - private static function getInstanceofAssertions( - PhpParser\Node\Expr\Instanceof_ $conditional, - ?Codebase $codebase, - FileSource $source, - ?string $this_class_name, - bool $inside_negation - ): array { - $if_types = []; - - $instanceof_types = self::getInstanceOfTypes($conditional, $this_class_name, $source); - - if ($instanceof_types) { - $var_name = ExpressionIdentifier::getArrayVarId( - $conditional->expr, - $this_class_name, - $source - ); - - if ($var_name) { - $if_types[$var_name] = [$instanceof_types]; - - $var_type = $source instanceof StatementsAnalyzer - ? $source->node_data->getType($conditional->expr) - : null; - - foreach ($instanceof_types as $instanceof_type) { - if ($instanceof_type[0] === '=') { - $instanceof_type = substr($instanceof_type, 1); - } - - if ($codebase - && $var_type - && $inside_negation - && $source instanceof StatementsAnalyzer - ) { - if ($codebase->interfaceExists($instanceof_type)) { - continue; - } - - $instanceof_type = Type::parseString( - $instanceof_type, - null, - $source->getTemplateTypeMap() ?: [] - ); - - if (!UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $instanceof_type, - $var_type - )) { - if ($var_type->from_docblock) { - IssueBuffer::maybeAdd( - new RedundantConditionGivenDocblockType( - $var_type->getId() . ' does not contain ' - . $instanceof_type->getId(), - new CodeLocation($source, $conditional), - $var_type->getId() . ' ' . $instanceof_type->getId() - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RedundantCondition( - $var_type->getId() . ' cannot be identical to ' - . $instanceof_type->getId(), - new CodeLocation($source, $conditional), - $var_type->getId() . ' ' . $instanceof_type->getId() - ), - $source->getSuppressedIssues() - ); - } - } - } - } - } - } - - return $if_types ? [$if_types] : []; - } - - /** - * @param NotIdentical|NotEqual|Identical|Equal $conditional - */ - private static function handleParadoxicalAssertions( - StatementsAnalyzer $source, - Union $var_type, - ?string $this_class_name, - Union $other_type, - Codebase $codebase, - PhpParser\Node\Expr\BinaryOp $conditional - ): void { - $parent_source = $source->getSource(); - - if ($parent_source->getSource() instanceof TraitAnalyzer - && (($var_type->isSingleStringLiteral() - && $var_type->getSingleStringLiteral()->value === $this_class_name) - || ($other_type->isSingleStringLiteral() - && $other_type->getSingleStringLiteral()->value === $this_class_name)) - ) { - // do nothing - } elseif (!UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $other_type, - $var_type - )) { - if ($var_type->from_docblock || $other_type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - $var_type->getId() . ' does not contain ' . $other_type->getId(), - new CodeLocation($source, $conditional), - $var_type->getId() . ' ' . $other_type->getId() - ), - $source->getSuppressedIssues() - ); - } else { - if ($conditional instanceof NotEqual || $conditional instanceof NotIdentical) { - IssueBuffer::maybeAdd( - new RedundantCondition( - $var_type->getId() . ' can never contain ' . $other_type->getId(), - new CodeLocation($source, $conditional), - $var_type->getId() . ' ' . $other_type->getId() - ), - $source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - $var_type->getId() . ' cannot be identical to ' . $other_type->getId(), - new CodeLocation($source, $conditional), - $var_type->getId() . ' ' . $other_type->getId() - ), - $source->getSuppressedIssues() - ); - } - } - } - } - - public static function isPropertyImmutableOnArgument( - string $property, - NodeDataProvider $node_provider, - ClassLikeStorageProvider $class_provider, - PhpParser\Node\Expr\Variable $arg_expr - ): ?string { - $type = $node_provider->getType($arg_expr); - /** @var string $name */ - $name = $arg_expr->name; - - if (null === $type) { - return 'Cannot resolve a type of variable ' . $name; - } - - foreach ($type->getAtomicTypes() as $type) { - if (!$type instanceof TNamedObject) { - return 'Variable ' . $name . ' is not an object so the assertion cannot be applied'; - } - - $class_definition = $class_provider->get($type->value); - $property_definition = $class_definition->properties[$property] ?? null; - - if (!$property_definition instanceof PropertyStorage) { - $magic_type = $class_definition->pseudo_property_get_types['$' . $property] ?? null; - if ($magic_type === null) { - return sprintf( - 'Property %s is not defined on variable %s so the assertion cannot be applied', - $property, - $name - ); - } - - $magic_getter = $class_definition->methods['__get'] ?? null; - if ($magic_getter === null || !$magic_getter->mutation_free) { - return "{$class_definition->name}::__get is not mutation-free, so the assertion cannot be applied"; - } - } - } - - return null; - } -} 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 deleted file mode 100644 index a2eb2c60..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php +++ /dev/null @@ -1,1027 +0,0 @@ -var, - $statements_analyzer->getFQCLN(), - $statements_analyzer, - $nesting - ); - - self::updateArrayType( - $statements_analyzer, - $stmt, - $assign_value, - $assignment_value_type, - $context - ); - - if (!$statements_analyzer->node_data->getType($stmt->var) && $var_id) { - $context->vars_in_scope[$var_id] = Type::getMixed(); - } - } - - /** - * @return false|null - * @psalm-suppress PossiblyUnusedReturnValue not used but seems important - */ - public static function updateArrayType( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - ?PhpParser\Node\Expr $assign_value, - Union $assignment_type, - Context $context - ): ?bool { - $root_array_expr = $stmt; - - $child_stmts = []; - - while ($root_array_expr->var instanceof PhpParser\Node\Expr\ArrayDimFetch) { - $child_stmts[] = $root_array_expr; - $root_array_expr = $root_array_expr->var; - } - - $child_stmts[] = $root_array_expr; - $root_array_expr = $root_array_expr->var; - - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $root_array_expr, - $context, - true - ) === false) { - // fall through - } - - $codebase = $statements_analyzer->getCodebase(); - - $root_type = $statements_analyzer->node_data->getType($root_array_expr) ?? Type::getMixed(); - - if ($root_type->hasMixed()) { - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $stmt->var, - $context, - true - ) === false) { - // fall through - } - - if ($stmt->dim) { - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $stmt->dim, - $context - ) === false) { - // fall through - } - } - } - - $current_type = $root_type; - - $current_dim = $stmt->dim; - - // gets a variable id that *may* contain array keys - $root_var_id = ExpressionIdentifier::getArrayVarId( - $root_array_expr, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $parent_var_id = null; - - $offset_already_existed = false; - - $child_stmt = null; - - self::analyzeNestedArrayAssignment( - $statements_analyzer, - $codebase, - $context, - $assign_value, - $assignment_type, - array_reverse($child_stmts), - $root_var_id, - $parent_var_id, - $child_stmt, - $root_type, - $current_type, - $current_dim, - $offset_already_existed - ); - - $root_is_string = $root_type->isString(); - $key_values = []; - - if ($current_dim instanceof PhpParser\Node\Scalar\String_) { - $key_values[] = new TLiteralString($current_dim->value); - } elseif ($current_dim instanceof PhpParser\Node\Scalar\LNumber && !$root_is_string) { - $key_values[] = new TLiteralInt($current_dim->value); - } elseif ($current_dim - && ($key_type = $statements_analyzer->node_data->getType($current_dim)) - && !$root_is_string - ) { - $string_literals = $key_type->getLiteralStrings(); - $int_literals = $key_type->getLiteralInts(); - - $all_atomic_types = $key_type->getAtomicTypes(); - - if (count($string_literals) + count($int_literals) === count($all_atomic_types)) { - foreach ($string_literals as $string_literal) { - $key_values[] = clone $string_literal; - } - - foreach ($int_literals as $int_literal) { - $key_values[] = clone $int_literal; - } - } - } - - if ($key_values) { - $new_child_type = self::updateTypeWithKeyValues( - $codebase, - $root_type, - $current_type, - $key_values - ); - } elseif (!$root_is_string) { - $new_child_type = self::updateArrayAssignmentChildType( - $statements_analyzer, - $codebase, - $current_dim, - $context, - $current_type, - $root_type, - $offset_already_existed, - $child_stmt, - $parent_var_id - ); - } else { - $new_child_type = $root_type; - } - - $new_child_type->removeType('null'); - - if (!$root_type->hasObjectType()) { - $root_type = $new_child_type; - } - - $statements_analyzer->node_data->setType($root_array_expr, $root_type); - - if ($root_array_expr instanceof PhpParser\Node\Expr\PropertyFetch) { - if ($root_array_expr->name instanceof PhpParser\Node\Identifier) { - InstancePropertyAssignmentAnalyzer::analyze( - $statements_analyzer, - $root_array_expr, - $root_array_expr->name->name, - null, - $root_type, - $context, - false - ); - } else { - if (ExpressionAnalyzer::analyze($statements_analyzer, $root_array_expr->name, $context) === false) { - return false; - } - - if (ExpressionAnalyzer::analyze($statements_analyzer, $root_array_expr->var, $context) === false) { - return false; - } - } - } elseif ($root_array_expr instanceof PhpParser\Node\Expr\StaticPropertyFetch - && $root_array_expr->name instanceof PhpParser\Node\Identifier - ) { - if (StaticPropertyAssignmentAnalyzer::analyze( - $statements_analyzer, - $root_array_expr, - null, - $root_type, - $context - ) === false) { - return false; - } - } elseif ($root_var_id) { - $context->vars_in_scope[$root_var_id] = $root_type; - } - - if ($root_array_expr instanceof PhpParser\Node\Expr\MethodCall - || $root_array_expr instanceof PhpParser\Node\Expr\StaticCall - || $root_array_expr instanceof PhpParser\Node\Expr\FuncCall - ) { - if ($root_type->hasArray()) { - if (IssueBuffer::accepts( - new InvalidArrayAssignment( - 'Assigning to the output of a function has no effect', - new CodeLocation($statements_analyzer->getSource(), $root_array_expr) - ), - $statements_analyzer->getSuppressedIssues() - ) - ) { - // do nothing - } - } - } - - return null; - } - - /** - * @param non-empty-list $key_values - */ - private static function updateTypeWithKeyValues( - Codebase $codebase, - Union $child_stmt_type, - Union $current_type, - array $key_values - ): Union { - $has_matching_objectlike_property = false; - $has_matching_string = false; - - $child_stmt_type = clone $child_stmt_type; - - foreach ($child_stmt_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - $type->as = self::updateTypeWithKeyValues( - $codebase, - $type->as, - $current_type, - $key_values - ); - - $has_matching_objectlike_property = true; - - $child_stmt_type->substitute(new Union([$type]), $type->as); - - continue; - } - - foreach ($key_values as $key_value) { - if ($type instanceof TKeyedArray) { - if (isset($type->properties[$key_value->value])) { - $has_matching_objectlike_property = true; - - $type->properties[$key_value->value] = clone $current_type; - } - } elseif ($type instanceof TString - && $key_value instanceof TLiteralInt - ) { - $has_matching_string = true; - - if ($type instanceof TLiteralString - && $current_type->isSingleStringLiteral() - ) { - $new_char = $current_type->getSingleStringLiteral()->value; - - if (strlen($new_char) === 1) { - $type->value[0] = $new_char; - } - } - } elseif ($type instanceof TNonEmptyList - && $key_value instanceof TLiteralInt - && count($key_values) === 1 - ) { - $has_matching_objectlike_property = true; - - $type->type_param = Type::combineUnionTypes( - clone $current_type, - $type->type_param, - $codebase, - true, - false - ); - } - } - } - - $child_stmt_type->bustCache(); - - if (!$has_matching_objectlike_property && !$has_matching_string) { - if (count($key_values) === 1) { - $key_value = $key_values[0]; - - $object_like = new TKeyedArray( - [$key_value->value => clone $current_type], - $key_value instanceof TLiteralClassString - ? [$key_value->value => true] - : null - ); - - $object_like->sealed = true; - - $array_assignment_type = new Union([ - $object_like, - ]); - } else { - $array_assignment_literals = $key_values; - - $array_assignment_type = new Union([ - new TNonEmptyArray([ - new Union($array_assignment_literals), - clone $current_type - ]) - ]); - } - - return Type::combineUnionTypes( - $child_stmt_type, - $array_assignment_type, - $codebase, - true, - false - ); - } - - return $child_stmt_type; - } - - /** - * @param list $key_values $key_values - */ - private static function taintArrayAssignment( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\ArrayDimFetch $expr, - Union $stmt_type, - Union $child_stmt_type, - ?string $var_var_id, - array $key_values - ): void { - if ($statements_analyzer->data_flow_graph - && ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - || !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues())) - ) { - $var_location = new CodeLocation($statements_analyzer->getSource(), $expr->var); - - $parent_node = DataFlowNode::getForAssignment( - $var_var_id ?: 'assignment', - $var_location - ); - - $statements_analyzer->data_flow_graph->addNode($parent_node); - - $old_parent_nodes = $stmt_type->parent_nodes; - - $stmt_type->parent_nodes = [$parent_node->id => $parent_node]; - - foreach ($old_parent_nodes as $old_parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $old_parent_node, - $parent_node, - '=' - ); - - if ($stmt_type->by_ref) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $old_parent_node, - '=' - ); - } - } - - foreach ($stmt_type->parent_nodes as $parent_node) { - foreach ($child_stmt_type->parent_nodes as $child_parent_node) { - if ($key_values) { - foreach ($key_values as $key_value) { - $statements_analyzer->data_flow_graph->addPath( - $child_parent_node, - $parent_node, - 'arrayvalue-assignment-\'' . $key_value->value . '\'' - ); - } - } else { - $statements_analyzer->data_flow_graph->addPath( - $child_parent_node, - $parent_node, - 'arrayvalue-assignment' - ); - } - } - } - } - } - - private static function updateArrayAssignmentChildType( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - ?PhpParser\Node\Expr $current_dim, - Context $context, - Union $value_type, - Union $root_type, - bool $offset_already_existed, - ?PhpParser\Node\Expr $child_stmt, - ?string $parent_var_id - ): Union { - $templated_assignment = false; - - if ($current_dim) { - $key_type = $statements_analyzer->node_data->getType($current_dim); - - if ($key_type) { - if ($key_type->hasMixed()) { - $key_type = Type::getArrayKey(); - } - - if ($key_type->isSingle()) { - $key_type_type = $key_type->getSingleAtomic(); - - if ($key_type_type instanceof TDependentListKey - && $key_type_type->getVarId() === $parent_var_id - ) { - $offset_already_existed = true; - } - - if ($key_type_type instanceof TTemplateParam - && $key_type_type->as->isSingle() - && $root_type->isSingle() - && $value_type->isSingle() - ) { - $key_type_as_type = $key_type_type->as->getSingleAtomic(); - $value_atomic_type = $value_type->getSingleAtomic(); - $root_atomic_type = $root_type->getSingleAtomic(); - - if ($key_type_as_type instanceof TTemplateKeyOf - && $root_atomic_type instanceof TTemplateParam - && $value_atomic_type instanceof TTemplateIndexedAccess - && $key_type_as_type->param_name === $root_atomic_type->param_name - && $key_type_as_type->defining_class === $root_atomic_type->defining_class - && $value_atomic_type->array_param_name === $root_atomic_type->param_name - && $value_atomic_type->offset_param_name === $key_type_type->param_name - && $value_atomic_type->defining_class === $root_atomic_type->defining_class - ) { - $templated_assignment = true; - $offset_already_existed = true; - } - } - } - - $array_atomic_key_type = ArrayFetchAnalyzer::replaceOffsetTypeWithInts( - $key_type - ); - } else { - $array_atomic_key_type = Type::getArrayKey(); - } - - if ($offset_already_existed - && $child_stmt - && $parent_var_id - && ($parent_type = $context->vars_in_scope[$parent_var_id] ?? null) - ) { - if ($parent_type->hasList()) { - $array_atomic_type = new TNonEmptyList( - $value_type - ); - } elseif ($parent_type->hasClassStringMap() - && $key_type - && $key_type->isTemplatedClassString() - ) { - /** - * @var TClassStringMap - * @psalm-suppress PossiblyUndefinedStringArrayOffset - */ - $class_string_map = $parent_type->getAtomicTypes()['array']; - /** - * @var TTemplateParamClass - */ - $offset_type_part = $key_type->getSingleAtomic(); - - $template_result = new TemplateResult( - [], - [ - $offset_type_part->param_name => [ - $offset_type_part->defining_class => new Union([ - new TTemplateParam( - $class_string_map->param_name, - $offset_type_part->as_type - ? new Union([$offset_type_part->as_type]) - : Type::getObject(), - 'class-string-map' - ) - ]) - ] - ] - ); - - TemplateInferredTypeReplacer::replace( - $value_type, - $template_result, - $codebase - ); - - $array_atomic_type = new TClassStringMap( - $class_string_map->param_name, - $class_string_map->as_type, - $value_type - ); - } else { - $array_atomic_type = new TNonEmptyArray([ - $array_atomic_key_type, - $value_type, - ]); - } - } else { - $array_atomic_type = new TNonEmptyArray([ - $array_atomic_key_type, - $value_type, - ]); - } - } else { - $array_atomic_type = new TNonEmptyList($value_type); - } - - $from_countable_object_like = false; - - $new_child_type = null; - - if (!$current_dim && !$context->inside_loop) { - $atomic_root_types = $root_type->getAtomicTypes(); - - if (isset($atomic_root_types['array'])) { - if ($array_atomic_type instanceof TClassStringMap) { - $array_atomic_type = new TNonEmptyArray([ - $array_atomic_type->getStandinKeyParam(), - $array_atomic_type->value_param - ]); - } elseif ($atomic_root_types['array'] instanceof TNonEmptyArray - || $atomic_root_types['array'] instanceof TNonEmptyList - ) { - $array_atomic_type->count = $atomic_root_types['array']->count; - } elseif ($atomic_root_types['array'] instanceof TKeyedArray - && $atomic_root_types['array']->sealed - ) { - $array_atomic_type->count = count($atomic_root_types['array']->properties); - $from_countable_object_like = true; - - if ($atomic_root_types['array']->is_list - && $array_atomic_type instanceof TList - ) { - $array_atomic_type = clone $atomic_root_types['array']; - - $new_child_type = new Union([$array_atomic_type]); - - $new_child_type->parent_nodes = $root_type->parent_nodes; - } - } elseif ($array_atomic_type instanceof TList) { - $array_atomic_type = new TNonEmptyList( - $array_atomic_type->type_param - ); - } else { - $array_atomic_type = new TNonEmptyArray( - $array_atomic_type->type_params - ); - } - } - } - - $array_assignment_type = new Union([ - $array_atomic_type, - ]); - - if (!$new_child_type) { - if ($templated_assignment) { - $new_child_type = $root_type; - } else { - $new_child_type = Type::combineUnionTypes( - $root_type, - $array_assignment_type, - $codebase, - true, - true - ); - } - } - - if ($from_countable_object_like) { - $atomic_root_types = $new_child_type->getAtomicTypes(); - - if (isset($atomic_root_types['array']) - && ($atomic_root_types['array'] instanceof TNonEmptyArray - || $atomic_root_types['array'] instanceof TNonEmptyList) - && $atomic_root_types['array']->count !== null - ) { - $atomic_root_types['array']->count++; - } - } - - return $new_child_type; - } - - /** - * @param array $child_stmts - */ - private static function analyzeNestedArrayAssignment( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - Context $context, - ?PhpParser\Node\Expr $assign_value, - Union $assignment_type, - array $child_stmts, - ?string $root_var_id, - ?string &$parent_var_id, - ?PhpParser\Node\Expr &$child_stmt, - Union &$root_type, - Union &$current_type, - ?PhpParser\Node\Expr &$current_dim, - bool &$offset_already_existed - ): void { - $reversed_child_stmts = []; - $var_id_additions = []; - $full_var_id = true; - - $child_stmt = null; - - // First go from the root element up, and go as far as we can to figure out what - // array types there are - while ($child_stmts) { - $child_stmt = array_shift($child_stmts); - - if (count($child_stmts)) { - array_unshift($reversed_child_stmts, $child_stmt); - } - - $child_stmt_dim_type = null; - - $offset_type = null; - - if ($child_stmt->dim) { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $child_stmt->dim, - $context - ) === false) { - $context->inside_general_use = $was_inside_general_use; - - return; - } - - $context->inside_general_use = $was_inside_general_use; - - if (!($child_stmt_dim_type = $statements_analyzer->node_data->getType($child_stmt->dim))) { - return; - } - - [$offset_type, $var_id_addition, $full_var_id] = self::getArrayAssignmentOffsetType( - $statements_analyzer, - $child_stmt, - $child_stmt_dim_type - ); - - $var_id_additions[] = $var_id_addition; - } else { - $var_id_additions[] = ''; - $full_var_id = false; - } - - if (!($child_stmt_var_type = $statements_analyzer->node_data->getType($child_stmt->var))) { - return; - } - - if ($child_stmt_var_type->isEmpty()) { - $child_stmt_var_type = Type::getEmptyArray(); - $statements_analyzer->node_data->setType($child_stmt->var, $child_stmt_var_type); - } - - $array_var_id = $root_var_id . implode('', $var_id_additions); - - if ($parent_var_id && isset($context->vars_in_scope[$parent_var_id])) { - $child_stmt_var_type = clone $context->vars_in_scope[$parent_var_id]; - $statements_analyzer->node_data->setType($child_stmt->var, $child_stmt_var_type); - } - - $array_type = clone $child_stmt_var_type; - - $child_stmt_type = ArrayFetchAnalyzer::getArrayAccessTypeGivenOffset( - $statements_analyzer, - $child_stmt, - $array_type, - $child_stmt_dim_type ?? Type::getInt(), - true, - $array_var_id, - $context, - $assign_value, - $child_stmts ? null : $assignment_type - ); - - $statements_analyzer->node_data->setType( - $child_stmt, - $child_stmt_type - ); - - $statements_analyzer->node_data->setType($child_stmt->var, $array_type); - - if ($root_var_id) { - if (!$parent_var_id) { - $rooted_parent_id = $root_var_id; - $root_type = $array_type; - } else { - $rooted_parent_id = $parent_var_id; - } - - $context->vars_in_scope[$rooted_parent_id] = $array_type; - $context->possibly_assigned_var_ids[$rooted_parent_id] = true; - } - - if (!$child_stmts) { - // we need this slight hack as the type we're putting it has to be - // different from the type we're getting out - if ($array_type->isSingle() && $array_type->hasClassStringMap()) { - $assignment_type = $child_stmt_type; - } - - $child_stmt_type = $assignment_type; - $statements_analyzer->node_data->setType($child_stmt, $assignment_type); - - if ($statements_analyzer->data_flow_graph) { - self::taintArrayAssignment( - $statements_analyzer, - $child_stmt, - $array_type, - $assignment_type, - ExpressionIdentifier::getArrayVarId( - $child_stmt->var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ), - $offset_type !== null ? [$offset_type] : [] - ); - } - } - - $current_type = $child_stmt_type; - $current_dim = $child_stmt->dim; - - $parent_var_id = $array_var_id; - } - - if ($root_var_id - && $full_var_id - && $child_stmt - && ($child_stmt_var_type = $statements_analyzer->node_data->getType($child_stmt->var)) - && !$child_stmt_var_type->hasObjectType() - ) { - $array_var_id = $root_var_id . implode('', $var_id_additions); - $parent_var_id = $root_var_id . implode('', array_slice($var_id_additions, 0, -1)); - - if (isset($context->vars_in_scope[$array_var_id]) - && !$context->vars_in_scope[$array_var_id]->possibly_undefined - ) { - $offset_already_existed = true; - } - - $context->vars_in_scope[$array_var_id] = clone $assignment_type; - $context->possibly_assigned_var_ids[$array_var_id] = true; - } - - // only update as many child stmts are we were able to process above - foreach ($reversed_child_stmts as $child_stmt) { - $child_stmt_type = $statements_analyzer->node_data->getType($child_stmt); - - if (!$child_stmt_type) { - throw new InvalidArgumentException('Should never get here'); - } - - $key_values = []; - - if ($current_dim instanceof PhpParser\Node\Scalar\String_) { - $key_values[] = new TLiteralString($current_dim->value); - } elseif ($current_dim instanceof PhpParser\Node\Scalar\LNumber) { - $key_values[] = new TLiteralInt($current_dim->value); - } elseif ($current_dim - && ($key_type = $statements_analyzer->node_data->getType($current_dim)) - ) { - $string_literals = $key_type->getLiteralStrings(); - $int_literals = $key_type->getLiteralInts(); - - $all_atomic_types = $key_type->getAtomicTypes(); - - if (count($string_literals) + count($int_literals) === count($all_atomic_types)) { - foreach ($string_literals as $string_literal) { - $key_values[] = clone $string_literal; - } - - foreach ($int_literals as $int_literal) { - $key_values[] = clone $int_literal; - } - } - } - - if ($key_values) { - $new_child_type = self::updateTypeWithKeyValues( - $codebase, - $child_stmt_type, - $current_type, - $key_values - ); - } else { - if (!$current_dim) { - $array_assignment_type = new Union([ - new TList($current_type), - ]); - } else { - $key_type = $statements_analyzer->node_data->getType($current_dim); - - $array_assignment_type = new Union([ - new TArray([ - $key_type && !$key_type->hasMixed() - ? $key_type - : Type::getArrayKey(), - $current_type, - ]), - ]); - } - - $new_child_type = Type::combineUnionTypes( - $child_stmt_type, - $array_assignment_type, - $codebase, - true, - true - ); - } - - $new_child_type->removeType('null'); - $new_child_type->possibly_undefined = false; - - if (!$child_stmt_type->hasObjectType()) { - $child_stmt_type = $new_child_type; - $statements_analyzer->node_data->setType($child_stmt, $new_child_type); - } - - $current_type = $child_stmt_type; - $current_dim = $child_stmt->dim; - - array_pop($var_id_additions); - - $parent_array_var_id = null; - - if ($root_var_id) { - $array_var_id = $root_var_id . implode('', $var_id_additions); - $parent_array_var_id = $root_var_id . implode('', array_slice($var_id_additions, 0, -1)); - $context->vars_in_scope[$array_var_id] = clone $child_stmt_type; - $context->possibly_assigned_var_ids[$array_var_id] = true; - } - - if ($statements_analyzer->data_flow_graph) { - self::taintArrayAssignment( - $statements_analyzer, - $child_stmt, - $statements_analyzer->node_data->getType($child_stmt->var) ?? Type::getMixed(), - $new_child_type, - $parent_array_var_id, - $key_values - ); - } - } - } - - /** - * @return array{TLiteralInt|TLiteralString|null, string, bool} - */ - private static function getArrayAssignmentOffsetType( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\ArrayDimFetch $child_stmt, - Union $child_stmt_dim_type - ): array { - if ($child_stmt->dim instanceof PhpParser\Node\Scalar\String_ - || (($child_stmt->dim instanceof PhpParser\Node\Expr\ConstFetch - || $child_stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch) - && $child_stmt_dim_type->isSingleStringLiteral()) - ) { - if ($child_stmt->dim instanceof PhpParser\Node\Scalar\String_) { - $offset_type = new TLiteralString($child_stmt->dim->value); - } else { - $offset_type = $child_stmt_dim_type->getSingleStringLiteral(); - } - - if (preg_match('/^(0|[1-9][0-9]*)$/', $offset_type->value)) { - $var_id_addition = '[' . $offset_type->value . ']'; - } else { - $var_id_addition = '[\'' . $offset_type->value . '\']'; - } - - return [$offset_type, $var_id_addition, true]; - } - - if ($child_stmt->dim instanceof PhpParser\Node\Scalar\LNumber - || (($child_stmt->dim instanceof PhpParser\Node\Expr\ConstFetch - || $child_stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch) - && $child_stmt_dim_type->isSingleIntLiteral()) - ) { - if ($child_stmt->dim instanceof PhpParser\Node\Scalar\LNumber) { - $offset_type = new TLiteralInt($child_stmt->dim->value); - } else { - $offset_type = $child_stmt_dim_type->getSingleIntLiteral(); - } - - $var_id_addition = '[' . $offset_type->value . ']'; - - return [$offset_type, $var_id_addition, true]; - } - - if ($child_stmt->dim instanceof PhpParser\Node\Expr\Variable - && is_string($child_stmt->dim->name) - ) { - $var_id_addition = '[$' . $child_stmt->dim->name . ']'; - - return [null, $var_id_addition, true]; - } - - if ($child_stmt->dim instanceof PhpParser\Node\Expr\PropertyFetch - && $child_stmt->dim->name instanceof PhpParser\Node\Identifier - ) { - $object_id = ExpressionIdentifier::getArrayVarId( - $child_stmt->dim->var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($object_id) { - $var_id_addition = '[' . $object_id . '->' . $child_stmt->dim->name->name . ']'; - } else { - $var_id_addition = '[' . $child_stmt_dim_type . ']'; - } - - return [null, $var_id_addition, true]; - } - - if ($child_stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch - && $child_stmt->dim->name instanceof PhpParser\Node\Identifier - && $child_stmt->dim->class instanceof PhpParser\Node\Name - ) { - $object_name = ClassLikeAnalyzer::getFQCLNFromNameObject( - $child_stmt->dim->class, - $statements_analyzer->getAliases() - ); - $var_id_addition = '[' . $object_name . '::' . $child_stmt->dim->name->name . ']'; - - return [null, $var_id_addition, true]; - } - - $var_id_addition = '[' . $child_stmt_dim_type . ']'; - - return [null, $var_id_addition, false]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php deleted file mode 100644 index 9756e4fc..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php +++ /dev/null @@ -1,33 +0,0 @@ -property_type = $property_type; - $this->id = $id; - $this->assignment_type = $assignment_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php deleted file mode 100644 index f5ebf74b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php +++ /dev/null @@ -1,1540 +0,0 @@ -getCodebase(); - - if ($stmt instanceof PropertyProperty) { - if (!$context->self || !$stmt->default) { - return null; - } - - $property_id = $context->self . '::$' . $prop_name; - - $class_property_type = null; - - try { - $class_property_type = $codebase->properties->getPropertyType( - $property_id, - true, - $statements_analyzer, - $context - ); - } catch (UnexpectedValueException $e) { - // do nothing - } - - if ($class_property_type) { - $class_storage = $codebase->classlike_storage_provider->get($context->self); - - $class_property_type = self::getExpandedPropertyType( - $codebase, - $context->self, - $prop_name, - $class_storage - ); - } - - $var_id = '$this->' . $prop_name; - - $assigned_properties = [ - new AssignedProperty( - $class_property_type ?? Type::getMixed(), - $property_id, - $assignment_value_type - ) - ]; - } else { - $assigned_properties = self::analyzeRegularAssignment( - $statements_analyzer, - $stmt, - $assignment_value, - $context, - $direct_assignment, - $codebase, - $assignment_value_type, - $prop_name, - $var_id - ); - } - - if (!$assigned_properties) { - return null; - } - - if ($assignment_value_type->hasMixed()) { - return null; - } - - $invalid_assignment_value_types = []; - - $has_valid_assignment_value_type = false; - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - && count($assigned_properties) === 1 - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt->name, - $assigned_properties[0]->property_type->getId() - ); - } - - foreach ($assigned_properties as $assigned_property) { - $class_property_type = $assigned_property->property_type; - $assignment_type = $assigned_property->assignment_type; - - if ($class_property_type->hasMixed()) { - continue; - } - - $union_comparison_results = new TypeComparisonResult(); - - $type_match_found = UnionTypeComparator::isContainedBy( - $codebase, - $assignment_type, - $class_property_type, - true, - true, - $union_comparison_results - ); - - if ($type_match_found && $union_comparison_results->replacement_union_type) { - if ($var_id) { - $context->vars_in_scope[$var_id] = $union_comparison_results->replacement_union_type; - } - } - - if ($union_comparison_results->type_coerced) { - if ($union_comparison_results->type_coerced_from_mixed) { - IssueBuffer::maybeAdd( - new MixedPropertyTypeCoercion( - $var_id . ' expects \'' . $class_property_type->getId() . '\', ' - . ' parent type `' . $assignment_type->getId() . '` provided', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt, - $context->include_location - ), - $assigned_property->id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new PropertyTypeCoercion( - $var_id . ' expects \'' . $class_property_type->getId() . '\', ' - . ' parent type \'' . $assignment_type->getId() . '\' provided', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt, - $context->include_location - ), - $assigned_property->id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($union_comparison_results->to_string_cast) { - IssueBuffer::maybeAdd( - new ImplicitToStringCast( - $var_id . ' expects \'' . $class_property_type . '\', ' - . '\'' . $assignment_type . '\' provided with a __toString method', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt, - $context->include_location - ) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (!$type_match_found && !$union_comparison_results->type_coerced) { - if (UnionTypeComparator::canBeContainedBy( - $codebase, - $assignment_type, - $class_property_type, - true, - true - )) { - $has_valid_assignment_value_type = true; - } - - $invalid_assignment_value_types[$assigned_property->id] = $class_property_type->getId(); - } else { - $has_valid_assignment_value_type = true; - } - - if ($type_match_found) { - if (!$assignment_type->ignore_nullable_issues - && $assignment_type->isNullable() - && !$class_property_type->isNullable() - ) { - if (IssueBuffer::accepts( - new PossiblyNullPropertyAssignmentValue( - $var_id . ' with non-nullable declared type \'' . $class_property_type . - '\' cannot be assigned nullable type \'' . $assignment_type . '\'', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt, - $context->include_location - ), - $assigned_property->id - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } - - if (!$assignment_type->ignore_falsable_issues - && $assignment_type->isFalsable() - && !$class_property_type->hasBool() - && !$class_property_type->hasScalar() - ) { - if (IssueBuffer::accepts( - new PossiblyFalsePropertyAssignmentValue( - $var_id . ' with non-falsable declared type \'' . $class_property_type . - '\' cannot be assigned possibly false type \'' . $assignment_type . '\'', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt, - $context->include_location - ), - $assigned_property->id - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } - } - } - - foreach ($invalid_assignment_value_types as $property_id => $invalid_class_property_type) { - if (!$has_valid_assignment_value_type) { - if (IssueBuffer::accepts( - new InvalidPropertyAssignmentValue( - $var_id . ' with declared type \'' . $invalid_class_property_type . - '\' cannot be assigned type \'' . $assignment_value_type->getId() . '\'', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt, - $context->include_location - ), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } else { - if (IssueBuffer::accepts( - new PossiblyInvalidPropertyAssignmentValue( - $var_id . ' with declared type \'' . $invalid_class_property_type . - '\' cannot be assigned possibly different type \'' . - $assignment_value_type->getId() . '\'', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt, - $context->include_location - ), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } - } - - return null; - } - - public static function trackPropertyImpurity( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\PropertyFetch $stmt, - string $property_id, - PropertyStorage $property_storage, - ClassLikeStorage $declaring_class_storage, - Context $context - ): void { - $codebase = $statements_analyzer->getCodebase(); - - $stmt_var_type = $statements_analyzer->node_data->getType($stmt->var); - - $property_var_pure_compatible = $stmt_var_type - && $stmt_var_type->reference_free - && $stmt_var_type->allow_mutations; - - $appearing_property_class = $codebase->properties->getAppearingClassForProperty( - $property_id, - true - ); - - $project_analyzer = $statements_analyzer->getProjectAnalyzer(); - - if ($appearing_property_class && ($property_storage->readonly || $codebase->alter_code)) { - $can_set_readonly_property = $context->self - && $context->calling_method_id - && ($appearing_property_class === $context->self - || $codebase->classExtends($context->self, $appearing_property_class)) - && (strpos($context->calling_method_id, '::__construct') - || strpos($context->calling_method_id, '::unserialize') - || strpos($context->calling_method_id, '::__unserialize') - || strpos($context->calling_method_id, '::__clone') - || $property_storage->allow_private_mutation - || $property_var_pure_compatible); - - if (!$can_set_readonly_property) { - if ($property_storage->readonly) { - IssueBuffer::maybeAdd( - new InaccessibleProperty( - $property_id . ' is marked readonly', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif (!$declaring_class_storage->mutation_free - && isset($project_analyzer->getIssuesToFix()['MissingImmutableAnnotation']) - && $statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - ) { - $codebase->analyzer->addMutableClass($declaring_class_storage->name); - } - } - } - } - - public static function analyzeStatement( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Stmt\Property $stmt, - Context $context - ): void { - foreach ($stmt->props as $prop) { - if ($prop->default) { - if ($stmt->isReadonly()) { - IssueBuffer::maybeAdd( - new InvalidPropertyAssignment( - 'Readonly property ' . $context->self . '::$' . $prop->name->name - . ' cannot have a default', - new CodeLocation($statements_analyzer->getSource(), $prop->default) - ) - ); - } - - ExpressionAnalyzer::analyze($statements_analyzer, $prop->default, $context); - - if ($prop_default_type = $statements_analyzer->node_data->getType($prop->default)) { - if (self::analyze( - $statements_analyzer, - $prop, - $prop->name->name, - $prop->default, - $prop_default_type, - $context - ) === false) { - // fall through - } - } - } - } - } - - private static function taintProperty( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\PropertyFetch $stmt, - string $property_id, - ClassLikeStorage $class_storage, - Union $assignment_value_type, - Context $context - ): void { - if (!$statements_analyzer->data_flow_graph) { - return; - } - - $codebase = $statements_analyzer->getCodebase(); - - $data_flow_graph = $statements_analyzer->data_flow_graph; - - $var_location = new CodeLocation($statements_analyzer->getSource(), $stmt->var); - $property_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - if ($class_storage->specialize_instance) { - $var_id = ExpressionIdentifier::getArrayVarId( - $stmt->var, - null, - $statements_analyzer - ); - - $var_property_id = ExpressionIdentifier::getArrayVarId( - $stmt, - null, - $statements_analyzer - ); - - if ($var_id) { - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - $context->vars_in_scope[$var_id]->parent_nodes = []; - return; - } - - $var_node = DataFlowNode::getForAssignment( - $var_id, - $var_location - ); - - $data_flow_graph->addNode($var_node); - - $property_node = DataFlowNode::getForAssignment( - $var_property_id ?: $var_id . '->$property', - $property_location - ); - - $data_flow_graph->addNode($property_node); - - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - $data_flow_graph->addPath( - $property_node, - $var_node, - 'property-assignment' - . ($stmt->name instanceof PhpParser\Node\Identifier ? '-' . $stmt->name : ''), - $added_taints, - $removed_taints - ); - - if ($assignment_value_type->parent_nodes) { - foreach ($assignment_value_type->parent_nodes as $parent_node) { - $data_flow_graph->addPath($parent_node, $property_node, '=', $added_taints, $removed_taints); - } - } - - $stmt_var_type = clone $context->vars_in_scope[$var_id]; - - if ($context->vars_in_scope[$var_id]->parent_nodes) { - foreach ($context->vars_in_scope[$var_id]->parent_nodes as $parent_node) { - $data_flow_graph->addPath($parent_node, $var_node, '=', $added_taints, $removed_taints); - } - } - - $stmt_var_type->parent_nodes = [$var_node->id => $var_node]; - - $context->vars_in_scope[$var_id] = $stmt_var_type; - } - } else { - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - $assignment_value_type->parent_nodes = []; - return; - } - - $var_property_id = ExpressionIdentifier::getArrayVarId( - $stmt, - null, - $statements_analyzer - ); - - $localized_property_node = DataFlowNode::getForAssignment( - $var_property_id - ?: $property_id . '-' . $property_location->file_name . ':' . $property_location->raw_file_start, - $property_location - ); - - $data_flow_graph->addNode($localized_property_node); - - $property_node = new DataFlowNode( - $property_id, - $property_id, - null, - null - ); - - $data_flow_graph->addNode($property_node); - - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - $data_flow_graph->addPath( - $localized_property_node, - $property_node, - 'property-assignment', - $added_taints, - $removed_taints - ); - - if ($assignment_value_type->parent_nodes) { - foreach ($assignment_value_type->parent_nodes as $parent_node) { - $data_flow_graph->addPath( - $parent_node, - $localized_property_node, - '=', - $added_taints, - $removed_taints - ); - } - } - - $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( - $property_id, - false, - $statements_analyzer - ); - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && $declaring_property_class - && $declaring_property_class !== $class_storage->name - && $stmt->name instanceof PhpParser\Node\Identifier - ) { - $declaring_property_node = new DataFlowNode( - $declaring_property_class . '::$' . $stmt->name, - $declaring_property_class . '::$' . $stmt->name, - null, - null - ); - - $data_flow_graph->addNode($declaring_property_node); - - $data_flow_graph->addPath( - $property_node, - $declaring_property_node, - 'property-assignment', - $added_taints, - $removed_taints - ); - } - } - } - - /** - * @return list - */ - private static function analyzeRegularAssignment( - StatementsAnalyzer $statements_analyzer, - PropertyFetch $stmt, - ?PhpParser\Node\Expr $assignment_value, - Context $context, - bool $direct_assignment, - Codebase $codebase, - Union $assignment_value_type, - string $prop_name, - ?string &$var_id - ): array { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - - ExpressionAnalyzer::analyze($statements_analyzer, $stmt->var, $context); - - $context->inside_general_use = $was_inside_general_use; - - $lhs_type = $statements_analyzer->node_data->getType($stmt->var); - - if ($lhs_type === null) { - return []; - } - - $lhs_var_id = ExpressionIdentifier::getVarId( - $stmt->var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $var_id = ExpressionIdentifier::getVarId( - $stmt, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($var_id) { - $context->assigned_var_ids[$var_id] = (int)$stmt->var->getAttribute('startFilePos'); - - if ($direct_assignment && isset($context->protected_var_ids[$var_id])) { - if (IssueBuffer::accepts( - new LoopInvalidation( - 'Variable ' . $var_id . ' has already been assigned in a for/foreach loop', - new CodeLocation($statements_analyzer->getSource(), $stmt->var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - } - } - } - - if ($lhs_type->hasMixed()) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - if ($stmt->name instanceof PhpParser\Node\Identifier) { - $codebase->analyzer->addMixedMemberName( - '$' . $stmt->name->name, - $context->calling_method_id ?: $statements_analyzer->getFileName() - ); - } - - if (IssueBuffer::accepts( - new MixedPropertyAssignment( - $lhs_var_id . ' of type mixed cannot be assigned to', - new CodeLocation($statements_analyzer->getSource(), $stmt->var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - } - - return []; - } - - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); - } - - if ($lhs_type->isNull()) { - if (IssueBuffer::accepts( - new NullPropertyAssignment( - $lhs_var_id . ' of type null cannot be assigned to', - new CodeLocation($statements_analyzer->getSource(), $stmt->var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - } - - return []; - } - - if ($lhs_type->isNullable() && !$lhs_type->ignore_nullable_issues) { - if (IssueBuffer::accepts( - new PossiblyNullPropertyAssignment( - $lhs_var_id . ' with possibly null type \'' . $lhs_type . '\' cannot be assigned to', - new CodeLocation($statements_analyzer->getSource(), $stmt->var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - } - } - - $has_regular_setter = false; - - $invalid_assignment_types = []; - - $has_valid_assignment_type = false; - - $lhs_atomic_types = $lhs_type->getAtomicTypes(); - - $assigned_properties = []; - - $context_type = null; - - while ($lhs_atomic_types) { - $lhs_type_part = array_pop($lhs_atomic_types); - - if ($lhs_type_part instanceof TTemplateParam) { - $lhs_atomic_types = array_merge( - $lhs_atomic_types, - $lhs_type_part->as->getAtomicTypes() - ); - - continue; - } - - $assigned_property = self::analyzeAtomicAssignment( - $statements_analyzer, - $codebase, - $stmt, - $assignment_value, - $prop_name, - $context, - $lhs_type, - $lhs_type_part, - $invalid_assignment_types, - $var_id, - $assignment_value_type, - $lhs_var_id, - $has_valid_assignment_type, - $has_regular_setter - ); - - if ($assigned_property) { - $assigned_properties[] = $assigned_property; - - if ($context_type) { - $context_type = Type::combineUnionTypes( - $context_type, - $assigned_property->assignment_type, - $codebase - ); - } else { - $context_type = $assigned_property->assignment_type; - } - } - } - - if ($invalid_assignment_types) { - $invalid_assignment_type = $invalid_assignment_types[0]; - - if (!$has_valid_assignment_type) { - if (IssueBuffer::accepts( - new InvalidPropertyAssignment( - $lhs_var_id . ' with non-object type \'' . $invalid_assignment_type . - '\' cannot treated as an object', - new CodeLocation($statements_analyzer->getSource(), $stmt->var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - } - } else { - if (IssueBuffer::accepts( - new PossiblyInvalidPropertyAssignment( - $lhs_var_id . ' with possible non-object type \'' . $invalid_assignment_type . - '\' cannot treated as an object', - new CodeLocation($statements_analyzer->getSource(), $stmt->var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - } - } - } - - if (!$has_regular_setter) { - return []; - } - - $context_type = $context_type ?: $assignment_value_type; - - if ($var_id) { - if ($context->collect_initializations - && $lhs_var_id === '$this' - ) { - $context_type->initialized_class = $context->self; - } - - // because we don't want to be assigning for property declarations - $context->vars_in_scope[$var_id] = $context_type; - } - - return $assigned_properties; - } - - /** - * @param list $invalid_assignment_types - */ - private static function analyzeAtomicAssignment( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PropertyFetch $stmt, - ?PhpParser\Node\Expr $assignment_value, - string $prop_name, - Context $context, - Union $lhs_type, - Atomic $lhs_type_part, - array &$invalid_assignment_types, - ?string $var_id, - Union $assignment_value_type, - ?string $lhs_var_id, - bool &$has_valid_assignment_type, - bool &$has_regular_setter - ): ?AssignedProperty { - if ($lhs_type_part instanceof TNull) { - return null; - } - - if ($lhs_type_part instanceof TFalse - && $lhs_type->ignore_falsable_issues - && count($lhs_type->getAtomicTypes()) > 1 - ) { - return null; - } - - if (!$lhs_type_part instanceof TObject && !$lhs_type_part instanceof TNamedObject) { - $invalid_assignment_types[] = (string)$lhs_type_part; - - return null; - } - - $has_valid_assignment_type = true; - - // stdClass and SimpleXMLElement are special cases where we cannot infer the return types - // but we don't want to throw an error - // Hack has a similar issue: https://github.com/facebook/hhvm/issues/5164 - if ($lhs_type_part instanceof TObject || - ( - in_array( - strtolower($lhs_type_part->value), - Config::getInstance()->getUniversalObjectCrates() + [ - 'dateinterval', - 'domdocument', - 'domnode' - ], - true - ) - ) - ) { - if ($var_id) { - if ($lhs_type_part instanceof TNamedObject && - strtolower($lhs_type_part->value) === 'stdclass' - ) { - $context->vars_in_scope[$var_id] = $assignment_value_type; - } else { - $context->vars_in_scope[$var_id] = Type::getMixed(); - } - } - - return null; - } - - if (ExpressionAnalyzer::isMock($lhs_type_part->value)) { - if ($var_id) { - $context->vars_in_scope[$var_id] = Type::getMixed(); - } - - return null; - } - - $intersection_types = $lhs_type_part->getIntersectionTypes() ?: []; - - $fq_class_name = $lhs_type_part->value; - - $override_property_visibility = false; - - $class_exists = false; - $interface_exists = false; - - if (!$codebase->classExists($lhs_type_part->value)) { - if ($codebase->interfaceExists($lhs_type_part->value)) { - $interface_exists = true; - $interface_storage = $codebase->classlike_storage_provider->get( - strtolower($lhs_type_part->value) - ); - - $override_property_visibility = $interface_storage->override_property_visibility; - - foreach ($intersection_types as $intersection_type) { - if ($intersection_type instanceof TNamedObject - && $codebase->classExists($intersection_type->value) - ) { - $fq_class_name = $intersection_type->value; - $class_exists = true; - break; - } - } - - if (!$class_exists) { - if (IssueBuffer::accepts( - new NoInterfaceProperties( - 'Interfaces cannot have properties', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $lhs_type_part->value - ), - $statements_analyzer->getSuppressedIssues() - )) { - return null; - } - - if (!$codebase->methods->methodExists( - new MethodIdentifier( - $fq_class_name, - '__set' - ) - )) { - return null; - } - } - } - - if (!$class_exists && !$interface_exists) { - IssueBuffer::maybeAdd( - new UndefinedClass( - 'Cannot set properties of undefined class ' . $lhs_type_part->value, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $lhs_type_part->value - ), - $statements_analyzer->getSuppressedIssues() - ); - - return null; - } - } else { - $class_exists = true; - } - - $property_id = $fq_class_name . '::$' . $prop_name; - - $has_magic_setter = false; - - $set_method_id = new MethodIdentifier($fq_class_name, '__set'); - - if ((!$codebase->properties->propertyExists($property_id, false, $statements_analyzer, $context) - || ($lhs_var_id !== '$this' - && $fq_class_name !== $context->self - && ClassLikeAnalyzer::checkPropertyVisibility( - $property_id, - $context, - $statements_analyzer, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues(), - false - ) !== true) - ) - && $codebase->methods->methodExists( - $set_method_id, - $context->calling_method_id, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer->getSource(), $stmt) - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $statements_analyzer - : null, - $statements_analyzer->getFilePath() - ) - ) { - $has_magic_setter = true; - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - if ($var_id) { - if (isset($class_storage->pseudo_property_set_types['$' . $prop_name])) { - $class_property_type = TypeExpander::expandUnion( - $codebase, - clone $class_storage->pseudo_property_set_types['$' . $prop_name], - $fq_class_name, - $fq_class_name, - $class_storage->parent_class - ); - - $has_regular_setter = true; - - if (!$context->collect_initializations && !$context->collect_mutations) { - self::taintProperty( - $statements_analyzer, - $stmt, - $property_id, - $class_storage, - $assignment_value_type, - $context - ); - } - - return new AssignedProperty( - $class_property_type, - $property_id, - $assignment_value_type - ); - } - } - - if ($assignment_value) { - self::analyzeSetCall( - $var_id, - $context, - $statements_analyzer, - $stmt, - $prop_name, - $assignment_value - ); - } - - /* - * If we have an explicit list of all allowed magic properties on the class, and we're - * not in that list, fall through - */ - if (!$var_id || !$class_storage->sealed_properties) { - if (!$context->collect_initializations && !$context->collect_mutations) { - self::taintProperty( - $statements_analyzer, - $stmt, - $property_id, - $class_storage, - $assignment_value_type, - $context - ); - } - - return null; - } - - if (!$class_exists) { - IssueBuffer::maybeAdd( - new UndefinedMagicPropertyAssignment( - 'Magic instance property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if (!$class_exists) { - return null; - } - - $has_regular_setter = true; - - if ($stmt->var instanceof PhpParser\Node\Expr\Variable - && $stmt->var->name === 'this' - && $context->self - ) { - $self_property_id = $context->self . '::$' . $prop_name; - - if ($self_property_id !== $property_id - && $codebase->properties->propertyExists( - $self_property_id, - false, - $statements_analyzer, - $context - ) - ) { - $property_id = $self_property_id; - } - } - - if ($statements_analyzer->data_flow_graph - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - self::taintProperty( - $statements_analyzer, - $stmt, - $property_id, - $class_storage, - $assignment_value_type, - $context - ); - } - - if (!$codebase->properties->propertyExists( - $property_id, - false, - $statements_analyzer, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ) - // when property existence is asserted by a plugin it doesn't necessarily has storage - || ($codebase->properties->hasStorage($property_id) - && $codebase->properties->getStorage($property_id)->is_static - ) - ) { - if ($stmt->var instanceof PhpParser\Node\Expr\Variable && $stmt->var->name === 'this') { - // if this is a proper error, we'll see it on the first pass - if ($context->collect_mutations) { - return null; - } - - IssueBuffer::maybeAdd( - new UndefinedThisPropertyAssignment( - 'Instance property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - if ($has_magic_setter) { - IssueBuffer::maybeAdd( - new UndefinedMagicPropertyAssignment( - 'Magic instance property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new UndefinedPropertyAssignment( - 'Instance property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - return null; - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->name, - $property_id - ); - } - - if (!$override_property_visibility) { - if (!$context->collect_mutations) { - if (ClassLikeAnalyzer::checkPropertyVisibility( - $property_id, - $context, - $statements_analyzer, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues() - ) === false) { - return null; - } - } else { - if (ClassLikeAnalyzer::checkPropertyVisibility( - $property_id, - $context, - $statements_analyzer, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues(), - false - ) !== true) { - return null; - } - } - } - - $declaring_property_class = (string)$codebase->properties->getDeclaringClassForProperty( - $property_id, - false - ); - - if ($codebase->properties_to_rename) { - $declaring_property_id = strtolower($declaring_property_class) . '::$' . $prop_name; - - foreach ($codebase->properties_to_rename as $original_property_id => $new_property_name) { - if ($declaring_property_id === $original_property_id) { - $file_manipulations = [ - new FileManipulation( - (int)$stmt->name->getAttribute('startFilePos'), - (int)$stmt->name->getAttribute('endFilePos') + 1, - $new_property_name - ) - ]; - - FileManipulationBuffer::add( - $statements_analyzer->getFilePath(), - $file_manipulations - ); - } - } - } - - $declaring_class_storage = $codebase->classlike_storage_provider->get($declaring_property_class); - - if (isset($declaring_class_storage->properties[$prop_name])) { - $property_storage = $declaring_class_storage->properties[$prop_name]; - - if ($property_storage->deprecated) { - IssueBuffer::maybeAdd( - new DeprecatedProperty( - $property_id . ' is marked deprecated', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($context->self && !NamespaceAnalyzer::isWithinAny($context->self, $property_storage->internal)) { - IssueBuffer::maybeAdd( - new InternalProperty( - $property_id . ' is internal to ' . InternalClass::listToPhrase($property_storage->internal) - . ' but called from ' . $context->self, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - self::trackPropertyImpurity( - $statements_analyzer, - $stmt, - $property_id, - $property_storage, - $declaring_class_storage, - $context - ); - - if (!$property_storage->readonly - && !$context->collect_mutations - && !$context->collect_initializations - && isset($context->vars_in_scope[$lhs_var_id]) - && !$context->vars_in_scope[$lhs_var_id]->allow_mutations - ) { - if ($context->mutation_free) { - IssueBuffer::maybeAdd( - new ImpurePropertyAssignment( - 'Cannot assign to a property from a mutation-free context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_impure = true; - } - } - - if ($property_storage->getter_method) { - $getter_id = $lhs_var_id . '->' . $property_storage->getter_method . '()'; - - unset($context->vars_in_scope[$getter_id]); - } - } - - $class_property_type = $codebase->properties->getPropertyType( - $property_id, - true, - $statements_analyzer, - $context - ); - - if (!$class_property_type - || (isset($declaring_class_storage->properties[$prop_name]) - && !$declaring_class_storage->properties[$prop_name]->type_location) - ) { - if (!$class_property_type) { - $class_property_type = Type::getMixed(); - } - - $source_analyzer = $statements_analyzer->getSource()->getSource(); - - if ($lhs_var_id === '$this' - && $source_analyzer instanceof ClassAnalyzer - ) { - $source_analyzer->inferred_property_types[$prop_name] = Type::combineUnionTypes( - $assignment_value_type, - $source_analyzer->inferred_property_types[$prop_name] ?? null - ); - } - } - - if (!$class_property_type->isMixed()) { - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $class_property_type = TypeExpander::expandUnion( - $codebase, - clone $class_property_type, - $fq_class_name, - $lhs_type_part, - $declaring_class_storage->parent_class, - true, - false, - $class_storage->final - ); - - $class_property_type = Methods::localizeType( - $codebase, - $class_property_type, - $fq_class_name, - $declaring_property_class - ); - - if ($lhs_type_part instanceof TGenericObject) { - $class_property_type = AtomicPropertyFetchAnalyzer::localizePropertyType( - $codebase, - $class_property_type, - $lhs_type_part, - $class_storage, - $declaring_class_storage - ); - } - - $assignment_value_type = Methods::localizeType( - $codebase, - $assignment_value_type, - $fq_class_name, - $declaring_property_class - ); - - if (!$class_property_type->hasMixed() && $assignment_value_type->hasMixed()) { - $origin_locations = []; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - foreach ($assignment_value_type->parent_nodes as $parent_node) { - $origin_locations = array_merge( - $origin_locations, - $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) - ); - } - } - - $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; - - $message = $var_id - ? 'Unable to determine the type that ' . $var_id . ' is being assigned to' - : 'Unable to determine the type of this assignment'; - - if ($origin_location && $origin_location->getLineNumber() === $stmt->getLine()) { - $origin_location = null; - } - - IssueBuffer::maybeAdd( - new MixedAssignment( - $message, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $origin_location - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - return new AssignedProperty( - $class_property_type, - $property_id, - $assignment_value_type - ); - } - - public static function getExpandedPropertyType( - Codebase $codebase, - string $fq_class_name, - string $property_name, - ClassLikeStorage $storage - ): ?Union { - $property_class_name = $codebase->properties->getDeclaringClassForProperty( - $fq_class_name . '::$' . $property_name, - true - ); - - if ($property_class_name === null) { - return null; - } - - $property_class_storage = $codebase->classlike_storage_provider->get($property_class_name); - - $property_storage = $property_class_storage->properties[$property_name]; - - if (!$property_storage->type) { - return null; - } - - $property_type = clone $property_storage->type; - - $fleshed_out_type = !$property_type->isMixed() - ? TypeExpander::expandUnion( - $codebase, - $property_type, - $fq_class_name, - $fq_class_name, - $storage->parent_class, - true, - false, - $storage->final - ) - : $property_type; - - $class_template_params = ClassTemplateParamCollector::collect( - $codebase, - $property_class_storage, - $storage, - null, - new TNamedObject($fq_class_name), - true - ); - - $template_result = new TemplateResult( - $class_template_params ?: [], - [] - ); - - if ($class_template_params) { - $fleshed_out_type = TemplateStandinTypeReplacer::replace( - $fleshed_out_type, - $template_result, - $codebase, - null, - null, - null - ); - } - - return $fleshed_out_type; - } - - private static function analyzeSetCall( - ?string $var_id, - Context $context, - StatementsAnalyzer $statements_analyzer, - PropertyFetch $stmt, - string $prop_name, - Expr $assignment_value - ): void { - if ($var_id) { - $context->removeVarFromConflictingClauses( - $var_id, - Type::getMixed(), - $statements_analyzer - ); - - unset($context->vars_in_scope[$var_id]); - } - - $old_data_provider = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $fake_method_call = new VirtualMethodCall( - $stmt->var, - new VirtualIdentifier('__set', $stmt->name->getAttributes()), - [ - new VirtualArg( - new VirtualString( - $prop_name, - $stmt->name->getAttributes() - ) - ), - new VirtualArg( - $assignment_value - ) - ] - ); - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('PossiblyNullReference', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['PossiblyNullReference']); - } - - MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_method_call, - $context, - false - ); - - if (!in_array('PossiblyNullReference', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['PossiblyNullReference']); - } - - $statements_analyzer->node_data = $old_data_provider; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php deleted file mode 100644 index ebe454a9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php +++ /dev/null @@ -1,342 +0,0 @@ -self, - $statements_analyzer - ); - - $lhs_type = $statements_analyzer->node_data->getType($stmt->class); - - if (!$lhs_type) { - return null; - } - - $codebase = $statements_analyzer->getCodebase(); - - $prop_name = $stmt->name; - - foreach ($lhs_type->getAtomicTypes() as $lhs_atomic_type) { - if ($lhs_atomic_type instanceof TClassString) { - if (!$lhs_atomic_type->as_type) { - continue; - } - - $lhs_atomic_type = $lhs_atomic_type->as_type; - } - - if (!$lhs_atomic_type instanceof TNamedObject) { - continue; - } - - $fq_class_name = $lhs_atomic_type->value; - - if (!$prop_name instanceof PhpParser\Node\Identifier) { - $was_inside_general_use = $context->inside_general_use; - - $context->inside_general_use = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $prop_name, $context) === false) { - $context->inside_general_use = $was_inside_general_use; - - return false; - } - - $context->inside_general_use = $was_inside_general_use; - - if (!$context->ignore_variable_property) { - $codebase->analyzer->addMixedMemberName( - strtolower($fq_class_name) . '::$', - $context->calling_method_id ?: $statements_analyzer->getFileName() - ); - } - - return null; - } - - $property_id = $fq_class_name . '::$' . $prop_name; - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->class, - $fq_class_name - ); - - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->name, - $property_id - ); - } - - if (!$codebase->properties->propertyExists($property_id, false, $statements_analyzer, $context)) { - IssueBuffer::maybeAdd( - new UndefinedPropertyAssignment( - 'Static property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - return null; - } - - if (ClassLikeAnalyzer::checkPropertyVisibility( - $property_id, - $context, - $statements_analyzer, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues() - ) === false) { - return false; - } - - $declaring_property_class = (string) $codebase->properties->getDeclaringClassForProperty( - $fq_class_name . '::$' . $prop_name->name, - false - ); - - $declaring_property_id = strtolower($declaring_property_class) . '::$' . $prop_name; - - if ($codebase->alter_code && $stmt->class instanceof PhpParser\Node\Name) { - $moved_class = $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $stmt->class, - $fq_class_name, - $context->calling_method_id - ); - - if (!$moved_class) { - foreach ($codebase->property_transforms as $original_pattern => $transformation) { - if ($declaring_property_id === $original_pattern) { - [$old_declaring_fq_class_name] = explode('::$', $declaring_property_id); - [$new_fq_class_name, $new_property_name] = explode('::$', $transformation); - - $file_manipulations = []; - - if (strtolower($new_fq_class_name) !== $old_declaring_fq_class_name) { - $file_manipulations[] = new FileManipulation( - (int) $stmt->class->getAttribute('startFilePos'), - (int) $stmt->class->getAttribute('endFilePos') + 1, - Type::getStringFromFQCLN( - $new_fq_class_name, - $statements_analyzer->getNamespace(), - $statements_analyzer->getAliasedClassesFlipped(), - null - ) - ); - } - - $file_manipulations[] = new FileManipulation( - (int) $stmt->name->getAttribute('startFilePos'), - (int) $stmt->name->getAttribute('endFilePos') + 1, - '$' . $new_property_name - ); - - FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); - } - } - } - } - - $class_storage = $codebase->classlike_storage_provider->get($declaring_property_class); - - if ($var_id) { - $context->vars_in_scope[$var_id] = $assignment_value_type; - } - - $class_property_type = $codebase->properties->getPropertyType( - $property_id, - true, - $statements_analyzer, - $context - ); - - if (!$class_property_type) { - $class_property_type = Type::getMixed(); - - $source_analyzer = $statements_analyzer->getSource()->getSource(); - - $prop_name_name = $prop_name->name; - - if ($source_analyzer instanceof ClassAnalyzer - && $fq_class_name === $source_analyzer->getFQCLN() - ) { - $source_analyzer->inferred_property_types[$prop_name_name] = Type::combineUnionTypes( - $assignment_value_type, - $source_analyzer->inferred_property_types[$prop_name_name] ?? null - ); - } - } else { - $class_property_type = clone $class_property_type; - } - - if ($assignment_value_type->hasMixed()) { - return null; - } - - if ($class_property_type->hasMixed()) { - return null; - } - - $class_property_type = TypeExpander::expandUnion( - $codebase, - $class_property_type, - $fq_class_name, - $fq_class_name, - $class_storage->parent_class - ); - - $union_comparison_results = new TypeComparisonResult(); - - $type_match_found = UnionTypeComparator::isContainedBy( - $codebase, - $assignment_value_type, - $class_property_type, - true, - true, - $union_comparison_results - ); - - if ($union_comparison_results->type_coerced) { - if ($union_comparison_results->type_coerced_from_mixed) { - IssueBuffer::maybeAdd( - new MixedPropertyTypeCoercion( - $var_id . ' expects \'' . $class_property_type->getId() . '\', ' - . ' parent type `' . $assignment_value_type->getId() . '` provided', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt, - $context->include_location - ), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new PropertyTypeCoercion( - $var_id . ' expects \'' . $class_property_type->getId() . '\', ' - . ' parent type \'' . $assignment_value_type->getId() . '\' provided', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt, - $context->include_location - ), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($union_comparison_results->to_string_cast) { - IssueBuffer::maybeAdd( - new ImplicitToStringCast( - $var_id . ' expects \'' . $class_property_type . '\', ' - . '\'' . $assignment_value_type . '\' provided with a __toString method', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt, - $context->include_location - ) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (!$type_match_found && !$union_comparison_results->type_coerced) { - if (UnionTypeComparator::canBeContainedBy($codebase, $assignment_value_type, $class_property_type)) { - if (IssueBuffer::accepts( - new PossiblyInvalidPropertyAssignmentValue( - $var_id . ' with declared type \'' - . $class_property_type->getId() . '\' cannot be assigned type \'' - . $assignment_value_type->getId() . '\'', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt - ), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } else { - if (IssueBuffer::accepts( - new InvalidPropertyAssignmentValue( - $var_id . ' with declared type \'' . $class_property_type->getId() - . '\' cannot be assigned type \'' - . $assignment_value_type->getId() . '\'', - new CodeLocation( - $statements_analyzer->getSource(), - $assignment_value ?? $stmt - ), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } - } - - if ($var_id) { - $context->vars_in_scope[$var_id] = $assignment_value_type; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php deleted file mode 100644 index 51e91919..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php +++ /dev/null @@ -1,1728 +0,0 @@ -getFQCLN(), - $statements_analyzer - ); - - // gets a variable id that *may* contain array keys - $array_var_id = ExpressionIdentifier::getArrayVarId( - $assign_var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $var_comments = []; - $comment_type = null; - $comment_type_location = null; - - $was_in_assignment = $context->inside_assignment; - - $context->inside_assignment = true; - - $codebase = $statements_analyzer->getCodebase(); - - $base_assign_value = $assign_value; - - while ($base_assign_value instanceof PhpParser\Node\Expr\Assign) { - $base_assign_value = $base_assign_value->expr; - } - - if ($base_assign_value !== $assign_value) { - ExpressionAnalyzer::analyze($statements_analyzer, $base_assign_value, $context); - - $assign_value_type = $statements_analyzer->node_data->getType($base_assign_value) ?? $assign_value_type; - } - - $removed_taints = []; - - if ($doc_comment) { - $file_path = $statements_analyzer->getRootFilePath(); - - $file_storage_provider = $codebase->file_storage_provider; - - $file_storage = $file_storage_provider->get($file_path); - - $template_type_map = $statements_analyzer->getTemplateTypeMap(); - - try { - $var_comments = $codebase->config->disable_var_parsing - ? [] - : CommentAnalyzer::getTypeFromComment( - $doc_comment, - $statements_analyzer->getSource(), - $statements_analyzer->getAliases(), - $template_type_map, - $file_storage->type_aliases - ); - } catch (IncorrectDocblockException $e) { - IssueBuffer::maybeAdd( - new MissingDocblockType( - $e->getMessage(), - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ) - ); - } catch (DocblockParseException $e) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $e->getMessage(), - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ) - ); - } - - foreach ($var_comments as $var_comment) { - if ($var_comment->removed_taints) { - $removed_taints = $var_comment->removed_taints; - } - - self::assignTypeFromVarDocblock( - $statements_analyzer, - $assign_var, - $var_comment, - $context, - $var_id, - $comment_type, - $comment_type_location, - $not_ignored_docblock_var_ids - ); - - if ($var_id === $var_comment->var_id && $assign_value_type && $comment_type) { - $comment_type->by_ref = $assign_value_type->by_ref; - } - } - } - - if ($array_var_id) { - unset($context->referenced_var_ids[$array_var_id]); - $context->assigned_var_ids[$array_var_id] = (int) $assign_var->getAttribute('startFilePos'); - $context->possibly_assigned_var_ids[$array_var_id] = true; - } - - if ($assign_value) { - if ($var_id && $assign_value instanceof PhpParser\Node\Expr\Closure) { - foreach ($assign_value->uses as $closure_use) { - if ($closure_use->byRef - && is_string($closure_use->var->name) - && $var_id === '$' . $closure_use->var->name - ) { - $context->vars_in_scope[$var_id] = Type::getClosure(); - $context->vars_possibly_in_scope[$var_id] = true; - } - } - } - - $was_inside_general_use = $context->inside_general_use; - - $root_expr = $assign_var; - - while ($root_expr instanceof PhpParser\Node\Expr\ArrayDimFetch) { - $root_expr = $root_expr->var; - } - - // if we don't know where this data is going, treat as a dead-end usage - if (!$root_expr instanceof PhpParser\Node\Expr\Variable - || (is_string($root_expr->name) - && in_array('$' . $root_expr->name, VariableFetchAnalyzer::SUPER_GLOBALS, true)) - ) { - $context->inside_general_use = true; - } - - if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_value, $context) === false) { - $context->inside_general_use = $was_inside_general_use; - - if ($var_id) { - if ($array_var_id) { - $context->removeDescendents($array_var_id, null, $assign_value_type); - } - - // if we're not exiting immediately, make everything mixed - $context->vars_in_scope[$var_id] = $comment_type ?? Type::getMixed(); - } - - return false; - } - - $context->inside_general_use = $was_inside_general_use; - } - - if ($comment_type && $comment_type_location) { - $temp_assign_value_type = $assign_value_type - ?? ($assign_value ? $statements_analyzer->node_data->getType($assign_value) : null); - - if ($codebase->find_unused_variables - && $temp_assign_value_type - && $array_var_id - && (!$not_ignored_docblock_var_ids || isset($not_ignored_docblock_var_ids[$array_var_id])) - && $temp_assign_value_type->getId() === $comment_type->getId() - && !$comment_type->isMixed() - ) { - if ($codebase->alter_code - && isset($statements_analyzer->getProjectAnalyzer()->getIssuesToFix()['UnnecessaryVarAnnotation']) - ) { - FileManipulationBuffer::addVarAnnotationToRemove($comment_type_location); - } elseif (IssueBuffer::accepts( - new UnnecessaryVarAnnotation( - 'The @var ' . $comment_type . ' annotation for ' - . $array_var_id . ' is unnecessary', - $comment_type_location - ), - $statements_analyzer->getSuppressedIssues(), - true - )) { - // fall through - } - } - - $parent_nodes = $temp_assign_value_type->parent_nodes ?? []; - - $assign_value_type = $comment_type; - $assign_value_type->parent_nodes = $parent_nodes; - } elseif (!$assign_value_type) { - if ($assign_value) { - $assign_value_type = $statements_analyzer->node_data->getType($assign_value); - } - - if ($assign_value_type) { - $assign_value_type = clone $assign_value_type; - $assign_value_type->from_property = false; - $assign_value_type->from_static_property = false; - $assign_value_type->ignore_isset = false; - } else { - $assign_value_type = Type::getMixed(); - } - } - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - && !$assign_value_type->parent_nodes - ) { - if ($array_var_id) { - $assignment_node = DataFlowNode::getForAssignment( - $array_var_id, - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ); - } else { - $assignment_node = new DataFlowNode('unknown-origin', 'unknown origin', null); - } - - $assign_value_type->parent_nodes = [ - $assignment_node->id => $assignment_node - ]; - - if ($context->inside_try) { - // Copy previous assignment's parent nodes inside a try. Since an exception could be thrown at any - // point this is a workaround to ensure that use of a variable also uses all previous assignments. - if (isset($context->vars_in_scope[$array_var_id])) { - $assign_value_type->parent_nodes += $context->vars_in_scope[$array_var_id]->parent_nodes; - } - } - } - - if ($array_var_id && isset($context->vars_in_scope[$array_var_id])) { - if ($context->vars_in_scope[$array_var_id]->by_ref) { - if ($context->mutation_free) { - IssueBuffer::maybeAdd( - new ImpureByReferenceAssignment( - 'Variable ' . $array_var_id . ' cannot be assigned to as it is passed by reference', - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ) - ); - } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_impure = true; - $statements_analyzer->getSource()->inferred_has_mutation = true; - } - - $assign_value_type->by_ref = true; - } - - // removes dependent vars from $context - $context->removeDescendents( - $array_var_id, - $context->vars_in_scope[$array_var_id], - $assign_value_type, - $statements_analyzer - ); - } else { - $root_var_id = ExpressionIdentifier::getRootVarId( - $assign_var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($root_var_id && isset($context->vars_in_scope[$root_var_id])) { - $context->removeVarFromConflictingClauses( - $root_var_id, - $context->vars_in_scope[$root_var_id], - $statements_analyzer - ); - } - } - - $codebase = $statements_analyzer->getCodebase(); - - if ($assign_value_type->hasMixed()) { - $root_var_id = ExpressionIdentifier::getRootVarId( - $assign_var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - if (!$assign_var instanceof PhpParser\Node\Expr\PropertyFetch - && !strpos($root_var_id ?? '', '->') - && !$comment_type - && strpos($var_id ?? '', '$_') !== 0 - ) { - $origin_locations = []; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - foreach ($assign_value_type->parent_nodes as $parent_node) { - $origin_locations = array_merge( - $origin_locations, - $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) - ); - } - } - - $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; - - $message = $var_id - ? 'Unable to determine the type that ' . $var_id . ' is being assigned to' - : 'Unable to determine the type of this assignment'; - - $issue_location = new CodeLocation($statements_analyzer->getSource(), $assign_var); - - if ($origin_location && $origin_location->getHash() === $issue_location->getHash()) { - $origin_location = null; - } - - IssueBuffer::maybeAdd( - new MixedAssignment( - $message, - $issue_location, - $origin_location - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } else { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); - } - - if ($var_id - && isset($context->byref_constraints[$var_id]) - && ($outer_constraint_type = $context->byref_constraints[$var_id]->type) - ) { - if (!UnionTypeComparator::isContainedBy( - $codebase, - $assign_value_type, - $outer_constraint_type, - $assign_value_type->ignore_nullable_issues, - $assign_value_type->ignore_falsable_issues - ) - ) { - IssueBuffer::maybeAdd( - new ReferenceConstraintViolation( - 'Variable ' . $var_id . ' is limited to values of type ' - . $context->byref_constraints[$var_id]->type - . ' because it is passed by reference, ' - . $assign_value_type->getId() . ' type found', - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - if ($var_id === '$this' && IssueBuffer::accepts( - new InvalidScope( - 'Cannot re-assign ' . $var_id, - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - if (isset($context->protected_var_ids[$var_id]) - && $assign_value_type->hasLiteralInt() - ) { - IssueBuffer::maybeAdd( - new LoopInvalidation( - 'Variable ' . $var_id . ' has already been assigned in a for/foreach loop', - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($assign_var instanceof PhpParser\Node\Expr\Variable) { - self::analyzeAssignmentToVariable( - $statements_analyzer, - $codebase, - $assign_var, - $assign_value, - $assign_value_type, - $var_id, - $context - ); - } elseif ($assign_var instanceof PhpParser\Node\Expr\List_ - || $assign_var instanceof PhpParser\Node\Expr\Array_ - ) { - self::analyzeDestructuringAssignment( - $statements_analyzer, - $codebase, - $assign_var, - $assign_value, - $assign_value_type, - $context, - $doc_comment, - $array_var_id, - $var_comments, - $removed_taints - ); - } elseif ($assign_var instanceof PhpParser\Node\Expr\ArrayDimFetch) { - ArrayAssignmentAnalyzer::analyze( - $statements_analyzer, - $assign_var, - $context, - $assign_value, - $assign_value_type - ); - } elseif ($assign_var instanceof PhpParser\Node\Expr\PropertyFetch) { - self::analyzePropertyAssignment( - $statements_analyzer, - $codebase, - $assign_var, - $context, - $assign_value, - $assign_value_type, - $var_id - ); - } elseif ($assign_var instanceof PhpParser\Node\Expr\StaticPropertyFetch && - $assign_var->class instanceof PhpParser\Node\Name - ) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_var, $context) === false) { - return false; - } - - if ($context->check_classes) { - if (StaticPropertyAssignmentAnalyzer::analyze( - $statements_analyzer, - $assign_var, - $assign_value, - $assign_value_type, - $context - ) === false) { - return false; - } - } - - if ($var_id) { - $context->vars_possibly_in_scope[$var_id] = true; - } - } - - if ($var_id && isset($context->vars_in_scope[$var_id])) { - if ($context->vars_in_scope[$var_id]->isVoid()) { - IssueBuffer::maybeAdd( - new AssignmentToVoid( - 'Cannot assign ' . $var_id . ' to type void', - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ), - $statements_analyzer->getSuppressedIssues() - ); - - $context->vars_in_scope[$var_id] = Type::getNull(); - - $context->inside_assignment = $was_in_assignment; - - return $context->vars_in_scope[$var_id]; - } - - if ($context->vars_in_scope[$var_id]->isNever()) { - if (IssueBuffer::accepts( - new NoValue( - 'This function or method call never returns output', - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - $context->vars_in_scope[$var_id] = Type::getEmpty(); - - $context->inside_assignment = $was_in_assignment; - - return $context->vars_in_scope[$var_id]; - } - - if ($statements_analyzer->data_flow_graph) { - $data_flow_graph = $statements_analyzer->data_flow_graph; - - if ($context->vars_in_scope[$var_id]->parent_nodes) { - $context->vars_in_scope[$var_id] = clone $context->vars_in_scope[$var_id]; - - if ($data_flow_graph instanceof TaintFlowGraph - && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - $context->vars_in_scope[$var_id]->parent_nodes = []; - } else { - $var_location = new CodeLocation($statements_analyzer->getSource(), $assign_var); - - $event = new AddRemoveTaintsEvent($assign_var, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = array_merge( - $removed_taints, - $codebase->config->eventDispatcher->dispatchRemoveTaints($event) - ); - - self::taintAssignment( - $context->vars_in_scope[$var_id], - $data_flow_graph, - $var_id, - $var_location, - $removed_taints, - $added_taints - ); - } - } - } - } - - $context->inside_assignment = $was_in_assignment; - - return $assign_value_type; - } - - public static function assignTypeFromVarDocblock( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node $stmt, - VarDocblockComment $var_comment, - Context $context, - ?string $var_id = null, - ?Union &$comment_type = null, - ?DocblockTypeLocation &$comment_type_location = null, - array $not_ignored_docblock_var_ids = [] - ): void { - if (!$var_comment->type) { - return; - } - - $codebase = $statements_analyzer->getCodebase(); - - try { - $var_comment_type = TypeExpander::expandUnion( - $codebase, - $var_comment->type, - $context->self, - $context->self, - $statements_analyzer->getParentFQCLN() - ); - - $var_comment_type->setFromDocblock(); - - $var_comment_type->check( - $statements_analyzer, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues(), - [], - false, - false, - false, - $context->calling_method_id - ); - - $type_location = null; - - if ($var_comment->type_start - && $var_comment->type_end - && $var_comment->line_number - ) { - $type_location = new DocblockTypeLocation( - $statements_analyzer, - $var_comment->type_start, - $var_comment->type_end, - $var_comment->line_number - ); - - if ($codebase->alter_code) { - $codebase->classlikes->handleDocblockTypeInMigration( - $codebase, - $statements_analyzer, - $var_comment_type, - $type_location, - $context->calling_method_id - ); - } - } - - if (!$var_comment->var_id || $var_comment->var_id === $var_id) { - $comment_type = $var_comment_type; - $comment_type_location = $type_location; - return; - } - - $project_analyzer = $statements_analyzer->getProjectAnalyzer(); - - if ($codebase->find_unused_variables - && $type_location - && (!$not_ignored_docblock_var_ids || isset($not_ignored_docblock_var_ids[$var_comment->var_id])) - && isset($context->vars_in_scope[$var_comment->var_id]) - && $context->vars_in_scope[$var_comment->var_id]->getId() === $var_comment_type->getId() - && !$var_comment_type->isMixed() - ) { - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['UnnecessaryVarAnnotation']) - ) { - FileManipulationBuffer::addVarAnnotationToRemove($type_location); - } elseif (IssueBuffer::accepts( - new UnnecessaryVarAnnotation( - 'The @var ' . $var_comment_type . ' annotation for ' - . $var_comment->var_id . ' is unnecessary', - $type_location - ), - $statements_analyzer->getSuppressedIssues(), - true - )) { - // fall through - } - } - - $parent_nodes = $context->vars_in_scope[$var_comment->var_id]->parent_nodes ?? []; - $var_comment_type->parent_nodes = $parent_nodes; - - $context->vars_in_scope[$var_comment->var_id] = $var_comment_type; - } catch (UnexpectedValueException $e) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $e->getMessage(), - new CodeLocation($statements_analyzer->getSource(), $stmt) - ) - ); - } - } - - /** - * @param array $removed_taints - * @param array $added_taints - */ - private static function taintAssignment( - Union $type, - DataFlowGraph $data_flow_graph, - string $var_id, - CodeLocation $var_location, - array $removed_taints, - array $added_taints - ): void { - $parent_nodes = $type->parent_nodes; - - $unspecialized_parent_nodes = array_filter( - $parent_nodes, - function ($parent_node) { - return !$parent_node->specialization_key; - } - ); - - $specialized_parent_nodes = array_filter( - $parent_nodes, - function ($parent_node) { - return (bool) $parent_node->specialization_key; - } - ); - - $new_parent_nodes = []; - - foreach ($specialized_parent_nodes as $parent_node) { - $new_parent_node = DataFlowNode::getForAssignment($var_id, $var_location); - $new_parent_node->specialization_key = $parent_node->specialization_key; - - $data_flow_graph->addNode($new_parent_node); - $new_parent_nodes += [$new_parent_node->id => $new_parent_node]; - $data_flow_graph->addPath( - $parent_node, - $new_parent_node, - '=', - $added_taints, - $removed_taints - ); - } - - if ($unspecialized_parent_nodes) { - $new_parent_node = DataFlowNode::getForAssignment($var_id, $var_location); - $data_flow_graph->addNode($new_parent_node); - $new_parent_nodes += [$new_parent_node->id => $new_parent_node]; - - foreach ($unspecialized_parent_nodes as $parent_node) { - $data_flow_graph->addPath( - $parent_node, - $new_parent_node, - '=', - $added_taints, - $removed_taints - ); - } - } - - $type->parent_nodes = $new_parent_nodes; - } - - public static function analyzeAssignmentOperation( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\AssignOp $stmt, - Context $context - ): bool { - if ($stmt instanceof PhpParser\Node\Expr\AssignOp\BitwiseAnd) { - $operation = new VirtualBitwiseAnd($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\BitwiseOr) { - $operation = new VirtualBitwiseOr($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\BitwiseXor) { - $operation = new VirtualBitwiseXor($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Coalesce) { - $operation = new VirtualCoalesce($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Concat) { - $operation = new VirtualConcat($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Div) { - $operation = new VirtualDiv($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Minus) { - $operation = new VirtualMinus($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Mod) { - $operation = new VirtualMod($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Mul) { - $operation = new VirtualMul($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Plus) { - $operation = new VirtualPlus($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\Pow) { - $operation = new VirtualPow($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\ShiftLeft) { - $operation = new VirtualShiftLeft($stmt->var, $stmt->expr, $stmt->getAttributes()); - } elseif ($stmt instanceof PhpParser\Node\Expr\AssignOp\ShiftRight) { - $operation = new VirtualShiftRight($stmt->var, $stmt->expr, $stmt->getAttributes()); - } else { - throw new UnexpectedValueException('Unknown assign op'); - } - - $fake_assignment = new VirtualAssign( - $stmt->var, - $operation, - $stmt->getAttributes() - ); - - $old_node_data = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $fake_assignment, $context) === false) { - return false; - } - - $old_node_data->setType( - $stmt, - $statements_analyzer->node_data->getType($operation) ?? Type::getMixed() - ); - - $statements_analyzer->node_data = $old_node_data; - - return true; - } - - public static function analyzeAssignmentRef( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\AssignRef $stmt, - Context $context - ): bool { - $assignment_type = self::analyze( - $statements_analyzer, - $stmt->var, - $stmt->expr, - null, - $context, - $stmt->getDocComment() - ); - - if ($assignment_type === false) { - return false; - } - - $assignment_type->by_ref = true; - - $lhs_var_id = ExpressionIdentifier::getArrayVarId( - $stmt->var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $rhs_var_id = ExpressionIdentifier::getArrayVarId( - $stmt->expr, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($lhs_var_id) { - $context->vars_in_scope[$lhs_var_id] = $assignment_type; - $context->hasVariable($lhs_var_id); - $context->byref_constraints[$lhs_var_id] = new ReferenceConstraint(); - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - foreach ($context->vars_in_scope[$lhs_var_id]->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - new DataFlowNode('variable-use', 'variable use', null), - 'variable-use' - ); - } - } - } - - if ($rhs_var_id) { - if (!isset($context->vars_in_scope[$rhs_var_id])) { - $context->vars_in_scope[$rhs_var_id] = Type::getMixed(); - } - - $context->byref_constraints[$rhs_var_id] = new ReferenceConstraint(); - } - - if ($statements_analyzer->data_flow_graph - && $lhs_var_id - && $rhs_var_id - && isset($context->vars_in_scope[$rhs_var_id]) - ) { - $rhs_type = $context->vars_in_scope[$rhs_var_id]; - - $data_flow_graph = $statements_analyzer->data_flow_graph; - - $lhs_location = new CodeLocation($statements_analyzer->getSource(), $stmt->var); - - $lhs_node = DataFlowNode::getForAssignment($lhs_var_id, $lhs_location); - - foreach ($rhs_type->parent_nodes as $byref_destination_node) { - $data_flow_graph->addPath($lhs_node, $byref_destination_node, '='); - } - } - - return true; - } - - public static function assignByRefParam( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $stmt, - Union $by_ref_type, - Union $by_ref_out_type, - Context $context, - bool $constrain_type = true, - bool $prevent_null = false - ): void { - if ($stmt instanceof PhpParser\Node\Expr\PropertyFetch && $stmt->name instanceof PhpParser\Node\Identifier) { - $prop_name = $stmt->name->name; - - InstancePropertyAssignmentAnalyzer::analyze( - $statements_analyzer, - $stmt, - $prop_name, - null, - $by_ref_out_type, - $context - ); - - return; - } - - $var_id = ExpressionIdentifier::getVarId( - $stmt, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($var_id) { - $var_not_in_scope = false; - - if (!$by_ref_type->hasMixed() && $constrain_type) { - $context->byref_constraints[$var_id] = new ReferenceConstraint($by_ref_type); - } - - if (!$context->hasVariable($var_id)) { - $context->vars_possibly_in_scope[$var_id] = true; - - $location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - if (!$statements_analyzer->hasVariable($var_id)) { - if ($constrain_type - && $prevent_null - && !$by_ref_type->isMixed() - && !$by_ref_type->isNullable() - && !strpos($var_id, '->') - && !strpos($var_id, '::') - ) { - IssueBuffer::maybeAdd( - new NullReference( - 'Not expecting null argument passed by reference', - $location - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\Variable) { - $statements_analyzer->registerVariable( - $var_id, - $location, - $context->branch_point - ); - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - $byref_node = DataFlowNode::getForAssignment($var_id, $location); - - $statements_analyzer->data_flow_graph->addPath( - $byref_node, - new DataFlowNode('variable-use', 'variable use', null), - 'variable-use' - ); - } - } - - $context->hasVariable($var_id); - } else { - $var_not_in_scope = true; - } - } elseif ($var_id === '$this') { - // don't allow changing $this - return; - } else { - $existing_type = $context->vars_in_scope[$var_id]; - - // removes dependent vars from $context - $context->removeDescendents( - $var_id, - $existing_type, - $by_ref_type, - $statements_analyzer - ); - - $by_ref_out_type = clone $by_ref_out_type; - - if ($existing_type->parent_nodes) { - $by_ref_out_type->parent_nodes += $existing_type->parent_nodes; - } - - if ($existing_type->getId() !== 'array') { - $context->vars_in_scope[$var_id] = $by_ref_out_type; - - if (!($stmt_type = $statements_analyzer->node_data->getType($stmt)) - || $stmt_type->isEmpty() - ) { - $statements_analyzer->node_data->setType($stmt, clone $by_ref_type); - } - - return; - } - } - - $context->assigned_var_ids[$var_id] = (int) $stmt->getAttribute('startFilePos'); - - $context->vars_in_scope[$var_id] = $by_ref_out_type; - - $stmt_type = $statements_analyzer->node_data->getType($stmt); - - if (!$stmt_type || $stmt_type->isEmpty()) { - $statements_analyzer->node_data->setType($stmt, clone $by_ref_type); - } - - if ($var_not_in_scope && $stmt instanceof PhpParser\Node\Expr\Variable) { - $statements_analyzer->registerPossiblyUndefinedVariable($var_id, $stmt); - } - } - } - - /** - * @param PhpParser\Node\Expr\List_|PhpParser\Node\Expr\Array_ $assign_var - * @param list $var_comments - * @param list $removed_taints - */ - private static function analyzeDestructuringAssignment( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr $assign_var, - ?PhpParser\Node\Expr $assign_value, - Union $assign_value_type, - Context $context, - ?PhpParser\Comment\Doc $doc_comment, - ?string $array_var_id, - array $var_comments, - array $removed_taints - ): void { - if (!$assign_value_type->hasArray() - && !$assign_value_type->isMixed() - && !$assign_value_type->hasArrayAccessInterface($codebase) - ) { - IssueBuffer::maybeAdd( - new InvalidArrayOffset( - 'Cannot destructure non-array of type ' . $assign_value_type->getId(), - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $can_be_empty = true; - - foreach ($assign_var->items as $offset => $assign_var_item) { - // $assign_var_item can be null e.g. list($a, ) = ['a', 'b'] - if (!$assign_var_item) { - continue; - } - - $var = $assign_var_item->value; - - if ($assign_value instanceof PhpParser\Node\Expr\Array_ - && $statements_analyzer->node_data->getType($assign_var_item->value) - ) { - self::analyze( - $statements_analyzer, - $var, - $assign_var_item->value, - null, - $context, - $doc_comment - ); - - continue; - } - - $offset_value = null; - - if (!$assign_var_item->key) { - $offset_value = $offset; - } elseif ($assign_var_item->key instanceof PhpParser\Node\Scalar\String_) { - $offset_value = $assign_var_item->key->value; - } - - $list_var_id = ExpressionIdentifier::getArrayVarId( - $var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $new_assign_type = null; - $assigned = false; - $has_null = false; - - foreach ($assign_value_type->getAtomicTypes() as $assign_value_atomic_type) { - if ($assign_value_atomic_type instanceof TKeyedArray - && !$assign_var_item->key - ) { - // if object-like has int offsets - if ($offset_value !== null - && isset($assign_value_atomic_type->properties[$offset_value]) - ) { - $value_type = $assign_value_atomic_type->properties[$offset_value]; - - if ($value_type->possibly_undefined) { - IssueBuffer::maybeAdd( - new PossiblyUndefinedArrayOffset( - 'Possibly undefined array key', - new CodeLocation($statements_analyzer->getSource(), $var) - ), - $statements_analyzer->getSuppressedIssues() - ); - - $value_type = clone $value_type; - $value_type->possibly_undefined = false; - } - - if ($statements_analyzer->data_flow_graph - && $assign_value - ) { - $assign_value_id = ExpressionIdentifier::getArrayVarId( - $assign_value, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $keyed_array_var_id = null; - - if ($assign_value_id) { - $keyed_array_var_id = $assign_value_id . '[\'' . $offset_value . '\']'; - } - - ArrayFetchAnalyzer::taintArrayFetch( - $statements_analyzer, - $assign_value, - $keyed_array_var_id, - $value_type, - Type::getString((string)$offset_value) - ); - } - - self::analyze( - $statements_analyzer, - $var, - null, - $value_type, - $context, - $doc_comment - ); - - $assigned = true; - - continue; - } - - if ($assign_value_atomic_type->sealed) { - IssueBuffer::maybeAdd( - new InvalidArrayOffset( - 'Cannot access value with offset ' . $offset, - new CodeLocation($statements_analyzer->getSource(), $var) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($assign_value_atomic_type instanceof TMixed) { - IssueBuffer::maybeAdd( - new MixedArrayAccess( - 'Cannot access array value on mixed variable ' . $array_var_id, - new CodeLocation($statements_analyzer->getSource(), $var) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($assign_value_atomic_type instanceof TNull) { - $has_null = true; - } elseif (!$assign_value_atomic_type instanceof TArray - && !$assign_value_atomic_type instanceof TKeyedArray - && !$assign_value_atomic_type instanceof TList - && !$assign_value_type->hasArrayAccessInterface($codebase) - ) { - if ($assign_value_type->hasArray()) { - if ($assign_value_atomic_type instanceof TFalse && $assign_value_type->ignore_falsable_issues) { - // do nothing - } elseif (IssueBuffer::accepts( - new PossiblyInvalidArrayAccess( - 'Cannot access array value on non-array variable ' - . $array_var_id . ' of type ' . $assign_value_atomic_type->getId(), - new CodeLocation($statements_analyzer->getSource(), $var) - ), - $statements_analyzer->getSuppressedIssues() - ) - ) { - // do nothing - } - } else { - if (IssueBuffer::accepts( - new InvalidArrayAccess( - 'Cannot access array value on non-array variable ' - . $array_var_id . ' of type ' . $assign_value_atomic_type->getId(), - new CodeLocation($statements_analyzer->getSource(), $var) - ), - $statements_analyzer->getSuppressedIssues() - ) - ) { - // do nothing - } - } - } - - if ($var instanceof PhpParser\Node\Expr\List_ - || $var instanceof PhpParser\Node\Expr\Array_ - ) { - if ($assign_value_atomic_type instanceof TKeyedArray) { - $assign_value_atomic_type = $assign_value_atomic_type->getGenericArrayType(); - } - - if ($assign_value_atomic_type instanceof TList) { - $assign_value_atomic_type = new TArray([ - Type::getInt(), - $assign_value_atomic_type->type_param - ]); - } - - $array_value_type = $assign_value_atomic_type instanceof TArray - ? clone $assign_value_atomic_type->type_params[1] - : Type::getMixed(); - - self::analyze( - $statements_analyzer, - $var, - null, - $array_value_type, - $context, - $doc_comment - ); - - continue; - } - - if ($list_var_id) { - $context->vars_possibly_in_scope[$list_var_id] = true; - $context->assigned_var_ids[$list_var_id] = (int)$var->getAttribute('startFilePos'); - $context->possibly_assigned_var_ids[$list_var_id] = true; - - $already_in_scope = isset($context->vars_in_scope[$list_var_id]); - - if (strpos($list_var_id, '-') === false && strpos($list_var_id, '[') === false) { - $location = new CodeLocation($statements_analyzer, $var); - - if (!$statements_analyzer->hasVariable($list_var_id)) { - $statements_analyzer->registerVariable( - $list_var_id, - $location, - $context->branch_point - ); - } else { - $statements_analyzer->registerVariableAssignment( - $list_var_id, - $location - ); - } - - if (isset($context->byref_constraints[$list_var_id])) { - // something - } - } - - if ($assign_value_atomic_type instanceof TArray) { - $new_assign_type = clone $assign_value_atomic_type->type_params[1]; - - if ($statements_analyzer->data_flow_graph - && $assign_value - ) { - ArrayFetchAnalyzer::taintArrayFetch( - $statements_analyzer, - $assign_value, - null, - $new_assign_type, - Type::getArrayKey() - ); - } - - $can_be_empty = !$assign_value_atomic_type instanceof TNonEmptyArray; - } elseif ($assign_value_atomic_type instanceof TList) { - $new_assign_type = clone $assign_value_atomic_type->type_param; - - if ($statements_analyzer->data_flow_graph && $assign_value) { - ArrayFetchAnalyzer::taintArrayFetch( - $statements_analyzer, - $assign_value, - null, - $new_assign_type, - Type::getArrayKey() - ); - } - - $can_be_empty = !$assign_value_atomic_type instanceof TNonEmptyList; - } elseif ($assign_value_atomic_type instanceof TKeyedArray) { - if (($assign_var_item->key instanceof PhpParser\Node\Scalar\String_ - || $assign_var_item->key instanceof PhpParser\Node\Scalar\LNumber) - && isset($assign_value_atomic_type->properties[$assign_var_item->key->value]) - ) { - $new_assign_type = - clone $assign_value_atomic_type->properties[$assign_var_item->key->value]; - - if ($new_assign_type->possibly_undefined) { - IssueBuffer::maybeAdd( - new PossiblyUndefinedArrayOffset( - 'Possibly undefined array key', - new CodeLocation($statements_analyzer->getSource(), $var) - ), - $statements_analyzer->getSuppressedIssues() - ); - - $new_assign_type->possibly_undefined = false; - } - } - - if ($statements_analyzer->data_flow_graph && $assign_value && $new_assign_type) { - ArrayFetchAnalyzer::taintArrayFetch( - $statements_analyzer, - $assign_value, - null, - $new_assign_type, - Type::getArrayKey() - ); - } - - $can_be_empty = !$assign_value_atomic_type->sealed; - } elseif ($assign_value_atomic_type->hasArrayAccessInterface($codebase)) { - ForeachAnalyzer::getKeyValueParamsForTraversableObject( - $assign_value_atomic_type, - $codebase, - $array_access_key_type, - $array_access_value_type - ); - - $new_assign_type = $array_access_value_type; - } - - if ($already_in_scope) { - // removes dependent vars from $context - $context->removeDescendents( - $list_var_id, - $context->vars_in_scope[$list_var_id], - $new_assign_type, - $statements_analyzer - ); - } - } - } - - - - if (!$assigned) { - if ($has_null) { - IssueBuffer::maybeAdd( - new PossiblyNullArrayAccess( - 'Cannot access array value on null variable ' . $array_var_id, - new CodeLocation($statements_analyzer->getSource(), $var) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - foreach ($var_comments as $var_comment) { - if (!$var_comment->type) { - continue; - } - - try { - if ($var_comment->var_id === $list_var_id) { - $var_comment_type = TypeExpander::expandUnion( - $codebase, - $var_comment->type, - $context->self, - $context->self, - $statements_analyzer->getParentFQCLN() - ); - - $var_comment_type->setFromDocblock(); - - $new_assign_type = $var_comment_type; - break; - } - } catch (UnexpectedValueException $e) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $e->getMessage(), - new CodeLocation($statements_analyzer->getSource(), $assign_var) - ) - ); - } - } - - if ($list_var_id) { - $context->vars_in_scope[$list_var_id] = $new_assign_type ?: Type::getMixed(); - - if ($statements_analyzer->data_flow_graph) { - $data_flow_graph = $statements_analyzer->data_flow_graph; - - $var_location = new CodeLocation($statements_analyzer->getSource(), $var); - - if (!$context->vars_in_scope[$list_var_id]->parent_nodes) { - $assignment_node = DataFlowNode::getForAssignment( - $list_var_id, - $var_location - ); - - $context->vars_in_scope[$list_var_id]->parent_nodes = [ - $assignment_node->id => $assignment_node - ]; - } else { - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - $context->vars_in_scope[$list_var_id]->parent_nodes = []; - } else { - $event = new AddRemoveTaintsEvent($var, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = array_merge( - $removed_taints, - $codebase->config->eventDispatcher->dispatchRemoveTaints($event) - ); - - self::taintAssignment( - $context->vars_in_scope[$list_var_id], - $data_flow_graph, - $list_var_id, - $var_location, - $removed_taints, - $added_taints - ); - } - } - } - } - } - - if ($list_var_id) { - if (($context->error_suppressing && ($offset || $can_be_empty)) - || $has_null - ) { - $context->vars_in_scope[$list_var_id]->addType(new TNull); - } - } - } - } - - private static function analyzePropertyAssignment( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\PropertyFetch $assign_var, - Context $context, - ?PhpParser\Node\Expr $assign_value, - Union $assign_value_type, - ?string $var_id - ): void { - if (!$assign_var->name instanceof PhpParser\Node\Identifier) { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - - // this can happen when the user actually means to type $this->, but there's - // a variable on the next line - if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_var->var, $context) === false) { - $context->inside_general_use = $was_inside_general_use; - - return; - } - - if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_var->name, $context) === false) { - $context->inside_general_use = $was_inside_general_use; - - return; - } - - $context->inside_general_use = $was_inside_general_use; - } - - if ($assign_var->name instanceof PhpParser\Node\Identifier) { - $prop_name = $assign_var->name->name; - } elseif (($assign_var_name_type = $statements_analyzer->node_data->getType($assign_var->name)) - && $assign_var_name_type->isSingleStringLiteral() - ) { - $prop_name = $assign_var_name_type->getSingleStringLiteral()->value; - } else { - $prop_name = null; - } - - if ($prop_name) { - InstancePropertyAssignmentAnalyzer::analyze( - $statements_analyzer, - $assign_var, - $prop_name, - $assign_value, - $assign_value_type, - $context - ); - } else { - if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_var->var, $context) === false) { - return; - } - - if (($assign_var_type = $statements_analyzer->node_data->getType($assign_var->var)) - && !$context->ignore_variable_property - ) { - $stmt_var_type = $assign_var_type; - - if ($stmt_var_type->hasObjectType()) { - foreach ($stmt_var_type->getAtomicTypes() as $type) { - if ($type instanceof TNamedObject) { - $codebase->analyzer->addMixedMemberName( - strtolower($type->value) . '::$', - $context->calling_method_id ?: $statements_analyzer->getFileName() - ); - } - } - } - } - } - - if ($var_id) { - $context->vars_possibly_in_scope[$var_id] = true; - } - - $property_var_pure_compatible = $statements_analyzer->node_data->isPureCompatible($assign_var->var); - - // prevents writing to any properties in a mutation-free context - if (!$property_var_pure_compatible - && !$context->collect_mutations - && !$context->collect_initializations - ) { - if ($context->mutation_free || $context->external_mutation_free) { - IssueBuffer::maybeAdd( - new ImpurePropertyAssignment( - 'Cannot assign to a property from a mutation-free context', - new CodeLocation($statements_analyzer, $assign_var) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - if (!$assign_var->var instanceof PhpParser\Node\Expr\Variable - || $assign_var->var->name !== 'this' - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - } - - $statements_analyzer->getSource()->inferred_impure = true; - } - } - } - - private static function analyzeAssignmentToVariable( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\Variable $assign_var, - ?PhpParser\Node\Expr $assign_value, - Union $assign_value_type, - ?string $var_id, - Context $context - ): void { - if (is_string($assign_var->name)) { - if ($var_id) { - $context->vars_in_scope[$var_id] = $assign_value_type; - $context->vars_possibly_in_scope[$var_id] = true; - - $location = new CodeLocation($statements_analyzer, $assign_var); - - if (!$statements_analyzer->hasVariable($var_id)) { - $statements_analyzer->registerVariable( - $var_id, - $location, - $context->branch_point - ); - } elseif (!$context->inside_isset) { - $statements_analyzer->registerVariableAssignment( - $var_id, - $location - ); - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $location = new CodeLocation($statements_analyzer, $assign_var); - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $assign_var, - $location->raw_file_start - . '-' . $location->raw_file_end - . ':' . $assign_value_type->getId() - ); - } - - if (isset($context->byref_constraints[$var_id])) { - $assign_value_type->by_ref = true; - } - - if ($assign_value_type->by_ref) { - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - && $assign_value_type->parent_nodes - ) { - $location = new CodeLocation($statements_analyzer, $assign_var); - - $byref_node = DataFlowNode::getForAssignment($var_id, $location); - - foreach ($assign_value_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - new DataFlowNode('variable-use', 'variable use', null), - 'variable-use' - ); - - $statements_analyzer->data_flow_graph->addPath( - $byref_node, - $parent_node, - 'byref-assignment' - ); - } - } - } - - if ($assign_value_type->getId() === 'bool' - && ($assign_value instanceof PhpParser\Node\Expr\BinaryOp - || ($assign_value instanceof PhpParser\Node\Expr\BooleanNot - && $assign_value->expr instanceof PhpParser\Node\Expr\BinaryOp)) - ) { - $var_object_id = spl_object_id($assign_var); - $cond_object_id = spl_object_id($assign_value); - - $right_clauses = FormulaGenerator::getFormula( - $cond_object_id, - $cond_object_id, - $assign_value, - $context->self, - $statements_analyzer, - $codebase - ); - - $right_clauses = Context::filterClauses( - $var_id, - $right_clauses - ); - - $assignment_clauses = Algebra::combineOredClauses( - [new Clause([$var_id => ['falsy']], $var_object_id, $var_object_id)], - $right_clauses, - $cond_object_id - ); - - $context->clauses = array_merge($context->clauses, $assignment_clauses); - } - } - } else { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $assign_var->name, $context) === false) { - $context->inside_general_use = $was_inside_general_use; - - return; - } - - $context->inside_general_use = $was_inside_general_use; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - && $assign_value_type->parent_nodes - ) { - foreach ($assign_value_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - new DataFlowNode('variable-use', 'variable use', null), - 'variable-use' - ); - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php deleted file mode 100644 index 1f4c28f1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php +++ /dev/null @@ -1,232 +0,0 @@ -left, - [ - 'stmts' => [ - new VirtualExpression( - $stmt->right - ) - ] - ], - $stmt->getAttributes() - ); - - return IfElseAnalyzer::analyze($statements_analyzer, $fake_if_stmt, $context) !== false; - } - - $pre_referenced_var_ids = $context->referenced_var_ids; - - $pre_assigned_var_ids = $context->assigned_var_ids; - - $left_context = clone $context; - - $left_context->referenced_var_ids = []; - $left_context->assigned_var_ids = []; - - /** @var list $left_context->reconciled_expression_clauses */ - $left_context->reconciled_expression_clauses = []; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->left, $left_context) === false) { - return false; - } - - IfConditionalAnalyzer::handleParadoxicalCondition($statements_analyzer, $stmt->left); - - $codebase = $statements_analyzer->getCodebase(); - - $left_cond_id = spl_object_id($stmt->left); - - $left_clauses = FormulaGenerator::getFormula( - $left_cond_id, - $left_cond_id, - $stmt->left, - $context->self, - $statements_analyzer, - $codebase - ); - - foreach ($left_context->vars_in_scope as $var_id => $type) { - if (isset($left_context->assigned_var_ids[$var_id])) { - $context->vars_in_scope[$var_id] = $type; - } - } - - /** @var array */ - $left_referenced_var_ids = $left_context->referenced_var_ids; - $context->referenced_var_ids = array_merge($pre_referenced_var_ids, $left_referenced_var_ids); - - $left_assigned_var_ids = array_diff_key($left_context->assigned_var_ids, $pre_assigned_var_ids); - - $left_referenced_var_ids = array_diff_key($left_referenced_var_ids, $left_assigned_var_ids); - - $context_clauses = array_merge($left_context->clauses, $left_clauses); - - if ($left_context->reconciled_expression_clauses) { - $reconciled_expression_clauses = $left_context->reconciled_expression_clauses; - - $context_clauses = array_values( - array_filter( - $context_clauses, - function ($c) use ($reconciled_expression_clauses): bool { - return !in_array($c->hash, $reconciled_expression_clauses); - } - ) - ); - - if (count($context_clauses) === 1 - && $context_clauses[0]->wedge - && !$context_clauses[0]->possibilities - ) { - $context_clauses = []; - } - } - - $simplified_clauses = Algebra::simplifyCNF($context_clauses); - - $active_left_assertions = []; - - $left_type_assertions = Algebra::getTruthsFromFormula( - $simplified_clauses, - $left_cond_id, - $left_referenced_var_ids, - $active_left_assertions - ); - - $changed_var_ids = []; - - $right_context = clone $left_context; - - if ($left_type_assertions) { - // while in an and, we allow scope to boil over to support - // statements of the form if ($x && $x->foo()) - $right_vars_in_scope = Reconciler::reconcileKeyedTypes( - $left_type_assertions, - $active_left_assertions, - $context->vars_in_scope, - $changed_var_ids, - $left_referenced_var_ids, - $statements_analyzer, - $statements_analyzer->getTemplateTypeMap() ?: [], - $context->inside_loop, - new CodeLocation($statements_analyzer->getSource(), $stmt->left), - $context->inside_negation - ); - - $right_context->vars_in_scope = $right_vars_in_scope; - - if ($context->if_scope) { - $context->if_scope->if_cond_changed_var_ids += $changed_var_ids; - } - } - - $partitioned_clauses = Context::removeReconciledClauses($left_clauses, $changed_var_ids); - - $right_context->clauses = $partitioned_clauses[0]; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->right, $right_context) === false) { - return false; - } - - IfConditionalAnalyzer::handleParadoxicalCondition($statements_analyzer, $stmt->right); - - $context->referenced_var_ids = array_merge( - $right_context->referenced_var_ids, - $left_context->referenced_var_ids - ); - - if ($context->inside_conditional) { - $context->updateChecks($right_context); - - $context->vars_possibly_in_scope = array_merge( - $right_context->vars_possibly_in_scope, - $left_context->vars_possibly_in_scope - ); - - $context->assigned_var_ids = array_merge( - $left_context->assigned_var_ids, - $right_context->assigned_var_ids - ); - } - - if ($context->if_context && !$context->inside_negation) { - $context->vars_in_scope = $right_context->vars_in_scope; - $if_context = $context->if_context; - - foreach ($right_context->vars_in_scope as $var_id => $type) { - if (!isset($if_context->vars_in_scope[$var_id])) { - $if_context->vars_in_scope[$var_id] = $type; - } elseif (isset($context->vars_in_scope[$var_id])) { - $if_context->vars_in_scope[$var_id] = $context->vars_in_scope[$var_id]; - } - } - - $if_context->referenced_var_ids = array_merge( - $context->referenced_var_ids, - $if_context->referenced_var_ids - ); - - $if_context->assigned_var_ids = array_merge( - $context->assigned_var_ids, - $if_context->assigned_var_ids - ); - - $if_context->reconciled_expression_clauses = array_merge( - $if_context->reconciled_expression_clauses, - array_map( - function ($c) { - return $c->hash; - }, - $partitioned_clauses[1] - ) - ); - - $if_context->vars_possibly_in_scope = array_merge( - $context->vars_possibly_in_scope, - $if_context->vars_possibly_in_scope - ); - - $if_context->updateChecks($context); - } else { - $context->vars_in_scope = $left_context->vars_in_scope; - } - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php deleted file mode 100644 index 2aa814c6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php +++ /dev/null @@ -1,1373 +0,0 @@ -getCodebase() : null; - - $left_type = $nodes->getType($left); - $right_type = $nodes->getType($right); - $config = Config::getInstance(); - - if ($left_type && $left_type->isEmpty()) { - $left_type = $right_type; - } elseif ($right_type && $right_type->isEmpty()) { - $right_type = $left_type; - } - - if ($left_type && $right_type) { - if ($left_type->isNull()) { - if ($statements_source && IssueBuffer::accepts( - new NullOperand( - 'Left operand cannot be null', - new CodeLocation($statements_source, $left) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - $result_type = Type::getMixed(); - - return; - } - - if ($left_type->isNullable() && !$left_type->ignore_nullable_issues) { - if ($statements_source && IssueBuffer::accepts( - new PossiblyNullOperand( - 'Left operand cannot be nullable, got ' . $left_type, - new CodeLocation($statements_source, $left) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } - - if ($right_type->isNull()) { - if ($statements_source && IssueBuffer::accepts( - new NullOperand( - 'Right operand cannot be null', - new CodeLocation($statements_source, $right) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - $result_type = Type::getMixed(); - - return; - } - - if ($right_type->isNullable() && !$right_type->ignore_nullable_issues) { - if ($statements_source && IssueBuffer::accepts( - new PossiblyNullOperand( - 'Right operand cannot be nullable, got ' . $right_type, - new CodeLocation($statements_source, $right) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } - - if ($left_type->isFalse()) { - if ($statements_source && IssueBuffer::accepts( - new FalseOperand( - 'Left operand cannot be false', - new CodeLocation($statements_source, $left) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - - return; - } - - if ($left_type->isFalsable() && !$left_type->ignore_falsable_issues) { - if ($statements_source && IssueBuffer::accepts( - new PossiblyFalseOperand( - 'Left operand cannot be falsable, got ' . $left_type, - new CodeLocation($statements_source, $left) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } - - if ($right_type->isFalse()) { - if ($statements_source && IssueBuffer::accepts( - new FalseOperand( - 'Right operand cannot be false', - new CodeLocation($statements_source, $right) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - - return; - } - - if ($right_type->isFalsable() && !$right_type->ignore_falsable_issues) { - if ($statements_source && IssueBuffer::accepts( - new PossiblyFalseOperand( - 'Right operand cannot be falsable, got ' . $right_type, - new CodeLocation($statements_source, $right) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } - - $invalid_left_messages = []; - $invalid_right_messages = []; - $has_valid_left_operand = false; - $has_valid_right_operand = false; - $has_string_increment = false; - - foreach ($left_type->getAtomicTypes() as $left_type_part) { - foreach ($right_type->getAtomicTypes() as $right_type_part) { - $candidate_result_type = self::analyzeOperands( - $statements_source, - $codebase, - $config, - $context, - $left, - $right, - $parent, - $left_type_part, - $right_type_part, - $invalid_left_messages, - $invalid_right_messages, - $has_valid_left_operand, - $has_valid_right_operand, - $has_string_increment, - $result_type - ); - - if ($candidate_result_type) { - $result_type = $candidate_result_type; - return; - } - } - } - - if ($invalid_left_messages && $statements_source) { - $first_left_message = $invalid_left_messages[0]; - - if ($has_valid_left_operand) { - IssueBuffer::maybeAdd( - new PossiblyInvalidOperand( - $first_left_message, - new CodeLocation($statements_source, $left) - ), - $statements_source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidOperand( - $first_left_message, - new CodeLocation($statements_source, $left) - ), - $statements_source->getSuppressedIssues() - ); - } - } - - if ($invalid_right_messages && $statements_source) { - $first_right_message = $invalid_right_messages[0]; - - if ($has_valid_right_operand) { - IssueBuffer::maybeAdd( - new PossiblyInvalidOperand( - $first_right_message, - new CodeLocation($statements_source, $right) - ), - $statements_source->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidOperand( - $first_right_message, - new CodeLocation($statements_source, $right) - ), - $statements_source->getSuppressedIssues() - ); - } - } - - if ($has_string_increment && $statements_source) { - IssueBuffer::maybeAdd( - new StringIncrement( - 'Possibly unintended string increment', - new CodeLocation($statements_source, $left) - ), - $statements_source->getSuppressedIssues() - ); - } - } - } - - /** - * @param int|float $result - */ - private static function getNumericalType($result): Union - { - if (is_int($result)) { - return Type::getInt(false, $result); - } - - return Type::getFloat($result); - } - - /** - * @param string[] $invalid_left_messages - * @param string[] $invalid_right_messages - */ - private static function analyzeOperands( - ?StatementsSource $statements_source, - ?Codebase $codebase, - Config $config, - ?Context $context, - PhpParser\Node\Expr $left, - PhpParser\Node\Expr $right, - PhpParser\Node $parent, - Atomic $left_type_part, - Atomic $right_type_part, - array &$invalid_left_messages, - array &$invalid_right_messages, - bool &$has_valid_left_operand, - bool &$has_valid_right_operand, - bool &$has_string_increment, - Union &$result_type = null - ): ?Union { - if ($left_type_part instanceof TLiteralInt - && $right_type_part instanceof TLiteralInt - && ( - //we don't try to do arithmetics on variables in loops - $context === null - || $context->inside_loop === false - || (!$left instanceof PhpParser\Node\Expr\Variable && !$right instanceof PhpParser\Node\Expr\Variable) - ) - ) { - // time for some arithmetic! - $calculated_type = self::arithmeticOperation( - $parent, - $left_type_part->value, - $right_type_part->value, - true - ); - - if ($calculated_type) { - $result_type = Type::combineUnionTypes( - $calculated_type, - $result_type - ); - - $has_valid_left_operand = true; - $has_valid_right_operand = true; - - return null; - } - } - - if ($left_type_part instanceof TNull || $right_type_part instanceof TNull) { - // null case is handled above - return null; - } - - if ($left_type_part instanceof TFalse || $right_type_part instanceof TFalse) { - // null case is handled above - return null; - } - - if ($left_type_part instanceof TString - && $right_type_part instanceof TInt - && ( - $parent instanceof PhpParser\Node\Expr\PostInc || - $parent instanceof PhpParser\Node\Expr\PreInc - ) - ) { - if ($left_type_part instanceof TNumericString || - ($left_type_part instanceof TLiteralString && is_numeric($left_type_part->value)) - ) { - $new_result_type = new Union([new TFloat(), new TInt()]); - $new_result_type->from_calculation = true; - } else { - $new_result_type = Type::getNonEmptyString(); - $has_string_increment = true; - } - - $result_type = Type::combineUnionTypes($new_result_type, $result_type); - - $has_valid_left_operand = true; - $has_valid_right_operand = true; - - return null; - } - - if ($left_type_part instanceof TTemplateParam - && $right_type_part instanceof TTemplateParam - ) { - $combined_type = Type::combineUnionTypes( - $left_type_part->as, - $right_type_part->as - ); - - $combined_atomic_types = array_values($combined_type->getAtomicTypes()); - - if (count($combined_atomic_types) <= 2) { - $left_type_part = $combined_atomic_types[0]; - $right_type_part = $combined_atomic_types[1] ?? $combined_atomic_types[0]; - } - } - - if ($left_type_part instanceof TMixed || $right_type_part instanceof TMixed) { - if ($statements_source && $codebase && $context) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_source->getFilePath() === $statements_source->getRootFilePath() - && (!(($source = $statements_source->getSource()) - instanceof FunctionLikeAnalyzer) - || !$source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_source->getFilePath()); - } - } - - if ($left_type_part instanceof TMixed) { - if ($statements_source && IssueBuffer::accepts( - new MixedOperand( - 'Left operand cannot be mixed', - new CodeLocation($statements_source, $left) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } else { - if ($statements_source && IssueBuffer::accepts( - new MixedOperand( - 'Right operand cannot be mixed', - new CodeLocation($statements_source, $right) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } - - if ($left_type_part instanceof TMixed - && $left_type_part->from_loop_isset - && $parent instanceof PhpParser\Node\Expr\AssignOp\Plus - && !$right_type_part instanceof TMixed - ) { - $result_type = Type::combineUnionTypes(new Union([$right_type_part]), $result_type); - - return null; - } - - $from_loop_isset = (!($left_type_part instanceof TMixed) || $left_type_part->from_loop_isset) - && (!($right_type_part instanceof TMixed) || $right_type_part->from_loop_isset); - - $result_type = Type::getMixed($from_loop_isset); - - return $result_type; - } - - if ($left_type_part instanceof TTemplateParam || $right_type_part instanceof TTemplateParam) { - if ($left_type_part instanceof TTemplateParam - && !$left_type_part->as->isInt() - && !$left_type_part->as->isFloat() - ) { - if ($statements_source && IssueBuffer::accepts( - new MixedOperand( - 'Left operand cannot be a non-numeric template', - new CodeLocation($statements_source, $left) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } elseif ($right_type_part instanceof TTemplateParam - && !$right_type_part->as->isInt() - && !$right_type_part->as->isFloat() - ) { - if ($statements_source && IssueBuffer::accepts( - new MixedOperand( - 'Right operand cannot be a non-numeric template', - new CodeLocation($statements_source, $right) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } - - return null; - } - - if ($statements_source && $codebase && $context) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_source->getFilePath() === $statements_source->getRootFilePath() - && (!(($parent_source = $statements_source->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_source->getFilePath()); - } - } - - if ($left_type_part instanceof TArray - || $right_type_part instanceof TArray - || $left_type_part instanceof TKeyedArray - || $right_type_part instanceof TKeyedArray - || $left_type_part instanceof TList - || $right_type_part instanceof TList - ) { - if ((!$right_type_part instanceof TArray - && !$right_type_part instanceof TKeyedArray - && !$right_type_part instanceof TList) - || (!$left_type_part instanceof TArray - && !$left_type_part instanceof TKeyedArray - && !$left_type_part instanceof TList) - ) { - if (!$left_type_part instanceof TArray - && !$left_type_part instanceof TKeyedArray - && !$left_type_part instanceof TList - ) { - $invalid_left_messages[] = 'Cannot add an array to a non-array ' . $left_type_part; - } else { - $invalid_right_messages[] = 'Cannot add an array to a non-array ' . $right_type_part; - } - - if ($left_type_part instanceof TArray - || $left_type_part instanceof TKeyedArray - || $left_type_part instanceof TList - ) { - $has_valid_left_operand = true; - } elseif ($right_type_part instanceof TArray - || $right_type_part instanceof TKeyedArray - || $right_type_part instanceof TList - ) { - $has_valid_right_operand = true; - } - - $result_type = Type::getArray(); - - return null; - } - - $has_valid_right_operand = true; - $has_valid_left_operand = true; - - if ($left_type_part instanceof TKeyedArray - && $right_type_part instanceof TKeyedArray - ) { - $definitely_existing_mixed_right_properties = array_diff_key( - $right_type_part->properties, - $left_type_part->properties - ); - - $properties = $left_type_part->properties; - - foreach ($right_type_part->properties as $key => $type) { - if (!isset($properties[$key])) { - $properties[$key] = $type; - } elseif ($properties[$key]->possibly_undefined) { - $properties[$key] = Type::combineUnionTypes( - $properties[$key], - $type, - $codebase - ); - - $properties[$key]->possibly_undefined = $type->possibly_undefined; - } - } - - if (!$left_type_part->sealed) { - foreach ($definitely_existing_mixed_right_properties as $key => $type) { - $properties[$key] = Type::combineUnionTypes(Type::getMixed(), $type); - } - } - - $new_keyed_array = new TKeyedArray($properties); - $new_keyed_array->sealed = $left_type_part->sealed && $right_type_part->sealed; - $result_type_member = new Union([$new_keyed_array]); - } else { - $result_type_member = TypeCombiner::combine( - [$left_type_part, $right_type_part], - $codebase, - true - ); - } - - $result_type = Type::combineUnionTypes($result_type_member, $result_type, $codebase, true); - - if ($left instanceof PhpParser\Node\Expr\ArrayDimFetch - && $context - && $statements_source instanceof StatementsAnalyzer - ) { - ArrayAssignmentAnalyzer::updateArrayType( - $statements_source, - $left, - $right, - $result_type, - $context - ); - } - - return null; - } - - if (($left_type_part instanceof TNamedObject && strtolower($left_type_part->value) === 'gmp') - || ($right_type_part instanceof TNamedObject && strtolower($right_type_part->value) === 'gmp') - ) { - if ((($left_type_part instanceof TNamedObject - && strtolower($left_type_part->value) === 'gmp') - && (($right_type_part instanceof TNamedObject - && strtolower($right_type_part->value) === 'gmp') - || ($right_type_part->isNumericType() || $right_type_part instanceof TMixed))) - || (($right_type_part instanceof TNamedObject - && strtolower($right_type_part->value) === 'gmp') - && (($left_type_part instanceof TNamedObject - && strtolower($left_type_part->value) === 'gmp') - || ($left_type_part->isNumericType() || $left_type_part instanceof TMixed))) - ) { - $result_type = Type::combineUnionTypes( - new Union([new TNamedObject('GMP')]), - $result_type - ); - } else { - if ($statements_source && IssueBuffer::accepts( - new InvalidOperand( - 'Cannot add GMP to non-numeric type', - new CodeLocation($statements_source, $parent) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } - - return null; - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Plus - || $parent instanceof PhpParser\Node\Expr\BinaryOp\Minus - || $parent instanceof PhpParser\Node\Expr\BinaryOp\Mul - || $parent instanceof PhpParser\Node\Expr\BinaryOp\Div - || $parent instanceof PhpParser\Node\Expr\BinaryOp\Mod - || $parent instanceof PhpParser\Node\Expr\BinaryOp\Pow - ) { - $non_decimal_type = null; - if ($left_type_part instanceof TNamedObject - && strtolower($left_type_part->value) === "decimal\\decimal" - ) { - $non_decimal_type = $right_type_part; - } elseif ($right_type_part instanceof TNamedObject - && strtolower($right_type_part->value) === "decimal\\decimal" - ) { - $non_decimal_type = $left_type_part; - } - if ($non_decimal_type !== null) { - if ($non_decimal_type instanceof TInt - || $non_decimal_type instanceof TNumericString - || $non_decimal_type instanceof TNamedObject - && strtolower($non_decimal_type->value) === "decimal\\decimal" - ) { - $result_type = Type::combineUnionTypes( - new Union([new TNamedObject("Decimal\\Decimal")]), - $result_type - ); - } else { - if ($statements_source) { - IssueBuffer::maybeAdd( - new InvalidOperand( - "Cannot add Decimal\\Decimal to {$non_decimal_type->getId()}", - new CodeLocation($statements_source, $parent) - ), - $statements_source->getSuppressedIssues() - ); - } - } - - return null; - } - } - - if ($left_type_part instanceof TLiteralString) { - if (preg_match('/^\-?\d+$/', $left_type_part->value)) { - $left_type_part = new TLiteralInt((int) $left_type_part->value); - } elseif (preg_match('/^\-?\d?\.\d+$/', $left_type_part->value)) { - $left_type_part = new TLiteralFloat((float) $left_type_part->value); - } - } - - if ($right_type_part instanceof TLiteralString) { - if (preg_match('/^\-?\d+$/', $right_type_part->value)) { - $right_type_part = new TLiteralInt((int) $right_type_part->value); - } elseif (preg_match('/^\-?\d?\.\d+$/', $right_type_part->value)) { - $right_type_part = new TLiteralFloat((float) $right_type_part->value); - } - } - - if ($left_type_part->isNumericType() || $right_type_part->isNumericType()) { - if (($left_type_part instanceof TNumeric || $right_type_part instanceof TNumeric) - && ($left_type_part->isNumericType() && $right_type_part->isNumericType()) - ) { - if ($config->strict_binary_operands) { - if ($statements_source && IssueBuffer::accepts( - new InvalidOperand( - 'Cannot process different numeric types together in strict binary operands mode, '. - 'please cast explicitly', - new CodeLocation($statements_source, $parent) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { - $new_result_type = Type::getInt(); - } else { - $new_result_type = new Union([new TFloat(), new TInt()]); - } - - $result_type = Type::combineUnionTypes($new_result_type, $result_type); - - $has_valid_right_operand = true; - $has_valid_left_operand = true; - - return null; - } - - if ($left_type_part instanceof TIntRange && $right_type_part instanceof TIntRange) { - self::analyzeOperandsBetweenIntRange($parent, $result_type, $left_type_part, $right_type_part); - return null; - } - - if (($left_type_part instanceof TIntRange && $right_type_part instanceof TInt) || - ($left_type_part instanceof TInt && $right_type_part instanceof TIntRange) - ) { - self::analyzeOperandsBetweenIntRangeAndInt( - $parent, - $result_type, - $left_type_part, - $right_type_part - ); - return null; - } - - if ($left_type_part instanceof TInt && $right_type_part instanceof TInt) { - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Div) { - $result_type = new Union([new TInt(), new TFloat()]); - } else { - $left_is_positive = $left_type_part instanceof TPositiveInt - || ($left_type_part instanceof TLiteralInt && $left_type_part->value > 0); - - $right_is_positive = $right_type_part instanceof TPositiveInt - || ($right_type_part instanceof TLiteralInt && $right_type_part->value > 0); - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Minus) { - $always_positive = false; - } elseif ($left_is_positive && $right_is_positive) { - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor - || $parent instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd - || $parent instanceof PhpParser\Node\Expr\BinaryOp\ShiftLeft - || $parent instanceof PhpParser\Node\Expr\BinaryOp\ShiftRight - ) { - $always_positive = false; - } else { - $always_positive = true; - } - } elseif ($parent instanceof PhpParser\Node\Expr\BinaryOp\Plus - && ($left_type_part instanceof TLiteralInt && $left_type_part->value === 0) - && $right_is_positive - ) { - $always_positive = true; - } elseif ($parent instanceof PhpParser\Node\Expr\BinaryOp\Plus - && ($right_type_part instanceof TLiteralInt && $right_type_part->value === 0) - && $left_is_positive - ) { - $always_positive = true; - } else { - $always_positive = false; - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { - if ($right_type_part instanceof TLiteralInt) { - $literal_value_max = $right_type_part->value - 1; - if ($always_positive) { - $result_type = new Union([new TIntRange(0, $literal_value_max)]); - } else { - $result_type = new Union( - [new TIntRange(-$literal_value_max, $literal_value_max)] - ); - } - } else { - if ($always_positive) { - $result_type = new Union([ - new TPositiveInt(), - new TLiteralInt(0) - ]); - } else { - $result_type = Type::getInt(); - } - } - } else { - $result_type = Type::combineUnionTypes( - $always_positive ? Type::getPositiveInt(true) : Type::getInt(true), - $result_type - ); - } - } - - $has_valid_right_operand = true; - $has_valid_left_operand = true; - - return null; - } - - if ($left_type_part instanceof TFloat && $right_type_part instanceof TFloat) { - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { - $result_type = Type::getInt(); - } else { - $result_type = Type::combineUnionTypes(Type::getFloat(), $result_type); - } - - $has_valid_right_operand = true; - $has_valid_left_operand = true; - - return null; - } - - if (($left_type_part instanceof TFloat && $right_type_part instanceof TInt) - || ($left_type_part instanceof TInt && $right_type_part instanceof TFloat) - ) { - if ($config->strict_binary_operands) { - if ($statements_source && IssueBuffer::accepts( - new InvalidOperand( - 'Cannot process ints and floats in strict binary operands mode, '. - 'please cast explicitly', - new CodeLocation($statements_source, $parent) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { - $result_type = Type::getInt(); - } else { - $result_type = Type::combineUnionTypes(Type::getFloat(), $result_type); - } - - $has_valid_right_operand = true; - $has_valid_left_operand = true; - - return null; - } - - if ($left_type_part->isNumericType() && $right_type_part->isNumericType()) { - if ($config->strict_binary_operands) { - if ($statements_source && IssueBuffer::accepts( - new InvalidOperand( - 'Cannot process numeric types together in strict operands mode, '. - 'please cast explicitly', - new CodeLocation($statements_source, $parent) - ), - $statements_source->getSuppressedIssues() - )) { - // fall through - } - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { - $result_type = Type::getInt(); - } else { - $result_type = new Union([new TInt, new TFloat]); - } - - $has_valid_right_operand = true; - $has_valid_left_operand = true; - - return null; - } - - if (!$left_type_part->isNumericType()) { - $invalid_left_messages[] = 'Cannot perform a numeric operation with a non-numeric type ' - . $left_type_part; - $has_valid_right_operand = true; - } else { - $invalid_right_messages[] = 'Cannot perform a numeric operation with a non-numeric type ' - . $right_type_part; - $has_valid_left_operand = true; - } - } else { - $invalid_left_messages[] = - 'Cannot perform a numeric operation with non-numeric types ' . $left_type_part - . ' and ' . $right_type_part; - } - - return null; - } - - /** - * @param PhpParser\Node $operation - * @param float|int $operand1 - * @param float|int $operand2 - */ - public static function arithmeticOperation( - PhpParser\Node $operation, - $operand1, - $operand2, - bool $allow_float_result - ): ?Union { - if ($operation instanceof PhpParser\Node\Expr\BinaryOp\Plus) { - $result = $operand1 + $operand2; - } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\Minus) { - $result = $operand1 - $operand2; - } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\Mod) { - if ($operand2 === 0) { - return Type::getEmpty(); - } - - $result = $operand1 % $operand2; - } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\Mul) { - $result = $operand1 * $operand2; - } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\Pow) { - $result = $operand1 ** $operand2; - } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr) { - $result = $operand1 | $operand2; - } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd) { - $result = $operand1 & $operand2; - } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor) { - $result = $operand1 ^ $operand2; - } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\ShiftLeft) { - $result = $operand1 << $operand2; - } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\ShiftRight) { - $result = $operand1 >> $operand2; - } elseif ($operation instanceof PhpParser\Node\Expr\BinaryOp\Div) { - if ($operand2 === 0) { - return Type::getEmpty(); - } - - $result = $operand1 / $operand2; - } else { - return null; - } - - $calculated_type = self::getNumericalType($result); - if (!$allow_float_result && $calculated_type->isFloat()) { - return null; - } - - return $calculated_type; - } - - private static function analyzeOperandsBetweenIntRange( - PhpParser\Node $parent, - ?Union &$result_type, - TIntRange $left_type_part, - TIntRange $right_type_part - ): void { - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Div) { - //can't assume an int range will stay int after division - $result_type = Type::combineUnionTypes( - new Union([new TInt(), new TFloat()]), - $result_type - ); - return; - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mod) { - self::analyzeModBetweenIntRange($result_type, $left_type_part, $right_type_part); - return; - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd || - $parent instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr || - $parent instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor - ) { - //really complex to calculate - $result_type = Type::combineUnionTypes( - Type::getInt(), - $result_type - ); - return; - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\ShiftLeft || - $parent instanceof PhpParser\Node\Expr\BinaryOp\ShiftRight - ) { - //really complex to calculate - $result_type = Type::combineUnionTypes( - new Union([new TInt()]), - $result_type - ); - return; - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Mul) { - self::analyzeMulBetweenIntRange($parent, $result_type, $left_type_part, $right_type_part); - return; - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Pow) { - self::analyzePowBetweenIntRange($result_type, $left_type_part, $right_type_part); - return; - } - - if ($parent instanceof PhpParser\Node\Expr\BinaryOp\Minus) { - //for Minus, we have to assume the min is the min from first range minus the max from the second - $min_operand1 = $left_type_part->min_bound; - $min_operand2 = $right_type_part->max_bound; - //and the max is the max from first range minus the min from the second - $max_operand1 = $left_type_part->max_bound; - $max_operand2 = $right_type_part->min_bound; - } else { - $min_operand1 = $left_type_part->min_bound; - $min_operand2 = $right_type_part->min_bound; - - $max_operand1 = $left_type_part->max_bound; - $max_operand2 = $right_type_part->max_bound; - } - - $calculated_min_type = null; - if ($min_operand1 !== null && $min_operand2 !== null) { - // when there are two valid numbers, make any operation - $calculated_min_type = self::arithmeticOperation( - $parent, - $min_operand1, - $min_operand2, - false - ); - } - - $calculated_max_type = null; - if ($max_operand1 !== null && $max_operand2 !== null) { - // when there are two valid numbers, make any operation - $calculated_max_type = self::arithmeticOperation( - $parent, - $max_operand1, - $max_operand2, - false - ); - } - - $min_value = $calculated_min_type !== null ? $calculated_min_type->getSingleIntLiteral()->value : null; - $max_value = $calculated_max_type !== null ? $calculated_max_type->getSingleIntLiteral()->value : null; - - $new_result_type = new Union([new TIntRange($min_value, $max_value)]); - - $result_type = Type::combineUnionTypes($new_result_type, $result_type); - } - - /** - * @param TIntRange|TInt $left_type_part - * @param TIntRange|TInt $right_type_part - */ - private static function analyzeOperandsBetweenIntRangeAndInt( - PhpParser\Node $parent, - ?Union &$result_type, - Atomic $left_type_part, - Atomic $right_type_part - ): void { - if (!$left_type_part instanceof TIntRange) { - $left_type_part = TIntRange::convertToIntRange($left_type_part); - } - if (!$right_type_part instanceof TIntRange) { - $right_type_part = TIntRange::convertToIntRange($right_type_part); - } - - self::analyzeOperandsBetweenIntRange($parent, $result_type, $left_type_part, $right_type_part); - } - - private static function analyzeMulBetweenIntRange( - PhpParser\Node\Expr\BinaryOp\Mul $parent, - ?Union &$result_type, - TIntRange $left_type_part, - TIntRange $right_type_part - ): void { - //Mul is a special case because of double negatives. We can only infer when we know both signs strictly - if ($right_type_part->min_bound !== null - && $right_type_part->max_bound !== null - && $left_type_part->min_bound !== null - && $left_type_part->max_bound !== null - ) { - //everything is known, we can do calculations - //[ x_1 , x_2 ] ⋆ [ y_1 , y_2 ] = - // [ - // min(x_1 ⋆ y_1 , x_1 ⋆ y_2 , x_2 ⋆ y_1 , x_2 ⋆ y_2), - // max(x_1 ⋆ y_1 , x_1 ⋆ y_2 , x_2 ⋆ y_1 , x_2 ⋆ y_2) - // ] - $x_1 = $right_type_part->min_bound; - $x_2 = $right_type_part->max_bound; - $y_1 = $left_type_part->min_bound; - $y_2 = $left_type_part->max_bound; - $min_value = min($x_1 * $y_1, $x_1 * $y_2, $x_2 * $y_1, $x_2 * $y_2); - $max_value = max($x_1 * $y_1, $x_1 * $y_2, $x_2 * $y_1, $x_2 * $y_2); - - $new_result_type = new Union([new TIntRange($min_value, $max_value)]); - } elseif ($right_type_part->isPositiveOrZero() && $left_type_part->isPositiveOrZero()) { - // both operands are positive, result will be only positive - $min_operand1 = $left_type_part->min_bound; - $min_operand2 = $right_type_part->min_bound; - - $max_operand1 = $left_type_part->max_bound; - $max_operand2 = $right_type_part->max_bound; - - $calculated_min_type = null; - if ($min_operand1 !== null && $min_operand2 !== null) { - // when there are two valid numbers, make any operation - $calculated_min_type = self::arithmeticOperation( - $parent, - $min_operand1, - $min_operand2, - false - ); - } - - $calculated_max_type = null; - if ($max_operand1 !== null && $max_operand2 !== null) { - // when there are two valid numbers, make any operation - $calculated_max_type = self::arithmeticOperation( - $parent, - $max_operand1, - $max_operand2, - false - ); - } - - $min_value = $calculated_min_type !== null ? $calculated_min_type->getSingleIntLiteral()->value : null; - $max_value = $calculated_max_type !== null ? $calculated_max_type->getSingleIntLiteral()->value : null; - - $new_result_type = new Union([new TIntRange($min_value, $max_value)]); - } elseif ($right_type_part->isPositiveOrZero() && $left_type_part->isNegativeOrZero()) { - // one operand is negative, result will be negative and we have to check min vs max - $min_operand1 = $left_type_part->max_bound; - $min_operand2 = $right_type_part->min_bound; - - $max_operand1 = $left_type_part->min_bound; - $max_operand2 = $right_type_part->max_bound; - - $calculated_min_type = null; - if ($min_operand1 !== null && $min_operand2 !== null) { - // when there are two valid numbers, make any operation - $calculated_min_type = self::arithmeticOperation( - $parent, - $min_operand1, - $min_operand2, - false - ); - } - - $calculated_max_type = null; - if ($max_operand1 !== null && $max_operand2 !== null) { - // when there are two valid numbers, make any operation - $calculated_max_type = self::arithmeticOperation( - $parent, - $max_operand1, - $max_operand2, - false - ); - } - - $min_value = $calculated_min_type !== null ? $calculated_min_type->getSingleIntLiteral()->value : null; - $max_value = $calculated_max_type !== null ? $calculated_max_type->getSingleIntLiteral()->value : null; - - if ($min_value > $max_value) { - [$min_value, $max_value] = [$max_value, $min_value]; - } - - $new_result_type = new Union([new TIntRange($min_value, $max_value)]); - } elseif ($right_type_part->isNegativeOrZero() && $left_type_part->isPositiveOrZero()) { - // one operand is negative, result will be negative and we have to check min vs max - $min_operand1 = $left_type_part->min_bound; - $min_operand2 = $right_type_part->max_bound; - - $max_operand1 = $left_type_part->max_bound; - $max_operand2 = $right_type_part->min_bound; - - $calculated_min_type = null; - if ($min_operand1 !== null && $min_operand2 !== null) { - // when there are two valid numbers, make any operation - $calculated_min_type = self::arithmeticOperation( - $parent, - $min_operand1, - $min_operand2, - false - ); - } - - $calculated_max_type = null; - if ($max_operand1 !== null && $max_operand2 !== null) { - // when there are two valid numbers, make any operation - $calculated_max_type = self::arithmeticOperation( - $parent, - $max_operand1, - $max_operand2, - false - ); - } - - $min_value = $calculated_min_type !== null ? $calculated_min_type->getSingleIntLiteral()->value : null; - $max_value = $calculated_max_type !== null ? $calculated_max_type->getSingleIntLiteral()->value : null; - - if ($min_value > $max_value) { - [$min_value, $max_value] = [$max_value, $min_value]; - } - - $new_result_type = new Union([new TIntRange($min_value, $max_value)]); - } elseif ($right_type_part->isNegativeOrZero() && $left_type_part->isNegativeOrZero()) { - // both operand are negative, result will be positive - $min_operand1 = $left_type_part->max_bound; - $min_operand2 = $right_type_part->max_bound; - - $max_operand1 = $left_type_part->min_bound; - $max_operand2 = $right_type_part->min_bound; - - $calculated_min_type = null; - if ($min_operand1 !== null && $min_operand2 !== null) { - // when there are two valid numbers, make any operation - $calculated_min_type = self::arithmeticOperation( - $parent, - $min_operand1, - $min_operand2, - false - ); - } - - $calculated_max_type = null; - if ($max_operand1 !== null && $max_operand2 !== null) { - // when there are two valid numbers, make any operation - $calculated_max_type = self::arithmeticOperation( - $parent, - $max_operand1, - $max_operand2, - false - ); - } - - $min_value = $calculated_min_type !== null ? $calculated_min_type->getSingleIntLiteral()->value : null; - $max_value = $calculated_max_type !== null ? $calculated_max_type->getSingleIntLiteral()->value : null; - - $new_result_type = new Union([new TIntRange($min_value, $max_value)]); - } else { - $new_result_type = Type::getInt(true); - } - - $result_type = Type::combineUnionTypes($new_result_type, $result_type); - } - - private static function analyzePowBetweenIntRange( - ?Union &$result_type, - TIntRange $left_type_part, - TIntRange $right_type_part - ): void { - //If Pow first operand is negative, the result could be positive or negative, else it will be positive - //If Pow second operand is negative, the result will be float, if it's 0, it will be 1/-1, else positive - if ($left_type_part->isPositive()) { - if ($right_type_part->isPositive()) { - $new_result_type = new Union([new TIntRange(1, null)]); - } elseif ($right_type_part->isNegative()) { - $new_result_type = Type::getFloat(); - } elseif ($right_type_part->min_bound === 0 && $right_type_part->max_bound === 0) { - $new_result_type = Type::getInt(true, 1); - } else { - //$right_type_part may be a mix of positive, negative and 0 - $new_result_type = new Union([new TInt(), new TFloat()]); - } - } elseif ($left_type_part->isNegative()) { - if ($right_type_part->isPositive()) { - if ($right_type_part->min_bound === $right_type_part->max_bound) { - if ($right_type_part->max_bound % 2 === 0) { - $new_result_type = new Union([new TIntRange(1, null)]); - } else { - $new_result_type = new Union([new TIntRange(null, -1)]); - } - } else { - $new_result_type = Type::getInt(true); - } - } elseif ($right_type_part->isNegative()) { - $new_result_type = Type::getFloat(); - } elseif ($right_type_part->min_bound === 0 && $right_type_part->max_bound === 0) { - $new_result_type = Type::getInt(true, -1); - } else { - //$right_type_part may be a mix of positive, negative and 0 - $new_result_type = new Union([new TInt(), new TFloat()]); - } - } elseif ($left_type_part->min_bound === 0 && $left_type_part->max_bound === 0) { - if ($right_type_part->isPositive()) { - $new_result_type = Type::getInt(true, 0); - } elseif ($right_type_part->min_bound === 0 && $right_type_part->max_bound === 0) { - $new_result_type = Type::getInt(true, 1); - } else { - //technically could be a float(INF)... - $new_result_type = Type::getEmpty(); - } - } else { - //$left_type_part may be a mix of positive, negative and 0 - if ($right_type_part->isPositive()) { - if ($right_type_part->min_bound === $right_type_part->max_bound - && $right_type_part->max_bound % 2 === 0 - ) { - $new_result_type = new Union([new TIntRange(1, null)]); - } else { - $new_result_type = Type::getInt(true); - } - } elseif ($right_type_part->isNegative()) { - $new_result_type = Type::getFloat(); - } elseif ($right_type_part->min_bound === 0 && $right_type_part->max_bound === 0) { - $new_result_type = Type::getInt(true, 1); - } else { - //$left_type_part may be a mix of positive, negative and 0 - $new_result_type = new Union([new TInt(), new TFloat()]); - } - } - - $result_type = Type::combineUnionTypes($new_result_type, $result_type); - } - - private static function analyzeModBetweenIntRange( - ?Union &$result_type, - TIntRange $left_type_part, - TIntRange $right_type_part - ): void { - //result of Mod is not directly dependant on the bounds of the range - if ($right_type_part->min_bound !== null && $right_type_part->min_bound === $right_type_part->max_bound) { - //if the second operand is a literal, we can be pretty detailed - if ($right_type_part->max_bound === 0) { - $new_result_type = Type::getEmpty(); - } else { - if ($left_type_part->isPositiveOrZero()) { - if ($right_type_part->isPositive()) { - $max = $right_type_part->min_bound - 1; - $new_result_type = new Union([new TIntRange(0, $max)]); - } else { - $max = $right_type_part->min_bound + 1; - $new_result_type = new Union([new TIntRange($max, 0)]); - } - } elseif ($left_type_part->isNegativeOrZero()) { - if ($right_type_part->isPositive()) { - $max = $right_type_part->min_bound - 1; - $new_result_type = new Union([new TIntRange(-$max, 0)]); - } else { - $max = $right_type_part->min_bound + 1; - $new_result_type = new Union([new TIntRange(-$max, 0)]); - } - } else { - if ($right_type_part->isPositive()) { - $max = $right_type_part->min_bound - 1; - } else { - $max = -$right_type_part->min_bound - 1; - } - $new_result_type = new Union([new TIntRange(-$max, $max)]); - } - } - } elseif ($right_type_part->isPositive()) { - if ($left_type_part->isPositiveOrZero()) { - if ($right_type_part->max_bound !== null) { - //we now that the result will be a range between 0 and $right->max - 1 - $new_result_type = new Union( - [new TIntRange(0, $right_type_part->max_bound - 1)] - ); - } else { - $new_result_type = new Union([new TIntRange(0, null)]); - } - } elseif ($left_type_part->isNegativeOrZero()) { - $new_result_type = new Union([new TIntRange(null, 0)]); - } else { - $new_result_type = Type::getInt(true); - } - } elseif ($right_type_part->isNegative()) { - if ($left_type_part->isPositiveOrZero()) { - $new_result_type = new Union([new TIntRange(null, 0)]); - } elseif ($left_type_part->isNegativeOrZero()) { - $new_result_type = new Union([new TIntRange(null, 0)]); - } else { - $new_result_type = Type::getInt(true); - } - } else { - $new_result_type = Type::getInt(true); - } - - $result_type = Type::combineUnionTypes( - $new_result_type, - $result_type - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php deleted file mode 100644 index f5c75807..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php +++ /dev/null @@ -1,89 +0,0 @@ -left; - - $root_expr = $left_expr; - - while ($root_expr instanceof PhpParser\Node\Expr\ArrayDimFetch - || $root_expr instanceof PhpParser\Node\Expr\PropertyFetch - ) { - $root_expr = $root_expr->var; - } - - if ($root_expr instanceof PhpParser\Node\Expr\FuncCall - || $root_expr instanceof PhpParser\Node\Expr\MethodCall - || $root_expr instanceof PhpParser\Node\Expr\StaticCall - || $root_expr instanceof PhpParser\Node\Expr\Cast - || $root_expr instanceof PhpParser\Node\Expr\NullsafePropertyFetch - || $root_expr instanceof PhpParser\Node\Expr\NullsafeMethodCall - || $root_expr instanceof PhpParser\Node\Expr\Ternary - ) { - $left_var_id = '$' . (int) $left_expr->getAttribute('startFilePos'); - - $cloned = clone $context; - $cloned->inside_isset = true; - - ExpressionAnalyzer::analyze($statements_analyzer, $left_expr, $cloned); - - $condition_type = $statements_analyzer->node_data->getType($left_expr) ?? Type::getMixed(); - - if ($root_expr !== $left_expr) { - $condition_type->possibly_undefined = true; - } - - $context->vars_in_scope[$left_var_id] = $condition_type; - - $left_expr = new VirtualVariable( - substr($left_var_id, 1), - $left_expr->getAttributes() - ); - } - - $ternary = new VirtualTernary( - new VirtualIsset( - [$left_expr], - $stmt->left->getAttributes() - ), - $left_expr, - $stmt->right, - $stmt->getAttributes() - ); - - $old_node_data = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - ExpressionAnalyzer::analyze($statements_analyzer, $ternary, $context); - - $ternary_type = $statements_analyzer->node_data->getType($ternary) ?? Type::getMixed(); - - $statements_analyzer->node_data = $old_node_data; - - $statements_analyzer->node_data->setType($stmt, $ternary_type); - - return true; - } -} 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 deleted file mode 100644 index e317de46..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php +++ /dev/null @@ -1,432 +0,0 @@ -getCodebase(); - - $left_type = $statements_analyzer->node_data->getType($left); - $right_type = $statements_analyzer->node_data->getType($right); - $config = Config::getInstance(); - - if ($left_type && $right_type) { - $result_type = Type::getString(); - - if ($left_type->hasMixed() || $right_type->hasMixed()) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - if ($left_type->hasMixed()) { - $arg_location = new CodeLocation($statements_analyzer->getSource(), $left); - - $origin_locations = []; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - foreach ($left_type->parent_nodes as $parent_node) { - $origin_locations = array_merge( - $origin_locations, - $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) - ); - } - } - - $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; - - if ($origin_location && $origin_location->getHash() === $arg_location->getHash()) { - $origin_location = null; - } - - IssueBuffer::maybeAdd( - new MixedOperand( - 'Left operand cannot be mixed', - $arg_location, - $origin_location - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - $arg_location = new CodeLocation($statements_analyzer->getSource(), $right); - $origin_locations = []; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - foreach ($right_type->parent_nodes as $parent_node) { - $origin_locations = array_merge( - $origin_locations, - $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) - ); - } - } - - $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; - - if ($origin_location && $origin_location->getHash() === $arg_location->getHash()) { - $origin_location = null; - } - - IssueBuffer::maybeAdd( - new MixedOperand( - 'Right operand cannot be mixed', - $arg_location, - $origin_location - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - return; - } - - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); - } - - self::analyzeOperand($statements_analyzer, $left, $left_type, 'Left', $context); - self::analyzeOperand($statements_analyzer, $right, $right_type, 'Right', $context); - - // If both types are specific literals, combine them into new literals - $literal_concat = false; - - if ($left_type->allSpecificLiterals() && $right_type->allSpecificLiterals()) { - $left_type_parts = $left_type->getAtomicTypes(); - $right_type_parts = $right_type->getAtomicTypes(); - $combinations = count($left_type_parts) * count($right_type_parts); - if ($combinations < self::MAX_LITERALS) { - $literal_concat = true; - $result_type_parts = []; - - foreach ($left_type->getAtomicTypes() as $left_type_part) { - foreach ($right_type->getAtomicTypes() as $right_type_part) { - $literal = $left_type_part->value . $right_type_part->value; - if (strlen($literal) >= $config->max_string_length) { - // Literal too long, use non-literal type instead - $literal_concat = false; - break 2; - } - - $result_type_parts[] = new TLiteralString($literal); - } - } - - if ($literal_concat) { - assert(count($result_type_parts) === $combinations); - assert(count($result_type_parts) !== 0); // #8163 - $result_type = new Union($result_type_parts); - } - } - } - - if (!$literal_concat) { - $numeric_type = Type::getNumericString(); - $numeric_type->addType(new TInt()); - $numeric_type->addType(new TFloat()); - $left_is_numeric = UnionTypeComparator::isContainedBy( - $codebase, - $left_type, - $numeric_type - ); - - if ($left_is_numeric) { - $right_uint = Type::getPositiveInt(); - $right_uint->addType(new TLiteralInt(0)); - $right_is_uint = UnionTypeComparator::isContainedBy( - $codebase, - $right_type, - $right_uint - ); - - if ($right_is_uint) { - $result_type = Type::getNumericString(); - return; - } - } - - $lowercase_type = clone $numeric_type; - $lowercase_type->addType(new TLowercaseString()); - - $all_lowercase = UnionTypeComparator::isContainedBy( - $codebase, - $left_type, - $lowercase_type - ) && UnionTypeComparator::isContainedBy( - $codebase, - $right_type, - $lowercase_type - ); - - $non_empty_string = clone $numeric_type; - $non_empty_string->addType(new TNonEmptyString()); - - $has_non_empty = UnionTypeComparator::isContainedBy( - $codebase, - $left_type, - $non_empty_string - ) || UnionTypeComparator::isContainedBy( - $codebase, - $right_type, - $non_empty_string - ); - - $all_literals = $left_type->allLiterals() && $right_type->allLiterals(); - - if ($has_non_empty) { - if ($all_literals) { - $result_type = new Union([new TNonEmptyNonspecificLiteralString]); - } elseif ($all_lowercase) { - $result_type = Type::getNonEmptyLowercaseString(); - } else { - $result_type = Type::getNonEmptyString(); - } - } else { - if ($all_literals) { - $result_type = new Union([new TNonspecificLiteralString]); - } elseif ($all_lowercase) { - $result_type = Type::getLowercaseString(); - } else { - $result_type = Type::getString(); - } - } - } - } - } - - private static function analyzeOperand( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $operand, - Union $operand_type, - string $side, - Context $context - ): void { - $codebase = $statements_analyzer->getCodebase(); - $config = Config::getInstance(); - - if ($operand_type->isNull()) { - IssueBuffer::maybeAdd( - new NullOperand( - 'Cannot concatenate with a ' . $operand_type, - new CodeLocation($statements_analyzer->getSource(), $operand) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - if ($operand_type->isFalse()) { - IssueBuffer::maybeAdd( - new FalseOperand( - 'Cannot concatenate with a ' . $operand_type, - new CodeLocation($statements_analyzer->getSource(), $operand) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - if ($operand_type->isNullable() && !$operand_type->ignore_nullable_issues) { - IssueBuffer::maybeAdd( - new PossiblyNullOperand( - 'Cannot concatenate with a possibly null ' . $operand_type, - new CodeLocation($statements_analyzer->getSource(), $operand) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($operand_type->isFalsable() && !$operand_type->ignore_falsable_issues) { - IssueBuffer::maybeAdd( - new PossiblyFalseOperand( - 'Cannot concatenate with a possibly false ' . $operand_type, - new CodeLocation($statements_analyzer->getSource(), $operand) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $operand_type_match = true; - $has_valid_operand = false; - $comparison_result = new TypeComparisonResult(); - - foreach ($operand_type->getAtomicTypes() as $operand_type_part) { - if ($operand_type_part instanceof TTemplateParam && !$operand_type_part->as->isString()) { - IssueBuffer::maybeAdd( - new MixedOperand( - "$side operand cannot be a non-string template param", - new CodeLocation($statements_analyzer->getSource(), $operand) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - if ($operand_type_part instanceof TNull || $operand_type_part instanceof TFalse) { - continue; - } - - $operand_type_part_match = AtomicTypeComparator::isContainedBy( - $codebase, - $operand_type_part, - new TString, - false, - false, - $comparison_result - ); - - $operand_type_match = $operand_type_match && $operand_type_part_match; - - $has_valid_operand = $has_valid_operand || $operand_type_part_match; - - if ($comparison_result->to_string_cast && $config->strict_binary_operands) { - IssueBuffer::maybeAdd( - new ImplicitToStringCast( - "$side side of concat op expects string, '$operand_type' provided with a __toString method", - new CodeLocation($statements_analyzer->getSource(), $operand) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - foreach ($operand_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TNamedObject) { - $to_string_method_id = new MethodIdentifier( - $atomic_type->value, - '__tostring' - ); - - if ($codebase->methods->methodExists( - $to_string_method_id, - $context->calling_method_id, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer->getSource(), $operand) - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $statements_analyzer - : null, - $statements_analyzer->getFilePath() - )) { - try { - $storage = $codebase->methods->getStorage($to_string_method_id); - } catch (UnexpectedValueException $e) { - continue; - } - - if ($context->mutation_free && !$storage->mutation_free) { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a possibly-mutating method ' - . $atomic_type->value . '::__toString from a pure context', - new CodeLocation($statements_analyzer, $operand) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - } - } - } - } - - if (!$operand_type_match - && (!$comparison_result->scalar_type_match_found || $config->strict_binary_operands) - ) { - if ($has_valid_operand) { - IssueBuffer::maybeAdd( - new PossiblyInvalidOperand( - 'Cannot concatenate with a ' . $operand_type, - new CodeLocation($statements_analyzer->getSource(), $operand) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidOperand( - 'Cannot concatenate with a ' . $operand_type, - new CodeLocation($statements_analyzer->getSource(), $operand) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php deleted file mode 100644 index c4381115..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php +++ /dev/null @@ -1,134 +0,0 @@ -node_data->getType($stmt->left); - $stmt_right_type = $statements_analyzer->node_data->getType($stmt->right); - - if (!$stmt_left_type || !$stmt_right_type) { - return; - } - - if (($stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd - ) - && $stmt_left_type->hasString() - && $stmt_right_type->hasString() - ) { - $stmt_type = Type::getString(); - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - BinaryOpAnalyzer::addDataFlow( - $statements_analyzer, - $stmt, - $stmt->left, - $stmt->right, - 'nondivop' - ); - - return; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Plus - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Minus - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Mod - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Mul - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Pow - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\ShiftLeft - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\ShiftRight - ) { - ArithmeticOpAnalyzer::analyze( - $statements_analyzer, - $statements_analyzer->node_data, - $stmt->left, - $stmt->right, - $stmt, - $result_type, - $context - ); - - if (!$result_type) { - $result_type = new Union([new TInt(), new TFloat()]); - } - - $statements_analyzer->node_data->setType($stmt, $result_type); - - BinaryOpAnalyzer::addDataFlow( - $statements_analyzer, - $stmt, - $stmt->left, - $stmt->right, - 'nondivop' - ); - - return; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalXor) { - if ($stmt_left_type->hasBool() || $stmt_right_type->hasBool()) { - $statements_analyzer->node_data->setType($stmt, Type::getBool()); - } - - BinaryOpAnalyzer::addDataFlow( - $statements_analyzer, - $stmt, - $stmt->left, - $stmt->right, - 'xor' - ); - - return; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Div) { - ArithmeticOpAnalyzer::analyze( - $statements_analyzer, - $statements_analyzer->node_data, - $stmt->left, - $stmt->right, - $stmt, - $result_type, - $context - ); - - if (!$result_type) { - $result_type = new Union([new TInt(), new TFloat()]); - } - - $statements_analyzer->node_data->setType($stmt, $result_type); - - BinaryOpAnalyzer::addDataFlow( - $statements_analyzer, - $stmt, - $stmt->left, - $stmt->right, - 'div' - ); - - return; - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php deleted file mode 100644 index d584d43f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php +++ /dev/null @@ -1,411 +0,0 @@ -left, $stmt->left->getAttributes()), - [ - 'stmts' => [ - new VirtualExpression( - $stmt->right - ) - ] - ], - $stmt->getAttributes() - ); - - return IfElseAnalyzer::analyze($statements_analyzer, $fake_if_stmt, $context) !== false; - } - - $codebase = $statements_analyzer->getCodebase(); - - $post_leaving_if_context = null; - - if (!$stmt->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || !$stmt->left->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || !$stmt->left->left->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - ) { - $if_scope = new IfScope(); - - try { - $if_conditional_scope = IfConditionalAnalyzer::analyze( - $statements_analyzer, - $stmt->left, - $context, - $codebase, - $if_scope, - $context->branch_point ?: (int) $stmt->getAttribute('startFilePos') - ); - - $left_context = $if_conditional_scope->if_context; - - $left_referenced_var_ids = $if_conditional_scope->cond_referenced_var_ids; - $left_assigned_var_ids = $if_conditional_scope->assigned_in_conditional_var_ids; - - if ($stmt->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr) { - $post_leaving_if_context = clone $context; - } - } catch (ScopeAnalysisException $e) { - return false; - } - } else { - $pre_referenced_var_ids = $context->referenced_var_ids; - $context->referenced_var_ids = []; - - $pre_assigned_var_ids = $context->assigned_var_ids; - - $post_leaving_if_context = clone $context; - - $left_context = clone $context; - $left_context->parent_context = $context; - $left_context->if_context = null; - $left_context->assigned_var_ids = []; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->left, $left_context) === false) { - return false; - } - - IfConditionalAnalyzer::handleParadoxicalCondition($statements_analyzer, $stmt->left); - - foreach ($left_context->vars_in_scope as $var_id => $type) { - if (!isset($context->vars_in_scope[$var_id])) { - if (isset($left_context->assigned_var_ids[$var_id])) { - $context->vars_in_scope[$var_id] = clone $type; - } - } else { - $context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $context->vars_in_scope[$var_id], - $type, - $codebase - ); - } - } - - $left_referenced_var_ids = $left_context->referenced_var_ids; - $left_context->referenced_var_ids = array_merge($pre_referenced_var_ids, $left_referenced_var_ids); - - $left_assigned_var_ids = array_diff_key($left_context->assigned_var_ids, $pre_assigned_var_ids); - $left_context->assigned_var_ids = array_merge($pre_assigned_var_ids, $left_context->assigned_var_ids); - - $left_referenced_var_ids = array_diff_key($left_referenced_var_ids, $left_assigned_var_ids); - } - - $left_cond_id = spl_object_id($stmt->left); - - $left_clauses = FormulaGenerator::getFormula( - $left_cond_id, - $left_cond_id, - $stmt->left, - $context->self, - $statements_analyzer, - $codebase - ); - - try { - $negated_left_clauses = Algebra::negateFormula($left_clauses); - } catch (ComplicatedExpressionException $e) { - try { - $negated_left_clauses = FormulaGenerator::getFormula( - $left_cond_id, - $left_cond_id, - new VirtualBooleanNot($stmt->left), - $context->self, - $statements_analyzer, - $codebase, - false - ); - } catch (ComplicatedExpressionException $e) { - return false; - } - } - - if ($left_context->reconciled_expression_clauses) { - $reconciled_expression_clauses = $left_context->reconciled_expression_clauses; - - $negated_left_clauses = array_values( - array_filter( - $negated_left_clauses, - function ($c) use ($reconciled_expression_clauses): bool { - return !in_array($c->hash, $reconciled_expression_clauses); - } - ) - ); - - if (count($negated_left_clauses) === 1 - && $negated_left_clauses[0]->wedge - && !$negated_left_clauses[0]->possibilities - ) { - $negated_left_clauses = []; - } - } - - $clauses_for_right_analysis = Algebra::simplifyCNF( - array_merge( - $context->clauses, - $negated_left_clauses - ) - ); - - $active_negated_type_assertions = []; - - $negated_type_assertions = Algebra::getTruthsFromFormula( - $clauses_for_right_analysis, - $left_cond_id, - $left_referenced_var_ids, - $active_negated_type_assertions - ); - - $changed_var_ids = []; - - $right_context = clone $context; - - if ($stmt->left instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - && $left_assigned_var_ids - && $post_leaving_if_context - ) { - IfAnalyzer::addConditionallyAssignedVarsToContext( - $statements_analyzer, - $stmt->left, - $post_leaving_if_context, - $right_context, - $left_assigned_var_ids - ); - } - - if ($negated_type_assertions) { - // while in an or, we allow scope to boil over to support - // statements of the form if ($x === null || $x->foo()) - $right_vars_in_scope = Reconciler::reconcileKeyedTypes( - $negated_type_assertions, - $active_negated_type_assertions, - $right_context->vars_in_scope, - $changed_var_ids, - $left_referenced_var_ids, - $statements_analyzer, - [], - $left_context->inside_loop, - new CodeLocation($statements_analyzer->getSource(), $stmt->left), - !$context->inside_negation - ); - $right_context->vars_in_scope = $right_vars_in_scope; - } - - $right_context->clauses = $clauses_for_right_analysis; - - if ($changed_var_ids) { - $partitioned_clauses = Context::removeReconciledClauses($right_context->clauses, $changed_var_ids); - $right_context->clauses = $partitioned_clauses[0]; - $right_context->reconciled_expression_clauses = array_merge( - $context->reconciled_expression_clauses, - array_map( - function ($c) { - return $c->hash; - }, - $partitioned_clauses[1] - ) - ); - - $partitioned_clauses = Context::removeReconciledClauses($context->clauses, $changed_var_ids); - $context->clauses = $partitioned_clauses[0]; - $context->reconciled_expression_clauses = array_merge( - $context->reconciled_expression_clauses, - array_map( - function ($c) { - return $c->hash; - }, - $partitioned_clauses[1] - ) - ); - } - - $right_context->if_context = null; - - $pre_referenced_var_ids = $right_context->referenced_var_ids; - $right_context->referenced_var_ids = []; - - $pre_assigned_var_ids = $right_context->assigned_var_ids; - $right_context->assigned_var_ids = []; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->right, $right_context) === false) { - return false; - } - - IfConditionalAnalyzer::handleParadoxicalCondition($statements_analyzer, $stmt->right); - - $right_referenced_var_ids = $right_context->referenced_var_ids; - $right_context->referenced_var_ids = array_merge($pre_referenced_var_ids, $right_referenced_var_ids); - - $right_assigned_var_ids = $right_context->assigned_var_ids; - $right_context->assigned_var_ids = array_merge($pre_assigned_var_ids, $right_assigned_var_ids); - - $right_cond_id = spl_object_id($stmt->right); - - $right_clauses = FormulaGenerator::getFormula( - $right_cond_id, - $right_cond_id, - $stmt->right, - $context->self, - $statements_analyzer, - $codebase - ); - - $clauses_for_right_analysis = Context::removeReconciledClauses( - $clauses_for_right_analysis, - $right_assigned_var_ids - )[0]; - - $combined_right_clauses = Algebra::simplifyCNF( - array_merge($clauses_for_right_analysis, $right_clauses) - ); - - $active_right_type_assertions = []; - - $right_type_assertions = Algebra::getTruthsFromFormula( - $combined_right_clauses, - $right_cond_id, - $right_referenced_var_ids, - $active_right_type_assertions - ); - - if ($right_type_assertions) { - $right_changed_var_ids = []; - - Reconciler::reconcileKeyedTypes( - $right_type_assertions, - $active_right_type_assertions, - $right_context->vars_in_scope, - $right_changed_var_ids, - $right_referenced_var_ids, - $statements_analyzer, - [], - $left_context->inside_loop, - new CodeLocation($statements_analyzer->getSource(), $stmt->right), - $context->inside_negation - ); - } - - if (!($stmt->right instanceof PhpParser\Node\Expr\Exit_)) { - foreach ($right_context->vars_in_scope as $var_id => $type) { - if (isset($context->vars_in_scope[$var_id])) { - $context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $context->vars_in_scope[$var_id], - $type, - $codebase - ); - } - } - } elseif ($stmt->left instanceof PhpParser\Node\Expr\Assign) { - $var_id = ExpressionIdentifier::getVarId($stmt->left->var, $context->self); - - if ($var_id && isset($left_context->vars_in_scope[$var_id])) { - $left_inferred_reconciled = AssertionReconciler::reconcile( - '!falsy', - clone $left_context->vars_in_scope[$var_id], - '', - $statements_analyzer, - $context->inside_loop, - [], - new CodeLocation($statements_analyzer->getSource(), $stmt->left), - $statements_analyzer->getSuppressedIssues() - ); - - $context->vars_in_scope[$var_id] = $left_inferred_reconciled; - } - } - - if ($context->inside_conditional) { - $context->updateChecks($right_context); - } - - $context->referenced_var_ids = array_merge( - $right_context->referenced_var_ids, - $context->referenced_var_ids - ); - - $context->assigned_var_ids = array_merge( - $context->assigned_var_ids, - $right_context->assigned_var_ids - ); - - if ($context->if_context) { - $if_context = $context->if_context; - - foreach ($right_context->vars_in_scope as $var_id => $type) { - if (isset($if_context->vars_in_scope[$var_id])) { - $if_context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $type, - $if_context->vars_in_scope[$var_id], - $codebase - ); - } elseif (isset($left_context->vars_in_scope[$var_id])) { - $if_context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $type, - $left_context->vars_in_scope[$var_id], - $codebase - ); - } - } - - $if_context->referenced_var_ids = array_merge( - $context->referenced_var_ids, - $if_context->referenced_var_ids - ); - - $if_context->assigned_var_ids = array_merge( - $context->assigned_var_ids, - $if_context->assigned_var_ids - ); - - $if_context->updateChecks($context); - } - - $context->vars_possibly_in_scope = array_merge( - $right_context->vars_possibly_in_scope, - $context->vars_possibly_in_scope - ); - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php deleted file mode 100644 index 5a4108c0..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php +++ /dev/null @@ -1,530 +0,0 @@ - 100) { - $statements_analyzer->node_data->setType($stmt, Type::getString()); - - // ignore deeply-nested string concatenation - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd || - $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalAnd - ) { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - - $expr_result = AndAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context, - $from_stmt - ); - - $context->inside_general_use = $was_inside_general_use; - - $statements_analyzer->node_data->setType($stmt, Type::getBool()); - - return $expr_result; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr || - $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalOr - ) { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - - $expr_result = OrAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context, - $from_stmt - ); - - $context->inside_general_use = $was_inside_general_use; - - $statements_analyzer->node_data->setType($stmt, Type::getBool()); - - return $expr_result; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Coalesce) { - $expr_result = CoalesceAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context - ); - - self::addDataFlow( - $statements_analyzer, - $stmt, - $stmt->left, - $stmt->right, - 'coalesce' - ); - - return $expr_result; - } - - if ($stmt->left instanceof PhpParser\Node\Expr\BinaryOp) { - if (self::analyze($statements_analyzer, $stmt->left, $context, $nesting + 1) === false) { - return false; - } - } else { - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->left, $context) === false) { - return false; - } - } - - if ($stmt->right instanceof PhpParser\Node\Expr\BinaryOp) { - if (self::analyze($statements_analyzer, $stmt->right, $context, $nesting + 1) === false) { - return false; - } - } else { - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->right, $context) === false) { - return false; - } - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat) { - $stmt_type = Type::getString(); - - ConcatAnalyzer::analyze( - $statements_analyzer, - $stmt->left, - $stmt->right, - $context, - $result_type - ); - - if ($result_type) { - $stmt_type = $result_type; - } - - if ($statements_analyzer->data_flow_graph - && ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - || !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues())) - ) { - $stmt_left_type = $statements_analyzer->node_data->getType($stmt->left); - $stmt_right_type = $statements_analyzer->node_data->getType($stmt->right); - - $var_location = new CodeLocation($statements_analyzer, $stmt); - - $new_parent_node = DataFlowNode::getForAssignment('concat', $var_location); - $statements_analyzer->data_flow_graph->addNode($new_parent_node); - - $stmt_type->parent_nodes = [ - $new_parent_node->id => $new_parent_node - ]; - - $codebase = $statements_analyzer->getCodebase(); - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - if ($stmt_left_type && $stmt_left_type->parent_nodes) { - foreach ($stmt_left_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $new_parent_node, - 'concat', - $added_taints, - $removed_taints - ); - } - } - - if ($stmt_right_type && $stmt_right_type->parent_nodes) { - foreach ($stmt_right_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $new_parent_node, - 'concat', - $added_taints, - $removed_taints - ); - } - } - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Spaceship) { - $statements_analyzer->node_data->setType( - $stmt, - new Union( - [ - new TLiteralInt(-1), - new TLiteralInt(0), - new TLiteralInt(1) - ] - ) - ); - - self::addDataFlow( - $statements_analyzer, - $stmt, - $stmt->left, - $stmt->right, - '<=>' - ); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotEqual - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Greater - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Smaller - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual - ) { - $statements_analyzer->node_data->setType($stmt, Type::getBool()); - - $stmt_left_type = $statements_analyzer->node_data->getType($stmt->left); - $stmt_right_type = $statements_analyzer->node_data->getType($stmt->right); - - if (($stmt instanceof PhpParser\Node\Expr\BinaryOp\Greater - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Smaller - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual) - && $statements_analyzer->getCodebase()->config->strict_binary_operands - && $stmt_left_type - && $stmt_right_type - && (($stmt_left_type->isSingle() && $stmt_left_type->hasBool()) - || ($stmt_right_type->isSingle() && $stmt_right_type->hasBool())) - ) { - IssueBuffer::maybeAdd( - new InvalidOperand( - 'Cannot compare ' . $stmt_left_type->getId() . ' to ' . $stmt_right_type->getId(), - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotEqual - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical) - && $stmt->left instanceof PhpParser\Node\Expr\FuncCall - && $stmt->left->name instanceof PhpParser\Node\Name - && $stmt->left->name->parts === ['substr'] - && isset($stmt->left->getArgs()[1]) - && $stmt_right_type - && $stmt_right_type->hasLiteralString() - ) { - $from_type = $statements_analyzer->node_data->getType($stmt->left->getArgs()[1]->value); - - $length_type = isset($stmt->left->getArgs()[2]) - ? ($statements_analyzer->node_data->getType($stmt->left->getArgs()[2]->value) ?? Type::getMixed()) - : null; - - $string_length = null; - - if ($from_type && $from_type->isSingleIntLiteral() && $length_type === null) { - $string_length = -$from_type->getSingleIntLiteral()->value; - } elseif ($length_type && $length_type->isSingleIntLiteral()) { - $string_length = $length_type->getSingleIntLiteral()->value; - } - - if ($string_length > 0) { - foreach ($stmt_right_type->getAtomicTypes() as $atomic_right_type) { - if ($atomic_right_type instanceof TLiteralString) { - if (strlen($atomic_right_type->value) !== $string_length) { - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical - ) { - if ($atomic_right_type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - $atomic_right_type . ' string length is not ' . $string_length, - new CodeLocation($statements_analyzer, $stmt), - null - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - $atomic_right_type . ' string length is not ' . $string_length, - new CodeLocation($statements_analyzer, $stmt), - null - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } else { - if ($atomic_right_type->from_docblock) { - IssueBuffer::maybeAdd( - new RedundantConditionGivenDocblockType( - $atomic_right_type . ' string length is never ' . $string_length, - new CodeLocation($statements_analyzer, $stmt), - null - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RedundantCondition( - $atomic_right_type . ' string length is never ' . $string_length, - new CodeLocation($statements_analyzer, $stmt), - null - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - } - } - } - } - - $codebase = $statements_analyzer->getCodebase(); - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal - && $stmt_left_type - && $stmt_right_type - && ($context->mutation_free || $codebase->alter_code) - ) { - self::checkForImpureEqualityComparison( - $statements_analyzer, - $stmt, - $stmt_left_type, - $stmt_right_type - ); - } - - self::addDataFlow( - $statements_analyzer, - $stmt, - $stmt->left, - $stmt->right, - 'comparison' - ); - - return true; - } - - NonComparisonOpAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context - ); - - return true; - } - - public static function addDataFlow( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $stmt, - PhpParser\Node\Expr $left, - PhpParser\Node\Expr $right, - string $type = 'binaryop' - ): void { - if ($stmt->getLine() === -1) { - throw new UnexpectedValueException('bad'); - } - $result_type = $statements_analyzer->node_data->getType($stmt); - if (!$result_type) { - return; - } - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && $stmt instanceof PhpParser\Node\Expr\BinaryOp - && !$stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat - && !$stmt instanceof PhpParser\Node\Expr\BinaryOp\Coalesce - && (!$stmt instanceof PhpParser\Node\Expr\BinaryOp\Plus || !$result_type->hasArray()) - ) { - //among BinaryOp, only Concat and Coalesce can pass tainted value to the result. Also Plus on arrays only - return; - } - - if ($statements_analyzer->data_flow_graph) { - $stmt_left_type = $statements_analyzer->node_data->getType($left); - $stmt_right_type = $statements_analyzer->node_data->getType($right); - - $var_location = new CodeLocation($statements_analyzer, $stmt); - - $new_parent_node = DataFlowNode::getForAssignment($type, $var_location); - $statements_analyzer->data_flow_graph->addNode($new_parent_node); - - $result_type->parent_nodes = [ - $new_parent_node->id => $new_parent_node - ]; - - if ($stmt_left_type && $stmt_left_type->parent_nodes) { - foreach ($stmt_left_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath($parent_node, $new_parent_node, $type); - } - } - - if ($stmt_right_type && $stmt_right_type->parent_nodes) { - foreach ($stmt_right_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath($parent_node, $new_parent_node, $type); - } - } - - if ($stmt instanceof PhpParser\Node\Expr\AssignOp - && $statements_analyzer->data_flow_graph instanceof VariableUseGraph - ) { - $root_expr = $left; - - while ($root_expr instanceof PhpParser\Node\Expr\ArrayDimFetch) { - $root_expr = $root_expr->var; - } - - if ($left instanceof PhpParser\Node\Expr\PropertyFetch) { - $statements_analyzer->data_flow_graph->addPath( - $new_parent_node, - new DataFlowNode('variable-use', 'variable use', null), - 'used-by-instance-property' - ); - } if ($left instanceof PhpParser\Node\Expr\StaticPropertyFetch) { - $statements_analyzer->data_flow_graph->addPath( - $new_parent_node, - new DataFlowNode('variable-use', 'variable use', null), - 'use-in-static-property' - ); - } elseif (!$left instanceof PhpParser\Node\Expr\Variable) { - $statements_analyzer->data_flow_graph->addPath( - $new_parent_node, - new DataFlowNode('variable-use', 'variable use', null), - 'variable-use' - ); - } - } - } - } - - private static function checkForImpureEqualityComparison( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\BinaryOp\Equal $stmt, - Union $stmt_left_type, - Union $stmt_right_type - ): void { - $codebase = $statements_analyzer->getCodebase(); - - if ($stmt_left_type->hasString() && $stmt_right_type->hasObjectType()) { - foreach ($stmt_right_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TNamedObject) { - try { - $storage = $codebase->methods->getStorage( - new MethodIdentifier( - $atomic_type->value, - '__tostring' - ) - ); - } catch (UnexpectedValueException $e) { - continue; - } - - if (!$storage->mutation_free) { - if ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } else { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a possibly-mutating method ' - . $atomic_type->value . '::__toString from a pure context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - } - } elseif ($stmt_right_type->hasString() && $stmt_left_type->hasObjectType()) { - foreach ($stmt_left_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TNamedObject) { - try { - $storage = $codebase->methods->getStorage( - new MethodIdentifier( - $atomic_type->value, - '__tostring' - ) - ); - } catch (UnexpectedValueException $e) { - continue; - } - - if (!$storage->mutation_free) { - if ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } else { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a possibly-mutating method ' - . $atomic_type->value . '::__toString from a pure context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - } - } - } -} 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 deleted file mode 100644 index fa8c19d6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php +++ /dev/null @@ -1,124 +0,0 @@ -expr, $context) === false) { - return false; - } - - if (!($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr))) { - $statements_analyzer->node_data->setType($stmt, new Union([new TInt(), new TString()])); - } elseif ($stmt_expr_type->isMixed()) { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } else { - $acceptable_types = []; - $unacceptable_type = null; - $has_valid_operand = false; - - foreach ($stmt_expr_type->getAtomicTypes() as $type_string => $type_part) { - if ($type_part instanceof TInt || $type_part instanceof TString) { - if ($type_part instanceof TLiteralInt) { - $type_part->value = ~$type_part->value; - } elseif ($type_part instanceof TLiteralString) { - $type_part->value = ~$type_part->value; - } - - $acceptable_types[] = $type_part; - $has_valid_operand = true; - } elseif ($type_part instanceof TFloat) { - $type_part = ($type_part instanceof TLiteralFloat) ? - new TLiteralInt(~$type_part->value) : - new TInt; - - $stmt_expr_type->removeType($type_string); - $stmt_expr_type->addType($type_part); - - $acceptable_types[] = $type_part; - $has_valid_operand = true; - } elseif (!$unacceptable_type) { - $unacceptable_type = $type_part; - } - } - - if ($unacceptable_type || !$acceptable_types) { - $message = 'Cannot negate a non-numeric non-string type ' . $unacceptable_type; - if ($has_valid_operand) { - IssueBuffer::maybeAdd( - new PossiblyInvalidOperand( - $message, - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidOperand( - $message, - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } else { - $statements_analyzer->node_data->setType($stmt, new Union($acceptable_types)); - } - } - - self::addDataFlow($statements_analyzer, $stmt, $stmt->expr); - - return true; - } - - private static function addDataFlow( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $stmt, - PhpParser\Node\Expr $value - ): void { - $result_type = $statements_analyzer->node_data->getType($stmt); - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph && $result_type) { - $var_location = new CodeLocation($statements_analyzer, $stmt); - - $stmt_value_type = $statements_analyzer->node_data->getType($value); - - $new_parent_node = DataFlowNode::getForAssignment('bitwisenot', $var_location); - $statements_analyzer->data_flow_graph->addNode($new_parent_node); - $result_type->parent_nodes = [ - $new_parent_node->id => $new_parent_node, - ]; - - if ($stmt_value_type && $stmt_value_type->parent_nodes) { - foreach ($stmt_value_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath($parent_node, $new_parent_node, 'bitwisenot'); - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php deleted file mode 100644 index cf135ee9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php +++ /dev/null @@ -1,46 +0,0 @@ -inside_negation; - - $context->inside_negation = !$inside_negation; - - $result = ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context); - - $context->inside_negation = $inside_negation; - - $expr_type = $statements_analyzer->node_data->getType($stmt->expr); - - $stmt_type = Type::getBool(); - if ($expr_type) { - if ($expr_type->isAlwaysTruthy()) { - $stmt_type = Type::getFalse(); - } elseif ($expr_type->isAlwaysFalsy()) { - $stmt_type = Type::getTrue(); - } - - $stmt_type->from_docblock = $expr_type->from_docblock; - $stmt_type->parent_nodes = $expr_type->parent_nodes; - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - return $result; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php deleted file mode 100644 index 84b777c7..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php +++ /dev/null @@ -1,1629 +0,0 @@ -> $class_generic_params - * @return false|null - */ - public static function checkArgumentMatches( - StatementsAnalyzer $statements_analyzer, - ?string $cased_method_id, - ?MethodIdentifier $method_id, - ?string $self_fq_class_name, - ?string $static_fq_class_name, - CodeLocation $function_call_location, - ?FunctionLikeParameter $function_param, - int $argument_offset, - int $unpacked_argument_offset, - bool $allow_named_args, - PhpParser\Node\Arg $arg, - ?Union $arg_value_type, - Context $context, - array $class_generic_params, - ?TemplateResult $template_result, - bool $specialize_taint, - bool $in_call_map - ): ?bool { - $codebase = $statements_analyzer->getCodebase(); - - if (!$arg_value_type) { - if ($function_param && !$function_param->by_ref) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - $param_type = $function_param->type; - - if ($function_param->is_variadic - && $param_type - && $param_type->hasArray() - ) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TList|TArray - */ - $array_type = $param_type->getAtomicTypes()['array']; - - if ($array_type instanceof TList) { - $param_type = $array_type->type_param; - } else { - $param_type = $array_type->type_params[1]; - } - } - - if ($param_type && !$param_type->hasMixed()) { - IssueBuffer::maybeAdd( - new MixedArgument( - 'Argument ' . ($argument_offset + 1) . ' of ' . $cased_method_id - . ' cannot be mixed, expecting ' . $param_type, - new CodeLocation($statements_analyzer->getSource(), $arg->value), - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - return null; - } - - if (!$function_param) { - return null; - } - - if ($function_param->expect_variable - && $arg_value_type->isSingleStringLiteral() - && !$arg->value instanceof PhpParser\Node\Scalar\MagicConst - && !$arg->value instanceof PhpParser\Node\Expr\ConstFetch - && !$arg->value instanceof PhpParser\Node\Expr\ClassConstFetch - ) { - $values = preg_split('//u', $arg_value_type->getSingleStringLiteral()->value, -1, PREG_SPLIT_NO_EMPTY); - - if ($values !== false) { - $prev_ord = 0; - - $gt_count = 0; - - foreach ($values as $value) { - $ord = ord($value); - - if ($ord > $prev_ord) { - $gt_count++; - } - - $prev_ord = $ord; - } - - if (count($values) < 12 || ($gt_count / count($values)) < 0.8) { - IssueBuffer::maybeAdd( - new InvalidLiteralArgument( - 'Argument ' . ($argument_offset + 1) . ' of ' . $cased_method_id - . ' expects a non-literal value, ' . $arg_value_type->getId() . ' provided', - new CodeLocation($statements_analyzer->getSource(), $arg->value), - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - if (self::checkFunctionLikeTypeMatches( - $statements_analyzer, - $codebase, - $cased_method_id, - $method_id, - $self_fq_class_name, - $static_fq_class_name, - $function_call_location, - $function_param, - $allow_named_args, - $arg_value_type, - $argument_offset, - $unpacked_argument_offset, - $arg, - $context, - $class_generic_params, - $template_result, - $specialize_taint, - $in_call_map - ) === false) { - return false; - } - - return null; - } - - /** - * @param array> $class_generic_params - * @return false|null - */ - private static function checkFunctionLikeTypeMatches( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - ?string $cased_method_id, - ?MethodIdentifier $method_id, - ?string $self_fq_class_name, - ?string $static_fq_class_name, - CodeLocation $function_call_location, - FunctionLikeParameter $function_param, - bool $allow_named_args, - Union $arg_type, - int $argument_offset, - int $unpacked_argument_offset, - PhpParser\Node\Arg $arg, - Context $context, - ?array $class_generic_params, - ?TemplateResult $template_result, - bool $specialize_taint, - bool $in_call_map - ): ?bool { - if (!$function_param->type) { - if (!$codebase->infer_types_from_usage && !$statements_analyzer->data_flow_graph) { - return null; - } - - $param_type = Type::getMixed(); - } else { - $param_type = clone $function_param->type; - } - - $bindable_template_params = []; - - if ($template_result) { - $bindable_template_params = $param_type->getTemplateTypes(); - } - - $parent_class = null; - - $classlike_storage = null; - $static_classlike_storage = null; - - if ($self_fq_class_name) { - $classlike_storage = $codebase->classlike_storage_provider->get($self_fq_class_name); - $parent_class = $classlike_storage->parent_class; - $static_classlike_storage = $classlike_storage; - - if ($static_fq_class_name && $static_fq_class_name !== $self_fq_class_name) { - $static_classlike_storage = $codebase->classlike_storage_provider->get($static_fq_class_name); - } - } - - $param_type = TypeExpander::expandUnion( - $codebase, - $param_type, - $classlike_storage->name ?? null, - $static_classlike_storage->name ?? null, - $parent_class, - true, - false, - $static_classlike_storage->final ?? false, - true - ); - - if ($class_generic_params) { - // here we're replacing the param types and arg types with the bound - // class template params. - // - // For example, if we're operating on a class Foo with params TKey and TValue, - // and we're calling a method "add(TKey $key, TValue $value)" on an instance - // of that class where we know that TKey is int and TValue is string, then we - // want to substitute the expected parameters so it's as if we were actually - // calling "add(int $key, string $value)" - $readonly_template_result = new TemplateResult($class_generic_params, []); - - // This flag ensures that the template results will never be written to - // It also supercedes the `$add_lower_bounds` flag so that closure params - // don’t get overwritten - $readonly_template_result->readonly = true; - - $arg_value_type = $statements_analyzer->node_data->getType($arg->value); - - $param_type = TemplateStandinTypeReplacer::replace( - $param_type, - $readonly_template_result, - $codebase, - $statements_analyzer, - $arg_value_type, - $argument_offset, - $context->self, - $context->calling_function_id ?: $context->calling_method_id - ); - - $arg_type = TemplateStandinTypeReplacer::replace( - $arg_type, - $readonly_template_result, - $codebase, - $statements_analyzer, - $arg_value_type, - $argument_offset, - $context->self, - $context->calling_function_id ?: $context->calling_method_id - ); - } - - if ($template_result && $template_result->template_types) { - $arg_type_param = $arg_type; - - if ($arg->unpack) { - $arg_type_param = null; - - foreach ($arg_type->getAtomicTypes() as $arg_atomic_type) { - if ($arg_atomic_type instanceof TArray - || $arg_atomic_type instanceof TList - || $arg_atomic_type instanceof TKeyedArray - ) { - if ($arg_atomic_type instanceof TKeyedArray) { - $arg_type_param = $arg_atomic_type->getGenericValueType(); - } elseif ($arg_atomic_type instanceof TList) { - $arg_type_param = $arg_atomic_type->type_param; - } else { - $arg_type_param = $arg_atomic_type->type_params[1]; - } - } elseif ($arg_atomic_type instanceof TIterable) { - $arg_type_param = $arg_atomic_type->type_params[1]; - } elseif ($arg_atomic_type instanceof TNamedObject) { - ForeachAnalyzer::getKeyValueParamsForTraversableObject( - $arg_atomic_type, - $codebase, - $key_type, - $arg_type_param - ); - } - } - - if (!$arg_type_param) { - $arg_type_param = Type::getMixed(); - $arg_type_param->parent_nodes = $arg_type->parent_nodes; - } - } - - $param_type = TemplateStandinTypeReplacer::replace( - $param_type, - $template_result, - $codebase, - $statements_analyzer, - $arg_type_param, - $argument_offset, - !$statements_analyzer->isStatic() - && (!$method_id || $method_id->method_name !== '__construct') - ? $context->self - : null, - $context->calling_method_id ?: $context->calling_function_id - ); - - foreach ($bindable_template_params as $template_type) { - if (!isset( - $template_result->lower_bounds - [$template_type->param_name] - [$template_type->defining_class] - )) { - if (isset( - $template_result->upper_bounds - [$template_type->param_name] - [$template_type->defining_class] - )) { - $template_result->lower_bounds[$template_type->param_name][$template_type->defining_class] = [ - new TemplateBound( - clone $template_result->upper_bounds - [$template_type->param_name] - [$template_type->defining_class]->type - ) - ]; - } else { - $template_result->lower_bounds[$template_type->param_name][$template_type->defining_class] = [ - new TemplateBound( - clone $template_type->as - ) - ]; - } - } - } - - $param_type = TypeExpander::expandUnion( - $codebase, - $param_type, - $classlike_storage->name ?? null, - $static_classlike_storage->name ?? null, - $parent_class, - true, - false, - $static_classlike_storage->final ?? false, - true - ); - } - - $fleshed_out_signature_type = $function_param->signature_type - ? TypeExpander::expandUnion( - $codebase, - $function_param->signature_type, - $classlike_storage->name ?? null, - $static_classlike_storage->name ?? null, - $parent_class - ) - : null; - - $unpacked_atomic_array = null; - - if ($arg->unpack) { - if ($arg_type->hasMixed()) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - IssueBuffer::maybeAdd( - new MixedArgument( - 'Argument ' . ($argument_offset + 1) . ' of ' . $cased_method_id - . ' cannot unpack ' . $arg_type->getId() . ', expecting iterable', - new CodeLocation($statements_analyzer->getSource(), $arg->value), - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - if ($cased_method_id) { - $arg_location = new CodeLocation($statements_analyzer->getSource(), $arg->value); - - self::processTaintedness( - $statements_analyzer, - $cased_method_id, - $method_id, - $argument_offset, - $arg_location, - $function_call_location, - $function_param, - $arg_type, - $arg->value, - $context, - $specialize_taint - ); - } - - return null; - } - - if ($arg_type->hasArray()) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TList|TKeyedArray|TClassStringMap - */ - $unpacked_atomic_array = $arg_type->getAtomicTypes()['array']; - $arg_key_allowed = true; - - if ($unpacked_atomic_array instanceof TKeyedArray) { - if (!$allow_named_args && !$unpacked_atomic_array->getGenericKeyType()->isInt()) { - $arg_key_allowed = false; - } - - if ($function_param->is_variadic) { - $arg_type = $unpacked_atomic_array->getGenericValueType(); - } elseif ($codebase->php_major_version >= 8 - && $allow_named_args - && isset($unpacked_atomic_array->properties[$function_param->name]) - ) { - $arg_type = clone $unpacked_atomic_array->properties[$function_param->name]; - } elseif ($unpacked_atomic_array->is_list - && isset($unpacked_atomic_array->properties[$unpacked_argument_offset]) - ) { - $arg_type = clone $unpacked_atomic_array->properties[$unpacked_argument_offset]; - } elseif ($function_param->is_optional && $function_param->default_type) { - if ($function_param->default_type instanceof Union) { - $arg_type = $function_param->default_type; - } else { - $arg_type_atomic = ConstantTypeResolver::resolve( - $codebase->classlikes, - $function_param->default_type, - $statements_analyzer - ); - - $arg_type = new Union([$arg_type_atomic]); - } - } else { - $arg_type = Type::getMixed(); - } - } elseif ($unpacked_atomic_array instanceof TList) { - $arg_type = $unpacked_atomic_array->type_param; - } elseif ($unpacked_atomic_array instanceof TClassStringMap) { - $arg_type = Type::getMixed(); - } else { - if (!$allow_named_args && !$unpacked_atomic_array->type_params[0]->isInt()) { - $arg_key_allowed = false; - } - $arg_type = $unpacked_atomic_array->type_params[1]; - } - - if (!$arg_key_allowed) { - IssueBuffer::maybeAdd( - new NamedArgumentNotAllowed( - 'Method ' . $cased_method_id - . ' called with named unpacked array ' . $unpacked_atomic_array->getId() - . ' (array with string keys)', - new CodeLocation($statements_analyzer->getSource(), $arg->value), - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } else { - $non_iterable = false; - $invalid_key = false; - $invalid_string_key = false; - $possibly_matches = false; - foreach ($arg_type->getAtomicTypes() as $atomic_type) { - if (!$atomic_type->isIterable($codebase)) { - $non_iterable = true; - } else { - $key_type = $codebase->getKeyValueParamsForTraversableObject($atomic_type)[0]; - if (!UnionTypeComparator::isContainedBy( - $codebase, - $key_type, - Type::getArrayKey() - )) { - $invalid_key = true; - - continue; - } - if (($codebase->php_major_version < 8 || !$allow_named_args) && !$key_type->isInt()) { - $invalid_string_key = true; - - continue; - } - $possibly_matches = true; - } - } - - $issue_type = $possibly_matches ? PossiblyInvalidArgument::class : InvalidArgument::class; - if ($non_iterable) { - IssueBuffer::maybeAdd( - new $issue_type( - 'Tried to unpack non-iterable ' . $arg_type->getId(), - new CodeLocation($statements_analyzer->getSource(), $arg->value), - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - if ($invalid_key) { - IssueBuffer::maybeAdd( - new $issue_type( - 'Method ' . $cased_method_id - . ' called with unpacked iterable ' . $arg_type->getId() - . ' with invalid key (must be ' - . ($codebase->php_major_version < 8 ? 'int' : 'int|string') . ')', - new CodeLocation($statements_analyzer->getSource(), $arg->value), - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - if ($invalid_string_key) { - if ($codebase->php_major_version < 8) { - IssueBuffer::maybeAdd( - new $issue_type( - 'String keys not supported in unpacked arguments', - new CodeLocation($statements_analyzer->getSource(), $arg->value), - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new NamedArgumentNotAllowed( - 'Method ' . $cased_method_id - . ' called with named unpacked iterable ' . $arg_type->getId() - . ' (iterable with string keys)', - new CodeLocation($statements_analyzer->getSource(), $arg->value), - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - return null; - } - } else { - if (!$allow_named_args && $arg->name !== null) { - IssueBuffer::maybeAdd( - new NamedArgumentNotAllowed( - 'Method ' . $cased_method_id. ' called with named argument ' . $arg->name->name, - new CodeLocation($statements_analyzer->getSource(), $arg->value), - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - // bypass verifying argument types when collecting initialisations, - // because the argument locations are not reliable (file names normally differ) - // See https://github.com/vimeo/psalm/issues/5662 - if ($arg instanceof VirtualArg - && $context->collect_initializations - ) { - return null; - } - - if (self::verifyType( - $statements_analyzer, - $arg_type, - $param_type, - $fleshed_out_signature_type, - $cased_method_id, - $method_id, - $argument_offset, - new CodeLocation($statements_analyzer->getSource(), $arg->value), - $arg->value, - $context, - $function_param, - $arg->unpack, - $unpacked_atomic_array, - $specialize_taint, - $in_call_map, - $function_call_location - ) === false) { - return false; - } - - return null; - } - - /** - * @param TKeyedArray|TArray|TList|TClassStringMap|null $unpacked_atomic_array - * @return null|false - * @psalm-suppress ComplexMethod - */ - public static function verifyType( - StatementsAnalyzer $statements_analyzer, - Union $input_type, - Union $param_type, - ?Union $signature_param_type, - ?string $cased_method_id, - ?MethodIdentifier $method_id, - int $argument_offset, - CodeLocation $arg_location, - PhpParser\Node\Expr $input_expr, - Context $context, - FunctionLikeParameter $function_param, - bool $unpack, - ?Atomic $unpacked_atomic_array, - bool $specialize_taint, - bool $in_call_map, - CodeLocation $function_call_location - ): ?bool { - $codebase = $statements_analyzer->getCodebase(); - - if ($param_type->hasMixed()) { - if ($codebase->infer_types_from_usage - && !$input_type->hasMixed() - && !$param_type->from_docblock - && !$param_type->had_template - && $method_id - && strpos($method_id->method_name, '__') !== 0 - ) { - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if ($declaring_method_id) { - $id_lc = strtolower((string) $declaring_method_id); - $codebase->analyzer->possible_method_param_types[$id_lc][$argument_offset] - = Type::combineUnionTypes( - $codebase->analyzer->possible_method_param_types[$id_lc][$argument_offset] ?? null, - clone $input_type, - $codebase - ); - } - } - - if ($cased_method_id) { - self::processTaintedness( - $statements_analyzer, - $cased_method_id, - $method_id, - $argument_offset, - $arg_location, - $function_call_location, - $function_param, - $input_type, - $input_expr, - $context, - $specialize_taint - ); - } - - return null; - } - - $method_identifier = $cased_method_id ? ' of ' . $cased_method_id : ''; - - if ($input_type->hasMixed()) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - $origin_locations = []; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - foreach ($input_type->parent_nodes as $parent_node) { - $origin_locations = array_merge( - $origin_locations, - $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) - ); - } - } - - $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; - - if ($origin_location && $origin_location->getHash() === $arg_location->getHash()) { - $origin_location = null; - } - - IssueBuffer::maybeAdd( - new MixedArgument( - 'Argument ' . ($argument_offset + 1) . $method_identifier - . ' cannot be ' . $input_type->getId() . ', expecting ' . - $param_type, - $arg_location, - $cased_method_id, - $origin_location - ), - $statements_analyzer->getSuppressedIssues() - ); - - if ($input_type->isMixed()) { - if (!$function_param->by_ref - && !($function_param->is_variadic xor $unpack) - && $cased_method_id !== 'echo' - && $cased_method_id !== 'print' - && (!$in_call_map || $context->strict_types) - ) { - self::coerceValueAfterGatekeeperArgument( - $statements_analyzer, - $input_type, - false, - $input_expr, - $param_type, - $signature_param_type, - $context, - $unpack, - $unpacked_atomic_array - ); - } - } - - if ($cased_method_id) { - $input_type = self::processTaintedness( - $statements_analyzer, - $cased_method_id, - $method_id, - $argument_offset, - $arg_location, - $function_call_location, - $function_param, - $input_type, - $input_expr, - $context, - $specialize_taint - ); - } - - if ($input_type->isMixed()) { - return null; - } - } - - if ($input_type->isNever()) { - IssueBuffer::maybeAdd( - new NoValue( - 'This function or method call never returns output', - $arg_location - ), - $statements_analyzer->getSuppressedIssues() - ); - - return null; - } - - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); - } - - if ($function_param->by_ref || $function_param->is_optional) { - //if the param is optional or a ref, we'll allow the input to be possibly_undefined - $param_type->possibly_undefined = true; - } - - if ($param_type->hasCallableType() && $param_type->isSingle()) { - // we do this replacement early because later we don't have access to the - // $statements_analyzer, which is necessary to understand string function names - foreach ($input_type->getAtomicTypes() as $key => $atomic_type) { - if (!$atomic_type instanceof TLiteralString - || InternalCallMapHandler::inCallMap($atomic_type->value) - ) { - continue; - } - - $candidate_callable = CallableTypeComparator::getCallableFromAtomic( - $codebase, - $atomic_type, - null, - $statements_analyzer, - true - ); - - if ($candidate_callable) { - $input_type->removeType($key); - $input_type->addType($candidate_callable); - } - } - } - - $union_comparison_results = new TypeComparisonResult(); - - $type_match_found = UnionTypeComparator::isContainedBy( - $codebase, - $input_type, - $param_type, - true, - true, - $union_comparison_results - ); - - $replace_input_type = false; - - if ($union_comparison_results->replacement_union_type) { - $replace_input_type = true; - $input_type = $union_comparison_results->replacement_union_type; - } - - if ($cased_method_id) { - $old_input_type = $input_type; - - $input_type = self::processTaintedness( - $statements_analyzer, - $cased_method_id, - $method_id, - $argument_offset, - $arg_location, - $function_call_location, - $function_param, - $input_type, - $input_expr, - $context, - $specialize_taint - ); - - if ($old_input_type !== $input_type) { - $replace_input_type = true; - } - } - - if ($type_match_found - && $param_type->hasCallableType() - ) { - $potential_method_ids = []; - - foreach ($input_type->getAtomicTypes() as $input_type_part) { - if ($input_type_part instanceof TKeyedArray) { - $potential_method_id = CallableTypeComparator::getCallableMethodIdFromTKeyedArray( - $input_type_part, - $codebase, - $context->calling_method_id, - $statements_analyzer->getFilePath() - ); - - if ($potential_method_id && $potential_method_id !== 'not-callable') { - $potential_method_ids[] = $potential_method_id; - } - } elseif ($input_type_part instanceof TLiteralString - && strpos($input_type_part->value, '::') - ) { - $parts = explode('::', $input_type_part->value); - $potential_method_ids[] = new MethodIdentifier( - $parts[0], - strtolower($parts[1]) - ); - } - } - - foreach ($potential_method_ids as $potential_method_id) { - $codebase->methods->methodExists( - $potential_method_id, - $context->calling_method_id, - null, - $statements_analyzer, - $statements_analyzer->getFilePath(), - true, - $context->insideUse() - ); - } - } - - if ($context->strict_types - && !$input_type->hasArray() - && !$param_type->from_docblock - && $cased_method_id !== 'echo' - && $cased_method_id !== 'print' - && $cased_method_id !== 'sprintf' - ) { - $union_comparison_results->scalar_type_match_found = false; - - if ($union_comparison_results->to_string_cast) { - $union_comparison_results->to_string_cast = false; - $type_match_found = false; - } - } - - if ($union_comparison_results->type_coerced && !$input_type->hasMixed()) { - if ($union_comparison_results->type_coerced_from_mixed) { - $origin_locations = []; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - foreach ($input_type->parent_nodes as $parent_node) { - $origin_locations = array_merge( - $origin_locations, - $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) - ); - } - } - - $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; - - if ($origin_location && $origin_location->getHash() === $arg_location->getHash()) { - $origin_location = null; - } - - IssueBuffer::maybeAdd( - new MixedArgumentTypeCoercion( - 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . $param_type->getId() . - ', parent type ' . $input_type->getId() . ' provided', - $arg_location, - $cased_method_id, - $origin_location - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new ArgumentTypeCoercion( - 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . $param_type->getId() . - ', parent type ' . $input_type->getId() . ' provided', - $arg_location, - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($union_comparison_results->to_string_cast && $cased_method_id !== 'echo' && $cased_method_id !== 'print') { - IssueBuffer::maybeAdd( - new ImplicitToStringCast( - 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . - $param_type->getId() . ', ' . $input_type->getId() . ' provided with a __toString method', - $arg_location - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (!$type_match_found && !$union_comparison_results->type_coerced) { - $types_can_be_identical = UnionTypeComparator::canBeContainedBy( - $codebase, - $input_type, - $param_type, - true, - true - ); - - $type = ($input_type->possibly_undefined ? 'possibly undefined ' : '') . $input_type->getId(); - if ($union_comparison_results->scalar_type_match_found) { - if ($cased_method_id !== 'echo' && $cased_method_id !== 'print') { - IssueBuffer::maybeAdd( - new InvalidScalarArgument( - 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . - $param_type->getId() . ', ' . $type . ' provided', - $arg_location, - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } elseif ($types_can_be_identical) { - IssueBuffer::maybeAdd( - new PossiblyInvalidArgument( - 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . $param_type->getId() . - ', possibly different type ' . $type . ' provided', - $arg_location, - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidArgument( - 'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' . $param_type->getId() . - ', ' . $type . ' provided', - $arg_location, - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - return null; - } - - if ($input_expr instanceof PhpParser\Node\Scalar\String_ - || $input_expr instanceof PhpParser\Node\Expr\Array_ - || $input_expr instanceof PhpParser\Node\Expr\BinaryOp\Concat - ) { - self::verifyExplicitParam( - $statements_analyzer, - $param_type, - $arg_location, - $input_expr, - $context - ); - - return null; - } - - if (!$param_type->isNullable() && $cased_method_id !== 'echo' && $cased_method_id !== 'print') { - if ($input_type->isNull()) { - IssueBuffer::maybeAdd( - new NullArgument( - 'Argument ' . ($argument_offset + 1) . $method_identifier . ' cannot be null, ' . - 'null value provided to parameter with type ' . $param_type->getId(), - $arg_location, - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - return null; - } - - if ($input_type->isNullable() && !$input_type->ignore_nullable_issues) { - IssueBuffer::maybeAdd( - new PossiblyNullArgument( - 'Argument ' . ($argument_offset + 1) . $method_identifier . ' cannot be null, possibly ' . - 'null value provided', - $arg_location, - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if (!$param_type->isFalsable() && - !$param_type->hasBool() && - !$param_type->hasScalar() && - $cased_method_id !== 'echo' && - $cased_method_id !== 'print' - ) { - if ($input_type->isFalse()) { - IssueBuffer::maybeAdd( - new InvalidArgument( - 'Argument ' . ($argument_offset + 1) . $method_identifier . ' cannot be false, ' . - $param_type->getId() . ' value expected', - $arg_location, - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - return null; - } - - if ($input_type->isFalsable() && !$input_type->ignore_falsable_issues) { - IssueBuffer::maybeAdd( - new PossiblyFalseArgument( - 'Argument ' . ($argument_offset + 1) . $method_identifier . ' cannot be false, possibly ' . - $param_type->getId() . ' value expected', - $arg_location, - $cased_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if (($type_match_found || $input_type->hasMixed()) - && !$function_param->by_ref - && !($function_param->is_variadic xor $unpack) - && $cased_method_id !== 'echo' - && $cased_method_id !== 'print' - && (!$in_call_map || $context->strict_types) - ) { - self::coerceValueAfterGatekeeperArgument( - $statements_analyzer, - $input_type, - $replace_input_type, - $input_expr, - $param_type, - $signature_param_type, - $context, - $unpack, - $unpacked_atomic_array - ); - } - - return null; - } - - /** - * @param PhpParser\Node\Scalar\String_|PhpParser\Node\Expr\Array_|PhpParser\Node\Expr\BinaryOp\Concat $input_expr - */ - private static function verifyExplicitParam( - StatementsAnalyzer $statements_analyzer, - Union $param_type, - CodeLocation $arg_location, - PhpParser\Node\Expr $input_expr, - Context $context - ): void { - $codebase = $statements_analyzer->getCodebase(); - - foreach ($param_type->getAtomicTypes() as $param_type_part) { - if ($param_type_part instanceof TClassString - && $input_expr instanceof PhpParser\Node\Scalar\String_ - && $param_type->isSingle() - ) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $input_expr->value, - $arg_location, - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions(true) - ) === false - ) { - return; - } - } elseif ($param_type_part instanceof TArray - && $input_expr instanceof PhpParser\Node\Expr\Array_ - ) { - foreach ($param_type_part->type_params[1]->getAtomicTypes() as $param_array_type_part) { - if ($param_array_type_part instanceof TClassString) { - foreach ($input_expr->items as $item) { - if ($item && $item->value instanceof PhpParser\Node\Scalar\String_) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $item->value->value, - $arg_location, - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions(true) - ) === false - ) { - return; - } - } - } - } - } - } elseif ($param_type_part instanceof TCallable) { - $can_be_callable_like_array = false; - if ($param_type->hasArray()) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - */ - $param_array_type = $param_type->getAtomicTypes()['array']; - - $row_type = null; - if ($param_array_type instanceof TList) { - $row_type = $param_array_type->type_param; - } elseif ($param_array_type instanceof TArray) { - $row_type = $param_array_type->type_params[1]; - } elseif ($param_array_type instanceof TKeyedArray) { - $row_type = $param_array_type->getGenericArrayType()->type_params[1]; - } - - if ($row_type && - ($row_type->hasMixed() || $row_type->hasString()) - ) { - $can_be_callable_like_array = true; - } - } - - if (!$can_be_callable_like_array) { - $function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( - $statements_analyzer, - $input_expr - ); - - foreach ($function_ids as $function_id) { - if (strpos($function_id, '::') !== false) { - if ($function_id[0] === '$') { - $function_id = substr($function_id, 1); - } - - $function_id_parts = explode('&', $function_id); - - $non_existent_method_ids = []; - $has_valid_method = false; - - foreach ($function_id_parts as $function_id_part) { - [$callable_fq_class_name, $method_name] = explode('::', $function_id_part); - - switch ($callable_fq_class_name) { - case 'self': - case 'static': - case 'parent': - $container_class = $statements_analyzer->getFQCLN(); - - if ($callable_fq_class_name === 'parent') { - $container_class = $statements_analyzer->getParentFQCLN(); - } - - if (!$container_class) { - continue 2; - } - - $callable_fq_class_name = $container_class; - } - - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $callable_fq_class_name, - $arg_location, - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions(true) - ) === false - ) { - return; - } - - $function_id_part = new MethodIdentifier( - $callable_fq_class_name, - strtolower($method_name) - ); - - $call_method_id = new MethodIdentifier( - $callable_fq_class_name, - '__call' - ); - - if (!$codebase->classOrInterfaceOrEnumExists($callable_fq_class_name)) { - return; - } - - if (!$codebase->methods->methodExists($function_id_part) - && !$codebase->methods->methodExists($call_method_id) - ) { - $non_existent_method_ids[] = $function_id_part; - } else { - $has_valid_method = true; - } - } - - if (!$has_valid_method && !$param_type->hasString() && !$param_type->hasArray()) { - if (MethodAnalyzer::checkMethodExists( - $codebase, - $non_existent_method_ids[0], - $arg_location, - $statements_analyzer->getSuppressedIssues() - ) === false - ) { - return; - } - } - } else { - if (!$param_type->hasString() - && !$param_type->hasArray() - && CallAnalyzer::checkFunctionExists( - $statements_analyzer, - $function_id, - $arg_location, - false - ) === false - ) { - return; - } - } - } - } - } - } - } - - /** - * @param TKeyedArray|TArray|TList|TClassStringMap $unpacked_atomic_array - */ - private static function coerceValueAfterGatekeeperArgument( - StatementsAnalyzer $statements_analyzer, - Union $input_type, - bool $input_type_changed, - PhpParser\Node\Expr $input_expr, - Union $param_type, - ?Union $signature_param_type, - Context $context, - bool $unpack, - ?Atomic $unpacked_atomic_array - ): void { - if ($param_type->hasMixed()) { - return; - } - - if (!$input_type_changed && $param_type->from_docblock && !$input_type->hasMixed()) { - $input_type = clone $input_type; - - foreach ($param_type->getAtomicTypes() as $param_atomic_type) { - if ($param_atomic_type instanceof TGenericObject) { - foreach ($input_type->getAtomicTypes() as $input_atomic_type) { - if ($input_atomic_type instanceof TGenericObject - && $input_atomic_type->value === $param_atomic_type->value - ) { - foreach ($input_atomic_type->type_params as $i => $type_param) { - if ($type_param->isEmpty() && isset($param_atomic_type->type_params[$i])) { - $input_type_changed = true; - - $input_atomic_type->type_params[$i] = clone $param_atomic_type->type_params[$i]; - } - } - } - } - } - } - - if (!$input_type_changed) { - return; - } - } - - $var_id = ExpressionIdentifier::getVarId( - $input_expr, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($var_id) { - $was_cloned = false; - - if ($input_type->isNullable() && !$param_type->isNullable()) { - $input_type = clone $input_type; - $was_cloned = true; - $input_type->removeType('null'); - } - - if ($input_type->getId() === $param_type->getId()) { - if ($input_type->from_docblock) { - if (!$was_cloned) { - $was_cloned = true; - $input_type = clone $input_type; - } - - $input_type->from_docblock = false; - - foreach ($input_type->getAtomicTypes() as $atomic_type) { - $atomic_type->from_docblock = false; - } - } - } elseif ($input_type->hasMixed() && $signature_param_type) { - $was_cloned = true; - $parent_nodes = $input_type->parent_nodes; - $by_ref = $input_type->by_ref; - $input_type = clone $signature_param_type; - - if ($input_type->isNullable()) { - $input_type->ignore_nullable_issues = true; - } - - $input_type->parent_nodes = $parent_nodes; - $input_type->by_ref = $by_ref; - } - - if ($context->inside_conditional && !isset($context->assigned_var_ids[$var_id])) { - $context->assigned_var_ids[$var_id] = 0; - } - - if ($was_cloned) { - $context->removeVarFromConflictingClauses($var_id, null, $statements_analyzer); - } - - if ($unpack) { - if ($unpacked_atomic_array instanceof TList) { - $unpacked_atomic_array = clone $unpacked_atomic_array; - $unpacked_atomic_array->type_param = $input_type; - - $context->vars_in_scope[$var_id] = new Union([$unpacked_atomic_array]); - } elseif ($unpacked_atomic_array instanceof TArray) { - $unpacked_atomic_array = clone $unpacked_atomic_array; - $unpacked_atomic_array->type_params[1] = $input_type; - - $context->vars_in_scope[$var_id] = new Union([$unpacked_atomic_array]); - } elseif ($unpacked_atomic_array instanceof TKeyedArray - && $unpacked_atomic_array->is_list - ) { - $unpacked_atomic_array = $unpacked_atomic_array->getList(); - $unpacked_atomic_array->type_param = $input_type; - - $context->vars_in_scope[$var_id] = new Union([$unpacked_atomic_array]); - } else { - $context->vars_in_scope[$var_id] = new Union([ - new TArray([ - Type::getInt(), - $input_type - ]), - ]); - } - } else { - $context->vars_in_scope[$var_id] = $input_type; - } - } - } - - private static function processTaintedness( - StatementsAnalyzer $statements_analyzer, - string $cased_method_id, - ?MethodIdentifier $method_id, - int $argument_offset, - CodeLocation $arg_location, - CodeLocation $function_call_location, - FunctionLikeParameter $function_param, - Union $input_type, - PhpParser\Node\Expr $expr, - Context $context, - bool $specialize_taint - ): Union { - $codebase = $statements_analyzer->getCodebase(); - - if (!$statements_analyzer->data_flow_graph - || ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues())) - ) { - return $input_type; - } - - // literal data can’t be tainted - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && $input_type->isSingle() - && $input_type->hasLiteralValue() - ) { - return $input_type; - } - - // numeric types can't be tainted, neither can bool - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && $input_type->isSingle() - && ($input_type->isInt() || $input_type->isFloat() || $input_type->isBool()) - ) { - return $input_type; - } - - $event = new AddRemoveTaintsEvent($expr, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - if ($function_param->type && $function_param->type->isString() && !$input_type->isString()) { - $cast_type = CastAnalyzer::castStringAttempt( - $statements_analyzer, - $context, - $input_type, - $expr, - false - ); - - $input_type = clone $input_type; - $input_type->parent_nodes += $cast_type->parent_nodes; - } - - if ($specialize_taint) { - $method_node = DataFlowNode::getForMethodArgument( - $cased_method_id, - $cased_method_id, - $argument_offset, - $statements_analyzer->data_flow_graph instanceof TaintFlowGraph - ? $function_param->location - : null, - $function_call_location - ); - } else { - $method_node = DataFlowNode::getForMethodArgument( - $cased_method_id, - $cased_method_id, - $argument_offset, - $statements_analyzer->data_flow_graph instanceof TaintFlowGraph - ? $function_param->location - : null - ); - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && $method_id - && $method_id->method_name !== '__construct' - ) { - $fq_classlike_name = $method_id->fq_class_name; - $method_name = $method_id->method_name; - $cased_method_name = explode('::', $cased_method_id)[1]; - - $class_storage = $codebase->classlike_storage_provider->get($fq_classlike_name); - - foreach ($class_storage->dependent_classlikes as $dependent_classlike_lc => $_) { - $dependent_classlike_storage = $codebase->classlike_storage_provider->get( - $dependent_classlike_lc - ); - $new_sink = DataFlowNode::getForMethodArgument( - $dependent_classlike_lc . '::' . $method_name, - $dependent_classlike_storage->name . '::' . $cased_method_name, - $argument_offset, - $arg_location, - null - ); - - $statements_analyzer->data_flow_graph->addNode($new_sink); - $statements_analyzer->data_flow_graph->addPath( - $method_node, - $new_sink, - 'arg', - $added_taints, - $removed_taints - ); - } - } - } - - if ($method_id && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if ($declaring_method_id && (string) $declaring_method_id !== (string) $method_id) { - $new_sink = DataFlowNode::getForMethodArgument( - (string) $declaring_method_id, - $codebase->methods->getCasedMethodId($declaring_method_id), - $argument_offset, - $arg_location, - null - ); - - $statements_analyzer->data_flow_graph->addNode($new_sink); - $statements_analyzer->data_flow_graph->addPath( - $method_node, - $new_sink, - 'arg', - $added_taints, - $removed_taints - ); - } - } - - $statements_analyzer->data_flow_graph->addNode($method_node); - - $argument_value_node = DataFlowNode::getForAssignment( - 'call to ' . $cased_method_id, - $arg_location - ); - - $statements_analyzer->data_flow_graph->addNode($argument_value_node); - - $statements_analyzer->data_flow_graph->addPath( - $argument_value_node, - $method_node, - 'arg', - $added_taints, - $removed_taints - ); - - foreach ($input_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addNode($method_node); - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $argument_value_node, - 'arg', - $added_taints, - $removed_taints - ); - } - - if ($function_param->assert_untainted) { - $input_type = clone $input_type; - $input_type->parent_nodes = []; - } - - return $input_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php deleted file mode 100644 index cf5fe6f2..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php +++ /dev/null @@ -1,142 +0,0 @@ -file_provider->getContents($statements_analyzer->getFilePath()); - - // Find opening paren - $first_argument = $stmt->getArgs()[0] ?? null; - $first_argument_character = $first_argument !== null - ? $first_argument->getStartFilePos() - : $stmt->getEndFilePos(); - $method_name_and_first_paren_source_code_length = $first_argument_character - $stmt->getStartFilePos(); - // FIXME: There are weird ::__construct calls in the AST for `extends` - if ($method_name_and_first_paren_source_code_length <= 0) { - return; - } - $method_name_and_first_paren_source_code = substr( - $file_content, - $stmt->getStartFilePos(), - $method_name_and_first_paren_source_code_length - ); - $method_name_and_first_paren_tokens = token_get_all('getStartFilePos()) { - return; - } - - // Record ranges of the source code that need to be tokenized to find commas - /** @var array{0: int, 1: int}[] $ranges */ - $ranges = []; - - // Add range between opening paren and first argument - $first_argument = $stmt->getArgs()[0] ?? null; - $first_argument_starting_position = $first_argument !== null - ? $first_argument->getStartFilePos() - : $stmt->getEndFilePos(); - $first_range_starting_position = $opening_paren_position + 1; - if ($first_range_starting_position !== $first_argument_starting_position) { - $ranges[] = [$first_range_starting_position, $first_argument_starting_position]; - } - - // Add range between arguments - foreach ($stmt->getArgs() as $i => $argument) { - $range_start = $argument->getEndFilePos() + 1; - $next_argument = $stmt->getArgs()[$i + 1] ?? null; - $range_end = $next_argument !== null - ? $next_argument->getStartFilePos() - : $stmt->getEndFilePos(); - - if ($range_start !== $range_end) { - $ranges[] = [$range_start, $range_end]; - } - } - - $commas = []; - foreach ($ranges as $range) { - $position = $range[0]; - $length = $range[1] - $position; - - if ($length > 0) { - $range_source_code = substr($file_content, $position, $length); - $range_tokens = token_get_all('analyzer->addNodeArgument( - $statements_analyzer->getFilePath(), - $argument_start_position, - $comma, - $function_reference, - $argument_number - ); - - ++$argument_number; - $argument_start_position = $comma + 1; - } - - $codebase->analyzer->addNodeArgument( - $statements_analyzer->getFilePath(), - $argument_start_position, - $stmt->getEndFilePos(), - $function_reference, - $argument_number - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php deleted file mode 100644 index c3930b74..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php +++ /dev/null @@ -1,1620 +0,0 @@ - $args - * @param array|null $function_params - * - * @return false|null - */ - public static function analyze( - StatementsAnalyzer $statements_analyzer, - array $args, - ?array $function_params, - ?string $method_id, - bool $allow_named_args, - Context $context, - ?TemplateResult $template_result = null - ): ?bool { - $last_param = $function_params - ? $function_params[count($function_params) - 1] - : null; - - // if this modifies the array type based on further args - if (in_array($method_id, ['array_push', 'array_unshift'], true) - && $function_params - && isset($args[0]) - && isset($args[1]) - ) { - if (ArrayFunctionArgumentsAnalyzer::handleAddition( - $statements_analyzer, - $args, - $context, - $method_id - ) === false - ) { - return false; - } - - return null; - } - - if ($method_id === 'array_splice' && $function_params && count($args) > 1) { - if (ArrayFunctionArgumentsAnalyzer::handleSplice($statements_analyzer, $args, $context) === false) { - return false; - } - - return null; - } - - if ($method_id === 'array_map') { - $args = array_reverse($args, true); - } - - foreach ($args as $argument_offset => $arg) { - if ($function_params === null) { - if (self::evaluateArbitraryParam( - $statements_analyzer, - $arg, - $context - ) === false) { - return false; - } - - continue; - } - - $param = null; - - if ($arg->name && $allow_named_args) { - foreach ($function_params as $candidate_param) { - if ($candidate_param->name === $arg->name->name) { - $param = $candidate_param; - break; - } - } - - if ($last_param && $last_param->is_variadic) { - $param = $last_param; - } - } elseif ($argument_offset < count($function_params)) { - $param = $function_params[$argument_offset]; - } elseif ($last_param && $last_param->is_variadic) { - $param = $last_param; - } - - $by_ref = $param && $param->by_ref; - - $by_ref_type = null; - - if ($by_ref) { - $by_ref_type = $param->type ? clone $param->type : Type::getMixed(); - } - - if ($by_ref - && $by_ref_type - && !($arg->value instanceof PhpParser\Node\Expr\Closure - || $arg->value instanceof PhpParser\Node\Expr\ConstFetch - || $arg->value instanceof PhpParser\Node\Expr\ClassConstFetch - || $arg->value instanceof PhpParser\Node\Expr\FuncCall - || $arg->value instanceof PhpParser\Node\Expr\MethodCall - || $arg->value instanceof PhpParser\Node\Expr\StaticCall - || $arg->value instanceof PhpParser\Node\Expr\New_ - || $arg->value instanceof PhpParser\Node\Expr\Assign - || $arg->value instanceof PhpParser\Node\Expr\Array_ - || $arg->value instanceof PhpParser\Node\Expr\Ternary - || $arg->value instanceof PhpParser\Node\Expr\BinaryOp - ) - ) { - if (self::handleByRefFunctionArg( - $statements_analyzer, - $method_id, - $argument_offset, - $arg, - $context - ) === false) { - return false; - } - - continue; - } - - $toggled_class_exists = false; - - if ($method_id === 'class_exists' - && $argument_offset === 0 - && !$context->inside_class_exists - ) { - $context->inside_class_exists = true; - $toggled_class_exists = true; - } - - if (($arg->value instanceof PhpParser\Node\Expr\Closure - || $arg->value instanceof PhpParser\Node\Expr\ArrowFunction) - && $param - && !$arg->value->getDocComment() - ) { - self::handleClosureArg( - $statements_analyzer, - $args, - $method_id, - $context, - $template_result ?? new TemplateResult([], []), - $argument_offset, - $arg, - $param - ); - } - - $was_inside_call = $context->inside_call; - - $context->inside_call = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $arg->value, $context) === false) { - $context->inside_call = $was_inside_call; - - return false; - } - - $context->inside_call = $was_inside_call; - - if (($argument_offset === 0 && $method_id === 'array_filter' && count($args) === 2) - || ($argument_offset > 0 && $method_id === 'array_map' && count($args) >= 2) - ) { - self::handleArrayMapFilterArrayArg( - $statements_analyzer, - $method_id, - $argument_offset, - $arg, - $context, - $template_result - ); - } - - $inferred_arg_type = $statements_analyzer->node_data->getType($arg->value); - - if (null !== $inferred_arg_type && null !== $template_result && null !== $param && null !== $param->type) { - $codebase = $statements_analyzer->getCodebase(); - - TemplateStandinTypeReplacer::replace( - clone $param->type, - $template_result, - $codebase, - $statements_analyzer, - $inferred_arg_type, - $argument_offset, - $context->self, - $context->calling_method_id ?: $context->calling_function_id - ); - } - - if ($toggled_class_exists) { - $context->inside_class_exists = false; - } - } - - if ($method_id === "ReflectionClass::getattributes" - || $method_id === "ReflectionClassConstant::getattributes" - || $method_id === "ReflectionFunction::getattributes" - || $method_id === "ReflectionMethod::getattributes" - || $method_id === "ReflectionParameter::getattributes" - || $method_id === "ReflectionProperty::getattributes" - ) { - AttributesAnalyzer::analyzeGetAttributes($statements_analyzer, $method_id, array_values($args)); - } - - return null; - } - - private static function handleArrayMapFilterArrayArg( - StatementsAnalyzer $statements_analyzer, - string $method_id, - int $argument_offset, - PhpParser\Node\Arg $arg, - Context $context, - ?TemplateResult &$template_result - ): void { - $codebase = $statements_analyzer->getCodebase(); - - $generic_param_type = new Union([ - new TArray([ - Type::getArrayKey(), - new Union([ - new TTemplateParam( - 'ArrayValue' . $argument_offset, - Type::getMixed(), - $method_id - ) - ]) - ]) - ]); - - $template_types = ['ArrayValue' . $argument_offset => [$method_id => Type::getMixed()]]; - - $replace_template_result = new TemplateResult( - $template_types, - [] - ); - - $existing_type = $statements_analyzer->node_data->getType($arg->value); - - TemplateStandinTypeReplacer::replace( - $generic_param_type, - $replace_template_result, - $codebase, - $statements_analyzer, - $existing_type, - $argument_offset, - $context->self, - $context->calling_method_id ?: $context->calling_function_id - ); - - if ($replace_template_result->lower_bounds) { - if (!$template_result) { - $template_result = new TemplateResult([], []); - } - - $template_result->lower_bounds += $replace_template_result->lower_bounds; - } - } - - /** - * @param array $args - */ - private static function handleClosureArg( - StatementsAnalyzer $statements_analyzer, - array $args, - ?string $method_id, - Context $context, - TemplateResult $template_result, - int $argument_offset, - PhpParser\Node\Arg $arg, - FunctionLikeParameter $param - ): void { - if (!$param->type) { - return; - } - - $codebase = $statements_analyzer->getCodebase(); - - if (($argument_offset === 1 && $method_id === 'array_filter' && count($args) === 2) - || ($argument_offset === 0 && $method_id === 'array_map' && count($args) >= 2) - ) { - $function_like_params = []; - - foreach ($template_result->lower_bounds as $template_name => $_) { - $function_like_params[] = new FunctionLikeParameter( - 'function', - false, - new Union([ - new TTemplateParam( - $template_name, - Type::getMixed(), - $method_id - ) - ]) - ); - } - - $replaced_type = new Union([ - new TCallable( - 'callable', - array_reverse($function_like_params) - ) - ]); - } else { - $replaced_type = clone $param->type; - } - - $replace_template_result = new TemplateResult( - array_map( - function ($template_map) use ($codebase) { - return array_map( - function ($lower_bounds) use ($codebase) { - return TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $lower_bounds, - $codebase - ); - }, - $template_map - ); - }, - $template_result->lower_bounds - ), - [] - ); - - $replaced_type = TemplateStandinTypeReplacer::replace( - $replaced_type, - $replace_template_result, - $codebase, - $statements_analyzer, - null, - null, - null, - $context->calling_method_id ?: $context->calling_function_id - ); - - TemplateInferredTypeReplacer::replace( - $replaced_type, - $replace_template_result, - $codebase - ); - - $closure_id = strtolower($statements_analyzer->getFilePath()) - . ':' . $arg->value->getLine() - . ':' . (int)$arg->value->getAttribute('startFilePos') - . ':-:closure'; - - try { - $closure_storage = $codebase->getClosureStorage( - $statements_analyzer->getFilePath(), - $closure_id - ); - } catch (UnexpectedValueException $e) { - return; - } - - foreach ($closure_storage->params as $closure_param_offset => $param_storage) { - $param_type_inferred = $param_storage->type_inferred; - - $newly_inferred_type = null; - $has_different_docblock_type = false; - - if ($param_storage->type && !$param_type_inferred) { - if ($param_storage->type !== $param_storage->signature_type) { - $has_different_docblock_type = true; - } - } - - if (!$has_different_docblock_type) { - foreach ($replaced_type->getAtomicTypes() as $replaced_type_part) { - if ($replaced_type_part instanceof TCallable - || $replaced_type_part instanceof TClosure - ) { - if (isset($replaced_type_part->params[$closure_param_offset]->type)) { - $replaced_param_type = $replaced_type_part->params[$closure_param_offset]->type; - - if ($replaced_param_type->hasTemplate()) { - $replaced_param_type = TypeExpander::expandUnion( - $codebase, - $replaced_param_type, - null, - null, - null, - true, - false, - false, - true, - true - ); - } - - if ($param_storage->type && !$param_type_inferred) { - $type_match_found = UnionTypeComparator::isContainedBy( - $codebase, - $replaced_param_type, - $param_storage->type - ); - - if (!$type_match_found) { - continue; - } - } - - $newly_inferred_type = Type::combineUnionTypes( - $newly_inferred_type, - $replaced_param_type, - $codebase - ); - } - } - } - } - - if ($newly_inferred_type) { - $param_storage->type = $newly_inferred_type; - $param_storage->type_inferred = true; - } - - if ($param_storage->type && ($method_id === 'array_map' || $method_id === 'array_filter')) { - ArrayFetchAnalyzer::taintArrayFetch( - $statements_analyzer, - $args[1 - $argument_offset]->value, - null, - $param_storage->type, - Type::getMixed() - ); - } - } - } - - /** - * @param list $args - * @param string|MethodIdentifier|null $method_id - * @param array $function_params - * - * @return false|null - * - * @psalm-suppress ComplexMethod there's just not much that can be done about this - */ - public static function checkArgumentsMatch( - StatementsAnalyzer $statements_analyzer, - array $args, - $method_id, - array $function_params, - ?FunctionLikeStorage $function_storage, - ?ClassLikeStorage $class_storage, - ?TemplateResult $class_template_result, - CodeLocation $code_location, - Context $context - ): ?bool { - $in_call_map = $method_id ? InternalCallMapHandler::inCallMap((string) $method_id) : false; - - $cased_method_id = (string) $method_id; - - $is_variadic = false; - - $fq_class_name = null; - - $codebase = $statements_analyzer->getCodebase(); - - if ($method_id) { - if (!$in_call_map && $method_id instanceof MethodIdentifier) { - $fq_class_name = $method_id->fq_class_name; - } - - if ($function_storage) { - $is_variadic = $function_storage->variadic; - } elseif (is_string($method_id)) { - $is_variadic = Functions::isVariadic( - $codebase, - strtolower($method_id), - $statements_analyzer->getRootFilePath() - ); - } else { - $is_variadic = $codebase->methods->isVariadic($method_id); - } - } - - if ($method_id instanceof MethodIdentifier) { - $cased_method_id = $codebase->methods->getCasedMethodId($method_id); - } elseif ($function_storage) { - $cased_method_id = $function_storage->cased_name; - } - - $calling_class_storage = $class_storage; - - $static_fq_class_name = $fq_class_name; - $self_fq_class_name = $fq_class_name; - - if ($method_id instanceof MethodIdentifier) { - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if ($declaring_method_id && (string)$declaring_method_id !== (string)$method_id) { - $self_fq_class_name = $declaring_method_id->fq_class_name; - $class_storage = $codebase->classlike_storage_provider->get($self_fq_class_name); - } - - $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); - - if ($appearing_method_id && $declaring_method_id !== $appearing_method_id) { - $self_fq_class_name = $appearing_method_id->fq_class_name; - } - } - - if ($function_params) { - foreach ($function_params as $function_param) { - $is_variadic = $is_variadic || $function_param->is_variadic; - } - } - - $has_packed_var = false; - - foreach ($args as $arg) { - if ($arg->unpack) { - $has_packed_var = true; - } - } - - $last_param = $function_params - ? $function_params[count($function_params) - 1] - : null; - - $template_result = null; - - $class_generic_params = []; - - if ($class_template_result) { - foreach ($class_template_result->lower_bounds as $template_name => $type_map) { - foreach ($type_map as $class => $lower_bounds) { - if (count($lower_bounds) === 1) { - $class_generic_params[$template_name][$class] = clone reset($lower_bounds)->type; - } - } - } - } - - if ($function_storage) { - $template_result = self::getProvisionalTemplateResultForFunctionLike( - $statements_analyzer, - $codebase, - $context, - $class_storage, - $self_fq_class_name, - $calling_class_storage, - $function_storage, - $class_generic_params, - $class_template_result, - $args, - $function_params, - $last_param - ); - } - - $function_param_count = count($function_params); - - if (count($function_params) > count($args) && !$has_packed_var) { - for ($i = count($args), $iMax = count($function_params); $i < $iMax; $i++) { - if ($function_params[$i]->default_type - && $function_params[$i]->type - && $function_params[$i]->type->hasTemplate() - ) { - if ($function_params[$i]->default_type instanceof Union) { - $default_type = $function_params[$i]->default_type; - } else { - $default_type_atomic = ConstantTypeResolver::resolve( - $codebase->classlikes, - $function_params[$i]->default_type, - $statements_analyzer - ); - - $default_type = new Union([$default_type_atomic]); - } - - if ($default_type->hasLiteralValue()) { - ArgumentAnalyzer::checkArgumentMatches( - $statements_analyzer, - $cased_method_id, - $method_id instanceof MethodIdentifier ? $method_id : null, - $self_fq_class_name, - $static_fq_class_name, - $code_location, - $function_params[$i], - $i, - $i, - $function_storage->allow_named_arg_calls ?? true, - new VirtualArg( - StubsGenerator::getExpressionFromType($default_type) - ), - $default_type, - $context, - $class_generic_params, - $template_result, - $function_storage->specialize_call ?? true, - $in_call_map - ); - } - } - } - } - - if (($method_id === 'preg_match_all' || $method_id === 'preg_match') && count($args) > 3) { - $args = array_reverse($args, true); - } - - $arg_function_params = []; - $matched_args = []; - $named_args_was_used = false; - - foreach ($args as $argument_offset => $arg) { - if ($named_args_was_used && !$arg->name) { - IssueBuffer::maybeAdd( - new InvalidNamedArgument( - 'Cannot use positional argument after named argument', - new CodeLocation($statements_analyzer, $arg), - (string)$method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($arg->unpack) { - if ($function_param_count > $argument_offset) { - for ($i = $argument_offset; $i < $function_param_count; $i++) { - $arg_function_params[$argument_offset][] = $function_params[$i]; - } - } - - if (($arg_value_type = $statements_analyzer->node_data->getType($arg->value)) - && $arg_value_type->hasArray()) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TList|TKeyedArray - */ - $array_type = $arg_value_type->getAtomicTypes()['array']; - - if ($array_type instanceof TKeyedArray) { - $key_types = $array_type->getGenericArrayType()->getChildNodes()[0]->getChildNodes(); - - foreach ($key_types as $key_type) { - if (!$key_type instanceof TLiteralString - || ($function_storage && !$function_storage->allow_named_arg_calls)) { - continue; - } - - $param_found = false; - - foreach ($function_params as $candidate_param) { - if ($candidate_param->name === $key_type->value || $candidate_param->is_variadic) { - if ($candidate_param->name === $key_type->value) { - if (isset($matched_args[$candidate_param->name])) { - IssueBuffer::maybeAdd( - new InvalidNamedArgument( - 'Parameter $' . $key_type->value . ' has already been used in ' - . ($cased_method_id ?: $method_id), - new CodeLocation($statements_analyzer, $arg), - (string)$method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $matched_args[$candidate_param->name] = true; - } - - $param_found = true; - break; - } - } - - if (!$param_found) { - IssueBuffer::maybeAdd( - new InvalidNamedArgument( - 'Parameter $' . $key_type->value . ' does not exist on function ' - . ($cased_method_id ?: $method_id), - new CodeLocation($statements_analyzer, $arg), - (string)$method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - } - } elseif ($arg->name && (!$function_storage || $function_storage->allow_named_arg_calls)) { - $named_args_was_used = true; - - foreach ($function_params as $candidate_param) { - if ($candidate_param->name === $arg->name->name || $candidate_param->is_variadic) { - if ($candidate_param->name === $arg->name->name) { - if (isset($matched_args[$candidate_param->name])) { - IssueBuffer::maybeAdd( - new InvalidNamedArgument( - 'Parameter $' . $arg->name->name . ' has already been used in ' - . ($cased_method_id ?: $method_id), - new CodeLocation($statements_analyzer, $arg->name), - (string) $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $matched_args[$candidate_param->name] = true; - } - - $arg_function_params[$argument_offset] = [$candidate_param]; - break; - } - } - - if (!isset($arg_function_params[$argument_offset])) { - IssueBuffer::maybeAdd( - new InvalidNamedArgument( - 'Parameter $' . $arg->name->name . ' does not exist on function ' - . ($cased_method_id ?: $method_id), - new CodeLocation($statements_analyzer, $arg->name), - (string) $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } elseif ($function_param_count > $argument_offset) { - $arg_function_params[$argument_offset] = [$function_params[$argument_offset]]; - $matched_args[$function_params[$argument_offset]->name] = true; - } elseif ($last_param && $last_param->is_variadic) { - $arg_function_params[$argument_offset] = [$last_param]; - $matched_args[$last_param->name] = true; - } - } - - foreach ($args as $argument_offset => $arg) { - if (!isset($arg_function_params[$argument_offset])) { - continue; - } - - if ($arg_function_params[$argument_offset][0]->by_ref - && $method_id !== 'extract' - ) { - if (self::handlePossiblyMatchingByRefParam( - $statements_analyzer, - $codebase, - (string) $method_id, - $cased_method_id, - $last_param, - $function_params, - $argument_offset, - $arg, - $context, - $template_result - ) === false) { - return null; - } - } - - $arg_value_type = $statements_analyzer->node_data->getType($arg->value); - - foreach ($arg_function_params[$argument_offset] as $i => $function_param) { - if (ArgumentAnalyzer::checkArgumentMatches( - $statements_analyzer, - $cased_method_id, - $method_id instanceof MethodIdentifier ? $method_id : null, - $self_fq_class_name, - $static_fq_class_name, - $code_location, - $function_param, - $argument_offset + $i, - $i, - $function_storage->allow_named_arg_calls ?? true, - $arg, - $arg_value_type, - $context, - $class_generic_params, - $template_result, - $function_storage->specialize_call ?? true, - $in_call_map - ) === false) { - return false; - } - } - } - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && $cased_method_id - ) { - foreach ($args as $argument_offset => $_) { - if (!isset($arg_function_params[$argument_offset])) { - continue; - } - - foreach ($arg_function_params[$argument_offset] as $function_param) { - if ($function_param->sinks) { - if (!$function_storage || $function_storage->specialize_call) { - $sink = TaintSink::getForMethodArgument( - $cased_method_id, - $cased_method_id, - $argument_offset, - $function_param->location, - $code_location - ); - } else { - $sink = TaintSink::getForMethodArgument( - $cased_method_id, - $cased_method_id, - $argument_offset, - $function_param->location - ); - } - - $sink->taints = $function_param->sinks; - - $statements_analyzer->data_flow_graph->addSink($sink); - } - } - } - } - - if ($method_id === 'array_map' || $method_id === 'array_filter') { - if ($method_id === 'array_map' && count($args) < 2) { - IssueBuffer::maybeAdd( - new TooFewArguments( - 'Too few arguments for ' . $method_id, - $code_location, - $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($method_id === 'array_filter' && count($args) < 1) { - IssueBuffer::maybeAdd( - new TooFewArguments( - 'Too few arguments for ' . $method_id, - $code_location, - $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - ArrayFunctionArgumentsAnalyzer::checkArgumentsMatch( - $statements_analyzer, - $context, - $args, - $method_id, - $context->check_functions - ); - - return null; - } - - if ($method_id === 'get_class' && $args === []) { - //get_class without args only works when inside a class - if (!$context->self) { - IssueBuffer::maybeAdd( - new TooFewArguments( - 'Cannot call get_class() without argument outside of class scope', - $code_location, - $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - return null; - } - } - - self::checkArgCount( - $statements_analyzer, - $codebase, - $function_storage, - $context, - $template_result, - $is_variadic, - $args, - $function_params, - $in_call_map, - $method_id, - $cased_method_id, - $code_location - ); - - return null; - } - - /** - * @param array $function_params - * @return false|null - */ - private static function handlePossiblyMatchingByRefParam( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - string $method_id, - ?string $cased_method_id, - ?FunctionLikeParameter $last_param, - array $function_params, - int $argument_offset, - PhpParser\Node\Arg $arg, - Context $context, - ?TemplateResult $template_result - ): ?bool { - if ($arg->value instanceof PhpParser\Node\Scalar - || $arg->value instanceof PhpParser\Node\Expr\Cast - || $arg->value instanceof PhpParser\Node\Expr\Array_ - || $arg->value instanceof PhpParser\Node\Expr\ClassConstFetch - || $arg->value instanceof PhpParser\Node\Expr\BinaryOp - || $arg->value instanceof PhpParser\Node\Expr\Ternary - || ( - ( - $arg->value instanceof PhpParser\Node\Expr\ConstFetch - || $arg->value instanceof PhpParser\Node\Expr\FuncCall - || $arg->value instanceof PhpParser\Node\Expr\MethodCall - || $arg->value instanceof PhpParser\Node\Expr\StaticCall - ) && ( - !($arg_value_type = $statements_analyzer->node_data->getType($arg->value)) - || !$arg_value_type->by_ref - ) - ) - ) { - IssueBuffer::maybeAdd( - new InvalidPassByReference( - 'Parameter ' . ($argument_offset + 1) . ' of ' . $cased_method_id . ' expects a variable', - new CodeLocation($statements_analyzer->getSource(), $arg->value) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return false; - } - - if (!in_array( - $method_id, - [ - 'ksort', 'asort', 'krsort', 'arsort', 'natcasesort', 'natsort', - 'reset', 'end', 'next', 'prev', 'array_pop', 'array_shift', - 'array_push', 'array_unshift', 'socket_select', 'array_splice', - ], - true - )) { - $by_ref_type = null; - $by_ref_out_type = null; - - $check_null_ref = true; - - if ($last_param) { - if ($argument_offset < count($function_params)) { - $function_param = $function_params[$argument_offset]; - } else { - $function_param = $last_param; - } - - if ($function_param->type) { - $by_ref_type = clone $function_param->type; - } - if ($function_param->out_type) { - $by_ref_out_type = clone $function_param->out_type; - } - - if ($by_ref_type && $by_ref_type->isNullable()) { - $check_null_ref = false; - } - - if ($template_result && $by_ref_type) { - $original_by_ref_type = clone $by_ref_type; - - $by_ref_type = TemplateStandinTypeReplacer::replace( - clone $by_ref_type, - $template_result, - $codebase, - $statements_analyzer, - $statements_analyzer->node_data->getType($arg->value), - $argument_offset, - $context->self, - $context->calling_method_id ?: $context->calling_function_id - ); - - if ($template_result->lower_bounds) { - TemplateInferredTypeReplacer::replace( - $original_by_ref_type, - $template_result, - $codebase - ); - - $by_ref_type = $original_by_ref_type; - } - } - - if ($template_result && $by_ref_out_type) { - $original_by_ref_out_type = clone $by_ref_out_type; - - $by_ref_out_type = TemplateStandinTypeReplacer::replace( - clone $by_ref_out_type, - $template_result, - $codebase, - $statements_analyzer, - $statements_analyzer->node_data->getType($arg->value), - $argument_offset, - $context->self, - $context->calling_method_id ?: $context->calling_function_id - ); - - if ($template_result->lower_bounds) { - TemplateInferredTypeReplacer::replace( - $original_by_ref_out_type, - $template_result, - $codebase - ); - - $by_ref_out_type = $original_by_ref_out_type; - } - } - - if ($by_ref_type && $function_param->is_variadic && $arg->unpack) { - $by_ref_type = new Union([ - new TArray([ - Type::getInt(), - $by_ref_type, - ]), - ]); - } - } - - $by_ref_type = $by_ref_type ?: Type::getMixed(); - - AssignmentAnalyzer::assignByRefParam( - $statements_analyzer, - $arg->value, - $by_ref_type, - $by_ref_out_type ?: $by_ref_type, - $context, - $method_id && (strpos($method_id, '::') !== false || !InternalCallMapHandler::inCallMap($method_id)), - $check_null_ref - ); - } - - return null; - } - - /** - * @return false|null - */ - private static function evaluateArbitraryParam( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Arg $arg, - Context $context - ): ?bool { - // there are a bunch of things we want to evaluate even when we don't - // know what function/method is being called - if ($arg->value instanceof PhpParser\Node\Expr\Closure - || $arg->value instanceof PhpParser\Node\Expr\ConstFetch - || $arg->value instanceof PhpParser\Node\Expr\ClassConstFetch - || $arg->value instanceof PhpParser\Node\Expr\FuncCall - || $arg->value instanceof PhpParser\Node\Expr\MethodCall - || $arg->value instanceof PhpParser\Node\Expr\StaticCall - || $arg->value instanceof PhpParser\Node\Expr\New_ - || $arg->value instanceof PhpParser\Node\Expr\Cast - || $arg->value instanceof PhpParser\Node\Expr\Assign - || $arg->value instanceof PhpParser\Node\Expr\ArrayDimFetch - || $arg->value instanceof PhpParser\Node\Expr\PropertyFetch - || $arg->value instanceof PhpParser\Node\Expr\Array_ - || $arg->value instanceof PhpParser\Node\Expr\BinaryOp - || $arg->value instanceof PhpParser\Node\Expr\Ternary - || $arg->value instanceof PhpParser\Node\Scalar\Encapsed - || $arg->value instanceof PhpParser\Node\Expr\PostInc - || $arg->value instanceof PhpParser\Node\Expr\PostDec - || $arg->value instanceof PhpParser\Node\Expr\PreInc - || $arg->value instanceof PhpParser\Node\Expr\PreDec - ) { - $was_inside_call = $context->inside_call; - $context->inside_call = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $arg->value, $context) === false) { - $context->inside_call = $was_inside_call; - - return false; - } - - $context->inside_call = $was_inside_call; - } - - if ($arg->value instanceof PhpParser\Node\Expr\PropertyFetch - && $arg->value->name instanceof PhpParser\Node\Identifier - ) { - $var_id = '$' . $arg->value->name->name; - } else { - $var_id = ExpressionIdentifier::getVarId( - $arg->value, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - } - - if ($var_id) { - if ($arg->value instanceof PhpParser\Node\Expr\Variable) { - $statements_analyzer->registerPossiblyUndefinedVariable($var_id, $arg->value); - } - - if (!$context->hasVariable($var_id) - || $context->vars_in_scope[$var_id]->isNull() - ) { - if (!isset($context->vars_in_scope[$var_id]) - && $arg->value instanceof PhpParser\Node\Expr\Variable - ) { - IssueBuffer::maybeAdd( - new PossiblyUndefinedVariable( - 'Variable ' . $var_id - . ' must be defined prior to use within an unknown function or method', - new CodeLocation($statements_analyzer->getSource(), $arg->value) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - // we don't know if it exists, assume it's passed by reference - $context->vars_in_scope[$var_id] = Type::getMixed(); - $context->vars_possibly_in_scope[$var_id] = true; - } else { - $was_inside_call = $context->inside_call; - $context->inside_call = true; - ExpressionAnalyzer::analyze($statements_analyzer, $arg->value, $context); - $context->inside_call = $was_inside_call; - - $context->removeVarFromConflictingClauses( - $var_id, - $context->vars_in_scope[$var_id], - $statements_analyzer - ); - - foreach ($context->vars_in_scope[$var_id]->getAtomicTypes() as $type) { - if ($type instanceof TArray && $type->type_params[1]->isEmpty()) { - $context->vars_in_scope[$var_id]->removeType('array'); - $context->vars_in_scope[$var_id]->addType( - new TArray( - [Type::getArrayKey(), Type::getMixed()] - ) - ); - } - } - } - } - - return null; - } - - /** - * @return false|null - */ - private static function handleByRefFunctionArg( - StatementsAnalyzer $statements_analyzer, - ?string $method_id, - int $argument_offset, - PhpParser\Node\Arg $arg, - Context $context - ): ?bool { - $var_id = ExpressionIdentifier::getVarId( - $arg->value, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $builtin_array_functions = [ - 'ksort', 'asort', 'krsort', 'arsort', 'natcasesort', 'natsort', - 'reset', 'end', 'next', 'prev', 'array_pop', 'array_shift', - ]; - - if (($var_id && isset($context->vars_in_scope[$var_id])) - || ($method_id - && in_array( - $method_id, - $builtin_array_functions, - true - )) - ) { - $was_inside_assignment = $context->inside_assignment; - $context->inside_assignment = true; - - // if the variable is in scope, get or we're in a special array function, - // figure out its type before proceeding - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $arg->value, - $context - ) === false) { - $context->inside_assignment = $was_inside_assignment; - - return false; - } - - $context->inside_assignment = $was_inside_assignment; - } - - // special handling for array sort - if ($argument_offset === 0 - && $method_id - && in_array( - $method_id, - $builtin_array_functions, - true - ) - ) { - if (in_array($method_id, ['array_pop', 'array_shift'], true)) { - ArrayFunctionArgumentsAnalyzer::handleByRefArrayAdjustment( - $statements_analyzer, - $arg, - $context, - $method_id === 'array_shift' - ); - - return null; - } - - // noops - if (in_array($method_id, ['reset', 'end', 'next', 'prev', 'ksort'], true)) { - return null; - } - - if (($arg_value_type = $statements_analyzer->node_data->getType($arg->value)) - && $arg_value_type->hasArray() - ) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TList|TKeyedArray - */ - $array_type = $arg_value_type->getAtomicTypes()['array']; - - if ($array_type instanceof TKeyedArray) { - $array_type = $array_type->getGenericArrayType(); - } - - if ($array_type instanceof TList) { - $array_type = new TArray([Type::getInt(), $array_type->type_param]); - } - - $by_ref_type = new Union([clone $array_type]); - - AssignmentAnalyzer::assignByRefParam( - $statements_analyzer, - $arg->value, - $by_ref_type, - $by_ref_type, - $context, - false - ); - - return null; - } - } - - if ($method_id === 'socket_select') { - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $arg->value, - $context - ) === false) { - return false; - } - } - - if (!$arg->value instanceof PhpParser\Node\Expr\Variable) { - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('EmptyArrayAccess', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['EmptyArrayAccess']); - } - - if (ExpressionAnalyzer::analyze($statements_analyzer, $arg->value, $context) === false) { - return false; - } - - if (!in_array('EmptyArrayAccess', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['EmptyArrayAccess']); - } - } - - return null; - } - - /** - * @param list $args - * @param array $function_params - * @param array> $class_generic_params - */ - private static function getProvisionalTemplateResultForFunctionLike( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - Context $context, - ?ClassLikeStorage $class_storage, - ?string $self_fq_class_name, - ?ClassLikeStorage $calling_class_storage, - FunctionLikeStorage $function_storage, - array $class_generic_params, - ?TemplateResult $class_template_result, - array $args, - array $function_params, - ?FunctionLikeParameter $last_param - ): ?TemplateResult { - $template_types = CallAnalyzer::getTemplateTypesForCall( - $codebase, - $class_storage, - $self_fq_class_name, - $calling_class_storage, - $function_storage->template_types ?: [], - $class_generic_params - ); - - if (!$template_types) { - return null; - } - - if (!$class_template_result) { - return new TemplateResult($template_types, []); - } - - $template_result = $class_template_result; - - if (!$template_result->template_types) { - $template_result->template_types = $template_types; - } - - foreach ($args as $argument_offset => $arg) { - $function_param = null; - - if ($arg->name && $function_storage->allow_named_arg_calls) { - foreach ($function_params as $candidate_param) { - if ($candidate_param->name === $arg->name->name) { - $function_param = $candidate_param; - break; - } - } - } elseif ($argument_offset < count($function_params)) { - $function_param = $function_params[$argument_offset]; - } elseif ($last_param && $last_param->is_variadic) { - $function_param = $last_param; - } - - if (!$function_param - || !$function_param->type - ) { - continue; - } - - $arg_value_type = $statements_analyzer->node_data->getType($arg->value); - - if (!$arg_value_type) { - continue; - } - - $fleshed_out_param_type = TypeExpander::expandUnion( - $codebase, - $function_param->type, - $class_storage->name ?? null, - $calling_class_storage->name ?? null, - null, - true, - false, - $calling_class_storage->final ?? false - ); - - TemplateStandinTypeReplacer::replace( - $fleshed_out_param_type, - $template_result, - $codebase, - $statements_analyzer, - $arg_value_type, - $argument_offset, - $context->self, - $context->calling_method_id ?: $context->calling_function_id, - false - ); - } - - return $template_result; - } - - /** - * @param array $args - * @param string|MethodIdentifier|null $method_id - * @param array $function_params - */ - private static function checkArgCount( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - ?FunctionLikeStorage $function_storage, - Context $context, - ?TemplateResult $template_result, - bool $is_variadic, - array $args, - array $function_params, - bool $in_call_map, - $method_id, - ?string $cased_method_id, - CodeLocation $code_location - ): void { - if (!$is_variadic - && count($args) > count($function_params) - && (!count($function_params) || $function_params[count($function_params) - 1]->name !== '...=') - && ($in_call_map - || !$function_storage instanceof MethodStorage - || $function_storage->is_static - || ($method_id instanceof MethodIdentifier - && $method_id->method_name === '__construct')) - ) { - IssueBuffer::maybeAdd( - new TooManyArguments( - 'Too many arguments for ' . ($cased_method_id ?: $method_id) - . ' - expecting ' . count($function_params) . ' but saw ' . count($args), - $code_location, - (string)$method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - if (count($args) < count($function_params)) { - //we're gonna loop over given args and unset them from the function_params. - // If some mandatory params are left at the end, we'll throw an error - foreach ($args as $arg) { - // when the argument is not named, we can remove the params in order - if ($arg->name === null) { - // if we're unpacking, we try to unset the exact number of params, if we can't we give up and return - if ($arg->unpack) { - $arg_value_type = $statements_analyzer->node_data->getType($arg->value); - - if (!$arg_value_type || !$arg_value_type->hasArray()) { - return; - } - - if ($arg_value_type->isSingle() - && ($atomic_arg_type = $arg_value_type->getSingleAtomic()) - && $atomic_arg_type instanceof TKeyedArray - && !$atomic_arg_type->is_list - ) { - //if we have a single shape, we'll check param names - foreach ($atomic_arg_type->properties as $property_name => $_property_type) { - foreach ($function_params as $k => $param) { - if ($param->name === $property_name) { - unset($function_params[$k]); - } - } - } - continue; - } - - foreach ($arg_value_type->getAtomicTypes() as $atomic_arg_type) { - $packed_var_definite_args_tmp = []; - if ($atomic_arg_type instanceof TCallableArray || - $atomic_arg_type instanceof TCallableList || - $atomic_arg_type instanceof TCallableKeyedArray - ) { - $packed_var_definite_args_tmp[] = 2; - } elseif ($atomic_arg_type instanceof TKeyedArray) { - if (!$atomic_arg_type->sealed) { - return; - } - - foreach ($atomic_arg_type->properties as $property_type) { - if ($property_type->possibly_undefined) { - return; - } - } - //we did not return. The number of packed params is the number of properties - $packed_var_definite_args_tmp[] = count($atomic_arg_type->properties); - } elseif ($atomic_arg_type instanceof TNonEmptyArray || - $atomic_arg_type instanceof TNonEmptyList - ) { - if ($atomic_arg_type->count === null) { - return; - } - - $packed_var_definite_args_tmp[] = $atomic_arg_type->count; - } elseif ($atomic_arg_type instanceof TArray - && $atomic_arg_type->type_params[1]->isEmpty() - ) { - $packed_var_definite_args_tmp[] = 0; - } else { - return; - } - - - if (min($packed_var_definite_args_tmp) === max($packed_var_definite_args_tmp)) { - //we have a stable number of params - $packed_var_definite_args = $packed_var_definite_args_tmp[0]; - } else { - return; - } - } - } else { - //if we're not unpacking, we remove the first param - $packed_var_definite_args = 1; - } - - $function_params = array_slice($function_params, $packed_var_definite_args); - continue; - } - - foreach ($function_params as $k => $param) { - if ($param->name === $arg->name->name) { - unset($function_params[$k]); - continue; - } - } - } - - //we're now left with an array of params that were not passed. - // If they're mandatory, throw an error. Otherwise, we compute the default value - foreach ($function_params as $i => $param) { - if (!$param->is_optional && !$param->is_variadic) { - IssueBuffer::maybeAdd( - new TooFewArguments( - 'Too few arguments for ' . $cased_method_id - . ' - expecting ' . $param->name . ' to be passed', - $code_location, - (string)$method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - continue; - } - - if ($param->type - && $param->default_type - && !$param->is_variadic - && $template_result - ) { - if ($param->default_type instanceof Union) { - $default_type = clone $param->default_type; - } else { - $default_type_atomic = ConstantTypeResolver::resolve( - $codebase->classlikes, - $param->default_type, - $statements_analyzer - ); - - $default_type = new Union([$default_type_atomic]); - } - - TemplateStandinTypeReplacer::replace( - $param->type, - $template_result, - $codebase, - $statements_analyzer, - $default_type, - $i, - $context->self, - $context->calling_method_id ?: $context->calling_function_id, - true - ); - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php deleted file mode 100644 index 654e9bd8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php +++ /dev/null @@ -1,957 +0,0 @@ - $args - */ - public static function checkArgumentsMatch( - StatementsAnalyzer $statements_analyzer, - Context $context, - array $args, - string $method_id, - bool $check_functions - ): void { - $closure_index = $method_id === 'array_map' ? 0 : 1; - - $array_arg_types = []; - - foreach ($args as $i => $arg) { - if ($i === 0 && $method_id === 'array_map') { - continue; - } - - if ($i === 1 && $method_id === 'array_filter') { - break; - } - - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TKeyedArray|TArray|TList|null - */ - $array_arg_type = ($arg_value_type = $statements_analyzer->node_data->getType($arg->value)) - && ($types = $arg_value_type->getAtomicTypes()) - && isset($types['array']) - ? $types['array'] - : null; - - if ($array_arg_type instanceof TKeyedArray) { - $array_arg_type = $array_arg_type->getGenericArrayType(); - } - - if ($array_arg_type instanceof TList) { - $array_arg_type = new TArray([Type::getInt(), $array_arg_type->type_param]); - } - - $array_arg_types[] = $array_arg_type; - } - - $closure_arg = $args[$closure_index] ?? null; - - $closure_arg_type = null; - - if ($closure_arg) { - $closure_arg_type = $statements_analyzer->node_data->getType($closure_arg->value); - } - - if ($closure_arg && $closure_arg_type) { - $min_closure_param_count = $max_closure_param_count = count($array_arg_types); - - if ($method_id === 'array_filter') { - $max_closure_param_count = count($args) > 2 ? 2 : 1; - } - - foreach ($closure_arg_type->getAtomicTypes() as $closure_type) { - self::checkClosureType( - $statements_analyzer, - $context, - $method_id, - $closure_type, - $closure_arg, - $min_closure_param_count, - $max_closure_param_count, - $array_arg_types, - $check_functions - ); - } - } - } - - /** - * @param list $args - * - * @return false|null - */ - public static function handleAddition( - StatementsAnalyzer $statements_analyzer, - array $args, - Context $context, - string $method_id - ): ?bool { - $array_arg = $args[0]->value; - $nb_args = count($args); - - $unpacked_args = array_filter( - $args, - function ($arg) { - return $arg->unpack; - } - ); - - if ($method_id === 'array_push' && !$unpacked_args) { - for ($i = 1; $i < $nb_args; $i++) { - $was_inside_assignment = $context->inside_assignment; - - $context->inside_assignment = true; - - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $args[$i]->value, - $context - ) === false) { - $context->inside_assignment = $was_inside_assignment; - - return false; - } - - $context->inside_assignment = $was_inside_assignment; - - $old_node_data = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - ArrayAssignmentAnalyzer::analyze( - $statements_analyzer, - new VirtualArrayDimFetch( - $args[0]->value, - null, - $args[$i]->value->getAttributes() - ), - $context, - $args[$i]->value, - $statements_analyzer->node_data->getType($args[$i]->value) ?? Type::getMixed() - ); - - $statements_analyzer->node_data = $old_node_data; - } - - return null; - } - - $context->inside_call = true; - - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $array_arg, - $context - ) === false) { - return false; - } - - for ($i = 1; $i < $nb_args; $i++) { - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $args[$i]->value, - $context - ) === false) { - return false; - } - } - - if (($array_arg_type = $statements_analyzer->node_data->getType($array_arg)) - && $array_arg_type->hasArray() - ) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TKeyedArray|TList - */ - $array_type = $array_arg_type->getAtomicTypes()['array']; - - $objectlike_list = null; - - if ($array_type instanceof TKeyedArray) { - if ($array_type->is_list) { - $objectlike_list = clone $array_type; - } - - $array_type = $array_type->getGenericArrayType(); - - if ($objectlike_list) { - if ($array_type instanceof TNonEmptyArray) { - $array_type = new TNonEmptyList($array_type->type_params[1]); - } else { - $array_type = new TList($array_type->type_params[1]); - } - } - } - - $by_ref_type = new Union([clone $array_type]); - - foreach ($args as $argument_offset => $arg) { - if ($argument_offset === 0) { - continue; - } - - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $arg->value, - $context - ) === false) { - return false; - } - - if ($method_id === 'array_unshift' && $nb_args === 2 && !$unpacked_args) { - $new_offset_type = Type::getInt(false, 0); - } else { - $new_offset_type = Type::getInt(); - } - - if (!($arg_value_type = $statements_analyzer->node_data->getType($arg->value)) - || $arg_value_type->hasMixed() - ) { - $by_ref_type = Type::combineUnionTypes( - $by_ref_type, - new Union([new TArray([$new_offset_type, Type::getMixed()])]) - ); - } elseif ($arg->unpack) { - $arg_value_type = clone $arg_value_type; - - foreach ($arg_value_type->getAtomicTypes() as $arg_value_atomic_type) { - if ($arg_value_atomic_type instanceof TKeyedArray) { - $was_list = $arg_value_atomic_type->is_list; - - $arg_value_atomic_type = $arg_value_atomic_type->getGenericArrayType(); - - if ($was_list) { - if ($arg_value_atomic_type instanceof TNonEmptyArray) { - $arg_value_atomic_type = new TNonEmptyList($arg_value_atomic_type->type_params[1]); - } else { - $arg_value_atomic_type = new TList($arg_value_atomic_type->type_params[1]); - } - } - - $arg_value_type->addType($arg_value_atomic_type); - } - } - - $by_ref_type = Type::combineUnionTypes( - $by_ref_type, - $arg_value_type - ); - } else { - if ($objectlike_list) { - array_unshift($objectlike_list->properties, $arg_value_type); - - $by_ref_type = new Union([$objectlike_list]); - } elseif ($array_type instanceof TList) { - $by_ref_type = Type::combineUnionTypes( - $by_ref_type, - new Union( - [ - new TNonEmptyList(clone $arg_value_type), - ] - ) - ); - } else { - $by_ref_type = Type::combineUnionTypes( - $by_ref_type, - new Union( - [ - new TNonEmptyArray( - [ - $new_offset_type, - clone $arg_value_type - ] - ), - ] - ), - null, - true - ); - } - } - } - - AssignmentAnalyzer::assignByRefParam( - $statements_analyzer, - $array_arg, - $by_ref_type, - $by_ref_type, - $context, - false - ); - } - - $context->inside_call = false; - - return null; - } - - /** - * @param list $args - * - * @return false|null - */ - public static function handleSplice( - StatementsAnalyzer $statements_analyzer, - array $args, - Context $context - ): ?bool { - $context->inside_call = true; - $array_arg = $args[0]->value; - - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $array_arg, - $context - ) === false) { - return false; - } - - $offset_arg = $args[1]->value; - - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $offset_arg, - $context - ) === false) { - return false; - } - - if (!isset($args[2])) { - return null; - } - - $length_arg = $args[2]->value; - - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $length_arg, - $context - ) === false) { - return false; - } - - if (!isset($args[3])) { - return null; - } - - $replacement_arg = $args[3]->value; - - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $replacement_arg, - $context - ) === false) { - return false; - } - - $context->inside_call = false; - - $replacement_arg_type = $statements_analyzer->node_data->getType($replacement_arg); - - if ($replacement_arg_type - && !$replacement_arg_type->hasArray() - && $replacement_arg_type->hasString() - && $replacement_arg_type->isSingle() - ) { - $replacement_arg_type = new Union([ - new TArray([Type::getInt(), $replacement_arg_type]) - ]); - - $statements_analyzer->node_data->setType($replacement_arg, $replacement_arg_type); - } - - if (($array_arg_type = $statements_analyzer->node_data->getType($array_arg)) - && $array_arg_type->hasArray() - && $replacement_arg_type - && $replacement_arg_type->hasArray() - ) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TKeyedArray|TList - */ - $array_type = $array_arg_type->getAtomicTypes()['array']; - - if ($array_type instanceof TKeyedArray) { - if ($array_type->is_list) { - $array_type = new TNonEmptyList($array_type->getGenericValueType()); - } else { - $array_type = $array_type->getGenericArrayType(); - } - } - - if ($array_type instanceof TArray - && $array_type->type_params[0]->hasInt() - && !$array_type->type_params[0]->hasString() - ) { - if ($array_type instanceof TNonEmptyArray) { - $array_type = new TNonEmptyList($array_type->type_params[1]); - } else { - $array_type = new TList($array_type->type_params[1]); - } - } - - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TKeyedArray|TList - */ - $replacement_array_type = $replacement_arg_type->getAtomicTypes()['array']; - - if ($replacement_array_type instanceof TKeyedArray) { - $was_list = $replacement_array_type->is_list; - - $replacement_array_type = $replacement_array_type->getGenericArrayType(); - - if ($was_list) { - if ($replacement_array_type instanceof TNonEmptyArray) { - $replacement_array_type = new TNonEmptyList($replacement_array_type->type_params[1]); - } else { - $replacement_array_type = new TList($replacement_array_type->type_params[1]); - } - } - } - - $by_ref_type = TypeCombiner::combine([$array_type, $replacement_array_type]); - - AssignmentAnalyzer::assignByRefParam( - $statements_analyzer, - $array_arg, - $by_ref_type, - $by_ref_type, - $context, - false - ); - - return null; - } - - $array_type = Type::getArray(); - - AssignmentAnalyzer::assignByRefParam( - $statements_analyzer, - $array_arg, - $array_type, - $array_type, - $context, - false - ); - - return null; - } - - public static function handleByRefArrayAdjustment( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Arg $arg, - Context $context, - bool $is_array_shift - ): void { - $var_id = ExpressionIdentifier::getVarId( - $arg->value, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($var_id) { - $context->removeVarFromConflictingClauses($var_id, null, $statements_analyzer); - - if (isset($context->vars_in_scope[$var_id])) { - $array_type = clone $context->vars_in_scope[$var_id]; - - $array_atomic_types = $array_type->getAtomicTypes(); - - foreach ($array_atomic_types as $array_atomic_type) { - if ($array_atomic_type instanceof TKeyedArray) { - if ($is_array_shift && $array_atomic_type->is_list) { - $array_atomic_type = clone $array_atomic_type; - - $array_properties = $array_atomic_type->properties; - - array_shift($array_properties); - - if (!$array_properties) { - $array_atomic_type = new TList( - $array_atomic_type->previous_value_type ?: Type::getMixed() - ); - - $array_type->addType($array_atomic_type); - } else { - $array_atomic_type->properties = $array_properties; - } - } - - if ($array_atomic_type instanceof TKeyedArray) { - $array_atomic_type = $array_atomic_type->getGenericArrayType(); - } - } - - if ($array_atomic_type instanceof TNonEmptyArray) { - if (!$context->inside_loop && $array_atomic_type->count !== null) { - if ($array_atomic_type->count === 0) { - $array_atomic_type = new TArray( - [ - new Union([new TEmpty]), - new Union([new TEmpty]), - ] - ); - } else { - $array_atomic_type->count--; - } - } else { - $array_atomic_type = new TArray($array_atomic_type->type_params); - } - - $array_type->addType($array_atomic_type); - } elseif ($array_atomic_type instanceof TNonEmptyList) { - if (!$context->inside_loop && $array_atomic_type->count !== null) { - if ($array_atomic_type->count === 0) { - $array_atomic_type = new TArray( - [ - new Union([new TEmpty]), - new Union([new TEmpty]), - ] - ); - } else { - $array_atomic_type->count--; - } - } else { - $array_atomic_type = new TList($array_atomic_type->type_param); - } - - $array_type->addType($array_atomic_type); - } - } - - $context->removeDescendents($var_id, $array_type); - $context->vars_in_scope[$var_id] = $array_type; - } - } - } - - /** - * @param (TArray|null)[] $array_arg_types - * - */ - private static function checkClosureType( - StatementsAnalyzer $statements_analyzer, - Context $context, - string $method_id, - Atomic $closure_type, - PhpParser\Node\Arg $closure_arg, - int $min_closure_param_count, - int $max_closure_param_count, - array $array_arg_types, - bool $check_functions - ): void { - $codebase = $statements_analyzer->getCodebase(); - - if (!$closure_type instanceof TClosure) { - if ($method_id === 'array_map') { - return; - } - - if (!$closure_arg->value instanceof PhpParser\Node\Scalar\String_ - && !$closure_arg->value instanceof PhpParser\Node\Expr\Array_ - && !$closure_arg->value instanceof PhpParser\Node\Expr\BinaryOp\Concat - ) { - return; - } - - $function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( - $statements_analyzer, - $closure_arg->value - ); - - $closure_types = []; - - foreach ($function_ids as $function_id) { - $function_id = strtolower($function_id); - - if (strpos($function_id, '::') !== false) { - if ($function_id[0] === '$') { - $function_id = substr($function_id, 1); - } - - $function_id_parts = explode('&', $function_id); - - foreach ($function_id_parts as $function_id_part) { - [$callable_fq_class_name, $method_name] = explode('::', $function_id_part); - - switch ($callable_fq_class_name) { - case 'self': - case 'static': - case 'parent': - $container_class = $statements_analyzer->getFQCLN(); - - if ($callable_fq_class_name === 'parent') { - $container_class = $statements_analyzer->getParentFQCLN(); - } - - if (!$container_class) { - continue 2; - } - - $callable_fq_class_name = $container_class; - } - - if (!$codebase->classOrInterfaceExists($callable_fq_class_name)) { - return; - } - - $function_id_part = new MethodIdentifier( - $callable_fq_class_name, - strtolower($method_name) - ); - - try { - $method_storage = $codebase->methods->getStorage($function_id_part); - } catch (UnexpectedValueException $e) { - // the method may not exist, but we're suppressing that issue - continue; - } - - $closure_types[] = new TClosure( - 'Closure', - $method_storage->params, - $method_storage->return_type ?: Type::getMixed() - ); - } - } else { - if (!$check_functions) { - continue; - } - - if (!$codebase->functions->functionExists($statements_analyzer, $function_id)) { - continue; - } - - $function_storage = $codebase->functions->getStorage( - $statements_analyzer, - $function_id - ); - - if (InternalCallMapHandler::inCallMap($function_id)) { - $callmap_callables = InternalCallMapHandler::getCallablesFromCallMap($function_id); - - if ($callmap_callables === null) { - throw new UnexpectedValueException('This should not happen'); - } - - $passing_callmap_callables = []; - - foreach ($callmap_callables as $callmap_callable) { - $required_param_count = 0; - - assert($callmap_callable->params !== null); - - foreach ($callmap_callable->params as $i => $param) { - if (!$param->is_optional && !$param->is_variadic) { - $required_param_count = $i + 1; - } - } - - if ($required_param_count <= $max_closure_param_count) { - $passing_callmap_callables[] = $callmap_callable; - } - } - - if ($passing_callmap_callables) { - foreach ($passing_callmap_callables as $passing_callmap_callable) { - $closure_types[] = $passing_callmap_callable; - } - } else { - $closure_types[] = $callmap_callables[0]; - } - } else { - $closure_types[] = new TClosure( - 'Closure', - $function_storage->params, - $function_storage->return_type ?: Type::getMixed() - ); - } - } - } - } else { - $closure_types = [$closure_type]; - } - - foreach ($closure_types as $closure_type) { - if ($closure_type->params === null) { - continue; - } - - self::checkClosureTypeArgs( - $statements_analyzer, - $context, - $method_id, - $closure_type, - $closure_arg, - $min_closure_param_count, - $max_closure_param_count, - $array_arg_types - ); - } - } - - /** - * @param TClosure|TCallable $closure_type - * @param (TArray|null)[] $array_arg_types - */ - private static function checkClosureTypeArgs( - StatementsAnalyzer $statements_analyzer, - Context $context, - string $method_id, - Atomic $closure_type, - PhpParser\Node\Arg $closure_arg, - int $min_closure_param_count, - int $max_closure_param_count, - array $array_arg_types - ): void { - $codebase = $statements_analyzer->getCodebase(); - - $closure_params = $closure_type->params; - - if ($closure_params === null) { - throw new UnexpectedValueException('Closure params should not be null here'); - } - - $required_param_count = 0; - - foreach ($closure_params as $i => $param) { - if (!$param->is_optional && !$param->is_variadic) { - $required_param_count = $i + 1; - } - } - - if (count($closure_params) < $min_closure_param_count) { - $argument_text = $min_closure_param_count === 1 ? 'one argument' : $min_closure_param_count . ' arguments'; - - IssueBuffer::maybeAdd( - new TooManyArguments( - 'The callable passed to ' . $method_id . ' will be called with ' . $argument_text . ', expecting ' - . $required_param_count, - new CodeLocation($statements_analyzer->getSource(), $closure_arg), - $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - if ($required_param_count > $max_closure_param_count) { - $argument_text = $max_closure_param_count === 1 ? 'one argument' : $max_closure_param_count . ' arguments'; - - IssueBuffer::maybeAdd( - new TooFewArguments( - 'The callable passed to ' . $method_id . ' will be called with ' . $argument_text . ', expecting ' - . $required_param_count, - new CodeLocation($statements_analyzer->getSource(), $closure_arg), - $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - // abandon attempt to validate closure params if we have an extra arg for ARRAY_FILTER - if ($method_id === 'array_filter' && $max_closure_param_count > 1) { - return; - } - - foreach ($closure_params as $i => $closure_param) { - if (!isset($array_arg_types[$i])) { - continue; - } - - $array_arg_type = $array_arg_types[$i]; - - $input_type = $array_arg_type->type_params[1]; - - if ($input_type->hasMixed()) { - continue; - } - - $closure_param_type = $closure_param->type; - - if (!$closure_param_type) { - continue; - } - - if ($method_id === 'array_map' - && $i === 0 - && $closure_type->return_type - && $closure_param_type->hasTemplate() - ) { - $closure_param_type = clone $closure_param_type; - $closure_type->return_type = clone $closure_type->return_type; - - $template_result = new TemplateResult( - [], - [] - ); - - foreach ($closure_param_type->getTemplateTypes() as $template_type) { - $template_result->template_types[$template_type->param_name] = [ - ($template_type->defining_class) => $template_type->as - ]; - } - - $closure_param_type = TemplateStandinTypeReplacer::replace( - $closure_param_type, - $template_result, - $codebase, - $statements_analyzer, - $input_type, - $i, - $context->self, - $context->calling_method_id ?: $context->calling_function_id - ); - - $closure_type->replaceTemplateTypesWithArgTypes( - $template_result, - $codebase - ); - } - - $closure_param_type = TypeExpander::expandUnion( - $codebase, - $closure_param_type, - $context->self, - null, - $statements_analyzer->getParentFQCLN() - ); - - $union_comparison_results = new TypeComparisonResult(); - - $type_match_found = UnionTypeComparator::isContainedBy( - $codebase, - $input_type, - $closure_param_type, - $input_type->ignore_nullable_issues, - $input_type->ignore_falsable_issues, - $union_comparison_results - ); - - if ($union_comparison_results->type_coerced) { - if ($union_comparison_results->type_coerced_from_mixed) { - IssueBuffer::maybeAdd( - new MixedArgumentTypeCoercion( - 'Parameter ' . ($i + 1) . ' of closure passed to function ' . $method_id . ' expects ' . - $closure_param_type->getId() . ', parent type ' . $input_type->getId() . ' provided', - new CodeLocation($statements_analyzer->getSource(), $closure_arg), - $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new ArgumentTypeCoercion( - 'Parameter ' . ($i + 1) . ' of closure passed to function ' . $method_id . ' expects ' . - $closure_param_type->getId() . ', parent type ' . $input_type->getId() . ' provided', - new CodeLocation($statements_analyzer->getSource(), $closure_arg), - $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if (!$union_comparison_results->type_coerced && !$type_match_found) { - $types_can_be_identical = UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $input_type, - $closure_param_type - ); - - if ($union_comparison_results->scalar_type_match_found) { - IssueBuffer::maybeAdd( - new InvalidScalarArgument( - 'Parameter ' . ($i + 1) . ' of closure passed to function ' . $method_id . ' expects ' . - $closure_param_type->getId() . ', ' . $input_type->getId() . ' provided', - new CodeLocation($statements_analyzer->getSource(), $closure_arg), - $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($types_can_be_identical) { - IssueBuffer::maybeAdd( - new PossiblyInvalidArgument( - 'Parameter ' . ($i + 1) . ' of closure passed to function ' . $method_id . ' expects ' - . $closure_param_type->getId() . ', possibly different type ' - . $input_type->getId() . ' provided', - new CodeLocation($statements_analyzer->getSource(), $closure_arg), - $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif (IssueBuffer::accepts( - new InvalidArgument( - 'Parameter ' . ($i + 1) . ' of closure passed to function ' . $method_id . ' expects ' . - $closure_param_type->getId() . ', ' . $input_type->getId() . ' provided', - new CodeLocation($statements_analyzer->getSource(), $closure_arg), - $method_id - ), - $statements_analyzer->getSuppressedIssues() - )) { - // fall through - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php deleted file mode 100644 index 1450e9e3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php +++ /dev/null @@ -1,282 +0,0 @@ ->|null - * @psalm-suppress MoreSpecificReturnType - * @psalm-suppress LessSpecificReturnStatement - */ - public static function collect( - Codebase $codebase, - ClassLikeStorage $class_storage, - ClassLikeStorage $static_class_storage, - ?string $method_name = null, - ?Atomic $lhs_type_part = null, - bool $self_call = false - ): ?array { - $static_fq_class_name = $static_class_storage->name; - - $non_trait_class_storage = $class_storage->is_trait - ? $static_class_storage - : $class_storage; - - $template_types = $class_storage->template_types; - - $candidate_class_storages = [$class_storage]; - - if ($static_class_storage->template_extended_params - && $method_name - && !empty($non_trait_class_storage->overridden_method_ids[$method_name]) - && isset($class_storage->methods[$method_name]) - && (!isset($non_trait_class_storage->methods[$method_name]->return_type) - || $class_storage->methods[$method_name]->inherited_return_type) - ) { - foreach ($non_trait_class_storage->overridden_method_ids[$method_name] as $overridden_method_id) { - $overridden_storage = $codebase->methods->getStorage($overridden_method_id); - - if (!$overridden_storage->return_type) { - continue; - } - - if ($overridden_storage->return_type->isNull()) { - continue; - } - - $fq_overridden_class = $overridden_method_id->fq_class_name; - - $overridden_class_storage = $codebase->classlike_storage_provider->get($fq_overridden_class); - - $overridden_template_types = $overridden_class_storage->template_types; - - if (!$template_types) { - $template_types = $overridden_template_types; - } elseif ($overridden_template_types) { - foreach ($overridden_template_types as $template_name => $template_map) { - if (isset($template_types[$template_name])) { - $template_types[$template_name] = array_merge( - $template_types[$template_name], - $template_map - ); - } else { - $template_types[$template_name] = $template_map; - } - } - } - - $candidate_class_storages[] = $overridden_class_storage; - } - } - - if (!$template_types) { - return null; - } - - $class_template_params = []; - $e = $static_class_storage->template_extended_params; - - if ($lhs_type_part instanceof TGenericObject) { - if ($class_storage === $static_class_storage && $class_storage->template_types) { - $i = 0; - - foreach ($class_storage->template_types as $type_name => $_) { - if (isset($lhs_type_part->type_params[$i])) { - $class_template_params[$type_name][$class_storage->name] - = $lhs_type_part->type_params[$i]; - } - - $i++; - } - } - - foreach ($template_types as $type_name => $_) { - if (isset($class_template_params[$type_name])) { - continue; - } - - if ($class_storage !== $static_class_storage - && isset($e[$class_storage->name][$type_name]) - ) { - $input_type_extends = $e[$class_storage->name][$type_name]; - - $output_type_extends = self::resolveTemplateParam( - $input_type_extends, - $static_class_storage, - $lhs_type_part - ); - if (!$self_call || $static_fq_class_name !== $class_storage->name) { - $class_template_params[$type_name][$class_storage->name] - = $output_type_extends ?? Type::getMixed(); - } - } - - if ((!$self_call || $static_fq_class_name !== $class_storage->name) - && !isset($class_template_params[$type_name]) - ) { - $class_template_params[$type_name] = [$class_storage->name => Type::getMixed()]; - } - } - } - - foreach ($template_types as $type_name => $type_map) { - foreach ($type_map as $type) { - foreach ($candidate_class_storages as $candidate_class_storage) { - if ($candidate_class_storage !== $static_class_storage - && isset($e[$candidate_class_storage->name][$type_name]) - && !isset($class_template_params[$type_name][$candidate_class_storage->name]) - ) { - $class_template_params[$type_name][$candidate_class_storage->name] = new Union( - self::expandType( - $codebase, - $e[$candidate_class_storage->name][$type_name], - $e, - $static_class_storage->name, - $static_class_storage->template_types - ) - ); - } - } - - if (!$self_call) { - if (!isset($class_template_params[$type_name])) { - $class_template_params[$type_name][$class_storage->name] = $type; - } - } - } - } - - return $class_template_params; - } - - public static function resolveTemplateParam( - Union $input_type_extends, - ClassLikeStorage $static_class_storage, - TGenericObject $lhs_type_part - ): ?Union { - $output_type_extends = null; - foreach ($input_type_extends->getAtomicTypes() as $type_extends_atomic) { - if ($type_extends_atomic instanceof TTemplateParam) { - if (isset( - $static_class_storage - ->template_types - [$type_extends_atomic->param_name] - [$type_extends_atomic->defining_class] - ) - ) { - $mapped_offset = array_search( - $type_extends_atomic->param_name, - array_keys($static_class_storage->template_types), - true - ); - - if ($mapped_offset !== false - && isset($lhs_type_part->type_params[$mapped_offset]) - ) { - $output_type_extends = Type::combineUnionTypes( - $lhs_type_part->type_params[$mapped_offset], - $output_type_extends - ); - } - } elseif (isset( - $static_class_storage - ->template_extended_params - [$type_extends_atomic->defining_class] - [$type_extends_atomic->param_name] - )) { - $nested_output_type = self::resolveTemplateParam( - $static_class_storage - ->template_extended_params - [$type_extends_atomic->defining_class] - [$type_extends_atomic->param_name], - $static_class_storage, - $lhs_type_part - ); - if ($nested_output_type !== null) { - $output_type_extends = Type::combineUnionTypes( - $nested_output_type, - $output_type_extends - ); - } - } - } else { - $output_type_extends = Type::combineUnionTypes( - new Union([$type_extends_atomic]), - $output_type_extends - ); - } - } - return $output_type_extends; - } - - /** - * @param array> $e - * @return non-empty-list - */ - private static function expandType( - Codebase $codebase, - Union $input_type_extends, - array $e, - string $static_fq_class_name, - ?array $static_template_types - ): array { - $output_type_extends = []; - - foreach ($input_type_extends->getAtomicTypes() as $type_extends_atomic) { - if ($type_extends_atomic instanceof TTemplateParam - && ($static_fq_class_name !== $type_extends_atomic->defining_class - || !isset($static_template_types[$type_extends_atomic->param_name])) - && isset($e[$type_extends_atomic->defining_class][$type_extends_atomic->param_name]) - ) { - $output_type_extends = array_merge( - $output_type_extends, - self::expandType( - $codebase, - $e[$type_extends_atomic->defining_class][$type_extends_atomic->param_name], - $e, - $static_fq_class_name, - $static_template_types - ) - ); - } elseif ($type_extends_atomic instanceof TClassConstant) { - $expanded = TypeExpander::expandAtomic( - $codebase, - $type_extends_atomic, - $type_extends_atomic->fq_classlike_name, - $type_extends_atomic->fq_classlike_name, - null, - true, - true - ); - - if ($expanded instanceof Atomic) { - $output_type_extends[] = $expanded; - } else { - foreach ($expanded as $type) { - $output_type_extends[] = $type; - } - } - } else { - $output_type_extends[] = $type_extends_atomic; - } - } - - return $output_type_extends; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php deleted file mode 100644 index d98cf1fc..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php +++ /dev/null @@ -1,1129 +0,0 @@ -name; - - $codebase = $statements_analyzer->getCodebase(); - - $code_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - $config = $codebase->config; - - $is_first_class_callable = $stmt->isFirstClassCallable(); - - $real_stmt = $stmt; - - if ($function_name instanceof PhpParser\Node\Name - && !$is_first_class_callable - && isset($stmt->getArgs()[0]) - && !$stmt->getArgs()[0]->unpack - ) { - $original_function_id = implode('\\', $function_name->parts); - - if ($original_function_id === 'call_user_func') { - $other_args = array_slice($stmt->getArgs(), 1); - - $function_name = $stmt->getArgs()[0]->value; - - $stmt = new VirtualFuncCall( - $function_name, - $other_args, - $stmt->getAttributes() - ); - } - - if ($original_function_id === 'call_user_func_array' && isset($stmt->getArgs()[1])) { - $function_name = $stmt->getArgs()[0]->value; - - $stmt = new VirtualFuncCall( - $function_name, - [new VirtualArg($stmt->getArgs()[1]->value, false, true)], - $stmt->getAttributes() - ); - } - } - - if ($function_name instanceof PhpParser\Node\Expr) { - $function_call_info = self::getAnalyzeNamedExpression( - $statements_analyzer, - $stmt, - $real_stmt, - $function_name, - $context - ); - - if ($function_call_info->function_exists === false) { - return true; - } - - if ($function_call_info->new_function_name) { - $function_name = $function_call_info->new_function_name; - } - } else { - $function_call_info = self::handleNamedFunction( - $statements_analyzer, - $stmt, - $function_name, - $context, - $code_location - ); - - if (!$function_call_info->function_exists) { - return true; - } - } - - $set_inside_conditional = false; - - if ($function_name instanceof PhpParser\Node\Name - && $function_name->parts === ['assert'] - && !$context->inside_conditional - ) { - $context->inside_conditional = true; - $set_inside_conditional = true; - } - - if (!$is_first_class_callable) { - $template_result = null; - - if (isset($function_call_info->function_storage->template_types)) { - $template_result = new TemplateResult($function_call_info->function_storage->template_types ?: [], []); - } - - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - $function_call_info->function_params, - $function_call_info->function_id, - $function_call_info->allow_named_args, - $context, - $template_result - ); - } - - if ($set_inside_conditional) { - $context->inside_conditional = false; - } - - $function_callable = null; - - if (!$is_first_class_callable - && $function_name instanceof PhpParser\Node\Name - && $function_call_info->function_id - ) { - if (!$function_call_info->is_stubbed && $function_call_info->in_call_map) { - $function_callable = InternalCallMapHandler::getCallableFromCallMapById( - $codebase, - $function_call_info->function_id, - $stmt->getArgs(), - $statements_analyzer->node_data - ); - - $function_call_info->function_params = $function_callable->params; - } - } - - $template_result = new TemplateResult([], []); - - // do this here to allow closure param checks - if (!$is_first_class_callable && $function_call_info->function_params !== null) { - ArgumentsAnalyzer::checkArgumentsMatch( - $statements_analyzer, - $stmt->getArgs(), - $function_call_info->function_id, - $function_call_info->function_params, - $function_call_info->function_storage, - null, - $template_result, - $code_location, - $context - ); - } - - CallAnalyzer::checkTemplateResult( - $statements_analyzer, - $template_result, - $code_location, - $function_call_info->function_id - ); - - if ($function_name instanceof PhpParser\Node\Name && $function_call_info->function_id) { - $stmt_type = FunctionCallReturnTypeFetcher::fetch( - $statements_analyzer, - $codebase, - $stmt, - $function_name, - $function_call_info->function_id, - $function_call_info->in_call_map, - $function_call_info->is_stubbed, - $function_call_info->function_storage, - $function_callable, - $template_result, - $context - ); - - $statements_analyzer->node_data->setType($real_stmt, $stmt_type); - - if ($stmt_type->isNever()) { - $context->has_returned = true; - } - - $event = new AfterEveryFunctionCallAnalysisEvent( - $stmt, - $function_call_info->function_id, - $context, - $statements_analyzer->getSource(), - $codebase - ); - - $config->eventDispatcher->dispatchAfterEveryFunctionCallAnalysis($event); - - if ($is_first_class_callable) { - return true; - } - } - - if ($is_first_class_callable) { - $type_provider = $statements_analyzer->getNodeTypeProvider(); - $closure_types = []; - - if ($input_type = $type_provider->getType($function_name)) { - foreach ($input_type->getAtomicTypes() as $atomic_type) { - $candidate_callable = CallableTypeComparator::getCallableFromAtomic( - $codebase, - $atomic_type, - null, - $statements_analyzer - ); - - if ($candidate_callable) { - $closure_types[] = new TClosure( - 'Closure', - $candidate_callable->params, - $candidate_callable->return_type, - $candidate_callable->is_pure - ); - } - } - } - - if ($closure_types) { - $stmt_type = TypeCombiner::combine($closure_types, $codebase); - } else { - $stmt_type = Type::getClosure(); - } - - $statements_analyzer->node_data->setType($real_stmt, $stmt_type); - - return true; - } - - foreach ($function_call_info->defined_constants as $const_name => $const_type) { - $context->constants[$const_name] = clone $const_type; - $context->vars_in_scope[$const_name] = clone $const_type; - } - - foreach ($function_call_info->global_variables as $var_id => $_) { - $context->vars_in_scope[$var_id] = Type::getMixed(); - $context->vars_possibly_in_scope[$var_id] = true; - } - - if ($function_name instanceof PhpParser\Node\Name - && $function_name->parts === ['assert'] - && isset($stmt->getArgs()[0]) - ) { - self::processAssertFunctionEffects( - $statements_analyzer, - $codebase, - $stmt, - $stmt->getArgs()[0], - $context - ); - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - && ($stmt_type = $statements_analyzer->node_data->getType($real_stmt)) - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt, - $stmt_type->getId() - ); - } - - self::checkFunctionCallPurity( - $statements_analyzer, - $codebase, - $stmt, - $function_name, - $function_call_info, - $context - ); - - if ($function_call_info->function_storage) { - $inferred_lower_bounds = $template_result->lower_bounds; - - if ($function_call_info->function_storage->assertions && $function_name instanceof PhpParser\Node\Name) { - self::applyAssertionsToContext( - $function_name, - null, - $function_call_info->function_storage->assertions, - $stmt->getArgs(), - $inferred_lower_bounds, - $context, - $statements_analyzer - ); - } - - if ($function_call_info->function_storage->if_true_assertions) { - $statements_analyzer->node_data->setIfTrueAssertions( - $stmt, - array_map( - function (Assertion $assertion) use ($inferred_lower_bounds, $codebase): Assertion { - return $assertion->getUntemplatedCopy($inferred_lower_bounds ?: [], null, $codebase); - }, - $function_call_info->function_storage->if_true_assertions - ) - ); - } - - if ($function_call_info->function_storage->if_false_assertions) { - $statements_analyzer->node_data->setIfFalseAssertions( - $stmt, - array_map( - function (Assertion $assertion) use ($inferred_lower_bounds, $codebase): Assertion { - return $assertion->getUntemplatedCopy($inferred_lower_bounds ?: [], null, $codebase); - }, - $function_call_info->function_storage->if_false_assertions - ) - ); - } - - if ($function_call_info->function_storage->deprecated && $function_call_info->function_id) { - IssueBuffer::maybeAdd( - new DeprecatedFunction( - 'The function ' . $function_call_info->function_id . ' has been marked as deprecated', - $code_location, - $function_call_info->function_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($function_call_info->byref_uses) { - foreach ($function_call_info->byref_uses as $byref_use_var => $_) { - $context->vars_in_scope['$' . $byref_use_var] = Type::getMixed(); - $context->vars_possibly_in_scope['$' . $byref_use_var] = true; - } - } - - if ($function_name instanceof PhpParser\Node\Name && $function_call_info->function_id) { - NamedFunctionCallHandler::handle( - $statements_analyzer, - $codebase, - $stmt, - $real_stmt, - $function_name, - strtolower($function_call_info->function_id), - $context - ); - } - - if (!$statements_analyzer->node_data->getType($real_stmt)) { - $statements_analyzer->node_data->setType($real_stmt, Type::getMixed()); - } - - return true; - } - - private static function handleNamedFunction( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\FuncCall $stmt, - PhpParser\Node\Name $function_name, - Context $context, - CodeLocation $code_location - ): FunctionCallInfo { - $function_call_info = new FunctionCallInfo(); - - $codebase = $statements_analyzer->getCodebase(); - $codebase_functions = $codebase->functions; - - $original_function_id = implode('\\', $function_name->parts); - - if (!$function_name instanceof PhpParser\Node\Name\FullyQualified) { - $function_call_info->function_id = $codebase_functions->getFullyQualifiedFunctionNameFromString( - $original_function_id, - $statements_analyzer - ); - } else { - $function_call_info->function_id = $original_function_id; - } - - $namespaced_function_exists = $codebase_functions->functionExists( - $statements_analyzer, - strtolower($function_call_info->function_id) - ); - - if (!$namespaced_function_exists - && !$function_name instanceof PhpParser\Node\Name\FullyQualified - ) { - $function_call_info->in_call_map = InternalCallMapHandler::inCallMap($original_function_id); - $function_call_info->is_stubbed = $codebase_functions->hasStubbedFunction($original_function_id); - - if ($function_call_info->is_stubbed || $function_call_info->in_call_map) { - $function_call_info->function_id = $original_function_id; - } - } else { - $function_call_info->in_call_map = InternalCallMapHandler::inCallMap($function_call_info->function_id); - $function_call_info->is_stubbed = $codebase_functions->hasStubbedFunction($function_call_info->function_id); - } - - $function_call_info->function_exists - = $function_call_info->is_stubbed || $function_call_info->in_call_map || $namespaced_function_exists; - - if ($function_call_info->function_exists - && $codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - ArgumentMapPopulator::recordArgumentPositions( - $statements_analyzer, - $stmt, - $codebase, - $function_call_info->function_id - ); - } - - $is_predefined = true; - - $is_maybe_root_function = !$function_name instanceof PhpParser\Node\Name\FullyQualified - && count($function_name->parts) === 1; - - $args = $stmt->isFirstClassCallable() ? [] : $stmt->getArgs(); - - if (!$function_call_info->in_call_map) { - $predefined_functions = $codebase->config->getPredefinedFunctions(); - $is_predefined = isset($predefined_functions[strtolower($original_function_id)]) - || isset($predefined_functions[strtolower($function_call_info->function_id)]); - - if ($context->check_functions) { - if (self::checkFunctionExists( - $statements_analyzer, - $function_call_info->function_id, - $code_location, - $is_maybe_root_function - ) === false) { - if ($args && ArgumentsAnalyzer::analyze( - $statements_analyzer, - $args, - null, - null, - true, - $context - ) === false) { - // fall through - } - - return $function_call_info; - } - - $function_call_info->function_exists = true; - } - } else { - $function_call_info->function_exists = true; - } - - $function_call_info->function_params = null; - $function_call_info->defined_constants = []; - $function_call_info->global_variables = []; - $args = $stmt->isFirstClassCallable() ? [] : $stmt->getArgs(); - - if ($function_call_info->function_exists) { - if ($codebase->functions->params_provider->has($function_call_info->function_id)) { - $function_call_info->function_params = $codebase->functions->params_provider->getFunctionParams( - $statements_analyzer, - $function_call_info->function_id, - $args, - null, - $code_location - ); - } - - if ($function_call_info->function_params === null) { - if (!$function_call_info->in_call_map || $function_call_info->is_stubbed) { - try { - $function_call_info->function_storage = $function_storage = $codebase_functions->getStorage( - $statements_analyzer, - strtolower($function_call_info->function_id) - ); - - $function_call_info->function_params = $function_call_info->function_storage->params; - - if (!$function_storage->allow_named_arg_calls) { - $function_call_info->allow_named_args = false; - } - - if (!$is_predefined) { - $function_call_info->defined_constants = $function_storage->defined_constants; - $function_call_info->global_variables = $function_storage->global_variables; - } - } catch (UnexpectedValueException $e) { - $function_call_info->function_params = [ - new FunctionLikeParameter('args', false, null, null, null, false, false, true) - ]; - } - } else { - $function_callable = InternalCallMapHandler::getCallableFromCallMapById( - $codebase, - $function_call_info->function_id, - $args, - $statements_analyzer->node_data - ); - - $function_call_info->function_params = $function_callable->params; - } - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $function_name, - $function_call_info->function_id . '()' - ); - } - } - - return $function_call_info; - } - - private static function getAnalyzeNamedExpression( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\FuncCall $stmt, - PhpParser\Node\Expr\FuncCall $real_stmt, - PhpParser\Node\Expr $function_name, - Context $context - ): FunctionCallInfo { - $function_call_info = new FunctionCallInfo(); - - $codebase = $statements_analyzer->getCodebase(); - - $was_in_call = $context->inside_call; - $context->inside_call = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $function_name, $context) === false) { - $context->inside_call = $was_in_call; - - return $function_call_info; - } - - $context->inside_call = $was_in_call; - - $function_call_info->byref_uses = []; - - if ($stmt_name_type = $statements_analyzer->node_data->getType($function_name)) { - if ($stmt_name_type->isNull()) { - IssueBuffer::maybeAdd( - new NullFunctionCall( - 'Cannot call function on null value', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return $function_call_info; - } - - if ($stmt_name_type->isNullable()) { - IssueBuffer::maybeAdd( - new PossiblyNullFunctionCall( - 'Cannot call function on possibly null value', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $invalid_function_call_types = []; - $has_valid_function_call_type = false; - - $var_atomic_types = $stmt_name_type->getAtomicTypes(); - - while ($var_atomic_types) { - $var_type_part = array_shift($var_atomic_types); - - if ($var_type_part instanceof TTemplateParam) { - $var_atomic_types = array_merge($var_atomic_types, $var_type_part->as->getAtomicTypes()); - continue; - } - - if ($var_type_part instanceof TClosure || $var_type_part instanceof TCallable) { - if (!$var_type_part->is_pure) { - if ($context->pure || $context->mutation_free) { - IssueBuffer::maybeAdd( - new ImpureFunctionCall( - 'Cannot call an impure function from a mutation-free context', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (!$function_call_info->function_storage) { - $function_call_info->function_storage = new FunctionStorage(); - } - - $function_call_info->function_storage->pure = false; - $function_call_info->function_storage->mutation_free = false; - } - - $function_call_info->function_params = $var_type_part->params; - - if (($stmt_type = $statements_analyzer->node_data->getType($real_stmt)) - && $var_type_part->return_type - ) { - $statements_analyzer->node_data->setType( - $real_stmt, - Type::combineUnionTypes( - $stmt_type, - $var_type_part->return_type - ) - ); - } else { - $statements_analyzer->node_data->setType( - $real_stmt, - $var_type_part->return_type ?? Type::getMixed() - ); - } - - if ($var_type_part instanceof TClosure) { - $function_call_info->byref_uses += $var_type_part->byref_uses; - } - - $function_call_info->function_exists = true; - $has_valid_function_call_type = true; - } elseif ($var_type_part instanceof TMixed) { - $has_valid_function_call_type = true; - - IssueBuffer::maybeAdd( - new MixedFunctionCall( - 'Cannot call function on ' . $var_type_part->getId(), - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($var_type_part instanceof TCallableObject - || $var_type_part instanceof TCallableString - || ($var_type_part instanceof TNamedObject && $var_type_part->value === 'Closure') - || ($var_type_part instanceof TObjectWithProperties && isset($var_type_part->methods['__invoke'])) - ) { - // this is fine - $has_valid_function_call_type = true; - } elseif ($var_type_part instanceof TString - || $var_type_part instanceof TArray - || $var_type_part instanceof TList - || ($var_type_part instanceof TKeyedArray - && count($var_type_part->properties) === 2) - ) { - $potential_method_id = null; - - if ($var_type_part instanceof TKeyedArray) { - $potential_method_id = CallableTypeComparator::getCallableMethodIdFromTKeyedArray( - $var_type_part, - $codebase, - $context->calling_method_id, - $statements_analyzer->getFilePath() - ); - - if ($potential_method_id === 'not-callable') { - $potential_method_id = null; - } - } elseif ($var_type_part instanceof TLiteralString) { - if (!$var_type_part->value) { - $invalid_function_call_types[] = '\'\''; - continue; - } - - if (strpos($var_type_part->value, '::')) { - $parts = explode('::', strtolower($var_type_part->value)); - $fq_class_name = $parts[0]; - $fq_class_name = preg_replace('/^\\\\/', '', $fq_class_name); - $potential_method_id = new MethodIdentifier($fq_class_name, $parts[1]); - } else { - $function_call_info->new_function_name = new VirtualFullyQualified( - $var_type_part->value, - $function_name->getAttributes() - ); - } - } - - if ($potential_method_id) { - $codebase->methods->methodExists( - $potential_method_id, - $context->calling_method_id, - null, - $statements_analyzer, - $statements_analyzer->getFilePath() - ); - } - - // this is also kind of fine - $has_valid_function_call_type = true; - } elseif ($var_type_part instanceof TNull) { - // handled above - } elseif (!$var_type_part instanceof TNamedObject - || !$codebase->classlikes->classOrInterfaceExists($var_type_part->value) - || !$codebase->methods->methodExists( - new MethodIdentifier( - $var_type_part->value, - '__invoke' - ) - ) - ) { - $invalid_function_call_types[] = (string)$var_type_part; - } else { - self::analyzeInvokeCall( - $statements_analyzer, - $stmt, - $real_stmt, - $function_name, - $context, - $var_type_part - ); - } - } - - if ($invalid_function_call_types) { - $var_type_part = reset($invalid_function_call_types); - - if ($has_valid_function_call_type) { - IssueBuffer::maybeAdd( - new PossiblyInvalidFunctionCall( - 'Cannot treat type ' . $var_type_part . ' as callable', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidFunctionCall( - 'Cannot treat type ' . $var_type_part . ' as callable', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - return $function_call_info; - } - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && $stmt_name_type->parent_nodes - && $stmt_name_type->hasString() - && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - $arg_location = new CodeLocation($statements_analyzer->getSource(), $function_name); - - $custom_call_sink = TaintSink::getForMethodArgument( - 'variable-call', - 'variable-call', - 0, - $arg_location, - $arg_location - ); - - $custom_call_sink->taints = [TaintKind::INPUT_CALLABLE]; - - $statements_analyzer->data_flow_graph->addSink($custom_call_sink); - - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - foreach ($stmt_name_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $custom_call_sink, - 'call', - $added_taints, - $removed_taints - ); - } - } - } - - if (!$statements_analyzer->node_data->getType($real_stmt)) { - $statements_analyzer->node_data->setType($real_stmt, Type::getMixed()); - } - - return $function_call_info; - } - - private static function analyzeInvokeCall( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\FuncCall $stmt, - PhpParser\Node\Expr\FuncCall $real_stmt, - PhpParser\Node\Expr $function_name, - Context $context, - Atomic $atomic_type - ): void { - $old_data_provider = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $fake_method_call = new VirtualMethodCall( - $function_name, - new VirtualIdentifier('__invoke', $function_name->getAttributes()), - $stmt->args - ); - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('InternalMethod', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['InternalMethod']); - } - - $statements_analyzer->node_data->setType($function_name, new Union([$atomic_type])); - - MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_method_call, - $context, - false - ); - - if (!in_array('InternalMethod', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['InternalMethod']); - } - - $fake_method_call_type = $statements_analyzer->node_data->getType($fake_method_call); - - $statements_analyzer->node_data = $old_data_provider; - - if ($stmt_type = $statements_analyzer->node_data->getType($real_stmt)) { - $statements_analyzer->node_data->setType( - $real_stmt, - Type::combineUnionTypes( - $fake_method_call_type ?? Type::getMixed(), - $stmt_type - ) - ); - } else { - $statements_analyzer->node_data->setType( - $real_stmt, - $fake_method_call_type ?? Type::getMixed() - ); - } - } - - private static function processAssertFunctionEffects( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\FuncCall $stmt, - PhpParser\Node\Arg $first_arg, - Context $context - ): void { - $first_arg_value_id = spl_object_id($first_arg->value); - - $assert_clauses = FormulaGenerator::getFormula( - $first_arg_value_id, - $first_arg_value_id, - $first_arg->value, - $context->self, - $statements_analyzer, - $codebase - ); - - AlgebraAnalyzer::checkForParadox( - $context->clauses, - $assert_clauses, - $statements_analyzer, - $stmt, - [] - ); - - $simplified_clauses = Algebra::simplifyCNF(array_merge($context->clauses, $assert_clauses)); - - $assert_type_assertions = Algebra::getTruthsFromFormula($simplified_clauses); - - $changed_var_ids = []; - - if ($assert_type_assertions) { - // while in an and, we allow scope to boil over to support - // statements of the form if ($x && $x->foo()) - $op_vars_in_scope = Reconciler::reconcileKeyedTypes( - $assert_type_assertions, - $assert_type_assertions, - $context->vars_in_scope, - $changed_var_ids, - array_map( - function ($_): bool { - return true; - }, - $assert_type_assertions - ), - $statements_analyzer, - $statements_analyzer->getTemplateTypeMap() ?: [], - $context->inside_loop, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ); - - foreach ($changed_var_ids as $var_id => $_) { - $first_appearance = $statements_analyzer->getFirstAppearance($var_id); - - if ($first_appearance - && isset($context->vars_in_scope[$var_id]) - && $context->vars_in_scope[$var_id]->hasMixed() - ) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->decrementMixedCount($statements_analyzer->getFilePath()); - } - - IssueBuffer::remove( - $statements_analyzer->getFilePath(), - 'MixedAssignment', - $first_appearance->raw_file_start - ); - } - - if (isset($op_vars_in_scope[$var_id])) { - $op_vars_in_scope[$var_id]->from_docblock = true; - } - } - - $context->vars_in_scope = $op_vars_in_scope; - } - - if ($changed_var_ids) { - $simplified_clauses = Context::removeReconciledClauses($simplified_clauses, $changed_var_ids)[0]; - } - - $context->clauses = $simplified_clauses; - } - - private static function checkFunctionCallPurity( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\FuncCall $stmt, - PhpParser\Node $function_name, - FunctionCallInfo $function_call_info, - Context $context - ): void { - $config = $codebase->config; - - if (!$context->collect_initializations - && !$context->collect_mutations - && ($context->mutation_free - || $context->external_mutation_free - || $codebase->find_unused_variables - || !$config->remember_property_assignments_after_call - || ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations)) - ) { - $must_use = true; - - $callmap_function_pure = $function_call_info->function_id && $function_call_info->in_call_map - ? $codebase->functions->isCallMapFunctionPure( - $codebase, - $statements_analyzer->node_data, - $function_call_info->function_id, - $stmt->isFirstClassCallable() ? [] : $stmt->getArgs(), - $must_use - ) - : null; - - if ((!$function_call_info->in_call_map - && $function_call_info->function_storage - && !$function_call_info->function_storage->pure - && !$function_call_info->function_storage->mutation_free) - || ($callmap_function_pure === false) - ) { - if ($context->mutation_free || $context->external_mutation_free) { - IssueBuffer::maybeAdd( - new ImpureFunctionCall( - 'Cannot call an impure function from a mutation-free context', - new CodeLocation($statements_analyzer, $function_name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - - if (!$config->remember_property_assignments_after_call) { - $context->removeMutableObjectVars(); - } - } elseif ($function_call_info->function_id - && (($function_call_info->function_storage - && $function_call_info->function_storage->pure - && !$function_call_info->function_storage->assertions - && $must_use) - || ($callmap_function_pure === true && $must_use)) - && $codebase->find_unused_variables - && !$context->inside_conditional - && !$context->inside_unset - ) { - /** - * If a function is pure, and has the return type of 'no-return', - * it's okay to dismiss it's return value. - */ - if (!$context->insideUse() - && !self::callUsesByReferenceArguments($function_call_info, $stmt) - && !( - $function_call_info->function_storage && - $function_call_info->function_storage->return_type && - $function_call_info->function_storage->return_type->isNever() - ) - ) { - IssueBuffer::maybeAdd( - new UnusedFunctionCall( - 'The call to ' . $function_call_info->function_id . ' is not used', - new CodeLocation($statements_analyzer, $function_name), - $function_call_info->function_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - $stmt->setAttribute('pure', true); - } - } - } - } - - private static function callUsesByReferenceArguments( - FunctionCallInfo $function_call_info, - PhpParser\Node\Expr\FuncCall $stmt - ): bool { - // If the function doesn't have any by-reference parameters - // we shouldn't look any further. - if (!$function_call_info->hasByReferenceParameters() || null === $function_call_info->function_params) { - return false; - } - - $parameters = $function_call_info->function_params; - - // If no arguments were passed - if (0 === count($stmt->getArgs())) { - return false; - } - - foreach ($stmt->getArgs() as $index => $argument) { - $parameter = null; - if (null !== $argument->name) { - $argument_name = $argument->name->toString(); - foreach ($parameters as $param) { - if ($param->name === $argument_name) { - $parameter = $param; - break; - } - } - } else { - $parameter = $parameters[$index] ?? null; - } - - if ($parameter && $parameter->by_ref) { - return true; - } - } - - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php deleted file mode 100644 index 61984a89..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php +++ /dev/null @@ -1,87 +0,0 @@ - - */ - public $defined_constants = []; - - /** - * @var array - */ - public $global_variables = []; - - /** - * @var ?array - */ - public $function_params; - - /** - * @var ?FunctionLikeStorage - */ - public $function_storage; - - /** - * @var ?PhpParser\Node\Name - */ - public $new_function_name; - - /** - * @var bool - */ - public $allow_named_args = true; - - /** - * @var array - */ - public $byref_uses = []; - - /** - * @mutation-free - */ - public function hasByReferenceParameters(): bool - { - if (null === $this->function_params) { - return false; - } - - foreach ($this->function_params as $value) { - if ($value->by_ref) { - return true; - } - } - - return false; - } -} 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 deleted file mode 100644 index a843e945..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php +++ /dev/null @@ -1,861 +0,0 @@ -config; - - if ($stmt->isFirstClassCallable()) { - $candidate_callable = CallableTypeComparator::getCallableFromAtomic( - $codebase, - new TLiteralString($function_id), - null, - $statements_analyzer, - true - ); - - if ($candidate_callable) { - $stmt_type = new Union([new TClosure( - 'Closure', - $candidate_callable->params, - $candidate_callable->return_type, - $candidate_callable->is_pure - )]); - } else { - $stmt_type = Type::getClosure(); - } - } elseif ($codebase->functions->return_type_provider->has($function_id)) { - $stmt_type = $codebase->functions->return_type_provider->getReturnType( - $statements_analyzer, - $function_id, - $stmt, - $context, - new CodeLocation($statements_analyzer->getSource(), $function_name) - ); - } - - if (!$stmt_type) { - if (!$in_call_map || $is_stubbed) { - if ($function_storage && $function_storage->template_types) { - foreach ($function_storage->template_types as $template_name => $_) { - if (!isset($template_result->lower_bounds[$template_name])) { - if ($template_name === 'TFunctionArgCount') { - $template_result->lower_bounds[$template_name] = [ - 'fn-' . $function_id => [ - new TemplateBound( - Type::getInt(false, count($stmt->getArgs())) - ) - ] - ]; - } elseif ($template_name === 'TPhpMajorVersion') { - $template_result->lower_bounds[$template_name] = [ - 'fn-' . $function_id => [ - new TemplateBound( - Type::getInt(false, $codebase->php_major_version) - ) - ] - ]; - } elseif ($template_name === 'TPhpVersionId') { - $template_result->lower_bounds[$template_name] = [ - 'fn-' . $function_id => [ - new TemplateBound( - Type::getInt( - false, - 10000 * $codebase->php_major_version - + 100 * $codebase->php_minor_version - ) - ) - ] - ]; - } else { - $template_result->lower_bounds[$template_name] = [ - 'fn-' . $function_id => [ - new TemplateBound( - Type::getEmpty() - ) - ] - ]; - } - } - } - } - - if ($function_storage && !$context->isSuppressingExceptions($statements_analyzer)) { - $context->mergeFunctionExceptions( - $function_storage, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ); - } - - try { - if ($function_storage && $function_storage->return_type) { - $return_type = clone $function_storage->return_type; - - if ($template_result->lower_bounds && $function_storage->template_types) { - $return_type = TypeExpander::expandUnion( - $codebase, - $return_type, - null, - null, - null - ); - - TemplateInferredTypeReplacer::replace( - $return_type, - $template_result, - $codebase - ); - } - - $return_type = TypeExpander::expandUnion( - $codebase, - $return_type, - null, - null, - null, - true, - false, - false, - true - ); - - $return_type_location = $function_storage->return_type_location; - - $event = new AfterFunctionCallAnalysisEvent( - $stmt, - $function_id, - $context, - $statements_analyzer->getSource(), - $codebase, - $return_type, - [] - ); - - $config->eventDispatcher->dispatchAfterFunctionCallAnalysis($event); - $file_manipulations = $event->getFileReplacements(); - - if ($file_manipulations) { - FileManipulationBuffer::add( - $statements_analyzer->getFilePath(), - $file_manipulations - ); - } - - $stmt_type = $return_type; - $return_type->by_ref = $function_storage->returns_by_ref; - - // only check the type locally if it's defined externally - if ($return_type_location && - !$is_stubbed && // makes lookups or array_* functions quicker - !$config->isInProjectDirs($return_type_location->file_path) - ) { - $return_type->check( - $statements_analyzer, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues(), - $context->phantom_classes, - true, - false, - false, - $context->calling_method_id - ); - } - } - } catch (InvalidArgumentException $e) { - // this can happen when the function was defined in the Config startup script - $stmt_type = Type::getMixed(); - } - } else { - if (!$callmap_callable) { - throw new UnexpectedValueException('We should have a callmap callable here'); - } - - $stmt_type = self::getReturnTypeFromCallMapWithArgs( - $statements_analyzer, - $function_id, - $stmt->getArgs(), - $callmap_callable, - $context - ); - } - } - - if (!$stmt_type) { - $stmt_type = Type::getMixed(); - } - - if (!$statements_analyzer->data_flow_graph || !$function_storage) { - return $stmt_type; - } - - $return_node = self::taintReturnType( - $statements_analyzer, - $stmt, - $function_id, - $function_storage, - $stmt_type, - $template_result, - $context - ); - - if ($function_storage->proxy_calls !== null) { - foreach ($function_storage->proxy_calls as $proxy_call) { - $fake_call_arguments = []; - foreach ($proxy_call['params'] as $i) { - $fake_call_arguments[] = $stmt->getArgs()[$i]; - } - - $fake_call_factory = new BuilderFactory(); - - if (strpos($proxy_call['fqn'], '::') !== false) { - [$fqcn, $method] = explode('::', $proxy_call['fqn']); - $fake_call = $fake_call_factory->staticCall($fqcn, $method, $fake_call_arguments); - } else { - $fake_call = $fake_call_factory->funcCall($proxy_call['fqn'], $fake_call_arguments); - } - - $old_node_data = $statements_analyzer->node_data; - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - ExpressionAnalyzer::analyze($statements_analyzer, $fake_call, $context); - - $statements_analyzer->node_data = $old_node_data; - - if ($return_node && $proxy_call['return']) { - $fake_call_type = $statements_analyzer->node_data->getType($fake_call); - if (null !== $fake_call_type) { - foreach ($fake_call_type->parent_nodes as $fake_call_node) { - $statements_analyzer->data_flow_graph->addPath($fake_call_node, $return_node, 'return'); - } - } - } - } - } - - return $stmt_type; - } - - /** - * @param list $call_args - */ - private static function getReturnTypeFromCallMapWithArgs( - StatementsAnalyzer $statements_analyzer, - string $function_id, - array $call_args, - TCallable $callmap_callable, - Context $context - ): Union { - $call_map_key = strtolower($function_id); - - $codebase = $statements_analyzer->getCodebase(); - - if (!$call_args) { - switch ($call_map_key) { - case 'hrtime': - $keyed_array = new TKeyedArray([ - Type::getInt(), - Type::getInt() - ]); - $keyed_array->sealed = true; - $keyed_array->is_list = true; - return new Union([$keyed_array]); - - case 'get_called_class': - return new Union([ - new TClassString( - $context->self ?: 'object', - $context->self ? new TNamedObject($context->self, true) : null - ) - ]); - - case 'get_parent_class': - if ($context->self && $codebase->classExists($context->self)) { - $classlike_storage = $codebase->classlike_storage_provider->get($context->self); - - if ($classlike_storage->parent_classes) { - return new Union([ - new TClassString( - array_values($classlike_storage->parent_classes)[0] - ) - ]); - } - } - } - } else { - switch ($call_map_key) { - case 'count': - if (($first_arg_type = $statements_analyzer->node_data->getType($call_args[0]->value))) { - $atomic_types = $first_arg_type->getAtomicTypes(); - - if (count($atomic_types) === 1) { - if (isset($atomic_types['array'])) { - if ($atomic_types['array'] instanceof TCallableArray - || $atomic_types['array'] instanceof TCallableList - || $atomic_types['array'] instanceof TCallableKeyedArray - ) { - return Type::getInt(false, 2); - } - - if ($atomic_types['array'] instanceof TNonEmptyArray) { - return new Union([ - $atomic_types['array']->count !== null - ? new TLiteralInt($atomic_types['array']->count) - : new TPositiveInt - ]); - } - - if ($atomic_types['array'] instanceof TNonEmptyList) { - return new Union([ - $atomic_types['array']->count !== null - ? new TLiteralInt($atomic_types['array']->count) - : new TPositiveInt - ]); - } - - if ($atomic_types['array'] instanceof TKeyedArray) { - $min = 0; - $max = 0; - foreach ($atomic_types['array']->properties as $property) { - // empty, never and possibly undefined can't count for min value - if (!$property->possibly_undefined - && !$property->isEmpty() - && !$property->isNever() - ) { - $min++; - } - - //empty and never can't count for max value because we know keys are undefined - if (!$property->isEmpty() && !$property->isNever()) { - $max++; - } - } - - if ($atomic_types['array']->sealed) { - //the KeyedArray is sealed, we can use the min and max - if ($min === $max) { - return new Union([new TLiteralInt($max)]); - } - - return new Union([new TIntRange($min, $max)]); - } - - //the type is not sealed, we can only use the min - return new Union([new TIntRange($min, null)]); - } - - if ($atomic_types['array'] instanceof TArray - && $atomic_types['array']->type_params[0]->isEmpty() - && $atomic_types['array']->type_params[1]->isEmpty() - ) { - return Type::getInt(false, 0); - } - - return new Union([ - new TLiteralInt(0), - new TPositiveInt - ]); - } - } - } - - break; - - case 'hrtime': - if (($first_arg_type = $statements_analyzer->node_data->getType($call_args[0]->value))) { - if ((string) $first_arg_type === 'true') { - $int = Type::getInt(); - $int->from_calculation = true; - return $int; - } - - $keyed_array = new TKeyedArray([ - Type::getInt(), - Type::getInt() - ]); - $keyed_array->sealed = true; - $keyed_array->is_list = true; - - if ((string) $first_arg_type === 'false') { - return new Union([$keyed_array]); - } - - return new Union([ - $keyed_array, - new TInt() - ]); - } - - $int = Type::getInt(); - $int->from_calculation = true; - return $int; - - case 'min': - case 'max': - if (isset($call_args[0])) { - $first_arg = $call_args[0]->value; - - if ($first_arg_type = $statements_analyzer->node_data->getType($first_arg)) { - if ($first_arg_type->hasArray()) { - /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ - $array_type = $first_arg_type->getAtomicTypes()['array']; - if ($array_type instanceof TKeyedArray) { - return $array_type->getGenericValueType(); - } - - if ($array_type instanceof TArray) { - return clone $array_type->type_params[1]; - } - - if ($array_type instanceof TList) { - return clone $array_type->type_param; - } - } elseif ($first_arg_type->hasScalarType() - && ($second_arg = ($call_args[1]->value ?? null)) - && ($second_arg_type = $statements_analyzer->node_data->getType($second_arg)) - && $second_arg_type->hasScalarType() - ) { - return Type::combineUnionTypes($first_arg_type, $second_arg_type); - } - } - } - - break; - - case 'get_parent_class': - // this is unreliable, as it's hard to know exactly what's wanted - attempted this in - // https://github.com/vimeo/psalm/commit/355ed831e1c69c96bbf9bf2654ef64786cbe9fd7 - // but caused problems where it didn’t know exactly what level of child we - // were receiving. - // - // Really this should only work on instances we've created with new Foo(), - // but that requires more work - break; - - case 'fgetcsv': - $string_type = Type::getString(); - $string_type->addType(new TNull); - $string_type->ignore_nullable_issues = true; - - $call_map_return_type = new Union([ - new TNonEmptyList( - $string_type - ), - new TFalse, - new TNull - ]); - - if ($codebase->config->ignore_internal_nullable_issues) { - $call_map_return_type->ignore_nullable_issues = true; - } - - if ($codebase->config->ignore_internal_falsable_issues) { - $call_map_return_type->ignore_falsable_issues = true; - } - - return $call_map_return_type; - case 'mb_strtolower': - if (count($call_args) < 2) { - return Type::getLowercaseString(); - } else { - $second_arg_type = $statements_analyzer->node_data->getType($call_args[1]->value); - if ($second_arg_type && $second_arg_type->isNull()) { - return Type::getLowercaseString(); - } - } - return Type::getString(); - } - } - - $stmt_type = $callmap_callable->return_type - ? clone $callmap_callable->return_type - : Type::getMixed(); - - switch ($function_id) { - case 'mb_strpos': - case 'mb_strrpos': - case 'mb_stripos': - case 'mb_strripos': - case 'strpos': - case 'strrpos': - case 'stripos': - case 'strripos': - case 'strstr': - case 'stristr': - case 'strrchr': - case 'strpbrk': - case 'array_search': - break; - - default: - if ($stmt_type->isFalsable() - && $codebase->config->ignore_internal_falsable_issues - ) { - $stmt_type->ignore_falsable_issues = true; - } - } - - return $stmt_type; - } - - private static function taintReturnType( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\FuncCall $stmt, - string $function_id, - FunctionLikeStorage $function_storage, - Union $stmt_type, - TemplateResult $template_result, - Context $context - ): ?DataFlowNode { - if (!$statements_analyzer->data_flow_graph) { - return null; - } - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - return null; - } - - $codebase = $statements_analyzer->getCodebase(); - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - $node_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - $function_call_node = DataFlowNode::getForMethodReturn( - $function_id, - $function_id, - $statements_analyzer->data_flow_graph instanceof TaintFlowGraph - ? ($function_storage->signature_return_type_location ?: $function_storage->location) - : ($function_storage->return_type_location ?: $function_storage->location), - $function_storage->specialize_call ? $node_location : null - ); - - $statements_analyzer->data_flow_graph->addNode($function_call_node); - - $codebase = $statements_analyzer->getCodebase(); - - $conditionally_removed_taints = []; - - foreach ($function_storage->conditionally_removed_taints as $conditionally_removed_taint) { - $conditionally_removed_taint = clone $conditionally_removed_taint; - - TemplateInferredTypeReplacer::replace( - $conditionally_removed_taint, - $template_result, - $codebase - ); - - $expanded_type = TypeExpander::expandUnion( - $statements_analyzer->getCodebase(), - $conditionally_removed_taint, - null, - null, - null, - true, - true - ); - - if (!$expanded_type->isNullable()) { - foreach ($expanded_type->getLiteralStrings() as $literal_string) { - $conditionally_removed_taints[] = $literal_string->value; - } - } - } - - if ($conditionally_removed_taints && $function_storage->location) { - $assignment_node = DataFlowNode::getForAssignment( - $function_id . '-escaped', - $function_storage->signature_return_type_location ?: $function_storage->location, - $function_call_node->specialization_key - ); - - $statements_analyzer->data_flow_graph->addPath( - $function_call_node, - $assignment_node, - 'conditionally-escaped', - $added_taints, - array_merge($removed_taints, $conditionally_removed_taints) - ); - - $stmt_type->parent_nodes[$assignment_node->id] = $assignment_node; - } else { - $stmt_type->parent_nodes[$function_call_node->id] = $function_call_node; - } - - if ($function_storage->return_source_params - && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph - ) { - $removed_taints = $function_storage->removed_taints; - - if ($function_id === 'preg_replace' && count($stmt->getArgs()) > 2) { - $first_stmt_type = $statements_analyzer->node_data->getType($stmt->getArgs()[0]->value); - $second_stmt_type = $statements_analyzer->node_data->getType($stmt->getArgs()[1]->value); - - if ($first_stmt_type - && $second_stmt_type - && $first_stmt_type->isSingleStringLiteral() - && $second_stmt_type->isSingleStringLiteral() - ) { - $first_arg_value = $first_stmt_type->getSingleStringLiteral()->value; - - $pattern = substr($first_arg_value, 1, -1); - - if ($pattern[0] === '[' - && $pattern[1] === '^' - && substr($pattern, -1) === ']' - ) { - $pattern = substr($pattern, 2, -1); - - if (self::simpleExclusion($pattern, $first_arg_value[0])) { - $removed_taints[] = 'html'; - $removed_taints[] = 'has_quotes'; - $removed_taints[] = 'sql'; - } - } - } - } - - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = array_merge( - $removed_taints, - $codebase->config->eventDispatcher->dispatchRemoveTaints($event) - ); - - self::taintUsingFlows( - $statements_analyzer, - $function_storage, - $statements_analyzer->data_flow_graph, - $function_id, - $stmt->getArgs(), - $node_location, - $function_call_node, - $removed_taints, - $added_taints - ); - } - - if ($function_storage->taint_source_types && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { - $method_node = TaintSource::getForMethodReturn( - $function_id, - $function_id, - $node_location - ); - - $method_node->taints = $function_storage->taint_source_types; - - $statements_analyzer->data_flow_graph->addSource($method_node); - } - - return $function_call_node; - } - - /** - * @param array $args - * @param array $removed_taints - * @param array $added_taints - */ - public static function taintUsingFlows( - StatementsAnalyzer $statements_analyzer, - FunctionLikeStorage $function_storage, - TaintFlowGraph $graph, - string $function_id, - array $args, - CodeLocation $node_location, - DataFlowNode $function_call_node, - array $removed_taints, - array $added_taints = [] - ): void { - foreach ($function_storage->return_source_params as $i => $path_type) { - if (!isset($args[$i])) { - continue; - } - - $current_arg_is_variadic = $function_storage->params[$i]->is_variadic; - $taintable_arg_index = [$i]; - - if ($current_arg_is_variadic) { - $max_params = count($args) - 1; - for ($arg_index = $i + 1; $arg_index <= $max_params; $arg_index++) { - $taintable_arg_index[] = $arg_index; - } - } - - foreach ($taintable_arg_index as $arg_index) { - $arg_location = new CodeLocation( - $statements_analyzer, - $args[$arg_index]->value - ); - - $function_param_sink = DataFlowNode::getForMethodArgument( - $function_id, - $function_id, - $arg_index, - $arg_location, - $function_storage->specialize_call ? $node_location : null - ); - - $graph->addNode($function_param_sink); - - $graph->addPath( - $function_param_sink, - $function_call_node, - $path_type, - array_merge($added_taints, $function_storage->added_taints), - $removed_taints - ); - } - } - } - - /** - * @psalm-pure - */ - private static function simpleExclusion(string $pattern, string $escape_char): bool - { - $str_length = strlen($pattern); - - for ($i = 0; $i < $str_length; $i++) { - $current = $pattern[$i]; - $next = $pattern[$i + 1] ?? null; - - if ($current === '\\') { - if ($next === null - || $next === 'x' - || $next === 'u' - ) { - return false; - } - - if ($next === '.' - || $next === '(' - || $next === ')' - || $next === '[' - || $next === ']' - || $next === 's' - || $next === 'w' - || $next === $escape_char - ) { - $i++; - continue; - } - - return false; - } - - if ($next !== '-') { - if ($current === '_' - || $current === '-' - || $current === '|' - || $current === ':' - || $current === '#' - || $current === '.' - || $current === ' ' - ) { - continue; - } - - return false; - } - - if ($current === ']') { - return false; - } - - if (!isset($pattern[$i + 2])) { - return false; - } - - if (($current === 'a' && $pattern[$i + 2] === 'z') - || ($current === 'a' && $pattern[$i + 2] === 'Z') - || ($current === 'A' && $pattern[$i + 2] === 'Z') - || ($current === '0' && $pattern[$i + 2] === '9') - ) { - $i += 2; - continue; - } - - return false; - } - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php deleted file mode 100644 index fe0c730e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php +++ /dev/null @@ -1,22 +0,0 @@ - */ - public $args; - - /** @param list $args */ - public function __construct(MethodIdentifier $method_id, array $args) - { - $this->method_id = $method_id; - $this->args = $args; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php deleted file mode 100644 index e4d5d5e0..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php +++ /dev/null @@ -1,89 +0,0 @@ - - */ - public $invalid_method_call_types = []; - - /** - * @var array - */ - public $existent_method_ids = []; - - /** - * @var array - */ - public $non_existent_class_method_ids = []; - - /** - * @var array - */ - public $non_existent_interface_method_ids = []; - - /** - * @var array - */ - public $non_existent_magic_method_ids = []; - - /** - * @var bool - */ - public $check_visibility = true; - - /** - * @var bool - */ - public $too_many_arguments = true; - - /** - * @var list - */ - public $too_many_arguments_method_ids = []; - - /** - * @var bool - */ - public $too_few_arguments = false; - - /** - * @var list - */ - public $too_few_arguments_method_ids = []; - - /** - * @var bool - */ - public $can_memoize = false; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php deleted file mode 100644 index 6183fe74..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php +++ /dev/null @@ -1,890 +0,0 @@ -as->isMixed() - ) { - $extra_types = $lhs_type_part->extra_types; - - $lhs_type_part = array_values( - $lhs_type_part->as->getAtomicTypes() - )[0]; - - $lhs_type_part->from_docblock = true; - - if ($lhs_type_part instanceof TNamedObject) { - $lhs_type_part->extra_types = $extra_types; - } elseif ($lhs_type_part instanceof TObject && $extra_types) { - $lhs_type_part = array_shift($extra_types); - if ($extra_types) { - $lhs_type_part->extra_types = $extra_types; - } - } - - $result->has_mixed_method_call = true; - } - - $source = $statements_analyzer->getSource(); - - if (!$lhs_type_part instanceof TNamedObject) { - self::handleInvalidClass( - $statements_analyzer, - $codebase, - $stmt, - $lhs_type, - $lhs_type_part, - $lhs_var_id, - $context, - $is_intersection, - $result - ); - - return; - } - - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); - } - - $result->has_valid_method_call_type = true; - - $fq_class_name = $lhs_type_part->value; - - $is_mock = ExpressionAnalyzer::isMock($fq_class_name); - - $result->has_mock = $result->has_mock || $is_mock; - - if ($fq_class_name === 'static') { - $fq_class_name = (string) $context->self; - } - - if ($is_mock || - $context->isPhantomClass($fq_class_name) - ) { - $result->return_type = Type::getMixed(); - - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ); - - return; - } - - if ($lhs_var_id === '$this') { - $does_class_exist = true; - } else { - $does_class_exist = ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $fq_class_name, - new CodeLocation($source, $stmt->var), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions(true, false, true, true, $lhs_type_part->from_docblock) - ); - } - - if (!$does_class_exist) { - return; - } - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $result->check_visibility = $result->check_visibility && !$class_storage->override_method_visibility; - - $intersection_types = $lhs_type_part->getIntersectionTypes(); - - if (!$stmt->name instanceof PhpParser\Node\Identifier) { - if (!$context->ignore_variable_method) { - $codebase->analyzer->addMixedMemberName( - strtolower($fq_class_name) . '::', - $context->calling_method_id ?: $statements_analyzer->getFileName() - ); - } - - if ($stmt->isFirstClassCallable()) { - $return_type_candidate = null; - $method_name_type = $statements_analyzer->node_data->getType($stmt->name); - if ($method_name_type && $method_name_type->isSingleStringLiteral()) { - $method_identifier = new MethodIdentifier( - $fq_class_name, - strtolower($method_name_type->getSingleStringLiteral()->value) - ); - //the call to methodExists will register that the method was called from somewhere - if ($codebase->methods->methodExists( - $method_identifier, - $context->calling_method_id, - null, - $statements_analyzer, - $statements_analyzer->getFilePath(), - true, - $context->insideUse() - )) { - $method_storage = $codebase->methods->getStorage($method_identifier); - - $return_type_candidate = new Union([new TClosure( - 'Closure', - $method_storage->params, - $method_storage->return_type, - $method_storage->pure - )]); - } - } - - $statements_analyzer->node_data->setType($stmt, $return_type_candidate ?? Type::getClosure()); - - - return; - } - - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ); - - $result->return_type = Type::getMixed(); - return; - } - - $method_name_lc = strtolower($stmt->name->name); - - $method_id = new MethodIdentifier($fq_class_name, $method_name_lc); - - $args = $stmt->isFirstClassCallable() ? [] : $stmt->getArgs(); - - $naive_method_id = $method_id; - - // this tells us whether or not we can stay on the happy path - $naive_method_exists = $codebase->methods->methodExists( - $method_id, - $context->calling_method_id, - $codebase->collect_locations - ? new CodeLocation($source, $stmt->name) - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $statements_analyzer - : null, - $statements_analyzer->getFilePath(), - false, - $context->insideUse() - ); - - $fake_method_exists = false; - - if (!$naive_method_exists) { - // if the method doesn't exist we check for any method existence providers - if ($codebase->methods->existence_provider->has($fq_class_name)) { - $method_exists = $codebase->methods->existence_provider->doesMethodExist( - $fq_class_name, - $method_id->method_name, - $source, - null - ); - - if ($method_exists) { - $fake_method_exists = true; - } - } - - $naive_method_exists = false; - - // @mixin attributes are an absolute pain! Lots of complexity here, - // as they can redefine the called class, method id etc. - if ($class_storage->templatedMixins - && $lhs_type_part instanceof TGenericObject - && $class_storage->template_types - ) { - [$lhs_type_part, $class_storage, $naive_method_exists, $method_id, $fq_class_name] - = self::handleTemplatedMixins( - $class_storage, - $lhs_type_part, - $method_name_lc, - $codebase, - $context, - $method_id, - $source, - $stmt, - $statements_analyzer, - $fq_class_name - ); - } elseif ($class_storage->mixin_declaring_fqcln - && $class_storage->namedMixins - ) { - [$lhs_type_part, $class_storage, $naive_method_exists, $method_id, $fq_class_name] - = self::handleRegularMixins( - $class_storage, - $lhs_type_part, - $method_name_lc, - $codebase, - $context, - $method_id, - $source, - $stmt, - $statements_analyzer, - $fq_class_name, - $lhs_var_id - ); - } - } - - $all_intersection_return_type = null; - $all_intersection_existent_method_ids = []; - - // insersection types are also fun, they also complicate matters - if ($intersection_types) { - [$all_intersection_return_type, $all_intersection_existent_method_ids] - = self::getIntersectionReturnType( - $statements_analyzer, - $stmt, - $codebase, - $context, - $lhs_type, - $lhs_type_part, - $lhs_var_id, - $result, - $intersection_types - ); - } - - if (($fake_method_exists - && $codebase->methods->methodExists(new MethodIdentifier($fq_class_name, '__call'))) - || !$naive_method_exists - || !MethodAnalyzer::isMethodVisible( - $method_id, - $context, - $statements_analyzer->getSource() - ) - ) { - $interface_has_method = false; - - if ($class_storage->abstract && $class_storage->class_implements) { - foreach ($class_storage->class_implements as $interface_fqcln_lc => $_) { - $interface_storage = $codebase->classlike_storage_provider->get($interface_fqcln_lc); - - if (isset($interface_storage->methods[$method_name_lc])) { - $interface_has_method = true; - $fq_class_name = $interface_storage->name; - $method_id = new MethodIdentifier( - $fq_class_name, - $method_name_lc - ); - break; - } - } - } - - if (!$interface_has_method - && $codebase->methods->methodExists( - new MethodIdentifier($fq_class_name, '__call'), - $context->calling_method_id, - $codebase->collect_locations - ? new CodeLocation($source, $stmt->name) - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $statements_analyzer - : null, - $statements_analyzer->getFilePath(), - true, - $context->insideUse() - ) - ) { - $new_call_context = MissingMethodCallHandler::handleMagicMethod( - $statements_analyzer, - $codebase, - $stmt, - $method_id, - $class_storage, - $context, - $codebase->config, - $all_intersection_return_type, - $result, - $lhs_type_part - ); - - if ($new_call_context) { - if ($method_id === $new_call_context->method_id) { - return; - } - - $method_id = $new_call_context->method_id; - $args = $new_call_context->args; - } else { - return; - } - } - } - - $intersection_method_id = $intersection_types - ? '(' . $lhs_type_part . ')' . '::' . $stmt->name->name - : null; - $cased_method_id = $fq_class_name . '::' . $stmt->name->name; - - if ($lhs_var_id === '$this' - && $context->self - && $fq_class_name !== $context->self - && $codebase->methods->methodExists( - new MethodIdentifier($context->self, $method_name_lc) - ) - ) { - $method_id = new MethodIdentifier($context->self, $method_name_lc); - $cased_method_id = $context->self . '::' . $stmt->name->name; - $fq_class_name = $context->self; - } - - $source_method_id = $source instanceof FunctionLikeAnalyzer - ? $source->getId() - : null; - - $corrected_method_exists = ($naive_method_exists && $method_id === $naive_method_id) - || ($method_id !== $naive_method_id - && $codebase->methods->methodExists( - $method_id, - $context->calling_method_id, - $codebase->collect_locations && $method_id !== $source_method_id - ? new CodeLocation($source, $stmt->name) - : null - )); - - if (!$corrected_method_exists - || ($codebase->config->use_phpdoc_method_without_magic_or_parent - && isset($class_storage->pseudo_methods[$method_name_lc])) - ) { - MissingMethodCallHandler::handleMissingOrMagicMethod( - $statements_analyzer, - $codebase, - $stmt, - $method_id, - $codebase->interfaceExists($fq_class_name), - $context, - $codebase->config, - $all_intersection_return_type, - $all_intersection_existent_method_ids, - $intersection_method_id, - $cased_method_id, - $result, - $lhs_type_part - ); - - return; - } - - $old_node_data = $statements_analyzer->node_data; - - $return_type_candidate = ExistingAtomicMethodCallAnalyzer::analyze( - $statements_analyzer, - $stmt, - $stmt->name, - $args, - $codebase, - $context, - $lhs_type_part, - $static_type, - $lhs_var_id, - $method_id, - $result - ); - - $statements_analyzer->node_data = $old_node_data; - - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - $in_call_map = InternalCallMapHandler::inCallMap((string) ($declaring_method_id ?? $method_id)); - - if (!$in_call_map) { - if ($result->check_visibility) { - $name_code_location = new CodeLocation($statements_analyzer, $stmt->name); - - MethodVisibilityAnalyzer::analyze( - $method_id, - $context, - $statements_analyzer->getSource(), - $name_code_location, - $statements_analyzer->getSuppressedIssues() - ); - } - } - - self::updateResultReturnType( - $result, - $return_type_candidate, - $all_intersection_return_type, - $codebase - ); - } - - /** - * @param TNamedObject|TTemplateParam $lhs_type_part - * @param array $intersection_types - * - * @return array{?Union, array} - */ - private static function getIntersectionReturnType( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\MethodCall $stmt, - Codebase $codebase, - Context $context, - Union $lhs_type, - Atomic $lhs_type_part, - ?string $lhs_var_id, - AtomicMethodCallAnalysisResult $result, - array $intersection_types - ): array { - $all_intersection_return_type = null; - $all_intersection_existent_method_ids = []; - - foreach ($intersection_types as $intersection_type) { - $intersection_result = clone $result; - - /** @var ?Union $intersection_result->return_type */ - $intersection_result->return_type = null; - - self::analyze( - $statements_analyzer, - $stmt, - $codebase, - $context, - $lhs_type, - $intersection_type, - $lhs_type_part, - true, - $lhs_var_id, - $intersection_result - ); - - $result->returns_by_ref = $intersection_result->returns_by_ref; - $result->has_mock = $intersection_result->has_mock; - $result->has_valid_method_call_type = $intersection_result->has_valid_method_call_type; - $result->has_mixed_method_call = $intersection_result->has_mixed_method_call; - $result->invalid_method_call_types = $intersection_result->invalid_method_call_types; - $result->check_visibility = $intersection_result->check_visibility; - $result->too_many_arguments = $intersection_result->too_many_arguments; - - $all_intersection_existent_method_ids = array_merge( - $all_intersection_existent_method_ids, - $intersection_result->existent_method_ids - ); - - if ($intersection_result->return_type) { - if (!$all_intersection_return_type || $all_intersection_return_type->isMixed()) { - $all_intersection_return_type = $intersection_result->return_type; - } else { - $all_intersection_return_type = Type::intersectUnionTypes( - $all_intersection_return_type, - $intersection_result->return_type, - $codebase - ) ?? Type::getMixed(); - } - } - } - - return [$all_intersection_return_type, $all_intersection_existent_method_ids]; - } - - private static function updateResultReturnType( - AtomicMethodCallAnalysisResult $result, - Union $return_type_candidate, - ?Union $all_intersection_return_type, - Codebase $codebase - ): void { - if ($all_intersection_return_type) { - $return_type_candidate = Type::intersectUnionTypes( - $all_intersection_return_type, - $return_type_candidate, - $codebase - ) ?? Type::getMixed(); - } - - $result->return_type = Type::combineUnionTypes($return_type_candidate, $result->return_type); - } - - private static function handleInvalidClass( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\MethodCall $stmt, - Union $lhs_type, - Atomic $lhs_type_part, - ?string $lhs_var_id, - Context $context, - bool $is_intersection, - AtomicMethodCallAnalysisResult $result - ): void { - switch (get_class($lhs_type_part)) { - case TNull::class: - case TFalse::class: - // handled above - return; - - case TTemplateParam::class: - case TEmptyMixed::class: - case TEmpty::class: - case TMixed::class: - case TNonEmptyMixed::class: - case TObject::class: - case TObjectWithProperties::class: - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - $result->has_mixed_method_call = true; - - if ($lhs_type_part instanceof TObjectWithProperties - && $stmt->name instanceof PhpParser\Node\Identifier - && isset($lhs_type_part->methods[$stmt->name->name]) - ) { - $result->existent_method_ids[] = $lhs_type_part->methods[$stmt->name->name]; - } elseif (!$is_intersection) { - if ($stmt->name instanceof PhpParser\Node\Identifier) { - $codebase->analyzer->addMixedMemberName( - strtolower($stmt->name->name), - $context->calling_method_id ?: $statements_analyzer->getFileName() - ); - } - - if ($context->check_methods) { - $message = 'Cannot determine the type of the object' - . ' on the left hand side of this expression'; - - if ($lhs_var_id) { - $message = 'Cannot determine the type of ' . $lhs_var_id; - - if ($stmt->name instanceof PhpParser\Node\Identifier) { - $message .= ' when calling method ' . $stmt->name->name; - } - } - - $origin_locations = []; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - foreach ($lhs_type->parent_nodes as $parent_node) { - $origin_locations = array_merge( - $origin_locations, - $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) - ); - } - } - - $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; - - $name_code_location = new CodeLocation($statements_analyzer, $stmt->name); - - if ($origin_location && $origin_location->getHash() === $name_code_location->getHash()) { - $origin_location = null; - } - - IssueBuffer::maybeAdd( - new MixedMethodCall( - $message, - $name_code_location, - $origin_location - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ) === false) { - return; - } - - $result->return_type = Type::getMixed(); - return; - - default: - $result->invalid_method_call_types[] = (string)$lhs_type_part; - return; - } - } - - /** - * @param lowercase-string $method_name_lc - * @return array{TNamedObject, ClassLikeStorage, bool, MethodIdentifier, string} - */ - private static function handleTemplatedMixins( - ClassLikeStorage $class_storage, - TNamedObject $lhs_type_part, - string $method_name_lc, - Codebase $codebase, - Context $context, - MethodIdentifier $method_id, - StatementsSource $source, - PhpParser\Node\Expr\MethodCall $stmt, - StatementsAnalyzer $statements_analyzer, - string $fq_class_name - ): array { - $naive_method_exists = false; - - if ($class_storage->templatedMixins - && $lhs_type_part instanceof TGenericObject - && $class_storage->template_types - ) { - $template_type_keys = array_keys($class_storage->template_types); - - foreach ($class_storage->templatedMixins as $mixin) { - $param_position = array_search( - $mixin->param_name, - $template_type_keys - ); - - if ($param_position !== false - && isset($lhs_type_part->type_params[$param_position]) - ) { - $current_type_param = $lhs_type_part->type_params[$param_position]; - if ($current_type_param->isSingle()) { - $lhs_type_part_new = array_values( - $current_type_param->getAtomicTypes() - )[0]; - - if ($lhs_type_part_new instanceof TNamedObject) { - $new_method_id = new MethodIdentifier( - $lhs_type_part_new->value, - $method_name_lc - ); - - $mixin_class_storage = $codebase->classlike_storage_provider->get( - $lhs_type_part_new->value - ); - - if ($codebase->methods->methodExists( - $new_method_id, - $context->calling_method_id, - $codebase->collect_locations - ? new CodeLocation($source, $stmt->name) - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $statements_analyzer - : null, - $statements_analyzer->getFilePath(), - true, - $context->insideUse() - )) { - $lhs_type_part = clone $lhs_type_part_new; - $class_storage = $mixin_class_storage; - - $naive_method_exists = true; - $method_id = $new_method_id; - } elseif (isset($mixin_class_storage->pseudo_methods[$method_name_lc])) { - $lhs_type_part = clone $lhs_type_part_new; - $class_storage = $mixin_class_storage; - $method_id = $new_method_id; - } - } - } - } - } - } - - return [ - $lhs_type_part, - $class_storage, - $naive_method_exists, - $method_id, - $fq_class_name - ]; - } - - /** - * @param lowercase-string $method_name_lc - * @return array{TNamedObject, ClassLikeStorage, bool, MethodIdentifier, string} - */ - private static function handleRegularMixins( - ClassLikeStorage $class_storage, - TNamedObject $lhs_type_part, - string $method_name_lc, - Codebase $codebase, - Context $context, - MethodIdentifier $method_id, - StatementsSource $source, - PhpParser\Node\Expr\MethodCall $stmt, - StatementsAnalyzer $statements_analyzer, - string $fq_class_name, - ?string $lhs_var_id - ): array { - $naive_method_exists = false; - - foreach ($class_storage->namedMixins as $mixin) { - if (!$class_storage->mixin_declaring_fqcln) { - continue; - } - - $new_method_id = new MethodIdentifier( - $mixin->value, - $method_name_lc - ); - - if ($codebase->methods->methodExists( - $new_method_id, - $context->calling_method_id, - $codebase->collect_locations - ? new CodeLocation($source, $stmt->name) - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $statements_analyzer - : null, - $statements_analyzer->getFilePath(), - true, - $context->insideUse() - )) { - $mixin_declaring_class_storage = $codebase->classlike_storage_provider->get( - $class_storage->mixin_declaring_fqcln - ); - - $mixin_class_template_params = ClassTemplateParamCollector::collect( - $codebase, - $mixin_declaring_class_storage, - $codebase->classlike_storage_provider->get($fq_class_name), - null, - $lhs_type_part, - $lhs_var_id === '$this' - ); - - $lhs_type_part = clone $mixin; - - $lhs_type_part->replaceTemplateTypesWithArgTypes( - new TemplateResult([], $mixin_class_template_params ?: []), - $codebase - ); - - $lhs_type_expanded = TypeExpander::expandUnion( - $codebase, - new Union([$lhs_type_part]), - $mixin_declaring_class_storage->name, - $fq_class_name, - $class_storage->parent_class, - true, - false, - $class_storage->final - ); - - $new_lhs_type_part = $lhs_type_expanded->getSingleAtomic(); - - if ($new_lhs_type_part instanceof TNamedObject) { - $lhs_type_part = $new_lhs_type_part; - } - - $mixin_class_storage = $codebase->classlike_storage_provider->get($mixin->value); - - $fq_class_name = $mixin_class_storage->name; - $mixin_class_storage->mixin_declaring_fqcln = $class_storage->mixin_declaring_fqcln; - $class_storage = $mixin_class_storage; - $naive_method_exists = true; - $method_id = $new_method_id; - } - } - - return [ - $lhs_type_part, - $class_storage, - $naive_method_exists, - $method_id, - $fq_class_name - ]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php deleted file mode 100644 index 6dee09a6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php +++ /dev/null @@ -1,673 +0,0 @@ - $args - */ - public static function analyze( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\MethodCall $stmt, - PhpParser\Node\Identifier $stmt_name, - array $args, - Codebase $codebase, - Context $context, - TNamedObject $lhs_type_part, - ?Atomic $static_type, - ?string $lhs_var_id, - MethodIdentifier $method_id, - AtomicMethodCallAnalysisResult $result - ): Union { - $config = $codebase->config; - - $fq_class_name = $lhs_type_part->value; - - if ($fq_class_name === 'static') { - $fq_class_name = (string) $context->self; - } - - $method_name_lc = $method_id->method_name; - - $cased_method_id = $fq_class_name . '::' . $stmt_name->name; - - $result->existent_method_ids[] = $method_id->__toString(); - - if ($context->collect_initializations && $context->calling_method_id) { - [$calling_method_class] = explode('::', $context->calling_method_id); - $codebase->file_reference_provider->addMethodReferenceToClassMember( - $calling_method_class . '::__construct', - strtolower((string) $method_id), - false - ); - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - ArgumentMapPopulator::recordArgumentPositions( - $statements_analyzer, - $stmt, - $codebase, - (string) $method_id - ); - } - - if ($fq_class_name === 'Closure' && $method_name_lc === '__invoke') { - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $fake_function_call = new VirtualFuncCall( - $stmt->var, - $args, - $stmt->getAttributes() - ); - - FunctionCallAnalyzer::analyze( - $statements_analyzer, - $fake_function_call, - $context - ); - - return $statements_analyzer->node_data->getType($fake_function_call) ?? Type::getMixed(); - } - - $source = $statements_analyzer->getSource(); - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt_name, - $method_id . '()' - ); - } - - if ($context->collect_initializations && $context->calling_method_id) { - [$calling_method_class] = explode('::', $context->calling_method_id); - $codebase->file_reference_provider->addMethodReferenceToClassMember( - $calling_method_class . '::__construct', - strtolower((string) $method_id), - false - ); - } - - if ($stmt->var instanceof PhpParser\Node\Expr\Variable - && ($context->collect_initializations || $context->collect_mutations) - && $stmt->var->name === 'this' - && $source instanceof FunctionLikeAnalyzer - ) { - self::collectSpecialInformation($source, $stmt_name->name, $context); - } - - $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $parent_source = $statements_analyzer->getSource(); - - $class_template_params = ClassTemplateParamCollector::collect( - $codebase, - $codebase->methods->getClassLikeStorageForMethod($method_id), - $class_storage, - $method_name_lc, - $lhs_type_part, - $lhs_var_id === '$this' - ); - - if ($lhs_var_id === '$this' && $parent_source instanceof FunctionLikeAnalyzer) { - $grandparent_source = $parent_source->getSource(); - - if ($grandparent_source instanceof TraitAnalyzer) { - $fq_trait_name = $grandparent_source->getFQCLN(); - - $fq_trait_name_lc = strtolower($fq_trait_name); - - $trait_storage = $codebase->classlike_storage_provider->get($fq_trait_name_lc); - - if (isset($trait_storage->methods[$method_name_lc])) { - $trait_method_id = new MethodIdentifier($trait_storage->name, $method_name_lc); - - $class_template_params = ClassTemplateParamCollector::collect( - $codebase, - $codebase->methods->getClassLikeStorageForMethod($trait_method_id), - $class_storage, - $method_name_lc, - $lhs_type_part, - true - ); - } - } - } - - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - try { - $method_storage = $codebase->methods->getStorage($declaring_method_id ?? $method_id); - } catch (UnexpectedValueException $e) { - $method_storage = null; - } - - $method_template_params = []; - - if ($method_storage && $method_storage->if_this_is_type) { - $method_template_result = new TemplateResult($method_storage->template_types ?: [], []); - - TemplateStandinTypeReplacer::replace( - clone $method_storage->if_this_is_type, - $method_template_result, - $codebase, - null, - new Union([$lhs_type_part]) - ); - - $method_template_params = $method_template_result->lower_bounds; - } - - $template_result = new TemplateResult([], $class_template_params ?: []); - $template_result->lower_bounds += $method_template_params; - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - ArgumentMapPopulator::recordArgumentPositions( - $statements_analyzer, - $stmt, - $codebase, - (string) $method_id - ); - } - - $is_first_class_callable = $stmt->isFirstClassCallable(); - - if (!$is_first_class_callable && self::checkMethodArgs( - $method_id, - $args, - $template_result, - $context, - new CodeLocation($source, $stmt_name), - $statements_analyzer - ) === false) { - return Type::getMixed(); - } - - $return_type_candidate = MethodCallReturnTypeFetcher::fetch( - $statements_analyzer, - $codebase, - $stmt, - $context, - $method_id, - $declaring_method_id, - $method_id, - $cased_method_id, - $lhs_type_part, - $static_type, - $args, - $result, - $template_result - ); - - if ($is_first_class_callable) { - return $return_type_candidate; - } - - $in_call_map = InternalCallMapHandler::inCallMap((string) ($declaring_method_id ?? $method_id)); - - if (!$in_call_map) { - $name_code_location = new CodeLocation($statements_analyzer, $stmt_name); - - MethodCallProhibitionAnalyzer::analyze( - $codebase, - $context, - $method_id, - $statements_analyzer->getFullyQualifiedFunctionMethodOrNamespaceName(), - $name_code_location, - $statements_analyzer->getSuppressedIssues() - ); - - $getter_return_type = self::getMagicGetterOrSetterProperty( - $statements_analyzer, - $stmt, - $stmt_name, - $context, - $fq_class_name - ); - - if ($getter_return_type) { - $return_type_candidate = $getter_return_type; - } - } - - if ($method_storage) { - if ($method_storage->if_this_is_type) { - $class_type = new Union([$lhs_type_part]); - $if_this_is_type = clone $method_storage->if_this_is_type; - - TemplateInferredTypeReplacer::replace($if_this_is_type, $template_result, $codebase); - - if (!UnionTypeComparator::isContainedBy($codebase, $class_type, $if_this_is_type)) { - IssueBuffer::maybeAdd( - new IfThisIsMismatch( - 'Class type must be ' . $method_storage->if_this_is_type->getId() - . ' current type ' . $class_type->getId(), - new CodeLocation($source, $stmt->name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($method_storage->self_out_type && $lhs_var_id) { - $self_out_candidate = clone $method_storage->self_out_type; - - if ($template_result->lower_bounds) { - $self_out_candidate = TypeExpander::expandUnion( - $codebase, - $self_out_candidate, - $fq_class_name, - null, - $class_storage->parent_class, - true, - false, - $static_type instanceof TNamedObject - && $codebase->classlike_storage_provider->get($static_type->value)->final, - true - ); - } - - $self_out_candidate = MethodCallReturnTypeFetcher::replaceTemplateTypes( - $self_out_candidate, - $template_result, - $method_id, - count($args), - $codebase - ); - - $self_out_candidate = TypeExpander::expandUnion( - $codebase, - $self_out_candidate, - $fq_class_name, - $static_type, - $class_storage->parent_class, - true, - false, - $static_type instanceof TNamedObject - && $codebase->classlike_storage_provider->get($static_type->value)->final, - true - ); - - $context->vars_in_scope[$lhs_var_id] = $self_out_candidate; - } - - if (!$context->collect_mutations && !$context->collect_initializations) { - MethodCallPurityAnalyzer::analyze( - $statements_analyzer, - $codebase, - $stmt, - $lhs_var_id, - $cased_method_id, - $method_id, - $method_storage, - $class_storage, - $context, - $config, - $result - ); - } - - $has_packed_arg = false; - foreach ($args as $arg) { - $has_packed_arg = $has_packed_arg || $arg->unpack; - } - - if (!$has_packed_arg) { - $has_variadic_param = $method_storage->variadic; - - foreach ($method_storage->params as $param) { - $has_variadic_param = $has_variadic_param || $param->is_variadic; - } - - for ($i = count($args), $j = count($method_storage->params); $i < $j; ++$i) { - $param = $method_storage->params[$i]; - - if (!$param->is_optional - && !$param->is_variadic - && !$in_call_map - ) { - $result->too_few_arguments = true; - $result->too_few_arguments_method_ids[] = $declaring_method_id ?? $method_id; - } - } - - if ($has_variadic_param || count($method_storage->params) >= count($args) || $in_call_map) { - $result->too_many_arguments = false; - } else { - $result->too_many_arguments_method_ids[] = $declaring_method_id ?? $method_id; - } - } - - $class_template_params = $template_result->lower_bounds; - - if ($method_storage->assertions) { - self::applyAssertionsToContext( - $stmt_name, - ExpressionIdentifier::getArrayVarId($stmt->var, null, $statements_analyzer), - $method_storage->assertions, - $args, - $class_template_params, - $context, - $statements_analyzer - ); - } - - if ($method_storage->if_true_assertions) { - $statements_analyzer->node_data->setIfTrueAssertions( - $stmt, - array_map( - function (Assertion $assertion) use ( - $class_template_params, - $lhs_var_id, - $codebase - ): Assertion { - return $assertion->getUntemplatedCopy( - $class_template_params ?: [], - $lhs_var_id, - $codebase - ); - }, - $method_storage->if_true_assertions - ) - ); - } - - if ($method_storage->if_false_assertions) { - $statements_analyzer->node_data->setIfFalseAssertions( - $stmt, - array_map( - function (Assertion $assertion) use ( - $class_template_params, - $lhs_var_id, - $codebase - ): Assertion { - return $assertion->getUntemplatedCopy( - $class_template_params ?: [], - $lhs_var_id, - $codebase - ); - }, - $method_storage->if_false_assertions - ) - ); - } - } - - if ($codebase->methods_to_rename) { - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - foreach ($codebase->methods_to_rename as $original_method_id => $new_method_name) { - if ($declaring_method_id && (strtolower((string) $declaring_method_id)) === $original_method_id) { - $file_manipulations = [ - new FileManipulation( - (int) $stmt_name->getAttribute('startFilePos'), - (int) $stmt_name->getAttribute('endFilePos') + 1, - $new_method_name - ) - ]; - - FileManipulationBuffer::add( - $statements_analyzer->getFilePath(), - $file_manipulations - ); - } - } - } - - if ($config->eventDispatcher->hasAfterMethodCallAnalysisHandlers()) { - $file_manipulations = []; - - $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if ($appearing_method_id !== null && $declaring_method_id !== null) { - $event = new AfterMethodCallAnalysisEvent( - $stmt, - (string) $method_id, - (string) $appearing_method_id, - (string) $declaring_method_id, - $context, - $statements_analyzer, - $codebase, - $file_manipulations, - $return_type_candidate - ); - - $config->eventDispatcher->dispatchAfterMethodCallAnalysis($event); - $file_manipulations = $event->getFileReplacements(); - $return_type_candidate = $event->getReturnTypeCandidate(); - } - - if ($file_manipulations) { - FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); - } - } - - return $return_type_candidate ?? Type::getMixed(); - } - - /** - * Check properties accessed with magic getters and setters. - * If `@psalm-seal-properties` is set, they must be defined. - * If an `@property` annotation is specified, the setter must set something with the correct - * type. - */ - private static function getMagicGetterOrSetterProperty( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\MethodCall $stmt, - PhpParser\Node\Identifier $stmt_name, - Context $context, - string $fq_class_name - ): ?Union { - $method_name = strtolower($stmt_name->name); - if (!in_array($method_name, ['__get', '__set'], true)) { - return null; - } - - $codebase = $statements_analyzer->getCodebase(); - - $first_arg_value = $stmt->getArgs()[0]->value ?? null; - - if (!$first_arg_value instanceof PhpParser\Node\Scalar\String_) { - return null; - } - - $prop_name = $first_arg_value->value; - $property_id = $fq_class_name . '::$' . $prop_name; - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $codebase->properties->propertyExists( - $property_id, - $method_name === '__get', - $statements_analyzer, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ); - - switch ($method_name) { - case '__set': - // If `@psalm-seal-properties` is set, the property must be defined with - // a `@property` annotation - if (($class_storage->sealed_properties || $codebase->config->seal_all_properties) - && !isset($class_storage->pseudo_property_set_types['$' . $prop_name]) - && IssueBuffer::accepts( - new UndefinedThisPropertyAssignment( - 'Instance property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ) - ) { - // fall through - } - - // If a `@property` annotation is set, the type of the value passed to the - // magic setter must match the annotation. - $second_arg_type = isset($stmt->getArgs()[1]) - ? $statements_analyzer->node_data->getType($stmt->getArgs()[1]->value) - : null; - - if (isset($class_storage->pseudo_property_set_types['$' . $prop_name]) && $second_arg_type) { - $pseudo_set_type = TypeExpander::expandUnion( - $codebase, - $class_storage->pseudo_property_set_types['$' . $prop_name], - $fq_class_name, - new TNamedObject($fq_class_name), - $class_storage->parent_class - ); - - $union_comparison_results = new TypeComparisonResult(); - - $type_match_found = UnionTypeComparator::isContainedBy( - $codebase, - $second_arg_type, - $pseudo_set_type, - $second_arg_type->ignore_nullable_issues, - $second_arg_type->ignore_falsable_issues, - $union_comparison_results - ); - - if ($union_comparison_results->type_coerced) { - if ($union_comparison_results->type_coerced_from_mixed) { - IssueBuffer::maybeAdd( - new MixedPropertyTypeCoercion( - $prop_name . ' expects \'' . $pseudo_set_type->getId() . '\', ' - . ' parent type `' . $second_arg_type . '` provided', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new PropertyTypeCoercion( - $prop_name . ' expects \'' . $pseudo_set_type->getId() . '\', ' - . ' parent type `' . $second_arg_type . '` provided', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if (!$type_match_found && !$union_comparison_results->type_coerced_from_mixed) { - if (UnionTypeComparator::canBeContainedBy( - $codebase, - $second_arg_type, - $pseudo_set_type - )) { - IssueBuffer::maybeAdd( - new PossiblyInvalidPropertyAssignmentValue( - $prop_name . ' with declared type \'' - . $pseudo_set_type - . '\' cannot be assigned possibly different type \'' . $second_arg_type . '\'', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidPropertyAssignmentValue( - $prop_name . ' with declared type \'' - . $pseudo_set_type - . '\' cannot be assigned type \'' . $second_arg_type . '\'', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - break; - - case '__get': - // If `@psalm-seal-properties` is set, the property must be defined with - // a `@property` annotation - if (($class_storage->sealed_properties || $codebase->config->seal_all_properties) - && !isset($class_storage->pseudo_property_get_types['$' . $prop_name]) - && IssueBuffer::accepts( - new UndefinedThisPropertyFetch( - 'Instance property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ) - ) { - // fall through - } - - if (isset($class_storage->pseudo_property_get_types['$' . $prop_name])) { - return clone $class_storage->pseudo_property_get_types['$' . $prop_name]; - } - - break; - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php deleted file mode 100644 index 29c8bf22..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php +++ /dev/null @@ -1,70 +0,0 @@ -methods; - - $method_id = $codebase_methods->getDeclaringMethodId($method_id); - - if ($method_id === null) { - return null; - } - - $storage = $codebase_methods->getStorage($method_id); - - if ($storage->deprecated) { - IssueBuffer::maybeAdd( - new DeprecatedMethod( - 'The method ' . $codebase_methods->getCasedMethodId($method_id) . - ' has been marked as deprecated', - $code_location, - (string) $method_id - ), - $suppressed_issues - ); - } - - if (!$context->collect_initializations - && !$context->collect_mutations - ) { - if (!NamespaceAnalyzer::isWithinAny($caller_identifier ?? "", $storage->internal)) { - IssueBuffer::maybeAdd( - new InternalMethod( - 'The method ' . $codebase_methods->getCasedMethodId($method_id) - . ' is internal to ' . InternalClass::listToPhrase($storage->internal) - . ' but called from ' . ($caller_identifier ?: 'root namespace'), - $code_location, - (string) $method_id - ), - $suppressed_issues - ); - } - } - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php deleted file mode 100644 index d0d49fdd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php +++ /dev/null @@ -1,173 +0,0 @@ -external_mutation_free - && $statements_analyzer->node_data->isPureCompatible($stmt->var); - - if ($context->pure - && !$method_storage->mutation_free - && !$method_pure_compatible - ) { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a non-mutation-free method ' - . $cased_method_id . ' from a pure context', - new CodeLocation($statements_analyzer, $stmt->name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($context->mutation_free - && !$method_storage->mutation_free - && !$method_pure_compatible - ) { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a possibly-mutating method ' - . $cased_method_id . ' from a mutation-free context', - new CodeLocation($statements_analyzer, $stmt->name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($context->external_mutation_free - && !$method_storage->mutation_free - && $method_id->fq_class_name !== $context->self - && !$method_pure_compatible - ) { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a possibly-mutating method ' - . $cased_method_id . ' from a mutation-free context', - new CodeLocation($statements_analyzer, $stmt->name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif (($method_storage->mutation_free - || ($method_storage->external_mutation_free - && ($stmt->var->getAttribute('external_mutation_free', false) - || $stmt->var->getAttribute('pure', false)) - )) - && !$context->inside_unset - ) { - if ($method_storage->mutation_free - && (!$method_storage->mutation_free_inferred - || $method_storage->final - || $method_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE) - && ($method_storage->immutable || $config->remember_property_assignments_after_call) - ) { - if ($context->inside_conditional - && !$method_storage->assertions - && !$method_storage->if_true_assertions - ) { - $stmt->setAttribute('memoizable', true); - - if ($method_storage->immutable) { - $stmt->setAttribute('pure', true); - } - } - - $result->can_memoize = true; - } - - if ($codebase->find_unused_variables - && !$context->inside_conditional - && !$context->inside_general_use - && !$context->inside_throw - ) { - if (!$context->inside_assignment - && !$context->inside_call - && !$context->inside_return - && !$method_storage->assertions - && !$method_storage->if_true_assertions - && !$method_storage->if_false_assertions - && !$method_storage->throws - ) { - IssueBuffer::maybeAdd( - new UnusedMethodCall( - 'The call to ' . $cased_method_id . ' is not used', - new CodeLocation($statements_analyzer, $stmt->name), - (string) $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif (!$method_storage->mutation_free_inferred) { - $stmt->setAttribute('pure', true); - } - } - } - - if ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - && !$method_storage->mutation_free - && !$method_pure_compatible - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - - if (!$config->remember_property_assignments_after_call - && !$method_storage->mutation_free - && !$method_pure_compatible - ) { - $context->removeMutableObjectVars(); - } elseif ($method_storage->this_property_mutations) { - if (!$method_pure_compatible) { - $context->removeMutableObjectVars(true); - } - - foreach ($method_storage->this_property_mutations as $name => $_) { - $mutation_var_id = $lhs_var_id . '->' . $name; - - $this_property_didnt_exist = $lhs_var_id === '$this' - && isset($context->vars_in_scope[$mutation_var_id]) - && !isset($class_storage->declaring_property_ids[$name]); - - if ($this_property_didnt_exist) { - $context->vars_in_scope[$mutation_var_id] = Type::getMixed(); - } else { - $new_type = AssignmentAnalyzer::getExpandedPropertyType( - $codebase, - $class_storage->name, - $name, - $class_storage - ) ?? Type::getMixed(); - - $context->vars_in_scope[$mutation_var_id] = $new_type; - $context->possibly_assigned_var_ids[$mutation_var_id] = true; - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php deleted file mode 100644 index 76d3dfa8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php +++ /dev/null @@ -1,634 +0,0 @@ - $args - */ - public static function fetch( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\MethodCall $stmt, - Context $context, - MethodIdentifier $method_id, - ?MethodIdentifier $declaring_method_id, - MethodIdentifier $premixin_method_id, - string $cased_method_id, - Atomic $lhs_type_part, - ?Atomic $static_type, - array $args, - AtomicMethodCallAnalysisResult $result, - TemplateResult $template_result - ): Union { - $call_map_id = $declaring_method_id ?? $method_id; - - $fq_class_name = $method_id->fq_class_name; - $method_name = $method_id->method_name; - - $class_storage = $codebase->methods->getClassLikeStorageForMethod($method_id); - $method_storage = ($class_storage->methods[$method_id->method_name] ?? null); - - if ($stmt->isFirstClassCallable()) { - if ($method_storage) { - return new Union([new TClosure( - 'Closure', - $method_storage->params, - $method_storage->return_type, - $method_storage->pure - )]); - } - - return Type::getClosure(); - } - - if ($codebase->methods->return_type_provider->has($premixin_method_id->fq_class_name)) { - $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( - $statements_analyzer, - $premixin_method_id->fq_class_name, - $premixin_method_id->method_name, - $stmt, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt->name), - $lhs_type_part instanceof TGenericObject ? $lhs_type_part->type_params : null - ); - - if ($return_type_candidate) { - return $return_type_candidate; - } - } - - if ($premixin_method_id->method_name === 'getcode' - && $premixin_method_id->fq_class_name !== Exception::class - && $premixin_method_id->fq_class_name !== RuntimeException::class - && $premixin_method_id->fq_class_name !== PDOException::class - && ( - $codebase->classImplements($premixin_method_id->fq_class_name, Throwable::class) - || $codebase->interfaceExtends($premixin_method_id->fq_class_name, Throwable::class) - ) - ) { - return Type::getInt(true); // TODO: Remove the flag in Psalm 5 - } - - if ($declaring_method_id && $declaring_method_id !== $method_id) { - $declaring_fq_class_name = $declaring_method_id->fq_class_name; - $declaring_method_name = $declaring_method_id->method_name; - - if ($codebase->methods->return_type_provider->has($declaring_fq_class_name)) { - $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( - $statements_analyzer, - $declaring_fq_class_name, - $declaring_method_name, - $stmt, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt->name), - $lhs_type_part instanceof TGenericObject ? $lhs_type_part->type_params : null, - $fq_class_name, - $method_name - ); - - if ($return_type_candidate) { - return $return_type_candidate; - } - } - } - - if (InternalCallMapHandler::inCallMap((string) $call_map_id)) { - if (($template_result->lower_bounds || $class_storage->stubbed) - && ($method_storage = ($class_storage->methods[$method_id->method_name] ?? null)) - && $method_storage->return_type - ) { - $return_type_candidate = clone $method_storage->return_type; - - $return_type_candidate = self::replaceTemplateTypes( - $return_type_candidate, - $template_result, - $method_id, - count($stmt->getArgs()), - $codebase - ); - } else { - $callmap_callables = InternalCallMapHandler::getCallablesFromCallMap((string) $call_map_id); - - if (!$callmap_callables || $callmap_callables[0]->return_type === null) { - throw new UnexpectedValueException('Shouldn’t get here'); - } - - $return_type_candidate = $callmap_callables[0]->return_type; - } - - if ($return_type_candidate->isFalsable()) { - $return_type_candidate->ignore_falsable_issues = true; - } - - $return_type_candidate = TypeExpander::expandUnion( - $codebase, - $return_type_candidate, - $fq_class_name, - $static_type, - $class_storage->parent_class, - true, - false, - false, - true - ); - } else { - $self_fq_class_name = $fq_class_name; - - $return_type_candidate = $codebase->methods->getMethodReturnType( - $method_id, - $self_fq_class_name, - $statements_analyzer, - $args - ); - - if ($return_type_candidate) { - $return_type_candidate = clone $return_type_candidate; - - if ($template_result->lower_bounds) { - $return_type_candidate = TypeExpander::expandUnion( - $codebase, - $return_type_candidate, - $fq_class_name, - null, - $class_storage->parent_class, - true, - false, - $static_type instanceof TNamedObject - && $codebase->classlike_storage_provider->get($static_type->value)->final, - true - ); - } - - $return_type_candidate = self::replaceTemplateTypes( - $return_type_candidate, - $template_result, - $method_id, - count($stmt->getArgs()), - $codebase - ); - - $return_type_candidate = TypeExpander::expandUnion( - $codebase, - $return_type_candidate, - $self_fq_class_name, - $static_type, - $class_storage->parent_class, - true, - false, - $static_type instanceof TNamedObject - && $codebase->classlike_storage_provider->get($static_type->value)->final, - true - ); - - $return_type_location = $codebase->methods->getMethodReturnTypeLocation( - $method_id, - $secondary_return_type_location - ); - - if ($secondary_return_type_location) { - $return_type_location = $secondary_return_type_location; - } - - $config = Config::getInstance(); - - // only check the type locally if it's defined externally - if ($return_type_location && !$config->isInProjectDirs($return_type_location->file_path)) { - $return_type_candidate->check( - $statements_analyzer, - new CodeLocation($statements_analyzer, $stmt), - $statements_analyzer->getSuppressedIssues(), - $context->phantom_classes, - true, - false, - false, - $context->calling_method_id - ); - } - } else { - $result->returns_by_ref = - $result->returns_by_ref - || $codebase->methods->getMethodReturnsByRef($method_id); - } - } - - if (!$return_type_candidate) { - $return_type_candidate = $method_name === '__tostring' ? Type::getString() : Type::getMixed(); - } - - self::taintMethodCallResult( - $statements_analyzer, - $return_type_candidate, - $stmt->name, - $stmt->var, - $args, - $method_id, - $declaring_method_id, - $cased_method_id, - $context - ); - - return $return_type_candidate; - } - - /** - * @param array $args - */ - public static function taintMethodCallResult( - StatementsAnalyzer $statements_analyzer, - Union $return_type_candidate, - PhpParser\Node $name_expr, - PhpParser\Node\Expr $var_expr, - array $args, - MethodIdentifier $method_id, - ?MethodIdentifier $declaring_method_id, - string $cased_method_id, - Context $context - ): void { - if (!$statements_analyzer->data_flow_graph - || !$declaring_method_id - ) { - return; - } - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - return; - } - - $codebase = $statements_analyzer->getCodebase(); - - $event = new AddRemoveTaintsEvent($var_expr, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - $method_storage = $codebase->methods->getStorage( - $declaring_method_id - ); - - $node_location = new CodeLocation($statements_analyzer, $name_expr); - - $is_declaring = (string) $declaring_method_id === (string) $method_id; - - $var_id = ExpressionIdentifier::getArrayVarId( - $var_expr, - null, - $statements_analyzer - ); - - if ($method_storage->specialize_call - && $var_id - && isset($context->vars_in_scope[$var_id]) - && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph - ) { - $var_nodes = []; - - $parent_nodes = $context->vars_in_scope[$var_id]->parent_nodes; - - $unspecialized_parent_nodes = array_filter( - $parent_nodes, - function ($parent_node) { - return !$parent_node->specialization_key; - } - ); - - $specialized_parent_nodes = array_filter( - $parent_nodes, - function ($parent_node) { - return (bool) $parent_node->specialization_key; - } - ); - - $var_node = DataFlowNode::getForAssignment( - $var_id, - new CodeLocation($statements_analyzer, $var_expr) - ); - - if ($method_storage->location) { - $this_parent_node = DataFlowNode::getForAssignment( - '$this in ' . $method_id, - $method_storage->location - ); - - foreach ($parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $this_parent_node, - '=', - $added_taints, - $removed_taints - ); - } - } - - $var_nodes[$var_node->id] = $var_node; - - $method_call_nodes = []; - - if ($unspecialized_parent_nodes) { - $method_call_node = DataFlowNode::getForMethodReturn( - (string) $method_id, - $cased_method_id, - $is_declaring ? ($method_storage->signature_return_type_location - ?: $method_storage->location) : null, - $node_location - ); - - $method_call_nodes[$method_call_node->id] = $method_call_node; - } - - foreach ($specialized_parent_nodes as $parent_node) { - $universal_method_call_node = DataFlowNode::getForMethodReturn( - (string) $method_id, - $cased_method_id, - $is_declaring ? ($method_storage->signature_return_type_location - ?: $method_storage->location) : null, - null - ); - - $method_call_node = new DataFlowNode( - strtolower((string) $method_id), - $cased_method_id, - $is_declaring ? ($method_storage->signature_return_type_location - ?: $method_storage->location) : null, - $parent_node->specialization_key - ); - - $statements_analyzer->data_flow_graph->addPath( - $universal_method_call_node, - $method_call_node, - '=', - $added_taints, - $removed_taints - ); - - $method_call_nodes[$method_call_node->id] = $method_call_node; - } - - if (!$method_call_nodes) { - return; - } - - foreach ($method_call_nodes as $method_call_node) { - $statements_analyzer->data_flow_graph->addNode($method_call_node); - - foreach ($var_nodes as $var_node) { - $statements_analyzer->data_flow_graph->addNode($var_node); - - $statements_analyzer->data_flow_graph->addPath( - $method_call_node, - $var_node, - 'method-call-' . $method_id->method_name, - $added_taints, - $removed_taints - ); - } - - if (!$is_declaring) { - $cased_declaring_method_id = $codebase->methods->getCasedMethodId($declaring_method_id); - - $declaring_method_call_node = new DataFlowNode( - strtolower((string) $declaring_method_id), - $cased_declaring_method_id, - $method_storage->signature_return_type_location ?: $method_storage->location, - $method_call_node->specialization_key - ); - - $statements_analyzer->data_flow_graph->addNode($declaring_method_call_node); - $statements_analyzer->data_flow_graph->addPath( - $declaring_method_call_node, - $method_call_node, - 'parent', - $added_taints, - $removed_taints - ); - } - } - - $return_type_candidate->parent_nodes = $method_call_nodes; - - $stmt_var_type = clone $context->vars_in_scope[$var_id]; - - $stmt_var_type->parent_nodes = $var_nodes; - - $context->vars_in_scope[$var_id] = $stmt_var_type; - } elseif ($method_storage->specialize_call - && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph - ) { - $method_call_node = DataFlowNode::getForMethodReturn( - (string) $method_id, - $cased_method_id, - $is_declaring - ? ($method_storage->signature_return_type_location ?: $method_storage->location) - : null, - $node_location - ); - - if (!$is_declaring) { - $cased_declaring_method_id = $codebase->methods->getCasedMethodId($declaring_method_id); - - $declaring_method_call_node = DataFlowNode::getForMethodReturn( - (string) $declaring_method_id, - $cased_declaring_method_id, - $method_storage->signature_return_type_location ?: $method_storage->location, - $node_location - ); - - $statements_analyzer->data_flow_graph->addNode($declaring_method_call_node); - $statements_analyzer->data_flow_graph->addPath( - $declaring_method_call_node, - $method_call_node, - 'parent', - $added_taints, - $removed_taints - ); - } - - $statements_analyzer->data_flow_graph->addNode($method_call_node); - - $return_type_candidate->parent_nodes = [ - $method_call_node->id => $method_call_node - ]; - } else { - $method_call_node = DataFlowNode::getForMethodReturn( - (string) $method_id, - $cased_method_id, - $is_declaring - ? ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - ? ($method_storage->signature_return_type_location ?: $method_storage->location) - : ($method_storage->return_type_location ?: $method_storage->location)) - : null, - null - ); - - if (!$is_declaring) { - $cased_declaring_method_id = $codebase->methods->getCasedMethodId($declaring_method_id); - - $declaring_method_call_node = DataFlowNode::getForMethodReturn( - (string) $declaring_method_id, - $cased_declaring_method_id, - $method_storage->signature_return_type_location ?: $method_storage->location, - null - ); - - $statements_analyzer->data_flow_graph->addNode($declaring_method_call_node); - $statements_analyzer->data_flow_graph->addPath( - $declaring_method_call_node, - $method_call_node, - 'parent', - $added_taints, - $removed_taints - ); - } - - $statements_analyzer->data_flow_graph->addNode($method_call_node); - - $return_type_candidate->parent_nodes = [ - $method_call_node->id => $method_call_node - ]; - } - - if ($method_storage->taint_source_types && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { - $method_node = TaintSource::getForMethodReturn( - (string) $method_id, - $cased_method_id, - $method_storage->signature_return_type_location ?: $method_storage->location - ); - - $method_node->taints = $method_storage->taint_source_types; - - $statements_analyzer->data_flow_graph->addSource($method_node); - } - - if (!$statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { - return; - } - - FunctionCallReturnTypeFetcher::taintUsingFlows( - $statements_analyzer, - $method_storage, - $statements_analyzer->data_flow_graph, - (string) $method_id, - $args, - $node_location, - $method_call_node, - $method_storage->removed_taints - ); - } - - public static function replaceTemplateTypes( - Union $return_type_candidate, - TemplateResult $template_result, - MethodIdentifier $method_id, - int $arg_count, - Codebase $codebase - ): Union { - if ($template_result->template_types) { - $bindable_template_types = $return_type_candidate->getTemplateTypes(); - - foreach ($bindable_template_types as $template_type) { - if ($template_type->defining_class !== $method_id->fq_class_name - && !isset( - $template_result->lower_bounds - [$template_type->param_name] - [$template_type->defining_class] - ) - ) { - if ($template_type->param_name === 'TFunctionArgCount') { - $template_result->lower_bounds[$template_type->param_name] = [ - 'fn-' . strtolower((string) $method_id) => [ - new TemplateBound( - Type::getInt(false, $arg_count) - ) - ] - ]; - } elseif ($template_type->param_name === 'TPhpMajorVersion') { - $template_result->lower_bounds[$template_type->param_name] = [ - 'fn-' . strtolower((string) $method_id) => [ - new TemplateBound( - Type::getInt(false, $codebase->php_major_version) - ) - ] - ]; - } elseif ($template_type->param_name === 'TPhpVersionId') { - $template_result->lower_bounds[$template_type->param_name] = [ - 'fn-' . strtolower((string) $method_id) => [ - new TemplateBound( - Type::getInt( - false, - 10000 * $codebase->php_major_version - + 100 * $codebase->php_minor_version - ) - ) - ] - ]; - } else { - $template_result->lower_bounds[$template_type->param_name] = [ - ($template_type->defining_class) => [ - new TemplateBound(Type::getEmpty()) - ] - ]; - } - } - } - } - - if ($template_result->lower_bounds) { - $return_type_candidate = TypeExpander::expandUnion( - $codebase, - $return_type_candidate, - null, - null, - null - ); - - TemplateInferredTypeReplacer::replace( - $return_type_candidate, - $template_result, - $codebase - ); - } - - return $return_type_candidate; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php deleted file mode 100644 index 48ff4dac..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php +++ /dev/null @@ -1,196 +0,0 @@ -getCodebase(); - $codebase_methods = $codebase->methods; - $codebase_classlikes = $codebase->classlikes; - - $fq_classlike_name = $method_id->fq_class_name; - $method_name = $method_id->method_name; - - if ($codebase_methods->visibility_provider->has($fq_classlike_name)) { - $method_visible = $codebase_methods->visibility_provider->isMethodVisible( - $source, - $fq_classlike_name, - $method_name, - $context, - $code_location - ); - - if ($method_visible === false) { - if (IssueBuffer::accepts( - new InaccessibleMethod( - 'Cannot access method ' . $codebase_methods->getCasedMethodId($method_id) . - ' from context ' . $context->self, - $code_location - ), - $suppressed_issues - )) { - return false; - } - } elseif ($method_visible === true) { - return false; - } - } - - $declaring_method_id = $codebase_methods->getDeclaringMethodId($method_id); - - if (!$declaring_method_id) { - if ($method_name === '__construct' - || ($method_id->fq_class_name === 'Closure' - && ($method_id->method_name === 'fromcallable' - || $method_id->method_name === '__invoke')) - ) { - return null; - } - - if (InternalCallMapHandler::inCallMap((string) $method_id)) { - return null; - } - - throw new UnexpectedValueException('$declaring_method_id not expected to be null here'); - } - - $appearing_method_id = $codebase_methods->getAppearingMethodId($method_id); - - $appearing_method_class = null; - $appearing_class_storage = null; - $appearing_method_name = null; - - if ($appearing_method_id) { - $appearing_method_class = $appearing_method_id->fq_class_name; - $appearing_method_name = $appearing_method_id->method_name; - - // if the calling class is the same, we know the method exists, so it must be visible - if ($appearing_method_class === $context->self) { - return null; - } - - $appearing_class_storage = $codebase->classlike_storage_provider->get($appearing_method_class); - } - - $declaring_method_class = $declaring_method_id->fq_class_name; - - if ($source->getSource() instanceof TraitAnalyzer - && strtolower($declaring_method_class) === strtolower((string) $source->getFQCLN()) - ) { - return null; - } - - $storage = $codebase->methods->getStorage($declaring_method_id); - $visibility = $storage->visibility; - - if ($appearing_method_name - && isset($appearing_class_storage->trait_visibility_map[$appearing_method_name]) - ) { - $visibility = $appearing_class_storage->trait_visibility_map[$appearing_method_name]; - } - - // Get oldest ancestor declaring $method_id - $overridden_method_ids = $codebase_methods->getOverriddenMethodIds($method_id); - // Remove traits and interfaces - while (($oldest_declaring_method_id = end($overridden_method_ids)) - && !$codebase_classlikes->hasFullyQualifiedClassName($oldest_declaring_method_id->fq_class_name) - ) { - array_pop($overridden_method_ids); - } - if (empty($overridden_method_ids)) { - // We prefer appearing method id over declaring method id because declaring method id could be a trait - $oldest_ancestor_declaring_method_id = $appearing_method_id; - } else { - // Oldest ancestor is at end of array - $oldest_ancestor_declaring_method_id = array_pop($overridden_method_ids); - } - $oldest_ancestor_declaring_method_class = $oldest_ancestor_declaring_method_id->fq_class_name ?? null; - - switch ($visibility) { - case ClassLikeAnalyzer::VISIBILITY_PUBLIC: - return null; - - case ClassLikeAnalyzer::VISIBILITY_PRIVATE: - if (!$context->self || $appearing_method_class !== $context->self) { - if (IssueBuffer::accepts( - new InaccessibleMethod( - 'Cannot access private method ' . $codebase_methods->getCasedMethodId($method_id) . - ' from context ' . $context->self, - $code_location - ), - $suppressed_issues - )) { - return false; - } - } - - return null; - - case ClassLikeAnalyzer::VISIBILITY_PROTECTED: - if (!$context->self) { - if (IssueBuffer::accepts( - new InaccessibleMethod( - 'Cannot access protected method ' . $method_id, - $code_location - ), - $suppressed_issues - )) { - return false; - } - - return null; - } - - if ($oldest_ancestor_declaring_method_class !== null - && $codebase_classlikes->classExtends($oldest_ancestor_declaring_method_class, $context->self) - ) { - return null; - } - - if ($oldest_ancestor_declaring_method_class !== null - && !$codebase_classlikes->classExtends($context->self, $oldest_ancestor_declaring_method_class) - && !$codebase_classlikes->classExtends($declaring_method_class, $context->self) - ) { - if (IssueBuffer::accepts( - new InaccessibleMethod( - 'Cannot access protected method ' . $codebase_methods->getCasedMethodId($method_id) . - ' from context ' . $context->self, - $code_location - ), - $suppressed_issues - )) { - return false; - } - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php deleted file mode 100644 index c8c3c70d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php +++ /dev/null @@ -1,454 +0,0 @@ -fq_class_name; - $method_name_lc = $method_id->method_name; - - if ($stmt->isFirstClassCallable()) { - if (isset($class_storage->pseudo_methods[$method_name_lc])) { - $result->has_valid_method_call_type = true; - $result->existent_method_ids[] = $method_id->__toString(); - $result->return_type = self::createFirstClassCallableReturnType( - $class_storage->pseudo_methods[$method_name_lc] - ); - } else { - $result->non_existent_magic_method_ids[] = $method_id->__toString(); - $result->return_type = self::createFirstClassCallableReturnType(); - } - - return null; - } - - if ($codebase->methods->return_type_provider->has($fq_class_name)) { - $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( - $statements_analyzer, - $method_id->fq_class_name, - $method_id->method_name, - $stmt, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt->name) - ); - - if ($return_type_candidate) { - if ($all_intersection_return_type) { - $return_type_candidate = Type::intersectUnionTypes( - $all_intersection_return_type, - $return_type_candidate, - $codebase - ) ?? Type::getMixed(); - } - - $result->return_type = Type::combineUnionTypes( - $return_type_candidate, - $result->return_type, - $codebase - ); - - CallAnalyzer::checkMethodArgs( - $method_id, - $stmt->getArgs(), - null, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer - ); - - return null; - } - } - - $found_method_and_class_storage = self::findPseudoMethodAndClassStorages( - $codebase, - $class_storage, - $method_name_lc - ); - - if ($found_method_and_class_storage) { - $result->has_valid_method_call_type = true; - $result->existent_method_ids[] = $method_id->__toString(); - - [$pseudo_method_storage, $defining_class_storage] = $found_method_and_class_storage; - - $found_generic_params = ClassTemplateParamCollector::collect( - $codebase, - $defining_class_storage, - $class_storage, - $method_name_lc, - $lhs_type_part, - !$statements_analyzer->isStatic() && $method_id->fq_class_name === $context->self - ); - - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - $pseudo_method_storage->params, - (string) $method_id, - true, - $context, - $found_generic_params ? new TemplateResult([], $found_generic_params) : null - ); - - ArgumentsAnalyzer::checkArgumentsMatch( - $statements_analyzer, - $stmt->getArgs(), - null, - $pseudo_method_storage->params, - $pseudo_method_storage, - null, - $found_generic_params ? new TemplateResult([], $found_generic_params) : null, - new CodeLocation($statements_analyzer, $stmt), - $context - ); - - if ($pseudo_method_storage->return_type) { - $return_type_candidate = clone $pseudo_method_storage->return_type; - - if ($found_generic_params) { - TemplateInferredTypeReplacer::replace( - $return_type_candidate, - new TemplateResult([], $found_generic_params), - $codebase - ); - } - - $return_type_candidate = TypeExpander::expandUnion( - $codebase, - $return_type_candidate, - $defining_class_storage->name, - $lhs_type_part instanceof Atomic\TNamedObject ? $lhs_type_part : $fq_class_name, - $defining_class_storage->parent_class - ); - - if ($all_intersection_return_type) { - $return_type_candidate = Type::intersectUnionTypes( - $all_intersection_return_type, - $return_type_candidate, - $codebase - ) ?? Type::getMixed(); - } - - $result->return_type = Type::combineUnionTypes( - $return_type_candidate, - $result->return_type, - $codebase - ); - - return null; - } - } elseif ($all_intersection_return_type === null) { - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ); - - if ($class_storage->sealed_methods || $config->seal_all_methods) { - $result->non_existent_magic_method_ids[] = $method_id->__toString(); - - return null; - } - } - - $result->has_valid_method_call_type = true; - $result->existent_method_ids[] = $method_id->__toString(); - - $array_values = array_map( - /** - * @return PhpParser\Node\Expr\ArrayItem - */ - function (PhpParser\Node\Arg $arg): PhpParser\Node\Expr\ArrayItem { - return new VirtualArrayItem( - $arg->value, - null, - false, - $arg->getAttributes() - ); - }, - $stmt->getArgs() - ); - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - return new AtomicCallContext( - new MethodIdentifier($fq_class_name, '__call'), - [ - new VirtualArg( - new VirtualString($method_name_lc), - false, - false, - $stmt->getAttributes() - ), - new VirtualArg( - new VirtualArray( - $array_values, - $stmt->getAttributes() - ), - false, - false, - $stmt->getAttributes() - ), - ] - ); - } - - /** - * @param array $all_intersection_existent_method_ids - */ - public static function handleMissingOrMagicMethod( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\MethodCall $stmt, - MethodIdentifier $method_id, - bool $is_interface, - Context $context, - Config $config, - ?Union $all_intersection_return_type, - array $all_intersection_existent_method_ids, - ?string $intersection_method_id, - string $cased_method_id, - AtomicMethodCallAnalysisResult $result, - ?Atomic $lhs_type_part - ): void { - $fq_class_name = $method_id->fq_class_name; - $method_name_lc = $method_id->method_name; - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $found_method_and_class_storage = self::findPseudoMethodAndClassStorages( - $codebase, - $class_storage, - $method_name_lc - ); - - if (($is_interface || $config->use_phpdoc_method_without_magic_or_parent) - && $found_method_and_class_storage - ) { - $result->has_valid_method_call_type = true; - $result->existent_method_ids[] = $method_id->__toString(); - - [$pseudo_method_storage, $defining_class_storage] = $found_method_and_class_storage; - - if ($stmt->isFirstClassCallable()) { - $result->return_type = self::createFirstClassCallableReturnType($pseudo_method_storage); - return; - } - - $found_generic_params = ClassTemplateParamCollector::collect( - $codebase, - $defining_class_storage, - $class_storage, - $method_name_lc, - $lhs_type_part, - !$statements_analyzer->isStatic() && $method_id->fq_class_name === $context->self - ); - - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - $pseudo_method_storage->params, - (string) $method_id, - true, - $context, - $found_generic_params ? new TemplateResult([], $found_generic_params) : null - ) === false) { - return; - } - - if (ArgumentsAnalyzer::checkArgumentsMatch( - $statements_analyzer, - $stmt->getArgs(), - null, - $pseudo_method_storage->params, - $pseudo_method_storage, - null, - $found_generic_params ? new TemplateResult([], $found_generic_params) : null, - new CodeLocation($statements_analyzer, $stmt->name), - $context - ) === false) { - return; - } - - if ($pseudo_method_storage->return_type) { - $return_type_candidate = clone $pseudo_method_storage->return_type; - - if ($found_generic_params) { - TemplateInferredTypeReplacer::replace( - $return_type_candidate, - new TemplateResult([], $found_generic_params), - $codebase - ); - } - - if ($all_intersection_return_type) { - $return_type_candidate = Type::intersectUnionTypes( - $all_intersection_return_type, - $return_type_candidate, - $codebase - ) ?? Type::getMixed(); - } - - $return_type_candidate = TypeExpander::expandUnion( - $codebase, - $return_type_candidate, - $defining_class_storage->name, - $lhs_type_part instanceof Atomic\TNamedObject ? $lhs_type_part : $fq_class_name, - $defining_class_storage->parent_class, - true, - false, - $class_storage->final - ); - - $result->return_type = Type::combineUnionTypes($return_type_candidate, $result->return_type); - - return; - } - - $result->return_type = Type::getMixed(); - - return; - } - - if ($stmt->isFirstClassCallable()) { - $result->non_existent_class_method_ids[] = $method_id->__toString(); - $result->return_type = self::createFirstClassCallableReturnType(); - return; - } - - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ) === false) { - return; - } - - if ($all_intersection_return_type && $all_intersection_existent_method_ids) { - $result->existent_method_ids = array_merge( - $result->existent_method_ids, - $all_intersection_existent_method_ids - ); - - $result->return_type = Type::combineUnionTypes($all_intersection_return_type, $result->return_type); - - return; - } - - if ((!$is_interface && !$config->use_phpdoc_method_without_magic_or_parent) - || !isset($class_storage->pseudo_methods[$method_name_lc]) - ) { - if ($is_interface) { - $result->non_existent_interface_method_ids[] = $intersection_method_id ?: $cased_method_id; - } else { - $result->non_existent_class_method_ids[] = $intersection_method_id ?: $cased_method_id; - } - } - } - - private static function createFirstClassCallableReturnType(?MethodStorage $method_storage = null): Union - { - if ($method_storage) { - return new Union([new TClosure( - 'Closure', - $method_storage->params, - $method_storage->return_type, - $method_storage->pure - )]); - } - - return Type::getClosure(); - } - - /** - * Try to find matching pseudo method over ancestors (including interfaces). - * - * Returns the pseudo method if exists, with its defining class storage. - * If the method is not declared, null is returned. - * - * @param Codebase $codebase - * @param ClassLikeStorage $static_class_storage The called class - * @param lowercase-string $method_name_lc - * - * @return array{MethodStorage, ClassLikeStorage} - */ - private static function findPseudoMethodAndClassStorages( - Codebase $codebase, - ClassLikeStorage $static_class_storage, - string $method_name_lc - ): ?array { - if (isset($static_class_storage->declaring_pseudo_method_ids[$method_name_lc])) { - $method_id = $static_class_storage->declaring_pseudo_method_ids[$method_name_lc]; - $class_storage = $codebase->classlikes->getStorageFor($method_id->fq_class_name); - - if ($class_storage && isset($class_storage->pseudo_methods[$method_name_lc])) { - return [$class_storage->pseudo_methods[$method_name_lc], $class_storage]; - } - } - - if ($pseudo_method_storage = $static_class_storage->pseudo_methods[$method_name_lc] ?? null) { - return [$pseudo_method_storage, $static_class_storage]; - } - - $ancestors = $static_class_storage->class_implements; - - foreach ($ancestors as $fq_class_name => $_) { - $class_storage = $codebase->classlikes->getStorageFor($fq_class_name); - - if ($class_storage && isset($class_storage->pseudo_methods[$method_name_lc])) { - return [ - $class_storage->pseudo_methods[$method_name_lc], - $class_storage - ]; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php deleted file mode 100644 index 04f0b96c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php +++ /dev/null @@ -1,437 +0,0 @@ -inside_call; - - $context->inside_call = true; - - $existing_stmt_var_type = null; - - if (!$real_method_call) { - $existing_stmt_var_type = $statements_analyzer->node_data->getType($stmt->var); - } - - if ($existing_stmt_var_type) { - $statements_analyzer->node_data->setType($stmt->var, $existing_stmt_var_type); - } elseif (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->var, $context) === false) { - $context->inside_call = $was_inside_call; - - return false; - } - - if (!$stmt->name instanceof PhpParser\Node\Identifier) { - $context->inside_call = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->name, $context) === false) { - $context->inside_call = $was_inside_call; - - return false; - } - } - - $context->inside_call = $was_inside_call; - - if ($stmt->var instanceof PhpParser\Node\Expr\Variable) { - if (is_string($stmt->var->name) && $stmt->var->name === 'this' && !$statements_analyzer->getFQCLN()) { - if (IssueBuffer::accepts( - new InvalidScope( - 'Use of $this in non-class context', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } - } - - $lhs_var_id = ExpressionIdentifier::getArrayVarId( - $stmt->var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $class_type = $lhs_var_id && $context->hasVariable($lhs_var_id) - ? $context->vars_in_scope[$lhs_var_id] - : null; - - if ($stmt_var_type = $statements_analyzer->node_data->getType($stmt->var)) { - $class_type = $stmt_var_type; - } elseif (!$class_type) { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } - - if (!$context->check_classes) { - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ) === false) { - return false; - } - - return true; - } - - if ($class_type - && $stmt->name instanceof PhpParser\Node\Identifier - && ($class_type->isNull() || $class_type->isVoid()) - ) { - if (IssueBuffer::accepts( - new NullReference( - 'Cannot call method ' . $stmt->name->name . ' on null value', - new CodeLocation($statements_analyzer->getSource(), $stmt->name) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - return true; - } - - if ($class_type - && $stmt->name instanceof PhpParser\Node\Identifier - && $class_type->isNullable() - && !$class_type->ignore_nullable_issues - && !($stmt->name->name === 'offsetGet' && $context->inside_isset) - && !self::hasNullsafe($stmt->var) - ) { - IssueBuffer::maybeAdd( - new PossiblyNullReference( - 'Cannot call method ' . $stmt->name->name . ' on possibly null value', - new CodeLocation($statements_analyzer->getSource(), $stmt->name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($class_type - && $stmt->name instanceof PhpParser\Node\Identifier - && $class_type->isFalsable() - && !$class_type->ignore_falsable_issues - ) { - IssueBuffer::maybeAdd( - new PossiblyFalseReference( - 'Cannot call method ' . $stmt->name->name . ' on possibly false value', - new CodeLocation($statements_analyzer->getSource(), $stmt->name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $codebase = $statements_analyzer->getCodebase(); - - $source = $statements_analyzer->getSource(); - - if (!$class_type) { - $class_type = Type::getMixed(); - } - - $lhs_types = $class_type->getAtomicTypes(); - - $result = new AtomicMethodCallAnalysisResult(); - - $possible_new_class_types = []; - foreach ($lhs_types as $lhs_type_part) { - AtomicMethodCallAnalyzer::analyze( - $statements_analyzer, - $stmt, - $codebase, - $context, - $class_type, - $lhs_type_part, - $lhs_type_part instanceof TNamedObject - || $lhs_type_part instanceof TTemplateParam - ? $lhs_type_part - : null, - false, - $lhs_var_id, - $result - ); - if (isset($context->vars_in_scope[$lhs_var_id]) - && ($possible_new_class_type = $context->vars_in_scope[$lhs_var_id]) instanceof Union - && !$possible_new_class_type->equals($class_type)) { - $possible_new_class_types[] = $context->vars_in_scope[$lhs_var_id]; - } - } - if (!$stmt->isFirstClassCallable() - && !$stmt->getArgs() - && $lhs_var_id && $stmt->name instanceof PhpParser\Node\Identifier - ) { - if ($codebase->config->memoize_method_calls || $result->can_memoize) { - $method_var_id = $lhs_var_id . '->' . strtolower($stmt->name->name) . '()'; - - if (isset($context->vars_in_scope[$method_var_id])) { - $result->return_type = clone $context->vars_in_scope[$method_var_id]; - } elseif ($result->return_type !== null) { - $context->vars_in_scope[$method_var_id] = $result->return_type; - $context->vars_in_scope[$method_var_id]->has_mutations = false; - } - - if ($result->can_memoize) { - $stmt->setAttribute('memoizable', true); - } - } - } - - if (count($possible_new_class_types) > 0) { - $class_type = array_reduce( - $possible_new_class_types, - function (?Union $type_1, Union $type_2) use ($codebase): Union { - return Type::combineUnionTypes($type_1, $type_2, $codebase); - } - ); - } - - if ($result->invalid_method_call_types) { - $invalid_class_type = $result->invalid_method_call_types[0]; - - if ($result->has_valid_method_call_type || $result->has_mixed_method_call) { - IssueBuffer::maybeAdd( - new PossiblyInvalidMethodCall( - 'Cannot call method on possible ' . $invalid_class_type . ' variable ' . $lhs_var_id, - new CodeLocation($source, $stmt->name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidMethodCall( - 'Cannot call method on ' . $invalid_class_type . ' variable ' . $lhs_var_id, - new CodeLocation($source, $stmt->name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($result->non_existent_magic_method_ids) { - if ($context->check_methods) { - IssueBuffer::maybeAdd( - new UndefinedMagicMethod( - 'Magic method ' . $result->non_existent_magic_method_ids[0] . ' does not exist', - new CodeLocation($source, $stmt->name), - $result->non_existent_magic_method_ids[0] - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($result->non_existent_class_method_ids) { - if ($context->check_methods) { - if ($result->existent_method_ids || $result->has_mixed_method_call) { - IssueBuffer::maybeAdd( - new PossiblyUndefinedMethod( - 'Method ' . $result->non_existent_class_method_ids[0] . ' does not exist', - new CodeLocation($source, $stmt->name), - $result->non_existent_class_method_ids[0] - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new UndefinedMethod( - 'Method ' . $result->non_existent_class_method_ids[0] . ' does not exist', - new CodeLocation($source, $stmt->name), - $result->non_existent_class_method_ids[0] - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - return true; - } - - if ($result->non_existent_interface_method_ids) { - if ($context->check_methods) { - if ($result->existent_method_ids || $result->has_mixed_method_call) { - IssueBuffer::maybeAdd( - new PossiblyUndefinedMethod( - 'Method ' . $result->non_existent_interface_method_ids[0] . ' does not exist', - new CodeLocation($source, $stmt->name), - $result->non_existent_interface_method_ids[0] - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new UndefinedInterfaceMethod( - 'Method ' . $result->non_existent_interface_method_ids[0] . ' does not exist', - new CodeLocation($source, $stmt->name), - $result->non_existent_interface_method_ids[0] - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - return true; - } - - if ($result->too_many_arguments && $result->too_many_arguments_method_ids) { - $error_method_id = $result->too_many_arguments_method_ids[0]; - - IssueBuffer::maybeAdd( - new TooManyArguments( - 'Too many arguments for method ' . $error_method_id . ' - saw ' . count($stmt->getArgs()), - new CodeLocation($source, $stmt->name), - (string) $error_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($result->too_few_arguments && $result->too_few_arguments_method_ids) { - $error_method_id = $result->too_few_arguments_method_ids[0]; - - IssueBuffer::maybeAdd( - new TooFewArguments( - 'Too few arguments for method ' . $error_method_id . ' saw ' . count($stmt->getArgs()), - new CodeLocation($source, $stmt->name), - (string) $error_method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $stmt_type = $result->return_type; - - if ($stmt_type) { - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - if ($stmt_type->isNever()) { - $context->has_returned = true; - } - } - - if ($result->returns_by_ref) { - if (!$stmt_type) { - $stmt_type = Type::getMixed(); - $statements_analyzer->node_data->setType($stmt, $stmt_type); - } - - $stmt_type->by_ref = $result->returns_by_ref; - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - && $stmt_type - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt->name, - $stmt_type->getId(), - $stmt - ); - } - - if (!$result->existent_method_ids) { - return $stmt->isFirstClassCallable() || self::checkMethodArgs( - null, - $stmt->getArgs(), - null, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer - ); - } - - // if we called a method on this nullable variable, remove the nullable status here - // because any further calls must have worked - if ($lhs_var_id - && !$class_type->isMixed() - && $result->has_valid_method_call_type - && !$result->has_mixed_method_call - && !$result->invalid_method_call_types - && ($class_type->from_docblock || $class_type->isNullable()) - && $real_method_call - ) { - $keys_to_remove = []; - - $class_type = clone $class_type; - - foreach ($class_type->getAtomicTypes() as $key => $type) { - if (!$type instanceof TNamedObject) { - $keys_to_remove[] = $key; - } else { - $type->from_docblock = false; - } - } - - foreach ($keys_to_remove as $key) { - $class_type->removeType($key); - } - - $class_type->from_docblock = false; - - $context->removeVarFromConflictingClauses($lhs_var_id, null, $statements_analyzer); - - $context->vars_in_scope[$lhs_var_id] = $class_type; - } - - return true; - } - - public static function hasNullsafe(PhpParser\Node\Expr $expr): bool - { - if ($expr instanceof PhpParser\Node\Expr\MethodCall - || $expr instanceof PhpParser\Node\Expr\PropertyFetch - ) { - return self::hasNullsafe($expr->var); - } - - return $expr instanceof PhpParser\Node\Expr\NullsafeMethodCall - || $expr instanceof PhpParser\Node\Expr\NullsafePropertyFetch; - } -} 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 deleted file mode 100644 index cb914341..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php +++ /dev/null @@ -1,586 +0,0 @@ -isFirstClassCallable()) { - return; - } - - $first_arg = $stmt->getArgs()[0] ?? null; - - if ($function_id === 'method_exists') { - $second_arg = $stmt->getArgs()[1] ?? null; - - if ($first_arg - && $first_arg->value instanceof PhpParser\Node\Expr\Variable - && $second_arg - && $second_arg->value instanceof PhpParser\Node\Scalar\String_ - ) { - // do nothing - } else { - $context->check_methods = false; - } - - return; - } - - if ($function_id === 'class_exists') { - if ($first_arg) { - if ($first_arg->value instanceof PhpParser\Node\Scalar\String_) { - if (!$codebase->classlikes->classExists($first_arg->value->value)) { - $context->phantom_classes[strtolower($first_arg->value->value)] = true; - } - } elseif ($first_arg->value instanceof PhpParser\Node\Expr\ClassConstFetch - && $first_arg->value->class instanceof PhpParser\Node\Name - && $first_arg->value->name instanceof PhpParser\Node\Identifier - && $first_arg->value->name->name === 'class' - ) { - $resolved_name = (string) $first_arg->value->class->getAttribute('resolvedName'); - - if (!$codebase->classlikes->classExists($resolved_name)) { - $context->phantom_classes[strtolower($resolved_name)] = true; - } - } - } - - return; - } - - if ($function_id === 'interface_exists') { - if ($first_arg) { - if ($first_arg->value instanceof PhpParser\Node\Scalar\String_) { - $context->phantom_classes[strtolower($first_arg->value->value)] = true; - } elseif ($first_arg->value instanceof PhpParser\Node\Expr\ClassConstFetch - && $first_arg->value->class instanceof PhpParser\Node\Name - && $first_arg->value->name instanceof PhpParser\Node\Identifier - && $first_arg->value->name->name === 'class' - ) { - $resolved_name = (string) $first_arg->value->class->getAttribute('resolvedName'); - - if (!$codebase->classlikes->interfaceExists($resolved_name)) { - $context->phantom_classes[strtolower($resolved_name)] = true; - } - } - } - - return; - } - - if (in_array($function_id, ['is_file', 'file_exists']) && $first_arg) { - $var_id = ExpressionIdentifier::getArrayVarId($first_arg->value, null); - - if ($var_id) { - $context->phantom_files[$var_id] = true; - } - - return; - } - - if ($function_id === 'extension_loaded') { - if ($first_arg - && $first_arg->value instanceof PhpParser\Node\Scalar\String_ - ) { - if (@extension_loaded($first_arg->value->value)) { - // do nothing - } else { - $context->check_classes = false; - } - } - - return; - } - - if ($function_id === 'function_exists') { - $context->check_functions = false; - return; - } - - if ($function_id === 'is_callable') { - $context->check_methods = false; - $context->check_functions = false; - return; - } - - if ($function_id === 'defined') { - $context->check_consts = false; - return; - } - - if ($function_id === 'extract') { - $context->check_variables = false; - - foreach ($context->vars_in_scope as $var_id => $_) { - if ($var_id === '$this' || strpos($var_id, '[') || strpos($var_id, '>')) { - continue; - } - - $mixed_type = Type::getMixed(); - $mixed_type->parent_nodes = $context->vars_in_scope[$var_id]->parent_nodes; - - $context->vars_in_scope[$var_id] = $mixed_type; - $context->assigned_var_ids[$var_id] = (int) $stmt->getAttribute('startFilePos'); - $context->possibly_assigned_var_ids[$var_id] = true; - } - - return; - } - - if ($function_id === 'compact') { - $all_args_string_literals = true; - $new_items = []; - - foreach ($stmt->getArgs() as $arg) { - $arg_type = $statements_analyzer->node_data->getType($arg->value); - - if (!$arg_type || !$arg_type->isSingleStringLiteral()) { - $all_args_string_literals = false; - break; - } - - $var_name = $arg_type->getSingleStringLiteral()->value; - - $new_items[] = new VirtualArrayItem( - new VirtualVariable($var_name, $arg->value->getAttributes()), - new VirtualString($var_name, $arg->value->getAttributes()), - false, - $arg->getAttributes() - ); - } - - if ($all_args_string_literals) { - $arr = new VirtualArray($new_items, $stmt->getAttributes()); - $old_node_data = $statements_analyzer->node_data; - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - ExpressionAnalyzer::analyze($statements_analyzer, $arr, $context); - - $arr_type = $statements_analyzer->node_data->getType($arr); - - $statements_analyzer->node_data = $old_node_data; - - if ($arr_type) { - $statements_analyzer->node_data->setType($stmt, $arr_type); - } - } - - return; - } - - if ($function_id === 'func_get_args') { - $source = $statements_analyzer->getSource(); - - if ($source instanceof FunctionLikeAnalyzer) { - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - foreach ($source->param_nodes as $param_node) { - $statements_analyzer->data_flow_graph->addPath( - $param_node, - new DataFlowNode('variable-use', 'variable use', null), - 'variable-use' - ); - } - } - } - - return; - } - - if ($function_id === 'var_dump' - || $function_id === 'shell_exec' - ) { - IssueBuffer::maybeAdd( - new ForbiddenCode( - 'Unsafe ' . implode('', $function_name->parts), - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (isset($codebase->config->forbidden_functions[strtolower((string) $function_name)])) { - IssueBuffer::maybeAdd( - new ForbiddenCode( - 'You have forbidden the use of ' . $function_name, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - if ($function_id === 'define') { - if ($first_arg) { - $fq_const_name = ConstFetchAnalyzer::getConstName( - $first_arg->value, - $statements_analyzer->node_data, - $codebase, - $statements_analyzer->getAliases() - ); - - if ($fq_const_name !== null && isset($stmt->getArgs()[1])) { - $second_arg = $stmt->getArgs()[1]; - $was_in_call = $context->inside_call; - $context->inside_call = true; - ExpressionAnalyzer::analyze($statements_analyzer, $second_arg->value, $context); - $context->inside_call = $was_in_call; - - ConstFetchAnalyzer::setConstType( - $statements_analyzer, - $fq_const_name, - $statements_analyzer->node_data->getType($second_arg->value) ?? Type::getMixed(), - $context - ); - } - } else { - $context->check_consts = false; - } - - return; - } - - if ($function_id === 'constant') { - if ($first_arg) { - $fq_const_name = ConstFetchAnalyzer::getConstName( - $first_arg->value, - $statements_analyzer->node_data, - $codebase, - $statements_analyzer->getAliases() - ); - - if ($fq_const_name !== null) { - $const_type = ConstFetchAnalyzer::getConstType( - $statements_analyzer, - $fq_const_name, - true, - $context - ); - - if ($const_type) { - $statements_analyzer->node_data->setType($real_stmt, $const_type); - } - } - } else { - $context->check_consts = false; - } - } - - if ($first_arg - && $function_id - && strpos($function_id, 'is_') === 0 - && $function_id !== 'is_a' - && !$context->inside_negation - ) { - $stmt_assertions = $statements_analyzer->node_data->getAssertions($stmt); - - $anded_assertions = $stmt_assertions ?? AssertionFinder::processFunctionCall( - $stmt, - $context->self, - $statements_analyzer, - $codebase, - $context->inside_negation - ); - - $changed_vars = []; - - foreach ($anded_assertions as $assertions) { - $referenced_var_ids = array_map( - function (array $_): bool { - return true; - }, - $assertions - ); - - Reconciler::reconcileKeyedTypes( - $assertions, - $assertions, - $context->vars_in_scope, - $changed_vars, - $referenced_var_ids, - $statements_analyzer, - [], - $context->inside_loop, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ); - } - - return; - } - - if ($first_arg && ($function_id === 'array_values' || $function_id === 'ksort')) { - $first_arg_type = $statements_analyzer->node_data->getType($first_arg->value); - - if ($first_arg_type - && UnionTypeComparator::isContainedBy( - $codebase, - $first_arg_type, - Type::getList() - ) - ) { - if ($first_arg_type->from_docblock) { - IssueBuffer::maybeAdd( - new RedundantFunctionCallGivenDocblockType( - "The call to $function_id is unnecessary given the list docblock type $first_arg_type", - new CodeLocation($statements_analyzer, $function_name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RedundantFunctionCall( - "The call to $function_id is unnecessary, $first_arg_type is already a list", - new CodeLocation($statements_analyzer, $function_name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - if ($first_arg && $function_id === 'strtolower') { - $first_arg_type = $statements_analyzer->node_data->getType($first_arg->value); - - if ($first_arg_type - && UnionTypeComparator::isContainedBy( - $codebase, - $first_arg_type, - new Union([new TLowercaseString()]) - ) - ) { - if ($first_arg_type->from_docblock) { - IssueBuffer::maybeAdd( - new RedundantFunctionCallGivenDocblockType( - 'The call to strtolower is unnecessary given the docblock type', - new CodeLocation($statements_analyzer, $function_name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new RedundantFunctionCall( - 'The call to strtolower is unnecessary', - new CodeLocation($statements_analyzer, $function_name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - if ($first_arg - && ($function_id === 'array_walk' - || $function_id === 'array_walk_recursive' - ) - ) { - $first_arg_type = $statements_analyzer->node_data->getType($first_arg->value); - - if ($first_arg_type && $first_arg_type->hasObjectType()) { - if ($first_arg_type->isSingle()) { - IssueBuffer::maybeAdd( - new RawObjectIteration( - 'Possibly undesired iteration over object properties', - new CodeLocation($statements_analyzer, $function_name) - ) - ); - } else { - IssueBuffer::maybeAdd( - new PossibleRawObjectIteration( - 'Possibly undesired iteration over object properties', - new CodeLocation($statements_analyzer, $function_name) - ) - ); - } - } - } - } - - private static function handleDependentTypeFunction( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\FuncCall $stmt, - PhpParser\Node\Expr\FuncCall $real_stmt, - string $function_id, - Context $context - ): void { - $first_arg = $stmt->getArgs()[0] ?? null; - - if ($first_arg) { - $var = $first_arg->value; - - if ($var instanceof PhpParser\Node\Expr\Variable - && is_string($var->name) - ) { - $var_id = '$' . $var->name; - - if (isset($context->vars_in_scope[$var_id])) { - if (!$context->vars_in_scope[$var_id]->hasTemplate()) { - if ($function_id === 'get_class') { - $atomic_type = new TDependentGetClass( - $var_id, - $context->vars_in_scope[$var_id]->hasMixed() - ? Type::getObject() - : $context->vars_in_scope[$var_id] - ); - } elseif ($function_id === 'gettype') { - $atomic_type = new TDependentGetType($var_id); - } else { - $atomic_type = new TDependentGetDebugType($var_id); - } - - $statements_analyzer->node_data->setType($real_stmt, new Union([$atomic_type])); - - return; - } - } - } - - if (($var_type = $statements_analyzer->node_data->getType($var)) - && ($function_id === 'get_class' - || $function_id === 'get_debug_type' - ) - ) { - $class_string_types = []; - - foreach ($var_type->getAtomicTypes() as $class_type) { - if ($class_type instanceof TNamedObject) { - $class_string_types[] = new TClassString($class_type->value, clone $class_type); - } elseif ($class_type instanceof TTemplateParam - && $class_type->as->isSingle() - ) { - $as_atomic_type = $class_type->as->getSingleAtomic(); - - if ($as_atomic_type instanceof TObject) { - $class_string_types[] = new TTemplateParamClass( - $class_type->param_name, - 'object', - null, - $class_type->defining_class - ); - } elseif ($as_atomic_type instanceof TNamedObject) { - $class_string_types[] = new TTemplateParamClass( - $class_type->param_name, - $as_atomic_type->value, - $as_atomic_type, - $class_type->defining_class - ); - } - } elseif ($function_id === 'get_class') { - $class_string_types[] = new TClassString(); - } else { - if ($class_type instanceof TInt) { - $class_string_types[] = new TLiteralString('int'); - } elseif ($class_type instanceof TString) { - $class_string_types[] = new TLiteralString('string'); - } elseif ($class_type instanceof TFloat) { - $class_string_types[] = new TLiteralString('float'); - } elseif ($class_type instanceof TBool) { - $class_string_types[] = new TLiteralString('bool'); - } elseif ($class_type instanceof TClosedResource) { - $class_string_types[] = new TLiteralString('resource (closed)'); - } elseif ($class_type instanceof TNull) { - $class_string_types[] = new TLiteralString('null'); - } else { - $class_string_types[] = new TString(); - } - } - } - - if ($class_string_types) { - $statements_analyzer->node_data->setType($real_stmt, new Union($class_string_types)); - } - } - } elseif ($function_id === 'get_class' - && ($get_class_name = $statements_analyzer->getFQCLN()) - ) { - $statements_analyzer->node_data->setType( - $real_stmt, - new Union([ - new TClassString( - $get_class_name, - new TNamedObject($get_class_name) - ) - ]) - ); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php deleted file mode 100644 index 863c38ec..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php +++ /dev/null @@ -1,866 +0,0 @@ -getCodebase(); - $config = $codebase->config; - - $can_extend = false; - - $from_static = false; - - if ($stmt->class instanceof PhpParser\Node\Name) { - if (!in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true)) { - $aliases = $statements_analyzer->getAliases(); - - if ($context->calling_method_id - && !$stmt->class instanceof PhpParser\Node\Name\FullyQualified - ) { - $codebase->file_reference_provider->addMethodReferenceToClassMember( - $context->calling_method_id, - 'use:' . $stmt->class->parts[0] . ':' . md5($statements_analyzer->getFilePath()), - false - ); - } - - $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( - $stmt->class, - $aliases - ); - - $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); - } elseif ($context->self !== null) { - switch ($stmt->class->parts[0]) { - case 'self': - $class_storage = $codebase->classlike_storage_provider->get($context->self); - $fq_class_name = $class_storage->name; - break; - - case 'parent': - $fq_class_name = $context->parent; - break; - - case 'static': - // @todo maybe we can do better here - $class_storage = $codebase->classlike_storage_provider->get($context->self); - $fq_class_name = $class_storage->name; - - if (!$class_storage->final) { - $can_extend = true; - $from_static = true; - } - - break; - } - } - - if ($codebase->store_node_types - && $fq_class_name - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->class, - $codebase->classlikes->classExists($fq_class_name) - ? $fq_class_name - : '*' - . ($stmt->class instanceof PhpParser\Node\Name\FullyQualified - ? '\\' - : $statements_analyzer->getNamespace() . '-') - . implode('\\', $stmt->class->parts) - ); - } - } elseif ($stmt->class instanceof PhpParser\Node\Stmt\Class_) { - $statements_analyzer->analyze([$stmt->class], $context); - $fq_class_name = ClassAnalyzer::getAnonymousClassName($stmt->class, $statements_analyzer->getFilePath()); - } else { - self::analyzeConstructorExpression( - $statements_analyzer, - $codebase, - $context, - $stmt, - $stmt->class, - $config, - $fq_class_name, - $can_extend - ); - } - - if ($fq_class_name) { - if ($codebase->alter_code - && $stmt->class instanceof PhpParser\Node\Name - && !in_array($stmt->class->parts[0], ['parent', 'static']) - ) { - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $stmt->class, - $fq_class_name, - $context->calling_method_id - ); - } - - if ($context->check_classes) { - if ($context->isPhantomClass($fq_class_name)) { - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ); - - return true; - } - - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $fq_class_name, - new CodeLocation($statements_analyzer->getSource(), $stmt->class), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues() - ) === false) { - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ); - - return true; - } - - if ($codebase->interfaceExists($fq_class_name)) { - if (IssueBuffer::accepts( - new InterfaceInstantiation( - 'Interface ' . $fq_class_name . ' cannot be instantiated', - new CodeLocation($statements_analyzer->getSource(), $stmt->class) - ), - $statements_analyzer->getSuppressedIssues() - )) { - } - - return true; - } - } - - if ($stmt->class instanceof PhpParser\Node\Stmt\Class_) { - $extends = $stmt->class->extends ? (string) $stmt->class->extends : null; - $result_atomic_type = new TAnonymousClassInstance($fq_class_name, false, $extends); - } else { - //if the class is a Name, it can't represent a child - $definite_class = $stmt->class instanceof PhpParser\Node\Name; - $result_atomic_type = new TNamedObject($fq_class_name, $from_static, $definite_class); - } - - $statements_analyzer->node_data->setType( - $stmt, - new Union([$result_atomic_type]) - ); - - if (strtolower($fq_class_name) !== 'stdclass' && - $codebase->classlikes->classExists($fq_class_name) - ) { - self::analyzeNamedConstructor( - $statements_analyzer, - $codebase, - $stmt, - $context, - $fq_class_name, - $from_static, - $can_extend - ); - } else { - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ); - - if ($codebase->classlikes->enumExists($fq_class_name)) { - if (IssueBuffer::accepts(new UndefinedClass( - 'Enums cannot be instantiated', - new CodeLocation($statements_analyzer, $stmt), - $fq_class_name - ))) { - // fall through - } - } - } - } - - if (!$config->remember_property_assignments_after_call && !$context->collect_initializations) { - $context->removeMutableObjectVars(); - } - - return true; - } - - private static function analyzeNamedConstructor( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\New_ $stmt, - Context $context, - string $fq_class_name, - bool $from_static, - bool $can_extend - ): void { - $storage = $codebase->classlike_storage_provider->get($fq_class_name); - - if ($from_static) { - if (!$storage->preserve_constructor_signature) { - IssueBuffer::maybeAdd( - new UnsafeInstantiation( - 'Cannot safely instantiate class ' . $fq_class_name . ' with "new static" as' - . ' its constructor might change in child classes', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($storage->template_types - && !$storage->enforce_template_inheritance - ) { - $source = $statements_analyzer->getSource(); - - if ($source instanceof FunctionLikeAnalyzer) { - $function_storage = $source->getFunctionLikeStorage($statements_analyzer); - - if ($function_storage->return_type - && preg_match('/\bstatic\b/', $function_storage->return_type->getId()) - ) { - IssueBuffer::maybeAdd( - new UnsafeGenericInstantiation( - 'Cannot safely instantiate generic class ' . $fq_class_name - . ' with "new static" as' - . ' its generic parameters may be constrained in child classes.', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - } - - // if we're not calling this constructor via new static() - if ($storage->abstract && !$can_extend) { - if (IssueBuffer::accepts( - new AbstractInstantiation( - 'Unable to instantiate a abstract class ' . $fq_class_name, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return; - } - } - - if ($storage->deprecated && strtolower($fq_class_name) !== strtolower((string)$context->self)) { - IssueBuffer::maybeAdd( - new DeprecatedClass( - $fq_class_name . ' is marked deprecated', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_class_name - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - - if ($context->self - && !$context->collect_initializations - && !$context->collect_mutations - && !NamespaceAnalyzer::isWithinAny($context->self, $storage->internal) - ) { - IssueBuffer::maybeAdd( - new InternalClass( - $fq_class_name . ' is internal to ' . InternalClass::listToPhrase($storage->internal) - . ' but called from ' . $context->self, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_class_name - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $method_id = new MethodIdentifier($fq_class_name, '__construct'); - - if ($codebase->methods->methodExists( - $method_id, - $context->calling_method_id, - $codebase->collect_locations ? new CodeLocation($statements_analyzer->getSource(), $stmt) : null, - $statements_analyzer, - $statements_analyzer->getFilePath() - )) { - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - ArgumentMapPopulator::recordArgumentPositions( - $statements_analyzer, - $stmt, - $codebase, - (string)$method_id - ); - } - - $template_result = new TemplateResult([], []); - - if (self::checkMethodArgs( - $method_id, - $stmt->getArgs(), - $template_result, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer - ) === false) { - return; - } - - if (MethodVisibilityAnalyzer::analyze( - $method_id, - $context, - $statements_analyzer->getSource(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues() - ) === false) { - return; - } - - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if ($declaring_method_id) { - $method_storage = $codebase->methods->getStorage($declaring_method_id); - - $caller_identifier = $statements_analyzer->getFullyQualifiedFunctionMethodOrNamespaceName() ?: ''; - if (!NamespaceAnalyzer::isWithinAny($caller_identifier, $method_storage->internal)) { - IssueBuffer::maybeAdd( - new InternalMethod( - 'Constructor ' . $codebase->methods->getCasedMethodId($declaring_method_id) - . ' is internal to ' . InternalClass::listToPhrase($method_storage->internal) - . ' but called from ' . ($caller_identifier ?: 'root namespace'), - new CodeLocation($statements_analyzer, $stmt), - (string) $method_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (!$method_storage->external_mutation_free && !$context->inside_throw) { - if ($context->pure) { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call an impure constructor from a pure context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - } - - $generic_params = $template_result->lower_bounds; - - if ($method_storage->assertions && $stmt->class instanceof PhpParser\Node\Name) { - self::applyAssertionsToContext( - $stmt->class, - null, - $method_storage->assertions, - $stmt->getArgs(), - $generic_params, - $context, - $statements_analyzer - ); - } - - if ($method_storage->if_true_assertions) { - $statements_analyzer->node_data->setIfTrueAssertions( - $stmt, - array_map( - function ($assertion) use ($generic_params, $codebase) { - return $assertion->getUntemplatedCopy($generic_params, null, $codebase); - }, - $method_storage->if_true_assertions - ) - ); - } - - if ($method_storage->if_false_assertions) { - $statements_analyzer->node_data->setIfFalseAssertions( - $stmt, - array_map( - function ($assertion) use ($generic_params, $codebase) { - return $assertion->getUntemplatedCopy($generic_params, null, $codebase); - }, - $method_storage->if_false_assertions - ) - ); - } - } - - $generic_param_types = null; - - if ($storage->template_types) { - foreach ($storage->template_types as $template_name => $base_type) { - if (isset($template_result->lower_bounds[$template_name][$fq_class_name])) { - $generic_param_type = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $template_result->lower_bounds[$template_name][$fq_class_name], - $codebase - ); - } elseif ($storage->template_extended_params && $template_result->lower_bounds) { - $generic_param_type = self::getGenericParamForOffset( - $fq_class_name, - $template_name, - $storage->template_extended_params, - array_map( - function ($type_map) use ($codebase) { - return array_map( - function ($bounds) use ($codebase) { - return TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $bounds, - $codebase - ); - }, - $type_map - ); - }, - $template_result->lower_bounds - ) - ); - } else { - if ($fq_class_name === 'SplObjectStorage') { - $generic_param_type = Type::getEmpty(); - } else { - $generic_param_type = clone array_values($base_type)[0]; - } - } - - $generic_param_type->had_template = true; - - $generic_param_types[] = $generic_param_type; - } - } - - if ($generic_param_types) { - $result_atomic_type = new TGenericObject( - $fq_class_name, - $generic_param_types - ); - - $result_atomic_type->was_static = $from_static; - - $statements_analyzer->node_data->setType( - $stmt, - new Union([$result_atomic_type]) - ); - } - } elseif ($stmt->getArgs()) { - IssueBuffer::maybeAdd( - new TooManyArguments( - 'Class ' . $fq_class_name . ' has no __construct, but arguments were passed', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_class_name . '::__construct' - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($storage->template_types) { - $result_atomic_type = new TGenericObject( - $fq_class_name, - array_values( - array_map( - function ($map) { - return clone reset($map); - }, - $storage->template_types - ) - ) - ); - - $result_atomic_type->was_static = $from_static; - - $statements_analyzer->node_data->setType( - $stmt, - new Union([$result_atomic_type]) - ); - } - - if ($storage->external_mutation_free) { - $stmt->setAttribute('external_mutation_free', true); - $stmt_type = $statements_analyzer->node_data->getType($stmt); - - if ($stmt_type) { - $stmt_type->reference_free = true; - } - } - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - && ($stmt_type = $statements_analyzer->node_data->getType($stmt)) - ) { - $code_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - $method_storage = null; - - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if ($declaring_method_id) { - $method_storage = $codebase->methods->getStorage($declaring_method_id); - } - - if ($storage->external_mutation_free - || ($method_storage && $method_storage->specialize_call) - ) { - $method_source = DataFlowNode::getForMethodReturn( - (string)$method_id, - $fq_class_name . '::__construct', - $storage->location, - $code_location - ); - } else { - $method_source = DataFlowNode::getForMethodReturn( - (string)$method_id, - $fq_class_name . '::__construct', - $storage->location - ); - } - - $statements_analyzer->data_flow_graph->addNode($method_source); - - $stmt_type->parent_nodes = [$method_source->id => $method_source]; - } - } - - private static function analyzeConstructorExpression( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - Context $context, - PhpParser\Node\Expr\New_ $stmt, - PhpParser\Node\Expr $stmt_class, - Config $config, - ?string &$fq_class_name, - bool &$can_extend - ): void { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - ExpressionAnalyzer::analyze($statements_analyzer, $stmt_class, $context); - $context->inside_general_use = $was_inside_general_use; - - $stmt_class_type = $statements_analyzer->node_data->getType($stmt_class); - - if (!$stmt_class_type) { - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ); - - return; - } - - $has_single_class = $stmt_class_type->isSingleStringLiteral(); - - if ($has_single_class) { - $fq_class_name = $stmt_class_type->getSingleStringLiteral()->value; - } else { - if (self::checkMethodArgs( - null, - $stmt->getArgs(), - null, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer - ) === false) { - return; - } - } - - $new_type = null; - - $stmt_class_types = $stmt_class_type->getAtomicTypes(); - - while ($stmt_class_types) { - $lhs_type_part = array_shift($stmt_class_types); - - if ($lhs_type_part instanceof TTemplateParam) { - $stmt_class_types = array_merge($stmt_class_types, $lhs_type_part->as->getAtomicTypes()); - continue; - } - - if ($lhs_type_part instanceof TTemplateParamClass) { - if (!$statements_analyzer->node_data->getType($stmt)) { - $new_type_part = new TTemplateParam( - $lhs_type_part->param_name, - $lhs_type_part->as_type - ? new Union([$lhs_type_part->as_type]) - : Type::getObject(), - $lhs_type_part->defining_class - ); - - if (!$lhs_type_part->as_type) { - IssueBuffer::maybeAdd( - new MixedMethodCall( - 'Cannot call constructor on an unknown class', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $new_type = Type::combineUnionTypes($new_type, new Union([$new_type_part])); - - if ($lhs_type_part->as_type - && $codebase->classlikes->classExists($lhs_type_part->as_type->value) - ) { - $as_storage = $codebase->classlike_storage_provider->get( - $lhs_type_part->as_type->value - ); - - if (!$as_storage->preserve_constructor_signature) { - IssueBuffer::maybeAdd( - new UnsafeInstantiation( - 'Cannot safely instantiate class ' . $lhs_type_part->as_type->value - . ' with "new $class_name" as' - . ' its constructor might change in child classes', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - if ($lhs_type_part->as_type) { - $codebase->methods->methodExists( - new MethodIdentifier( - $lhs_type_part->as_type->value, - '__construct' - ), - $context->calling_method_id, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer->getSource(), $stmt) : null, - $statements_analyzer, - $statements_analyzer->getFilePath() - ); - } - - continue; - } - - if ($lhs_type_part instanceof TLiteralClassString - || $lhs_type_part instanceof TClassString - || $lhs_type_part instanceof TDependentGetClass - ) { - if (!$statements_analyzer->node_data->getType($stmt)) { - if ($lhs_type_part instanceof TClassString) { - $generated_type = $lhs_type_part->as_type - ? clone $lhs_type_part->as_type - : new TObject(); - - if ($lhs_type_part->as_type - && $codebase->classlikes->classExists($lhs_type_part->as_type->value) - ) { - $as_storage = $codebase->classlike_storage_provider->get( - $lhs_type_part->as_type->value - ); - - if (!$as_storage->preserve_constructor_signature) { - IssueBuffer::maybeAdd( - new UnsafeInstantiation( - 'Cannot safely instantiate class ' . $lhs_type_part->as_type->value - . ' with "new $class_name" as' - . ' its constructor might change in child classes', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } elseif ($lhs_type_part instanceof TDependentGetClass) { - $generated_type = new TObject(); - - if ($lhs_type_part->as_type->hasObjectType() - && $lhs_type_part->as_type->isSingle() - ) { - foreach ($lhs_type_part->as_type->getAtomicTypes() as $typeof_type_atomic) { - if ($typeof_type_atomic instanceof TNamedObject) { - $generated_type = new TNamedObject( - $typeof_type_atomic->value - ); - } - } - } - } else { - $generated_type = new TNamedObject( - $lhs_type_part->value - ); - } - - if ($lhs_type_part instanceof TClassString) { - $can_extend = true; - } - - if ($generated_type instanceof TObject) { - IssueBuffer::maybeAdd( - new MixedMethodCall( - 'Cannot call constructor on an unknown class', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $new_type = Type::combineUnionTypes($new_type, new Union([$generated_type])); - } - - continue; - } - - if ($lhs_type_part instanceof TString) { - if ($config->allow_string_standin_for_class - && !$lhs_type_part instanceof TNumericString - ) { - // do nothing - } elseif (IssueBuffer::accepts( - new InvalidStringClass( - 'String cannot be used as a class', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - // fall through - } - } elseif ($lhs_type_part instanceof TMixed) { - IssueBuffer::maybeAdd( - new MixedMethodCall( - 'Cannot call constructor on an unknown class', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($lhs_type_part instanceof TFalse - && $stmt_class_type->ignore_falsable_issues - ) { - // do nothing - } elseif ($lhs_type_part instanceof TNull - && $stmt_class_type->ignore_nullable_issues - ) { - // do nothing - } elseif (IssueBuffer::accepts( - new UndefinedClass( - 'Type ' . $lhs_type_part . ' cannot be called as a class', - new CodeLocation($statements_analyzer->getSource(), $stmt), - (string)$lhs_type_part - ), - $statements_analyzer->getSuppressedIssues() - )) { - // fall through - } - - $new_type = Type::combineUnionTypes($new_type, Type::getObject()); - } - - if (!$has_single_class) { - if ($new_type) { - $statements_analyzer->node_data->setType($stmt, $new_type); - } - - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ); - - return; - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php deleted file mode 100644 index da43d41f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php +++ /dev/null @@ -1,382 +0,0 @@ -getCodebase(); - $source = $statements_analyzer->getSource(); - - $config = $codebase->config; - - if ($stmt->class instanceof PhpParser\Node\Name) { - $fq_class_name = null; - - if (count($stmt->class->parts) === 1 - && in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true) - ) { - if ($stmt->class->parts[0] === 'parent') { - $child_fq_class_name = $context->self; - - $class_storage = $child_fq_class_name - ? $codebase->classlike_storage_provider->get($child_fq_class_name) - : null; - - if (!$class_storage || !$class_storage->parent_class) { - if (IssueBuffer::accepts( - new ParentNotFound( - 'Cannot call method on parent as this class does not extend another', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - return true; - } - - $fq_class_name = $class_storage->parent_class; - - $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $fq_class_name = $class_storage->name; - } elseif ($context->self) { - if ($stmt->class->parts[0] === 'static' && isset($context->vars_in_scope['$this'])) { - $fq_class_name = (string) $context->vars_in_scope['$this']; - $lhs_type = clone $context->vars_in_scope['$this']; - } else { - $fq_class_name = $context->self; - } - } else { - if (IssueBuffer::accepts( - new NonStaticSelfCall( - 'Cannot use ' . $stmt->class->parts[0] . ' outside class context', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - return true; - } - - if ($context->isPhantomClass($fq_class_name)) { - return true; - } - } elseif ($context->check_classes) { - $aliases = $statements_analyzer->getAliases(); - - if ($context->calling_method_id - && !$stmt->class instanceof PhpParser\Node\Name\FullyQualified - ) { - $codebase->file_reference_provider->addMethodReferenceToClassMember( - $context->calling_method_id, - 'use:' . $stmt->class->parts[0] . ':' . md5($statements_analyzer->getFilePath()), - false - ); - } - - $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( - $stmt->class, - $aliases - ); - - if ($context->isPhantomClass($fq_class_name)) { - return true; - } - - $does_class_exist = false; - - if ($context->self) { - $self_storage = $codebase->classlike_storage_provider->get($context->self); - - if (isset($self_storage->used_traits[strtolower($fq_class_name)])) { - $fq_class_name = $context->self; - $does_class_exist = true; - } - } - - if (!isset($context->phantom_classes[strtolower($fq_class_name)]) - && !$does_class_exist - ) { - $does_class_exist = ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $fq_class_name, - new CodeLocation($source, $stmt->class), - !$context->collect_initializations - && !$context->collect_mutations - ? $context->self - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $context->calling_method_id - : null, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions(false, false, false, true) - ); - } - - if (!$does_class_exist) { - return $does_class_exist !== false; - } - } - - if ($codebase->store_node_types - && $fq_class_name - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->class, - $fq_class_name - ); - } - - if ($fq_class_name && !$lhs_type) { - $lhs_type = new Union([new TNamedObject($fq_class_name)]); - } - } else { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - ExpressionAnalyzer::analyze($statements_analyzer, $stmt->class, $context); - $context->inside_general_use = $was_inside_general_use; - $lhs_type = $statements_analyzer->node_data->getType($stmt->class) ?? Type::getMixed(); - } - - if (!$lhs_type) { - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ) === false) { - return false; - } - - return true; - } - - $has_mock = false; - $moved_call = false; - $has_existing_method = false; - - foreach ($lhs_type->getAtomicTypes() as $lhs_type_part) { - AtomicStaticCallAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context, - $lhs_type_part, - $lhs_type->ignore_nullable_issues, - $moved_call, - $has_mock, - $has_existing_method - ); - } - - if (!$stmt->isFirstClassCallable() && !$has_existing_method) { - return self::checkMethodArgs( - $method_id, - $stmt->getArgs(), - null, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer - ); - } - - if (!$config->remember_property_assignments_after_call && !$context->collect_initializations) { - $context->removeMutableObjectVars(); - } - - if (!$statements_analyzer->node_data->getType($stmt)) { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } - - return true; - } - - public static function taintReturnType( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\StaticCall $stmt, - MethodIdentifier $method_id, - string $cased_method_id, - Union $return_type_candidate, - ?MethodStorage $method_storage, - ?TemplateResult $template_result, - ?Context $context = null - ): void { - if (!$statements_analyzer->data_flow_graph) { - return; - } - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - return; - } - - $node_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - $method_location = $method_storage - ? ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - ? ($method_storage->signature_return_type_location ?: $method_storage->location) - : ($method_storage->return_type_location ?: $method_storage->location)) - : null; - - if ($method_storage && $method_storage->specialize_call) { - $method_source = DataFlowNode::getForMethodReturn( - (string) $method_id, - $cased_method_id, - $method_location, - $node_location - ); - } else { - $method_source = DataFlowNode::getForMethodReturn( - (string) $method_id, - $cased_method_id, - $method_location - ); - } - - $statements_analyzer->data_flow_graph->addNode($method_source); - - $codebase = $statements_analyzer->getCodebase(); - - $conditionally_removed_taints = []; - - if ($method_storage && $template_result) { - foreach ($method_storage->conditionally_removed_taints as $conditionally_removed_taint) { - $conditionally_removed_taint = clone $conditionally_removed_taint; - - TemplateInferredTypeReplacer::replace( - $conditionally_removed_taint, - $template_result, - $codebase - ); - - $expanded_type = TypeExpander::expandUnion( - $statements_analyzer->getCodebase(), - $conditionally_removed_taint, - null, - null, - null, - true, - true - ); - - foreach ($expanded_type->getLiteralStrings() as $literal_string) { - $conditionally_removed_taints[] = $literal_string->value; - } - } - } - - $added_taints = []; - $removed_taints = []; - - if ($context) { - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - } - - if ($conditionally_removed_taints && $method_location) { - $assignment_node = DataFlowNode::getForAssignment( - $method_id . '-escaped', - $method_location, - $method_source->specialization_key - ); - - $statements_analyzer->data_flow_graph->addPath( - $method_source, - $assignment_node, - 'conditionally-escaped', - $added_taints, - array_merge($conditionally_removed_taints, $removed_taints) - ); - - $return_type_candidate->parent_nodes[$assignment_node->id] = $assignment_node; - } else { - $return_type_candidate->parent_nodes = [$method_source->id => $method_source]; - } - - if ($method_storage - && $method_storage->taint_source_types - && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph - ) { - $method_node = TaintSource::getForMethodReturn( - (string) $method_id, - $cased_method_id, - $method_storage->signature_return_type_location ?: $method_storage->location - ); - - $method_node->taints = $method_storage->taint_source_types; - - $statements_analyzer->data_flow_graph->addSource($method_node); - } - - if ($method_storage && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { - FunctionCallReturnTypeFetcher::taintUsingFlows( - $statements_analyzer, - $method_storage, - $statements_analyzer->data_flow_graph, - (string) $method_id, - $stmt->getArgs(), - $node_location, - $method_source, - array_merge($method_storage->removed_taints, $removed_taints), - $added_taints - ); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php deleted file mode 100644 index 673dc56c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php +++ /dev/null @@ -1,1136 +0,0 @@ -value; - - if (!ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $fq_class_name, - new CodeLocation($statements_analyzer, $stmt->class), - !$context->collect_initializations - && !$context->collect_mutations - ? $context->self - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $context->calling_method_id - : null, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions( - $stmt->class instanceof PhpParser\Node\Name - && count($stmt->class->parts) === 1 - && in_array(strtolower($stmt->class->parts[0]), ['self', 'static'], true) - ) - )) { - return; - } - - $intersection_types = $lhs_type_part->extra_types; - } elseif ($lhs_type_part instanceof TClassString - && $lhs_type_part->as_type - ) { - $fq_class_name = $lhs_type_part->as_type->value; - - if (!ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $fq_class_name, - new CodeLocation($statements_analyzer, $stmt->class), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues() - )) { - return; - } - - $intersection_types = $lhs_type_part->as_type->extra_types; - } elseif ($lhs_type_part instanceof TDependentGetClass - && !$lhs_type_part->as_type->hasObject() - ) { - $fq_class_name = 'object'; - - if ($lhs_type_part->as_type->hasObjectType() - && $lhs_type_part->as_type->isSingle() - ) { - foreach ($lhs_type_part->as_type->getAtomicTypes() as $typeof_type_atomic) { - if ($typeof_type_atomic instanceof TNamedObject) { - $fq_class_name = $typeof_type_atomic->value; - } - } - } - - if ($fq_class_name === 'object') { - return; - } - } elseif ($lhs_type_part instanceof TLiteralClassString) { - $fq_class_name = $lhs_type_part->value; - - if (!ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $fq_class_name, - new CodeLocation($statements_analyzer, $stmt->class), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues() - )) { - return; - } - } elseif ($lhs_type_part instanceof TTemplateParam - && !$lhs_type_part->as->isMixed() - && !$lhs_type_part->as->hasObject() - ) { - $fq_class_name = null; - - foreach ($lhs_type_part->as->getAtomicTypes() as $generic_param_type) { - if (!$generic_param_type instanceof TNamedObject) { - return; - } - - $fq_class_name = $generic_param_type->value; - break; - } - - if (!$fq_class_name) { - IssueBuffer::maybeAdd( - new UndefinedClass( - 'Type ' . $lhs_type_part->as . ' cannot be called as a class', - new CodeLocation($statements_analyzer->getSource(), $stmt), - (string) $lhs_type_part - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - } else { - self::handleNonObjectCall( - $statements_analyzer, - $stmt, - $context, - $lhs_type_part, - $ignore_nullable_issues - ); - - return; - } - - $codebase = $statements_analyzer->getCodebase(); - - $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); - - $is_mock = ExpressionAnalyzer::isMock($fq_class_name); - - $has_mock = $has_mock || $is_mock; - - if ($stmt->name instanceof PhpParser\Node\Identifier && !$is_mock) { - self::handleNamedCall( - $statements_analyzer, - $stmt, - $stmt->name, - $context, - $lhs_type_part, - $intersection_types ?: [], - $fq_class_name, - $moved_call, - $has_existing_method - ); - } else { - if ($stmt->name instanceof PhpParser\Node\Expr) { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - - ExpressionAnalyzer::analyze($statements_analyzer, $stmt->name, $context); - - $context->inside_general_use = $was_inside_general_use; - } - - if (!$context->ignore_variable_method) { - $codebase->analyzer->addMixedMemberName( - strtolower($fq_class_name) . '::', - $context->calling_method_id ?: $statements_analyzer->getFileName() - ); - } - - if ($stmt->isFirstClassCallable()) { - $return_type_candidate = null; - if (!$stmt->name instanceof PhpParser\Node\Identifier) { - $method_name_type = $statements_analyzer->node_data->getType($stmt->name); - if ($method_name_type && $method_name_type->isSingleStringLiteral()) { - $method_identifier = new MethodIdentifier( - $fq_class_name, - strtolower($method_name_type->getSingleStringLiteral()->value) - ); - //the call to methodExists will register that the method was called from somewhere - if ($codebase->methods->methodExists( - $method_identifier, - $context->calling_method_id, - null, - $statements_analyzer, - $statements_analyzer->getFilePath(), - true, - $context->insideUse() - )) { - $method_storage = $codebase->methods->getStorage($method_identifier); - - $return_type_candidate = new Union([new TClosure( - 'Closure', - $method_storage->params, - $method_storage->return_type, - $method_storage->pure - )]); - } - } - } - - $statements_analyzer->node_data->setType($stmt, $return_type_candidate ?? Type::getClosure()); - - return; - } - - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ) === false) { - return; - } - } - - if ($codebase->alter_code - && $fq_class_name - && !$moved_call - && $stmt->class instanceof PhpParser\Node\Name - && !in_array($stmt->class->parts[0], ['parent', 'static']) - ) { - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $stmt->class, - $fq_class_name, - $context->calling_method_id, - false, - $stmt->class->parts[0] === 'self' - ); - } - } - - /** - * @psalm-suppress UnusedReturnValue not used but seems important - * @psalm-suppress ComplexMethod to be refactored - */ - private static function handleNamedCall( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\StaticCall $stmt, - PhpParser\Node\Identifier $stmt_name, - Context $context, - Atomic $lhs_type_part, - array $intersection_types, - string $fq_class_name, - bool &$moved_call, - bool &$has_existing_method - ): bool { - $codebase = $statements_analyzer->getCodebase(); - - $method_name_lc = strtolower($stmt_name->name); - $method_id = new MethodIdentifier($fq_class_name, $method_name_lc); - - $cased_method_id = $fq_class_name . '::' . $stmt_name->name; - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - ArgumentMapPopulator::recordArgumentPositions( - $statements_analyzer, - $stmt, - $codebase, - (string) $method_id - ); - } - - if ($intersection_types - && !$codebase->methods->methodExists($method_id) - ) { - foreach ($intersection_types as $intersection_type) { - if (!$intersection_type instanceof TNamedObject) { - continue; - } - - $intersection_method_id = new MethodIdentifier( - $intersection_type->value, - $method_name_lc - ); - - if ($codebase->methods->methodExists($intersection_method_id)) { - $method_id = $intersection_method_id; - $cased_method_id = $intersection_type->value . '::' . $stmt_name->name; - $fq_class_name = $intersection_type->value; - break; - } - } - } - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $naive_method_exists = $codebase->methods->methodExists( - $method_id, - !$context->collect_initializations - && !$context->collect_mutations - ? $context->calling_method_id - : null, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer, $stmt_name) - : null, - $statements_analyzer, - $statements_analyzer->getFilePath(), - false, - $context->insideUse() - ); - - $fake_method_exists = false; - - if (!$naive_method_exists - && $codebase->methods->existence_provider->has($fq_class_name) - ) { - $method_exists = $codebase->methods->existence_provider->doesMethodExist( - $fq_class_name, - $method_id->method_name, - $statements_analyzer, - null - ); - - if ($method_exists) { - $fake_method_exists = true; - } - } - - if ($stmt->isFirstClassCallable()) { - $method_storage = ($class_storage->methods[$method_name_lc] ?? - ($class_storage->pseudo_static_methods[$method_name_lc] ?? null)); - - if ($method_storage) { - $return_type_candidate = new Union([new TClosure( - 'Closure', - $method_storage->params, - $method_storage->return_type, - $method_storage->pure - )]); - } else { - $return_type_candidate = Type::getClosure(); - } - - $statements_analyzer->node_data->setType($stmt, $return_type_candidate); - - return true; - } - - $args = $stmt->getArgs(); - - if (!$naive_method_exists - && $class_storage->mixin_declaring_fqcln - && $class_storage->namedMixins - ) { - foreach ($class_storage->namedMixins as $mixin) { - $new_method_id = new MethodIdentifier( - $mixin->value, - $method_name_lc - ); - - if ($codebase->methods->methodExists( - $new_method_id, - $context->calling_method_id, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer, $stmt_name) - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $statements_analyzer - : null, - $statements_analyzer->getFilePath(), - true, - $context->insideUse() - )) { - $mixin_candidates = []; - foreach ($class_storage->templatedMixins as $mixin_candidate) { - $mixin_candidates[] = clone $mixin_candidate; - } - - foreach ($class_storage->namedMixins as $mixin_candidate) { - $mixin_candidates[] = clone $mixin_candidate; - } - - $mixin_candidates_no_generic = array_filter($mixin_candidates, function ($check): bool { - return !($check instanceof TGenericObject); - }); - - // $mixin_candidates_no_generic will only be empty when there are TGenericObject entries. - // In that case, Union will be initialized with an empty array but - // replaced with non-empty types in the following loop. - /** @psalm-suppress ArgumentTypeCoercion */ - $mixin_candidate_type = new Union($mixin_candidates_no_generic); - - foreach ($mixin_candidates as $tGenericMixin) { - if (!($tGenericMixin instanceof TGenericObject)) { - continue; - } - - $mixin_declaring_class_storage = $codebase->classlike_storage_provider->get( - $class_storage->mixin_declaring_fqcln - ); - - $new_mixin_candidate_type = AtomicPropertyFetchAnalyzer::localizePropertyType( - $codebase, - new Union([$lhs_type_part]), - $tGenericMixin, - $class_storage, - $mixin_declaring_class_storage - ); - - foreach ($mixin_candidate_type->getAtomicTypes() as $type) { - $new_mixin_candidate_type->addType($type); - } - - $mixin_candidate_type = $new_mixin_candidate_type; - } - - $new_lhs_type = TypeExpander::expandUnion( - $codebase, - $mixin_candidate_type, - $fq_class_name, - $fq_class_name, - $class_storage->parent_class, - true, - false, - $class_storage->final - ); - - $mixin_context = clone $context; - $mixin_context->vars_in_scope['$__tmp_mixin_var__'] = $new_lhs_type; - - return self::forwardCallToInstanceMethod( - $statements_analyzer, - $stmt, - $stmt_name, - $mixin_context, - '__tmp_mixin_var__', - true - ); - } - } - } - - $config = $codebase->config; - - $found_method_and_class_storage = self::findPseudoMethodAndClassStorages( - $codebase, - $class_storage, - $method_name_lc - ); - - if (!$naive_method_exists - || !MethodAnalyzer::isMethodVisible( - $method_id, - $context, - $statements_analyzer->getSource() - ) - || $fake_method_exists - || ($found_method_and_class_storage - && ($config->use_phpdoc_method_without_magic_or_parent || $class_storage->parent_class)) - ) { - $callstatic_id = new MethodIdentifier( - $fq_class_name, - '__callstatic' - ); - - if ($codebase->methods->methodExists( - $callstatic_id, - $context->calling_method_id, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer, $stmt_name) - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $statements_analyzer - : null, - $statements_analyzer->getFilePath(), - true, - $context->insideUse() - )) { - $callstatic_appearing_id = $codebase->methods->getAppearingMethodId($callstatic_id); - assert($callstatic_appearing_id !== null); - $callstatic_pure = false; - $callstatic_mutation_free = false; - if ($codebase->methods->hasStorage($callstatic_appearing_id)) { - $callstatic_storage = $codebase->methods->getStorage($callstatic_appearing_id); - $callstatic_pure = $callstatic_storage->pure; - $callstatic_mutation_free = $callstatic_storage->mutation_free; - } - if ($codebase->methods->return_type_provider->has($fq_class_name)) { - $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( - $statements_analyzer, - $method_id->fq_class_name, - $method_id->method_name, - $stmt, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt_name), - null, - null, - strtolower($stmt_name->name) - ); - - if ($return_type_candidate) { - CallAnalyzer::checkMethodArgs( - $method_id, - $stmt->getArgs(), - null, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer - ); - - $statements_analyzer->node_data->setType($stmt, $return_type_candidate); - - return true; - } - } - - if ($found_method_and_class_storage) { - [$pseudo_method_storage, $defining_class_storage] = $found_method_and_class_storage; - - if (self::checkPseudoMethod( - $statements_analyzer, - $stmt, - $method_id, - $fq_class_name, - $args, - $defining_class_storage, - $pseudo_method_storage, - $context - ) === false - ) { - return false; - } - - if (!$context->inside_throw) { - if ($context->pure && !$callstatic_pure) { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call an impure method from a pure context', - new CodeLocation($statements_analyzer, $stmt_name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($context->mutation_free && !$callstatic_mutation_free) { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a possibly-mutating method from a mutation-free context', - new CodeLocation($statements_analyzer, $stmt_name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - && !$callstatic_pure - ) { - if (!$callstatic_mutation_free) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - } - - $statements_analyzer->getSource()->inferred_impure = true; - } - } - - if ($pseudo_method_storage->return_type) { - return true; - } - } else { - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $args, - null, - null, - true, - $context - ) === false) { - return false; - } - } - - $array_values = array_map( - function (PhpParser\Node\Arg $arg): PhpParser\Node\Expr\ArrayItem { - return new VirtualArrayItem( - $arg->value, - null, - false, - $arg->getAttributes() - ); - }, - $args - ); - - $args = [ - new VirtualArg( - new VirtualString((string) $method_id, $stmt_name->getAttributes()), - false, - false, - $stmt_name->getAttributes() - ), - new VirtualArg( - new VirtualArray($array_values, $stmt->getAttributes()), - false, - false, - $stmt->getAttributes() - ), - ]; - - $method_id = new MethodIdentifier( - $fq_class_name, - '__callstatic' - ); - } elseif ($found_method_and_class_storage - && ($config->use_phpdoc_method_without_magic_or_parent || $class_storage->parent_class) - ) { - [$pseudo_method_storage, $defining_class_storage] = $found_method_and_class_storage; - - if (self::checkPseudoMethod( - $statements_analyzer, - $stmt, - $method_id, - $fq_class_name, - $args, - $defining_class_storage, - $pseudo_method_storage, - $context - ) === false - ) { - return false; - } - - if ($pseudo_method_storage->return_type) { - return true; - } - } elseif ($stmt->class instanceof PhpParser\Node\Name && $stmt->class->parts[0] === 'parent' - && !$codebase->methodExists($method_id) - && !$statements_analyzer->isStatic() - ) { - // In case of parent::xxx() call on instance method context (i.e. not static context) - // with nonexistent method, we try to forward to instance method call for resolve pseudo method. - - // Use parent type as static type for the method call - $tmp_context = clone $context; - $tmp_context->vars_in_scope['$__tmp_parent_var__'] = new Union([$lhs_type_part]); - - if (self::forwardCallToInstanceMethod( - $statements_analyzer, - $stmt, - $stmt_name, - $tmp_context, - '__tmp_parent_var__' - ) === false) { - return false; - } - - unset($tmp_context); - - // Resolve actual static return type according to caller (i.e. $this) static type - if (isset($context->vars_in_scope['$this']) - && $method_call_type = $statements_analyzer->node_data->getType($stmt) - ) { - $method_call_type = clone $method_call_type; - - foreach ($method_call_type->getAtomicTypes() as $name => $type) { - if ($type instanceof TNamedObject && $type->was_static && $type->value === $fq_class_name) { - // Replace parent&static type to actual static type - $method_call_type->removeType($name); - $method_call_type->addType($context->vars_in_scope['$this']->getSingleAtomic()); - } - } - - $statements_analyzer->node_data->setType($stmt, $method_call_type); - } - - return true; - } - - if (!$context->check_methods) { - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ) === false) { - return false; - } - - return true; - } - } - - $does_method_exist = MethodAnalyzer::checkMethodExists( - $codebase, - $method_id, - new CodeLocation($statements_analyzer, $stmt), - $statements_analyzer->getSuppressedIssues(), - $context->calling_method_id - ); - - if (!$does_method_exist) { - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $stmt->getArgs(), - null, - null, - true, - $context - ) === false) { - return false; - } - - if ($codebase->alter_code && $fq_class_name && !$moved_call) { - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $stmt->class, - $fq_class_name, - $context->calling_method_id - ); - } - - return true; - } - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - if ($class_storage->deprecated && $fq_class_name !== $context->self) { - IssueBuffer::maybeAdd( - new DeprecatedClass( - $fq_class_name . ' is marked deprecated', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_class_name - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($context->self && ! NamespaceAnalyzer::isWithinAny($context->self, $class_storage->internal)) { - IssueBuffer::maybeAdd( - new InternalClass( - $fq_class_name . ' is internal to ' . InternalClass::listToPhrase($class_storage->internal) - . ' but called from ' . $context->self, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_class_name - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (MethodVisibilityAnalyzer::analyze( - $method_id, - $context, - $statements_analyzer->getSource(), - new CodeLocation($statements_analyzer, $stmt), - $statements_analyzer->getSuppressedIssues() - ) === false) { - return false; - } - - if ((!$stmt->class instanceof PhpParser\Node\Name - || $stmt->class->parts[0] !== 'parent' - || $statements_analyzer->isStatic()) - && ( - !$context->self - || $statements_analyzer->isStatic() - || !$codebase->classExtends($context->self, $fq_class_name) - ) - ) { - if (MethodAnalyzer::checkStatic( - $method_id, - ($stmt->class instanceof PhpParser\Node\Name - && strtolower($stmt->class->parts[0]) === 'self') - || $context->self === $fq_class_name, - !$statements_analyzer->isStatic(), - $codebase, - new CodeLocation($statements_analyzer, $stmt), - $statements_analyzer->getSuppressedIssues(), - $is_dynamic_this_method - ) === false) { - // fall through - } - - if ($is_dynamic_this_method) { - return self::forwardCallToInstanceMethod( - $statements_analyzer, - $stmt, - $stmt_name, - $context - ); - } - } - - $has_existing_method = true; - - ExistingAtomicStaticCallAnalyzer::analyze( - $statements_analyzer, - $stmt, - $stmt_name, - $args, - $context, - $lhs_type_part, - $method_id, - $cased_method_id, - $class_storage, - $moved_call - ); - - return true; - } - - /** - * @param list $args - * @return false|null - */ - private static function checkPseudoMethod( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\StaticCall $stmt, - MethodIdentifier $method_id, - string $static_fq_class_name, - array $args, - ClassLikeStorage $class_storage, - MethodStorage $pseudo_method_storage, - Context $context - ): ?bool { - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $args, - $pseudo_method_storage->params, - (string) $method_id, - true, - $context - ) === false) { - return false; - } - - $codebase = $statements_analyzer->getCodebase(); - - if (ArgumentsAnalyzer::checkArgumentsMatch( - $statements_analyzer, - $args, - $method_id, - $pseudo_method_storage->params, - $pseudo_method_storage, - null, - null, - new CodeLocation($statements_analyzer, $stmt), - $context - ) === false) { - return false; - } - - $method_storage = null; - - if ($statements_analyzer->data_flow_graph) { - try { - $method_storage = $codebase->methods->getStorage($method_id); - - ArgumentsAnalyzer::analyze( - $statements_analyzer, - $args, - $method_storage->params, - (string) $method_id, - true, - $context - ); - - ArgumentsAnalyzer::checkArgumentsMatch( - $statements_analyzer, - $args, - $method_id, - $method_storage->params, - $method_storage, - null, - null, - new CodeLocation($statements_analyzer, $stmt), - $context - ); - } catch (Exception $e) { - // do nothing - } - } - - if ($pseudo_method_storage->return_type) { - $return_type_candidate = clone $pseudo_method_storage->return_type; - - $return_type_candidate = TypeExpander::expandUnion( - $statements_analyzer->getCodebase(), - $return_type_candidate, - $class_storage->name, - $static_fq_class_name, - $class_storage->parent_class - ); - - if ($method_storage) { - StaticCallAnalyzer::taintReturnType( - $statements_analyzer, - $stmt, - $method_id, - (string) $method_id, - $return_type_candidate, - $method_storage, - null, - $context - ); - } - - $stmt_type = $statements_analyzer->node_data->getType($stmt); - - $statements_analyzer->node_data->setType( - $stmt, - Type::combineUnionTypes( - $return_type_candidate, - $stmt_type - ) - ); - } - - return null; - } - - public static function handleNonObjectCall( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\StaticCall $stmt, - Context $context, - Atomic $lhs_type_part, - bool $ignore_nullable_issues - ): void { - $codebase = $statements_analyzer->getCodebase(); - $config = $codebase->config; - - if ($lhs_type_part instanceof TMixed - || $lhs_type_part instanceof TTemplateParam - || $lhs_type_part instanceof TClassString - || $lhs_type_part instanceof TObject - ) { - if ($stmt->name instanceof PhpParser\Node\Identifier) { - $codebase->analyzer->addMixedMemberName( - strtolower($stmt->name->name), - $context->calling_method_id ?: $statements_analyzer->getFileName() - ); - } - - IssueBuffer::maybeAdd( - new MixedMethodCall( - 'Cannot call method on an unknown class', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - if ($lhs_type_part instanceof TString) { - if ($config->allow_string_standin_for_class - && !$lhs_type_part instanceof TNumericString - ) { - return; - } - - IssueBuffer::maybeAdd( - new InvalidStringClass( - 'String cannot be used as a class', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - if ($lhs_type_part instanceof TNull - && $ignore_nullable_issues - ) { - return; - } - - IssueBuffer::maybeAdd( - new UndefinedClass( - 'Type ' . $lhs_type_part . ' cannot be called as a class', - new CodeLocation($statements_analyzer->getSource(), $stmt), - (string) $lhs_type_part - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - /** - * Try to find matching pseudo method over ancestors (including interfaces). - * - * Returns the pseudo method if exists, with its defining class storage. - * If the method is not declared, null is returned. - * - * @param Codebase $codebase - * @param ClassLikeStorage $static_class_storage The called class - * @param lowercase-string $method_name_lc - * - * @return array{MethodStorage, ClassLikeStorage}|null - */ - private static function findPseudoMethodAndClassStorages( - Codebase $codebase, - ClassLikeStorage $static_class_storage, - string $method_name_lc - ): ?array { - if ($pseudo_method_storage = $static_class_storage->pseudo_static_methods[$method_name_lc] ?? null) { - return [$pseudo_method_storage, $static_class_storage]; - } - - $ancestors = $static_class_storage->class_implements + $static_class_storage->parent_classes; - - foreach ($ancestors as $fq_class_name => $_) { - $class_storage = $codebase->classlikes->getStorageFor($fq_class_name); - - if ($class_storage && isset($class_storage->pseudo_static_methods[$method_name_lc])) { - return [ - $class_storage->pseudo_static_methods[$method_name_lc], - $class_storage - ]; - } - } - - return null; - } - - /** - * Forward static call to instance call, using `VirtualMethodCall` and `MethodCallAnalyzer::analyze()` - * The resolved method return type will be set as type of the $stmt node. - * - * @param StatementsAnalyzer $statements_analyzer - * @param PhpParser\Node\Expr\StaticCall $stmt - * @param PhpParser\Node\Identifier $stmt_name - * @param Context $context - * @param string $virtual_var_name Temporary var name to use for create the fake MethodCall statement. - * @param bool $always_set_node_type If true, when the method has no declared typed, mixed will be set on node. - * - * @return bool Result of analysis. False if the call is invalid. - * - * @see MethodCallAnalyzer::analyze() - */ - private static function forwardCallToInstanceMethod( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\StaticCall $stmt, - PhpParser\Node\Identifier $stmt_name, - Context $context, - string $virtual_var_name = 'this', - bool $always_set_node_type = false - ): bool { - $old_data_provider = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $fake_method_call_expr = new VirtualMethodCall( - new VirtualVariable($virtual_var_name, $stmt->class->getAttributes()), - $stmt_name, - $stmt->getArgs(), - $stmt->getAttributes() - ); - - if (MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_method_call_expr, - $context - ) === false) { - return false; - } - - $fake_method_call_type = $statements_analyzer->node_data->getType($fake_method_call_expr); - - $statements_analyzer->node_data = $old_data_provider; - - if ($fake_method_call_type) { - $statements_analyzer->node_data->setType($stmt, $fake_method_call_type); - } elseif ($always_set_node_type) { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php deleted file mode 100644 index 3785023e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php +++ /dev/null @@ -1,642 +0,0 @@ - $args - */ - public static function analyze( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\StaticCall $stmt, - PhpParser\Node\Identifier $stmt_name, - array $args, - Context $context, - Atomic $lhs_type_part, - MethodIdentifier $method_id, - string $cased_method_id, - ClassLikeStorage $class_storage, - bool &$moved_call - ): void { - $fq_class_name = $method_id->fq_class_name; - $method_name_lc = $method_id->method_name; - - $codebase = $statements_analyzer->getCodebase(); - $config = $codebase->config; - - if (MethodCallProhibitionAnalyzer::analyze( - $codebase, - $context, - $method_id, - $statements_analyzer->getFullyQualifiedFunctionMethodOrNamespaceName(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues() - ) === false) { - // fall through - } - - if ($class_storage->user_defined - && $context->self - && ($context->collect_mutations || $context->collect_initializations) - ) { - $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); - - if (!$appearing_method_id) { - return; - } - - $appearing_method_class_name = $appearing_method_id->fq_class_name; - - if ($codebase->classExtends($context->self, $appearing_method_class_name)) { - $old_context_include_location = $context->include_location; - $old_self = $context->self; - $context->include_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - $context->self = $appearing_method_class_name; - - $file_analyzer = $statements_analyzer->getFileAnalyzer(); - - if ($context->collect_mutations) { - $file_analyzer->getMethodMutations($appearing_method_id, $context); - } else { - // collecting initializations - $local_vars_in_scope = []; - $local_vars_possibly_in_scope = []; - - foreach ($context->vars_in_scope as $var => $_) { - if (strpos($var, '$this->') !== 0 && $var !== '$this') { - $local_vars_in_scope[$var] = $context->vars_in_scope[$var]; - } - } - - foreach ($context->vars_possibly_in_scope as $var => $_) { - if (strpos($var, '$this->') !== 0 && $var !== '$this') { - $local_vars_possibly_in_scope[$var] = $context->vars_possibly_in_scope[$var]; - } - } - - if (!isset($context->initialized_methods[(string) $appearing_method_id])) { - if ($context->initialized_methods === null) { - $context->initialized_methods = []; - } - - $context->initialized_methods[(string) $appearing_method_id] = true; - - $file_analyzer->getMethodMutations($appearing_method_id, $context); - - foreach ($local_vars_in_scope as $var => $type) { - $context->vars_in_scope[$var] = $type; - } - - foreach ($local_vars_possibly_in_scope as $var => $type) { - $context->vars_possibly_in_scope[$var] = $type; - } - } - } - - $context->include_location = $old_context_include_location; - $context->self = $old_self; - } - } - - $found_generic_params = ClassTemplateParamCollector::collect( - $codebase, - $class_storage, - $class_storage, - $method_name_lc, - $lhs_type_part, - !$statements_analyzer->isStatic() && $method_id->fq_class_name === $context->self - ); - - if ($found_generic_params - && $stmt->class instanceof PhpParser\Node\Name - && $stmt->class->parts === ['parent'] - && $context->self - && ($self_class_storage = $codebase->classlike_storage_provider->get($context->self)) - && $self_class_storage->template_extended_params - ) { - foreach ($self_class_storage->template_extended_params as $template_fq_class_name => $extended_types) { - foreach ($extended_types as $type_key => $extended_type) { - if (isset($found_generic_params[$type_key][$template_fq_class_name])) { - $found_generic_params[$type_key][$template_fq_class_name] = clone $extended_type; - continue; - } - - foreach ($extended_type->getAtomicTypes() as $t) { - if ($t instanceof TTemplateParam - && isset($found_generic_params[$t->param_name][$t->defining_class]) - ) { - $found_generic_params[$type_key][$template_fq_class_name] - = $found_generic_params[$t->param_name][$t->defining_class]; - } else { - $found_generic_params[$type_key][$template_fq_class_name] - = clone $extended_type; - break; - } - } - } - } - } - - $template_result = new TemplateResult([], $found_generic_params ?: []); - - if (CallAnalyzer::checkMethodArgs( - $method_id, - $args, - $template_result, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer - ) === false) { - return; - } - - $fq_class_name = $stmt->class instanceof PhpParser\Node\Name && $stmt->class->parts === ['parent'] - ? (string) $statements_analyzer->getFQCLN() - : $fq_class_name; - - $self_fq_class_name = $fq_class_name; - - $return_type_candidate = null; - - if ($codebase->methods->return_type_provider->has($fq_class_name)) { - $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( - $statements_analyzer, - $fq_class_name, - $stmt_name->name, - $stmt, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt_name) - ); - } - - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if (!$return_type_candidate - && $declaring_method_id - && (string) $declaring_method_id !== (string) $method_id - ) { - $declaring_fq_class_name = $declaring_method_id->fq_class_name; - $declaring_method_name = $declaring_method_id->method_name; - - if ($codebase->methods->return_type_provider->has($declaring_fq_class_name)) { - $return_type_candidate = $codebase->methods->return_type_provider->getReturnType( - $statements_analyzer, - $declaring_fq_class_name, - $declaring_method_name, - $stmt, - $context, - new CodeLocation($statements_analyzer->getSource(), $stmt_name), - null, - $fq_class_name, - $stmt_name->name - ); - } - } - - if (!$return_type_candidate) { - $return_type_candidate = self::getMethodReturnType( - $statements_analyzer, - $codebase, - $stmt, - $method_id, - $args, - $template_result, - $self_fq_class_name, - $lhs_type_part, - $context, - $fq_class_name, - $class_storage, - $config - ); - } - - $method_storage = $codebase->methods->getUserMethodStorage($method_id); - - if ($method_storage) { - if ($method_storage->abstract - && $stmt->class instanceof PhpParser\Node\Name - && (!$context->self - || !UnionTypeComparator::isContainedBy( - $codebase, - $context->vars_in_scope['$this'] - ?? new Union([ - new TNamedObject($context->self) - ]), - new Union([ - new TNamedObject($method_id->fq_class_name) - ]) - )) - ) { - IssueBuffer::maybeAdd( - new AbstractMethodCall( - 'Cannot call an abstract static method ' . $method_id . ' directly', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (!$context->inside_throw) { - if ($context->pure && !$method_storage->pure) { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call an impure method from a pure context', - new CodeLocation($statements_analyzer, $stmt_name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($context->mutation_free && !$method_storage->mutation_free) { - IssueBuffer::maybeAdd( - new ImpureMethodCall( - 'Cannot call a possibly-mutating method from a mutation-free context', - new CodeLocation($statements_analyzer, $stmt_name) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - && !$method_storage->pure - ) { - if (!$method_storage->mutation_free) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - } - - $statements_analyzer->getSource()->inferred_impure = true; - } - } - - $generic_params = $template_result->lower_bounds; - - if ($method_storage->assertions) { - CallAnalyzer::applyAssertionsToContext( - $stmt_name, - null, - $method_storage->assertions, - $stmt->getArgs(), - $generic_params, - $context, - $statements_analyzer - ); - } - - if ($method_storage->if_true_assertions) { - $statements_analyzer->node_data->setIfTrueAssertions( - $stmt, - array_map( - function (Assertion $assertion) use ($generic_params, $codebase): Assertion { - return $assertion->getUntemplatedCopy($generic_params, null, $codebase); - }, - $method_storage->if_true_assertions - ) - ); - } - - if ($method_storage->if_false_assertions) { - $statements_analyzer->node_data->setIfFalseAssertions( - $stmt, - array_map( - function (Assertion $assertion) use ($generic_params, $codebase): Assertion { - return $assertion->getUntemplatedCopy($generic_params, null, $codebase); - }, - $method_storage->if_false_assertions - ) - ); - } - } - - if ($codebase->alter_code) { - foreach ($codebase->call_transforms as $original_pattern => $transformation) { - if ($declaring_method_id - && strtolower((string) $declaring_method_id) . '\((.*\))' === $original_pattern - ) { - if (strpos($transformation, '($1)') === strlen($transformation) - 4 - && $stmt->class instanceof PhpParser\Node\Name - ) { - $new_method_id = substr($transformation, 0, -4); - $old_declaring_fq_class_name = $declaring_method_id->fq_class_name; - [$new_fq_class_name, $new_method_name] = explode('::', $new_method_id); - - if ($codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $stmt->class, - $new_fq_class_name, - $context->calling_method_id, - strtolower($old_declaring_fq_class_name) !== strtolower($new_fq_class_name), - $stmt->class->parts[0] === 'self' - )) { - $moved_call = true; - } - - $file_manipulations = []; - - $file_manipulations[] = new FileManipulation( - (int) $stmt_name->getAttribute('startFilePos'), - (int) $stmt_name->getAttribute('endFilePos') + 1, - $new_method_name - ); - - FileManipulationBuffer::add( - $statements_analyzer->getFilePath(), - $file_manipulations - ); - } - } - } - } - - if ($config->eventDispatcher->hasAfterMethodCallAnalysisHandlers()) { - $file_manipulations = []; - - $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); - - if ($appearing_method_id !== null && $declaring_method_id) { - $event = new AfterMethodCallAnalysisEvent( - $stmt, - (string) $method_id, - (string) $appearing_method_id, - (string) $declaring_method_id, - $context, - $statements_analyzer, - $codebase, - $file_manipulations, - $return_type_candidate - ); - $config->eventDispatcher->dispatchAfterMethodCallAnalysis($event); - $file_manipulations = $event->getFileReplacements(); - $return_type_candidate = $event->getReturnTypeCandidate(); - } - - if ($file_manipulations) { - FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); - } - } - - $return_type_candidate = $return_type_candidate ?? Type::getMixed(); - - StaticCallAnalyzer::taintReturnType( - $statements_analyzer, - $stmt, - $method_id, - $cased_method_id, - $return_type_candidate, - $method_storage, - $template_result, - $context - ); - - $stmt_type = $statements_analyzer->node_data->getType($stmt); - $statements_analyzer->node_data->setType( - $stmt, - Type::combineUnionTypes($stmt_type, $return_type_candidate) - ); - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->name, - $method_id . '()' - ); - - if ($stmt_type = $statements_analyzer->node_data->getType($stmt)) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt->name, - $stmt_type->getId(), - $stmt - ); - } - } - } - - /** - * @param list $args - */ - private static function getMethodReturnType( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\StaticCall $stmt, - MethodIdentifier $method_id, - array $args, - TemplateResult $template_result, - ?string &$self_fq_class_name, - Atomic $lhs_type_part, - Context $context, - string $fq_class_name, - ClassLikeStorage $class_storage, - Config $config - ): ?Union { - $return_type_candidate = $codebase->methods->getMethodReturnType( - $method_id, - $self_fq_class_name, - $statements_analyzer, - $args - ); - - if ($return_type_candidate) { - $return_type_candidate = clone $return_type_candidate; - - if ($template_result->template_types) { - $bindable_template_types = $return_type_candidate->getTemplateTypes(); - - foreach ($bindable_template_types as $template_type) { - if (!isset( - $template_result->lower_bounds - [$template_type->param_name] - [$template_type->defining_class] - )) { - if ($template_type->param_name === 'TFunctionArgCount') { - $template_result->lower_bounds[$template_type->param_name] = [ - 'fn-' . strtolower((string)$method_id) => [ - new TemplateBound( - Type::getInt(false, count($stmt->getArgs())) - ) - ] - ]; - } elseif ($template_type->param_name === 'TPhpMajorVersion') { - $template_result->lower_bounds[$template_type->param_name] = [ - 'fn-' . strtolower((string)$method_id) => [ - new TemplateBound( - Type::getInt(false, $codebase->php_major_version) - ) - ] - ]; - } elseif ($template_type->param_name === 'TPhpVersionId') { - $template_result->lower_bounds[$template_type->param_name] = [ - 'fn-' . strtolower((string) $method_id) => [ - new TemplateBound( - Type::getInt( - false, - 10000 * $codebase->php_major_version - + 100 * $codebase->php_minor_version - ) - ) - ] - ]; - } else { - $template_result->lower_bounds[$template_type->param_name] = [ - ($template_type->defining_class) => [ - new TemplateBound(Type::getEmpty()) - ] - ]; - } - } - } - } - - $context_final = false; - - if ($lhs_type_part instanceof TTemplateParam) { - $static_type = $lhs_type_part; - } elseif ($lhs_type_part instanceof TTemplateParamClass) { - $static_type = new TTemplateParam( - $lhs_type_part->param_name, - $lhs_type_part->as_type - ? new Union([$lhs_type_part->as_type]) - : Type::getObject(), - $lhs_type_part->defining_class - ); - } elseif ($stmt->class instanceof PhpParser\Node\Name - && count($stmt->class->parts) === 1 - && in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true) - && $lhs_type_part instanceof TNamedObject - && $context->self - ) { - $static_type = $context->self; - $context_final = $codebase->classlike_storage_provider->get($context->self)->final; - } elseif ($context->calling_method_id !== null) { - // differentiate between these cases: - // 1. "static" comes from the CALLED static method - use $fq_class_name. - // 2. "static" in return type comes from return type of the - // method CALLING the currently analyzed static method - use $context->self. - $static_type = self::hasStaticInType($return_type_candidate) - ? $fq_class_name - : $context->self; - } else { - $static_type = $fq_class_name; - } - - if ($template_result->lower_bounds) { - $return_type_candidate = TypeExpander::expandUnion( - $codebase, - $return_type_candidate, - null, - null, - null - ); - - TemplateInferredTypeReplacer::replace( - $return_type_candidate, - $template_result, - $codebase - ); - } - - $return_type_candidate = TypeExpander::expandUnion( - $codebase, - $return_type_candidate, - $self_fq_class_name, - $static_type, - $class_storage->parent_class, - true, - false, - is_string($static_type) - && ($static_type !== $context->self - || $class_storage->final - || $context_final) - ); - - $secondary_return_type_location = null; - - $return_type_location = $codebase->methods->getMethodReturnTypeLocation( - $method_id, - $secondary_return_type_location - ); - - if ($secondary_return_type_location) { - $return_type_location = $secondary_return_type_location; - } - - // only check the type locally if it's defined externally - if ($return_type_location && !$config->isInProjectDirs($return_type_location->file_path)) { - $return_type_candidate->check( - $statements_analyzer, - new CodeLocation($statements_analyzer, $stmt), - $statements_analyzer->getSuppressedIssues(), - $context->phantom_classes, - true, - false, - false, - $context->calling_method_id - ); - } - } - - return $return_type_candidate; - } - - /** - * Dumb way to determine whether a type contains "static" somewhere inside. - */ - private static function hasStaticInType(Type\TypeNode $type): bool - { - if ($type instanceof TNamedObject && ($type->value === 'static' || $type->was_static)) { - return true; - } - - foreach ($type->getChildNodes() as $child_type) { - if (self::hasStaticInType($child_type)) { - return true; - } - } - - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php deleted file mode 100644 index 9cc9d850..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php +++ /dev/null @@ -1,1171 +0,0 @@ -getFQCLN(); - - $project_analyzer = $source->getFileAnalyzer()->project_analyzer; - $codebase = $source->getCodebase(); - - if ($context->collect_mutations && - $context->self && - ( - $context->self === $fq_class_name || - $codebase->classExtends( - $context->self, - $fq_class_name - ) - ) - ) { - $method_id = new MethodIdentifier( - $fq_class_name, - $method_name_lc - ); - - if ((string) $method_id !== $source->getId()) { - if ($context->collect_initializations) { - if (isset($context->initialized_methods[(string) $method_id])) { - return; - } - - if ($context->initialized_methods === null) { - $context->initialized_methods = []; - } - - $context->initialized_methods[(string) $method_id] = true; - } - - $project_analyzer->getMethodMutations( - $method_id, - $context, - $source->getRootFilePath(), - $source->getRootFileName() - ); - } - } elseif ($context->collect_initializations && - $context->self && - ( - $context->self === $fq_class_name - || $codebase->classlikes->classExtends( - $context->self, - $fq_class_name - ) - ) && - $source->getMethodName() !== $method_name - ) { - $method_id = new MethodIdentifier($fq_class_name, $method_name_lc); - - $declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if (isset($context->vars_in_scope['$this'])) { - foreach ($context->vars_in_scope['$this']->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TNamedObject) { - if ($fq_class_name === $atomic_type->value) { - $alt_declaring_method_id = $declaring_method_id; - } else { - $fq_class_name = $atomic_type->value; - - $method_id = new MethodIdentifier( - $fq_class_name, - $method_name_lc - ); - - $alt_declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - } - - if ($alt_declaring_method_id) { - $declaring_method_id = $alt_declaring_method_id; - break; - } - - if (!$atomic_type->extra_types) { - continue; - } - - foreach ($atomic_type->extra_types as $intersection_type) { - if ($intersection_type instanceof TNamedObject) { - $fq_class_name = $intersection_type->value; - $method_id = new MethodIdentifier( - $fq_class_name, - $method_name_lc - ); - - $alt_declaring_method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if ($alt_declaring_method_id) { - $declaring_method_id = $alt_declaring_method_id; - break 2; - } - } - } - } - } - } - - if (!$declaring_method_id) { - // can happen for __call - return; - } - - if (isset($context->initialized_methods[(string) $declaring_method_id])) { - return; - } - - if ($context->initialized_methods === null) { - $context->initialized_methods = []; - } - - $context->initialized_methods[(string) $declaring_method_id] = true; - - $method_storage = $codebase->methods->getStorage($declaring_method_id); - - $class_analyzer = $source->getSource(); - - $is_final = $method_storage->final; - - if ($method_name !== $declaring_method_id->method_name) { - $appearing_method_id = $codebase->methods->getAppearingMethodId($method_id); - - if ($appearing_method_id) { - $appearing_class_storage = $codebase->classlike_storage_provider->get( - $appearing_method_id->fq_class_name - ); - - if (isset($appearing_class_storage->trait_final_map[$method_name_lc])) { - $is_final = true; - } - } - } - - if ($class_analyzer instanceof ClassLikeAnalyzer - && !$method_storage->is_static - && ($context->collect_nonprivate_initializations - || $method_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE - || $is_final) - ) { - $local_vars_in_scope = []; - - foreach ($context->vars_in_scope as $var_id => $type) { - if (strpos($var_id, '$this->') === 0) { - if ($type->initialized) { - $local_vars_in_scope[$var_id] = $context->vars_in_scope[$var_id]; - - unset($context->vars_in_scope[$var_id]); - unset($context->vars_possibly_in_scope[$var_id]); - } - } elseif ($var_id !== '$this') { - $local_vars_in_scope[$var_id] = $context->vars_in_scope[$var_id]; - } - } - - $local_vars_possibly_in_scope = $context->vars_possibly_in_scope; - - $old_calling_method_id = $context->calling_method_id; - - if ($fq_class_name === $source->getFQCLN()) { - $class_analyzer->getMethodMutations($declaring_method_id->method_name, $context); - } else { - $declaring_fq_class_name = $declaring_method_id->fq_class_name; - - $old_self = $context->self; - $context->self = $declaring_fq_class_name; - $project_analyzer->getMethodMutations( - $declaring_method_id, - $context, - $source->getRootFilePath(), - $source->getRootFileName() - ); - $context->self = $old_self; - } - - $context->calling_method_id = $old_calling_method_id; - - foreach ($local_vars_in_scope as $var => $type) { - $context->vars_in_scope[$var] = $type; - } - - foreach ($local_vars_possibly_in_scope as $var => $_) { - $context->vars_possibly_in_scope[$var] = true; - } - } - } - } - - /** - * @param list $args - */ - public static function checkMethodArgs( - ?MethodIdentifier $method_id, - array $args, - ?TemplateResult $class_template_result, - Context $context, - CodeLocation $code_location, - StatementsAnalyzer $statements_analyzer - ): bool { - $codebase = $statements_analyzer->getCodebase(); - - if (!$method_id) { - return ArgumentsAnalyzer::analyze( - $statements_analyzer, - $args, - null, - null, - true, - $context, - $class_template_result - ) !== false; - } - - $method_params = $codebase->methods->getMethodParams($method_id, $statements_analyzer, $args, $context); - - $fq_class_name = $method_id->fq_class_name; - $method_name = $method_id->method_name; - - $fq_class_name = strtolower($codebase->classlikes->getUnAliasedName($fq_class_name)); - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $method_storage = null; - - if (isset($class_storage->declaring_method_ids[$method_name])) { - $declaring_method_id = $class_storage->declaring_method_ids[$method_name]; - - $declaring_fq_class_name = $declaring_method_id->fq_class_name; - $declaring_method_name = $declaring_method_id->method_name; - - if ($declaring_fq_class_name !== $fq_class_name) { - $declaring_class_storage = $codebase->classlike_storage_provider->get($declaring_fq_class_name); - } else { - $declaring_class_storage = $class_storage; - } - - if (!isset($declaring_class_storage->methods[$declaring_method_name])) { - throw new UnexpectedValueException('Storage should not be empty here'); - } - - $method_storage = $declaring_class_storage->methods[$declaring_method_name]; - - if ($declaring_class_storage->user_defined - && !$method_storage->has_docblock_param_types - && isset($declaring_class_storage->documenting_method_ids[$method_name]) - ) { - $documenting_method_id = $declaring_class_storage->documenting_method_ids[$method_name]; - - $documenting_method_storage = $codebase->methods->getStorage($documenting_method_id); - - if ($documenting_method_storage->template_types) { - $method_storage = $documenting_method_storage; - } - } - - if (!$context->isSuppressingExceptions($statements_analyzer)) { - $context->mergeFunctionExceptions($method_storage, $code_location); - } - } - - if (ArgumentsAnalyzer::analyze( - $statements_analyzer, - $args, - $method_params, - (string) $method_id, - $method_storage->allow_named_arg_calls ?? true, - $context, - $class_template_result - ) === false) { - return false; - } - - if (ArgumentsAnalyzer::checkArgumentsMatch( - $statements_analyzer, - $args, - $method_id, - $method_params, - $method_storage, - $class_storage, - $class_template_result, - $code_location, - $context - ) === false) { - return false; - } - - if ($class_template_result) { - self::checkTemplateResult( - $statements_analyzer, - $class_template_result, - $code_location, - strtolower((string) $method_id) - ); - } - - return true; - } - - /** - * This gets all the template params (and their types) that we think - * we'll need to know about - * - * @return array> - * @param array> $existing_template_types - * @param array> $class_template_params - */ - public static function getTemplateTypesForCall( - Codebase $codebase, - ?ClassLikeStorage $declaring_class_storage, - ?string $appearing_class_name, - ?ClassLikeStorage $calling_class_storage, - array $existing_template_types = [], - array $class_template_params = [] - ): array { - $template_types = $existing_template_types; - - if ($declaring_class_storage) { - if ($calling_class_storage - && $declaring_class_storage !== $calling_class_storage - && $calling_class_storage->template_extended_params - ) { - foreach ($calling_class_storage->template_extended_params as $class_name => $type_map) { - foreach ($type_map as $template_name => $type) { - if ($class_name === $declaring_class_storage->name) { - $output_type = null; - - foreach ($type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TTemplateParam) { - $output_type_candidate = self::getGenericParamForOffset( - $atomic_type->defining_class, - $atomic_type->param_name, - $calling_class_storage->template_extended_params, - $class_template_params + $template_types - ); - } else { - $output_type_candidate = new Union([$atomic_type]); - } - - $output_type = Type::combineUnionTypes( - $output_type_candidate, - $output_type - ); - } - - $template_types[$template_name][$declaring_class_storage->name] = $output_type; - } - } - } - } elseif ($declaring_class_storage->template_types) { - foreach ($declaring_class_storage->template_types as $template_name => $type_map) { - foreach ($type_map as $key => $type) { - $template_types[$template_name][$key] - = $class_template_params[$template_name][$key] ?? $type; - } - } - } - } - - foreach ($template_types as $key => $type_map) { - foreach ($type_map as $class => $type) { - $template_types[$key][$class] = TypeExpander::expandUnion( - $codebase, - $type, - $appearing_class_name, - $calling_class_storage->name ?? null, - null, - true, - false, - $calling_class_storage->final ?? false - ); - } - } - - return $template_types; - } - - /** - * @param array> $template_extended_params - * @param array> $found_generic_params - */ - public static function getGenericParamForOffset( - string $fq_class_name, - string $template_name, - array $template_extended_params, - array $found_generic_params - ): Union { - if (isset($found_generic_params[$template_name][$fq_class_name])) { - return $found_generic_params[$template_name][$fq_class_name]; - } - - foreach ($template_extended_params as $extended_class_name => $type_map) { - foreach ($type_map as $extended_template_name => $extended_type) { - foreach ($extended_type->getAtomicTypes() as $extended_atomic_type) { - if ($extended_atomic_type instanceof TTemplateParam - && $extended_atomic_type->param_name === $template_name - && $extended_atomic_type->defining_class === $fq_class_name - ) { - return self::getGenericParamForOffset( - $extended_class_name, - $extended_template_name, - $template_extended_params, - $found_generic_params - ); - } - } - } - } - - return Type::getMixed(); - } - - /** - * @param PhpParser\Node\Scalar\String_|PhpParser\Node\Expr\Array_|PhpParser\Node\Expr\BinaryOp\Concat $callable_arg - * - * @return list - * - * @psalm-suppress LessSpecificReturnStatement - * @psalm-suppress MoreSpecificReturnType - */ - public static function getFunctionIdsFromCallableArg( - FileSource $file_source, - PhpParser\Node\Expr $callable_arg - ): array { - if ($callable_arg instanceof PhpParser\Node\Expr\BinaryOp\Concat) { - if ($callable_arg->left instanceof PhpParser\Node\Expr\ClassConstFetch - && $callable_arg->left->class instanceof Name - && $callable_arg->left->name instanceof Identifier - && strtolower($callable_arg->left->name->name) === 'class' - && !in_array(strtolower($callable_arg->left->class->parts[0]), ['self', 'static', 'parent']) - && $callable_arg->right instanceof PhpParser\Node\Scalar\String_ - && preg_match('/^::[A-Za-z0-9]+$/', $callable_arg->right->value) - ) { - return [ - (string) $callable_arg->left->class->getAttribute('resolvedName') . $callable_arg->right->value - ]; - } - - return []; - } - - if ($callable_arg instanceof PhpParser\Node\Scalar\String_) { - $potential_id = preg_replace('/^\\\/', '', $callable_arg->value); - - if (preg_match('/^[A-Za-z0-9_]+(\\\[A-Za-z0-9_]+)*(::[A-Za-z0-9_]+)?$/', $potential_id)) { - return [$potential_id]; - } - - return []; - } - - if (count($callable_arg->items) !== 2) { - return []; - } - - /** @psalm-suppress PossiblyNullPropertyFetch */ - if ($callable_arg->items[0]->key || $callable_arg->items[1]->key) { - return []; - } - - if (!isset($callable_arg->items[0]) || !isset($callable_arg->items[1])) { - throw new UnexpectedValueException('These should never be unset'); - } - - $class_arg = $callable_arg->items[0]->value; - $method_name_arg = $callable_arg->items[1]->value; - - if (!$method_name_arg instanceof PhpParser\Node\Scalar\String_) { - return []; - } - - if ($class_arg instanceof PhpParser\Node\Scalar\String_) { - return [preg_replace('/^\\\/', '', $class_arg->value) . '::' . $method_name_arg->value]; - } - - if ($class_arg instanceof PhpParser\Node\Expr\ClassConstFetch - && $class_arg->name instanceof Identifier - && strtolower($class_arg->name->name) === 'class' - && $class_arg->class instanceof Name - ) { - $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( - $class_arg->class, - $file_source->getAliases() - ); - - return [$fq_class_name . '::' . $method_name_arg->value]; - } - - if (!$file_source instanceof StatementsAnalyzer - || !($class_arg_type = $file_source->node_data->getType($class_arg)) - ) { - return []; - } - - $method_ids = []; - - foreach ($class_arg_type->getAtomicTypes() as $type_part) { - if ($type_part instanceof TNamedObject) { - $method_id = $type_part->value . '::' . $method_name_arg->value; - - if ($type_part->extra_types) { - foreach ($type_part->extra_types as $extra_type) { - if ($extra_type instanceof TTemplateParam - || $extra_type instanceof TObjectWithProperties - ) { - throw new UnexpectedValueException('Shouldn’t get a generic param here'); - } - - $method_id .= '&' . $extra_type->value . '::' . $method_name_arg->value; - } - } - - $method_ids[] = '$' . $method_id; - } - } - - return $method_ids; - } - - /** - * @param non-empty-string $function_id - * @param bool $can_be_in_root_scope if true, the function can be shortened to the root version - * - */ - public static function checkFunctionExists( - StatementsAnalyzer $statements_analyzer, - string &$function_id, - CodeLocation $code_location, - bool $can_be_in_root_scope - ): bool { - $cased_function_id = $function_id; - $function_id = strtolower($function_id); - - $codebase = $statements_analyzer->getCodebase(); - - if (!$codebase->functions->functionExists($statements_analyzer, $function_id)) { - /** @var non-empty-lowercase-string */ - $root_function_id = preg_replace('/.*\\\/', '', $function_id); - - if ($can_be_in_root_scope - && $function_id !== $root_function_id - && $codebase->functions->functionExists($statements_analyzer, $root_function_id) - ) { - $function_id = $root_function_id; - } else { - IssueBuffer::maybeAdd( - new UndefinedFunction( - 'Function ' . $cased_function_id . ' does not exist', - $code_location, - $function_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - return false; - } - } - - return true; - } - - /** - * @param Identifier|Name $expr - * @param Assertion[] $assertions - * @param list $args - * @param array>> $inferred_lower_bounds, - * - */ - public static function applyAssertionsToContext( - PhpParser\NodeAbstract $expr, - ?string $thisName, - array $assertions, - array $args, - array $inferred_lower_bounds, - Context $context, - StatementsAnalyzer $statements_analyzer - ): void { - $type_assertions = []; - - $asserted_keys = []; - - foreach ($assertions as $assertion) { - $assertion_var_id = null; - - $arg_value = null; - - if (is_int($assertion->var_id)) { - if (!isset($args[$assertion->var_id])) { - continue; - } - - $arg_value = $args[$assertion->var_id]->value; - - $arg_var_id = ExpressionIdentifier::getArrayVarId($arg_value, null, $statements_analyzer); - - if ($arg_var_id) { - $assertion_var_id = $arg_var_id; - } - } elseif ($assertion->var_id === '$this' && $thisName !== null) { - $assertion_var_id = $thisName; - } elseif (strpos($assertion->var_id, '$this->') === 0 && $thisName !== null) { - $assertion_var_id = $thisName . str_replace('$this->', '->', $assertion->var_id); - } elseif (strpos($assertion->var_id, 'self::') === 0 && $context->self) { - $assertion_var_id = $context->self . str_replace('self::', '::', $assertion->var_id); - } elseif (strpos($assertion->var_id, '::$') !== false) { - // allow assertions to bring external static props into scope - $assertion_var_id = $assertion->var_id; - } elseif (isset($context->vars_in_scope[$assertion->var_id])) { - $assertion_var_id = $assertion->var_id; - } elseif (strpos($assertion->var_id, '->') !== false) { - $exploded = explode('->', $assertion->var_id); - - if (count($exploded) < 2) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Assert notation is malformed', - new CodeLocation($statements_analyzer, $expr) - ) - ); - continue; - } - - [$var_id, $property] = $exploded; - - $var_id = is_numeric($var_id) ? (int) $var_id : $var_id; - - if (!is_int($var_id) || !isset($args[$var_id])) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Variable ' . $var_id . ' is not an argument so cannot be asserted', - new CodeLocation($statements_analyzer, $expr) - ) - ); - continue; - } - - /** @var PhpParser\Node\Expr\Variable $arg_value */ - $arg_value = $args[$var_id]->value; - - $arg_var_id = ExpressionIdentifier::getArrayVarId($arg_value, null, $statements_analyzer); - - if (!$arg_var_id) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Variable being asserted as argument ' . ($var_id+1) . ' cannot be found in local scope', - new CodeLocation($statements_analyzer, $expr) - ) - ); - continue; - } - - if (count($exploded) === 2) { - $failedMessage = AssertionFinder::isPropertyImmutableOnArgument( - $property, - $statements_analyzer->getNodeTypeProvider(), - $statements_analyzer->getCodebase()->classlike_storage_provider, - $arg_value - ); - - if (null !== $failedMessage) { - IssueBuffer::maybeAdd( - new InvalidDocblock($failedMessage, new CodeLocation($statements_analyzer, $expr)) - ); - continue; - } - } - - $assertion_var_id = str_replace((string) $var_id, $arg_var_id, $assertion->var_id); - } - - $codebase = $statements_analyzer->getCodebase(); - - if ($assertion_var_id) { - $rule = $assertion->rule[0][0]; - - $prefix = ''; - if ($rule[0] === '!') { - $prefix .= '!'; - $rule = substr($rule, 1); - } - if ($rule[0] === '=') { - $prefix .= '='; - $rule = substr($rule, 1); - } - if ($rule[0] === '~') { - $prefix .= '~'; - $rule = substr($rule, 1); - } - - if (isset($inferred_lower_bounds[$rule])) { - foreach ($inferred_lower_bounds[$rule] as $lower_bounds) { - $lower_bound_type = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $lower_bounds, - $codebase - ); - - if ($lower_bound_type->hasMixed()) { - continue 2; - } - - $replacement_atomic_types = $lower_bound_type->getAtomicTypes(); - - if (count($replacement_atomic_types) > 1) { - continue 2; - } - - $ored_type_assertions = []; - - foreach ($replacement_atomic_types as $replacement_atomic_type) { - if ($replacement_atomic_type instanceof TMixed) { - continue 3; - } - - if ($replacement_atomic_type instanceof TArray - || $replacement_atomic_type instanceof TKeyedArray - || $replacement_atomic_type instanceof TList - ) { - $ored_type_assertions[] = $prefix . $replacement_atomic_type->getId(); - } elseif ($replacement_atomic_type instanceof TNamedObject) { - $ored_type_assertions[] = $prefix . $replacement_atomic_type->value; - } elseif ($replacement_atomic_type instanceof Scalar) { - $ored_type_assertions[] = $prefix . $replacement_atomic_type->getAssertionString(); - } elseif ($replacement_atomic_type instanceof TNull) { - $ored_type_assertions[] = $prefix . 'null'; - } elseif ($replacement_atomic_type instanceof TTemplateParam) { - $ored_type_assertions[] = $prefix . $replacement_atomic_type->param_name; - } - } - - if ($ored_type_assertions) { - $type_assertions[$assertion_var_id] = [$ored_type_assertions]; - } - } - } else { - if (isset($type_assertions[$assertion_var_id])) { - $type_assertions[$assertion_var_id] = array_merge( - $type_assertions[$assertion_var_id], - $assertion->rule - ); - } else { - $type_assertions[$assertion_var_id] = $assertion->rule; - } - } - } elseif ($arg_value && ($assertion->rule === [['!falsy']] || $assertion->rule === [['true']])) { - if ($assertion->rule === [['true']]) { - $conditional = new VirtualIdentical( - $arg_value, - new VirtualConstFetch(new VirtualName('true')) - ); - - $assert_clauses = FormulaGenerator::getFormula( - mt_rand(0, 1000000), - mt_rand(0, 1000000), - $conditional, - $context->self, - $statements_analyzer, - $codebase - ); - } else { - $assert_clauses = FormulaGenerator::getFormula( - spl_object_id($arg_value), - spl_object_id($arg_value), - $arg_value, - $context->self, - $statements_analyzer, - $statements_analyzer->getCodebase() - ); - } - - $simplified_clauses = Algebra::simplifyCNF( - array_merge($context->clauses, $assert_clauses) - ); - - $assert_type_assertions = Algebra::getTruthsFromFormula( - $simplified_clauses - ); - - $type_assertions = array_merge($type_assertions, $assert_type_assertions); - } elseif ($arg_value && $assertion->rule === [['falsy']]) { - $assert_clauses = Algebra::negateFormula( - FormulaGenerator::getFormula( - spl_object_id($arg_value), - spl_object_id($arg_value), - $arg_value, - $context->self, - $statements_analyzer, - $codebase - ) - ); - - $simplified_clauses = Algebra::simplifyCNF( - array_merge($context->clauses, $assert_clauses) - ); - - $assert_type_assertions = Algebra::getTruthsFromFormula( - $simplified_clauses - ); - - $type_assertions = array_merge($type_assertions, $assert_type_assertions); - } - } - - $changed_var_ids = []; - - foreach ($type_assertions as $var_id => $_) { - $asserted_keys[$var_id] = true; - } - - $codebase = $statements_analyzer->getCodebase(); - - if ($type_assertions) { - $template_type_map = array_map( - function ($type_map) use ($codebase) { - return array_map( - function ($bounds) use ($codebase) { - return TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $bounds, - $codebase - ); - }, - $type_map - ); - }, - $inferred_lower_bounds - ); - - foreach (($statements_analyzer->getTemplateTypeMap() ?: []) as $template_name => $map) { - foreach ($map as $ref => $type) { - $template_type_map[$template_name][$ref] = new Union([ - new TTemplateParam( - $template_name, - $type, - $ref - ) - ]); - } - } - - // while in an and, we allow scope to boil over to support - // statements of the form if ($x && $x->foo()) - $op_vars_in_scope = Reconciler::reconcileKeyedTypes( - $type_assertions, - $type_assertions, - $context->vars_in_scope, - $changed_var_ids, - $asserted_keys, - $statements_analyzer, - $template_type_map, - $context->inside_loop, - new CodeLocation($statements_analyzer->getSource(), $expr) - ); - - foreach ($changed_var_ids as $var_id => $_) { - if (isset($op_vars_in_scope[$var_id])) { - $first_appearance = $statements_analyzer->getFirstAppearance($var_id); - - if ($first_appearance - && isset($context->vars_in_scope[$var_id]) - && $context->vars_in_scope[$var_id]->hasMixed() - ) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->decrementMixedCount($statements_analyzer->getFilePath()); - } - - IssueBuffer::remove( - $statements_analyzer->getFilePath(), - 'MixedAssignment', - $first_appearance->raw_file_start - ); - } - - if ($template_type_map) { - $readonly_template_result = new TemplateResult($template_type_map, $template_type_map); - - TemplateInferredTypeReplacer::replace( - $op_vars_in_scope[$var_id], - $readonly_template_result, - $codebase - ); - } - - $op_vars_in_scope[$var_id]->from_docblock = true; - - foreach ($op_vars_in_scope[$var_id]->getAtomicTypes() as $changed_atomic_type) { - $changed_atomic_type->from_docblock = true; - - if ($changed_atomic_type instanceof TNamedObject - && $changed_atomic_type->extra_types - ) { - foreach ($changed_atomic_type->extra_types as $extra_type) { - $extra_type->from_docblock = true; - } - } - } - } - } - - $context->vars_in_scope = $op_vars_in_scope; - } - } - - /** - * This method looks for problems with a generated TemplateResult. - * - * The TemplateResult object contains upper bounds and lower bounds for each template param. - * - * Those upper bounds represent a series of constraints like - * - * Lower bound: - * T >: X (the type param T matches X, or is a supertype of X) - * Upper bound: - * T <: Y (the type param T matches Y, or is a subtype of Y) - * Equality (currently represented as an upper bound with a special flag) - * T = Z (the template T must match Z) - * - * This method attempts to reconcile those constraints. - * - * Valid constraints: - * - * T <: int|float, T >: int --- implies T is an int - * T = int --- implies T is an int - * - * Invalid constraints: - * - * T <: int|string, T >: string|float --- implies T <: int and T >: float, which is impossible - * T = int, T = string --- implies T is a string _and_ and int, which is impossible - */ - public static function checkTemplateResult( - StatementsAnalyzer $statements_analyzer, - TemplateResult $template_result, - CodeLocation $code_location, - ?string $function_id - ): void { - if ($template_result->lower_bounds && $template_result->upper_bounds) { - foreach ($template_result->upper_bounds as $template_name => $defining_map) { - foreach ($defining_map as $defining_id => $upper_bound) { - if (isset($template_result->lower_bounds[$template_name][$defining_id])) { - $lower_bound_type = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $template_result->lower_bounds[$template_name][$defining_id], - $statements_analyzer->getCodebase() - ); - - $upper_bound_type = $upper_bound->type; - - $union_comparison_result = new TypeComparisonResult(); - - if (count($template_result->upper_bounds_unintersectable_types) > 1) { - [$lower_bound_type, $upper_bound_type] - = $template_result->upper_bounds_unintersectable_types; - } - - if (!UnionTypeComparator::isContainedBy( - $statements_analyzer->getCodebase(), - $lower_bound_type, - $upper_bound_type, - false, - false, - $union_comparison_result - )) { - if ($union_comparison_result->type_coerced) { - if ($union_comparison_result->type_coerced_from_mixed) { - IssueBuffer::maybeAdd( - new MixedArgumentTypeCoercion( - 'Type ' . $lower_bound_type->getId() . ' should be a subtype of ' - . $upper_bound_type->getId(), - $code_location, - $function_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new ArgumentTypeCoercion( - 'Type ' . $lower_bound_type->getId() . ' should be a subtype of ' - . $upper_bound_type->getId(), - $code_location, - $function_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } elseif ($union_comparison_result->scalar_type_match_found) { - IssueBuffer::maybeAdd( - new InvalidScalarArgument( - 'Type ' . $lower_bound_type->getId() . ' should be a subtype of ' - . $upper_bound_type->getId(), - $code_location, - $function_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidArgument( - 'Type ' . $lower_bound_type->getId() . ' should be a subtype of ' - . $upper_bound_type->getId(), - $code_location, - $function_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } else { - $template_result->lower_bounds[$template_name][$defining_id] = [ - new TemplateBound( - clone $upper_bound->type - ) - ]; - } - } - } - } - - // Attempt to identify invalid lower bounds - foreach ($template_result->lower_bounds as $template_name => $lower_bounds) { - foreach ($lower_bounds as $lower_bounds) { - if (count($lower_bounds) > 1) { - $bounds_with_equality = array_filter( - $lower_bounds, - function ($lower_bound) { - return (bool)$lower_bound->equality_bound_classlike; - } - ); - - if (!$bounds_with_equality) { - continue; - } - - $equality_types = array_unique( - array_map( - function ($bound_with_equality) { - return $bound_with_equality->type->getId(); - }, - $bounds_with_equality - ) - ); - - if (count($equality_types) > 1) { - IssueBuffer::maybeAdd( - new InvalidArgument( - 'Incompatible types found for ' . $template_name . ' (must have only one of ' . - implode(', ', $equality_types) . ')', - $code_location, - $function_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - foreach ($lower_bounds as $lower_bound) { - if ($lower_bound->equality_bound_classlike === null) { - foreach ($bounds_with_equality as $bound_with_equality) { - if (UnionTypeComparator::isContainedBy( - $statements_analyzer->getCodebase(), - $lower_bound->type, - $bound_with_equality->type - ) && UnionTypeComparator::isContainedBy( - $statements_analyzer->getCodebase(), - $bound_with_equality->type, - $lower_bound->type - )) { - continue 2; - } - } - - IssueBuffer::maybeAdd( - new InvalidArgument( - 'Incompatible types found for ' . $template_name . ' (' . - $lower_bound->type->getId() . ' is not in ' . - implode(', ', $equality_types) . ')', - $code_location, - $function_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - } - } - } - } -} 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 deleted file mode 100644 index 439ee3bf..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php +++ /dev/null @@ -1,538 +0,0 @@ -expr, $context) === false) { - return false; - } - - $as_int = true; - $valid_int_type = null; - $maybe_type = $statements_analyzer->node_data->getType($stmt->expr); - - if ($maybe_type) { - if ($maybe_type->isInt()) { - $valid_int_type = $maybe_type; - if (!$maybe_type->from_calculation) { - self::handleRedundantCast($maybe_type, $statements_analyzer, $stmt); - } - } - - if (count($maybe_type->getAtomicTypes()) === 1 - && $maybe_type->getSingleAtomic() instanceof TBool) { - $as_int = false; - $type = new Union([ - new TLiteralInt(0), - new TLiteralInt(1), - ]); - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - ) { - $type->parent_nodes = $maybe_type->parent_nodes; - } - - $statements_analyzer->node_data->setType($stmt, $type); - } - } - - if ($as_int) { - $type = $valid_int_type ?? Type::getInt(); - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - ) { - $type->parent_nodes = $maybe_type->parent_nodes ?? []; - } - - $statements_analyzer->node_data->setType($stmt, $type); - } - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\Double) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - return false; - } - - $maybe_type = $statements_analyzer->node_data->getType($stmt->expr); - - if ($maybe_type) { - if ($maybe_type->isFloat()) { - self::handleRedundantCast($maybe_type, $statements_analyzer, $stmt); - } - } - - $type = Type::getFloat(); - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - ) { - $type->parent_nodes = $maybe_type->parent_nodes ?? []; - } - - $statements_analyzer->node_data->setType($stmt, $type); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\Bool_) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - return false; - } - - $maybe_type = $statements_analyzer->node_data->getType($stmt->expr); - - if ($maybe_type) { - if ($maybe_type->isBool()) { - self::handleRedundantCast($maybe_type, $statements_analyzer, $stmt); - } - } - - $type = Type::getBool(); - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - ) { - $type->parent_nodes = $maybe_type->parent_nodes ?? []; - } - - $statements_analyzer->node_data->setType($stmt, $type); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\String_) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - return false; - } - - $stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr); - - if ($stmt_expr_type) { - if ($stmt_expr_type->isString()) { - self::handleRedundantCast($stmt_expr_type, $statements_analyzer, $stmt); - } - - $stmt_type = self::castStringAttempt( - $statements_analyzer, - $context, - $stmt_expr_type, - $stmt->expr, - true - ); - } else { - $stmt_type = Type::getString(); - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\Object_) { - if (!self::checkExprGeneralUse($statements_analyzer, $stmt, $context)) { - return false; - } - - $permissible_atomic_types = []; - $all_permissible = false; - - if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { - if ($stmt_expr_type->isObjectType()) { - self::handleRedundantCast($stmt_expr_type, $statements_analyzer, $stmt); - } - - $all_permissible = true; - - foreach ($stmt_expr_type->getAtomicTypes() as $type) { - if ($type instanceof Scalar) { - $objWithProps = new TObjectWithProperties(['scalar' => new Union([$type])]); - $permissible_atomic_types[] = $objWithProps; - } elseif ($type instanceof TKeyedArray) { - $permissible_atomic_types[] = new TObjectWithProperties($type->properties); - } else { - $all_permissible = false; - break; - } - } - } - - if ($permissible_atomic_types && $all_permissible) { - $type = TypeCombiner::combine($permissible_atomic_types); - } else { - $type = Type::getObject(); - } - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph - ) { - $type->parent_nodes = $stmt_expr_type->parent_nodes ?? []; - } - - $statements_analyzer->node_data->setType($stmt, $type); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\Array_) { - if (!self::checkExprGeneralUse($statements_analyzer, $stmt, $context)) { - return false; - } - - $permissible_atomic_types = []; - $all_permissible = false; - - if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { - if ($stmt_expr_type->isArray()) { - self::handleRedundantCast($stmt_expr_type, $statements_analyzer, $stmt); - } - - $all_permissible = true; - - foreach ($stmt_expr_type->getAtomicTypes() as $type) { - if ($type instanceof Scalar) { - $keyed_array = new TKeyedArray([new Union([$type])]); - $keyed_array->is_list = true; - $keyed_array->sealed = true; - $permissible_atomic_types[] = $keyed_array; - } elseif ($type instanceof TNull) { - $permissible_atomic_types[] = new TArray([Type::getEmpty(), Type::getEmpty()]); - } elseif ($type instanceof TArray - || $type instanceof TList - || $type instanceof TKeyedArray - ) { - $permissible_atomic_types[] = clone $type; - } else { - $all_permissible = false; - break; - } - } - } - - if ($permissible_atomic_types && $all_permissible) { - $type = TypeCombiner::combine($permissible_atomic_types); - } else { - $type = Type::getArray(); - } - - if ($statements_analyzer->data_flow_graph) { - $type->parent_nodes = $stmt_expr_type->parent_nodes ?? []; - } - - $statements_analyzer->node_data->setType($stmt, $type); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\Unset_ - && $statements_analyzer->getCodebase()->php_major_version < 8 - ) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - return false; - } - - $statements_analyzer->node_data->setType($stmt, Type::getNull()); - - return true; - } - - IssueBuffer::maybeAdd( - new UnrecognizedExpression( - 'Psalm does not understand the cast ' . get_class($stmt), - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return false; - } - - public static function castStringAttempt( - StatementsAnalyzer $statements_analyzer, - Context $context, - Union $stmt_type, - PhpParser\Node\Expr $stmt, - bool $explicit_cast = false - ): Union { - $codebase = $statements_analyzer->getCodebase(); - - $invalid_casts = []; - $valid_strings = []; - $castable_types = []; - - $atomic_types = $stmt_type->getAtomicTypes(); - - $parent_nodes = []; - - if ($statements_analyzer->data_flow_graph) { - $parent_nodes = $stmt_type->parent_nodes; - } - - while ($atomic_types) { - $atomic_type = array_pop($atomic_types); - - if ($atomic_type instanceof TFloat - || $atomic_type instanceof TInt - || $atomic_type instanceof TNumeric - ) { - if ($atomic_type instanceof TLiteralInt || $atomic_type instanceof TLiteralFloat) { - $castable_types[] = new TLiteralString((string) $atomic_type->value); - } elseif ($atomic_type instanceof TNonspecificLiteralInt) { - $castable_types[] = new TNonspecificLiteralString(); - } else { - $castable_types[] = new TNumericString(); - } - - continue; - } - - if ($atomic_type instanceof TString) { - $valid_strings[] = $atomic_type; - - continue; - } - - if ($atomic_type instanceof TNull - || $atomic_type instanceof TFalse - ) { - $valid_strings[] = new TLiteralString(''); - continue; - } - - if ($atomic_type instanceof TMixed - || $atomic_type instanceof TResource - || $atomic_type instanceof Scalar - ) { - $castable_types[] = new TString(); - - continue; - } - - if ($atomic_type instanceof TNamedObject - || $atomic_type instanceof TObjectWithProperties - ) { - $intersection_types = [$atomic_type]; - - if ($atomic_type->extra_types) { - $intersection_types = array_merge($intersection_types, $atomic_type->extra_types); - } - - foreach ($intersection_types as $intersection_type) { - if ($intersection_type instanceof TNamedObject) { - $intersection_method_id = new MethodIdentifier( - $intersection_type->value, - '__tostring' - ); - - if ($codebase->methods->methodExists( - $intersection_method_id, - $context->calling_method_id, - new CodeLocation($statements_analyzer->getSource(), $stmt) - )) { - $return_type = $codebase->methods->getMethodReturnType( - $intersection_method_id, - $self_class - ) ?? Type::getString(); - - $declaring_method_id = $codebase->methods->getDeclaringMethodId($intersection_method_id); - - MethodCallReturnTypeFetcher::taintMethodCallResult( - $statements_analyzer, - $return_type, - $stmt, - $stmt, - [], - $intersection_method_id, - $declaring_method_id, - $intersection_type->value . '::__toString', - $context - ); - - if ($statements_analyzer->data_flow_graph) { - $parent_nodes = array_merge($return_type->parent_nodes, $parent_nodes); - } - - $castable_types = array_merge( - $castable_types, - array_values($return_type->getAtomicTypes()) - ); - - continue 2; - } - } - - if ($intersection_type instanceof TObjectWithProperties - && isset($intersection_type->methods['__toString']) - ) { - $castable_types[] = new TString(); - - continue 2; - } - } - } - - if ($atomic_type instanceof TTemplateParam) { - $atomic_types = array_merge($atomic_types, $atomic_type->as->getAtomicTypes()); - - continue; - } - - $invalid_casts[] = $atomic_type->getId(); - } - - if ($invalid_casts) { - if ($valid_strings || $castable_types) { - IssueBuffer::maybeAdd( - new PossiblyInvalidCast( - $invalid_casts[0] . ' cannot be cast to string', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidCast( - $invalid_casts[0] . ' cannot be cast to string', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } elseif ($explicit_cast && !$castable_types) { - // todo: emit error here - } - - $valid_types = array_merge($valid_strings, $castable_types); - - if (!$valid_types) { - $str_type = Type::getString(); - } else { - $str_type = TypeCombiner::combine( - $valid_types, - $codebase - ); - } - - if ($statements_analyzer->data_flow_graph) { - $str_type->parent_nodes = $parent_nodes; - } - - return $str_type; - } - - private static function checkExprGeneralUse( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\Cast $stmt, - Context $context - ): bool { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - $retVal = ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context); - $context->inside_general_use = $was_inside_general_use; - return $retVal; - } - - private static function handleRedundantCast( - Union $maybe_type, - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\Cast $stmt - ): void { - $codebase = $statements_analyzer->getCodebase(); - $project_analyzer = $statements_analyzer->getProjectAnalyzer(); - - $file_manipulation = null; - if ($maybe_type->from_docblock) { - $issue = new RedundantCastGivenDocblockType( - 'Redundant cast to ' . $maybe_type->getKey() . ' given docblock-provided type', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ); - - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['RedundantCastGivenDocblockType']) - ) { - $file_manipulation = new FileManipulation( - (int) $stmt->getAttribute('startFilePos'), - (int) $stmt->expr->getAttribute('startFilePos'), - '' - ); - } - } else { - $issue = new RedundantCast( - 'Redundant cast to ' . $maybe_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt) - ); - - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['RedundantCast']) - ) { - $file_manipulation = new FileManipulation( - (int) $stmt->getAttribute('startFilePos'), - (int) $stmt->expr->getAttribute('startFilePos'), - '' - ); - } - } - - if ($file_manipulation) { - FileManipulationBuffer::add($statements_analyzer->getFilePath(), [$file_manipulation]); - } - - - if (IssueBuffer::accepts($issue, $statements_analyzer->getSuppressedIssues())) { - // fall through - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php deleted file mode 100644 index 45ed9e9a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php +++ /dev/null @@ -1,148 +0,0 @@ -getCodebase(); - $codebase_methods = $codebase->methods; - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - return false; - } - - $stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr); - - if ($stmt_expr_type) { - $clone_type = $stmt_expr_type; - - $immutable_cloned = false; - - $invalid_clones = []; - $mixed_clone = false; - - $possibly_valid = false; - $atomic_types = $clone_type->getAtomicTypes(); - - while ($atomic_types) { - $clone_type_part = array_pop($atomic_types); - - if ($clone_type_part instanceof TMixed) { - $mixed_clone = true; - } elseif ($clone_type_part instanceof TObject) { - $possibly_valid = true; - } elseif ($clone_type_part instanceof TNamedObject) { - if (!$codebase->classlikes->classOrInterfaceExists($clone_type_part->value)) { - $invalid_clones[] = $clone_type_part->getId(); - } else { - $clone_method_id = new MethodIdentifier( - $clone_type_part->value, - '__clone' - ); - - $does_method_exist = $codebase_methods->methodExists( - $clone_method_id, - $context->calling_method_id, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ); - $is_method_visible = MethodAnalyzer::isMethodVisible( - $clone_method_id, - $context, - $statements_analyzer->getSource() - ); - if ($does_method_exist && !$is_method_visible) { - $invalid_clones[] = $clone_type_part->getId(); - } else { - $possibly_valid = true; - $immutable_cloned = true; - } - } - } elseif ($clone_type_part instanceof TTemplateParam) { - $atomic_types = array_merge($atomic_types, $clone_type_part->as->getAtomicTypes()); - } else { - if ($clone_type_part instanceof TFalse - && $clone_type->ignore_falsable_issues - ) { - continue; - } - - if ($clone_type_part instanceof TNull - && $clone_type->ignore_nullable_issues - ) { - continue; - } - - $invalid_clones[] = $clone_type_part->getId(); - } - } - - if ($mixed_clone) { - IssueBuffer::maybeAdd( - new MixedClone( - 'Cannot clone mixed', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($invalid_clones) { - if ($possibly_valid) { - IssueBuffer::maybeAdd( - new PossiblyInvalidClone( - 'Cannot clone ' . $invalid_clones[0], - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidClone( - 'Cannot clone ' . $invalid_clones[0], - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - return true; - } - - $statements_analyzer->node_data->setType($stmt, $stmt_expr_type); - - if ($immutable_cloned) { - $stmt_expr_type = clone $stmt_expr_type; - $statements_analyzer->node_data->setType($stmt, $stmt_expr_type); - $stmt_expr_type->reference_free = true; - $stmt_expr_type->allow_mutations = true; - } - } - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php deleted file mode 100644 index e874371f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php +++ /dev/null @@ -1,52 +0,0 @@ -expr, $context); - - $codebase = $statements_analyzer->getCodebase(); - - if (isset($codebase->config->forbidden_functions['empty'])) { - IssueBuffer::maybeAdd( - new ForbiddenCode( - 'You have forbidden the use of empty', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) - && $stmt_expr_type->hasBool() - && $stmt_expr_type->isSingle() - && !$stmt_expr_type->from_docblock - ) { - IssueBuffer::maybeAdd( - new InvalidArgument( - 'Calling empty on a boolean value is almost certainly unintended', - new CodeLocation($statements_analyzer->getSource(), $stmt->expr), - 'empty' - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $statements_analyzer->node_data->setType($stmt, Type::getBool()); - } -} 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 deleted file mode 100644 index d90b9dc3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php +++ /dev/null @@ -1,142 +0,0 @@ -parts as $part) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $part, $context) === false) { - return false; - } - - $part_type = $statements_analyzer->node_data->getType($part); - - if ($part_type !== null) { - $casted_part_type = CastAnalyzer::castStringAttempt( - $statements_analyzer, - $context, - $part_type, - $part - ); - - if (!$casted_part_type->allLiterals()) { - $all_literals = false; - } elseif (!$non_empty) { - // Check if all literals are nonempty - $non_empty = true; - foreach ($casted_part_type->getAtomicTypes() as $atomic_literal) { - if (!$atomic_literal instanceof TLiteralInt - && !$atomic_literal instanceof TNonspecificLiteralInt - && !$atomic_literal instanceof TLiteralFloat - && !$atomic_literal instanceof TNonEmptyNonspecificLiteralString - && !($atomic_literal instanceof TLiteralString && $atomic_literal->value !== "") - ) { - $non_empty = false; - break; - } - } - } - - if ($literal_string !== null) { - if ($casted_part_type->isSingleLiteral()) { - $literal_string .= $casted_part_type->getSingleLiteral()->value; - } else { - $literal_string = null; - } - } - - if ($statements_analyzer->data_flow_graph - && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - $var_location = new CodeLocation($statements_analyzer, $part); - - $new_parent_node = DataFlowNode::getForAssignment('concat', $var_location); - $statements_analyzer->data_flow_graph->addNode($new_parent_node); - - $stmt_type->parent_nodes[$new_parent_node->id] = $new_parent_node; - - $codebase = $statements_analyzer->getCodebase(); - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - if ($casted_part_type->parent_nodes) { - foreach ($casted_part_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $new_parent_node, - 'concat', - $added_taints, - $removed_taints - ); - } - } - } - } elseif ($part instanceof EncapsedStringPart) { - if ($literal_string !== null) { - $literal_string .= $part->value; - } - $non_empty = $non_empty || $part->value !== ""; - } else { - $all_literals = false; - $literal_string = null; - } - } - - if ($non_empty) { - if ($literal_string !== null) { - $new_type = Type::getString($literal_string); - } elseif ($all_literals) { - $new_type = new Union([new TNonEmptyNonspecificLiteralString()]); - } else { - $new_type = new Union([new TNonEmptyString()]); - } - } elseif ($all_literals) { - $new_type = new Union([new TNonspecificLiteralString()]); - } - if (isset($new_type)) { - assert($new_type instanceof Union); - $new_type->parent_nodes = $stmt_type->parent_nodes; - $stmt_type = $new_type; - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php deleted file mode 100644 index c8df04d5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php +++ /dev/null @@ -1,85 +0,0 @@ -expr, $context); - - $codebase = $statements_analyzer->getCodebase(); - - $expr_type = $statements_analyzer->node_data->getType($stmt->expr); - - if ($expr_type) { - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && $expr_type->parent_nodes - && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - $arg_location = new CodeLocation($statements_analyzer->getSource(), $stmt->expr); - - $eval_param_sink = TaintSink::getForMethodArgument( - 'eval', - 'eval', - 0, - $arg_location, - $arg_location - ); - - $eval_param_sink->taints = [TaintKind::INPUT_EVAL]; - - $statements_analyzer->data_flow_graph->addSink($eval_param_sink); - - $codebase = $statements_analyzer->getCodebase(); - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - foreach ($expr_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $eval_param_sink, - 'arg', - $added_taints, - $removed_taints - ); - } - } - } - - if (isset($codebase->config->forbidden_functions['eval'])) { - IssueBuffer::maybeAdd( - new ForbiddenCode( - 'You have forbidden the use of eval', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $context->check_classes = false; - $context->check_variables = false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php deleted file mode 100644 index 308a5e77..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php +++ /dev/null @@ -1,145 +0,0 @@ -getProjectAnalyzer()->getConfig(); - - $forbidden = null; - - if (isset($config->forbidden_functions['exit']) - && $stmt->getAttribute('kind') === Exit_::KIND_EXIT - ) { - $forbidden = 'exit'; - } elseif (isset($config->forbidden_functions['die']) - && $stmt->getAttribute('kind') === Exit_::KIND_DIE - ) { - $forbidden = 'die'; - } - - if ($forbidden) { - IssueBuffer::maybeAdd( - new ForbiddenCode( - 'You have forbidden the use of ' . $forbidden, - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($stmt->expr) { - $context->inside_call = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - return false; - } - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { - $call_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - $echo_param_sink = TaintSink::getForMethodArgument( - 'exit', - 'exit', - 0, - null, - $call_location - ); - - $echo_param_sink->taints = [ - TaintKind::INPUT_HTML, - TaintKind::INPUT_HAS_QUOTES, - TaintKind::USER_SECRET, - TaintKind::SYSTEM_SECRET - ]; - - $statements_analyzer->data_flow_graph->addSink($echo_param_sink); - } - - if ($expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { - $exit_param = new FunctionLikeParameter( - 'var', - false - ); - - if (ArgumentAnalyzer::verifyType( - $statements_analyzer, - $expr_type, - new Union([new TInt(), new TString()]), - null, - 'exit', - null, - 0, - new CodeLocation($statements_analyzer->getSource(), $stmt->expr), - $stmt->expr, - $context, - $exit_param, - false, - null, - true, - true, - new CodeLocation($statements_analyzer, $stmt) - ) === false) { - return false; - } - } - - $context->inside_call = false; - } - - if ($expr_type - && !$expr_type->isInt() - && !$context->collect_mutations - && !$context->collect_initializations - ) { - if ($context->mutation_free || $context->external_mutation_free) { - $function_name = $stmt->getAttribute('kind') === Exit_::KIND_DIE ? 'die' : 'exit'; - - IssueBuffer::maybeAdd( - new ImpureFunctionCall( - 'Cannot call ' . $function_name . ' with a non-integer argument from a mutation-free context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - } - - $statements_analyzer->node_data->setType($stmt, Type::getEmpty()); - - $context->has_returned = true; - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php deleted file mode 100644 index ed779f5a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php +++ /dev/null @@ -1,224 +0,0 @@ -name)) { - return '$' . $stmt->name; - } - - if ($stmt instanceof PhpParser\Node\Expr\StaticPropertyFetch - && $stmt->name instanceof PhpParser\Node\Identifier - && $stmt->class instanceof PhpParser\Node\Name - ) { - if (count($stmt->class->parts) === 1 - && in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true) - ) { - if (!$this_class_name) { - $fq_class_name = $stmt->class->parts[0]; - } else { - $fq_class_name = $this_class_name; - } - } else { - $fq_class_name = $source - ? ClassLikeAnalyzer::getFQCLNFromNameObject( - $stmt->class, - $source->getAliases() - ) - : implode('\\', $stmt->class->parts); - } - - return $fq_class_name . '::$' . $stmt->name->name; - } - - if ($stmt instanceof PhpParser\Node\Expr\PropertyFetch && $stmt->name instanceof PhpParser\Node\Identifier) { - $object_id = self::getVarId($stmt->var, $this_class_name, $source); - - if (!$object_id) { - return null; - } - - return $object_id . '->' . $stmt->name->name; - } - - if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch && $nesting !== null) { - ++$nesting; - - return self::getVarId($stmt->var, $this_class_name, $source, $nesting); - } - - return null; - } - - public static function getRootVarId( - PhpParser\Node\Expr $stmt, - ?string $this_class_name, - ?FileSource $source = null - ): ?string { - if ($stmt instanceof PhpParser\Node\Expr\Variable - || $stmt instanceof PhpParser\Node\Expr\StaticPropertyFetch - ) { - return self::getVarId($stmt, $this_class_name, $source); - } - - if ($stmt instanceof PhpParser\Node\Expr\PropertyFetch && $stmt->name instanceof PhpParser\Node\Identifier) { - $property_root = self::getRootVarId($stmt->var, $this_class_name, $source); - - if ($property_root) { - return $property_root . '->' . $stmt->name->name; - } - } - - if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) { - return self::getRootVarId($stmt->var, $this_class_name, $source); - } - - return null; - } - - public static function getArrayVarId( - PhpParser\Node\Expr $stmt, - ?string $this_class_name, - ?FileSource $source = null - ): ?string { - if ($stmt instanceof PhpParser\Node\Expr\Assign) { - return self::getArrayVarId($stmt->var, $this_class_name, $source); - } - - if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) { - $root_var_id = self::getArrayVarId($stmt->var, $this_class_name, $source); - - $offset = null; - - if ($root_var_id) { - if ($stmt->dim instanceof PhpParser\Node\Scalar\String_ - || $stmt->dim instanceof PhpParser\Node\Scalar\LNumber - ) { - $offset = $stmt->dim instanceof PhpParser\Node\Scalar\String_ - ? '\'' . $stmt->dim->value . '\'' - : $stmt->dim->value; - } elseif ($stmt->dim instanceof PhpParser\Node\Expr\Variable - && is_string($stmt->dim->name) - ) { - $offset = '$' . $stmt->dim->name; - } elseif ($stmt->dim instanceof PhpParser\Node\Expr\ConstFetch) { - $offset = implode('\\', $stmt->dim->name->parts); - } elseif ($stmt->dim instanceof PhpParser\Node\Expr\PropertyFetch) { - $object_id = self::getArrayVarId($stmt->dim->var, $this_class_name, $source); - - if ($object_id && $stmt->dim->name instanceof PhpParser\Node\Identifier) { - $offset = $object_id . '->' . $stmt->dim->name; - } - } elseif ($stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch - && $stmt->dim->name instanceof PhpParser\Node\Identifier - && $stmt->dim->class instanceof PhpParser\Node\Name - && $stmt->dim->class->parts[0] === 'static' - ) { - $offset = 'static::' . $stmt->dim->name; - } elseif ($stmt->dim - && $source instanceof StatementsAnalyzer - && ($stmt_dim_type = $source->node_data->getType($stmt->dim)) - && (!$stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch - || !$stmt->dim->name instanceof PhpParser\Node\Identifier - || $stmt->dim->name->name !== 'class' - ) - ) { - if ($stmt_dim_type->isSingleStringLiteral()) { - $offset = '\'' . $stmt_dim_type->getSingleStringLiteral()->value . '\''; - } elseif ($stmt_dim_type->isSingleIntLiteral()) { - $offset = $stmt_dim_type->getSingleIntLiteral()->value; - } - } elseif ($stmt->dim instanceof PhpParser\Node\Expr\ClassConstFetch - && $stmt->dim->name instanceof PhpParser\Node\Identifier - ) { - /** @var string|null */ - $resolved_name = $stmt->dim->class->getAttribute('resolvedName'); - - if ($resolved_name) { - $offset = $resolved_name . '::' . $stmt->dim->name; - } - } - - return $offset !== null ? $root_var_id . '[' . $offset . ']' : null; - } - } - - if ($stmt instanceof PhpParser\Node\Expr\PropertyFetch) { - $object_id = self::getArrayVarId($stmt->var, $this_class_name, $source); - - if (!$object_id) { - return null; - } - - if ($stmt->name instanceof PhpParser\Node\Identifier) { - return $object_id . '->' . $stmt->name; - } - - if ($source instanceof StatementsAnalyzer - && ($stmt_name_type = $source->node_data->getType($stmt->name)) - && $stmt_name_type->isSingleStringLiteral()) { - return $object_id . '->' . $stmt_name_type->getSingleStringLiteral()->value; - } - - return null; - } - - if ($stmt instanceof PhpParser\Node\Expr\ClassConstFetch - && $stmt->name instanceof PhpParser\Node\Identifier - ) { - /** @var string|null */ - $resolved_name = $stmt->class->getAttribute('resolvedName'); - - if ($resolved_name) { - if (($resolved_name === 'self' || $resolved_name === 'static') && $this_class_name) { - $resolved_name = $this_class_name; - } - - return $resolved_name . '::' . $stmt->name; - } - } - - if ($stmt instanceof PhpParser\Node\Expr\MethodCall - && $stmt->name instanceof PhpParser\Node\Identifier - && !$stmt->isFirstClassCallable() - && !$stmt->getArgs() - ) { - $config = Config::getInstance(); - - if ($config->memoize_method_calls || $stmt->getAttribute('memoizable', false)) { - $lhs_var_name = self::getArrayVarId( - $stmt->var, - $this_class_name, - $source - ); - - if (!$lhs_var_name) { - return null; - } - - return $lhs_var_name . '->' . strtolower($stmt->name->name) . '()'; - } - } - - return self::getVarId($stmt, $this_class_name, $source); - } -} 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 deleted file mode 100644 index 6dd44638..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php +++ /dev/null @@ -1,2060 +0,0 @@ -var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($stmt->dim) { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - - $was_inside_unset = $context->inside_unset; - $context->inside_unset = false; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->dim, $context) === false) { - $context->inside_unset = $was_inside_unset; - $context->inside_general_use = $was_inside_general_use; - - return false; - } - - $context->inside_unset = $was_inside_unset; - - $context->inside_general_use = $was_inside_general_use; - } - - $keyed_array_var_id = ExpressionIdentifier::getArrayVarId( - $stmt, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $dim_var_id = null; - $new_offset_type = null; - - if ($stmt->dim) { - $used_key_type = $statements_analyzer->node_data->getType($stmt->dim) ?? Type::getMixed(); - - $dim_var_id = ExpressionIdentifier::getArrayVarId( - $stmt->dim, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - } else { - $used_key_type = Type::getInt(); - } - - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $stmt->var, - $context - ) === false) { - return false; - } - - $stmt_var_type = $statements_analyzer->node_data->getType($stmt->var); - - $codebase = $statements_analyzer->getCodebase(); - - if ($keyed_array_var_id - && $context->hasVariable($keyed_array_var_id) - && !$context->vars_in_scope[$keyed_array_var_id]->possibly_undefined - && $stmt_var_type - && !$stmt_var_type->hasClassStringMap() - ) { - $stmt_type = clone $context->vars_in_scope[$keyed_array_var_id]; - - $statements_analyzer->node_data->setType( - $stmt, - $stmt_type - ); - - self::taintArrayFetch( - $statements_analyzer, - $stmt->var, - $keyed_array_var_id, - $stmt_type, - $used_key_type, - $context - ); - - return true; - } - - $can_store_result = false; - - if ($stmt_var_type) { - if ($stmt_var_type->isNull()) { - if (!$context->inside_isset) { - IssueBuffer::maybeAdd( - new NullArrayAccess( - 'Cannot access array value on null variable ' . $array_var_id, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $stmt_type = $statements_analyzer->node_data->getType($stmt); - $statements_analyzer->node_data->setType( - $stmt, - Type::combineUnionTypes($stmt_type, Type::getNull()) - ); - - return true; - } - - $stmt_type = self::getArrayAccessTypeGivenOffset( - $statements_analyzer, - $stmt, - $stmt_var_type, - $used_key_type, - false, - $array_var_id, - $context, - null - ); - - if ($stmt->dim && $stmt_var_type->hasArray()) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TKeyedArray|TList|TClassStringMap - */ - $array_type = $stmt_var_type->getAtomicTypes()['array']; - - if ($array_type instanceof TClassStringMap) { - $array_value_type = Type::getMixed(); - } elseif ($array_type instanceof TArray) { - $array_value_type = $array_type->type_params[1]; - } elseif ($array_type instanceof TList) { - $array_value_type = $array_type->type_param; - } else { - $array_value_type = $array_type->getGenericValueType(); - } - - if ($context->inside_assignment || !$array_value_type->isMixed()) { - $can_store_result = true; - } - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - if ($context->inside_isset - && $stmt->dim - && ($stmt_dim_type = $statements_analyzer->node_data->getType($stmt->dim)) - && $stmt_var_type->hasArray() - && ($stmt->var instanceof PhpParser\Node\Expr\ClassConstFetch - || $stmt->var instanceof PhpParser\Node\Expr\ConstFetch) - ) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TKeyedArray|TList - */ - $array_type = $stmt_var_type->getAtomicTypes()['array']; - - if ($array_type instanceof TArray) { - $const_array_key_type = $array_type->type_params[0]; - } elseif ($array_type instanceof TList) { - $const_array_key_type = Type::getInt(); - } else { - $const_array_key_type = $array_type->getGenericKeyType(); - } - - if ($dim_var_id - && !$const_array_key_type->hasMixed() - && !$stmt_dim_type->hasMixed() - ) { - $new_offset_type = clone $stmt_dim_type; - $const_array_key_atomic_types = $const_array_key_type->getAtomicTypes(); - - foreach ($new_offset_type->getAtomicTypes() as $offset_key => $offset_atomic_type) { - if ($offset_atomic_type instanceof TString - || $offset_atomic_type instanceof TInt - ) { - if (!isset($const_array_key_atomic_types[$offset_key]) - && !UnionTypeComparator::isContainedBy( - $codebase, - new Union([$offset_atomic_type]), - $const_array_key_type - ) - ) { - $new_offset_type->removeType($offset_key); - } - } elseif (!UnionTypeComparator::isContainedBy( - $codebase, - $const_array_key_type, - new Union([$offset_atomic_type]) - )) { - $new_offset_type->removeType($offset_key); - } - } - } - } - } - - if ($keyed_array_var_id - && $context->hasVariable($keyed_array_var_id) - && (!($stmt_type = $statements_analyzer->node_data->getType($stmt)) || $stmt_type->isVanillaMixed()) - ) { - $statements_analyzer->node_data->setType($stmt, $context->vars_in_scope[$keyed_array_var_id]); - } - - if (!($stmt_type = $statements_analyzer->node_data->getType($stmt))) { - $stmt_type = Type::getMixed(); - $statements_analyzer->node_data->setType($stmt, $stmt_type); - } else { - if ($stmt_type->possibly_undefined - && !$context->inside_isset - && !$context->inside_unset - && ($stmt_var_type && !$stmt_var_type->hasMixed()) - ) { - IssueBuffer::maybeAdd( - new PossiblyUndefinedArrayOffset( - 'Possibly undefined array key ' . $keyed_array_var_id - . ' on ' . $stmt_var_type->getId(), - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $stmt_type->possibly_undefined = false; - } - - if ($context->inside_isset && $dim_var_id && $new_offset_type && !$new_offset_type->isUnionEmpty()) { - $context->vars_in_scope[$dim_var_id] = $new_offset_type; - } - - if ($keyed_array_var_id && !$context->inside_isset && $can_store_result) { - $context->vars_in_scope[$keyed_array_var_id] = $stmt_type; - $context->vars_possibly_in_scope[$keyed_array_var_id] = true; - - // reference the variable too - $context->hasVariable($keyed_array_var_id); - } - - self::taintArrayFetch( - $statements_analyzer, - $stmt->var, - $keyed_array_var_id, - $stmt_type, - $used_key_type, - $context - ); - - return true; - } - - /** - * Used to create a path between a variable $foo and $foo["a"] - */ - public static function taintArrayFetch( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $var, - ?string $keyed_array_var_id, - Union $stmt_type, - Union $offset_type, - ?Context $context = null - ): void { - if ($statements_analyzer->data_flow_graph - && ($stmt_var_type = $statements_analyzer->node_data->getType($var)) - && $stmt_var_type->parent_nodes - ) { - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - $stmt_var_type->parent_nodes = []; - return; - } - - $added_taints = []; - $removed_taints = []; - - if ($context) { - $codebase = $statements_analyzer->getCodebase(); - $event = new AddRemoveTaintsEvent($var, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - } - - $var_location = new CodeLocation($statements_analyzer->getSource(), $var); - - $new_parent_node = DataFlowNode::getForAssignment( - $keyed_array_var_id ?: 'arrayvalue-fetch', - $var_location - ); - - $array_key_node = null; - - $statements_analyzer->data_flow_graph->addNode($new_parent_node); - - $dim_value = $offset_type->isSingleStringLiteral() - ? $offset_type->getSingleStringLiteral()->value - : ($offset_type->isSingleIntLiteral() - ? $offset_type->getSingleIntLiteral()->value - : null); - - if ($keyed_array_var_id === null && $dim_value === null) { - $array_key_node = DataFlowNode::getForAssignment( - 'arraykey-fetch', - $var_location - ); - - $statements_analyzer->data_flow_graph->addNode($array_key_node); - } - - foreach ($stmt_var_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $new_parent_node, - 'arrayvalue-fetch' . ($dim_value !== null ? '-\'' . $dim_value . '\'' : ''), - $added_taints, - $removed_taints - ); - - if ($stmt_type->by_ref) { - $statements_analyzer->data_flow_graph->addPath( - $new_parent_node, - $parent_node, - 'arrayvalue-assignment' . ($dim_value !== null ? '-\'' . $dim_value . '\'' : ''), - $added_taints, - $removed_taints - ); - } - - if ($array_key_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $array_key_node, - 'arraykey-fetch', - $added_taints, - $removed_taints - ); - } - } - - $stmt_type->parent_nodes = [$new_parent_node->id => $new_parent_node]; - - if ($array_key_node) { - $offset_type->parent_nodes = [$array_key_node->id => $array_key_node]; - } - } - } - - /** - * @psalm-suppress ComplexMethod to be refactored. - * Good type/bad type behaviour could be mutualised with ArrayAnalyzer - */ - public static function getArrayAccessTypeGivenOffset( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - Union $array_type, - Union $offset_type, - bool $in_assignment, - ?string $array_var_id, - Context $context, - PhpParser\Node\Expr $assign_value = null, - Union $replacement_type = null - ): Union { - $codebase = $statements_analyzer->getCodebase(); - - $has_array_access = false; - $non_array_types = []; - - $has_valid_expected_offset = false; - $expected_offset_types = []; - - $key_values = []; - - if ($stmt->dim instanceof PhpParser\Node\Scalar\String_ - || $stmt->dim instanceof PhpParser\Node\Scalar\LNumber - ) { - $key_values[] = $stmt->dim->value; - } elseif ($stmt->dim && ($stmt_dim_type = $statements_analyzer->node_data->getType($stmt->dim))) { - $string_literals = $stmt_dim_type->getLiteralStrings(); - $int_literals = $stmt_dim_type->getLiteralInts(); - - $all_atomic_types = $stmt_dim_type->getAtomicTypes(); - - if (count($string_literals) + count($int_literals) === count($all_atomic_types)) { - foreach ($string_literals as $string_literal) { - $key_values[] = $string_literal->value; - } - - foreach ($int_literals as $int_literal) { - $key_values[] = $int_literal->value; - } - } - } - - $array_access_type = null; - - if ($offset_type->isNull()) { - IssueBuffer::maybeAdd( - new NullArrayOffset( - 'Cannot access value on variable ' . $array_var_id . ' using null offset', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - if ($in_assignment) { - $offset_type->removeType('null'); - $offset_type->addType(new TLiteralString('')); - } - } - - if ($offset_type->isNullable() && !$context->inside_isset) { - if (!$offset_type->ignore_nullable_issues) { - IssueBuffer::maybeAdd( - new PossiblyNullArrayOffset( - 'Cannot access value on variable ' . $array_var_id - . ' using possibly null offset ' . $offset_type, - new CodeLocation($statements_analyzer->getSource(), $stmt->var) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($in_assignment) { - $offset_type->removeType('null'); - - if (!$offset_type->ignore_nullable_issues) { - $offset_type->addType(new TLiteralString('')); - } - } - } - - if ($array_type->isArray()) { - $has_valid_absolute_offset = self::checkArrayOffsetType( - $offset_type, - $offset_type->getAtomicTypes(), - $codebase - ); - - if ($has_valid_absolute_offset === false) { - //we didn't find a single type that could be valid - $expected_offset_types[] = 'array-key'; - } - } else { - //on not-arrays, the type is considered valid - $has_valid_absolute_offset = true; - } - - foreach ($array_type->getAtomicTypes() as $type_string => $type) { - $original_type = $type; - - if ($type instanceof TMixed || $type instanceof TTemplateParam || $type instanceof TEmpty) { - if (!$type instanceof TTemplateParam || $type->as->isMixed() || !$type->as->isSingle()) { - $array_access_type = self::handleMixedArrayAccess( - $context, - $statements_analyzer, - $codebase, - $in_assignment, - $array_var_id, - $stmt, - $array_access_type, - $type - ); - - $has_valid_expected_offset = true; - - continue; - } - - $type = clone $type->as->getSingleAtomic(); - } - - if ($type instanceof TNull) { - if ($array_type->ignore_nullable_issues) { - continue; - } - - if ($in_assignment) { - if ($replacement_type) { - $array_access_type = Type::combineUnionTypes($array_access_type, clone $replacement_type); - } else { - IssueBuffer::maybeAdd( - new PossiblyNullArrayAssignment( - 'Cannot access array value on possibly null variable ' . $array_var_id . - ' of type ' . $array_type, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - $array_access_type = new Union([new TEmpty]); - } - } else { - if (!$context->inside_isset && !MethodCallAnalyzer::hasNullsafe($stmt->var)) { - IssueBuffer::maybeAdd( - new PossiblyNullArrayAccess( - 'Cannot access array value on possibly null variable ' . $array_var_id . - ' of type ' . $array_type, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $array_access_type = Type::combineUnionTypes($array_access_type, Type::getNull()); - } - - continue; - } - - if ($type instanceof TArray - || $type instanceof TKeyedArray - || $type instanceof TList - || $type instanceof TClassStringMap - ) { - self::handleArrayAccessOnArray( - $in_assignment, - $type, - $key_values, - $array_type, - $type_string, - $stmt, - $replacement_type, - $offset_type, - $original_type, - $codebase, - $array_var_id, - $context, - $statements_analyzer, - $expected_offset_types, - $array_access_type, - $has_array_access, - $has_valid_expected_offset - ); - - continue; - } - - if ($type instanceof TString) { - self::handleArrayAccessOnString( - $statements_analyzer, - $codebase, - $stmt, - $in_assignment, - $context, - $replacement_type, - $type, - $offset_type, - $expected_offset_types, - $array_access_type, - $has_valid_expected_offset - ); - - continue; - } - - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); - } - - if ($type instanceof TFalse && $array_type->ignore_falsable_issues) { - continue; - } - - if ($type instanceof TNamedObject) { - self::handleArrayAccessOnNamedObject( - $statements_analyzer, - $stmt, - $type, - $context, - $in_assignment, - $assign_value, - $array_access_type, - $has_array_access - ); - } elseif (!$array_type->hasMixed()) { - $non_array_types[] = (string)$type; - } - } - - if ($non_array_types) { - if ($has_array_access) { - if ($in_assignment) { - if (IssueBuffer::accepts( - new PossiblyInvalidArrayAssignment( - 'Cannot access array value on non-array variable ' . - $array_var_id . ' of type ' . $non_array_types[0], - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ) - ) { - // do nothing - } - } elseif (!$context->inside_isset) { - if (IssueBuffer::accepts( - new PossiblyInvalidArrayAccess( - 'Cannot access array value on non-array variable ' . - $array_var_id . ' of type ' . $non_array_types[0], - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ) - ) { - // do nothing - } - } - } else { - if ($in_assignment) { - IssueBuffer::maybeAdd( - new InvalidArrayAssignment( - 'Cannot access array value on non-array variable ' . - $array_var_id . ' of type ' . $non_array_types[0], - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidArrayAccess( - 'Cannot access array value on non-array variable ' . - $array_var_id . ' of type ' . $non_array_types[0], - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $array_access_type = Type::getMixed(); - } - } - - if ($offset_type->hasMixed()) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - IssueBuffer::maybeAdd( - new MixedArrayOffset( - 'Cannot access value on variable ' . $array_var_id . ' using mixed offset', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); - } - - if ($expected_offset_types) { - $invalid_offset_type = $expected_offset_types[0]; - - $used_offset = 'using a ' . $offset_type->getId() . ' offset'; - - if ($key_values) { - $used_offset = "using offset value of '" . implode('|', $key_values) . "'"; - } - - if ($has_valid_expected_offset && $has_valid_absolute_offset && $context->inside_isset) { - // do nothing - } elseif ($has_valid_expected_offset && $has_valid_absolute_offset) { - if (!$context->inside_unset) { - IssueBuffer::maybeAdd( - new PossiblyInvalidArrayOffset( - 'Cannot access value on variable ' . $array_var_id . ' ' . $used_offset - . ', expecting ' . $invalid_offset_type, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } else { - $good_types = []; - $bad_types = []; - foreach ($offset_type->getAtomicTypes() as $atomic_key_type) { - if (!$atomic_key_type instanceof TString - && !$atomic_key_type instanceof TInt - && !$atomic_key_type instanceof TArrayKey - && !$atomic_key_type instanceof TMixed - && !$atomic_key_type instanceof TTemplateParam - && !( - $atomic_key_type instanceof TObjectWithProperties - && isset($atomic_key_type->methods['__toString']) - ) - ) { - $bad_types[] = $atomic_key_type; - - if ($atomic_key_type instanceof TFalse) { - $good_types[] = new TLiteralInt(0); - } elseif ($atomic_key_type instanceof TTrue) { - $good_types[] = new TLiteralInt(1); - } elseif ($atomic_key_type instanceof TBool) { - $good_types[] = new TLiteralInt(0); - $good_types[] = new TLiteralInt(1); - } elseif ($atomic_key_type instanceof TLiteralFloat) { - $good_types[] = new TLiteralInt((int)$atomic_key_type->value); - } elseif ($atomic_key_type instanceof TFloat) { - $good_types[] = new TInt; - } else { - $good_types[] = new TArrayKey; - } - } - } - - if ($bad_types && $good_types) { - $offset_type->substitute( - TypeCombiner::combine($bad_types, $codebase), - TypeCombiner::combine($good_types, $codebase) - ); - } - - IssueBuffer::maybeAdd( - new InvalidArrayOffset( - 'Cannot access value on variable ' . $array_var_id . ' ' . $used_offset - . ', expecting ' . $invalid_offset_type, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - if ($array_access_type === null) { - // shouldn’t happen, but don’t crash - return Type::getMixed(); - } - - if ($array_type->by_ref) { - $array_access_type->by_ref = true; - } - - if ($in_assignment) { - $array_type->bustCache(); - } - - return $array_access_type; - } - - private static function checkLiteralIntArrayOffset( - Union $offset_type, - Union $expected_offset_type, - ?string $array_var_id, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - Context $context, - StatementsAnalyzer $statements_analyzer - ): void { - if ($context->inside_isset || $context->inside_unset) { - return; - } - - if ($offset_type->hasLiteralInt()) { - $found_match = false; - - foreach ($offset_type->getAtomicTypes() as $offset_type_part) { - if ($array_var_id - && $offset_type_part instanceof TLiteralInt - && isset( - $context->vars_in_scope[ - $array_var_id . '[' . $offset_type_part->value . ']' - ] - ) - && !$context->vars_in_scope[ - $array_var_id . '[' . $offset_type_part->value . ']' - ]->possibly_undefined - ) { - $found_match = true; - break; - } - - if ($offset_type_part instanceof TPositiveInt) { - $found_match = true; - break; - } - } - - if (!$found_match) { - IssueBuffer::maybeAdd( - new PossiblyUndefinedIntArrayOffset( - 'Possibly undefined array offset \'' - . $offset_type->getId() . '\' ' - . 'is risky given expected type \'' - . $expected_offset_type->getId() . '\'.' - . ' Consider using isset beforehand.', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - private static function checkLiteralStringArrayOffset( - Union $offset_type, - Union $expected_offset_type, - ?string $array_var_id, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - Context $context, - StatementsAnalyzer $statements_analyzer - ): void { - if ($context->inside_isset || $context->inside_unset) { - return; - } - - if ($offset_type->hasLiteralString() && !$expected_offset_type->hasLiteralClassString()) { - $found_match = false; - - foreach ($offset_type->getAtomicTypes() as $offset_type_part) { - if ($array_var_id - && $offset_type_part instanceof TLiteralString - && isset( - $context->vars_in_scope[ - $array_var_id . '[\'' . $offset_type_part->value . '\']' - ] - ) - && !$context->vars_in_scope[ - $array_var_id . '[\'' . $offset_type_part->value . '\']' - ]->possibly_undefined - ) { - $found_match = true; - break; - } - } - - if (!$found_match) { - IssueBuffer::maybeAdd( - new PossiblyUndefinedStringArrayOffset( - 'Possibly undefined array offset \'' - . $offset_type->getId() . '\' ' - . 'is risky given expected type \'' - . $expected_offset_type->getId() . '\'.' - . ' Consider using isset beforehand.', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - public static function replaceOffsetTypeWithInts(Union $offset_type): Union - { - $offset_types = $offset_type->getAtomicTypes(); - - $cloned = false; - - foreach ($offset_types as $key => $offset_type_part) { - if ($offset_type_part instanceof TLiteralString) { - if (preg_match('/^(0|[1-9][0-9]*)$/', $offset_type_part->value)) { - if (!$cloned) { - $offset_type = clone $offset_type; - $cloned = true; - } - $offset_type->addType(new TLiteralInt((int) $offset_type_part->value)); - $offset_type->removeType($key); - } - } elseif ($offset_type_part instanceof TBool) { - if (!$cloned) { - $offset_type = clone $offset_type; - $cloned = true; - } - - if ($offset_type_part instanceof TFalse) { - if (!$offset_type->ignore_falsable_issues) { - $offset_type->addType(new TLiteralInt(0)); - $offset_type->removeType($key); - } - } elseif ($offset_type_part instanceof TTrue) { - $offset_type->addType(new TLiteralInt(1)); - $offset_type->removeType($key); - } else { - $offset_type->addType(new TLiteralInt(0)); - $offset_type->addType(new TLiteralInt(1)); - $offset_type->removeType($key); - } - } - } - - return $offset_type; - } - - /** - * @param TMixed|TTemplateParam|TEmpty $type - */ - public static function handleMixedArrayAccess( - Context $context, - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - bool $in_assignment, - ?string $array_var_id, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - ?Union $array_access_type, - Atomic $type - ): Union { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - if (!$context->inside_isset) { - if ($in_assignment) { - IssueBuffer::maybeAdd( - new MixedArrayAssignment( - 'Cannot access array value on mixed variable ' . $array_var_id, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new MixedArrayAccess( - 'Cannot access array value on mixed variable ' . $array_var_id, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if (($data_flow_graph = $statements_analyzer->data_flow_graph) - && $data_flow_graph instanceof VariableUseGraph - && ($stmt_var_type = $statements_analyzer->node_data->getType($stmt->var)) - ) { - if ($stmt_var_type->parent_nodes) { - $var_location = new CodeLocation($statements_analyzer->getSource(), $stmt->var); - - $new_parent_node = DataFlowNode::getForAssignment('mixed-var-array-access', $var_location); - - $data_flow_graph->addNode($new_parent_node); - - foreach ($stmt_var_type->parent_nodes as $parent_node) { - $data_flow_graph->addPath($parent_node, $new_parent_node, '='); - - $data_flow_graph->addPath( - $parent_node, - new DataFlowNode('variable-use', 'variable use', null), - 'variable-use' - ); - } - - $stmt_var_type->parent_nodes = [ - $new_parent_node->id => $new_parent_node - ]; - } - } - - return Type::combineUnionTypes( - $array_access_type, - Type::getMixed($type instanceof TEmpty) - ); - } - - /** - * @param list $expected_offset_types - * @param TArray|TKeyedArray|TList|TClassStringMap $type - * @param list $key_values - */ - private static function handleArrayAccessOnArray( - bool $in_assignment, - Atomic &$type, - array &$key_values, - Union $array_type, - string $type_string, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - ?Union $replacement_type, - Union &$offset_type, - Atomic $original_type, - Codebase $codebase, - ?string $array_var_id, - Context $context, - StatementsAnalyzer $statements_analyzer, - array &$expected_offset_types, - ?Union &$array_access_type, - bool &$has_array_access, - bool &$has_valid_offset - ): void { - $has_array_access = true; - - if ($in_assignment - && $type instanceof TArray - && $type->type_params[0]->isEmpty() - && $type->type_params[1]->isEmpty() - ) { - $from_empty_array = $type->type_params[0]->isEmpty() && $type->type_params[1]->isEmpty(); - - if (count($key_values) === 1) { - $from_mixed_array = $type->type_params[1]->isMixed(); - - [$previous_key_type, $previous_value_type] = $type->type_params; - - // ok, type becomes an TKeyedArray - $array_type->removeType($type_string); - $type = new TKeyedArray([ - $key_values[0] => $from_mixed_array ? Type::getMixed() : Type::getEmpty() - ]); - - $type->sealed = $from_empty_array; - - if (!$from_empty_array) { - $type->previous_value_type = clone $previous_value_type; - $type->previous_key_type = clone $previous_key_type; - } - - $array_type->addType($type); - } elseif (!$stmt->dim && $from_empty_array && $replacement_type) { - $array_type->removeType($type_string); - $array_type->addType(new TNonEmptyList($replacement_type)); - return; - } - } elseif ($in_assignment - && $type instanceof TKeyedArray - && $type->previous_value_type - && $type->previous_value_type->isMixed() - && count($key_values) === 1 - ) { - $type->properties[$key_values[0]] = Type::getMixed(); - } - - $offset_type = self::replaceOffsetTypeWithInts($offset_type); - - if ($type instanceof TList - && (($in_assignment && $stmt->dim) - || $original_type instanceof TTemplateParam - || !$offset_type->isInt()) - ) { - $type = new TArray([Type::getInt(), $type->type_param]); - } - - if ($type instanceof TArray) { - self::handleArrayAccessOnTArray( - $statements_analyzer, - $codebase, - $context, - $stmt, - $array_type, - $array_var_id, - $type, - $offset_type, - $in_assignment, - $expected_offset_types, - $replacement_type, - $array_access_type, - $original_type, - $has_valid_offset - ); - } elseif ($type instanceof TList) { - self::handleArrayAccessOnList( - $statements_analyzer, - $codebase, - $stmt, - $type, - $offset_type, - $array_var_id, - $key_values, - $context, - $in_assignment, - $expected_offset_types, - $replacement_type, - $array_access_type, - $has_valid_offset - ); - } elseif ($type instanceof TClassStringMap) { - self::handleArrayAccessOnClassStringMap( - $codebase, - $type, - $offset_type, - $replacement_type, - $array_access_type - ); - } else { - self::handleArrayAccessOnKeyedArray( - $statements_analyzer, - $codebase, - $key_values, - $replacement_type, - $array_access_type, - $in_assignment, - $stmt, - $offset_type, - $array_var_id, - $context, - $type, - $array_type, - $expected_offset_types, - $type_string, - $has_valid_offset - ); - } - - if ($context->inside_isset) { - $offset_type->ignore_isset = true; - } - } - - /** - * @param list $expected_offset_types - */ - private static function handleArrayAccessOnTArray( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - Context $context, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - Union $array_type, - ?string $array_var_id, - TArray $type, - Union $offset_type, - bool $in_assignment, - array &$expected_offset_types, - ?Union $replacement_type, - ?Union &$array_access_type, - Atomic $original_type, - bool &$has_valid_offset - ): void { - // if we're assigning to an empty array with a key offset, refashion that array - if ($in_assignment) { - if ($type->type_params[0]->isEmpty()) { - $type->type_params[0] = $offset_type->isMixed() - ? Type::getArrayKey() - : $offset_type; - } - } elseif (!$type->type_params[0]->isEmpty()) { - $expected_offset_type = $type->type_params[0]->hasMixed() - ? new Union([new TArrayKey]) - : $type->type_params[0]; - - $templated_offset_type = null; - - foreach ($offset_type->getAtomicTypes() as $offset_atomic_type) { - if ($offset_atomic_type instanceof TTemplateParam) { - $templated_offset_type = $offset_atomic_type; - } - } - - $union_comparison_results = new TypeComparisonResult(); - - if ($original_type instanceof TTemplateParam && $templated_offset_type) { - foreach ($templated_offset_type->as->getAtomicTypes() as $offset_as) { - if ($offset_as instanceof TTemplateKeyOf - && $offset_as->param_name === $original_type->param_name - && $offset_as->defining_class === $original_type->defining_class - ) { - $type->type_params[1] = new Union([ - new TTemplateIndexedAccess( - $offset_as->param_name, - $templated_offset_type->param_name, - $offset_as->defining_class - ) - ]); - - $has_valid_offset = true; - } - } - } else { - $offset_type_contained_by_expected = UnionTypeComparator::isContainedBy( - $codebase, - $offset_type, - $expected_offset_type, - true, - $offset_type->ignore_falsable_issues, - $union_comparison_results - ); - - if ($codebase->config->ensure_array_string_offsets_exist - && $offset_type_contained_by_expected - ) { - //we already know we found a match, so if the array is non-empty and the key is a literal, - //then no need to check for PossiblyUndefinedStringArrayOffset - if (!$type instanceof TNonEmptyArray || !$type->type_params[0]->isSingleStringLiteral()) { - self::checkLiteralStringArrayOffset( - $offset_type, - $expected_offset_type, - $array_var_id, - $stmt, - $context, - $statements_analyzer - ); - } - } - - if ($codebase->config->ensure_array_int_offsets_exist - && $offset_type_contained_by_expected - ) { - self::checkLiteralIntArrayOffset( - $offset_type, - $expected_offset_type, - $array_var_id, - $stmt, - $context, - $statements_analyzer - ); - } - - if ((!$offset_type_contained_by_expected - && !$union_comparison_results->type_coerced_from_scalar) - || $union_comparison_results->to_string_cast - ) { - if ($union_comparison_results->type_coerced_from_mixed - && !$offset_type->isMixed() - ) { - IssueBuffer::maybeAdd( - new MixedArrayTypeCoercion( - 'Coercion from array offset type \'' . $offset_type->getId() . '\' ' - . 'to the expected type \'' . $expected_offset_type->getId() . '\'', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - $expected_offset_types[] = $expected_offset_type->getId(); - } - - if (UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $offset_type, - $expected_offset_type - )) { - $has_valid_offset = true; - } - } else { - $has_valid_offset = true; - } - } - } - - if (!$stmt->dim && $type instanceof TNonEmptyArray && $type->count !== null) { - $type->count++; - } - - if ($in_assignment && $replacement_type) { - $type->type_params[1] = Type::combineUnionTypes( - $type->type_params[1], - $replacement_type, - $codebase - ); - } - - $array_access_type = Type::combineUnionTypes( - $array_access_type, - $type->type_params[1] - ); - - if ($array_access_type->isEmpty() - && !$array_type->hasMixed() - && !$in_assignment - && !$context->inside_isset - ) { - IssueBuffer::maybeAdd( - new EmptyArrayAccess( - 'Cannot access value on empty array variable ' . $array_var_id, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - if (!IssueBuffer::isRecording()) { - $array_access_type = Type::getMixed(true); - } - } - } - - private static function handleArrayAccessOnClassStringMap( - Codebase $codebase, - TClassStringMap $type, - Union $offset_type, - ?Union $replacement_type, - ?Union &$array_access_type - ): void { - $offset_type_parts = array_values($offset_type->getAtomicTypes()); - - foreach ($offset_type_parts as $offset_type_part) { - if ($offset_type_part instanceof TClassString) { - if ($offset_type_part instanceof TTemplateParamClass) { - $template_result_get = new TemplateResult( - [], - [ - $type->param_name => [ - 'class-string-map' => new Union([ - new TTemplateParam( - $offset_type_part->param_name, - $offset_type_part->as_type - ? new Union([$offset_type_part->as_type]) - : Type::getObject(), - $offset_type_part->defining_class - ) - ]) - ] - ] - ); - - $template_result_set = new TemplateResult( - [], - [ - $offset_type_part->param_name => [ - $offset_type_part->defining_class => new Union([ - new TTemplateParam( - $type->param_name, - $type->as_type - ? new Union([$type->as_type]) - : Type::getObject(), - 'class-string-map' - ) - ]) - ] - ] - ); - } else { - $template_result_get = new TemplateResult( - [], - [ - $type->param_name => [ - 'class-string-map' => new Union([ - $offset_type_part->as_type - ?: new TObject() - ]) - ] - ] - ); - $template_result_set = new TemplateResult( - [], - [] - ); - } - - $expected_value_param_get = clone $type->value_param; - - TemplateInferredTypeReplacer::replace( - $expected_value_param_get, - $template_result_get, - $codebase - ); - - if ($replacement_type) { - $expected_value_param_set = clone $type->value_param; - - TemplateInferredTypeReplacer::replace( - $replacement_type, - $template_result_set, - $codebase - ); - - $type->value_param = Type::combineUnionTypes( - $replacement_type, - $expected_value_param_set, - $codebase - ); - } - - $array_access_type = Type::combineUnionTypes( - $array_access_type, - $expected_value_param_get, - $codebase - ); - } - } - } - - /** - * @param list $expected_offset_types - * @param list $key_values - */ - private static function handleArrayAccessOnKeyedArray( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - array &$key_values, - ?Union $replacement_type, - ?Union &$array_access_type, - bool $in_assignment, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - Union $offset_type, - ?string $array_var_id, - Context $context, - TKeyedArray $type, - Union $array_type, - array &$expected_offset_types, - string $type_string, - bool &$has_valid_offset - ): void { - $generic_key_type = $type->getGenericKeyType(); - - if (!$stmt->dim && $type->sealed && $type->is_list) { - $key_values[] = count($type->properties); - } - - if ($key_values) { - foreach ($key_values as $key_value) { - if (isset($type->properties[$key_value]) || $replacement_type) { - $has_valid_offset = true; - - if ($replacement_type) { - $type->properties[$key_value] = Type::combineUnionTypes( - $type->properties[$key_value] ?? null, - $replacement_type - ); - } - - $array_access_type = Type::combineUnionTypes( - $array_access_type, - clone $type->properties[$key_value] - ); - } elseif ($in_assignment) { - $type->properties[$key_value] = new Union([new TEmpty]); - - $array_access_type = Type::combineUnionTypes( - $array_access_type, - clone $type->properties[$key_value] - ); - } elseif ($type->previous_value_type) { - if ($codebase->config->ensure_array_string_offsets_exist) { - self::checkLiteralStringArrayOffset( - $offset_type, - $type->getGenericKeyType(), - $array_var_id, - $stmt, - $context, - $statements_analyzer - ); - } - - if ($codebase->config->ensure_array_int_offsets_exist) { - self::checkLiteralIntArrayOffset( - $offset_type, - $type->getGenericKeyType(), - $array_var_id, - $stmt, - $context, - $statements_analyzer - ); - } - - $type->properties[$key_value] = clone $type->previous_value_type; - - $array_access_type = clone $type->previous_value_type; - } elseif ($array_type->hasMixed()) { - $has_valid_offset = true; - - $array_access_type = Type::getMixed(); - } else { - if ($type->sealed || !$context->inside_isset) { - $object_like_keys = array_keys($type->properties); - - $last_key = array_pop($object_like_keys); - - $key_string = ''; - - if ($object_like_keys) { - $formatted_keys = implode( - ', ', - array_map( - function ($key) { - return is_int($key) ? $key : '\'' . $key . '\''; - }, - $object_like_keys - ) - ); - - $key_string = $formatted_keys . ' or '; - } - - $key_string .= is_int($last_key) ? $last_key : '\'' . $last_key . '\''; - - $expected_offset_types[] = $key_string; - } - - $array_access_type = Type::getMixed(); - } - } - } else { - $key_type = $generic_key_type->hasMixed() - ? Type::getArrayKey() - : $generic_key_type; - - $union_comparison_results = new TypeComparisonResult(); - - $is_contained = UnionTypeComparator::isContainedBy( - $codebase, - $offset_type, - $key_type, - true, - $offset_type->ignore_falsable_issues, - $union_comparison_results - ); - - if ($context->inside_isset && !$is_contained) { - $is_contained = UnionTypeComparator::isContainedBy( - $codebase, - $key_type, - $offset_type, - true, - $offset_type->ignore_falsable_issues - ); - } - - if (($is_contained - || $union_comparison_results->type_coerced_from_scalar - || $union_comparison_results->type_coerced_from_mixed - || $in_assignment) - && !$union_comparison_results->to_string_cast - ) { - if ($replacement_type) { - $generic_params = Type::combineUnionTypes( - $type->getGenericValueType(), - $replacement_type - ); - - $new_key_type = Type::combineUnionTypes( - $generic_key_type, - $offset_type->isMixed() ? Type::getArrayKey() : $offset_type - ); - - $property_count = $type->sealed ? count($type->properties) : null; - - if (!$stmt->dim && $property_count) { - ++$property_count; - $array_type->removeType($type_string); - $type = new TNonEmptyArray([ - $new_key_type, - $generic_params, - ]); - $array_type->addType($type); - $type->count = $property_count; - } else { - $array_type->removeType($type_string); - - if (!$stmt->dim && $type->is_list) { - $type = new TList($generic_params); - } else { - $type = new TArray([ - $new_key_type, - $generic_params, - ]); - } - - $array_type->addType($type); - } - - $array_access_type = Type::combineUnionTypes( - $array_access_type, - clone $generic_params - ); - } else { - $array_access_type = Type::combineUnionTypes( - $array_access_type, - $type->getGenericValueType() - ); - } - - $has_valid_offset = true; - } else { - if (!$context->inside_isset - || ($type->sealed && !$union_comparison_results->type_coerced) - ) { - $expected_offset_types[] = $generic_key_type->getId(); - } - - $array_access_type = Type::getMixed(); - } - } - } - - /** - * @param list $expected_offset_types - * @param list $key_values - */ - private static function handleArrayAccessOnList( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - TList $type, - Union $offset_type, - ?string $array_var_id, - array $key_values, - Context $context, - bool $in_assignment, - array &$expected_offset_types, - ?Union $replacement_type, - ?Union &$array_access_type, - bool &$has_valid_offset - ): void { - // if we're assigning to an empty array with a key offset, refashion that array - if (!$in_assignment) { - if (!$type instanceof TNonEmptyList - || (count($key_values) === 1 - && is_int($key_values[0]) - && $key_values[0] > 0 - && $key_values[0] > ($type->count - 1)) - ) { - $expected_offset_type = Type::getInt(); - - if ($codebase->config->ensure_array_int_offsets_exist) { - self::checkLiteralIntArrayOffset( - $offset_type, - $expected_offset_type, - $array_var_id, - $stmt, - $context, - $statements_analyzer - ); - } - $has_valid_offset = true; - } elseif (count($key_values) === 1 - && is_int($key_values[0]) - && $key_values[0] < 0 - ) { - $expected_offset_types[] = 'positive-int'; - $has_valid_offset = false; - } else { - $has_valid_offset = true; - } - } - - if ($in_assignment && $type instanceof TNonEmptyList && $type->count !== null) { - $type->count++; - } - - if ($in_assignment && $replacement_type) { - $type->type_param = Type::combineUnionTypes( - $type->type_param, - $replacement_type, - $codebase - ); - } - - $array_access_type = Type::combineUnionTypes( - $array_access_type, - $type->type_param - ); - } - - private static function handleArrayAccessOnNamedObject( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - TNamedObject $type, - Context $context, - bool $in_assignment, - ?PhpParser\Node\Expr $assign_value, - ?Union &$array_access_type, - bool &$has_array_access - ): void { - if (strtolower($type->value) === 'simplexmlelement') { - $call_array_access_type = new Union([new TNamedObject('SimpleXMLElement')]); - } elseif (strtolower($type->value) === 'domnodelist' && $stmt->dim) { - $old_data_provider = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $fake_method_call = new VirtualMethodCall( - $stmt->var, - new VirtualIdentifier('item', $stmt->var->getAttributes()), - [ - new VirtualArg($stmt->dim) - ] - ); - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); - } - - if (!in_array('MixedMethodCall', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['MixedMethodCall']); - } - - MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_method_call, - $context - ); - - if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['PossiblyInvalidMethodCall']); - } - - if (!in_array('MixedMethodCall', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['MixedMethodCall']); - } - - $call_array_access_type = $statements_analyzer->node_data->getType($fake_method_call) ?? Type::getMixed(); - - $statements_analyzer->node_data = $old_data_provider; - } else { - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); - } - - if (!in_array('MixedMethodCall', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['MixedMethodCall']); - } - - if ($in_assignment) { - $old_node_data = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $fake_set_method_call = new VirtualMethodCall( - $stmt->var, - new VirtualIdentifier('offsetSet', $stmt->var->getAttributes()), - [ - new VirtualArg( - $stmt->dim - ?? new VirtualConstFetch( - new VirtualName('null'), - $stmt->var->getAttributes() - ) - ), - new VirtualArg( - $assign_value ?? new VirtualConstFetch( - new VirtualName('null'), - $stmt->var->getAttributes() - ) - ), - ] - ); - - MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_set_method_call, - $context - ); - - $statements_analyzer->node_data = $old_node_data; - } - - if ($stmt->dim) { - $old_node_data = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $fake_get_method_call = new VirtualMethodCall( - $stmt->var, - new VirtualIdentifier('offsetGet', $stmt->var->getAttributes()), - [ - new VirtualArg( - $stmt->dim - ) - ] - ); - - MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_get_method_call, - $context - ); - - $call_array_access_type = - $statements_analyzer->node_data->getType($fake_get_method_call) ?? Type::getMixed(); - - $statements_analyzer->node_data = $old_node_data; - } else { - $call_array_access_type = Type::getVoid(); - } - - $has_array_access = true; - - if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['PossiblyInvalidMethodCall']); - } - - if (!in_array('MixedMethodCall', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['MixedMethodCall']); - } - } - - $array_access_type = Type::combineUnionTypes( - $array_access_type, - $call_array_access_type - ); - } - - /** - * @param list $expected_offset_types - */ - private static function handleArrayAccessOnString( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\ArrayDimFetch $stmt, - bool $in_assignment, - Context $context, - ?Union $replacement_type, - TString $type, - Union $offset_type, - array &$expected_offset_types, - ?Union &$array_access_type, - bool &$has_valid_offset - ): void { - if ($in_assignment && $replacement_type) { - if ($replacement_type->hasMixed()) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - IssueBuffer::maybeAdd( - new MixedStringOffsetAssignment( - 'Right-hand-side of string offset assignment cannot be mixed', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); - } - } - } - - if ($type instanceof TSingleLetter) { - $valid_offset_type = Type::getInt(false, 0); - } elseif ($type instanceof TLiteralString) { - if ($type->value === '') { - $valid_offset_type = Type::getEmpty(); - } elseif (strlen($type->value) < 10) { - $valid_offsets = []; - - for ($i = -strlen($type->value), $l = strlen($type->value); $i < $l; $i++) { - $valid_offsets[] = new TLiteralInt($i); - } - - if (!$valid_offsets) { - throw new UnexpectedValueException('This is weird'); - } - - $valid_offset_type = new Union($valid_offsets); - } else { - $valid_offset_type = Type::getInt(); - } - } else { - $valid_offset_type = Type::getInt(); - } - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $offset_type, - $valid_offset_type, - true - )) { - $expected_offset_types[] = $valid_offset_type->getId(); - - $array_access_type = Type::getMixed(); - } else { - $has_valid_offset = true; - - $array_access_type = Type::combineUnionTypes( - $array_access_type, - Type::getSingleLetter() - ); - } - } - - /** - * @param Atomic[] $offset_types - */ - private static function checkArrayOffsetType( - Union $offset_type, - array $offset_types, - Codebase $codebase - ): bool { - $has_valid_absolute_offset = false; - foreach ($offset_types as $atomic_offset_type) { - if ($atomic_offset_type instanceof TClassConstant) { - $expanded = TypeExpander::expandAtomic( - $codebase, - $atomic_offset_type, - $atomic_offset_type->fq_classlike_name, - $atomic_offset_type->fq_classlike_name, - null, - true, - true - ); - - if ($expanded instanceof Atomic) { - if (!$expanded instanceof TClassConstant) { - $has_valid_absolute_offset = self::checkArrayOffsetType( - $offset_type, - [$expanded], - $codebase - ); - } - } else { - $has_valid_absolute_offset = self::checkArrayOffsetType( - $offset_type, - $expanded, - $codebase - ); - } - - if ($has_valid_absolute_offset) { - break; - } - } - - if ($atomic_offset_type instanceof TFalse && - $offset_type->ignore_falsable_issues === true - ) { - //do nothing - } elseif ($atomic_offset_type instanceof TNull && - $offset_type->ignore_nullable_issues === true - ) { - //do nothing - } elseif ($atomic_offset_type instanceof TString || - $atomic_offset_type instanceof TInt || - $atomic_offset_type instanceof TArrayKey || - $atomic_offset_type instanceof TMixed - ) { - $has_valid_absolute_offset = true; - break; - } elseif ($atomic_offset_type instanceof TTemplateParam) { - $has_valid_absolute_offset = self::checkArrayOffsetType( - $offset_type, - $atomic_offset_type->as->getAtomicTypes(), - $codebase - ); - - if ($has_valid_absolute_offset) { - break; - } - } - } - return $has_valid_absolute_offset; - } -} 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 deleted file mode 100644 index b34e983e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php +++ /dev/null @@ -1,1217 +0,0 @@ - $invalid_fetch_types $invalid_fetch_types - */ - public static function analyze( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\PropertyFetch $stmt, - Context $context, - bool $in_assignment, - ?string $var_id, - ?string $stmt_var_id, - Union $stmt_var_type, - Atomic $lhs_type_part, - string $prop_name, - bool &$has_valid_fetch_type, - array &$invalid_fetch_types, - bool $is_static_access = false - ): void { - if ($lhs_type_part instanceof TNull) { - return; - } - - if ($lhs_type_part instanceof TMixed) { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - return; - } - - if ($lhs_type_part instanceof TFalse && $stmt_var_type->ignore_falsable_issues) { - return; - } - - if (!$lhs_type_part instanceof TNamedObject && !$lhs_type_part instanceof TObject) { - $invalid_fetch_types[] = (string)$lhs_type_part; - - return; - } - - $has_valid_fetch_type = true; - - if ($lhs_type_part instanceof TObjectWithProperties - && isset($lhs_type_part->properties[$prop_name]) - ) { - $stmt_type = $statements_analyzer->node_data->getType($stmt); - - $statements_analyzer->node_data->setType( - $stmt, - Type::combineUnionTypes( - $lhs_type_part->properties[$prop_name], - $stmt_type - ) - ); - - return; - } - - // stdClass and SimpleXMLElement are special cases where we cannot infer the return types - // but we don't want to throw an error - // Hack has a similar issue: https://github.com/facebook/hhvm/issues/5164 - if ($lhs_type_part instanceof TObject - || in_array(strtolower($lhs_type_part->value), Config::getInstance()->getUniversalObjectCrates(), true) - ) { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - - return; - } - - if (ExpressionAnalyzer::isMock($lhs_type_part->value)) { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - return; - } - - $intersection_types = $lhs_type_part->getIntersectionTypes() ?: []; - - $fq_class_name = $lhs_type_part->value; - - $override_property_visibility = false; - - $has_magic_getter = false; - - $class_exists = false; - - $codebase = $statements_analyzer->getCodebase(); - - if (!$codebase->classExists($lhs_type_part->value) - && !$codebase->classlikes->enumExists($lhs_type_part->value) - ) { - $interface_exists = false; - - self::handleNonExistentClass( - $statements_analyzer, - $codebase, - $stmt, - $lhs_type_part, - $intersection_types, - $class_exists, - $interface_exists, - $fq_class_name, - $override_property_visibility - ); - - if (!$class_exists && !$interface_exists) { - return; - } - } else { - $class_exists = true; - } - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $config = $statements_analyzer->getProjectAnalyzer()->getConfig(); - - $property_id = $fq_class_name . '::$' . $prop_name; - - if ($class_storage->is_enum || in_array('UnitEnum', $codebase->getParentInterfaces($fq_class_name))) { - if ($prop_name === 'value' && !$class_storage->is_enum) { - $statements_analyzer->node_data->setType( - $stmt, - new Union([ - new TString(), - new TInt() - ]) - ); - } elseif ($prop_name === 'value' && $class_storage->enum_type !== null && $class_storage->enum_cases) { - self::handleEnumValue($statements_analyzer, $stmt, $class_storage); - } elseif ($prop_name === 'name') { - self::handleEnumName($statements_analyzer, $stmt, $lhs_type_part); - } else { - self::handleNonExistentProperty( - $statements_analyzer, - $codebase, - $stmt, - $context, - $config, - $class_storage, - $prop_name, - $lhs_type_part, - $fq_class_name, - $property_id, - $in_assignment, - $stmt_var_id, - $has_magic_getter, - $var_id - ); - } - - return; - } - - $naive_property_exists = $codebase->properties->propertyExists( - $property_id, - !$in_assignment, - $statements_analyzer, - $context, - $codebase->collect_locations ? new CodeLocation($statements_analyzer->getSource(), $stmt) : null - ); - - // add method before changing fq_class_name - $get_method_id = new MethodIdentifier($fq_class_name, '__get'); - - if (!$naive_property_exists - && $class_storage->namedMixins - ) { - foreach ($class_storage->namedMixins as $mixin) { - $new_property_id = $mixin->value . '::$' . $prop_name; - - try { - $new_class_storage = $codebase->classlike_storage_provider->get($mixin->value); - } catch (InvalidArgumentException $e) { - $new_class_storage = null; - } - - if ($new_class_storage - && ($codebase->properties->propertyExists( - $new_property_id, - !$in_assignment, - $statements_analyzer, - $context, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer->getSource(), $stmt) - : null - ) - || isset($new_class_storage->pseudo_property_get_types['$' . $prop_name])) - ) { - $fq_class_name = $mixin->value; - $lhs_type_part = clone $mixin; - $class_storage = $new_class_storage; - - if (!isset($new_class_storage->pseudo_property_get_types['$' . $prop_name])) { - $naive_property_exists = true; - } - - $property_id = $new_property_id; - } - } - } - - $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( - $property_id, - true, - $statements_analyzer - ); - - if (self::propertyFetchCanBeAnalyzed( - $statements_analyzer, - $codebase, - $stmt, - $context, - $fq_class_name, - $prop_name, - $lhs_type_part, - $property_id, - $has_magic_getter, - $stmt_var_id, - $naive_property_exists, - $override_property_visibility, - $class_exists, - $declaring_property_class, - $class_storage, - $get_method_id, - $in_assignment - ) === false) { - return; - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->name, - $property_id - ); - } - - if (!$naive_property_exists - && $fq_class_name !== $context->self - && $context->self - && $codebase->classlikes->classExtends($fq_class_name, $context->self) - && $codebase->properties->propertyExists( - $context->self . '::$' . $prop_name, - true, - $statements_analyzer, - $context, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer->getSource(), $stmt) - : null - ) - ) { - $property_id = $context->self . '::$' . $prop_name; - } elseif (!$naive_property_exists - || (!$is_static_access - // when property existence is asserted by a plugin it doesn't necessarily has storage - && $codebase->properties->hasStorage($property_id) - && $codebase->properties->getStorage($property_id)->is_static - ) - ) { - self::handleNonExistentProperty( - $statements_analyzer, - $codebase, - $stmt, - $context, - $config, - $class_storage, - $prop_name, - $lhs_type_part, - $declaring_property_class, - $property_id, - $in_assignment, - $stmt_var_id, - $has_magic_getter, - $var_id - ); - - return; - } - - if (!$override_property_visibility) { - if (ClassLikeAnalyzer::checkPropertyVisibility( - $property_id, - $context, - $statements_analyzer, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues() - ) === false) { - return; - } - } - - // FIXME: the following line look superfluous, but removing it makes - // Psalm\Tests\PropertyTypeTest::testValidCode with data set "callInParentContext" - // fail - $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( - $property_id, - true, - $statements_analyzer - ); - - if ($declaring_property_class === null) { - return; - } - - if ($codebase->properties_to_rename) { - $declaring_property_id = strtolower($declaring_property_class) . '::$' . $prop_name; - - foreach ($codebase->properties_to_rename as $original_property_id => $new_property_name) { - if ($declaring_property_id === $original_property_id) { - $file_manipulations = [ - new FileManipulation( - (int) $stmt->name->getAttribute('startFilePos'), - (int) $stmt->name->getAttribute('endFilePos') + 1, - $new_property_name - ) - ]; - - FileManipulationBuffer::add( - $statements_analyzer->getFilePath(), - $file_manipulations - ); - } - } - } - - $declaring_class_storage = $codebase->classlike_storage_provider->get( - $declaring_property_class - ); - - if (isset($declaring_class_storage->properties[$prop_name])) { - self::checkPropertyDeprecation($prop_name, $declaring_property_class, $stmt, $statements_analyzer); - - $property_storage = $declaring_class_storage->properties[$prop_name]; - - if ($context->self && !NamespaceAnalyzer::isWithinAny($context->self, $property_storage->internal)) { - IssueBuffer::maybeAdd( - new InternalProperty( - $property_id . ' is internal to ' . InternalClass::listToPhrase($property_storage->internal) - . ' but called from ' . $context->self, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($context->inside_unset) { - InstancePropertyAssignmentAnalyzer::trackPropertyImpurity( - $statements_analyzer, - $stmt, - $property_id, - $property_storage, - $declaring_class_storage, - $context - ); - } - } - - $class_property_type = self::getClassPropertyType( - $statements_analyzer, - $codebase, - $config, - $context, - $stmt, - $class_storage, - $declaring_class_storage, - $property_id, - $fq_class_name, - $prop_name, - $lhs_type_part - ); - - if (!$context->collect_mutations - && !$context->collect_initializations - && !($class_storage->external_mutation_free - && $class_property_type->allow_mutations) - ) { - if ($context->pure) { - IssueBuffer::maybeAdd( - new ImpurePropertyFetch( - 'Cannot access a property on a mutable object from a pure context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_impure = true; - } - } - - self::processTaints( - $statements_analyzer, - $stmt, - $class_property_type, - $property_id, - $class_storage, - $in_assignment, - $context - ); - - if ($class_storage->mutation_free) { - $class_property_type->has_mutations = false; - } - - $stmt_type = $statements_analyzer->node_data->getType($stmt); - $statements_analyzer->node_data->setType( - $stmt, - Type::combineUnionTypes($class_property_type, $stmt_type) - ); - } - - /** - * @param PropertyFetch|StaticPropertyFetch $stmt - */ - public static function checkPropertyDeprecation( - string $prop_name, - string $declaring_property_class, - PhpParser\Node\Expr $stmt, - StatementsAnalyzer $statements_analyzer - ): void { - $property_id = $declaring_property_class . '::$' . $prop_name; - $codebase = $statements_analyzer->getCodebase(); - $declaring_class_storage = $codebase->classlike_storage_provider->get( - $declaring_property_class - ); - - if (isset($declaring_class_storage->properties[$prop_name])) { - $property_storage = $declaring_class_storage->properties[$prop_name]; - - if ($property_storage->deprecated) { - IssueBuffer::maybeAdd( - new DeprecatedProperty( - $property_id . ' is marked deprecated', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - private static function propertyFetchCanBeAnalyzed( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\PropertyFetch $stmt, - Context $context, - string $fq_class_name, - string $prop_name, - TNamedObject $lhs_type_part, - string &$property_id, - bool &$has_magic_getter, - ?string $stmt_var_id, - bool $naive_property_exists, - bool $override_property_visibility, - bool $class_exists, - ?string $declaring_property_class, - ClassLikeStorage $class_storage, - MethodIdentifier $get_method_id, - bool $in_assignment - ): bool { - if ((!$naive_property_exists - || ($stmt_var_id !== '$this' - && $fq_class_name !== $context->self - && ClassLikeAnalyzer::checkPropertyVisibility( - $property_id, - $context, - $statements_analyzer, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues(), - false - ) !== true) - ) - && $codebase->methods->methodExists( - $get_method_id, - $context->calling_method_id, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer->getSource(), $stmt) - : null, - !$context->collect_initializations - && !$context->collect_mutations - ? $statements_analyzer - : null, - $statements_analyzer->getFilePath() - ) - ) { - $has_magic_getter = true; - - if (isset($class_storage->pseudo_property_get_types['$' . $prop_name])) { - $stmt_type = TypeExpander::expandUnion( - $codebase, - clone $class_storage->pseudo_property_get_types['$' . $prop_name], - $class_storage->name, - $class_storage->name, - $class_storage->parent_class - ); - - if (count($template_types = $class_storage->getClassTemplateTypes()) !== 0) { - if (!$lhs_type_part instanceof TGenericObject) { - $lhs_type_part = new TGenericObject($lhs_type_part->value, $template_types); - } - - $stmt_type = self::localizePropertyType( - $codebase, - $stmt_type, - $lhs_type_part, - $class_storage, - $declaring_property_class - ? $codebase->classlike_storage_provider->get( - $declaring_property_class - ) : $class_storage - ); - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - self::processTaints( - $statements_analyzer, - $stmt, - $stmt_type, - $property_id, - $class_storage, - $in_assignment, - $context - ); - - return false; - } - - $old_data_provider = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $statements_analyzer->node_data->setType($stmt->var, new Union([$lhs_type_part])); - - $fake_method_call = new VirtualMethodCall( - $stmt->var, - new VirtualIdentifier('__get', $stmt->name->getAttributes()), - [ - new VirtualArg( - new VirtualString( - $prop_name, - $stmt->name->getAttributes() - ) - ) - ] - ); - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('InternalMethod', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['InternalMethod']); - } - - MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_method_call, - $context, - false - ); - - if (!in_array('InternalMethod', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['InternalMethod']); - } - - $fake_method_call_type = $statements_analyzer->node_data->getType($fake_method_call); - - $statements_analyzer->node_data = $old_data_provider; - - if ($fake_method_call_type) { - $stmt_type = $statements_analyzer->node_data->getType($stmt); - $statements_analyzer->node_data->setType( - $stmt, - Type::combineUnionTypes($fake_method_call_type, $stmt_type) - ); - } else { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } - - /* - * If we have an explicit list of all allowed magic properties on the class, and we're - * not in that list, fall through - */ - if (!($class_storage->sealed_properties || $codebase->config->seal_all_properties) - && !$override_property_visibility - ) { - return false; - } - - if (!$class_exists) { - $property_id = $lhs_type_part->value . '::$' . $prop_name; - - IssueBuffer::maybeAdd( - new UndefinedMagicPropertyFetch( - 'Magic instance property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - return false; - } - } - - return true; - } - - public static function localizePropertyType( - Codebase $codebase, - Union $class_property_type, - TGenericObject $lhs_type_part, - ClassLikeStorage $property_class_storage, - ClassLikeStorage $property_declaring_class_storage - ): Union { - $template_types = CallAnalyzer::getTemplateTypesForCall( - $codebase, - $property_declaring_class_storage, - $property_declaring_class_storage->name, - $property_class_storage, - $property_class_storage->template_types ?: [] - ); - - $extended_types = $property_class_storage->template_extended_params; - - if ($template_types) { - if ($property_class_storage->template_types) { - foreach ($lhs_type_part->type_params as $param_offset => $lhs_param_type) { - $i = -1; - - foreach ($property_class_storage->template_types as $calling_param_name => $_) { - $i++; - - if ($i === $param_offset) { - $template_types[$calling_param_name][$property_class_storage->name] = $lhs_param_type; - break; - } - } - } - } - - foreach ($template_types as $type_name => $_) { - if (isset($extended_types[$property_declaring_class_storage->name][$type_name])) { - $mapped_type = $extended_types[$property_declaring_class_storage->name][$type_name]; - - foreach ($mapped_type->getAtomicTypes() as $mapped_type_atomic) { - if (!$mapped_type_atomic instanceof TTemplateParam) { - continue; - } - - $param_name = $mapped_type_atomic->param_name; - - $position = false; - - if (isset($property_class_storage->template_types[$param_name])) { - $position = array_search( - $param_name, - array_keys($property_class_storage->template_types) - ); - } - - if ($position !== false && isset($lhs_type_part->type_params[$position])) { - $template_types[$type_name][$property_declaring_class_storage->name] - = $lhs_type_part->type_params[$position]; - } - } - } - } - - TemplateInferredTypeReplacer::replace( - $class_property_type, - new TemplateResult([], $template_types), - $codebase - ); - } - - return $class_property_type; - } - - public static function processTaints( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\PropertyFetch $stmt, - Union $type, - string $property_id, - ClassLikeStorage $class_storage, - bool $in_assignment, - ?Context $context = null - ): void { - if (!$statements_analyzer->data_flow_graph) { - return; - } - - $data_flow_graph = $statements_analyzer->data_flow_graph; - - $var_location = new CodeLocation($statements_analyzer->getSource(), $stmt->var); - $property_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - $added_taints = []; - $removed_taints = []; - - if ($context) { - $codebase = $statements_analyzer->getCodebase(); - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - } - - if ($class_storage->specialize_instance) { - $var_id = ExpressionIdentifier::getArrayVarId( - $stmt->var, - null, - $statements_analyzer - ); - - $var_property_id = ExpressionIdentifier::getArrayVarId( - $stmt, - null, - $statements_analyzer - ); - - if ($var_id) { - $var_type = $statements_analyzer->node_data->getType($stmt->var); - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && $var_type - && in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - $var_type->parent_nodes = []; - return; - } - - $var_node = DataFlowNode::getForAssignment( - $var_id, - $var_location - ); - - $data_flow_graph->addNode($var_node); - - $property_node = DataFlowNode::getForAssignment( - $var_property_id ?: $var_id . '->$property', - $property_location - ); - - $data_flow_graph->addNode($property_node); - - $data_flow_graph->addPath( - $var_node, - $property_node, - 'property-fetch' - . ($stmt->name instanceof PhpParser\Node\Identifier ? '-' . $stmt->name : ''), - $added_taints, - $removed_taints - ); - - if ($var_type && $var_type->parent_nodes) { - foreach ($var_type->parent_nodes as $parent_node) { - $data_flow_graph->addPath( - $parent_node, - $var_node, - '=', - $added_taints, - $removed_taints - ); - } - } - - $type->parent_nodes = [$property_node->id => $property_node]; - } - } else { - $var_property_id = ExpressionIdentifier::getArrayVarId( - $stmt, - null, - $statements_analyzer - ); - - $localized_property_node = DataFlowNode::getForAssignment( - $var_property_id - ?: $property_id . '-' . $property_location->file_name . ':' . $property_location->raw_file_start, - $property_location - ); - - $data_flow_graph->addNode($localized_property_node); - - $property_node = new DataFlowNode( - $property_id, - $property_id, - null, - null - ); - - $data_flow_graph->addNode($property_node); - - if ($in_assignment) { - $data_flow_graph->addPath( - $localized_property_node, - $property_node, - 'property-assignment', - $added_taints, - $removed_taints - ); - } else { - $data_flow_graph->addPath( - $property_node, - $localized_property_node, - 'property-fetch', - $added_taints, - $removed_taints - ); - } - - $type->parent_nodes = [$localized_property_node->id => $localized_property_node]; - } - } - - private static function handleEnumName( - StatementsAnalyzer $statements_analyzer, - PropertyFetch $stmt, - Atomic $lhs_type_part - ): void { - if ($lhs_type_part instanceof TEnumCase) { - $statements_analyzer->node_data->setType( - $stmt, - new Union([new TLiteralString($lhs_type_part->case_name)]) - ); - } else { - $statements_analyzer->node_data->setType($stmt, Type::getNonEmptyString()); - } - } - - private static function handleEnumValue( - StatementsAnalyzer $statements_analyzer, - PropertyFetch $stmt, - ClassLikeStorage $class_storage - ): void { - $case_values = []; - - foreach ($class_storage->enum_cases as $enum_case) { - if (is_string($enum_case->value)) { - $case_values[] = new TLiteralString($enum_case->value); - } elseif (is_int($enum_case->value)) { - $case_values[] = new TLiteralInt($enum_case->value); - } else { - // this should never happen - $case_values[] = new TMixed(); - } - } - - // todo: this is suboptimal when we reference enum directly, e.g. Status::Open->value - /** @psalm-suppress ArgumentTypeCoercion */ - $statements_analyzer->node_data->setType( - $stmt, - new Union($case_values) - ); - } - - private static function handleUndefinedProperty( - Context $context, - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\PropertyFetch $stmt, - ?string $stmt_var_id, - string $property_id, - bool $has_magic_getter, - ?string $var_id - ): void { - if ($context->inside_isset || $context->collect_initializations) { - if ($context->pure) { - IssueBuffer::maybeAdd( - new ImpurePropertyFetch( - 'Cannot access a property on a mutable object from a pure context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($context->inside_isset - && $statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_impure = true; - } - - return; - } - - if ($stmt_var_id === '$this') { - IssueBuffer::maybeAdd( - new UndefinedThisPropertyFetch( - 'Instance property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - if ($has_magic_getter) { - IssueBuffer::maybeAdd( - new UndefinedMagicPropertyFetch( - 'Magic instance property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new UndefinedPropertyFetch( - 'Instance property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - $stmt_type = Type::getMixed(); - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - if ($var_id) { - $context->vars_in_scope[$var_id] = $stmt_type; - } - } - - /** - * @param array $intersection_types - */ - private static function handleNonExistentClass( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\PropertyFetch $stmt, - TNamedObject $lhs_type_part, - array $intersection_types, - bool &$class_exists, - bool &$interface_exists, - string &$fq_class_name, - bool &$override_property_visibility - ): void { - if ($codebase->interfaceExists($lhs_type_part->value)) { - $interface_exists = true; - $interface_storage = $codebase->classlike_storage_provider->get($lhs_type_part->value); - - $override_property_visibility = $interface_storage->override_property_visibility; - - foreach ($intersection_types as $intersection_type) { - if ($intersection_type instanceof TNamedObject - && $codebase->classExists($intersection_type->value) - ) { - $fq_class_name = $intersection_type->value; - $class_exists = true; - return; - } - } - - if (!$class_exists && - //interfaces can't have properties. Except when they do... In PHP Core, they can - !in_array($fq_class_name, ['UnitEnum', 'BackedEnum'], true) && - !in_array('UnitEnum', $codebase->getParentInterfaces($fq_class_name)) - ) { - if (IssueBuffer::accepts( - new NoInterfaceProperties( - 'Interfaces cannot have properties', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $lhs_type_part->value - ), - $statements_analyzer->getSuppressedIssues() - )) { - return; - } - - if (!$codebase->methodExists($fq_class_name . '::__set')) { - return; - } - } - } - - if (!$class_exists && !$interface_exists) { - if ($lhs_type_part->from_docblock) { - IssueBuffer::maybeAdd( - new UndefinedDocblockClass( - 'Cannot get properties of undefined docblock class ' . $lhs_type_part->value, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $lhs_type_part->value - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new UndefinedClass( - 'Cannot get properties of undefined class ' . $lhs_type_part->value, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $lhs_type_part->value - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - private static function handleNonExistentProperty( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - PhpParser\Node\Expr\PropertyFetch $stmt, - Context $context, - Config $config, - ClassLikeStorage $class_storage, - string $prop_name, - TNamedObject $lhs_type_part, - ?string $declaring_property_class, - string $property_id, - bool $in_assignment, - ?string $stmt_var_id, - bool $has_magic_getter, - ?string $var_id - ): void { - if ($config->use_phpdoc_property_without_magic_or_parent - && isset($class_storage->pseudo_property_get_types['$' . $prop_name]) - ) { - $stmt_type = clone $class_storage->pseudo_property_get_types['$' . $prop_name]; - - if (count($template_types = $class_storage->getClassTemplateTypes()) !== 0) { - if (!$lhs_type_part instanceof TGenericObject) { - $lhs_type_part = new TGenericObject($lhs_type_part->value, $template_types); - } - - $stmt_type = self::localizePropertyType( - $codebase, - $stmt_type, - $lhs_type_part, - $class_storage, - $declaring_property_class - ? $codebase->classlike_storage_provider->get( - $declaring_property_class - ) : $class_storage - ); - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - self::processTaints( - $statements_analyzer, - $stmt, - $stmt_type, - $property_id, - $class_storage, - $in_assignment, - $context - ); - - return; - } - - if ($class_storage->is_interface) { - return; - } - - self::handleUndefinedProperty( - $context, - $statements_analyzer, - $stmt, - $stmt_var_id, - $property_id, - $has_magic_getter, - $var_id - ); - } - - private static function getClassPropertyType( - StatementsAnalyzer $statements_analyzer, - Codebase $codebase, - Config $config, - Context $context, - PhpParser\Node\Expr\PropertyFetch $stmt, - ClassLikeStorage $class_storage, - ClassLikeStorage $declaring_class_storage, - string $property_id, - string $fq_class_name, - string $prop_name, - TNamedObject $lhs_type_part - ): Union { - $class_property_type = $codebase->properties->getPropertyType( - $property_id, - false, - $statements_analyzer, - $context - ); - - if (!$class_property_type) { - if ($declaring_class_storage->location - && $config->isInProjectDirs( - $declaring_class_storage->location->file_path - ) - ) { - IssueBuffer::maybeAdd( - new MissingPropertyType( - 'Property ' . $fq_class_name . '::$' . $prop_name - . ' does not have a declared type', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - $class_property_type = Type::getMixed(); - } else { - $class_property_type = TypeExpander::expandUnion( - $codebase, - clone $class_property_type, - $declaring_class_storage->name, - $declaring_class_storage->name, - $declaring_class_storage->parent_class - ); - - if (count($template_types = $declaring_class_storage->getClassTemplateTypes()) !== 0) { - if (!$lhs_type_part instanceof TGenericObject) { - $lhs_type_part = new TGenericObject($lhs_type_part->value, $template_types); - } - - $class_property_type = self::localizePropertyType( - $codebase, - $class_property_type, - $lhs_type_part, - $class_storage, - $declaring_class_storage - ); - } elseif ($lhs_type_part instanceof TGenericObject) { - $class_property_type = self::localizePropertyType( - $codebase, - $class_property_type, - $lhs_type_part, - $class_storage, - $declaring_class_storage - ); - } - } - - return $class_property_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php deleted file mode 100644 index 8ed56437..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php +++ /dev/null @@ -1,679 +0,0 @@ -class and - * analyse the ::class int $stmt->name separately - */ - public static function analyze( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\ClassConstFetch $stmt, - Context $context - ): bool { - $codebase = $statements_analyzer->getCodebase(); - - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - - if ($stmt->class instanceof PhpParser\Node\Name) { - $first_part_lc = strtolower($stmt->class->parts[0]); - - if ($first_part_lc === 'self' || $first_part_lc === 'static') { - if (!$context->self) { - if (IssueBuffer::accepts( - new NonStaticSelfCall( - 'Cannot use ' . $first_part_lc . ' outside class context', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - return true; - } - - $fq_class_name = $context->self; - } elseif ($first_part_lc === 'parent') { - $fq_class_name = $statements_analyzer->getParentFQCLN(); - - if ($fq_class_name === null) { - if (IssueBuffer::accepts( - new ParentNotFound( - 'Cannot check property fetch on parent as this class does not extend another', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - return true; - } - } else { - $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( - $stmt->class, - $statements_analyzer->getAliases() - ); - - if ($stmt->name instanceof PhpParser\Node\Identifier) { - if ((!$context->inside_class_exists || $stmt->name->name !== 'class') - && !isset($context->phantom_classes[strtolower($fq_class_name)]) - ) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $fq_class_name, - new CodeLocation($statements_analyzer->getSource(), $stmt->class), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions(false, true) - ) === false) { - return true; - } - } - } - } - - $fq_class_name_lc = strtolower($fq_class_name); - - $moved_class = false; - - if ($codebase->alter_code - && !in_array($stmt->class->parts[0], ['parent', 'static']) - ) { - $moved_class = $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $stmt->class, - $fq_class_name, - $context->calling_method_id, - false, - $stmt->class->parts[0] === 'self' - ); - } - - if ($codebase->classlikes->classExists($fq_class_name)) { - $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); - } - - if ($stmt->name instanceof PhpParser\Node\Identifier && $stmt->name->name === 'class') { - if ($codebase->classlikes->classExists($fq_class_name)) { - $const_class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - $fq_class_name = $const_class_storage->name; - - if ($const_class_storage->deprecated && $fq_class_name !== $context->self) { - IssueBuffer::maybeAdd( - new DeprecatedClass( - 'Class ' . $fq_class_name . ' is deprecated', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_class_name - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($first_part_lc === 'static') { - $static_named_object = new TNamedObject($fq_class_name); - $static_named_object->was_static = true; - - $statements_analyzer->node_data->setType( - $stmt, - new Union([ - new TClassString($fq_class_name, $static_named_object) - ]) - ); - } else { - $statements_analyzer->node_data->setType($stmt, Type::getLiteralClassString($fq_class_name, true)); - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->class, - $fq_class_name - ); - } - - return true; - } - - // if we're ignoring that the class doesn't exist, exit anyway - if (!$codebase->classlikes->classOrInterfaceOrEnumExists($fq_class_name)) { - return true; - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->class, - $fq_class_name - ); - } - - if (!$stmt->name instanceof PhpParser\Node\Identifier) { - return true; - } - - $const_id = $fq_class_name . '::' . $stmt->name; - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->name, - $const_id - ); - } - - $const_class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - if ($const_class_storage->is_enum) { - $case = $const_class_storage->enum_cases[(string)$stmt->name] ?? null; - if ($case && $case->deprecated) { - IssueBuffer::maybeAdd( - new DeprecatedConstant( - "Enum Case $const_id is marked as deprecated", - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($fq_class_name === $context->self - || ( - $statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer && - $fq_class_name === $statements_analyzer->getSource()->getFQCLN() - ) - ) { - $class_visibility = ReflectionProperty::IS_PRIVATE; - } elseif ($context->self && - ($codebase->classlikes->classExtends($context->self, $fq_class_name) - || $codebase->classlikes->classExtends($fq_class_name, $context->self)) - ) { - $class_visibility = ReflectionProperty::IS_PROTECTED; - } else { - $class_visibility = ReflectionProperty::IS_PUBLIC; - } - - try { - $class_constant_type = $codebase->classlikes->getClassConstantType( - $fq_class_name, - $stmt->name->name, - $class_visibility, - $statements_analyzer - ); - } catch (InvalidArgumentException $_) { - return true; - } catch (CircularReferenceException $e) { - IssueBuffer::maybeAdd( - new CircularReference( - 'Constant ' . $const_id . ' contains a circular reference', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return true; - } - - if (!$class_constant_type) { - if ($fq_class_name !== $context->self) { - $class_constant_type = $codebase->classlikes->getClassConstantType( - $fq_class_name, - $stmt->name->name, - ReflectionProperty::IS_PRIVATE, - $statements_analyzer - ); - } - - if ($class_constant_type) { - IssueBuffer::maybeAdd( - new InaccessibleClassConstant( - 'Constant ' . $const_id . ' is not visible in this context', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($context->check_consts) { - IssueBuffer::maybeAdd( - new UndefinedConstant( - 'Constant ' . $const_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - return true; - } - - if ($context->calling_method_id) { - $codebase->file_reference_provider->addMethodReferenceToClassMember( - $context->calling_method_id, - $fq_class_name_lc . '::' . $stmt->name->name, - false - ); - } - - $declaring_const_id = $fq_class_name_lc . '::' . $stmt->name->name; - - if ($codebase->alter_code && !$moved_class) { - foreach ($codebase->class_constant_transforms as $original_pattern => $transformation) { - if ($declaring_const_id === $original_pattern) { - [$new_fq_class_name, $new_const_name] = explode('::', $transformation); - - $file_manipulations = []; - - if (strtolower($new_fq_class_name) !== $fq_class_name_lc) { - $file_manipulations[] = new FileManipulation( - (int) $stmt->class->getAttribute('startFilePos'), - (int) $stmt->class->getAttribute('endFilePos') + 1, - Type::getStringFromFQCLN( - $new_fq_class_name, - $statements_analyzer->getNamespace(), - $statements_analyzer->getAliasedClassesFlipped(), - null - ) - ); - } - - $file_manipulations[] = new FileManipulation( - (int) $stmt->name->getAttribute('startFilePos'), - (int) $stmt->name->getAttribute('endFilePos') + 1, - $new_const_name - ); - - FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); - } - } - } - - if ($context->self - && !$context->collect_initializations - && !$context->collect_mutations - && !NamespaceAnalyzer::isWithinAny($context->self, $const_class_storage->internal) - ) { - IssueBuffer::maybeAdd( - new InternalClass( - $fq_class_name . ' is internal to ' - . InternalClass::listToPhrase($const_class_storage->internal) - . ' but called from ' . $context->self, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_class_name - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($const_class_storage->deprecated && $fq_class_name !== $context->self) { - IssueBuffer::maybeAdd( - new DeprecatedClass( - 'Class ' . $fq_class_name . ' is deprecated', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_class_name - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif (isset($const_class_storage->constants[$stmt->name->name]) - && $const_class_storage->constants[$stmt->name->name]->deprecated - ) { - IssueBuffer::maybeAdd( - new DeprecatedConstant( - 'Constant ' . $const_id . ' is deprecated', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($first_part_lc !== 'static' || $const_class_storage->final) { - $stmt_type = clone $class_constant_type; - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - $context->vars_in_scope[$const_id] = $stmt_type; - } - - return true; - } - - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->class, $context) === false) { - $context->inside_general_use = $was_inside_general_use; - - return false; - } - - $context->inside_general_use = $was_inside_general_use; - - $lhs_type = $statements_analyzer->node_data->getType($stmt->class); - - if ($lhs_type === null) { - return true; - } - - if ($stmt->name instanceof PhpParser\Node\Identifier && $stmt->name->name === 'class') { - $class_string_types = []; - - $has_mixed_or_object = false; - - foreach ($lhs_type->getAtomicTypes() as $lhs_atomic_type) { - if ($lhs_atomic_type instanceof TNamedObject) { - $class_string_types[] = new TClassString( - $lhs_atomic_type->value, - clone $lhs_atomic_type - ); - } elseif ($lhs_atomic_type instanceof TTemplateParam - && $lhs_atomic_type->as->isSingle()) { - $as_atomic_type = $lhs_atomic_type->as->getSingleAtomic(); - - if ($as_atomic_type instanceof TObject) { - $class_string_types[] = new TTemplateParamClass( - $lhs_atomic_type->param_name, - 'object', - null, - $lhs_atomic_type->defining_class - ); - } elseif ($as_atomic_type instanceof TNamedObject) { - $class_string_types[] = new TTemplateParamClass( - $lhs_atomic_type->param_name, - $as_atomic_type->value, - $as_atomic_type, - $lhs_atomic_type->defining_class - ); - } - } elseif ($lhs_atomic_type instanceof TObject - || $lhs_atomic_type instanceof TMixed - ) { - $has_mixed_or_object = true; - } - } - - if ($has_mixed_or_object) { - $statements_analyzer->node_data->setType($stmt, new Union([new TClassString()])); - } elseif ($class_string_types) { - $statements_analyzer->node_data->setType($stmt, new Union($class_string_types)); - } - - return true; - } - - if ($stmt->class instanceof PhpParser\Node\Expr\Variable) { - $fq_class_name = null; - $lhs_type_definite_class = null; - if ($lhs_type->isSingle()) { - $atomic_type = $lhs_type->getSingleAtomic(); - if ($atomic_type instanceof TNamedObject) { - $fq_class_name = $atomic_type->value; - $lhs_type_definite_class = $atomic_type->definite_class; - } elseif ($atomic_type instanceof TLiteralClassString) { - $fq_class_name = $atomic_type->value; - $lhs_type_definite_class = $atomic_type->definite_class; - } - } - - if ($fq_class_name === null || $lhs_type_definite_class === null) { - return true; - } - - if ($codebase->classlikes->classExists($fq_class_name)) { - $fq_class_name = $codebase->classlikes->getUnAliasedName($fq_class_name); - } - - $moved_class = false; - - if ($codebase->alter_code) { - $moved_class = $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $stmt->class, - $fq_class_name, - $context->calling_method_id - ); - } - - // if we're ignoring that the class doesn't exist, exit anyway - if (!$codebase->classlikes->classOrInterfaceOrEnumExists($fq_class_name)) { - return true; - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->class, - $fq_class_name - ); - } - - if (!$stmt->name instanceof PhpParser\Node\Identifier) { - return true; - } - - $const_id = $fq_class_name . '::' . $stmt->name; - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->name, - $const_id - ); - } - - $const_class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - if ($fq_class_name === $context->self - || ( - $statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer && - $fq_class_name === $statements_analyzer->getSource()->getFQCLN() - ) - ) { - $class_visibility = ReflectionProperty::IS_PRIVATE; - } elseif ($context->self && - ($codebase->classlikes->classExtends($context->self, $fq_class_name) - || $codebase->classlikes->classExtends($fq_class_name, $context->self)) - ) { - $class_visibility = ReflectionProperty::IS_PROTECTED; - } else { - $class_visibility = ReflectionProperty::IS_PUBLIC; - } - - try { - $class_constant_type = $codebase->classlikes->getClassConstantType( - $fq_class_name, - $stmt->name->name, - $class_visibility, - $statements_analyzer - ); - } catch (InvalidArgumentException $_) { - return true; - } catch (CircularReferenceException $e) { - IssueBuffer::maybeAdd( - new CircularReference( - 'Constant ' . $const_id . ' contains a circular reference', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return true; - } - - if (!$class_constant_type) { - if ($fq_class_name !== $context->self) { - $class_constant_type = $codebase->classlikes->getClassConstantType( - $fq_class_name, - $stmt->name->name, - ReflectionProperty::IS_PRIVATE, - $statements_analyzer - ); - } - - if ($class_constant_type) { - IssueBuffer::maybeAdd( - new InaccessibleClassConstant( - 'Constant ' . $const_id . ' is not visible in this context', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($context->check_consts) { - IssueBuffer::maybeAdd( - new UndefinedConstant( - 'Constant ' . $const_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - return true; - } - - if ($context->calling_method_id) { - $codebase->file_reference_provider->addMethodReferenceToClassMember( - $context->calling_method_id, - strtolower($fq_class_name) . '::' . $stmt->name->name, - false - ); - } - - $declaring_const_id = strtolower($fq_class_name) . '::' . $stmt->name->name; - - if ($codebase->alter_code && !$moved_class) { - foreach ($codebase->class_constant_transforms as $original_pattern => $transformation) { - if ($declaring_const_id === $original_pattern) { - [, $new_const_name] = explode('::', $transformation); - - $file_manipulations = []; - - $file_manipulations[] = new FileManipulation( - (int) $stmt->name->getAttribute('startFilePos'), - (int) $stmt->name->getAttribute('endFilePos') + 1, - $new_const_name - ); - - FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); - } - } - } - - if ($context->self - && !$context->collect_initializations - && !$context->collect_mutations - && !NamespaceAnalyzer::isWithinAny($context->self, $const_class_storage->internal) - ) { - IssueBuffer::maybeAdd( - new InternalClass( - $fq_class_name . ' is internal to ' - . InternalClass::listToPhrase($const_class_storage->internal) - . ' but called from ' . $context->self, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_class_name - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($const_class_storage->deprecated && $fq_class_name !== $context->self) { - IssueBuffer::maybeAdd( - new DeprecatedClass( - 'Class ' . $fq_class_name . ' is deprecated', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $fq_class_name - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif (isset($const_class_storage->constants[$stmt->name->name]) - && $const_class_storage->constants[$stmt->name->name]->deprecated - ) { - IssueBuffer::maybeAdd( - new DeprecatedConstant( - 'Constant ' . $const_id . ' is deprecated', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($const_class_storage->final || $lhs_type_definite_class === true) { - $stmt_type = clone $class_constant_type; - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - $context->vars_in_scope[$const_id] = $stmt_type; - } - - return true; - } - - return true; - } - - public static function analyzeClassConstAssignment( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Stmt\ClassConst $stmt, - Context $context - ): void { - foreach ($stmt->consts as $const) { - ExpressionAnalyzer::analyze($statements_analyzer, $const->value, $context); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php deleted file mode 100644 index 2d0d50e7..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php +++ /dev/null @@ -1,309 +0,0 @@ -name->parts); - - switch (strtolower($const_name)) { - case 'null': - $statements_analyzer->node_data->setType($stmt, Type::getNull()); - break; - - case 'false': - // false is a subtype of bool - $statements_analyzer->node_data->setType($stmt, Type::getFalse()); - break; - - case 'true': - $statements_analyzer->node_data->setType($stmt, Type::getTrue()); - break; - - case 'stdin': - $statements_analyzer->node_data->setType($stmt, Type::getResource()); - break; - - default: - $const_type = self::getConstType( - $statements_analyzer, - $const_name, - $stmt->name instanceof PhpParser\Node\Name\FullyQualified, - $context - ); - - $codebase = $statements_analyzer->getCodebase(); - - $aliased_constants = $statements_analyzer->getAliases()->constants; - if (isset($aliased_constants[$const_name])) { - $fq_const_name = $aliased_constants[$const_name]; - } elseif ($stmt->name instanceof PhpParser\Node\Name\FullyQualified) { - $fq_const_name = $const_name; - } else { - $fq_const_name = Type::getFQCLNFromString($const_name, $statements_analyzer->getAliases()); - } - - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt, - $const_type - ? $fq_const_name - : '*' - . ($stmt->name instanceof PhpParser\Node\Name\FullyQualified - ? '\\' - : $statements_analyzer->getNamespace() . '-') - . $const_name - ); - - if ($const_type) { - $statements_analyzer->node_data->setType($stmt, clone $const_type); - } elseif ($context->check_consts) { - IssueBuffer::maybeAdd( - new UndefinedConstant( - 'Const ' . $const_name . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - - public static function getGlobalConstType( - Codebase $codebase, - string $fq_const_name, - string $const_name - ): ?Union { - if ($const_name === 'STDERR' - || $const_name === 'STDOUT' - || $const_name === 'STDIN' - ) { - return Type::getResource(); - } - - if ($fq_const_name) { - $stubbed_const_type = $codebase->getStubbedConstantType( - $fq_const_name - ); - - if ($stubbed_const_type) { - return $stubbed_const_type; - } - } - - $stubbed_const_type = $codebase->getStubbedConstantType( - $const_name - ); - - if ($stubbed_const_type) { - return $stubbed_const_type; - } - - $predefined_constants = $codebase->config->getPredefinedConstants(); - - if (($fq_const_name && array_key_exists($fq_const_name, $predefined_constants)) - || array_key_exists($const_name, $predefined_constants) - ) { - switch ($const_name) { - case 'PHP_VERSION': - case 'DIRECTORY_SEPARATOR': - case 'PATH_SEPARATOR': - case 'PHP_EOL': - return Type::getNonEmptyString(); - - case 'PEAR_EXTENSION_DIR': - case 'PEAR_INSTALL_DIR': - case 'PHP_BINARY': - case 'PHP_BINDIR': - case 'PHP_CONFIG_FILE_PATH': - case 'PHP_CONFIG_FILE_SCAN_DIR': - case 'PHP_DATADIR': - case 'PHP_EXTENSION_DIR': - case 'PHP_EXTRA_VERSION': - case 'PHP_LIBDIR': - case 'PHP_LOCALSTATEDIR': - case 'PHP_MANDIR': - case 'PHP_OS': - case 'PHP_OS_FAMILY': - case 'PHP_PREFIX': - case 'PHP_SAPI': - case 'PHP_SYSCONFDIR': - return Type::getString(); - - case 'PHP_MAJOR_VERSION': - case 'PHP_MINOR_VERSION': - case 'PHP_RELEASE_VERSION': - case 'PHP_DEBUG': - case 'PHP_FLOAT_DIG': - case 'PHP_INT_MIN': - case 'PHP_ZTS': - return Type::getInt(); - - case 'PHP_INT_MAX': - case 'PHP_INT_SIZE': - case 'PHP_MAXPATHLEN': - case 'PHP_VERSION_ID': - return Type::getPositiveInt(); - - case 'PHP_FLOAT_EPSILON': - case 'PHP_FLOAT_MAX': - case 'PHP_FLOAT_MIN': - return Type::getFloat(); - } - - if ($fq_const_name && array_key_exists($fq_const_name, $predefined_constants)) { - return ClassLikeAnalyzer::getTypeFromValue($predefined_constants[$fq_const_name]); - } - - return ClassLikeAnalyzer::getTypeFromValue($predefined_constants[$const_name]); - } - - return null; - } - - public static function getConstType( - StatementsAnalyzer $statements_analyzer, - string $const_name, - bool $is_fully_qualified, - ?Context $context - ): ?Union { - $aliased_constants = $statements_analyzer->getAliases()->constants; - - if (isset($aliased_constants[$const_name])) { - $fq_const_name = $aliased_constants[$const_name]; - } elseif ($is_fully_qualified) { - $fq_const_name = $const_name; - } else { - $fq_const_name = Type::getFQCLNFromString($const_name, $statements_analyzer->getAliases()); - } - - if ($fq_const_name) { - $const_name_parts = explode('\\', $fq_const_name); - $const_name = array_pop($const_name_parts); - $namespace_name = implode('\\', $const_name_parts); - $namespace_constants = NamespaceAnalyzer::getConstantsForNamespace( - $namespace_name, - ReflectionProperty::IS_PUBLIC - ); - - if (isset($namespace_constants[$const_name])) { - return $namespace_constants[$const_name]; - } - } - - if ($context && $context->hasVariable($fq_const_name)) { - return $context->vars_in_scope[$fq_const_name]; - } - - $file_path = $statements_analyzer->getRootFilePath(); - $codebase = $statements_analyzer->getCodebase(); - - $file_storage_provider = $codebase->file_storage_provider; - - $file_storage = $file_storage_provider->get($file_path); - - if (isset($file_storage->declaring_constants[$const_name])) { - $constant_file_path = $file_storage->declaring_constants[$const_name]; - - return $file_storage_provider->get($constant_file_path)->constants[$const_name]; - } - - if (isset($file_storage->declaring_constants[$fq_const_name])) { - $constant_file_path = $file_storage->declaring_constants[$fq_const_name]; - - return $file_storage_provider->get($constant_file_path)->constants[$fq_const_name]; - } - - return self::getGlobalConstType($codebase, $fq_const_name, $const_name) - ?? self::getGlobalConstType($codebase, $const_name, $const_name); - } - - public static function setConstType( - StatementsAnalyzer $statements_analyzer, - string $const_name, - Union $const_type, - Context $context - ): void { - $context->vars_in_scope[$const_name] = $const_type; - $context->constants[$const_name] = $const_type; - - $source = $statements_analyzer->getSource(); - - if ($source instanceof NamespaceAnalyzer) { - $source->setConstType($const_name, $const_type); - } - } - - public static function getConstName( - PhpParser\Node\Expr $first_arg_value, - NodeDataProvider $type_provider, - Codebase $codebase, - Aliases $aliases - ): ?string { - $const_name = null; - - if ($first_arg_value instanceof PhpParser\Node\Scalar\String_) { - $const_name = $first_arg_value->value; - } elseif ($first_arg_type = $type_provider->getType($first_arg_value)) { - if ($first_arg_type->isSingleStringLiteral()) { - $const_name = $first_arg_type->getSingleStringLiteral()->value; - } - } else { - $simple_type = SimpleTypeInferer::infer($codebase, $type_provider, $first_arg_value, $aliases); - - if ($simple_type && $simple_type->isSingleStringLiteral()) { - $const_name = $simple_type->getSingleStringLiteral()->value; - } - } - - return $const_name; - } - - public static function analyzeConstAssignment( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Stmt\Const_ $stmt, - Context $context - ): void { - foreach ($stmt->consts as $const) { - ExpressionAnalyzer::analyze($statements_analyzer, $const->value, $context); - - self::setConstType( - $statements_analyzer, - $const->name->name, - $statements_analyzer->node_data->getType($const->value) ?? Type::getMixed(), - $context - ); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php deleted file mode 100644 index 1e258a05..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php +++ /dev/null @@ -1,482 +0,0 @@ -inside_general_use; - $context->inside_general_use = true; - - if (!$stmt->name instanceof PhpParser\Node\Identifier) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->name, $context) === false) { - return false; - } - } - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->var, $context) === false) { - $context->inside_general_use = $was_inside_general_use; - - return false; - } - - $context->inside_general_use = $was_inside_general_use; - - if ($stmt->name instanceof PhpParser\Node\Identifier) { - $prop_name = $stmt->name->name; - } elseif (($stmt_name_type = $statements_analyzer->node_data->getType($stmt->name)) - && $stmt_name_type->isSingleStringLiteral() - ) { - $prop_name = $stmt_name_type->getSingleStringLiteral()->value; - } else { - $prop_name = null; - } - - $codebase = $statements_analyzer->getCodebase(); - - $stmt_var_id = ExpressionIdentifier::getArrayVarId( - $stmt->var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $var_id = ExpressionIdentifier::getArrayVarId( - $stmt, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($var_id && $context->hasVariable($var_id)) { - self::handleScopedProperty( - $context, - $var_id, - $statements_analyzer, - $stmt, - $codebase, - $stmt_var_id, - $in_assignment - ); - - return true; - } - - if ($stmt_var_id && $context->hasVariable($stmt_var_id)) { - $stmt_var_type = $context->vars_in_scope[$stmt_var_id]; - } else { - $stmt_var_type = $statements_analyzer->node_data->getType($stmt->var); - } - - if (!$stmt_var_type) { - return true; - } - - if ($stmt_var_type->isNull()) { - if (IssueBuffer::accepts( - new NullPropertyFetch( - 'Cannot get property on null variable ' . $stmt_var_id, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - return true; - } - - if ($stmt_var_type->isEmpty()) { - if (IssueBuffer::accepts( - new MixedPropertyFetch( - 'Cannot fetch property on empty var ' . $stmt_var_id, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - return true; - } - - if ($stmt_var_type->hasMixed()) { - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - if ($stmt->name instanceof PhpParser\Node\Identifier) { - $codebase->analyzer->addMixedMemberName( - '$' . $stmt->name->name, - $context->calling_method_id ?: $statements_analyzer->getFileName() - ); - } - - IssueBuffer::maybeAdd( - new MixedPropertyFetch( - 'Cannot fetch property on mixed var ' . $stmt_var_id, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt->name, - $stmt_var_type->getId() - ); - } - } - - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getRootFilePath()); - } - - if ($stmt_var_type->isNullable() && !$stmt_var_type->ignore_nullable_issues) { - // we can only be sure that the variable is possibly null if we know the var_id - if (!$context->inside_isset - && $stmt->name instanceof PhpParser\Node\Identifier - && !MethodCallAnalyzer::hasNullsafe($stmt->var) - ) { - IssueBuffer::maybeAdd( - new PossiblyNullPropertyFetch( - rtrim('Cannot get property on possibly null variable ' . $stmt_var_id) - . ' of type ' . $stmt_var_type, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - $statements_analyzer->node_data->setType($stmt, Type::getNull()); - } - } - - if (!$prop_name) { - if ($stmt_var_type->hasObjectType() && !$context->ignore_variable_property) { - foreach ($stmt_var_type->getAtomicTypes() as $type) { - if ($type instanceof TNamedObject) { - $codebase->analyzer->addMixedMemberName( - strtolower($type->value) . '::$', - $context->calling_method_id ?: $statements_analyzer->getFileName() - ); - } - } - } - - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt->name, - $stmt_var_type->getId() - ); - } - - return true; - } - - $invalid_fetch_types = []; - $has_valid_fetch_type = false; - - $var_atomic_types = $stmt_var_type->getAtomicTypes(); - - while ($lhs_type_part = array_shift($var_atomic_types)) { - if ($lhs_type_part instanceof TTemplateParam) { - $var_atomic_types = array_merge($var_atomic_types, $lhs_type_part->as->getAtomicTypes()); - continue; - } - - AtomicPropertyFetchAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context, - $in_assignment, - $var_id, - $stmt_var_id, - $stmt_var_type, - $lhs_type_part, - $prop_name, - $has_valid_fetch_type, - $invalid_fetch_types, - $is_static_access - ); - } - - $stmt_type = $statements_analyzer->node_data->getType($stmt); - - if ($stmt_var_type->isNullable() && !$context->inside_isset && $stmt_type) { - $stmt_type->addType(new TNull); - - if ($stmt_var_type->ignore_nullable_issues) { - $stmt_type->ignore_nullable_issues = true; - } - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - && ($stmt_type = $statements_analyzer->node_data->getType($stmt)) - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt->name, - $stmt_type->getId() - ); - } - - if ($invalid_fetch_types) { - $lhs_type_part = $invalid_fetch_types[0]; - - if ($has_valid_fetch_type) { - IssueBuffer::maybeAdd( - new PossiblyInvalidPropertyFetch( - 'Cannot fetch property on possible non-object ' . $stmt_var_id . ' of type ' . $lhs_type_part, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new InvalidPropertyFetch( - 'Cannot fetch property on non-object ' . $stmt_var_id . ' of type ' . $lhs_type_part, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($var_id) { - $context->vars_in_scope[$var_id] = $statements_analyzer->node_data->getType($stmt) ?? Type::getMixed(); - } - - return true; - } - - private static function handleScopedProperty( - Context $context, - string $var_id, - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\PropertyFetch $stmt, - Codebase $codebase, - ?string $stmt_var_id, - bool $in_assignment - ): void { - $stmt_type = $context->vars_in_scope[$var_id]; - - // we don't need to check anything - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && (!(($parent_source = $statements_analyzer->getSource()) - instanceof FunctionLikeAnalyzer) - || !$parent_source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt->name, - $stmt_type->getId() - ); - } - - if ($stmt_var_id === '$this' - && !$stmt_type->initialized - && $context->collect_initializations - && ($stmt_var_type = $statements_analyzer->node_data->getType($stmt->var)) - && $stmt_var_type->hasObjectType() - && $stmt->name instanceof PhpParser\Node\Identifier - ) { - $source = $statements_analyzer->getSource(); - - $property_id = null; - - foreach ($stmt_var_type->getAtomicTypes() as $lhs_type_part) { - if ($lhs_type_part instanceof TNamedObject) { - if (!$codebase->classExists($lhs_type_part->value)) { - continue; - } - - $property_id = $lhs_type_part->value . '::$' . $stmt->name->name; - } - } - - if ($property_id - && $source instanceof FunctionLikeAnalyzer - && $source->getMethodName() === '__construct' - && !$context->inside_unset - ) { - if ($context->inside_isset - || ($context->inside_assignment - && isset($context->vars_in_scope[$var_id]) - && $context->vars_in_scope[$var_id]->isNullable() - ) - ) { - $stmt_type->initialized = true; - } else { - IssueBuffer::maybeAdd( - new UninitializedProperty( - 'Cannot use uninitialized property ' . $var_id, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $var_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - $stmt_type->addType(new TNull); - } - } - } - - - if (($stmt_var_type = $statements_analyzer->node_data->getType($stmt->var)) - && $stmt_var_type->hasObjectType() - && $stmt->name instanceof PhpParser\Node\Identifier - ) { - // log the appearance - foreach ($stmt_var_type->getAtomicTypes() as $lhs_type_part) { - if ($lhs_type_part instanceof TNamedObject) { - if (!$codebase->classExists($lhs_type_part->value)) { - continue; - } - - $property_id = $lhs_type_part->value . '::$' . $stmt->name->name; - - - $class_storage = $codebase->classlike_storage_provider->get($lhs_type_part->value); - - AtomicPropertyFetchAnalyzer::processTaints( - $statements_analyzer, - $stmt, - $stmt_type, - $property_id, - $class_storage, - $in_assignment - ); - - $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( - $property_id, - true, - $statements_analyzer - ); - - if ($declaring_property_class) { - AtomicPropertyFetchAnalyzer::checkPropertyDeprecation( - $stmt->name->name, - $declaring_property_class, - $stmt, - $statements_analyzer - ); - } - - $codebase->properties->propertyExists( - $property_id, - true, - $statements_analyzer, - $context, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer->getSource(), $stmt) - : null - ); - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->name, - $property_id - ); - } - - if (!$context->collect_mutations - && !$context->collect_initializations - && !($class_storage->external_mutation_free - && $stmt_type->allow_mutations) - ) { - if ($context->pure) { - IssueBuffer::maybeAdd( - new ImpurePropertyFetch( - 'Cannot access a property on a mutable object from a pure context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_impure = true; - } - } - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php deleted file mode 100644 index e28e3f06..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php +++ /dev/null @@ -1,486 +0,0 @@ -class instanceof PhpParser\Node\Name) { - self::analyzeVariableStaticPropertyFetch($statements_analyzer, $stmt->class, $stmt, $context); - return true; - } - - $codebase = $statements_analyzer->getCodebase(); - - if (count($stmt->class->parts) === 1 - && in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true) - ) { - if ($stmt->class->parts[0] === 'parent') { - $fq_class_name = $statements_analyzer->getParentFQCLN(); - - if ($fq_class_name === null) { - if (IssueBuffer::accepts( - new ParentNotFound( - 'Cannot check property fetch on parent as this class does not extend another', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - return true; - } - } else { - $fq_class_name = (string)$context->self; - } - - if ($context->isPhantomClass($fq_class_name)) { - return true; - } - } else { - $aliases = $statements_analyzer->getAliases(); - - if ($context->calling_method_id - && !$stmt->class instanceof PhpParser\Node\Name\FullyQualified - ) { - $codebase->file_reference_provider->addMethodReferenceToClassMember( - $context->calling_method_id, - 'use:' . $stmt->class->parts[0] . ':' . md5($statements_analyzer->getFilePath()), - false - ); - } - - $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( - $stmt->class, - $aliases - ); - - if ($context->isPhantomClass($fq_class_name)) { - return true; - } - - if ($context->check_classes) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $fq_class_name, - new CodeLocation($statements_analyzer->getSource(), $stmt->class), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues() - ) !== true) { - return false; - } - } - } - - if ($fq_class_name - && $codebase->methods_to_move - && $context->calling_method_id - && isset($codebase->methods_to_move[$context->calling_method_id]) - ) { - $destination_method_id = $codebase->methods_to_move[$context->calling_method_id]; - - $codebase->classlikes->airliftClassLikeReference( - $fq_class_name, - explode('::', $destination_method_id)[0], - $statements_analyzer->getFilePath(), - (int) $stmt->class->getAttribute('startFilePos'), - (int) $stmt->class->getAttribute('endFilePos') + 1 - ); - } - - if ($fq_class_name) { - $statements_analyzer->node_data->setType( - $stmt->class, - new Union([new TNamedObject($fq_class_name)]) - ); - } - - if ($stmt->name instanceof PhpParser\Node\VarLikeIdentifier) { - $prop_name = $stmt->name->name; - } elseif (($stmt_name_type = $statements_analyzer->node_data->getType($stmt->name)) - && $stmt_name_type->isSingleStringLiteral() - ) { - $prop_name = $stmt_name_type->getSingleStringLiteral()->value; - } else { - $prop_name = null; - } - - if (!$prop_name) { - if ($fq_class_name) { - $codebase->analyzer->addMixedMemberName( - strtolower($fq_class_name) . '::$', - $context->calling_method_id ?: $statements_analyzer->getFileName() - ); - } - - return true; - } - - if (!$fq_class_name - || !$context->check_classes - || !$context->check_variables - || ExpressionAnalyzer::isMock($fq_class_name) - ) { - return true; - } - - $var_id = ExpressionIdentifier::getVarId( - $stmt, - $context->self ?: $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - $property_id = $fq_class_name . '::$' . $prop_name; - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->name, - $property_id - ); - } - - if ($context->mutation_free) { - IssueBuffer::maybeAdd( - new ImpureStaticProperty( - 'Cannot use a static property in a mutation-free context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() - instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - - if ($var_id && $context->hasVariable($var_id)) { - $stmt_type = $context->vars_in_scope[$var_id]; - - // we don't need to check anything - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - if ($codebase->collect_references) { - // log the appearance - $codebase->properties->propertyExists( - $property_id, - true, - $statements_analyzer, - $context, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer->getSource(), $stmt) - : null - ); - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - && ($stmt_type = $statements_analyzer->node_data->getType($stmt)) - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt->name, - $stmt_type->getId() - ); - } - - return true; - } - - if (!$codebase->properties->propertyExists( - $property_id, - true, - $statements_analyzer, - $context, - $codebase->collect_locations - ? new CodeLocation($statements_analyzer->getSource(), $stmt) - : null - ) - ) { - if ($context->inside_isset) { - return true; - } - - IssueBuffer::maybeAdd( - new UndefinedPropertyFetch( - 'Static property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - - return true; - } - - $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( - $fq_class_name . '::$' . $prop_name, - true, - $statements_analyzer - ); - - if ($declaring_property_class === null) { - return false; - } - - AtomicPropertyFetchAnalyzer::checkPropertyDeprecation( - $prop_name, - $declaring_property_class, - $stmt, - $statements_analyzer - ); - - $class_storage = $codebase->classlike_storage_provider->get($declaring_property_class); - $property = $class_storage->properties[$prop_name]; - - if (!$property->is_static) { - if ($context->inside_isset) { - return true; - } - - if ($context->inside_assignment) { - IssueBuffer::maybeAdd( - new UndefinedPropertyAssignment( - 'Static property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new UndefinedPropertyFetch( - 'Static property ' . $property_id . ' is not defined', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $property_id - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - return true; - } - - if (ClassLikeAnalyzer::checkPropertyVisibility( - $property_id, - $context, - $statements_analyzer, - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues() - ) === false) { - return false; - } - - $declaring_property_id = strtolower($declaring_property_class) . '::$' . $prop_name; - - if ($codebase->alter_code) { - $moved_class = $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $stmt->class, - $fq_class_name, - $context->calling_method_id - ); - - if (!$moved_class) { - foreach ($codebase->property_transforms as $original_pattern => $transformation) { - if ($declaring_property_id === $original_pattern) { - [$old_declaring_fq_class_name] = explode('::$', $declaring_property_id); - [$new_fq_class_name, $new_property_name] = explode('::$', $transformation); - - $file_manipulations = []; - - if (strtolower($new_fq_class_name) !== $old_declaring_fq_class_name) { - $file_manipulations[] = new FileManipulation( - (int) $stmt->class->getAttribute('startFilePos'), - (int) $stmt->class->getAttribute('endFilePos') + 1, - Type::getStringFromFQCLN( - $new_fq_class_name, - $statements_analyzer->getNamespace(), - $statements_analyzer->getAliasedClassesFlipped(), - null - ) - ); - } - - $file_manipulations[] = new FileManipulation( - (int) $stmt->name->getAttribute('startFilePos'), - (int) $stmt->name->getAttribute('endFilePos') + 1, - '$' . $new_property_name - ); - - FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); - } - } - } - } - - if ($var_id) { - if ($property->type) { - $context->vars_in_scope[$var_id] = TypeExpander::expandUnion( - $codebase, - clone $property->type, - $class_storage->name, - $class_storage->name, - $class_storage->parent_class - ); - } else { - $context->vars_in_scope[$var_id] = Type::getMixed(); - } - - $stmt_type = clone $context->vars_in_scope[$var_id]; - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt->name, - $stmt_type->getId() - ); - } - } else { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } - - return true; - } - - private static function analyzeVariableStaticPropertyFetch( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $stmt_class, - PhpParser\Node\Expr\StaticPropertyFetch $stmt, - Context $context - ): void { - $was_inside_general_use = $context->inside_general_use; - - $context->inside_general_use = true; - - ExpressionAnalyzer::analyze( - $statements_analyzer, - $stmt_class, - $context - ); - - $context->inside_general_use = $was_inside_general_use; - - $stmt_class_type = $statements_analyzer->node_data->getType($stmt_class) ?? Type::getMixed(); - - $old_data_provider = $statements_analyzer->node_data; - - $stmt_type = null; - - $codebase = $statements_analyzer->getCodebase(); - - foreach ($stmt_class_type->getAtomicTypes() as $class_atomic_type) { - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $string_type = ($class_atomic_type instanceof TClassString - && $class_atomic_type->as_type !== null) - ? $class_atomic_type->as_type->value - : ($class_atomic_type instanceof TLiteralString - ? $class_atomic_type->value - : null); - - if ($string_type) { - $new_stmt_name = new VirtualFullyQualified( - $string_type, - $stmt_class->getAttributes() - ); - - $fake_static_property = new VirtualStaticPropertyFetch( - $new_stmt_name, - $stmt->name, - $stmt->getAttributes() - ); - - self::analyze($statements_analyzer, $fake_static_property, $context); - - $fake_stmt_type = $statements_analyzer->node_data->getType($fake_static_property) ?? Type::getMixed(); - } else { - $fake_var_name = '__fake_var_' . (string) $stmt->getAttribute('startFilePos'); - - $fake_var = new VirtualVariable( - $fake_var_name, - $stmt_class->getAttributes() - ); - - $context->vars_in_scope['$' . $fake_var_name] = new Union([$class_atomic_type]); - - $fake_instance_property = new VirtualPropertyFetch( - $fake_var, - $stmt->name, - $stmt->getAttributes() - ); - - InstancePropertyFetchAnalyzer::analyze( - $statements_analyzer, - $fake_instance_property, - $context, - false, - true - ); - - $fake_stmt_type = $statements_analyzer->node_data->getType($fake_instance_property) ?? Type::getMixed(); - } - - $stmt_type = $stmt_type - ? Type::combineUnionTypes($stmt_type, $fake_stmt_type, $codebase) - : $fake_stmt_type; - - $statements_analyzer->node_data = $old_data_provider; - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - } -} 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 deleted file mode 100644 index 3ecde22a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php +++ /dev/null @@ -1,559 +0,0 @@ -getFileAnalyzer()->project_analyzer; - $codebase = $statements_analyzer->getCodebase(); - - if ($stmt->name === 'this') { - if ($statements_analyzer->isStatic()) { - if (IssueBuffer::accepts( - new InvalidScope( - 'Invalid reference to $this in a static context', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - return true; - } - - if (!isset($context->vars_in_scope['$this'])) { - if (IssueBuffer::accepts( - new InvalidScope( - 'Invalid reference to $this in a non-class context', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - - $context->vars_in_scope['$this'] = Type::getMixed(); - $context->vars_possibly_in_scope['$this'] = true; - - return true; - } - - $statements_analyzer->node_data->setType($stmt, clone $context->vars_in_scope['$this']); - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - && ($stmt_type = $statements_analyzer->node_data->getType($stmt)) - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt, - $stmt_type->getId() - ); - } - - if (!$context->collect_mutations && !$context->collect_initializations) { - if ($context->pure) { - IssueBuffer::maybeAdd( - new ImpureVariable( - 'Cannot reference $this in a pure context', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_impure = true; - } - } - - return true; - } - - if (!$context->check_variables) { - if (is_string($stmt->name)) { - $var_name = '$' . $stmt->name; - - if (!$context->hasVariable($var_name)) { - $context->vars_in_scope[$var_name] = Type::getMixed(); - $context->vars_possibly_in_scope[$var_name] = true; - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } else { - $stmt_type = clone $context->vars_in_scope[$var_name]; - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - self::addDataFlowToVariable($statements_analyzer, $stmt, $var_name, $stmt_type, $context); - } - } else { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } - - return true; - } - - if (is_string($stmt->name) && self::isSuperGlobal('$' . $stmt->name)) { - $var_name = '$' . $stmt->name; - - if (isset($context->vars_in_scope[$var_name])) { - $type = clone $context->vars_in_scope[$var_name]; - - self::taintVariable($statements_analyzer, $var_name, $type, $stmt); - - $statements_analyzer->node_data->setType($stmt, $type); - - return true; - } - - $type = self::getGlobalType($var_name); - - self::taintVariable($statements_analyzer, $var_name, $type, $stmt); - - $statements_analyzer->node_data->setType($stmt, $type); - $context->vars_in_scope[$var_name] = clone $type; - $context->vars_possibly_in_scope[$var_name] = true; - - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt, - $var_name - ); - - return true; - } - - if (!is_string($stmt->name)) { - if ($context->pure) { - IssueBuffer::maybeAdd( - new ImpureVariable( - 'Cannot reference an unknown variable in a pure context', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_impure = true; - } - - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - $expr_result = ExpressionAnalyzer::analyze($statements_analyzer, $stmt->name, $context); - $context->inside_general_use = $was_inside_general_use; - - return $expr_result; - } - - if ($passed_by_reference && $by_ref_type) { - AssignmentAnalyzer::assignByRefParam( - $statements_analyzer, - $stmt, - $by_ref_type, - $by_ref_type, - $context - ); - - return true; - } - - $var_name = '$' . $stmt->name; - - if (!$context->hasVariable($var_name)) { - if (!isset($context->vars_possibly_in_scope[$var_name]) - || !$statements_analyzer->getFirstAppearance($var_name) - ) { - if ($array_assignment) { - // if we're in an array assignment, let's assign the variable - // because PHP allows it - - $context->vars_in_scope[$var_name] = Type::getArray(); - $context->vars_possibly_in_scope[$var_name] = true; - - // it might have been defined first in another if/else branch - if (!$statements_analyzer->hasVariable($var_name)) { - $statements_analyzer->registerVariable( - $var_name, - new CodeLocation($statements_analyzer, $stmt), - $context->branch_point - ); - } - } elseif (!$context->inside_isset - || $statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - ) { - if ($context->is_global || $from_global) { - IssueBuffer::maybeAdd( - new UndefinedGlobalVariable( - 'Cannot find referenced variable ' . $var_name . ' in global scope', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $var_name - ), - $statements_analyzer->getSuppressedIssues() - ); - - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - - return true; - } - - IssueBuffer::maybeAdd( - new UndefinedVariable( - 'Cannot find referenced variable ' . $var_name, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - - return true; - } - } - - $first_appearance = $statements_analyzer->getFirstAppearance($var_name); - - if ($first_appearance && !$context->inside_isset && !$context->inside_unset) { - if ($context->is_global) { - if ($codebase->alter_code) { - if (!isset($project_analyzer->getIssuesToFix()['PossiblyUndefinedGlobalVariable'])) { - return true; - } - - $branch_point = $statements_analyzer->getBranchPoint($var_name); - - if ($branch_point) { - $statements_analyzer->addVariableInitialization($var_name, $branch_point); - } - - return true; - } - - IssueBuffer::maybeAdd( - new PossiblyUndefinedGlobalVariable( - 'Possibly undefined global variable ' . $var_name . ', first seen on line ' . - $first_appearance->getLineNumber(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $var_name - ), - $statements_analyzer->getSuppressedIssues(), - (bool) $statements_analyzer->getBranchPoint($var_name) - ); - } else { - if ($codebase->alter_code) { - if (!isset($project_analyzer->getIssuesToFix()['PossiblyUndefinedVariable'])) { - return true; - } - - $branch_point = $statements_analyzer->getBranchPoint($var_name); - - if ($branch_point) { - $statements_analyzer->addVariableInitialization($var_name, $branch_point); - } - - return true; - } - - IssueBuffer::maybeAdd( - new PossiblyUndefinedVariable( - 'Possibly undefined variable ' . $var_name . ', first seen on line ' . - $first_appearance->getLineNumber(), - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues(), - (bool) $statements_analyzer->getBranchPoint($var_name) - ); - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt, - $first_appearance->raw_file_start . '-' . $first_appearance->raw_file_end . ':mixed' - ); - } - - $stmt_type = Type::getMixed(); - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - self::addDataFlowToVariable($statements_analyzer, $stmt, $var_name, $stmt_type, $context); - - $statements_analyzer->registerPossiblyUndefinedVariable($var_name, $stmt); - - return true; - } - } else { - $stmt_type = clone $context->vars_in_scope[$var_name]; - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - self::addDataFlowToVariable($statements_analyzer, $stmt, $var_name, $stmt_type, $context); - - if ($stmt_type->possibly_undefined_from_try && !$context->inside_isset) { - if ($context->is_global) { - IssueBuffer::maybeAdd( - new PossiblyUndefinedGlobalVariable( - 'Possibly undefined global variable ' . $var_name . ' defined in try block', - new CodeLocation($statements_analyzer->getSource(), $stmt), - $var_name - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new PossiblyUndefinedVariable( - 'Possibly undefined variable ' . $var_name . ' defined in try block', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeType( - $statements_analyzer->getFilePath(), - $stmt, - $stmt_type->getId() - ); - } - - if ($codebase->store_node_types - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $first_appearance = $statements_analyzer->getFirstAppearance($var_name); - - if ($first_appearance) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt, - $first_appearance->raw_file_start - . '-' . $first_appearance->raw_file_end - . ':' . $stmt_type->getId() - ); - } - } - } - - return true; - } - - private static function addDataFlowToVariable( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr\Variable $stmt, - string $var_name, - Union $stmt_type, - Context $context - ): void { - $codebase = $statements_analyzer->getCodebase(); - - if ($statements_analyzer->data_flow_graph - && $codebase->find_unused_variables - && ($context->inside_return - || $context->inside_call - || $context->inside_general_use - || $context->inside_conditional - || $context->inside_throw - || $context->inside_isset) - ) { - if (!$stmt_type->parent_nodes) { - $assignment_node = DataFlowNode::getForAssignment( - $var_name, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ); - - $stmt_type->parent_nodes = [ - $assignment_node->id => $assignment_node - ]; - } - - foreach ($stmt_type->parent_nodes as $parent_node) { - if ($context->inside_call || $context->inside_return) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - new DataFlowNode( - 'variable-use', - 'variable use', - null - ), - 'use-inside-call' - ); - } elseif ($context->inside_conditional) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - new DataFlowNode( - 'variable-use', - 'variable use', - null - ), - 'use-inside-conditional' - ); - } elseif ($context->inside_isset) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - new DataFlowNode( - 'variable-use', - 'variable use', - null - ), - 'use-inside-isset' - ); - } else { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - new DataFlowNode( - 'variable-use', - 'variable use', - null - ), - 'variable-use' - ); - } - } - } - } - - private static function taintVariable( - StatementsAnalyzer $statements_analyzer, - string $var_name, - Union $type, - PhpParser\Node\Expr\Variable $stmt - ): void { - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - if ($var_name === '$_GET' - || $var_name === '$_POST' - || $var_name === '$_COOKIE' - || $var_name === '$_REQUEST' - ) { - $taint_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - $server_taint_source = new TaintSource( - $var_name . ':' . $taint_location->file_name . ':' . $taint_location->raw_file_start, - $var_name, - null, - null, - TaintKindGroup::ALL_INPUT - ); - - $statements_analyzer->data_flow_graph->addSource($server_taint_source); - - $type->parent_nodes = [ - $server_taint_source->id => $server_taint_source - ]; - } - } - } - - /** - * @psalm-pure - */ - public static function isSuperGlobal(string $var_id): bool - { - return in_array( - $var_id, - self::SUPER_GLOBALS, - true - ); - } - - public static function getGlobalType(string $var_id): Union - { - $config = Config::getInstance(); - - if (isset($config->globals[$var_id])) { - return Type::parseString($config->globals[$var_id]); - } - - if ($var_id === '$argv') { - return new Union([ - new TArray([Type::getInt(), Type::getString()]), - ]); - } - - if ($var_id === '$argc') { - return Type::getInt(); - } - - if ($var_id === '$http_response_header') { - return new Union([ - new TList(Type::getString()) - ]); - } - - if (self::isSuperGlobal($var_id)) { - $type = Type::getArray(); - if ($var_id === '$_SESSION') { - $type->possibly_undefined = true; - } - return $type; - } - - return Type::getMixed(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php deleted file mode 100644 index 38f9a9a3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php +++ /dev/null @@ -1,138 +0,0 @@ -inside_assignment; - $context->inside_assignment = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->var, $context) === false) { - $context->inside_assignment = $was_inside_assignment; - - return false; - } - - $context->inside_assignment = $was_inside_assignment; - - $stmt_var_type = $statements_analyzer->node_data->getType($stmt->var); - - if ($stmt instanceof PostInc || $stmt instanceof PostDec) { - $statements_analyzer->node_data->setType($stmt, $stmt_var_type ?? Type::getMixed()); - } - - if (($stmt_var_type = $statements_analyzer->node_data->getType($stmt->var)) - && $stmt_var_type->hasString() - && ($stmt instanceof PostInc || $stmt instanceof PreInc) - ) { - $return_type = null; - - $fake_right_expr = new VirtualLNumber(1, $stmt->getAttributes()); - $statements_analyzer->node_data->setType($fake_right_expr, Type::getInt()); - - ArithmeticOpAnalyzer::analyze( - $statements_analyzer, - $statements_analyzer->node_data, - $stmt->var, - $fake_right_expr, - $stmt, - $return_type, - $context - ); - - $result_type = $return_type ?? Type::getMixed(); - $statements_analyzer->node_data->setType($stmt, $result_type); - - BinaryOpAnalyzer::addDataFlow( - $statements_analyzer, - $stmt, - $stmt->var, - $fake_right_expr, - 'inc' - ); - - $var_id = ExpressionIdentifier::getArrayVarId($stmt->var, null); - - $codebase = $statements_analyzer->getCodebase(); - - if ($var_id && isset($context->vars_in_scope[$var_id])) { - $context->vars_in_scope[$var_id] = $result_type; - - if ($codebase->find_unused_variables && $stmt->var instanceof PhpParser\Node\Expr\Variable) { - $context->assigned_var_ids[$var_id] = (int) $stmt->var->getAttribute('startFilePos'); - $context->possibly_assigned_var_ids[$var_id] = true; - } - - // removes dependent vars from $context - $context->removeDescendents( - $var_id, - $context->vars_in_scope[$var_id], - $return_type, - $statements_analyzer - ); - } - } else { - $fake_right_expr = new VirtualLNumber(1, $stmt->getAttributes()); - - $operation = $stmt instanceof PostInc || $stmt instanceof PreInc - ? new VirtualPlus( - $stmt->var, - $fake_right_expr, - $stmt->var->getAttributes() - ) - : new VirtualMinus( - $stmt->var, - $fake_right_expr, - $stmt->var->getAttributes() - ); - - $fake_assignment = new VirtualAssign( - $stmt->var, - $operation, - $stmt->getAttributes() - ); - - $old_node_data = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $fake_assignment, $context) === false) { - return false; - } - - if ($stmt instanceof PreInc || $stmt instanceof PreDec) { - $old_node_data->setType( - $stmt, - $statements_analyzer->node_data->getType($operation) ?? Type::getMixed() - ); - } - - $statements_analyzer->node_data = $old_node_data; - } - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php deleted file mode 100644 index 9fd4f163..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php +++ /dev/null @@ -1,423 +0,0 @@ -getCodebase(); - $config = $codebase->config; - - if (!$config->allow_includes) { - throw new FileIncludeException( - 'File includes are not allowed per your Psalm config - check the allowFileIncludes flag.' - ); - } - - $was_inside_call = $context->inside_call; - - $context->inside_call = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - $context->inside_call = $was_inside_call; - - return false; - } - - $context->inside_call = $was_inside_call; - - $stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr); - - if ($stmt->expr instanceof PhpParser\Node\Scalar\String_ - || ($stmt_expr_type && $stmt_expr_type->isSingleStringLiteral()) - ) { - if ($stmt->expr instanceof PhpParser\Node\Scalar\String_) { - $path_to_file = $stmt->expr->value; - } else { - $path_to_file = $stmt_expr_type->getSingleStringLiteral()->value; - } - - $path_to_file = str_replace('/', DIRECTORY_SEPARATOR, $path_to_file); - - // attempts to resolve using get_include_path dirs - $include_path = self::resolveIncludePath($path_to_file, dirname($statements_analyzer->getFilePath())); - $path_to_file = $include_path ?: $path_to_file; - - if (DIRECTORY_SEPARATOR === '/') { - $is_path_relative = $path_to_file[0] !== DIRECTORY_SEPARATOR; - } else { - $is_path_relative = !preg_match('~^[A-Z]:\\\\~i', $path_to_file); - } - - if ($is_path_relative) { - $path_to_file = $config->base_dir . DIRECTORY_SEPARATOR . $path_to_file; - } - } else { - $path_to_file = self::getPathTo( - $stmt->expr, - $statements_analyzer->node_data, - $statements_analyzer, - $statements_analyzer->getFileName(), - $config - ); - } - - if ($stmt_expr_type - && $statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && $stmt_expr_type->parent_nodes - && !in_array('TaintedInput', $statements_analyzer->getSuppressedIssues()) - ) { - $arg_location = new CodeLocation($statements_analyzer->getSource(), $stmt->expr); - - $include_param_sink = TaintSink::getForMethodArgument( - 'include', - 'include', - 0, - $arg_location, - $arg_location - ); - - $include_param_sink->taints = [TaintKind::INPUT_INCLUDE]; - - $statements_analyzer->data_flow_graph->addSink($include_param_sink); - - $codebase = $statements_analyzer->getCodebase(); - $event = new AddRemoveTaintsEvent($stmt, $context, $statements_analyzer, $codebase); - - $added_taints = $codebase->config->eventDispatcher->dispatchAddTaints($event); - $removed_taints = $codebase->config->eventDispatcher->dispatchRemoveTaints($event); - - foreach ($stmt_expr_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $include_param_sink, - 'arg', - $added_taints, - $removed_taints - ); - } - } - - if ($path_to_file) { - $path_to_file = self::normalizeFilePath($path_to_file); - - // if the file is already included, we can't check much more - if (in_array(realpath($path_to_file), get_included_files(), true)) { - return true; - } - - $current_file_analyzer = $statements_analyzer->getFileAnalyzer(); - - if ($current_file_analyzer->project_analyzer->fileExists($path_to_file)) { - if ($statements_analyzer->hasParentFilePath($path_to_file) - || !$codebase->file_storage_provider->has($path_to_file) - || ($statements_analyzer->hasAlreadyRequiredFilePath($path_to_file) - && !$codebase->file_storage_provider->get($path_to_file)->has_extra_statements) - ) { - return true; - } - if ($config->mustBeIgnored($path_to_file)) { - return true; - } - - $current_file_analyzer->addRequiredFilePath($path_to_file); - - $file_name = $config->shortenFileName($path_to_file); - - $nesting = $statements_analyzer->getRequireNesting() + 1; - $current_file_analyzer->project_analyzer->progress->debug( - str_repeat(' ', $nesting) . 'checking ' . $file_name . PHP_EOL - ); - - $include_file_analyzer = new FileAnalyzer( - $current_file_analyzer->project_analyzer, - $path_to_file, - $file_name - ); - - $include_file_analyzer->setRootFilePath( - $current_file_analyzer->getRootFilePath(), - $current_file_analyzer->getRootFileName() - ); - - $include_file_analyzer->addParentFilePath($current_file_analyzer->getFilePath()); - $include_file_analyzer->addRequiredFilePath($current_file_analyzer->getFilePath()); - - foreach ($current_file_analyzer->getRequiredFilePaths() as $required_file_path) { - $include_file_analyzer->addRequiredFilePath($required_file_path); - } - - foreach ($current_file_analyzer->getParentFilePaths() as $parent_file_path) { - $include_file_analyzer->addParentFilePath($parent_file_path); - } - - try { - $include_file_analyzer->analyze( - $context, - $global_context - ); - } catch (UnpreparedAnalysisException $e) { - if ($config->skip_checks_on_unresolvable_includes) { - $context->check_classes = false; - $context->check_variables = false; - $context->check_functions = false; - } - } - - $included_return_type = $include_file_analyzer->getReturnType(); - - if ($included_return_type) { - $statements_analyzer->node_data->setType($stmt, $included_return_type); - } - - $context->has_returned = false; - - foreach ($include_file_analyzer->getRequiredFilePaths() as $required_file_path) { - $current_file_analyzer->addRequiredFilePath($required_file_path); - } - - $include_file_analyzer->clearSourceBeforeDestruction(); - - return true; - } - - $source = $statements_analyzer->getSource(); - - IssueBuffer::maybeAdd( - new MissingFile( - 'Cannot find file ' . $path_to_file . ' to include', - new CodeLocation($source, $stmt) - ), - $source->getSuppressedIssues() - ); - } else { - $var_id = ExpressionIdentifier::getArrayVarId($stmt->expr, null); - - if (!$var_id || !isset($context->phantom_files[$var_id])) { - $source = $statements_analyzer->getSource(); - - IssueBuffer::maybeAdd( - new UnresolvableInclude( - 'Cannot resolve the given expression to a file path', - new CodeLocation($source, $stmt) - ), - $source->getSuppressedIssues() - ); - } - } - - if ($config->skip_checks_on_unresolvable_includes) { - $context->check_classes = false; - $context->check_variables = false; - $context->check_functions = false; - } - - return true; - } - - /** - * @psalm-suppress MixedAssignment - */ - public static function getPathTo( - PhpParser\Node\Expr $stmt, - ?NodeDataProvider $type_provider, - ?StatementsAnalyzer $statements_analyzer, - string $file_name, - Config $config - ): ?string { - if (DIRECTORY_SEPARATOR === '/') { - $is_path_relative = $file_name[0] !== DIRECTORY_SEPARATOR; - } else { - $is_path_relative = !preg_match('~^[A-Z]:\\\\~i', $file_name); - } - - if ($is_path_relative) { - $file_name = $config->base_dir . DIRECTORY_SEPARATOR . $file_name; - } - - if ($stmt instanceof PhpParser\Node\Scalar\String_) { - if (DIRECTORY_SEPARATOR !== '/') { - return str_replace('/', DIRECTORY_SEPARATOR, $stmt->value); - } - return $stmt->value; - } - - $stmt_type = $type_provider ? $type_provider->getType($stmt) : null; - - if ($stmt_type && $stmt_type->isSingleStringLiteral()) { - if (DIRECTORY_SEPARATOR !== '/') { - return str_replace( - '/', - DIRECTORY_SEPARATOR, - $stmt_type->getSingleStringLiteral()->value - ); - } - - return $stmt_type->getSingleStringLiteral()->value; - } - - if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) { - if ($stmt->var instanceof PhpParser\Node\Expr\Variable - && $stmt->var->name === 'GLOBALS' - && $stmt->dim instanceof PhpParser\Node\Scalar\String_ - ) { - if (isset($GLOBALS[$stmt->dim->value]) && is_string($GLOBALS[$stmt->dim->value])) { - /** @var string */ - return $GLOBALS[$stmt->dim->value]; - } - } - } elseif ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat) { - $left_string = self::getPathTo($stmt->left, $type_provider, $statements_analyzer, $file_name, $config); - $right_string = self::getPathTo($stmt->right, $type_provider, $statements_analyzer, $file_name, $config); - - if ($left_string && $right_string) { - return $left_string . $right_string; - } - } elseif ($stmt instanceof PhpParser\Node\Expr\FuncCall && - $stmt->name instanceof PhpParser\Node\Name && - $stmt->name->parts === ['dirname'] - ) { - if ($stmt->getArgs()) { - $dir_level = 1; - - if (isset($stmt->getArgs()[1])) { - if ($stmt->getArgs()[1]->value instanceof PhpParser\Node\Scalar\LNumber) { - $dir_level = $stmt->getArgs()[1]->value->value; - } else { - return null; - } - } - - $evaled_path = self::getPathTo( - $stmt->getArgs()[0]->value, - $type_provider, - $statements_analyzer, - $file_name, - $config - ); - - if (!$evaled_path) { - return null; - } - - return dirname($evaled_path, $dir_level); - } - } elseif ($stmt instanceof PhpParser\Node\Expr\ConstFetch) { - $const_name = implode('', $stmt->name->parts); - - if (defined($const_name)) { - $constant_value = constant($const_name); - - if (is_string($constant_value)) { - return $constant_value; - } - } - } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Dir) { - return dirname($file_name); - } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\File) { - return $file_name; - } - - return null; - } - - public static function resolveIncludePath(string $file_name, string $current_directory): ?string - { - if (!$current_directory) { - return $file_name; - } - - $paths = PATH_SEPARATOR === ':' - ? preg_split('#(?inside_general_use; - $context->inside_general_use = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - $context->inside_general_use = $was_inside_general_use; - - return false; - } - - $context->inside_general_use = $was_inside_general_use; - - if ($stmt->class instanceof PhpParser\Node\Expr) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->class, $context) === false) { - return false; - } - } elseif (!in_array(strtolower($stmt->class->parts[0]), ['self', 'static', 'parent'], true)) { - if ($context->check_classes) { - $codebase = $statements_analyzer->getCodebase(); - - $fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( - $stmt->class, - $statements_analyzer->getAliases() - ); - - if ($codebase->store_node_types - && $fq_class_name - && !$context->collect_initializations - && !$context->collect_mutations - ) { - $codebase->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $stmt->class, - $codebase->classlikes->classOrInterfaceOrEnumExists($fq_class_name) - ? $fq_class_name - : '*' - . ($stmt->class instanceof PhpParser\Node\Name\FullyQualified - ? '\\' - : $statements_analyzer->getNamespace() . '-') - . implode('\\', $stmt->class->parts) - ); - } - - if (!isset($context->phantom_classes[strtolower($fq_class_name)])) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $fq_class_name, - new CodeLocation($statements_analyzer->getSource(), $stmt->class), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues() - ) === false) { - return false; - } - } - - if ($codebase->alter_code) { - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $stmt->class, - $fq_class_name, - $context->calling_method_id - ); - } - } - } - - $statements_analyzer->node_data->setType($stmt, Type::getBool()); - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php deleted file mode 100644 index 40f33819..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php +++ /dev/null @@ -1,49 +0,0 @@ -vars as $isset_var) { - if ($isset_var instanceof PhpParser\Node\Expr\PropertyFetch - && $isset_var->var instanceof PhpParser\Node\Expr\Variable - && $isset_var->var->name === 'this' - && $isset_var->name instanceof PhpParser\Node\Identifier - ) { - $var_id = '$this->' . $isset_var->name->name; - - if (!isset($context->vars_in_scope[$var_id])) { - $context->vars_in_scope[$var_id] = Type::getMixed(); - $context->vars_possibly_in_scope[$var_id] = true; - } - } - - self::analyzeIssetVar($statements_analyzer, $isset_var, $context); - } - - $statements_analyzer->node_data->setType($stmt, Type::getBool()); - } - - public static function analyzeIssetVar( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $stmt, - Context $context - ): void { - $context->inside_isset = true; - - ExpressionAnalyzer::analyze($statements_analyzer, $stmt, $context); - - $context->inside_isset = false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php deleted file mode 100644 index 481a5afa..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php +++ /dev/null @@ -1,107 +0,0 @@ -node_data->setType($stmt, Type::getInt()); - } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Class_) { - $codebase = $statements_analyzer->getCodebase(); - - if (!$context->self) { - IssueBuffer::maybeAdd( - new UndefinedConstant( - 'Cannot get __class__ outside a class', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - $statements_analyzer->node_data->setType($stmt, Type::getClassString()); - } else { - if ($codebase->alter_code) { - $codebase->classlikes->handleClassLikeReferenceInMigration( - $codebase, - $statements_analyzer, - $stmt, - $context->self, - $context->calling_method_id - ); - } - - $statements_analyzer->node_data->setType($stmt, Type::getLiteralClassString($context->self)); - } - } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Namespace_) { - $namespace = $statements_analyzer->getNamespace(); - if ($namespace === null - && IssueBuffer::accepts( - new UndefinedConstant( - 'Cannot get __namespace__ outside a namespace', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ) - ) { - // fall through - } - - $statements_analyzer->node_data->setType($stmt, Type::getString($namespace)); - } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Method - || $stmt instanceof PhpParser\Node\Scalar\MagicConst\Function_ - ) { - $source = $statements_analyzer->getSource(); - if ($source instanceof MethodAnalyzer) { - if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Function_) { - $statements_analyzer->node_data->setType($stmt, Type::getString($source->getMethodName())); - } else { - $statements_analyzer->node_data->setType( - $stmt, - Type::getString($source->getCorrectlyCasedMethodId()) - ); - } - } elseif ($source instanceof FunctionAnalyzer) { - $statements_analyzer->node_data->setType($stmt, Type::getString($source->getCorrectlyCasedMethodId())); - } else { - $statements_analyzer->node_data->setType($stmt, new Union([new TCallableString])); - } - } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Dir) { - $statements_analyzer->node_data->setType( - $stmt, - Type::getString(dirname($statements_analyzer->getSource()->getFilePath())) - ); - } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\File) { - $statements_analyzer->node_data->setType( - $stmt, - Type::getString($statements_analyzer->getSource()->getFilePath()) - ); - } elseif ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Trait_) { - if ($statements_analyzer->getSource() instanceof TraitAnalyzer) { - $statements_analyzer->node_data->setType($stmt, new Union([new TNonEmptyString()])); - } else { - $statements_analyzer->node_data->setType($stmt, Type::getString()); - } - } - } -} 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 deleted file mode 100644 index 139fde07..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php +++ /dev/null @@ -1,351 +0,0 @@ -inside_call; - - $context->inside_call = true; - - $was_inside_conditional = $context->inside_conditional; - - $context->inside_conditional = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->cond, $context) === false) { - $context->inside_conditional = $was_inside_conditional; - - return false; - } - - $context->inside_conditional = $was_inside_conditional; - - $switch_var_id = ExpressionIdentifier::getArrayVarId( - $stmt->cond, - null, - $statements_analyzer - ); - - $match_condition = $stmt->cond; - - if (!$switch_var_id) { - if ($stmt->cond instanceof PhpParser\Node\Expr\FuncCall - && $stmt->cond->name instanceof PhpParser\Node\Name - && ($stmt->cond->name->parts === ['get_class'] - || $stmt->cond->name->parts === ['gettype'] - || $stmt->cond->name->parts === ['get_debug_type']) - && $stmt->cond->getArgs() - ) { - $first_arg = $stmt->cond->getArgs()[0]; - - if (!$first_arg->value instanceof PhpParser\Node\Expr\Variable) { - $switch_var_id = '$__tmp_switch__' . (int) $first_arg->value->getAttribute('startFilePos'); - - $condition_type = $statements_analyzer->node_data->getType($first_arg->value) ?? Type::getMixed(); - - $context->vars_in_scope[$switch_var_id] = $condition_type; - - $match_condition = new VirtualFuncCall( - $stmt->cond->name, - [ - new VirtualArg( - new VirtualVariable( - substr($switch_var_id, 1), - $first_arg->value->getAttributes() - ), - false, - false, - $first_arg->getAttributes() - ) - ], - $stmt->cond->getAttributes() - ); - } - } elseif ($stmt->cond instanceof PhpParser\Node\Expr\FuncCall - || $stmt->cond instanceof PhpParser\Node\Expr\MethodCall - || $stmt->cond instanceof PhpParser\Node\Expr\StaticCall - ) { - $switch_var_id = '$__tmp_switch__' . (int) $stmt->cond->getAttribute('startFilePos'); - - $condition_type = $statements_analyzer->node_data->getType($stmt->cond) ?? Type::getMixed(); - - $context->vars_in_scope[$switch_var_id] = $condition_type; - - $match_condition = new VirtualVariable( - substr($switch_var_id, 1), - $stmt->cond->getAttributes() - ); - } - } - - $arms = $stmt->arms; - - foreach ($arms as $i => $arm) { - // move default to the end - if ($arm->conds === null) { - unset($arms[$i]); - $arms[] = $arm; - } - } - - $arms = array_reverse($arms); - - $last_arm = array_shift($arms); - - if (!$last_arm) { - IssueBuffer::maybeAdd( - new UnhandledMatchCondition( - 'This match expression does not match anything', - new CodeLocation($statements_analyzer->getSource(), $match_condition) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return false; - } - - $old_node_data = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - if (!$last_arm->conds) { - $ternary = $last_arm->body; - } else { - $ternary = new VirtualTernary( - self::convertCondsToConditional($last_arm->conds, $match_condition, $last_arm->getAttributes()), - $last_arm->body, - new VirtualThrow( - new VirtualNew( - new VirtualFullyQualified( - 'UnhandledMatchError', - $stmt->getAttributes() - ), - [], - $stmt->getAttributes() - ) - ), - $stmt->getAttributes() - ); - } - - foreach ($arms as $arm) { - if (!$arm->conds) { - continue; - } - - $ternary = new VirtualTernary( - self::convertCondsToConditional($arm->conds, $match_condition, $arm->getAttributes()), - $arm->body, - $ternary, - $arm->getAttributes() - ); - } - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('RedundantCondition', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['RedundantCondition']); - } - - if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['RedundantConditionGivenDocblockType']); - } - - if (ExpressionAnalyzer::analyze($statements_analyzer, $ternary, $context) === false) { - return false; - } - - if (!in_array('RedundantCondition', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['RedundantCondition']); - } - - if (!in_array('RedundantConditionGivenDocblockType', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['RedundantConditionGivenDocblockType']); - } - - if ($switch_var_id && $last_arm->conds) { - $codebase = $statements_analyzer->getCodebase(); - - $all_conds = $last_arm->conds; - - foreach ($arms as $arm) { - if (!$arm->conds) { - throw new UnexpectedValueException('bad'); - } - - $all_conds = array_merge($arm->conds, $all_conds); - } - - $all_match_condition = self::convertCondsToConditional( - $all_conds, - $match_condition, - $match_condition->getAttributes() - ); - - ExpressionAnalyzer::analyze($statements_analyzer, $all_match_condition, $context); - - $clauses = FormulaGenerator::getFormula( - spl_object_id($all_match_condition), - spl_object_id($all_match_condition), - $all_match_condition, - $context->self, - $statements_analyzer, - $codebase, - false, - false - ); - - $reconcilable_types = Algebra::getTruthsFromFormula( - Algebra::negateFormula($clauses) - ); - - // if the if has an || in the conditional, we cannot easily reason about it - if ($reconcilable_types) { - $changed_var_ids = []; - - $vars_in_scope_reconciled = Reconciler::reconcileKeyedTypes( - $reconcilable_types, - [], - $context->vars_in_scope, - $changed_var_ids, - [], - $statements_analyzer, - [], - $context->inside_loop, - null - ); - - if (isset($vars_in_scope_reconciled[$switch_var_id])) { - $array_literal_types = array_filter( - $vars_in_scope_reconciled[$switch_var_id]->getAtomicTypes(), - function ($type) { - return $type instanceof TLiteralInt - || $type instanceof TLiteralString - || $type instanceof TLiteralFloat - || $type instanceof TEnumCase; - } - ); - - if ($array_literal_types) { - IssueBuffer::maybeAdd( - new UnhandledMatchCondition( - 'This match expression is not exhaustive - consider values ' - . $vars_in_scope_reconciled[$switch_var_id]->getId(), - new CodeLocation($statements_analyzer->getSource(), $match_condition) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - } - - $stmt_expr_type = $statements_analyzer->node_data->getType($ternary); - - $old_node_data->setType($stmt, $stmt_expr_type ?? Type::getMixed()); - - $statements_analyzer->node_data = $old_node_data; - - $context->inside_call = $was_inside_call; - - return true; - } - - /** - * @param non-empty-list $conds - */ - private static function convertCondsToConditional( - array $conds, - PhpParser\Node\Expr $match_condition, - array $attributes - ): PhpParser\Node\Expr { - if (count($conds) === 1) { - return new VirtualIdentical( - $match_condition, - $conds[0], - $attributes - ); - } - - $array_items = array_map( - function ($cond): PhpParser\Node\Expr\ArrayItem { - return new VirtualArrayItem($cond, null, false, $cond->getAttributes()); - }, - $conds - ); - - return new VirtualFuncCall( - new VirtualFullyQualified(['in_array']), - [ - new VirtualArg( - $match_condition, - false, - false, - $attributes - ), - new VirtualArg( - new VirtualArray( - $array_items, - $attributes - ), - false, - false, - $attributes - ), - new VirtualArg( - new VirtualConstFetch( - new VirtualFullyQualified(['true']), - $attributes - ), - false, - false, - $attributes - ), - ], - $attributes - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php deleted file mode 100644 index c1d49922..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php +++ /dev/null @@ -1,98 +0,0 @@ -var instanceof PhpParser\Node\Expr\Variable) { - $was_inside_general_use = $context->inside_general_use; - - $context->inside_general_use = true; - ExpressionAnalyzer::analyze($statements_analyzer, $stmt->var, $context); - $context->inside_general_use = $was_inside_general_use; - - $tmp_name = '__tmp_nullsafe__' . (int) $stmt->var->getAttribute('startFilePos'); - - $condition_type = $statements_analyzer->node_data->getType($stmt->var); - - if ($condition_type) { - $context->vars_in_scope['$' . $tmp_name] = $condition_type; - - $tmp_var = new VirtualVariable($tmp_name, $stmt->var->getAttributes()); - } else { - $tmp_var = $stmt->var; - } - } else { - $tmp_var = $stmt->var; - } - - $old_node_data = $statements_analyzer->node_data; - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $null_value1 = new VirtualConstFetch( - new VirtualName('null'), - $stmt->var->getAttributes() - ); - - $null_comparison = new VirtualIdentical( - $tmp_var, - $null_value1, - $stmt->var->getAttributes() - ); - - $null_value2 = new VirtualConstFetch( - new VirtualName('null'), - $stmt->var->getAttributes() - ); - - if ($stmt instanceof PhpParser\Node\Expr\NullsafePropertyFetch) { - $ternary = new VirtualTernary( - $null_comparison, - $null_value2, - new VirtualPropertyFetch($tmp_var, $stmt->name, $stmt->getAttributes()), - $stmt->getAttributes() - ); - } else { - $ternary = new VirtualTernary( - $null_comparison, - $null_value2, - new VirtualMethodCall($tmp_var, $stmt->name, $stmt->args, $stmt->getAttributes()), - $stmt->getAttributes() - ); - } - - ExpressionAnalyzer::analyze($statements_analyzer, $ternary, $context); - - $ternary_type = $statements_analyzer->node_data->getType($ternary); - - $statements_analyzer->node_data = $old_node_data; - - $statements_analyzer->node_data->setType($stmt, $ternary_type ?? Type::getMixed()); - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php deleted file mode 100644 index b65193ab..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php +++ /dev/null @@ -1,109 +0,0 @@ -getCodebase(); - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - return false; - } - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { - $call_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - $print_param_sink = TaintSink::getForMethodArgument( - 'print', - 'print', - 0, - null, - $call_location - ); - - $print_param_sink->taints = [ - TaintKind::INPUT_HTML, - TaintKind::INPUT_HAS_QUOTES, - TaintKind::USER_SECRET, - TaintKind::SYSTEM_SECRET - ]; - - $statements_analyzer->data_flow_graph->addSink($print_param_sink); - } - - if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { - if (ArgumentAnalyzer::verifyType( - $statements_analyzer, - $stmt_expr_type, - Type::getString(), - null, - 'print', - null, - 0, - new CodeLocation($statements_analyzer->getSource(), $stmt->expr), - $stmt->expr, - $context, - new FunctionLikeParameter('var', false), - false, - null, - true, - true, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ) === false) { - return false; - } - } - - if (isset($codebase->config->forbidden_functions['print'])) { - IssueBuffer::maybeAdd( - new ForbiddenCode( - 'You have forbidden the use of print', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (!$context->collect_initializations && !$context->collect_mutations) { - if ($context->mutation_free || $context->external_mutation_free) { - IssueBuffer::maybeAdd( - new ImpureFunctionCall( - 'Cannot call print from a mutation-free context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } elseif ($statements_analyzer->getSource() instanceof FunctionLikeAnalyzer - && $statements_analyzer->getSource()->track_mutations - ) { - $statements_analyzer->getSource()->inferred_has_mutation = true; - $statements_analyzer->getSource()->inferred_impure = true; - } - } - - $statements_analyzer->node_data->setType($stmt, Type::getInt(false, 1)); - - return true; - } -} 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 deleted file mode 100644 index 081d0cf2..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php +++ /dev/null @@ -1,760 +0,0 @@ - $existing_class_constants - */ - public static function infer( - Codebase $codebase, - NodeDataProvider $nodes, - PhpParser\Node\Expr $stmt, - Aliases $aliases, - FileSource $file_source = null, - ?array $existing_class_constants = null, - ?string $fq_classlike_name = null - ): ?Union { - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) { - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat) { - $left = self::infer( - $codebase, - $nodes, - $stmt->left, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - $right = self::infer( - $codebase, - $nodes, - $stmt->right, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - - if ($left - && $right - ) { - if ($left->isSingleStringLiteral() - && $right->isSingleStringLiteral() - ) { - $result = $left->getSingleStringLiteral()->value . $right->getSingleStringLiteral()->value; - - return Type::getString($result); - } - - if ($left->isSingle() && $left->getSingleAtomic() instanceof TNonEmptyString) { - return new Union([new TNonEmptyString()]); - } - - if ($right->isSingle() && $right->getSingleAtomic() instanceof TNonEmptyString) { - return new Union([new TNonEmptyString()]); - } - } - - return Type::getString(); - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalAnd - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\LogicalOr - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Equal - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotEqual - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Identical - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\NotIdentical - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Greater - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Smaller - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual - ) { - return Type::getBool(); - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Coalesce) { - return null; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Spaceship) { - return new Union( - [ - new TLiteralInt(-1), - new TLiteralInt(0), - new TLiteralInt(1) - ] - ); - } - - $stmt_left_type = self::infer( - $codebase, - $nodes, - $stmt->left, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - - $stmt_right_type = self::infer( - $codebase, - $nodes, - $stmt->right, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - - if (!$stmt_left_type || !$stmt_right_type) { - return null; - } - - $nodes->setType( - $stmt->left, - $stmt_left_type - ); - - $nodes->setType( - $stmt->right, - $stmt_right_type - ); - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Plus - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Minus - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Mod - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Mul - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\Pow - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\ShiftRight - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\ShiftLeft - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr - || $stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd - ) { - ArithmeticOpAnalyzer::analyze( - $file_source instanceof StatementsSource ? $file_source : null, - $nodes, - $stmt->left, - $stmt->right, - $stmt, - $result_type - ); - - if ($result_type) { - return $result_type; - } - - return null; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Div - && ($stmt_left_type->hasInt() || $stmt_left_type->hasFloat()) - && ($stmt_right_type->hasInt() || $stmt_right_type->hasFloat()) - ) { - return Type::combineUnionTypes(Type::getFloat(), Type::getInt()); - } - } - - if ($stmt instanceof PhpParser\Node\Expr\ConstFetch) { - $name = strtolower($stmt->name->parts[0]); - if ($name === 'false') { - return Type::getFalse(); - } - - if ($name === 'true') { - return Type::getTrue(); - } - - if ($name === 'null') { - return Type::getNull(); - } - - if ($stmt->name->parts[0] === '__NAMESPACE__') { - return Type::getString($aliases->namespace); - } - - return null; - } - - if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Dir - || $stmt instanceof PhpParser\Node\Scalar\MagicConst\File - ) { - return new Union([new TNonEmptyString()]); - } - - if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Line) { - return Type::getInt(); - } - - if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Class_ - || $stmt instanceof PhpParser\Node\Scalar\MagicConst\Method - || $stmt instanceof PhpParser\Node\Scalar\MagicConst\Trait_ - || $stmt instanceof PhpParser\Node\Scalar\MagicConst\Function_ - ) { - return Type::getString(); - } - - if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Namespace_) { - return Type::getString($aliases->namespace); - } - - if ($stmt instanceof PhpParser\Node\Expr\ClassConstFetch) { - if ($stmt->class instanceof PhpParser\Node\Name - && $stmt->name instanceof PhpParser\Node\Identifier - && $fq_classlike_name - && $stmt->class->parts !== ['static'] - && $stmt->class->parts !== ['parent'] - ) { - if (isset($existing_class_constants[$stmt->name->name]) - && $existing_class_constants[$stmt->name->name]->type - ) { - if ($stmt->class->parts === ['self']) { - return clone $existing_class_constants[$stmt->name->name]->type; - } - } - - if ($stmt->class->parts === ['self']) { - $const_fq_class_name = $fq_classlike_name; - } else { - $const_fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( - $stmt->class, - $aliases - ); - } - - if (strtolower($const_fq_class_name) === strtolower($fq_classlike_name) - && isset($existing_class_constants[$stmt->name->name]) - && $existing_class_constants[$stmt->name->name]->type - ) { - return clone $existing_class_constants[$stmt->name->name]->type; - } - - if (strtolower($stmt->name->name) === 'class') { - return Type::getLiteralClassString($const_fq_class_name, true); - } - - if ($existing_class_constants === null - && $file_source instanceof StatementsAnalyzer - ) { - try { - $foreign_class_constant = $codebase->classlikes->getClassConstantType( - $const_fq_class_name, - $stmt->name->name, - ReflectionProperty::IS_PRIVATE, - $file_source - ); - - if ($foreign_class_constant) { - return clone $foreign_class_constant; - } - - return null; - } catch (InvalidArgumentException | CircularReferenceException $e) { - return null; - } - } - } - - if ($stmt->name instanceof PhpParser\Node\Identifier && strtolower($stmt->name->name) === 'class') { - return Type::getClassString(); - } - - return null; - } - - if ($stmt instanceof PhpParser\Node\Scalar\String_) { - return Type::getString($stmt->value); - } - - if ($stmt instanceof PhpParser\Node\Scalar\LNumber) { - return Type::getInt(false, $stmt->value); - } - - if ($stmt instanceof PhpParser\Node\Scalar\DNumber) { - return Type::getFloat($stmt->value); - } - - if ($stmt instanceof PhpParser\Node\Expr\Array_) { - return self::inferArrayType( - $codebase, - $nodes, - $stmt, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\Int_) { - return Type::getInt(); - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\Double) { - return Type::getFloat(); - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\Bool_) { - return Type::getBool(); - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\String_) { - return Type::getString(); - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\Object_) { - return Type::getObject(); - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast\Array_) { - return Type::getArray(); - } - - if ($stmt instanceof PhpParser\Node\Expr\UnaryMinus || $stmt instanceof PhpParser\Node\Expr\UnaryPlus) { - $type_to_invert = self::infer( - $codebase, - $nodes, - $stmt->expr, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - - if (!$type_to_invert) { - return null; - } - - foreach ($type_to_invert->getAtomicTypes() as $type_part) { - if ($type_part instanceof TLiteralInt - && $stmt instanceof PhpParser\Node\Expr\UnaryMinus - ) { - $type_part->value = -$type_part->value; - } elseif ($type_part instanceof TLiteralFloat - && $stmt instanceof PhpParser\Node\Expr\UnaryMinus - ) { - $type_part->value = -$type_part->value; - } - } - - return $type_to_invert; - } - - if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) { - if ($stmt->var instanceof PhpParser\Node\Expr\ClassConstFetch - && $stmt->dim - ) { - $array_type = self::infer( - $codebase, - $nodes, - $stmt->var, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - - $dim_type = self::infer( - $codebase, - $nodes, - $stmt->dim, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - - if ($array_type !== null && $dim_type !== null) { - if ($dim_type->isSingleStringLiteral()) { - $dim_value = $dim_type->getSingleStringLiteral()->value; - } elseif ($dim_type->isSingleIntLiteral()) { - $dim_value = $dim_type->getSingleIntLiteral()->value; - } else { - return null; - } - - foreach ($array_type->getAtomicTypes() as $array_atomic_type) { - if ($array_atomic_type instanceof TKeyedArray) { - if (isset($array_atomic_type->properties[$dim_value])) { - return clone $array_atomic_type->properties[$dim_value]; - } - - return null; - } - } - } - } - } - - if ($stmt instanceof PhpParser\Node\Expr\New_) { - $resolved_class_name = $stmt->class->getAttribute('resolvedName'); - - if (!is_string($resolved_class_name)) { - return null; - } - - return new Union([ - new Type\Atomic\TNamedObject($resolved_class_name) - ]); - } - - return null; - } - - /** - * @param ?array $existing_class_constants - */ - private static function inferArrayType( - Codebase $codebase, - NodeDataProvider $nodes, - PhpParser\Node\Expr\Array_ $stmt, - Aliases $aliases, - FileSource $file_source = null, - ?array $existing_class_constants = null, - ?string $fq_classlike_name = null - ): ?Union { - if (count($stmt->items) === 0) { - return Type::getEmptyArray(); - } - - $array_creation_info = new ArrayCreationInfo(); - - foreach ($stmt->items as $item) { - if ($item === null) { - continue; - } - - if (!self::handleArrayItem( - $codebase, - $nodes, - $array_creation_info, - $item, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - )) { - return null; - } - } - - $item_key_type = null; - if ($array_creation_info->item_key_atomic_types) { - $item_key_type = TypeCombiner::combine( - $array_creation_info->item_key_atomic_types, - null, - false, - true, - 30 - ); - } - - $item_value_type = null; - if ($array_creation_info->item_value_atomic_types) { - $item_value_type = TypeCombiner::combine( - $array_creation_info->item_value_atomic_types, - null, - false, - true, - 30 - ); - } - - // if this array looks like an object-like array, let's return that instead - if ($item_value_type - && $item_key_type - && ($item_key_type->hasString() || $item_key_type->hasInt()) - && $array_creation_info->can_create_objectlike - && $array_creation_info->property_types - ) { - $objectlike = new TKeyedArray( - $array_creation_info->property_types, - $array_creation_info->class_strings - ); - $objectlike->sealed = true; - $objectlike->is_list = $array_creation_info->all_list; - return new Union([$objectlike]); - } - - if (!$item_key_type || !$item_value_type) { - return null; - } - - if ($array_creation_info->all_list) { - return new Union([ - new TNonEmptyList($item_value_type), - ]); - } - - return new Union([ - new TNonEmptyArray([ - $item_key_type, - $item_value_type, - ]), - ]); - } - - /** - * @param ?array $existing_class_constants - */ - private static function handleArrayItem( - Codebase $codebase, - NodeDataProvider $nodes, - ArrayCreationInfo $array_creation_info, - PhpParser\Node\Expr\ArrayItem $item, - Aliases $aliases, - FileSource $file_source = null, - ?array $existing_class_constants = null, - ?string $fq_classlike_name = null - ): bool { - if ($item->unpack) { - $unpacked_array_type = self::infer( - $codebase, - $nodes, - $item->value, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - - if (!$unpacked_array_type) { - return false; - } - - return self::handleUnpackedArray($array_creation_info, $unpacked_array_type); - } - - $single_item_key_type = null; - $item_is_list_item = false; - $item_key_value = null; - - if ($item->key) { - $single_item_key_type = self::infer( - $codebase, - $nodes, - $item->key, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - - if ($single_item_key_type) { - $key_type = $single_item_key_type; - if ($key_type->isNull()) { - $key_type = Type::getString(''); - } - if ($item->key instanceof PhpParser\Node\Scalar\String_ - && preg_match('/^(0|[1-9][0-9]*)$/', $item->key->value) - && ( - (int) $item->key->value < PHP_INT_MAX || - $item->key->value === (string) PHP_INT_MAX - ) - ) { - $key_type = Type::getInt(false, (int) $item->key->value); - } - - $array_creation_info->item_key_atomic_types = array_merge( - $array_creation_info->item_key_atomic_types, - array_values($key_type->getAtomicTypes()) - ); - - if ($key_type->isSingleStringLiteral()) { - $item_key_literal_type = $key_type->getSingleStringLiteral(); - $item_key_value = $item_key_literal_type->value; - - if ($item_key_literal_type instanceof TLiteralClassString) { - $array_creation_info->class_strings[$item_key_value] = true; - } - } elseif ($key_type->isSingleIntLiteral()) { - $item_key_value = $key_type->getSingleIntLiteral()->value; - - if ($item_key_value >= $array_creation_info->int_offset) { - if ($item_key_value === $array_creation_info->int_offset) { - $item_is_list_item = true; - } - $array_creation_info->int_offset = $item_key_value + 1; - } - } - } - } else { - $item_is_list_item = true; - $item_key_value = $array_creation_info->int_offset++; - $array_creation_info->item_key_atomic_types[] = new TLiteralInt($item_key_value); - } - - $single_item_value_type = self::infer( - $codebase, - $nodes, - $item->value, - $aliases, - $file_source, - $existing_class_constants, - $fq_classlike_name - ); - - if (!$single_item_value_type) { - return false; - } - - $config = $codebase->config; - - $array_creation_info->all_list = $array_creation_info->all_list && $item_is_list_item; - - if ($item->key instanceof PhpParser\Node\Scalar\String_ - || $item->key instanceof PhpParser\Node\Scalar\LNumber - || !$item->key - ) { - if ($item_key_value !== null - && count($array_creation_info->property_types) <= $config->max_shaped_array_size - ) { - $array_creation_info->property_types[$item_key_value] = $single_item_value_type; - } else { - $array_creation_info->can_create_objectlike = false; - } - } else { - $dim_type = $single_item_key_type; - - if (!$dim_type) { - return false; - } - - if (count($dim_type->getAtomicTypes()) > 1 - || $dim_type->hasMixed() - || count($array_creation_info->property_types) > $config->max_shaped_array_size - ) { - $array_creation_info->can_create_objectlike = false; - } else { - $atomic_type = $dim_type->getSingleAtomic(); - - if ($atomic_type instanceof TLiteralInt - || $atomic_type instanceof TLiteralString - ) { - if ($atomic_type instanceof TLiteralClassString) { - $array_creation_info->class_strings[$atomic_type->value] = true; - } - - $array_creation_info->property_types[$atomic_type->value] = $single_item_value_type; - } else { - $array_creation_info->can_create_objectlike = false; - } - } - } - - $array_creation_info->item_value_atomic_types = array_merge( - $array_creation_info->item_value_atomic_types, - array_values($single_item_value_type->getAtomicTypes()) - ); - - return true; - } - - private static function handleUnpackedArray( - ArrayCreationInfo $array_creation_info, - Union $unpacked_array_type - ): bool { - foreach ($unpacked_array_type->getAtomicTypes() as $unpacked_atomic_type) { - if ($unpacked_atomic_type instanceof TKeyedArray) { - 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); - } else { - $new_offset = $array_creation_info->int_offset++; - $array_creation_info->item_key_atomic_types[] = new TLiteralInt($new_offset); - } - - $array_creation_info->item_value_atomic_types = array_merge( - $array_creation_info->item_value_atomic_types, - array_values($property_value->getAtomicTypes()) - ); - - $array_creation_info->array_keys[$new_offset] = true; - $array_creation_info->property_types[$new_offset] = $property_value; - } - } elseif ($unpacked_atomic_type instanceof TArray) { - if ($unpacked_atomic_type->type_params[1]->isEmpty()) { - continue; - } - $array_creation_info->can_create_objectlike = false; - - if ($unpacked_atomic_type->type_params[0]->hasString()) { - $array_creation_info->item_key_atomic_types[] = new TString(); - } - - if ($unpacked_atomic_type->type_params[0]->hasInt()) { - $array_creation_info->item_key_atomic_types[] = new TInt(); - } - - $array_creation_info->item_value_atomic_types = array_merge( - $array_creation_info->item_value_atomic_types, - array_values( - isset($unpacked_atomic_type->type_params[1]) - ? $unpacked_atomic_type->type_params[1]->getAtomicTypes() - : [new TMixed()] - ) - ); - } elseif ($unpacked_atomic_type instanceof TList) { - if ($unpacked_atomic_type->type_param->isEmpty()) { - continue; - } - $array_creation_info->can_create_objectlike = false; - - $array_creation_info->item_key_atomic_types[] = new TInt(); - - $array_creation_info->item_value_atomic_types = array_merge( - $array_creation_info->item_value_atomic_types, - array_values($unpacked_atomic_type->type_param->getAtomicTypes()) - ); - } - } - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php deleted file mode 100644 index 872c7346..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php +++ /dev/null @@ -1,306 +0,0 @@ -getCodebase(); - - $if_scope = new IfScope(); - - try { - $if_conditional_scope = IfConditionalAnalyzer::analyze( - $statements_analyzer, - $stmt->cond, - $context, - $codebase, - $if_scope, - $context->branch_point ?: (int) $stmt->getAttribute('startFilePos') - ); - - $if_context = $if_conditional_scope->if_context; - - $cond_referenced_var_ids = $if_conditional_scope->cond_referenced_var_ids; - $assigned_in_conditional_var_ids = $if_conditional_scope->assigned_in_conditional_var_ids; - } catch (ScopeAnalysisException $e) { - return false; - } - - $codebase = $statements_analyzer->getCodebase(); - - $cond_id = spl_object_id($stmt->cond); - - $if_clauses = FormulaGenerator::getFormula( - $cond_id, - $cond_id, - $stmt->cond, - $context->self, - $statements_analyzer, - $codebase - ); - - $mixed_var_ids = []; - - foreach ($context->vars_in_scope as $var_id => $type) { - if ($type->hasMixed()) { - $mixed_var_ids[] = $var_id; - } - } - - foreach ($context->vars_possibly_in_scope as $var_id => $_) { - if (!isset($context->vars_in_scope[$var_id])) { - $mixed_var_ids[] = $var_id; - } - } - - $if_clauses = array_map( - /** - * @return Clause - */ - function (Clause $c) use ($mixed_var_ids, $cond_id): Clause { - $keys = array_keys($c->possibilities); - - $mixed_var_ids = array_diff($mixed_var_ids, $keys); - - foreach ($keys as $key) { - foreach ($mixed_var_ids as $mixed_var_id) { - if (preg_match('/^' . preg_quote($mixed_var_id, '/') . '(\[|-)/', $key)) { - return new Clause([], $cond_id, $cond_id, true); - } - } - } - - return $c; - }, - $if_clauses - ); - - // this will see whether any of the clauses in set A conflict with the clauses in set B - AlgebraAnalyzer::checkForParadox( - $context->clauses, - $if_clauses, - $statements_analyzer, - $stmt->cond, - $assigned_in_conditional_var_ids - ); - - $ternary_clauses = array_merge($context->clauses, $if_clauses); - - if ($if_context->reconciled_expression_clauses) { - $reconciled_expression_clauses = $if_context->reconciled_expression_clauses; - - $ternary_clauses = array_values( - array_filter( - $ternary_clauses, - function ($c) use ($reconciled_expression_clauses): bool { - return !in_array($c->hash, $reconciled_expression_clauses); - } - ) - ); - } - - $ternary_clauses = Algebra::simplifyCNF($ternary_clauses); - - $negated_clauses = Algebra::negateFormula($if_clauses); - - $negated_if_types = Algebra::getTruthsFromFormula( - Algebra::simplifyCNF( - array_merge($context->clauses, $negated_clauses) - ) - ); - - $active_if_types = []; - - $reconcilable_if_types = Algebra::getTruthsFromFormula( - $ternary_clauses, - $cond_id, - $cond_referenced_var_ids, - $active_if_types - ); - - $changed_var_ids = []; - - if ($reconcilable_if_types) { - $if_vars_in_scope_reconciled = Reconciler::reconcileKeyedTypes( - $reconcilable_if_types, - $active_if_types, - $if_context->vars_in_scope, - $changed_var_ids, - $cond_referenced_var_ids, - $statements_analyzer, - $statements_analyzer->getTemplateTypeMap() ?: [], - $if_context->inside_loop, - new CodeLocation($statements_analyzer->getSource(), $stmt->cond) - ); - - $if_context->vars_in_scope = $if_vars_in_scope_reconciled; - } - - $t_else_context = clone $context; - - if ($stmt->if) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->if, $if_context) === false) { - return false; - } - - $context->referenced_var_ids = array_merge( - $context->referenced_var_ids, - $if_context->referenced_var_ids - ); - } - - $t_else_context->clauses = Algebra::simplifyCNF( - array_merge( - $t_else_context->clauses, - $negated_clauses - ) - ); - - if ($negated_if_types) { - $changed_var_ids = []; - - $t_else_vars_in_scope_reconciled = Reconciler::reconcileKeyedTypes( - $negated_if_types, - $negated_if_types, - $t_else_context->vars_in_scope, - $changed_var_ids, - $cond_referenced_var_ids, - $statements_analyzer, - $statements_analyzer->getTemplateTypeMap() ?: [], - $t_else_context->inside_loop, - new CodeLocation($statements_analyzer->getSource(), $stmt->else) - ); - - $t_else_context->vars_in_scope = $t_else_vars_in_scope_reconciled; - - $t_else_context->clauses = Context::removeReconciledClauses($t_else_context->clauses, $changed_var_ids)[0]; - } - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->else, $t_else_context) === false) { - return false; - } - - $assign_var_ifs = $if_context->assigned_var_ids; - $assign_var_else = $t_else_context->assigned_var_ids; - $assign_all = array_intersect_key($assign_var_ifs, $assign_var_else); - - //if the same var was assigned in both branches - foreach ($assign_all as $var_id => $_) { - if (isset($if_context->vars_in_scope[$var_id]) && isset($t_else_context->vars_in_scope[$var_id])) { - $context->vars_in_scope[$var_id] = Type::combineUnionTypes( - $if_context->vars_in_scope[$var_id], - $t_else_context->vars_in_scope[$var_id] - ); - } - } - - $redef_var_ifs = array_keys($if_context->getRedefinedVars($context->vars_in_scope)); - $redef_var_else = array_keys($t_else_context->getRedefinedVars($context->vars_in_scope)); - $redef_all = array_intersect($redef_var_ifs, $redef_var_else); - - //these vars were changed in both branches - foreach ($redef_all as $redef_var_id) { - $context->vars_in_scope[$redef_var_id] = Type::combineUnionTypes( - $if_context->vars_in_scope[$redef_var_id], - $t_else_context->vars_in_scope[$redef_var_id] - ); - } - - //these vars were changed in the if and existed before - foreach ($redef_var_ifs as $redef_var_ifs_id) { - if (isset($context->vars_in_scope[$redef_var_ifs_id])) { - $context->vars_in_scope[$redef_var_ifs_id] = Type::combineUnionTypes( - $context->vars_in_scope[$redef_var_ifs_id], - $if_context->vars_in_scope[$redef_var_ifs_id] - ); - } - } - - //these vars were changed in the else and existed before - foreach ($redef_var_else as $redef_var_else_id) { - if (isset($context->vars_in_scope[$redef_var_else_id])) { - $context->vars_in_scope[$redef_var_else_id] = Type::combineUnionTypes( - $context->vars_in_scope[$redef_var_else_id], - $t_else_context->vars_in_scope[$redef_var_else_id] - ); - } - } - - $context->vars_possibly_in_scope = array_merge( - $context->vars_possibly_in_scope, - $if_context->vars_possibly_in_scope, - $t_else_context->vars_possibly_in_scope - ); - - $context->referenced_var_ids = array_merge( - $context->referenced_var_ids, - $t_else_context->referenced_var_ids - ); - - $lhs_type = null; - - if ($stmt->if) { - if ($stmt_if_type = $statements_analyzer->node_data->getType($stmt->if)) { - $lhs_type = $stmt_if_type; - } - } elseif ($stmt_cond_type = $statements_analyzer->node_data->getType($stmt->cond)) { - $if_return_type_reconciled = AssertionReconciler::reconcile( - '!falsy', - clone $stmt_cond_type, - '', - $statements_analyzer, - $context->inside_loop, - [], - new CodeLocation($statements_analyzer->getSource(), $stmt), - $statements_analyzer->getSuppressedIssues() - ); - - $lhs_type = $if_return_type_reconciled; - } - - if ($lhs_type && ($stmt_else_type = $statements_analyzer->node_data->getType($stmt->else))) { - $statements_analyzer->node_data->setType($stmt, Type::combineUnionTypes($lhs_type, $stmt_else_type)); - } else { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } - - return true; - } -} 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 deleted file mode 100644 index 17485447..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php +++ /dev/null @@ -1,134 +0,0 @@ -expr, $context) === false) { - return false; - } - - if (!($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr))) { - $statements_analyzer->node_data->setType($stmt, new Union([new TInt, new TFloat])); - } elseif ($stmt_expr_type->isMixed()) { - $statements_analyzer->node_data->setType($stmt, Type::getMixed()); - } else { - $acceptable_types = []; - - foreach ($stmt_expr_type->getAtomicTypes() as $type_part) { - if ($type_part instanceof TInt || $type_part instanceof TFloat) { - if ($type_part instanceof TLiteralInt - && $stmt instanceof PhpParser\Node\Expr\UnaryMinus - ) { - $type_part->value = -$type_part->value; - } elseif ($type_part instanceof TLiteralFloat - && $stmt instanceof PhpParser\Node\Expr\UnaryMinus - ) { - $type_part->value = -$type_part->value; - } - - if ($type_part instanceof TIntRange - && $stmt instanceof PhpParser\Node\Expr\UnaryMinus - ) { - //we'll have to inverse min and max bound and negate any literal - $old_min_bound = $type_part->min_bound; - $old_max_bound = $type_part->max_bound; - if ($old_min_bound === null) { - //min bound is null, max bound will be null - $type_part->max_bound = null; - } elseif ($old_min_bound === 0) { - $type_part->max_bound = 0; - } else { - $type_part->max_bound = -$old_min_bound; - } - - if ($old_max_bound === null) { - //max bound is null, min bound will be null - $type_part->min_bound = null; - } elseif ($old_max_bound === 0) { - $type_part->min_bound = 0; - } else { - $type_part->min_bound = -$old_max_bound; - } - } - - if ($type_part instanceof TPositiveInt - && $stmt instanceof PhpParser\Node\Expr\UnaryMinus - ) { - $type_part = new TIntRange(null, -1); - } - - $acceptable_types[] = $type_part; - } elseif ($type_part instanceof TString) { - $acceptable_types[] = new TInt; - $acceptable_types[] = new TFloat; - } else { - $acceptable_types[] = new TInt; - } - } - - $statements_analyzer->node_data->setType($stmt, new Union($acceptable_types)); - } - - self::addDataFlow( - $statements_analyzer, - $stmt, - $stmt->expr, - $stmt instanceof UnaryMinus ? 'unary-minus' : 'unary-plus' - ); - - return true; - } - - private static function addDataFlow( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $stmt, - PhpParser\Node\Expr $value, - string $type - ): void { - $result_type = $statements_analyzer->node_data->getType($stmt); - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph && $result_type) { - $var_location = new CodeLocation($statements_analyzer, $stmt); - - $stmt_value_type = $statements_analyzer->node_data->getType($value); - - $new_parent_node = DataFlowNode::getForAssignment($type, $var_location); - $statements_analyzer->data_flow_graph->addNode($new_parent_node); - $result_type->parent_nodes = [ - $new_parent_node->id => $new_parent_node, - ]; - - if ($stmt_value_type && $stmt_value_type->parent_nodes) { - foreach ($stmt_value_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath($parent_node, $new_parent_node, $type); - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php deleted file mode 100644 index d539c3ef..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php +++ /dev/null @@ -1,219 +0,0 @@ -getDocComment(); - - $var_comments = []; - $var_comment_type = null; - - $codebase = $statements_analyzer->getCodebase(); - - if ($doc_comment) { - try { - $var_comments = CommentAnalyzer::getTypeFromComment( - $doc_comment, - $statements_analyzer, - $statements_analyzer->getAliases() - ); - } catch (DocblockParseException $e) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $e->getMessage(), - new CodeLocation($statements_analyzer->getSource(), $stmt) - ) - ); - } - - foreach ($var_comments as $var_comment) { - if (!$var_comment->type) { - continue; - } - - $comment_type = TypeExpander::expandUnion( - $codebase, - $var_comment->type, - $context->self, - $context->self ? new TNamedObject($context->self) : null, - $statements_analyzer->getParentFQCLN() - ); - - $type_location = null; - - if ($var_comment->type_start - && $var_comment->type_end - && $var_comment->line_number - ) { - $type_location = new DocblockTypeLocation( - $statements_analyzer, - $var_comment->type_start, - $var_comment->type_end, - $var_comment->line_number - ); - } - - if (!$var_comment->var_id) { - $var_comment_type = $comment_type; - continue; - } - - if ($codebase->find_unused_variables - && $type_location - && isset($context->vars_in_scope[$var_comment->var_id]) - && $context->vars_in_scope[$var_comment->var_id]->getId() === $comment_type->getId() - ) { - $project_analyzer = $statements_analyzer->getProjectAnalyzer(); - - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['UnnecessaryVarAnnotation']) - ) { - FileManipulationBuffer::addVarAnnotationToRemove($type_location); - } elseif (IssueBuffer::accepts( - new UnnecessaryVarAnnotation( - 'The @var annotation for ' . $var_comment->var_id . ' is unnecessary', - $type_location - ), - $statements_analyzer->getSuppressedIssues(), - true - )) { - // fall through - } - } - - if (isset($context->vars_in_scope[$var_comment->var_id])) { - $comment_type->parent_nodes = $context->vars_in_scope[$var_comment->var_id]->parent_nodes; - } - - $context->vars_in_scope[$var_comment->var_id] = $comment_type; - } - } - - if ($stmt->key) { - $context->inside_call = true; - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->key, $context) === false) { - return false; - } - $context->inside_call = false; - } - - if ($stmt->value) { - $context->inside_call = true; - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->value, $context) === false) { - return false; - } - $context->inside_call = false; - - if ($var_comment_type) { - $expression_type = clone $var_comment_type; - } elseif ($stmt_var_type = $statements_analyzer->node_data->getType($stmt->value)) { - $expression_type = clone $stmt_var_type; - } else { - $expression_type = Type::getMixed(); - } - } else { - $expression_type = Type::getEmpty(); - } - - $yield_type = null; - - foreach ($expression_type->getAtomicTypes() as $expression_atomic_type) { - if ($expression_atomic_type instanceof TNamedObject) { - if (!$codebase->classlikes->classOrInterfaceExists($expression_atomic_type->value)) { - continue; - } - - $classlike_storage = $codebase->classlike_storage_provider->get($expression_atomic_type->value); - - if ($classlike_storage->yield) { - if ($expression_atomic_type instanceof TGenericObject) { - $yield_candidate_type = AtomicPropertyFetchAnalyzer::localizePropertyType( - $codebase, - clone $classlike_storage->yield, - $expression_atomic_type, - $classlike_storage, - $classlike_storage - ); - - $yield_type = Type::combineUnionTypes( - $yield_type, - $yield_candidate_type, - $codebase - ); - } else { - $yield_type = Type::getMixed(); - } - } - } - } - - if ($yield_type) { - $expression_type->substitute($expression_type, $yield_type); - } - - $statements_analyzer->node_data->setType($stmt, $expression_type); - - $source = $statements_analyzer->getSource(); - - if ($source instanceof FunctionLikeAnalyzer - && !($source->getSource() instanceof TraitAnalyzer) - ) { - $source->examineParamTypes($statements_analyzer, $context, $codebase, $stmt); - - $storage = $source->getFunctionLikeStorage($statements_analyzer); - - if ($storage->return_type && !$yield_type) { - foreach ($storage->return_type->getAtomicTypes() as $atomic_return_type) { - if ($atomic_return_type instanceof TNamedObject - && $atomic_return_type->value === 'Generator' - ) { - if ($atomic_return_type instanceof TGenericObject) { - if (!$atomic_return_type->type_params[2]->isVoid()) { - $statements_analyzer->node_data->setType( - $stmt, - clone $atomic_return_type->type_params[2] - ); - } - } else { - $statements_analyzer->node_data->setType( - $stmt, - Type::combineUnionTypes( - Type::getMixed(), - $expression_type - ) - ); - } - } - } - } - } - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php deleted file mode 100644 index f9c03c41..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php +++ /dev/null @@ -1,82 +0,0 @@ -inside_call; - - $context->inside_call = true; - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - $context->inside_call = $was_inside_call; - - return false; - } - - if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { - $key_type = null; - $value_type = null; - $always_non_empty_array = true; - if (ForeachAnalyzer::checkIteratorType( - $statements_analyzer, - $stmt, - $stmt->expr, - $stmt_expr_type, - $statements_analyzer->getCodebase(), - $context, - $key_type, - $value_type, - $always_non_empty_array - ) === false - ) { - $context->inside_call = $was_inside_call; - - return false; - } - - $yield_from_type = null; - - foreach ($stmt_expr_type->getAtomicTypes() as $atomic_type) { - if ($yield_from_type === null) { - if ($atomic_type instanceof TGenericObject - && strtolower($atomic_type->value) === 'generator' - && isset($atomic_type->type_params[3]) - ) { - $yield_from_type = clone $atomic_type->type_params[3]; - } elseif ($atomic_type instanceof TArray) { - $yield_from_type = clone $atomic_type->type_params[1]; - } elseif ($atomic_type instanceof TKeyedArray) { - $yield_from_type = $atomic_type->getGenericValueType(); - } - } else { - $yield_from_type = Type::getMixed(); - } - } - - // this should be whatever the generator above returns, but *not* the return type - $statements_analyzer->node_data->setType($stmt, $yield_from_type ?: Type::getMixed()); - } - - $context->inside_call = $was_inside_call; - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php deleted file mode 100644 index 0ce2af83..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php +++ /dev/null @@ -1,514 +0,0 @@ -getCodebase(); - - if (self::handleExpression( - $statements_analyzer, - $stmt, - $context, - $array_assignment, - $global_context, - $from_stmt - ) === false - ) { - return false; - } - - if (!$context->inside_conditional - && ($stmt instanceof PhpParser\Node\Expr\BinaryOp - || $stmt instanceof PhpParser\Node\Expr\Instanceof_ - || $stmt instanceof PhpParser\Node\Expr\Assign - || $stmt instanceof PhpParser\Node\Expr\BooleanNot - || $stmt instanceof PhpParser\Node\Expr\Empty_ - || $stmt instanceof PhpParser\Node\Expr\Isset_ - || $stmt instanceof PhpParser\Node\Expr\FuncCall) - ) { - $assertions = $statements_analyzer->node_data->getAssertions($stmt); - - if ($assertions === null) { - $negate = $context->inside_negation; - - while ($stmt instanceof PhpParser\Node\Expr\BooleanNot) { - $stmt = $stmt->expr; - $negate = !$negate; - } - - AssertionFinder::scrapeAssertions( - $stmt, - $context->self, - $statements_analyzer, - $codebase, - $negate, - true, - false - ); - } - } - - $event = new AfterExpressionAnalysisEvent( - $stmt, - $context, - $statements_analyzer, - $codebase, - [] - ); - - if ($codebase->config->eventDispatcher->dispatchAfterExpressionAnalysis($event) === false) { - return false; - } - - $file_manipulations = $event->getFileReplacements(); - - if ($file_manipulations) { - FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); - } - - return true; - } - - private static function handleExpression( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $stmt, - Context $context, - bool $array_assignment, - ?Context $global_context, - bool $from_stmt - ): bool { - if ($stmt instanceof PhpParser\Node\Expr\Variable) { - return VariableFetchAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context, - false, - null, - $array_assignment - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\Assign) { - $assignment_type = AssignmentAnalyzer::analyze( - $statements_analyzer, - $stmt->var, - $stmt->expr, - null, - $context, - $stmt->getDocComment() - ); - - if ($assignment_type === false) { - return false; - } - - if (!$from_stmt) { - $statements_analyzer->node_data->setType($stmt, $assignment_type); - } - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\AssignOp) { - return AssignmentAnalyzer::analyzeAssignmentOperation($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\MethodCall) { - return MethodCallAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\StaticCall) { - return StaticCallAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\ConstFetch) { - ConstFetchAnalyzer::analyze($statements_analyzer, $stmt, $context); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Scalar\String_) { - $statements_analyzer->node_data->setType($stmt, Type::getString($stmt->value)); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Scalar\EncapsedStringPart) { - return true; - } - - if ($stmt instanceof PhpParser\Node\Scalar\MagicConst) { - MagicConstAnalyzer::analyze($statements_analyzer, $stmt, $context); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Scalar\LNumber) { - $statements_analyzer->node_data->setType($stmt, Type::getInt(false, $stmt->value)); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Scalar\DNumber) { - $statements_analyzer->node_data->setType($stmt, Type::getFloat($stmt->value)); - - return true; - } - - - if ($stmt instanceof PhpParser\Node\Expr\UnaryMinus || $stmt instanceof PhpParser\Node\Expr\UnaryPlus) { - return UnaryPlusMinusAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\Isset_) { - IssetAnalyzer::analyze($statements_analyzer, $stmt, $context); - $statements_analyzer->node_data->setType($stmt, Type::getBool()); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\ClassConstFetch) { - return ClassConstFetchAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\PropertyFetch) { - return InstancePropertyFetchAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context, - $array_assignment - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\StaticPropertyFetch) { - return StaticPropertyFetchAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\BitwiseNot) { - return BitwiseNotAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) { - return BinaryOpAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context, - 0, - $from_stmt - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\PostInc - || $stmt instanceof PhpParser\Node\Expr\PostDec - || $stmt instanceof PhpParser\Node\Expr\PreInc - || $stmt instanceof PhpParser\Node\Expr\PreDec - ) { - return IncDecExpressionAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\New_) { - return NewAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\Array_) { - return ArrayAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Scalar\Encapsed) { - return EncapsulatedStringAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\FuncCall) { - return FunctionCallAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\Ternary) { - return TernaryAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\BooleanNot) { - return BooleanNotAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\Empty_) { - EmptyAnalyzer::analyze($statements_analyzer, $stmt, $context); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\Closure - || $stmt instanceof PhpParser\Node\Expr\ArrowFunction - ) { - return ClosureAnalyzer::analyzeExpression($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) { - return ArrayFetchAnalyzer::analyze( - $statements_analyzer, - $stmt, - $context - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\Cast) { - return CastAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\Clone_) { - return CloneAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\Instanceof_) { - return InstanceofAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\Exit_) { - return ExitAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\Include_) { - return IncludeAnalyzer::analyze($statements_analyzer, $stmt, $context, $global_context); - } - - if ($stmt instanceof PhpParser\Node\Expr\Eval_) { - EvalAnalyzer::analyze($statements_analyzer, $stmt, $context); - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\AssignRef) { - return AssignmentAnalyzer::analyzeAssignmentRef($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\ErrorSuppress) { - $context->error_suppressing = true; - if (self::analyze($statements_analyzer, $stmt->expr, $context) === false) { - return false; - } - $context->error_suppressing = false; - - $expr_type = $statements_analyzer->node_data->getType($stmt->expr); - - if ($expr_type) { - $statements_analyzer->node_data->setType($stmt, $expr_type); - } - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\ShellExec) { - if ($statements_analyzer->data_flow_graph) { - $call_location = new CodeLocation($statements_analyzer->getSource(), $stmt); - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { - $sink = TaintSink::getForMethodArgument( - 'shell_exec', - 'shell_exec', - 0, - null, - $call_location - ); - - $sink->taints = [TaintKind::INPUT_SHELL]; - - $statements_analyzer->data_flow_graph->addSink($sink); - } - - foreach ($stmt->parts as $part) { - if ($part instanceof PhpParser\Node\Expr\Variable) { - if (self::analyze($statements_analyzer, $part, $context) === false) { - break; - } - - $expr_type = $statements_analyzer->node_data->getType($part); - if ($expr_type === null) { - break; - } - - $shell_exec_param = new FunctionLikeParameter( - 'var', - false - ); - - if (ArgumentAnalyzer::verifyType( - $statements_analyzer, - $expr_type, - Type::getString(), - null, - 'shell_exec', - null, - 0, - $call_location, - $stmt, - $context, - $shell_exec_param, - false, - null, - true, - true, - new CodeLocation($statements_analyzer, $stmt) - ) === false) { - return false; - } - - foreach ($expr_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - new DataFlowNode('variable-use', 'variable use', null), - 'variable-use' - ); - } - } - } - } - - IssueBuffer::maybeAdd( - new ForbiddenCode( - 'Use of shell_exec', - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\Print_) { - $was_inside_call = $context->inside_call; - $context->inside_call = true; - if (PrintAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { - $context->inside_call = $was_inside_call; - - return false; - } - $context->inside_call = $was_inside_call; - - return true; - } - - if ($stmt instanceof PhpParser\Node\Expr\Yield_) { - return YieldAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\YieldFrom) { - return YieldFromAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - $php_major_version = $statements_analyzer->getCodebase()->php_major_version; - $php_minor_version = $statements_analyzer->getCodebase()->php_minor_version; - - if ($stmt instanceof PhpParser\Node\Expr\Match_ && $php_major_version >= 8) { - return MatchAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\Throw_ && $php_major_version >= 8) { - return ThrowAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if (($stmt instanceof PhpParser\Node\Expr\NullsafePropertyFetch - || $stmt instanceof PhpParser\Node\Expr\NullsafeMethodCall) - && $php_major_version >= 8 - ) { - return NullsafeAnalyzer::analyze($statements_analyzer, $stmt, $context); - } - - if ($stmt instanceof PhpParser\Node\Expr\Error) { - // do nothing - return true; - } - - if (IssueBuffer::accepts( - new UnrecognizedExpression( - 'Psalm does not understand ' . get_class($stmt) . ' for PHP ' . - $php_major_version . ' ' . $php_minor_version, - new CodeLocation($statements_analyzer->getSource(), $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - // fall through - } - - return false; - } - - public static function isMock(string $fq_class_name): bool - { - return in_array(strtolower($fq_class_name), Config::getInstance()->getMockClasses(), true); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php deleted file mode 100644 index c716bc2b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php +++ /dev/null @@ -1,83 +0,0 @@ -collect_initializations && !$global_context) { - IssueBuffer::maybeAdd( - new InvalidGlobal( - 'Cannot use global scope here', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSource()->getSuppressedIssues() - ); - } - - $source = $statements_analyzer->getSource(); - $function_storage = $source instanceof FunctionLikeAnalyzer - ? $source->getFunctionLikeStorage($statements_analyzer) - : null; - - foreach ($stmt->vars as $var) { - if ($var instanceof PhpParser\Node\Expr\Variable) { - if (is_string($var->name)) { - $var_id = '$' . $var->name; - - if ($var->name === 'argv' || $var->name === 'argc') { - $context->vars_in_scope[$var_id] = VariableFetchAnalyzer::getGlobalType($var_id); - } elseif (isset($function_storage->global_types[$var_id])) { - $context->vars_in_scope[$var_id] = clone $function_storage->global_types[$var_id]; - $context->vars_possibly_in_scope[$var_id] = true; - } else { - $context->vars_in_scope[$var_id] = - $global_context && $global_context->hasVariable($var_id) - ? clone $global_context->vars_in_scope[$var_id] - : VariableFetchAnalyzer::getGlobalType($var_id); - - $context->vars_possibly_in_scope[$var_id] = true; - - $context->byref_constraints[$var_id] = new ReferenceConstraint(); - } - $assignment_node = DataFlowNode::getForAssignment( - $var_id, - new CodeLocation($statements_analyzer, $var) - ); - $context->vars_in_scope[$var_id]->parent_nodes = [ - $assignment_node->id => $assignment_node, - ]; - $context->vars_from_global[$var_id] = true; - $statements_analyzer->registerVariable( - $var_id, - new CodeLocation($statements_analyzer, $var), - $context->branch_point - ); - $statements_analyzer->getCodebase()->analyzer->addNodeReference( - $statements_analyzer->getFilePath(), - $var, - $var_id - ); - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php deleted file mode 100644 index 79832cc9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php +++ /dev/null @@ -1,658 +0,0 @@ -getDocComment(); - - $var_comments = []; - $var_comment_type = null; - - $source = $statements_analyzer->getSource(); - - $codebase = $statements_analyzer->getCodebase(); - - if ($doc_comment && ($parsed_docblock = $statements_analyzer->getParsedDocblock())) { - $file_storage_provider = $codebase->file_storage_provider; - - $file_storage = $file_storage_provider->get($statements_analyzer->getFilePath()); - - try { - $var_comments = $codebase->config->disable_var_parsing - ? [] - : CommentAnalyzer::arrayToDocblocks( - $doc_comment, - $parsed_docblock, - $statements_analyzer->getSource(), - $statements_analyzer->getAliases(), - $statements_analyzer->getTemplateTypeMap(), - $file_storage->type_aliases - ); - } catch (DocblockParseException $e) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $e->getMessage(), - new CodeLocation($source, $stmt) - ) - ); - } - - foreach ($var_comments as $var_comment) { - if (!$var_comment->type) { - continue; - } - - $comment_type = TypeExpander::expandUnion( - $codebase, - $var_comment->type, - $context->self, - $context->self, - $statements_analyzer->getParentFQCLN() - ); - - if ($codebase->alter_code - && $var_comment->type_start - && $var_comment->type_end - && $var_comment->line_number - ) { - $type_location = new DocblockTypeLocation( - $statements_analyzer, - $var_comment->type_start, - $var_comment->type_end, - $var_comment->line_number - ); - - $codebase->classlikes->handleDocblockTypeInMigration( - $codebase, - $statements_analyzer, - $comment_type, - $type_location, - $context->calling_method_id - ); - } - - if (!$var_comment->var_id) { - $var_comment_type = $comment_type; - continue; - } - - if (isset($context->vars_in_scope[$var_comment->var_id])) { - $comment_type->parent_nodes = $context->vars_in_scope[$var_comment->var_id]->parent_nodes; - } - - $context->vars_in_scope[$var_comment->var_id] = $comment_type; - } - } - - if ($stmt->expr) { - $context->inside_return = true; - - if ($stmt->expr instanceof PhpParser\Node\Expr\Closure - || $stmt->expr instanceof PhpParser\Node\Expr\ArrowFunction - ) { - self::potentiallyInferTypesOnClosureFromParentReturnType( - $statements_analyzer, - $stmt->expr, - $context - ); - } - - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - $context->inside_return = false; - return; - } - - $stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr); - - if ($var_comment_type) { - $stmt_type = $var_comment_type; - - if ($stmt_expr_type && $stmt_expr_type->parent_nodes) { - $stmt_type->parent_nodes = $stmt_expr_type->parent_nodes; - } - - $statements_analyzer->node_data->setType($stmt, $var_comment_type); - } elseif ($stmt_expr_type) { - $stmt_type = $stmt_expr_type; - - if ($stmt_type->isNever()) { - IssueBuffer::maybeAdd( - new NoValue( - 'This function or method call never returns output', - new CodeLocation($source, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - - $stmt_type = Type::getEmpty(); - } - - if ($stmt_type->isVoid()) { - $stmt_type = Type::getNull(); - } - } else { - $stmt_type = Type::getMixed(); - } - - $context->inside_return = false; - } else { - $stmt_type = Type::getVoid(); - } - - $statements_analyzer->node_data->setType($stmt, $stmt_type); - - if ($context->finally_scope) { - foreach ($context->vars_in_scope as $var_id => $type) { - if (isset($context->finally_scope->vars_in_scope[$var_id])) { - $context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( - $context->finally_scope->vars_in_scope[$var_id], - $type, - $statements_analyzer->getCodebase() - ); - } else { - $context->finally_scope->vars_in_scope[$var_id] = $type; - $type->possibly_undefined = true; - $type->possibly_undefined_from_try = true; - } - } - } - - if ($source instanceof FunctionLikeAnalyzer - && !($source->getSource() instanceof TraitAnalyzer) - ) { - $source->addReturnTypes($context); - - $source->examineParamTypes($statements_analyzer, $context, $codebase, $stmt); - - $storage = $source->getFunctionLikeStorage($statements_analyzer); - - $cased_method_id = $source->getCorrectlyCasedMethodId(); - - if ($stmt->expr && $storage->location) { - $inferred_type = TypeExpander::expandUnion( - $codebase, - $stmt_type, - $source->getFQCLN(), - $source->getFQCLN(), - $source->getParentFQCLN() - ); - - if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph) { - self::handleTaints( - $statements_analyzer, - $stmt, - $cased_method_id, - $inferred_type, - $storage - ); - } - - if ($storage instanceof MethodStorage && $context->self) { - $self_class = $context->self; - - $declared_return_type = $codebase->methods->getMethodReturnType( - MethodIdentifier::wrap($cased_method_id), - $self_class, - $statements_analyzer, - null - ); - } else { - $declared_return_type = $storage->return_type; - } - - if ($declared_return_type && !$declared_return_type->hasMixed()) { - $local_return_type = $source->getLocalReturnType( - $declared_return_type, - $storage instanceof MethodStorage && $storage->final - ); - - if ($storage instanceof MethodStorage) { - [$fq_class_name, $method_name] = explode('::', $cased_method_id); - - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name); - - $found_generic_params = ClassTemplateParamCollector::collect( - $codebase, - $class_storage, - $class_storage, - strtolower($method_name), - null, - true - ); - - if ($found_generic_params) { - foreach ($found_generic_params as $template_name => $_) { - unset($found_generic_params[$template_name][$fq_class_name]); - } - - $local_return_type = clone $local_return_type; - - TemplateInferredTypeReplacer::replace( - $local_return_type, - new TemplateResult([], $found_generic_params), - $codebase - ); - } - } - - if ($local_return_type->isGenerator() && $storage->has_yield) { - return; - } - - if ($stmt_type->hasMixed()) { - if ($local_return_type->isVoid() || $local_return_type->isNever()) { - if (IssueBuffer::accepts( - new InvalidReturnStatement( - 'No return values are expected for ' . $cased_method_id, - new CodeLocation($source, $stmt->expr) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return; - } - } - - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && !($source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementMixedCount($statements_analyzer->getFilePath()); - } - - if ($stmt_type->isMixed()) { - $origin_locations = []; - - if ($statements_analyzer->data_flow_graph instanceof VariableUseGraph) { - foreach ($stmt_type->parent_nodes as $parent_node) { - $origin_locations = array_merge( - $origin_locations, - $statements_analyzer->data_flow_graph->getOriginLocations($parent_node) - ); - } - } - - $origin_location = count($origin_locations) === 1 ? reset($origin_locations) : null; - - $return_location = new CodeLocation($source, $stmt->expr); - - if ($origin_location && $origin_location->getHash() === $return_location->getHash()) { - $origin_location = null; - } - - IssueBuffer::maybeAdd( - new MixedReturnStatement( - 'Could not infer a return type', - $return_location, - $origin_location - ), - $statements_analyzer->getSuppressedIssues() - ); - - return; - } - - IssueBuffer::maybeAdd( - new MixedReturnStatement( - 'Possibly-mixed return value', - new CodeLocation($source, $stmt->expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if ($local_return_type->isMixed()) { - return; - } - - if (!$context->collect_initializations - && !$context->collect_mutations - && $statements_analyzer->getFilePath() === $statements_analyzer->getRootFilePath() - && !($source->getSource() instanceof TraitAnalyzer) - ) { - $codebase->analyzer->incrementNonMixedCount($statements_analyzer->getFilePath()); - } - - if ($local_return_type->isVoid()) { - if (IssueBuffer::accepts( - new InvalidReturnStatement( - 'No return values are expected for ' . $cased_method_id, - new CodeLocation($source, $stmt->expr) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return; - } - - return; - } - - $union_comparison_results = new TypeComparisonResult(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $inferred_type, - $local_return_type, - true, - true, - $union_comparison_results - ) - ) { - // is the declared return type more specific than the inferred one? - if ($union_comparison_results->type_coerced) { - if ($union_comparison_results->type_coerced_from_mixed) { - if (!$union_comparison_results->type_coerced_from_as_mixed) { - if ($inferred_type->hasMixed()) { - IssueBuffer::maybeAdd( - new MixedReturnStatement( - 'Could not infer a return type', - new CodeLocation($source, $stmt->expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new MixedReturnTypeCoercion( - 'The type \'' . $stmt_type->getId() . '\' is more general than the' - . ' declared return type \'' . $local_return_type->getId() . '\'' - . ' for ' . $cased_method_id, - new CodeLocation($source, $stmt->expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } else { - IssueBuffer::maybeAdd( - new LessSpecificReturnStatement( - 'The type \'' . $stmt_type->getId() . '\' is more general than the' - . ' declared return type \'' . $local_return_type->getId() . '\'' - . ' for ' . $cased_method_id, - new CodeLocation($source, $stmt->expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - foreach ($local_return_type->getAtomicTypes() as $local_type_part) { - if ($local_type_part instanceof TClassString - && $stmt->expr instanceof PhpParser\Node\Scalar\String_ - ) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $stmt->expr->value, - new CodeLocation($source, $stmt->expr), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions(true) - ) === false - ) { - return; - } - } elseif ($local_type_part instanceof TArray - && $stmt->expr instanceof PhpParser\Node\Expr\Array_ - ) { - $value_param = $local_type_part->type_params[1]; - - foreach ($value_param->getAtomicTypes() as $local_array_type_part) { - if ($local_array_type_part instanceof TClassString) { - foreach ($stmt->expr->items as $item) { - if ($item && $item->value instanceof PhpParser\Node\Scalar\String_) { - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $statements_analyzer, - $item->value->value, - new CodeLocation($source, $item->value), - $context->self, - $context->calling_method_id, - $statements_analyzer->getSuppressedIssues(), - new ClassLikeNameOptions(true) - ) === false - ) { - return; - } - } - } - } - } - } - } - } else { - IssueBuffer::maybeAdd( - new InvalidReturnStatement( - 'The inferred type \'' . $inferred_type->getId() - . '\' does not match the declared return ' - . 'type \'' . $local_return_type->getId() . '\' for ' . $cased_method_id, - new CodeLocation($source, $stmt->expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - if (!$stmt_type->ignore_nullable_issues - && $inferred_type->isNullable() - && !$local_return_type->isNullable() - && !$local_return_type->hasTemplate() - ) { - IssueBuffer::maybeAdd( - new NullableReturnStatement( - 'The declared return type \'' . $local_return_type->getId() . '\' for ' - . $cased_method_id . ' is not nullable, but the function returns \'' - . $inferred_type->getId() . '\'', - new CodeLocation($source, $stmt->expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - if (!$stmt_type->ignore_falsable_issues - && $inferred_type->isFalsable() - && !$local_return_type->isFalsable() - && (!$local_return_type->hasBool() || $local_return_type->isTrue()) - && !$local_return_type->hasScalar() - ) { - IssueBuffer::maybeAdd( - new FalsableReturnStatement( - 'The declared return type \'' . $local_return_type . '\' for ' - . $cased_method_id . ' does not allow false, but the function returns \'' - . $inferred_type . '\'', - new CodeLocation($source, $stmt->expr) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } else { - if ($storage->signature_return_type - && !$storage->signature_return_type->isVoid() - && !$storage->has_yield - ) { - IssueBuffer::maybeAdd( - new InvalidReturnStatement( - 'Empty return statement is not expected in ' . $cased_method_id, - new CodeLocation($source, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - } - } - - private static function handleTaints( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Stmt\Return_ $stmt, - string $cased_method_id, - Union $inferred_type, - FunctionLikeStorage $storage - ): void { - if (!$statements_analyzer->data_flow_graph instanceof TaintFlowGraph - || !$stmt->expr - || !$storage->location - ) { - return; - } - - $method_node = DataFlowNode::getForMethodReturn( - strtolower($cased_method_id), - $cased_method_id, - $storage->signature_return_type_location ?: $storage->location - ); - - $statements_analyzer->data_flow_graph->addNode($method_node); - - if ($inferred_type->parent_nodes) { - foreach ($inferred_type->parent_nodes as $parent_node) { - $statements_analyzer->data_flow_graph->addPath( - $parent_node, - $method_node, - 'return', - $storage->added_taints, - $storage->removed_taints - ); - } - } - } - - /** - * If a function returns a closure, we try to infer the param/return types of - * the inner closure. - * @see \Psalm\Tests\ReturnTypeTest:756 - * @param PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\ArrowFunction $expr - */ - private static function potentiallyInferTypesOnClosureFromParentReturnType( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\FunctionLike $expr, - Context $context - ): void { - // if not returning from inside of a function, return - if (!$context->calling_method_id && !$context->calling_function_id) { - return; - } - - $closure_id = (new ClosureAnalyzer($expr, $statements_analyzer))->getClosureId(); - $closure_storage = $statements_analyzer - ->getCodebase() - ->getFunctionLikeStorage($statements_analyzer, $closure_id); - - $parent_fn_storage = $statements_analyzer - ->getCodebase() - ->getFunctionLikeStorage( - $statements_analyzer, - $context->calling_function_id ?: $context->calling_method_id - ); - - if ($parent_fn_storage->return_type === null) { - return; - } - - // can't infer returned closure if the parent doesn't have a callable return type - if (!$parent_fn_storage->return_type->hasCallableType()) { - return; - } - - // cannot infer if we have union/intersection types - if (!$parent_fn_storage->return_type->isSingle()) { - return; - } - - /** @var TClosure|TCallable $parent_callable_return_type */ - $parent_callable_return_type = $parent_fn_storage->return_type->getSingleAtomic(); - - if ($parent_callable_return_type->params === null && $parent_callable_return_type->return_type === null) { - return; - } - - foreach ($closure_storage->params as $key => $param) { - $parent_param = $parent_callable_return_type->params[$key] ?? null; - $param->type = self::inferInnerClosureTypeFromParent( - $statements_analyzer->getCodebase(), - $param->type, - $parent_param->type ?? null - ); - } - - $closure_storage->return_type = self::inferInnerClosureTypeFromParent( - $statements_analyzer->getCodebase(), - $closure_storage->return_type, - $parent_callable_return_type->return_type - ); - } - - /** - * - If non parent type, do nothing - * - If no return type, infer from parent - * - If parent return type is more specific, infer from parent - * - else, do nothing - */ - private static function inferInnerClosureTypeFromParent( - Codebase $codebase, - ?Union $return_type, - ?Union $parent_return_type - ): ?Union { - if (!$parent_return_type) { - return $return_type; - } - if (!$return_type || UnionTypeComparator::isContainedBy($codebase, $parent_return_type, $return_type)) { - return $parent_return_type; - } - return $return_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php deleted file mode 100644 index 12d068d5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php +++ /dev/null @@ -1,188 +0,0 @@ -getCodebase(); - - if ($context->mutation_free) { - IssueBuffer::maybeAdd( - new ImpureStaticVariable( - 'Cannot use a static variable in a mutation-free context', - new CodeLocation($statements_analyzer, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - - foreach ($stmt->vars as $var) { - if (!is_string($var->var->name)) { - continue; - } - - $var_id = '$' . $var->var->name; - - $doc_comment = $stmt->getDocComment(); - - $comment_type = null; - - if ($doc_comment && ($parsed_docblock = $statements_analyzer->getParsedDocblock())) { - $var_comments = []; - - try { - $var_comments = $codebase->config->disable_var_parsing - ? [] - : CommentAnalyzer::arrayToDocblocks( - $doc_comment, - $parsed_docblock, - $statements_analyzer->getSource(), - $statements_analyzer->getSource()->getAliases(), - $statements_analyzer->getSource()->getTemplateTypeMap() - ); - } catch (IncorrectDocblockException $e) { - IssueBuffer::maybeAdd( - new MissingDocblockType( - $e->getMessage(), - new CodeLocation($statements_analyzer, $var) - ) - ); - } catch (DocblockParseException $e) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $e->getMessage(), - new CodeLocation($statements_analyzer->getSource(), $var) - ) - ); - } - - foreach ($var_comments as $var_comment) { - if (!$var_comment->type) { - continue; - } - - try { - $var_comment_type = TypeExpander::expandUnion( - $codebase, - $var_comment->type, - $context->self, - $context->self, - $statements_analyzer->getParentFQCLN() - ); - - $var_comment_type->setFromDocblock(); - - $var_comment_type->check( - $statements_analyzer, - new CodeLocation($statements_analyzer->getSource(), $var), - $statements_analyzer->getSuppressedIssues() - ); - - if ($codebase->alter_code - && $var_comment->type_start - && $var_comment->type_end - && $var_comment->line_number - ) { - $type_location = new DocblockTypeLocation( - $statements_analyzer, - $var_comment->type_start, - $var_comment->type_end, - $var_comment->line_number - ); - - $codebase->classlikes->handleDocblockTypeInMigration( - $codebase, - $statements_analyzer, - $var_comment_type, - $type_location, - $context->calling_method_id - ); - } - - if (!$var_comment->var_id || $var_comment->var_id === $var_id) { - $comment_type = $var_comment_type; - continue; - } - - $context->vars_in_scope[$var_comment->var_id] = $var_comment_type; - } catch (UnexpectedValueException $e) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $e->getMessage(), - new CodeLocation($statements_analyzer, $var) - ) - ); - } - } - - if ($comment_type) { - $context->byref_constraints[$var_id] = new ReferenceConstraint($comment_type); - } - } - - if ($var->default) { - if (ExpressionAnalyzer::analyze($statements_analyzer, $var->default, $context) === false) { - return; - } - - if ($comment_type - && ($var_default_type = $statements_analyzer->node_data->getType($var->default)) - && !UnionTypeComparator::isContainedBy( - $codebase, - $var_default_type, - $comment_type - ) - ) { - IssueBuffer::maybeAdd( - new ReferenceConstraintViolation( - $var_id . ' of type ' . $comment_type->getId() . ' cannot be assigned type ' - . $var_default_type->getId(), - new CodeLocation($statements_analyzer, $var) - ) - ); - } - } - - if ($context->check_variables) { - $context->vars_in_scope[$var_id] = $comment_type ? clone $comment_type : Type::getMixed(); - $context->vars_possibly_in_scope[$var_id] = true; - $context->assigned_var_ids[$var_id] = (int) $stmt->getAttribute('startFilePos'); - $statements_analyzer->byref_uses[$var_id] = true; - - $location = new CodeLocation($statements_analyzer, $var); - - $statements_analyzer->registerVariable( - $var_id, - $location, - $context->branch_point - ); - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php deleted file mode 100644 index 665a1c40..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php +++ /dev/null @@ -1,93 +0,0 @@ -inside_throw = true; - if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->expr, $context) === false) { - return false; - } - $context->inside_throw = false; - - if ($context->finally_scope) { - foreach ($context->vars_in_scope as $var_id => $type) { - if (isset($context->finally_scope->vars_in_scope[$var_id])) { - $context->finally_scope->vars_in_scope[$var_id] = Type::combineUnionTypes( - $context->finally_scope->vars_in_scope[$var_id], - $type, - $statements_analyzer->getCodebase() - ); - } else { - $context->finally_scope->vars_in_scope[$var_id] = $type; - $type->possibly_undefined = true; - $type->possibly_undefined_from_try = true; - } - } - } - - if ($context->check_classes - && ($throw_type = $statements_analyzer->node_data->getType($stmt->expr)) - && !$throw_type->hasMixed() - ) { - $exception_type = new Union([new TNamedObject('Exception'), new TNamedObject('Throwable')]); - - $file_analyzer = $statements_analyzer->getFileAnalyzer(); - $codebase = $statements_analyzer->getCodebase(); - - foreach ($throw_type->getAtomicTypes() as $throw_type_part) { - $throw_type_candidate = new Union([$throw_type_part]); - - if (!UnionTypeComparator::isContainedBy($codebase, $throw_type_candidate, $exception_type)) { - if (IssueBuffer::accepts( - new InvalidThrow( - 'Cannot throw ' . $throw_type_part - . ' as it does not extend Exception or implement Throwable', - new CodeLocation($file_analyzer, $stmt), - (string) $throw_type_part - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } elseif (!$context->isSuppressingExceptions($statements_analyzer)) { - $codelocation = new CodeLocation($file_analyzer, $stmt); - $hash = $codelocation->getHash(); - foreach ($throw_type->getAtomicTypes() as $throw_atomic_type) { - if ($throw_atomic_type instanceof TNamedObject) { - $context->possibly_thrown_exceptions[$throw_atomic_type->value][$hash] = $codelocation; - } - } - } - } - } - - if ($stmt instanceof PhpParser\Node\Expr\Throw_) { - $statements_analyzer->node_data->setType($stmt, Type::getEmpty()); - } - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php deleted file mode 100644 index c7cfeb6d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php +++ /dev/null @@ -1,138 +0,0 @@ -inside_unset = true; - - foreach ($stmt->vars as $var) { - $was_inside_general_use = $context->inside_general_use; - $context->inside_general_use = true; - - ExpressionAnalyzer::analyze($statements_analyzer, $var, $context); - - $context->inside_general_use = $was_inside_general_use; - - $var_id = ExpressionIdentifier::getArrayVarId( - $var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($var_id) { - $context->remove($var_id); - } - - if ($var instanceof PhpParser\Node\Expr\ArrayDimFetch && $var->dim) { - $root_var_id = ExpressionIdentifier::getArrayVarId( - $var->var, - $statements_analyzer->getFQCLN(), - $statements_analyzer - ); - - if ($root_var_id && isset($context->vars_in_scope[$root_var_id])) { - $root_type = clone $context->vars_in_scope[$root_var_id]; - - foreach ($root_type->getAtomicTypes() as $atomic_root_type) { - if ($atomic_root_type instanceof TKeyedArray) { - if ($var->dim instanceof PhpParser\Node\Scalar\String_ - || $var->dim instanceof PhpParser\Node\Scalar\LNumber - ) { - if (isset($atomic_root_type->properties[$var->dim->value])) { - if ($atomic_root_type->is_list - && $var->dim->value !== count($atomic_root_type->properties)-1 - ) { - $atomic_root_type->is_list = false; - } - unset($atomic_root_type->properties[$var->dim->value]); - $root_type->bustCache(); //remove id cache - } - - if (!$atomic_root_type->properties) { - if ($atomic_root_type->previous_value_type) { - $root_type->addType( - new TArray([ - $atomic_root_type->previous_key_type - ? clone $atomic_root_type->previous_key_type - : new Union([new TArrayKey]), - clone $atomic_root_type->previous_value_type, - ]) - ); - } else { - $root_type->addType( - new TArray([ - new Union([new TEmpty]), - new Union([new TEmpty]), - ]) - ); - } - } - } else { - foreach ($atomic_root_type->properties as $key => $type) { - $atomic_root_type->properties[$key] = clone $type; - $atomic_root_type->properties[$key]->possibly_undefined = true; - } - - $atomic_root_type->sealed = false; - - $root_type->addType( - $atomic_root_type->getGenericArrayType(false) - ); - - $atomic_root_type->is_list = false; - } - } elseif ($atomic_root_type instanceof TNonEmptyArray) { - $root_type->addType( - new TArray($atomic_root_type->type_params) - ); - } elseif ($atomic_root_type instanceof TNonEmptyMixed) { - $root_type->addType( - new TMixed() - ); - } elseif ($atomic_root_type instanceof TList) { - $root_type->addType( - new TArray([ - Type::getInt(), - $atomic_root_type->type_param - ]) - ); - } - } - - $context->vars_in_scope[$root_var_id] = $root_type; - - $context->removeVarFromConflictingClauses( - $root_var_id, - $context->vars_in_scope[$root_var_id], - $statements_analyzer - ); - } - } - } - - $context->inside_unset = false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php deleted file mode 100644 index 30c01b4e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php +++ /dev/null @@ -1,357 +0,0 @@ - - */ - private $removed_unref_vars = []; - - /** - * @param array $stmts - * @param array $var_loc_map - * - */ - public function findUnusedAssignment( - Codebase $codebase, - array $stmts, - array $var_loc_map, - string $var_id, - CodeLocation $original_location - ): void { - $search_result = $this->findAssignStmt($stmts, $var_id, $original_location); - [$assign_stmt, $assign_exp] = $search_result; - $chain_assignment = false; - - if ($assign_stmt !== null && $assign_exp !== null) { - // Check if we have to remove assignment statement as expression (i.e. just "$var = ") - - // Consider chain of assignments - $rhs_exp = $assign_exp->expr; - if ($rhs_exp instanceof PhpParser\Node\Expr\Assign - || $rhs_exp instanceof PhpParser\Node\Expr\AssignOp - || $rhs_exp instanceof PhpParser\Node\Expr\AssignRef - ) { - $chain_assignment = true; - $removable_stmt = $this->checkRemovableChainAssignment($assign_exp, $var_loc_map); - } else { - $removable_stmt = true; - } - - if ($removable_stmt) { - $traverser = new PhpParser\NodeTraverser(); - $visitor = new CheckTrivialExprVisitor(); - $traverser->addVisitor($visitor); - $traverser->traverse([$rhs_exp]); - - $rhs_exp_trivial = (count($visitor->getNonTrivialExpr()) === 0); - - if ($rhs_exp_trivial) { - $treat_as_expr = false; - } else { - $treat_as_expr = true; - } - } else { - $treat_as_expr = true; - } - - if ($treat_as_expr) { - $is_assign_ref = $assign_exp instanceof PhpParser\Node\Expr\AssignRef; - $new_file_manipulation = self::getPartialRemovalBounds( - $codebase, - $original_location, - $assign_stmt->getEndFilePos(), - $is_assign_ref - ); - $this->removed_unref_vars[$var_id] = $original_location; - } else { - // Remove whole assignment statement - $new_file_manipulation = new FileManipulation( - $assign_stmt->getStartFilePos(), - $assign_stmt->getEndFilePos() + 1, - "", - false, - true - ); - - // If statement we are removing is a chain of assignments, mark other variables as removed - if ($chain_assignment) { - $this->markRemovedChainAssignVar($assign_exp, $var_loc_map); - } else { - $this->removed_unref_vars[$var_id] = $original_location; - } - } - - FileManipulationBuffer::add($original_location->file_path, [$new_file_manipulation]); - } elseif ($assign_exp !== null) { - $is_assign_ref = $assign_exp instanceof PhpParser\Node\Expr\AssignRef; - $new_file_manipulation = self::getPartialRemovalBounds( - $codebase, - $original_location, - $assign_exp->getEndFilePos(), - $is_assign_ref - ); - - FileManipulationBuffer::add($original_location->file_path, [$new_file_manipulation]); - $this->removed_unref_vars[$var_id] = $original_location; - } - } - - private static function getPartialRemovalBounds( - Codebase $codebase, - CodeLocation $var_loc, - int $end_bound, - bool $assign_ref = false - ): FileManipulation { - $var_start_loc= $var_loc->raw_file_start; - $stmt_content = $codebase->file_provider->getContents( - $var_loc->file_path - ); - $str_for_token = " $var_loc_map - */ - private function markRemovedChainAssignVar(PhpParser\Node\Expr $cur_assign, array $var_loc_map): void - { - $var = $cur_assign->var; - if ($var instanceof PhpParser\Node\Expr\Variable && is_string($var->name)) { - $var_name = "$" . $var->name; - $var_loc = $var_loc_map[$var_name]; - $this->removed_unref_vars[$var_name] = $var_loc; - - $rhs_exp = $cur_assign->expr; - if ($rhs_exp instanceof PhpParser\Node\Expr\Assign - || $rhs_exp instanceof PhpParser\Node\Expr\AssignOp - || $rhs_exp instanceof PhpParser\Node\Expr\AssignRef - ) { - $this->markRemovedChainAssignVar($rhs_exp, $var_loc_map); - } - } - } - - /** - * @param PhpParser\Node\Expr\Assign|PhpParser\Node\Expr\AssignOp|PhpParser\Node\Expr\AssignRef $cur_assign - * @param array $var_loc_map - */ - private function checkRemovableChainAssignment(PhpParser\Node\Expr $cur_assign, array $var_loc_map): bool - { - // Check if current assignment expr's variable is removable - $var = $cur_assign->var; - if ($var instanceof PhpParser\Node\Expr\Variable && is_string($var->name)) { - $var_loc = $cur_assign->var->getStartFilePos(); - $var_name = "$" . $var->name; - - if (array_key_exists($var_name, $var_loc_map) && - $var_loc_map[$var_name]->raw_file_start === $var_loc) { - $curr_removable = true; - } else { - $curr_removable = false; - } - - if ($curr_removable) { - $rhs_exp = $cur_assign->expr; - - if ($rhs_exp instanceof PhpParser\Node\Expr\Assign - || $rhs_exp instanceof PhpParser\Node\Expr\AssignOp - || $rhs_exp instanceof PhpParser\Node\Expr\AssignRef - ) { - return $this->checkRemovableChainAssignment($rhs_exp, $var_loc_map); - } - } - return $curr_removable; - } - - return false; - } - - /** - * @param array $stmts - * @return array{ - * 0: PhpParser\Node\Stmt|null, - * 1: PhpParser\Node\Expr\Assign|PhpParser\Node\Expr\AssignOp|PhpParser\Node\Expr\AssignRef|null - * } - */ - private function findAssignStmt(array $stmts, string $var_id, CodeLocation $original_location): array - { - $assign_stmt = null; - $assign_exp = null; - $assign_exp_found = false; - - $i = 0; - - while ($i < count($stmts) && !$assign_exp_found) { - $stmt = $stmts[$i]; - if ($stmt instanceof PhpParser\Node\Stmt\Expression) { - $search_result = $this->findAssignExp($stmt->expr, $var_id, $original_location->raw_file_start); - - [$target_exp, $levels_taken] = $search_result; - - if ($target_exp !== null) { - $assign_exp_found = true; - $assign_exp = $target_exp; - $assign_stmt = $levels_taken === 1 ? $stmt : null; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\TryCatch) { - $search_result = $this->findAssignStmt($stmt->stmts, $var_id, $original_location); - - if ($search_result[0] && $search_result[1]) { - return $search_result; - } - - foreach ($stmt->catches as $catch_stmt) { - $search_result = $this->findAssignStmt($catch_stmt->stmts, $var_id, $original_location); - - if ($search_result[0] && $search_result[1]) { - return $search_result; - } - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Do_ - || $stmt instanceof PhpParser\Node\Stmt\While_ - ) { - $search_result = $this->findAssignStmt($stmt->stmts, $var_id, $original_location); - - if ($search_result[0] && $search_result[1]) { - return $search_result; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Foreach_) { - $search_result = $this->findAssignStmt($stmt->stmts, $var_id, $original_location); - - if ($search_result[0] && $search_result[1]) { - return $search_result; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\For_) { - $search_result = $this->findAssignStmt($stmt->stmts, $var_id, $original_location); - - if ($search_result[0] && $search_result[1]) { - return $search_result; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\If_) { - $search_result = $this->findAssignStmt($stmt->stmts, $var_id, $original_location); - - if ($search_result[0] && $search_result[1]) { - return $search_result; - } - - foreach ($stmt->elseifs as $elseif_stmt) { - $search_result = $this->findAssignStmt($elseif_stmt->stmts, $var_id, $original_location); - - if ($search_result[0] && $search_result[1]) { - return $search_result; - } - } - - if ($stmt->else) { - $search_result = $this->findAssignStmt($stmt->else->stmts, $var_id, $original_location); - - if ($search_result[0] && $search_result[1]) { - return $search_result; - } - } - } - - $i++; - } - - return [$assign_stmt, $assign_exp]; - } - - /** - * @return array{ - * 0: PhpParser\Node\Expr\Assign|PhpParser\Node\Expr\AssignOp|PhpParser\Node\Expr\AssignRef|null, - * 1: int - * } - */ - private function findAssignExp( - PhpParser\Node\Expr $current_node, - string $var_id, - int $var_start_loc, - int $search_level = 1 - ): array { - if ($current_node instanceof PhpParser\Node\Expr\Assign - || $current_node instanceof PhpParser\Node\Expr\AssignOp - || $current_node instanceof PhpParser\Node\Expr\AssignRef - ) { - $var = $current_node->var; - - if ($var instanceof PhpParser\Node\Expr\Variable - && $var->name === substr($var_id, 1) - && $var->getStartFilePos() === $var_start_loc - ) { - return [$current_node, $search_level]; - } - - $rhs_exp = $current_node->expr; - $rhs_search_result = $this->findAssignExp($rhs_exp, $var_id, $var_start_loc, $search_level + 1); - return [$rhs_search_result[0], $rhs_search_result[1]]; - } - - return [null, $search_level]; - } - - public function checkIfVarRemoved(string $var_id, CodeLocation $var_loc): bool - { - return array_key_exists($var_id, $this->removed_unref_vars) - && $this->removed_unref_vars[$var_id] === $var_loc; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php deleted file mode 100644 index dff3d60d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php +++ /dev/null @@ -1,1076 +0,0 @@ - - */ - private $all_vars = []; - - /** - * @var array - */ - private $var_branch_points = []; - - /** - * Possibly undefined variables should be initialised if we're altering code - * - * @var array|null - */ - private $vars_to_initialize; - - /** - * @var array - */ - private $function_analyzers = []; - - /** - * @var array - */ - private $unused_var_locations = []; - - /** - * @var ?array - */ - public $byref_uses; - - /** - * @var ParsedDocblock|null - */ - private $parsed_docblock; - - /** - * @var ?string - */ - private $fake_this_class; - - /** @var NodeDataProvider */ - public $node_data; - - /** @var ?DataFlowGraph */ - public $data_flow_graph; - - /** - * Locations of foreach values - * - * Used to discern ordinary UnusedVariables from UnusedForeachValues - * - * @var array> - * @psalm-internal Psalm\Internal\Analyzer - */ - public $foreach_var_locations = []; - - public function __construct(SourceAnalyzer $source, NodeDataProvider $node_data) - { - $this->source = $source; - $this->file_analyzer = $source->getFileAnalyzer(); - $this->codebase = $source->getCodebase(); - $this->node_data = $node_data; - - if ($this->codebase->taint_flow_graph) { - $this->data_flow_graph = new TaintFlowGraph(); - } elseif ($this->codebase->find_unused_variables) { - $this->data_flow_graph = new VariableUseGraph(); - } - } - - /** - * Checks an array of statements for validity - * - * @param array $stmts - * - * @return null|false - */ - public function analyze( - array $stmts, - Context $context, - ?Context $global_context = null, - bool $root_scope = false - ): ?bool { - if (!$stmts) { - return null; - } - - // hoist functions to the top - $this->hoistFunctions($stmts, $context); - - $project_analyzer = $this->getFileAnalyzer()->project_analyzer; - $codebase = $project_analyzer->getCodebase(); - - if ($codebase->config->hoist_constants) { - self::hoistConstants($this, $stmts, $context); - } - - foreach ($stmts as $stmt) { - if (self::analyzeStatement($this, $stmt, $context, $global_context) === false) { - return false; - } - } - - if ($root_scope - && !$context->collect_initializations - && !$context->collect_mutations - && $codebase->find_unused_variables - && $context->check_variables - ) { - //var_dump($this->data_flow_graph); - $this->checkUnreferencedVars($stmts, $context); - } - - if ($codebase->alter_code && $root_scope && $this->vars_to_initialize) { - $file_contents = $codebase->getFileContents($this->getFilePath()); - - foreach ($this->vars_to_initialize as $var_id => $branch_point) { - $newline_pos = (int)strrpos($file_contents, "\n", $branch_point - strlen($file_contents)) + 1; - $indentation = substr($file_contents, $newline_pos, $branch_point - $newline_pos); - FileManipulationBuffer::add($this->getFilePath(), [ - new FileManipulation($branch_point, $branch_point, $var_id . ' = null;' . "\n" . $indentation), - ]); - } - } - - if ($root_scope - && $this->data_flow_graph instanceof TaintFlowGraph - && $this->codebase->taint_flow_graph - && $codebase->config->trackTaintsInPath($this->getFilePath()) - ) { - $this->codebase->taint_flow_graph->addGraph($this->data_flow_graph); - } - - return null; - } - - /** - * @param array $stmts - */ - private function hoistFunctions(array $stmts, Context $context): void - { - foreach ($stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\Function_) { - $function_name = strtolower($stmt->name->name); - - if ($ns = $this->getNamespace()) { - $fq_function_name = strtolower($ns) . '\\' . $function_name; - } else { - $fq_function_name = $function_name; - } - - if ($this->data_flow_graph - && $this->codebase->find_unused_variables - ) { - foreach ($stmt->stmts as $function_stmt) { - if ($function_stmt instanceof PhpParser\Node\Stmt\Global_) { - foreach ($function_stmt->vars as $var) { - if (!$var instanceof PhpParser\Node\Expr\Variable - || !is_string($var->name) - ) { - continue; - } - - $var_id = '$' . $var->name; - - if ($var_id !== '$argv' && $var_id !== '$argc') { - $context->byref_constraints[$var_id] = new ReferenceConstraint(); - } - } - } - } - } - - try { - $function_analyzer = new FunctionAnalyzer($stmt, $this->source); - $this->function_analyzers[$fq_function_name] = $function_analyzer; - } catch (UnexpectedValueException $e) { - // do nothing - } - } - } - } - - /** - * @param array $stmts - */ - private static function hoistConstants( - StatementsAnalyzer $statements_analyzer, - array $stmts, - Context $context - ): void { - $codebase = $statements_analyzer->getCodebase(); - - foreach ($stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\Const_) { - foreach ($stmt->consts as $const) { - ConstFetchAnalyzer::setConstType( - $statements_analyzer, - $const->name->name, - SimpleTypeInferer::infer( - $codebase, - $statements_analyzer->node_data, - $const->value, - $statements_analyzer->getAliases(), - $statements_analyzer - ) ?? Type::getMixed(), - $context - ); - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Expression - && $stmt->expr instanceof PhpParser\Node\Expr\FuncCall - && $stmt->expr->name instanceof PhpParser\Node\Name - && $stmt->expr->name->parts === ['define'] - && isset($stmt->expr->getArgs()[1]) - ) { - $const_name = ConstFetchAnalyzer::getConstName( - $stmt->expr->getArgs()[0]->value, - $statements_analyzer->node_data, - $codebase, - $statements_analyzer->getAliases() - ); - - if ($const_name !== null) { - ConstFetchAnalyzer::setConstType( - $statements_analyzer, - $const_name, - SimpleTypeInferer::infer( - $codebase, - $statements_analyzer->node_data, - $stmt->expr->getArgs()[1]->value, - $statements_analyzer->getAliases(), - $statements_analyzer - ) ?? Type::getMixed(), - $context - ); - } - } - } - } - - /** - * @return false|null - */ - private static function analyzeStatement( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Stmt $stmt, - Context $context, - ?Context $global_context - ): ?bool { - $ignore_variable_property = false; - $ignore_variable_method = false; - - $codebase = $statements_analyzer->getCodebase(); - - if ($statements_analyzer->getProjectAnalyzer()->debug_lines) { - fwrite(STDERR, $statements_analyzer->getFilePath() . ':' . $stmt->getLine() . "\n"); - } - - $new_issues = null; - $traced_variables = []; - - if ($docblock = $stmt->getDocComment()) { - $statements_analyzer->parseStatementDocblock($docblock, $stmt, $context); - - if (isset($statements_analyzer->parsed_docblock->tags['psalm-trace'])) { - foreach ($statements_analyzer->parsed_docblock->tags['psalm-trace'] as $traced_variable_line) { - $possible_traced_variable_names = preg_split( - '/(?:\s*,\s*|\s+)/', - $traced_variable_line, - -1, - PREG_SPLIT_NO_EMPTY - ); - if ($possible_traced_variable_names) { - $traced_variables = array_merge($traced_variables, $possible_traced_variable_names); - } - } - } - - if (isset($statements_analyzer->parsed_docblock->tags['psalm-ignore-variable-method'])) { - $context->ignore_variable_method = $ignore_variable_method = true; - } - - if (isset($statements_analyzer->parsed_docblock->tags['psalm-ignore-variable-property'])) { - $context->ignore_variable_property = $ignore_variable_property = true; - } - - if (isset($statements_analyzer->parsed_docblock->tags['psalm-suppress'])) { - $suppressed = $statements_analyzer->parsed_docblock->tags['psalm-suppress']; - if ($suppressed) { - $new_issues = []; - - foreach ($suppressed as $offset => $suppress_entry) { - foreach (DocComment::parseSuppressList($suppress_entry) as $issue_offset => $issue_type) { - $new_issues[$issue_offset + $offset] = $issue_type; - } - } - - if ($codebase->track_unused_suppressions - && ( - (count($new_issues) === 1) // UnusedPsalmSuppress by itself should be marked as unused - || !in_array("UnusedPsalmSuppress", $new_issues) - ) - ) { - foreach ($new_issues as $offset => $issue_type) { - if ($issue_type === 'InaccessibleMethod') { - continue; - } - - IssueBuffer::addUnusedSuppression( - $statements_analyzer->getFilePath(), - $offset, - $issue_type - ); - } - } - - $statements_analyzer->addSuppressedIssues($new_issues); - } - } - - if (isset($statements_analyzer->parsed_docblock->combined_tags['var']) - && !($stmt instanceof PhpParser\Node\Stmt\Expression - && $stmt->expr instanceof PhpParser\Node\Expr\Assign) - && !$stmt instanceof PhpParser\Node\Stmt\Foreach_ - && !$stmt instanceof PhpParser\Node\Stmt\Return_ - ) { - $file_path = $statements_analyzer->getRootFilePath(); - - $file_storage_provider = $codebase->file_storage_provider; - - $file_storage = $file_storage_provider->get($file_path); - - $template_type_map = $statements_analyzer->getTemplateTypeMap(); - - $var_comments = []; - - try { - $var_comments = $codebase->config->disable_var_parsing - ? [] - : CommentAnalyzer::arrayToDocblocks( - $docblock, - $statements_analyzer->parsed_docblock, - $statements_analyzer->getSource(), - $statements_analyzer->getAliases(), - $template_type_map, - $file_storage->type_aliases - ); - } catch (IncorrectDocblockException $e) { - IssueBuffer::maybeAdd( - new MissingDocblockType( - $e->getMessage(), - new CodeLocation($statements_analyzer->getSource(), $stmt) - ) - ); - } catch (DocblockParseException $e) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $e->getMessage(), - new CodeLocation($statements_analyzer->getSource(), $stmt) - ) - ); - } - - foreach ($var_comments as $var_comment) { - AssignmentAnalyzer::assignTypeFromVarDocblock( - $statements_analyzer, - $stmt, - $var_comment, - $context - ); - - if ($var_comment->var_id === '$this' - && $var_comment->type - && $codebase->classExists((string)$var_comment->type) - ) { - $statements_analyzer->setFQCLN((string)$var_comment->type); - } - } - } - } else { - $statements_analyzer->parsed_docblock = null; - } - - if ($context->has_returned - && !$context->collect_initializations - && !$context->collect_mutations - && !($stmt instanceof PhpParser\Node\Stmt\Nop) - && !($stmt instanceof PhpParser\Node\Stmt\Function_) - && !($stmt instanceof PhpParser\Node\Stmt\Class_) - && !($stmt instanceof PhpParser\Node\Stmt\Interface_) - && !($stmt instanceof PhpParser\Node\Stmt\Trait_) - && !($stmt instanceof PhpParser\Node\Stmt\HaltCompiler) - ) { - if ($codebase->find_unused_variables) { - if (IssueBuffer::accepts( - new UnevaluatedCode( - 'Expressions after return/throw/continue', - new CodeLocation($statements_analyzer->source, $stmt) - ), - $statements_analyzer->source->getSuppressedIssues() - )) { - return null; - } - } - - return null; - } - - if ($stmt instanceof PhpParser\Node\Stmt\If_) { - if (IfElseAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { - return false; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\TryCatch) { - if (TryAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { - return false; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\For_) { - if (ForAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { - return false; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Foreach_) { - if (ForeachAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { - return false; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\While_) { - if (WhileAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { - return false; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Do_) { - if (DoAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { - return false; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Const_) { - ConstFetchAnalyzer::analyzeConstAssignment($statements_analyzer, $stmt, $context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Unset_) { - UnsetAnalyzer::analyze($statements_analyzer, $stmt, $context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Return_) { - ReturnAnalyzer::analyze($statements_analyzer, $stmt, $context); - $context->has_returned = true; - } elseif ($stmt instanceof PhpParser\Node\Stmt\Throw_) { - ThrowAnalyzer::analyze($statements_analyzer, $stmt, $context); - $context->has_returned = true; - } elseif ($stmt instanceof PhpParser\Node\Stmt\Switch_) { - SwitchAnalyzer::analyze($statements_analyzer, $stmt, $context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Break_) { - BreakAnalyzer::analyze($statements_analyzer, $stmt, $context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Continue_) { - ContinueAnalyzer::analyze($statements_analyzer, $stmt, $context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Static_) { - StaticAnalyzer::analyze($statements_analyzer, $stmt, $context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Echo_) { - if (EchoAnalyzer::analyze($statements_analyzer, $stmt, $context) === false) { - return false; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Function_) { - FunctionAnalyzer::analyzeStatement($statements_analyzer, $stmt, $context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Expression) { - if (ExpressionAnalyzer::analyze( - $statements_analyzer, - $stmt->expr, - $context, - false, - $global_context, - true - ) === false) { - return false; - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\InlineHTML) { - // do nothing - } elseif ($stmt instanceof PhpParser\Node\Stmt\Global_) { - GlobalAnalyzer::analyze($statements_analyzer, $stmt, $context, $global_context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Property) { - InstancePropertyAssignmentAnalyzer::analyzeStatement($statements_analyzer, $stmt, $context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\ClassConst) { - ClassConstFetchAnalyzer::analyzeClassConstAssignment($statements_analyzer, $stmt, $context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Class_) { - try { - $class_analyzer = new ClassAnalyzer( - $stmt, - $statements_analyzer->source, - $stmt->name->name ?? null - ); - - $class_analyzer->analyze(null, $global_context); - } catch (InvalidArgumentException $e) { - // disregard this exception, we'll likely see it elsewhere in the form - // of an issue - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Trait_) { - TraitAnalyzer::analyze($statements_analyzer, $stmt, $context); - } elseif ($stmt instanceof PhpParser\Node\Stmt\Nop) { - // do nothing - } elseif ($stmt instanceof PhpParser\Node\Stmt\Goto_) { - // do nothing - } elseif ($stmt instanceof PhpParser\Node\Stmt\Label) { - // do nothing - } elseif ($stmt instanceof PhpParser\Node\Stmt\Declare_) { - foreach ($stmt->declares as $declaration) { - if ((string) $declaration->key === 'strict_types' - && $declaration->value instanceof PhpParser\Node\Scalar\LNumber - && $declaration->value->value === 1 - ) { - $context->strict_types = true; - } - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\HaltCompiler) { - $context->has_returned = true; - } else { - if (IssueBuffer::accepts( - new UnrecognizedStatement( - 'Psalm does not understand ' . get_class($stmt), - new CodeLocation($statements_analyzer->source, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - )) { - return false; - } - } - - $codebase = $statements_analyzer->getCodebase(); - - $event = new AfterStatementAnalysisEvent( - $stmt, - $context, - $statements_analyzer, - $codebase, - [] - ); - - if ($codebase->config->eventDispatcher->dispatchAfterStatementAnalysis($event) === false) { - return false; - } - - $file_manipulations = $event->getFileReplacements(); - if ($file_manipulations) { - FileManipulationBuffer::add($statements_analyzer->getFilePath(), $file_manipulations); - } - - if ($new_issues) { - $statements_analyzer->removeSuppressedIssues($new_issues); - } - - if ($ignore_variable_property) { - $context->ignore_variable_property = false; - } - - if ($ignore_variable_method) { - $context->ignore_variable_method = false; - } - - foreach ($traced_variables as $traced_variable) { - if (isset($context->vars_in_scope[$traced_variable])) { - IssueBuffer::maybeAdd( - new Trace( - $traced_variable . ': ' . $context->vars_in_scope[$traced_variable]->getId(), - new CodeLocation($statements_analyzer->source, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } else { - IssueBuffer::maybeAdd( - new UndefinedTrace( - 'Attempt to trace undefined variable ' . $traced_variable, - new CodeLocation($statements_analyzer->source, $stmt) - ), - $statements_analyzer->getSuppressedIssues() - ); - } - } - - return null; - } - - private function parseStatementDocblock( - PhpParser\Comment\Doc $docblock, - PhpParser\Node\Stmt $stmt, - Context $context - ): void { - $codebase = $this->getCodebase(); - - try { - $this->parsed_docblock = DocComment::parsePreservingLength($docblock); - } catch (DocblockParseException $e) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $e->getMessage(), - new CodeLocation($this->getSource(), $stmt, null, true) - ) - ); - - $this->parsed_docblock = null; - } - - $comments = $this->parsed_docblock; - - if (isset($comments->tags['psalm-scope-this'])) { - $trimmed = trim(reset($comments->tags['psalm-scope-this'])); - - if (!$codebase->classExists($trimmed)) { - IssueBuffer::maybeAdd( - new UndefinedDocblockClass( - 'Scope class ' . $trimmed . ' does not exist', - new CodeLocation($this->getSource(), $stmt, null, true), - $trimmed - ) - ); - } else { - $this_type = Type::parseString($trimmed); - $context->self = $trimmed; - $context->vars_in_scope['$this'] = $this_type; - $this->setFQCLN($trimmed); - } - } - } - - /** - * @param array $stmts - */ - public function checkUnreferencedVars(array $stmts, Context $context): void - { - $source = $this->getSource(); - $codebase = $source->getCodebase(); - $function_storage = $source instanceof FunctionLikeAnalyzer ? $source->getFunctionLikeStorage($this) : null; - $var_list = array_column($this->unused_var_locations, 0); - $loc_list = array_column($this->unused_var_locations, 1); - - $project_analyzer = $this->getProjectAnalyzer(); - - $unused_var_remover = new UnusedAssignmentRemover(); - - if ($this->data_flow_graph instanceof VariableUseGraph - && $codebase->config->limit_method_complexity - && $source instanceof FunctionLikeAnalyzer - && !$source instanceof ClosureAnalyzer - && $function_storage - && $function_storage->location - ) { - [$count, , $unique_destinations, $mean] = $this->data_flow_graph->getEdgeStats(); - - $average_destination_branches_converging = $unique_destinations > 0 ? $count / $unique_destinations : 0; - - if ($count > $codebase->config->max_graph_size - && $mean > $codebase->config->max_avg_path_length - && $average_destination_branches_converging > 1.1 - ) { - if ($source instanceof FunctionAnalyzer) { - IssueBuffer::maybeAdd( - new ComplexFunction( - 'This function’s complexity is greater than the project limit' - . ' (method graph size = ' . $count .', average path length = ' . round($mean). ')', - $function_storage->location - ), - $this->getSuppressedIssues() - ); - } elseif ($source instanceof MethodAnalyzer) { - IssueBuffer::maybeAdd( - new ComplexMethod( - 'This method’s complexity is greater than the project limit' - . ' (method graph size = ' . $count .', average path length = ' . round($mean) . ')', - $function_storage->location - ), - $this->getSuppressedIssues() - ); - } - } - } - - foreach ($this->unused_var_locations as [$var_id, $original_location]) { - if (strpos($var_id, '$_') === 0) { - continue; - } - - if ($function_storage) { - $param_index = array_search(substr($var_id, 1), array_keys($function_storage->param_lookup)); - if ($param_index !== false) { - $param = $function_storage->params[$param_index]; - - if ($param->location - && ($original_location->raw_file_end === $param->location->raw_file_end - || $param->by_ref) - ) { - continue; - } - } - } - - $assignment_node = DataFlowNode::getForAssignment($var_id, $original_location); - - if (!isset($this->byref_uses[$var_id]) - && !isset($context->vars_from_global[$var_id]) - && !VariableFetchAnalyzer::isSuperGlobal($var_id) - && $this->data_flow_graph instanceof VariableUseGraph - && !$this->data_flow_graph->isVariableUsed($assignment_node) - ) { - $is_foreach_var = false; - - if (isset($this->foreach_var_locations[$var_id])) { - foreach ($this->foreach_var_locations[$var_id] as $location) { - if ($location->raw_file_start === $original_location->raw_file_start) { - $is_foreach_var = true; - break; - } - } - } - - if ($is_foreach_var) { - $issue = new UnusedForeachValue( - $var_id . ' is never referenced or the value is not used', - $original_location - ); - } else { - $issue = new UnusedVariable( - $var_id . ' is never referenced or the value is not used', - $original_location - ); - } - - if ($codebase->alter_code - && $issue instanceof UnusedVariable - && !$unused_var_remover->checkIfVarRemoved($var_id, $original_location) - && isset($project_analyzer->getIssuesToFix()['UnusedVariable']) - && !IssueBuffer::isSuppressed($issue, $this->getSuppressedIssues()) - ) { - $unused_var_remover->findUnusedAssignment( - $this->getCodebase(), - $stmts, - array_combine($var_list, $loc_list), - $var_id, - $original_location - ); - } - - IssueBuffer::maybeAdd( - $issue, - $this->getSuppressedIssues(), - $issue instanceof UnusedVariable - ); - } - } - } - - public function hasVariable(string $var_name): bool - { - return isset($this->all_vars[$var_name]); - } - - public function registerVariable(string $var_id, CodeLocation $location, ?int $branch_point): void - { - $this->all_vars[$var_id] = $location; - - if ($branch_point) { - $this->var_branch_points[$var_id] = $branch_point; - } - - $this->registerVariableAssignment($var_id, $location); - } - - public function registerVariableAssignment(string $var_id, CodeLocation $location): void - { - $this->unused_var_locations[$location->getHash()] = [$var_id, $location]; - } - - /** - * @return array - */ - public function getUnusedVarLocations(): array - { - return $this->unused_var_locations; - } - - public function registerPossiblyUndefinedVariable( - string $undefined_var_id, - PhpParser\Node\Expr\Variable $stmt - ): void { - if (!$this->data_flow_graph) { - return; - } - - $use_location = new CodeLocation($this->getSource(), $stmt); - $use_node = DataFlowNode::getForAssignment($undefined_var_id, $use_location); - - $stmt_type = $this->node_data->getType($stmt); - - if ($stmt_type) { - $stmt_type->parent_nodes[$use_node->id] = $use_node; - } - - foreach ($this->unused_var_locations as [$var_id, $original_location]) { - if ($var_id === $undefined_var_id) { - $parent_node = DataFlowNode::getForAssignment($var_id, $original_location); - - $this->data_flow_graph->addPath($parent_node, $use_node, '='); - } - } - } - - /** - * @return array - */ - public function getParentNodesForPossiblyUndefinedVariable(string $undefined_var_id): array - { - if (!$this->data_flow_graph) { - return []; - } - - $parent_nodes = []; - - foreach ($this->unused_var_locations as [$var_id, $original_location]) { - if ($var_id === $undefined_var_id) { - $assignment_node = DataFlowNode::getForAssignment($var_id, $original_location); - $parent_nodes[$assignment_node->id] = $assignment_node; - } - } - - return $parent_nodes; - } - - /** - * The first appearance of the variable in this set of statements being evaluated - */ - public function getFirstAppearance(string $var_id): ?CodeLocation - { - return $this->all_vars[$var_id] ?? null; - } - - public function getBranchPoint(string $var_id): ?int - { - return $this->var_branch_points[$var_id] ?? null; - } - - public function addVariableInitialization(string $var_id, int $branch_point): void - { - $this->vars_to_initialize[$var_id] = $branch_point; - } - - public function getFileAnalyzer(): FileAnalyzer - { - return $this->file_analyzer; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * @return array - */ - public function getFunctionAnalyzers(): array - { - return $this->function_analyzers; - } - - /** - * @param array $byref_uses - */ - public function setByRefUses(array $byref_uses): void - { - $this->byref_uses = $byref_uses; - } - - /** - * @return array> - */ - public function getUncaughtThrows(Context $context): array - { - $uncaught_throws = []; - - if ($context->collect_exceptions) { - if ($context->possibly_thrown_exceptions) { - $config = $this->codebase->config; - $ignored_exceptions = array_change_key_case( - $context->is_global ? - $config->ignored_exceptions_in_global_scope : - $config->ignored_exceptions - ); - $ignored_exceptions_and_descendants = array_change_key_case( - $context->is_global ? - $config->ignored_exceptions_and_descendants_in_global_scope : - $config->ignored_exceptions_and_descendants - ); - - foreach ($context->possibly_thrown_exceptions as $possibly_thrown_exception => $codelocations) { - if (isset($ignored_exceptions[strtolower($possibly_thrown_exception)])) { - continue; - } - - $is_expected = false; - - foreach ($ignored_exceptions_and_descendants as $expected_exception => $_) { - try { - if ($expected_exception === strtolower($possibly_thrown_exception) - || $this->codebase->classExtends($possibly_thrown_exception, $expected_exception) - || $this->codebase->interfaceExtends($possibly_thrown_exception, $expected_exception) - ) { - $is_expected = true; - break; - } - } catch (InvalidArgumentException $e) { - $is_expected = true; - break; - } - } - - if (!$is_expected) { - $uncaught_throws[$possibly_thrown_exception] = $codelocations; - } - } - } - } - - return $uncaught_throws; - } - - public function getFunctionAnalyzer(string $function_id): ?FunctionAnalyzer - { - return $this->function_analyzers[$function_id] ?? null; - } - - public function getParsedDocblock(): ?ParsedDocblock - { - return $this->parsed_docblock; - } - - public function getFQCLN(): ?string - { - if ($this->fake_this_class) { - return $this->fake_this_class; - } - - return parent::getFQCLN(); - } - - public function setFQCLN(string $fake_this_class): void - { - $this->fake_this_class = $fake_this_class; - } - - /** - * @return NodeDataProvider - */ - public function getNodeTypeProvider(): NodeTypeProvider - { - return $this->node_data; - } - - public function getFullyQualifiedFunctionMethodOrNamespaceName(): ?string - { - if ($this->source instanceof MethodAnalyzer) { - $fqcn = $this->getFQCLN(); - $method_name = $this->source->getFunctionLikeStorage($this)->cased_name; - assert($fqcn !== null && $method_name !== null); - - return "$fqcn::$method_name"; - } - - if ($this->source instanceof FunctionAnalyzer) { - $namespace = $this->getNamespace(); - $namespace = $namespace === "" ? "" : "$namespace\\"; - $function_name = $this->source->getFunctionLikeStorage($this)->cased_name; - assert($function_name !== null); - - return "{$namespace}{$function_name}"; - } - - return $this->getNamespace(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php deleted file mode 100644 index 1260c347..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php +++ /dev/null @@ -1,76 +0,0 @@ -source = $source; - $this->file_analyzer = $source->getFileAnalyzer(); - $this->aliases = $source->getAliases(); - $this->class = $class; - $this->fq_class_name = $fq_class_name; - $codebase = $source->getCodebase(); - $this->storage = $codebase->classlike_storage_provider->get($fq_class_name); - $this->aliases = $aliases; - } - - public function getNamespace(): ?string - { - return $this->aliases->namespace; - } - - public function getAliases(): Aliases - { - return $this->aliases; - } - - /** - * @return array - */ - public function getAliasedClassesFlipped(): array - { - return []; - } - - /** - * @return array - */ - public function getAliasedClassesFlippedReplaceable(): array - { - return []; - } - - public static function analyze(StatementsAnalyzer $statements_analyzer, Trait_ $stmt, Context $context): void - { - assert($stmt->name !== null); - $storage = $statements_analyzer->getCodebase()->classlike_storage_provider->get($stmt->name->name); - AttributesAnalyzer::analyze( - $statements_analyzer, - $context, - $storage, - $stmt->attrGroups, - AttributesAnalyzer::TARGET_CLASS, - $storage->suppressed_issues + $statements_analyzer->getSuppressedIssues() - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php deleted file mode 100644 index 2a8451c1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php +++ /dev/null @@ -1,118 +0,0 @@ - $new_types - * @param array $existing_types - * - * @return array - */ - public static function combineKeyedTypes(array $new_types, array $existing_types): array - { - $keys = array_merge(array_keys($new_types), array_keys($existing_types)); - $keys = array_unique($keys); - - $result_types = []; - - if (empty($new_types)) { - return $existing_types; - } - - if (empty($existing_types)) { - return $new_types; - } - - foreach ($keys as $key) { - if (!isset($existing_types[$key])) { - $result_types[$key] = $new_types[$key]; - continue; - } - - if (!isset($new_types[$key])) { - $result_types[$key] = $existing_types[$key]; - continue; - } - - $existing_var_types = $existing_types[$key]; - $new_var_types = $new_types[$key]; - - if ($new_var_types->getId() === $existing_var_types->getId()) { - $result_types[$key] = $new_var_types; - } else { - $result_types[$key] = Type::combineUnionTypes($new_var_types, $existing_var_types); - } - } - - return $result_types; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Clause.php b/vendor/vimeo/psalm/src/Psalm/Internal/Clause.php deleted file mode 100644 index 79969230..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Clause.php +++ /dev/null @@ -1,295 +0,0 @@ - ['falsy'], - * '$b' => ['!falsy'], - * '$c' => ['!null'], - * '$d' => ['string', 'int'] - * ] - * - * representing the formula - * - * !$a || $b || $c !== null || is_string($d) || is_int($d) - * - * @var array> - */ - public $possibilities; - - /** - * An array of things that are not true - * [ - * '$a' => ['!falsy'], - * '$b' => ['falsy'], - * '$c' => ['null'], - * '$d' => ['!string', '!int'] - * ] - * represents the formula - * - * $a && !$b && $c === null && !is_string($d) && !is_int($d) - * - * @var array>|null - */ - public $impossibilities; - - /** @var bool */ - public $wedge; - - /** @var bool */ - public $reconcilable; - - /** @var bool */ - public $generated = false; - - /** @var array */ - public $redefined_vars = []; - - /** @var string|int */ - public $hash; - - /** - * @param array> $possibilities - * @param array $redefined_vars - */ - public function __construct( - array $possibilities, - int $creating_conditional_id, - int $creating_object_id, - bool $wedge = false, - bool $reconcilable = true, - bool $generated = false, - array $redefined_vars = [] - ) { - $this->possibilities = $possibilities; - $this->wedge = $wedge; - $this->reconcilable = $reconcilable; - $this->generated = $generated; - $this->redefined_vars = $redefined_vars; - $this->creating_conditional_id = $creating_conditional_id; - $this->creating_object_id = $creating_object_id; - - if ($wedge || !$reconcilable) { - $this->hash = ($wedge ? 'w' : '') . $creating_object_id; - } else { - ksort($possibilities); - - foreach ($possibilities as $i => $v) { - if (count($v) < 2) { - continue; - } - sort($possibilities[$i]); - } - - $data = serialize($possibilities); - $this->hash = PHP_VERSION_ID >= 80100 ? hash('xxh128', $data) : hash('md4', $data); - } - } - - public function contains(Clause $other_clause): bool - { - if (count($other_clause->possibilities) > count($this->possibilities)) { - return false; - } - - foreach ($other_clause->possibilities as $var => $_) { - if (!isset($this->possibilities[$var])) { - return false; - } - } - - foreach ($other_clause->possibilities as $var => $possible_types) { - if (count(array_diff($possible_types, $this->possibilities[$var]))) { - return false; - } - } - - return true; - } - - /** - * @psalm-mutation-free - */ - public function __toString(): string - { - $clause_strings = array_map( - /** - * @param non-empty-list $values - */ - function (string $var_id, array $values): string { - if ($var_id[0] === '*') { - $var_id = ''; - } - - $var_id_clauses = array_map( - function (string $value) use ($var_id): string { - if ($value === 'falsy') { - return '!' . $var_id; - } - - if ($value === '!falsy') { - return $var_id; - } - - $negate = false; - - if ($value[0] === '!') { - $negate = true; - $value = substr($value, 1); - } - - if ($value[0] === '=') { - $value = substr($value, 1); - } - - if ($negate) { - return $var_id . ' is not ' . $value; - } - - return $var_id . ' is ' . $value; - }, - $values - ); - - if (count($var_id_clauses) > 1) { - return '(' . implode(') || (', $var_id_clauses) . ')'; - } - - return $var_id_clauses[0]; - }, - array_keys($this->possibilities), - array_values($this->possibilities) - ); - - if (count($clause_strings) > 1) { - return '(' . implode(') || (', $clause_strings) . ')'; - } - - return reset($clause_strings); - } - - public function makeUnique(): self - { - $possibilities = $this->possibilities; - - foreach ($possibilities as $var_id => $var_possibilities) { - $possibilities[$var_id] = array_values(array_unique($var_possibilities)); - } - - return new self( - $possibilities, - $this->creating_conditional_id, - $this->creating_object_id, - $this->wedge, - $this->reconcilable, - $this->generated, - $this->redefined_vars - ); - } - - public function removePossibilities(string $var_id): ?self - { - $possibilities = $this->possibilities; - unset($possibilities[$var_id]); - - if (!$possibilities) { - return null; - } - - return new self( - $possibilities, - $this->creating_conditional_id, - $this->creating_object_id, - $this->wedge, - $this->reconcilable, - $this->generated, - $this->redefined_vars - ); - } - - /** - * @param non-empty-list $clause_var_possibilities - */ - public function addPossibilities(string $var_id, array $clause_var_possibilities): self - { - $possibilities = $this->possibilities; - $possibilities[$var_id] = $clause_var_possibilities; - - return new self( - $possibilities, - $this->creating_conditional_id, - $this->creating_object_id, - $this->wedge, - $this->reconcilable, - $this->generated, - $this->redefined_vars - ); - } - - public function calculateNegation(): self - { - if ($this->impossibilities !== null) { - return $this; - } - - $impossibilities = []; - - foreach ($this->possibilities as $var_id => $possibility) { - $impossibility = []; - - foreach ($possibility as $type) { - if (($type[0] !== '=' && $type[0] !== '~' - && (!isset($type[1]) || ($type[1] !== '=' && $type[1] !== '~'))) - || strpos($type, '(') - || strpos($type, 'getclass-') - ) { - $impossibility[] = Algebra::negateType($type); - } - } - - if ($impossibility) { - $impossibilities[$var_id] = $impossibility; - } - } - - $clause = clone $this; - - $clause->impossibilities = $impossibilities; - - return $clause; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php deleted file mode 100644 index e8689ee9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php +++ /dev/null @@ -1,323 +0,0 @@ - $argv */ - public static function run(array $argv): void - { - gc_disable(); - ErrorHandler::install(); - $valid_short_options = [ - 'h', - 'v', - 'c:', - 'r:', - ]; - - $valid_long_options = [ - 'clear-cache', - 'config:', - 'find-dead-code', - 'help', - 'root:', - 'use-ini-defaults', - 'version', - 'tcp:', - 'tcp-server', - 'disable-on-change::', - 'enable-autocomplete::', - 'use-extended-diagnostic-codes', - 'verbose' - ]; - - $args = array_slice($argv, 1); - - $psalm_proxy = array_search('--language-server', $args, true); - - if ($psalm_proxy !== false) { - unset($args[$psalm_proxy]); - } - - array_map( - function (string $arg) use ($valid_long_options): void { - if (strpos($arg, '--') === 0 && $arg !== '--') { - $arg_name = preg_replace('/=.*$/', '', substr($arg, 2)); - - if (!in_array($arg_name, $valid_long_options, true) - && !in_array($arg_name . ':', $valid_long_options, true) - && !in_array($arg_name . '::', $valid_long_options, true) - ) { - fwrite( - STDERR, - 'Unrecognised argument "--' . $arg_name . '"' . PHP_EOL - . 'Type --help to see a list of supported arguments' . PHP_EOL - ); - error_log('Bad argument'); - exit(1); - } - } - }, - $args - ); - - // get options from command line - $options = getopt(implode('', $valid_short_options), $valid_long_options); - - if (!array_key_exists('use-ini-defaults', $options)) { - ini_set('display_errors', '1'); - ini_set('display_startup_errors', '1'); - ini_set('memory_limit', (string) (8 * 1024 * 1024 * 1024)); - } - - if (array_key_exists('help', $options)) { - $options['h'] = false; - } - - if (array_key_exists('version', $options)) { - $options['v'] = false; - } - - if (isset($options['config'])) { - $options['c'] = $options['config']; - } - - if (isset($options['c']) && is_array($options['c'])) { - fwrite(STDERR, 'Too many config files provided' . PHP_EOL); - exit(1); - } - - if (array_key_exists('h', $options)) { - echo <<runAndCollect( - // we ignore the FQN because of a hack in scoper.inc that needs full path - // phpcs:ignore SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly.ReferenceViaFullyQualifiedName - function () use ($current_dir, $options, $vendor_dir): ?\Composer\Autoload\ClassLoader { - return CliUtils::requireAutoloaders($current_dir, isset($options['r']), $vendor_dir); - } - ); - - if (array_key_exists('v', $options)) { - echo 'Psalm ' . PSALM_VERSION . PHP_EOL; - exit; - } - - $ini_handler = new PsalmRestarter('PSALM'); - - $ini_handler->disableExtension('grpc'); - - // If Xdebug is enabled, restart without it - $ini_handler->check(); - - setlocale(LC_CTYPE, 'C'); - - $path_to_config = CliUtils::getPathToConfig($options); - - if (isset($options['tcp'])) { - if (!is_string($options['tcp'])) { - fwrite(STDERR, 'tcp url should be a string' . PHP_EOL); - exit(1); - } - } - - $find_unused_code = isset($options['find-dead-code']) ? 'auto' : null; - - $config = CliUtils::initializeConfig( - $path_to_config, - $current_dir, - Report::TYPE_CONSOLE, - $first_autoloader - ); - $config->setIncludeCollector($include_collector); - - if ($config->resolve_from_config_file) { - $current_dir = $config->base_dir; - chdir($current_dir); - } - - $config->setServerMode(); - - if (isset($options['clear-cache'])) { - $cache_directory = $config->getCacheDirectory(); - - if ($cache_directory !== null) { - Config::removeCacheDirectory($cache_directory); - } - echo 'Cache directory deleted' . PHP_EOL; - exit; - } - - $providers = new Providers( - new FileProvider, - new ParserCacheProvider($config), - new FileStorageCacheProvider($config), - new ClassLikeStorageCacheProvider($config), - new FileReferenceCacheProvider($config), - new ProjectCacheProvider(Composer::getLockFilePath($current_dir)) - ); - - $project_analyzer = new ProjectAnalyzer( - $config, - $providers - ); - - if ($config->find_unused_variables) { - $project_analyzer->getCodebase()->reportUnusedVariables(); - } - - if ($config->find_unused_code) { - $find_unused_code = 'auto'; - } - - if (isset($options['disable-on-change'])) { - $project_analyzer->onchange_line_limit = (int) $options['disable-on-change']; - } - - $project_analyzer->provide_completion = !isset($options['enable-autocomplete']) - || !is_string($options['enable-autocomplete']) - || strtolower($options['enable-autocomplete']) !== 'false'; - - if ($find_unused_code) { - $project_analyzer->getCodebase()->reportUnusedCode($find_unused_code); - } - - if (isset($options['use-extended-diagnostic-codes'])) { - $project_analyzer->language_server_use_extended_diagnostic_codes = true; - } - - if (isset($options['verbose'])) { - $project_analyzer->language_server_verbose = true; - } - - $project_analyzer->server($options['tcp'] ?? null, isset($options['tcp-server'])); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php deleted file mode 100644 index 5a891853..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php +++ /dev/null @@ -1,46 +0,0 @@ -addCommands([ - new ShowCommand($plugin_list_factory), - new EnableCommand($plugin_list_factory), - new DisableCommand($plugin_list_factory), - ]); - - $app->setDefaultCommand('show'); - $app->run(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php deleted file mode 100644 index 86031b7b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php +++ /dev/null @@ -1,1176 +0,0 @@ - $argv - */ - public static function run(array $argv): void - { - gc_collect_cycles(); - gc_disable(); - - ErrorHandler::install(); - - $args = array_slice($argv, 1); - - // get options from command line - $options = getopt(implode('', self::SHORT_OPTIONS), self::LONG_OPTIONS); - if (false === $options) { - throw new RuntimeException('Failed to parse CLI options'); - } - - self::forwardCliCall($options, $argv); - - self::validateCliArguments($args); - - self::setMemoryLimit($options); - - self::syncShortOptions($options); - - if (isset($options['c']) && is_array($options['c'])) { - fwrite(STDERR, 'Too many config files provided' . PHP_EOL); - exit(1); - } - - - if (array_key_exists('h', $options)) { - echo CliUtils::getPsalmHelpText(); - /* - --shepherd[=host] - Send data to Shepherd, Psalm's GitHub integration tool. - `host` is the location of the Shepherd server. It defaults to shepherd.dev - More information is available at https://psalm.dev/shepherd - */ - - exit; - } - - $current_dir = self::getCurrentDir($options); - - $path_to_config = CliUtils::getPathToConfig($options); - - $vendor_dir = CliUtils::getVendorDir($current_dir); - - // capture environment before registering autoloader (it may destroy it) - IssueBuffer::captureServer($_SERVER); - - $include_collector = new IncludeCollector(); - $first_autoloader = $include_collector->runAndCollect( - // we ignore the FQN because of a hack in scoper.inc that needs full path - // phpcs:ignore SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly.ReferenceViaFullyQualifiedName - function () use ($current_dir, $options, $vendor_dir): ?\Composer\Autoload\ClassLoader { - return CliUtils::requireAutoloaders($current_dir, isset($options['r']), $vendor_dir); - } - ); - - $run_taint_analysis = self::shouldRunTaintAnalysis($options); - - if (array_key_exists('v', $options)) { - echo 'Psalm ' . PSALM_VERSION . PHP_EOL; - exit; - } - - $output_format = self::initOutputFormat($options); - - [$config, $init_source_dir] = self::initConfig( - $current_dir, - $args, - $vendor_dir, - $first_autoloader, - $path_to_config, - $output_format, - $run_taint_analysis, - $options - ); - - $config->setIncludeCollector($include_collector); - - $in_ci = CliUtils::runningInCI(); // disable progressbar on CI - - if ($in_ci) { - $options['long-progress'] = true; - } - - $threads = self::detectThreads($options, $config, $in_ci); - - self::emitMacPcreWarning($options, $threads); - - self::restart($options, $config, $threads); - - if (isset($options['debug-emitted-issues'])) { - $config->debug_emitted_issues = true; - } - - - setlocale(LC_CTYPE, 'C'); - - if (isset($options['set-baseline'])) { - if (is_array($options['set-baseline'])) { - die('Only one baseline file can be created at a time' . PHP_EOL); - } - } - - $paths_to_check = CliUtils::getPathsToCheck($options['f'] ?? null); - - if ($config->resolve_from_config_file) { - $current_dir = $config->base_dir; - chdir($current_dir); - } - - $plugins = []; - - if (isset($options['plugin'])) { - $plugins = $options['plugin']; - - if (!is_array($plugins)) { - $plugins = [$plugins]; - } - } - - $show_info = self::initShowInfo($options); - - $is_diff = self::initIsDiff($options); - - $find_unused_code = self::shouldFindUnusedCode($options, $config); - - $find_unused_variables = isset($options['find-unused-variables']); - - $find_references_to = isset($options['find-references-to']) && is_string($options['find-references-to']) - ? $options['find-references-to'] - : null; - - if (isset($options['shepherd']) || getenv('PSALM_SHEPHERD')) { - if (isset($options['shepherd'])) { - if (is_string($options['shepherd'])) { - $config->shepherd_host = $options['shepherd']; - } - } elseif (getenv('PSALM_SHEPHERD')) { - if (false !== ($shepherd_host = getenv('PSALM_SHEPHERD_HOST'))) { - $config->shepherd_host = $shepherd_host; - } - } - $shepherd_plugin = Path::canonicalize(__DIR__ . '/../../Plugin/Shepherd.php'); - - if (!file_exists($shepherd_plugin)) { - die('Could not find Shepherd plugin location ' . $shepherd_plugin . PHP_EOL); - } - - $plugins[] = $shepherd_plugin; - } - - if (isset($options['clear-cache'])) { - self::clearCache($config); - } - - if (isset($options['clear-global-cache'])) { - self::clearGlobalCache($config); - } - - $progress = self::initProgress($options, $config); - $providers = self::initProviders($options, $config, $current_dir); - - $stdout_report_options = self::initStdoutReportOptions($options, $show_info, $output_format, $in_ci); - - /** @var list|string $report_file_paths type guaranteed by argument to getopt() */ - $report_file_paths = $options['report'] ?? []; - if (is_string($report_file_paths)) { - $report_file_paths = [$report_file_paths]; - } - - $project_analyzer = new ProjectAnalyzer( - $config, - $providers, - $stdout_report_options, - ProjectAnalyzer::getFileReportOptions( - $report_file_paths, - isset($options['report-show-info']) - ? $options['report-show-info'] !== 'false' && $options['report-show-info'] !== '0' - : true - ), - $threads, - $progress - ); - - CliUtils::initPhpVersion($options, $config, $project_analyzer); - - $start_time = microtime(true); - - self::configureProjectAnalyzer( - $options, - $config, - $project_analyzer, - $find_references_to, - $find_unused_code, - $find_unused_variables, - $run_taint_analysis - ); - - if ($config->run_taint_analysis || $run_taint_analysis) { - $is_diff = false; - } - - /** @var string $plugin_path */ - foreach ($plugins as $plugin_path) { - $config->addPluginPath($plugin_path); - } - - if ($paths_to_check === null) { - $project_analyzer->check($current_dir, $is_diff); - } elseif ($paths_to_check) { - $project_analyzer->checkPaths($paths_to_check); - } - - if ($find_references_to) { - $project_analyzer->findReferencesTo($find_references_to); - } - - self::storeFlowGraph($options, $project_analyzer); - - if (isset($options['generate-json-map']) && is_string($options['generate-json-map'])) { - self::storeTypeMap($providers, $config, $options['generate-json-map']); - } - - if (isset($options['generate-stubs'])) { - self::generateStubs($options, $providers, $project_analyzer); - } - - if (!isset($options['i'])) { - IssueBuffer::finish( - $project_analyzer, - !$paths_to_check, - $start_time, - isset($options['stats']), - self::initBaseline($options, $config, $current_dir, $path_to_config) - ); - } else { - self::autoGenerateConfig($project_analyzer, $current_dir, $init_source_dir, $vendor_dir); - } - } - - private static function initOutputFormat(array $options): string - { - return isset($options['output-format']) && is_string($options['output-format']) - ? $options['output-format'] - : Report::TYPE_CONSOLE; - } - - private static function initShowInfo(array $options): bool - { - return isset($options['show-info']) - ? $options['show-info'] === 'true' || $options['show-info'] === '1' - : false; - } - - private static function initIsDiff(array $options): bool - { - return !isset($options['no-diff']) - && !isset($options['set-baseline']) - && !isset($options['update-baseline']); - } - - /** - * @param array $args - */ - private static function validateCliArguments(array $args): void - { - array_map( - function (string $arg): void { - if (strpos($arg, '--') === 0 && $arg !== '--') { - $arg_name = preg_replace('/=.*$/', '', substr($arg, 2)); - - if (!in_array($arg_name, self::LONG_OPTIONS) - && !in_array($arg_name . ':', self::LONG_OPTIONS) - && !in_array($arg_name . '::', self::LONG_OPTIONS) - ) { - fwrite( - STDERR, - 'Unrecognised argument "--' . $arg_name . '"' . PHP_EOL - . 'Type --help to see a list of supported arguments'. PHP_EOL - ); - exit(1); - } - } elseif (strpos($arg, '-') === 0 && $arg !== '-' && $arg !== '--') { - $arg_name = preg_replace('/=.*$/', '', substr($arg, 1)); - - if (!in_array($arg_name, self::SHORT_OPTIONS) - && !in_array($arg_name . ':', self::SHORT_OPTIONS) - ) { - fwrite( - STDERR, - 'Unrecognised argument "-' . $arg_name . '"' . PHP_EOL - . 'Type --help to see a list of supported arguments'. PHP_EOL - ); - exit(1); - } - } - }, - $args - ); - } - - /** - * @param array> $options - */ - private static function setMemoryLimit(array $options): void - { - if (!array_key_exists('use-ini-defaults', $options)) { - ini_set('display_errors', 'stderr'); - ini_set('display_startup_errors', '1'); - - $memoryLimit = (8 * 1024 * 1024 * 1024); - - if (array_key_exists('memory-limit', $options)) { - $memoryLimit = $options['memory-limit']; - - if (!is_scalar($memoryLimit)) { - throw new ConfigException('Invalid memory limit specified.'); - } - } - - ini_set('memory_limit', (string) $memoryLimit); - } - } - - /** - * @param array $args - */ - private static function generateConfig(string $current_dir, array &$args): void - { - if (file_exists($current_dir . 'psalm.xml')) { - die('A config file already exists in the current directory' . PHP_EOL); - } - - $args = array_values(array_filter( - $args, - function (string $arg): bool { - return $arg !== '--ansi' - && $arg !== '--no-ansi' - && $arg !== '-i' - && $arg !== '--init' - && $arg !== '--debug' - && $arg !== '--debug-by-line' - && $arg !== '--debug-emitted-issues' - && strpos($arg, '--disable-extension=') !== 0 - && strpos($arg, '--root=') !== 0 - && strpos($arg, '--r=') !== 0; - } - )); - - $init_level = null; - $init_source_dir = null; - if (count($args)) { - if (count($args) > 2) { - die('Too many arguments provided for psalm --init' . PHP_EOL); - } - - if (isset($args[1])) { - if (!preg_match('/^[1-8]$/', $args[1])) { - die('Config strictness must be a number between 1 and 8 inclusive' . PHP_EOL); - } - - $init_level = (int)$args[1]; - } - - $init_source_dir = $args[0]; - } - - $vendor_dir = CliUtils::getVendorDir($current_dir); - - if (null !== $init_level) { - try { - $template_contents = Creator::getContents( - $current_dir, - $init_source_dir, - $init_level, - $vendor_dir - ); - } catch (ConfigCreationException $e) { - die($e->getMessage() . PHP_EOL); - } - - if (!file_put_contents($current_dir . 'psalm.xml', $template_contents)) { - die('Could not write to psalm.xml' . PHP_EOL); - } - - exit('Config file created successfully. Please re-run psalm.' . PHP_EOL); - } - } - - private static function loadConfig( - ?string $path_to_config, - string $current_dir, - string $output_format, - ?ClassLoader $first_autoloader, - bool $run_taint_analysis, - array $options - ): Config { - $config = CliUtils::initializeConfig( - $path_to_config, - $current_dir, - $output_format, - $first_autoloader, - $run_taint_analysis - ); - - if (isset($options['error-level']) - && is_numeric($options['error-level']) - ) { - $config_level = (int) $options['error-level']; - - if (!in_array($config_level, [1, 2, 3, 4, 5, 6, 7, 8], true)) { - throw new ConfigException( - 'Invalid error level ' . $config_level - ); - } - - $config->level = $config_level; - } - return $config; - } - - private static function initProgress(array $options, Config $config): Progress - { - $debug = array_key_exists('debug', $options) || array_key_exists('debug-by-line', $options); - - $show_info = isset($options['show-info']) - ? $options['show-info'] === 'true' || $options['show-info'] === '1' - : false; - - if ($debug) { - $progress = new DebugProgress(); - } elseif (isset($options['no-progress'])) { - $progress = new VoidProgress(); - } else { - $show_errors = !$config->error_baseline || isset($options['ignore-baseline']); - if (isset($options['long-progress'])) { - $progress = new LongProgress($show_errors, $show_info); - } else { - $progress = new DefaultProgress($show_errors, $show_info); - } - } - return $progress; - } - - private static function initProviders(array $options, Config $config, string $current_dir): Providers - { - if (isset($options['no-cache']) || isset($options['i'])) { - $providers = new Providers( - new FileProvider - ); - } else { - $no_reflection_cache = isset($options['no-reflection-cache']); - $no_file_cache = isset($options['no-file-cache']); - - $file_storage_cache_provider = $no_reflection_cache - ? null - : new FileStorageCacheProvider($config); - - $classlike_storage_cache_provider = $no_reflection_cache - ? null - : new ClassLikeStorageCacheProvider($config); - - $providers = new Providers( - new FileProvider, - new ParserCacheProvider($config, !$no_file_cache), - $file_storage_cache_provider, - $classlike_storage_cache_provider, - new FileReferenceCacheProvider($config), - new ProjectCacheProvider(Composer::getLockFilePath($current_dir)) - ); - } - return $providers; - } - - /** - * @param array{set-baseline:string} $options - * @return array}>> - */ - private static function generateBaseline( - array $options, - Config $config, - string $current_dir, - ?string $path_to_config - ): array { - fwrite(STDERR, 'Writing error baseline to file...' . PHP_EOL); - - try { - $issue_baseline = ErrorBaseline::read( - new FileProvider, - $options['set-baseline'] - ); - } catch (ConfigException $e) { - $issue_baseline = []; - } - - ErrorBaseline::create( - new FileProvider, - $options['set-baseline'], - IssueBuffer::getIssuesData(), - $config->include_php_versions_in_error_baseline || isset($options['include-php-versions']) - ); - - fwrite(STDERR, "Baseline saved to {$options['set-baseline']}."); - - CliUtils::updateConfigFile( - $config, - $path_to_config ?? $current_dir, - $options['set-baseline'] - ); - - fwrite(STDERR, PHP_EOL); - - return $issue_baseline; - } - - /** - * @return array}>> - */ - private static function updateBaseline(array $options, Config $config): array - { - $baselineFile = $config->error_baseline; - - if (empty($baselineFile)) { - die('Cannot update baseline, because no baseline file is configured.' . PHP_EOL); - } - - try { - $issue_current_baseline = ErrorBaseline::read( - new FileProvider, - $baselineFile - ); - $total_issues_current_baseline = ErrorBaseline::countTotalIssues($issue_current_baseline); - - $issue_baseline = ErrorBaseline::update( - new FileProvider, - $baselineFile, - IssueBuffer::getIssuesData(), - $config->include_php_versions_in_error_baseline || isset($options['include-php-versions']) - ); - $total_issues_updated_baseline = ErrorBaseline::countTotalIssues($issue_baseline); - - $total_fixed_issues = $total_issues_current_baseline - $total_issues_updated_baseline; - - if ($total_fixed_issues > 0) { - echo str_repeat('-', 30) . "\n"; - echo $total_fixed_issues . ' errors fixed' . "\n"; - } - } catch (ConfigException $exception) { - fwrite(STDERR, 'Could not update baseline file: ' . $exception->getMessage() . PHP_EOL); - exit(1); - } - - return $issue_baseline; - } - - private static function storeTypeMap(Providers $providers, Config $config, string $type_map_location): void - { - $file_map = $providers->file_reference_provider->getFileMaps(); - - $name_file_map = []; - - $expected_references = []; - - foreach ($file_map as $file_path => $map) { - $file_name = $config->shortenFileName($file_path); - foreach ($map[0] as $map_parts) { - $expected_references[$map_parts[1]] = true; - } - $map[2] = []; - $name_file_map[$file_name] = $map; - } - - $reference_dictionary = ReferenceMapGenerator::getReferenceMap( - $providers->classlike_storage_provider, - $expected_references - ); - - $type_map_string = json_encode(['files' => $name_file_map, 'references' => $reference_dictionary]); - - $providers->file_provider->setContents( - $type_map_location, - $type_map_string - ); - } - - private static function autoGenerateConfig( - ProjectAnalyzer $project_analyzer, - string $current_dir, - ?string $init_source_dir, - string $vendor_dir - ): void { - $issues_by_file = IssueBuffer::getIssuesData(); - - if (!$issues_by_file) { - $init_level = 1; - } else { - $codebase = $project_analyzer->getCodebase(); - $mixed_counts = $codebase->analyzer->getTotalTypeCoverage($codebase); - - $init_level = Creator::getLevel( - array_merge(...array_values($issues_by_file)), - array_sum($mixed_counts) - ); - } - - echo "\n" . 'Detected level ' . $init_level . ' as a suitable initial default' . "\n"; - - try { - $template_contents = Creator::getContents( - $current_dir, - $init_source_dir, - $init_level, - $vendor_dir - ); - } catch (ConfigCreationException $e) { - die($e->getMessage() . PHP_EOL); - } - - if (!file_put_contents($current_dir . 'psalm.xml', $template_contents)) { - die('Could not write to psalm.xml' . PHP_EOL); - } - - exit('Config file created successfully. Please re-run psalm.' . PHP_EOL); - } - - private static function initStdoutReportOptions( - array $options, - bool $show_info, - string $output_format, - bool $in_ci - ): ReportOptions { - $stdout_report_options = new ReportOptions(); - $stdout_report_options->use_color = !array_key_exists('m', $options); - $stdout_report_options->show_info = $show_info; - $stdout_report_options->show_suggestions = !array_key_exists('no-suggestions', $options); - /** - * @psalm-suppress PropertyTypeCoercion - */ - $stdout_report_options->format = $output_format; - $stdout_report_options->show_snippet = !isset($options['show-snippet']) || $options['show-snippet'] !== "false"; - $stdout_report_options->pretty = isset($options['pretty-print']) && $options['pretty-print'] !== "false"; - $stdout_report_options->in_ci = $in_ci; - - return $stdout_report_options; - } - - /** @return never */ - private static function clearGlobalCache(Config $config): void - { - $cache_directory = $config->getGlobalCacheDirectory(); - - if ($cache_directory) { - Config::removeCacheDirectory($cache_directory); - echo 'Global cache directory deleted' . PHP_EOL; - } - - exit; - } - - /** @return never */ - private static function clearCache(Config $config): void - { - $cache_directory = $config->getCacheDirectory(); - - if ($cache_directory !== null) { - Config::removeCacheDirectory($cache_directory); - } - echo 'Cache directory deleted' . PHP_EOL; - exit; - } - - private static function getCurrentDir(array $options): string - { - $cwd = getcwd(); - if (false === $cwd) { - fwrite(STDERR, 'Cannot get current working directory' . PHP_EOL); - exit(1); - } - - $current_dir = $cwd . DIRECTORY_SEPARATOR; - - if (isset($options['r']) && is_string($options['r'])) { - $root_path = realpath($options['r']); - - if (!$root_path) { - fwrite( - STDERR, - 'Could not locate root directory ' . $current_dir . DIRECTORY_SEPARATOR . $options['r'] . PHP_EOL - ); - exit(1); - } - - $current_dir = $root_path . DIRECTORY_SEPARATOR; - } - - return $current_dir; - } - - private static function emitMacPcreWarning(array $options, int $threads): void - { - if (!isset($options['threads']) - && !isset($options['debug']) - && $threads === 1 - && ini_get('pcre.jit') === '1' - && PHP_OS === 'Darwin' - && version_compare(PHP_VERSION, '7.3.0') >= 0 - && version_compare(PHP_VERSION, '7.4.0') < 0 - ) { - echo( - 'If you want to run Psalm as a language server, or run Psalm with' . PHP_EOL - . 'multiple processes (--threads=4), beware:' . PHP_EOL - . Pool::MAC_PCRE_MESSAGE . PHP_EOL . PHP_EOL - ); - } - } - - private static function restart(array $options, Config $config, int $threads): void - { - $ini_handler = new PsalmRestarter('PSALM'); - - if (isset($options['disable-extension'])) { - if (is_array($options['disable-extension'])) { - /** @psalm-suppress MixedAssignment */ - foreach ($options['disable-extension'] as $extension) { - if (is_string($extension)) { - $ini_handler->disableExtension($extension); - } - } - } elseif (is_string($options['disable-extension'])) { - $ini_handler->disableExtension($options['disable-extension']); - } - } - - if ($threads > 1) { - $ini_handler->disableExtension('grpc'); - } - - $ini_handler->disableExtension('uopz'); - - // If Xdebug is enabled, restart without it - $ini_handler->check(); - - if ($config->load_xdebug_stub === null && PsalmRestarter::getSkippedVersion() !== '') { - $config->load_xdebug_stub = true; - } - } - - private static function detectThreads(array $options, Config $config, bool $in_ci): int - { - if (isset($options['threads'])) { - $threads = (int)$options['threads']; - } elseif (isset($options['debug']) || $in_ci) { - $threads = 1; - } elseif ($config->threads) { - $threads = $config->threads; - } else { - $threads = max(1, ProjectAnalyzer::getCpuCount() - 1); - } - return $threads; - } - - /** @psalm-suppress UnusedParam $argv is being reported as unused */ - private static function forwardCliCall(array $options, array $argv): void - { - if (isset($options['alter'])) { - require_once __DIR__ . '/Psalter.php'; - Psalter::run($argv); - exit; - } - - if (isset($options['language-server'])) { - require_once __DIR__ . '/LanguageServer.php'; - LanguageServer::run($argv); - exit; - } - - if (isset($options['refactor'])) { - require_once __DIR__ . '/Refactor.php'; - Refactor::run($argv); - exit; - } - } - - /** - * @param array|string> $options - * @param-out array|string> $options - */ - private static function syncShortOptions(array &$options): void - { - if (array_key_exists('help', $options)) { - $options['h'] = false; - } - - if (array_key_exists('version', $options)) { - $options['v'] = false; - } - - if (array_key_exists('init', $options)) { - $options['i'] = false; - } - - if (array_key_exists('monochrome', $options)) { - $options['m'] = false; - } - - if (isset($options['config'])) { - $options['c'] = $options['config']; - } - - if (isset($options['root'])) { - $options['r'] = $options['root']; - } - } - - /** - * @param array $args - * @return array{Config,?string} - */ - private static function initConfig( - string $current_dir, - array $args, - string $vendor_dir, - ?ClassLoader $first_autoloader, - ?string $path_to_config, - string $output_format, - bool $run_taint_analysis, - array $options - ): array { - $init_source_dir = null; - if (isset($options['i'])) { - self::generateConfig($current_dir, $args); - // if we ever got here, it means we need to run Psalm once and generate the config - // based on the errors we find - $init_source_dir = $args[0] ?? null; - - echo "Calculating best config level based on project files\n"; - Creator::createBareConfig($current_dir, $init_source_dir, $vendor_dir); - $config = Config::getInstance(); - $config->setComposerClassLoader($first_autoloader); - } else { - $config = self::loadConfig( - $path_to_config, - $current_dir, - $output_format, - $first_autoloader, - $run_taint_analysis, - $options - ); - } - return [$config, $init_source_dir]; - } - - /** - * @return array}>> - */ - private static function initBaseline( - array $options, - Config $config, - string $current_dir, - ?string $path_to_config - ): array { - $issue_baseline = []; - - if (isset($options['set-baseline']) && is_string($options['set-baseline'])) { - $issue_baseline = self::generateBaseline($options, $config, $current_dir, $path_to_config); - } - - if (isset($options['use-baseline'])) { - if (!is_string($options['use-baseline'])) { - fwrite(STDERR, '--use-baseline must be a string' . PHP_EOL); - exit(1); - } - - $baseline_file_path = $options['use-baseline']; - $config->error_baseline = $baseline_file_path; - } else { - $baseline_file_path = $config->error_baseline; - } - - if (isset($options['update-baseline'])) { - $issue_baseline = self::updateBaseline($options, $config); - } - - if (!$issue_baseline && $baseline_file_path && !isset($options['ignore-baseline'])) { - try { - $issue_baseline = ErrorBaseline::read( - new FileProvider, - $baseline_file_path - ); - } catch (ConfigException $exception) { - fwrite(STDERR, 'Error while reading baseline: ' . $exception->getMessage() . PHP_EOL); - exit(1); - } - } - - return $issue_baseline; - } - - private static function storeFlowGraph(array $options, ProjectAnalyzer $project_analyzer): void - { - /** @var string|null $dump_taint_graph */ - $dump_taint_graph = $options['dump-taint-graph'] ?? null; - - $flow_graph = $project_analyzer->getCodebase()->taint_flow_graph; - if ($flow_graph !== null && $dump_taint_graph !== null) { - file_put_contents($dump_taint_graph, "digraph Taints {\n\t". - implode("\n\t", array_map( - function (array $edges) { - return '"'.implode('" -> "', $edges).'"'; - }, - $flow_graph->summarizeEdges() - )) . - "\n}\n"); - } - } - - /** @return false|'always'|'auto' */ - private static function shouldFindUnusedCode(array $options, Config $config) - { - $find_unused_code = false; - if (isset($options['find-dead-code'])) { - $options['find-unused-code'] = $options['find-dead-code'] === 'always' ? 'always' : 'auto'; - } - - if (isset($options['find-unused-code'])) { - if ($options['find-unused-code'] === 'always') { - $find_unused_code = 'always'; - } else { - $find_unused_code = 'auto'; - } - } - - if ($config->find_unused_code) { - $find_unused_code = 'auto'; - } - - return $find_unused_code; - } - - private static function shouldRunTaintAnalysis(array $options): bool - { - return (isset($options['track-tainted-input']) - || isset($options['security-analysis']) - || isset($options['taint-analysis'])); - } - - /** - * @param string|bool|null $find_references_to - * @param false|'always'|'auto' $find_unused_code - */ - private static function configureProjectAnalyzer( - array $options, - Config $config, - ProjectAnalyzer $project_analyzer, - $find_references_to, - $find_unused_code, - bool $find_unused_variables, - bool $run_taint_analysis - ): void { - if (isset($options['generate-json-map']) && is_string($options['generate-json-map'])) { - $project_analyzer->getCodebase()->store_node_types = true; - } - - if (array_key_exists('debug-by-line', $options)) { - $project_analyzer->debug_lines = true; - } - - if (array_key_exists('debug-performance', $options)) { - $project_analyzer->debug_performance = true; - } - - if ($find_references_to !== null) { - $project_analyzer->getCodebase()->collectLocations(); - $project_analyzer->show_issues = false; - } - - if ($find_unused_code) { - $project_analyzer->getCodebase()->reportUnusedCode($find_unused_code); - } - - if ($config->find_unused_variables || $find_unused_variables) { - $project_analyzer->getCodebase()->reportUnusedVariables(); - } - - if ($config->run_taint_analysis || $run_taint_analysis) { - $project_analyzer->trackTaintedInputs(); - } - - if ($config->find_unused_psalm_suppress || isset($options['find-unused-psalm-suppress'])) { - $project_analyzer->trackUnusedSuppressions(); - } - } - - private static function generateStubs( - array $options, - Providers $providers, - ProjectAnalyzer $project_analyzer - ): void { - if (isset($options['generate-stubs']) && is_string($options['generate-stubs'])) { - $stubs_location = $options['generate-stubs']; - - $providers->file_provider->setContents( - $stubs_location, - StubsGenerator::getAll( - $project_analyzer->getCodebase(), - $providers->classlike_storage_provider, - $providers->file_storage_provider - ) - ); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php deleted file mode 100644 index a2949147..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php +++ /dev/null @@ -1,578 +0,0 @@ - $argv */ - public static function run(array $argv): void - { - gc_collect_cycles(); - gc_disable(); - - ErrorHandler::install(); - - self::setMemoryLimit(); - - $args = array_slice($argv, 1); - - // get options from command line - $options = getopt(implode('', self::SHORT_OPTIONS), self::LONG_OPTIONS); - - self::validateCliArguments($args); - - self::syncShortOptions($options); - - if (isset($options['c']) && is_array($options['c'])) { - die('Too many config files provided' . PHP_EOL); - } - - if (array_key_exists('h', $options)) { - echo <<runAndCollect( - // we ignore the FQN because of a hack in scoper.inc that needs full path - // phpcs:ignore SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly.ReferenceViaFullyQualifiedName - function () use ($current_dir, $options, $vendor_dir): ?\Composer\Autoload\ClassLoader { - return CliUtils::requireAutoloaders($current_dir, isset($options['r']), $vendor_dir); - } - ); - - - // If Xdebug is enabled, restart without it - (new XdebugHandler('PSALTER'))->check(); - - $paths_to_check = CliUtils::getPathsToCheck($options['f'] ?? null); - - $path_to_config = CliUtils::getPathToConfig($options); - - $config = CliUtils::initializeConfig( - $path_to_config, - $current_dir, - Report::TYPE_CONSOLE, - $first_autoloader - ); - $config->setIncludeCollector($include_collector); - - if ($config->resolve_from_config_file) { - $current_dir = $config->base_dir; - chdir($current_dir); - } - - $threads = isset($options['threads']) ? (int)$options['threads'] : 1; - - if (isset($options['no-cache'])) { - $providers = new Providers( - new FileProvider() - ); - } else { - $providers = new Providers( - new FileProvider(), - new ParserCacheProvider($config, false), - new FileStorageCacheProvider($config), - new ClassLikeStorageCacheProvider($config), - null, - new ProjectCacheProvider(Composer::getLockFilePath($current_dir)) - ); - } - - if (array_key_exists('list-supported-issues', $options)) { - echo implode(',', ProjectAnalyzer::getSupportedIssuesToFix()) . PHP_EOL; - exit(); - } - - $debug = array_key_exists('debug', $options) || array_key_exists('debug-by-line', $options); - $progress = $debug - ? new DebugProgress() - : new DefaultProgress(); - - $stdout_report_options = new ReportOptions(); - $stdout_report_options->use_color = !array_key_exists('m', $options); - - $project_analyzer = new ProjectAnalyzer( - $config, - $providers, - $stdout_report_options, - [], - $threads, - $progress - ); - - if (array_key_exists('debug-by-line', $options)) { - $project_analyzer->debug_lines = true; - } - - if (array_key_exists('debug-emitted-issues', $options)) { - $config->debug_emitted_issues = true; - } - - if (array_key_exists('issues', $options)) { - if (!is_string($options['issues']) || !$options['issues']) { - die('Expecting a comma-separated list of issues' . PHP_EOL); - } - - $issues = explode(',', $options['issues']); - - $keyed_issues = []; - - foreach ($issues as $issue) { - $keyed_issues[$issue] = true; - } - } else { - $keyed_issues = []; - } - - CliUtils::initPhpVersion($options, $config, $project_analyzer); - - if (isset($options['codeowner'])) { - $codeowner_files = self::loadCodeowners($providers); - - $desired_codeowners = is_array($options['codeowner']) ? $options['codeowner'] : [$options['codeowner']]; - - $files_for_codeowners = self::loadCodeownersFiles($desired_codeowners, $codeowner_files); - $paths_to_check = is_array($paths_to_check) ? - array_merge($paths_to_check, $files_for_codeowners) : - $files_for_codeowners; - } - - if (isset($options['allow-backwards-incompatible-changes'])) { - $allow_backwards_incompatible_changes = filter_var( - $options['allow-backwards-incompatible-changes'], - FILTER_VALIDATE_BOOLEAN, - ['flags' => FILTER_NULL_ON_FAILURE] - ); - - if ($allow_backwards_incompatible_changes === null) { - die('--allow-backwards-incompatible-changes expects a boolean value [true|false|1|0]' . PHP_EOL); - } - - $project_analyzer->getCodebase()->allow_backwards_incompatible_changes - = $allow_backwards_incompatible_changes; - } - - if (isset($options['add-newline-between-docblock-annotations'])) { - $doc_block_add_new_line_before_return = filter_var( - $options['add-newline-between-docblock-annotations'], - FILTER_VALIDATE_BOOLEAN, - ['flags' => FILTER_NULL_ON_FAILURE] - ); - - if ($doc_block_add_new_line_before_return === null) { - die('--add-newline-between-docblock-annotations expects a boolean value [true|false|1|0]' . PHP_EOL); - } - - ParsedDocblock::addNewLineBetweenAnnotations($doc_block_add_new_line_before_return); - } - - $plugins = []; - - if (isset($options['plugin'])) { - $plugins = $options['plugin']; - - if (!is_array($plugins)) { - $plugins = [$plugins]; - } - } - - /** @var string $plugin_path */ - foreach ($plugins as $plugin_path) { - Config::getInstance()->addPluginPath($current_dir . $plugin_path); - } - - $find_unused_code = array_key_exists('find-unused-code', $options); - - foreach ($keyed_issues as $issue_name => $_) { - // MissingParamType requires the scanning of all files to inform possible params - if (strpos($issue_name, 'Unused') !== false - || $issue_name === 'MissingParamType' - || $issue_name === 'UnnecessaryVarAnnotation' - || $issue_name === 'all' - ) { - $find_unused_code = true; - break; - } - } - - if ($find_unused_code) { - $project_analyzer->getCodebase()->reportUnusedCode(); - } - - $project_analyzer->alterCodeAfterCompletion( - array_key_exists('dry-run', $options), - array_key_exists('safe-types', $options) - ); - - if ($keyed_issues === ['all' => true]) { - $project_analyzer->setAllIssuesToFix(); - } else { - try { - $project_analyzer->setIssuesToFix($keyed_issues); - } catch (UnsupportedIssueToFixException $e) { - fwrite(STDERR, $e->getMessage() . PHP_EOL); - exit(1); - } - } - - $start_time = microtime(true); - - if ($paths_to_check === null || count($paths_to_check) > 1 || $find_unused_code) { - if ($paths_to_check) { - $files_to_update = []; - - foreach ($paths_to_check as $path_to_check) { - if (!is_dir($path_to_check)) { - $files_to_update[] = (string) realpath($path_to_check); - } else { - foreach ($providers->file_provider->getFilesInDir($path_to_check, ['php']) as $php_file_path) { - $files_to_update[] = $php_file_path; - } - } - } - - $project_analyzer->getCodebase()->analyzer->setFilesToUpdate($files_to_update); - } - - $project_analyzer->check($current_dir); - } elseif ($paths_to_check) { - foreach ($paths_to_check as $path_to_check) { - if (is_dir($path_to_check)) { - $project_analyzer->checkDir($path_to_check); - } else { - $project_analyzer->checkFile($path_to_check); - } - } - } - - IssueBuffer::finish($project_analyzer, false, $start_time); - } - - private static function setMemoryLimit(): void - { - $memLimit = CliUtils::getMemoryLimitInBytes(); - // Magic number is 4096M in bytes - if ($memLimit > 0 && $memLimit < 8 * 1024 * 1024 * 1024) { - ini_set('memory_limit', (string) (8 * 1024 * 1024 * 1024)); - } - } - - /** @param array $args */ - private static function validateCliArguments(array $args): void - { - array_map( - function (string $arg): void { - if (strpos($arg, '--') === 0 && $arg !== '--') { - $arg_name = preg_replace('/=.*$/', '', substr($arg, 2)); - - if ($arg_name === 'alter') { - // valid option for psalm, ignored by psalter - return; - } - - if (!in_array($arg_name, self::LONG_OPTIONS) - && !in_array($arg_name . ':', self::LONG_OPTIONS) - && !in_array($arg_name . '::', self::LONG_OPTIONS) - ) { - fwrite( - STDERR, - 'Unrecognised argument "--' . $arg_name . '"' . PHP_EOL - . 'Type --help to see a list of supported arguments'. PHP_EOL - ); - exit(1); - } - } - }, - $args - ); - } - - /** - * @param array|string> $options - * @param-out array|string> $options - */ - private static function syncShortOptions(array &$options): void - { - if (array_key_exists('help', $options)) { - $options['h'] = false; - } - - if (array_key_exists('monochrome', $options)) { - $options['m'] = false; - } - - if (isset($options['config'])) { - $options['c'] = $options['config']; - } - - if (isset($options['root'])) { - $options['r'] = $options['root']; - } - } - - /** @return array> */ - private static function loadCodeowners(Providers $providers): array - { - if (file_exists('CODEOWNERS')) { - $codeowners_file_path = realpath('CODEOWNERS'); - } elseif (file_exists('.github/CODEOWNERS')) { - $codeowners_file_path = realpath('.github/CODEOWNERS'); - } elseif (file_exists('docs/CODEOWNERS')) { - $codeowners_file_path = realpath('docs/CODEOWNERS'); - } else { - die('Cannot use --codeowner without a CODEOWNERS file' . PHP_EOL); - } - - $codeowners_file = file_get_contents($codeowners_file_path); - - $codeowner_lines = array_map( - function (string $line): array { - $line_parts = preg_split('/\s+/', $line); - - $file_selector = substr(array_shift($line_parts), 1); - return [$file_selector, $line_parts]; - }, - array_filter( - explode("\n", $codeowners_file), - function (string $line): bool { - $line = trim($line); - - // currently we don’t match wildcard files or files that could appear anywhere - // in the repo - return $line && $line[0] === '/' && strpos($line, '*') === false; - } - ) - ); - - $codeowner_files = []; - - foreach ($codeowner_lines as [$path, $owners]) { - if (!file_exists($path)) { - continue; - } - - foreach ($owners as $i => $owner) { - $owners[$i] = strtolower($owner); - } - - if (!is_dir($path)) { - if (pathinfo($path, PATHINFO_EXTENSION) === 'php') { - $codeowner_files[$path] = $owners; - } - } else { - foreach ($providers->file_provider->getFilesInDir($path, ['php']) as $php_file_path) { - $codeowner_files[$php_file_path] = $owners; - } - } - } - - if (!$codeowner_files) { - die('Could not find any available entries in CODEOWNERS' . PHP_EOL); - } - - return $codeowner_files; - } - - /** - * @param array> $codeowner_files - * @return list - */ - private static function loadCodeownersFiles(array $desired_codeowners, array $codeowner_files): array - { - $paths_to_check = []; - /** @psalm-suppress MixedAssignment */ - foreach ($desired_codeowners as $desired_codeowner) { - if (!is_string($desired_codeowner)) { - die('Invalid --codeowner ' . (string)$desired_codeowner . PHP_EOL); - } - - if ($desired_codeowner[0] !== '@') { - die('--codeowner option must start with @' . PHP_EOL); - } - - $matched_file = false; - - foreach ($codeowner_files as $file_path => $owners) { - if (in_array(strtolower($desired_codeowner), $owners)) { - $paths_to_check[] = $file_path; - $matched_file = true; - } - } - - if (!$matched_file) { - die('User/group ' . $desired_codeowner . ' does not own any PHP files' . PHP_EOL); - } - } - - return $paths_to_check; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php deleted file mode 100644 index 1c87f4e8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php +++ /dev/null @@ -1,330 +0,0 @@ - $argv */ - public static function run(array $argv): void - { - ini_set('memory_limit', '8192M'); - - gc_collect_cycles(); - gc_disable(); - - ErrorHandler::install(); - - $args = array_slice($argv, 1); - - $valid_short_options = ['f:', 'm', 'h', 'r:', 'c:']; - $valid_long_options = [ - 'help', 'debug', 'debug-by-line', 'debug-emitted-issues', 'config:', 'root:', - 'threads:', 'move:', 'into:', 'rename:', 'to:', - ]; - - // get options from command line - $options = getopt(implode('', $valid_short_options), $valid_long_options); - - array_map( - function (string $arg) use ($valid_long_options): void { - if (strpos($arg, '--') === 0 && $arg !== '--') { - $arg_name = preg_replace('/=.*$/', '', substr($arg, 2)); - - if ($arg_name === 'refactor') { - // valid option for psalm, ignored by psalter - return; - } - - if (!in_array($arg_name, $valid_long_options) - && !in_array($arg_name . ':', $valid_long_options) - && !in_array($arg_name . '::', $valid_long_options) - ) { - fwrite( - STDERR, - 'Unrecognised argument "--' . $arg_name . '"' . PHP_EOL - . 'Type --help to see a list of supported arguments'. PHP_EOL - ); - exit(1); - } - } - }, - $args - ); - - if (array_key_exists('help', $options)) { - $options['h'] = false; - } - - if (isset($options['config'])) { - $options['c'] = $options['config']; - } - - if (isset($options['c']) && is_array($options['c'])) { - die('Too many config files provided' . PHP_EOL); - } - - if (array_key_exists('h', $options)) { - echo <<runAndCollect( - // we ignore the FQN because of a hack in scoper.inc that needs full path - // phpcs:ignore SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly.ReferenceViaFullyQualifiedName - function () use ($current_dir, $options, $vendor_dir): ?\Composer\Autoload\ClassLoader { - return CliUtils::requireAutoloaders($current_dir, isset($options['r']), $vendor_dir); - } - ); - - // If Xdebug is enabled, restart without it - (new XdebugHandler('PSALTER'))->check(); - - $path_to_config = CliUtils::getPathToConfig($options); - - $args = CliUtils::getArguments(); - - $operation = null; - $last_arg = null; - - $to_refactor = []; - - foreach ($args as $arg) { - if ($arg === '--move') { - $operation = 'move'; - continue; - } - - if ($arg === '--into') { - if ($operation !== 'move' || !$last_arg) { - die('--into is not expected here' . PHP_EOL); - } - - $operation = 'move_into'; - continue; - } - - if ($arg === '--rename') { - $operation = 'rename'; - continue; - } - - if ($arg === '--to') { - if ($operation !== 'rename' || !$last_arg) { - die('--to is not expected here' . PHP_EOL); - } - - $operation = 'rename_to'; - - continue; - } - - if ($arg[0] === '-') { - $operation = null; - continue; - } - - if ($operation === 'move_into' || $operation === 'rename_to') { - if (!$last_arg) { - die('Expecting a previous argument' . PHP_EOL); - } - - if ($operation === 'move_into') { - $last_arg_parts = preg_split('/, ?/', $last_arg); - - foreach ($last_arg_parts as $last_arg_part) { - if (strpos($last_arg_part, '::')) { - [, $identifier_name] = explode('::', $last_arg_part); - $to_refactor[$last_arg_part] = $arg . '::' . $identifier_name; - } else { - $namespace_parts = explode('\\', $last_arg_part); - $class_name = end($namespace_parts); - $to_refactor[$last_arg_part] = $arg . '\\' . $class_name; - } - } - } else { - $to_refactor[$last_arg] = $arg; - } - - $last_arg = null; - $operation = null; - continue; - } - - if ($operation === 'move' || $operation === 'rename') { - $last_arg = $arg; - - continue; - } - - die('Unexpected argument "' . $arg . '"' . PHP_EOL); - } - - if (!$to_refactor) { - die('No --move or --rename arguments supplied' . PHP_EOL); - } - - $config = CliUtils::initializeConfig( - $path_to_config, - $current_dir, - Report::TYPE_CONSOLE, - $first_autoloader - ); - $config->setIncludeCollector($include_collector); - - if ($config->resolve_from_config_file) { - $current_dir = $config->base_dir; - chdir($current_dir); - } - - $threads = isset($options['threads']) - ? (int)$options['threads'] - : max(1, ProjectAnalyzer::getCpuCount() - 2); - - $providers = new Providers( - new FileProvider(), - new ParserCacheProvider($config, false), - new FileStorageCacheProvider($config), - new ClassLikeStorageCacheProvider($config), - null, - new ProjectCacheProvider(Composer::getLockFilePath($current_dir)) - ); - - $debug = array_key_exists('debug', $options) || array_key_exists('debug-by-line', $options); - $progress = $debug - ? new DebugProgress() - : new DefaultProgress(); - - if (array_key_exists('debug-emitted-issues', $options)) { - $config->debug_emitted_issues = true; - } - - $project_analyzer = new ProjectAnalyzer( - $config, - $providers, - new ReportOptions(), - [], - $threads, - $progress - ); - - if (array_key_exists('debug-by-line', $options)) { - $project_analyzer->debug_lines = true; - } - - $project_analyzer->refactorCodeAfterCompletion($to_refactor); - - $start_time = microtime(true); - - $project_analyzer->check($current_dir); - - IssueBuffer::finish($project_analyzer, false, $start_time); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/CliUtils.php b/vendor/vimeo/psalm/src/Psalm/Internal/CliUtils.php deleted file mode 100644 index f8c88734..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/CliUtils.php +++ /dev/null @@ -1,665 +0,0 @@ - - */ - public static function getRawCliArguments(): array - { - global $argv; - - if (!$argv) { - return []; - } - - return array_slice($argv, 1); - } - - /** - * @return list - */ - public static function getArguments(): array - { - $argv = self::getRawCliArguments(); - $filtered_input_paths = []; - - for ($i = 0, $iMax = count($argv); $i < $iMax; ++$i) { - $input_path = $argv[$i]; - - if (realpath($input_path) !== false) { - continue; - } - - if ($input_path[0] === '-' && strlen($input_path) === 2) { - if ($input_path[1] === 'c' || $input_path[1] === 'f') { - ++$i; - } - continue; - } - - if ($input_path[0] === '-' && $input_path[2] === '=') { - continue; - } - - $filtered_input_paths[] = $input_path; - } - - return $filtered_input_paths; - } - - /** - * @param string|array|null|false $f_paths - * - * @return list|null - */ - public static function getPathsToCheck($f_paths): ?array - { - $paths_to_check = []; - - if ($f_paths) { - $input_paths = is_array($f_paths) ? $f_paths : [$f_paths]; - } else { - $input_paths = self::getRawCliArguments(); - if (!$input_paths) { - return null; - } - } - - $filtered_input_paths = []; - - for ($i = 0, $iMax = count($input_paths); $i < $iMax; ++$i) { - /** @var string */ - $input_path = $input_paths[$i]; - - if ($input_path[0] === '-' && strlen($input_path) === 2) { - if ($input_path[1] === 'c' || $input_path[1] === 'f') { - ++$i; - } - continue; - } - - if ($input_path[0] === '-' && $input_path[2] === '=') { - continue; - } - - if (strpos($input_path, '--') === 0 && strlen($input_path) > 2) { - if (substr($input_path, 2) === 'config') { - ++$i; - } - continue; - } - - $filtered_input_paths[] = $input_path; - } - - if ($filtered_input_paths === ['-']) { - $meta = stream_get_meta_data(STDIN); - stream_set_blocking(STDIN, false); - if ($stdin = fgets(STDIN)) { - $filtered_input_paths = preg_split('/\s+/', trim($stdin)); - } - $blocked = $meta['blocked']; - stream_set_blocking(STDIN, $blocked); - } - - foreach ($filtered_input_paths as $path_to_check) { - if ($path_to_check[0] === '-') { - fwrite(STDERR, 'Invalid usage, expecting psalm [options] [file...]' . PHP_EOL); - exit(1); - } - - if (!file_exists($path_to_check)) { - fwrite(STDERR, 'Cannot locate ' . $path_to_check . PHP_EOL); - exit(1); - } - - $path_to_check = realpath($path_to_check); - - if (!$path_to_check) { - fwrite(STDERR, 'Error getting realpath for file' . PHP_EOL); - exit(1); - } - - $paths_to_check[] = $path_to_check; - } - - if (!$paths_to_check) { - $paths_to_check = null; - } - - return $paths_to_check; - } - - /** - * @psalm-pure - * @todo move to Psalm\Internal\Cli\Psalm once \Psalm\getPsalmHelpText() is removed in Psalm 5 - */ - public static function getPsalmHelpText(): string - { - return <<getMessage() . PHP_EOL - ); - exit(1); - } - - $config->setComposerClassLoader($first_autoloader); - - return $config; - } - - public static function updateConfigFile(Config $config, string $config_file_path, string $baseline_path): void - { - if ($config->error_baseline === $baseline_path) { - return; - } - - $config_file = $config_file_path; - - if (is_dir($config_file_path)) { - $config_file = Config::locateConfigFile($config_file_path); - } - - if (!$config_file) { - fwrite(STDERR, "Don't forget to set errorBaseline=\"{$baseline_path}\" to your config."); - - return; - } - - $config_file_contents = file_get_contents($config_file); - - if ($config->error_baseline) { - $amended_config_file_contents = preg_replace( - '/errorBaseline=".*?"/', - "errorBaseline=\"{$baseline_path}\"", - $config_file_contents - ); - } else { - $end_psalm_open_tag = strpos($config_file_contents, '>', (int)strpos($config_file_contents, '", - $end_psalm_open_tag, - 1 - ); - } else { - $amended_config_file_contents = substr_replace( - $config_file_contents, - " errorBaseline=\"{$baseline_path}\">", - $end_psalm_open_tag, - 1 - ); - } - } - - file_put_contents($config_file, $amended_config_file_contents); - } - - public static function getPathToConfig(array $options): ?string - { - $path_to_config = isset($options['c']) && is_string($options['c']) ? realpath($options['c']) : null; - - if ($path_to_config === false) { - fwrite(STDERR, 'Could not resolve path to config ' . (string) ($options['c'] ?? '') . PHP_EOL); - exit(1); - } - return $path_to_config; - } - - /** - * @psalm-pure - */ - public static function getMemoryLimitInBytes(): int - { - return self::convertMemoryLimitToBytes(ini_get('memory_limit')); - } - - /** @psalm-pure */ - public static function convertMemoryLimitToBytes(string $limit): int - { - // for unlimited = -1 - if ($limit < 0) { - return -1; - } - - if (preg_match('/^(\d+)(\D?)$/', $limit, $matches)) { - assert(isset($matches[1])); - $limit = (int)$matches[1]; - switch (strtoupper($matches[2] ?? '')) { - case 'G': - $limit *= 1024 * 1024 * 1024; - break; - case 'M': - $limit *= 1024 * 1024; - break; - case 'K': - $limit *= 1024; - break; - } - } - - return (int)$limit; - } - - public static function initPhpVersion(array $options, Config $config, ProjectAnalyzer $project_analyzer): void - { - $source = null; - - if (isset($options['php-version'])) { - if (!is_string($options['php-version'])) { - die('Expecting a version number in the format x.y' . PHP_EOL); - } - $version = $options['php-version']; - $source = 'cli'; - } elseif ($version = $config->getPhpVersionFromConfig()) { - $source = 'config'; - } elseif ($version = $config->getPHPVersionFromComposerJson()) { - $source = 'composer'; - } - - if ($version !== null && $source !== null) { - $project_analyzer->setPhpVersion($version, $source); - } - } - - public static function runningInCI(): bool - { - return isset($_SERVER['TRAVIS']) - || isset($_SERVER['CIRCLECI']) - || isset($_SERVER['APPVEYOR']) - || isset($_SERVER['JENKINS_URL']) - || isset($_SERVER['SCRUTINIZER']) - || isset($_SERVER['GITLAB_CI']) - || isset($_SERVER['GITHUB_WORKFLOW']) - || isset($_SERVER['DRONE']); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php deleted file mode 100644 index 36c92713..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php +++ /dev/null @@ -1,1644 +0,0 @@ - - * - * @psalm-type FileMapType = array{ - * 0: TaggedCodeType, - * 1: TaggedCodeType, - * 2: array - * } - * - * @psalm-type WorkerData = array{ - * issues: array>, - * fixable_issue_counts: array, - * nonmethod_references_to_classes: array>, - * method_references_to_classes: array>, - * file_references_to_class_members: array>, - * file_references_to_class_properties: array>, - * file_references_to_method_returns: array>, - * file_references_to_missing_class_members: array>, - * mixed_counts: array, - * mixed_member_names: array>, - * function_timings: array, - * file_manipulations: array, - * method_references_to_class_members: array>, - * method_dependencies: array>, - * method_references_to_method_returns: array>, - * method_references_to_class_properties: array>, - * method_references_to_missing_class_members: array>, - * method_param_uses: array>>, - * analyzed_methods: array>, - * file_maps: array, - * class_locations: array>, - * class_method_locations: array>, - * class_property_locations: array>, - * possible_method_param_types: array>, - * taint_data: ?TaintFlowGraph, - * unused_suppressions: array>, - * used_suppressions: array>, - * function_docblock_manipulators: array>, - * mutable_classes: array, - * } - */ - -/** - * @internal - * - * Called in the analysis phase of Psalm's execution - */ -class Analyzer -{ - /** - * @var Config - */ - private $config; - - /** - * @var FileProvider - */ - private $file_provider; - - /** - * @var FileStorageProvider - */ - private $file_storage_provider; - - /** - * @var Progress - */ - private $progress; - - /** - * Used to store counts of mixed vs non-mixed variables - * - * @var array - */ - private $mixed_counts = []; - - /** - * Used to store member names of mixed property/method access - * - * @var array> - */ - private $mixed_member_names = []; - - /** - * @var bool - */ - private $count_mixed = true; - - /** - * Used to store debug performance data - * - * @var array - */ - private $function_timings = []; - - /** - * We analyze more files than we necessarily report errors in - * - * @var array - */ - private $files_to_analyze = []; - - /** - * We can show analysis results on more files than we analyze - * because the results can be cached - * - * @var array - */ - private $files_with_analysis_results = []; - - /** - * We may update fewer files than we analyse (i.e. for dead code detection) - * - * @var array|null - */ - private $files_to_update; - - /** - * @var array> - */ - private $analyzed_methods = []; - - /** - * @var array> - */ - private $existing_issues = []; - - /** - * @var array> - */ - private $reference_map = []; - - /** - * @var array> - */ - private $type_map = []; - - /** - * @var array> - */ - private $argument_map = []; - - /** - * @var array> - */ - public $possible_method_param_types = []; - - /** - * @var array - */ - public $mutable_classes = []; - - public function __construct( - Config $config, - FileProvider $file_provider, - FileStorageProvider $file_storage_provider, - Progress $progress - ) { - $this->config = $config; - $this->file_provider = $file_provider; - $this->file_storage_provider = $file_storage_provider; - $this->progress = $progress; - } - - /** - * @param array $files_to_analyze - * - */ - public function addFilesToAnalyze(array $files_to_analyze): void - { - $this->files_to_analyze += $files_to_analyze; - $this->files_with_analysis_results += $files_to_analyze; - } - - /** - * @param array $files_to_analyze - * - */ - public function addFilesToShowResults(array $files_to_analyze): void - { - $this->files_with_analysis_results += $files_to_analyze; - } - - /** - * @param array $files_to_update - * - */ - public function setFilesToUpdate(array $files_to_update): void - { - $this->files_to_update = $files_to_update; - } - - public function canReportIssues(string $file_path): bool - { - return isset($this->files_with_analysis_results[$file_path]); - } - - /** - * @param array> $filetype_analyzers - */ - private function getFileAnalyzer( - ProjectAnalyzer $project_analyzer, - string $file_path, - array $filetype_analyzers - ): FileAnalyzer { - $extension = pathinfo($file_path, PATHINFO_EXTENSION); - - $file_name = $this->config->shortenFileName($file_path); - - if (isset($filetype_analyzers[$extension])) { - $file_analyzer = new $filetype_analyzers[$extension]($project_analyzer, $file_path, $file_name); - } else { - $file_analyzer = new FileAnalyzer($project_analyzer, $file_path, $file_name); - } - - $this->progress->debug('Getting ' . $file_path . "\n"); - - return $file_analyzer; - } - - public function analyzeFiles( - ProjectAnalyzer $project_analyzer, - int $pool_size, - bool $alter_code, - bool $consolidate_analyzed_data = false - ): void { - $this->loadCachedResults($project_analyzer); - - $codebase = $project_analyzer->getCodebase(); - - if ($alter_code) { - $project_analyzer->interpretRefactors(); - } - - $this->files_to_analyze = array_filter( - $this->files_to_analyze, - function (string $file_path): bool { - return $this->file_provider->fileExists($file_path); - } - ); - - $this->doAnalysis($project_analyzer, $pool_size); - - $scanned_files = $codebase->scanner->getScannedFiles(); - - if ($codebase->taint_flow_graph) { - $codebase->taint_flow_graph->connectSinksAndSources(); - } - - $this->progress->finish(); - - if ($consolidate_analyzed_data) { - $project_analyzer->consolidateAnalyzedData(); - } - - foreach (IssueBuffer::getIssuesData() as $file_path => $file_issues) { - $codebase->file_reference_provider->clearExistingIssuesForFile($file_path); - - foreach ($file_issues as $issue_data) { - $codebase->file_reference_provider->addIssue($file_path, $issue_data); - } - } - - $codebase->file_reference_provider->updateReferenceCache($codebase, $scanned_files); - - if ($codebase->track_unused_suppressions) { - IssueBuffer::processUnusedSuppressions($codebase->file_provider); - } - - $codebase->file_reference_provider->setAnalyzedMethods($this->analyzed_methods); - $codebase->file_reference_provider->setFileMaps($this->getFileMaps()); - $codebase->file_reference_provider->setTypeCoverage($this->mixed_counts); - $codebase->file_reference_provider->updateReferenceCache($codebase, $scanned_files); - - if ($codebase->diff_methods) { - $codebase->statements_provider->resetDiffs(); - } - - if ($alter_code) { - $this->progress->startAlteringFiles(); - - $project_analyzer->prepareMigration(); - - $files_to_update = $this->files_to_update ?? $this->files_to_analyze; - - foreach ($files_to_update as $file_path) { - $this->updateFile($file_path, $project_analyzer->dry_run); - } - - $project_analyzer->migrateCode(); - } - } - - private function doAnalysis(ProjectAnalyzer $project_analyzer, int $pool_size): void - { - $this->progress->start(count($this->files_to_analyze)); - - ksort($this->files_to_analyze); - - $codebase = $project_analyzer->getCodebase(); - - $filetype_analyzers = $this->config->getFiletypeAnalyzers(); - - $analysis_worker = - /** - * @return list - */ - function (int $_, string $file_path) use ($project_analyzer, $filetype_analyzers): array { - $file_analyzer = $this->getFileAnalyzer($project_analyzer, $file_path, $filetype_analyzers); - - $this->progress->debug('Analyzing ' . $file_analyzer->getFilePath() . "\n"); - - $file_analyzer->analyze(); - $file_analyzer->context = null; - $file_analyzer->clearSourceBeforeDestruction(); - unset($file_analyzer); - - return IssueBuffer::getIssuesDataForFile($file_path); - }; - - $task_done_closure = - /** - * @param array $issues - */ - function (array $issues): void { - $has_error = false; - $has_info = false; - - foreach ($issues as $issue) { - if ($issue->severity === 'error') { - $has_error = true; - break; - } - - if ($issue->severity === 'info') { - $has_info = true; - } - } - - $this->progress->taskDone($has_error ? 2 : ($has_info ? 1 : 0)); - }; - - if ($pool_size > 1 && count($this->files_to_analyze) > $pool_size) { - $shuffle_count = $pool_size + 1; - - $file_paths = array_values($this->files_to_analyze); - - $count = count($file_paths); - $middle = intdiv($count, $shuffle_count); - $remainder = $count % $shuffle_count; - - $new_file_paths = []; - - for ($i = 0; $i < $shuffle_count; $i++) { - for ($j = 0; $j < $middle; $j++) { - if ($j * $shuffle_count + $i < $count) { - $new_file_paths[] = $file_paths[$j * $shuffle_count + $i]; - } - } - - if ($remainder) { - $new_file_paths[] = $file_paths[$middle * $shuffle_count + $remainder - 1]; - $remainder--; - } - } - - $process_file_paths = []; - - $i = 0; - - foreach ($new_file_paths as $file_path) { - $process_file_paths[$i % $pool_size][] = $file_path; - ++$i; - } - - // Run analysis one file at a time, splitting the set of - // files up among a given number of child processes. - $pool = new Pool( - $this->config, - $process_file_paths, - function (): void { - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - - $file_reference_provider = $codebase->file_reference_provider; - - if ($codebase->taint_flow_graph) { - $codebase->taint_flow_graph = new TaintFlowGraph(); - } - - $file_reference_provider->setNonMethodReferencesToClasses([]); - $file_reference_provider->setCallingMethodReferencesToClassMembers([]); - $file_reference_provider->setCallingMethodReferencesToClassProperties([]); - $file_reference_provider->setFileReferencesToClassMembers([]); - $file_reference_provider->setFileReferencesToClassProperties([]); - $file_reference_provider->setCallingMethodReferencesToMissingClassMembers([]); - $file_reference_provider->setFileReferencesToMissingClassMembers([]); - $file_reference_provider->setReferencesToMixedMemberNames([]); - $file_reference_provider->setMethodParamUses([]); - }, - $analysis_worker, - /** @return WorkerData */ - function () { - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - $analyzer = $codebase->analyzer; - $file_reference_provider = $codebase->file_reference_provider; - - $this->progress->debug('Gathering data for forked process' . "\n"); - - // @codingStandardsIgnoreStart - return [ - 'issues' => IssueBuffer::getIssuesData(), - 'fixable_issue_counts' => IssueBuffer::getFixableIssues(), - 'nonmethod_references_to_classes' => $file_reference_provider->getAllNonMethodReferencesToClasses(), - 'method_references_to_classes' => $file_reference_provider->getAllMethodReferencesToClasses(), - 'file_references_to_class_members' => $file_reference_provider->getAllFileReferencesToClassMembers(), - 'method_references_to_class_members' => $file_reference_provider->getAllMethodReferencesToClassMembers(), - 'method_dependencies' => $file_reference_provider->getAllMethodDependencies(), - 'file_references_to_class_properties' => $file_reference_provider->getAllFileReferencesToClassProperties(), - 'file_references_to_method_returns' => $file_reference_provider->getAllFileReferencesToMethodReturns(), - 'method_references_to_class_properties' => $file_reference_provider->getAllMethodReferencesToClassProperties(), - 'method_references_to_method_returns' => $file_reference_provider->getAllMethodReferencesToMethodReturns(), - 'file_references_to_missing_class_members' => $file_reference_provider->getAllFileReferencesToMissingClassMembers(), - 'method_references_to_missing_class_members' => $file_reference_provider->getAllMethodReferencesToMissingClassMembers(), - 'method_param_uses' => $file_reference_provider->getAllMethodParamUses(), - 'mixed_member_names' => $analyzer->getMixedMemberNames(), - 'file_manipulations' => FileManipulationBuffer::getAll(), - 'mixed_counts' => $analyzer->getMixedCounts(), - 'function_timings' => $analyzer->getFunctionTimings(), - 'analyzed_methods' => $analyzer->getAnalyzedMethods(), - 'file_maps' => $analyzer->getFileMaps(), - 'class_locations' => $file_reference_provider->getAllClassLocations(), - 'class_method_locations' => $file_reference_provider->getAllClassMethodLocations(), - 'class_property_locations' => $file_reference_provider->getAllClassPropertyLocations(), - 'possible_method_param_types' => $analyzer->getPossibleMethodParamTypes(), - 'taint_data' => $codebase->taint_flow_graph, - 'unused_suppressions' => $codebase->track_unused_suppressions ? IssueBuffer::getUnusedSuppressions() : [], - 'used_suppressions' => $codebase->track_unused_suppressions ? IssueBuffer::getUsedSuppressions() : [], - 'function_docblock_manipulators' => FunctionDocblockManipulator::getManipulators(), - 'mutable_classes' => $codebase->analyzer->mutable_classes, - ]; - // @codingStandardsIgnoreEnd - }, - $task_done_closure - ); - - $this->progress->debug('Forking analysis' . "\n"); - - // Wait for all tasks to complete and collect the results. - /** - * @var array - */ - $forked_pool_data = $pool->wait(); - - $this->progress->debug('Collecting forked analysis results' . "\n"); - - foreach ($forked_pool_data as $pool_data) { - IssueBuffer::addIssues($pool_data['issues']); - IssueBuffer::addFixableIssues($pool_data['fixable_issue_counts']); - - if ($codebase->track_unused_suppressions) { - IssueBuffer::addUnusedSuppressions($pool_data['unused_suppressions']); - IssueBuffer::addUsedSuppressions($pool_data['used_suppressions']); - } - - if ($codebase->taint_flow_graph && $pool_data['taint_data']) { - $codebase->taint_flow_graph->addGraph($pool_data['taint_data']); - } - - $codebase->file_reference_provider->addNonMethodReferencesToClasses( - $pool_data['nonmethod_references_to_classes'] - ); - $codebase->file_reference_provider->addMethodReferencesToClasses( - $pool_data['method_references_to_classes'] - ); - $codebase->file_reference_provider->addFileReferencesToClassMembers( - $pool_data['file_references_to_class_members'] - ); - $codebase->file_reference_provider->addFileReferencesToClassProperties( - $pool_data['file_references_to_class_properties'] - ); - $codebase->file_reference_provider->addFileReferencesToMethodReturns( - $pool_data['file_references_to_method_returns'] - ); - $codebase->file_reference_provider->addMethodReferencesToClassMembers( - $pool_data['method_references_to_class_members'] - ); - $codebase->file_reference_provider->addMethodDependencies( - $pool_data['method_dependencies'] - ); - $codebase->file_reference_provider->addMethodReferencesToClassProperties( - $pool_data['method_references_to_class_properties'] - ); - $codebase->file_reference_provider->addMethodReferencesToMethodReturns( - $pool_data['method_references_to_method_returns'] - ); - $codebase->file_reference_provider->addFileReferencesToMissingClassMembers( - $pool_data['file_references_to_missing_class_members'] - ); - $codebase->file_reference_provider->addMethodReferencesToMissingClassMembers( - $pool_data['method_references_to_missing_class_members'] - ); - $codebase->file_reference_provider->addMethodParamUses( - $pool_data['method_param_uses'] - ); - $this->addMixedMemberNames( - $pool_data['mixed_member_names'] - ); - $this->function_timings += $pool_data['function_timings']; - $codebase->file_reference_provider->addClassLocations( - $pool_data['class_locations'] - ); - $codebase->file_reference_provider->addClassMethodLocations( - $pool_data['class_method_locations'] - ); - $codebase->file_reference_provider->addClassPropertyLocations( - $pool_data['class_property_locations'] - ); - - $this->mutable_classes = array_merge($this->mutable_classes, $pool_data['mutable_classes']); - - FunctionDocblockManipulator::addManipulators($pool_data['function_docblock_manipulators']); - - $this->analyzed_methods = array_merge($pool_data['analyzed_methods'], $this->analyzed_methods); - - foreach ($pool_data['mixed_counts'] as $file_path => [$mixed_count, $nonmixed_count]) { - if (!isset($this->mixed_counts[$file_path])) { - $this->mixed_counts[$file_path] = [$mixed_count, $nonmixed_count]; - } else { - $this->mixed_counts[$file_path][0] += $mixed_count; - $this->mixed_counts[$file_path][1] += $nonmixed_count; - } - } - - foreach ($pool_data['possible_method_param_types'] as $declaring_method_id => $possible_param_types) { - if (!isset($this->possible_method_param_types[$declaring_method_id])) { - $this->possible_method_param_types[$declaring_method_id] = $possible_param_types; - } else { - foreach ($possible_param_types as $offset => $possible_param_type) { - $this->possible_method_param_types[$declaring_method_id][$offset] - = Type::combineUnionTypes( - $this->possible_method_param_types[$declaring_method_id][$offset] ?? null, - $possible_param_type, - $codebase - ); - } - } - } - - foreach ($pool_data['file_manipulations'] as $file_path => $manipulations) { - FileManipulationBuffer::add($file_path, $manipulations); - } - - foreach ($pool_data['file_maps'] as $file_path => $file_maps) { - [$reference_map, $type_map, $argument_map] = $file_maps; - $this->reference_map[$file_path] = $reference_map; - $this->type_map[$file_path] = $type_map; - $this->argument_map[$file_path] = $argument_map; - } - } - - if ($pool->didHaveError()) { - exit(1); - } - } else { - $i = 0; - - foreach ($this->files_to_analyze as $file_path => $_) { - $analysis_worker($i, $file_path); - ++$i; - - $issues = IssueBuffer::getIssuesDataForFile($file_path); - $task_done_closure($issues); - } - } - } - - /** - * @psalm-suppress ComplexMethod - */ - public function loadCachedResults(ProjectAnalyzer $project_analyzer): void - { - $codebase = $project_analyzer->getCodebase(); - - if ($codebase->diff_methods) { - $this->analyzed_methods = $codebase->file_reference_provider->getAnalyzedMethods(); - $this->existing_issues = $codebase->file_reference_provider->getExistingIssues(); - $file_maps = $codebase->file_reference_provider->getFileMaps(); - - foreach ($file_maps as $file_path => [$reference_map, $type_map, $argument_map]) { - $this->reference_map[$file_path] = $reference_map; - $this->type_map[$file_path] = $type_map; - $this->argument_map[$file_path] = $argument_map; - } - } - - $statements_provider = $codebase->statements_provider; - $file_reference_provider = $codebase->file_reference_provider; - - $changed_members = $statements_provider->getChangedMembers(); - $unchanged_signature_members = $statements_provider->getUnchangedSignatureMembers(); - $errored_files = $statements_provider->getErrors(); - - $diff_map = $statements_provider->getDiffMap(); - $deletion_ranges = $statements_provider->getDeletionRanges(); - - $method_references_to_class_members = $file_reference_provider->getAllMethodReferencesToClassMembers(); - - $method_dependencies = $file_reference_provider->getAllMethodDependencies(); - - $method_references_to_class_properties = $file_reference_provider->getAllMethodReferencesToClassProperties(); - - $method_references_to_method_returns = $file_reference_provider->getAllMethodReferencesToMethodReturns(); - - $method_references_to_missing_class_members = - $file_reference_provider->getAllMethodReferencesToMissingClassMembers(); - - $all_referencing_methods = $method_references_to_class_members - + $method_references_to_missing_class_members - + $method_dependencies; - - $nonmethod_references_to_classes = $file_reference_provider->getAllNonMethodReferencesToClasses(); - - $method_references_to_classes = $file_reference_provider->getAllMethodReferencesToClasses(); - - $method_param_uses = $file_reference_provider->getAllMethodParamUses(); - - $file_references_to_class_members = $file_reference_provider->getAllFileReferencesToClassMembers(); - - $file_references_to_class_properties = $file_reference_provider->getAllFileReferencesToClassProperties(); - - $file_references_to_method_returns = $file_reference_provider->getAllFileReferencesToMethodReturns(); - - $file_references_to_missing_class_members - = $file_reference_provider->getAllFileReferencesToMissingClassMembers(); - - $references_to_mixed_member_names = $file_reference_provider->getAllReferencesToMixedMemberNames(); - - $this->mixed_counts = $file_reference_provider->getTypeCoverage(); - - foreach ($changed_members as $file_path => $members_by_file) { - foreach ($members_by_file as $changed_member => $_) { - if (!strpos($changed_member, '&')) { - continue; - } - - [$base_class, $trait] = explode('&', $changed_member); - - foreach ($all_referencing_methods as $member_id => $_) { - if (strpos($member_id, $base_class . '::') !== 0) { - continue; - } - - $member_bit = substr($member_id, strlen($base_class) + 2); - - if (isset($all_referencing_methods[$trait . '::' . $member_bit])) { - $changed_members[$file_path][$member_id] = true; - } - } - } - } - - $newly_invalidated_methods = []; - - foreach ($unchanged_signature_members as $file_unchanged_signature_members) { - $newly_invalidated_methods = array_merge($newly_invalidated_methods, $file_unchanged_signature_members); - - foreach ($file_unchanged_signature_members as $unchanged_signature_member_id => $_) { - // also check for things that might invalidate constructor property initialisation - if (isset($all_referencing_methods[$unchanged_signature_member_id])) { - foreach ($all_referencing_methods[$unchanged_signature_member_id] as $referencing_method_id => $_) { - if (substr($referencing_method_id, -13) === '::__construct') { - $referencing_base_classlike = explode('::', $referencing_method_id)[0]; - $unchanged_signature_classlike = explode('::', $unchanged_signature_member_id)[0]; - - if ($referencing_base_classlike === $unchanged_signature_classlike) { - $newly_invalidated_methods[$referencing_method_id] = true; - } else { - try { - $referencing_storage = $codebase->classlike_storage_provider->get( - $referencing_base_classlike - ); - } catch (InvalidArgumentException $_) { - // Workaround for #3671 - $newly_invalidated_methods[$referencing_method_id] = true; - $referencing_storage = null; - } - - if (isset($referencing_storage->used_traits[$unchanged_signature_classlike]) - || isset($referencing_storage->parent_classes[$unchanged_signature_classlike]) - ) { - $newly_invalidated_methods[$referencing_method_id] = true; - } - } - } - } - } - } - } - - foreach ($changed_members as $file_changed_members) { - foreach ($file_changed_members as $member_id => $_) { - $newly_invalidated_methods[$member_id] = true; - - if (isset($all_referencing_methods[$member_id])) { - $newly_invalidated_methods = array_merge( - $all_referencing_methods[$member_id], - $newly_invalidated_methods - ); - } - - unset( - $method_references_to_class_members[$member_id], - $method_dependencies[$member_id], - $method_references_to_class_properties[$member_id], - $method_references_to_method_returns[$member_id], - $file_references_to_class_members[$member_id], - $file_references_to_class_properties[$member_id], - $file_references_to_method_returns[$member_id], - $method_references_to_missing_class_members[$member_id], - $file_references_to_missing_class_members[$member_id], - $references_to_mixed_member_names[$member_id], - $method_param_uses[$member_id] - ); - - $member_stub = preg_replace('/::.*$/', '::*', $member_id); - - if (isset($all_referencing_methods[$member_stub])) { - $newly_invalidated_methods = array_merge( - $all_referencing_methods[$member_stub], - $newly_invalidated_methods - ); - } - } - } - - foreach ($newly_invalidated_methods as $method_id => $_) { - foreach ($method_references_to_class_members as $i => $_) { - unset($method_references_to_class_members[$i][$method_id]); - } - - foreach ($method_dependencies as $i => $_) { - unset($method_dependencies[$i][$method_id]); - } - - foreach ($method_references_to_class_properties as $i => $_) { - unset($method_references_to_class_properties[$i][$method_id]); - } - - foreach ($method_references_to_method_returns as $i => $_) { - unset($method_references_to_method_returns[$i][$method_id]); - } - - foreach ($method_references_to_classes as $i => $_) { - unset($method_references_to_classes[$i][$method_id]); - } - - foreach ($method_references_to_missing_class_members as $i => $_) { - unset($method_references_to_missing_class_members[$i][$method_id]); - } - - foreach ($references_to_mixed_member_names as $i => $_) { - unset($references_to_mixed_member_names[$i][$method_id]); - } - - foreach ($method_param_uses as $i => $_) { - foreach ($method_param_uses[$i] as $j => $_) { - unset($method_param_uses[$i][$j][$method_id]); - } - } - } - - foreach ($errored_files as $file_path => $_) { - unset($this->analyzed_methods[$file_path]); - unset($this->existing_issues[$file_path]); - } - - foreach ($this->analyzed_methods as $file_path => $analyzed_methods) { - foreach ($analyzed_methods as $correct_method_id => $_) { - $trait_safe_method_id = $correct_method_id; - - $correct_method_ids = explode('&', $correct_method_id); - - $correct_method_id = $correct_method_ids[0]; - - if (isset($newly_invalidated_methods[$correct_method_id]) - || (isset($correct_method_ids[1]) - && isset($newly_invalidated_methods[$correct_method_ids[1]])) - ) { - unset($this->analyzed_methods[$file_path][$trait_safe_method_id]); - } - } - } - - $this->shiftFileOffsets($diff_map, $deletion_ranges); - - foreach ($this->files_to_analyze as $file_path) { - $file_reference_provider->clearExistingIssuesForFile($file_path); - $file_reference_provider->clearExistingFileMapsForFile($file_path); - - $this->setMixedCountsForFile($file_path, [0, 0]); - - foreach ($file_references_to_class_members as $i => $_) { - unset($file_references_to_class_members[$i][$file_path]); - } - - foreach ($file_references_to_class_properties as $i => $_) { - unset($file_references_to_class_properties[$i][$file_path]); - } - - foreach ($file_references_to_method_returns as $i => $_) { - unset($file_references_to_method_returns[$i][$file_path]); - } - - foreach ($nonmethod_references_to_classes as $i => $_) { - unset($nonmethod_references_to_classes[$i][$file_path]); - } - - foreach ($references_to_mixed_member_names as $i => $_) { - unset($references_to_mixed_member_names[$i][$file_path]); - } - - foreach ($file_references_to_missing_class_members as $i => $_) { - unset($file_references_to_missing_class_members[$i][$file_path]); - } - } - - foreach ($this->existing_issues as $file_path => $issues) { - if (!isset($this->files_to_analyze[$file_path])) { - unset($this->existing_issues[$file_path]); - - if ($this->file_provider->fileExists($file_path)) { - IssueBuffer::addIssues([$file_path => array_values($issues)]); - } - } - } - - $method_references_to_class_members = array_filter( - $method_references_to_class_members - ); - - $method_dependencies = array_filter( - $method_dependencies - ); - - $method_references_to_class_properties = array_filter( - $method_references_to_class_properties - ); - - $method_references_to_method_returns = array_filter( - $method_references_to_method_returns - ); - - $method_references_to_missing_class_members = array_filter( - $method_references_to_missing_class_members - ); - - $file_references_to_class_members = array_filter( - $file_references_to_class_members - ); - - $file_references_to_class_properties = array_filter( - $file_references_to_class_properties - ); - - $file_references_to_method_returns = array_filter( - $file_references_to_method_returns - ); - - $file_references_to_missing_class_members = array_filter( - $file_references_to_missing_class_members - ); - - $references_to_mixed_member_names = array_filter( - $references_to_mixed_member_names - ); - - $nonmethod_references_to_classes = array_filter( - $nonmethod_references_to_classes - ); - - $method_references_to_classes = array_filter( - $method_references_to_classes - ); - - $method_param_uses = array_filter( - $method_param_uses - ); - - $file_reference_provider->setCallingMethodReferencesToClassMembers( - $method_references_to_class_members - ); - - $file_reference_provider->setMethodDependencies( - $method_dependencies - ); - - $file_reference_provider->setCallingMethodReferencesToClassProperties( - $method_references_to_class_properties - ); - - $file_reference_provider->setCallingMethodReferencesToMethodReturns( - $method_references_to_method_returns - ); - - $file_reference_provider->setFileReferencesToClassMembers( - $file_references_to_class_members - ); - - $file_reference_provider->setFileReferencesToClassProperties( - $file_references_to_class_properties - ); - - $file_reference_provider->setFileReferencesToMethodReturns( - $file_references_to_method_returns - ); - - $file_reference_provider->setCallingMethodReferencesToMissingClassMembers( - $method_references_to_missing_class_members - ); - - $file_reference_provider->setFileReferencesToMissingClassMembers( - $file_references_to_missing_class_members - ); - - $file_reference_provider->setReferencesToMixedMemberNames( - $references_to_mixed_member_names - ); - - $file_reference_provider->setCallingMethodReferencesToClasses( - $method_references_to_classes - ); - - $file_reference_provider->setNonMethodReferencesToClasses( - $nonmethod_references_to_classes - ); - - $file_reference_provider->setMethodParamUses( - $method_param_uses - ); - } - - /** - * @param array> $diff_map - * @param array> $deletion_ranges - */ - public function shiftFileOffsets(array $diff_map, array $deletion_ranges): void - { - foreach ($this->existing_issues as $file_path => $file_issues) { - if (!isset($this->analyzed_methods[$file_path])) { - continue; - } - - $file_diff_map = $diff_map[$file_path] ?? []; - $file_deletion_ranges = $deletion_ranges[$file_path] ?? []; - - if ($file_deletion_ranges) { - foreach ($file_issues as $i => $issue_data) { - foreach ($file_deletion_ranges as [$from, $to]) { - if ($issue_data->from >= $from - && $issue_data->from <= $to - ) { - unset($this->existing_issues[$file_path][$i]); - break; - } - } - } - } - - if ($file_diff_map) { - foreach ($file_issues as $issue_data) { - foreach ($file_diff_map as [$from, $to, $file_offset, $line_offset]) { - if ($issue_data->from >= $from - && $issue_data->from <= $to - ) { - $issue_data->from += $file_offset; - $issue_data->to += $file_offset; - $issue_data->snippet_from += $file_offset; - $issue_data->snippet_to += $file_offset; - $issue_data->line_from += $line_offset; - $issue_data->line_to += $line_offset; - break; - } - } - } - } - } - - foreach ($this->reference_map as $file_path => $reference_map) { - if (!isset($this->analyzed_methods[$file_path])) { - unset($this->reference_map[$file_path]); - continue; - } - - $file_diff_map = $diff_map[$file_path] ?? []; - $file_deletion_ranges = $deletion_ranges[$file_path] ?? []; - - if ($file_deletion_ranges) { - foreach ($reference_map as $reference_from => $_) { - foreach ($file_deletion_ranges as [$from, $to]) { - if ($reference_from >= $from && $reference_from <= $to) { - unset($this->reference_map[$file_path][$reference_from]); - break; - } - } - } - } - - if ($file_diff_map) { - foreach ($reference_map as $reference_from => [$reference_to, $tag]) { - foreach ($file_diff_map as [$from, $to, $file_offset]) { - if ($reference_from >= $from && $reference_from <= $to) { - unset($this->reference_map[$file_path][$reference_from]); - $this->reference_map[$file_path][$reference_from + $file_offset] = [ - $reference_to + $file_offset, - $tag, - ]; - break; - } - } - } - } - } - - foreach ($this->type_map as $file_path => $type_map) { - if (!isset($this->analyzed_methods[$file_path])) { - unset($this->type_map[$file_path]); - continue; - } - - $file_diff_map = $diff_map[$file_path] ?? []; - $file_deletion_ranges = $deletion_ranges[$file_path] ?? []; - - if ($file_deletion_ranges) { - foreach ($type_map as $type_from => $_) { - foreach ($file_deletion_ranges as [$from, $to]) { - if ($type_from >= $from && $type_from <= $to) { - unset($this->type_map[$file_path][$type_from]); - break; - } - } - } - } - - if ($file_diff_map) { - foreach ($type_map as $type_from => [$type_to, $tag]) { - foreach ($file_diff_map as [$from, $to, $file_offset]) { - if ($type_from >= $from && $type_from <= $to) { - unset($this->type_map[$file_path][$type_from]); - $this->type_map[$file_path][$type_from + $file_offset] = [ - $type_to + $file_offset, - $tag, - ]; - break; - } - } - } - } - } - - foreach ($this->argument_map as $file_path => $argument_map) { - if (!isset($this->analyzed_methods[$file_path])) { - unset($this->argument_map[$file_path]); - continue; - } - - $file_diff_map = $diff_map[$file_path] ?? []; - $file_deletion_ranges = $deletion_ranges[$file_path] ?? []; - - if ($file_deletion_ranges) { - foreach ($argument_map as $argument_from => $_) { - foreach ($file_deletion_ranges as [$from, $to]) { - if ($argument_from >= $from && $argument_from <= $to) { - unset($argument_map[$argument_from]); - break; - } - } - } - } - - if ($file_diff_map) { - foreach ($argument_map as $argument_from => [$argument_to, $method_id, $argument_number]) { - foreach ($file_diff_map as [$from, $to, $file_offset]) { - if ($argument_from >= $from && $argument_from <= $to) { - unset($this->argument_map[$file_path][$argument_from]); - $this->argument_map[$file_path][$argument_from + $file_offset] = [ - $argument_to + $file_offset, - $method_id, - $argument_number, - ]; - break; - } - } - } - } - } - } - - /** - * @return array> - */ - public function getMixedMemberNames(): array - { - return $this->mixed_member_names; - } - - public function addMixedMemberName(string $member_id, string $reference): void - { - $this->mixed_member_names[$member_id][$reference] = true; - } - - public function hasMixedMemberName(string $member_id): bool - { - return isset($this->mixed_member_names[$member_id]); - } - - /** - * @param array> $names - * - */ - public function addMixedMemberNames(array $names): void - { - foreach ($names as $key => $name) { - if (isset($this->mixed_member_names[$key])) { - $this->mixed_member_names[$key] = array_merge( - $this->mixed_member_names[$key], - $name - ); - } else { - $this->mixed_member_names[$key] = $name; - } - } - } - - /** - * @return array{0:int, 1:int} - */ - public function getMixedCountsForFile(string $file_path): array - { - if (!isset($this->mixed_counts[$file_path])) { - $this->mixed_counts[$file_path] = [0, 0]; - } - - return $this->mixed_counts[$file_path]; - } - - /** - * @param array{0:int, 1:int} $mixed_counts - * - */ - public function setMixedCountsForFile(string $file_path, array $mixed_counts): void - { - $this->mixed_counts[$file_path] = $mixed_counts; - } - - public function incrementMixedCount(string $file_path): void - { - if (!$this->count_mixed) { - return; - } - - if (!isset($this->mixed_counts[$file_path])) { - $this->mixed_counts[$file_path] = [0, 0]; - } - - ++$this->mixed_counts[$file_path][0]; - } - - public function decrementMixedCount(string $file_path): void - { - if (!$this->count_mixed) { - return; - } - - if (!isset($this->mixed_counts[$file_path])) { - return; - } - - if ($this->mixed_counts[$file_path][0] === 0) { - return; - } - - --$this->mixed_counts[$file_path][0]; - } - - public function incrementNonMixedCount(string $file_path): void - { - if (!$this->count_mixed) { - return; - } - - if (!isset($this->mixed_counts[$file_path])) { - $this->mixed_counts[$file_path] = [0, 0]; - } - - ++$this->mixed_counts[$file_path][1]; - } - - /** - * @return array - */ - public function getMixedCounts(): array - { - $all_deep_scanned_files = []; - - foreach ($this->files_to_analyze as $file_path => $_) { - $all_deep_scanned_files[$file_path] = true; - } - - return array_intersect_key($this->mixed_counts, $all_deep_scanned_files); - } - - /** - * @return array - */ - public function getFunctionTimings(): array - { - return $this->function_timings; - } - - public function addFunctionTiming(string $function_id, float $time_per_node): void - { - $this->function_timings[$function_id] = $time_per_node; - } - - public function addNodeType( - string $file_path, - PhpParser\Node $node, - string $node_type, - PhpParser\Node $parent_node = null - ): void { - if ($node_type === '') { - throw new UnexpectedValueException('non-empty node_type expected'); - } - - $this->type_map[$file_path][(int)$node->getAttribute('startFilePos')] = [ - ($parent_node ? (int)$parent_node->getAttribute('endFilePos') : (int)$node->getAttribute('endFilePos')) + 1, - $node_type, - ]; - } - - public function addNodeArgument( - string $file_path, - int $start_position, - int $end_position, - string $reference, - int $argument_number - ): void { - if ($reference === '') { - throw new UnexpectedValueException('non-empty reference expected'); - } - - $this->argument_map[$file_path][$start_position] = [ - $end_position, - $reference, - $argument_number, - ]; - } - - /** - * @param string $reference The symbol name for the reference. - * Prepend with an asterisk (*) to signify a reference that doesn't exist. - */ - public function addNodeReference(string $file_path, PhpParser\Node $node, string $reference): void - { - if (!$reference) { - throw new UnexpectedValueException('non-empty node_type expected'); - } - - $this->reference_map[$file_path][(int)$node->getAttribute('startFilePos')] = [ - (int)$node->getAttribute('endFilePos') + 1, - $reference, - ]; - } - - public function addOffsetReference(string $file_path, int $start, int $end, string $reference): void - { - if (!$reference) { - throw new UnexpectedValueException('non-empty node_type expected'); - } - - $this->reference_map[$file_path][$start] = [ - $end, - $reference, - ]; - } - - /** - * @return array{int, int} - */ - public function getTotalTypeCoverage(Codebase $codebase): array - { - $mixed_count = 0; - $nonmixed_count = 0; - - foreach ($codebase->file_reference_provider->getTypeCoverage() as $file_path => $counts) { - if (!$this->config->reportTypeStatsForFile($file_path)) { - continue; - } - - [$path_mixed_count, $path_nonmixed_count] = $counts; - - if (isset($this->mixed_counts[$file_path])) { - $mixed_count += $path_mixed_count; - $nonmixed_count += $path_nonmixed_count; - } - } - - return [$mixed_count, $nonmixed_count]; - } - - public function getTypeInferenceSummary(Codebase $codebase): string - { - $all_deep_scanned_files = []; - - foreach ($this->files_to_analyze as $file_path => $_) { - $all_deep_scanned_files[$file_path] = true; - - foreach ($this->file_storage_provider->get($file_path)->required_file_paths as $required_file_path) { - $all_deep_scanned_files[$required_file_path] = true; - } - } - - [$mixed_count, $nonmixed_count] = $this->getTotalTypeCoverage($codebase); - - $total = $mixed_count + $nonmixed_count; - - $total_files = count($all_deep_scanned_files); - - $lines = []; - - if (!$total_files) { - $lines[] = 'No files analyzed'; - } - - if (!$total) { - $lines[] = 'Psalm was unable to infer types in the codebase'; - } else { - $percentage = $nonmixed_count === $total ? '100' : number_format(100 * $nonmixed_count / $total, 4); - $lines[] = 'Psalm was able to infer types for ' . $percentage . '%' - . ' of the codebase'; - } - - return implode("\n", $lines); - } - - public function getNonMixedStats(): string - { - $stats = ''; - - $all_deep_scanned_files = []; - - foreach ($this->files_to_analyze as $file_path => $_) { - $all_deep_scanned_files[$file_path] = true; - - if (!$this->config->reportTypeStatsForFile($file_path)) { - continue; - } - - foreach ($this->file_storage_provider->get($file_path)->required_file_paths as $required_file_path) { - $all_deep_scanned_files[$required_file_path] = true; - } - } - - foreach ($all_deep_scanned_files as $file_path => $_) { - if (isset($this->mixed_counts[$file_path])) { - [$path_mixed_count, $path_nonmixed_count] = $this->mixed_counts[$file_path]; - - if ($path_mixed_count + $path_nonmixed_count) { - $stats .= number_format(100 * $path_nonmixed_count / ($path_mixed_count + $path_nonmixed_count), 3) - . '% ' . $this->config->shortenFileName($file_path) - . ' (' . $path_mixed_count . ' mixed)' . "\n"; - } - } - } - - return $stats; - } - - public function disableMixedCounts(): void - { - $this->count_mixed = false; - } - - public function enableMixedCounts(): void - { - $this->count_mixed = true; - } - - public function updateFile(string $file_path, bool $dry_run): void - { - FileManipulationBuffer::add( - $file_path, - FunctionDocblockManipulator::getManipulationsForFile($file_path) - ); - - FileManipulationBuffer::add( - $file_path, - PropertyDocblockManipulator::getManipulationsForFile($file_path) - ); - - FileManipulationBuffer::add( - $file_path, - ClassDocblockManipulator::getManipulationsForFile($file_path) - ); - - $file_manipulations = FileManipulationBuffer::getManipulationsForFile($file_path); - - if (!$file_manipulations) { - return; - } - - usort( - $file_manipulations, - function (FileManipulation $a, FileManipulation $b): int { - if ($b->end === $a->end) { - if ($a->start === $b->start) { - return $b->insertion_text > $a->insertion_text ? 1 : -1; - } - - return $b->start > $a->start ? 1 : -1; - } - - return $b->end > $a->end ? 1 : -1; - } - ); - - $last_start = PHP_INT_MAX; - $existing_contents = $this->file_provider->getContents($file_path); - - foreach ($file_manipulations as $manipulation) { - if ($manipulation->start <= $last_start) { - $existing_contents = $manipulation->transform($existing_contents); - $last_start = $manipulation->start; - } - } - - if ($dry_run) { - echo $file_path . ':' . "\n"; - - $differ = new Differ( - new StrictUnifiedDiffOutputBuilder([ - 'fromFile' => $file_path, - 'toFile' => $file_path, - ]) - ); - - echo $differ->diff($this->file_provider->getContents($file_path), $existing_contents); - - return; - } - - $this->progress->alterFileDone($file_path); - - $this->file_provider->setContents($file_path, $existing_contents); - } - - /** - * @return list - */ - public function getExistingIssuesForFile(string $file_path, int $start, int $end, ?string $issue_type = null): array - { - if (!isset($this->existing_issues[$file_path])) { - return []; - } - - $applicable_issues = []; - - foreach ($this->existing_issues[$file_path] as $issue_data) { - if ($issue_data->from >= $start && $issue_data->from <= $end) { - if ($issue_type === null || $issue_type === $issue_data->type) { - $applicable_issues[] = $issue_data; - } - } - } - - return $applicable_issues; - } - - public function removeExistingDataForFile(string $file_path, int $start, int $end, ?string $issue_type = null): void - { - if (isset($this->existing_issues[$file_path])) { - foreach ($this->existing_issues[$file_path] as $i => $issue_data) { - if ($issue_data->from >= $start && $issue_data->from <= $end) { - if ($issue_type === null || $issue_type === $issue_data->type) { - unset($this->existing_issues[$file_path][$i]); - } - } - } - } - - if (isset($this->type_map[$file_path])) { - foreach ($this->type_map[$file_path] as $map_start => $_) { - if ($map_start >= $start && $map_start <= $end) { - unset($this->type_map[$file_path][$map_start]); - } - } - } - - if (isset($this->reference_map[$file_path])) { - foreach ($this->reference_map[$file_path] as $map_start => $_) { - if ($map_start >= $start && $map_start <= $end) { - unset($this->reference_map[$file_path][$map_start]); - } - } - } - - if (isset($this->argument_map[$file_path])) { - foreach ($this->argument_map[$file_path] as $map_start => $_) { - if ($map_start >= $start && $map_start <= $end) { - unset($this->argument_map[$file_path][$map_start]); - } - } - } - } - - /** - * @return array> - */ - public function getAnalyzedMethods(): array - { - return $this->analyzed_methods; - } - - /** - * @return array - */ - public function getFileMaps(): array - { - $file_maps = []; - - foreach ($this->reference_map as $file_path => $reference_map) { - $file_maps[$file_path] = [$reference_map, [], []]; - } - - foreach ($this->type_map as $file_path => $type_map) { - if (isset($file_maps[$file_path])) { - $file_maps[$file_path][1] = $type_map; - } else { - $file_maps[$file_path] = [[], $type_map, []]; - } - } - - foreach ($this->argument_map as $file_path => $argument_map) { - if (isset($file_maps[$file_path])) { - $file_maps[$file_path][2] = $argument_map; - } else { - $file_maps[$file_path] = [[], [], $argument_map]; - } - } - - return $file_maps; - } - - /** - * @return FileMapType - */ - public function getMapsForFile(string $file_path): array - { - return [ - $this->reference_map[$file_path] ?? [], - $this->type_map[$file_path] ?? [], - $this->argument_map[$file_path] ?? [], - ]; - } - - /** - * @return array> - */ - public function getPossibleMethodParamTypes(): array - { - return $this->possible_method_param_types; - } - - public function addMutableClass(string $fqcln): void - { - $this->mutable_classes[strtolower($fqcln)] = true; - } - - public function setAnalyzedMethod(string $file_path, string $method_id, bool $is_constructor = false): void - { - $this->analyzed_methods[$file_path][$method_id] = $is_constructor ? 2 : 1; - } - - public function isMethodAlreadyAnalyzed(string $file_path, string $method_id, bool $is_constructor = false): bool - { - if ($is_constructor) { - return isset($this->analyzed_methods[$file_path][$method_id]) - && $this->analyzed_methods[$file_path][$method_id] === 2; - } - - return isset($this->analyzed_methods[$file_path][$method_id]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php deleted file mode 100644 index d3863440..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php +++ /dev/null @@ -1,61 +0,0 @@ -codebase = $codebase; - } - - /** - * @return list|null - */ - public function resolve(string $class_name, string $constant_pattern): ?array - { - if (!$this->codebase->classlike_storage_provider->has($class_name)) { - return null; - } - - $constant_regex_pattern = sprintf('#^%s$#', str_replace('*', '.*', $constant_pattern)); - - $class_like_storage = $this->codebase->classlike_storage_provider->get($class_name); - $matched_class_constant_types = []; - - foreach ($class_like_storage->constants as $constant => $class_constant_storage) { - if (preg_match($constant_regex_pattern, $constant) === 0) { - continue; - } - - if (! $class_constant_storage->type) { - $matched_class_constant_types[] = [new TMixed()]; - continue; - } - - $matched_class_constant_types[] = $class_constant_storage->type->getAtomicTypes(); - } - - return array_values(array_merge([], ...$matched_class_constant_types)); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php deleted file mode 100644 index 372d1da9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php +++ /dev/null @@ -1,2331 +0,0 @@ - - */ - private $existing_classlikes_lc = []; - - /** - * @var array - */ - private $existing_classes_lc = []; - - /** - * @var array - */ - private $existing_classes = []; - - /** - * @var array - */ - private $existing_interfaces_lc = []; - - /** - * @var array - */ - private $existing_interfaces = []; - - /** - * @var array - */ - private $existing_traits_lc = []; - - /** - * @var array - */ - private $existing_traits = []; - - /** - * @var array - */ - private $existing_enums_lc = []; - - /** - * @var array - */ - private $existing_enums = []; - - /** - * @var array - */ - private $classlike_aliases = []; - - /** - * @var array - */ - private $trait_nodes = []; - - /** - * @var bool - */ - public $collect_references = false; - - /** - * @var bool - */ - public $collect_locations = false; - - /** - * @var StatementsProvider - */ - private $statements_provider; - - /** - * @var Config - */ - private $config; - - /** - * @var Scanner - */ - private $scanner; - - public function __construct( - Config $config, - ClassLikeStorageProvider $storage_provider, - FileReferenceProvider $file_reference_provider, - StatementsProvider $statements_provider, - Scanner $scanner - ) { - $this->config = $config; - $this->classlike_storage_provider = $storage_provider; - $this->file_reference_provider = $file_reference_provider; - $this->statements_provider = $statements_provider; - $this->scanner = $scanner; - - $this->collectPredefinedClassLikes(); - } - - private function collectPredefinedClassLikes(): void - { - /** @var array */ - $predefined_classes = get_declared_classes(); - - foreach ($predefined_classes as $predefined_class) { - $predefined_class = preg_replace('/^\\\/', '', $predefined_class); - /** @psalm-suppress ArgumentTypeCoercion */ - $reflection_class = new ReflectionClass($predefined_class); - - if (!$reflection_class->isUserDefined()) { - $predefined_class_lc = strtolower($predefined_class); - $this->existing_classlikes_lc[$predefined_class_lc] = true; - $this->existing_classes_lc[$predefined_class_lc] = true; - $this->existing_classes[$predefined_class] = true; - } - } - - /** @var array */ - $predefined_interfaces = get_declared_interfaces(); - - foreach ($predefined_interfaces as $predefined_interface) { - $predefined_interface = preg_replace('/^\\\/', '', $predefined_interface); - /** @psalm-suppress ArgumentTypeCoercion */ - $reflection_class = new ReflectionClass($predefined_interface); - - if (!$reflection_class->isUserDefined()) { - $predefined_interface_lc = strtolower($predefined_interface); - $this->existing_classlikes_lc[$predefined_interface_lc] = true; - $this->existing_interfaces_lc[$predefined_interface_lc] = true; - $this->existing_interfaces[$predefined_interface] = true; - } - } - } - - public function addFullyQualifiedClassName(string $fq_class_name, ?string $file_path = null): void - { - $fq_class_name_lc = strtolower($fq_class_name); - $this->existing_classlikes_lc[$fq_class_name_lc] = true; - $this->existing_classes_lc[$fq_class_name_lc] = true; - $this->existing_classes[$fq_class_name] = true; - - $this->existing_traits_lc[$fq_class_name_lc] = false; - $this->existing_interfaces_lc[$fq_class_name_lc] = false; - $this->existing_enums_lc[$fq_class_name_lc] = false; - - if ($file_path) { - $this->scanner->setClassLikeFilePath($fq_class_name_lc, $file_path); - } - } - - public function addFullyQualifiedInterfaceName(string $fq_class_name, ?string $file_path = null): void - { - $fq_class_name_lc = strtolower($fq_class_name); - $this->existing_classlikes_lc[$fq_class_name_lc] = true; - $this->existing_interfaces_lc[$fq_class_name_lc] = true; - $this->existing_interfaces[$fq_class_name] = true; - - $this->existing_classes_lc[$fq_class_name_lc] = false; - $this->existing_traits_lc[$fq_class_name_lc] = false; - $this->existing_enums_lc[$fq_class_name_lc] = false; - - if ($file_path) { - $this->scanner->setClassLikeFilePath($fq_class_name_lc, $file_path); - } - } - - public function addFullyQualifiedTraitName(string $fq_class_name, ?string $file_path = null): void - { - $fq_class_name_lc = strtolower($fq_class_name); - $this->existing_classlikes_lc[$fq_class_name_lc] = true; - $this->existing_traits_lc[$fq_class_name_lc] = true; - $this->existing_traits[$fq_class_name] = true; - - $this->existing_classes_lc[$fq_class_name_lc] = false; - $this->existing_interfaces_lc[$fq_class_name_lc] = false; - $this->existing_enums[$fq_class_name] = false; - - if ($file_path) { - $this->scanner->setClassLikeFilePath($fq_class_name_lc, $file_path); - } - } - - public function addFullyQualifiedEnumName(string $fq_class_name, ?string $file_path = null): void - { - $fq_class_name_lc = strtolower($fq_class_name); - $this->existing_classlikes_lc[$fq_class_name_lc] = true; - $this->existing_enums_lc[$fq_class_name_lc] = true; - $this->existing_enums[$fq_class_name] = true; - - $this->existing_traits_lc[$fq_class_name_lc] = false; - $this->existing_classes_lc[$fq_class_name_lc] = false; - $this->existing_interfaces_lc[$fq_class_name_lc] = false; - - if ($file_path) { - $this->scanner->setClassLikeFilePath($fq_class_name_lc, $file_path); - } - } - - public function addFullyQualifiedClassLikeName(string $fq_class_name_lc, ?string $file_path = null): void - { - if ($file_path) { - $this->scanner->setClassLikeFilePath($fq_class_name_lc, $file_path); - } - } - - /** - * @return list - */ - public function getMatchingClassLikeNames(string $stub): array - { - $matching_classes = []; - - if ($stub[0] === '*') { - $stub = substr($stub, 1); - } - - $fully_qualified = false; - - if ($stub[0] === '\\') { - $fully_qualified = true; - $stub = substr($stub, 1); - } else { - // for any not-fully-qualified class name the bit we care about comes after a dash - [, $stub] = explode('-', $stub); - } - - $stub = preg_quote(strtolower($stub)); - - if ($fully_qualified) { - $stub = '^' . $stub; - } else { - $stub = '(^|\\\)' . $stub; - } - - foreach ($this->existing_classes as $fq_classlike_name => $found) { - if (!$found) { - continue; - } - - if (preg_match('@' . $stub . '.*@i', $fq_classlike_name)) { - $matching_classes[] = $fq_classlike_name; - } - } - - foreach ($this->existing_interfaces as $fq_classlike_name => $found) { - if (!$found) { - continue; - } - - if (preg_match('@' . $stub . '.*@i', $fq_classlike_name)) { - $matching_classes[] = $fq_classlike_name; - } - } - - return $matching_classes; - } - - public function hasFullyQualifiedClassName( - string $fq_class_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - $fq_class_name_lc = strtolower($this->getUnAliasedName($fq_class_name)); - - if ($code_location) { - if ($calling_method_id) { - $this->file_reference_provider->addMethodReferenceToClass( - $calling_method_id, - $fq_class_name_lc - ); - } elseif (!$calling_fq_class_name || strtolower($calling_fq_class_name) !== $fq_class_name_lc) { - $this->file_reference_provider->addNonMethodReferenceToClass( - $code_location->file_path, - $fq_class_name_lc - ); - - if ($calling_fq_class_name) { - $class_storage = $this->classlike_storage_provider->get($calling_fq_class_name); - - if ($class_storage->location - && $class_storage->location->file_path !== $code_location->file_path - ) { - $this->file_reference_provider->addNonMethodReferenceToClass( - $class_storage->location->file_path, - $fq_class_name_lc - ); - } - } - } - } - - if (!isset($this->existing_classes_lc[$fq_class_name_lc]) - || !$this->existing_classes_lc[$fq_class_name_lc] - || !$this->classlike_storage_provider->has($fq_class_name_lc) - ) { - if (( - !isset($this->existing_classes_lc[$fq_class_name_lc]) - || $this->existing_classes_lc[$fq_class_name_lc] - ) - && !$this->classlike_storage_provider->has($fq_class_name_lc) - ) { - if (!isset($this->existing_classes_lc[$fq_class_name_lc])) { - $this->existing_classes_lc[$fq_class_name_lc] = false; - - return false; - } - - return $this->existing_classes_lc[$fq_class_name_lc]; - } - - return false; - } - - if ($this->collect_locations && $code_location) { - $this->file_reference_provider->addCallingLocationForClass( - $code_location, - strtolower($fq_class_name) - ); - } - - return true; - } - - public function hasFullyQualifiedInterfaceName( - string $fq_class_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - $fq_class_name_lc = strtolower($this->getUnAliasedName($fq_class_name)); - - if (!isset($this->existing_interfaces_lc[$fq_class_name_lc]) - || !$this->existing_interfaces_lc[$fq_class_name_lc] - || !$this->classlike_storage_provider->has($fq_class_name_lc) - ) { - if (( - !isset($this->existing_classes_lc[$fq_class_name_lc]) - || $this->existing_classes_lc[$fq_class_name_lc] - ) - && !$this->classlike_storage_provider->has($fq_class_name_lc) - ) { - if (!isset($this->existing_interfaces_lc[$fq_class_name_lc])) { - $this->existing_interfaces_lc[$fq_class_name_lc] = false; - - return false; - } - - return $this->existing_interfaces_lc[$fq_class_name_lc]; - } - - return false; - } - - if ($this->collect_references && $code_location) { - if ($calling_method_id) { - $this->file_reference_provider->addMethodReferenceToClass( - $calling_method_id, - $fq_class_name_lc - ); - } else { - $this->file_reference_provider->addNonMethodReferenceToClass( - $code_location->file_path, - $fq_class_name_lc - ); - - if ($calling_fq_class_name) { - $class_storage = $this->classlike_storage_provider->get($calling_fq_class_name); - - if ($class_storage->location - && $class_storage->location->file_path !== $code_location->file_path - ) { - $this->file_reference_provider->addNonMethodReferenceToClass( - $class_storage->location->file_path, - $fq_class_name_lc - ); - } - } - } - } - - if ($this->collect_locations && $code_location) { - $this->file_reference_provider->addCallingLocationForClass( - $code_location, - strtolower($fq_class_name) - ); - } - - return true; - } - - public function hasFullyQualifiedEnumName( - string $fq_class_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - $fq_class_name_lc = strtolower($this->getUnAliasedName($fq_class_name)); - - if (!isset($this->existing_enums_lc[$fq_class_name_lc]) - || !$this->existing_enums_lc[$fq_class_name_lc] - || !$this->classlike_storage_provider->has($fq_class_name_lc) - ) { - if (( - !isset($this->existing_classes_lc[$fq_class_name_lc]) - || $this->existing_classes_lc[$fq_class_name_lc] - ) - && !$this->classlike_storage_provider->has($fq_class_name_lc) - ) { - if (!isset($this->existing_enums_lc[$fq_class_name_lc])) { - $this->existing_enums_lc[$fq_class_name_lc] = false; - - return false; - } - - return $this->existing_enums_lc[$fq_class_name_lc]; - } - - return false; - } - - if ($this->collect_references && $code_location) { - if ($calling_method_id) { - $this->file_reference_provider->addMethodReferenceToClass( - $calling_method_id, - $fq_class_name_lc - ); - } else { - $this->file_reference_provider->addNonMethodReferenceToClass( - $code_location->file_path, - $fq_class_name_lc - ); - - if ($calling_fq_class_name) { - $class_storage = $this->classlike_storage_provider->get($calling_fq_class_name); - - if ($class_storage->location - && $class_storage->location->file_path !== $code_location->file_path - ) { - $this->file_reference_provider->addNonMethodReferenceToClass( - $class_storage->location->file_path, - $fq_class_name_lc - ); - } - } - } - } - - if ($this->collect_locations && $code_location) { - $this->file_reference_provider->addCallingLocationForClass( - $code_location, - strtolower($fq_class_name) - ); - } - - return true; - } - - public function hasFullyQualifiedTraitName(string $fq_class_name, ?CodeLocation $code_location = null): bool - { - $fq_class_name_lc = strtolower($this->getUnAliasedName($fq_class_name)); - - if (!isset($this->existing_traits_lc[$fq_class_name_lc]) || - !$this->existing_traits_lc[$fq_class_name_lc] - ) { - return false; - } - - if ($this->collect_references && $code_location) { - $this->file_reference_provider->addNonMethodReferenceToClass( - $code_location->file_path, - $fq_class_name_lc - ); - } - - return true; - } - - /** - * Check whether a class/interface exists - */ - public function classOrInterfaceExists( - string $fq_class_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - return $this->classExists($fq_class_name, $code_location, $calling_fq_class_name, $calling_method_id) - || $this->interfaceExists($fq_class_name, $code_location, $calling_fq_class_name, $calling_method_id); - } - - /** - * Check whether a class/interface exists - */ - public function classOrInterfaceOrEnumExists( - string $fq_class_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - return $this->classExists($fq_class_name, $code_location, $calling_fq_class_name, $calling_method_id) - || $this->interfaceExists($fq_class_name, $code_location, $calling_fq_class_name, $calling_method_id) - || $this->enumExists($fq_class_name, $code_location, $calling_fq_class_name, $calling_method_id); - } - - /** - * Determine whether or not a given class exists - */ - public function classExists( - string $fq_class_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - if (isset(ClassLikeAnalyzer::SPECIAL_TYPES[$fq_class_name])) { - return false; - } - - if ($fq_class_name === 'Generator') { - return true; - } - - return $this->hasFullyQualifiedClassName( - $fq_class_name, - $code_location, - $calling_fq_class_name, - $calling_method_id - ); - } - - /** - * Determine whether or not a class extends a parent - * - * @throws UnpopulatedClasslikeException when called on unpopulated class - * @throws InvalidArgumentException when class does not exist - */ - public function classExtends(string $fq_class_name, string $possible_parent, bool $from_api = false): bool - { - $unaliased_fq_class_name = $this->getUnAliasedName($fq_class_name); - $unaliased_fq_class_name_lc = strtolower($unaliased_fq_class_name); - - if ($unaliased_fq_class_name_lc === 'generator') { - return false; - } - - $class_storage = $this->classlike_storage_provider->get($unaliased_fq_class_name); - - if ($from_api && !$class_storage->populated) { - throw new UnpopulatedClasslikeException($fq_class_name); - } - - return isset($class_storage->parent_classes[strtolower($possible_parent)]); - } - - /** - * Check whether a class implements an interface - */ - public function classImplements(string $fq_class_name, string $interface): bool - { - $interface_id = strtolower($interface); - - $fq_class_name = strtolower($fq_class_name); - - if ($interface_id === 'callable' && $fq_class_name === 'closure') { - return true; - } - - if ($interface_id === 'traversable' && $fq_class_name === 'generator') { - return true; - } - - if ($interface_id === 'traversable' && $fq_class_name === 'iterator') { - return true; - } - - if (isset(ClassLikeAnalyzer::SPECIAL_TYPES[$interface_id]) - || isset(ClassLikeAnalyzer::SPECIAL_TYPES[$fq_class_name]) - ) { - return false; - } - - $fq_class_name = $this->getUnAliasedName($fq_class_name); - - if (!$this->classlike_storage_provider->has($fq_class_name)) { - return false; - } - $class_storage = $this->classlike_storage_provider->get($fq_class_name); - - if (isset($class_storage->class_implements[$interface_id])) { - return true; - } - - foreach ($class_storage->class_implements as $implementing_interface_lc => $_) { - $aliased_interface_lc = strtolower( - $this->getUnAliasedName($implementing_interface_lc) - ); - - if ($aliased_interface_lc === $interface_id) { - return true; - } - } - - return false; - } - - public function interfaceExists( - string $fq_interface_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - if (isset(ClassLikeAnalyzer::SPECIAL_TYPES[strtolower($fq_interface_name)])) { - return false; - } - - return $this->hasFullyQualifiedInterfaceName( - $fq_interface_name, - $code_location, - $calling_fq_class_name, - $calling_method_id - ); - } - - public function enumExists( - string $fq_enum_name, - ?CodeLocation $code_location = null, - ?string $calling_fq_class_name = null, - ?string $calling_method_id = null - ): bool { - if (isset(ClassLikeAnalyzer::SPECIAL_TYPES[strtolower($fq_enum_name)])) { - return false; - } - - return $this->hasFullyQualifiedEnumName( - $fq_enum_name, - $code_location, - $calling_fq_class_name, - $calling_method_id - ); - } - - public function interfaceExtends(string $interface_name, string $possible_parent): bool - { - return isset($this->getParentInterfaces($interface_name)[strtolower($possible_parent)]); - } - - /** - * @return array all interfaces extended by $interface_name - */ - public function getParentInterfaces(string $fq_interface_name): array - { - $fq_interface_name = strtolower($fq_interface_name); - - return $this->classlike_storage_provider->get($fq_interface_name)->parent_interfaces; - } - - public function traitExists(string $fq_trait_name, ?CodeLocation $code_location = null): bool - { - return $this->hasFullyQualifiedTraitName($fq_trait_name, $code_location); - } - - /** - * Determine whether or not a class has the correct casing - */ - public function classHasCorrectCasing(string $fq_class_name): bool - { - if ($fq_class_name === 'Generator') { - return true; - } - - if (isset($this->classlike_aliases[strtolower($fq_class_name)])) { - return true; - } - - return isset($this->existing_classes[$fq_class_name]); - } - - public function interfaceHasCorrectCasing(string $fq_interface_name): bool - { - if (isset($this->classlike_aliases[strtolower($fq_interface_name)])) { - return true; - } - - return isset($this->existing_interfaces[$fq_interface_name]); - } - - public function enumHasCorrectCasing(string $fq_enum_name): bool - { - if (isset($this->classlike_aliases[strtolower($fq_enum_name)])) { - return true; - } - - return isset($this->existing_enums[$fq_enum_name]); - } - - public function traitHasCorrectCase(string $fq_trait_name): bool - { - if (isset($this->classlike_aliases[strtolower($fq_trait_name)])) { - return true; - } - - return isset($this->existing_traits[$fq_trait_name]); - } - - /** - * @param lowercase-string $fq_class_name - */ - public function isUserDefined(string $fq_class_name): bool - { - return $this->classlike_storage_provider->get($fq_class_name)->user_defined; - } - - public function getTraitNode(string $fq_trait_name): PhpParser\Node\Stmt\Trait_ - { - $fq_trait_name_lc = strtolower($fq_trait_name); - - if (isset($this->trait_nodes[$fq_trait_name_lc])) { - return $this->trait_nodes[$fq_trait_name_lc]; - } - - $storage = $this->classlike_storage_provider->get($fq_trait_name); - - if (!$storage->location) { - throw new UnexpectedValueException('Storage should exist for ' . $fq_trait_name); - } - - $file_statements = $this->statements_provider->getStatementsForFile($storage->location->file_path, '7.4'); - - $trait_finder = new TraitFinder($fq_trait_name); - - $traverser = new NodeTraverser(); - $traverser->addVisitor( - $trait_finder - ); - - $traverser->traverse($file_statements); - - $trait_node = $trait_finder->getNode(); - - if ($trait_node) { - $this->trait_nodes[$fq_trait_name_lc] = $trait_node; - - return $trait_node; - } - - throw new UnexpectedValueException('Could not locate trait statement'); - } - - /** - * @param lowercase-string $alias_name - */ - public function addClassAlias(string $fq_class_name, string $alias_name): void - { - $this->classlike_aliases[$alias_name] = $fq_class_name; - } - - public function getUnAliasedName(string $alias_name): string - { - $alias_name_lc = strtolower($alias_name); - if ($this->existing_classlikes_lc[$alias_name_lc] ?? false) { - return $alias_name; - } - - $result = $this->classlike_aliases[$alias_name_lc] ?? $alias_name; - if ($result === $alias_name) { - return $result; - } - - return $this->getUnAliasedName($result); - } - - public function consolidateAnalyzedData(Methods $methods, ?Progress $progress, bool $find_unused_code): void - { - if ($progress === null) { - $progress = new VoidProgress(); - } - - $progress->debug('Checking class references' . PHP_EOL); - - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - - foreach ($this->existing_classlikes_lc as $fq_class_name_lc => $_) { - try { - $classlike_storage = $this->classlike_storage_provider->get($fq_class_name_lc); - } catch (InvalidArgumentException $e) { - continue; - } - - if ($classlike_storage->location - && $this->config->isInProjectDirs($classlike_storage->location->file_path) - && !$classlike_storage->is_trait - ) { - if ($find_unused_code) { - if (!$this->file_reference_provider->isClassReferenced($fq_class_name_lc)) { - IssueBuffer::maybeAdd( - new UnusedClass( - 'Class ' . $classlike_storage->name . ' is never used', - $classlike_storage->location, - $classlike_storage->name - ), - $classlike_storage->suppressed_issues - ); - } else { - $this->checkMethodReferences($classlike_storage, $methods); - $this->checkPropertyReferences($classlike_storage); - } - } - - $this->findPossibleMethodParamTypes($classlike_storage); - - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['MissingImmutableAnnotation']) - && !isset($codebase->analyzer->mutable_classes[$fq_class_name_lc]) - && !$classlike_storage->external_mutation_free - && $classlike_storage->properties - && isset($classlike_storage->methods['__construct']) - ) { - $stmts = $codebase->getStatementsForFile( - $classlike_storage->location->file_path - ); - - foreach ($stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\Namespace_) { - foreach ($stmt->stmts as $namespace_stmt) { - if ($namespace_stmt instanceof PhpParser\Node\Stmt\Class_ - && strtolower((string) $stmt->name . '\\' . (string) $namespace_stmt->name) - === $fq_class_name_lc - ) { - self::makeImmutable( - $namespace_stmt, - $project_analyzer, - $classlike_storage->location->file_path - ); - } - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\Class_ - && strtolower((string) $stmt->name) === $fq_class_name_lc - ) { - self::makeImmutable( - $stmt, - $project_analyzer, - $classlike_storage->location->file_path - ); - } - } - } - } - } - } - - public static function makeImmutable( - PhpParser\Node\Stmt\Class_ $class_stmt, - ProjectAnalyzer $project_analyzer, - string $file_path - ): void { - $manipulator = ClassDocblockManipulator::getForClass( - $project_analyzer, - $file_path, - $class_stmt - ); - - $manipulator->makeImmutable(); - } - - public function moveMethods(Methods $methods, ?Progress $progress = null): void - { - if ($progress === null) { - $progress = new VoidProgress(); - } - - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - - if (!$codebase->methods_to_move) { - return; - } - - $progress->debug('Refactoring methods ' . PHP_EOL); - - $code_migrations = []; - - foreach ($codebase->methods_to_move as $source => $destination) { - $source_parts = explode('::', $source); - - try { - $source_method_storage = $methods->getStorage( - new MethodIdentifier(...$source_parts) - ); - } catch (InvalidArgumentException $e) { - continue; - } - - [$destination_fq_class_name, $destination_name] = explode('::', $destination); - - try { - $classlike_storage = $this->classlike_storage_provider->get($destination_fq_class_name); - } catch (InvalidArgumentException $e) { - continue; - } - - if ($classlike_storage->stmt_location - && $this->config->isInProjectDirs($classlike_storage->stmt_location->file_path) - && $source_method_storage->stmt_location - && $source_method_storage->stmt_location->file_path - && $source_method_storage->location - ) { - $new_class_bounds = $classlike_storage->stmt_location->getSnippetBounds(); - $old_method_bounds = $source_method_storage->stmt_location->getSnippetBounds(); - - $old_method_name_bounds = $source_method_storage->location->getSelectionBounds(); - - FileManipulationBuffer::add( - $source_method_storage->stmt_location->file_path, - [ - new FileManipulation( - $old_method_name_bounds[0], - $old_method_name_bounds[1], - $destination_name - ), - ] - ); - - $selection = $classlike_storage->stmt_location->getSnippet(); - - $insert_pos = strrpos($selection, "\n", -1); - - if (!$insert_pos) { - $insert_pos = strlen($selection) - 1; - } else { - ++$insert_pos; - } - - $code_migrations[] = new CodeMigration( - $source_method_storage->stmt_location->file_path, - $old_method_bounds[0], - $old_method_bounds[1], - $classlike_storage->stmt_location->file_path, - $new_class_bounds[0] + $insert_pos - ); - } - } - - FileManipulationBuffer::addCodeMigrations($code_migrations); - } - - public function moveProperties(Properties $properties, ?Progress $progress = null): void - { - if ($progress === null) { - $progress = new VoidProgress(); - } - - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - - if (!$codebase->properties_to_move) { - return; - } - - $progress->debug('Refacting properties ' . PHP_EOL); - - $code_migrations = []; - - foreach ($codebase->properties_to_move as $source => $destination) { - try { - $source_property_storage = $properties->getStorage($source); - } catch (InvalidArgumentException $e) { - continue; - } - - [$source_fq_class_name] = explode('::$', $source); - [$destination_fq_class_name, $destination_name] = explode('::$', $destination); - - $source_classlike_storage = $this->classlike_storage_provider->get($source_fq_class_name); - $destination_classlike_storage = $this->classlike_storage_provider->get($destination_fq_class_name); - - if ($destination_classlike_storage->stmt_location - && $this->config->isInProjectDirs($destination_classlike_storage->stmt_location->file_path) - && $source_property_storage->stmt_location - && $source_property_storage->stmt_location->file_path - && $source_property_storage->location - ) { - if ($source_property_storage->type - && $source_property_storage->type_location - && $source_property_storage->type_location !== $source_property_storage->signature_type_location - ) { - $bounds = $source_property_storage->type_location->getSelectionBounds(); - - $replace_type = TypeExpander::expandUnion( - $codebase, - $source_property_storage->type, - $source_classlike_storage->name, - $source_classlike_storage->name, - $source_classlike_storage->parent_class - ); - - $this->airliftClassDefinedDocblockType( - $replace_type, - $destination_fq_class_name, - $source_property_storage->stmt_location->file_path, - $bounds[0], - $bounds[1] - ); - } - - $new_class_bounds = $destination_classlike_storage->stmt_location->getSnippetBounds(); - $old_property_bounds = $source_property_storage->stmt_location->getSnippetBounds(); - - $old_property_name_bounds = $source_property_storage->location->getSelectionBounds(); - - FileManipulationBuffer::add( - $source_property_storage->stmt_location->file_path, - [ - new FileManipulation( - $old_property_name_bounds[0], - $old_property_name_bounds[1], - '$' . $destination_name - ), - ] - ); - - $selection = $destination_classlike_storage->stmt_location->getSnippet(); - - $insert_pos = strrpos($selection, "\n", -1); - - if (!$insert_pos) { - $insert_pos = strlen($selection) - 1; - } else { - ++$insert_pos; - } - - $code_migrations[] = new CodeMigration( - $source_property_storage->stmt_location->file_path, - $old_property_bounds[0], - $old_property_bounds[1], - $destination_classlike_storage->stmt_location->file_path, - $new_class_bounds[0] + $insert_pos - ); - } - } - - FileManipulationBuffer::addCodeMigrations($code_migrations); - } - - public function moveClassConstants(?Progress $progress = null): void - { - if ($progress === null) { - $progress = new VoidProgress(); - } - - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - - if (!$codebase->class_constants_to_move) { - return; - } - - $progress->debug('Refacting constants ' . PHP_EOL); - - $code_migrations = []; - - foreach ($codebase->class_constants_to_move as $source => $destination) { - [$source_fq_class_name, $source_const_name] = explode('::', $source); - [$destination_fq_class_name, $destination_name] = explode('::', $destination); - - $source_classlike_storage = $this->classlike_storage_provider->get($source_fq_class_name); - $destination_classlike_storage = $this->classlike_storage_provider->get($destination_fq_class_name); - - $constant_storage = $source_classlike_storage->constants[$source_const_name]; - - $source_const_stmt_location = $constant_storage->stmt_location; - $source_const_location = $constant_storage->location; - - if (!$source_const_location || !$source_const_stmt_location) { - continue; - } - - if ($destination_classlike_storage->stmt_location - && $this->config->isInProjectDirs($destination_classlike_storage->stmt_location->file_path) - && $source_const_stmt_location->file_path - ) { - $new_class_bounds = $destination_classlike_storage->stmt_location->getSnippetBounds(); - $old_const_bounds = $source_const_stmt_location->getSnippetBounds(); - - $old_const_name_bounds = $source_const_location->getSelectionBounds(); - - FileManipulationBuffer::add( - $source_const_stmt_location->file_path, - [ - new FileManipulation( - $old_const_name_bounds[0], - $old_const_name_bounds[1], - $destination_name - ), - ] - ); - - $selection = $destination_classlike_storage->stmt_location->getSnippet(); - - $insert_pos = strrpos($selection, "\n", -1); - - if (!$insert_pos) { - $insert_pos = strlen($selection) - 1; - } else { - ++$insert_pos; - } - - $code_migrations[] = new CodeMigration( - $source_const_stmt_location->file_path, - $old_const_bounds[0], - $old_const_bounds[1], - $destination_classlike_storage->stmt_location->file_path, - $new_class_bounds[0] + $insert_pos - ); - } - } - - FileManipulationBuffer::addCodeMigrations($code_migrations); - } - - /** - * @param lowercase-string|null $calling_method_id - */ - public function handleClassLikeReferenceInMigration( - Codebase $codebase, - StatementsSource $source, - PhpParser\Node $class_name_node, - string $fq_class_name, - ?string $calling_method_id, - bool $force_change = false, - bool $was_self = false - ): bool { - if ($class_name_node instanceof VirtualNode) { - return false; - } - $calling_fq_class_name = $source->getFQCLN(); - - // if we're inside a moved class static method - if ($codebase->methods_to_move - && $calling_fq_class_name - && $calling_method_id - && isset($codebase->methods_to_move[$calling_method_id]) - ) { - $destination_class = explode('::', $codebase->methods_to_move[$calling_method_id])[0]; - - $intended_fq_class_name = strtolower($calling_fq_class_name) === strtolower($fq_class_name) - && isset($codebase->classes_to_move[strtolower($calling_fq_class_name)]) - ? $destination_class - : $fq_class_name; - - $this->airliftClassLikeReference( - $intended_fq_class_name, - $destination_class, - $source->getFilePath(), - (int) $class_name_node->getAttribute('startFilePos'), - (int) $class_name_node->getAttribute('endFilePos') + 1, - $class_name_node instanceof PhpParser\Node\Scalar\MagicConst\Class_, - $was_self - ); - - return true; - } - - // if we're outside a moved class, but we're changing all references to a class - if (isset($codebase->class_transforms[strtolower($fq_class_name)])) { - $new_fq_class_name = $codebase->class_transforms[strtolower($fq_class_name)]; - $file_manipulations = []; - - if ($class_name_node instanceof PhpParser\Node\Identifier) { - $destination_parts = explode('\\', $new_fq_class_name); - - $destination_class_name = array_pop($destination_parts); - - $file_manipulations[] = new FileManipulation( - (int) $class_name_node->getAttribute('startFilePos'), - (int) $class_name_node->getAttribute('endFilePos') + 1, - $destination_class_name - ); - - FileManipulationBuffer::add($source->getFilePath(), $file_manipulations); - - return true; - } - - $uses_flipped = $source->getAliasedClassesFlipped(); - $uses_flipped_replaceable = $source->getAliasedClassesFlippedReplaceable(); - - $old_fq_class_name = strtolower($fq_class_name); - - $migrated_source_fqcln = $calling_fq_class_name; - - if ($calling_fq_class_name - && isset($codebase->class_transforms[strtolower($calling_fq_class_name)]) - ) { - $migrated_source_fqcln = $codebase->class_transforms[strtolower($calling_fq_class_name)]; - } - - $source_namespace = $source->getNamespace(); - - if ($migrated_source_fqcln && $calling_fq_class_name !== $migrated_source_fqcln) { - $new_source_parts = explode('\\', $migrated_source_fqcln, -1); - $source_namespace = implode('\\', $new_source_parts); - } - - if (isset($uses_flipped_replaceable[$old_fq_class_name])) { - $alias = $uses_flipped_replaceable[$old_fq_class_name]; - unset($uses_flipped[$old_fq_class_name]); - $old_class_name_parts = explode('\\', $old_fq_class_name); - $old_class_name = end($old_class_name_parts); - if ($old_class_name === strtolower($alias)) { - $new_class_name_parts = explode('\\', $new_fq_class_name); - $new_class_name = end($new_class_name_parts); - $uses_flipped[strtolower($new_fq_class_name)] = $new_class_name; - } else { - $uses_flipped[strtolower($new_fq_class_name)] = $alias; - } - } - - $file_manipulations[] = new FileManipulation( - (int) $class_name_node->getAttribute('startFilePos'), - (int) $class_name_node->getAttribute('endFilePos') + 1, - Type::getStringFromFQCLN( - $new_fq_class_name, - $source_namespace, - $uses_flipped, - $migrated_source_fqcln, - $was_self - ) - . ($class_name_node instanceof PhpParser\Node\Scalar\MagicConst\Class_ ? '::class' : '') - ); - - FileManipulationBuffer::add($source->getFilePath(), $file_manipulations); - - return true; - } - - // if we're inside a moved class (could be a method, could be a property/class const default) - if ($codebase->classes_to_move - && $calling_fq_class_name - && isset($codebase->classes_to_move[strtolower($calling_fq_class_name)]) - ) { - $destination_class = $codebase->classes_to_move[strtolower($calling_fq_class_name)]; - - if ($class_name_node instanceof PhpParser\Node\Identifier) { - $destination_parts = explode('\\', $destination_class); - - $destination_class_name = array_pop($destination_parts); - $file_manipulations = []; - - $file_manipulations[] = new FileManipulation( - (int) $class_name_node->getAttribute('startFilePos'), - (int) $class_name_node->getAttribute('endFilePos') + 1, - $destination_class_name - ); - - FileManipulationBuffer::add($source->getFilePath(), $file_manipulations); - } else { - $this->airliftClassLikeReference( - strtolower($calling_fq_class_name) === strtolower($fq_class_name) - ? $destination_class - : $fq_class_name, - $destination_class, - $source->getFilePath(), - (int) $class_name_node->getAttribute('startFilePos'), - (int) $class_name_node->getAttribute('endFilePos') + 1, - $class_name_node instanceof PhpParser\Node\Scalar\MagicConst\Class_ - ); - } - - return true; - } - - if ($force_change) { - if ($calling_fq_class_name) { - $this->airliftClassLikeReference( - $fq_class_name, - $calling_fq_class_name, - $source->getFilePath(), - (int) $class_name_node->getAttribute('startFilePos'), - (int) $class_name_node->getAttribute('endFilePos') + 1 - ); - } else { - $file_manipulations = []; - - $file_manipulations[] = new FileManipulation( - (int) $class_name_node->getAttribute('startFilePos'), - (int) $class_name_node->getAttribute('endFilePos') + 1, - Type::getStringFromFQCLN( - $fq_class_name, - $source->getNamespace(), - $source->getAliasedClassesFlipped(), - null - ) - ); - - FileManipulationBuffer::add($source->getFilePath(), $file_manipulations); - } - - return true; - } - - return false; - } - - /** - * @param lowercase-string|null $calling_method_id - */ - public function handleDocblockTypeInMigration( - Codebase $codebase, - StatementsSource $source, - Union $type, - CodeLocation $type_location, - ?string $calling_method_id - ): void { - $calling_fq_class_name = $source->getFQCLN(); - $fq_class_name_lc = strtolower($calling_fq_class_name ?? ''); - - $moved_type = false; - - // if we're inside a moved class static method - if ($codebase->methods_to_move - && $calling_fq_class_name - && $calling_method_id - && isset($codebase->methods_to_move[$calling_method_id]) - ) { - $bounds = $type_location->getSelectionBounds(); - - $destination_class = explode('::', $codebase->methods_to_move[$calling_method_id])[0]; - - $this->airliftClassDefinedDocblockType( - $type, - $destination_class, - $source->getFilePath(), - $bounds[0], - $bounds[1] - ); - - $moved_type = true; - } - - // if we're outside a moved class, but we're changing all references to a class - if (!$moved_type && $codebase->class_transforms) { - $uses_flipped = $source->getAliasedClassesFlipped(); - $uses_flipped_replaceable = $source->getAliasedClassesFlippedReplaceable(); - - $migrated_source_fqcln = $calling_fq_class_name; - - if ($calling_fq_class_name - && isset($codebase->class_transforms[$fq_class_name_lc]) - ) { - $migrated_source_fqcln = $codebase->class_transforms[$fq_class_name_lc]; - } - - $source_namespace = $source->getNamespace(); - - if ($migrated_source_fqcln && $calling_fq_class_name !== $migrated_source_fqcln) { - $new_source_parts = explode('\\', $migrated_source_fqcln, -1); - $source_namespace = implode('\\', $new_source_parts); - } - - foreach ($codebase->class_transforms as $old_fq_class_name => $new_fq_class_name) { - if (isset($uses_flipped_replaceable[$old_fq_class_name])) { - $alias = $uses_flipped_replaceable[$old_fq_class_name]; - unset($uses_flipped[$old_fq_class_name]); - $old_class_name_parts = explode('\\', $old_fq_class_name); - $old_class_name = end($old_class_name_parts); - if ($old_class_name === strtolower($alias)) { - $new_class_name_parts = explode('\\', $new_fq_class_name); - $new_class_name = end($new_class_name_parts); - $uses_flipped[strtolower($new_fq_class_name)] = $new_class_name; - } else { - $uses_flipped[strtolower($new_fq_class_name)] = $alias; - } - } - } - - foreach ($codebase->class_transforms as $old_fq_class_name => $new_fq_class_name) { - if ($type->containsClassLike($old_fq_class_name)) { - $type = clone $type; - - $type->replaceClassLike($old_fq_class_name, $new_fq_class_name); - - $bounds = $type_location->getSelectionBounds(); - - $file_manipulations = []; - - $file_manipulations[] = new FileManipulation( - $bounds[0], - $bounds[1], - $type->toNamespacedString( - $source_namespace, - $uses_flipped, - $migrated_source_fqcln, - false - ) - ); - - FileManipulationBuffer::add( - $source->getFilePath(), - $file_manipulations - ); - - $moved_type = true; - } - } - } - - // if we're inside a moved class (could be a method, could be a property/class const default) - if (!$moved_type - && $codebase->classes_to_move - && $calling_fq_class_name - && isset($codebase->classes_to_move[$fq_class_name_lc]) - ) { - $bounds = $type_location->getSelectionBounds(); - - $destination_class = $codebase->classes_to_move[$fq_class_name_lc]; - - if ($type->containsClassLike($fq_class_name_lc)) { - $type = clone $type; - - $type->replaceClassLike($fq_class_name_lc, $destination_class); - } - - $this->airliftClassDefinedDocblockType( - $type, - $destination_class, - $source->getFilePath(), - $bounds[0], - $bounds[1] - ); - } - } - - public function airliftClassLikeReference( - string $fq_class_name, - string $destination_fq_class_name, - string $source_file_path, - int $source_start, - int $source_end, - bool $add_class_constant = false, - bool $allow_self = false - ): void { - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - - $destination_class_storage = $codebase->classlike_storage_provider->get($destination_fq_class_name); - - if (!$destination_class_storage->aliases) { - throw new UnexpectedValueException('Aliases should not be null'); - } - - $file_manipulations = []; - - $file_manipulations[] = new FileManipulation( - $source_start, - $source_end, - Type::getStringFromFQCLN( - $fq_class_name, - $destination_class_storage->aliases->namespace, - $destination_class_storage->aliases->uses_flipped, - $destination_class_storage->name, - $allow_self - ) . ($add_class_constant ? '::class' : '') - ); - - FileManipulationBuffer::add( - $source_file_path, - $file_manipulations - ); - } - - public function airliftClassDefinedDocblockType( - Union $type, - string $destination_fq_class_name, - string $source_file_path, - int $source_start, - int $source_end - ): void { - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - - $destination_class_storage = $codebase->classlike_storage_provider->get($destination_fq_class_name); - - if (!$destination_class_storage->aliases) { - throw new UnexpectedValueException('Aliases should not be null'); - } - - $file_manipulations = []; - - $file_manipulations[] = new FileManipulation( - $source_start, - $source_end, - $type->toNamespacedString( - $destination_class_storage->aliases->namespace, - $destination_class_storage->aliases->uses_flipped, - $destination_class_storage->name, - false - ) - ); - - FileManipulationBuffer::add( - $source_file_path, - $file_manipulations - ); - } - - /** - * @param ReflectionProperty::IS_PUBLIC|ReflectionProperty::IS_PROTECTED|ReflectionProperty::IS_PRIVATE - * $visibility - * - * @return array - */ - public function getConstantsForClass(string $class_name, int $visibility): array - { - $class_name = strtolower($class_name); - - $storage = $this->classlike_storage_provider->get($class_name); - - if ($visibility === ReflectionProperty::IS_PUBLIC) { - return array_filter( - $storage->constants, - function ($constant) { - return $constant->type - && $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC; - } - ); - } - - if ($visibility === ReflectionProperty::IS_PROTECTED) { - return array_filter( - $storage->constants, - function ($constant) { - return $constant->type - && ($constant->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC - || $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PROTECTED); - } - ); - } - - return array_filter( - $storage->constants, - function ($constant) { - return $constant->type !== null; - } - ); - } - - /** - * @param ReflectionProperty::IS_PUBLIC|ReflectionProperty::IS_PROTECTED|ReflectionProperty::IS_PRIVATE - * $visibility - */ - public function getClassConstantType( - string $class_name, - string $constant_name, - int $visibility, - ?StatementsAnalyzer $statements_analyzer = null, - array $visited_constant_ids = [] - ): ?Union { - $class_name = strtolower($class_name); - - if (!$this->classlike_storage_provider->has($class_name)) { - return null; - } - - $storage = $this->classlike_storage_provider->get($class_name); - - if (isset($storage->constants[$constant_name])) { - $constant_storage = $storage->constants[$constant_name]; - - if ($visibility === ReflectionProperty::IS_PUBLIC - && $constant_storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PUBLIC - ) { - return null; - } - - if ($visibility === ReflectionProperty::IS_PROTECTED - && $constant_storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PUBLIC - && $constant_storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PROTECTED - ) { - return null; - } - - if ($constant_storage->unresolved_node) { - $constant_storage->type = new Union([ConstantTypeResolver::resolve( - $this, - $constant_storage->unresolved_node, - $statements_analyzer, - $visited_constant_ids - )]); - } - - return $constant_storage->type; - } elseif (isset($storage->enum_cases[$constant_name])) { - return new Union([new TEnumCase($storage->name, $constant_name)]); - } - return null; - } - - private function checkMethodReferences(ClassLikeStorage $classlike_storage, Methods $methods): void - { - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - - foreach ($classlike_storage->appearing_method_ids as $method_name => $appearing_method_id) { - $appearing_fq_classlike_name = $appearing_method_id->fq_class_name; - - if ($appearing_fq_classlike_name !== $classlike_storage->name) { - continue; - } - - $method_id = $appearing_method_id; - - $declaring_classlike_storage = $classlike_storage; - - if (isset($classlike_storage->methods[$method_name])) { - $method_storage = $classlike_storage->methods[$method_name]; - } else { - $declaring_method_id = $classlike_storage->declaring_method_ids[$method_name]; - - $declaring_fq_classlike_name = $declaring_method_id->fq_class_name; - $declaring_method_name = $declaring_method_id->method_name; - - try { - $declaring_classlike_storage = $this->classlike_storage_provider->get($declaring_fq_classlike_name); - } catch (InvalidArgumentException $e) { - continue; - } - - $method_storage = $declaring_classlike_storage->methods[$declaring_method_name]; - $method_id = $declaring_method_id; - } - - if ($method_storage->location - && !$project_analyzer->canReportIssues($method_storage->location->file_path) - && !$codebase->analyzer->canReportIssues($method_storage->location->file_path) - ) { - continue; - } - - $method_referenced = $this->file_reference_provider->isClassMethodReferenced( - strtolower((string) $method_id) - ); - - if (!$method_referenced - && $method_storage->location - ) { - if ($method_name !== '__destruct' - && $method_name !== '__clone' - && $method_name !== '__invoke' - && $method_name !== '__unset' - && $method_name !== '__isset' - && $method_name !== '__sleep' - && $method_name !== '__wakeup' - && $method_name !== '__serialize' - && $method_name !== '__unserialize' - && $method_name !== '__set_state' - && $method_name !== '__debuginfo' - && $method_name !== '__tostring' // can be called in array_unique) - ) { - $method_location = $method_storage->location; - - $method_id = $classlike_storage->name . '::' . $method_storage->cased_name; - - if ($method_storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PRIVATE) { - $has_parent_references = false; - - if ($codebase->classImplements($classlike_storage->name, 'Serializable') - && ($method_name === 'serialize' || $method_name === 'unserialize') - ) { - continue; - } - - $has_variable_calls = $codebase->analyzer->hasMixedMemberName($method_name) - || $codebase->analyzer->hasMixedMemberName(strtolower($classlike_storage->name . '::')); - - if (isset($classlike_storage->overridden_method_ids[$method_name])) { - foreach ($classlike_storage->overridden_method_ids[$method_name] as $parent_method_id) { - $parent_method_storage = $methods->getStorage($parent_method_id); - - if ($parent_method_storage->location - && !$project_analyzer->canReportIssues($parent_method_storage->location->file_path) - ) { - // here we just don’t know - $has_parent_references = true; - break; - } - - $parent_method_referenced = $this->file_reference_provider->isClassMethodReferenced( - strtolower((string) $parent_method_id) - ); - - if (!$parent_method_storage->abstract || $parent_method_referenced) { - $has_parent_references = true; - break; - } - } - } - - foreach ($classlike_storage->parent_classes as $parent_method_fqcln) { - if ($codebase->analyzer->hasMixedMemberName( - strtolower($parent_method_fqcln) . '::' - )) { - $has_variable_calls = true; - break; - } - } - - foreach ($classlike_storage->class_implements as $fq_interface_name_lc => $_) { - try { - $interface_storage = $this->classlike_storage_provider->get($fq_interface_name_lc); - } catch (InvalidArgumentException $e) { - continue; - } - - if ($codebase->analyzer->hasMixedMemberName( - $fq_interface_name_lc . '::' - )) { - $has_variable_calls = true; - } - - if (isset($interface_storage->methods[$method_name])) { - $interface_method_referenced = $this->file_reference_provider->isClassMethodReferenced( - $fq_interface_name_lc . '::' . $method_name - ); - - if ($interface_method_referenced) { - $has_parent_references = true; - } - } - } - - if (!$has_parent_references) { - $issue = new PossiblyUnusedMethod( - 'Cannot find ' . ($has_variable_calls ? 'explicit' : 'any') - . ' calls to method ' . $method_id - . ($has_variable_calls ? ' (but did find some potential callers)' : ''), - $method_storage->location, - $method_id - ); - - if ($codebase->alter_code) { - if ($method_storage->stmt_location - && !$declaring_classlike_storage->is_trait - && isset($project_analyzer->getIssuesToFix()['PossiblyUnusedMethod']) - && !$has_variable_calls - && !IssueBuffer::isSuppressed($issue, $method_storage->suppressed_issues) - ) { - FileManipulationBuffer::addForCodeLocation( - $method_storage->stmt_location, - '', - true - ); - } - } elseif (IssueBuffer::accepts( - $issue, - $method_storage->suppressed_issues, - $method_storage->stmt_location - && !$declaring_classlike_storage->is_trait - && !$has_variable_calls - )) { - // fall through - } - } - } elseif (!isset($classlike_storage->declaring_method_ids['__call'])) { - $has_variable_calls = $codebase->analyzer->hasMixedMemberName( - strtolower($classlike_storage->name . '::') - ) || $codebase->analyzer->hasMixedMemberName($method_name); - - if ($method_name === '__construct') { - $issue = new UnusedConstructor( - 'Cannot find ' . ($has_variable_calls ? 'explicit' : 'any') - . ' calls to private constructor ' . $method_id - . ($has_variable_calls ? ' (but did find some potential callers)' : ''), - $method_location, - $method_id - ); - } else { - $issue = new UnusedMethod( - 'Cannot find ' . ($has_variable_calls ? 'explicit' : 'any') - . ' calls to private method ' . $method_id - . ($has_variable_calls ? ' (but did find some potential callers)' : ''), - $method_location, - $method_id - ); - } - - if ($codebase->alter_code) { - if ($method_storage->stmt_location - && !$declaring_classlike_storage->is_trait - && isset($project_analyzer->getIssuesToFix()['UnusedMethod']) - && !$has_variable_calls - && !IssueBuffer::isSuppressed($issue, $method_storage->suppressed_issues) - ) { - FileManipulationBuffer::addForCodeLocation( - $method_storage->stmt_location, - '', - true - ); - } - } elseif (IssueBuffer::accepts( - $issue, - $method_storage->suppressed_issues, - $method_storage->stmt_location - && !$declaring_classlike_storage->is_trait - && !$has_variable_calls - )) { - // fall through - } - } - } - } else { - if ($method_storage->return_type - && $method_storage->return_type_location - && !$method_storage->return_type->isVoid() - && !$method_storage->return_type->isNever() - && $method_id->method_name !== '__tostring' - && ($method_storage->is_static || !$method_storage->probably_fluent) - ) { - $method_return_referenced = $this->file_reference_provider->isMethodReturnReferenced( - strtolower((string) $method_id) - ); - - if (!$method_return_referenced) { - if ($method_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE) { - IssueBuffer::maybeAdd( - new UnusedReturnValue( - 'The return value for this private method is never used', - $method_storage->return_type_location - ), - $method_storage->suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new PossiblyUnusedReturnValue( - 'The return value for this method is never used', - $method_storage->return_type_location - ), - $method_storage->suppressed_issues - ); - } - } - } - - if ($method_storage->visibility !== ClassLikeAnalyzer::VISIBILITY_PRIVATE - && !$classlike_storage->is_interface - ) { - foreach ($method_storage->params as $offset => $param_storage) { - if (empty($classlike_storage->overridden_method_ids[$method_name]) - && $param_storage->location - && !$param_storage->promoted_property - && !$this->file_reference_provider->isMethodParamUsed( - strtolower((string) $method_id), - $offset - ) - ) { - if ($method_storage->final) { - IssueBuffer::maybeAdd( - new UnusedParam( - 'Param #' . ($offset + 1) . ' is never referenced in this method', - $param_storage->location - ), - $method_storage->suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new PossiblyUnusedParam( - 'Param #' . ($offset + 1) . ' is never referenced in this method', - $param_storage->location - ), - $method_storage->suppressed_issues - ); - } - } - } - } - } - } - } - - private function findPossibleMethodParamTypes(ClassLikeStorage $classlike_storage): void - { - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - - foreach ($classlike_storage->appearing_method_ids as $method_name => $appearing_method_id) { - $appearing_fq_classlike_name = $appearing_method_id->fq_class_name; - - if ($appearing_fq_classlike_name !== $classlike_storage->name) { - continue; - } - - $method_id = $appearing_method_id; - - $declaring_classlike_storage = $classlike_storage; - - if (isset($classlike_storage->methods[$method_name])) { - $method_storage = $classlike_storage->methods[$method_name]; - } else { - $declaring_method_id = $classlike_storage->declaring_method_ids[$method_name]; - - $declaring_fq_classlike_name = $declaring_method_id->fq_class_name; - $declaring_method_name = $declaring_method_id->method_name; - - try { - $declaring_classlike_storage = $this->classlike_storage_provider->get($declaring_fq_classlike_name); - } catch (InvalidArgumentException $e) { - continue; - } - - $method_storage = $declaring_classlike_storage->methods[$declaring_method_name]; - $method_id = $declaring_method_id; - } - - if ($method_storage->location - && !$project_analyzer->canReportIssues($method_storage->location->file_path) - && !$codebase->analyzer->canReportIssues($method_storage->location->file_path) - ) { - continue; - } - - if ($declaring_classlike_storage->is_trait) { - continue; - } - - $method_id_lc = strtolower((string) $method_id); - - if (isset($codebase->analyzer->possible_method_param_types[$method_id_lc])) { - if ($method_storage->location) { - $possible_param_types - = $codebase->analyzer->possible_method_param_types[$method_id_lc]; - - if ($possible_param_types) { - foreach ($possible_param_types as $offset => $possible_type) { - if (!isset($method_storage->params[$offset])) { - continue; - } - - $param_name = $method_storage->params[$offset]->name; - - if ($possible_type->hasMixed() || $possible_type->isNull()) { - continue; - } - - if ($method_storage->params[$offset]->default_type) { - if ($method_storage->params[$offset]->default_type instanceof Union) { - $default_type = clone $method_storage->params[$offset]->default_type; - } else { - $default_type_atomic = ConstantTypeResolver::resolve( - $codebase->classlikes, - $method_storage->params[$offset]->default_type, - null - ); - - $default_type = new Union([$default_type_atomic]); - } - - $possible_type = Type::combineUnionTypes( - $possible_type, - $default_type - ); - } - - if ($codebase->alter_code - && isset($project_analyzer->getIssuesToFix()['MissingParamType']) - ) { - $function_analyzer = $project_analyzer->getFunctionLikeAnalyzer( - $method_id, - $method_storage->location->file_path - ); - - $has_variable_calls = $codebase->analyzer->hasMixedMemberName( - $method_name - ) - || $codebase->analyzer->hasMixedMemberName( - strtolower($classlike_storage->name . '::') - ); - - if ($has_variable_calls) { - $possible_type->from_docblock = true; - } - - if ($function_analyzer) { - $function_analyzer->addOrUpdateParamType( - $project_analyzer, - $param_name, - $possible_type, - $possible_type->from_docblock - && $project_analyzer->only_replace_php_types_with_non_docblock_types - ); - } - } else { - IssueBuffer::addFixableIssue('MissingParamType'); - } - } - } - } - } - } - } - - private function checkPropertyReferences(ClassLikeStorage $classlike_storage): void - { - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - - foreach ($classlike_storage->properties as $property_name => $property_storage) { - $referenced_property_name = strtolower($classlike_storage->name) . '::$' . $property_name; - $property_referenced = $this->file_reference_provider->isClassPropertyReferenced( - $referenced_property_name - ); - - $property_constructor_referenced = false; - if ($property_referenced && $property_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE) { - $all_method_references = $this->file_reference_provider->getAllMethodReferencesToClassProperties(); - - if (isset($all_method_references[$referenced_property_name]) - && count($all_method_references[$referenced_property_name]) === 1) { - $constructor_name = strtolower($classlike_storage->name) . '::__construct'; - $property_references = $all_method_references[$referenced_property_name]; - - $property_constructor_referenced = isset($property_references[$constructor_name]) - && !$property_storage->is_static; - } - } - - if ((!$property_referenced || $property_constructor_referenced) - && $property_storage->location - ) { - $property_id = $classlike_storage->name . '::$' . $property_name; - - if ($property_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC - || $property_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PROTECTED - ) { - $has_parent_references = isset($classlike_storage->overridden_property_ids[$property_name]); - - $has_variable_calls = $codebase->analyzer->hasMixedMemberName('$' . $property_name) - || $codebase->analyzer->hasMixedMemberName(strtolower($classlike_storage->name) . '::$'); - - foreach ($classlike_storage->parent_classes as $parent_method_fqcln) { - if ($codebase->analyzer->hasMixedMemberName( - strtolower($parent_method_fqcln) . '::$' - )) { - $has_variable_calls = true; - break; - } - } - - foreach ($classlike_storage->class_implements as $fq_interface_name) { - if ($codebase->analyzer->hasMixedMemberName( - strtolower($fq_interface_name) . '::$' - )) { - $has_variable_calls = true; - break; - } - } - - if (!$has_parent_references - && ($property_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC - || !isset($classlike_storage->declaring_method_ids['__get'])) - ) { - $issue = new PossiblyUnusedProperty( - 'Cannot find ' . ($has_variable_calls ? 'explicit' : 'any') - . ' references to property ' . $property_id - . ($has_variable_calls ? ' (but did find some potential references)' : ''), - $property_storage->location - ); - - if ($codebase->alter_code) { - if ($property_storage->stmt_location - && isset($project_analyzer->getIssuesToFix()['PossiblyUnusedProperty']) - && !$has_variable_calls - && !IssueBuffer::isSuppressed($issue, $classlike_storage->suppressed_issues) - ) { - FileManipulationBuffer::addForCodeLocation( - $property_storage->stmt_location, - '', - true - ); - } - } elseif (IssueBuffer::accepts( - $issue, - $classlike_storage->suppressed_issues + $property_storage->suppressed_issues - )) { - // fall through - } - } - } elseif (!isset($classlike_storage->declaring_method_ids['__get'])) { - $has_variable_calls = $codebase->analyzer->hasMixedMemberName('$' . $property_name); - - $issue = new UnusedProperty( - 'Cannot find ' . ($has_variable_calls ? 'explicit' : 'any') - . ' references to private property ' . $property_id - . ($has_variable_calls ? ' (but did find some potential references)' : ''), - $property_storage->location - ); - - if ($codebase->alter_code) { - if (!$property_constructor_referenced - && $property_storage->stmt_location - && isset($project_analyzer->getIssuesToFix()['UnusedProperty']) - && !$has_variable_calls - && !IssueBuffer::isSuppressed($issue, $classlike_storage->suppressed_issues) - ) { - FileManipulationBuffer::addForCodeLocation( - $property_storage->stmt_location, - '', - true - ); - } - } elseif (IssueBuffer::accepts( - $issue, - $classlike_storage->suppressed_issues + $property_storage->suppressed_issues - )) { - // fall through - } - } - } - } - } - - /** - * @param lowercase-string $fq_classlike_name_lc - */ - public function registerMissingClassLike(string $fq_classlike_name_lc): void - { - $this->existing_classlikes_lc[$fq_classlike_name_lc] = false; - } - - /** - * @param lowercase-string $fq_classlike_name_lc - */ - public function isMissingClassLike(string $fq_classlike_name_lc): bool - { - return isset($this->existing_classlikes_lc[$fq_classlike_name_lc]) - && $this->existing_classlikes_lc[$fq_classlike_name_lc] === false; - } - - /** - * @param lowercase-string $fq_classlike_name_lc - */ - public function doesClassLikeExist(string $fq_classlike_name_lc): bool - { - return isset($this->existing_classlikes_lc[$fq_classlike_name_lc]) - && $this->existing_classlikes_lc[$fq_classlike_name_lc]; - } - - public function forgetMissingClassLikes(): void - { - $this->existing_classlikes_lc = array_filter($this->existing_classlikes_lc); - } - - public function removeClassLike(string $fq_class_name): void - { - $fq_class_name_lc = strtolower($fq_class_name); - - unset( - $this->existing_classlikes_lc[$fq_class_name_lc], - $this->existing_traits_lc[$fq_class_name_lc], - $this->existing_traits[$fq_class_name], - $this->existing_enums_lc[$fq_class_name_lc], - $this->existing_enums[$fq_class_name], - $this->existing_interfaces_lc[$fq_class_name_lc], - $this->existing_interfaces[$fq_class_name], - $this->existing_classes_lc[$fq_class_name_lc], - $this->existing_classes[$fq_class_name], - $this->trait_nodes[$fq_class_name_lc] - ); - - $this->scanner->removeClassLike($fq_class_name_lc); - } - - /** - * @return array{ - * array, - * array, - * array, - * array, - * array, - * array, - * array, - * array, - * array, - * } - */ - public function getThreadData(): array - { - return [ - $this->existing_classlikes_lc, - $this->existing_classes_lc, - $this->existing_traits_lc, - $this->existing_traits, - $this->existing_enums_lc, - $this->existing_enums, - $this->existing_interfaces_lc, - $this->existing_interfaces, - $this->existing_classes, - ]; - } - - /** - * @param array{ - * 0: array, - * 1: array, - * 2: array, - * 3: array, - * 4: array, - * 5: array, - * 6: array, - * 7: array, - * 8: array, - * } $thread_data - * - */ - public function addThreadData(array $thread_data): void - { - [ - $existing_classlikes_lc, - $existing_classes_lc, - $existing_traits_lc, - $existing_traits, - $existing_enums_lc, - $existing_enums, - $existing_interfaces_lc, - $existing_interfaces, - $existing_classes - ] = $thread_data; - - $this->existing_classlikes_lc = array_merge($existing_classlikes_lc, $this->existing_classlikes_lc); - $this->existing_classes_lc = array_merge($existing_classes_lc, $this->existing_classes_lc); - $this->existing_traits_lc = array_merge($existing_traits_lc, $this->existing_traits_lc); - $this->existing_traits = array_merge($existing_traits, $this->existing_traits); - $this->existing_enums_lc = array_merge($existing_enums_lc, $this->existing_enums_lc); - $this->existing_enums = array_merge($existing_enums, $this->existing_enums); - $this->existing_interfaces_lc = array_merge($existing_interfaces_lc, $this->existing_interfaces_lc); - $this->existing_interfaces = array_merge($existing_interfaces, $this->existing_interfaces); - $this->existing_classes = array_merge($existing_classes, $this->existing_classes); - } - - public function getStorageFor(string $fq_class_name): ?ClassLikeStorage - { - $fq_class_name = $this->getUnAliasedName($fq_class_name); - - try { - return $this->classlike_storage_provider->get($fq_class_name); - } catch (InvalidArgumentException $e) { - return null; - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php deleted file mode 100644 index c73e67a3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php +++ /dev/null @@ -1,363 +0,0 @@ -value); - } - - if ($c instanceof UnresolvedBinaryOp) { - $left = self::resolve( - $classlikes, - $c->left, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - ); - $right = self::resolve( - $classlikes, - $c->right, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - ); - - if ($left instanceof TMixed || $right instanceof TMixed) { - return new TMixed; - } - - if ($c instanceof UnresolvedConcatOp) { - if (($left instanceof TLiteralString - || $left instanceof TLiteralFloat - || $left instanceof TLiteralInt) - && ($right instanceof TLiteralString - || $right instanceof TLiteralFloat - || $right instanceof TLiteralInt) - ) { - return new TLiteralString($left->value . $right->value); - } - - return new TString(); - } - - if ($c instanceof UnresolvedAdditionOp - || $c instanceof UnresolvedSubtractionOp - || $c instanceof UnresolvedDivisionOp - || $c instanceof UnresolvedMultiplicationOp - || $c instanceof UnresolvedBitwiseOr - || $c instanceof UnresolvedBitwiseXor - || $c instanceof UnresolvedBitwiseAnd - ) { - if (($left instanceof TLiteralFloat || $left instanceof TLiteralInt) - && ($right instanceof TLiteralFloat || $right instanceof TLiteralInt) - ) { - if ($c instanceof UnresolvedAdditionOp) { - return self::getLiteralTypeFromScalarValue($left->value + $right->value); - } - - if ($c instanceof UnresolvedSubtractionOp) { - return self::getLiteralTypeFromScalarValue($left->value - $right->value); - } - - if ($c instanceof UnresolvedDivisionOp) { - return self::getLiteralTypeFromScalarValue($left->value / $right->value); - } - - if ($c instanceof UnresolvedBitwiseOr) { - return self::getLiteralTypeFromScalarValue($left->value | $right->value); - } - - if ($c instanceof UnresolvedBitwiseXor) { - return self::getLiteralTypeFromScalarValue($left->value ^ $right->value); - } - - if ($c instanceof UnresolvedBitwiseAnd) { - return self::getLiteralTypeFromScalarValue($left->value & $right->value); - } - - return self::getLiteralTypeFromScalarValue($left->value * $right->value); - } - - if ($left instanceof TKeyedArray && $right instanceof TKeyedArray) { - $keyed_array = new TKeyedArray($left->properties + $right->properties); - $keyed_array->sealed = true; - return $keyed_array; - } - - return new TMixed; - } - - return new TMixed; - } - - if ($c instanceof UnresolvedTernary) { - $cond = self::resolve( - $classlikes, - $c->cond, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - ); - $if = $c->if ? self::resolve( - $classlikes, - $c->if, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - ) : null; - $else = self::resolve( - $classlikes, - $c->else, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - ); - - if ($cond instanceof TLiteralFloat - || $cond instanceof TLiteralInt - || $cond instanceof TLiteralString - ) { - if ($cond->value) { - return $if ?? $cond; - } - } elseif ($cond instanceof TFalse || $cond instanceof TNull) { - return $else; - } elseif ($cond instanceof TTrue) { - return $if ?? $cond; - } - } - - if ($c instanceof ArrayValue) { - $properties = []; - $auto_key = 0; - - if (!$c->entries) { - return new TArray([Type::getEmpty(), Type::getEmpty()]); - } - - $is_list = true; - - foreach ($c->entries as $entry) { - if ($entry instanceof ArraySpread) { - $spread_array = self::resolve( - $classlikes, - $entry->array, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - ); - - if ($spread_array instanceof TArray && $spread_array->type_params[1]->isEmpty()) { - continue; - } - - if (!$spread_array instanceof TKeyedArray) { - return new TArray([Type::getArrayKey(), Type::getMixed()]); - } - - foreach ($spread_array->properties as $spread_array_type) { - $properties[$auto_key++] = $spread_array_type; - } - continue; - } - - if ($entry->key) { - $key_type = self::resolve( - $classlikes, - $entry->key, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - ); - - if (!$key_type instanceof TLiteralInt - || $key_type->value !== $auto_key - ) { - $is_list = false; - } - } else { - $key_type = new TLiteralInt($auto_key); - } - - if ($key_type instanceof TLiteralInt - || $key_type instanceof TLiteralString - ) { - $key_value = $key_type->value; - if ($key_type instanceof TLiteralInt) { - $auto_key = $key_type->value + 1; - } elseif (ctype_digit($key_type->value)) { - $auto_key = ((int) $key_type->value) + 1; - } - } else { - return new TArray([Type::getArrayKey(), Type::getMixed()]); - } - - $value_type = new Union([self::resolve( - $classlikes, - $entry->value, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - )]); - - $properties[$key_value] = $value_type; - } - - if (empty($properties)) { - $resolved_type = new TArray([ - new Union([new TEmpty()]), - new Union([new TEmpty()]), - ]); - } else { - $resolved_type = new TKeyedArray($properties); - - $resolved_type->is_list = $is_list; - $resolved_type->sealed = true; - } - - return $resolved_type; - } - - if ($c instanceof ClassConstant) { - if ($c->name === 'class') { - return new TLiteralClassString($c->fqcln); - } - - $found_type = $classlikes->getClassConstantType( - $c->fqcln, - $c->name, - ReflectionProperty::IS_PRIVATE, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - ); - - if ($found_type) { - return $found_type->getSingleAtomic(); - } - } - - if ($c instanceof ArrayOffsetFetch) { - $var_type = self::resolve( - $classlikes, - $c->array, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - ); - - $offset_type = self::resolve( - $classlikes, - $c->offset, - $statements_analyzer, - $visited_constant_ids + [$c_id => true] - ); - - if ($var_type instanceof TKeyedArray - && ($offset_type instanceof TLiteralInt - || $offset_type instanceof TLiteralString) - ) { - $union = $var_type->properties[$offset_type->value] ?? null; - - if ($union && $union->isSingle()) { - return $union->getSingleAtomic(); - } - } - } - - if ($c instanceof Constant) { - if ($statements_analyzer) { - $found_type = ConstFetchAnalyzer::getConstType( - $statements_analyzer, - $c->name, - $c->is_fully_qualified, - null - ); - - if ($found_type) { - return $found_type->getSingleAtomic(); - } - } - } - - return new TMixed; - } - - /** - * @param string|int|float|bool|null $value - */ - private static function getLiteralTypeFromScalarValue($value): Atomic - { - if (is_string($value)) { - return new TLiteralString($value); - } - - if (is_int($value)) { - return new TLiteralInt($value); - } - - if (is_float($value)) { - return new TLiteralFloat($value); - } - - if ($value === false) { - return new TFalse; - } - - if ($value === true) { - return new TTrue; - } - - return new TNull; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php deleted file mode 100644 index 988a8140..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php +++ /dev/null @@ -1,159 +0,0 @@ -> */ - protected $forward_edges = []; - - abstract public function addNode(DataFlowNode $node): void; - - /** - * @param array $added_taints - * @param array $removed_taints - */ - public function addPath( - DataFlowNode $from, - DataFlowNode $to, - string $path_type, - ?array $added_taints = null, - ?array $removed_taints = null - ): void { - $from_id = $from->id; - $to_id = $to->id; - - if ($from_id === $to_id) { - return; - } - - $length = 0; - - if ($from->code_location - && $to->code_location - && $from->code_location->file_path === $to->code_location->file_path - ) { - $to_line = $to->code_location->raw_line_number; - $from_line = $from->code_location->raw_line_number; - $length = abs($to_line - $from_line); - } - - $this->forward_edges[$from_id][$to_id] = new Path($path_type, $length, $added_taints, $removed_taints); - } - - /** - * @param array $previous_path_types - * - * @psalm-pure - */ - protected static function shouldIgnoreFetch( - string $path_type, - string $expression_type, - array $previous_path_types - ): bool { - $el = strlen($expression_type); - - // arraykey-fetch requires a matching arraykey-assignment at the same level - // otherwise the tainting is not valid - if (strpos($path_type, $expression_type . '-fetch-') === 0 || $path_type === 'arraykey-fetch') { - $fetch_nesting = 0; - - $previous_path_types = array_reverse($previous_path_types); - - foreach ($previous_path_types as $previous_path_type) { - if ($previous_path_type === $expression_type . '-assignment') { - if ($fetch_nesting === 0) { - return false; - } - - $fetch_nesting--; - } - - if (strpos($previous_path_type, $expression_type . '-fetch') === 0) { - $fetch_nesting++; - } - - if (strpos($previous_path_type, $expression_type . '-assignment-') === 0) { - if ($fetch_nesting > 0) { - $fetch_nesting--; - continue; - } - - if (substr($previous_path_type, $el + 12) === substr($path_type, $el + 7)) { - return false; - } - - return true; - } - } - } - - return false; - } - - /** - * @return array{int, int, int, float} - */ - public function getEdgeStats(): array - { - $lengths = 0; - - $destination_counts = []; - $origin_counts = []; - - foreach ($this->forward_edges as $from_id => $destinations) { - foreach ($destinations as $to_id => $path) { - if ($path->length === 0) { - continue; - } - - $lengths += $path->length; - - if (!isset($destination_counts[$to_id])) { - $destination_counts[$to_id] = 0; - } - - $destination_counts[$to_id]++; - - $origin_counts[$from_id] = true; - } - } - - $count = array_sum($destination_counts); - - if (!$count) { - return [0, 0, 0, 0.0]; - } - - $mean = $lengths / $count; - - return [$count, count($origin_counts), count($destination_counts), $mean]; - } - - /** - * @psalm-return list> - */ - public function summarizeEdges(): array - { - $edges = []; - - foreach ($this->forward_edges as $source => $destinations) { - $edges[] = array_merge([$source], array_keys($destinations)); - } - - return $edges; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php deleted file mode 100644 index ca882a0c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php +++ /dev/null @@ -1,603 +0,0 @@ - - */ - private static $stubbed_functions; - - /** @var FunctionReturnTypeProvider */ - public $return_type_provider; - - /** @var FunctionExistenceProvider */ - public $existence_provider; - - /** @var FunctionParamsProvider */ - public $params_provider; - - /** - * @var Reflection - */ - private $reflection; - - public function __construct(FileStorageProvider $storage_provider, Reflection $reflection) - { - $this->file_storage_provider = $storage_provider; - $this->reflection = $reflection; - $this->return_type_provider = new FunctionReturnTypeProvider(); - $this->existence_provider = new FunctionExistenceProvider(); - $this->params_provider = new FunctionParamsProvider(); - - self::$stubbed_functions = []; - } - - /** - * @param non-empty-lowercase-string $function_id - */ - public function getStorage( - ?StatementsAnalyzer $statements_analyzer, - string $function_id, - ?string $root_file_path = null, - ?string $checked_file_path = null - ): FunctionStorage { - if ($function_id[0] === '\\') { - $function_id = substr($function_id, 1); - } - - if (isset(self::$stubbed_functions[$function_id])) { - return self::$stubbed_functions[$function_id]; - } - - $file_storage = null; - - if ($statements_analyzer) { - $root_file_path = $statements_analyzer->getRootFilePath(); - $checked_file_path = $statements_analyzer->getFilePath(); - - $file_storage = $this->file_storage_provider->get($root_file_path); - - $function_analyzers = $statements_analyzer->getFunctionAnalyzers(); - - if (isset($function_analyzers[$function_id])) { - $function_id = $function_analyzers[$function_id]->getFunctionId(); - - if (isset($file_storage->functions[$function_id])) { - return $file_storage->functions[$function_id]; - } - } - - // closures can be returned here - if (isset($file_storage->functions[$function_id])) { - return $file_storage->functions[$function_id]; - } - } - - if (!$root_file_path || !$checked_file_path) { - if ($this->reflection->hasFunction($function_id)) { - return $this->reflection->getFunctionStorage($function_id); - } - - throw new UnexpectedValueException( - 'Expecting non-empty $root_file_path and $checked_file_path' - ); - } - - if ($this->reflection->hasFunction($function_id)) { - return $this->reflection->getFunctionStorage($function_id); - } - - if (!isset($file_storage->declaring_function_ids[$function_id])) { - if ($checked_file_path !== $root_file_path) { - $file_storage = $this->file_storage_provider->get($checked_file_path); - - if (isset($file_storage->functions[$function_id])) { - return $file_storage->functions[$function_id]; - } - } - - throw new UnexpectedValueException( - 'Expecting ' . $function_id . ' to have storage in ' . $checked_file_path - ); - } - - $declaring_file_path = $file_storage->declaring_function_ids[$function_id]; - - $declaring_file_storage = $this->file_storage_provider->get($declaring_file_path); - - if (!isset($declaring_file_storage->functions[$function_id])) { - throw new UnexpectedValueException( - 'Not expecting ' . $function_id . ' to not have storage in ' . $declaring_file_path - ); - } - - return $declaring_file_storage->functions[$function_id]; - } - - public function addGlobalFunction(string $function_id, FunctionStorage $storage): void - { - self::$stubbed_functions[strtolower($function_id)] = $storage; - } - - public function hasStubbedFunction(string $function_id): bool - { - return isset(self::$stubbed_functions[strtolower($function_id)]); - } - - /** - * @return array - */ - public function getAllStubbedFunctions(): array - { - return self::$stubbed_functions; - } - - /** - * @param lowercase-string $function_id - */ - public function functionExists( - StatementsAnalyzer $statements_analyzer, - string $function_id - ): bool { - if ($this->existence_provider->has($function_id)) { - $function_exists = $this->existence_provider->doesFunctionExist($statements_analyzer, $function_id); - - if ($function_exists !== null) { - return $function_exists; - } - } - - $file_storage = $this->file_storage_provider->get($statements_analyzer->getRootFilePath()); - - if (isset($file_storage->declaring_function_ids[$function_id])) { - return true; - } - - if ($this->reflection->hasFunction($function_id)) { - return true; - } - - if (isset(self::$stubbed_functions[$function_id])) { - return true; - } - - if (isset($statements_analyzer->getFunctionAnalyzers()[$function_id])) { - return true; - } - - $predefined_functions = $statements_analyzer->getCodebase()->config->getPredefinedFunctions(); - - if (isset($predefined_functions[$function_id])) { - /** @psalm-suppress ArgumentTypeCoercion */ - if ($this->reflection->registerFunction($function_id) === false) { - return false; - } - - return true; - } - - return false; - } - - /** - * @param non-empty-string $function_name - * - * @return non-empty-string - */ - public function getFullyQualifiedFunctionNameFromString(string $function_name, StatementsSource $source): string - { - if ($function_name[0] === '\\') { - $function_name = substr($function_name, 1); - - if ($function_name === '') { - throw new UnexpectedValueException('Malformed function name'); - } - - return $function_name; - } - - $function_name_lcase = strtolower($function_name); - - $aliases = $source->getAliases(); - - $imported_function_namespaces = $aliases->functions; - $imported_namespaces = $aliases->uses; - - if (strpos($function_name, '\\') !== false) { - $function_name_parts = explode('\\', $function_name); - $first_namespace = array_shift($function_name_parts); - $first_namespace_lcase = strtolower($first_namespace); - - if (isset($imported_namespaces[$first_namespace_lcase])) { - return $imported_namespaces[$first_namespace_lcase] . '\\' . implode('\\', $function_name_parts); - } - - if (isset($imported_function_namespaces[$first_namespace_lcase])) { - return $imported_function_namespaces[$first_namespace_lcase] . '\\' . - implode('\\', $function_name_parts); - } - } elseif (isset($imported_function_namespaces[$function_name_lcase])) { - return $imported_function_namespaces[$function_name_lcase]; - } - - $namespace = $source->getNamespace(); - - return ($namespace ? $namespace . '\\' : '') . $function_name; - } - - /** - * @return array - */ - public function getMatchingFunctionNames( - string $stub, - int $offset, - string $file_path, - Codebase $codebase - ): array { - if ($stub[0] === '*') { - $stub = substr($stub, 1); - } - - $fully_qualified = false; - - if ($stub[0] === '\\') { - $fully_qualified = true; - $stub = substr($stub, 1); - $stub_namespace = ''; - } else { - // functions can reference either the current namespace or root-namespaced - // equivalents. We therefore want to make both candidates. - [$stub_namespace, $stub] = explode('-', $stub); - } - - /** @var array */ - $matching_functions = []; - - $file_storage = $this->file_storage_provider->get($file_path); - - $current_namespace_aliases = null; - foreach ($file_storage->namespace_aliases as $namespace_start => $namespace_aliases) { - if ($namespace_start < $offset) { - $current_namespace_aliases = $namespace_aliases; - break; - } - } - - // We will search all functions for several patterns. This will - // be for all used namespaces, the global namespace and matched - // used functions. - $match_function_patterns = [ - $stub . '*', - ]; - - if ($stub_namespace) { - $match_function_patterns[] = $stub_namespace . '\\' . $stub . '*'; - } - - if ($current_namespace_aliases) { - foreach ($current_namespace_aliases->functions as $alias_name => $function_name) { - if (strpos($alias_name, $stub) === 0) { - try { - $match_function_patterns[] = $function_name; - } catch (Exception $e) { - } - } - } - - if (!$fully_qualified) { - foreach ($current_namespace_aliases->uses as $namespace_name) { - $match_function_patterns[] = $namespace_name . '\\' . $stub . '*'; - } - } - } - - $function_map = $file_storage->functions - + $this->getAllStubbedFunctions() - + $this->reflection->getFunctions() - + $codebase->config->getPredefinedFunctions(); - - foreach ($function_map as $function_name => $function) { - foreach ($match_function_patterns as $pattern) { - $pattern_lc = strtolower($pattern); - - if (substr($pattern, -1, 1) === '*') { - if (strpos($function_name, rtrim($pattern_lc, '*')) !== 0) { - continue; - } - } elseif ($function_name !== $pattern) { - continue; - } - if (is_bool($function)) { - /** @var callable-string $function_name */ - if ($this->reflection->registerFunction($function_name) === false) { - continue; - } - $function = $this->reflection->getFunctionStorage($function_name); - } - - if ($function->cased_name) { - $cased_name_parts = explode('\\', $function->cased_name); - $pattern_parts = explode('\\', $pattern); - - if (end($cased_name_parts)[0] !== end($pattern_parts)[0]) { - continue; - } - } - - /** @var lowercase-string $function_name */ - $matching_functions[$function_name] = $function; - } - } - - return $matching_functions; - } - - public static function isVariadic(Codebase $codebase, string $function_id, string $file_path): bool - { - $file_storage = $codebase->file_storage_provider->get($file_path); - - if (!isset($file_storage->declaring_function_ids[$function_id])) { - return false; - } - - $declaring_file_path = $file_storage->declaring_function_ids[$function_id]; - - $file_storage = $declaring_file_path === $file_path - ? $file_storage - : $codebase->file_storage_provider->get($declaring_file_path); - - return isset($file_storage->functions[$function_id]) && $file_storage->functions[$function_id]->variadic; - } - - /** - * @param ?list $args - */ - public function isCallMapFunctionPure( - Codebase $codebase, - ?NodeTypeProvider $type_provider, - string $function_id, - ?array $args, - bool &$must_use = true - ): bool { - $impure_functions = [ - // file io - 'chdir', 'chgrp', 'chmod', 'chown', 'chroot', 'copy', 'file_get_contents', 'file_put_contents', - 'opendir', 'readdir', 'closedir', 'rewinddir', 'scandir', - 'fopen', 'fread', 'fwrite', 'fclose', 'touch', 'fpassthru', 'fputs', 'fscanf', 'fseek', 'flock', - 'ftruncate', 'fprintf', 'symlink', 'mkdir', 'unlink', 'rename', 'rmdir', 'popen', 'pclose', - 'fgetcsv', 'fputcsv', 'umask', 'finfo_open', 'finfo_close', 'finfo_file', - 'stream_set_timeout', 'fgets', 'fflush', 'move_uploaded_file', 'file_exists', 'realpath', 'glob', - 'is_readable', 'is_dir', 'is_file', - - // stream/socket io - 'stream_context_set_option', 'socket_write', 'stream_set_blocking', 'socket_close', - 'socket_set_option', 'stream_set_write_buffer', 'stream_socket_enable_crypto', 'stream_copy_to_stream', - 'stream_wrapper_register', - - // meta calls - 'call_user_func', 'call_user_func_array', 'define', 'create_function', - - // http - 'header', 'header_remove', 'http_response_code', 'setcookie', - - // output buffer - 'ob_start', 'ob_end_clean', 'ob_get_clean', 'readfile', 'printf', 'var_dump', 'phpinfo', - 'ob_implicit_flush', 'vprintf', - - // mcrypt - 'mcrypt_generic_init', 'mcrypt_generic_deinit', 'mcrypt_module_close', - - // internal optimisation - 'opcache_compile_file', 'clearstatcache', - - // process-related - 'pcntl_signal', 'pcntl_alarm', 'posix_kill', 'cli_set_process_title', 'pcntl_async_signals', 'proc_close', - 'proc_nice', 'proc_open', 'proc_terminate', - - // curl - 'curl_setopt', 'curl_close', 'curl_multi_add_handle', 'curl_multi_remove_handle', - 'curl_multi_select', 'curl_multi_close', 'curl_setopt_array', - - // apc, apcu - 'apc_store', 'apc_delete', 'apc_clear_cache', 'apc_add', 'apc_inc', 'apc_dec', 'apc_cas', - 'apcu_store', 'apcu_delete', 'apcu_clear_cache', 'apcu_add', 'apcu_inc', 'apcu_dec', 'apcu_cas', - - // gz - 'gzwrite', 'gzrewind', 'gzseek', 'gzclose', - - // newrelic - 'newrelic_start_transaction', 'newrelic_name_transaction', 'newrelic_add_custom_parameter', - 'newrelic_add_custom_tracer', 'newrelic_background_job', 'newrelic_end_transaction', - 'newrelic_set_appname', - - // execution - 'shell_exec', 'exec', 'system', 'passthru', 'pcntl_exec', - - // well-known functions - 'libxml_use_internal_errors', 'libxml_disable_entity_loader', 'curl_exec', - 'mt_srand', 'openssl_pkcs7_sign', 'openssl_sign', - 'mt_rand', 'rand', 'random_int', 'random_bytes', - 'wincache_ucache_delete', 'wincache_ucache_set', 'wincache_ucache_inc', - 'class_alias', - 'class_exists', // impure by virtue of triggering autoloader - - // php environment - 'ini_set', 'sleep', 'usleep', 'register_shutdown_function', - 'error_reporting', 'register_tick_function', 'unregister_tick_function', - 'set_error_handler', 'user_error', 'trigger_error', 'restore_error_handler', - 'date_default_timezone_set', 'assert_options', 'setlocale', - 'set_exception_handler', 'set_time_limit', 'putenv', 'spl_autoload_register', - 'spl_autoload_unregister', 'microtime', 'array_rand', 'set_include_path', - - // logging - 'openlog', 'syslog', 'error_log', 'define_syslog_variables', - - // session - 'session_id', 'session_decode', 'session_name', 'session_set_cookie_params', - 'session_set_save_handler', 'session_regenerate_id', 'mb_internal_encoding', - 'session_start', 'session_cache_limiter', - - // ldap - 'ldap_set_option', - - // iterators - 'rewind', 'iterator_apply', 'iterator_to_array', - - // mysqli - 'mysqli_select_db', 'mysqli_dump_debug_info', 'mysqli_kill', 'mysqli_multi_query', - 'mysqli_next_result', 'mysqli_options', 'mysqli_ping', 'mysqli_query', 'mysqli_report', - 'mysqli_rollback', 'mysqli_savepoint', 'mysqli_set_charset', 'mysqli_ssl_set', 'mysqli_close', - - // script execution - 'ignore_user_abort', - - // ftp - 'ftp_close', 'ftp_pasv', - - // bcmath - 'bcscale', - - // json - 'json_last_error', - - // opcache - 'opcache_compile_file', 'opcache_get_configuration', 'opcache_get_status', - 'opcache_invalidate', 'opcache_is_script_cached', 'opcache_reset', - - //gettext - 'bindtextdomain', - ]; - - if (in_array(strtolower($function_id), $impure_functions, true)) { - return false; - } - - if (strpos($function_id, 'image') === 0) { - return false; - } - - if (strpos($function_id, 'readline') === 0) { - return false; - } - - if (($function_id === 'var_export' || $function_id === 'print_r') && !isset($args[1])) { - return false; - } - - if ($function_id === 'assert') { - $must_use = false; - return true; - } - - if ($function_id === 'func_num_args' || $function_id === 'func_get_args') { - return true; - } - - if ($function_id === 'count' && isset($args[0]) && $type_provider) { - $count_type = $type_provider->getType($args[0]->value); - - if ($count_type) { - foreach ($count_type->getAtomicTypes() as $atomic_count_type) { - if ($atomic_count_type instanceof TNamedObject) { - $count_method_id = new MethodIdentifier( - $atomic_count_type->value, - 'count' - ); - - try { - return $codebase->methods->getStorage($count_method_id)->mutation_free; - } catch (Exception $e) { - // do nothing - } - } - } - } - } - - $function_callable = InternalCallMapHandler::getCallableFromCallMapById( - $codebase, - $function_id, - $args ?: [], - null - ); - - if (!$function_callable->params - || ($args !== null && count($args) === 0) - || ($function_callable->return_type && $function_callable->return_type->isVoid()) - ) { - return false; - } - - $must_use = $function_id !== 'array_map' - || (isset($args[0]) && !$args[0]->value instanceof ClosureNode); - - foreach ($function_callable->params as $i => $param) { - if ($type_provider && $param->type && $param->type->hasCallableType() && isset($args[$i])) { - $arg_type = $type_provider->getType($args[$i]->value); - - if ($arg_type) { - foreach ($arg_type->getAtomicTypes() as $possible_callable) { - $possible_callable = CallableTypeComparator::getCallableFromAtomic( - $codebase, - $possible_callable - ); - - if ($possible_callable && !$possible_callable->is_pure) { - return false; - } - } - } - } - - if ($param->by_ref && isset($args[$i])) { - $must_use = false; - } - } - - return true; - } - - public static function clearCache(): void - { - self::$stubbed_functions = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php deleted file mode 100644 index 8af4d0cb..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php +++ /dev/null @@ -1,437 +0,0 @@ ->|null - */ - private static $call_map; - - /** - * @var array>|null - */ - private static $call_map_callables = []; - - /** - * @var array>> - */ - private static $taint_sink_map = []; - - /** - * @param list $args - */ - public static function getCallableFromCallMapById( - Codebase $codebase, - string $method_id, - array $args, - ?NodeDataProvider $nodes - ): TCallable { - $possible_callables = self::getCallablesFromCallMap($method_id); - - if ($possible_callables === null) { - throw new UnexpectedValueException( - 'Not expecting $function_param_options to be null for ' . $method_id - ); - } - - return self::getMatchingCallableFromCallMapOptions( - $codebase, - $possible_callables, - $args, - $nodes, - $method_id - ); - } - - /** - * @param array $callables - * @param list $args - * - */ - public static function getMatchingCallableFromCallMapOptions( - Codebase $codebase, - array $callables, - array $args, - ?NodeTypeProvider $nodes, - string $method_id - ): TCallable { - if (count($callables) === 1) { - return $callables[0]; - } - - $matching_param_count_callable = null; - $matching_coerced_param_count_callable = null; - - foreach ($callables as $possible_callable) { - $possible_function_params = $possible_callable->params; - - assert($possible_function_params !== null); - - $all_args_match = true; - $type_coerced = false; - - $last_param = count($possible_function_params) - ? $possible_function_params[count($possible_function_params) - 1] - : null; - - $mandatory_param_count = count($possible_function_params); - - foreach ($possible_function_params as $i => $possible_function_param) { - if ($possible_function_param->is_optional) { - $mandatory_param_count = $i; - break; - } - } - - if ($mandatory_param_count > count($args) && !($last_param && $last_param->is_variadic)) { - continue; - } - - foreach ($args as $argument_offset => $arg) { - if ($argument_offset >= count($possible_function_params)) { - if (!$last_param || !$last_param->is_variadic) { - $all_args_match = false; - break; - } - - $function_param = $last_param; - } else { - $function_param = $possible_function_params[$argument_offset]; - } - - $param_type = $function_param->type; - - if (!$param_type) { - continue; - } - - if (!$nodes - || !($arg_type = $nodes->getType($arg->value)) - ) { - continue; - } - - if ($arg_type->hasMixed()) { - continue; - } - - if ($arg->unpack && !$function_param->is_variadic) { - if ($arg_type->hasArray()) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TKeyedArray|TList - */ - $array_atomic_type = $arg_type->getAtomicTypes()['array']; - - if ($array_atomic_type instanceof TKeyedArray) { - $arg_type = $array_atomic_type->getGenericValueType(); - } elseif ($array_atomic_type instanceof TList) { - $arg_type = $array_atomic_type->type_param; - } else { - $arg_type = $array_atomic_type->type_params[1]; - } - } - } - - $arg_result = new TypeComparisonResult(); - - if (UnionTypeComparator::isContainedBy( - $codebase, - $arg_type, - $param_type, - true, - true, - $arg_result - ) || $arg_result->type_coerced) { - if ($arg_result->type_coerced) { - $type_coerced = true; - } - - continue; - } - - $all_args_match = false; - break; - } - - if (count($args) === count($possible_function_params)) { - $matching_param_count_callable = $possible_callable; - } - - if ($all_args_match && (!$type_coerced || $method_id === 'max' || $method_id === 'min')) { - return $possible_callable; - } - - if ($all_args_match) { - $matching_coerced_param_count_callable = $possible_callable; - } - } - - if ($matching_coerced_param_count_callable) { - return $matching_coerced_param_count_callable; - } - - if ($matching_param_count_callable) { - return $matching_param_count_callable; - } - - // if we don't succeed in finding a match, set to the first possible and wait for issues below - return $callables[0]; - } - - /** - * @return list|null - */ - public static function getCallablesFromCallMap(string $function_id): ?array - { - $call_map_key = strtolower($function_id); - - if (isset(self::$call_map_callables[$call_map_key])) { - return self::$call_map_callables[$call_map_key]; - } - - $call_map = self::getCallMap(); - - if (!isset($call_map[$call_map_key])) { - return null; - } - - $call_map_functions = []; - $call_map_functions[] = $call_map[$call_map_key]; - - for ($i = 1; $i < 10; ++$i) { - if (!isset($call_map[$call_map_key . '\'' . $i])) { - break; - } - - $call_map_functions[] = $call_map[$call_map_key . '\'' . $i]; - } - - $possible_callables = []; - - foreach ($call_map_functions as $call_map_function_args) { - $return_type_string = array_shift($call_map_function_args); - - if (!$return_type_string) { - $return_type = Type::getMixed(); - } else { - $return_type = Type::parseString($return_type_string); - } - - $function_params = []; - - $arg_offset = 0; - - /** @var string $arg_name - key type changed with above array_shift */ - foreach ($call_map_function_args as $arg_name => $arg_type) { - $by_reference = false; - $optional = false; - $variadic = false; - - if ($arg_name[0] === '&') { - $arg_name = substr($arg_name, 1); - $by_reference = true; - } - - if (substr($arg_name, -1) === '=') { - $arg_name = substr($arg_name, 0, -1); - $optional = true; - } - - if (strpos($arg_name, '...') === 0) { - $arg_name = substr($arg_name, 3); - $variadic = true; - } - - $param_type = $arg_type - ? Type::parseString($arg_type) - : Type::getMixed(); - - $out_type = null; - - if (strlen($arg_name) > 2 && $arg_name[0] === 'w' && $arg_name[1] === '_') { - $out_type = $param_type; - $param_type = Type::getMixed(); - } - - $function_param = new FunctionLikeParameter( - $arg_name, - $by_reference, - $param_type, - null, - null, - $optional, - false, - $variadic - ); - - if ($out_type) { - $function_param->out_type = $out_type; - } - - if ($arg_name === 'haystack') { - $function_param->expect_variable = true; - } - - if (isset(self::$taint_sink_map[$call_map_key][$arg_offset])) { - $function_param->sinks = self::$taint_sink_map[$call_map_key][$arg_offset]; - } - - $function_param->signature_type = null; - - $function_params[] = $function_param; - - $arg_offset++; - } - - $possible_callables[] = new TCallable('callable', $function_params, $return_type); - } - - self::$call_map_callables[$call_map_key] = $possible_callables; - - return $possible_callables; - } - - /** - * Gets the method/function call map - * - * @return array> - */ - public static function getCallMap(): array - { - $codebase = ProjectAnalyzer::getInstance()->getCodebase(); - $analyzer_major_version = $codebase->php_major_version; - $analyzer_minor_version = $codebase->php_minor_version; - - $analyzer_version = $analyzer_major_version . '.' . $analyzer_minor_version; - $current_version = self::PHP_MAJOR_VERSION . '.' . self::PHP_MINOR_VERSION; - - $analyzer_version_int = (int) ($analyzer_major_version . $analyzer_minor_version); - $current_version_int = (int) (self::PHP_MAJOR_VERSION . self::PHP_MINOR_VERSION); - - if (self::$call_map !== null - && $analyzer_major_version === self::$loaded_php_major_version - && $analyzer_minor_version === self::$loaded_php_minor_version - ) { - return self::$call_map; - } - - /** @var array> */ - $call_map = require(dirname(__DIR__, 4) . '/dictionaries/CallMap.php'); - - self::$call_map = []; - - foreach ($call_map as $key => $value) { - $cased_key = strtolower($key); - self::$call_map[$cased_key] = $value; - } - - /** - * @var array>> - */ - $taint_map = require(dirname(__DIR__, 4) . '/dictionaries/InternalTaintSinkMap.php'); - - foreach ($taint_map as $key => $value) { - $cased_key = strtolower($key); - self::$taint_sink_map[$cased_key] = $value; - } - - 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) { - $delta_file = dirname(__DIR__, 4) . '/dictionaries/CallMap_' . $i . '_delta.php'; - if (!file_exists($delta_file)) { - continue; - } - /** - * @var array{ - * added: array>, - * changed: array, - * new: array - * }>, - * removed: array> - * } - */ - $diff_call_map = require($delta_file); - - foreach ($diff_call_map['added'] as $key => $_) { - $cased_key = strtolower($key); - unset(self::$call_map[$cased_key]); - } - - foreach ($diff_call_map['removed'] as $key => $value) { - $cased_key = strtolower($key); - self::$call_map[$cased_key] = $value; - } - - foreach ($diff_call_map['changed'] as $key => ['old' => $value]) { - $cased_key = strtolower($key); - self::$call_map[$cased_key] = $value; - } - } - } - - self::$loaded_php_major_version = $analyzer_major_version; - self::$loaded_php_minor_version = $analyzer_minor_version; - - return self::$call_map; - } - - public static function inCallMap(string $key): bool - { - return isset(self::getCallMap()[strtolower($key)]); - } - - public static function clearCache(): void - { - self::$call_map_callables = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php deleted file mode 100644 index 6324b775..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php +++ /dev/null @@ -1,1255 +0,0 @@ -classlike_storage_provider = $storage_provider; - $this->file_reference_provider = $file_reference_provider; - $this->classlikes = $classlikes; - $this->return_type_provider = new MethodReturnTypeProvider(); - $this->existence_provider = new MethodExistenceProvider(); - $this->visibility_provider = new MethodVisibilityProvider(); - $this->params_provider = new MethodParamsProvider(); - } - - /** - * Whether or not a given method exists - * - * If you pass true in $is_used argument the method return is considered used - * - * @param lowercase-string|null $calling_method_id - */ - public function methodExists( - MethodIdentifier $method_id, - ?string $calling_method_id = null, - ?CodeLocation $code_location = null, - ?StatementsSource $source = null, - ?string $source_file_path = null, - bool $use_method_existence_provider = true, - bool $is_used = false - ): bool { - $fq_class_name = $method_id->fq_class_name; - $method_name = $method_id->method_name; - - if ($use_method_existence_provider && $this->existence_provider->has($fq_class_name)) { - $method_exists = $this->existence_provider->doesMethodExist( - $fq_class_name, - $method_name, - $source, - $code_location - ); - - if ($method_exists !== null) { - return $method_exists; - } - } - - $old_method_id = null; - - $fq_class_name = strtolower($this->classlikes->getUnAliasedName($fq_class_name)); - - try { - $class_storage = $this->classlike_storage_provider->get($fq_class_name); - } catch (InvalidArgumentException $e) { - return false; - } - - if ($class_storage->is_enum) { - if ($method_name === 'cases') { - return true; - } - - if ($class_storage->enum_type - && in_array($method_name, ['from', 'tryFrom'], true) - ) { - return true; - } - } - - $source_file_path = $source ? $source->getFilePath() : $source_file_path; - - $calling_class_name = $source ? $source->getFQCLN() : null; - - if (!$calling_class_name && $calling_method_id) { - $calling_class_name = explode('::', $calling_method_id)[0]; - } - - if (isset($class_storage->declaring_method_ids[$method_name])) { - $declaring_method_id = $class_storage->declaring_method_ids[$method_name]; - - if ($calling_method_id === strtolower((string) $declaring_method_id)) { - return true; - } - - $declaring_fq_class_name = strtolower($declaring_method_id->fq_class_name); - - if ($declaring_fq_class_name !== strtolower((string) $calling_class_name)) { - if ($calling_method_id) { - $this->file_reference_provider->addMethodReferenceToClass( - $calling_method_id, - $declaring_fq_class_name - ); - } elseif ($source_file_path) { - $this->file_reference_provider->addNonMethodReferenceToClass( - $source_file_path, - $declaring_fq_class_name - ); - } - } - - if ((string) $method_id !== (string) $declaring_method_id - && $class_storage->user_defined - && isset($class_storage->potential_declaring_method_ids[$method_name]) - ) { - foreach ($class_storage->potential_declaring_method_ids[$method_name] as $potential_id => $_) { - if ($calling_method_id) { - $this->file_reference_provider->addMethodReferenceToClassMember( - $calling_method_id, - $potential_id, - $is_used - ); - } elseif ($source_file_path) { - $this->file_reference_provider->addFileReferenceToClassMember( - $source_file_path, - $potential_id, - $is_used - ); - } - } - } else { - if ($calling_method_id) { - $this->file_reference_provider->addMethodReferenceToClassMember( - $calling_method_id, - strtolower((string) $declaring_method_id), - $is_used - ); - } elseif ($source_file_path) { - $this->file_reference_provider->addFileReferenceToClassMember( - $source_file_path, - strtolower((string) $declaring_method_id), - $is_used - ); - } - } - - if ($this->collect_locations && $code_location) { - $this->file_reference_provider->addCallingLocationForClassMethod( - $code_location, - strtolower((string) $declaring_method_id) - ); - } - - foreach ($class_storage->class_implements as $fq_interface_name) { - $interface_method_id_lc = strtolower($fq_interface_name . '::' . $method_name); - - if ($this->collect_locations && $code_location) { - $this->file_reference_provider->addCallingLocationForClassMethod( - $code_location, - $interface_method_id_lc - ); - } - - if ($calling_method_id) { - $this->file_reference_provider->addMethodReferenceToClassMember( - $calling_method_id, - $interface_method_id_lc, - $is_used - ); - } elseif ($source_file_path) { - $this->file_reference_provider->addFileReferenceToClassMember( - $source_file_path, - $interface_method_id_lc, - $is_used - ); - } - } - - $declaring_method_class = $declaring_method_id->fq_class_name; - $declaring_method_name = $declaring_method_id->method_name; - - $declaring_class_storage = $this->classlike_storage_provider->get($declaring_method_class); - - if (isset($declaring_class_storage->overridden_method_ids[$declaring_method_name])) { - $overridden_method_ids = $declaring_class_storage->overridden_method_ids[$declaring_method_name]; - - foreach ($overridden_method_ids as $overridden_method_id) { - if ($this->collect_locations && $code_location) { - $this->file_reference_provider->addCallingLocationForClassMethod( - $code_location, - strtolower((string) $overridden_method_id) - ); - } - - if ($calling_method_id) { - // also store failures in case the method is added later - $this->file_reference_provider->addMethodReferenceToClassMember( - $calling_method_id, - strtolower((string) $overridden_method_id), - $is_used - ); - } elseif ($source_file_path) { - $this->file_reference_provider->addFileReferenceToClassMember( - $source_file_path, - strtolower((string) $overridden_method_id), - $is_used - ); - } - } - } - - return true; - } - - if ($source_file_path && $fq_class_name !== strtolower((string) $calling_class_name)) { - if ($calling_method_id) { - $this->file_reference_provider->addMethodReferenceToClass( - $calling_method_id, - $fq_class_name - ); - } else { - $this->file_reference_provider->addNonMethodReferenceToClass( - $source_file_path, - $fq_class_name - ); - } - } - - if ($class_storage->abstract && isset($class_storage->overridden_method_ids[$method_name])) { - return true; - } - - // support checking oldstyle constructors - if ($method_name === '__construct') { - $method_name_parts = explode('\\', $fq_class_name); - $old_constructor_name = array_pop($method_name_parts); - $old_method_id = $fq_class_name . '::' . $old_constructor_name; - } - - if (!$class_storage->user_defined - && (InternalCallMapHandler::inCallMap((string) $method_id) - || ($old_method_id && InternalCallMapHandler::inCallMap($old_method_id))) - ) { - return true; - } - - foreach ($class_storage->parent_classes + $class_storage->used_traits as $potential_future_declaring_fqcln) { - $potential_id = strtolower($potential_future_declaring_fqcln) . '::' . $method_name; - - if ($calling_method_id) { - // also store failures in case the method is added later - $this->file_reference_provider->addMethodReferenceToMissingClassMember( - $calling_method_id, - $potential_id - ); - } elseif ($source_file_path) { - $this->file_reference_provider->addFileReferenceToMissingClassMember( - $source_file_path, - $potential_id - ); - } - } - - if ($calling_method_id) { - // also store failures in case the method is added later - $this->file_reference_provider->addMethodReferenceToMissingClassMember( - $calling_method_id, - strtolower((string) $method_id) - ); - } elseif ($source_file_path) { - $this->file_reference_provider->addFileReferenceToMissingClassMember( - $source_file_path, - strtolower((string) $method_id) - ); - } - - return false; - } - - /** - * @param list $args - * - * @return list - */ - public function getMethodParams( - MethodIdentifier $method_id, - ?StatementsSource $source = null, - ?array $args = null, - ?Context $context = null - ): array { - $fq_class_name = $method_id->fq_class_name; - $method_name = $method_id->method_name; - - if ($this->params_provider->has($fq_class_name)) { - $method_params = $this->params_provider->getMethodParams( - $fq_class_name, - $method_name, - $args, - $source, - $context - ); - - if ($method_params !== null) { - return $method_params; - } - } - - $declaring_method_id = $this->getDeclaringMethodId($method_id); - - $callmap_id = $declaring_method_id ?? $method_id; - - // functions - if (InternalCallMapHandler::inCallMap((string) $callmap_id)) { - $class_storage = $this->classlike_storage_provider->get($callmap_id->fq_class_name); - - $declaring_method_name = $declaring_method_id->method_name ?? $method_name; - - if (!$class_storage->stubbed || empty($class_storage->methods[$declaring_method_name]->stubbed)) { - $function_callables = InternalCallMapHandler::getCallablesFromCallMap((string) $callmap_id); - - if ($function_callables === null) { - throw new UnexpectedValueException( - 'Not expecting $function_callables to be null for ' . $callmap_id - ); - } - - if (!$source || $args === null || count($function_callables) === 1) { - assert($function_callables[0]->params !== null); - - return $function_callables[0]->params; - } - - if ($context && $source instanceof StatementsAnalyzer) { - $was_inside_call = $context->inside_call; - - $context->inside_call = true; - - foreach ($args as $arg) { - ExpressionAnalyzer::analyze( - $source, - $arg->value, - $context - ); - } - - $context->inside_call = $was_inside_call; - } - - $matching_callable = InternalCallMapHandler::getMatchingCallableFromCallMapOptions( - $source->getCodebase(), - $function_callables, - $args, - $source->getNodeTypeProvider(), - (string) $callmap_id - ); - - assert($matching_callable->params !== null); - - return $matching_callable->params; - } - } - - if ($declaring_method_id) { - $storage = $this->getStorage($declaring_method_id); - - $params = $storage->params; - - if ($storage->has_docblock_param_types) { - return $params; - } - - $appearing_method_id = $this->getAppearingMethodId($declaring_method_id); - - if (!$appearing_method_id) { - return $params; - } - - $appearing_fq_class_name = $appearing_method_id->fq_class_name; - $appearing_method_name = $appearing_method_id->method_name; - - $class_storage = $this->classlike_storage_provider->get($appearing_fq_class_name); - - if (!isset($class_storage->overridden_method_ids[$appearing_method_name])) { - return $params; - } - - if (!isset($class_storage->documenting_method_ids[$appearing_method_name])) { - return $params; - } - - $overridden_method_id = $class_storage->documenting_method_ids[$appearing_method_name]; - - $overridden_storage = $this->getStorage($overridden_method_id); - - $overriding_fq_class_name = $overridden_method_id->fq_class_name; - - foreach ($params as $i => $param) { - if (isset($overridden_storage->params[$i]->type) - && $overridden_storage->params[$i]->has_docblock_type - ) { - $params[$i] = clone $param; - /** @var Union $params[$i]->type */ - $params[$i]->type = clone $overridden_storage->params[$i]->type; - - if ($source) { - $overridden_class_storage = $this->classlike_storage_provider->get($overriding_fq_class_name); - $params[$i]->type = self::localizeType( - $source->getCodebase(), - $params[$i]->type, - $appearing_fq_class_name, - $overridden_class_storage->name - ); - } - - if ($params[$i]->signature_type - && $params[$i]->signature_type->isNullable() - ) { - $params[$i]->type->addType(new TNull); - } - - $params[$i]->type_location = $overridden_storage->params[$i]->type_location; - } - } - - return $params; - } - - throw new UnexpectedValueException('Cannot get method params for ' . $method_id); - } - - public static function localizeType( - Codebase $codebase, - Union $type, - string $appearing_fq_class_name, - string $base_fq_class_name - ): Union { - $class_storage = $codebase->classlike_storage_provider->get($appearing_fq_class_name); - $extends = $class_storage->template_extended_params; - - if (!$extends) { - return $type; - } - - $type = clone $type; - - foreach ($type->getAtomicTypes() as $key => $atomic_type) { - if ($atomic_type instanceof TTemplateParam - && ($atomic_type->defining_class === $base_fq_class_name - || isset($extends[$atomic_type->defining_class])) - ) { - $types_to_add = self::getExtendedTemplatedTypes( - $atomic_type, - $extends - ); - - if ($types_to_add) { - $type->removeType($key); - - foreach ($types_to_add as $extra_added_type) { - $type->addType($extra_added_type); - } - } - } - - if ($atomic_type instanceof TTemplateParamClass) { - if ($atomic_type->defining_class === $base_fq_class_name) { - if (isset($extends[$base_fq_class_name][$atomic_type->param_name])) { - $extended_param = $extends[$base_fq_class_name][$atomic_type->param_name]; - - $types = array_values($extended_param->getAtomicTypes()); - - if (count($types) === 1 && $types[0] instanceof TNamedObject) { - $atomic_type->as_type = $types[0]; - } else { - $atomic_type->as_type = null; - } - } - } - } - - if ($atomic_type instanceof TArray - || $atomic_type instanceof TIterable - || $atomic_type instanceof TGenericObject - ) { - foreach ($atomic_type->type_params as &$type_param) { - $type_param = self::localizeType( - $codebase, - $type_param, - $appearing_fq_class_name, - $base_fq_class_name - ); - } - } - - if ($atomic_type instanceof TList) { - $atomic_type->type_param = self::localizeType( - $codebase, - $atomic_type->type_param, - $appearing_fq_class_name, - $base_fq_class_name - ); - } - - if ($atomic_type instanceof TKeyedArray) { - foreach ($atomic_type->properties as &$property_type) { - $property_type = self::localizeType( - $codebase, - $property_type, - $appearing_fq_class_name, - $base_fq_class_name - ); - } - } - - if ($atomic_type instanceof TCallable - || $atomic_type instanceof TClosure - ) { - if ($atomic_type->params) { - foreach ($atomic_type->params as $param) { - if ($param->type) { - $param->type = self::localizeType( - $codebase, - $param->type, - $appearing_fq_class_name, - $base_fq_class_name - ); - } - } - } - - if ($atomic_type->return_type) { - $atomic_type->return_type = self::localizeType( - $codebase, - $atomic_type->return_type, - $appearing_fq_class_name, - $base_fq_class_name - ); - } - } - } - - $type->bustCache(); - - return $type; - } - - /** - * @param array> $extends - * @return list - */ - public static function getExtendedTemplatedTypes( - TTemplateParam $atomic_type, - array $extends - ): array { - $extra_added_types = []; - - if (isset($extends[$atomic_type->defining_class][$atomic_type->param_name])) { - $extended_param = clone $extends[$atomic_type->defining_class][$atomic_type->param_name]; - - foreach ($extended_param->getAtomicTypes() as $extended_atomic_type) { - if ($extended_atomic_type instanceof TTemplateParam) { - $extra_added_types = array_merge( - $extra_added_types, - self::getExtendedTemplatedTypes( - $extended_atomic_type, - $extends - ) - ); - } else { - $extra_added_types[] = $extended_atomic_type; - } - } - } else { - $extra_added_types[] = $atomic_type; - } - - return $extra_added_types; - } - - public function isVariadic(MethodIdentifier $method_id): bool - { - $declaring_method_id = $this->getDeclaringMethodId($method_id); - - if (!$declaring_method_id) { - return false; - } - - return $this->getStorage($declaring_method_id)->variadic; - } - - /** - * @param list|null $args - * - */ - public function getMethodReturnType( - MethodIdentifier $method_id, - ?string &$self_class, - ?SourceAnalyzer $source_analyzer = null, - ?array $args = null - ): ?Union { - $original_fq_class_name = $method_id->fq_class_name; - $original_method_name = $method_id->method_name; - - $adjusted_fq_class_name = $this->classlikes->getUnAliasedName($original_fq_class_name); - - if ($adjusted_fq_class_name !== $original_fq_class_name) { - $original_fq_class_name = strtolower($adjusted_fq_class_name); - } - - $original_class_storage = $this->classlike_storage_provider->get($original_fq_class_name); - - if (isset($original_class_storage->pseudo_methods[$original_method_name])) { - return $original_class_storage->pseudo_methods[$original_method_name]->return_type; - } - - $declaring_method_id = $this->getDeclaringMethodId($method_id); - - if (!$declaring_method_id) { - return null; - } - - $appearing_method_id = $this->getAppearingMethodId($method_id); - - if (!$appearing_method_id) { - $class_storage = $this->classlike_storage_provider->get($original_fq_class_name); - - if ($class_storage->abstract && isset($class_storage->overridden_method_ids[$original_method_name])) { - $appearing_method_id = reset($class_storage->overridden_method_ids[$original_method_name]); - } else { - return null; - } - } - - $appearing_fq_class_name = $appearing_method_id->fq_class_name; - $appearing_method_name = $appearing_method_id->method_name; - - $appearing_fq_class_storage = $this->classlike_storage_provider->get($appearing_fq_class_name); - - if ($appearing_fq_class_name === 'UnitEnum' - && $original_class_storage->is_enum - ) { - if ($original_method_name === 'cases') { - if ($original_class_storage->enum_cases === []) { - return Type::getEmptyArray(); - } - $types = []; - - foreach ($original_class_storage->enum_cases as $case_name => $_) { - $types[] = new Union([new TEnumCase($original_fq_class_name, $case_name)]); - } - - $list = new TKeyedArray($types); - $list->is_list = true; - $list->sealed = true; - return new Union([$list]); - } - } - - if ($appearing_fq_class_name === 'BackedEnum' - && $original_class_storage->is_enum - && $original_class_storage->enum_type - ) { - if (($original_method_name === 'from' - || $original_method_name === 'tryfrom' - ) && $source_analyzer - && isset($args[0]) - && ($first_arg_type = $source_analyzer->getNodeTypeProvider()->getType($args[0]->value)) - ) { - $types = []; - foreach ($original_class_storage->enum_cases as $case_name => $case_storage) { - if (UnionTypeComparator::isContainedBy( - $source_analyzer->getCodebase(), - is_int($case_storage->value) ? - Type::getInt(false, $case_storage->value) : - Type::getString($case_storage->value), - $first_arg_type - )) { - $types[] = new TEnumCase($original_fq_class_name, $case_name); - } - } - if ($types) { - if ($original_method_name === 'tryfrom') { - $types[] = new TNull(); - } - return new Union($types); - } - return $original_method_name === 'tryfrom' ? Type::getNull() : Type::getNever(); - } - } - - if (!$appearing_fq_class_storage->user_defined - && !$appearing_fq_class_storage->stubbed - && InternalCallMapHandler::inCallMap((string) $appearing_method_id) - ) { - if ((string) $appearing_method_id === 'Closure::fromcallable' - && isset($args[0]) - && $source_analyzer - && ($first_arg_type = $source_analyzer->getNodeTypeProvider()->getType($args[0]->value)) - && $first_arg_type->isSingle() - ) { - foreach ($first_arg_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TCallable - || $atomic_type instanceof TClosure - ) { - $callable_type = clone $atomic_type; - - return new Union([new TClosure( - 'Closure', - $callable_type->params, - $callable_type->return_type - )]); - } - - if ($atomic_type instanceof TNamedObject - && $this->methodExists( - new MethodIdentifier($atomic_type->value, '__invoke') - ) - ) { - $invokable_storage = $this->getStorage( - new MethodIdentifier($atomic_type->value, '__invoke') - ); - - return new Union([new TClosure( - 'Closure', - $invokable_storage->params, - $invokable_storage->return_type - )]); - } - } - } - - $callmap_callables = InternalCallMapHandler::getCallablesFromCallMap((string) $appearing_method_id); - - if (!$callmap_callables || $callmap_callables[0]->return_type === null) { - throw new UnexpectedValueException('Shouldn’t get here'); - } - - $return_type_candidate = $callmap_callables[0]->return_type; - - if ($return_type_candidate->isFalsable()) { - $return_type_candidate->ignore_falsable_issues = true; - } - - return $return_type_candidate; - } - - $class_storage = $this->classlike_storage_provider->get($appearing_fq_class_name); - - $storage = $this->getStorage($declaring_method_id); - - $candidate_type = $storage->return_type; - - if ($candidate_type && $candidate_type->isVoid()) { - return clone $candidate_type; - } - - if (isset($class_storage->documenting_method_ids[$appearing_method_name])) { - $overridden_method_id = $class_storage->documenting_method_ids[$appearing_method_name]; - - // special override to allow inference of Iterator types - if ($overridden_method_id->fq_class_name === 'Iterator' - && $storage->return_type - && $storage->return_type === $storage->signature_return_type - ) { - return clone $storage->return_type; - } - - $overridden_storage = $this->getStorage($overridden_method_id); - - if ($overridden_storage->return_type) { - if ($overridden_storage->return_type->isNull()) { - return Type::getVoid(); - } - - if (!$candidate_type || !$source_analyzer) { - $self_class = $overridden_method_id->fq_class_name; - - return clone $overridden_storage->return_type; - } - - if ($candidate_type->getId() === $overridden_storage->return_type->getId()) { - $self_class = $appearing_fq_class_storage->name; - - return clone $candidate_type; - } - - $overridden_class_storage = - $this->classlike_storage_provider->get($overridden_method_id->fq_class_name); - - $overridden_storage_return_type = TypeExpander::expandUnion( - $source_analyzer->getCodebase(), - clone $overridden_storage->return_type, - $overridden_method_id->fq_class_name, - $appearing_fq_class_name, - $overridden_class_storage->parent_class, - true, - false, - $storage->final - ); - - $old_contained_by_new = UnionTypeComparator::isContainedBy( - $source_analyzer->getCodebase(), - $candidate_type, - $overridden_storage_return_type - ); - - $new_contained_by_old = UnionTypeComparator::isContainedBy( - $source_analyzer->getCodebase(), - $overridden_storage_return_type, - $candidate_type - ); - - if ((!$old_contained_by_new && !$new_contained_by_old) - || ($old_contained_by_new && $new_contained_by_old) - ) { - if ($old_contained_by_new) { //implicitly $new_contained_by_old as well - $attempted_intersection = Type::intersectUnionTypes( - $candidate_type, - $overridden_storage->return_type, - $source_analyzer->getCodebase() - ); - } else { - $attempted_intersection = Type::intersectUnionTypes( - $overridden_storage->return_type, - $candidate_type, - $source_analyzer->getCodebase() - ); - } - - if ($attempted_intersection) { - $self_class = $overridden_method_id->fq_class_name; - - return $attempted_intersection; - } - - $self_class = $appearing_fq_class_storage->name; - - return clone $candidate_type; - } - - if ($old_contained_by_new) { - $self_class = $appearing_fq_class_storage->name; - - return clone $candidate_type; - } - - $self_class = $overridden_method_id->fq_class_name; - - return clone $overridden_storage->return_type; - } - } - - if ($candidate_type) { - $self_class = $appearing_fq_class_storage->name; - - return clone $candidate_type; - } - - if (!isset($class_storage->overridden_method_ids[$appearing_method_name])) { - return null; - } - - $candidate_type = null; - - foreach ($class_storage->overridden_method_ids[$appearing_method_name] as $overridden_method_id) { - $overridden_storage = $this->getStorage($overridden_method_id); - - if ($overridden_storage->return_type) { - if ($overridden_storage->return_type->isNull()) { - if ($candidate_type && !$candidate_type->isVoid()) { - return null; - } - - $candidate_type = Type::getVoid(); - continue; - } - - $fq_overridden_class = $overridden_method_id->fq_class_name; - - $overridden_class_storage = - $this->classlike_storage_provider->get($fq_overridden_class); - - $overridden_return_type = clone $overridden_storage->return_type; - - $self_class = $overridden_class_storage->name; - - if ($candidate_type && $source_analyzer && !$candidate_type->isMixed()) { - $old_contained_by_new = UnionTypeComparator::isContainedBy( - $source_analyzer->getCodebase(), - $candidate_type, - $overridden_return_type - ); - - $new_contained_by_old = UnionTypeComparator::isContainedBy( - $source_analyzer->getCodebase(), - $overridden_return_type, - $candidate_type - ); - - if ((!$old_contained_by_new && !$new_contained_by_old) - || ($old_contained_by_new && $new_contained_by_old) - ) { - $attempted_intersection = Type::intersectUnionTypes( - $candidate_type, - $overridden_return_type, - $source_analyzer->getCodebase() - ); - - if ($attempted_intersection) { - $candidate_type = $attempted_intersection; - continue; - } - - return null; - } - - if ($old_contained_by_new) { - continue; - } - } - - $candidate_type = $overridden_return_type; - } - } - - return $candidate_type; - } - - public function getMethodReturnsByRef(MethodIdentifier $method_id): bool - { - $method_id = $this->getDeclaringMethodId($method_id); - - if (!$method_id) { - return false; - } - - $fq_class_storage = $this->classlike_storage_provider->get($method_id->fq_class_name); - - if (!$fq_class_storage->user_defined && InternalCallMapHandler::inCallMap((string) $method_id)) { - return false; - } - - return $this->getStorage($method_id)->returns_by_ref; - } - - /** - * @param CodeLocation|null $defined_location - * - */ - public function getMethodReturnTypeLocation( - MethodIdentifier $method_id, - CodeLocation &$defined_location = null - ): ?CodeLocation { - $method_id = $this->getDeclaringMethodId($method_id); - - if ($method_id === null) { - return null; - } - - $storage = $this->getStorage($method_id); - - if (!$storage->return_type_location) { - $overridden_method_ids = $this->getOverriddenMethodIds($method_id); - - foreach ($overridden_method_ids as $overridden_method_id) { - $overridden_storage = $this->getStorage($overridden_method_id); - - if ($overridden_storage->return_type_location) { - $defined_location = $overridden_storage->return_type_location; - break; - } - } - } - - return $storage->return_type_location; - } - - /** - * @param lowercase-string $method_name_lc - * @param lowercase-string $declaring_method_name_lc - * - */ - public function setDeclaringMethodId( - string $fq_class_name, - string $method_name_lc, - string $declaring_fq_class_name, - string $declaring_method_name_lc - ): void { - $class_storage = $this->classlike_storage_provider->get($fq_class_name); - - $class_storage->declaring_method_ids[$method_name_lc] = new MethodIdentifier( - $declaring_fq_class_name, - $declaring_method_name_lc - ); - } - - /** - * @param lowercase-string $method_name_lc - * @param lowercase-string $appearing_method_name_lc - * - */ - public function setAppearingMethodId( - string $fq_class_name, - string $method_name_lc, - string $appearing_fq_class_name, - string $appearing_method_name_lc - ): void { - $class_storage = $this->classlike_storage_provider->get($fq_class_name); - - $class_storage->appearing_method_ids[$method_name_lc] = new MethodIdentifier( - $appearing_fq_class_name, - $appearing_method_name_lc - ); - } - - public function getDeclaringMethodId( - MethodIdentifier $method_id - ): ?MethodIdentifier { - $fq_class_name = $this->classlikes->getUnAliasedName($method_id->fq_class_name); - - $class_storage = $this->classlike_storage_provider->get($fq_class_name); - - $method_name = $method_id->method_name; - - if (isset($class_storage->declaring_method_ids[$method_name])) { - return $class_storage->declaring_method_ids[$method_name]; - } - - if ($class_storage->abstract && isset($class_storage->overridden_method_ids[$method_name])) { - return reset($class_storage->overridden_method_ids[$method_name]); - } - - return null; - } - - /** - * Get the class this method appears in (vs is declared in, which could give a trait - */ - public function getAppearingMethodId( - MethodIdentifier $method_id - ): ?MethodIdentifier { - $fq_class_name = $this->classlikes->getUnAliasedName($method_id->fq_class_name); - - $class_storage = $this->classlike_storage_provider->get($fq_class_name); - - $method_name = $method_id->method_name; - - return $class_storage->appearing_method_ids[$method_name] ?? null; - } - - /** - * @return array - */ - public function getOverriddenMethodIds(MethodIdentifier $method_id): array - { - $class_storage = $this->classlike_storage_provider->get($method_id->fq_class_name); - $method_name = $method_id->method_name; - - return $class_storage->overridden_method_ids[$method_name] ?? []; - } - - public function getCasedMethodId(MethodIdentifier $original_method_id): string - { - $method_id = $this->getDeclaringMethodId($original_method_id); - - if ($method_id === null) { - return (string) $original_method_id; - } - - $fq_class_name = $method_id->fq_class_name; - $new_method_name = $method_id->method_name; - - $old_fq_class_name = $original_method_id->fq_class_name; - $old_method_name = $original_method_id->method_name; - - $storage = $this->getStorage($method_id); - - if ($old_method_name === $new_method_name - && strtolower($old_fq_class_name) !== $old_fq_class_name - ) { - return $old_fq_class_name . '::' . $storage->cased_name; - } - - return $fq_class_name . '::' . $storage->cased_name; - } - - public function getUserMethodStorage(MethodIdentifier $method_id): ?MethodStorage - { - $declaring_method_id = $this->getDeclaringMethodId($method_id); - - if (!$declaring_method_id) { - if (InternalCallMapHandler::inCallMap((string) $method_id)) { - return null; - } - - throw new UnexpectedValueException('$storage should not be null for ' . $method_id); - } - - $storage = $this->getStorage($declaring_method_id); - - if (!$storage->location) { - return null; - } - - return $storage; - } - - public function getClassLikeStorageForMethod(MethodIdentifier $method_id): ClassLikeStorage - { - $fq_class_name = $method_id->fq_class_name; - $method_name = $method_id->method_name; - - if ($this->existence_provider->has($fq_class_name)) { - if ($this->existence_provider->doesMethodExist( - $fq_class_name, - $method_name, - null, - null - )) { - return $this->classlike_storage_provider->get($fq_class_name); - } - } - - $declaring_method_id = $this->getDeclaringMethodId($method_id); - - if ($declaring_method_id === null) { - if (InternalCallMapHandler::inCallMap((string) $method_id)) { - $declaring_method_id = $method_id; - } else { - throw new UnexpectedValueException('$storage should not be null for ' . $method_id); - } - } - - $declaring_fq_class_name = $declaring_method_id->fq_class_name; - - return $this->classlike_storage_provider->get($declaring_fq_class_name); - } - - public function getStorage(MethodIdentifier $method_id): MethodStorage - { - try { - $class_storage = $this->classlike_storage_provider->get($method_id->fq_class_name); - } catch (InvalidArgumentException $e) { - throw new UnexpectedValueException($e->getMessage()); - } - - $method_name = $method_id->method_name; - - if (!isset($class_storage->methods[$method_name])) { - throw new UnexpectedValueException( - '$storage should not be null for ' . $method_id - ); - } - - return $class_storage->methods[$method_name]; - } - - public function hasStorage(MethodIdentifier $method_id): bool - { - try { - $class_storage = $this->classlike_storage_provider->get($method_id->fq_class_name); - } catch (InvalidArgumentException $e) { - return false; - } - - $method_name = $method_id->method_name; - - if (!isset($class_storage->methods[$method_name])) { - return false; - } - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php deleted file mode 100644 index 9d832824..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php +++ /dev/null @@ -1,1224 +0,0 @@ -> - */ - private $invalid_class_storages = []; - - /** - * @var Progress - */ - private $progress; - - /** - * @var ClassLikes - */ - private $classlikes; - - /** - * @var Config - */ - private $config; - - /** - * @var FileReferenceProvider - */ - private $file_reference_provider; - - public function __construct( - Config $config, - ClassLikeStorageProvider $classlike_storage_provider, - FileStorageProvider $file_storage_provider, - ClassLikes $classlikes, - FileReferenceProvider $file_reference_provider, - Progress $progress - ) { - $this->classlike_storage_provider = $classlike_storage_provider; - $this->file_storage_provider = $file_storage_provider; - $this->classlikes = $classlikes; - $this->progress = $progress; - $this->config = $config; - $this->file_reference_provider = $file_reference_provider; - } - - public function populateCodebase(): void - { - $this->progress->debug('ClassLikeStorage is populating' . "\n"); - - foreach ($this->classlike_storage_provider->getNew() as $class_storage) { - $this->populateClassLikeStorage($class_storage); - } - - $this->progress->debug('ClassLikeStorage is populated' . "\n"); - - $this->progress->debug('FileStorage is populating' . "\n"); - - $all_file_storage = $this->file_storage_provider->getNew(); - - foreach ($all_file_storage as $file_storage) { - $this->populateFileStorage($file_storage); - } - - foreach ($this->classlike_storage_provider->getNew() as $class_storage) { - if ($this->config->allow_phpstorm_generics) { - foreach ($class_storage->properties as $property_storage) { - if ($property_storage->type) { - $this->convertPhpStormGenericToPsalmGeneric($property_storage->type, true); - } - } - - foreach ($class_storage->methods as $method_storage) { - if ($method_storage->return_type) { - $this->convertPhpStormGenericToPsalmGeneric($method_storage->return_type); - } - - foreach ($method_storage->params as $param_storage) { - if ($param_storage->type) { - $this->convertPhpStormGenericToPsalmGeneric($param_storage->type); - } - } - } - } - - foreach ($class_storage->dependent_classlikes as $dependent_classlike_lc => $_) { - try { - $dependee_storage = $this->classlike_storage_provider->get($dependent_classlike_lc); - } catch (InvalidArgumentException $exception) { - continue; - } - - $class_storage->dependent_classlikes += $dependee_storage->dependent_classlikes; - } - } - - if ($this->config->allow_phpstorm_generics) { - foreach ($all_file_storage as $file_storage) { - foreach ($file_storage->functions as $function_storage) { - if ($function_storage->return_type) { - $this->convertPhpStormGenericToPsalmGeneric($function_storage->return_type); - } - - foreach ($function_storage->params as $param_storage) { - if ($param_storage->type) { - $this->convertPhpStormGenericToPsalmGeneric($param_storage->type); - } - } - } - } - } - - $this->progress->debug('FileStorage is populated' . "\n"); - - ClassLikeStorageProvider::populated(); - FileStorageProvider::populated(); - } - - private function populateClassLikeStorage(ClassLikeStorage $storage, array $dependent_classlikes = []): void - { - if ($storage->populated) { - return; - } - - $fq_classlike_name_lc = strtolower($storage->name); - - if (isset($dependent_classlikes[$fq_classlike_name_lc])) { - if ($storage->location && IssueBuffer::accepts( - new CircularReference( - 'Circular reference discovered when loading ' . $storage->name, - $storage->location - ) - )) { - // fall through - } - - return; - } - - $storage_provider = $this->classlike_storage_provider; - - $dependent_classlikes[$fq_classlike_name_lc] = true; - - $this->populateDataFromTraits($storage, $storage_provider, $dependent_classlikes); - - if ($storage->parent_classes) { - $this->populateDataFromParentClass($storage, $storage_provider, $dependent_classlikes); - } - - if (!strpos($fq_classlike_name_lc, '\\') - && !isset($storage->methods['__construct']) - && isset($storage->methods[$fq_classlike_name_lc]) - && !$storage->is_interface - && !$storage->is_trait - ) { - $storage->methods['__construct'] = $storage->methods[$fq_classlike_name_lc]; - } - - $this->populateInterfaceDataFromParentInterfaces($storage, $storage_provider, $dependent_classlikes); - - $this->populateDataFromImplementedInterfaces($storage, $storage_provider, $dependent_classlikes); - - if ($storage->location) { - $file_path = $storage->location->file_path; - - foreach ($storage->parent_interfaces as $parent_interface_lc) { - $this->file_reference_provider->addFileInheritanceToClass($file_path, $parent_interface_lc); - } - - foreach ($storage->parent_classes as $parent_class_lc => $_) { - $this->file_reference_provider->addFileInheritanceToClass($file_path, $parent_class_lc); - } - - foreach ($storage->class_implements as $implemented_interface) { - $this->file_reference_provider->addFileInheritanceToClass( - $file_path, - strtolower($implemented_interface) - ); - } - - foreach ($storage->used_traits as $used_trait_lc => $_) { - $this->file_reference_provider->addFileInheritanceToClass($file_path, $used_trait_lc); - } - } - - if ($storage->mutation_free || $storage->external_mutation_free) { - foreach ($storage->methods as $method) { - if (!$method->is_static && !$method->external_mutation_free) { - $method->mutation_free = $storage->mutation_free; - $method->external_mutation_free = $storage->external_mutation_free; - $method->immutable = $storage->mutation_free; - } - } - - if ($storage->mutation_free) { - foreach ($storage->properties as $property) { - if (!$property->is_static) { - $property->readonly = true; - } - } - } - } - - if ($storage->specialize_instance) { - foreach ($storage->methods as $method) { - if (!$method->is_static) { - $method->specialize_call = true; - } - } - } - - if (!$storage->is_interface && !$storage->is_trait) { - foreach ($storage->methods as $method) { - $method->internal = array_merge($storage->internal, $method->internal); - } - - foreach ($storage->properties as $property) { - $property->internal = array_merge($storage->internal, $property->internal); - } - } - - $this->populateOverriddenMethods($storage); - - $this->progress->debug('Have populated ' . $storage->name . "\n"); - - $storage->populated = true; - - if (isset($this->invalid_class_storages[$fq_classlike_name_lc])) { - foreach ($this->invalid_class_storages[$fq_classlike_name_lc] as $dependency) { - $dependency->populated = false; - $this->populateClassLikeStorage($dependency, $dependent_classlikes); - } - - unset($this->invalid_class_storages[$fq_classlike_name_lc]); - } - } - - private function populateOverriddenMethods( - ClassLikeStorage $storage - ): void { - $storage->documenting_method_ids = []; - - foreach ($storage->methods as $method_name => $method_storage) { - if (isset($storage->overridden_method_ids[$method_name])) { - $overridden_method_ids = $storage->overridden_method_ids[$method_name]; - - $candidate_overridden_ids = null; - - $declaring_class_storages = []; - - foreach ($overridden_method_ids as $declaring_method_id) { - $declaring_class = $declaring_method_id->fq_class_name; - $declaring_class_storage - = $declaring_class_storages[$declaring_class] - = $this->classlike_storage_provider->get($declaring_class); - - if ($candidate_overridden_ids === null) { - $candidate_overridden_ids - = ($declaring_class_storage->overridden_method_ids[$method_name] ?? []) - + [$declaring_method_id->fq_class_name => $declaring_method_id]; - } else { - $candidate_overridden_ids = array_intersect_key( - $candidate_overridden_ids, - ($declaring_class_storage->overridden_method_ids[$method_name] ?? []) - + [$declaring_method_id->fq_class_name => $declaring_method_id] - ); - } - } - - foreach ($overridden_method_ids as $declaring_method_id) { - $declaring_class = $declaring_method_id->fq_class_name; - $declaring_method_name = $declaring_method_id->method_name; - $declaring_class_storage = $declaring_class_storages[$declaring_class]; - - $declaring_method_storage = $declaring_class_storage->methods[$declaring_method_name]; - - if (($declaring_method_storage->has_docblock_param_types - || $declaring_method_storage->has_docblock_return_type) - && !$method_storage->has_docblock_param_types - && !$method_storage->has_docblock_return_type - && $method_storage->inherited_return_type !== null - ) { - if (!isset($storage->documenting_method_ids[$method_name]) - || (string) $storage->documenting_method_ids[$method_name] - === (string) $declaring_method_id - ) { - $storage->documenting_method_ids[$method_name] = $declaring_method_id; - $method_storage->inherited_return_type = true; - } else { - if (in_array( - $storage->documenting_method_ids[$method_name]->fq_class_name, - $declaring_class_storage->parent_interfaces - )) { - $storage->documenting_method_ids[$method_name] = $declaring_method_id; - $method_storage->inherited_return_type = true; - } else { - $documenting_class_storage = $declaring_class_storages - [$storage->documenting_method_ids[$method_name]->fq_class_name]; - - if (!in_array( - $declaring_class, - $documenting_class_storage->parent_interfaces - ) && $documenting_class_storage->is_interface - ) { - unset($storage->documenting_method_ids[$method_name]); - $method_storage->inherited_return_type = null; - } - } - } - } - - // tell the declaring class it's overridden downstream - $declaring_method_storage->overridden_downstream = true; - $declaring_method_storage->overridden_somewhere = true; - - if ($declaring_method_storage->mutation_free_inferred) { - $declaring_method_storage->mutation_free = false; - $declaring_method_storage->external_mutation_free = false; - $declaring_method_storage->mutation_free_inferred = false; - } - - if ($declaring_method_storage->throws - && (!$method_storage->throws || $method_storage->inheritdoc) - ) { - $method_storage->throws += $declaring_method_storage->throws; - } - } - } - } - } - - private function populateDataFromTraits( - ClassLikeStorage $storage, - ClassLikeStorageProvider $storage_provider, - array $dependent_classlikes - ): void { - foreach ($storage->used_traits as $used_trait_lc => $_) { - try { - $used_trait_lc = strtolower( - $this->classlikes->getUnAliasedName( - $used_trait_lc - ) - ); - $trait_storage = $storage_provider->get($used_trait_lc); - } catch (InvalidArgumentException $e) { - continue; - } - - $this->populateClassLikeStorage($trait_storage, $dependent_classlikes); - - $this->inheritMethodsFromParent($storage, $trait_storage); - $this->inheritPropertiesFromParent($storage, $trait_storage); - - if ($trait_storage->template_types) { - $storage->template_extended_params[$trait_storage->name] = []; - - if (isset($storage->template_extended_offsets[$trait_storage->name])) { - foreach ($storage->template_extended_offsets[$trait_storage->name] as $i => $type) { - $trait_template_type_names = array_keys($trait_storage->template_types); - - $mapped_name = $trait_template_type_names[$i] ?? null; - - if ($mapped_name) { - $storage->template_extended_params[$trait_storage->name][$mapped_name] = $type; - } - } - - if ($trait_storage->template_extended_params) { - foreach ($trait_storage->template_extended_params as $t_storage_class => $type_map) { - foreach ($type_map as $i => $type) { - $storage->template_extended_params[$t_storage_class][$i] = self::extendType( - $type, - $storage - ); - } - } - } - } else { - foreach ($trait_storage->template_types as $template_name => $template_type_map) { - foreach ($template_type_map as $template_type) { - $default_param = clone $template_type; - $default_param->from_docblock = false; - $storage->template_extended_params[$trait_storage->name][$template_name] - = $default_param; - } - } - } - } elseif ($trait_storage->template_extended_params) { - $storage->template_extended_params = array_merge( - $storage->template_extended_params ?: [], - $trait_storage->template_extended_params - ); - } - - $storage->pseudo_property_get_types += $trait_storage->pseudo_property_get_types; - $storage->pseudo_property_set_types += $trait_storage->pseudo_property_set_types; - - $storage->pseudo_methods += $trait_storage->pseudo_methods; - $storage->declaring_pseudo_method_ids += $trait_storage->declaring_pseudo_method_ids; - } - } - - private static function extendType( - Union $type, - ClassLikeStorage $storage - ): Union { - $extended_types = []; - - foreach ($type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TTemplateParam) { - $referenced_type - = $storage->template_extended_params[$atomic_type->defining_class][$atomic_type->param_name] - ?? null; - - if ($referenced_type) { - foreach ($referenced_type->getAtomicTypes() as $atomic_referenced_type) { - if (!$atomic_referenced_type instanceof TTemplateParam) { - $extended_types[] = $atomic_referenced_type; - } else { - $extended_types[] = $atomic_type; - } - } - } else { - $extended_types[] = $atomic_type; - } - } else { - $extended_types[] = $atomic_type; - } - } - - return new Union($extended_types); - } - - private function populateDataFromParentClass( - ClassLikeStorage $storage, - ClassLikeStorageProvider $storage_provider, - array $dependent_classlikes - ): void { - $parent_storage_class = reset($storage->parent_classes); - - $parent_storage_class = strtolower( - $this->classlikes->getUnAliasedName( - $parent_storage_class - ) - ); - - try { - $parent_storage = $storage_provider->get($parent_storage_class); - } catch (InvalidArgumentException $e) { - $this->progress->debug('Populator could not find dependency (' . __LINE__ . ")\n"); - - $storage->invalid_dependencies[] = $parent_storage_class; - - $this->invalid_class_storages[$parent_storage_class][] = $storage; - - return; - } - - $this->populateClassLikeStorage($parent_storage, $dependent_classlikes); - - $storage->parent_classes = array_merge($storage->parent_classes, $parent_storage->parent_classes); - - if ($parent_storage->template_types) { - $storage->template_extended_params[$parent_storage->name] = []; - - if (isset($storage->template_extended_offsets[$parent_storage->name])) { - foreach ($storage->template_extended_offsets[$parent_storage->name] as $i => $type) { - $parent_template_type_names = array_keys($parent_storage->template_types); - - $mapped_name = $parent_template_type_names[$i] ?? null; - - if ($mapped_name) { - $storage->template_extended_params[$parent_storage->name][$mapped_name] = $type; - } - } - - if ($parent_storage->template_extended_params) { - foreach ($parent_storage->template_extended_params as $t_storage_class => $type_map) { - foreach ($type_map as $i => $type) { - $storage->template_extended_params[$t_storage_class][$i] = self::extendType( - $type, - $storage - ); - } - } - } - } else { - foreach ($parent_storage->template_types as $template_name => $template_type_map) { - foreach ($template_type_map as $template_type) { - $default_param = clone $template_type; - $default_param->from_docblock = false; - $storage->template_extended_params[$parent_storage->name][$template_name] - = $default_param; - } - } - - if ($parent_storage->template_extended_params) { - $storage->template_extended_params = array_merge( - $storage->template_extended_params, - $parent_storage->template_extended_params - ); - } - } - } elseif ($parent_storage->template_extended_params) { - $storage->template_extended_params = array_merge( - $storage->template_extended_params ?: [], - $parent_storage->template_extended_params - ); - } - - $this->inheritMethodsFromParent($storage, $parent_storage); - $this->inheritPropertiesFromParent($storage, $parent_storage); - - $storage->class_implements = array_merge($storage->class_implements, $parent_storage->class_implements); - $storage->invalid_dependencies = array_merge( - $storage->invalid_dependencies, - $parent_storage->invalid_dependencies - ); - - if ($parent_storage->has_visitor_issues) { - $storage->has_visitor_issues = true; - } - - $storage->constants = array_merge( - array_filter( - $parent_storage->constants, - function ($constant) { - return $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC - || $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PROTECTED; - } - ), - $storage->constants - ); - - if ($parent_storage->preserve_constructor_signature) { - $storage->preserve_constructor_signature = true; - } - - if (($parent_storage->namedMixins || $parent_storage->templatedMixins) - && (!$storage->namedMixins || !$storage->templatedMixins)) { - $storage->mixin_declaring_fqcln = $parent_storage->mixin_declaring_fqcln; - - if (!$storage->namedMixins) { - $storage->namedMixins = $parent_storage->namedMixins; - } - - if (!$storage->templatedMixins) { - $storage->templatedMixins = $parent_storage->templatedMixins; - } - } - - $storage->pseudo_property_get_types += $parent_storage->pseudo_property_get_types; - $storage->pseudo_property_set_types += $parent_storage->pseudo_property_set_types; - - $parent_storage->dependent_classlikes[strtolower($storage->name)] = true; - - $storage->pseudo_methods += $parent_storage->pseudo_methods; - $storage->declaring_pseudo_method_ids += $parent_storage->declaring_pseudo_method_ids; - } - - private function populateInterfaceDataFromParentInterfaces( - ClassLikeStorage $storage, - ClassLikeStorageProvider $storage_provider, - array $dependent_classlikes - ): void { - $parent_interfaces = []; - - foreach ($storage->direct_interface_parents as $parent_interface_lc => $_) { - try { - $parent_interface_lc = strtolower( - $this->classlikes->getUnAliasedName( - $parent_interface_lc - ) - ); - $parent_interface_storage = $storage_provider->get($parent_interface_lc); - } catch (InvalidArgumentException $e) { - $this->progress->debug('Populator could not find dependency (' . __LINE__ . ")\n"); - - $storage->invalid_dependencies[] = $parent_interface_lc; - continue; - } - - $this->populateClassLikeStorage($parent_interface_storage, $dependent_classlikes); - - // copy over any constants - $storage->constants = array_merge( - array_filter( - $parent_interface_storage->constants, - function ($constant) { - return $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC; - } - ), - $storage->constants - ); - - $storage->invalid_dependencies = array_merge( - $storage->invalid_dependencies, - $parent_interface_storage->invalid_dependencies - ); - - if ($parent_interface_storage->template_types) { - $storage->template_extended_params[$parent_interface_storage->name] = []; - - if (isset($storage->template_extended_offsets[$parent_interface_storage->name])) { - foreach ($storage->template_extended_offsets[$parent_interface_storage->name] as $i => $type) { - $parent_template_type_names = array_keys($parent_interface_storage->template_types); - - $mapped_name = $parent_template_type_names[$i] ?? null; - - if ($mapped_name) { - $storage->template_extended_params[$parent_interface_storage->name][$mapped_name] = $type; - } - } - - if ($parent_interface_storage->template_extended_params) { - foreach ($parent_interface_storage->template_extended_params as $t_storage_class => $type_map) { - foreach ($type_map as $i => $type) { - $storage->template_extended_params[$t_storage_class][$i] = self::extendType( - $type, - $storage - ); - } - } - } - } else { - foreach ($parent_interface_storage->template_types as $template_name => $template_type_map) { - foreach ($template_type_map as $template_type) { - $default_param = clone $template_type; - $default_param->from_docblock = false; - $storage->template_extended_params[$parent_interface_storage->name][$template_name] - = $default_param; - } - } - } - } elseif ($parent_interface_storage->template_extended_params) { - $storage->template_extended_params = array_merge( - $storage->template_extended_params ?: [], - $parent_interface_storage->template_extended_params - ); - } - - $parent_interfaces = array_merge($parent_interfaces, $parent_interface_storage->parent_interfaces); - - $this->inheritMethodsFromParent($storage, $parent_interface_storage); - - $storage->pseudo_methods += $parent_interface_storage->pseudo_methods; - $storage->declaring_pseudo_method_ids += $parent_interface_storage->declaring_pseudo_method_ids; - } - - $storage->parent_interfaces = array_merge($parent_interfaces, $storage->parent_interfaces); - - foreach ($storage->parent_interfaces as $parent_interface_lc => $_) { - try { - $parent_interface_lc = strtolower( - $this->classlikes->getUnAliasedName( - $parent_interface_lc - ) - ); - $parent_interface_storage = $storage_provider->get($parent_interface_lc); - } catch (InvalidArgumentException $e) { - continue; - } - - $parent_interface_storage->dependent_classlikes[strtolower($storage->name)] = true; - } - } - - private function populateDataFromImplementedInterfaces( - ClassLikeStorage $storage, - ClassLikeStorageProvider $storage_provider, - array $dependent_classlikes - ): void { - $extra_interfaces = []; - - foreach ($storage->direct_class_interfaces as $implemented_interface_lc => $_) { - try { - $implemented_interface_lc = strtolower( - $this->classlikes->getUnAliasedName( - $implemented_interface_lc - ) - ); - $implemented_interface_storage = $storage_provider->get($implemented_interface_lc); - } catch (InvalidArgumentException $e) { - $this->progress->debug('Populator could not find dependency (' . __LINE__ . ")\n"); - - $storage->invalid_dependencies[] = $implemented_interface_lc; - continue; - } - - $this->populateClassLikeStorage($implemented_interface_storage, $dependent_classlikes); - - // copy over any constants - $storage->constants = array_merge( - array_filter( - $implemented_interface_storage->constants, - function ($constant) { - return $constant->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC; - } - ), - $storage->constants - ); - - $storage->invalid_dependencies = array_merge( - $storage->invalid_dependencies, - $implemented_interface_storage->invalid_dependencies - ); - - if ($implemented_interface_storage->template_types) { - $storage->template_extended_params[$implemented_interface_storage->name] = []; - - if (isset($storage->template_extended_offsets[$implemented_interface_storage->name])) { - foreach ($storage->template_extended_offsets[$implemented_interface_storage->name] as $i => $type) { - $parent_template_type_names = array_keys($implemented_interface_storage->template_types); - - $mapped_name = $parent_template_type_names[$i] ?? null; - - if ($mapped_name) { - $storage->template_extended_params[$implemented_interface_storage->name][$mapped_name] - = $type; - } - } - - if ($implemented_interface_storage->template_extended_params) { - foreach ($implemented_interface_storage->template_extended_params as $e_i => $type_map) { - foreach ($type_map as $i => $type) { - $storage->template_extended_params[$e_i][$i] = self::extendType( - $type, - $storage - ); - } - } - } - } else { - foreach ($implemented_interface_storage->template_types as $template_name => $template_type_map) { - foreach ($template_type_map as $template_type) { - $default_param = clone $template_type; - $default_param->from_docblock = false; - $storage->template_extended_params[$implemented_interface_storage->name][$template_name] - = $default_param; - } - } - } - } elseif ($implemented_interface_storage->template_extended_params) { - $storage->template_extended_params = array_merge( - $storage->template_extended_params ?: [], - $implemented_interface_storage->template_extended_params - ); - } - - $extra_interfaces = array_merge($extra_interfaces, $implemented_interface_storage->parent_interfaces); - } - - $storage->class_implements = array_merge($storage->class_implements, $extra_interfaces); - - $interface_method_implementers = []; - - foreach ($storage->class_implements as $implemented_interface_lc => $_) { - try { - $implemented_interface = strtolower( - $this->classlikes->getUnAliasedName( - $implemented_interface_lc - ) - ); - $implemented_interface_storage = $storage_provider->get($implemented_interface); - } catch (InvalidArgumentException $e) { - continue; - } - - $implemented_interface_storage->dependent_classlikes[strtolower($storage->name)] = true; - - foreach ($implemented_interface_storage->methods as $method_name => $method) { - if ($method->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC) { - $interface_method_implementers[$method_name][] = new MethodIdentifier( - $implemented_interface_storage->name, - $method_name - ); - } - } - } - - foreach ($interface_method_implementers as $method_name => $interface_method_ids) { - if (count($interface_method_ids) === 1) { - if (isset($storage->methods[$method_name])) { - $method_storage = $storage->methods[$method_name]; - - if ($method_storage->signature_return_type - && !$method_storage->signature_return_type->isVoid() - && $method_storage->return_type === $method_storage->signature_return_type - ) { - $interface_fqcln = $interface_method_ids[0]->fq_class_name; - $interface_storage = $storage_provider->get($interface_fqcln); - - if (isset($interface_storage->methods[$method_name])) { - $interface_method_storage = $interface_storage->methods[$method_name]; - - if ($interface_method_storage->throws - && (!$method_storage->throws || $method_storage->inheritdoc) - ) { - $method_storage->throws += $interface_method_storage->throws; - } - } - } - } - } - - foreach ($interface_method_ids as $interface_method_id) { - $storage->overridden_method_ids[$method_name][$interface_method_id->fq_class_name] - = $interface_method_id; - } - } - } - - /** - * @param array $dependent_file_paths - */ - private function populateFileStorage(FileStorage $storage, array $dependent_file_paths = []): void - { - if ($storage->populated) { - return; - } - - $file_path_lc = strtolower($storage->file_path); - - if (isset($dependent_file_paths[$file_path_lc])) { - return; - } - - $dependent_file_paths[$file_path_lc] = true; - - $all_required_file_paths = $storage->required_file_paths; - - foreach ($storage->required_file_paths as $included_file_path => $_) { - try { - $included_file_storage = $this->file_storage_provider->get($included_file_path); - } catch (InvalidArgumentException $e) { - continue; - } - - $this->populateFileStorage($included_file_storage, $dependent_file_paths); - - $all_required_file_paths = $all_required_file_paths + $included_file_storage->required_file_paths; - } - - foreach ($all_required_file_paths as $included_file_path => $_) { - try { - $included_file_storage = $this->file_storage_provider->get($included_file_path); - } catch (InvalidArgumentException $e) { - continue; - } - - $storage->declaring_function_ids = array_merge( - $included_file_storage->declaring_function_ids, - $storage->declaring_function_ids - ); - - $storage->declaring_constants = array_merge( - $included_file_storage->declaring_constants, - $storage->declaring_constants - ); - } - - foreach ($storage->referenced_classlikes as $fq_class_name) { - try { - $classlike_storage = $this->classlike_storage_provider->get($fq_class_name); - } catch (InvalidArgumentException $e) { - continue; - } - - if (!$classlike_storage->location) { - continue; - } - - try { - $included_file_storage = $this->file_storage_provider->get($classlike_storage->location->file_path); - } catch (InvalidArgumentException $e) { - continue; - } - - foreach ($classlike_storage->used_traits as $used_trait) { - try { - $trait_storage = $this->classlike_storage_provider->get($used_trait); - } catch (InvalidArgumentException $e) { - continue; - } - - if (!$trait_storage->location) { - continue; - } - - try { - $included_trait_file_storage = $this->file_storage_provider->get( - $trait_storage->location->file_path - ); - } catch (InvalidArgumentException $e) { - continue; - } - - $storage->declaring_function_ids = array_merge( - $included_trait_file_storage->declaring_function_ids, - $storage->declaring_function_ids - ); - } - - $storage->declaring_function_ids = array_merge( - $included_file_storage->declaring_function_ids, - $storage->declaring_function_ids - ); - } - - $storage->required_file_paths = $all_required_file_paths; - - foreach ($all_required_file_paths as $required_file_path) { - try { - $required_file_storage = $this->file_storage_provider->get($required_file_path); - } catch (InvalidArgumentException $e) { - continue; - } - - $required_file_storage->required_by_file_paths += [$file_path_lc => $storage->file_path]; - } - - foreach ($storage->required_classes as $required_classlike) { - try { - $classlike_storage = $this->classlike_storage_provider->get($required_classlike); - } catch (InvalidArgumentException $e) { - continue; - } - - if (!$classlike_storage->location) { - continue; - } - - try { - $required_file_storage = $this->file_storage_provider->get($classlike_storage->location->file_path); - } catch (InvalidArgumentException $e) { - continue; - } - - $required_file_storage->required_by_file_paths += [$file_path_lc => $storage->file_path]; - } - - $storage->populated = true; - } - - private function convertPhpStormGenericToPsalmGeneric(Union $candidate, bool $is_property = false): void - { - if (!$candidate->from_docblock) { - //never convert a type that comes from a signature - return; - } - - $atomic_types = $candidate->getAtomicTypes(); - - if (isset($atomic_types['array']) && count($atomic_types) > 1 && !isset($atomic_types['null'])) { - $iterator_name = null; - $generic_params = null; - $iterator_key = null; - - try { - foreach ($atomic_types as $type_key => $type) { - if ($type instanceof TIterable - || ($type instanceof TNamedObject - && (!$type->from_docblock || $is_property) - && ( - strtolower($type->value) === 'traversable' - || $this->classlikes->interfaceExtends( - $type->value, - 'Traversable' - ) - || $this->classlikes->classImplements( - $type->value, - 'Traversable' - ) - )) - ) { - $iterator_name = $type->value; - $iterator_key = $type_key; - } elseif ($type instanceof TArray) { - $generic_params = $type->type_params; - } - } - } catch (InvalidArgumentException $e) { - // ignore class-not-found issues - } - - if ($iterator_name && $iterator_key && $generic_params) { - if ($iterator_name === 'iterable') { - $generic_iterator = new TIterable($generic_params); - } else { - if (strtolower($iterator_name) === 'generator') { - $generic_params[] = Type::getMixed(); - $generic_params[] = Type::getMixed(); - } - $generic_iterator = new TGenericObject($iterator_name, $generic_params); - } - - $candidate->removeType('array'); - $candidate->removeType($iterator_key); - $candidate->addType($generic_iterator); - } - } - } - - protected function inheritMethodsFromParent( - ClassLikeStorage $storage, - ClassLikeStorage $parent_storage - ): void { - $fq_class_name = $storage->name; - $fq_class_name_lc = strtolower($fq_class_name); - - if ($parent_storage->sealed_methods) { - $storage->sealed_methods = true; - } - - // register where they appear (can never be in a trait) - foreach ($parent_storage->appearing_method_ids as $method_name_lc => $appearing_method_id) { - $aliased_method_names = [$method_name_lc]; - - if ($parent_storage->is_trait - && $storage->trait_alias_map - ) { - $aliased_method_names = array_merge( - $aliased_method_names, - array_keys($storage->trait_alias_map, $method_name_lc, true) - ); - } - - foreach ($aliased_method_names as $aliased_method_name) { - if (isset($storage->appearing_method_ids[$aliased_method_name])) { - continue; - } - - $implemented_method_id = new MethodIdentifier( - $fq_class_name, - $aliased_method_name - ); - - $storage->appearing_method_ids[$aliased_method_name] = - $parent_storage->is_trait ? $implemented_method_id : $appearing_method_id; - - $this_method_id = $fq_class_name_lc . '::' . $method_name_lc; - - if (isset($storage->methods[$aliased_method_name])) { - $storage->potential_declaring_method_ids[$aliased_method_name] = [$this_method_id => true]; - } else { - if (isset($parent_storage->potential_declaring_method_ids[$aliased_method_name])) { - $storage->potential_declaring_method_ids[$aliased_method_name] - = $parent_storage->potential_declaring_method_ids[$aliased_method_name]; - } - - $storage->potential_declaring_method_ids[$aliased_method_name][$this_method_id] = true; - - $parent_method_id = strtolower($parent_storage->name) . '::' . $method_name_lc; - $storage->potential_declaring_method_ids[$aliased_method_name][$parent_method_id] = true; - } - } - } - - // register where they're declared - foreach ($parent_storage->inheritable_method_ids as $method_name_lc => $declaring_method_id) { - if ($method_name_lc !== '__construct' - || $parent_storage->preserve_constructor_signature - ) { - if ($parent_storage->is_trait) { - $declaring_class = $declaring_method_id->fq_class_name; - $declaring_class_storage = $this->classlike_storage_provider->get($declaring_class); - - if (isset($declaring_class_storage->methods[$method_name_lc]) - && $declaring_class_storage->methods[$method_name_lc]->abstract - ) { - $storage->overridden_method_ids[$method_name_lc][$declaring_method_id->fq_class_name] - = $declaring_method_id; - } - } else { - $storage->overridden_method_ids[$method_name_lc][$declaring_method_id->fq_class_name] - = $declaring_method_id; - } - - if (isset($parent_storage->overridden_method_ids[$method_name_lc]) - && isset($storage->overridden_method_ids[$method_name_lc]) - ) { - $storage->overridden_method_ids[$method_name_lc] - += $parent_storage->overridden_method_ids[$method_name_lc]; - } - } - - $aliased_method_names = [$method_name_lc]; - - if ($parent_storage->is_trait - && $storage->trait_alias_map - ) { - $aliased_method_names = array_merge( - $aliased_method_names, - array_keys($storage->trait_alias_map, $method_name_lc, true) - ); - } - - foreach ($aliased_method_names as $aliased_method_name) { - if (isset($storage->declaring_method_ids[$aliased_method_name])) { - $implementing_method_id = $storage->declaring_method_ids[$aliased_method_name]; - - $implementing_class_storage = $this->classlike_storage_provider->get( - $implementing_method_id->fq_class_name - ); - - if (!$implementing_class_storage->methods[$implementing_method_id->method_name]->abstract - || !empty($storage->methods[$implementing_method_id->method_name]->abstract) - ) { - continue; - } - } - - $storage->declaring_method_ids[$aliased_method_name] = $declaring_method_id; - $storage->inheritable_method_ids[$aliased_method_name] = $declaring_method_id; - } - } - } - - private function inheritPropertiesFromParent( - ClassLikeStorage $storage, - ClassLikeStorage $parent_storage - ): void { - if ($parent_storage->sealed_properties) { - $storage->sealed_properties = true; - } - - // register where they appear (can never be in a trait) - foreach ($parent_storage->appearing_property_ids as $property_name => $appearing_property_id) { - if (isset($storage->appearing_property_ids[$property_name])) { - continue; - } - - if (!$parent_storage->is_trait - && isset($parent_storage->properties[$property_name]) - && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE - ) { - continue; - } - - $implemented_property_id = $storage->name . '::$' . $property_name; - - $storage->appearing_property_ids[$property_name] = - $parent_storage->is_trait ? $implemented_property_id : $appearing_property_id; - } - - // register where they're declared - foreach ($parent_storage->declaring_property_ids as $property_name => $declaring_property_class) { - if (isset($storage->declaring_property_ids[$property_name])) { - continue; - } - - if (!$parent_storage->is_trait - && isset($parent_storage->properties[$property_name]) - && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE - ) { - continue; - } - - $storage->declaring_property_ids[$property_name] = $declaring_property_class; - } - - // register where they're declared - foreach ($parent_storage->inheritable_property_ids as $property_name => $inheritable_property_id) { - if (!$parent_storage->is_trait - && isset($parent_storage->properties[$property_name]) - && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE - ) { - continue; - } - - if (!$parent_storage->is_trait) { - $storage->overridden_property_ids[$property_name][] = $inheritable_property_id; - } - - $storage->inheritable_property_ids[$property_name] = $inheritable_property_id; - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php deleted file mode 100644 index 2a0137a5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php +++ /dev/null @@ -1,356 +0,0 @@ -classlike_storage_provider = $storage_provider; - $this->file_reference_provider = $file_reference_provider; - $this->property_existence_provider = new PropertyExistenceProvider(); - $this->property_visibility_provider = new PropertyVisibilityProvider(); - $this->property_type_provider = new PropertyTypeProvider(); - $this->classlikes = $classlikes; - } - - /** - * Whether or not a given property exists - * - */ - public function propertyExists( - string $property_id, - bool $read_mode, - ?StatementsSource $source = null, - ?Context $context = null, - ?CodeLocation $code_location = null - ): bool { - // remove trailing backslash if it exists - $property_id = preg_replace('/^\\\\/', '', $property_id); - - [$fq_class_name, $property_name] = explode('::$', $property_id); - $fq_class_name_lc = strtolower($fq_class_name); - - if ($this->property_existence_provider->has($fq_class_name)) { - $property_exists = $this->property_existence_provider->doesPropertyExist( - $fq_class_name, - $property_name, - $read_mode, - $source, - $context, - $code_location - ); - - if ($property_exists !== null) { - return $property_exists; - } - } - - $class_storage = $this->classlikes->getStorageFor($fq_class_name); - - if (!$class_storage) { - return false; - } - - if ($source - && $context - && $context->self !== $fq_class_name - && !$context->collect_initializations - && !$context->collect_mutations - ) { - if ($context->calling_method_id) { - $this->file_reference_provider->addMethodReferenceToClass( - $context->calling_method_id, - $fq_class_name_lc - ); - } else { - $this->file_reference_provider->addNonMethodReferenceToClass( - $source->getFilePath(), - $fq_class_name_lc - ); - } - } - - if (isset($class_storage->declaring_property_ids[$property_name])) { - $declaring_property_class = strtolower($class_storage->declaring_property_ids[$property_name]); - - if ($context && $context->calling_method_id) { - $this->file_reference_provider->addMethodReferenceToClassMember( - $context->calling_method_id, - $declaring_property_class . '::$' . $property_name, - false - ); - - if ($read_mode) { - $this->file_reference_provider->addMethodReferenceToClassProperty( - $context->calling_method_id, - $declaring_property_class . '::$' . $property_name - ); - } - } elseif ($source) { - $this->file_reference_provider->addFileReferenceToClassMember( - $source->getFilePath(), - $declaring_property_class . '::$' . $property_name, - false - ); - - if ($read_mode) { - $this->file_reference_provider->addFileReferenceToClassProperty( - $source->getFilePath(), - $declaring_property_class . '::$' . $property_name - ); - } - } - - if ($this->collect_locations && $code_location) { - $this->file_reference_provider->addCallingLocationForClassProperty( - $code_location, - $declaring_property_class . '::$' . $property_name - ); - } - - return true; - } - - if ($context && $context->calling_method_id) { - $this->file_reference_provider->addMethodReferenceToMissingClassMember( - $context->calling_method_id, - $fq_class_name_lc . '::$' . $property_name - ); - } elseif ($source) { - $this->file_reference_provider->addFileReferenceToMissingClassMember( - $source->getFilePath(), - $fq_class_name_lc . '::$' . $property_name - ); - } - - return false; - } - - public function getDeclaringClassForProperty( - string $property_id, - bool $read_mode, - ?StatementsSource $source = null - ): ?string { - [$fq_class_name, $property_name] = explode('::$', $property_id); - - if ($this->property_existence_provider->has($fq_class_name)) { - if ($this->property_existence_provider->doesPropertyExist( - $fq_class_name, - $property_name, - $read_mode, - $source, - null - )) { - return $fq_class_name; - } - } - - $class_storage = $this->classlikes->getStorageFor($fq_class_name); - - if ($class_storage && isset($class_storage->declaring_property_ids[$property_name])) { - return $class_storage->declaring_property_ids[$property_name]; - } - - return null; - } - - /** - * Get the class this property appears in (vs is declared in, which could give a trait) - */ - public function getAppearingClassForProperty( - string $property_id, - bool $read_mode, - ?StatementsSource $source = null - ): ?string { - [$fq_class_name, $property_name] = explode('::$', $property_id); - - if ($this->property_existence_provider->has($fq_class_name)) { - if ($this->property_existence_provider->doesPropertyExist( - $fq_class_name, - $property_name, - $read_mode, - $source, - null - )) { - return $fq_class_name; - } - } - - $class_storage = $this->classlikes->getStorageFor($fq_class_name); - - if ($class_storage && isset($class_storage->appearing_property_ids[$property_name])) { - $appearing_property_id = $class_storage->appearing_property_ids[$property_name]; - - return explode('::$', $appearing_property_id)[0]; - } - - return null; - } - - public function getStorage(string $property_id): PropertyStorage - { - // remove trailing backslash if it exists - $property_id = preg_replace('/^\\\\/', '', $property_id); - - [$fq_class_name, $property_name] = explode('::$', $property_id); - - $class_storage = $this->classlike_storage_provider->get($fq_class_name); - - if (isset($class_storage->declaring_property_ids[$property_name])) { - $declaring_property_class = $class_storage->declaring_property_ids[$property_name]; - $declaring_class_storage = $this->classlike_storage_provider->get($declaring_property_class); - - if (isset($declaring_class_storage->properties[$property_name])) { - return $declaring_class_storage->properties[$property_name]; - } - } - - throw new UnexpectedValueException('Property ' . $property_id . ' should exist'); - } - - public function hasStorage(string $property_id): bool - { - // remove trailing backslash if it exists - $property_id = preg_replace('/^\\\\/', '', $property_id); - - [$fq_class_name, $property_name] = explode('::$', $property_id); - - $class_storage = $this->classlike_storage_provider->get($fq_class_name); - - if (isset($class_storage->declaring_property_ids[$property_name])) { - $declaring_property_class = $class_storage->declaring_property_ids[$property_name]; - $declaring_class_storage = $this->classlike_storage_provider->get($declaring_property_class); - - return isset($declaring_class_storage->properties[$property_name]); - } - return false; - } - - public function getPropertyType( - string $property_id, - bool $property_set, - ?StatementsSource $source = null, - ?Context $context = null - ): ?Union { - // remove trailing backslash if it exists - $property_id = preg_replace('/^\\\\/', '', $property_id); - - [$fq_class_name, $property_name] = explode('::$', $property_id); - - if ($this->property_type_provider->has($fq_class_name)) { - $property_type = $this->property_type_provider->getPropertyType( - $fq_class_name, - $property_name, - !$property_set, - $source, - $context - ); - - if ($property_type !== null) { - return $property_type; - } - } - - $class_storage = $this->classlikes->getStorageFor($fq_class_name); - - if ($class_storage && isset($class_storage->declaring_property_ids[$property_name])) { - $declaring_property_class = $class_storage->declaring_property_ids[$property_name]; - $declaring_class_storage = $this->classlike_storage_provider->get($declaring_property_class); - - if (isset($declaring_class_storage->properties[$property_name])) { - $storage = $declaring_class_storage->properties[$property_name]; - } else { - throw new UnexpectedValueException('Property ' . $property_id . ' should exist'); - } - } else { - throw new UnexpectedValueException('Property ' . $property_id . ' should exist'); - } - - if ($storage->type) { - if ($property_set) { - if (isset($class_storage->pseudo_property_set_types[$property_name])) { - return $class_storage->pseudo_property_set_types[$property_name]; - } - } else { - if (isset($class_storage->pseudo_property_get_types[$property_name])) { - return $class_storage->pseudo_property_get_types[$property_name]; - } - } - - return $storage->type; - } - - if (!isset($class_storage->overridden_property_ids[$property_name])) { - return null; - } - - foreach ($class_storage->overridden_property_ids[$property_name] as $overridden_property_id) { - $overridden_storage = $this->getStorage($overridden_property_id); - - if ($overridden_storage->type) { - return $overridden_storage->type; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php deleted file mode 100644 index 2b0029a6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php +++ /dev/null @@ -1,46 +0,0 @@ ->|null - */ - private static $property_map; - - /** - * Gets the method/function call map - * - * @return array> - */ - public static function getPropertyMap(): array - { - if (self::$property_map !== null) { - return self::$property_map; - } - - /** @var array> */ - $property_map = require(dirname(__DIR__, 4) . '/dictionaries/PropertyMap.php'); - - self::$property_map = []; - - foreach ($property_map as $key => $value) { - $cased_key = strtolower($key); - self::$property_map[$cased_key] = $value; - } - - return self::$property_map; - } - - public static function inPropertyMap(string $class_name): bool - { - return isset(self::getPropertyMap()[strtolower($class_name)]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php deleted file mode 100644 index 80a6ad20..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php +++ /dev/null @@ -1,61 +0,0 @@ - - */ - public static function getReferenceMap( - ClassLikeStorageProvider $classlike_storage_provider, - array $expected_references - ): array { - $reference_dictionary = []; - - foreach ($classlike_storage_provider->getAll() as $storage) { - if (!$storage->location) { - continue; - } - - $fq_classlike_name = $storage->name; - - if (isset($expected_references[$fq_classlike_name])) { - $reference_dictionary[$fq_classlike_name] - = $storage->location->file_name - . ':' . $storage->location->getLineNumber() - . ':' . $storage->location->getColumn(); - } - - foreach ($storage->methods as $method_name => $method_storage) { - if (!$method_storage->location) { - continue; - } - - if (isset($expected_references[$fq_classlike_name . '::' . $method_name . '()'])) { - $reference_dictionary[$fq_classlike_name . '::' . $method_name . '()'] - = $method_storage->location->file_name - . ':' . $method_storage->location->getLineNumber() - . ':' . $method_storage->location->getColumn(); - } - } - - foreach ($storage->properties as $property_name => $property_storage) { - if (!$property_storage->location) { - continue; - } - - if (isset($expected_references[$fq_classlike_name . '::$' . $property_name])) { - $reference_dictionary[$fq_classlike_name . '::$' . $property_name] - = $property_storage->location->file_name - . ':' . $property_storage->location->getLineNumber() - . ':' . $property_storage->location->getColumn(); - } - } - } - - return $reference_dictionary; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php deleted file mode 100644 index 8a50103b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php +++ /dev/null @@ -1,548 +0,0 @@ - - */ - private static $builtin_functions = []; - - public function __construct(ClassLikeStorageProvider $storage_provider, Codebase $codebase) - { - $this->storage_provider = $storage_provider; - $this->codebase = $codebase; - self::$builtin_functions = []; - } - - public function registerClass(ReflectionClass $reflected_class): void - { - $class_name = $reflected_class->name; - - if ($class_name === 'LibXMLError') { - $class_name = 'libXMLError'; - } - - $class_name_lower = strtolower($class_name); - - try { - $this->storage_provider->get($class_name_lower); - - return; - } catch (Exception $e) { - // this is fine - } - - $reflected_parent_class = $reflected_class->getParentClass(); - - $storage = $this->storage_provider->create($class_name); - $storage->abstract = $reflected_class->isAbstract(); - $storage->is_interface = $reflected_class->isInterface(); - - $storage->potential_declaring_method_ids['__construct'][$class_name_lower . '::__construct'] = true; - - if ($reflected_parent_class) { - $parent_class_name = $reflected_parent_class->getName(); - $this->registerClass($reflected_parent_class); - $parent_class_name_lc = strtolower($parent_class_name); - - $parent_storage = $this->storage_provider->get($parent_class_name_lc); - - $this->registerInheritedMethods($class_name_lower, $parent_class_name_lc); - $this->registerInheritedProperties($class_name_lower, $parent_class_name_lc); - - $storage->class_implements = $parent_storage->class_implements; - - $storage->constants = $parent_storage->constants; - - $storage->parent_classes = array_merge( - [$parent_class_name_lc => $parent_class_name], - $parent_storage->parent_classes - ); - - $storage->used_traits = $parent_storage->used_traits; - } - - $class_properties = $reflected_class->getProperties(); - - $public_mapped_properties = PropertyMap::inPropertyMap($class_name) - ? PropertyMap::getPropertyMap()[strtolower($class_name)] - : []; - - foreach ($class_properties as $class_property) { - $property_name = $class_property->getName(); - $storage->properties[$property_name] = new PropertyStorage(); - - $storage->properties[$property_name]->type = Type::getMixed(); - - if ($class_property->isStatic()) { - $storage->properties[$property_name]->is_static = true; - } - - if ($class_property->isPublic()) { - $storage->properties[$property_name]->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; - } elseif ($class_property->isProtected()) { - $storage->properties[$property_name]->visibility = ClassLikeAnalyzer::VISIBILITY_PROTECTED; - } elseif ($class_property->isPrivate()) { - $storage->properties[$property_name]->visibility = ClassLikeAnalyzer::VISIBILITY_PRIVATE; - } - - $property_id = $class_property->class . '::$' . $property_name; - - $storage->declaring_property_ids[$property_name] = $class_property->class; - $storage->appearing_property_ids[$property_name] = $property_id; - - if (!$class_property->isPrivate()) { - $storage->inheritable_property_ids[$property_name] = $property_id; - } - } - - // have to do this separately as there can be new properties here - foreach ($public_mapped_properties as $property_name => $type_string) { - $property_id = $class_name . '::$' . $property_name; - - if (!isset($storage->properties[$property_name])) { - $storage->properties[$property_name] = new PropertyStorage(); - $storage->properties[$property_name]->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; - - $storage->declaring_property_ids[$property_name] = $class_name; - $storage->appearing_property_ids[$property_name] = $property_id; - $storage->inheritable_property_ids[$property_name] = $property_id; - } - - $type = Type::parseString($type_string); - - if ($property_id === 'DateInterval::$days') { - $type->ignore_falsable_issues = true; - } - - $storage->properties[$property_name]->type = $type; - } - - /** @var array */ - $class_constants = $reflected_class->getConstants(); - - foreach ($class_constants as $name => $value) { - $storage->constants[$name] = new ClassConstantStorage( - ClassLikeAnalyzer::getTypeFromValue($value), - ClassLikeAnalyzer::VISIBILITY_PUBLIC, - null - ); - } - - if ($reflected_class->isInterface()) { - $this->codebase->classlikes->addFullyQualifiedInterfaceName($class_name); - } elseif ($reflected_class->isTrait()) { - $this->codebase->classlikes->addFullyQualifiedTraitName($class_name); - } else { - $this->codebase->classlikes->addFullyQualifiedClassName($class_name); - } - - $reflection_methods = $reflected_class->getMethods( - (ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED) - ); - - if ($class_name_lower === 'generator') { - $storage->template_types = [ - 'TKey' => ['Generator' => Type::getMixed()], - 'TValue' => ['Generator' => Type::getMixed()], - ]; - } - - $interfaces = $reflected_class->getInterfaces(); - - foreach ($interfaces as $interface) { - $interface_name = $interface->getName(); - $this->registerClass($interface); - - if ($reflected_class->isInterface()) { - $storage->parent_interfaces[strtolower($interface_name)] = $interface_name; - } else { - $storage->class_implements[strtolower($interface_name)] = $interface_name; - } - } - - foreach ($reflection_methods as $reflection_method) { - $method_reflection_class = $reflection_method->getDeclaringClass(); - - $this->registerClass($method_reflection_class); - - $this->extractReflectionMethodInfo($reflection_method); - - if ($reflection_method->class !== $class_name - && ($class_name !== 'SoapFault' || $reflection_method->name !== '__construct') - ) { - $reflection_method_name = strtolower($reflection_method->name); - $reflection_method_class = $reflection_method->class; - - $this->codebase->methods->setDeclaringMethodId( - $class_name, - $reflection_method_name, - $reflection_method_class, - $reflection_method_name - ); - - $this->codebase->methods->setAppearingMethodId( - $class_name, - $reflection_method_name, - $reflection_method_class, - $reflection_method_name - ); - } - } - } - - public function extractReflectionMethodInfo(ReflectionMethod $method): void - { - $method_name_lc = strtolower($method->getName()); - - $fq_class_name = $method->class; - - $fq_class_name_lc = strtolower($fq_class_name); - - $class_storage = $this->storage_provider->get($fq_class_name_lc); - - if (isset($class_storage->methods[$method_name_lc])) { - return; - } - - $method_id = $method->class . '::' . $method_name_lc; - - $storage = $class_storage->methods[$method_name_lc] = new MethodStorage(); - - $storage->cased_name = $method->name; - $storage->defining_fqcln = $method->class; - - if ($method_name_lc === $fq_class_name_lc) { - $this->codebase->methods->setDeclaringMethodId( - $fq_class_name, - '__construct', - $fq_class_name, - $method_name_lc - ); - $this->codebase->methods->setAppearingMethodId( - $fq_class_name, - '__construct', - $fq_class_name, - $method_name_lc - ); - } - - $declaring_class = $method->getDeclaringClass(); - - $storage->is_static = $method->isStatic(); - $storage->abstract = $method->isAbstract(); - $storage->mutation_free = $storage->external_mutation_free - = ($method_name_lc === '__construct' && $fq_class_name_lc === 'datetimezone'); - - $class_storage->declaring_method_ids[$method_name_lc] = new MethodIdentifier( - $declaring_class->name, - $method_name_lc - ); - - $class_storage->inheritable_method_ids[$method_name_lc] - = $class_storage->declaring_method_ids[$method_name_lc]; - $class_storage->appearing_method_ids[$method_name_lc] - = $class_storage->declaring_method_ids[$method_name_lc]; - $class_storage->overridden_method_ids[$method_name_lc] = []; - - $storage->visibility = $method->isPrivate() - ? ClassLikeAnalyzer::VISIBILITY_PRIVATE - : ($method->isProtected() ? ClassLikeAnalyzer::VISIBILITY_PROTECTED : ClassLikeAnalyzer::VISIBILITY_PUBLIC); - - $callables = InternalCallMapHandler::getCallablesFromCallMap($method_id); - - if ($callables && $callables[0]->params !== null && $callables[0]->return_type !== null) { - $storage->setParams([]); - - foreach ($callables[0]->params as $param) { - if ($param->type) { - $param->type->queueClassLikesForScanning($this->codebase); - } - } - - $storage->setParams($callables[0]->params); - - $storage->return_type = $callables[0]->return_type; - $storage->return_type->queueClassLikesForScanning($this->codebase); - } else { - $params = $method->getParameters(); - - $storage->setParams([]); - - foreach ($params as $param) { - $param_array = $this->getReflectionParamData($param); - $storage->addParam($param_array); - } - } - - $storage->required_param_count = 0; - - foreach ($storage->params as $i => $param) { - if (!$param->is_optional && !$param->is_variadic) { - $storage->required_param_count = $i + 1; - } - } - } - - private function getReflectionParamData(ReflectionParameter $param): FunctionLikeParameter - { - $param_type = self::getPsalmTypeFromReflectionType($param->getType()); - $param_name = $param->getName(); - - $is_optional = $param->isOptional(); - - $parameter = new FunctionLikeParameter( - $param_name, - $param->isPassedByReference(), - $param_type, - null, - null, - $is_optional, - $param_type->isNullable(), - $param->isVariadic() - ); - - $parameter->signature_type = Type::getMixed(); - - return $parameter; - } - - /** - * @param callable-string $function_id - * - * @return false|null - */ - public function registerFunction(string $function_id): ?bool - { - try { - $reflection_function = new ReflectionFunction($function_id); - - $callmap_callable = null; - - if (isset(self::$builtin_functions[$function_id])) { - return null; - } - - $storage = self::$builtin_functions[$function_id] = new FunctionStorage(); - - if (InternalCallMapHandler::inCallMap($function_id)) { - $callmap_callable = InternalCallMapHandler::getCallableFromCallMapById( - $this->codebase, - $function_id, - [], - null - ); - } - - if ($callmap_callable !== null - && $callmap_callable->params !== null - && $callmap_callable->return_type !== null - ) { - $storage->setParams($callmap_callable->params); - $storage->return_type = $callmap_callable->return_type; - } else { - $reflection_params = $reflection_function->getParameters(); - - foreach ($reflection_params as $param) { - $param_obj = $this->getReflectionParamData($param); - $storage->addParam($param_obj); - } - - if ($reflection_return_type = $reflection_function->getReturnType()) { - $storage->return_type = self::getPsalmTypeFromReflectionType($reflection_return_type); - } - } - - $storage->pure = true; - - $storage->required_param_count = 0; - - foreach ($storage->params as $i => $param) { - if (!$param->is_optional && !$param->is_variadic) { - $storage->required_param_count = $i + 1; - } - } - - $storage->cased_name = $reflection_function->getName(); - } catch (ReflectionException $e) { - return false; - } - - return null; - } - - public static function getPsalmTypeFromReflectionType(?ReflectionType $reflection_type = null): Union - { - if (!$reflection_type) { - return Type::getMixed(); - } - - if ($reflection_type instanceof ReflectionNamedType) { - $type = $reflection_type->getName(); - } elseif ($reflection_type instanceof ReflectionUnionType) { - /** @psalm-suppress MixedArgument */ - $type = implode( - '|', - array_map( - function (ReflectionNamedType $reflection) { - return $reflection->getName(); - }, - $reflection_type->getTypes() - ) - ); - } else { - throw new LogicException('Unexpected reflection class ' . get_class($reflection_type) . ' found.'); - } - - if ($reflection_type->allowsNull()) { - $type .= '|null'; - } - - return Type::parseString($type); - } - - private function registerInheritedMethods( - string $fq_class_name, - string $parent_class - ): void { - $parent_storage = $this->storage_provider->get($parent_class); - $storage = $this->storage_provider->get($fq_class_name); - - // register where they appear (can never be in a trait) - foreach ($parent_storage->appearing_method_ids as $method_name => $appearing_method_id) { - $storage->appearing_method_ids[$method_name] = $appearing_method_id; - } - - // register where they're declared - foreach ($parent_storage->inheritable_method_ids as $method_name => $declaring_method_id) { - $storage->declaring_method_ids[$method_name] = $declaring_method_id; - $storage->inheritable_method_ids[$method_name] = $declaring_method_id; - - $storage->overridden_method_ids[$method_name][$declaring_method_id->fq_class_name] - = $declaring_method_id; - } - } - - /** - * @param lowercase-string $fq_class_name - * @param lowercase-string $parent_class - * - */ - private function registerInheritedProperties( - string $fq_class_name, - string $parent_class - ): void { - $parent_storage = $this->storage_provider->get($parent_class); - $storage = $this->storage_provider->get($fq_class_name); - - // register where they appear (can never be in a trait) - foreach ($parent_storage->appearing_property_ids as $property_name => $appearing_property_id) { - if (!$parent_storage->is_trait - && isset($parent_storage->properties[$property_name]) - && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE - ) { - continue; - } - - $storage->appearing_property_ids[$property_name] = $appearing_property_id; - } - - // register where they're declared - foreach ($parent_storage->declaring_property_ids as $property_name => $declaring_property_class) { - if (!$parent_storage->is_trait - && isset($parent_storage->properties[$property_name]) - && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE - ) { - continue; - } - - $storage->declaring_property_ids[$property_name] = strtolower($declaring_property_class); - } - - // register where they're declared - foreach ($parent_storage->inheritable_property_ids as $property_name => $inheritable_property_id) { - if (!$parent_storage->is_trait - && isset($parent_storage->properties[$property_name]) - && $parent_storage->properties[$property_name]->visibility === ClassLikeAnalyzer::VISIBILITY_PRIVATE - ) { - continue; - } - - $storage->inheritable_property_ids[$property_name] = $inheritable_property_id; - } - } - - public function hasFunction(string $function_id): bool - { - return isset(self::$builtin_functions[$function_id]); - } - - public function getFunctionStorage(string $function_id): FunctionStorage - { - if (isset(self::$builtin_functions[$function_id])) { - return self::$builtin_functions[$function_id]; - } - - throw new UnexpectedValueException('Expecting to have a function for ' . $function_id); - } - - /** - * @return array - */ - public function getFunctions(): array - { - return self::$builtin_functions; - } - - public static function clearCache(): void - { - self::$builtin_functions = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php deleted file mode 100644 index fb6e1bf5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php +++ /dev/null @@ -1,811 +0,0 @@ -, - * array, - * array, - * array, - * array, - * array, - * array, - * array, - * array - * } - * - * @psalm-type PoolData = array{ - * classlikes_data:array{ - * array, - * array, - * array, - * array, - * array, - * array, - * array, - * array, - * array - * }, - * scanner_data: ThreadData, - * issues:array>, - * changed_members:array>, - * unchanged_signature_members:array>, - * diff_map:array>, - * deletion_ranges:array>, - * errors:array, - * classlike_storage:array, - * file_storage:array, - * new_file_content_hashes: array, - * taint_data: ?TaintFlowGraph - * } - */ - -/** - * @internal - * - * Contains methods that aid in the scanning of Psalm's codebase - */ -class Scanner -{ - /** - * @var Codebase - */ - private $codebase; - - /** - * @var array - */ - private $classlike_files = []; - - /** - * @var array - */ - private $deep_scanned_classlike_files = []; - - /** - * @var array - */ - private $files_to_scan = []; - - /** - * @var array - */ - private $classes_to_scan = []; - - /** - * @var array - */ - private $classes_to_deep_scan = []; - - /** - * @var array - */ - private $files_to_deep_scan = []; - - /** - * @var array - */ - private $scanned_files = []; - - /** - * @var array - */ - private $store_scan_failure = []; - - /** - * @var array - */ - private $reflected_classlikes_lc = []; - - /** - * @var Reflection - */ - private $reflection; - - /** - * @var Config - */ - private $config; - - /** - * @var Progress - */ - private $progress; - - /** - * @var FileStorageProvider - */ - private $file_storage_provider; - - /** - * @var FileProvider - */ - private $file_provider; - - /** - * @var FileReferenceProvider - */ - private $file_reference_provider; - - /** - * @var bool - */ - private $is_forked = false; - - public function __construct( - Codebase $codebase, - Config $config, - FileStorageProvider $file_storage_provider, - FileProvider $file_provider, - Reflection $reflection, - FileReferenceProvider $file_reference_provider, - Progress $progress - ) { - $this->codebase = $codebase; - $this->reflection = $reflection; - $this->file_provider = $file_provider; - $this->progress = $progress; - $this->file_storage_provider = $file_storage_provider; - $this->config = $config; - $this->file_reference_provider = $file_reference_provider; - } - - /** - * @param array $files_to_scan - * - */ - public function addFilesToShallowScan(array $files_to_scan): void - { - $this->files_to_scan += $files_to_scan; - } - - /** - * @param array $files_to_scan - */ - public function addFilesToDeepScan(array $files_to_scan): void - { - $this->files_to_scan += $files_to_scan; - $this->files_to_deep_scan += $files_to_scan; - } - - public function addFileToShallowScan(string $file_path): void - { - $this->files_to_scan[$file_path] = $file_path; - } - - public function addFileToDeepScan(string $file_path): void - { - $this->files_to_scan[$file_path] = $file_path; - $this->files_to_deep_scan[$file_path] = $file_path; - } - - public function removeFile(string $file_path): void - { - unset($this->scanned_files[$file_path]); - } - - public function removeClassLike(string $fq_classlike_name_lc): void - { - unset( - $this->classlike_files[$fq_classlike_name_lc], - $this->deep_scanned_classlike_files[$fq_classlike_name_lc] - ); - } - - public function setClassLikeFilePath(string $fq_classlike_name_lc, string $file_path): void - { - $this->classlike_files[$fq_classlike_name_lc] = $file_path; - } - - public function getClassLikeFilePath(string $fq_classlike_name_lc): string - { - if (!isset($this->classlike_files[$fq_classlike_name_lc])) { - throw new UnexpectedValueException('Could not find file for ' . $fq_classlike_name_lc); - } - - return $this->classlike_files[$fq_classlike_name_lc]; - } - - /** - * @param array $phantom_classes - */ - public function queueClassLikeForScanning( - string $fq_classlike_name, - bool $analyze_too = false, - bool $store_failure = true, - array $phantom_classes = [] - ): void { - if ($fq_classlike_name[0] === '\\') { - $fq_classlike_name = substr($fq_classlike_name, 1); - } - - $fq_classlike_name_lc = strtolower($fq_classlike_name); - - if ($fq_classlike_name_lc === 'static') { - return; - } - - // avoid checking classes that we know will just end in failure - if ($fq_classlike_name_lc === 'null' || substr($fq_classlike_name_lc, -5) === '\null') { - return; - } - - if (!isset($this->classlike_files[$fq_classlike_name_lc]) - || ($analyze_too && !isset($this->deep_scanned_classlike_files[$fq_classlike_name_lc])) - ) { - if (!isset($this->classes_to_scan[$fq_classlike_name_lc]) || $store_failure) { - $this->classes_to_scan[$fq_classlike_name_lc] = $fq_classlike_name; - } - - if ($analyze_too) { - $this->classes_to_deep_scan[$fq_classlike_name_lc] = true; - } - - $this->store_scan_failure[$fq_classlike_name] = $store_failure; - - if (PropertyMap::inPropertyMap($fq_classlike_name_lc)) { - $public_mapped_properties = PropertyMap::getPropertyMap()[$fq_classlike_name_lc]; - - foreach ($public_mapped_properties as $public_mapped_property) { - $property_type = Type::parseString($public_mapped_property); - $property_type->queueClassLikesForScanning( - $this->codebase, - null, - $phantom_classes + [$fq_classlike_name_lc => true] - ); - } - } - } - } - - public function scanFiles(ClassLikes $classlikes, int $pool_size = 1): bool - { - $has_changes = false; - while ($this->files_to_scan || $this->classes_to_scan) { - if ($this->files_to_scan) { - if ($this->scanFilePaths($pool_size)) { - $has_changes = true; - } - } else { - $this->convertClassesToFilePaths($classlikes); - } - } - - return $has_changes; - } - - private function scanFilePaths(int $pool_size): bool - { - $filetype_scanners = $this->config->getFiletypeScanners(); - $files_to_scan = array_filter( - $this->files_to_scan, - function (string $file_path): bool { - return $this->file_provider->fileExists($file_path) - && (!isset($this->scanned_files[$file_path]) - || (isset($this->files_to_deep_scan[$file_path]) && !$this->scanned_files[$file_path])); - } - ); - - $this->files_to_scan = []; - - if (!$files_to_scan) { - return false; - } - - $files_to_deep_scan = $this->files_to_deep_scan; - - $scanner_worker = - function (int $_, string $file_path) use ($filetype_scanners, $files_to_deep_scan): void { - $this->scanFile( - $file_path, - $filetype_scanners, - isset($files_to_deep_scan[$file_path]) - ); - }; - - if (!$this->is_forked && $pool_size > 1 && count($files_to_scan) > 512) { - $pool_size = ceil(min($pool_size, count($files_to_scan) / 256)); - } else { - $pool_size = 1; - } - - if ($pool_size > 1) { - $process_file_paths = []; - - $i = 0; - - foreach ($files_to_scan as $file_path) { - $process_file_paths[$i % $pool_size][] = $file_path; - ++$i; - } - - $this->progress->debug('Forking process for scanning' . PHP_EOL); - - // Run scanning one file at a time, splitting the set of - // files up among a given number of child processes. - $pool = new Pool( - $this->config, - $process_file_paths, - function (): void { - $this->progress->debug('Initialising forked process for scanning' . PHP_EOL); - - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - $statements_provider = $codebase->statements_provider; - - $codebase->scanner->isForked(); - FileStorageProvider::deleteAll(); - ClassLikeStorageProvider::deleteAll(); - - $statements_provider->resetDiffs(); - - $this->progress->debug('Have initialised forked process for scanning' . PHP_EOL); - }, - $scanner_worker, - /** - * @return PoolData - */ - function () { - $this->progress->debug('Collecting data from forked scanner process' . PHP_EOL); - - $project_analyzer = ProjectAnalyzer::getInstance(); - $codebase = $project_analyzer->getCodebase(); - $statements_provider = $codebase->statements_provider; - - return [ - 'classlikes_data' => $codebase->classlikes->getThreadData(), - 'scanner_data' => $codebase->scanner->getThreadData(), - 'issues' => IssueBuffer::getIssuesData(), - 'changed_members' => $statements_provider->getChangedMembers(), - 'unchanged_signature_members' => $statements_provider->getUnchangedSignatureMembers(), - 'diff_map' => $statements_provider->getDiffMap(), - 'deletion_ranges' => $statements_provider->getDeletionRanges(), - 'errors' => $statements_provider->getErrors(), - 'classlike_storage' => $codebase->classlike_storage_provider->getAll(), - 'file_storage' => $codebase->file_storage_provider->getAll(), - 'new_file_content_hashes' => $statements_provider->parser_cache_provider - ? $statements_provider->parser_cache_provider->getNewFileContentHashes() - : [], - 'taint_data' => $codebase->taint_flow_graph, - ]; - } - ); - - // Wait for all tasks to complete and collect the results. - /** - * @var array - */ - $forked_pool_data = $pool->wait(); - - foreach ($forked_pool_data as $pool_data) { - IssueBuffer::addIssues($pool_data['issues']); - - $this->codebase->statements_provider->addChangedMembers( - $pool_data['changed_members'] - ); - $this->codebase->statements_provider->addUnchangedSignatureMembers( - $pool_data['unchanged_signature_members'] - ); - $this->codebase->statements_provider->addDiffMap( - $pool_data['diff_map'] - ); - $this->codebase->statements_provider->addDeletionRanges( - $pool_data['deletion_ranges'] - ); - $this->codebase->statements_provider->addErrors($pool_data['errors']); - - if ($this->codebase->taint_flow_graph && $pool_data['taint_data']) { - $this->codebase->taint_flow_graph->addGraph($pool_data['taint_data']); - } - - $this->codebase->file_storage_provider->addMore($pool_data['file_storage']); - $this->codebase->classlike_storage_provider->addMore($pool_data['classlike_storage']); - - $this->codebase->classlikes->addThreadData($pool_data['classlikes_data']); - - $this->addThreadData($pool_data['scanner_data']); - - if ($this->codebase->statements_provider->parser_cache_provider) { - $this->codebase->statements_provider->parser_cache_provider->addNewFileContentHashes( - $pool_data['new_file_content_hashes'] - ); - } - } - - if ($pool->didHaveError()) { - exit(1); - } - } else { - $i = 0; - - foreach ($files_to_scan as $file_path => $_) { - $scanner_worker($i, $file_path); - ++$i; - } - } - - if ($this->codebase->statements_provider->parser_cache_provider) { - $this->codebase->statements_provider->parser_cache_provider->saveFileContentHashes(); - } - - foreach ($files_to_scan as $scanned_file) { - if ($this->config->hasStubFile($scanned_file)) { - $file_storage = $this->file_storage_provider->get($scanned_file); - - foreach ($file_storage->functions as $function_storage) { - if ($function_storage->cased_name - && !$this->codebase->functions->hasStubbedFunction($function_storage->cased_name) - ) { - $this->codebase->functions->addGlobalFunction( - $function_storage->cased_name, - $function_storage - ); - } - } - - foreach ($file_storage->constants as $name => $type) { - $this->codebase->addGlobalConstantType($name, $type); - } - } - } - - $this->file_reference_provider->addClassLikeFiles($this->classlike_files); - - return true; - } - - private function convertClassesToFilePaths(ClassLikes $classlikes): void - { - $classes_to_scan = $this->classes_to_scan; - - $this->classes_to_scan = []; - - foreach ($classes_to_scan as $fq_classlike_name) { - $fq_classlike_name_lc = strtolower($fq_classlike_name); - - if (isset($this->reflected_classlikes_lc[$fq_classlike_name_lc])) { - continue; - } - - if ($classlikes->isMissingClassLike($fq_classlike_name_lc)) { - continue; - } - - if (!isset($this->classlike_files[$fq_classlike_name_lc])) { - if ($classlikes->doesClassLikeExist($fq_classlike_name_lc)) { - if ($fq_classlike_name_lc === 'self') { - continue; - } - - $this->progress->debug('Using reflection to get metadata for ' . $fq_classlike_name . "\n"); - - /** @psalm-suppress ArgumentTypeCoercion */ - $reflected_class = new ReflectionClass($fq_classlike_name); - $this->reflection->registerClass($reflected_class); - $this->reflected_classlikes_lc[$fq_classlike_name_lc] = true; - } elseif ($this->fileExistsForClassLike($classlikes, $fq_classlike_name)) { - $fq_classlike_name_lc = strtolower($classlikes->getUnAliasedName( - $fq_classlike_name_lc - )); - - // even though we've checked this above, calling the method invalidates it - if (isset($this->classlike_files[$fq_classlike_name_lc])) { - $file_path = $this->classlike_files[$fq_classlike_name_lc]; - $this->files_to_scan[$file_path] = $file_path; - if (isset($this->classes_to_deep_scan[$fq_classlike_name_lc])) { - unset($this->classes_to_deep_scan[$fq_classlike_name_lc]); - $this->files_to_deep_scan[$file_path] = $file_path; - } - } - } elseif ($this->store_scan_failure[$fq_classlike_name]) { - $classlikes->registerMissingClassLike($fq_classlike_name_lc); - } - } elseif (isset($this->classes_to_deep_scan[$fq_classlike_name_lc]) - && !isset($this->deep_scanned_classlike_files[$fq_classlike_name_lc]) - ) { - $file_path = $this->classlike_files[$fq_classlike_name_lc]; - $this->files_to_scan[$file_path] = $file_path; - unset($this->classes_to_deep_scan[$fq_classlike_name_lc]); - $this->files_to_deep_scan[$file_path] = $file_path; - $this->deep_scanned_classlike_files[$fq_classlike_name_lc] = true; - } - } - } - - /** - * @param array> $filetype_scanners - */ - private function scanFile( - string $file_path, - array $filetype_scanners, - bool $will_analyze = false - ): void { - $file_scanner = $this->getScannerForPath($file_path, $filetype_scanners, $will_analyze); - - if (isset($this->scanned_files[$file_path]) - && (!$will_analyze || $this->scanned_files[$file_path]) - ) { - throw new UnexpectedValueException('Should not be rescanning ' . $file_path); - } - - if (!$this->file_provider->fileExists($file_path) && $this->config->mustBeIgnored($file_path)) { - // this should not happen, but might if the file was temporary - return; - } - - $file_contents = $this->file_provider->getContents($file_path); - - $from_cache = $this->file_storage_provider->has($file_path, $file_contents); - - if (!$from_cache) { - $this->file_storage_provider->create($file_path); - } - - $this->scanned_files[$file_path] = $will_analyze; - - $file_storage = $this->file_storage_provider->get($file_path); - - $file_scanner->scan( - $this->codebase, - $file_storage, - $from_cache, - $this->progress - ); - - if (!$from_cache) { - if (!$file_storage->has_visitor_issues && $this->file_storage_provider->cache) { - $this->file_storage_provider->cache->writeToCache($file_storage, $file_contents); - } - } else { - $this->codebase->statements_provider->setUnchangedFile($file_path); - - foreach ($file_storage->required_file_paths as $required_file_path) { - if ($will_analyze) { - $this->addFileToDeepScan($required_file_path); - } else { - $this->addFileToShallowScan($required_file_path); - } - } - - foreach ($file_storage->classlikes_in_file as $fq_classlike_name) { - $this->codebase->exhumeClassLikeStorage(strtolower($fq_classlike_name), $file_path); - } - - foreach ($file_storage->required_classes as $fq_classlike_name) { - $this->queueClassLikeForScanning($fq_classlike_name, $will_analyze, false); - } - - foreach ($file_storage->required_interfaces as $fq_classlike_name) { - $this->queueClassLikeForScanning($fq_classlike_name, false, false); - } - - foreach ($file_storage->referenced_classlikes as $fq_classlike_name) { - $this->queueClassLikeForScanning($fq_classlike_name, false, false); - } - - if ($this->codebase->register_autoload_files) { - foreach ($file_storage->functions as $function_storage) { - if ($function_storage->cased_name - && !$this->codebase->functions->hasStubbedFunction($function_storage->cased_name) - ) { - $this->codebase->functions->addGlobalFunction( - $function_storage->cased_name, - $function_storage - ); - } - } - - foreach ($file_storage->constants as $name => $type) { - $this->codebase->addGlobalConstantType($name, $type); - } - } - - foreach ($file_storage->classlike_aliases as $aliased_name => $unaliased_name) { - $this->codebase->classlikes->addClassAlias($unaliased_name, $aliased_name); - } - } - } - - /** - * @param array> $filetype_scanners - */ - private function getScannerForPath( - string $file_path, - array $filetype_scanners, - bool $will_analyze = false - ): FileScanner { - $path_parts = explode(DIRECTORY_SEPARATOR, $file_path); - $file_name_parts = explode('.', array_pop($path_parts)); - $extension = count($file_name_parts) > 1 ? array_pop($file_name_parts) : null; - - $file_name = $this->config->shortenFileName($file_path); - - if (isset($filetype_scanners[$extension])) { - return new $filetype_scanners[$extension]($file_path, $file_name, $will_analyze); - } - - return new FileScanner($file_path, $file_name, $will_analyze); - } - - /** - * @return array - */ - public function getScannedFiles(): array - { - return $this->scanned_files; - } - - /** - * Checks whether a class exists, and if it does then records what file it's in - * for later checking - */ - private function fileExistsForClassLike(ClassLikes $classlikes, string $fq_class_name): bool - { - $fq_class_name_lc = strtolower($fq_class_name); - - if (isset($this->classlike_files[$fq_class_name_lc])) { - return true; - } - - if ($fq_class_name === 'self') { - return false; - } - - $composer_file_path = $this->config->getComposerFilePathForClassLike($fq_class_name); - - if ($composer_file_path && file_exists($composer_file_path)) { - $this->progress->debug('Using composer to locate file for ' . $fq_class_name . "\n"); - - $classlikes->addFullyQualifiedClassLikeName( - $fq_class_name_lc, - realpath($composer_file_path) - ); - - return true; - } - - $reflected_class = ErrorHandler::runWithExceptionsSuppressed( - function () use ($fq_class_name): ?ReflectionClass { - $old_level = error_reporting(); - $this->progress->setErrorReporting(); - - try { - $this->progress->debug('Using reflection to locate file for ' . $fq_class_name . "\n"); - - /** @psalm-suppress ArgumentTypeCoercion */ - return new ReflectionClass($fq_class_name); - } catch (Throwable $e) { - // do not cache any results here (as case-sensitive filenames can screw things up) - - return null; - } finally { - error_reporting($old_level); - } - } - ); - - if (null === $reflected_class) { - return false; - } - - $file_path = (string)$reflected_class->getFileName(); - - // if the file was autoloaded but exists in evaled code only, return false - if (!file_exists($file_path)) { - return false; - } - - $new_fq_class_name = $reflected_class->getName(); - $new_fq_class_name_lc = strtolower($new_fq_class_name); - - if ($new_fq_class_name_lc !== $fq_class_name_lc) { - $classlikes->addClassAlias($new_fq_class_name, $fq_class_name_lc); - $fq_class_name_lc = $new_fq_class_name_lc; - } - - $fq_class_name = $new_fq_class_name; - $classlikes->addFullyQualifiedClassLikeName($fq_class_name_lc); - - if ($reflected_class->isInterface()) { - $classlikes->addFullyQualifiedInterfaceName($fq_class_name, $file_path); - } elseif ($reflected_class->isTrait()) { - $classlikes->addFullyQualifiedTraitName($fq_class_name, $file_path); - } else { - $classlikes->addFullyQualifiedClassName($fq_class_name, $file_path); - } - - return true; - } - - /** - * @return ThreadData - */ - public function getThreadData(): array - { - return [ - $this->files_to_scan, - $this->files_to_deep_scan, - $this->classes_to_scan, - $this->classes_to_deep_scan, - $this->store_scan_failure, - $this->classlike_files, - $this->deep_scanned_classlike_files, - $this->scanned_files, - $this->reflected_classlikes_lc, - ]; - } - - /** - * @param ThreadData $thread_data - * - */ - public function addThreadData(array $thread_data): void - { - [ - $files_to_scan, - $files_to_deep_scan, - $classes_to_scan, - $classes_to_deep_scan, - $store_scan_failure, - $classlike_files, - $deep_scanned_classlike_files, - $scanned_files, - $reflected_classlikes_lc - ] = $thread_data; - - $this->files_to_scan = array_merge($files_to_scan, $this->files_to_scan); - $this->files_to_deep_scan = array_merge($files_to_deep_scan, $this->files_to_deep_scan); - $this->classes_to_scan = array_merge($classes_to_scan, $this->classes_to_scan); - $this->classes_to_deep_scan = array_merge($classes_to_deep_scan, $this->classes_to_deep_scan); - $this->store_scan_failure = array_merge($store_scan_failure, $this->store_scan_failure); - $this->classlike_files = array_merge($classlike_files, $this->classlike_files); - $this->deep_scanned_classlike_files = array_merge( - $deep_scanned_classlike_files, - $this->deep_scanned_classlike_files - ); - $this->scanned_files = array_merge($scanned_files, $this->scanned_files); - $this->reflected_classlikes_lc = array_merge($reflected_classlikes_lc, $this->reflected_classlikes_lc); - } - - public function isForked(): void - { - $this->is_forked = true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php deleted file mode 100644 index 2812bb6a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php +++ /dev/null @@ -1,524 +0,0 @@ - */ - private $sources = []; - - /** @var array */ - private $nodes = []; - - /** @var array */ - private $sinks = []; - - /** @var array> */ - private $specialized_calls = []; - - /** @var array> */ - private $specializations = []; - - public function addNode(DataFlowNode $node): void - { - $this->nodes[$node->id] = $node; - - if ($node->unspecialized_id && $node->specialization_key) { - $this->specialized_calls[$node->specialization_key][$node->unspecialized_id] = true; - $this->specializations[$node->unspecialized_id][$node->specialization_key] = true; - } - } - - public function addSource(TaintSource $node): void - { - $this->sources[$node->id] = $node; - } - - public function addSink(TaintSink $node): void - { - $this->sinks[$node->id] = $node; - // in the rare case the sink is the _next_ node, this is necessary - $this->nodes[$node->id] = $node; - } - - public function addGraph(self $taint): void - { - $this->sources += $taint->sources; - $this->sinks += $taint->sinks; - $this->nodes += $taint->nodes; - $this->specialized_calls += $taint->specialized_calls; - - foreach ($taint->forward_edges as $key => $map) { - if (!isset($this->forward_edges[$key])) { - $this->forward_edges[$key] = $map; - } else { - $this->forward_edges[$key] += $map; - } - } - - foreach ($taint->specializations as $key => $map) { - if (!isset($this->specializations[$key])) { - $this->specializations[$key] = $map; - } else { - $this->specializations[$key] += $map; - } - } - } - - public function getPredecessorPath(DataFlowNode $source): string - { - $location_summary = ''; - - if ($source->code_location) { - $location_summary = $source->code_location->getShortSummary(); - } - - $source_descriptor = $source->label . ($location_summary ? ' (' . $location_summary . ')' : ''); - - $previous_source = $source->previous; - - if ($previous_source) { - if ($previous_source === $source) { - return ''; - } - - if ($source->code_location - && $previous_source->code_location - && $previous_source->code_location->getHash() === $source->code_location->getHash() - && $previous_source->previous - ) { - return $this->getPredecessorPath($previous_source->previous) . ' -> ' . $source_descriptor; - } - - return $this->getPredecessorPath($previous_source) . ' -> ' . $source_descriptor; - } - - return $source_descriptor; - } - - public function getSuccessorPath(DataFlowNode $sink): string - { - $location_summary = ''; - - if ($sink->code_location) { - $location_summary = $sink->code_location->getShortSummary(); - } - - $sink_descriptor = $sink->label . ($location_summary ? ' (' . $location_summary . ')' : ''); - - $next_sink = $sink->previous; - - if ($next_sink) { - if ($next_sink === $sink) { - return ''; - } - - if ($sink->code_location - && $next_sink->code_location - && $next_sink->code_location->getHash() === $sink->code_location->getHash() - && $next_sink->previous - ) { - return $sink_descriptor . ' -> ' . $this->getSuccessorPath($next_sink->previous); - } - - return $sink_descriptor . ' -> ' . $this->getSuccessorPath($next_sink); - } - - return $sink_descriptor; - } - - /** - * @return list - */ - public function getIssueTrace(DataFlowNode $source): array - { - $previous_source = $source->previous; - - $node = [ - 'location' => $source->code_location, - 'label' => $source->label, - 'entry_path_type' => end($source->path_types) ?: '' - ]; - - if ($previous_source) { - if ($previous_source === $source) { - return []; - } - - return array_merge($this->getIssueTrace($previous_source), [$node]); - } - - return [$node]; - } - - public function connectSinksAndSources(): void - { - $visited_source_ids = []; - - $sources = $this->sources; - $sinks = $this->sinks; - - ksort($this->specializations); - ksort($this->forward_edges); - - // reprocess resolved descendants up to a maximum nesting level of 40 - for ($i = 0; count($sinks) && count($sources) && $i < 40; $i++) { - $new_sources = []; - - ksort($sources); - - foreach ($sources as $source) { - $source_taints = $source->taints; - sort($source_taints); - - $visited_source_ids[$source->id][implode(',', $source_taints)] = true; - - $generated_sources = $this->getSpecializedSources($source); - - foreach ($generated_sources as $generated_source) { - $new_sources = array_merge( - $new_sources, - $this->getChildNodes( - $generated_source, - $source_taints, - $sinks, - $visited_source_ids - ) - ); - } - } - - $sources = $new_sources; - } - } - - /** - * @param array $source_taints - * @param array $sinks - * @return array - */ - private function getChildNodes( - DataFlowNode $generated_source, - array $source_taints, - array $sinks, - array $visited_source_ids - ): array { - $new_sources = []; - - $config = Config::getInstance(); - - $project_analyzer = ProjectAnalyzer::getInstance(); - - foreach ($this->forward_edges[$generated_source->id] as $to_id => $path) { - $path_type = $path->type; - $added_taints = $path->unescaped_taints ?: []; - $removed_taints = $path->escaped_taints ?: []; - - if (!isset($this->nodes[$to_id])) { - continue; - } - - $destination_node = $this->nodes[$to_id]; - - $new_taints = array_unique( - array_diff( - array_merge($source_taints, $added_taints), - $removed_taints - ) - ); - - sort($new_taints); - - if (isset($visited_source_ids[$to_id][implode(',', $new_taints)])) { - continue; - } - - if (self::shouldIgnoreFetch($path_type, 'arraykey', $generated_source->path_types)) { - continue; - } - - if (self::shouldIgnoreFetch($path_type, 'arrayvalue', $generated_source->path_types)) { - continue; - } - - if (self::shouldIgnoreFetch($path_type, 'property', $generated_source->path_types)) { - continue; - } - - if ($generated_source->code_location - && $project_analyzer->canReportIssues($generated_source->code_location->file_path) - && !$config->reportIssueInFile('TaintedInput', $generated_source->code_location->file_path) - ) { - continue; - } - - if (isset($sinks[$to_id])) { - $matching_taints = array_intersect($sinks[$to_id]->taints, $new_taints); - - if ($matching_taints && $generated_source->code_location) { - if ($sinks[$to_id]->code_location - && $config->reportIssueInFile('TaintedInput', $sinks[$to_id]->code_location->file_path) - ) { - $issue_location = $sinks[$to_id]->code_location; - } else { - $issue_location = $generated_source->code_location; - } - - $issue_trace = $this->getIssueTrace($generated_source); - $path = $this->getPredecessorPath($generated_source) - . ' -> ' . $this->getSuccessorPath($sinks[$to_id]); - - foreach ($matching_taints as $matching_taint) { - switch ($matching_taint) { - case TaintKind::INPUT_CALLABLE: - $issue = new TaintedCallable( - 'Detected tainted text', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_UNSERIALIZE: - $issue = new TaintedUnserialize( - 'Detected tainted code passed to unserialize or similar', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_INCLUDE: - $issue = new TaintedInclude( - 'Detected tainted code passed to include or similar', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_EVAL: - $issue = new TaintedEval( - 'Detected tainted code passed to eval or similar', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_SQL: - $issue = new TaintedSql( - 'Detected tainted SQL', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_HTML: - $issue = new TaintedHtml( - 'Detected tainted HTML', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_HAS_QUOTES: - $issue = new TaintedTextWithQuotes( - 'Detected tainted text with possible quotes', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_SHELL: - $issue = new TaintedShell( - 'Detected tainted shell code', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::USER_SECRET: - $issue = new TaintedUserSecret( - 'Detected tainted user secret leaking', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::SYSTEM_SECRET: - $issue = new TaintedSystemSecret( - 'Detected tainted system secret leaking', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_SSRF: - $issue = new TaintedSSRF( - 'Detected tainted network request', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_LDAP: - $issue = new TaintedLdap( - 'Detected tainted LDAP request', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_COOKIE: - $issue = new TaintedCookie( - 'Detected tainted cookie', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_FILE: - $issue = new TaintedFile( - 'Detected tainted file handling', - $issue_location, - $issue_trace, - $path - ); - break; - - case TaintKind::INPUT_HEADER: - $issue = new TaintedHeader( - 'Detected tainted header', - $issue_location, - $issue_trace, - $path - ); - break; - - default: - $issue = new TaintedCustom( - 'Detected tainted ' . $matching_taint, - $issue_location, - $issue_trace, - $path - ); - } - - IssueBuffer::maybeAdd($issue); - } - } - } - - $new_destination = clone $destination_node; - $new_destination->previous = $generated_source; - $new_destination->taints = $new_taints; - $new_destination->specialized_calls = $generated_source->specialized_calls; - $new_destination->path_types = array_merge($generated_source->path_types, [$path_type]); - - $key = $to_id . - ' ' . json_encode($new_destination->specialized_calls) . - ' ' . json_encode($new_destination->taints); - $new_sources[$key] = $new_destination; - } - - return $new_sources; - } - - /** @return array */ - private function getSpecializedSources(DataFlowNode $source): array - { - $generated_sources = []; - - if (isset($this->forward_edges[$source->id])) { - return [$source]; - } - - if ($source->specialization_key && isset($this->specialized_calls[$source->specialization_key])) { - $generated_source = clone $source; - - $generated_source->id = substr($source->id, 0, -strlen($source->specialization_key) - 1); - - $generated_source->specialized_calls[$source->specialization_key][$generated_source->id] = true; - - $generated_sources[] = $generated_source; - } elseif (isset($this->specializations[$source->id])) { - foreach ($this->specializations[$source->id] as $specialization => $_) { - if (!$source->specialized_calls || isset($source->specialized_calls[$specialization])) { - $new_source = clone $source; - - $new_source->id = $source->id . '-' . $specialization; - - unset($new_source->specialized_calls[$specialization]); - - $generated_sources[] = $new_source; - } - } - } else { - foreach ($source->specialized_calls as $key => $map) { - if (isset($map[$source->id]) && isset($this->forward_edges[$source->id . '-' . $key])) { - $new_source = clone $source; - - $new_source->id = $source->id . '-' . $key; - - $generated_sources[] = $new_source; - } - } - } - - return array_filter( - $generated_sources, - function ($new_source): bool { - return isset($this->forward_edges[$new_source->id]); - } - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php deleted file mode 100644 index f0bca358..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php +++ /dev/null @@ -1,224 +0,0 @@ -> */ - protected $backward_edges = []; - - /** @var array */ - private $nodes = []; - - /** @var array> */ - private $origin_locations_by_id = []; - - public function addNode(DataFlowNode $node): void - { - $this->nodes[$node->id] = $node; - } - - /** - * @param array $added_taints - * @param array $removed_taints - */ - public function addPath( - DataFlowNode $from, - DataFlowNode $to, - string $path_type, - ?array $added_taints = null, - ?array $removed_taints = null - ): void { - $from_id = $from->id; - $to_id = $to->id; - - if ($from_id === $to_id) { - return; - } - - $length = 0; - - if ($from->code_location - && $to->code_location - && $from->code_location->file_path === $to->code_location->file_path - ) { - $to_line = $to->code_location->raw_line_number; - $from_line = $from->code_location->raw_line_number; - $length = abs($to_line - $from_line); - } - - $this->backward_edges[$to_id][$from_id] = true; - $this->forward_edges[$from_id][$to_id] = new Path($path_type, $length); - } - - public function isVariableUsed(DataFlowNode $assignment_node): bool - { - $visited_source_ids = []; - - $sources = [$assignment_node]; - - for ($i = 0; count($sources) && $i < 200; $i++) { - $new_child_nodes = []; - - foreach ($sources as $source) { - $visited_source_ids[$source->id] = true; - - $child_nodes = $this->getChildNodes( - $source, - $visited_source_ids - ); - - if ($child_nodes === null) { - return true; - } - - $new_child_nodes = array_merge( - $new_child_nodes, - $child_nodes - ); - } - - $sources = $new_child_nodes; - } - - return false; - } - - /** - * @return list - */ - public function getOriginLocations(DataFlowNode $assignment_node): array - { - if (isset($this->origin_locations_by_id[$assignment_node->id])) { - return $this->origin_locations_by_id[$assignment_node->id]; - } - - $visited_child_ids = []; - - $origin_locations = []; - - $child_nodes = [$assignment_node]; - - for ($i = 0; count($child_nodes) && $i < 200; $i++) { - $new_parent_nodes = []; - - foreach ($child_nodes as $child_node) { - $visited_child_ids[$child_node->id] = true; - - $parent_nodes = $this->getParentNodes( - $child_node, - $visited_child_ids - ); - - if (!$parent_nodes) { - if ($child_node->code_location) { - $origin_locations[] = $child_node->code_location; - } - - continue; - } - - $new_parent_nodes = array_merge( - $new_parent_nodes, - $parent_nodes - ); - } - - $child_nodes = $new_parent_nodes; - } - - $this->origin_locations_by_id[$assignment_node->id] = $origin_locations; - - return $origin_locations; - } - - /** - * @param array $visited_source_ids - * @return array|null - */ - private function getChildNodes( - DataFlowNode $generated_source, - array $visited_source_ids - ): ?array { - $new_child_nodes = []; - - if (!isset($this->forward_edges[$generated_source->id])) { - return []; - } - - foreach ($this->forward_edges[$generated_source->id] as $to_id => $path) { - $path_type = $path->type; - - if ($path->type === 'variable-use' - || $path->type === 'closure-use' - || $path->type === 'global-use' - || $path->type === 'use-inside-instance-property' - || $path->type === 'use-inside-static-property' - || $path->type === 'use-inside-call' - || $path->type === 'use-inside-conditional' - || $path->type === 'use-inside-isset' - || $path->type === 'arg' - ) { - return null; - } - - if (isset($visited_source_ids[$to_id])) { - continue; - } - - if (self::shouldIgnoreFetch($path_type, 'arraykey', $generated_source->path_types)) { - continue; - } - - if (self::shouldIgnoreFetch($path_type, 'arrayvalue', $generated_source->path_types)) { - continue; - } - - if (self::shouldIgnoreFetch($path_type, 'property', $generated_source->path_types)) { - continue; - } - - $new_destination = new DataFlowNode($to_id, $to_id, null); - $new_destination->path_types = array_merge($generated_source->path_types, [$path_type]); - - $new_child_nodes[$to_id] = $new_destination; - } - - return $new_child_nodes; - } - - /** - * @param array $visited_source_ids - * @return list - */ - private function getParentNodes( - DataFlowNode $destination, - array $visited_source_ids - ): array { - $new_parent_nodes = []; - - if (!isset($this->backward_edges[$destination->id])) { - return []; - } - - foreach ($this->backward_edges[$destination->id] as $from_id => $_) { - if (isset($visited_source_ids[$from_id])) { - continue; - } - - if (isset($this->nodes[$from_id])) { - $new_parent_nodes[] = $this->nodes[$from_id]; - } - } - - return $new_parent_nodes; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Composer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Composer.php deleted file mode 100644 index 52ac9350..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Composer.php +++ /dev/null @@ -1,43 +0,0 @@ - */ - public $taints; - - /** @var ?self */ - public $previous; - - /** @var list */ - public $path_types = []; - - /** - * @var array> - */ - public $specialized_calls = []; - - /** - * @param array $taints - */ - public function __construct( - string $id, - string $label, - ?CodeLocation $code_location, - ?string $specialization_key = null, - array $taints = [] - ) { - $this->id = $id; - - if ($specialization_key) { - $this->unspecialized_id = $id; - $this->id .= '-' . $specialization_key; - } - - $this->label = $label; - $this->code_location = $code_location; - $this->specialization_key = $specialization_key; - $this->taints = $taints; - } - - /** - * @return static - */ - final public static function getForMethodArgument( - string $method_id, - string $cased_method_id, - int $argument_offset, - ?CodeLocation $arg_location, - ?CodeLocation $code_location = null - ): self { - $arg_id = strtolower($method_id) . '#' . ($argument_offset + 1); - - $label = $cased_method_id . '#' . ($argument_offset + 1); - - $specialization_key = null; - - if ($code_location) { - $specialization_key = strtolower($code_location->file_name) . ':' . $code_location->raw_file_start; - } - - return new static( - $arg_id, - $label, - $arg_location, - $specialization_key - ); - } - - /** - * @return static - */ - final public static function getForAssignment( - string $var_id, - CodeLocation $assignment_location, - ?string $specialization_key = null - ): self { - $id = $var_id - . '-' . $assignment_location->file_name - . ':' . $assignment_location->raw_file_start - . '-' . $assignment_location->raw_file_end; - - return new static($id, $var_id, $assignment_location, $specialization_key); - } - - /** - * @return static - */ - final public static function getForMethodReturn( - string $method_id, - string $cased_method_id, - ?CodeLocation $code_location, - ?CodeLocation $function_location = null - ): self { - $specialization_key = null; - - if ($function_location) { - $specialization_key = strtolower($function_location->file_name) . ':' . $function_location->raw_file_start; - } - - return new static( - strtolower($method_id), - $cased_method_id, - $code_location, - $specialization_key - ); - } - - public function __toString(): string - { - return $this->id; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php b/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php deleted file mode 100644 index 05d120b4..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php +++ /dev/null @@ -1,33 +0,0 @@ - $unescaped_taints - * @param ?array $escaped_taints - */ - public function __construct( - string $type, - int $length, - ?array $unescaped_taints = null, - ?array $escaped_taints = null - ) { - $this->type = $type; - $this->length = $length; - $this->unescaped_taints = $unescaped_taints; - $this->escaped_taints = $escaped_taints; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php b/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php deleted file mode 100644 index 408f13cc..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php +++ /dev/null @@ -1,7 +0,0 @@ - $a - * @param array $b - * - * @return array{0:non-empty-list>, 1: int, 2: int, 3: array} - */ - protected static function calculateTrace( - Closure $is_equal, - array $a, - array $b, - string $a_code, - string $b_code - ): array { - $n = count($a); - $m = count($b); - $max = $n + $m; - $v = [1 => 0]; - $bc = []; - $trace = []; - for ($d = 0; $d <= $max; ++$d) { - $trace[] = $v; - for ($k = -$d; $k <= $d; $k += 2) { - if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { - $x = $v[$k + 1]; - } else { - $x = $v[$k - 1] + 1; - } - - $y = $x - $k; - - $body_change = false; - - while ($x < $n && $y < $m && ($is_equal)($a[$x], $b[$y], $a_code, $b_code, $body_change)) { - $bc[$x] = $body_change; - ++$x; - ++$y; - - $body_change = false; - } - - $v[$k] = $x; - if ($x >= $n && $y >= $m) { - return [$trace, $x, $y, $bc]; - } - } - } - throw new Exception('Should not happen'); - } - - /** - * @param array> $trace - * @param array $a - * @param array $b - * @param array $bc - * - * @return list - * - * @psalm-pure - */ - protected static function extractDiff(array $trace, int $x, int $y, array $a, array $b, array $bc): array - { - $result = []; - for ($d = count($trace) - 1; $d >= 0; --$d) { - $v = $trace[$d]; - $k = $x - $y; - - if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { - $prevK = $k + 1; - } else { - $prevK = $k - 1; - } - - $prevX = $v[$prevK]; - $prevY = $prevX - $prevK; - - while ($x > $prevX && $y > $prevY) { - $result[] = new DiffElem( - $bc[$x - 1] ? DiffElem::TYPE_KEEP_SIGNATURE : DiffElem::TYPE_KEEP, - $a[$x - 1], - $b[$y - 1] - ); - --$x; - --$y; - } - - if ($d === 0) { - break; - } - - while ($x > $prevX) { - $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x - 1], null); - --$x; - } - - while ($y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y - 1]); - --$y; - } - } - - return array_reverse($result); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php deleted file mode 100644 index fab907de..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php +++ /dev/null @@ -1,251 +0,0 @@ - $a - * @param array $b - * - * @return array{ - * 0: list, - * 1: list, - * 2: list, - * 3: array, - * 4: list - * } - */ - public static function diff(string $name, array $a, array $b, string $a_code, string $b_code): array - { - $diff_map = []; - - [$trace, $x, $y, $bc] = self::calculateTrace( - function ( - PhpParser\Node\Stmt $a, - PhpParser\Node\Stmt $b, - string $a_code, - string $b_code, - bool &$body_change = false - ) use (&$diff_map): bool { - if (get_class($a) !== get_class($b)) { - return false; - } - - $a_start = (int)$a->getAttribute('startFilePos'); - $a_end = (int)$a->getAttribute('endFilePos'); - - $b_start = (int)$b->getAttribute('startFilePos'); - $b_end = (int)$b->getAttribute('endFilePos'); - - $a_comments_end = $a_start; - $b_comments_end = $b_start; - - /** @var list */ - $a_comments = $a->getComments(); - /** @var list */ - $b_comments = $b->getComments(); - - $signature_change = false; - $body_change = false; - - if ($a_comments) { - if (!$b_comments) { - $signature_change = true; - } - - $a_start = $a_comments[0]->getStartFilePos(); - } - - if ($b_comments) { - if (!$a_comments) { - $signature_change = true; - } - - $b_start = $b_comments[0]->getStartFilePos(); - } - - $a_size = $a_end - $a_start; - $b_size = $b_end - $b_start; - - if ($a_size === $b_size - && substr($a_code, $a_start, $a_size) === substr($b_code, $b_start, $b_size) - ) { - $start_diff = $b_start - $a_start; - $line_diff = $b->getLine() - $a->getLine(); - - /** @psalm-suppress MixedArrayAssignment */ - $diff_map[] = [$a_start, $a_end, $start_diff, $line_diff]; - - return true; - } - - if (!$signature_change - && substr($a_code, $a_start, $a_comments_end - $a_start) - !== substr($b_code, $b_start, $b_comments_end - $b_start) - ) { - $signature_change = true; - } - - if ($a instanceof PhpParser\Node\Stmt\ClassMethod && $b instanceof PhpParser\Node\Stmt\ClassMethod) { - if ((string) $a->name !== (string) $b->name) { - return false; - } - - if ($a->stmts) { - $first_stmt = $a->stmts[0]; - $a_stmts_start = (int) $first_stmt->getAttribute('startFilePos'); - - if ($a_stmt_comments = $first_stmt->getComments()) { - $a_stmts_start = $a_stmt_comments[0]->getStartFilePos(); - } - } else { - $a_stmts_start = $a_end; - } - - if ($b->stmts) { - $first_stmt = $b->stmts[0]; - $b_stmts_start = (int) $first_stmt->getAttribute('startFilePos'); - - if ($b_stmt_comments = $first_stmt->getComments()) { - $b_stmts_start = $b_stmt_comments[0]->getStartFilePos(); - } - } else { - $b_stmts_start = $b_end; - } - - $a_body_size = $a_end - $a_stmts_start; - $b_body_size = $b_end - $b_stmts_start; - - $body_change = $a_body_size !== $b_body_size - || substr($a_code, $a_stmts_start, $a_end - $a_stmts_start) - !== substr($b_code, $b_stmts_start, $b_end - $b_stmts_start); - - if (!$signature_change) { - $a_signature = substr($a_code, $a_start, $a_stmts_start - $a_start); - $b_signature = substr($b_code, $b_start, $b_stmts_start - $b_start); - - if ($a_signature !== $b_signature) { - $a_signature = trim($a_signature); - $b_signature = trim($b_signature); - - if (strpos($a_signature, $b_signature) === false - && strpos($b_signature, $a_signature) === false - ) { - $signature_change = true; - } - } - } - } elseif ($a instanceof PhpParser\Node\Stmt\Property && $b instanceof PhpParser\Node\Stmt\Property) { - if (count($a->props) !== 1 || count($b->props) !== 1) { - return false; - } - - if ((string) $a->props[0]->name !== (string) $b->props[0]->name || $a->flags !== $b->flags) { - return false; - } - - $body_change = substr($a_code, $a_comments_end, $a_end - $a_comments_end) - !== substr($b_code, $b_comments_end, $b_end - $b_comments_end); - } else { - $signature_change = true; - } - - if (!$signature_change && !$body_change) { - /** @psalm-suppress MixedArrayAssignment */ - $diff_map[] = [$a_start, $a_end, $b_start - $a_start, $b->getLine() - $a->getLine()]; - } - - return !$signature_change; - }, - $a, - $b, - $a_code, - $b_code - ); - - $diff = self::extractDiff($trace, $x, $y, $a, $b, $bc); - - $keep = []; - $keep_signature = []; - $add_or_delete = []; - $deletion_ranges = []; - - $name_lc = strtolower($name); - foreach ($diff as $diff_elem) { - if ($diff_elem->type === DiffElem::TYPE_KEEP) { - if ($diff_elem->old instanceof PhpParser\Node\Stmt\ClassMethod) { - $keep[] = $name_lc . '::' . strtolower((string) $diff_elem->old->name); - } elseif ($diff_elem->old instanceof PhpParser\Node\Stmt\Property) { - foreach ($diff_elem->old->props as $prop) { - $keep[] = $name_lc . '::$' . $prop->name; - } - } elseif ($diff_elem->old instanceof PhpParser\Node\Stmt\ClassConst) { - foreach ($diff_elem->old->consts as $const) { - $keep[] = $name_lc . '::' . $const->name; - } - } elseif ($diff_elem->old instanceof PhpParser\Node\Stmt\TraitUse) { - foreach ($diff_elem->old->traits as $trait) { - $keep[] = $name_lc . '&' . strtolower((string) $trait->getAttribute('resolvedName')); - } - } - } elseif ($diff_elem->type === DiffElem::TYPE_KEEP_SIGNATURE) { - if ($diff_elem->old instanceof PhpParser\Node\Stmt\ClassMethod) { - $keep_signature[] = $name_lc . '::' . strtolower((string) $diff_elem->old->name); - } elseif ($diff_elem->old instanceof PhpParser\Node\Stmt\Property) { - foreach ($diff_elem->old->props as $prop) { - $keep_signature[] = $name_lc . '::$' . $prop->name; - } - } - } elseif ($diff_elem->type === DiffElem::TYPE_REMOVE || $diff_elem->type === DiffElem::TYPE_ADD) { - /** @var PhpParser\Node */ - $affected_elem = $diff_elem->type === DiffElem::TYPE_REMOVE ? $diff_elem->old : $diff_elem->new; - if ($affected_elem instanceof PhpParser\Node\Stmt\ClassMethod) { - $add_or_delete[] = $name_lc . '::' . strtolower((string) $affected_elem->name); - } elseif ($affected_elem instanceof PhpParser\Node\Stmt\Property) { - foreach ($affected_elem->props as $prop) { - $add_or_delete[] = $name_lc . '::$' . $prop->name; - } - } elseif ($affected_elem instanceof PhpParser\Node\Stmt\ClassConst) { - foreach ($affected_elem->consts as $const) { - $add_or_delete[] = $name_lc . '::' . $const->name; - } - } elseif ($affected_elem instanceof PhpParser\Node\Stmt\TraitUse) { - foreach ($affected_elem->traits as $trait) { - $add_or_delete[] = $name_lc . '&' . strtolower((string) $trait->getAttribute('resolvedName')); - } - } - - if ($diff_elem->type === DiffElem::TYPE_REMOVE) { - if ($doc = $affected_elem->getDocComment()) { - $start = $doc->getStartFilePos(); - } else { - $start = (int)$affected_elem->getAttribute('startFilePos'); - } - - $deletion_ranges[] = [ - $start, - (int)$affected_elem->getAttribute('endFilePos') - ]; - } - } - } - - /** @var array $diff_map */ - return [$keep, $keep_signature, $add_or_delete, $diff_map, $deletion_ranges]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php deleted file mode 100644 index d8ac0d29..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php +++ /dev/null @@ -1,37 +0,0 @@ -type = $type; - $this->old = $old; - $this->new = $new; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php deleted file mode 100644 index c50d4466..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php +++ /dev/null @@ -1,319 +0,0 @@ - $a - * @param list $b - * - * @return array{0:non-empty-list>, 1: int, 2: int} - * - * @psalm-pure - */ - private static function calculateTrace( - array $a, - array $b - ): array { - $n = count($a); - $m = count($b); - $max = $n + $m; - $v = [1 => 0]; - $trace = []; - for ($d = 0; $d <= $max; ++$d) { - $trace[] = $v; - for ($k = -$d; $k <= $d; $k += 2) { - if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { - $x = $v[$k + 1]; - } else { - $x = $v[$k - 1] + 1; - } - - $y = $x - $k; - - while ($x < $n && $y < $m && $a[$x] === $b[$y]) { - ++$x; - ++$y; - } - - $v[$k] = $x; - if ($x >= $n && $y >= $m) { - return [$trace, $x, $y]; - } - } - } - throw new Exception('Should not happen'); - } - - /** - * @param list> $trace - * @param list $a - * @param list $b - * - * @return list - * - * @psalm-pure - */ - private static function extractDiff(array $trace, int $x, int $y, array $a, array $b): array - { - $result = []; - for ($d = count($trace) - 1; $d >= 0; --$d) { - $v = $trace[$d]; - $k = $x - $y; - - if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { - $prevK = $k + 1; - } else { - $prevK = $k - 1; - } - - $prevX = $v[$prevK]; - $prevY = $prevX - $prevK; - - while ($x > $prevX && $y > $prevY) { - $result[] = new DiffElem( - DiffElem::TYPE_KEEP, - $a[$x - 1], - $b[$y - 1] - ); - --$x; - --$y; - } - - if ($d === 0) { - break; - } - - while ($x > $prevX) { - $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x - 1], null); - --$x; - } - - while ($y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y - 1]); - --$y; - } - } - - return array_reverse($result); - } - - /** - * @return array - * - * @psalm-pure - */ - public static function getDiff(string $a_code, string $b_code): array - { - $a = explode("\n", $a_code); - $b = explode("\n", $b_code); - [$trace, $x, $y] = self::calculateTrace($a, $b); - - $diff = self::coalesceReplacements(self::extractDiff($trace, $x, $y, $a, $b)); - - $a_offset = 0; - - $b_offset = 0; - - $last_diff_type = null; - - /** @var array{0:int, 1:int, 2:int, 3:int, 4:int, 5:string}|null */ - $last_change = null; - - $changes = []; - $i = 0; - $line_diff = 0; - - foreach ($diff as $diff_elem) { - $diff_type = $diff_elem->type; - - if ($diff_type !== $last_diff_type) { - $last_change = null; - } - - if ($diff_type === DiffElem::TYPE_REMOVE) { - /** @var string $diff_elem->old */ - $diff_text = $diff_elem->old . "\n"; - - $text_length = strlen($diff_text); - - --$line_diff; - - if ($last_change === null) { - ++$i; - $last_change = [ - $a_offset, - $a_offset + $text_length, - $b_offset, - $b_offset, - $line_diff, - '', - ]; - $changes[$i - 1] = $last_change; - } else { - $last_change[1] += $text_length; - $last_change[4] = $line_diff; - $changes[$i - 1] = $last_change; - } - - $a_offset += $text_length; - } elseif ($diff_type === DiffElem::TYPE_ADD) { - /** @var string $diff_elem->new */ - $diff_text = $diff_elem->new . "\n"; - - $text_length = strlen($diff_text); - - ++$line_diff; - - if ($last_change === null) { - ++$i; - $last_change = [ - $a_offset, - $a_offset, - $b_offset, - $b_offset + $text_length, - $line_diff, - $diff_text, - ]; - $changes[$i - 1] = $last_change; - } else { - $last_change[3] += $text_length; - $last_change[4] = $line_diff; - $last_change[5] .= $diff_text; - - $changes[$i - 1] = $last_change; - } - - $b_offset += $text_length; - } elseif ($diff_type === DiffElem::TYPE_REPLACE) { - /** @var string $diff_elem->old */ - $old_diff_text = $diff_elem->old . "\n"; - - /** @var string $diff_elem->new */ - $new_diff_text = $diff_elem->new . "\n"; - - $old_text_length = strlen($old_diff_text); - $new_text_length = strlen($new_diff_text); - - $max_same_count = min($old_text_length, $new_text_length); - - for ($j = 0; $j < $max_same_count; ++$j) { - if ($old_diff_text[$j] !== $new_diff_text[$j]) { - break; - } - - ++$a_offset; - ++$b_offset; - --$old_text_length; - --$new_text_length; - } - - $new_diff_text = substr($new_diff_text, $j); - - if ($last_change === null || $j) { - ++$i; - $last_change = [ - $a_offset, - $a_offset + $old_text_length, - $b_offset, - $b_offset + $new_text_length, - $line_diff, - $new_diff_text, - ]; - $changes[$i - 1] = $last_change; - } else { - $last_change[1] += $old_text_length; - $last_change[3] += $new_text_length; - $last_change[5] .= $new_diff_text; - $changes[$i - 1] = $last_change; - } - - $a_offset += $old_text_length; - $b_offset += $new_text_length; - } else { - /** @psalm-suppress MixedArgument */ - $same_text_length = strlen($diff_elem->new) + 1; - - $a_offset += $same_text_length; - $b_offset += $same_text_length; - } - - $last_diff_type = $diff_elem->type; - } - - return $changes; - } - - /** - * Coalesce equal-length sequences of remove+add into a replace operation. - * - * @param DiffElem[] $diff - * - * @return list - * - * @psalm-pure - */ - private static function coalesceReplacements(array $diff): array - { - $newDiff = []; - $c = count($diff); - for ($i = 0; $i < $c; ++$i) { - $diffType = $diff[$i]->type; - if ($diffType !== DiffElem::TYPE_REMOVE) { - $newDiff[] = $diff[$i]; - continue; - } - - $j = $i; - while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { - ++$j; - } - - $k = $j; - while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { - ++$k; - } - - if ($j - $i === $k - $j) { - $len = $j - $i; - for ($n = 0; $n < $len; ++$n) { - $newDiff[] = new DiffElem( - DiffElem::TYPE_REPLACE, - $diff[$i + $n]->old, - $diff[$j + $n]->new - ); - } - } else { - for (; $i < $k; ++$i) { - $newDiff[] = $diff[$i]; - } - } - - $i = $k - 1; - } - - return $newDiff; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php deleted file mode 100644 index 9580d7f6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php +++ /dev/null @@ -1,172 +0,0 @@ - $a - * @param list $b - * - * @return array{ - * 0: list, - * 1: list, - * 2: list, - * 3: list, - * 4: list - * } - */ - public static function diff(array $a, array $b, string $a_code, string $b_code): array - { - [$trace, $x, $y, $bc] = self::calculateTrace( - function ( - PhpParser\Node\Stmt $a, - PhpParser\Node\Stmt $b, - string $a_code, - string $b_code, - bool &$body_change = false - ): bool { - if (get_class($a) !== get_class($b)) { - return false; - } - - if (($a instanceof PhpParser\Node\Stmt\Namespace_ && $b instanceof PhpParser\Node\Stmt\Namespace_) - || ($a instanceof PhpParser\Node\Stmt\Class_ && $b instanceof PhpParser\Node\Stmt\Class_) - || ($a instanceof PhpParser\Node\Stmt\Interface_ && $b instanceof PhpParser\Node\Stmt\Interface_) - || ($a instanceof PhpParser\Node\Stmt\Trait_ && $b instanceof PhpParser\Node\Stmt\Trait_) - ) { - return (string)$a->name === (string)$b->name; - } - - if (($a instanceof PhpParser\Node\Stmt\Use_ - && $b instanceof PhpParser\Node\Stmt\Use_) - || ($a instanceof PhpParser\Node\Stmt\GroupUse - && $b instanceof PhpParser\Node\Stmt\GroupUse) - ) { - $a_start = (int)$a->getAttribute('startFilePos'); - $a_end = (int)$a->getAttribute('endFilePos'); - - $b_start = (int)$b->getAttribute('startFilePos'); - $b_end = (int)$b->getAttribute('endFilePos'); - - $a_size = $a_end - $a_start; - $b_size = $b_end - $b_start; - - if (substr($a_code, $a_start, $a_size) === substr($b_code, $b_start, $b_size)) { - return true; - } - } - - return false; - }, - $a, - $b, - $a_code, - $b_code - ); - - $diff = self::extractDiff($trace, $x, $y, $a, $b, $bc); - - $keep = []; - $keep_signature = []; - $add_or_delete = []; - $diff_map = []; - $deletion_ranges = []; - - foreach ($diff as $diff_elem) { - if ($diff_elem->type === DiffElem::TYPE_KEEP) { - if ($diff_elem->old instanceof PhpParser\Node\Stmt\Namespace_ - && $diff_elem->new instanceof PhpParser\Node\Stmt\Namespace_ - ) { - $namespace_keep = NamespaceStatementsDiffer::diff( - (string) $diff_elem->old->name, - $diff_elem->old->stmts, - $diff_elem->new->stmts, - $a_code, - $b_code - ); - - $keep = array_merge($keep, $namespace_keep[0]); - $keep_signature = array_merge($keep_signature, $namespace_keep[1]); - $add_or_delete = array_merge($add_or_delete, $namespace_keep[2]); - $diff_map = array_merge($diff_map, $namespace_keep[3]); - $deletion_ranges = array_merge($deletion_ranges, $namespace_keep[4]); - } elseif (($diff_elem->old instanceof PhpParser\Node\Stmt\Class_ - && $diff_elem->new instanceof PhpParser\Node\Stmt\Class_) - || ($diff_elem->old instanceof PhpParser\Node\Stmt\Interface_ - && $diff_elem->new instanceof PhpParser\Node\Stmt\Interface_) - || ($diff_elem->old instanceof PhpParser\Node\Stmt\Trait_ - && $diff_elem->new instanceof PhpParser\Node\Stmt\Trait_) - ) { - $class_keep = ClassStatementsDiffer::diff( - (string) $diff_elem->old->name, - $diff_elem->old->stmts, - $diff_elem->new->stmts, - $a_code, - $b_code - ); - - $keep = array_merge($keep, $class_keep[0]); - $keep_signature = array_merge($keep_signature, $class_keep[1]); - $add_or_delete = array_merge($add_or_delete, $class_keep[2]); - $diff_map = array_merge($diff_map, $class_keep[3]); - $deletion_ranges = array_merge($deletion_ranges, $class_keep[4]); - } - } elseif ($diff_elem->type === DiffElem::TYPE_REMOVE) { - if ($diff_elem->old instanceof PhpParser\Node\Stmt\Use_ - || $diff_elem->old instanceof PhpParser\Node\Stmt\GroupUse - ) { - foreach ($diff_elem->old->uses as $use) { - if ($use->alias) { - $add_or_delete[] = 'use:' . (string) $use->alias; - } else { - $name_parts = $use->name->parts; - - $add_or_delete[] = 'use:' . end($name_parts); - } - } - } elseif ($diff_elem->old instanceof PhpParser\Node - && !$diff_elem->old instanceof PhpParser\Node\Stmt\Namespace_ - ) { - if ($doc = $diff_elem->old->getDocComment()) { - $start = $doc->getStartFilePos(); - } else { - $start = (int)$diff_elem->old->getAttribute('startFilePos'); - } - - $deletion_ranges[] = [ - $start, - (int)$diff_elem->old->getAttribute('endFilePos') - ]; - } - } elseif ($diff_elem->type === DiffElem::TYPE_ADD) { - if ($diff_elem->new instanceof PhpParser\Node\Stmt\Use_ - || $diff_elem->new instanceof PhpParser\Node\Stmt\GroupUse - ) { - foreach ($diff_elem->new->uses as $use) { - if ($use->alias) { - $add_or_delete[] = 'use:' . (string) $use->alias; - } else { - $name_parts = $use->name->parts; - - $add_or_delete[] = 'use:' . end($name_parts); - } - } - } - } - } - - return [$keep, $keep_signature, $add_or_delete, $diff_map, $deletion_ranges]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php deleted file mode 100644 index 5ac1e8a9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php +++ /dev/null @@ -1,144 +0,0 @@ - $a - * @param array $b - * - * @return array{ - * 0: list, - * 1: list, - * 2: list, - * 3: list, - * 4: list - * } - */ - public static function diff(string $name, array $a, array $b, string $a_code, string $b_code): array - { - [$trace, $x, $y, $bc] = self::calculateTrace( - function ( - PhpParser\Node\Stmt $a, - PhpParser\Node\Stmt $b, - string $a_code, - string $b_code, - bool &$body_change = false - ): bool { - if (get_class($a) !== get_class($b)) { - return false; - } - - if (($a instanceof PhpParser\Node\Stmt\Class_ && $b instanceof PhpParser\Node\Stmt\Class_) - || ($a instanceof PhpParser\Node\Stmt\Interface_ && $b instanceof PhpParser\Node\Stmt\Interface_) - || ($a instanceof PhpParser\Node\Stmt\Trait_ && $b instanceof PhpParser\Node\Stmt\Trait_) - ) { - // @todo add check for comments comparison - - return (string)$a->name === (string)$b->name; - } - - if (($a instanceof PhpParser\Node\Stmt\Use_ - && $b instanceof PhpParser\Node\Stmt\Use_) - || ($a instanceof PhpParser\Node\Stmt\GroupUse - && $b instanceof PhpParser\Node\Stmt\GroupUse) - ) { - $a_start = (int)$a->getAttribute('startFilePos'); - $a_end = (int)$a->getAttribute('endFilePos'); - - $b_start = (int)$b->getAttribute('startFilePos'); - $b_end = (int)$b->getAttribute('endFilePos'); - - $a_size = $a_end - $a_start; - $b_size = $b_end - $b_start; - - if (substr($a_code, $a_start, $a_size) === substr($b_code, $b_start, $b_size)) { - return true; - } - } - - return false; - }, - $a, - $b, - $a_code, - $b_code - ); - - $diff = self::extractDiff($trace, $x, $y, $a, $b, $bc); - - $keep = []; - $keep_signature = []; - $add_or_delete = []; - $diff_map = []; - $deletion_ranges = []; - - foreach ($diff as $diff_elem) { - if ($diff_elem->type === DiffElem::TYPE_KEEP) { - if (($diff_elem->old instanceof PhpParser\Node\Stmt\Class_ - && $diff_elem->new instanceof PhpParser\Node\Stmt\Class_) - || ($diff_elem->old instanceof PhpParser\Node\Stmt\Interface_ - && $diff_elem->new instanceof PhpParser\Node\Stmt\Interface_) - || ($diff_elem->old instanceof PhpParser\Node\Stmt\Trait_ - && $diff_elem->new instanceof PhpParser\Node\Stmt\Trait_) - ) { - $class_keep = ClassStatementsDiffer::diff( - ($name ? $name . '\\' : '') . $diff_elem->old->name, - $diff_elem->old->stmts, - $diff_elem->new->stmts, - $a_code, - $b_code - ); - - $keep = array_merge($keep, $class_keep[0]); - $keep_signature = array_merge($keep_signature, $class_keep[1]); - $add_or_delete = array_merge($add_or_delete, $class_keep[2]); - $diff_map = array_merge($diff_map, $class_keep[3]); - $deletion_ranges = array_merge($deletion_ranges, $class_keep[4]); - } - } elseif ($diff_elem->type === DiffElem::TYPE_REMOVE) { - if ($diff_elem->old instanceof PhpParser\Node\Stmt\Use_ - || $diff_elem->old instanceof PhpParser\Node\Stmt\GroupUse - ) { - foreach ($diff_elem->old->uses as $use) { - if ($use->alias) { - $add_or_delete[] = 'use:' . (string) $use->alias; - } else { - $name_parts = $use->name->parts; - - $add_or_delete[] = 'use:' . end($name_parts); - } - } - } - } elseif ($diff_elem->type === DiffElem::TYPE_ADD) { - if ($diff_elem->new instanceof PhpParser\Node\Stmt\Use_ - || $diff_elem->new instanceof PhpParser\Node\Stmt\GroupUse - ) { - foreach ($diff_elem->new->uses as $use) { - if ($use->alias) { - $add_or_delete[] = 'use:' . (string) $use->alias; - } else { - $name_parts = $use->name->parts; - - $add_or_delete[] = 'use:' . end($name_parts); - } - } - } - } - } - - return [$keep, $keep_signature, $add_or_delete, $diff_map, $deletion_ranges]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php b/vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php deleted file mode 100644 index 802f4727..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php +++ /dev/null @@ -1,90 +0,0 @@ -> - */ - private $after_method_checks = []; - /** @var list> */ - private $legacy_after_method_checks = []; - - /** - * Static methods to be called after project function checks have completed - * - * Called after function calls to functions defined in the project. - * - * Allows influencing the return type and adding of modifications. - * - * @var list> - */ - public $after_function_checks = []; - /** @var list> */ - public $legacy_after_function_checks = []; - - /** - * Static methods to be called after every function call - * - * Called after each function call, including php internal functions. - * - * Cannot change the call or influence its return type - * - * @var list> - */ - public $after_every_function_checks = []; - /** @var list> */ - public $legacy_after_every_function_checks = []; - - /** - * Static methods to be called after expression checks have completed - * - * @var list> - */ - public $after_expression_checks = []; - /** @var list> */ - public $legacy_after_expression_checks = []; - - /** - * Static methods to be called after statement checks have completed - * - * @var list> - */ - public $after_statement_checks = []; - /** @var list> */ - public $legacy_after_statement_checks = []; - - /** - * Static methods to be called after method checks have completed - * - * @var list> - */ - public $string_interpreters = []; - /** @var list> */ - public $legacy_string_interpreters = []; - - /** - * Static methods to be called after classlike exists checks have completed - * - * @var list> - */ - public $after_classlike_exists_checks = []; - /** @var list> */ - public $legacy_after_classlike_exists_checks = []; - - /** - * Static methods to be called after classlike checks have completed - * - * @var list> - */ - public $after_classlike_checks = []; - /** @var list> */ - public $legacy_after_classlike_checks = []; - - /** - * Static methods to be called after classlikes have been scanned - * - * @var list> - */ - private $after_visit_classlikes = []; - /** @var list> */ - private $legacy_after_visit_classlikes = []; - - /** - * Static methods to be called after codebase has been populated - * - * @var list> - */ - public $after_codebase_populated = []; - /** @var list> */ - public $legacy_after_codebase_populated = []; - - /** - * Static methods to be called after codebase has been populated - * - * @var list> - */ - public $after_analysis = []; - /** @var list> */ - public $legacy_after_analysis = []; - - /** - * Static methods to be called after a file has been analyzed - * - * @var list> - */ - public $after_file_checks = []; - /** @var list> */ - public $legacy_after_file_checks = []; - - /** - * Static methods to be called before a file is analyzed - * - * @var list> - */ - public $before_file_checks = []; - /** @var list> */ - public $legacy_before_file_checks = []; - - /** - * Static methods to be called after functionlike checks have completed - * - * @var list> - */ - public $after_functionlike_checks = []; - /** @var list> */ - public $legacy_after_functionlike_checks = []; - - /** - * Static methods to be called to see if taints should be added - * - * @var list> - */ - public $add_taints_checks = []; - - /** - * Static methods to be called to see if taints should be removed - * - * @var list> - */ - public $remove_taints_checks = []; - - /** - * @param class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyAfterMethodCallAnalysisInterface::class)) { - $this->legacy_after_method_checks[] = $class; - } elseif (is_subclass_of($class, AfterMethodCallAnalysisInterface::class)) { - $this->after_method_checks[] = $class; - } - - if (is_subclass_of($class, LegacyAfterFunctionCallAnalysisInterface::class)) { - $this->legacy_after_function_checks[] = $class; - } elseif (is_subclass_of($class, AfterFunctionCallAnalysisInterface::class)) { - $this->after_function_checks[] = $class; - } - - if (is_subclass_of($class, LegacyAfterEveryFunctionCallAnalysisInterface::class)) { - $this->legacy_after_every_function_checks[] = $class; - } elseif (is_subclass_of($class, AfterEveryFunctionCallAnalysisInterface::class)) { - $this->after_every_function_checks[] = $class; - } - - if (is_subclass_of($class, LegacyAfterExpressionAnalysisInterface::class)) { - $this->legacy_after_expression_checks[] = $class; - } elseif (is_subclass_of($class, AfterExpressionAnalysisInterface::class)) { - $this->after_expression_checks[] = $class; - } - - if (is_subclass_of($class, LegacyAfterStatementAnalysisInterface::class)) { - $this->legacy_after_statement_checks[] = $class; - } elseif (is_subclass_of($class, AfterStatementAnalysisInterface::class)) { - $this->after_statement_checks[] = $class; - } - - if (is_subclass_of($class, LegacyStringInterpreterInterface::class)) { - $this->legacy_string_interpreters[] = $class; - } elseif (is_subclass_of($class, StringInterpreterInterface::class)) { - $this->string_interpreters[] = $class; - } - - if (is_subclass_of($class, LegacyAfterClassLikeExistenceCheckInterface::class)) { - $this->legacy_after_classlike_exists_checks[] = $class; - } elseif (is_subclass_of($class, AfterClassLikeExistenceCheckInterface::class)) { - $this->after_classlike_exists_checks[] = $class; - } - - if (is_subclass_of($class, LegacyAfterClassLikeAnalysisInterface::class)) { - $this->legacy_after_classlike_checks[] = $class; - } elseif (is_subclass_of($class, AfterClassLikeAnalysisInterface::class)) { - $this->after_classlike_checks[] = $class; - } - - if (is_subclass_of($class, LegacyAfterClassLikeVisitInterface::class)) { - $this->legacy_after_visit_classlikes[] = $class; - } elseif (is_subclass_of($class, AfterClassLikeVisitInterface::class)) { - $this->after_visit_classlikes[] = $class; - } - - if (is_subclass_of($class, LegacyAfterCodebasePopulatedInterface::class)) { - $this->legacy_after_codebase_populated[] = $class; - } elseif (is_subclass_of($class, AfterCodebasePopulatedInterface::class)) { - $this->after_codebase_populated[] = $class; - } - - if (is_subclass_of($class, LegacyAfterAnalysisInterface::class)) { - $this->legacy_after_analysis[] = $class; - } elseif (is_subclass_of($class, AfterAnalysisInterface::class)) { - $this->after_analysis[] = $class; - } - - if (is_subclass_of($class, LegacyAfterFileAnalysisInterface::class)) { - $this->legacy_after_file_checks[] = $class; - } elseif (is_subclass_of($class, AfterFileAnalysisInterface::class)) { - $this->after_file_checks[] = $class; - } - - if (is_subclass_of($class, LegacyBeforeFileAnalysisInterface::class)) { - $this->legacy_before_file_checks[] = $class; - } elseif (is_subclass_of($class, BeforeFileAnalysisInterface::class)) { - $this->before_file_checks[] = $class; - } - - if (is_subclass_of($class, LegacyAfterFunctionLikeAnalysisInterface::class)) { - $this->legacy_after_functionlike_checks[] = $class; - } elseif (is_subclass_of($class, AfterFunctionLikeAnalysisInterface::class)) { - $this->after_functionlike_checks[] = $class; - } - - if (is_subclass_of($class, AddTaintsInterface::class)) { - $this->add_taints_checks[] = $class; - } - - if (is_subclass_of($class, RemoveTaintsInterface::class)) { - $this->remove_taints_checks[] = $class; - } - } - - public function hasAfterMethodCallAnalysisHandlers(): bool - { - return count($this->after_method_checks) || count($this->legacy_after_method_checks); - } - - public function dispatchAfterMethodCallAnalysis(AfterMethodCallAnalysisEvent $event): void - { - foreach ($this->after_method_checks as $handler) { - $handler::afterMethodCallAnalysis($event); - } - - foreach ($this->legacy_after_method_checks as $handler) { - $file_replacements = $event->getFileReplacements(); - $return_type_candidate = $event->getReturnTypeCandidate(); - $handler::afterMethodCallAnalysis( - $event->getExpr(), - $event->getMethodId(), - $event->getAppearingMethodId(), - $event->getDeclaringMethodId(), - $event->getContext(), - $event->getStatementsSource(), - $event->getCodebase(), - $file_replacements, - $return_type_candidate - ); - $event->setFileReplacements($file_replacements); - $event->setReturnTypeCandidate($return_type_candidate); - } - } - - public function dispatchAfterFunctionCallAnalysis(AfterFunctionCallAnalysisEvent $event): void - { - foreach ($this->after_function_checks as $handler) { - $handler::afterFunctionCallAnalysis($event); - } - - foreach ($this->legacy_after_function_checks as $handler) { - $file_replacements = $event->getFileReplacements(); - $handler::afterFunctionCallAnalysis( - $event->getExpr(), - $event->getFunctionId(), - $event->getContext(), - $event->getStatementsSource(), - $event->getCodebase(), - $event->getReturnTypeCandidate(), - $file_replacements - ); - $event->setFileReplacements($file_replacements); - } - } - - public function dispatchAfterEveryFunctionCallAnalysis(AfterEveryFunctionCallAnalysisEvent $event): void - { - foreach ($this->after_every_function_checks as $handler) { - $handler::afterEveryFunctionCallAnalysis($event); - } - - foreach ($this->legacy_after_every_function_checks as $handler) { - $handler::afterEveryFunctionCallAnalysis( - $event->getExpr(), - $event->getFunctionId(), - $event->getContext(), - $event->getStatementsSource(), - $event->getCodebase() - ); - } - } - - public function dispatchAfterExpressionAnalysis(AfterExpressionAnalysisEvent $event): ?bool - { - foreach ($this->after_expression_checks as $handler) { - if ($handler::afterExpressionAnalysis($event) === false) { - return false; - } - } - - foreach ($this->legacy_after_expression_checks as $handler) { - $file_replacements = $event->getFileReplacements(); - if ($handler::afterExpressionAnalysis( - $event->getExpr(), - $event->getContext(), - $event->getStatementsSource(), - $event->getCodebase(), - $file_replacements - ) === false) { - return false; - } - $event->setFileReplacements($file_replacements); - } - - return null; - } - - public function dispatchAfterStatementAnalysis(AfterStatementAnalysisEvent $event): ?bool - { - foreach ($this->after_statement_checks as $handler) { - if ($handler::afterStatementAnalysis($event) === false) { - return false; - } - } - - foreach ($this->legacy_after_statement_checks as $handler) { - $file_replacements = $event->getFileReplacements(); - if ($handler::afterStatementAnalysis( - $event->getStmt(), - $event->getContext(), - $event->getStatementsSource(), - $event->getCodebase(), - $file_replacements - ) === false) { - return false; - } - $event->setFileReplacements($file_replacements); - } - - return null; - } - - public function dispatchStringInterpreter(StringInterpreterEvent $event): ?TLiteralString - { - foreach ($this->string_interpreters as $handler) { - if ($type = $handler::getTypeFromValue($event)) { - return $type; - } - } - - foreach ($this->legacy_string_interpreters as $handler) { - if ($type = $handler::getTypeFromValue($event->getValue())) { - return $type; - } - } - - return null; - } - - public function dispatchAfterClassLikeExistenceCheck(AfterClassLikeExistenceCheckEvent $event): void - { - foreach ($this->after_classlike_exists_checks as $handler) { - $handler::afterClassLikeExistenceCheck($event); - } - - foreach ($this->legacy_after_classlike_exists_checks as $handler) { - $file_replacements = $event->getFileReplacements(); - $handler::afterClassLikeExistenceCheck( - $event->getFqClassName(), - $event->getCodeLocation(), - $event->getStatementsSource(), - $event->getCodebase(), - $file_replacements - ); - $event->setFileReplacements($file_replacements); - } - } - - public function dispatchAfterClassLikeAnalysis(AfterClassLikeAnalysisEvent $event): ?bool - { - foreach ($this->after_classlike_checks as $handler) { - if ($handler::afterStatementAnalysis($event) === false) { - return false; - } - } - - foreach ($this->legacy_after_classlike_checks as $handler) { - $file_replacements = $event->getFileReplacements(); - if ($handler::afterStatementAnalysis( - $event->getStmt(), - $event->getClasslikeStorage(), - $event->getStatementsSource(), - $event->getCodebase(), - $file_replacements - ) === false) { - return false; - } - $event->setFileReplacements($file_replacements); - } - - return null; - } - - public function hasAfterClassLikeVisitHandlers(): bool - { - return count($this->after_visit_classlikes) || count($this->legacy_after_visit_classlikes); - } - - public function dispatchAfterClassLikeVisit(AfterClassLikeVisitEvent $event): void - { - foreach ($this->after_visit_classlikes as $handler) { - $handler::afterClassLikeVisit($event); - } - - foreach ($this->legacy_after_visit_classlikes as $handler) { - $file_replacements = $event->getFileReplacements(); - $handler::afterClassLikeVisit( - $event->getStmt(), - $event->getStorage(), - $event->getStatementsSource(), - $event->getCodebase(), - $file_replacements - ); - $event->setFileReplacements($file_replacements); - } - } - - public function dispatchAfterCodebasePopulated(AfterCodebasePopulatedEvent $event): void - { - foreach ($this->after_codebase_populated as $handler) { - $handler::afterCodebasePopulated($event); - } - - foreach ($this->legacy_after_codebase_populated as $handler) { - $handler::afterCodebasePopulated( - $event->getCodebase() - ); - } - } - - public function dispatchAfterAnalysis(AfterAnalysisEvent $event): void - { - foreach ($this->after_analysis as $handler) { - $handler::afterAnalysis($event); - } - - foreach ($this->legacy_after_analysis as $handler) { - /** @psalm-suppress MixedArgumentTypeCoercion due to Psalm bug */ - $handler::afterAnalysis( - $event->getCodebase(), - $event->getIssues(), - $event->getBuildInfo(), - $event->getSourceControlInfo() - ); - } - } - - public function dispatchAfterFileAnalysis(AfterFileAnalysisEvent $event): void - { - foreach ($this->after_file_checks as $handler) { - $handler::afterAnalyzeFile($event); - } - - foreach ($this->legacy_after_file_checks as $handler) { - $handler::afterAnalyzeFile( - $event->getStatementsSource(), - $event->getFileContext(), - $event->getFileStorage(), - $event->getCodebase() - ); - } - } - - public function dispatchBeforeFileAnalysis(BeforeFileAnalysisEvent $event): void - { - foreach ($this->before_file_checks as $handler) { - $handler::beforeAnalyzeFile($event); - } - - foreach ($this->legacy_before_file_checks as $handler) { - $handler::beforeAnalyzeFile( - $event->getStatementsSource(), - $event->getFileContext(), - $event->getFileStorage(), - $event->getCodebase() - ); - } - } - - public function dispatchAfterFunctionLikeAnalysis(AfterFunctionLikeAnalysisEvent $event): ?bool - { - foreach ($this->after_functionlike_checks as $handler) { - if ($handler::afterStatementAnalysis($event) === false) { - return false; - } - } - - foreach ($this->legacy_after_functionlike_checks as $handler) { - $file_replacements = $event->getFileReplacements(); - if ($handler::afterStatementAnalysis( - $event->getStmt(), - $event->getFunctionlikeStorage(), - $event->getStatementsSource(), - $event->getCodebase(), - $file_replacements - ) === false) { - return false; - } - $event->setFileReplacements($file_replacements); - } - - return null; - } - - /** - * @return list - */ - public function dispatchAddTaints(AddRemoveTaintsEvent $event): array - { - $added_taints = []; - - foreach ($this->add_taints_checks as $handler) { - $added_taints = array_merge($added_taints, $handler::addTaints($event)); - } - - return $added_taints; - } - - /** - * @return list - */ - public function dispatchRemoveTaints(AddRemoveTaintsEvent $event): array - { - $removed_taints = []; - - foreach ($this->remove_taints_checks as $handler) { - $removed_taints = array_merge($removed_taints, $handler::removeTaints($event)); - } - - return $removed_taints; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php deleted file mode 100644 index 858e7f4b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php +++ /dev/null @@ -1,321 +0,0 @@ - - */ -class BuildInfoCollector -{ - /** - * Environment variables. - * - * Overwritten through collection process. - * - * @var array - */ - protected $env; - - /** - * Read environment variables. - * - * @var array - */ - protected $readEnv = []; - - public function __construct(array $env) - { - $this->env = $env; - } - - // API - - /** - * Collect environment variables. - */ - public function collect(): array - { - $this->readEnv = []; - - $this - ->fillTravisCi() - ->fillCircleCi() - ->fillAppVeyor() - ->fillJenkins() - ->fillScrutinizer() - ->fillGithubActions(); - - return $this->readEnv; - } - - // internal method - - /** - * Fill Travis CI environment variables. - * - * "TRAVIS", "TRAVIS_JOB_ID" must be set. - * - * @return $this - * - * @psalm-suppress PossiblyUndefinedStringArrayOffset - */ - protected function fillTravisCi(): self - { - if (isset($this->env['TRAVIS']) && $this->env['TRAVIS'] && isset($this->env['TRAVIS_JOB_ID'])) { - $this->readEnv['CI_JOB_ID'] = $this->env['TRAVIS_JOB_ID']; - $this->env['CI_NAME'] = 'travis-ci'; - - // backup - $this->readEnv['TRAVIS'] = $this->env['TRAVIS']; - $this->readEnv['TRAVIS_JOB_ID'] = $this->env['TRAVIS_JOB_ID']; - $this->readEnv['CI_NAME'] = $this->env['CI_NAME']; - $this->readEnv['TRAVIS_TAG'] = $this->env['TRAVIS_TAG'] ?? ''; - - $repo_slug = (string) $this->env['TRAVIS_REPO_SLUG']; - - if ($repo_slug) { - $slug_parts = explode('/', $repo_slug); - $this->readEnv['CI_REPO_OWNER'] = $slug_parts[0]; - $this->readEnv['CI_REPO_NAME'] = $slug_parts[1]; - } - - $pr_slug = (string) ($this->env['TRAVIS_PULL_REQUEST_SLUG'] ?? ''); - - if ($pr_slug) { - $slug_parts = explode('/', $pr_slug); - - $this->readEnv['CI_PR_REPO_OWNER'] = $slug_parts[0]; - $this->readEnv['CI_PR_REPO_NAME'] = $slug_parts[1]; - } - - $this->readEnv['CI_PR_NUMBER'] = $this->env['TRAVIS_PULL_REQUEST']; - $this->readEnv['CI_BRANCH'] = $this->env['TRAVIS_BRANCH']; - } - - return $this; - } - - /** - * Fill CircleCI environment variables. - * - * "CIRCLECI", "CIRCLE_BUILD_NUM" must be set. - * - * @return $this - */ - protected function fillCircleCi(): self - { - if (isset($this->env['CIRCLECI']) && $this->env['CIRCLECI'] && isset($this->env['CIRCLE_BUILD_NUM'])) { - $this->env['CI_BUILD_NUMBER'] = $this->env['CIRCLE_BUILD_NUM']; - $this->env['CI_NAME'] = 'circleci'; - - // backup - $this->readEnv['CIRCLECI'] = $this->env['CIRCLECI']; - $this->readEnv['CIRCLE_BUILD_NUM'] = $this->env['CIRCLE_BUILD_NUM']; - $this->readEnv['CI_NAME'] = $this->env['CI_NAME']; - - $this->readEnv['CI_PR_REPO_OWNER'] = $this->env['CIRCLE_PR_USERNAME'] ?? null; - $this->readEnv['CI_PR_REPO_NAME'] = $this->env['CIRCLE_PR_REPONAME'] ?? null; - - $this->readEnv['CI_REPO_OWNER'] = $this->env['CIRCLE_PROJECT_USERNAME'] ?? null; - $this->readEnv['CI_REPO_NAME'] = $this->env['CIRCLE_PROJECT_REPONAME'] ?? null; - - $this->readEnv['CI_PR_NUMBER'] = $this->env['CIRCLE_PR_NUMBER'] ?? null; - - $this->readEnv['CI_BRANCH'] = $this->env['CIRCLE_BRANCH'] ?? null; - } - - return $this; - } - - /** - * Fill AppVeyor environment variables. - * - * "APPVEYOR", "APPVEYOR_BUILD_NUMBER" must be set. - * - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * - * @return $this - */ - protected function fillAppVeyor(): self - { - if (isset($this->env['APPVEYOR']) && $this->env['APPVEYOR'] && isset($this->env['APPVEYOR_BUILD_NUMBER'])) { - $this->readEnv['CI_BUILD_NUMBER'] = $this->env['APPVEYOR_BUILD_NUMBER']; - $this->readEnv['CI_JOB_ID'] = $this->env['APPVEYOR_JOB_NUMBER']; - $this->readEnv['CI_PR_NUMBER'] = $this->env['APPVEYOR_PULL_REQUEST_NUMBER'] ?? ''; - $this->env['CI_NAME'] = 'AppVeyor'; - - // backup - $this->readEnv['APPVEYOR'] = $this->env['APPVEYOR']; - $this->readEnv['APPVEYOR_BUILD_NUMBER'] = $this->env['APPVEYOR_BUILD_NUMBER']; - $this->readEnv['APPVEYOR_JOB_NUMBER'] = $this->env['APPVEYOR_JOB_NUMBER']; - $this->readEnv['APPVEYOR_REPO_BRANCH'] = $this->env['APPVEYOR_REPO_BRANCH']; - $this->readEnv['CI_NAME'] = $this->env['CI_NAME']; - - $repo_slug = (string) ($this->env['APPVEYOR_REPO_NAME'] ?? ''); - - if ($repo_slug) { - $slug_parts = explode('/', $repo_slug); - - $this->readEnv['CI_REPO_OWNER'] = $slug_parts[0]; - $this->readEnv['CI_REPO_NAME'] = $slug_parts[1]; - } - - $pr_slug = (string) ($this->env['APPVEYOR_PULL_REQUEST_HEAD_REPO_NAME'] ?? ''); - - if ($pr_slug) { - $slug_parts = explode('/', $pr_slug); - - $this->readEnv['CI_PR_REPO_OWNER'] = $slug_parts[0]; - $this->readEnv['CI_PR_REPO_NAME'] = $slug_parts[1]; - } - - $this->readEnv['CI_BRANCH'] = $this->env['APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH'] - ?? $this->env['APPVEYOR_REPO_BRANCH']; - } - - return $this; - } - - /** - * Fill Jenkins environment variables. - * - * "JENKINS_URL", "BUILD_NUMBER" must be set. - * - * @return $this - */ - protected function fillJenkins(): self - { - if (isset($this->env['JENKINS_URL']) && isset($this->env['BUILD_NUMBER'])) { - $this->readEnv['CI_BUILD_NUMBER'] = $this->env['BUILD_NUMBER']; - $this->readEnv['CI_BUILD_URL'] = $this->env['JENKINS_URL']; - $this->env['CI_NAME'] = 'jenkins'; - - // backup - $this->readEnv['BUILD_NUMBER'] = $this->env['BUILD_NUMBER']; - $this->readEnv['JENKINS_URL'] = $this->env['JENKINS_URL']; - $this->readEnv['CI_NAME'] = $this->env['CI_NAME']; - } - - return $this; - } - - /** - * Fill Scrutinizer environment variables. - * - * "JENKINS_URL", "BUILD_NUMBER" must be set. - * - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * - * @return $this - */ - protected function fillScrutinizer(): self - { - if (isset($this->env['SCRUTINIZER']) && $this->env['SCRUTINIZER']) { - $this->readEnv['CI_JOB_ID'] = $this->env['SCRUTINIZER_INSPECTION_UUID']; - $this->readEnv['CI_BRANCH'] = $this->env['SCRUTINIZER_BRANCH']; - $this->readEnv['CI_PR_NUMBER'] = $this->env['SCRUTINIZER_PR_NUMBER'] ?? ''; - - // backup - $this->readEnv['CI_NAME'] = 'Scrutinizer'; - - $repo_slug = (string) ($this->env['SCRUTINIZER_PROJECT'] ?? ''); - - if ($repo_slug) { - $slug_parts = explode('/', $repo_slug); - - if ($this->readEnv['CI_PR_NUMBER']) { - $this->readEnv['CI_PR_REPO_OWNER'] = $slug_parts[1]; - $this->readEnv['CI_PR_REPO_NAME'] = $slug_parts[2]; - } else { - $this->readEnv['CI_REPO_OWNER'] = $slug_parts[1]; - $this->readEnv['CI_REPO_NAME'] = $slug_parts[2]; - } - } - } - - return $this; - } - - /** - * Fill Github Actions environment variables. - * - * @return $this - * @psalm-suppress PossiblyUndefinedStringArrayOffset - */ - protected function fillGithubActions(): BuildInfoCollector - { - if (isset($this->env['GITHUB_ACTIONS'])) { - $this->env['CI_NAME'] = 'github-actions'; - $this->env['CI_JOB_ID'] = $this->env['GITHUB_ACTIONS']; - - $githubRef = (string) $this->env['GITHUB_REF']; - if (strpos($githubRef, 'refs/heads/') !== false) { - $githubRef = str_replace('refs/heads/', '', $githubRef); - } elseif (strpos($githubRef, 'refs/tags/') !== false) { - $githubRef = str_replace('refs/tags/', '', $githubRef); - } - - $this->env['CI_BRANCH'] = $githubRef; - - $this->readEnv['GITHUB_ACTIONS'] = $this->env['GITHUB_ACTIONS']; - $this->readEnv['GITHUB_REF'] = $this->env['GITHUB_REF']; - $this->readEnv['CI_NAME'] = $this->env['CI_NAME']; - $this->readEnv['CI_BRANCH'] = $this->env['CI_BRANCH']; - - $slug_parts = explode('/', (string) $this->env['GITHUB_REPOSITORY']); - - $this->readEnv['CI_REPO_OWNER'] = $slug_parts[0]; - $this->readEnv['CI_REPO_NAME'] = $slug_parts[1]; - - if (isset($this->env['GITHUB_EVENT_PATH'])) { - $event_json = file_get_contents((string) $this->env['GITHUB_EVENT_PATH']); - /** @var array */ - $event_data = json_decode($event_json, true); - - if (isset($event_data['head_commit'])) { - /** - * @var array{ - * id: string, - * author: array{name: string, email: string}, - * committer: array{name: string, email: string}, - * message: string, - * timestamp: string - * } - */ - $head_commit_data = $event_data['head_commit']; - $gitinfo = new GitInfo( - $githubRef, - (new CommitInfo()) - ->setId($head_commit_data['id']) - ->setAuthorName($head_commit_data['author']['name']) - ->setAuthorEmail($head_commit_data['author']['email']) - ->setCommitterName($head_commit_data['committer']['name']) - ->setCommitterEmail($head_commit_data['committer']['email']) - ->setMessage($head_commit_data['message']) - ->setDate(strtotime($head_commit_data['timestamp'])), - [] - ); - - $this->readEnv['git'] = $gitinfo->toArray(); - } - - if ($this->env['GITHUB_EVENT_PATH'] === 'pull_request') { - $this->readEnv['CI_PR_NUMBER'] = $event_data['number']; - } - } - } - return $this; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php deleted file mode 100644 index e7821285..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php +++ /dev/null @@ -1,142 +0,0 @@ - - */ -class GitInfoCollector -{ - /** - * Git command. - * - * @var SystemCommandExecutor - */ - protected $executor; - - /** - * Constructor. - */ - public function __construct() - { - $this->executor = new SystemCommandExecutor(); - } - - // API - - /** - * Collect git repository info. - */ - public function collect(): GitInfo - { - $branch = $this->collectBranch(); - $commit = $this->collectCommit(); - $remotes = $this->collectRemotes(); - - return new GitInfo($branch, $commit, $remotes); - } - - /** - * Collect branch name. - * - * @throws RuntimeException - */ - protected function collectBranch(): string - { - $branchesResult = $this->executor->execute('git branch'); - - foreach ($branchesResult as $result) { - if (strpos($result, '* ') === 0) { - $exploded = explode('* ', $result, 2); - - return $exploded[1]; - } - } - - throw new RuntimeException(); - } - - /** - * Collect commit info. - * - * @throws RuntimeException - */ - protected function collectCommit(): CommitInfo - { - $commitResult = $this->executor->execute('git log -1 --pretty=format:%H%n%aN%n%ae%n%cN%n%ce%n%s%n%at'); - - if (count($commitResult) !== 7 || array_keys($commitResult) !== range(0, 6)) { - throw new RuntimeException(); - } - - $commit = new CommitInfo(); - - return $commit - ->setId(trim($commitResult[0])) - ->setAuthorName(trim($commitResult[1])) - ->setAuthorEmail(trim($commitResult[2])) - ->setCommitterName(trim($commitResult[3])) - ->setCommitterEmail(trim($commitResult[4])) - ->setMessage($commitResult[5]) - ->setDate((int) $commitResult[6]); - } - - /** - * Collect remotes info. - * - * @throws RuntimeException - * - * @return list - */ - protected function collectRemotes(): array - { - $remotesResult = $this->executor->execute('git remote -v'); - - if (count($remotesResult) === 0) { - throw new RuntimeException(); - } - - // parse command result - $results = []; - - foreach ($remotesResult as $result) { - if (strpos($result, ' ') !== false) { - [$remote] = explode(' ', $result, 2); - - $results[] = $remote; - } - } - - // filter - $results = array_unique($results); - - // create Remote instances - $remotes = []; - - foreach ($results as $result) { - if (strpos($result, "\t") !== false) { - [$name, $url] = explode("\t", $result, 2); - - $remote = new RemoteInfo(); - $remotes[] = $remote->setName(trim($name))->setUrl(trim($url)); - } - } - - return $remotes; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php b/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php deleted file mode 100644 index 97113ea1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @author Dariusz Rumiński - * - * @internal - */ -final class SystemCommandExecutor -{ - /** - * Execute command. - * - * - * @throws RuntimeException - * - * @return string[] - */ - public function execute(string $command): array - { - if (!function_exists('exec')) { - throw new RuntimeException(sprintf('exec does not exist, failed to execute command: %s', $command)); - } - - exec($command, $result, $returnValue); - - if ($returnValue === 0) { - /** @var string[] */ - return $result; - } - - throw new RuntimeException(sprintf('Failed to execute command: %s', $command), $returnValue); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php deleted file mode 100644 index f953ad9c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php +++ /dev/null @@ -1,141 +0,0 @@ -> - */ - private static $manipulators = []; - - /** @var Class_ */ - private $stmt; - - /** @var int */ - private $docblock_start; - - /** @var int */ - private $docblock_end; - - /** @var bool */ - private $immutable = false; - - /** @var string */ - private $indentation; - - public static function getForClass( - ProjectAnalyzer $project_analyzer, - string $file_path, - Class_ $stmt - ): self { - if (isset(self::$manipulators[$file_path][$stmt->getLine()])) { - return self::$manipulators[$file_path][$stmt->getLine()]; - } - - $manipulator - = self::$manipulators[$file_path][$stmt->getLine()] - = new self($project_analyzer, $stmt, $file_path); - - return $manipulator; - } - - private function __construct( - ProjectAnalyzer $project_analyzer, - Class_ $stmt, - string $file_path - ) { - $this->stmt = $stmt; - $docblock = $stmt->getDocComment(); - $this->docblock_start = $docblock ? $docblock->getStartFilePos() : (int)$stmt->getAttribute('startFilePos'); - $this->docblock_end = (int)$stmt->getAttribute('startFilePos'); - - $codebase = $project_analyzer->getCodebase(); - - $file_contents = $codebase->getFileContents($file_path); - - $preceding_newline_pos = (int) strrpos($file_contents, "\n", $this->docblock_end - strlen($file_contents)); - - $first_line = substr($file_contents, $preceding_newline_pos + 1, $this->docblock_end - $preceding_newline_pos); - - $this->indentation = str_replace(ltrim($first_line), '', $first_line); - } - - public function makeImmutable(): void - { - $this->immutable = true; - } - - /** - * Gets a new docblock given the existing docblock, if one exists, and the updated return types - * and/or parameters - * - */ - private function getDocblock(): string - { - $docblock = $this->stmt->getDocComment(); - - if ($docblock) { - $parsed_docblock = DocComment::parsePreservingLength($docblock); - } else { - $parsed_docblock = new ParsedDocblock('', []); - } - - $modified_docblock = false; - - if ($this->immutable) { - $modified_docblock = true; - $parsed_docblock->tags['psalm-immutable'] = ['']; - } - - if (!$modified_docblock) { - return (string)$docblock . "\n" . $this->indentation; - } - - return $parsed_docblock->render($this->indentation); - } - - /** - * @return array - */ - public static function getManipulationsForFile(string $file_path): array - { - if (!isset(self::$manipulators[$file_path])) { - return []; - } - - $file_manipulations = []; - - foreach (self::$manipulators[$file_path] as $manipulator) { - if ($manipulator->immutable) { - $file_manipulations[$manipulator->docblock_start] = new FileManipulation( - $manipulator->docblock_start, - $manipulator->docblock_end, - $manipulator->getDocblock() - ); - } - } - - return $file_manipulations; - } - - public static function clearCache(): void - { - self::$manipulators = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php deleted file mode 100644 index 086af29a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php +++ /dev/null @@ -1,38 +0,0 @@ -source_file_path = $source_file_path; - $this->source_start = $source_start; - $this->source_end = $source_end; - $this->destination_file_path = $destination_file_path; - $this->destination_start = $destination_start; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php deleted file mode 100644 index 1ed9c6c1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php +++ /dev/null @@ -1,245 +0,0 @@ - */ - private static $file_manipulations = []; - - /** @var CodeMigration[] */ - private static $code_migrations = []; - - /** - * @param FileManipulation[] $file_manipulations - * - */ - public static function add(string $file_path, array $file_manipulations): void - { - if (!isset(self::$file_manipulations[$file_path])) { - self::$file_manipulations[$file_path] = []; - } - - foreach ($file_manipulations as $file_manipulation) { - self::$file_manipulations[$file_path][$file_manipulation->getKey()] = $file_manipulation; - } - } - - /** @param CodeMigration[] $code_migrations */ - public static function addCodeMigrations(array $code_migrations): void - { - self::$code_migrations = array_merge(self::$code_migrations, $code_migrations); - } - - /** - * @return array{int, int} - */ - private static function getCodeOffsets( - string $source_file_path, - int $source_start, - int $source_end - ): array { - if (!isset(self::$file_manipulations[$source_file_path])) { - return [0, 0]; - } - - $start_offset = 0; - $middle_offset = 0; - - foreach (self::$file_manipulations[$source_file_path] as $fm) { - $offset = strlen($fm->insertion_text) - $fm->end + $fm->start; - - if ($fm->end < $source_start) { - $start_offset += $offset; - $middle_offset += $offset; - } elseif ($fm->start > $source_start - && $fm->end < $source_end - ) { - $middle_offset += $offset; - } - } - - return [$start_offset, $middle_offset]; - } - - public static function addForCodeLocation( - CodeLocation $code_location, - string $replacement_text, - bool $swallow_newlines = false - ): void { - $bounds = $code_location->getSnippetBounds(); - - if ($swallow_newlines) { - $project_analyzer = ProjectAnalyzer::getInstance(); - - $codebase = $project_analyzer->getCodebase(); - - $file_contents = $codebase->getFileContents($code_location->file_path); - - if (($file_contents[$bounds[0] - 1] ?? null) === "\n" - && ($file_contents[$bounds[0] - 2] ?? null) === "\n" - ) { - $bounds[0] -= 2; - } - } - - self::add( - $code_location->file_path, - [ - new FileManipulation( - $bounds[0], - $bounds[1], - $replacement_text - ), - ] - ); - } - - public static function addVarAnnotationToRemove(DocblockTypeLocation $code_location): void - { - $bounds = $code_location->getSelectionBounds(); - - $project_analyzer = ProjectAnalyzer::getInstance(); - - $codebase = $project_analyzer->getCodebase(); - - $file_contents = $codebase->getFileContents($code_location->file_path); - - $comment_start = strrpos($file_contents, '/**', $bounds[0] - strlen($file_contents)); - - if ($comment_start === false) { - return; - } - - $comment_end = strpos($file_contents, '*/', $bounds[1]); - - if ($comment_end === false) { - return; - } - - $comment_end += 2; - - $comment_text = substr($file_contents, $comment_start, $comment_end - $comment_start); - - $var_type_comment_start = $bounds[0] - $comment_start; - $var_type_comment_end = $bounds[1] - $comment_start; - - $var_start = strrpos($comment_text, '@var', $var_type_comment_start - strlen($comment_text)); - $var_end = strpos($comment_text, "\n", $var_type_comment_end); - - if ($var_start && $var_end) { - $var_start = strrpos($comment_text, "\n", $var_start - strlen($comment_text)) ?: $var_start; - $comment_text = substr_replace($comment_text, '', $var_start, $var_end - $var_start); - if (preg_match('@^/\*\*\n(\s*\*\s*\n)*\s*\*?\*/$@', $comment_text)) { - $comment_text = ''; - } - } else { - $comment_text = ''; - } - - self::add( - $code_location->file_path, - [ - new FileManipulation( - $comment_start, - $comment_end, - $comment_text, - false, - $comment_text === '' - ), - ] - ); - } - - /** - * @return FileManipulation[] - */ - public static function getManipulationsForFile(string $file_path): array - { - return self::$file_manipulations[$file_path] ?? []; - } - - /** - * @return array - */ - public static function getMigrationManipulations(FileProvider $file_provider): array - { - $code_migration_manipulations = []; - - foreach (self::$code_migrations as $code_migration) { - [$start_offset, $middle_offset] = self::getCodeOffsets( - $code_migration->source_file_path, - $code_migration->source_start, - $code_migration->source_end - ); - - if (!isset($code_migration_manipulations[$code_migration->source_file_path])) { - $code_migration_manipulations[$code_migration->source_file_path] = []; - } - - if (!isset($code_migration_manipulations[$code_migration->destination_file_path])) { - $code_migration_manipulations[$code_migration->destination_file_path] = []; - } - - $delete_file_manipulation = new FileManipulation( - $code_migration->source_start + $start_offset, - $code_migration->source_end + $middle_offset, - '' - ); - - $code_migration_manipulations[$code_migration->source_file_path][] = $delete_file_manipulation; - - [$destination_start_offset] = self::getCodeOffsets( - $code_migration->destination_file_path, - $code_migration->destination_start, - $code_migration->destination_start - ); - - $manipulation = new FileManipulation( - $code_migration->destination_start + $destination_start_offset, - $code_migration->destination_start + $destination_start_offset, - "\n" . substr( - $file_provider->getContents($code_migration->source_file_path), - $delete_file_manipulation->start, - $delete_file_manipulation->end - $delete_file_manipulation->start - ) . "\n" - ); - - $code_migration_manipulations[$code_migration->destination_file_path][$manipulation->getKey()] - = $manipulation; - } - - return $code_migration_manipulations; - } - - /** - * @return array - */ - public static function getAll(): array - { - return self::$file_manipulations; - } - - public static function clearCache(): void - { - self::$file_manipulations = []; - self::$code_migrations = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php deleted file mode 100644 index ca652333..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php +++ /dev/null @@ -1,579 +0,0 @@ -> - */ - private static $manipulators = []; - - /** @var Closure|Function_|ClassMethod|ArrowFunction */ - private $stmt; - - /** @var int */ - private $docblock_start; - - /** @var int */ - private $docblock_end; - - /** @var int */ - private $return_typehint_area_start; - - /** @var null|int */ - private $return_typehint_colon_start; - - /** @var null|int */ - private $return_typehint_start; - - /** @var null|int */ - private $return_typehint_end; - - /** @var null|string */ - private $new_php_return_type; - - /** @var bool */ - private $return_type_is_php_compatible = false; - - /** @var null|string */ - private $new_phpdoc_return_type; - - /** @var null|string */ - private $new_psalm_return_type; - - /** @var array */ - private $new_php_param_types = []; - - /** @var array */ - private $new_phpdoc_param_types = []; - - /** @var array */ - private $new_psalm_param_types = []; - - /** @var string */ - private $indentation; - - /** @var string|null */ - private $return_type_description; - - /** @var array */ - private $param_offsets = []; - - /** @var array */ - private $param_typehint_offsets = []; - - /** @var bool */ - private $is_pure = false; - - /** @var list */ - private $throwsExceptions = []; - - /** - * @param Closure|Function_|ClassMethod|ArrowFunction $stmt - */ - public static function getForFunction( - ProjectAnalyzer $project_analyzer, - string $file_path, - FunctionLike $stmt - ): FunctionDocblockManipulator { - if (isset(self::$manipulators[$file_path][$stmt->getLine()])) { - return self::$manipulators[$file_path][$stmt->getLine()]; - } - - $manipulator - = self::$manipulators[$file_path][$stmt->getLine()] - = new self($file_path, $stmt, $project_analyzer); - - return $manipulator; - } - - /** - * @param Closure|Function_|ClassMethod|ArrowFunction $stmt - */ - private function __construct(string $file_path, FunctionLike $stmt, ProjectAnalyzer $project_analyzer) - { - $this->stmt = $stmt; - $docblock = $stmt->getDocComment(); - $this->docblock_start = $docblock ? $docblock->getStartFilePos() : (int)$stmt->getAttribute('startFilePos'); - $this->docblock_end = $function_start = (int)$stmt->getAttribute('startFilePos'); - $function_end = (int)$stmt->getAttribute('endFilePos'); - - $attributes = $stmt->getAttrGroups(); - foreach ($attributes as $attribute) { - // if we have attribute groups, we need to consider that the function starts after them - if ((int) $attribute->getAttribute('endFilePos') > $function_start) { - $function_start = (int) $attribute->getAttribute('endFilePos'); - } - } - - foreach ($stmt->params as $param) { - if ($param->var instanceof PhpParser\Node\Expr\Variable - && is_string($param->var->name) - ) { - $this->param_offsets[$param->var->name] = (int) $param->getAttribute('startFilePos'); - - if ($param->type) { - $this->param_typehint_offsets[$param->var->name] = [ - (int) $param->type->getAttribute('startFilePos'), - (int) $param->type->getAttribute('endFilePos') - ]; - } - } - } - - $codebase = $project_analyzer->getCodebase(); - - $file_contents = $codebase->getFileContents($file_path); - - $last_arg_position = $stmt->params - ? (int) $stmt->params[count($stmt->params) - 1]->getAttribute('endFilePos') + 1 - : null; - - if ($stmt instanceof Closure && $stmt->uses) { - $last_arg_position = (int) $stmt->uses[count($stmt->uses) - 1]->getAttribute('endFilePos') + 1; - } - - $end_bracket_position = (int) strpos($file_contents, ')', $last_arg_position ?: $function_start); - - $this->return_typehint_area_start = $end_bracket_position + 1; - - $function_code = substr($file_contents, $function_start, $function_end); - - $function_code_after_bracket = substr($function_code, $end_bracket_position + 1 - $function_start); - - // do a little parsing here - $chars = str_split($function_code_after_bracket); - - $in_single_line_comment = $in_multi_line_comment = false; - - for ($i = 0, $iMax = count($chars); $i < $iMax; ++$i) { - $char = $chars[$i]; - - switch ($char) { - case "\n": - $in_single_line_comment = false; - continue 2; - - case ':': - if ($in_multi_line_comment || $in_single_line_comment) { - continue 2; - } - - $this->return_typehint_colon_start = $i + $end_bracket_position + 1; - - continue 2; - - case '/': - if ($in_multi_line_comment || $in_single_line_comment) { - continue 2; - } - - if ($chars[$i + 1] === '*') { - $in_multi_line_comment = true; - ++$i; - } - - if ($chars[$i + 1] === '/') { - $in_single_line_comment = true; - ++$i; - } - - continue 2; - - case '*': - if ($in_single_line_comment) { - continue 2; - } - - if ($chars[$i + 1] === '/') { - $in_multi_line_comment = false; - ++$i; - } - - continue 2; - - case '{': - if ($in_multi_line_comment || $in_single_line_comment) { - continue 2; - } - - break 2; - - case '=': - if ($in_multi_line_comment || $in_single_line_comment) { - continue 2; - } - break 2; - - case '?': - if ($in_multi_line_comment || $in_single_line_comment) { - continue 2; - } - - $this->return_typehint_start = $i + $end_bracket_position + 1; - break; - } - - if ($in_multi_line_comment || $in_single_line_comment) { - continue; - } - - if ($chars[$i] === '\\' || preg_match('/\w/', $char)) { - if ($this->return_typehint_start === null) { - $this->return_typehint_start = $i + $end_bracket_position + 1; - } - - if ($chars[$i + 1] !== '\\' && !preg_match('/[\w]/', $chars[$i + 1])) { - $this->return_typehint_end = $i + $end_bracket_position + 2; - break; - } - } - } - - $preceding_newline_pos = strrpos($file_contents, "\n", $this->docblock_end - strlen($file_contents)); - - if ($preceding_newline_pos === false) { - $this->indentation = ''; - - return; - } - - $first_line = substr($file_contents, $preceding_newline_pos + 1, $this->docblock_end - $preceding_newline_pos); - - $this->indentation = str_replace(ltrim($first_line), '', $first_line); - } - - /** - * Sets the new return type - * - */ - public function setReturnType( - ?string $php_type, - string $new_type, - string $phpdoc_type, - bool $is_php_compatible, - ?string $description - ): void { - $new_type = str_replace(['', ''], '', $new_type); - - $this->new_php_return_type = $php_type; - $this->new_phpdoc_return_type = $phpdoc_type; - $this->new_psalm_return_type = $new_type; - $this->return_type_is_php_compatible = $is_php_compatible; - $this->return_type_description = $description; - } - - /** - * Sets a new param type - */ - public function setParamType( - string $param_name, - ?string $php_type, - string $new_type, - string $phpdoc_type - ): void { - $new_type = str_replace(['', '', ''], '', $new_type); - - if ($php_type === 'static') { - $php_type = ''; - } - if ($php_type) { - $this->new_php_param_types[$param_name] = $php_type; - } - - if ($php_type !== $phpdoc_type) { - $this->new_phpdoc_param_types[$param_name] = $phpdoc_type; - } - if ($php_type !== $new_type && $phpdoc_type !== $new_type) { - $this->new_psalm_param_types[$param_name] = $new_type; - } - } - - /** - * Gets a new docblock given the existing docblock, if one exists, and the updated return types - * and/or parameters - * - */ - private function getDocblock(): string - { - $docblock = $this->stmt->getDocComment(); - - if ($docblock) { - $parsed_docblock = DocComment::parsePreservingLength($docblock); - } else { - $parsed_docblock = new ParsedDocblock('', []); - } - - $modified_docblock = false; - - foreach ($this->new_phpdoc_param_types as $param_name => $phpdoc_type) { - $found_in_params = false; - $new_param_block = $phpdoc_type . ' ' . '$' . $param_name; - - if (isset($parsed_docblock->tags['param'])) { - foreach ($parsed_docblock->tags['param'] as &$param_block) { - $doc_parts = CommentAnalyzer::splitDocLine($param_block); - - if (($doc_parts[1] ?? null) === '$' . $param_name) { - if ($param_block !== $new_param_block) { - $modified_docblock = true; - } - - $param_block = $new_param_block; - $found_in_params = true; - break; - } - } - } - - if (!$found_in_params) { - $modified_docblock = true; - $parsed_docblock->tags['param'][] = $new_param_block; - } - } - - foreach ($this->new_psalm_param_types as $param_name => $psalm_type) { - $found_in_params = false; - $new_param_block = $psalm_type . ' ' . '$' . $param_name; - - if (isset($parsed_docblock->tags['psalm-param'])) { - foreach ($parsed_docblock->tags['psalm-param'] as &$param_block) { - $doc_parts = CommentAnalyzer::splitDocLine($param_block); - - if (($doc_parts[1] ?? null) === '$' . $param_name) { - if ($param_block !== $new_param_block) { - $modified_docblock = true; - } - - $param_block = $new_param_block; - $found_in_params = true; - break; - } - } - } - - if (!$found_in_params) { - $modified_docblock = true; - $parsed_docblock->tags['psalm-param'][] = $new_param_block; - } - } - - $old_phpdoc_return_type = null; - if (isset($parsed_docblock->tags['return'])) { - $old_phpdoc_return_type = reset($parsed_docblock->tags['return']); - } - - if ($this->is_pure) { - $modified_docblock = true; - $parsed_docblock->tags['psalm-pure'] = ['']; - } - if (count($this->throwsExceptions) > 0) { - $modified_docblock = true; - $inferredThrowsClause = array_reduce( - $this->throwsExceptions, - function (string $throwsClause, string $exception) { - return $throwsClause === '' ? $exception : $throwsClause.'|'.$exception; - }, - '' - ); - if (array_key_exists('throws', $parsed_docblock->tags)) { - $parsed_docblock->tags['throws'][] = $inferredThrowsClause; - } else { - $parsed_docblock->tags['throws'] = [$inferredThrowsClause]; - } - } - - - if ($this->new_phpdoc_return_type && $this->new_phpdoc_return_type !== $old_phpdoc_return_type) { - $modified_docblock = true; - if ($this->new_phpdoc_return_type !== $this->new_php_return_type || $this->return_type_description) { - //only add the type if it's different than signature or if there's a description - $parsed_docblock->tags['return'] = [ - $this->new_phpdoc_return_type - . ($this->return_type_description ? (' ' . $this->return_type_description) : ''), - ]; - } else { - unset($parsed_docblock->tags['return']); - } - } - - $old_psalm_return_type = null; - if (isset($parsed_docblock->tags['psalm-return'])) { - $old_psalm_return_type = reset($parsed_docblock->tags['psalm-return']); - } - - if ($this->new_psalm_return_type - && $this->new_phpdoc_return_type !== $this->new_psalm_return_type - && $this->new_psalm_return_type !== $old_psalm_return_type - ) { - $modified_docblock = true; - $parsed_docblock->tags['psalm-return'] = [$this->new_psalm_return_type]; - } - - if (!$parsed_docblock->tags && !$parsed_docblock->description) { - return ''; - } - - if (!$modified_docblock) { - return (string)$docblock . "\n" . $this->indentation; - } - - return $parsed_docblock->render($this->indentation); - } - - /** - * @return array - */ - public static function getManipulationsForFile(string $file_path): array - { - if (!isset(self::$manipulators[$file_path])) { - return []; - } - - $file_manipulations = []; - - foreach (self::$manipulators[$file_path] as $manipulator) { - if ($manipulator->new_php_return_type) { - if ($manipulator->return_typehint_start && $manipulator->return_typehint_end) { - $file_manipulations[$manipulator->return_typehint_start] = new FileManipulation( - $manipulator->return_typehint_start, - $manipulator->return_typehint_end, - $manipulator->new_php_return_type - ); - } else { - $file_manipulations[$manipulator->return_typehint_area_start] = new FileManipulation( - $manipulator->return_typehint_area_start, - $manipulator->return_typehint_area_start, - ': ' . $manipulator->new_php_return_type - ); - } - } elseif ($manipulator->new_php_return_type === '' - && $manipulator->return_typehint_colon_start - && $manipulator->new_phpdoc_return_type - && $manipulator->return_typehint_start - && $manipulator->return_typehint_end - ) { - $file_manipulations[$manipulator->return_typehint_start] = new FileManipulation( - $manipulator->return_typehint_colon_start, - $manipulator->return_typehint_end, - '' - ); - } - - if (!$manipulator->new_php_return_type - || !$manipulator->return_type_is_php_compatible - || $manipulator->docblock_start !== $manipulator->docblock_end - || $manipulator->is_pure - ) { - $file_manipulations[$manipulator->docblock_start] = new FileManipulation( - $manipulator->docblock_start, - $manipulator->docblock_end, - $manipulator->getDocblock() - ); - } - - foreach ($manipulator->new_php_param_types as $param_name => $new_php_param_type) { - if (!isset($manipulator->param_offsets[$param_name])) { - continue; - } - - $param_offset = $manipulator->param_offsets[$param_name]; - - $typehint_offsets = $manipulator->param_typehint_offsets[$param_name] ?? null; - - if ($new_php_param_type) { - if ($typehint_offsets) { - $file_manipulations[$typehint_offsets[0]] = new FileManipulation( - $typehint_offsets[0], - $typehint_offsets[1], - $new_php_param_type - ); - } else { - $file_manipulations[$param_offset] = new FileManipulation( - $param_offset, - $param_offset, - $new_php_param_type . ' ' - ); - } - } elseif ($new_php_param_type === '' - && $typehint_offsets - ) { - $file_manipulations[$typehint_offsets[0]] = new FileManipulation( - $typehint_offsets[0], - $param_offset, - '' - ); - } - } - } - - return $file_manipulations; - } - - public function makePure(): void - { - $this->is_pure = true; - } - - /** - * @param list $exceptions - */ - public function addThrowsDocblock(array $exceptions): void - { - $this->throwsExceptions = $exceptions; - } - - public static function clearCache(): void - { - self::$manipulators = []; - } - - /** - * @param array> $manipulators - */ - public static function addManipulators(array $manipulators): void - { - self::$manipulators = array_merge($manipulators, self::$manipulators); - } - - /** - * @return array> - */ - public static function getManipulators(): array - { - return self::$manipulators; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php deleted file mode 100644 index 0ee9654a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php +++ /dev/null @@ -1,281 +0,0 @@ -> - */ - private static $manipulators = []; - - /** @var Property */ - private $stmt; - - /** @var int */ - private $docblock_start; - - /** @var int */ - private $docblock_end; - - /** @var null|int */ - private $typehint_start; - - /** @var int */ - private $typehint_area_start; - - /** @var null|int */ - private $typehint_end; - - /** @var null|string */ - private $new_php_type; - - /** @var bool */ - private $type_is_php_compatible = false; - - /** @var null|string */ - private $new_phpdoc_type; - - /** @var null|string */ - private $new_psalm_type; - - /** @var string */ - private $indentation; - - /** @var bool */ - private $add_newline = false; - - /** @var string|null */ - private $type_description; - - public static function getForProperty( - ProjectAnalyzer $project_analyzer, - string $file_path, - Property $stmt - ): self { - if (isset(self::$manipulators[$file_path][$stmt->getLine()])) { - return self::$manipulators[$file_path][$stmt->getLine()]; - } - - $manipulator - = self::$manipulators[$file_path][$stmt->getLine()] - = new self($project_analyzer, $stmt, $file_path); - - return $manipulator; - } - - private function __construct( - ProjectAnalyzer $project_analyzer, - Property $stmt, - string $file_path - ) { - $this->stmt = $stmt; - $docblock = $stmt->getDocComment(); - $this->docblock_start = $docblock ? $docblock->getStartFilePos() : (int)$stmt->getAttribute('startFilePos'); - $this->docblock_end = (int)$stmt->getAttribute('startFilePos'); - - $codebase = $project_analyzer->getCodebase(); - - $file_contents = $codebase->getFileContents($file_path); - - if (count($stmt->props) > 1) { - $config = Config::getInstance(); - if ($config->isInProjectDirs($file_path)) { - throw new UnexpectedValueException('Cannot replace multiple inline properties in ' . $file_path); - } - - $this->indentation = ''; - - return; - } - - $prop = $stmt->props[0]; - - if ($stmt->type) { - $this->typehint_start = (int)$stmt->type->getAttribute('startFilePos'); - $this->typehint_end = (int)$stmt->type->getAttribute('endFilePos'); - } - - $this->typehint_area_start = (int)$prop->getAttribute('startFilePos') - 1; - - $preceding_newline_pos = strrpos($file_contents, "\n", $this->docblock_end - strlen($file_contents)); - - if ($preceding_newline_pos === false) { - $this->indentation = ''; - - return; - } - - if (!$docblock) { - $preceding_semicolon_pos = strrpos($file_contents, ";", $preceding_newline_pos - strlen($file_contents)); - - if ($preceding_semicolon_pos) { - $preceding_space = substr( - $file_contents, - $preceding_semicolon_pos + 1, - $preceding_newline_pos - $preceding_semicolon_pos - 1 - ); - - if (!substr_count($preceding_space, "\n")) { - $this->add_newline = true; - } - } - } - - $first_line = substr($file_contents, $preceding_newline_pos + 1, $this->docblock_end - $preceding_newline_pos); - - $this->indentation = str_replace(ltrim($first_line), '', $first_line); - } - - public function setType( - ?string $php_type, - string $new_type, - string $phpdoc_type, - bool $is_php_compatible, - ?string $description = null - ): void { - $new_type = str_replace(['', '', ''], '', $new_type); - - $this->new_php_type = $php_type; - $this->new_phpdoc_type = $phpdoc_type; - $this->new_psalm_type = $new_type; - $this->type_is_php_compatible = $is_php_compatible; - $this->type_description = $description; - } - - /** - * Gets a new docblock given the existing docblock, if one exists, and the updated return types - * and/or parameters - * - */ - private function getDocblock(): string - { - $docblock = $this->stmt->getDocComment(); - - if ($docblock) { - $parsed_docblock = DocComment::parsePreservingLength($docblock); - } else { - $parsed_docblock = new ParsedDocblock('', []); - } - - $modified_docblock = false; - - $old_phpdoc_type = null; - if (isset($parsed_docblock->tags['var'])) { - $old_phpdoc_type = array_shift($parsed_docblock->tags['var']); - } - - if ($this->new_phpdoc_type - && $this->new_phpdoc_type !== $old_phpdoc_type - ) { - $modified_docblock = true; - $parsed_docblock->tags['var'] = [ - $this->new_phpdoc_type - . ($this->type_description ? (' ' . $this->type_description) : ''), - ]; - } - - $old_psalm_type = null; - if (isset($parsed_docblock->tags['psalm-var'])) { - $old_psalm_type = array_shift($parsed_docblock->tags['psalm-var']); - } - - if ($this->new_psalm_type - && $this->new_phpdoc_type !== $this->new_psalm_type - && $this->new_psalm_type !== $old_psalm_type - ) { - $modified_docblock = true; - $parsed_docblock->tags['psalm-var'] = [$this->new_psalm_type]; - } - - if (!$parsed_docblock->tags && !$parsed_docblock->description) { - return ''; - } - - if (!$modified_docblock) { - return (string)$docblock . "\n" . $this->indentation; - } - - return $parsed_docblock->render($this->indentation); - } - - /** - * @return array - */ - public static function getManipulationsForFile(string $file_path): array - { - if (!isset(self::$manipulators[$file_path])) { - return []; - } - - $file_manipulations = []; - - foreach (self::$manipulators[$file_path] as $manipulator) { - if ($manipulator->new_php_type) { - if ($manipulator->typehint_start && $manipulator->typehint_end) { - $file_manipulations[$manipulator->typehint_start] = new FileManipulation( - $manipulator->typehint_start, - $manipulator->typehint_end, - $manipulator->new_php_type - ); - } else { - $file_manipulations[$manipulator->typehint_area_start] = new FileManipulation( - $manipulator->typehint_area_start, - $manipulator->typehint_area_start, - ' ' . $manipulator->new_php_type - ); - } - } elseif ($manipulator->new_php_type === '' - && $manipulator->new_phpdoc_type - && $manipulator->typehint_start - && $manipulator->typehint_end - ) { - $file_manipulations[$manipulator->typehint_start] = new FileManipulation( - $manipulator->typehint_start, - $manipulator->typehint_end, - '' - ); - } - - if (!$manipulator->new_php_type - || !$manipulator->type_is_php_compatible - || $manipulator->docblock_start !== $manipulator->docblock_end - ) { - $file_manipulations[$manipulator->docblock_start] = new FileManipulation( - $manipulator->docblock_start - - ($manipulator->add_newline ? strlen($manipulator->indentation) : 0), - $manipulator->docblock_end, - ($manipulator->add_newline ? "\n" . $manipulator->indentation : '') - . $manipulator->getDocblock() - ); - } - } - - return $file_manipulations; - } - - public static function clearCache(): void - { - self::$manipulators = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php deleted file mode 100644 index bd1e1460..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php +++ /dev/null @@ -1,7 +0,0 @@ -data = $data; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php deleted file mode 100644 index 0794c9d8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php +++ /dev/null @@ -1,17 +0,0 @@ -message = $message; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php deleted file mode 100644 index 7c432203..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php +++ /dev/null @@ -1,20 +0,0 @@ -data = $data; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php deleted file mode 100644 index 3d0ad04a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php +++ /dev/null @@ -1,492 +0,0 @@ -> $process_task_data_iterator - * An array of task data items to be divided up among the - * workers. The size of this is the number of forked processes. - * @param Closure $startup_closure - * A closure to execute upon starting a child - * @param Closure(int, mixed):mixed $task_closure - * A method to execute on each task data. - * This closure must return an array (to be gathered). - * @param Closure():mixed $shutdown_closure - * A closure to execute upon shutting down a child - * @param Closure(mixed $data):void $task_done_closure - * A closure to execute when a task is done - * - * @psalm-suppress MixedAssignment - */ - public function __construct( - Config $config, - array $process_task_data_iterator, - Closure $startup_closure, - Closure $task_closure, - Closure $shutdown_closure, - ?Closure $task_done_closure = null - ) { - $pool_size = count($process_task_data_iterator); - $this->task_done_closure = $task_done_closure; - $this->config = $config; - - assert( - $pool_size > 1, - 'The pool size must be >= 2 to use the fork pool.' - ); - - if (!extension_loaded('pcntl') || !extension_loaded('posix')) { - echo - 'The pcntl & posix extensions must be loaded in order for Psalm to be able to use multiple processes.' - . PHP_EOL; - exit(1); - } - - $disabled_functions = array_map('trim', explode(',', ini_get('disable_functions'))); - if (in_array('pcntl_fork', $disabled_functions)) { - echo "pcntl_fork() is disabled by php configuration (disable_functions directive).\n" - . "Please enable it or run Psalm single-threaded with --threads=1 cli switch.\n"; - exit(1); - } - - if (ini_get('pcre.jit') === '1' - && PHP_OS === 'Darwin' - && version_compare(PHP_VERSION, '7.3.0') >= 0 - && version_compare(PHP_VERSION, '7.4.0') < 0 - ) { - die( - self::MAC_PCRE_MESSAGE . PHP_EOL - ); - } - - // We'll keep track of if this is the parent process - // so that we can tell who will be doing the waiting - $is_parent = false; - - $sockets = []; - - // Fork as many times as requested to get the given - // pool size - for ($proc_id = 0; $proc_id < $pool_size; ++$proc_id) { - // Create an IPC socket pair. - $sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP); - if (!$sockets) { - error_log('unable to create stream socket pair'); - exit(self::EXIT_FAILURE); - } - - // Fork - if (($pid = pcntl_fork()) < 0) { - error_log(posix_strerror(posix_get_last_error())); - exit(self::EXIT_FAILURE); - } - - // Parent - if ($pid > 0) { - $is_parent = true; - $this->child_pid_list[] = $pid; - $this->read_streams[] = self::streamForParent($sockets); - continue; - } - - // Child - if ($pid === 0) { - $is_parent = false; - break; - } - } - - // If we're the parent, return - if ($is_parent) { - return; - } - - // Get the write stream for the child. - $write_stream = self::streamForChild($sockets); - - // Execute anything the children wanted to execute upon - // starting up - $startup_closure(); - - // Get the work for this process - $task_data_iterator = array_values($process_task_data_iterator)[$proc_id]; - - $task_done_buffer = ''; - - try { - foreach ($task_data_iterator as $i => $task_data) { - $task_result = $task_closure($i, $task_data); - - $task_done_message = new ForkTaskDoneMessage($task_result); - if ($this->config->use_igbinary) { - $encoded_message = base64_encode(igbinary_serialize($task_done_message)); - } else { - $encoded_message = base64_encode(serialize($task_done_message)); - } - $serialized_message = $task_done_buffer . $encoded_message . "\n"; - - if (strlen($serialized_message) > 200) { - $bytes_written = @fwrite($write_stream, $serialized_message); - - if (strlen($serialized_message) !== $bytes_written) { - $task_done_buffer = substr($serialized_message, $bytes_written); - } else { - $task_done_buffer = ''; - } - } else { - $task_done_buffer = $serialized_message; - } - } - - // Execute each child's shutdown closure before - // exiting the process - $results = $shutdown_closure(); - - // Serialize this child's produced results and send them to the parent. - $process_done_message = new ForkProcessDoneMessage($results ?: []); - } catch (Throwable $t) { - // This can happen when developing Psalm from source without running `composer update`, - // or because of rare bugs in Psalm. - $process_done_message = new ForkProcessErrorMessage( - get_class($t) . ' ' . $t->getMessage() . "\n" . - "Emitted in " . $t->getFile() . ":" . $t->getLine() . "\n" . - "Stack trace in the forked worker:\n" . - $t->getTraceAsString() - ); - } - - if ($this->config->use_igbinary) { - $encoded_message = base64_encode(igbinary_serialize($process_done_message)); - } else { - $encoded_message = base64_encode(serialize($process_done_message)); - } - $serialized_message = $task_done_buffer . $encoded_message . "\n"; - - $bytes_to_write = strlen($serialized_message); - $bytes_written = 0; - - while ($bytes_written < $bytes_to_write && !feof($write_stream)) { - // attempt to write the remaining unsent part - $bytes_written += @fwrite($write_stream, substr($serialized_message, $bytes_written)); - - if ($bytes_written < $bytes_to_write) { - // wait a bit - usleep(500000); - } - } - - fclose($write_stream); - - // Children exit after completing their work - exit(self::EXIT_SUCCESS); - } - - /** - * Prepare the socket pair to be used in a parent process and - * return the stream the parent will use to read results. - * - * @param resource[] $sockets the socket pair for IPC - * - * @return resource - */ - private static function streamForParent(array $sockets) - { - [$for_read, $for_write] = $sockets; - - // The parent will not use the write channel, so it - // must be closed to prevent deadlock. - fclose($for_write); - - // stream_select will be used to read multiple streams, so these - // must be set to non-blocking mode. - if (!stream_set_blocking($for_read, false)) { - error_log('unable to set read stream to non-blocking'); - exit(self::EXIT_FAILURE); - } - - return $for_read; - } - - /** - * Prepare the socket pair to be used in a child process and return - * the stream the child will use to write results. - * - * @param resource[] $sockets the socket pair for IPC - * - * @return resource - */ - private static function streamForChild(array $sockets) - { - [$for_read, $for_write] = $sockets; - - // The while will not use the read channel, so it must - // be closed to prevent deadlock. - fclose($for_read); - - return $for_write; - } - - /** - * Read the results that each child process has serialized on their write streams. - * The results are returned in an array, one for each worker. The order of the results - * is not maintained. - * - * - * @psalm-suppress MixedAssignment - * - * @return list - */ - private function readResultsFromChildren(): array - { - // Create an array of all active streams, indexed by - // resource id. - $streams = []; - foreach ($this->read_streams as $stream) { - $streams[(int)$stream] = $stream; - } - - // Create an array for the content received on each stream, - // indexed by resource id. - $content = array_fill_keys(array_keys($streams), ''); - - $terminationMessages = []; - - // Read the data off of all the stream. - while (count($streams) > 0) { - $needs_read = array_values($streams); - $needs_write = null; - $needs_except = null; - - // Wait for data on at least one stream. - $num = @stream_select($needs_read, $needs_write, $needs_except, null /* no timeout */); - if ($num === false) { - $err = error_get_last(); - - // stream_select returns false when the `select` system call is interrupted by an incoming signal - if (isset($err['message']) && stripos($err['message'], 'interrupted system call') === false) { - error_log('unable to select on read stream'); - exit(self::EXIT_FAILURE); - } - - continue; - } - - // For each stream that was ready, read the content. - foreach ($needs_read as $file) { - $buffer = fread($file, 1024); - if ($buffer !== false) { - $content[(int)$file] .= $buffer; - } - - if (strpos($buffer, "\n") !== false) { - $serialized_messages = explode("\n", $content[(int)$file]); - $content[(int)$file] = array_pop($serialized_messages); - - foreach ($serialized_messages as $serialized_message) { - if ($this->config->use_igbinary) { - $message = igbinary_unserialize(base64_decode($serialized_message, true)); - } else { - $message = unserialize(base64_decode($serialized_message, true)); - } - - if ($message instanceof ForkProcessDoneMessage) { - $terminationMessages[] = $message->data; - } elseif ($message instanceof ForkTaskDoneMessage) { - if ($this->task_done_closure !== null) { - ($this->task_done_closure)($message->data); - } - } elseif ($message instanceof ForkProcessErrorMessage) { - // Kill all children - foreach ($this->child_pid_list as $child_pid) { - /** - * SIGTERM does not exist on windows - * @psalm-suppress UnusedPsalmSuppress - * @psalm-suppress UndefinedConstant - * @psalm-suppress MixedArgument - */ - posix_kill($child_pid, SIGTERM); - } - throw new Exception($message->message); - } else { - error_log('Child should return ForkMessage - response type=' . gettype($message)); - $this->did_have_error = true; - } - } - } - - // If the stream has closed, stop trying to select on it. - if (feof($file)) { - if ($content[(int)$file] !== '') { - error_log('Child did not send full message before closing the connection'); - $this->did_have_error = true; - } - - fclose($file); - unset($streams[(int)$file]); - } - } - } - - return $terminationMessages; - } - - /** - * Wait for all child processes to complete - * - * @return list - */ - public function wait(): array - { - $ignore_return_code = false; - try { - // Read all the streams from child processes into an array. - $content = $this->readResultsFromChildren(); - } catch (Throwable $e) { - // If children were killed because one of them threw an exception we don't care about return codes. - $ignore_return_code = true; - // PHP guarantees finally is run even after throwing - throw $e; - } finally { - // Wait for all children to return - foreach ($this->child_pid_list as $child_pid) { - $process_lookup = posix_kill($child_pid, 0); - - $status = 0; - - if ($process_lookup) { - /** - * SIGALRM does not exist on windows - * @psalm-suppress UnusedPsalmSuppress - * @psalm-suppress UndefinedConstant - * @psalm-suppress MixedArgument - */ - posix_kill($child_pid, SIGALRM); - - if (pcntl_waitpid($child_pid, $status) < 0) { - error_log(posix_strerror(posix_get_last_error())); - } - } - - // Check to see if the child died a graceful death - if (!$ignore_return_code && pcntl_wifsignaled($status)) { - $return_code = pcntl_wexitstatus($status); - $term_sig = pcntl_wtermsig($status); - - /** - * SIGALRM does not exist on windows - * @psalm-suppress UnusedPsalmSuppress - * @psalm-suppress UndefinedConstant - */ - if ($term_sig !== SIGALRM) { - $this->did_have_error = true; - error_log("Child terminated with return code $return_code and signal $term_sig"); - } - } - } - } - - return $content; - } - - /** - * Returns true if this had an error, e.g. due to memory limits or due to a child process crashing. - * - */ - public function didHaveError(): bool - { - return $this->did_have_error; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php deleted file mode 100644 index 0ca2e1ac..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php +++ /dev/null @@ -1,68 +0,0 @@ -disabledExtensions[] = $disabledExtension; - } - - /** - * No type hint to allow xdebug-handler v1 and v2 usage - * @param bool $default - */ - protected function requiresRestart($default): bool - { - $this->required = (bool) array_filter( - $this->disabledExtensions, - function (string $extension): bool { - return extension_loaded($extension); - } - ); - - return $default || $this->required; - } - - /** - * No type hint to allow xdebug-handler v1 and v2 usage - * @param string|string[] $command - */ - protected function restart($command): void - { - if ($this->required && $this->tmpIni) { - $regex = '/^\s*(extension\s*=.*(' . implode('|', $this->disabledExtensions) . ').*)$/mi'; - $content = file_get_contents($this->tmpIni); - - $content = preg_replace($regex, ';$1', $content); - - file_put_contents($this->tmpIni, $content); - } - - /** @psalm-suppress PossiblyInvalidArgument */ - parent::restart($command); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php deleted file mode 100644 index 6cd24779..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php +++ /dev/null @@ -1,55 +0,0 @@ - */ - private $included_files = []; - - /** - * @template T - * @param callable():T $f - * @return T - */ - public function runAndCollect(callable $f) - { - $before = get_included_files(); - $ret = $f(); - $after = get_included_files(); - - $included = array_diff($after, $before); - - $this->included_files = array_values(array_unique(array_merge($this->included_files, $included))); - - return $ret; - } - - /** @return list */ - public function getIncludedFiles(): array - { - return $this->included_files; - } - - /** @return list */ - public function getFilteredIncludedFiles(): array - { - return array_values(preg_grep('@^phar://@', $this->getIncludedFiles(), PREG_GREP_INVERT)); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Json/Json.php b/vendor/vimeo/psalm/src/Psalm/Internal/Json/Json.php deleted file mode 100644 index 2e2445fe..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Json/Json.php +++ /dev/null @@ -1,46 +0,0 @@ -handler = $handler; - $this->mapper = $mapper; - } - - /** - * Diagnostics notification are sent from the server to the client to signal results of validation runs. - * - * @param Diagnostic[] $diagnostics - */ - public function publishDiagnostics(string $uri, array $diagnostics): void - { - $this->handler->notify('textDocument/publishDiagnostics', [ - 'uri' => $uri, - 'diagnostics' => $diagnostics, - ]); - } - - /** - * The content request is sent from a server to a client - * to request the current content of a text document identified by the URI - * - * @param TextDocumentIdentifier $textDocument The document to get the content for - * - * @return Promise The document's current content - */ - public function xcontent(TextDocumentIdentifier $textDocument): Promise - { - return call( - /** - * @return Generator, object, TextDocumentItem> - */ - function () use ($textDocument) { - /** @var Promise */ - $promise = $this->handler->request( - 'textDocument/xcontent', - ['textDocument' => $textDocument] - ); - - $result = yield $promise; - - /** @var TextDocumentItem */ - return $this->mapper->map($result, new TextDocumentItem); - } - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php deleted file mode 100644 index 8c701565..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php +++ /dev/null @@ -1,111 +0,0 @@ -protocolReader = $protocolReader; - $this->protocolWriter = $protocolWriter; - $this->idGenerator = new IdGenerator; - } - - /** - * Sends a request to the client and returns a promise that is resolved with the result or rejected with the error - * - * @param string $method The method to call - * @param array|object $params The method parameters - * - * @return Promise Resolved with the result of the request or rejected with an error - */ - public function request(string $method, $params): Promise - { - $id = $this->idGenerator->generate(); - - return call( - /** - * @return Generator> - */ - function () use ($id, $method, $params): Generator { - yield $this->protocolWriter->write( - new Message( - new Request($id, $method, (object) $params) - ) - ); - - $deferred = new Deferred(); - - $listener = - function (Message $msg) use ($id, $deferred, &$listener): void { - error_log('request handler'); - /** - * @psalm-suppress UndefinedPropertyFetch - * @psalm-suppress MixedArgument - */ - if ($msg->body - && Response::isResponse($msg->body) - && $msg->body->id === $id - ) { - // Received a response - $this->protocolReader->removeListener('message', $listener); - if (SuccessResponse::isSuccessResponse($msg->body)) { - $deferred->resolve($msg->body->result); - } else { - $deferred->fail($msg->body->error); - } - } - }; - $this->protocolReader->on('message', $listener); - - return $deferred->promise(); - } - ); - } - - /** - * Sends a notification to the client - * - * @param string $method The method to call - * @param array|object $params The method parameters - */ - public function notify(string $method, $params): void - { - $this->protocolWriter->write( - new Message( - new Notification($method, (object)$params) - ) - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php deleted file mode 100644 index 9f8f80ba..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php +++ /dev/null @@ -1,71 +0,0 @@ - $arguments - */ - public function emit( - string $eventName, - array $arguments = [], - ?callable $continueCallBack = null - ): void; - - /** - * Returns the list of listeners for an event. - * - * The list is returned as an array, and the list of events are sorted by - * their priority. - * - * @return callable[] - */ - public function listeners(string $eventName): array; - - /** - * Removes a specific listener from an event. - * - * If the listener could not be found, this method will return false. If it - * was removed it will return true. - * @psalm-suppress PossiblyUnusedReturnValue - */ - public function removeListener(string $eventName, callable $listener): bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php deleted file mode 100644 index 50535d0e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php +++ /dev/null @@ -1,157 +0,0 @@ - - */ - protected $listeners = []; - - /** - * Subscribe to an event. - */ - public function on(string $eventName, callable $callBack, int $priority = 100): void - { - if (!isset($this->listeners[$eventName])) { - $this->listeners[$eventName] = [ - true, // If there's only one item, it's sorted - [$priority], - [$callBack], - ]; - } else { - $this->listeners[$eventName][0] = false; // marked as unsorted - $this->listeners[$eventName][1][] = $priority; - $this->listeners[$eventName][2][] = $callBack; - } - } - - /** - * Emits an event. - * - * This method will return true if 0 or more listeners were successfully - * handled. false is returned if one of the events broke the event chain. - * - * If the continueCallBack is specified, this callback will be called every - * time before the next event handler is called. - * - * If the continueCallback returns false, event propagation stops. This - * allows you to use the eventEmitter as a means for listeners to implement - * functionality in your application, and break the event loop as soon as - * some condition is fulfilled. - * - * Note that returning false from an event subscriber breaks propagation - * and returns false, but if the continue-callback stops propagation, this - * is still considered a 'successful' operation and returns true. - * - * Lastly, if there are 5 event handlers for an event. The continueCallback - * will be called at most 4 times. - * - * @param list $arguments - */ - public function emit( - string $eventName, - array $arguments = [], - ?callable $continueCallBack = null - ): void { - if ($continueCallBack === null) { - foreach ($this->listeners($eventName) as $listener) { - /** @psalm-suppress MixedAssignment */ - $result = call_user_func_array($listener, $arguments); - if ($result === false) { - return; - } - } - } else { - $listeners = $this->listeners($eventName); - $counter = count($listeners); - - foreach ($listeners as $listener) { - --$counter; - /** @psalm-suppress MixedAssignment */ - $result = call_user_func_array($listener, $arguments); - if ($result === false) { - return; - } - - if ($counter > 0) { - if (!$continueCallBack()) { - break; - } - } - } - } - } - - /** - * Returns the list of listeners for an event. - * - * The list is returned as an array, and the list of events are sorted by - * their priority. - * - * @return callable[] - */ - public function listeners(string $eventName): array - { - if (!isset($this->listeners[$eventName])) { - return []; - } - - // The list is not sorted - if (!$this->listeners[$eventName][0]) { - // Sorting - array_multisort($this->listeners[$eventName][1], SORT_NUMERIC, $this->listeners[$eventName][2]); - - // Marking the listeners as sorted - $this->listeners[$eventName][0] = true; - } - - return $this->listeners[$eventName][2]; - } - - /** - * Removes a specific listener from an event. - * - * If the listener could not be found, this method will return false. If it - * was removed it will return true. - */ - public function removeListener(string $eventName, callable $listener): bool - { - if (!isset($this->listeners[$eventName])) { - return false; - } - foreach ($this->listeners[$eventName][2] as $index => $check) { - if ($check === $listener) { - unset($this->listeners[$eventName][1][$index], $this->listeners[$eventName][2][$index]); - - return true; - } - } - - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php deleted file mode 100644 index a7eee0fa..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php +++ /dev/null @@ -1,25 +0,0 @@ -counter++; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php deleted file mode 100644 index 9c2ef144..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php +++ /dev/null @@ -1,64 +0,0 @@ -handler = new ClientHandler($reader, $writer); - $mapper = new JsonMapper; - - $this->textDocument = new ClientTextDocument($this->handler, $mapper); - } - - /** - * Send a log message to the client. - * - * @param string $message The message to send to the client. - * @psalm-param 1|2|3|4 $type - * @param int $type The log type: - * - 1 = Error - * - 2 = Warning - * - 3 = Info - * - 4 = Log - */ - public function logMessage(string $message, int $type = 4, string $method = 'window/logMessage'): void - { - // https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window_logMessage - - if ($type < 1 || $type > 4) { - $type = 4; - } - - $this->handler->notify( - $method, - [ - 'type' => $type, - 'message' => $message - ] - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php deleted file mode 100644 index 30c48bec..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php +++ /dev/null @@ -1,575 +0,0 @@ - - */ - protected $onsave_paths_to_analyze = []; - - /** - * @var array - */ - protected $onchange_paths_to_analyze = []; - - /** - * @var array> - */ - protected $current_issues = []; - - public function __construct( - ProtocolReader $reader, - ProtocolWriter $writer, - ProjectAnalyzer $project_analyzer - ) { - parent::__construct($this, '/'); - $this->project_analyzer = $project_analyzer; - - $this->protocolWriter = $writer; - - $this->protocolReader = $reader; - $this->protocolReader->on( - 'close', - function (): void { - $this->shutdown(); - $this->exit(); - } - ); - $this->protocolReader->on( - 'message', - asyncCoroutine( - /** - * @return Generator - */ - function (Message $msg): Generator { - if (!$msg->body) { - return; - } - - // Ignore responses, this is the handler for requests and notifications - if (Response::isResponse($msg->body)) { - return; - } - - $result = null; - $error = null; - try { - // Invoke the method handler to get a result - /** - * @var Promise - */ - $dispatched = $this->dispatch($msg->body); - /** @psalm-suppress MixedAssignment */ - $result = yield $dispatched; - } catch (Error $e) { - // If a ResponseError is thrown, send it back in the Response - $error = $e; - } catch (Throwable $e) { - // If an unexpected error occurred, send back an INTERNAL_ERROR error response - $error = new Error( - (string) $e, - ErrorCode::INTERNAL_ERROR, - null, - $e - ); - } - // Only send a Response for a Request - // Notifications do not send Responses - /** - * @psalm-suppress UndefinedPropertyFetch - * @psalm-suppress MixedArgument - */ - if (Request::isRequest($msg->body)) { - if ($error !== null) { - $responseBody = new ErrorResponse($msg->body->id, $error); - } else { - $responseBody = new SuccessResponse($msg->body->id, $result); - } - yield $this->protocolWriter->write(new Message($responseBody)); - } - } - ) - ); - - $this->protocolReader->on( - 'readMessageGroup', - function (): void { - $this->doAnalysis(); - } - ); - - $this->client = new LanguageClient($reader, $writer); - - $this->verboseLog("Language server has started."); - } - - /** - * The initialize request is sent as the first request from the client to the server. - * - * @param ClientCapabilities $capabilities The capabilities provided by the client (editor) - * @param string|null $rootPath The rootPath of the workspace. Is null if no folder is open. - * @param int|null $processId The process Id of the parent process that started the server. - * Is null if the process has not been started by another process. If the parent process is - * not alive then the server should exit (see exit notification) its process. - * @psalm-return Promise - * @psalm-suppress PossiblyUnusedMethod - */ - public function initialize( - ClientCapabilities $capabilities, - ?string $rootPath = null, - ?int $processId = null - ): Promise { - return call( - /** @return Generator */ - function () { - $this->verboseLog("Initializing..."); - $this->clientStatus('initializing'); - - // Eventually, this might block on something. Leave it as a generator. - /** @psalm-suppress TypeDoesNotContainType */ - if (false) { - yield true; - } - - $this->verboseLog("Initializing: Getting code base..."); - $this->clientStatus('initializing', 'getting code base'); - $codebase = $this->project_analyzer->getCodebase(); - - $this->verboseLog("Initializing: Scanning files..."); - $this->clientStatus('initializing', 'scanning files'); - $codebase->scanFiles($this->project_analyzer->threads); - - $this->verboseLog("Initializing: Registering stub files..."); - $this->clientStatus('initializing', 'registering stub files'); - $codebase->config->visitStubFiles($codebase); - - if ($this->textDocument === null) { - $this->textDocument = new ServerTextDocument( - $this, - $codebase, - $this->project_analyzer - ); - } - - if ($this->workspace === null) { - $this->workspace = new ServerWorkspace( - $this, - $codebase, - $this->project_analyzer - ); - } - - $serverCapabilities = new ServerCapabilities(); - - $textDocumentSyncOptions = new TextDocumentSyncOptions(); - - $textDocumentSyncOptions->openClose = true; - - $saveOptions = new SaveOptions(); - $saveOptions->includeText = true; - $textDocumentSyncOptions->save = $saveOptions; - - if ($this->project_analyzer->onchange_line_limit === 0) { - $textDocumentSyncOptions->change = TextDocumentSyncKind::NONE; - } else { - $textDocumentSyncOptions->change = TextDocumentSyncKind::FULL; - } - - $serverCapabilities->textDocumentSync = $textDocumentSyncOptions; - - // Support "Find all symbols" - $serverCapabilities->documentSymbolProvider = false; - // Support "Find all symbols in workspace" - $serverCapabilities->workspaceSymbolProvider = false; - // Support "Go to definition" - $serverCapabilities->definitionProvider = true; - // Support "Find all references" - $serverCapabilities->referencesProvider = false; - // Support "Hover" - $serverCapabilities->hoverProvider = true; - // Support "Completion" - $serverCapabilities->codeActionProvider = true; - // Support "Code Actions" - - if ($this->project_analyzer->provide_completion) { - $serverCapabilities->completionProvider = new CompletionOptions(); - $serverCapabilities->completionProvider->resolveProvider = false; - $serverCapabilities->completionProvider->triggerCharacters = ['$', '>', ':',"[", "(", ",", " "]; - } - - $serverCapabilities->signatureHelpProvider = new SignatureHelpOptions(['(', ',']); - - // Support global references - $serverCapabilities->xworkspaceReferencesProvider = false; - $serverCapabilities->xdefinitionProvider = false; - $serverCapabilities->dependenciesProvider = false; - - $this->verboseLog("Initializing: Complete."); - $this->clientStatus('initialized'); - return new InitializeResult($serverCapabilities); - } - ); - } - - /** - * @psalm-suppress PossiblyUnusedMethod - * - */ - public function initialized(): void - { - $this->clientStatus('running'); - } - - public function queueTemporaryFileAnalysis(string $file_path, string $uri): void - { - $this->onchange_paths_to_analyze[$file_path] = $uri; - } - - public function queueFileAnalysis(string $file_path, string $uri): void - { - $this->onsave_paths_to_analyze[$file_path] = $uri; - } - - public function doAnalysis(): void - { - $this->clientStatus('analyzing'); - - try { - $codebase = $this->project_analyzer->getCodebase(); - - $all_files_to_analyze = $this->onchange_paths_to_analyze + $this->onsave_paths_to_analyze; - - if (!$all_files_to_analyze) { - return; - } - - if ($this->onsave_paths_to_analyze) { - $codebase->reloadFiles($this->project_analyzer, array_keys($this->onsave_paths_to_analyze)); - } - - if ($this->onchange_paths_to_analyze) { - $codebase->reloadFiles($this->project_analyzer, array_keys($this->onchange_paths_to_analyze)); - } - - $all_file_paths_to_analyze = array_keys($all_files_to_analyze); - $codebase->analyzer->addFilesToAnalyze( - array_combine($all_file_paths_to_analyze, $all_file_paths_to_analyze) - ); - $codebase->analyzer->analyzeFiles($this->project_analyzer, 1, false); - - $this->emitIssues($all_files_to_analyze); - - $this->onchange_paths_to_analyze = []; - $this->onsave_paths_to_analyze = []; - } finally { - // we are done, so set the status back to running - $this->clientStatus('running'); - } - } - - /** - * @param array $uris - * - */ - public function emitIssues(array $uris): void - { - $data = IssueBuffer::clear(); - $this->current_issues = $data; - - foreach ($uris as $file_path => $uri) { - $diagnostics = array_map( - function (IssueData $issue_data): Diagnostic { - //$check_name = $issue->check_name; - $description = $issue_data->message; - $severity = $issue_data->severity; - - $start_line = max($issue_data->line_from, 1); - $end_line = $issue_data->line_to; - $start_column = $issue_data->column_from; - $end_column = $issue_data->column_to; - // Language server has 0 based lines and columns, phan has 1-based lines and columns. - $range = new Range( - new Position($start_line - 1, $start_column - 1), - new Position($end_line - 1, $end_column - 1) - ); - switch ($severity) { - case Config::REPORT_INFO: - $diagnostic_severity = DiagnosticSeverity::WARNING; - break; - case Config::REPORT_ERROR: - default: - $diagnostic_severity = DiagnosticSeverity::ERROR; - break; - } - $diagnostic = new Diagnostic( - $description, - $range, - null, - $diagnostic_severity, - 'Psalm' - ); - - //$code = 'PS' . \str_pad((string) $issue_data->shortcode, 3, "0", \STR_PAD_LEFT); - $code = $issue_data->link; - - if ($this->project_analyzer->language_server_use_extended_diagnostic_codes) { - // Added in VSCode 1.43.0 and will be part of the LSP 3.16.0 standard. - // Since this new functionality is not backwards compatible, we use a - // configuration option so the end user must opt in to it using the cli argument. - // https://github.com/microsoft/vscode/blob/1.43.0/src/vs/vscode.d.ts#L4688-L4699 - - /** @psalm-suppress InvalidPropertyAssignmentValue */ - $diagnostic->code = [ - "value" => $code, - "target" => $issue_data->link, - ]; - } else { - // the Diagnostic constructor only takes `int` for the code, but the property can be - // `int` or `string`, so we set the property directly because we want to use a `string` - /** @psalm-suppress InvalidPropertyAssignmentValue */ - $diagnostic->code = $code; - } - - return $diagnostic; - }, - $data[$file_path] ?? [] - ); - - $this->client->textDocument->publishDiagnostics($uri, $diagnostics); - } - } - - /** - * The shutdown request is sent from the client to the server. It asks the server to shut down, - * but to not exit (otherwise the response might not be delivered correctly to the client). - * There is a separate exit notification that asks the server to exit. - * @psalm-suppress PossiblyUnusedReturnValue - */ - public function shutdown(): Promise - { - $this->clientStatus('closing'); - $this->verboseLog("Shutting down..."); - $codebase = $this->project_analyzer->getCodebase(); - $scanned_files = $codebase->scanner->getScannedFiles(); - $codebase->file_reference_provider->updateReferenceCache( - $codebase, - $scanned_files - ); - $this->clientStatus('closed'); - return new Success(null); - } - - /** - * A notification to ask the server to exit its process. - * - */ - public function exit(): void - { - exit(0); - } - - - /** - * Send log message to the client - * - * @param string $message The log message to send to the client. - * @psalm-param 1|2|3|4 $type - * @param int $type The log type: - * - 1 = Error - * - 2 = Warning - * - 3 = Info - * - 4 = Log - */ - public function verboseLog(string $message, int $type = 4): void - { - if ($this->project_analyzer->language_server_verbose) { - try { - $this->client->logMessage( - '[Psalm ' .PSALM_VERSION. ' - PHP Language Server] ' . $message, - $type - ); - } catch (Throwable $err) { - // do nothing - } - } - new Success(null); - } - - /** - * Send status message to client. This is the same as sending a log message, - * except this is meant for parsing by the client to present status updates in a UI. - * - * @param string $status The log message to send to the client. Should not contain colons `:`. - * @param string|null $additional_info This is additional info that the client - * can use as part of the display message. - */ - private function clientStatus(string $status, ?string $additional_info = null): void - { - try { - // here we send a notification to the client using the telemetry notification method - $this->client->logMessage( - $status . (!empty($additional_info) ? ': ' . $additional_info : ''), - 3, - 'telemetry/event' - ); - } catch (Throwable $err) { - // do nothing - } - new Success(null); - } - - /** - * Transforms an absolute file path into a URI as used by the language server protocol. - * - * @psalm-pure - */ - public static function pathToUri(string $filepath): string - { - $filepath = trim(str_replace('\\', '/', $filepath), '/'); - $parts = explode('/', $filepath); - // Don't %-encode the colon after a Windows drive letter - $first = array_shift($parts); - if (substr($first, -1) !== ':') { - $first = rawurlencode($first); - } - $parts = array_map('rawurlencode', $parts); - array_unshift($parts, $first); - $filepath = implode('/', $parts); - - return 'file:///' . $filepath; - } - - /** - * Transforms URI into file path - * - * - */ - public static function uriToPath(string $uri): string - { - $fragments = parse_url($uri); - if ($fragments === false - || !isset($fragments['scheme']) - || $fragments['scheme'] !== 'file' - || !isset($fragments['path']) - ) { - throw new InvalidArgumentException("Not a valid file URI: $uri"); - } - - $filepath = urldecode($fragments['path']); - - if (strpos($filepath, ':') !== false) { - if ($filepath[0] === '/') { - $filepath = substr($filepath, 1); - } - $filepath = str_replace('/', '\\', $filepath); - } - - $realpath = realpath($filepath); - if ($realpath !== false) { - return $realpath; - } - - return $filepath; - } - - /** - * Get the value of current_issues - * - * @return array> - */ - public function getCurrentIssues(): array - { - return $this->current_issues; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php deleted file mode 100644 index be336253..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php +++ /dev/null @@ -1,73 +0,0 @@ -body = MessageBody::parse(array_pop($parts)); - foreach ($parts as $line) { - if ($line) { - $pair = explode(': ', $line); - $obj->headers[$pair[0]] = $pair[1]; - } - } - - return $obj; - } - - /** - * @param string[] $headers - */ - public function __construct(?MessageBody $body = null, array $headers = []) - { - $this->body = $body; - if (!isset($headers['Content-Type'])) { - $headers['Content-Type'] = 'application/vscode-jsonrpc; charset=utf8'; - } - $this->headers = $headers; - } - - public function __toString(): string - { - $body = (string)$this->body; - $contentLength = strlen($body); - $this->headers['Content-Length'] = (string) $contentLength; - $headers = ''; - foreach ($this->headers as $name => $value) { - $headers .= "$name: $value\r\n"; - } - - return $headers . "\r\n" . $body; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php deleted file mode 100644 index dbc23d29..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php +++ /dev/null @@ -1,15 +0,0 @@ -, ?string, void> - */ - function () use ($input): Generator { - while ($this->is_accepting_new_requests) { - $read_promise = $input->read(); - - $chunk = yield $read_promise; - - if ($chunk === null) { - break; - } - - if ($this->readMessages($chunk) > 0) { - $this->emit('readMessageGroup'); - } - } - - $this->emitClose(); - } - ); - - $this->on( - 'close', - static function () use ($input): void { - $input->close(); - } - ); - } - - private function readMessages(string $buffer): int - { - $emitted_messages = 0; - $i = 0; - while (($buffer[$i] ?? '') !== '') { - $this->buffer .= $buffer[$i++]; - switch ($this->parsing_mode) { - case self::PARSE_HEADERS: - if ($this->buffer === "\r\n") { - $this->parsing_mode = self::PARSE_BODY; - $this->content_length = (int) ($this->headers['Content-Length'] ?? 0); - $this->buffer = ''; - } elseif (substr($this->buffer, -2) === "\r\n") { - $parts = explode(':', $this->buffer); - $this->headers[$parts[0]] = trim($parts[1]); - $this->buffer = ''; - } - break; - case self::PARSE_BODY: - if (strlen($this->buffer) === $this->content_length) { - if (!$this->is_accepting_new_requests) { - // If we fork, don't read any bytes in the input buffer from the worker process. - $this->emitClose(); - - return $emitted_messages; - } - // MessageBody::parse can throw an Error, maybe log an error? - try { - $msg = new Message(MessageBody::parse($this->buffer), $this->headers); - } catch (Exception $_) { - $msg = null; - } - if ($msg) { - ++$emitted_messages; - $this->emit('message', [$msg]); - /** - * @psalm-suppress DocblockTypeContradiction - */ - if (!$this->is_accepting_new_requests) { - // If we fork, don't read any bytes in the input buffer from the worker process. - $this->emitClose(); - - return $emitted_messages; - } - } - $this->parsing_mode = self::PARSE_HEADERS; - $this->headers = []; - $this->buffer = ''; - } - break; - } - } - - return $emitted_messages; - } - - private function emitClose(): void - { - if ($this->did_emit_close) { - return; - } - $this->did_emit_close = true; - $this->emit('close'); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php deleted file mode 100644 index cedd7c70..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php +++ /dev/null @@ -1,35 +0,0 @@ -output = new ResourceOutputStream($output); - } - - /** - * {@inheritdoc} - */ - public function write(Message $msg): Promise - { - return $this->output->write((string)$msg); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php deleted file mode 100644 index 6d5ce01e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php +++ /dev/null @@ -1,18 +0,0 @@ -server = $server; - $this->codebase = $codebase; - $this->project_analyzer = $project_analyzer; - } - - /** - * The document open notification is sent from the client to the server to signal newly opened text documents. The - * document’s content is now managed by the client and the server must not try to read the document’s content using - * the document’s Uri. Open in this sense means it is managed by the client. It doesn’t necessarily mean that its - * content is presented in an editor. An open notification must not be sent more than once without a corresponding - * close notification send before. This means open and close notification must be balanced and the max open count - * for a particular textDocument is one. Note that a server’s ability to fulfill requests is independent of whether - * a text document is open or closed. - * - * @param TextDocumentItem $textDocument the document that was opened - */ - public function didOpen(TextDocumentItem $textDocument): void - { - $file_path = LanguageServer::uriToPath($textDocument->uri); - - if (!$this->codebase->config->isInProjectDirs($file_path)) { - return; - } - - $this->codebase->file_provider->openFile($file_path); - - $this->server->queueFileAnalysis($file_path, $textDocument->uri); - } - - /** - * The document save notification is sent from the client to the server when the document was saved in the client - * - * @param TextDocumentItem $textDocument the document that was opened - * @param ?string $text the content when saved - */ - public function didSave(TextDocumentItem $textDocument, ?string $text): void - { - $file_path = LanguageServer::uriToPath($textDocument->uri); - - if (!$this->codebase->config->isInProjectDirs($file_path)) { - return; - } - - // reopen file - $this->codebase->removeTemporaryFileChanges($file_path); - $this->codebase->file_provider->setOpenContents($file_path, (string) $text); - - $this->server->queueFileAnalysis($file_path, $textDocument->uri); - } - - /** - * The document change notification is sent from the client to the server to signal changes to a text document. - * - * @param VersionedTextDocumentIdentifier $textDocument - * @param TextDocumentContentChangeEvent[] $contentChanges - */ - public function didChange(VersionedTextDocumentIdentifier $textDocument, array $contentChanges): void - { - $file_path = LanguageServer::uriToPath($textDocument->uri); - - if (!$this->codebase->config->isInProjectDirs($file_path)) { - return; - } - - if (count($contentChanges) === 1 && $contentChanges[0]->range === null) { - $new_content = $contentChanges[0]->text; - } else { - throw new UnexpectedValueException('Not expecting partial diff'); - } - - if ($this->project_analyzer->onchange_line_limit !== null) { - if (substr_count($new_content, "\n") > $this->project_analyzer->onchange_line_limit) { - return; - } - } - - $this->codebase->addTemporaryFileChanges($file_path, $new_content); - $this->server->queueTemporaryFileAnalysis($file_path, $textDocument->uri); - } - - /** - * The document close notification is sent from the client to the server when the document got closed in the client. - * The document’s master now exists where the document’s Uri points to (e.g. if the document’s Uri is a file Uri the - * master now exists on disk). As with the open notification the close notification is about managing the document’s - * content. Receiving a close notification doesn’t mean that the document was open in an editor before. A close - * notification requires a previous open notification to be sent. Note that a server’s ability to fulfill requests - * is independent of whether a text document is open or closed. - * - * @param TextDocumentIdentifier $textDocument The document that was closed - * - */ - public function didClose(TextDocumentIdentifier $textDocument): void - { - $file_path = LanguageServer::uriToPath($textDocument->uri); - - $this->codebase->file_provider->closeFile($file_path); - $this->server->client->textDocument->publishDiagnostics($textDocument->uri, []); - } - - /** - * The goto definition request is sent from the client to the server to resolve the definition location of a symbol - * at a given text document position. - * - * @param TextDocumentIdentifier $textDocument The text document - * @param Position $position The position inside the text document - * @psalm-return Promise|Promise - */ - public function definition(TextDocumentIdentifier $textDocument, Position $position): Promise - { - $file_path = LanguageServer::uriToPath($textDocument->uri); - - try { - $reference_location = $this->codebase->getReferenceAtPosition($file_path, $position); - } catch (UnanalyzedFileException $e) { - $this->codebase->file_provider->openFile($file_path); - $this->server->queueFileAnalysis($file_path, $textDocument->uri); - - return new Success(null); - } - - if ($reference_location === null) { - return new Success(null); - } - - [$reference] = $reference_location; - - $code_location = $this->codebase->getSymbolLocation($file_path, $reference); - - if (!$code_location) { - return new Success(null); - } - - return new Success( - new Location( - LanguageServer::pathToUri($code_location->file_path), - new Range( - new Position($code_location->getLineNumber() - 1, $code_location->getColumn() - 1), - new Position($code_location->getEndLineNumber() - 1, $code_location->getEndColumn() - 1) - ) - ) - ); - } - - /** - * The hover request is sent from the client to the server to request - * hover information at a given text document position. - * - * @param TextDocumentIdentifier $textDocument The text document - * @param Position $position The position inside the text document - * @psalm-return Promise|Promise - */ - public function hover(TextDocumentIdentifier $textDocument, Position $position): Promise - { - $file_path = LanguageServer::uriToPath($textDocument->uri); - - try { - $reference_location = $this->codebase->getReferenceAtPosition($file_path, $position); - } catch (UnanalyzedFileException $e) { - $this->codebase->file_provider->openFile($file_path); - $this->server->queueFileAnalysis($file_path, $textDocument->uri); - - return new Success(null); - } - - if ($reference_location === null) { - return new Success(null); - } - - [$reference, $range] = $reference_location; - - $symbol_information = $this->codebase->getSymbolInformation($file_path, $reference); - - if ($symbol_information === null) { - return new Success(null); - } - - $content = "```php\n" . $symbol_information['type'] . "\n```"; - if (isset($symbol_information['description'])) { - $content .= "\n---\n" . $symbol_information['description']; - } - $contents = new MarkupContent( - MarkupKind::MARKDOWN, - $content - ); - - return new Success(new Hover($contents, $range)); - } - - /** - * The Completion request is sent from the client to the server to compute completion items at a given cursor - * position. Completion items are presented in the IntelliSense user interface. If computing full completion items - * is expensive, servers can additionally provide a handler for the completion item resolve request - * ('completionItem/resolve'). This request is sent when a completion item is selected in the user interface. A - * typically use case is for example: the 'textDocument/completion' request doesn't fill in the documentation - * property for returned completion items since it is expensive to compute. When the item is selected in the user - * interface then a 'completionItem/resolve' request is sent with the selected completion item as a param. The - * returned completion item should have the documentation property filled in. - * - * @param TextDocumentIdentifier $textDocument The text document - * @param Position $position The position - * @psalm-return Promise>|Promise - */ - public function completion(TextDocumentIdentifier $textDocument, Position $position): Promise - { - $file_path = LanguageServer::uriToPath($textDocument->uri); - if (!$this->codebase->config->isInProjectDirs($file_path)) { - return new Success([]); - } - - try { - $completion_data = $this->codebase->getCompletionDataAtPosition($file_path, $position); - } catch (UnanalyzedFileException $e) { - $this->codebase->file_provider->openFile($file_path); - $this->server->queueFileAnalysis($file_path, $textDocument->uri); - - return new Success([]); - } - - try { - $type_context = $this->codebase->getTypeContextAtPosition($file_path, $position); - } catch (UnexpectedValueException $e) { - error_log('completion errored at ' . $position->line . ':' . $position->character. - ', Reason: '.$e->getMessage()); - return new Success([]); - } - - if (!$completion_data && !$type_context) { - error_log('completion not found at ' . $position->line . ':' . $position->character); - return new Success([]); - } - - if ($completion_data) { - [$recent_type, $gap, $offset] = $completion_data; - - if ($gap === '->' || $gap === '::') { - $completion_items = $this->codebase->getCompletionItemsForClassishThing($recent_type, $gap); - } elseif ($gap === '[') { - $completion_items = $this->codebase->getCompletionItemsForArrayKeys($recent_type); - } else { - $completion_items = $this->codebase->getCompletionItemsForPartialSymbol( - $recent_type, - $offset, - $file_path - ); - } - } else { - $completion_items = $this->codebase->getCompletionItemsForType($type_context); - } - - return new Success(new CompletionList($completion_items, false)); - } - - /** - * The signature help request is sent from the client to the server to request signature - * information at a given cursor position. - */ - public function signatureHelp(TextDocumentIdentifier $textDocument, Position $position): Promise - { - $file_path = LanguageServer::uriToPath($textDocument->uri); - - try { - $argument_location = $this->codebase->getFunctionArgumentAtPosition($file_path, $position); - } catch (UnanalyzedFileException $e) { - $this->codebase->file_provider->openFile($file_path); - $this->server->queueFileAnalysis($file_path, $textDocument->uri); - - return new Success(new SignatureHelp()); - } - - if ($argument_location === null) { - return new Success(new SignatureHelp()); - } - - $signature_information = $this->codebase->getSignatureInformation($argument_location[0], $file_path); - - if (!$signature_information) { - return new Success(new SignatureHelp()); - } - - return new Success(new SignatureHelp([ - $signature_information, - ], 0, $argument_location[1])); - } - - /** - * The code action request is sent from the client to the server to compute commands - * for a given text document and range. These commands are typically code fixes to - * either fix problems or to beautify/refactor code. - * - */ - public function codeAction(TextDocumentIdentifier $textDocument, Range $range): Promise - { - $file_path = LanguageServer::uriToPath($textDocument->uri); - if (!$this->codebase->file_provider->isOpen($file_path)) { - return new Success(null); - } - - $issues = $this->server->getCurrentIssues(); - - if (empty($issues[$file_path])) { - return new Success(null); - } - - $file_contents = $this->codebase->getFileContents($file_path); - - $offsetStart = $range->start->toOffset($file_contents); - $offsetEnd = $range->end->toOffset($file_contents); - - $fixers = []; - foreach ($issues[$file_path] as $issue) { - if ($offsetStart === $issue->from && $offsetEnd === $issue->to) { - $snippetRange = new Range( - new Position($issue->line_from-1), - new Position($issue->line_to) - ); - - $indentation = ''; - if (preg_match('/^(\s*)/', $issue->snippet, $matches)) { - $indentation = $matches[1] ?? ''; - } - - $edit = new WorkspaceEdit([ - $textDocument->uri => [ - new TextEdit( - $snippetRange, - "{$indentation}/**\n". - "{$indentation} * @psalm-suppress {$issue->type}\n". - "{$indentation} */\n". - "{$issue->snippet}\n" - ) - ] - ]); - - //Suppress Ability - $fixers["suppress.{$issue->type}"] = [ - 'title' => "Suppress {$issue->type} for this line", - 'kind' => 'quickfix', - 'edit' => $edit - ]; - } - } - - if (empty($fixers)) { - return new Success(null); - } - - return new Success( - array_values($fixers) - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php deleted file mode 100644 index c1bc2bd7..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php +++ /dev/null @@ -1,78 +0,0 @@ -server = $server; - $this->codebase = $codebase; - $this->project_analyzer = $project_analyzer; - } - - /** - * The watched files notification is sent from the client to the server when the client - * detects changes to files and folders watched by the language client (note although - * the name suggest that only file events are sent it is about file system events - * which include folders as well). It is recommended that servers register for these - * file system events using the registration mechanism. In former implementations clients - * pushed file events without the server actively asking for it. - * - * @param FileEvent[] $changes - * @psalm-suppress PossiblyUnusedMethod - */ - public function didChangeWatchedFiles(array $changes): void - { - foreach ($changes as $change) { - $file_path = LanguageServer::uriToPath($change->uri); - - if ($change->type === FileChangeType::DELETED) { - $this->codebase->invalidateInformationForFile($file_path); - continue; - } - - if (!$this->codebase->config->isInProjectDirs($file_path)) { - continue; - } - - if ($this->project_analyzer->onchange_line_limit === 0) { - continue; - } - - //If the file is currently open then dont analyse it because its tracked by the client - if (!$this->codebase->file_provider->isOpen($file_path)) { - $this->server->queueFileAnalysis($file_path, $change->uri); - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php b/vendor/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php deleted file mode 100644 index cf4c81ba..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php +++ /dev/null @@ -1,70 +0,0 @@ -fq_class_name = $fq_class_name; - $this->method_name = $method_name; - } - - /** - * Takes any valid reference to a method id and converts - * it into a MethodIdentifier - * - * @param string|MethodIdentifier $method_id - * - * @psalm-pure - */ - public static function wrap($method_id): self - { - return is_string($method_id) ? static::fromMethodIdReference($method_id) : $method_id; - } - - /** - * @psalm-pure - */ - public static function isValidMethodIdReference(string $method_id): bool - { - return strpos($method_id, '::') !== false; - } - - /** - * @psalm-pure - */ - public static function fromMethodIdReference(string $method_id): self - { - if (!static::isValidMethodIdReference($method_id)) { - throw new InvalidArgumentException('Invalid method id reference provided: ' . $method_id); - } - // remove trailing backslash if it exists - $method_id = preg_replace('/^\\\\/', '', $method_id); - $method_id_parts = explode('::', $method_id); - return new self($method_id_parts[0], strtolower($method_id_parts[1])); - } - - /** @return non-empty-string */ - public function __toString(): string - { - return $this->fq_class_name . '::' . $this->method_name; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php deleted file mode 100644 index 2c96c6b1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php +++ /dev/null @@ -1,174 +0,0 @@ -stopTraversal = false; - } - - /** - * Recursively traverse a node. - * - * @param Node $node node to traverse - * - * @return Node Result of traversal (may be original node or new one) - */ - protected function traverseNode(Node $node): Node - { - foreach ($node->getSubNodeNames() as $name) { - $subNode = &$node->$name; - - if (is_array($subNode)) { - $subNode = $this->traverseArray($subNode); - if ($this->stopTraversal) { - break; - } - } elseif ($subNode instanceof Node) { - $traverseChildren = true; - foreach ($this->visitors as $visitor) { - $return = $visitor->enterNode($subNode, $traverseChildren); - if (null !== $return) { - if ($return instanceof Node) { - $subNode = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { - $traverseChildren = false; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } else { - throw new LogicException( - 'enterNode() returned invalid value of type ' . gettype($return) - ); - } - } - } - - if ($traverseChildren) { - $subNode = $this->traverseNode($subNode); - if ($this->stopTraversal) { - break; - } - } - - foreach ($this->visitors as $visitor) { - $return = $visitor->leaveNode($subNode); - if (null !== $return) { - if ($return instanceof Node) { - $subNode = $return; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } elseif (is_array($return)) { - throw new LogicException( - 'leaveNode() may only return an array ' . - 'if the parent structure is an array' - ); - } else { - throw new LogicException( - 'leaveNode() returned invalid value of type ' . gettype($return) - ); - } - } - } - } - } - - return $node; - } - - /** - * Recursively traverse array (usually of nodes). - * - * @param array $nodes Array to traverse - * - * @return array Result of traversal (may be original array or changed one) - */ - protected function traverseArray(array $nodes): array - { - $doNodes = []; - - foreach ($nodes as $i => &$node) { - if ($node instanceof Node) { - $traverseChildren = true; - foreach ($this->visitors as $visitor) { - $return = $visitor->enterNode($node, $traverseChildren); - if (null !== $return) { - if ($return instanceof Node) { - $node = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { - $traverseChildren = false; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } else { - throw new LogicException( - 'enterNode() returned invalid value of type ' . gettype($return) - ); - } - } - } - - if ($traverseChildren) { - $node = $this->traverseNode($node); - if ($this->stopTraversal) { - break; - } - } - - foreach ($this->visitors as $visitor) { - $return = $visitor->leaveNode($node); - if (null !== $return) { - if ($return instanceof Node) { - $node = $return; - } elseif (is_array($return)) { - $doNodes[] = [$i, $return]; - break; - } elseif (self::REMOVE_NODE === $return) { - $doNodes[] = [$i, []]; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } elseif (false === $return) { - throw new LogicException( - 'bool(false) return from leaveNode() no longer supported. ' . - 'Return NodeTraverser::REMOVE_NODE instead' - ); - } else { - throw new LogicException( - 'leaveNode() returned invalid value of type ' . gettype($return) - ); - } - } - } - } elseif (is_array($node)) { - throw new LogicException('Invalid node structure: Contains nested arrays'); - } - } - - if (!empty($doNodes)) { - while (list($i, $replace) = array_pop($doNodes)) { - array_splice($nodes, $i, 1, $replace); - } - } - - return $nodes; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php deleted file mode 100644 index a3fd78e2..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php +++ /dev/null @@ -1,117 +0,0 @@ -> - */ - protected $assignment_map = []; - - /** - * @var string|null - */ - protected $this_class_name; - - public function __construct(?string $this_class_name) - { - $this->this_class_name = $this_class_name; - } - - public function enterNode(PhpParser\Node $node): ?int - { - if ($node instanceof PhpParser\Node\Expr\Assign) { - $right_var_id = ExpressionIdentifier::getRootVarId($node->expr, $this->this_class_name); - - if ($node->var instanceof PhpParser\Node\Expr\List_ - || $node->var instanceof PhpParser\Node\Expr\Array_ - ) { - foreach ($node->var->items as $assign_item) { - if ($assign_item) { - $left_var_id = ExpressionIdentifier::getRootVarId($assign_item->value, $this->this_class_name); - - if ($left_var_id) { - $this->assignment_map[$left_var_id][$right_var_id ?: 'isset'] = true; - } - } - } - } else { - $left_var_id = ExpressionIdentifier::getRootVarId($node->var, $this->this_class_name); - - if ($left_var_id) { - $this->assignment_map[$left_var_id][$right_var_id ?: 'isset'] = true; - } - } - - return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; - } - - if ($node instanceof PhpParser\Node\Expr\PostInc - || $node instanceof PhpParser\Node\Expr\PostDec - || $node instanceof PhpParser\Node\Expr\PreInc - || $node instanceof PhpParser\Node\Expr\PreDec - || $node instanceof PhpParser\Node\Expr\AssignOp - ) { - $var_id = ExpressionIdentifier::getRootVarId($node->var, $this->this_class_name); - - if ($var_id) { - $this->assignment_map[$var_id][$var_id] = true; - } - - return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; - } - - if ($node instanceof PhpParser\Node\Expr\FuncCall - || $node instanceof PhpParser\Node\Expr\MethodCall - || $node instanceof PhpParser\Node\Expr\StaticCall - ) { - if (!$node->isFirstClassCallable()) { - foreach ($node->getArgs() as $arg) { - $arg_var_id = ExpressionIdentifier::getRootVarId($arg->value, $this->this_class_name); - - if ($arg_var_id) { - $this->assignment_map[$arg_var_id][$arg_var_id] = true; - } - } - } - - if ($node instanceof PhpParser\Node\Expr\MethodCall) { - $var_id = ExpressionIdentifier::getRootVarId($node->var, $this->this_class_name); - - if ($var_id) { - $this->assignment_map[$var_id]['isset'] = true; - } - } - } elseif ($node instanceof PhpParser\Node\Stmt\Unset_) { - foreach ($node->vars as $arg) { - $arg_var_id = ExpressionIdentifier::getRootVarId($arg, $this->this_class_name); - - if ($arg_var_id) { - $this->assignment_map[$arg_var_id][$arg_var_id] = true; - } - } - } - - return null; - } - - /** - * @return array> - */ - public function getAssignmentMap(): array - { - return $this->assignment_map; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php deleted file mode 100644 index a57eeabd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php +++ /dev/null @@ -1,80 +0,0 @@ - - */ - protected $non_trivial_expr = []; - - private function checkNonTrivialExpr(PhpParser\Node\Expr $node): bool - { - if ($node instanceof PhpParser\Node\Expr\ArrayDimFetch - || $node instanceof PhpParser\Node\Expr\Closure - || $node instanceof PhpParser\Node\Expr\ClosureUse - || $node instanceof PhpParser\Node\Expr\Eval_ - || $node instanceof PhpParser\Node\Expr\Exit_ - || $node instanceof PhpParser\Node\Expr\Include_ - || $node instanceof PhpParser\Node\Expr\FuncCall - || $node instanceof PhpParser\Node\Expr\MethodCall - || $node instanceof PhpParser\Node\Expr\ArrowFunction - || $node instanceof PhpParser\Node\Expr\ShellExec - || $node instanceof PhpParser\Node\Expr\StaticCall - || $node instanceof PhpParser\Node\Expr\Yield_ - || $node instanceof PhpParser\Node\Expr\YieldFrom - || $node instanceof PhpParser\Node\Expr\New_ - || $node instanceof PhpParser\Node\Expr\Cast\String_ - ) { - if (($node instanceof PhpParser\Node\Expr\FuncCall - || $node instanceof PhpParser\Node\Expr\MethodCall - || $node instanceof PhpParser\Node\Expr\StaticCall) - && $node->getAttribute('pure', false) - ) { - return false; - } - - if ($node instanceof PhpParser\Node\Expr\New_ && $node->getAttribute('external_mutation_free', false)) { - return false; - } - - return true; - } - - return false; - } - - public function enterNode(PhpParser\Node $node): ?int - { - if ($node instanceof PhpParser\Node\Expr) { - // Check for Non-Trivial Expression first - if ($this->checkNonTrivialExpr($node)) { - $this->non_trivial_expr[] = $node; - return PhpParser\NodeTraverser::STOP_TRAVERSAL; - } - - if ($node instanceof PhpParser\Node\Expr\ClassConstFetch - || $node instanceof PhpParser\Node\Expr\ConstFetch - || $node instanceof PhpParser\Node\Expr\Error - || $node instanceof PhpParser\Node\Expr\PropertyFetch - || $node instanceof PhpParser\Node\Expr\StaticPropertyFetch) { - return PhpParser\NodeTraverser::STOP_TRAVERSAL; - } - } - return null; - } - - /** - * @return array - */ - public function getNonTrivialExpr(): array - { - return $this->non_trivial_expr; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php deleted file mode 100644 index befd1d1a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php +++ /dev/null @@ -1,40 +0,0 @@ -getComments()) { - $node->setAttribute( - 'comments', - array_map( - /** - * @return Comment - */ - function (Comment $c): Comment { - return clone $c; - }, - $cs - ) - ); - } - - return $node; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php deleted file mode 100644 index c368f377..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php +++ /dev/null @@ -1,39 +0,0 @@ -type_provider = $old_type_provider; - } - - /** - * @return Node\Expr - */ - public function enterNode(Node $node): Node - { - /** @var Expr $node */ - $origNode = $node; - - $node = clone $node; - - $node_type = $this->type_provider->getType($origNode); - - if ($node_type) { - $this->type_provider->setType($node, clone $node_type); - } - - return $node; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php deleted file mode 100644 index f9515782..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php +++ /dev/null @@ -1,28 +0,0 @@ -type_provider = $type_provider; - } - - public function enterNode(PhpParser\Node $node): ?int - { - if ($node instanceof PhpParser\Node\Expr) { - $this->type_provider->clearNodeOfTypeAndAssertions($node); - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php deleted file mode 100644 index dd719035..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php +++ /dev/null @@ -1,21 +0,0 @@ -count++; - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php deleted file mode 100644 index 7e3de329..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php +++ /dev/null @@ -1,70 +0,0 @@ - */ - private $extra_offsets; - - /** - * @param array $extra_offsets - */ - public function __construct(int $offset, int $line_offset, array $extra_offsets) - { - $this->file_offset = $offset; - $this->line_offset = $line_offset; - $this->extra_offsets = $extra_offsets; - } - - public function enterNode(PhpParser\Node $node): ?int - { - /** @var array{startFilePos: int, endFilePos: int, startLine: int} */ - $attrs = $node->getAttributes(); - - if ($cs = $node->getComments()) { - $new_comments = []; - - foreach ($cs as $c) { - if ($c instanceof PhpParser\Comment\Doc) { - $new_comments[] = new PhpParser\Comment\Doc( - $c->getText(), - $c->getStartLine() + $this->line_offset, - $c->getStartFilePos() + $this->file_offset + ($this->extra_offsets[$c->getStartFilePos()] ?? 0) - ); - } else { - $new_comments[] = new PhpParser\Comment( - $c->getText(), - $c->getStartLine() + $this->line_offset, - $c->getStartFilePos() + $this->file_offset + ($this->extra_offsets[$c->getStartFilePos()] ?? 0) - ); - } - } - - $node->setAttribute('comments', $new_comments); - } - - $node->setAttribute( - 'startFilePos', - $attrs['startFilePos'] + $this->file_offset + ($this->extra_offsets[$attrs['startFilePos']] ?? 0) - ); - $node->setAttribute( - 'endFilePos', - $attrs['endFilePos'] + $this->file_offset + ($this->extra_offsets[$attrs['endFilePos']] ?? 0) - ); - $node->setAttribute('startLine', $attrs['startLine'] + $this->line_offset); - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php deleted file mode 100644 index 32fe8e34..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php +++ /dev/null @@ -1,122 +0,0 @@ - */ - private $replacements = []; - - /** @var bool */ - private $new_name_replaced = false; - - /** @var bool */ - private $new_new_name_used = false; - - public function __construct(string $old_name, string $new_name) - { - $this->old_name = $old_name; - $this->new_name = $new_name; - } - - public function enterNode(PhpParser\Node $node): ?int - { - if ($node instanceof PhpParser\Node\Expr\Variable) { - if ($node->name === $this->old_name) { - $this->replacements[] = new FileManipulation( - (int) $node->getAttribute('startFilePos') + 1, - (int) $node->getAttribute('endFilePos') + 1, - $this->new_name - ); - } elseif ($node->name === $this->new_name) { - if ($this->new_new_name_used) { - $this->replacements = []; - return PhpParser\NodeTraverser::STOP_TRAVERSAL; - } - - $this->replacements[] = new FileManipulation( - (int) $node->getAttribute('startFilePos') + 1, - (int) $node->getAttribute('endFilePos') + 1, - $this->new_name . '_new' - ); - - $this->new_name_replaced = true; - } elseif ($node->name === $this->new_name . '_new') { - if ($this->new_name_replaced) { - $this->replacements = []; - return PhpParser\NodeTraverser::STOP_TRAVERSAL; - } - - $this->new_new_name_used = true; - } - } elseif ($node instanceof PhpParser\Node\Stmt\ClassMethod - && ($docblock = $node->getDocComment()) - ) { - $parsed_docblock = DocblockParser::parse( - $docblock->getText(), - $docblock->getStartFilePos() - ); - - $replaced = false; - - foreach ($parsed_docblock->tags as $tag_name => $tags) { - foreach ($tags as $i => $tag) { - if ($tag_name === 'param' - || $tag_name === 'psalm-param' - || $tag_name === 'phpstan-param' - || $tag_name === 'phan-param' - ) { - $parts = CommentAnalyzer::splitDocLine($tag); - - if (($parts[1] ?? '') === '$' . $this->old_name) { - $parsed_docblock->tags[$tag_name][$i] = str_replace( - '$' . $this->old_name, - '$' . $this->new_name, - $tag - ); - $replaced = true; - } - } - } - } - - if ($replaced) { - $this->replacements[] = new FileManipulation( - $docblock->getStartFilePos(), - $docblock->getStartFilePos() + strlen($docblock->getText()), - rtrim($parsed_docblock->render($parsed_docblock->first_line_padding)), - false, - false - ); - } - } - - return null; - } - - /** - * @return list - */ - public function getReplacements(): array - { - return $this->replacements; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php deleted file mode 100644 index 9734be22..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php +++ /dev/null @@ -1,409 +0,0 @@ - */ - private $offset_map; - - /** @var bool */ - private $must_rescan = false; - - /** @var int */ - private $non_method_changes; - - /** @var string */ - private $a_file_contents; - - /** @var string */ - private $b_file_contents; - - /** @var int */ - private $a_file_contents_length; - - /** @var PhpParser\Parser */ - private $parser; - - /** @var PhpParser\ErrorHandler\Collecting */ - private $error_handler; - - /** @param array $offset_map */ - public function __construct( - PhpParser\Parser $parser, - PhpParser\ErrorHandler\Collecting $error_handler, - array $offset_map, - string $a_file_contents, - string $b_file_contents - ) { - $this->parser = $parser; - $this->error_handler = $error_handler; - $this->offset_map = $offset_map; - $this->a_file_contents = $a_file_contents; - $this->a_file_contents_length = strlen($a_file_contents); - $this->b_file_contents = $b_file_contents; - $this->non_method_changes = count($offset_map); - } - - /** - * @return null|int|PhpParser\Node - */ - public function enterNode(PhpParser\Node $node, bool &$traverseChildren = true) - { - /** @var array{startFilePos: int, endFilePos: int, startLine: int} */ - $attrs = $node->getAttributes(); - - if ($cs = $node->getComments()) { - $stmt_start_pos = $cs[0]->getStartFilePos(); - } else { - $stmt_start_pos = $attrs['startFilePos']; - } - - $stmt_end_pos = $attrs['endFilePos']; - - $start_offset = 0; - $end_offset = 0; - - $line_offset = 0; - - foreach ($this->offset_map as [$a_s, $a_e, $b_s, $b_e, $line_diff]) { - if ($a_s > $stmt_end_pos) { - break; - } - - $end_offset = $b_e - $a_e; - - if ($a_s < $stmt_start_pos) { - $start_offset = $b_s - $a_s; - } - - if ($a_e < $stmt_start_pos) { - $start_offset = $end_offset; - - $line_offset = $line_diff; - - continue; - } - - if ($node instanceof PhpParser\Node\Stmt\ClassMethod - || $node instanceof PhpParser\Node\Stmt\Namespace_ - || $node instanceof PhpParser\Node\Stmt\ClassLike - ) { - if ($node instanceof PhpParser\Node\Stmt\ClassMethod) { - if ($a_s >= $stmt_start_pos && $a_e <= $stmt_end_pos) { - foreach ($this->offset_map as [$a_s2, $a_e2, $b_s2, $b_e2]) { - if ($a_s2 > $stmt_end_pos) { - break; - } - - // we have a diff that goes outside the bounds that we care about - if ($a_e2 > $stmt_end_pos) { - $this->must_rescan = true; - - return PhpParser\NodeTraverser::STOP_TRAVERSAL; - } - - $end_offset = $b_e2 - $a_e2; - - if ($a_s2 < $stmt_start_pos) { - $start_offset = $b_s2 - $a_s2; - } - - if ($a_e2 < $stmt_start_pos) { - $start_offset = $end_offset; - - $line_offset = $line_diff; - - continue; - } - - if ($a_s2 >= $stmt_start_pos && $a_e2 <= $stmt_end_pos) { - --$this->non_method_changes; - } - } - - $stmt_start_pos += $start_offset; - $stmt_end_pos += $end_offset; - - $current_line = substr_count(substr($this->b_file_contents, 0, $stmt_start_pos), "\n"); - - $method_contents = substr( - $this->b_file_contents, - $stmt_start_pos, - $stmt_end_pos - $stmt_start_pos + 1 - ); - - if (!$method_contents) { - $this->must_rescan = true; - - return PhpParser\NodeTraverser::STOP_TRAVERSAL; - } - - $error_handler = new Collecting(); - - $fake_class = '|::)(\n\s*(if|list)\s*\()/', - $fake_class, - $matches, - PREG_OFFSET_CAPTURE | PREG_SET_ORDER - ); - - foreach ($matches as $match) { - $fake_class = substr_replace( - $fake_class, - $match[1][0] . ';' . $match[2][0], - $match[0][1], - strlen($match[0][0]) - ); - - $extra_characters[] = $match[2][1]; - } - - $replacement_stmts = $this->parser->parse( - $fake_class, - $error_handler - ) ?: []; - - if (!$replacement_stmts - || !$replacement_stmts[0] instanceof PhpParser\Node\Stmt\ClassLike - || count($replacement_stmts[0]->stmts) !== 1 - ) { - $hacky_class_fix = self::balanceBrackets($fake_class); - - if ($replacement_stmts - && $replacement_stmts[0] instanceof PhpParser\Node\Stmt\ClassLike - && count($replacement_stmts[0]->stmts) !== 1 - ) { - $this->must_rescan = true; - - return PhpParser\NodeTraverser::STOP_TRAVERSAL; - } - - // changes "): {" to ") {" - $hacky_class_fix = preg_replace('/(\)[\s]*):([\s]*\{)/', '$1 $2', $hacky_class_fix); - - if ($hacky_class_fix !== $fake_class) { - $replacement_stmts = $this->parser->parse( - $hacky_class_fix, - $error_handler - ) ?: []; - } - - if (!$replacement_stmts - || !$replacement_stmts[0] instanceof PhpParser\Node\Stmt\ClassLike - || count($replacement_stmts[0]->stmts) > 1 - ) { - $this->must_rescan = true; - - return PhpParser\NodeTraverser::STOP_TRAVERSAL; - } - } - - $replacement_stmts = $replacement_stmts[0]->stmts; - - $extra_offsets = []; - - foreach ($extra_characters as $extra_offset) { - $l = strlen($fake_class); - - for ($i = $extra_offset; $i < $l; $i++) { - if (isset($extra_offsets[$i])) { - $extra_offsets[$i]--; - } else { - $extra_offsets[$i] = -1; - } - } - } - - $renumbering_traverser = new PhpParser\NodeTraverser; - $position_shifter = new OffsetShifterVisitor( - $stmt_start_pos - 15, - $current_line, - $extra_offsets - ); - $renumbering_traverser->addVisitor($position_shifter); - $replacement_stmts = $renumbering_traverser->traverse($replacement_stmts); - - if ($error_handler->hasErrors()) { - foreach ($error_handler->getErrors() as $error) { - if ($error->hasColumnInfo()) { - /** @var array{startFilePos: int, endFilePos: int} */ - $error_attrs = $error->getAttributes(); - $error = new PhpParser\Error( - $error->getRawMessage(), - [ - 'startFilePos' => $stmt_start_pos + $error_attrs['startFilePos'] - 15, - 'endFilePos' => $stmt_start_pos + $error_attrs['endFilePos'] - 15, - 'startLine' => $error->getStartLine() + $current_line + $line_offset, - ] - ); - } - - $this->error_handler->handleError($error); - } - } - - $error_handler->clearErrors(); - - $traverseChildren = false; - - return reset($replacement_stmts); - } - - $this->must_rescan = true; - - return PhpParser\NodeTraverser::STOP_TRAVERSAL; - } - - if ($node->stmts) { - /** @var int */ - $stmt_inner_start_pos = $node->stmts[0]->getAttribute('startFilePos'); - - /** @var int */ - $stmt_inner_end_pos = $node->stmts[count($node->stmts) - 1]->getAttribute('endFilePos'); - - if ($node instanceof PhpParser\Node\Stmt\ClassLike) { - /** @psalm-suppress PossiblyFalseOperand */ - $stmt_inner_start_pos = strrpos( - $this->a_file_contents, - '{', - $stmt_inner_start_pos - $this->a_file_contents_length - ) + 1; - - if ($stmt_inner_end_pos < $this->a_file_contents_length) { - $stmt_inner_end_pos = strpos($this->a_file_contents, '}', $stmt_inner_end_pos + 1); - } - } - - if ($a_s > $stmt_inner_start_pos && $a_e < $stmt_inner_end_pos) { - continue; - } - } - } - - $this->must_rescan = true; - - return PhpParser\NodeTraverser::STOP_TRAVERSAL; - } - - if ($start_offset !== 0 || $end_offset !== 0 || $line_offset !== 0) { - if ($start_offset !== 0) { - if ($cs) { - $new_comments = []; - - foreach ($cs as $c) { - if ($c instanceof PhpParser\Comment\Doc) { - $new_comments[] = new PhpParser\Comment\Doc( - $c->getText(), - $c->getStartLine() + $line_offset, - $c->getStartFilePos() + $start_offset - ); - } else { - $new_comments[] = new PhpParser\Comment( - $c->getText(), - $c->getStartLine() + $line_offset, - $c->getStartFilePos() + $start_offset - ); - } - } - - $node->setAttribute('comments', $new_comments); - - $node->setAttribute('startFilePos', $attrs['startFilePos'] + $start_offset); - } else { - $node->setAttribute('startFilePos', $stmt_start_pos + $start_offset); - } - } - - if ($end_offset !== 0) { - $node->setAttribute('endFilePos', $stmt_end_pos + $end_offset); - } - - if ($line_offset !== 0) { - $node->setAttribute('startLine', $attrs['startLine'] + $line_offset); - } - - return $node; - } - - return null; - } - - public function mustRescan(): bool - { - return $this->must_rescan || $this->non_method_changes; - } - - /** - * @psalm-pure - */ - private static function balanceBrackets(string $fake_class): string - { - $tokens = token_get_all($fake_class); - - $brace_count = 0; - - foreach ($tokens as $token) { - if ($token === '{') { - ++$brace_count; - } elseif ($token === '}') { - --$brace_count; - } - } - - if ($brace_count > 0) { - $fake_class .= str_repeat('}', $brace_count); - } - - return $fake_class; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php deleted file mode 100644 index 9caf12d7..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php +++ /dev/null @@ -1,80 +0,0 @@ -name instanceof PhpParser\Node\Name\FullyQualified) { - $fq_type_string = (string)$stmt->name; - } else { - $fq_type_string = ClassLikeAnalyzer::getFQCLNFromNameObject($stmt->name, $aliases); - } - - $codebase->scanner->queueClassLikeForScanning($fq_type_string); - $file_storage->referenced_classlikes[strtolower($fq_type_string)] = $fq_type_string; - - $args = []; - - foreach ($stmt->args as $arg_node) { - $key = $arg_node->name->name ?? null; - - $const_type = SimpleTypeInferer::infer( - $codebase, - new NodeDataProvider(), - $arg_node->value, - $aliases, - null, - [], - $fq_classlike_name - ); - - if (!$const_type) { - $const_type = ExpressionResolver::getUnresolvedClassConstExpr( - $arg_node->value, - $aliases, - $fq_classlike_name - ); - } - - if (!$const_type) { - $const_type = Type::getMixed(); - } - - $args[] = new AttributeArg( - $key, - $const_type, - new CodeLocation($file_scanner, $arg_node->value) - ); - } - - return new AttributeStorage( - $fq_type_string, - $args, - new CodeLocation($file_scanner, $stmt), - new CodeLocation($file_scanner, $stmt->name) - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php deleted file mode 100644 index 4572df37..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php +++ /dev/null @@ -1,562 +0,0 @@ -getCodebase(); - - $info = new ClassLikeDocblockComment(); - - $templates = []; - if (isset($parsed_docblock->combined_tags['template'])) { - foreach ($parsed_docblock->combined_tags['template'] as $offset => $template_line) { - $template_type = preg_split('/[\s]+/', preg_replace('@^[ \t]*\*@m', '', $template_line)); - - $template_name = array_shift($template_type); - - if (!$template_name) { - throw new IncorrectDocblockException('Empty @template tag'); - } - - $source_prefix = 'none'; - if (isset($parsed_docblock->tags['psalm-template'][$offset])) { - $source_prefix = 'psalm'; - } elseif (isset($parsed_docblock->tags['phpstan-template'][$offset])) { - $source_prefix = 'phpstan'; - } - - if (count($template_type) > 1 - && in_array(strtolower($template_type[0]), ['as', 'super', 'of'], true) - ) { - $template_modifier = strtolower(array_shift($template_type)); - $templates[$template_name][$source_prefix] = [ - $template_name, - $template_modifier, - implode(' ', $template_type), - false, - $offset - $comment->getStartFilePos() - ]; - } else { - $templates[$template_name][$source_prefix] = [ - $template_name, - null, - null, - false, - $offset - $comment->getStartFilePos() - ]; - } - } - } - - if (isset($parsed_docblock->combined_tags['template-covariant'])) { - foreach ($parsed_docblock->combined_tags['template-covariant'] as $offset => $template_line) { - $template_type = preg_split('/[\s]+/', preg_replace('@^[ \t]*\*@m', '', $template_line)); - - $template_name = array_shift($template_type); - - if (!$template_name) { - throw new IncorrectDocblockException('Empty @template-covariant tag'); - } - - $source_prefix = 'none'; - if (isset($parsed_docblock->tags['psalm-template-covariant'][$offset])) { - $source_prefix = 'psalm'; - } elseif (isset($parsed_docblock->tags['phpstan-template-covariant'][$offset])) { - $source_prefix = 'phpstan'; - } - - if (count($template_type) > 1 - && in_array(strtolower($template_type[0]), ['as', 'super', 'of'], true) - ) { - $template_modifier = strtolower(array_shift($template_type)); - $templates[$template_name][$source_prefix] = [ - $template_name, - $template_modifier, - implode(' ', $template_type), - true, - $offset - $comment->getStartFilePos() - ]; - } else { - $templates[$template_name][$source_prefix] = [ - $template_name, - null, - null, - true, - $offset - $comment->getStartFilePos() - ]; - } - } - } - - foreach ($templates as $template_entries) { - foreach (['psalm', 'phpstan', 'none'] as $source_prefix) { - if (isset($template_entries[$source_prefix])) { - $info->templates[] = $template_entries[$source_prefix]; - break; - } - } - } - - if (isset($parsed_docblock->combined_tags['extends'])) { - foreach ($parsed_docblock->combined_tags['extends'] as $template_line) { - $doc_line_parts = CommentAnalyzer::splitDocLine($template_line); - $doc_line_parts[0] = CommentAnalyzer::sanitizeDocblockType($doc_line_parts[0]); - $info->template_extends[] = $doc_line_parts[0]; - } - } - - if (isset($parsed_docblock->tags['psalm-require-extends']) - && count($extension_requirements = $parsed_docblock->tags['psalm-require-extends']) > 0) { - $info->extension_requirement = trim(preg_replace( - '@^[ \t]*\*@m', - '', - $extension_requirements[array_key_first($extension_requirements)] - )); - } - - if (isset($parsed_docblock->tags['psalm-require-implements'])) { - foreach ($parsed_docblock->tags['psalm-require-implements'] as $implementation_requirement) { - $info->implementation_requirements[] = trim(preg_replace( - '@^[ \t]*\*@m', - '', - $implementation_requirement - )); - } - } - - if (isset($parsed_docblock->combined_tags['implements'])) { - foreach ($parsed_docblock->combined_tags['implements'] as $template_line) { - $doc_line_parts = CommentAnalyzer::splitDocLine($template_line); - $doc_line_parts[0] = CommentAnalyzer::sanitizeDocblockType($doc_line_parts[0]); - $info->template_implements[] = $doc_line_parts[0]; - } - } - - if (isset($parsed_docblock->tags['psalm-yield'])) { - $yield = reset($parsed_docblock->tags['psalm-yield']); - - $info->yield = trim(preg_replace('@^[ \t]*\*@m', '', $yield)); - } - - if (isset($parsed_docblock->tags['deprecated'])) { - $info->deprecated = true; - } - - if (isset($parsed_docblock->tags['internal'])) { - $info->internal = true; - } - - if (isset($parsed_docblock->tags['final'])) { - $info->final = true; - } - - if (isset($parsed_docblock->tags['psalm-consistent-constructor'])) { - $info->consistent_constructor = true; - } - - if (isset($parsed_docblock->tags['psalm-consistent-templates'])) { - $info->consistent_templates = true; - } - - if (count($info->psalm_internal = DocblockParser::handlePsalmInternal($parsed_docblock)) !== 0) { - $info->internal = true; - } - - if (isset($parsed_docblock->tags['mixin'])) { - foreach ($parsed_docblock->tags['mixin'] as $rawMixin) { - $mixin = trim($rawMixin); - $doc_line_parts = CommentAnalyzer::splitDocLine($mixin); - $mixin = $doc_line_parts[0]; - - if ($mixin) { - $info->mixins[] = $mixin; - } else { - throw new DocblockParseException('@mixin annotation used without specifying class'); - } - } - } - - if (isset($parsed_docblock->tags['psalm-seal-properties'])) { - $info->sealed_properties = true; - } - - if (isset($parsed_docblock->tags['psalm-seal-methods'])) { - $info->sealed_methods = true; - } - - if (isset($parsed_docblock->tags['psalm-immutable']) - || isset($parsed_docblock->tags['psalm-mutation-free']) - ) { - $info->mutation_free = true; - $info->external_mutation_free = true; - $info->taint_specialize = true; - } - - if (isset($parsed_docblock->tags['psalm-external-mutation-free'])) { - $info->external_mutation_free = true; - } - - if (isset($parsed_docblock->tags['psalm-taint-specialize'])) { - $info->taint_specialize = true; - } - - if (isset($parsed_docblock->tags['psalm-override-property-visibility'])) { - $info->override_property_visibility = true; - } - - if (isset($parsed_docblock->tags['psalm-override-method-visibility'])) { - $info->override_method_visibility = true; - } - - if (isset($parsed_docblock->tags['psalm-suppress'])) { - foreach ($parsed_docblock->tags['psalm-suppress'] as $offset => $suppress_entry) { - foreach (DocComment::parseSuppressList($suppress_entry) as $issue_offset => $suppressed_issue) { - $info->suppressed_issues[$issue_offset + $offset] = $suppressed_issue; - } - } - } - - $imported_types = ($parsed_docblock->tags['phpstan-import-type'] ?? []) + - ($parsed_docblock->tags['psalm-import-type'] ?? []); - - foreach ($imported_types as $offset => $imported_type_entry) { - $info->imported_types[] = [ - 'line_number' => $comment->getStartLine() + substr_count( - $comment->getText(), - "\n", - 0, - $offset - $comment->getStartFilePos() - ), - 'start_offset' => $offset, - 'end_offset' => $offset + strlen($imported_type_entry), - 'parts' => CommentAnalyzer::splitDocLine($imported_type_entry) - ]; - } - - if (isset($parsed_docblock->combined_tags['method'])) { - foreach ($parsed_docblock->combined_tags['method'] as $offset => $method_entry) { - $method_entry = preg_replace('/[ \t]+/', ' ', trim($method_entry)); - - $docblock_lines = []; - - $is_static = false; - - $has_return = false; - - if (!preg_match('/^([a-z_A-Z][a-z_0-9A-Z]+) *\(/', $method_entry, $matches)) { - $doc_line_parts = CommentAnalyzer::splitDocLine($method_entry); - - if ($doc_line_parts[0] === 'static' && !strpos($doc_line_parts[1], '(')) { - $is_static = true; - array_shift($doc_line_parts); - } - - if (count($doc_line_parts) > 1) { - $docblock_lines[] = '@return ' . array_shift($doc_line_parts); - $has_return = true; - - $method_entry = implode(' ', $doc_line_parts); - } - } - - $method_entry = trim(preg_replace('/\/\/.*/', '', $method_entry)); - - $method_entry = preg_replace( - '/array\(([0-9a-zA-Z_\'\" ]+,)*([0-9a-zA-Z_\'\" ]+)\)/', - '[]', - $method_entry - ); - - $end_of_method_regex = '/(?create(); - } catch (TypeParseTreeException $e) { - throw new DocblockParseException($method_entry . ' is not a valid method'); - } - - if (!$method_tree instanceof MethodWithReturnTypeTree - && !$method_tree instanceof MethodTree) { - throw new DocblockParseException($method_entry . ' is not a valid method'); - } - - if ($method_tree instanceof MethodWithReturnTypeTree) { - if (!$has_return) { - $docblock_lines[] = '@return ' . TypeParser::getTypeFromTree( - $method_tree->children[1], - $codebase - )->toNamespacedString($aliases->namespace, $aliases->uses, null, false); - } - - $method_tree = $method_tree->children[0]; - } - - if (!$method_tree instanceof MethodTree) { - throw new DocblockParseException($method_entry . ' is not a valid method'); - } - - $args = []; - - foreach ($method_tree->children as $method_tree_child) { - if (!$method_tree_child instanceof MethodParamTree) { - throw new DocblockParseException($method_entry . ' is not a valid method'); - } - - $args[] = ($method_tree_child->byref ? '&' : '') - . ($method_tree_child->variadic ? '...' : '') - . $method_tree_child->name - . ($method_tree_child->default != '' ? ' = ' . $method_tree_child->default : ''); - - - if ($method_tree_child->children) { - try { - $param_type = TypeParser::getTypeFromTree($method_tree_child->children[0], $codebase); - } catch (Exception $e) { - throw new DocblockParseException( - 'Badly-formatted @method string ' . $method_entry . ' - ' . $e - ); - } - - $param_type_string = $param_type->toNamespacedString('\\', [], null, false); - $docblock_lines[] = '@param ' . $param_type_string . ' ' - . ($method_tree_child->variadic ? '...' : '') - . $method_tree_child->name; - } - } - - $function_string = 'function ' . $method_tree->value . '(' . implode(', ', $args) . ')'; - - if ($is_static) { - $function_string = 'static ' . $function_string; - } - - $function_docblock = $docblock_lines ? "/**\n * " . implode("\n * ", $docblock_lines) . "\n*/\n" : ""; - - $php_string = 'php_major_version . '.' . $codebase->php_minor_version, - $has_errors - ); - } catch (Exception $e) { - throw new DocblockParseException('Badly-formatted @method string ' . $method_entry); - } - - if (!$statements - || !$statements[0] instanceof Class_ - || !isset($statements[0]->stmts[0]) - || !$statements[0]->stmts[0] instanceof ClassMethod - ) { - throw new DocblockParseException('Badly-formatted @method string ' . $method_entry); - } - - /** @var Doc */ - $node_doc_comment = $node->getDocComment(); - - $method_offset = self::getMethodOffset($comment, $method_entry); - - $statements[0]->stmts[0]->setAttribute('startLine', $node_doc_comment->getStartLine() + $method_offset); - $statements[0]->stmts[0]->setAttribute('startFilePos', $node_doc_comment->getStartFilePos()); - $statements[0]->stmts[0]->setAttribute('endFilePos', $node->getAttribute('startFilePos')); - - if ($doc_comment = $statements[0]->stmts[0]->getDocComment()) { - $statements[0]->stmts[0]->setDocComment( - new Doc( - $doc_comment->getText(), - $comment->getStartLine() + substr_count( - $comment->getText(), - "\n", - 0, - $offset - $comment->getStartFilePos() - ), - $node_doc_comment->getStartFilePos() - ) - ); - } - - $info->methods[] = $statements[0]->stmts[0]; - } - } - - if (isset($parsed_docblock->tags['psalm-stub-override'])) { - $info->stub_override = true; - } - - if ($parsed_docblock->description) { - $info->description = $parsed_docblock->description; - } - - self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'property'); - self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'psalm-property'); - self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'property-read'); - self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'psalm-property-read'); - self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'property-write'); - self::addMagicPropertyToInfo($comment, $info, $parsed_docblock->tags, 'psalm-property-write'); - - return $info; - } - - /** - * @param array> $specials - * @param 'property'|'psalm-property'|'property-read'| - * 'psalm-property-read'|'property-write'|'psalm-property-write' $property_tag - * - * @throws DocblockParseException - * - */ - protected static function addMagicPropertyToInfo( - Doc $comment, - ClassLikeDocblockComment $info, - array $specials, - string $property_tag - ): void { - $magic_property_comments = $specials[$property_tag] ?? []; - - foreach ($magic_property_comments as $offset => $property) { - $line_parts = CommentAnalyzer::splitDocLine($property); - - if (count($line_parts) === 1 && isset($line_parts[0][0]) && $line_parts[0][0] === '$') { - continue; - } - - if (count($line_parts) > 1) { - if (preg_match('/^&?\$[A-Za-z0-9_]+,?$/', $line_parts[1]) - && $line_parts[0][0] !== '{' - ) { - $line_parts[1] = str_replace('&', '', $line_parts[1]); - - $line_parts[1] = preg_replace('/,$/', '', $line_parts[1]); - - $end = $offset + strlen($line_parts[0]); - - $line_parts[0] = str_replace("\n", '', preg_replace('@^[ \t]*\*@m', '', $line_parts[0])); - - if ($line_parts[0] === '' - || ($line_parts[0][0] === '$' - && !preg_match('/^\$this(\||$)/', $line_parts[0])) - ) { - throw new IncorrectDocblockException('Misplaced variable'); - } - - $name = trim($line_parts[1]); - - if (!preg_match('/^\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$/', $name)) { - throw new DocblockParseException('Badly-formatted @property name'); - } - - $info->properties[] = [ - 'name' => $name, - 'type' => $line_parts[0], - 'line_number' => $comment->getStartLine() + substr_count( - $comment->getText(), - "\n", - 0, - $offset - $comment->getStartFilePos() - ), - 'tag' => $property_tag, - 'start' => $offset, - 'end' => $end, - ]; - } - } else { - throw new DocblockParseException('Badly-formatted @property'); - } - } - } - - private static function getMethodOffset(Doc $comment, string $method_entry): int - { - $lines = explode("\n", $comment->getText()); - $method_offset = 0; - - foreach ($lines as $i => $line) { - if (strpos($line, $method_entry) !== false) { - $method_offset = $i; - break; - } - } - - return $method_offset; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php deleted file mode 100644 index 91fbfbfe..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php +++ /dev/null @@ -1,1861 +0,0 @@ - - */ - private $classlike_type_aliases = []; - - /** - * @var array> - */ - public $class_template_types = []; - - /** - * @var PhpParser\Node\Name|null - */ - private $namespace_name; - - /** - * @var Aliases - */ - private $aliases; - - /** - * @var ?ClassLikeStorage - */ - public $storage; - - /** - * @var array - */ - public $type_aliases = []; - - public function __construct( - Codebase $codebase, - FileStorage $file_storage, - FileScanner $file_scanner, - Aliases $aliases, - ?PhpParser\Node\Name $namespace_name - ) { - $this->codebase = $codebase; - $this->file_storage = $file_storage; - $this->file_scanner = $file_scanner; - $this->file_path = $file_storage->file_path; - $this->aliases = $aliases; - $this->config = Config::getInstance(); - $this->namespace_name = $namespace_name; - } - - /** - * @return false|null - */ - public function start(PhpParser\Node\Stmt\ClassLike $node): ?bool - { - $class_location = new CodeLocation($this->file_scanner, $node); - $name_location = null; - - $storage = null; - - $class_name = null; - - $is_classlike_overridden = false; - - if ($node->name === null) { - if (!$node instanceof PhpParser\Node\Stmt\Class_) { - throw new LogicException('Anonymous classes are always classes'); - } - - $fq_classlike_name = ClassAnalyzer::getAnonymousClassName($node, $this->file_path); - } else { - $name_location = new CodeLocation($this->file_scanner, $node->name); - - $fq_classlike_name = - ($this->aliases->namespace ? $this->aliases->namespace . '\\' : '') . $node->name->name; - assert($fq_classlike_name !== ""); - - $fq_classlike_name_lc = strtolower($fq_classlike_name); - - $class_name = $node->name->name; - - if ($this->codebase->classlike_storage_provider->has($fq_classlike_name_lc)) { - $duplicate_storage = $this->codebase->classlike_storage_provider->get($fq_classlike_name_lc); - - if (!$this->codebase->register_stub_files) { - if (!$duplicate_storage->stmt_location - || $duplicate_storage->stmt_location->file_path !== $this->file_path - || $class_location->getHash() !== $duplicate_storage->stmt_location->getHash() - ) { - if (IssueBuffer::accepts( - new DuplicateClass( - 'Class ' . $fq_classlike_name . ' has already been defined' - . ($duplicate_storage->location - ? ' in ' . $duplicate_storage->location->file_path - : ''), - $name_location - ) - )) { - } - - $this->file_storage->has_visitor_issues = true; - - $duplicate_storage->has_visitor_issues = true; - - return false; - } - } elseif (!$duplicate_storage->location - || $duplicate_storage->location->file_path !== $this->file_path - || $class_location->getHash() !== $duplicate_storage->location->getHash() - ) { - $is_classlike_overridden = true; - // we're overwriting some methods - $storage = $this->storage = $duplicate_storage; - $this->codebase->classlike_storage_provider->makeNew(strtolower($fq_classlike_name)); - $storage->populated = false; - $storage->class_implements = []; // we do this because reflection reports - $storage->parent_interfaces = []; - $storage->stubbed = true; - $storage->aliases = $this->aliases; - - foreach ($storage->dependent_classlikes as $dependent_name_lc => $_) { - try { - $dependent_storage = $this->codebase->classlike_storage_provider->get($dependent_name_lc); - } catch (InvalidArgumentException $exception) { - continue; - } - $dependent_storage->populated = false; - $this->codebase->classlike_storage_provider->makeNew($dependent_name_lc); - } - } - } - } - - $fq_classlike_name_lc = strtolower($fq_classlike_name); - - $this->file_storage->classlikes_in_file[$fq_classlike_name_lc] = $fq_classlike_name; - - if (!$storage) { - $this->storage = $storage = $this->codebase->classlike_storage_provider->create($fq_classlike_name); - } - - if ($class_name - && isset($this->aliases->uses[strtolower($class_name)]) - && $this->aliases->uses[strtolower($class_name)] !== $fq_classlike_name - ) { - IssueBuffer::maybeAdd( - new ParseError( - 'Class name ' . $class_name . ' clashes with a use statement alias', - $name_location ?? $class_location - ) - ); - - $storage->has_visitor_issues = true; - $this->file_storage->has_visitor_issues = true; - } - - $storage->stmt_location = $class_location; - $storage->location = $name_location; - if ($this->namespace_name) { - $storage->namespace_name_location = new CodeLocation($this->file_scanner, $this->namespace_name); - } - $storage->user_defined = !$this->codebase->register_stub_files; - $storage->stubbed = $this->codebase->register_stub_files; - $storage->aliases = $this->aliases; - - if ($node instanceof PhpParser\Node\Stmt\Class_) { - $storage->abstract = $node->isAbstract(); - $storage->final = $node->isFinal(); - - $this->codebase->classlikes->addFullyQualifiedClassName($fq_classlike_name, $this->file_path); - - if ($node->extends) { - $parent_fqcln = ClassLikeAnalyzer::getFQCLNFromNameObject($node->extends, $this->aliases); - $parent_fqcln = $this->codebase->classlikes->getUnAliasedName($parent_fqcln); - $this->codebase->scanner->queueClassLikeForScanning( - $parent_fqcln, - $this->file_scanner->will_analyze - ); - $parent_fqcln_lc = strtolower($parent_fqcln); - $storage->parent_class = $parent_fqcln; - $storage->parent_classes[$parent_fqcln_lc] = $parent_fqcln; - $this->file_storage->required_classes[strtolower($parent_fqcln)] = $parent_fqcln; - } - } elseif ($node instanceof PhpParser\Node\Stmt\Interface_) { - $storage->is_interface = true; - $this->codebase->classlikes->addFullyQualifiedInterfaceName($fq_classlike_name, $this->file_path); - - foreach ($node->extends as $interface) { - $interface_fqcln = ClassLikeAnalyzer::getFQCLNFromNameObject($interface, $this->aliases); - $interface_fqcln = $this->codebase->classlikes->getUnAliasedName($interface_fqcln); - $interface_fqcln_lc = strtolower($interface_fqcln); - $this->codebase->scanner->queueClassLikeForScanning($interface_fqcln); - $storage->parent_interfaces[$interface_fqcln_lc] = $interface_fqcln; - $storage->direct_interface_parents[$interface_fqcln_lc] = $interface_fqcln; - $this->file_storage->required_interfaces[$interface_fqcln_lc] = $interface_fqcln; - } - } elseif ($node instanceof PhpParser\Node\Stmt\Trait_) { - $storage->is_trait = true; - $this->codebase->classlikes->addFullyQualifiedTraitName($fq_classlike_name, $this->file_path); - } elseif ($node instanceof PhpParser\Node\Stmt\Enum_) { - $storage->is_enum = true; - - if ($node->scalarType) { - if ($node->scalarType->name === 'string' || $node->scalarType->name === 'int') { - $storage->enum_type = $node->scalarType->name; - } else { - IssueBuffer::maybeAdd( - new InvalidEnumBackingType( - 'Enums cannot be backed by ' . $node->scalarType->name . ', string or int expected', - new CodeLocation($this->file_scanner, $node->scalarType), - $fq_classlike_name - ) - ); - $this->file_storage->has_visitor_issues = true; - $storage->has_visitor_issues = true; - } - $storage->class_implements['backedenum'] = 'BackedEnum'; - $storage->direct_class_interfaces['backedenum'] = 'BackedEnum'; - $this->file_storage->required_interfaces['backedenum'] = 'BackedEnum'; - $this->codebase->scanner->queueClassLikeForScanning('BackedEnum'); - $storage->declaring_method_ids['from'] = new MethodIdentifier('BackedEnum', 'from'); - $storage->appearing_method_ids['from'] = $storage->declaring_method_ids['from']; - $storage->declaring_method_ids['tryfrom'] = new MethodIdentifier( - 'BackedEnum', - 'tryfrom' - ); - $storage->appearing_method_ids['tryfrom'] = $storage->declaring_method_ids['tryfrom']; - } - - $this->codebase->scanner->queueClassLikeForScanning('UnitEnum'); - $storage->class_implements['unitenum'] = 'UnitEnum'; - $storage->direct_class_interfaces['unitenum'] = 'UnitEnum'; - $this->file_storage->required_interfaces['unitenum'] = 'UnitEnum'; - $storage->final = true; - - $storage->declaring_method_ids['cases'] = new MethodIdentifier( - 'UnitEnum', - 'cases' - ); - $storage->appearing_method_ids['cases'] = $storage->declaring_method_ids['cases']; - - $this->codebase->classlikes->addFullyQualifiedEnumName($fq_classlike_name, $this->file_path); - } else { - throw new UnexpectedValueException('Unknown classlike type'); - } - - if ($node instanceof PhpParser\Node\Stmt\Class_ || $node instanceof PhpParser\Node\Stmt\Enum_) { - foreach ($node->implements as $interface) { - $interface_fqcln = ClassLikeAnalyzer::getFQCLNFromNameObject($interface, $this->aliases); - $interface_fqcln_lc = strtolower($interface_fqcln); - $this->codebase->scanner->queueClassLikeForScanning($interface_fqcln); - $storage->class_implements[$interface_fqcln_lc] = $interface_fqcln; - $storage->direct_class_interfaces[$interface_fqcln_lc] = $interface_fqcln; - $this->file_storage->required_interfaces[$interface_fqcln_lc] = $interface_fqcln; - } - } - - $docblock_info = null; - $doc_comment = $node->getDocComment(); - if ($doc_comment) { - try { - $docblock_info = ClassLikeDocblockParser::parse( - $node, - $doc_comment, - $this->aliases - ); - - $this->type_aliases += $this->getImportedTypeAliases($docblock_info, $fq_classlike_name); - } catch (DocblockParseException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $fq_classlike_name, - $name_location ?? $class_location - ); - } - } - - foreach ($node->getComments() as $comment) { - if (!$comment instanceof PhpParser\Comment\Doc) { - continue; - } - - try { - $type_aliases = self::getTypeAliasesFromComment( - $comment, - $this->aliases, - $this->type_aliases, - $fq_classlike_name - ); - - foreach ($type_aliases as $type_alias) { - // finds issues, if there are any - TypeParser::parseTokens($type_alias->replacement_tokens); - } - - $this->type_aliases += $type_aliases; - - if ($type_aliases) { - $this->classlike_type_aliases = $type_aliases; - } - } catch (DocblockParseException | TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage(), - new CodeLocation($this->file_scanner, $node, null, true) - ); - } - } - - if ($docblock_info) { - if ($docblock_info->stub_override && !$is_classlike_overridden) { - throw new InvalidClasslikeOverrideException( - 'Class/interface/trait ' . $fq_classlike_name . ' is marked as stub override,' - . ' but no original counterpart found' - ); - } - - if ($docblock_info->templates) { - $storage->template_types = []; - - usort( - $docblock_info->templates, - function (array $l, array $r): int { - return $l[4] > $r[4] ? 1 : -1; - } - ); - - foreach ($docblock_info->templates as $i => $template_map) { - $template_name = $template_map[0]; - - if ($template_map[1] !== null && $template_map[2] !== null) { - if (trim($template_map[2])) { - try { - $template_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $template_map[2], - $this->aliases, - $storage->template_types, - $this->type_aliases - ), - null, - $storage->template_types, - $this->type_aliases - ); - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $fq_classlike_name, - $name_location ?? $class_location - ); - - continue; - } - - $storage->template_types[$template_name] = [ - $fq_classlike_name => $template_type, - ]; - } else { - $storage->docblock_issues[] = new InvalidDocblock( - 'Template missing as type', - $name_location ?? $class_location - ); - } - } else { - /** @psalm-suppress PropertyTypeCoercion due to a Psalm bug */ - $storage->template_types[$template_name][$fq_classlike_name] = Type::getMixed(); - } - - $storage->template_covariants[$i] = $template_map[3]; - } - - $this->class_template_types = $storage->template_types; - } - - foreach ($docblock_info->template_extends as $extended_class_name) { - $this->extendTemplatedType($storage, $node, $extended_class_name); - } - - foreach ($docblock_info->template_implements as $implemented_class_name) { - $this->implementTemplatedType($storage, $node, $implemented_class_name); - } - - if ($docblock_info->yield) { - try { - $yield_type_tokens = TypeTokenizer::getFullyQualifiedTokens( - $docblock_info->yield, - $this->aliases, - $storage->template_types, - $this->type_aliases - ); - - $yield_type = TypeParser::parseTokens( - $yield_type_tokens, - null, - $storage->template_types ?: [], - $this->type_aliases - ); - $yield_type->setFromDocblock(); - $yield_type->queueClassLikesForScanning( - $this->codebase, - $this->file_storage, - $storage->template_types ?: [] - ); - - $storage->yield = $yield_type; - } catch (TypeParseTreeException $e) { - // do nothing - } - } - - if ($docblock_info->extension_requirement !== null) { - $storage->extension_requirement = (string) TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $docblock_info->extension_requirement, - $this->aliases, - $this->class_template_types, - $this->type_aliases - ), - null, - $this->class_template_types, - $this->type_aliases - ); - } - - foreach ($docblock_info->implementation_requirements as $implementation_requirement) { - $storage->implementation_requirements[] = (string) TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $implementation_requirement, - $this->aliases, - $this->class_template_types, - $this->type_aliases - ), - null, - $this->class_template_types, - $this->type_aliases - ); - } - - $storage->sealed_properties = $docblock_info->sealed_properties; - $storage->sealed_methods = $docblock_info->sealed_methods; - - if ($docblock_info->properties) { - foreach ($docblock_info->properties as $property) { - $pseudo_property_type_tokens = TypeTokenizer::getFullyQualifiedTokens( - $property['type'], - $this->aliases, - $this->class_template_types, - $this->type_aliases - ); - - try { - $pseudo_property_type = TypeParser::parseTokens( - $pseudo_property_type_tokens, - null, - $this->class_template_types, - $this->type_aliases - ); - $pseudo_property_type->setFromDocblock(); - $pseudo_property_type->queueClassLikesForScanning( - $this->codebase, - $this->file_storage, - $storage->template_types ?: [] - ); - - if ($property['tag'] !== 'property-read' && $property['tag'] !== 'psalm-property-read') { - $storage->pseudo_property_set_types[$property['name']] = $pseudo_property_type; - } - - if ($property['tag'] !== 'property-write' && $property['tag'] !== 'psalm-property-write') { - $storage->pseudo_property_get_types[$property['name']] = $pseudo_property_type; - } - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $fq_classlike_name, - $name_location ?? $class_location - ); - } - } - - $storage->sealed_properties = true; - } - - foreach ($docblock_info->methods as $method) { - $functionlike_node_scanner = new FunctionLikeNodeScanner( - $this->codebase, - $this->file_scanner, - $this->file_storage, - $this->aliases, - $this->type_aliases, - $this->storage, - [] - ); - - /** @var MethodStorage */ - $pseudo_method_storage = $functionlike_node_scanner->start($method, true); - $lc_method_name = strtolower($method->name->name); - - if ($pseudo_method_storage->is_static) { - $storage->pseudo_static_methods[$lc_method_name] = $pseudo_method_storage; - } else { - $storage->pseudo_methods[$lc_method_name] = $pseudo_method_storage; - $storage->declaring_pseudo_method_ids[$lc_method_name] = new MethodIdentifier( - $fq_classlike_name, - $lc_method_name - ); - } - - $storage->sealed_methods = true; - } - - - $storage->deprecated = $docblock_info->deprecated; - - if (count($docblock_info->psalm_internal) !== 0) { - $storage->internal = $docblock_info->psalm_internal; - } elseif ($docblock_info->internal && $this->aliases->namespace) { - $storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($this->aliases->namespace)]; - } - - if ($docblock_info->final && !$storage->final) { - $storage->final = true; - $storage->final_from_docblock = true; - } - - $storage->preserve_constructor_signature = $docblock_info->consistent_constructor; - - if ($storage->preserve_constructor_signature) { - $has_constructor = false; - - foreach ($node->stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod - && $stmt->name->name === '__construct' - ) { - $has_constructor = true; - break; - } - } - - if (!$has_constructor) { - self::registerEmptyConstructor($storage); - } - } - - $storage->enforce_template_inheritance = $docblock_info->consistent_templates; - - foreach ($docblock_info->mixins as $key => $mixin) { - $mixin_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $mixin, - $this->aliases, - $this->class_template_types, - $this->type_aliases, - $fq_classlike_name - ), - null, - $this->class_template_types, - $this->type_aliases - ); - - $mixin_type->queueClassLikesForScanning( - $this->codebase, - $this->file_storage, - $storage->template_types ?: [] - ); - - $mixin_type->setFromDocblock(); - - if ($mixin_type->isSingle()) { - $mixin_type = $mixin_type->getSingleAtomic(); - - if ($mixin_type instanceof TNamedObject) { - $storage->namedMixins[] = $mixin_type; - } - - if ($mixin_type instanceof TTemplateParam) { - $storage->templatedMixins[] = $mixin_type; - } - } - - if ($key === 0) { - $storage->mixin_declaring_fqcln = $storage->name; - } - } - - $storage->mutation_free = $docblock_info->mutation_free; - $storage->external_mutation_free = $docblock_info->external_mutation_free; - $storage->specialize_instance = $docblock_info->taint_specialize; - - $storage->override_property_visibility = $docblock_info->override_property_visibility; - $storage->override_method_visibility = $docblock_info->override_method_visibility; - - $storage->suppressed_issues = $docblock_info->suppressed_issues; - - if ($docblock_info->description) { - $storage->description = $docblock_info->description; - } - } - - foreach ($node->stmts as $node_stmt) { - if ($node_stmt instanceof PhpParser\Node\Stmt\ClassConst) { - $this->visitClassConstDeclaration($node_stmt, $storage, $fq_classlike_name); - } elseif ($node_stmt instanceof PhpParser\Node\Stmt\EnumCase - && $node instanceof PhpParser\Node\Stmt\Enum_ - ) { - $this->visitEnumDeclaration($node_stmt, $storage, $fq_classlike_name); - } - } - - foreach ($node->stmts as $node_stmt) { - if ($node_stmt instanceof PhpParser\Node\Stmt\Property) { - $this->visitPropertyDeclaration($node_stmt, $this->config, $storage, $fq_classlike_name); - } - } - - foreach ($node->attrGroups as $attr_group) { - foreach ($attr_group->attrs as $attr) { - $attribute = AttributeResolver::resolve( - $this->codebase, - $this->file_scanner, - $this->file_storage, - $this->aliases, - $attr, - $this->storage->name ?? null - ); - - if ($attribute->fq_class_name === 'Psalm\\Deprecated' - || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Deprecated' - ) { - $storage->deprecated = true; - } - - if ($attribute->fq_class_name === 'Psalm\\Internal' && !$storage->internal) { - $storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($fq_classlike_name)]; - } - - if ($attribute->fq_class_name === 'Psalm\\Immutable' - || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Immutable' - ) { - $storage->mutation_free = true; - $storage->external_mutation_free = true; - } - - if ($attribute->fq_class_name === 'Psalm\\ExternalMutationFree') { - $storage->external_mutation_free = true; - } - - $storage->attributes[] = $attribute; - } - } - - return null; - } - - public function finish(PhpParser\Node\Stmt\ClassLike $node): ClassLikeStorage - { - if (!$this->storage) { - throw new UnexpectedValueException( - 'Storage should exist in ' . $this->file_path . ' at ' . $node->getLine() - ); - } - - $classlike_storage = $this->storage; - - $fq_classlike_name = $classlike_storage->name; - - if (PropertyMap::inPropertyMap($fq_classlike_name)) { - $mapped_properties = PropertyMap::getPropertyMap()[strtolower($fq_classlike_name)]; - - foreach ($mapped_properties as $property_name => $public_mapped_property) { - $property_type = Type::parseString($public_mapped_property); - - $property_type->queueClassLikesForScanning($this->codebase, $this->file_storage); - - if (!isset($classlike_storage->properties[$property_name])) { - $classlike_storage->properties[$property_name] = new PropertyStorage(); - } - - $classlike_storage->properties[$property_name]->type = $property_type; - - $property_id = $fq_classlike_name . '::$' . $property_name; - - $classlike_storage->declaring_property_ids[$property_name] = $fq_classlike_name; - $classlike_storage->appearing_property_ids[$property_name] = $property_id; - } - } - - $converted_aliases = array_map( - function (InlineTypeAlias $t): ?ClassTypeAlias { - try { - $union = TypeParser::parseTokens( - $t->replacement_tokens, - null, - [], - $this->type_aliases - ); - - $union->setFromDocblock(); - - return new ClassTypeAlias( - array_values($union->getAtomicTypes()) - ); - } catch (Exception $e) { - return null; - } - }, - $this->classlike_type_aliases - ); - - foreach ($converted_aliases as $key => $type) { - if (!$type) { - $classlike_storage->docblock_issues[] = new InvalidDocblock( - '@psalm-type ' . $key . ' contains invalid references', - new CodeLocation($this->file_scanner, $node, null, true) - ); - } - } - - $classlike_storage->type_aliases = array_filter($converted_aliases); - - return $classlike_storage; - } - - public function handleTraitUse(PhpParser\Node\Stmt\TraitUse $node): void - { - $storage = $this->storage; - - if (!$storage) { - throw new UnexpectedValueException('bad'); - } - - $method_map = $storage->trait_alias_map ?: []; - $visibility_map = $storage->trait_visibility_map ?: []; - $final_map = $storage->trait_final_map ?: []; - - foreach ($node->adaptations as $adaptation) { - if ($adaptation instanceof PhpParser\Node\Stmt\TraitUseAdaptation\Alias) { - $old_name = strtolower($adaptation->method->name); - $new_name = $old_name; - - if ($adaptation->newName) { - $new_name = strtolower($adaptation->newName->name); - - if ($new_name !== $old_name) { - $method_map[$new_name] = $old_name; - } - } - - if ($adaptation->newModifier) { - switch ($adaptation->newModifier) { - case 1: - $visibility_map[$new_name] = ClassLikeAnalyzer::VISIBILITY_PUBLIC; - break; - - case 2: - $visibility_map[$new_name] = ClassLikeAnalyzer::VISIBILITY_PROTECTED; - break; - - case 4: - $visibility_map[$new_name] = ClassLikeAnalyzer::VISIBILITY_PRIVATE; - break; - - case 32: - $final_map[$new_name] = true; - break; - } - } - } - } - - $storage->trait_alias_map = $method_map; - $storage->trait_visibility_map = $visibility_map; - $storage->trait_final_map = $final_map; - - foreach ($node->traits as $trait) { - $trait_fqcln = ClassLikeAnalyzer::getFQCLNFromNameObject($trait, $this->aliases); - $this->codebase->scanner->queueClassLikeForScanning($trait_fqcln, $this->file_scanner->will_analyze); - $storage->used_traits[strtolower($trait_fqcln)] = $trait_fqcln; - $this->file_storage->required_classes[strtolower($trait_fqcln)] = $trait_fqcln; - } - - if ($node_comment = $node->getDocComment()) { - $comments = DocComment::parsePreservingLength($node_comment); - - if (isset($comments->combined_tags['use'])) { - foreach ($comments->combined_tags['use'] as $template_line) { - $this->useTemplatedType( - $storage, - $node, - trim(preg_replace('@^[ \t]*\*@m', '', $template_line)) - ); - } - } - - if (isset($comments->tags['template-extends']) - || isset($comments->tags['extends']) - || isset($comments->tags['template-implements']) - || isset($comments->tags['implements']) - ) { - $storage->docblock_issues[] = new InvalidDocblock( - 'You must use @use or @template-use to parameterize traits', - new CodeLocation($this->file_scanner, $node, null, true) - ); - } - } - } - - private function extendTemplatedType( - ClassLikeStorage $storage, - PhpParser\Node\Stmt\ClassLike $node, - string $extended_class_name - ): void { - if (trim($extended_class_name) === '') { - $storage->docblock_issues[] = new InvalidDocblock( - 'Extended class cannot be empty in docblock for ' . $storage->name, - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - try { - $extended_union_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $extended_class_name, - $this->aliases, - $this->class_template_types, - $this->type_aliases - ), - null, - $this->class_template_types, - $this->type_aliases - ); - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $storage->name, - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - if (!$extended_union_type->isSingle()) { - $storage->docblock_issues[] = new InvalidDocblock( - '@template-extends cannot be a union type', - new CodeLocation($this->file_scanner, $node, null, true) - ); - } - - $extended_union_type->setFromDocblock(); - - $extended_union_type->queueClassLikesForScanning( - $this->codebase, - $this->file_storage, - $storage->template_types ?: [] - ); - - foreach ($extended_union_type->getAtomicTypes() as $atomic_type) { - if (!$atomic_type instanceof TGenericObject) { - $storage->docblock_issues[] = new InvalidDocblock( - '@template-extends has invalid class ' . $atomic_type->getId(), - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - $generic_class_lc = strtolower($atomic_type->value); - - if (!isset($storage->parent_classes[$generic_class_lc]) - && !isset($storage->parent_interfaces[$generic_class_lc]) - ) { - $storage->docblock_issues[] = new InvalidDocblock( - '@template-extends must include the name of an extended class,' - . ' got ' . $atomic_type->getId(), - new CodeLocation($this->file_scanner, $node, null, true) - ); - } - - $extended_type_parameters = []; - - $storage->template_extended_count = count($atomic_type->type_params); - - foreach ($atomic_type->type_params as $type_param) { - $extended_type_parameters[] = $type_param; - } - - $storage->template_extended_offsets[$atomic_type->value] = $extended_type_parameters; - } - } - - private function implementTemplatedType( - ClassLikeStorage $storage, - PhpParser\Node\Stmt\ClassLike $node, - string $implemented_class_name - ): void { - if (trim($implemented_class_name) === '') { - $storage->docblock_issues[] = new InvalidDocblock( - 'Extended class cannot be empty in docblock for ' . $storage->name, - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - try { - $implemented_union_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $implemented_class_name, - $this->aliases, - $this->class_template_types, - $this->type_aliases - ), - null, - $this->class_template_types, - $this->type_aliases - ); - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $storage->name, - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - if (!$implemented_union_type->isSingle()) { - $storage->docblock_issues[] = new InvalidDocblock( - '@template-implements cannot be a union type', - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - $implemented_union_type->setFromDocblock(); - - $implemented_union_type->queueClassLikesForScanning( - $this->codebase, - $this->file_storage, - $storage->template_types ?: [] - ); - - foreach ($implemented_union_type->getAtomicTypes() as $atomic_type) { - if (!$atomic_type instanceof TGenericObject) { - $storage->docblock_issues[] = new InvalidDocblock( - '@template-implements has invalid class ' . $atomic_type->getId(), - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - $generic_class_lc = strtolower($atomic_type->value); - - if (!isset($storage->class_implements[$generic_class_lc])) { - $storage->docblock_issues[] = new InvalidDocblock( - '@template-implements must include the name of an implemented class,' - . ' got ' . $atomic_type->getId(), - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - $implemented_type_parameters = []; - - $storage->template_type_implements_count[$generic_class_lc] = count($atomic_type->type_params); - - foreach ($atomic_type->type_params as $type_param) { - $implemented_type_parameters[] = $type_param; - } - - $storage->template_extended_offsets[$atomic_type->value] = $implemented_type_parameters; - } - } - - private function useTemplatedType( - ClassLikeStorage $storage, - PhpParser\Node\Stmt\TraitUse $node, - string $used_class_name - ): void { - if (trim($used_class_name) === '') { - $storage->docblock_issues[] = new InvalidDocblock( - 'Extended class cannot be empty in docblock for ' . $storage->name, - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - try { - $used_union_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $used_class_name, - $this->aliases, - $this->class_template_types, - $this->type_aliases - ), - null, - $this->class_template_types, - $this->type_aliases - ); - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $storage->name, - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - if (!$used_union_type->isSingle()) { - $storage->docblock_issues[] = new InvalidDocblock( - '@template-use cannot be a union type', - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - $used_union_type->setFromDocblock(); - - $used_union_type->queueClassLikesForScanning( - $this->codebase, - $this->file_storage, - $storage->template_types ?: [] - ); - - foreach ($used_union_type->getAtomicTypes() as $atomic_type) { - if (!$atomic_type instanceof TGenericObject) { - $storage->docblock_issues[] = new InvalidDocblock( - '@template-use has invalid class ' . $atomic_type->getId(), - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - $generic_class_lc = strtolower($atomic_type->value); - - if (!isset($storage->used_traits[$generic_class_lc])) { - $storage->docblock_issues[] = new InvalidDocblock( - '@template-use must include the name of an used class,' - . ' got ' . $atomic_type->getId(), - new CodeLocation($this->file_scanner, $node, null, true) - ); - - return; - } - - $used_type_parameters = []; - - $storage->template_type_uses_count[$generic_class_lc] = count($atomic_type->type_params); - - foreach ($atomic_type->type_params as $type_param) { - $used_type_parameters[] = $type_param; - } - - $storage->template_extended_offsets[$atomic_type->value] = $used_type_parameters; - } - } - - private static function registerEmptyConstructor(ClassLikeStorage $class_storage): void - { - $method_name_lc = '__construct'; - - if (isset($class_storage->methods[$method_name_lc])) { - return; - } - - $storage = $class_storage->methods['__construct'] = new MethodStorage(); - - $storage->cased_name = '__construct'; - $storage->defining_fqcln = $class_storage->name; - - $storage->mutation_free = $storage->external_mutation_free = true; - $storage->mutation_free_inferred = true; - - $class_storage->declaring_method_ids['__construct'] = new MethodIdentifier( - $class_storage->name, - '__construct' - ); - - $class_storage->inheritable_method_ids['__construct'] - = $class_storage->declaring_method_ids['__construct']; - $class_storage->appearing_method_ids['__construct'] - = $class_storage->declaring_method_ids['__construct']; - $class_storage->overridden_method_ids['__construct'] = []; - - $storage->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; - } - - private function visitClassConstDeclaration( - PhpParser\Node\Stmt\ClassConst $stmt, - ClassLikeStorage $storage, - string $fq_classlike_name - ): void { - $existing_constants = $storage->constants; - - $comment = $stmt->getDocComment(); - $deprecated = false; - $description = null; - $config = $this->config; - - if ($comment && $comment->getText() && ($config->use_docblock_types || $config->use_docblock_property_types)) { - $comments = DocComment::parsePreservingLength($comment); - - if (isset($comments->tags['deprecated'])) { - $deprecated = true; - } - - $description = $comments->description; - } - - foreach ($stmt->consts as $const) { - $const_type = SimpleTypeInferer::infer( - $this->codebase, - new NodeDataProvider(), - $const->value, - $this->aliases, - null, - $existing_constants, - $fq_classlike_name - ); - - if (isset($storage->constants[$const->name->name]) - || isset($storage->enum_cases[$const->name->name]) - ) { - if (IssueBuffer::accepts(new DuplicateConstant( - 'Constant names should be unique', - new CodeLocation($this->file_scanner, $const), - $fq_classlike_name - ))) { - // fall through - } - continue; - } - - $storage->constants[$const->name->name] = $constant_storage = new ClassConstantStorage( - $const_type, - $stmt->isProtected() - ? ClassLikeAnalyzer::VISIBILITY_PROTECTED - : ($stmt->isPrivate() - ? ClassLikeAnalyzer::VISIBILITY_PRIVATE - : ClassLikeAnalyzer::VISIBILITY_PUBLIC), - new CodeLocation( - $this->file_scanner, - $const->name - ) - ); - - $constant_storage->stmt_location = new CodeLocation( - $this->file_scanner, - $const - ); - - if ($const_type - && $const->value instanceof Concat - && $const_type->isSingle() - && get_class($const_type->getSingleAtomic()) === TString::class - ) { - // Prefer unresolved type over inferred string from concat, so that it can later be resolved to literal. - $const_type = null; - } - - if ($const_type) { - $existing_constants[$const->name->name] = new ClassConstantStorage( - $const_type, - $stmt->isProtected() - ? ClassLikeAnalyzer::VISIBILITY_PROTECTED - : ($stmt->isPrivate() - ? ClassLikeAnalyzer::VISIBILITY_PRIVATE - : ClassLikeAnalyzer::VISIBILITY_PUBLIC), - null - ); - } else { - $unresolved_const_expr = ExpressionResolver::getUnresolvedClassConstExpr( - $const->value, - $this->aliases, - $fq_classlike_name, - $storage->parent_class - ); - - if ($unresolved_const_expr) { - $constant_storage->unresolved_node = $unresolved_const_expr; - } else { - $constant_storage->type = Type::getMixed(); - } - } - - if ($deprecated) { - $constant_storage->deprecated = true; - } - - $constant_storage->description = $description; - - foreach ($stmt->attrGroups as $attr_group) { - foreach ($attr_group->attrs as $attr) { - $constant_storage->attributes[] = AttributeResolver::resolve( - $this->codebase, - $this->file_scanner, - $this->file_storage, - $this->aliases, - $attr, - $this->storage->name ?? null - ); - } - } - } - } - - private function visitEnumDeclaration( - PhpParser\Node\Stmt\EnumCase $stmt, - ClassLikeStorage $storage, - string $fq_classlike_name - ): void { - if (isset($storage->constants[$stmt->name->name])) { - if (IssueBuffer::accepts(new DuplicateConstant( - 'Constant names should be unique', - new CodeLocation($this->file_scanner, $stmt), - $fq_classlike_name - ))) { - // fall through - } - return; - } - - $enum_value = null; - - if ($stmt->expr !== null) { - $case_type = SimpleTypeInferer::infer( - $this->codebase, - new NodeDataProvider(), - $stmt->expr, - $this->aliases, - $this->file_scanner, - null, // enum case value expressions cannot reference constants - $fq_classlike_name - ); - - if ($case_type) { - if ($case_type->isSingleIntLiteral()) { - $enum_value = $case_type->getSingleIntLiteral()->value; - } elseif ($case_type->isSingleStringLiteral()) { - $enum_value = $case_type->getSingleStringLiteral()->value; - } else { - throw new RuntimeException( - 'Unexpected: case value for ' . $stmt->name->name . ' is ' . $case_type->getId() - ); - } - } else { - throw new RuntimeException('Failed to infer case value for ' . $stmt->name->name); - } - } - - $case_location = new CodeLocation($this->file_scanner, $stmt); - - if (!isset($storage->enum_cases[$stmt->name->name])) { - $case = new EnumCaseStorage( - $enum_value, - $case_location - ); - - $attrs = $this->getAttributeStorageFromStatement( - $this->codebase, - $this->file_scanner, - $this->file_storage, - $this->aliases, - $stmt, - $this->storage->name ?? null - ); - - foreach ($attrs as $attribute) { - if ($attribute->fq_class_name === 'Psalm\\Deprecated' - || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Deprecated' - ) { - $case->deprecated = true; - break; - } - } - - $comment = $stmt->getDocComment(); - if ($comment) { - $comments = DocComment::parsePreservingLength($comment); - - if (isset($comments->tags['deprecated'])) { - $case->deprecated = true; - } - } - $storage->enum_cases[$stmt->name->name] = $case; - } else { - if (IssueBuffer::accepts( - new DuplicateEnumCase( - 'Enum case names should be unique', - $case_location, - $fq_classlike_name - ) - )) { - } - } - } - - /** - * @param PhpParser\Node\Stmt\Property|PhpParser\Node\Stmt\EnumCase $stmt - * @return list - */ - private function getAttributeStorageFromStatement( - Codebase $codebase, - FileScanner $file_scanner, - FileStorage $file_storage, - Aliases $aliases, - PhpParser\Node\Stmt $stmt, - ?string $fq_classlike_name - ): array { - $storages = []; - foreach ($stmt->attrGroups as $attr_group) { - foreach ($attr_group->attrs as $attr) { - $storages[] = AttributeResolver::resolve( - $codebase, - $file_scanner, - $file_storage, - $aliases, - $attr, - $fq_classlike_name - ); - } - } - return $storages; - } - - /** - * @param non-empty-string $fq_classlike_name - */ - private function visitPropertyDeclaration( - PhpParser\Node\Stmt\Property $stmt, - Config $config, - ClassLikeStorage $storage, - string $fq_classlike_name - ): void { - $comment = $stmt->getDocComment(); - $var_comment = null; - - $property_is_initialized = false; - - $existing_constants = $storage->constants; - - if ($comment && $comment->getText() && ($config->use_docblock_types || $config->use_docblock_property_types)) { - if (preg_match('/[ \t\*]+@psalm-suppress[ \t]+PropertyNotSetInConstructor/', (string)$comment)) { - $property_is_initialized = true; - } - - if (preg_match('/[ \t\*]+@property[ \t]+/', (string)$comment)) { - $storage->docblock_issues[] = new InvalidDocblock( - '@property is valid only in docblocks for class', - new CodeLocation($this->file_scanner, $stmt, null, true) - ); - } - - try { - $var_comments = CommentAnalyzer::getTypeFromComment( - $comment, - $this->file_scanner, - $this->aliases, - !$stmt->isStatic() ? $this->class_template_types : [], - $this->type_aliases - ); - - $var_comment = array_pop($var_comments); - } catch (IncorrectDocblockException $e) { - $storage->docblock_issues[] = new MissingDocblockType( - $e->getMessage(), - new CodeLocation($this->file_scanner, $stmt, null, true) - ); - } catch (DocblockParseException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage(), - new CodeLocation($this->file_scanner, $stmt, null, true) - ); - } - } - - $signature_type = null; - $signature_type_location = null; - - if ($stmt->type) { - $parser_property_type = $stmt->type; - if ($parser_property_type instanceof PhpParser\Node\IntersectionType) { - throw new UnexpectedValueException('Intersection types not yet supported'); - } - /** @var Identifier|Name|NullableType|UnionType $parser_property_type */ - - $signature_type = TypeHintResolver::resolve( - $parser_property_type, - $this->codebase->scanner, - $this->file_storage, - $this->storage, - $this->aliases, - $this->codebase->php_major_version, - $this->codebase->php_minor_version - ); - - $signature_type_location = new CodeLocation( - $this->file_scanner, - $parser_property_type, - null, - false, - CodeLocation::FUNCTION_RETURN_TYPE - ); - } - - $doc_var_group_type = $var_comment->type ?? null; - - if ($doc_var_group_type) { - $doc_var_group_type->queueClassLikesForScanning($this->codebase, $this->file_storage); - $doc_var_group_type->setFromDocblock(); - } - - foreach ($stmt->props as $property) { - $doc_var_location = null; - - $property_storage = $storage->properties[$property->name->name] = new PropertyStorage(); - $property_storage->is_static = $stmt->isStatic(); - $property_storage->type = $signature_type; - $property_storage->signature_type = $signature_type; - $property_storage->signature_type_location = $signature_type_location; - $property_storage->type_location = $signature_type_location; - $property_storage->location = new CodeLocation($this->file_scanner, $property->name); - $property_storage->stmt_location = new CodeLocation($this->file_scanner, $stmt); - $property_storage->has_default = (bool)$property->default; - $property_storage->deprecated = $var_comment ? $var_comment->deprecated : false; - $property_storage->suppressed_issues = $var_comment ? $var_comment->suppressed_issues : []; - $property_storage->internal = $var_comment ? $var_comment->psalm_internal : []; - 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->allow_private_mutation = $var_comment ? $var_comment->allow_private_mutation : false; - $property_storage->description = $var_comment ? $var_comment->description : null; - - if (!$signature_type && !$doc_var_group_type) { - if ($property->default) { - $property_storage->suggested_type = SimpleTypeInferer::infer( - $this->codebase, - new NodeDataProvider(), - $property->default, - $this->aliases, - null, - $existing_constants, - $fq_classlike_name - ); - } - - $property_storage->type = null; - } else { - if ($var_comment - && $var_comment->type_start - && $var_comment->type_end - && $var_comment->line_number - ) { - $doc_var_location = new DocblockTypeLocation( - $this->file_scanner, - $var_comment->type_start, - $var_comment->type_end, - $var_comment->line_number - ); - } - - if ($doc_var_group_type) { - $property_storage->type = count($stmt->props) === 1 - ? $doc_var_group_type - : clone $doc_var_group_type; - } - } - - if ($property_storage->type - && $property_storage->type !== $property_storage->signature_type - ) { - if (!$property_storage->signature_type) { - $property_storage->type_location = $doc_var_location; - } - - if ($property_storage->signature_type) { - $all_typehint_types_match = true; - $signature_atomic_types = $property_storage->signature_type->getAtomicTypes(); - - foreach ($property_storage->type->getAtomicTypes() as $key => $type) { - if (isset($signature_atomic_types[$key])) { - $type->from_docblock = false; - } else { - $all_typehint_types_match = false; - } - } - - if ($all_typehint_types_match) { - $property_storage->type->from_docblock = false; - } - - if ($property_storage->signature_type->isNullable() - && !$property_storage->type->isNullable() - ) { - $property_storage->type->addType(new TNull()); - } - } - - $property_storage->type->queueClassLikesForScanning($this->codebase, $this->file_storage); - } - - if ($stmt->isPublic()) { - $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; - } elseif ($stmt->isProtected()) { - $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PROTECTED; - } elseif ($stmt->isPrivate()) { - $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PRIVATE; - } - - $property_id = $fq_classlike_name . '::$' . $property->name->name; - - $storage->declaring_property_ids[$property->name->name] = $fq_classlike_name; - $storage->appearing_property_ids[$property->name->name] = $property_id; - - if ($property_is_initialized) { - $storage->initialized_properties[$property->name->name] = true; - } - - if (!$stmt->isPrivate()) { - $storage->inheritable_property_ids[$property->name->name] = $property_id; - } - - $attrs = $this->getAttributeStorageFromStatement( - $this->codebase, - $this->file_scanner, - $this->file_storage, - $this->aliases, - $stmt, - $this->storage->name ?? null - ); - - foreach ($attrs as $attribute) { - if ($attribute->fq_class_name === 'Psalm\\Deprecated' - || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Deprecated' - ) { - $property_storage->deprecated = true; - } - - if ($attribute->fq_class_name === 'Psalm\\Internal' && !$property_storage->internal) { - $property_storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($fq_classlike_name)]; - } - - if ($attribute->fq_class_name === 'Psalm\\Readonly') { - $property_storage->readonly = true; - } - - $property_storage->attributes[] = $attribute; - } - } - } - - /** - * @param ClassLikeDocblockComment $comment - * @param string $fq_classlike_name - * - * @return array - */ - private function getImportedTypeAliases(ClassLikeDocblockComment $comment, string $fq_classlike_name): array - { - /** @var array $results */ - $results = []; - - foreach ($comment->imported_types as $import_type_entry) { - $imported_type_data = $import_type_entry['parts']; - $location = new DocblockTypeLocation( - $this->file_scanner, - $import_type_entry['start_offset'], - $import_type_entry['end_offset'], - $import_type_entry['line_number'] - ); - // There are two valid forms: - // @psalm-import Thing from Something - // @psalm-import Thing from Something as Alias - // but there could be leftovers after that - if (count($imported_type_data) < 3) { - $this->file_storage->docblock_issues[] = new InvalidTypeImport( - 'Invalid import in docblock for ' . $fq_classlike_name - . ', expecting " from ",' - . ' got "' . implode(' ', $imported_type_data) . '" instead.', - $location - ); - continue; - } - - if ($imported_type_data[1] === 'from' - && !empty($imported_type_data[0]) - && !empty($imported_type_data[2]) - ) { - $type_alias_name = $as_alias_name = $imported_type_data[0]; - $declaring_classlike_name = $imported_type_data[2]; - } else { - $this->file_storage->docblock_issues[] = new InvalidTypeImport( - 'Invalid import in docblock for ' . $fq_classlike_name - . ', expecting " from ", got "' - . implode( - ' ', - [$imported_type_data[0], $imported_type_data[1], $imported_type_data[2]] - ) . '" instead.', - $location - ); - continue; - } - - if (count($imported_type_data) >= 4 && $imported_type_data[3] === 'as') { - // long form - if (empty($imported_type_data[4])) { - $this->file_storage->docblock_issues[] = new InvalidTypeImport( - 'Invalid import in docblock for ' . $fq_classlike_name - . ', expecting "as ", got "' - . $imported_type_data[3] . ' ' . ($imported_type_data[4] ?? '') . '" instead.', - $location - ); - continue; - } - - $as_alias_name = $imported_type_data[4]; - } - - $declaring_fq_classlike_name = Type::getFQCLNFromString( - $declaring_classlike_name, - $this->aliases - ); - - $this->codebase->scanner->queueClassLikeForScanning($declaring_fq_classlike_name); - $this->file_storage->referenced_classlikes[strtolower($declaring_fq_classlike_name)] - = $declaring_fq_classlike_name; - - $results[$as_alias_name] = new LinkableTypeAlias( - $declaring_fq_classlike_name, - $type_alias_name, - $import_type_entry['line_number'], - $import_type_entry['start_offset'], - $import_type_entry['end_offset'] - ); - } - - return $results; - } - - /** - * @param array $type_aliases - * - * @return array - * - * @throws DocblockParseException if there was a problem parsing the docblock - */ - public static function getTypeAliasesFromComment( - PhpParser\Comment\Doc $comment, - Aliases $aliases, - ?array $type_aliases, - ?string $self_fqcln - ): array { - $parsed_docblock = DocComment::parsePreservingLength($comment); - - if (!isset($parsed_docblock->tags['psalm-type']) && !isset($parsed_docblock->tags['phpstan-type'])) { - return []; - } - - $type_alias_comment_lines = array_merge( - $parsed_docblock->tags['phpstan-type'] ?? [], - $parsed_docblock->tags['psalm-type'] ?? [] - ); - - return self::getTypeAliasesFromCommentLines( - $type_alias_comment_lines, - $aliases, - $type_aliases, - $self_fqcln - ); - } - - /** - * @param array $type_alias_comment_lines - * @param array $type_aliases - * - * @return array - * - * @throws DocblockParseException if there was a problem parsing the docblock - */ - private static function getTypeAliasesFromCommentLines( - array $type_alias_comment_lines, - Aliases $aliases, - ?array $type_aliases, - ?string $self_fqcln - ): array { - $type_alias_tokens = []; - - foreach ($type_alias_comment_lines as $var_line) { - $var_line = trim($var_line); - - if (!$var_line) { - continue; - } - - $var_line = preg_replace('/[ \t]+/', ' ', preg_replace('@^[ \t]*\*@m', '', $var_line)); - $var_line = preg_replace('/,\n\s+\}/', '}', $var_line); - $var_line = str_replace("\n", '', $var_line); - - $var_line_parts = preg_split('/( |=)/', $var_line, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - - if (!$var_line_parts) { - continue; - } - - $type_alias = array_shift($var_line_parts); - - if (!isset($var_line_parts[0])) { - continue; - } - - if ($var_line_parts[0] === ' ') { - array_shift($var_line_parts); - } - - if ($var_line_parts[0] === '=') { - array_shift($var_line_parts); - } - - if (!isset($var_line_parts[0])) { - continue; - } - - if ($var_line_parts[0] === ' ') { - array_shift($var_line_parts); - } - - $type_string = str_replace("\n", '', implode('', $var_line_parts)); - - $type_string = preg_replace('/>[^>^\}]*$/', '>', $type_string); - $type_string = preg_replace('/\}[^>^\}]*$/', '}', $type_string); - - try { - $type_tokens = TypeTokenizer::getFullyQualifiedTokens( - $type_string, - $aliases, - null, - $type_alias_tokens + $type_aliases, - $self_fqcln - ); - } catch (TypeParseTreeException $e) { - throw new DocblockParseException($type_string . ' is not a valid type'); - } - - $type_alias_tokens[$type_alias] = new InlineTypeAlias($type_tokens); - } - - return $type_alias_tokens; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php deleted file mode 100644 index 3cf9d029..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php +++ /dev/null @@ -1,450 +0,0 @@ -left, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - $right = self::getUnresolvedClassConstExpr( - $stmt->right, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - if (!$left || !$right) { - return null; - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Plus) { - return new UnresolvedAdditionOp($left, $right); - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Minus) { - return new UnresolvedSubtractionOp($left, $right); - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Mul) { - return new UnresolvedMultiplicationOp($left, $right); - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Div) { - return new UnresolvedDivisionOp($left, $right); - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat) { - return new UnresolvedConcatOp($left, $right); - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseOr) { - return new UnresolvedBitwiseOr($left, $right); - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseXor) { - return new UnresolvedBitwiseXor($left, $right); - } - - if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\BitwiseAnd) { - return new UnresolvedBitwiseAnd($left, $right); - } - } - - if ($stmt instanceof PhpParser\Node\Expr\Ternary) { - $cond = self::getUnresolvedClassConstExpr( - $stmt->cond, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - $if = null; - - if ($stmt->if) { - $if = self::getUnresolvedClassConstExpr( - $stmt->if, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - if ($if === null) { - $if = false; - } - } - - $else = self::getUnresolvedClassConstExpr( - $stmt->else, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - if ($cond && $else && $if !== false) { - return new UnresolvedTernary($cond, $if, $else); - } - } - - if ($stmt instanceof PhpParser\Node\Expr\ConstFetch) { - $part0_lc = strtolower($stmt->name->parts[0]); - if ($part0_lc === 'false') { - return new ScalarValue(false); - } - - if ($part0_lc === 'true') { - return new ScalarValue(true); - } - - if ($part0_lc === 'null') { - return new ScalarValue(null); - } - - if ($part0_lc === '__namespace__') { - return new ScalarValue($aliases->namespace); - } - - return new Constant( - implode('\\', $stmt->name->parts), - $stmt->name instanceof PhpParser\Node\Name\FullyQualified - ); - } - - if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Namespace_) { - return new ScalarValue($aliases->namespace); - } - - if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch && $stmt->dim) { - $left = self::getUnresolvedClassConstExpr( - $stmt->var, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - $right = self::getUnresolvedClassConstExpr( - $stmt->dim, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - if ($left && $right) { - return new ArrayOffsetFetch($left, $right); - } - } - - if ($stmt instanceof PhpParser\Node\Expr\ClassConstFetch) { - if ($stmt->class instanceof PhpParser\Node\Name - && $stmt->name instanceof PhpParser\Node\Identifier - && $fq_classlike_name - && $stmt->class->parts !== ['static'] - && ($stmt->class->parts !== ['parent'] || $parent_fq_class_name !== null) - ) { - if ($stmt->class->parts === ['self']) { - $const_fq_class_name = $fq_classlike_name; - } else { - if ($stmt->class->parts === ['parent']) { - assert($parent_fq_class_name !== null); - $const_fq_class_name = $parent_fq_class_name; - } else { - $const_fq_class_name = ClassLikeAnalyzer::getFQCLNFromNameObject( - $stmt->class, - $aliases - ); - } - } - - return new ClassConstant($const_fq_class_name, $stmt->name->name); - } - - return null; - } - - if ($stmt instanceof PhpParser\Node\Scalar\String_ - || $stmt instanceof PhpParser\Node\Scalar\LNumber - || $stmt instanceof PhpParser\Node\Scalar\DNumber - ) { - return new ScalarValue($stmt->value); - } - - if ($stmt instanceof PhpParser\Node\Expr\UnaryPlus) { - $right = self::getUnresolvedClassConstExpr( - $stmt->expr, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - if (!$right) { - return null; - } - - return new UnresolvedAdditionOp( - new ScalarValue(0), - $right - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\UnaryMinus) { - $right = self::getUnresolvedClassConstExpr( - $stmt->expr, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - if (!$right) { - return null; - } - - return new UnresolvedSubtractionOp( - new ScalarValue(0), - $right - ); - } - - if ($stmt instanceof PhpParser\Node\Expr\Array_) { - $items = []; - - foreach ($stmt->items as $item) { - if ($item === null) { - return null; - } - - if ($item->key) { - $item_key_type = self::getUnresolvedClassConstExpr( - $item->key, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - if (!$item_key_type) { - return null; - } - } else { - $item_key_type = null; - } - - $item_value_type = self::getUnresolvedClassConstExpr( - $item->value, - $aliases, - $fq_classlike_name, - $parent_fq_class_name - ); - - if (!$item_value_type) { - return null; - } - - if ($item->unpack) { - $items[] = new ArraySpread($item_value_type); - } else { - $items[] = new KeyValuePair($item_key_type, $item_value_type); - } - } - - return new ArrayValue($items); - } - - return null; - } - - public static function enterConditional( - Codebase $codebase, - string $file_path, - PhpParser\Node\Expr $expr - ): ?bool { - if ($expr instanceof PhpParser\Node\Expr\BooleanNot) { - $enter_negated = self::enterConditional($codebase, $file_path, $expr->expr); - - return $enter_negated === null ? null : !$enter_negated; - } - - if ($expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanAnd) { - $enter_conditional_left = self::enterConditional($codebase, $file_path, $expr->left); - $enter_conditional_right = self::enterConditional($codebase, $file_path, $expr->right); - - return $enter_conditional_left !== false && $enter_conditional_right !== false; - } - - if ($expr instanceof PhpParser\Node\Expr\BinaryOp\BooleanOr) { - $enter_conditional_left = self::enterConditional($codebase, $file_path, $expr->left); - $enter_conditional_right = self::enterConditional($codebase, $file_path, $expr->right); - - return $enter_conditional_left !== false || $enter_conditional_right !== false; - } - - if ($codebase->register_autoload_files) { - if (( - $expr instanceof PhpParser\Node\Expr\BinaryOp\GreaterOrEqual - || $expr instanceof PhpParser\Node\Expr\BinaryOp\Greater - || $expr instanceof PhpParser\Node\Expr\BinaryOp\SmallerOrEqual - || $expr instanceof PhpParser\Node\Expr\BinaryOp\Smaller - ) && ( - ( - $expr->left instanceof PhpParser\Node\Expr\ConstFetch - && $expr->left->name->parts === ['PHP_VERSION_ID'] - && $expr->right instanceof PhpParser\Node\Scalar\LNumber - ) || ( - $expr->right instanceof PhpParser\Node\Expr\ConstFetch - && $expr->right->name->parts === ['PHP_VERSION_ID'] - && $expr->left instanceof PhpParser\Node\Scalar\LNumber - ) - ) - ) { - $php_version_id = $codebase->php_major_version * 10000 + $codebase->php_minor_version * 100; - $evaluator = new ConstExprEvaluator(function (Expr $expr) use ($php_version_id) { - if ($expr instanceof ConstFetch && $expr->name->parts === ['PHP_VERSION_ID']) { - return $php_version_id; - } - throw new ConstExprEvaluationException('unexpected'); - }); - try { - return (bool) $evaluator->evaluateSilently($expr); - } catch (ConstExprEvaluationException $e) { - return null; - } - } - } - - if (!$expr instanceof PhpParser\Node\Expr\FuncCall) { - return null; - } - - return self::functionEvaluatesToTrue($codebase, $file_path, $expr); - } - - private static function functionEvaluatesToTrue( - Codebase $codebase, - string $file_path, - PhpParser\Node\Expr\FuncCall $function - ): ?bool { - if (!$function->name instanceof PhpParser\Node\Name) { - return null; - } - - if ($function->name->parts === ['function_exists'] - && isset($function->getArgs()[0]) - && $function->getArgs()[0]->value instanceof PhpParser\Node\Scalar\String_ - && function_exists($function->getArgs()[0]->value->value) - ) { - $reflection_function = new ReflectionFunction($function->getArgs()[0]->value->value); - - if ($reflection_function->isInternal()) { - return true; - } - - return false; - } - - if ($function->name->parts === ['class_exists'] - && isset($function->getArgs()[0]) - ) { - $string_value = null; - - if ($function->getArgs()[0]->value instanceof PhpParser\Node\Scalar\String_) { - $string_value = $function->getArgs()[0]->value->value; - } elseif ($function->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch - && $function->getArgs()[0]->value->class instanceof PhpParser\Node\Name - && $function->getArgs()[0]->value->name instanceof PhpParser\Node\Identifier - && strtolower($function->getArgs()[0]->value->name->name) === 'class' - ) { - $string_value = (string) $function->getArgs()[0]->value->class->getAttribute('resolvedName'); - } - - if ($string_value && class_exists($string_value)) { - $reflection_class = new ReflectionClass($string_value); - - if ($reflection_class->getFileName() !== $file_path) { - $codebase->scanner->queueClassLikeForScanning( - $string_value - ); - - return true; - } - } - - return false; - } - - if ($function->name->parts === ['interface_exists'] - && isset($function->getArgs()[0]) - ) { - $string_value = null; - - if ($function->getArgs()[0]->value instanceof PhpParser\Node\Scalar\String_) { - $string_value = $function->getArgs()[0]->value->value; - } elseif ($function->getArgs()[0]->value instanceof PhpParser\Node\Expr\ClassConstFetch - && $function->getArgs()[0]->value->class instanceof PhpParser\Node\Name - && $function->getArgs()[0]->value->name instanceof PhpParser\Node\Identifier - && strtolower($function->getArgs()[0]->value->name->name) === 'class' - ) { - $string_value = (string) $function->getArgs()[0]->value->class->getAttribute('resolvedName'); - } - - if ($string_value && interface_exists($string_value)) { - $reflection_class = new ReflectionClass($string_value); - - if ($reflection_class->getFileName() !== $file_path) { - $codebase->scanner->queueClassLikeForScanning( - $string_value - ); - - return true; - } - } - - return false; - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php deleted file mode 100644 index 2a6dbf71..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php +++ /dev/null @@ -1,332 +0,0 @@ -will_analyze - ); - } elseif ($node instanceof PhpParser\Node\Expr\Yield_ || $node instanceof PhpParser\Node\Expr\YieldFrom) { - if ($functionlike_storage) { - $functionlike_storage->has_yield = true; - } - } elseif ($node instanceof PhpParser\Node\Expr\Cast\Object_) { - $codebase->scanner->queueClassLikeForScanning('stdClass', false, false); - $file_storage->referenced_classlikes['stdclass'] = 'stdClass'; - } elseif (($node instanceof PhpParser\Node\Expr\New_ - || $node instanceof PhpParser\Node\Expr\Instanceof_ - || $node instanceof PhpParser\Node\Expr\StaticPropertyFetch - || $node instanceof PhpParser\Node\Expr\ClassConstFetch - || $node instanceof PhpParser\Node\Expr\StaticCall) - && $node->class instanceof PhpParser\Node\Name - ) { - $fq_classlike_name = ClassLikeAnalyzer::getFQCLNFromNameObject($node->class, $aliases); - - if (!in_array(strtolower($fq_classlike_name), ['self', 'static', 'parent'], true)) { - $codebase->scanner->queueClassLikeForScanning( - $fq_classlike_name, - false, - !($node instanceof PhpParser\Node\Expr\ClassConstFetch) - || !($node->name instanceof PhpParser\Node\Identifier) - || strtolower($node->name->name) !== 'class' - ); - $file_storage->referenced_classlikes[strtolower($fq_classlike_name)] = $fq_classlike_name; - } - } elseif ($node instanceof PhpParser\Node\Expr\FuncCall && $node->name instanceof PhpParser\Node\Name) { - $function_id = implode('\\', $node->name->parts); - - if (InternalCallMapHandler::inCallMap($function_id)) { - self::registerClassMapFunctionCall( - $codebase, - $file_storage, - $file_scanner, - $aliases, - $function_id, - $node, - $functionlike_storage, - $skip_if_descendants - ); - } - } - } - - private static function registerClassMapFunctionCall( - Codebase $codebase, - FileStorage $file_storage, - FileScanner $file_scanner, - Aliases $aliases, - string $function_id, - PhpParser\Node\Expr\FuncCall $node, - ?FunctionLikeStorage $functionlike_storage, - ?int $skip_if_descendants - ): void { - $callables = InternalCallMapHandler::getCallablesFromCallMap($function_id); - - if ($callables) { - foreach ($callables as $callable) { - assert($callable->params !== null); - - foreach ($callable->params as $function_param) { - if ($function_param->type) { - $function_param->type->queueClassLikesForScanning( - $codebase, - $file_storage - ); - } - } - - if ($callable->return_type && !$callable->return_type->hasMixed()) { - $callable->return_type->queueClassLikesForScanning($codebase, $file_storage); - } - } - } - - if ($node->isFirstClassCallable()) { - return; - } - - if ($function_id === 'define') { - $first_arg_value = isset($node->getArgs()[0]) ? $node->getArgs()[0]->value : null; - $second_arg_value = isset($node->getArgs()[1]) ? $node->getArgs()[1]->value : null; - if ($first_arg_value && $second_arg_value) { - $type_provider = new NodeDataProvider(); - $const_name = ConstFetchAnalyzer::getConstName( - $first_arg_value, - $type_provider, - $codebase, - $aliases - ); - - if ($const_name !== null) { - $const_type = SimpleTypeInferer::infer( - $codebase, - $type_provider, - $second_arg_value, - $aliases - ) ?? Type::getMixed(); - - $config = Config::getInstance(); - - if ($functionlike_storage && !$config->hoist_constants) { - $functionlike_storage->defined_constants[$const_name] = $const_type; - } else { - $file_storage->constants[$const_name] = $const_type; - $file_storage->declaring_constants[$const_name] = $file_storage->file_path; - } - - if (($codebase->register_stub_files || $codebase->register_autoload_files) - && (!defined($const_name) || $const_type->isMixed()) - ) { - $codebase->addGlobalConstantType($const_name, $const_type); - } - } - } - } - - $mapping_function_ids = []; - - if (($function_id === 'array_map' && isset($node->getArgs()[0])) - || ($function_id === 'array_filter' && isset($node->getArgs()[1])) - ) { - $node_arg_value = $function_id === 'array_map' ? $node->getArgs()[0]->value : $node->getArgs()[1]->value; - - if ($node_arg_value instanceof PhpParser\Node\Scalar\String_ - || $node_arg_value instanceof PhpParser\Node\Expr\Array_ - || $node_arg_value instanceof PhpParser\Node\Expr\BinaryOp\Concat - ) { - $mapping_function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( - $file_scanner, - $node_arg_value - ); - } - - foreach ($mapping_function_ids as $potential_method_id) { - if (strpos($potential_method_id, '::') === false) { - continue; - } - - [$callable_fqcln] = explode('::', $potential_method_id); - - if (!in_array(strtolower($callable_fqcln), ['self', 'parent', 'static'], true)) { - $codebase->scanner->queueClassLikeForScanning( - $callable_fqcln - ); - } - } - } - - if ($function_id === 'func_get_arg' - || $function_id === 'func_get_args' - || $function_id === 'func_num_args' - ) { - if ($functionlike_storage) { - $functionlike_storage->variadic = true; - } - } - - if ($function_id === 'is_a' || $function_id === 'is_subclass_of') { - $second_arg = $node->getArgs()[1]->value ?? null; - - if ($second_arg instanceof PhpParser\Node\Scalar\String_) { - $codebase->scanner->queueClassLikeForScanning( - $second_arg->value - ); - } - } - - if ($function_id === 'class_alias' && !$skip_if_descendants) { - $first_arg = $node->getArgs()[0]->value ?? null; - $second_arg = $node->getArgs()[1]->value ?? null; - - if ($first_arg instanceof PhpParser\Node\Scalar\String_) { - $first_arg_value = $first_arg->value; - } elseif ($first_arg instanceof PhpParser\Node\Expr\ClassConstFetch - && $first_arg->class instanceof PhpParser\Node\Name - && $first_arg->name instanceof PhpParser\Node\Identifier - && strtolower($first_arg->name->name) === 'class' - ) { - /** @var string */ - $first_arg_value = $first_arg->class->getAttribute('resolvedName'); - } else { - $first_arg_value = null; - } - - if ($second_arg instanceof PhpParser\Node\Scalar\String_) { - $second_arg_value = $second_arg->value; - } elseif ($second_arg instanceof PhpParser\Node\Expr\ClassConstFetch - && $second_arg->class instanceof PhpParser\Node\Name - && $second_arg->name instanceof PhpParser\Node\Identifier - && strtolower($second_arg->name->name) === 'class' - ) { - /** @var string */ - $second_arg_value = $second_arg->class->getAttribute('resolvedName'); - } else { - $second_arg_value = null; - } - - if ($first_arg_value !== null && $second_arg_value !== null) { - if ($first_arg_value[0] === '\\') { - $first_arg_value = substr($first_arg_value, 1); - } - - if ($second_arg_value[0] === '\\') { - $second_arg_value = substr($second_arg_value, 1); - } - - $second_arg_value = strtolower($second_arg_value); - - $codebase->classlikes->addClassAlias( - $first_arg_value, - $second_arg_value - ); - - $file_storage->classlike_aliases[$second_arg_value] = $first_arg_value; - } - } - } - - public static function visitInclude( - Codebase $codebase, - FileStorage $file_storage, - PhpParser\Node\Expr\Include_ $stmt, - bool $scan_deep - ): void { - $config = Config::getInstance(); - - if (!$config->allow_includes) { - throw new FileIncludeException( - 'File includes are not allowed per your Psalm config - check the allowFileIncludes flag.' - ); - } - - if ($stmt->expr instanceof PhpParser\Node\Scalar\String_) { - $path_to_file = $stmt->expr->value; - - // attempts to resolve using get_include_path dirs - $include_path = IncludeAnalyzer::resolveIncludePath($path_to_file, dirname($file_storage->file_path)); - $path_to_file = $include_path ?: $path_to_file; - - if (DIRECTORY_SEPARATOR === '/') { - $is_path_relative = $path_to_file[0] !== DIRECTORY_SEPARATOR; - } else { - $is_path_relative = !preg_match('~^[A-Z]:\\\\~i', $path_to_file); - } - - if ($is_path_relative) { - $path_to_file = $config->base_dir . DIRECTORY_SEPARATOR . $path_to_file; - } - } else { - $path_to_file = IncludeAnalyzer::getPathTo( - $stmt->expr, - null, - null, - $file_storage->file_path, - $config - ); - } - - if ($path_to_file) { - $path_to_file = IncludeAnalyzer::normalizeFilePath($path_to_file); - - if ($file_storage->file_path === $path_to_file) { - return; - } - - if ($codebase->fileExists($path_to_file)) { - if ($scan_deep) { - $codebase->scanner->addFileToDeepScan($path_to_file); - } else { - $codebase->scanner->addFileToShallowScan($path_to_file); - } - - $file_storage->required_file_paths[strtolower($path_to_file)] = $path_to_file; - - return; - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php deleted file mode 100644 index 341d0f63..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php +++ /dev/null @@ -1,697 +0,0 @@ -getText(); - - $info = new FunctionDocblockComment(); - - self::checkDuplicatedTags($parsed_docblock); - self::checkUnexpectedTags($parsed_docblock, $info, $comment); - - if (isset($parsed_docblock->combined_tags['return'])) { - self::extractReturnType( - $comment, - $parsed_docblock->combined_tags['return'], - $info, - $code_location, - $cased_function_id - ); - } - - if (isset($parsed_docblock->combined_tags['param'])) { - foreach ($parsed_docblock->combined_tags['param'] as $offset => $param) { - $line_parts = CommentAnalyzer::splitDocLine($param); - - if (count($line_parts) === 1 && isset($line_parts[0][0]) && $line_parts[0][0] === '$') { - continue; - } - - if (count($line_parts) > 1) { - if (preg_match('/^&?(\.\.\.)?&?\$[A-Za-z0-9_]+,?$/', $line_parts[1]) - && ($line_parts[0] === '' || $line_parts[0][0] !== '{') - ) { - $line_parts[1] = str_replace('&', '', $line_parts[1]); - - $line_parts[1] = preg_replace('/,$/', '', $line_parts[1]); - - $end = $offset + strlen($line_parts[0]); - - $line_parts[0] = CommentAnalyzer::sanitizeDocblockType($line_parts[0]); - - if ($line_parts[0] === '' - || ($line_parts[0][0] === '$' - && !preg_match('/^\$this(\||$)/', $line_parts[0])) - ) { - throw new IncorrectDocblockException('Misplaced variable'); - } - - $info_param = [ - 'name' => trim($line_parts[1]), - 'type' => $line_parts[0], - 'line_number' => $comment->getStartLine() + substr_count( - $comment_text, - "\n", - 0, - $offset - $comment->getStartFilePos() - ), - 'start' => $offset, - 'end' => $end, - ]; - - if (isset($line_parts[1]) && isset($line_parts[2])) { - $description = substr($param, strlen($line_parts[0]) + strlen($line_parts[1]) + 2); - $info_param['description'] = trim($description); - // Handle multiline description. - $info_param['description'] = preg_replace( - '/\\n \\*\\s+/um', - ' ', - $info_param['description'] - ); - } - - $info->params[] = $info_param; - } - } else { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Badly-formatted @param in docblock for ' . $cased_function_id, - $code_location - ) - ); - } - } - } - - if (isset($parsed_docblock->combined_tags['param-out'])) { - foreach ($parsed_docblock->combined_tags['param-out'] as $offset => $param) { - $line_parts = CommentAnalyzer::splitDocLine($param); - - if (count($line_parts) === 1 && isset($line_parts[0][0]) && $line_parts[0][0] === '$') { - continue; - } - - if (count($line_parts) > 1) { - if (!preg_match('/\[[^\]]+\]/', $line_parts[0]) - && preg_match('/^(\.\.\.)?&?\$[A-Za-z0-9_]+,?$/', $line_parts[1]) - && $line_parts[0][0] !== '{' - ) { - if ($line_parts[1][0] === '&') { - $line_parts[1] = substr($line_parts[1], 1); - } - - $line_parts[0] = str_replace("\n", '', preg_replace('@^[ \t]*\*@m', '', $line_parts[0])); - - if ($line_parts[0] === '' - || ($line_parts[0][0] === '$' - && !preg_match('/^\$this(\||$)/', $line_parts[0])) - ) { - throw new IncorrectDocblockException('Misplaced variable'); - } - - $line_parts[1] = preg_replace('/,$/', '', $line_parts[1]); - - $info->params_out[] = [ - 'name' => trim($line_parts[1]), - 'type' => str_replace("\n", '', $line_parts[0]), - 'line_number' => $comment->getStartLine() + substr_count( - $comment_text, - "\n", - 0, - $offset - $comment->getStartFilePos() - ), - ]; - } - } else { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Badly-formatted @param in docblock for ' . $cased_function_id, - $code_location - ) - ); - } - } - } - - foreach (['psalm-self-out', 'psalm-this-out'] as $alias) { - if (isset($parsed_docblock->tags[$alias])) { - foreach ($parsed_docblock->tags[$alias] as $offset => $param) { - $line_parts = CommentAnalyzer::splitDocLine($param); - - if (count($line_parts) > 0) { - $line_parts[0] = str_replace("\n", '', preg_replace('@^[ \t]*\*@m', '', $line_parts[0])); - - $info->self_out = [ - 'type' => str_replace("\n", '', $line_parts[0]), - 'line_number' => $comment->getStartLine() + substr_count( - $comment_text, - "\n", - 0, - $offset - $comment->getStartFilePos() - ), - ]; - } - } - break; - } - } - - if (isset($parsed_docblock->tags['psalm-flow'])) { - foreach ($parsed_docblock->tags['psalm-flow'] as $param) { - $info->flows[] = trim($param); - } - } - - if (isset($parsed_docblock->tags['psalm-if-this-is'])) { - foreach ($parsed_docblock->tags['psalm-if-this-is'] as $offset => $param) { - $line_parts = CommentAnalyzer::splitDocLine($param); - - $line_parts[0] = str_replace("\n", '', preg_replace('@^[ \t]*\*@m', '', $line_parts[0])); - - $info->if_this_is = [ - 'type' => str_replace("\n", '', $line_parts[0]), - 'line_number' => $comment->getStartLine() + substr_count( - $comment->getText(), - "\n", - 0, - $offset - $comment->getStartFilePos() - ), - ]; - } - } - - if (isset($parsed_docblock->tags['psalm-taint-sink'])) { - foreach ($parsed_docblock->tags['psalm-taint-sink'] as $param) { - $param_parts = preg_split('/\s+/', trim($param)); - - if (count($param_parts) >= 2) { - $info->taint_sink_params[] = ['name' => $param_parts[1], 'taint' => $param_parts[0]]; - } - } - } - - // support for MediaWiki taint plugin - if (isset($parsed_docblock->tags['param-taint'])) { - foreach ($parsed_docblock->tags['param-taint'] as $param) { - $param_parts = preg_split('/\s+/', trim($param)); - - if (count($param_parts) === 2) { - $taint_type = $param_parts[1]; - - if (strpos($taint_type, 'exec_') === 0) { - $taint_type = substr($taint_type, 5); - - if ($taint_type === 'tainted') { - $taint_type = 'input'; - } - - if ($taint_type === 'misc') { - $taint_type = 'text'; - } - - $info->taint_sink_params[] = ['name' => $param_parts[0], 'taint' => $taint_type]; - } - } - } - } - - if (isset($parsed_docblock->tags['psalm-taint-source'])) { - foreach ($parsed_docblock->tags['psalm-taint-source'] as $param) { - $param_parts = preg_split('/\s+/', trim($param)); - - if ($param_parts[0]) { - $info->taint_source_types[] = $param_parts[0]; - } - } - } elseif (isset($parsed_docblock->tags['return-taint'])) { - // support for MediaWiki taint plugin - foreach ($parsed_docblock->tags['return-taint'] as $param) { - $param_parts = preg_split('/\s+/', trim($param)); - - if ($param_parts[0]) { - if ($param_parts[0] === 'tainted') { - $param_parts[0] = 'input'; - } - - if ($param_parts[0] === 'misc') { - $param_parts[0] = 'text'; - } - - if ($param_parts[0] !== 'none') { - $info->taint_source_types[] = $param_parts[0]; - } - } - } - } - - if (isset($parsed_docblock->tags['psalm-taint-unescape'])) { - foreach ($parsed_docblock->tags['psalm-taint-unescape'] as $param) { - $param = trim($param); - $info->added_taints[] = $param; - } - } - - if (isset($parsed_docblock->tags['psalm-taint-escape'])) { - foreach ($parsed_docblock->tags['psalm-taint-escape'] as $param) { - $param = trim($param); - if ($param[0] === '(') { - $line_parts = CommentAnalyzer::splitDocLine($param); - - $info->removed_taints[] = CommentAnalyzer::sanitizeDocblockType($line_parts[0]); - } else { - $info->removed_taints[] = explode(' ', $param)[0]; - } - } - } - - if (isset($parsed_docblock->tags['psalm-assert-untainted'])) { - foreach ($parsed_docblock->tags['psalm-assert-untainted'] as $param) { - $param = trim($param); - - $info->assert_untainted_params[] = ['name' => $param]; - } - } - - if (isset($parsed_docblock->tags['psalm-taint-specialize'])) { - $info->specialize_call = true; - } - - if (isset($parsed_docblock->tags['global'])) { - foreach ($parsed_docblock->tags['global'] as $offset => $global) { - $line_parts = CommentAnalyzer::splitDocLine($global); - - if (count($line_parts) === 1 && isset($line_parts[0][0]) && $line_parts[0][0] === '$') { - continue; - } - - if (count($line_parts) > 1) { - if (!preg_match('/\[[^\]]+\]/', $line_parts[0]) - && preg_match('/^(\.\.\.)?&?\$[A-Za-z0-9_]+,?$/', $line_parts[1]) - && $line_parts[0][0] !== '{' - ) { - if ($line_parts[1][0] === '&') { - $line_parts[1] = substr($line_parts[1], 1); - } - - if ($line_parts[0][0] === '$' && !preg_match('/^\$this(\||$)/', $line_parts[0])) { - throw new IncorrectDocblockException('Misplaced variable'); - } - - $line_parts[1] = preg_replace('/,$/', '', $line_parts[1]); - - $info->globals[] = [ - 'name' => $line_parts[1], - 'type' => $line_parts[0], - 'line_number' => $comment->getStartLine() + substr_count( - $comment_text, - "\n", - 0, - $offset - $comment->getStartFilePos() - ), - ]; - } - } else { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Badly-formatted @param in docblock for ' . $cased_function_id, - $code_location - ) - ); - } - } - } - - if (isset($parsed_docblock->tags['since'])) { - $since = trim(reset($parsed_docblock->tags['since'])); - if (preg_match('/^[4578]\.\d(\.\d+)?$/', $since)) { - $since_parts = explode('.', $since); - - $info->since_php_major_version = (int)$since_parts[0]; - $info->since_php_minor_version = (int)$since_parts[1]; - } - } - - if (isset($parsed_docblock->tags['deprecated'])) { - $info->deprecated = true; - } - - if (isset($parsed_docblock->tags['internal'])) { - $info->internal = true; - } - - if (count($info->psalm_internal = DocblockParser::handlePsalmInternal($parsed_docblock)) !== 0) { - $info->internal = true; - } - - if (isset($parsed_docblock->tags['psalm-suppress'])) { - foreach ($parsed_docblock->tags['psalm-suppress'] as $offset => $suppress_entry) { - foreach (DocComment::parseSuppressList($suppress_entry) as $issue_offset => $suppressed_issue) { - $info->suppressed_issues[$issue_offset + $offset] = $suppressed_issue; - } - } - } - - if (isset($parsed_docblock->tags['throws'])) { - foreach ($parsed_docblock->tags['throws'] as $offset => $throws_entry) { - $throws_class = preg_split('/[\s]+/', $throws_entry)[0]; - - if (!$throws_class) { - throw new IncorrectDocblockException('Unexpectedly empty @throws'); - } - - $info->throws[] = [ - $throws_class, - $offset, - $comment->getStartLine() + substr_count( - $comment->getText(), - "\n", - 0, - $offset - $comment->getStartFilePos() - ) - ]; - } - } - - if (stripos($parsed_docblock->description, '@inheritdoc') !== false - || isset($parsed_docblock->tags['inheritdoc']) - || isset($parsed_docblock->tags['inheritDoc']) - ) { - $info->inheritdoc = true; - } - - $templates = []; - if (isset($parsed_docblock->combined_tags['template'])) { - foreach ($parsed_docblock->combined_tags['template'] as $offset => $template_line) { - $template_type = preg_split('/[\s]+/', preg_replace('@^[ \t]*\*@m', '', $template_line)); - - $template_name = array_shift($template_type); - - if (!$template_name) { - throw new IncorrectDocblockException('Empty @template tag'); - } - - $source_prefix = 'none'; - if (isset($parsed_docblock->tags['psalm-template'][$offset])) { - $source_prefix = 'psalm'; - } elseif (isset($parsed_docblock->tags['phpstan-template'][$offset])) { - $source_prefix = 'phpstan'; - } - - if (count($template_type) > 1 - && in_array(strtolower($template_type[0]), ['as', 'super', 'of'], true) - ) { - $template_modifier = strtolower(array_shift($template_type)); - $templates[$template_name][$source_prefix] = [ - $template_name, - $template_modifier, - implode(' ', $template_type), - false - ]; - } else { - $templates[$template_name][$source_prefix] = [$template_name, null, null, false]; - } - } - } - - foreach ($templates as $template_entries) { - foreach (['psalm', 'phpstan', 'none'] as $source_prefix) { - if (isset($template_entries[$source_prefix])) { - $info->templates[] = $template_entries[$source_prefix]; - break; - } - } - } - - if (isset($parsed_docblock->tags['psalm-assert'])) { - foreach ($parsed_docblock->tags['psalm-assert'] as $assertion) { - $line_parts = self::sanitizeAssertionLineParts(CommentAnalyzer::splitDocLine($assertion)); - - $info->assertions[] = [ - 'type' => $line_parts[0], - 'param_name' => $line_parts[1][0] === '$' ? substr($line_parts[1], 1) : $line_parts[1], - ]; - } - } - - if (isset($parsed_docblock->tags['psalm-assert-if-true'])) { - foreach ($parsed_docblock->tags['psalm-assert-if-true'] as $assertion) { - $line_parts = self::sanitizeAssertionLineParts(CommentAnalyzer::splitDocLine($assertion)); - - $info->if_true_assertions[] = [ - 'type' => $line_parts[0], - 'param_name' => $line_parts[1][0] === '$' ? substr($line_parts[1], 1) : $line_parts[1], - ]; - } - } - - if (isset($parsed_docblock->tags['psalm-assert-if-false'])) { - foreach ($parsed_docblock->tags['psalm-assert-if-false'] as $assertion) { - $line_parts = self::sanitizeAssertionLineParts(CommentAnalyzer::splitDocLine($assertion)); - - $info->if_false_assertions[] = [ - 'type' => $line_parts[0], - 'param_name' => $line_parts[1][0] === '$' ? substr($line_parts[1], 1) : $line_parts[1], - ]; - } - } - - $info->variadic = isset($parsed_docblock->tags['psalm-variadic']); - $info->pure = isset($parsed_docblock->tags['psalm-pure']) - || isset($parsed_docblock->tags['pure']); - - if (isset($parsed_docblock->tags['psalm-mutation-free'])) { - $info->mutation_free = true; - } - - if (isset($parsed_docblock->tags['psalm-external-mutation-free'])) { - $info->external_mutation_free = true; - } - - if (isset($parsed_docblock->tags['no-named-arguments'])) { - $info->no_named_args = true; - } - - $info->ignore_nullable_return = isset($parsed_docblock->tags['psalm-ignore-nullable-return']); - $info->ignore_falsable_return = isset($parsed_docblock->tags['psalm-ignore-falsable-return']); - $info->stub_override = isset($parsed_docblock->tags['psalm-stub-override']); - - if (!empty($parsed_docblock->description)) { - $info->description = $parsed_docblock->description; - } - - return $info; - } - - /** - * @psalm-pure - * @param list $line_parts - * @return array{string, string} $line_parts - */ - private static function sanitizeAssertionLineParts(array $line_parts): array - { - if (count($line_parts) < 2 || strpos($line_parts[1], '$') === false) { - throw new IncorrectDocblockException('Misplaced variable'); - } - - $line_parts[0] = CommentAnalyzer::sanitizeDocblockType($line_parts[0]); - - if ($line_parts[1][0] === '$') { - $param_name_parts = explode('->', $line_parts[1]); - - foreach ($param_name_parts as $i => $param_name_part) { - if (substr($param_name_part, -2) === '()') { - $param_name_parts[$i] = strtolower($param_name_part); - } - } - - $line_parts[1] = implode('->', $param_name_parts); - } - - return $line_parts; - } - - /** - * @param array $return_specials - */ - private static function extractReturnType( - PhpParser\Comment\Doc $comment, - array $return_specials, - FunctionDocblockComment $info, - CodeLocation $code_location, - string $cased_function_id - ): void { - foreach ($return_specials as $offset => $return_block) { - $return_lines = explode("\n", $return_block); - - if (trim($return_lines[0]) === '') { - return; - } - - $return_block = trim($return_block); - - if ($return_block === '') { - return; - } - - $line_parts = CommentAnalyzer::splitDocLine($return_block); - - if ($line_parts[0][0] !== '{') { - if ($line_parts[0][0] === '$' && !preg_match('/^\$this(\||$)/', $line_parts[0])) { - throw new IncorrectDocblockException('Misplaced variable'); - } - - $end = $offset + strlen($line_parts[0]); - - $line_parts[0] = CommentAnalyzer::sanitizeDocblockType($line_parts[0]); - - $info->return_type = array_shift($line_parts); - $info->return_type_description = $line_parts ? implode(' ', $line_parts) : null; - - $info->return_type_line_number - = $comment->getStartLine() + substr_count( - $comment->getText(), - "\n", - 0, - $offset - $comment->getStartFilePos() - ); - $info->return_type_start = $offset; - $info->return_type_end = $end; - } else { - IssueBuffer::maybeAdd( - new InvalidDocblock( - 'Badly-formatted @param in docblock for ' . $cased_function_id, - $code_location - ) - ); - } - - break; - } - } - - /** - * @throws DocblockParseException if a duplicate is found - */ - private static function checkDuplicatedTags(ParsedDocblock $parsed_docblock): void - { - if (count($parsed_docblock->tags['return'] ?? []) > 1 - || count($parsed_docblock->tags['psalm-return'] ?? []) > 1 - || count($parsed_docblock->tags['phpstan-return'] ?? []) > 1 - ) { - throw new DocblockParseException('Found duplicated @return or prefixed @return tag'); - } - - self::checkDuplicatedParams($parsed_docblock->tags['param'] ?? []); - self::checkDuplicatedParams($parsed_docblock->tags['psalm-param'] ?? []); - self::checkDuplicatedParams($parsed_docblock->tags['phpstan-param'] ?? []); - } - - /** - * @param array $param - * - * - * @throws DocblockParseException if a duplicate is found - */ - private static function checkDuplicatedParams(array $param): void - { - $list_names = self::extractAllParamNames($param); - - if (count($list_names) !== count(array_unique($list_names))) { - throw new DocblockParseException('Found duplicated @param or prefixed @param tag'); - } - } - - /** - * @param array $lines - * - * @return list - * - * @psalm-pure - */ - private static function extractAllParamNames(array $lines): array - { - $names = []; - - foreach ($lines as $line) { - $split_by_dollar = explode('$', $line, 2); - if (count($split_by_dollar) > 1) { - $split_by_space = explode(' ', $split_by_dollar[1], 2); - $names[] = $split_by_space[0]; - } - } - - return $names; - } - - private static function checkUnexpectedTags( - ParsedDocblock $parsed_docblock, - FunctionDocblockComment $info, - PhpParser\Comment\Doc $comment - ): void { - if (isset($parsed_docblock->tags['psalm-import-type'])) { - foreach ($parsed_docblock->tags['psalm-import-type'] as $offset => $_) { - $info->unexpected_tags['psalm-import-type']['lines'][] = self::docblockLineNumber($comment, $offset); - } - } - - if (isset($parsed_docblock->combined_tags['var'])) { - $info->unexpected_tags['var'] = ['lines' => [], 'suggested_replacement' => 'param']; - foreach ($parsed_docblock->combined_tags['var'] as $offset => $_) { - $info->unexpected_tags['var']['lines'][] = self::docblockLineNumber($comment, $offset); - } - } - } - - private static function docblockLineNumber(PhpParser\Comment\Doc $comment, int $offset): int - { - return $comment->getStartLine() + substr_count( - $comment->getText(), - "\n", - 0, - $offset - $comment->getStartFilePos() - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php deleted file mode 100644 index d78bff90..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php +++ /dev/null @@ -1,1454 +0,0 @@ -> $existing_function_template_types - * @param array $type_aliases - */ - public static function addDocblockInfo( - Codebase $codebase, - FileScanner $file_scanner, - FileStorage $file_storage, - Aliases $aliases, - array $type_aliases, - ?ClassLikeStorage $classlike_storage, - array $existing_function_template_types, - FunctionLikeStorage $storage, - PhpParser\Node\FunctionLike $stmt, - FunctionDocblockComment $docblock_info, - bool $is_functionlike_override, - bool $fake_method, - string $cased_function_id - ): void { - self::handleUnexpectedTags($docblock_info, $storage, $stmt, $file_scanner, $cased_function_id); - - $config = Config::getInstance(); - - if ($docblock_info->mutation_free) { - $storage->mutation_free = true; - - if ($storage instanceof MethodStorage) { - $storage->external_mutation_free = true; - $storage->mutation_free_inferred = false; - } - } - - if ($storage instanceof MethodStorage && $docblock_info->external_mutation_free) { - $storage->external_mutation_free = true; - } - - if ($docblock_info->deprecated) { - $storage->deprecated = true; - } - - if (count($docblock_info->psalm_internal) !== 0) { - $storage->internal = $docblock_info->psalm_internal; - } elseif ($docblock_info->internal && $aliases->namespace) { - $storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($aliases->namespace)]; - } - - if (($storage->internal || ($classlike_storage && $classlike_storage->internal)) - && !$config->allow_internal_named_arg_calls - ) { - $storage->allow_named_arg_calls = false; - } elseif ($docblock_info->no_named_args) { - $storage->allow_named_arg_calls = false; - } - - if ($docblock_info->variadic) { - $storage->variadic = true; - } - - if ($docblock_info->pure) { - $storage->pure = true; - $storage->specialize_call = true; - $storage->mutation_free = true; - if ($storage instanceof MethodStorage) { - $storage->external_mutation_free = true; - } - } - - if ($docblock_info->specialize_call) { - $storage->specialize_call = true; - } - - // we make sure we only add ignore flag for internal stubs if the config is set to true - if ($docblock_info->ignore_nullable_return - && $storage->return_type - && ($codebase->config->ignore_internal_nullable_issues - || !in_array($file_storage->file_path, $codebase->config->internal_stubs) - ) - ) { - $storage->return_type->ignore_nullable_issues = true; - } - - // we make sure we only add ignore flag for internal stubs if the config is set to true - if ($docblock_info->ignore_falsable_return - && $storage->return_type - && ($codebase->config->ignore_internal_falsable_issues - || !in_array($file_storage->file_path, $codebase->config->internal_stubs) - ) - ) { - $storage->return_type->ignore_falsable_issues = true; - } - - if ($docblock_info->stub_override && !$is_functionlike_override) { - throw new InvalidMethodOverrideException( - 'Method ' . $cased_function_id . ' is marked as stub override,' - . ' but no original counterpart found' - ); - } - - $storage->suppressed_issues = $docblock_info->suppressed_issues; - - foreach ($docblock_info->throws as [$throw, $offset, $line]) { - $throw_location = new DocblockTypeLocation( - $file_scanner, - $offset, - $offset + strlen($throw), - $line - ); - - $class_names = array_filter(array_map('trim', explode('|', $throw))); - - foreach ($class_names as $throw_class) { - if ($throw_class !== 'self' && $throw_class !== 'static' && $throw_class !== 'parent') { - $exception_fqcln = Type::getFQCLNFromString( - $throw_class, - $aliases - ); - } else { - $exception_fqcln = $throw_class; - } - - $codebase->scanner->queueClassLikeForScanning($exception_fqcln); - $file_storage->referenced_classlikes[strtolower($exception_fqcln)] = $exception_fqcln; - $storage->throws[$exception_fqcln] = true; - $storage->throw_locations[$exception_fqcln] = $throw_location; - } - } - - if (!$config->use_docblock_types) { - return; - } - - if ($storage instanceof MethodStorage && $docblock_info->inheritdoc) { - $storage->inheritdoc = true; - } - - $template_types = $classlike_storage && $classlike_storage->template_types - ? $classlike_storage->template_types - : null; - - $function_template_types = $existing_function_template_types; - $class_template_types = $classlike_storage ? ($classlike_storage->template_types ?: []) : []; - - if ($docblock_info->templates) { - $function_template_types = self::handleTemplates( - $storage, - $docblock_info, - $aliases, - $template_types, - $type_aliases, - $file_scanner, - $stmt, - $cased_function_id - ); - } - - self::handleAssertions( - $docblock_info, - $storage, - $codebase, - $file_scanner, - $file_storage, - $aliases, - $stmt, - $class_template_types, - $function_template_types, - $type_aliases, - $classlike_storage - ); - - foreach ($docblock_info->globals as $global) { - try { - $storage->global_types[$global['name']] = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $global['type'], - $aliases, - null, - $type_aliases - ), - null - ); - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $cased_function_id, - new CodeLocation($file_scanner, $stmt, null, true) - ); - - continue; - } - } - - if ($docblock_info->params) { - self::improveParamsFromDocblock( - $codebase, - $file_scanner, - $file_storage, - $aliases, - $type_aliases, - $classlike_storage, - $storage, - $function_template_types, - $class_template_types, - $docblock_info->params, - $stmt, - $fake_method, - $classlike_storage && !$classlike_storage->is_trait ? $classlike_storage->name : null - ); - } - - if ($storage instanceof MethodStorage) { - $storage->has_docblock_param_types = (bool) array_filter( - $storage->params, - function (FunctionLikeParameter $p): bool { - return $p->type !== null && $p->has_docblock_type; - } - ); - } - - foreach ($docblock_info->params_out as $docblock_param_out) { - self::handleParamOut( - $docblock_param_out, - $aliases, - $function_template_types, - $class_template_types, - $type_aliases, - $cased_function_id, - $file_scanner, - $stmt, - $storage, - $codebase, - $file_storage - ); - } - - if ($docblock_info->self_out - && $storage instanceof MethodStorage) { - $out_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $docblock_info->self_out['type'], - $aliases, - $function_template_types + $class_template_types, - $type_aliases, - $classlike_storage ? $classlike_storage->name : null - ), - null, - $function_template_types + $class_template_types, - $type_aliases - ); - $storage->self_out_type = $out_type; - } - - if ($docblock_info->if_this_is - && $storage instanceof MethodStorage) { - $out_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $docblock_info->if_this_is['type'], - $aliases, - $function_template_types + $class_template_types, - $type_aliases, - $classlike_storage ? $classlike_storage->name : null - ), - null, - $function_template_types + $class_template_types, - $type_aliases - ); - $storage->if_this_is_type = $out_type; - } - - foreach ($docblock_info->taint_sink_params as $taint_sink_param) { - $param_name = substr($taint_sink_param['name'], 1); - - foreach ($storage->params as $param_storage) { - if ($param_storage->name === $param_name) { - $param_storage->sinks[] = $taint_sink_param['taint']; - } - } - } - - foreach ($docblock_info->taint_source_types as $taint_source_type) { - if ($taint_source_type === 'input') { - $storage->taint_source_types = array_merge( - $storage->taint_source_types, - TaintKindGroup::ALL_INPUT - ); - } else { - $storage->taint_source_types[] = $taint_source_type; - } - } - - $storage->added_taints = $docblock_info->added_taints; - - foreach ($docblock_info->removed_taints as $removed_taint) { - if ($removed_taint[0] === '(') { - self::handleRemovedTaint( - $codebase, - $stmt, - $aliases, - $removed_taint, - $function_template_types, - $class_template_types, - $type_aliases, - $storage, - $classlike_storage, - $cased_function_id, - $file_storage, - $file_scanner - ); - } else { - $storage->removed_taints[] = $removed_taint; - } - } - - self::handleTaintFlow($docblock_info, $storage); - - foreach ($docblock_info->assert_untainted_params as $untainted_assert_param) { - $param_name = substr($untainted_assert_param['name'], 1); - - foreach ($storage->params as $param_storage) { - if ($param_storage->name === $param_name) { - $param_storage->assert_untainted = true; - } - } - } - - if ($docblock_info->return_type !== null) { - self::handleReturn( - $codebase, - $docblock_info, - $docblock_info->return_type, - $fake_method, - $file_scanner, - $storage, - $stmt, - $aliases, - $function_template_types, - $class_template_types, - $type_aliases, - $classlike_storage, - $cased_function_id, - $file_storage - ); - } - - if ($docblock_info->description) { - $storage->description = $docblock_info->description; - } - } - - /** - * @param array> $template_types - * @param array|null $type_aliases - * @param array> $function_template_types - * - * @return array{ - * array, - * array> - * } - */ - private static function getConditionalSanitizedTypeTokens( - string $docblock_return_type, - Aliases $aliases, - array $template_types, - ?array $type_aliases, - FunctionLikeStorage $storage, - ?ClassLikeStorage $classlike_storage, - string $cased_function_id, - array $function_template_types - ): array { - $fixed_type_tokens = TypeTokenizer::getFullyQualifiedTokens( - $docblock_return_type, - $aliases, - $template_types, - $type_aliases, - $classlike_storage && !$classlike_storage->is_trait ? $classlike_storage->name : null - ); - - $param_type_mapping = []; - - // This checks for param references in the return type tokens - // If found, the param is replaced with a generated template param - foreach ($fixed_type_tokens as $i => $type_token) { - $token_body = $type_token[0]; - $template_function_id = 'fn-' . strtolower($cased_function_id); - - if ($token_body[0] === '$') { - foreach ($storage->params as $j => $param_storage) { - if ('$' . $param_storage->name === $token_body) { - if (!isset($param_type_mapping[$token_body])) { - $template_name = 'TGeneratedFromParam' . $j; - - $template_as_type = $param_storage->type - ? clone $param_storage->type - : Type::getMixed(); - - $storage->template_types[$template_name] = [ - $template_function_id => $template_as_type, - ]; - - $function_template_types[$template_name] - = $storage->template_types[$template_name]; - - $param_type_mapping[$token_body] = $template_name; - - $param_storage->type = new Union([ - new TTemplateParam( - $template_name, - $template_as_type, - $template_function_id - ) - ]); - } - - // 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]) - && $fixed_type_tokens[$i - 1][0][0] === ' ' - ) { - unset($fixed_type_tokens[$i - 1]); - } - - $fixed_type_tokens[$i][0] = $param_type_mapping[$token_body]; - - continue 2; - } - } - } - - if ($token_body === 'func_num_args()') { - $template_name = 'TFunctionArgCount'; - - $storage->template_types[$template_name] = [ - $template_function_id => Type::getInt(), - ]; - - $function_template_types[$template_name] - = $storage->template_types[$template_name]; - - $fixed_type_tokens[$i][0] = $template_name; - } - - if ($token_body === 'PHP_MAJOR_VERSION') { - $template_name = 'TPhpMajorVersion'; - - $storage->template_types[$template_name] = [ - $template_function_id => Type::getInt(), - ]; - - $function_template_types[$template_name] - = $storage->template_types[$template_name]; - - $fixed_type_tokens[$i][0] = $template_name; - } - - if ($token_body === 'PHP_VERSION_ID') { - $template_name = 'TPhpVersionId'; - - $storage->template_types[$template_name] = [ - $template_function_id => Type::getInt() - ]; - - $function_template_types[$template_name] - = $storage->template_types[$template_name]; - - $fixed_type_tokens[$i][0] = $template_name; - } - } - - return [$fixed_type_tokens, $function_template_types]; - } - - /** - * @param array> $class_template_types - * @param array> $function_template_types - * @param array $type_aliases - * @return non-empty-list|null - */ - private static function getAssertionParts( - Codebase $codebase, - FileScanner $file_scanner, - FileStorage $file_storage, - Aliases $aliases, - PhpParser\Node\FunctionLike $stmt, - FunctionLikeStorage $storage, - string $assertion_type, - array $class_template_types, - array $function_template_types, - array $type_aliases, - ?string $self_fqcln - ): ?array { - $prefix = ''; - - if ($assertion_type[0] === '!') { - $prefix = '!'; - $assertion_type = substr($assertion_type, 1); - } - - if ($assertion_type[0] === '~') { - $prefix .= '~'; - $assertion_type = substr($assertion_type, 1); - } - - if ($assertion_type[0] === '=') { - $prefix .= '='; - $assertion_type = substr($assertion_type, 1); - } - - $class_template_types = !$stmt instanceof PhpParser\Node\Stmt\ClassMethod || !$stmt->isStatic() - ? $class_template_types - : []; - - try { - $namespaced_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $assertion_type, - $aliases, - $function_template_types + $class_template_types, - $type_aliases, - $self_fqcln, - null, - true - ) - ); - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - 'Invalid @psalm-assert union type ' . $e, - new CodeLocation($file_scanner, $stmt, null, true) - ); - - return null; - } - - - if ($prefix && count($namespaced_type->getAtomicTypes()) > 1) { - $storage->docblock_issues[] = new InvalidDocblock( - 'Docblock assertions cannot contain | characters together with ' . $prefix, - new CodeLocation($file_scanner, $stmt, null, true) - ); - - return null; - } - - $namespaced_type->queueClassLikesForScanning( - $codebase, - $file_storage, - $function_template_types + $class_template_types - ); - - $assertion_type_parts = []; - - foreach ($namespaced_type->getAtomicTypes() as $namespaced_type_part) { - if ($namespaced_type_part instanceof TAssertionFalsy - || $namespaced_type_part instanceof TClassConstant - || ($namespaced_type_part instanceof TList - && $namespaced_type_part->type_param->isMixed()) - || ($namespaced_type_part instanceof TArray - && $namespaced_type_part->type_params[0]->isArrayKey() - && $namespaced_type_part->type_params[1]->isMixed()) - || ($namespaced_type_part instanceof TIterable - && $namespaced_type_part->type_params[0]->isMixed() - && $namespaced_type_part->type_params[1]->isMixed()) - ) { - $assertion_type_parts[] = $prefix . $namespaced_type_part->getAssertionString(); - } else { - $assertion_type_parts[] = $prefix . $namespaced_type_part->getId(); - } - } - - return $assertion_type_parts; - } - - /** - * @param array> $class_template_types - * @param array> $function_template_types - * @param array $type_aliases - * @param array< - * int, - * array{ - * type:string, - * name:string, - * line_number:int, - * start:int, - * end:int, - * description?:string - * } - * > $docblock_params - */ - private static function improveParamsFromDocblock( - Codebase $codebase, - FileScanner $file_scanner, - FileStorage $file_storage, - Aliases $aliases, - array $type_aliases, - ?ClassLikeStorage $classlike_storage, - FunctionLikeStorage $storage, - array &$function_template_types, - array $class_template_types, - array $docblock_params, - PhpParser\Node\FunctionLike $function, - bool $fake_method, - ?string $fq_classlike_name - ): void { - $base = $classlike_storage ? $classlike_storage->name . '::' : ''; - - $cased_method_id = $base . $storage->cased_name; - - $unused_docblock_params = []; - - $class_template_types = !$function instanceof PhpParser\Node\Stmt\ClassMethod || !$function->isStatic() - ? $class_template_types - : []; - - foreach ($docblock_params as $docblock_param) { - $param_name = $docblock_param['name']; - $docblock_param_variadic = false; - - if (strpos($param_name, '...') === 0) { - $docblock_param_variadic = true; - $param_name = substr($param_name, 3); - } - - $param_name = substr($param_name, 1); - - $storage_param = null; - - foreach ($storage->params as $function_signature_param) { - if ($function_signature_param->name === $param_name) { - $storage_param = $function_signature_param; - break; - } - } - - if (!$fake_method) { - $docblock_type_location = new DocblockTypeLocation( - $file_scanner, - $docblock_param['start'], - $docblock_param['end'], - $docblock_param['line_number'] - ); - } else { - $docblock_type_location = new CodeLocation( - $file_scanner, - $function, - null, - false, - CodeLocation::FUNCTION_PHPDOC_METHOD, - null - ); - } - - if ($storage_param === null) { - $param_location = new CodeLocation( - $file_scanner, - $function, - null, - true, - CodeLocation::FUNCTION_PARAM_VAR - ); - - $param_location->setCommentLine($docblock_param['line_number']); - $unused_docblock_params[$param_name] = $param_location; - - if (!$docblock_param_variadic || $storage->params || $file_scanner->will_analyze) { - continue; - } - - $storage_param = new FunctionLikeParameter( - $param_name, - false, - null, - null, - null, - false, - false, - true, - null - ); - - $storage->addParam($storage_param); - } - - try { - $new_param_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $docblock_param['type'], - $aliases, - $function_template_types + $class_template_types, - $type_aliases, - $fq_classlike_name - ), - null, - $function_template_types + $class_template_types, - $type_aliases - ); - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $cased_method_id, - $docblock_type_location - ); - - continue; - } - - $storage_param->has_docblock_type = true; - $new_param_type->setFromDocblock(); - - $new_param_type->queueClassLikesForScanning( - $codebase, - $file_storage, - $storage->template_types ?: [] - ); - - if ($storage->template_types) { - foreach ($storage->template_types as $t => $type_map) { - foreach ($type_map as $obj => $type) { - if ($type->isMixed() && $docblock_param['type'] === 'class-string<' . $t . '>') { - $storage->template_types[$t][$obj] = Type::getObject(); - - if (isset($function_template_types[$t])) { - $function_template_types[$t][$obj] = $storage->template_types[$t][$obj]; - } - } - } - } - } - - if (!$docblock_param_variadic && $storage_param->is_variadic && $new_param_type->hasArray()) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TKeyedArray|TList - */ - $array_type = $new_param_type->getAtomicTypes()['array']; - - if ($array_type instanceof TKeyedArray) { - $new_param_type = $array_type->getGenericValueType(); - } elseif ($array_type instanceof TList) { - $new_param_type = $array_type->type_param; - } else { - $new_param_type = $array_type->type_params[1]; - } - } - - $existing_param_type_nullable = $storage_param->is_nullable; - - if (isset($docblock_param['description'])) { - $storage_param->description = $docblock_param['description']; - } - - if (!$storage_param->type || $storage_param->type->hasMixed() || $storage->template_types) { - if ($existing_param_type_nullable - && !$new_param_type->isNullable() - && !$new_param_type->hasTemplate() - ) { - $new_param_type->addType(new TNull()); - } - - $config = Config::getInstance(); - - if ($config->add_param_default_to_docblock_type - && $storage_param->default_type instanceof Union - && !$storage_param->default_type->hasMixed() - && (!$storage_param->type || !$storage_param->type->hasMixed()) - ) { - $new_param_type = Type::combineUnionTypes($new_param_type, $storage_param->default_type); - } - - $storage_param->type = $new_param_type; - $storage_param->type_location = $docblock_type_location; - continue; - } - - $storage_param_atomic_types = $storage_param->type->getAtomicTypes(); - - $all_typehint_types_match = true; - - foreach ($new_param_type->getAtomicTypes() as $key => $type) { - if (isset($storage_param_atomic_types[$key])) { - $type->from_docblock = false; - - if ($storage_param_atomic_types[$key] instanceof TArray - && $type instanceof TArray - && $type->type_params[0]->hasArrayKey() - ) { - $type->type_params[0]->from_docblock = false; - } - } else { - $all_typehint_types_match = false; - } - } - - if ($all_typehint_types_match) { - $new_param_type->from_docblock = false; - } - - if ($existing_param_type_nullable && !$new_param_type->isNullable()) { - $new_param_type->addType(new TNull()); - } - - $storage_param->type = $new_param_type; - $storage_param->type_location = $docblock_type_location; - } - - $params_without_docblock_type = array_filter( - $storage->params, - function (FunctionLikeParameter $p): bool { - return !$p->has_docblock_type && (!$p->type || $p->type->hasArray()); - } - ); - - if ($params_without_docblock_type) { - $storage->unused_docblock_params = $unused_docblock_params; - } - } - - /** - * @param array $type_aliases - * @param array> $function_template_types - * @param array> $class_template_types - */ - private static function handleReturn( - Codebase $codebase, - FunctionDocblockComment $docblock_info, - string $docblock_return_type, - bool $fake_method, - FileScanner $file_scanner, - FunctionLikeStorage $storage, - PhpParser\Node\FunctionLike $stmt, - Aliases $aliases, - array $function_template_types, - array $class_template_types, - array $type_aliases, - ?ClassLikeStorage $classlike_storage, - string $cased_function_id, - FileStorage $file_storage - ): void { - if (!$fake_method - && $docblock_info->return_type_line_number - && $docblock_info->return_type_start - && $docblock_info->return_type_end - ) { - $storage->return_type_location = new DocblockTypeLocation( - $file_scanner, - $docblock_info->return_type_start, - $docblock_info->return_type_end, - $docblock_info->return_type_line_number - ); - } else { - $storage->return_type_location = new CodeLocation( - $file_scanner, - $stmt, - null, - false, - !$fake_method - ? CodeLocation::FUNCTION_PHPDOC_RETURN_TYPE - : CodeLocation::FUNCTION_PHPDOC_METHOD, - $docblock_info->return_type - ); - } - - try { - [$fixed_type_tokens, $function_template_types] = self::getConditionalSanitizedTypeTokens( - $docblock_return_type, - $aliases, - $function_template_types + $class_template_types, - $type_aliases, - $storage, - $classlike_storage, - $cased_function_id, - $function_template_types - ); - - $storage->return_type = TypeParser::parseTokens( - array_values($fixed_type_tokens), - null, - $function_template_types + $class_template_types, - $type_aliases - ); - - $storage->return_type->setFromDocblock(); - - if ($storage instanceof MethodStorage) { - $storage->has_docblock_return_type = true; - } - - if ($storage->signature_return_type) { - $all_typehint_types_match = true; - $signature_return_atomic_types = $storage->signature_return_type->getAtomicTypes(); - - foreach ($storage->return_type->getAtomicTypes() as $key => $type) { - if (isset($signature_return_atomic_types[$key])) { - $type->from_docblock = false; - } else { - $all_typehint_types_match = false; - } - } - - if ($all_typehint_types_match) { - $storage->return_type->from_docblock = false; - - if ($storage instanceof MethodStorage) { - $storage->has_docblock_return_type = true; - } - } - - // if the signature type contains null, we add null into the final return type too - if ($storage->signature_return_type->isNullable() - && !$storage->return_type->isNullable() - && !$storage->return_type->hasTemplate() - && !$storage->return_type->hasConditional() - ) { - //don't add null to final type if signature type don't match the docblock type - // however, we can't check for object types at this point (#6931), so we'll assume it's ok - if ($storage->return_type->hasObjectType() || - UnionTypeComparator::isContainedBy( - $codebase, - $storage->return_type, - $storage->signature_return_type - ) - ) { - $storage->return_type->addType(new TNull()); - } - } - } - - $storage->return_type->queueClassLikesForScanning($codebase, $file_storage); - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $cased_function_id, - new CodeLocation($file_scanner, $stmt, null, true) - ); - } - - // we make sure we only add ignore flag for internal stubs if the config is set to true - if ($docblock_info->ignore_nullable_return - && $storage->return_type - && ($codebase->config->ignore_internal_nullable_issues - || !in_array($file_storage->file_path, $codebase->config->internal_stubs) - ) - ) { - $storage->return_type->ignore_nullable_issues = true; - } - - // we make sure we only add ignore flag for internal stubs if the config is set to true - if ($docblock_info->ignore_falsable_return - && $storage->return_type - && ($codebase->config->ignore_internal_falsable_issues - || !in_array($file_storage->file_path, $codebase->config->internal_stubs) - ) - ) { - $storage->return_type->ignore_falsable_issues = true; - } - - if ($stmt->returnsByRef() && $storage->return_type) { - $storage->return_type->by_ref = true; - } - - if ($docblock_info->return_type_line_number && !$fake_method) { - $storage->return_type_location->setCommentLine($docblock_info->return_type_line_number); - } - - $storage->return_type_description = $docblock_info->return_type_description; - } - - private static function handleTaintFlow( - FunctionDocblockComment $docblock_info, - FunctionLikeStorage $storage - ): void { - if ($docblock_info->flows) { - foreach ($docblock_info->flows as $flow) { - $path_type = 'arg'; - - $fancy_path_regex = '/-\(([a-z\-]+)\)->/'; - - if (preg_match($fancy_path_regex, $flow, $matches)) { - if (isset($matches[1])) { - $path_type = $matches[1]; - } - - $flow = preg_replace($fancy_path_regex, '->', $flow); - } - - $flow_parts = explode('->', $flow); - - if (isset($flow_parts[1]) && trim($flow_parts[1]) === 'return') { - $source_param_string = trim($flow_parts[0]); - - if ($source_param_string[0] === '(' && substr($source_param_string, -1) === ')') { - $source_params = preg_split('/, ?/', substr($source_param_string, 1, -1)); - - foreach ($source_params as $source_param) { - $source_param = substr($source_param, 1); - - foreach ($storage->params as $i => $param_storage) { - if ($param_storage->name === $source_param) { - $storage->return_source_params[$i] = $path_type; - } - } - } - } - } - - if (isset($flow_parts[0]) && strpos(trim($flow_parts[0]), 'proxy') === 0) { - $proxy_call = trim(substr($flow_parts[0], strlen('proxy'))); - [$fully_qualified_name, $source_param_string] = explode('(', $proxy_call, 2); - - if (!empty($fully_qualified_name) && !empty($source_param_string)) { - $source_params = preg_split('/, ?/', substr($source_param_string, 0, -1)) ?: []; - $call_params = []; - foreach ($source_params as $source_param) { - $source_param = substr($source_param, 1); - - foreach ($storage->params as $i => $param_storage) { - if ($param_storage->name === $source_param) { - $call_params[] = $i; - } - } - } - - if ($storage->proxy_calls === null) { - $storage->proxy_calls = []; - } - - $storage->proxy_calls[] = [ - 'fqn' => $fully_qualified_name, - 'params' => $call_params, - 'return' => isset($flow_parts[1]) && trim($flow_parts[1]) === 'return' - ]; - } - } - } - } - } - - /** - * @param array $type_aliases - * @param array> $function_template_types - * @param array> $class_template_types - */ - private static function handleRemovedTaint( - Codebase $codebase, - PhpParser\Node\FunctionLike $stmt, - Aliases $aliases, - string $removed_taint, - array $function_template_types, - array $class_template_types, - array $type_aliases, - FunctionLikeStorage $storage, - ?ClassLikeStorage $classlike_storage, - string $cased_function_id, - FileStorage $file_storage, - FileScanner $file_scanner - ): void { - try { - [$fixed_type_tokens, $function_template_types] = self::getConditionalSanitizedTypeTokens( - $removed_taint, - $aliases, - $function_template_types + $class_template_types, - $type_aliases, - $storage, - $classlike_storage, - $cased_function_id, - $function_template_types - ); - - $removed_taint = TypeParser::parseTokens( - array_values($fixed_type_tokens), - null, - $function_template_types + $class_template_types, - $type_aliases - ); - - $removed_taint->queueClassLikesForScanning($codebase, $file_storage); - - $removed_taint_single = $removed_taint->getSingleAtomic(); - - if (!$removed_taint_single instanceof TConditional) { - throw new TypeParseTreeException('Escaped taint must be a conditional'); - } - - $storage->conditionally_removed_taints[] = $removed_taint; - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $cased_function_id, - new CodeLocation($file_scanner, $stmt, null, true) - ); - } - } - - /** - * @param array $type_aliases - * @param array> $function_template_types - * @param array> $class_template_types - */ - private static function handleAssertions( - FunctionDocblockComment $docblock_info, - FunctionLikeStorage $storage, - Codebase $codebase, - FileScanner $file_scanner, - FileStorage $file_storage, - Aliases $aliases, - PhpParser\Node\FunctionLike $stmt, - array $class_template_types, - array $function_template_types, - array $type_aliases, - ?ClassLikeStorage $classlike_storage - ): void { - if ($docblock_info->assertions) { - $storage->assertions = []; - - foreach ($docblock_info->assertions as $assertion) { - $assertion_type_parts = self::getAssertionParts( - $codebase, - $file_scanner, - $file_storage, - $aliases, - $stmt, - $storage, - $assertion['type'], - $class_template_types, - $function_template_types, - $type_aliases, - $classlike_storage && !$classlike_storage->is_trait ? $classlike_storage->name : null - ); - - if (!$assertion_type_parts) { - continue; - } - - foreach ($storage->params as $i => $param) { - if ($param->name === $assertion['param_name']) { - $storage->assertions[] = new Assertion( - $i, - [$assertion_type_parts] - ); - continue 2; - } - - if (strpos($assertion['param_name'], $param->name.'->') === 0) { - $storage->assertions[] = new Assertion( - str_replace($param->name, (string) $i, $assertion['param_name']), - [$assertion_type_parts] - ); - continue 2; - } - } - - $storage->assertions[] = new Assertion( - (strpos($assertion['param_name'], '$') === false ? '$' : '') . $assertion['param_name'], - [$assertion_type_parts] - ); - } - } - - if ($docblock_info->if_true_assertions) { - $storage->if_true_assertions = []; - - foreach ($docblock_info->if_true_assertions as $assertion) { - $assertion_type_parts = self::getAssertionParts( - $codebase, - $file_scanner, - $file_storage, - $aliases, - $stmt, - $storage, - $assertion['type'], - $class_template_types, - $function_template_types, - $type_aliases, - $classlike_storage && !$classlike_storage->is_trait ? $classlike_storage->name : null - ); - - if (!$assertion_type_parts) { - continue; - } - - foreach ($storage->params as $i => $param) { - if ($param->name === $assertion['param_name']) { - $storage->if_true_assertions[] = new Assertion( - $i, - [$assertion_type_parts] - ); - continue 2; - } - - if (strpos($assertion['param_name'], $param->name.'->') === 0) { - $storage->if_true_assertions[] = new Assertion( - str_replace($param->name, (string) $i, $assertion['param_name']), - [$assertion_type_parts] - ); - continue 2; - } - } - - $storage->if_true_assertions[] = new Assertion( - (strpos($assertion['param_name'], '$') === false ? '$' : '') . $assertion['param_name'], - [$assertion_type_parts] - ); - } - } - - if ($docblock_info->if_false_assertions) { - $storage->if_false_assertions = []; - - foreach ($docblock_info->if_false_assertions as $assertion) { - $assertion_type_parts = self::getAssertionParts( - $codebase, - $file_scanner, - $file_storage, - $aliases, - $stmt, - $storage, - $assertion['type'], - $class_template_types, - $function_template_types, - $type_aliases, - $classlike_storage && !$classlike_storage->is_trait ? $classlike_storage->name : null - ); - - if (!$assertion_type_parts) { - continue; - } - - foreach ($storage->params as $i => $param) { - if ($param->name === $assertion['param_name']) { - $storage->if_false_assertions[] = new Assertion( - $i, - [$assertion_type_parts] - ); - continue 2; - } - - if (strpos($assertion['param_name'], $param->name.'->') === 0) { - $storage->if_false_assertions[] = new Assertion( - str_replace($param->name, (string) $i, $assertion['param_name']), - [$assertion_type_parts] - ); - continue 2; - } - } - - $storage->if_false_assertions[] = new Assertion( - (strpos($assertion['param_name'], '$') === false ? '$' : '') . $assertion['param_name'], - [$assertion_type_parts] - ); - } - } - } - - /** - * @param array $type_aliases - * @param array> $function_template_types - * @param array> $class_template_types - * @param array{name:string, type:string, line_number: int} $docblock_param_out - */ - private static function handleParamOut( - array $docblock_param_out, - Aliases $aliases, - array $function_template_types, - array $class_template_types, - array $type_aliases, - string $cased_function_id, - FileScanner $file_scanner, - PhpParser\Node\FunctionLike $stmt, - FunctionLikeStorage $storage, - Codebase $codebase, - FileStorage $file_storage - ): void { - $param_name = substr($docblock_param_out['name'], 1); - - try { - $out_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $docblock_param_out['type'], - $aliases, - $function_template_types + $class_template_types, - $type_aliases - ), - null, - $function_template_types + $class_template_types, - $type_aliases - ); - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $cased_function_id, - new CodeLocation($file_scanner, $stmt, null, true) - ); - - return; - } - - $out_type->queueClassLikesForScanning( - $codebase, - $file_storage, - $storage->template_types ?: [] - ); - - foreach ($storage->params as $param_storage) { - if ($param_storage->name === $param_name) { - $param_storage->out_type = $out_type; - } - } - } - - /** - * @param ?array> $template_types - * @param array $type_aliases - * @return array> - */ - private static function handleTemplates( - FunctionLikeStorage $storage, - FunctionDocblockComment $docblock_info, - Aliases $aliases, - ?array $template_types, - array $type_aliases, - FileScanner $file_scanner, - PhpParser\Node\FunctionLike $stmt, - string $cased_function_id - ): array { - $storage->template_types = []; - - foreach ($docblock_info->templates as $template_map) { - $template_name = $template_map[0]; - - if ($template_map[1] !== null && $template_map[2] !== null) { - if (trim($template_map[2])) { - try { - $template_type = TypeParser::parseTokens( - TypeTokenizer::getFullyQualifiedTokens( - $template_map[2], - $aliases, - $storage->template_types + ($template_types ?: []), - $type_aliases - ), - null, - $storage->template_types + ($template_types ?: []), - $type_aliases - ); - } catch (TypeParseTreeException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - 'Template ' . $template_name . ' has invalid as type - ' . $e->getMessage(), - new CodeLocation($file_scanner, $stmt, null, true) - ); - - $template_type = Type::getMixed(); - } - } else { - $storage->docblock_issues[] = new InvalidDocblock( - 'Template ' . $template_name . ' missing as type', - new CodeLocation($file_scanner, $stmt, null, true) - ); - - $template_type = Type::getMixed(); - } - } else { - $template_type = Type::getMixed(); - } - - if (isset($template_types[$template_name])) { - $storage->docblock_issues[] = new InvalidDocblock( - 'Duplicate template param ' . $template_name . ' in docblock for ' - . $cased_function_id, - new CodeLocation($file_scanner, $stmt, null, true) - ); - } else { - $storage->template_types[$template_name] = [ - 'fn-' . strtolower($cased_function_id) => $template_type, - ]; - } - } - - return array_merge($template_types ?: [], $storage->template_types); - } - - private static function handleUnexpectedTags( - FunctionDocblockComment $docblock_info, - FunctionLikeStorage $storage, - PhpParser\Node\FunctionLike $stmt, - FileScanner $file_scanner, - string $cased_function_id - ): void { - foreach ($docblock_info->unexpected_tags as $tag => $details) { - foreach ($details['lines'] as $line) { - $tag_location = new CodeLocation($file_scanner, $stmt, null, true); - $tag_location->setCommentLine($line); - - $message = 'Docblock tag @' . $tag . ' is not recognized in the function docblock ' - . 'for ' . $cased_function_id; - - if (isset($details['suggested_replacement'])) { - $message .= ', did you mean to use @' . $details['suggested_replacement'] . '?'; - } - - $storage->docblock_issues[] = new PossiblyInvalidDocblockTag($message, $tag_location); - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php deleted file mode 100644 index cc101391..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php +++ /dev/null @@ -1,1151 +0,0 @@ -> - */ - private $existing_function_template_types; - - /** - * @var Aliases - */ - private $aliases; - - /** - * @var array - */ - private $type_aliases; - - /** - * @var ?FunctionLikeStorage - */ - public $storage; - - /** - * @param array> $existing_function_template_types - * @param array $type_aliases - */ - public function __construct( - Codebase $codebase, - FileScanner $file_scanner, - FileStorage $file_storage, - Aliases $aliases, - array $type_aliases, - ?ClassLikeStorage $classlike_storage, - array $existing_function_template_types - ) { - $this->codebase = $codebase; - $this->file_storage = $file_storage; - $this->file_scanner = $file_scanner; - $this->file_path = $file_storage->file_path; - $this->aliases = $aliases; - $this->type_aliases = $type_aliases; - $this->config = Config::getInstance(); - $this->classlike_storage = $classlike_storage; - $this->existing_function_template_types = $existing_function_template_types; - } - - /** - * @param bool $fake_method in the case of @method annotations we do something a little strange - * - * @return FunctionStorage|MethodStorage|false - */ - public function start(PhpParser\Node\FunctionLike $stmt, bool $fake_method = false) - { - if ($stmt instanceof PhpParser\Node\Expr\Closure - || $stmt instanceof PhpParser\Node\Expr\ArrowFunction - ) { - $this->codebase->scanner->queueClassLikeForScanning('Closure'); - } - - $functionlike_info = $this->createStorageForFunctionLike($stmt, $fake_method); - - if ($functionlike_info === false) { - return false; - } - - [ - $cased_function_id, - $storage, - $function_id, - $fq_classlike_name, - $method_name_lc, - $classlike_storage, - $is_functionlike_override, - $method_id, - $is_dupe - ] = $functionlike_info; - - if ($is_dupe) { - return $storage; - } - - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod) { - $storage->cased_name = $stmt->name->name; - } elseif ($stmt instanceof PhpParser\Node\Stmt\Function_) { - $storage->cased_name = - ($this->aliases->namespace ? $this->aliases->namespace . '\\' : '') . $stmt->name->name; - } - - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod || $stmt instanceof PhpParser\Node\Stmt\Function_) { - $storage->location = new CodeLocation($this->file_scanner, $stmt->name, null, true); - } else { - $storage->location = new CodeLocation($this->file_scanner, $stmt, null, true); - } - - $storage->stmt_location = new CodeLocation($this->file_scanner, $stmt); - - $required_param_count = 0; - $i = 0; - $has_optional_param = false; - - $existing_params = []; - $storage->setParams([]); - - foreach ($stmt->getParams() as $param) { - if ($param->var instanceof PhpParser\Node\Expr\Error) { - $storage->docblock_issues[] = new InvalidDocblock( - 'Param' . ($i + 1) . ' of ' . $cased_function_id . ' has invalid syntax', - new CodeLocation($this->file_scanner, $param, null, true) - ); - - ++$i; - - continue; - } - - $param_storage = $this->getTranslatedFunctionParam($param, $stmt, $fake_method, $fq_classlike_name); - - foreach ($param->attrGroups as $attr_group) { - foreach ($attr_group->attrs as $attr) { - $param_storage->attributes[] = AttributeResolver::resolve( - $this->codebase, - $this->file_scanner, - $this->file_storage, - $this->aliases, - $attr, - $this->classlike_storage->name ?? null - ); - } - } - - if ($param_storage->name === 'haystack' - && in_array($this->file_path, $this->codebase->config->internal_stubs) - ) { - $param_storage->expect_variable = true; - } - - if (isset($existing_params['$' . $param_storage->name])) { - $storage->docblock_issues[] = new DuplicateParam( - 'Duplicate param $' . $param_storage->name . ' in docblock for ' . $cased_function_id, - new CodeLocation($this->file_scanner, $param, null, true) - ); - - ++$i; - - continue; - } - - $existing_params['$' . $param_storage->name] = $i; - $storage->addParam($param_storage, (bool)$param->type); - - if (!$param_storage->is_optional && !$param_storage->is_variadic) { - $required_param_count = $i + 1; - - if (!$param->variadic - && $has_optional_param - ) { - foreach ($storage->params as $param) { - $param->is_optional = false; - } - } - } else { - $has_optional_param = true; - } - - ++$i; - } - - $storage->required_param_count = $required_param_count; - - if ($stmt instanceof PhpParser\Node\Stmt\Function_ - || $stmt instanceof PhpParser\Node\Stmt\ClassMethod - ) { - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod - && $storage instanceof MethodStorage - && $classlike_storage - && !$classlike_storage->mutation_free - && $stmt->stmts - && count($stmt->stmts) === 1 - && !count($stmt->params) - && $stmt->stmts[0] instanceof PhpParser\Node\Stmt\Return_ - && $stmt->stmts[0]->expr instanceof PhpParser\Node\Expr\PropertyFetch - && $stmt->stmts[0]->expr->var instanceof PhpParser\Node\Expr\Variable - && $stmt->stmts[0]->expr->var->name === 'this' - && $stmt->stmts[0]->expr->name instanceof PhpParser\Node\Identifier - ) { - $property_name = $stmt->stmts[0]->expr->name->name; - - if (isset($classlike_storage->properties[$property_name]) - && $classlike_storage->properties[$property_name]->type - ) { - $storage->mutation_free = true; - $storage->external_mutation_free = true; - $storage->mutation_free_inferred = !$stmt->isFinal() && !$classlike_storage->final; - - $classlike_storage->properties[$property_name]->getter_method = strtolower($stmt->name->name); - } - } elseif (strpos($stmt->name->name, 'assert') === 0 - && $stmt->stmts - ) { - $var_assertions = []; - - foreach ($stmt->stmts as $function_stmt) { - if ($function_stmt instanceof PhpParser\Node\Stmt\If_) { - $final_actions = ScopeAnalyzer::getControlActions( - $function_stmt->stmts, - null, - $this->config->exit_functions, - [], - false - ); - - if ($final_actions !== [ScopeAnalyzer::ACTION_END]) { - $var_assertions = []; - break; - } - - $cond_id = spl_object_id($function_stmt->cond); - - $if_clauses = FormulaGenerator::getFormula( - $cond_id, - $cond_id, - $function_stmt->cond, - $this->classlike_storage->name ?? null, - $this->file_scanner, - null - ); - - try { - $negated_formula = Algebra::negateFormula($if_clauses); - } catch (ComplicatedExpressionException $e) { - $var_assertions = []; - break; - } - - $rules = Algebra::getTruthsFromFormula($negated_formula); - - if (!$rules) { - $var_assertions = []; - break; - } - - foreach ($rules as $var_id => $rule) { - foreach ($rule as $rule_part) { - if (count($rule_part) > 1) { - continue 2; - } - } - - if (isset($existing_params[$var_id])) { - $param_offset = $existing_params[$var_id]; - - $var_assertions[] = new Assertion( - $param_offset, - $rule - ); - } elseif (strpos($var_id, '$this->') === 0) { - $var_assertions[] = new Assertion( - $var_id, - $rule - ); - } - } - } else { - $var_assertions = []; - break; - } - } - - $storage->assertions = $var_assertions; - } - - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod - && $stmt->stmts - && $storage instanceof MethodStorage - ) { - $last_stmt = end($stmt->stmts); - - if ($last_stmt instanceof PhpParser\Node\Stmt\Return_ - && $last_stmt->expr instanceof PhpParser\Node\Expr\Variable - && $last_stmt->expr->name === 'this' - ) { - $storage->probably_fluent = true; - } - } - } - - if (!$this->file_scanner->will_analyze - && ($stmt instanceof PhpParser\Node\Stmt\Function_ - || $stmt instanceof PhpParser\Node\Stmt\ClassMethod - || $stmt instanceof PhpParser\Node\Expr\Closure) - && $stmt->stmts - ) { - // pick up func_get_args that would otherwise be missed - foreach ($stmt->stmts as $function_stmt) { - if ($function_stmt instanceof PhpParser\Node\Stmt\Expression - && $function_stmt->expr instanceof PhpParser\Node\Expr\Assign - && $function_stmt->expr->expr instanceof PhpParser\Node\Expr\FuncCall - && $function_stmt->expr->expr->name instanceof PhpParser\Node\Name - ) { - $inner_function_id = implode('\\', $function_stmt->expr->expr->name->parts); - - if ($inner_function_id === 'func_get_arg' - || $inner_function_id === 'func_get_args' - || $inner_function_id === 'func_num_args' - ) { - $storage->variadic = true; - } - } elseif ($function_stmt instanceof PhpParser\Node\Stmt\If_ - && $function_stmt->cond instanceof PhpParser\Node\Expr\BinaryOp - && $function_stmt->cond->left instanceof PhpParser\Node\Expr\BinaryOp\Equal - && $function_stmt->cond->left->left instanceof PhpParser\Node\Expr\FuncCall - && $function_stmt->cond->left->left->name instanceof PhpParser\Node\Name - ) { - $inner_function_id = implode('\\', $function_stmt->cond->left->left->name->parts); - - if ($inner_function_id === 'func_get_arg' - || $inner_function_id === 'func_get_args' - || $inner_function_id === 'func_num_args' - ) { - $storage->variadic = true; - } - } - } - } - - $parser_return_type = $stmt->getReturnType(); - - if ($parser_return_type) { - $original_type = $parser_return_type; - if ($original_type instanceof PhpParser\Node\IntersectionType) { - throw new UnexpectedValueException('Intersection types not yet supported'); - } - /** @var Identifier|Name|NullableType|UnionType $original_type */ - - $storage->return_type = TypeHintResolver::resolve( - $original_type, - $this->codebase->scanner, - $this->file_storage, - $this->classlike_storage, - $this->aliases, - $this->codebase->php_major_version, - $this->codebase->php_minor_version - ); - - $storage->return_type_location = new CodeLocation( - $this->file_scanner, - $original_type - ); - - if ($stmt->returnsByRef()) { - $storage->return_type->by_ref = true; - } - - $storage->signature_return_type = $storage->return_type; - $storage->signature_return_type_location = $storage->return_type_location; - } - - if ($stmt->returnsByRef()) { - $storage->returns_by_ref = true; - } - - $doc_comment = $stmt->getDocComment(); - - - if ($classlike_storage && !$classlike_storage->is_trait) { - $storage->internal = array_merge($classlike_storage->internal, $storage->internal); - } - - if ($doc_comment) { - try { - $code_location = new CodeLocation($this->file_scanner, $stmt, null, true); - $docblock_info = FunctionLikeDocblockParser::parse($doc_comment, $code_location, $cased_function_id); - } catch (IncorrectDocblockException $e) { - $storage->docblock_issues[] = new MissingDocblockType( - $e->getMessage() . ' in docblock for ' . $cased_function_id, - new CodeLocation($this->file_scanner, $stmt, null, true) - ); - - $docblock_info = null; - } catch (DocblockParseException $e) { - $storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage() . ' in docblock for ' . $cased_function_id, - new CodeLocation($this->file_scanner, $stmt, null, true) - ); - - $docblock_info = null; - } - - if ($docblock_info) { - if ($docblock_info->since_php_major_version && !$this->aliases->namespace) { - if ($docblock_info->since_php_major_version > $this->codebase->php_major_version) { - return false; - } - - if ($docblock_info->since_php_major_version === $this->codebase->php_major_version - && $docblock_info->since_php_minor_version > $this->codebase->php_minor_version - ) { - return false; - } - } - - if ($stmt instanceof PhpParser\Node\Expr\Closure - || $stmt instanceof PhpParser\Node\Expr\ArrowFunction - ) { - if ($docblock_info->templates !== []) { - $docblock_info->templates = []; - $storage->docblock_issues[] = new InvalidDocblock( - 'Templated closures are not supported', - new CodeLocation($this->file_scanner, $stmt, null, true) - ); - } - } - - FunctionLikeDocblockScanner::addDocblockInfo( - $this->codebase, - $this->file_scanner, - $this->file_storage, - $this->aliases, - $this->type_aliases, - $this->classlike_storage, - $this->existing_function_template_types, - $storage, - $stmt, - $docblock_info, - $is_functionlike_override, - $fake_method, - $cased_function_id - ); - } - } - - // register the functionlike once the @since check has been completed - if ($stmt instanceof PhpParser\Node\Stmt\Function_ - && $function_id - && $storage instanceof FunctionStorage - ) { - if ($this->codebase->register_stub_files - || ($this->codebase->register_autoload_files - && !$this->codebase->functions->hasStubbedFunction($function_id)) - ) { - $this->codebase->functions->addGlobalFunction($function_id, $storage); - } - - $this->file_storage->functions[$function_id] = $storage; - $this->file_storage->declaring_function_ids[$function_id] = strtolower($this->file_path); - } elseif ($stmt instanceof PhpParser\Node\Stmt\ClassMethod - && $classlike_storage - && $storage instanceof MethodStorage - && $method_name_lc - && !$fake_method - && $method_id - ) { - $classlike_storage->methods[$method_name_lc] = $storage; - - $classlike_storage->declaring_method_ids[$method_name_lc] - = $classlike_storage->appearing_method_ids[$method_name_lc] - = $method_id; - - if (!$stmt->isPrivate() || $method_name_lc === '__construct' || $classlike_storage->is_trait) { - $classlike_storage->inheritable_method_ids[$method_name_lc] = $method_id; - } - - if (!isset($classlike_storage->overridden_method_ids[$method_name_lc])) { - $classlike_storage->overridden_method_ids[$method_name_lc] = []; - } - - if ($storage->final && $method_name_lc === '__construct') { - // a bit of a hack, but makes sure that `new static` works for these classes - $classlike_storage->preserve_constructor_signature = true; - } - } elseif (($stmt instanceof PhpParser\Node\Expr\Closure - || $stmt instanceof PhpParser\Node\Expr\ArrowFunction) - && $function_id - && $storage instanceof FunctionStorage - ) { - $this->file_storage->functions[$function_id] = $storage; - } - - if ($classlike_storage && $method_name_lc === '__construct') { - foreach ($stmt->getParams() as $param) { - if (!$param->flags || !$param->var instanceof PhpParser\Node\Expr\Variable) { - continue; - } - - $param_storage = null; - - foreach ($storage->params as $param_storage) { - if ($param_storage->name === $param->var->name) { - break; - } - } - - if (!$param_storage) { - continue; - } - - if (isset($classlike_storage->properties[$param_storage->name]) && $param_storage->location) { - IssueBuffer::maybeAdd( - new ParseError( - 'Promoted property ' . $param_storage->name . ' clashes with an existing property', - $param_storage->location - ) - ); - - $storage->has_visitor_issues = true; - $this->file_storage->has_visitor_issues = true; - continue; - } - - $doc_comment = $param->getDocComment(); - $var_comment_type = null; - $var_comment_readonly = false; - $var_comment_allow_private_mutation = false; - if ($doc_comment) { - $var_comments = CommentAnalyzer::getTypeFromComment( - $doc_comment, - $this->file_scanner, - $this->aliases, - $this->existing_function_template_types ?: [], - $this->type_aliases - ); - - $var_comment = array_pop($var_comments); - - if ($var_comment !== null) { - $var_comment_type = $var_comment->type; - $var_comment_readonly = $var_comment->readonly; - $var_comment_allow_private_mutation = $var_comment->allow_private_mutation; - } - } - - //both way to document type were used - if ($param_storage->type && $param_storage->type->from_docblock && $var_comment_type) { - if (IssueBuffer::accepts( - new InvalidDocblock( - 'Param ' . $param_storage->name . ' of ' . $cased_function_id . - ' should be documented as a param or a property, not both', - new CodeLocation($this->file_scanner, $param, null, true) - ) - )) { - return false; - } - } - - //no docblock type was provided for param but we have one for property - if ($var_comment_type) { - $param_storage->type = $var_comment_type; - } - - $property_storage = $classlike_storage->properties[$param_storage->name] = new PropertyStorage(); - $property_storage->is_static = false; - $property_storage->type = $param_storage->type; - $property_storage->signature_type = $param_storage->signature_type; - $property_storage->signature_type_location = $param_storage->signature_type_location; - $property_storage->type_location = $param_storage->type_location; - $property_storage->location = $param_storage->location; - $property_storage->stmt_location = new CodeLocation($this->file_scanner, $param); - $property_storage->has_default = (bool)$param->default; - $param_type_readonly = (bool)($param->flags & PhpParser\Node\Stmt\Class_::MODIFIER_READONLY); - $property_storage->readonly = $param_type_readonly ?: $var_comment_readonly; - $property_storage->allow_private_mutation = $var_comment_allow_private_mutation; - $param_storage->promoted_property = true; - $property_storage->is_promoted = true; - - $property_id = $fq_classlike_name . '::$' . $param_storage->name; - - switch ($param->flags & Class_::VISIBILITY_MODIFIER_MASK) { - case Class_::MODIFIER_PUBLIC: - $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; - $classlike_storage->inheritable_property_ids[$param_storage->name] = $property_id; - break; - - case Class_::MODIFIER_PROTECTED: - $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PROTECTED; - $classlike_storage->inheritable_property_ids[$param_storage->name] = $property_id; - break; - - case Class_::MODIFIER_PRIVATE: - $property_storage->visibility = ClassLikeAnalyzer::VISIBILITY_PRIVATE; - break; - } - - $fq_classlike_name = $classlike_storage->name; - - $property_id = $fq_classlike_name . '::$' . $param_storage->name; - - $classlike_storage->declaring_property_ids[$param_storage->name] = $fq_classlike_name; - $classlike_storage->appearing_property_ids[$param_storage->name] = $property_id; - $classlike_storage->initialized_properties[$param_storage->name] = true; - } - - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod - && $storage instanceof MethodStorage - && $storage->params - && $this->config->infer_property_types_from_constructor - ) { - $this->inferPropertyTypeFromConstructor($stmt, $storage, $classlike_storage); - } - } - - foreach ($stmt->getAttrGroups() as $attr_group) { - foreach ($attr_group->attrs as $attr) { - $attribute = AttributeResolver::resolve( - $this->codebase, - $this->file_scanner, - $this->file_storage, - $this->aliases, - $attr, - $this->classlike_storage->name ?? null - ); - - if ($attribute->fq_class_name === 'Psalm\\Pure' - || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Pure' - ) { - $storage->specialize_call = true; - $storage->mutation_free = true; - if ($storage instanceof MethodStorage) { - $storage->external_mutation_free = true; - } - } - - if ($attribute->fq_class_name === 'Psalm\\Deprecated' - || $attribute->fq_class_name === 'JetBrains\\PhpStorm\\Deprecated' - ) { - $storage->deprecated = true; - } - - if ($attribute->fq_class_name === 'Psalm\\Internal' && !$storage->internal && $fq_classlike_name) { - $storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($fq_classlike_name)]; - } - - if ($attribute->fq_class_name === 'Psalm\\ExternalMutationFree' - && $storage instanceof MethodStorage - ) { - $storage->external_mutation_free = true; - } - - if ($attribute->fq_class_name === 'JetBrains\\PhpStorm\\NoReturn') { - $storage->return_type = new Union([new TNever()]); - } - - $storage->attributes[] = $attribute; - } - } - - return $storage; - } - - private function inferPropertyTypeFromConstructor( - PhpParser\Node\Stmt\ClassMethod $stmt, - MethodStorage $storage, - ClassLikeStorage $classlike_storage - ): void { - if (!$stmt->stmts) { - return; - } - - $assigned_properties = []; - - foreach ($stmt->stmts as $function_stmt) { - if ($function_stmt instanceof PhpParser\Node\Stmt\Expression - && $function_stmt->expr instanceof PhpParser\Node\Expr\Assign - && $function_stmt->expr->var instanceof PhpParser\Node\Expr\PropertyFetch - && $function_stmt->expr->var->var instanceof PhpParser\Node\Expr\Variable - && $function_stmt->expr->var->var->name === 'this' - && $function_stmt->expr->var->name instanceof PhpParser\Node\Identifier - && ($property_name = $function_stmt->expr->var->name->name) - && isset($classlike_storage->properties[$property_name]) - && $function_stmt->expr->expr instanceof PhpParser\Node\Expr\Variable - && is_string($function_stmt->expr->expr->name) - && ($param_name = $function_stmt->expr->expr->name) - && isset($storage->param_lookup[$param_name]) - ) { - if ($classlike_storage->properties[$property_name]->type - || !$storage->param_lookup[$param_name] - ) { - continue; - } - - $param_index = array_search($param_name, array_keys($storage->param_lookup), true); - - if ($param_index === false || !isset($storage->params[$param_index]->type)) { - continue; - } - - $param_type = $storage->params[$param_index]->type; - - $assigned_properties[$property_name] = - $storage->params[$param_index]->is_variadic - ? new Union([ - new TArray([ - Type::getInt(), - $param_type, - ]), - ]) - : $param_type; - } else { - $assigned_properties = []; - break; - } - } - - if (!$assigned_properties) { - return; - } - - $storage->external_mutation_free = true; - - foreach ($assigned_properties as $property_name => $property_type) { - $classlike_storage->properties[$property_name]->type = clone $property_type; - } - } - - private function getTranslatedFunctionParam( - PhpParser\Node\Param $param, - PhpParser\Node\FunctionLike $stmt, - bool $fake_method, - ?string $fq_classlike_name - ): FunctionLikeParameter { - $param_type = null; - - $is_nullable = $param->default instanceof PhpParser\Node\Expr\ConstFetch && - strtolower($param->default->name->parts[0]) === 'null'; - - $param_typehint = $param->type; - - if ($param_typehint) { - if ($param_typehint instanceof PhpParser\Node\IntersectionType) { - throw new UnexpectedValueException('Intersection types not yet supported'); - } - /** @var Identifier|Name|NullableType|UnionType $param_typehint */ - - $param_type = TypeHintResolver::resolve( - $param_typehint, - $this->codebase->scanner, - $this->file_storage, - $this->classlike_storage, - $this->aliases, - $this->codebase->php_major_version, - $this->codebase->php_minor_version - ); - - if ($is_nullable) { - $param_type->addType(new TNull); - } else { - $is_nullable = $param_type->isNullable(); - } - } - - $is_optional = $param->default !== null; - - if ($param->var instanceof PhpParser\Node\Expr\Error || !is_string($param->var->name)) { - throw new UnexpectedValueException('Not expecting param name to be non-string'); - } - - $default_type = null; - - if ($param->default) { - $default_type = SimpleTypeInferer::infer( - $this->codebase, - new NodeDataProvider(), - $param->default, - $this->aliases, - null, - null, - $fq_classlike_name - ); - - if (!$default_type) { - $default_type = ExpressionResolver::getUnresolvedClassConstExpr( - $param->default, - $this->aliases, - $fq_classlike_name - ); - } - } - - return new FunctionLikeParameter( - $param->var->name, - $param->byRef, - $param_type, - new CodeLocation( - $this->file_scanner, - $fake_method ? $stmt : $param->var, - null, - false, - !$fake_method - ? CodeLocation::FUNCTION_PARAM_VAR - : CodeLocation::FUNCTION_PHPDOC_METHOD - ), - $param_typehint - ? new CodeLocation( - $this->file_scanner, - $fake_method ? $stmt : $param, - null, - false, - CodeLocation::FUNCTION_PARAM_TYPE - ) - : null, - $is_optional, - $is_nullable, - $param->variadic, - $default_type - ); - } - - /** - * @return array{ - * string, - * FunctionStorage|MethodStorage, - * null|string, - * null|string, - * null|lowercase-string, - * ClassLikeStorage|null, - * bool, - * MethodIdentifier|null, - * bool - * }|false - */ - private function createStorageForFunctionLike( - PhpParser\Node\FunctionLike $stmt, - bool $fake_method - ) { - $classlike_storage = null; - $fq_classlike_name = null; - $is_functionlike_override = false; - - $function_id = null; - $method_name_lc = null; - $method_id = null; - - if ($fake_method && $stmt instanceof PhpParser\Node\Stmt\ClassMethod) { - $cased_function_id = '@method ' . $stmt->name->name; - - $storage = $this->storage = new MethodStorage(); - $storage->defining_fqcln = ''; - $storage->is_static = $stmt->isStatic(); - $storage->final = $this->classlike_storage && $this->classlike_storage->final; - $storage->final_from_docblock = $this->classlike_storage && $this->classlike_storage->final_from_docblock; - } elseif ($stmt instanceof PhpParser\Node\Stmt\Function_) { - $cased_function_id = - ($this->aliases->namespace ? $this->aliases->namespace . '\\' : '') . $stmt->name->name; - $function_id = strtolower($cased_function_id); - - $storage = $this->storage = new FunctionStorage(); - - if ($this->codebase->register_stub_files || $this->codebase->register_autoload_files) { - if (isset($this->file_storage->functions[$function_id]) - && ($this->codebase->register_stub_files - || !$this->codebase->functions->hasStubbedFunction($function_id)) - ) { - $this->codebase->functions->addGlobalFunction( - $function_id, - $this->file_storage->functions[$function_id] - ); - - $storage = $this->storage = $this->file_storage->functions[$function_id]; - - return [$function_id, $storage, null, null, null, null, false, null, true]; - } - } else { - if (isset($this->file_storage->functions[$function_id])) { - $duplicate_function_storage = $this->file_storage->functions[$function_id]; - - if ($duplicate_function_storage->location - && $duplicate_function_storage->location->getLineNumber() === $stmt->getLine() - ) { - $storage = $this->storage = $this->file_storage->functions[$function_id]; - - return [$function_id, $storage, null, null, null, null, false, null, true]; - } - - IssueBuffer::maybeAdd( - new DuplicateFunction( - 'Method ' . $function_id . ' has already been defined' - . ($duplicate_function_storage->location - ? ' in ' . $duplicate_function_storage->location->file_path - : ''), - new CodeLocation($this->file_scanner, $stmt, null, true) - ) - ); - - $this->file_storage->has_visitor_issues = true; - - $duplicate_function_storage->has_visitor_issues = true; - - $storage = $this->storage = $this->file_storage->functions[$function_id]; - - return [$function_id, $storage, null, null, null, null, false, null, true]; - } - - if (isset($this->config->getPredefinedFunctions()[$function_id])) { - /** @psalm-suppress ArgumentTypeCoercion */ - $reflection_function = new ReflectionFunction($function_id); - - if ($reflection_function->getFileName() !== $this->file_path) { - IssueBuffer::maybeAdd( - new DuplicateFunction( - 'Method ' . $function_id . ' has already been defined as a core function', - new CodeLocation($this->file_scanner, $stmt, null, true) - ) - ); - } - } - } - } elseif ($stmt instanceof PhpParser\Node\Stmt\ClassMethod) { - if (!$this->classlike_storage) { - throw new LogicException('$this->classlike_storage should not be null'); - } - - $fq_classlike_name = $this->classlike_storage->name; - - $method_name_lc = strtolower($stmt->name->name); - - $function_id = $fq_classlike_name . '::' . $method_name_lc; - $cased_function_id = $fq_classlike_name . '::' . $stmt->name->name; - - $classlike_storage = $this->classlike_storage; - - $storage = null; - - if (isset($classlike_storage->methods[$method_name_lc])) { - if (!$this->codebase->register_stub_files) { - $duplicate_method_storage = $classlike_storage->methods[$method_name_lc]; - - IssueBuffer::maybeAdd( - new DuplicateMethod( - 'Method ' . $function_id . ' has already been defined' - . ($duplicate_method_storage->location - ? ' in ' . $duplicate_method_storage->location->file_path - : ''), - new CodeLocation($this->file_scanner, $stmt, null, true) - ) - ); - - $this->file_storage->has_visitor_issues = true; - - $duplicate_method_storage->has_visitor_issues = true; - - return false; - } - - // skip methods based on @since docblock tag - $doc_comment = $stmt->getDocComment(); - - if ($doc_comment) { - $docblock_info = null; - try { - $code_location = new CodeLocation($this->file_scanner, $stmt, null, true); - $docblock_info = FunctionLikeDocblockParser::parse( - $doc_comment, - $code_location, - $cased_function_id - ); - } catch (IncorrectDocblockException|DocblockParseException $e) { - } - if ($docblock_info) { - if ($docblock_info->since_php_major_version && !$this->aliases->namespace) { - if ($docblock_info->since_php_major_version > $this->codebase->php_major_version) { - return false; - } - if ($docblock_info->since_php_major_version === $this->codebase->php_major_version - && $docblock_info->since_php_minor_version > $this->codebase->php_minor_version - ) { - return false; - } - } - } - } - - $is_functionlike_override = true; - $storage = $this->storage = $classlike_storage->methods[$method_name_lc]; - } - - if (!$storage) { - $storage = $this->storage = new MethodStorage(); - } - - $storage->stubbed = $this->codebase->register_stub_files; - $storage->defining_fqcln = $fq_classlike_name; - - $class_name_parts = explode('\\', $fq_classlike_name); - $class_name = array_pop($class_name_parts); - - if ($method_name_lc === strtolower($class_name) - && !isset($classlike_storage->methods['__construct']) - && strpos($fq_classlike_name, '\\') === false - && $this->codebase->php_major_version < 8 - ) { - $this->codebase->methods->setDeclaringMethodId( - $fq_classlike_name, - '__construct', - $fq_classlike_name, - $method_name_lc - ); - - $this->codebase->methods->setAppearingMethodId( - $fq_classlike_name, - '__construct', - $fq_classlike_name, - $method_name_lc - ); - } - - $method_id = new MethodIdentifier( - $fq_classlike_name, - $method_name_lc - ); - - $storage->is_static = $stmt->isStatic(); - $storage->abstract = $stmt->isAbstract(); - - $storage->final = $classlike_storage->final || $stmt->isFinal(); - $storage->final_from_docblock = $classlike_storage->final_from_docblock; - - if ($stmt->isPrivate()) { - $storage->visibility = ClassLikeAnalyzer::VISIBILITY_PRIVATE; - } elseif ($stmt->isProtected()) { - $storage->visibility = ClassLikeAnalyzer::VISIBILITY_PROTECTED; - } else { - $storage->visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC; - } - } elseif ($stmt instanceof PhpParser\Node\Expr\Closure - || $stmt instanceof PhpParser\Node\Expr\ArrowFunction - ) { - $function_id = $cased_function_id = strtolower($this->file_path) - . ':' . $stmt->getLine() - . ':' . (int)$stmt->getAttribute('startFilePos') . ':-:closure'; - - $storage = $this->storage = $this->file_storage->functions[$function_id] = new FunctionStorage(); - - if ($stmt instanceof PhpParser\Node\Expr\Closure) { - foreach ($stmt->uses as $closure_use) { - if ($closure_use->byRef && is_string($closure_use->var->name)) { - $storage->byref_uses[$closure_use->var->name] = true; - } - } - } - } else { - throw new UnexpectedValueException('Unrecognized functionlike'); - } - - return [ - $cased_function_id, - $storage, - $function_id, - $fq_classlike_name, - $method_name_lc, - $classlike_storage, - $is_functionlike_override, - $method_id, - false - ]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php deleted file mode 100644 index 3dfb0859..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php +++ /dev/null @@ -1,111 +0,0 @@ -types) { - throw new UnexpectedValueException('bad'); - } - - foreach ($hint->types as $atomic_typehint) { - $resolved_type = self::resolve( - $atomic_typehint, - $scanner, - $file_storage, - $classlike_storage, - $aliases, - $php_major_version, - $php_minor_version - ); - - $type = Type::combineUnionTypes($resolved_type, $type); - } - - return $type; - } - - $is_nullable = false; - - if ($hint instanceof PhpParser\Node\NullableType) { - $is_nullable = true; - $hint = $hint->type; - } - - $type_string = null; - - if ($hint instanceof PhpParser\Node\Identifier) { - $fq_type_string = $hint->name; - } elseif ($hint instanceof PhpParser\Node\Name\FullyQualified) { - $fq_type_string = (string)$hint; - - $scanner->queueClassLikeForScanning($fq_type_string); - $file_storage->referenced_classlikes[strtolower($fq_type_string)] = $fq_type_string; - } else { - $lower_hint = strtolower($hint->parts[0]); - - if ($classlike_storage - && ($lower_hint === 'self' || $lower_hint === 'static') - && !$classlike_storage->is_trait - ) { - $fq_type_string = $classlike_storage->name; - - if ($lower_hint === 'static') { - $fq_type_string .= '&static'; - } - } else { - $type_string = implode('\\', $hint->parts); - $fq_type_string = ClassLikeAnalyzer::getFQCLNFromNameObject($hint, $aliases); - - $scanner->queueClassLikeForScanning($fq_type_string); - $file_storage->referenced_classlikes[strtolower($fq_type_string)] = $fq_type_string; - } - } - - $type = Type::parseString( - $fq_type_string, - [$php_major_version, $php_minor_version], - [] - ); - - if ($type_string) { - $atomic_type = $type->getSingleAtomic(); - $atomic_type->text = $type_string; - } - - if ($is_nullable) { - $type->addType(new TNull); - } - - return $type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php deleted file mode 100644 index e99259cf..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php +++ /dev/null @@ -1,650 +0,0 @@ - - */ - private $functionlike_node_scanners = []; - - /** - * @var array - */ - private $classlike_node_scanners = []; - - /** - * @var PhpParser\Node\Name|null - */ - private $namespace_name; - - /** - * @var PhpParser\Node\Expr|null - */ - private $exists_cond_expr; - - /** - * @var ?int - */ - private $skip_if_descendants; - - /** - * @var array - */ - private $type_aliases = []; - - /** - * @var array - */ - private $bad_classes = []; - /** - * @var EventDispatcher - */ - private $eventDispatcher; - - public function __construct( - Codebase $codebase, - FileScanner $file_scanner, - FileStorage $file_storage - ) { - $this->codebase = $codebase; - $this->file_scanner = $file_scanner; - $this->file_path = $file_scanner->file_path; - $this->scan_deep = $file_scanner->will_analyze; - $this->file_storage = $file_storage; - $this->aliases = $this->file_storage->aliases = new Aliases(); - $this->eventDispatcher = $this->codebase->config->eventDispatcher; - } - - public function enterNode(PhpParser\Node $node): ?int - { - foreach ($node->getComments() as $comment) { - if ($comment instanceof PhpParser\Comment\Doc && !$node instanceof PhpParser\Node\Stmt\ClassLike) { - try { - $type_aliases = ClassLikeNodeScanner::getTypeAliasesFromComment( - $comment, - $this->aliases, - $this->type_aliases, - null - ); - - foreach ($type_aliases as $type_alias) { - // finds issues, if there are any - TypeParser::parseTokens($type_alias->replacement_tokens); - } - - $this->type_aliases += $type_aliases; - } catch (DocblockParseException | TypeParseTreeException $e) { - $this->file_storage->docblock_issues[] = new InvalidDocblock( - $e->getMessage(), - new CodeLocation($this->file_scanner, $node, null, true) - ); - } - } - } - - if ($node instanceof PhpParser\Node\Stmt\Namespace_) { - $this->handleNamespace($node); - } elseif ($node instanceof PhpParser\Node\Stmt\Use_) { - $this->handleUse($node); - } elseif ($node instanceof PhpParser\Node\Stmt\GroupUse) { - $this->handleGroupUse($node); - } elseif ($node instanceof PhpParser\Node\Stmt\ClassLike) { - if ($this->skip_if_descendants) { - return null; - } - - $classlike_node_scanner = new ClassLikeNodeScanner( - $this->codebase, - $this->file_storage, - $this->file_scanner, - $this->aliases, - $this->namespace_name - ); - - $this->classlike_node_scanners[] = $classlike_node_scanner; - - if ($classlike_node_scanner->start($node) === false) { - $this->bad_classes[spl_object_id($node)] = true; - return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; - } - - $this->type_aliases += $classlike_node_scanner->type_aliases; - } elseif ($node instanceof PhpParser\Node\Stmt\TryCatch) { - foreach ($node->catches as $catch) { - foreach ($catch->types as $catch_type) { - $catch_fqcln = ClassLikeAnalyzer::getFQCLNFromNameObject($catch_type, $this->aliases); - - if (!in_array(strtolower($catch_fqcln), ['self', 'static', 'parent'], true)) { - $this->codebase->scanner->queueClassLikeForScanning($catch_fqcln); - $this->file_storage->referenced_classlikes[strtolower($catch_fqcln)] = $catch_fqcln; - } - } - } - } elseif ($node instanceof PhpParser\Node\FunctionLike) { - if ($node instanceof PhpParser\Node\Stmt\Function_ - || $node instanceof PhpParser\Node\Stmt\ClassMethod - ) { - if ($this->skip_if_descendants) { - return null; - } - } - - $classlike_storage = null; - - if ($this->classlike_node_scanners) { - $classlike_node_scanner = end($this->classlike_node_scanners); - $classlike_storage = $classlike_node_scanner->storage; - } - - $functionlike_types = []; - - foreach ($this->functionlike_node_scanners as $functionlike_node_scanner) { - $functionlike_storage = $functionlike_node_scanner->storage; - $functionlike_types += $functionlike_storage->template_types ?? []; - } - - $functionlike_node_scanner = new FunctionLikeNodeScanner( - $this->codebase, - $this->file_scanner, - $this->file_storage, - $this->aliases, - $this->type_aliases, - $classlike_storage, - $functionlike_types - ); - - $functionlike_node_scanner->start($node); - - $this->functionlike_node_scanners[] = $functionlike_node_scanner; - - if ($classlike_storage - && $this->codebase->php_major_version >= 8 - && $node instanceof PhpParser\Node\Stmt\ClassMethod - && strtolower($node->name->name) === '__tostring' - ) { - if ($classlike_storage->is_interface) { - $classlike_storage->parent_interfaces['stringable'] = 'Stringable'; - } else { - $classlike_storage->class_implements['stringable'] = 'Stringable'; - } - - if (PHP_VERSION_ID >= 80000) { - $this->codebase->scanner->queueClassLikeForScanning('Stringable'); - } - } - - if (!$this->scan_deep) { - return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; - } - } elseif ($node instanceof PhpParser\Node\Stmt\Global_) { - $functionlike_node_scanner = end($this->functionlike_node_scanners); - - if ($functionlike_node_scanner && $functionlike_node_scanner->storage) { - foreach ($node->vars as $var) { - if ($var instanceof PhpParser\Node\Expr\Variable) { - if (is_string($var->name) && $var->name !== 'argv' && $var->name !== 'argc') { - $var_id = '$' . $var->name; - - $functionlike_node_scanner->storage->global_variables[$var_id] = true; - } - } - } - } - } elseif ($node instanceof PhpParser\Node\Stmt\TraitUse) { - if ($this->skip_if_descendants) { - return null; - } - - if (!$this->classlike_node_scanners) { - throw new LogicException('$this->classlike_node_scanners should not be empty'); - } - - $classlike_node_scanner = end($this->classlike_node_scanners); - - $classlike_node_scanner->handleTraitUse($node); - } elseif ($node instanceof PhpParser\Node\Stmt\Const_) { - foreach ($node->consts as $const) { - $const_type = SimpleTypeInferer::infer( - $this->codebase, - new NodeDataProvider(), - $const->value, - $this->aliases - ) ?? Type::getMixed(); - - $fq_const_name = Type::getFQCLNFromString($const->name->name, $this->aliases); - - if ($this->codebase->register_stub_files || $this->codebase->register_autoload_files) { - $this->codebase->addGlobalConstantType($fq_const_name, $const_type); - } - - $this->file_storage->constants[$fq_const_name] = $const_type; - $this->file_storage->declaring_constants[$fq_const_name] = $this->file_path; - } - } elseif ($node instanceof PhpParser\Node\Stmt\If_ && !$this->skip_if_descendants) { - if (!$this->functionlike_node_scanners) { - $this->exists_cond_expr = $node->cond; - - if (ExpressionResolver::enterConditional( - $this->codebase, - $this->file_path, - $this->exists_cond_expr - ) === false - ) { - // the else node should terminate the agreement - $this->skip_if_descendants = $node->else ? $node->else->getLine() : $node->getLine(); - } - } - } elseif ($node instanceof PhpParser\Node\Stmt\Else_) { - if ($this->skip_if_descendants === $node->getLine()) { - $this->skip_if_descendants = null; - $this->exists_cond_expr = null; - } elseif (!$this->skip_if_descendants) { - if ($this->exists_cond_expr - && ExpressionResolver::enterConditional( - $this->codebase, - $this->file_path, - $this->exists_cond_expr - ) === true - ) { - $this->skip_if_descendants = $node->getLine(); - } - } - } elseif ($node instanceof PhpParser\Node\Expr) { - $functionlike_storage = null; - - if ($this->functionlike_node_scanners) { - $functionlike_node_scanner = end($this->functionlike_node_scanners); - $functionlike_storage = $functionlike_node_scanner->storage; - } - - ExpressionScanner::scan( - $this->codebase, - $this->file_scanner, - $this->file_storage, - $this->aliases, - $node, - $functionlike_storage, - $this->skip_if_descendants - ); - } - - if ($doc_comment = $node->getDocComment()) { - $var_comments = []; - - $template_types = []; - - if ($this->classlike_node_scanners) { - $classlike_node_scanner = end($this->classlike_node_scanners); - $classlike_storage = $classlike_node_scanner->storage; - $template_types = $classlike_storage->template_types ?? []; - } - - foreach ($this->functionlike_node_scanners as $functionlike_node_scanner) { - $functionlike_storage = $functionlike_node_scanner->storage; - $template_types += $functionlike_storage->template_types ?? []; - } - - try { - $var_comments = CommentAnalyzer::getTypeFromComment( - $doc_comment, - $this->file_scanner, - $this->aliases, - $template_types, - $this->type_aliases - ); - } catch (DocblockParseException $e) { - // do nothing - } - - foreach ($var_comments as $var_comment) { - if (!$var_comment->type) { - continue; - } - - $var_type = $var_comment->type; - $var_type->queueClassLikesForScanning($this->codebase, $this->file_storage); - } - } - - if ($node instanceof PhpParser\Node\Expr\Assign - || $node instanceof PhpParser\Node\Expr\AssignOp - || $node instanceof PhpParser\Node\Expr\AssignRef - ) { - if ($node->var instanceof PhpParser\Node\Expr\PropertyFetch - && $node->var->var instanceof PhpParser\Node\Expr\Variable - && $node->var->var->name === 'this' - && $node->var->name instanceof PhpParser\Node\Identifier - ) { - if ($this->functionlike_node_scanners) { - $functionlike_node_scanner = end($this->functionlike_node_scanners); - $functionlike_storage = $functionlike_node_scanner->storage; - - if ($functionlike_storage instanceof MethodStorage) { - $functionlike_storage->this_property_mutations[$node->var->name->name] = true; - } - } - } - } - - return null; - } - - private function handleNamespace(PhpParser\Node\Stmt\Namespace_ $node): void - { - $this->file_storage->aliases = $this->aliases; - - $this->namespace_name = $node->name; - - $this->aliases = new Aliases( - $node->name ? implode('\\', $node->name->parts) : '', - $this->aliases->uses, - $this->aliases->functions, - $this->aliases->constants, - $this->aliases->uses_flipped, - $this->aliases->functions_flipped, - $this->aliases->constants_flipped - ); - - $this->file_storage->namespace_aliases[(int) $node->getAttribute('startFilePos')] = $this->aliases; - - if ($node->stmts) { - $this->aliases->namespace_first_stmt_start = (int) $node->stmts[0]->getAttribute('startFilePos'); - } - } - - private function handleUse(PhpParser\Node\Stmt\Use_ $node): void - { - foreach ($node->uses as $use) { - $use_path = implode('\\', $use->name->parts); - - $use_alias = $use->alias->name ?? $use->name->getLast(); - - switch ($use->type !== PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN ? $use->type : $node->type) { - case PhpParser\Node\Stmt\Use_::TYPE_FUNCTION: - $this->aliases->functions[strtolower($use_alias)] = $use_path; - $this->aliases->functions_flipped[strtolower($use_path)] = $use_alias; - break; - - case PhpParser\Node\Stmt\Use_::TYPE_CONSTANT: - $this->aliases->constants[$use_alias] = $use_path; - $this->aliases->constants_flipped[$use_path] = $use_alias; - break; - - case PhpParser\Node\Stmt\Use_::TYPE_NORMAL: - $this->aliases->uses[strtolower($use_alias)] = $use_path; - $this->aliases->uses_flipped[strtolower($use_path)] = $use_alias; - break; - } - } - - if (!$this->aliases->uses_start) { - $this->aliases->uses_start = (int) $node->getAttribute('startFilePos'); - } - - $this->aliases->uses_end = (int) $node->getAttribute('endFilePos') + 1; - } - - private function handleGroupUse(PhpParser\Node\Stmt\GroupUse $node): void - { - $use_prefix = implode('\\', $node->prefix->parts); - - foreach ($node->uses as $use) { - $use_path = $use_prefix . '\\' . implode('\\', $use->name->parts); - $use_alias = $use->alias->name ?? $use->name->getLast(); - - switch ($use->type !== PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN ? $use->type : $node->type) { - case PhpParser\Node\Stmt\Use_::TYPE_FUNCTION: - $this->aliases->functions[strtolower($use_alias)] = $use_path; - $this->aliases->functions_flipped[strtolower($use_path)] = $use_alias; - break; - - case PhpParser\Node\Stmt\Use_::TYPE_CONSTANT: - $this->aliases->constants[$use_alias] = $use_path; - $this->aliases->constants_flipped[$use_path] = $use_alias; - break; - - case PhpParser\Node\Stmt\Use_::TYPE_NORMAL: - $this->aliases->uses[strtolower($use_alias)] = $use_path; - $this->aliases->uses_flipped[strtolower($use_path)] = $use_alias; - break; - } - } - - if (!$this->aliases->uses_start) { - $this->aliases->uses_start = (int) $node->getAttribute('startFilePos'); - } - - $this->aliases->uses_end = (int) $node->getAttribute('endFilePos') + 1; - } - - /** - * @return null - */ - public function leaveNode(PhpParser\Node $node) - { - if ($node instanceof PhpParser\Node\Stmt\Namespace_) { - if (!$this->file_storage->aliases) { - throw new UnexpectedValueException('File storage liases should not be null'); - } - - $this->aliases = $this->file_storage->aliases; - - if ($this->codebase->register_stub_files - && $node->name - && $node->name->parts === ['PHPSTORM_META'] - ) { - foreach ($node->stmts as $meta_stmt) { - if ($meta_stmt instanceof PhpParser\Node\Stmt\Expression - && $meta_stmt->expr instanceof PhpParser\Node\Expr\FuncCall - && $meta_stmt->expr->name instanceof PhpParser\Node\Name - && $meta_stmt->expr->name->parts === ['override'] - ) { - PhpStormMetaScanner::handleOverride($meta_stmt->expr->getArgs(), $this->codebase); - } - } - } - } elseif ($node instanceof PhpParser\Node\Stmt\ClassLike) { - if ($this->skip_if_descendants) { - return null; - } - - if (isset($this->bad_classes[spl_object_id($node)])) { - return null; - } - - if (!$this->classlike_node_scanners) { - throw new UnexpectedValueException('$this->classlike_node_scanners cannot be empty'); - } - - $classlike_node_scanner = array_pop($this->classlike_node_scanners); - - $classlike_storage = $classlike_node_scanner->finish($node); - - if ($classlike_storage->has_visitor_issues) { - $this->file_storage->has_visitor_issues = true; - } - - $event = new AfterClassLikeVisitEvent( - $node, - $classlike_storage, - $this, - $this->codebase, - [] - ); - - $this->eventDispatcher->dispatchAfterClassLikeVisit($event); - - if (!$this->file_storage->has_visitor_issues) { - $this->codebase->cacheClassLikeStorage($classlike_storage, $this->file_path); - } - } elseif ($node instanceof PhpParser\Node\FunctionLike) { - if ($this->skip_if_descendants) { - return null; - } - - if (!$this->functionlike_node_scanners) { - if ($this->file_storage->has_visitor_issues) { - return null; - } - - throw new UnexpectedValueException( - 'There should be function storages for line ' . $this->file_path . ':' . $node->getLine() - ); - } - - $functionlike_node_scanner = array_pop($this->functionlike_node_scanners); - - if ($functionlike_node_scanner->storage) { - foreach ($functionlike_node_scanner->storage->docblock_issues as $docblock_issue) { - if (strpos($docblock_issue->code_location->file_path, 'CoreGenericFunctions.phpstub') - || strpos($docblock_issue->code_location->file_path, 'CoreGenericClasses.phpstub') - || strpos($this->file_path, 'CoreGenericIterators.phpstub') - ) { - $e = reset($functionlike_node_scanner->storage->docblock_issues); - - $fqcn_parts = explode('\\', get_class($e)); - $issue_type = array_pop($fqcn_parts); - - $message = $e instanceof TaintedInput - ? $e->getJourneyMessage() - : $e->message; - - throw new CodeException( - 'Error with core stub file docblocks: ' - . $issue_type - . ' - ' . $e->getShortLocationWithPrevious() - . ':' . $e->code_location->getColumn() - . ' - ' . $message - ); - } - } - - if ($functionlike_node_scanner->storage->has_visitor_issues) { - $this->file_storage->has_visitor_issues = true; - } - } - } elseif ($node instanceof PhpParser\Node\Stmt\If_ && $node->getLine() === $this->skip_if_descendants) { - $this->exists_cond_expr = null; - $this->skip_if_descendants = null; - } elseif ($node instanceof PhpParser\Node\Stmt\Else_ && $node->getLine() === $this->skip_if_descendants) { - $this->exists_cond_expr = null; - $this->skip_if_descendants = null; - } - - return null; - } - - public function getFilePath(): string - { - return $this->file_path; - } - - public function getFileName(): string - { - return $this->file_scanner->getFileName(); - } - - public function getRootFilePath(): string - { - return $this->file_scanner->getRootFilePath(); - } - - public function getRootFileName(): string - { - return $this->file_scanner->getRootFileName(); - } - - public function getAliases(): Aliases - { - return $this->aliases; - } - - /** - * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingAnyTypeHint - */ - public function afterTraverse(array $nodes) - { - $this->file_storage->type_aliases = $this->type_aliases; - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php deleted file mode 100644 index e0ed99db..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php +++ /dev/null @@ -1,35 +0,0 @@ - - */ - protected $used_variables = []; - - public function enterNode(PhpParser\Node $node): ?int - { - if ($node instanceof PhpParser\Node\Expr\Variable && is_string($node->name)) { - $this->used_variables['$' . $node->name] = true; - } - - return null; - } - - /** - * @return array - */ - public function getUsedVariables(): array - { - return $this->used_variables; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php deleted file mode 100644 index 38b14e56..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php +++ /dev/null @@ -1,252 +0,0 @@ - $offset_map - */ - public function __construct(ErrorHandler $errorHandler, ?array $offset_map = null) - { - if ($offset_map) { - foreach ($offset_map as [, , $b_s, $b_e]) { - if ($this->start_change === null) { - $this->start_change = $b_s; - } - - $this->end_change = $b_e; - } - } - - $this->nameContext = new NameContext($errorHandler); - } - - public function beforeTraverse(array $nodes): ?array - { - $this->nameContext->startNamespace(); - - return null; - } - - public function enterNode(Node $node): ?int - { - if ($node instanceof Stmt\Namespace_) { - $this->nameContext->startNamespace($node->name); - } elseif ($node instanceof Stmt\Use_) { - foreach ($node->uses as $use) { - $this->addAlias($use, $node->type); - } - } elseif ($node instanceof Stmt\GroupUse) { - foreach ($node->uses as $use) { - $this->addAlias($use, $node->type, $node->prefix); - } - } elseif ($node instanceof Stmt\Class_) { - if (null !== $node->extends) { - $node->extends = $this->resolveClassName($node->extends); - } - foreach ($node->implements as &$interface) { - $interface = $this->resolveClassName($interface); - } - $this->resolveAttrGroups($node); - if (null !== $node->name) { - $this->addNamespacedName($node); - } - } - - if ($node instanceof Stmt\ClassMethod - && $this->start_change - && $this->end_change - ) { - /** @var array{startFilePos: int, endFilePos: int} */ - $attrs = $node->getAttributes(); - - if ($cs = $node->getComments()) { - $attrs['startFilePos'] = $cs[0]->getStartFilePos(); - } - - if ($attrs['endFilePos'] < $this->start_change - || $attrs['startFilePos'] > $this->end_change - ) { - return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; - } - } - - if ($node instanceof Stmt\ClassMethod - || $node instanceof Expr\Closure - ) { - $this->resolveSignature($node); - } elseif ($node instanceof Expr\StaticCall - || $node instanceof Expr\StaticPropertyFetch - || $node instanceof Expr\ClassConstFetch - || $node instanceof Expr\New_ - || $node instanceof Expr\Instanceof_ - ) { - if ($node->class instanceof Name) { - $node->class = $this->resolveClassName($node->class); - } - } elseif ($node instanceof Stmt\Catch_) { - foreach ($node->types as &$type) { - $type = $this->resolveClassName($type); - } - } elseif ($node instanceof Expr\FuncCall) { - if ($node->name instanceof Name) { - $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); - } - } elseif ($node instanceof Expr\ConstFetch) { - $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); - } elseif ($node instanceof Stmt\Trait_) { - $this->resolveTrait($node); - } elseif ($node instanceof Stmt\TraitUse) { - foreach ($node->traits as &$trait) { - $trait = $this->resolveClassName($trait); - } - - foreach ($node->adaptations as $adaptation) { - if (null !== $adaptation->trait) { - $adaptation->trait = $this->resolveClassName($adaptation->trait); - } - - if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { - foreach ($adaptation->insteadof as &$insteadof) { - $insteadof = $this->resolveClassName($insteadof); - } - } - } - } - - return null; - } - - private function addAlias(Stmt\UseUse $use, int $type, ?Name $prefix = null): void - { - // Add prefix for group uses - /** @var Name $name */ - $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; - // Type is determined either by individual element or whole use declaration - $type |= $use->type; - - $this->nameContext->addAlias( - $name, - (string) $use->getAlias(), - $type, - $use->getAttributes() - ); - } - - /** - * @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node - */ - private function resolveSignature(PhpParser\NodeAbstract $node): void - { - foreach ($node->params as $param) { - $param->type = $this->resolveType($param->type); - } - $node->returnType = $this->resolveType($node->returnType); - } - - /** - * @template T of Node|null - * @param T $node - * @return ($node is NullableType ? NullableType : ($node is Name ? Name : T)) - * @psalm-suppress LessSpecificReturnType - */ - private function resolveType(?Node $node): ?Node - { - if ($node instanceof NullableType) { - $node->type = $this->resolveType($node->type); - - return $node; - } - if ($node instanceof Name) { - return $this->resolveClassName($node); - } - - return $node; - } - - /** - * Resolve name, according to name resolver options. - * - * CAVE: Attribute values are of type `string`, this is - * different to PhpParser's `NameResolver` using objects. - * - * @param Name $name Function or constant name to resolve - * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* - * - * @return Name Resolved name, or original name with attribute - */ - protected function resolveName(Name $name, int $type): Name - { - $resolvedName = $this->nameContext->getResolvedName($name, $type); - if (null !== $resolvedName) { - $name->setAttribute('resolvedName', $resolvedName->toString()); - } else { - $namespaceName = Name\FullyQualified::concat( - $this->nameContext->getNamespace(), - $name, - $name->getAttributes() - ); - if ($namespaceName instanceof Name) { - $name->setAttribute('namespacedName', $namespaceName->toString()); - } - } - return $name; - } - - protected function resolveClassName(Name $name): Name - { - return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); - } - - protected function addNamespacedName(Stmt\Class_ $node): void - { - $node->setAttribute('namespacedName', Name::concat( - $this->nameContext->getNamespace(), - (string)$node->name - )); - } - - protected function resolveAttrGroups(Stmt\Class_ $node): void - { - foreach ($node->attrGroups as $attrGroup) { - foreach ($attrGroup->attrs as $attr) { - $attr->name = $this->resolveClassName($attr->name); - } - } - } - - protected function resolveTrait(Stmt\Trait_ $node): void - { - $resolvedName = Name::concat($this->nameContext->getNamespace(), (string) $node->name); - - if (null !== $resolvedName) { - $node->setAttribute('resolvedName', $resolvedName->toString()); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php deleted file mode 100644 index 93a05225..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php +++ /dev/null @@ -1,84 +0,0 @@ - */ - private $matching_trait_nodes = []; - - private $fq_trait_name; - - public function __construct(string $fq_trait_name) - { - $this->fq_trait_name = $fq_trait_name; - } - - public function enterNode(PhpParser\Node $node, bool &$traverseChildren = true): ?int - { - if ($node instanceof PhpParser\Node\Stmt\Trait_) { - /** @var ?string */ - $resolved_name = $node->getAttribute('resolvedName'); - - if ($resolved_name === null) { - // compare ends of names, a temporary hack because PHPParser caches - // may not have that attribute - - $fq_trait_name_parts = explode('\\', $this->fq_trait_name); - - /** @psalm-suppress PossiblyNullPropertyFetch */ - if ($node->name->name === end($fq_trait_name_parts)) { - $this->matching_trait_nodes[] = $node; - } - } elseif ($resolved_name === $this->fq_trait_name) { - $this->matching_trait_nodes[] = $node; - } - } - - if ($node instanceof PhpParser\Node\Stmt\ClassLike - || $node instanceof PhpParser\Node\FunctionLike - ) { - return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN; - } - - return null; - } - - public function getNode(): ?PhpParser\Node\Stmt\Trait_ - { - if (!count($this->matching_trait_nodes)) { - return null; - } - - if (count($this->matching_trait_nodes) === 1 || !trait_exists($this->fq_trait_name)) { - return $this->matching_trait_nodes[0]; - } - - try { - $reflection_trait = new ReflectionClass($this->fq_trait_name); - } catch (Throwable $t) { - return null; - } - - foreach ($this->matching_trait_nodes as $node) { - if ($node->getLine() === $reflection_trait->getStartLine()) { - return $node; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php deleted file mode 100644 index 05704e14..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php +++ /dev/null @@ -1,41 +0,0 @@ -fake_type_provider = $fake_type_provider; - $this->real_type_provider = $real_type_provider; - } - - /** - * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingAnyTypeHint - */ - public function enterNode(Node $node) - { - $origNode = $node; - - /** @psalm-suppress ArgumentTypeCoercion */ - $node_type = $this->fake_type_provider->getType($origNode); - - if ($node_type) { - /** @psalm-suppress ArgumentTypeCoercion */ - $this->real_type_provider->setType($origNode, clone $node_type); - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php deleted file mode 100644 index ae05fb47..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php +++ /dev/null @@ -1,86 +0,0 @@ -plugin_list_factory = $plugin_list_factory; - parent::__construct(); - } - - protected function configure(): void - { - $this - ->setName('disable') - ->setDescription('Disables a named plugin') - ->addArgument( - 'pluginName', - InputArgument::REQUIRED, - 'Plugin name (fully qualified class name or composer package name)' - ) - ->addOption('config', 'c', InputOption::VALUE_REQUIRED, 'Path to Psalm config file') - ->addUsage('vendor/plugin-package-name [-c path/to/psalm.xml]'); - $this->addUsage('\'Plugin\Class\Name\' [-c path/to/psalm.xml]'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $io = new SymfonyStyle($input, $output); - - $current_dir = (string) getcwd() . DIRECTORY_SEPARATOR; - - $config_file_path = $input->getOption('config'); - if ($config_file_path !== null && !is_string($config_file_path)) { - throw new UnexpectedValueException('Config file path should be a string'); - } - - $plugin_list = ($this->plugin_list_factory)($current_dir, $config_file_path); - - $plugin_name = $input->getArgument('pluginName'); - - assert(is_string($plugin_name)); - - try { - $plugin_class = $plugin_list->resolvePluginClass($plugin_name); - } catch (InvalidArgumentException $e) { - $io->error('Unknown plugin class ' . $plugin_name); - - return 2; - } - - if (!$plugin_list->isEnabled($plugin_class)) { - $io->note('Plugin already disabled'); - - return 3; - } - - $plugin_list->disable($plugin_class); - $io->success('Plugin disabled'); - - return 0; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php deleted file mode 100644 index d868ca18..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php +++ /dev/null @@ -1,86 +0,0 @@ -plugin_list_factory = $plugin_list_factory; - parent::__construct(); - } - - protected function configure(): void - { - $this - ->setName('enable') - ->setDescription('Enables a named plugin') - ->addArgument( - 'pluginName', - InputArgument::REQUIRED, - 'Plugin name (fully qualified class name or composer package name)' - ) - ->addOption('config', 'c', InputOption::VALUE_REQUIRED, 'Path to Psalm config file') - ->addUsage('vendor/plugin-package-name [-c path/to/psalm.xml]'); - $this->addUsage('\'Plugin\Class\Name\' [-c path/to/psalm.xml]'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $io = new SymfonyStyle($input, $output); - - $current_dir = (string) getcwd() . DIRECTORY_SEPARATOR; - - $config_file_path = $input->getOption('config'); - if ($config_file_path !== null && !is_string($config_file_path)) { - throw new UnexpectedValueException('Config file path should be a string'); - } - - $plugin_list = ($this->plugin_list_factory)($current_dir, $config_file_path); - - $plugin_name = $input->getArgument('pluginName'); - - assert(is_string($plugin_name)); - - try { - $plugin_class = $plugin_list->resolvePluginClass($plugin_name); - } catch (InvalidArgumentException $e) { - $io->error('Unknown plugin class ' . $plugin_name); - - return 2; - } - - if ($plugin_list->isEnabled($plugin_class)) { - $io->note('Plugin already enabled'); - - return 3; - } - - $plugin_list->enable($plugin_class); - $io->success('Plugin enabled'); - - return 0; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php deleted file mode 100644 index 1ef61655..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php +++ /dev/null @@ -1,98 +0,0 @@ -plugin_list_factory = $plugin_list_factory; - parent::__construct(); - } - - protected function configure(): void - { - $this - ->setName('show') - ->setDescription('Lists enabled and available plugins') - ->addOption('config', 'c', InputOption::VALUE_REQUIRED, 'Path to Psalm config file') - ->addUsage('[-c path/to/psalm.xml]'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $io = new SymfonyStyle($input, $output); - $current_dir = (string) getcwd() . DIRECTORY_SEPARATOR; - - $config_file_path = $input->getOption('config'); - if ($config_file_path !== null && !is_string($config_file_path)) { - throw new UnexpectedValueException('Config file path should be a string'); - } - - $plugin_list = ($this->plugin_list_factory)($current_dir, $config_file_path); - - $enabled = $plugin_list->getEnabled(); - $available = $plugin_list->getAvailable(); - - $formatRow = - /** - * @return array{0: null|string, 1: string} - */ - function (string $class, ?string $package): array { - return [$package, $class]; - }; - - $io->section('Enabled'); - if (count($enabled)) { - $io->table( - ['Package', 'Class'], - array_map( - $formatRow, - array_keys($enabled), - array_values($enabled) - ) - ); - } else { - $io->note('No plugins enabled'); - } - - $io->section('Available'); - if (count($available)) { - $io->table( - ['Package', 'Class'], - array_map( - $formatRow, - array_keys($available), - array_values($available) - ) - ); - } else { - $io->note('No plugins available'); - } - - return 0; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php deleted file mode 100644 index fd5d251e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php +++ /dev/null @@ -1,111 +0,0 @@ -file_names = $file_names; - } - - /** - * @param mixed $package - * - * @psalm-assert-if-true array{name: string, extra: array{psalm: array{pluginClass: string}}} $package - * - * @psalm-pure - */ - public function isPlugin($package): bool - { - return is_array($package) - && isset($package['name'], $package['extra']['psalm']['pluginClass']) - && is_string($package['name']) - && is_array($package['extra']) - && is_array($package['extra']['psalm']) - && is_string($package['extra']['psalm']['pluginClass']); - } - - /** - * @return array [packageName => pluginClass, ...] - */ - public function getPlugins(): array - { - $pluginPackages = $this->getAllPluginPackages(); - $ret = []; - foreach ($pluginPackages as $package) { - $ret[$package['name']] = $package['extra']['psalm']['pluginClass']; - } - - return $ret; - } - - private function read(string $file_name): array - { - $contents = json_decode(file_get_contents($file_name), true); - - if ($error = json_last_error()) { - throw new RuntimeException(json_last_error_msg(), $error); - } - - if (!is_array($contents)) { - throw new RuntimeException('Malformed ' . $file_name . ', expecting JSON-encoded object'); - } - - return $contents; - } - - /** - * @return list - */ - private function getAllPluginPackages(): array - { - $packages = $this->getAllPackages(); - $ret = []; - /** @psalm-suppress MixedAssignment */ - foreach ($packages as $package) { - if ($this->isPlugin($package)) { - $ret[] = $package; - } - } - - return $ret; - } - - private function getAllPackages(): array - { - $packages = []; - foreach ($this->file_names as $file_name) { - $composer_lock_contents = $this->read($file_name); - if (!isset($composer_lock_contents['packages']) || !is_array($composer_lock_contents['packages'])) { - throw new RuntimeException('packages section is missing or not an array'); - } - if (!isset($composer_lock_contents['packages-dev']) || !is_array($composer_lock_contents['packages-dev'])) { - throw new RuntimeException('packages-dev section is missing or not an array'); - } - $packages = array_merge( - $packages, - array_merge( - $composer_lock_contents['packages'], - $composer_lock_contents['packages-dev'] - ) - ); - } - - return $packages; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php deleted file mode 100644 index a945dd24..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php +++ /dev/null @@ -1,152 +0,0 @@ -current_dir = $current_dir; - - if ($explicit_path) { - $this->path = $explicit_path; - } else { - $path = Config::locateConfigFile($current_dir); - if (!$path) { - throw new RuntimeException('Cannot find Psalm config'); - } - $this->path = $path; - } - } - - public function getConfig(): Config - { - return Config::loadFromXMLFile($this->path, $this->current_dir); - } - - public function removePlugin(string $plugin_class): void - { - $config_xml = $this->readXml(); - /** @var DomElement */ - $psalm_root = $config_xml->getElementsByTagName('psalm')[0]; - $plugins_elements = $psalm_root->getElementsByTagName('plugins'); - if (!$plugins_elements->length) { - // no plugins, nothing to remove - return; - } - - /** @var DomElement */ - $plugins_element = $plugins_elements->item(0); - - $plugin_elements = $plugins_element->getElementsByTagName('pluginClass'); - - foreach ($plugin_elements as $plugin_element) { - if ($plugin_element->getAttribute('class') === $plugin_class) { - $plugins_element->removeChild($plugin_element); - break; - } - } - - if (!$plugin_elements->length) { - // avoid breaking old psalm binaries, whose schema did not allow empty plugins - $psalm_root->removeChild($plugins_element); - } - - $this->saveXml($config_xml); - } - - public function addPlugin(string $plugin_class): void - { - $config_xml = $this->readXml(); - /** @var DomElement */ - $psalm_root = $config_xml->getElementsByTagName('psalm')->item(0); - $plugins_elements = $psalm_root->getElementsByTagName('plugins'); - if (!$plugins_elements->length) { - $plugins_element = $config_xml->createElement('plugins'); - if ($plugins_element) { - $psalm_root->appendChild($plugins_element); - } - } else { - /** @var DomElement */ - $plugins_element = $plugins_elements->item(0); - } - - $plugin_class_element = $config_xml->createElement('pluginClass'); - if ($plugin_class_element) { - $plugin_class_element->setAttribute('xmlns', Config::CONFIG_NAMESPACE); - $plugin_class_element->setAttribute('class', $plugin_class); - if ($plugins_element) { - $plugins_element->appendChild($plugin_class_element); - } - } - - $this->saveXml($config_xml); - } - - private function readXml(): DOMDocument - { - $doc = new DOMDocument(); - - $file_contents = file_get_contents($this->path); - - if (($tag_start = strpos($file_contents, '', $tag_start + 1); - - if ($tag_end !== false) { - $this->psalm_tag_end_pos = $tag_end; - $this->psalm_header = substr($file_contents, 0, $tag_end); - } - } - - assert($file_contents !== ''); - $doc->loadXML($file_contents); - - return $doc; - } - - private function saveXml(DOMDocument $config_xml): void - { - $new_file_contents = $config_xml->saveXML($config_xml); - - if (($tag_start = strpos($new_file_contents, '', $tag_start + 1); - - if ($tag_end !== false - && ($new_file_contents[$tag_end - 1] !== '/') - && $this->psalm_tag_end_pos - && $this->psalm_header - ) { - $new_file_contents = $this->psalm_header . substr($new_file_contents, $tag_end); - } - } - - $result = file_put_contents($this->path, $new_file_contents); - if ($result === false) { - throw new RuntimeException(sprintf('Unable to save xml to %s', $this->path)); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php deleted file mode 100644 index 7f5d9052..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php +++ /dev/null @@ -1,120 +0,0 @@ - [pluginClass => packageName] */ - private $all_plugins; - - /** @var ?array [pluginClass => ?packageName] */ - private $enabled_plugins; - - public function __construct(?ConfigFile $config_file, ComposerLock $composer_lock) - { - $this->config_file = $config_file; - $this->composer_lock = $composer_lock; - } - - /** - * @return array [pluginClass => ?packageName, ...] - */ - public function getEnabled(): array - { - if (!$this->enabled_plugins) { - $this->enabled_plugins = []; - if ($this->config_file) { - foreach ($this->config_file->getConfig()->getPluginClasses() as $plugin_entry) { - $plugin_class = $plugin_entry['class']; - $this->enabled_plugins[$plugin_class] = $this->findPluginPackage($plugin_class); - } - } - } - - return $this->enabled_plugins; - } - - /** - * @return array [pluginCLass => ?packageName] - */ - public function getAvailable(): array - { - return array_diff_key($this->getAll(), $this->getEnabled()); - } - - /** - * @return array [pluginClass => packageName] - */ - public function getAll(): array - { - if (null === $this->all_plugins) { - $this->all_plugins = array_flip($this->composer_lock->getPlugins()); - } - - return $this->all_plugins; - } - - public function resolvePluginClass(string $class_or_package): string - { - if (false === strpos($class_or_package, '/')) { - return $class_or_package; // must be a class then - } - - // pluginClass => ?pluginPackage - $plugin_classes = $this->getAll(); - - $class = array_search($class_or_package, $plugin_classes, true); - - if (false === $class) { - throw new InvalidArgumentException('Unknown plugin: ' . $class_or_package); - } - - return $class; - } - - public function findPluginPackage(string $class): ?string - { - // pluginClass => ?pluginPackage - $plugin_classes = $this->getAll(); - - return $plugin_classes[$class] ?? null; - } - - public function isEnabled(string $class): bool - { - return array_key_exists($class, $this->getEnabled()); - } - - public function enable(string $class): void - { - if (!$this->config_file) { - throw new RuntimeException('Cannot find Psalm config'); - } - - $this->config_file->addPlugin($class); - } - - public function disable(string $class): void - { - if (!$this->config_file) { - throw new RuntimeException('Cannot find Psalm config'); - } - - $this->config_file->removePlugin($class); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php b/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php deleted file mode 100644 index 0683365f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php +++ /dev/null @@ -1,76 +0,0 @@ -project_root = $project_root; - $this->psalm_root = $psalm_root; - } - - public function __invoke(string $current_dir, ?string $config_file_path = null): PluginList - { - try { - $config_file = new ConfigFile($current_dir, $config_file_path); - } catch (RuntimeException $exception) { - $config_file = null; - } - $composer_lock = new ComposerLock($this->findLockFiles()); - - return new PluginList($config_file, $composer_lock); - } - - /** @return non-empty-array */ - private function findLockFiles(): array - { - // use cases - // 1. plugins are installed into project vendors - composer.lock is PROJECT_ROOT/composer.lock - // 2. plugins are installed into separate composer environment (either global or bamarni-bin) - // - composer.lock is PSALM_ROOT/../../../composer.lock - // 3. plugins are installed into psalm vendors - composer.lock is PSALM_ROOT/composer.lock - // 4. none of the above - use stub (empty virtual composer.lock) - - if ($this->psalm_root === $this->project_root) { - // managing plugins for psalm itself - $composer_lock_filenames = [ - Composer::getLockFilePath(rtrim($this->psalm_root, DIRECTORY_SEPARATOR)), - ]; - } else { - $composer_lock_filenames = [ - Composer::getLockFilePath(rtrim($this->project_root, DIRECTORY_SEPARATOR)), - Composer::getLockFilePath(rtrim($this->psalm_root, DIRECTORY_SEPARATOR) . '/../../..'), - Composer::getLockFilePath(rtrim($this->psalm_root, DIRECTORY_SEPARATOR)), - ]; - } - - $composer_lock_filenames = array_filter($composer_lock_filenames, 'is_readable'); - - if (empty($composer_lock_filenames)) { - $stub_composer_lock = (object)[ - 'packages' => [], - 'packages-dev' => [], - ]; - $composer_lock_filenames[] = 'data:application/json,' . urlencode(json_encode($stub_composer_lock)); - } - - return $composer_lock_filenames; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php deleted file mode 100644 index d3328a5d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php +++ /dev/null @@ -1,115 +0,0 @@ - - */ - public static function addTaints(AddRemoveTaintsEvent $event): array - { - $item = $event->getExpr(); - $statements_analyzer = $event->getStatementsSource(); - - if (!$statements_analyzer instanceof StatementsAnalyzer - || !$item instanceof PhpParser\Node\Expr\FuncCall - || $item->isFirstClassCallable() - || !$item->name instanceof PhpParser\Node\Name - || count($item->name->parts) !== 1 - || count($item->getArgs()) === 0 - ) { - return []; - } - - $function_id = strtolower($item->name->parts[0]); - - if ($function_id === 'html_entity_decode' - || $function_id === 'htmlspecialchars_decode' - ) { - $second_arg = $item->getArgs()[1]->value ?? null; - - if ($second_arg === null) { - return ['html']; - } - - $second_arg_value = $statements_analyzer->node_data->getType($second_arg); - - if (!$second_arg_value || !$second_arg_value->isSingleIntLiteral()) { - return ['html']; - } - - $second_arg_value = $second_arg_value->getSingleIntLiteral()->value; - - if (($second_arg_value & ENT_QUOTES) === ENT_QUOTES) { - return ['html', 'has_quotes']; - } - - return ['html']; - } - - return []; - } - - /** - * Called to see what taints should be removed - * - * @return list - */ - public static function removeTaints(AddRemoveTaintsEvent $event): array - { - $item = $event->getExpr(); - $statements_analyzer = $event->getStatementsSource(); - - if (!$statements_analyzer instanceof StatementsAnalyzer - || !$item instanceof PhpParser\Node\Expr\FuncCall - || $item->isFirstClassCallable() - || !$item->name instanceof PhpParser\Node\Name - || count($item->name->parts) !== 1 - || count($item->getArgs()) === 0 - ) { - return []; - } - - $function_id = strtolower($item->name->parts[0]); - - if ($function_id === 'htmlentities' - || $function_id === 'htmlspecialchars' - ) { - $second_arg = $item->getArgs()[1]->value ?? null; - - if ($second_arg === null) { - return ['html']; - } - - $second_arg_value = $statements_analyzer->node_data->getType($second_arg); - - if (!$second_arg_value || !$second_arg_value->isSingleIntLiteral()) { - return ['html']; - } - - $second_arg_value = $second_arg_value->getSingleIntLiteral()->value; - - if (($second_arg_value & ENT_QUOTES) === ENT_QUOTES) { - return ['html', 'has_quotes']; - } - - return ['html']; - } - - return []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php deleted file mode 100644 index dae227f5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php +++ /dev/null @@ -1,182 +0,0 @@ -config = $config; - - $storage_dir = dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'Storage' . DIRECTORY_SEPARATOR; - - $dependent_files = [ - $storage_dir . 'FileStorage.php', - $storage_dir . 'FunctionLikeStorage.php', - $storage_dir . 'ClassLikeStorage.php', - $storage_dir . 'MethodStorage.php', - ]; - - if ($config->eventDispatcher->hasAfterClassLikeVisitHandlers()) { - $dependent_files = array_merge($dependent_files, $config->plugin_paths); - } - - foreach ($dependent_files as $dependent_file_path) { - if (!file_exists($dependent_file_path)) { - throw new UnexpectedValueException($dependent_file_path . ' must exist'); - } - - $this->modified_timestamps .= ' ' . filemtime($dependent_file_path); - } - - $this->modified_timestamps .= $this->config->computeHash(); - } - - public function writeToCache(ClassLikeStorage $storage, string $file_path, string $file_contents): void - { - $fq_classlike_name_lc = strtolower($storage->name); - - $storage->hash = $this->getCacheHash($file_path, $file_contents); - - // check if we have it in cache already - $cached_value = $this->loadFromCache($fq_classlike_name_lc, $file_path); - if (!is_null($cached_value) && $cached_value->hash === $storage->hash) { - return; - } - - $cache_location = $this->getCacheLocationForClass($fq_classlike_name_lc, $file_path, true); - if ($this->config->use_igbinary) { - file_put_contents($cache_location, igbinary_serialize($storage)); - } else { - file_put_contents($cache_location, serialize($storage)); - } - } - - public function getLatestFromCache( - string $fq_classlike_name_lc, - ?string $file_path, - ?string $file_contents - ): ClassLikeStorage { - $cached_value = $this->loadFromCache($fq_classlike_name_lc, $file_path); - - if (!$cached_value) { - throw new UnexpectedValueException($fq_classlike_name_lc . ' should be in cache'); - } - - $cache_hash = $this->getCacheHash($file_path, $file_contents); - - /** @psalm-suppress TypeDoesNotContainType */ - if (@get_class($cached_value) === '__PHP_Incomplete_Class' - || $cache_hash !== $cached_value->hash - ) { - unlink($this->getCacheLocationForClass($fq_classlike_name_lc, $file_path)); - - throw new UnexpectedValueException($fq_classlike_name_lc . ' should not be outdated'); - } - - return $cached_value; - } - - private function getCacheHash(?string $_unused_file_path, ?string $file_contents): string - { - $data = $file_contents ? $file_contents : $this->modified_timestamps; - return PHP_VERSION_ID >= 80100 ? hash('xxh128', $data) : hash('md4', $data); - } - - /** - * @psalm-suppress MixedAssignment - */ - private function loadFromCache(string $fq_classlike_name_lc, ?string $file_path): ?ClassLikeStorage - { - $cache_location = $this->getCacheLocationForClass($fq_classlike_name_lc, $file_path); - - if (file_exists($cache_location)) { - if ($this->config->use_igbinary) { - $storage = igbinary_unserialize((string)file_get_contents($cache_location)); - - if ($storage instanceof ClassLikeStorage) { - return $storage; - } - - return null; - } - - $storage = unserialize((string)file_get_contents($cache_location)); - - if ($storage instanceof ClassLikeStorage) { - return $storage; - } - - return null; - } - - return null; - } - - private function getCacheLocationForClass( - string $fq_classlike_name_lc, - ?string $file_path, - bool $create_directory = false - ): string { - $root_cache_directory = $this->config->getCacheDirectory(); - - if (!$root_cache_directory) { - throw new UnexpectedValueException('No cache directory defined'); - } - - $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::CLASS_CACHE_DIRECTORY; - - if ($create_directory && !is_dir($parser_cache_directory)) { - mkdir($parser_cache_directory, 0777, true); - } - - $data = $file_path ? strtolower($file_path) . ' ' : ''; - $data .= $fq_classlike_name_lc; - $file_path_sha = PHP_VERSION_ID >= 80100 ? hash('xxh128', $data) : hash('md4', $data); - - return $parser_cache_directory - . DIRECTORY_SEPARATOR - . $file_path_sha - . ($this->config->use_igbinary ? '-igbinary' : ''); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php deleted file mode 100644 index bedf9b64..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php +++ /dev/null @@ -1,138 +0,0 @@ - - */ - private static $storage = []; - - /** - * @var array - */ - private static $new_storage = []; - - /** - * @var ?ClassLikeStorageCacheProvider - */ - public $cache; - - public function __construct(?ClassLikeStorageCacheProvider $cache = null) - { - $this->cache = $cache; - } - - /** - * @throws InvalidArgumentException when class does not exist - */ - public function get(string $fq_classlike_name): ClassLikeStorage - { - $fq_classlike_name_lc = strtolower($fq_classlike_name); - if (!isset(self::$storage[$fq_classlike_name_lc])) { - throw new InvalidArgumentException('Could not get class storage for ' . $fq_classlike_name_lc); - } - - return self::$storage[$fq_classlike_name_lc]; - } - - public function has(string $fq_classlike_name): bool - { - $fq_classlike_name_lc = strtolower($fq_classlike_name); - - return isset(self::$storage[$fq_classlike_name_lc]); - } - - public function exhume(string $fq_classlike_name, string $file_path, string $file_contents): ClassLikeStorage - { - $fq_classlike_name_lc = strtolower($fq_classlike_name); - - if (isset(self::$storage[$fq_classlike_name_lc])) { - return self::$storage[$fq_classlike_name_lc]; - } - - if (!$this->cache) { - throw new LogicException('Cannot exhume when there’s no cache'); - } - - $cached_value = $this->cache->getLatestFromCache($fq_classlike_name_lc, $file_path, $file_contents); - - self::$storage[$fq_classlike_name_lc] = $cached_value; - self::$new_storage[$fq_classlike_name_lc] = $cached_value; - - return $cached_value; - } - - /** - * @return array - */ - public function getAll(): array - { - return self::$storage; - } - - /** - * @return array - */ - public function getNew(): array - { - return self::$new_storage; - } - - /** - * @param array $more - * - */ - public function addMore(array $more): void - { - self::$new_storage = array_merge(self::$new_storage, $more); - self::$storage = array_merge(self::$storage, $more); - } - - public function makeNew(string $fq_classlike_name_lc): void - { - self::$new_storage[$fq_classlike_name_lc] = self::$storage[$fq_classlike_name_lc]; - } - - public function create(string $fq_classlike_name): ClassLikeStorage - { - $fq_classlike_name_lc = strtolower($fq_classlike_name); - - $storage = new ClassLikeStorage($fq_classlike_name); - self::$storage[$fq_classlike_name_lc] = $storage; - self::$new_storage[$fq_classlike_name_lc] = $storage; - - return $storage; - } - - public function remove(string $fq_classlike_name): void - { - $fq_classlike_name_lc = strtolower($fq_classlike_name); - - unset(self::$storage[$fq_classlike_name_lc]); - } - - public static function deleteAll(): void - { - self::$storage = []; - self::$new_storage = []; - } - - public static function populated(): void - { - self::$new_storage = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php deleted file mode 100644 index a94071ad..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php +++ /dev/null @@ -1,75 +0,0 @@ - - */ - public $fake_files = []; - - /** - * @var array - */ - public $fake_file_times = []; - - public function fileExists(string $file_path): bool - { - return isset($this->fake_files[$file_path]) || parent::fileExists($file_path); - } - - public function getContents(string $file_path, bool $go_to_source = false): string - { - if (!$go_to_source && isset($this->temp_files[$file_path])) { - return $this->temp_files[$file_path]; - } - - return $this->fake_files[$file_path] ?? parent::getContents($file_path); - } - - public function setContents(string $file_path, string $file_contents): void - { - $this->fake_files[$file_path] = $file_contents; - } - - public function setOpenContents(string $file_path, string $file_contents): void - { - if (isset($this->fake_files[$file_path])) { - $this->fake_files[$file_path] = $file_contents; - } - } - - public function getModifiedTime(string $file_path): int - { - return $this->fake_file_times[$file_path] ?? parent::getModifiedTime($file_path); - } - - public function registerFile(string $file_path, string $file_contents): void - { - $this->fake_files[$file_path] = $file_contents; - $this->fake_file_times[$file_path] = (int)microtime(true); - } - - /** - * @param array $file_extensions - * @param null|callable(string):bool $filter - * - * @return list - */ - public function getFilesInDir(string $dir_path, array $file_extensions, callable $filter = null): array - { - $file_paths = parent::getFilesInDir($dir_path, $file_extensions, $filter); - - foreach ($this->fake_files as $file_path => $_) { - if (strpos($file_path, $dir_path) === 0) { - $file_paths[] = $file_path; - } - } - - return $file_paths; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php deleted file mode 100644 index 66d5aad3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php +++ /dev/null @@ -1,163 +0,0 @@ - - */ - protected $temp_files = []; - - /** - * @var array - */ - protected static $open_files = []; - - public function getContents(string $file_path, bool $go_to_source = false): string - { - if (!$go_to_source && isset($this->temp_files[$file_path])) { - return $this->temp_files[$file_path]; - } - - if (isset(self::$open_files[$file_path])) { - return self::$open_files[$file_path]; - } - - if (!file_exists($file_path)) { - throw new UnexpectedValueException('File ' . $file_path . ' should exist to get contents'); - } - - if (is_dir($file_path)) { - throw new UnexpectedValueException('File ' . $file_path . ' is a directory'); - } - - $file_contents = (string) file_get_contents($file_path); - - self::$open_files[$file_path] = $file_contents; - - return $file_contents; - } - - public function setContents(string $file_path, string $file_contents): void - { - if (isset(self::$open_files[$file_path])) { - self::$open_files[$file_path] = $file_contents; - } - - if (isset($this->temp_files[$file_path])) { - $this->temp_files[$file_path] = $file_contents; - } - - file_put_contents($file_path, $file_contents); - } - - public function setOpenContents(string $file_path, string $file_contents): void - { - if (isset(self::$open_files[$file_path])) { - self::$open_files[$file_path] = $file_contents; - } - } - - public function getModifiedTime(string $file_path): int - { - if (!file_exists($file_path)) { - throw new UnexpectedValueException('File should exist to get modified time'); - } - - return (int) filemtime($file_path); - } - - public function addTemporaryFileChanges(string $file_path, string $new_content): void - { - $this->temp_files[$file_path] = $new_content; - } - - public function removeTemporaryFileChanges(string $file_path): void - { - unset($this->temp_files[$file_path]); - } - - public function openFile(string $file_path): void - { - self::$open_files[$file_path] = $this->getContents($file_path, true); - } - - public function isOpen(string $file_path): bool - { - return isset($this->temp_files[$file_path]) || isset(self::$open_files[$file_path]); - } - - public function closeFile(string $file_path): void - { - unset($this->temp_files[$file_path], self::$open_files[$file_path]); - } - - public function fileExists(string $file_path): bool - { - return file_exists($file_path); - } - - /** - * @param array $file_extensions - * @param null|callable(string):bool $filter - * - * @return list - */ - public function getFilesInDir(string $dir_path, array $file_extensions, callable $filter = null): array - { - $file_paths = []; - - $iterator = new RecursiveDirectoryIterator( - $dir_path, - FilesystemIterator::CURRENT_AS_PATHNAME | FilesystemIterator::SKIP_DOTS - ); - - if ($filter !== null) { - $iterator = new RecursiveCallbackFilterIterator( - $iterator, - /** @param mixed $_ */ - function (string $current, $_, RecursiveIterator $iterator) use ($filter): bool { - if ($iterator->hasChildren()) { - $path = $current . DIRECTORY_SEPARATOR; - } else { - $path = $current; - } - - return $filter($path); - } - ); - } - - /** @var RecursiveDirectoryIterator */ - $iterator = new RecursiveIteratorIterator($iterator); - $iterator->rewind(); - - while ($iterator->valid()) { - $extension = $iterator->getExtension(); - if (in_array($extension, $file_extensions, true)) { - $file_paths[] = (string)$iterator->getRealPath(); - } - - $iterator->next(); - } - - return $file_paths; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php deleted file mode 100644 index 616a1c2c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php +++ /dev/null @@ -1,1007 +0,0 @@ -config = $config; - } - - public function hasConfigChanged(): bool - { - $new_hash = $this->config->computeHash(); - $has_changed = $new_hash !== $this->getConfigHashCache(); - $this->setConfigHashCache($new_hash); - return $has_changed; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedFileReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::REFERENCE_CACHE_NAME; - - if (!is_readable($reference_cache_location)) { - return null; - } - - if ($this->config->use_igbinary) { - $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); - } else { - $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); - } - - if (!is_array($reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedClassLikeFiles(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASSLIKE_FILE_CACHE_NAME; - - if (!is_readable($reference_cache_location)) { - return null; - } - - if ($this->config->use_igbinary) { - $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); - } else { - $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); - } - - if (!is_array($reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedNonMethodClassReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::NONMETHOD_CLASS_REFERENCE_CACHE_NAME; - - if (!is_readable($reference_cache_location)) { - return null; - } - - if ($this->config->use_igbinary) { - $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); - } else { - $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); - } - - if (!is_array($reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedMethodClassReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_CLASS_REFERENCE_CACHE_NAME; - - if (!is_readable($reference_cache_location)) { - return null; - } - - if ($this->config->use_igbinary) { - $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); - } else { - $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); - } - - if (!is_array($reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedMethodMemberReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $class_member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_METHOD_CACHE_NAME; - - if (!is_readable($class_member_cache_location)) { - return null; - } - - $class_member_reference_cache = (string) file_get_contents($class_member_cache_location); - if ($this->config->use_igbinary) { - $class_member_reference_cache = igbinary_unserialize($class_member_reference_cache); - } else { - $class_member_reference_cache = unserialize($class_member_reference_cache); - } - - if (!is_array($class_member_reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $class_member_reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedMethodDependencies(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $method_dependencies_cache_location - = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_DEPENDENCIES_CACHE_NAME; - - if (!is_readable($method_dependencies_cache_location)) { - return null; - } - - $method_dependencies_cache = (string) file_get_contents($method_dependencies_cache_location); - if ($this->config->use_igbinary) { - $method_dependencies_cache = igbinary_unserialize($method_dependencies_cache); - } else { - $method_dependencies_cache = unserialize($method_dependencies_cache); - } - - if (!is_array($method_dependencies_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $method_dependencies_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedMethodPropertyReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $class_member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_PROPERTY_CACHE_NAME; - - if (!is_readable($class_member_cache_location)) { - return null; - } - - $class_member_reference_cache = (string) file_get_contents($class_member_cache_location); - if ($this->config->use_igbinary) { - $class_member_reference_cache = igbinary_unserialize($class_member_reference_cache); - } else { - $class_member_reference_cache = unserialize($class_member_reference_cache); - } - - if (!is_array($class_member_reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $class_member_reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedMethodMethodReturnReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $class_member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_METHOD_RETURN_CACHE_NAME; - - if (!is_readable($class_member_cache_location)) { - return null; - } - - $class_member_reference_cache = (string) file_get_contents($class_member_cache_location); - if ($this->config->use_igbinary) { - $class_member_reference_cache = igbinary_unserialize($class_member_reference_cache); - } else { - $class_member_reference_cache = unserialize($class_member_reference_cache); - } - - if (!is_array($class_member_reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $class_member_reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedMethodMissingMemberReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $class_member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_MISSING_MEMBER_CACHE_NAME; - - if (!is_readable($class_member_cache_location)) { - return null; - } - - $class_member_reference_cache = (string) file_get_contents($class_member_cache_location); - if ($this->config->use_igbinary) { - $class_member_reference_cache = igbinary_unserialize($class_member_reference_cache); - } else { - $class_member_reference_cache = unserialize($class_member_reference_cache); - } - - if (!is_array($class_member_reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $class_member_reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedFileMemberReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $file_class_member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_CLASS_MEMBER_CACHE_NAME; - - if (!is_readable($file_class_member_cache_location)) { - return null; - } - - $file_class_member_reference_cache = (string) file_get_contents($file_class_member_cache_location); - if ($this->config->use_igbinary) { - $file_class_member_reference_cache = igbinary_unserialize($file_class_member_reference_cache); - } else { - $file_class_member_reference_cache = unserialize($file_class_member_reference_cache); - } - - if (!is_array($file_class_member_reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $file_class_member_reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedFilePropertyReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $file_class_member_cache_location = $cache_directory - . DIRECTORY_SEPARATOR - . self::FILE_CLASS_PROPERTY_CACHE_NAME; - - if (!is_readable($file_class_member_cache_location)) { - return null; - } - - $file_class_member_reference_cache = (string) file_get_contents($file_class_member_cache_location); - if ($this->config->use_igbinary) { - $file_class_member_reference_cache = igbinary_unserialize($file_class_member_reference_cache); - } else { - $file_class_member_reference_cache = unserialize($file_class_member_reference_cache); - } - - if (!is_array($file_class_member_reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $file_class_member_reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedFileMethodReturnReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $file_class_member_cache_location = $cache_directory - . DIRECTORY_SEPARATOR - . self::FILE_METHOD_RETURN_CACHE_NAME; - - if (!is_readable($file_class_member_cache_location)) { - return null; - } - - $file_class_member_reference_cache = (string) file_get_contents($file_class_member_cache_location); - if ($this->config->use_igbinary) { - $file_class_member_reference_cache = igbinary_unserialize($file_class_member_reference_cache); - } else { - $file_class_member_reference_cache = unserialize($file_class_member_reference_cache); - } - - if (!is_array($file_class_member_reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $file_class_member_reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedFileMissingMemberReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $file_class_member_cache_location - = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_MISSING_MEMBER_CACHE_NAME; - - if (!is_readable($file_class_member_cache_location)) { - return null; - } - - $file_class_member_reference_cache = (string) file_get_contents($file_class_member_cache_location); - if ($this->config->use_igbinary) { - $file_class_member_reference_cache = igbinary_unserialize($file_class_member_reference_cache); - } else { - $file_class_member_reference_cache = unserialize($file_class_member_reference_cache); - } - - if (!is_array($file_class_member_reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $file_class_member_reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedMixedMemberNameReferences(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::UNKNOWN_MEMBER_CACHE_NAME; - - if (!is_readable($reference_cache_location)) { - return null; - } - - if ($this->config->use_igbinary) { - $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); - } else { - $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); - } - - if (!is_array($reference_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedMethodParamUses(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_PARAM_USE_CACHE_NAME; - - if (!is_readable($reference_cache_location)) { - return null; - } - - if ($this->config->use_igbinary) { - $reference_cache = igbinary_unserialize((string) file_get_contents($reference_cache_location)); - } else { - $reference_cache = unserialize((string) file_get_contents($reference_cache_location)); - } - - if (!is_array($reference_cache)) { - throw new UnexpectedValueException('The method param use cache must be an array'); - } - - return $reference_cache; - } - - /** - * @psalm-suppress MixedAssignment - */ - public function getCachedIssues(): ?array - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return null; - } - - $issues_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::ISSUES_CACHE_NAME; - - if (!is_readable($issues_cache_location)) { - return null; - } - - if ($this->config->use_igbinary) { - $issues_cache = igbinary_unserialize((string) file_get_contents($issues_cache_location)); - } else { - $issues_cache = unserialize((string) file_get_contents($issues_cache_location)); - } - - if (!is_array($issues_cache)) { - throw new UnexpectedValueException('The reference cache must be an array'); - } - - return $issues_cache; - } - - public function setCachedFileReferences(array $file_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::REFERENCE_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($reference_cache_location, igbinary_serialize($file_references)); - } else { - file_put_contents($reference_cache_location, serialize($file_references)); - } - } - - public function setCachedClassLikeFiles(array $file_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASSLIKE_FILE_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($reference_cache_location, igbinary_serialize($file_references)); - } else { - file_put_contents($reference_cache_location, serialize($file_references)); - } - } - - public function setCachedNonMethodClassReferences(array $file_class_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::NONMETHOD_CLASS_REFERENCE_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($reference_cache_location, igbinary_serialize($file_class_references)); - } else { - file_put_contents($reference_cache_location, serialize($file_class_references)); - } - } - - public function setCachedMethodClassReferences(array $method_class_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_CLASS_REFERENCE_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($reference_cache_location, igbinary_serialize($method_class_references)); - } else { - file_put_contents($reference_cache_location, serialize($method_class_references)); - } - } - - public function setCachedMethodMemberReferences(array $member_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_METHOD_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($member_cache_location, igbinary_serialize($member_references)); - } else { - file_put_contents($member_cache_location, serialize($member_references)); - } - } - - public function setCachedMethodDependencies(array $member_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_DEPENDENCIES_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($member_cache_location, igbinary_serialize($member_references)); - } else { - file_put_contents($member_cache_location, serialize($member_references)); - } - } - - public function setCachedMethodPropertyReferences(array $property_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_PROPERTY_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($member_cache_location, igbinary_serialize($property_references)); - } else { - file_put_contents($member_cache_location, serialize($property_references)); - } - } - - public function setCachedMethodMethodReturnReferences(array $method_return_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CLASS_METHOD_RETURN_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($member_cache_location, igbinary_serialize($method_return_references)); - } else { - file_put_contents($member_cache_location, serialize($method_return_references)); - } - } - - public function setCachedMethodMissingMemberReferences(array $member_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_MISSING_MEMBER_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($member_cache_location, igbinary_serialize($member_references)); - } else { - file_put_contents($member_cache_location, serialize($member_references)); - } - } - - public function setCachedFileMemberReferences(array $member_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_CLASS_MEMBER_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($member_cache_location, igbinary_serialize($member_references)); - } else { - file_put_contents($member_cache_location, serialize($member_references)); - } - } - - public function setCachedFilePropertyReferences(array $property_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_CLASS_PROPERTY_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($member_cache_location, igbinary_serialize($property_references)); - } else { - file_put_contents($member_cache_location, serialize($property_references)); - } - } - - public function setCachedFileMethodReturnReferences(array $method_return_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_METHOD_RETURN_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($member_cache_location, igbinary_serialize($method_return_references)); - } else { - file_put_contents($member_cache_location, serialize($method_return_references)); - } - } - - public function setCachedFileMissingMemberReferences(array $member_references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $member_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_MISSING_MEMBER_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($member_cache_location, igbinary_serialize($member_references)); - } else { - file_put_contents($member_cache_location, serialize($member_references)); - } - } - - public function setCachedMixedMemberNameReferences(array $references): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::UNKNOWN_MEMBER_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($reference_cache_location, igbinary_serialize($references)); - } else { - file_put_contents($reference_cache_location, serialize($references)); - } - } - - public function setCachedMethodParamUses(array $uses): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $reference_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::METHOD_PARAM_USE_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($reference_cache_location, igbinary_serialize($uses)); - } else { - file_put_contents($reference_cache_location, serialize($uses)); - } - } - - public function setCachedIssues(array $issues): void - { - $cache_directory = $this->config->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $issues_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::ISSUES_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($issues_cache_location, igbinary_serialize($issues)); - } else { - file_put_contents($issues_cache_location, serialize($issues)); - } - } - - /** - * @return array>|false - */ - public function getAnalyzedMethodCache() - { - $cache_directory = $this->config->getCacheDirectory(); - - $analyzed_methods_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::ANALYZED_METHODS_CACHE_NAME; - - if ($cache_directory - && file_exists($analyzed_methods_cache_location) - ) { - if ($this->config->use_igbinary) { - /** @var array> */ - return igbinary_unserialize(file_get_contents($analyzed_methods_cache_location)); - } else { - /** @var array> */ - return unserialize(file_get_contents($analyzed_methods_cache_location)); - } - } - - return false; - } - - /** - * @param array> $analyzed_methods - */ - public function setAnalyzedMethodCache(array $analyzed_methods): void - { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - if ($cache_directory) { - $analyzed_methods_cache_location = $cache_directory - . DIRECTORY_SEPARATOR - . self::ANALYZED_METHODS_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($analyzed_methods_cache_location, igbinary_serialize($analyzed_methods)); - } else { - file_put_contents($analyzed_methods_cache_location, serialize($analyzed_methods)); - } - } - } - - /** - * @return array|false - */ - public function getFileMapCache() - { - $cache_directory = $this->config->getCacheDirectory(); - - $file_maps_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_MAPS_CACHE_NAME; - - if ($cache_directory - && file_exists($file_maps_cache_location) - ) { - if ($this->config->use_igbinary) { - /** - * @var array - */ - $file_maps_cache = igbinary_unserialize(file_get_contents($file_maps_cache_location)); - } else { - /** - * @var array - */ - $file_maps_cache = unserialize(file_get_contents($file_maps_cache_location)); - } - - return $file_maps_cache; - } - - return false; - } - - /** - * @param array $file_maps - */ - public function setFileMapCache(array $file_maps): void - { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - if ($cache_directory) { - $file_maps_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::FILE_MAPS_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($file_maps_cache_location, igbinary_serialize($file_maps)); - } else { - file_put_contents($file_maps_cache_location, serialize($file_maps)); - } - } - } - - /** - * @return array|false - */ - public function getTypeCoverage() - { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - $type_coverage_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::TYPE_COVERAGE_CACHE_NAME; - - if ($cache_directory - && file_exists($type_coverage_cache_location) - ) { - if ($this->config->use_igbinary) { - /** @var array */ - $type_coverage_cache = igbinary_unserialize(file_get_contents($type_coverage_cache_location)); - } else { - /** @var array */ - $type_coverage_cache = unserialize(file_get_contents($type_coverage_cache_location)); - } - - return $type_coverage_cache; - } - - return false; - } - - /** - * @param array $mixed_counts - */ - public function setTypeCoverage(array $mixed_counts): void - { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - if ($cache_directory) { - $type_coverage_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::TYPE_COVERAGE_CACHE_NAME; - - if ($this->config->use_igbinary) { - file_put_contents($type_coverage_cache_location, igbinary_serialize($mixed_counts)); - } else { - file_put_contents($type_coverage_cache_location, serialize($mixed_counts)); - } - } - } - - /** - * @return string|false - */ - public function getConfigHashCache() - { - $cache_directory = $this->config->getCacheDirectory(); - - $config_hash_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CONFIG_HASH_CACHE_NAME; - - if ($cache_directory - && file_exists($config_hash_cache_location) - ) { - return file_get_contents($config_hash_cache_location); - } - - return false; - } - - public function setConfigHashCache(string $hash): void - { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - if ($cache_directory) { - if (!file_exists($cache_directory)) { - mkdir($cache_directory, 0777, true); - } - - $config_hash_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::CONFIG_HASH_CACHE_NAME; - - file_put_contents( - $config_hash_cache_location, - $hash - ); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php deleted file mode 100644 index 431726ca..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php +++ /dev/null @@ -1,1320 +0,0 @@ -> - */ - private static $nonmethod_references_to_classes = []; - - /** - * A lookup table used for getting all the methods that reference a class - * - * @var array> - */ - private static $method_references_to_classes = []; - - /** - * A lookup table used for getting all the files that reference a class member - * - * @var array> - */ - private static $file_references_to_class_members = []; - - /** - * A lookup table used for getting all the files that reference a class property - * - * @var array> - */ - private static $file_references_to_class_properties = []; - - /** - * A lookup table used for getting all the files that reference a method's return value - * - * @var array> - */ - private static $file_references_to_method_returns = []; - - /** - * A lookup table used for getting all the files that reference a missing class member - * - * @var array> - */ - private static $file_references_to_missing_class_members = []; - - /** - * @var array> - */ - private static $files_inheriting_classes = []; - - /** - * A list of all files deleted since the last successful run - * - * @var array|null - */ - private static $deleted_files; - - /** - * A lookup table used for getting all the files referenced by a file - * - * @var array, i:array}> - */ - private static $file_references = []; - - /** - * @var array> - */ - private static $method_references_to_class_members = []; - - /** - * @var array> - */ - private static $method_dependencies = []; - - /** - * @var array> - */ - private static $method_references_to_class_properties = []; - - /** - * @var array> - */ - private static $method_references_to_method_returns = []; - - /** - * @var array> - */ - private static $method_references_to_missing_class_members = []; - - /** - * @var array> - */ - private static $references_to_mixed_member_names = []; - - /** - * @var array> - */ - private static $class_method_locations = []; - - /** - * @var array> - */ - private static $class_property_locations = []; - - /** - * @var array> - */ - private static $class_locations = []; - - /** - * @var array - */ - private static $classlike_files = []; - - /** - * @var array> - */ - private static $analyzed_methods = []; - - /** - * @var array> - */ - private static $issues = []; - - /** - * @var array - */ - private static $file_maps = []; - - /** - * @var array - */ - private static $mixed_counts = []; - - /** - * @var array>> - */ - private static $method_param_uses = []; - - /** - * @var ?FileReferenceCacheProvider - */ - public $cache; - - public function __construct(?FileReferenceCacheProvider $cache = null) - { - $this->cache = $cache; - } - - /** - * @return array - */ - public function getDeletedReferencedFiles(): array - { - if (self::$deleted_files === null) { - self::$deleted_files = array_filter( - array_keys(self::$file_references), - function (string $file_name): bool { - return !file_exists($file_name); - } - ); - } - - return self::$deleted_files; - } - - /** - * @param lowercase-string $fq_class_name_lc - */ - public function addNonMethodReferenceToClass(string $source_file, string $fq_class_name_lc): void - { - self::$nonmethod_references_to_classes[$fq_class_name_lc][$source_file] = true; - } - - /** - * @return array> - */ - public function getAllNonMethodReferencesToClasses(): array - { - return self::$nonmethod_references_to_classes; - } - - /** - * @param array> $references - * - */ - public function addNonMethodReferencesToClasses(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$nonmethod_references_to_classes[$key])) { - self::$nonmethod_references_to_classes[$key] = array_merge( - $reference, - self::$nonmethod_references_to_classes[$key] - ); - } else { - self::$nonmethod_references_to_classes[$key] = $reference; - } - } - } - - /** - * @param array $map - */ - public function addClassLikeFiles(array $map): void - { - self::$classlike_files += $map; - } - - public function addFileReferenceToClassMember( - string $source_file, - string $referenced_member_id, - bool $inside_return - ): void { - self::$file_references_to_class_members[$referenced_member_id][$source_file] = true; - - if ($inside_return) { - self::$file_references_to_method_returns[$referenced_member_id][$source_file] = true; - } - } - - public function addFileReferenceToClassProperty(string $source_file, string $referenced_property_id): void - { - self::$file_references_to_class_properties[$referenced_property_id][$source_file] = true; - } - - public function addFileReferenceToMissingClassMember(string $source_file, string $referenced_member_id): void - { - self::$file_references_to_missing_class_members[$referenced_member_id][$source_file] = true; - } - - /** - * @return array> - */ - public function getAllFileReferencesToClassMembers(): array - { - return self::$file_references_to_class_members; - } - - /** - * @return array> - */ - public function getAllFileReferencesToClassProperties(): array - { - return self::$file_references_to_class_properties; - } - - /** - * @return array> - */ - public function getAllFileReferencesToMethodReturns(): array - { - return self::$file_references_to_method_returns; - } - - /** - * @return array> - */ - public function getAllFileReferencesToMissingClassMembers(): array - { - return self::$file_references_to_missing_class_members; - } - - /** - * @param array> $references - * - */ - public function addFileReferencesToClassMembers(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$file_references_to_class_members[$key])) { - self::$file_references_to_class_members[$key] = array_merge( - $reference, - self::$file_references_to_class_members[$key] - ); - } else { - self::$file_references_to_class_members[$key] = $reference; - } - } - } - - /** - * @param array> $references - * - */ - public function addFileReferencesToClassProperties(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$file_references_to_class_properties[$key])) { - self::$file_references_to_class_properties[$key] = array_merge( - $reference, - self::$file_references_to_class_properties[$key] - ); - } else { - self::$file_references_to_class_properties[$key] = $reference; - } - } - } - - /** - * @param array> $references - * - */ - public function addFileReferencesToMethodReturns(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$file_references_to_method_returns[$key])) { - self::$file_references_to_method_returns[$key] = array_merge( - $reference, - self::$file_references_to_method_returns[$key] - ); - } else { - self::$file_references_to_method_returns[$key] = $reference; - } - } - } - - /** - * @param array> $references - * - */ - public function addFileReferencesToMissingClassMembers(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$file_references_to_missing_class_members[$key])) { - self::$file_references_to_missing_class_members[$key] = array_merge( - $reference, - self::$file_references_to_missing_class_members[$key] - ); - } else { - self::$file_references_to_missing_class_members[$key] = $reference; - } - } - } - - public function addFileInheritanceToClass(string $source_file, string $fq_class_name_lc): void - { - self::$files_inheriting_classes[$fq_class_name_lc][$source_file] = true; - } - - public function addMethodParamUse(string $method_id, int $offset, string $referencing_method_id): void - { - self::$method_param_uses[$method_id][$offset][$referencing_method_id] = true; - } - - /** - * @return array - */ - private function calculateFilesReferencingFile(Codebase $codebase, string $file): array - { - $referenced_files = []; - - $file_classes = ClassLikeAnalyzer::getClassesForFile($codebase, $file); - - foreach ($file_classes as $file_class_lc => $_) { - if (isset(self::$nonmethod_references_to_classes[$file_class_lc])) { - $new_files = array_keys(self::$nonmethod_references_to_classes[$file_class_lc]); - - $referenced_files = array_merge( - $referenced_files, - $new_files - ); - } - - if (isset(self::$method_references_to_classes[$file_class_lc])) { - $new_referencing_methods = array_keys(self::$method_references_to_classes[$file_class_lc]); - - foreach ($new_referencing_methods as $new_referencing_method_id) { - $fq_class_name_lc = explode('::', $new_referencing_method_id)[0]; - - try { - $referenced_files[] = $codebase->scanner->getClassLikeFilePath($fq_class_name_lc); - } catch (UnexpectedValueException $e) { - if (isset(self::$classlike_files[$fq_class_name_lc])) { - $referenced_files[] = self::$classlike_files[$fq_class_name_lc]; - } - } - } - } - } - - return array_unique($referenced_files); - } - - /** - * @return array - */ - private function calculateFilesInheritingFile(Codebase $codebase, string $file): array - { - $referenced_files = []; - - $file_classes = ClassLikeAnalyzer::getClassesForFile($codebase, $file); - - foreach ($file_classes as $file_class_lc => $_) { - if (isset(self::$files_inheriting_classes[$file_class_lc])) { - $referenced_files = array_merge( - $referenced_files, - array_keys(self::$files_inheriting_classes[$file_class_lc]) - ); - } - } - - return array_unique($referenced_files); - } - - public function removeDeletedFilesFromReferences(): void - { - $deleted_files = $this->getDeletedReferencedFiles(); - - if ($deleted_files) { - foreach ($deleted_files as $file) { - unset(self::$file_references[$file]); - } - - if ($this->cache) { - $this->cache->setCachedFileReferences(self::$file_references); - } - } - } - - /** - * @return array - */ - public function getFilesReferencingFile(string $file): array - { - return self::$file_references[$file]['a'] ?? []; - } - - /** - * @return array - */ - public function getFilesInheritingFromFile(string $file): array - { - return self::$file_references[$file]['i'] ?? []; - } - - /** - * @return array> - */ - public function getAllMethodReferencesToClassMembers(): array - { - return self::$method_references_to_class_members; - } - - /** - * @return array> - */ - public function getAllMethodDependencies(): array - { - return self::$method_dependencies; - } - - /** - * @return array> - */ - public function getAllMethodReferencesToClassProperties(): array - { - return self::$method_references_to_class_properties; - } - - /** - * @return array> - */ - public function getAllMethodReferencesToMethodReturns(): array - { - return self::$method_references_to_method_returns; - } - - /** - * @return array> - */ - public function getAllMethodReferencesToClasses(): array - { - return self::$method_references_to_classes; - } - - /** - * @return array> - */ - public function getAllMethodReferencesToMissingClassMembers(): array - { - return self::$method_references_to_missing_class_members; - } - - /** - * @return array> - */ - public function getAllReferencesToMixedMemberNames(): array - { - return self::$references_to_mixed_member_names; - } - - /** - * @return array>> - */ - public function getAllMethodParamUses(): array - { - return self::$method_param_uses; - } - - /** - * @psalm-suppress MixedPropertyTypeCoercion - */ - public function loadReferenceCache(bool $force_reload = true): bool - { - if ($this->cache && (!$this->loaded_from_cache || $force_reload)) { - $this->loaded_from_cache = true; - - $file_references = $this->cache->getCachedFileReferences(); - - if ($file_references === null) { - return false; - } - - self::$file_references = $file_references; - - $nonmethod_references_to_classes = $this->cache->getCachedNonMethodClassReferences(); - - if ($nonmethod_references_to_classes === null) { - return false; - } - - self::$nonmethod_references_to_classes = $nonmethod_references_to_classes; - - $method_references_to_classes = $this->cache->getCachedMethodClassReferences(); - - if ($method_references_to_classes === null) { - return false; - } - - self::$method_references_to_classes = $method_references_to_classes; - - $method_references_to_class_members = $this->cache->getCachedMethodMemberReferences(); - - if ($method_references_to_class_members === null) { - return false; - } - - self::$method_references_to_class_members = $method_references_to_class_members; - - $method_dependencies = $this->cache->getCachedMethodDependencies(); - - if ($method_dependencies === null) { - return false; - } - - self::$method_dependencies = $method_dependencies; - - $method_references_to_class_properties = $this->cache->getCachedMethodPropertyReferences(); - - if ($method_references_to_class_properties === null) { - return false; - } - - self::$method_references_to_class_properties = $method_references_to_class_properties; - - $method_references_to_method_returns = $this->cache->getCachedMethodMethodReturnReferences(); - - if ($method_references_to_method_returns === null) { - return false; - } - - self::$method_references_to_method_returns = $method_references_to_method_returns; - - $method_references_to_missing_class_members = $this->cache->getCachedMethodMissingMemberReferences(); - - if ($method_references_to_missing_class_members === null) { - return false; - } - - self::$method_references_to_missing_class_members = $method_references_to_missing_class_members; - - $file_references_to_class_members = $this->cache->getCachedFileMemberReferences(); - - if ($file_references_to_class_members === null) { - return false; - } - - self::$file_references_to_class_members = $file_references_to_class_members; - - $file_references_to_class_properties = $this->cache->getCachedFilePropertyReferences(); - - if ($file_references_to_class_properties === null) { - return false; - } - - self::$file_references_to_class_properties = $file_references_to_class_properties; - - $file_references_to_method_returns = $this->cache->getCachedFileMethodReturnReferences(); - - if ($file_references_to_method_returns === null) { - return false; - } - - self::$file_references_to_method_returns = $file_references_to_method_returns; - - $file_references_to_missing_class_members = $this->cache->getCachedFileMissingMemberReferences(); - - if ($file_references_to_missing_class_members === null) { - return false; - } - - self::$file_references_to_missing_class_members = $file_references_to_missing_class_members; - - $references_to_mixed_member_names = $this->cache->getCachedMixedMemberNameReferences(); - - if ($references_to_mixed_member_names === null) { - return false; - } - - self::$references_to_mixed_member_names = $references_to_mixed_member_names; - - $analyzed_methods = $this->cache->getAnalyzedMethodCache(); - - if ($analyzed_methods === false) { - return false; - } - - self::$analyzed_methods = $analyzed_methods; - - $issues = $this->cache->getCachedIssues(); - - if ($issues === null) { - return false; - } - - self::$issues = $issues; - - $method_param_uses = $this->cache->getCachedMethodParamUses(); - - if ($method_param_uses === null) { - return false; - } - - self::$method_param_uses = $method_param_uses; - - $mixed_counts = $this->cache->getTypeCoverage(); - - if ($mixed_counts === false) { - return false; - } - - self::$mixed_counts = $mixed_counts; - - $classlike_files = $this->cache->getCachedClassLikeFiles(); - - if ($classlike_files === null) { - return false; - } - - self::$classlike_files = $classlike_files; - - self::$file_maps = $this->cache->getFileMapCache() ?: []; - - return true; - } - - return false; - } - - /** - * @param array $visited_files - * - */ - public function updateReferenceCache(Codebase $codebase, array $visited_files): void - { - foreach ($visited_files as $file => $_) { - $all_file_references = array_unique( - array_merge( - self::$file_references[$file]['a'] ?? [], - $this->calculateFilesReferencingFile($codebase, $file) - ) - ); - - $inheritance_references = array_unique( - array_merge( - self::$file_references[$file]['i'] ?? [], - $this->calculateFilesInheritingFile($codebase, $file) - ) - ); - - self::$file_references[$file] = [ - 'a' => $all_file_references, - 'i' => $inheritance_references, - ]; - } - - if ($this->cache) { - $this->cache->setCachedFileReferences(self::$file_references); - $this->cache->setCachedMethodClassReferences(self::$method_references_to_classes); - $this->cache->setCachedNonMethodClassReferences(self::$nonmethod_references_to_classes); - $this->cache->setCachedMethodMemberReferences(self::$method_references_to_class_members); - $this->cache->setCachedMethodDependencies(self::$method_dependencies); - $this->cache->setCachedMethodPropertyReferences(self::$method_references_to_class_properties); - $this->cache->setCachedMethodMethodReturnReferences(self::$method_references_to_method_returns); - $this->cache->setCachedFileMemberReferences(self::$file_references_to_class_members); - $this->cache->setCachedFilePropertyReferences(self::$file_references_to_class_properties); - $this->cache->setCachedFileMethodReturnReferences(self::$file_references_to_method_returns); - $this->cache->setCachedMethodMissingMemberReferences(self::$method_references_to_missing_class_members); - $this->cache->setCachedFileMissingMemberReferences(self::$file_references_to_missing_class_members); - $this->cache->setCachedMixedMemberNameReferences(self::$references_to_mixed_member_names); - $this->cache->setCachedMethodParamUses(self::$method_param_uses); - $this->cache->setCachedIssues(self::$issues); - $this->cache->setCachedClassLikeFiles(self::$classlike_files); - $this->cache->setFileMapCache(self::$file_maps); - $this->cache->setTypeCoverage(self::$mixed_counts); - $this->cache->setAnalyzedMethodCache(self::$analyzed_methods); - } - } - - /** - * @param lowercase-string $fq_class_name_lc - */ - public function addMethodReferenceToClass(string $calling_function_id, string $fq_class_name_lc): void - { - if (!isset(self::$method_references_to_classes[$fq_class_name_lc])) { - self::$method_references_to_classes[$fq_class_name_lc] = [$calling_function_id => true]; - } else { - self::$method_references_to_classes[$fq_class_name_lc][$calling_function_id] = true; - } - } - - public function addMethodReferenceToClassMember( - string $calling_function_id, - string $referenced_member_id, - bool $inside_return - ): void { - if (!isset(self::$method_references_to_class_members[$referenced_member_id])) { - self::$method_references_to_class_members[$referenced_member_id] = [$calling_function_id => true]; - } else { - self::$method_references_to_class_members[$referenced_member_id][$calling_function_id] = true; - } - - if ($inside_return) { - if (!isset(self::$method_references_to_method_returns[$referenced_member_id])) { - self::$method_references_to_method_returns[$referenced_member_id] = [$calling_function_id => true]; - } else { - self::$method_references_to_method_returns[$referenced_member_id][$calling_function_id] = true; - } - } - } - - public function addMethodDependencyToClassMember( - string $calling_function_id, - string $referenced_member_id - ): void { - if (!isset(self::$method_dependencies[$referenced_member_id])) { - self::$method_dependencies[$referenced_member_id] = [$calling_function_id => true]; - } else { - self::$method_dependencies[$referenced_member_id][$calling_function_id] = true; - } - } - - public function addMethodReferenceToClassProperty(string $calling_function_id, string $referenced_property_id): void - { - if (!isset(self::$method_references_to_class_properties[$referenced_property_id])) { - self::$method_references_to_class_properties[$referenced_property_id] = [$calling_function_id => true]; - } else { - self::$method_references_to_class_properties[$referenced_property_id][$calling_function_id] = true; - } - } - - public function addMethodReferenceToMissingClassMember( - string $calling_function_id, - string $referenced_member_id - ): void { - if (!isset(self::$method_references_to_missing_class_members[$referenced_member_id])) { - self::$method_references_to_missing_class_members[$referenced_member_id] = [$calling_function_id => true]; - } else { - self::$method_references_to_missing_class_members[$referenced_member_id][$calling_function_id] = true; - } - } - - public function addCallingLocationForClassMethod(CodeLocation $code_location, string $referenced_member_id): void - { - if (!isset(self::$class_method_locations[$referenced_member_id])) { - self::$class_method_locations[$referenced_member_id] = [$code_location]; - } else { - self::$class_method_locations[$referenced_member_id][] = $code_location; - } - } - - public function addCallingLocationForClassProperty( - CodeLocation $code_location, - string $referenced_property_id - ): void { - if (!isset(self::$class_property_locations[$referenced_property_id])) { - self::$class_property_locations[$referenced_property_id] = [$code_location]; - } else { - self::$class_property_locations[$referenced_property_id][] = $code_location; - } - } - - public function addCallingLocationForClass(CodeLocation $code_location, string $referenced_class): void - { - if (!isset(self::$class_locations[$referenced_class])) { - self::$class_locations[$referenced_class] = [$code_location]; - } else { - self::$class_locations[$referenced_class][] = $code_location; - } - } - - public function isClassMethodReferenced(string $method_id): bool - { - return !empty(self::$file_references_to_class_members[$method_id]) - || !empty(self::$method_references_to_class_members[$method_id]); - } - - public function isClassPropertyReferenced(string $property_id): bool - { - return !empty(self::$file_references_to_class_properties[$property_id]) - || !empty(self::$method_references_to_class_properties[$property_id]); - } - - public function isMethodReturnReferenced(string $method_id): bool - { - return !empty(self::$file_references_to_method_returns[$method_id]) - || !empty(self::$method_references_to_method_returns[$method_id]); - } - - public function isClassReferenced(string $fq_class_name_lc): bool - { - return isset(self::$method_references_to_classes[$fq_class_name_lc]) - || isset(self::$nonmethod_references_to_classes[$fq_class_name_lc]); - } - - public function isMethodParamUsed(string $method_id, int $offset): bool - { - return !empty(self::$method_param_uses[$method_id][$offset]); - } - - /** - * @param array> $references - * - */ - public function setNonMethodReferencesToClasses(array $references): void - { - self::$nonmethod_references_to_classes = $references; - } - - /** - * @return array> - */ - public function getAllClassMethodLocations(): array - { - return self::$class_method_locations; - } - - /** - * @return array> - */ - public function getAllClassPropertyLocations(): array - { - return self::$class_property_locations; - } - - /** - * @return array> - */ - public function getAllClassLocations(): array - { - return self::$class_locations; - } - - /** - * @return array - */ - public function getClassMethodLocations(string $method_id): array - { - return self::$class_method_locations[$method_id] ?? []; - } - - /** - * @return array - */ - public function getClassPropertyLocations(string $property_id): array - { - return self::$class_property_locations[$property_id] ?? []; - } - - /** - * @return array - */ - public function getClassLocations(string $fq_class_name_lc): array - { - return self::$class_locations[$fq_class_name_lc] ?? []; - } - - /** - * @param array> $references - * - */ - public function addMethodReferencesToClassMembers(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$method_references_to_class_members[$key])) { - self::$method_references_to_class_members[$key] = array_merge( - $reference, - self::$method_references_to_class_members[$key] - ); - } else { - self::$method_references_to_class_members[$key] = $reference; - } - } - } - - /** - * @param array> $references - * - */ - public function addMethodDependencies(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$method_dependencies[$key])) { - self::$method_dependencies[$key] = array_merge( - $reference, - self::$method_dependencies[$key] - ); - } else { - self::$method_dependencies[$key] = $reference; - } - } - } - - /** - * @param array> $references - * - */ - public function addMethodReferencesToClassProperties(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$method_references_to_class_properties[$key])) { - self::$method_references_to_class_properties[$key] = array_merge( - $reference, - self::$method_references_to_class_properties[$key] - ); - } else { - self::$method_references_to_class_properties[$key] = $reference; - } - } - } - - /** - * @param array> $references - * - */ - public function addMethodReferencesToMethodReturns(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$method_references_to_method_returns[$key])) { - self::$method_references_to_method_returns[$key] = array_merge( - $reference, - self::$method_references_to_method_returns[$key] - ); - } else { - self::$method_references_to_method_returns[$key] = $reference; - } - } - } - - /** - * @param array> $references - * - */ - public function addMethodReferencesToClasses(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$method_references_to_classes[$key])) { - self::$method_references_to_classes[$key] = array_merge( - $reference, - self::$method_references_to_classes[$key] - ); - } else { - self::$method_references_to_classes[$key] = $reference; - } - } - } - - /** - * @param array> $references - * - */ - public function addMethodReferencesToMissingClassMembers(array $references): void - { - foreach ($references as $key => $reference) { - if (isset(self::$method_references_to_missing_class_members[$key])) { - self::$method_references_to_missing_class_members[$key] = array_merge( - $reference, - self::$method_references_to_missing_class_members[$key] - ); - } else { - self::$method_references_to_missing_class_members[$key] = $reference; - } - } - } - - /** - * @param array>> $references - * - */ - public function addMethodParamUses(array $references): void - { - foreach ($references as $method_id => $method_param_uses) { - if (isset(self::$method_param_uses[$method_id])) { - foreach ($method_param_uses as $offset => $reference_map) { - if (isset(self::$method_param_uses[$method_id][$offset])) { - self::$method_param_uses[$method_id][$offset] = array_merge( - self::$method_param_uses[$method_id][$offset], - $reference_map - ); - } else { - self::$method_param_uses[$method_id][$offset] = $reference_map; - } - } - } else { - self::$method_param_uses[$method_id] = $method_param_uses; - } - } - } - - /** - * @param array> $references - * - */ - public function setCallingMethodReferencesToClasses(array $references): void - { - self::$method_references_to_classes = $references; - } - - /** - * @param array> $references - * - */ - public function setCallingMethodReferencesToClassMembers(array $references): void - { - self::$method_references_to_class_members = $references; - } - - /** - * @param array> $references - * - */ - public function setMethodDependencies(array $references): void - { - self::$method_dependencies = $references; - } - - /** - * @param array> $references - * - */ - public function setCallingMethodReferencesToClassProperties(array $references): void - { - self::$method_references_to_class_properties = $references; - } - - /** - * @param array> $references - * - */ - public function setCallingMethodReferencesToMethodReturns(array $references): void - { - self::$method_references_to_method_returns = $references; - } - - /** - * @param array> $references - * - */ - public function setCallingMethodReferencesToMissingClassMembers(array $references): void - { - self::$method_references_to_missing_class_members = $references; - } - - /** - * @param array> $references - * - */ - public function setFileReferencesToClassMembers(array $references): void - { - self::$file_references_to_class_members = $references; - } - - /** - * @param array> $references - * - */ - public function setFileReferencesToClassProperties(array $references): void - { - self::$file_references_to_class_properties = $references; - } - - /** - * @param array> $references - * - */ - public function setFileReferencesToMethodReturns(array $references): void - { - self::$file_references_to_method_returns = $references; - } - - /** - * @param array> $references - * - */ - public function setFileReferencesToMissingClassMembers(array $references): void - { - self::$file_references_to_missing_class_members = $references; - } - - /** - * @param array> $references - * - */ - public function setReferencesToMixedMemberNames(array $references): void - { - self::$references_to_mixed_member_names = $references; - } - - /** - * @param array>> $references - * - */ - public function setMethodParamUses(array $references): void - { - self::$method_param_uses = $references; - } - - /** - * @param array> $references - * - */ - public function addClassMethodLocations(array $references): void - { - foreach ($references as $referenced_member_id => $locations) { - if (isset(self::$class_method_locations[$referenced_member_id])) { - self::$class_method_locations[$referenced_member_id] = array_merge( - self::$class_method_locations[$referenced_member_id], - $locations - ); - } else { - self::$class_method_locations[$referenced_member_id] = $locations; - } - } - } - - /** - * @param array> $references - * - */ - public function addClassPropertyLocations(array $references): void - { - foreach ($references as $referenced_member_id => $locations) { - if (isset(self::$class_property_locations[$referenced_member_id])) { - self::$class_property_locations[$referenced_member_id] = array_merge( - self::$class_property_locations[$referenced_member_id], - $locations - ); - } else { - self::$class_property_locations[$referenced_member_id] = $locations; - } - } - } - - /** - * @param array> $references - * - */ - public function addClassLocations(array $references): void - { - foreach ($references as $referenced_member_id => $locations) { - if (isset(self::$class_locations[$referenced_member_id])) { - self::$class_locations[$referenced_member_id] = array_merge( - self::$class_locations[$referenced_member_id], - $locations - ); - } else { - self::$class_locations[$referenced_member_id] = $locations; - } - } - } - - /** - * @return array> - */ - public function getExistingIssues(): array - { - return self::$issues; - } - - public function clearExistingIssuesForFile(string $file_path): void - { - unset(self::$issues[$file_path]); - } - - public function clearExistingFileMapsForFile(string $file_path): void - { - unset(self::$file_maps[$file_path]); - } - - public function addIssue(string $file_path, IssueData $issue): void - { - // don’t save parse errors ever, as they're not responsive to AST diffing - if ($issue->type === 'ParseError') { - return; - } - - if (!isset(self::$issues[$file_path])) { - self::$issues[$file_path] = [$issue]; - } else { - self::$issues[$file_path][] = $issue; - } - } - - /** - * @param array> $analyzed_methods - * - */ - public function setAnalyzedMethods(array $analyzed_methods): void - { - self::$analyzed_methods = $analyzed_methods; - } - - /** - * @param array $file_maps - */ - public function setFileMaps(array $file_maps): void - { - self::$file_maps = $file_maps; - } - - /** - * @return array - */ - public function getTypeCoverage(): array - { - return self::$mixed_counts; - } - - /** - * @param array $mixed_counts - * - */ - public function setTypeCoverage(array $mixed_counts): void - { - self::$mixed_counts = array_merge(self::$mixed_counts, $mixed_counts); - } - - /** - * @return array> - */ - public function getAnalyzedMethods(): array - { - return self::$analyzed_methods; - } - - /** - * @return array - */ - public function getFileMaps(): array - { - return self::$file_maps; - } - - public static function clearCache(): void - { - self::$files_inheriting_classes = []; - self::$deleted_files = null; - self::$file_references = []; - self::$file_references_to_class_members = []; - self::$file_references_to_class_properties = []; - self::$file_references_to_method_returns = []; - self::$method_references_to_class_members = []; - self::$method_dependencies = []; - self::$method_references_to_class_properties = []; - self::$method_references_to_method_returns = []; - self::$method_references_to_classes = []; - self::$nonmethod_references_to_classes = []; - self::$file_references_to_missing_class_members = []; - self::$method_references_to_missing_class_members = []; - self::$references_to_mixed_member_names = []; - self::$class_method_locations = []; - self::$class_property_locations = []; - self::$class_locations = []; - self::$analyzed_methods = []; - self::$issues = []; - self::$file_maps = []; - self::$method_param_uses = []; - self::$classlike_files = []; - self::$mixed_counts = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php deleted file mode 100644 index d52b4165..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php +++ /dev/null @@ -1,184 +0,0 @@ -config = $config; - - $storage_dir = dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'Storage' . DIRECTORY_SEPARATOR; - - $dependent_files = [ - $storage_dir . 'FileStorage.php', - $storage_dir . 'FunctionLikeStorage.php', - $storage_dir . 'ClassLikeStorage.php', - $storage_dir . 'MethodStorage.php', - $storage_dir . 'FunctionLikeParameter.php', - ]; - - if ($config->eventDispatcher->hasAfterClassLikeVisitHandlers()) { - $dependent_files = array_merge($dependent_files, $config->plugin_paths); - } - - foreach ($dependent_files as $dependent_file_path) { - if (!file_exists($dependent_file_path)) { - throw new UnexpectedValueException($dependent_file_path . ' must exist'); - } - - $this->modified_timestamps .= ' ' . filemtime($dependent_file_path); - } - - $this->modified_timestamps .= $this->config->computeHash(); - } - - public function writeToCache(FileStorage $storage, string $file_contents): void - { - $file_path = strtolower($storage->file_path); - $cache_location = $this->getCacheLocationForPath($file_path, true); - $storage->hash = $this->getCacheHash($file_path, $file_contents); - - if ($this->config->use_igbinary) { - file_put_contents($cache_location, igbinary_serialize($storage)); - } else { - file_put_contents($cache_location, serialize($storage)); - } - } - - public function getLatestFromCache(string $file_path, string $file_contents): ?FileStorage - { - $file_path = strtolower($file_path); - $cached_value = $this->loadFromCache($file_path); - - if (!$cached_value) { - return null; - } - - $cache_hash = $this->getCacheHash($file_path, $file_contents); - - /** @psalm-suppress TypeDoesNotContainType */ - if (@get_class($cached_value) === '__PHP_Incomplete_Class' - || $cache_hash !== $cached_value->hash - ) { - $this->removeCacheForFile($file_path); - - return null; - } - - return $cached_value; - } - - public function removeCacheForFile(string $file_path): void - { - $cache_path = $this->getCacheLocationForPath($file_path); - - if (file_exists($cache_path)) { - unlink($cache_path); - } - } - - private function getCacheHash(string $_unused_file_path, string $file_contents): string - { - // do not concatenate, as $file_contents can be big and performance will be bad - // the timestamp is only needed if we don't have file contents - // as same contents should give same results, independent of when file was modified - $data = $file_contents ? $file_contents : $this->modified_timestamps; - return PHP_VERSION_ID >= 80100 ? hash('xxh128', $data) : hash('md4', $data); - } - - /** - * @psalm-suppress MixedAssignment - */ - private function loadFromCache(string $file_path): ?FileStorage - { - $cache_location = $this->getCacheLocationForPath($file_path); - - if (file_exists($cache_location)) { - if ($this->config->use_igbinary) { - $storage = igbinary_unserialize((string)file_get_contents($cache_location)); - - if ($storage instanceof FileStorage) { - return $storage; - } - - return null; - } - - $storage = unserialize((string)file_get_contents($cache_location)); - - if ($storage instanceof FileStorage) { - return $storage; - } - - return null; - } - - return null; - } - - private function getCacheLocationForPath(string $file_path, bool $create_directory = false): string - { - $root_cache_directory = $this->config->getCacheDirectory(); - - if (!$root_cache_directory) { - throw new UnexpectedValueException('No cache directory defined'); - } - - $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::FILE_STORAGE_CACHE_DIRECTORY; - - if ($create_directory && !is_dir($parser_cache_directory)) { - mkdir($parser_cache_directory, 0777, true); - } - - if (PHP_VERSION_ID >= 80100) { - $hash = hash('xxh128', $file_path); - } else { - $hash = hash('md4', $file_path); - } - - return $parser_cache_directory - . DIRECTORY_SEPARATOR - . $hash - . ($this->config->use_igbinary ? '-igbinary' : ''); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php deleted file mode 100644 index ff48840d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php +++ /dev/null @@ -1,131 +0,0 @@ - - */ - private static $storage = []; - - /** - * A list of data useful to analyse new files - * Storing this statically is much faster (at least in PHP 7.2.1) - * - * @var array - */ - private static $new_storage = []; - - /** - * @var ?FileStorageCacheProvider - */ - public $cache; - - public function __construct(?FileStorageCacheProvider $cache = null) - { - $this->cache = $cache; - } - - public function get(string $file_path): FileStorage - { - $file_path = strtolower($file_path); - - if (!isset(self::$storage[$file_path])) { - throw new InvalidArgumentException('Could not get file storage for ' . $file_path); - } - - return self::$storage[$file_path]; - } - - public function remove(string $file_path): void - { - unset(self::$storage[strtolower($file_path)]); - } - - public function has(string $file_path, ?string $file_contents = null): bool - { - $file_path = strtolower($file_path); - - if (isset(self::$storage[$file_path])) { - return true; - } - - if ($file_contents === null) { - return false; - } - - if (!$this->cache) { - return false; - } - - $cached_value = $this->cache->getLatestFromCache($file_path, $file_contents); - - if (!$cached_value) { - return false; - } - - self::$storage[$file_path] = $cached_value; - self::$new_storage[$file_path] = $cached_value; - - return true; - } - - /** - * @return array - */ - public function getAll(): array - { - return self::$storage; - } - - /** - * @return array - */ - public function getNew(): array - { - return self::$new_storage; - } - - /** - * @param array $more - */ - public function addMore(array $more): void - { - self::$new_storage = array_merge(self::$new_storage, $more); - self::$storage = array_merge(self::$storage, $more); - } - - public function create(string $file_path): FileStorage - { - $file_path_lc = strtolower($file_path); - - $storage = new FileStorage($file_path); - self::$storage[$file_path_lc] = $storage; - self::$new_storage[$file_path_lc] = $storage; - - return $storage; - } - - public static function deleteAll(): void - { - self::$storage = []; - } - - public static function populated(): void - { - self::$new_storage = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php deleted file mode 100644 index 57c4a8c4..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php +++ /dev/null @@ -1,117 +0,0 @@ - - * > - */ - private static $handlers = []; - - /** - * @var array< - * lowercase-string, - * array - * > - */ - private static $legacy_handlers = []; - - public function __construct() - { - self::$handlers = []; - self::$legacy_handlers = []; - } - - /** - * @param class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyFunctionExistenceProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'doesFunctionExist']); - - foreach ($class::getFunctionIds() as $function_id) { - $this->registerLegacyClosure($function_id, $callable); - } - } elseif (is_subclass_of($class, FunctionExistenceProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'doesFunctionExist']); - - foreach ($class::getFunctionIds() as $function_id) { - $this->registerClosure($function_id, $callable); - } - } - } - - /** - * @param lowercase-string $function_id - * @param Closure(FunctionExistenceProviderEvent): ?bool $c - */ - public function registerClosure(string $function_id, Closure $c): void - { - self::$handlers[$function_id][] = $c; - } - - /** - * @param lowercase-string $function_id - * @param Closure( - * StatementsSource, - * string - * ): ?bool $c - */ - public function registerLegacyClosure(string $function_id, Closure $c): void - { - self::$legacy_handlers[$function_id][] = $c; - } - - public function has(string $function_id): bool - { - return isset(self::$handlers[strtolower($function_id)]) || - isset(self::$legacy_handlers[strtolower($function_id)]); - } - - public function doesFunctionExist( - StatementsSource $statements_source, - string $function_id - ): ?bool { - foreach (self::$legacy_handlers[strtolower($function_id)] ?? [] as $function_handler) { - $function_exists = $function_handler( - $statements_source, - $function_id - ); - - if ($function_exists !== null) { - return $function_exists; - } - } - - foreach (self::$handlers[strtolower($function_id)] ?? [] as $function_handler) { - $event = new FunctionExistenceProviderEvent( - $statements_source, - $function_id - ); - $function_exists = $function_handler($event); - - if ($function_exists !== null) { - return $function_exists; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php deleted file mode 100644 index d6b70c4b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php +++ /dev/null @@ -1,139 +0,0 @@ -> - * > - */ - private static $handlers = []; - - /** - * @var array< - * lowercase-string, - * array, - * ?Context=, - * ?CodeLocation= - * ): ?array> - * > - */ - private static $legacy_handlers = []; - - public function __construct() - { - self::$handlers = []; - self::$legacy_handlers = []; - } - - /** - * @param class-string|class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyFunctionParamsProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'getFunctionParams']); - - foreach ($class::getFunctionIds() as $function_id) { - $this->registerLegacyClosure($function_id, $callable); - } - } elseif (is_subclass_of($class, FunctionParamsProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'getFunctionParams']); - - foreach ($class::getFunctionIds() as $function_id) { - $this->registerClosure($function_id, $callable); - } - } - } - - /** - * @param Closure(FunctionParamsProviderEvent): ?array $c - */ - public function registerClosure(string $fq_classlike_name, Closure $c): void - { - self::$handlers[strtolower($fq_classlike_name)][] = $c; - } - - /** - * @param Closure( - * StatementsSource, - * string, - * list, - * ?Context=, - * ?CodeLocation= - * ): ?array $c - */ - public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void - { - self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; - } - - public function has(string $fq_classlike_name): bool - { - return isset(self::$handlers[strtolower($fq_classlike_name)]) || - isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); - } - - /** - * @param list $call_args - * - * @return ?array - */ - public function getFunctionParams( - StatementsSource $statements_source, - string $function_id, - array $call_args, - ?Context $context = null, - ?CodeLocation $code_location = null - ): ?array { - foreach (self::$handlers[strtolower($function_id)] ?? [] as $class_handler) { - $event = new FunctionParamsProviderEvent( - $statements_source, - $function_id, - $call_args, - $context, - $code_location - ); - $result = $class_handler($event); - - if ($result) { - return $result; - } - } - - foreach (self::$legacy_handlers[strtolower($function_id)] ?? [] as $class_handler) { - $result = $class_handler( - $statements_source, - $function_id, - $call_args, - $context, - $code_location - ); - - if ($result) { - return $result; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php deleted file mode 100644 index 8b124ea5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php +++ /dev/null @@ -1,205 +0,0 @@ - - * > - */ - private static $handlers = []; - - /** - * @var array< - * lowercase-string, - * array, - * Context, - * CodeLocation - * ): ?Union> - * > - */ - private static $legacy_handlers = []; - - public function __construct() - { - self::$handlers = []; - self::$legacy_handlers = []; - - $this->registerClass(ArrayChunkReturnTypeProvider::class); - $this->registerClass(ArrayColumnReturnTypeProvider::class); - $this->registerClass(ArrayFilterReturnTypeProvider::class); - $this->registerClass(ArrayMapReturnTypeProvider::class); - $this->registerClass(ArrayMergeReturnTypeProvider::class); - $this->registerClass(ArrayPadReturnTypeProvider::class); - $this->registerClass(ArrayPointerAdjustmentReturnTypeProvider::class); - $this->registerClass(ArrayPopReturnTypeProvider::class); - $this->registerClass(ArrayRandReturnTypeProvider::class); - $this->registerClass(ArrayReduceReturnTypeProvider::class); - $this->registerClass(ArraySliceReturnTypeProvider::class); - $this->registerClass(ArraySpliceReturnTypeProvider::class); - $this->registerClass(ArrayReverseReturnTypeProvider::class); - $this->registerClass(ArrayUniqueReturnTypeProvider::class); - $this->registerClass(ArrayValuesReturnTypeProvider::class); - $this->registerClass(ArrayFillReturnTypeProvider::class); - $this->registerClass(FilterVarReturnTypeProvider::class); - $this->registerClass(IteratorToArrayReturnTypeProvider::class); - $this->registerClass(ParseUrlReturnTypeProvider::class); - $this->registerClass(StrReplaceReturnTypeProvider::class); - $this->registerClass(StrTrReturnTypeProvider::class); - $this->registerClass(VersionCompareReturnTypeProvider::class); - $this->registerClass(MktimeReturnTypeProvider::class); - $this->registerClass(ExplodeReturnTypeProvider::class); - $this->registerClass(GetObjectVarsReturnTypeProvider::class); - $this->registerClass(GetClassMethodsReturnTypeProvider::class); - $this->registerClass(FirstArgStringReturnTypeProvider::class); - $this->registerClass(HexdecReturnTypeProvider::class); - $this->registerClass(MinMaxReturnTypeProvider::class); - $this->registerClass(TriggerErrorReturnTypeProvider::class); - $this->registerClass(RandReturnTypeProvider::class); - $this->registerClass(InArrayReturnTypeProvider::class); - } - - /** - * @param class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyFunctionReturnTypeProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'getFunctionReturnType']); - - foreach ($class::getFunctionIds() as $function_id) { - $this->registerLegacyClosure($function_id, $callable); - } - } elseif (is_subclass_of($class, FunctionReturnTypeProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'getFunctionReturnType']); - - foreach ($class::getFunctionIds() as $function_id) { - $this->registerClosure($function_id, $callable); - } - } - } - - /** - * @param lowercase-string $function_id - * @param Closure(FunctionReturnTypeProviderEvent): ?Union $c - */ - public function registerClosure(string $function_id, Closure $c): void - { - self::$handlers[$function_id][] = $c; - } - - /** - * @param lowercase-string $function_id - * @param Closure( - * StatementsSource, - * non-empty-string, - * list, - * Context, - * CodeLocation - * ): ?Union $c - */ - public function registerLegacyClosure(string $function_id, Closure $c): void - { - self::$legacy_handlers[$function_id][] = $c; - } - - public function has(string $function_id): bool - { - return isset(self::$handlers[strtolower($function_id)]) || - isset(self::$legacy_handlers[strtolower($function_id)]); - } - - /** - * @param non-empty-string $function_id - */ - public function getReturnType( - StatementsSource $statements_source, - string $function_id, - PhpParser\Node\Expr\FuncCall $stmt, - Context $context, - CodeLocation $code_location - ): ?Union { - foreach (self::$legacy_handlers[strtolower($function_id)] ?? [] as $function_handler) { - $return_type = $function_handler( - $statements_source, - $function_id, - $stmt->getArgs(), - $context, - $code_location - ); - - if ($return_type) { - return $return_type; - } - } - - foreach (self::$handlers[strtolower($function_id)] ?? [] as $function_handler) { - $event = new FunctionReturnTypeProviderEvent( - $statements_source, - $function_id, - $stmt, - $context, - $code_location - ); - $return_type = $function_handler($event); - - if ($return_type) { - return $return_type; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php deleted file mode 100644 index 0f637728..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php +++ /dev/null @@ -1,126 +0,0 @@ - - * > - */ - private static $handlers = []; - - /** - * @var array< - * lowercase-string, - * array - * > - */ - private static $legacy_handlers = []; - - public function __construct() - { - self::$handlers = []; - self::$legacy_handlers = []; - } - - /** - * @param class-string|class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyMethodExistenceProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'doesMethodExist']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerLegacyClosure($fq_classlike_name, $callable); - } - } elseif (is_subclass_of($class, MethodExistenceProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'doesMethodExist']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerClosure($fq_classlike_name, $callable); - } - } - } - - /** - * @param Closure(MethodExistenceProviderEvent): ?bool $c - */ - public function registerClosure(string $fq_classlike_name, Closure $c): void - { - self::$handlers[strtolower($fq_classlike_name)][] = $c; - } - - /** - * @param Closure( - * string, - * string, - * ?StatementsSource=, - * ?CodeLocation - * ): ?bool $c - */ - public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void - { - self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; - } - - public function has(string $fq_classlike_name): bool - { - return isset(self::$handlers[strtolower($fq_classlike_name)]) || - isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); - } - - public function doesMethodExist( - string $fq_classlike_name, - string $method_name_lowercase, - ?StatementsSource $source = null, - ?CodeLocation $code_location = null - ): ?bool { - foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $method_handler) { - $method_exists = $method_handler( - $fq_classlike_name, - $method_name_lowercase, - $source, - $code_location - ); - - if ($method_exists !== null) { - return $method_exists; - } - } - - foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $method_handler) { - $event = new MethodExistenceProviderEvent( - $fq_classlike_name, - $method_name_lowercase, - $source, - $code_location - ); - $method_exists = $method_handler($event); - - if ($method_exists !== null) { - return $method_exists; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php deleted file mode 100644 index 0033a1ee..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php +++ /dev/null @@ -1,148 +0,0 @@ -> - * > - */ - private static $handlers = []; - - /** - * @var array< - * lowercase-string, - * array=, - * ?StatementsSource=, - * ?Context=, - * ?CodeLocation= - * ): ?array> - * > - */ - private static $legacy_handlers = []; - - public function __construct() - { - self::$handlers = []; - self::$legacy_handlers = []; - - $this->registerClass(PdoStatementSetFetchMode::class); - } - - /** - * @param class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyMethodParamsProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'getMethodParams']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerLegacyClosure($fq_classlike_name, $callable); - } - } elseif (is_subclass_of($class, MethodParamsProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'getMethodParams']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerClosure($fq_classlike_name, $callable); - } - } - } - - /** - * @param Closure(MethodParamsProviderEvent): ?array $c - */ - public function registerClosure(string $fq_classlike_name, Closure $c): void - { - self::$handlers[strtolower($fq_classlike_name)][] = $c; - } - - /** - * @param Closure( - * string, - * string, - * ?list=, - * ?StatementsSource=, - * ?Context=, - * ?CodeLocation= - * ): ?array $c - */ - public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void - { - self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; - } - - public function has(string $fq_classlike_name): bool - { - return isset(self::$handlers[strtolower($fq_classlike_name)]) || - isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); - } - - /** - * @param ?list $call_args - * - * @return ?list - */ - public function getMethodParams( - string $fq_classlike_name, - string $method_name_lowercase, - ?array $call_args = null, - ?StatementsSource $statements_source = null, - ?Context $context = null, - ?CodeLocation $code_location = null - ): ?array { - foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $class_handler) { - $result = $class_handler( - $fq_classlike_name, - $method_name_lowercase, - $call_args, - $statements_source, - $context, - $code_location - ); - - if ($result !== null) { - return array_values($result); - } - } - - foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $class_handler) { - $event = new MethodParamsProviderEvent( - $fq_classlike_name, - $method_name_lowercase, - $call_args, - $statements_source, - $context, - $code_location - ); - $result = $class_handler($event); - - if ($result !== null) { - return array_values($result); - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php deleted file mode 100644 index f29dc77d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php +++ /dev/null @@ -1,170 +0,0 @@ - - * > - */ - private static $handlers = []; - - /** - * @var array< - * lowercase-string, - * array, - * Context, - * CodeLocation, - * ?array=, - * ?string=, - * ?lowercase-string= - * ): ?Union> - * > - */ - private static $legacy_handlers = []; - - public function __construct() - { - self::$handlers = []; - self::$legacy_handlers = []; - - $this->registerClass(DomNodeAppendChild::class); - $this->registerClass(ImagickPixelColorReturnTypeProvider::class); - $this->registerClass(SimpleXmlElementAsXml::class); - $this->registerClass(PdoStatementReturnTypeProvider::class); - $this->registerClass(ClosureFromCallableReturnTypeProvider::class); - } - - /** - * @param class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyMethodReturnTypeProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'getMethodReturnType']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerLegacyClosure($fq_classlike_name, $callable); - } - } elseif (is_subclass_of($class, MethodReturnTypeProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'getMethodReturnType']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerClosure($fq_classlike_name, $callable); - } - } - } - - /** - * @param Closure(MethodReturnTypeProviderEvent): ?Union $c - */ - public function registerClosure(string $fq_classlike_name, Closure $c): void - { - self::$handlers[strtolower($fq_classlike_name)][] = $c; - } - - /** - * @param Closure( - * StatementsSource, - * string, - * lowercase-string, - * list, - * Context, - * CodeLocation, - * ?array=, - * ?string=, - * ?lowercase-string= - * ): ?Union $c - * - */ - public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void - { - self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; - } - - public function has(string $fq_classlike_name): bool - { - return isset(self::$handlers[strtolower($fq_classlike_name)]) || - isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); - } - - /** - * @param PhpParser\Node\Expr\MethodCall|PhpParser\Node\Expr\StaticCall $stmt - * @param ?array $template_type_parameters - */ - public function getReturnType( - StatementsSource $statements_source, - string $fq_classlike_name, - string $method_name, - $stmt, - Context $context, - CodeLocation $code_location, - ?array $template_type_parameters = null, - ?string $called_fq_classlike_name = null, - ?string $called_method_name = null - ): ?Union { - foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $class_handler) { - $result = $class_handler( - $statements_source, - $fq_classlike_name, - strtolower($method_name), - $stmt->getArgs(), - $context, - $code_location, - $template_type_parameters, - $called_fq_classlike_name, - $called_method_name ? strtolower($called_method_name) : null - ); - - if ($result) { - return $result; - } - } - - foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $class_handler) { - $event = new MethodReturnTypeProviderEvent( - $statements_source, - $fq_classlike_name, - strtolower($method_name), - $stmt, - $context, - $code_location, - $template_type_parameters, - $called_fq_classlike_name, - $called_method_name ? strtolower($called_method_name) : null - ); - $result = $class_handler($event); - - if ($result) { - return $result; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php deleted file mode 100644 index e9a876bc..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php +++ /dev/null @@ -1,133 +0,0 @@ - - * > - */ - private static $handlers = []; - - /** - * @var array< - * lowercase-string, - * array - * > - */ - private static $legacy_handlers = []; - - public function __construct() - { - self::$handlers = []; - self::$legacy_handlers = []; - } - - /** - * @param class-string - * |class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyMethodVisibilityProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'isMethodVisible']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerLegacyClosure($fq_classlike_name, $callable); - } - } elseif (is_subclass_of($class, MethodVisibilityProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'isMethodVisible']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerClosure($fq_classlike_name, $callable); - } - } - } - - /** - * @param Closure(MethodVisibilityProviderEvent): ?bool $c - */ - public function registerClosure(string $fq_classlike_name, Closure $c): void - { - self::$handlers[strtolower($fq_classlike_name)][] = $c; - } - - /** - * @param Closure( - * StatementsSource, - * string, - * string, - * Context, - * ?CodeLocation - * ): ?bool $c - */ - public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void - { - self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; - } - - public function has(string $fq_classlike_name): bool - { - return isset(self::$handlers[strtolower($fq_classlike_name)]) || - isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); - } - - public function isMethodVisible( - StatementsSource $source, - string $fq_classlike_name, - string $method_name, - Context $context, - ?CodeLocation $code_location = null - ): ?bool { - foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $method_handler) { - $method_visible = $method_handler( - $source, - $fq_classlike_name, - $method_name, - $context, - $code_location - ); - - if ($method_visible !== null) { - return $method_visible; - } - } - - foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $method_handler) { - $event = new MethodVisibilityProviderEvent( - $source, - $fq_classlike_name, - $method_name, - $context, - $code_location - ); - $method_visible = $method_handler($event); - - if ($method_visible !== null) { - return $method_visible; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php deleted file mode 100644 index 3987a231..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php +++ /dev/null @@ -1,133 +0,0 @@ - */ - private $node_types; - - /** - * @var SplObjectStorage>>>|null> - */ - private $node_assertions; - - /** @var SplObjectStorage> */ - private $node_if_true_assertions; - - /** @var SplObjectStorage> */ - private $node_if_false_assertions; - - /** @var bool */ - public $cache_assertions = true; - - public function __construct() - { - $this->node_types = new SplObjectStorage(); - $this->node_assertions = new SplObjectStorage(); - $this->node_if_true_assertions = new SplObjectStorage(); - $this->node_if_false_assertions = new SplObjectStorage(); - } - - /** - * @param Expr|Name|Return_ $node - */ - public function setType(NodeAbstract $node, Union $type): void - { - $this->node_types[$node] = $type; - } - - /** - * @param Expr|Name|Return_ $node - */ - public function getType(NodeAbstract $node): ?Union - { - return $this->node_types[$node] ?? null; - } - - /** - * @param list>>>|null $assertions - */ - public function setAssertions(Expr $node, ?array $assertions): void - { - if (!$this->cache_assertions) { - return; - } - - $this->node_assertions[$node] = $assertions; - } - - /** - * @return list>>>|null - */ - public function getAssertions(Expr $node): ?array - { - if (!$this->cache_assertions) { - return null; - } - - return $this->node_assertions[$node] ?? null; - } - - /** - * @param FuncCall|MethodCall|StaticCall|New_ $node - * @param array $assertions - */ - public function setIfTrueAssertions(Expr $node, array $assertions): void - { - $this->node_if_true_assertions[$node] = $assertions; - } - - /** - * @param Expr\FuncCall|MethodCall|StaticCall|New_ $node - * @return array|null - */ - public function getIfTrueAssertions(Expr $node): ?array - { - return $this->node_if_true_assertions[$node] ?? null; - } - - /** - * @param FuncCall|MethodCall|StaticCall|New_ $node - * @param array $assertions - */ - public function setIfFalseAssertions(Expr $node, array $assertions): void - { - $this->node_if_false_assertions[$node] = $assertions; - } - - /** - * @param FuncCall|MethodCall|StaticCall|New_ $node - * @return array|null - */ - public function getIfFalseAssertions(Expr $node): ?array - { - return $this->node_if_false_assertions[$node] ?? null; - } - - public function isPureCompatible(Expr $node): bool - { - $node_type = $this->getType($node); - - return ($node_type && $node_type->reference_free) || $node->getAttribute('pure', false); - } - - public function clearNodeOfTypeAndAssertions(Expr $node): void - { - unset($this->node_types[$node], $this->node_assertions[$node]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php deleted file mode 100644 index a8f053f0..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php +++ /dev/null @@ -1,399 +0,0 @@ -|null - */ - private $existing_file_content_hashes; - - /** - * A map of recently-added filename hashes to contents hashes - * - * @var array - */ - private $new_file_content_hashes = []; - - /** - * @var bool - */ - private $use_file_cache; - - /** @var bool */ - private $use_igbinary; - - public function __construct(Config $config, bool $use_file_cache = true) - { - $this->use_igbinary = $config->use_igbinary; - $this->use_file_cache = $use_file_cache; - } - - /** - * @return list|null - */ - public function loadStatementsFromCache( - string $file_path, - int $file_modified_time, - string $file_content_hash - ): ?array { - $root_cache_directory = Config::getInstance()->getCacheDirectory(); - - if (!$root_cache_directory) { - return null; - } - - $file_cache_key = $this->getParserCacheKey( - $file_path - ); - - $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::PARSER_CACHE_DIRECTORY; - - $file_content_hashes = $this->new_file_content_hashes + $this->getExistingFileContentHashes(); - - $cache_location = $parser_cache_directory . DIRECTORY_SEPARATOR . $file_cache_key; - - if (isset($file_content_hashes[$file_cache_key]) - && $file_content_hash === $file_content_hashes[$file_cache_key] - && is_readable($cache_location) - && filemtime($cache_location) > $file_modified_time - ) { - if ($this->use_igbinary) { - /** @var list */ - $stmts = igbinary_unserialize((string)file_get_contents($cache_location)); - } else { - /** @var list */ - $stmts = unserialize((string)file_get_contents($cache_location)); - } - - return $stmts; - } - - return null; - } - - /** - * @return list|null - */ - public function loadExistingStatementsFromCache(string $file_path): ?array - { - $root_cache_directory = Config::getInstance()->getCacheDirectory(); - - if (!$root_cache_directory) { - return null; - } - - $file_cache_key = $this->getParserCacheKey( - $file_path - ); - - $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::PARSER_CACHE_DIRECTORY; - - $cache_location = $parser_cache_directory . DIRECTORY_SEPARATOR . $file_cache_key; - - if (is_readable($cache_location)) { - if ($this->use_igbinary) { - /** @var list */ - return igbinary_unserialize((string)file_get_contents($cache_location)) ?: null; - } - - /** @var list */ - return unserialize((string)file_get_contents($cache_location)) ?: null; - } - - return null; - } - - public function loadExistingFileContentsFromCache(string $file_path): ?string - { - if (!$this->use_file_cache) { - return null; - } - - $root_cache_directory = Config::getInstance()->getCacheDirectory(); - - if (!$root_cache_directory) { - return null; - } - - $file_cache_key = $this->getParserCacheKey( - $file_path - ); - - $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::FILE_CONTENTS_CACHE_DIRECTORY; - - $cache_location = $parser_cache_directory . DIRECTORY_SEPARATOR . $file_cache_key; - - if (is_readable($cache_location)) { - return file_get_contents($cache_location); - } - - return null; - } - - /** - * @return array - */ - private function getExistingFileContentHashes(): array - { - $config = Config::getInstance(); - $root_cache_directory = $config->getCacheDirectory(); - - if ($this->existing_file_content_hashes === null) { - $file_hashes_path = $root_cache_directory . DIRECTORY_SEPARATOR . self::FILE_HASHES; - - if ($root_cache_directory && is_readable($file_hashes_path)) { - $fp = fopen($file_hashes_path, 'r'); - $max_wait_cycles = 5; - $has_lock = false; - while ($max_wait_cycles > 0) { - if (flock($fp, LOCK_SH)) { - $has_lock = true; - break; - } - $max_wait_cycles--; - usleep(50000); - } - - if (!$has_lock) { - fclose($fp); - error_log('Could not acquire lock for content hashes file'); - $this->existing_file_content_hashes = []; - - return []; - } - - $hashes_encoded = fread($fp, filesize($file_hashes_path)); - fclose($fp); - - if (!$hashes_encoded) { - error_log('Unexpected value when loading from file content hashes'); - $this->existing_file_content_hashes = []; - - return []; - } - - $hashes_decoded = json_decode($hashes_encoded, true); - - if (!is_array($hashes_decoded)) { - error_log('Unexpected value ' . gettype($hashes_decoded)); - $this->existing_file_content_hashes = []; - - return []; - } - - /** @var array $hashes_decoded */ - $this->existing_file_content_hashes = $hashes_decoded; - } else { - $this->existing_file_content_hashes = []; - } - } - - return $this->existing_file_content_hashes; - } - - /** - * @param list $stmts - */ - public function saveStatementsToCache( - string $file_path, - string $file_content_hash, - array $stmts, - bool $touch_only - ): void { - $root_cache_directory = Config::getInstance()->getCacheDirectory(); - - if (!$root_cache_directory) { - return; - } - - $file_cache_key = $this->getParserCacheKey( - $file_path - ); - - $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::PARSER_CACHE_DIRECTORY; - - $cache_location = $parser_cache_directory . DIRECTORY_SEPARATOR . $file_cache_key; - - if ($touch_only) { - touch($cache_location); - } else { - $this->createCacheDirectory($parser_cache_directory); - - if ($this->use_igbinary) { - file_put_contents($cache_location, igbinary_serialize($stmts)); - } else { - file_put_contents($cache_location, serialize($stmts)); - } - - $this->new_file_content_hashes[$file_cache_key] = $file_content_hash; - } - } - - /** - * @return array - */ - public function getNewFileContentHashes(): array - { - return $this->new_file_content_hashes; - } - - /** - * @param array $file_content_hashes - * - */ - public function addNewFileContentHashes(array $file_content_hashes): void - { - $this->new_file_content_hashes = $file_content_hashes + $this->new_file_content_hashes; - } - - public function saveFileContentHashes(): void - { - $root_cache_directory = Config::getInstance()->getCacheDirectory(); - - if (!$root_cache_directory) { - return; - } - - // directory was removed - // most likely due to a race condition with other psalm instances that were manually started at the same time - clearstatcache(true, $root_cache_directory); - if (!is_dir($root_cache_directory)) { - return; - } - - $file_content_hashes = $this->new_file_content_hashes + $this->getExistingFileContentHashes(); - - $file_hashes_path = $root_cache_directory . DIRECTORY_SEPARATOR . self::FILE_HASHES; - - file_put_contents( - $file_hashes_path, - json_encode($file_content_hashes), - LOCK_EX - ); - } - - public function cacheFileContents(string $file_path, string $file_contents): void - { - if (!$this->use_file_cache) { - return; - } - - $root_cache_directory = Config::getInstance()->getCacheDirectory(); - - if (!$root_cache_directory) { - return; - } - - $file_cache_key = $this->getParserCacheKey( - $file_path - ); - - $parser_cache_directory = $root_cache_directory . DIRECTORY_SEPARATOR . self::FILE_CONTENTS_CACHE_DIRECTORY; - - $cache_location = $parser_cache_directory . DIRECTORY_SEPARATOR . $file_cache_key; - - $this->createCacheDirectory($parser_cache_directory); - - file_put_contents($cache_location, $file_contents); - } - - public function deleteOldParserCaches(float $time_before): int - { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - if (!$cache_directory) { - return 0; - } - - $removed_count = 0; - - $cache_directory .= DIRECTORY_SEPARATOR . self::PARSER_CACHE_DIRECTORY; - - if (is_dir($cache_directory)) { - $directory_files = scandir($cache_directory, SCANDIR_SORT_NONE); - - foreach ($directory_files as $directory_file) { - $full_path = $cache_directory . DIRECTORY_SEPARATOR . $directory_file; - - if ($directory_file[0] === '.') { - continue; - } - - if (filemtime($full_path) < $time_before && is_writable($full_path)) { - unlink($full_path); - ++$removed_count; - } - } - } - - return $removed_count; - } - - private function getParserCacheKey(string $file_name): string - { - return md5($file_name) . ($this->use_igbinary ? '-igbinary' : '') . '-r'; - } - - private function createCacheDirectory(string $parser_cache_directory): void - { - if (!is_dir($parser_cache_directory)) { - try { - mkdir($parser_cache_directory, 0777, true); - } catch (RuntimeException $e) { - // Race condition (#4483) - if (!is_dir($parser_cache_directory)) { - error_log('Could not create parser cache directory: ' . $parser_cache_directory); - } - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php deleted file mode 100644 index 57755770..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php +++ /dev/null @@ -1,141 +0,0 @@ -composer_lock_location = $composer_lock_location; - } - - public function canDiffFiles(): bool - { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - return $cache_directory && file_exists($cache_directory . DIRECTORY_SEPARATOR . self::GOOD_RUN_NAME); - } - - public function processSuccessfulRun(float $start_time, string $psalm_version): void - { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - if (!$cache_directory) { - return; - } - - $run_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::GOOD_RUN_NAME; - - file_put_contents($run_cache_location, $psalm_version); - - touch($run_cache_location, (int)$start_time); - } - - public function getLastRun(string $psalm_version): int - { - if ($this->last_run === null) { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - $run_cache_location = $cache_directory . DIRECTORY_SEPARATOR . self::GOOD_RUN_NAME; - - if (file_exists($run_cache_location) && file_get_contents($run_cache_location) === $psalm_version) { - $this->last_run = filemtime($run_cache_location); - } else { - $this->last_run = 0; - } - } - - return $this->last_run; - } - - public function hasLockfileChanged(): bool - { - if (!file_exists($this->composer_lock_location)) { - return true; - } - - $lockfile_contents = file_get_contents($this->composer_lock_location); - - if (!$lockfile_contents) { - return true; - } - - if (PHP_VERSION_ID >= 80100) { - $hash = hash('xxh128', $lockfile_contents); - } else { - $hash = hash('md4', $lockfile_contents); - } - - $changed = $hash !== $this->getComposerLockHash(); - - $this->composer_lock_hash = $hash; - - return $changed; - } - - public function updateComposerLockHash(): void - { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - if (!$cache_directory || !$this->composer_lock_hash) { - return; - } - - if (!file_exists($cache_directory)) { - mkdir($cache_directory, 0777, true); - } - - $lock_hash_location = $cache_directory . DIRECTORY_SEPARATOR . self::COMPOSER_LOCK_HASH; - - file_put_contents($lock_hash_location, $this->composer_lock_hash); - } - - protected function getComposerLockHash(): string - { - if ($this->composer_lock_hash === null) { - $cache_directory = Config::getInstance()->getCacheDirectory(); - - $lock_hash_location = $cache_directory . DIRECTORY_SEPARATOR . self::COMPOSER_LOCK_HASH; - - if (file_exists($lock_hash_location)) { - $this->composer_lock_hash = file_get_contents($lock_hash_location) ?: ''; - } else { - $this->composer_lock_hash = ''; - } - } - - return $this->composer_lock_hash; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php deleted file mode 100644 index 6af68fef..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php +++ /dev/null @@ -1,138 +0,0 @@ - - * > - */ - private static $handlers = []; - - /** - * @var array< - * lowercase-string, - * array - * > - */ - private static $legacy_handlers = []; - - public function __construct() - { - self::$handlers = []; - self::$legacy_handlers = []; - } - - /** - * @param class-string - * |class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyPropertyExistenceProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'doesPropertyExist']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerLegacyClosure($fq_classlike_name, $callable); - } - } elseif (is_subclass_of($class, PropertyExistenceProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'doesPropertyExist']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerClosure($fq_classlike_name, $callable); - } - } - } - - /** - * @param Closure(PropertyExistenceProviderEvent): ?bool $c - */ - public function registerClosure(string $fq_classlike_name, Closure $c): void - { - self::$handlers[strtolower($fq_classlike_name)][] = $c; - } - - /** - * @param Closure( - * string, - * string, - * bool, - * ?StatementsSource=, - * ?Context=, - * ?CodeLocation= - * ): ?bool $c - */ - public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void - { - self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; - } - - public function has(string $fq_classlike_name): bool - { - return isset(self::$handlers[strtolower($fq_classlike_name)]) || - isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); - } - - public function doesPropertyExist( - string $fq_classlike_name, - string $property_name, - bool $read_mode, - ?StatementsSource $source = null, - ?Context $context = null, - ?CodeLocation $code_location = null - ): ?bool { - foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { - $property_exists = $property_handler( - $fq_classlike_name, - $property_name, - $read_mode, - $source, - $context, - $code_location - ); - - if ($property_exists !== null) { - return $property_exists; - } - } - - foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { - $event = new PropertyExistenceProviderEvent( - $fq_classlike_name, - $property_name, - $read_mode, - $source, - $context, - $code_location - ); - $property_exists = $property_handler($event); - - if ($property_exists !== null) { - return $property_exists; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php deleted file mode 100644 index 2e3d1dbe..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php +++ /dev/null @@ -1,140 +0,0 @@ - - * > - */ - private static $handlers = []; - - /** - * @var array< - * lowercase-string, - * array - * > - */ - private static $legacy_handlers = []; - - public function __construct() - { - self::$handlers = []; - self::$legacy_handlers = []; - - $this->registerClass(DomDocumentPropertyTypeProvider::class); - } - - /** - * @param class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyPropertyTypeProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'getPropertyType']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerLegacyClosure($fq_classlike_name, $callable); - } - } elseif (is_subclass_of($class, PropertyTypeProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'getPropertyType']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerClosure($fq_classlike_name, $callable); - } - } - } - - /** - * @param Closure(PropertyTypeProviderEvent): ?Union $c - */ - public function registerClosure(string $fq_classlike_name, Closure $c): void - { - self::$handlers[strtolower($fq_classlike_name)][] = $c; - } - - /** - * @param Closure( - * string, - * string, - * bool, - * ?StatementsSource=, - * ?Context= - * ): ?Union $c - */ - public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void - { - self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; - } - - public function has(string $fq_classlike_name): bool - { - return isset(self::$handlers[strtolower($fq_classlike_name)]) || - isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); - } - - public function getPropertyType( - string $fq_classlike_name, - string $property_name, - bool $read_mode, - ?StatementsSource $source = null, - ?Context $context = null - ): ?Union { - - if ($source) { - $source->addSuppressedIssues(['NonInvariantDocblockPropertyType']); - } - - foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { - $property_type = $property_handler( - $fq_classlike_name, - $property_name, - $read_mode, - $source, - $context - ); - - if ($property_type !== null) { - return $property_type; - } - } - - foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { - $event = new PropertyTypeProviderEvent( - $fq_classlike_name, - $property_name, - $read_mode, - $source, - $context - ); - $property_type = $property_handler($event); - - if ($property_type !== null) { - return $property_type; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php deleted file mode 100644 index 2b127672..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php +++ /dev/null @@ -1,33 +0,0 @@ -getPropertyName()) === 'documentelement') { - $type = new Union([new TNamedObject('DOMElement'), new TNull()]); - $type->ignore_nullable_issues = true; - - return $type; - } - - return null; - } - - public static function getClassLikeNames(): array - { - return ['domdocument']; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php deleted file mode 100644 index 4ad57941..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php +++ /dev/null @@ -1,138 +0,0 @@ - - * > - */ - private static $handlers = []; - - /** - * @var array< - * lowercase-string, - * array - * > - */ - private static $legacy_handlers = []; - - public function __construct() - { - self::$handlers = []; - self::$legacy_handlers = []; - } - - /** - * @param class-string - * |class-string $class - */ - public function registerClass(string $class): void - { - if (is_subclass_of($class, LegacyPropertyVisibilityProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'isPropertyVisible']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerLegacyClosure($fq_classlike_name, $callable); - } - } elseif (is_subclass_of($class, PropertyVisibilityProviderInterface::class, true)) { - $callable = Closure::fromCallable([$class, 'isPropertyVisible']); - - foreach ($class::getClassLikeNames() as $fq_classlike_name) { - $this->registerClosure($fq_classlike_name, $callable); - } - } - } - - /** - * @param Closure(PropertyVisibilityProviderEvent): ?bool $c - */ - public function registerClosure(string $fq_classlike_name, Closure $c): void - { - self::$handlers[strtolower($fq_classlike_name)][] = $c; - } - - /** - * @param Closure( - * StatementsSource, - * string, - * string, - * bool, - * Context, - * CodeLocation - * ): ?bool $c - */ - public function registerLegacyClosure(string $fq_classlike_name, Closure $c): void - { - self::$legacy_handlers[strtolower($fq_classlike_name)][] = $c; - } - - public function has(string $fq_classlike_name): bool - { - return isset(self::$handlers[strtolower($fq_classlike_name)]) || - isset(self::$legacy_handlers[strtolower($fq_classlike_name)]); - } - - public function isPropertyVisible( - StatementsSource $source, - string $fq_classlike_name, - string $property_name, - bool $read_mode, - Context $context, - CodeLocation $code_location - ): ?bool { - foreach (self::$legacy_handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { - $property_visible = $property_handler( - $source, - $fq_classlike_name, - $property_name, - $read_mode, - $context, - $code_location - ); - - if ($property_visible !== null) { - return $property_visible; - } - } - - foreach (self::$handlers[strtolower($fq_classlike_name)] ?? [] as $property_handler) { - $event = new PropertyVisibilityProviderEvent( - $source, - $fq_classlike_name, - $property_name, - $read_mode, - $context, - $code_location - ); - $property_visible = $property_handler($event); - - if ($property_visible !== null) { - return $property_visible; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php deleted file mode 100644 index d42e1004..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php +++ /dev/null @@ -1,66 +0,0 @@ -file_provider = $file_provider; - $this->parser_cache_provider = $parser_cache_provider; - $this->project_cache_provider = $project_cache_provider; - - $this->file_storage_provider = new FileStorageProvider($file_storage_cache_provider); - $this->classlike_storage_provider = new ClassLikeStorageProvider($classlike_storage_cache_provider); - $this->statements_provider = new StatementsProvider( - $file_provider, - $parser_cache_provider, - $file_storage_cache_provider - ); - $this->file_reference_provider = new FileReferenceProvider($file_reference_cache_provider); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php deleted file mode 100644 index 86877094..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php +++ /dev/null @@ -1,55 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_chunk']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union - { - $call_args = $event->getCallArgs(); - $statements_source = $event->getStatementsSource(); - if (count($call_args) >= 2 - && ($array_arg_type = $statements_source->getNodeTypeProvider()->getType($call_args[0]->value)) - && $array_arg_type->isSingle() - && $array_arg_type->hasArray() - && ($array_type = ArrayType::infer($array_arg_type->getAtomicTypes()['array'])) - ) { - $preserve_keys = isset($call_args[2]) - && ($preserve_keys_arg_type = $statements_source->getNodeTypeProvider()->getType($call_args[2]->value)) - && (string) $preserve_keys_arg_type !== 'false'; - - return new Union([ - new TList( - new Union([ - $preserve_keys - ? new TNonEmptyArray([$array_type->key, $array_type->value]) - : new TNonEmptyList($array_type->value) - ]) - ) - ]); - } - - return new Union([new TList(Type::getArray())]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php deleted file mode 100644 index 89e68a1e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php +++ /dev/null @@ -1,142 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_column']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer - || count($call_args) < 2 - ) { - return Type::getMixed(); - } - - $row_shape = null; - $input_array_not_empty = false; - - // calculate row shape - if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value)) - && $first_arg_type->isSingle() - && $first_arg_type->hasArray() - ) { - $input_array = $first_arg_type->getAtomicTypes()['array']; - $row_type = null; - if ($input_array instanceof TKeyedArray) { - $row_type = $input_array->getGenericArrayType()->type_params[1]; - } elseif ($input_array instanceof TArray) { - $row_type = $input_array->type_params[1]; - } elseif ($input_array instanceof TList) { - $row_type = $input_array->type_param; - } - - if ($row_type && $row_type->isSingle()) { - if ($row_type->hasArray()) { - $row_shape = $row_type->getAtomicTypes()['array']; - } elseif ($row_type->hasObjectType()) { - $row_shape_union = GetObjectVarsReturnTypeProvider::getGetObjectVarsReturnType( - $row_type, - $statements_source, - $event->getContext(), - $event->getCodeLocation() - ); - if ($row_shape_union->isSingle()) { - $row_shape_union_parts = $row_shape_union->getAtomicTypes(); - $row_shape = reset($row_shape_union_parts); - } - } - } - - $input_array_not_empty = $input_array instanceof TNonEmptyList || - $input_array instanceof TNonEmptyArray || - $input_array instanceof TKeyedArray; - } - - $value_column_name = null; - $value_column_name_is_null = false; - // calculate value column name - if (($second_arg_type = $statements_source->node_data->getType($call_args[1]->value))) { - if ($second_arg_type->isSingleIntLiteral()) { - $value_column_name = $second_arg_type->getSingleIntLiteral()->value; - } elseif ($second_arg_type->isSingleStringLiteral()) { - $value_column_name = $second_arg_type->getSingleStringLiteral()->value; - } - $value_column_name_is_null = $second_arg_type->isNull(); - } - - $key_column_name = null; - $third_arg_type = null; - // calculate key column name - if (isset($call_args[2])) { - $third_arg_type = $statements_source->node_data->getType($call_args[2]->value); - - if ($third_arg_type) { - if ($third_arg_type->isSingleIntLiteral()) { - $key_column_name = $third_arg_type->getSingleIntLiteral()->value; - } elseif ($third_arg_type->isSingleStringLiteral()) { - $key_column_name = $third_arg_type->getSingleStringLiteral()->value; - } - } - } - - $result_key_type = Type::getArrayKey(); - $result_element_type = null; - $have_at_least_one_res = false; - // calculate results - if ($row_shape instanceof TKeyedArray) { - if ((null !== $value_column_name) && isset($row_shape->properties[$value_column_name])) { - $result_element_type = $row_shape->properties[$value_column_name]; - // When the selected key is possibly_undefined, the resulting array can be empty - if ($input_array_not_empty && $result_element_type->possibly_undefined !== true) { - $have_at_least_one_res = true; - } - //array_column skips undefined elements so resulting type is necessarily defined - $result_element_type->possibly_undefined = false; - } elseif ($value_column_name_is_null) { - $result_element_type = new Union([$row_shape]); - } else { - $result_element_type = Type::getMixed(); - } - - if ((null !== $key_column_name) && isset($row_shape->properties[$key_column_name])) { - $result_key_type = $row_shape->properties[$key_column_name]; - } - } - - if (isset($call_args[2]) && (string)$third_arg_type !== 'null') { - $type = $have_at_least_one_res ? - new TNonEmptyArray([$result_key_type, $result_element_type ?? Type::getMixed()]) - : new TArray([$result_key_type, $result_element_type ?? Type::getMixed()]); - } else { - $type = $have_at_least_one_res ? - new TNonEmptyList($result_element_type ?? Type::getMixed()) - : new TList($result_element_type ?? Type::getMixed()); - } - - return new Union([$type]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php deleted file mode 100644 index 9a16f980..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php +++ /dev/null @@ -1,111 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_fill']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - $first_arg_type = isset($call_args[0]) ? $statements_source->node_data->getType($call_args[0]->value) : null; - $second_arg_type = isset($call_args[1]) ? $statements_source->node_data->getType($call_args[1]->value) : null; - $third_arg_type = isset($call_args[2]) ? $statements_source->node_data->getType($call_args[2]->value) : null; - - $value_type_from_third_arg = $third_arg_type ? clone $third_arg_type : Type::getMixed(); - - if ($first_arg_type - && $first_arg_type->isSingleIntLiteral() - && $first_arg_type->getSingleIntLiteral()->value === 0 - ) { - if ($second_arg_type - && self::isPositiveNumericType($second_arg_type) - ) { - return new Union([ - new TNonEmptyList( - $value_type_from_third_arg - ) - ]); - } - - return new Union([ - new TList( - $value_type_from_third_arg - ) - ]); - } - - if ($second_arg_type - && self::isPositiveNumericType($second_arg_type) - ) { - if ($first_arg_type - && $first_arg_type->isSingleIntLiteral() - && $second_arg_type->isSingleIntLiteral() - ) { - return new Union([ - new TNonEmptyArray([ - new Union([new TIntRange( - $first_arg_type->getSingleIntLiteral()->value, - $second_arg_type->getSingleIntLiteral()->value - )]), - $value_type_from_third_arg, - ]) - ]); - } - - return new Union([ - new TNonEmptyArray([ - Type::getInt(), - $value_type_from_third_arg, - ]) - ]); - } - - return new Union([ - new TArray([ - Type::getInt(), - $value_type_from_third_arg, - ]) - ]); - } - - private static function isPositiveNumericType(Union $arg): bool - { - if ($arg->isSingle() && $arg->hasPositiveInt()) { - return true; - } - - if ($arg->isSingle()) { - foreach ($arg->getRangeInts() as $range_int) { - if ($range_int->isPositive()) { - return true; - } - } - } - - return $arg->isSingleIntLiteral() && $arg->getSingleIntLiteral()->value > 0; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php deleted file mode 100644 index b8612e18..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php +++ /dev/null @@ -1,331 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_filter']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $context = $event->getContext(); - $code_location = $event->getCodeLocation(); - if (!$statements_source instanceof StatementsAnalyzer - || !$call_args - ) { - return Type::getMixed(); - } - - $array_arg = $call_args[0]->value ?? null; - - $first_arg_array = $array_arg - && ($first_arg_type = $statements_source->node_data->getType($array_arg)) - && $first_arg_type->hasType('array') - && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) - && ($array_atomic_type instanceof TArray - || $array_atomic_type instanceof TKeyedArray - || $array_atomic_type instanceof TList) - ? $array_atomic_type - : null; - - if (!$first_arg_array) { - return Type::getArray(); - } - - if ($first_arg_array instanceof TArray) { - $inner_type = $first_arg_array->type_params[1]; - $key_type = clone $first_arg_array->type_params[0]; - } elseif ($first_arg_array instanceof TList) { - $inner_type = $first_arg_array->type_param; - $key_type = Type::getInt(); - } else { - $inner_type = $first_arg_array->getGenericValueType(); - $key_type = $first_arg_array->getGenericKeyType(); - - if (!isset($call_args[1]) && !$first_arg_array->previous_value_type) { - $had_one = count($first_arg_array->properties) === 1; - - $first_arg_array = clone $first_arg_array; - - $new_properties = array_filter( - array_map( - static function ($keyed_type) use ($statements_source, $context) { - $prev_keyed_type = $keyed_type; - - $keyed_type = AssertionReconciler::reconcile( - '!falsy', - clone $keyed_type, - '', - $statements_source, - $context->inside_loop, - [], - null, - $statements_source->getSuppressedIssues() - ); - - $keyed_type->possibly_undefined = !$prev_keyed_type->isAlwaysTruthy(); - - return $keyed_type; - }, - $first_arg_array->properties - ), - static function ($keyed_type) { - return !$keyed_type->isEmpty(); - } - ); - - if (!$new_properties) { - return Type::getEmptyArray(); - } - - $first_arg_array->properties = $new_properties; - - $first_arg_array->is_list = $first_arg_array->is_list && $had_one; - $first_arg_array->sealed = false; - - return new Union([$first_arg_array]); - } - } - - if (!isset($call_args[1])) { - $inner_type = AssertionReconciler::reconcile( - '!falsy', - clone $inner_type, - '', - $statements_source, - $context->inside_loop, - [], - null, - $statements_source->getSuppressedIssues() - ); - - if ($first_arg_array instanceof TKeyedArray - && $first_arg_array->is_list - && $key_type->isSingleIntLiteral() - && $key_type->getSingleIntLiteral()->value === 0 - ) { - return new Union([ - new TList( - $inner_type - ), - ]); - } - - if ($key_type->getLiteralStrings()) { - $key_type->addType(new TString); - } - - if ($key_type->getLiteralInts()) { - $key_type->addType(new TInt); - } - - if ($inner_type->isUnionEmpty()) { - return Type::getEmptyArray(); - } - - return new Union([ - new TArray([ - $key_type, - $inner_type, - ]), - ]); - } - - if (!isset($call_args[2])) { - $function_call_arg = $call_args[1]; - - if ($function_call_arg->value instanceof PhpParser\Node\Scalar\String_ - || $function_call_arg->value instanceof PhpParser\Node\Expr\Array_ - || $function_call_arg->value instanceof PhpParser\Node\Expr\BinaryOp\Concat - ) { - $mapping_function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( - $statements_source, - $function_call_arg->value - ); - - if ($array_arg && $mapping_function_ids) { - $assertions = []; - - $fake_var_discriminator = mt_rand(); - ArrayMapReturnTypeProvider::getReturnTypeFromMappingIds( - $statements_source, - $mapping_function_ids, - $context, - $function_call_arg, - array_slice($call_args, 0, 1), - $assertions, - $fake_var_discriminator - ); - - $array_var_id = ExpressionIdentifier::getArrayVarId( - $array_arg, - null, - $statements_source - ); - - if (isset($assertions[$array_var_id . "[\$__fake_{$fake_var_discriminator}_offset_var__]"])) { - $changed_var_ids = []; - - $assertions = [ - '$inner_type' => - $assertions["{$array_var_id}[\$__fake_{$fake_var_discriminator}_offset_var__]"], - ]; - - $reconciled_types = Reconciler::reconcileKeyedTypes( - $assertions, - $assertions, - ['$inner_type' => $inner_type], - $changed_var_ids, - ['$inner_type' => true], - $statements_source, - $statements_source->getTemplateTypeMap() ?: [], - false, - new CodeLocation($statements_source, $function_call_arg->value) - ); - - if (isset($reconciled_types['$inner_type'])) { - $inner_type = $reconciled_types['$inner_type']; - } - } - - ArrayMapReturnTypeProvider::cleanContext($context, $fake_var_discriminator); - } - } elseif (($function_call_arg->value instanceof PhpParser\Node\Expr\Closure - || $function_call_arg->value instanceof PhpParser\Node\Expr\ArrowFunction) - && ($second_arg_type = $statements_source->node_data->getType($function_call_arg->value)) - && ($closure_types = $second_arg_type->getClosureTypes()) - ) { - $closure_atomic_type = reset($closure_types); - $closure_return_type = $closure_atomic_type->return_type ?: Type::getMixed(); - - if ($closure_return_type->isVoid()) { - IssueBuffer::maybeAdd( - new InvalidReturnType( - 'No return type could be found in the closure passed to array_filter', - $code_location - ), - $statements_source->getSuppressedIssues() - ); - - return Type::getArray(); - } - - /** @var list */ - $function_call_stmts = $function_call_arg->value->getStmts(); - - if (count($function_call_stmts) === 1 && count($function_call_arg->value->params)) { - $first_param = $function_call_arg->value->params[0]; - $stmt = $function_call_stmts[0]; - - if ($first_param->variadic === false - && $first_param->var instanceof PhpParser\Node\Expr\Variable - && is_string($first_param->var->name) - && $stmt instanceof PhpParser\Node\Stmt\Return_ - && $stmt->expr - ) { - $codebase = $statements_source->getCodebase(); - - $cond_object_id = spl_object_id($stmt->expr); - - try { - $filter_clauses = FormulaGenerator::getFormula( - $cond_object_id, - $cond_object_id, - $stmt->expr, - $context->self, - $statements_source, - $codebase - ); - } catch (ComplicatedExpressionException $e) { - $filter_clauses = []; - } - - $assertions = Algebra::getTruthsFromFormula( - $filter_clauses, - $cond_object_id - ); - - if (isset($assertions['$' . $first_param->var->name])) { - $changed_var_ids = []; - - $assertions = ['$inner_type' => $assertions['$' . $first_param->var->name]]; - - $reconciled_types = Reconciler::reconcileKeyedTypes( - $assertions, - $assertions, - ['$inner_type' => $inner_type], - $changed_var_ids, - ['$inner_type' => true], - $statements_source, - $statements_source->getTemplateTypeMap() ?: [], - false, - new CodeLocation($statements_source, $stmt) - ); - - if (isset($reconciled_types['$inner_type'])) { - $inner_type = $reconciled_types['$inner_type']; - } - } - } - } - } - - return new Union([ - new TArray([ - $key_type, - $inner_type, - ]), - ]); - } - - if ($inner_type->isUnionEmpty()) { - return Type::getEmptyArray(); - } - - return new Union([ - new TArray([ - $key_type, - $inner_type, - ]), - ]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php deleted file mode 100644 index 47c786e2..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php +++ /dev/null @@ -1,499 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_map']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $context = $event->getContext(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - $function_call_arg = $call_args[0] ?? null; - - $function_call_type = $function_call_arg - ? $statements_source->node_data->getType($function_call_arg->value) - : null; - - if ($function_call_type && $function_call_type->isNull()) { - array_shift($call_args); - - $array_arg_types = []; - - foreach ($call_args as $call_arg) { - $call_arg_type = $statements_source->node_data->getType($call_arg->value); - - if ($call_arg_type) { - $array_arg_types[] = clone $call_arg_type; - } else { - $array_arg_types[] = Type::getMixed(); - break; - } - } - - if ($array_arg_types) { - return new Union([new TKeyedArray($array_arg_types)]); - } - - return Type::getArray(); - } - - $array_arg = $call_args[1] ?? null; - - if (!$array_arg) { - return Type::getArray(); - } - - $array_arg_atomic_type = null; - $array_arg_type = null; - - if ($array_arg_union_type = $statements_source->node_data->getType($array_arg->value)) { - $arg_types = $array_arg_union_type->getAtomicTypes(); - - if (isset($arg_types['array'])) { - $array_arg_atomic_type = $arg_types['array']; - $array_arg_type = ArrayType::infer($array_arg_atomic_type); - } - } - - $generic_key_type = null; - $mapping_return_type = null; - - if ($function_call_arg && $function_call_type) { - if (count($call_args) === 2) { - $generic_key_type = $array_arg_type->key ?? Type::getArrayKey(); - } else { - $generic_key_type = Type::getInt(); - } - - if ($function_call_type->hasCallableType()) { - $closure_types = $function_call_type->getClosureTypes() ?: $function_call_type->getCallableTypes(); - $closure_atomic_type = reset($closure_types); - - $closure_return_type = $closure_atomic_type->return_type ?: Type::getMixed(); - - if ($closure_return_type->isVoid()) { - $closure_return_type = Type::getNull(); - } - - $mapping_return_type = clone $closure_return_type; - } elseif ($function_call_arg->value instanceof PhpParser\Node\Scalar\String_ - || $function_call_arg->value instanceof PhpParser\Node\Expr\Array_ - || $function_call_arg->value instanceof PhpParser\Node\Expr\BinaryOp\Concat - ) { - $mapping_function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( - $statements_source, - $function_call_arg->value - ); - - if ($mapping_function_ids) { - $mapping_return_type = self::getReturnTypeFromMappingIds( - $statements_source, - $mapping_function_ids, - $context, - $function_call_arg, - array_slice($call_args, 1) - ); - } - - if ($function_call_arg->value instanceof PhpParser\Node\Expr\Array_ - && isset($function_call_arg->value->items[0]) - && isset($function_call_arg->value->items[1]) - && $function_call_arg->value->items[1]->value instanceof PhpParser\Node\Scalar\String_ - && $function_call_arg->value->items[0]->value instanceof PhpParser\Node\Expr\Variable - && ($variable_type - = $statements_source->node_data->getType($function_call_arg->value->items[0]->value)) - ) { - $fake_method_call = null; - - foreach ($variable_type->getAtomicTypes() as $variable_atomic_type) { - if ($variable_atomic_type instanceof TTemplateParam - || $variable_atomic_type instanceof TTemplateParamClass - ) { - $fake_method_call = new VirtualStaticCall( - $function_call_arg->value->items[0]->value, - $function_call_arg->value->items[1]->value->value, - [] - ); - } - } - - if ($fake_method_call) { - $fake_method_return_type = self::executeFakeCall( - $statements_source, - $fake_method_call, - $context - ); - - if ($fake_method_return_type) { - $mapping_return_type = $fake_method_return_type; - } - } - } - } - } - - if ($mapping_return_type && $generic_key_type) { - if ($array_arg_atomic_type instanceof TKeyedArray && count($call_args) === 2) { - $atomic_type = new TKeyedArray( - array_map( - /** - * @return Union - */ - function (Union $_) use ($mapping_return_type): Union { - return clone $mapping_return_type; - }, - $array_arg_atomic_type->properties - ) - ); - $atomic_type->is_list = $array_arg_atomic_type->is_list; - $atomic_type->sealed = $array_arg_atomic_type->sealed; - $atomic_type->previous_key_type = $array_arg_atomic_type->previous_key_type; - $atomic_type->previous_value_type = $mapping_return_type; - - return new Union([$atomic_type]); - } - - if ($array_arg_atomic_type instanceof TList - || count($call_args) !== 2 - ) { - if ($array_arg_atomic_type instanceof TNonEmptyList) { - return new Union([ - new TNonEmptyList( - $mapping_return_type - ), - ]); - } - - return new Union([ - new TList( - $mapping_return_type - ), - ]); - } - - if ($array_arg_atomic_type instanceof TNonEmptyArray) { - return new Union([ - new TNonEmptyArray([ - $generic_key_type, - $mapping_return_type, - ]), - ]); - } - - return new Union([ - new TArray([ - $generic_key_type, - $mapping_return_type, - ]) - ]); - } - - return count($call_args) === 2 && !($array_arg_type->is_list ?? false) - ? new Union([ - new TArray([ - $array_arg_type->key ?? Type::getArrayKey(), - Type::getMixed(), - ]) - ]) - : Type::getList(); - } - - /** - * @param-out array>>|null $assertions - */ - private static function executeFakeCall( - StatementsAnalyzer $statements_analyzer, - PhpParser\Node\Expr $fake_call, - Context $context, - ?array &$assertions = null - ): ?Union { - $old_data_provider = $statements_analyzer->node_data; - - $statements_analyzer->node_data = clone $statements_analyzer->node_data; - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); - } - - if (!in_array('MixedArrayOffset', $suppressed_issues, true)) { - $statements_analyzer->addSuppressedIssues(['MixedArrayOffset']); - } - - $was_inside_call = $context->inside_call; - - $context->inside_call = true; - - if ($fake_call instanceof PhpParser\Node\Expr\StaticCall) { - StaticCallAnalyzer::analyze( - $statements_analyzer, - $fake_call, - $context - ); - } elseif ($fake_call instanceof PhpParser\Node\Expr\MethodCall) { - MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_call, - $context - ); - } elseif ($fake_call instanceof PhpParser\Node\Expr\FuncCall) { - FunctionCallAnalyzer::analyze( - $statements_analyzer, - $fake_call, - $context - ); - } else { - throw new UnexpectedValueException('UnrecognizedCall'); - } - - $codebase = $statements_analyzer->getCodebase(); - - if ($assertions !== null) { - $anded_assertions = AssertionFinder::scrapeAssertions( - $fake_call, - null, - $statements_analyzer, - $codebase - ); - - $assertions = $anded_assertions[0] ?? []; - } - - $context->inside_call = $was_inside_call; - - if (!in_array('PossiblyInvalidMethodCall', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['PossiblyInvalidMethodCall']); - } - - if (!in_array('MixedArrayOffset', $suppressed_issues, true)) { - $statements_analyzer->removeSuppressedIssues(['MixedArrayOffset']); - } - - $return_type = $statements_analyzer->node_data->getType($fake_call) ?? null; - - $statements_analyzer->node_data = $old_data_provider; - - return $return_type; - } - - /** - * @param non-empty-array $mapping_function_ids - * @param list $array_args - * @param int|null $fake_var_discriminator Set the fake variable id to a known value with the discriminator - * as a substring, and don't clear it from the context. - * @param-out array>>|null $assertions - */ - public static function getReturnTypeFromMappingIds( - StatementsAnalyzer $statements_source, - array $mapping_function_ids, - Context $context, - PhpParser\Node\Arg $function_call_arg, - array $array_args, - ?array &$assertions = null, - ?int $fake_var_discriminator = null - ): Union { - $mapping_return_type = null; - - $codebase = $statements_source->getCodebase(); - - $clean_context = false; - - foreach ($mapping_function_ids as $mapping_function_id) { - $mapping_function_id_parts = explode('&', $mapping_function_id); - - if ($fake_var_discriminator === null) { - $fake_var_discriminator = mt_rand(); - $clean_context = true; - } - - foreach ($mapping_function_id_parts as $mapping_function_id_part) { - $fake_args = []; - - foreach ($array_args as $array_arg) { - $fake_args[] = new VirtualArg( - new VirtualArrayDimFetch( - $array_arg->value, - new VirtualVariable( - "__fake_{$fake_var_discriminator}_offset_var__", - $array_arg->value->getAttributes() - ), - $array_arg->value->getAttributes() - ), - false, - false, - $array_arg->getAttributes() - ); - } - - if (strpos($mapping_function_id_part, '::') !== false) { - $is_instance = false; - - if ($mapping_function_id_part[0] === '$') { - $mapping_function_id_part = substr($mapping_function_id_part, 1); - $is_instance = true; - } - - $method_id_parts = explode('::', $mapping_function_id_part); - [$callable_fq_class_name, $callable_method_name] = $method_id_parts; - - if ($is_instance) { - $fake_method_call = new VirtualMethodCall( - new VirtualVariable( - "__fake_{$fake_var_discriminator}_method_call_var__", - $function_call_arg->getAttributes() - ), - new VirtualIdentifier( - $callable_method_name, - $function_call_arg->getAttributes() - ), - $fake_args, - $function_call_arg->getAttributes() - ); - - $lhs_instance_type = null; - - $callable_type = $statements_source->node_data->getType($function_call_arg->value); - - if ($callable_type) { - foreach ($callable_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TKeyedArray - && count($atomic_type->properties) === 2 - && isset($atomic_type->properties[0]) - ) { - $lhs_instance_type = clone $atomic_type->properties[0]; - } - } - } - - $context->vars_in_scope["\$__fake_{$fake_var_discriminator}_offset_var__"] = Type::getMixed(); - $context->vars_in_scope["\$__fake_{$fake_var_discriminator}_method_call_var__"] = - $lhs_instance_type ?: new Union([new TNamedObject($callable_fq_class_name)]); - } else { - $fake_method_call = new VirtualStaticCall( - new VirtualFullyQualified( - $callable_fq_class_name, - $function_call_arg->getAttributes() - ), - new VirtualIdentifier( - $callable_method_name, - $function_call_arg->getAttributes() - ), - $fake_args, - $function_call_arg->getAttributes() - ); - - $context->vars_in_scope["\$__fake_{$fake_var_discriminator}_offset_var__"] = Type::getMixed(); - } - - $fake_method_return_type = self::executeFakeCall( - $statements_source, - $fake_method_call, - $context, - $assertions - ); - - $function_id_return_type = $fake_method_return_type ?? Type::getMixed(); - } else { - $fake_function_call = new VirtualFuncCall( - new VirtualFullyQualified( - $mapping_function_id_part, - $function_call_arg->getAttributes() - ), - $fake_args, - $function_call_arg->getAttributes() - ); - - $context->vars_in_scope["\$__fake_{$fake_var_discriminator}_offset_var__"] = Type::getMixed(); - - $fake_function_return_type = self::executeFakeCall( - $statements_source, - $fake_function_call, - $context, - $assertions - ); - - $function_id_return_type = $fake_function_return_type ?? Type::getMixed(); - } - } - - if ($clean_context) { - self::cleanContext($context, $fake_var_discriminator); - } - - $fake_var_discriminator = null; - - $mapping_return_type = Type::combineUnionTypes( - $function_id_return_type, - $mapping_return_type, - $codebase - ); - } - - return $mapping_return_type; - } - - public static function cleanContext(Context $context, int $fake_var_discriminator): void - { - foreach ($context->vars_in_scope as $var_in_scope => $_) { - if (strpos($var_in_scope, "__fake_{$fake_var_discriminator}_") !== false) { - unset($context->vars_in_scope[$var_in_scope]); - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php deleted file mode 100644 index 6102ba47..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php +++ /dev/null @@ -1,287 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_merge', 'array_replace']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer - || !$call_args - ) { - return Type::getMixed(); - } - - $is_replace = mb_strcut($event->getFunctionId(), 6, 7) === 'replace'; - - $inner_value_types = []; - $inner_key_types = []; - - $codebase = $statements_source->getCodebase(); - - $generic_properties = []; - $class_strings = []; - $all_keyed_arrays = true; - $all_int_offsets = true; - $all_nonempty_lists = true; - $any_nonempty = false; - - $max_keyed_array_size = 0; - - foreach ($call_args as $call_arg) { - if (!($call_arg_type = $statements_source->node_data->getType($call_arg->value))) { - return Type::getArray(); - } - - foreach ($call_arg_type->getAtomicTypes() as $type_part) { - if ($call_arg->unpack) { - if (!$type_part instanceof TArray) { - if ($type_part instanceof TKeyedArray) { - $type_part_value_type = $type_part->getGenericValueType(); - } elseif ($type_part instanceof TList) { - $type_part_value_type = $type_part->type_param; - } else { - return Type::getArray(); - } - } else { - $type_part_value_type = $type_part->type_params[1]; - } - - $unpacked_type_parts = []; - - foreach ($type_part_value_type->getAtomicTypes() as $value_type_part) { - $unpacked_type_parts[] = $value_type_part; - } - } else { - $unpacked_type_parts = [$type_part]; - } - - foreach ($unpacked_type_parts as $unpacked_type_part) { - if (!$unpacked_type_part instanceof TArray) { - if (($unpacked_type_part instanceof TFalse - && $call_arg_type->ignore_falsable_issues) - || ($unpacked_type_part instanceof TNull - && $call_arg_type->ignore_nullable_issues) - ) { - continue; - } - - if ($unpacked_type_part instanceof TKeyedArray) { - $max_keyed_array_size = max( - $max_keyed_array_size, - count($unpacked_type_part->properties) - ); - - foreach ($unpacked_type_part->properties as $key => $type) { - if (!is_string($key)) { - if ($is_replace) { - $generic_properties[$key] = $type; - } else { - $generic_properties[] = $type; - } - continue; - } - - if (isset($unpacked_type_part->class_strings[$key])) { - $class_strings[$key] = true; - } - - if (!isset($generic_properties[$key]) || !$type->possibly_undefined) { - $generic_properties[$key] = $type; - } else { - $was_possibly_undefined = $generic_properties[$key]->possibly_undefined; - - $generic_properties[$key] = Type::combineUnionTypes( - $generic_properties[$key], - $type, - $codebase - ); - - $generic_properties[$key]->possibly_undefined = $was_possibly_undefined; - } - } - - if (!$unpacked_type_part->is_list) { - $all_nonempty_lists = false; - } - - if ($unpacked_type_part->sealed) { - $any_nonempty = true; - } - - continue; - } - - if ($unpacked_type_part instanceof TList) { - $all_keyed_arrays = false; - - if (!$unpacked_type_part instanceof TNonEmptyList) { - $all_nonempty_lists = false; - } else { - $any_nonempty = true; - } - } else { - if ($unpacked_type_part instanceof TMixed - && $unpacked_type_part->from_loop_isset - ) { - $unpacked_type_part = new TArray([ - Type::getArrayKey(), - Type::getMixed(true), - ]); - } else { - return Type::getArray(); - } - } - } else { - if (!$unpacked_type_part->type_params[0]->isEmpty()) { - foreach ($generic_properties as $key => $keyed_type) { - $generic_properties[$key] = Type::combineUnionTypes( - $keyed_type, - $unpacked_type_part->type_params[1], - $codebase - ); - } - - $all_keyed_arrays = false; - $all_nonempty_lists = false; - } - } - - if ($unpacked_type_part instanceof TArray) { - if ($unpacked_type_part->type_params[1]->isEmpty()) { - continue; - } - - if (!$unpacked_type_part->type_params[0]->isInt()) { - $all_int_offsets = false; - } - - if ($unpacked_type_part instanceof TNonEmptyArray) { - $any_nonempty = true; - } - } - - $inner_key_types = array_merge( - $inner_key_types, - $unpacked_type_part instanceof TList - ? [new TInt()] - : array_values($unpacked_type_part->type_params[0]->getAtomicTypes()) - ); - $inner_value_types = array_merge( - $inner_value_types, - $unpacked_type_part instanceof TList - ? array_values($unpacked_type_part->type_param->getAtomicTypes()) - : array_values($unpacked_type_part->type_params[1]->getAtomicTypes()) - ); - } - } - } - - $inner_key_type = null; - $inner_value_type = null; - - if ($inner_key_types) { - /** - * Truthy&array-shape-list doesn't reconcile correctly, will be fixed for 5.x by #8050. - * @psalm-suppress InvalidScalarArgument - */ - $inner_key_type = TypeCombiner::combine($inner_key_types, $codebase, true); - } - - if ($inner_value_types) { - $inner_value_type = TypeCombiner::combine($inner_value_types, $codebase, true); - } - - $generic_property_count = count($generic_properties); - - if ($generic_properties - && $generic_property_count < 64 - && ($generic_property_count < $max_keyed_array_size * 2 - || $generic_property_count < 16) - ) { - $objectlike = new TKeyedArray($generic_properties); - - if ($class_strings !== []) { - $objectlike->class_strings = $class_strings; - } - - if ($all_nonempty_lists || $all_int_offsets) { - $objectlike->is_list = true; - } - - if (!$all_keyed_arrays) { - $objectlike->previous_key_type = $inner_key_type; - $objectlike->previous_value_type = $inner_value_type; - } - - return new Union([$objectlike]); - } - - if ($inner_value_type) { - if ($all_int_offsets) { - if ($any_nonempty) { - return new Union([ - new TNonEmptyList($inner_value_type), - ]); - } - - return new Union([ - new TList($inner_value_type), - ]); - } - - $inner_key_type = $inner_key_type ?? Type::getArrayKey(); - - if ($any_nonempty) { - return new Union([ - new TNonEmptyArray([ - $inner_key_type, - $inner_value_type, - ]), - ]); - } - - return new Union([ - new TArray([ - $inner_key_type, - $inner_value_type, - ]), - ]); - } - - return Type::getArray(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php deleted file mode 100644 index f5859c17..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php +++ /dev/null @@ -1,68 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_pad']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $type_provider = $statements_source->getNodeTypeProvider(); - - if (count($call_args) >= 3 - && ($array_arg_type = $type_provider->getType($call_args[0]->value)) - && ($size_arg_type = $type_provider->getType($call_args[1]->value)) - && ($value_arg_type = $type_provider->getType($call_args[2]->value)) - && $array_arg_type->isSingle() - && $array_arg_type->hasArray() - && ($array_type = ArrayType::infer($array_arg_type->getAtomicTypes()['array'])) - ) { - $codebase = $statements_source->getCodebase(); - $key_type = Type::combineUnionTypes($array_type->key, Type::getInt(), $codebase); - $value_type = Type::combineUnionTypes($array_type->value, $value_arg_type, $codebase); - $can_return_empty = ( - !$size_arg_type->isSingleIntLiteral() - || $size_arg_type->getSingleIntLiteral()->value === 0 - ); - - return new Union([ - $array_type->is_list - ? ( - $can_return_empty - ? new TList($value_type) - : new TNonEmptyList($value_type) - ) - : ( - $can_return_empty - ? new TArray([$key_type, $value_type]) - : new TNonEmptyArray([$key_type, $value_type]) - ) - ]); - } - - return Type::getArray(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php deleted file mode 100644 index 66d39525..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php +++ /dev/null @@ -1,105 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['current', 'next', 'prev', 'reset', 'end']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $function_id = $event->getFunctionId(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - $first_arg = $call_args[0]->value ?? null; - - if (!$first_arg) { - return Type::getMixed(); - } - - $first_arg_type = $statements_source->node_data->getType($first_arg); - - if (!$first_arg_type) { - return Type::getMixed(); - } - - $atomic_types = $first_arg_type->getAtomicTypes(); - - $value_type = null; - $definitely_has_items = false; - - while ($atomic_type = array_shift($atomic_types)) { - if ($atomic_type instanceof TTemplateParam) { - $atomic_types = array_merge($atomic_types, $atomic_type->as->getAtomicTypes()); - continue; - } - - if ($atomic_type instanceof TArray) { - $value_type = clone $atomic_type->type_params[1]; - $definitely_has_items = $atomic_type instanceof TNonEmptyArray; - } elseif ($atomic_type instanceof TList) { - $value_type = clone $atomic_type->type_param; - $definitely_has_items = $atomic_type instanceof TNonEmptyList; - } elseif ($atomic_type instanceof TKeyedArray) { - $value_type = $atomic_type->getGenericValueType(); - $definitely_has_items = $atomic_type->getGenericArrayType() instanceof TNonEmptyArray; - } else { - return Type::getMixed(); - } - } - - if (!$value_type) { - throw new UnexpectedValueException('This should never happen'); - } - - if ($value_type->isEmpty()) { - $value_type = Type::getFalse(); - } elseif (($function_id !== 'reset' && $function_id !== 'end') || !$definitely_has_items) { - $value_type->addType(new TFalse); - - $codebase = $statements_source->getCodebase(); - - if ($codebase->config->ignore_internal_falsable_issues) { - $value_type->ignore_falsable_issues = true; - } - } - - ArrayFetchAnalyzer::taintArrayFetch( - $statements_source, - $first_arg, - null, - $value_type, - Type::getMixed() - ); - - return $value_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php deleted file mode 100644 index 25dd2bd2..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php +++ /dev/null @@ -1,96 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_pop', 'array_shift']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $function_id = $event->getFunctionId(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - $first_arg = $call_args[0]->value ?? null; - - $first_arg_array = $first_arg - && ($first_arg_type = $statements_source->node_data->getType($first_arg)) - && $first_arg_type->hasType('array') - && !$first_arg_type->hasMixed() - && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) - && ($array_atomic_type instanceof TArray - || $array_atomic_type instanceof TKeyedArray - || $array_atomic_type instanceof TList) - ? $array_atomic_type - : null; - - if (!$first_arg_array) { - return Type::getMixed(); - } - - $nullable = false; - - if ($first_arg_array instanceof TArray) { - $value_type = clone $first_arg_array->type_params[1]; - - if ($value_type->isEmpty()) { - return Type::getNull(); - } - - if (!$first_arg_array instanceof TNonEmptyArray) { - $nullable = true; - } - } elseif ($first_arg_array instanceof TList) { - $value_type = clone $first_arg_array->type_param; - - if (!$first_arg_array instanceof TNonEmptyList) { - $nullable = true; - } - } else { - // special case where we know the type of the first element - if ($function_id === 'array_shift' && $first_arg_array->is_list && isset($first_arg_array->properties[0])) { - $value_type = clone $first_arg_array->properties[0]; - } else { - $value_type = $first_arg_array->getGenericValueType(); - - if (!$first_arg_array->sealed && !$first_arg_array->previous_value_type) { - $nullable = true; - } - } - } - - if ($nullable) { - $value_type->addType(new TNull); - - $codebase = $statements_source->getCodebase(); - - if ($codebase->config->ignore_internal_nullable_issues) { - $value_type->ignore_nullable_issues = true; - } - } - - return $value_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php deleted file mode 100644 index 8c7062b3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php +++ /dev/null @@ -1,76 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_rand']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - $first_arg = $call_args[0]->value ?? null; - $second_arg = $call_args[1]->value ?? null; - - $first_arg_array = $first_arg - && ($first_arg_type = $statements_source->node_data->getType($first_arg)) - && $first_arg_type->hasType('array') - && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) - && ($array_atomic_type instanceof TArray - || $array_atomic_type instanceof TKeyedArray - || $array_atomic_type instanceof TList) - ? $array_atomic_type - : null; - - if (!$first_arg_array) { - return Type::getMixed(); - } - - if ($first_arg_array instanceof TArray) { - $key_type = clone $first_arg_array->type_params[0]; - } elseif ($first_arg_array instanceof TList) { - $key_type = Type::getInt(); - } else { - $key_type = $first_arg_array->getGenericKeyType(); - } - - if (!$second_arg - || ($second_arg instanceof PhpParser\Node\Scalar\LNumber && $second_arg->value === 1) - ) { - return $key_type; - } - - $arr_type = new Union([ - new TList( - $key_type - ), - ]); - - if ($second_arg instanceof PhpParser\Node\Scalar\LNumber) { - return $arr_type; - } - - return Type::combineUnionTypes($key_type, $arr_type); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php deleted file mode 100644 index a9d27ba8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php +++ /dev/null @@ -1,298 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_reduce']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $context = $event->getContext(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - if (!isset($call_args[0]) || !isset($call_args[1])) { - return Type::getMixed(); - } - - $codebase = $statements_source->getCodebase(); - - $array_arg = $call_args[0]->value; - $function_call_arg = $call_args[1]->value; - - $array_arg_type = $statements_source->node_data->getType($array_arg); - $function_call_arg_type = $statements_source->node_data->getType($function_call_arg); - - if (!$array_arg_type || !$function_call_arg_type) { - return Type::getMixed(); - } - - $array_arg_types = $array_arg_type->getAtomicTypes(); - - $array_arg_atomic_type = null; - - if (isset($array_arg_types['array']) - && ($array_arg_types['array'] instanceof TArray - || $array_arg_types['array'] instanceof TKeyedArray - || $array_arg_types['array'] instanceof TList) - ) { - $array_arg_atomic_type = $array_arg_types['array']; - - if ($array_arg_atomic_type instanceof TKeyedArray) { - $array_arg_atomic_type = $array_arg_atomic_type->getGenericArrayType(); - } elseif ($array_arg_atomic_type instanceof TList) { - $array_arg_atomic_type = new TArray([ - Type::getInt(), - clone $array_arg_atomic_type->type_param - ]); - } - } - - if (!isset($call_args[2])) { - $reduce_return_type = Type::getNull(); - $reduce_return_type->ignore_nullable_issues = true; - } else { - $reduce_return_type = $statements_source->node_data->getType($call_args[2]->value); - - if (!$reduce_return_type) { - return Type::getMixed(); - } - - if ($reduce_return_type->hasMixed()) { - return Type::getMixed(); - } - } - - $initial_type = $reduce_return_type; - - if ($closure_types = $function_call_arg_type->getClosureTypes()) { - $closure_atomic_type = reset($closure_types); - - $closure_return_type = $closure_atomic_type->return_type ?: Type::getMixed(); - - if ($closure_return_type->isVoid()) { - $closure_return_type = Type::getNull(); - } - - $reduce_return_type = Type::combineUnionTypes($closure_return_type, $reduce_return_type); - - if ($closure_atomic_type->params !== null) { - if (count($closure_atomic_type->params) < 1) { - IssueBuffer::maybeAdd( - new InvalidArgument( - 'The closure passed to array_reduce at least one parameter', - new CodeLocation($statements_source, $function_call_arg) - ), - $statements_source->getSuppressedIssues() - ); - - return Type::getMixed(); - } - - $carry_param = $closure_atomic_type->params[0]; - $item_param = $closure_atomic_type->params[1] ?? null; - - if ($carry_param->type - && ( - !UnionTypeComparator::isContainedBy( - $codebase, - $initial_type, - $carry_param->type - ) - || ( - !$reduce_return_type->hasMixed() - && !UnionTypeComparator::isContainedBy( - $codebase, - $reduce_return_type, - $carry_param->type - ) - ) - ) - ) { - IssueBuffer::maybeAdd( - new InvalidArgument( - 'The first param of the closure passed to array_reduce must take ' - . $reduce_return_type . ' but only accepts ' . $carry_param->type, - $carry_param->type_location - ?: new CodeLocation($statements_source, $function_call_arg) - ), - $statements_source->getSuppressedIssues() - ); - - return Type::getMixed(); - } - - if ($item_param - && $item_param->type - && $array_arg_atomic_type - && !$array_arg_atomic_type->type_params[1]->hasMixed() - && !UnionTypeComparator::isContainedBy( - $codebase, - $array_arg_atomic_type->type_params[1], - $item_param->type - ) - ) { - IssueBuffer::maybeAdd( - new InvalidArgument( - 'The second param of the closure passed to array_reduce must take ' - . $array_arg_atomic_type->type_params[1] . ' but only accepts ' . $item_param->type, - $item_param->type_location - ?: new CodeLocation($statements_source, $function_call_arg) - ), - $statements_source->getSuppressedIssues() - ); - - return Type::getMixed(); - } - } - - return $reduce_return_type; - } - - if ($function_call_arg instanceof PhpParser\Node\Scalar\String_ - || $function_call_arg instanceof PhpParser\Node\Expr\Array_ - || $function_call_arg instanceof PhpParser\Node\Expr\BinaryOp\Concat - ) { - $mapping_function_ids = CallAnalyzer::getFunctionIdsFromCallableArg( - $statements_source, - $function_call_arg - ); - - $call_map = InternalCallMapHandler::getCallMap(); - - foreach ($mapping_function_ids as $mapping_function_id) { - $mapping_function_id_parts = explode('&', $mapping_function_id); - - $part_match_found = false; - - foreach ($mapping_function_id_parts as $mapping_function_id_part) { - if (isset($call_map[$mapping_function_id_part][0])) { - if ($call_map[$mapping_function_id_part][0]) { - $mapped_function_return = - Type::parseString($call_map[$mapping_function_id_part][0]); - - $reduce_return_type = Type::combineUnionTypes( - $reduce_return_type, - $mapped_function_return - ); - - $part_match_found = true; - } - } elseif ($mapping_function_id_part) { - if (strpos($mapping_function_id_part, '::') !== false) { - if ($mapping_function_id_part[0] === '$') { - $mapping_function_id_part = substr($mapping_function_id_part, 1); - } - - [$callable_fq_class_name, $method_name] = explode('::', $mapping_function_id_part); - - if (in_array($callable_fq_class_name, ['self', 'static'], true)) { - $callable_fq_class_name = $statements_source->getFQCLN(); - if ($callable_fq_class_name === null) { - continue; - } - } - - if ($callable_fq_class_name === 'parent') { - continue; - } - - $method_id = new MethodIdentifier( - $callable_fq_class_name, - strtolower($method_name) - ); - - if (!$codebase->methods->methodExists( - $method_id, - !$context->collect_initializations - && !$context->collect_mutations - ? $context->calling_method_id - : null, - $codebase->collect_locations - ? new CodeLocation( - $statements_source, - $function_call_arg - ) : null, - null, - $statements_source->getFilePath() - )) { - continue; - } - - $part_match_found = true; - - $self_class = 'self'; - - $return_type = $codebase->methods->getMethodReturnType( - $method_id, - $self_class - ) ?? Type::getMixed(); - } else { - if (!$codebase->functions->functionExists( - $statements_source, - strtolower($mapping_function_id_part) - ) - ) { - return Type::getMixed(); - } - - $part_match_found = true; - - $function_storage = $codebase->functions->getStorage( - $statements_source, - strtolower($mapping_function_id_part) - ); - - $return_type = $function_storage->return_type ?: Type::getMixed(); - } - - $reduce_return_type = Type::combineUnionTypes($reduce_return_type, $return_type); - } - } - - if ($part_match_found === false) { - return Type::getMixed(); - } - } - - return $reduce_return_type; - } - - return Type::getMixed(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php deleted file mode 100644 index 0fab0664..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php +++ /dev/null @@ -1,68 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_reverse']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - $first_arg = $call_args[0]->value ?? null; - - $first_arg_array = $first_arg - && ($first_arg_type = $statements_source->node_data->getType($first_arg)) - && $first_arg_type->hasType('array') - && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) - && ($array_atomic_type instanceof TArray - || $array_atomic_type instanceof TKeyedArray - || $array_atomic_type instanceof TList) - ? $array_atomic_type - : null; - - if (!$first_arg_array) { - return Type::getArray(); - } - - if ($first_arg_array instanceof TArray) { - return new Union([clone $first_arg_array]); - } - - if ($first_arg_array instanceof TList) { - $second_arg = $call_args[1]->value ?? null; - - if (!$second_arg - || (($second_arg_type = $statements_source->node_data->getType($second_arg)) - && $second_arg_type->isFalse() - ) - ) { - return new Union([clone $first_arg_array]); - } - - return new Union([new TArray([Type::getInt(), clone $first_arg_array->type_param])]); - } - - return new Union([$first_arg_array->getGenericArrayType()]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php deleted file mode 100644 index 399bb259..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php +++ /dev/null @@ -1,98 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_slice']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - $first_arg = $call_args[0]->value ?? null; - - if (!$first_arg) { - return Type::getArray(); - } - - $first_arg_type = $statements_source->node_data->getType($first_arg); - - if (!$first_arg_type) { - return Type::getArray(); - } - - $atomic_types = $first_arg_type->getAtomicTypes(); - - $return_atomic_type = null; - - while ($atomic_type = array_shift($atomic_types)) { - if ($atomic_type instanceof TTemplateParam) { - $atomic_types = array_merge($atomic_types, $atomic_type->as->getAtomicTypes()); - continue; - } - - $already_cloned = false; - - if ($atomic_type instanceof TKeyedArray) { - $already_cloned = true; - $atomic_type = $atomic_type->getGenericArrayType(); - } - - if ($atomic_type instanceof TArray) { - if (!$already_cloned) { - $atomic_type = clone $atomic_type; - } - - $return_atomic_type = new TArray($atomic_type->type_params); - continue; - } - - if ($atomic_type instanceof TList) { - $return_atomic_type = new TArray([Type::getInt(), clone $atomic_type->type_param]); - continue; - } - - return Type::getArray(); - } - - if (!$return_atomic_type) { - throw new UnexpectedValueException('This should never happen'); - } - - $dont_preserve_int_keys = !isset($call_args[3]->value) - || (($third_arg_type = $statements_source->node_data->getType($call_args[3]->value)) - && ((string) $third_arg_type === 'false')); - - if ($dont_preserve_int_keys && $return_atomic_type->type_params[0]->isInt()) { - $return_atomic_type = new TList($return_atomic_type->type_params[1]); - } - - return new Union([$return_atomic_type]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php deleted file mode 100644 index 6f4d0625..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php +++ /dev/null @@ -1,76 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_splice']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - $first_arg = $call_args[0]->value ?? null; - - $first_arg_array = $first_arg - && ($first_arg_type = $statements_source->node_data->getType($first_arg)) - && $first_arg_type->hasType('array') - && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) - && ($array_atomic_type instanceof TArray - || $array_atomic_type instanceof TKeyedArray - || $array_atomic_type instanceof TList) - ? $array_atomic_type - : null; - - if (!$first_arg_array) { - return Type::getArray(); - } - - $already_cloned = false; - - if ($first_arg_array instanceof TKeyedArray) { - $already_cloned = true; - $first_arg_array = $first_arg_array->getGenericArrayType(); - } - - if ($first_arg_array instanceof TArray) { - if (!$already_cloned) { - $first_arg_array = clone $first_arg_array; - } - $array_type = new TArray($first_arg_array->type_params); - } else { - $array_type = new TArray([Type::getInt(), clone $first_arg_array->type_param]); - } - - if (!$array_type->type_params[0]->hasString()) { - if ($array_type->type_params[1]->isString()) { - $array_type = new TList(Type::getString()); - } elseif ($array_type->type_params[1]->isInt()) { - $array_type = new TList(Type::getInt()); - } else { - $array_type = new TList(Type::getMixed()); - } - } - - return new Union([$array_type]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php deleted file mode 100644 index 5499ad27..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php +++ /dev/null @@ -1,80 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_unique']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - $first_arg = $call_args[0]->value ?? null; - - $first_arg_array = $first_arg - && ($first_arg_type = $statements_source->node_data->getType($first_arg)) - && $first_arg_type->hasType('array') - && ($array_atomic_type = $first_arg_type->getAtomicTypes()['array']) - && ($array_atomic_type instanceof TArray - || $array_atomic_type instanceof TKeyedArray - || $array_atomic_type instanceof TList) - ? $array_atomic_type - : null; - - if (!$first_arg_array) { - return Type::getArray(); - } - - if ($first_arg_array instanceof TArray) { - $first_arg_array = clone $first_arg_array; - - if ($first_arg_array instanceof TNonEmptyArray) { - $first_arg_array->count = null; - } - - return new Union([$first_arg_array]); - } - - if ($first_arg_array instanceof TList) { - if ($first_arg_array instanceof TNonEmptyList) { - return new Union([ - new TNonEmptyArray([ - Type::getInt(), - clone $first_arg_array->type_param - ]) - ]); - } - - return new Union([ - new TArray([ - Type::getInt(), - clone $first_arg_array->type_param - ]) - ]); - } - - return new Union([$first_arg_array->getGenericArrayType()]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php deleted file mode 100644 index 0544510f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php +++ /dev/null @@ -1,88 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['array_values']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - $first_arg = $call_args[0]->value ?? null; - - if (!$first_arg) { - return Type::getArray(); - } - - $first_arg_type = $statements_source->node_data->getType($first_arg); - - if (!$first_arg_type) { - return Type::getArray(); - } - - $atomic_types = $first_arg_type->getAtomicTypes(); - - $return_atomic_type = null; - - while ($atomic_type = array_shift($atomic_types)) { - if ($atomic_type instanceof TTemplateParam) { - $atomic_types = array_merge($atomic_types, $atomic_type->as->getAtomicTypes()); - continue; - } - - if ($atomic_type instanceof TKeyedArray) { - $atomic_type = $atomic_type->getGenericArrayType(); - } - - if ($atomic_type instanceof TArray) { - if ($atomic_type instanceof TNonEmptyArray) { - $return_atomic_type = new TNonEmptyList( - clone $atomic_type->type_params[1] - ); - } else { - $return_atomic_type = new TList( - clone $atomic_type->type_params[1] - ); - } - } elseif ($atomic_type instanceof TList) { - $return_atomic_type = $atomic_type; - } else { - return Type::getArray(); - } - } - - if (!$return_atomic_type) { - throw new UnexpectedValueException('This should never happen'); - } - - return new Union([$return_atomic_type]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php deleted file mode 100644 index a94e5817..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php +++ /dev/null @@ -1,70 +0,0 @@ -getSource(); - $method_name_lowercase = $event->getMethodNameLowercase(); - $call_args = $event->getCallArgs(); - if (!$source instanceof StatementsAnalyzer) { - return null; - } - - $type_provider = $source->getNodeTypeProvider(); - $codebase = $source->getCodebase(); - - if ($method_name_lowercase === 'fromcallable') { - $closure_types = []; - - if (isset($call_args[0]) - && ($input_type = $type_provider->getType($call_args[0]->value)) - ) { - foreach ($input_type->getAtomicTypes() as $atomic_type) { - $candidate_callable = CallableTypeComparator::getCallableFromAtomic( - $codebase, - $atomic_type, - null, - $source, - true - ); - - if ($candidate_callable) { - $closure_types[] = new TClosure( - 'Closure', - $candidate_callable->params, - $candidate_callable->return_type, - $candidate_callable->is_pure - ); - } else { - return Type::getClosure(); - } - } - } - - if ($closure_types) { - return TypeCombiner::combine($closure_types, $codebase); - } - - return Type::getClosure(); - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php deleted file mode 100644 index 6d7723bf..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php +++ /dev/null @@ -1,42 +0,0 @@ -getSource(); - $call_args = $event->getCallArgs(); - $method_name_lowercase = $event->getMethodNameLowercase(); - - if ($method_name_lowercase !== 'appendchild') { - return null; - } - - if (!$source instanceof StatementsAnalyzer - || !$call_args - ) { - return Type::getMixed(); - } - - if (($first_arg_type = $source->node_data->getType($call_args[0]->value)) - && $first_arg_type->hasObjectType() - ) { - return clone $first_arg_type; - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php deleted file mode 100644 index 81001ff9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php +++ /dev/null @@ -1,102 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['explode']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - if (count($call_args) >= 2) { - $second_arg_type = $statements_source->node_data->getType($call_args[1]->value); - - $inner_type = new Union([ - $second_arg_type && $second_arg_type->hasLowercaseString() - ? new TLowercaseString() - : new TString - ]); - - $can_return_empty = isset($call_args[2]) - && ( - !$call_args[2]->value instanceof PhpParser\Node\Scalar\LNumber - || $call_args[2]->value->value < 0 - ); - - if ($call_args[0]->value instanceof PhpParser\Node\Scalar\String_) { - if ($call_args[0]->value->value === '') { - return Type::getFalse(); - } - - return new Union([ - $can_return_empty - ? new TList($inner_type) - : new TNonEmptyList($inner_type) - ]); - } - - if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value)) - && $first_arg_type->hasString()) { - $can_be_false = true; - if ($first_arg_type->isString()) { - $can_be_false = false; - foreach ($first_arg_type->getAtomicTypes() as $string_type) { - if (!($string_type instanceof TNonEmptyString)) { - $can_be_false = true; - break; - } - } - } - if ($can_be_false) { - $array_type = new Union([ - $can_return_empty - ? new TList($inner_type) - : new TNonEmptyList($inner_type), - new TFalse - ]); - - if ($statements_source->getCodebase()->config->ignore_internal_falsable_issues) { - $array_type->ignore_falsable_issues = true; - } - } else { - $array_type = new Union([ - $can_return_empty - ? new TList($inner_type) - : new TNonEmptyList($inner_type), - ]); - } - - return $array_type; - } - } - - return Type::getMixed(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php deleted file mode 100644 index 3ebc5e1d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php +++ /dev/null @@ -1,170 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['filter_var']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $function_id = $event->getFunctionId(); - $code_location = $event->getCodeLocation(); - if (!$statements_source instanceof StatementsAnalyzer) { - throw new UnexpectedValueException(); - } - - $filter_type = null; - - if (isset($call_args[1]) - && ($second_arg_type = $statements_source->node_data->getType($call_args[1]->value)) - && $second_arg_type->isSingleIntLiteral() - ) { - $filter_type_type = $second_arg_type->getSingleIntLiteral(); - - switch ($filter_type_type->value) { - case FILTER_VALIDATE_INT: - $filter_type = Type::getInt(); - break; - - case FILTER_VALIDATE_FLOAT: - $filter_type = Type::getFloat(); - break; - - case FILTER_VALIDATE_BOOLEAN: - $filter_type = Type::getBool(); - - break; - - case FILTER_VALIDATE_IP: - case FILTER_VALIDATE_MAC: - case FILTER_VALIDATE_REGEXP: - case FILTER_VALIDATE_URL: - case FILTER_VALIDATE_EMAIL: - case FILTER_VALIDATE_DOMAIN: - $filter_type = Type::getString(); - break; - } - - $has_object_like = false; - $filter_null = false; - - if (isset($call_args[2]) - && ($third_arg_type = $statements_source->node_data->getType($call_args[2]->value)) - && $filter_type - ) { - foreach ($third_arg_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TKeyedArray) { - $has_object_like = true; - - if (isset($atomic_type->properties['options']) - && $atomic_type->properties['options']->hasArray() - && ($options_array = $atomic_type->properties['options']->getAtomicTypes()['array'] ?? null) - && $options_array instanceof TKeyedArray - && isset($options_array->properties['default']) - ) { - $filter_type = Type::combineUnionTypes( - $filter_type, - $options_array->properties['default'] - ); - } else { - $filter_type->addType(new TFalse); - } - - if (isset($atomic_type->properties['flags']) - && $atomic_type->properties['flags']->isSingleIntLiteral() - ) { - $filter_flag_type = - $atomic_type->properties['flags']->getSingleIntLiteral(); - - if ($filter_type->hasBool() - && $filter_flag_type->value === FILTER_NULL_ON_FAILURE - ) { - $filter_type->addType(new TNull); - } - } - } elseif ($atomic_type instanceof TLiteralInt) { - if ($atomic_type->value === FILTER_NULL_ON_FAILURE) { - $filter_null = true; - $filter_type->addType(new TNull); - } - } - } - } - - if (!$has_object_like && !$filter_null && $filter_type) { - $filter_type->addType(new TFalse); - } - } - - if (!$filter_type) { - $filter_type = Type::getMixed(); - } - - if ($statements_source->data_flow_graph - && !in_array('TaintedInput', $statements_source->getSuppressedIssues()) - ) { - $function_return_sink = DataFlowNode::getForMethodReturn( - $function_id, - $function_id, - null, - $code_location - ); - - $statements_source->data_flow_graph->addNode($function_return_sink); - - $function_param_sink = DataFlowNode::getForMethodArgument( - $function_id, - $function_id, - 0, - null, - $code_location - ); - - $statements_source->data_flow_graph->addNode($function_param_sink); - - $statements_source->data_flow_graph->addPath( - $function_param_sink, - $function_return_sink, - 'arg' - ); - - $filter_type->parent_nodes = [$function_return_sink->id => $function_return_sink]; - } - - return $filter_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php deleted file mode 100644 index 4f99fddd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php +++ /dev/null @@ -1,47 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return [ - 'crypt', - ]; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer - || !$call_args - ) { - return Type::getMixed(); - } - - $return_type = Type::getString(); - - if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value)) - && $first_arg_type->isString() - ) { - return $return_type; - } - - $return_type->addType(new TNull); - $return_type->ignore_nullable_issues = true; - - return $return_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php deleted file mode 100644 index 4c7d7865..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php +++ /dev/null @@ -1,41 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return [ - 'get_class_methods', - ]; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer - || !$call_args - ) { - return Type::getMixed(); - } - - if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value)) - && ($first_arg_type->hasObjectType() || $first_arg_type->hasString()) - ) { - return Type::parseString('array'); - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php deleted file mode 100644 index cc8a43da..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php +++ /dev/null @@ -1,131 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return [ - 'get_object_vars', - ]; - } - - public static function getGetObjectVarsReturnType( - Union $first_arg_type, - SourceAnalyzer $statements_source, - Context $context, - CodeLocation $location - ): Union { - if ($first_arg_type->isSingle()) { - $atomics = $first_arg_type->getAtomicTypes(); - $object_type = reset($atomics); - - if ($object_type instanceof TObjectWithProperties) { - if ([] === $object_type->properties) { - return Type::parseString('array'); - } - return new Union([ - new TKeyedArray($object_type->properties) - ]); - } - - if ($object_type instanceof TNamedObject) { - if (strtolower($object_type->value) === strtolower(stdClass::class)) { - return Type::parseString('array'); - } - $codebase = $statements_source->getCodebase(); - $class_storage = $codebase->classlikes->getStorageFor($object_type->value); - - if (null === $class_storage) { - return Type::parseString('array'); - } - - if ([] === $class_storage->appearing_property_ids) { - if ($class_storage->final) { - return Type::getEmptyArray(); - } - - return Type::parseString('array'); - } - - $properties = []; - foreach ($class_storage->appearing_property_ids as $name => $property_id) { - if (ClassAnalyzer::checkPropertyVisibility( - $property_id, - $context, - $statements_source, - $location, - $statements_source->getSuppressedIssues(), - false - ) === true) { - $property_type = $codebase->properties->getPropertyType( - $property_id, - false, - $statements_source, - $context - ); - $properties[$name] = $property_type ?? Type::getMixed(); - } - } - - if ([] === $properties) { - if ($class_storage->final) { - return Type::getEmptyArray(); - } - - return Type::parseString('array'); - } - - return new Union([ - new TKeyedArray($properties) - ]); - } - } - return Type::parseString('array'); - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer - || !$call_args - ) { - return Type::getMixed(); - } - - if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value)) - && $first_arg_type->isObjectType() - ) { - return self::getGetObjectVarsReturnType( - $first_arg_type, - $statements_source, - $event->getContext(), - $event->getCodeLocation() - ); - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php deleted file mode 100644 index b6c60788..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php +++ /dev/null @@ -1,30 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['hexdec']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - return Type::getInt(true); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php deleted file mode 100644 index c97048ae..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php +++ /dev/null @@ -1,88 +0,0 @@ -getSource(); - $call_args = $event->getCallArgs(); - $method_name_lowercase = $event->getMethodNameLowercase(); - - if ($method_name_lowercase !== 'getcolor') { - return null; - } - - if (!$source instanceof StatementsAnalyzer) { - return null; - } - - if (!$call_args) { - $formats = [0 => true]; - } else { - $normalized = $source->node_data->getType($call_args[0]->value) ?? Type::getMixed(); - $formats = []; - foreach ($normalized->getAtomicTypes() as $t) { - if ($t instanceof TLiteralInt && in_array($t->value, [0, 1, 2], true)) { - $formats[$t->value] = true; - } else { - $formats[0] = true; - $formats[1] = true; - $formats[2] = true; - } - } - } - $types = []; - if (isset($formats[0])) { - $types []= new Union([ - new TKeyedArray([ - 'r' => new Union([new TIntRange(0, 255)]), - 'g' => new Union([new TIntRange(0, 255)]), - 'b' => new Union([new TIntRange(0, 255)]), - 'a' => new Union([new TIntRange(0, 1)]) - ]) - ]); - } - if (isset($formats[1])) { - $types []= new Union([ - new TKeyedArray([ - 'r' => Type::getFloat(), - 'g' => Type::getFloat(), - 'b' => Type::getFloat(), - 'a' => Type::getFloat() - ]) - ]); - } - if (isset($formats[2])) { - $types []= new Union([ - new TKeyedArray([ - 'r' => new Union([new TIntRange(0, 255)]), - 'g' => new Union([new TIntRange(0, 255)]), - 'b' => new Union([new TIntRange(0, 255)]), - 'a' => new Union([new TIntRange(0, 255)]) - ]) - ]); - } - - assert($types !== []); - return Type::combineUnionTypeArray($types, $event->getSource()->getCodebase()); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php deleted file mode 100644 index 519984f2..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php +++ /dev/null @@ -1,84 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['in_array']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $call_args = $event->getCallArgs(); - $bool = Type::getBool(); - - if (!isset($call_args[0]) || !isset($call_args[1])) { - return $bool; - } - - $needle_type = $event->getStatementsSource()->getNodeTypeProvider()->getType($call_args[0]->value); - $haystack_type = $event->getStatementsSource()->getNodeTypeProvider()->getType($call_args[1]->value); - - if ($needle_type === null || $haystack_type === null) { - return $bool; - } - - $false = Type::getFalse(); - $false->from_docblock = $bool->from_docblock = $needle_type->from_docblock || $haystack_type->from_docblock; - - if (!isset($call_args[2])) { - return $bool; - } - - $strict_type = $event->getStatementsSource()->getNodeTypeProvider()->getType($call_args[2]->value); - - if ($strict_type === null || !$strict_type->isTrue()) { - return $bool; - } - - /** - * @var TKeyedArray|TArray|TList|null - */ - $array_arg_type = ($types = $haystack_type->getAtomicTypes()) && isset($types['array']) - ? $types['array'] - : null; - - if ($array_arg_type instanceof TKeyedArray) { - $array_arg_type = $array_arg_type->getGenericArrayType(); - } - - if ($array_arg_type instanceof TList) { - $array_arg_type = new TArray([Type::getInt(), $array_arg_type->type_param]); - } - - if (!$array_arg_type instanceof TArray) { - return $bool; - } - - $haystack_item_type = $array_arg_type->type_params[1]; - - if (UnionTypeComparator::canExpressionTypesBeIdentical( - $event->getStatementsSource()->getCodebase(), - $needle_type, - $haystack_item_type - )) { - return $bool; - } - - return $false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php deleted file mode 100644 index 52d26475..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php +++ /dev/null @@ -1,129 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return [ - 'iterator_to_array', - ]; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $function_id = $event->getFunctionId(); - $context = $event->getContext(); - if (!$statements_source instanceof StatementsAnalyzer - || !$call_args - ) { - return Type::getMixed(); - } - - if (($first_arg_type = $statements_source->node_data->getType($call_args[0]->value))) { - $key_type = null; - $value_type = null; - - $codebase = $statements_source->getCodebase(); - - $atomic_types = $first_arg_type->getAtomicTypes(); - - while ($call_arg_atomic_type = array_shift($atomic_types)) { - if ($call_arg_atomic_type instanceof TTemplateParam) { - $atomic_types = array_merge($atomic_types, $call_arg_atomic_type->as->getAtomicTypes()); - continue; - } - - if ($call_arg_atomic_type instanceof TNamedObject - && AtomicTypeComparator::isContainedBy( - $codebase, - $call_arg_atomic_type, - new TIterable([Type::getMixed(), Type::getMixed()]) - ) - ) { - $has_valid_iterator = true; - ForeachAnalyzer::handleIterable( - $statements_source, - $call_arg_atomic_type, - $call_args[0]->value, - $codebase, - $context, - $key_type, - $value_type, - $has_valid_iterator - ); - } - } - - if ($value_type) { - $second_arg_type = isset($call_args[1]) - ? $statements_source->node_data->getType($call_args[1]->value) - : null; - - if ($second_arg_type - && ((string) $second_arg_type === 'false') - ) { - return new Union([ - new TList($value_type), - ]); - } - - $key_type = $key_type - && (!isset($call_args[1]) - || ($second_arg_type && ((string) $second_arg_type === 'true'))) - ? $key_type - : Type::getArrayKey(); - - if ($key_type->hasMixed()) { - $key_type = Type::getArrayKey(); - } - - if ($key_type->isSingle() && $key_type->hasTemplate()) { - $template_types = $key_type->getTemplateTypes(); - $template_type = array_shift($template_types); - if ($template_type->as->hasMixed()) { - $template_type->as = Type::getArrayKey(); - $key_type = new Union([$template_type]); - } - } - - return new Union([ - new TArray([ - $key_type, - $value_type, - ]), - ]); - } - } - - $callmap_callables = InternalCallMapHandler::getCallablesFromCallMap($function_id); - - assert($callmap_callables && $callmap_callables[0]->return_type); - - return $callmap_callables[0]->return_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php deleted file mode 100644 index 1a24e22b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php +++ /dev/null @@ -1,143 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['min', 'max']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union - { - $call_args = $event->getCallArgs(); - if (count($call_args) === 0) { - return null; - } - - $statements_source = $event->getStatementsSource(); - $nodeTypeProvider = $statements_source->getNodeTypeProvider(); - - if (count($call_args) === 1 - && ($array_arg_type = $nodeTypeProvider->getType($call_args[0]->value)) - && $array_arg_type->isSingle() - && $array_arg_type->hasArray() - && ($array_type = ArrayType::infer($array_arg_type->getAtomicTypes()['array'])) - ) { - return $array_type->value; - } - - $all_int = true; - $min_bounds = []; - $max_bounds = []; - foreach ($call_args as $arg) { - if ($array_arg_type = $nodeTypeProvider->getType($arg->value)) { - foreach ($array_arg_type->getAtomicTypes() as $atomic_type) { - if (!$atomic_type instanceof TInt) { - $all_int = false; - break; - } - - if ($atomic_type instanceof TLiteralInt) { - $min_bounds[] = $atomic_type->value; - $max_bounds[] = $atomic_type->value; - } elseif ($atomic_type instanceof TIntRange) { - $min_bounds[] = $atomic_type->min_bound; - $max_bounds[] = $atomic_type->max_bound; - } elseif ($atomic_type instanceof TPositiveInt) { - $min_bounds[] = 1; - $max_bounds[] = null; - } elseif (get_class($atomic_type) === TInt::class) { - $min_bounds[] = null; - $max_bounds[] = null; - } else { - throw new UnexpectedValueException('Unexpected type'); - } - } - } else { - return Type::getMixed(); - } - } - - if ($all_int) { - if ($event->getFunctionId() === 'min') { - assert(count($min_bounds) !== 0); - //null values in $max_bounds doesn't make sense for min() so we remove them - $max_bounds = array_filter($max_bounds, function ($v) { - return $v !== null; - }) ?: [null]; - - $min_potential_int = in_array(null, $min_bounds, true) ? null : min($min_bounds); - $max_potential_int = in_array(null, $max_bounds, true) ? null : min($max_bounds); - } else { - assert(count($max_bounds) !== 0); - //null values in $min_bounds doesn't make sense for max() so we remove them - $min_bounds = array_filter($min_bounds, function ($v) { - return $v !== null; - }) ?: [null]; - - $min_potential_int = in_array(null, $min_bounds, true) ? null : max($min_bounds); - $max_potential_int = in_array(null, $max_bounds, true) ? null : max($max_bounds); - } - - if ($min_potential_int === null && $max_potential_int === null) { - return Type::getInt(); - } - - if ($min_potential_int === $max_potential_int) { - return Type::getInt(false, $min_potential_int); - } - - return new Union([new TIntRange($min_potential_int, $max_potential_int)]); - } - - //if we're dealing with non-int elements, just combine them all together - $return_type = null; - foreach ($call_args as $arg) { - if ($array_arg_type = $nodeTypeProvider->getType($arg->value)) { - if ($array_arg_type->isSingle()) { - $atomic_type = $array_arg_type->getSingleAtomic(); - if ($atomic_type instanceof TPositiveInt) { - //we replace TPositiveInt with a range for better combination - $array_arg_type->removeType('int'); - $array_arg_type->addType(new TIntRange(1, null)); - } - } - - $return_type = Type::combineUnionTypes( - $return_type, - $array_arg_type - ); - } else { - return Type::getMixed(); - } - } - - return $return_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php deleted file mode 100644 index 4b9ea038..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php +++ /dev/null @@ -1,51 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return [ - 'mktime', - ]; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - foreach ($call_args as $call_arg) { - if (!($call_arg_type = $statements_source->node_data->getType($call_arg->value)) - || !$call_arg_type->isInt() - ) { - $value_type = new Union([new TInt, new TFalse]); - - $codebase = $statements_source->getCodebase(); - - if ($codebase->config->ignore_internal_falsable_issues) { - $value_type->ignore_falsable_issues = true; - } - - return $value_type; - } - } - - return Type::getInt(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php deleted file mode 100644 index 6d51c7d2..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php +++ /dev/null @@ -1,163 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['parse_url']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - if (isset($call_args[1])) { - $is_default_component = false; - if ($component_type = $statements_source->node_data->getType($call_args[1]->value)) { - if (!$component_type->hasMixed()) { - $codebase = $statements_source->getCodebase(); - - $acceptable_string_component_type = new Union([ - new TLiteralInt(PHP_URL_SCHEME), - new TLiteralInt(PHP_URL_USER), - new TLiteralInt(PHP_URL_PASS), - new TLiteralInt(PHP_URL_HOST), - new TLiteralInt(PHP_URL_PATH), - new TLiteralInt(PHP_URL_QUERY), - new TLiteralInt(PHP_URL_FRAGMENT), - ]); - - $acceptable_int_component_type = new Union([ - new TLiteralInt(PHP_URL_PORT), - ]); - - if (UnionTypeComparator::isContainedBy( - $codebase, - $component_type, - $acceptable_string_component_type - )) { - $nullable_falsable_string = new Union([ - new TString, - new TFalse, - new TNull, - ]); - - $codebase = $statements_source->getCodebase(); - - if ($codebase->config->ignore_internal_nullable_issues) { - $nullable_falsable_string->ignore_nullable_issues = true; - } - - if ($codebase->config->ignore_internal_falsable_issues) { - $nullable_falsable_string->ignore_falsable_issues = true; - } - - return $nullable_falsable_string; - } - - if (UnionTypeComparator::isContainedBy( - $codebase, - $component_type, - $acceptable_int_component_type - )) { - $nullable_falsable_int = new Union([ - new TInt, - new TFalse, - new TNull, - ]); - - $codebase = $statements_source->getCodebase(); - - if ($codebase->config->ignore_internal_nullable_issues) { - $nullable_falsable_int->ignore_nullable_issues = true; - } - - if ($codebase->config->ignore_internal_falsable_issues) { - $nullable_falsable_int->ignore_falsable_issues = true; - } - - return $nullable_falsable_int; - } - - if ($component_type->isSingleIntLiteral()) { - $component_type_type = $component_type->getSingleIntLiteral(); - $is_default_component = $component_type_type->value <= -1; - } - } - } - - if (!$is_default_component) { - $nullable_string_or_int = new Union([ - new TString, - new TInt, - new TNull, - ]); - - $codebase = $statements_source->getCodebase(); - - if ($codebase->config->ignore_internal_nullable_issues) { - $nullable_string_or_int->ignore_nullable_issues = true; - } - - return $nullable_string_or_int; - } - } - - $component_types = [ - 'scheme' => Type::getString(), - 'user' => Type::getString(), - 'pass' => Type::getString(), - 'host' => Type::getString(), - 'port' => Type::getInt(), - 'path' => Type::getString(), - 'query' => Type::getString(), - 'fragment' => Type::getString(), - ]; - - foreach ($component_types as $component_type) { - $component_type->possibly_undefined = true; - } - - $return_type = new Union([ - new TKeyedArray($component_types), - new TFalse(), - ]); - - if ($statements_source->getCodebase()->config->ignore_internal_falsable_issues) { - $return_type->ignore_falsable_issues = true; - } - - return $return_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php deleted file mode 100644 index 86ee1271..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php +++ /dev/null @@ -1,115 +0,0 @@ -getSource(); - $call_args = $event->getCallArgs(); - $method_name_lowercase = $event->getMethodNameLowercase(); - if ($method_name_lowercase === 'fetch' - && class_exists('PDO') - && isset($call_args[0]) - && ($first_arg_type = $source->getNodeTypeProvider()->getType($call_args[0]->value)) - && $first_arg_type->isSingleIntLiteral() - ) { - $fetch_mode = $first_arg_type->getSingleIntLiteral()->value; - - switch ($fetch_mode) { - case PDO::FETCH_ASSOC: // array|false - return new Union([ - new TArray([ - Type::getString(), - new Union([ - new TScalar(), - new TNull() - ]) - ]), - new TFalse(), - ]); - - case PDO::FETCH_BOTH: // array|false - return new Union([ - new TArray([ - Type::getArrayKey(), - new Union([ - new TScalar(), - new TNull() - ]) - ]), - new TFalse(), - ]); - - case PDO::FETCH_BOUND: // bool - return Type::getBool(); - - case PDO::FETCH_CLASS: // object|false - return new Union([ - new TObject(), - new TFalse(), - ]); - - case PDO::FETCH_LAZY: // object|false - // This actually returns a PDORow object, but that class is - // undocumented, and its attributes are all dynamic anyway - return new Union([ - new TObject(), - new TFalse(), - ]); - - case PDO::FETCH_NAMED: // array>|false - return new Union([ - new TArray([ - Type::getString(), - new Union([ - new TScalar(), - new TList(Type::getScalar()) - ]) - ]), - new TFalse(), - ]); - - case PDO::FETCH_NUM: // list|false - return new Union([ - new TList( - new Union([ - new TScalar(), - new TNull() - ]) - ), - new TFalse(), - ]); - - case PDO::FETCH_OBJ: // stdClass|false - return new Union([ - new TNamedObject('stdClass'), - new TFalse(), - ]); - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php deleted file mode 100644 index e352ffd4..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php +++ /dev/null @@ -1,111 +0,0 @@ - - */ - public static function getMethodParams(MethodParamsProviderEvent $event): ?array - { - $statements_source = $event->getStatementsSource(); - $method_name_lowercase = $event->getMethodNameLowercase(); - $context = $event->getContext(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return null; - } - - if ($method_name_lowercase === 'setfetchmode') { - if (!$context - || !$call_args - || ExpressionAnalyzer::analyze( - $statements_source, - $call_args[0]->value, - $context - ) === false - ) { - return null; - } - - if (($first_call_arg_type = $statements_source->node_data->getType($call_args[0]->value)) - && $first_call_arg_type->isSingleIntLiteral() - ) { - $params = [ - new FunctionLikeParameter( - 'mode', - false, - Type::getInt(), - null, - null, - false - ), - ]; - - $value = $first_call_arg_type->getSingleIntLiteral()->value; - - switch ($value) { - case PDO::FETCH_COLUMN: - $params[] = new FunctionLikeParameter( - 'colno', - false, - Type::getInt(), - null, - null, - false - ); - break; - - case PDO::FETCH_CLASS: - $params[] = new FunctionLikeParameter( - 'classname', - false, - Type::getClassString(), - null, - null, - false - ); - - $params[] = new FunctionLikeParameter( - 'ctorargs', - false, - Type::getArray(), - null, - null, - true - ); - break; - - case PDO::FETCH_INTO: - $params[] = new FunctionLikeParameter( - 'object', - false, - Type::getObject(), - null, - null, - false - ); - break; - } - - return $params; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php deleted file mode 100644 index 32530db9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php +++ /dev/null @@ -1,70 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['rand', 'mt_rand', 'random_int']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union - { - $call_args = $event->getCallArgs(); - if (count($call_args) === 0) { - return Type::getInt(); - } - - if (count($call_args) !== 2) { - return null; - } - - $statements_source = $event->getStatementsSource(); - $nodeTypeProvider = $statements_source->getNodeTypeProvider(); - - $first_arg = $nodeTypeProvider->getType($call_args[0]->value); - $second_arg = $nodeTypeProvider->getType($call_args[1]->value); - - $min_value = null; - if ($first_arg !== null && $first_arg->isSingle()) { - $first_atomic_type = $first_arg->getSingleAtomic(); - if ($first_atomic_type instanceof TLiteralInt) { - $min_value = $first_atomic_type->value; - } elseif ($first_atomic_type instanceof TIntRange) { - $min_value = $first_atomic_type->min_bound; - } elseif ($first_atomic_type instanceof TPositiveInt) { - $min_value = 1; - } - } - - $max_value = null; - if ($second_arg !== null && $second_arg->isSingle()) { - $second_atomic_type = $second_arg->getSingleAtomic(); - if ($second_atomic_type instanceof TLiteralInt) { - $max_value = $second_atomic_type->value; - } elseif ($second_atomic_type instanceof TIntRange) { - $max_value = $second_atomic_type->max_bound; - } elseif ($second_atomic_type instanceof TPositiveInt) { - // no max value, we keep null - } - } - - return new Union([new TIntRange($min_value, $max_value)]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php deleted file mode 100644 index 88e71c38..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php +++ /dev/null @@ -1,31 +0,0 @@ -getCallArgs(); - $method_name_lowercase = $event->getMethodNameLowercase(); - if ($method_name_lowercase === 'asxml' - && !count($call_args) - ) { - return Type::parseString('string|false'); - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php deleted file mode 100644 index d32da31e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php +++ /dev/null @@ -1,64 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return [ - 'str_replace', - 'str_ireplace', - 'substr_replace', - 'preg_replace', - 'preg_replace_callback', - ]; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $function_id = $event->getFunctionId(); - if (!$statements_source instanceof StatementsAnalyzer - || count($call_args) < 3 - ) { - return Type::getMixed(); - } - - if ($subject_type = $statements_source->node_data->getType($call_args[2]->value)) { - if (!$subject_type->hasString() && $subject_type->hasArray()) { - return Type::getArray(); - } - - $return_type = Type::getString(); - - if (in_array($function_id, ['preg_replace', 'preg_replace_callback'], true)) { - $return_type->addType(new TNull()); - - $codebase = $statements_source->getCodebase(); - - if ($codebase->config->ignore_internal_nullable_issues) { - $return_type->ignore_nullable_issues = true; - } - } - - return $return_type; - } - - return Type::getMixed(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php deleted file mode 100644 index cb3b0195..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php +++ /dev/null @@ -1,72 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return [ - 'strtr', - ]; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $function_id = $event->getFunctionId(); - $code_location = $event->getCodeLocation(); - if (!$statements_source instanceof StatementsAnalyzer) { - throw new UnexpectedValueException(); - } - - $type = Type::getString(); - - if ($statements_source->data_flow_graph - && !in_array('TaintedInput', $statements_source->getSuppressedIssues())) { - $function_return_sink = DataFlowNode::getForMethodReturn( - $function_id, - $function_id, - null, - $code_location - ); - - $statements_source->data_flow_graph->addNode($function_return_sink); - foreach ($call_args as $i => $_) { - $function_param_sink = DataFlowNode::getForMethodArgument( - $function_id, - $function_id, - $i, - null, - $code_location - ); - - $statements_source->data_flow_graph->addNode($function_param_sink); - - $statements_source->data_flow_graph->addPath( - $function_param_sink, - $function_return_sink, - 'arg' - ); - } - - $type->parent_nodes = [$function_return_sink->id => $function_return_sink]; - } - - return $type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php deleted file mode 100644 index 385c6b61..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php +++ /dev/null @@ -1,74 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['trigger_error']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union - { - $codebase = $event->getStatementsSource()->getCodebase(); - $config = $codebase->config; - if ($config->trigger_error_exits === 'always') { - return new Union([new TNever()]); - } - - if ($config->trigger_error_exits === 'never') { - return new Union([new TTrue()]); - } - - //default behaviour - $call_args = $event->getCallArgs(); - $statements_source = $event->getStatementsSource(); - if (isset($call_args[1]) - && ($array_arg_type = $statements_source->getNodeTypeProvider()->getType($call_args[1]->value)) - ) { - $return_types = []; - foreach ($array_arg_type->getAtomicTypes() as $atomicType) { - if ($atomicType instanceof TLiteralInt) { - if (in_array($atomicType->value, [E_USER_WARNING, E_USER_DEPRECATED, E_USER_NOTICE], true)) { - $return_types[] = new TTrue(); - } elseif ($atomicType->value === E_USER_ERROR) { - $return_types[] = new TNever(); - } else { - // not recognized int literal. return false before PHP8, fatal error since - $return_types[] = new TFalse(); - } - } else { - $return_types[] = new TBool(); - } - } - - return TypeCombiner::combine($return_types, $codebase); - } - - //default value is E_USER_NOTICE, so return true - return new Union([new TTrue()]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php deleted file mode 100644 index cab2b999..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php +++ /dev/null @@ -1,82 +0,0 @@ - - */ - public static function getFunctionIds(): array - { - return ['version_compare']; - } - - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Union - { - $statements_source = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - if (!$statements_source instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - if (count($call_args) > 2) { - $operator_type = $statements_source->node_data->getType($call_args[2]->value); - - 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'), - ]); - - $codebase = $statements_source->getCodebase(); - - if (UnionTypeComparator::isContainedBy( - $codebase, - $operator_type, - $acceptable_operator_type - )) { - return Type::getBool(); - } - } - } - - return new Union([ - new TBool, - new TNull, - ]); - } - - return new Union([ - new TLiteralInt(-1), - new TLiteralInt(0), - new TLiteralInt(1), - ]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php deleted file mode 100644 index 431cb158..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php +++ /dev/null @@ -1,538 +0,0 @@ -> - */ - private $unchanged_members = []; - - /** - * @var array> - */ - private $unchanged_signature_members = []; - - /** - * @var array> - */ - private $changed_members = []; - - /** - * @var array - */ - private $errors = []; - - /** - * @var array> - */ - private $diff_map = []; - - /** - * @var array> - */ - private $deletion_ranges = []; - - /** - * @var PhpParser\Lexer|null - */ - private static $lexer; - - /** - * @var PhpParser\Parser|null - */ - private static $parser; - - public function __construct( - FileProvider $file_provider, - ?ParserCacheProvider $parser_cache_provider = null, - ?FileStorageCacheProvider $file_storage_cache_provider = null - ) { - $this->file_provider = $file_provider; - $this->parser_cache_provider = $parser_cache_provider; - $this->this_modified_time = filemtime(__FILE__); - $this->file_storage_cache_provider = $file_storage_cache_provider; - $this->statements_volatile_cache = StatementsVolatileCache::getInstance(); - } - - /** - * @return list - */ - public function getStatementsForFile(string $file_path, string $php_version, ?Progress $progress = null): array - { - unset($this->errors[$file_path]); - - if ($progress === null) { - $progress = new VoidProgress(); - } - - $from_cache = false; - - $version = PHP_PARSER_VERSION . $this->this_modified_time; - - $file_contents = $this->file_provider->getContents($file_path); - $modified_time = $this->file_provider->getModifiedTime($file_path); - - $config = Config::getInstance(); - - $file_content_hash = md5($version . $file_contents); - - if (!$this->parser_cache_provider - || (!$config->isInProjectDirs($file_path) && strpos($file_path, 'vendor')) - ) { - $cache_key = "{$file_content_hash}:{$php_version}"; - if ($this->statements_volatile_cache->has($cache_key)) { - return $this->statements_volatile_cache->get($cache_key); - } - - $progress->debug('Parsing ' . $file_path . "\n"); - - $has_errors = false; - - $stmts = self::parseStatements($file_contents, $php_version, $has_errors, $file_path); - - $this->statements_volatile_cache->set($cache_key, $stmts); - - return $stmts; - } - - $stmts = $this->parser_cache_provider->loadStatementsFromCache( - $file_path, - $modified_time, - $file_content_hash - ); - - if ($stmts === null) { - $progress->debug('Parsing ' . $file_path . "\n"); - - $existing_statements = $this->parser_cache_provider->loadExistingStatementsFromCache($file_path); - - if ($existing_statements && !$existing_statements[0] instanceof PhpParser\Node\Stmt) { - $existing_statements = null; - } - - $existing_file_contents = $this->parser_cache_provider->loadExistingFileContentsFromCache($file_path); - - // this happens after editing temporary file - if ($existing_file_contents === $file_contents && $existing_statements) { - $this->diff_map[$file_path] = []; - $this->parser_cache_provider->saveStatementsToCache( - $file_path, - $file_content_hash, - $existing_statements, - true - ); - - return $existing_statements; - } - - $file_changes = null; - - $existing_statements_copy = null; - - if ($existing_statements - && $existing_file_contents - && abs(strlen($existing_file_contents) - strlen($file_contents)) < 5000 - ) { - $file_changes = FileDiffer::getDiff($existing_file_contents, $file_contents); - - if (count($file_changes) < 10) { - $traverser = new PhpParser\NodeTraverser; - $traverser->addVisitor(new CloningVisitor); - // performs a deep clone - /** @var list */ - $existing_statements_copy = $traverser->traverse($existing_statements); - } else { - $file_changes = null; - } - } - - $has_errors = false; - - $stmts = self::parseStatements( - $file_contents, - $php_version, - $has_errors, - $file_path, - $existing_file_contents, - $existing_statements_copy, - $file_changes - ); - - if ($existing_file_contents && $existing_statements && (!$has_errors || $stmts)) { - [$unchanged_members, $unchanged_signature_members, $changed_members, $diff_map, $deletion_ranges] - = FileStatementsDiffer::diff( - $existing_statements, - $stmts, - $existing_file_contents, - $file_contents - ); - - $unchanged_members = array_map( - function (int $_): bool { - return true; - }, - array_flip($unchanged_members) - ); - - $unchanged_signature_members = array_map( - function (int $_): bool { - return true; - }, - array_flip($unchanged_signature_members) - ); - - $file_path_hash = md5($file_path); - - $changed_members = array_map( - function (string $key) use ($file_path_hash): string { - if (strpos($key, 'use:') === 0) { - return $key . ':' . $file_path_hash; - } - - return $key; - }, - $changed_members - ); - - $changed_members = array_map( - /** - * @param int $_ - * - * @return bool - */ - function ($_): bool { - return true; - }, - array_flip($changed_members) - ); - - if (isset($this->unchanged_members[$file_path])) { - $this->unchanged_members[$file_path] = array_intersect_key( - $this->unchanged_members[$file_path], - $unchanged_members - ); - } else { - $this->unchanged_members[$file_path] = $unchanged_members; - } - - if (isset($this->unchanged_signature_members[$file_path])) { - $this->unchanged_signature_members[$file_path] = array_intersect_key( - $this->unchanged_signature_members[$file_path], - $unchanged_signature_members - ); - } else { - $this->unchanged_signature_members[$file_path] = $unchanged_signature_members; - } - - if (isset($this->changed_members[$file_path])) { - $this->changed_members[$file_path] = array_merge( - $this->changed_members[$file_path], - $changed_members - ); - } else { - $this->changed_members[$file_path] = $changed_members; - } - - $this->diff_map[$file_path] = $diff_map; - $this->deletion_ranges[$file_path] = $deletion_ranges; - } elseif ($has_errors && !$stmts) { - $this->errors[$file_path] = true; - } - - if ($this->file_storage_cache_provider) { - $this->file_storage_cache_provider->removeCacheForFile($file_path); - } - - $this->parser_cache_provider->cacheFileContents($file_path, $file_contents); - } else { - $from_cache = true; - $this->diff_map[$file_path] = []; - $this->deletion_ranges[$file_path] = []; - } - - $this->parser_cache_provider->saveStatementsToCache($file_path, $file_content_hash, $stmts, $from_cache); - - if (!$stmts) { - return []; - } - - return $stmts; - } - - /** - * @return array> - */ - public function getChangedMembers(): array - { - return $this->changed_members; - } - - /** - * @param array> $more_changed_members - * - */ - public function addChangedMembers(array $more_changed_members): void - { - $this->changed_members = array_merge($more_changed_members, $this->changed_members); - } - - /** - * @return array> - */ - public function getUnchangedSignatureMembers(): array - { - return $this->unchanged_signature_members; - } - - /** - * @param array> $more_unchanged_members - * - */ - public function addUnchangedSignatureMembers(array $more_unchanged_members): void - { - $this->unchanged_signature_members = array_merge($more_unchanged_members, $this->unchanged_signature_members); - } - - /** - * @return array - */ - public function getErrors(): array - { - return $this->errors; - } - - /** - * @param array $errors - * - */ - public function addErrors(array $errors): void - { - $this->errors += $errors; - } - - public function setUnchangedFile(string $file_path): void - { - if (!isset($this->diff_map[$file_path])) { - $this->diff_map[$file_path] = []; - } - - if (!isset($this->deletion_ranges[$file_path])) { - $this->deletion_ranges[$file_path] = []; - } - } - - /** - * @return array> - */ - public function getDiffMap(): array - { - return $this->diff_map; - } - - /** - * @return array> - */ - public function getDeletionRanges(): array - { - return $this->deletion_ranges; - } - - /** - * @param array> $diff_map - * - */ - public function addDiffMap(array $diff_map): void - { - $this->diff_map = array_merge($diff_map, $this->diff_map); - } - - /** - * @param array> $deletion_ranges - * - */ - public function addDeletionRanges(array $deletion_ranges): void - { - $this->deletion_ranges = array_merge($deletion_ranges, $this->deletion_ranges); - } - - public function resetDiffs(): void - { - $this->changed_members = []; - $this->unchanged_members = []; - $this->unchanged_signature_members = []; - $this->diff_map = []; - $this->deletion_ranges = []; - } - - /** - * @param list $existing_statements - * @param array $file_changes - * - * @return list - */ - public static function parseStatements( - string $file_contents, - string $php_version, - bool &$has_errors, - ?string $file_path = null, - ?string $existing_file_contents = null, - ?array $existing_statements = null, - ?array $file_changes = null - ): array { - $attributes = [ - 'comments', 'startLine', 'startFilePos', 'endFilePos', - ]; - - if (!self::$lexer) { - self::$lexer = new PhpParser\Lexer\Emulative([ - 'usedAttributes' => $attributes, - 'phpVersion' => $php_version, - ]); - } - - if (!self::$parser) { - self::$parser = (new PhpParser\ParserFactory())->create(PhpParser\ParserFactory::ONLY_PHP7, self::$lexer); - } - - $used_cached_statements = false; - - $error_handler = new Collecting(); - - if ($existing_statements && $file_changes && $existing_file_contents) { - $clashing_traverser = new CustomTraverser; - $offset_analyzer = new PartialParserVisitor( - self::$parser, - $error_handler, - $file_changes, - $existing_file_contents, - $file_contents - ); - $clashing_traverser->addVisitor($offset_analyzer); - $clashing_traverser->traverse($existing_statements); - - if (!$offset_analyzer->mustRescan()) { - $used_cached_statements = true; - $stmts = $existing_statements; - } else { - try { - /** @var list */ - $stmts = self::$parser->parse($file_contents, $error_handler) ?: []; - } catch (Throwable $t) { - $stmts = []; - - // hope this got caught below - } - } - } else { - try { - /** @var list */ - $stmts = self::$parser->parse($file_contents, $error_handler) ?: []; - } catch (Throwable $t) { - $stmts = []; - - // hope this got caught below - } - } - - if ($error_handler->hasErrors() && $file_path) { - $config = Config::getInstance(); - $has_errors = true; - - foreach ($error_handler->getErrors() as $error) { - if ($error->hasColumnInfo()) { - IssueBuffer::maybeAdd( - new ParseError( - $error->getMessage(), - new ParseErrorLocation( - $error, - $file_contents, - $file_path, - $config->shortenFileName($file_path) - ) - ) - ); - } - } - } - - $error_handler->clearErrors(); - - $resolving_traverser = new PhpParser\NodeTraverser; - $name_resolver = new SimpleNameResolver( - $error_handler, - $used_cached_statements ? $file_changes : [] - ); - $resolving_traverser->addVisitor($name_resolver); - $resolving_traverser->traverse($stmts); - - return $stmts; - } - - public static function clearLexer(): void - { - self::$lexer = null; - } - - public static function clearParser(): void - { - self::$parser = null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php deleted file mode 100644 index 2dd19ea1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php +++ /dev/null @@ -1,108 +0,0 @@ -> - */ - protected $cache = []; - - /** - * @var array - */ - protected $access = []; - - /** - * @var int - */ - protected $max_size; - - /** - * @var ?StatementsVolatileCache - */ - protected static $instance; - - public function __construct(int $max_size = 4096) - { - $this->max_size = $max_size; - } - - public static function getInstance(): StatementsVolatileCache - { - if (is_null(self::$instance)) { - self::$instance = new self(); - } - - return self::$instance; - } - - public function has(string $key): bool - { - return array_key_exists($key, $this->cache); - } - - /** - * @param string $key - * @return list - * @throws InvalidArgumentException - */ - public function get(string $key): array - { - if (! $this->has($key)) { - throw new InvalidArgumentException('Given $key does not exists'); - } - - $access_index = array_search($key, $this->access); - if (false !== $access_index) { - array_splice($this->access, $access_index, 1); - } - $this->access[] = $key; - - return $this->cache[$key]; - } - - /** - * @param string $key - * @param list $content - */ - public function set(string $key, array $content): void - { - if (count($this->cache) > $this->max_size) { - reset($this->access); - - $oldest_key_index = key($this->access); - - if (! is_null($oldest_key_index)) { - $oldest_key = $this->access[$oldest_key_index]; - unset($this->cache[$oldest_key]); - unset($this->access[$oldest_key_index]); - } - } - - $this->cache[$key] = $content; - $this->access[] = $key; - } - - public function clearCache(): void - { - $this->cache = []; - $this->access = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php b/vendor/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php deleted file mode 100644 index 14bb1707..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php +++ /dev/null @@ -1,36 +0,0 @@ -type = clone $type; - - if ($this->type->getLiteralStrings()) { - $this->type->addType(new TString); - } - - if ($this->type->getLiteralInts()) { - $this->type->addType(new TInt); - } - - if ($this->type->getLiteralFloats()) { - $this->type->addType(new TFloat); - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php b/vendor/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php deleted file mode 100644 index 64c398d1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php +++ /dev/null @@ -1,44 +0,0 @@ -clearCache(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php deleted file mode 100644 index a9168cc3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php +++ /dev/null @@ -1,147 +0,0 @@ - - */ - public $psalm_internal = []; - - /** - * @var string[] - */ - public $mixins = []; - - /** - * @var array - */ - public $templates = []; - - /** - * @var array - */ - public $template_extends = []; - - /** - * @var array - */ - public $template_implements = []; - - /** - * @var ?string - */ - public $yield; - - /** - * @var array - */ - public $properties = []; - - /** - * @var array - */ - public $methods = []; - - /** - * @var bool - */ - public $sealed_properties = false; - - /** - * @var bool - */ - public $sealed_methods = false; - - /** - * @var bool - */ - public $override_property_visibility = false; - - /** - * @var bool - */ - public $override_method_visibility = false; - - /** - * @var bool - */ - public $mutation_free = false; - - /** - * @var bool - */ - public $external_mutation_free = false; - - /** - * @var bool - */ - public $taint_specialize = false; - - /** - * @var array - */ - public $suppressed_issues = []; - - /** - * @var list}> - */ - public $imported_types = []; - - /** - * @var bool - */ - public $consistent_constructor = false; - - /** - * @var bool - */ - public $consistent_templates = false; - - /** @var bool */ - public $stub_override = false; - - /** - * @var null|string - */ - public $extension_requirement; - - /** - * @var array - */ - public $implementation_requirements = []; - - /** - * @var ?string - */ - public $description; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php deleted file mode 100644 index 2ddf134e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php +++ /dev/null @@ -1,300 +0,0 @@ - $line) { - if (preg_match('/^[ \t]*\*?\s*@\w/i', $line)) { - $last = $k; - } elseif (preg_match('/^\s*\r?$/', $line)) { - $last = false; - } elseif ($last !== false) { - $old_last_line = $lines[$last]; - $lines[$last] = $old_last_line . "\n" . $line; - - unset($lines[$k]); - } - } - - $line_offset = 0; - - foreach ($lines as $k => $line) { - $original_line_length = strlen($line); - - $line = str_replace("\r", '', $line); - - if ($first_line_padding === null) { - $asterisk_pos = strpos($line, '*'); - - if ($asterisk_pos) { - $first_line_padding = substr($line, 0, $asterisk_pos - 1); - } - } - - if (preg_match('/^[ \t]*\*?\s*@([\w\-\\\:]+)[\t ]*(.*)$/sm', $line, $matches, PREG_OFFSET_CAPTURE)) { - /** @var array $matches */ - [, $type_info, $data_info] = $matches; - - [$type] = $type_info; - [$data, $data_offset] = $data_info; - - if (strpos($data, '*')) { - $data = rtrim(preg_replace('/^[ \t]*\*\s*$/m', '', $data)); - } - - if (empty($special[$type])) { - $special[$type] = []; - } - - $data_offset += $line_offset; - - $special[$type][$data_offset + 3 + $offsetStart] = $data; - - unset($lines[$k]); - } else { - // Strip the leading *, if present. - $text = $lines[$k]; - $text = str_replace("\t", ' ', $text); - $text = preg_replace('/^ *\*/', '', $text); - $lines[$k] = $text; - } - - $line_offset += $original_line_length + 1; - } - - // Smush the whole docblock to the left edge. - $min_indent = 80; - foreach ($lines as $k => $line) { - $indent = strspn($line, ' '); - if ($indent === strlen($line)) { - // This line consists of only spaces. Trim it completely. - $lines[$k] = ''; - continue; - } - $min_indent = min($indent, $min_indent); - } - if ($min_indent > 0) { - foreach ($lines as $k => $line) { - if (strlen($line) < $min_indent) { - continue; - } - $lines[$k] = substr($line, $min_indent); - } - } - $docblock = implode("\n", $lines); - $docblock = rtrim($docblock); - - // Trim any empty lines off the front, but leave the indent level if there - // is one. - $docblock = preg_replace('/^\s*\n/', '', $docblock); - - $parsed = new ParsedDocblock($docblock, $special, $first_line_padding ?: ''); - - self::resolveTags($parsed); - - return $parsed; - } - - private static function resolveTags(ParsedDocblock $docblock): void - { - if (isset($docblock->tags['template']) - || isset($docblock->tags['psalm-template']) - || isset($docblock->tags['phpstan-template']) - ) { - $docblock->combined_tags['template'] - = ($docblock->tags['template'] ?? []) - + ($docblock->tags['phpstan-template'] ?? []) - + ($docblock->tags['psalm-template'] ?? []); - } - - if (isset($docblock->tags['template-covariant']) - || isset($docblock->tags['psalm-template-covariant']) - || isset($docblock->tags['phpstan-template-covariant']) - ) { - $docblock->combined_tags['template-covariant'] - = ($docblock->tags['template-covariant'] ?? []) - + ($docblock->tags['phpstan-template-covariant'] ?? []) - + ($docblock->tags['psalm-template-covariant'] ?? []); - } - - if (isset($docblock->tags['template-extends']) - || isset($docblock->tags['inherits']) - || isset($docblock->tags['extends']) - || isset($docblock->tags['psalm-extends']) - || isset($docblock->tags['phpstan-extends']) - ) { - $docblock->combined_tags['extends'] - = ($docblock->tags['template-extends'] ?? []) - + ($docblock->tags['inherits'] ?? []) - + ($docblock->tags['extends'] ?? []) - + ($docblock->tags['psalm-extends'] ?? []) - + ($docblock->tags['phpstan-extends'] ?? []); - } - - if (isset($docblock->tags['template-implements']) - || isset($docblock->tags['implements']) - || isset($docblock->tags['phpstan-implements']) - || isset($docblock->tags['psalm-implements']) - ) { - $docblock->combined_tags['implements'] - = ($docblock->tags['template-implements'] ?? []) - + ($docblock->tags['implements'] ?? []) - + ($docblock->tags['phpstan-implements'] ?? []) - + ($docblock->tags['psalm-implements'] ?? []); - } - - if (isset($docblock->tags['template-use']) - || isset($docblock->tags['use']) - || isset($docblock->tags['phpstan-use']) - || isset($docblock->tags['psalm-use']) - ) { - $docblock->combined_tags['use'] - = ($docblock->tags['template-use'] ?? []) - + ($docblock->tags['use'] ?? []) - + ($docblock->tags['phpstan-use'] ?? []) - + ($docblock->tags['psalm-use'] ?? []); - } - - if (isset($docblock->tags['method']) - || isset($docblock->tags['psalm-method']) - ) { - $docblock->combined_tags['method'] - = ($docblock->tags['method'] ?? []) - + ($docblock->tags['psalm-method'] ?? []); - } - - if (isset($docblock->tags['return']) - || isset($docblock->tags['psalm-return']) - || isset($docblock->tags['phpstan-return']) - ) { - if (isset($docblock->tags['psalm-return'])) { - $docblock->combined_tags['return'] = $docblock->tags['psalm-return']; - } elseif (isset($docblock->tags['phpstan-return'])) { - $docblock->combined_tags['return'] = $docblock->tags['phpstan-return']; - } else { - $docblock->combined_tags['return'] = $docblock->tags['return']; - } - } - - if (isset($docblock->tags['param']) - || isset($docblock->tags['psalm-param']) - || isset($docblock->tags['phpstan-param']) - ) { - $docblock->combined_tags['param'] - = ($docblock->tags['param'] ?? []) - + ($docblock->tags['phpstan-param'] ?? []) - + ($docblock->tags['psalm-param'] ?? []); - } - - if (isset($docblock->tags['var']) - || isset($docblock->tags['psalm-var']) - || isset($docblock->tags['phpstan-var']) - ) { - if (!isset($docblock->tags['ignore-var']) - && !isset($docblock->tags['psalm-ignore-var']) - ) { - $docblock->combined_tags['var'] - = ($docblock->tags['var'] ?? []) - + ($docblock->tags['phpstan-var'] ?? []) - + ($docblock->tags['psalm-var'] ?? []); - } - } - - if (isset($docblock->tags['param-out']) - || isset($docblock->tags['psalm-param-out']) - ) { - $docblock->combined_tags['param-out'] - = ($docblock->tags['param-out'] ?? []) - + ($docblock->tags['psalm-param-out'] ?? []); - } - } - - /** - * @return list - * @throws DocblockParseException when a @psalm-internal tag doesn't include a namespace - */ - public static function handlePsalmInternal(ParsedDocblock $parsed_docblock): array - { - if (isset($parsed_docblock->tags['psalm-internal'])) { - $psalm_internal = array_map("trim", $parsed_docblock->tags['psalm-internal']); - - if (count($psalm_internal) !== count(array_filter($psalm_internal))) { - throw new DocblockParseException('psalm-internal annotation used without specifying namespace'); - } - // assert($psalm_internal === array_filter($psalm_internal)); // TODO get this to work - assert(self::assertArrayOfNonEmptyString($psalm_internal)); - - return array_values($psalm_internal); - } - - return []; - } - - /** @psalm-assert-if-true array $arr */ - private static function assertArrayOfNonEmptyString(array $arr): bool - { - foreach ($arr as $val) { - if (!is_string($val) || $val === "") { - return false; - } - } - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php deleted file mode 100644 index 1cc9b6ff..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php +++ /dev/null @@ -1,117 +0,0 @@ -file_path = $file_path; - $this->file_name = $file_name; - $this->will_analyze = $will_analyze; - } - - public function scan( - Codebase $codebase, - FileStorage $file_storage, - bool $storage_from_cache = false, - ?Progress $progress = null - ): void { - if ($progress === null) { - $progress = new VoidProgress(); - } - - if ((!$this->will_analyze || $file_storage->deep_scan) - && $storage_from_cache - && !$codebase->register_stub_files - ) { - return; - } - - $stmts = $codebase->statements_provider->getStatementsForFile( - $file_storage->file_path, - $codebase->php_major_version . '.' . $codebase->php_minor_version, - $progress - ); - - foreach ($stmts as $stmt) { - if (!$stmt instanceof PhpParser\Node\Stmt\ClassLike - && !$stmt instanceof PhpParser\Node\Stmt\Function_ - && !($stmt instanceof PhpParser\Node\Stmt\Expression - && $stmt->expr instanceof PhpParser\Node\Expr\Include_) - ) { - $file_storage->has_extra_statements = true; - break; - } - } - - if ($this->will_analyze) { - $progress->debug('Deep scanning ' . $file_storage->file_path . "\n"); - } else { - $progress->debug('Scanning ' . $file_storage->file_path . "\n"); - } - - $traverser = new NodeTraverser(); - $traverser->addVisitor( - new ReflectorVisitor($codebase, $this, $file_storage) - ); - - $traverser->traverse($stmts); - - $file_storage->deep_scan = $this->will_analyze; - } - - public function getFilePath(): string - { - return $this->file_path; - } - - public function getFileName(): string - { - return $this->file_name; - } - - public function getRootFilePath(): string - { - return $this->file_path; - } - - public function getRootFileName(): string - { - return $this->file_name; - } - - public function getAliases(): Aliases - { - return new Aliases(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php deleted file mode 100644 index a3819b4a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php +++ /dev/null @@ -1,228 +0,0 @@ - - */ - public $params = []; - - /** - * @var array - */ - public $params_out = []; - - /** - * @var array{type:string, line_number: int}|null - */ - public $self_out; - - /** - * @var array{type:string, line_number: int}|null - */ - public $if_this_is; - - /** - * @var array - */ - public $globals = []; - - /** - * Whether or not the function is deprecated - * - * @var bool - */ - public $deprecated = false; - - /** - * If set, the function is internal to the given namespace. - * - * @var list - */ - public $psalm_internal = []; - - /** - * Whether or not the function is internal - * - * @var bool - */ - public $internal = false; - - /** - * Whether or not the function uses get_args - * - * @var bool - */ - public $variadic = false; - - /** - * Whether or not the function is pure - * - * @var bool - */ - public $pure = false; - - /** - * Whether or not to specialize a given call (useful for taint analysis) - * - * @var bool - */ - public $specialize_call = false; - - /** - * Represents the flow from function params to return type - * - * @var array - */ - public $flows = []; - - /** - * @var array - */ - public $added_taints = []; - - /** - * @var array - */ - public $removed_taints = []; - - /** - * @var array - */ - public $taint_sink_params = []; - - /** - * @var array - */ - public $taint_source_types = []; - - /** - * @var array - */ - public $assert_untainted_params = []; - - /** - * Whether or not to ignore the nullability of this function's return type - * - * @var bool - */ - public $ignore_nullable_return = false; - - /** - * Whether or not to ignore the nullability of this function's return type - * - * @var bool - */ - public $ignore_falsable_return = false; - - /** - * @var array - */ - public $suppressed_issues = []; - - /** - * @var array - */ - public $throws = []; - - /** - * @var array - */ - public $templates = []; - - /** - * @var array - */ - public $assertions = []; - - /** - * @var array - */ - public $if_true_assertions = []; - - /** - * @var array - */ - public $if_false_assertions = []; - - /** - * @var bool - */ - public $inheritdoc = false; - - /** - * @var bool - */ - public $mutation_free = false; - - /** - * @var bool - */ - public $external_mutation_free = false; - - /** - * @var bool - */ - public $no_named_args = false; - - /** @var bool */ - public $stub_override = false; - - /** - * @var int - */ - public $since_php_major_version = 0; - - /** - * @var int - */ - public $since_php_minor_version = 0; - - /** - * @var ?string - */ - public $description; - - /** @var array, suggested_replacement?:string}> */ - public $unexpected_tags = []; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php deleted file mode 100644 index 26c5b013..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php +++ /dev/null @@ -1,95 +0,0 @@ -> */ - public $tags = []; - - /** @var array> */ - public $combined_tags = []; - - /** - * @var bool - */ - private static $shouldAddNewLineBetweenAnnotations = true; - - /** @param array> $tags */ - public function __construct(string $description, array $tags, string $first_line_padding = '') - { - $this->description = $description; - $this->tags = $tags; - $this->first_line_padding = $first_line_padding; - } - - public function render(string $left_padding): string - { - $doc_comment_text = '/**' . "\n"; - - $trimmed_description = trim($this->description); - - if ($trimmed_description !== '') { - $description_lines = explode("\n", $this->description); - - foreach ($description_lines as $line) { - $doc_comment_text .= $left_padding . ' *' . (trim($line) ? ' ' . $line : '') . "\n"; - } - } - - if ($this->tags) { - if ($trimmed_description !== '') { - $doc_comment_text .= $left_padding . ' *' . "\n"; - } - - $last_type = null; - - foreach ($this->tags as $type => $lines) { - if ($last_type !== null - && $last_type !== 'psalm-return' - && static::shouldAddNewLineBetweenAnnotations() - ) { - $doc_comment_text .= $left_padding . ' *' . "\n"; - } - - foreach ($lines as $line) { - $doc_comment_text .= $left_padding . ' * @' . $type . ($line !== '' ? ' ' . $line : '') . "\n"; - } - - $last_type = $type; - } - } - - $doc_comment_text .= $left_padding . ' */' . "\n" . $left_padding; - - return $doc_comment_text; - } - - private static function shouldAddNewLineBetweenAnnotations(): bool - { - return static::$shouldAddNewLineBetweenAnnotations; - } - - /** - * Sets whether a new line should be added between the annotations or not. - * - */ - public static function addNewLineBetweenAnnotations(bool $should = true): void - { - static::$shouldAddNewLineBetweenAnnotations = $should; - } - - public static function resetNewlineBetweenAnnotations(): void - { - static::$shouldAddNewLineBetweenAnnotations = true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php deleted file mode 100644 index c412736a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php +++ /dev/null @@ -1,398 +0,0 @@ - $args - */ - public static function handleOverride(array $args, Codebase $codebase): void - { - if (count($args) < 2) { - return; - } - - $identifier = $args[0]->value; - - if (!$args[1]->value instanceof PhpParser\Node\Expr\FuncCall - || !$args[1]->value->name instanceof PhpParser\Node\Name - ) { - return; - } - - $map = []; - - if ($args[1]->value->name->parts === ['map'] - && $args[1]->value->getArgs() - && $args[1]->value->getArgs()[0]->value instanceof PhpParser\Node\Expr\Array_ - ) { - foreach ($args[1]->value->getArgs()[0]->value->items as $array_item) { - if ($array_item - && $array_item->key instanceof PhpParser\Node\Scalar\String_ - ) { - if ($array_item->value instanceof PhpParser\Node\Expr\ClassConstFetch - && $array_item->value->class instanceof PhpParser\Node\Name\FullyQualified - && $array_item->value->name instanceof PhpParser\Node\Identifier - && strtolower($array_item->value->name->name) - ) { - $map[$array_item->key->value] = new Union([ - new TNamedObject(implode('\\', $array_item->value->class->parts)) - ]); - } elseif ($array_item->value instanceof PhpParser\Node\Scalar\String_) { - $map[$array_item->key->value] = $array_item->value->value; - } - } - } - } - - $type_offset = null; - - if ($args[1]->value->name->parts === ['type'] - && $args[1]->value->getArgs() - && $args[1]->value->getArgs()[0]->value instanceof PhpParser\Node\Scalar\LNumber - ) { - $type_offset = $args[1]->value->getArgs()[0]->value->value; - } - - $element_type_offset = null; - - if ($args[1]->value->name->parts === ['elementType'] - && $args[1]->value->getArgs() - && $args[1]->value->getArgs()[0]->value instanceof PhpParser\Node\Scalar\LNumber - ) { - $element_type_offset = $args[1]->value->getArgs()[0]->value->value; - } - - if ($identifier instanceof PhpParser\Node\Expr\StaticCall - && $identifier->class instanceof PhpParser\Node\Name\FullyQualified - && $identifier->name instanceof PhpParser\Node\Identifier - && $identifier->getArgs() - && $identifier->getArgs()[0]->value instanceof PhpParser\Node\Scalar\LNumber - ) { - $meta_fq_classlike_name = implode('\\', $identifier->class->parts); - - $meta_method_name = strtolower($identifier->name->name); - - if ($map) { - $offset = $identifier->getArgs()[0]->value->value; - - $codebase->methods->return_type_provider->registerClosure( - $meta_fq_classlike_name, - /** - * @param list $call_args - */ - function ( - MethodReturnTypeProviderEvent $event - ) use ( - $map, - $offset, - $meta_fq_classlike_name, - $meta_method_name - ): ?Union { - $statements_analyzer = $event->getSource(); - $call_args = $event->getCallArgs(); - $method_name = $event->getMethodNameLowercase(); - $fq_classlike_name = $event->getFqClasslikeName(); - if (!$statements_analyzer instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - if ($meta_method_name !== $method_name - || $meta_fq_classlike_name !== $fq_classlike_name - ) { - return null; - } - - if (isset($call_args[$offset]->value) - && ($call_arg_type = $statements_analyzer->node_data->getType($call_args[$offset]->value)) - && $call_arg_type->isSingleStringLiteral() - ) { - $offset_arg_value = $call_arg_type->getSingleStringLiteral()->value; - - if ($mapped_type = $map[$offset_arg_value] ?? null) { - if ($mapped_type instanceof Union) { - return clone $mapped_type; - } - } - - if (($mapped_type = $map[''] ?? null) && is_string($mapped_type)) { - if (strpos($mapped_type, '@') !== false) { - $mapped_type = str_replace('@', $offset_arg_value, $mapped_type); - - if (strpos($mapped_type, '.') === false) { - return new Union([ - new TNamedObject($mapped_type) - ]); - } - } - } - } - - return null; - } - ); - } elseif ($type_offset !== null) { - $codebase->methods->return_type_provider->registerClosure( - $meta_fq_classlike_name, - /** - * @param list $call_args - */ - function ( - MethodReturnTypeProviderEvent $event - ) use ( - $type_offset, - $meta_fq_classlike_name, - $meta_method_name - ): ?Union { - $statements_analyzer = $event->getSource(); - $call_args = $event->getCallArgs(); - $method_name = $event->getMethodNameLowercase(); - $fq_classlike_name = $event->getFqClasslikeName(); - if (!$statements_analyzer instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - if ($meta_method_name !== $method_name - || $meta_fq_classlike_name !== $fq_classlike_name - ) { - return null; - } - - if (isset($call_args[$type_offset]->value) - && ($call_arg_type - = $statements_analyzer->node_data->getType($call_args[$type_offset]->value)) - ) { - return clone $call_arg_type; - } - - return null; - } - ); - } elseif ($element_type_offset !== null) { - $codebase->methods->return_type_provider->registerClosure( - $meta_fq_classlike_name, - /** - * @param list $call_args - */ - function ( - MethodReturnTypeProviderEvent $event - ) use ( - $element_type_offset, - $meta_fq_classlike_name, - $meta_method_name - ): ?Union { - $statements_analyzer = $event->getSource(); - $call_args = $event->getCallArgs(); - $method_name = $event->getMethodNameLowercase(); - $fq_classlike_name = $event->getFqClasslikeName(); - if (!$statements_analyzer instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - if ($meta_method_name !== $method_name - || $meta_fq_classlike_name !== $fq_classlike_name - ) { - return null; - } - - if (isset($call_args[$element_type_offset]->value) - && ($call_arg_type - = $statements_analyzer->node_data->getType($call_args[$element_type_offset]->value)) - && $call_arg_type->hasArray() - ) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TKeyedArray|TList - */ - $array_atomic_type = $call_arg_type->getAtomicTypes()['array']; - - if ($array_atomic_type instanceof TKeyedArray) { - return $array_atomic_type->getGenericValueType(); - } - - if ($array_atomic_type instanceof TList) { - return $array_atomic_type->type_param; - } - - return clone $array_atomic_type->type_params[1]; - } - - return null; - } - ); - } - } - - if ($identifier instanceof PhpParser\Node\Expr\FuncCall - && $identifier->name instanceof PhpParser\Node\Name\FullyQualified - && $identifier->getArgs() - && $identifier->getArgs()[0]->value instanceof PhpParser\Node\Scalar\LNumber - ) { - $function_id = strtolower(implode('\\', $identifier->name->parts)); - - if ($map) { - $offset = $identifier->getArgs()[0]->value->value; - - $codebase->functions->return_type_provider->registerClosure( - $function_id, - /** - * @param non-empty-string $function_id - * @param list $call_args - */ - function ( - FunctionReturnTypeProviderEvent $event - ) use ( - $map, - $offset - ): Union { - $statements_analyzer = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $function_id = $event->getFunctionId(); - if (!$statements_analyzer instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - if (isset($call_args[$offset]->value) - && ($call_arg_type - = $statements_analyzer->node_data->getType($call_args[$offset]->value)) - && $call_arg_type->isSingleStringLiteral() - ) { - $offset_arg_value = $call_arg_type->getSingleStringLiteral()->value; - - if ($mapped_type = $map[$offset_arg_value] ?? null) { - if ($mapped_type instanceof Union) { - return clone $mapped_type; - } - } - - if (($mapped_type = $map[''] ?? null) && is_string($mapped_type)) { - if (strpos($mapped_type, '@') !== false) { - $mapped_type = str_replace('@', $offset_arg_value, $mapped_type); - - if (strpos($mapped_type, '.') === false) { - return new Union([ - new TNamedObject($mapped_type) - ]); - } - } - } - } - - $storage = $statements_analyzer->getCodebase()->functions->getStorage( - $statements_analyzer, - strtolower($function_id) - ); - - return $storage->return_type ?: Type::getMixed(); - } - ); - } elseif ($type_offset !== null) { - $codebase->functions->return_type_provider->registerClosure( - $function_id, - /** - * @param non-empty-string $function_id - * @param list $call_args - */ - function ( - FunctionReturnTypeProviderEvent $event - ) use ( - $type_offset - ): Union { - $statements_analyzer = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $function_id = $event->getFunctionId(); - if (!$statements_analyzer instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - if (isset($call_args[$type_offset]->value) - && ($call_arg_type - = $statements_analyzer->node_data->getType($call_args[$type_offset]->value)) - ) { - return clone $call_arg_type; - } - - $storage = $statements_analyzer->getCodebase()->functions->getStorage( - $statements_analyzer, - strtolower($function_id) - ); - - return $storage->return_type ?: Type::getMixed(); - } - ); - } elseif ($element_type_offset !== null) { - $codebase->functions->return_type_provider->registerClosure( - $function_id, - /** - * @param non-empty-string $function_id - * @param list $call_args - */ - function ( - FunctionReturnTypeProviderEvent $event - ) use ( - $element_type_offset - ): Union { - $statements_analyzer = $event->getStatementsSource(); - $call_args = $event->getCallArgs(); - $function_id = $event->getFunctionId(); - if (!$statements_analyzer instanceof StatementsAnalyzer) { - return Type::getMixed(); - } - - if (isset($call_args[$element_type_offset]->value) - && ($call_arg_type - = $statements_analyzer->node_data->getType($call_args[$element_type_offset]->value)) - && $call_arg_type->hasArray() - ) { - /** - * @psalm-suppress PossiblyUndefinedStringArrayOffset - * @var TArray|TKeyedArray|TList - */ - $array_atomic_type = $call_arg_type->getAtomicTypes()['array']; - - if ($array_atomic_type instanceof TKeyedArray) { - return $array_atomic_type->getGenericValueType(); - } - - if ($array_atomic_type instanceof TList) { - return $array_atomic_type->type_param; - } - - return clone $array_atomic_type->type_params[1]; - } - - $storage = $statements_analyzer->getCodebase()->functions->getStorage( - $statements_analyzer, - strtolower($function_id) - ); - - return $storage->return_type ?: Type::getMixed(); - } - ); - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php deleted file mode 100644 index fde62965..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php +++ /dev/null @@ -1,23 +0,0 @@ -array = $left; - $this->offset = $right; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php deleted file mode 100644 index 1a1ec7bd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php +++ /dev/null @@ -1,19 +0,0 @@ -array = $array; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php deleted file mode 100644 index e42888f2..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php +++ /dev/null @@ -1,20 +0,0 @@ - */ - public $entries; - - /** @param list $entries */ - public function __construct(array $entries) - { - $this->entries = $entries; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php deleted file mode 100644 index 7f789b9f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php +++ /dev/null @@ -1,23 +0,0 @@ -fqcln = $fqcln; - $this->name = $name; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php deleted file mode 100644 index a222fb03..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php +++ /dev/null @@ -1,23 +0,0 @@ -name = $name; - $this->is_fully_qualified = $is_fully_qualified; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php deleted file mode 100644 index 7ba4d8d3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php +++ /dev/null @@ -1,23 +0,0 @@ -key = $key; - $this->value = $value; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php deleted file mode 100644 index 6fa9727a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php +++ /dev/null @@ -1,20 +0,0 @@ -value = $value; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php deleted file mode 100644 index 90c2f9e9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php +++ /dev/null @@ -1,10 +0,0 @@ -left = $left; - $this->right = $right; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php deleted file mode 100644 index c4fb77a3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php +++ /dev/null @@ -1,10 +0,0 @@ -cond = $cond; - $this->if = $if; - $this->else = $else; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php deleted file mode 100644 index 5f96f7d1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php +++ /dev/null @@ -1,10 +0,0 @@ - - */ - public $psalm_internal = []; - - /** - * Whether or not the property is readonly - * - * @var bool - */ - public $readonly = false; - - /** - * Whether or not to allow mutation by internal methods - * - * @var bool - */ - public $allow_private_mutation = false; - - /** - * @var list - */ - public $removed_taints = []; - - /** - * @var array - */ - public $suppressed_issues = []; - - /** - * @var ?string - */ - public $description; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php deleted file mode 100644 index a7ce48ed..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php +++ /dev/null @@ -1,32 +0,0 @@ -|null - */ - public $break_vars; - - public function __construct(Context $parent_context) - { - $this->parent_context = $parent_context; - } - - public function __destruct() - { - unset($this->parent_context); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php deleted file mode 100644 index 0343f193..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php +++ /dev/null @@ -1,24 +0,0 @@ - - */ - public $vars_in_scope = []; - - /** - * @param array $vars_in_scope - */ - public function __construct(array $vars_in_scope) - { - $this->vars_in_scope = $vars_in_scope; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php deleted file mode 100644 index 1f98135a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php +++ /dev/null @@ -1,50 +0,0 @@ - - */ - public $cond_referenced_var_ids; - - /** - * @var array - */ - public $assigned_in_conditional_var_ids; - - /** @var list */ - public $entry_clauses; - - /** - * @param array $cond_referenced_var_ids - * @param array $assigned_in_conditional_var_ids - * @param list $entry_clauses - */ - public function __construct( - Context $if_context, - Context $post_if_context, - array $cond_referenced_var_ids, - array $assigned_in_conditional_var_ids, - array $entry_clauses - ) { - $this->if_context = $if_context; - $this->post_if_context = $post_if_context; - $this->cond_referenced_var_ids = $cond_referenced_var_ids; - $this->assigned_in_conditional_var_ids = $assigned_in_conditional_var_ids; - $this->entry_clauses = $entry_clauses; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php deleted file mode 100644 index 314d93f8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php +++ /dev/null @@ -1,87 +0,0 @@ -|null - */ - public $new_vars; - - /** - * @var array - */ - public $new_vars_possibly_in_scope = []; - - /** - * @var array|null - */ - public $redefined_vars; - - /** - * @var array|null - */ - public $assigned_var_ids; - - /** - * @var array - */ - public $possibly_assigned_var_ids = []; - - /** - * @var array - */ - public $possibly_redefined_vars = []; - - /** - * @var array - */ - public $updated_vars = []; - - /** - * @var array>> - */ - public $negated_types = []; - - /** - * @var array - */ - public $if_cond_changed_var_ids = []; - - /** - * @var array|null - */ - public $negatable_if_types; - - /** - * @var list - */ - public $negated_clauses = []; - - /** - * These are the set of clauses that could be applied after the `if` - * statement, if the `if` statement contains branches with leaving statements, - * and the else leaves too - * - * @var list - */ - public $reasonable_clauses = []; - - /** - * @var string[] - */ - public $final_actions = []; - - /** - * @var ?Context - */ - public $post_leaving_if_context; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php deleted file mode 100644 index 4bbb2089..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php +++ /dev/null @@ -1,74 +0,0 @@ -|null - */ - public $redefined_loop_vars = []; - - /** - * @var array - */ - public $possibly_redefined_loop_vars = []; - - /** - * @var array|null - */ - public $possibly_redefined_loop_parent_vars; - - /** - * @var array - */ - public $possibly_defined_loop_parent_vars = []; - - /** - * @var array - */ - public $vars_possibly_in_scope = []; - - /** - * @var array - */ - public $protected_var_ids = []; - - /** - * @var string[] - */ - public $final_actions = []; - - public function __construct(Context $loop_context, Context $parent_context) - { - $this->loop_context = $loop_context; - $this->loop_parent_context = $parent_context; - } - - public function __destruct() - { - unset($this->loop_context); - unset($this->loop_parent_context); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php deleted file mode 100644 index 35bb99ca..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php +++ /dev/null @@ -1,53 +0,0 @@ -|null - */ - public $new_vars_in_scope; - - /** - * @var array - */ - public $new_vars_possibly_in_scope = []; - - /** - * @var array|null - */ - public $redefined_vars; - - /** - * @var array|null - */ - public $possibly_redefined_vars; - - /** - * @var array - */ - public $leftover_statements = []; - - /** - * @var PhpParser\Node\Expr|null - */ - public $leftover_case_equality_expr; - - /** - * @var list - */ - public $negated_clauses = []; - - /** - * @var array|null - */ - public $new_assigned_var_ids; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php deleted file mode 100644 index 6bc81302..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php +++ /dev/null @@ -1,314 +0,0 @@ - array_merge( - self::getConstantNodes($codebase, $storage), - self::getPropertyNodes($storage), - self::getMethodNodes($storage) - ) - ]; - - $docblock = new ParsedDocblock('', []); - - $template_offset = 0; - - foreach ($storage->template_types ?: [] as $template_name => $map) { - $type = array_values($map)[0]; - - $key = isset($storage->template_covariants[$template_offset]) ? 'template-covariant' : 'template'; - - $docblock->tags[$key][] = $template_name . ' as ' . $type->toNamespacedString( - null, - [], - null, - false - ); - - $template_offset++; - } - - $attrs = [ - 'comments' => $docblock->tags - ? [ - new PhpParser\Comment\Doc( - rtrim($docblock->render(' ')) - ) - ] - : [] - ]; - - if ($storage->is_interface) { - if ($storage->direct_interface_parents) { - $subnodes['extends'] = []; - - foreach ($storage->direct_interface_parents as $direct_interface_parent) { - $subnodes['extends'][] = new VirtualFullyQualified($direct_interface_parent); - } - } - - return new VirtualInterface( - $classlike_name, - $subnodes, - $attrs - ); - } - - if ($storage->is_trait) { - return new VirtualTrait( - $classlike_name, - $subnodes, - $attrs - ); - } - - if ($storage->parent_class) { - $subnodes['extends'] = new VirtualFullyQualified($storage->parent_class); - } else - - if ($storage->direct_class_interfaces) { - $subnodes['implements'] = []; - foreach ($storage->direct_class_interfaces as $direct_class_interface) { - $subnodes['implements'][] = new VirtualFullyQualified($direct_class_interface); - } - } - - return new VirtualClass( - $classlike_name, - $subnodes, - $attrs - ); - } - - /** - * @return list - */ - private static function getConstantNodes(Codebase $codebase, ClassLikeStorage $storage): array - { - $constant_nodes = []; - - foreach ($storage->constants as $constant_name => $constant_storage) { - if ($constant_storage->unresolved_node) { - $type = new Union([ - ConstantTypeResolver::resolve( - $codebase->classlikes, - $constant_storage->unresolved_node - ) - ]); - } elseif ($constant_storage->type) { - $type = $constant_storage->type; - } else { - throw new UnexpectedValueException('bad'); - } - - $constant_nodes[] = new VirtualClassConst( - [ - new VirtualConst( - $constant_name, - StubsGenerator::getExpressionFromType($type) - ) - ], - $constant_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PUBLIC - ? PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC - : ($constant_storage->visibility === ClassLikeAnalyzer::VISIBILITY_PROTECTED - ? PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED - : PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE) - ); - } - - return $constant_nodes; - } - - /** - * @return list - */ - private static function getPropertyNodes(ClassLikeStorage $storage): array - { - $namespace_name = implode('\\', array_slice(explode('\\', $storage->name), 0, -1)); - - $property_nodes = []; - - foreach ($storage->properties as $property_name => $property_storage) { - switch ($property_storage->visibility) { - case ClassLikeAnalyzer::VISIBILITY_PRIVATE: - $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE; - break; - case ClassLikeAnalyzer::VISIBILITY_PROTECTED: - $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED; - break; - default: - $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC; - break; - } - - $docblock = new ParsedDocblock('', []); - - if ($property_storage->type - && $property_storage->signature_type !== $property_storage->type - ) { - $docblock->tags['var'][] = $property_storage->type->toNamespacedString( - $namespace_name, - [], - null, - false - ); - } - - $property_nodes[] = new VirtualProperty( - $flag | ($property_storage->is_static ? PhpParser\Node\Stmt\Class_::MODIFIER_STATIC : 0), - [ - new VirtualPropertyProperty( - $property_name, - $property_storage->suggested_type - ? StubsGenerator::getExpressionFromType($property_storage->suggested_type) - : null - ) - ], - [ - 'comments' => $docblock->tags - ? [ - new PhpParser\Comment\Doc( - rtrim($docblock->render(' ')) - ) - ] - : [] - ], - $property_storage->signature_type - ? StubsGenerator::getParserTypeFromPsalmType($property_storage->signature_type) - : null - ); - } - - return $property_nodes; - } - - /** - * @return list - */ - private static function getMethodNodes(ClassLikeStorage $storage): array { - $namespace_name = implode('\\', array_slice(explode('\\', $storage->name), 0, -1)); - $method_nodes = []; - - foreach ($storage->methods as $method_storage) { - if (!$method_storage->cased_name) { - throw new UnexpectedValueException('very bad'); - } - - switch ($method_storage->visibility) { - case ReflectionProperty::IS_PRIVATE: - $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE; - break; - case ReflectionProperty::IS_PROTECTED: - $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED; - break; - default: - $flag = PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC; - break; - } - - $docblock = new ParsedDocblock('', []); - - foreach ($method_storage->template_types ?: [] as $template_name => $map) { - $type = array_values($map)[0]; - - $docblock->tags['template'][] = $template_name . ' as ' . $type->toNamespacedString( - $namespace_name, - [], - null, - false - ); - } - - foreach ($method_storage->params as $param) { - if ($param->type && $param->type !== $param->signature_type) { - $docblock->tags['param'][] = $param->type->toNamespacedString( - $namespace_name, - [], - null, - false - ) . ' $' . $param->name; - } - } - - if ($method_storage->return_type - && $method_storage->signature_return_type !== $method_storage->return_type - ) { - $docblock->tags['return'][] = $method_storage->return_type->toNamespacedString( - $namespace_name, - [], - null, - false - ); - } - - foreach ($method_storage->throws ?: [] as $exception_name => $_) { - $docblock->tags['throws'][] = Type::getStringFromFQCLN( - $exception_name, - $namespace_name, - [], - null, - false - ); - } - - $method_nodes[] = new VirtualClassMethod( - $method_storage->cased_name, - [ - 'flags' => $flag - | ($method_storage->is_static ? PhpParser\Node\Stmt\Class_::MODIFIER_STATIC : 0) - | ($method_storage->abstract ? PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT : 0), - 'params' => StubsGenerator::getFunctionParamNodes($method_storage), - 'returnType' => $method_storage->signature_return_type - ? StubsGenerator::getParserTypeFromPsalmType($method_storage->signature_return_type) - : null, - 'stmts' => $storage->is_interface || $method_storage->abstract ? null : [], - ], - [ - 'comments' => $docblock->tags - ? [ - new PhpParser\Comment\Doc( - rtrim($docblock->render(' ')) - ) - ] - : [] - ] - ); - } - - return $method_nodes; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php deleted file mode 100644 index 23b1ca16..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php +++ /dev/null @@ -1,480 +0,0 @@ -getAll() as $storage) { - if (strpos($storage->name, 'Psalm\\') === 0) { - continue; - } - - if ($storage->location - && strpos($storage->location->file_path, $psalm_base) === 0 - ) { - continue; - } - - if ($storage->stubbed) { - continue; - } - - $name_parts = explode('\\', $storage->name); - - $classlike_name = array_pop($name_parts); - $namespace_name = implode('\\', $name_parts); - - if (!isset($namespaced_nodes[$namespace_name])) { - $namespaced_nodes[$namespace_name] = []; - } - - $namespaced_nodes[$namespace_name][$classlike_name] = ClassLikeStubGenerator::getClassLikeNode( - $codebase, - $storage, - $classlike_name - ); - } - - $all_function_names = []; - - foreach ($codebase->functions->getAllStubbedFunctions() as $function_storage) { - if ($function_storage->location - && strpos($function_storage->location->file_path, $psalm_base) === 0 - ) { - continue; - } - - if (!$function_storage->cased_name) { - throw new UnexpectedValueException('very bad'); - } - - $fq_name = $function_storage->cased_name; - - $all_function_names[$fq_name] = true; - - $name_parts = explode('\\', $fq_name); - $function_name = array_pop($name_parts); - - $namespace_name = implode('\\', $name_parts); - - $namespaced_nodes[$namespace_name][$fq_name] = self::getFunctionNode( - $function_storage, - $function_name, - $namespace_name - ); - } - - foreach ($codebase->getAllStubbedConstants() as $fq_name => $type) { - if ($type->isMixed()) { - continue; - } - - $name_parts = explode('\\', $fq_name); - $constant_name = array_pop($name_parts); - - $namespace_name = implode('\\', $name_parts); - - $namespaced_nodes[$namespace_name][$fq_name] = new StmtVirtualConst_( - [ - new VirtualConst( - $constant_name, - self::getExpressionFromType($type) - ) - ] - ); - } - - foreach ($file_provider->getAll() as $file_storage) { - if (strpos($file_storage->file_path, $psalm_base) === 0) { - continue; - } - - foreach ($file_storage->functions as $function_storage) { - if (!$function_storage->cased_name) { - continue; - } - - $fq_name = $function_storage->cased_name; - - if (isset($all_function_names[$fq_name])) { - continue; - } - - $all_function_names[$fq_name] = true; - - $name_parts = explode('\\', $fq_name); - $function_name = array_pop($name_parts); - - $namespace_name = implode('\\', $name_parts); - - $namespaced_nodes[$namespace_name][$fq_name] = self::getFunctionNode( - $function_storage, - $function_name, - $namespace_name - ); - } - - foreach ($file_storage->constants as $fq_name => $type) { - if ($type->isMixed()) { - continue; - } - - if ($type->isMixed()) { - continue; - } - - $name_parts = explode('\\', $fq_name); - $constant_name = array_pop($name_parts); - - $namespace_name = implode('\\', $name_parts); - - $namespaced_nodes[$namespace_name][$fq_name] = new StmtVirtualConst_( - [ - new VirtualConst( - $constant_name, - self::getExpressionFromType($type) - ) - ] - ); - } - } - - ksort($namespaced_nodes); - - $namespace_stmts = []; - - foreach ($namespaced_nodes as $namespace_name => $stmts) { - ksort($stmts); - - $namespace_stmts[] = new VirtualNamespace( - $namespace_name ? new VirtualName($namespace_name) : null, - array_values($stmts), - ['kind' => PhpParser\Node\Stmt\Namespace_::KIND_BRACED] - ); - } - - $prettyPrinter = new PhpParser\PrettyPrinter\Standard; - return $prettyPrinter->prettyPrintFile($namespace_stmts); - } - - private static function getFunctionNode( - FunctionLikeStorage $function_storage, - string $function_name, - string $namespace_name - ) : PhpParser\Node\Stmt\Function_ { - $docblock = new ParsedDocblock('', []); - - foreach ($function_storage->template_types ?: [] as $template_name => $map) { - $type = array_values($map)[0]; - - $docblock->tags['template'][] = $template_name . ' as ' . $type->toNamespacedString( - $namespace_name, - [], - null, - false - ); - } - - foreach ($function_storage->params as $param) { - if ($param->type && $param->type !== $param->signature_type) { - $docblock->tags['param'][] = $param->type->toNamespacedString( - $namespace_name, - [], - null, - false - ) . ' $' . $param->name; - } - } - - if ($function_storage->return_type - && $function_storage->signature_return_type !== $function_storage->return_type - ) { - $docblock->tags['return'][] = $function_storage->return_type->toNamespacedString( - $namespace_name, - [], - null, - false - ); - } - - foreach ($function_storage->throws ?: [] as $exception_name => $_) { - $docblock->tags['throws'][] = Type::getStringFromFQCLN( - $exception_name, - $namespace_name, - [], - null, - false - ); - } - - return new VirtualFunction( - $function_name, - [ - 'params' => self::getFunctionParamNodes($function_storage), - 'returnType' => $function_storage->signature_return_type - ? self::getParserTypeFromPsalmType($function_storage->signature_return_type) - : null, - 'stmts' => [], - ], - [ - 'comments' => $docblock->tags - ? [ - new PhpParser\Comment\Doc( - rtrim($docblock->render(' ')) - ) - ] - : [] - ] - ); - } - - /** - * @return list - */ - public static function getFunctionParamNodes(FunctionLikeStorage $method_storage): array - { - $param_nodes = []; - - foreach ($method_storage->params as $param) { - $param_nodes[] = new VirtualParam( - new VirtualVariable($param->name), - $param->default_type instanceof Union - ? self::getExpressionFromType($param->default_type) - : null, - $param->signature_type - ? self::getParserTypeFromPsalmType($param->signature_type) - : null, - $param->by_ref, - $param->is_variadic - ); - } - - return $param_nodes; - } - - /** - * @return PhpParser\Node\Identifier|PhpParser\Node\Name\FullyQualified|PhpParser\Node\NullableType|null - */ - public static function getParserTypeFromPsalmType(Union $type): ?PhpParser\NodeAbstract - { - $nullable = $type->isNullable(); - - foreach ($type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TNull) { - continue; - } - - if ($atomic_type instanceof Scalar - || $atomic_type instanceof TObject - || $atomic_type instanceof TArray - || $atomic_type instanceof TIterable - ) { - $identifier_string = $atomic_type->toPhpString(null, [], null, 8, 0); - - if ($identifier_string === null) { - throw new UnexpectedValueException( - $atomic_type->getId() . ' could not be converted to an identifier' - ); - } - $identifier = new VirtualIdentifier($identifier_string); - - if ($nullable) { - return new VirtualNullableType($identifier); - } - - return $identifier; - } - - if ($atomic_type instanceof TNamedObject) { - $name_node = new VirtualFullyQualified($atomic_type->value); - - if ($nullable) { - return new VirtualNullableType($name_node); - } - - return $name_node; - } - } - - return null; - } - - public static function getExpressionFromType(Union $type) : PhpParser\Node\Expr - { - foreach ($type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TLiteralClassString) { - return new VirtualClassConstFetch(new VirtualName('\\' . $atomic_type->value), new VirtualIdentifier('class')); - } - - if ($atomic_type instanceof TLiteralString) { - return new VirtualString($atomic_type->value); - } - - if ($atomic_type instanceof TLiteralInt) { - return new VirtualLNumber($atomic_type->value); - } - - if ($atomic_type instanceof TLiteralFloat) { - return new VirtualDNumber($atomic_type->value); - } - - if ($atomic_type instanceof TFalse) { - return new VirtualConstFetch(new VirtualName('false')); - } - - if ($atomic_type instanceof TTrue) { - return new VirtualConstFetch(new VirtualName('true')); - } - - if ($atomic_type instanceof TNull) { - return new VirtualConstFetch(new VirtualName('null')); - } - - if ($atomic_type instanceof TArray) { - return new VirtualArray([]); - } - - if ($atomic_type instanceof TKeyedArray) { - $new_items = []; - - foreach ($atomic_type->properties as $property_name => $property_type) { - if ($atomic_type->is_list) { - $key_type = null; - } elseif (is_int($property_name)) { - $key_type = new VirtualLNumber($property_name); - } else { - $key_type = new VirtualString($property_name); - } - - $new_items[] = new VirtualArrayItem( - self::getExpressionFromType($property_type), - $key_type - ); - } - - return new VirtualArray($new_items); - } - - if ($atomic_type instanceof TEnumCase) { - return new VirtualClassConstFetch(new VirtualName('\\' . $atomic_type->value), new VirtualIdentifier($atomic_type->case_name)); - } - } - - return new VirtualString('Psalm could not infer this type'); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php deleted file mode 100644 index 00238803..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php +++ /dev/null @@ -1,63 +0,0 @@ -key = $key; - $this->value = $value; - $this->is_list = $is_list; - } - - public static function infer(Atomic $type): ?self - { - if ($type instanceof TKeyedArray) { - return new self( - $type->getGenericKeyType(), - $type->getGenericValueType(), - $type->is_list - ); - } - - if ($type instanceof TList) { - return new self( - Type::getInt(), - $type->type_param, - true - ); - } - - if ($type instanceof TArray) { - return new self( - $type->type_params[0], - $type->type_params[1], - false - ); - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php deleted file mode 100644 index d1611acc..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php +++ /dev/null @@ -1,1816 +0,0 @@ - null, - * - empty(bool) => false, - * - notEmpty(Object|null) => Object, - * - notEmpty(Object|false) => Object - * - * @param string[] $suppressed_issues - * @param array> $template_type_map - * @param-out Reconciler::RECONCILIATION_* $failed_reconciliation - */ - public static function reconcile( - string $assertion, - ?Union $existing_var_type, - ?string $key, - StatementsAnalyzer $statements_analyzer, - bool $inside_loop, - array $template_type_map, - ?CodeLocation $code_location = null, - array $suppressed_issues = [], - ?int &$failed_reconciliation = Reconciler::RECONCILIATION_OK, - bool $negated = false - ): Union { - $codebase = $statements_analyzer->getCodebase(); - - $is_strict_equality = false; - $is_loose_equality = false; - $is_equality = false; - $is_negation = false; - $failed_reconciliation = Reconciler::RECONCILIATION_OK; - - if ($assertion[0] === '!') { - $assertion = substr($assertion, 1); - $is_negation = true; - } - - if ($assertion[0] === '=') { - $assertion = substr($assertion, 1); - $is_strict_equality = true; - $is_equality = true; - } - - if ($assertion[0] === '~') { - $assertion = substr($assertion, 1); - $is_loose_equality = true; - $is_equality = true; - } - - $original_assertion = $assertion; - - if ($assertion[0] === '@') { - $assertion = 'falsy'; - $is_negation = true; - } - - if ($existing_var_type === null - && is_string($key) - && VariableFetchAnalyzer::isSuperGlobal($key) - ) { - $existing_var_type = VariableFetchAnalyzer::getGlobalType($key); - } - - if ($existing_var_type === null) { - return self::getMissingType( - $assertion, - $is_negation, - $inside_loop, - $is_equality, - $template_type_map - ); - } - - $old_var_type_string = $existing_var_type->getId(); - - if ($is_negation) { - return NegatedAssertionReconciler::reconcile( - $statements_analyzer, - $assertion, - $is_strict_equality, - $is_loose_equality, - $existing_var_type, - $template_type_map, - $old_var_type_string, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $inside_loop - ); - } - - $simply_reconciled_type = SimpleAssertionReconciler::reconcile( - $assertion, - $codebase, - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - $is_strict_equality, - $inside_loop - ); - - if ($simply_reconciled_type) { - return $simply_reconciled_type; - } - - if (strpos($assertion, 'isa-') === 0) { - $should_return = false; - - $new_type = self::handleIsA( - $codebase, - $existing_var_type, - $assertion, - $template_type_map, - $code_location, - $key, - $suppressed_issues, - $should_return - ); - - if ($should_return) { - return $new_type; - } - } elseif (strpos($assertion, 'getclass-') === 0) { - $assertion = substr($assertion, 9); - $new_type = Type::parseString($assertion, null, $template_type_map); - } else { - $bracket_pos = strpos($assertion, '('); - - if ($bracket_pos) { - return self::handleLiteralEquality( - $statements_analyzer, - $assertion, - $bracket_pos, - $is_loose_equality, - $existing_var_type, - $old_var_type_string, - $key, - $negated, - $code_location, - $suppressed_issues - ); - } - - if ($assertion === 'loaded-class-string') { - $assertion = 'class-string'; - } - - try { - $new_type = Type::parseString($assertion, null, $template_type_map); - } catch (TypeParseTreeException $e) { - $new_type = Type::getMixed(); - } - } - - if ($existing_var_type->hasMixed()) { - if ($is_loose_equality - && $new_type->hasScalarType() - ) { - return $existing_var_type; - } - - return $new_type; - } - - $refined_type = self::refine( - $statements_analyzer, - $assertion, - $original_assertion, - $new_type, - $existing_var_type, - $template_type_map, - $key, - $negated, - $code_location, - $is_equality, - $is_loose_equality, - $suppressed_issues, - $failed_reconciliation - ); - - return TypeExpander::expandUnion( - $codebase, - $refined_type, - null, - null, - null, - true, - false, - false, - true - ); - } - - /** - * @param array> $template_type_map - */ - private static function getMissingType( - string $assertion, - bool $is_negation, - bool $inside_loop, - bool $is_equality, - array $template_type_map - ): Union { - if (($assertion === 'isset' && !$is_negation) - || ($assertion === 'empty' && $is_negation) - ) { - return Type::getMixed($inside_loop); - } - - if ($assertion === 'array-key-exists' - || $assertion === 'non-empty-countable' - || strpos($assertion, 'has-at-least-') === 0 - || strpos($assertion, 'has-exactly-') === 0 - ) { - return Type::getMixed(); - } - - if (!$is_negation && $assertion !== 'falsy' && $assertion !== 'empty') { - if ($is_equality) { - $bracket_pos = strpos($assertion, '('); - - if ($bracket_pos) { - $assertion = substr($assertion, 0, $bracket_pos); - } - } - - try { - return Type::parseString($assertion, null, $template_type_map); - } catch (Exception $e) { - return Type::getMixed(); - } - } - - return Type::getMixed(); - } - - /** - * This method is called when SimpleAssertionReconciler was not enough. It receives the existing type, the assertion - * and also a new type created from the assertion string. - * - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - * @param string[] $suppressed_issues - * @param array> $template_type_map - * @param-out Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function refine( - StatementsAnalyzer $statements_analyzer, - string $assertion, - string $original_assertion, - Union $new_type, - Union $existing_var_type, - array $template_type_map, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - bool $is_equality, - bool $is_loose_equality, - array $suppressed_issues, - int &$failed_reconciliation - ): Union { - $codebase = $statements_analyzer->getCodebase(); - - $old_var_type_string = $existing_var_type->getId(); - - $new_type_has_interface = false; - - if ($new_type->hasObjectType()) { - foreach ($new_type->getAtomicTypes() as $new_type_part) { - if ($new_type_part instanceof TNamedObject && - $codebase->interfaceExists($new_type_part->value) - ) { - $new_type_has_interface = true; - break; - } - } - } - - $old_type_has_interface = false; - - if ($existing_var_type->hasObjectType()) { - foreach ($existing_var_type->getAtomicTypes() as $existing_type_part) { - if ($existing_type_part instanceof TNamedObject && - $codebase->interfaceExists($existing_type_part->value) - ) { - $old_type_has_interface = true; - break; - } - } - } - - try { - if (strpos($assertion, '<') || strpos($assertion, '[') || strpos($assertion, '{')) { - $new_type_union = Type::parseString($assertion); - - $new_type_part = $new_type_union->getSingleAtomic(); - } else { - $new_type_part = Atomic::create($assertion, null, $template_type_map); - } - } catch (TypeParseTreeException $e) { - $new_type_part = new TMixed(); - - if ($code_location) { - IssueBuffer::maybeAdd( - new InvalidDocblock( - $assertion . ' cannot be used in an assertion', - $code_location - ), - $suppressed_issues - ); - } - } - - if ($new_type_part instanceof TTemplateParam - && $new_type_part->as->isSingle() - ) { - $new_as_atomic = $new_type_part->as->getSingleAtomic(); - - $acceptable_atomic_types = []; - - foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_part) { - if ($existing_var_type_part instanceof TNamedObject - || $existing_var_type_part instanceof TTemplateParam - ) { - $new_type_part->addIntersectionType($existing_var_type_part); - $acceptable_atomic_types[] = clone $existing_var_type_part; - } else { - if (AtomicTypeComparator::isContainedBy( - $codebase, - $existing_var_type_part, - $new_as_atomic - )) { - $acceptable_atomic_types[] = clone $existing_var_type_part; - } - } - } - - if ($acceptable_atomic_types) { - $new_type_part->as = new Union($acceptable_atomic_types); - - return new Union([$new_type_part]); - } - } - - if ($new_type_part instanceof TKeyedArray) { - $acceptable_atomic_types = []; - - foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_part) { - if ($existing_var_type_part instanceof TKeyedArray) { - if (!array_intersect_key( - $existing_var_type_part->properties, - $new_type_part->properties - )) { - $existing_var_type_part = clone $existing_var_type_part; - $existing_var_type_part->properties = array_merge( - $existing_var_type_part->properties, - $new_type_part->properties - ); - - $acceptable_atomic_types[] = $existing_var_type_part; - } - } - } - - if ($acceptable_atomic_types) { - return new Union($acceptable_atomic_types); - } - } - - if ($new_type_part instanceof TNamedObject - && ($new_type_has_interface || $old_type_has_interface) - && !UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $new_type, - $existing_var_type, - false - ) - ) { - $acceptable_atomic_types = []; - - foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_part) { - if (AtomicTypeComparator::isContainedBy( - $codebase, - $existing_var_type_part, - $new_type_part - )) { - $acceptable_atomic_types[] = clone $existing_var_type_part; - continue; - } - - if ($existing_var_type_part instanceof TNamedObject - && ($codebase->classExists($existing_var_type_part->value) - || $codebase->interfaceExists($existing_var_type_part->value)) - ) { - $existing_var_type_part = clone $existing_var_type_part; - $existing_var_type_part->addIntersectionType($new_type_part); - $acceptable_atomic_types[] = $existing_var_type_part; - } - - if ($existing_var_type_part instanceof TTemplateParam) { - $existing_var_type_part = clone $existing_var_type_part; - $existing_var_type_part->addIntersectionType($new_type_part); - $acceptable_atomic_types[] = $existing_var_type_part; - } - } - - if ($acceptable_atomic_types) { - return new Union($acceptable_atomic_types); - } - } elseif (!$new_type->hasMixed()) { - $has_match = true; - - if ($key - && $code_location - && $new_type->getId() === $existing_var_type->getId() - //even if two objects are the same, equality is not guaranteed - // example: (ErrorException and TypeError are both Throwable but not equal) - && !$new_type->hasNamedObjectType() - && !$is_equality - && !($original_assertion === 'loaded-class-string' && $old_var_type_string === 'class-string') - && (!($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer) - || ($key !== '$this' - && !($existing_var_type->hasLiteralClassString() && $new_type->hasLiteralClassString()))) - ) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - $original_assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - - $any_scalar_type_match_found = false; - - if ($code_location - && $key - && !$is_equality - && $new_type_part instanceof TNamedObject - && !$new_type_has_interface - && (!($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer) - || ($key !== '$this' - && !($existing_var_type->hasLiteralClassString() && $new_type->hasLiteralClassString()))) - && UnionTypeComparator::isContainedBy( - $codebase, - $existing_var_type, - $new_type, - false, - false, - null, - false, - false - ) - ) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - $original_assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - - $new_type = self::filterTypeWithAnother( - $codebase, - $existing_var_type, - $new_type, - $template_type_map, - $has_match, - $any_scalar_type_match_found - ); - - if ($code_location - && !$has_match - && (!$is_loose_equality || !$any_scalar_type_match_found) - ) { - if ($assertion === 'null') { - if ($existing_var_type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - 'Cannot resolve types for ' . $key . ' - docblock-defined type ' - . $existing_var_type . ' does not contain null', - $code_location, - $existing_var_type->getId() . ' null' - ), - $suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainNull( - 'Cannot resolve types for ' . $key . ' - ' . $existing_var_type - . ' does not contain null', - $code_location, - $existing_var_type->getId() - ), - $suppressed_issues - ); - } - } elseif (!($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer) - || ($key !== '$this' - && !($existing_var_type->hasLiteralClassString() && $new_type->hasLiteralClassString())) - ) { - if ($existing_var_type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - 'Cannot resolve types for ' . $key . ' - docblock-defined type ' - . $existing_var_type->getId() . ' does not contain ' . $new_type->getId(), - $code_location, - $existing_var_type->getId() . ' ' . $new_type->getId() - ), - $suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - 'Cannot resolve types for ' . $key . ' - ' . $existing_var_type->getId() - . ' does not contain ' . $new_type->getId(), - $code_location, - $existing_var_type->getId() . ' ' . $new_type->getId() - ), - $suppressed_issues - ); - } - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - } - } - - return $new_type; - } - - /** - * This method receives two types. The goal is to use datas in the new type to reduce the existing_type to a more - * precise version. For example: new is `array` old is `list` so the result is `list` - * - * @param array> $template_type_map - * - * @psalm-suppress ComplexMethod we'd probably want to extract specific handling blocks at the end and also allow - * early return once a specific case has been handled - */ - private static function filterTypeWithAnother( - Codebase $codebase, - Union $existing_type, - Union $new_type, - array $template_type_map, - bool &$has_match = false, - bool &$any_scalar_type_match_found = false - ): Union { - $matching_atomic_types = []; - - $has_cloned_type = false; - - foreach ($new_type->getAtomicTypes() as $new_type_part) { - $has_local_match = false; - - foreach ($existing_type->getAtomicTypes() as $key => $existing_type_part) { - // special workaround because PHP allows floats to contain ints, but we don’t want this - // behaviour here - if ($existing_type_part instanceof TFloat - && $new_type_part instanceof TInt - ) { - $any_scalar_type_match_found = true; - continue; - } - - $atomic_comparison_results = new TypeComparisonResult(); - - if ($existing_type_part instanceof TNamedObject) { - $existing_type_part->was_static = false; - } - - $atomic_contained_by = AtomicTypeComparator::isContainedBy( - $codebase, - $new_type_part, - $existing_type_part, - true, - false, - $atomic_comparison_results - ); - - if ($atomic_contained_by) { - $has_local_match = true; - - if ($atomic_comparison_results->type_coerced - && get_class($new_type_part) === TNamedObject::class - && $existing_type_part instanceof TGenericObject - ) { - // this is a hack - it's not actually rigorous, as the params may be different - $matching_atomic_types[] = new TGenericObject( - $new_type_part->value, - $existing_type_part->type_params - ); - } elseif ($new_type_part instanceof TNamedObject - && $existing_type_part instanceof TTemplateParam - && $existing_type_part->as->hasObjectType() - ) { - $existing_type_part = clone $existing_type_part; - $existing_type_part->as = self::filterTypeWithAnother( - $codebase, - $existing_type_part->as, - new Union([$new_type_part]), - $template_type_map - ); - - $matching_atomic_types[] = $existing_type_part; - } else { - $matching_atomic_types[] = clone $new_type_part; - } - - continue; - } - - if (AtomicTypeComparator::isContainedBy( - $codebase, - $existing_type_part, - $new_type_part, - false, - false, - null - )) { - $has_local_match = true; - $matching_atomic_types[] = $existing_type_part; - - continue; - } - - if ($existing_type_part instanceof TNamedObject - && $new_type_part instanceof TNamedObject - && ($codebase->interfaceExists($existing_type_part->value) - || $codebase->interfaceExists($new_type_part->value)) - ) { - $matching_atomic_type = clone $new_type_part; - $matching_atomic_type->extra_types[$existing_type_part->getKey()] = $existing_type_part; - $matching_atomic_types[] = $matching_atomic_type; - $has_local_match = true; - - continue; - } - - if ($new_type_part instanceof TKeyedArray - && $existing_type_part instanceof TList - ) { - $new_type_key = $new_type_part->getGenericKeyType(); - $new_type_value = $new_type_part->getGenericValueType(); - - if (!$new_type_key->hasString()) { - $has_param_match = false; - - $new_type_value = self::filterTypeWithAnother( - $codebase, - $existing_type_part->type_param, - $new_type_value, - $template_type_map, - $has_param_match, - $any_scalar_type_match_found - ); - - $hybrid_type_part = new TKeyedArray($new_type_part->properties); - $hybrid_type_part->previous_key_type = Type::getInt(); - $hybrid_type_part->previous_value_type = $new_type_value; - $hybrid_type_part->is_list = true; - - if (!$has_cloned_type) { - $new_type = clone $new_type; - $has_cloned_type = true; - } - - $has_local_match = true; - - $new_type->removeType($key); - $new_type->addType($hybrid_type_part); - - continue; - } - } - - if ($new_type_part instanceof TTemplateParam - && $existing_type_part instanceof TTemplateParam - && $new_type_part->param_name !== $existing_type_part->param_name - && $new_type_part->as->hasObject() - && $existing_type_part->as->hasObject() - ) { - $matching_atomic_type = clone $new_type_part; - - $matching_atomic_type->extra_types[$existing_type_part->getKey()] = $existing_type_part; - $matching_atomic_types[] = $matching_atomic_type; - $has_local_match = true; - - continue; - } - - //we filter both types of standard iterables - if (($new_type_part instanceof TGenericObject - || $new_type_part instanceof TArray - || $new_type_part instanceof TIterable) - && ($existing_type_part instanceof TGenericObject - || $existing_type_part instanceof TArray - || $existing_type_part instanceof TIterable) - && count($new_type_part->type_params) === count($existing_type_part->type_params) - ) { - $has_any_param_match = false; - - foreach ($new_type_part->type_params as $i => $new_param) { - $existing_param = $existing_type_part->type_params[$i]; - - $has_param_match = true; - - $new_param_id = $new_param->getId(); - - $new_param = self::filterTypeWithAnother( - $codebase, - $existing_param, - $new_param, - $template_type_map, - $has_param_match, - $any_scalar_type_match_found - ); - - if ($template_type_map) { - TemplateInferredTypeReplacer::replace( - $new_param, - new TemplateResult([], $template_type_map), - $codebase - ); - } - - $existing_type->bustCache(); - - if ($has_param_match - && $existing_type_part->type_params[$i]->getId() !== $new_param_id - ) { - /** @psalm-suppress PropertyTypeCoercion */ - $existing_type_part->type_params[$i] = $new_param; - - if (!$has_local_match) { - $has_any_param_match = true; - } - } - } - - if ($has_any_param_match) { - $has_local_match = true; - $matching_atomic_types[] = $existing_type_part; - $atomic_comparison_results->type_coerced = true; - } - } - - //we filter the second part of a list with the second part of standard iterables - if (($new_type_part instanceof TArray - || $new_type_part instanceof TIterable) - && $existing_type_part instanceof TList - ) { - $has_any_param_match = false; - - $new_param = $new_type_part->type_params[1]; - $existing_param = $existing_type_part->type_param; - - $has_param_match = true; - - $new_param = self::filterTypeWithAnother( - $codebase, - $existing_param, - $new_param, - $template_type_map, - $has_param_match, - $any_scalar_type_match_found - ); - - if ($template_type_map) { - TemplateInferredTypeReplacer::replace( - $new_param, - new TemplateResult([], $template_type_map), - $codebase - ); - } - - $existing_type->bustCache(); - - if ($has_param_match - && $existing_type_part->type_param->getId() !== $new_param->getId() - ) { - $existing_type_part->type_param = $new_param; - - if (!$has_local_match) { - $has_any_param_match = true; - } - } - - if ($has_any_param_match) { - $has_local_match = true; - $matching_atomic_types[] = $existing_type_part; - $atomic_comparison_results->type_coerced = true; - } - } - - //we filter each property of a Keyed Array with the second part of standard iterables - if (($new_type_part instanceof TArray - || $new_type_part instanceof TIterable) - && $existing_type_part instanceof TKeyedArray - ) { - $has_any_param_match = false; - - $new_param = $new_type_part->type_params[1]; - foreach ($existing_type_part->properties as $property_key => $existing_param) { - $has_param_match = true; - - $new_param = self::filterTypeWithAnother( - $codebase, - $existing_param, - $new_param, - $template_type_map, - $has_param_match, - $any_scalar_type_match_found - ); - - if ($template_type_map) { - TemplateInferredTypeReplacer::replace( - $new_param, - new TemplateResult([], $template_type_map), - $codebase - ); - } - - if ($has_param_match - && $existing_type_part->properties[$property_key]->getId() !== $new_param->getId() - ) { - $existing_type_part->properties[$property_key] = $new_param; - - if (!$has_local_match) { - $has_any_param_match = true; - } - } - } - - $existing_type->bustCache(); - - if ($has_any_param_match) { - $has_local_match = true; - $matching_atomic_types[] = $existing_type_part; - $atomic_comparison_results->type_coerced = true; - } - } - - //These partial match wouldn't have been handled by AtomicTypeComparator - $new_range = null; - if ($new_type_part instanceof TIntRange && $existing_type_part instanceof TPositiveInt) { - $new_range = TIntRange::intersectIntRanges( - TIntRange::convertToIntRange($existing_type_part), - $new_type_part - ); - } elseif ($existing_type_part instanceof TIntRange - && $new_type_part instanceof TPositiveInt - ) { - $new_range = TIntRange::intersectIntRanges( - $existing_type_part, - TIntRange::convertToIntRange($new_type_part) - ); - } elseif ($new_type_part instanceof TIntRange - && $existing_type_part instanceof TIntRange - ) { - $new_range = TIntRange::intersectIntRanges( - $existing_type_part, - $new_type_part - ); - } - - if ($new_range !== null) { - $has_local_match = true; - $matching_atomic_types[] = $new_range; - } - - if ($atomic_comparison_results->type_coerced) { - continue; - } - - if ($atomic_comparison_results->scalar_type_match_found) { - $any_scalar_type_match_found = true; - } - } - - if (!$has_local_match) { - $has_match = false; - break; - } - } - - if ($matching_atomic_types) { - return new Union($matching_atomic_types); - } - - return $new_type; - } - - /** - * @param string[] $suppressed_issues - */ - private static function handleLiteralEquality( - StatementsAnalyzer $statements_analyzer, - string $assertion, - int $bracket_pos, - bool $is_loose_equality, - Union $existing_var_type, - string $old_var_type_string, - ?string $var_id, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues - ): Union { - $value = substr($assertion, $bracket_pos + 1, -1); - - $scalar_type = substr($assertion, 0, $bracket_pos); - - $existing_var_atomic_types = []; - - foreach ($existing_var_type->getAtomicTypes() as $existing_var_atomic_type) { - if ($existing_var_atomic_type instanceof TClassConstant) { - $expanded = TypeExpander::expandAtomic( - $statements_analyzer->getCodebase(), - $existing_var_atomic_type, - $existing_var_atomic_type->fq_classlike_name, - $existing_var_atomic_type->fq_classlike_name, - null, - true, - true - ); - - if ($expanded instanceof Atomic) { - $existing_var_atomic_types[$expanded->getKey()] = $expanded; - } else { - foreach ($expanded as $atomic_type) { - $existing_var_atomic_types[$atomic_type->getKey()] = $atomic_type; - } - } - } else { - $existing_var_atomic_types[$existing_var_atomic_type->getKey()] = $existing_var_atomic_type; - } - } - - if ($scalar_type === 'int') { - return self::handleLiteralEqualityWithInt( - $statements_analyzer, - $assertion, - $bracket_pos, - $is_loose_equality, - $existing_var_type, - $existing_var_atomic_types, - $old_var_type_string, - $var_id, - $negated, - $code_location, - $suppressed_issues - ); - } elseif ($scalar_type === 'string' - || $scalar_type === 'class-string' - || $scalar_type === 'interface-string' - || $scalar_type === 'callable-string' - || $scalar_type === 'trait-string' - ) { - return self::handleLiteralEqualityWithString( - $statements_analyzer, - $assertion, - $scalar_type, - $bracket_pos, - $is_loose_equality, - $existing_var_type, - $existing_var_atomic_types, - $old_var_type_string, - $var_id, - $negated, - $code_location, - $suppressed_issues - ); - } elseif ($scalar_type === 'float') { - return self::handleLiteralEqualityWithFloat( - $statements_analyzer, - $assertion, - $bracket_pos, - $is_loose_equality, - $existing_var_type, - $existing_var_atomic_types, - $old_var_type_string, - $var_id, - $negated, - $code_location, - $suppressed_issues - ); - } elseif ($scalar_type === 'enum') { - [$fq_enum_name, $case_name] = explode('::', $value); - - if ($existing_var_type->hasMixed()) { - if ($is_loose_equality) { - return $existing_var_type; - } - - return new Union([new TEnumCase($fq_enum_name, $case_name)]); - } - - $can_be_equal = false; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $atomic_key => $atomic_type) { - if (get_class($atomic_type) === TNamedObject::class - && $atomic_type->value === $fq_enum_name - ) { - $can_be_equal = true; - $did_remove_type = true; - $existing_var_type->removeType($atomic_key); - $existing_var_type->addType(new TEnumCase($fq_enum_name, $case_name)); - } elseif ($atomic_key !== $assertion) { - $existing_var_type->removeType($atomic_key); - $did_remove_type = true; - } else { - $can_be_equal = true; - } - } - - if ($var_id - && $code_location - && (!$can_be_equal || (!$did_remove_type && count($existing_var_atomic_types) === 1)) - ) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - $can_be_equal, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - return $existing_var_type; - } - - /** - * @param array $existing_var_atomic_types - * @param string[] $suppressed_issues - */ - private static function handleLiteralEqualityWithInt( - StatementsAnalyzer $statements_analyzer, - string $assertion, - int $bracket_pos, - bool $is_loose_equality, - Union $existing_var_type, - array $existing_var_atomic_types, - string $old_var_type_string, - ?string $var_id, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues - ): Union { - $value = (int) substr($assertion, $bracket_pos + 1, -1); - - // we create the literal that is being asserted. We'll return this when we're sure this is the resulting type - $literal_asserted_type = new Union([new TLiteralInt($value)]); - $literal_asserted_type->from_docblock = $existing_var_type->from_docblock; - - $compatible_int_type = self::getCompatibleIntType( - $existing_var_type, - $existing_var_atomic_types, - $value, - $is_loose_equality - ); - - if ($compatible_int_type !== null) { - return $compatible_int_type; - } - - foreach ($existing_var_atomic_types as $existing_var_atomic_type) { - if ($existing_var_atomic_type instanceof TPositiveInt && $value > 0) { - return $literal_asserted_type; - } - - if ($existing_var_atomic_type instanceof TIntRange && $existing_var_atomic_type->contains($value)) { - return $literal_asserted_type; - } - - if ($existing_var_atomic_type instanceof TLiteralInt && $existing_var_atomic_type->value === $value) { - //if we're here, we check that we had at least another type in the union, otherwise it's redundant - - if ($existing_var_type->isSingleIntLiteral()) { - if ($var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - return $existing_var_type; - } - return $literal_asserted_type; - } - - if ($existing_var_atomic_type instanceof TInt && !$existing_var_atomic_type instanceof TLiteralInt) { - return $literal_asserted_type; - } - - if ($existing_var_atomic_type instanceof TTemplateParam) { - $compatible_int_type = self::getCompatibleIntType( - $existing_var_type, - $existing_var_atomic_type->as->getAtomicTypes(), - $value, - $is_loose_equality - ); - if ($compatible_int_type !== null) { - return $compatible_int_type; - } - - $existing_var_atomic_type = clone $existing_var_atomic_type; - - $existing_var_atomic_type->as = self::handleLiteralEquality( - $statements_analyzer, - $assertion, - $bracket_pos, - false, - $existing_var_atomic_type->as, - $old_var_type_string, - $var_id, - $negated, - $code_location, - $suppressed_issues - ); - - return new Union([$existing_var_atomic_type]); - } - - if ($is_loose_equality - && $existing_var_atomic_type instanceof TLiteralFloat - && (int)$existing_var_atomic_type->value === $value - ) { - return new Union([$existing_var_atomic_type]); - } - - if ($is_loose_equality - && $existing_var_atomic_type instanceof TLiteralString - && (int)$existing_var_atomic_type->value === $value - ) { - return new Union([$existing_var_atomic_type]); - } - } - - //here we'll accept non-literal type that *could* match on loose equality and return the original type - foreach ($existing_var_atomic_types as $existing_var_atomic_type) { - //here we'll accept non-literal type that *could* match on loose equality and return the original type - if ($is_loose_equality) { - if ($existing_var_atomic_type instanceof TString - && !$existing_var_atomic_type instanceof TLiteralString - ) { - return $existing_var_type; - } - - if ($existing_var_atomic_type instanceof TFloat - && !$existing_var_atomic_type instanceof TLiteralFloat - ) { - return $existing_var_type; - } - } - } - - //if we're here, no type was eligible for the given literal. We'll emit an impossible error for this assertion - if ($var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - false, - $negated, - $code_location, - $suppressed_issues - ); - } - - return Type::getNever(); - } - - /** - * @param array $existing_var_atomic_types - * @param string[] $suppressed_issues - */ - private static function handleLiteralEqualityWithString( - StatementsAnalyzer $statements_analyzer, - string $assertion, - string $scalar_type, - int $bracket_pos, - bool $is_loose_equality, - Union $existing_var_type, - array $existing_var_atomic_types, - string $old_var_type_string, - ?string $var_id, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues - ): Union { - $value = substr($assertion, $bracket_pos + 1, -1); - - // we create the literal that is being asserted. We'll return this when we're sure this is the resulting type - $literal_asserted_type_string = new Union([new TLiteralString($value)]); - $literal_asserted_type_string->from_docblock = $existing_var_type->from_docblock; - $literal_asserted_type_classstring = new Union([new TLiteralClassString($value)]); - $literal_asserted_type_classstring->from_docblock = $existing_var_type->from_docblock; - - $compatible_string_type = self::getCompatibleStringType( - $existing_var_type, - $existing_var_atomic_types, - $value, - $scalar_type, - $is_loose_equality - ); - - if ($compatible_string_type !== null) { - return $compatible_string_type; - } - - foreach ($existing_var_atomic_types as $existing_var_atomic_type) { - if ($existing_var_atomic_type instanceof TLiteralString && $existing_var_atomic_type->value === $value) { - //if we're here, we check that we had at least another type in the union, otherwise it's redundant - - if ($existing_var_type->isSingleStringLiteral()) { - if ($var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - return $existing_var_type; - } - - if ($scalar_type === 'class-string' - || $scalar_type === 'interface-string' - || $scalar_type === 'trait-string' - ) { - return $literal_asserted_type_classstring; - } - - return $literal_asserted_type_string; - } - - if ($existing_var_atomic_type instanceof TString && !$existing_var_atomic_type instanceof TLiteralString) { - if ($scalar_type === 'class-string' - || $scalar_type === 'interface-string' - || $scalar_type === 'trait-string' - ) { - return $literal_asserted_type_classstring; - } - - return $literal_asserted_type_string; - } - - if ($existing_var_atomic_type instanceof TTemplateParam) { - $compatible_string_type = self::getCompatibleStringType( - $existing_var_type, - $existing_var_atomic_type->as->getAtomicTypes(), - $value, - $scalar_type, - $is_loose_equality - ); - if ($compatible_string_type !== null) { - return $compatible_string_type; - } - - if ($existing_var_atomic_type->as->hasString()) { - if ($scalar_type === 'class-string' - || $scalar_type === 'interface-string' - || $scalar_type === 'trait-string' - ) { - return $literal_asserted_type_classstring; - } - - return $literal_asserted_type_string; - } - - $existing_var_atomic_type = clone $existing_var_atomic_type; - - $existing_var_atomic_type->as = self::handleLiteralEquality( - $statements_analyzer, - $assertion, - $bracket_pos, - false, - $existing_var_atomic_type->as, - $old_var_type_string, - $var_id, - $negated, - $code_location, - $suppressed_issues - ); - - return new Union([$existing_var_atomic_type]); - } - - if ($is_loose_equality - && $existing_var_atomic_type instanceof TLiteralInt - && (string)$existing_var_atomic_type->value === $value - ) { - return new Union([$existing_var_atomic_type]); - } - - if ($is_loose_equality - && $existing_var_atomic_type instanceof TLiteralFloat - && (string)$existing_var_atomic_type->value === $value - ) { - return new Union([$existing_var_atomic_type]); - } - } - - //here we'll accept non-literal type that *could* match on loose equality and return the original type - foreach ($existing_var_atomic_types as $existing_var_atomic_type) { - //here we'll accept non-literal type that *could* match on loose equality and return the original type - if ($is_loose_equality) { - if ($existing_var_atomic_type instanceof TInt - && !$existing_var_atomic_type instanceof TLiteralInt - ) { - return $existing_var_type; - } - - if ($existing_var_atomic_type instanceof TFloat - && !$existing_var_atomic_type instanceof TLiteralFloat - ) { - return $existing_var_type; - } - } - } - - //if we're here, no type was eligible for the given literal. We'll emit an impossible error for this assertion - if ($var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - false, - $negated, - $code_location, - $suppressed_issues - ); - } - - return Type::getNever(); - } - - /** - * @param array $existing_var_atomic_types - * @param string[] $suppressed_issues - */ - private static function handleLiteralEqualityWithFloat( - StatementsAnalyzer $statements_analyzer, - string $assertion, - int $bracket_pos, - bool $is_loose_equality, - Union $existing_var_type, - array $existing_var_atomic_types, - string $old_var_type_string, - ?string $var_id, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues - ): Union { - $value = (float)substr($assertion, $bracket_pos + 1, -1); - - // we create the literal that is being asserted. We'll return this when we're sure this is the resulting type - $literal_asserted_type = new Union([new TLiteralFloat($value)]); - $literal_asserted_type->from_docblock = $existing_var_type->from_docblock; - - $compatible_float_type = self::getCompatibleFloatType( - $existing_var_type, - $existing_var_atomic_types, - $value, - $is_loose_equality - ); - - if ($compatible_float_type !== null) { - return $compatible_float_type; - } - - foreach ($existing_var_atomic_types as $existing_var_atomic_type) { - if ($existing_var_atomic_type instanceof TLiteralFloat && $existing_var_atomic_type->value === $value) { - //if we're here, we check that we had at least another type in the union, otherwise it's redundant - - if ($existing_var_type->isSingleFloatLiteral()) { - if ($var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - return $existing_var_type; - } - - return $literal_asserted_type; - } - - if ($existing_var_atomic_type instanceof TFloat && !$existing_var_atomic_type instanceof TLiteralFloat) { - return $literal_asserted_type; - } - - if ($existing_var_atomic_type instanceof TTemplateParam) { - $compatible_float_type = self::getCompatibleFloatType( - $existing_var_type, - $existing_var_atomic_type->as->getAtomicTypes(), - $value, - $is_loose_equality - ); - if ($compatible_float_type !== null) { - return $compatible_float_type; - } - - if ($existing_var_atomic_type->as->hasFloat()) { - return $literal_asserted_type; - } - - $existing_var_atomic_type = clone $existing_var_atomic_type; - - $existing_var_atomic_type->as = self::handleLiteralEquality( - $statements_analyzer, - $assertion, - $bracket_pos, - false, - $existing_var_atomic_type->as, - $old_var_type_string, - $var_id, - $negated, - $code_location, - $suppressed_issues - ); - - return new Union([$existing_var_atomic_type]); - } - - if ($is_loose_equality - && $existing_var_atomic_type instanceof TLiteralInt - && (float)$existing_var_atomic_type->value === $value - ) { - return new Union([$existing_var_atomic_type]); - } - - if ($is_loose_equality - && $existing_var_atomic_type instanceof TLiteralString - && (float)$existing_var_atomic_type->value === $value - ) { - return new Union([$existing_var_atomic_type]); - } - } - - //here we'll accept non-literal type that *could* match on loose equality and return the original type - foreach ($existing_var_atomic_types as $existing_var_atomic_type) { - if ($is_loose_equality) { - if ($existing_var_atomic_type instanceof TInt - && !$existing_var_atomic_type instanceof TLiteralInt - ) { - return $existing_var_type; - } - - if ($existing_var_atomic_type instanceof TString - && !$existing_var_atomic_type instanceof TLiteralString - ) { - return $existing_var_type; - } - } - } - - //if we're here, no type was eligible for the given literal. We'll emit an impossible error for this assertion - if ($var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - false, - $negated, - $code_location, - $suppressed_issues - ); - } - - return Type::getNever(); - } - - /** - * @param array $existing_var_atomic_types - */ - private static function getCompatibleIntType( - Union $existing_var_type, - array $existing_var_atomic_types, - int $value, - bool $is_loose_equality - ): ?Union { - foreach ($existing_var_atomic_types as $existing_var_atomic_type) { - if ($existing_var_atomic_type instanceof TMixed - || $existing_var_atomic_type instanceof TScalar - || $existing_var_atomic_type instanceof TNumeric - || $existing_var_atomic_type instanceof TArrayKey - ) { - if ($is_loose_equality) { - return $existing_var_type; - } - - $asserted_type = new Union([new TLiteralInt($value)]); - $asserted_type->from_docblock = $existing_var_type->from_docblock; - return $asserted_type; - } - } - - return null; - } - - /** - * @param array $existing_var_atomic_types - */ - private static function getCompatibleStringType( - Union $existing_var_type, - array $existing_var_atomic_types, - string $value, - string $scalar_type, - bool $is_loose_equality - ): ?Union { - foreach ($existing_var_atomic_types as $existing_var_atomic_type) { - if ($existing_var_atomic_type instanceof TMixed - || $existing_var_atomic_type instanceof TScalar - || $existing_var_atomic_type instanceof TArrayKey - ) { - if ($is_loose_equality) { - return $existing_var_type; - } - - if ($scalar_type === 'class-string' - || $scalar_type === 'interface-string' - || $scalar_type === 'trait-string' - ) { - $asserted_type = new Union([new TLiteralClassString($value)]); - $asserted_type->from_docblock = $existing_var_type->from_docblock; - return $asserted_type; - } - - $asserted_type = new Union([new TLiteralString($value)]); - $asserted_type->from_docblock = $existing_var_type->from_docblock; - return $asserted_type; - } - } - - return null; - } - - /** - * @param array $existing_var_atomic_types - */ - private static function getCompatibleFloatType( - Union $existing_var_type, - array $existing_var_atomic_types, - float $value, - bool $is_loose_equality - ): ?Union { - foreach ($existing_var_atomic_types as $existing_var_atomic_type) { - if ($existing_var_atomic_type instanceof TMixed - || $existing_var_atomic_type instanceof TScalar - || $existing_var_atomic_type instanceof TNumeric - ) { - if ($is_loose_equality) { - return $existing_var_type; - } - - $asserted_type = new Union([new TLiteralFloat($value)]); - $asserted_type->from_docblock = $existing_var_type->from_docblock; - return $asserted_type; - } - } - - return null; - } - - /** - * @param array> $template_type_map - * @param array $suppressed_issues - */ - private static function handleIsA( - Codebase $codebase, - Union $existing_var_type, - string &$assertion, - array $template_type_map, - ?CodeLocation $code_location, - ?string $key, - array $suppressed_issues, - bool &$should_return - ): Union { - $assertion = substr($assertion, 4); - - $allow_string_comparison = false; - - if (strpos($assertion, 'string-') === 0) { - $assertion = substr($assertion, 7); - $allow_string_comparison = true; - } - - if ($existing_var_type->hasMixed()) { - $type = new Union([ - new TNamedObject($assertion), - ]); - - if ($allow_string_comparison) { - $type->addType( - new TClassString( - $assertion, - new TNamedObject($assertion) - ) - ); - } - - $should_return = true; - return $type; - } - - $existing_has_object = $existing_var_type->hasObjectType(); - $existing_has_string = $existing_var_type->hasString(); - - if ($existing_has_object && !$existing_has_string) { - return Type::parseString($assertion, null, $template_type_map); - } - - if ($existing_has_string && !$existing_has_object) { - if (!$allow_string_comparison && $code_location) { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - 'Cannot allow string comparison to object for ' . $key, - $code_location, - null - ), - $suppressed_issues - ); - - return Type::getMixed(); - } else { - $new_type_has_interface_string = $codebase->interfaceExists($assertion); - - $old_type_has_interface_string = false; - - foreach ($existing_var_type->getAtomicTypes() as $existing_type_part) { - if ($existing_type_part instanceof TClassString - && $existing_type_part->as_type - && $codebase->interfaceExists($existing_type_part->as_type->value) - ) { - $old_type_has_interface_string = true; - break; - } - } - - if (isset($template_type_map[$assertion])) { - $new_type = Type::parseString( - 'class-string<' . $assertion . '>', - null, - $template_type_map - ); - } else { - $new_type = Type::getClassString($assertion); - } - - if (( - $new_type_has_interface_string - && !UnionTypeComparator::isContainedBy( - $codebase, - $existing_var_type, - $new_type - ) - ) - || ( - $old_type_has_interface_string - && !UnionTypeComparator::isContainedBy( - $codebase, - $new_type, - $existing_var_type - ) - ) - ) { - $new_type_part = Atomic::create($assertion, null, $template_type_map); - - $acceptable_atomic_types = []; - - foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_part) { - if (!$new_type_part instanceof TNamedObject - || !$existing_var_type_part instanceof TClassString - ) { - $acceptable_atomic_types = []; - - break; - } - - if (!$existing_var_type_part->as_type instanceof TNamedObject) { - $acceptable_atomic_types = []; - - break; - } - - $existing_var_type_part = $existing_var_type_part->as_type; - - if (AtomicTypeComparator::isContainedBy( - $codebase, - $existing_var_type_part, - $new_type_part - )) { - $acceptable_atomic_types[] = clone $existing_var_type_part; - continue; - } - - if ($codebase->classExists($existing_var_type_part->value) - || $codebase->interfaceExists($existing_var_type_part->value) - ) { - $existing_var_type_part = clone $existing_var_type_part; - $existing_var_type_part->addIntersectionType($new_type_part); - $acceptable_atomic_types[] = $existing_var_type_part; - } - } - - if (count($acceptable_atomic_types) === 1) { - $should_return = true; - - return new Union([ - new TClassString('object', $acceptable_atomic_types[0]), - ]); - } - } - } - - return $new_type; - } else { - return Type::getMixed(); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php deleted file mode 100644 index d1b31b89..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php +++ /dev/null @@ -1,293 +0,0 @@ -equals( - new TArray([ - new Union([new TEmpty()]), - new Union([new TEmpty()]) - ]), - false - ); - - if ($is_empty_array - && (($container_type_part instanceof TArray - && !$container_type_part instanceof TNonEmptyArray) - || ($container_type_part instanceof TKeyedArray - && !$container_type_part->isNonEmpty()) - ) - ) { - return true; - } - - if ($container_type_part instanceof TKeyedArray - && $input_type_part instanceof TArray - ) { - $all_string_int_literals = true; - - $properties = []; - - foreach ($input_type_part->type_params[0]->getAtomicTypes() as $atomic_key_type) { - if ($atomic_key_type instanceof TLiteralString || $atomic_key_type instanceof TLiteralInt) { - $properties[$atomic_key_type->value] = clone $input_type_part->type_params[1]; - $properties[$atomic_key_type->value]->possibly_undefined = true; - } else { - $all_string_int_literals = false; - } - } - - if ($all_string_int_literals && $properties) { - $input_type_part = new TKeyedArray($properties); - - return KeyedArrayComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $atomic_comparison_result - ); - } - } - - if ($container_type_part instanceof TList - && $input_type_part instanceof TKeyedArray - ) { - if ($input_type_part->is_list) { - $input_type_part = $input_type_part->getList(); - } else { - return false; - } - } - - if ($container_type_part instanceof TList - && $input_type_part instanceof TClassStringMap - ) { - return false; - } - - if ($container_type_part instanceof TList - && $input_type_part instanceof TArray - && $input_type_part->type_params[1]->isEmpty() - ) { - return !$container_type_part instanceof TNonEmptyList; - } - - if ($container_type_part instanceof TNonEmptyList - && $input_type_part instanceof TNonEmptyArray - && $input_type_part->type_params[0]->isSingleIntLiteral() - && $input_type_part->type_params[0]->getSingleIntLiteral()->value === 0 - ) { - //this is a special case where the only offset value of an non empty array is 0, so it's a non empty list - return UnionTypeComparator::isContainedBy( - $codebase, - $input_type_part->type_params[1], - $container_type_part->type_param, - $input_type_part->type_params[1]->ignore_nullable_issues, - $input_type_part->type_params[1]->ignore_falsable_issues, - $atomic_comparison_result, - $allow_interface_equality - ); - } - - if ($input_type_part instanceof TList - && $container_type_part instanceof TList - ) { - if (!UnionTypeComparator::isContainedBy( - $codebase, - $input_type_part->type_param, - $container_type_part->type_param, - $input_type_part->type_param->ignore_nullable_issues, - $input_type_part->type_param->ignore_falsable_issues, - $atomic_comparison_result, - $allow_interface_equality - )) { - return false; - } - - return $input_type_part instanceof TNonEmptyList - || !$container_type_part instanceof TNonEmptyList; - } - - if ($container_type_part instanceof TKeyedArray) { - if ($container_type_part->is_list) { - $container_type_part = $container_type_part->getList(); - - return self::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $atomic_comparison_result - ); - } - - $container_type_part = $container_type_part->getGenericArrayType(); - } - - if ($input_type_part instanceof TKeyedArray) { - $input_type_part = $input_type_part->getGenericArrayType(); - } - - if ($input_type_part instanceof TClassStringMap) { - $input_type_part = new TArray([ - $input_type_part->getStandinKeyParam(), - clone $input_type_part->value_param - ]); - } - - if ($container_type_part instanceof TClassStringMap) { - $container_type_part = new TArray([ - $container_type_part->getStandinKeyParam(), - clone $container_type_part->value_param - ]); - } - - if ($container_type_part instanceof TList) { - $all_types_contain = false; - - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - $container_type_part = new TArray([Type::getInt(), clone $container_type_part->type_param]); - } - - if ($input_type_part instanceof TList) { - if ($input_type_part instanceof TNonEmptyList) { - // if the array has a known size < 10, make sure the array keys are literal ints - if ($input_type_part->count !== null && $input_type_part->count < 10) { - $literal_ints = array_map( - function ($i) { - return new TLiteralInt($i); - }, - range(0, $input_type_part->count - 1) - ); - - $input_type_part = new TNonEmptyArray([ - new Union($literal_ints), - clone $input_type_part->type_param - ]); - } else { - $input_type_part = new TNonEmptyArray([Type::getInt(), clone $input_type_part->type_param]); - } - } else { - $input_type_part = new TArray([Type::getInt(), clone $input_type_part->type_param]); - } - } - - foreach ($input_type_part->type_params as $i => $input_param) { - if ($i > 1) { - break; - } - - $container_param = $container_type_part->type_params[$i]; - - if ($i === 0 - && $input_param->hasMixed() - && $container_param->hasString() - && $container_param->hasInt() - ) { - continue; - } - - if ($input_param->isEmpty() - && $container_type_part instanceof TNonEmptyArray - ) { - return false; - } - - $param_comparison_result = new TypeComparisonResult(); - - if (!$input_param->isEmpty()) { - if (!UnionTypeComparator::isContainedBy( - $codebase, - $input_param, - $container_param, - $input_param->ignore_nullable_issues, - $input_param->ignore_falsable_issues, - $param_comparison_result, - $allow_interface_equality - )) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced - = $param_comparison_result->type_coerced === true - && $atomic_comparison_result->type_coerced !== false; - - $atomic_comparison_result->type_coerced_from_mixed - = $param_comparison_result->type_coerced_from_mixed === true - && $atomic_comparison_result->type_coerced_from_mixed !== false; - - $atomic_comparison_result->type_coerced_from_as_mixed - = $param_comparison_result->type_coerced_from_as_mixed === true - && $atomic_comparison_result->type_coerced_from_as_mixed !== false; - - $atomic_comparison_result->type_coerced_from_scalar - = $param_comparison_result->type_coerced_from_scalar === true - && $atomic_comparison_result->type_coerced_from_scalar !== false; - - $atomic_comparison_result->scalar_type_match_found - = $param_comparison_result->scalar_type_match_found === true - && $atomic_comparison_result->scalar_type_match_found !== false; - } - - if (!$param_comparison_result->type_coerced_from_as_mixed) { - $all_types_contain = false; - } - } else { - if ($atomic_comparison_result) { - $atomic_comparison_result->to_string_cast - = $atomic_comparison_result->to_string_cast === true - || $param_comparison_result->to_string_cast === true; - } - } - } - } - - if ($container_type_part instanceof TNonEmptyArray - && !$input_type_part instanceof TNonEmptyArray - ) { - if ($all_types_contain && $atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - return $all_types_contain; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php deleted file mode 100644 index 6f35b1ff..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php +++ /dev/null @@ -1,712 +0,0 @@ -extra_types))) - && ($input_type_part instanceof TTemplateParam - || ($input_type_part instanceof TNamedObject - && isset($input_type_part->extra_types))) - ) { - return ObjectComparator::isShallowlyContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $atomic_comparison_result - ); - } - - if ($container_type_part instanceof TMixed - || ($container_type_part instanceof TTemplateParam - && $container_type_part->as->isMixed() - && !$container_type_part->extra_types - && $input_type_part instanceof TMixed) - ) { - if (get_class($container_type_part) === TEmptyMixed::class - && get_class($input_type_part) === TMixed::class - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_mixed = true; - } - - return false; - } - - return true; - } - - if ($input_type_part instanceof TNever || $input_type_part instanceof TEmpty) { - return true; - } - - if ($input_type_part instanceof TMixed - || ($input_type_part instanceof TTemplateParam - && $input_type_part->as->isMixed() - && !$input_type_part->extra_types) - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_mixed = true; - } - - return false; - } - - if ($input_type_part instanceof TNull) { - if ($container_type_part instanceof TNull) { - return true; - } - - if ($container_type_part instanceof TTemplateParam - && ($container_type_part->as->isNullable() || $container_type_part->as->isMixed()) - ) { - return true; - } - - return false; - } - - if ($container_type_part instanceof TNull) { - return false; - } - - if ($input_type_part instanceof Scalar && $container_type_part instanceof Scalar) { - return ScalarTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $allow_float_int_equality, - $atomic_comparison_result - ); - } - - if ($input_type_part instanceof TCallableKeyedArray - && $container_type_part instanceof TArray - ) { - return ArrayTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $atomic_comparison_result - ); - } - - if (($container_type_part instanceof TCallable - && $input_type_part instanceof TCallable) - || ($container_type_part instanceof TClosure - && $input_type_part instanceof TClosure) - ) { - return CallableTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $atomic_comparison_result - ); - } - - if ($container_type_part instanceof TClosure) { - if ($input_type_part instanceof TCallable) { - if (CallableTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $atomic_comparison_result - ) === false - ) { - return false; - } - - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - } - - return false; - } - - if ($container_type_part instanceof TCallable && $input_type_part instanceof TClosure) { - return CallableTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $atomic_comparison_result - ); - } - - if ($input_type_part instanceof TNamedObject && - $input_type_part->value === 'Closure' && - $container_type_part instanceof TCallable - ) { - return true; - } - - if ($input_type_part instanceof TObject && - $container_type_part instanceof TCallable - ) { - return true; - } - - if ($input_type_part instanceof TCallableObject && - $container_type_part instanceof TObject - ) { - return true; - } - - if (($container_type_part instanceof TKeyedArray - && $input_type_part instanceof TKeyedArray) - || ($container_type_part instanceof TObjectWithProperties - && $input_type_part instanceof TObjectWithProperties) - ) { - return KeyedArrayComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $atomic_comparison_result - ); - } - - if ($container_type_part instanceof TObjectWithProperties - && $input_type_part instanceof TObject - && !$input_type_part instanceof TObjectWithProperties - && !$input_type_part instanceof TCallableObject - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - return false; - } - - if (($input_type_part instanceof TArray - || $input_type_part instanceof TList - || $input_type_part instanceof TKeyedArray - || $input_type_part instanceof TClassStringMap) - && ($container_type_part instanceof TArray - || $container_type_part instanceof TList - || $container_type_part instanceof TKeyedArray - || $container_type_part instanceof TClassStringMap) - ) { - return ArrayTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $atomic_comparison_result - ); - } - - if (get_class($container_type_part) === TNamedObject::class - && $input_type_part instanceof TEnumCase - && $input_type_part->value === $container_type_part->value - ) { - return true; - } - - if (get_class($input_type_part) === TNamedObject::class - && $container_type_part instanceof TEnumCase - && $input_type_part->value === $container_type_part->value - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if (($input_type_part instanceof TNamedObject - || ($input_type_part instanceof TTemplateParam - && $input_type_part->as->hasObjectType()) - || $input_type_part instanceof TIterable) - && ($container_type_part instanceof TNamedObject - || ($container_type_part instanceof TTemplateParam - && $container_type_part->isObjectType()) - || $container_type_part instanceof TIterable) - && ObjectComparator::isShallowlyContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $atomic_comparison_result - ) - ) { - if ($container_type_part instanceof TGenericObject || $container_type_part instanceof TIterable) { - return GenericTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $atomic_comparison_result - ); - } - - if ($container_type_part instanceof TNamedObject - && $input_type_part instanceof TNamedObject - && $container_type_part->was_static - && !$input_type_part->was_static - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if ($atomic_comparison_result) { - $atomic_comparison_result->to_string_cast = false; - } - - return true; - } - - if (get_class($input_type_part) === TObject::class - && get_class($container_type_part) === TObject::class - ) { - return true; - } - - if ($container_type_part instanceof TTemplateParam && $input_type_part instanceof TTemplateParam) { - return UnionTypeComparator::isContainedBy( - $codebase, - $input_type_part->as, - $container_type_part->as, - false, - false, - $atomic_comparison_result, - $allow_interface_equality - ); - } - - if ($container_type_part instanceof TTemplateParam) { - foreach ($container_type_part->as->getAtomicTypes() as $container_as_type_part) { - if (self::isContainedBy( - $codebase, - $input_type_part, - $container_as_type_part, - $allow_interface_equality, - $allow_float_int_equality, - $atomic_comparison_result - )) { - if ($allow_interface_equality) { - return true; - } - } - } - - return false; - } - - if ($container_type_part instanceof TConditional) { - $atomic_types = array_merge( - array_values($container_type_part->if_type->getAtomicTypes()), - array_values($container_type_part->else_type->getAtomicTypes()) - ); - - foreach ($atomic_types as $container_as_type_part) { - if (self::isContainedBy( - $codebase, - $input_type_part, - $container_as_type_part, - $allow_interface_equality, - $allow_float_int_equality, - $atomic_comparison_result - )) { - return true; - } - } - - return false; - } - - if ($input_type_part instanceof TTemplateParam) { - if ($input_type_part->extra_types) { - foreach ($input_type_part->extra_types as $extra_type) { - if (self::isContainedBy( - $codebase, - $extra_type, - $container_type_part, - $allow_interface_equality, - $allow_float_int_equality, - $atomic_comparison_result - )) { - return true; - } - } - } - - foreach ($input_type_part->as->getAtomicTypes() as $input_as_type_part) { - if (self::isContainedBy( - $codebase, - $input_as_type_part, - $container_type_part, - $allow_interface_equality, - $allow_float_int_equality, - $atomic_comparison_result - )) { - return true; - } - } - - return false; - } - - if ($input_type_part instanceof TConditional) { - $input_atomic_types = array_merge( - array_values($input_type_part->if_type->getAtomicTypes()), - array_values($input_type_part->else_type->getAtomicTypes()) - ); - - foreach ($input_atomic_types as $input_as_type_part) { - if (self::isContainedBy( - $codebase, - $input_as_type_part, - $container_type_part, - $allow_interface_equality, - $allow_float_int_equality, - $atomic_comparison_result - )) { - return true; - } - } - - return false; - } - - if ($input_type_part instanceof TNamedObject - && $input_type_part->value === 'static' - && $container_type_part instanceof TNamedObject - && strtolower($container_type_part->value) === 'self' - ) { - return true; - } - - if ($container_type_part instanceof TIterable) { - if ($input_type_part instanceof TArray - || $input_type_part instanceof TKeyedArray - || $input_type_part instanceof TList - ) { - if ($input_type_part instanceof TKeyedArray) { - $input_type_part = $input_type_part->getGenericArrayType(); - } elseif ($input_type_part instanceof TList) { - $input_type_part = new TArray([Type::getInt(), $input_type_part->type_param]); - } - - $all_types_contain = true; - - foreach ($input_type_part->type_params as $i => $input_param) { - $container_param_offset = $i - (2 - count($container_type_part->type_params)); - - if ($container_param_offset === -1) { - continue; - } - - $container_param = $container_type_part->type_params[$container_param_offset]; - - if ($i === 0 - && $input_param->hasMixed() - && $container_param->hasString() - && $container_param->hasInt() - ) { - continue; - } - - $array_comparison_result = new TypeComparisonResult(); - - if (!$input_param->isEmpty()) { - if (!UnionTypeComparator::isContainedBy( - $codebase, - $input_param, - $container_param, - $input_param->ignore_nullable_issues, - $input_param->ignore_falsable_issues, - $array_comparison_result, - $allow_interface_equality - ) - && !$array_comparison_result->type_coerced_from_scalar - ) { - if ($atomic_comparison_result && $array_comparison_result->type_coerced_from_mixed) { - $atomic_comparison_result->type_coerced_from_mixed = true; - } - $all_types_contain = false; - } else { - if ($atomic_comparison_result) { - $atomic_comparison_result->to_string_cast - = $atomic_comparison_result->to_string_cast === true - || $array_comparison_result->to_string_cast === true; - } - } - } - } - return $all_types_contain; - } - - if ($input_type_part->hasTraversableInterface($codebase)) { - return true; - } - } - - if ($container_type_part instanceof TString || $container_type_part instanceof TScalar) { - if ($input_type_part instanceof TNamedObject) { - // check whether the object has a __toString method - if ($codebase->classOrInterfaceExists($input_type_part->value)) { - if ($codebase->php_major_version >= 8 - && ($input_type_part->value === 'Stringable' - || ($codebase->classlikes->classExists($input_type_part->value) - && $codebase->classlikes->classImplements($input_type_part->value, 'Stringable')) - || $codebase->classlikes->interfaceExtends($input_type_part->value, 'Stringable')) - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->to_string_cast = true; - } - - return true; - } - - if ($codebase->methods->methodExists( - new MethodIdentifier( - $input_type_part->value, - '__tostring' - ) - )) { - if ($atomic_comparison_result) { - $atomic_comparison_result->to_string_cast = true; - } - - return true; - } - } - - // PHP 5.6 doesn't support this natively, so this introduces a bug *just* when checking PHP 5.6 code - if ($input_type_part->value === 'ReflectionType') { - if ($atomic_comparison_result) { - $atomic_comparison_result->to_string_cast = true; - } - - return true; - } - } elseif ($input_type_part instanceof TObjectWithProperties - && isset($input_type_part->methods['__toString']) - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->to_string_cast = true; - } - - return true; - } - } - - if ($container_type_part instanceof TCallable && - ( - $input_type_part instanceof TLiteralString - || $input_type_part instanceof TCallableString - || $input_type_part instanceof TArray - || $input_type_part instanceof TKeyedArray - || $input_type_part instanceof TList - || ( - $input_type_part instanceof TNamedObject && - $codebase->classOrInterfaceExists($input_type_part->value) && - $codebase->methodExists($input_type_part->value . '::__invoke') - ) - ) - ) { - return CallableTypeComparator::isNotExplicitlyCallableTypeCallable( - $codebase, - $input_type_part, - $container_type_part, - $atomic_comparison_result - ); - } - - if ($container_type_part instanceof TObject - && $input_type_part instanceof TNamedObject - ) { - if ($container_type_part instanceof TObjectWithProperties - && $input_type_part->value !== 'stdClass' - ) { - return KeyedArrayComparator::isContainedByObjectWithProperties( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $atomic_comparison_result - ); - } - - return true; - } - - if ($container_type_part instanceof TNamedObject - && $input_type_part instanceof TNamedObject - && $container_type_part->was_static - && !$input_type_part->was_static - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if ($input_type_part instanceof TObject && $container_type_part instanceof TNamedObject) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if ($container_type_part instanceof TNamedObject - && $input_type_part instanceof TNamedObject - && $codebase->classOrInterfaceOrEnumExists($input_type_part->value) - && ( - ( - $codebase->classExists($container_type_part->value) - && $codebase->classExtendsOrImplements( - $container_type_part->value, - $input_type_part->value - ) - ) - || - ( - $codebase->interfaceExists($container_type_part->value) - && $codebase->interfaceExtends( - $container_type_part->value, - $input_type_part->value - ) - ) - ) - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - return $input_type_part->getKey() === $container_type_part->getKey(); - } - - /** - * Does the input param atomic type match the given param atomic type - */ - public static function canBeIdentical( - Codebase $codebase, - Atomic $type1_part, - Atomic $type2_part, - bool $allow_interface_equality = true - ): bool { - if ((get_class($type1_part) === TList::class - && $type2_part instanceof TNonEmptyList) - || (get_class($type2_part) === TList::class - && $type1_part instanceof TNonEmptyList) - ) { - return UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $type1_part->type_param, - $type2_part->type_param - ); - } - - if ((get_class($type1_part) === TArray::class - && $type2_part instanceof TNonEmptyArray) - || (get_class($type2_part) === TArray::class - && $type1_part instanceof TNonEmptyArray) - ) { - return UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $type1_part->type_params[0], - $type2_part->type_params[0] - ) - && UnionTypeComparator::canExpressionTypesBeIdentical( - $codebase, - $type1_part->type_params[1], - $type2_part->type_params[1] - ); - } - - $first_comparison_result = new TypeComparisonResult(); - $second_comparison_result = new TypeComparisonResult(); - - return (self::isContainedBy( - $codebase, - $type1_part, - $type2_part, - $allow_interface_equality, - false, - $first_comparison_result - ) - && !$first_comparison_result->to_string_cast - ) || (self::isContainedBy( - $codebase, - $type2_part, - $type1_part, - $allow_interface_equality, - false, - $second_comparison_result - ) - && !$second_comparison_result->to_string_cast - ) || ($first_comparison_result->type_coerced - && $second_comparison_result->type_coerced - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php deleted file mode 100644 index 107e3dd5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php +++ /dev/null @@ -1,524 +0,0 @@ -is_pure && !$input_type_part->is_pure) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = $input_type_part->is_pure === null; - } - - return false; - } - - if ($container_type_part->params !== null && $input_type_part->params === null) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_mixed = true; - } - - return false; - } - - if ($input_type_part->params !== null && $container_type_part->params !== null) { - foreach ($input_type_part->params as $i => $input_param) { - $container_param = null; - - if (isset($container_type_part->params[$i])) { - $container_param = $container_type_part->params[$i]; - } elseif ($container_type_part->params) { - $last_param = end($container_type_part->params); - - if ($last_param->is_variadic) { - $container_param = $last_param; - } - } - - if (!$container_param) { - if ($input_param->is_optional) { - break; - } - - return false; - } - - if ($container_param->type - && !$container_param->type->hasMixed() - && !UnionTypeComparator::isContainedBy( - $codebase, - $container_param->type, - $input_param->type ?: Type::getMixed(), - false, - false, - $atomic_comparison_result - ) - ) { - return false; - } - } - } - - if (isset($container_type_part->return_type)) { - if (!isset($input_type_part->return_type)) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_mixed = true; - } - - return false; - } - - $input_return = $input_type_part->return_type; - - if ($input_return->isVoid() && $container_type_part->return_type->isNullable()) { - return true; - } - - if (!$container_type_part->return_type->isVoid() - && !UnionTypeComparator::isContainedBy( - $codebase, - $input_return, - $container_type_part->return_type, - false, - false, - $atomic_comparison_result - ) - ) { - return false; - } - } - - return true; - } - - public static function isNotExplicitlyCallableTypeCallable( - Codebase $codebase, - Atomic $input_type_part, - TCallable $container_type_part, - ?TypeComparisonResult $atomic_comparison_result - ): bool { - if ($input_type_part instanceof TList) { - if ($input_type_part->type_param->isMixed() - || $input_type_part->type_param->hasScalar() - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced_from_mixed = true; - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if (!$input_type_part->type_param->hasString()) { - return false; - } - - if (!$input_type_part instanceof TCallableList) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced_from_mixed = true; - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - } - - if ($input_type_part instanceof TArray) { - if ($input_type_part->type_params[1]->isMixed() - || $input_type_part->type_params[1]->hasScalar() - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced_from_mixed = true; - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if (!$input_type_part->type_params[1]->hasString()) { - return false; - } - - if (!$input_type_part instanceof TCallableArray) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced_from_mixed = true; - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - } elseif ($input_type_part instanceof TKeyedArray) { - $method_id = self::getCallableMethodIdFromTKeyedArray($input_type_part); - - if ($method_id === 'not-callable') { - return false; - } - - if (!$method_id) { - return true; - } - - try { - $method_id = $codebase->methods->getDeclaringMethodId($method_id); - - if (!$method_id) { - return false; - } - - $codebase->methods->getStorage($method_id); - } catch (Exception $e) { - return false; - } - } - - $input_callable = self::getCallableFromAtomic($codebase, $input_type_part, $container_type_part, null, true); - - if ($input_callable) { - if (self::isContainedBy( - $codebase, - $input_callable, - $container_type_part, - $atomic_comparison_result - ) === false - ) { - return false; - } - } - - return true; - } - - /** - * @return TCallable|TClosure|null - */ - public static function getCallableFromAtomic( - Codebase $codebase, - Atomic $input_type_part, - ?TCallable $container_type_part = null, - ?StatementsAnalyzer $statements_analyzer = null, - bool $expand_callable = false - ): ?Atomic { - if ($input_type_part instanceof TCallable || $input_type_part instanceof TClosure) { - return $input_type_part; - } - - if ($input_type_part instanceof TLiteralString && $input_type_part->value) { - try { - $function_storage = $codebase->functions->getStorage( - $statements_analyzer, - strtolower($input_type_part->value) - ); - - if ($expand_callable) { - $params = []; - - foreach ($function_storage->params as $param) { - $param = clone $param; - - if ($param->type) { - $param->type = TypeExpander::expandUnion( - $codebase, - $param->type, - null, - null, - null, - true, - true, - false, - false, - true - ); - } - - $params[] = $param; - } - - $return_type = null; - - if ($function_storage->return_type) { - $return_type = TypeExpander::expandUnion( - $codebase, - $function_storage->return_type, - null, - null, - null, - true, - true, - false, - false, - true - ); - } - } else { - $return_type = $function_storage->return_type; - $params = $function_storage->params; - } - - return new TCallable( - 'callable', - $params, - $return_type, - $function_storage->pure - ); - } catch (UnexpectedValueException $e) { - if (InternalCallMapHandler::inCallMap($input_type_part->value)) { - $args = []; - - $nodes = new NodeDataProvider(); - - if ($container_type_part && $container_type_part->params) { - foreach ($container_type_part->params as $i => $param) { - $arg = new Arg( - new Variable('_' . $i) - ); - - if ($param->type) { - $nodes->setType($arg->value, $param->type); - } - - $args[] = $arg; - } - } - - $matching_callable = InternalCallMapHandler::getCallableFromCallMapById( - $codebase, - $input_type_part->value, - $args, - $nodes - ); - - $must_use = false; - - $matching_callable->is_pure = $codebase->functions->isCallMapFunctionPure( - $codebase, - $statements_analyzer->node_data ?? null, - $input_type_part->value, - null, - $must_use - ); - - return $matching_callable; - } - } - } elseif ($input_type_part instanceof TKeyedArray) { - $method_id = self::getCallableMethodIdFromTKeyedArray($input_type_part); - if ($method_id && $method_id !== 'not-callable') { - try { - $method_storage = $codebase->methods->getStorage($method_id); - $method_fqcln = $method_id->fq_class_name; - - $converted_return_type = null; - - if ($method_storage->return_type) { - $converted_return_type = TypeExpander::expandUnion( - $codebase, - $method_storage->return_type, - $method_fqcln, - $method_fqcln, - null - ); - } - - return new TCallable( - 'callable', - $method_storage->params, - $converted_return_type, - $method_storage->pure - ); - } catch (UnexpectedValueException $e) { - // do nothing - } - } - } elseif ($input_type_part instanceof TNamedObject - && $input_type_part->value === 'Closure' - ) { - return new TCallable(); - } elseif ($input_type_part instanceof TNamedObject - && $codebase->classExists($input_type_part->value) - ) { - $invoke_id = new MethodIdentifier( - $input_type_part->value, - '__invoke' - ); - - if ($codebase->methods->methodExists($invoke_id)) { - $declaring_method_id = $codebase->methods->getDeclaringMethodId($invoke_id); - - if ($declaring_method_id) { - $method_storage = $codebase->methods->getStorage($declaring_method_id); - $method_fqcln = $invoke_id->fq_class_name; - $converted_return_type = null; - if ($method_storage->return_type) { - $converted_return_type = TypeExpander::expandUnion( - $codebase, - $method_storage->return_type, - $method_fqcln, - $method_fqcln, - null - ); - } - - return new TCallable( - 'callable', - $method_storage->params, - $converted_return_type, - $method_storage->pure - ); - } - } - } - - return null; - } - - /** @return null|'not-callable'|MethodIdentifier */ - public static function getCallableMethodIdFromTKeyedArray( - TKeyedArray $input_type_part, - ?Codebase $codebase = null, - ?string $calling_method_id = null, - ?string $file_name = null - ) { - if (!isset($input_type_part->properties[0]) - || !isset($input_type_part->properties[1]) - ) { - return 'not-callable'; - } - - [$lhs, $rhs] = $input_type_part->properties; - - $rhs_low_info = $rhs->hasMixed() || $rhs->hasScalar(); - - if ($rhs_low_info || !$rhs->isSingleStringLiteral()) { - if (!$rhs_low_info && !$rhs->hasString()) { - return 'not-callable'; - } - - if ($codebase && ($calling_method_id || $file_name)) { - foreach ($lhs->getAtomicTypes() as $lhs_atomic_type) { - if ($lhs_atomic_type instanceof TNamedObject) { - $codebase->analyzer->addMixedMemberName( - strtolower($lhs_atomic_type->value) . '::', - $calling_method_id ?: $file_name - ); - } elseif ($lhs_atomic_type instanceof TTemplateParam) { - $lhs_template_type = $lhs_atomic_type->as; - if ($lhs_template_type->isSingle()) { - $lhs_template_atomic_type = $lhs_template_type->getSingleAtomic(); - $member_id = null; - if ($lhs_template_atomic_type instanceof TNamedObject) { - $member_id = $lhs_template_atomic_type->value; - } elseif ($lhs_template_atomic_type instanceof TClassString) { - $member_id = $lhs_template_atomic_type->as; - } - - if ($member_id) { - $codebase->analyzer->addMixedMemberName( - strtolower($member_id) . '::', - $calling_method_id ?: $file_name - ); - } - } - } - } - } - - return null; - } - - $method_name = $rhs->getSingleStringLiteral()->value; - - $class_name = null; - - if ($lhs->isSingleStringLiteral()) { - $class_name = $lhs->getSingleStringLiteral()->value; - if ($class_name[0] === '\\') { - $class_name = substr($class_name, 1); - } - } elseif ($lhs->isSingle()) { - foreach ($lhs->getAtomicTypes() as $lhs_atomic_type) { - if ($lhs_atomic_type instanceof TNamedObject) { - $class_name = $lhs_atomic_type->value; - } elseif ($lhs_atomic_type instanceof TTemplateParam) { - $lhs_template_type = $lhs_atomic_type->as; - if ($lhs_template_type->isSingle()) { - $lhs_template_atomic_type = $lhs_template_type->getSingleAtomic(); - if ($lhs_template_atomic_type instanceof TNamedObject) { - $class_name = $lhs_template_atomic_type->value; - } elseif ($lhs_template_atomic_type instanceof TClassString) { - $class_name = $lhs_template_atomic_type->as; - } - } - } elseif ($lhs_atomic_type instanceof TClassString - && $lhs_atomic_type->as - ) { - $class_name = $lhs_atomic_type->as; - } - } - } - - if ($class_name === 'self' - || $class_name === 'static' - || $class_name === 'parent' - ) { - return null; - } - - if (!$class_name) { - if ($codebase && ($calling_method_id || $file_name)) { - $codebase->analyzer->addMixedMemberName( - strtolower($method_name), - $calling_method_id ?: $file_name - ); - } - - return null; - } - - return new MethodIdentifier( - $class_name, - strtolower($method_name) - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php deleted file mode 100644 index afc0d2c1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php +++ /dev/null @@ -1,92 +0,0 @@ -value === $input_type_part->value; - } - - if ($container_type_part instanceof TTemplateParamClass - && get_class($input_type_part) === TClassString::class - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if ($container_type_part instanceof TClassString - && $container_type_part->as === 'object' - && !$container_type_part->as_type - ) { - return true; - } - - if ($input_type_part instanceof TClassString - && $input_type_part->as === 'object' - && !$input_type_part->as_type - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_scalar = true; - } - - return false; - } - - $fake_container_object = $container_type_part instanceof TClassString - && $container_type_part->as_type - ? $container_type_part->as_type - : new TNamedObject( - $container_type_part instanceof TClassString - ? $container_type_part->as - : $container_type_part->value - ); - - $fake_input_object = $input_type_part instanceof TClassString - && $input_type_part->as_type - ? $input_type_part->as_type - : new TNamedObject( - $input_type_part instanceof TClassString - ? $input_type_part->as - : $input_type_part->value - ); - - return AtomicTypeComparator::isContainedBy( - $codebase, - $fake_input_object, - $fake_container_object, - $allow_interface_equality, - false, - $atomic_comparison_result - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php deleted file mode 100644 index 8cd529c6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php +++ /dev/null @@ -1,207 +0,0 @@ -extra_types - && !$input_type_part instanceof TIterable - ) { - $container_type_part = new TGenericObject( - 'Traversable', - $container_type_part->type_params - ); - - $container_was_iterable = true; - } - - if (!$input_type_part instanceof TNamedObject && !$input_type_part instanceof TIterable) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_mixed = true; - } - - return false; - } - - $container_type_params_covariant = []; - - $input_type_params = TemplateStandinTypeReplacer::getMappedGenericTypeParams( - $codebase, - $input_type_part, - $container_type_part, - $container_type_params_covariant - ); - - foreach ($input_type_params as $i => $input_param) { - if (!isset($container_type_part->type_params[$i])) { - break; - } - - $container_param = $container_type_part->type_params[$i]; - - if ($input_param->isEmpty()) { - if ($atomic_comparison_result) { - if (!$atomic_comparison_result->replacement_atomic_type) { - $atomic_comparison_result->replacement_atomic_type = clone $input_type_part; - } - - if ($atomic_comparison_result->replacement_atomic_type instanceof TGenericObject) { - /** @psalm-suppress PropertyTypeCoercion */ - $atomic_comparison_result->replacement_atomic_type->type_params[$i] - = clone $container_param; - } - } - - continue; - } - - $param_comparison_result = new TypeComparisonResult(); - - if (!UnionTypeComparator::isContainedBy( - $codebase, - $input_param, - $container_param, - $input_param->ignore_nullable_issues, - $input_param->ignore_falsable_issues, - $param_comparison_result, - $allow_interface_equality - )) { - if ($input_type_part->value === 'Generator' - && $i === 2 - && $param_comparison_result->type_coerced_from_mixed - ) { - continue; - } - - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced - = $param_comparison_result->type_coerced === true - && $atomic_comparison_result->type_coerced !== false; - - $atomic_comparison_result->type_coerced_from_mixed - = $param_comparison_result->type_coerced_from_mixed === true - && $atomic_comparison_result->type_coerced_from_mixed !== false; - - $atomic_comparison_result->type_coerced_from_as_mixed - = !$container_was_iterable - && $param_comparison_result->type_coerced_from_as_mixed === true - && $atomic_comparison_result->type_coerced_from_as_mixed !== false; - - $atomic_comparison_result->to_string_cast - = $param_comparison_result->to_string_cast === true - && $atomic_comparison_result->to_string_cast !== false; - - $atomic_comparison_result->type_coerced_from_scalar - = $param_comparison_result->type_coerced_from_scalar === true - && $atomic_comparison_result->type_coerced_from_scalar !== false; - - $atomic_comparison_result->scalar_type_match_found - = $param_comparison_result->scalar_type_match_found === true - && $atomic_comparison_result->scalar_type_match_found !== false; - } - - // if the container was an iterable then there was no mapping - // from a template type - if ($container_was_iterable || !$param_comparison_result->type_coerced_from_as_mixed) { - $all_types_contain = false; - } - } elseif (!$input_type_part instanceof TIterable - && !$container_type_part instanceof TIterable - && !$container_param->hasTemplate() - && !$input_param->hasTemplate() - ) { - if ($input_param->containsAnyLiteral()) { - if ($atomic_comparison_result) { - if (!$atomic_comparison_result->replacement_atomic_type) { - $atomic_comparison_result->replacement_atomic_type = clone $input_type_part; - } - - if ($atomic_comparison_result->replacement_atomic_type instanceof TGenericObject) { - /** @psalm-suppress PropertyTypeCoercion */ - $atomic_comparison_result->replacement_atomic_type->type_params[$i] - = clone $container_param; - } - } - } else { - if (!($container_type_params_covariant[$i] ?? false) - && !$container_param->had_template - ) { - // Make sure types are basically the same - if (!UnionTypeComparator::isContainedBy( - $codebase, - $container_param, - $input_param, - $container_param->ignore_nullable_issues, - $container_param->ignore_falsable_issues, - $param_comparison_result, - $allow_interface_equality - ) || $param_comparison_result->type_coerced - ) { - if ($container_param->hasFormerStaticObject() - && $input_param->isFormerStaticObject() - && UnionTypeComparator::isContainedBy( - $codebase, - $input_param, - $container_param, - $container_param->ignore_nullable_issues, - $container_param->ignore_falsable_issues, - $param_comparison_result, - $allow_interface_equality - ) - ) { - // do nothing - } else { - if ($container_param->hasMixed() || $container_param->isArrayKey()) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced_from_mixed = true; - } - } else { - $all_types_contain = false; - } - - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = false; - } - } - } - } - } - } - } - - if ($all_types_contain) { - if ($atomic_comparison_result) { - $atomic_comparison_result->to_string_cast = false; - } - - return true; - } - - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php deleted file mode 100644 index 486a4df8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php +++ /dev/null @@ -1,180 +0,0 @@ -min_bound === null; - $is_input_max = $input_type_part->max_bound === null; - $is_container_min = $container_type_part->min_bound === null; - $is_container_max = $container_type_part->max_bound === null; - - $is_input_min_in_container = ( - $is_container_min || - (!$is_input_min && $container_type_part->min_bound <= $input_type_part->min_bound) - ); - $is_input_max_in_container = ( - $is_container_max || - (!$is_input_max && $container_type_part->max_bound >= $input_type_part->max_bound) - ); - return $is_input_min_in_container && $is_input_max_in_container; - } - - /** - * This method is used to check if an integer range can be contained by multiple int types - * Worst case scenario, the input is `int<-50,max>` and container is `-50|int<-49,50>|positive-int|57` - */ - public static function isContainedByUnion( - TIntRange $input_type_part, - Union $container_type - ): bool { - $container_atomic_types = $container_type->getAtomicTypes(); - $reduced_range = clone $input_type_part; - - if (isset($container_atomic_types['int'])) { - if (get_class($container_atomic_types['int']) === TInt::class) { - return true; - } - - if (get_class($container_atomic_types['int']) === TNonspecificLiteralInt::class) { - return true; - } - - if (get_class($container_atomic_types['int']) === TPositiveInt::class) { - if ($input_type_part->isPositive()) { - return true; - } - - //every positive integer is satisfied by the positive-int int container so we reduce the range - $reduced_range->max_bound = 0; - unset($container_atomic_types['int']); - } else { - throw new UnexpectedValueException('Should not happen: unknown int key'); - } - } - - $new_nb_atomics = count($container_atomic_types); - //loop until we get to a stable situation. Either we can't remove atomics or we have a definite result - do { - $nb_atomics = $new_nb_atomics; - $result_reduction = self::reduceRangeIncrementally($container_atomic_types, $reduced_range); - $new_nb_atomics = count($container_atomic_types); - } while ($result_reduction === null && $nb_atomics !== $new_nb_atomics); - - if ($result_reduction === null && $nb_atomics === 0) { - //the range could not be reduced enough and there is no more atomics, it's not contained - return false; - } - - return $result_reduction ?? false; - } - - /** - * This method receives an array of atomics from the container and a range. - * The goal is to use values in atomics in order to reduce the range. - * Once the range is empty, it means that every value in range was covered by some atomics combination - * @param array $container_atomic_types - */ - private static function reduceRangeIncrementally(array &$container_atomic_types, TIntRange $reduced_range): ?bool - { - foreach ($container_atomic_types as $key => $container_atomic_type) { - if ($container_atomic_type instanceof TIntRange) { - if (self::isContainedBy($reduced_range, $container_atomic_type)) { - if ($container_atomic_type->max_bound === null && $container_atomic_type->min_bound === null) { - //this container range covers any integer - return true; - } - if ($container_atomic_type->max_bound === null) { - //this container range is int - //X-1 becomes the max of our reduced range if it was higher - $reduced_range->max_bound = TIntRange::getNewLowestBound( - $container_atomic_type->min_bound - 1, - $reduced_range->max_bound ?? $container_atomic_type->min_bound - 1 - ); - unset($container_atomic_types[$key]); //we don't need this one anymore - continue; - } - if ($container_atomic_type->min_bound === null) { - //this container range is int - //X+1 becomes the min of our reduced range if it was lower - $reduced_range->min_bound = TIntRange::getNewHighestBound( - $container_atomic_type->max_bound + 1, - $reduced_range->min_bound ?? $container_atomic_type->max_bound + 1 - ); - unset($container_atomic_types[$key]); //we don't need this one anymore - continue; - } - //if the container range has no 'null' bound, it's more complex - //in this case, we can only reduce if the container include one bound of our reduced range - if ($reduced_range->min_bound !== null - && $container_atomic_type->contains($reduced_range->min_bound) - ) { - //this container range is int and contains the min of our reduced range. - //the min from our reduced range becomes Y + 1 - $reduced_range->min_bound = $container_atomic_type->max_bound + 1; - unset($container_atomic_types[$key]); //we don't need this one anymore - } elseif ($reduced_range->max_bound !== null - && $container_atomic_type->contains($reduced_range->max_bound)) { - //this container range is int and contains the max of our reduced range. - //the max from our reduced range becomes X - 1 - $reduced_range->max_bound = $container_atomic_type->min_bound - 1; - unset($container_atomic_types[$key]); //we don't need this one anymore - } - //there is probably a case here where we could unset containers when they're not at all in our range - } else { - //the range in input is wider than container, we return false - return false; - } - } elseif ($container_atomic_type instanceof TLiteralInt) { - if (!$reduced_range->contains($container_atomic_type->value)) { - unset($container_atomic_types[$key]); //we don't need this one anymore - } elseif ($reduced_range->min_bound === $container_atomic_type->value) { - $reduced_range->min_bound++; - unset($container_atomic_types[$key]); //we don't need this one anymore - } elseif ($reduced_range->max_bound === $container_atomic_type->value) { - $reduced_range->max_bound--; - unset($container_atomic_types[$key]); //we don't need this one anymore - } - } - } - - //there is probably a case here if we're left only with TLiteralInt where we could return false if there's less - //of them than numbers in the reduced range - - //there is also a case where if there's not TLiteralInt anymore and we're left with TIntRange that don't contain - //bounds from our reduced range where we could return false - - //if our reduced range has its min bound superior to its max bound, it means the container covers it all. - if ($reduced_range->min_bound !== null && - $reduced_range->max_bound !== null && - $reduced_range->min_bound > $reduced_range->max_bound - ) { - return true; - } - - //if we didn't return true or false before then the result is inconclusive for this round - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php deleted file mode 100644 index bb42838b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php +++ /dev/null @@ -1,166 +0,0 @@ -properties as $key => $container_property_type) { - if (!isset($input_type_part->properties[$key])) { - if (!$container_property_type->possibly_undefined) { - $all_types_contain = false; - } - - continue; - } - - $input_property_type = $input_type_part->properties[$key]; - - $property_type_comparison = new TypeComparisonResult(); - - if (!$input_property_type->isEmpty()) { - if (!UnionTypeComparator::isContainedBy( - $codebase, - $input_property_type, - $container_property_type, - $input_property_type->ignore_nullable_issues, - $input_property_type->ignore_falsable_issues, - $property_type_comparison, - $allow_interface_equality - ) - && !$property_type_comparison->type_coerced_from_scalar - ) { - $inverse_property_type_comparison = new TypeComparisonResult(); - - if ($atomic_comparison_result) { - if (UnionTypeComparator::isContainedBy( - $codebase, - $container_property_type, - $input_property_type, - false, - false, - $inverse_property_type_comparison, - $allow_interface_equality - ) - || $inverse_property_type_comparison->type_coerced_from_scalar - ) { - $atomic_comparison_result->type_coerced = true; - } - } - - $all_types_contain = false; - } else { - if ($atomic_comparison_result) { - $atomic_comparison_result->to_string_cast - = $atomic_comparison_result->to_string_cast === true - || $property_type_comparison->to_string_cast === true; - } - } - } - } - return $all_types_contain; - } - - public static function isContainedByObjectWithProperties( - Codebase $codebase, - TNamedObject $input_type_part, - TObjectWithProperties $container_type_part, - bool $allow_interface_equality, - ?TypeComparisonResult $atomic_comparison_result - ): bool { - $all_types_contain = true; - - foreach ($container_type_part->properties as $property_name => $container_property_type) { - if (!is_string($property_name)) { - continue; - } - - if (!$codebase->classlikes->classOrInterfaceExists($input_type_part->value)) { - $all_types_contain = false; - - continue; - } - - if (!$codebase->properties->propertyExists( - $input_type_part->value . '::$' . $property_name, - true - )) { - $all_types_contain = false; - - continue; - } - - $property_declaring_class = (string) $codebase->properties->getDeclaringClassForProperty( - $input_type_part . '::$' . $property_name, - true - ); - - $class_storage = $codebase->classlike_storage_provider->get($property_declaring_class); - - $input_property_storage = $class_storage->properties[$property_name]; - - $input_property_type = $input_property_storage->type ?: Type::getMixed(); - - $property_type_comparison = new TypeComparisonResult(); - - if (!$input_property_type->isEmpty() - && !UnionTypeComparator::isContainedBy( - $codebase, - $input_property_type, - $container_property_type, - false, - false, - $property_type_comparison, - $allow_interface_equality - ) - && !$property_type_comparison->type_coerced_from_scalar - ) { - $inverse_property_type_comparison = new TypeComparisonResult(); - - if (UnionTypeComparator::isContainedBy( - $codebase, - $container_property_type, - $input_property_type, - false, - false, - $inverse_property_type_comparison, - $allow_interface_equality - ) - || $inverse_property_type_comparison->type_coerced_from_scalar - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - } - - $all_types_contain = false; - } - } - - return $all_types_contain; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php deleted file mode 100644 index b7b4ff30..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php +++ /dev/null @@ -1,311 +0,0 @@ -extra_types ?: []; - $intersection_input_types[$input_type_part->getKey(false)] = $input_type_part; - - if ($input_type_part instanceof TTemplateParam) { - foreach ($input_type_part->as->getAtomicTypes() as $g) { - if ($g instanceof TNamedObject && $g->extra_types) { - $intersection_input_types = array_merge( - $intersection_input_types, - $g->extra_types - ); - } - } - } - - $intersection_container_types = $container_type_part->extra_types ?: []; - $intersection_container_types[$container_type_part->getKey(false)] = $container_type_part; - - if ($container_type_part instanceof TTemplateParam) { - foreach ($container_type_part->as->getAtomicTypes() as $g) { - if ($g instanceof TNamedObject && $g->extra_types) { - $intersection_container_types = array_merge( - $intersection_container_types, - $g->extra_types - ); - } - } - } - - foreach ($intersection_container_types as $container_type_key => $intersection_container_type) { - $container_was_static = false; - - if ($intersection_container_type instanceof TIterable) { - $intersection_container_type_lower = 'iterable'; - } elseif ($intersection_container_type instanceof TObjectWithProperties) { - $intersection_container_type_lower = 'object'; - } elseif ($intersection_container_type instanceof TTemplateParam) { - if (!$allow_interface_equality) { - if (isset($intersection_input_types[$container_type_key])) { - continue; - } - - foreach ($intersection_input_types as $intersection_input_type) { - if ($intersection_input_type instanceof TTemplateParam - && (strpos($intersection_container_type->defining_class, 'fn-') === 0 - || strpos($intersection_input_type->defining_class, 'fn-') === 0) - ) { - if (strpos($intersection_input_type->defining_class, 'fn-') === 0 - && strpos($intersection_container_type->defining_class, 'fn-') === 0 - && $intersection_input_type->defining_class - !== $intersection_container_type->defining_class - ) { - continue 2; - } - - foreach ($intersection_input_type->as->getAtomicTypes() as $input_as_atomic) { - if ($input_as_atomic->equals($intersection_container_type, false)) { - continue 3; - } - } - } elseif ($intersection_input_type instanceof TTemplateParam) { - $container_param = $intersection_container_type->param_name; - $container_class = $intersection_container_type->defining_class; - $input_class_like = $codebase->classlikes - ->getStorageFor($intersection_input_type->defining_class); - - if ($codebase->classlikes->traitExists($container_class) - && $input_class_like !== null - && isset( - $input_class_like->template_extended_params[$container_class][$container_param] - )) { - continue 2; - } - } - } - - return false; - } - - if ($intersection_container_type->as->isMixed()) { - continue; - } - - $intersection_container_type_lower = null; - - foreach ($intersection_container_type->as->getAtomicTypes() as $g) { - if ($g instanceof TNull) { - continue; - } - - if ($g instanceof TObject) { - continue 2; - } - - if (!$g instanceof TNamedObject) { - continue 2; - } - - $intersection_container_type_lower = strtolower($g->value); - } - - if ($intersection_container_type_lower === null) { - return false; - } - } else { - $container_was_static = $intersection_container_type->was_static; - - $intersection_container_type_lower = strtolower( - $codebase->classlikes->getUnAliasedName( - $intersection_container_type->value - ) - ); - } - - foreach ($intersection_input_types as $intersection_input_key => $intersection_input_type) { - $input_was_static = false; - - if ($intersection_input_type instanceof TIterable) { - $intersection_input_type_lower = 'iterable'; - } elseif ($intersection_input_type instanceof TObjectWithProperties) { - $intersection_input_type_lower = 'object'; - } elseif ($intersection_input_type instanceof TTemplateParam) { - if ($intersection_input_type->as->isMixed()) { - continue; - } - - $intersection_input_type_lower = null; - - foreach ($intersection_input_type->as->getAtomicTypes() as $g) { - if ($g instanceof TNull) { - continue; - } - - if (!$g instanceof TNamedObject) { - continue 2; - } - - $intersection_input_type_lower = strtolower($g->value); - } - - if ($intersection_input_type_lower === null) { - return false; - } - } else { - $input_was_static = $intersection_input_type->was_static; - - $intersection_input_type_lower = strtolower( - $codebase->classlikes->getUnAliasedName( - $intersection_input_type->value - ) - ); - } - - if ($intersection_container_type instanceof TTemplateParam - && $intersection_input_type instanceof TTemplateParam - ) { - if ($intersection_container_type->param_name !== $intersection_input_type->param_name - || ($intersection_container_type->defining_class - !== $intersection_input_type->defining_class - && strpos($intersection_input_type->defining_class, 'fn-') !== 0 - && strpos($intersection_container_type->defining_class, 'fn-') !== 0) - ) { - if (strpos($intersection_input_type->defining_class, 'fn-') !== 0) { - $input_class_storage = $codebase->classlike_storage_provider->get( - $intersection_input_type->defining_class - ); - - if (isset($input_class_storage->template_extended_params - [$intersection_container_type->defining_class] - [$intersection_container_type->param_name]) - ) { - continue; - } - } - - return false; - } - } - - if (!$intersection_container_type instanceof TTemplateParam - || $intersection_input_type instanceof TTemplateParam - ) { - if ($intersection_container_type_lower === $intersection_input_type_lower) { - if ($container_was_static - && !$input_was_static - && !$intersection_input_type instanceof TTemplateParam - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - continue; - } - - continue 2; - } - - if ($intersection_input_type_lower === 'generator' - && in_array($intersection_container_type_lower, ['iterator', 'traversable', 'iterable'], true) - ) { - continue 2; - } - - if ($intersection_container_type_lower === 'iterable') { - if ($intersection_input_type_lower === 'traversable' - || ($codebase->classlikes->classExists($intersection_input_type_lower) - && $codebase->classlikes->classImplements( - $intersection_input_type_lower, - 'Traversable' - )) - || ($codebase->classlikes->interfaceExists($intersection_input_type_lower) - && $codebase->classlikes->interfaceExtends( - $intersection_input_type_lower, - 'Traversable' - )) - ) { - continue 2; - } - } - - if ($intersection_input_type_lower === 'traversable' - && $intersection_container_type_lower === 'iterable' - ) { - continue 2; - } - - $input_type_is_interface = $codebase->interfaceExists($intersection_input_type_lower); - $container_type_is_interface = $codebase->interfaceExists($intersection_container_type_lower); - - if ($allow_interface_equality - && $container_type_is_interface - && ($input_type_is_interface || !isset($intersection_container_types[$intersection_input_key])) - ) { - continue 2; - } - - if (($codebase->classExists($intersection_input_type_lower) - || $codebase->classlikes->enumExists($intersection_input_type_lower)) - && $codebase->classOrInterfaceExists($intersection_container_type_lower) - && $codebase->classExtendsOrImplements( - $intersection_input_type_lower, - $intersection_container_type_lower - ) - ) { - if ($container_was_static && !$input_was_static) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - continue; - } - - continue 2; - } - - if ($input_type_is_interface - && $codebase->interfaceExtends( - $intersection_input_type_lower, - $intersection_container_type_lower - ) - ) { - continue 2; - } - } - - if (ExpressionAnalyzer::isMock($intersection_input_type_lower)) { - return true; - } - } - - return false; - } - - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php deleted file mode 100644 index 12b1dd95..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php +++ /dev/null @@ -1,640 +0,0 @@ -type_coerced = true; - } - - return false; - } - - if ($container_type_part instanceof TNonspecificLiteralString - && ($input_type_part instanceof TLiteralString || $input_type_part instanceof TNonspecificLiteralString) - ) { - return true; - } - - if ($container_type_part instanceof TNonspecificLiteralString) { - if ($input_type_part instanceof TString) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - } - - return false; - } - - if ($container_type_part instanceof TNonspecificLiteralInt - && ($input_type_part instanceof TLiteralInt - || $input_type_part instanceof TNonspecificLiteralInt) - ) { - return true; - } - - if ($container_type_part instanceof TNonspecificLiteralInt) { - if ($input_type_part instanceof TInt) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - } - - return false; - } - - if ($input_type_part instanceof TCallableString - && (get_class($container_type_part) === TSingleLetter::class - || get_class($container_type_part) === TNonEmptyString::class - || get_class($container_type_part) === TNonFalsyString::class - || get_class($container_type_part) === TLowercaseString::class) - ) { - return true; - } - - if (($container_type_part instanceof TLowercaseString - || $container_type_part instanceof TNonEmptyLowercaseString) - && $input_type_part instanceof TString - ) { - if (($input_type_part instanceof TLowercaseString - && $container_type_part instanceof TLowercaseString) - || ($input_type_part instanceof TNonEmptyLowercaseString - && $container_type_part instanceof TNonEmptyLowercaseString) - ) { - return true; - } - - if ($input_type_part instanceof TNonEmptyLowercaseString - && $container_type_part instanceof TLowercaseString - ) { - return true; - } - - if ($input_type_part instanceof TLowercaseString - && $container_type_part instanceof TNonEmptyLowercaseString - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if ($input_type_part instanceof TLiteralString) { - if (strtolower($input_type_part->value) === $input_type_part->value) { - return $input_type_part->value || $container_type_part instanceof TLowercaseString; - } - - return false; - } - - if ($input_type_part instanceof TClassString) { - return false; - } - - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if ($container_type_part instanceof TDependentGetClass) { - $first_type = $container_type_part->as_type->getSingleAtomic(); - - $container_type_part = new TClassString( - 'object', - $first_type instanceof TNamedObject ? $first_type : null - ); - } - - if ($input_type_part instanceof TDependentGetClass) { - $first_type = $input_type_part->as_type->getSingleAtomic(); - - if ($first_type instanceof TTemplateParam) { - $object_type = $first_type->as->getSingleAtomic(); - - $input_type_part = new TTemplateParamClass( - $first_type->param_name, - $first_type->as->getId(), - $object_type instanceof TNamedObject ? $object_type : null, - $first_type->defining_class - ); - } else { - $input_type_part = new TClassString( - 'object', - $first_type instanceof TNamedObject ? $first_type : null - ); - } - } - - if ($input_type_part instanceof TDependentGetType) { - $input_type_part = new TString(); - - if ($container_type_part instanceof TLiteralString) { - return isset(ClassLikeAnalyzer::GETTYPE_TYPES[$container_type_part->value]); - } - } - - if ($container_type_part instanceof TDependentGetDebugType) { - return $input_type_part instanceof TString; - } - - if ($input_type_part instanceof TDependentGetDebugType) { - $input_type_part = new TString(); - } - - if ($container_type_part instanceof TDependentGetType) { - $container_type_part = new TString(); - - if ($input_type_part instanceof TLiteralString) { - return isset(ClassLikeAnalyzer::GETTYPE_TYPES[$input_type_part->value]); - } - } - - if ($input_type_part instanceof TFalse - && $container_type_part instanceof TBool - && !($container_type_part instanceof TTrue) - ) { - return true; - } - - if ($input_type_part instanceof TTrue - && $container_type_part instanceof TBool - && !($container_type_part instanceof TFalse) - ) { - return true; - } - - // from https://wiki.php.net/rfc/scalar_type_hints_v5: - // - // > int types can resolve a parameter type of float - if ($input_type_part instanceof TInt - && $container_type_part instanceof TFloat - && !$container_type_part instanceof TLiteralFloat - && $allow_float_int_equality - ) { - return true; - } - - if ($container_type_part instanceof TArrayKey - && $input_type_part instanceof TNumeric - ) { - return true; - } - - if ($container_type_part instanceof TArrayKey - && ($input_type_part instanceof TInt - || $input_type_part instanceof TString - || $input_type_part instanceof TTemplateKeyOf) - ) { - return true; - } - - if ($input_type_part instanceof TTemplateKeyOf) { - foreach ($input_type_part->as->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TArray) { - /** @var Scalar $array_key_atomic */ - foreach ($atomic_type->type_params[0]->getAtomicTypes() as $array_key_atomic) { - if (!self::isContainedBy( - $codebase, - $array_key_atomic, - $container_type_part, - $allow_interface_equality, - $allow_float_int_equality, - $atomic_comparison_result - )) { - return false; - } - } - } - } - - return true; - } - - if ($input_type_part instanceof TArrayKey && - ($container_type_part instanceof TInt || $container_type_part instanceof TString) - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_mixed = true; - $atomic_comparison_result->scalar_type_match_found = true; - } - - return false; - } - - if ($container_type_part instanceof TScalar && $input_type_part instanceof Scalar) { - return true; - } - - if (get_class($container_type_part) === TDependentListKey::class - && ($input_type_part instanceof TLiteralInt - || $input_type_part instanceof TPositiveInt) - ) { - return true; - } - - if (get_class($container_type_part) === TFloat::class && $input_type_part instanceof TLiteralFloat) { - return true; - } - - if ((get_class($container_type_part) === TNonEmptyString::class - || get_class($container_type_part) === TNonEmptyNonspecificLiteralString::class) - && $input_type_part instanceof TNonFalsyString - ) { - return true; - } - - if ($container_type_part instanceof TNonFalsyString - && $input_type_part instanceof TNonFalsyString - ) { - return true; - } - - if ($container_type_part instanceof TNonFalsyString - && ($input_type_part instanceof TNonEmptyString - || $input_type_part instanceof TNonEmptyNonspecificLiteralString) - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if ($container_type_part instanceof TNonEmptyString - && $input_type_part instanceof TLiteralString - && $input_type_part->value === '' - ) { - return false; - } - - if ($container_type_part instanceof TNonFalsyString - && $input_type_part instanceof TLiteralString - && $input_type_part->value === '0' - ) { - return false; - } - - if ((get_class($container_type_part) === TNonEmptyString::class - || get_class($container_type_part) === TNonFalsyString::class - || get_class($container_type_part) === TSingleLetter::class) - && $input_type_part instanceof TLiteralString - ) { - return true; - } - - if (get_class($container_type_part) === TDependentListKey::class - && $input_type_part instanceof TInt - ) { - return true; - } - - if ((get_class($input_type_part) === TInt::class && $container_type_part instanceof TLiteralInt) - || (get_class($input_type_part) === TPositiveInt::class - && $container_type_part instanceof TLiteralInt - && $container_type_part->value > 0) - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_scalar = true; - } - - return false; - } - - if ($input_type_part instanceof TIntRange && $container_type_part instanceof TIntRange) { - return IntegerRangeComparator::isContainedBy( - $input_type_part, - $container_type_part - ); - } - - if ($input_type_part instanceof TInt && $container_type_part instanceof TPositiveInt) { - if ($input_type_part instanceof TPositiveInt) { - return true; - } - if ($input_type_part instanceof TLiteralInt) { - return $input_type_part->value > 0; - } - if ($input_type_part instanceof TIntRange) { - return $input_type_part->isPositive(); - } - - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_scalar = true; - } - - return false; - } - - if ($input_type_part instanceof TInt && $container_type_part instanceof TIntRange) { - if ($input_type_part instanceof TPositiveInt) { - if ($container_type_part->min_bound > 1) { - //any positive int can't be pushed inside a range with a min > 1 - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_scalar = true; - } - - return false; - } - - if ($container_type_part->max_bound !== null) { - //any positive int can't be pushed inside a range where the max bound isn't max without coercion - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_scalar = true; - } - - return false; - } - - return true; - } - if ($input_type_part instanceof TLiteralInt) { - $min_bound = $container_type_part->min_bound; - $max_bound = $container_type_part->max_bound; - - return - ($min_bound === null || $min_bound <= $input_type_part->value) && - ($max_bound === null || $max_bound >= $input_type_part->value); - } - - //any int can't be pushed inside a range without coercion (unless the range is from min to max) - if ($container_type_part->min_bound !== null || $container_type_part->max_bound !== null) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_scalar = true; - } - } - - return false; - } - - if (get_class($input_type_part) === TFloat::class && $container_type_part instanceof TLiteralFloat) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_scalar = true; - } - - return false; - } - - if ((get_class($input_type_part) === TString::class - || get_class($input_type_part) === TSingleLetter::class - || $input_type_part instanceof TNonEmptyString - || $input_type_part instanceof TNonspecificLiteralString) - && $container_type_part instanceof TLiteralString - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_scalar = true; - } - - return false; - } - - if (($input_type_part instanceof TLowercaseString - || $input_type_part instanceof TNonEmptyLowercaseString) - && $container_type_part instanceof TLiteralString - && strtolower($container_type_part->value) === $container_type_part->value - ) { - if ($atomic_comparison_result - && ($container_type_part->value) - ) { - $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_scalar = true; - } - - return false; - } - - if (($container_type_part instanceof TClassString || $container_type_part instanceof TLiteralClassString) - && ($input_type_part instanceof TClassString || $input_type_part instanceof TLiteralClassString) - ) { - return ClassLikeStringComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $atomic_comparison_result - ); - } - - if ($container_type_part instanceof TString && $input_type_part instanceof TTraitString) { - return true; - } - - if ($container_type_part instanceof TTraitString - && (get_class($input_type_part) === TString::class - || $input_type_part instanceof TNonEmptyString - || $input_type_part instanceof TNonEmptyNonspecificLiteralString) - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if (($input_type_part instanceof TClassString - || $input_type_part instanceof TLiteralClassString) - && (get_class($container_type_part) === TSingleLetter::class - || get_class($container_type_part) === TNonEmptyString::class - || get_class($container_type_part) === TNonFalsyString::class) - ) { - return true; - } - - if ($input_type_part instanceof TNumericString - && get_class($container_type_part) === TNonEmptyString::class - ) { - return true; - } - - if ($container_type_part instanceof TString - && ($input_type_part instanceof TNumericString - || $input_type_part instanceof THtmlEscapedString) - ) { - if ($container_type_part instanceof TLiteralString) { - if (is_numeric($container_type_part->value) && $atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - return true; - } - - if ($input_type_part instanceof TString - && ($container_type_part instanceof TNumericString - || $container_type_part instanceof THtmlEscapedString) - ) { - if ($input_type_part instanceof TLiteralString) { - return is_numeric($input_type_part->value); - } - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if ($container_type_part instanceof TCallableString - && $input_type_part instanceof TLiteralString - ) { - $input_callable = CallableTypeComparator::getCallableFromAtomic($codebase, $input_type_part); - $container_callable = CallableTypeComparator::getCallableFromAtomic($codebase, $container_type_part); - - if ($input_callable && $container_callable) { - if (CallableTypeComparator::isContainedBy( - $codebase, - $input_callable, - $container_callable, - $atomic_comparison_result ?? new TypeComparisonResult() - ) === false - ) { - return false; - } - } - - if (!$input_callable) { - //we could not find a callable for the input type, so the input is not contained in the container - return false; - } - - return true; - } - - if ($input_type_part instanceof TLowercaseString - && get_class($container_type_part) === TNonEmptyString::class) { - return false; - } - - if ($input_type_part->getKey() === $container_type_part->getKey()) { - return true; - } - - if (($container_type_part instanceof TClassString - || $container_type_part instanceof TLiteralClassString - || $container_type_part instanceof TCallableString) - && $input_type_part instanceof TString - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - - if ($container_type_part instanceof TNumeric - && $input_type_part->isNumericType() - ) { - return true; - } - - if ($input_type_part instanceof TNumeric) { - if ($container_type_part->isNumericType()) { - if ($atomic_comparison_result) { - $atomic_comparison_result->scalar_type_match_found = true; - } - } - } - - if ($input_type_part instanceof Scalar) { - if (!$container_type_part instanceof TLiteralInt - && !$container_type_part instanceof TLiteralString - && !$container_type_part instanceof TLiteralFloat - ) { - if ($atomic_comparison_result) { - $atomic_comparison_result->scalar_type_match_found = true; - } - } - } - - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php deleted file mode 100644 index 5fbe29af..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php +++ /dev/null @@ -1,43 +0,0 @@ -isMixed()) { - return true; - } - - if ($input_type->isNever()) { - return true; - } - - if ($union_comparison_result) { - $union_comparison_result->scalar_type_match_found = true; - } - - if ($input_type->possibly_undefined - && !$input_type->possibly_undefined_from_try - && !$container_type->possibly_undefined - ) { - return false; - } - - if ($container_type->hasMixed() && !$container_type->isEmptyMixed()) { - return true; - } - - $container_has_template = $container_type->hasTemplateOrStatic(); - - $input_atomic_types = array_reverse(self::getTypeParts($codebase, $input_type)); - - while ($input_type_part = array_pop($input_atomic_types)) { - if ($input_type_part instanceof TNull && $ignore_null) { - continue; - } - - if ($input_type_part instanceof TFalse && $ignore_false) { - continue; - } - - if ($input_type_part instanceof TTemplateParam - && !$container_has_template - && !$input_type_part->extra_types - ) { - $input_atomic_types = array_merge($input_type_part->as->getAtomicTypes(), $input_atomic_types); - continue; - } - - - $type_match_found = false; - $scalar_type_match_found = false; - $all_to_string_cast = true; - - $all_type_coerced = null; - $all_type_coerced_from_mixed = null; - $all_type_coerced_from_as_mixed = null; - - $some_type_coerced = false; - $some_type_coerced_from_mixed = false; - - if ($input_type_part instanceof TArrayKey - && ($container_type->hasInt() && $container_type->hasString()) - ) { - continue; - } - - if ($input_type_part instanceof TArrayKey && $container_type->hasTemplate()) { - foreach ($container_type->getTemplateTypes() as $template_type) { - if ($template_type->as->isArrayKey()) { - continue 2; - } - } - } - - if ($input_type_part instanceof TIntRange && $container_type->hasInt()) { - if (IntegerRangeComparator::isContainedByUnion( - $input_type_part, - $container_type - )) { - continue; - } - } - - foreach (self::getTypeParts($codebase, $container_type) as $container_type_part) { - if ($ignore_null - && $container_type_part instanceof TNull - && !$input_type_part instanceof TNull - ) { - continue; - } - - if ($ignore_false - && $container_type_part instanceof TFalse - && !$input_type_part instanceof TFalse - ) { - continue; - } - - if ($union_comparison_result) { - $atomic_comparison_result = new TypeComparisonResult(); - } else { - $atomic_comparison_result = null; - } - - $is_atomic_contained_by = AtomicTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $allow_interface_equality, - $allow_float_int_equality, - $atomic_comparison_result - ); - - if ($input_type_part instanceof TMixed - && $input_type->from_template_default - && $input_type->from_docblock - && $atomic_comparison_result - && $atomic_comparison_result->type_coerced_from_mixed - ) { - $atomic_comparison_result->type_coerced_from_as_mixed = true; - } - - if ($atomic_comparison_result) { - if ($atomic_comparison_result->scalar_type_match_found !== null) { - $scalar_type_match_found = $atomic_comparison_result->scalar_type_match_found; - } - - if ($union_comparison_result - && $atomic_comparison_result->type_coerced_from_scalar !== null - ) { - $union_comparison_result->type_coerced_from_scalar - = $atomic_comparison_result->type_coerced_from_scalar; - } - - if ($is_atomic_contained_by - && $union_comparison_result - && $atomic_comparison_result->replacement_atomic_type - ) { - if (!$union_comparison_result->replacement_union_type) { - $union_comparison_result->replacement_union_type = clone $input_type; - } - - $union_comparison_result->replacement_union_type->removeType($input_type->getKey()); - - $union_comparison_result->replacement_union_type->addType( - $atomic_comparison_result->replacement_atomic_type - ); - } - } - - if ($input_type_part instanceof TNumeric - && $container_type->hasString() - && $container_type->hasInt() - && $container_type->hasFloat() - ) { - $scalar_type_match_found = false; - $is_atomic_contained_by = true; - } - - if ($atomic_comparison_result) { - if ($atomic_comparison_result->type_coerced) { - $some_type_coerced = true; - } - - if ($atomic_comparison_result->type_coerced_from_mixed) { - $some_type_coerced_from_mixed = true; - } - - if ($atomic_comparison_result->type_coerced !== true || $all_type_coerced === false) { - $all_type_coerced = false; - } else { - $all_type_coerced = true; - } - - if ($atomic_comparison_result->type_coerced_from_mixed !== true - || $all_type_coerced_from_mixed === false - ) { - $all_type_coerced_from_mixed = false; - } else { - $all_type_coerced_from_mixed = true; - } - - if ($atomic_comparison_result->type_coerced_from_as_mixed !== true - || $all_type_coerced_from_as_mixed === false - ) { - $all_type_coerced_from_as_mixed = false; - } else { - $all_type_coerced_from_as_mixed = true; - } - } - - if ($is_atomic_contained_by) { - $type_match_found = true; - - if ($atomic_comparison_result) { - if ($atomic_comparison_result->to_string_cast !== true) { - $all_to_string_cast = false; - } - } - - $all_type_coerced_from_mixed = false; - $all_type_coerced_from_as_mixed = false; - $all_type_coerced = false; - } - } - - if ($union_comparison_result) { - // only set this flag if we're definite that the only - // reason the type match has been found is because there - // was a __toString cast - if ($all_to_string_cast && $type_match_found) { - $union_comparison_result->to_string_cast = true; - } - - if ($all_type_coerced) { - $union_comparison_result->type_coerced = true; - } - - if ($all_type_coerced_from_mixed) { - $union_comparison_result->type_coerced_from_mixed = true; - - if (($input_type->from_template_default && $input_type->from_docblock) - || $all_type_coerced_from_as_mixed - ) { - $union_comparison_result->type_coerced_from_as_mixed = true; - } - } - } - - if (!$type_match_found) { - if ($union_comparison_result) { - if ($some_type_coerced) { - $union_comparison_result->type_coerced = true; - } - - if ($some_type_coerced_from_mixed) { - $union_comparison_result->type_coerced_from_mixed = true; - - if (($input_type->from_template_default && $input_type->from_docblock) - || $all_type_coerced_from_as_mixed - ) { - $union_comparison_result->type_coerced_from_as_mixed = true; - } - } - - if (!$scalar_type_match_found) { - $union_comparison_result->scalar_type_match_found = false; - } - } - - return false; - } - } - - return true; - } - - /** - * Used for comparing signature typehints, uses PHP's light contravariance rules - * - * - */ - public static function isContainedByInPhp( - ?Union $input_type, - Union $container_type - ): bool { - if ($container_type->isMixed()) { - return true; - } - - if (!$input_type) { - return false; - } - - if ($input_type->isNever()) { - return true; - } - - if ($input_type->getId() === $container_type->getId()) { - return true; - } - - if ($input_type->isNullable() && !$container_type->isNullable()) { - return false; - } - - $input_type_not_null = clone $input_type; - $input_type_not_null->removeType('null'); - - $container_type_not_null = clone $container_type; - $container_type_not_null->removeType('null'); - - if ($input_type_not_null->getId() === $container_type_not_null->getId()) { - return true; - } - - if ($input_type_not_null->hasArray() && $container_type_not_null->hasType('iterable')) { - return true; - } - - return false; - } - - /** - * Does the input param type match the given param type - */ - public static function canBeContainedBy( - Codebase $codebase, - Union $input_type, - Union $container_type, - bool $ignore_null = false, - bool $ignore_false = false, - array &$matching_input_keys = [] - ): bool { - if ($container_type->hasMixed()) { - return true; - } - - if ($input_type->isNever()) { - return true; - } - - if ($input_type->possibly_undefined && !$container_type->possibly_undefined) { - return false; - } - - foreach (self::getTypeParts($codebase, $container_type) as $container_type_part) { - if ($container_type_part instanceof TNull && $ignore_null) { - continue; - } - - if ($container_type_part instanceof TFalse && $ignore_false) { - continue; - } - - foreach (self::getTypeParts($codebase, $input_type) as $input_type_part) { - $atomic_comparison_result = new TypeComparisonResult(); - $is_atomic_contained_by = AtomicTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - false, - false, - $atomic_comparison_result - ); - - if (($is_atomic_contained_by && !$atomic_comparison_result->to_string_cast) - || $atomic_comparison_result->type_coerced_from_mixed - ) { - $matching_input_keys[$input_type_part->getKey()] = true; - } - } - } - - return (bool)$matching_input_keys; - } - - /** - * Can any part of the $type1 be equal to any part of $type2 - * - */ - public static function canExpressionTypesBeIdentical( - Codebase $codebase, - Union $type1, - Union $type2, - bool $allow_interface_equality = true - ): bool { - if ($type1->hasMixed() || $type2->hasMixed()) { - return true; - } - - if ($type1->isNullable() && $type2->isNullable()) { - return true; - } - - foreach (self::getTypeParts($codebase, $type1) as $type1_part) { - foreach (self::getTypeParts($codebase, $type2) as $type2_part) { - //special cases for TIntRange because it can contain a part of the other type. - //For exemple int<0,1> and positive-int can be identical but none contain the other - if (($type1_part instanceof TIntRange && $type2_part instanceof TPositiveInt)) { - $intersection_range = TIntRange::intersectIntRanges( - TIntRange::convertToIntRange($type2_part), - $type1_part - ); - return $intersection_range !== null; - } - - if ($type2_part instanceof TIntRange && $type1_part instanceof TPositiveInt) { - $intersection_range = TIntRange::intersectIntRanges( - TIntRange::convertToIntRange($type1_part), - $type2_part - ); - return $intersection_range !== null; - } - - if ($type1_part instanceof TIntRange && $type2_part instanceof TIntRange) { - $intersection_range = TIntRange::intersectIntRanges( - $type1_part, - $type2_part - ); - return $intersection_range !== null; - } - - $either_contains = AtomicTypeComparator::canBeIdentical( - $codebase, - $type1_part, - $type2_part, - $allow_interface_equality - ); - - if ($either_contains) { - return true; - } - } - } - - return false; - } - - /** - * @return list - */ - private static function getTypeParts( - Codebase $codebase, - Union $union_type - ): array { - $atomic_types = []; - foreach ($union_type->getAtomicTypes() as $atomic_type) { - if (!$atomic_type instanceof TTypeAlias && !$atomic_type instanceof TClassConstant) { - $atomic_types[] = $atomic_type; - continue; - } - - if ($atomic_type instanceof TTypeAlias) { - $fq_classlike_name = $atomic_type->declaring_fq_classlike_name; - } else { - $fq_classlike_name = $atomic_type->fq_classlike_name; - } - - $expanded = TypeExpander::expandAtomic( - $codebase, - $atomic_type, - $fq_classlike_name, - $fq_classlike_name, - null, - true, - true - ); - if ($expanded instanceof Atomic) { - if (!$expanded instanceof TTypeAlias && !$expanded instanceof TClassConstant) { - $atomic_types[] = $expanded; - } - continue; - } - - array_push($atomic_types, ...$expanded); - } - - return $atomic_types; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php deleted file mode 100644 index b3387f37..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php +++ /dev/null @@ -1,425 +0,0 @@ -> $template_type_map - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - public static function reconcile( - StatementsAnalyzer $statements_analyzer, - string $assertion, - bool $is_strict_equality, - bool $is_loose_equality, - Union $existing_var_type, - array $template_type_map, - string $old_var_type_string, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $inside_loop - ): Union { - $is_equality = $is_strict_equality || $is_loose_equality; - - // this is a specific value comparison type that cannot be negated - if ($is_equality && $bracket_pos = strpos($assertion, '(')) { - if ($existing_var_type->hasMixed()) { - return $existing_var_type; - } - - return self::handleLiteralNegatedEquality( - $statements_analyzer, - $assertion, - $bracket_pos, - $existing_var_type, - $old_var_type_string, - $key, - $negated, - $code_location, - $suppressed_issues, - $is_strict_equality - ); - } - - if ($is_equality && $assertion === 'positive-numeric') { - return $existing_var_type; - } - - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - if ($assertion === 'false' && isset($existing_var_atomic_types['bool'])) { - $existing_var_type->removeType('bool'); - $existing_var_type->addType(new TTrue); - } elseif ($assertion === 'true' && isset($existing_var_atomic_types['bool'])) { - $existing_var_type->removeType('bool'); - $existing_var_type->addType(new TFalse); - } else { - $simple_negated_type = SimpleNegatedAssertionReconciler::reconcile( - $statements_analyzer->getCodebase(), - $assertion, - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - $inside_loop - ); - - if ($simple_negated_type) { - return $simple_negated_type; - } - } - - if ($assertion === 'iterable' || $assertion === 'countable') { - $existing_var_type->removeType('array'); - } - - if (!$is_equality - && isset($existing_var_atomic_types['int']) - && $existing_var_type->from_calculation - && ($assertion === 'int' || $assertion === 'float') - ) { - $existing_var_type->removeType($assertion); - - if ($assertion === 'int') { - $existing_var_type->addType(new TFloat); - } else { - $existing_var_type->addType(new TInt); - } - - $existing_var_type->from_calculation = false; - - return $existing_var_type; - } - - if (!$is_equality - && ($assertion === 'DateTime' || $assertion === 'DateTimeImmutable') - && isset($existing_var_atomic_types['DateTimeInterface']) - ) { - $existing_var_type->removeType('DateTimeInterface'); - - if ($assertion === 'DateTime') { - $existing_var_type->addType(new TNamedObject('DateTimeImmutable')); - } else { - $existing_var_type->addType(new TNamedObject('DateTime')); - } - - return $existing_var_type; - } - - if (strtolower($assertion) === 'traversable' - && isset($existing_var_atomic_types['iterable']) - ) { - /** @var TIterable */ - $iterable = $existing_var_atomic_types['iterable']; - $existing_var_type->removeType('iterable'); - $existing_var_type->addType(new TArray( - [ - $iterable->type_params[0]->hasMixed() - ? Type::getArrayKey() - : clone $iterable->type_params[0], - clone $iterable->type_params[1], - ] - )); - } elseif (strtolower($assertion) === 'int' - && isset($existing_var_type->getAtomicTypes()['array-key']) - ) { - $existing_var_type->removeType('array-key'); - $existing_var_type->addType(new TString); - } elseif (strpos($assertion, 'getclass-') === 0) { - $assertion = substr($assertion, 9); - } elseif ($existing_var_type->isSingle() - && $existing_var_type->hasNamedObjectType() - && isset($existing_var_type->getAtomicTypes()[$assertion]) - ) { - // checking if two types share a common parent is not enough to guarantee childs are instanceof each other - // fall through - } elseif (!$is_equality) { - $codebase = $statements_analyzer->getCodebase(); - - // if there wasn't a direct hit, go deeper, eliminating subtypes - if (!$existing_var_type->removeType($assertion)) { - foreach ($existing_var_type->getAtomicTypes() as $part_name => $existing_var_type_part) { - if (!$existing_var_type_part->isObjectType() || strpos($assertion, '-')) { - continue; - } - - $assertion_type = Type::parseString($assertion, null, $template_type_map); - - if (!$assertion_type->isSingle()) { - continue; - } - - $new_type_part = $assertion_type->getSingleAtomic(); - - if (!$new_type_part instanceof TNamedObject) { - continue; - } - - if (AtomicTypeComparator::isContainedBy( - $codebase, - $existing_var_type_part, - $new_type_part, - false, - false - )) { - $existing_var_type->removeType($part_name); - } elseif (AtomicTypeComparator::isContainedBy( - $codebase, - $new_type_part, - $existing_var_type_part, - false, - false - )) { - $existing_var_type->different = true; - } - } - } - } - - if ($is_strict_equality - && $assertion !== 'isset' - && ($key !== '$this' - || !($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer)) - ) { - $assertion = Type::parseString($assertion, null, $template_type_map); - - if ($key - && $code_location - && !UnionTypeComparator::canExpressionTypesBeIdentical( - $statements_analyzer->getCodebase(), - $existing_var_type, - $assertion - ) - ) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!=' . $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($existing_var_type->isUnionEmpty()) { - if ($key !== '$this' - || !($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer) - ) { - if ($key && $code_location && !$is_equality) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!' . $assertion, - false, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return new Union([new TEmptyMixed]); - } - - return $existing_var_type; - } - - /** - * @param string[] $suppressed_issues - * - */ - private static function handleLiteralNegatedEquality( - StatementsAnalyzer $statements_analyzer, - string $assertion, - int $bracket_pos, - Union $existing_var_type, - string $old_var_type_string, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - bool $is_strict_equality - ): Union { - $scalar_type = substr($assertion, 0, $bracket_pos); - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - $did_remove_type = false; - $did_match_literal_type = false; - - $scalar_var_type = null; - - if ($scalar_type === 'int') { - if ($existing_var_type->hasInt()) { - if ($existing_int_types = $existing_var_type->getLiteralInts()) { - if (!$existing_var_type->hasPositiveInt()) { - $did_match_literal_type = true; - } - - if (isset($existing_int_types[$assertion])) { - $existing_var_type->removeType($assertion); - - $did_remove_type = true; - } - } - } else { - $scalar_value = substr($assertion, $bracket_pos + 1, -1); - $scalar_var_type = Type::getInt(false, (int) $scalar_value); - } - } elseif ($scalar_type === 'string' - || $scalar_type === 'class-string' - || $scalar_type === 'interface-string' - || $scalar_type === 'trait-string' - || $scalar_type === 'callable-string' - ) { - if ($existing_var_type->hasString()) { - if ($existing_string_types = $existing_var_type->getLiteralStrings()) { - $did_match_literal_type = true; - - if (isset($existing_string_types[$assertion])) { - $existing_var_type->removeType($assertion); - - $did_remove_type = true; - } - } elseif ($assertion === 'string()') { - $existing_var_type->addType(new TNonEmptyString()); - } - } elseif ($scalar_type === 'string') { - $scalar_value = substr($assertion, $bracket_pos + 1, -1); - $scalar_var_type = Type::getString($scalar_value); - } - } elseif ($scalar_type === 'float') { - if ($existing_var_type->hasFloat()) { - if ($existing_float_types = $existing_var_type->getLiteralFloats()) { - $did_match_literal_type = true; - - if (isset($existing_float_types[$assertion])) { - $existing_var_type->removeType($assertion); - - $did_remove_type = true; - } - } - } else { - $scalar_value = substr($assertion, $bracket_pos + 1, -1); - $scalar_var_type = Type::getFloat((float) $scalar_value); - } - } elseif ($scalar_type === 'enum') { - [$fq_enum_name, $case_name] = explode('::', substr($assertion, $bracket_pos + 1, -1)); - - foreach ($existing_var_type->getAtomicTypes() as $atomic_key => $atomic_type) { - if (get_class($atomic_type) === TNamedObject::class - && $atomic_type->value === $fq_enum_name - ) { - $codebase = $statements_analyzer->getCodebase(); - - $enum_storage = $codebase->classlike_storage_provider->get($fq_enum_name); - - if (!$enum_storage->is_enum || !$enum_storage->enum_cases) { - $scalar_var_type = new Union([new TEnumCase($fq_enum_name, $case_name)]); - } else { - $existing_var_type->removeType($atomic_type->getKey()); - $did_remove_type = true; - - foreach ($enum_storage->enum_cases as $alt_case_name => $_) { - if ($alt_case_name === $case_name) { - continue; - } - - $existing_var_type->addType(new TEnumCase($fq_enum_name, $alt_case_name)); - } - } - } elseif ($atomic_type instanceof TEnumCase - && $atomic_type->value === $fq_enum_name - && $atomic_type->case_name !== $case_name - ) { - $did_match_literal_type = true; - } elseif ($atomic_key === $assertion) { - $existing_var_type->removeType($assertion); - $did_remove_type = true; - } - } - } - - if ($key && $code_location) { - if ($did_match_literal_type - && (!$did_remove_type || count($existing_var_atomic_types) === 1) - ) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!' . $assertion, - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } elseif ($scalar_var_type - && $is_strict_equality - && ($key !== '$this' - || !($statements_analyzer->getSource()->getSource() instanceof TraitAnalyzer)) - ) { - if (!UnionTypeComparator::canExpressionTypesBeIdentical( - $statements_analyzer->getCodebase(), - $existing_var_type, - $scalar_var_type - )) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!=' . $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - } - } - - return $existing_var_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php deleted file mode 100644 index fa3f0b3b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php +++ /dev/null @@ -1,43 +0,0 @@ - - */ - public $children = []; - - /** - * @var null|ParseTree - */ - public $parent; - - /** - * @var bool - */ - public $possibly_undefined = false; - - public function __construct(?ParseTree $parent = null) - { - $this->parent = $parent; - } - - public function __destruct() - { - $this->parent = null; - } - - public function cleanParents(): void - { - foreach ($this->children as $child) { - $child->cleanParents(); - } - - $this->parent = null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php deleted file mode 100644 index ae0b8cac..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php +++ /dev/null @@ -1,21 +0,0 @@ -value = $value; - $this->parent = $parent; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php deleted file mode 100644 index 3069d736..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php +++ /dev/null @@ -1,12 +0,0 @@ -condition = $condition; - $this->parent = $parent; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php deleted file mode 100644 index 5fc34640..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php +++ /dev/null @@ -1,16 +0,0 @@ -value = $value; - $this->parent = $parent; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php deleted file mode 100644 index a38b8e73..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php +++ /dev/null @@ -1,22 +0,0 @@ -value = $value; - $this->parent = $parent; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php deleted file mode 100644 index 70251607..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php +++ /dev/null @@ -1,12 +0,0 @@ -value = $value; - $this->parent = $parent; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php deleted file mode 100644 index 4da6cf75..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php +++ /dev/null @@ -1,27 +0,0 @@ -value = $value; - $this->parent = $parent; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php deleted file mode 100644 index a3a531e9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php +++ /dev/null @@ -1,43 +0,0 @@ -name = $name; - $this->byref = $byref; - $this->variadic = $variadic; - $this->parent = $parent; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php deleted file mode 100644 index f21ef8e7..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php +++ /dev/null @@ -1,22 +0,0 @@ -value = $value; - $this->parent = $parent; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php deleted file mode 100644 index 47701b3c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php +++ /dev/null @@ -1,12 +0,0 @@ -param_name = $param_name; - $this->as = $as; - $this->parent = $parent; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php deleted file mode 100644 index 3a96b6cb..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php +++ /dev/null @@ -1,22 +0,0 @@ -param_name = $param_name; - $this->parent = $parent; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php deleted file mode 100644 index 1f8de487..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php +++ /dev/null @@ -1,12 +0,0 @@ -offset_start = $offset_start; - $this->offset_end = $offset_end; - $this->value = $value; - $this->parent = $parent; - $this->text = $text === $value ? null : $text; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php deleted file mode 100644 index edad53cb..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php +++ /dev/null @@ -1,842 +0,0 @@ - */ - private $type_tokens; - - /** @var int */ - private $type_token_count; - - /** @var int */ - private $t = 0; - - /** - * @param list $type_tokens - */ - public function __construct(array $type_tokens) - { - $this->type_tokens = $type_tokens; - $this->type_token_count = count($type_tokens); - $this->parse_tree = new Root(); - $this->current_leaf = $this->parse_tree; - } - - public function create(): ParseTree - { - while ($this->t < $this->type_token_count) { - $type_token = $this->type_tokens[$this->t]; - - switch ($type_token[0]) { - case '<': - case '{': - case ']': - throw new TypeParseTreeException('Unexpected token ' . $type_token[0]); - - case '[': - $this->handleOpenSquareBracket(); - break; - - case '(': - $this->handleOpenRoundBracket(); - break; - - case ')': - $this->handleClosedRoundBracket(); - break; - - case '>': - do { - if ($this->current_leaf->parent === null) { - throw new TypeParseTreeException('Cannot parse generic type'); - } - - $this->current_leaf = $this->current_leaf->parent; - } while (!$this->current_leaf instanceof GenericTree); - - $this->current_leaf->terminated = true; - - break; - - case '}': - do { - if ($this->current_leaf->parent === null) { - throw new TypeParseTreeException('Cannot parse array type'); - } - - $this->current_leaf = $this->current_leaf->parent; - } while (!$this->current_leaf instanceof KeyedArrayTree); - - $this->current_leaf->terminated = true; - - break; - - case ',': - $this->handleComma(); - break; - - case '...': - case '=': - $this->handleEllipsisOrEquals($type_token); - break; - - case ':': - $this->handleColon(); - break; - - case ' ': - $this->handleSpace(); - break; - - case '?': - $this->handleQuestionMark(); - break; - - case '|': - $this->handleBar(); - break; - - case '&': - $this->handleAmpersand(); - break; - - case 'is': - case 'as': - $this->handleIsOrAs($type_token); - break; - - default: - $this->handleValue($type_token); - break; - } - - $this->t++; - } - - $this->parse_tree->cleanParents(); - - if ($this->current_leaf !== $this->parse_tree - && ($this->parse_tree instanceof GenericTree - || $this->parse_tree instanceof CallableTree - || $this->parse_tree instanceof KeyedArrayTree) - ) { - throw new TypeParseTreeException( - 'Unterminated bracket' - ); - } - - return $this->parse_tree; - } - - /** - * @param array{0: string, 1: int} $current_token - */ - private function createMethodParam(array $current_token, ParseTree $current_parent): void - { - $byref = false; - $variadic = false; - $has_default = false; - $default = ''; - - if ($current_token[0] === '&') { - $byref = true; - ++$this->t; - $current_token = $this->t < $this->type_token_count ? $this->type_tokens[$this->t] : null; - } elseif ($current_token[0] === '...') { - $variadic = true; - - ++$this->t; - $current_token = $this->t < $this->type_token_count ? $this->type_tokens[$this->t] : null; - } - - if (!$current_token || $current_token[0][0] !== '$') { - throw new TypeParseTreeException('Unexpected token after space'); - } - - $new_parent_leaf = new MethodParamTree( - $current_token[0], - $byref, - $variadic, - $current_parent - ); - - for ($j = $this->t + 1; $j < $this->type_token_count; ++$j) { - $ahead_type_token = $this->type_tokens[$j]; - - if ($ahead_type_token[0] === ',' - || ($ahead_type_token[0] === ')' && $this->type_tokens[$j - 1][0] !== '(') - ) { - $this->t = $j - 1; - break; - } - - if ($has_default) { - $default .= $ahead_type_token[0]; - } - - if ($ahead_type_token[0] === '=') { - $has_default = true; - continue; - } - - if ($j === $this->type_token_count - 1) { - throw new TypeParseTreeException('Unterminated method'); - } - } - - $new_parent_leaf->default = $default; - - if ($this->current_leaf !== $current_parent) { - $new_parent_leaf->children = [$this->current_leaf]; - array_pop($current_parent->children); - } - - $current_parent->children[] = $new_parent_leaf; - - $this->current_leaf = $new_parent_leaf; - } - - private function handleOpenSquareBracket(): void - { - if ($this->current_leaf instanceof Root) { - throw new TypeParseTreeException('Unexpected token ['); - } - - $indexed_access = false; - - $next_token = $this->t + 1 < $this->type_token_count ? $this->type_tokens[$this->t + 1] : null; - - if (!$next_token || $next_token[0] !== ']') { - $next_next_token = $this->t + 2 < $this->type_token_count ? $this->type_tokens[$this->t + 2] : null; - - if ($next_next_token !== null && $next_next_token[0] === ']') { - $indexed_access = true; - ++$this->t; - } else { - throw new TypeParseTreeException('Unexpected token ['); - } - } - - $current_parent = $this->current_leaf->parent; - - if ($indexed_access) { - if ($next_token === null) { - throw new TypeParseTreeException('Unexpected token ['); - } - - $new_parent_leaf = new IndexedAccessTree($next_token[0], $current_parent); - } else { - if ($this->current_leaf instanceof KeyedArrayPropertyTree) { - throw new TypeParseTreeException('Unexpected token ['); - } - - $new_parent_leaf = new GenericTree('array', $current_parent); - } - - $this->current_leaf->parent = $new_parent_leaf; - $new_parent_leaf->children = [$this->current_leaf]; - - if ($current_parent) { - array_pop($current_parent->children); - $current_parent->children[] = $new_parent_leaf; - } else { - $this->parse_tree = $new_parent_leaf; - } - - $this->current_leaf = $new_parent_leaf; - ++$this->t; - } - - private function handleOpenRoundBracket(): void - { - if ($this->current_leaf instanceof Value) { - throw new TypeParseTreeException('Unrecognised token ('); - } - - $new_parent = !$this->current_leaf instanceof Root ? $this->current_leaf : null; - - $new_leaf = new EncapsulationTree( - $new_parent - ); - - if ($this->current_leaf instanceof Root) { - $this->current_leaf = $this->parse_tree = $new_leaf; - return; - } - - if ($new_leaf->parent) { - $new_leaf->parent->children[] = $new_leaf; - } - - $this->current_leaf = $new_leaf; - } - - private function handleClosedRoundBracket(): void - { - $prev_token = $this->t > 0 ? $this->type_tokens[$this->t - 1] : null; - - if ($prev_token !== null - && $prev_token[0] === '(' - && $this->current_leaf instanceof CallableTree - ) { - return; - } - - do { - if ($this->current_leaf->parent === null) { - break; - } - - $this->current_leaf = $this->current_leaf->parent; - } while (!$this->current_leaf instanceof EncapsulationTree - && !$this->current_leaf instanceof CallableTree - && !$this->current_leaf instanceof MethodTree); - - if ($this->current_leaf instanceof EncapsulationTree - || $this->current_leaf instanceof CallableTree - ) { - $this->current_leaf->terminated = true; - } - } - - private function handleComma(): void - { - if ($this->current_leaf instanceof Root) { - throw new TypeParseTreeException('Unexpected token ,'); - } - - if (!$this->current_leaf->parent) { - throw new TypeParseTreeException('Cannot parse comma without a parent node'); - } - - $context_node = $this->current_leaf; - - if ($context_node instanceof GenericTree - || $context_node instanceof KeyedArrayTree - || $context_node instanceof CallableTree - || $context_node instanceof MethodTree - ) { - $context_node = $context_node->parent; - } - - while ($context_node - && !$context_node instanceof GenericTree - && !$context_node instanceof KeyedArrayTree - && !$context_node instanceof CallableTree - && !$context_node instanceof MethodTree - ) { - $context_node = $context_node->parent; - } - - if (!$context_node) { - throw new TypeParseTreeException('Cannot parse comma in non-generic/array type'); - } - - $this->current_leaf = $context_node; - } - - /** @param array{0: string, 1: int} $type_token */ - private function handleEllipsisOrEquals(array $type_token): void - { - $prev_token = $this->t > 0 ? $this->type_tokens[$this->t - 1] : null; - - if ($prev_token && ($prev_token[0] === '...' || $prev_token[0] === '=')) { - throw new TypeParseTreeException('Cannot have duplicate tokens'); - } - - $current_parent = $this->current_leaf->parent; - - if ($this->current_leaf instanceof MethodTree && $type_token[0] === '...') { - $this->createMethodParam($type_token, $this->current_leaf); - return; - } - - while ($current_parent - && !$current_parent instanceof CallableTree - && !$current_parent instanceof CallableParamTree - ) { - $this->current_leaf = $current_parent; - $current_parent = $current_parent->parent; - } - - if (!$current_parent) { - if ($this->current_leaf instanceof CallableTree - && $type_token[0] === '...' - ) { - $current_parent = $this->current_leaf; - } else { - throw new TypeParseTreeException('Unexpected token ' . $type_token[0]); - } - } - - if ($current_parent instanceof CallableParamTree) { - throw new TypeParseTreeException('Cannot have variadic param with a default'); - } - - $new_leaf = new CallableParamTree($current_parent); - $new_leaf->has_default = $type_token[0] === '='; - $new_leaf->variadic = $type_token[0] === '...'; - - if ($current_parent !== $this->current_leaf) { - $new_leaf->children = [$this->current_leaf]; - array_pop($current_parent->children); - } - $current_parent->children[] = $new_leaf; - - $this->current_leaf = $new_leaf; - } - - private function handleColon(): void - { - if ($this->current_leaf instanceof Root) { - throw new TypeParseTreeException('Unexpected token :'); - } - - $current_parent = $this->current_leaf->parent; - - if ($this->current_leaf instanceof CallableTree) { - $new_parent_leaf = new CallableWithReturnTypeTree($current_parent); - $this->current_leaf->parent = $new_parent_leaf; - $new_parent_leaf->children = [$this->current_leaf]; - - if ($current_parent) { - array_pop($current_parent->children); - $current_parent->children[] = $new_parent_leaf; - } else { - $this->parse_tree = $new_parent_leaf; - } - - $this->current_leaf = $new_parent_leaf; - return; - } - - if ($this->current_leaf instanceof MethodTree) { - $new_parent_leaf = new MethodWithReturnTypeTree($current_parent); - $this->current_leaf->parent = $new_parent_leaf; - $new_parent_leaf->children = [$this->current_leaf]; - - if ($current_parent) { - array_pop($current_parent->children); - $current_parent->children[] = $new_parent_leaf; - } else { - $this->parse_tree = $new_parent_leaf; - } - - $this->current_leaf = $new_parent_leaf; - return; - } - - if ($current_parent instanceof KeyedArrayPropertyTree) { - return; - } - - while (($current_parent instanceof UnionTree - || $current_parent instanceof CallableWithReturnTypeTree) - && $this->current_leaf->parent - ) { - $this->current_leaf = $this->current_leaf->parent; - $current_parent = $this->current_leaf->parent; - } - - if ($current_parent instanceof ConditionalTree) { - if (count($current_parent->children) > 1) { - throw new TypeParseTreeException('Cannot process colon in conditional twice'); - } - - $this->current_leaf = $current_parent; - return; - } - - if (!$current_parent) { - throw new TypeParseTreeException('Cannot process colon without parent'); - } - - if (!$this->current_leaf instanceof Value) { - throw new TypeParseTreeException('Unexpected LHS of property'); - } - - if (!$current_parent instanceof KeyedArrayTree) { - throw new TypeParseTreeException('Saw : outside of object-like array'); - } - - $prev_token = $this->t > 0 ? $this->type_tokens[$this->t - 1] : null; - - $new_parent_leaf = new KeyedArrayPropertyTree($this->current_leaf->value, $current_parent); - $new_parent_leaf->possibly_undefined = $prev_token !== null && $prev_token[0] === '?'; - array_pop($current_parent->children); - $current_parent->children[] = $new_parent_leaf; - - $this->current_leaf = $new_parent_leaf; - } - - private function handleSpace(): void - { - if ($this->current_leaf instanceof Root) { - throw new TypeParseTreeException('Unexpected space'); - } - - if ($this->current_leaf instanceof KeyedArrayTree) { - return; - } - - $current_parent = $this->current_leaf->parent; - - if ($current_parent instanceof CallableTree) { - return; - } - - while ($current_parent && !$current_parent instanceof MethodTree) { - $this->current_leaf = $current_parent; - $current_parent = $current_parent->parent; - } - - $next_token = $this->t + 1 < $this->type_token_count ? $this->type_tokens[$this->t + 1] : null; - - if (!$current_parent instanceof MethodTree || !$next_token) { - throw new TypeParseTreeException('Unexpected space'); - } - - ++$this->t; - - $this->createMethodParam($next_token, $current_parent); - } - - private function handleQuestionMark(): void - { - $next_token = $this->t + 1 < $this->type_token_count ? $this->type_tokens[$this->t + 1] : null; - - if ($next_token === null || $next_token[0] !== ':') { - while (($this->current_leaf instanceof Value - || $this->current_leaf instanceof UnionTree - || ($this->current_leaf instanceof KeyedArrayTree - && $this->current_leaf->terminated) - || ($this->current_leaf instanceof GenericTree - && $this->current_leaf->terminated) - || ($this->current_leaf instanceof EncapsulationTree - && $this->current_leaf->terminated) - || ($this->current_leaf instanceof CallableTree - && $this->current_leaf->terminated) - || $this->current_leaf instanceof IntersectionTree) - && $this->current_leaf->parent - ) { - $this->current_leaf = $this->current_leaf->parent; - } - - if ($this->current_leaf instanceof TemplateIsTree && $this->current_leaf->parent) { - $current_parent = $this->current_leaf->parent; - - $new_leaf = new ConditionalTree( - $this->current_leaf, - $this->current_leaf->parent - ); - - array_pop($current_parent->children); - $current_parent->children[] = $new_leaf; - $this->current_leaf = $new_leaf; - } else { - $new_parent = !$this->current_leaf instanceof Root ? $this->current_leaf : null; - - if (!$next_token) { - throw new TypeParseTreeException('Unexpected token ?'); - } - - $new_leaf = new NullableTree( - $new_parent - ); - - if ($this->current_leaf instanceof Root) { - $this->current_leaf = $this->parse_tree = $new_leaf; - return; - } - - if ($new_leaf->parent) { - $new_leaf->parent->children[] = $new_leaf; - } - - $this->current_leaf = $new_leaf; - } - } - } - - private function handleBar(): void - { - if ($this->current_leaf instanceof Root) { - throw new TypeParseTreeException('Unexpected token |'); - } - - $current_parent = $this->current_leaf->parent; - - if ($current_parent instanceof CallableWithReturnTypeTree) { - $this->current_leaf = $current_parent; - $current_parent = $current_parent->parent; - } - - if ($current_parent instanceof NullableTree) { - $this->current_leaf = $current_parent; - $current_parent = $current_parent->parent; - } - - if ($this->current_leaf instanceof UnionTree) { - throw new TypeParseTreeException('Unexpected token |'); - } - - if ($current_parent instanceof UnionTree) { - $this->current_leaf = $current_parent; - return; - } - - if ($current_parent instanceof IntersectionTree) { - $this->current_leaf = $current_parent; - $current_parent = $this->current_leaf->parent; - } - - if ($current_parent instanceof TemplateIsTree) { - $new_parent_leaf = new UnionTree($this->current_leaf); - $new_parent_leaf->children = [$this->current_leaf]; - $new_parent_leaf->parent = $current_parent; - } else { - $new_parent_leaf = new UnionTree($current_parent); - $new_parent_leaf->children = [$this->current_leaf]; - } - - if ($current_parent) { - array_pop($current_parent->children); - $current_parent->children[] = $new_parent_leaf; - } else { - $this->parse_tree = $new_parent_leaf; - } - - $this->current_leaf = $new_parent_leaf; - } - - private function handleAmpersand(): void - { - if ($this->current_leaf instanceof Root) { - throw new TypeParseTreeException( - 'Unexpected &' - ); - } - - $current_parent = $this->current_leaf->parent; - - if ($current_parent instanceof MethodTree) { - $this->createMethodParam($this->type_tokens[$this->t], $current_parent); - return; - } - - if ($current_parent instanceof IntersectionTree) { - $this->current_leaf = $current_parent; - return; - } - - $new_parent_leaf = new IntersectionTree($current_parent); - $new_parent_leaf->children = [$this->current_leaf]; - - if ($current_parent) { - array_pop($current_parent->children); - $current_parent->children[] = $new_parent_leaf; - } else { - $this->parse_tree = $new_parent_leaf; - } - - $this->current_leaf = $new_parent_leaf; - } - - /** @param array{0: string, 1: int} $type_token */ - private function handleIsOrAs(array $type_token): void - { - if ($this->t === 0) { - $this->handleValue($type_token); - } else { - $current_parent = $this->current_leaf->parent; - - if ($current_parent) { - array_pop($current_parent->children); - } - - if ($type_token[0] === 'as') { - $next_token = $this->t + 1 < $this->type_token_count ? $this->type_tokens[$this->t + 1] : null; - - if (!$this->current_leaf instanceof Value - || !$current_parent instanceof GenericTree - || !$next_token - ) { - throw new TypeParseTreeException('Unexpected token ' . $type_token[0]); - } - - $this->current_leaf = new TemplateAsTree( - $this->current_leaf->value, - $next_token[0], - $current_parent - ); - - $current_parent->children[] = $this->current_leaf; - ++$this->t; - } elseif ($this->current_leaf instanceof Value) { - $this->current_leaf = new TemplateIsTree( - $this->current_leaf->value, - $current_parent - ); - - if ($current_parent) { - $current_parent->children[] = $this->current_leaf; - } - } - } - } - - /** @param array{0: string, 1: int, 2?: string} $type_token */ - private function handleValue(array $type_token): void - { - $new_parent = !$this->current_leaf instanceof Root ? $this->current_leaf : null; - - if ($this->current_leaf instanceof MethodTree && $type_token[0][0] === '$') { - $this->createMethodParam($type_token, $this->current_leaf); - return; - } - - $next_token = $this->t + 1 < $this->type_token_count ? $this->type_tokens[$this->t + 1] : null; - - switch ($next_token[0] ?? null) { - case '<': - $new_leaf = new GenericTree( - $type_token[0], - $new_parent - ); - ++$this->t; - break; - - case '{': - $new_leaf = new KeyedArrayTree( - $type_token[0], - $new_parent - ); - ++$this->t; - break; - - case '(': - if (in_array( - $type_token[0], - ['callable', 'pure-callable', 'Closure', '\Closure', 'pure-Closure'], - true - )) { - $new_leaf = new CallableTree( - $type_token[0], - $new_parent - ); - } elseif ($type_token[0] !== 'array' - && $type_token[0][0] !== '\\' - && $this->current_leaf instanceof Root - ) { - $new_leaf = new MethodTree( - $type_token[0], - $new_parent - ); - } else { - throw new TypeParseTreeException( - 'Parenthesis must be preceded by “Closure”, “callable”, "pure-callable" or a valid @method name' - ); - } - - ++$this->t; - break; - - case '::': - $nexter_token = $this->t + 2 < $this->type_token_count ? $this->type_tokens[$this->t + 2] : null; - - if ($this->current_leaf instanceof ParseTree\KeyedArrayTree - && $nexter_token - && strtolower($nexter_token[0]) !== 'class' - ) { - throw new TypeParseTreeException( - ':: in array key is only allowed for ::class' - ); - } - - if (!$nexter_token - || (!preg_match('/^([a-zA-Z_][a-zA-Z_0-9]*\*?|\*)$/', $nexter_token[0]) - && strtolower($nexter_token[0]) !== 'class') - ) { - throw new TypeParseTreeException( - 'Invalid class constant ' . ($nexter_token[0] ?? '') - ); - } - - $new_leaf = new Value( - $type_token[0] . '::' . $nexter_token[0], - $type_token[1], - $type_token[1] + 2 + strlen($nexter_token[0]), - $type_token[2] ?? null, - $new_parent - ); - - $this->t += 2; - - break; - - default: - if ($type_token[0] === '$this') { - $type_token[0] = 'static'; - } - - $new_leaf = new Value( - $type_token[0], - $type_token[1], - $type_token[1] + strlen($type_token[0]), - $type_token[2] ?? null, - $new_parent - ); - break; - } - - if ($this->current_leaf instanceof Root) { - $this->current_leaf = $this->parse_tree = $new_leaf; - return; - } - - if ($new_leaf->parent) { - $new_leaf->parent->children[] = $new_leaf; - } - - $this->current_leaf = $new_leaf; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php deleted file mode 100644 index 0c46ef25..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php +++ /dev/null @@ -1,2554 +0,0 @@ -5` result is `int<6, max>`. - * Complex reconciliation takes part in AssertionReconciler if this class couldn't handle the reconciliation - */ -class SimpleAssertionReconciler extends Reconciler -{ - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - public static function reconcile( - string $assertion, - Codebase $codebase, - Union $existing_var_type, - ?string $key = null, - bool $negated = false, - ?CodeLocation $code_location = null, - array $suppressed_issues = [], - int &$failed_reconciliation = Reconciler::RECONCILIATION_OK, - bool $is_equality = false, - bool $is_strict_equality = false, - bool $inside_loop = false - ): ?Union { - if ($assertion === 'mixed' && $existing_var_type->hasMixed()) { - return $existing_var_type; - } - - $old_var_type_string = $existing_var_type->getId(); - - if ($assertion === 'isset') { - return self::reconcileIsset( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - $inside_loop - ); - } - - if ($assertion === 'array-key-exists') { - $existing_var_type->possibly_undefined = false; - - return $existing_var_type; - } - - if (strpos($assertion, 'in-array-') === 0) { - return self::reconcileInArray( - $codebase, - $existing_var_type, - substr($assertion, 9), - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation - ); - } - - if (strpos($assertion, 'has-array-key-') === 0) { - return self::reconcileHasArrayKey( - $existing_var_type, - substr($assertion, 14) - ); - } - - if ($assertion[0] === '>') { - return self::reconcileSuperiorTo( - $existing_var_type, - $assertion, - $inside_loop, - $old_var_type_string, - $key, - $negated, - $code_location, - $suppressed_issues - ); - } - - if ($assertion[0] === '<') { - return self::reconcileInferiorTo( - $existing_var_type, - $assertion, - $inside_loop, - $old_var_type_string, - $key, - $negated, - $code_location, - $suppressed_issues - ); - } - - if ($assertion === 'falsy' || $assertion === 'empty') { - return self::reconcileFalsyOrEmpty( - $assertion, - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - false - ); - } - - if ($assertion === 'object') { - return self::reconcileObject( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'resource') { - return self::reconcileResource( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'callable') { - return self::reconcileCallable( - $codebase, - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'iterable') { - return self::reconcileIterable( - $codebase, - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'array') { - return self::reconcileArray( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'list') { - return self::reconcileList( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - false - ); - } - - if ($assertion === 'non-empty-list') { - return self::reconcileList( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - true - ); - } - - if ($assertion === 'Traversable') { - return self::reconcileTraversable( - $codebase, - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'countable') { - return self::reconcileCountable( - $codebase, - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'string-array-access') { - return self::reconcileStringArrayAccess( - $codebase, - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $inside_loop - ); - } - - if ($assertion === 'int-or-string-array-access') { - return self::reconcileIntArrayAccess( - $codebase, - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $inside_loop - ); - } - - if ($assertion === 'numeric') { - return self::reconcileNumeric( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'scalar') { - return self::reconcileScalar( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'bool') { - return self::reconcileBool( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'string') { - return self::reconcileString( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - $is_strict_equality - ); - } - - if ($assertion === 'int') { - return self::reconcileInt( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - $is_strict_equality - ); - } - - if ($assertion === 'positive-numeric') { - return self::reconcilePositiveNumeric( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'float' - && $existing_var_type->from_calculation - && $existing_var_type->hasInt() - ) { - return Type::getFloat(); - } - - if ($assertion === 'float' && $is_equality && !$is_strict_equality && $existing_var_type->isString()) { - return Type::getNumericString(); - } - - if ($assertion === 'non-empty-countable') { - return self::reconcileNonEmptyCountable( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - null - ); - } - - if (strpos($assertion, 'has-at-least-') === 0) { - return self::reconcileNonEmptyCountable( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - (int) substr($assertion, 13) - ); - } - - if (strpos($assertion, 'has-exactly-') === 0) { - /** @psalm-suppress ArgumentTypeCoercion */ - return self::reconcileExactlyCountable( - $existing_var_type, - (int) substr($assertion, 12) - ); - } - - if (strpos($assertion, 'hasmethod-') === 0) { - return self::reconcileHasMethod( - $codebase, - substr($assertion, 10), - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation - ); - } - - if (substr($assertion, 0, 15) === 'class-constant(') { - return self::reconcileClassConstant( - $codebase, - substr($assertion, 15, -1), - $existing_var_type, - $failed_reconciliation - ); - } - - if ($existing_var_type->isSingle() - && $existing_var_type->hasTemplate() - && strpos($assertion, '-') === false - && strpos($assertion, '(') === false - ) { - foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TTemplateParam) { - if ($atomic_type->as->hasMixed() - || $atomic_type->as->hasObject() - ) { - $atomic_type->as = Type::parseString($assertion); - - return $existing_var_type; - } - } - } - } - - return null; - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileIsset( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality, - bool $inside_loop - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - // if key references an array offset - $did_remove_type = ($key && strpos($key, '[')) - || !$existing_var_type->initialized - || $existing_var_type->possibly_undefined - || $existing_var_type->ignore_isset; - - if ($existing_var_type->isNullable()) { - $existing_var_type->removeType('null'); - - $did_remove_type = true; - } - - if (!$existing_var_type->hasMixed() - && !$is_equality - && (!$did_remove_type || $existing_var_type->isUnionEmpty()) - && $key - && $code_location - ) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'isset', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - - if ($existing_var_type->isUnionEmpty()) { - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return Type::getEmpty(); - } - } - - if ($existing_var_type->hasType('empty')) { - $existing_var_type->removeType('empty'); - $existing_var_type->addType(new TMixed($inside_loop)); - } - - $existing_var_type->from_property = false; - $existing_var_type->from_static_property = false; - $existing_var_type->possibly_undefined = false; - $existing_var_type->possibly_undefined_from_try = false; - $existing_var_type->ignore_isset = false; - - return $existing_var_type; - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileNonEmptyCountable( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality, - ?int $min_count - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - if ($existing_var_type->hasType('array')) { - $array_atomic_type = $existing_var_type->getAtomicTypes()['array']; - $did_remove_type = false; - - if ($array_atomic_type instanceof TArray) { - if (!$array_atomic_type instanceof TNonEmptyArray - || ($array_atomic_type->count < $min_count) - ) { - if ($array_atomic_type->getId() === 'array') { - $existing_var_type->removeType('array'); - } else { - $non_empty_array = new TNonEmptyArray( - $array_atomic_type->type_params - ); - - if ($min_count) { - $non_empty_array->count = $min_count; - } - - $existing_var_type->addType($non_empty_array); - } - - $did_remove_type = true; - } - } elseif ($array_atomic_type instanceof TList) { - if (!$array_atomic_type instanceof TNonEmptyList - || ($array_atomic_type->count < $min_count) - ) { - $non_empty_list = new TNonEmptyList( - $array_atomic_type->type_param - ); - - if ($min_count) { - $non_empty_list->count = $min_count; - } - - $did_remove_type = true; - $existing_var_type->addType($non_empty_list); - } - } elseif ($array_atomic_type instanceof TKeyedArray) { - foreach ($array_atomic_type->properties as $property_type) { - if ($property_type->possibly_undefined) { - $did_remove_type = true; - break; - } - } - } - - if (!$is_equality - && !$existing_var_type->hasMixed() - && (!$did_remove_type || $existing_var_type->isUnionEmpty()) - ) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'non-empty-countable', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - } - - return $existing_var_type; - } - - /** - * @param positive-int $count - */ - private static function reconcileExactlyCountable( - Union $existing_var_type, - int $count - ): Union { - if ($existing_var_type->hasType('array')) { - $array_atomic_type = $existing_var_type->getAtomicTypes()['array']; - - if ($array_atomic_type instanceof TArray) { - $non_empty_array = new TNonEmptyArray( - $array_atomic_type->type_params - ); - - $non_empty_array->count = $count; - - $existing_var_type->addType( - $non_empty_array - ); - } elseif ($array_atomic_type instanceof TList) { - $non_empty_list = new TNonEmptyList( - $array_atomic_type->type_param - ); - - $non_empty_list->count = $count; - - $existing_var_type->addType( - $non_empty_list - ); - } - } - - return $existing_var_type; - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcilePositiveNumeric( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - $did_remove_type = false; - - $positive_types = []; - - foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TLiteralInt) { - if ($atomic_type->value < 1) { - $did_remove_type = true; - } else { - $positive_types[] = $atomic_type; - } - } elseif ($atomic_type instanceof TPositiveInt) { - $positive_types[] = $atomic_type; - } elseif ($atomic_type instanceof TIntRange) { - if (!$atomic_type->isPositive()) { - $did_remove_type = true; - } - $positive_types[] = new TIntRange( - $atomic_type->min_bound === null ? 1 : max(1, $atomic_type->min_bound), - $atomic_type->max_bound === null ? null : max(1, $atomic_type->max_bound) - ); - } elseif (get_class($atomic_type) === TInt::class) { - $positive_types[] = new TPositiveInt(); - $did_remove_type = true; - } else { - // for now allow this check everywhere else - if (!$atomic_type instanceof TNull - && !$atomic_type instanceof TFalse - ) { - $positive_types[] = $atomic_type; - } - - $did_remove_type = true; - } - } - - if (!$is_equality - && !$existing_var_type->hasMixed() - && (!$did_remove_type || !$positive_types) - ) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'positive-numeric', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($positive_types) { - return new Union($positive_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileHasMethod( - Codebase $codebase, - string $method_name, - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - $object_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type instanceof TNamedObject - && $codebase->classOrInterfaceExists($type->value) - ) { - $object_types[] = $type; - - if (!$codebase->methodExists($type->value . '::' . $method_name)) { - $match_found = false; - - if ($type->extra_types) { - foreach ($type->extra_types as $extra_type) { - if ($extra_type instanceof TNamedObject - && $codebase->classOrInterfaceExists($extra_type->value) - && $codebase->methodExists($extra_type->value . '::' . $method_name) - ) { - $match_found = true; - } elseif ($extra_type instanceof TObjectWithProperties) { - $match_found = true; - - if (!isset($extra_type->methods[$method_name])) { - $extra_type->methods[$method_name] = 'object::' . $method_name; - $did_remove_type = true; - } - } - } - } - - if (!$match_found) { - $obj = new TObjectWithProperties( - [], - [$method_name => $type->value . '::' . $method_name] - ); - $type->extra_types[$obj->getKey()] = $obj; - $did_remove_type = true; - } - } - } elseif ($type instanceof TObjectWithProperties) { - $object_types[] = $type; - - if (!isset($type->methods[$method_name])) { - $type->methods[$method_name] = 'object::' . $method_name; - $did_remove_type = true; - } - } elseif ($type instanceof TObject || $type instanceof TMixed) { - $object_types[] = new TObjectWithProperties( - [], - [$method_name => 'object::' . $method_name] - ); - $did_remove_type = true; - } elseif ($type instanceof TString) { - // we don’t know - $object_types[] = $type; - $did_remove_type = true; - } elseif ($type instanceof TTemplateParam) { - $object_types[] = $type; - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if (!$object_types || !$did_remove_type) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'object with method ' . $method_name, - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($object_types) { - return new Union($object_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileString( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality, - bool $is_strict_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - if ($existing_var_type->hasMixed()) { - if ($is_equality && !$is_strict_equality) { - return $existing_var_type; - } - - return Type::getString(); - } - - $string_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type instanceof TString) { - $string_types[] = $type; - - if (get_class($type) === TString::class) { - $type->from_docblock = false; - } - } elseif ($type instanceof TCallable) { - $string_types[] = new TCallableString; - $did_remove_type = true; - } elseif ($type instanceof TNumeric) { - $string_types[] = new TNumericString; - $did_remove_type = true; - } elseif ($type instanceof TScalar || $type instanceof TArrayKey) { - $string_types[] = new TString; - $did_remove_type = true; - } elseif ($type instanceof TTemplateParam) { - if ($type->as->hasString() || $type->as->hasMixed() || $type->as->hasScalar()) { - $type = clone $type; - - $type->as = self::reconcileString( - $type->as, - null, - false, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - $is_strict_equality - ); - - $string_types[] = $type; - } - - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$did_remove_type || !$string_types) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'string', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($string_types) { - return new Union($string_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileInt( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality, - bool $is_strict_equality - ): Union { - if ($existing_var_type->hasMixed()) { - if ($is_equality && !$is_strict_equality) { - return $existing_var_type; - } - - return Type::getInt(); - } - - $old_var_type_string = $existing_var_type->getId(); - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - $int_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type instanceof TInt) { - $int_types[] = $type; - - if (get_class($type) === TInt::class) { - $type->from_docblock = false; - } - - if ($existing_var_type->from_calculation) { - $did_remove_type = true; - } - } elseif ($type instanceof TNumeric) { - $int_types[] = new TInt; - $did_remove_type = true; - } elseif ($type instanceof TScalar || $type instanceof TArrayKey) { - $int_types[] = new TInt; - $did_remove_type = true; - } elseif ($type instanceof TTemplateParam) { - if ($type->as->hasInt() || $type->as->hasMixed()) { - $type = clone $type; - - $type->as = self::reconcileInt( - $type->as, - null, - false, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - $is_strict_equality - ); - - $int_types[] = $type; - } - - $did_remove_type = true; - } elseif ($type instanceof TString && $is_equality && !$is_strict_equality) { - $int_types[] = new TNumericString(); - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$did_remove_type || !$int_types) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'int', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($int_types) { - return new Union($int_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileBool( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - if ($existing_var_type->hasMixed()) { - return Type::getBool(); - } - - $bool_types = []; - $did_remove_type = false; - - $old_var_type_string = $existing_var_type->getId(); - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - foreach ($existing_var_atomic_types as $type) { - if ($type instanceof TBool) { - $bool_types[] = $type; - $type->from_docblock = false; - } elseif ($type instanceof TScalar) { - $bool_types[] = new TBool; - $did_remove_type = true; - } elseif ($type instanceof TTemplateParam) { - if ($type->as->hasBool() || $type->as->hasMixed()) { - $type = clone $type; - - $type->as = self::reconcileBool( - $type->as, - null, - false, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - - $bool_types[] = $type; - } - - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$did_remove_type || !$bool_types) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'bool', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($bool_types) { - return new Union($bool_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileScalar( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - if ($existing_var_type->hasMixed()) { - return Type::getScalar(); - } - - $scalar_types = []; - $did_remove_type = false; - - $old_var_type_string = $existing_var_type->getId(); - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - foreach ($existing_var_atomic_types as $type) { - if ($type instanceof Scalar) { - $scalar_types[] = $type; - } elseif ($type instanceof TTemplateParam) { - if ($type->as->hasScalar() || $type->as->hasMixed()) { - $type = clone $type; - - $type->as = self::reconcileScalar( - $type->as, - null, - false, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - - $scalar_types[] = $type; - } - - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$did_remove_type || !$scalar_types) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'scalar', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($scalar_types) { - return new Union($scalar_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileNumeric( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - if ($existing_var_type->hasMixed()) { - return Type::getNumeric(); - } - - $old_var_type_string = $existing_var_type->getId(); - - $numeric_types = []; - $did_remove_type = false; - - if ($existing_var_type->hasString()) { - $did_remove_type = true; - $existing_var_type->removeType('string'); - $existing_var_type->addType(new TNumericString); - } - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TNumeric || $type instanceof TNumericString) { - // this is a workaround for a possible issue running - // is_numeric($a) && is_string($a) - $did_remove_type = true; - $numeric_types[] = $type; - } elseif ($type->isNumericType()) { - $numeric_types[] = $type; - } elseif ($type instanceof TScalar) { - $did_remove_type = true; - $numeric_types[] = new TNumeric(); - } elseif ($type instanceof TArrayKey) { - $did_remove_type = true; - $numeric_types[] = new TInt(); - $numeric_types[] = new TNumericString(); - } elseif ($type instanceof TTemplateParam) { - if ($type->as->hasNumeric() || $type->as->hasMixed()) { - $type = clone $type; - - $type->as = self::reconcileNumeric( - $type->as, - null, - false, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - - $numeric_types[] = $type; - } - - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$did_remove_type || !$numeric_types) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'numeric', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($numeric_types) { - return new Union($numeric_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileObject( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - if ($existing_var_type->hasMixed()) { - return Type::getObject(); - } - - $old_var_type_string = $existing_var_type->getId(); - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - $object_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type->isObjectType()) { - $object_types[] = $type; - } elseif ($type instanceof TCallable) { - $object_types[] = new TCallableObject(); - $did_remove_type = true; - } elseif ($type instanceof TTemplateParam - && $type->as->isMixed() - ) { - $type = clone $type; - $type->as = Type::getObject(); - $object_types[] = $type; - $did_remove_type = true; - } elseif ($type instanceof TTemplateParam) { - if ($type->as->hasObject() || $type->as->hasMixed()) { - $type = clone $type; - - $type->as = self::reconcileObject( - $type->as, - null, - false, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - - $object_types[] = $type; - } - - $did_remove_type = true; - } elseif ($type instanceof TIterable) { - $clone_type = clone $type; - - self::refineArrayKey($clone_type->type_params[0]); - - $object_types[] = new TGenericObject('Traversable', $clone_type->type_params); - - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$object_types || !$did_remove_type) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'object', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($object_types) { - return new Union($object_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileResource( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - if ($existing_var_type->hasMixed()) { - return Type::getResource(); - } - - $old_var_type_string = $existing_var_type->getId(); - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - $resource_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type instanceof TResource) { - $resource_types[] = $type; - } else { - $did_remove_type = true; - } - } - - if ((!$resource_types || !$did_remove_type) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'resource', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($resource_types) { - return new Union($resource_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileCountable( - Codebase $codebase, - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - - if ($existing_var_type->hasMixed() || $existing_var_type->hasTemplate()) { - return new Union([ - new TArray([Type::getArrayKey(), Type::getMixed()]), - new TNamedObject('Countable'), - ]); - } - - $iterable_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type->isCountable($codebase)) { - $iterable_types[] = $type; - } elseif ($type instanceof TObject) { - $iterable_types[] = new TNamedObject('Countable'); - $did_remove_type = true; - } elseif ($type instanceof TNamedObject || $type instanceof TIterable) { - $countable = new TNamedObject('Countable'); - $type->extra_types[$countable->getKey()] = $countable; - $iterable_types[] = $type; - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$iterable_types || !$did_remove_type) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'countable', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($iterable_types) { - return new Union($iterable_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileIterable( - Codebase $codebase, - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - if ($existing_var_type->hasMixed() || $existing_var_type->hasTemplate()) { - return new Union([new TIterable]); - } - - $iterable_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type->isIterable($codebase)) { - $iterable_types[] = $type; - } elseif ($type instanceof TObject) { - $iterable_types[] = new TNamedObject('Traversable'); - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$iterable_types || !$did_remove_type) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'iterable', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($iterable_types) { - return new Union($iterable_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileInArray( - Codebase $codebase, - Union $existing_var_type, - string $assertion, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation - ): Union { - $new_var_type = Type::parseString($assertion); - - $intersection = Type::intersectUnionTypes($new_var_type, $existing_var_type, $codebase); - - if ($intersection === null) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $existing_var_type->getId(), - $key, - '!' . $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - return $intersection; - } - - private static function reconcileHasArrayKey( - Union $existing_var_type, - string $assertion - ): Union { - foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { - if ($atomic_type instanceof TKeyedArray) { - $is_class_string = false; - - if (strpos($assertion, '::class')) { - [$assertion] = explode('::', $assertion); - $is_class_string = true; - } - - if (isset($atomic_type->properties[$assertion])) { - $atomic_type->properties[$assertion]->possibly_undefined = false; - } else { - $atomic_type->properties[$assertion] = Type::getMixed(); - - if ($is_class_string) { - $atomic_type->class_strings[$assertion] = true; - } - } - } - } - - return $existing_var_type; - } - - /** - * @param string[] $suppressed_issues - */ - private static function reconcileSuperiorTo( - Union $existing_var_type, - string $assertion, - bool $inside_loop, - string $old_var_type_string, - ?string $var_id, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues - ): Union { - $assertion_value = (int)substr($assertion, 1); - - $did_remove_type = false; - - foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { - if ($inside_loop) { - continue; - } - - if ($atomic_type instanceof TIntRange) { - if ($atomic_type->contains($assertion_value)) { - // if the range contains the assertion, the range must be adapted - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - if ($atomic_type->min_bound === null) { - $atomic_type->min_bound = $assertion_value; - } else { - $atomic_type->min_bound = TIntRange::getNewHighestBound( - $assertion_value, - $atomic_type->min_bound - ); - } - $existing_var_type->addType($atomic_type); - } elseif ($atomic_type->isLesserThan($assertion_value)) { - // if the range is lesser than the assertion, the type must be removed - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - } elseif ($atomic_type->isGreaterThan($assertion_value)) { - // if the range is greater than the assertion, the check is redundant - } - } elseif ($atomic_type instanceof TLiteralInt) { - if ($atomic_type->value < $assertion_value) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - } /*elseif ($inside_loop) { - //when inside a loop, allow the range to extends the type - $existing_var_type->removeType($atomic_type->getKey()); - if ($atomic_type->value < $assertion_value) { - $existing_var_type->addType(new TIntRange($atomic_type->value, $assertion_value)); - } else { - $existing_var_type->addType(new TIntRange($assertion_value, $atomic_type->value)); - } - }*/ - } elseif ($atomic_type instanceof TPositiveInt) { - if ($assertion_value > 1) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - $existing_var_type->addType(new TIntRange($assertion_value, null)); - } - } elseif ($atomic_type instanceof TInt) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - $existing_var_type->addType(new TIntRange($assertion_value, null)); - } else { - // we assume that other types may have been removed (empty strings? numeric strings?) - //It may be worth refining to improve reconciliation while keeping in mind we're on loose comparison - $did_remove_type = true; - } - } - - if (!$inside_loop && !$did_remove_type && $var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - - if ($existing_var_type->isUnionEmpty()) { - if ($var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - false, - $negated, - $code_location, - $suppressed_issues - ); - } - $existing_var_type->addType(new TNever()); - } - - return $existing_var_type; - } - - /** - * @param string[] $suppressed_issues - */ - private static function reconcileInferiorTo( - Union $existing_var_type, - string $assertion, - bool $inside_loop, - string $old_var_type_string, - ?string $var_id, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues - ): Union { - $assertion_value = (int)substr($assertion, 1); - - $did_remove_type = false; - - foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { - if ($inside_loop) { - continue; - } - - if ($atomic_type instanceof TIntRange) { - if ($atomic_type->contains($assertion_value)) { - // if the range contains the assertion, the range must be adapted - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - if ($atomic_type->max_bound === null) { - $atomic_type->max_bound = $assertion_value; - } else { - $atomic_type->max_bound = min($atomic_type->max_bound, $assertion_value); - } - $existing_var_type->addType($atomic_type); - } elseif ($atomic_type->isLesserThan($assertion_value)) { - // if the range is lesser than the assertion, the check is redundant - } elseif ($atomic_type->isGreaterThan($assertion_value)) { - // if the range is greater than the assertion, the type must be removed - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - } - } elseif ($atomic_type instanceof TLiteralInt) { - if ($atomic_type->value > $assertion_value) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - } /* elseif ($inside_loop) { - //when inside a loop, allow the range to extends the type - $existing_var_type->removeType($atomic_type->getKey()); - if ($atomic_type->value < $assertion_value) { - $existing_var_type->addType(new TIntRange($atomic_type->value, $assertion_value)); - } else { - $existing_var_type->addType(new TIntRange($assertion_value, $atomic_type->value)); - } - }*/ - } elseif ($atomic_type instanceof TPositiveInt) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - if ($assertion_value >= 1) { - $existing_var_type->addType(new TIntRange(1, $assertion_value)); - } - } elseif ($atomic_type instanceof TInt) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - $existing_var_type->addType(new TIntRange(null, $assertion_value)); - } else { - // we assume that other types may have been removed (empty strings? numeric strings?) - //It may be worth refining to improve reconciliation while keeping in mind we're on loose comparison - $did_remove_type = true; - } - } - - if (!$inside_loop && !$did_remove_type && $var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - - if ($existing_var_type->isUnionEmpty()) { - if ($var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - $assertion, - false, - $negated, - $code_location, - $suppressed_issues - ); - } - $existing_var_type->addType(new TNever()); - } - - return $existing_var_type; - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileTraversable( - Codebase $codebase, - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - if ($existing_var_type->hasMixed() || $existing_var_type->hasTemplate()) { - return new Union([new TNamedObject('Traversable')]); - } - - $traversable_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type->hasTraversableInterface($codebase)) { - $traversable_types[] = $type; - } elseif ($type instanceof TIterable) { - $clone_type = clone $type; - $traversable_types[] = new TGenericObject('Traversable', $clone_type->type_params); - $did_remove_type = true; - } elseif ($type instanceof TObject) { - $traversable_types[] = new TNamedObject('Traversable'); - $did_remove_type = true; - } elseif ($type instanceof TNamedObject) { - $traversable = new TNamedObject('Traversable'); - $type->extra_types[$traversable->getKey()] = $traversable; - $traversable_types[] = $type; - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$traversable_types || !$did_remove_type) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'Traversable', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($traversable_types) { - return new Union($traversable_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileArray( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - if ($existing_var_type->hasMixed()) { - return Type::getArray(); - } - - $array_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type instanceof TArray || $type instanceof TKeyedArray || $type instanceof TList) { - $array_types[] = $type; - } elseif ($type instanceof TCallable) { - $array_types[] = new TCallableKeyedArray([ - new Union([new TClassString, new TObject]), - Type::getString() - ]); - - $did_remove_type = true; - } elseif ($type instanceof TIterable) { - $clone_type = clone $type; - - self::refineArrayKey($clone_type->type_params[0]); - - $array_types[] = new TArray($clone_type->type_params); - - $did_remove_type = true; - } elseif ($type instanceof TTemplateParam) { - if ($type->as->hasArray() || $type->as->hasIterable() || $type->as->hasMixed()) { - $type = clone $type; - - $type->as = self::reconcileArray( - $type->as, - null, - false, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - - $array_types[] = $type; - } - - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$array_types || !$did_remove_type) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'array', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - } - - if ($array_types) { - return TypeCombiner::combine($array_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileList( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality, - bool $is_non_empty - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - if ($existing_var_type->hasMixed() || $existing_var_type->hasTemplate()) { - return $is_non_empty ? Type::getNonEmptyList() : Type::getList(); - } - - $array_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type instanceof TList - || ($type instanceof TKeyedArray && $type->is_list) - ) { - if ($is_non_empty && $type instanceof TList && !$type instanceof TNonEmptyList) { - $array_types[] = new TNonEmptyList($type->type_param); - $did_remove_type = true; - } else { - $array_types[] = $type; - } - } elseif ($type instanceof TArray || $type instanceof TKeyedArray) { - if ($type instanceof TKeyedArray) { - $type = $type->getGenericArrayType(); - } - - if ($type->type_params[0]->hasArrayKey() - || $type->type_params[0]->hasInt() - ) { - if ($type instanceof TNonEmptyArray) { - $array_types[] = new TNonEmptyList($type->type_params[1]); - } else { - $array_types[] = new TList($type->type_params[1]); - } - } - - if ($type->type_params[0]->isEmpty() - || $type->type_params[1]->isEmpty() - ) { - //we allow an empty array to pass as a list. We keep the type as empty array though (more precise) - $array_types[] = $type; - } - - $did_remove_type = true; - } elseif ($type instanceof TCallable) { - $array_types[] = new TCallableKeyedArray([ - new Union([new TClassString, new TObject]), - Type::getString() - ]); - - $did_remove_type = true; - } elseif ($type instanceof TIterable) { - $clone_type = clone $type; - $array_types[] = new TList($clone_type->type_params[1]); - - $did_remove_type = true; - } else { - $did_remove_type = true; - } - } - - if ((!$array_types || !$did_remove_type) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'array', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - } - - if ($array_types) { - return TypeCombiner::combine($array_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getEmpty(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileStringArrayAccess( - Codebase $codebase, - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $inside_loop - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - if ($existing_var_type->hasMixed() || $existing_var_type->hasTemplate()) { - return new Union([ - new TNonEmptyArray([Type::getArrayKey(), Type::getMixed()]), - new TNamedObject('ArrayAccess'), - ]); - } - - $array_types = []; - - foreach ($existing_var_atomic_types as $type) { - if ($type->isArrayAccessibleWithStringKey($codebase)) { - if (get_class($type) === TArray::class) { - $array_types[] = new TNonEmptyArray($type->type_params); - } elseif (get_class($type) === TList::class) { - $array_types[] = new TNonEmptyList($type->type_param); - } else { - $array_types[] = $type; - } - } elseif ($type instanceof TTemplateParam) { - $array_types[] = $type; - } - } - - if (!$array_types) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'string-array-access', - true, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($array_types) { - return new Union($array_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed($inside_loop); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileIntArrayAccess( - Codebase $codebase, - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $inside_loop - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - if ($existing_var_type->hasMixed()) { - return Type::getMixed(); - } - - $array_types = []; - - foreach ($existing_var_atomic_types as $type) { - if ($type->isArrayAccessibleWithIntOrStringKey($codebase)) { - if (get_class($type) === TArray::class) { - $array_types[] = new TNonEmptyArray($type->type_params); - } else { - $array_types[] = $type; - } - } elseif ($type instanceof TTemplateParam) { - $array_types[] = $type; - } - } - - if (!$array_types) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'int-or-string-array-access', - true, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($array_types) { - return TypeCombiner::combine($array_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed($inside_loop); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileCallable( - Codebase $codebase, - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - if ($existing_var_type->hasMixed()) { - return Type::parseString('callable'); - } - - $old_var_type_string = $existing_var_type->getId(); - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - $callable_types = []; - $did_remove_type = false; - - foreach ($existing_var_atomic_types as $type) { - if ($type->isCallableType()) { - $callable_types[] = $type; - } elseif ($type instanceof TObject) { - $callable_types[] = new TCallableObject(); - $did_remove_type = true; - } elseif ($type instanceof TNamedObject - && $codebase->classExists($type->value) - && $codebase->methodExists($type->value . '::__invoke') - ) { - $callable_types[] = $type; - } elseif (get_class($type) === TString::class - || get_class($type) === TNonEmptyString::class - || get_class($type) === TNonFalsyString::class - ) { - $callable_types[] = new TCallableString(); - $did_remove_type = true; - } elseif (get_class($type) === TLiteralString::class - && InternalCallMapHandler::inCallMap($type->value) - ) { - $callable_types[] = $type; - $did_remove_type = true; - } elseif ($type instanceof TArray) { - $type = clone $type; - $type = new TCallableArray($type->type_params); - $callable_types[] = $type; - $did_remove_type = true; - } elseif ($type instanceof TList) { - $type = clone $type; - $type = new TCallableList($type->type_param); - $callable_types[] = $type; - $did_remove_type = true; - } elseif ($type instanceof TKeyedArray && count($type->properties) === 2) { - $type = clone $type; - $type = new TCallableKeyedArray($type->properties); - $callable_types[] = $type; - $did_remove_type = true; - } elseif ($type instanceof TTemplateParam) { - if ($type->as->hasCallableType() || $type->as->hasMixed()) { - $type = clone $type; - - $type->as = self::reconcileCallable( - $codebase, - $type->as, - null, - $negated, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - $did_remove_type = true; - - $callable_types[] = $type; - } else { - $did_remove_type = true; - } - } - - if ((!$callable_types || !$did_remove_type) && !$is_equality) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - 'callable', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - - if ($callable_types) { - return TypeCombiner::combine($callable_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileFalsyOrEmpty( - string $assertion, - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $recursive_check - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - $did_remove_type = $existing_var_type->possibly_undefined - || $existing_var_type->possibly_undefined_from_try; - - foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_key => $existing_var_type_part) { - //if any atomic in the union is either always truthy, we remove it. If not always falsy, we mark the check - //as not redundant. - if (!$existing_var_type->possibly_undefined - && !$existing_var_type->possibly_undefined_from_try - && $existing_var_type_part->isTruthy() - ) { - $did_remove_type = true; - $existing_var_type->removeType($existing_var_type_key); - } elseif (!$existing_var_type_part->isFalsy()) { - $did_remove_type = true; - } - } - - if ($did_remove_type && $existing_var_type->isUnionEmpty()) { - //every type was removed, this is an impossible assertion - if ($code_location && $key && !$recursive_check) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - $assertion, - false, - $negated, - $code_location, - $suppressed_issues - ); - } - - $failed_reconciliation = 2; - - return Type::getEmpty(); - } - - if (!$did_remove_type) { - //nothing was removed, this is a redundant assertion - if ($code_location && $key && !$recursive_check) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - - $failed_reconciliation = 1; - - return $existing_var_type; - } - - if ($existing_var_type->hasType('bool')) { - $existing_var_type->removeType('bool'); - $existing_var_type->addType(new TFalse()); - } - - if ($existing_var_type->hasArray()) { - $existing_var_type->removeType('array'); - $existing_var_type->addType(new TArray( - [ - new Union([new TEmpty()]), - new Union([new TEmpty()]), - ] - )); - } - - if ($existing_var_type->hasMixed()) { - $mixed_atomic_type = $existing_var_type->getAtomicTypes()['mixed']; - - if (get_class($mixed_atomic_type) === TMixed::class) { - $existing_var_type->removeType('mixed'); - $existing_var_type->addType(new TEmptyMixed()); - } - } - - if ($existing_var_type->hasScalar()) { - $scalar_atomic_type = $existing_var_type->getAtomicTypes()['scalar']; - - if (get_class($scalar_atomic_type) === TScalar::class) { - $existing_var_type->removeType('scalar'); - $existing_var_type->addType(new TEmptyScalar()); - } - } - - if ($existing_var_type->hasType('string')) { - $string_atomic_type = $existing_var_type->getAtomicTypes()['string']; - - 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')); - } elseif (get_class($string_atomic_type) === TNonEmptyString::class) { - $existing_var_type->removeType('string'); - $existing_var_type->addType(new TLiteralString('0')); - } elseif (get_class($string_atomic_type) === TNonEmptyLowercaseString::class) { - $existing_var_type->removeType('string'); - $existing_var_type->addType(new TLiteralString('0')); - } elseif (get_class($string_atomic_type) === TNonEmptyNonspecificLiteralString::class) { - $existing_var_type->removeType('string'); - $existing_var_type->addType(new TLiteralString('0')); - } - } - - if ($existing_var_type->hasInt()) { - $existing_range_types = $existing_var_type->getRangeInts(); - - if ($existing_range_types) { - foreach ($existing_range_types as $int_key => $literal_type) { - if ($literal_type->contains(0)) { - $existing_var_type->removeType($int_key); - $existing_var_type->addType(new TLiteralInt(0)); - } - } - } else { - $existing_var_type->removeType('int'); - $existing_var_type->addType(new TLiteralInt(0)); - } - } - - if ($existing_var_type->hasFloat()) { - $existing_var_type->removeType('float'); - $existing_var_type->addType(new TLiteralFloat(0.0)); - } - - if ($existing_var_type->hasNumeric()) { - $existing_var_type->removeType('numeric'); - $existing_var_type->addType(new TEmptyNumeric()); - } - - foreach ($existing_var_type->getAtomicTypes() as $type_key => $existing_var_atomic_type) { - if ($existing_var_atomic_type instanceof TTemplateParam) { - if (!$existing_var_atomic_type->as->isMixed()) { - $template_did_fail = 0; - - $existing_var_atomic_type = clone $existing_var_atomic_type; - - $existing_var_atomic_type->as = self::reconcileFalsyOrEmpty( - $assertion, - $existing_var_atomic_type->as, - $key, - $negated, - $code_location, - $suppressed_issues, - $template_did_fail, - $recursive_check - ); - - if (!$template_did_fail) { - $existing_var_type->removeType($type_key); - $existing_var_type->addType($existing_var_atomic_type); - } - } - } - } - - assert(!$existing_var_type->isUnionEmpty()); - return $existing_var_type; - } - - /** - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileClassConstant( - Codebase $codebase, - string $class_constant_expression, - Union $existing_type, - int &$failed_reconciliation - ): Union { - if (strpos($class_constant_expression, '::') === false) { - return $existing_type; - } - - [$class_name, $constant_pattern] = explode('::', $class_constant_expression, 2); - - $resolver = new ClassConstantByWildcardResolver($codebase); - $matched_class_constant_types = $resolver->resolve($class_name, $constant_pattern); - if ($matched_class_constant_types === null) { - return $existing_type; - } - - if ($matched_class_constant_types === []) { - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return Type::getMixed(); - } - - return TypeCombiner::combine($matched_class_constant_types, $codebase); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php deleted file mode 100644 index 02fac147..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php +++ /dev/null @@ -1,1819 +0,0 @@ -getId(); - - if ($assertion === 'isset') { - if ($existing_var_type->possibly_undefined) { - return Type::getEmpty(); - } - - if (!$existing_var_type->isNullable() - && $key - && strpos($key, '[') === false - && (!$existing_var_type->hasMixed() || $existing_var_type->isAlwaysTruthy()) - ) { - if ($code_location) { - if ($existing_var_type->from_static_property) { - IssueBuffer::maybeAdd( - new RedundantPropertyInitializationCheck( - 'Static property ' . $key . ' with type ' - . $existing_var_type - . ' has unexpected isset check — should it be nullable?', - $code_location - ), - $suppressed_issues - ); - } elseif ($existing_var_type->from_property) { - IssueBuffer::maybeAdd( - new RedundantPropertyInitializationCheck( - 'Property ' . $key . ' with type ' - . $existing_var_type . ' should already be set in the constructor', - $code_location - ), - $suppressed_issues - ); - } elseif ($existing_var_type->from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - 'Cannot resolve types for ' . $key . ' with docblock-defined type ' - . $existing_var_type . ' and !isset assertion', - $code_location, - null - ), - $suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new TypeDoesNotContainType( - 'Cannot resolve types for ' . $key . ' with type ' - . $existing_var_type . ' and !isset assertion', - $code_location, - null - ), - $suppressed_issues - ); - } - } - - return $existing_var_type->from_docblock - ? Type::getNull() - : Type::getEmpty(); - } - - return Type::getNull(); - } - - if ($assertion === 'array-key-exists') { - return Type::getEmpty(); - } - - if (strpos($assertion, 'in-array-') === 0) { - $assertion = substr($assertion, 9); - $new_var_type = Type::parseString($assertion); - - $intersection = Type::intersectUnionTypes( - $new_var_type, - $existing_var_type, - $codebase - ); - - if ($intersection === null) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $existing_var_type->getId(), - $key, - '!' . $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - } - - return $existing_var_type; - } - - if ($assertion === 'object' && !$existing_var_type->hasMixed()) { - return self::reconcileObject( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'scalar' && !$existing_var_type->hasMixed()) { - return self::reconcileScalar( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'resource' && !$existing_var_type->hasMixed()) { - return self::reconcileResource( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'bool' && !$existing_var_type->hasMixed()) { - return self::reconcileBool( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'numeric' && !$existing_var_type->hasMixed()) { - return self::reconcileNumeric( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'float' && !$existing_var_type->hasMixed()) { - return self::reconcileFloat( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'int' && !$existing_var_type->hasMixed()) { - return self::reconcileInt( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'string' && !$existing_var_type->hasMixed()) { - return self::reconcileString( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'array' && !$existing_var_type->hasMixed()) { - return self::reconcileArray( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'falsy' || $assertion === 'empty') { - return self::reconcileFalsyOrEmpty( - $assertion, - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - false - ); - } - - if ($assertion === 'null' && !$existing_var_type->hasMixed()) { - return self::reconcileNull( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'false' && !$existing_var_type->hasMixed()) { - return self::reconcileFalse( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - } - - if ($assertion === 'non-empty-countable') { - return self::reconcileNonEmptyCountable( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - null - ); - } - - if ($assertion === 'callable') { - return self::reconcileCallable( - $existing_var_type - ); - } - - if (strpos($assertion, 'has-at-least-') === 0) { - return self::reconcileNonEmptyCountable( - $existing_var_type, - $key, - $negated, - $code_location, - $suppressed_issues, - $failed_reconciliation, - $is_equality, - (int) substr($assertion, 13) - ); - } - - if (strpos($assertion, 'has-exactly-') === 0) { - return $existing_var_type; - } - - if ($assertion[0] === '>') { - return self::reconcileSuperiorTo( - $existing_var_type, - $assertion, - $inside_loop, - $old_var_type_string, - $key, - $negated, - $code_location, - $suppressed_issues - ); - } - - if ($assertion[0] === '<') { - return self::reconcileInferiorTo( - $existing_var_type, - $assertion, - $inside_loop, - $old_var_type_string, - $key, - $negated, - $code_location, - $suppressed_issues - ); - } - - return null; - } - - private static function reconcileCallable( - Union $existing_var_type - ): Union { - foreach ($existing_var_type->getAtomicTypes() as $atomic_key => $type) { - if ($type instanceof TLiteralString - && InternalCallMapHandler::inCallMap($type->value) - ) { - $existing_var_type->removeType($atomic_key); - } - - if ($type->isCallableType()) { - $existing_var_type->removeType($atomic_key); - } - } - - return $existing_var_type; - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileBool( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $non_bool_types = []; - $did_remove_type = false; - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - if (!$type->as->hasBool()) { - $non_bool_types[] = $type; - } - - $did_remove_type = true; - } elseif (!$type instanceof TBool - || ($is_equality && get_class($type) === TBool::class) - ) { - if ($type instanceof TScalar) { - $did_remove_type = true; - $non_bool_types[] = new TString(); - $non_bool_types[] = new TInt(); - $non_bool_types[] = new TFloat(); - } else { - $non_bool_types[] = $type; - } - } else { - $did_remove_type = true; - } - } - - if (!$did_remove_type || !$non_bool_types) { - if ($key && $code_location && !$is_equality) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!bool', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if ($non_bool_types) { - return new Union($non_bool_types); - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileNonEmptyCountable( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality, - ?int $min_count - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - if (isset($existing_var_atomic_types['array'])) { - $array_atomic_type = $existing_var_atomic_types['array']; - $did_remove_type = false; - - if (($array_atomic_type instanceof TNonEmptyArray - || $array_atomic_type instanceof TNonEmptyList) - && ($min_count === null - || $array_atomic_type->count >= $min_count) - ) { - $did_remove_type = true; - - $existing_var_type->removeType('array'); - } elseif ($array_atomic_type->getId() !== 'array') { - $did_remove_type = true; - - if (!$min_count) { - $existing_var_type->addType(new TArray( - [ - new Union([new TEmpty]), - new Union([new TEmpty]), - ] - )); - } - } elseif ($array_atomic_type instanceof TKeyedArray) { - $did_remove_type = true; - - foreach ($array_atomic_type->properties as $property_type) { - if (!$property_type->possibly_undefined) { - $did_remove_type = false; - break; - } - } - } - - if (!$is_equality - && !$existing_var_type->hasMixed() - && (!$did_remove_type || $existing_var_type->isUnionEmpty()) - ) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!non-empty-countable', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - } - } - - return $existing_var_type; - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileNull( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $did_remove_type = false; - - if ($existing_var_type->hasType('null')) { - $did_remove_type = true; - $existing_var_type->removeType('null'); - } - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - $type->as = self::reconcileNull( - $type->as, - null, - false, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - - $did_remove_type = true; - $existing_var_type->bustCache(); - } - } - - if (!$did_remove_type || $existing_var_type->isUnionEmpty()) { - if ($key && $code_location && !$is_equality) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!null', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if (!$existing_var_type->isUnionEmpty()) { - return $existing_var_type; - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileFalse( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $did_remove_type = $existing_var_type->hasScalar(); - - if ($existing_var_type->hasType('false')) { - $did_remove_type = true; - $existing_var_type->removeType('false'); - } - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - $type->as = self::reconcileFalse( - $type->as, - null, - false, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - - $did_remove_type = true; - $existing_var_type->bustCache(); - } - } - - if (!$did_remove_type || $existing_var_type->isUnionEmpty()) { - if ($key && $code_location && !$is_equality) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!false', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if (!$existing_var_type->isUnionEmpty()) { - return $existing_var_type; - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileFalsyOrEmpty( - string $assertion, - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $recursive_check - ): Union { - $old_var_type_string = $existing_var_type->getId(); - - //empty is used a lot to check for array offset existence, so we have to silent errors a lot - $is_empty_assertion = $assertion === 'empty'; - - $did_remove_type = $existing_var_type->possibly_undefined - || $existing_var_type->possibly_undefined_from_try; - - foreach ($existing_var_type->getAtomicTypes() as $existing_var_type_key => $existing_var_type_part) { - //if any atomic in the union is either always falsy, we remove it. If not always truthy, we mark the check - //as not redundant. - if ($existing_var_type_part->isFalsy()) { - $did_remove_type = true; - $existing_var_type->removeType($existing_var_type_key); - } elseif ($existing_var_type->possibly_undefined - || $existing_var_type->possibly_undefined_from_try - || !$existing_var_type_part->isTruthy() - ) { - $did_remove_type = true; - } - } - - if ($did_remove_type && $existing_var_type->isUnionEmpty()) { - //every type was removed, this is an impossible assertion - if ($code_location && $key && !$is_empty_assertion && !$recursive_check) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!' . $assertion, - false, - $negated, - $code_location, - $suppressed_issues - ); - } - - $failed_reconciliation = 2; - - return Type::getEmpty(); - } - - if (!$did_remove_type) { - if ($code_location && $key && !$is_empty_assertion && !$recursive_check) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!' . $assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - - $failed_reconciliation = 1; - - return $existing_var_type; - } - - $existing_var_type->possibly_undefined = false; - $existing_var_type->possibly_undefined_from_try = false; - - if ($existing_var_type->hasType('bool')) { - $existing_var_type->removeType('bool'); - $existing_var_type->addType(new TTrue()); - } - - if ($existing_var_type->hasArray()) { - $array_atomic_type = $existing_var_type->getAtomicTypes()['array']; - - if ($array_atomic_type instanceof TArray - && !$array_atomic_type instanceof TNonEmptyArray - ) { - $existing_var_type->removeType('array'); - $existing_var_type->addType( - new TNonEmptyArray( - $array_atomic_type->type_params - ) - ); - } elseif ($array_atomic_type instanceof TList - && !$array_atomic_type instanceof TNonEmptyList - ) { - $existing_var_type->removeType('array'); - $existing_var_type->addType( - new TNonEmptyList( - $array_atomic_type->type_param - ) - ); - } - } - - if ($existing_var_type->hasMixed()) { - $mixed_atomic_type = $existing_var_type->getAtomicTypes()['mixed']; - - if (get_class($mixed_atomic_type) === TMixed::class) { - $existing_var_type->removeType('mixed'); - $existing_var_type->addType(new TNonEmptyMixed()); - } - } - - if ($existing_var_type->hasScalar()) { - $scalar_atomic_type = $existing_var_type->getAtomicTypes()['scalar']; - - if (get_class($scalar_atomic_type) === TScalar::class) { - $existing_var_type->removeType('scalar'); - $existing_var_type->addType(new TNonEmptyScalar()); - } - } - - if ($existing_var_type->hasType('string')) { - $string_atomic_type = $existing_var_type->getAtomicTypes()['string']; - - if (get_class($string_atomic_type) === TString::class) { - $existing_var_type->removeType('string'); - $existing_var_type->addType(new TNonFalsyString()); - } elseif (get_class($string_atomic_type) === TLowercaseString::class) { - $existing_var_type->removeType('string'); - $existing_var_type->addType(new TNonEmptyLowercaseString()); - } elseif (get_class($string_atomic_type) === TNonspecificLiteralString::class) { - $existing_var_type->removeType('string'); - $existing_var_type->addType(new TNonEmptyNonspecificLiteralString()); - } elseif (get_class($string_atomic_type) === TNonEmptyString::class) { - $existing_var_type->removeType('string'); - $existing_var_type->addType(new TNonFalsyString()); - } - } - - if ($existing_var_type->hasInt()) { - $existing_range_types = $existing_var_type->getRangeInts(); - - if ($existing_range_types) { - foreach ($existing_range_types as $int_key => $literal_type) { - if ($literal_type->contains(0)) { - $existing_var_type->removeType($int_key); - if ($literal_type->min_bound === null || $literal_type->min_bound <= -1) { - $existing_var_type->addType(new TIntRange($literal_type->min_bound, -1)); - } - if ($literal_type->max_bound === null || $literal_type->max_bound >= 1) { - $existing_var_type->addType(new TIntRange(1, $literal_type->max_bound)); - } - } - } - } - - if ($existing_var_type->isSingle()) { - return $existing_var_type; - } - } - - foreach ($existing_var_type->getAtomicTypes() as $type_key => $existing_var_atomic_type) { - if ($existing_var_atomic_type instanceof TTemplateParam) { - if (!$existing_var_atomic_type->as->isMixed()) { - $template_did_fail = 0; - - $existing_var_atomic_type = clone $existing_var_atomic_type; - - $existing_var_atomic_type->as = self::reconcileFalsyOrEmpty( - $assertion, - $existing_var_atomic_type->as, - $key, - $negated, - $code_location, - $suppressed_issues, - $template_did_fail, - true - ); - - if (!$template_did_fail) { - $existing_var_type->removeType($type_key); - $existing_var_type->addType($existing_var_atomic_type); - } - } - } - } - - assert(!$existing_var_type->isUnionEmpty()); - return $existing_var_type; - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileScalar( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $non_scalar_types = []; - $did_remove_type = false; - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - if (!$is_equality && !$type->as->isMixed()) { - $template_did_fail = 0; - - $type = clone $type; - - $type->as = self::reconcileScalar( - $type->as, - null, - false, - null, - $suppressed_issues, - $template_did_fail, - $is_equality - ); - - $did_remove_type = true; - - if (!$template_did_fail) { - $non_scalar_types[] = $type; - } - } else { - $did_remove_type = true; - $non_scalar_types[] = $type; - } - } elseif (!($type instanceof Scalar)) { - $non_scalar_types[] = $type; - } else { - $did_remove_type = true; - - if ($is_equality) { - $non_scalar_types[] = $type; - } - } - } - - if (!$did_remove_type || !$non_scalar_types) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!scalar', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if ($non_scalar_types) { - $type = new Union($non_scalar_types); - $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; - $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; - $type->from_docblock = $existing_var_type->from_docblock; - return $type; - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileObject( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $non_object_types = []; - $did_remove_type = false; - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - if (!$is_equality && !$type->as->isMixed()) { - $template_did_fail = 0; - - $type = clone $type; - - $type->as = self::reconcileObject( - $type->as, - null, - false, - null, - $suppressed_issues, - $template_did_fail, - $is_equality - ); - - $did_remove_type = true; - - if (!$template_did_fail) { - $non_object_types[] = $type; - } - } else { - $did_remove_type = true; - $non_object_types[] = $type; - } - } elseif ($type instanceof TCallable) { - $non_object_types[] = new TCallableArray([ - Type::getArrayKey(), - Type::getMixed() - ]); - $non_object_types[] = new TCallableString(); - $did_remove_type = true; - } elseif ($type instanceof TIterable) { - $clone_type = clone $type; - - self::refineArrayKey($clone_type->type_params[0]); - - $non_object_types[] = new TArray($clone_type->type_params); - - $did_remove_type = true; - } elseif (!$type->isObjectType()) { - $non_object_types[] = $type; - } else { - $did_remove_type = true; - - if ($is_equality) { - $non_object_types[] = $type; - } - } - } - - if (!$non_object_types || !$did_remove_type) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!object', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if ($non_object_types) { - $type = new Union($non_object_types); - $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; - $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; - $type->from_docblock = $existing_var_type->from_docblock; - return $type; - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileNumeric( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $non_numeric_types = []; - $did_remove_type = $existing_var_type->hasString() - || $existing_var_type->hasScalar(); - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - if (!$is_equality && !$type->as->isMixed()) { - $template_did_fail = 0; - - $type = clone $type; - - $type->as = self::reconcileNumeric( - $type->as, - null, - false, - null, - $suppressed_issues, - $template_did_fail, - $is_equality - ); - - $did_remove_type = true; - - if (!$template_did_fail) { - $non_numeric_types[] = $type; - } - } else { - $did_remove_type = true; - $non_numeric_types[] = $type; - } - } elseif ($type instanceof TArrayKey) { - $did_remove_type = true; - $non_numeric_types[] = new TString(); - } elseif (!$type->isNumericType()) { - $non_numeric_types[] = $type; - } else { - $did_remove_type = true; - - if ($is_equality) { - $non_numeric_types[] = $type; - } - } - } - - if (!$non_numeric_types || !$did_remove_type) { - if ($key && $code_location && !$is_equality) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!numeric', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if ($non_numeric_types) { - $type = new Union($non_numeric_types); - $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; - $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; - $type->from_docblock = $existing_var_type->from_docblock; - return $type; - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileInt( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $non_int_types = []; - $did_remove_type = false; - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - if (!$is_equality && !$type->as->isMixed()) { - $template_did_fail = 0; - - $type = clone $type; - - $type->as = self::reconcileInt( - $type->as, - null, - false, - null, - $suppressed_issues, - $template_did_fail, - $is_equality - ); - - $did_remove_type = true; - - if (!$template_did_fail) { - $non_int_types[] = $type; - } - } else { - $did_remove_type = true; - $non_int_types[] = $type; - } - } elseif ($type instanceof TArrayKey) { - $did_remove_type = true; - $non_int_types[] = new TString(); - } elseif ($type instanceof TScalar) { - $did_remove_type = true; - $non_int_types[] = new TString(); - $non_int_types[] = new TFloat(); - $non_int_types[] = new TBool(); - } elseif ($type instanceof TInt) { - $did_remove_type = true; - - if ($is_equality) { - $non_int_types[] = $type; - } elseif ($existing_var_type->from_calculation) { - $non_int_types[] = new TFloat(); - } - } elseif ($type instanceof TNumeric) { - $did_remove_type = true; - $non_int_types[] = new TString(); - $non_int_types[] = new TFloat(); - } else { - $non_int_types[] = $type; - } - } - - if (!$non_int_types || !$did_remove_type) { - if ($key && $code_location && !$is_equality) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!int', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if ($non_int_types) { - $type = new Union($non_int_types); - $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; - $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; - $type->from_docblock = $existing_var_type->from_docblock; - return $type; - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileFloat( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $non_float_types = []; - $did_remove_type = false; - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - if (!$is_equality && !$type->as->isMixed()) { - $template_did_fail = 0; - - $type = clone $type; - - $type->as = self::reconcileFloat( - $type->as, - null, - false, - null, - $suppressed_issues, - $template_did_fail, - $is_equality - ); - - $did_remove_type = true; - - if (!$template_did_fail) { - $non_float_types[] = $type; - } - } else { - $did_remove_type = true; - $non_float_types[] = $type; - } - } elseif ($type instanceof TScalar) { - $did_remove_type = true; - $non_float_types[] = new TString(); - $non_float_types[] = new TInt(); - $non_float_types[] = new TBool(); - } elseif ($type instanceof TFloat) { - $did_remove_type = true; - - if ($is_equality) { - $non_float_types[] = $type; - } - } elseif ($type instanceof TNumeric) { - $did_remove_type = true; - $non_float_types[] = new TString(); - $non_float_types[] = new TInt(); - } else { - $non_float_types[] = $type; - } - } - - if (!$non_float_types || !$did_remove_type) { - if ($key && $code_location && !$is_equality) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!float', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if ($non_float_types) { - $type = new Union($non_float_types); - $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; - $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; - $type->from_docblock = $existing_var_type->from_docblock; - return $type; - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileString( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $non_string_types = []; - $did_remove_type = $existing_var_type->hasScalar(); - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - if (!$is_equality && !$type->as->isMixed()) { - $template_did_fail = 0; - - $type = clone $type; - - $type->as = self::reconcileString( - $type->as, - null, - false, - null, - $suppressed_issues, - $template_did_fail, - $is_equality - ); - - $did_remove_type = true; - - if (!$template_did_fail) { - $non_string_types[] = $type; - } - } else { - $did_remove_type = true; - $non_string_types[] = $type; - } - } elseif ($type instanceof TArrayKey) { - $non_string_types[] = new TInt(); - $did_remove_type = true; - } elseif ($type instanceof TCallable) { - $non_string_types[] = new TCallableArray([ - Type::getArrayKey(), - Type::getMixed() - ]); - $non_string_types[] = new TCallableObject(); - $did_remove_type = true; - } elseif ($type instanceof TNumeric) { - $non_string_types[] = $type; - $did_remove_type = true; - } elseif ($type instanceof TScalar) { - $did_remove_type = true; - $non_string_types[] = new TFloat(); - $non_string_types[] = new TInt(); - $non_string_types[] = new TBool(); - } elseif (!$type instanceof TString) { - $non_string_types[] = $type; - } else { - $did_remove_type = true; - - if ($is_equality) { - $non_string_types[] = $type; - } - } - } - - if (!$non_string_types || !$did_remove_type) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!string', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if ($non_string_types) { - $type = new Union($non_string_types); - $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; - $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; - $type->from_docblock = $existing_var_type->from_docblock; - return $type; - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileArray( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $non_array_types = []; - $did_remove_type = $existing_var_type->hasScalar(); - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - if (!$is_equality && !$type->as->isMixed()) { - $template_did_fail = 0; - - $type = clone $type; - - $type->as = self::reconcileArray( - $type->as, - null, - false, - null, - $suppressed_issues, - $template_did_fail, - $is_equality - ); - - $did_remove_type = true; - - if (!$template_did_fail) { - $non_array_types[] = $type; - } - } else { - $did_remove_type = true; - $non_array_types[] = $type; - } - } elseif ($type instanceof TCallable) { - $non_array_types[] = new TCallableString(); - $non_array_types[] = new TCallableObject(); - $did_remove_type = true; - } elseif ($type instanceof TIterable) { - if (!$type->type_params[0]->isMixed() || !$type->type_params[1]->isMixed()) { - $non_array_types[] = new TGenericObject('Traversable', $type->type_params); - } else { - $non_array_types[] = new TNamedObject('Traversable'); - } - - $did_remove_type = true; - } elseif (!$type instanceof TArray - && !$type instanceof TKeyedArray - && !$type instanceof TList - ) { - $non_array_types[] = $type; - } else { - $did_remove_type = true; - - if ($is_equality) { - $non_array_types[] = $type; - } - } - } - - if ((!$non_array_types || !$did_remove_type)) { - if ($key && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!array', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if ($non_array_types) { - $type = new Union($non_array_types); - $type->ignore_falsable_issues = $existing_var_type->ignore_falsable_issues; - $type->ignore_nullable_issues = $existing_var_type->ignore_nullable_issues; - $type->from_docblock = $existing_var_type->from_docblock; - return $type; - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * @param Reconciler::RECONCILIATION_* $failed_reconciliation - */ - private static function reconcileResource( - Union $existing_var_type, - ?string $key, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues, - int &$failed_reconciliation, - bool $is_equality - ): Union { - $old_var_type_string = $existing_var_type->getId(); - $did_remove_type = false; - - if ($existing_var_type->hasType('resource')) { - $did_remove_type = true; - $existing_var_type->removeType('resource'); - } - - foreach ($existing_var_type->getAtomicTypes() as $type) { - if ($type instanceof TTemplateParam) { - $type->as = self::reconcileResource( - $type->as, - null, - false, - null, - $suppressed_issues, - $failed_reconciliation, - $is_equality - ); - - $did_remove_type = true; - $existing_var_type->bustCache(); - } - } - - if (!$did_remove_type || $existing_var_type->isUnionEmpty()) { - if ($key && $code_location && !$is_equality) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $key, - '!resource', - !$did_remove_type, - $negated, - $code_location, - $suppressed_issues - ); - } - - if (!$did_remove_type) { - $failed_reconciliation = Reconciler::RECONCILIATION_REDUNDANT; - } - } - - if (!$existing_var_type->isUnionEmpty()) { - return $existing_var_type; - } - - $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - */ - private static function reconcileSuperiorTo( - Union $existing_var_type, - string $assertion, - bool $inside_loop, - string $old_var_type_string, - ?string $var_id, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues - ): Union { - $assertion_value = (int)substr($assertion, 1) - 1; - - $did_remove_type = false; - - foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { - if ($inside_loop) { - continue; - } - - if ($atomic_type instanceof TIntRange) { - if ($atomic_type->contains($assertion_value)) { - // if the range contains the assertion, the range must be adapted - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - if ($atomic_type->max_bound === null) { - $atomic_type->max_bound = $assertion_value; - } else { - $atomic_type->max_bound = TIntRange::getNewLowestBound( - $assertion_value, - $atomic_type->max_bound - ); - } - $existing_var_type->addType($atomic_type); - } elseif ($atomic_type->isLesserThan($assertion_value)) { - // if the range is lesser than the assertion, the check is redundant - } elseif ($atomic_type->isGreaterThan($assertion_value)) { - // if the range is greater than the assertion, the type must be removed - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - } - } elseif ($atomic_type instanceof TLiteralInt) { - if ($atomic_type->value > $assertion_value) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - } /*elseif ($inside_loop) { - //when inside a loop, allow the range to extends the type - $existing_var_type->removeType($atomic_type->getKey()); - if ($atomic_type->value < $assertion_value) { - $existing_var_type->addType(new TIntRange($atomic_type->value, $assertion_value)); - } else { - $existing_var_type->addType(new TIntRange($assertion_value, $atomic_type->value)); - } - }*/ - } elseif ($atomic_type instanceof TPositiveInt) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - if ($assertion_value >= 1) { - $existing_var_type->addType(new TIntRange(1, $assertion_value)); - } - } elseif ($atomic_type instanceof TInt) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - $existing_var_type->addType(new TIntRange(null, $assertion_value)); - } else { - // we assume that other types may have been removed (empty strings? numeric strings?) - //It may be worth refining to improve reconciliation while keeping in mind we're on loose comparison - $did_remove_type = true; - } - } - - if (!$inside_loop && !$did_remove_type && $var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - '!'.$assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - - if ($existing_var_type->isUnionEmpty()) { - if ($var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - '!'.$assertion, - false, - $negated, - $code_location, - $suppressed_issues - ); - } - $existing_var_type->addType(new TNever()); - } - - return $existing_var_type; - } - - /** - * @param string[] $suppressed_issues - */ - private static function reconcileInferiorTo( - Union $existing_var_type, - string $assertion, - bool $inside_loop, - string $old_var_type_string, - ?string $var_id, - bool $negated, - ?CodeLocation $code_location, - array $suppressed_issues - ): Union { - $assertion_value = (int)substr($assertion, 1) + 1; - - $did_remove_type = false; - - foreach ($existing_var_type->getAtomicTypes() as $atomic_type) { - if ($inside_loop) { - continue; - } - - if ($atomic_type instanceof TIntRange) { - if ($atomic_type->contains($assertion_value)) { - // if the range contains the assertion, the range must be adapted - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - if ($atomic_type->min_bound === null) { - $atomic_type->min_bound = $assertion_value; - } else { - $atomic_type->min_bound = max($atomic_type->min_bound, $assertion_value); - } - $existing_var_type->addType($atomic_type); - } elseif ($atomic_type->isLesserThan($assertion_value)) { - // if the range is lesser than the assertion, the type must be removed - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - } elseif ($atomic_type->isGreaterThan($assertion_value)) { - // if the range is greater than the assertion, the check is redundant - } - } elseif ($atomic_type instanceof TLiteralInt) { - if ($atomic_type->value < $assertion_value) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - } /* elseif ($inside_loop) { - //when inside a loop, allow the range to extends the type - $existing_var_type->removeType($atomic_type->getKey()); - if ($atomic_type->value < $assertion_value) { - $existing_var_type->addType(new TIntRange($atomic_type->value, $assertion_value)); - } else { - $existing_var_type->addType(new TIntRange($assertion_value, $atomic_type->value)); - } - }*/ - } elseif ($atomic_type instanceof TPositiveInt) { - if ($assertion_value > 1) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - $existing_var_type->addType(new TIntRange($assertion_value, null)); - } - } elseif ($atomic_type instanceof TInt) { - $did_remove_type = true; - $existing_var_type->removeType($atomic_type->getKey()); - $existing_var_type->addType(new TIntRange($assertion_value, null)); - } else { - // we assume that other types may have been removed (empty strings? numeric strings?) - //It may be worth refining to improve reconciliation while keeping in mind we're on loose comparison - $did_remove_type = true; - } - } - - if (!$inside_loop && !$did_remove_type && $var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - '!'.$assertion, - true, - $negated, - $code_location, - $suppressed_issues - ); - } - - if ($existing_var_type->isUnionEmpty()) { - if ($var_id && $code_location) { - self::triggerIssueForImpossible( - $existing_var_type, - $old_var_type_string, - $var_id, - '!'.$assertion, - false, - $negated, - $code_location, - $suppressed_issues - ); - } - $existing_var_type->addType(new TNever()); - } - - return $existing_var_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php deleted file mode 100644 index da8da461..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php +++ /dev/null @@ -1,52 +0,0 @@ ->> the type T appears at three different depths. - * - * The shallowest-appearance of the template takes prominence when inferring the type of T. - * - * @var int - */ - public $appearance_depth; - - /** - * The argument offset where this template was set - * - * In the type Foo the type appears at argument offsets 0 and 2 - * - * @var ?int - */ - public $arg_offset; - - /** - * When non-null, indicates an equality template bound (vs a lower or upper bound) - * - * @var ?string - */ - public $equality_bound_classlike; - - public function __construct( - Union $type, - int $appearance_depth = 0, - ?int $arg_offset = null, - ?string $equality_bound_classlike = null - ) { - $this->type = $type; - $this->appearance_depth = $appearance_depth; - $this->arg_offset = $arg_offset; - $this->equality_bound_classlike = $equality_bound_classlike; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php deleted file mode 100644 index d0aff71b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php +++ /dev/null @@ -1,416 +0,0 @@ -lower_bounds ?: []; - - foreach ($union->getAtomicTypes() as $key => $atomic_type) { - $atomic_type->replaceTemplateTypesWithArgTypes($template_result, $codebase); - - if ($atomic_type instanceof TTemplateParam) { - $template_type = null; - - $traversed_type = TemplateStandinTypeReplacer::getRootTemplateType( - $inferred_lower_bounds, - $atomic_type->param_name, - $atomic_type->defining_class, - [], - $codebase - ); - - if ($traversed_type) { - $template_type = $traversed_type; - - if (!$atomic_type->as->isMixed() && $template_type->isMixed()) { - $template_type = clone $atomic_type->as; - } else { - $template_type = clone $template_type; - } - - if ($atomic_type->extra_types) { - foreach ($template_type->getAtomicTypes() as $template_type_key => $atomic_template_type) { - if ($atomic_template_type instanceof TNamedObject - || $atomic_template_type instanceof TTemplateParam - || $atomic_template_type instanceof TIterable - || $atomic_template_type instanceof TObjectWithProperties - ) { - $atomic_template_type->extra_types = array_merge( - $atomic_type->extra_types, - $atomic_template_type->extra_types ?: [] - ); - } elseif ($atomic_template_type instanceof TObject) { - $first_atomic_type = array_shift($atomic_type->extra_types); - - if ($atomic_type->extra_types) { - $first_atomic_type->extra_types = $atomic_type->extra_types; - } - - $template_type->removeType($template_type_key); - $template_type->addType($first_atomic_type); - } - } - } - } elseif ($codebase) { - foreach ($inferred_lower_bounds as $template_type_map) { - foreach ($template_type_map as $template_class => $_) { - if (strpos($template_class, 'fn-') === 0) { - continue; - } - - try { - $classlike_storage = $codebase->classlike_storage_provider->get($template_class); - - if ($classlike_storage->template_extended_params) { - $defining_class = $atomic_type->defining_class; - - if (isset($classlike_storage->template_extended_params[$defining_class])) { - $param_map = $classlike_storage->template_extended_params[$defining_class]; - - if (isset($param_map[$key]) - && isset($inferred_lower_bounds[(string) $param_map[$key]][$template_class]) - ) { - $template_name = (string) $param_map[$key]; - - $template_type - = clone TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $inferred_lower_bounds[$template_name][$template_class], - $codebase - ); - } - } - } - } catch (InvalidArgumentException $e) { - } - } - } - } - - if ($template_type) { - $keys_to_unset[] = $key; - - foreach ($template_type->getAtomicTypes() as $template_type_part) { - if ($template_type_part instanceof TMixed) { - $is_mixed = true; - } - - $new_types[] = $template_type_part; - } - } - } elseif ($atomic_type instanceof TTemplateParamClass) { - $template_type = isset($inferred_lower_bounds[$atomic_type->param_name][$atomic_type->defining_class]) - ? clone TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $inferred_lower_bounds[$atomic_type->param_name][$atomic_type->defining_class], - $codebase - ) - : null; - - $class_template_type = null; - - if ($template_type) { - foreach ($template_type->getAtomicTypes() as $template_type_part) { - if ($template_type_part instanceof TMixed - || $template_type_part instanceof TObject - ) { - $class_template_type = new TClassString(); - } elseif ($template_type_part instanceof TNamedObject) { - $class_template_type = new TClassString( - $template_type_part->value, - $template_type_part - ); - } elseif ($template_type_part instanceof TTemplateParam) { - $first_atomic_type = $template_type_part->as->getSingleAtomic(); - - $class_template_type = new TTemplateParamClass( - $template_type_part->param_name, - $template_type_part->as->getId(), - $first_atomic_type instanceof TNamedObject ? $first_atomic_type : null, - $template_type_part->defining_class - ); - } - } - } - - if ($class_template_type) { - $keys_to_unset[] = $key; - $new_types[] = $class_template_type; - } - } elseif ($atomic_type instanceof TTemplateIndexedAccess) { - $keys_to_unset[] = $key; - - $template_type = null; - - if (isset($inferred_lower_bounds[$atomic_type->array_param_name][$atomic_type->defining_class]) - && !empty($inferred_lower_bounds[$atomic_type->offset_param_name]) - ) { - $array_template_type - = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $inferred_lower_bounds[$atomic_type->array_param_name][$atomic_type->defining_class], - $codebase - ); - - $offset_template_type - = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - array_values($inferred_lower_bounds[$atomic_type->offset_param_name])[0], - $codebase - ); - - if ($array_template_type->isSingle() - && $offset_template_type->isSingle() - && !$array_template_type->isMixed() - && !$offset_template_type->isMixed() - ) { - $array_template_type = $array_template_type->getSingleAtomic(); - $offset_template_type = $offset_template_type->getSingleAtomic(); - - if ($array_template_type instanceof TKeyedArray - && ($offset_template_type instanceof TLiteralString - || $offset_template_type instanceof TLiteralInt) - && isset($array_template_type->properties[$offset_template_type->value]) - ) { - $template_type = clone $array_template_type->properties[$offset_template_type->value]; - } - } - } - - if ($template_type) { - foreach ($template_type->getAtomicTypes() as $template_type_part) { - if ($template_type_part instanceof TMixed) { - $is_mixed = true; - } - - $new_types[] = $template_type_part; - } - } else { - $new_types[] = new TMixed(); - } - } elseif ($atomic_type instanceof TConditional - && $codebase - ) { - $template_type = isset($inferred_lower_bounds[$atomic_type->param_name][$atomic_type->defining_class]) - ? clone TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $inferred_lower_bounds[$atomic_type->param_name][$atomic_type->defining_class], - $codebase - ) - : null; - - $if_template_type = null; - $else_template_type = null; - - $atomic_type = clone $atomic_type; - - if ($template_type) { - self::replace( - $atomic_type->as_type, - $template_result, - $codebase - ); - - if ($atomic_type->as_type->isNullable() && $template_type->isVoid()) { - $template_type = Type::getNull(); - } - - $matching_if_types = []; - $matching_else_types = []; - - foreach ($template_type->getAtomicTypes() as $candidate_atomic_type) { - if (UnionTypeComparator::isContainedBy( - $codebase, - new Union([$candidate_atomic_type]), - $atomic_type->conditional_type, - false, - false, - null, - false, - false - ) - && (!$candidate_atomic_type instanceof TInt - || $atomic_type->conditional_type->getId() !== 'float') - ) { - $matching_if_types[] = $candidate_atomic_type; - } elseif (!UnionTypeComparator::isContainedBy( - $codebase, - $atomic_type->conditional_type, - new Union([$candidate_atomic_type]), - false, - false, - null, - false, - false - )) { - $matching_else_types[] = $candidate_atomic_type; - } - } - - $if_candidate_type = $matching_if_types ? new Union($matching_if_types) : null; - $else_candidate_type = $matching_else_types ? new Union($matching_else_types) : null; - - if ($if_candidate_type - && UnionTypeComparator::isContainedBy( - $codebase, - $if_candidate_type, - $atomic_type->conditional_type, - false, - false, - null, - false, - false - ) - ) { - $if_template_type = clone $atomic_type->if_type; - - $refined_template_result = clone $template_result; - - $refined_template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class] - = [ - new TemplateBound( - $if_candidate_type - ) - ]; - - self::replace( - $if_template_type, - $refined_template_result, - $codebase - ); - } - - if ($else_candidate_type - && UnionTypeComparator::isContainedBy( - $codebase, - $else_candidate_type, - $atomic_type->as_type, - false, - false, - null, - false, - false - ) - ) { - $else_template_type = clone $atomic_type->else_type; - - $refined_template_result = clone $template_result; - - $refined_template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class] - = [ - new TemplateBound( - $else_candidate_type - ) - ]; - - self::replace( - $else_template_type, - $refined_template_result, - $codebase - ); - } - } - - if (!$if_template_type && !$else_template_type) { - self::replace( - $atomic_type->if_type, - $template_result, - $codebase - ); - - self::replace( - $atomic_type->else_type, - $template_result, - $codebase - ); - - $class_template_type = Type::combineUnionTypes( - $atomic_type->if_type, - $atomic_type->else_type, - $codebase - ); - } else { - $class_template_type = Type::combineUnionTypes( - $if_template_type, - $else_template_type, - $codebase - ); - } - - $keys_to_unset[] = $key; - - foreach ($class_template_type->getAtomicTypes() as $class_template_atomic_type) { - $new_types[] = $class_template_atomic_type; - } - } - } - - $union->bustCache(); - - if ($is_mixed) { - if (!$new_types) { - throw new UnexpectedValueException('This array should be full'); - } - - $union->replaceTypes( - TypeCombiner::combine( - $new_types, - $codebase - )->getAtomicTypes() - ); - - return; - } - - foreach ($keys_to_unset as $key) { - $union->removeType($key); - } - - $atomic_types = array_values(array_merge($union->getAtomicTypes(), $new_types)); - - $union->replaceTypes( - TypeCombiner::combine( - $atomic_types, - $codebase - )->getAtomicTypes() - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php deleted file mode 100644 index c213eb59..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php +++ /dev/null @@ -1,73 +0,0 @@ -> - */ - public $template_types; - - /** - * @var array>> - */ - public $lower_bounds; - - /** - * @var array> - */ - public $upper_bounds = []; - - /** - * If set to true then we shouldn't update the template bounds - * - * @var bool - */ - public $readonly = false; - - /** - * @var list - */ - public $upper_bounds_unintersectable_types = []; - - /** - * @param array> $template_types - * @param array> $lower_bounds - */ - public function __construct(array $template_types, array $lower_bounds) - { - $this->template_types = $template_types; - - $this->lower_bounds = array_map( - function ($type_map) { - return array_map( - function ($type) { - return [new TemplateBound($type)]; - }, - $type_map - ); - }, - $lower_bounds - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php deleted file mode 100644 index 7d6dbf6c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php +++ /dev/null @@ -1,1249 +0,0 @@ -getAtomicTypes(); - - // here we want to subtract atomic types from the input type - // when they're also in the union type, so those shared atomic - // types will never be inferred as part of the generic type - if ($input_type && !$input_type->isSingle()) { - $new_input_type = clone $input_type; - - foreach ($original_atomic_types as $key => $_) { - if ($new_input_type->hasType($key)) { - $new_input_type->removeType($key); - } - } - - if (!$new_input_type->isUnionEmpty()) { - $input_type = $new_input_type; - } - } - - $had_template = false; - - foreach ($original_atomic_types as $key => $atomic_type) { - $atomic_types = array_merge( - $atomic_types, - self::handleAtomicStandin( - $atomic_type, - $key, - $template_result, - $codebase, - $statements_analyzer, - $input_type, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - $bound_equality_classlike, - $depth, - count($original_atomic_types) === 1, - $had_template - ) - ); - } - - if ($replace) { - if (array_values($original_atomic_types) === $atomic_types) { - return $union_type; - } - - if (!$atomic_types) { - return $union_type; - } - - if (count($atomic_types) > 1) { - $new_union_type = TypeCombiner::combine( - $atomic_types, - $codebase - ); - } else { - $new_union_type = new Union($atomic_types); - } - - $new_union_type->ignore_nullable_issues = $union_type->ignore_nullable_issues; - $new_union_type->ignore_falsable_issues = $union_type->ignore_falsable_issues; - $new_union_type->possibly_undefined = $union_type->possibly_undefined; - - if ($had_template) { - $new_union_type->had_template = true; - } - - return $new_union_type; - } - - return $union_type; - } - - /** - * @return list - */ - private static function handleAtomicStandin( - Atomic $atomic_type, - string $key, - TemplateResult $template_result, - ?Codebase $codebase, - ?StatementsAnalyzer $statements_analyzer, - ?Union $input_type, - ?int $input_arg_offset, - ?string $calling_class, - ?string $calling_function, - bool $replace, - bool $add_lower_bound, - ?string $bound_equality_classlike, - int $depth, - bool $was_single, - bool &$had_template - ): array { - if ($bracket_pos = strpos($key, '<')) { - $key = substr($key, 0, $bracket_pos); - } - - if ($atomic_type instanceof TTemplateParam - && isset($template_result->template_types[$atomic_type->param_name][$atomic_type->defining_class]) - ) { - return self::handleTemplateParamStandin( - $atomic_type, - $key, - $input_type, - $input_arg_offset, - $calling_class, - $calling_function, - $template_result, - $codebase, - $statements_analyzer, - $replace, - $add_lower_bound, - $bound_equality_classlike, - $depth, - $had_template - ); - } - - if ($atomic_type instanceof TTemplateParamClass - && isset($template_result->template_types[$atomic_type->param_name][$atomic_type->defining_class]) - ) { - if ($replace) { - return self::handleTemplateParamClassStandin( - $atomic_type, - $input_type, - $input_arg_offset, - $calling_class, - $calling_function, - $template_result, - $codebase, - $statements_analyzer, - true, - $add_lower_bound, - $bound_equality_classlike, - $depth, - $was_single, - $had_template - ); - } - } - - if ($atomic_type instanceof TTemplateIndexedAccess) { - if ($replace) { - $atomic_types = []; - - $include_first = true; - - if (isset($template_result->template_types[$atomic_type->array_param_name][$atomic_type->defining_class]) - && !empty($template_result->lower_bounds[$atomic_type->offset_param_name]) - ) { - $array_template_type - = $template_result->template_types[$atomic_type->array_param_name][$atomic_type->defining_class]; - $offset_template_type - = self::getMostSpecificTypeFromBounds( - array_values($template_result->lower_bounds[$atomic_type->offset_param_name])[0], - $codebase - ); - - if ($array_template_type->isSingle() - && $offset_template_type->isSingle() - && !$array_template_type->isMixed() - && !$offset_template_type->isMixed() - ) { - $array_template_type = $array_template_type->getSingleAtomic(); - $offset_template_type = $offset_template_type->getSingleAtomic(); - - if ($array_template_type instanceof TKeyedArray - && ($offset_template_type instanceof TLiteralString - || $offset_template_type instanceof TLiteralInt) - && isset($array_template_type->properties[$offset_template_type->value]) - ) { - $include_first = false; - - $replacement_type - = clone $array_template_type->properties[$offset_template_type->value]; - - foreach ($replacement_type->getAtomicTypes() as $replacement_atomic_type) { - $atomic_types[] = $replacement_atomic_type; - } - } - } - } - - if ($include_first) { - $atomic_types[] = $atomic_type; - } - - return $atomic_types; - } - - return [$atomic_type]; - } - - if ($atomic_type instanceof TTemplateKeyOf) { - if ($replace) { - $atomic_types = []; - - $include_first = true; - - if (isset($template_result->template_types[$atomic_type->param_name][$atomic_type->defining_class])) { - $template_type - = $template_result->template_types[$atomic_type->param_name][$atomic_type->defining_class]; - - if ($template_type->isSingle()) { - $template_type = $template_type->getSingleAtomic(); - - if ($template_type instanceof TKeyedArray - || $template_type instanceof TArray - || $template_type instanceof TList - ) { - if ($template_type instanceof TKeyedArray) { - $key_type = $template_type->getGenericKeyType(); - } elseif ($template_type instanceof TList) { - $key_type = Type::getInt(); - } else { - $key_type = clone $template_type->type_params[0]; - } - - $include_first = false; - - foreach ($key_type->getAtomicTypes() as $key_atomic_type) { - $atomic_types[] = $key_atomic_type; - } - } - } - } - - if ($include_first) { - $atomic_types[] = $atomic_type; - } - - return $atomic_types; - } - - return [$atomic_type]; - } - - $matching_atomic_types = []; - - if ($input_type && $codebase && !$input_type->hasMixed()) { - $matching_atomic_types = self::findMatchingAtomicTypesForTemplate( - $atomic_type, - $key, - $codebase, - $statements_analyzer, - $input_type - ); - } - - if (!$matching_atomic_types) { - $atomic_type = $atomic_type->replaceTemplateTypesWithStandins( - $template_result, - $codebase, - $statements_analyzer, - null, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - $depth + 1 - ); - - return [$atomic_type]; - } - - $atomic_types = []; - - foreach ($matching_atomic_types as $matching_atomic_type) { - $atomic_types[] = $atomic_type->replaceTemplateTypesWithStandins( - $template_result, - $codebase, - $statements_analyzer, - $matching_atomic_type, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - $depth + 1 - ); - } - - return $atomic_types; - } - - /** - * This method attempts to find bits of the input type (normally the argument type of a method call) - * that match the base type (normally the param type of the method). These matches are used to infer - * more template types - * - * Example: when passing `array` to a function that expects `array`, a rule in this method - * identifies the matching atomic types for `T` as `string|int` - * - * @return list - */ - private static function findMatchingAtomicTypesForTemplate( - Atomic $base_type, - string $key, - Codebase $codebase, - ?StatementsAnalyzer $statements_analyzer, - Union $input_type - ): array { - $matching_atomic_types = []; - - foreach ($input_type->getAtomicTypes() as $input_key => $atomic_input_type) { - if ($bracket_pos = strpos($input_key, '<')) { - $input_key = substr($input_key, 0, $bracket_pos); - } - - if ($input_key === $key) { - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - - if ($atomic_input_type instanceof TClosure && $base_type instanceof TClosure) { - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - - if ($atomic_input_type instanceof TCallable - && $base_type instanceof TCallable - ) { - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - - if ($atomic_input_type instanceof TClosure && $base_type instanceof TCallable) { - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - - if (($atomic_input_type instanceof TArray - || $atomic_input_type instanceof TKeyedArray - || $atomic_input_type instanceof TList) - && $key === 'iterable' - ) { - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - - if (strpos($input_key, $key . '&') === 0) { - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - - if ($atomic_input_type instanceof TLiteralClassString - && $base_type instanceof TClassString - && $base_type->as_type - ) { - try { - $classlike_storage = - $codebase->classlike_storage_provider->get($atomic_input_type->value); - - if (!empty($classlike_storage->template_extended_params[$base_type->as_type->value])) { - $atomic_input_type = new TClassString( - $base_type->as_type->value, - new TGenericObject( - $base_type->as_type->value, - array_values($classlike_storage->template_extended_params[$base_type->as_type->value]) - ) - ); - - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - } catch (InvalidArgumentException $e) { - // do nothing - } - } - - if ($base_type instanceof TCallable) { - $matching_atomic_type = CallableTypeComparator::getCallableFromAtomic( - $codebase, - $atomic_input_type, - null, - $statements_analyzer - ); - - if ($matching_atomic_type) { - $matching_atomic_types[$matching_atomic_type->getId()] = $matching_atomic_type; - continue; - } - } - - if ($atomic_input_type instanceof TNamedObject - && ($base_type instanceof TNamedObject - || $base_type instanceof TIterable) - ) { - if ($base_type instanceof TIterable) { - if ($atomic_input_type->value === 'Traversable') { - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - - $base_type = new TGenericObject( - 'Traversable', - $base_type->type_params - ); - } - - try { - $classlike_storage = - $codebase->classlike_storage_provider->get($atomic_input_type->value); - - if ($atomic_input_type instanceof TGenericObject - && isset($classlike_storage->template_extended_params[$base_type->value]) - ) { - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - - if (!empty($classlike_storage->template_extended_params[$base_type->value])) { - $atomic_input_type = new TGenericObject( - $atomic_input_type->value, - array_values($classlike_storage->template_extended_params[$base_type->value]) - ); - - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - - if (in_array('Traversable', $classlike_storage->class_implements) - && $base_type->value === 'Iterator' - ) { - $matching_atomic_types[$atomic_input_type->getId()] = $atomic_input_type; - continue; - } - } catch (InvalidArgumentException $e) { - // do nothing - } - } - - if ($atomic_input_type instanceof TTemplateParam) { - $matching_atomic_types = array_merge( - $matching_atomic_types, - self::findMatchingAtomicTypesForTemplate( - $base_type, - $key, - $codebase, - $statements_analyzer, - $atomic_input_type->as - ) - ); - continue; - } - } - - return array_values($matching_atomic_types); - } - - /** - * @return list - */ - private static function handleTemplateParamStandin( - TTemplateParam $atomic_type, - string $key, - ?Union $input_type, - ?int $input_arg_offset, - ?string $calling_class, - ?string $calling_function, - TemplateResult $template_result, - ?Codebase $codebase, - ?StatementsAnalyzer $statements_analyzer, - bool $replace, - bool $add_lower_bound, - ?string $bound_equality_classlike, - int $depth, - bool &$had_template - ): array { - if ($atomic_type->defining_class === $calling_class) { - return [$atomic_type]; - } - - $template_type = $template_result->template_types - [$atomic_type->param_name] - [$atomic_type->defining_class]; - - if ($template_type->getId() === $key) { - return array_values($template_type->getAtomicTypes()); - } - - $replacement_type = $template_type; - - $param_name_key = $atomic_type->param_name; - - if (strpos($key, '&')) { - $param_name_key = $key; - } - - $extra_types = []; - - if ($atomic_type->extra_types) { - foreach ($atomic_type->extra_types as $extra_type) { - $extra_type = self::replace( - new Union([$extra_type]), - $template_result, - $codebase, - $statements_analyzer, - $input_type, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - $bound_equality_classlike, - $depth + 1 - ); - - if ($extra_type->isSingle()) { - $extra_type = $extra_type->getSingleAtomic(); - - if ($extra_type instanceof TNamedObject - || $extra_type instanceof TTemplateParam - || $extra_type instanceof TIterable - || $extra_type instanceof TObjectWithProperties - ) { - $extra_types[$extra_type->getKey()] = $extra_type; - } - } - } - } - - if ($replace) { - $atomic_types = []; - - if ($replacement_type->hasMixed() - && !$atomic_type->as->hasMixed() - ) { - foreach ($atomic_type->as->getAtomicTypes() as $as_atomic_type) { - $atomic_types[] = clone $as_atomic_type; - } - } else { - if ($codebase) { - $replacement_type = TypeExpander::expandUnion( - $codebase, - $replacement_type, - $calling_class, - $calling_class, - null - ); - } - - if ($depth < 10) { - $replacement_type = self::replace( - $replacement_type, - $template_result, - $codebase, - $statements_analyzer, - $input_type, - $input_arg_offset, - $calling_class, - $calling_function, - true, - $add_lower_bound, - $bound_equality_classlike, - $depth + 1 - ); - } - - foreach ($replacement_type->getAtomicTypes() as $replacement_atomic_type) { - $replacements_found = false; - - // @codingStandardsIgnoreStart - if ($replacement_atomic_type instanceof TTemplateKeyOf - && isset($template_result->template_types[$replacement_atomic_type->param_name][$replacement_atomic_type->defining_class]) - && count($template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class]) - === 1 - ) { - $keyed_template = $template_result->template_types[$replacement_atomic_type->param_name][$replacement_atomic_type->defining_class]; - - if ($keyed_template->isSingle()) { - $keyed_template = $keyed_template->getSingleAtomic(); - } - - if ($keyed_template instanceof TKeyedArray - || $keyed_template instanceof TArray - || $keyed_template instanceof TList - ) { - if ($keyed_template instanceof TKeyedArray) { - $key_type = $keyed_template->getGenericKeyType(); - } elseif ($keyed_template instanceof TList) { - $key_type = Type::getInt(); - } else { - $key_type = $keyed_template->type_params[0]; - } - - $replacements_found = true; - - foreach ($key_type->getAtomicTypes() as $key_type_atomic) { - $atomic_types[] = clone $key_type_atomic; - } - - $existing_lower_bound = reset($template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class]); - - $existing_lower_bound->type = clone $key_type; - } - } - - if ($replacement_atomic_type instanceof TTemplateParam - && $replacement_atomic_type->defining_class !== $calling_class - && $replacement_atomic_type->defining_class !== 'fn-' . $calling_function - ) { - foreach ($replacement_atomic_type->as->getAtomicTypes() as $nested_type_atomic) { - $replacements_found = true; - $atomic_types[] = clone $nested_type_atomic; - } - } - // @codingStandardsIgnoreEnd - - if (!$replacements_found) { - $atomic_types[] = clone $replacement_atomic_type; - } - - $had_template = true; - } - } - - $matching_input_keys = []; - - if ($codebase) { - $atomic_type->as = TypeExpander::expandUnion( - $codebase, - $atomic_type->as, - $calling_class, - $calling_class, - null - ); - } - - $atomic_type->as = self::replace( - $atomic_type->as, - $template_result, - $codebase, - $statements_analyzer, - $input_type, - $input_arg_offset, - $calling_class, - $calling_function, - true, - $add_lower_bound, - $bound_equality_classlike, - $depth + 1 - ); - - if ($input_type - && !$template_result->readonly - && ( - $atomic_type->as->isMixed() - || !$codebase - || UnionTypeComparator::canBeContainedBy( - $codebase, - $input_type, - $atomic_type->as, - false, - false, - $matching_input_keys - ) - ) - ) { - $generic_param = clone $input_type; - - if ($matching_input_keys) { - $generic_param_keys = array_keys($generic_param->getAtomicTypes()); - - foreach ($generic_param_keys as $atomic_key) { - if (!isset($matching_input_keys[$atomic_key])) { - $generic_param->removeType($atomic_key); - } - } - } - - if ($add_lower_bound) { - return array_values($generic_param->getAtomicTypes()); - } - - $generic_param->setFromDocblock(); - - if (isset( - $template_result->lower_bounds[$param_name_key][$atomic_type->defining_class] - )) { - $existing_lower_bounds = $template_result->lower_bounds - [$param_name_key] - [$atomic_type->defining_class]; - - $has_matching_lower_bound = false; - - foreach ($existing_lower_bounds as $existing_lower_bound) { - $existing_depth = $existing_lower_bound->appearance_depth; - $existing_arg_offset = $existing_lower_bound->arg_offset ?? $input_arg_offset; - - if ($existing_depth === $depth - && $input_arg_offset === $existing_arg_offset - && $existing_lower_bound->type->getId() === $generic_param->getId() - && $existing_lower_bound->equality_bound_classlike === $bound_equality_classlike - ) { - $has_matching_lower_bound = true; - break; - } - } - - if (!$has_matching_lower_bound) { - $template_result->lower_bounds - [$param_name_key] - [$atomic_type->defining_class] - [] = new TemplateBound( - $generic_param, - $depth, - $input_arg_offset, - $bound_equality_classlike - ); - } - } else { - $template_result->lower_bounds[$param_name_key][$atomic_type->defining_class] = [ - new TemplateBound( - $generic_param, - $depth, - $input_arg_offset, - $bound_equality_classlike - ) - ]; - } - } - - foreach ($atomic_types as &$atomic_type) { - if ($atomic_type instanceof TNamedObject - || $atomic_type instanceof TTemplateParam - || $atomic_type instanceof TIterable - || $atomic_type instanceof TObjectWithProperties - ) { - $atomic_type->extra_types = $extra_types; - } elseif ($atomic_type instanceof TObject && $extra_types) { - $atomic_type = reset($extra_types); - $atomic_type->extra_types = array_slice($extra_types, 1); - } - } - - return $atomic_types; - } - - if ($add_lower_bound && $input_type && !$template_result->readonly) { - $matching_input_keys = []; - - if ($codebase - && UnionTypeComparator::canBeContainedBy( - $codebase, - $input_type, - $replacement_type, - false, - false, - $matching_input_keys - ) - ) { - $generic_param = clone $input_type; - - if ($matching_input_keys) { - $generic_param_keys = array_keys($generic_param->getAtomicTypes()); - - foreach ($generic_param_keys as $atomic_key) { - if (!isset($matching_input_keys[$atomic_key])) { - $generic_param->removeType($atomic_key); - } - } - } - - if (isset($template_result->upper_bounds[$param_name_key][$atomic_type->defining_class])) { - if (!UnionTypeComparator::isContainedBy( - $codebase, - $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type, - $generic_param - ) || !UnionTypeComparator::isContainedBy( - $codebase, - $generic_param, - $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type - )) { - $intersection_type = Type::intersectUnionTypes( - $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type, - $generic_param, - $codebase - ); - } else { - $intersection_type = $generic_param; - } - - if ($intersection_type) { - $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type - = $intersection_type; - } else { - $template_result->upper_bounds_unintersectable_types[] - = $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type; - $template_result->upper_bounds_unintersectable_types[] = $generic_param; - - $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class]->type - = Type::getMixed(); - } - } else { - $template_result->upper_bounds[$param_name_key][$atomic_type->defining_class] = new TemplateBound( - $generic_param - ); - } - } - } - - return [$atomic_type]; - } - - /** - * @return non-empty-list - */ - public static function handleTemplateParamClassStandin( - TTemplateParamClass $atomic_type, - ?Union $input_type, - ?int $input_arg_offset, - ?string $calling_class, - ?string $calling_function, - TemplateResult $template_result, - ?Codebase $codebase, - ?StatementsAnalyzer $statements_analyzer, - bool $replace, - bool $add_lower_bound, - ?string $bound_equality_classlike, - int $depth, - bool $was_single, - bool &$had_template - ): array { - if ($atomic_type->defining_class === $calling_class) { - return [$atomic_type]; - } - - $atomic_types = []; - - if ($input_type && !$template_result->readonly) { - $valid_input_atomic_types = []; - - foreach ($input_type->getAtomicTypes() as $input_atomic_type) { - if ($input_atomic_type instanceof TLiteralClassString) { - $valid_input_atomic_types[] = new TNamedObject( - $input_atomic_type->value - ); - } elseif ($input_atomic_type instanceof TTemplateParamClass) { - $valid_input_atomic_types[] = new TTemplateParam( - $input_atomic_type->param_name, - $input_atomic_type->as_type - ? new Union([$input_atomic_type->as_type]) - : ($input_atomic_type->as === 'object' - ? Type::getObject() - : Type::getMixed()), - $input_atomic_type->defining_class - ); - } elseif ($input_atomic_type instanceof TClassString) { - if ($input_atomic_type->as_type) { - $valid_input_atomic_types[] = clone $input_atomic_type->as_type; - } elseif ($input_atomic_type->as !== 'object') { - $valid_input_atomic_types[] = new TNamedObject( - $input_atomic_type->as - ); - } else { - $valid_input_atomic_types[] = new TObject(); - } - } elseif ($input_atomic_type instanceof TDependentGetClass) { - $valid_input_atomic_types[] = new TObject(); - } - } - - $generic_param = null; - - if ($valid_input_atomic_types) { - $generic_param = new Union($valid_input_atomic_types); - $generic_param->setFromDocblock(); - } elseif ($was_single) { - $generic_param = Type::getMixed(); - } - - if ($atomic_type->as_type) { - // sometimes templated class-strings can contain nested templates - // in the as type that need to be resolved as well. - $as_type_union = self::replace( - new Union([$atomic_type->as_type]), - $template_result, - $codebase, - $statements_analyzer, - $generic_param, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - $bound_equality_classlike, - $depth + 1 - ); - - $first = $as_type_union->getSingleAtomic(); - - if (count($as_type_union->getAtomicTypes()) === 1 && $first instanceof TNamedObject) { - $atomic_type->as_type = $first; - } else { - $atomic_type->as_type = null; - } - } - - if ($generic_param) { - if (isset($template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class])) { - $template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class] = [ - new TemplateBound( - Type::combineUnionTypes( - $generic_param, - self::getMostSpecificTypeFromBounds( - $template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class], - $codebase - ) - ), - $depth - ) - ]; - } else { - $template_result->lower_bounds[$atomic_type->param_name][$atomic_type->defining_class] = [ - new TemplateBound( - $generic_param, - $depth, - $input_arg_offset - ) - ]; - } - } - } else { - $template_type = $template_result->template_types - [$atomic_type->param_name] - [$atomic_type->defining_class]; - - foreach ($template_type->getAtomicTypes() as $template_atomic_type) { - if ($template_atomic_type instanceof TNamedObject) { - $atomic_types[] = new TClassString( - $template_atomic_type->value, - $template_atomic_type - ); - } elseif ($template_atomic_type instanceof TObject) { - $atomic_types[] = new TClassString(); - } - } - } - - $class_string = new TClassString($atomic_type->as, $atomic_type->as_type); - - if (!$atomic_types) { - $atomic_types[] = $class_string; - } - - return $atomic_types; - } - - /** - * @param array>> $template_types - */ - public static function getRootTemplateType( - array $template_types, - string $param_name, - string $defining_class, - array $visited_classes, - ?Codebase $codebase - ): ?Union { - if (isset($visited_classes[$defining_class])) { - return null; - } - - if (isset($template_types[$param_name][$defining_class])) { - $mapped_type = self::getMostSpecificTypeFromBounds( - $template_types[$param_name][$defining_class], - $codebase - ); - - $mapped_type_atomic_types = array_values($mapped_type->getAtomicTypes()); - - if (count($mapped_type_atomic_types) > 1 - || !$mapped_type_atomic_types[0] instanceof TTemplateParam - ) { - return $mapped_type; - } - - $first_template = $mapped_type_atomic_types[0]; - - return self::getRootTemplateType( - $template_types, - $first_template->param_name, - $first_template->defining_class, - $visited_classes + [$defining_class => true], - $codebase - ) ?? $mapped_type; - } - - return null; - } - - /** - * This takes a list of lower bounds and returns the most general type. - * - * If given a single bound that's just the type of that bound. - * - * If instead given a collection of lower bounds it normally returns a union of those - * bound types. - * - * @param non-empty-list $lower_bounds - */ - public static function getMostSpecificTypeFromBounds(array $lower_bounds, ?Codebase $codebase): Union - { - if (count($lower_bounds) === 1) { - return reset($lower_bounds)->type; - } - - usort( - $lower_bounds, - function (TemplateBound $bound_a, TemplateBound $bound_b) { - return $bound_b->appearance_depth <=> $bound_a->appearance_depth; - } - ); - - $current_depth = null; - $current_type = null; - $had_invariant = false; - $last_arg_offset = -1; - - foreach ($lower_bounds as $template_bound) { - if ($current_depth === null) { - $current_depth = $template_bound->appearance_depth; - } elseif ($current_depth !== $template_bound->appearance_depth && $current_type) { - if (!$current_type->isEmpty() - && ($had_invariant || $last_arg_offset === $template_bound->arg_offset) - ) { - // escape switches when matching on invariant generic params - // and when matching - break; - } - - $current_depth = $template_bound->appearance_depth; - } - - $had_invariant = $had_invariant ?: $template_bound->equality_bound_classlike !== null; - - $current_type = Type::combineUnionTypes( - $current_type, - $template_bound->type, - $codebase - ); - - $last_arg_offset = $template_bound->arg_offset; - } - - return $current_type ?? Type::getMixed(); - } - - /** - * @param TGenericObject|TNamedObject|TIterable $input_type_part - * @param TGenericObject|TIterable $container_type_part - * @return list - */ - public static function getMappedGenericTypeParams( - Codebase $codebase, - Atomic $input_type_part, - Atomic $container_type_part, - ?array &$container_type_params_covariant = null - ): array { - if ($input_type_part instanceof TGenericObject || $input_type_part instanceof TIterable) { - $input_type_params = $input_type_part->type_params; - } else { - $class_storage = $codebase->classlike_storage_provider->get($input_type_part->value); - - $container_class = $container_type_part->value; - - if (strtolower($input_type_part->value) === strtolower($container_type_part->value)) { - $input_type_params = $class_storage->getClassTemplateTypes(); - } elseif (!empty($class_storage->template_extended_params[$container_class])) { - $input_type_params = array_values($class_storage->template_extended_params[$container_class]); - } else { - $input_type_params = array_fill(0, count($class_storage->template_types ?? []), Type::getMixed()); - } - } - - try { - $input_class_storage = $codebase->classlike_storage_provider->get($input_type_part->value); - $container_class_storage = $codebase->classlike_storage_provider->get($container_type_part->value); - $container_type_params_covariant = $container_class_storage->template_covariants; - } catch (Throwable $e) { - $input_class_storage = null; - } - - if ($input_type_part->value !== $container_type_part->value - && $input_class_storage - ) { - $input_template_types = $input_class_storage->template_types; - $i = 0; - - $replacement_templates = []; - - if ($input_template_types - && (!$input_type_part instanceof TGenericObject || !$input_type_part->remapped_params) - && (!$container_type_part instanceof TGenericObject || !$container_type_part->remapped_params) - ) { - foreach ($input_template_types as $template_name => $_) { - if (!isset($input_type_params[$i])) { - break; - } - - $replacement_templates[$template_name][$input_type_part->value] = $input_type_params[$i]; - - $i++; - } - } - - $template_extends = $input_class_storage->template_extended_params; - - if (isset($template_extends[$container_type_part->value])) { - $params = $template_extends[$container_type_part->value]; - - $new_input_params = []; - - foreach ($params as $extended_input_param_type) { - $new_input_param = null; - - foreach ($extended_input_param_type->getAtomicTypes() as $et) { - if ($et instanceof TTemplateParam) { - $ets = Methods::getExtendedTemplatedTypes( - $et, - $template_extends - ); - } else { - $ets = []; - } - - if ($ets - && $ets[0] instanceof TTemplateParam - && isset( - $input_class_storage->template_types - [$ets[0]->param_name] - [$ets[0]->defining_class] - ) - ) { - $old_params_offset = (int) array_search( - $ets[0]->param_name, - array_keys($input_class_storage->template_types) - ); - - $candidate_param_type = $input_type_params[$old_params_offset] ?? Type::getMixed(); - } else { - $candidate_param_type = new Union([clone $et]); - } - - $candidate_param_type->from_template_default = true; - - $new_input_param = Type::combineUnionTypes( - $new_input_param, - $candidate_param_type - ); - } - - $new_input_param = clone $new_input_param; - - TemplateInferredTypeReplacer::replace( - $new_input_param, - new TemplateResult([], $replacement_templates), - $codebase - ); - - $new_input_params[] = $new_input_param; - } - - $input_type_params = $new_input_params; - } - } - - return $input_type_params; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php deleted file mode 100644 index a8c05fb6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php +++ /dev/null @@ -1,7 +0,0 @@ - - */ - public $replacement_atomic_types; - - /** - * @param list $replacement_atomic_types - */ - public function __construct(array $replacement_atomic_types) - { - $this->replacement_atomic_types = $replacement_atomic_types; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php deleted file mode 100644 index 9ed473c6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php +++ /dev/null @@ -1,24 +0,0 @@ - - */ - public $replacement_tokens; - - /** - * @param list $replacement_tokens - */ - public function __construct(array $replacement_tokens) - { - $this->replacement_tokens = $replacement_tokens; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php deleted file mode 100644 index a0c309dd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php +++ /dev/null @@ -1,35 +0,0 @@ -declaring_fq_classlike_name = $declaring_fq_classlike_name; - $this->alias_name = $alias_name; - $this->line_number = $line_number; - $this->start_offset = $start_offset; - $this->end_offset = $end_offset; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php deleted file mode 100644 index d45af1ce..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php +++ /dev/null @@ -1,99 +0,0 @@ - */ - public $value_types = []; - - /** @var array|null */ - public $named_object_types = []; - - /** @var list */ - public $array_type_params = []; - - /** @var array> */ - public $builtin_type_params = []; - - /** @var array> */ - public $object_type_params = []; - - /** @var array */ - public $object_static = []; - - /** @var array|null */ - public $array_counts = []; - - /** @var bool */ - public $array_sometimes_filled = false; - - /** @var bool */ - public $array_always_filled = true; - - /** @var array */ - public $objectlike_entries = []; - - /** @var bool */ - public $objectlike_sealed = true; - - /** @var ?Union */ - public $objectlike_key_type; - - /** @var ?Union */ - public $objectlike_value_type; - - /** @var bool */ - public $empty_mixed = false; - - /** @var bool */ - public $non_empty_mixed = false; - - /** @var ?bool */ - public $mixed_from_loop_isset; - - /** @var array|null */ - public $strings = []; - - /** @var array|null */ - public $ints = []; - - /** @var array|null */ - public $floats = []; - - /** @var array|null */ - public $class_string_types = []; - - /** - * @var array|null - */ - public $extra_types; - - /** @var ?bool */ - public $all_arrays_lists; - - /** @var ?bool */ - public $all_arrays_callable; - - /** @var ?bool */ - public $all_arrays_class_string_maps; - - /** @var array */ - public $class_string_map_names = []; - - /** @var array */ - public $class_string_map_as_types = []; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php deleted file mode 100644 index ec939c1c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php +++ /dev/null @@ -1,1528 +0,0 @@ - + array = array` - * - and `array + string = array|string` - * - and `array + array = array` - * - and `array + array = array` - * - and `array + array = array` - * - * @param non-empty-list $types - * @param int $literal_limit any greater number of literal types than this - * will be merged to a scalar - * - */ - public static function combine( - array $types, - ?Codebase $codebase = null, - bool $overwrite_empty_array = false, - bool $allow_mixed_union = true, - int $literal_limit = 500 - ): Union { - if (count($types) === 1) { - $union_type = new Union([$types[0]]); - - if ($types[0]->from_docblock) { - $union_type->from_docblock = true; - } - - return $union_type; - } - - $combination = new TypeCombination(); - - $from_docblock = false; - - foreach ($types as $type) { - $from_docblock = $from_docblock || $type->from_docblock; - - $result = self::scrapeTypeProperties( - $type, - $combination, - $codebase, - $overwrite_empty_array, - $allow_mixed_union, - $literal_limit - ); - - if ($result) { - if ($from_docblock) { - $result->from_docblock = true; - } - - return $result; - } - } - - if (count($combination->value_types) === 1 - && !count($combination->objectlike_entries) - && !$combination->array_type_params - && !$combination->builtin_type_params - && !$combination->object_type_params - && !$combination->named_object_types - && !$combination->strings - && !$combination->class_string_types - && !$combination->ints - && !$combination->floats - ) { - if (isset($combination->value_types['false'])) { - $union_type = Type::getFalse(); - - if ($from_docblock) { - $union_type->from_docblock = true; - } - - return $union_type; - } - - if (isset($combination->value_types['true'])) { - $union_type = Type::getTrue(); - - if ($from_docblock) { - $union_type->from_docblock = true; - } - - return $union_type; - } - } elseif (isset($combination->value_types['void'])) { - unset($combination->value_types['void']); - - // if we're merging with another type, we cannot represent it in PHP - $from_docblock = true; - - if (!isset($combination->value_types['null'])) { - $combination->value_types['null'] = new TNull(); - } - } - - if (isset($combination->value_types['true']) && isset($combination->value_types['false'])) { - unset($combination->value_types['true'], $combination->value_types['false']); - - $combination->value_types['bool'] = new TBool(); - } - - if ($combination->array_type_params - && (isset($combination->named_object_types['Traversable']) - || isset($combination->builtin_type_params['Traversable'])) - && ( - ($codebase && $codebase->config->allow_phpstorm_generics) - || isset($combination->builtin_type_params['Traversable']) - || (isset($combination->named_object_types['Traversable']) - && $combination->named_object_types['Traversable']->from_docblock) - ) - && !$combination->extra_types - ) { - $array_param_types = $combination->array_type_params; - $traversable_param_types = $combination->builtin_type_params['Traversable'] - ?? [Type::getMixed(), Type::getMixed()]; - - $combined_param_types = []; - - foreach ($array_param_types as $i => $array_param_type) { - $combined_param_types[] = Type::combineUnionTypes($array_param_type, $traversable_param_types[$i]); - } - - $combination->value_types['iterable'] = new TIterable($combined_param_types); - - $combination->array_type_params = []; - - /** - * @psalm-suppress PossiblyNullArrayAccess - */ - unset( - $combination->value_types['array'], - $combination->named_object_types['Traversable'], - $combination->builtin_type_params['Traversable'] - ); - } - - if ($combination->empty_mixed && $combination->non_empty_mixed) { - $combination->value_types['mixed'] = new TMixed((bool) $combination->mixed_from_loop_isset); - } - - $new_types = []; - - if ($combination->objectlike_entries) { - $new_types = self::handleKeyedArrayEntries( - $combination, - $overwrite_empty_array - ); - } - - if ($combination->array_type_params) { - if (count($combination->array_type_params) !== 2) { - throw new UnexpectedValueException('Unexpected number of parameters'); - } - - $new_types[] = self::getArrayTypeFromGenericParams( - $codebase, - $combination, - $overwrite_empty_array, - $allow_mixed_union, - $type, - $combination->array_type_params - ); - } - - if ($combination->extra_types) { - /** @psalm-suppress PropertyTypeCoercion */ - $combination->extra_types = self::combine( - array_values($combination->extra_types), - $codebase - )->getAtomicTypes(); - } - - foreach ($combination->builtin_type_params as $generic_type => $generic_type_params) { - if ($generic_type === 'iterable') { - $new_types[] = new TIterable($generic_type_params); - } else { - $generic_object = new TGenericObject($generic_type, $generic_type_params); - - /** @psalm-suppress PropertyTypeCoercion */ - $generic_object->extra_types = $combination->extra_types; - $new_types[] = $generic_object; - - if ($combination->named_object_types) { - unset($combination->named_object_types[$generic_type]); - } - } - } - - foreach ($combination->object_type_params as $generic_type => $generic_type_params) { - $generic_type = substr($generic_type, 0, (int) strpos($generic_type, '<')); - - $generic_object = new TGenericObject($generic_type, $generic_type_params); - - if ($combination->object_static[$generic_type] ?? false) { - $generic_object->was_static = true; - } - - /** @psalm-suppress PropertyTypeCoercion */ - $generic_object->extra_types = $combination->extra_types; - $new_types[] = $generic_object; - } - - if ($combination->class_string_types) { - if ($combination->strings) { - foreach ($combination->strings as $k => $string) { - if ($string instanceof TLiteralClassString) { - $combination->class_string_types[$string->value] = new TNamedObject($string->value); - unset($combination->strings[$k]); - } - } - } - - $has_non_specific_string = isset($combination->value_types['string']) - && get_class($combination->value_types['string']) === TString::class; - - if (!$has_non_specific_string) { - $object_type = self::combine( - array_values($combination->class_string_types), - $codebase - ); - - foreach ($object_type->getAtomicTypes() as $object_atomic_type) { - if ($object_atomic_type instanceof TNamedObject) { - $new_types[] = new TClassString($object_atomic_type->value, $object_atomic_type); - } elseif ($object_atomic_type instanceof TObject) { - $new_types[] = new TClassString(); - } - } - } - } - - if ($combination->strings) { - $new_types = array_merge($new_types, array_values($combination->strings)); - } - - if ($combination->ints) { - $new_types = array_merge($new_types, array_values($combination->ints)); - } - - if ($combination->floats) { - $new_types = array_merge($new_types, array_values($combination->floats)); - } - - if (isset($combination->value_types['string']) - && isset($combination->value_types['int']) - && isset($combination->value_types['bool']) - && isset($combination->value_types['float']) - ) { - unset( - $combination->value_types['string'], - $combination->value_types['int'], - $combination->value_types['bool'], - $combination->value_types['float'] - ); - $combination->value_types['scalar'] = new TScalar; - } - - if ($combination->named_object_types !== null) { - $combination->value_types += $combination->named_object_types; - } - - $has_empty = (int) isset($combination->value_types['empty']); - $has_never = false; - - foreach ($combination->value_types as $type) { - if ($type instanceof TMixed - && $combination->mixed_from_loop_isset - && (count($combination->value_types) > (1 + $has_empty) || count($new_types) > $has_empty) - ) { - continue; - } - - if (($type instanceof TEmpty || $type instanceof TNever) - && (count($combination->value_types) > 1 || count($new_types)) - ) { - $has_never = true; - continue; - } - - $new_types[] = $type; - } - - if (!$new_types && !$has_never) { - throw new UnexpectedValueException('There should be types here'); - } elseif (!$new_types && $has_never) { - $union_type = Type::getNever(); - } else { - $union_type = new Union($new_types); - } - - if ($from_docblock) { - $union_type->from_docblock = true; - } - - return $union_type; - } - - private static function scrapeTypeProperties( - Atomic $type, - TypeCombination $combination, - ?Codebase $codebase, - bool $overwrite_empty_array, - bool $allow_mixed_union, - int $literal_limit - ): ?Union { - if ($type instanceof TMixed) { - if ($type->from_loop_isset) { - if ($combination->mixed_from_loop_isset === null) { - $combination->mixed_from_loop_isset = true; - } else { - return null; - } - } else { - $combination->mixed_from_loop_isset = false; - } - - if ($type instanceof TNonEmptyMixed) { - $combination->non_empty_mixed = true; - - if ($combination->empty_mixed) { - return null; - } - } elseif ($type instanceof TEmptyMixed) { - $combination->empty_mixed = true; - - if ($combination->non_empty_mixed) { - return null; - } - } else { - $combination->empty_mixed = true; - $combination->non_empty_mixed = true; - } - - if (!$allow_mixed_union) { - return Type::getMixed($combination->mixed_from_loop_isset); - } - } - - // deal with false|bool => bool - if (($type instanceof TFalse || $type instanceof TTrue) && isset($combination->value_types['bool'])) { - return null; - } - - if (get_class($type) === TBool::class && isset($combination->value_types['false'])) { - unset($combination->value_types['false']); - } - - if (get_class($type) === TBool::class && isset($combination->value_types['true'])) { - unset($combination->value_types['true']); - } - - if ($type instanceof TArray && isset($combination->builtin_type_params['iterable'])) { - $type_key = 'iterable'; - } elseif ($type instanceof TArray - && $type->type_params[1]->isMixed() - && isset($combination->value_types['iterable']) - ) { - $type_key = 'iterable'; - $combination->builtin_type_params['iterable'] = [Type::getMixed(), Type::getMixed()]; - } elseif ($type instanceof TNamedObject - && $type->value === 'Traversable' - && (isset($combination->builtin_type_params['iterable']) || isset($combination->value_types['iterable'])) - ) { - $type_key = 'iterable'; - - if (!isset($combination->builtin_type_params['iterable'])) { - $combination->builtin_type_params['iterable'] = [Type::getMixed(), Type::getMixed()]; - } - - if (!$type instanceof TGenericObject) { - $type = new TGenericObject($type->value, [Type::getMixed(), Type::getMixed()]); - } - } elseif ($type instanceof TNamedObject && ($type->value === 'Traversable' || $type->value === 'Generator')) { - $type_key = $type->value; - } else { - $type_key = $type->getKey(); - } - - if ($type instanceof TIterable - && $combination->array_type_params - && ($type->has_docblock_params || $combination->array_type_params[1]->isMixed()) - ) { - if (!isset($combination->builtin_type_params['iterable'])) { - $combination->builtin_type_params['iterable'] = $combination->array_type_params; - } else { - foreach ($combination->array_type_params as $i => $array_type_param) { - $iterable_type_param = $combination->builtin_type_params['iterable'][$i]; - /** @psalm-suppress PropertyTypeCoercion */ - $combination->builtin_type_params['iterable'][$i] = Type::combineUnionTypes( - $iterable_type_param, - $array_type_param - ); - } - } - - $combination->array_type_params = []; - } - - if ($type instanceof TIterable - && (isset($combination->named_object_types['Traversable']) - || isset($combination->builtin_type_params['Traversable'])) - ) { - if (!isset($combination->builtin_type_params['iterable'])) { - $combination->builtin_type_params['iterable'] - = $combination->builtin_type_params['Traversable'] ?? [Type::getMixed(), Type::getMixed()]; - } elseif (isset($combination->builtin_type_params['Traversable'])) { - foreach ($combination->builtin_type_params['Traversable'] as $i => $array_type_param) { - $iterable_type_param = $combination->builtin_type_params['iterable'][$i]; - /** @psalm-suppress PropertyTypeCoercion */ - $combination->builtin_type_params['iterable'][$i] = Type::combineUnionTypes( - $iterable_type_param, - $array_type_param - ); - } - } else { - $combination->builtin_type_params['iterable'] = [Type::getMixed(), Type::getMixed()]; - } - - /** @psalm-suppress PossiblyNullArrayAccess */ - unset( - $combination->named_object_types['Traversable'], - $combination->builtin_type_params['Traversable'] - ); - } - - if ($type instanceof TNamedObject - || $type instanceof TTemplateParam - || $type instanceof TIterable - || $type instanceof TObjectWithProperties - ) { - if ($type->extra_types) { - $combination->extra_types = array_merge( - $combination->extra_types ?: [], - $type->extra_types - ); - } - } - - if ($type instanceof TNamedObject) { - if (array_key_exists($type->value, $combination->object_static)) { - if ($combination->object_static[$type->value] && !$type->was_static) { - $combination->object_static[$type->value] = false; - } - } else { - $combination->object_static[$type->value] = $type->was_static; - } - } - - if ($type instanceof TArray && $type_key === 'array') { - if ($type instanceof TCallableArray && isset($combination->value_types['callable'])) { - return null; - } - - foreach ($type->type_params as $i => $type_param) { - /** @psalm-suppress PropertyTypeCoercion */ - $combination->array_type_params[$i] = Type::combineUnionTypes( - $combination->array_type_params[$i] ?? null, - $type_param, - $codebase, - $overwrite_empty_array - ); - } - - if ($type instanceof TNonEmptyArray) { - if ($combination->array_counts !== null) { - if ($type->count === null) { - $combination->array_counts = null; - } else { - $combination->array_counts[$type->count] = true; - } - } - - $combination->array_sometimes_filled = true; - } else { - $combination->array_always_filled = false; - } - - if (!$type->type_params[1]->isEmpty()) { - $combination->all_arrays_lists = false; - $combination->all_arrays_class_string_maps = false; - } - - if ($type instanceof TCallableArray) { - if ($combination->all_arrays_callable !== false) { - $combination->all_arrays_callable = true; - } - } else { - $combination->all_arrays_callable = false; - } - - return null; - } - - if ($type instanceof TList) { - foreach ([Type::getInt(), $type->type_param] as $i => $type_param) { - /** @psalm-suppress PropertyTypeCoercion */ - $combination->array_type_params[$i] = Type::combineUnionTypes( - $combination->array_type_params[$i] ?? null, - $type_param, - $codebase, - $overwrite_empty_array - ); - } - - if ($type instanceof TNonEmptyList) { - if ($combination->array_counts !== null) { - if ($type->count === null) { - $combination->array_counts = null; - } else { - $combination->array_counts[$type->count] = true; - } - } - - $combination->array_sometimes_filled = true; - } else { - $combination->array_always_filled = false; - } - - if ($combination->all_arrays_lists !== false) { - $combination->all_arrays_lists = true; - } - - $combination->all_arrays_callable = false; - $combination->all_arrays_class_string_maps = false; - - return null; - } - - if ($type instanceof TClassStringMap) { - foreach ([$type->getStandinKeyParam(), $type->value_param] as $i => $type_param) { - /** @psalm-suppress PropertyTypeCoercion */ - $combination->array_type_params[$i] = Type::combineUnionTypes( - $combination->array_type_params[$i] ?? null, - $type_param, - $codebase, - $overwrite_empty_array - ); - } - - $combination->array_always_filled = false; - - if ($combination->all_arrays_class_string_maps !== false) { - $combination->all_arrays_class_string_maps = true; - $combination->class_string_map_names[$type->param_name] = true; - $combination->class_string_map_as_types[(string) $type->as_type] = $type->as_type; - } - - return null; - } - - if (($type instanceof TGenericObject && ($type->value === 'Traversable' || $type->value === 'Generator')) - || ($type instanceof TIterable && $type->has_docblock_params) - || ($type instanceof TArray && $type_key === 'iterable') - ) { - foreach ($type->type_params as $i => $type_param) { - /** @psalm-suppress PropertyTypeCoercion */ - $combination->builtin_type_params[$type_key][$i] = Type::combineUnionTypes( - $combination->builtin_type_params[$type_key][$i] ?? null, - $type_param, - $codebase, - $overwrite_empty_array - ); - } - - return null; - } - - if ($type instanceof TGenericObject) { - foreach ($type->type_params as $i => $type_param) { - /** @psalm-suppress PropertyTypeCoercion */ - $combination->object_type_params[$type_key][$i] = Type::combineUnionTypes( - $combination->object_type_params[$type_key][$i] ?? null, - $type_param, - $codebase, - $overwrite_empty_array - ); - } - - return null; - } - - if ($type instanceof TKeyedArray) { - if ($type instanceof TCallableKeyedArray && isset($combination->value_types['callable'])) { - return null; - } - - $existing_objectlike_entries = (bool) $combination->objectlike_entries; - $possibly_undefined_entries = $combination->objectlike_entries; - $combination->objectlike_sealed = $combination->objectlike_sealed && $type->sealed; - - if ($type->previous_value_type) { - $combination->objectlike_value_type = Type::combineUnionTypes( - $type->previous_value_type, - $combination->objectlike_value_type, - $codebase, - $overwrite_empty_array - ); - } - - if ($type->previous_key_type) { - $combination->objectlike_key_type = Type::combineUnionTypes( - $type->previous_key_type, - $combination->objectlike_key_type, - $codebase, - $overwrite_empty_array - ); - } - - $has_defined_keys = false; - - foreach ($type->properties as $candidate_property_name => $candidate_property_type) { - $value_type = $combination->objectlike_entries[$candidate_property_name] ?? null; - - if (!$value_type) { - $combination->objectlike_entries[$candidate_property_name] = clone $candidate_property_type; - // it's possibly undefined if there are existing objectlike entries and - $combination->objectlike_entries[$candidate_property_name]->possibly_undefined - = $existing_objectlike_entries || $candidate_property_type->possibly_undefined; - } else { - $combination->objectlike_entries[$candidate_property_name] = Type::combineUnionTypes( - $value_type, - $candidate_property_type, - $codebase, - $overwrite_empty_array - ); - } - - if (!$type->previous_value_type) { - unset($possibly_undefined_entries[$candidate_property_name]); - } - - if (!$candidate_property_type->possibly_undefined) { - $has_defined_keys = true; - } - } - - if (!$has_defined_keys) { - $combination->array_always_filled = false; - } - - if ($combination->array_counts !== null) { - $combination->array_counts[count($type->properties)] = true; - } - - foreach ($possibly_undefined_entries as $possibly_undefined_type) { - $possibly_undefined_type->possibly_undefined = true; - } - - if (!$type->is_list) { - $combination->all_arrays_lists = false; - } elseif ($combination->all_arrays_lists !== false) { - $combination->all_arrays_lists = true; - } - - if ($type instanceof TCallableKeyedArray) { - if ($combination->all_arrays_callable !== false) { - $combination->all_arrays_callable = true; - } - } else { - $combination->all_arrays_callable = false; - } - - $combination->all_arrays_class_string_maps = false; - - return null; - } - - if ($type instanceof TObject) { - if ($type instanceof TCallableObject && isset($combination->value_types['callable'])) { - return null; - } - - $combination->named_object_types = null; - $combination->value_types[$type_key] = $type; - - return null; - } - - if ($type instanceof TIterable) { - $combination->value_types[$type_key] = $type; - - return null; - } - - if ($type instanceof TNamedObject) { - if ($combination->named_object_types === null) { - return null; - } - - if (isset($combination->named_object_types[$type_key])) { - return null; - } - - if (!$codebase) { - $combination->named_object_types[$type_key] = $type; - - return null; - } - - if (!$codebase->classlikes->classOrInterfaceOrEnumExists($type_key)) { - // write this to the main list - $combination->value_types[$type_key] = $type; - - return null; - } - - $is_class = $codebase->classExists($type_key); - - foreach ($combination->named_object_types as $key => $_) { - if ($codebase->classExists($key)) { - if ($codebase->classExtendsOrImplements($key, $type_key)) { - unset($combination->named_object_types[$key]); - continue; - } - - if ($is_class) { - if ($codebase->classExtends($type_key, $key)) { - return null; - } - } - } else { - if ($codebase->interfaceExtends($key, $type_key)) { - unset($combination->named_object_types[$key]); - continue; - } - - if ($is_class) { - if ($codebase->classImplements($type_key, $key)) { - return null; - } - } else { - if ($codebase->interfaceExtends($type_key, $key)) { - return null; - } - } - } - } - - $combination->named_object_types[$type_key] = $type; - - return null; - } - - if ($type instanceof TScalar) { - $combination->strings = null; - $combination->ints = null; - $combination->floats = null; - unset( - $combination->value_types['string'], - $combination->value_types['int'], - $combination->value_types['bool'], - $combination->value_types['true'], - $combination->value_types['false'], - $combination->value_types['float'] - ); - - if (!isset($combination->value_types[$type_key]) - || $combination->value_types[$type_key]->getId() === $type->getId() - ) { - $combination->value_types[$type_key] = $type; - } else { - $combination->value_types[$type_key] = new TScalar(); - } - - return null; - } - - if ($type instanceof Scalar && isset($combination->value_types['scalar'])) { - return null; - } - - if ($type instanceof TArrayKey) { - $combination->strings = null; - $combination->ints = null; - unset( - $combination->value_types['string'], - $combination->value_types['int'] - ); - $combination->value_types[$type_key] = $type; - - return null; - } - - if ($type instanceof TString) { - self::scrapeStringProperties( - $type_key, - $type, - $combination, - $codebase, - $literal_limit - ); - - return null; - } - - if ($type instanceof TInt) { - self::scrapeIntProperties( - $type_key, - $type, - $combination, - $literal_limit - ); - - return null; - } - - if ($type instanceof TFloat) { - if ($type instanceof TLiteralFloat) { - if ($combination->floats !== null && count($combination->floats) < $literal_limit) { - $combination->floats[$type_key] = $type; - } else { - $combination->floats = null; - $combination->value_types['float'] = new TFloat(); - } - } else { - $combination->floats = null; - $combination->value_types['float'] = $type; - } - - return null; - } - - if ($type instanceof TCallable && $type_key === 'callable') { - if (($combination->value_types['string'] ?? null) instanceof TCallableString) { - unset($combination->value_types['string']); - } elseif (!empty($combination->array_type_params) && $combination->all_arrays_callable) { - $combination->array_type_params = []; - } elseif (isset($combination->value_types['callable-object'])) { - unset($combination->value_types['callable-object']); - } - } - - $combination->value_types[$type_key] = $type; - return null; - } - - private static function scrapeStringProperties( - string $type_key, - Atomic $type, - TypeCombination $combination, - ?Codebase $codebase, - int $literal_limit - ): void { - if ($type instanceof TCallableString && isset($combination->value_types['callable'])) { - return; - } - - if (isset($combination->value_types['array-key'])) { - return; - } - - if ($type instanceof TTemplateParamClass) { - $combination->value_types[$type_key] = $type; - } elseif ($type instanceof TClassString) { - if (!$type->as_type) { - $combination->class_string_types['object'] = new TObject(); - } else { - $combination->class_string_types[$type->as] = $type->as_type; - } - } elseif ($type instanceof TLiteralString) { - if ($combination->strings !== null && count($combination->strings) < $literal_limit) { - $combination->strings[$type_key] = $type; - } else { - $shared_classlikes = $codebase ? self::getSharedTypes($combination, $codebase) : []; - - $combination->strings = null; - - if (isset($combination->value_types['string']) - && $combination->value_types['string'] instanceof TNumericString - && is_numeric($type->value) - ) { - // do nothing - } elseif (isset($combination->value_types['class-string']) - && $type instanceof TLiteralClassString - ) { - // do nothing - } elseif ($type instanceof TLiteralClassString) { - $type_classlikes = $codebase - ? self::getClassLikes($codebase, $type->value) - : []; - - $mutual = array_intersect_key($type_classlikes, $shared_classlikes); - - if ($mutual) { - $first_class = array_keys($mutual)[0]; - - $combination->class_string_types[$first_class] = new TNamedObject($first_class); - } else { - $combination->class_string_types['object'] = new TObject(); - } - } elseif (isset($combination->value_types['string']) - && $combination->value_types['string'] instanceof TNonspecificLiteralString - ) { - // do nothing - } elseif (isset($combination->value_types['string']) - && $combination->value_types['string'] instanceof TLowercaseString - && strtolower($type->value) === $type->value - ) { - // do nothing - } elseif (isset($combination->value_types['string']) - && $combination->value_types['string'] instanceof TNonFalsyString - && $type->value - ) { - // do nothing - } elseif (isset($combination->value_types['string']) - && $combination->value_types['string'] instanceof TNonEmptyString - && $type->value !== '' - ) { - // do nothing - } else { - $combination->value_types['string'] = new TString(); - } - } - } else { - $type_key = 'string'; - - if (!isset($combination->value_types['string'])) { - if ($combination->strings) { - if ($type instanceof TNumericString) { - $has_non_numeric_string = false; - - foreach ($combination->strings as $string_type) { - if (!is_numeric($string_type->value)) { - $has_non_numeric_string = true; - break; - } - } - - if ($has_non_numeric_string) { - $combination->value_types['string'] = new TString(); - } else { - $combination->value_types['string'] = $type; - } - } elseif ($type instanceof TLowercaseString) { - $has_non_lowercase_string = false; - - foreach ($combination->strings as $string_type) { - if (strtolower($string_type->value) !== $string_type->value) { - $has_non_lowercase_string = true; - break; - } - } - - if ($has_non_lowercase_string) { - $combination->value_types['string'] = new TString(); - } else { - $combination->value_types['string'] = $type; - } - } elseif ($type instanceof TNonEmptyString) { - $has_empty_string = false; - - foreach ($combination->strings as $string_type) { - if (!$string_type->value) { - $has_empty_string = true; - break; - } - } - - if ($has_empty_string) { - $combination->value_types['string'] = new TString(); - } else { - $combination->value_types['string'] = $type; - } - } elseif ($type instanceof TNonspecificLiteralString) { - $combination->value_types['string'] = $type; - } else { - $combination->value_types[$type_key] = new TString(); - } - } else { - $combination->value_types[$type_key] = $type; - } - } elseif (get_class($combination->value_types['string']) !== TString::class) { - if (get_class($type) === TString::class) { - $combination->value_types['string'] = $type; - } elseif (get_class($combination->value_types['string']) !== get_class($type)) { - if (get_class($type) === TNonEmptyString::class - && get_class($combination->value_types['string']) === TNumericString::class - ) { - $combination->value_types['string'] = $type; - } elseif (get_class($type) === TNumericString::class - && get_class($combination->value_types['string']) === TNonEmptyString::class - ) { - // do nothing - } elseif ((get_class($type) === TNonEmptyString::class - || get_class($type) === TNumericString::class) - && get_class($combination->value_types['string']) === TNonFalsyString::class - ) { - $combination->value_types['string'] = $type; - } elseif (get_class($type) === TNonFalsyString::class - && (get_class($combination->value_types['string']) === TNonEmptyString::class - || get_class($combination->value_types['string']) === TNumericString::class) - ) { - // do nothing - } elseif ((get_class($type) === TNonEmptyString::class - || get_class($type) === TNonFalsyString::class) - && get_class($combination->value_types['string']) === TNonEmptyLowercaseString::class - ) { - $combination->value_types['string'] = new TNonEmptyString(); - } elseif ((get_class($combination->value_types['string']) === TNonEmptyString::class - || get_class($combination->value_types['string']) === TNonFalsyString::class) - && get_class($type) === TNonEmptyLowercaseString::class - ) { - $combination->value_types['string'] = new TNonEmptyString(); - } elseif (get_class($type) === TLowercaseString::class - && get_class($combination->value_types['string']) === TNonEmptyLowercaseString::class - ) { - $combination->value_types['string'] = $type; - } elseif (get_class($combination->value_types['string']) === TLowercaseString::class - && get_class($type) === TNonEmptyLowercaseString::class - ) { - //no-change - } elseif (get_class($combination->value_types['string']) - === TNonEmptyNonspecificLiteralString::class - && $type instanceof TNonEmptyString - ) { - $combination->value_types['string'] = new TNonEmptyString(); - } elseif (get_class($type) === TNonEmptyNonspecificLiteralString::class - && $combination->value_types['string'] instanceof TNonEmptyString - ) { - // do nothing - } else { - $combination->value_types['string'] = new TString(); - } - } - } - - $combination->strings = null; - } - } - - private static function scrapeIntProperties( - string $type_key, - Atomic $type, - TypeCombination $combination, - int $literal_limit - ): void { - if (isset($combination->value_types['array-key'])) { - return; - } - - $had_zero = isset($combination->ints['int(0)']); - - if ($type instanceof TLiteralInt) { - if ($type->value === 0) { - $had_zero = true; - } - - if ($combination->ints !== null && count($combination->ints) < $literal_limit) { - $combination->ints[$type_key] = $type; - } else { - $combination->ints[$type_key] = $type; - - $all_nonnegative = !array_filter( - $combination->ints, - function ($int): bool { - return $int->value < 0; - } - ); - - if (isset($combination->value_types['int'])) { - $current_int_type = $combination->value_types['int']; - if ($current_int_type instanceof TIntRange) { - foreach ($combination->ints as $int) { - if (!$current_int_type->contains($int->value)) { - $current_int_type->min_bound = TIntRange::getNewLowestBound( - $current_int_type->min_bound, - $int->value - ); - $current_int_type->max_bound = TIntRange::getNewHighestBound( - $current_int_type->max_bound, - $int->value - ); - } - } - } - } - - $combination->ints = null; - - if (!isset($combination->value_types['int'])) { - $combination->value_types['int'] = $all_nonnegative - ? new TPositiveInt() - : new TNonspecificLiteralInt(); - } elseif ($combination->value_types['int'] instanceof TPositiveInt - && !$all_nonnegative - ) { - $combination->value_types['int'] = new TInt(); - } - } - } else { - if ($type instanceof TPositiveInt) { - if ($combination->ints) { - $all_nonnegative = !array_filter( - $combination->ints, - function ($int): bool { - return $int->value < 0; - } - ); - - if ($all_nonnegative) { - $combination->value_types['int'] = $type; - } else { - $combination->value_types['int'] = new TInt(); - } - } elseif (!isset($combination->value_types['int'])) { - $combination->value_types['int'] = $type; - } elseif ($combination->value_types['int'] instanceof TIntRange) { - //if we already had a range, we ensure the min is no higher than 1 - $combination->value_types['int']->min_bound = TIntRange::getNewLowestBound( - $combination->value_types['int']->min_bound, - 1 - ); - $combination->value_types['int']->max_bound = null; - } elseif (get_class($combination->value_types['int']) !== get_class($type)) { - $combination->value_types['int'] = new TInt(); - } - } elseif ($type instanceof TNonspecificLiteralInt) { - if ($combination->ints || !isset($combination->value_types['int'])) { - $combination->value_types['int'] = $type; - } elseif (isset($combination->value_types['int']) - && get_class($combination->value_types['int']) - !== get_class($type) - ) { - $combination->value_types['int'] = new TInt(); - } - } elseif ($type instanceof TIntRange) { - $type = clone $type; - if ($combination->ints) { - foreach ($combination->ints as $int) { - if (!$type->contains($int->value)) { - $type->min_bound = TIntRange::getNewLowestBound($type->min_bound, $int->value); - $type->max_bound = TIntRange::getNewHighestBound($type->max_bound, $int->value); - } - } - - $combination->value_types['int'] = $type; - } elseif (!isset($combination->value_types['int'])) { - $combination->value_types['int'] = $type; - } else { - $old_type = $combination->value_types['int']; - if ($old_type instanceof TIntRange) { - $type->min_bound = TIntRange::getNewLowestBound($old_type->min_bound, $type->min_bound); - $type->max_bound = TIntRange::getNewHighestBound($old_type->max_bound, $type->max_bound); - } elseif ($old_type instanceof TPositiveInt) { - $type->min_bound = TIntRange::getNewLowestBound($type->min_bound, 0); - $type->max_bound = null; - } else { - $type = new TInt(); - } - $combination->value_types['int'] = $type; - } - } else { - $combination->value_types['int'] = $type; - } - - $combination->ints = null; - } - - if ($had_zero - && isset($combination->value_types['int']) - && $combination->value_types['int'] instanceof TPositiveInt - ) { - if ($combination->ints === null) { - $combination->ints = ['int(0)' => new TLiteralInt(0)]; - } elseif ($type instanceof TLiteralInt && $type->value < 0) { - $combination->ints = null; - $combination->value_types['int'] = new TInt(); - } - } - } - - /** - * @return array - */ - private static function getSharedTypes(TypeCombination $combination, Codebase $codebase): array - { - /** @var array|null */ - $shared_classlikes = null; - - if ($combination->strings) { - foreach ($combination->strings as $string_type) { - $classlikes = self::getClassLikes($codebase, $string_type->value); - - if ($shared_classlikes === null) { - $shared_classlikes = $classlikes; - } elseif ($shared_classlikes) { - $shared_classlikes = array_intersect_key($shared_classlikes, $classlikes); - } - } - } - - if ($combination->class_string_types) { - foreach ($combination->class_string_types as $value_type) { - if ($value_type instanceof TNamedObject) { - $classlikes = self::getClassLikes($codebase, $value_type->value); - - if ($shared_classlikes === null) { - $shared_classlikes = $classlikes; - } elseif ($shared_classlikes) { - $shared_classlikes = array_intersect_key($shared_classlikes, $classlikes); - } - } - } - } - - return $shared_classlikes ?: []; - } - - /** - * @return array - */ - private static function getClassLikes(Codebase $codebase, string $fq_classlike_name): array - { - try { - $class_storage = $codebase->classlike_storage_provider->get($fq_classlike_name); - } catch (InvalidArgumentException $e) { - return []; - } - - $classlikes = []; - - $classlikes[$fq_classlike_name] = true; - - foreach ($class_storage->parent_classes as $parent_class) { - $classlikes[$parent_class] = true; - } - - foreach ($class_storage->parent_interfaces as $parent_interface) { - $classlikes[$parent_interface] = true; - } - - foreach ($class_storage->class_implements as $interface) { - $classlikes[$interface] = true; - } - - return $classlikes; - } - - /** - * @return list - */ - private static function handleKeyedArrayEntries( - TypeCombination $combination, - bool $overwrite_empty_array - ): array { - $new_types = []; - - if ($combination->array_type_params - && $combination->array_type_params[0]->allStringLiterals() - && $combination->array_always_filled - ) { - foreach ($combination->array_type_params[0]->getAtomicTypes() as $atomic_key_type) { - if ($atomic_key_type instanceof TLiteralString) { - $combination->objectlike_entries[$atomic_key_type->value] - = $combination->array_type_params[1]; - } - } - - $combination->array_type_params = []; - $combination->objectlike_sealed = false; - } - - if (!$combination->array_type_params - || $combination->array_type_params[1]->isEmpty() - ) { - if (!$overwrite_empty_array - && ($combination->array_type_params - && ($combination->array_type_params[1]->isEmpty() - || $combination->array_type_params[1]->isMixed())) - ) { - foreach ($combination->objectlike_entries as $objectlike_entry) { - $objectlike_entry->possibly_undefined = true; - } - } - - if ($combination->objectlike_value_type - && $combination->objectlike_value_type->isMixed() - ) { - $combination->objectlike_entries = array_filter( - $combination->objectlike_entries, - function (Union $type): bool { - return !$type->possibly_undefined; - } - ); - } - - if ($combination->objectlike_entries) { - if ($combination->all_arrays_callable) { - $objectlike = new TCallableKeyedArray($combination->objectlike_entries); - } else { - $objectlike = new TKeyedArray($combination->objectlike_entries); - } - - if ($combination->objectlike_sealed && !$combination->array_type_params) { - $objectlike->sealed = true; - } - - if ($combination->objectlike_key_type) { - $objectlike->previous_key_type = $combination->objectlike_key_type; - } elseif ($combination->array_type_params - && $combination->array_type_params[0]->isArrayKey() - ) { - $objectlike->previous_key_type = $combination->array_type_params[0]; - } - - if ($combination->objectlike_value_type) { - $objectlike->previous_value_type = $combination->objectlike_value_type; - } elseif ($combination->array_type_params - && $combination->array_type_params[1]->isMixed() - ) { - $objectlike->previous_value_type = $combination->array_type_params[1]; - } - - if ($combination->all_arrays_lists) { - $objectlike->is_list = true; - } - - $new_types[] = $objectlike; - } else { - $new_types[] = new TArray([Type::getArrayKey(), Type::getMixed()]); - } - - // if we're merging an empty array with an object-like, clobber empty array - $combination->array_type_params = []; - } - - return $new_types; - } - - /** - * @param array{Union, Union} $generic_type_params - */ - private static function getArrayTypeFromGenericParams( - ?Codebase $codebase, - TypeCombination $combination, - bool $overwrite_empty_array, - bool $allow_mixed_union, - Atomic $type, - array $generic_type_params - ): Atomic { - if ($combination->objectlike_entries) { - $objectlike_generic_type = null; - - $objectlike_keys = []; - - foreach ($combination->objectlike_entries as $property_name => $property_type) { - $objectlike_generic_type = Type::combineUnionTypes( - clone $property_type, - $objectlike_generic_type, - $codebase, - $overwrite_empty_array - ); - - if (is_int($property_name)) { - $objectlike_keys[$property_name] = new TLiteralInt($property_name); - } elseif ($type instanceof TKeyedArray && isset($type->class_strings[$property_name])) { - $objectlike_keys[$property_name] = new TLiteralClassString($property_name); - } else { - $objectlike_keys[$property_name] = new TLiteralString($property_name); - } - } - - if ($combination->objectlike_value_type) { - $objectlike_generic_type = Type::combineUnionTypes( - $combination->objectlike_value_type, - $objectlike_generic_type, - $codebase, - $overwrite_empty_array - ); - } - - $objectlike_generic_type->possibly_undefined = false; - - $objectlike_key_type = new Union(array_values($objectlike_keys)); - - $objectlike_key_type = Type::combineUnionTypes( - $combination->objectlike_key_type, - $objectlike_key_type, - $codebase, - $overwrite_empty_array - ); - - $generic_type_params[0] = Type::combineUnionTypes( - $generic_type_params[0], - $objectlike_key_type, - $codebase, - $overwrite_empty_array, - $allow_mixed_union - ); - - if (!$generic_type_params[1]->isMixed()) { - $generic_type_params[1] = Type::combineUnionTypes( - $generic_type_params[1], - $objectlike_generic_type, - $codebase, - $overwrite_empty_array, - $allow_mixed_union - ); - } - } - - if ($combination->all_arrays_callable) { - $array_type = new TCallableArray($generic_type_params); - } elseif ($combination->array_always_filled - || ($combination->array_sometimes_filled && $overwrite_empty_array) - || ($combination->objectlike_entries - && $combination->objectlike_sealed - && $overwrite_empty_array) - ) { - if ($combination->all_arrays_lists) { - if ($combination->objectlike_entries - && $combination->objectlike_sealed - ) { - $array_type = new TKeyedArray([$generic_type_params[1]]); - $array_type->previous_key_type = Type::getInt(); - $array_type->previous_value_type = $combination->array_type_params[1]; - $array_type->is_list = true; - } else { - $array_type = new TNonEmptyList($generic_type_params[1]); - - if ($combination->array_counts && count($combination->array_counts) === 1) { - $array_type->count = array_keys($combination->array_counts)[0]; - } - } - } else { - $array_type = new TNonEmptyArray($generic_type_params); - - if ($combination->array_counts && count($combination->array_counts) === 1) { - $array_type->count = array_keys($combination->array_counts)[0]; - } - } - } else { - if ($combination->all_arrays_class_string_maps - && count($combination->class_string_map_as_types) === 1 - && count($combination->class_string_map_names) === 1 - ) { - $array_type = new TClassStringMap( - array_keys($combination->class_string_map_names)[0], - array_values($combination->class_string_map_as_types)[0], - $generic_type_params[1] - ); - } elseif ($combination->all_arrays_lists) { - $array_type = new TList($generic_type_params[1]); - } else { - $array_type = new TArray($generic_type_params); - } - } - - return $array_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php deleted file mode 100644 index 3709534e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php +++ /dev/null @@ -1,909 +0,0 @@ -getAtomicTypes() as $return_type_part) { - $parts = self::expandAtomic( - $codebase, - $return_type_part, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - if (is_array($parts)) { - $new_return_type_parts = array_merge($new_return_type_parts, $parts); - $has_array_output = true; - } else { - $new_return_type_parts[] = $parts; - } - } - - if ($has_array_output) { - $fleshed_out_type = TypeCombiner::combine( - $new_return_type_parts, - $codebase - ); - } else { - $fleshed_out_type = new Union($new_return_type_parts); - } - - $fleshed_out_type->from_docblock = $return_type->from_docblock; - $fleshed_out_type->ignore_nullable_issues = $return_type->ignore_nullable_issues; - $fleshed_out_type->ignore_falsable_issues = $return_type->ignore_falsable_issues; - $fleshed_out_type->possibly_undefined = $return_type->possibly_undefined; - $fleshed_out_type->possibly_undefined_from_try = $return_type->possibly_undefined_from_try; - $fleshed_out_type->by_ref = $return_type->by_ref; - $fleshed_out_type->initialized = $return_type->initialized; - $fleshed_out_type->from_property = $return_type->from_property; - $fleshed_out_type->from_static_property = $return_type->from_static_property; - $fleshed_out_type->had_template = $return_type->had_template; - $fleshed_out_type->parent_nodes = $return_type->parent_nodes; - - return $fleshed_out_type; - } - - /** - * @param string|TNamedObject|TTemplateParam|null $static_class_type - * - * @return Atomic|non-empty-list - */ - public static function expandAtomic( - Codebase $codebase, - Atomic &$return_type, - ?string $self_class, - $static_class_type, - ?string $parent_class, - bool $evaluate_class_constants = true, - bool $evaluate_conditional_types = false, - bool $final = false, - bool $expand_generic = false, - bool $expand_templates = false - ) { - if ($return_type instanceof TNamedObject - || $return_type instanceof TTemplateParam - ) { - if ($return_type->extra_types) { - $new_intersection_types = []; - - foreach ($return_type->extra_types as &$extra_type) { - self::expandAtomic( - $codebase, - $extra_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $expand_generic, - $expand_templates - ); - - if ($extra_type instanceof TNamedObject && $extra_type->extra_types) { - $new_intersection_types = array_merge( - $new_intersection_types, - $extra_type->extra_types - ); - $extra_type->extra_types = []; - } - } - - if ($new_intersection_types) { - $return_type->extra_types = array_merge($return_type->extra_types, $new_intersection_types); - } - } - - if ($return_type instanceof TNamedObject) { - $return_type = self::expandNamedObject( - $codebase, - $return_type, - $self_class, - $static_class_type, - $parent_class, - $final, - $expand_generic - ); - } - } - - if ($return_type instanceof TClassString - && $return_type->as_type - ) { - $new_as_type = clone $return_type->as_type; - - self::expandAtomic( - $codebase, - $new_as_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - if ($new_as_type instanceof TNamedObject) { - $return_type->as_type = $new_as_type; - $return_type->as = $return_type->as_type->value; - } - } elseif ($return_type instanceof TTemplateParam) { - $new_as_type = self::expandUnion( - $codebase, - clone $return_type->as, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - if ($expand_templates) { - return array_values($new_as_type->getAtomicTypes()); - } - - $return_type->as = $new_as_type; - } - - if ($return_type instanceof TClassConstant) { - if ($return_type->fq_classlike_name === 'self' && $self_class) { - $return_type->fq_classlike_name = $self_class; - } - - if ($return_type->fq_classlike_name === 'static' && $self_class) { - $return_type->fq_classlike_name = is_string($static_class_type) ? $static_class_type : $self_class; - } - - if ($evaluate_class_constants && $codebase->classOrInterfaceOrEnumExists($return_type->fq_classlike_name)) { - if (strtolower($return_type->const_name) === 'class') { - return new TLiteralClassString($return_type->fq_classlike_name); - } - - $class_storage = $codebase->classlike_storage_provider->get($return_type->fq_classlike_name); - - if (strpos($return_type->const_name, '*') !== false) { - $matching_constants = array_merge( - array_keys($class_storage->constants), - array_keys($class_storage->enum_cases) - ); - - $const_name_part = substr($return_type->const_name, 0, -1); - - if ($const_name_part) { - $matching_constants = array_filter( - $matching_constants, - function ($constant_name) use ($const_name_part): bool { - return $constant_name !== $const_name_part - && strpos($constant_name, $const_name_part) === 0; - } - ); - } - } else { - $matching_constants = [$return_type->const_name]; - } - - $matching_constant_types = []; - - foreach ($matching_constants as $matching_constant) { - try { - $class_constant = $codebase->classlikes->getClassConstantType( - $return_type->fq_classlike_name, - $matching_constant, - ReflectionProperty::IS_PRIVATE - ); - } catch (CircularReferenceException $e) { - $class_constant = null; - } - - if ($class_constant) { - if ($class_constant->isSingle()) { - $class_constant = clone $class_constant; - - $matching_constant_types = array_merge( - array_values($class_constant->getAtomicTypes()), - $matching_constant_types - ); - } - } - } - - if ($matching_constant_types) { - return $matching_constant_types; - } - } - - return $return_type; - } - - if ($return_type instanceof TTypeAlias) { - $declaring_fq_classlike_name = $return_type->declaring_fq_classlike_name; - - if ($declaring_fq_classlike_name === 'self' && $self_class) { - $declaring_fq_classlike_name = $self_class; - } - - if ($evaluate_class_constants && $codebase->classOrInterfaceExists($declaring_fq_classlike_name)) { - $class_storage = $codebase->classlike_storage_provider->get($declaring_fq_classlike_name); - - $type_alias_name = $return_type->alias_name; - - if (isset($class_storage->type_aliases[$type_alias_name])) { - $resolved_type_alias = $class_storage->type_aliases[$type_alias_name]; - - if ($resolved_type_alias->replacement_atomic_types) { - $replacement_atomic_types = $resolved_type_alias->replacement_atomic_types; - - $recursively_fleshed_out_types = []; - - foreach ($replacement_atomic_types as $replacement_atomic_type) { - $recursively_fleshed_out_type = self::expandAtomic( - $codebase, - $replacement_atomic_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - if (is_array($recursively_fleshed_out_type)) { - $recursively_fleshed_out_types = array_merge( - $recursively_fleshed_out_type, - $recursively_fleshed_out_types - ); - } else { - $recursively_fleshed_out_types[] = $recursively_fleshed_out_type; - } - } - - return $recursively_fleshed_out_types; - } - } - } - - return $return_type; - } - - if ($return_type instanceof TKeyOfClassConstant - || $return_type instanceof TValueOfClassConstant - ) { - if ($return_type->fq_classlike_name === 'self' && $self_class) { - $return_type->fq_classlike_name = $self_class; - } - - if ($evaluate_class_constants && $codebase->classOrInterfaceExists($return_type->fq_classlike_name)) { - try { - $class_constant_type = $codebase->classlikes->getClassConstantType( - $return_type->fq_classlike_name, - $return_type->const_name, - ReflectionProperty::IS_PRIVATE - ); - } catch (CircularReferenceException $e) { - $class_constant_type = null; - } - - if ($class_constant_type) { - foreach ($class_constant_type->getAtomicTypes() as $const_type_atomic) { - if ($const_type_atomic instanceof TKeyedArray - || $const_type_atomic instanceof TArray - ) { - if ($const_type_atomic instanceof TKeyedArray) { - $const_type_atomic = $const_type_atomic->getGenericArrayType(); - } - - if ($return_type instanceof TKeyOfClassConstant) { - return array_values($const_type_atomic->type_params[0]->getAtomicTypes()); - } - - return array_values($const_type_atomic->type_params[1]->getAtomicTypes()); - } - } - } - } - - return $return_type; - } - - if ($return_type instanceof TIntMask) { - if (!$evaluate_class_constants) { - return new TInt(); - } - - $potential_ints = []; - - foreach ($return_type->values as $value_type) { - $new_value_type = self::expandAtomic( - $codebase, - $value_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - if (is_array($new_value_type)) { - $new_value_type = reset($new_value_type); - } - - if (!$new_value_type instanceof TLiteralInt) { - return new TInt(); - } - - $potential_ints[] = $new_value_type->value; - } - - return TypeParser::getComputedIntsFromMask($potential_ints); - } - - if ($return_type instanceof TIntMaskOf) { - if (!$evaluate_class_constants) { - return new TInt(); - } - - $value_type = $return_type->value; - - $new_value_types = self::expandAtomic( - $codebase, - $value_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - if (!is_array($new_value_types)) { - return new TInt(); - } - - $potential_ints = []; - - foreach ($new_value_types as $new_value_type) { - if (!$new_value_type instanceof TLiteralInt) { - return new TInt(); - } - - $potential_ints[] = $new_value_type->value; - } - - return TypeParser::getComputedIntsFromMask($potential_ints); - } - - if ($return_type instanceof TArray - || $return_type instanceof TGenericObject - || $return_type instanceof TIterable - ) { - foreach ($return_type->type_params as $k => $type_param) { - /** @psalm-suppress PropertyTypeCoercion */ - $return_type->type_params[$k] = self::expandUnion( - $codebase, - $type_param, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - } - } elseif ($return_type instanceof TKeyedArray) { - foreach ($return_type->properties as &$property_type) { - $property_type = self::expandUnion( - $codebase, - $property_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - } - } elseif ($return_type instanceof TList) { - $return_type->type_param = self::expandUnion( - $codebase, - $return_type->type_param, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - } - - if ($return_type instanceof TObjectWithProperties) { - foreach ($return_type->properties as &$property_type) { - $property_type = self::expandUnion( - $codebase, - $property_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - } - } - - if ($return_type instanceof TCallable - || $return_type instanceof TClosure - ) { - if ($return_type->params) { - foreach ($return_type->params as $param) { - if ($param->type) { - $param->type = self::expandUnion( - $codebase, - $param->type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - } - } - } - if ($return_type->return_type) { - $return_type->return_type = self::expandUnion( - $codebase, - $return_type->return_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - } - } - - if ($return_type instanceof TConditional) { - return self::expandConditional( - $codebase, - $return_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - } - - return $return_type; - } - - /** - * @param string|TNamedObject|TTemplateParam|null $static_class_type - * @return TNamedObject|TTemplateParam - */ - private static function expandNamedObject( - Codebase $codebase, - TNamedObject $return_type, - ?string $self_class, - $static_class_type, - ?string $parent_class, - bool $final = false, - bool &$expand_generic = false - ) { - if ($expand_generic - && get_class($return_type) === TNamedObject::class - && !$return_type->extra_types - && $codebase->classOrInterfaceExists($return_type->value) - ) { - $value = $codebase->classlikes->getUnAliasedName($return_type->value); - $container_class_storage = $codebase->classlike_storage_provider->get( - $value - ); - - if ($container_class_storage->template_types - && array_filter( - $container_class_storage->template_types, - function ($type_map) { - return !reset($type_map)->hasMixed(); - } - ) - ) { - $return_type = new TGenericObject( - $return_type->value, - array_values( - array_map( - function ($type_map) { - return clone reset($type_map); - }, - $container_class_storage->template_types - ) - ) - ); - - // we don't want to expand generic types recursively - $expand_generic = false; - } - } - - $return_type_lc = strtolower($return_type->value); - - if ($static_class_type && ($return_type_lc === 'static' || $return_type_lc === '$this')) { - if (is_string($static_class_type)) { - $return_type->value = $static_class_type; - } else { - if ($return_type instanceof TGenericObject - && $static_class_type instanceof TGenericObject - ) { - $return_type->value = $static_class_type->value; - } else { - $return_type = clone $static_class_type; - } - } - - if (!$final && $return_type instanceof TNamedObject) { - $return_type->was_static = true; - } - } elseif ($return_type->was_static - && ($static_class_type instanceof TNamedObject - || $static_class_type instanceof TTemplateParam) - ) { - $return_type = clone $return_type; - $cloned_static = clone $static_class_type; - $extra_static = $cloned_static->extra_types ?: []; - $cloned_static->extra_types = null; - - if ($cloned_static->getKey(false) !== $return_type->getKey(false)) { - $return_type->extra_types[$static_class_type->getKey()] = clone $cloned_static; - } - - foreach ($extra_static as $extra_static_type) { - if ($extra_static_type->getKey(false) !== $return_type->getKey(false)) { - $return_type->extra_types[$extra_static_type->getKey()] = clone $extra_static_type; - } - } - } elseif ($return_type->was_static && is_string($static_class_type) && $final) { - $return_type->value = $static_class_type; - $return_type->was_static = false; - } elseif ($self_class && $return_type_lc === 'self') { - $return_type->value = $self_class; - } elseif ($parent_class && $return_type_lc === 'parent') { - $return_type->value = $parent_class; - } else { - $return_type->value = $codebase->classlikes->getUnAliasedName($return_type->value); - } - - return $return_type; - } - - /** - * @param string|TNamedObject|TTemplateParam|null $static_class_type - * - * @return Atomic|non-empty-list - */ - private static function expandConditional( - Codebase $codebase, - TConditional $return_type, - ?string $self_class, - $static_class_type, - ?string $parent_class, - bool $evaluate_class_constants = true, - bool $evaluate_conditional_types = false, - bool $final = false, - bool $expand_generic = false, - bool $expand_templates = false - ) { - $new_as_type = self::expandUnion( - $codebase, - $return_type->as_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - $return_type->as_type = $new_as_type; - - if ($evaluate_conditional_types) { - $assertion = null; - - if ($return_type->conditional_type->isSingle()) { - foreach ($return_type->conditional_type->getAtomicTypes() as $condition_atomic_type) { - $candidate = self::expandAtomic( - $codebase, - $condition_atomic_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - if (!is_array($candidate)) { - $assertion = $candidate->getAssertionString(); - } - } - } - - $if_conditional_return_types = []; - - foreach ($return_type->if_type->getAtomicTypes() as $if_atomic_type) { - $candidate = self::expandAtomic( - $codebase, - $if_atomic_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - $candidate_types = is_array($candidate) ? $candidate : [$candidate]; - - $if_conditional_return_types = array_merge( - $if_conditional_return_types, - $candidate_types - ); - } - - $else_conditional_return_types = []; - - foreach ($return_type->else_type->getAtomicTypes() as $else_atomic_type) { - $candidate = self::expandAtomic( - $codebase, - $else_atomic_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - $candidate_types = is_array($candidate) ? $candidate : [$candidate]; - - $else_conditional_return_types = array_merge( - $else_conditional_return_types, - $candidate_types - ); - } - - if ($assertion && $return_type->param_name === (string) $return_type->if_type) { - $if_conditional_return_type = TypeCombiner::combine( - $if_conditional_return_types, - $codebase - ); - - $if_conditional_return_type = SimpleAssertionReconciler::reconcile( - $assertion, - $codebase, - $if_conditional_return_type - ); - - - if ($if_conditional_return_type) { - $if_conditional_return_types = array_values($if_conditional_return_type->getAtomicTypes()); - } - } - - if ($assertion && $return_type->param_name === (string) $return_type->else_type) { - $else_conditional_return_type = TypeCombiner::combine( - $else_conditional_return_types, - $codebase - ); - - $else_conditional_return_type = SimpleNegatedAssertionReconciler::reconcile( - $codebase, - $assertion, - $else_conditional_return_type - ); - - if ($else_conditional_return_type) { - $else_conditional_return_types = array_values($else_conditional_return_type->getAtomicTypes()); - } - } - - $all_conditional_return_types = array_merge( - $if_conditional_return_types, - $else_conditional_return_types - ); - - $number_of_types = count($all_conditional_return_types); - // we filter TNever and TEmpty that have no bearing on the return type - if ($number_of_types > 1) { - $all_conditional_return_types = array_filter( - $all_conditional_return_types, - static function (Atomic $atomic_type): bool { - return !($atomic_type instanceof TEmpty - || $atomic_type instanceof TNever); - } - ); - } - - // if we still have more than one type, we remove TVoid and replace it by TNull - $number_of_types = count($all_conditional_return_types); - if ($number_of_types > 1) { - $all_conditional_return_types = array_filter( - $all_conditional_return_types, - static function (Atomic $atomic_type): bool { - return !$atomic_type instanceof TVoid; - } - ); - - if (count($all_conditional_return_types) !== $number_of_types) { - $null_type = new TNull(); - $null_type->from_docblock = true; - $all_conditional_return_types[] = $null_type; - } - } - - if ($all_conditional_return_types) { - $combined = TypeCombiner::combine( - array_values($all_conditional_return_types), - $codebase - ); - - return array_values($combined->getAtomicTypes()); - } - } - - $return_type->conditional_type = self::expandUnion( - $codebase, - $return_type->conditional_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - $return_type->if_type = self::expandUnion( - $codebase, - $return_type->if_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - $return_type->else_type = self::expandUnion( - $codebase, - $return_type->else_type, - $self_class, - $static_class_type, - $parent_class, - $evaluate_class_constants, - $evaluate_conditional_types, - $final, - $expand_generic, - $expand_templates - ); - - return $return_type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php deleted file mode 100644 index fbcad54d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php +++ /dev/null @@ -1,1336 +0,0 @@ - $type_tokens - * @param array{int,int}|null $php_version - * @param array> $template_type_map - * @param array $type_aliases - * - */ - public static function parseTokens( - array $type_tokens, - ?array $php_version = null, - array $template_type_map = [], - array $type_aliases = [] - ): Union { - if (count($type_tokens) === 1) { - $only_token = $type_tokens[0]; - - // Note: valid identifiers can include class names or $this - if (!preg_match('@^(\$this|\\\\?[a-zA-Z_\x7f-\xff][\\\\\-0-9a-zA-Z_\x7f-\xff]*)$@', $only_token[0])) { - if (!is_numeric($only_token[0]) - && strpos($only_token[0], '\'') !== false - && strpos($only_token[0], '"') !== false - ) { - throw new TypeParseTreeException("Invalid type '$only_token[0]'"); - } - } else { - $only_token[0] = TypeTokenizer::fixScalarTerms($only_token[0], $php_version); - - $atomic = Atomic::create($only_token[0], $php_version, $template_type_map, $type_aliases); - $atomic->offset_start = 0; - $atomic->offset_end = strlen($only_token[0]); - $atomic->text = isset($only_token[2]) && $only_token[2] !== $only_token[0] ? $only_token[2] : null; - - return new Union([$atomic]); - } - } - - $parse_tree = (new ParseTreeCreator($type_tokens))->create(); - $codebase = ProjectAnalyzer::getInstance()->getCodebase(); - $parsed_type = self::getTypeFromTree( - $parse_tree, - $codebase, - $php_version, - $template_type_map, - $type_aliases - ); - - if (!($parsed_type instanceof Union)) { - $parsed_type = new Union([$parsed_type]); - } - - return $parsed_type; - } - - /** - * @param array{int,int}|null $php_version - * @param array> $template_type_map - * @param array $type_aliases - * - * @return Atomic|Union - */ - public static function getTypeFromTree( - ParseTree $parse_tree, - Codebase $codebase, - ?array $php_version = null, - array $template_type_map = [], - array $type_aliases = [] - ): TypeNode { - if ($parse_tree instanceof GenericTree) { - return self::getTypeFromGenericTree( - $parse_tree, - $codebase, - $template_type_map, - $type_aliases - ); - } - - if ($parse_tree instanceof UnionTree) { - return self::getTypeFromUnionTree($parse_tree, $codebase, $template_type_map, $type_aliases); - } - - if ($parse_tree instanceof IntersectionTree) { - return self::getTypeFromIntersectionTree($parse_tree, $codebase, $template_type_map, $type_aliases); - } - - if ($parse_tree instanceof KeyedArrayTree) { - return self::getTypeFromKeyedArrayTree($parse_tree, $codebase, $template_type_map, $type_aliases); - } - - if ($parse_tree instanceof CallableWithReturnTypeTree) { - $callable_type = self::getTypeFromTree( - $parse_tree->children[0], - $codebase, - null, - $template_type_map, - $type_aliases - ); - - if (!$callable_type instanceof TCallable && !$callable_type instanceof TClosure) { - throw new InvalidArgumentException('Parsing callable tree node should return TCallable'); - } - - if (!isset($parse_tree->children[1])) { - throw new TypeParseTreeException('Invalid return type'); - } - - $return_type = self::getTypeFromTree( - $parse_tree->children[1], - $codebase, - null, - $template_type_map, - $type_aliases - ); - - $callable_type->return_type = $return_type instanceof Union ? $return_type : new Union([$return_type]); - - return $callable_type; - } - - if ($parse_tree instanceof CallableTree) { - return self::getTypeFromCallableTree($parse_tree, $codebase, $template_type_map, $type_aliases); - } - - if ($parse_tree instanceof EncapsulationTree) { - if (!$parse_tree->terminated) { - throw new TypeParseTreeException('Unterminated parentheses'); - } - - if (!isset($parse_tree->children[0])) { - throw new TypeParseTreeException('Empty parentheses'); - } - - return self::getTypeFromTree( - $parse_tree->children[0], - $codebase, - null, - $template_type_map, - $type_aliases - ); - } - - if ($parse_tree instanceof NullableTree) { - if (!isset($parse_tree->children[0])) { - throw new TypeParseTreeException('Misplaced question mark'); - } - - $non_nullable_type = self::getTypeFromTree( - $parse_tree->children[0], - $codebase, - null, - $template_type_map, - $type_aliases - ); - - if ($non_nullable_type instanceof Union) { - $non_nullable_type->addType(new TNull); - - return $non_nullable_type; - } - - return TypeCombiner::combine([ - new TNull, - $non_nullable_type, - ]); - } - - if ($parse_tree instanceof MethodTree - || $parse_tree instanceof MethodWithReturnTypeTree - ) { - throw new TypeParseTreeException('Misplaced brackets'); - } - - if ($parse_tree instanceof IndexedAccessTree) { - return self::getTypeFromIndexAccessTree($parse_tree, $template_type_map); - } - - if ($parse_tree instanceof TemplateAsTree) { - return new TTemplateParam( - $parse_tree->param_name, - new Union([new TNamedObject($parse_tree->as)]), - 'class-string-map' - ); - } - - if ($parse_tree instanceof ConditionalTree) { - $template_param_name = $parse_tree->condition->param_name; - - if (!isset($template_type_map[$template_param_name])) { - throw new TypeParseTreeException('Unrecognized template \'' . $template_param_name . '\''); - } - - if (count($parse_tree->children) !== 2) { - throw new TypeParseTreeException('Invalid conditional'); - } - - $first_class = array_keys($template_type_map[$template_param_name])[0]; - - $conditional_type = self::getTypeFromTree( - $parse_tree->condition->children[0], - $codebase, - null, - $template_type_map, - $type_aliases - ); - - $if_type = self::getTypeFromTree( - $parse_tree->children[0], - $codebase, - null, - $template_type_map, - $type_aliases - ); - - $else_type = self::getTypeFromTree( - $parse_tree->children[1], - $codebase, - null, - $template_type_map, - $type_aliases - ); - - if ($conditional_type instanceof Atomic) { - $conditional_type = new Union([$conditional_type]); - } - - if ($if_type instanceof Atomic) { - $if_type = new Union([$if_type]); - } - - if ($else_type instanceof Atomic) { - $else_type = new Union([$else_type]); - } - - return new TConditional( - $template_param_name, - $first_class, - $template_type_map[$template_param_name][$first_class], - $conditional_type, - $if_type, - $else_type - ); - } - - if (!$parse_tree instanceof Value) { - throw new InvalidArgumentException('Unrecognised parse tree type ' . get_class($parse_tree)); - } - - if ($parse_tree->value[0] === '"' || $parse_tree->value[0] === '\'') { - return new TLiteralString(substr($parse_tree->value, 1, -1)); - } - - if (strpos($parse_tree->value, '::')) { - [$fq_classlike_name, $const_name] = explode('::', $parse_tree->value); - - if (isset($template_type_map[$fq_classlike_name]) && $const_name === 'class') { - $first_class = array_keys($template_type_map[$fq_classlike_name])[0]; - - return self::getGenericParamClass( - $fq_classlike_name, - $template_type_map[$fq_classlike_name][$first_class], - $first_class - ); - } - - if ($const_name === 'class') { - return new TLiteralClassString($fq_classlike_name); - } - - return new TClassConstant($fq_classlike_name, $const_name); - } - - if (preg_match('/^\-?(0|[1-9][0-9]*)(\.[0-9]{1,})$/', $parse_tree->value)) { - return new TLiteralFloat((float) $parse_tree->value); - } - - if (preg_match('/^\-?(0|[1-9][0-9]*)$/', $parse_tree->value)) { - return new TLiteralInt((int) $parse_tree->value); - } - - if (!preg_match('@^(\$this|\\\\?[a-zA-Z_\x7f-\xff][\\\\\-0-9a-zA-Z_\x7f-\xff]*)$@', $parse_tree->value)) { - throw new TypeParseTreeException('Invalid type \'' . $parse_tree->value . '\''); - } - - $atomic_type_string = TypeTokenizer::fixScalarTerms($parse_tree->value, $php_version); - - $atomic_type = Atomic::create($atomic_type_string, $php_version, $template_type_map, $type_aliases); - - $atomic_type->offset_start = $parse_tree->offset_start; - $atomic_type->offset_end = $parse_tree->offset_end; - $atomic_type->text = $parse_tree->text; - - return $atomic_type; - } - - private static function getGenericParamClass( - string $param_name, - Union $as, - string $defining_class - ): TTemplateParamClass { - if ($as->hasMixed()) { - return new TTemplateParamClass( - $param_name, - 'object', - null, - $defining_class - ); - } - - if (!$as->isSingle()) { - throw new TypeParseTreeException( - 'Invalid templated classname \'' . $as . '\'' - ); - } - - foreach ($as->getAtomicTypes() as $t) { - if ($t instanceof TObject) { - return new TTemplateParamClass( - $param_name, - 'object', - null, - $defining_class - ); - } - - if ($t instanceof TIterable) { - $traversable = new TGenericObject( - 'Traversable', - $t->type_params - ); - - $as->substitute(new Union([$t]), new Union([$traversable])); - - return new TTemplateParamClass( - $param_name, - $traversable->value, - $traversable, - $defining_class - ); - } - - if ($t instanceof TTemplateParam) { - $t_atomic_type = count($t->as->getAtomicTypes()) === 1 ? $t->as->getSingleAtomic() : null; - - if (!$t_atomic_type instanceof TNamedObject) { - $t_atomic_type = null; - } - - return new TTemplateParamClass( - $t->param_name, - $t_atomic_type->value ?? 'object', - $t_atomic_type, - $t->defining_class - ); - } - - if (!$t instanceof TNamedObject) { - throw new TypeParseTreeException( - 'Invalid templated classname \'' . $t->getId() . '\'' - ); - } - - return new TTemplateParamClass( - $param_name, - $t->value, - $t, - $defining_class - ); - } - - throw new LogicException('Should never get here'); - } - - /** - * @param non-empty-list $potential_ints - * @return non-empty-list - */ - public static function getComputedIntsFromMask(array $potential_ints): array - { - /** @var list */ - $potential_values = []; - - foreach ($potential_ints as $ith) { - $new_values = []; - - $new_values[] = $ith; - - if ($ith !== 0) { - foreach ($potential_values as $potential_value) { - $new_values[] = $ith | $potential_value; - } - } - - $potential_values = array_merge($new_values, $potential_values); - } - - array_unshift($potential_values, 0); - $potential_values = array_unique($potential_values); - - return array_map( - function ($int) { - return new TLiteralInt($int); - }, - array_values($potential_values) - ); - } - - /** - * @param array> $template_type_map - * @param array $type_aliases - * @return Atomic|Union - * @throws TypeParseTreeException - * @psalm-suppress ComplexMethod to be refactored - */ - private static function getTypeFromGenericTree( - GenericTree $parse_tree, - Codebase $codebase, - array $template_type_map, - array $type_aliases - ) { - $generic_type = $parse_tree->value; - - $generic_params = []; - - foreach ($parse_tree->children as $i => $child_tree) { - $tree_type = self::getTypeFromTree( - $child_tree, - $codebase, - null, - $template_type_map, - $type_aliases - ); - - if ($generic_type === 'class-string-map' - && $i === 0 - ) { - if ($tree_type instanceof TTemplateParam) { - $template_type_map[$tree_type->param_name] = ['class-string-map' => $tree_type->as]; - } elseif ($tree_type instanceof TNamedObject) { - $template_type_map[$tree_type->value] = ['class-string-map' => Type::getObject()]; - } - } - - $generic_params[] = $tree_type instanceof Union ? $tree_type : new Union([$tree_type]); - } - - $generic_type_value = TypeTokenizer::fixScalarTerms($generic_type); - - if (($generic_type_value === 'array' - || $generic_type_value === 'non-empty-array' - || $generic_type_value === 'associative-array') - && count($generic_params) === 1 - ) { - array_unshift($generic_params, new Union([new TArrayKey])); - } elseif (count($generic_params) === 1 - && in_array( - $generic_type_value, - ['iterable', 'Traversable', 'Iterator', 'IteratorAggregate', 'arraylike-object'], - true - ) - ) { - array_unshift($generic_params, new Union([new TMixed])); - } elseif ($generic_type_value === 'Generator') { - if (count($generic_params) === 1) { - array_unshift($generic_params, new Union([new TMixed])); - } - - for ($i = 0, $l = 4 - count($generic_params); $i < $l; ++$i) { - $generic_params[] = new Union([new TMixed]); - } - } - - if (!$generic_params) { - throw new TypeParseTreeException('No generic params provided for type'); - } - - if ($generic_type_value === 'array' || $generic_type_value === 'associative-array') { - if ($generic_params[0]->isMixed()) { - $generic_params[0] = Type::getArrayKey(); - } - - if (count($generic_params) !== 2) { - throw new TypeParseTreeException('Too many template parameters for array'); - } - - return new TArray($generic_params); - } - - if ($generic_type_value === 'arraylike-object') { - $traversable = new TGenericObject('Traversable', $generic_params); - $array_acccess = new TGenericObject('ArrayAccess', $generic_params); - $countable = new TNamedObject('Countable'); - - $traversable->extra_types[$array_acccess->getKey()] = $array_acccess; - $traversable->extra_types[$countable->getKey()] = $countable; - - return $traversable; - } - - if ($generic_type_value === 'non-empty-array') { - if ($generic_params[0]->isMixed()) { - $generic_params[0] = Type::getArrayKey(); - } - - if (count($generic_params) !== 2) { - throw new TypeParseTreeException('Too many template parameters for non-empty-array'); - } - - return new TNonEmptyArray($generic_params); - } - - if ($generic_type_value === 'iterable') { - return new TIterable($generic_params); - } - - if ($generic_type_value === 'list') { - return new TList($generic_params[0]); - } - - if ($generic_type_value === 'non-empty-list') { - return new TNonEmptyList($generic_params[0]); - } - - if ($generic_type_value === 'class-string' || $generic_type_value === 'interface-string') { - $class_name = (string)$generic_params[0]; - - if (isset($template_type_map[$class_name])) { - $first_class = array_keys($template_type_map[$class_name])[0]; - - return self::getGenericParamClass( - $class_name, - $template_type_map[$class_name][$first_class], - $first_class - ); - } - - $param_union_types = array_values($generic_params[0]->getAtomicTypes()); - - if (count($param_union_types) > 1) { - throw new TypeParseTreeException('Union types are not allowed in class string param'); - } - - if (!$param_union_types[0] instanceof TNamedObject) { - throw new TypeParseTreeException('Class string param should be a named object'); - } - - return new TClassString($class_name, $param_union_types[0]); - } - - if ($generic_type_value === 'class-string-map') { - if (count($generic_params) !== 2) { - throw new TypeParseTreeException( - 'There should only be two params for class-string-map, ' - . count($generic_params) . ' provided' - ); - } - - $template_marker_parts = array_values($generic_params[0]->getAtomicTypes()); - - $template_marker = $template_marker_parts[0]; - - $template_as_type = null; - - if ($template_marker instanceof TNamedObject) { - $template_param_name = $template_marker->value; - } elseif ($template_marker instanceof TTemplateParam) { - $template_param_name = $template_marker->param_name; - $template_as_type = $template_marker->as->getSingleAtomic(); - - if (!$template_as_type instanceof TNamedObject) { - throw new TypeParseTreeException( - 'Unrecognised as type' - ); - } - } else { - throw new TypeParseTreeException( - 'Unrecognised class-string-map templated param' - ); - } - - return new TClassStringMap( - $template_param_name, - $template_as_type, - $generic_params[1] - ); - } - - if ($generic_type_value === 'key-of') { - $param_name = (string)$generic_params[0]; - - if (isset($template_type_map[$param_name])) { - $defining_class = array_keys($template_type_map[$param_name])[0]; - - return new TTemplateKeyOf( - $param_name, - $defining_class, - $template_type_map[$param_name][$defining_class] - ); - } - - $param_union_types = array_values($generic_params[0]->getAtomicTypes()); - - if (count($param_union_types) > 1) { - throw new TypeParseTreeException('Union types are not allowed in key-of type'); - } - - if (!$param_union_types[0] instanceof TClassConstant) { - throw new TypeParseTreeException( - 'Untemplated key-of param ' . $param_name . ' should be a class constant' - ); - } - - return new TKeyOfClassConstant( - $param_union_types[0]->fq_classlike_name, - $param_union_types[0]->const_name - ); - } - - if ($generic_type_value === 'value-of') { - $param_name = (string)$generic_params[0]; - - $param_union_types = array_values($generic_params[0]->getAtomicTypes()); - - if (count($param_union_types) > 1) { - throw new TypeParseTreeException('Union types are not allowed in value-of type'); - } - - if (!$param_union_types[0] instanceof TClassConstant) { - throw new TypeParseTreeException( - 'Untemplated value-of param ' . $param_name . ' should be a class constant' - ); - } - - return new TValueOfClassConstant( - $param_union_types[0]->fq_classlike_name, - $param_union_types[0]->const_name - ); - } - - if ($generic_type_value === 'int-mask') { - $atomic_types = []; - - foreach ($generic_params as $generic_param) { - if (!$generic_param->isSingle()) { - throw new TypeParseTreeException( - 'int-mask types must all be non-union' - ); - } - - $generic_param_atomics = $generic_param->getAtomicTypes(); - - $atomic_type = reset($generic_param_atomics); - - if ($atomic_type instanceof TNamedObject) { - if (defined($atomic_type->value)) { - /** @var mixed */ - $constant_value = constant($atomic_type->value); - - if (!is_int($constant_value)) { - throw new TypeParseTreeException( - 'int-mask types must all be integer values' - ); - } - - $atomic_type = new TLiteralInt($constant_value); - } else { - throw new TypeParseTreeException( - 'int-mask types must all be integer values' - ); - } - } - - if (!$atomic_type instanceof TLiteralInt - && !($atomic_type instanceof TClassConstant - && strpos($atomic_type->const_name, '*') === false) - ) { - throw new TypeParseTreeException( - 'int-mask types must all be integer values or scalar class constants' - ); - } - - $atomic_types[] = $atomic_type; - } - - $potential_ints = []; - - foreach ($atomic_types as $atomic_type) { - if (!$atomic_type instanceof TLiteralInt) { - return new TIntMask($atomic_types); - } - - $potential_ints[] = $atomic_type->value; - } - - return new Union(self::getComputedIntsFromMask($potential_ints)); - } - - if ($generic_type_value === 'int-mask-of') { - $param_union_types = array_values($generic_params[0]->getAtomicTypes()); - - if (count($param_union_types) > 1) { - throw new TypeParseTreeException('Union types are not allowed in value-of type'); - } - - $param_type = $param_union_types[0]; - - if (!$param_type instanceof TClassConstant - && !$param_type instanceof TValueOfClassConstant - && !$param_type instanceof TKeyOfClassConstant - ) { - throw new TypeParseTreeException( - 'Invalid reference passed to int-mask-of' - ); - } elseif ($param_type instanceof TClassConstant - && strpos($param_type->const_name, '*') === false - ) { - throw new TypeParseTreeException( - 'Class constant passed to int-mask-of must be a wildcard type' - ); - } - - return new TIntMaskOf($param_type); - } - - if ($generic_type_value === 'int') { - if (count($generic_params) !== 2) { - throw new TypeParseTreeException('int range must have 2 params'); - } - assert(count($parse_tree->children) === 2); - - $get_int_range_bound = function (ParseTree $parse_tree, Union $generic_param, string $bound_name): ?int { - if (!$parse_tree instanceof Value - || count($generic_param->getAtomicTypes()) > 1 - || (!$generic_param->getSingleAtomic() instanceof TLiteralInt - && $parse_tree->value !== $bound_name - && $parse_tree->text !== $bound_name - ) - ) { - throw new TypeParseTreeException( - "Invalid type \"{$generic_param->getId()}\" as int $bound_name boundary" - ); - } - - $generic_param_atomic = $generic_param->getSingleAtomic(); - return $generic_param_atomic instanceof TLiteralInt ? $generic_param_atomic->value : null; - }; - - $min_bound = $get_int_range_bound($parse_tree->children[0], $generic_params[0], TIntRange::BOUND_MIN); - $max_bound = $get_int_range_bound($parse_tree->children[1], $generic_params[1], TIntRange::BOUND_MAX); - - if ($min_bound === null && $max_bound === null) { - return new TInt(); - } - - if ($min_bound === 1 && $max_bound === null) { - return new TPositiveInt(); - } - - if (is_int($min_bound) && is_int($max_bound) && $min_bound > $max_bound) { - throw new TypeParseTreeException( - "Min bound can't be greater than max bound, int<$min_bound, $max_bound> given" - ); - } - - return new TIntRange($min_bound, $max_bound); - } - - if (isset(TypeTokenizer::PSALM_RESERVED_WORDS[$generic_type_value]) - && $generic_type_value !== 'self' - && $generic_type_value !== 'static' - ) { - throw new TypeParseTreeException('Cannot create generic object with reserved word'); - } - - return new TGenericObject($generic_type_value, $generic_params); - } - - /** - * @param array> $template_type_map - * @param array $type_aliases - * @throws TypeParseTreeException - */ - private static function getTypeFromUnionTree( - UnionTree $parse_tree, - Codebase $codebase, - array $template_type_map, - array $type_aliases - ): Union { - $has_null = false; - - $atomic_types = []; - - foreach ($parse_tree->children as $child_tree) { - if ($child_tree instanceof NullableTree) { - if (!isset($child_tree->children[0])) { - throw new TypeParseTreeException('Invalid ? character'); - } - - $atomic_type = self::getTypeFromTree( - $child_tree->children[0], - $codebase, - null, - $template_type_map, - $type_aliases - ); - $has_null = true; - } else { - $atomic_type = self::getTypeFromTree( - $child_tree, - $codebase, - null, - $template_type_map, - $type_aliases - ); - } - - if ($atomic_type instanceof Union) { - foreach ($atomic_type->getAtomicTypes() as $type) { - $atomic_types[] = $type; - } - - continue; - } - - $atomic_types[] = $atomic_type; - } - - if ($has_null) { - $atomic_types[] = new TNull; - } - - if (!$atomic_types) { - throw new TypeParseTreeException( - 'No atomic types found' - ); - } - - return TypeCombiner::combine($atomic_types); - } - - /** - * @param array> $template_type_map - * @param array $type_aliases - * @throws TypeParseTreeException - */ - private static function getTypeFromIntersectionTree( - IntersectionTree $parse_tree, - Codebase $codebase, - array $template_type_map, - array $type_aliases - ): Atomic { - $intersection_types = array_map( - function (ParseTree $child_tree) use ($codebase, $template_type_map, $type_aliases) { - $atomic_type = self::getTypeFromTree( - $child_tree, - $codebase, - null, - $template_type_map, - $type_aliases - ); - - if (!$atomic_type instanceof Atomic) { - throw new TypeParseTreeException( - 'Intersection types cannot contain unions' - ); - } - - return $atomic_type; - }, - $parse_tree->children - ); - - $first_type = reset($intersection_types); - $last_type = end($intersection_types); - - $onlyTKeyedArray = $first_type instanceof TKeyedArray - || $last_type instanceof TKeyedArray; - - foreach ($intersection_types as $intersection_type) { - if (!$intersection_type instanceof TKeyedArray - && ($intersection_type !== $first_type - || !$first_type instanceof TArray) - && ($intersection_type !== $last_type - || !$last_type instanceof TArray) - ) { - $onlyTKeyedArray = false; - break; - } - } - - if ($onlyTKeyedArray) { - /** @var non-empty-array */ - $properties = []; - - if ($first_type instanceof TArray) { - array_shift($intersection_types); - } elseif ($last_type instanceof TArray) { - array_pop($intersection_types); - } - - /** @var TKeyedArray $intersection_type */ - foreach ($intersection_types as $intersection_type) { - foreach ($intersection_type->properties as $property => $property_type) { - if (!array_key_exists($property, $properties)) { - $properties[$property] = clone $property_type; - continue; - } - - $intersection_type = Type::intersectUnionTypes( - $properties[$property], - $property_type, - $codebase - ); - if ($intersection_type === null) { - throw new TypeParseTreeException( - 'Incompatible intersection types for "' . $property . '", ' - . $properties[$property] . ' and ' . $property_type - . ' provided' - ); - } - $properties[$property] = $intersection_type; - } - } - - $keyed_array = new TKeyedArray($properties); - - if ($first_type instanceof TArray) { - $keyed_array->previous_key_type = $first_type->type_params[0]; - $keyed_array->previous_value_type = $first_type->type_params[1]; - } elseif ($last_type instanceof TArray) { - $keyed_array->previous_key_type = $last_type->type_params[0]; - $keyed_array->previous_value_type = $last_type->type_params[1]; - } - - return $keyed_array; - } - - $keyed_intersection_types = []; - - if ($intersection_types[0] instanceof TTypeAlias) { - foreach ($intersection_types as $intersection_type) { - if (!$intersection_type instanceof TTypeAlias) { - throw new TypeParseTreeException( - 'Intersection types with a type alias can only be comprised of other type aliases, ' - . get_class($intersection_type) . ' provided' - ); - } - - $keyed_intersection_types[$intersection_type->getKey()] = $intersection_type; - } - - $first_type = array_shift($keyed_intersection_types); - - if ($keyed_intersection_types) { - $first_type->extra_types = $keyed_intersection_types; - } - } else { - foreach ($intersection_types as $intersection_type) { - if (!$intersection_type instanceof TIterable - && !$intersection_type instanceof TNamedObject - && !$intersection_type instanceof TTemplateParam - && !$intersection_type instanceof TObjectWithProperties - ) { - throw new TypeParseTreeException( - 'Intersection types must be all objects, ' - . get_class($intersection_type) . ' provided' - ); - } - - $keyed_intersection_types[$intersection_type instanceof TIterable - ? $intersection_type->getId() - : $intersection_type->getKey()] = $intersection_type; - } - - $intersect_static = false; - - if (isset($keyed_intersection_types['static'])) { - unset($keyed_intersection_types['static']); - $intersect_static = true; - } - - if (!$keyed_intersection_types && $intersect_static) { - return new TNamedObject('static'); - } - - $first_type = array_shift($keyed_intersection_types); - - if ($intersect_static - && $first_type instanceof TNamedObject - ) { - $first_type->was_static = true; - } - - if ($keyed_intersection_types) { - $first_type->extra_types = $keyed_intersection_types; - } - } - - return $first_type; - } - - /** - * @param array> $template_type_map - * @param array $type_aliases - * @return TCallable|TClosure - * @throws TypeParseTreeException - */ - private static function getTypeFromCallableTree( - CallableTree $parse_tree, - Codebase $codebase, - array $template_type_map, - array $type_aliases - ) { - $params = array_map( - /** - * @return FunctionLikeParameter - */ - function (ParseTree $child_tree) use ( - $codebase, - $template_type_map, - $type_aliases - ): FunctionLikeParameter { - $is_variadic = false; - $is_optional = false; - - if ($child_tree instanceof CallableParamTree) { - if (isset($child_tree->children[0])) { - $tree_type = self::getTypeFromTree( - $child_tree->children[0], - $codebase, - null, - $template_type_map, - $type_aliases - ); - } else { - $tree_type = new TMixed(); - } - - $is_variadic = $child_tree->variadic; - $is_optional = $child_tree->has_default; - } else { - if ($child_tree instanceof Value && strpos($child_tree->value, '$') > 0) { - $child_tree->value = preg_replace('/(.+)\$.*/', '$1', $child_tree->value); - } - - $tree_type = self::getTypeFromTree( - $child_tree, - $codebase, - null, - $template_type_map, - $type_aliases - ); - } - - $tree_type = $tree_type instanceof Union ? $tree_type : new Union([$tree_type]); - - $param = new FunctionLikeParameter( - '', - false, - $tree_type, - null, - null, - $is_optional, - false, - $is_variadic - ); - - // type is not authoritative - $param->signature_type = null; - - return $param; - }, - $parse_tree->children - ); - $pure = strpos($parse_tree->value, 'pure-') === 0 ? true : null; - - if (in_array(strtolower($parse_tree->value), ['closure', '\closure', 'pure-closure'], true)) { - return new TClosure('Closure', $params, null, $pure); - } - - return new TCallable('callable', $params, null, $pure); - } - - /** - * @param array> $template_type_map - * @throws TypeParseTreeException - */ - private static function getTypeFromIndexAccessTree( - IndexedAccessTree $parse_tree, - array $template_type_map - ): TTemplateIndexedAccess { - if (!isset($parse_tree->children[0]) || !$parse_tree->children[0] instanceof Value) { - throw new TypeParseTreeException('Unrecognised indexed access'); - } - - $offset_param_name = $parse_tree->value; - $array_param_name = $parse_tree->children[0]->value; - - if (!isset($template_type_map[$offset_param_name])) { - throw new TypeParseTreeException('Unrecognised template param ' . $offset_param_name); - } - - if (!isset($template_type_map[$array_param_name])) { - throw new TypeParseTreeException('Unrecognised template param ' . $array_param_name); - } - - $offset_template_data = $template_type_map[$offset_param_name]; - - $offset_defining_class = array_keys($offset_template_data)[0]; - - if (!$offset_defining_class - && isset($offset_template_data['']) - && $offset_template_data['']->isSingle() - ) { - $offset_template_type = $offset_template_data['']->getSingleAtomic(); - - if ($offset_template_type instanceof TTemplateKeyOf) { - $offset_defining_class = $offset_template_type->defining_class; - } - } - - $array_defining_class = array_keys($template_type_map[$array_param_name])[0]; - - if ($offset_defining_class !== $array_defining_class - && strpos($offset_defining_class, 'fn-') !== 0 - ) { - throw new TypeParseTreeException('Template params are defined in different locations'); - } - - return new TTemplateIndexedAccess( - $array_param_name, - $offset_param_name, - $array_defining_class - ); - } - - /** - * @param array> $template_type_map - * @param array $type_aliases - * @return TCallableKeyedArray|TKeyedArray|TObjectWithProperties - * @throws TypeParseTreeException - */ - private static function getTypeFromKeyedArrayTree( - KeyedArrayTree $parse_tree, - Codebase $codebase, - array $template_type_map, - array $type_aliases - ) { - $properties = []; - $class_strings = []; - - $type = $parse_tree->value; - - $is_tuple = true; - - foreach ($parse_tree->children as $i => $property_branch) { - $class_string = false; - - if (!$property_branch instanceof KeyedArrayPropertyTree) { - $property_type = self::getTypeFromTree( - $property_branch, - $codebase, - null, - $template_type_map, - $type_aliases - ); - $property_maybe_undefined = false; - $property_key = (string)$i; - } elseif (count($property_branch->children) === 1) { - $property_type = self::getTypeFromTree( - $property_branch->children[0], - $codebase, - null, - $template_type_map, - $type_aliases - ); - $property_maybe_undefined = $property_branch->possibly_undefined; - if (strpos($property_branch->value, '::')) { - [$fq_classlike_name, $const_name] = explode('::', $property_branch->value); - if ($const_name === 'class') { - $property_key = $fq_classlike_name; - $class_string = true; - } else { - $property_key = $property_branch->value; - } - } else { - $property_key = $property_branch->value; - } - $is_tuple = false; - } else { - throw new TypeParseTreeException( - 'Missing property type' - ); - } - - if ($property_key[0] === '\'' || $property_key[0] === '"') { - $property_key = stripslashes(substr($property_key, 1, -1)); - } - - if (!$property_type instanceof Union) { - $property_type = new Union([$property_type]); - } - - if ($property_maybe_undefined) { - $property_type->possibly_undefined = true; - } - - $properties[$property_key] = $property_type; - if ($class_string) { - $class_strings[$property_key] = true; - } - } - - if ($type !== 'array' && $type !== 'object' && $type !== 'callable-array') { - throw new TypeParseTreeException('Unexpected brace character'); - } - - if (!$properties) { - throw new TypeParseTreeException('No properties supplied for TKeyedArray'); - } - - if ($type === 'object') { - return new TObjectWithProperties($properties); - } - - if ($type === 'callable-array') { - return new TCallableKeyedArray($properties); - } - - $object_like = new TKeyedArray($properties, $class_strings); - - if ($is_tuple) { - $object_like->sealed = true; - $object_like->is_list = true; - } - - return $object_like; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php deleted file mode 100644 index 020a3b27..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php +++ /dev/null @@ -1,511 +0,0 @@ - - */ - public const PSALM_RESERVED_WORDS = [ - 'int' => true, - 'string' => true, - 'float' => true, - 'bool' => true, - 'false' => true, - 'true' => true, - 'object' => true, - 'empty' => true, - 'callable' => true, - 'array' => true, - 'non-empty-array' => true, - 'non-empty-string' => true, - 'non-falsy-string' => true, - 'iterable' => true, - 'null' => true, - 'mixed' => true, - 'numeric-string' => true, - 'class-string' => true, - 'interface-string' => true, - 'trait-string' => true, - 'callable-string' => true, - 'callable-array' => true, - 'callable-object' => true, - 'stringable-object' => true, - 'pure-callable' => true, - 'pure-Closure' => true, - 'mysql-escaped-string' => true, // deprecated - 'html-escaped-string' => true, // deprecated - 'literal-string' => true, - 'non-empty-literal-string' => true, - 'lowercase-string' => true, - 'non-empty-lowercase-string' => true, - 'positive-int' => true, - 'literal-int' => true, - 'boolean' => true, - 'integer' => true, - 'double' => true, - 'real' => true, - 'resource' => true, - 'void' => true, - 'self' => true, - 'static' => true, - 'scalar' => true, - 'numeric' => true, - 'no-return' => true, - 'never-return' => true, - 'never-returns' => true, - 'never' => true, - 'array-key' => true, - 'key-of' => true, - 'value-of' => true, - 'non-empty-countable' => true, - 'list' => true, - 'non-empty-list' => true, - 'class-string-map' => true, - 'open-resource' => true, - 'closed-resource' => true, - 'associative-array' => true, - 'arraylike-object' => true, - 'int-mask' => true, - 'int-mask-of' => true, - ]; - - /** - * @var array> - */ - private static $memoized_tokens = []; - - /** - * Tokenises a type string into an array of tuples where the first element - * contains the string token and the second element contains its offset, - * - * @return list - * - * @psalm-suppress PossiblyUndefinedIntArrayOffset - */ - public static function tokenize(string $string_type, bool $ignore_space = true): array - { - $type_tokens = [['', 0]]; - $was_char = false; - $quote_char = null; - $escaped = false; - - if (isset(self::$memoized_tokens[$string_type])) { - return self::$memoized_tokens[$string_type]; - } - - // index of last type token - $rtc = 0; - - $chars = str_split($string_type); - $was_space = false; - - for ($i = 0, $c = count($chars); $i < $c; ++$i) { - $char = $chars[$i]; - - if (!$quote_char && $char === ' ' && $ignore_space) { - $was_space = true; - continue; - } - - if ($was_space - && ($char === '$' - || ($char === '.' - && ($chars[$i + 1] ?? null) === '.' - && ($chars[$i + 2] ?? null) === '.' - && ($chars[$i + 3] ?? null) === '$')) - ) { - $type_tokens[++$rtc] = [' ', $i - 1]; - $type_tokens[++$rtc] = ['', $i]; - } elseif ($was_space - && ($char === 'a' || $char === 'i') - && ($chars[$i + 1] ?? null) === 's' - && ($chars[$i + 2] ?? null) === ' ' - ) { - $type_tokens[++$rtc] = [$char . 's', $i - 1]; - $type_tokens[++$rtc] = ['', ++$i]; - $was_char = false; - continue; - } elseif ($was_char) { - $type_tokens[++$rtc] = ['', $i]; - } - - if ($quote_char) { - if ($char === $quote_char && $i > 0 && !$escaped) { - $quote_char = null; - - $type_tokens[$rtc][0] .= $char; - $was_char = true; - - continue; - } - - $was_char = false; - - if ($char === '\\' - && !$escaped - && $i < $c - 1 - && ($chars[$i + 1] === $quote_char || $chars[$i + 1] === '\\') - ) { - $escaped = true; - continue; - } - - $escaped = false; - - $type_tokens[$rtc][0] .= $char; - - continue; - } - - if ($char === '"' || $char === '\'') { - if ($type_tokens[$rtc][0] === '') { - $type_tokens[$rtc] = [$char, $i]; - } else { - $type_tokens[++$rtc] = [$char, $i]; - } - - $quote_char = $char; - - $was_char = false; - $was_space = false; - - continue; - } - - if ($char === '<' - || $char === '>' - || $char === '|' - || $char === '?' - || $char === ',' - || $char === '{' - || $char === '}' - || $char === '[' - || $char === ']' - || $char === '(' - || $char === ')' - || $char === ' ' - || $char === '&' - || $char === '=' - ) { - if ($char === '(' - && $type_tokens[$rtc][0] === 'func_num_args' - && isset($chars[$i + 1]) - && $chars[$i + 1] === ')' - ) { - $type_tokens[$rtc][0] = 'func_num_args()'; - ++$i; - - continue; - } - - if ($type_tokens[$rtc][0] === '') { - $type_tokens[$rtc] = [$char, $i]; - } else { - $type_tokens[++$rtc] = [$char, $i]; - } - - $was_char = true; - $was_space = false; - - continue; - } - - if ($char === ':') { - if ($i + 1 < $c && $chars[$i + 1] === ':') { - if ($type_tokens[$rtc][0] === '') { - $type_tokens[$rtc] = ['::', $i]; - } else { - $type_tokens[++$rtc] = ['::', $i]; - } - - $was_char = true; - $was_space = false; - - ++$i; - - continue; - } - - if ($type_tokens[$rtc][0] === '') { - $type_tokens[$rtc] = [':', $i]; - } else { - $type_tokens[++$rtc] = [':', $i]; - } - - $was_char = true; - $was_space = false; - - continue; - } - - if ($char === '.') { - if ($i + 1 < $c - && is_numeric($chars[$i + 1]) - && $i > 0 - && is_numeric($chars[$i - 1]) - ) { - $type_tokens[$rtc][0] .= $char; - $was_char = false; - $was_space = false; - - continue; - } - - if ($i + 2 > $c || $chars[$i + 1] !== '.' || $chars[$i + 2] !== '.') { - throw new TypeParseTreeException('Unexpected token ' . $char); - } - - if ($type_tokens[$rtc][0] === '') { - $type_tokens[$rtc] = ['...', $i]; - } else { - $type_tokens[++$rtc] = ['...', $i]; - } - - $was_char = true; - $was_space = false; - - $i += 2; - - continue; - } - - $type_tokens[$rtc][0] .= $char; - $was_char = false; - $was_space = false; - } - - /** @var list $type_tokens */ - self::$memoized_tokens[$string_type] = $type_tokens; - - return $type_tokens; - } - - /** - * @param array{int,int}|null $php_version - * - * - * @psalm-pure - */ - public static function fixScalarTerms( - string $type_string, - ?array $php_version = null - ): string { - $type_string_lc = strtolower($type_string); - - switch ($type_string_lc) { - case 'int': - case 'void': - case 'float': - case 'string': - case 'bool': - case 'callable': - case 'iterable': - case 'array': - case 'object': - case 'true': - case 'false': - case 'null': - case 'mixed': - return $type_string_lc; - } - - switch ($type_string) { - case 'boolean': - return $php_version !== null ? $type_string : 'bool'; - - case 'integer': - return $php_version !== null ? $type_string : 'int'; - - case 'double': - case 'real': - return $php_version !== null ? $type_string : 'float'; - } - - return $type_string; - } - - /** - * @param array|null $template_type_map - * @param array|null $type_aliases - * - * @return list - */ - public static function getFullyQualifiedTokens( - string $string_type, - Aliases $aliases, - ?array $template_type_map = null, - ?array $type_aliases = null, - ?string $self_fqcln = null, - ?string $parent_fqcln = null, - bool $allow_assertions = false - ): array { - $type_tokens = self::tokenize($string_type); - - for ($i = 0, $l = count($type_tokens); $i < $l; ++$i) { - $string_type_token = $type_tokens[$i]; - - if (in_array( - $string_type_token[0], - [ - '<', '>', '|', '?', ',', '{', '}', ':', '::', '[', ']', '(', ')', '&', '=', '...', 'as', 'is', - ], - true - )) { - continue; - } - - if ($string_type_token[0][0] === '\\' - && strlen($string_type_token[0]) === 1 - ) { - throw new TypeParseTreeException("Backslash \"\\\" has to be part of class name."); - } - - if ($string_type_token[0][0] === '"' - || $string_type_token[0][0] === '\'' - || preg_match('/[0-9]/', $string_type_token[0][0]) - ) { - continue; - } - - if ($string_type_token[0][0] === '-' && is_numeric($string_type_token[0])) { - continue; - } - - if (isset($type_tokens[$i + 1]) - && $type_tokens[$i + 1][0] === ':' - && isset($type_tokens[$i - 1]) - && ($type_tokens[$i - 1][0] === '{' || $type_tokens[$i - 1][0] === ',') - ) { - continue; - } - - if ($i > 0 && $type_tokens[$i - 1][0] === '::') { - continue; - } - - if (strpos($string_type_token[0], '$')) { - $string_type_token[0] = preg_replace('/(.+)\$.*/', '$1', $string_type_token[0]); - } - - $fixed_token = !isset($type_tokens[$i + 1]) || $type_tokens[$i + 1][0] !== '(' - ? self::fixScalarTerms($string_type_token[0]) - : $string_type_token[0]; - - $type_tokens[$i][0] = $fixed_token; - $string_type_token[0] = $fixed_token; - - if ($string_type_token[0] === 'self' && $self_fqcln) { - $type_tokens[$i][0] = $self_fqcln; - continue; - } - - if ($string_type_token[0] === 'parent' && $parent_fqcln) { - $type_tokens[$i][0] = $parent_fqcln; - continue; - } - - if (isset(self::PSALM_RESERVED_WORDS[$string_type_token[0]])) { - continue; - } - - if (isset($template_type_map[$string_type_token[0]])) { - continue; - } - - if ($i > 1 - && ($type_tokens[$i - 2][0] === 'class-string-map') - && ($type_tokens[$i - 1][0] === '<') - ) { - $template_type_map[$string_type_token[0]] = true; - continue; - } - - if (isset($type_tokens[$i + 1]) - && isset($type_tokens[$i - 1]) - && ($type_tokens[$i - 1][0] === '{' || $type_tokens[$i - 1][0] === ',') - ) { - $next_char = $type_tokens[$i + 1][0]; - - if ($next_char === ':') { - continue; - } - - if ($next_char === '?' && isset($type_tokens[$i + 2]) && $type_tokens[$i + 2][0] === ':') { - continue; - } - } - - if ($string_type_token[0][0] === '$' || $string_type_token[0][0] === ' ') { - continue; - } - - if (isset($type_tokens[$i + 1]) && $type_tokens[$i + 1][0] === '(') { - continue; - } - - if ($allow_assertions && $string_type_token[0] === 'falsy') { - $type_tokens[$i][0] = 'false-y'; - continue; - } - - if ($string_type_token[0] === 'func_num_args()' - || $string_type_token[0] === 'PHP_MAJOR_VERSION' - || $string_type_token[0] === 'PHP_VERSION_ID' - ) { - continue; - } - - $type_tokens[$i][2] = $string_type_token[0]; - - if (isset($type_aliases[$string_type_token[0]])) { - $type_alias = $type_aliases[$string_type_token[0]]; - - if ($type_alias instanceof InlineTypeAlias) { - $replacement_tokens = $type_alias->replacement_tokens; - - array_unshift($replacement_tokens, ['(', $i]); - $replacement_tokens[] = [')', $i]; - - $diff = count($replacement_tokens) - 1; - - array_splice($type_tokens, $i, 1, $replacement_tokens); - - $i += $diff; - $l += $diff; - } - } else { - $type_tokens[$i][0] = Type::getFQCLNFromString( - $string_type_token[0], - $aliases - ); - } - } - - /** @var list */ - return $type_tokens; - } - - public static function clearCache(): void - { - self::$memoized_tokens = []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php deleted file mode 100644 index 94d55b17..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php +++ /dev/null @@ -1,63 +0,0 @@ -fq_classlike_name = $fq_classlike_name; - } - - protected function enterNode(TypeNode $type): ?int - { - if ($type instanceof TNamedObject) { - if (strtolower($type->value) === $this->fq_classlike_name) { - $this->contains_classlike = true; - return NodeVisitor::STOP_TRAVERSAL; - } - } - - if ($type instanceof TClassConstant) { - if (strtolower($type->fq_classlike_name) === $this->fq_classlike_name) { - $this->contains_classlike = true; - return NodeVisitor::STOP_TRAVERSAL; - } - } - - if ($type instanceof TLiteralClassString) { - if (strtolower($type->value) === $this->fq_classlike_name) { - $this->contains_classlike = true; - return NodeVisitor::STOP_TRAVERSAL; - } - } - - return null; - } - - public function matches(): bool - { - return $this->contains_classlike; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php deleted file mode 100644 index e7d3f066..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php +++ /dev/null @@ -1,45 +0,0 @@ -contains_literal = true; - return NodeVisitor::STOP_TRAVERSAL; - } - - if ($type instanceof TArray && $type->type_params[1]->isEmpty()) { - $this->contains_literal = true; - return NodeVisitor::STOP_TRAVERSAL; - } - - return null; - } - - public function matches(): bool - { - return $this->contains_literal; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php deleted file mode 100644 index 3846e766..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php +++ /dev/null @@ -1,31 +0,0 @@ -from_docblock = true; - - if ($type instanceof TTemplateParam - && $type->as->isMixed() - ) { - return NodeVisitor::DONT_TRAVERSE_CHILDREN; - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php deleted file mode 100644 index 1b3d365d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php +++ /dev/null @@ -1,50 +0,0 @@ - - */ - private $template_types = []; - - protected function enterNode(TypeNode $type): ?int - { - if ($type instanceof TTemplateParam) { - $this->template_types[] = $type; - } elseif ($type instanceof TTemplateParamClass) { - $extends = $type->as_type; - - $this->template_types[] = new TTemplateParam( - $type->param_name, - $extends ? new Union([$extends]) : Type::getMixed(), - $type->defining_class - ); - } elseif ($type instanceof TConditional) { - $this->template_types[] = new TTemplateParam( - $type->param_name, - Type::getMixed(), - $type->defining_class - ); - } - - return null; - } - - /** - * @return list - */ - public function getTemplateTypes(): array - { - return $this->template_types; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php deleted file mode 100644 index 7cb18b13..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php +++ /dev/null @@ -1,410 +0,0 @@ - - */ - private $suppressed_issues; - - /** - * @var array - */ - private $phantom_classes; - - /** - * @var bool - */ - private $inferred; - - /** - * @var bool - */ - private $inherited; - - /** - * @var bool - */ - private $prevent_template_covariance; - - /** @var bool */ - private $has_errors = false; - - private $calling_method_id; - - /** - * @param array $suppressed_issues - * @param array $phantom_classes - */ - public function __construct( - StatementsSource $source, - CodeLocation $code_location, - array $suppressed_issues, - array $phantom_classes = [], - bool $inferred = true, - bool $inherited = false, - bool $prevent_template_covariance = false, - ?string $calling_method_id = null - ) { - $this->source = $source; - $this->code_location = $code_location; - $this->suppressed_issues = $suppressed_issues; - $this->phantom_classes = $phantom_classes; - $this->inferred = $inferred; - $this->inherited = $inherited; - $this->prevent_template_covariance = $prevent_template_covariance; - $this->calling_method_id = $calling_method_id; - } - - /** - * @psalm-suppress MoreSpecificImplementedParamType - * - * @param Atomic|Union $type - * @return self::STOP_TRAVERSAL|self::DONT_TRAVERSE_CHILDREN|null - */ - protected function enterNode(TypeNode $type): ?int - { - if ($type->checked) { - return NodeVisitor::DONT_TRAVERSE_CHILDREN; - } - - if ($type instanceof TNamedObject) { - $this->checkNamedObject($type); - } elseif ($type instanceof TClassConstant) { - $this->checkScalarClassConstant($type); - } elseif ($type instanceof TTemplateParam) { - $this->checkTemplateParam($type); - } elseif ($type instanceof TResource) { - $this->checkResource($type); - } elseif ($type instanceof TArray) { - if (count($type->type_params) > 2) { - IssueBuffer::maybeAdd( - new TooManyTemplateParams( - $type->getId(). ' has too many template params, expecting 2', - $this->code_location - ), - $this->suppressed_issues - ); - } - } - - $type->checked = true; - - return null; - } - - public function hasErrors(): bool - { - return $this->has_errors; - } - - private function checkNamedObject(TNamedObject $atomic): void - { - $codebase = $this->source->getCodebase(); - - if ($this->code_location instanceof DocblockTypeLocation - && $codebase->store_node_types - && $atomic->offset_start !== null - && $atomic->offset_end !== null - ) { - $codebase->analyzer->addOffsetReference( - $this->source->getFilePath(), - $this->code_location->raw_file_start + $atomic->offset_start, - $this->code_location->raw_file_start + $atomic->offset_end, - $atomic->value - ); - } - - if ($this->calling_method_id - && $atomic->text !== null - ) { - $codebase->file_reference_provider->addMethodReferenceToClassMember( - $this->calling_method_id, - 'use:' . $atomic->text . ':' . md5($this->source->getFilePath()), - false - ); - } - - if (!isset($this->phantom_classes[strtolower($atomic->value)]) && - ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $this->source, - $atomic->value, - $this->code_location, - $this->source->getFQCLN(), - $this->calling_method_id, - $this->suppressed_issues, - new ClassLikeNameOptions($this->inferred, false, true, true, $atomic->from_docblock) - ) === false - ) { - $this->has_errors = true; - return; - } - - $fq_class_name_lc = strtolower($atomic->value); - - if (!$this->inherited - && $codebase->classlike_storage_provider->has($fq_class_name_lc) - && $this->source->getFQCLN() !== $atomic->value - ) { - $class_storage = $codebase->classlike_storage_provider->get($fq_class_name_lc); - - if ($class_storage->deprecated) { - IssueBuffer::maybeAdd( - new DeprecatedClass( - 'Class ' . $atomic->value . ' is marked as deprecated', - $this->code_location, - $atomic->value - ), - $this->source->getSuppressedIssues() + $this->suppressed_issues - ); - } - } - - if ($atomic instanceof TGenericObject) { - $this->checkGenericParams($atomic); - } - } - - private function checkGenericParams(TGenericObject $atomic): void - { - $codebase = $this->source->getCodebase(); - - try { - $class_storage = $codebase->classlike_storage_provider->get(strtolower($atomic->value)); - } catch (InvalidArgumentException $e) { - return; - } - - $expected_type_params = $class_storage->template_types ?: []; - $expected_param_covariants = $class_storage->template_covariants; - - $template_type_count = count($expected_type_params); - $template_param_count = count($atomic->type_params); - - if ($template_type_count > $template_param_count) { - IssueBuffer::maybeAdd( - new MissingTemplateParam( - $atomic->value . ' has missing template params, expecting ' - . $template_type_count, - $this->code_location - ), - $this->suppressed_issues - ); - } elseif ($template_type_count < $template_param_count) { - IssueBuffer::maybeAdd( - new TooManyTemplateParams( - $atomic->getId(). ' has too many template params, expecting ' - . $template_type_count, - $this->code_location - ), - $this->suppressed_issues - ); - } - - $expected_type_param_keys = array_keys($expected_type_params); - - foreach ($atomic->type_params as $i => $type_param) { - $this->prevent_template_covariance = $this->source instanceof MethodAnalyzer - && $this->source->getMethodName() !== '__construct' - && empty($expected_param_covariants[$i]); - - if (isset($expected_type_param_keys[$i])) { - $expected_template_name = $expected_type_param_keys[$i]; - - foreach ($expected_type_params[$expected_template_name] as $defining_class => $expected_type_param) { - $expected_type_param = TypeExpander::expandUnion( - $codebase, - $expected_type_param, - $defining_class, - null, - null - ); - - $type_param = TypeExpander::expandUnion( - $codebase, - $type_param, - $defining_class, - null, - null - ); - - if (!UnionTypeComparator::isContainedBy($codebase, $type_param, $expected_type_param)) { - IssueBuffer::maybeAdd( - new InvalidTemplateParam( - 'Extended template param ' . $expected_template_name - . ' of ' . $atomic->getId() - . ' expects type ' - . $expected_type_param->getId() - . ', type ' . $type_param->getId() . ' given', - $this->code_location - ), - $this->suppressed_issues - ); - } - } - } - } - } - - public function checkScalarClassConstant(TClassConstant $atomic): void - { - $fq_classlike_name = $atomic->fq_classlike_name === 'self' - ? $this->source->getClassName() - : $atomic->fq_classlike_name; - - if (!$fq_classlike_name) { - return; - } - - if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( - $this->source, - $fq_classlike_name, - $this->code_location, - null, - null, - $this->suppressed_issues, - new ClassLikeNameOptions($this->inferred, false, true, true, $atomic->from_docblock) - ) === false - ) { - $this->has_errors = true; - return; - } - - $const_name = $atomic->const_name; - if (strpos($const_name, '*') !== false) { - $expanded = TypeExpander::expandAtomic( - $this->source->getCodebase(), - $atomic, - $fq_classlike_name, - $fq_classlike_name, - null, - true, - true - ); - - $is_defined = is_array($expanded) && count($expanded) > 0; - } else { - $class_constant_type = $this->source->getCodebase()->classlikes->getClassConstantType( - $fq_classlike_name, - $atomic->const_name, - ReflectionProperty::IS_PRIVATE, - null - ); - - $is_defined = null !== $class_constant_type; - } - - if (!$is_defined) { - IssueBuffer::maybeAdd( - new UndefinedConstant( - 'Constant ' . $fq_classlike_name . '::' . $const_name . ' is not defined', - $this->code_location - ), - $this->source->getSuppressedIssues() - ); - } - } - - public function checkTemplateParam(TTemplateParam $atomic): void - { - if ($this->prevent_template_covariance - && strpos($atomic->defining_class, 'fn-') !== 0 - ) { - $codebase = $this->source->getCodebase(); - - $class_storage = $codebase->classlike_storage_provider->get($atomic->defining_class); - - $template_offset = $class_storage->template_types - ? array_search($atomic->param_name, array_keys($class_storage->template_types), true) - : false; - - if ($template_offset !== false - && isset($class_storage->template_covariants[$template_offset]) - && $class_storage->template_covariants[$template_offset] - ) { - $method_storage = $this->source instanceof MethodAnalyzer - ? $this->source->getFunctionLikeStorage() - : null; - - if ($method_storage instanceof MethodStorage - && $method_storage->mutation_free - && !$method_storage->mutation_free_inferred - ) { - // do nothing - } else { - IssueBuffer::maybeAdd( - new InvalidTemplateParam( - 'Template param ' . $atomic->param_name . ' of ' - . $atomic->defining_class . ' is marked covariant and cannot be used here', - $this->code_location - ), - $this->source->getSuppressedIssues() - ); - } - } - } - } - - public function checkResource(TResource $atomic): void - { - if (!$atomic->from_docblock) { - IssueBuffer::maybeAdd( - new ReservedWord( - '\'resource\' is a reserved word', - $this->code_location, - 'resource' - ), - $this->source->getSuppressedIssues() - ); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php deleted file mode 100644 index 3e742886..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php +++ /dev/null @@ -1,89 +0,0 @@ - $phantom_classes - */ - public function __construct( - Scanner $scanner, - ?FileStorage $file_storage, - array $phantom_classes - ) { - $this->scanner = $scanner; - $this->file_storage = $file_storage; - $this->phantom_classes = $phantom_classes; - } - - protected function enterNode(TypeNode $type): ?int - { - if ($type instanceof TNamedObject) { - $fq_classlike_name_lc = strtolower($type->value); - - if (!isset($this->phantom_classes[$type->value]) - && !isset($this->phantom_classes[$fq_classlike_name_lc]) - ) { - $this->scanner->queueClassLikeForScanning( - $type->value, - false, - !$type->from_docblock, - $this->phantom_classes - ); - - if ($this->file_storage) { - $this->file_storage->referenced_classlikes[$fq_classlike_name_lc] = $type->value; - } - } - } - - if ($type instanceof TClassConstant) { - $this->scanner->queueClassLikeForScanning( - $type->fq_classlike_name, - false, - !$type->from_docblock, - $this->phantom_classes - ); - - if ($this->file_storage) { - $fq_classlike_name_lc = strtolower($type->fq_classlike_name); - - $this->file_storage->referenced_classlikes[$fq_classlike_name_lc] = $type->fq_classlike_name; - } - } - - if ($type instanceof TLiteralClassString) { - $this->scanner->queueClassLikeForScanning( - $type->value, - false, - !$type->from_docblock, - $this->phantom_classes - ); - - if ($this->file_storage) { - $fq_classlike_name_lc = strtolower($type->value); - - $this->file_storage->referenced_classlikes[$fq_classlike_name_lc] = $type->value; - } - } - - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php b/vendor/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php deleted file mode 100644 index a3a3a1a4..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php +++ /dev/null @@ -1,9 +0,0 @@ -function_id = $function_id ? strtolower($function_id) : null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php b/vendor/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php deleted file mode 100644 index e200e564..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php +++ /dev/null @@ -1,9 +0,0 @@ -fq_classlike_name = $fq_classlike_name; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/CodeIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/CodeIssue.php deleted file mode 100644 index 00bb8b2f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/CodeIssue.php +++ /dev/null @@ -1,134 +0,0 @@ -code_location = $code_location; - $this->message = $message; - } - - /** - * @deprecated going to be removed in Psalm 5 - * @psalm-suppress PossiblyUnusedMethod - */ - public function getLocation(): CodeLocation - { - return $this->code_location; - } - - public function getShortLocationWithPrevious(): string - { - $previous_text = ''; - - if ($this->code_location->previous_location) { - $previous_location = $this->code_location->previous_location; - $previous_text = ' from ' . $previous_location->file_name . ':' . $previous_location->getLineNumber(); - } - - return $this->code_location->file_name . ':' . $this->code_location->getLineNumber() . $previous_text; - } - - public function getShortLocation(): string - { - return $this->code_location->file_name . ':' . $this->code_location->getLineNumber(); - } - - public function getFilePath(): string - { - return $this->code_location->file_path; - } - - /** - * @deprecated going to be removed in Psalm 5 - * @psalm-suppress PossiblyUnusedMethod for convenience - */ - public function getFileName(): string - { - return $this->code_location->file_name; - } - - /** - * @deprecated going to be removed in Psalm 5 - * @psalm-suppress PossiblyUnusedMethod - */ - public function getMessage(): string - { - return $this->message; - } - - public static function getIssueType(): string - { - $fqcn_parts = explode('\\', static::class); - return array_pop($fqcn_parts); - } - - public function toIssueData(string $severity): IssueData - { - $location = $this->code_location; - $selection_bounds = $location->getSelectionBounds(); - $snippet_bounds = $location->getSnippetBounds(); - - return new IssueData( - $severity, - $location->getLineNumber(), - $location->getEndLineNumber(), - static::getIssueType(), - $this->message, - $location->file_name, - $location->file_path, - $location->getSnippet(), - $location->getSelectedText(), - $selection_bounds[0], - $selection_bounds[1], - $snippet_bounds[0], - $snippet_bounds[1], - $location->getColumn(), - $location->getEndColumn(), - (int) static::SHORTCODE, - (int) static::ERROR_LEVEL, - $this instanceof TaintedInput - ? $this->getTaintTrace() - : null, - $this instanceof MixedIssue && ($origin_location = $this->getOriginalLocation()) - ? [ - TaintedInput::nodeToDataFlowNodeData( - $origin_location, - 'The type of ' . $location->getSelectedText() . ' is sourced from here' - ) - ] - : null, - $this->dupe_key - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php b/vendor/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php deleted file mode 100644 index bce1eb05..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php +++ /dev/null @@ -1,9 +0,0 @@ -dupe_key = $dupe_key; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php b/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php deleted file mode 100644 index 9bb2d053..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php +++ /dev/null @@ -1,9 +0,0 @@ -function_id = strtolower($function_id); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php b/vendor/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php deleted file mode 100644 index c9bcba5d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php +++ /dev/null @@ -1,9 +0,0 @@ - $words */ - public static function listToPhrase(array $words): string - { - if (count($words) === 1) { - return reset($words); - } - - if (count($words) === 2) { - return implode(" and ", $words); - } - - $last_word = array_pop($words); - $phrase = implode(", ", $words); - $phrase = "$phrase, and $last_word"; - - return $phrase; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InternalMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/InternalMethod.php deleted file mode 100644 index a7e19d6f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/InternalMethod.php +++ /dev/null @@ -1,9 +0,0 @@ -method_id = strtolower($method_id); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php b/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php deleted file mode 100644 index 812353f8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php +++ /dev/null @@ -1,9 +0,0 @@ -dupe_key = $dupe_key; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingDependency.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingDependency.php deleted file mode 100644 index 83afc874..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingDependency.php +++ /dev/null @@ -1,8 +0,0 @@ -code_location = $code_location; - $this->message = $message; - $this->function_id = $function_id ? strtolower($function_id) : null; - $this->origin_location = $origin_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php deleted file mode 100644 index 1d18ace7..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php +++ /dev/null @@ -1,27 +0,0 @@ -code_location = $code_location; - $this->message = $message; - $this->function_id = $function_id ? strtolower($function_id) : null; - $this->origin_location = $origin_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php deleted file mode 100644 index 54dc6eab..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php +++ /dev/null @@ -1,11 +0,0 @@ -code_location = $code_location; - $this->message = $message; - $this->origin_location = $origin_location; - } - - public function getMixedOriginMessage(): string - { - return $this->message - . ($this->origin_location - ? '. Consider improving the type at ' . $this->origin_location->getShortSummary() - : ''); - } - - public function getOriginalLocation(): ?CodeLocation - { - return $this->origin_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php deleted file mode 100644 index 7b8f97f3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php +++ /dev/null @@ -1,11 +0,0 @@ -origin_location = $origin_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php deleted file mode 100644 index 7a699d4b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php +++ /dev/null @@ -1,11 +0,0 @@ -property_id = $property_id; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php b/vendor/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php deleted file mode 100644 index 85602e6f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php +++ /dev/null @@ -1,20 +0,0 @@ -dupe_key = $property_id; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php b/vendor/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php deleted file mode 100644 index c15e00a8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php +++ /dev/null @@ -1,9 +0,0 @@ -dupe_key = $dupe_key; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php deleted file mode 100644 index a60adf6e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php +++ /dev/null @@ -1,18 +0,0 @@ -dupe_key = $dupe_key; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php deleted file mode 100644 index d84d0a4f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php +++ /dev/null @@ -1,9 +0,0 @@ - - * @readonly - */ - public $journey = []; - - /** - * @param list $journey - */ - public function __construct( - string $message, - CodeLocation $code_location, - array $journey, - string $journey_text - ) { - parent::__construct($message, $code_location); - - $this->journey = $journey; - $this->journey_text = $journey_text; - } - - /** - * @return list - */ - public function getTaintTrace(): array - { - $nodes = []; - - foreach ($this->journey as ['location' => $location, 'label' => $label, 'entry_path_type' => $path_type]) { - if ($location) { - $nodes[] = self::nodeToDataFlowNodeData($location, $label); - } else { - $nodes[] = ['label' => $label, 'entry_path_type' => $path_type]; - } - } - - return $nodes; - } - - public static function nodeToDataFlowNodeData( - CodeLocation $location, - string $label - ): DataFlowNodeData { - $selection_bounds = $location->getSelectionBounds(); - $snippet_bounds = $location->getSnippetBounds(); - - return new DataFlowNodeData( - $label, - $location->getLineNumber(), - $location->getEndLineNumber(), - $location->file_name, - $location->file_path, - $location->getSnippet(), - $selection_bounds[0], - $selection_bounds[1], - $snippet_bounds[0], - $location->getColumn(), - $location->getEndColumn() - ); - } - - public function getJourneyMessage(): string - { - return $this->message . ' in path: ' . $this->journey_text; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php deleted file mode 100644 index 37349c95..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php +++ /dev/null @@ -1,8 +0,0 @@ -dupe_key = $dupe_key; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php b/vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php deleted file mode 100644 index a496b5db..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php +++ /dev/null @@ -1,17 +0,0 @@ -dupe_key = $dupe_key; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php b/vendor/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php deleted file mode 100644 index f5301c22..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php +++ /dev/null @@ -1,9 +0,0 @@ -var_name = strtolower($var_name); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/IssueBuffer.php b/vendor/vimeo/psalm/src/Psalm/IssueBuffer.php deleted file mode 100644 index 47bde92f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/IssueBuffer.php +++ /dev/null @@ -1,1029 +0,0 @@ -> - */ - protected static $issues_data = []; - - /** - * @var array - */ - protected static $console_issues = []; - - /** - * @var array - */ - protected static $fixable_issue_counts = []; - - /** - * @var int - */ - protected static $error_count = 0; - - /** - * @var array - */ - protected static $emitted = []; - - /** @var int */ - protected static $recording_level = 0; - - /** @var array> */ - protected static $recorded_issues = []; - - /** - * @var array> - */ - protected static $unused_suppressions = []; - - /** - * @var array> - */ - protected static $used_suppressions = []; - - /** @var array */ - private static $server = []; - - /** - * This will add an issue to be emitted if it's not suppressed and return if it has been added - * @param string[] $suppressed_issues - */ - public static function accepts(CodeIssue $e, array $suppressed_issues = [], bool $is_fixable = false): bool - { - if (self::isSuppressed($e, $suppressed_issues)) { - return false; - } - - return self::add($e, $is_fixable); - } - - /** - * This will add an issue to be emitted if it's not suppressed - * @param string[] $suppressed_issues - */ - public static function maybeAdd(CodeIssue $e, array $suppressed_issues = [], bool $is_fixable = false): void - { - if (self::isSuppressed($e, $suppressed_issues)) { - return; - } - - self::add($e, $is_fixable); - } - - /** - * This is part of the findUnusedPsalmSuppress feature - */ - public static function addUnusedSuppression(string $file_path, int $offset, string $issue_type): void - { - if (strpos($issue_type, 'Tainted') === 0) { - return; - } - - if (isset(self::$used_suppressions[$file_path][$offset])) { - return; - } - - if (!isset(self::$unused_suppressions[$file_path])) { - self::$unused_suppressions[$file_path] = []; - } - - self::$unused_suppressions[$file_path][$offset] = $offset + strlen($issue_type) - 1; - } - - /** - * This will return false if an issue is ready to be added for emission. Reasons for not returning false include: - * - The issue is suppressed in config - * - We're in a recording state - * - The issue is included in the list of issues to be suppressed in param - * @param string[] $suppressed_issues - */ - public static function isSuppressed(CodeIssue $e, array $suppressed_issues = []): bool - { - $config = Config::getInstance(); - - $fqcn_parts = explode('\\', get_class($e)); - $issue_type = array_pop($fqcn_parts); - $file_path = $e->getFilePath(); - - if (!$e instanceof ConfigIssue && !$config->reportIssueInFile($issue_type, $file_path)) { - return true; - } - - $suppressed_issue_position = array_search($issue_type, $suppressed_issues); - - if ($suppressed_issue_position !== false) { - if (is_int($suppressed_issue_position)) { - self::$used_suppressions[$file_path][$suppressed_issue_position] = true; - } - - return true; - } - - $parent_issue_type = Config::getParentIssueType($issue_type); - - if ($parent_issue_type) { - $suppressed_issue_position = array_search($parent_issue_type, $suppressed_issues); - - if ($suppressed_issue_position !== false) { - if (is_int($suppressed_issue_position)) { - self::$used_suppressions[$file_path][$suppressed_issue_position] = true; - } - - return true; - } - } - - $suppress_all_position = $config->disable_suppress_all - ? false - : array_search('all', $suppressed_issues); - - if ($suppress_all_position !== false) { - if (is_int($suppress_all_position)) { - self::$used_suppressions[$file_path][$suppress_all_position] = true; - } - - return true; - } - - $reporting_level = $config->getReportingLevelForIssue($e); - - if ($reporting_level === Config::REPORT_SUPPRESS) { - return true; - } - - if ($e->code_location->getLineNumber() === -1) { - return true; - } - - if (self::$recording_level > 0) { - self::$recorded_issues[self::$recording_level][] = $e; - - return true; - } - - return false; - } - - /** - * Add an issue to be emitted. This method should normally not be used! Use IssueBuffer::maybeAdd instead. - * - * @psalm-internal Psalm\IssueBuffer - * @psalm-internal Psalm\Type\Reconciler::getValueForKey - * - * @throws CodeException - */ - public static function add(CodeIssue $e, bool $is_fixable = false): bool - { - $config = Config::getInstance(); - - $fqcn_parts = explode('\\', get_class($e)); - $issue_type = array_pop($fqcn_parts); - - $project_analyzer = ProjectAnalyzer::getInstance(); - - if (!$project_analyzer->show_issues) { - return false; - } - - $is_tainted = strpos($issue_type, 'Tainted') === 0; - - if ($project_analyzer->getCodebase()->taint_flow_graph && !$is_tainted) { - return false; - } - - $reporting_level = $config->getReportingLevelForIssue($e); - - if ($reporting_level === Config::REPORT_SUPPRESS) { - return false; - } - - if ($config->debug_emitted_issues) { - ob_start(); - debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - $trace = ob_get_clean(); - fwrite(STDERR, "\nEmitting {$e->getShortLocation()} $issue_type {$e->message}\n$trace\n"); - } - - // Make issue type for trace variable specific ("Trace" => "Trace~$var"). - $trace_var = $issue_type === 'Trace' && preg_match('/^(\$.+?):/', $e->message, $m) === 1 && isset($m[1]) - ? '~' . $m[1] - : ''; - - $emitted_key = $issue_type - . $trace_var - . '-' . $e->getShortLocation() - . ':' . $e->code_location->getColumn() - . ' ' . $e->dupe_key; - - if ($reporting_level === Config::REPORT_INFO) { - if ($is_tainted || !self::alreadyEmitted($emitted_key)) { - self::$issues_data[$e->getFilePath()][] = $e->toIssueData(Config::REPORT_INFO); - - if ($is_fixable) { - self::addFixableIssue($issue_type); - } - } - - return false; - } - - if ($config->throw_exception) { - FileAnalyzer::clearCache(); - - $message = $e instanceof TaintedInput - ? $e->getJourneyMessage() - : ($e instanceof MixedIssue - ? $e->getMixedOriginMessage() - : $e->message); - - throw new CodeException( - $issue_type - . ' - ' . $e->getShortLocationWithPrevious() - . ':' . $e->code_location->getColumn() - . ' - ' . $message - ); - } - - if ($is_tainted || !self::alreadyEmitted($emitted_key)) { - ++self::$error_count; - self::$issues_data[$e->getFilePath()][] = $e->toIssueData(Config::REPORT_ERROR); - - if ($is_fixable) { - self::addFixableIssue($issue_type); - } - } - - return true; - } - - private static function removeRecordedIssue(string $issue_type, int $file_offset): void - { - $recorded_issues = self::$recorded_issues[self::$recording_level]; - $filtered_issues = []; - - foreach ($recorded_issues as $issue) { - [$from] = $issue->code_location->getSelectionBounds(); - - if ($issue::getIssueType() !== $issue_type || $from !== $file_offset) { - $filtered_issues[] = $issue; - } - } - - self::$recorded_issues[self::$recording_level] = $filtered_issues; - } - - /** - * This will try to remove an issue that has been added for emission - */ - public static function remove(string $file_path, string $issue_type, int $file_offset): void - { - if (self::$recording_level > 0) { - self::removeRecordedIssue($issue_type, $file_offset); - } - - if (!isset(self::$issues_data[$file_path])) { - return; - } - - $filtered_issues = []; - - foreach (self::$issues_data[$file_path] as $issue) { - if ($issue->type !== $issue_type || $issue->from !== $file_offset) { - $filtered_issues[] = $issue; - } - } - - if (empty($filtered_issues)) { - unset(self::$issues_data[$file_path]); - } else { - self::$issues_data[$file_path] = $filtered_issues; - } - } - - public static function addFixableIssue(string $issue_type): void - { - if (isset(self::$fixable_issue_counts[$issue_type])) { - self::$fixable_issue_counts[$issue_type]++; - } else { - self::$fixable_issue_counts[$issue_type] = 1; - } - } - - /** - * @return array> - */ - public static function getIssuesData(): array - { - return self::$issues_data; - } - - /** - * @return list - */ - public static function getIssuesDataForFile(string $file_path): array - { - return self::$issues_data[$file_path] ?? []; - } - - /** - * @return array - */ - public static function getFixableIssues(): array - { - return self::$fixable_issue_counts; - } - - /** - * @param array $fixable_issue_counts - */ - public static function addFixableIssues(array $fixable_issue_counts): void - { - foreach ($fixable_issue_counts as $issue_type => $count) { - if (isset(self::$fixable_issue_counts[$issue_type])) { - self::$fixable_issue_counts[$issue_type] += $count; - } else { - self::$fixable_issue_counts[$issue_type] = $count; - } - } - } - - /** - * @return array> - */ - public static function getUnusedSuppressions(): array - { - return self::$unused_suppressions; - } - - /** - * @return array> - */ - public static function getUsedSuppressions(): array - { - return self::$used_suppressions; - } - - /** - * @param array> $unused_suppressions - */ - public static function addUnusedSuppressions(array $unused_suppressions): void - { - self::$unused_suppressions += $unused_suppressions; - } - - /** - * @param array> $used_suppressions - */ - public static function addUsedSuppressions(array $used_suppressions): void - { - foreach ($used_suppressions as $file => $offsets) { - if (!isset(self::$used_suppressions[$file])) { - self::$used_suppressions[$file] = $offsets; - } else { - self::$used_suppressions[$file] += $offsets; - } - } - } - - public static function processUnusedSuppressions(FileProvider $file_provider): void - { - $config = Config::getInstance(); - - foreach (self::$unused_suppressions as $file_path => $offsets) { - if (!$offsets) { - continue; - } - - if (!$config->isInProjectDirs($file_path)) { - continue; - } - - $file_contents = $file_provider->getContents($file_path); - - foreach ($offsets as $start => $end) { - if (isset(self::$used_suppressions[$file_path][$start])) { - continue; - } - - self::add( - new UnusedPsalmSuppress( - 'This suppression is never used', - new Raw( - $file_contents, - $file_path, - $config->shortenFileName($file_path), - $start, - $end - ) - ) - ); - } - } - } - - public static function getErrorCount(): int - { - return self::$error_count; - } - - /** - * @param array> $issues_data - * - */ - public static function addIssues(array $issues_data): void - { - foreach ($issues_data as $file_path => $file_issues) { - foreach ($file_issues as $issue) { - $emitted_key = $issue->type - . '-' . $issue->file_name - . ':' . $issue->line_from - . ':' . $issue->column_from - . ' ' . $issue->dupe_key; - - if (!self::alreadyEmitted($emitted_key)) { - self::$issues_data[$file_path][] = $issue; - } - } - } - } - - /** - * @param array}>> $issue_baseline - * - */ - public static function finish( - ProjectAnalyzer $project_analyzer, - bool $is_full, - float $start_time, - bool $add_stats = false, - array $issue_baseline = [] - ): void { - if (!$project_analyzer->stdout_report_options) { - throw new UnexpectedValueException('Cannot finish without stdout report options'); - } - - $codebase = $project_analyzer->getCodebase(); - - foreach ($codebase->config->config_issues as $issue) { - if (self::accepts($issue)) { - // fall through - } - } - - $error_count = 0; - $info_count = 0; - - - $issues_data = []; - - if (self::$issues_data) { - if (in_array( - $project_analyzer->stdout_report_options->format, - [Report::TYPE_CONSOLE, Report::TYPE_PHP_STORM] - )) { - echo "\n"; - } - - ksort(self::$issues_data); - - foreach (self::$issues_data as $file_path => $file_issues) { - usort( - $file_issues, - function (IssueData $d1, IssueData $d2): int { - if ($d1->file_path === $d2->file_path) { - if ($d1->line_from === $d2->line_from) { - if ($d1->column_from === $d2->column_from) { - return 0; - } - - return $d1->column_from > $d2->column_from ? 1 : -1; - } - - return $d1->line_from > $d2->line_from ? 1 : -1; - } - - return $d1->file_path > $d2->file_path ? 1 : -1; - } - ); - self::$issues_data[$file_path] = $file_issues; - } - - // make a copy so what gets saved in cache is unaffected by baseline - $issues_data = self::$issues_data; - - if (!empty($issue_baseline)) { - // Set severity for issues in baseline to INFO - foreach ($issues_data as $file_path => $file_issues) { - foreach ($file_issues as $key => $issue_data) { - $file = $issue_data->file_name; - $file = str_replace('\\', '/', $file); - $type = $issue_data->type; - - if (isset($issue_baseline[$file][$type]) && $issue_baseline[$file][$type]['o'] > 0) { - if ($issue_baseline[$file][$type]['o'] === count($issue_baseline[$file][$type]['s'])) { - $position = array_search( - trim($issue_data->selected_text), - $issue_baseline[$file][$type]['s'], - true - ); - - if ($position !== false) { - $issue_data->severity = Config::REPORT_INFO; - array_splice($issue_baseline[$file][$type]['s'], $position, 1); - $issue_baseline[$file][$type]['o']--; - } - } else { - $issue_baseline[$file][$type]['s'] = []; - $issue_data->severity = Config::REPORT_INFO; - $issue_baseline[$file][$type]['o']--; - } - } - - $issues_data[$file_path][$key] = $issue_data; - } - } - } - } - - echo self::getOutput( - $issues_data, - $project_analyzer->stdout_report_options, - $codebase->analyzer->getTotalTypeCoverage($codebase) - ); - - foreach ($issues_data as $file_issues) { - foreach ($file_issues as $issue_data) { - if ($issue_data->severity === Config::REPORT_ERROR) { - ++$error_count; - } else { - ++$info_count; - } - } - } - - - if ($codebase->config->eventDispatcher->after_analysis - || $codebase->config->eventDispatcher->legacy_after_analysis - ) { - $source_control_info = null; - $build_info = (new BuildInfoCollector(self::$server))->collect(); - - try { - $source_control_info = (new GitInfoCollector())->collect(); - } catch (RuntimeException $e) { - // do nothing - } - - /** @psalm-suppress ArgumentTypeCoercion due to Psalm bug */ - $event = new AfterAnalysisEvent( - $codebase, - $issues_data, - $build_info, - $source_control_info - ); - - $codebase->config->eventDispatcher->dispatchAfterAnalysis($event); - } - - foreach ($project_analyzer->generated_report_options as $report_options) { - if (!$report_options->output_path) { - throw new UnexpectedValueException('Output path should not be null here'); - } - - $folder = dirname($report_options->output_path); - if (!is_dir($folder) && !mkdir($folder, 0777, true) && !is_dir($folder)) { - throw new RuntimeException(sprintf('Directory "%s" was not created', $folder)); - } - file_put_contents( - $report_options->output_path, - self::getOutput( - $issues_data, - $report_options, - $codebase->analyzer->getTotalTypeCoverage($codebase) - ) - ); - } - - if (in_array( - $project_analyzer->stdout_report_options->format, - [Report::TYPE_CONSOLE, Report::TYPE_PHP_STORM] - )) { - echo str_repeat('-', 30) . "\n"; - - if ($error_count) { - echo($project_analyzer->stdout_report_options->use_color - ? "\e[0;31m" . $error_count . " errors\e[0m" - : $error_count . ' errors' - ) . ' found' . "\n"; - } else { - self::printSuccessMessage($project_analyzer); - } - - $show_info = $project_analyzer->stdout_report_options->show_info; - $show_suggestions = $project_analyzer->stdout_report_options->show_suggestions; - - if ($info_count && ($show_info || $show_suggestions)) { - echo str_repeat('-', 30) . "\n"; - - echo $info_count . ' other issues found.' . "\n"; - - if (!$show_info) { - echo 'You can display them with ' . - ($project_analyzer->stdout_report_options->use_color - ? "\e[30;48;5;195m--show-info=true\e[0m" - : '--show-info=true') . "\n"; - } - } - - if (self::$fixable_issue_counts && $show_suggestions && !$codebase->taint_flow_graph) { - echo str_repeat('-', 30) . "\n"; - - $total_count = array_sum(self::$fixable_issue_counts); - $command = '--alter --issues=' . implode(',', array_keys(self::$fixable_issue_counts)); - $command .= ' --dry-run'; - - echo 'Psalm can automatically fix ' . $total_count - . ($show_info ? ' issues' : ' of these issues') . ".\n" - . 'Run Psalm again with ' . "\n" - . ($project_analyzer->stdout_report_options->use_color - ? "\e[30;48;5;195m" . $command . "\e[0m" - : $command) . "\n" - . 'to see what it can fix.' . "\n"; - } - - echo str_repeat('-', 30) . "\n" . "\n"; - - if ($start_time) { - echo 'Checks took ' . number_format(microtime(true) - $start_time, 2) . ' seconds'; - echo ' and used ' . number_format(memory_get_peak_usage() / (1024 * 1024), 3) . 'MB of memory' . "\n"; - - $analysis_summary = $codebase->analyzer->getTypeInferenceSummary($codebase); - echo $analysis_summary . "\n"; - - if ($add_stats) { - echo '-----------------' . "\n"; - echo $codebase->analyzer->getNonMixedStats(); - echo "\n"; - } - - if ($project_analyzer->debug_performance) { - echo '-----------------' . "\n"; - echo 'Slow-to-analyze functions' . "\n"; - echo '-----------------' . "\n\n"; - - $function_timings = $codebase->analyzer->getFunctionTimings(); - - arsort($function_timings); - - $i = 0; - - foreach ($function_timings as $function_id => $time) { - if (++$i > 10) { - break; - } - - echo $function_id . ': ' . round(1000 * $time, 2) . 'ms per node' . "\n"; - } - - echo "\n"; - } - } - } - - if ($is_full && $start_time) { - $codebase->file_reference_provider->removeDeletedFilesFromReferences(); - - if ($project_analyzer->project_cache_provider) { - $project_analyzer->project_cache_provider->processSuccessfulRun($start_time, PSALM_VERSION); - } - } - - if ($error_count - && !($codebase->taint_flow_graph - && $project_analyzer->generated_report_options - && isset($_SERVER['GITHUB_WORKFLOW'])) - ) { - exit(2); - } - } - - public static function printSuccessMessage(ProjectAnalyzer $project_analyzer): void - { - if (!$project_analyzer->stdout_report_options) { - throw new UnexpectedValueException('Cannot print success message without stdout report options'); - } - - // this message will be printed - $message = "No errors found!"; - - // color block will contain this amount of characters - $blockSize = 30; - - // message with prepended and appended whitespace to be same as $blockSize - $messageWithPadding = str_repeat(' ', 7) . $message . str_repeat(' ', 7); - - // top side of the color block - $paddingTop = str_repeat(' ', $blockSize); - - // bottom side of the color block - $paddingBottom = str_repeat(' ', $blockSize); - - // background color, 42 = green - $background = "42"; - - // foreground/text color, 30 = black - $foreground = "30"; - - // text style, 1 = bold - $style = "1"; - - if ($project_analyzer->stdout_report_options->use_color) { - echo "\e[{$background};{$style}m{$paddingTop}\e[0m" . "\n"; - echo "\e[{$background};{$foreground};{$style}m{$messageWithPadding}\e[0m" . "\n"; - echo "\e[{$background};{$style}m{$paddingBottom}\e[0m" . "\n"; - } else { - echo "\n"; - echo "$messageWithPadding\n"; - echo "\n"; - } - } - - /** - * @param array> $issues_data - * @param array{int, int} $mixed_counts - * - */ - public static function getOutput( - array $issues_data, - ReportOptions $report_options, - array $mixed_counts = [0, 0] - ): string { - $total_expression_count = $mixed_counts[0] + $mixed_counts[1]; - $mixed_expression_count = $mixed_counts[0]; - - $normalized_data = $issues_data === [] ? [] : array_merge(...array_values($issues_data)); - - switch ($report_options->format) { - case Report::TYPE_COMPACT: - $output = new CompactReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_EMACS: - $output = new EmacsReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_TEXT: - $output = new TextReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_JSON: - $output = new JsonReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_JSON_SUMMARY: - $output = new JsonSummaryReport( - $normalized_data, - self::$fixable_issue_counts, - $report_options, - $mixed_expression_count, - $total_expression_count - ); - break; - - case Report::TYPE_SONARQUBE: - $output = new SonarqubeReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_PYLINT: - $output = new PylintReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_CHECKSTYLE: - $output = new CheckstyleReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_XML: - $output = new XmlReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_JUNIT: - $output = new JunitReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_CONSOLE: - $output = new ConsoleReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_GITHUB_ACTIONS: - $output = new GithubActionsReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_PHP_STORM: - $output = new PhpStormReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_SARIF: - $output = new SarifReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_CODECLIMATE: - $output = new CodeClimateReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - case Report::TYPE_COUNT: - $output = new CountReport($normalized_data, self::$fixable_issue_counts, $report_options); - break; - - default: - throw new RuntimeException('Unexpected report format: ' . $report_options->format); - } - - return $output->create(); - } - - protected static function alreadyEmitted(string $message): bool - { - $sham = sha1($message); - - if (isset(self::$emitted[$sham])) { - return true; - } - - self::$emitted[$sham] = true; - - return false; - } - - public static function clearCache(): void - { - self::$issues_data = []; - self::$emitted = []; - self::$error_count = 0; - self::$recording_level = 0; - self::$recorded_issues = []; - self::$console_issues = []; - self::$unused_suppressions = []; - self::$used_suppressions = []; - } - - /** - * @return array> - */ - public static function clear(): array - { - $current_data = self::$issues_data; - self::$issues_data = []; - self::$emitted = []; - - return $current_data; - } - - /** - * Return whether or not we're in a recording state regarding startRecording/stopRecording status - */ - public static function isRecording(): bool - { - return self::$recording_level > 0; - } - - /** - * Increase the recording level in order to start recording issues instead of adding them while in a loop - */ - public static function startRecording(): void - { - ++self::$recording_level; - self::$recorded_issues[self::$recording_level] = []; - } - - /** - * Decrease the recording level after leaving a loop - * @see startRecording - */ - public static function stopRecording(): void - { - if (self::$recording_level === 0) { - throw new UnexpectedValueException('Cannot stop recording - already at base level'); - } - - --self::$recording_level; - } - - /** - * This will return the recorded issues for the current recording level - * @return array - */ - public static function clearRecordingLevel(): array - { - if (self::$recording_level === 0) { - throw new UnexpectedValueException('Not currently recording'); - } - - $recorded_issues = self::$recorded_issues[self::$recording_level]; - - self::$recorded_issues[self::$recording_level] = []; - - return $recorded_issues; - } - - /** - * This will try to add issues that has been retrieved through clearRecordingLevel or record them at a lower level - */ - public static function bubbleUp(CodeIssue $e): void - { - if (self::$recording_level === 0) { - self::add($e); - - return; - } - - self::$recorded_issues[self::$recording_level][] = $e; - } - - /** - * @internal - * @param array $server - */ - final public static function captureServer(array $server): void - { - self::$server = $server; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php deleted file mode 100644 index 9c28c1e7..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php +++ /dev/null @@ -1,13 +0,0 @@ - - */ - public static function addTaints(AddRemoveTaintsEvent $event): array; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php deleted file mode 100644 index a0d75fe5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php +++ /dev/null @@ -1,13 +0,0 @@ -expr = $expr; - $this->context = $context; - $this->statements_source = $statements_source; - $this->codebase = $codebase; - } - - public function getExpr(): Expr - { - return $this->expr; - } - - public function getContext(): Context - { - return $this->context; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php deleted file mode 100644 index b90e349a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php +++ /dev/null @@ -1,67 +0,0 @@ -> $issues - */ - public function __construct( - Codebase $codebase, - array $issues, - array $build_info, - ?SourceControlInfo $source_control_info = null - ) { - $this->codebase = $codebase; - $this->issues = $issues; - $this->build_info = $build_info; - $this->source_control_info = $source_control_info; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * @return IssueData[][] - */ - public function getIssues(): array - { - return $this->issues; - } - - public function getBuildInfo(): array - { - return $this->build_info; - } - - public function getSourceControlInfo(): ?SourceControlInfo - { - return $this->source_control_info; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php deleted file mode 100644 index f74e9dbd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php +++ /dev/null @@ -1,88 +0,0 @@ -stmt = $stmt; - $this->classlike_storage = $classlike_storage; - $this->statements_source = $statements_source; - $this->codebase = $codebase; - $this->file_replacements = $file_replacements; - } - - public function getStmt(): Node\Stmt\ClassLike - { - return $this->stmt; - } - - public function getClasslikeStorage(): ClassLikeStorage - { - return $this->classlike_storage; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * @return FileManipulation[] - */ - public function getFileReplacements(): array - { - return $this->file_replacements; - } - - /** - * @param FileManipulation[] $file_replacements - */ - public function setFileReplacements(array $file_replacements): void - { - $this->file_replacements = $file_replacements; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php deleted file mode 100644 index d8620141..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php +++ /dev/null @@ -1,85 +0,0 @@ -fq_class_name = $fq_class_name; - $this->code_location = $code_location; - $this->statements_source = $statements_source; - $this->codebase = $codebase; - $this->file_replacements = $file_replacements; - } - - public function getFqClassName(): string - { - return $this->fq_class_name; - } - - public function getCodeLocation(): CodeLocation - { - return $this->code_location; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * @return FileManipulation[] - */ - public function getFileReplacements(): array - { - return $this->file_replacements; - } - - /** - * @param FileManipulation[] $file_replacements - */ - public function setFileReplacements(array $file_replacements): void - { - $this->file_replacements = $file_replacements; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php deleted file mode 100644 index 206b0b44..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php +++ /dev/null @@ -1,86 +0,0 @@ -stmt = $stmt; - $this->storage = $storage; - $this->statements_source = $statements_source; - $this->codebase = $codebase; - $this->file_replacements = $file_replacements; - } - - public function getStmt(): ClassLike - { - return $this->stmt; - } - - public function getStorage(): ClassLikeStorage - { - return $this->storage; - } - - public function getStatementsSource(): FileSource - { - return $this->statements_source; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * @return FileManipulation[] - */ - public function getFileReplacements(): array - { - return $this->file_replacements; - } - - /** - * @param FileManipulation[] $file_replacements - */ - public function setFileReplacements(array $file_replacements): void - { - $this->file_replacements = $file_replacements; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php deleted file mode 100644 index 6d2d91af..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php +++ /dev/null @@ -1,26 +0,0 @@ -codebase = $codebase; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php deleted file mode 100644 index 92d5717e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php +++ /dev/null @@ -1,71 +0,0 @@ -expr = $expr; - $this->function_id = $function_id; - $this->context = $context; - $this->statements_source = $statements_source; - $this->codebase = $codebase; - } - - public function getExpr(): FuncCall - { - return $this->expr; - } - - public function getFunctionId(): string - { - return $this->function_id; - } - - public function getContext(): Context - { - return $this->context; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php deleted file mode 100644 index 3f21097f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php +++ /dev/null @@ -1,88 +0,0 @@ -expr = $expr; - $this->context = $context; - $this->statements_source = $statements_source; - $this->codebase = $codebase; - $this->file_replacements = $file_replacements; - } - - public function getExpr(): Expr - { - return $this->expr; - } - - public function getContext(): Context - { - return $this->context; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * @return FileManipulation[] - */ - public function getFileReplacements(): array - { - return $this->file_replacements; - } - - /** - * @param FileManipulation[] $file_replacements - */ - public function setFileReplacements(array $file_replacements): void - { - $this->file_replacements = $file_replacements; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php deleted file mode 100644 index 65027e6f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php +++ /dev/null @@ -1,80 +0,0 @@ - $stmts - */ - public function __construct( - StatementsSource $statements_source, - Context $file_context, - FileStorage $file_storage, - Codebase $codebase, - array $stmts - ) { - $this->statements_source = $statements_source; - $this->file_context = $file_context; - $this->file_storage = $file_storage; - $this->codebase = $codebase; - $this->stmts = $stmts; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getFileContext(): Context - { - return $this->file_context; - } - - public function getFileStorage(): FileStorage - { - return $this->file_storage; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * @return Stmt[] - */ - public function getStmts(): array - { - return $this->stmts; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php deleted file mode 100644 index caa0576b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php +++ /dev/null @@ -1,113 +0,0 @@ -expr = $expr; - $this->function_id = $function_id; - $this->context = $context; - $this->statements_source = $statements_source; - $this->codebase = $codebase; - $this->return_type_candidate = $return_type_candidate; - $this->file_replacements = $file_replacements; - } - - public function getExpr(): FuncCall - { - return $this->expr; - } - - /** - * @return non-empty-string - */ - public function getFunctionId(): string - { - return $this->function_id; - } - - public function getContext(): Context - { - return $this->context; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - public function getReturnTypeCandidate(): Union - { - return $this->return_type_candidate; - } - - /** - * @return FileManipulation[] - */ - public function getFileReplacements(): array - { - return $this->file_replacements; - } - - /** - * @param FileManipulation[] $file_replacements - */ - public function setFileReplacements(array $file_replacements): void - { - $this->file_replacements = $file_replacements; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php deleted file mode 100644 index df6cbefc..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php +++ /dev/null @@ -1,120 +0,0 @@ -stmt = $stmt; - $this->functionlike_storage = $functionlike_storage; - $this->statements_source = $statements_source; - $this->codebase = $codebase; - $this->file_replacements = $file_replacements; - $this->node_type_provider = $node_type_provider; - $this->context = $context; - } - - public function getStmt(): Node\FunctionLike - { - return $this->stmt; - } - - /** - * @deprecated Will be removed in Psalm v5.0, use getFunctionlikeStorage() instead - */ - public function getClasslikeStorage(): FunctionLikeStorage - { - return $this->functionlike_storage; - } - - public function getFunctionlikeStorage(): FunctionLikeStorage - { - return $this->functionlike_storage; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * @return FileManipulation[] - */ - public function getFileReplacements(): array - { - return $this->file_replacements; - } - - /** - * @param FileManipulation[] $file_replacements - */ - public function setFileReplacements(array $file_replacements): void - { - $this->file_replacements = $file_replacements; - } - - public function getNodeTypeProvider(): NodeTypeProvider - { - return $this->node_type_provider; - } - - public function getContext(): Context - { - return $this->context; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php deleted file mode 100644 index ea60ffa8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php +++ /dev/null @@ -1,142 +0,0 @@ -expr = $expr; - $this->method_id = $method_id; - $this->appearing_method_id = $appearing_method_id; - $this->declaring_method_id = $declaring_method_id; - $this->context = $context; - $this->statements_source = $statements_source; - $this->codebase = $codebase; - $this->file_replacements = $file_replacements; - $this->return_type_candidate = $return_type_candidate; - } - - /** - * @return MethodCall|StaticCall - */ - public function getExpr(): Expr - { - return $this->expr; - } - - public function getMethodId(): string - { - return $this->method_id; - } - - public function getAppearingMethodId(): string - { - return $this->appearing_method_id; - } - - public function getDeclaringMethodId(): string - { - return $this->declaring_method_id; - } - - public function getContext(): Context - { - return $this->context; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * @return FileManipulation[] - */ - public function getFileReplacements(): array - { - return $this->file_replacements; - } - - public function getReturnTypeCandidate(): ?Union - { - return $this->return_type_candidate; - } - - /** - * @param FileManipulation[] $file_replacements - */ - public function setFileReplacements(array $file_replacements): void - { - $this->file_replacements = $file_replacements; - } - - public function setReturnTypeCandidate(?Union $return_type_candidate): void - { - $this->return_type_candidate = $return_type_candidate; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php deleted file mode 100644 index ff3f204d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php +++ /dev/null @@ -1,88 +0,0 @@ -stmt = $stmt; - $this->context = $context; - $this->statements_source = $statements_source; - $this->codebase = $codebase; - $this->file_replacements = $file_replacements; - } - - public function getStmt(): Stmt - { - return $this->stmt; - } - - public function getContext(): Context - { - return $this->context; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } - - /** - * @return FileManipulation[] - */ - public function getFileReplacements(): array - { - return $this->file_replacements; - } - - /** - * @param FileManipulation[] $file_replacements - */ - public function setFileReplacements(array $file_replacements): void - { - $this->file_replacements = $file_replacements; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php deleted file mode 100644 index c11f317f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php +++ /dev/null @@ -1,63 +0,0 @@ -statements_source = $statements_source; - $this->file_context = $file_context; - $this->file_storage = $file_storage; - $this->codebase = $codebase; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getFileContext(): Context - { - return $this->file_context; - } - - public function getFileStorage(): FileStorage - { - return $this->file_storage; - } - - public function getCodebase(): Codebase - { - return $this->codebase; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php deleted file mode 100644 index 48a9ee53..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php +++ /dev/null @@ -1,40 +0,0 @@ -statements_source = $statements_source; - $this->function_id = $function_id; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getFunctionId(): string - { - return $this->function_id; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php deleted file mode 100644 index a623e697..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php +++ /dev/null @@ -1,77 +0,0 @@ - $call_args - */ - public function __construct( - StatementsSource $statements_source, - string $function_id, - array $call_args, - ?Context $context = null, - ?CodeLocation $code_location = null - ) { - $this->statements_source = $statements_source; - $this->function_id = $function_id; - $this->call_args = $call_args; - $this->context = $context; - $this->code_location = $code_location; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - public function getFunctionId(): string - { - return $this->function_id; - } - - /** - * @return PhpParser\Node\Arg[] - */ - public function getCallArgs(): array - { - return $this->call_args; - } - - public function getContext(): ?Context - { - return $this->context; - } - - public function getCodeLocation(): ?CodeLocation - { - return $this->code_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php deleted file mode 100644 index e686fafd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php +++ /dev/null @@ -1,89 +0,0 @@ -statements_source = $statements_source; - $this->function_id = $function_id; - $this->stmt = $stmt; - $this->context = $context; - $this->code_location = $code_location; - } - - public function getStatementsSource(): StatementsSource - { - return $this->statements_source; - } - - /** - * @return non-empty-string - */ - public function getFunctionId(): string - { - return $this->function_id; - } - - /** - * @return list - */ - public function getCallArgs(): array - { - return $this->stmt->getArgs(); - } - - public function getContext(): Context - { - return $this->context; - } - - public function getCodeLocation(): CodeLocation - { - return $this->code_location; - } - - public function getStmt(): PhpParser\Node\Expr\FuncCall - { - return $this->stmt; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php deleted file mode 100644 index 3ca5acc9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php +++ /dev/null @@ -1,63 +0,0 @@ -fq_classlike_name = $fq_classlike_name; - $this->method_name_lowercase = $method_name_lowercase; - $this->source = $source; - $this->code_location = $code_location; - } - - public function getFqClasslikeName(): string - { - return $this->fq_classlike_name; - } - - public function getMethodNameLowercase(): string - { - return $this->method_name_lowercase; - } - - public function getSource(): ?StatementsSource - { - return $this->source; - } - - public function getCodeLocation(): ?CodeLocation - { - return $this->code_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php deleted file mode 100644 index d974e4f5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php +++ /dev/null @@ -1,88 +0,0 @@ -|null - */ - private $call_args; - /** - * @var StatementsSource|null - */ - private $statements_source; - /** - * @var Context|null - */ - private $context; - /** - * @var CodeLocation|null - */ - private $code_location; - - /** - * @param list $call_args - */ - public function __construct( - string $fq_classlike_name, - string $method_name_lowercase, - ?array $call_args = null, - ?StatementsSource $statements_source = null, - ?Context $context = null, - ?CodeLocation $code_location = null - ) { - $this->fq_classlike_name = $fq_classlike_name; - $this->method_name_lowercase = $method_name_lowercase; - $this->call_args = $call_args; - $this->statements_source = $statements_source; - $this->context = $context; - $this->code_location = $code_location; - } - - public function getFqClasslikeName(): string - { - return $this->fq_classlike_name; - } - - public function getMethodNameLowercase(): string - { - return $this->method_name_lowercase; - } - - /** - * @return list|null - */ - public function getCallArgs(): ?array - { - return $this->call_args; - } - - public function getStatementsSource(): ?StatementsSource - { - return $this->statements_source; - } - - public function getContext(): ?Context - { - return $this->context; - } - - public function getCodeLocation(): ?CodeLocation - { - return $this->code_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php deleted file mode 100644 index 52ab51e3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php +++ /dev/null @@ -1,146 +0,0 @@ - $template_type_parameters - * @param lowercase-string $method_name_lowercase - * @param lowercase-string $called_method_name_lowercase - */ - public function __construct( - StatementsSource $source, - string $fq_classlike_name, - string $method_name_lowercase, - $stmt, - Context $context, - CodeLocation $code_location, - ?array $template_type_parameters = null, - ?string $called_fq_classlike_name = null, - ?string $called_method_name_lowercase = null - ) { - $this->source = $source; - $this->fq_classlike_name = $fq_classlike_name; - $this->method_name_lowercase = $method_name_lowercase; - $this->context = $context; - $this->code_location = $code_location; - $this->stmt = $stmt; - $this->template_type_parameters = $template_type_parameters; - $this->called_fq_classlike_name = $called_fq_classlike_name; - $this->called_method_name_lowercase = $called_method_name_lowercase; - } - - public function getSource(): StatementsSource - { - return $this->source; - } - - public function getFqClasslikeName(): string - { - return $this->fq_classlike_name; - } - - /** - * @return lowercase-string - */ - public function getMethodNameLowercase(): string - { - return $this->method_name_lowercase; - } - - /** - * @return list - */ - public function getCallArgs(): array - { - return $this->stmt->getArgs(); - } - - public function getContext(): Context - { - return $this->context; - } - - public function getCodeLocation(): CodeLocation - { - return $this->code_location; - } - - /** - * @return Union[]|null - */ - public function getTemplateTypeParameters(): ?array - { - return $this->template_type_parameters; - } - - public function getCalledFqClasslikeName(): ?string - { - return $this->called_fq_classlike_name; - } - - /** - * @return lowercase-string|null - */ - public function getCalledMethodNameLowercase(): ?string - { - return $this->called_method_name_lowercase; - } - - /** - * @return PhpParser\Node\Expr\MethodCall|PhpParser\Node\Expr\StaticCall - */ - public function getStmt() - { - return $this->stmt; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php deleted file mode 100644 index 90ceb7d3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php +++ /dev/null @@ -1,70 +0,0 @@ -source = $source; - $this->fq_classlike_name = $fq_classlike_name; - $this->method_name_lowercase = $method_name_lowercase; - $this->context = $context; - $this->code_location = $code_location; - } - - public function getSource(): StatementsSource - { - return $this->source; - } - - public function getFqClasslikeName(): string - { - return $this->fq_classlike_name; - } - - public function getMethodNameLowercase(): string - { - return $this->method_name_lowercase; - } - - public function getContext(): Context - { - return $this->context; - } - - public function getCodeLocation(): ?CodeLocation - { - return $this->code_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php deleted file mode 100644 index 5cb98d5e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php +++ /dev/null @@ -1,87 +0,0 @@ -fq_classlike_name = $fq_classlike_name; - $this->property_name = $property_name; - $this->read_mode = $read_mode; - $this->source = $source; - $this->context = $context; - $this->code_location = $code_location; - } - - public function getFqClasslikeName(): string - { - return $this->fq_classlike_name; - } - - public function getPropertyName(): string - { - return $this->property_name; - } - - public function isReadMode(): bool - { - return $this->read_mode; - } - - public function getSource(): ?StatementsSource - { - return $this->source; - } - - public function getContext(): ?Context - { - return $this->context; - } - - public function getCodeLocation(): ?CodeLocation - { - return $this->code_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php deleted file mode 100644 index 65e91e22..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php +++ /dev/null @@ -1,69 +0,0 @@ -fq_classlike_name = $fq_classlike_name; - $this->property_name = $property_name; - $this->read_mode = $read_mode; - $this->source = $source; - $this->context = $context; - } - - public function getFqClasslikeName(): string - { - return $this->fq_classlike_name; - } - - public function getPropertyName(): string - { - return $this->property_name; - } - - public function isReadMode(): bool - { - return $this->read_mode; - } - - public function getSource(): ?StatementsSource - { - return $this->source; - } - - public function getContext(): ?Context - { - return $this->context; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php deleted file mode 100644 index 78ef4b57..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php +++ /dev/null @@ -1,81 +0,0 @@ -source = $source; - $this->fq_classlike_name = $fq_classlike_name; - $this->property_name = $property_name; - $this->read_mode = $read_mode; - $this->context = $context; - $this->code_location = $code_location; - } - - public function getSource(): StatementsSource - { - return $this->source; - } - - public function getFqClasslikeName(): string - { - return $this->fq_classlike_name; - } - - public function getPropertyName(): string - { - return $this->property_name; - } - - public function isReadMode(): bool - { - return $this->read_mode; - } - - public function getContext(): Context - { - return $this->context; - } - - public function getCodeLocation(): CodeLocation - { - return $this->code_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php deleted file mode 100644 index c92d2442..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php +++ /dev/null @@ -1,24 +0,0 @@ -value = $value; - } - - public function getValue(): string - { - return $this->value; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php deleted file mode 100644 index dbe4617b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - public static function getFunctionIds(): array; - - /** - * Use this hook for informing whether or not a global function exists. If you know the function does - * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis - * will continue to determine if the function actually exists. - * - */ - public static function doesFunctionExist(FunctionExistenceProviderEvent $event): ?bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php deleted file mode 100644 index 0c966f17..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ - public static function getFunctionIds(): array; - - /** - * @return ?array - */ - public static function getFunctionParams(FunctionParamsProviderEvent $event): ?array; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php deleted file mode 100644 index 8e10b6d6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - public static function getFunctionIds(): array; - - /** - * Use this hook for providing custom return type logic. If this plugin does not know what a function should - * return but another plugin may be able to determine the type, return null. Otherwise return a mixed union type - * if something should be returned, but can't be more specific. - */ - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php deleted file mode 100644 index f94638f4..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php +++ /dev/null @@ -1,20 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - /** - * Use this hook for informing whether or not a method exists on a given object. If you know the method does - * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis will - * continue to determine if the method actually exists. - */ - public static function doesMethodExist(MethodExistenceProviderEvent $event): ?bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php deleted file mode 100644 index a2d44ed1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - /** - * @return ?array - */ - public static function getMethodParams(MethodParamsProviderEvent $event): ?array; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php deleted file mode 100644 index 1ce1fa16..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - /** - * Use this hook for providing custom return type logic. If this plugin does not know what a method should return - * but another plugin may be able to determine the type, return null. Otherwise return a mixed union type if - * something should be returned, but can't be more specific. - */ - public static function getMethodReturnType(MethodReturnTypeProviderEvent $event): ?Union; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php deleted file mode 100644 index 65ea9171..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php +++ /dev/null @@ -1,15 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - public static function isMethodVisible(MethodVisibilityProviderEvent $event): ?bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php deleted file mode 100644 index b45434de..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - /** - * Use this hook for informing whether or not a property exists on a given object. If you know the property does - * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis will - * continue to determine if the property actually exists. - * - */ - public static function doesPropertyExist(PropertyExistenceProviderEvent $event): ?bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php deleted file mode 100644 index fd7dee3a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php +++ /dev/null @@ -1,16 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - public static function getPropertyType(PropertyTypeProviderEvent $event): ?Union; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php deleted file mode 100644 index 7680bd23..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php +++ /dev/null @@ -1,15 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - public static function isPropertyVisible(PropertyVisibilityProviderEvent $event): ?bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php deleted file mode 100644 index 08868cf8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php +++ /dev/null @@ -1,15 +0,0 @@ - - */ - public static function removeTaints(AddRemoveTaintsEvent $event): array; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php deleted file mode 100644 index 6bfd2227..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php +++ /dev/null @@ -1,14 +0,0 @@ -> $issues - */ - public static function afterAnalysis( - Codebase $codebase, - array $issues, - array $build_info, - ?SourceControlInfo $source_control_info = null - ): void; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php deleted file mode 100644 index c910400e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - */ - public static function getFunctionIds(): array; - - /** - * Use this hook for informing whether or not a global function exists. If you know the function does - * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis - * will continue to determine if the function actually exists. - * - */ - public static function doesFunctionExist( - StatementsSource $statements_source, - string $function_id - ): ?bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php deleted file mode 100644 index 8b23d829..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - */ - public static function getFunctionIds(): array; - - /** - * @param list $call_args - * - * @return ?array - */ - public static function getFunctionParams( - StatementsSource $statements_source, - string $function_id, - array $call_args, - ?Context $context = null, - ?CodeLocation $code_location = null - ): ?array; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php deleted file mode 100644 index 125d779f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - */ - public static function getFunctionIds(): array; - - /** - * Use this hook for providing custom return type logic. If this plugin does not know what a function should - * return but another plugin may be able to determine the type, return null. Otherwise return a mixed union type - * if something should be returned, but can't be more specific. - * - * @param list $call_args - */ - public static function getFunctionReturnType( - StatementsSource $statements_source, - string $function_id, - array $call_args, - Context $context, - CodeLocation $code_location - ): ?Union; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php deleted file mode 100644 index 2964fe60..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - /** - * Use this hook for informing whether or not a method exists on a given object. If you know the method does - * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis will - * continue to determine if the method actually exists. - */ - public static function doesMethodExist( - string $fq_classlike_name, - string $method_name_lowercase, - ?StatementsSource $source = null, - ?CodeLocation $code_location = null - ): ?bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php deleted file mode 100644 index 680c60a8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - /** - * @param list $call_args - * - * @return ?array - */ - public static function getMethodParams( - string $fq_classlike_name, - string $method_name_lowercase, - ?array $call_args = null, - ?StatementsSource $statements_source = null, - ?Context $context = null, - ?CodeLocation $code_location = null - ): ?array; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php deleted file mode 100644 index c39a61ce..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php +++ /dev/null @@ -1,40 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - /** - * Use this hook for providing custom return type logic. If this plugin does not know what a method should return - * but another plugin may be able to determine the type, return null. Otherwise return a mixed union type if - * something should be returned, but can't be more specific. - * - * @param list $call_args - * @param ?array $template_type_parameters - * @param lowercase-string $method_name_lowercase - * @param lowercase-string $called_method_name_lowercase - */ - public static function getMethodReturnType( - StatementsSource $source, - string $fq_classlike_name, - string $method_name_lowercase, - array $call_args, - Context $context, - CodeLocation $code_location, - ?array $template_type_parameters = null, - ?string $called_fq_classlike_name = null, - ?string $called_method_name_lowercase = null - ): ?Union; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php deleted file mode 100644 index bf611352..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - public static function isMethodVisible( - StatementsSource $source, - string $fq_classlike_name, - string $method_name_lowercase, - Context $context, - ?CodeLocation $code_location = null - ): ?bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php deleted file mode 100644 index 6debbb96..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - /** - * Use this hook for informing whether or not a property exists on a given object. If you know the property does - * not exist, return false. If you aren't sure if it exists or not, return null and the default analysis will - * continue to determine if the property actually exists. - * - */ - public static function doesPropertyExist( - string $fq_classlike_name, - string $property_name, - bool $read_mode, - ?StatementsSource $source = null, - ?Context $context = null, - ?CodeLocation $code_location = null - ): ?bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php deleted file mode 100644 index 0e3f18fc..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - public static function getPropertyType( - string $fq_classlike_name, - string $property_name, - bool $read_mode, - ?StatementsSource $source = null, - ?Context $context = null - ): ?Union; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php deleted file mode 100644 index 650b9447..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ - public static function getClassLikeNames(): array; - - public static function isPropertyVisible( - StatementsSource $source, - string $fq_classlike_name, - string $property_name, - bool $read_mode, - Context $context, - CodeLocation $code_location - ): ?bool; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php deleted file mode 100644 index 976918ee..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php +++ /dev/null @@ -1,16 +0,0 @@ - $className - * @deprecated will be removed in v5.0, use \Psalm\Plugin\FileExtensionsInterface instead (#6788) - */ - public function addFileTypeScanner(string $fileExtension, string $className): void; - - /** - * @param string $fileExtension e.g. `'html'` - * @param class-string $className - * @deprecated will be removed in v5.0, use \Psalm\Plugin\FileExtensionsInterface instead (#6788) - */ - public function addFileTypeAnalyzer(string $fileExtension, string $className): void; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Shepherd.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Shepherd.php deleted file mode 100644 index 51748d5f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Plugin/Shepherd.php +++ /dev/null @@ -1,223 +0,0 @@ -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); - - return; - } - - $source_control_data = $source_control_info ? $source_control_info->toArray() : []; - - 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 function (IssueData $i): bool { - return $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); - - $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, 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 - $return = curl_exec($ch); - - if ($return !== '') { - fwrite(STDERR, 'Error with Psalm Shepherd:' . PHP_EOL); - - if ($return === false) { - fwrite(STDERR, self::getCurlErrorMessage($ch) . PHP_EOL); - } else { - echo $return . PHP_EOL; - echo 'Git args: ' - . var_export($source_control_data, true) - . PHP_EOL; - echo 'CI args: ' - . var_export($build_info, true) - . PHP_EOL; - } - } else { - $short_address = str_replace('https://', '', $base_address); - - fwrite(STDERR, "🐑 results sent to $short_address 🐑" . PHP_EOL); - } - - // Close cURL session handle - curl_close($ch); - } - } - - /** - * @param mixed $ch - * - * @psalm-pure - */ - public static function getCurlErrorMessage($ch): string - { - /** - * @psalm-suppress MixedArgument - * @var array - */ - $curl_info = curl_getinfo($ch); - - if (isset($curl_info['ssl_verify_result']) - && $curl_info['ssl_verify_result'] !== 0 - ) { - switch ($curl_info['ssl_verify_result']) { - case 2: - return 'unable to get issuer certificate'; - case 3: - return 'unable to get certificate CRL'; - case 4: - return 'unable to decrypt certificate’s signature'; - case 5: - return 'unable to decrypt CRL’s signature'; - case 6: - return 'unable to decode issuer public key'; - case 7: - return 'certificate signature failure'; - case 8: - return 'CRL signature failure'; - case 9: - return 'certificate is not yet valid'; - case 10: - return 'certificate has expired'; - case 11: - return 'CRL is not yet valid'; - case 12: - return 'CRL has expired'; - case 13: - return 'format error in certificate’s notBefore field'; - case 14: - return 'format error in certificate’s notAfter field'; - case 15: - return 'format error in CRL’s lastUpdate field'; - case 16: - return 'format error in CRL’s nextUpdate field'; - case 17: - return 'out of memory'; - case 18: - return 'self signed certificate'; - case 19: - return 'self signed certificate in certificate chain'; - case 20: - return 'unable to get local issuer certificate'; - case 21: - return 'unable to verify the first certificate'; - case 22: - return 'certificate chain too long'; - case 23: - return 'certificate revoked'; - case 24: - return 'invalid CA certificate'; - case 25: - return 'path length constraint exceeded'; - case 26: - return 'unsupported certificate purpose'; - case 27: - return 'certificate not trusted'; - case 28: - return 'certificate rejected'; - case 29: - return 'subject issuer mismatch'; - case 30: - return 'authority and subject key identifier mismatch'; - case 31: - return 'authority and issuer serial number mismatch'; - case 32: - return 'key usage does not include certificate signing'; - case 50: - return 'application verification failure'; - } - - return ''; - } - - /** - * @psalm-suppress MixedArgument - */ - return var_export(curl_getinfo($ch), true); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php b/vendor/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php deleted file mode 100644 index 8d5340c4..00000000 --- a/vendor/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php +++ /dev/null @@ -1,238 +0,0 @@ -> - */ - private $additionalFileTypeScanners = []; - - /** - * @var array> - */ - private $additionalFileTypeAnalyzers = []; - - /** - * @var list - */ - private $additionalFileExtensions = []; - - /** - * @internal - */ - public function __construct(Config $config, Codebase $codebase) - { - $this->config = $config; - $this->codebase = $codebase; - } - - public function addStubFile(string $file_name): void - { - $this->config->addStubFile($file_name); - } - - public function registerHooksFromClass(string $handler): void - { - if (!class_exists($handler, false)) { - throw new InvalidArgumentException('Plugins must be loaded before registration'); - } - - $this->config->eventDispatcher->registerClass($handler); - - if (is_subclass_of($handler, LegacyPropertyExistenceProviderInterface::class) || - is_subclass_of($handler, PropertyExistenceProviderInterface::class) - ) { - $this->codebase->properties->property_existence_provider->registerClass($handler); - } - - if (is_subclass_of($handler, LegacyPropertyVisibilityProviderInterface::class) || - is_subclass_of($handler, PropertyVisibilityProviderInterface::class) - ) { - $this->codebase->properties->property_visibility_provider->registerClass($handler); - } - - if (is_subclass_of($handler, LegacyPropertyTypeProviderInterface::class) || - is_subclass_of($handler, PropertyTypeProviderInterface::class) - ) { - $this->codebase->properties->property_type_provider->registerClass($handler); - } - - if (is_subclass_of($handler, LegacyMethodExistenceProviderInterface::class) || - is_subclass_of($handler, MethodExistenceProviderInterface::class) - ) { - $this->codebase->methods->existence_provider->registerClass($handler); - } - - if (is_subclass_of($handler, LegacyMethodVisibilityProviderInterface::class) || - is_subclass_of($handler, MethodVisibilityProviderInterface::class) - ) { - $this->codebase->methods->visibility_provider->registerClass($handler); - } - - if (is_subclass_of($handler, LegacyMethodReturnTypeProviderInterface::class) || - is_subclass_of($handler, MethodReturnTypeProviderInterface::class) - ) { - $this->codebase->methods->return_type_provider->registerClass($handler); - } - - if (is_subclass_of($handler, LegacyMethodParamsProviderInterface::class) || - is_subclass_of($handler, MethodParamsProviderInterface::class) - ) { - $this->codebase->methods->params_provider->registerClass($handler); - } - - if (is_subclass_of($handler, LegacyFunctionExistenceProviderInterface::class) || - is_subclass_of($handler, FunctionExistenceProviderInterface::class) - ) { - $this->codebase->functions->existence_provider->registerClass($handler); - } - - if (is_subclass_of($handler, LegacyFunctionParamsProviderInterface::class) || - is_subclass_of($handler, FunctionParamsProviderInterface::class) - ) { - $this->codebase->functions->params_provider->registerClass($handler); - } - - if (is_subclass_of($handler, LegacyFunctionReturnTypeProviderInterface::class) || - is_subclass_of($handler, FunctionReturnTypeProviderInterface::class) - ) { - $this->codebase->functions->return_type_provider->registerClass($handler); - } - } - - /** - * @param string $fileExtension e.g. `'html'` - * @param class-string $className - * @deprecated will be removed in v5.0, use \Psalm\Plugin\FileExtensionsInterface instead (#6788) - */ - public function addFileTypeScanner(string $fileExtension, string $className): void - { - if (!class_exists($className) || !is_a($className, FileScanner::class, true)) { - throw new LogicException( - sprintf( - 'Class %s must be of type %s', - $className, - FileScanner::class - ), - 1622727271 - ); - } - if (!empty($this->config->getFiletypeScanners()[$fileExtension]) - || !empty($this->additionalFileTypeScanners[$fileExtension]) - ) { - throw new LogicException( - sprintf('Cannot redeclare scanner for file-type %s', $fileExtension), - 1622727272 - ); - } - $this->additionalFileTypeScanners[$fileExtension] = $className; - $this->addFileExtension($fileExtension); - } - - /** - * @return array> - * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788) - */ - public function getAdditionalFileTypeScanners(): array - { - return $this->additionalFileTypeScanners; - } - - /** - * @param string $fileExtension e.g. `'html'` - * @param class-string $className - * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788) - */ - public function addFileTypeAnalyzer(string $fileExtension, string $className): void - { - if (!class_exists($className) || !is_a($className, FileAnalyzer::class, true)) { - throw new LogicException( - sprintf( - 'Class %s must be of type %s', - $className, - FileAnalyzer::class - ), - 1622727281 - ); - } - if (!empty($this->config->getFiletypeAnalyzers()[$fileExtension]) - || !empty($this->additionalFileTypeAnalyzers[$fileExtension]) - ) { - throw new LogicException( - sprintf('Cannot redeclare analyzer for file-type %s', $fileExtension), - 1622727282 - ); - } - $this->additionalFileTypeAnalyzers[$fileExtension] = $className; - $this->addFileExtension($fileExtension); - } - - /** - * @return array> - * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788) - */ - public function getAdditionalFileTypeAnalyzers(): array - { - return $this->additionalFileTypeAnalyzers; - } - - /** - * @return list e.g. `['html', 'perl']` - * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788) - */ - public function getAdditionalFileExtensions(): array - { - return $this->additionalFileExtensions; - } - - /** - * @param string $fileExtension e.g. `'html'` - * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788) - */ - private function addFileExtension(string $fileExtension): void - { - if (!in_array($fileExtension, $this->config->getFileExtensions(), true)) { - $this->additionalFileExtensions[] = $fileExtension; - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Progress/DebugProgress.php b/vendor/vimeo/psalm/src/Psalm/Progress/DebugProgress.php deleted file mode 100644 index 192976d6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Progress/DebugProgress.php +++ /dev/null @@ -1,40 +0,0 @@ -write($message); - } - - public function startScanningFiles(): void - { - $this->write('Scanning files...' . "\n"); - } - - public function startAnalyzingFiles(): void - { - $this->write('Analyzing files...' . "\n"); - } - - public function startAlteringFiles(): void - { - $this->write('Updating files...' . "\n"); - } - - public function alterFileDone(string $file_name): void - { - $this->write('Altered ' . $file_name . "\n"); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php b/vendor/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php deleted file mode 100644 index 76f91e98..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php +++ /dev/null @@ -1,104 +0,0 @@ -number_of_tasks > self::TOO_MANY_FILES) { - ++$this->progress; - - // Source for rate limiting: - // https://github.com/phan/phan/blob/9a788581ee1a4e1c35bebf89c435fd8a238c1d17/src/Phan/CLI.php - $time = microtime(true); - - // If not enough time has elapsed, then don't update the progress bar. - // Making the update frequency based on time (instead of the number of files) - // prevents the terminal from rapidly flickering while processing small/empty files, - // and reduces the time spent writing to stderr. - if ($time - $this->previous_update_time < self::PROGRESS_BAR_SAMPLE_INTERVAL) { - // Make sure to output the section for 100% completion regardless of limits, to avoid confusion. - if ($this->progress !== $this->number_of_tasks) { - return; - } - } - $this->previous_update_time = $time; - - $inner_progress = self::renderInnerProgressBar( - self::NUMBER_OF_COLUMNS, - $this->progress / $this->number_of_tasks - ); - - $this->write($inner_progress . ' ' . $this->getOverview() . "\r"); - } else { - parent::taskDone($level); - } - } - - /** - * Fully stolen from - * https://github.com/phan/phan/blob/d61a624b1384ea220f39927d53fd656a65a75fac/src/Phan/CLI.php - * Renders a unicode progress bar that goes from light (left) to dark (right) - * The length in the console is the positive integer $length - * - * @see https://en.wikipedia.org/wiki/Block_Elements - */ - private static function renderInnerProgressBar(int $length, float $p): string - { - $current_float = $p * $length; - $current = (int)$current_float; - $rest = max($length - $current, 0); - - if (!self::doesTerminalSupportUtf8()) { - // Show a progress bar of "XXXX>------" in Windows when utf-8 is unsupported. - $progress_bar = str_repeat('X', $current); - $delta = $current_float - $current; - if ($delta > 0.5) { - $progress_bar .= '>' . str_repeat('-', $rest - 1); - } else { - $progress_bar .= str_repeat('-', $rest); - } - - return $progress_bar; - } - - // The left-most characters are "Light shade" - $progress_bar = str_repeat("\u{2588}", $current); - $delta = $current_float - $current; - if ($delta > 3.0 / 4) { - $progress_bar .= "\u{258A}" . str_repeat("\u{2591}", $rest - 1); - } elseif ($delta > 2.0 / 4) { - $progress_bar .= "\u{258C}" . str_repeat("\u{2591}", $rest - 1); - } elseif ($delta > 1.0 / 4) { - $progress_bar .= "\u{258E}" . str_repeat("\u{2591}", $rest - 1); - } else { - $progress_bar .= str_repeat("\u{2591}", $rest); - } - - return $progress_bar; - } - - public function finish(): void - { - if ($this->number_of_tasks > self::TOO_MANY_FILES) { - $this->write(str_repeat(' ', self::NUMBER_OF_COLUMNS + strlen($this->getOverview()) + 1) . "\r"); - } else { - parent::finish(); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Progress/LongProgress.php b/vendor/vimeo/psalm/src/Psalm/Progress/LongProgress.php deleted file mode 100644 index 0ff13f13..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Progress/LongProgress.php +++ /dev/null @@ -1,110 +0,0 @@ -print_errors = $print_errors; - $this->print_infos = $print_infos; - } - - public function startScanningFiles(): void - { - $this->write('Scanning files...' . "\n"); - } - - public function startAnalyzingFiles(): void - { - $this->write('Analyzing files...' . "\n\n"); - } - - public function startAlteringFiles(): void - { - $this->write('Altering files...' . "\n"); - } - - public function alterFileDone(string $file_name): void - { - $this->write('Altered ' . $file_name . "\n"); - } - - public function start(int $number_of_tasks): void - { - $this->number_of_tasks = $number_of_tasks; - $this->progress = 0; - } - - public function taskDone(int $level): void - { - if ($level === 0 || ($level === 1 && !$this->print_infos) || !$this->print_errors) { - $this->write(self::doesTerminalSupportUtf8() ? '░' : '_'); - } elseif ($level === 1) { - $this->write('I'); - } else { - $this->write('E'); - } - - ++$this->progress; - - if (($this->progress % self::NUMBER_OF_COLUMNS) !== 0) { - return; - } - - $this->printOverview(); - $this->write(PHP_EOL); - } - - public function finish(): void - { - $this->write(PHP_EOL); - } - - protected function getOverview(): string - { - if ($this->number_of_tasks === null) { - throw new LogicException('Progress::start() should be called before Progress::startDone()'); - } - - $leadingSpaces = 1 + strlen((string) $this->number_of_tasks) - strlen((string) $this->progress); - // Don't show 100% unless this is the last line of the progress bar. - $percentage = floor($this->progress / $this->number_of_tasks * 100); - - return sprintf( - '%s%s / %s (%s%%)', - str_repeat(' ', $leadingSpaces), - $this->progress, - $this->number_of_tasks, - $percentage - ); - } - - private function printOverview(): void - { - $this->write($this->getOverview()); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Progress/Progress.php b/vendor/vimeo/psalm/src/Psalm/Progress/Progress.php deleted file mode 100644 index 678f4d17..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Progress/Progress.php +++ /dev/null @@ -1,69 +0,0 @@ - - */ - protected $issues_data; - - /** @var array */ - protected $fixable_issue_counts; - - /** @var bool */ - protected $use_color; - - /** @var bool */ - protected $show_snippet; - - /** @var bool */ - protected $show_info; - - /** @var bool */ - protected $pretty; - - /** @var bool */ - protected $in_ci; - - /** @var int */ - protected $mixed_expression_count; - - /** @var int */ - protected $total_expression_count; - - /** - * @param array $issues_data - * @param array $fixable_issue_counts - */ - public function __construct( - array $issues_data, - array $fixable_issue_counts, - ReportOptions $report_options, - int $mixed_expression_count = 1, - int $total_expression_count = 1 - ) { - if (!$report_options->show_info) { - $this->issues_data = array_filter( - $issues_data, - function ($issue_data): bool { - return $issue_data->severity !== Config::REPORT_INFO; - } - ); - } else { - $this->issues_data = $issues_data; - } - $this->fixable_issue_counts = $fixable_issue_counts; - - $this->use_color = $report_options->use_color; - $this->show_snippet = $report_options->show_snippet; - $this->show_info = $report_options->show_info; - $this->pretty = $report_options->pretty; - $this->in_ci = $report_options->in_ci; - - $this->mixed_expression_count = $mixed_expression_count; - $this->total_expression_count = $total_expression_count; - } - - protected function xmlEncode(string $data): string - { - return htmlspecialchars($data, ENT_XML1 | ENT_QUOTES); - } - - abstract public function create(): string; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php b/vendor/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php deleted file mode 100644 index 247c258a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php +++ /dev/null @@ -1,39 +0,0 @@ -' . "\n"; - - $output .= '' . "\n"; - - foreach ($this->issues_data as $issue_data) { - $message = sprintf( - '%s: %s', - $issue_data->type, - $issue_data->message - ); - - $output .= '' . "\n"; - $output .= ' '; - $output .= 'line_from . '"'; - $output .= ' column="' . $issue_data->column_from . '"'; - $output .= ' severity="' . $issue_data->severity . '"'; - $output .= ' message="' . $this->xmlEncode($message) . '"'; - $output .= '/>' . "\n"; - $output .= '' . "\n"; - } - - $output .= '' . "\n"; - - return $output; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php b/vendor/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php deleted file mode 100644 index cdd1458b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php +++ /dev/null @@ -1,95 +0,0 @@ - - */ -class CodeClimateReport extends Report -{ - public function create(): string - { - $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; - - $issues_data = array_map( - function (IssueData $issue): array { - /** - * map fields to new structure. - * Expected fields: - * - type - * - check_name - * - description* - * - content - * - categories[] - * - severity - * - fingerprint* - * - location.path* - * - location.lines.begin* - * - * Fields with * are the one used by Gitlab for Code Quality - */ - return [ - 'type' => 'issue', - 'check_name' => $issue->type, - 'description' => $issue->message, - 'categories' => [$issue->type], - 'severity' => $this->convertSeverity($issue->severity), - 'fingerprint' => $this->calculateFingerprint($issue), - 'location' => [ - 'path' => $issue->file_name, - 'lines' => [ - 'begin' => $issue->line_from, - 'end' => $issue->line_to, - ], - ], - ]; - }, - $this->issues_data - ); - - return Json::encode(array_values($issues_data), $options) . "\n"; - } - - /** - * convert our own severity to CodeClimate format - * Values can be : info, minor, major, critical, or blocker - */ - protected function convertSeverity(string $input): string - { - if (Config::REPORT_INFO === $input) { - return 'info'; - } - if (Config::REPORT_ERROR === $input) { - return 'critical'; - } - if (Config::REPORT_SUPPRESS === $input) { - return 'minor'; - } - - // unknown cases ? fallback - return 'critical'; - } - - /** - * calculate a unique fingerprint for a given issue - */ - protected function calculateFingerprint(IssueData $issue): string - { - return md5($issue->type.$issue->message.$issue->file_name.$issue->from.$issue->to); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/CompactReport.php b/vendor/vimeo/psalm/src/Psalm/Report/CompactReport.php deleted file mode 100644 index f1d001a0..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/CompactReport.php +++ /dev/null @@ -1,84 +0,0 @@ -issues_data as $i => $issue_data) { - if (!$this->show_info && $issue_data->severity === Config::REPORT_INFO) { - continue; - } - - if ($current_file === null || $current_file !== $issue_data->file_name) { - // If we're processing a new file, then wrap up the last table and render it out. - if ($buffer !== null) { - $table->render(); - $output[] = $buffer->fetch(); - } - - $output[] = 'FILE: ' . $issue_data->file_name . "\n"; - - $buffer = new BufferedOutput(); - $table = new Table($buffer); - $table->setHeaders(['SEVERITY', 'LINE', 'ISSUE', 'DESCRIPTION']); - } - - $is_error = $issue_data->severity === Config::REPORT_ERROR; - if ($is_error) { - $severity = ($this->use_color ? "\e[0;31mERROR\e[0m" : 'ERROR'); - } else { - $severity = strtoupper($issue_data->severity); - } - - // Since `Table::setColumnMaxWidth` is only available in symfony/console 4.2+ we need do something similar - // so we have clean tables. - $message = $issue_data->message; - if (strlen($message) > 70) { - $message = implode("\n", str_split($message, 70)); - } - - $table->addRow([ - $severity, - $issue_data->line_from, - $issue_data->type, - $message, - ]); - - $current_file = $issue_data->file_name; - - // If we're at the end of the issue sets, then wrap up the last table and render it out. - if ($i === count($this->issues_data) - 1) { - $table->render(); - $output[] = $buffer->fetch(); - } - } - - return implode("\n", $output); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/ConsoleReport.php b/vendor/vimeo/psalm/src/Psalm/Report/ConsoleReport.php deleted file mode 100644 index 214b7124..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/ConsoleReport.php +++ /dev/null @@ -1,149 +0,0 @@ -issues_data as $issue_data) { - $output .= $this->format($issue_data) . "\n" . "\n"; - } - - return $output; - } - - private function format(IssueData $issue_data): string - { - $issue_string = ''; - - $is_error = $issue_data->severity === Config::REPORT_ERROR; - - if ($is_error) { - $issue_string .= ($this->use_color ? "\e[0;31mERROR\e[0m" : 'ERROR'); - } else { - $issue_string .= 'INFO'; - } - - $issue_reference = $issue_data->link ? ' (see ' . $issue_data->link . ')' : ''; - - $issue_string .= ': ' . $issue_data->type - . ' - ' . $this->getFileReference($issue_data) - . ' - ' . $issue_data->message . $issue_reference . "\n"; - - - if ($issue_data->taint_trace) { - $issue_string .= $this->getTaintSnippets($issue_data->taint_trace); - } elseif ($this->show_snippet) { - $snippet = $issue_data->snippet; - - if (!$this->use_color) { - $issue_string .= $snippet; - } else { - $selection_start = $issue_data->from - $issue_data->snippet_from; - $selection_length = $issue_data->to - $issue_data->from; - - $issue_string .= substr($snippet, 0, $selection_start) - . ($is_error ? "\e[97;41m" : "\e[30;47m") . substr($snippet, $selection_start, $selection_length) - . "\e[0m" . substr($snippet, $selection_length + $selection_start) . "\n"; - } - } - - if ($issue_data->other_references) { - if ($this->show_snippet) { - $issue_string .= "\n"; - } - - $issue_string .= $this->getTaintSnippets($issue_data->other_references); - } - - return $issue_string; - } - - /** - * @param non-empty-list $taint_trace - */ - private function getTaintSnippets(array $taint_trace): string - { - $snippets = ''; - - foreach ($taint_trace as $node_data) { - if ($node_data instanceof DataFlowNodeData) { - $snippets .= ' ' . $node_data->label . ' - ' . $this->getFileReference($node_data) . "\n"; - - if ($this->show_snippet) { - $snippet = $node_data->snippet; - - if (!$this->use_color) { - $snippets .= $snippet . "\n\n"; - } else { - $selection_start = $node_data->from - $node_data->snippet_from; - $selection_length = $node_data->to - $node_data->from; - - $snippets .= substr($snippet, 0, $selection_start) - . "\e[30;47m" . substr($snippet, $selection_start, $selection_length) - . "\e[0m" . substr($snippet, $selection_length + $selection_start) . "\n\n"; - } - } - } else { - $snippets .= ' ' . $node_data['label'] . "\n"; - $snippets .= ' ' . "\n\n"; - } - } - - return $snippets; - } - - /** - * @param IssueData|DataFlowNodeData $data - */ - private function getFileReference($data): string - { - $reference = $data->file_name . ':' . $data->line_from . ':' . $data->column_from; - - if (!$this->use_color) { - return $reference; - } - - $file_basename = basename($data->file_name); - $file_path = substr($data->file_name, 0, -strlen($file_basename)); - - $reference = $file_path - . "\033[1;31m" - . $file_basename . ':' . $data->line_from . ':' . $data->column_from - . "\033[0m" - ; - - if ($this->in_ci) { - return $reference; - } - - if (null === $this->link_format) { - // if xdebug is not enabled, use `get_cfg_var` to get the value directly from php.ini - $this->link_format = ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format') - ?: 'file://%f#L%l'; - } - - $link = strtr($this->link_format, ['%f' => $data->file_path, '%l' => $data->line_from]); - // $reference = $data->file_name . ':' . $data->line_from . ':' . $data->column_from; - - - return "\033]8;;" . $link . "\033\\" . $reference . "\033]8;;\033\\"; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/CountReport.php b/vendor/vimeo/psalm/src/Psalm/Report/CountReport.php deleted file mode 100644 index b044d851..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/CountReport.php +++ /dev/null @@ -1,39 +0,0 @@ -issues_data as $issue_data) { - if (array_key_exists($issue_data->type, $issue_type_counts)) { - $issue_type_counts[$issue_data->type]++; - } else { - $issue_type_counts[$issue_data->type] = 1; - } - } - uksort($issue_type_counts, function (string $a, string $b) use ($issue_type_counts): int { - $cmp_result = $issue_type_counts[$a] <=> $issue_type_counts[$b]; - if ($cmp_result === 0) { - return $a <=> $b; - } else { - return $cmp_result; - } - }); - - $output = ''; - foreach ($issue_type_counts as $issue_type => $count) { - $output .= "{$issue_type}: {$count}\n"; - } - return $output; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/EmacsReport.php b/vendor/vimeo/psalm/src/Psalm/Report/EmacsReport.php deleted file mode 100644 index 785b502c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/EmacsReport.php +++ /dev/null @@ -1,28 +0,0 @@ -issues_data as $issue_data) { - $output .= sprintf( - '%s:%s:%s:%s - %s', - $issue_data->file_path, - $issue_data->line_from, - $issue_data->column_from, - ($issue_data->severity === Config::REPORT_ERROR ? 'error' : 'warning'), - $issue_data->message - ) . "\n"; - } - - return $output; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php b/vendor/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php deleted file mode 100644 index 9625de5e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php +++ /dev/null @@ -1,72 +0,0 @@ -issues_data as $issue_data) { - $issue_reference = $issue_data->link ? ' (see ' . $issue_data->link . ')' : ''; - $properties = sprintf( - 'file=%1$s,line=%2$d,col=%3$d,title=%4$s', - $this->escapeProperty($issue_data->file_name), - $this->escapeProperty($issue_data->line_from), - $this->escapeProperty($issue_data->column_from), - $this->escapeProperty($issue_data->type) - ); - - $data = $this->escapeData(sprintf( - '%1$s:%2$d:%3$d: %4$s: %5$s', - $issue_data->file_name, - $issue_data->line_from, - $issue_data->column_from, - $issue_data->type, - $issue_data->message . $issue_reference - )); - - $output .= sprintf( - '::%1$s %2$s::%3$s', - ($issue_data->severity === Config::REPORT_ERROR ? 'error' : 'warning'), - $properties, - $data - ) . "\n"; - } - - return $output; - } - - private function escapeData(string $data): string - { - return strtr( - $data, - [ - '%' => '%25', - "\r" => '%0D', - "\n" => '%0A', - ] - ); - } - - /** @param mixed $value */ - private function escapeProperty($value): string - { - return strtr( - (string) $value, - [ - '%' => '%25', - "\r" => '%0D', - "\n" => '%0A', - ':' => '%3A', - ',' => '%2C', - ] - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/JsonReport.php b/vendor/vimeo/psalm/src/Psalm/Report/JsonReport.php deleted file mode 100644 index 442e4644..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/JsonReport.php +++ /dev/null @@ -1,28 +0,0 @@ -pretty ? Json::PRETTY : Json::DEFAULT; - - $issues_data = array_map( - function ($issue_data): array { - $issue_data = (array) $issue_data; - unset($issue_data['dupe_key']); - return $issue_data; - }, - $this->issues_data - ); - - return Json::encode(array_values($issues_data), $options) . "\n"; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php b/vendor/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php deleted file mode 100644 index fc36ccd8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php +++ /dev/null @@ -1,32 +0,0 @@ -issues_data as $issue_data) { - $type = $issue_data->type; - - if (!isset($type_counts[$type])) { - $type_counts[$type] = 0; - } - - ++$type_counts[$type]; - } - - $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; - - return Json::encode([ - 'issue_counts' => $type_counts, - 'mixed_expression_count' => $this->mixed_expression_count, - 'total_expression_count' => $this->total_expression_count, - ], $options) . "\n"; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/JunitReport.php b/vendor/vimeo/psalm/src/Psalm/Report/JunitReport.php deleted file mode 100644 index 6b849dcd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/JunitReport.php +++ /dev/null @@ -1,175 +0,0 @@ -issues_data as $error) { - $is_error = $error->severity === Config::REPORT_ERROR; - $is_warning = $error->severity === Config::REPORT_INFO; - - if (!$is_error && !$is_warning) { - continue; - } - - if ($is_error) { - $errors++; - } - - $tests++; - - $fname = $error->file_name; - - if (!isset($ndata[$fname])) { - $ndata[$fname] = [ - 'errors' => $is_error ? 1 : 0, - 'warnings' => $is_warning ? 1 : 0, - 'failures' => [], - ]; - } else { - if ($is_error) { - $ndata[$fname]['errors']++; - } else { - $ndata[$fname]['warnings']++; - } - } - - $ndata[$fname]['failures'][] = $error; - } - - $dom = new DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - - $schema = 'https://raw.githubusercontent.com/junit-team/'. - 'junit5/r5.5.1/platform-tests/src/test/resources/jenkins-junit.xsd'; - - $suites = $dom->createElement('testsuites'); - - $suites->setAttribute('failures', (string) $errors); - $suites->setAttribute('errors', '0'); - $suites->setAttribute('name', 'psalm'); - $suites->setAttribute('tests', (string) $tests); - $suites->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); - $suites->setAttribute('xsi:noNamespaceSchemaLocation', $schema); - $dom->appendChild($suites); - - if (!count($ndata)) { - $suites->setAttribute('tests', '1'); - - $testsuite = $dom->createElement('testsuite'); - $testsuite->setAttribute('name', 'psalm'); - $testsuite->setAttribute('failures', '0'); - $testsuite->setAttribute('errors', '0'); - $testsuite->setAttribute('tests', '1'); - - $testcase = $dom->createElement('testcase'); - $testcase->setAttribute('name', 'psalm'); - $testsuite->appendChild($testcase); - - $suites->appendChild($testsuite); - } else { - foreach ($ndata as $file => $report) { - $this->createTestSuite($dom, $suites, $file, $report); - } - } - - - - return $dom->saveXML(); - } - - /** - * @param array{ - * errors: int, - * warnings: int, - * failures: list - * } $report - */ - private function createTestSuite(DOMDocument $dom, DOMElement $parent, string $file, array $report): void - { - $totalTests = $report['errors'] + $report['warnings']; - if ($totalTests < 1) { - $totalTests = 1; - } - - $testsuite = $dom->createElement('testsuite'); - $testsuite->setAttribute('name', $file); - $testsuite->setAttribute('failures', (string) $report['errors']); - $testsuite->setAttribute('errors', '0'); - $testsuite->setAttribute('tests', (string) $totalTests); - - $failuresByType = $this->groupByType($report['failures']); - - foreach ($failuresByType as $type => $data) { - foreach ($data as $d) { - $testcase = $dom->createElement('testcase'); - $testcase->setAttribute('name', "{$file}:{$d->line_from}"); - $testcase->setAttribute('classname', $type); - $testcase->setAttribute('assertions', (string) count($data)); - - if ($d->severity === Config::REPORT_ERROR) { - $issue = $dom->createElement('failure'); - $issue->setAttribute('type', $type); - } else { - $issue = $dom->createElement('skipped'); - } - $issue->nodeValue = $this->dataToOutput($d); - - $testcase->appendChild($issue); - $testsuite->appendChild($testcase); - } - } - $parent->appendChild($testsuite); - } - - /** - * @param list $failures - * - * @return array> - */ - private function groupByType(array $failures): array - { - $nfailures = []; - - foreach ($failures as $failure) { - $nfailures[$failure->type][] = $failure; - } - - return $nfailures; - } - - private function dataToOutput(IssueData $data): string - { - $ret = 'message: ' . $this->xmlEncode(trim($data->message)) . "\n"; - $ret .= 'type: ' . trim($data->type) . "\n"; - $ret .= 'snippet: ' . $this->xmlEncode(trim($data->snippet)) . "\n"; - $ret .= 'selected_text: ' . $this->xmlEncode(trim($data->selected_text)) . "\n"; - $ret .= 'line: ' . $data->line_from . "\n"; - $ret .= 'column_from: ' . $data->column_from . "\n"; - $ret .= 'column_to: ' . $data->column_to . "\n"; - - return $ret; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/PhpStormReport.php b/vendor/vimeo/psalm/src/Psalm/Report/PhpStormReport.php deleted file mode 100644 index 8bb1f68c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/PhpStormReport.php +++ /dev/null @@ -1,99 +0,0 @@ -issues_data as $issue_data) { - $output .= $this->format($issue_data) . "\n" . "\n"; - } - - return $output; - } - - private function format(IssueData $issue_data): string - { - $issue_string = ''; - - $is_error = $issue_data->severity === Config::REPORT_ERROR; - - if ($is_error) { - $issue_string .= ($this->use_color ? "\e[0;31mERROR\e[0m" : 'ERROR'); - } else { - $issue_string .= 'INFO'; - } - - $issue_reference = $issue_data->link ? ' (see ' . $issue_data->link . ')' : ''; - - $issue_string .= ': ' . $issue_data->type - . "\nat " . $issue_data->file_path . ':' . $issue_data->line_from . ':' . $issue_data->column_from - . "\n" . $issue_data->message . $issue_reference . "\n"; - - - if ($issue_data->taint_trace) { - $issue_string .= $this->getTaintSnippets($issue_data->taint_trace); - } elseif ($this->show_snippet) { - $snippet = $issue_data->snippet; - - if (!$this->use_color) { - $issue_string .= $snippet; - } else { - $selection_start = $issue_data->from - $issue_data->snippet_from; - $selection_length = $issue_data->to - $issue_data->from; - - $issue_string .= substr($snippet, 0, $selection_start) - . ($is_error ? "\e[97;41m" : "\e[30;47m") . substr($snippet, $selection_start, $selection_length) - . "\e[0m" . substr($snippet, $selection_length + $selection_start) . "\n"; - } - } - - return $issue_string; - } - - /** - * @param non-empty-list $taint_trace - */ - private function getTaintSnippets(array $taint_trace): string - { - $snippets = ''; - - foreach ($taint_trace as $node_data) { - if ($node_data instanceof DataFlowNodeData) { - $snippets .= ' ' . $node_data->label - . ' - ' . $node_data->file_name - . ':' . $node_data->line_from - . ':' . $node_data->column_from . "\n"; - - if ($this->show_snippet) { - $snippet = $node_data->snippet; - - if (!$this->use_color) { - $snippets .= $snippet . "\n\n"; - } else { - $selection_start = $node_data->from - $node_data->snippet_from; - $selection_length = $node_data->to - $node_data->from; - - $snippets .= substr($snippet, 0, $selection_start) - . "\e[30;47m" . substr($snippet, $selection_start, $selection_length) - . "\e[0m" . substr($snippet, $selection_length + $selection_start) . "\n\n"; - } - } - } else { - $snippets .= ' ' . $node_data['label'] . "\n"; - $snippets .= ' ' . "\n\n"; - } - } - - return $snippets; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/PylintReport.php b/vendor/vimeo/psalm/src/Psalm/Report/PylintReport.php deleted file mode 100644 index fd348f08..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/PylintReport.php +++ /dev/null @@ -1,49 +0,0 @@ -issues_data as $issue_data) { - $output .= $this->format($issue_data) . "\n"; - } - - return $output; - } - - private function format(IssueData $issue_data): string - { - $message = sprintf( - '%s: %s', - $issue_data->type, - $issue_data->message - ); - - if ($issue_data->severity === Config::REPORT_ERROR) { - $code = 'E0001'; - } else { - $code = 'W0001'; - } - - // https://docs.pylint.org/en/1.6.0/output.html doesn't mention what to do about 'column', - // but it's still useful for users. - // E.g. jenkins can't parse %s:%d:%d. - $message = sprintf('%s (column %d)', $message, $issue_data->column_from); - return sprintf( - '%s:%d: [%s] %s', - $issue_data->file_name, - $issue_data->line_from, - $code, - $message - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/ReportOptions.php b/vendor/vimeo/psalm/src/Psalm/Report/ReportOptions.php deleted file mode 100644 index 3f914353..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/ReportOptions.php +++ /dev/null @@ -1,46 +0,0 @@ - '2.1.0', - '$schema' => 'https://json.schemastore.org/sarif-2.1.0.json', - 'runs' => [ - [ - 'tool' => [ - 'driver' => [ - 'name' => 'Psalm', - 'informationUri' => 'https://psalm.dev', - 'version' => PSALM_VERSION, - ], - ], - 'results' => [], - ], - ], - ]; - - $rules = []; - - foreach ($this->issues_data as $issue_data) { - $rules[$issue_data->shortcode] = [ - 'id' => (string)$issue_data->shortcode, - 'name' => $issue_data->type, - 'shortDescription' => [ - 'text' => $issue_data->type, - ], - 'properties' => [ - 'tags' => [ - (strpos($issue_data->type, 'Tainted') === 0) ? 'security' : 'maintainability', - ], - ], - 'helpUri' => $issue_data->link, - ]; - - $markdown_documentation_path = __DIR__ . '/../../../docs/running_psalm/issues/' . $issue_data->type . '.md'; - if (file_exists($markdown_documentation_path)) { - $markdown_documentation = file_get_contents($markdown_documentation_path); - $rules[$issue_data->shortcode]['help']['markdown'] = $markdown_documentation; - $rules[$issue_data->shortcode]['help']['text'] = $markdown_documentation; - } - - $jsonEntry = [ - 'ruleId' => (string)$issue_data->shortcode, - 'message' => [ - 'text' => $issue_data->message, - ], - 'level' => ($issue_data->severity === Config::REPORT_ERROR) ? 'error' : 'note', - 'locations' => [ - [ - 'physicalLocation' => [ - 'artifactLocation' => [ - 'uri' => $issue_data->file_name, - ], - 'region' => [ - 'startLine' => $issue_data->line_from, - 'endLine' => $issue_data->line_to, - 'startColumn' => $issue_data->column_from, - 'endColumn' => $issue_data->column_to, - ], - ], - ] - ], - ]; - - if ($issue_data->taint_trace != null) { - $jsonEntry['codeFlows'] = [ - [ - 'message' => [ - 'text' => 'Tracing the path from user input to insecure usage', - ], - 'threadFlows' => [ - [ - 'locations' => [], - ], - ], - ] - ]; - - foreach ($issue_data->taint_trace as $trace) { - if ($trace instanceof DataFlowNodeData - && $trace->line_from > 0 - ) { - $jsonEntry['codeFlows'][0]['threadFlows'][0]['locations'][] = [ - 'location' => [ - 'physicalLocation' => [ - 'artifactLocation' => [ - 'uri' => $trace->file_name, - ], - 'region' => [ - 'startLine' => $trace->line_from, - 'endLine' => $trace->line_to, - 'startColumn' => $trace->column_from, - 'endColumn' => $trace->column_to, - ], - ], - ], - ]; - } - } - } - - $report['runs'][0]['results'][] = $jsonEntry; - } - - foreach ($rules as $rule) { - $report['runs'][0]['tool']['driver']['rules'][] = $rule; - } - - $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; - - return Json::encode($report, $options) . "\n"; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php b/vendor/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php deleted file mode 100644 index ea6a6d08..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php +++ /dev/null @@ -1,47 +0,0 @@ - []]; - - foreach ($this->issues_data as $issue_data) { - $report['issues'][] = [ - 'engineId' => 'Psalm', - 'ruleId' => $issue_data->type, - 'primaryLocation' => [ - 'message' => $issue_data->message, - 'filePath' => $issue_data->file_name, - 'textRange' => [ - 'startLine' => $issue_data->line_from, - 'endLine' => $issue_data->line_to, - // Columns in external issue reports are indexed from 0 - 'startColumn' => max(0, $issue_data->column_from - 1), - 'endColumn' => max(0, $issue_data->column_to - 1), - ], - ], - 'type' => 'CODE_SMELL', - 'severity' => $issue_data->severity === Config::REPORT_ERROR ? 'CRITICAL' : 'MINOR', - ]; - } - - $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; - - return Json::encode($report, $options) . "\n"; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/TextReport.php b/vendor/vimeo/psalm/src/Psalm/Report/TextReport.php deleted file mode 100644 index 1365cebc..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/TextReport.php +++ /dev/null @@ -1,29 +0,0 @@ -issues_data as $issue_data) { - $output .= sprintf( - '%s:%s:%s:%s - %s: %s', - $issue_data->file_path, - $issue_data->line_from, - $issue_data->column_from, - ($issue_data->severity === Config::REPORT_ERROR ? 'error' : 'warning'), - $issue_data->type, - $issue_data->message - ) . "\n"; - } - - return $output; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Report/XmlReport.php b/vendor/vimeo/psalm/src/Psalm/Report/XmlReport.php deleted file mode 100644 index eea9c056..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Report/XmlReport.php +++ /dev/null @@ -1,52 +0,0 @@ - array_map( - function (IssueData $issue_data): array { - $issue_data = get_object_vars($issue_data); - unset($issue_data['dupe_key']); - - if (null !== $issue_data['taint_trace']) { - $issue_data['taint_trace'] = array_map( - function ($trace): array { - return (array) $trace; - }, - $issue_data['taint_trace'] - ); - } - - if (null !== $issue_data['other_references']) { - $issue_data['other_references'] = array_map( - function (DataFlowNodeData $reference): array { - return (array) $reference; - }, - $issue_data['other_references'] - ); - } - - return $issue_data; - }, - $this->issues_data - ) - ] - ); - - return $xml->saveXML(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php b/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php deleted file mode 100644 index 9238c1f0..00000000 --- a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php +++ /dev/null @@ -1,209 +0,0 @@ - - */ -class CommitInfo -{ - /** - * Commit ID. - * - * @var null|string - */ - protected $id; - - /** - * Author name. - * - * @var null|string - */ - protected $author_name; - - /** - * Author email. - * - * @var null|string - */ - protected $author_email; - - /** - * Committer name. - * - * @var null|string - */ - protected $committer_name; - - /** - * Committer email. - * - * @var null|string - */ - protected $committer_email; - - /** - * Commit message. - * - * @var null|string - */ - protected $message; - - /** - * Commit message. - * - * @var null|int - */ - protected $date; - - public function toArray(): array - { - return [ - 'id' => $this->id, - 'author_name' => $this->author_name, - 'author_email' => $this->author_email, - 'committer_name' => $this->committer_name, - 'committer_email' => $this->committer_email, - 'message' => $this->message, - 'date' => $this->date, - ]; - } - - // accessor - - /** - * Set commit ID. - */ - public function setId(string $id): self - { - $this->id = $id; - - return $this; - } - - /** - * Return commit ID. - * - */ - public function getId(): ?string - { - return $this->id; - } - - /** - * Set author name. - */ - public function setAuthorName(string $author_name): self - { - $this->author_name = $author_name; - - return $this; - } - - /** - * Return author name. - * - */ - public function getAuthorName(): ?string - { - return $this->author_name; - } - - /** - * Set author email. - * - */ - public function setAuthorEmail(string $author_email): self - { - $this->author_email = $author_email; - - return $this; - } - - /** - * Return author email. - * - */ - public function getAuthorEmail(): ?string - { - return $this->author_email; - } - - /** - * Set committer name. - */ - public function setCommitterName(string $committer_name): self - { - $this->committer_name = $committer_name; - - return $this; - } - - /** - * Return committer name. - * - */ - public function getCommitterName(): ?string - { - return $this->committer_name; - } - - /** - * Set committer email. - */ - public function setCommitterEmail(string $committer_email): self - { - $this->committer_email = $committer_email; - - return $this; - } - - /** - * Return committer email. - * - */ - public function getCommitterEmail(): ?string - { - return $this->committer_email; - } - - /** - * Set commit message. - */ - public function setMessage(string $message): self - { - $this->message = $message; - - return $this; - } - - /** - * Return commit message. - * - */ - public function getMessage(): ?string - { - return $this->message; - } - - /** - * Set commit date - */ - public function setDate(int $date): self - { - $this->date = $date; - - return $this; - } - - /** - * Return commit date. - * - */ - public function getDate(): ?int - { - return $this->date; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php b/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php deleted file mode 100644 index 7f891616..00000000 --- a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php +++ /dev/null @@ -1,111 +0,0 @@ - - */ -class GitInfo extends SourceControlInfo -{ - /** - * Branch name. - * - * @var string - */ - protected $branch; - - /** - * Head. - * - * @var CommitInfo - */ - protected $head; - - /** - * Remote. - * - * @var RemoteInfo[] - */ - protected $remotes; - - /** - * Constructor. - * - * @param string $branch branch name - * @param CommitInfo $head hEAD commit - * @param RemoteInfo[] $remotes remote repositories - */ - public function __construct(string $branch, CommitInfo $head, array $remotes) - { - $this->branch = $branch; - $this->head = $head; - $this->remotes = $remotes; - } - - public function toArray(): array - { - $remotes = []; - - foreach ($this->remotes as $remote) { - $remotes[] = $remote->toArray(); - } - - return [ - 'branch' => $this->branch, - 'head' => $this->head->toArray(), - 'remotes' => $remotes, - ]; - } - - // accessor - - /** - * Return branch name. - * - */ - public function getBranch(): string - { - return $this->branch; - } - - /** - * Return HEAD commit. - * - */ - public function getHead(): CommitInfo - { - return $this->head; - } - - /** - * Return remote repositories. - * - * @return RemoteInfo[] - */ - public function getRemotes(): array - { - return $this->remotes; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php b/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php deleted file mode 100644 index dd609c86..00000000 --- a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php +++ /dev/null @@ -1,81 +0,0 @@ - - */ -class RemoteInfo -{ - /** - * Remote name. - * - * @var null|string - */ - protected $name; - - /** - * Remote URL. - * - * @var null|string - */ - protected $url; - - public function toArray(): array - { - return [ - 'name' => $this->name, - 'url' => $this->url, - ]; - } - - // accessor - - /** - * Set remote name. - * - * @param string $name remote name - * - * @return $this - */ - public function setName(string $name): RemoteInfo - { - $this->name = $name; - - return $this; - } - - /** - * Return remote name. - * - */ - public function getName(): ?string - { - return $this->name; - } - - /** - * Set remote URL. - * - * @param string $url remote URL - * - * @return $this - */ - public function setUrl(string $url): RemoteInfo - { - $this->url = $url; - - return $this; - } - - /** - * Return remote URL. - * - */ - public function getUrl(): ?string - { - return $this->url; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php b/vendor/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php deleted file mode 100644 index 5cf50c80..00000000 --- a/vendor/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php +++ /dev/null @@ -1,8 +0,0 @@ - - */ - public function getAliasedClassesFlipped(): array; - - /** - * @return array - */ - public function getAliasedClassesFlippedReplaceable(): array; - - public function getFQCLN(): ?string; - - public function getClassName(): ?string; - - public function getParentFQCLN(): ?string; - - /** - * @return array>|null - */ - public function getTemplateTypeMap(): ?array; - - public function setRootFilePath(string $file_path, string $file_name): void; - - public function hasParentFilePath(string $file_path): bool; - - public function hasAlreadyRequiredFilePath(string $file_path): bool; - - public function getRequireNesting(): int; - - public function isStatic(): bool; - - public function getSource(): StatementsSource; - - public function getCodebase(): Codebase; - - /** - * Get a list of suppressed issues - * - * @return array - */ - public function getSuppressedIssues(): array; - - /** - * @param list $new_issues - */ - public function addSuppressedIssues(array $new_issues): void; - - /** - * @param list $new_issues - */ - public function removeSuppressedIssues(array $new_issues): void; - - public function getNodeTypeProvider(): NodeTypeProvider; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/Assertion.php b/vendor/vimeo/psalm/src/Psalm/Storage/Assertion.php deleted file mode 100644 index 53f13b12..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/Assertion.php +++ /dev/null @@ -1,105 +0,0 @@ -> the rule being asserted - */ - public $rule; - - /** - * @var int|string the id of the property/variable, or - * the parameter offset of the affected arg - */ - public $var_id; - - /** - * @param string|int $var_id - * @param array> $rule - */ - public function __construct($var_id, array $rule) - { - $this->rule = $rule; - $this->var_id = $var_id; - } - - /** - * @param array>> $inferred_lower_bounds - */ - public function getUntemplatedCopy( - array $inferred_lower_bounds, - ?string $this_var_id, - ?Codebase $codebase - ): self { - return new Assertion( - is_string($this->var_id) && $this_var_id - ? str_replace('$this->', $this_var_id . '->', $this->var_id) - : $this->var_id, - array_map( - /** - * @param array $rules - * - * @return array{0: string} - */ - function (array $rules) use ($inferred_lower_bounds, $codebase): array { - $first_rule = $rules[0]; - - if ($inferred_lower_bounds) { - $rule_tokens = TypeTokenizer::tokenize($first_rule); - - $substitute = false; - - foreach ($rule_tokens as &$rule_token) { - if (isset($inferred_lower_bounds[$rule_token[0]])) { - foreach ($inferred_lower_bounds[$rule_token[0]] as $lower_bounds) { - $substitute = true; - - $bound_type = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $lower_bounds, - $codebase - ); - - $first_type = $bound_type->getSingleAtomic(); - - if ($first_type instanceof TTemplateParam) { - $rule_token[0] = $first_type->param_name; - } else { - $rule_token[0] = $first_type->getId(); - } - } - } - } - - if ($substitute) { - return [implode( - '', - array_map( - function ($f) { - return $f[0]; - }, - $rule_tokens - ) - )]; - } - } - - return [$first_rule]; - }, - $this->rule - ) - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/AttributeArg.php b/vendor/vimeo/psalm/src/Psalm/Storage/AttributeArg.php deleted file mode 100644 index c51fa723..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/AttributeArg.php +++ /dev/null @@ -1,40 +0,0 @@ -name = $name; - $this->type = $type; - $this->location = $location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php deleted file mode 100644 index 7717966c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php +++ /dev/null @@ -1,47 +0,0 @@ - - */ - public $args; - - /** - * @var CodeLocation - * - * @psalm-suppress PossiblyUnusedProperty part of public API - */ - public $location; - - /** - * @var CodeLocation - * - * @psalm-suppress PossiblyUnusedProperty part of public API - */ - public $name_location; - - /** - * @param list $args - */ - public function __construct( - string $fq_class_name, - array $args, - CodeLocation $location, - CodeLocation $name_location - ) { - $this->fq_class_name = $fq_class_name; - $this->args = $args; - $this->location = $location; - $this->name_location = $name_location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php deleted file mode 100644 index bcbe39dc..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @psalm-suppress PossiblyUnusedProperty - */ - public $attributes = []; - - /** - * @var ?string - */ - public $description; - - /** - * @param ClassLikeAnalyzer::VISIBILITY_* $visibility - */ - public function __construct(?Union $type, int $visibility, ?CodeLocation $location) - { - $this->visibility = $visibility; - $this->location = $location; - $this->type = $type; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php deleted file mode 100644 index a5252d8a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php +++ /dev/null @@ -1,491 +0,0 @@ - - */ - public $constants = []; - - /** - * Aliases to help Psalm understand constant refs - * - * @var ?Aliases - */ - public $aliases; - - /** - * @var bool - */ - public $populated = false; - - /** - * @var bool - */ - public $stubbed = false; - - /** - * @var bool - */ - public $deprecated = false; - - /** - * @var list - */ - public $internal = []; - - /** - * @var TTemplateParam[] - */ - public $templatedMixins = []; - - /** - * @var list - */ - public $namedMixins = []; - - /** - * @var ?string - */ - public $mixin_declaring_fqcln; - - /** - * @var bool - */ - public $sealed_properties = false; - - /** - * @var bool - */ - public $sealed_methods = false; - - /** - * @var bool - */ - public $override_property_visibility = false; - - /** - * @var bool - */ - public $override_method_visibility = false; - - /** - * @var array - */ - public $suppressed_issues = []; - - /** - * @var string - */ - public $name; - - /** - * Is this class user-defined - * - * @var bool - */ - public $user_defined = false; - - /** - * Interfaces this class implements directly - * - * @var array - */ - public $direct_class_interfaces = []; - - /** - * Interfaces this class implements explicitly and implicitly - * - * @var array - */ - public $class_implements = []; - - /** - * Parent interfaces listed explicitly - * - * @var array - */ - public $direct_interface_parents = []; - - /** - * Parent interfaces - * - * @var array - */ - public $parent_interfaces = []; - - /** - * There can only be one direct parent class - * - * @var ?string - */ - public $parent_class; - - /** - * Parent classes - * - * @var array - */ - public $parent_classes = []; - - /** - * @var CodeLocation|null - */ - public $location; - - /** - * @var CodeLocation|null - */ - public $stmt_location; - - /** - * @var CodeLocation|null - */ - public $namespace_name_location; - - /** - * @var bool - */ - public $abstract = false; - - /** - * @var bool - */ - public $final = false; - - /** - * @var bool - */ - public $final_from_docblock = false; - - /** - * @var array - */ - public $used_traits = []; - - /** - * @var array - */ - public $trait_alias_map = []; - - /** - * @var array - */ - public $trait_final_map = []; - - /** - * @var array - */ - public $trait_visibility_map = []; - - /** - * @var bool - */ - public $is_trait = false; - - /** - * @var bool - */ - public $is_interface = false; - - /** - * @var bool - */ - public $is_enum = false; - - /** - * @var bool - */ - public $external_mutation_free = false; - - /** - * @var bool - */ - public $mutation_free = false; - - /** - * @var bool - */ - public $specialize_instance = false; - - /** - * @var array - */ - public $methods = []; - - /** - * @var array - */ - public $pseudo_methods = []; - - /** - * @var array - */ - public $pseudo_static_methods = []; - - /** - * Maps pseudo method names to the original declaring method identifier - * The key is the method name in lowercase, and the value is the original `MethodIdentifier` instance - * - * This property contains all pseudo methods declared on ancestors. - * - * @var array - */ - public $declaring_pseudo_method_ids = []; - - /** - * @var array - */ - public $declaring_method_ids = []; - - /** - * @var array - */ - public $appearing_method_ids = []; - - /** - * Map from lowercase method name to list of declarations in order from parent, to grandparent, to - * great-grandparent, etc **including traits and interfaces**. Ancestors that don't have their own declaration are - * skipped. - * - * @var array> - */ - public $overridden_method_ids = []; - - /** - * @var array - */ - public $documenting_method_ids = []; - - /** - * @var array - */ - public $inheritable_method_ids = []; - - /** - * @var array> - */ - public $potential_declaring_method_ids = []; - - /** - * @var array - */ - public $properties = []; - - /** - * @var array - */ - public $pseudo_property_set_types = []; - - /** - * @var array - */ - public $pseudo_property_get_types = []; - - /** - * @var array - */ - public $declaring_property_ids = []; - - /** - * @var array - */ - public $appearing_property_ids = []; - - /** - * @var array - */ - public $inheritable_property_ids = []; - - /** - * @var array> - */ - public $overridden_property_ids = []; - - /** - * An array holding the class template "as" types. - * - * It's the de-facto list of all templates on a given class. - * - * The name of the template is the first key. The nested array is keyed by the defining class - * (i.e. the same as the class name). This allows operations with the same-named template defined - * across multiple classes to not run into trouble. - * - * @var array>|null - */ - public $template_types; - - /** - * @var array|null - */ - public $template_covariants; - - /** - * A map of which generic classlikes are extended or implemented by this class or interface. - * - * This is only used in the populator, which poulates the $template_extended_params property below. - * - * @internal - * - * @var array>|null - */ - public $template_extended_offsets; - - /** - * A map of which generic classlikes are extended or implemented by this class or interface. - * - * The annotation "@extends Traversable" would generate an entry of - * - * [ - * "Traversable" => [ - * "TKey" => new Union([new TNamedObject("SomeClass")]), - * "TValue" => new Union([new TNamedObject("SomeOtherClass")]) - * ] - * ] - * - * @var array>|null - */ - public $template_extended_params; - - /** - * @deprecated Will be replaced with $template_type_extends_count in Psalm v5 - * @var ?int - */ - public $template_extended_count; - - /** - * @var array|null - */ - public $template_type_implements_count; - - /** - * @var ?Union - */ - public $yield; - - /** - * @var array|null - */ - public $template_type_uses_count; - - /** - * @var array - */ - public $initialized_properties = []; - - /** - * @var array - */ - public $invalid_dependencies = []; - - /** - * @var array - */ - public $dependent_classlikes = []; - - /** - * A hash of the source file's name, contents, and this file's modified on date - * - * @var string - */ - public $hash = ''; - - /** - * @var bool - */ - public $has_visitor_issues = false; - - /** - * @var list - */ - public $docblock_issues = []; - - /** - * @var array - */ - public $type_aliases = []; - - /** - * @var bool - */ - public $preserve_constructor_signature = false; - - /** - * @var bool - */ - public $enforce_template_inheritance = false; - - /** - * @var null|string - */ - public $extension_requirement; - - /** - * @var array - */ - public $implementation_requirements = []; - - /** - * @var list - */ - public $attributes = []; - - /** - * @var array - */ - public $enum_cases = []; - - /** - * @var 'int'|'string'|null - */ - public $enum_type; - - /** - * @var ?string - */ - public $description; - - public function __construct(string $name) - { - $this->name = $name; - } - - /** - * @return list - */ - public function getAttributeStorages(): array - { - return $this->attributes; - } - - /** - * Get the template constraint types for the class. - * - * @return list - */ - public function getClassTemplateTypes(): array - { - $type_params = []; - - foreach ($this->template_types ?? [] as $type_map) { - $type_params[] = clone array_values($type_map)[0]; - } - - return $type_params; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php b/vendor/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php deleted file mode 100644 index 85a8610a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php +++ /dev/null @@ -1,12 +0,0 @@ - */ - public $custom_metadata = []; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php deleted file mode 100644 index c61fcea3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php +++ /dev/null @@ -1,32 +0,0 @@ -value = $value; - $this->stmt_location = $location; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/FileStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/FileStorage.php deleted file mode 100644 index df09117d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/FileStorage.php +++ /dev/null @@ -1,103 +0,0 @@ - - */ - public $classlikes_in_file = []; - - /** - * @var array - */ - public $referenced_classlikes = []; - - /** - * @var array - */ - public $required_classes = []; - - /** - * @var array - */ - public $required_interfaces = []; - - /** @var string */ - public $file_path; - - /** - * @var array - */ - public $functions = []; - - /** @var array */ - public $declaring_function_ids = []; - - /** - * @var array - */ - public $constants = []; - - /** @var array */ - public $declaring_constants = []; - - /** @var array */ - public $required_file_paths = []; - - /** @var array */ - public $required_by_file_paths = []; - - /** @var bool */ - public $populated = false; - - /** @var bool */ - public $deep_scan = false; - - /** @var bool */ - public $has_extra_statements = false; - - /** - * @var string - */ - public $hash = ''; - - /** - * @var bool - */ - public $has_visitor_issues = false; - - /** - * @var list - */ - public $docblock_issues = []; - - /** - * @var array - */ - public $type_aliases = []; - - /** - * @var array - */ - public $classlike_aliases = []; - - /** @var ?Aliases */ - public $aliases; - - /** @var Aliases[] */ - public $namespace_aliases = []; - - public function __construct(string $file_path) - { - $this->file_path = $file_path; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php deleted file mode 100644 index 70147e8c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php +++ /dev/null @@ -1,161 +0,0 @@ -|null - */ - public $sinks; - - /** - * @var bool - */ - public $assert_untainted = false; - - /** - * @var bool - */ - public $type_inferred = false; - - /** - * @var bool - */ - public $expect_variable = false; - - /** - * @var bool - */ - public $promoted_property = false; - - /** - * @var list - */ - public $attributes = []; - - /** - * @var ?string - */ - public $description; - - /** - * @param Union|UnresolvedConstantComponent|null $default_type - */ - public function __construct( - string $name, - bool $by_ref, - ?Union $type = null, - ?CodeLocation $location = null, - ?CodeLocation $type_location = null, - bool $is_optional = true, - bool $is_nullable = false, - bool $is_variadic = false, - $default_type = null - ) { - $this->name = $name; - $this->by_ref = $by_ref; - $this->type = $type; - $this->signature_type = $type; - $this->is_optional = $is_optional; - $this->is_nullable = $is_nullable; - $this->is_variadic = $is_variadic; - $this->location = $location; - $this->type_location = $type_location; - $this->signature_type_location = $type_location; - $this->default_type = $default_type; - } - - public function getId(): string - { - return ($this->type ? $this->type->getId() : 'mixed') - . ($this->is_variadic ? '...' : '') - . ($this->is_optional ? '=' : ''); - } - - public function __clone() - { - if ($this->type) { - $this->type = clone $this->type; - } - } - - /** - * @return list - */ - public function getAttributeStorages(): array - { - return $this->attributes; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php deleted file mode 100644 index fe23ea05..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php +++ /dev/null @@ -1,304 +0,0 @@ - - */ - public $params = []; - - /** - * @psalm-readonly-allow-private-mutation - * @var array - */ - public $param_lookup = []; - - /** - * @var Union|null - */ - public $return_type; - - /** - * @var CodeLocation|null - */ - public $return_type_location; - - /** - * @var Union|null - */ - public $signature_return_type; - - /** - * @var CodeLocation|null - */ - public $signature_return_type_location; - - /** - * @var ?string - */ - public $cased_name; - - /** - * @var array - */ - public $suppressed_issues = []; - - /** - * @var ?bool - */ - public $deprecated; - - /** - * @var list - */ - public $internal = []; - - /** - * @var bool - */ - public $variadic = false; - - /** - * @var bool - */ - public $returns_by_ref = false; - - /** - * @var ?int - */ - public $required_param_count; - - /** - * @var array - */ - public $defined_constants = []; - - /** - * @var array - */ - public $global_variables = []; - - /** - * @var array - */ - public $global_types = []; - - /** - * An array holding the class template "as" types. - * - * It's the de-facto list of all templates on a given class. - * - * The name of the template is the first key. The nested array is keyed by a unique - * function identifier. This allows operations with the same-named template defined - * across multiple classes and/or functions to not run into trouble. - * - * @var array>|null - */ - public $template_types; - - /** - * @var array - */ - public $assertions = []; - - /** - * @var array - */ - public $if_true_assertions = []; - - /** - * @var array - */ - public $if_false_assertions = []; - - /** - * @var bool - */ - public $has_visitor_issues = false; - - /** - * @var list - */ - public $docblock_issues = []; - - /** - * @var array - */ - public $throws = []; - - /** - * @var array - */ - public $throw_locations = []; - - /** - * @var bool - */ - public $has_yield = false; - - /** - * @var bool - */ - public $mutation_free = false; - - /** - * @var string|null - */ - public $return_type_description; - - /** - * @var array|null - */ - public $unused_docblock_params; - - /** - * @var bool - */ - public $pure = false; - - /** - * Whether or not the function output is dependent solely on input - a function can be - * impure but still have this property (e.g. var_export). Useful for taint analysis. - * - * @var bool - */ - public $specialize_call = false; - - /** - * @var array - */ - public $taint_source_types = []; - - /** - * @var array - */ - public $added_taints = []; - - /** - * @var array - */ - public $removed_taints = []; - - /** - * @var array - */ - public $conditionally_removed_taints = []; - - /** - * @var array - */ - public $return_source_params = []; - - /** - * @var bool - */ - public $allow_named_arg_calls = true; - - /** - * @var list - */ - public $attributes = []; - - /** - * @var list, return: bool}>|null - */ - public $proxy_calls = []; - - /** - * @var ?string - */ - public $description; - - public function __toString(): string - { - return $this->getSignature(false); - } - - public function getSignature(bool $allow_newlines): string - { - $newlines = $allow_newlines && !empty($this->params); - - $symbol_text = 'function ' . $this->cased_name . '(' . ($newlines ? "\n" : '') . implode( - ',' . ($newlines ? "\n" : ' '), - array_map( - function (FunctionLikeParameter $param) use ($newlines): string { - return ($newlines ? ' ' : '') . ($param->type ?: 'mixed') . ' $' . $param->name; - }, - $this->params - ) - ) . ($newlines ? "\n" : '') . ') : ' . ($this->return_type ?: 'mixed'); - - if (!$this instanceof MethodStorage) { - return $symbol_text; - } - - switch ($this->visibility) { - case ClassLikeAnalyzer::VISIBILITY_PRIVATE: - $visibility_text = 'private'; - break; - - case ClassLikeAnalyzer::VISIBILITY_PROTECTED: - $visibility_text = 'protected'; - break; - - default: - $visibility_text = 'public'; - } - - return $visibility_text . ' ' . $symbol_text; - } - - /** - * @internal - * - * @param list $params - */ - public function setParams(array $params): void - { - $this->params = $params; - $param_names = array_column($params, 'name'); - $this->param_lookup = array_fill_keys($param_names, true); - } - - /** - * @internal - */ - public function addParam(FunctionLikeParameter $param, bool $lookup_value = null): void - { - $this->params[] = $param; - $this->param_lookup[$param->name] = $lookup_value ?? true; - } - - /** - * @return list - */ - public function getAttributeStorages(): array - { - return $this->attributes; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php deleted file mode 100644 index 22be01b0..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php +++ /dev/null @@ -1,9 +0,0 @@ - */ - public $byref_uses = []; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php b/vendor/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php deleted file mode 100644 index c8bca415..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * @psalm-suppress PossiblyUnusedMethod part of public API - */ - public function getAttributeStorages(): array; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/MethodStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/MethodStorage.php deleted file mode 100644 index f9ae6a27..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/MethodStorage.php +++ /dev/null @@ -1,107 +0,0 @@ - - */ - public $this_property_mutations; - - /** - * @var Union|null - */ - public $self_out_type; - - /** - * @var Union|null - */ - public $if_this_is_type = null; - /** - * @var bool - */ - public $stubbed = false; - - /** - * @var bool - */ - public $probably_fluent = false; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php deleted file mode 100644 index b309a7f1..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php +++ /dev/null @@ -1,135 +0,0 @@ - - */ - public $internal = []; - - /** - * @var ?string - */ - public $getter_method; - - /** - * @var bool - */ - public $is_promoted = false; - - /** - * @var list - */ - public $attributes = []; - - /** - * @var array - */ - public $suppressed_issues = []; - - /** - * @var ?string - */ - public $description; - - public function getInfo(): string - { - switch ($this->visibility) { - case ClassLikeAnalyzer::VISIBILITY_PRIVATE: - $visibility_text = 'private'; - break; - - case ClassLikeAnalyzer::VISIBILITY_PROTECTED: - $visibility_text = 'protected'; - break; - - default: - $visibility_text = 'public'; - } - - return $visibility_text . ' ' . ($this->type ? $this->type->getId() : 'mixed'); - } - - /** - * @return list - */ - public function getAttributeStorages(): array - { - return $this->attributes; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type.php b/vendor/vimeo/psalm/src/Psalm/Type.php deleted file mode 100644 index 35ca8113..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type.php +++ /dev/null @@ -1,761 +0,0 @@ -> $template_type_map - */ - public static function parseString( - string $type_string, - ?array $php_version = null, - array $template_type_map = [] - ): Union { - return TypeParser::parseTokens( - TypeTokenizer::tokenize( - $type_string - ), - $php_version, - $template_type_map - ); - } - - public static function getFQCLNFromString( - string $class, - Aliases $aliases - ): string { - if ($class === '') { - throw new InvalidArgumentException('$class cannot be empty'); - } - - if ($class[0] === '\\') { - return substr($class, 1); - } - - $imported_namespaces = $aliases->uses; - - if (strpos($class, '\\') !== false) { - $class_parts = explode('\\', $class); - $first_namespace = array_shift($class_parts); - - if (isset($imported_namespaces[strtolower($first_namespace)])) { - return $imported_namespaces[strtolower($first_namespace)] . '\\' . implode('\\', $class_parts); - } - } elseif (isset($imported_namespaces[strtolower($class)])) { - return $imported_namespaces[strtolower($class)]; - } - - $namespace = $aliases->namespace; - - return ($namespace ? $namespace . '\\' : '') . $class; - } - - /** - * @param array $aliased_classes - * - * @psalm-pure - */ - public static function getStringFromFQCLN( - string $value, - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $allow_self = false, - bool $was_static = false - ): string { - if ($allow_self && $value === $this_class) { - if ($was_static) { - return 'static'; - } - return 'self'; - } - - if (isset($aliased_classes[strtolower($value)])) { - return $aliased_classes[strtolower($value)]; - } - - if ($namespace && stripos($value, $namespace . '\\') === 0) { - $candidate = preg_replace( - '/^' . preg_quote($namespace . '\\') . '/i', - '', - $value - ); - - $candidate_parts = explode('\\', $candidate); - - if (!isset($aliased_classes[strtolower($candidate_parts[0])])) { - return $candidate; - } - } elseif (!$namespace && strpos($value, '\\') === false) { - return $value; - } - - if (strpos($value, '\\')) { - $parts = explode('\\', $value); - - $suffix = array_pop($parts); - - while ($parts) { - $left = implode('\\', $parts); - - if (isset($aliased_classes[strtolower($left)])) { - return $aliased_classes[strtolower($left)] . '\\' . $suffix; - } - - $suffix = array_pop($parts) . '\\' . $suffix; - } - } - - return '\\' . $value; - } - - public static function getInt(bool $from_calculation = false, ?int $value = null): Union - { - if ($value !== null) { - $union = new Union([new TLiteralInt($value)]); - } else { - $union = new Union([new TInt()]); - } - - $union->from_calculation = $from_calculation; - - return $union; - } - - public static function getLowercaseString(): Union - { - $type = new TLowercaseString(); - - return new Union([$type]); - } - - /** @deprecated will be removed in Psalm 5 */ - public static function getPositiveInt(bool $from_calculation = false): Union - { - $union = new Union([new TPositiveInt()]); - $union->from_calculation = $from_calculation; - - return $union; - } - - public static function getNonEmptyLowercaseString(): Union - { - $type = new TNonEmptyLowercaseString(); - - return new Union([$type]); - } - - public static function getNonEmptyString(): Union - { - $type = new TNonEmptyString(); - - return new Union([$type]); - } - - public static function getNumeric(): Union - { - $type = new TNumeric; - - return new Union([$type]); - } - - public static function getNumericString(): Union - { - $type = new TNumericString; - - return new Union([$type]); - } - - public static function getString(?string $value = null): Union - { - $type = null; - - if ($value !== null) { - $config = Config::getInstance(); - - $event = new StringInterpreterEvent($value); - - $type = $config->eventDispatcher->dispatchStringInterpreter($event); - - if (!$type) { - if (strlen($value) < $config->max_string_length) { - $type = new TLiteralString($value); - } else { - $type = new TNonEmptyString(); - } - } - } - - if (!$type) { - $type = new TString(); - } - - return new Union([$type]); - } - - public static function getSingleLetter(): Union - { - $type = new TSingleLetter; - - return new Union([$type]); - } - - public static function getClassString(string $extends = 'object'): Union - { - return new Union([ - new TClassString( - $extends, - $extends === 'object' - ? null - : new TNamedObject($extends) - ), - ]); - } - - public static function getLiteralClassString(string $class_type, bool $definite_class = false): Union - { - $type = new TLiteralClassString($class_type, $definite_class); - - return new Union([$type]); - } - - public static function getNull(): Union - { - $type = new TNull; - - return new Union([$type]); - } - - public static function getMixed(bool $from_loop_isset = false): Union - { - $type = new TMixed($from_loop_isset); - - return new Union([$type]); - } - - public static function getScalar(): Union - { - $type = new TScalar(); - - return new Union([$type]); - } - - /** - * @deprecated will be removed in Psalm 5. See getNever to retrieve a TNever that replaces TEmpty - */ - public static function getEmpty(): Union - { - $type = new TEmpty(); - - return new Union([$type]); - } - - public static function getNever(): Union - { - $type = new TNever(); - - return new Union([$type]); - } - - public static function getBool(): Union - { - $type = new TBool; - - return new Union([$type]); - } - - public static function getFloat(?float $value = null): Union - { - if ($value !== null) { - $type = new TLiteralFloat($value); - } else { - $type = new TFloat(); - } - - return new Union([$type]); - } - - public static function getObject(): Union - { - $type = new TObject; - - return new Union([$type]); - } - - public static function getClosure(): Union - { - $type = new TClosure('Closure'); - - return new Union([$type]); - } - - public static function getArrayKey(): Union - { - $type = new TArrayKey(); - - return new Union([$type]); - } - - public static function getArray(): Union - { - $type = new TArray( - [ - new Union([new TArrayKey]), - new Union([new TMixed]), - ] - ); - - return new Union([$type]); - } - - public static function getEmptyArray(): Union - { - $array_type = new TArray( - [ - new Union([new TEmpty]), - new Union([new TEmpty]), - ] - ); - - return new Union([ - $array_type, - ]); - } - - public static function getList(): Union - { - $type = new TList(new Union([new TMixed])); - - return new Union([$type]); - } - - public static function getNonEmptyList(): Union - { - $type = new TNonEmptyList(new Union([new TMixed])); - - return new Union([$type]); - } - - public static function getVoid(): Union - { - $type = new TVoid; - - return new Union([$type]); - } - - public static function getFalse(): Union - { - $type = new TFalse; - - return new Union([$type]); - } - - public static function getTrue(): Union - { - $type = new TTrue; - - return new Union([$type]); - } - - public static function getResource(): Union - { - return new Union([new TResource]); - } - - /** - * @param non-empty-list $union_types - */ - public static function combineUnionTypeArray(array $union_types, ?Codebase $codebase): Union - { - $first_type = array_pop($union_types); - - foreach ($union_types as $type) { - $first_type = self::combineUnionTypes($first_type, $type, $codebase); - } - - return $first_type; - } - - /** - * Combines two union types into one - * - * @param int $literal_limit any greater number of literal types than this - * will be merged to a scalar - * - */ - public static function combineUnionTypes( - ?Union $type_1, - ?Union $type_2, - ?Codebase $codebase = null, - bool $overwrite_empty_array = false, - bool $allow_mixed_union = true, - int $literal_limit = 500 - ): Union { - if ($type_2 === null && $type_1 === null) { - throw new UnexpectedValueException('At least one type must be provided to combine'); - } - - if ($type_1 === null) { - return $type_2; - } - - if ($type_2 === null) { - return $type_1; - } - - if ($type_1 === $type_2) { - return $type_1; - } - - if ($type_1->isVanillaMixed() && $type_2->isVanillaMixed()) { - $combined_type = self::getMixed(); - } else { - $both_failed_reconciliation = false; - - if ($type_1->failed_reconciliation) { - if ($type_2->failed_reconciliation) { - $both_failed_reconciliation = true; - } else { - $type_2 = clone $type_2; - $type_2->parent_nodes += $type_1->parent_nodes; - - return $type_2; - } - } elseif ($type_2->failed_reconciliation) { - $type_1 = clone $type_1; - $type_1->parent_nodes += $type_2->parent_nodes; - - return $type_1; - } - - $combined_type = TypeCombiner::combine( - array_merge( - array_values($type_1->getAtomicTypes()), - array_values($type_2->getAtomicTypes()) - ), - $codebase, - $overwrite_empty_array, - $allow_mixed_union, - $literal_limit - ); - - if (!$type_1->initialized || !$type_2->initialized) { - $combined_type->initialized = false; - } - - if ($type_1->from_docblock || $type_2->from_docblock) { - $combined_type->from_docblock = true; - } - - if ($type_1->from_calculation || $type_2->from_calculation) { - $combined_type->from_calculation = true; - } - - if ($type_1->ignore_nullable_issues || $type_2->ignore_nullable_issues) { - $combined_type->ignore_nullable_issues = true; - } - - if ($type_1->ignore_falsable_issues || $type_2->ignore_falsable_issues) { - $combined_type->ignore_falsable_issues = true; - } - - if ($type_1->had_template && $type_2->had_template) { - $combined_type->had_template = true; - } - - if ($type_1->reference_free && $type_2->reference_free) { - $combined_type->reference_free = true; - } - - if ($both_failed_reconciliation) { - $combined_type->failed_reconciliation = true; - } - } - - if ($type_1->possibly_undefined || $type_2->possibly_undefined) { - $combined_type->possibly_undefined = true; - } - - if ($type_1->possibly_undefined_from_try || $type_2->possibly_undefined_from_try) { - $combined_type->possibly_undefined_from_try = true; - } - - if ($type_1->parent_nodes || $type_2->parent_nodes) { - $combined_type->parent_nodes = $type_1->parent_nodes + $type_2->parent_nodes; - } - - if ($type_1->by_ref || $type_2->by_ref) { - $combined_type->by_ref = true; - } - - return $combined_type; - } - - /** - * Combines two union types into one via an intersection - * - * - */ - public static function intersectUnionTypes( - Union $type_1, - Union $type_2, - Codebase $codebase - ): ?Union { - $intersection_performed = false; - $type_1_mixed = $type_1->isMixed(); - $type_2_mixed = $type_2->isMixed(); - - if ($type_1_mixed && $type_2_mixed) { - $combined_type = self::getMixed(); - } else { - $both_failed_reconciliation = false; - - if ($type_1->failed_reconciliation) { - if ($type_2->failed_reconciliation) { - $both_failed_reconciliation = true; - } else { - return $type_2; - } - } elseif ($type_2->failed_reconciliation) { - return $type_1; - } - - if ($type_1_mixed) { - $combined_type = clone $type_2; - $intersection_performed = true; - } elseif ($type_2_mixed) { - $combined_type = clone $type_1; - $intersection_performed = true; - } else { - $combined_type = null; - foreach ($type_1->getAtomicTypes() as $type_1_atomic) { - foreach ($type_2->getAtomicTypes() as $type_2_atomic) { - $intersection_atomic = null; - $wider_type = null; - if ($type_1_atomic instanceof TNamedObject - && $type_2_atomic instanceof TNamedObject - ) { - if (($type_1_atomic->value === $type_2_atomic->value - && get_class($type_1_atomic) === TNamedObject::class - && get_class($type_2_atomic) !== TNamedObject::class) - ) { - $intersection_atomic = clone $type_2_atomic; - $wider_type = $type_1_atomic; - $intersection_performed = true; - } elseif (($type_1_atomic->value === $type_2_atomic->value - && get_class($type_2_atomic) === TNamedObject::class - && get_class($type_1_atomic) !== TNamedObject::class) - ) { - $intersection_atomic = clone $type_1_atomic; - $wider_type = $type_2_atomic; - $intersection_performed = true; - } - } - - if (null === $intersection_atomic) { - if (AtomicTypeComparator::isContainedBy( - $codebase, - $type_2_atomic, - $type_1_atomic - )) { - $intersection_atomic = clone $type_2_atomic; - $wider_type = $type_1_atomic; - $intersection_performed = true; - } elseif (AtomicTypeComparator::isContainedBy( - $codebase, - $type_1_atomic, - $type_2_atomic - )) { - $intersection_atomic = clone $type_1_atomic; - $wider_type = $type_2_atomic; - $intersection_performed = true; - } - } - - if (static::mayHaveIntersection($type_1_atomic) - && static::mayHaveIntersection($type_2_atomic) - ) { - if ($intersection_atomic === null && $wider_type === null) { - $intersection_atomic = clone $type_1_atomic; - $wider_type = $type_2_atomic; - } - if ($intersection_atomic === null || $wider_type === null) { - throw new LogicException( - '$intersection_atomic and $wider_type should be both set or null.' - .' Check the preceding code for errors.' - .' Did you forget to assign one of the variables?' - ); - } - if (!static::mayHaveIntersection($intersection_atomic) - || !static::mayHaveIntersection($wider_type) - ) { - throw new LogicException( - '$intersection_atomic and $wider_type should be both support intersection.' - .' Check the preceding code for errors.' - ); - } - if (!$intersection_atomic->extra_types) { - $intersection_atomic->extra_types = []; - } - - $intersection_performed = true; - - $wider_type_clone = clone $wider_type; - - $wider_type_clone->extra_types = []; - - $intersection_atomic->extra_types[$wider_type_clone->getKey()] = $wider_type_clone; - - $wider_type_intersection_types = $wider_type->getIntersectionTypes(); - - if ($wider_type_intersection_types !== null) { - foreach ($wider_type_intersection_types as $wider_type_intersection_type) { - $intersection_atomic->extra_types[$wider_type_intersection_type->getKey()] - = clone $wider_type_intersection_type; - } - } - } - if (null !== $intersection_atomic) { - if (null === $combined_type) { - $combined_type = new Union([$intersection_atomic]); - } else { - $combined_type->addType($intersection_atomic); - } - } - } - } - } - - //if a type is contained by the other, the intersection is the narrowest type - if (!$intersection_performed) { - $type_1_in_2 = UnionTypeComparator::isContainedBy($codebase, $type_1, $type_2); - $type_2_in_1 = UnionTypeComparator::isContainedBy($codebase, $type_2, $type_1); - if ($type_1_in_2) { - $intersection_performed = true; - $combined_type = $type_1; - } elseif ($type_2_in_1) { - $intersection_performed = true; - $combined_type = $type_2; - } - } - - if ($combined_type !== null) { - if (!$type_1->initialized && !$type_2->initialized) { - $combined_type->initialized = false; - } - - if ($type_1->possibly_undefined_from_try && $type_2->possibly_undefined_from_try) { - $combined_type->possibly_undefined_from_try = true; - } - - if ($type_1->from_docblock && $type_2->from_docblock) { - $combined_type->from_docblock = true; - } - - if ($type_1->from_calculation && $type_2->from_calculation) { - $combined_type->from_calculation = true; - } - - if ($type_1->ignore_nullable_issues && $type_2->ignore_nullable_issues) { - $combined_type->ignore_nullable_issues = true; - } - - if ($type_1->ignore_falsable_issues && $type_2->ignore_falsable_issues) { - $combined_type->ignore_falsable_issues = true; - } - - if ($both_failed_reconciliation) { - $combined_type->failed_reconciliation = true; - } - } - } - - if (!$intersection_performed && $type_1->getId() !== $type_2->getId()) { - return null; - } - - if ($type_1->possibly_undefined && $type_2->possibly_undefined && $combined_type !== null) { - $combined_type->possibly_undefined = true; - } - - return $combined_type; - } - - /** - * @psalm-assert-if-true TIterable|TNamedObject|TTemplateParam|TObjectWithProperties $type - */ - private static function mayHaveIntersection(Atomic $type): bool - { - return $type instanceof TIterable - || $type instanceof TNamedObject - || $type instanceof TTemplateParam - || $type instanceof TObjectWithProperties; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic.php deleted file mode 100644 index 47d8e573..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic.php +++ /dev/null @@ -1,812 +0,0 @@ -> $template_type_map - * @param array $type_aliases - */ - public static function create( - string $value, - ?array $php_version = null, - array $template_type_map = [], - array $type_aliases = [] - ): Atomic { - switch ($value) { - case 'int': - return new TInt(); - - case 'float': - return new TFloat(); - - case 'string': - return new TString(); - - case 'bool': - return new TBool(); - - case 'void': - if ($php_version === null - || ($php_version[0] > 7) - || ($php_version[0] === 7 && $php_version[1] >= 1) - ) { - return new TVoid(); - } - - break; - - case 'array-key': - return new TArrayKey(); - - case 'iterable': - if ($php_version === null - || ($php_version[0] > 7) - || ($php_version[0] === 7 && $php_version[1] >= 1) - ) { - return new TIterable(); - } - - break; - - case 'never': - if ($php_version === null - || ($php_version[0] > 8) - || ($php_version[0] === 8 && $php_version[1] >= 1) - ) { - return new TNever(); - } - - break; - - case 'never-return': - case 'never-returns': - case 'no-return': - return new TNever(); - - case 'object': - if ($php_version === null - || ($php_version[0] > 7) - || ($php_version[0] === 7 && $php_version[1] >= 2) - ) { - return new TObject(); - } - - break; - - case 'callable': - return new TCallable(); - case 'pure-callable': - $type = new TCallable(); - $type->is_pure = true; - - return $type; - - case 'array': - case 'associative-array': - return new TArray([new Union([new TArrayKey]), new Union([new TMixed])]); - - case 'non-empty-array': - return new TNonEmptyArray([new Union([new TArrayKey]), new Union([new TMixed])]); - - case 'callable-array': - return new TCallableArray([new Union([new TArrayKey]), new Union([new TMixed])]); - - case 'list': - return new TList(Type::getMixed()); - - case 'non-empty-list': - return new TNonEmptyList(Type::getMixed()); - - case 'non-empty-string': - return new TNonEmptyString(); - - case 'non-falsy-string': - return new TNonFalsyString(); - - case 'lowercase-string': - return new TLowercaseString(); - - case 'non-empty-lowercase-string': - return new TNonEmptyLowercaseString(); - - case 'resource': - return $php_version !== null ? new TNamedObject($value) : new TResource(); - - case 'resource (closed)': - case 'closed-resource': - return new TClosedResource(); - - case 'positive-int': - return new TPositiveInt(); - - case 'numeric': - return $php_version !== null ? new TNamedObject($value) : new TNumeric(); - - case 'true': - return $php_version !== null ? new TNamedObject($value) : new TTrue(); - - case 'false': - if ($php_version === null || $php_version[0] >= 8) { - return new TFalse(); - } - - return new TNamedObject($value); - - case 'empty': - return $php_version !== null ? new TNamedObject($value) : new TEmpty(); - - case 'scalar': - return $php_version !== null ? new TNamedObject($value) : new TScalar(); - - case 'null': - if ($php_version === null || $php_version[0] >= 8) { - return new TNull(); - } - - return new TNamedObject($value); - - case 'mixed': - if ($php_version === null || $php_version[0] >= 8) { - return new TMixed(); - } - - return new TNamedObject($value); - - case 'callable-object': - return new TCallableObject(); - - case 'stringable-object': - return new TObjectWithProperties([], ['__tostring' => 'string']); - - case 'class-string': - case 'interface-string': - return new TClassString(); - - case 'trait-string': - return new TTraitString(); - - case 'callable-string': - return new TCallableString(); - - case 'numeric-string': - return new TNumericString(); - - case 'html-escaped-string': - return new THtmlEscapedString(); - - case 'literal-string': - return new TNonspecificLiteralString(); - - case 'non-empty-literal-string': - return new TNonEmptyNonspecificLiteralString(); - - case 'literal-int': - return new TNonspecificLiteralInt(); - - case 'false-y': - return new TAssertionFalsy(); - - case '$this': - return new TNamedObject('static'); - - case 'non-empty-scalar': - return new TNonEmptyScalar; - - case 'empty-scalar': - return new TEmptyScalar; - - case 'non-empty-mixed': - return new TNonEmptyMixed(); - } - - if (strpos($value, '-') && strpos($value, 'OCI-') !== 0) { - throw new TypeParseTreeException('Unrecognized type ' . $value); - } - - if (is_numeric($value[0])) { - throw new TypeParseTreeException('First character of type cannot be numeric'); - } - - if (isset($template_type_map[$value])) { - $first_class = array_keys($template_type_map[$value])[0]; - - return new TTemplateParam( - $value, - $template_type_map[$value][$first_class], - $first_class - ); - } - - if (isset($type_aliases[$value])) { - $type_alias = $type_aliases[$value]; - - if ($type_alias instanceof LinkableTypeAlias) { - return new TTypeAlias($type_alias->declaring_fq_classlike_name, $type_alias->alias_name); - } - - throw new TypeParseTreeException('Invalid type alias ' . $value . ' provided'); - } - - return new TNamedObject($value); - } - - abstract public function getKey(bool $include_extra = true): string; - - public function isNumericType(): bool - { - return $this instanceof TInt - || $this instanceof TFloat - || $this instanceof TNumericString - || $this instanceof TNumeric - || ($this instanceof TLiteralString && is_numeric($this->value)); - } - - public function isObjectType(): bool - { - return $this instanceof TObject - || $this instanceof TNamedObject - || ($this instanceof TTemplateParam - && $this->as->hasObjectType()); - } - - public function isNamedObjectType(): bool - { - return $this instanceof TNamedObject - || ($this instanceof TTemplateParam - && ($this->as->hasNamedObjectType() - || array_filter( - $this->extra_types ?: [], - function ($extra_type) { - return $extra_type->isNamedObjectType(); - } - ) - ) - ); - } - - public function isCallableType(): bool - { - return $this instanceof TCallable - || $this instanceof TCallableObject - || $this instanceof TCallableString - || $this instanceof TCallableArray - || $this instanceof TCallableList - || $this instanceof TCallableKeyedArray - || $this instanceof TClosure; - } - - public function isIterable(Codebase $codebase): bool - { - return $this instanceof TIterable - || $this->hasTraversableInterface($codebase) - || $this instanceof TArray - || $this instanceof TKeyedArray - || $this instanceof TList; - } - - public function isCountable(Codebase $codebase): bool - { - return $this->hasCountableInterface($codebase) - || $this instanceof TArray - || $this instanceof TKeyedArray - || $this instanceof TList; - } - - public function hasTraversableInterface(Codebase $codebase): bool - { - return $this instanceof TNamedObject - && ( - strtolower($this->value) === 'traversable' - || ($codebase->classOrInterfaceExists($this->value) - && ($codebase->classExtendsOrImplements( - $this->value, - 'Traversable' - ) || $codebase->interfaceExtends( - $this->value, - 'Traversable' - ))) - || ( - $this->extra_types - && array_filter( - $this->extra_types, - function (Atomic $a) use ($codebase): bool { - return $a->hasTraversableInterface($codebase); - } - ) - ) - ); - } - - public function hasCountableInterface(Codebase $codebase): bool - { - return $this instanceof TNamedObject - && ( - strtolower($this->value) === 'countable' - || ($codebase->classOrInterfaceExists($this->value) - && ($codebase->classExtendsOrImplements( - $this->value, - 'Countable' - ) || $codebase->interfaceExtends( - $this->value, - 'Countable' - ))) - || ( - $this->extra_types - && array_filter( - $this->extra_types, - function (Atomic $a) use ($codebase): bool { - return $a->hasCountableInterface($codebase); - } - ) - ) - ); - } - - public function isArrayAccessibleWithStringKey(Codebase $codebase): bool - { - return $this instanceof TArray - || $this instanceof TKeyedArray - || $this instanceof TList - || $this instanceof TClassStringMap - || $this->hasArrayAccessInterface($codebase) - || ($this instanceof TNamedObject && $this->value === 'SimpleXMLElement'); - } - - public function isArrayAccessibleWithIntOrStringKey(Codebase $codebase): bool - { - return $this instanceof TString - || $this->isArrayAccessibleWithStringKey($codebase); - } - - public function hasArrayAccessInterface(Codebase $codebase): bool - { - return $this instanceof TNamedObject - && ( - strtolower($this->value) === 'arrayaccess' - || ($codebase->classOrInterfaceExists($this->value) - && ($codebase->classExtendsOrImplements( - $this->value, - 'ArrayAccess' - ) || $codebase->interfaceExtends( - $this->value, - 'ArrayAccess' - ))) - || ( - $this->extra_types - && array_filter( - $this->extra_types, - function (Atomic $a) use ($codebase): bool { - return $a->hasArrayAccessInterface($codebase); - } - ) - ) - ); - } - - public function getChildNodes(): array - { - return []; - } - - public function replaceClassLike(string $old, string $new): void - { - if ($this instanceof TNamedObject) { - if (strtolower($this->value) === $old) { - $this->value = $new; - } - } - - if ($this instanceof TNamedObject - || $this instanceof TIterable - || $this instanceof TTemplateParam - ) { - if ($this->extra_types) { - foreach ($this->extra_types as $extra_type) { - $extra_type->replaceClassLike($old, $new); - } - } - } - - if ($this instanceof TClassConstant) { - if (strtolower($this->fq_classlike_name) === $old) { - $this->fq_classlike_name = $new; - } - } - - if ($this instanceof TClassString && $this->as !== 'object') { - if (strtolower($this->as) === $old) { - $this->as = $new; - } - } - - if ($this instanceof TTemplateParam) { - $this->as->replaceClassLike($old, $new); - } - - if ($this instanceof TLiteralClassString) { - if (strtolower($this->value) === $old) { - $this->value = $new; - } - } - - if ($this instanceof TArray - || $this instanceof TGenericObject - || $this instanceof TIterable - ) { - foreach ($this->type_params as $type_param) { - $type_param->replaceClassLike($old, $new); - } - } - - if ($this instanceof TKeyedArray) { - foreach ($this->properties as $property_type) { - $property_type->replaceClassLike($old, $new); - } - } - - if ($this instanceof TClosure - || $this instanceof TCallable - ) { - if ($this->params) { - foreach ($this->params as $param) { - if ($param->type) { - $param->type->replaceClassLike($old, $new); - } - } - } - - if ($this->return_type) { - $this->return_type->replaceClassLike($old, $new); - } - } - } - - public function __toString(): string - { - return ''; - } - - public function __clone() - { - if ($this instanceof TNamedObject - || $this instanceof TTemplateParam - || $this instanceof TIterable - || $this instanceof TObjectWithProperties - ) { - if ($this->extra_types) { - foreach ($this->extra_types as &$type) { - $type = clone $type; - } - } - } - - if ($this instanceof TTemplateParam) { - $this->as = clone $this->as; - } - } - - public function getId(bool $nested = false): string - { - return $this->__toString(); - } - - public function getAssertionString(bool $exact = false): string - { - return $this->getId(); - } - - /** - * @param array $aliased_classes - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return $this->getKey(); - } - - /** - * @param array $aliased_classes - */ - abstract public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string; - - abstract public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool; - - public function replaceTemplateTypesWithStandins( - TemplateResult $template_result, - ?Codebase $codebase = null, - ?StatementsAnalyzer $statements_analyzer = null, - Atomic $input_type = null, - ?int $input_arg_offset = null, - ?string $calling_class = null, - ?string $calling_function = null, - bool $replace = true, - bool $add_lower_bound = false, - int $depth = 0 - ): self { - return $this; - } - - public function replaceTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - // do nothing - } - - public function equals(Atomic $other_type, bool $ensure_source_equality): bool - { - return get_class($other_type) === get_class($this); - } - - public function isTruthy(): bool - { - if ($this instanceof TTrue) { - return true; - } - - if ($this instanceof TLiteralInt && $this->value !== 0) { - return true; - } - - if ($this instanceof TLiteralFloat && $this->value !== 0.0) { - return true; - } - - if ($this instanceof TLiteralString && - ($this->value !== '' && $this->value !== '0') - ) { - return true; - } - - if ($this instanceof TNonFalsyString) { - return true; - } - - if ($this instanceof TCallableString) { - return true; - } - - if ($this instanceof TNonEmptyArray) { - return true; - } - - if ($this instanceof TNonEmptyScalar) { - return true; - } - - if ($this instanceof TNonEmptyList) { - return true; - } - - if ($this instanceof TNonEmptyMixed) { - return true; - } - - if ($this instanceof TObject) { - return true; - } - - if ($this instanceof TNamedObject - && $this->value !== 'SimpleXMLElement' - && $this->value !== 'SimpleXMLIterator') { - return true; - } - - if ($this instanceof TIntRange && !$this->contains(0)) { - return true; - } - - if ($this instanceof TPositiveInt) { - return true; - } - - if ($this instanceof TLiteralClassString) { - return true; - } - - if ($this instanceof TClassString) { - return true; - } - - if ($this instanceof TDependentGetClass) { - return true; - } - - if ($this instanceof TTraitString) { - return true; - } - - if ($this instanceof TResource) { - return true; - } - - if ($this instanceof TKeyedArray) { - foreach ($this->properties as $property) { - if ($property->possibly_undefined === false) { - return true; - } - } - } - - if ($this instanceof TTemplateParam && $this->as->isAlwaysTruthy()) { - return true; - } - - //we can't be sure the type is always truthy - return false; - } - - public function isFalsy(): bool - { - if ($this instanceof TFalse) { - return true; - } - - if ($this instanceof TLiteralInt && $this->value === 0) { - return true; - } - - if ($this instanceof TLiteralFloat && $this->value === 0.0) { - return true; - } - - if ($this instanceof TLiteralString && - ($this->value === '' || $this->value === '0') - ) { - return true; - } - - if ($this instanceof TNull) { - return true; - } - - if ($this instanceof TEmptyMixed) { - return true; - } - - if ($this instanceof TEmptyNumeric) { - return true; - } - - if ($this instanceof TEmptyScalar) { - return true; - } - - if ($this instanceof TTemplateParam && $this->as->isAlwaysFalsy()) { - return true; - } - - if ($this instanceof TIntRange && - $this->min_bound === 0 && - $this->max_bound === 0 - ) { - return true; - } - - if ($this instanceof TArray && $this->getId() === 'array') { - return true; - } - - //we can't be sure the type is always falsy - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php deleted file mode 100644 index cd0c026d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php +++ /dev/null @@ -1,300 +0,0 @@ -|null - */ - public $params = []; - - /** - * @var Union|null - */ - public $return_type; - - /** - * @var ?bool - */ - public $is_pure; - - /** - * Constructs a new instance of a generic type - * - * @param list $params - */ - public function __construct( - string $value = 'callable', - ?array $params = null, - ?Union $return_type = null, - ?bool $is_pure = null - ) { - $this->value = $value; - $this->params = $params; - $this->return_type = $return_type; - $this->is_pure = $is_pure; - } - - public function __clone() - { - if ($this->params) { - foreach ($this->params as &$param) { - $param = clone $param; - } - } - - $this->return_type = $this->return_type ? clone $this->return_type : null; - } - - public function getKey(bool $include_extra = true): string - { - return $this->__toString(); - } - - /** - * @param array $aliased_classes - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($use_phpdoc_format) { - if ($this instanceof TNamedObject) { - return parent::toNamespacedString($namespace, $aliased_classes, $this_class, true); - } - - return $this->value; - } - - $param_string = ''; - $return_type_string = ''; - - if ($this->params !== null) { - $param_string = '(' . implode( - ', ', - array_map( - /** - * @return string - */ - function (FunctionLikeParameter $param) use ($namespace, $aliased_classes, $this_class): string { - if (!$param->type) { - $type_string = 'mixed'; - } else { - $type_string = $param->type->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - false - ); - } - - return ($param->is_variadic ? '...' : '') . $type_string . ($param->is_optional ? '=' : ''); - }, - $this->params - ) - ) . ')'; - } - - if ($this->return_type !== null) { - $return_type_multiple = count($this->return_type->getAtomicTypes()) > 1; - - $return_type_string = ':' . ($return_type_multiple ? '(' : '') . $this->return_type->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - false - ) . ($return_type_multiple ? ')' : ''); - } - - if ($this instanceof TNamedObject) { - return parent::toNamespacedString($namespace, $aliased_classes, $this_class, true) - . $param_string . $return_type_string; - } - - return ($this->is_pure ? 'pure-' : '') . 'callable' . $param_string . $return_type_string; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): string { - if ($this instanceof TNamedObject) { - return parent::toNamespacedString($namespace, $aliased_classes, $this_class, true); - } - - return $this->value; - } - - public function getId(bool $nested = false): string - { - $param_string = ''; - $return_type_string = ''; - - if ($this->params !== null) { - $param_string .= '('; - foreach ($this->params as $i => $param) { - if ($i) { - $param_string .= ', '; - } - - $param_string .= $param->getId(); - } - - $param_string .= ')'; - } - - if ($this->return_type !== null) { - $return_type_multiple = count($this->return_type->getAtomicTypes()) > 1; - $return_type_string = ':' . ($return_type_multiple ? '(' : '') - . $this->return_type->getId() . ($return_type_multiple ? ')' : ''); - } - - return ($this->is_pure ? 'pure-' : ($this->is_pure === null ? '' : 'impure-')) - . $this->value . $param_string . $return_type_string; - } - - public function __toString(): string - { - return $this->getId(); - } - - public function replaceTemplateTypesWithStandins( - TemplateResult $template_result, - ?Codebase $codebase = null, - ?StatementsAnalyzer $statements_analyzer = null, - ?Atomic $input_type = null, - ?int $input_arg_offset = null, - ?string $calling_class = null, - ?string $calling_function = null, - bool $replace = true, - bool $add_lower_bound = false, - int $depth = 0 - ): Atomic { - $callable = clone $this; - - if ($callable->params) { - foreach ($callable->params as $offset => $param) { - $input_param_type = null; - - if (($input_type instanceof TClosure || $input_type instanceof TCallable) - && isset($input_type->params[$offset]) - ) { - $input_param_type = $input_type->params[$offset]->type; - } - - if (!$param->type) { - continue; - } - - $param->type = TemplateStandinTypeReplacer::replace( - $param->type, - $template_result, - $codebase, - $statements_analyzer, - $input_param_type, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - !$add_lower_bound, - null, - $depth - ); - } - } - - if ($callable->return_type) { - $callable->return_type = TemplateStandinTypeReplacer::replace( - $callable->return_type, - $template_result, - $codebase, - $statements_analyzer, - $input_type instanceof TCallable || $input_type instanceof TClosure - ? $input_type->return_type - : null, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound - ); - } - - return $callable; - } - - public function replaceTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - if ($this->params) { - foreach ($this->params as $param) { - if (!$param->type) { - continue; - } - - TemplateInferredTypeReplacer::replace( - $param->type, - $template_result, - $codebase - ); - } - } - - if ($this->return_type) { - TemplateInferredTypeReplacer::replace( - $this->return_type, - $template_result, - $codebase - ); - } - } - - /** - * @return list - */ - public function getChildNodes(): array - { - $child_nodes = []; - - if ($this->params) { - foreach ($this->params as $param) { - if ($param->type) { - $child_nodes[] = $param->type; - } - } - } - - if ($this->return_type) { - $child_nodes[] = $this->return_type; - } - - return $child_nodes; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php deleted file mode 100644 index 4ebefe03..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php +++ /dev/null @@ -1,15 +0,0 @@ -type_params as $type_param) { - $s .= $type_param . ', '; - } - - $extra_types = ''; - - if ($this instanceof TNamedObject && $this->extra_types) { - $extra_types = '&' . implode('&', $this->extra_types); - } - - return $this->value . '<' . substr($s, 0, -2) . '>' . $extra_types; - } - - public function getId(bool $nested = false): string - { - $s = ''; - foreach ($this->type_params as $type_param) { - $s .= $type_param->getId() . ', '; - } - - $extra_types = ''; - - if ($this instanceof TNamedObject) { - if ($this->extra_types) { - $extra_types = '&' . implode( - '&', - array_map( - function ($type) { - return $type->getId(true); - }, - $this->extra_types - ) - ); - } - - if ($this->was_static) { - $extra_types .= '&static'; - } - } - - return $this->value . '<' . substr($s, 0, -2) . '>' . $extra_types; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - $base_value = $this instanceof TNamedObject - ? parent::toNamespacedString($namespace, $aliased_classes, $this_class, $use_phpdoc_format) - : $this->value; - - if ($base_value === 'non-empty-array') { - $base_value = 'array'; - } - - if ($use_phpdoc_format) { - if ($this instanceof TNamedObject || $this instanceof TIterable) { - return $base_value; - } - - $value_type = $this->type_params[1]; - - if ($value_type->isMixed() || $value_type->isEmpty()) { - return $base_value; - } - - $value_type_string = $value_type->toNamespacedString($namespace, $aliased_classes, $this_class, true); - - if (!$value_type->isSingle()) { - return '(' . $value_type_string . ')[]'; - } - - return $value_type_string . '[]'; - } - - $intersection_pos = strpos($base_value, '&'); - if ($intersection_pos !== false) { - $base_value = substr($base_value, 0, $intersection_pos); - } - $type_params = $this->type_params; - - //no need for special format if the key is not determined - if ($this instanceof TArray && - count($type_params) === 2 && - isset($type_params[0]) && - $type_params[0]->isArrayKey() - ) { - //we remove the key for display - unset($type_params[0]); - $type_params = array_values($type_params); - } - - if ($this instanceof TArray && - count($type_params) === 1 && - isset($type_params[0]) && - $type_params[0]->isMixed() - ) { - //when the value of an array is mixed, no need for namespaced phpdoc - return 'array'; - } - - $extra_types = ''; - - if ($this instanceof TNamedObject && $this->extra_types) { - $extra_types = '&' . implode( - '&', - array_map( - /** - * @return string - */ - function (Atomic $extra_type) use ($namespace, $aliased_classes, $this_class): string { - return $extra_type->toNamespacedString($namespace, $aliased_classes, $this_class, false); - }, - $this->extra_types - ) - ); - } - - return $base_value . - '<' . - implode( - ', ', - array_map( - /** - * @return string - */ - function (Union $type_param) use ($namespace, $aliased_classes, $this_class): string { - return $type_param->toNamespacedString($namespace, $aliased_classes, $this_class, false); - }, - $type_params - ) - ) . - '>' . $extra_types; - } - - public function __clone() - { - foreach ($this->type_params as &$type_param) { - $type_param = clone $type_param; - } - } - - /** - * @return array - */ - public function getChildNodes(): array - { - return $this->type_params; - } - - public function replaceTemplateTypesWithStandins( - TemplateResult $template_result, - ?Codebase $codebase = null, - ?StatementsAnalyzer $statements_analyzer = null, - ?Atomic $input_type = null, - ?int $input_arg_offset = null, - ?string $calling_class = null, - ?string $calling_function = null, - bool $replace = true, - bool $add_lower_bound = false, - int $depth = 0 - ): Atomic { - if ($input_type instanceof TList) { - $input_type = new TArray([Type::getInt(), $input_type->type_param]); - } - - $input_object_type_params = []; - - $container_type_params_covariant = []; - - if ($input_type instanceof TGenericObject - && ($this instanceof TGenericObject || $this instanceof TIterable) - && $codebase - ) { - $input_object_type_params = TemplateStandinTypeReplacer::getMappedGenericTypeParams( - $codebase, - $input_type, - $this, - $container_type_params_covariant - ); - } - - $atomic = clone $this; - - foreach ($atomic->type_params as $offset => $type_param) { - $input_type_param = null; - - if (($input_type instanceof TIterable - || $input_type instanceof TArray) - && - isset($input_type->type_params[$offset]) - ) { - $input_type_param = $input_type->type_params[$offset]; - } elseif ($input_type instanceof TKeyedArray) { - if ($offset === 0) { - $input_type_param = $input_type->getGenericKeyType(); - } elseif ($offset === 1) { - $input_type_param = $input_type->getGenericValueType(); - } else { - throw new UnexpectedValueException('Not expecting offset of ' . $offset); - } - } elseif ($input_type instanceof TNamedObject - && isset($input_object_type_params[$offset]) - ) { - $input_type_param = $input_object_type_params[$offset]; - } - - /** @psalm-suppress PropertyTypeCoercion */ - $atomic->type_params[$offset] = TemplateStandinTypeReplacer::replace( - $type_param, - $template_result, - $codebase, - $statements_analyzer, - $input_type_param, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - !($container_type_params_covariant[$offset] ?? true) - && $this instanceof TGenericObject - ? $this->value - : null, - $depth + 1 - ); - } - - return $atomic; - } - - public function replaceTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - foreach ($this->type_params as $offset => $type_param) { - TemplateInferredTypeReplacer::replace( - $type_param, - $template_result, - $codebase - ); - - if ($this instanceof TArray && $offset === 0 && $type_param->isMixed()) { - $this->type_params[0] = Type::getArrayKey(); - } - } - - if ($this instanceof TGenericObject) { - $this->remapped_params = true; - } - - if ($this instanceof TGenericObject || $this instanceof TIterable) { - $this->replaceIntersectionTemplateTypesWithArgTypes($template_result, $codebase); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php deleted file mode 100644 index 41743192..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php +++ /dev/null @@ -1,109 +0,0 @@ -|null - */ - public $extra_types; - - /** - * @param array $aliased_classes - */ - private function getNamespacedIntersectionTypes( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if (!$this->extra_types) { - return ''; - } - - return '&' . implode( - '&', - array_map( - /** - * @param TNamedObject|TTemplateParam|TIterable|TObjectWithProperties $extra_type - * - * @return string - */ - function (Atomic $extra_type) use ( - $namespace, - $aliased_classes, - $this_class, - $use_phpdoc_format - ): string { - return $extra_type->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - $use_phpdoc_format - ); - }, - $this->extra_types - ) - ); - } - - /** - * @param TNamedObject|TTemplateParam|TIterable|TObjectWithProperties $type - */ - public function addIntersectionType(Atomic $type): void - { - $this->extra_types[$type->getKey()] = $type; - } - - /** - * @return array|null - */ - public function getIntersectionTypes(): ?array - { - return $this->extra_types; - } - - public function replaceIntersectionTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - if (!$this->extra_types) { - return; - } - - $new_types = []; - - foreach ($this->extra_types as $extra_type) { - if ($extra_type instanceof TTemplateParam - && isset($template_result->lower_bounds[$extra_type->param_name][$extra_type->defining_class]) - ) { - $template_type = TemplateStandinTypeReplacer::getMostSpecificTypeFromBounds( - $template_result->lower_bounds[$extra_type->param_name][$extra_type->defining_class], - $codebase - ); - - foreach ($template_type->getAtomicTypes() as $template_type_part) { - if ($template_type_part instanceof TNamedObject) { - $new_types[$template_type_part->getKey()] = clone $template_type_part; - } elseif ($template_type_part instanceof TTemplateParam) { - $new_types[$template_type_part->getKey()] = clone $template_type_part; - } - } - } else { - $extra_type->replaceTemplateTypesWithArgTypes($template_result, $codebase); - $new_types[$extra_type->getKey()] = $extra_type; - } - } - - $this->extra_types = $new_types; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php deleted file mode 100644 index f37518cd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php +++ /dev/null @@ -1,13 +0,0 @@ -extends = $extends; - } - - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $php_major_version > 7 - || ($php_major_version === 7 && $php_minor_version >= 2) - ? ($this->extends ?? 'object') : null; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return $this->extends ?? 'object'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php deleted file mode 100644 index 05e31a47..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php +++ /dev/null @@ -1,95 +0,0 @@ -`. It expects an array with two elements, both union types. - */ -class TArray extends Atomic -{ - use GenericTrait; - - /** - * @var array{Union, Union} - */ - public $type_params; - - /** - * @var string - */ - public $value = 'array'; - - /** - * Constructs a new instance of a generic type - * - * @param array{Union, Union} $type_params - */ - public function __construct(array $type_params) - { - $this->type_params = $type_params; - } - - public function getKey(bool $include_extra = true): string - { - return 'array'; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): string { - return $this->getKey(); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return $this->type_params[0]->isArrayKey() && $this->type_params[1]->isMixed(); - } - - public function equals(Atomic $other_type, bool $ensure_source_equality): bool - { - if (get_class($other_type) !== static::class) { - return false; - } - - if ($this instanceof TNonEmptyArray - && $other_type instanceof TNonEmptyArray - && $this->count !== $other_type->count - ) { - return false; - } - - if (count($this->type_params) !== count($other_type->type_params)) { - return false; - } - - foreach ($this->type_params as $i => $type_param) { - if (!$type_param->equals($other_type->type_params[$i], $ensure_source_equality)) { - return false; - } - } - - return true; - } - - public function getAssertionString(bool $exact = false): string - { - if (!$exact || $this->type_params[1]->isMixed()) { - return 'array'; - } - - return $this->toNamespacedString(null, [], null, false); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php deleted file mode 100644 index 038b85cf..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php +++ /dev/null @@ -1,49 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - /** - * @param array $aliased_classes - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return $use_phpdoc_format ? '(int|string)' : 'array-key'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php deleted file mode 100644 index db43e12b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php +++ /dev/null @@ -1,44 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php deleted file mode 100644 index adae27f9..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php +++ /dev/null @@ -1,32 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $php_major_version >= 7 ? 'bool' : null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php deleted file mode 100644 index fb92d7e6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php +++ /dev/null @@ -1,36 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): string { - return 'callable'; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return $this->params === null && $this->return_type === null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php deleted file mode 100644 index 1ccce11b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php +++ /dev/null @@ -1,14 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $php_major_version > 7 - || ($php_major_version === 7 && $php_minor_version >= 2) - ? 'object' : null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function getAssertionString(bool $exact = false): string - { - return 'object'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php deleted file mode 100644 index 803120df..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php +++ /dev/null @@ -1,30 +0,0 @@ -getKey(); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function getAssertionString(bool $exact = false): string - { - return 'string'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php deleted file mode 100644 index 7790806d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php +++ /dev/null @@ -1,81 +0,0 @@ -fq_classlike_name = $fq_classlike_name; - $this->const_name = $const_name; - } - - public function getKey(bool $include_extra = true): string - { - return 'class-constant(' . $this->fq_classlike_name . '::' . $this->const_name . ')'; - } - - public function __toString(): string - { - return $this->fq_classlike_name . '::' . $this->const_name; - } - - public function getId(bool $nested = false): string - { - return $this->fq_classlike_name . '::' . $this->const_name; - } - - public function getAssertionString(bool $exact = false): string - { - return 'class-constant(' . $this->fq_classlike_name . '::' . $this->const_name . ')'; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($this->fq_classlike_name === 'static') { - return 'static::' . $this->const_name; - } - - return Type::getStringFromFQCLN($this->fq_classlike_name, $namespace, $aliased_classes, $this_class) - . '::' - . $this->const_name; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php deleted file mode 100644 index 745778c7..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php +++ /dev/null @@ -1,171 +0,0 @@ -as = $as; - $this->as_type = $as_type; - } - - public function getKey(bool $include_extra = true): string - { - return 'class-string' . ($this->as === 'object' ? '' : '<' . $this->as_type . '>'); - } - - public function __toString(): string - { - return $this->getKey(); - } - - public function getId(bool $nested = false): string - { - return $this->getKey(); - } - - public function getAssertionString(bool $exact = false): string - { - return 'class-string'; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return 'string'; - } - - /** - * @param array $aliased_classes - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($this->as === 'object') { - return 'class-string'; - } - - if ($namespace && stripos($this->as, $namespace . '\\') === 0) { - return 'class-string<' . preg_replace( - '/^' . preg_quote($namespace . '\\') . '/i', - '', - $this->as - ) . '>'; - } - - if (!$namespace && strpos($this->as, '\\') === false) { - return 'class-string<' . $this->as . '>'; - } - - if (isset($aliased_classes[strtolower($this->as)])) { - return 'class-string<' . $aliased_classes[strtolower($this->as)] . '>'; - } - - return 'class-string<\\' . $this->as . '>'; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function getChildNodes(): array - { - return $this->as_type ? [$this->as_type] : []; - } - - public function replaceTemplateTypesWithStandins( - TemplateResult $template_result, - ?Codebase $codebase = null, - ?StatementsAnalyzer $statements_analyzer = null, - ?Atomic $input_type = null, - ?int $input_arg_offset = null, - ?string $calling_class = null, - ?string $calling_function = null, - bool $replace = true, - bool $add_lower_bound = false, - int $depth = 0 - ): Atomic { - $class_string = clone $this; - - if (!$class_string->as_type) { - return $class_string; - } - - if ($input_type instanceof TLiteralClassString) { - $input_object_type = new TNamedObject($input_type->value); - } elseif ($input_type instanceof TClassString && $input_type->as_type) { - $input_object_type = $input_type->as_type; - } else { - $input_object_type = new TObject(); - } - - $as_type = TemplateStandinTypeReplacer::replace( - new Union([$class_string->as_type]), - $template_result, - $codebase, - $statements_analyzer, - new Union([$input_object_type]), - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - null, - $depth - ); - - $as_type_types = array_values($as_type->getAtomicTypes()); - - $class_string->as_type = count($as_type_types) === 1 - && $as_type_types[0] instanceof TNamedObject - ? $as_type_types[0] - : null; - - if (!$class_string->as_type) { - $class_string->as = 'object'; - } - - return $class_string; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php deleted file mode 100644 index edef7eec..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php +++ /dev/null @@ -1,251 +0,0 @@ -value_param = $value_param; - $this->param_name = $param_name; - $this->as_type = $as_type; - } - - public function __toString(): string - { - /** @psalm-suppress MixedOperand */ - return static::KEY - . '<' - . $this->param_name - . ' as ' - . ($this->as_type ? (string) $this->as_type : 'object') - . ', ' - . ((string) $this->value_param) - . '>'; - } - - public function getId(bool $nested = false): string - { - /** @psalm-suppress MixedOperand */ - return static::KEY - . '<' - . $this->param_name - . ' as ' - . ($this->as_type ? (string) $this->as_type : 'object') - . ', ' - . $this->value_param->getId() - . '>'; - } - - public function __clone() - { - $this->value_param = clone $this->value_param; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($use_phpdoc_format) { - return (new TArray([Type::getString(), $this->value_param])) - ->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - true - ); - } - - /** @psalm-suppress MixedOperand */ - return static::KEY - . '<' - . $this->param_name - . ($this->as_type ? ' as ' . $this->as_type : '') - . ', ' - . $this->value_param->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - false - ) - . '>'; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): string { - return 'array'; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function getKey(bool $include_extra = true): string - { - return 'array'; - } - - public function replaceTemplateTypesWithStandins( - TemplateResult $template_result, - ?Codebase $codebase = null, - ?StatementsAnalyzer $statements_analyzer = null, - ?Atomic $input_type = null, - ?int $input_arg_offset = null, - ?string $calling_class = null, - ?string $calling_function = null, - bool $replace = true, - bool $add_lower_bound = false, - int $depth = 0 - ): Atomic { - $map = clone $this; - - foreach ([Type::getString(), $map->value_param] as $offset => $type_param) { - $input_type_param = null; - - if (($input_type instanceof TGenericObject - || $input_type instanceof TIterable - || $input_type instanceof TArray) - && - isset($input_type->type_params[$offset]) - ) { - $input_type_param = clone $input_type->type_params[$offset]; - } elseif ($input_type instanceof TKeyedArray) { - if ($offset === 0) { - $input_type_param = $input_type->getGenericKeyType(); - } else { - $input_type_param = $input_type->getGenericValueType(); - } - } elseif ($input_type instanceof TList) { - if ($offset === 0) { - continue; - } - - $input_type_param = clone $input_type->type_param; - } - - $value_param = TemplateStandinTypeReplacer::replace( - $type_param, - $template_result, - $codebase, - $statements_analyzer, - $input_type_param, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - null, - $depth + 1 - ); - - if ($offset === 1) { - $map->value_param = $value_param; - } - } - - return $map; - } - - public function replaceTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - TemplateInferredTypeReplacer::replace( - $this->value_param, - $template_result, - $codebase - ); - } - - public function getChildNodes(): array - { - return [$this->value_param]; - } - - public function equals(Atomic $other_type, bool $ensure_source_equality): bool - { - if (get_class($other_type) !== static::class) { - return false; - } - - if (!$this->value_param->equals($other_type->value_param, $ensure_source_equality)) { - return false; - } - - return true; - } - - public function getAssertionString(bool $exact = false): string - { - return $this->getKey(); - } - - public function getStandinKeyParam(): Union - { - return new Union([ - new TTemplateParamClass( - $this->param_name, - $this->as_type->value ?? 'object', - $this->as_type, - 'class-string-map' - ) - ]); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php deleted file mode 100644 index c8391b4c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php +++ /dev/null @@ -1,44 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php deleted file mode 100644 index 5e3a9dfe..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php +++ /dev/null @@ -1,19 +0,0 @@ - */ - public $byref_uses = []; - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php deleted file mode 100644 index 2c12fea6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php +++ /dev/null @@ -1,148 +0,0 @@ -param_name = $param_name; - $this->defining_class = $defining_class; - $this->as_type = $as_type; - $this->conditional_type = $conditional_type; - $this->if_type = $if_type; - $this->else_type = $else_type; - } - - public function __toString(): string - { - return '(' - . $this->param_name - . ' is ' . $this->conditional_type - . ' ? ' . $this->if_type - . ' : ' . $this->else_type - . ')'; - } - - public function __clone() - { - $this->conditional_type = clone $this->conditional_type; - $this->if_type = clone $this->if_type; - $this->else_type = clone $this->else_type; - $this->as_type = clone $this->as_type; - } - - public function getKey(bool $include_extra = true): string - { - return $this->__toString(); - } - - public function getAssertionString(bool $exact = false): string - { - return ''; - } - - public function getId(bool $nested = false): string - { - return '(' - . $this->param_name . ':' . $this->defining_class - . ' is ' . $this->conditional_type->getId() - . ' ? ' . $this->if_type->getId() - . ' : ' . $this->else_type->getId() - . ')'; - } - - /** - * @param array $aliased_classes - * - * @return null - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return ''; - } - - public function getChildNodes(): array - { - return [$this->conditional_type, $this->if_type, $this->else_type]; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function replaceTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - TemplateInferredTypeReplacer::replace( - $this->conditional_type, - $template_result, - $codebase - ); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php deleted file mode 100644 index d53e53b2..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php +++ /dev/null @@ -1,63 +0,0 @@ -typeof = $typeof; - $this->as_type = $as_type; - } - - public function getId(bool $nested = false): string - { - return $this->as_type->isMixed() - || $this->as_type->hasObject() - ? 'class-string' - : 'class-string<' . $this->as_type->getId() . '>'; - } - - public function getKey(bool $include_extra = true): string - { - return 'get-class-of<' . $this->typeof - . (!$this->as_type->isMixed() && !$this->as_type->hasObject() ? ', ' . $this->as_type->getId() : '') - . '>'; - } - - public function getVarId(): string - { - return $this->typeof; - } - - public function getReplacement(): Atomic - { - return new TClassString(); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php deleted file mode 100644 index 1ca55527..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php +++ /dev/null @@ -1,46 +0,0 @@ -typeof = $typeof; - } - - public function getKey(bool $include_extra = true): string - { - return 'get-debug-type-of<' . $this->typeof . '>'; - } - - public function getVarId(): string - { - return $this->typeof; - } - - public function getReplacement(): Atomic - { - return new TString(); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php deleted file mode 100644 index 1c06fcda..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php +++ /dev/null @@ -1,29 +0,0 @@ -typeof = $typeof; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php deleted file mode 100644 index c5bbd991..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php +++ /dev/null @@ -1,51 +0,0 @@ - $value) - */ -class TDependentListKey extends TInt implements DependentType -{ - /** - * Used to hold information as to what list variable this refers to - * - * @var string - */ - public $var_id; - - /** - * @param string $var_id the variable id - */ - public function __construct(string $var_id) - { - $this->var_id = $var_id; - } - - public function getId(bool $nested = false): string - { - return 'list-key<' . $this->var_id . '>'; - } - - public function getVarId(): string - { - return $this->var_id; - } - - public function getAssertionString(bool $exact = false): string - { - return 'int'; - } - - public function getReplacement(): Atomic - { - return new TInt(); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php deleted file mode 100644 index 2cfa456f..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php +++ /dev/null @@ -1,34 +0,0 @@ -`. - * @deprecated Will be replaced by TNever when in type context and TAssertionEmpty for assertion context in Psalm 5 - */ -class TEmpty extends Scalar -{ - public function __toString(): string - { - return 'empty'; - } - - public function getKey(bool $include_extra = true): string - { - return 'empty'; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php deleted file mode 100644 index b5f52220..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php +++ /dev/null @@ -1,15 +0,0 @@ -case_name = $case_name; - } - - public function getKey(bool $include_extra = true): string - { - return 'enum(' . $this->value . '::' . $this->case_name . ')'; - } - - public function getId(bool $nested = false): string - { - return 'enum(' . $this->value . '::' . $this->case_name . ')'; - } - - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $this->value; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return $this->value . '::' . $this->case_name; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php deleted file mode 100644 index b97abb69..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php +++ /dev/null @@ -1,27 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $php_major_version >= 7 ? 'float' : null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php deleted file mode 100644 index e0f77432..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php +++ /dev/null @@ -1,115 +0,0 @@ -` - */ -class TGenericObject extends TNamedObject -{ - use GenericTrait; - - /** - * @var non-empty-list - */ - public $type_params; - - /** @var bool if the parameters have been remapped to another class */ - public $remapped_params = false; - - /** - * @param string $value the name of the object - * @param non-empty-list $type_params - */ - public function __construct(string $value, array $type_params) - { - if ($value[0] === '\\') { - $value = substr($value, 1); - } - - $this->value = $value; - $this->type_params = $type_params; - } - - public function getKey(bool $include_extra = true): string - { - $s = ''; - - foreach ($this->type_params as $type_param) { - $s .= $type_param->getKey() . ', '; - } - - $extra_types = ''; - - if ($include_extra && $this->extra_types) { - $extra_types = '&' . implode('&', $this->extra_types); - } - - return $this->value . '<' . substr($s, 0, -2) . '>' . $extra_types; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - $result = $this->toNamespacedString($namespace, $aliased_classes, $this_class, true); - $intersection = strrpos($result, '&'); - if ($intersection === false || ( - ($php_major_version === 8 && $php_minor_version >= 1) || - ($php_major_version >= 9) - ) - ) { - return $result; - } - return substr($result, $intersection+1); - } - - public function equals(Atomic $other_type, bool $ensure_source_equality): bool - { - if (!$other_type instanceof self) { - return false; - } - - if (count($this->type_params) !== count($other_type->type_params)) { - return false; - } - - foreach ($this->type_params as $i => $type_param) { - if (!$type_param->equals($other_type->type_params[$i], $ensure_source_equality)) { - return false; - } - } - - return true; - } - - public function getAssertionString(bool $exact = false): string - { - return $this->value; - } - - public function getChildNodes(): array - { - return array_merge($this->type_params, $this->extra_types ?? []); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php deleted file mode 100644 index da315ece..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php +++ /dev/null @@ -1,25 +0,0 @@ -getKey(); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php deleted file mode 100644 index 27191b81..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php +++ /dev/null @@ -1,32 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $php_major_version >= 7 ? 'int' : null; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php deleted file mode 100644 index cf6cd4c6..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php +++ /dev/null @@ -1,71 +0,0 @@ -` corresponds to `0|1|2|3|4|5|6|7` - */ -class TIntMask extends TInt -{ - /** @var non-empty-array */ - public $values; - - /** @param non-empty-array $values */ - public function __construct(array $values) - { - $this->values = $values; - } - - public function getKey(bool $include_extra = true): string - { - $s = ''; - - foreach ($this->values as $value) { - $s .= $value->getKey() . ', '; - } - - return 'int-mask<' . substr($s, 0, -2) . '>'; - } - - public function getId(bool $nested = false): string - { - $s = ''; - - foreach ($this->values as $value) { - $s .= $value->getId() . ', '; - } - - return 'int-mask<' . substr($s, 0, -2) . '>'; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($use_phpdoc_format) { - return 'int'; - } - - $s = ''; - - foreach ($this->values as $value) { - $s .= $value->toNamespacedString($namespace, $aliased_classes, $this_class, false) . ', '; - } - - return 'int-mask<' . substr($s, 0, -2) . '>'; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php deleted file mode 100644 index 70e56452..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php +++ /dev/null @@ -1,57 +0,0 @@ -` will corresponds to `0|1|2|3|4|5|6|7` if there are three constant 1, 2 and 4 - */ -class TIntMaskOf extends TInt -{ - /** @var TClassConstant|TKeyOfClassConstant|TValueOfClassConstant */ - public $value; - - /** - * @param TClassConstant|TKeyOfClassConstant|TValueOfClassConstant $value - */ - public function __construct(Atomic $value) - { - $this->value = $value; - } - - public function getKey(bool $include_extra = true): string - { - return 'int-mask-of<' . $this->value->getKey() . '>'; - } - - public function getId(bool $nested = false): string - { - return $this->getKey(); - } - - /** - * @param array $aliased_classes - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($use_phpdoc_format) { - return 'int'; - } - - return 'int-mask-of<' - . $this->value->toNamespacedString($namespace, $aliased_classes, $this_class, false) - . '>'; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php deleted file mode 100644 index 5b2adcdd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php +++ /dev/null @@ -1,161 +0,0 @@ -min_bound = $min_bound; - $this->max_bound = $max_bound; - } - - public function __toString(): string - { - return $this->getKey(); - } - - public function getKey(bool $include_extra = true): string - { - return 'int<' . ($this->min_bound ?? 'min') . ', ' . ($this->max_bound ?? 'max') . '>'; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - /** - * @param array $aliased_classes - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return $use_phpdoc_format ? - 'int' : - 'int<' . ($this->min_bound ?? 'min') . ', ' . ($this->max_bound ?? 'max') . '>'; - } - - public function isPositive(): bool - { - return $this->min_bound !== null && $this->min_bound > 0; - } - - public function isNegative(): bool - { - return $this->max_bound !== null && $this->max_bound < 0; - } - - public function isPositiveOrZero(): bool - { - return $this->min_bound !== null && $this->min_bound >= 0; - } - - public function isNegativeOrZero(): bool - { - return $this->max_bound !== null && $this->max_bound <= 0; - } - - public function contains(int $i): bool - { - return - ($this->min_bound === null && $this->max_bound === null) || - ($this->min_bound === null && $this->max_bound >= $i) || - ($this->max_bound === null && $this->min_bound <= $i) || - ($this->min_bound <= $i && $this->max_bound >= $i); - } - - /** - * Returns true if every part of the Range is lesser than the given value - */ - public function isLesserThan(int $i): bool - { - return $this->max_bound !== null && $this->max_bound < $i; - } - - /** - * Returns true if every part of the Range is greater than the given value - */ - public function isGreaterThan(int $i): bool - { - return $this->min_bound !== null && $this->min_bound > $i; - } - - public static function getNewLowestBound(?int $bound1, ?int $bound2): ?int - { - if ($bound1 === null || $bound2 === null) { - return null; - } - return min($bound1, $bound2); - } - - public static function getNewHighestBound(?int $bound1, ?int $bound2): ?int - { - if ($bound1 === null || $bound2 === null) { - return null; - } - return max($bound1, $bound2); - } - - /** - * convert any int to its equivalent in int range - */ - public static function convertToIntRange(TInt $int_atomic): TIntRange - { - if ($int_atomic instanceof TIntRange) { - return $int_atomic; - } - - if ($int_atomic instanceof TPositiveInt) { - return new TIntRange(1, null); - } - - if ($int_atomic instanceof TLiteralInt) { - return new TIntRange($int_atomic->value, $int_atomic->value); - } - - return new TIntRange(null, null); - } - - public static function intersectIntRanges(TIntRange $int_range1, TIntRange $int_range2): ?TIntRange - { - if ($int_range1->min_bound === null || $int_range2->min_bound === null) { - $new_min_bound = $int_range1->min_bound ?? $int_range2->min_bound; - } else { - $new_min_bound = self::getNewHighestBound($int_range1->min_bound, $int_range2->min_bound); - } - - if ($int_range1->max_bound === null || $int_range2->max_bound === null) { - $new_max_bound = $int_range1->max_bound ?? $int_range2->max_bound; - } else { - $new_max_bound = self::getNewLowestBound($int_range1->max_bound, $int_range2->max_bound); - } - - if ($new_min_bound !== null && $new_max_bound !== null && $new_min_bound > $new_max_bound) { - return null; - } - - return new self($new_min_bound, $new_max_bound); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php deleted file mode 100644 index b7aea22c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php +++ /dev/null @@ -1,129 +0,0 @@ - $type_params - */ - public function __construct(array $type_params = []) - { - if (count($type_params) === 2) { - $this->has_docblock_params = true; - $this->type_params = $type_params; - } else { - $this->type_params = [Type::getMixed(), Type::getMixed()]; - } - } - - public function getKey(bool $include_extra = true): string - { - if ($include_extra && $this->extra_types) { - // do nothing - } - - return 'iterable'; - } - - public function getAssertionString(bool $exact = false): string - { - return 'iterable'; - } - - public function getId(bool $nested = false): string - { - $s = ''; - foreach ($this->type_params as $type_param) { - $s .= $type_param->getId() . ', '; - } - - $extra_types = ''; - - if ($this->extra_types) { - $extra_types = '&' . implode('&', $this->extra_types); - } - - return $this->value . '<' . substr($s, 0, -2) . '>' . $extra_types; - } - - public function __toString(): string - { - return $this->getId(); - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $php_major_version > 7 - || ($php_major_version === 7 && $php_minor_version >= 1) - ? 'iterable' - : null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return $this->type_params[0]->isMixed() && $this->type_params[1]->isMixed(); - } - - public function equals(Atomic $other_type, bool $ensure_source_equality): bool - { - if (!$other_type instanceof self) { - return false; - } - - if (count($this->type_params) !== count($other_type->type_params)) { - return false; - } - - foreach ($this->type_params as $i => $type_param) { - if (!$type_param->equals($other_type->type_params[$i], $ensure_source_equality)) { - return false; - } - } - - return true; - } - - public function getChildNodes(): array - { - return array_merge($this->type_params, $this->extra_types ?? []); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php deleted file mode 100644 index 05d2e710..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php +++ /dev/null @@ -1,105 +0,0 @@ -fq_classlike_name = $fq_classlike_name; - $this->const_name = $const_name; - } - - public function getKey(bool $include_extra = true): string - { - return 'key-of<' . $this->fq_classlike_name . '::' . $this->const_name . '>'; - } - - public function __toString(): string - { - return 'key-of<' . $this->fq_classlike_name . '::' . $this->const_name . '>'; - } - - public function getId(bool $nested = false): string - { - return $this->getKey(); - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - /** - * @param array $aliased_classes - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($this->fq_classlike_name === 'static') { - return 'key-ofconst_name . '>'; - } - - if ($this->fq_classlike_name === $this_class) { - return 'key-ofconst_name . '>'; - } - - if ($namespace && stripos($this->fq_classlike_name, $namespace . '\\') === 0) { - return 'key-of<' . preg_replace( - '/^' . preg_quote($namespace . '\\') . '/i', - '', - $this->fq_classlike_name - ) . '::' . $this->const_name . '>'; - } - - if (!$namespace && strpos($this->fq_classlike_name, '\\') === false) { - return 'key-of<' . $this->fq_classlike_name . '::' . $this->const_name . '>'; - } - - if (isset($aliased_classes[strtolower($this->fq_classlike_name)])) { - return 'key-of<' - . $aliased_classes[strtolower($this->fq_classlike_name)] - . '::' - . $this->const_name - . '>'; - } - - return 'key-of<\\' . $this->fq_classlike_name . '::' . $this->const_name . '>'; - } - - public function getAssertionString(bool $exact = false): string - { - return 'mixed'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php deleted file mode 100644 index e3b7399e..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php +++ /dev/null @@ -1,434 +0,0 @@ - - */ - public $properties; - - /** - * @var array|null - */ - public $class_strings; - - /** - * @var bool - whether or not the objectlike has been created from an explicit array - */ - public $sealed = false; - - /** - * Whether or not the previous array had an unknown key type - * - * @var ?Union - */ - public $previous_key_type; - - /** - * Whether or not to allow new properties to be asserted on the given array - * - * @var ?Union - */ - public $previous_value_type; - - /** - * @var bool - if this is a list of sequential elements - */ - public $is_list = false; - - public const KEY = 'array'; - - /** - * Constructs a new instance of a generic type - * - * @param non-empty-array $properties - * @param array $class_strings - */ - public function __construct(array $properties, ?array $class_strings = null) - { - $this->properties = $properties; - $this->class_strings = $class_strings; - } - - public function __toString(): string - { - $property_strings = array_map( - function ($name, Union $type): string { - if ($this->is_list && $this->sealed) { - return (string) $type; - } - - $class_string_suffix = ''; - if (isset($this->class_strings[$name])) { - $class_string_suffix = '::class'; - } - - $name = $this->escapeAndQuote($name); - - return $name . $class_string_suffix . ($type->possibly_undefined ? '?' : '') . ': ' . $type; - }, - array_keys($this->properties), - $this->properties - ); - - if (!$this->is_list) { - sort($property_strings); - } - - /** @psalm-suppress MixedOperand */ - return static::KEY . '{' . implode(', ', $property_strings) . '}'; - } - - public function getId(bool $nested = false): string - { - $property_strings = array_map( - function ($name, Union $type): string { - if ($this->is_list && $this->sealed) { - return $type->getId(); - } - - $class_string_suffix = ''; - if (isset($this->class_strings[$name])) { - $class_string_suffix = '::class'; - } - - $name = $this->escapeAndQuote($name); - - return $name . $class_string_suffix . ($type->possibly_undefined ? '?' : '') . ': ' . $type->getId(); - }, - array_keys($this->properties), - $this->properties - ); - - if (!$this->is_list) { - sort($property_strings); - } - - /** @psalm-suppress MixedOperand */ - return static::KEY . '{' . - implode(', ', $property_strings) . - '}' - . ($this->previous_value_type - && (!$this->previous_value_type->isMixed() - || ($this->previous_key_type && !$this->previous_key_type->isArrayKey())) - ? '<' . ($this->previous_key_type ? $this->previous_key_type->getId() . ', ' : '') - . $this->previous_value_type->getId() . '>' - : ''); - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($use_phpdoc_format) { - return $this->getGenericArrayType()->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - true - ); - } - - /** @psalm-suppress MixedOperand */ - return static::KEY . '{' . - implode( - ', ', - array_map( - function ( - $name, - Union $type - ) use ( - $namespace, - $aliased_classes, - $this_class, - $use_phpdoc_format - ): string { - $class_string_suffix = ''; - if (isset($this->class_strings[$name])) { - $class_string_suffix = '::class'; - } - - $name = $this->escapeAndQuote($name); - - return $name . $class_string_suffix . ($type->possibly_undefined ? '?' : '') . ': ' . - $type->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - $use_phpdoc_format - ); - }, - array_keys($this->properties), - $this->properties - ) - ) . - '}'; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): string { - return $this->getKey(); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function getGenericKeyType(): Union - { - $key_types = []; - - foreach ($this->properties as $key => $_) { - if (is_int($key)) { - $key_types[] = new TLiteralInt($key); - } elseif (isset($this->class_strings[$key])) { - $key_types[] = new TLiteralClassString($key); - } else { - $key_types[] = new TLiteralString($key); - } - } - - $key_type = TypeCombiner::combine($key_types); - - $key_type->possibly_undefined = false; - - return Type::combineUnionTypes($this->previous_key_type, $key_type); - } - - public function getGenericValueType(): Union - { - $value_type = null; - - foreach ($this->properties as $property) { - $value_type = Type::combineUnionTypes(clone $property, $value_type); - } - - $value_type = Type::combineUnionTypes($this->previous_value_type, $value_type); - - $value_type->possibly_undefined = false; - - return $value_type; - } - - public function getGenericArrayType(bool $allow_non_empty = true): TArray - { - $key_types = []; - $value_type = null; - - $has_defined_keys = false; - - foreach ($this->properties as $key => $property) { - if (is_int($key)) { - $key_types[] = new TLiteralInt($key); - } elseif (isset($this->class_strings[$key])) { - $key_types[] = new TLiteralClassString($key); - } else { - $key_types[] = new TLiteralString($key); - } - - $value_type = Type::combineUnionTypes(clone $property, $value_type); - - if (!$property->possibly_undefined) { - $has_defined_keys = true; - } - } - - $key_type = TypeCombiner::combine($key_types); - - $value_type = Type::combineUnionTypes($this->previous_value_type, $value_type); - $key_type = Type::combineUnionTypes($this->previous_key_type, $key_type); - - $value_type->possibly_undefined = false; - - if ($allow_non_empty && ($this->previous_value_type || $has_defined_keys)) { - $array_type = new TNonEmptyArray([$key_type, $value_type]); - } else { - $array_type = new TArray([$key_type, $value_type]); - } - - return $array_type; - } - - public function isNonEmpty(): bool - { - foreach ($this->properties as $property) { - if (!$property->possibly_undefined) { - return true; - } - } - - return false; - } - - public function __clone() - { - foreach ($this->properties as &$property) { - $property = clone $property; - } - } - - public function getKey(bool $include_extra = true): string - { - /** @var string */ - return static::KEY; - } - - public function replaceTemplateTypesWithStandins( - TemplateResult $template_result, - ?Codebase $codebase = null, - ?StatementsAnalyzer $statements_analyzer = null, - ?Atomic $input_type = null, - ?int $input_arg_offset = null, - ?string $calling_class = null, - ?string $calling_function = null, - bool $replace = true, - bool $add_lower_bound = false, - int $depth = 0 - ): Atomic { - $object_like = clone $this; - - foreach ($this->properties as $offset => $property) { - $input_type_param = null; - - if ($input_type instanceof TKeyedArray - && isset($input_type->properties[$offset]) - ) { - $input_type_param = $input_type->properties[$offset]; - } - - $object_like->properties[$offset] = TemplateStandinTypeReplacer::replace( - $property, - $template_result, - $codebase, - $statements_analyzer, - $input_type_param, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - null, - $depth - ); - } - - return $object_like; - } - - public function replaceTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - foreach ($this->properties as $property) { - TemplateInferredTypeReplacer::replace( - $property, - $template_result, - $codebase - ); - } - } - - public function getChildNodes(): array - { - return $this->properties; - } - - public function equals(Atomic $other_type, bool $ensure_source_equality): bool - { - if (get_class($other_type) !== static::class) { - return false; - } - - if (count($this->properties) !== count($other_type->properties)) { - return false; - } - - if ($this->sealed !== $other_type->sealed) { - return false; - } - - foreach ($this->properties as $property_name => $property_type) { - if (!isset($other_type->properties[$property_name])) { - return false; - } - - if (!$property_type->equals($other_type->properties[$property_name], $ensure_source_equality)) { - return false; - } - } - - return true; - } - - public function getAssertionString(bool $exact = false): string - { - return $this->getKey(); - } - - public function getList(): TList - { - if (!$this->is_list) { - throw new UnexpectedValueException('Object-like array must be a list for conversion'); - } - - return $this->isNonEmpty() - ? new TNonEmptyList($this->getGenericValueType()) - : new TList($this->getGenericValueType()); - } - - /** - * @param string|int $name - * @return string|int - */ - private function escapeAndQuote($name) - { - if (is_string($name) && ($name === '' || preg_match('/[^a-zA-Z0-9_]/', $name))) { - $name = '\'' . str_replace("\n", '\n', addslashes($name)) . '\''; - } - - return $name; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TList.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TList.php deleted file mode 100644 index e6a7a478..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TList.php +++ /dev/null @@ -1,209 +0,0 @@ -type_param = $type_param; - } - - public function __toString(): string - { - /** @psalm-suppress MixedOperand */ - return static::KEY . '<' . $this->type_param . '>'; - } - - public function getId(bool $nested = false): string - { - /** @psalm-suppress MixedOperand */ - return static::KEY . '<' . $this->type_param->getId() . '>'; - } - - public function __clone() - { - $this->type_param = clone $this->type_param; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($use_phpdoc_format) { - return (new TArray([Type::getInt(), $this->type_param])) - ->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - true - ); - } - - /** @psalm-suppress MixedOperand */ - return static::KEY - . '<' - . $this->type_param->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - false - ) - . '>'; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): string { - return 'array'; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function getKey(bool $include_extra = true): string - { - return 'array'; - } - - public function replaceTemplateTypesWithStandins( - TemplateResult $template_result, - ?Codebase $codebase = null, - ?StatementsAnalyzer $statements_analyzer = null, - ?Atomic $input_type = null, - ?int $input_arg_offset = null, - ?string $calling_class = null, - ?string $calling_function = null, - bool $replace = true, - bool $add_lower_bound = false, - int $depth = 0 - ): Atomic { - $list = clone $this; - - foreach ([Type::getInt(), $list->type_param] as $offset => $type_param) { - $input_type_param = null; - - if (($input_type instanceof TGenericObject - || $input_type instanceof TIterable - || $input_type instanceof TArray) - && - isset($input_type->type_params[$offset]) - ) { - $input_type_param = clone $input_type->type_params[$offset]; - } elseif ($input_type instanceof TKeyedArray) { - if ($offset === 0) { - $input_type_param = $input_type->getGenericKeyType(); - } else { - $input_type_param = $input_type->getGenericValueType(); - } - } elseif ($input_type instanceof TList) { - if ($offset === 0) { - continue; - } - - $input_type_param = clone $input_type->type_param; - } - - $type_param = TemplateStandinTypeReplacer::replace( - $type_param, - $template_result, - $codebase, - $statements_analyzer, - $input_type_param, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - null, - $depth + 1 - ); - - if ($offset === 1) { - $list->type_param = $type_param; - } - } - - return $list; - } - - public function replaceTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - TemplateInferredTypeReplacer::replace( - $this->type_param, - $template_result, - $codebase - ); - } - - public function equals(Atomic $other_type, bool $ensure_source_equality): bool - { - if (get_class($other_type) !== static::class) { - return false; - } - - if (!$this->type_param->equals($other_type->type_param, $ensure_source_equality)) { - return false; - } - - return true; - } - - public function getAssertionString(bool $exact = false): string - { - if (!$exact || $this->type_param->isMixed()) { - return 'list'; - } - - return $this->toNamespacedString(null, [], null, false); - } - - public function getChildNodes(): array - { - return [$this->type_param]; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php deleted file mode 100644 index a36429d3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php +++ /dev/null @@ -1,105 +0,0 @@ -definite_class = $definite_class; - } - - public function __toString(): string - { - return 'class-string'; - } - - public function getKey(bool $include_extra = true): string - { - return 'class-string(' . $this->value . ')'; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): string { - return 'string'; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function getId(bool $nested = false): string - { - return $this->value . '::class'; - } - - public function getAssertionString(bool $exact = false): string - { - return $this->getKey(); - } - - /** - * @param array $aliased_classes - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($use_phpdoc_format) { - return 'string'; - } - - if ($this->value === 'static') { - return 'static::class'; - } - - if ($this->value === $this_class) { - return 'self::class'; - } - - if ($namespace && stripos($this->value, $namespace . '\\') === 0) { - return preg_replace( - '/^' . preg_quote($namespace . '\\') . '/i', - '', - $this->value - ) . '::class'; - } - - if (!$namespace && strpos($this->value, '\\') === false) { - return $this->value . '::class'; - } - - if (isset($aliased_classes[strtolower($this->value)])) { - return $aliased_classes[strtolower($this->value)] . '::class'; - } - - return '\\' . $this->value . '::class'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php deleted file mode 100644 index 05a7819a..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php +++ /dev/null @@ -1,40 +0,0 @@ -value = $value; - } - - public function getKey(bool $include_extra = true): string - { - return 'float(' . $this->value . ')'; - } - - public function getId(bool $nested = false): string - { - return 'float(' . $this->value . ')'; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return 'float'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php deleted file mode 100644 index 282dae12..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php +++ /dev/null @@ -1,45 +0,0 @@ -value = $value; - } - - public function getKey(bool $include_extra = true): string - { - return 'int(' . $this->value . ')'; - } - - public function getId(bool $nested = false): string - { - return (string) $this->value; - } - - public function getAssertionString(bool $exact = false): string - { - return 'int(' . $this->value . ')'; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return $use_phpdoc_format ? 'int' : (string) $this->value; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php deleted file mode 100644 index e19cfb8d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php +++ /dev/null @@ -1,55 +0,0 @@ -value = $value; - } - - public function getKey(bool $include_extra = true): string - { - return 'string(' . $this->value . ')'; - } - - public function getId(bool $nested = false): string - { - // quote control characters, backslashes and double quote - $no_newline_value = addcslashes($this->value, "\0..\37\\\""); - if (mb_strlen($this->value) > 80) { - return '"' . mb_substr($no_newline_value, 0, 80) . '...' . '"'; - } - - return '"' . $no_newline_value . '"'; - } - - public function getAssertionString(bool $exact = false): string - { - return 'string(' . $this->value . ')'; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return $use_phpdoc_format ? 'string' : "'" . $this->value . "'"; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php deleted file mode 100644 index b1b34cd4..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php +++ /dev/null @@ -1,16 +0,0 @@ -from_loop_isset = $from_loop_isset; - } - - public function __toString(): string - { - return 'mixed'; - } - - public function getKey(bool $include_extra = true): string - { - return 'mixed'; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $php_major_version >= 8 ? 'mixed' : null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return $php_major_version >= 8; - } - - public function getAssertionString(bool $exact = false): string - { - return 'mixed'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php deleted file mode 100644 index e9eebc94..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php +++ /dev/null @@ -1,160 +0,0 @@ -value = $value; - $this->was_static = $was_static; - $this->definite_class = $definite_class; - } - - public function __toString(): string - { - return $this->getKey(); - } - - public function getKey(bool $include_extra = true): string - { - if ($include_extra && $this->extra_types) { - return $this->value . '&' . implode('&', $this->extra_types); - } - - return $this->value; - } - - public function getId(bool $nested = false): string - { - if ($this->extra_types) { - return $this->value . '&' . implode( - '&', - array_map( - function ($type) { - return $type->getId(true); - }, - $this->extra_types - ) - ); - } - - return $this->was_static ? $this->value . '&static' : $this->value; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($this->value === 'static') { - return 'static'; - } - - $intersection_types = $this->getNamespacedIntersectionTypes( - $namespace, - $aliased_classes, - $this_class, - $use_phpdoc_format - ); - - return Type::getStringFromFQCLN( - $this->value, - $namespace, - $aliased_classes, - $this_class, - true, - $this->was_static - ) . $intersection_types; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - if ($this->value === 'static') { - return $php_major_version >= 8 ? 'static' : null; - } - - if ($this->was_static && $this->value === $this_class) { - return $php_major_version >= 8 ? 'static' : 'self'; - } - - $result = $this->toNamespacedString($namespace, $aliased_classes, $this_class, false); - $intersection = strrpos($result, '&'); - if ($intersection === false || ( - ($php_major_version === 8 && $php_minor_version >= 1) || - ($php_major_version >= 9) - ) - ) { - return $result; - } - return substr($result, $intersection+1); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return ($this->value !== 'static' && $this->was_static === false) || $php_major_version >= 8; - } - - public function replaceTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - $this->replaceIntersectionTemplateTypesWithArgTypes($template_result, $codebase); - } - - public function getChildNodes(): array - { - return $this->extra_types ?? []; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php deleted file mode 100644 index 1b972d0b..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php +++ /dev/null @@ -1,40 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php deleted file mode 100644 index 8dce93d8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php +++ /dev/null @@ -1,20 +0,0 @@ -`. - * It expects an array with two elements, both union types. - */ -class TNonEmptyArray extends TArray -{ - /** - * @var int|null - */ - public $count; - - /** - * @var string - */ - public $value = 'non-empty-array'; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php deleted file mode 100644 index cf18019d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php +++ /dev/null @@ -1,21 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php deleted file mode 100644 index 8651ff1c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php +++ /dev/null @@ -1,37 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php deleted file mode 100644 index c86027a4..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php +++ /dev/null @@ -1,34 +0,0 @@ -getKey(); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function getAssertionString(bool $exact = false): string - { - return 'string'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php deleted file mode 100644 index e2a87219..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php +++ /dev/null @@ -1,42 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $php_major_version > 7 - || ($php_major_version === 7 && $php_minor_version >= 2) - ? $this->getKey() - : null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php deleted file mode 100644 index fa68b797..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php +++ /dev/null @@ -1,287 +0,0 @@ - - */ - public $properties; - - /** - * @var array - */ - public $methods; - - /** - * Constructs a new instance of a generic type - * - * @param array $properties - * @param array $methods - */ - public function __construct(array $properties, array $methods = []) - { - $this->properties = $properties; - $this->methods = $methods; - } - - public function __toString(): string - { - $extra_types = ''; - - if ($this->extra_types) { - $extra_types = '&' . implode('&', $this->extra_types); - } - - $properties_string = implode( - ', ', - array_map( - /** - * @param string|int $name - */ - function ($name, Union $type): string { - return $name . ($type->possibly_undefined ? '?' : '') . ':' . $type; - }, - array_keys($this->properties), - $this->properties - ) - ); - - $methods_string = implode( - ', ', - array_map( - function (string $name): string { - return $name . '()'; - }, - array_keys($this->methods) - ) - ); - - return 'object{' - . $properties_string . ($methods_string && $properties_string ? ', ' : '') - . $methods_string - . '}' . $extra_types; - } - - public function getId(bool $nested = false): string - { - $extra_types = ''; - - if ($this->extra_types) { - $extra_types = '&' . implode('&', $this->extra_types); - } - - $properties_string = implode( - ', ', - array_map( - /** - * @param string|int $name - */ - function ($name, Union $type): string { - return $name . ($type->possibly_undefined ? '?' : '') . ':' . $type->getId(); - }, - array_keys($this->properties), - $this->properties - ) - ); - - $methods_string = implode( - ', ', - array_map( - function (string $name): string { - return $name . '()'; - }, - array_keys($this->methods) - ) - ); - - return 'object{' - . $properties_string . ($methods_string && $properties_string ? ', ' : '') - . $methods_string - . '}' . $extra_types; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($use_phpdoc_format) { - return 'object'; - } - - return 'object{' . - implode( - ', ', - array_map( - /** - * @param string|int $name - */ - function ( - $name, - Union $type - ) use ( - $namespace, - $aliased_classes, - $this_class, - $use_phpdoc_format - ): string { - return $name . ($type->possibly_undefined ? '?' : '') . ':' . $type->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - $use_phpdoc_format - ); - }, - array_keys($this->properties), - $this->properties - ) - ) . - '}'; - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): string { - return $this->getKey(); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function __clone() - { - foreach ($this->properties as &$property) { - $property = clone $property; - } - } - - public function equals(Atomic $other_type, bool $ensure_source_equality): bool - { - if (!$other_type instanceof self) { - return false; - } - - if (count($this->properties) !== count($other_type->properties)) { - return false; - } - - if ($this->methods !== $other_type->methods) { - return false; - } - - foreach ($this->properties as $property_name => $property_type) { - if (!isset($other_type->properties[$property_name])) { - return false; - } - - if (!$property_type->equals($other_type->properties[$property_name], $ensure_source_equality)) { - return false; - } - } - - return true; - } - - public function replaceTemplateTypesWithStandins( - TemplateResult $template_result, - ?Codebase $codebase = null, - ?StatementsAnalyzer $statements_analyzer = null, - ?Atomic $input_type = null, - ?int $input_arg_offset = null, - ?string $calling_class = null, - ?string $calling_function = null, - bool $replace = true, - bool $add_lower_bound = false, - int $depth = 0 - ): Atomic { - $object_like = clone $this; - - foreach ($this->properties as $offset => $property) { - $input_type_param = null; - - if ($input_type instanceof TKeyedArray - && isset($input_type->properties[$offset]) - ) { - $input_type_param = $input_type->properties[$offset]; - } - - $object_like->properties[$offset] = TemplateStandinTypeReplacer::replace( - $property, - $template_result, - $codebase, - $statements_analyzer, - $input_type_param, - $input_arg_offset, - $calling_class, - $calling_function, - $replace, - $add_lower_bound, - null, - $depth - ); - } - - return $object_like; - } - - public function replaceTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - foreach ($this->properties as $property) { - TemplateInferredTypeReplacer::replace( - $property, - $template_result, - $codebase - ); - } - } - - public function getChildNodes(): array - { - return array_merge($this->properties, $this->extra_types !== null ? array_values($this->extra_types) : []); - } - - public function getAssertionString(bool $exact = false): string - { - return $this->getKey(); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php deleted file mode 100644 index 4e45ef06..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php +++ /dev/null @@ -1,41 +0,0 @@ - 0) - * @deprecated will be removed in Psalm 5 - */ -class TPositiveInt extends TInt -{ - public function getId(bool $nested = false): string - { - return 'positive-int'; - } - - public function __toString(): string - { - return 'positive-int'; - } - - /** - * @return false - */ - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return $use_phpdoc_format ? 'int' : 'positive-int'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php deleted file mode 100644 index 49ee6509..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php +++ /dev/null @@ -1,39 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php deleted file mode 100644 index 0cb6f0b8..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php +++ /dev/null @@ -1,43 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function getAssertionString(bool $exact = false): string - { - return 'scalar'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php deleted file mode 100644 index 13db2024..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php +++ /dev/null @@ -1,10 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $php_major_version >= 7 ? 'string' : null; - } - - public function __toString(): string - { - return 'string'; - } - - public function getKey(bool $include_extra = true): string - { - return 'string'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php deleted file mode 100644 index 72e72c38..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php +++ /dev/null @@ -1,66 +0,0 @@ -array_param_name = $array_param_name; - $this->offset_param_name = $offset_param_name; - $this->defining_class = $defining_class; - } - - public function getKey(bool $include_extra = true): string - { - return $this->array_param_name . '[' . $this->offset_param_name . ']'; - } - - public function __toString(): string - { - return $this->getKey(); - } - - public function getId(bool $nested = false): string - { - return $this->getKey(); - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php deleted file mode 100644 index 01e1dbcd..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php +++ /dev/null @@ -1,63 +0,0 @@ -param_name = $param_name; - $this->defining_class = $defining_class; - $this->as = $as; - } - - public function getKey(bool $include_extra = true): string - { - return 'key-of<' . $this->param_name . '>'; - } - - public function __toString(): string - { - return 'key-of<' . $this->param_name . '>'; - } - - public function getId(bool $nested = false): string - { - return 'key-of<' . $this->param_name . ':' . $this->defining_class . ' as ' . $this->as->getId() . '>'; - } - - /** - * @param array $aliased_classes - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return 'key-of<' . $this->param_name . '>'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php deleted file mode 100644 index 66c0af83..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php +++ /dev/null @@ -1,135 +0,0 @@ -param_name = $param_name; - $this->as = $extends; - $this->defining_class = $defining_class; - } - - public function __toString(): string - { - return $this->param_name; - } - - public function getKey(bool $include_extra = true): string - { - if ($include_extra && $this->extra_types) { - return $this->param_name . ':' . $this->defining_class . '&' . implode('&', $this->extra_types); - } - - return $this->param_name . ':' . $this->defining_class; - } - - public function getAssertionString(bool $exact = false): string - { - return $this->as->getId(); - } - - public function getId(bool $nested = false): string - { - if ($this->extra_types) { - return '(' . $this->param_name . ':' . $this->defining_class . ' as ' . $this->as->getId() - . ')&' . implode('&', array_map(function ($type) { - return $type->getId(true); - }, $this->extra_types)); - } - - return ($nested ? '(' : '') . $this->param_name - . ':' . $this->defining_class - . ' as ' . $this->as->getId() . ($nested ? ')' : ''); - } - - /** - * @param array $aliased_classes - * - * @return null - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($use_phpdoc_format) { - return $this->as->toNamespacedString( - $namespace, - $aliased_classes, - $this_class, - true - ); - } - - $intersection_types = $this->getNamespacedIntersectionTypes( - $namespace, - $aliased_classes, - $this_class, - false - ); - - return $this->param_name . $intersection_types; - } - - public function getChildNodes(): array - { - return [$this->as]; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function replaceTemplateTypesWithArgTypes( - TemplateResult $template_result, - ?Codebase $codebase - ): void { - $this->replaceIntersectionTemplateTypesWithArgTypes($template_result, $codebase); - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php deleted file mode 100644 index bd683122..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php +++ /dev/null @@ -1,65 +0,0 @@ -param_name = $param_name; - $this->as = $as; - $this->as_type = $as_type; - $this->defining_class = $defining_class; - } - - public function getKey(bool $include_extra = true): string - { - return 'class-string<' . $this->param_name . '>'; - } - - public function __toString(): string - { - return 'class-string<' . $this->param_name . '>'; - } - - public function getId(bool $nested = false): string - { - return 'class-string<' . $this->param_name . ':' . $this->defining_class - . ' as ' . ($this->as_type ? $this->as_type->getId() : $this->as) . '>'; - } - - public function getAssertionString(bool $exact = false): string - { - return 'class-string<' . $this->param_name . '>'; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return $this->param_name . '::class'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php deleted file mode 100644 index 65008a4d..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php +++ /dev/null @@ -1,55 +0,0 @@ -getKey(); - } - - public function getId(bool $nested = false): string - { - return $this->getKey(); - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return 'string'; - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - return 'trait-string'; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php deleted file mode 100644 index 208c70ee..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php +++ /dev/null @@ -1,27 +0,0 @@ -|null - */ - public $extra_types; - - /** @var string */ - public $declaring_fq_classlike_name; - - /** @var string */ - public $alias_name; - - public function __construct(string $declaring_fq_classlike_name, string $alias_name) - { - $this->declaring_fq_classlike_name = $declaring_fq_classlike_name; - $this->alias_name = $alias_name; - } - - public function getKey(bool $include_extra = true): string - { - return 'type-alias(' . $this->declaring_fq_classlike_name . '::' . $this->alias_name . ')'; - } - - public function __toString(): string - { - if ($this->extra_types) { - return $this->getKey() . '&' . implode( - '&', - array_map( - 'strval', - $this->extra_types - ) - ); - } - - return $this->getKey(); - } - - public function getId(bool $nested = false): string - { - if ($this->extra_types) { - return $this->getKey() . '&' . implode( - '&', - array_map( - function ($type) { - return $type->getId(true); - }, - $this->extra_types - ) - ); - } - - return $this->getKey(); - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - public function getAssertionString(bool $exact = false): string - { - return 'mixed'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php deleted file mode 100644 index cbeb6b4c..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php +++ /dev/null @@ -1,80 +0,0 @@ -fq_classlike_name = $fq_classlike_name; - $this->const_name = $const_name; - } - - public function getKey(bool $include_extra = true): string - { - return 'value-of<' . $this->fq_classlike_name . '::' . $this->const_name . '>'; - } - - public function __toString(): string - { - return 'value-of<' . $this->fq_classlike_name . '::' . $this->const_name . '>'; - } - - public function getId(bool $nested = false): string - { - return $this->getKey(); - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return false; - } - - /** - * @param array $aliased_classes - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - if ($this->fq_classlike_name === 'static') { - return 'value-ofconst_name . '>'; - } - - return 'value-of<' - . Type::getStringFromFQCLN($this->fq_classlike_name, $namespace, $aliased_classes, $this_class) - . '>::' . $this->const_name . '>'; - } - - public function getAssertionString(bool $exact = false): string - { - return 'mixed'; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php deleted file mode 100644 index cec58cd4..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php +++ /dev/null @@ -1,41 +0,0 @@ - $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - return $php_major_version > 7 - || ($php_major_version === 7 && $php_minor_version >= 1) - ? $this->getKey() : null; - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - return true; - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/NodeVisitor.php b/vendor/vimeo/psalm/src/Psalm/Type/NodeVisitor.php deleted file mode 100644 index d33325a5..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/NodeVisitor.php +++ /dev/null @@ -1,50 +0,0 @@ -enterNode($node); - - if ($visitor_result === self::DONT_TRAVERSE_CHILDREN) { - return true; - } - - if ($visitor_result === self::STOP_TRAVERSAL) { - return false; - } - - foreach ($node->getChildNodes() as $child_node) { - if ($this->traverse($child_node) === false) { - return false; - } - } - - return true; - } - - /** - * @param array $nodes - */ - public function traverseArray(array $nodes): void - { - foreach ($nodes as $node) { - if ($this->traverse($node) === false) { - return; - } - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Reconciler.php b/vendor/vimeo/psalm/src/Psalm/Type/Reconciler.php deleted file mode 100644 index 60e042b7..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Reconciler.php +++ /dev/null @@ -1,1110 +0,0 @@ -> */ - private static $broken_paths = []; - - /** - * Takes two arrays and consolidates them, removing null values from existing types where applicable - * - * @param array>> $new_types - * @param array>> $active_new_types - types we can complain about - * @param array $existing_types - * @param array $changed_var_ids - * @param array $referenced_var_ids - * @param array> $template_type_map - * - * @return array - */ - public static function reconcileKeyedTypes( - array $new_types, - array $active_new_types, - array $existing_types, - array &$changed_var_ids, - array $referenced_var_ids, - StatementsAnalyzer $statements_analyzer, - array $template_type_map = [], - bool $inside_loop = false, - ?CodeLocation $code_location = null, - bool $negated = false - ): array { - if (!$new_types) { - return $existing_types; - } - - $suppressed_issues = $statements_analyzer->getSuppressedIssues(); - - $old_new_types = $new_types; - - $new_types = self::addNestedAssertions($new_types, $existing_types); - - // make sure array keys come after base keys - ksort($new_types); - - $codebase = $statements_analyzer->getCodebase(); - - foreach ($new_types as $key => $new_type_parts) { - if (strpos($key, '::') - && !strpos($key, '$') - && !strpos($key, '[') - ) { - continue; - } - - $has_negation = false; - $has_isset = false; - $has_inverted_isset = false; - $has_falsyish = false; - $has_empty = false; - $has_count_check = false; - $is_real = ($old_new_types[$key] ?? null) === $new_type_parts; - $is_equality = $is_real; - - foreach ($new_type_parts as $new_type_part_parts) { - foreach ($new_type_part_parts as $new_type_part_part) { - if ($new_type_part_part[0] === '!') { - $has_negation = true; - } - - $has_isset = $has_isset - || $new_type_part_part === 'isset' - || $new_type_part_part === '=isset' - || $new_type_part_part === 'array-key-exists' - || $new_type_part_part === '=string-array-access'; - - $has_empty = $has_empty || $new_type_part_part === 'empty'; - - $has_falsyish = $has_falsyish - || $new_type_part_part === 'empty' - || $new_type_part_part === 'falsy'; - - $is_equality = $is_equality - && $new_type_part_part[0] === '=' - && $new_type_part_part !== '=isset'; - - $has_inverted_isset = $has_inverted_isset || $new_type_part_part === '!isset'; - - $has_count_check = $has_count_check - || $new_type_part_part === 'non-empty-countable'; - } - } - - $did_type_exist = isset($existing_types[$key]); - - $has_object_array_access = false; - - $result_type = isset($existing_types[$key]) - ? clone $existing_types[$key] - : self::getValueForKey( - $codebase, - $key, - $existing_types, - $new_types, - $code_location, - $has_isset, - $has_inverted_isset, - $has_empty, - $inside_loop, - $has_object_array_access - ); - - if ($result_type && $result_type->isUnionEmpty()) { - throw new InvalidArgumentException('Union::$types cannot be empty after get value for ' . $key); - } - - $before_adjustment = $result_type ? clone $result_type : null; - - $failed_reconciliation = self::RECONCILIATION_OK; - - foreach ($new_type_parts as $offset => $new_type_part_parts) { - $orred_type = null; - - foreach ($new_type_part_parts as $new_type_part_part) { - if ($new_type_part_part[0] === '@' - || ($new_type_part_part[0] === '!' - && $new_type_part_part[1] === '@') - ) { - if ($new_type_part_part[0] === '!') { - $nested_negated = !$negated; - - /** @var array>> */ - $data = json_decode(substr($new_type_part_part, 2), true); - } else { - $nested_negated = $negated; - /** @var array>> */ - $data = json_decode(substr($new_type_part_part, 1), true); - } - - $existing_types = self::reconcileKeyedTypes( - $data, - $data, - $existing_types, - $changed_var_ids, - $referenced_var_ids, - $statements_analyzer, - $template_type_map, - $inside_loop, - $code_location, - $nested_negated - ); - - $new_type_part_part = ($nested_negated ? '' : '!') . 'falsy'; - } - - $result_type_candidate = AssertionReconciler::reconcile( - $new_type_part_part, - $result_type ? clone $result_type : null, - $key, - $statements_analyzer, - $inside_loop, - $template_type_map, - $code_location - && isset($referenced_var_ids[$key]) - && isset($active_new_types[$key][$offset]) - ? $code_location - : null, - $suppressed_issues, - $failed_reconciliation, - $negated - ); - - if ($result_type_candidate->isUnionEmpty()) { - $result_type_candidate->addType(new TEmpty); - } - - $orred_type = Type::combineUnionTypes( - $result_type_candidate, - $orred_type, - $codebase - ); - } - - $result_type = $orred_type; - } - - if (!$result_type) { - throw new UnexpectedValueException('$result_type should not be null'); - } - - if (!$did_type_exist && $result_type->isEmpty()) { - continue; - } - - if (($statements_analyzer->data_flow_graph instanceof TaintFlowGraph - && (!$result_type->hasScalarType() - || ($result_type->hasString() && !$result_type->hasLiteralString()))) - || $statements_analyzer->data_flow_graph instanceof VariableUseGraph - ) { - if ($before_adjustment && $before_adjustment->parent_nodes) { - $result_type->parent_nodes = $before_adjustment->parent_nodes; - } elseif (!$did_type_exist && $code_location) { - $result_type->parent_nodes = $statements_analyzer->getParentNodesForPossiblyUndefinedVariable( - $key - ); - } - } - - if ($before_adjustment && $before_adjustment->by_ref) { - $result_type->by_ref = true; - } - - $type_changed = !$before_adjustment || !$result_type->equals($before_adjustment); - - if ($type_changed || $failed_reconciliation) { - $changed_var_ids[$key] = true; - - if (substr($key, -1) === ']' && !$has_inverted_isset && !$has_empty && !$is_equality) { - $key_parts = self::breakUpPathIntoParts($key); - self::adjustTKeyedArrayType( - $key_parts, - $existing_types, - $changed_var_ids, - $result_type - ); - } elseif ($key !== '$this') { - foreach ($existing_types as $new_key => $_) { - if ($new_key === $key) { - continue; - } - - if (!isset($new_types[$new_key]) - && preg_match('/' . preg_quote($key, '/') . '[\]\[\-]/', $new_key) - && $is_real - ) { - unset($existing_types[$new_key]); - } - } - } - } elseif (!$has_negation && !$has_falsyish && !$has_isset) { - $changed_var_ids[$key] = true; - } - - if ($failed_reconciliation === self::RECONCILIATION_EMPTY) { - $result_type->failed_reconciliation = true; - } - - if (!$has_object_array_access) { - $existing_types[$key] = $result_type; - } - } - - return $existing_types; - } - - /** - * This generates a list of extra assertions for an assertion on a nested key. - * - * For example ['$a[0]->foo->bar' => 'isset'] - * - * generates the assertions - * - * [ - * '$a' => '=int-or-string-array-access', - * '$a[0]' => '=isset', - * '$a[0]->foo' => '=isset', - * '$a[0]->foo->bar' => 'isset' // original assertion - * ] - * - * @param array>> $new_types - * @param array $existing_types - * - * @return array>> - */ - private static function addNestedAssertions(array $new_types, array $existing_types): array - { - foreach ($new_types as $nk => $type) { - if (strpos($nk, '[') || strpos($nk, '->')) { - if ($type[0][0] === '=isset' - || $type[0][0] === '!=empty' - || $type[0][0] === 'isset' - || $type[0][0] === '!empty' - ) { - $key_parts = self::breakUpPathIntoParts($nk); - - $base_key = array_shift($key_parts); - - if ($base_key[0] !== '$' && count($key_parts) > 2 && $key_parts[0] === '::$') { - $base_key .= array_shift($key_parts); - $base_key .= array_shift($key_parts); - } - - if (!isset($existing_types[$base_key]) || $existing_types[$base_key]->isNullable()) { - if (!isset($new_types[$base_key])) { - $new_types[$base_key] = [['=isset']]; - } else { - $new_types[$base_key][] = ['=isset']; - } - } - - while ($key_parts) { - $divider = array_shift($key_parts); - - if ($divider === '[') { - $array_key = array_shift($key_parts); - array_shift($key_parts); - - $new_base_key = $base_key . '[' . $array_key . ']'; - - if (strpos($array_key, '\'') !== false) { - $new_types[$base_key][] = ['=string-array-access']; - } else { - $new_types[$base_key][] = ['=int-or-string-array-access']; - } - - $base_key = $new_base_key; - - continue; - } - - if ($divider === '->') { - $property_name = array_shift($key_parts); - $new_base_key = $base_key . '->' . $property_name; - - if (!isset($new_types[$base_key])) { - $new_types[$base_key] = [['=isset']]; - } - - $base_key = $new_base_key; - } else { - break; - } - - if (!$key_parts) { - break; - } - - if (!isset($new_types[$base_key])) { - $new_types[$base_key] = [['!~bool'], ['!~int'], ['=isset']]; - } else { - $new_types[$base_key][] = ['!~bool']; - $new_types[$base_key][] = ['!~int']; - $new_types[$base_key][] = ['=isset']; - } - } - } - - if ($type[0][0] === 'array-key-exists') { - $key_parts = self::breakUpPathIntoParts($nk); - - if (count($key_parts) === 4 - && $key_parts[1] === '[' - && $key_parts[2][0] !== '\'' - && !is_numeric($key_parts[2]) - ) { - if ($key_parts[0][0] === '$') { - if (isset($new_types[$key_parts[0]])) { - $new_types[$key_parts[0]][] = ['=has-array-key-' . $key_parts[2]]; - } else { - $new_types[$key_parts[0]] = [['=has-array-key-' . $key_parts[2]]]; - } - } - } - } - } - } - - return $new_types; - } - - /** - * @return non-empty-list - */ - public static function breakUpPathIntoParts(string $path): array - { - if (isset(self::$broken_paths[$path])) { - return self::$broken_paths[$path]; - } - - $chars = str_split($path); - - $string_char = null; - $escape_char = false; - $brackets = 0; - - $parts = ['']; - $parts_offset = 0; - - for ($i = 0, $char_count = count($chars); $i < $char_count; ++$i) { - $char = $chars[$i]; - - if ($string_char) { - if ($char === $string_char && !$escape_char) { - $string_char = null; - } - - if ($char === '\\') { - $escape_char = !$escape_char; - } - - $parts[$parts_offset] .= $char; - continue; - } - - switch ($char) { - case '[': - case ']': - $parts_offset++; - $parts[$parts_offset] = $char; - ++$parts_offset; - - if ($char === '[') { - $brackets++; - } else { - $brackets--; - } - - continue 2; - - case '\'': - case '"': - if (!isset($parts[$parts_offset])) { - $parts[$parts_offset] = ''; - } - $parts[$parts_offset] .= $char; - $string_char = $char; - - continue 2; - - case ':': - if (!$brackets - && $i < $char_count - 2 - && $chars[$i + 1] === ':' - && $chars[$i + 2] === '$' - ) { - ++$i; - ++$i; - - ++$parts_offset; - $parts[$parts_offset] = '::$'; - ++$parts_offset; - continue 2; - } - // fall through - - case '-': - if (!$brackets - && $i < $char_count - 1 - && $chars[$i + 1] === '>' - ) { - ++$i; - - ++$parts_offset; - $parts[$parts_offset] = '->'; - ++$parts_offset; - continue 2; - } - // fall through - - // no break - default: - if (!isset($parts[$parts_offset])) { - $parts[$parts_offset] = ''; - } - $parts[$parts_offset] .= $char; - } - } - - $parts = array_values($parts); - - self::$broken_paths[$path] = $parts; - - return $parts; - } - - /** - * Gets the type for a given (non-existent key) based on the passed keys - * - * @param array $existing_keys - * @param array $new_assertions - */ - private static function getValueForKey( - Codebase $codebase, - string $key, - array &$existing_keys, - array $new_assertions, - ?CodeLocation $code_location, - bool $has_isset, - bool $has_inverted_isset, - bool $has_empty, - bool $inside_loop, - bool &$has_object_array_access - ): ?Union { - $key_parts = self::breakUpPathIntoParts($key); - - if (count($key_parts) === 1) { - return isset($existing_keys[$key_parts[0]]) ? clone $existing_keys[$key_parts[0]] : null; - } - - $base_key = array_shift($key_parts); - - if ($base_key[0] !== '$' && count($key_parts) > 2 && $key_parts[0] === '::$') { - $base_key .= array_shift($key_parts); - $base_key .= array_shift($key_parts); - } - - if (!isset($existing_keys[$base_key])) { - if (strpos($base_key, '::')) { - [$fq_class_name, $const_name] = explode('::', $base_key); - - if (!$codebase->classlikes->classOrInterfaceExists($fq_class_name)) { - return null; - } - - $class_constant = $codebase->classlikes->getClassConstantType( - $fq_class_name, - $const_name, - ReflectionProperty::IS_PRIVATE, - null - ); - - if ($class_constant) { - $existing_keys[$base_key] = clone $class_constant; - } else { - return null; - } - } else { - return null; - } - } - - while ($key_parts) { - $divider = array_shift($key_parts); - - if ($divider === '[') { - $array_key = array_shift($key_parts); - array_shift($key_parts); - - $new_base_key = $base_key . '[' . $array_key . ']'; - - if (!isset($existing_keys[$new_base_key])) { - $new_base_type = null; - - $atomic_types = $existing_keys[$base_key]->getAtomicTypes(); - - while ($atomic_types) { - $existing_key_type_part = array_shift($atomic_types); - - if ($existing_key_type_part instanceof TTemplateParam) { - $atomic_types = array_merge($atomic_types, $existing_key_type_part->as->getAtomicTypes()); - continue; - } - - if ($existing_key_type_part instanceof TArray) { - if ($has_empty) { - return null; - } - - $new_base_type_candidate = clone $existing_key_type_part->type_params[1]; - - if ($new_base_type_candidate->isMixed() && !$has_isset && !$has_inverted_isset) { - return $new_base_type_candidate; - } - - if (($has_isset || $has_inverted_isset) && isset($new_assertions[$new_base_key])) { - if ($has_inverted_isset && $new_base_key === $key) { - $new_base_type_candidate->addType(new TNull); - } - - $new_base_type_candidate->possibly_undefined = true; - } - } elseif ($existing_key_type_part instanceof TList) { - if ($has_empty) { - return null; - } - - $new_base_type_candidate = clone $existing_key_type_part->type_param; - - if (($has_isset || $has_inverted_isset) && isset($new_assertions[$new_base_key])) { - if ($has_inverted_isset && $new_base_key === $key) { - $new_base_type_candidate->addType(new TNull); - } - - $new_base_type_candidate->possibly_undefined = true; - } - } elseif ($existing_key_type_part instanceof TNull - || $existing_key_type_part instanceof TFalse - ) { - $new_base_type_candidate = Type::getNull(); - - if ($existing_keys[$base_key]->ignore_nullable_issues) { - $new_base_type_candidate->ignore_nullable_issues = true; - } - } elseif ($existing_key_type_part instanceof TClassStringMap) { - return Type::getMixed(); - } elseif ($existing_key_type_part instanceof TEmpty - || ($existing_key_type_part instanceof TMixed - && $existing_key_type_part->from_loop_isset) - ) { - return Type::getMixed($inside_loop); - } elseif ($existing_key_type_part instanceof TString) { - $new_base_type_candidate = Type::getString(); - } elseif ($existing_key_type_part instanceof TNamedObject - && ($has_isset || $has_inverted_isset) - ) { - $has_object_array_access = true; - - unset($existing_keys[$new_base_key]); - - return null; - } elseif (!$existing_key_type_part instanceof TKeyedArray) { - return Type::getMixed(); - } elseif ($array_key[0] === '$' || ($array_key[0] !== '\'' && !is_numeric($array_key[0]))) { - if ($has_empty) { - return null; - } - - $new_base_type_candidate = $existing_key_type_part->getGenericValueType(); - } else { - $array_properties = $existing_key_type_part->properties; - - $key_parts_key = str_replace('\'', '', $array_key); - - if (!isset($array_properties[$key_parts_key])) { - if ($existing_key_type_part->previous_value_type) { - $new_base_type_candidate = clone $existing_key_type_part->previous_value_type; - $new_base_type_candidate->different = true; - } else { - return null; - } - } else { - $new_base_type_candidate = clone $array_properties[$key_parts_key]; - } - } - - $new_base_type = Type::combineUnionTypes( - $new_base_type, - $new_base_type_candidate, - $codebase - ); - - $existing_keys[$new_base_key] = $new_base_type; - } - } - - $base_key = $new_base_key; - } elseif ($divider === '->' || $divider === '::$') { - $property_name = array_shift($key_parts); - $new_base_key = $base_key . $divider . $property_name; - - if (!isset($existing_keys[$new_base_key])) { - $new_base_type = null; - - $atomic_types = $existing_keys[$base_key]->getAtomicTypes(); - - while ($atomic_types) { - $existing_key_type_part = array_shift($atomic_types); - - if ($existing_key_type_part instanceof TTemplateParam) { - $atomic_types = array_merge($atomic_types, $existing_key_type_part->as->getAtomicTypes()); - continue; - } - - if ($existing_key_type_part instanceof TNull) { - $class_property_type = Type::getNull(); - } elseif ($existing_key_type_part instanceof TMixed - || $existing_key_type_part instanceof TObject - || ($existing_key_type_part instanceof TNamedObject - && strtolower($existing_key_type_part->value) === 'stdclass') - ) { - $class_property_type = Type::getMixed(); - } elseif ($existing_key_type_part instanceof TNamedObject) { - if (!$codebase->classOrInterfaceExists($existing_key_type_part->value)) { - $class_property_type = Type::getMixed(); - } else { - if (substr($property_name, -2) === '()') { - $method_id = new MethodIdentifier( - $existing_key_type_part->value, - strtolower(substr($property_name, 0, -2)) - ); - - if (!$codebase->methods->methodExists($method_id)) { - return null; - } - - $declaring_method_id = $codebase->methods->getDeclaringMethodId( - $method_id - ); - - if ($declaring_method_id === null) { - return null; - } - - $declaring_class = $declaring_method_id->fq_class_name; - - $method_return_type = $codebase->methods->getMethodReturnType( - $method_id, - $declaring_class, - null, - null - ); - - if ($method_return_type) { - $class_property_type = TypeExpander::expandUnion( - $codebase, - clone $method_return_type, - $declaring_class, - $declaring_class, - null - ); - } else { - $class_property_type = Type::getMixed(); - } - } else { - $class_property_type = self::getPropertyType( - $codebase, - $existing_key_type_part->value, - $property_name - ); - - if (!$class_property_type) { - return null; - } - } - } - } else { - $class_property_type = Type::getMixed(); - } - - $new_base_type = Type::combineUnionTypes( - $new_base_type, - $class_property_type, - $codebase - ); - - $existing_keys[$new_base_key] = $new_base_type; - } - } - - $base_key = $new_base_key; - } else { - return null; - } - } - - if (!isset($existing_keys[$base_key])) { - if ($code_location) { - IssueBuffer::add( - new PsalmInternalError( - 'Unknown key ' . $base_key, - $code_location - ) - ); - } - - return null; - } - - return $existing_keys[$base_key]; - } - - private static function getPropertyType( - Codebase $codebase, - string $fq_class_name, - string $property_name - ): ?Union { - $property_id = $fq_class_name . '::$' . $property_name; - - if (!$codebase->properties->propertyExists($property_id, true)) { - $declaring_class_storage = $codebase->classlike_storage_provider->get( - $fq_class_name - ); - - if (isset($declaring_class_storage->pseudo_property_get_types['$' . $property_name])) { - return clone $declaring_class_storage->pseudo_property_get_types['$' . $property_name]; - } - - return null; - } - - $declaring_property_class = $codebase->properties->getDeclaringClassForProperty( - $property_id, - true - ); - - if ($declaring_property_class === null) { - return null; - } - - $class_property_type = $codebase->properties->getPropertyType( - $property_id, - false, - null, - null - ); - - $declaring_class_storage = $codebase->classlike_storage_provider->get( - $declaring_property_class - ); - - if ($class_property_type) { - return TypeExpander::expandUnion( - $codebase, - clone $class_property_type, - $declaring_class_storage->name, - $declaring_class_storage->name, - null - ); - } - - return Type::getMixed(); - } - - /** - * @param string[] $suppressed_issues - * - */ - protected static function triggerIssueForImpossible( - Union $existing_var_type, - string $old_var_type_string, - string $key, - string $assertion, - bool $redundant, - bool $negated, - CodeLocation $code_location, - array $suppressed_issues - ): void { - $not = $assertion[0] === '!'; - - if ($not) { - $assertion = substr($assertion, 1); - } - - $operator = substr($assertion, 0, 1); - if ($operator === '>') { - $assertion = '>= '.substr($assertion, 1); - } elseif ($operator === '<') { - $assertion = '<= '.substr($assertion, 1); - } - - if ($negated) { - $redundant = !$redundant; - $not = !$not; - } - - $existing_var_atomic_types = $existing_var_type->getAtomicTypes(); - - $from_docblock = $existing_var_type->from_docblock - || (isset($existing_var_atomic_types[$assertion]) - && $existing_var_atomic_types[$assertion]->from_docblock); - - if ($redundant) { - if ($existing_var_type->from_property && $assertion === 'isset') { - if ($existing_var_type->from_static_property) { - IssueBuffer::maybeAdd( - new RedundantPropertyInitializationCheck( - 'Static property ' . $key . ' with type ' - . $old_var_type_string - . ' has unexpected isset check — should it be nullable?', - $code_location - ), - $suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new RedundantPropertyInitializationCheck( - 'Property ' . $key . ' with type ' - . $old_var_type_string . ' should already be set in the constructor', - $code_location - ), - $suppressed_issues - ); - } - } elseif ($from_docblock) { - IssueBuffer::maybeAdd( - new RedundantConditionGivenDocblockType( - 'Docblock-defined type ' . $old_var_type_string - . ' for ' . $key - . ' is ' . ($not ? 'never ' : 'always ') . $assertion, - $code_location, - $old_var_type_string . ' ' . $assertion - ), - $suppressed_issues - ); - } else { - IssueBuffer::maybeAdd( - new RedundantCondition( - 'Type ' . $old_var_type_string - . ' for ' . $key - . ' is ' . ($not ? 'never ' : 'always ') . $assertion, - $code_location, - $old_var_type_string . ' ' . $assertion - ), - $suppressed_issues - ); - } - } else { - if ($from_docblock) { - IssueBuffer::maybeAdd( - new DocblockTypeContradiction( - 'Docblock-defined type ' . $old_var_type_string - . ' for ' . $key - . ' is ' . ($not ? 'always ' : 'never ') . $assertion, - $code_location, - $old_var_type_string . ' ' . $assertion - ), - $suppressed_issues - ); - } else { - if ($assertion === 'null' && !$not) { - $issue = new TypeDoesNotContainNull( - 'Type ' . $old_var_type_string - . ' for ' . $key - . ' is never ' . $assertion, - $code_location, - $old_var_type_string . ' ' . $assertion - ); - } else { - $issue = new TypeDoesNotContainType( - 'Type ' . $old_var_type_string - . ' for ' . $key - . ' is ' . ($not ? 'always ' : 'never ') . $assertion, - $code_location, - $old_var_type_string . ' ' . $assertion - ); - } - - IssueBuffer::maybeAdd( - $issue, - $suppressed_issues - ); - } - } - } - - /** - * @param string[] $key_parts - * @param array $existing_types - * @param array $changed_var_ids - */ - private static function adjustTKeyedArrayType( - array $key_parts, - array &$existing_types, - array &$changed_var_ids, - Union $result_type - ): void { - array_pop($key_parts); - $array_key = array_pop($key_parts); - array_pop($key_parts); - - if ($array_key === null) { - throw new UnexpectedValueException('Not expecting null array key'); - } - - if ($array_key[0] === '$') { - return; - } - - $array_key_offset = $array_key[0] === '\'' || $array_key[0] === '"' ? substr($array_key, 1, -1) : $array_key; - - $base_key = implode($key_parts); - - if (isset($existing_types[$base_key]) && $array_key_offset !== false) { - foreach ($existing_types[$base_key]->getAtomicTypes() as $base_atomic_type) { - if ($base_atomic_type instanceof TKeyedArray - || ($base_atomic_type instanceof TArray - && !$base_atomic_type->type_params[1]->isEmpty()) - || $base_atomic_type instanceof TList - || $base_atomic_type instanceof TClassStringMap - ) { - $new_base_type = clone $existing_types[$base_key]; - - if ($base_atomic_type instanceof TArray) { - $previous_key_type = clone $base_atomic_type->type_params[0]; - $previous_value_type = clone $base_atomic_type->type_params[1]; - - $base_atomic_type = new TKeyedArray( - [ - $array_key_offset => clone $result_type, - ], - null - ); - - if (!$previous_key_type->isEmpty()) { - $base_atomic_type->previous_key_type = $previous_key_type; - } - $base_atomic_type->previous_value_type = $previous_value_type; - } elseif ($base_atomic_type instanceof TList) { - $previous_key_type = Type::getInt(); - $previous_value_type = clone $base_atomic_type->type_param; - - $base_atomic_type = new TKeyedArray( - [ - $array_key_offset => clone $result_type, - ], - null - ); - - $base_atomic_type->is_list = true; - - $base_atomic_type->previous_key_type = $previous_key_type; - $base_atomic_type->previous_value_type = $previous_value_type; - } elseif ($base_atomic_type instanceof TClassStringMap) { - // do nothing - } else { - $base_atomic_type = clone $base_atomic_type; - $base_atomic_type->properties[$array_key_offset] = clone $result_type; - } - - $new_base_type->addType($base_atomic_type); - - $changed_var_ids[$base_key . '[' . $array_key . ']'] = true; - - if ($key_parts[count($key_parts) - 1] === ']') { - self::adjustTKeyedArrayType( - $key_parts, - $existing_types, - $changed_var_ids, - $new_base_type - ); - } - - $existing_types[$base_key] = $new_base_type; - break; - } - } - } - } - - protected static function refineArrayKey(Union $key_type): void - { - foreach ($key_type->getAtomicTypes() as $key => $cat) { - if ($cat instanceof TTemplateParam) { - self::refineArrayKey($cat->as); - $key_type->bustCache(); - } elseif ($cat instanceof TScalar || $cat instanceof TMixed) { - $key_type->removeType($key); - $key_type->addType(new TArrayKey()); - } elseif (!$cat instanceof TString && !$cat instanceof TInt) { - $key_type->removeType($key); - $key_type->addType(new TArrayKey()); - } - } - - if ($key_type->isUnionEmpty()) { - // this should ideally prompt some sort of error - $key_type->addType(new TArrayKey()); - } - } -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/TaintKind.php b/vendor/vimeo/psalm/src/Psalm/Type/TaintKind.php deleted file mode 100644 index b5022d98..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/TaintKind.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ - public function getChildNodes(): array; -} diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Union.php b/vendor/vimeo/psalm/src/Psalm/Type/Union.php deleted file mode 100644 index 6ff34be3..00000000 --- a/vendor/vimeo/psalm/src/Psalm/Type/Union.php +++ /dev/null @@ -1,1668 +0,0 @@ - - */ - private $types; - - /** - * Whether the type originated in a docblock - * - * @var bool - */ - public $from_docblock = false; - - /** - * Whether the type originated from integer calculation - * - * @var bool - */ - public $from_calculation = false; - - /** - * Whether the type originated from a property - * - * This helps turn isset($foo->bar) into a different sort of issue - * - * @var bool - */ - public $from_property = false; - - /** - * Whether the type originated from *static* property - * - * Unlike non-static properties, static properties have no prescribed place - * like __construct() to be initialized in - * - * @var bool - */ - public $from_static_property = false; - - /** - * Whether the property that this type has been derived from has been initialized in a constructor - * - * @var bool - */ - public $initialized = true; - - /** - * Which class the type was initialised in - * - * @var ?string - */ - public $initialized_class; - - /** - * Whether or not the type has been checked yet - * - * @var bool - */ - public $checked = false; - - /** - * @var bool - */ - public $failed_reconciliation = false; - - /** - * Whether or not to ignore issues with possibly-null values - * - * @var bool - */ - public $ignore_nullable_issues = false; - - /** - * Whether or not to ignore issues with possibly-false values - * - * @var bool - */ - public $ignore_falsable_issues = false; - - /** - * Whether or not to ignore issues with isset on this type - * - * @var bool - */ - public $ignore_isset = false; - - /** - * Whether or not this variable is possibly undefined - * - * @var bool - */ - public $possibly_undefined = false; - - /** - * Whether or not this variable is possibly undefined - * - * @var bool - */ - public $possibly_undefined_from_try = false; - - /** - * Whether or not this union had a template, since replaced - * - * @var bool - */ - public $had_template = false; - - /** - * Whether or not this union comes from a template "as" default - * - * @var bool - */ - public $from_template_default = false; - - /** - * @var array - */ - private $literal_string_types = []; - - /** - * @var array - */ - private $typed_class_strings = []; - - /** - * @var array - */ - private $literal_int_types = []; - - /** - * @var array - */ - private $literal_float_types = []; - - /** - * Whether or not the type was passed by reference - * - * @var bool - */ - public $by_ref = false; - - /** - * @var bool - */ - public $reference_free = false; - - /** - * @var bool - */ - public $allow_mutations = true; - - /** - * @var bool - */ - public $has_mutations = true; - - /** @var null|string */ - private $id; - - /** - * @var array - */ - public $parent_nodes = []; - - /** - * @var bool - */ - public $different = false; - - /** - * Constructs an Union instance - * - * @param non-empty-array $types - */ - public function __construct(array $types) - { - $from_docblock = false; - - $keyed_types = []; - - foreach ($types as $type) { - $key = $type->getKey(); - $keyed_types[$key] = $type; - - if ($type instanceof TLiteralInt) { - $this->literal_int_types[$key] = $type; - } elseif ($type instanceof TLiteralString) { - $this->literal_string_types[$key] = $type; - } elseif ($type instanceof TLiteralFloat) { - $this->literal_float_types[$key] = $type; - } elseif ($type instanceof TClassString - && ($type->as_type || $type instanceof TTemplateParamClass) - ) { - $this->typed_class_strings[$key] = $type; - } - - $from_docblock = $from_docblock || $type->from_docblock; - } - - $this->types = $keyed_types; - - $this->from_docblock = $from_docblock; - } - - /** - * @param non-empty-array $types - */ - public function replaceTypes(array $types): void - { - $this->types = $types; - } - - /** - * @psalm-mutation-free - * @return non-empty-array - */ - public function getAtomicTypes(): array - { - return $this->types; - } - - public function addType(Atomic $type): void - { - $this->types[$type->getKey()] = $type; - - if ($type instanceof TLiteralString) { - $this->literal_string_types[$type->getKey()] = $type; - } elseif ($type instanceof TLiteralInt) { - $this->literal_int_types[$type->getKey()] = $type; - } elseif ($type instanceof TLiteralFloat) { - $this->literal_float_types[$type->getKey()] = $type; - } elseif ($type instanceof TString && $this->literal_string_types) { - foreach ($this->literal_string_types as $key => $_) { - unset($this->literal_string_types[$key], $this->types[$key]); - } - if (!$type instanceof TClassString - || (!$type->as_type && !$type instanceof TTemplateParamClass) - ) { - foreach ($this->typed_class_strings as $key => $_) { - unset($this->typed_class_strings[$key], $this->types[$key]); - } - } - } elseif ($type instanceof TInt && $this->literal_int_types) { - //we remove any literal that is already included in a wider type - $int_type_in_range = TIntRange::convertToIntRange($type); - foreach ($this->literal_int_types as $key => $literal_int_type) { - if ($int_type_in_range->contains($literal_int_type->value)) { - unset($this->literal_int_types[$key], $this->types[$key]); - } - } - } elseif ($type instanceof TFloat && $this->literal_float_types) { - foreach ($this->literal_float_types as $key => $_) { - unset($this->literal_float_types[$key], $this->types[$key]); - } - } - - $this->id = null; - } - - public function __clone() - { - $this->literal_string_types = []; - $this->literal_int_types = []; - $this->literal_float_types = []; - $this->typed_class_strings = []; - - foreach ($this->types as $key => &$type) { - $type = clone $type; - - if ($type instanceof TLiteralInt) { - $this->literal_int_types[$key] = $type; - } elseif ($type instanceof TLiteralString) { - $this->literal_string_types[$key] = $type; - } elseif ($type instanceof TLiteralFloat) { - $this->literal_float_types[$key] = $type; - } elseif ($type instanceof TClassString - && ($type->as_type || $type instanceof TTemplateParamClass) - ) { - $this->typed_class_strings[$key] = $type; - } - } - } - - public function __toString(): string - { - $types = []; - - $printed_int = false; - $printed_float = false; - $printed_string = false; - - foreach ($this->types as $type) { - if ($type instanceof TLiteralFloat) { - if ($printed_float) { - continue; - } - - $printed_float = true; - } elseif ($type instanceof TLiteralString) { - if ($printed_string) { - continue; - } - - $printed_string = true; - } elseif ($type instanceof TLiteralInt) { - if ($printed_int) { - continue; - } - - $printed_int = true; - } - - $types[] = (string)$type; - } - - sort($types); - return implode('|', $types); - } - - public function getKey(): string - { - $types = []; - - $printed_int = false; - $printed_float = false; - $printed_string = false; - - foreach ($this->types as $type) { - if ($type instanceof TLiteralFloat) { - if ($printed_float) { - continue; - } - - $types[] = 'float'; - $printed_float = true; - } elseif ($type instanceof TLiteralString) { - if ($printed_string) { - continue; - } - - $types[] = 'string'; - $printed_string = true; - } elseif ($type instanceof TLiteralInt) { - if ($printed_int) { - continue; - } - - $types[] = 'int'; - $printed_int = true; - } else { - $types[] = $type->getKey(); - } - } - - sort($types); - return implode('|', $types); - } - - public function getId(): string - { - if ($this->id) { - return $this->id; - } - - $types = []; - foreach ($this->types as $type) { - $types[] = $type->getId(); - } - sort($types); - - if (count($types) > 1) { - foreach ($types as $i => $type) { - if (strpos($type, ' as ') && strpos($type, '(') === false) { - $types[$i] = '(' . $type . ')'; - } - } - } - - $id = implode('|', $types); - - $this->id = $id; - - return $id; - } - - public function getAssertionString(bool $exact = false): string - { - $assertions = []; - foreach ($this->types as $type) { - $assertions[] = $type->getAssertionString($exact); - } - - $assertions = array_unique($assertions); - if (count($assertions) !== 1) { - throw new UnexpectedValueException('Should only be one type per assertion'); - } - - return reset($assertions); - } - - /** - * @param array $aliased_classes - * - */ - public function toNamespacedString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - bool $use_phpdoc_format - ): string { - $other_types = []; - - $literal_ints = []; - $literal_strings = []; - - $has_non_literal_int = false; - $has_non_literal_string = false; - - foreach ($this->types as $type) { - $type_string = $type->toNamespacedString($namespace, $aliased_classes, $this_class, $use_phpdoc_format); - if ($type instanceof TLiteralInt) { - $literal_ints[] = $type_string; - } elseif ($type instanceof TLiteralString) { - $literal_strings[] = $type_string; - } else { - if (get_class($type) === TString::class) { - $has_non_literal_string = true; - } elseif (get_class($type) === TInt::class) { - $has_non_literal_int = true; - } - $other_types[] = $type_string; - } - } - - if (count($literal_ints) <= 3 && !$has_non_literal_int) { - $other_types = array_merge($other_types, $literal_ints); - } else { - $other_types[] = 'int'; - } - - if (count($literal_strings) <= 3 && !$has_non_literal_string) { - $other_types = array_merge($other_types, $literal_strings); - } else { - $other_types[] = 'string'; - } - - sort($other_types); - return implode('|', array_unique($other_types)); - } - - /** - * @param array $aliased_classes - */ - public function toPhpString( - ?string $namespace, - array $aliased_classes, - ?string $this_class, - int $php_major_version, - int $php_minor_version - ): ?string { - if (!$this->isSingleAndMaybeNullable()) { - if ($php_major_version < 8) { - return null; - } - } elseif ($php_major_version < 7 - || (isset($this->types['null']) && $php_major_version === 7 && $php_minor_version < 1) - ) { - return null; - } - - $types = $this->types; - - $nullable = false; - - if (isset($types['null']) && count($types) > 1) { - unset($types['null']); - - $nullable = true; - } - - $falsable = false; - - if (isset($types['false']) && count($types) > 1) { - unset($types['false']); - - $falsable = true; - } - - $php_types = []; - - foreach ($types as $atomic_type) { - $php_type = $atomic_type->toPhpString( - $namespace, - $aliased_classes, - $this_class, - $php_major_version, - $php_minor_version - ); - - if (!$php_type) { - return null; - } - - $php_types[] = $php_type; - } - - if ($falsable) { - if ($nullable) { - $php_types['null'] = 'null'; - } - $php_types['false'] = 'false'; - ksort($php_types); - return implode('|', array_unique($php_types)); - } - - if ($php_major_version < 8) { - return ($nullable ? '?' : '') . implode('|', array_unique($php_types)); - } - if ($nullable) { - $php_types['null'] = 'null'; - } - return implode('|', array_unique($php_types)); - } - - public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool - { - if (!$this->isSingleAndMaybeNullable() && $php_major_version < 8) { - return false; - } - - $types = $this->types; - - if (isset($types['null'])) { - if (count($types) > 1) { - unset($types['null']); - } else { - return false; - } - } - - return !array_filter( - $types, - function ($atomic_type) use ($php_major_version, $php_minor_version) { - return !$atomic_type->canBeFullyExpressedInPhp($php_major_version, $php_minor_version); - } - ); - } - - public function removeType(string $type_string): bool - { - if (isset($this->types[$type_string])) { - unset($this->types[$type_string]); - - if (strpos($type_string, '(')) { - unset( - $this->literal_string_types[$type_string], - $this->literal_int_types[$type_string], - $this->literal_float_types[$type_string] - ); - } - - $this->id = null; - - return true; - } - - if ($type_string === 'string') { - if ($this->literal_string_types) { - foreach ($this->literal_string_types as $literal_key => $_) { - unset($this->types[$literal_key]); - } - $this->literal_string_types = []; - } - - if ($this->typed_class_strings) { - foreach ($this->typed_class_strings as $typed_class_key => $_) { - unset($this->types[$typed_class_key]); - } - $this->typed_class_strings = []; - } - - unset($this->types['class-string'], $this->types['trait-string']); - } elseif ($type_string === 'int' && $this->literal_int_types) { - foreach ($this->literal_int_types as $literal_key => $_) { - unset($this->types[$literal_key]); - } - $this->literal_int_types = []; - } elseif ($type_string === 'float' && $this->literal_float_types) { - foreach ($this->literal_float_types as $literal_key => $_) { - unset($this->types[$literal_key]); - } - $this->literal_float_types = []; - } - - return false; - } - - public function bustCache(): void - { - $this->id = null; - } - - public function hasType(string $type_string): bool - { - return isset($this->types[$type_string]); - } - - public function hasArray(): bool - { - return isset($this->types['array']); - } - - public function hasIterable(): bool - { - return isset($this->types['iterable']); - } - - public function hasList(): bool - { - return isset($this->types['array']) && $this->types['array'] instanceof TList; - } - - public function hasClassStringMap(): bool - { - return isset($this->types['array']) && $this->types['array'] instanceof TClassStringMap; - } - - public function isTemplatedClassString(): bool - { - return $this->isSingle() - && count( - array_filter( - $this->types, - function ($type): bool { - return $type instanceof TTemplateParamClass; - } - ) - ) === 1; - } - - public function hasArrayAccessInterface(Codebase $codebase): bool - { - return (bool)array_filter( - $this->types, - function ($type) use ($codebase) { - return $type->hasArrayAccessInterface($codebase); - } - ); - } - - public function hasCallableType(): bool - { - return $this->getCallableTypes() || $this->getClosureTypes(); - } - - /** - * @return array - */ - public function getCallableTypes(): array - { - return array_filter( - $this->types, - function ($type): bool { - return $type instanceof TCallable; - } - ); - } - - /** - * @return array - */ - public function getClosureTypes(): array - { - return array_filter( - $this->types, - function ($type): bool { - return $type instanceof TClosure; - } - ); - } - - public function hasObject(): bool - { - return isset($this->types['object']); - } - - public function hasObjectType(): bool - { - foreach ($this->types as $type) { - if ($type->isObjectType()) { - return true; - } - } - - return false; - } - - public function isObjectType(): bool - { - foreach ($this->types as $type) { - if (!$type->isObjectType()) { - return false; - } - } - - return true; - } - - public function hasNamedObjectType(): bool - { - foreach ($this->types as $type) { - if ($type->isNamedObjectType()) { - return true; - } - } - - return false; - } - - public function isFormerStaticObject(): bool - { - foreach ($this->types as $type) { - if (!$type instanceof TNamedObject - || !$type->was_static - ) { - return false; - } - } - - return true; - } - - public function hasFormerStaticObject(): bool - { - foreach ($this->types as $type) { - if ($type instanceof TNamedObject - && $type->was_static - ) { - return true; - } - } - - return false; - } - - public function isNullable(): bool - { - if (isset($this->types['null'])) { - return true; - } - - foreach ($this->types as $type) { - if ($type instanceof TTemplateParam && $type->as->isNullable()) { - return true; - } - } - - return false; - } - - public function isFalsable(): bool - { - if (isset($this->types['false'])) { - return true; - } - - foreach ($this->types as $type) { - if ($type instanceof TTemplateParam && $type->as->isFalsable()) { - return true; - } - } - - return false; - } - - public function hasBool(): bool - { - return isset($this->types['bool']) || isset($this->types['false']) || isset($this->types['true']); - } - - public function hasString(): bool - { - return isset($this->types['string']) - || isset($this->types['class-string']) - || isset($this->types['trait-string']) - || isset($this->types['numeric-string']) - || isset($this->types['callable-string']) - || isset($this->types['array-key']) - || $this->literal_string_types - || $this->typed_class_strings; - } - - public function hasLowercaseString(): bool - { - return isset($this->types['string']) - && ($this->types['string'] instanceof TLowercaseString - || $this->types['string'] instanceof TNonEmptyLowercaseString); - } - - public function hasLiteralClassString(): bool - { - return count($this->typed_class_strings) > 0; - } - - public function hasInt(): bool - { - return isset($this->types['int']) || isset($this->types['array-key']) || $this->literal_int_types - || array_filter($this->types, function (Atomic $type) { - return $type instanceof TIntRange; - }); - } - - public function hasPositiveInt(): bool - { - return isset($this->types['int']) && $this->types['int'] instanceof TPositiveInt; - } - - public function hasArrayKey(): bool - { - return isset($this->types['array-key']); - } - - public function hasFloat(): bool - { - return isset($this->types['float']) || $this->literal_float_types; - } - - public function hasScalar(): bool - { - return isset($this->types['scalar']); - } - - public function hasNumeric(): bool - { - return isset($this->types['numeric']); - } - - public function hasScalarType(): bool - { - return isset($this->types['int']) - || isset($this->types['float']) - || isset($this->types['string']) - || isset($this->types['class-string']) - || isset($this->types['trait-string']) - || isset($this->types['bool']) - || isset($this->types['false']) - || isset($this->types['true']) - || isset($this->types['numeric']) - || isset($this->types['numeric-string']) - || $this->literal_int_types - || $this->literal_float_types - || $this->literal_string_types - || $this->typed_class_strings; - } - - public function hasTemplate(): bool - { - return (bool) array_filter( - $this->types, - function (Atomic $type): bool { - return $type instanceof TTemplateParam - || ($type instanceof TNamedObject - && $type->extra_types - && array_filter( - $type->extra_types, - function ($t): bool { - return $t instanceof TTemplateParam; - } - ) - ); - } - ); - } - - public function hasConditional(): bool - { - return (bool) array_filter( - $this->types, - function (Atomic $type): bool { - return $type instanceof TConditional; - } - ); - } - - public function hasTemplateOrStatic(): bool - { - return (bool) array_filter( - $this->types, - function (Atomic $type): bool { - return $type instanceof TTemplateParam - || ($type instanceof TNamedObject - && ($type->was_static - || ($type->extra_types - && array_filter( - $type->extra_types, - function ($t): bool { - return $t instanceof TTemplateParam; - } - ) - ) - ) - ); - } - ); - } - - public function hasMixed(): bool - { - return isset($this->types['mixed']); - } - - public function isMixed(): bool - { - return isset($this->types['mixed']) && count($this->types) === 1; - } - - public function isEmptyMixed(): bool - { - return isset($this->types['mixed']) - && $this->types['mixed'] instanceof TEmptyMixed - && count($this->types) === 1; - } - - public function isVanillaMixed(): bool - { - return isset($this->types['mixed']) - && get_class($this->types['mixed']) === TMixed::class - && !$this->types['mixed']->from_loop_isset - && count($this->types) === 1; - } - - public function isArrayKey(): bool - { - return isset($this->types['array-key']) && count($this->types) === 1; - } - - public function isNull(): bool - { - return count($this->types) === 1 && isset($this->types['null']); - } - - public function isFalse(): bool - { - return count($this->types) === 1 && isset($this->types['false']); - } - - public function isAlwaysFalsy(): bool - { - foreach ($this->getAtomicTypes() as $atomic_type) { - if (!$atomic_type->isFalsy()) { - return false; - } - } - - return true; - } - - public function isTrue(): bool - { - return count($this->types) === 1 && isset($this->types['true']); - } - - public function isAlwaysTruthy(): bool - { - if ($this->possibly_undefined || $this->possibly_undefined_from_try) { - return false; - } - - foreach ($this->getAtomicTypes() as $atomic_type) { - if (!$atomic_type->isTruthy()) { - return false; - } - } - - return true; - } - - public function isVoid(): bool - { - return isset($this->types['void']) && count($this->types) === 1; - } - - public function isNever(): bool - { - return isset($this->types['never']) && count($this->types) === 1; - } - - public function isGenerator(): bool - { - return count($this->types) === 1 - && (($single_type = reset($this->types)) instanceof TNamedObject) - && ($single_type->value === 'Generator'); - } - - public function isEmpty(): bool - { - return isset($this->types['empty']) && count($this->types) === 1; - } - - public function substitute(Union $old_type, ?Union $new_type = null): void - { - if ($this->hasMixed() && !$this->isEmptyMixed()) { - return; - } - - if ($new_type && $new_type->ignore_nullable_issues) { - $this->ignore_nullable_issues = true; - } - - if ($new_type && $new_type->ignore_falsable_issues) { - $this->ignore_falsable_issues = true; - } - - foreach ($old_type->types as $old_type_part) { - if (!$this->removeType($old_type_part->getKey())) { - if ($old_type_part instanceof TFalse - && isset($this->types['bool']) - && !isset($this->types['true']) - ) { - $this->removeType('bool'); - $this->types['true'] = new TTrue; - } elseif ($old_type_part instanceof TTrue - && isset($this->types['bool']) - && !isset($this->types['false']) - ) { - $this->removeType('bool'); - $this->types['false'] = new TFalse; - } elseif (isset($this->types['iterable'])) { - if ($old_type_part instanceof TNamedObject - && $old_type_part->value === 'Traversable' - && !isset($this->types['array']) - ) { - $this->removeType('iterable'); - $this->types['array'] = new TArray([Type::getArrayKey(), Type::getMixed()]); - } - - if ($old_type_part instanceof TArray - && !isset($this->types['traversable']) - ) { - $this->removeType('iterable'); - $this->types['traversable'] = new TNamedObject('Traversable'); - } - } elseif (isset($this->types['array-key'])) { - if ($old_type_part instanceof TString - && !isset($this->types['int']) - ) { - $this->removeType('array-key'); - $this->types['int'] = new TInt(); - } - - if ($old_type_part instanceof TInt - && !isset($this->types['string']) - ) { - $this->removeType('array-key'); - $this->types['string'] = new TString(); - } - } - } - } - - if ($new_type) { - foreach ($new_type->types as $key => $new_type_part) { - if (!isset($this->types[$key]) - || ($new_type_part instanceof Scalar - && get_class($new_type_part) === get_class($this->types[$key])) - ) { - $this->types[$key] = $new_type_part; - } else { - $this->types[$key] = TypeCombiner::combine([$new_type_part, $this->types[$key]])->getSingleAtomic(); - } - } - } elseif (count($this->types) === 0) { - $this->types['mixed'] = new TMixed(); - } - - $this->id = null; - } - - public function isSingle(): bool - { - $type_count = count($this->types); - - $int_literal_count = count($this->literal_int_types); - $string_literal_count = count($this->literal_string_types); - $float_literal_count = count($this->literal_float_types); - - if (($int_literal_count && $string_literal_count) - || ($int_literal_count && $float_literal_count) - || ($string_literal_count && $float_literal_count) - ) { - return false; - } - - if ($int_literal_count || $string_literal_count || $float_literal_count) { - $type_count -= $int_literal_count + $string_literal_count + $float_literal_count - 1; - } - - return $type_count === 1; - } - - public function isSingleAndMaybeNullable(): bool - { - $is_nullable = isset($this->types['null']); - - $type_count = count($this->types); - - if ($type_count === 1 && $is_nullable) { - return false; - } - - $int_literal_count = count($this->literal_int_types); - $string_literal_count = count($this->literal_string_types); - $float_literal_count = count($this->literal_float_types); - - if (($int_literal_count && $string_literal_count) - || ($int_literal_count && $float_literal_count) - || ($string_literal_count && $float_literal_count) - ) { - return false; - } - - if ($int_literal_count || $string_literal_count || $float_literal_count) { - $type_count -= $int_literal_count + $string_literal_count + $float_literal_count - 1; - } - - return ($type_count - (int) $is_nullable) === 1; - } - - /** - * @return bool true if this is an int - */ - public function isInt(bool $check_templates = false): bool - { - return count( - array_filter( - $this->types, - function ($type) use ($check_templates): bool { - return $type instanceof TInt - || ($check_templates - && $type instanceof TTemplateParam - && $type->as->isInt() - ); - } - ) - ) === count($this->types); - } - - /** - * @return bool true if this is a float - */ - public function isFloat(): bool - { - if (!$this->isSingle()) { - return false; - } - - return isset($this->types['float']) || $this->literal_float_types; - } - - /** - * @return bool true if this is a string - */ - public function isString(bool $check_templates = false): bool - { - return count( - array_filter( - $this->types, - function ($type) use ($check_templates): bool { - return $type instanceof TString - || ($check_templates - && $type instanceof TTemplateParam - && $type->as->isString() - ); - } - ) - ) === count($this->types); - } - - /** - * @return bool true if this is a boolean - */ - public function isBool(): bool - { - if (!$this->isSingle()) { - return false; - } - - return isset($this->types['bool']); - } - - /** - * @return bool true if this is an array - */ - public function isArray(): bool - { - if (!$this->isSingle()) { - return false; - } - - return isset($this->types['array']); - } - - /** - * @return bool true if this is a string literal with only one possible value - */ - public function isSingleStringLiteral(): bool - { - return count($this->types) === 1 && count($this->literal_string_types) === 1; - } - - /** - * @throws InvalidArgumentException if isSingleStringLiteral is false - * - * @return TLiteralString the only string literal represented by this union type - */ - public function getSingleStringLiteral(): TLiteralString - { - if (count($this->types) !== 1 || count($this->literal_string_types) !== 1) { - throw new InvalidArgumentException('Not a string literal'); - } - - return reset($this->literal_string_types); - } - - public function allStringLiterals(): bool - { - foreach ($this->types as $atomic_key_type) { - if (!$atomic_key_type instanceof TLiteralString) { - return false; - } - } - - return true; - } - - public function allIntLiterals(): bool - { - foreach ($this->types as $atomic_key_type) { - if (!$atomic_key_type instanceof TLiteralInt) { - return false; - } - } - - return true; - } - - /** - * @psalm-assert-if-true array< - * array-key, - * TLiteralString|TLiteralInt|TLiteralFloat|TFalse|TTrue - * > $this->getAtomicTypes() - */ - public function allSpecificLiterals(): bool - { - foreach ($this->types as $atomic_key_type) { - if (!$atomic_key_type instanceof TLiteralString - && !$atomic_key_type instanceof TLiteralInt - && !$atomic_key_type instanceof TLiteralFloat - && !$atomic_key_type instanceof TFalse - && !$atomic_key_type instanceof TTrue - ) { - return false; - } - } - - return true; - } - - /** - * @psalm-assert-if-true array< - * array-key, - * TLiteralString|TLiteralInt|TLiteralFloat|TNonspecificLiteralString|TNonSpecificLiteralInt|TFalse|TTrue - * > $this->getAtomicTypes() - */ - public function allLiterals(): bool - { - foreach ($this->types as $atomic_key_type) { - if (!$atomic_key_type instanceof TLiteralString - && !$atomic_key_type instanceof TLiteralInt - && !$atomic_key_type instanceof TLiteralFloat - && !$atomic_key_type instanceof TNonspecificLiteralString - && !$atomic_key_type instanceof TNonspecificLiteralInt - && !$atomic_key_type instanceof TFalse - && !$atomic_key_type instanceof TTrue - ) { - return false; - } - } - - return true; - } - - public function hasLiteralValue(): bool - { - return $this->literal_int_types - || $this->literal_string_types - || $this->literal_float_types - || isset($this->types['false']) - || isset($this->types['true']); - } - - public function isSingleLiteral(): bool - { - return count($this->types) === 1 - && count($this->literal_int_types) - + count($this->literal_string_types) - + count($this->literal_float_types) === 1 - ; - } - - /** - * @return TLiteralInt|TLiteralString|TLiteralFloat - */ - public function getSingleLiteral() - { - if (!$this->isSingleLiteral()) { - throw new InvalidArgumentException("Not a single literal"); - } - - return ($literal = reset($this->literal_int_types)) !== false - ? $literal - : (($literal = reset($this->literal_string_types)) !== false - ? $literal - : reset($this->literal_float_types)) - ; - } - - public function hasLiteralString(): bool - { - return count($this->literal_string_types) > 0; - } - - public function hasLiteralInt(): bool - { - return count($this->literal_int_types) > 0; - } - - /** - * @return bool true if this is a int literal with only one possible value - */ - public function isSingleIntLiteral(): bool - { - return count($this->types) === 1 && count($this->literal_int_types) === 1; - } - - /** - * @throws InvalidArgumentException if isSingleIntLiteral is false - * - * @return TLiteralInt the only int literal represented by this union type - */ - public function getSingleIntLiteral(): TLiteralInt - { - if (count($this->types) !== 1 || count($this->literal_int_types) !== 1) { - throw new InvalidArgumentException('Not an int literal'); - } - - return reset($this->literal_int_types); - } - - /** - * @param array $suppressed_issues - * @param array $phantom_classes - * - */ - public function check( - StatementsSource $source, - CodeLocation $code_location, - array $suppressed_issues, - array $phantom_classes = [], - bool $inferred = true, - bool $inherited = false, - bool $prevent_template_covariance = false, - ?string $calling_method_id = null - ): bool { - if ($this->checked) { - return true; - } - - $checker = new TypeChecker( - $source, - $code_location, - $suppressed_issues, - $phantom_classes, - $inferred, - $inherited, - $prevent_template_covariance, - $calling_method_id - ); - - $checker->traverseArray($this->types); - - $this->checked = true; - - return !$checker->hasErrors(); - } - - /** - * @param array $phantom_classes - * - */ - public function queueClassLikesForScanning( - Codebase $codebase, - ?FileStorage $file_storage = null, - array $phantom_classes = [] - ): void { - $scanner_visitor = new TypeScanner( - $codebase->scanner, - $file_storage, - $phantom_classes - ); - - $scanner_visitor->traverseArray($this->types); - } - - /** - * @param lowercase-string $fq_class_like_name - */ - public function containsClassLike(string $fq_class_like_name): bool - { - $classlike_visitor = new ContainsClassLikeVisitor($fq_class_like_name); - - $classlike_visitor->traverseArray($this->types); - - return $classlike_visitor->matches(); - } - - public function containsAnyLiteral(): bool - { - $literal_visitor = new ContainsLiteralVisitor(); - - $literal_visitor->traverseArray($this->types); - - return $literal_visitor->matches(); - } - - /** - * @return list - */ - public function getTemplateTypes(): array - { - $template_type_collector = new TemplateTypeCollector(); - - $template_type_collector->traverseArray($this->types); - - return $template_type_collector->getTemplateTypes(); - } - - public function setFromDocblock(): void - { - $this->from_docblock = true; - - (new FromDocblockSetter())->traverseArray($this->types); - } - - public function replaceClassLike(string $old, string $new): void - { - foreach ($this->types as $key => $atomic_type) { - $atomic_type->replaceClassLike($old, $new); - - $this->removeType($key); - $this->addType($atomic_type); - } - } - - public function equals(Union $other_type, bool $ensure_source_equality = true): bool - { - if ($other_type === $this) { - return true; - } - - if ($other_type->id && $this->id && $other_type->id !== $this->id) { - return false; - } - - if ($this->possibly_undefined !== $other_type->possibly_undefined) { - return false; - } - - if ($this->had_template !== $other_type->had_template) { - return false; - } - - if ($this->possibly_undefined_from_try !== $other_type->possibly_undefined_from_try) { - return false; - } - - if ($this->from_calculation !== $other_type->from_calculation) { - return false; - } - - if ($this->initialized !== $other_type->initialized) { - return false; - } - - if ($ensure_source_equality && $this->from_docblock !== $other_type->from_docblock) { - return false; - } - - if (count($this->types) !== count($other_type->types)) { - return false; - } - - if ($this->parent_nodes !== $other_type->parent_nodes) { - return false; - } - - if ($this->different || $other_type->different) { - return false; - } - - $other_atomic_types = $other_type->types; - - foreach ($this->types as $key => $atomic_type) { - if (!isset($other_atomic_types[$key])) { - return false; - } - - if (!$atomic_type->equals($other_atomic_types[$key], $ensure_source_equality)) { - return false; - } - } - - return true; - } - - /** - * @return array - */ - public function getLiteralStrings(): array - { - return $this->literal_string_types; - } - - /** - * @return array - */ - public function getLiteralInts(): array - { - return $this->literal_int_types; - } - - /** - * @return array - */ - public function getRangeInts(): array - { - $ranges = []; - foreach ($this->getAtomicTypes() as $atomic) { - if ($atomic instanceof TIntRange) { - $ranges[$atomic->getKey()] = $atomic; - } - } - - return $ranges; - } - - /** - * @return array - */ - public function getLiteralFloats(): array - { - return $this->literal_float_types; - } - - /** - * @return array - */ - public function getChildNodes(): array - { - return $this->types; - } - - /** - * @return bool true if this is a float literal with only one possible value - */ - public function isSingleFloatLiteral(): bool - { - return count($this->types) === 1 && count($this->literal_float_types) === 1; - } - - /** - * @throws InvalidArgumentException if isSingleFloatLiteral is false - * - * @return TLiteralFloat the only float literal represented by this union type - */ - public function getSingleFloatLiteral(): TLiteralFloat - { - if (count($this->types) !== 1 || count($this->literal_float_types) !== 1) { - throw new InvalidArgumentException('Not a float literal'); - } - - return reset($this->literal_float_types); - } - - public function hasLiteralFloat(): bool - { - return count($this->literal_float_types) > 0; - } - - public function getSingleAtomic(): Atomic - { - return reset($this->types); - } - - public function isUnionEmpty(): bool - { - return $this->types === []; - } -} diff --git a/vendor/vimeo/psalm/src/command_functions.php b/vendor/vimeo/psalm/src/command_functions.php deleted file mode 100644 index 4a797d8a..00000000 --- a/vendor/vimeo/psalm/src/command_functions.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @deprecated going to be removed in Psalm 5 - */ -function getArguments(): array -{ - return CliUtils::getArguments(); -} - -/** - * @param string|array|null|false $f_paths - * - * @return list|null - * @deprecated going to be removed in Psalm 5 - */ -function getPathsToCheck($f_paths): ?array -{ - return CliUtils::getPathsToCheck($f_paths); -} - -/** - * @psalm-pure - * @deprecated going to be removed in Psalm 5 - */ -function getPsalmHelpText(): string -{ - return CliUtils::getPsalmHelpText(); -} - -/** @deprecated going to be removed in Psalm 5 */ -function initialiseConfig( - ?string $path_to_config, - string $current_dir, - string $output_format, - ?ClassLoader $first_autoloader, - bool $create_if_non_existent = false -): Config { - return CliUtils::initializeConfig( - $path_to_config, - $current_dir, - $output_format, - $first_autoloader, - $create_if_non_existent - ); -} - -/** @deprecated going to be removed in Psalm 5 */ -function update_config_file(Config $config, string $config_file_path, string $baseline_path): void -{ - CliUtils::updateConfigFile($config, $config_file_path, $baseline_path); -} - -/** @deprecated going to be removed in Psalm 5 */ -function get_path_to_config(array $options): ?string -{ - return CliUtils::getPathToConfig($options); -} - -/** - * @psalm-pure - * @deprecated going to be removed in Psalm 5 - */ -function getMemoryLimitInBytes(): int -{ - return CliUtils::getMemoryLimitInBytes(); -} diff --git a/vendor/vimeo/psalm/src/functions.php b/vendor/vimeo/psalm/src/functions.php deleted file mode 100644 index a44e53cc..00000000 --- a/vendor/vimeo/psalm/src/functions.php +++ /dev/null @@ -1,13 +0,0 @@ -isUserDefined()) { - /** - * See https://github.com/runkit7/runkit_object_id for a faster native version for php <= 7.1 - * - * @param object $object - * @return int The object id - */ - function spl_object_id($object): int - { - return runkit_object_id($object); - } - } elseif (PHP_INT_SIZE === 8) { - /** - * See https://github.com/runkit7/runkit_object_id for a faster native version for php <= 7.1 - * - * @param object $object - * @return int (The object id, XORed with a random number) - */ - function spl_object_id($object): int - { - $hash = spl_object_hash($object); - // Fit this into a php long (32-bit or 64-bit signed int). - // The first 16 hex digits (64 bytes) vary, the last 16 don't. - // Values are usually padded with 0s at the front. - return intval(substr($hash, 1, 15), 16); - } - } else { - /** - * See https://github.com/runkit7/runkit_object_id for a faster native version for php <= 7.1 - * - * @param object $object - * @return int (The object id, XORed with a random number) - */ - function spl_object_id($object): int - { - $hash = spl_object_hash($object); - // Fit this into a php long (32-bit or 64-bit signed int). - // The first 16 hex digits (64 bytes) vary, the last 16 don't. - // Values are usually padded with 0s at the front. - return intval(substr($hash, 9, 7), 16); - } - } -} diff --git a/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub b/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub deleted file mode 100644 index 0dae5ef3..00000000 --- a/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub +++ /dev/null @@ -1,503 +0,0 @@ - - */ -class Generator implements Traversable { - /** - * @psalm-ignore-nullable-return - * @return ?TValue Can return any type. - */ - public function current() {} - - /** - * @return void Any returned value is ignored. - */ - public function next() {} - - /** - * @return TKey scalar on success, or null on failure. - */ - public function key() {} - - /** - * @return bool The return value will be casted to boolean and then evaluated. - */ - public function valid() {} - - /** - * @return void Any returned value is ignored. - */ - public function rewind() {} - - /** - * @return TReturn Can return any type. - */ - public function getReturn() {} - - /** - * @param TSend $value - * @psalm-ignore-nullable-return - * @return ?TValue Can return any type. - */ - public function send($value) {} - - /** - * @psalm-ignore-nullable-return - * @return ?TValue Can return any type. - */ - public function throw(Throwable $exception) {} -} - -/** - * Interface to provide accessing objects as arrays. - * @link http://php.net/manual/en/class.arrayaccess.php - * - * @template TKey - * @template TValue - */ -interface ArrayAccess { - - /** - * Whether a offset exists - * @link http://php.net/manual/en/arrayaccess.offsetexists.php - * - * @param TKey $offset An offset to check for. - * @return bool true on success or false on failure. - * The return value will be casted to boolean if non-boolean was returned. - * - * @since 5.0.0 - */ - public function offsetExists($offset); - - /** - * Offset to retrieve - * @link http://php.net/manual/en/arrayaccess.offsetget.php - * - * @param TKey $offset The offset to retrieve. - * @return TValue|null Can return all value types. - * @psalm-ignore-nullable-return - * - * @since 5.0.0 - */ - public function offsetGet($offset); - - /** - * Offset to set - * @link http://php.net/manual/en/arrayaccess.offsetset.php - * - * @param TKey|null $offset The offset to assign the value to. - * @param TValue $value The value to set. - * @return void - * - * @since 5.0.0 - */ - public function offsetSet($offset, $value); - - /** - * Offset to unset - * @link http://php.net/manual/en/arrayaccess.offsetunset.php - * - * @param TKey $offset The offset to unset. - * @return void - * - * @since 5.0.0 - */ - public function offsetUnset($offset); -} - -/** - * This class allows objects to work as arrays. - * @link http://php.net/manual/en/class.arrayobject.php - * - * @template TKey - * @template TValue - * @template-implements IteratorAggregate - * @template-implements ArrayAccess - */ -class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable { - /** - * Properties of the object have their normal functionality when accessed as list (var_dump, foreach, etc.). - */ - const STD_PROP_LIST = 1; - - /** - * Entries can be accessed as properties (read and write). - */ - const ARRAY_AS_PROPS = 2; - - /** - * Construct a new array object - * @link http://php.net/manual/en/arrayobject.construct.php - * - * @param array|object $input The input parameter accepts an array or an Object. - * @param int $flags Flags to control the behaviour of the ArrayObject object. - * @param string $iterator_class Specify the class that will be used for iteration of the ArrayObject object. ArrayIterator is the default class used. - * @psalm-param class-string>|class-string> $iterator_class - * - * @since 5.0.0 - */ - public function __construct($input = null, $flags = 0, $iterator_class = "ArrayIterator") { } - - /** - * Returns whether the requested index exists - * @link http://php.net/manual/en/arrayobject.offsetexists.php - * - * @param TKey $index The index being checked. - * @return bool true if the requested index exists, otherwise false - * - * @since 5.0.0 - */ - public function offsetExists($index) { } - - /** - * Returns the value at the specified index - * @link http://php.net/manual/en/arrayobject.offsetget.php - * - * @param TKey $index The index with the value. - * @return TValue The value at the specified index or false. - * - * @since 5.0.0 - */ - public function offsetGet($index) { } - - /** - * Sets the value at the specified index to newval - * @link http://php.net/manual/en/arrayobject.offsetset.php - * - * @param TKey $index The index being set. - * @param TValue $newval The new value for the index. - * @return void - * - * @since 5.0.0 - */ - public function offsetSet($index, $newval) { } - - /** - * Unsets the value at the specified index - * @link http://php.net/manual/en/arrayobject.offsetunset.php - * - * @param TKey $index The index being unset. - * @return void - * - * @since 5.0.0 - */ - public function offsetUnset($index) { } - - /** - * Appends the value - * @link http://php.net/manual/en/arrayobject.append.php - * - * @param TValue $value The value being appended. - * @return void - * - * @since 5.0.0 - */ - public function append($value) { } - - /** - * Creates a copy of the ArrayObject. - * @link http://php.net/manual/en/arrayobject.getarraycopy.php - * - * @return array a copy of the array. When the ArrayObject refers to an object - * an array of the public properties of that object will be returned. - * - * @since 5.0.0 - */ - public function getArrayCopy() { } - - /** - * Get the number of public properties in the ArrayObject - * When the ArrayObject is constructed from an array all properties are public. - * @link http://php.net/manual/en/arrayobject.count.php - * - * @return int The number of public properties in the ArrayObject. - * - * @since 5.0.0 - */ - public function count() { } - - /** - * Gets the behavior flags. - * @link http://php.net/manual/en/arrayobject.getflags.php - * - * @return int the behavior flags of the ArrayObject. - * - * @since 5.1.0 - */ - public function getFlags() { } - - /** - * Sets the behavior flags. - * - * It takes on either a bitmask, or named constants. Using named - * constants is strongly encouraged to ensure compatibility for future - * versions. - * - * The available behavior flags are listed below. The actual - * meanings of these flags are described in the - * predefined constants. - * - * - * ArrayObject behavior flags - * - * - * - * - * - * - * - * - * - * - * - * - *
valueconstant
1 - * ArrayObject::STD_PROP_LIST - *
2 - * ArrayObject::ARRAY_AS_PROPS - *
- * - * @link http://php.net/manual/en/arrayobject.setflags.php - * - * @param int $flags The new ArrayObject behavior. - * @return void - * - * @since 5.1.0 - */ - public function setFlags($flags) { } - - /** - * Sort the entries by value - * @link http://php.net/manual/en/arrayobject.asort.php - * - * @return void - * - * @since 5.2.0 - */ - public function asort() { } - - /** - * Sort the entries by key - * @link http://php.net/manual/en/arrayobject.ksort.php - * - * @return void - * - * @since 5.2.0 - */ - public function ksort() { } - - /** - * Sort the entries with a user-defined comparison function and maintain key association - * @link http://php.net/manual/en/arrayobject.uasort.php - * - * Function cmp_function should accept two - * parameters which will be filled by pairs of entries. - * The comparison function must return an integer less than, equal - * to, or greater than zero if the first argument is considered to - * be respectively less than, equal to, or greater than the - * second. - * - * @param callable(TValue, TValue):int $cmp_function - * @return void - * - * @since 5.2.0 - */ - public function uasort($cmp_function) { } - - /** - * Sort the entries by keys using a user-defined comparison function - * @link http://php.net/manual/en/arrayobject.uksort.php - * - * Function cmp_function should accept two - * parameters which will be filled by pairs of entry keys. - * The comparison function must return an integer less than, equal - * to, or greater than zero if the first argument is considered to - * be respectively less than, equal to, or greater than the - * second. - * - * @param callable(TKey, TKey):int $cmp_function The callable comparison function. - * @return void - * - * @since 5.2.0 - */ - public function uksort($cmp_function) { } - - /** - * Sort entries using a "natural order" algorithm - * @link http://php.net/manual/en/arrayobject.natsort.php - * - * @return void - * - * @since 5.2.0 - */ - public function natsort() { } - - /** - * Sort an array using a case insensitive "natural order" algorithm - * @link http://php.net/manual/en/arrayobject.natcasesort.php - * - * @return void - * - * @since 5.2.0 - */ - public function natcasesort() { } - - /** - * Unserialize an ArrayObject - * @link http://php.net/manual/en/arrayobject.unserialize.php - * - * @param string $serialized The serialized ArrayObject - * @return void The unserialized ArrayObject - * - * @since 5.3.0 - */ - public function unserialize($serialized) { } - - /** - * Serialize an ArrayObject - * @link http://php.net/manual/en/arrayobject.serialize.php - * - * @return string The serialized representation of the ArrayObject. - * - * @since 5.3.0 - */ - public function serialize() { } - - /** - * Create a new iterator from an ArrayObject instance - * @link http://php.net/manual/en/arrayobject.getiterator.php - * - * @return ArrayIterator An iterator from an ArrayObject. - * - * @since 5.0.0 - */ - public function getIterator() { } - - /** - * Exchange the array for another one. - * @link http://php.net/manual/en/arrayobject.exchangearray.php - * - * @param mixed $input The new array or object to exchange with the current array. - * @return array the old array. - * - * @since 5.1.0 - */ - public function exchangeArray($input) { } - - /** - * Sets the iterator classname for the ArrayObject. - * @link http://php.net/manual/en/arrayobject.setiteratorclass.php - * - * @param string $iterator_class The classname of the array iterator to use when iterating over this object. - * @psalm-param class-string>|class-string> $iterator_class - * @return void - * - * @since 5.1.0 - */ - public function setIteratorClass($iterator_class) { } - - /** - * Gets the iterator classname for the ArrayObject. - * @link http://php.net/manual/en/arrayobject.getiteratorclass.php - * - * @return string the iterator class name that is used to iterate over this object. - * @psalm-return class-string>|class-string> - * - * @since 5.1.0 - */ - public function getIteratorClass() { } -} - -interface Serializable { - /** - * @return null|string - */ - public function serialize(); - - /** - * @param string $data - * @return void - */ - public function unserialize($data); -} - -/** - * @template-covariant T as object - * @psalm-immutable - */ -final class WeakReference -{ - // always fail - public function __construct() {} - - /** - * @template TIn as object - * @param TIn $referent - * @return WeakReference - */ - public static function create(object $referent): WeakReference {} - - /** @return ?T */ - public function get(): ?object {} -} - -/** - * @template TKey of object - * @template TVal of mixed - * @implements ArrayAccess - * @implements IteratorAggregate - * @implements Traversable - * - * @since 8.0.0 - */ -final class WeakMap implements ArrayAccess, Countable, IteratorAggregate, Traversable -{ - /** - * @param TKey $offset - * @return bool - */ - public function offsetExists($offset) {} - - /** - * @param TKey $offset - * @return TVal|null - * @psalm-ignore-nullable-return - */ - public function offsetGet($offset) {} - - /** - * @param TKey $offset - * @param TVal $value - * @return void - */ - public function offsetSet($offset, $value) {} - - /** - * @param TKey $offset - * @return void - */ - public function offsetUnset($offset) {} -} - - -#[Attribute] -final class ReturnTypeWillChange -{ - public function __construct() {} -} diff --git a/vendor/vimeo/psalm/stubs/CoreGenericFunctions.phpstub b/vendor/vimeo/psalm/stubs/CoreGenericFunctions.phpstub deleted file mode 100644 index 54bd9d8f..00000000 --- a/vendor/vimeo/psalm/stubs/CoreGenericFunctions.phpstub +++ /dev/null @@ -1,1368 +0,0 @@ - - * - * @param TArray $array - * @param mixed $search_value - * @param bool $strict - * - * @return (TArray is non-empty-array ? non-empty-list : list) - * @psalm-pure - */ -function array_keys(array $array, $search_value = null, bool $strict = false) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TValue - * - * @param array $array - * @param array ...$arrays - * - * @return array - * @psalm-pure - */ -function array_intersect(array $array, array ...$arrays) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TValue - * - * @param array $array - * @param array ...$arrays - * - * @return array - * @psalm-pure - */ -function array_intersect_key(array $array, array ...$arrays) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TValue - * - * @param array $array - * @param array ...$arrays - * - * @return array - * @psalm-pure - */ -function array_intersect_assoc(array $array, array ...$arrays) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TValue - * - * @param array $keys - * @param array $values - * - * @return ( - * PHP_MAJOR_VERSION is 8 ? - * ($keys is non-empty-array ? non-empty-array : array) : - * ($keys is non-empty-array ? non-empty-array|false : array|false) - * ) - * @psalm-ignore-falsable-return - * @psalm-pure - */ -function array_combine(array $keys, array $values) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TValue - * - * @param array $array - * @param array ...$arrays - * - * @return array - * @psalm-pure - */ -function array_diff(array $array, array ...$arrays) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TValue - * - * @param array $array - * @param array ...$arrays - * - * @return array - * @psalm-pure - */ -function array_diff_key(array $array, array ...$arrays) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TValue - * - * @param array $array - * @param array ...$arrays - * - * @return array - * @psalm-pure - */ -function array_diff_assoc(array $array, array ...$arrays) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TValue - * - * @param array $array - * - * @return array - * @psalm-pure - */ -function array_flip(array $array) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TArray as array - * - * @param TArray $array - * - * @return (TArray is array ? null : TKey|null) - * @psalm-pure - * @psalm-ignore-nullable-return - */ -function key($array) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TArray as array - * - * @param TArray $array - * - * @return (TArray is array ? null : (TArray is non-empty-array ? TKey : TKey|null)) - * @psalm-pure - */ -function array_key_first($array) -{ -} - -/** - * @psalm-template TKey as array-key - * @psalm-template TArray as array - * - * @param TArray $array - * - * @return (TArray is array ? null : (TArray is non-empty-array ? TKey : TKey|null)) - * @psalm-pure - */ -function array_key_last($array) -{ -} - -/** - * @psalm-template T - * - * @param mixed $needle - * @param array $haystack - * @param bool $strict - * - * @return T|false - * @psalm-pure - */ -function array_search($needle, array $haystack, bool $strict = false) -{ -} - -/** - * @psalm-template T - * @psalm-template TArray as array - * - * @param TArray $array - * @param-out (TArray is non-empty-array ? non-empty-list : list) $array - */ -function shuffle(array &$array): bool -{ -} - -/** - * @psalm-template T - * @psalm-template TArray as array - * - * @param TArray $array - * @param-out (TArray is non-empty-array ? non-empty-list : list) $array - */ -function sort(array &$array, int $flags = SORT_REGULAR): bool -{ -} - -/** - * @psalm-template T - * @psalm-template TArray as array - * - * @param TArray $array - * @param-out (TArray is non-empty-array ? non-empty-list : list) $array - */ -function rsort(array &$array, int $flags = SORT_REGULAR): bool -{ -} - -/** - * @psalm-template T - * @psalm-template TArray as array - * - * @param TArray $array - * @param callable(T,T):int $callback - * @param-out (TArray is non-empty-array ? non-empty-list : list) $array - */ -function usort(array &$array, callable $callback): bool -{ -} - -/** - * @psalm-template TKey - * @psalm-template T - * @psalm-template TArray as array - * - * @param TArray $array - * @param callable(T,T):int $callback - * @param-out (TArray is non-empty-array ? non-empty-array : array) $array - */ -function uasort(array &$array, callable $callback): bool -{ -} - -/** - * @psalm-template TKey - * @psalm-template T - * @psalm-template TArray as array - * - * @param TArray $array - * @param callable(TKey,TKey):int $callback - * @param-out (TArray is non-empty-array ? non-empty-array : array) $array - */ -function uksort(array &$array, callable $callback): bool -{ -} - -/** - * @psalm-pure - * - * @psalm-template K of array-key - * @psalm-template T - * - * @param array $array - * - * @return array - */ -function array_change_key_case(array $array, int $case = CASE_LOWER) -{ -} - -/** - * @psalm-pure - * - * @psalm-template TKey as array-key - * - * @param TKey $key - * @param array $array - * - * @return bool - */ -function array_key_exists($key, array $array) : bool -{ -} - -/** - * @psalm-pure - * - * @psalm-template TKey as array-key - * @psalm-template TValue - * - * @param array ...$arrays - * - * @return array - */ -function array_merge_recursive(array ...$arrays) -{ -} - -/** - * @psalm-pure - * - * @psalm-template TKey as array-key - * @psalm-template TValue - * - * @param array $keys - * @param TValue $value - * - * @return array - */ -function array_fill_keys(array $keys, $value): array -{ -} - -/** - * @psalm-pure - * - * @psalm-template TKey - * - * @param string $pattern - * @param array $array - * @param 0|1 $flags 1=PREG_GREP_INVERT - * @return array - */ -function preg_grep($pattern, array $array, $flags = 0) -{ -} - -/** - * @param resource $stream - * @param-out closed-resource $stream - */ -function fclose(&$stream) : bool -{ -} - -/** - * @param string $string - * @param-out null $string - */ -function sodium_memzero(string &$string): void -{ -} - -/** - * @param mixed $value - * @param bool $return - * @return ($return is true ? string : void) - * - * @psalm-taint-specialize - * @psalm-flow ($value) -> return - * @psalm-taint-sink html $value - */ -function var_export($value, bool $return = false) {} - -/** - * @param mixed $value - * @param list $values - * @return string - * - * @psalm-taint-specialize - * @psalm-flow ($value, $values) -> return - * @psalm-taint-sink html $value - * @psalm-taint-sink html $values - */ -function var_dump($value, ...$values) {} - -/** - * @param mixed $value - * @param bool $return - * @return ($return is true ? string : true) - * - * @psalm-taint-specialize - * @psalm-flow ($value) -> return - * @psalm-taint-sink html $value - */ -function print_r($value, bool $return = false) {} - -/** - * @psalm-pure - * - * @psalm-taint-sink file $filename - * @param mixed $filename - * @return ($return is true ? string : bool) - */ -function highlight_file($filename, bool $return = false) {} - -/** - * @psalm-pure - * - * @psalm-taint-sink file $filename - * @param mixed $filename - * @return ($return is true ? string : bool) - */ -function show_source($filename, bool $return = false) {} - -/** - * @psalm-pure - * - * @psalm-taint-sink file $filename - */ -function php_strip_whitespace(string $filename) : string {} - -/** - * @psalm-pure - * - * @param mixed $string - * @return ($return is true ? string : bool) - * - * @psalm-flow ($string) -> return - */ -function highlight_string($string, bool $return = false) {} - -/** - * @psalm-pure - * - * @return ($as_float is true ? float : string) - */ -function microtime(bool $as_float = false) {} - -/** - * @psalm-pure - * - * @return ($as_float is true ? float : array) - */ -function gettimeofday(bool $as_float = false) {} - -/** - * @psalm-pure - * - * @param numeric $num - * @return ($num is int ? positive-int|0 : ($num is float ? float : positive-int|0|float)) - */ -function abs($num) {} - -/** - * @psalm-pure - * - * @template T as string|int|float - * @template TStep as int|float - * @param T $start - * @param T $end - * @param TStep $step - * @return ( - * T is int - * ? (TStep is int ? non-empty-list : non-empty-list) - * : ( - * T is float - * ? non-empty-list - * : ( - * T is string - * ? non-empty-list - * : ( - * T is int|float - * ? non-empty-list - * : non-empty-list - * ) - * ) - * ) - * ) - */ -function range($start, $end, $step = 1) {} - -/** - * @psalm-pure - * - * @return ( - * $format is 'd'|'j'|'N'|'w'|'z'|'W'|'m'|'n'|'t'|'L'|'o'|'Y'|'y'|'B'|'g'|'G'|'h'|'H'|'i'|'s'|'u'|'v'|'Z'|'U'|'I' - * ? numeric-string - * : ($timestamp is numeric ? string : string|false) - * ) - */ -function date(string $format, int $timestamp = 0) {} - -/** - * @psalm-pure - * - * @param mixed $vars - * @param-out string|int|float|null $vars - * @psalm-flow ($string, $format) -> return - * @return (func_num_args() is 2 ? (null|list) : int) - */ -function sscanf(string $string, string $format, &...$vars) {} - -/** - * @psalm-pure - * - * @return ( - * func_num_args() is 1 - * ? array{dirname: string, basename: string, extension?: string, filename: string} - * : string - * ) - */ -function pathinfo(string $path, int $flags = \PATHINFO_DIRNAME) {} - -/** - * @psalm-pure - * - * @return (func_num_args() is 0 ? array : string|false) - */ -function getenv(string $varname = '', bool $local_only = false) {} - -/** - * @psalm-pure - * - * @return ( - * $string is non-empty-string ? non-empty-lowercase-string : lowercase-string - * ) - * - * @psalm-flow ($string) -> return - */ -function strtolower(string $string) : string {} - -/** - * @psalm-pure - * - * @return ( - * $string is non-falsy-string - * ? non-falsy-string - * : ($string is non-empty-string ? non-empty-string : string) - * ) - * - * @psalm-flow ($string) -> return - */ -function strtoupper(string $string) : string {} - -/** - * @psalm-pure - * - * @param string|array $string - * @param string|array $replace - * @param int|array $offset - * @param null|int|array $length - * - * @return ($string is array ? array : string) - * - * @psalm-flow ($string, $replace) -> return - */ -function substr_replace($string, $replace, $offset, $length = null) {} - -/** - * @psalm-pure - * - * @param string $haystack - * - * @psalm-return positive-int|0|false - */ -function strpos($haystack, $needle, int $offset = 0) : int {} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function trim(string $string, string $characters = " \t\n\r\0\x0B") : string {} - -/** - * @psalm-pure - * - * @return ($string is class-string ? ($characters is '\\' ? class-string : string) : string) - * - * @psalm-flow ($string) -> return - */ -function ltrim(string $string, string $characters = " \t\n\r\0\x0B") : string {} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function rtrim(string $string, string $characters = " \t\n\r\0\x0B") : string {} - -/** - * @psalm-pure - * - * @param string|array $separator - * @param array $array - * - * @return ( - * $separator is non-empty-string - * ? ($array is non-empty-array - * ? ($array is array - * ? ($separator is literal-string ? non-empty-literal-string : non-empty-string) - * : non-empty-string - * ) - * : string) - * : ($array is non-empty-array - * ? ($array is array - * ? ($array is array ? non-empty-literal-string : non-empty-string) - * : string - * ) - * : string) - * ) - * - * @psalm-flow ($separator) -> return - * @psalm-flow ($array) -(array-fetch)-> return - */ -function implode($separator, array $array = []) : string {} - -/** - * @psalm-pure - * - * @param string|array $separator - * @param array $array - * - * @return ( - * $separator is non-empty-string - * ? ($array is non-empty-array - * ? ($array is array - * ? ($separator is literal-string ? non-empty-literal-string : non-empty-string) - * : non-empty-string - * ) - * : string) - * : ($array is non-empty-array - * ? ($array is array - * ? ($array is array ? non-empty-literal-string : non-empty-string) - * : string - * ) - * : string) - * ) - * - * @psalm-flow ($separator) -> return - * @psalm-flow ($array) -(array-fetch)-> return - */ -function join($separator, array $array = []): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -(array-assignment)-> return - */ -function explode(string $separator, string $string, int $limit = -1) : array {} - -/** - * @psalm-pure - * - * @psalm-flow ($subject) -(array-assignment)-> return - * - * @template TFlags as int-mask<0, 1, 2, 4> - * - * @param TFlags $flags - * - * @return (TFlags is 0|2 ? non-empty-list|false : (TFlags is 1|3 ? list|false : list|false)) - * - * @psalm-ignore-falsable-return - */ -function preg_split(string $pattern, string $subject, int $limit = -1, int $flags = 0) {} - -/** - * @param array $array - * - * @return ( - * $array is array - * ? int - * : ($array is array - * ? float - * : float|int - * ) - * ) - */ -function array_sum(array $array) {} - -/** - * @param array $array - * - * @return ( - * $array is array - * ? int - * : ($array is array - * ? float - * : float|int - * ) - * ) - */ -function array_product(array $array) {} - -/** - * 257 is FILTER_VALIDATE_INT - * @psalm-taint-escape ($filter is 257 ? 'html' : null) - * - * 258 is FILTER_VALIDATE_BOOLEAN - * @psalm-taint-escape ($filter is 258 ? 'html' : null) - * - * 259 is FILTER_VALIDATE_FLOAT - * @psalm-taint-escape ($filter is 259 ? 'html' : null) - * - * @psalm-flow ($value, $filter, $options) -> return - */ -function filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed {} - -/** - * @psalm-pure - * - * @psalm-taint-escape html - * @psalm-flow ($string) -> return - */ -function strip_tags(string $string, ?string $allowed_tags = null) : string {} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function stripcslashes(string $string) : string {} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function stripslashes(string $string) : string {} - -/** - * @psalm-pure - * - * Tainting is handled in a plugin - * - * @psalm-flow ($string) -> return - */ -function htmlentities(string $string, ?int $flags = null, ?string $encoding = null, bool $double_encode = true) : string {} - -/** - * @psalm-pure - * - * Tainting is handled in a plugin - * - * @psalm-flow ($string) -> return - */ -function html_entity_decode(string $string, ?int $flags = null, ?string $encoding = null) : string {} - -/** - * @psalm-pure - * - * Tainting is handled in a plugin - * - * @psalm-flow ($string) -> return - * @psalm-return ( - * $string is non-empty-string - * ? non-empty-string - * : string - * ) - */ -function htmlspecialchars(string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = 'UTF-8', bool $double_encode = true) : string {} - -/** - * @psalm-pure - * - * Tainting is handled in a plugin - * - * @psalm-flow ($string) -> return - */ -function htmlspecialchars_decode(string $string, ?int $flags = null) : string {} - -/** - * @psalm-pure - * - * @psalm-return ( - * $string is '' - * ? 0 - * : ( - * $string is non-empty-string - * ? positive-int - * : (0|positive-int) - * ) - * ) - */ -function strlen(string $string) : int {} - -/** - * @psalm-pure - * - * @param string|array $search - * @param string|array $replace - * @param string|array $subject - * @param int $count - * @return ($subject is array ? array : string) - * - * @psalm-flow ($replace, $subject) -> return - */ -function str_replace($search, $replace, $subject, &$count = null) {} - -/** - * @psalm-pure - * - * @param string|array $search - * @param string|array $replace - * @param string|array $subject - * @param int $count - * @return ($subject is array ? array : string) - * - * @psalm-flow ($replace, $subject) -> return - */ -function str_ireplace($search, $replace, $subject, &$count = null) {} - -/** - * @psalm-pure - * - * @return ($string is non-empty-string ? non-empty-string : ($length is positive-int ? non-empty-string: string)) - * - * @psalm-flow ($string, $pad_string) -> return - */ -function str_pad(string $string, int $length, $pad_string = '', int $pad_type = STR_PAD_RIGHT): string {} - -/** - * @psalm-pure - * - * @todo update $times to be `0|positive-int` - * @return ( - * $string is non-empty-string - * ? ( - * $times is positive-int - * ? non-empty-string - * : ($times is 0 ? '' : string) - * ) - * : ($times is 0 ? '' : string) - * ) - * - * @psalm-flow ($string) -> return - */ -function str_repeat(string $string, int $times): string {} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function str_rot13(string $string): string {} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function str_shuffle(string $string): string {} - -/** - * @psalm-pure - * @return ($length is positive-int ? list : false) - * - * @psalm-flow ($string) -> return - */ -function str_split(string $string, int $length = 1) {} - -/** - * @psalm-pure - * @return string|false - * @psalm-ignore-falsable-return - * - * @psalm-flow ($haystack) -> return - */ -function strstr(string $haystack, string $needle, bool $before_needle = false) {} - -/** - * @psalm-pure - * @return string|false - * @psalm-ignore-falsable-return - * - * @psalm-flow ($haystack) -> return - */ -function stristr(string $haystack, string $needle, bool $before_needle = false) {} - -/** - * @psalm-pure - * @return string|false - * @psalm-ignore-falsable-return - * - * @psalm-flow ($haystack) -> return - */ -function strchr(string $haystack, string $needle, bool $before_needle = false) {} - -/** - * @psalm-pure - * @return string|false - * @psalm-ignore-falsable-return - * - * @psalm-flow ($string) -> return - */ -function strpbrk(string $string, string $characters) {} - -/** - * @psalm-pure - * @return string|false - * @psalm-ignore-falsable-return - * - * @psalm-flow ($haystack) -> return - */ -function strrchr(string $haystack, string $needle) {} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function strrev(string $string): string {} - -/** - * @psalm-pure - * - * @param 0|1|2 $format - * @return ( - * $format is 0 ? - * int : - * ( - * $format is 1 ? - * list : - * array - * ) - * ) - */ -function str_word_count(string $string, int $format = 0, string|null $characters = null) {} - -/** - * @psalm-pure - * - * @param string|string[] $pattern - * @param string|array $replacement - * @param string|array $subject - * @param int $count - * @return ($subject is array ? array : string|null) - * - * @psalm-flow ($replacement, $subject) -> return - */ -function preg_filter($pattern, $replacement, $subject, int $limit = -1, &$count = null) {} - -/** - * @psalm-pure - * - * @param string|string[] $pattern - * @param string|array $replacement - * @param string|array $subject - * @param int $count - * @return ($subject is array ? array|null : string|null) - * - * @psalm-flow ($replacement, $subject) -> return - */ -function preg_replace($pattern, $replacement, $subject, int $limit = -1, &$count = null) {} - -/** - * @param string|string[] $pattern - * @param callable(string[]):string $callback - * @param string|array $subject - * @param int $count - * @return ($subject is array ? array|null : string|null) - * - * @psalm-taint-specialize - * @psalm-flow ($subject) -> return - */ -function preg_replace_callback($pattern, $callback, $subject, int $limit = -1, &$count = null, int $flags = 0) {} - -/** - * @psalm-pure - * @template TFlags as int - * - * @param string $pattern - * @param string $subject - * @param mixed $matches - * @param TFlags $flags - * @param-out ( - * TFlags is 1 - * ? array> - * : (TFlags is 2 - * ? list> - * : (TFlags is 256|257 - * ? array> - * : (TFlags is 258 - * ? list> - * : (TFlags is 512|513 - * ? array> - * : (TFlags is 514 - * ? list> - * : (TFlags is 770 - * ? list> - * : array - * ) - * ) - * ) - * ) - * ) - * ) - * ) $matches - * @return int|false - * @psalm-ignore-falsable-return - */ -function preg_match_all($pattern, $subject, &$matches = [], int $flags = 1, int $offset = 0) {} - -/** - * @psalm-pure - * @template TFlags as int-mask<0, 256, 512> - * - * @param string $pattern - * @param string $subject - * @param mixed $matches - * @param TFlags $flags - * @param-out (TFlags is 256 ? array : - * TFlags is 512 ? array : - * TFlags is 768 ? array : - * array - * ) $matches - * @return 1|0|false - * @psalm-ignore-falsable-return - */ -function preg_match($pattern, $subject, &$matches = [], int $flags = 0, int $offset = 0) {} - -/** - * @psalm-pure - * - * @return (PHP_MAJOR_VERSION is 5|7 ? string|false : string) - * @psalm-ignore-falsable-return - * - * @psalm-flow ($string) -> return - */ -function substr(string $string, int $offset, ?int $length = null) {} - -/** - * @psalm-pure - * - * @psalm-flow ($str) -> return - */ -function preg_quote(string $str, ?string $delimiter = null) : string {} - -/** - * @psalm-pure - * - * @param string|int|float $values - * - * @psalm-flow ($format, $values) -> return - */ -function sprintf(string $format, ...$values) : string {} - -/** - * @psalm-pure - * @return string|false - * @psalm-ignore-falsable-return - * - * @psalm-flow ($format, $values) -> return - */ -function vsprintf(string $format, array $values) {} - -/** - * @psalm-pure - * @return string - * - * @psalm-flow ($string) -> return - */ -function wordwrap(string $string, int $width = 75, string $break = "\n", bool $cut_long_words = false) : string {} - -/** - * @psalm-pure - * - * @param string|int|float $values - * - * @psalm-taint-specialize - * @psalm-flow ($format, $values) -> return - * @psalm-taint-sink html $format - * @psalm-taint-sink html $values - */ -function printf(string $format, ...$values) : string {} - -/** - * @psalm-taint-specialize - * @psalm-taint-sink html $format - * @psalm-taint-sink html $values - */ -function vprintf(string $format, array $values) : int {} - -/** - * @psalm-pure - * - * @return string|false - * @psalm-ignore-falsable-return - * - * @psalm-flow ($path) -> return - */ -function realpath(string $path) {} - -/** - * @psalm-pure - * - * @param numeric-string $num1 - * @param numeric-string $num2 - * @return (PHP_MAJOR_VERSION is 8 ? numeric-string : ($num2 is "0" ? null : numeric-string)) - */ -function bcdiv(string $num1, string $num2, int $scale = 0): ?string {} - -/** - * @psalm-pure - * - * @param scalar|null|object $value - * @return string The string value of var. - * - * @psalm-flow ($value) -> return - */ -function strval ($value): string {} - -/** - * @return ($string is non-empty-string ? non-empty-list : non-empty-list|array{null}) - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function str_getcsv(string $string, string $separator = ',', string $enclosure = '"', string $escape = '\\\\') -{ -} - -/** - * @template TKey as array-key - * @template TArray as array - * - * @param TArray $array - * - * @return (TArray is non-empty-array ? non-empty-array : array) - * - * @psalm-pure - */ -function array_count_values(array $array): array {} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function addcslashes(string $string, string $characters) : string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function addslashes(string $string): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function ucfirst(string $string): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string, $separators) -> return - */ -function ucwords (string $string, string $separators = " \t\r\n\f\v"): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function lcfirst(string $string): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function nl2br(string $string, bool $use_xhtml = false): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function quoted_printable_decode(string $string): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function quoted_printable_encode(string $string): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function quotemeta(string $string): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function chop(string $string, string $characters = " \t\n\r\0\x0B"): string -{ -} - -/** - * @psalm-pure - * @psalm-flow ($string, $separator) -> return - */ -function chunk_split(string $string, int $length = 76, string $separator= ''): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function convert_uudecode(string $string): string -{ -} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function convert_uuencode(string $string) : string -{ -} - -/** - * @psalm-pure - * - * @psalm-taint-escape ldap - * @psalm-flow ($value) -> return - */ -function ldap_escape(string $value, string $ignore = "", int $flags = 0) : string {} - -/** - * @psalm-pure - * - * @return mixed - * @psalm-flow ($json) -> return - */ -function json_decode(string $json, ?bool $associative = null, int $depth = 512, int $flags = 0) {} - -/** - * @psalm-pure - * - * @return ($flags is 4194304 ? string : string|false) - * - * @psalm-flow ($value) -> return - * @psalm-ignore-falsable-return - */ -function json_encode(mixed $value, int $flags = 0, int $depth = 512) {} - -/** - * @psalm-pure - * - * @return string|false - * - * @psalm-flow ($values) -> return - * @psalm-ignore-falsable-return - */ -function pack(string $format, mixed ...$values) {} - -/** - * @psalm-pure - * - * @param string|int $in_codepage - * @param string|int $out_codepage - * @psalm-flow ($subject) -> return - */ -function sapi_windows_cp_conv($in_codepage, $out_codepage, string $subject) : ?string {} - -/** - * @psalm-pure - * - * @psalm-flow ($prefix) -> return - */ -function uniqid(string $prefix = "", bool $more_entropy = false) : string {} - -/** - * @psalm-pure - * - * @return array|false - * @psalm-ignore-falsable-return - * - * @psalm-flow ($string) -> return - */ -function unpack(string $format, string $string, int $offset = 0) {} - -/** - * @psalm-pure - * - * @return string|false - * - * @psalm-flow ($string) -> return - * @psalm-ignore-falsable-return - */ -function base64_decode(string $string, bool $strict = false) {} - -/** - * @psalm-pure - * - * @psalm-flow ($string) -> return - */ -function base64_encode(string $string) : string {} - -/** - * @psalm-pure - * - * @param resource|null $context - * - * @return ($associative is 0 ? list : array>)|false - * - * @psalm-taint-sink ssrf $url - */ -function get_headers(string $url, int $associative = 0, $context = null) : array|false {} - -/** - * @psalm-pure - * - * @return array|false - * - * @psalm-taint-sink ssrf $filename - */ -function get_meta_tags(string $filename, bool $use_include_path = false) : array|false {} - -/** - * @return ($categorize is false ? array : array>) - */ -function get_defined_constants(bool $categorize = false): array {} - -/** - * @param mixed $object_or_class - * @param class-string $class - * @param bool $allow_string - * @return ($allow_string is false ? ($object_or_class is object ? bool : false) : bool) - */ -function is_a($object_or_class, string $class, $allow_string = false): bool{} - -/** - * @template T of array|string - * @param T $string - * @return (T is array ? array : T is array ? array : string|false) - * @psalm-ignore-falsable-return - */ -function mb_convert_encoding(array|string $string, string $to_encoding, array|string|null $from_encoding = null): array|string|false{} - -/** - * @template TRead of null|array - * @template TWrite of null|array - * @template TExcept of null|array - * @param TRead $read - * @param TWrite $write - * @param TExcept $except - * @return false|int<0, max> - * @param-out (TRead is null ? null : array) $read - * @param-out (TWrite is null ? null : array) $write - * @param-out (TExcept is null ? null : array) $except - * @psalm-suppress ReferenceConstraintViolation - */ -function stream_select(null|array &$read, null|array &$write, null|array &$except, null|int $seconds, null|int $microseconds = null) : bool|int {} diff --git a/vendor/vimeo/psalm/stubs/CoreGenericIterators.phpstub b/vendor/vimeo/psalm/stubs/CoreGenericIterators.phpstub deleted file mode 100644 index c20e54de..00000000 --- a/vendor/vimeo/psalm/stubs/CoreGenericIterators.phpstub +++ /dev/null @@ -1,1094 +0,0 @@ - - */ -interface IteratorAggregate extends Traversable { - - /** - * @return Traversable An instance of an object implementing Iterator or Traversable - */ - public function getIterator(); -} - -/** - * @template-covariant TKey - * @template-covariant TValue - * - * @template-extends Traversable - */ -interface Iterator extends Traversable { - - /** - * @return TValue|null returns current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current(); - - /** - * @return void Any returned value is ignored. - */ - public function next(); - - /** - * @return TKey|null current key or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key(); - - /** - * @return bool The return value will be casted to boolean and then evaluated. - * Returns true on success or false on failure. - */ - public function valid(); - - /** - * @return void Any returned value is ignored. - */ - public function rewind(); -} - -/** - * @template-covariant TKey - * @template-covariant TValue - * - * @template-extends Iterator - */ -interface OuterIterator extends Iterator { - /** - * @return Iterator - */ - public function getInnerIterator(); -} - -/** - * @template-covariant TKey - * @template-covariant TValue - * - * @template-extends Iterator - */ -interface RecursiveIterator extends Iterator { - - /** - * @return bool true if the current entry can be iterated over, otherwise returns false. - */ - public function hasChildren(); - - /** - * @return RecursiveIterator An iterator for the current entry. - */ - public function getChildren(); -} - -/** - * @template-covariant TKey - * @template-covariant TValue - * @template-extends Iterator - */ -interface SeekableIterator extends Iterator { - /** - * Seeks to a position - * @link https://php.net/manual/en/seekableiterator.seek.php - * - * @param int $position The position to seek to. - * @return void - * - * @since 5.1.0 - */ - public function seek($position); -} - -/** - * @template-covariant TKey - * @template-covariant TValue - * @template TIterator as Traversable - * - * @template-implements OuterIterator - * - * @mixin TIterator - */ -class IteratorIterator implements OuterIterator { - /** - * @param TIterator $iterator - */ - public function __construct(Traversable $iterator) {} - - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current key value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - -/** - * @template TKey - * @template TValue - * @template TIterator as Traversable - * - * @template-extends IteratorIterator - */ -class AppendIterator extends IteratorIterator { - public function __construct(){} - - /** - * @param TIterator $iterator - * @return void - */ - public function append(Iterator $iterator) {} - - /** - * @return ArrayIterator - */ - public function getArrayIterator() {} - - /** - * @return int - */ - public function getIteratorIndex() {} - - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - -/** - * @template TKey as array-key - * @template TValue - * @template-implements SeekableIterator - * @template-implements ArrayAccess - */ -class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Countable { - const STD_PROP_LIST = 1; - const ARRAY_AS_PROPS = 2; - - /** - * @param array $array The array or object to be iterated on. - * @param int-mask-of $flags Flags to control the behaviour of the ArrayObject object. - */ - public function __construct($array = array(), $flags = 0) { } - - /** - * @param TKey $index The offset being checked. - * @return bool true if the offset exists, otherwise false - */ - public function offsetExists($index) { } - - /** - * @param TKey $index The offset to get the value from. - * @return TValue|null The value at offset index, null when accessing invalid indexes - * @psalm-ignore-nullable-return - */ - public function offsetGet($index) { } - - /** - * @param TKey $index The index to set for. - * @param TValue $newval The new value to store at the index. - * @return void - */ - public function offsetSet($index, $newval) { } - - /** - * @param TKey $index The offset to unset. - * @return void - */ - public function offsetUnset($index) { } - - /** - * @param TValue $value The value to append. - * @return void - */ - public function append($value) { } - - /** - * @return array A copy of the array, or array of public properties - * if ArrayIterator refers to an object. - */ - public function getArrayCopy() { } - - /** - * @return int The number of elements or public properties in the associated - * array or object, respectively. - */ - public function count() { } - - /** - * @return int-mask-of The current flags. - */ - public function getFlags() { } - - /** - * @param int-mask-of $flags bitmask - * @return void - */ - public function setFlags($flags) { } - - /** - * @return void - */ - public function asort() { } - - /** - * @return void - */ - public function ksort() { } - - /** - * @param callable(TValue,TValue):int $cmp_function The compare function used for the sort. - * @return void - */ - public function uasort($cmp_function) { } - - /** - * @param callable(TKey,TKey):int $cmp_function The compare function used for the sort. - * @return void - */ - public function uksort($cmp_function) { } - - /** - * @return void - */ - public function natsort() { } - - /** - * @return void - */ - public function natcasesort() { } - - /** - * @param string $serialized The serialized ArrayIterator object to be unserialized. - * @return void - */ - public function unserialize($serialized) { } - - /** - * @return string The serialized ArrayIterator - */ - public function serialize() { } - - /** - * @return void - */ - public function rewind() { } - - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() { } - - /** - * @return TKey|null The current array key or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() { } - - /** - * @return void - */ - public function next() { } - - /** - * @return bool - */ - public function valid() { } - - /** - * @param int $position The position to seek to. - * @return void - */ - public function seek($position) { } -} - -/** - * @template-covariant TKey - * @template-covariant TValue - * - * @template-extends IteratorIterator - */ -class FilterIterator extends IteratorIterator { - /** @return bool */ - abstract public function accept(); - - /** - * @return TValue Can return any type. - */ - public function current() {} - - /** - * @return TKey scalar on success, or null on failure. - */ - public function key() {} -} - -/** - * @template-covariant TKey - * @template-covariant TValue - * - * @template-implements OuterIterator - * @template-implements ArrayAccess - * - * @template-extends IteratorIterator - */ -class CachingIterator extends IteratorIterator implements OuterIterator , ArrayAccess , Countable { - const CALL_TOSTRING = 1 ; - const CATCH_GET_CHILD = 16 ; - const TOSTRING_USE_KEY = 2 ; - const TOSTRING_USE_CURRENT = 4 ; - const TOSTRING_USE_INNER = 8 ; - const FULL_CACHE = 256 ; - - /** - * @param Iterator $iterator - * @param int-mask-of $flags - */ - public function __construct(Iterator $iterator, int $flags = self::CALL_TOSTRING) {} - - /** @return bool */ - public function hasNext () {} - - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current key or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - -/** - * @template-covariant TKey - * @template-covariant TValue - * - * @template-implements OuterIterator - * - * @template-extends FilterIterator - */ -class CallbackFilterIterator extends FilterIterator implements OuterIterator { - /** - * @param Iterator $iterator - * @param callable(TValue, TKey, Iterator): bool $callback - */ - public function __construct(Iterator $iterator, callable $callback) {} - - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current key or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - -/** - * @template-implements SeekableIterator - */ -class DirectoryIterator extends SplFileInfo implements SeekableIterator { - - public function __construct(string $path){} - - /** - * @return self - */ - public function current() {} - /** - * @return int|false - * @psalm-ignore-falsable-return - */ - public function key() {} - - /** - * @return void - */ - public function next(){} - /** - * @return void - */ - public function rewind(){} - - /** - * @param int $position - */ - public function seek($position) {} - - /** - * @return bool - */ - public function valid(){} -} - -/** - * @template-implements Iterator - */ -class EmptyIterator implements Iterator { - /** - * @return empty - */ - public function current() {} - /** - * @return empty - */ - public function key() {} - /** - * @return void - */ - public function next() {} - /** - * @return void - */ - public function rewind() {} - - /** - * @return false - */ - public function valid() {} -} - -/** - * @template-extends SeekableIterator - */ -class FilesystemIterator extends DirectoryIterator -{ - const CURRENT_AS_PATHNAME = 32; - const CURRENT_AS_FILEINFO = 0; - const CURRENT_AS_SELF = 16; - const CURRENT_MODE_MASK = 240; - const KEY_AS_PATHNAME = 0; - const KEY_AS_FILENAME = 256; - const FOLLOW_SYMLINKS = 512; - const KEY_MODE_MASK = 3840; - const NEW_CURRENT_AND_KEY = 256; - const SKIP_DOTS = 4096; - const UNIX_PATHS = 8192; - - /** - * @param int-mask $flags - */ - public function __construct(string $path, int $flags = self::KEY_AS_PATHNAME|self::CURRENT_AS_FILEINFO|self::SKIP_DOTS) {} - - /** - * @return FilesystemIterator|SplFileInfo|string|null - * @psalm-ignore-nullable-return - */ - public function current() {} - /** - * @return int-mask - */ - public function getFlags() {} - - /** - * @param int-mask $flags - * @return void - */ - public function setFlags($flags) {} - /** - * @return string|null - * @psalm-ignore-nullable-return - */ - public function key() {} -} - - - -/** - * @template-extends SeekableIterator - */ -class GlobIterator extends FilesystemIterator implements Countable { - /** - * @return int - */ - public function count() {} -} - -/** - * @template-covariant TKey - * @template-covariant TValue - * - * @template-extends IteratorIterator - */ -class InfiniteIterator extends IteratorIterator { - /** - * @param Iterator $iterator - */ - public function __construct(Iterator $iterator) {} - - /** - * @return TValue|null current value or null if iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current key or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - -/** - * @template-covariant TKey - * @template-covariant TValue - * - * @template-implements OuterIterator - * - * @template-extends IteratorIterator - */ -class LimitIterator extends IteratorIterator implements OuterIterator { - /** - * @param Iterator $iterator - */ - public function __construct(Iterator $iterator, int $offset = 0, int $count = -1) {} - - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current key or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - - - -/** - * @template-covariant TKey - * @template-covariant TValue - * - * @template-extends IteratorIterator - */ -class NoRewindIterator extends IteratorIterator { - /** - * @param Iterator $iterator - */ - public function __construct(Iterator $iterator) {} - - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - -/** - * - * @template-covariant TKey - * @template-covariant TValue - * - * @template-implements Iterator - */ -class MultipleIterator implements Iterator { - const MIT_NEED_ANY = 0 ; - const MIT_NEED_ALL = 1 ; - const MIT_KEYS_NUMERIC = 0 ; - const MIT_KEYS_ASSOC = 2 ; - - /** - * @param int-mask-of $flags - */ - public function __construct (int $flags = 0) {} - /** - * @param Iterator $iterator - * @param string|int $infos - * @return void - */ - public function attachIterator(Iterator $iterator, $infos = '') {} - /** - * @param Iterator $iterator - * @return bool - */ - public function containsIterator(Iterator $iterator) {} - - /** - * @return int - */ - public function countIterators() {} - /** - * nullable values are returned when MIT_NEED_ANY is set - * and one of the iterators is already drained. - * When MIT_NEED_ALL is set and one of the iterators - * is already drained, `current()` throws - * - * @return array - */ - public function current() {} - /** - * @param Iterator $iterator - * @return void - */ - public function detachIterator(Iterator $iterator) {} - /** - * @return int-mask-of - */ - public function getFlags() {} - /** - * @return array - */ - public function key() {} - /** - * @param int-mask-of $flags - * @return void - */ - public function setFlags( int $flags ) {} -} - -/** - * @template TKey - * @template TValue - * - * @template-extends FilterIterator - * @template-implements RecursiveIterator - */ -abstract class RecursiveFilterIterator extends FilterIterator implements RecursiveIterator { - - /** - * @param RecursiveIterator $iterator - */ - public function __construct(RecursiveIterator $iterator) {} - /** - * @return RecursiveFilterIterator - */ - public function getChildren() {} - - /** - * @return bool - */ - public function hasChildren() {} - - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - -/** - * @template TKey - * @template TValue - * - * @template-extends RecursiveFilterIterator - */ -class ParentIterator extends RecursiveFilterIterator implements RecursiveIterator, OuterIterator { - - /** - * @return bool - */ - public function accept() {} - /** - * @param RecursiveIterator $iterator - */ - public function __construct(RecursiveIterator $iterator) {} - /** - * @return ParentIterator - */ - public function getChildren() {} - - /** - * @return bool - */ - public function hasChildren() {} - /** - * @return void - */ - public function next() {} - /** - * @return void - */ - public function rewind() {} - - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current key or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - -/** - * @template TKey - * @template TValue - * - * @template-implements RecursiveIterator - * @template-extends ArrayIterator - */ -class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator { - const STD_PROP_LIST = 1 ; - const ARRAY_AS_PROPS = 2 ; - const CHILD_ARRAYS_ONLY = 4 ; - - /** - * @return RecursiveArrayIterator - */ - public function getChildren() {} - - /** - * @return bool - */ - public function hasChildren() {} - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current key or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - -/** - * @template TKey - * @template TValue - * - * @template-implements RecursiveIterator - * @template-extends ArrayIterator - */ -class RecursiveCachingIterator extends CachingIterator implements RecursiveIterator { - - const CALL_TOSTRING = 1 ; - const CATCH_GET_CHILD = 16 ; - const TOSTRING_USE_KEY = 2 ; - const TOSTRING_USE_CURRENT = 4 ; - const TOSTRING_USE_INNER = 8 ; - const FULL_CACHE = 256 ; - - /** - * @param Iterator $iterator - * @param int-mask-of $flags - */ - public function __construct(Iterator $iterator, int $flags = 0) {} - /** - * @return RecursiveCachingIterator - */ - public function getChildren() {} - - /** - * @return bool - */ - public function hasChildren() {} - - /** - * @return TValue|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return TKey|null current key or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - -/** - * @template TKey - * @template TValue - * - * @template-implements RecursiveIterator - * @template-extends CallbackFilterIterator - */ -class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator { - - /** - * @param RecursiveIterator $iterator - * @param callable(TValue, TKey, RecursiveIterator): bool $callback - */ - public function __construct(RecursiveIterator $iterator, callable $callback) {} - /** - * @return RecursiveCallbackFilterIterator - */ - public function getChildren() {} - - /** - * @return bool - */ - public function hasChildren() {} - - /** - * @return TValue|null current value or null when iterator is drained - */ - public function current() {} - - /** - * @return TKey|null current value or null when iterator is drained - */ - public function key() {} -} - -/** - * @template-implements RecursiveIterator - * @template-implements SeekableIterator - */ -class RecursiveDirectoryIterator extends FilesystemIterator implements RecursiveIterator, SeekableIterator { - - const CURRENT_AS_PATHNAME = 32 ; - const CURRENT_AS_FILEINFO = 0 ; - const CURRENT_AS_SELF = 16 ; - const CURRENT_MODE_MASK = 240 ; - const KEY_AS_PATHNAME = 0 ; - const KEY_AS_FILENAME = 256 ; - const FOLLOW_SYMLINKS = 512 ; - const KEY_MODE_MASK = 3840 ; - const NEW_CURRENT_AND_KEY = 256 ; - const SKIP_DOTS = 4096 ; - const UNIX_PATHS = 8192 ; - - /** - * @param string $path - * @param int-mask $flags - */ - public function __construct(string $path, int $flags = self::KEY_AS_PATHNAME|self::CURRENT_AS_FILEINFO) {} - - /** - * @return string - */ - public function getSubPath() {} - /** - * @return string - */ - public function getSubPathname() {} - - /** - * @return RecursiveDirectoryIterator|string|SplFileInfo|null current value or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function current() {} - - /** - * @return string|null current key or null when iterator is drained - * @psalm-ignore-nullable-return - */ - public function key() {} -} - - -/** - * @template TIterator as RecursiveIterator|IteratorAggregate - * @mixin TIterator - */ -class RecursiveIteratorIterator implements OuterIterator { - /** - * @param TIterator $iterator - * @param int $mode - * @param int $flags - * - * @return void - */ - public function __construct($iterator, $mode = 0, $flags = 0) {} -} - -/** - * @template TKey - * @template TValue - * - * @template-implements RecursiveIterator - * @template-extends RegexIterator - */ -class RecursiveRegexIterator extends RegexIterator implements RecursiveIterator { - - const MATCH = 0 ; - const GET_MATCH = 1 ; - const ALL_MATCHES = 2 ; - const SPLIT = 3 ; - const REPLACE = 4 ; - const USE_KEY = 1 ; - - /** - * @param RecursiveIterator $iterator - * @param string $regex - * @param self::MATH|self::GET_MATCH|self::ALL_MATCHES|self::SPLIT|self::REPLACE $mode - * @param self::USE_KEY|0 $flags - * @param int $preg_flags - */ - public function __construct(RecursiveIterator $iterator, string $regex, int $mode = self::MATCH, int $flags = 0, int $preg_flags = 0) {} - - /** - * @return RecursiveRegexIterator - */ - public function getChildren() {} -} - -/** - * @template TKey - * @template TValue - * - * @template-extends RecursiveIteratorIterator - * @template-implements OuterIterator - */ -class RecursiveTreeIterator extends RecursiveIteratorIterator implements OuterIterator { - - const LEAVES_ONLY = 0 ; - const SELF_FIRST = 1 ; - const CHILD_FIRST = 2 ; - const CATCH_GET_CHILD = 16 ; - - const BYPASS_CURRENT = 4 ; - const BYPASS_KEY = 8 ; - const PREFIX_LEFT = 0 ; - const PREFIX_MID_HAS_NEXT = 1 ; - const PREFIX_MID_LAST = 2 ; - const PREFIX_END_HAS_NEXT = 3 ; - const PREFIX_END_LAST = 4 ; - const PREFIX_RIGHT = 5 ; - - /** - * @return void - */ - public function beginChildren() {} - - /** - * @return RecursiveIterator - */ - public function beginIteration() {} - /** - * @return RecursiveIterator - */ - public function callGetChildren() {} - /** - * @return bool - */ - public function callHasChildren() {} - - /** - * @param RecursiveIterator|IteratorAggregate $it - * @param int-mask $flags - * @param int-mask $cit_flags - * @param self::LEAVES_ONLY|self::SELF_FIRST|self::CHILD_FIRST $mode - */ - public function __construct($it, int $flags = self::BYPASS_KEY, int $cit_flags = self::CATCH_GET_CHILD, int $mode = self::SELF_FIRST) {} - - /** - * @return string - */ - public function current() {} - /** - * @return void - */ - public function endChildren() {} - /** - * @return void - */ - public function endIteration() {} - - /** - * @return string - */ - public function getEntry() {} - /** - * @return string - */ - public function getPostfix() {} - /** - * @return string - */ - public function getPrefix() {} - /** - * @return string - */ - public function key() {} - /** - * @return void - */ - public function next() {} - /** - * @return void - */ - public function nextElement() {} - /** - * @return void - */ - public function rewind() {} - /** - * @return void - */ - public function setPostfix(string $postfix ) {} - /** - * @param self::PREFIX_* $part - * @param string $value - * @return void - */ - public function setPrefixPart(int $part , string $value ) {} - /** - * @return bool - */ - public function valid() {} -} - -/** - * @template TKey - * @template TValue - * - * @template-extends FilterIterator - */ -class RegexIterator extends FilterIterator { - const MATCH = 0 ; - const GET_MATCH = 1 ; - const ALL_MATCHES = 2 ; - const SPLIT = 3 ; - const REPLACE = 4 ; - const USE_KEY = 1 ; - - /** - * @param Iterator $iterator - * @param string $regex - * @param self::MATCH|self::GET_MATCH|self::ALL_MATCHES|self::SPLIT|self::REPLACE $mode - * @param int-mask $flags - * @param int $preg_flags - */ - public function __construct(Iterator $iterator, string $regex, int $mode = self::MATCH, int $flags = 0, int $preg_flags = 0) {} - /** - * @return TValue Can return any type. - */ - public function current() {} - - /** - * @return TKey scalar on success, or null on failure. - */ - public function key() {} -} diff --git a/vendor/vimeo/psalm/stubs/CoreImmutableClasses.phpstub b/vendor/vimeo/psalm/stubs/CoreImmutableClasses.phpstub deleted file mode 100644 index 405f89b4..00000000 --- a/vendor/vimeo/psalm/stubs/CoreImmutableClasses.phpstub +++ /dev/null @@ -1,242 +0,0 @@ - - */ -class DatePeriod implements Traversable -{ - const EXCLUDE_START_DATE = 1; - /** - * @param Start $start - * @param (Start is string ? 0|self::EXCLUDE_START_DATE : DateInterval) $interval - * @param (Start is string ? never : DateTimeInterface|positive-int) $end - * @param (Start is string ? never : 0|self::EXCLUDE_START_DATE) $options - */ - public function __construct($start, $interval = 0, $end = 1, $options = 0) {} -} - -/** - * @psalm-taint-specialize - */ -interface Throwable -{ - /** - * @psalm-mutation-free - */ - public function getMessage() : string; - - /** - * @psalm-mutation-free - * - * @return int|string https://www.php.net/manual/en/throwable.getcode.php - */ - public function getCode(); - - /** - * @psalm-mutation-free - */ - public function getFile() : string; - - /** - * @psalm-mutation-free - */ - public function getLine() : int; - - /** - * @psalm-mutation-free - * @return list',args?:array}> - */ - public function getTrace() : array; - - /** - * @psalm-mutation-free - */ - public function getPrevious() : ?Throwable; - - /** - * @psalm-mutation-free - * @psalm-taint-source input - */ - public function getTraceAsString() : string; - - /** - * @return string - * @psalm-taint-source input - */ - public function __toString(); -} - -/** - * @psalm-taint-specialize - */ -class Exception implements Throwable -{ - /** - * @var string - */ - protected $message = ''; - - /** - * @var int - */ - protected $code = 0; - - /** - * @var string - */ - protected $file = ''; - - /** - * @var int - */ - protected $line = 0; - - /** - * @psalm-external-mutation-free - * @param string $message - * @param int $code - * @param Throwable $previous - */ - public function __construct($message = "", $code = 0, Throwable $previous = null) {} - - /** - * @psalm-mutation-free - */ - public final function getMessage() : string {} - - /** - * @psalm-mutation-free - * - * @return int|string https://www.php.net/manual/en/throwable.getcode.php - */ - public final function getCode() {} - - /** - * @psalm-mutation-free - */ - public final function getFile(): string {} - - /** - * @psalm-mutation-free - */ - public final function getLine(): int {} - - /** - * @psalm-mutation-free - * @return list',args?:array}> - */ - public final function getTrace() : array {} - - /** - * @psalm-mutation-free - */ - public final function getPrevious() : ?Throwable {} - - /** - * @psalm-mutation-free - * @psalm-taint-source input - */ - public final function getTraceAsString() : string {} - - /** - * @return string - * @psalm-taint-source input - */ - public function __toString() {} -} - -/** - * @psalm-taint-specialize - */ -class Error implements Throwable -{ - /** - * @var string - */ - protected $message = ''; - - /** - * @var int - */ - protected $code = 0; - - /** - * @var string - */ - protected $file = ''; - - /** - * @var int - */ - protected $line = 0; - - /** - * @psalm-external-mutation-free - * @param string $message - * @param int $code - * @param Throwable $previous - */ - public function __construct($message = "", $code = 0, Throwable $previous = null) {} - - /** - * @psalm-mutation-free - */ - public final function getMessage() : string {} - - /** - * @psalm-mutation-free - */ - public final function getCode(): int {} - - /** - * @psalm-mutation-free - */ - public final function getFile(): string {} - - /** - * @psalm-mutation-free - */ - public final function getLine(): int{} - - /** - * @psalm-mutation-free - * @return list',args?:array}> - */ - public final function getTrace() : array {} - - /** - * @psalm-mutation-free - */ - public final function getPrevious() : ?Throwable {} - - /** - * @psalm-mutation-free - * @psalm-taint-source input - */ - public final function getTraceAsString() : string {} - - /** - * @return string - * @psalm-taint-source input - */ - public function __toString() {} -} diff --git a/vendor/vimeo/psalm/stubs/DOM.phpstub b/vendor/vimeo/psalm/stubs/DOM.phpstub deleted file mode 100644 index 5c7630e7..00000000 --- a/vendor/vimeo/psalm/stubs/DOM.phpstub +++ /dev/null @@ -1,176 +0,0 @@ - - */ - public function getElementsByTagName($name) {} - - /** - * @return DOMNodeList - */ - public function getElementsByTagNameNS($namespaceURI, $localName) {} -} - -/** - * The DOMElement class - * @link http://php.net/manual/en/class.domelement.php - */ -class DOMElement extends DOMNode { - public function __construct(string $name, string $value = '', string $namespaceURI = '') {} - - /** - * @return DOMNodeList - */ - public function getElementsByTagName($name) {} - /** - * @return DOMNodeList - */ - public function getElementsByTagNameNS($namespaceURI, $localName) {} -} - -/** - * @template-covariant TNode as DOMNode - * @template-implements Traversable - */ -class DOMNodeList implements Traversable, Countable { - /** - * The number of nodes in the list. The range of valid child node indices is 0 to length - 1 inclusive. - * - * @var int - * - * @since 5.0 - * @link http://php.net/manual/en/class.domnodelist.php#domnodelist.props.length - */ - public $length; - - /** - * @param int $index - * @return TNode|null - * @psalm-ignore-nullable-return - */ - public function item($index) {} -} - -/** - * @template-covariant TNode as DOMNode - * @template-implements Traversable - */ -class DOMNamedNodeMap implements Traversable, Countable { - /** - * @var int - */ - public $length; - - /** - * @return TNode|null - */ - public function getNamedItem(string $name): ?DOMNode {} - - /** - * @return TNode|null - */ - public function getNamedItemNS(string $namespaceURI, string $localName): ?DOMNode {} - - /** - * @return TNode|null - * @psalm-ignore-nullable-return - */ - public function item(int $index): ?DOMNode {} -} - -class SimpleXMLElement implements \Countable, \RecursiveIterator, \ArrayAccess -{ - /** @return array */ - public function getNamespaces(bool $recursive = false) - { - } - /** @return array|false */ - public function getDocNamespaces(bool $recursive = false, bool $fromRoot = true) - { - } - /** @return SimpleXMLIterator */ - public function children(?string $namespaceOrPrefix = null, bool $isPrefix = false) - { - } - /** @return SimpleXMLIterator */ - public function attributes(?string $namespaceOrPrefix = null, bool $isPrefix = false) - { - } - public function __construct(string $data, int $options = 0, bool $dataIsURL = false, string $namespaceOrPrefix = "", bool $isPrefix = false) - { - } - /** @return SimpleXMLElement */ - public function addChild(string $qualifiedName, ?string $value = null, ?string $namespace = null) - { - } - /** @return SimpleXMLElement */ - public function addAttribute(string $qualifiedName, ?string $value = null, ?string $namespace = null) - { - } - /** @return string */ - public function getName() - { - } - public function __toString() : string - { - } - /** @return int */ - public function count() - { - } - /** @return void */ - public function rewind() - { - } - /** @return bool */ - public function valid() - { - } - - /** @return SimpleXMLElement */ - public function current() - { - } - /** @return string|false */ - public function key() - { - } - /** @return void */ - public function next() - { - } - /** @return bool */ - public function hasChildren() - { - } - /** @return SimpleXMLElement|null */ - public function getChildren() - { - } - - public function offsetExists($offset) - { - } - - public function offsetGet($offset) - { - } - - public function offsetSet($offset, $value) - { - } - - public function offsetUnset($offset) - { - } -} - -class SimpleXMLIterator extends SimpleXMLElement -{ - -} diff --git a/vendor/vimeo/psalm/stubs/Php80.phpstub b/vendor/vimeo/psalm/stubs/Php80.phpstub deleted file mode 100644 index 001ebf17..00000000 --- a/vendor/vimeo/psalm/stubs/Php80.phpstub +++ /dev/null @@ -1,105 +0,0 @@ - $flags - */ - public function __construct(int $flags = self::TARGET_ALL) - { - } -} - -class ReflectionUnionType extends ReflectionType { - /** - * @return non-empty-list - */ - public function getTypes() {} -} - -class UnhandledMatchError extends Error {} - -/** - * @psalm-immutable - * - * @template-covariant Start of string|DateTimeInterface - * @implements IteratorAggregate - */ -class DatePeriod implements IteratorAggregate -{ - const EXCLUDE_START_DATE = 1; - /** - * @param Start $start - * @param (Start is string ? 0|self::EXCLUDE_START_DATE : DateInterval) $interval - * @param (Start is string ? never : DateTimeInterface|positive-int) $end - * @param (Start is string ? never : 0|self::EXCLUDE_START_DATE) $options - */ - public function __construct($start, $interval = 0, $end = 1, $options = 0) {} - - /** @psalm-return (Start is string ? (Traversable&Iterator) : (Traversable&Iterator)) */ - public function getIterator(): Iterator {} -} diff --git a/vendor/vimeo/psalm/stubs/Php81.phpstub b/vendor/vimeo/psalm/stubs/Php81.phpstub deleted file mode 100644 index 694e4e9c..00000000 --- a/vendor/vimeo/psalm/stubs/Php81.phpstub +++ /dev/null @@ -1,91 +0,0 @@ - - */ - public static function cases(): array; - } - - interface BackedEnum extends UnitEnum - { - public readonly int|string $value; - - /** - * @psalm-pure - */ - public static function from(string|int $value): static; - - /** - * @psalm-pure - */ - public static function tryFrom(string|int $value): ?static; - } - - class ReflectionEnum extends ReflectionClass implements Reflector - { - public function getBackingType(): ?ReflectionType; - public function getCase(string $name): ReflectionEnumUnitCase; - /** @return list */ - public function getCases(): array; - public function hasCase(string $name): bool; - public function isBacked(): bool; - } - - class ReflectionEnumUnitCase extends ReflectionClassConstant implements Reflector - { - /** - * @psalm-pure - */ - public function getEnum(): ReflectionEnum; - - /** - * @psalm-pure - */ - public function getValue(): UnitEnum; - } - - class ReflectionEnumBackedCase extends ReflectionEnumUnitCase implements Reflector - { - /** - * @psalm-pure - */ - public function getBackingValue(): int|string; - } - - class ReflectionIntersectionType extends ReflectionType { - /** - * @return non-empty-list - */ - public function getTypes() {} - } -} - -namespace FTP { - final class Connection {} -} - -namespace IMAP { - final class Connection {} -} - -namespace LDAP { - final class Connection {} - final class Result {} - final class ResultEntry {} -} - -namespace PgSql { - final class Connection {} - final class Result {} - final class Lob {} -} - -namespace PSpell { - final class Config {} - final class Dictionary {} -} diff --git a/vendor/vimeo/psalm/stubs/Reflection.phpstub b/vendor/vimeo/psalm/stubs/Reflection.phpstub deleted file mode 100644 index cfbe3ba2..00000000 --- a/vendor/vimeo/psalm/stubs/Reflection.phpstub +++ /dev/null @@ -1,148 +0,0 @@ - $name - */ -class ReflectionClass implements Reflector { - - /** - * @var class-string - */ - public $name; - - /** - * @param T|class-string|interface-string|trait-string $argument - */ - public function __construct($argument) {} - - /** - * @return class-string - */ - public function getName(): string {} - - /** - * @param mixed ...$args - * - * @return T - */ - public function newInstance(...$args): object {} - - /** - * @param array $args - * - * @return T - */ - public function newInstanceArgs(array $args): object {} - - /** - * @return T - */ - public function newInstanceWithoutConstructor(): object {} - - /** - * @return ?array - * @psalm-ignore-nullable-return - */ - public function getTraitNames(): array {} - - /** - * @since 8.0 - * @template TClass as object - * @param class-string|null $name - * @return ($name is null ? array> : array>) - */ - public function getAttributes(?string $name = null, int $flags = 0): array {} -} - -class ReflectionFunction implements Reflector -{ - /** - * @since 8.0 - * @template TClass as object - * @param class-string|null $name - * @return ($name is null ? array> : array>) - */ - public function getAttributes(?string $name = null, int $flags = 0): array {} -} - -class ReflectionProperty implements Reflector -{ - /** - * @since 8.0 - * @template TClass as object - * @param class-string|null $name - * @return ($name is null ? array> : array>) - */ - public function getAttributes(?string $name = null, int $flags = 0): array {} - - /** - * @since 7.4 - * @psalm-assert-if-true ReflectionType $this->getType() - */ - public function hasType() : bool {} - - /** - * @since 7.4 - * @psalm-mutation-free - */ - public function getType() : ?ReflectionType {} -} - -class ReflectionMethod implements Reflector -{ - /** - * @since 8.0 - * @template TClass as object - * @param class-string|null $name - * @return ($name is null ? array> : array>) - */ - public function getAttributes(?string $name = null, int $flags = 0): array {} - - public function isStatic(): bool {} -} - -class ReflectionClassConstant implements Reflector -{ - /** - * @since 8.0 - * @template TClass as object - * @param class-string|null $name - * @return ($name is null ? array> : array>) - */ - public function getAttributes(?string $name = null, int $flags = 0): array {} -} - -/** - * @psalm-immutable - */ -class ReflectionParameter implements Reflector { - /** - * @psalm-assert-if-true ReflectionType $this->getType() - */ - public function hasType() : bool {} - - public function getType() : ?ReflectionType {} - - /** - * @since 8.0 - * @template TClass as object - * @param class-string|null $name - * @return ($name is null ? array> : array>) - */ - public function getAttributes(?string $name = null, int $flags = 0): array {} -} - -/** - * @psalm-immutable - */ -class ReflectionNamedType extends ReflectionType -{ - public function getName(): string {} - - /** - * @psalm-assert-if-false class-string|'self'|'static' $this->getName() - */ - public function isBuiltin(): bool {} -} diff --git a/vendor/vimeo/psalm/stubs/SPL.phpstub b/vendor/vimeo/psalm/stubs/SPL.phpstub deleted file mode 100644 index 90c06d94..00000000 --- a/vendor/vimeo/psalm/stubs/SPL.phpstub +++ /dev/null @@ -1,972 +0,0 @@ - - * @template-implements ArrayAccess - */ -class SplDoublyLinkedList implements Iterator, Countable, ArrayAccess, Serializable -{ - public function __construct() {} - - /** - * Add/insert a new value at the specified index - * - * @param TKey $index The index where the new value is to be inserted. - * @param TValue $newval The new value for the index. - * @return void - * - * @link https://php.net/spldoublylinkedlist.add - * @since 5.5.0 - */ - public function add($index, $newval) {} - - /** - * Pops a node from the end of the doubly linked list - * @link https://php.net/manual/en/spldoublylinkedlist.pop.php - * - * @return TValue The value of the popped node. - * - * @since 5.3.0 - */ - public function pop() {} - - /** - * Shifts a node from the beginning of the doubly linked list - * @link https://php.net/manual/en/spldoublylinkedlist.shift.php - * - * @return TValue The value of the shifted node. - * - * @since 5.3.0 - */ - public function shift() {} - - /** - * Pushes an element at the end of the doubly linked list - * @link https://php.net/manual/en/spldoublylinkedlist.push.php - * - * @param TValue $value The value to push. - * @return void - * - * @since 5.3.0 - */ - public function push($value) {} - - /** - * Prepends the doubly linked list with an element - * @link https://php.net/manual/en/spldoublylinkedlist.unshift.php - * - * @param TValue $value The value to unshift. - * @return void - * - * @since 5.3.0 - */ - public function unshift($value) {} - - /** - * Peeks at the node from the end of the doubly linked list - * @link https://php.net/manual/en/spldoublylinkedlist.top.php - * - * @return TValue The value of the last node. - * - * @since 5.3.0 - */ - public function top() {} - - /** - * Peeks at the node from the beginning of the doubly linked list - * @link https://php.net/manual/en/spldoublylinkedlist.bottom.php - * - * @return TValue The value of the first node. - * - * @since 5.3.0 - */ - public function bottom() {} - - /** - * Counts the number of elements in the doubly linked list. - * @link https://php.net/manual/en/spldoublylinkedlist.count.php - * - * @return int the number of elements in the doubly linked list. - * - * @since 5.3.0 - */ - public function count() {} - - /** - * Checks whether the doubly linked list is empty. - * @link https://php.net/manual/en/spldoublylinkedlist.isempty.php - * - * @return bool whether the doubly linked list is empty. - * - * @since 5.3.0 - */ - public function isEmpty() {} - - /** - * Returns whether the requested $index exists - * @link https://php.net/manual/en/spldoublylinkedlist.offsetexists.php - * - * @param TKey $index The index being checked. - * @return bool true if the requested index exists, otherwise false - * - * @since 5.3.0 - */ - public function offsetExists($index) {} - - /** - * Returns the value at the specified $index - * @link https://php.net/manual/en/spldoublylinkedlist.offsetget.php - * - * @param TKey $index The index with the value. - * @return TValue The value at the specified index. - * - * @since 5.3.0 - */ - public function offsetGet($index) {} - - /** - * Sets the value at the specified $index to $newval - * @link https://php.net/manual/en/spldoublylinkedlist.offsetset.php - * - * @param TKey $index The index being set. - * @param TValue $newval The new value for the index. - * @return void - * - * @since 5.3.0 - */ - public function offsetSet($index, $newval) {} - - /** - * Unsets the value at the specified $index - * @link https://php.net/manual/en/spldoublylinkedlist.offsetunset.php - * - * @param TKey $index The index being unset. - * @return void - * - * @since 5.3.0 - */ - public function offsetUnset($index) {} - - /** - * Return current array entry - * @link https://php.net/manual/en/spldoublylinkedlist.current.php - * - * @return TValue The current node value. - * - * @since 5.3.0 - */ - public function current() {} - - /** - * Return current node index - * @link https://php.net/manual/en/spldoublylinkedlist.key.php - * - * @return TKey The current node index. - * - * @since 5.3.0 - */ - public function key() {} -} - -/** - * The SplFixedArray class provides the main functionalities of array. - * The main differences between a SplFixedArray and a normal PHP array is that - * the SplFixedArray is of fixed length and allows only integers within the range as indexes. - * The advantage is that it uses less memory than a standard array. - * - * @link https://php.net/manual/en/class.splfixedarray.php - * - * @template TValue - * @template-implements ArrayAccess - * @template-implements Iterator - */ -class SplFixedArray implements Iterator, ArrayAccess, Countable { - /** - * Constructs a new fixed array - * - * Initializes a fixed array with a number of NULL values equal to size. - * @link https://php.net/manual/en/splfixedarray.construct.php - * - * @param int $size The size of the fixed array. This expects a number between 0 and PHP_INT_MAX. - - * @since 5.3.0 - */ - public function __construct(int $size = 0) {} - - /** - * Import a PHP array in a new SplFixedArray instance - * @link https://php.net/manual/en/splfixedarray.fromarray.php - * - * @template TInValue - * @param array $array The array to import - * @param bool $save_indexes [optional] Try to save the numeric indexes used in the original array. - * - * @return SplFixedArray Instance of SplFixedArray containing the array content - - * @since 5.3.0 - */ - public static function fromArray(array $array, bool $save_indexes = true): SplFixedArray {} - - /** - * Returns a PHP array from the fixed array - * @link https://php.net/manual/en/splfixedarray.toarray.php - * - * @return array - - * @since 5.3.0 - */ - public function toArray(): array {} - - /** - * Returns the size of the array. - * @link https://php.net/manual/en/splfixedarray.getsize.php - * - * @return int The size of the array - - * @see SplFixedArray::count() - * - * @since 5.3.0 - */ - public function getSize(): int {} - - /** - * Returns the size of the array. - * @link https://php.net/manual/en/splfixedarray.count.php - * - * @return int The size of the array - * - * @since 5.3.0 - */ - public function count(): int {} - - /** - * Rewind the iterator back to the start - * @link https://php.net/manual/en/splfixedarray.rewind.php - * - * @return void - * - * @since 5.3.0 - */ - public function rewind(): void {} - - /** - * Check whether the array contains more elements - * @link https://php.net/manual/en/splfixedarray.valid.php - * - * @return bool true if the array contains any more elements, false otherwise. - * - * @since 5.3.0 - */ - public function valid(): bool {} - - /** - * Returns current array index - * @link https://php.net/manual/en/splfixedarray.key.php - * - * @return int The current array index - * - * @since 5.3.0 - */ - public function key(): int {} - - /** - * Returns the current array entry - * @link https://php.net/manual/en/splfixedarray.current.php - * - * @return TValue The current element value - * - * @since 5.3.0 - */ - public function current() {} - - /** - * Move to the next entry - * @link https://php.net/manual/en/splfixedarray.next.php - * - * @return void - * - * @since 5.3.0 - */ - public function next(): void {} - - /** - * Returns whether the specified index exists - * @link https://php.net/manual/en/splfixedarray.offsetexists.php - * - * @param int $index The index being checked. - * @return bool true if the requested index exists, and false otherwise. - * - * @since 5.3.0 - */ - public function offsetExists(int $index): bool {} - - /** - * Sets a new value at a specified index - * @link https://php.net/manual/en/splfixedarray.offsetset.php - * - * @param int $index The index being sent. - * @param TValue $newval The new value for the index - * @return void - * - * @since 5.3.0 - */ - public function offsetSet(int $index, $newval): void {} - - /** - * Unsets the value at the specified $index - * @link https://php.net/manual/en/splfixedarray.offsetunset.php - * - * @param int $index The index being unset - * @return void - * - * @since 5.3.0 - */ - public function offsetUnset(int $index): void {} - - /** - * Returns the value at the specified index - * @link https://php.net/manual/en/splfixedarray.offsetget.php - * - * @param int $index The index with the value - * @return TValue The value at the specified index - * - * @since 5.3.0 - */ - public function offsetGet(int $index) {} -} - - -/** - * The SplStack class provides the main functionalities of a stack implemented using a doubly linked list. - * @link https://php.net/manual/en/class.splstack.php - * - * @template TValue - * @template-extends SplDoublyLinkedList - */ -class SplStack extends SplDoublyLinkedList { -} - -/** - * The SplQueue class provides the main functionalities of a queue implemented using a doubly linked list. - * @link https://php.net/manual/en/class.splqueue.php - * - * @template TValue - * @template-extends SplDoublyLinkedList - */ -class SplQueue extends SplDoublyLinkedList { - /** - * Adds an element to the queue. - * @link https://php.net/manual/en/splqueue.enqueue.php - * - * @param TValue $value The value to enqueue. - * @return void - * - * @since 5.3.0 - */ - public function enqueue($value) {} - - /** - * Dequeues a node from the queue - * @link https://php.net/manual/en/splqueue.dequeue.php - * - * @return TValue The value of the dequeued node. - * - * @since 5.3.0 - */ - public function dequeue() {} -} - -/** - * The SplHeap class provides the main functionalities of a Heap. - * @link https://php.net/manual/en/class.splheap.php - * - * @template TValue - * @template-implements Iterator - */ -abstract class SplHeap implements Iterator, Countable { - public function __construct() {} - - /** - * Compare elements in order to place them correctly in the heap while sifting up - * @link https://php.net/manual/en/splheap.compare.php - * - * @param TValue $value1 The value of the first node being compared. - * @param TValue $value2 The value of the second node being compared. - * @return int Positive integer if value1 is greater than value2, 0 if they are equal, negative integer otherwise. - * - * @since 5.3.0 - */ - protected abstract function compare($value1, $value2): int; - - /** - * Counts the number of elements in the heap - * @link https://php.net/manual/en/splheap.count.php - * - * @return int The number of elements in the heap. - * - * @since 5.3.0 - */ - public function count(): int {} - - /** - * Get the current datastructure node. - * @link https://php.net/manual/en/splheap.current.php - * - * @return TValue The current node value - * - * @since 5.3.0 - */ - public function current() {} - - /** - * Extracts a node from top of the heap and sift up - * @link https://php.net/manual/en/splheap.extract.php - * - * @return TValue The current node value - * - * @since 5.3.0 - */ - public function extract() {} - - /** - * Inserts an element in the heap by sifting it up - * @link https://php.net/manual/en/splheap.insert.php - * - * @param TValue $value The value to insert. - * @return void - * - * @since 5.3.0 - */ - public function insert($value): void {} - - /** - * Tells if the heap is in a corrupted state - * @link https://php.net/manual/en/splheap.isCorrupted.php - * - * @return bool true if the heap is corrupted, false otherwise. - * - * @since 7.0.0 - */ - public function isCorrupted(): bool {} - - /** - * Checks whether the heap is empty - * @link https://php.net/manual/en/splheap.isEmpty.php - * - * @return bool Whether the heap is empty - * - * @since 5.3.0 - */ - public function isEmpty(): bool {} - - /** - * Return current node index - * @link https://php.net/manual/en/splheap.key.php - * - * @return int The current node index - * - * @since 5.3.0 - */ - public function key() {} - - /** - * Move to the next node. This will delete the top node of the heap. - * @link https://php.net/manual/en/splheap.next.php - * - * @return void - * - * @since 5.3.0 - */ - public function next(): void {} - - /** - * Recover from the corrupted state and allow further actions on the heap - * @link https://php.net/manual/en/splheap.recoverFromCorruption.php - * - * @return void - * - * @since 5.3.0 - */ - public function recoverFromCorruption(): void {} - - /** - * Rewind iterator back to the start (no-op) - * @link https://php.net/manual/en/splheap.rewind.php - * - * @return void - * - * @since 5.3.0 - */ - public function rewind(): void {} - - /** - * Peeks at the node from the top of the heap - * @link https://php.net/manual/en/splheap.top.php - * - * @return TValue The value of the node on the top. - * - * @since 5.3.0 - */ - public function top() {} - - /** - * Check whether the heap contains any more nodes - * @link https://php.net/manual/en/splheap.valid.php - * - * @return bool Returns true if the heap contains any more nodes, false otherwise. - * - * @since 5.3.0 - */ - public function valid(): bool {} -} - - -/** - * The SplMaxHeap class provides the main functionalities of a heap, keeping the maximum on the top. - * @link https://php.net/manual/en/class.splmaxheap.php - * - * @template TValue - * @template-extends SplHeap - */ -class SplMaxHeap extends SplHeap { -} - -/** - * The SplMinHeap class provides the main functionalities of a heap, keeping the maximum on the top. - * @link https://php.net/manual/en/class.splminheap.php - * - * @template TValue - * @template-extends SplHeap - */ -class SplMinHeap extends SplHeap { -} - -/** - * The SplPriorityQueue class provides the main functionalities of a prioritized queue, implemented using a max heap. - * @link https://php.net/manual/en/class.splpriorityqueue.php - * - * @template TPriority - * @template TValue - * @template-implements Iterator - */ -class SplPriorityQueue implements Iterator, Countable { - /** - * Extract the data - */ - const EXTR_DATA = 0x00000001; - /** - * Extract the priority - */ - const EXTR_PRIORITY = 0x00000002; - /** - * Extract an array containing both - */ - const EXTR_BOTH = 0x00000003; - - public function __construct() {} - - /** - * Compare priorities in order to place them correctly in the queue while sifting up - * @link https://php.net/manual/en/splpriorityqueue.compare.php - * - * @param TValue $priority1 The priority of the first node being compared. - * @param TValue $priority2 The priority of the second node being compared. - * @return int Positive integer if priority1 is greater than priority2, 0 if they are equal, negative integer otherwise. - * - * @since 5.3.0 - */ - public function compare($priority1, $priority2): int {} - - /** - * Counts the number of elements in the queue - * @link https://php.net/manual/en/splpriorityqueue.count.php - * - * @return int The number of elements in the queue. - * - * @since 5.3.0 - */ - public function count(): int {} - - /** - * Get the current datastructure node. - * @link https://php.net/manual/en/splpriorityqueue.current.php - * - * @return TValue The current node value - * - * @since 5.3.0 - */ - public function current() {} - - /** - * Extracts a node from top of the queue and sift up - * @link https://php.net/manual/en/splpriorityqueue.extract.php - * - * @return TValue The current node value - * - * @since 5.3.0 - */ - public function extract() {} - - /** - * Get the flags of extraction - * @link https://php.net/manual/en/splpriorityqueue.getextractflags.php - * - * @return SplPriorityQueue::EXTR_* Returns the current extraction mode - * - * @see SplPriorityQueue::setExtractFlags - * - * @since 5.3.0 - */ - public function getExtractFlags(): int {} - - /** - * Inserts an element in the queue by sifting it up - * @link https://php.net/manual/en/splpriorityqueue.insert.php - * - * @param TValue $value The value to insert. - * @param TPriority $priority The associated priority. - * @return true - * - * @since 5.3.0 - */ - public function insert($value, $priority): bool {} - - /** - * Tells if the queue is in a corrupted state - * @link https://php.net/manual/en/splpriorityqueue.isCorrupted.php - * - * @return bool true if the queue is corrupted, false otherwise. - * - * @since 7.0.0 - */ - public function isCorrupted(): bool {} - - /** - * Checks whether the queue is empty - * @link https://php.net/manual/en/splpriorityqueue.isEmpty.php - * - * @return bool Whether the queue is empty - * - * @since 5.3.0 - */ - public function isEmpty(): bool {} - - /** - * Return current node index - * @link https://php.net/manual/en/splpriorityqueue.key.php - * - * @return int The current node index - * - * @since 5.3.0 - */ - public function key() {} - - /** - * Move to the next node. - * @link https://php.net/manual/en/splpriorityqueue.next.php - * - * @return void - * - * @since 5.3.0 - */ - public function next(): void {} - - /** - * Recover from the corrupted state and allow further actions on the queue - * @link https://php.net/manual/en/splpriorityqueue.recoverFromCorruption.php - * - * @return void - * - * @since 5.3.0 - */ - public function recoverFromCorruption(): void {} - - /** - * Rewind iterator back to the start (no-op) - * @link https://php.net/manual/en/splpriorityqueue.rewind.php - * - * @return void - * - * @since 5.3.0 - */ - public function rewind(): void {} - - /** - * Sets the mode of extraction - * @link https://php.net/manual/en/splpriorityqueue.setextractflags.php - * - * @param SplPriorityQueue::EXTR_* $flags Defines what is extracted by SplPriorityQueue::current(), SplPriorityQueue::top() and SplPriorityQueue::extract(). - * - * @return void - * - * @since 5.3.0 - */ - public function setExtractFlags(int $flags): void {} - - /** - * Peeks at the node from the top of the queue - * @link https://php.net/manual/en/splpriorityqueue.top.php - * - * @return TValue The value of the node on the top. - * - * @since 5.3.0 - */ - public function top() {} - - /** - * Check whether the queue contains any more nodes - * @link https://php.net/manual/en/splpriorityqueue.valid.php - * - * @return bool Returns true if the queue contains any more nodes, false otherwise. - * - * @since 5.3.0 - */ - public function valid(): bool {} -} - - -/** - * The SplObjectStorage class provides a map from objects to data or, by - * ignoring data, an object set. This dual purpose can be useful in many - * cases involving the need to uniquely identify objects. - * @link https://php.net/manual/en/class.splobjectstorage.php - * - * @template TObject as object - * @template TArrayValue - * @template-implements ArrayAccess - * @template-implements Iterator - */ -class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess { - public function __construct() {} - - /** - * Adds an object in the storage - * @link https://php.net/manual/en/splobjectstorage.attach.php - * - * @param TObject $object The object to add. - * @param TArrayValue|null $data [optional] The data to associate with the object. - * @return void - * - * @since 5.1.0 - */ - public function attach($object, $data = null) {} - - /** - * Removes an object from the storage - * @link https://php.net/manual/en/splobjectstorage.detach.php - * - * @param TObject $object The object to remove. - * @return void - * - * @since 5.1.0 - */ - public function detach($object) {} - - /** - * Checks if the storage contains a specific object - * @link https://php.net/manual/en/splobjectstorage.contains.php - * - * @param TObject $object The object to look for. - * @return bool true if the object is in the storage, false otherwise. - * - * @since 5.1.0 - */ - public function contains($object) {} - - /** - * Adds all objects from another storage - * @link https://php.net/manual/en/splobjectstorage.addall.php - * - * @param SplObjectStorage $storage The storage you want to import. - * @return void - * - * @since 5.3.0 - */ - public function addAll($storage) {} - - /** - * Removes objects contained in another storage from the current storage - * @link https://php.net/manual/en/splobjectstorage.removeall.php - * - * @param SplObjectStorage $storage The storage containing the elements to remove. - * @return void - * - * @since 5.3.0 - */ - public function removeAll($storage) {} - - /** - * Removes all objects except for those contained in another storage from the current storage - * @link https://php.net/manual/en/splobjectstorage.removeallexcept.php - * - * @param SplObjectStorage $storage The storage containing the elements to retain in the current storage. - * @return void - * - * @since 5.3.6 - */ - public function removeAllExcept($storage) {} - - /** - * Returns the data associated with the current iterator entry - * @link https://php.net/manual/en/splobjectstorage.getinfo.php - * - * @return TArrayValue The data associated with the current iterator position. - * - * @since 5.3.0 - */ - public function getInfo() {} - - /** - * Sets the data associated with the current iterator entry - * @link https://php.net/manual/en/splobjectstorage.setinfo.php - * - * @param TArrayValue $data The data to associate with the current iterator entry. - * @return void - * - * @since 5.3.0 - */ - public function setInfo($data) {} - - /** - * Returns the number of objects in the storage - * @link https://php.net/manual/en/splobjectstorage.count.php - * - * @return int The number of objects in the storage. - * - * @since 5.1.0 - */ - public function count() {} - - /** - * Rewind the iterator to the first storage element - * @link https://php.net/manual/en/splobjectstorage.rewind.php - * - * @return void - * - * @since 5.1.0 - */ - public function rewind() {} - - /** - * Returns if the current iterator entry is valid - * @link https://php.net/manual/en/splobjectstorage.valid.php - * - * @return bool true if the iterator entry is valid, false otherwise. - * - * @since 5.1.0 - */ - public function valid() {} - - /** - * Returns the index at which the iterator currently is - * @link https://php.net/manual/en/splobjectstorage.key.php - * - * @return int The index corresponding to the position of the iterator. - * - * @since 5.1.0 - */ - public function key() {} - - /** - * Returns the current storage entry - * @link https://php.net/manual/en/splobjectstorage.current.php - * - * @return TObject The object at the current iterator position. - * - * @since 5.1.0 - */ - public function current() {} - - /** - * Move to the next entry - * @link https://php.net/manual/en/splobjectstorage.next.php - * - * @return void - * - * @since 5.1.0 - */ - public function next() {} - - /** - * Unserializes a storage from its string representation - * @link https://php.net/manual/en/splobjectstorage.unserialize.php - * - * @param string $serialized The serialized representation of a storage. - * @return void - * - * @since 5.2.2 - */ - public function unserialize($serialized) {} - - /** - * Serializes the storage - * @link https://php.net/manual/en/splobjectstorage.serialize.php - * - * @return string A string representing the storage. - * - * @since 5.2.2 - */ - public function serialize() {} - - /** - * Checks whether an object exists in the storage - * @link https://php.net/manual/en/splobjectstorage.offsetexists.php - * - * @param TObject $object The object to look for. - * @return bool true if the object exists in the storage, and false otherwise. - * - * @since 5.3.0 - */ - public function offsetExists($object) {} - - /** - * Associates data to an object in the storage - * @link https://php.net/manual/en/splobjectstorage.offsetset.php - * - * @param TObject $object The object to associate data with. - * @param TArrayValue|null $data [optional] The data to associate with the object. - * @return void - * - * @since 5.3.0 - */ - public function offsetSet($object, $data = null) {} - - /** - * Removes an object from the storage - * @link https://php.net/manual/en/splobjectstorage.offsetunset.php - * - * @param TObject $object The object to remove. - * @return void - * - * @since 5.3.0 - */ - public function offsetUnset($object) {} - - /** - * Returns the data associated with an object - * @link https://php.net/manual/en/splobjectstorage.offsetget.php - * - * @param TObject $object The object to look for. - * @return TArrayValue The data previously associated with the object in the storage. - * - * @since 5.3.0 - */ - public function offsetGet($object) {} - - /** - * Calculate a unique identifier for the contained objects - * @link https://php.net/manual/en/splobjectstorage.gethash.php - * - * @param object $object object whose identifier is to be calculated. - * @return string A string with the calculated identifier. - * - * @since 5.4.0 - */ - public function getHash($object) {} - -} diff --git a/vendor/vimeo/psalm/stubs/Xdebug.phpstub b/vendor/vimeo/psalm/stubs/Xdebug.phpstub deleted file mode 100644 index 8c479cee..00000000 --- a/vendor/vimeo/psalm/stubs/Xdebug.phpstub +++ /dev/null @@ -1,43 +0,0 @@ -> -*/ -function xdebug_get_code_coverage() : array -{ -} - -/** -* @param array $configuration -*/ -function xdebug_set_filter(int $group, int $list_type, array $configuration) : array -{ -} - -function xdebug_start_code_coverage(int $options) : void -{ -} - -function xdebug_stop_code_coverage(int $cleanup = 1) : void -{ -} diff --git a/vendor/vimeo/psalm/stubs/decimal.phpstub b/vendor/vimeo/psalm/stubs/decimal.phpstub deleted file mode 100644 index 90b329da..00000000 --- a/vendor/vimeo/psalm/stubs/decimal.phpstub +++ /dev/null @@ -1,492 +0,0 @@ -` operator. - * - * @param mixed $other - * - * @return int 0 if this decimal is considered is equal to $other, - * -1 if this decimal should be placed before $other, - * 1 if this decimal should be placed after $other. - */ - public function compareTo($other): int {} - - /** - * String representation. - * - * This method is equivalent to a cast to string, as well as `toString`. - * - * @return string the value of this decimal represented exactly, in either - * fixed or scientific form, depending on the value. - */ - public function __toString(): string {} - - /** - * JSON - * - * This method is only here to honour the interface, and is equivalent to - * `toString`. JSON does not have a decimal type so all decimals are encoded - * as strings in the same format as `toString`. - * - * @return string - */ - public function jsonSerialize() {} -} diff --git a/vendor/vimeo/psalm/stubs/ext-apcu.phpstub b/vendor/vimeo/psalm/stubs/ext-apcu.phpstub deleted file mode 100644 index 76450846..00000000 --- a/vendor/vimeo/psalm/stubs/ext-apcu.phpstub +++ /dev/null @@ -1,92 +0,0 @@ -|null|string $search - * @param int $format - * @param int $chunk_size - * @param int $list - * - * @return void - */ - public function __construct($search, $format = APC_ITER_ALL, $chunk_size = 100, $list = APC_LIST_ACTIVE) - { - } - - /** - * @return void - */ - public function rewind() - { - } - - /** - * @return void - */ - public function next() - { - } - - /** - * @return bool - */ - public function valid() - { - } - - /** - * @return string - */ - public function key() - { - } - - /** - * @return mixed - */ - public function current() - { - } - - /** - * @return int - */ - public function getTotalHits() - { - } - - /** - * @return int - */ - public function getTotalSize() - { - } - - /** - * @return int - */ - public function getTotalCount() - { - } -} diff --git a/vendor/vimeo/psalm/stubs/ext-ds.phpstub b/vendor/vimeo/psalm/stubs/ext-ds.phpstub deleted file mode 100644 index 04eef4dc..00000000 --- a/vendor/vimeo/psalm/stubs/ext-ds.phpstub +++ /dev/null @@ -1,1434 +0,0 @@ - - */ -interface Collection extends Traversable, Countable, JsonSerializable -{ - /** - * @return Collection - * @psalm-mutation-free - */ - public function copy(): Collection; - - /** - * @return array - * @psalm-mutation-free - */ - public function toArray(): array; - - /** - * @psalm-mutation-free - */ - public function isEmpty(): bool; - - /** - * @psalm-mutation-free - */ - public function count(): int; -} - -/** - * @template TValue - * @implements Sequence - */ -final class Deque implements Sequence -{ - /** - * @param iterable $values - */ - public function __construct(iterable $values = []) - { - } - - /** - * @return Deque - * @psalm-mutation-free - */ - public function copy(): Deque - { - } - - /** - * @return list - * @psalm-mutation-free - */ - public function toArray(): array - { - } - - /** - * @psalm-mutation-free - */ - public function isEmpty(): bool - { - } - - /** - * @psalm-mutation-free - */ - public function count(): int - { - } - - /** - * @psalm-mutation-free - */ - public function allocate(int $capacity): void - { - } - - /** - * @psalm-mutation-free - */ - public function capacity(): int - { - } - - /** - * @return float|int - * @psalm-mutation-free - */ - public function sum() - { - } - - /** - * @param TValue ...$values - * @psalm-mutation-free - */ - public function contains(...$values): bool - { - } - - /** - * @param (callable(TValue): bool)|null $callback - * @return Deque - * @psalm-mutation-free - */ - public function filter(callable $callback = null): Deque - { - } - - /** - * @param TValue $value - * @return int|false - * @psalm-mutation-free - */ - public function find($value) - { - } - - /** - * @return TValue - * @throws \UnderflowException - * @psalm-mutation-free - */ - public function first() - { - } - - /** - * @return TValue - * @throws \OutOfRangeException - * @psalm-mutation-free - */ - public function get(int $index) - { - } - - /** - * @psalm-mutation-free - */ - public function join(?string $glue = null): string - { - } - - /** - * @return TValue - * @throws \UnderflowException - * @psalm-mutation-free - */ - public function last() - { - } - - /** - * @template TNewValue - * @param callable(TValue): TNewValue $callback - * @return Deque - * @psalm-mutation-free - */ - public function map(callable $callback): Deque - { - } - - /** - * @template TValue2 - * @param iterable $values - * @return Deque - * @psalm-mutation-free - */ - public function merge(iterable $values): Deque - { - } - - /** - * @return TValue - * @throws \UnderflowException - */ - public function pop() - { - } - - /** - * @template TCarry - * @param callable(TCarry, TValue): TCarry $callback - * @param TCarry $initial - * @return TCarry - * @psalm-mutation-free - */ - public function reduce(callable $callback, $initial = null) - { - } - - /** - * @return TValue - * @throws \OutOfRangeException - */ - public function remove(int $index) - { - } - - /** - * @return Deque - * @psalm-mutation-free - */ - public function reversed(): Deque - { - } - - /** - * @return TValue - * @throws \UnderflowException - */ - public function shift() - { - } - - /** - * @return Deque - * @psalm-mutation-free - */ - public function slice(int $offset, ?int $length = null): Deque - { - } - - /** - * @param (callable(TValue, TValue): int)|null $comparator - * @return Deque - * @psalm-mutation-free - */ - public function sorted(callable $comparator = null): Deque - { - } -} - -/** - * @template TKey - * @template TValue - * @implements Collection - * @implements ArrayAccess - */ -final class Map implements Collection, ArrayAccess -{ - /** - * @param iterable $values - */ - public function __construct(iterable $values = []) - { - } - - /** - * @psalm-mutation-free - */ - public function allocate(int $capacity): void - { - } - - /** - * @psalm-mutation-free - */ - public function capacity(): int - { - } - - /** - * @return Map - * @psalm-mutation-free - */ - public function copy(): Map - { - } - - /** - * @return array - * @psalm-mutation-free - */ - public function toArray(): array - { - } - - /** - * @psalm-mutation-free - */ - public function isEmpty(): bool - { - } - - /** - * @psalm-mutation-free - */ - public function count(): int - { - } - - /** - * @param callable(TKey, TValue): TValue $callback - */ - public function apply(callable $callback): void - { - } - - /** - * @return Pair - * @throws UnderflowException - * @psalm-mutation-free - */ - public function first(): Pair - { - } - - /** - * @return Pair - * @throws UnderflowException - * @psalm-mutation-free - */ - public function last(): Pair - { - } - - /** - * @return Pair - * @throws OutOfRangeException - * @psalm-mutation-free - */ - public function skip(int $position): Pair - { - } - - /** - * @template TKey2 - * @template TValue2 - * @param iterable $values - * @return Map - * @psalm-mutation-free - */ - public function merge(iterable $values): Map - { - } - - /** - * @template TKey2 - * @template TValue2 - * @param Map $map - * @return Map - * @psalm-mutation-free - */ - public function intersect(Map $map): Map - { - } - - /** - * @template TValue2 - * @param Map $map - * @return Map - * @psalm-mutation-free - */ - public function diff(Map $map): Map - { - } - - /** - * @param TKey $key - * @psalm-mutation-free - */ - public function hasKey($key): bool - { - } - - /** - * @param TValue $value - * @psalm-mutation-free - */ - public function hasValue($value): bool - { - } - - /** - * @param (callable(TKey, TValue): bool)|null $callback - * @return Map - * @psalm-mutation-free - */ - public function filter(callable $callback = null): Map - { - } - - /** - * @template TDefault - * @param TKey $key - * @param TDefault $default - * @return ( - * func_num_args() is 1 - * ? TValue - * : TValue|TDefault - * ) - * @throws OutOfBoundsException - * @psalm-mutation-free - */ - public function get($key, $default = null) - { - } - - /** - * @return Set - * @psalm-mutation-free - */ - public function keys(): Set - { - } - - /** - * @template TNewValue - * @param callable(TKey, TValue): TNewValue $callback - * @return Map - * @psalm-mutation-free - */ - public function map(callable $callback): Map - { - } - - /** - * @return Sequence> - * @psalm-mutation-free - */ - public function pairs(): Sequence - { - } - - /** - * @param TKey $key - * @param TValue $value - */ - public function put($key, $value) - { - } - - /** - * @param iterable $values - */ - public function putAll(iterable $values) - { - } - - /** - * @template TCarry - * @param callable(TCarry, TKey, TValue): TCarry $callback - * @param TCarry $initial - * @return TCarry - * @psalm-mutation-free - */ - public function reduce(callable $callback, $initial = null) - { - } - - /** - * @template TDefault - * @param TKey $key - * @param TDefault $default - * @return ( - * func_num_args() is 1 - * ? TValue - * : TValue|TDefault - * ) - * @throws \OutOfBoundsException - */ - public function remove($key, $default = null) - { - } - - /** - * @return Map - * @psalm-mutation-free - */ - public function reversed(): Map - { - } - - /** - * @return Map - * @psalm-mutation-free - */ - public function slice(int $offset, ?int $length = null): Map - { - } - - /** - * @param (callable(TValue, TValue): int)|null $comparator - */ - public function sort(callable $comparator = null) - { - } - - /** - * @param (callable(TValue, TValue): int)|null $comparator - * @return Map - * @psalm-mutation-free - */ - public function sorted(callable $comparator = null): Map - { - } - - /** - * @param (callable(TKey, TKey): int)|null $comparator - */ - public function ksort(callable $comparator = null) - { - } - - /** - * @param (callable(TKey, TKey): int)|null $comparator - * @return Map - * @psalm-mutation-free - */ - public function ksorted(callable $comparator = null): Map - { - } - - /** - * @return Sequence - * @psalm-mutation-free - */ - public function values(): Sequence - { - } - - /** - * @template TKey2 - * @template TValue2 - * @param Map $map - * @return Map - * @psalm-mutation-free - */ - public function union(Map $map): Map - { - } - - /** - * @template TKey2 - * @template TValue2 - * @param Map $map - * @return Map - * @psalm-mutation-free - */ - public function xor(Map $map): Map - { - } -} - -/** - * @template-covariant TKey - * @template-covariant TValue - */ -final class Pair implements JsonSerializable -{ - /** - * @var TKey - */ - public $key; - - /** - * @var TValue - */ - public $value; - - /** - * @param TKey $key - * @param TValue $value - */ - public function __construct($key = null, $value = null) - { - } - - /** - * @return Pair - * @psalm-mutation-free - */ - public function copy(): Pair - { - } -} - -/** - * @template TValue - * @extends Collection - * @extends ArrayAccess - */ -interface Sequence extends Collection, ArrayAccess -{ - /** - * @return Sequence - * @psalm-mutation-free - */ - public function copy(): Sequence; - - /** - * @return list - * @psalm-mutation-free - */ - public function toArray(): array; - - /** - * @psalm-mutation-free - */ - public function isEmpty(): bool; - - /** - * @psalm-mutation-free - */ - public function count(): int; - - /** - * @psalm-mutation-free - */ - public function allocate(int $capacity): void; - - /** - * @psalm-mutation-free - */ - public function capacity(): int; - - /** - * @return float|int - * @psalm-mutation-free - */ - public function sum(); - - /** - * @param callable(TValue): TValue $callback - */ - public function apply(callable $callback): void; - - /** - * @param TValue ...$values - * @psalm-mutation-free - */ - public function contains(...$values): bool; - - /** - * @param (callable(TValue): bool)|null $callback - * @return Sequence - * @psalm-mutation-free - */ - public function filter(callable $callback = null): Sequence; - - /** - * @param TValue $value - * @return int|false - * @psalm-mutation-free - */ - public function find($value); - - /** - * @return TValue - * @throws \UnderflowException - * @psalm-mutation-free - */ - public function first(); - - /** - * @return TValue - * @throws \OutOfRangeException - * @psalm-mutation-free - */ - public function get(int $index); - - /** - * @param TValue ...$values - * @throws \OutOfRangeException - */ - public function insert(int $index, ...$values); - - /** - * @psalm-mutation-free - */ - public function join(?string $glue = null): string; - - /** - * @return TValue - * @throws \UnderflowException - * @psalm-mutation-free - */ - public function last(); - - /** - * @template TNewValue - * @param callable(TValue): TNewValue $callback - * @return Sequence - * @psalm-mutation-free - */ - public function map(callable $callback): Sequence; - - /** - * @template TValue2 - * @param iterable $values - * @return Sequence - * @psalm-mutation-free - */ - public function merge(iterable $values): Sequence; - - /** - * @return TValue - * @throws \UnderflowException - */ - public function pop(); - - /** - * @param TValue ...$values - */ - public function push(...$values); - - /** - * @template TCarry - * @param callable(TCarry, TValue): TCarry $callback - * @param TCarry $initial - * @return TCarry - * @psalm-mutation-free - */ - public function reduce(callable $callback, $initial = null); - - /** - * @return TValue - * @throws \OutOfRangeException - */ - public function remove(int $index); - - /** - * @return Sequence - * @psalm-mutation-free - */ - public function reversed(): Sequence; - - /** - * @param TValue $value - * @throws \OutOfRangeException - */ - public function set(int $index, $value); - - /** - * @return TValue - * @throws \UnderflowException - */ - public function shift(); - - /** - * @return Sequence - * @psalm-mutation-free - */ - public function slice(int $index, ?int $length = null): Sequence; - - /** - * @param (callable(TValue, TValue): int)|null $comparator - */ - public function sort(callable $comparator = null); - - /** - * @param (callable(TValue, TValue): int)|null $comparator - * @return Sequence - * @psalm-mutation-free - */ - public function sorted(callable $comparator = null): Sequence; - - /** - * @param TValue ...$values - */ - public function unshift(...$values); -} - - -/** - * @template TValue - * @implements Sequence - */ -final class Vector implements Sequence -{ - /** - * @param iterable $values - */ - public function __construct(iterable $values = []) - { - } - - /** - * @return Vector - * @psalm-mutation-free - */ - public function copy(): Vector - { - } - - /** - * @return list - * @psalm-mutation-free - */ - public function toArray(): array - { - } - - /** - * @psalm-mutation-free - */ - public function isEmpty(): bool - { - } - - /** - * @psalm-mutation-free - */ - public function count(): int - { - } - - /** - * @psalm-mutation-free - */ - public function allocate(int $capacity): void - { - } - - /** - * @psalm-mutation-free - */ - public function capacity(): int - { - } - - /** - * @return float|int - * @psalm-mutation-free - */ - public function sum() - { - } - - /** - * @param TValue ...$values - * @psalm-mutation-free - */ - public function contains(...$values): bool - { - } - - /** - * @param (callable(TValue): bool)|null $callback - * @return Vector - * @psalm-mutation-free - */ - public function filter(callable $callback = null): Vector - { - } - - /** - * @param TValue $value - * @return int|false - * @psalm-mutation-free - */ - public function find($value) - { - } - - /** - * @return TValue - * @throws \UnderflowException - * @psalm-mutation-free - */ - public function first() - { - } - - /** - * @return TValue - * @throws \OutOfRangeException - * @psalm-mutation-free - */ - public function get(int $index) - { - } - - /** - * @psalm-mutation-free - */ - public function join(?string $glue = null): string - { - } - - /** - * @return TValue - * @throws \UnderflowException - * @psalm-mutation-free - */ - public function last() - { - } - - /** - * @template TNewValue - * @param callable(TValue): TNewValue $callback - * @return Vector - * @psalm-mutation-free - */ - public function map(callable $callback): Vector - { - } - - /** - * @template TValue2 - * @param iterable $values - * @return Vector - * @psalm-mutation-free - */ - public function merge(iterable $values): Sequence - { - } - - /** - * @return TValue - * @throws \UnderflowException - */ - public function pop() - { - } - - /** - * @template TCarry - * @param callable(TCarry, TValue): TCarry $callback - * @param TCarry $initial - * @return TCarry - * @psalm-mutation-free - */ - public function reduce(callable $callback, $initial = null) - { - } - - /** - * @return TValue - * @throws \OutOfRangeException - */ - public function remove(int $index) - { - } - - /** - * @return Vector - * @psalm-mutation-free - */ - public function reversed(): Vector - { - } - - /** - * @return TValue - * @throws \UnderflowException - */ - public function shift() - { - } - - /** - * @return Vector - * @psalm-mutation-free - */ - public function slice(int $offset, ?int $length = null): Vector - { - } - - /** - * @param (callable(TValue, TValue): int)|null $comparator - * @return Vector - * @psalm-mutation-free - */ - public function sorted(callable $comparator = null): Vector - { - } -} - -/** - * @template TValue - * @implements Collection - * @implements ArrayAccess - */ -final class Set implements Collection, ArrayAccess -{ - /** - * @param iterable $values - */ - public function __construct(iterable $values = []) - { - } - - /** - * @return Set - * @psalm-mutation-free - */ - public function copy(): Set - { - } - - /** - * @return list - * @psalm-mutation-free - */ - public function toArray(): array - { - } - - /** - * @psalm-mutation-free - */ - public function isEmpty(): bool - { - } - - /** - * @psalm-mutation-free - */ - public function count(): int - { - } - - /** - * @psalm-mutation-free - */ - public function allocate(int $capacity): void - { - } - - /** - * @psalm-mutation-free - */ - public function capacity(): int - { - } - - /** - * @param TValue ...$values - */ - public function add(...$values): void - { - } - - /** - * @param TValue ...$values - * @psalm-mutation-free - */ - public function contains(...$values): bool - { - } - - /** - * @template TValue2 - * @param Set $set - * @return Set - * @psalm-mutation-free - */ - public function diff(Set $set): Set - { - } - - /** - * @param (callable(TValue): bool)|null $callback - * @return Set - * @psalm-mutation-free - */ - public function filter(callable $callback = null): Set - { - } - - /** - * @return TValue - * @throws \UnderflowException - * @psalm-mutation-free - */ - public function first() - { - } - - /** - * @return TValue - * @throws \OutOfRangeException - * @psalm-mutation-free - */ - public function get(int $index) - { - } - - /** - * @template TValue2 - * @param Set $set - * @return Set - * @psalm-mutation-free - */ - public function intersect(Set $set): Set - { - } - - /** - * @return TValue - * @throws \UnderflowException - * @psalm-mutation-free - */ - public function last() - { - } - - /** - * @template TNewValue - * @param callable(TValue): TNewValue $callback - * @return Set - */ - public function map(callable $callback): Set - { - } - - /** - * @template TValue2 - * @param iterable $values - * @return Set - * @psalm-mutation-free - */ - public function merge(iterable $values): Set - { - } - - /** - * @param TValue ...$values - */ - public function remove(...$values): void - { - } - - /** - * @return Set - * @psalm-mutation-free - */ - public function reversed(): Set - { - } - - /** - * @return Set - * @psalm-mutation-free - */ - public function slice(int $index, ?int $length = null): Set - { - } - - /** - * @param (callable(TValue, TValue): int)|null $comparator - */ - public function sort(callable $comparator = null): void - { - } - - /** - * @param (callable(TValue, TValue): int)|null $comparator - * @return Set - * @psalm-mutation-free - */ - public function sorted(callable $comparator = null): Set - { - } - - /** - * @template TValue2 - * @param Set $set - * @return Set - * @psalm-mutation-free - */ - public function union(Set $set): Set - { - } - - /** - * @template TValue2 - * @param Set $set - * @return Set - * @psalm-mutation-free - */ - public function xor(Set $set): Set - { - } -} - -/** - * @template TValue - * @implements Collection - * @implements ArrayAccess - */ -final class Stack implements Collection, ArrayAccess -{ - /** - * @param iterable $values - */ - public function __construct(iterable $values = []) - { - } - - /** - * @return Stack - * @psalm-mutation-free - */ - public function copy(): Stack - { - } - - /** - * @return list - * @psalm-mutation-free - */ - public function toArray(): array - { - } - - /** - * @psalm-mutation-free - */ - public function isEmpty(): bool - { - } - - /** - * @psalm-mutation-free - */ - public function count(): int - { - } - - /** - * @psalm-mutation-free - */ - public function allocate(int $capacity): void - { - } - - /** - * @psalm-mutation-free - */ - public function capacity(): int - { - } - - /** - * @return TValue - * @throws UnderflowException - * @psalm-mutation-free - */ - public function peek() - { - } - - /** - * @return TValue - * @throws UnderflowException - */ - public function pop() - { - } - - /** - * @param TValue ...$values - */ - public function push(...$values): void - { - } -} - -/** - * @template TValue - * @implements Collection - * @implements ArrayAccess - */ -final class Queue implements Collection, ArrayAccess -{ - /** - * @param iterable $values - */ - public function __construct(iterable $values = []) - { - } - - /** - * @return Queue - * @psalm-mutation-free - */ - public function copy(): Queue - { - } - - /** - * @return list - * @psalm-mutation-free - */ - public function toArray(): array - { - } - - /** - * @psalm-mutation-free - */ - public function isEmpty(): bool - { - } - - /** - * @psalm-mutation-free - */ - public function count(): int - { - } - - /** - * @psalm-mutation-free - */ - public function allocate(int $capacity): void - { - } - - /** - * @psalm-mutation-free - */ - public function capacity(): int - { - } - - /** - * @return TValue - * @throws UnderflowException - * @psalm-mutation-free - */ - public function peek() - { - } - - /** - * @return TValue - * @throws UnderflowException - */ - public function pop() - { - } - - /** - * @param TValue ...$values - */ - public function push(...$values): void - { - } -} - -/** - * @template TValue - * @implements Collection - */ -final class PriorityQueue implements Collection -{ - /** - * @return PriorityQueue - * @psalm-mutation-free - */ - public function copy(): PriorityQueue - { - } - - /** - * @return list - * @psalm-mutation-free - */ - public function toArray(): array - { - } - - /** - * @psalm-mutation-free - */ - public function isEmpty(): bool - { - } - - /** - * @psalm-mutation-free - */ - public function count(): int - { - } - - /** - * @psalm-mutation-free - */ - public function allocate(int $capacity): void - { - } - - /** - * @psalm-mutation-free - */ - public function capacity(): int - { - } - - /** - * @return TValue - * @throws UnderflowException - * @psalm-mutation-free - */ - public function peek() - { - } - - /** - * @return TValue - * @throws UnderflowException - */ - public function pop() - { - } - - /** - * @param TValue $value - */ - public function push($value, int $priority): void - { - } -} diff --git a/vendor/vimeo/psalm/stubs/ext-geos.phpstub b/vendor/vimeo/psalm/stubs/ext-geos.phpstub deleted file mode 100644 index 387d1c78..00000000 --- a/vendor/vimeo/psalm/stubs/ext-geos.phpstub +++ /dev/null @@ -1,25 +0,0 @@ - - */ -interface CursorInterface extends Traversable -{ - /** - * @return array - */ - public function toArray(); -} - -/** - * @template-covariant TValue of array|object - * - * @template-implements Iterator - * @template-implements CursorInterface - */ -final class Cursor implements CursorInterface, Iterator -{ - /** - * @return TValue - */ - public function current() {} - - /** - * @return void - */ - public function next() {} - - /** - * @return int - */ - public function key() {} - - /** - * @return bool - */ - public function valid() {} - - /** - * @return void - */ - public function rewind() {} - - /** - * @return array - */ - public function toArray() {} -} diff --git a/vendor/vimeo/psalm/stubs/mysqli.phpstub b/vendor/vimeo/psalm/stubs/mysqli.phpstub deleted file mode 100644 index a5ec2f54..00000000 --- a/vendor/vimeo/psalm/stubs/mysqli.phpstub +++ /dev/null @@ -1,33 +0,0 @@ - - */ -class mysqli_result implements Traversable -{ - /** - * @psalm-taint-sink callable $class - * - * @template T of object - * @param class-string $class - * @param array $constructor_args - * @return T|null|false - */ - function fetch_object(string $class = stdClass::class, array $constructor_args = []): object|false|null {} -} - - -/** - * @psalm-taint-sink callable $class - * - * @template T of object - * @template TValue - * - * @param mysqli_result $result - * @param class-string $class - * @param array $constructor_args - * @return T|null|false - */ -function mysqli_fetch_object(mysqli_result $result, string $class = stdClass::class, array $constructor_args = []): object|false|null {} diff --git a/vendor/vimeo/psalm/stubs/pdo.phpstub b/vendor/vimeo/psalm/stubs/pdo.phpstub deleted file mode 100644 index 0abf5053..00000000 --- a/vendor/vimeo/psalm/stubs/pdo.phpstub +++ /dev/null @@ -1,19 +0,0 @@ - - */ -class PDOStatement implements Traversable -{ - /** - * @psalm-taint-sink callable $class - * - * @template T of object - * @param class-string $class - * @param array $ctorArgs - * @return false|T - */ - public function fetchObject($class = \stdclass::class, array $ctorArgs = array()) {} -} diff --git a/vendor/vimeo/psalm/stubs/phpparser.phpstub b/vendor/vimeo/psalm/stubs/phpparser.phpstub deleted file mode 100644 index 834f8f62..00000000 --- a/vendor/vimeo/psalm/stubs/phpparser.phpstub +++ /dev/null @@ -1,22 +0,0 @@ - - */ - abstract public function getRawArgs(): array; - - public function isFirstClassCallable(): bool {} - - /** - * @psalm-pure - * @return list - */ - public function getArgs(): array{} -} diff --git a/vendor/vimeo/psalm/stubs/phpredis.phpstub b/vendor/vimeo/psalm/stubs/phpredis.phpstub deleted file mode 100644 index 791a0cfb..00000000 --- a/vendor/vimeo/psalm/stubs/phpredis.phpstub +++ /dev/null @@ -1,548 +0,0 @@ - - * URI of the WSDL file or NULL if working in - * non-WSDL mode. - *

- *

- * During development, WSDL caching may be disabled by the - * use of the soap.wsdl_cache_ttl php.ini setting - * otherwise changes made to the WSDL file will have no effect until - * soap.wsdl_cache_ttl is expired. - *

- * @param array $options [optional]

- * An array of options. If working in WSDL mode, this parameter is optional. - * If working in non-WSDL mode, the location and - * uri options must be set, where location - * is the URL of the SOAP server to send the request to, and uri - * is the target namespace of the SOAP service. - *

- *

- * The style and use options only work in - * non-WSDL mode. In WSDL mode, they come from the WSDL file. - *

- *

- * The soap_version option should be one of either - * SOAP_1_1 or SOAP_1_2 to - * select SOAP 1.1 or 1.2, respectively. If omitted, 1.1 is used. - *

- *

- * For HTTP authentication, the login and - * password options can be used to supply credentials. - * For making an HTTP connection through - * a proxy server, the options proxy_host, - * proxy_port, proxy_login - * and proxy_password are also available. - * For HTTPS client certificate authentication use - * local_cert and passphrase options. An - * authentication may be supplied in the authentication - * option. The authentication method may be either - * SOAP_AUTHENTICATION_BASIC (default) or - * SOAP_AUTHENTICATION_DIGEST. - *

- *

- * The compression option allows to use compression - * of HTTP SOAP requests and responses. - *

- *

- * The encoding option defines internal character - * encoding. This option does not change the encoding of SOAP requests (it is - * always utf-8), but converts strings into it. - *

- *

- * The trace option enables tracing of request so faults - * can be backtraced. This defaults to FALSE - *

- *

- * The classmap option can be used to map some WSDL - * types to PHP classes. This option must be an array with WSDL types - * as keys and names of PHP classes as values. - *

- *

- * Setting the boolean trace option enables use of the - * methods - * SoapClient->__getLastRequest, - * SoapClient->__getLastRequestHeaders, - * SoapClient->__getLastResponse and - * SoapClient->__getLastResponseHeaders. - *

- *

- * The exceptions option is a boolean value defining whether - * soap errors throw exceptions of type - * SoapFault. - *

- *

- * The connection_timeout option defines a timeout in seconds - * for the connection to the SOAP service. This option does not define a timeout - * for services with slow responses. To limit the time to wait for calls to finish the - * default_socket_timeout setting - * is available. - *

- *

- * The typemap option is an array of type mappings. - * Type mapping is an array with keys type_name, - * type_ns (namespace URI), from_xml - * (callback accepting one string parameter) and to_xml - * (callback accepting one object parameter). - *

- *

- * The cache_wsdl option is one of - * WSDL_CACHE_NONE, - * WSDL_CACHE_DISK, - * WSDL_CACHE_MEMORY or - * WSDL_CACHE_BOTH. - *

- *

- * The user_agent option specifies string to use in - * User-Agent header. - *

- *

- * The stream_context option is a resource - * for context. - *

- *

- * The features option is a bitmask of - * SOAP_SINGLE_ELEMENT_ARRAYS, - * SOAP_USE_XSI_ARRAY_TYPE, - * SOAP_WAIT_ONE_WAY_CALLS. - *

- *

- * The keep_alive option is a boolean value defining whether - * to send the Connection: Keep-Alive header or - * Connection: close. - *

- *

- * The ssl_method option is one of - * SOAP_SSL_METHOD_TLS, - * SOAP_SSL_METHOD_SSLv2, - * SOAP_SSL_METHOD_SSLv3 or - * SOAP_SSL_METHOD_SSLv23. - *

- * @throws SoapFault A SoapFault exception will be thrown if the wsdl URI cannot be loaded. - * @since 5.0.1 - */ - public function __construct ($wsdl, array $options = null) {} - - /** - * Calls a SOAP function (deprecated) - * @link https://php.net/manual/en/soapclient.call.php - * @param string $function_name - * @param array $arguments - * @return mixed - * @since 5.0.1 - */ - public function __call ($function_name, $arguments) {} - - /** - * Calls a SOAP function - * @link https://php.net/manual/en/soapclient.soapcall.php - * @param string $function_name

- * The name of the SOAP function to call. - *

- * @param array $arguments

- * An array of the arguments to pass to the function. This can be either - * an ordered or an associative array. Note that most SOAP servers require - * parameter names to be provided, in which case this must be an - * associative array. - *

- * @param array $options [optional]

- * An associative array of options to pass to the client. - *

- *

- * The location option is the URL of the remote Web service. - *

- *

- * The uri option is the target namespace of the SOAP service. - *

- *

- * The soapaction option is the action to call. - *

- * @param mixed $input_headers [optional]

- * An array of headers to be sent along with the SOAP request. - *

- * @param array $output_headers [optional]

- * If supplied, this array will be filled with the headers from the SOAP response. - *

- * @return mixed SOAP functions may return one, or multiple values. If only one value is returned - * by the SOAP function, the return value of __soapCall will be - * a simple value (e.g. an integer, a string, etc). If multiple values are - * returned, __soapCall will return - * an associative array of named output parameters. - *

- *

- * On error, if the SoapClient object was constructed with the exceptions - * option set to FALSE, a SoapFault object will be returned. - * @since 5.0.1 - */ - public function __soapCall (string $function_name, array $arguments, array $options = null, $input_headers = null, &$output_headers = null) {} - - /** - * Returns last SOAP request - * @link https://php.net/manual/en/soapclient.getlastrequest.php - * @return string|null The last SOAP request, as an XML string. - * @since 5.0.1 - */ - public function __getLastRequest () {} - - /** - * Returns last SOAP response - * @link https://php.net/manual/en/soapclient.getlastresponse.php - * @return string|null The last SOAP response, as an XML string. - * @since 5.0.1 - */ - public function __getLastResponse () {} - - /** - * Returns the SOAP headers from the last request - * @link https://php.net/manual/en/soapclient.getlastrequestheaders.php - * @return string|null The last SOAP request headers. - * @since 5.0.1 - */ - public function __getLastRequestHeaders () {} - - /** - * Returns the SOAP headers from the last response - * @link https://php.net/manual/en/soapclient.getlastresponseheaders.php - * @return string|null The last SOAP response headers. - * @since 5.0.1 - */ - public function __getLastResponseHeaders () {} - - /** - * Returns list of available SOAP functions - * @link https://php.net/manual/en/soapclient.getfunctions.php - * @return array|null The array of SOAP function prototypes, detailing the return type, - * the function name and type-hinted parameters. - * @since 5.0.1 - */ - public function __getFunctions () {} - - /** - * Returns a list of SOAP types - * @link https://php.net/manual/en/soapclient.gettypes.php - * @return array|null The array of SOAP types, detailing all structures and types. - * @since 5.0.1 - */ - public function __getTypes () {} - - /** - * Returns a list of all cookies - * @link https://php.net/manual/en/soapclient.getcookies.php - * @return array The array of all cookies - * @since 5.4.3 - */ - public function __getCookies () {} - - /** - * The __setCookie purpose - * @link https://php.net/manual/en/soapclient.setcookie.php - * @param string $name

- * The name of the cookie. - *

- * @param string $value [optional]

- * The value of the cookie. If not specified, the cookie will be deleted. - *

- * @return void No value is returned. - * @since 5.0.4 - */ - public function __setCookie ($name, $value = null) {} - - /** - * Sets the location of the Web service to use - * @link https://php.net/manual/en/soapclient.setlocation.php - * @param string $new_location [optional]

- * The new endpoint URL. - *

- * @return string The old endpoint URL. - * @since 5.0.1 - */ - public function __setLocation ($new_location = null) {} - - /** - * Sets SOAP headers for subsequent calls - * @link https://php.net/manual/en/soapclient.setsoapheaders.php - * @param mixed $soapheaders [optional]

- * The headers to be set. It could be SoapHeader - * object or array of SoapHeader objects. - * If not specified or set to NULL, the headers will be deleted. - *

- * @return bool TRUE on success or FALSE on failure. - * @since 5.0.5 - */ - public function __setSoapHeaders ($soapheaders = null) {} - -} diff --git a/vendor/webmozart/assert/CHANGELOG.md b/vendor/webmozart/assert/CHANGELOG.md deleted file mode 100644 index 56c8011d..00000000 --- a/vendor/webmozart/assert/CHANGELOG.md +++ /dev/null @@ -1,207 +0,0 @@ -Changelog -========= - -## UNRELEASED - -## 1.11.0 - -### Added - -* Added explicit (non magic) `allNullOr*` methods, with `@psalm-assert` annotations, for better Psalm support. - -### Changed - -* Trait methods will now check the assertion themselves, instead of using `__callStatic` -* `isList` will now deal correctly with (modified) lists that contain `NaN` -* `reportInvalidArgument` now has a return type of `never`. - -### Removed - -* Removed `symfony/polyfill-ctype` as a dependency, and require `ext-cytpe` instead. - * You can still require the `symfony/polyfill-ctype` in your project if you need it, as it provides `ext-ctype` - -## 1.10.0 - -### Added - -* On invalid assertion, we throw a `Webmozart\Assert\InvalidArgumentException` -* Added `Assert::positiveInteger()` - -### Changed - -* Using a trait with real implementations of `all*()` and `nullOr*()` methods to improve psalm compatibility. - -### Removed - -* Support for PHP <7.2 - -## 1.9.1 - -## Fixed - -* provisional support for PHP 8.0 - -## 1.9.0 - -* added better Psalm support for `all*` & `nullOr*` methods -* These methods are now understood by Psalm through a mixin. You may need a newer version of Psalm in order to use this -* added `@psalm-pure` annotation to `Assert::notFalse()` -* added more `@psalm-assert` annotations where appropriate - -## Changed - -* the `all*` & `nullOr*` methods are now declared on an interface, instead of `@method` annotations. -This interface is linked to the `Assert` class with a `@mixin` annotation. Most IDE's have supported this -for a long time, and you should not lose any autocompletion capabilities. PHPStan has supported this since -version `0.12.20`. This package is marked incompatible (with a composer conflict) with phpstan version prior to that. -If you do not use PHPStan than this does not matter. - -## 1.8.0 - -### Added - -* added `Assert::notStartsWith()` -* added `Assert::notEndsWith()` -* added `Assert::inArray()` -* added `@psalm-pure` annotations to pure assertions - -### Fixed - -* Exception messages of comparisons between `DateTime(Immutable)` objects now display their date & time. -* Custom Exception messages for `Assert::count()` now use the values to render the exception message. - -## 1.7.0 (2020-02-14) - -### Added - -* added `Assert::notFalse()` -* added `Assert::isAOf()` -* added `Assert::isAnyOf()` -* added `Assert::isNotA()` - -## 1.6.0 (2019-11-24) - -### Added - -* added `Assert::validArrayKey()` -* added `Assert::isNonEmptyList()` -* added `Assert::isNonEmptyMap()` -* added `@throws InvalidArgumentException` annotations to all methods that throw. -* added `@psalm-assert` for the list type to the `isList` assertion. - -### Fixed - -* `ResourceBundle` & `SimpleXMLElement` now pass the `isCountable` assertions. -They are countable, without implementing the `Countable` interface. -* The doc block of `range` now has the proper variables. -* An empty array will now pass `isList` and `isMap`. As it is a valid form of both. -If a non-empty variant is needed, use `isNonEmptyList` or `isNonEmptyMap`. - -### Changed - -* Removed some `@psalm-assert` annotations, that were 'side effect' assertions See: - * [#144](https://github.com/webmozart/assert/pull/144) - * [#145](https://github.com/webmozart/assert/issues/145) - * [#146](https://github.com/webmozart/assert/pull/146) - * [#150](https://github.com/webmozart/assert/pull/150) -* If you use Psalm, the minimum version needed is `3.6.0`. Which is enforced through a composer conflict. -If you don't use Psalm, then this has no impact. - -## 1.5.0 (2019-08-24) - -### Added - -* added `Assert::uniqueValues()` -* added `Assert::unicodeLetters()` -* added: `Assert::email()` -* added support for [Psalm](https://github.com/vimeo/psalm), by adding `@psalm-assert` annotations where appropriate. - -### Fixed - -* `Assert::endsWith()` would not give the correct result when dealing with a multibyte suffix. -* `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters. - -**NOTE**: These 2 changes may break your assertions if you relied on the fact that multibyte characters didn't behave correctly. - -### Changed - -* The names of some variables have been updated to better reflect what they are. -* All function calls are now in their FQN form, slightly increasing performance. -* Tests are now properly ran against HHVM-3.30 and PHP nightly. - -### Deprecation - -* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` - * This was already done in 1.3.0, but it was only done through a silenced `trigger_error`. It is now annotated as well. - -## 1.4.0 (2018-12-25) - -### Added - -* added `Assert::ip()` -* added `Assert::ipv4()` -* added `Assert::ipv6()` -* added `Assert::notRegex()` -* added `Assert::interfaceExists()` -* added `Assert::isList()` -* added `Assert::isMap()` -* added polyfill for ctype - -### Fixed - -* Special case when comparing objects implementing `__toString()` - -## 1.3.0 (2018-01-29) - -### Added - -* added `Assert::minCount()` -* added `Assert::maxCount()` -* added `Assert::countBetween()` -* added `Assert::isCountable()` -* added `Assert::notWhitespaceOnly()` -* added `Assert::natural()` -* added `Assert::notContains()` -* added `Assert::isArrayAccessible()` -* added `Assert::isInstanceOfAny()` -* added `Assert::isIterable()` - -### Fixed - -* `stringNotEmpty` will no longer report "0" is an empty string - -### Deprecation - -* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` - -## 1.2.0 (2016-11-23) - - * added `Assert::throws()` - * added `Assert::count()` - * added extension point `Assert::reportInvalidArgument()` for custom subclasses - -## 1.1.0 (2016-08-09) - - * added `Assert::object()` - * added `Assert::propertyExists()` - * added `Assert::propertyNotExists()` - * added `Assert::methodExists()` - * added `Assert::methodNotExists()` - * added `Assert::uuid()` - -## 1.0.2 (2015-08-24) - - * integrated Style CI - * add tests for minimum package dependencies on Travis CI - -## 1.0.1 (2015-05-12) - - * added support for PHP 5.3.3 - -## 1.0.0 (2015-05-12) - - * first stable release - -## 1.0.0-beta (2015-03-19) - - * first beta release diff --git a/vendor/webmozart/assert/LICENSE b/vendor/webmozart/assert/LICENSE deleted file mode 100644 index 9e2e3075..00000000 --- a/vendor/webmozart/assert/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Bernhard Schussek - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/webmozart/assert/README.md b/vendor/webmozart/assert/README.md deleted file mode 100644 index 3b2397a1..00000000 --- a/vendor/webmozart/assert/README.md +++ /dev/null @@ -1,287 +0,0 @@ -Webmozart Assert -================ - -[![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert) -[![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert) - -This library contains efficient assertions to test the input and output of -your methods. With these assertions, you can greatly reduce the amount of coding -needed to write a safe implementation. - -All assertions in the [`Assert`] class throw an `Webmozart\Assert\InvalidArgumentException` if -they fail. - -FAQ ---- - -**What's the difference to [beberlei/assert]?** - -This library is heavily inspired by Benjamin Eberlei's wonderful [assert package], -but fixes a usability issue with error messages that can't be fixed there without -breaking backwards compatibility. - -This package features usable error messages by default. However, you can also -easily write custom error messages: - -``` -Assert::string($path, 'The path is expected to be a string. Got: %s'); -``` - -In [beberlei/assert], the ordering of the `%s` placeholders is different for -every assertion. This package, on the contrary, provides consistent placeholder -ordering for all assertions: - -* `%s`: The tested value as string, e.g. `"/foo/bar"`. -* `%2$s`, `%3$s`, ...: Additional assertion-specific values, e.g. the - minimum/maximum length, allowed values, etc. - -Check the source code of the assertions to find out details about the additional -available placeholders. - -Installation ------------- - -Use [Composer] to install the package: - -```bash -composer require webmozart/assert -``` - -Example -------- - -```php -use Webmozart\Assert\Assert; - -class Employee -{ - public function __construct($id) - { - Assert::integer($id, 'The employee ID must be an integer. Got: %s'); - Assert::greaterThan($id, 0, 'The employee ID must be a positive integer. Got: %s'); - } -} -``` - -If you create an employee with an invalid ID, an exception is thrown: - -```php -new Employee('foobar'); -// => Webmozart\Assert\InvalidArgumentException: -// The employee ID must be an integer. Got: string - -new Employee(-10); -// => Webmozart\Assert\InvalidArgumentException: -// The employee ID must be a positive integer. Got: -10 -``` - -Assertions ----------- - -The [`Assert`] class provides the following assertions: - -### Type Assertions - -Method | Description --------------------------------------------------------- | -------------------------------------------------- -`string($value, $message = '')` | Check that a value is a string -`stringNotEmpty($value, $message = '')` | Check that a value is a non-empty string -`integer($value, $message = '')` | Check that a value is an integer -`integerish($value, $message = '')` | Check that a value casts to an integer -`positiveInteger($value, $message = '')` | Check that a value is a positive (non-zero) integer -`float($value, $message = '')` | Check that a value is a float -`numeric($value, $message = '')` | Check that a value is numeric -`natural($value, $message= ''')` | Check that a value is a non-negative integer -`boolean($value, $message = '')` | Check that a value is a boolean -`scalar($value, $message = '')` | Check that a value is a scalar -`object($value, $message = '')` | Check that a value is an object -`resource($value, $type = null, $message = '')` | Check that a value is a resource -`isCallable($value, $message = '')` | Check that a value is a callable -`isArray($value, $message = '')` | Check that a value is an array -`isTraversable($value, $message = '')` (deprecated) | Check that a value is an array or a `\Traversable` -`isIterable($value, $message = '')` | Check that a value is an array or a `\Traversable` -`isCountable($value, $message = '')` | Check that a value is an array or a `\Countable` -`isInstanceOf($value, $class, $message = '')` | Check that a value is an `instanceof` a class -`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` at least one class on the array of classes -`notInstanceOf($value, $class, $message = '')` | Check that a value is not an `instanceof` a class -`isAOf($value, $class, $message = '')` | Check that a value is of the class or has one of its parents -`isAnyOf($value, array $classes, $message = '')` | Check that a value is of at least one of the classes or has one of its parents -`isNotA($value, $class, $message = '')` | Check that a value is not of the class or has not one of its parents -`isArrayAccessible($value, $message = '')` | Check that a value can be accessed as an array -`uniqueValues($values, $message = '')` | Check that the given array contains unique values - -### Comparison Assertions - -Method | Description ------------------------------------------------ | ------------------------------------------------------------------ -`true($value, $message = '')` | Check that a value is `true` -`false($value, $message = '')` | Check that a value is `false` -`notFalse($value, $message = '')` | Check that a value is not `false` -`null($value, $message = '')` | Check that a value is `null` -`notNull($value, $message = '')` | Check that a value is not `null` -`isEmpty($value, $message = '')` | Check that a value is `empty()` -`notEmpty($value, $message = '')` | Check that a value is not `empty()` -`eq($value, $value2, $message = '')` | Check that a value equals another (`==`) -`notEq($value, $value2, $message = '')` | Check that a value does not equal another (`!=`) -`same($value, $value2, $message = '')` | Check that a value is identical to another (`===`) -`notSame($value, $value2, $message = '')` | Check that a value is not identical to another (`!==`) -`greaterThan($value, $value2, $message = '')` | Check that a value is greater than another -`greaterThanEq($value, $value2, $message = '')` | Check that a value is greater than or equal to another -`lessThan($value, $value2, $message = '')` | Check that a value is less than another -`lessThanEq($value, $value2, $message = '')` | Check that a value is less than or equal to another -`range($value, $min, $max, $message = '')` | Check that a value is within a range -`inArray($value, array $values, $message = '')` | Check that a value is one of a list of values -`oneOf($value, array $values, $message = '')` | Check that a value is one of a list of values (alias of `inArray`) - -### String Assertions - -You should check that a value is a string with `Assert::string()` before making -any of the following assertions. - -Method | Description ---------------------------------------------------- | ----------------------------------------------------------------- -`contains($value, $subString, $message = '')` | Check that a string contains a substring -`notContains($value, $subString, $message = '')` | Check that a string does not contain a substring -`startsWith($value, $prefix, $message = '')` | Check that a string has a prefix -`notStartsWith($value, $prefix, $message = '')` | Check that a string does not have a prefix -`startsWithLetter($value, $message = '')` | Check that a string starts with a letter -`endsWith($value, $suffix, $message = '')` | Check that a string has a suffix -`notEndsWith($value, $suffix, $message = '')` | Check that a string does not have a suffix -`regex($value, $pattern, $message = '')` | Check that a string matches a regular expression -`notRegex($value, $pattern, $message = '')` | Check that a string does not match a regular expression -`unicodeLetters($value, $message = '')` | Check that a string contains Unicode letters only -`alpha($value, $message = '')` | Check that a string contains letters only -`digits($value, $message = '')` | Check that a string contains digits only -`alnum($value, $message = '')` | Check that a string contains letters and digits only -`lower($value, $message = '')` | Check that a string contains lowercase characters only -`upper($value, $message = '')` | Check that a string contains uppercase characters only -`length($value, $length, $message = '')` | Check that a string has a certain number of characters -`minLength($value, $min, $message = '')` | Check that a string has at least a certain number of characters -`maxLength($value, $max, $message = '')` | Check that a string has at most a certain number of characters -`lengthBetween($value, $min, $max, $message = '')` | Check that a string has a length in the given range -`uuid($value, $message = '')` | Check that a string is a valid UUID -`ip($value, $message = '')` | Check that a string is a valid IP (either IPv4 or IPv6) -`ipv4($value, $message = '')` | Check that a string is a valid IPv4 -`ipv6($value, $message = '')` | Check that a string is a valid IPv6 -`email($value, $message = '')` | Check that a string is a valid e-mail address -`notWhitespaceOnly($value, $message = '')` | Check that a string contains at least one non-whitespace character - -### File Assertions - -Method | Description ------------------------------------ | -------------------------------------------------- -`fileExists($value, $message = '')` | Check that a value is an existing path -`file($value, $message = '')` | Check that a value is an existing file -`directory($value, $message = '')` | Check that a value is an existing directory -`readable($value, $message = '')` | Check that a value is a readable path -`writable($value, $message = '')` | Check that a value is a writable path - -### Object Assertions - -Method | Description ------------------------------------------------------ | -------------------------------------------------- -`classExists($value, $message = '')` | Check that a value is an existing class name -`subclassOf($value, $class, $message = '')` | Check that a class is a subclass of another -`interfaceExists($value, $message = '')` | Check that a value is an existing interface name -`implementsInterface($value, $class, $message = '')` | Check that a class implements an interface -`propertyExists($value, $property, $message = '')` | Check that a property exists in a class/object -`propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object -`methodExists($value, $method, $message = '')` | Check that a method exists in a class/object -`methodNotExists($value, $method, $message = '')` | Check that a method does not exist in a class/object - -### Array Assertions - -Method | Description --------------------------------------------------- | ------------------------------------------------------------------ -`keyExists($array, $key, $message = '')` | Check that a key exists in an array -`keyNotExists($array, $key, $message = '')` | Check that a key does not exist in an array -`validArrayKey($key, $message = '')` | Check that a value is a valid array key (int or string) -`count($array, $number, $message = '')` | Check that an array contains a specific number of elements -`minCount($array, $min, $message = '')` | Check that an array contains at least a certain number of elements -`maxCount($array, $max, $message = '')` | Check that an array contains at most a certain number of elements -`countBetween($array, $min, $max, $message = '')` | Check that an array has a count in the given range -`isList($array, $message = '')` | Check that an array is a non-associative list -`isNonEmptyList($array, $message = '')` | Check that an array is a non-associative list, and not empty -`isMap($array, $message = '')` | Check that an array is associative and has strings as keys -`isNonEmptyMap($array, $message = '')` | Check that an array is associative and has strings as keys, and is not empty - -### Function Assertions - -Method | Description -------------------------------------------- | ----------------------------------------------------------------------------------------------------- -`throws($closure, $class, $message = '')` | Check that a function throws a certain exception. Subclasses of the exception class will be accepted. - -### Collection Assertions - -All of the above assertions can be prefixed with `all*()` to test the contents -of an array or a `\Traversable`: - -```php -Assert::allIsInstanceOf($employees, 'Acme\Employee'); -``` - -### Nullable Assertions - -All of the above assertions can be prefixed with `nullOr*()` to run the -assertion only if it the value is not `null`: - -```php -Assert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s'); -``` - -### Extending Assert - -The `Assert` class comes with a few methods, which can be overridden to change the class behaviour. You can also extend it to -add your own assertions. - -#### Overriding methods - -Overriding the following methods in your assertion class allows you to change the behaviour of the assertions: - -* `public static function __callStatic($name, $arguments)` - * This method is used to 'create' the `nullOr` and `all` versions of the assertions. -* `protected static function valueToString($value)` - * This method is used for error messages, to convert the value to a string value for displaying. You could use this for representing a value object with a `__toString` method for example. -* `protected static function typeToString($value)` - * This method is used for error messages, to convert the a value to a string representing its type. -* `protected static function strlen($value)` - * This method is used to calculate string length for relevant methods, using the `mb_strlen` if available and useful. -* `protected static function reportInvalidArgument($message)` - * This method is called when an assertion fails, with the specified error message. Here you can throw your own exception, or log something. - -## Static analysis support - -Where applicable, assertion functions are annotated to support Psalm's -[Assertion syntax](https://psalm.dev/docs/annotating_code/assertion_syntax/). -A dedicated [PHPStan Plugin](https://github.com/phpstan/phpstan-webmozart-assert) is -required for proper type support. - -Authors -------- - -* [Bernhard Schussek] a.k.a. [@webmozart] -* [The Community Contributors] - -Contribute ----------- - -Contributions to the package are always welcome! - -* Report any bugs or issues you find on the [issue tracker]. -* You can grab the source code at the package's [Git repository]. - -License -------- - -All contents of this package are licensed under the [MIT license]. - -[beberlei/assert]: https://github.com/beberlei/assert -[assert package]: https://github.com/beberlei/assert -[Composer]: https://getcomposer.org -[Bernhard Schussek]: https://webmozarts.com -[The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors -[issue tracker]: https://github.com/webmozart/assert/issues -[Git repository]: https://github.com/webmozart/assert -[@webmozart]: https://twitter.com/webmozart -[MIT license]: LICENSE -[`Assert`]: src/Assert.php diff --git a/vendor/webmozart/assert/composer.json b/vendor/webmozart/assert/composer.json deleted file mode 100644 index b340452c..00000000 --- a/vendor/webmozart/assert/composer.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "webmozart/assert", - "description": "Assertions to validate method input/output with nice error messages.", - "license": "MIT", - "keywords": [ - "assert", - "check", - "validate" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "require": { - "php": "^7.2 || ^8.0", - "ext-ctype": "*" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Webmozart\\Assert\\Tests\\": "tests/", - "Webmozart\\Assert\\Bin\\": "bin/src" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - } -} diff --git a/vendor/webmozart/assert/src/Assert.php b/vendor/webmozart/assert/src/Assert.php deleted file mode 100644 index db1f3a51..00000000 --- a/vendor/webmozart/assert/src/Assert.php +++ /dev/null @@ -1,2080 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Webmozart\Assert; - -use ArrayAccess; -use BadMethodCallException; -use Closure; -use Countable; -use DateTime; -use DateTimeImmutable; -use Exception; -use ResourceBundle; -use SimpleXMLElement; -use Throwable; -use Traversable; - -/** - * Efficient assertions to validate the input/output of your methods. - * - * @since 1.0 - * - * @author Bernhard Schussek - */ -class Assert -{ - use Mixin; - - /** - * @psalm-pure - * @psalm-assert string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function string($value, $message = '') - { - if (!\is_string($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a string. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert non-empty-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function stringNotEmpty($value, $message = '') - { - static::string($value, $message); - static::notEq($value, '', $message); - } - - /** - * @psalm-pure - * @psalm-assert int $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function integer($value, $message = '') - { - if (!\is_int($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an integer. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert numeric $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function integerish($value, $message = '') - { - if (!\is_numeric($value) || $value != (int) $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an integerish value. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert positive-int $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function positiveInteger($value, $message = '') - { - if (!(\is_int($value) && $value > 0)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a positive integer. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert float $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function float($value, $message = '') - { - if (!\is_float($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a float. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert numeric $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function numeric($value, $message = '') - { - if (!\is_numeric($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a numeric. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert positive-int|0 $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function natural($value, $message = '') - { - if (!\is_int($value) || $value < 0) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a non-negative integer. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert bool $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function boolean($value, $message = '') - { - if (!\is_bool($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a boolean. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert scalar $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function scalar($value, $message = '') - { - if (!\is_scalar($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a scalar. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert object $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function object($value, $message = '') - { - if (!\is_object($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an object. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert resource $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function resource($value, $type = null, $message = '') - { - if (!\is_resource($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a resource. Got: %s', - static::typeToString($value) - )); - } - - if ($type && $type !== \get_resource_type($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a resource of type %2$s. Got: %s', - static::typeToString($value), - $type - )); - } - } - - /** - * @psalm-pure - * @psalm-assert callable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isCallable($value, $message = '') - { - if (!\is_callable($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a callable. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert array $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isArray($value, $message = '') - { - if (!\is_array($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isTraversable($value, $message = '') - { - @\trigger_error( - \sprintf( - 'The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', - __METHOD__ - ), - \E_USER_DEPRECATED - ); - - if (!\is_array($value) && !($value instanceof Traversable)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a traversable. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert array|ArrayAccess $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isArrayAccessible($value, $message = '') - { - if (!\is_array($value) && !($value instanceof ArrayAccess)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array accessible. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert countable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isCountable($value, $message = '') - { - if ( - !\is_array($value) - && !($value instanceof Countable) - && !($value instanceof ResourceBundle) - && !($value instanceof SimpleXMLElement) - ) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a countable. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isIterable($value, $message = '') - { - if (!\is_array($value) && !($value instanceof Traversable)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an iterable. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isInstanceOf($value, $class, $message = '') - { - if (!($value instanceof $class)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an instance of %2$s. Got: %s', - static::typeToString($value), - $class - )); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert !ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notInstanceOf($value, $class, $message = '') - { - if ($value instanceof $class) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an instance other than %2$s. Got: %s', - static::typeToString($value), - $class - )); - } - } - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isInstanceOfAny($value, array $classes, $message = '') - { - foreach ($classes as $class) { - if ($value instanceof $class) { - return; - } - } - - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an instance of any of %2$s. Got: %s', - static::typeToString($value), - \implode(', ', \array_map(array(static::class, 'valueToString'), $classes)) - )); - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType|class-string $value - * - * @param object|string $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isAOf($value, $class, $message = '') - { - static::string($class, 'Expected class as a string. Got: %s'); - - if (!\is_a($value, $class, \is_string($value))) { - static::reportInvalidArgument(sprintf( - $message ?: 'Expected an instance of this class or to this class among its parents "%2$s". Got: %s', - static::valueToString($value), - $class - )); - } - } - - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * @psalm-assert !UnexpectedType $value - * @psalm-assert !class-string $value - * - * @param object|string $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isNotA($value, $class, $message = '') - { - static::string($class, 'Expected class as a string. Got: %s'); - - if (\is_a($value, $class, \is_string($value))) { - static::reportInvalidArgument(sprintf( - $message ?: 'Expected an instance of this class or to this class among its parents other than "%2$s". Got: %s', - static::valueToString($value), - $class - )); - } - } - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param object|string $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isAnyOf($value, array $classes, $message = '') - { - foreach ($classes as $class) { - static::string($class, 'Expected class as a string. Got: %s'); - - if (\is_a($value, $class, \is_string($value))) { - return; - } - } - - static::reportInvalidArgument(sprintf( - $message ?: 'Expected an instance of any of this classes or any of those classes among their parents "%2$s". Got: %s', - static::valueToString($value), - \implode(', ', $classes) - )); - } - - /** - * @psalm-pure - * @psalm-assert empty $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isEmpty($value, $message = '') - { - if (!empty($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an empty value. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert !empty $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notEmpty($value, $message = '') - { - if (empty($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a non-empty value. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function null($value, $message = '') - { - if (null !== $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected null. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert !null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notNull($value, $message = '') - { - if (null === $value) { - static::reportInvalidArgument( - $message ?: 'Expected a value other than null.' - ); - } - } - - /** - * @psalm-pure - * @psalm-assert true $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function true($value, $message = '') - { - if (true !== $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be true. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert false $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function false($value, $message = '') - { - if (false !== $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be false. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert !false $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notFalse($value, $message = '') - { - if (false === $value) { - static::reportInvalidArgument( - $message ?: 'Expected a value other than false.' - ); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function ip($value, $message = '') - { - if (false === \filter_var($value, \FILTER_VALIDATE_IP)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be an IP. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function ipv4($value, $message = '') - { - if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be an IPv4. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function ipv6($value, $message = '') - { - if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be an IPv6. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function email($value, $message = '') - { - if (false === \filter_var($value, FILTER_VALIDATE_EMAIL)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be a valid e-mail address. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. - * - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function uniqueValues(array $values, $message = '') - { - $allValues = \count($values); - $uniqueValues = \count(\array_unique($values)); - - if ($allValues !== $uniqueValues) { - $difference = $allValues - $uniqueValues; - - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array of unique values, but %s of them %s duplicated', - $difference, - (1 === $difference ? 'is' : 'are') - )); - } - } - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function eq($value, $expect, $message = '') - { - if ($expect != $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value equal to %2$s. Got: %s', - static::valueToString($value), - static::valueToString($expect) - )); - } - } - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notEq($value, $expect, $message = '') - { - if ($expect == $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a different value than %s.', - static::valueToString($expect) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function same($value, $expect, $message = '') - { - if ($expect !== $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value identical to %2$s. Got: %s', - static::valueToString($value), - static::valueToString($expect) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notSame($value, $expect, $message = '') - { - if ($expect === $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value not identical to %s.', - static::valueToString($expect) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function greaterThan($value, $limit, $message = '') - { - if ($value <= $limit) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value greater than %2$s. Got: %s', - static::valueToString($value), - static::valueToString($limit) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function greaterThanEq($value, $limit, $message = '') - { - if ($value < $limit) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value greater than or equal to %2$s. Got: %s', - static::valueToString($value), - static::valueToString($limit) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lessThan($value, $limit, $message = '') - { - if ($value >= $limit) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value less than %2$s. Got: %s', - static::valueToString($value), - static::valueToString($limit) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lessThanEq($value, $limit, $message = '') - { - if ($value > $limit) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value less than or equal to %2$s. Got: %s', - static::valueToString($value), - static::valueToString($limit) - )); - } - } - - /** - * Inclusive range, so Assert::(3, 3, 5) passes. - * - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function range($value, $min, $max, $message = '') - { - if ($value < $min || $value > $max) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value between %2$s and %3$s. Got: %s', - static::valueToString($value), - static::valueToString($min), - static::valueToString($max) - )); - } - } - - /** - * A more human-readable alias of Assert::inArray(). - * - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function oneOf($value, array $values, $message = '') - { - static::inArray($value, $values, $message); - } - - /** - * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. - * - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function inArray($value, array $values, $message = '') - { - if (!\in_array($value, $values, true)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected one of: %2$s. Got: %s', - static::valueToString($value), - \implode(', ', \array_map(array(static::class, 'valueToString'), $values)) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function contains($value, $subString, $message = '') - { - if (false === \strpos($value, $subString)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain %2$s. Got: %s', - static::valueToString($value), - static::valueToString($subString) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notContains($value, $subString, $message = '') - { - if (false !== \strpos($value, $subString)) { - static::reportInvalidArgument(\sprintf( - $message ?: '%2$s was not expected to be contained in a value. Got: %s', - static::valueToString($value), - static::valueToString($subString) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notWhitespaceOnly($value, $message = '') - { - if (\preg_match('/^\s*$/', $value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a non-whitespace string. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function startsWith($value, $prefix, $message = '') - { - if (0 !== \strpos($value, $prefix)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to start with %2$s. Got: %s', - static::valueToString($value), - static::valueToString($prefix) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notStartsWith($value, $prefix, $message = '') - { - if (0 === \strpos($value, $prefix)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value not to start with %2$s. Got: %s', - static::valueToString($value), - static::valueToString($prefix) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function startsWithLetter($value, $message = '') - { - static::string($value); - - $valid = isset($value[0]); - - if ($valid) { - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = \ctype_alpha($value[0]); - \setlocale(LC_CTYPE, $locale); - } - - if (!$valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to start with a letter. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function endsWith($value, $suffix, $message = '') - { - if ($suffix !== \substr($value, -\strlen($suffix))) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to end with %2$s. Got: %s', - static::valueToString($value), - static::valueToString($suffix) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notEndsWith($value, $suffix, $message = '') - { - if ($suffix === \substr($value, -\strlen($suffix))) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value not to end with %2$s. Got: %s', - static::valueToString($value), - static::valueToString($suffix) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function regex($value, $pattern, $message = '') - { - if (!\preg_match($pattern, $value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The value %s does not match the expected pattern.', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notRegex($value, $pattern, $message = '') - { - if (\preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The value %s matches the pattern %s (at offset %d).', - static::valueToString($value), - static::valueToString($pattern), - $matches[0][1] - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function unicodeLetters($value, $message = '') - { - static::string($value); - - if (!\preg_match('/^\p{L}+$/u', $value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain only Unicode letters. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function alpha($value, $message = '') - { - static::string($value); - - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = !\ctype_alpha($value); - \setlocale(LC_CTYPE, $locale); - - if ($valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain only letters. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function digits($value, $message = '') - { - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = !\ctype_digit($value); - \setlocale(LC_CTYPE, $locale); - - if ($valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain digits only. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function alnum($value, $message = '') - { - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = !\ctype_alnum($value); - \setlocale(LC_CTYPE, $locale); - - if ($valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain letters and digits only. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert lowercase-string $value - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lower($value, $message = '') - { - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = !\ctype_lower($value); - \setlocale(LC_CTYPE, $locale); - - if ($valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain lowercase characters only. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert !lowercase-string $value - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function upper($value, $message = '') - { - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = !\ctype_upper($value); - \setlocale(LC_CTYPE, $locale); - - if ($valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain uppercase characters only. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function length($value, $length, $message = '') - { - if ($length !== static::strlen($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain %2$s characters. Got: %s', - static::valueToString($value), - $length - )); - } - } - - /** - * Inclusive min. - * - * @psalm-pure - * - * @param string $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function minLength($value, $min, $message = '') - { - if (static::strlen($value) < $min) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain at least %2$s characters. Got: %s', - static::valueToString($value), - $min - )); - } - } - - /** - * Inclusive max. - * - * @psalm-pure - * - * @param string $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function maxLength($value, $max, $message = '') - { - if (static::strlen($value) > $max) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain at most %2$s characters. Got: %s', - static::valueToString($value), - $max - )); - } - } - - /** - * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. - * - * @psalm-pure - * - * @param string $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lengthBetween($value, $min, $max, $message = '') - { - $length = static::strlen($value); - - if ($length < $min || $length > $max) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', - static::valueToString($value), - $min, - $max - )); - } - } - - /** - * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function fileExists($value, $message = '') - { - static::string($value); - - if (!\file_exists($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The file %s does not exist.', - static::valueToString($value) - )); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function file($value, $message = '') - { - static::fileExists($value, $message); - - if (!\is_file($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The path %s is not a file.', - static::valueToString($value) - )); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function directory($value, $message = '') - { - static::fileExists($value, $message); - - if (!\is_dir($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The path %s is no directory.', - static::valueToString($value) - )); - } - } - - /** - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function readable($value, $message = '') - { - if (!\is_readable($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The path %s is not readable.', - static::valueToString($value) - )); - } - } - - /** - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function writable($value, $message = '') - { - if (!\is_writable($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The path %s is not writable.', - static::valueToString($value) - )); - } - } - - /** - * @psalm-assert class-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function classExists($value, $message = '') - { - if (!\class_exists($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an existing class name. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert class-string|ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function subclassOf($value, $class, $message = '') - { - if (!\is_subclass_of($value, $class)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a sub-class of %2$s. Got: %s', - static::valueToString($value), - static::valueToString($class) - )); - } - } - - /** - * @psalm-assert class-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function interfaceExists($value, $message = '') - { - if (!\interface_exists($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an existing interface name. got %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert class-string $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function implementsInterface($value, $interface, $message = '') - { - if (!\in_array($interface, \class_implements($value))) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an implementation of %2$s. Got: %s', - static::valueToString($value), - static::valueToString($interface) - )); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function propertyExists($classOrObject, $property, $message = '') - { - if (!\property_exists($classOrObject, $property)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the property %s to exist.', - static::valueToString($property) - )); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function propertyNotExists($classOrObject, $property, $message = '') - { - if (\property_exists($classOrObject, $property)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the property %s to not exist.', - static::valueToString($property) - )); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function methodExists($classOrObject, $method, $message = '') - { - if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the method %s to exist.', - static::valueToString($method) - )); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function methodNotExists($classOrObject, $method, $message = '') - { - if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the method %s to not exist.', - static::valueToString($method) - )); - } - } - - /** - * @psalm-pure - * - * @param array $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function keyExists($array, $key, $message = '') - { - if (!(isset($array[$key]) || \array_key_exists($key, $array))) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the key %s to exist.', - static::valueToString($key) - )); - } - } - - /** - * @psalm-pure - * - * @param array $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function keyNotExists($array, $key, $message = '') - { - if (isset($array[$key]) || \array_key_exists($key, $array)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the key %s to not exist.', - static::valueToString($key) - )); - } - } - - /** - * Checks if a value is a valid array key (int or string). - * - * @psalm-pure - * @psalm-assert array-key $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function validArrayKey($value, $message = '') - { - if (!(\is_int($value) || \is_string($value))) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected string or integer. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function count($array, $number, $message = '') - { - static::eq( - \count($array), - $number, - \sprintf( - $message ?: 'Expected an array to contain %d elements. Got: %d.', - $number, - \count($array) - ) - ); - } - - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function minCount($array, $min, $message = '') - { - if (\count($array) < $min) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array to contain at least %2$d elements. Got: %d', - \count($array), - $min - )); - } - } - - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function maxCount($array, $max, $message = '') - { - if (\count($array) > $max) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array to contain at most %2$d elements. Got: %d', - \count($array), - $max - )); - } - } - - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function countBetween($array, $min, $max, $message = '') - { - $count = \count($array); - - if ($count < $min || $count > $max) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', - $count, - $min, - $max - )); - } - } - - /** - * @psalm-pure - * @psalm-assert list $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isList($array, $message = '') - { - if (!\is_array($array)) { - static::reportInvalidArgument( - $message ?: 'Expected list - non-associative array.' - ); - } - - if ($array === \array_values($array)) { - return; - } - - $nextKey = -1; - foreach ($array as $k => $v) { - if ($k !== ++$nextKey) { - static::reportInvalidArgument( - $message ?: 'Expected list - non-associative array.' - ); - } - } - } - - /** - * @psalm-pure - * @psalm-assert non-empty-list $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isNonEmptyList($array, $message = '') - { - static::isList($array, $message); - static::notEmpty($array, $message); - } - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array $array - * @psalm-assert array $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isMap($array, $message = '') - { - if ( - !\is_array($array) || - \array_keys($array) !== \array_filter(\array_keys($array), '\is_string') - ) { - static::reportInvalidArgument( - $message ?: 'Expected map - associative array with string keys.' - ); - } - } - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array $array - * @psalm-assert array $array - * @psalm-assert !empty $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isNonEmptyMap($array, $message = '') - { - static::isMap($array, $message); - static::notEmpty($array, $message); - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function uuid($value, $message = '') - { - $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); - - // The nil UUID is special form of UUID that is specified to have all - // 128 bits set to zero. - if ('00000000-0000-0000-0000-000000000000' === $value) { - return; - } - - if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Value %s is not a valid UUID.', - static::valueToString($value) - )); - } - } - - /** - * @psalm-param class-string $class - * - * @param Closure $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function throws(Closure $expression, $class = 'Exception', $message = '') - { - static::string($class); - - $actual = 'none'; - - try { - $expression(); - } catch (Exception $e) { - $actual = \get_class($e); - if ($e instanceof $class) { - return; - } - } catch (Throwable $e) { - $actual = \get_class($e); - if ($e instanceof $class) { - return; - } - } - - static::reportInvalidArgument($message ?: \sprintf( - 'Expected to throw "%s", got "%s"', - $class, - $actual - )); - } - - /** - * @throws BadMethodCallException - */ - public static function __callStatic($name, $arguments) - { - if ('nullOr' === \substr($name, 0, 6)) { - if (null !== $arguments[0]) { - $method = \lcfirst(\substr($name, 6)); - \call_user_func_array(array(static::class, $method), $arguments); - } - - return; - } - - if ('all' === \substr($name, 0, 3)) { - static::isIterable($arguments[0]); - - $method = \lcfirst(\substr($name, 3)); - $args = $arguments; - - foreach ($arguments[0] as $entry) { - $args[0] = $entry; - - \call_user_func_array(array(static::class, $method), $args); - } - - return; - } - - throw new BadMethodCallException('No such method: '.$name); - } - - /** - * @param mixed $value - * - * @return string - */ - protected static function valueToString($value) - { - if (null === $value) { - return 'null'; - } - - if (true === $value) { - return 'true'; - } - - if (false === $value) { - return 'false'; - } - - if (\is_array($value)) { - return 'array'; - } - - if (\is_object($value)) { - if (\method_exists($value, '__toString')) { - return \get_class($value).': '.self::valueToString($value->__toString()); - } - - if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { - return \get_class($value).': '.self::valueToString($value->format('c')); - } - - return \get_class($value); - } - - if (\is_resource($value)) { - return 'resource'; - } - - if (\is_string($value)) { - return '"'.$value.'"'; - } - - return (string) $value; - } - - /** - * @param mixed $value - * - * @return string - */ - protected static function typeToString($value) - { - return \is_object($value) ? \get_class($value) : \gettype($value); - } - - protected static function strlen($value) - { - if (!\function_exists('mb_detect_encoding')) { - return \strlen($value); - } - - if (false === $encoding = \mb_detect_encoding($value)) { - return \strlen($value); - } - - return \mb_strlen($value, $encoding); - } - - /** - * @param string $message - * - * @throws InvalidArgumentException - * - * @psalm-pure this method is not supposed to perform side-effects - * @psalm-return never - */ - protected static function reportInvalidArgument($message) - { - throw new InvalidArgumentException($message); - } - - private function __construct() - { - } -} diff --git a/vendor/webmozart/assert/src/InvalidArgumentException.php b/vendor/webmozart/assert/src/InvalidArgumentException.php deleted file mode 100644 index 9d95a58c..00000000 --- a/vendor/webmozart/assert/src/InvalidArgumentException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Webmozart\Assert; - -class InvalidArgumentException extends \InvalidArgumentException -{ -} diff --git a/vendor/webmozart/assert/src/Mixin.php b/vendor/webmozart/assert/src/Mixin.php deleted file mode 100644 index 0f0a75e3..00000000 --- a/vendor/webmozart/assert/src/Mixin.php +++ /dev/null @@ -1,5089 +0,0 @@ - $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allString($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::string($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrString($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::string($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert non-empty-string|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrStringNotEmpty($value, $message = '') - { - null === $value || static::stringNotEmpty($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allStringNotEmpty($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::stringNotEmpty($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrStringNotEmpty($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::stringNotEmpty($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert int|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrInteger($value, $message = '') - { - null === $value || static::integer($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allInteger($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::integer($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrInteger($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::integer($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert numeric|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIntegerish($value, $message = '') - { - null === $value || static::integerish($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIntegerish($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::integerish($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIntegerish($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::integerish($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert positive-int|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrPositiveInteger($value, $message = '') - { - null === $value || static::positiveInteger($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allPositiveInteger($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::positiveInteger($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrPositiveInteger($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::positiveInteger($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert float|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrFloat($value, $message = '') - { - null === $value || static::float($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allFloat($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::float($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrFloat($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::float($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert numeric|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNumeric($value, $message = '') - { - null === $value || static::numeric($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNumeric($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::numeric($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNumeric($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::numeric($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert positive-int|0|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNatural($value, $message = '') - { - null === $value || static::natural($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNatural($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::natural($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNatural($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::natural($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert bool|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrBoolean($value, $message = '') - { - null === $value || static::boolean($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allBoolean($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::boolean($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrBoolean($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::boolean($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert scalar|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrScalar($value, $message = '') - { - null === $value || static::scalar($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allScalar($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::scalar($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrScalar($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::scalar($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert object|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrObject($value, $message = '') - { - null === $value || static::object($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allObject($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::object($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrObject($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::object($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert resource|null $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrResource($value, $type = null, $message = '') - { - null === $value || static::resource($value, $type, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allResource($value, $type = null, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::resource($entry, $type, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrResource($value, $type = null, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::resource($entry, $type, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert callable|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsCallable($value, $message = '') - { - null === $value || static::isCallable($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsCallable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isCallable($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsCallable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isCallable($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert array|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsArray($value, $message = '') - { - null === $value || static::isArray($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsArray($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isArray($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsArray($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isArray($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable|null $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsTraversable($value, $message = '') - { - null === $value || static::isTraversable($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsTraversable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isTraversable($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsTraversable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isTraversable($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert array|ArrayAccess|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsArrayAccessible($value, $message = '') - { - null === $value || static::isArrayAccessible($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsArrayAccessible($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isArrayAccessible($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsArrayAccessible($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isArrayAccessible($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert countable|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsCountable($value, $message = '') - { - null === $value || static::isCountable($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsCountable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isCountable($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsCountable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isCountable($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsIterable($value, $message = '') - { - null === $value || static::isIterable($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsIterable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isIterable($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsIterable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isIterable($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType|null $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsInstanceOf($value, $class, $message = '') - { - null === $value || static::isInstanceOf($value, $class, $message); - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsInstanceOf($value, $class, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isInstanceOf($entry, $class, $message); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsInstanceOf($value, $class, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isInstanceOf($entry, $class, $message); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotInstanceOf($value, $class, $message = '') - { - null === $value || static::notInstanceOf($value, $class, $message); - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotInstanceOf($value, $class, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notInstanceOf($entry, $class, $message); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotInstanceOf($value, $class, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::notInstanceOf($entry, $class, $message); - } - } - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsInstanceOfAny($value, $classes, $message = '') - { - null === $value || static::isInstanceOfAny($value, $classes, $message); - } - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsInstanceOfAny($value, $classes, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isInstanceOfAny($entry, $classes, $message); - } - } - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsInstanceOfAny($value, $classes, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isInstanceOfAny($entry, $classes, $message); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType|class-string|null $value - * - * @param object|string|null $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsAOf($value, $class, $message = '') - { - null === $value || static::isAOf($value, $class, $message); - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable> $value - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsAOf($value, $class, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isAOf($entry, $class, $message); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable|null> $value - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsAOf($value, $class, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isAOf($entry, $class, $message); - } - } - - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * - * @param object|string|null $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsNotA($value, $class, $message = '') - { - null === $value || static::isNotA($value, $class, $message); - } - - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsNotA($value, $class, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isNotA($entry, $class, $message); - } - } - - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable $value - * @psalm-assert iterable|null> $value - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsNotA($value, $class, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isNotA($entry, $class, $message); - } - } - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param object|string|null $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsAnyOf($value, $classes, $message = '') - { - null === $value || static::isAnyOf($value, $classes, $message); - } - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param iterable $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsAnyOf($value, $classes, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isAnyOf($entry, $classes, $message); - } - } - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param iterable $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsAnyOf($value, $classes, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isAnyOf($entry, $classes, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert empty $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsEmpty($value, $message = '') - { - null === $value || static::isEmpty($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsEmpty($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::isEmpty($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsEmpty($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::isEmpty($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotEmpty($value, $message = '') - { - null === $value || static::notEmpty($value, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotEmpty($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notEmpty($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotEmpty($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::notEmpty($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNull($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::null($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotNull($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notNull($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert true|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrTrue($value, $message = '') - { - null === $value || static::true($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allTrue($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::true($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrTrue($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::true($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert false|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrFalse($value, $message = '') - { - null === $value || static::false($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allFalse($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::false($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrFalse($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::false($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotFalse($value, $message = '') - { - null === $value || static::notFalse($value, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotFalse($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notFalse($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotFalse($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::notFalse($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIp($value, $message = '') - { - null === $value || static::ip($value, $message); - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIp($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::ip($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIp($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::ip($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIpv4($value, $message = '') - { - null === $value || static::ipv4($value, $message); - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIpv4($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::ipv4($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIpv4($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::ipv4($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIpv6($value, $message = '') - { - null === $value || static::ipv6($value, $message); - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIpv6($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::ipv6($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIpv6($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::ipv6($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrEmail($value, $message = '') - { - null === $value || static::email($value, $message); - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allEmail($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::email($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrEmail($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::email($entry, $message); - } - } - - /** - * @param array|null $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrUniqueValues($values, $message = '') - { - null === $values || static::uniqueValues($values, $message); - } - - /** - * @param iterable $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allUniqueValues($values, $message = '') - { - static::isIterable($values); - - foreach ($values as $entry) { - static::uniqueValues($entry, $message); - } - } - - /** - * @param iterable $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrUniqueValues($values, $message = '') - { - static::isIterable($values); - - foreach ($values as $entry) { - null === $entry || static::uniqueValues($entry, $message); - } - } - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrEq($value, $expect, $message = '') - { - null === $value || static::eq($value, $expect, $message); - } - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allEq($value, $expect, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::eq($entry, $expect, $message); - } - } - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrEq($value, $expect, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::eq($entry, $expect, $message); - } - } - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotEq($value, $expect, $message = '') - { - null === $value || static::notEq($value, $expect, $message); - } - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotEq($value, $expect, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notEq($entry, $expect, $message); - } - } - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotEq($value, $expect, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::notEq($entry, $expect, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrSame($value, $expect, $message = '') - { - null === $value || static::same($value, $expect, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allSame($value, $expect, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::same($entry, $expect, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrSame($value, $expect, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::same($entry, $expect, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotSame($value, $expect, $message = '') - { - null === $value || static::notSame($value, $expect, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotSame($value, $expect, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notSame($entry, $expect, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotSame($value, $expect, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::notSame($entry, $expect, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrGreaterThan($value, $limit, $message = '') - { - null === $value || static::greaterThan($value, $limit, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allGreaterThan($value, $limit, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::greaterThan($entry, $limit, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrGreaterThan($value, $limit, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::greaterThan($entry, $limit, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrGreaterThanEq($value, $limit, $message = '') - { - null === $value || static::greaterThanEq($value, $limit, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allGreaterThanEq($value, $limit, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::greaterThanEq($entry, $limit, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrGreaterThanEq($value, $limit, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::greaterThanEq($entry, $limit, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLessThan($value, $limit, $message = '') - { - null === $value || static::lessThan($value, $limit, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLessThan($value, $limit, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::lessThan($entry, $limit, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrLessThan($value, $limit, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::lessThan($entry, $limit, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLessThanEq($value, $limit, $message = '') - { - null === $value || static::lessThanEq($value, $limit, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLessThanEq($value, $limit, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::lessThanEq($entry, $limit, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrLessThanEq($value, $limit, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::lessThanEq($entry, $limit, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrRange($value, $min, $max, $message = '') - { - null === $value || static::range($value, $min, $max, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allRange($value, $min, $max, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::range($entry, $min, $max, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrRange($value, $min, $max, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::range($entry, $min, $max, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrOneOf($value, $values, $message = '') - { - null === $value || static::oneOf($value, $values, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allOneOf($value, $values, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::oneOf($entry, $values, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrOneOf($value, $values, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::oneOf($entry, $values, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrInArray($value, $values, $message = '') - { - null === $value || static::inArray($value, $values, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allInArray($value, $values, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::inArray($entry, $values, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrInArray($value, $values, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::inArray($entry, $values, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrContains($value, $subString, $message = '') - { - null === $value || static::contains($value, $subString, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allContains($value, $subString, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::contains($entry, $subString, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrContains($value, $subString, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::contains($entry, $subString, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotContains($value, $subString, $message = '') - { - null === $value || static::notContains($value, $subString, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotContains($value, $subString, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notContains($entry, $subString, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotContains($value, $subString, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::notContains($entry, $subString, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotWhitespaceOnly($value, $message = '') - { - null === $value || static::notWhitespaceOnly($value, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotWhitespaceOnly($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notWhitespaceOnly($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotWhitespaceOnly($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::notWhitespaceOnly($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrStartsWith($value, $prefix, $message = '') - { - null === $value || static::startsWith($value, $prefix, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allStartsWith($value, $prefix, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::startsWith($entry, $prefix, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrStartsWith($value, $prefix, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::startsWith($entry, $prefix, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotStartsWith($value, $prefix, $message = '') - { - null === $value || static::notStartsWith($value, $prefix, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotStartsWith($value, $prefix, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notStartsWith($entry, $prefix, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotStartsWith($value, $prefix, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::notStartsWith($entry, $prefix, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrStartsWithLetter($value, $message = '') - { - null === $value || static::startsWithLetter($value, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allStartsWithLetter($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::startsWithLetter($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrStartsWithLetter($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::startsWithLetter($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrEndsWith($value, $suffix, $message = '') - { - null === $value || static::endsWith($value, $suffix, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allEndsWith($value, $suffix, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::endsWith($entry, $suffix, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrEndsWith($value, $suffix, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::endsWith($entry, $suffix, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotEndsWith($value, $suffix, $message = '') - { - null === $value || static::notEndsWith($value, $suffix, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotEndsWith($value, $suffix, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notEndsWith($entry, $suffix, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotEndsWith($value, $suffix, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::notEndsWith($entry, $suffix, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrRegex($value, $pattern, $message = '') - { - null === $value || static::regex($value, $pattern, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allRegex($value, $pattern, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::regex($entry, $pattern, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrRegex($value, $pattern, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::regex($entry, $pattern, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotRegex($value, $pattern, $message = '') - { - null === $value || static::notRegex($value, $pattern, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotRegex($value, $pattern, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::notRegex($entry, $pattern, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotRegex($value, $pattern, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::notRegex($entry, $pattern, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrUnicodeLetters($value, $message = '') - { - null === $value || static::unicodeLetters($value, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allUnicodeLetters($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::unicodeLetters($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrUnicodeLetters($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::unicodeLetters($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrAlpha($value, $message = '') - { - null === $value || static::alpha($value, $message); - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allAlpha($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::alpha($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrAlpha($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::alpha($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrDigits($value, $message = '') - { - null === $value || static::digits($value, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allDigits($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::digits($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrDigits($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::digits($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrAlnum($value, $message = '') - { - null === $value || static::alnum($value, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allAlnum($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::alnum($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrAlnum($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::alnum($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert lowercase-string|null $value - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLower($value, $message = '') - { - null === $value || static::lower($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLower($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::lower($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrLower($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::lower($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrUpper($value, $message = '') - { - null === $value || static::upper($value, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allUpper($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::upper($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrUpper($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::upper($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLength($value, $length, $message = '') - { - null === $value || static::length($value, $length, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLength($value, $length, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::length($entry, $length, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrLength($value, $length, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::length($entry, $length, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMinLength($value, $min, $message = '') - { - null === $value || static::minLength($value, $min, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMinLength($value, $min, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::minLength($entry, $min, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMinLength($value, $min, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::minLength($entry, $min, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMaxLength($value, $max, $message = '') - { - null === $value || static::maxLength($value, $max, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMaxLength($value, $max, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::maxLength($entry, $max, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMaxLength($value, $max, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::maxLength($entry, $max, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLengthBetween($value, $min, $max, $message = '') - { - null === $value || static::lengthBetween($value, $min, $max, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLengthBetween($value, $min, $max, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::lengthBetween($entry, $min, $max, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrLengthBetween($value, $min, $max, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::lengthBetween($entry, $min, $max, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrFileExists($value, $message = '') - { - null === $value || static::fileExists($value, $message); - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allFileExists($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::fileExists($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrFileExists($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::fileExists($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrFile($value, $message = '') - { - null === $value || static::file($value, $message); - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allFile($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::file($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrFile($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::file($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrDirectory($value, $message = '') - { - null === $value || static::directory($value, $message); - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allDirectory($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::directory($entry, $message); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrDirectory($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::directory($entry, $message); - } - } - - /** - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrReadable($value, $message = '') - { - null === $value || static::readable($value, $message); - } - - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allReadable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::readable($entry, $message); - } - } - - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrReadable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::readable($entry, $message); - } - } - - /** - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrWritable($value, $message = '') - { - null === $value || static::writable($value, $message); - } - - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allWritable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::writable($entry, $message); - } - } - - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrWritable($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::writable($entry, $message); - } - } - - /** - * @psalm-assert class-string|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrClassExists($value, $message = '') - { - null === $value || static::classExists($value, $message); - } - - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allClassExists($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::classExists($entry, $message); - } - } - - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrClassExists($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::classExists($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert class-string|ExpectedType|null $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrSubclassOf($value, $class, $message = '') - { - null === $value || static::subclassOf($value, $class, $message); - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable|ExpectedType> $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allSubclassOf($value, $class, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::subclassOf($entry, $class, $message); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable|ExpectedType|null> $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrSubclassOf($value, $class, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::subclassOf($entry, $class, $message); - } - } - - /** - * @psalm-assert class-string|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrInterfaceExists($value, $message = '') - { - null === $value || static::interfaceExists($value, $message); - } - - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allInterfaceExists($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::interfaceExists($entry, $message); - } - } - - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrInterfaceExists($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::interfaceExists($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert class-string|null $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrImplementsInterface($value, $interface, $message = '') - { - null === $value || static::implementsInterface($value, $interface, $message); - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert iterable> $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allImplementsInterface($value, $interface, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::implementsInterface($entry, $interface, $message); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert iterable|null> $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrImplementsInterface($value, $interface, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::implementsInterface($entry, $interface, $message); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrPropertyExists($classOrObject, $property, $message = '') - { - null === $classOrObject || static::propertyExists($classOrObject, $property, $message); - } - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allPropertyExists($classOrObject, $property, $message = '') - { - static::isIterable($classOrObject); - - foreach ($classOrObject as $entry) { - static::propertyExists($entry, $property, $message); - } - } - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrPropertyExists($classOrObject, $property, $message = '') - { - static::isIterable($classOrObject); - - foreach ($classOrObject as $entry) { - null === $entry || static::propertyExists($entry, $property, $message); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrPropertyNotExists($classOrObject, $property, $message = '') - { - null === $classOrObject || static::propertyNotExists($classOrObject, $property, $message); - } - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allPropertyNotExists($classOrObject, $property, $message = '') - { - static::isIterable($classOrObject); - - foreach ($classOrObject as $entry) { - static::propertyNotExists($entry, $property, $message); - } - } - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrPropertyNotExists($classOrObject, $property, $message = '') - { - static::isIterable($classOrObject); - - foreach ($classOrObject as $entry) { - null === $entry || static::propertyNotExists($entry, $property, $message); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMethodExists($classOrObject, $method, $message = '') - { - null === $classOrObject || static::methodExists($classOrObject, $method, $message); - } - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMethodExists($classOrObject, $method, $message = '') - { - static::isIterable($classOrObject); - - foreach ($classOrObject as $entry) { - static::methodExists($entry, $method, $message); - } - } - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMethodExists($classOrObject, $method, $message = '') - { - static::isIterable($classOrObject); - - foreach ($classOrObject as $entry) { - null === $entry || static::methodExists($entry, $method, $message); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMethodNotExists($classOrObject, $method, $message = '') - { - null === $classOrObject || static::methodNotExists($classOrObject, $method, $message); - } - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMethodNotExists($classOrObject, $method, $message = '') - { - static::isIterable($classOrObject); - - foreach ($classOrObject as $entry) { - static::methodNotExists($entry, $method, $message); - } - } - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMethodNotExists($classOrObject, $method, $message = '') - { - static::isIterable($classOrObject); - - foreach ($classOrObject as $entry) { - null === $entry || static::methodNotExists($entry, $method, $message); - } - } - - /** - * @psalm-pure - * - * @param array|null $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrKeyExists($array, $key, $message = '') - { - null === $array || static::keyExists($array, $key, $message); - } - - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allKeyExists($array, $key, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - static::keyExists($entry, $key, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrKeyExists($array, $key, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - null === $entry || static::keyExists($entry, $key, $message); - } - } - - /** - * @psalm-pure - * - * @param array|null $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrKeyNotExists($array, $key, $message = '') - { - null === $array || static::keyNotExists($array, $key, $message); - } - - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allKeyNotExists($array, $key, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - static::keyNotExists($entry, $key, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrKeyNotExists($array, $key, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - null === $entry || static::keyNotExists($entry, $key, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert array-key|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrValidArrayKey($value, $message = '') - { - null === $value || static::validArrayKey($value, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allValidArrayKey($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::validArrayKey($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrValidArrayKey($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::validArrayKey($entry, $message); - } - } - - /** - * @param Countable|array|null $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrCount($array, $number, $message = '') - { - null === $array || static::count($array, $number, $message); - } - - /** - * @param iterable $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allCount($array, $number, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - static::count($entry, $number, $message); - } - } - - /** - * @param iterable $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrCount($array, $number, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - null === $entry || static::count($entry, $number, $message); - } - } - - /** - * @param Countable|array|null $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMinCount($array, $min, $message = '') - { - null === $array || static::minCount($array, $min, $message); - } - - /** - * @param iterable $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMinCount($array, $min, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - static::minCount($entry, $min, $message); - } - } - - /** - * @param iterable $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMinCount($array, $min, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - null === $entry || static::minCount($entry, $min, $message); - } - } - - /** - * @param Countable|array|null $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMaxCount($array, $max, $message = '') - { - null === $array || static::maxCount($array, $max, $message); - } - - /** - * @param iterable $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMaxCount($array, $max, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - static::maxCount($entry, $max, $message); - } - } - - /** - * @param iterable $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMaxCount($array, $max, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - null === $entry || static::maxCount($entry, $max, $message); - } - } - - /** - * @param Countable|array|null $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrCountBetween($array, $min, $max, $message = '') - { - null === $array || static::countBetween($array, $min, $max, $message); - } - - /** - * @param iterable $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allCountBetween($array, $min, $max, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - static::countBetween($entry, $min, $max, $message); - } - } - - /** - * @param iterable $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrCountBetween($array, $min, $max, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - null === $entry || static::countBetween($entry, $min, $max, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert list|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsList($array, $message = '') - { - null === $array || static::isList($array, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsList($array, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - static::isList($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsList($array, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - null === $entry || static::isList($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert non-empty-list|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsNonEmptyList($array, $message = '') - { - null === $array || static::isNonEmptyList($array, $message); - } - - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsNonEmptyList($array, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - static::isNonEmptyList($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsNonEmptyList($array, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - null === $entry || static::isNonEmptyList($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array|null $array - * @psalm-assert array|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsMap($array, $message = '') - { - null === $array || static::isMap($array, $message); - } - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable> $array - * @psalm-assert iterable> $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsMap($array, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - static::isMap($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable|null> $array - * @psalm-assert iterable|null> $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsMap($array, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - null === $entry || static::isMap($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsNonEmptyMap($array, $message = '') - { - null === $array || static::isNonEmptyMap($array, $message); - } - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable> $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsNonEmptyMap($array, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - static::isNonEmptyMap($entry, $message); - } - } - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable|null> $array - * @psalm-assert iterable|null> $array - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsNonEmptyMap($array, $message = '') - { - static::isIterable($array); - - foreach ($array as $entry) { - null === $entry || static::isNonEmptyMap($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrUuid($value, $message = '') - { - null === $value || static::uuid($value, $message); - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allUuid($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - static::uuid($entry, $message); - } - } - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrUuid($value, $message = '') - { - static::isIterable($value); - - foreach ($value as $entry) { - null === $entry || static::uuid($entry, $message); - } - } - - /** - * @psalm-param class-string $class - * - * @param Closure|null $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrThrows($expression, $class = 'Exception', $message = '') - { - null === $expression || static::throws($expression, $class, $message); - } - - /** - * @psalm-param class-string $class - * - * @param iterable $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allThrows($expression, $class = 'Exception', $message = '') - { - static::isIterable($expression); - - foreach ($expression as $entry) { - static::throws($entry, $class, $message); - } - } - - /** - * @psalm-param class-string $class - * - * @param iterable $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrThrows($expression, $class = 'Exception', $message = '') - { - static::isIterable($expression); - - foreach ($expression as $entry) { - null === $entry || static::throws($entry, $class, $message); - } - } -} diff --git a/vendor/webmozart/path-util/.gitignore b/vendor/webmozart/path-util/.gitignore deleted file mode 100644 index 3a9875b4..00000000 --- a/vendor/webmozart/path-util/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/vendor/ -composer.lock diff --git a/vendor/webmozart/path-util/.styleci.yml b/vendor/webmozart/path-util/.styleci.yml deleted file mode 100644 index 295fafec..00000000 --- a/vendor/webmozart/path-util/.styleci.yml +++ /dev/null @@ -1,8 +0,0 @@ -preset: symfony - -enabled: - - ordered_use - - strict - -disabled: - - empty_return diff --git a/vendor/webmozart/path-util/.travis.yml b/vendor/webmozart/path-util/.travis.yml deleted file mode 100644 index d103428e..00000000 --- a/vendor/webmozart/path-util/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -language: php - -sudo: false - -cache: - directories: - - $HOME/.composer/cache/files - -matrix: - include: - - php: 5.3 - - php: 5.4 - - php: 5.5 - - php: 5.6 - - php: 5.6 - env: COMPOSER_FLAGS='--prefer-lowest --prefer-stable' - - php: hhvm - - php: nightly - allow_failures: - - php: hhvm - - php: nightly - fast_finish: true - -install: composer update $COMPOSER_FLAGS -n - -script: vendor/bin/phpunit --verbose --coverage-clover=coverage.clover - -after_script: - - sh -c 'if [ "$TRAVIS_PHP_VERSION" != "hhvm" ]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi;' diff --git a/vendor/webmozart/path-util/CHANGELOG.md b/vendor/webmozart/path-util/CHANGELOG.md deleted file mode 100644 index b669a191..00000000 --- a/vendor/webmozart/path-util/CHANGELOG.md +++ /dev/null @@ -1,68 +0,0 @@ -Changelog -========= - -* 2.3.0 (2015-12-17) - - * added `Url::makeRelative()` for calculating relative paths between URLs - * fixed `Path::makeRelative()` to trim leading dots when moving outside of - the base path - -* 2.2.3 (2015-10-05) - - * fixed `Path::makeRelative()` to produce `..` when called with the parent - directory of a path - -* 2.2.2 (2015-08-24) - - * `Path::makeAbsolute()` does not fail anymore if an absolute path is passed - with a different root (partition) than the base path - -* 2.2.1 (2015-08-24) - - * fixed minimum versions in composer.json - -* 2.2.0 (2015-08-14) - - * added `Path::normalize()` - -* 2.1.0 (2015-07-14) - - * `Path::canonicalize()` now turns `~` into the user's home directory on - Unix and Windows 8 or later. - -* 2.0.0 (2015-05-21) - - * added support for streams, e.g. "phar://C:/path/to/file" - * added `Path::join()` - * all `Path` methods now throw exceptions if parameters with invalid types are - passed - * added an internal buffer to `Path::canonicalize()` in order to increase the - performance of the `Path` class - -* 1.1.0 (2015-03-19) - - * added `Path::getFilename()` - * added `Path::getFilenameWithoutExtension()` - * added `Path::getExtension()` - * added `Path::hasExtension()` - * added `Path::changeExtension()` - * `Path::makeRelative()` now works when the absolute path and the base path - have equal directory names beneath different base directories - (e.g. "/webmozart/css/style.css" relative to "/puli/css") - -* 1.0.2 (2015-01-12) - - * `Path::makeAbsolute()` fails now if the base path is not absolute - * `Path::makeRelative()` now works when a relative path is passed and the base - path is empty - -* 1.0.1 (2014-12-03) - - * Added PHP 5.6 to Travis. - * Fixed bug in `Path::makeRelative()` when first argument is shorter than second - * Made HHVM compatibility mandatory in .travis.yml - * Added PHP 5.3.3 to travis.yml - -* 1.0.0 (2014-11-26) - - * first release diff --git a/vendor/webmozart/path-util/LICENSE b/vendor/webmozart/path-util/LICENSE deleted file mode 100644 index 9e2e3075..00000000 --- a/vendor/webmozart/path-util/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Bernhard Schussek - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/webmozart/path-util/README.md b/vendor/webmozart/path-util/README.md deleted file mode 100644 index de86ca11..00000000 --- a/vendor/webmozart/path-util/README.md +++ /dev/null @@ -1,143 +0,0 @@ -File Path Utility -================= - -[![Build Status](https://travis-ci.org/webmozart/path-util.svg?branch=2.3.0)](https://travis-ci.org/webmozart/path-util) -[![Build status](https://ci.appveyor.com/api/projects/status/d5uuypr6p162gpxf/branch/master?svg=true)](https://ci.appveyor.com/project/webmozart/path-util/branch/master) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/webmozart/path-util/badges/quality-score.png?b=2.3.0)](https://scrutinizer-ci.com/g/webmozart/path-util/?branch=2.3.0) -[![Latest Stable Version](https://poser.pugx.org/webmozart/path-util/v/stable.svg)](https://packagist.org/packages/webmozart/path-util) -[![Total Downloads](https://poser.pugx.org/webmozart/path-util/downloads.svg)](https://packagist.org/packages/webmozart/path-util) -[![Dependency Status](https://www.versioneye.com/php/webmozart:path-util/2.3.0/badge.svg)](https://www.versioneye.com/php/webmozart:path-util/2.3.0) - -Latest release: [2.3.0](https://packagist.org/packages/webmozart/path-util#2.3.0) - -PHP >= 5.3.3 - -This package provides robust, cross-platform utility functions for normalizing, -comparing and modifying file paths and URLs. - -Installation ------------- - -The utility can be installed with [Composer]: - -``` -$ composer require webmozart/path-util -``` - -Usage ------ - -Use the `Path` class to handle file paths: - -```php -use Webmozart\PathUtil\Path; - -echo Path::canonicalize('/var/www/vhost/webmozart/../config.ini'); -// => /var/www/vhost/config.ini - -echo Path::canonicalize('C:\Programs\Webmozart\..\config.ini'); -// => C:/Programs/config.ini - -echo Path::canonicalize('~/config.ini'); -// => /home/webmozart/config.ini - -echo Path::makeAbsolute('config/config.yml', '/var/www/project'); -// => /var/www/project/config/config.yml - -echo Path::makeRelative('/var/www/project/config/config.yml', '/var/www/project/uploads'); -// => ../config/config.yml - -$paths = array( - '/var/www/vhosts/project/httpdocs/config/config.yml', - '/var/www/vhosts/project/httpdocs/images/banana.gif', - '/var/www/vhosts/project/httpdocs/uploads/../images/nicer-banana.gif', -); - -Path::getLongestCommonBasePath($paths); -// => /var/www/vhosts/project/httpdocs - -Path::getFilename('/views/index.html.twig'); -// => index.html.twig - -Path::getFilenameWithoutExtension('/views/index.html.twig'); -// => index.html - -Path::getFilenameWithoutExtension('/views/index.html.twig', 'html.twig'); -Path::getFilenameWithoutExtension('/views/index.html.twig', '.html.twig'); -// => index - -Path::getExtension('/views/index.html.twig'); -// => twig - -Path::hasExtension('/views/index.html.twig'); -// => true - -Path::hasExtension('/views/index.html.twig', 'twig'); -// => true - -Path::hasExtension('/images/profile.jpg', array('jpg', 'png', 'gif')); -// => true - -Path::changeExtension('/images/profile.jpeg', 'jpg'); -// => /images/profile.jpg - -Path::join('phar://C:/Documents', 'projects/my-project.phar', 'composer.json'); -// => phar://C:/Documents/projects/my-project.phar/composer.json - -Path::getHomeDirectory(); -// => /home/webmozart -``` - -Use the `Url` class to handle URLs: - -```php -use Webmozart\PathUtil\Url; - -echo Url::makeRelative('http://example.com/css/style.css', 'http://example.com/puli'); -// => ../css/style.css - -echo Url::makeRelative('http://cdn.example.com/css/style.css', 'http://example.com/puli'); -// => http://cdn.example.com/css/style.css -``` - -Learn more in the [Documentation] and the [API Docs]. - -Authors -------- - -* [Bernhard Schussek] a.k.a. [@webmozart] -* [The Community Contributors] - -Documentation -------------- - -Read the [Documentation] if you want to learn more about the contained functions. - -Contribute ----------- - -Contributions are always welcome! - -* Report any bugs or issues you find on the [issue tracker]. -* You can grab the source code at the [Git repository]. - -Support -------- - -If you are having problems, send a mail to bschussek@gmail.com or shout out to -[@webmozart] on Twitter. - -License -------- - -All contents of this package are licensed under the [MIT license]. - -[Bernhard Schussek]: http://webmozarts.com -[The Community Contributors]: https://github.com/webmozart/path-util/graphs/contributors -[Composer]: https://getcomposer.org -[Documentation]: docs/usage.md -[API Docs]: https://webmozart.github.io/path-util/api/latest/class-Webmozart.PathUtil.Path.html -[issue tracker]: https://github.com/webmozart/path-util/issues -[Git repository]: https://github.com/webmozart/path-util -[@webmozart]: https://twitter.com/webmozart -[MIT license]: LICENSE diff --git a/vendor/webmozart/path-util/appveyor.yml b/vendor/webmozart/path-util/appveyor.yml deleted file mode 100644 index e32482d4..00000000 --- a/vendor/webmozart/path-util/appveyor.yml +++ /dev/null @@ -1,34 +0,0 @@ -build: false -shallow_clone: true -platform: x86 -clone_folder: c:\projects\webmozart\path-util - -cache: - - '%LOCALAPPDATA%\Composer\files' - -init: - - SET PATH=C:\Program Files\OpenSSL;c:\tools\php;%PATH% - -environment: - matrix: - - COMPOSER_FLAGS: "" - - COMPOSER_FLAGS: --prefer-lowest --prefer-stable - -install: - - cinst -y OpenSSL.Light - - cinst -y php - - cd c:\tools\php - - copy php.ini-production php.ini /Y - - echo date.timezone="UTC" >> php.ini - - echo extension_dir=ext >> php.ini - - echo extension=php_openssl.dll >> php.ini - - echo extension=php_mbstring.dll >> php.ini - - echo extension=php_fileinfo.dll >> php.ini - - echo memory_limit=1G >> php.ini - - cd c:\projects\webmozart\path-util - - php -r "readfile('http://getcomposer.org/installer');" | php - - php composer.phar update %COMPOSER_FLAGS% --no-interaction --no-progress - -test_script: - - cd c:\projects\webmozart\path-util - - vendor\bin\phpunit.bat --verbose diff --git a/vendor/webmozart/path-util/composer.json b/vendor/webmozart/path-util/composer.json deleted file mode 100644 index 884ccac0..00000000 --- a/vendor/webmozart/path-util/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "webmozart/path-util", - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "license": "MIT", - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "require": { - "php": ">=5.3.3", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Webmozart\\PathUtil\\Tests\\": "tests/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - } -} diff --git a/vendor/webmozart/path-util/docs/usage.md b/vendor/webmozart/path-util/docs/usage.md deleted file mode 100644 index 5135ca0b..00000000 --- a/vendor/webmozart/path-util/docs/usage.md +++ /dev/null @@ -1,203 +0,0 @@ -Painfree Handling of File Paths -=============================== - -Dealing with file paths usually involves some difficulties: - -* **System Heterogeneity**: File paths look different on different platforms. - UNIX file paths start with a slash ("/"), while Windows file paths start with - a system drive ("C:"). UNIX uses forward slashes, while Windows uses - backslashes by default ("\"). - -* **Absolute/Relative Paths**: Web applications frequently need to deal with - absolute and relative paths. Converting one to the other properly is tricky - and repetitive. - -This package provides few, but robust utility methods to simplify your life -when dealing with file paths. - -Canonicalization ----------------- - -*Canonicalization* is the transformation of a path into a normalized (the -"canonical") format. You can canonicalize a path with `Path::canonicalize()`: - -```php -echo Path::canonicalize('/var/www/vhost/webmozart/../config.ini'); -// => /var/www/vhost/config.ini -``` - -The following modifications happen during canonicalization: - -* "." segments are removed; -* ".." segments are resolved; -* backslashes ("\") are converted into forward slashes ("/"); -* root paths ("/" and "C:/") always terminate with a slash; -* non-root paths never terminate with a slash; -* schemes (such as "phar://") are kept; -* replace "~" with the user's home directory. - -You can pass absolute paths and relative paths to `canonicalize()`. When a -relative path is passed, ".." segments at the beginning of the path are kept: - -```php -echo Path::canonicalize('../uploads/../config/config.yml'); -// => ../config/config.yml -``` - -Malformed paths are returned unchanged: - -```php -echo Path::canonicalize('C:Programs/PHP/php.ini'); -// => C:Programs/PHP/php.ini -``` - -Converting Absolute/Relative Paths ----------------------------------- - -Absolute/relative paths can be converted with the methods `Path::makeAbsolute()` -and `Path::makeRelative()`. - -`makeAbsolute()` expects a relative path and a base path to base that relative -path upon: - -```php -echo Path::makeAbsolute('config/config.yml', '/var/www/project'); -// => /var/www/project/config/config.yml -``` - -If an absolute path is passed in the first argument, the absolute path is -returned unchanged: - -```php -echo Path::makeAbsolute('/usr/share/lib/config.ini', '/var/www/project'); -// => /usr/share/lib/config.ini -``` - -The method resolves ".." segments, if there are any: - -```php -echo Path::makeAbsolute('../config/config.yml', '/var/www/project/uploads'); -// => /var/www/project/config/config.yml -``` - -This method is very useful if you want to be able to accept relative paths (for -example, relative to the root directory of your project) and absolute paths at -the same time. - -`makeRelative()` is the inverse operation to `makeAbsolute()`: - -```php -echo Path::makeRelative('/var/www/project/config/config.yml', '/var/www/project'); -// => config/config.yml -``` - -If the path is not within the base path, the method will prepend ".." segments -as necessary: - -```php -echo Path::makeRelative('/var/www/project/config/config.yml', '/var/www/project/uploads'); -// => ../config/config.yml -``` - -Use `isAbsolute()` and `isRelative()` to check whether a path is absolute or -relative: - -```php -Path::isAbsolute('C:\Programs\PHP\php.ini') -// => true -``` - -All four methods internally canonicalize the passed path. - -Finding Longest Common Base Paths ---------------------------------- - -When you store absolute file paths on the file system, this leads to a lot of -duplicated information: - -```php -return array( - '/var/www/vhosts/project/httpdocs/config/config.yml', - '/var/www/vhosts/project/httpdocs/config/routing.yml', - '/var/www/vhosts/project/httpdocs/config/services.yml', - '/var/www/vhosts/project/httpdocs/images/banana.gif', - '/var/www/vhosts/project/httpdocs/uploads/images/nicer-banana.gif', -); -``` - -Especially when storing many paths, the amount of duplicated information is -noticeable. You can use `Path::getLongestCommonBasePath()` to check a list of -paths for a common base path: - -```php -$paths = array( - '/var/www/vhosts/project/httpdocs/config/config.yml', - '/var/www/vhosts/project/httpdocs/config/routing.yml', - '/var/www/vhosts/project/httpdocs/config/services.yml', - '/var/www/vhosts/project/httpdocs/images/banana.gif', - '/var/www/vhosts/project/httpdocs/uploads/images/nicer-banana.gif', -); - -Path::getLongestCommonBasePath($paths); -// => /var/www/vhosts/project/httpdocs -``` - -Use this path together with `Path::makeRelative()` to shorten the stored paths: - -```php -$bp = '/var/www/vhosts/project/httpdocs'; - -return array( - $bp.'/config/config.yml', - $bp.'/config/routing.yml', - $bp.'/config/services.yml', - $bp.'/images/banana.gif', - $bp.'/uploads/images/nicer-banana.gif', -); -``` - -`getLongestCommonBasePath()` always returns canonical paths. - -Use `Path::isBasePath()` to test whether a path is a base path of another path: - -```php -Path::isBasePath("/var/www", "/var/www/project"); -// => true - -Path::isBasePath("/var/www", "/var/www/project/.."); -// => true - -Path::isBasePath("/var/www", "/var/www/project/../.."); -// => false -``` - -Finding Directories/Root Directories ------------------------------------- - -PHP offers the function `dirname()` to obtain the directory path of a file path. -This method has a few quirks: - -* `dirname()` does not accept backslashes on UNIX -* `dirname("C:/Programs")` returns "C:", not "C:/" -* `dirname("C:/")` returns ".", not "C:/" -* `dirname("C:")` returns ".", not "C:/" -* `dirname("Programs")` returns ".", not "" -* `dirname()` does not canonicalize the result - -`Path::getDirectory()` fixes these shortcomings: - -```php -echo Path::getDirectory("C:\Programs"); -// => C:/ -``` - -Additionally, you can use `Path::getRoot()` to obtain the root of a path: - -```php -echo Path::getRoot("/etc/apache2/sites-available"); -// => / - -echo Path::getRoot("C:\Programs\Apache\Config"); -// => C:/ -``` - diff --git a/vendor/webmozart/path-util/phpunit.xml.dist b/vendor/webmozart/path-util/phpunit.xml.dist deleted file mode 100644 index 68cf2d33..00000000 --- a/vendor/webmozart/path-util/phpunit.xml.dist +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - ./tests/ - - - - - - - ./src/ - - - diff --git a/vendor/webmozart/path-util/src/Path.php b/vendor/webmozart/path-util/src/Path.php deleted file mode 100644 index 2f4a1779..00000000 --- a/vendor/webmozart/path-util/src/Path.php +++ /dev/null @@ -1,1008 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Webmozart\PathUtil; - -use InvalidArgumentException; -use RuntimeException; -use Webmozart\Assert\Assert; - -/** - * Contains utility methods for handling path strings. - * - * The methods in this class are able to deal with both UNIX and Windows paths - * with both forward and backward slashes. All methods return normalized parts - * containing only forward slashes and no excess "." and ".." segments. - * - * @since 1.0 - * - * @author Bernhard Schussek - * @author Thomas Schulz - */ -final class Path -{ - /** - * The number of buffer entries that triggers a cleanup operation. - */ - const CLEANUP_THRESHOLD = 1250; - - /** - * The buffer size after the cleanup operation. - */ - const CLEANUP_SIZE = 1000; - - /** - * Buffers input/output of {@link canonicalize()}. - * - * @var array - */ - private static $buffer = array(); - - /** - * The size of the buffer. - * - * @var int - */ - private static $bufferSize = 0; - - /** - * Canonicalizes the given path. - * - * During normalization, all slashes are replaced by forward slashes ("/"). - * Furthermore, all "." and ".." segments are removed as far as possible. - * ".." segments at the beginning of relative paths are not removed. - * - * ```php - * echo Path::canonicalize("\webmozart\puli\..\css\style.css"); - * // => /webmozart/css/style.css - * - * echo Path::canonicalize("../css/./style.css"); - * // => ../css/style.css - * ``` - * - * This method is able to deal with both UNIX and Windows paths. - * - * @param string $path A path string. - * - * @return string The canonical path. - * - * @since 1.0 Added method. - * @since 2.0 Method now fails if $path is not a string. - * @since 2.1 Added support for `~`. - */ - public static function canonicalize($path) - { - if ('' === $path) { - return ''; - } - - Assert::string($path, 'The path must be a string. Got: %s'); - - // This method is called by many other methods in this class. Buffer - // the canonicalized paths to make up for the severe performance - // decrease. - if (isset(self::$buffer[$path])) { - return self::$buffer[$path]; - } - - // Replace "~" with user's home directory. - if ('~' === $path[0]) { - $path = static::getHomeDirectory().substr($path, 1); - } - - $path = str_replace('\\', '/', $path); - - list($root, $pathWithoutRoot) = self::split($path); - - $parts = explode('/', $pathWithoutRoot); - $canonicalParts = array(); - - // Collapse "." and "..", if possible - foreach ($parts as $part) { - if ('.' === $part || '' === $part) { - continue; - } - - // Collapse ".." with the previous part, if one exists - // Don't collapse ".." if the previous part is also ".." - if ('..' === $part && count($canonicalParts) > 0 - && '..' !== $canonicalParts[count($canonicalParts) - 1]) { - array_pop($canonicalParts); - - continue; - } - - // Only add ".." prefixes for relative paths - if ('..' !== $part || '' === $root) { - $canonicalParts[] = $part; - } - } - - // Add the root directory again - self::$buffer[$path] = $canonicalPath = $root.implode('/', $canonicalParts); - ++self::$bufferSize; - - // Clean up regularly to prevent memory leaks - if (self::$bufferSize > self::CLEANUP_THRESHOLD) { - self::$buffer = array_slice(self::$buffer, -self::CLEANUP_SIZE, null, true); - self::$bufferSize = self::CLEANUP_SIZE; - } - - return $canonicalPath; - } - - /** - * Normalizes the given path. - * - * During normalization, all slashes are replaced by forward slashes ("/"). - * Contrary to {@link canonicalize()}, this method does not remove invalid - * or dot path segments. Consequently, it is much more efficient and should - * be used whenever the given path is known to be a valid, absolute system - * path. - * - * This method is able to deal with both UNIX and Windows paths. - * - * @param string $path A path string. - * - * @return string The normalized path. - * - * @since 2.2 Added method. - */ - public static function normalize($path) - { - Assert::string($path, 'The path must be a string. Got: %s'); - - return str_replace('\\', '/', $path); - } - - /** - * Returns the directory part of the path. - * - * This method is similar to PHP's dirname(), but handles various cases - * where dirname() returns a weird result: - * - * - dirname() does not accept backslashes on UNIX - * - dirname("C:/webmozart") returns "C:", not "C:/" - * - dirname("C:/") returns ".", not "C:/" - * - dirname("C:") returns ".", not "C:/" - * - dirname("webmozart") returns ".", not "" - * - dirname() does not canonicalize the result - * - * This method fixes these shortcomings and behaves like dirname() - * otherwise. - * - * The result is a canonical path. - * - * @param string $path A path string. - * - * @return string The canonical directory part. Returns the root directory - * if the root directory is passed. Returns an empty string - * if a relative path is passed that contains no slashes. - * Returns an empty string if an empty string is passed. - * - * @since 1.0 Added method. - * @since 2.0 Method now fails if $path is not a string. - */ - public static function getDirectory($path) - { - if ('' === $path) { - return ''; - } - - $path = static::canonicalize($path); - - // Maintain scheme - if (false !== ($pos = strpos($path, '://'))) { - $scheme = substr($path, 0, $pos + 3); - $path = substr($path, $pos + 3); - } else { - $scheme = ''; - } - - if (false !== ($pos = strrpos($path, '/'))) { - // Directory equals root directory "/" - if (0 === $pos) { - return $scheme.'/'; - } - - // Directory equals Windows root "C:/" - if (2 === $pos && ctype_alpha($path[0]) && ':' === $path[1]) { - return $scheme.substr($path, 0, 3); - } - - return $scheme.substr($path, 0, $pos); - } - - return ''; - } - - /** - * Returns canonical path of the user's home directory. - * - * Supported operating systems: - * - * - UNIX - * - Windows8 and upper - * - * If your operation system or environment isn't supported, an exception is thrown. - * - * The result is a canonical path. - * - * @return string The canonical home directory - * - * @throws RuntimeException If your operation system or environment isn't supported - * - * @since 2.1 Added method. - */ - public static function getHomeDirectory() - { - // For UNIX support - if (getenv('HOME')) { - return static::canonicalize(getenv('HOME')); - } - - // For >= Windows8 support - if (getenv('HOMEDRIVE') && getenv('HOMEPATH')) { - return static::canonicalize(getenv('HOMEDRIVE').getenv('HOMEPATH')); - } - - throw new RuntimeException("Your environment or operation system isn't supported"); - } - - /** - * Returns the root directory of a path. - * - * The result is a canonical path. - * - * @param string $path A path string. - * - * @return string The canonical root directory. Returns an empty string if - * the given path is relative or empty. - * - * @since 1.0 Added method. - * @since 2.0 Method now fails if $path is not a string. - */ - public static function getRoot($path) - { - if ('' === $path) { - return ''; - } - - Assert::string($path, 'The path must be a string. Got: %s'); - - // Maintain scheme - if (false !== ($pos = strpos($path, '://'))) { - $scheme = substr($path, 0, $pos + 3); - $path = substr($path, $pos + 3); - } else { - $scheme = ''; - } - - // UNIX root "/" or "\" (Windows style) - if ('/' === $path[0] || '\\' === $path[0]) { - return $scheme.'/'; - } - - $length = strlen($path); - - // Windows root - if ($length > 1 && ctype_alpha($path[0]) && ':' === $path[1]) { - // Special case: "C:" - if (2 === $length) { - return $scheme.$path.'/'; - } - - // Normal case: "C:/ or "C:\" - if ('/' === $path[2] || '\\' === $path[2]) { - return $scheme.$path[0].$path[1].'/'; - } - } - - return ''; - } - - /** - * Returns the file name from a file path. - * - * @param string $path The path string. - * - * @return string The file name. - * - * @since 1.1 Added method. - * @since 2.0 Method now fails if $path is not a string. - */ - public static function getFilename($path) - { - if ('' === $path) { - return ''; - } - - Assert::string($path, 'The path must be a string. Got: %s'); - - return basename($path); - } - - /** - * Returns the file name without the extension from a file path. - * - * @param string $path The path string. - * @param string|null $extension If specified, only that extension is cut - * off (may contain leading dot). - * - * @return string The file name without extension. - * - * @since 1.1 Added method. - * @since 2.0 Method now fails if $path or $extension have invalid types. - */ - public static function getFilenameWithoutExtension($path, $extension = null) - { - if ('' === $path) { - return ''; - } - - Assert::string($path, 'The path must be a string. Got: %s'); - Assert::nullOrString($extension, 'The extension must be a string or null. Got: %s'); - - if (null !== $extension) { - // remove extension and trailing dot - return rtrim(basename($path, $extension), '.'); - } - - return pathinfo($path, PATHINFO_FILENAME); - } - - /** - * Returns the extension from a file path. - * - * @param string $path The path string. - * @param bool $forceLowerCase Forces the extension to be lower-case - * (requires mbstring extension for correct - * multi-byte character handling in extension). - * - * @return string The extension of the file path (without leading dot). - * - * @since 1.1 Added method. - * @since 2.0 Method now fails if $path is not a string. - */ - public static function getExtension($path, $forceLowerCase = false) - { - if ('' === $path) { - return ''; - } - - Assert::string($path, 'The path must be a string. Got: %s'); - - $extension = pathinfo($path, PATHINFO_EXTENSION); - - if ($forceLowerCase) { - $extension = self::toLower($extension); - } - - return $extension; - } - - /** - * Returns whether the path has an extension. - * - * @param string $path The path string. - * @param string|array|null $extensions If null or not provided, checks if - * an extension exists, otherwise - * checks for the specified extension - * or array of extensions (with or - * without leading dot). - * @param bool $ignoreCase Whether to ignore case-sensitivity - * (requires mbstring extension for - * correct multi-byte character - * handling in the extension). - * - * @return bool Returns `true` if the path has an (or the specified) - * extension and `false` otherwise. - * - * @since 1.1 Added method. - * @since 2.0 Method now fails if $path or $extensions have invalid types. - */ - public static function hasExtension($path, $extensions = null, $ignoreCase = false) - { - if ('' === $path) { - return false; - } - - $extensions = is_object($extensions) ? array($extensions) : (array) $extensions; - - Assert::allString($extensions, 'The extensions must be strings. Got: %s'); - - $actualExtension = self::getExtension($path, $ignoreCase); - - // Only check if path has any extension - if (empty($extensions)) { - return '' !== $actualExtension; - } - - foreach ($extensions as $key => $extension) { - if ($ignoreCase) { - $extension = self::toLower($extension); - } - - // remove leading '.' in extensions array - $extensions[$key] = ltrim($extension, '.'); - } - - return in_array($actualExtension, $extensions); - } - - /** - * Changes the extension of a path string. - * - * @param string $path The path string with filename.ext to change. - * @param string $extension New extension (with or without leading dot). - * - * @return string The path string with new file extension. - * - * @since 1.1 Added method. - * @since 2.0 Method now fails if $path or $extension is not a string. - */ - public static function changeExtension($path, $extension) - { - if ('' === $path) { - return ''; - } - - Assert::string($extension, 'The extension must be a string. Got: %s'); - - $actualExtension = self::getExtension($path); - $extension = ltrim($extension, '.'); - - // No extension for paths - if ('/' === substr($path, -1)) { - return $path; - } - - // No actual extension in path - if (empty($actualExtension)) { - return $path.('.' === substr($path, -1) ? '' : '.').$extension; - } - - return substr($path, 0, -strlen($actualExtension)).$extension; - } - - /** - * Returns whether a path is absolute. - * - * @param string $path A path string. - * - * @return bool Returns true if the path is absolute, false if it is - * relative or empty. - * - * @since 1.0 Added method. - * @since 2.0 Method now fails if $path is not a string. - */ - public static function isAbsolute($path) - { - if ('' === $path) { - return false; - } - - Assert::string($path, 'The path must be a string. Got: %s'); - - // Strip scheme - if (false !== ($pos = strpos($path, '://'))) { - $path = substr($path, $pos + 3); - } - - // UNIX root "/" or "\" (Windows style) - if ('/' === $path[0] || '\\' === $path[0]) { - return true; - } - - // Windows root - if (strlen($path) > 1 && ctype_alpha($path[0]) && ':' === $path[1]) { - // Special case: "C:" - if (2 === strlen($path)) { - return true; - } - - // Normal case: "C:/ or "C:\" - if ('/' === $path[2] || '\\' === $path[2]) { - return true; - } - } - - return false; - } - - /** - * Returns whether a path is relative. - * - * @param string $path A path string. - * - * @return bool Returns true if the path is relative or empty, false if - * it is absolute. - * - * @since 1.0 Added method. - * @since 2.0 Method now fails if $path is not a string. - */ - public static function isRelative($path) - { - return !static::isAbsolute($path); - } - - /** - * Turns a relative path into an absolute path. - * - * Usually, the relative path is appended to the given base path. Dot - * segments ("." and "..") are removed/collapsed and all slashes turned - * into forward slashes. - * - * ```php - * echo Path::makeAbsolute("../style.css", "/webmozart/puli/css"); - * // => /webmozart/puli/style.css - * ``` - * - * If an absolute path is passed, that path is returned unless its root - * directory is different than the one of the base path. In that case, an - * exception is thrown. - * - * ```php - * Path::makeAbsolute("/style.css", "/webmozart/puli/css"); - * // => /style.css - * - * Path::makeAbsolute("C:/style.css", "C:/webmozart/puli/css"); - * // => C:/style.css - * - * Path::makeAbsolute("C:/style.css", "/webmozart/puli/css"); - * // InvalidArgumentException - * ``` - * - * If the base path is not an absolute path, an exception is thrown. - * - * The result is a canonical path. - * - * @param string $path A path to make absolute. - * @param string $basePath An absolute base path. - * - * @return string An absolute path in canonical form. - * - * @throws InvalidArgumentException If the base path is not absolute or if - * the given path is an absolute path with - * a different root than the base path. - * - * @since 1.0 Added method. - * @since 2.0 Method now fails if $path or $basePath is not a string. - * @since 2.2.2 Method does not fail anymore of $path and $basePath are - * absolute, but on different partitions. - */ - public static function makeAbsolute($path, $basePath) - { - Assert::stringNotEmpty($basePath, 'The base path must be a non-empty string. Got: %s'); - - if (!static::isAbsolute($basePath)) { - throw new InvalidArgumentException(sprintf( - 'The base path "%s" is not an absolute path.', - $basePath - )); - } - - if (static::isAbsolute($path)) { - return static::canonicalize($path); - } - - if (false !== ($pos = strpos($basePath, '://'))) { - $scheme = substr($basePath, 0, $pos + 3); - $basePath = substr($basePath, $pos + 3); - } else { - $scheme = ''; - } - - return $scheme.self::canonicalize(rtrim($basePath, '/\\').'/'.$path); - } - - /** - * Turns a path into a relative path. - * - * The relative path is created relative to the given base path: - * - * ```php - * echo Path::makeRelative("/webmozart/style.css", "/webmozart/puli"); - * // => ../style.css - * ``` - * - * If a relative path is passed and the base path is absolute, the relative - * path is returned unchanged: - * - * ```php - * Path::makeRelative("style.css", "/webmozart/puli/css"); - * // => style.css - * ``` - * - * If both paths are relative, the relative path is created with the - * assumption that both paths are relative to the same directory: - * - * ```php - * Path::makeRelative("style.css", "webmozart/puli/css"); - * // => ../../../style.css - * ``` - * - * If both paths are absolute, their root directory must be the same, - * otherwise an exception is thrown: - * - * ```php - * Path::makeRelative("C:/webmozart/style.css", "/webmozart/puli"); - * // InvalidArgumentException - * ``` - * - * If the passed path is absolute, but the base path is not, an exception - * is thrown as well: - * - * ```php - * Path::makeRelative("/webmozart/style.css", "webmozart/puli"); - * // InvalidArgumentException - * ``` - * - * If the base path is not an absolute path, an exception is thrown. - * - * The result is a canonical path. - * - * @param string $path A path to make relative. - * @param string $basePath A base path. - * - * @return string A relative path in canonical form. - * - * @throws InvalidArgumentException If the base path is not absolute or if - * the given path has a different root - * than the base path. - * - * @since 1.0 Added method. - * @since 2.0 Method now fails if $path or $basePath is not a string. - */ - public static function makeRelative($path, $basePath) - { - Assert::string($basePath, 'The base path must be a string. Got: %s'); - - $path = static::canonicalize($path); - $basePath = static::canonicalize($basePath); - - list($root, $relativePath) = self::split($path); - list($baseRoot, $relativeBasePath) = self::split($basePath); - - // If the base path is given as absolute path and the path is already - // relative, consider it to be relative to the given absolute path - // already - if ('' === $root && '' !== $baseRoot) { - // If base path is already in its root - if ('' === $relativeBasePath) { - $relativePath = ltrim($relativePath, './\\'); - } - - return $relativePath; - } - - // If the passed path is absolute, but the base path is not, we - // cannot generate a relative path - if ('' !== $root && '' === $baseRoot) { - throw new InvalidArgumentException(sprintf( - 'The absolute path "%s" cannot be made relative to the '. - 'relative path "%s". You should provide an absolute base '. - 'path instead.', - $path, - $basePath - )); - } - - // Fail if the roots of the two paths are different - if ($baseRoot && $root !== $baseRoot) { - throw new InvalidArgumentException(sprintf( - 'The path "%s" cannot be made relative to "%s", because they '. - 'have different roots ("%s" and "%s").', - $path, - $basePath, - $root, - $baseRoot - )); - } - - if ('' === $relativeBasePath) { - return $relativePath; - } - - // Build a "../../" prefix with as many "../" parts as necessary - $parts = explode('/', $relativePath); - $baseParts = explode('/', $relativeBasePath); - $dotDotPrefix = ''; - - // Once we found a non-matching part in the prefix, we need to add - // "../" parts for all remaining parts - $match = true; - - foreach ($baseParts as $i => $basePart) { - if ($match && isset($parts[$i]) && $basePart === $parts[$i]) { - unset($parts[$i]); - - continue; - } - - $match = false; - $dotDotPrefix .= '../'; - } - - return rtrim($dotDotPrefix.implode('/', $parts), '/'); - } - - /** - * Returns whether the given path is on the local filesystem. - * - * @param string $path A path string. - * - * @return bool Returns true if the path is local, false for a URL. - * - * @since 1.0 Added method. - * @since 2.0 Method now fails if $path is not a string. - */ - public static function isLocal($path) - { - Assert::string($path, 'The path must be a string. Got: %s'); - - return '' !== $path && false === strpos($path, '://'); - } - - /** - * Returns the longest common base path of a set of paths. - * - * Dot segments ("." and "..") are removed/collapsed and all slashes turned - * into forward slashes. - * - * ```php - * $basePath = Path::getLongestCommonBasePath(array( - * '/webmozart/css/style.css', - * '/webmozart/css/..' - * )); - * // => /webmozart - * ``` - * - * The root is returned if no common base path can be found: - * - * ```php - * $basePath = Path::getLongestCommonBasePath(array( - * '/webmozart/css/style.css', - * '/puli/css/..' - * )); - * // => / - * ``` - * - * If the paths are located on different Windows partitions, `null` is - * returned. - * - * ```php - * $basePath = Path::getLongestCommonBasePath(array( - * 'C:/webmozart/css/style.css', - * 'D:/webmozart/css/..' - * )); - * // => null - * ``` - * - * @param array $paths A list of paths. - * - * @return string|null The longest common base path in canonical form or - * `null` if the paths are on different Windows - * partitions. - * - * @since 1.0 Added method. - * @since 2.0 Method now fails if $paths are not strings. - */ - public static function getLongestCommonBasePath(array $paths) - { - Assert::allString($paths, 'The paths must be strings. Got: %s'); - - list($bpRoot, $basePath) = self::split(self::canonicalize(reset($paths))); - - for (next($paths); null !== key($paths) && '' !== $basePath; next($paths)) { - list($root, $path) = self::split(self::canonicalize(current($paths))); - - // If we deal with different roots (e.g. C:/ vs. D:/), it's time - // to quit - if ($root !== $bpRoot) { - return null; - } - - // Make the base path shorter until it fits into path - while (true) { - if ('.' === $basePath) { - // No more base paths - $basePath = ''; - - // Next path - continue 2; - } - - // Prevent false positives for common prefixes - // see isBasePath() - if (0 === strpos($path.'/', $basePath.'/')) { - // Next path - continue 2; - } - - $basePath = dirname($basePath); - } - } - - return $bpRoot.$basePath; - } - - /** - * Joins two or more path strings. - * - * The result is a canonical path. - * - * @param string[]|string $paths Path parts as parameters or array. - * - * @return string The joint path. - * - * @since 2.0 Added method. - */ - public static function join($paths) - { - if (!is_array($paths)) { - $paths = func_get_args(); - } - - Assert::allString($paths, 'The paths must be strings. Got: %s'); - - $finalPath = null; - $wasScheme = false; - - foreach ($paths as $path) { - $path = (string) $path; - - if ('' === $path) { - continue; - } - - if (null === $finalPath) { - // For first part we keep slashes, like '/top', 'C:\' or 'phar://' - $finalPath = $path; - $wasScheme = (strpos($path, '://') !== false); - continue; - } - - // Only add slash if previous part didn't end with '/' or '\' - if (!in_array(substr($finalPath, -1), array('/', '\\'))) { - $finalPath .= '/'; - } - - // If first part included a scheme like 'phar://' we allow current part to start with '/', otherwise trim - $finalPath .= $wasScheme ? $path : ltrim($path, '/'); - $wasScheme = false; - } - - if (null === $finalPath) { - return ''; - } - - return self::canonicalize($finalPath); - } - - /** - * Returns whether a path is a base path of another path. - * - * Dot segments ("." and "..") are removed/collapsed and all slashes turned - * into forward slashes. - * - * ```php - * Path::isBasePath('/webmozart', '/webmozart/css'); - * // => true - * - * Path::isBasePath('/webmozart', '/webmozart'); - * // => true - * - * Path::isBasePath('/webmozart', '/webmozart/..'); - * // => false - * - * Path::isBasePath('/webmozart', '/puli'); - * // => false - * ``` - * - * @param string $basePath The base path to test. - * @param string $ofPath The other path. - * - * @return bool Whether the base path is a base path of the other path. - * - * @since 1.0 Added method. - * @since 2.0 Method now fails if $basePath or $ofPath is not a string. - */ - public static function isBasePath($basePath, $ofPath) - { - Assert::string($basePath, 'The base path must be a string. Got: %s'); - - $basePath = self::canonicalize($basePath); - $ofPath = self::canonicalize($ofPath); - - // Append slashes to prevent false positives when two paths have - // a common prefix, for example /base/foo and /base/foobar. - // Don't append a slash for the root "/", because then that root - // won't be discovered as common prefix ("//" is not a prefix of - // "/foobar/"). - return 0 === strpos($ofPath.'/', rtrim($basePath, '/').'/'); - } - - /** - * Splits a part into its root directory and the remainder. - * - * If the path has no root directory, an empty root directory will be - * returned. - * - * If the root directory is a Windows style partition, the resulting root - * will always contain a trailing slash. - * - * list ($root, $path) = Path::split("C:/webmozart") - * // => array("C:/", "webmozart") - * - * list ($root, $path) = Path::split("C:") - * // => array("C:/", "") - * - * @param string $path The canonical path to split. - * - * @return string[] An array with the root directory and the remaining - * relative path. - */ - private static function split($path) - { - if ('' === $path) { - return array('', ''); - } - - // Remember scheme as part of the root, if any - if (false !== ($pos = strpos($path, '://'))) { - $root = substr($path, 0, $pos + 3); - $path = substr($path, $pos + 3); - } else { - $root = ''; - } - - $length = strlen($path); - - // Remove and remember root directory - if ('/' === $path[0]) { - $root .= '/'; - $path = $length > 1 ? substr($path, 1) : ''; - } elseif ($length > 1 && ctype_alpha($path[0]) && ':' === $path[1]) { - if (2 === $length) { - // Windows special case: "C:" - $root .= $path.'/'; - $path = ''; - } elseif ('/' === $path[2]) { - // Windows normal case: "C:/".. - $root .= substr($path, 0, 3); - $path = $length > 3 ? substr($path, 3) : ''; - } - } - - return array($root, $path); - } - - /** - * Converts string to lower-case (multi-byte safe if mbstring is installed). - * - * @param string $str The string - * - * @return string Lower case string - */ - private static function toLower($str) - { - if (function_exists('mb_strtolower')) { - return mb_strtolower($str, mb_detect_encoding($str)); - } - - return strtolower($str); - } - - private function __construct() - { - } -} diff --git a/vendor/webmozart/path-util/src/Url.php b/vendor/webmozart/path-util/src/Url.php deleted file mode 100644 index 834e7213..00000000 --- a/vendor/webmozart/path-util/src/Url.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Webmozart\PathUtil; - -use InvalidArgumentException; -use Webmozart\Assert\Assert; - -/** - * Contains utility methods for handling URL strings. - * - * The methods in this class are able to deal with URLs. - * - * @since 2.3 - * - * @author Bernhard Schussek - * @author Claudio Zizza - */ -final class Url -{ - /** - * Turns a URL into a relative path. - * - * The result is a canonical path. This class is using functionality of Path class. - * - * @see Path - * - * @param string $url A URL to make relative. - * @param string $baseUrl A base URL. - * - * @return string - * - * @throws InvalidArgumentException If the URL and base URL does - * not match. - */ - public static function makeRelative($url, $baseUrl) - { - Assert::string($url, 'The URL must be a string. Got: %s'); - Assert::string($baseUrl, 'The base URL must be a string. Got: %s'); - Assert::contains($baseUrl, '://', '%s is not an absolute Url.'); - - list($baseHost, $basePath) = self::split($baseUrl); - - if (false === strpos($url, '://')) { - if (0 === strpos($url, '/')) { - $host = $baseHost; - } else { - $host = ''; - } - $path = $url; - } else { - list($host, $path) = self::split($url); - } - - if ('' !== $host && $host !== $baseHost) { - throw new InvalidArgumentException(sprintf( - 'The URL "%s" cannot be made relative to "%s" since their host names are different.', - $host, - $baseHost - )); - } - - return Path::makeRelative($path, $basePath); - } - - /** - * Splits a URL into its host and the path. - * - * ```php - * list ($root, $path) = Path::split("http://example.com/webmozart") - * // => array("http://example.com", "/webmozart") - * - * list ($root, $path) = Path::split("http://example.com") - * // => array("http://example.com", "") - * ``` - * - * @param string $url The URL to split. - * - * @return string[] An array with the host and the path of the URL. - * - * @throws InvalidArgumentException If $url is not a URL. - */ - private static function split($url) - { - $pos = strpos($url, '://'); - $scheme = substr($url, 0, $pos + 3); - $url = substr($url, $pos + 3); - - if (false !== ($pos = strpos($url, '/'))) { - $host = substr($url, 0, $pos); - $url = substr($url, $pos); - } else { - // No path, only host - $host = $url; - $url = '/'; - } - - // At this point, we have $scheme, $host and $path - $root = $scheme.$host; - - return array($root, $url); - } -} diff --git a/vendor/webmozart/path-util/tests/PathTest.php b/vendor/webmozart/path-util/tests/PathTest.php deleted file mode 100644 index cc88b97a..00000000 --- a/vendor/webmozart/path-util/tests/PathTest.php +++ /dev/null @@ -1,1340 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Webmozart\PathUtil\Tests; - -use Webmozart\PathUtil\Path; - -/** - * @since 1.0 - * - * @author Bernhard Schussek - * @author Thomas Schulz - */ -class PathTest extends \PHPUnit_Framework_TestCase -{ - protected $storedEnv = array(); - - public function setUp() - { - $this->storedEnv['HOME'] = getenv('HOME'); - $this->storedEnv['HOMEDRIVE'] = getenv('HOMEDRIVE'); - $this->storedEnv['HOMEPATH'] = getenv('HOMEPATH'); - - putenv('HOME=/home/webmozart'); - putenv('HOMEDRIVE='); - putenv('HOMEPATH='); - } - - public function tearDown() - { - putenv('HOME='.$this->storedEnv['HOME']); - putenv('HOMEDRIVE='.$this->storedEnv['HOMEDRIVE']); - putenv('HOMEPATH='.$this->storedEnv['HOMEPATH']); - } - - public function provideCanonicalizationTests() - { - return array( - // relative paths (forward slash) - array('css/./style.css', 'css/style.css'), - array('css/../style.css', 'style.css'), - array('css/./../style.css', 'style.css'), - array('css/.././style.css', 'style.css'), - array('css/../../style.css', '../style.css'), - array('./css/style.css', 'css/style.css'), - array('../css/style.css', '../css/style.css'), - array('./../css/style.css', '../css/style.css'), - array('.././css/style.css', '../css/style.css'), - array('../../css/style.css', '../../css/style.css'), - array('', ''), - array('.', ''), - array('..', '..'), - array('./..', '..'), - array('../.', '..'), - array('../..', '../..'), - - // relative paths (backslash) - array('css\\.\\style.css', 'css/style.css'), - array('css\\..\\style.css', 'style.css'), - array('css\\.\\..\\style.css', 'style.css'), - array('css\\..\\.\\style.css', 'style.css'), - array('css\\..\\..\\style.css', '../style.css'), - array('.\\css\\style.css', 'css/style.css'), - array('..\\css\\style.css', '../css/style.css'), - array('.\\..\\css\\style.css', '../css/style.css'), - array('..\\.\\css\\style.css', '../css/style.css'), - array('..\\..\\css\\style.css', '../../css/style.css'), - - // absolute paths (forward slash, UNIX) - array('/css/style.css', '/css/style.css'), - array('/css/./style.css', '/css/style.css'), - array('/css/../style.css', '/style.css'), - array('/css/./../style.css', '/style.css'), - array('/css/.././style.css', '/style.css'), - array('/./css/style.css', '/css/style.css'), - array('/../css/style.css', '/css/style.css'), - array('/./../css/style.css', '/css/style.css'), - array('/.././css/style.css', '/css/style.css'), - array('/../../css/style.css', '/css/style.css'), - - // absolute paths (backslash, UNIX) - array('\\css\\style.css', '/css/style.css'), - array('\\css\\.\\style.css', '/css/style.css'), - array('\\css\\..\\style.css', '/style.css'), - array('\\css\\.\\..\\style.css', '/style.css'), - array('\\css\\..\\.\\style.css', '/style.css'), - array('\\.\\css\\style.css', '/css/style.css'), - array('\\..\\css\\style.css', '/css/style.css'), - array('\\.\\..\\css\\style.css', '/css/style.css'), - array('\\..\\.\\css\\style.css', '/css/style.css'), - array('\\..\\..\\css\\style.css', '/css/style.css'), - - // absolute paths (forward slash, Windows) - array('C:/css/style.css', 'C:/css/style.css'), - array('C:/css/./style.css', 'C:/css/style.css'), - array('C:/css/../style.css', 'C:/style.css'), - array('C:/css/./../style.css', 'C:/style.css'), - array('C:/css/.././style.css', 'C:/style.css'), - array('C:/./css/style.css', 'C:/css/style.css'), - array('C:/../css/style.css', 'C:/css/style.css'), - array('C:/./../css/style.css', 'C:/css/style.css'), - array('C:/.././css/style.css', 'C:/css/style.css'), - array('C:/../../css/style.css', 'C:/css/style.css'), - - // absolute paths (backslash, Windows) - array('C:\\css\\style.css', 'C:/css/style.css'), - array('C:\\css\\.\\style.css', 'C:/css/style.css'), - array('C:\\css\\..\\style.css', 'C:/style.css'), - array('C:\\css\\.\\..\\style.css', 'C:/style.css'), - array('C:\\css\\..\\.\\style.css', 'C:/style.css'), - array('C:\\.\\css\\style.css', 'C:/css/style.css'), - array('C:\\..\\css\\style.css', 'C:/css/style.css'), - array('C:\\.\\..\\css\\style.css', 'C:/css/style.css'), - array('C:\\..\\.\\css\\style.css', 'C:/css/style.css'), - array('C:\\..\\..\\css\\style.css', 'C:/css/style.css'), - - // Windows special case - array('C:', 'C:/'), - - // Don't change malformed path - array('C:css/style.css', 'C:css/style.css'), - - // absolute paths (stream, UNIX) - array('phar:///css/style.css', 'phar:///css/style.css'), - array('phar:///css/./style.css', 'phar:///css/style.css'), - array('phar:///css/../style.css', 'phar:///style.css'), - array('phar:///css/./../style.css', 'phar:///style.css'), - array('phar:///css/.././style.css', 'phar:///style.css'), - array('phar:///./css/style.css', 'phar:///css/style.css'), - array('phar:///../css/style.css', 'phar:///css/style.css'), - array('phar:///./../css/style.css', 'phar:///css/style.css'), - array('phar:///.././css/style.css', 'phar:///css/style.css'), - array('phar:///../../css/style.css', 'phar:///css/style.css'), - - // absolute paths (stream, Windows) - array('phar://C:/css/style.css', 'phar://C:/css/style.css'), - array('phar://C:/css/./style.css', 'phar://C:/css/style.css'), - array('phar://C:/css/../style.css', 'phar://C:/style.css'), - array('phar://C:/css/./../style.css', 'phar://C:/style.css'), - array('phar://C:/css/.././style.css', 'phar://C:/style.css'), - array('phar://C:/./css/style.css', 'phar://C:/css/style.css'), - array('phar://C:/../css/style.css', 'phar://C:/css/style.css'), - array('phar://C:/./../css/style.css', 'phar://C:/css/style.css'), - array('phar://C:/.././css/style.css', 'phar://C:/css/style.css'), - array('phar://C:/../../css/style.css', 'phar://C:/css/style.css'), - - // paths with "~" UNIX - array('~/css/style.css', '/home/webmozart/css/style.css'), - array('~/css/./style.css', '/home/webmozart/css/style.css'), - array('~/css/../style.css', '/home/webmozart/style.css'), - array('~/css/./../style.css', '/home/webmozart/style.css'), - array('~/css/.././style.css', '/home/webmozart/style.css'), - array('~/./css/style.css', '/home/webmozart/css/style.css'), - array('~/../css/style.css', '/home/css/style.css'), - array('~/./../css/style.css', '/home/css/style.css'), - array('~/.././css/style.css', '/home/css/style.css'), - array('~/../../css/style.css', '/css/style.css'), - ); - } - - /** - * @dataProvider provideCanonicalizationTests - */ - public function testCanonicalize($path, $canonicalized) - { - $this->assertSame($canonicalized, Path::canonicalize($path)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testCanonicalizeFailsIfInvalidPath() - { - Path::canonicalize(array()); - } - - public function provideGetDirectoryTests() - { - return array( - array('/webmozart/puli/style.css', '/webmozart/puli'), - array('/webmozart/puli', '/webmozart'), - array('/webmozart', '/'), - array('/', '/'), - array('', ''), - - array('\\webmozart\\puli\\style.css', '/webmozart/puli'), - array('\\webmozart\\puli', '/webmozart'), - array('\\webmozart', '/'), - array('\\', '/'), - - array('C:/webmozart/puli/style.css', 'C:/webmozart/puli'), - array('C:/webmozart/puli', 'C:/webmozart'), - array('C:/webmozart', 'C:/'), - array('C:/', 'C:/'), - array('C:', 'C:/'), - - array('C:\\webmozart\\puli\\style.css', 'C:/webmozart/puli'), - array('C:\\webmozart\\puli', 'C:/webmozart'), - array('C:\\webmozart', 'C:/'), - array('C:\\', 'C:/'), - - array('phar:///webmozart/puli/style.css', 'phar:///webmozart/puli'), - array('phar:///webmozart/puli', 'phar:///webmozart'), - array('phar:///webmozart', 'phar:///'), - array('phar:///', 'phar:///'), - - array('phar://C:/webmozart/puli/style.css', 'phar://C:/webmozart/puli'), - array('phar://C:/webmozart/puli', 'phar://C:/webmozart'), - array('phar://C:/webmozart', 'phar://C:/'), - array('phar://C:/', 'phar://C:/'), - - array('webmozart/puli/style.css', 'webmozart/puli'), - array('webmozart/puli', 'webmozart'), - array('webmozart', ''), - - array('webmozart\\puli\\style.css', 'webmozart/puli'), - array('webmozart\\puli', 'webmozart'), - array('webmozart', ''), - - array('/webmozart/./puli/style.css', '/webmozart/puli'), - array('/webmozart/../puli/style.css', '/puli'), - array('/webmozart/./../puli/style.css', '/puli'), - array('/webmozart/.././puli/style.css', '/puli'), - array('/webmozart/../../puli/style.css', '/puli'), - array('/.', '/'), - array('/..', '/'), - - array('C:webmozart', ''), - ); - } - - /** - * @dataProvider provideGetDirectoryTests - */ - public function testGetDirectory($path, $directory) - { - $this->assertSame($directory, Path::getDirectory($path)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testGetDirectoryFailsIfInvalidPath() - { - Path::getDirectory(array()); - } - - public function provideGetFilenameTests() - { - return array( - array('/webmozart/puli/style.css', 'style.css'), - array('/webmozart/puli/STYLE.CSS', 'STYLE.CSS'), - array('/webmozart/puli/style.css/', 'style.css'), - array('/webmozart/puli/', 'puli'), - array('/webmozart/puli', 'puli'), - array('/', ''), - array('', ''), - ); - } - - /** - * @dataProvider provideGetFilenameTests - */ - public function testGetFilename($path, $filename) - { - $this->assertSame($filename, Path::getFilename($path)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testGetFilenameFailsIfInvalidPath() - { - Path::getFilename(array()); - } - - public function provideGetFilenameWithoutExtensionTests() - { - return array( - array('/webmozart/puli/style.css.twig', null, 'style.css'), - array('/webmozart/puli/style.css.', null, 'style.css'), - array('/webmozart/puli/style.css', null, 'style'), - array('/webmozart/puli/.style.css', null, '.style'), - array('/webmozart/puli/', null, 'puli'), - array('/webmozart/puli', null, 'puli'), - array('/', null, ''), - array('', null, ''), - - array('/webmozart/puli/style.css', 'css', 'style'), - array('/webmozart/puli/style.css', '.css', 'style'), - array('/webmozart/puli/style.css', 'twig', 'style.css'), - array('/webmozart/puli/style.css', '.twig', 'style.css'), - array('/webmozart/puli/style.css', '', 'style.css'), - array('/webmozart/puli/style.css.', '', 'style.css'), - array('/webmozart/puli/style.css.', '.', 'style.css'), - array('/webmozart/puli/style.css.', '.css', 'style.css'), - array('/webmozart/puli/.style.css', 'css', '.style'), - array('/webmozart/puli/.style.css', '.css', '.style'), - ); - } - - /** - * @dataProvider provideGetFilenameWithoutExtensionTests - */ - public function testGetFilenameWithoutExtension($path, $extension, $filename) - { - $this->assertSame($filename, Path::getFilenameWithoutExtension($path, $extension)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testGetFilenameWithoutExtensionFailsIfInvalidPath() - { - Path::getFilenameWithoutExtension(array(), '.css'); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The extension must be a string or null. Got: array - */ - public function testGetFilenameWithoutExtensionFailsIfInvalidExtension() - { - Path::getFilenameWithoutExtension('/style.css', array()); - } - - public function provideGetExtensionTests() - { - $tests = array( - array('/webmozart/puli/style.css.twig', false, 'twig'), - array('/webmozart/puli/style.css', false, 'css'), - array('/webmozart/puli/style.css.', false, ''), - array('/webmozart/puli/', false, ''), - array('/webmozart/puli', false, ''), - array('/', false, ''), - array('', false, ''), - - array('/webmozart/puli/style.CSS', false, 'CSS'), - array('/webmozart/puli/style.CSS', true, 'css'), - array('/webmozart/puli/style.ÄÖÜ', false, 'ÄÖÜ'), - ); - - if (extension_loaded('mbstring')) { - // This can only be tested, when mbstring is installed - $tests[] = array('/webmozart/puli/style.ÄÖÜ', true, 'äöü'); - } - - return $tests; - } - - /** - * @dataProvider provideGetExtensionTests - */ - public function testGetExtension($path, $forceLowerCase, $extension) - { - $this->assertSame($extension, Path::getExtension($path, $forceLowerCase)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testGetExtensionFailsIfInvalidPath() - { - Path::getExtension(array()); - } - - public function provideHasExtensionTests() - { - $tests = array( - array(true, '/webmozart/puli/style.css.twig', null, false), - array(true, '/webmozart/puli/style.css', null, false), - array(false, '/webmozart/puli/style.css.', null, false), - array(false, '/webmozart/puli/', null, false), - array(false, '/webmozart/puli', null, false), - array(false, '/', null, false), - array(false, '', null, false), - - array(true, '/webmozart/puli/style.css.twig', 'twig', false), - array(false, '/webmozart/puli/style.css.twig', 'css', false), - array(true, '/webmozart/puli/style.css', 'css', false), - array(true, '/webmozart/puli/style.css', '.css', false), - array(true, '/webmozart/puli/style.css.', '', false), - array(false, '/webmozart/puli/', 'ext', false), - array(false, '/webmozart/puli', 'ext', false), - array(false, '/', 'ext', false), - array(false, '', 'ext', false), - - array(false, '/webmozart/puli/style.css', 'CSS', false), - array(true, '/webmozart/puli/style.css', 'CSS', true), - array(false, '/webmozart/puli/style.CSS', 'css', false), - array(true, '/webmozart/puli/style.CSS', 'css', true), - array(true, '/webmozart/puli/style.ÄÖÜ', 'ÄÖÜ', false), - - array(true, '/webmozart/puli/style.css', array('ext', 'css'), false), - array(true, '/webmozart/puli/style.css', array('.ext', '.css'), false), - array(true, '/webmozart/puli/style.css.', array('ext', ''), false), - array(false, '/webmozart/puli/style.css', array('foo', 'bar', ''), false), - array(false, '/webmozart/puli/style.css', array('.foo', '.bar', ''), false), - ); - - if (extension_loaded('mbstring')) { - // This can only be tested, when mbstring is installed - $tests[] = array(true, '/webmozart/puli/style.ÄÖÜ', 'äöü', true); - $tests[] = array(true, '/webmozart/puli/style.ÄÖÜ', array('äöü'), true); - } - - return $tests; - } - - /** - * @dataProvider provideHasExtensionTests - */ - public function testHasExtension($hasExtension, $path, $extension, $ignoreCase) - { - $this->assertSame($hasExtension, Path::hasExtension($path, $extension, $ignoreCase)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testHasExtensionFailsIfInvalidPath() - { - Path::hasExtension(array()); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The extensions must be strings. Got: stdClass - */ - public function testHasExtensionFailsIfInvalidExtension() - { - Path::hasExtension('/style.css', (object) array()); - } - - public function provideChangeExtensionTests() - { - return array( - array('/webmozart/puli/style.css.twig', 'html', '/webmozart/puli/style.css.html'), - array('/webmozart/puli/style.css', 'sass', '/webmozart/puli/style.sass'), - array('/webmozart/puli/style.css', '.sass', '/webmozart/puli/style.sass'), - array('/webmozart/puli/style.css', '', '/webmozart/puli/style.'), - array('/webmozart/puli/style.css.', 'twig', '/webmozart/puli/style.css.twig'), - array('/webmozart/puli/style.css.', '', '/webmozart/puli/style.css.'), - array('/webmozart/puli/style.css', 'äöü', '/webmozart/puli/style.äöü'), - array('/webmozart/puli/style.äöü', 'css', '/webmozart/puli/style.css'), - array('/webmozart/puli/', 'css', '/webmozart/puli/'), - array('/webmozart/puli', 'css', '/webmozart/puli.css'), - array('/', 'css', '/'), - array('', 'css', ''), - ); - } - - /** - * @dataProvider provideChangeExtensionTests - */ - public function testChangeExtension($path, $extension, $pathExpected) - { - static $call = 0; - $this->assertSame($pathExpected, Path::changeExtension($path, $extension)); - ++$call; - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testChangeExtensionFailsIfInvalidPath() - { - Path::changeExtension(array(), '.sass'); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The extension must be a string. Got: array - */ - public function testChangeExtensionFailsIfInvalidExtension() - { - Path::changeExtension('/style.css', array()); - } - - public function provideIsAbsolutePathTests() - { - return array( - array('/css/style.css', true), - array('/', true), - array('css/style.css', false), - array('', false), - - array('\\css\\style.css', true), - array('\\', true), - array('css\\style.css', false), - - array('C:/css/style.css', true), - array('D:/', true), - - array('E:\\css\\style.css', true), - array('F:\\', true), - - array('phar:///css/style.css', true), - array('phar:///', true), - - // Windows special case - array('C:', true), - - // Not considered absolute - array('C:css/style.css', false), - ); - } - - /** - * @dataProvider provideIsAbsolutePathTests - */ - public function testIsAbsolute($path, $isAbsolute) - { - $this->assertSame($isAbsolute, Path::isAbsolute($path)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testIsAbsoluteFailsIfInvalidPath() - { - Path::isAbsolute(array()); - } - - /** - * @dataProvider provideIsAbsolutePathTests - */ - public function testIsRelative($path, $isAbsolute) - { - $this->assertSame(!$isAbsolute, Path::isRelative($path)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testIsRelativeFailsIfInvalidPath() - { - Path::isRelative(array()); - } - - public function provideGetRootTests() - { - return array( - array('/css/style.css', '/'), - array('/', '/'), - array('css/style.css', ''), - array('', ''), - - array('\\css\\style.css', '/'), - array('\\', '/'), - array('css\\style.css', ''), - - array('C:/css/style.css', 'C:/'), - array('C:/', 'C:/'), - array('C:', 'C:/'), - - array('D:\\css\\style.css', 'D:/'), - array('D:\\', 'D:/'), - - array('phar:///css/style.css', 'phar:///'), - array('phar:///', 'phar:///'), - - array('phar://C:/css/style.css', 'phar://C:/'), - array('phar://C:/', 'phar://C:/'), - array('phar://C:', 'phar://C:/'), - ); - } - - /** - * @dataProvider provideGetRootTests - */ - public function testGetRoot($path, $root) - { - $this->assertSame($root, Path::getRoot($path)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testGetRootFailsIfInvalidPath() - { - Path::getRoot(array()); - } - - public function providePathTests() - { - return array( - // relative to absolute path - array('css/style.css', '/webmozart/puli', '/webmozart/puli/css/style.css'), - array('../css/style.css', '/webmozart/puli', '/webmozart/css/style.css'), - array('../../css/style.css', '/webmozart/puli', '/css/style.css'), - - // relative to root - array('css/style.css', '/', '/css/style.css'), - array('css/style.css', 'C:', 'C:/css/style.css'), - array('css/style.css', 'C:/', 'C:/css/style.css'), - - // same sub directories in different base directories - array('../../puli/css/style.css', '/webmozart/css', '/puli/css/style.css'), - - array('', '/webmozart/puli', '/webmozart/puli'), - array('..', '/webmozart/puli', '/webmozart'), - ); - } - - public function provideMakeAbsoluteTests() - { - return array_merge($this->providePathTests(), array( - // collapse dots - array('css/./style.css', '/webmozart/puli', '/webmozart/puli/css/style.css'), - array('css/../style.css', '/webmozart/puli', '/webmozart/puli/style.css'), - array('css/./../style.css', '/webmozart/puli', '/webmozart/puli/style.css'), - array('css/.././style.css', '/webmozart/puli', '/webmozart/puli/style.css'), - array('./css/style.css', '/webmozart/puli', '/webmozart/puli/css/style.css'), - - array('css\\.\\style.css', '\\webmozart\\puli', '/webmozart/puli/css/style.css'), - array('css\\..\\style.css', '\\webmozart\\puli', '/webmozart/puli/style.css'), - array('css\\.\\..\\style.css', '\\webmozart\\puli', '/webmozart/puli/style.css'), - array('css\\..\\.\\style.css', '\\webmozart\\puli', '/webmozart/puli/style.css'), - array('.\\css\\style.css', '\\webmozart\\puli', '/webmozart/puli/css/style.css'), - - // collapse dots on root - array('./css/style.css', '/', '/css/style.css'), - array('../css/style.css', '/', '/css/style.css'), - array('../css/./style.css', '/', '/css/style.css'), - array('../css/../style.css', '/', '/style.css'), - array('../css/./../style.css', '/', '/style.css'), - array('../css/.././style.css', '/', '/style.css'), - - array('.\\css\\style.css', '\\', '/css/style.css'), - array('..\\css\\style.css', '\\', '/css/style.css'), - array('..\\css\\.\\style.css', '\\', '/css/style.css'), - array('..\\css\\..\\style.css', '\\', '/style.css'), - array('..\\css\\.\\..\\style.css', '\\', '/style.css'), - array('..\\css\\..\\.\\style.css', '\\', '/style.css'), - - array('./css/style.css', 'C:/', 'C:/css/style.css'), - array('../css/style.css', 'C:/', 'C:/css/style.css'), - array('../css/./style.css', 'C:/', 'C:/css/style.css'), - array('../css/../style.css', 'C:/', 'C:/style.css'), - array('../css/./../style.css', 'C:/', 'C:/style.css'), - array('../css/.././style.css', 'C:/', 'C:/style.css'), - - array('.\\css\\style.css', 'C:\\', 'C:/css/style.css'), - array('..\\css\\style.css', 'C:\\', 'C:/css/style.css'), - array('..\\css\\.\\style.css', 'C:\\', 'C:/css/style.css'), - array('..\\css\\..\\style.css', 'C:\\', 'C:/style.css'), - array('..\\css\\.\\..\\style.css', 'C:\\', 'C:/style.css'), - array('..\\css\\..\\.\\style.css', 'C:\\', 'C:/style.css'), - - array('./css/style.css', 'phar:///', 'phar:///css/style.css'), - array('../css/style.css', 'phar:///', 'phar:///css/style.css'), - array('../css/./style.css', 'phar:///', 'phar:///css/style.css'), - array('../css/../style.css', 'phar:///', 'phar:///style.css'), - array('../css/./../style.css', 'phar:///', 'phar:///style.css'), - array('../css/.././style.css', 'phar:///', 'phar:///style.css'), - - array('./css/style.css', 'phar://C:/', 'phar://C:/css/style.css'), - array('../css/style.css', 'phar://C:/', 'phar://C:/css/style.css'), - array('../css/./style.css', 'phar://C:/', 'phar://C:/css/style.css'), - array('../css/../style.css', 'phar://C:/', 'phar://C:/style.css'), - array('../css/./../style.css', 'phar://C:/', 'phar://C:/style.css'), - array('../css/.././style.css', 'phar://C:/', 'phar://C:/style.css'), - - // absolute paths - array('/css/style.css', '/webmozart/puli', '/css/style.css'), - array('\\css\\style.css', '/webmozart/puli', '/css/style.css'), - array('C:/css/style.css', 'C:/webmozart/puli', 'C:/css/style.css'), - array('D:\\css\\style.css', 'D:/webmozart/puli', 'D:/css/style.css'), - )); - } - - /** - * @dataProvider provideMakeAbsoluteTests - */ - public function testMakeAbsolute($relativePath, $basePath, $absolutePath) - { - $this->assertSame($absolutePath, Path::makeAbsolute($relativePath, $basePath)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testMakeAbsoluteFailsIfInvalidPath() - { - Path::makeAbsolute(array(), '/webmozart/puli'); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The base path must be a non-empty string. Got: array - */ - public function testMakeAbsoluteFailsIfInvalidBasePath() - { - Path::makeAbsolute('css/style.css', array()); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The base path "webmozart/puli" is not an absolute path. - */ - public function testMakeAbsoluteFailsIfBasePathNotAbsolute() - { - Path::makeAbsolute('css/style.css', 'webmozart/puli'); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The base path must be a non-empty string. Got: "" - */ - public function testMakeAbsoluteFailsIfBasePathEmpty() - { - Path::makeAbsolute('css/style.css', ''); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The base path must be a non-empty string. Got: NULL - */ - public function testMakeAbsoluteFailsIfBasePathNull() - { - Path::makeAbsolute('css/style.css', null); - } - - public function provideAbsolutePathsWithDifferentRoots() - { - return array( - array('C:/css/style.css', '/webmozart/puli'), - array('C:/css/style.css', '\\webmozart\\puli'), - array('C:\\css\\style.css', '/webmozart/puli'), - array('C:\\css\\style.css', '\\webmozart\\puli'), - - array('/css/style.css', 'C:/webmozart/puli'), - array('/css/style.css', 'C:\\webmozart\\puli'), - array('\\css\\style.css', 'C:/webmozart/puli'), - array('\\css\\style.css', 'C:\\webmozart\\puli'), - - array('D:/css/style.css', 'C:/webmozart/puli'), - array('D:/css/style.css', 'C:\\webmozart\\puli'), - array('D:\\css\\style.css', 'C:/webmozart/puli'), - array('D:\\css\\style.css', 'C:\\webmozart\\puli'), - - array('phar:///css/style.css', '/webmozart/puli'), - array('/css/style.css', 'phar:///webmozart/puli'), - - array('phar://C:/css/style.css', 'C:/webmozart/puli'), - array('phar://C:/css/style.css', 'C:\\webmozart\\puli'), - array('phar://C:\\css\\style.css', 'C:/webmozart/puli'), - array('phar://C:\\css\\style.css', 'C:\\webmozart\\puli'), - ); - } - - /** - * @dataProvider provideAbsolutePathsWithDifferentRoots - */ - public function testMakeAbsoluteDoesNotFailIfDifferentRoot($basePath, $absolutePath) - { - // If a path in partition D: is passed, but $basePath is in partition - // C:, the path should be returned unchanged - $this->assertSame(Path::canonicalize($absolutePath), Path::makeAbsolute($absolutePath, $basePath)); - } - - public function provideMakeRelativeTests() - { - $paths = array_map(function (array $arguments) { - return array($arguments[2], $arguments[1], $arguments[0]); - }, $this->providePathTests()); - - return array_merge($paths, array( - array('/webmozart/puli/./css/style.css', '/webmozart/puli', 'css/style.css'), - array('/webmozart/puli/../css/style.css', '/webmozart/puli', '../css/style.css'), - array('/webmozart/puli/.././css/style.css', '/webmozart/puli', '../css/style.css'), - array('/webmozart/puli/./../css/style.css', '/webmozart/puli', '../css/style.css'), - array('/webmozart/puli/../../css/style.css', '/webmozart/puli', '../../css/style.css'), - array('/webmozart/puli/css/style.css', '/webmozart/./puli', 'css/style.css'), - array('/webmozart/puli/css/style.css', '/webmozart/../puli', '../webmozart/puli/css/style.css'), - array('/webmozart/puli/css/style.css', '/webmozart/./../puli', '../webmozart/puli/css/style.css'), - array('/webmozart/puli/css/style.css', '/webmozart/.././puli', '../webmozart/puli/css/style.css'), - array('/webmozart/puli/css/style.css', '/webmozart/../../puli', '../webmozart/puli/css/style.css'), - - // first argument shorter than second - array('/css', '/webmozart/puli', '../../css'), - - // second argument shorter than first - array('/webmozart/puli', '/css', '../webmozart/puli'), - - array('\\webmozart\\puli\\css\\style.css', '\\webmozart\\puli', 'css/style.css'), - array('\\webmozart\\css\\style.css', '\\webmozart\\puli', '../css/style.css'), - array('\\css\\style.css', '\\webmozart\\puli', '../../css/style.css'), - - array('C:/webmozart/puli/css/style.css', 'C:/webmozart/puli', 'css/style.css'), - array('C:/webmozart/css/style.css', 'C:/webmozart/puli', '../css/style.css'), - array('C:/css/style.css', 'C:/webmozart/puli', '../../css/style.css'), - - array('C:\\webmozart\\puli\\css\\style.css', 'C:\\webmozart\\puli', 'css/style.css'), - array('C:\\webmozart\\css\\style.css', 'C:\\webmozart\\puli', '../css/style.css'), - array('C:\\css\\style.css', 'C:\\webmozart\\puli', '../../css/style.css'), - - array('phar:///webmozart/puli/css/style.css', 'phar:///webmozart/puli', 'css/style.css'), - array('phar:///webmozart/css/style.css', 'phar:///webmozart/puli', '../css/style.css'), - array('phar:///css/style.css', 'phar:///webmozart/puli', '../../css/style.css'), - - array('phar://C:/webmozart/puli/css/style.css', 'phar://C:/webmozart/puli', 'css/style.css'), - array('phar://C:/webmozart/css/style.css', 'phar://C:/webmozart/puli', '../css/style.css'), - array('phar://C:/css/style.css', 'phar://C:/webmozart/puli', '../../css/style.css'), - - // already relative + already in root basepath - array('../style.css', '/', 'style.css'), - array('./style.css', '/', 'style.css'), - array('../../style.css', '/', 'style.css'), - array('..\\style.css', 'C:\\', 'style.css'), - array('.\\style.css', 'C:\\', 'style.css'), - array('..\\..\\style.css', 'C:\\', 'style.css'), - array('../style.css', 'C:/', 'style.css'), - array('./style.css', 'C:/', 'style.css'), - array('../../style.css', 'C:/', 'style.css'), - array('..\\style.css', '\\', 'style.css'), - array('.\\style.css', '\\', 'style.css'), - array('..\\..\\style.css', '\\', 'style.css'), - array('../style.css', 'phar:///', 'style.css'), - array('./style.css', 'phar:///', 'style.css'), - array('../../style.css', 'phar:///', 'style.css'), - array('..\\style.css', 'phar://C:\\', 'style.css'), - array('.\\style.css', 'phar://C:\\', 'style.css'), - array('..\\..\\style.css', 'phar://C:\\', 'style.css'), - - array('css/../style.css', '/', 'style.css'), - array('css/./style.css', '/', 'css/style.css'), - array('css\\..\\style.css', 'C:\\', 'style.css'), - array('css\\.\\style.css', 'C:\\', 'css/style.css'), - array('css/../style.css', 'C:/', 'style.css'), - array('css/./style.css', 'C:/', 'css/style.css'), - array('css\\..\\style.css', '\\', 'style.css'), - array('css\\.\\style.css', '\\', 'css/style.css'), - array('css/../style.css', 'phar:///', 'style.css'), - array('css/./style.css', 'phar:///', 'css/style.css'), - array('css\\..\\style.css', 'phar://C:\\', 'style.css'), - array('css\\.\\style.css', 'phar://C:\\', 'css/style.css'), - - // already relative - array('css/style.css', '/webmozart/puli', 'css/style.css'), - array('css\\style.css', '\\webmozart\\puli', 'css/style.css'), - - // both relative - array('css/style.css', 'webmozart/puli', '../../css/style.css'), - array('css\\style.css', 'webmozart\\puli', '../../css/style.css'), - - // relative to empty - array('css/style.css', '', 'css/style.css'), - array('css\\style.css', '', 'css/style.css'), - - // different slashes in path and base path - array('/webmozart/puli/css/style.css', '\\webmozart\\puli', 'css/style.css'), - array('\\webmozart\\puli\\css\\style.css', '/webmozart/puli', 'css/style.css'), - )); - } - - /** - * @dataProvider provideMakeRelativeTests - */ - public function testMakeRelative($absolutePath, $basePath, $relativePath) - { - $this->assertSame($relativePath, Path::makeRelative($absolutePath, $basePath)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testMakeRelativeFailsIfInvalidPath() - { - Path::makeRelative(array(), '/webmozart/puli'); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The base path must be a string. Got: array - */ - public function testMakeRelativeFailsIfInvalidBasePath() - { - Path::makeRelative('/webmozart/puli/css/style.css', array()); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The absolute path "/webmozart/puli/css/style.css" cannot be made relative to the relative path "webmozart/puli". You should provide an absolute base path instead. - */ - public function testMakeRelativeFailsIfAbsolutePathAndBasePathNotAbsolute() - { - Path::makeRelative('/webmozart/puli/css/style.css', 'webmozart/puli'); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The absolute path "/webmozart/puli/css/style.css" cannot be made relative to the relative path "". You should provide an absolute base path instead. - */ - public function testMakeRelativeFailsIfAbsolutePathAndBasePathEmpty() - { - Path::makeRelative('/webmozart/puli/css/style.css', ''); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The base path must be a string. Got: NULL - */ - public function testMakeRelativeFailsIfBasePathNull() - { - Path::makeRelative('/webmozart/puli/css/style.css', null); - } - - /** - * @dataProvider provideAbsolutePathsWithDifferentRoots - * @expectedException \InvalidArgumentException - */ - public function testMakeRelativeFailsIfDifferentRoot($absolutePath, $basePath) - { - Path::makeRelative($absolutePath, $basePath); - } - - public function provideIsLocalTests() - { - return array( - array('/bg.png', true), - array('bg.png', true), - array('http://example.com/bg.png', false), - array('http://example.com', false), - array('', false), - ); - } - - /** - * @dataProvider provideIsLocalTests - */ - public function testIsLocal($path, $isLocal) - { - $this->assertSame($isLocal, Path::isLocal($path)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testIsLocalFailsIfInvalidPath() - { - Path::isLocal(array()); - } - - public function provideGetLongestCommonBasePathTests() - { - return array( - // same paths - array(array('/base/path', '/base/path'), '/base/path'), - array(array('C:/base/path', 'C:/base/path'), 'C:/base/path'), - array(array('C:\\base\\path', 'C:\\base\\path'), 'C:/base/path'), - array(array('C:/base/path', 'C:\\base\\path'), 'C:/base/path'), - array(array('phar:///base/path', 'phar:///base/path'), 'phar:///base/path'), - array(array('phar://C:/base/path', 'phar://C:/base/path'), 'phar://C:/base/path'), - - // trailing slash - array(array('/base/path/', '/base/path'), '/base/path'), - array(array('C:/base/path/', 'C:/base/path'), 'C:/base/path'), - array(array('C:\\base\\path\\', 'C:\\base\\path'), 'C:/base/path'), - array(array('C:/base/path/', 'C:\\base\\path'), 'C:/base/path'), - array(array('phar:///base/path/', 'phar:///base/path'), 'phar:///base/path'), - array(array('phar://C:/base/path/', 'phar://C:/base/path'), 'phar://C:/base/path'), - - array(array('/base/path', '/base/path/'), '/base/path'), - array(array('C:/base/path', 'C:/base/path/'), 'C:/base/path'), - array(array('C:\\base\\path', 'C:\\base\\path\\'), 'C:/base/path'), - array(array('C:/base/path', 'C:\\base\\path\\'), 'C:/base/path'), - array(array('phar:///base/path', 'phar:///base/path/'), 'phar:///base/path'), - array(array('phar://C:/base/path', 'phar://C:/base/path/'), 'phar://C:/base/path'), - - // first in second - array(array('/base/path/sub', '/base/path'), '/base/path'), - array(array('C:/base/path/sub', 'C:/base/path'), 'C:/base/path'), - array(array('C:\\base\\path\\sub', 'C:\\base\\path'), 'C:/base/path'), - array(array('C:/base/path/sub', 'C:\\base\\path'), 'C:/base/path'), - array(array('phar:///base/path/sub', 'phar:///base/path'), 'phar:///base/path'), - array(array('phar://C:/base/path/sub', 'phar://C:/base/path'), 'phar://C:/base/path'), - - // second in first - array(array('/base/path', '/base/path/sub'), '/base/path'), - array(array('C:/base/path', 'C:/base/path/sub'), 'C:/base/path'), - array(array('C:\\base\\path', 'C:\\base\\path\\sub'), 'C:/base/path'), - array(array('C:/base/path', 'C:\\base\\path\\sub'), 'C:/base/path'), - array(array('phar:///base/path', 'phar:///base/path/sub'), 'phar:///base/path'), - array(array('phar://C:/base/path', 'phar://C:/base/path/sub'), 'phar://C:/base/path'), - - // first is prefix - array(array('/base/path/di', '/base/path/dir'), '/base/path'), - array(array('C:/base/path/di', 'C:/base/path/dir'), 'C:/base/path'), - array(array('C:\\base\\path\\di', 'C:\\base\\path\\dir'), 'C:/base/path'), - array(array('C:/base/path/di', 'C:\\base\\path\\dir'), 'C:/base/path'), - array(array('phar:///base/path/di', 'phar:///base/path/dir'), 'phar:///base/path'), - array(array('phar://C:/base/path/di', 'phar://C:/base/path/dir'), 'phar://C:/base/path'), - - // second is prefix - array(array('/base/path/dir', '/base/path/di'), '/base/path'), - array(array('C:/base/path/dir', 'C:/base/path/di'), 'C:/base/path'), - array(array('C:\\base\\path\\dir', 'C:\\base\\path\\di'), 'C:/base/path'), - array(array('C:/base/path/dir', 'C:\\base\\path\\di'), 'C:/base/path'), - array(array('phar:///base/path/dir', 'phar:///base/path/di'), 'phar:///base/path'), - array(array('phar://C:/base/path/dir', 'phar://C:/base/path/di'), 'phar://C:/base/path'), - - // root is common base path - array(array('/first', '/second'), '/'), - array(array('C:/first', 'C:/second'), 'C:/'), - array(array('C:\\first', 'C:\\second'), 'C:/'), - array(array('C:/first', 'C:\\second'), 'C:/'), - array(array('phar:///first', 'phar:///second'), 'phar:///'), - array(array('phar://C:/first', 'phar://C:/second'), 'phar://C:/'), - - // windows vs unix - array(array('/base/path', 'C:/base/path'), null), - array(array('C:/base/path', '/base/path'), null), - array(array('/base/path', 'C:\\base\\path'), null), - array(array('phar:///base/path', 'phar://C:/base/path'), null), - - // different partitions - array(array('C:/base/path', 'D:/base/path'), null), - array(array('C:/base/path', 'D:\\base\\path'), null), - array(array('C:\\base\\path', 'D:\\base\\path'), null), - array(array('phar://C:/base/path', 'phar://D:/base/path'), null), - - // three paths - array(array('/base/path/foo', '/base/path', '/base/path/bar'), '/base/path'), - array(array('C:/base/path/foo', 'C:/base/path', 'C:/base/path/bar'), 'C:/base/path'), - array(array('C:\\base\\path\\foo', 'C:\\base\\path', 'C:\\base\\path\\bar'), 'C:/base/path'), - array(array('C:/base/path//foo', 'C:/base/path', 'C:\\base\\path\\bar'), 'C:/base/path'), - array(array('phar:///base/path/foo', 'phar:///base/path', 'phar:///base/path/bar'), 'phar:///base/path'), - array(array('phar://C:/base/path/foo', 'phar://C:/base/path', 'phar://C:/base/path/bar'), 'phar://C:/base/path'), - - // three paths with root - array(array('/base/path/foo', '/', '/base/path/bar'), '/'), - array(array('C:/base/path/foo', 'C:/', 'C:/base/path/bar'), 'C:/'), - array(array('C:\\base\\path\\foo', 'C:\\', 'C:\\base\\path\\bar'), 'C:/'), - array(array('C:/base/path//foo', 'C:/', 'C:\\base\\path\\bar'), 'C:/'), - array(array('phar:///base/path/foo', 'phar:///', 'phar:///base/path/bar'), 'phar:///'), - array(array('phar://C:/base/path/foo', 'phar://C:/', 'phar://C:/base/path/bar'), 'phar://C:/'), - - // three paths, different roots - array(array('/base/path/foo', 'C:/base/path', '/base/path/bar'), null), - array(array('/base/path/foo', 'C:\\base\\path', '/base/path/bar'), null), - array(array('C:/base/path/foo', 'D:/base/path', 'C:/base/path/bar'), null), - array(array('C:\\base\\path\\foo', 'D:\\base\\path', 'C:\\base\\path\\bar'), null), - array(array('C:/base/path//foo', 'D:/base/path', 'C:\\base\\path\\bar'), null), - array(array('phar:///base/path/foo', 'phar://C:/base/path', 'phar:///base/path/bar'), null), - array(array('phar://C:/base/path/foo', 'phar://D:/base/path', 'phar://C:/base/path/bar'), null), - - // only one path - array(array('/base/path'), '/base/path'), - array(array('C:/base/path'), 'C:/base/path'), - array(array('C:\\base\\path'), 'C:/base/path'), - array(array('phar:///base/path'), 'phar:///base/path'), - array(array('phar://C:/base/path'), 'phar://C:/base/path'), - ); - } - - /** - * @dataProvider provideGetLongestCommonBasePathTests - */ - public function testGetLongestCommonBasePath(array $paths, $basePath) - { - $this->assertSame($basePath, Path::getLongestCommonBasePath($paths)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The paths must be strings. Got: array - */ - public function testGetLongestCommonBasePathFailsIfInvalidPath() - { - Path::getLongestCommonBasePath(array(array())); - } - - public function provideIsBasePathTests() - { - return array( - // same paths - array('/base/path', '/base/path', true), - array('C:/base/path', 'C:/base/path', true), - array('C:\\base\\path', 'C:\\base\\path', true), - array('C:/base/path', 'C:\\base\\path', true), - array('phar:///base/path', 'phar:///base/path', true), - array('phar://C:/base/path', 'phar://C:/base/path', true), - - // trailing slash - array('/base/path/', '/base/path', true), - array('C:/base/path/', 'C:/base/path', true), - array('C:\\base\\path\\', 'C:\\base\\path', true), - array('C:/base/path/', 'C:\\base\\path', true), - array('phar:///base/path/', 'phar:///base/path', true), - array('phar://C:/base/path/', 'phar://C:/base/path', true), - - array('/base/path', '/base/path/', true), - array('C:/base/path', 'C:/base/path/', true), - array('C:\\base\\path', 'C:\\base\\path\\', true), - array('C:/base/path', 'C:\\base\\path\\', true), - array('phar:///base/path', 'phar:///base/path/', true), - array('phar://C:/base/path', 'phar://C:/base/path/', true), - - // first in second - array('/base/path/sub', '/base/path', false), - array('C:/base/path/sub', 'C:/base/path', false), - array('C:\\base\\path\\sub', 'C:\\base\\path', false), - array('C:/base/path/sub', 'C:\\base\\path', false), - array('phar:///base/path/sub', 'phar:///base/path', false), - array('phar://C:/base/path/sub', 'phar://C:/base/path', false), - - // second in first - array('/base/path', '/base/path/sub', true), - array('C:/base/path', 'C:/base/path/sub', true), - array('C:\\base\\path', 'C:\\base\\path\\sub', true), - array('C:/base/path', 'C:\\base\\path\\sub', true), - array('phar:///base/path', 'phar:///base/path/sub', true), - array('phar://C:/base/path', 'phar://C:/base/path/sub', true), - - // first is prefix - array('/base/path/di', '/base/path/dir', false), - array('C:/base/path/di', 'C:/base/path/dir', false), - array('C:\\base\\path\\di', 'C:\\base\\path\\dir', false), - array('C:/base/path/di', 'C:\\base\\path\\dir', false), - array('phar:///base/path/di', 'phar:///base/path/dir', false), - array('phar://C:/base/path/di', 'phar://C:/base/path/dir', false), - - // second is prefix - array('/base/path/dir', '/base/path/di', false), - array('C:/base/path/dir', 'C:/base/path/di', false), - array('C:\\base\\path\\dir', 'C:\\base\\path\\di', false), - array('C:/base/path/dir', 'C:\\base\\path\\di', false), - array('phar:///base/path/dir', 'phar:///base/path/di', false), - array('phar://C:/base/path/dir', 'phar://C:/base/path/di', false), - - // root - array('/', '/second', true), - array('C:/', 'C:/second', true), - array('C:', 'C:/second', true), - array('C:\\', 'C:\\second', true), - array('C:/', 'C:\\second', true), - array('phar:///', 'phar:///second', true), - array('phar://C:/', 'phar://C:/second', true), - - // windows vs unix - array('/base/path', 'C:/base/path', false), - array('C:/base/path', '/base/path', false), - array('/base/path', 'C:\\base\\path', false), - array('/base/path', 'phar:///base/path', false), - array('phar:///base/path', 'phar://C:/base/path', false), - - // different partitions - array('C:/base/path', 'D:/base/path', false), - array('C:/base/path', 'D:\\base\\path', false), - array('C:\\base\\path', 'D:\\base\\path', false), - array('C:/base/path', 'phar://C:/base/path', false), - array('phar://C:/base/path', 'phar://D:/base/path', false), - ); - } - - /** - * @dataProvider provideIsBasePathTests - */ - public function testIsBasePath($path, $ofPath, $result) - { - $this->assertSame($result, Path::isBasePath($path, $ofPath)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The base path must be a string. Got: array - */ - public function testIsBasePathFailsIfInvalidBasePath() - { - Path::isBasePath(array(), '/base/path'); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The path must be a string. Got: array - */ - public function testIsBasePathFailsIfInvalidPath() - { - Path::isBasePath('/base/path', array()); - } - - public function provideJoinTests() - { - return array( - array('', '', ''), - array('/path/to/test', '', '/path/to/test'), - array('/path/to//test', '', '/path/to/test'), - array('', '/path/to/test', '/path/to/test'), - array('', '/path/to//test', '/path/to/test'), - - array('/path/to/test', 'subdir', '/path/to/test/subdir'), - array('/path/to/test/', 'subdir', '/path/to/test/subdir'), - array('/path/to/test', '/subdir', '/path/to/test/subdir'), - array('/path/to/test/', '/subdir', '/path/to/test/subdir'), - array('/path/to/test', './subdir', '/path/to/test/subdir'), - array('/path/to/test/', './subdir', '/path/to/test/subdir'), - array('/path/to/test/', '../parentdir', '/path/to/parentdir'), - array('/path/to/test', '../parentdir', '/path/to/parentdir'), - array('path/to/test/', '/subdir', 'path/to/test/subdir'), - array('path/to/test', '/subdir', 'path/to/test/subdir'), - array('../path/to/test', '/subdir', '../path/to/test/subdir'), - array('path', '../../subdir', '../subdir'), - array('/path', '../../subdir', '/subdir'), - array('../path', '../../subdir', '../../subdir'), - - array(array('/path/to/test', 'subdir'), '', '/path/to/test/subdir'), - array(array('/path/to/test', '/subdir'), '', '/path/to/test/subdir'), - array(array('/path/to/test/', 'subdir'), '', '/path/to/test/subdir'), - array(array('/path/to/test/', '/subdir'), '', '/path/to/test/subdir'), - - array(array('/path'), '', '/path'), - array(array('/path', 'to', '/test'), '', '/path/to/test'), - array(array('/path', '', '/test'), '', '/path/test'), - array(array('path', 'to', 'test'), '', 'path/to/test'), - array(array(), '', ''), - - array('base/path', 'to/test', 'base/path/to/test'), - - array('C:\\path\\to\\test', 'subdir', 'C:/path/to/test/subdir'), - array('C:\\path\\to\\test\\', 'subdir', 'C:/path/to/test/subdir'), - array('C:\\path\\to\\test', '/subdir', 'C:/path/to/test/subdir'), - array('C:\\path\\to\\test\\', '/subdir', 'C:/path/to/test/subdir'), - - array('/', 'subdir', '/subdir'), - array('/', '/subdir', '/subdir'), - array('C:/', 'subdir', 'C:/subdir'), - array('C:/', '/subdir', 'C:/subdir'), - array('C:\\', 'subdir', 'C:/subdir'), - array('C:\\', '/subdir', 'C:/subdir'), - array('C:', 'subdir', 'C:/subdir'), - array('C:', '/subdir', 'C:/subdir'), - - array('phar://', '/path/to/test', 'phar:///path/to/test'), - array('phar:///', '/path/to/test', 'phar:///path/to/test'), - array('phar:///path/to/test', 'subdir', 'phar:///path/to/test/subdir'), - array('phar:///path/to/test', 'subdir/', 'phar:///path/to/test/subdir'), - array('phar:///path/to/test', '/subdir', 'phar:///path/to/test/subdir'), - array('phar:///path/to/test/', 'subdir', 'phar:///path/to/test/subdir'), - array('phar:///path/to/test/', '/subdir', 'phar:///path/to/test/subdir'), - - array('phar://', 'C:/path/to/test', 'phar://C:/path/to/test'), - array('phar://', 'C:\\path\\to\\test', 'phar://C:/path/to/test'), - array('phar://C:/path/to/test', 'subdir', 'phar://C:/path/to/test/subdir'), - array('phar://C:/path/to/test', 'subdir/', 'phar://C:/path/to/test/subdir'), - array('phar://C:/path/to/test', '/subdir', 'phar://C:/path/to/test/subdir'), - array('phar://C:/path/to/test/', 'subdir', 'phar://C:/path/to/test/subdir'), - array('phar://C:/path/to/test/', '/subdir', 'phar://C:/path/to/test/subdir'), - array('phar://C:', 'path/to/test', 'phar://C:/path/to/test'), - array('phar://C:', '/path/to/test', 'phar://C:/path/to/test'), - array('phar://C:/', 'path/to/test', 'phar://C:/path/to/test'), - array('phar://C:/', '/path/to/test', 'phar://C:/path/to/test'), - ); - } - - /** - * @dataProvider provideJoinTests - */ - public function testJoin($path1, $path2, $result) - { - $this->assertSame($result, Path::join($path1, $path2)); - } - - public function testJoinVarArgs() - { - $this->assertSame('/path', Path::join('/path')); - $this->assertSame('/path/to', Path::join('/path', 'to')); - $this->assertSame('/path/to/test', Path::join('/path', 'to', '/test')); - $this->assertSame('/path/to/test/subdir', Path::join('/path', 'to', '/test', 'subdir/')); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The paths must be strings. Got: array - */ - public function testJoinFailsIfInvalidPath() - { - Path::join('/path', array()); - } - - /** - * @expectedException \RuntimeException - * @expectedExceptionMessage Your environment or operation system isn't supported - */ - public function testGetHomeDirectoryFailsIfNotSupportedOperationSystem() - { - putenv('HOME='); - - Path::getHomeDirectory(); - } - - public function testGetHomeDirectoryForUnix() - { - $this->assertEquals('/home/webmozart', Path::getHomeDirectory()); - } - - public function testGetHomeDirectoryForWindows() - { - putenv('HOME='); - putenv('HOMEDRIVE=C:'); - putenv('HOMEPATH=/users/webmozart'); - - $this->assertEquals('C:/users/webmozart', Path::getHomeDirectory()); - } - - public function testNormalize() - { - $this->assertSame('C:/Foo/Bar/test', Path::normalize('C:\\Foo\\Bar/test')); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testNormalizeFailsIfNoString() - { - Path::normalize(true); - } -} diff --git a/vendor/webmozart/path-util/tests/UrlTest.php b/vendor/webmozart/path-util/tests/UrlTest.php deleted file mode 100644 index ae7816ab..00000000 --- a/vendor/webmozart/path-util/tests/UrlTest.php +++ /dev/null @@ -1,179 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Webmozart\PathUtil\Tests; - -use Webmozart\PathUtil\Url; - -/** - * @since 2.3 - * - * @author Bernhard Schussek - * @author Claudio Zizza - */ -class UrlTest extends \PHPUnit_Framework_TestCase -{ - /** - * @dataProvider provideMakeRelativeTests - * @covers Webmozart\PathUtil\Url - */ - public function testMakeRelative($absolutePath, $basePath, $relativePath) - { - $host = 'http://example.com'; - - $relative = Url::makeRelative($host.$absolutePath, $host.$basePath); - $this->assertSame($relativePath, $relative); - $relative = Url::makeRelative($absolutePath, $host.$basePath); - $this->assertSame($relativePath, $relative); - } - - /** - * @dataProvider provideMakeRelativeIsAlreadyRelativeTests - * @covers Webmozart\PathUtil\Url - */ - public function testMakeRelativeIsAlreadyRelative($absolutePath, $basePath, $relativePath) - { - $host = 'http://example.com'; - - $relative = Url::makeRelative($absolutePath, $host.$basePath); - $this->assertSame($relativePath, $relative); - } - - /** - * @dataProvider provideMakeRelativeTests - * @covers Webmozart\PathUtil\Url - */ - public function testMakeRelativeWithFullUrl($absolutePath, $basePath, $relativePath) - { - $host = 'ftp://user:password@example.com:8080'; - - $relative = Url::makeRelative($host.$absolutePath, $host.$basePath); - $this->assertSame($relativePath, $relative); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The URL must be a string. Got: array - * @covers Webmozart\PathUtil\Url - */ - public function testMakeRelativeFailsIfInvalidUrl() - { - Url::makeRelative(array(), 'http://example.com/webmozart/puli'); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The base URL must be a string. Got: array - * @covers Webmozart\PathUtil\Url - */ - public function testMakeRelativeFailsIfInvalidBaseUrl() - { - Url::makeRelative('http://example.com/webmozart/puli/css/style.css', array()); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage "webmozart/puli" is not an absolute Url. - * @covers Webmozart\PathUtil\Url - */ - public function testMakeRelativeFailsIfBaseUrlNoUrl() - { - Url::makeRelative('http://example.com/webmozart/puli/css/style.css', 'webmozart/puli'); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage "" is not an absolute Url. - * @covers Webmozart\PathUtil\Url - */ - public function testMakeRelativeFailsIfBaseUrlEmpty() - { - Url::makeRelative('http://example.com/webmozart/puli/css/style.css', ''); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The base URL must be a string. Got: NULL - * @covers Webmozart\PathUtil\Url - */ - public function testMakeRelativeFailsIfBaseUrlNull() - { - Url::makeRelative('http://example.com/webmozart/puli/css/style.css', null); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The URL "http://example.com" cannot be made relative to "http://example2.com" since - * their host names are different. - * @covers Webmozart\PathUtil\Url - */ - public function testMakeRelativeFailsIfDifferentDomains() - { - Url::makeRelative('http://example.com/webmozart/puli/css/style.css', 'http://example2.com/webmozart/puli'); - } - - public function provideMakeRelativeTests() - { - return array( - - array('/webmozart/puli/css/style.css', '/webmozart/puli', 'css/style.css'), - array('/webmozart/puli/css/style.css?key=value&key2=value', '/webmozart/puli', 'css/style.css?key=value&key2=value'), - array('/webmozart/puli/css/style.css?key[]=value&key[]=value', '/webmozart/puli', 'css/style.css?key[]=value&key[]=value'), - array('/webmozart/css/style.css', '/webmozart/puli', '../css/style.css'), - array('/css/style.css', '/webmozart/puli', '../../css/style.css'), - array('/', '/', ''), - - // relative to root - array('/css/style.css', '/', 'css/style.css'), - - // same sub directories in different base directories - array('/puli/css/style.css', '/webmozart/css', '../../puli/css/style.css'), - - array('/webmozart/puli/./css/style.css', '/webmozart/puli', 'css/style.css'), - array('/webmozart/puli/../css/style.css', '/webmozart/puli', '../css/style.css'), - array('/webmozart/puli/.././css/style.css', '/webmozart/puli', '../css/style.css'), - array('/webmozart/puli/./../css/style.css', '/webmozart/puli', '../css/style.css'), - array('/webmozart/puli/../../css/style.css', '/webmozart/puli', '../../css/style.css'), - array('/webmozart/puli/css/style.css', '/webmozart/./puli', 'css/style.css'), - array('/webmozart/puli/css/style.css', '/webmozart/../puli', '../webmozart/puli/css/style.css'), - array('/webmozart/puli/css/style.css', '/webmozart/./../puli', '../webmozart/puli/css/style.css'), - array('/webmozart/puli/css/style.css', '/webmozart/.././puli', '../webmozart/puli/css/style.css'), - array('/webmozart/puli/css/style.css', '/webmozart/../../puli', '../webmozart/puli/css/style.css'), - - // first argument shorter than second - array('/css', '/webmozart/puli', '../../css'), - - // second argument shorter than first - array('/webmozart/puli', '/css', '../webmozart/puli'), - - array('', '', ''), - ); - } - - public function provideMakeRelativeIsAlreadyRelativeTests() - { - return array( - array('css/style.css', '/webmozart/puli', 'css/style.css'), - array('css/style.css', '', 'css/style.css'), - array('css/../style.css', '', 'style.css'), - array('css/./style.css', '', 'css/style.css'), - array('../style.css', '/', 'style.css'), - array('./style.css', '/', 'style.css'), - array('../../style.css', '/', 'style.css'), - array('../../style.css', '', 'style.css'), - array('./style.css', '', 'style.css'), - array('../style.css', '', 'style.css'), - array('./../style.css', '', 'style.css'), - array('css/./../style.css', '', 'style.css'), - array('css//style.css', '', 'css/style.css'), - ); - } -} From 6430ce321d8e231eef29fcc5685d1ab32fb26a4e Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Thu, 25 Aug 2022 22:58:15 +0200 Subject: [PATCH 05/12] Exclude tests/data for php-cs-fixer If you run the tests locally a copy of Nextcloud is stored there and running php-cs-fix will take a while. Signed-off-by: Daniel Kesselberg --- .php-cs-fixer.dist.php | 3 ++- lib/UpdateCommand.php | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 135545a2..08e0ef63 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -11,9 +11,10 @@ ->getFinder() ->notPath('build') ->notPath('l10n') + ->notPath('node_modules') ->notPath('src') + ->notPath('tests/data') ->notPath('vendor') ->notPath('vendor-bin') - ->notPath('node_modules') ->in(__DIR__); return $config; diff --git a/lib/UpdateCommand.php b/lib/UpdateCommand.php index 384e91e3..1d54a9b2 100644 --- a/lib/UpdateCommand.php +++ b/lib/UpdateCommand.php @@ -29,7 +29,6 @@ use Symfony\Component\Console\Question\ConfirmationQuestion; class UpdateCommand extends Command { - /** @var Updater */ protected $updater; From 6ed28216e532ab799fee9ff6d87910353f46ad32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Mon, 29 Aug 2022 09:23:02 +0200 Subject: [PATCH 06/12] Add psalm github workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- .github/workflows/psalm.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/psalm.yml diff --git a/.github/workflows/psalm.yml b/.github/workflows/psalm.yml new file mode 100644 index 00000000..dd8ca72c --- /dev/null +++ b/.github/workflows/psalm.yml @@ -0,0 +1,33 @@ +name: Static analysis + +on: + pull_request: + push: + branches: + - main + - stable* + +jobs: + static-psalm-analysis: + runs-on: ubuntu-latest + + strategy: + matrix: + ocp-version: [ 'dev-master' ] + + name: Nextcloud ${{ matrix.ocp-version }} + steps: + - name: Checkout + uses: actions/checkout@master + + - name: Set up php + uses: shivammathur/setup-php@v2 + with: + php-version: 7.4 + coverage: none + + - name: Install dependencies + run: composer i + + - name: Run coding standards check + run: composer run psalm From 22c3506f159cbe92ce9a591383f7e239f8bd1f40 Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Mon, 29 Aug 2022 21:13:20 +0200 Subject: [PATCH 07/12] Regenerate bin files Signed-off-by: Daniel Kesselberg --- vendor/autoload.php | 2 +- vendor/bin/php-parse | 8 ++++---- vendor/bin/psalm | 8 ++++---- vendor/bin/psalm-language-server | 8 ++++---- vendor/bin/psalm-plugin | 8 ++++---- vendor/bin/psalm-refactor | 8 ++++---- vendor/bin/psalter | 8 ++++---- vendor/composer/autoload_real.php | 14 +++++++------- vendor/composer/autoload_static.php | 8 ++++---- vendor/composer/installed.php | 4 ++-- 10 files changed, 38 insertions(+), 38 deletions(-) diff --git a/vendor/autoload.php b/vendor/autoload.php index f1c16ba1..40ef9e06 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -9,4 +9,4 @@ require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit2723bf3c902a907c44396c9253500aff::getLoader(); +return ComposerAutoloaderInitd7f5ddc48e4715174279359c16c76340::getLoader(); diff --git a/vendor/bin/php-parse b/vendor/bin/php-parse index ade70aa7..d739888e 100755 --- a/vendor/bin/php-parse +++ b/vendor/bin/php-parse @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/nikic/php-parser/bin/php-parse) + * This file includes the referenced bin path (../../vendor-bin/coding-standard/vendor/nikic/php-parser/bin/php-parse) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/nikic/php-parser/bin/php-parse'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/nikic/php-parser/bin/php-parse'); exit(0); } } -include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/nikic/php-parser/bin/php-parse'; +include __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/nikic/php-parser/bin/php-parse'; diff --git a/vendor/bin/psalm b/vendor/bin/psalm index 4015b91c..fb81fde1 100755 --- a/vendor/bin/psalm +++ b/vendor/bin/psalm @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/vimeo/psalm/psalm) + * This file includes the referenced bin path (../../vendor-bin/coding-standard/vendor/vimeo/psalm/psalm) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/vimeo/psalm/psalm'); exit(0); } } -include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm'; +include __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/vimeo/psalm/psalm'; diff --git a/vendor/bin/psalm-language-server b/vendor/bin/psalm-language-server index 63c74e2c..a7f93536 100755 --- a/vendor/bin/psalm-language-server +++ b/vendor/bin/psalm-language-server @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/vimeo/psalm/psalm-language-server) + * This file includes the referenced bin path (../../vendor-bin/coding-standard/vendor/vimeo/psalm/psalm-language-server) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-language-server'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/vimeo/psalm/psalm-language-server'); exit(0); } } -include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-language-server'; +include __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/vimeo/psalm/psalm-language-server'; diff --git a/vendor/bin/psalm-plugin b/vendor/bin/psalm-plugin index 4255274f..40450596 100755 --- a/vendor/bin/psalm-plugin +++ b/vendor/bin/psalm-plugin @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/vimeo/psalm/psalm-plugin) + * This file includes the referenced bin path (../../vendor-bin/coding-standard/vendor/vimeo/psalm/psalm-plugin) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-plugin'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/vimeo/psalm/psalm-plugin'); exit(0); } } -include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-plugin'; +include __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/vimeo/psalm/psalm-plugin'; diff --git a/vendor/bin/psalm-refactor b/vendor/bin/psalm-refactor index 28dd65f6..c0544717 100755 --- a/vendor/bin/psalm-refactor +++ b/vendor/bin/psalm-refactor @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/vimeo/psalm/psalm-refactor) + * This file includes the referenced bin path (../../vendor-bin/coding-standard/vendor/vimeo/psalm/psalm-refactor) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-refactor'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/vimeo/psalm/psalm-refactor'); exit(0); } } -include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalm-refactor'; +include __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/vimeo/psalm/psalm-refactor'; diff --git a/vendor/bin/psalter b/vendor/bin/psalter index ae656654..61bb2ba8 100755 --- a/vendor/bin/psalter +++ b/vendor/bin/psalter @@ -4,7 +4,7 @@ /** * Proxy PHP file generated by Composer * - * This file includes the referenced bin path (../../vendor-bin/psalm/vendor/vimeo/psalm/psalter) + * This file includes the referenced bin path (../../vendor-bin/coding-standard/vendor/vimeo/psalm/psalter) * using a stream wrapper to prevent the shebang from being output on PHP<8 * * @generated @@ -13,7 +13,7 @@ namespace Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; -$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/autoload.php'; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/autoload.php'; if (PHP_VERSION_ID < 80000) { if (!class_exists('Composer\BinProxyWrapper')) { @@ -112,9 +112,9 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalter'); + include("phpvfscomposer://" . __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/vimeo/psalm/psalter'); exit(0); } } -include __DIR__ . '/../..'.'/vendor-bin/psalm/vendor/vimeo/psalm/psalter'; +include __DIR__ . '/../..'.'/vendor-bin/coding-standard/vendor/vimeo/psalm/psalter'; diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index c550b7ed..1fedf1c1 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit2723bf3c902a907c44396c9253500aff +class ComposerAutoloaderInitd7f5ddc48e4715174279359c16c76340 { private static $loader; @@ -24,19 +24,19 @@ public static function getLoader() require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInit2723bf3c902a907c44396c9253500aff', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInitd7f5ddc48e4715174279359c16c76340', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit2723bf3c902a907c44396c9253500aff', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInitd7f5ddc48e4715174279359c16c76340', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit2723bf3c902a907c44396c9253500aff::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInitd7f5ddc48e4715174279359c16c76340::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $includeFiles = \Composer\Autoload\ComposerStaticInit2723bf3c902a907c44396c9253500aff::$files; + $includeFiles = \Composer\Autoload\ComposerStaticInitd7f5ddc48e4715174279359c16c76340::$files; foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire2723bf3c902a907c44396c9253500aff($fileIdentifier, $file); + composerRequired7f5ddc48e4715174279359c16c76340($fileIdentifier, $file); } return $loader; @@ -48,7 +48,7 @@ public static function getLoader() * @param string $file * @return void */ -function composerRequire2723bf3c902a907c44396c9253500aff($fileIdentifier, $file) +function composerRequired7f5ddc48e4715174279359c16c76340($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index b44eec2d..6f0511c9 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit2723bf3c902a907c44396c9253500aff +class ComposerStaticInitd7f5ddc48e4715174279359c16c76340 { public static $files = array ( '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', @@ -193,9 +193,9 @@ class ComposerStaticInit2723bf3c902a907c44396c9253500aff public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit2723bf3c902a907c44396c9253500aff::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInitd7f5ddc48e4715174279359c16c76340::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitd7f5ddc48e4715174279359c16c76340::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitd7f5ddc48e4715174279359c16c76340::$classMap; }, null, ClassLoader::class); } diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 5f38c2e3..1da3dfe9 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'f039ecf6f1ce3e5154f62ff823f9a81c89829b57', + 'reference' => '6ed28216e532ab799fee9ff6d87910353f46ad32', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'f039ecf6f1ce3e5154f62ff823f9a81c89829b57', + 'reference' => '6ed28216e532ab799fee9ff6d87910353f46ad32', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), From fc0aedd422a24451f25b09f8a43809339916bc09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Tue, 30 Aug 2022 10:31:26 +0200 Subject: [PATCH 08/12] Suppress false-positive psalm errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- lib/Updater.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Updater.php b/lib/Updater.php index ddec987c..871124ed 100644 --- a/lib/Updater.php +++ b/lib/Updater.php @@ -80,6 +80,7 @@ public function __construct($baseDir) { /** @var string $OC_VersionString */ /** @var string $OC_Build */ require_once $versionFileName; + /** @psalm-suppress UndefinedVariable */ $version = $OC_VersionString; $buildTime = $OC_Build; } @@ -672,6 +673,7 @@ public function verifyIntegrity() { private function getVersionByVersionFile($versionFile) { require $versionFile; + /** @psalm-suppress UndefinedVariable */ if (isset($OC_Version)) { /** @var array $OC_Version */ return implode('.', $OC_Version); From fff4e59285b489556027dc474b33dea085c711d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Tue, 30 Aug 2022 10:37:56 +0200 Subject: [PATCH 09/12] Bump psalm level to 4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- lib/Updater.php | 1 + psalm.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Updater.php b/lib/Updater.php index 871124ed..e730ee5a 100644 --- a/lib/Updater.php +++ b/lib/Updater.php @@ -483,6 +483,7 @@ private function getUpdateServerResponse() { ]); } + /** @var false|string $response */ $response = curl_exec($curl); if ($response === false) { throw new \Exception('Could not do request to updater server: '.curl_error($curl)); diff --git a/psalm.xml b/psalm.xml index f0f625cd..1bf59073 100644 --- a/psalm.xml +++ b/psalm.xml @@ -1,6 +1,6 @@ Date: Tue, 30 Aug 2022 10:39:26 +0200 Subject: [PATCH 10/12] Update index.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rm index.php; make index.php Signed-off-by: Côme Chilliet --- index.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/index.php b/index.php index 4c4acef2..2d4fcee3 100644 --- a/index.php +++ b/index.php @@ -110,6 +110,7 @@ public function __construct($baseDir) { /** @var string $OC_VersionString */ /** @var string $OC_Build */ require_once $versionFileName; + /** @psalm-suppress UndefinedVariable */ $version = $OC_VersionString; $buildTime = $OC_Build; } @@ -512,6 +513,7 @@ private function getUpdateServerResponse() { ]); } + /** @var false|string $response */ $response = curl_exec($curl); if ($response === false) { throw new \Exception('Could not do request to updater server: '.curl_error($curl)); @@ -702,6 +704,7 @@ public function verifyIntegrity() { private function getVersionByVersionFile($versionFile) { require $versionFile; + /** @psalm-suppress UndefinedVariable */ if (isset($OC_Version)) { /** @var array $OC_Version */ return implode('.', $OC_Version); From 78a2da08de8b87e09c95e6381cc5e130a95ac922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Tue, 30 Aug 2022 12:29:47 +0200 Subject: [PATCH 11/12] List files on which index.php depends in the Makefile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ac59a6a3..6ac8f940 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ updater.phar: box updater.php lib/*.php buildVersionFile.php clean: rm updater.phar index.php -index.php: +index.php: lib/UpdateException.php lib/LogException.php lib/RecursiveDirectoryIteratorWithoutData.php lib/Updater.php index.web.php # First put openining php tag and license awk '/^<\?php$$/,/\*\//' index.web.php > index.php # Then concat all files while filtering php tag and license From 7e11e58bedc8bcc760c9725d01f212cf42bd537d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Tue, 30 Aug 2022 12:32:11 +0200 Subject: [PATCH 12/12] Update updater.phar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- updater.phar | Bin 723250 -> 788801 bytes vendor/composer/autoload_classmap.php | 1 + vendor/composer/autoload_static.php | 1 + 3 files changed, 2 insertions(+) diff --git a/updater.phar b/updater.phar index a97391c2fad27209c73027d2503ae73f97c36b68..f95bfe962bbcda70b37f8721351ad70f3890feb7 100755 GIT binary patch delta 170137 zcmeFa33OCdwm)p8hI>;PEAvQhLZA`|No5|G5+<1mleQ+9R8kcZNm4~s0!GAu_H!P< z+j7+B0ME8<#Q`N6TScMOb^?WNXIp_DlvYu&omy1B-#&M!sw9a0eE;wJuk}6F(vv#l zKKtym_da{?bMC`86zsXdvFVP;%F43hit@@n8 zXPj|{4gVSNpYksPNw3%C>~Z@Fz3tw2@blXbqFO0k^4bTF4#-=>lKNXc-965ZZnv+< z?`tiZuKk+RjaF^WRyVbbH7PAAJ^$}V3J26Ns?gIKcel&qEAsk%MW^U$<^`>8Z%>D( zJEYIY6lhko(jVuQmY&c$t^Bc07kYYTd3w8DBlmf`(q}8BQ#O5Y$$|H7Jq8%$$)wL&0N zdR;UQ$lYeg+%LoG7kTmn#2LtxV~LKgM1(AU~1JE9WVd>!}G1QHJ>5EGP$x6hDN$Orbjv3L@|4sZS;~x%i+&$x`wY8=0H^e(JGS2* zD81sEINQ1LN-3qOSGE$Z#@_Vy4uW~tRF zogEQZqX19U_s7K9=BOB_RQ!*|?*`-v(Mo3-v2mPSyTvok=(&Ez6PQ-IQgT^LtSwfh zK1y3&y6jE@O#>n-k;a{%qLR|s-@g5+GOZnHq6%u7txO%8Qp5Vx&x!V^k0|+Hu~D|h zC}o?O5jP=<0I2ruDY9xqSf?6scRD z(w0@veWW$2L8CPJSeA9%f)2mGqkH9?ZXhj$m_AjBiPFU{t(-U@XG#Tf(Q_H82UY$^ z>1|8)f1!0sknm3B_nuF%J)pLyH2KkSEx<2`14GJPo0Dw!sHK$trSqSUQSb9P)}KPo zr@d0gfGlOtO{5urhn%DG#CUC-soFT<3!PnVzZYy<-gbYY?H#pGN~g_#Vzxq#$Fd~e z@4d)fx?ukG1M+UHbN9W1w9M@X*I(vyc5rezH&H<_rAcq!j^?zms3=Eg*=#Grl~PJC zI9e(xop;}xVf)sqlu)|7@G9)OLn#YvlgvskrFZPw4`z8?>WtJQDqU0h>C4wgYEzoU zr_`Kk4L=*4!|QD6#FSo0;pB9mx=Sc+etzB*+P70}by-UPlwRUU2p^CqrOmN@uR=-b zW#b;ajnJASH>ak`J6;Iqz0FoBg3{lJJC3V0t`w@~dz>z?+F9Uu9$(*dPgj?-+ofa@ zRadGLqV$rkrq4CdmDOmzQm9co2x%E21h=YWPwC^&e-$^ZixRyHRZ55SMNqt^LP2Tm z_AB0`y^$lo7;j6hRZA#MzU%9owa#bA4`pP`@Ir38yIcF_bf2%ViK04}3*z7J>2#}u z)I0rL_;sp0kJ1YVZXK<4G@8~ZbD7)M)zPg8)XUY4PU*Qx2d>aIx=lWLcZw}d#WbZ; zd%t*LKz=`Mvh8KH4W;*fnEU`|J2#|<%ah-YwAG|5i%RLVb%$Vznrd%1fS0hceo`f8kQ z^>n2^rF$nWa+BDFtVxMXUE*2G*KN7FPbiJgedDA;8k>>@`N^BCwr|x{rF8UuX(8?3 zDYl8DlwK*#nEB03TCWMVXH;^cblRiujZxSJ_2&4`7+c<%N;^t_KV`5>X-B2kCPvwQ zqhg5CzNZtMwDLJJm3F5j*fy)Bl)fBy;s?UiB->$?i%=T1{9DLEt<7iq5^Nu4vQl^3$(H+r;ro zA*FXed^RQtRfGyR+2U+9DrA&CB-sa)J+RdxziW%JU8*92(%CnqOyz)4%PZrfY_ht0 zD82i!8_ph(KaNMYF}5zXfYQ{P-+GWM8#ipVOjz0j^|y=2nv1v)e$=5-CZ%5{-+WYs zBSJnIXSMB1QD#8tYa1tQq$RGf-K!#o(%X$kfEefo1l@+Mk+zFe!AE-@2LBx=3z+Hk$MAGOGfGjTxS((G-u7fP31@@MQv5__nZrdN4NtwQOwDXXh!Ap7|F z9gvE2K;r#rzlir5BNUJ+ZCpJD8o>!0S7t|}u*y+X-|k)JS>@(h@|Dn?hzC)cu%Zq8 zO4X7Jl)52W@^>mAlzw9@d{*PQHKhEODh-AzzrllTRuz0oNB{0NNXQ>DIAD`UZhMxq zv)9e1N7Fi6ZB6O?-jDmV(Pz@=Q%3G#d3QU6BhDiWoIS1WdRNVASCnpl=rItKl+6Jt z8@Zdho*rLEOK%T9c806Fg3__?TneR7okjV`jX~K^+=#Mi7I&#bQ+kQ*hid(#At|lv zX^E)fzf>Znv~~8A(7bj>6O3{4djpZSqpOv5qx4Yr;tHZ~D$TOZ%uq@weXKcV`+#hS zoR|8?HYJzRBXRX#YRH=f%=(FWbl5ScdZ$67DN zd94*o?RKdE(Htd}{ZRUw$Q!WW8xqpWhj#X1`CCpZQ--%B4Yx=g zQ9}W;Xz***%}nXTM@#o{Qk^`!3$?XAfdCG#SEUZ6@AXeVK$>J)|0#Q@_j%TIK*0=| z$m1$EqxAl+U;JJppQ)f?)zsqe>uU3K_Z6M8;{a&rIz3>djH`3tcR2d8)xT-h%O-fx3eCEE+^;b z@|?%8jUw-V8k)+l)jDec`}~`aBn`-KjdN5H6WofUN9wuZf7fOQgq=~?;<BNhEYO ze$Y4|XXTgjoI7DynYw4$ZwKT9_I&vkj-k4fXb90dAqjLpAWt5T*{VYQ2`;kKiy!bxfFp?R30XH13sQEobi>U*?) z?ySO|0eRn;**xcX-Wg|XnS2eF?A+W1Jm*5Nl+GpRKn3!QSF)PqAFw2mE+=r2K#kpPo zF(Ai`PUHQ9VW08h@A76NC#P!CD=Ms%em7?FajkD6)y|HVqO;sSziI&UB8zZB=^igb z2M^?o=5)RT3-rbKJ9ZCkygXo)&AMD^OlkYEBjD?Q&Q^?rlQHt#%WQ!8H`!xso7Bxq zX_A!tYp6LnQp)TKr8T8d)|IQYf!Jg*;_ZIxq^V$RR;$b1+UfMU^ZXEytvyXWeO|YJ za&i7dtF>FR7fAJfU!!jQMM=@PaaL)ZG{dd1X}{Fd?v^?vU&`%pNpk{K)Lv-(J_!(YdOWM7 zHjl568UAce?mx9fS&|ldR7lo3{b&NaGc}aPjq7Re@Q)iO1pvXc=-)W0wx`{PBrjjphF-G z#MFH1m1vgtlxB_nY0FButB#?`5Vb4V%9l4cr1tAe0_yJdyQO6`FlmbcYM%yWD~QN_ zWc&6Lv7sNQw31E%9j%~q)uDl^!Mos;w9RQCJH!QoPH?EeCefj=u49G+;R*ex*oY(0 zB1R9{A4A7KHA3~#b)4vA%HC)f9Xmfda_ zrRCMF#TBiU6{TekmUYCEJoxdM*8ecb=MlA>roQ~wUSC90(~LPwnws*#f>`k(L!!K4 zP2Oo+vTNpAvzdRkH9;=AFq~aK&l<(H&9hEAeZ%kPSu^C=zQ&l`j_%gZUYC0o`E{hp z?7%OriEQsYt1a(zVAs^-a%T{$+iFRWn=d@`w4=(;U--c3E8V#6eYv)~Qcy9%Rxh$v zN)_(XHmAF!x}vn$-BwcNsHkwXl(xE@E=NUMNx8F1-nJ_v_wbF(|koW;e} z&hiR(xudP6rKGyFq^j6e?JTQuI4a!^+4e-DylIa}-I&o$l|zp7*jYi9^_-m3Vb{7& zKJ1T|4eQfRKX=2!qf<`hl9IPQlpv?CU-^^f%vMhWDQ(>lO%RiyJjKL0{!TM_w|w}T z?4X%F|QF^2zntF{+2Hu~9i^$juig$gvlv z%HCgv%dHpBiqm(j+Cg!doV_twe)-~G3F?6I#*1@Ue~mR&u7`y)uo@DoE!+?;UpHW- zsszG_RVz#7K-B~QWtO}9SH}$j%sr&FZP;-{?d4KI1zE1$SPgVrWbb9B@K(*y%(82& z>GG48M#(caUKXw&FExCQ@e&qs*bMdb>GkNS06O2ju{~_AUtV!T0Zlj!nOMxBjmSMH z+ipme-@hbkXZa<4VHU+cBiG%XL(N8wJXXDG#gUI+mY5KPe*I55Z}WJXRI)y)P+vOy zJ2~>!%gn)Rr#6;1|0>(Q@+@%i|UQLnBl}-TMKU%V0bg;&k6cphy82v%ONt z2s9n;yO1~DGM@TK*ZUZuPTj3V)KQw&(QrqM)=jF~%?LG=PQv9|c16mQt}NL3*%c0h zyyFT%P>uWY;>)tIQBop30i5e?NO#F9lb7E_FZ?CiABWmCduCWGvs5Nm1{CCAGPSnY5J15GM-ind; z-Zfs%h>hO4>8@K0vg6lc)Usd)GBt}0$$?AxhC3Z{?Qg9+%kKU*j7^ydhTD8alBoH^ z_%avV`#ncn!M&o1Y)^8`20FQT^SGqpeNmZgcqC#~Pq#S!WZBB87>4wzvksXtecV-{>b?)HE7d3AM6lm-1MuX}DRP5ei+z|53WHJA7A&7#Jq z)B`g{)c@2WPp$uDTJ4%@*BOl9Q_#3x*DV)6n-4|s{1Fwv{dLh&UExQ(Q#V=IRJO0cVfFXuvI-VT|?JrLL z`l+*rD|I7lfb#LD#^ld%|5O!_unQGXzWJ(j`Q?Mj@}Yeq!V<^G-(Mxjhu#^*%bIsv ztb~f+6GVB!UB4Oc_>SFQU@myW}{P!CbEphd;6=tq%$~&Gdg1(q6 zU-V4-&h}?3hv~?gf1AQAs%~nYS6E3&>(3ds3UvjMET%hWs>M? z=X=kahwG2CLbS;g=#BZZ_g3-Fk6toxU2)I8LY_MImhJrL{prliqr2BvlYqhbV{Z-z?&a zpy{1w!z@ZP6ihU^0acKeyWrkYa^C(dXnv#RDSJoZwMm_(p*QV2<)9!Gu*$|{u4Aq;%*T?K{G^eKS?v>{n>}F zgE|Qvr}~6{vTleu=MV39B;62sGEn&wRYSur()6`%#RK1VTMSg7b-k-{$PZu{nEVQdSFs_k7(QxNW0c z1)0#&(LKT2*}JlXQ$P@6))W_(7disVK%GnW5NhEyhSwQ_k+SOQQg{p8&dQ3is*1A8 zs;bh`vex3Vs&e=N997P;ma6g+M`>~BP^@rnSmbyeOcg|Bp*bi7%}@j-Ag)mm9rUR_)X&r5}? zt)$Y`){0G7Tv1i+b~0&hSlUmenS}IEz=tE@-=Uv0>a5eVazaO!x6@7Z#qaj$=!g!b zK6dTXmb6H(5~}3lwKmsE-rPo7Po*#-EegkyNlhf;#M%U;IUZ2+_31M zya1U)=koKGAY1EhL>JyrM3rC@|2S>(8mC2*yQ-zEy4>w7scMDSuCk@v?Px77fkU^- zRnb=6QeNtERF=0^grEuhi8k?1M%4HppV`kto4oDAG-L3tP3Q-QE2$Vh^C2vbstm6* zgvWuym9?ehr6=8#o?@URk?wkOH1csacWB72Fl{s9c|!MCnXz*qLr9uKuSuP+3b^NrltdT2|?*Kp07DYq7J~igjUw)6&-qYjt*Ax{Y981%)3O&A+Mg1;M zYmuXJg0B~`OI_~5F4t&%fC-w8t#-DIg7kPOHxI5;BA!~^1yY}#31&2cvU+futd*M&9;CLjSr@n5Js2^m;)#I#haI5LkL%C|p6=DqMOF0k$wy z9|PV9$^xvJw-a2&6;fH#(}FVBPg#GFg6Z`H3(L+6OOkhdE{5v_Az%D?vPhkVlt*Fd z&vf^k#jp4KsgAtqSf0G&3-kZ3UkF|4xGvD>O3$J7oA&e9PxcuTY+9ePF7k_? zXWUq863=r=ow%jMqjC|Bi3`B1oGaZDkM5;F)7EzEHaG1qie@a3+#LuU^ht=PZE;g< zquz0Vt|UZ{YUIRVsRzU3*&A!DIp$m%mVNe> zHG7`l-Pu-C1FkejV{3WXb$&#yYQOWPbs@}`HwMi9h85Ceg*7y-a`*Z3m~E{!lf5;` z5T8&iO`beiYHURyE}~DBN#3}}9M3jHo5cuq(*6d=3U>G&Lk6ooA(+{N%gvTZPXA49 zogLo1M)|vc=0@nF<->zjo=Pa3`lBcWz7Xl@_qtmVcihUkjN~p{St!}HgFoAxY)E2K zron2?B__l+o-n1z*Zx!Z5uDi~r}ZsE-8`j*ZM7*rlCPX!$!Ckl84}sC73T1q(_@tF zpJzy8acixKaU9jO_;g59mc_Hukj(1;%Mg*L;;F$-P}*1IOJm0>b%1>>lMv0W?=+;z z(g}04hFKM;>ulx}wqw6wVOt+TKxXV}gBTT3g&k-%rm_uhSOj+K?WVW{wUFeWzW%KK zF>`{23o#!%%uMl>S}hJYs%peXgs3q)qF86QhZC<_U&p&xt*z=p%v>QZ#AAD%K4+K2 znI`mZEdX?edyRU3iB7=G`CG(+?oSgEh@4~DytUR8so)fq5jQH4Nr7$7G^PHObt%q9 zWVH7agM}^bvzD{kL31SVz~fLu!SG8LT_m}?yghw+Z1YCz*r7-91LG|jthvG%$2Prg z%nTs7UqhWAM|nTu;{BjiRftjaJcKJ=cO+=GQvA5s2-PR&^s3du==7 z_rV>s9!d&J#}jAKMrreSidvk$z;gEE+Ml8>to8JEx}Y?4cGe6TP104JMx7^|rPwX~ zH8ncmdEM@{lA2%d^g)R$knHM!cKiu#1J3FpeY35}2B9Ui8Id$KCrgebsY3!8>hmdn zcNeBdQ*L*zfii_4SSV=tNs;}kx<+>kw0BM*nS1(}Ez^)0rEeA@Gs;Tp=RzLCk%v|>fHulF0tYhVu%43Pw^^Zgzw8<3tz@yzEMku)4 z=j>jIizE3#Qbgaw{4xZ>;`#jo6@Vd2gR1}l*X{JvWev=V;_iFe`;oV%!-*oD79bzi z5|gDdgVE^pt?Z>Os^O~J4fR>WqDIOZ#cHr9Z>PA*XCGiYmJUR+D(QwUivc5JGUqzK8RKI=HvRQA)DIcFM+ z7Mn%3q|aI=drz2H>}*^L+5N3Knl)W$wXlEoSrgc%55i4b8ch-GhK<%SZ1RQHY*aO~ z_t#l1W-duNBcXy=+|US<*wYtUGdLg8>V>oHbzpwPZ&=GZbb0KFa1+})+Ypzjh)qc0 zCIu;Zc8w2XE1sg0JU0F!Ydkx8UU(8)a1kUo@w}17I(`vGz4cOa8r!q2((*T#6c{%Z?K)u_;Q*k&`N_eZ#i?rs5 z7VPZAT_Q~xDUj%F0s_SUT0rysUJU3A8jDIw1)OqqHbot;oI=_$_q;5jO#<>#wzEc} zoS7nTC{+Ro+Gx!AYav;ojI-8TbAL8v)V7&yj8hD!g%uZD(@54tuuacequKU0Q@TPV zC$&3E0uhw1bG-=Jybl*+bsTI_8525bKREa}ya zfC~q6TmqK$;bz1CZTnm00pKA$?S)dkB1IvM!C8u+AJbh%r^;WTRdJgOR~QtI5z?9+ zzu9b$n4>V2dh&y=SPusHb2)x&rzwGbW;Y3Z`^Kq5a+3yW?^7ktyJJK1r5aXut|={a zi>I;XKMIlZ*I&Y@L0Wdek`Zd+2;{5WFOZ=dIJB%F`-YYkYTgLs23cKfbTco+?83IK zgFlxaCeOOWnvoSaDMH;Ie)wU>A2cRvxPW!Zv7*6FRwcG$(2~YBq?#fNe9pB24$p6t z<0V8V*I8O2^F3Wszyrp%Ef5poNCqD8ECM+Ha_A{IzSebiE^)4%fp*YO2*Y%nRXI;9 zLV{?bQ=*RXA_3hI#g$ZKID30Mo&5DEh1YWhM!BtrV-4w=h19*;H*`NpBi}Uj9xI8o zwhkZE6187kS;a$C&{>p`yPSPoia}DXrE9ljr^D4-*bEEV@maV`_vx3J|7)Ys)}C(^ z-6Auxji&Br+h~HwckmKx3LE>8A*SCxY>9vV3jZ6FIsd;)n$YfMHZ5N|b4k;Tne|I% zPOn=wa|W|r4vk?`m%+pe*BgX@^^h&@H^lcV6s($&iGWphq&yD-a)t>Tst`Y2DL?!w zRZDF?+KSjbE_z7Gg>2=u$$-(FPH;s{;4^2ZX04H$= zjOI9R^tKeDk{(MD_@l$`@5Q^42z;niP8kFQ{$Ub%e!N}M}yX`G4C!3Jz56v+WQUu&-q!9G1;DhlT~HPeGV;g5nD93!QloAeY* z@&6b0`O@|gCB-m7@qe3re)`Ym9qXrX&B0oy3mbMI!!Rl`*nG6P6VxLfgpQ@~KyuXJaJu+-%u4X27ib)%2t z8=Ndrd`NdUH-5Ch*r&ncA8xF1cLeNI*c2ffLVJ_J+Ru0HI9Oz0^6Y?h3KlBJcg0u* zDOx|fetCBX%;GQuz}^BQfKsF#*QZk9?U~1j+voUbr zPwqs0d1(&4crJrndx6zc3^O>IDy~Yuv(4Sv2aJG6dU`d}Av&QqER;w>oRoXky0Q8y z`mnrEpp;i7xd{>m76pPhPE8@@Y}+1Fyu6{#QmIfbY!$g2iDWh74@!?beFf9dwPZta zx_t51Y5%L}Xhi>06rI^WpIIsEL>w!ZgzhzRoUvgTXNsaZi8K5}v>&-m!J zKY2$_W-8g>Nvn0Qq(>3)`rCZvlw)Vk$(H0`tq`886s|0BS72^P=j5tNEuT(75lVaR zD;(CT>N8Xr!VGYFc(a&ejy0L>pKcJzr4q%iS#J%G)u^u_SE>) z3}g;%gaMdsq7cuHwT4;8clet~e&(q?qOi~&q#bIOLpoQojVpyDa+Ede;^(IhNWM;; z_v`cgk&(WJ7fjqYY5nkU1pZ%S&*$z`rLwNeYNdQq zOll`QtIBCqmOe^@>VwrY@}&tX{UL_p*e=E`rrP!!KsG(^iEbZ#rw{lBIJN zEo_=ILz*O&J1QIw%~S7gZTH}KqXjI%5m)GtTt1JN4sHHkuh--2Q4Aoel1FYN4_6PQ zN#%tVT)pd)yM3e1MVwD3d_r!i*9-O2#WgT8sgn{CG(d?of7w#*D9X{a0d5MKpnTLq znlPcHuq3BYs%yc}7_HD=$UX~;NMTiearuPPy*a~qj>3NOD46RQTfNYjl!8E{l`Gx8 zCe0W`7c26C1NKn1IX;_;p#4Ds>!jNhE>d~4&m)jgrh^@R4o-^=bN0>pP*KOzo-SxOC6ceM)i2lY}@Oms_f93xYXlu_0r%W)iPQ09p*@OhutDZszd2r z;N-qe5Ed2|7UsgC=9l>G7OrN4=G<5}_2i7lrOpLMaUSv|flYBAN+3f8qCnEX&99Nxcsg8s zj6l>#Eyout_{b2xN{a?@lLuYv5vI|cr8t4Zp{OBHE2@!lq#DU?&o9hV5HeL-<5#Df ztB=o%@=;OC$}f-_+4p}pq_86^!ais77a9|5>M0DDJVjo_{LwCI9I}n3OqMDgrGb5< z7!D^|*E7#TV+vfMO`MsM|Bw?}C@O=C!P4oSUJxUM2EBO)e^wJe_~|8l`cz5L3Nd+* z!gLCl;r_|t#gkC3U22+!2ku~}8D0r>mU3h1FS*lG?k~|M z;jpU$t;s{ER|N}18b=i8Y!i7kukxAz9@c_p;_IpFfh^1e!R1R`9j!iWr7m|K#aZA+ zRS0n@!(rY0P2Ig+EpCI4#Vj=@j^h2-)C?{5om>=PaKaR)jBK`Mq0zP~Fa#8!o*#vQDhvZbU3+w{ z6gBxf@x-qR5Uf$fFh(H|l2AA3SYZ?l{q<_hxPtLOY-%meDjCYAQ1q$RY7UtDH0OmlMoyxKFk9%)(5k$4M>lJVGA1ie zPALz4B?T>caXIc1Rg_dXN++_#UkWMAyTo8IJN*lLyV&Y{Q-*L+8*Cjt7qP{I7Va*M zjS4I=Roe3_V`@Lnvrt%dy5Ui~D&Y|EyygKi$cxE+b zo5zR8tCHP*AdX7uA8m9{AjaoZpQhyU|D&QbeliU?PC^%KTT)ok7|s;tEL_&Kbk4am zx!zR<_C!@{RHDbhPuE9)1;v@qO?2n!S2OUkfTC5W{{bgLgm2HJ6; zu%RVLMGcJipeb9DE^Az&Yo#WV((|cd-lU_ zA&MO`ig~6+uuZmakC15st7{w_ZxUZJaJa*!PGvH}6-{F^?XCwG9cmg*IV$;u=K>yd!pzjdHlN{$c;wbh^xOk7K0WjEU6&D)} z4TyNeDy(38P9n7IShSeSHaSeGEF(^gWij`dM7IAM!Ne9sioY^7tU!Evc07985erPm zMTx70Mr9)GpUKqmyVTypR^+qIvkjRn)@ib`=c2`Hg9;8WG!?UB z4-3r%W^}B$IgW1#7k@04V-Ali8om?K+4I%rShoKbV6KZYlRuH5%{Df6=kPNnJ9LA|q97R)mqpRC)13x0wYLqvWfMmk*tdTba`OUvodezuV&!p={139@ zt01w(IU*thIs9>AmJWw?uq$4y<_rn9)e8RA*(ccyT*{{vw9^9EBKD@+yR&3s(8?PUS(*_{SqzHY`-Jc$&lP9b3Q z?HOpEWS>-G2gwl$>zjf)+ySK*O7#F$QaG`L*x_v$^;rOCnS+gjMS0L@PG#Za#7K6i z&0uAt9uO?CxXnYcY<$O2H8%A@p^)u=P!O#ChFt0j=T!D;hA6RT??JThq4&)hb#TbQ zpxN5n34bX}j~5ieR_KDQwgq~K;vg{4^LejcDE_a^&BG_!SF7gZQDDWun<^*loxrIeN6tQAr%k_VS9nFy~S^`_)!oNUn9hAgq7JEN775HQ%d*C}$ zF`u4ZKS7hpfQ%~zw7$$RPD~(LjoIQgnb}qYcBkGVI%-QjiI~?Cm+0Xx5);h-DvVV`E(Koh2rMV?fdE*!yNI ze^HLOZs>Rh3Y$AD#L#oJZ$o4VB*spagmOML1Yye*|l#9;^2~xRUMGF)|Sr@ zB;RxtH!H6BMA)WnI4$>qkc_FH3U>x&JVt*HmzE6D^4u)-z!J1yw1ozbK|33*>g`8_ zN)oGc6s>0CXNYO^e1Q1czRygtS=@otV8_?ua311LO*^83h&^Gu5aay-@s?9^OwkCK zHL+_yGsQ6Hc8HA!J~JicjNDkYO(^Y~w}Tm_yd0jgWw|*ri@a3<4$Eukw27_Fa#F>j z1hrS4B~vw4_W@A2$0TOQ^Dgv4KQDdpxKO}e`<*!hIE`TOp9|C2TaQ9v_|xZtV{BWe z6V@9rT}3_hH`vd|o3>3bMR{D%0MG%HIXubz7x3wre+uzJE^h%%Zl5`ceYVjY&K`JD z5ZQZ!U>kq`r;s72*YM=yUnChC1~b19A`F&B@CLwn@}!U+4&9JAg;aAR^m;b+OTh}Y zbK6WThSpmQdk)98(2f{7!q)prs87cBz+)EtuA0Kd>=#V{FJlkoh{=QUSHfsRxH2A; zE@m@{i4oWb>X=H#h@*SN5e zLQTjVYN36wr=u-qw(DCVN$)KtRvg3raagEhUH1qA8e&c?FM`ZJEf=HM)h`O+smeZq#cBH|b?-P1ib0nB^%QvP%x?~j2w%&^v(*1h{fi=G(2&8GVMF)VEn_m%@=FmBZ zP)q+*1w@}MZ5hx-%B#X#L=9iRDqLMiX0E(!wPs*OTpL$ePte-2?Duhwj9p?bX1jl5 zf%ddtNThSvkpn^==-|M4kTlH;5xR5fAB9YP=9?FR!yh{VNpRk4LL?2n_m4tGRtTtm z*sk69@S>{V15j4G)xss%1m^gYaArYcN4I9>gH$b$8tm9ViZ|=b`HQC2&2L&*w_xVd z`nu^eS1|8EQ!>{*-~6Kx&DO*~YjH$`rE*o2pa^GQ{YfanWBB20Q@p_}tnBo(I6J4a z{jUniQL6};yj&%Z)x9RfS8#NO!q{+%v57Ra?yiqEXYc{o9rp?0VJ>9==6FrWWw(qr zM3btV6i-@0@MiHZb+ZE#LH>Vz4ID4>ena@^AwzS$f(Fv0!%}w-+cU;ITDgW6QhRVU ze2}nmc#L9@se^C1`kjapt^F_4DBaZIWs?)aE7;awh$5T#g0P%Tv5Q~OijmM8tj`k{ z7!8esw~ZHXHn6XY#c`}T99*O8EuoZG`T=TnlLI1p!*d|d>OzQMz1Eha!i3ODwMAl% zUOpwbELX|?bBs7XI6H#5iy`aLr4!kMhjtm074yv?%r}=C*e}i@?RXhr2UjeLu8|sN zELt$b)5@>T3|_rW_*EEt|7zUJ@azM4SN~c_8&Zd%&Qf+Qo%_b#CA`6&yh|88MrCJE zJcn-x3Op|6>dC+E61)M9NC)!4!QTk4r~@Y7D-_y;cRN3}VFii(VCM$|ssM5Cy+V~D zopsU9Zru*nTeMv$9wN4>;BzzA9R{zxPncxlNK@1l3p=_)cz9?=GJEHt5Uqq)OJ?i8 zgEV>OVS$SaRng%^aqP04!tF!5iDTyuAkcwM{NW^X`E2MaDLXI#i^K()AexRx1ehBj zyk&OBJ}Az;tn&wNIxVf(V6LOPxV zIv<#ceWAfLek5=hz?sYz?h-D9OeP}{+{PE#S)Cb&$;VDu;@P*mge!kkz{^W6$Yv*Y z3AuwOo)QYe0+u&+<{lwkq>~3-JZG^cF~v9)tnbP_f*t(yp*=zdW<}~ixH2mo&Dqgi zLh4}5?*+e+UA)UOnqT`9JuN&`Etfr*XBy2Me-I{x?hwVmxhWRrpsH()2(?sgo536Y z#y5rEu^sD-FwlL!C1iR9p(hqFy3rU)lAO15W@XK z#9+bz`uc9mSR9-5s_cmijS=j-3yr00YJpf};+IM5R)wXo#RXy-J8_}0j0)md^IJl# zMtJ&>Hrg^8|D#xKDMfiz?*dn?N{Zj5rYFGNr)RJOt&Q{)VVY+DL$ zr*T`IcKD8tRUow&@{S7a&CKvuA<2-(HhwLn>hQtjnGqEVUiF`a9|*j|1li{Ig)!I% z2MmwWQE1JZtXo0L5NCc$0Bg-zy6?5&vxA#F0u~}3b!du z>RI!LLMhvH5IXp$g-|p`9~N$=VPM4^OX^;O$=(b`E&ugDuc#-EQaHPNsT$1JXA z29*68;um)IN`{ybsR|IPmCvGV(3YBx2ye35XUtKY2gSo!R2P^IpCH?qAf|=~Oe%)? z5VHK(rU{18`T;H%51UJ4{1}lR^TLqwarG59XcCokBB$-ilMNB1E(pU1_Q^DpDF5kb2FpE1tkU%IhI7QUQHqYP zTm_Y8E?Kf@3D||*O`m0e@rV7;3(W5KV3t!4Tf?K~g;|4@=Zb$b zgsqs!rZ$RMVQS_t8^v*kELEY^m3-bQXGfgZu)0;o(X81Ad+vtw#Pm^gorYU0rCh~d zA3T_97lR%X$38hvd``|QFP8Uq*opSGy$_4o!KW<|EV)^{i7on@Szz8b%qG_D6eA52 z*e0De;Z!_#WY!domdWY%G)j=P|Qm;jK_`B^CMoU*@@WLcQJP=lk$We-P@ROmD zu1WKN36&))mo{A6g8e(=mCz_s~W-FLSeIbgKs5PlfIir)WYtoLtH`Z9i}`1A1|AUEaqjfZ*2O& zBxtyk4W%h^{Yo=C&?2s7zikyq3#w`*FLtH`ZI$fx=EPJSyvZ_(tN$=@>p>0nb@m&J zVf9#51Vh}0H>@W1T@J+2HYfU!Oxp7;43w?^{w+sKX$0T;mLg+GX(h zv-&s8_}USS(Eqwjh%6eR{e&qBedpUz$0y6+bCf1|U5K9Y zhkDv|r@ZFMUj)MNboREcdS;h2N%iCxdels|&1Qk^y~(J528C_>*qA=cx{eDko#PPs z(A70MJrA)sbar&ZJ3Co&49SPjh1G|f5(MnVF1!ZC4%EN{wFwp!miZN2fgem2qw$6n z{nH=kP`U6@xNE=(@L?4Mv{OJh^>y$iOAeDhvqV(`c0BB@@wl;6O4Z>k$JXaTKP?_V zUTM&58u;j?qQ9|2?;6Lj&(>j^N}s}TwdEPSpmENp#&mXnqbWH$&<_~{*h4oPfz>5@j1Qr0FS=M?)6MnNmg^+j?Z|Rn8g`;Bm zpAj|i>P=x@Yp$Bxf!)oSzmQtu!)mIWww>ZwERV|`L3mY6mc+gMfnR4PND#I z{ol-4EOv&;A|INb#5P<4NuTwUIfpg>!z7w$HJS5%JWd3y%*+z6G{>>sU=dr!;R^JW z?S_aTZe16F$d*G3@P-j7R4VdW%;lCWR^dZ1?V)R|CYv$|J&X=fHQQE^(E;yCjK#^2 zdx?0I$;?Ib(F?y7qP)38_#zyz!!KFm>NIqSQmiEbZxn$^y+DgTXSCvCYCG^sY$ zr6W#sy7sP(s#BFNL4$(Qh>Z=a7y?)jY4sz-tpoRrIw1KF^0pHCGA`=DWJQ}8Y5-{; zxcfp}LE&}ko-f2VLQz8r$LF_vu;-PAt+)}`i748&P9K5;=&?Tt)gGxG*C{m~tKJ2K z!O+Ed8ubRwf?6C-iY-u>JaTw<*r@bL*4~x455I_eKS`+qm(^Qf#{8+VK-auyFaS>> zTb*eb)&EoW9_LcsoDnW+n@_uYnTNB{S-227J!GGfoYBt#d}4~ABJ}5u(8X+A6&SI= zH@t5}e(|0{77jf?H|B1qV_61EtS%CuCvwSj;5+cq-ODUuG}mA0X);cNY;_jAez6xq z?7iA&iftSLKA#dGrZAxiQ&fgVFlhgBLts(%k_v(9Sm%qziYFV=6GuXUj}>nVPlyMr z?(*P)Bb8oyy;3)GK5dTgA4;`a^lMJz1;s55V_bDPU?L-dt};t4EK>s*196Z^3TQ;! z>VuxEZz!s%j~b`)YGpXbT#UvJk2gact%9YBc%cMds03d?rXoZbd_4pwK|Zaq!&n#g z4+X^J_8{UwCmix|vHSl3OWaFaj76hSM?b6PH1+@jyEYllhS7A;@UR6YJg&RN>@}W0 zc<5OX5)GK(9t?A^JRv)B*3wXVXK zx4WgYJ8%teEwrl^Jc+;q^ZQn=?dUF$7Wn)8B@!MS#ZzTU^pDr??sa)IhNH;`<%uWq z!MG%E2fjEC^MFTM3tB|PC_juTFJUQcZ%v2K)7{0AMw{c?muMd=;Eo~srns;17cO^8 z@5z# zpIXOe)GDP-9eBbB&&!20VFxDR;Xu@_WCva{=CJn3me_f8tr#q@wvGM>tsfL51(Z$a z&za#UuN=zAUfP9-6_RO7o94`#K6?o}_Ng_MiJw{R%<-8uX>e1SC1RulQTiaZi8-uV zKYsXoTsZs;Ibc9s(R1>u2B#br6#t$QKRmd5kFmkPt~qMV8L}h(c+|L^WnK&Cbi4N#ACE9|4vX*ik7|v%+K^hT(dMR3*<@PBjDKuhR z{|;Z|$xn@Vrfaj&ByXP=H@M?7<6~yBKBTb!{L&axsJuu!R4nt&%@-y_0yMHWzBHZ} z&spfArGYmdU;*1P8XB}zVl*@7SH{o#u`J7Bhg`aB#-ioR6oi8n_&e0skV!G8vnju9 z?ZLfcV))QNpdi8C!rz$CqDnnJRT~0-SA*vpU2eQp>~`hZmHu%VZmQI%j)joy+BSCh zBk;`LuZ^R)TW9N6#uE14*Knzmc4`ARAE4Qv|YD+W3;ewUmNp-V28!*|0wL} zUx%H>Qec-pR$(6ud)Sg0kYHB!m?P1XRvUMLevD?> z>L-o+DDWV5@QGcKep$R7Qd@m9@xy7*gTw)XexZ;d(H-#ZRjM+f~4EB#6#B33Fc zsZtq%5)|?0Z;g7jAHFq?(wd~7Fs5sNm!B}YMV#b(boYhbal)7xr~OiuY|spQ@r2RA zzB*y7V9$}w0dAmA2|HSuN$p{JAN=8FmpVx{kKwF z=5|;|Z#!np8_YMG?i-2sjjS=Oddv8jL6P_v>QaOf;8tbhev6HH_Cxu6=})lP9{mJv zyzqC8TTN3#6@Y#38lN>xWqS@-5(aMKrsK$g3&il}~IPAwYmi{_vS}#5ggR8&_FUH{kl4F(I?WH#@!753<(>)exA#A)b zlE5wt15n@^$=qk|@jY`-SD!S)joT;wXYP?EosaIi`f9=bk>S=Zo)lS?D-O$oKg`Qk z>@{ZK`y^^03L6F940 zgYC(J=i|KRjFZ{7$BYq4dI23*^dGSDrVc){*Z9kTrb%m)!3rNRS|*^Xc9BJ~6tr;k z7f23VXi??5-qjXC_dI#Jy+9Qt7 zYFvi%=UUpd%EPL;x)FvH^m?|$Bc7`nzS(^qQOYFW2VZBz!66t~a^Rw#-U<82Bi_yq zHJZZ*uk(s`87RzZ(x9VC5X}l20ruxJ`4c_O*)fN4B zq)2KlMKZ9Py2P=mr!>;C%^q`7EP1`CvU{PYXBO__vBiyH@$B<1F=g=A)nPFPR{J5g z^vMo!*5H4(i%?$Hl#(fVi!hP=P-Se#CUX%TLIf5wSB&no7L5zpKy_U>twY>Ovz=WR zI;BbNloaBL5Ga^!9X+9j;vy?O2HXSlCEeer&nEY%R$ufg)gsP7QZxo-H?s$CFprJk zw4x|k?A!{mnw_&6daSfWoMObaU1m5Rx8{rL#63*%!mawl+omM8d%ZP+WgRovmf2Ol zKo4)K=8ujG=`}M~hf96COnEPc7=`L5#GwQF6TQT_8m}39!T*)H@u;OSFzAat>7psboI$Uz#mjD%u4WJ}P5r~x@Stppe5tLVE>D89Z z9D3-N%q#TFaA2;yf@<=Sv&)lBw2Rr{6htRE%1vUldIv(a>9OOV<6ux*FPbB0MO0YW z@r#5ac7C%E8{<(-&v;x1>yJl^H}A4!vpJQxpYr5cn#7(oqtVTa?*qXs8U7Hf>` zyi9lnp(>5R7Y3B4CrV)ifR3wbp{jpU!JqPsbC4wmycHIHX|g=&?9}k_;G&A3lf2VW zD$2?D0@J7A9aDT(8#mM9HkRrbP*72*oz96yB5`7MX*HPh9wEV^)K-1He4}msNGNBo zl;R%B_A-Qg-ZxjQW$X4E!_$^{aIFRh9QeE7cJa}#LWnT@;`^H2UJtLviMe8wjn2nG zI|`0p<2 zSCfpV{D{nUPed4NdcD}r>ieMh9Qp#WHjG+#1lVI=r2zT zY38fMww?v2^6QJmiI2P_Byfi48pP^MFpPlelP@6P1EH}K*z{G#>_LRQZV#K$uwoc_ zkrY|l?(Xc=4>+K7?d*-K2lMCC>j%>oEuFLM96O)QhQ9DLGMMx2#@1Kk7Rh%F2piWX zIEux3;VM0}NHnqctHn|_KO6@C?j~GVdwQqAY*8@7_E1C$cC0n;r{a?BsT8uCh0w`crV?+L06na1Muuv+HZcnQX_S@Y4@^4Jkw`L*_t7a3TdbXM#d2YHDx*Z0lGF zU0}{4)gq%kbcJW3+&x9azrd>1N1s%i7`g}BqG$SaVGIv0?wKRkiQD;=bmt4dz^&n~ zhrv!cLQ*kIi==R1}^u?xrg-2=}>Bi&+9)el)kY;A1kYc;tEmzA&qNbFvg_l%3NAFDR{E5jd~oDRBNZKtv_EAgfyx>CBoe-c5{#Rwl97`<YzD<;>CES1-l*{ifZu+w&SQ}nyDSnBD1OC zrX)P6G(1#-+nU|}*{F1;52paU!r0lzvY*4X;Z@CuI?n#o@(^uR1d7ctMP@@mA?`>) zTzH%j#{~*NRbm2^A~y9i%UBBB((mN6t3I>rVD%5cy-;_|vYbf=jT6|p$1Ojwj?XPq zBj`YiI6WA$3)snTEd}g{&n6sRJb!}1vVFY03BAXc=GA&^9zqa(VJHEA)M{;PC`%4_0 zayk{Khh;aiTfVW}$+q4K5Ad3oVBUE9Ng;;S_E`~&^tA;l{>Y8%PFS8-fCqQ0b*B#$mc);8H-&<0s;_Buwd_e)WU{>fAEb$|(6Wd=Srp_Iq z09q5m{N}oQrqQQW{1fK7T^-91@nR400FXg{&O%(!n7Ls2{JLd}mayWNjPY|}y3fnj z6pwj}7A{>hf2Q{E5{!9tF$IU&d|fvgUS*0@;wUb5I9T13uq=9(A!0D&2TQJjy%!r6 z#~fslN*af7=--~S^EkFpG|GKg>Tz2SUuU3 z2-Q9EF04PV?z0HYu>r&o(`dmnW)>lH0$#LKha!)AvvSuGZ)!T=UdI@uNNW}H3*~LC znfZzxzpmRwaAk%6hm+g`v$ z>wT7DBLc6O;Z@w+NPoo=NoR?8b0-w7Ja%|C0>*3qWQj~}r3`H){XKnfj`Yx%xaziI z6Or%Q%rn_1KGSHf%})K3#T0GmL^tCl$_Fr9@seI4ZV#Vp{$wWMVr&|NL2fN2mt zxxf)84Z9j_3a?r&VY~NR^4Q1wEz8X0VwKp`15l;FNa(&uk{)kHd{6(u>MlX>@yP=g zVes(-mKO~S-jl`5yA&6(%3rgTDvW8$I`F*A*KtngoO`QDC}EB_EcHt1S~KY5U!UOI zQ6B*u&w2wp`MfvrKS#G|0;{#aM#W2c*vxfrSsG2STIMkCHzvfR;@;erIB>Xwhp`!? zw=Lt8J`)8Ymc4tcG3JIZquH_djg}0J!c`K-gEu;jJMeWDm5r$ zKY3*SAM)M=JgV~SAHF7Y&U0oa`<_4&CLxdnl8^whF9`$?WC@FkCJ=^X2$5_gVG}T5 zty)(Q$*s77OD!r}ZJoNYR9mfYRj`Y#mCe>JwpHm~*Y9^f&pBt71eNyvU;ppBJ}$1z z%sJ1#-s|sPUN2ZaLx!@aH~y6t4GDFV$7<~K_sUtb zRAvcFs7yp=Lyem3F>0$Cv) zdrQF0An@C_M7yI96R*T5_#!tqU!alofkmWY<DF#8><7-qFs_`E}C7JNH$Q~ls?^kLB zEjuOtG3cu$h5RF#?maEyi)wgvv*(=&_lOyh)J?$z-qW?Ulhm(C1++REo^p`rxCo*$ zLBr07?_dYOV7&9JNK3Ldr1}H_FqyVS!z;ooVDr{I!~>`c*DKj8ik&p)YTs)*LyMqMYc8oLT< zPk;FAOAHr~I(Y<`5I6nh*P!eE`3bK3O$~aw1wjD&dxj5@VSsLZ3E}O^4#Fwok>3cP z^i!kGcSREP{XvTv*$_UMtu=27*Ug>4SKeUjRdD;+b~f@rjwwKgrAZW@#Fg{h88mS> z11V&{;~8QhL3^%*ng)>@==12QI5Sef@VgBoTFo7Az)@| z(U6`;`CU{!5dI8zZ-b$E{_7%vvWhYBuYS+z>B-bn2KG@Y%u!8TDrI>}=W4X%baP&y zkqgVB=5zN_w@8URmNAZH>=Il^yPw1|v+YO~cnMk%PoHP#{h~p7;F!i4jcK!%UaAvM z=}?J2$TmbXqPasDUrrxl&<{FqF1rxNr2vo9SKrlHyU^dU7C?NpfK&9-vNkwCZ`utH zyE#9`;RzZqGcg!&rjs!j{auv%vgp5K+h25==f-N-tZ31EzEaL`<*0fP|<=(70cSv4Ppb_yC^DLKqrDtx}l-Cg)Ih zB?VCrph0F`6@Vu#2>yA0h5GzwN~#1Zjb-PFwPK4Dt1 zIllGqCV?^w0d7~qfQ@Z+CO|QYhwzIFKCGZS+Vs?t>9U#)Qx2~qG2n->GI0uU62<*EeCwwhdA zXbvbSq5lVBuwf=+uZAk}{t9ZMDYrAUmKjUeh*J!sl{sWXL`-tRaV>#fYl6pZZ;%Vu z7pYbpTb%u3!-t!<34M_25Dp*Bp9RVI8QmC2AI73}-dBxzJOT!#9{~yyg3fy4eAe24 zVi&#_thZA+>dN5DiDC4p#FDIGy|A;gxtS9GrlmNo+2Ni?brxEl_E^99YE9tuWMxlv zXGbjzW!Sk2=7{z;%6&tJ*dYwnqnb0anYD@VAXV-@Z}q|jCFSLKY!(u^e!oQdG|a9u zY^c6?$quw@Q+JPj)|ichXQEomtmdSOHw@P}c2>0YoK|>C36CXJ;EaC?HWGR#X;LH) zKyMSe3mw^kepNxiqD=Y~_MuKu10T>tyY@k)u$X z34^DCC95r9x2a?jtijG#irk?9NYQEP?X0)8_ECaWh+Gw@0j3&Rj)3na4f_9FKPbA> zFKbhAq{q^fA8CJ1*r zR|FYGN;aAb`y11F(+gNQX-ilta})&5KJQF(#8+9dJ2uQ@TShuOE(+L>_9o`tou#%w zaJh#rJz8Dt=wD#Q|4?PHT|5%Ev;!=gH;MXE4JA15licAERfZ=wZ`0Wv4XUjJ457@o zCpM~IZeNv{i)G51rsf8}Y)fLVWVC09F^KQ%w2S(xdJ!yg8x~l$$JpqmodtMU8SJ2w z9-0O3&b>pT%1SDw^9WmHnq$DNi`aa!+p^VsU2yOK-ZyFt&ECyy=zAlgyYkY9*_0y7 z`_7E5VNa%+qOMt9o{E`JG`y-8MfQ=rKyI~ReYH&OyT0B)BE_3fm1u23Zt{s~QQ5gL zJYetL!l~9SQ*+W`?_xUfCPd!@5?n^NISlf`3)xRF&1^ts-x4V4B6kjMk!smn)|tHDvfWM~Kq z9nyS=cB|ODR5~^n<~KF4q+shMQK?fSQdM(oa#)LZOz|}q7L`nb=C!SPt^YDstg`>T zRfcl;fcy-`Xo~ISaN>z9IpA>jHVhf%mV(@7@J2f7(Orp=?+eIr7=Zs$#mOL$dD2fN zyyY00X62YNl`EvvX&~d5y#)8Qgkmjkl6>f80TUx{B0x4yA#>o=Q&{)2VFAJ_tzg}S z(milVAfcPcJK89a_>-9(45qPg&2nkeH*W=&iyUa+Wt>fOq}eqNUJ_P1dc;oCvi=s1 z+>Cl)lxG&hR-ODxR@ww{f=TL_lPK4WU5~7oa=Ag)h`F!ehRVPIm_Q$V9NBaW_7co- zvI+)9!q}0v+epD6?6ZPF{1;-RKC?1>Jm;iyDN(sWe`?D4J;)fIgR;fLF@M5r7y7n#?Gig)><-6nO%aDo6qdy#R4p3ZAj4fgCw{dRfRkgZGdymNpva zOdc#OR4KwR+d$Qiy3-l-Fdl|l@)DLaG_!%WRyn-1{n>2f+c3xDAyNNHX?NT;gUGV4@CBcsVuQ%jWdq~R#%O6%F2C)bcMbMozY$;W280*$VVQp5TE*hn^D|6T&x4#9dX)UI>b4Gk1|n0Fx4VRGgS@ zBuATzM}pe$gYHT*f_rCSjd_ZO-|6GVK~O6%SYC~0`Ix$pG34W#9T-9$VOW=hiZX&( z)e^Q&*23Ig`vc@DZ&-WfT0D%~K|lMR$4`@g%8=D>IovLs%6rWdf zfeU){POuvDp9Yh)n*UVmQPFho)1Ev!@-$+9&Yc9b0S=N$e|;K0HIpYoGRJTuGMFP( zJOgFU-rs7O@mA@8pJ-}a2^h11Vmw{-41!7D@(c`NWU1eM#xpQliMC`aCEWV(mp~_x zHN-vZ853DU?X!sD?#^~3vOXoAR{kA6JzMqwI!|g=ZhqF&NC!3H9s-k|&Q(qA7V^dl za7+IBAQmyKhhT5XinRth_pE1PhzHZtnwUnnJ_qf}W0wKiWZA8N!FcgG53qIe@onB9 zT~CFm-&bqn49+@8UX4wV-Vb^bB=rKwn=Y;L3`C}_}T1)^Eo1@)-6&|lhEYG)b^@Set| zt`b00uT<7y*12M~hOL*FW|EiM6XZ5wPvkj6CYiP>LhH}HCiI)oP2u`?oblkT{RN13Cq-?utMqw0 z)}Me)05%8twkVxH9{W){bbxH3O~ z7T$WTFM5V6t%&zxJ#kJ=*u_=ObZ1QgdsE^BD_92{^RV~Bzu-MzbWIoQIh6PV55rI$ zzF5zM?T+sUo;j+%QPW{%-ZULPxcC!CEi*A`k50$lgi_Z<(|_nm4U|nZURVAoFy4nN zYbpeb!zUYmV4x|>0=C^377Me@CV9Focz(rWl_jT3Q9@>Y)t6r1eZSG6I)QWjBY{ zZ-bzptZ4^=iB;GPcM0|67fIuJ^$!bl2?FERe;2$86+7-rN)1%K0) zErtlVh8wvdiKuCWaUcYeZ&Rh=q1#6q(IEp7*fo-SB%zkFMj1_mmliJ>igUIY3MA-{ zhUBwCKB&Hh!7k`{9Nv5KF^LHu!dVy;d@i|11LU!60SNltqcQkbjy7VGd*>=r*f*R6 zPC`~$P`af=5AWo(jGgJ9|w}oBYk`}BiI`}YvcO^8< zhdVqlgJOT`jGtk*Zc2s0ZuJhQk<80@6V4zr2#uuV?@KjSSt}{vN;59OoLuh|aht*t zQ*IvaLfpGabaDfHw7b)dD;>I|ugLK>$cfJuVAW@38k>S`mFsZXJrJBe=QZX8Qu`Ut zgszb-Q=>GB%`yTpmKz%%jI??WNQRHIfUG)bqDamF_gRSuY| z7;DCa9Y%KXn0$63Mv&rQ1P3$30mDJTK%ElrboZxw`r}GSSqr?d@fA_g8owg%H-LSN zvV}esQJ4JW&2pxWxqy<3p{bO0aCTbV2qR!9LtPW>XMR@C2a~Y#knBHXPIX;v7VfTU zrsa?jyVl*0+vu@X`JR5AG7eA(Jz+PJvNN57>F7q7W1SvglzQ`c5#@2XJD)cX1~Raf zmQ)rVNhnLoy%S?=8E)h;tJc?af>^ee_?{_xUYhkQILOSOQ%{zWLyujLNSVhI@#m8) zBPMmKHSc@_aXvm~fsT+(CD}%7a5?(c=y|DT+TO)NgMYuS)!X%gUTg;ojBA;1VN?!W z6X|0HdIdq}BowU@6CP(}bN5R;#29r)qhgEd-6;J?JyX?voYcw$P!6Ah^ z%}Ba3*C^THtq9SM(LZtxASH}6Tv~AJoy{|zr+rW89s|DhthJ+KFFP|Lc1xzCiBj{8 zLb~x9!%Iu^;oJ3Otve}GK@{J0* zg~R=9yBv{z$_E(%8juGyk34G<1{=Q#Z*!ooz!>TXY42l&MmM%?QIRo$J}PpgCO37; zvz(`(5KDrOFiL!I%|1fz&(!F9KyZI4?!1IJ)V{8=ZwAZ$7)x*@KuoW}qt*eC?HF zcd_!U3j=&~(Y!UzSETzW11y5|JB>5>I72PQH^bmZss{eJ);R^b)RJ}1^#;9L2;qLg z^Kb{wY=weZnqnQ^3H9^npX0j?3%9|mWS3&) z{P-J`doE454P}Ew^3ac$>G!x6S*&gL?atkn!}N2vJ0DTKu6_hVeR7+#D>bYX(^sdK zR{w>)B>wDidvKAAgp6xAtmu|)cOIRjh;b}uDU&g40YX$LToj{4@d_C?ZcgRmy4f@5 zPOFWZC(9GNoacb#FKFolSeF&|I*Vh? z8_WcyI(DD4D)7p^&aIAQ>HaZ(dE-RWGXvZO-Tr{{5-Pe5=CtU0LEu;SJGVs9Yj-$3 z9>ff6x|&5b(3;*VQhA3)2cIpXiC>2w)+Y}*QyjV0jR-*+)~<vU78MM~d0woF|Lz zZiW|M08IBvxJ`jL zfPv}l<3W&mza?}`yZoMTv9mBD{7!bcogNj)-De#Y5}}g$FBWAs!xdS@s2DD7*L1W9 zRe-X}Bw1`O!)Gc+nWOqp^%C5deDzdaCOy6oEP?NDmb{w|uoh!iEU6myR%9~`Xn8T2 z;X_x7utodaIb%YbiYYN07%3i>EkkEaLnEZ3?&H9!IdBI&3ZL5TEGwwVM;aCc%0+=c zeXp~?A9p*8HHl(w@}zXkhdsJL%;o9@ZMZod_--uZ69nV7iYUht6Ff$8zF{r4OL(@_7tyM*@S(_LF-sZB&S^A_CQ8QZ&&JhnxqA`PjwA)!kURr{0cY6 zmZ^HQdVZ+Fm6iaO1#mlU9p?2C0_{cL-0w_?9p|m?Xln#r*g3@qqrU@y#XYg#`7q5o z=u85s$6hB?dk{x+E!}X?Suc&;yYEG3qYgPo(YH@)$pGDnq4@qD7tK24eAddNf7`hs zogHpMO~+RN+G-^z=egTNx>Zs6^od`ev zj`J4Nccve0_%1H9+Q5os*E`hBP2gshN0{f;v|#$LaOvr5N$fUYv`=kO0+C8A;y zd2DQxZ3x&4X?(z0UI6JVHm3w_MKLM?uX}(WDvUh!h?a?{bXf*d%{KHU4G1{1v(1SJ z)&O&3j>jxPF=@LF*)m7!%M3}U)IQb&a%4gT`^=jjPqa1GD2z@dV#8kbggb`r3OF;+ z=Ys*Kh|*wBR!C1h?VPW{lGIeqw#LEu?eA}h1PNk1c{?osCqCnBQ&w=ap$g3MXP+8F z6`eP4E-diEAmIw>^a*V+?S2*Z{!h&_itK;|D|@cO+By0eG|s_LB|wOYr~4lSDY>}X zSVW5v&5?%vNE3-lWV#4+kST-fxdx({BNOz5RFfIEgmbJ?0_|gYQODBj)y5c};-f!> zN61YnMz)KiV?xnbKof7#`swQHqWQ)TIaTfgLpoDcEMQKZ4aHd)LQ7}pVoXT&VC2+vn}9} zHm!_ur>Z2NUCi>N_DnjI50M%wWswZcv--u#T$W291a(LTmV^vYVj=JmnD7P0bJ5mD zM+2!c4l4v69Mj>!uu1hpS|rQH2b-s?04yakohX6PgZD8E&8rI$#cc33IFO%PWc-Nc z4R;zlsu#dS^I?x3D7egs0;J$&;CuKPL_Rug{bA3}6!V~~C26CpfKu2n~|D%xIaY!sjxXtax-* zDo9lF<__)jbum9SRkH!@(ay7f=l4@NVSVmYdTB4Q#P<@0fGex8Q{*& zG6znxu>v2fyi~TrNYe_7HY04q62uzO8jN?M*nJzu@GG#>jxLYV9Tk+L^yx zYSP6!rJ%~!0f-1?s%~PE(Xs6!o8XHPOQ(z7dIK+9m{Ltzu%=aFjOEogH`RgttuqZ> z>Lif~mnj@1t-xSqIU@|7*i1nQK@`%0sjOkGMXPs?uYTUb(h1Tgh|8wcUP$IQkApL2 zPZ@;o)hnXhRBBt6q8cj7%?M=Qy+8$$my{=yYcQV}H;xs7 zaJFaUBa_(kH3Lzfmk6ifCBc^(<_JI&2uBMu+YK!%+JL(@vJ_6)gBS*dX1 z&gZxEM@7B_%?>chn_#izc02t7kFli|Z9C!9d&_iB!G^@opO|@4# zlB~llRI<2nGdcEw$XK$-ohGN6BX&_~D-13M*11#2yVBue#kWKX%CD!@&$x@|d+iRG zOk-V)xWX}rmObXq;wXPIph;j|t8q9=2CF_b3L&2A+TlJi;&zA<$F4U1s?hzc7YTH7 zK3saA?=XHF6qZo+Wsn3kzYA&2To0g)5vML*LQYY3lFJiF=`x-KNE1WnYWu8gAHgho#9#)Wb42>_dRbi)Ahn)SxTu+Q*qG)B?c zTVYAqe*?a;0XVg6(Q*;`AtBhd!1fJ>?w}*rLt=90E!ueVbb0+2Z37o6bV*o~W250y ziFO`^=UD4TTug5?Lcsl}TeU)Zc_Rc{sK85?-lmn&JyjyKhO$k@-$LiI=bXq3Y`Dg# zc5norc*@*jlm;8b>XAn&kce4;*`!8)x>g&nPGb%XUu6pOES4WqRJJza6=_{CLH5K< zD-CWr1#?@xeyQ>eV?bz)ELX43G_rSWsW1pq_v!K?+u5z@#kir66|#jsYfz>((D-ry zxmG&+6Ih-8xgXSJr5VN)I&&$e{lTrq)gg6ZDd>SKuQk3GA=uXg)z=v#qq=QA2F6i1 z;%xgu+z9q{vdq0(iRiSw~Qc;jWlA#z^!o41>B}xs~Fw$$+L-F*?^@y;u zgxH7)8jtXAHo}x6A-Q-I^PWcO!(M z;C*g17K2)Me#3Z(zI_kNyH7hjftS8v{M#8aSpUA&7?>dGbL@hSF6G=AD7?)$p;7fU zm?jQ`nqpljeA}A}CJ289YW)It?J!PaXD!pq+^{)WRm*<}CZrh&_Rs0c?q5Dlkxv(b z@%PtGZ$?`FN{5y@GslL!S?F)^wL>rgFI)Txnu$*Fbwb6#*}N;@K+0Haup^+yXSp(0 z&G5IaSkZxCcT?cW06&CA^LOcT{@pi17gxy)JWH2)VRZ3J?~q|~R&B)=*FB!jJqqj; zxZ8St^ud)Nqqbx_;z#o`N8EK`#tC|(D+5ICM$X15!961d<9TQ>wI(go(@>xU@o|sNN zqUFJxF!`6S*2EreiapD0pC?ZfKlv$JS5M6I448;D!ssQ6Voh`I;Qt zK(p?C(W5DJ8CZkIGXvAp2PYEv#x!FE<5!)YVe|{c&oHJqa0;9wglDZ%sBM9(FE(Cu z&^6PeQt4!@NDBZH>t4=rTgQJVZQl>T%Mo`O*E?0&2ha}oe07wC#I1euULz@SoT5#uY&%;Cs7t5s zm7#DB-NymPW*DA8>V1e(>sX?|6wx3zoq9o>l3F#W*J5eYueEF%P%T`6aX%2VqPWeS zbkz~(OqSa#7;sN5!v{#10_od-vI{RHq#qOy!6+;c(of=uQ|=v4TlmWP|BN2Z-KvkHlZpC?hbS*=~#h`tg|nYW;7+JZXZ`!1YWHSK)u zGgHl+YbHX&!p}V=Oq4OhtXdLHJkS+wZBQ=qE1JI=H`1b&5Ld517awB^AWI7j+mDZJ^7>?NWJ;>rg9U>?!7S71;*HJI*R zC7$cUSua-E{=s9<6*%53MmT6re>mGRhaISB72gjfMvy3u{`Du=a4=3pU~aoO82Z}V zAu5whU8U-RbaJD!vyGI%H#)>B2s)a9#Z}QIG9+qXXP5Y8$eoV-Zd$iSOv>wB2-}I6 zPo)ZoQ4Pn?H@o02IA|@qG=}M7Wl1~NigDQIDsI(Uv6&7QA@tapg$}n9!Wr7zB?fm_ zV&l|9V+KPpaF7gkhjUT29TEr@Ut)0sTMXc4{`K{KKO6w$wbbsfZ(7lW5m)-Cb=Z2$ z0ZD)mJO%dyv}qLxhlxwLlLB63C3ruJRaS@z9>zph0tEVezQfx`H;S!gz`bW*0ye0V z;~MIEZRu5|02JCq7ybAKJuVdu0ePgN+J~PqSNt57tP+W{eSnrxzYvTUU&cPhtZiyp z(_#+-uRwKKFfD6cmr6Xd1{@yekv8|LN7z!u-bT>fma%DtO}@EtC0ub99h?dX zpM~p1J#RLoP7nNay;#BuvGS|MPt;MQ; zw1kv)b{<;LwyuyfMvlAG>L$A^2zvVbm+&nI1(feo0&I(ERvHp(c1-R%PmQW2!mvhg zsxl?D%9I$M_BaO7gqZ=%l8((T>pb8~oVG!b3_1-#hiqYhuen}^XFxBeLa0N>pVqxJ ze}hOP*A~bb*czy(44mxiQ?Xl9Hi{O2m~$~H}fL4}~AM#BzVwj2zpJ3Z`WzWs}iy`!a|LjX;^0heIU zMo}1T?L#nCbaEDsNCPm7PPi+?> zmVMJ&xo89<2uD%9!O4Wfj+hk&kde7CzyN-?S*bVLi(3V^Qp4-;e4rP@^cjCa1%LaH*g%EYJFbgfyi94nN7)5Cuxv@QaAk#YdEq6(o zHC9s9P}kz`Xar%b*rS6M%fCgln*zOV;Clcx|)D>?iYwF}rB}3}C3WQ^_^B ztbex~D*GdMBf}6t+|YR962p4P zo09hY9UKvsT)&a_Q>iG^>D%nw9D3LvAt18e&K@ za_s?+=#8I_z35IwL!!ClWcq%omO0T*%zjzYo+O;$wX96So|+VHF;ybeUA8?P5NPzC zhRQinnR0=T&hMR2l4){Js3jt2Zn}&Ug56=deVrHpIpKj}&_H4gg(`%0zXSgwYhbgi z@s8{o6Fzy2T(Wb3;kz?G}j%SZL53S_2DIqGh}q=XQ&@D2S-=qfCl;u{+!z zYM&1yfCJZv#Ola3q_`Jb2N`50pxQN8OK=fP4_<)QB9J`oCtE~3HSGgciiInpAca_c zDMZm9d<~#SgSLthN#-pTdRZ;rD&|y4Qc%j-p;U@k-Qd20%3gWS^2HRU0+vrH?rukR z&+RbaII>mDiq2mSv^^#FqkUf!>7xK{-2tc4;Q6E=Va#L7z9^ z`)xL=<-ZuBh(-ZmHgt%}BVL!6FIlo<^}h!EH0PUURjZZ94j$JUx+ ze99a~!4ysw3mp1|Cs||qmhBdX#MlfDAHL7upnI#VCk^s^$73s0o+69YUPnjeenWUv zn|26krL>7~F&GnfRU#V|sSKta1c<-prWV9yKyOqc^F@hwB;$vt!79HwXf&Y`OSot{ z_&TC)bK3`6EyV`vyN%G`ANw4jX$M|+c&_;3?pS#77S@yOor23!4Fyt`s?Todh@#R0 zSihkTfR~Su85XkG9(}@523o`Fznvp=2#USK<+${m)?uBU;7k$bV3l71kBqWEy2T~d zI#F%1y|B#z!xUHppr*>26WIvshpJn7w=|hcXri}ed7af!^-T3N*oUIhh{8+z$fCNV z`V3nZnOoIITg!lj0^zZXswcSgo*RUR$|mCiz#)8BQSXC3TrkGm4{WDf8>wxdNYj{` zkf*oC$0BTv!N@H}Sq+f#j#Xz$czzRzjWxE|6V?d|Krn0y>(>Z{^e1nnZ5ttTJ#n4r z-`CXy9;u2lu7isF_OFYCL6%_z%U7(eU_D#G6tOf_#x0aXP1lR)p6kVc(S5ZsWZ#(E znY(FTvd|bW0CjrnZ7{Zl6EFmuzzUNaon3~d^C8TPyyX(|G{Jmg^Ho%RJx~!~U@4NV z2C0_v-Bw1~zi>#~N{yPY7bOXHqg5Ky4+?FcNgwWmeoG#$*g)p=5p}Ic~?a;T{IB``}R93qzhc8?kR5 z7uhUy3yi!`G_pD4JvWKpWlWKmJ}(wr&o%NkQsNb0IcEgEce5Y|efR*vC|M&1rn8Ji zY8mu&x0uIPp@?7j5$qD$ZWBAk1RL0i21xr(%#I4Nw$VQQ>~J!+Y>4)J=p5*T){5?% zhUN3(4SE`4PsZIYGFf<2db=2m1~0l@{2`hrm912Hp~vkM{egIv@UTdABE~S~jx%6S z4c~l9*aHSQ{t2O{^^zkYB;(-0Y<8A6+&UAOs^F0W-)b!@)!km1X=_7N=0cg6m!MsM z6?eX}Rbc_k6nw5goCuYVT!+01TY^YeR(A+aeMQNv&%}SMToy^f`v|8pYz=2$rfk=l z>StGCm?r>(mXYU7ZW!ppHA=puRwjgSwt%QW)O2kWNyc8WNOw`(C3s%GZVoO_+=u@i<(Qh0gXJ$2nk zlu8r&4~~M{#1Nt87g|@Bk_x~~E-NkEI@unzt$r|JyS?C}WLSpJ=fT?T>FwfbY1cEW zRt*n~h%F5zbF!EC5wSRbO{sv}6zkfx2Th>a<%O|R{Tg6K80z;sLH3=^Am@>-& zj80qv06oZdV(8a*K-vux@EFvr_;zebdS-*j$(3XcqztA)5sMOH>8TiNAmku*5iIiT z9U?n)ynhrd_|c(6X)KMdDv=Wsv#FEUBP)7Ng@7cM-)afKHtqlytl_4l|!;K z)m-^~%Yp0xxB2G6BBn6ac0?mPi|~&Q{Yy)mVM>o8MJGdthBZh=wg>Ka*oJqN`>W57)w1?{GkyvKAg>3Av91lYtt5A^khC)g7!v@4glCA)Z1JqKfG%7(1 z9=Y~;9pb?9s(MUs09ASr9E;Tnd3ErvTqubeSeXIFlmUer5l*j_v3r6hV%!HzV&eO5 zcsA`6*9m9}_*{`L!tywHYNwcT{?n+o73UG7cgkE_w~LIJ{MO~OSy#i$j|TLJ8!&Qw z-qF@?V{$n}4E?c3JjZv^eu6@&{4Oy-Dzb93;hZi{hSpuczK6}@fM(O zO5m}3#At^u_cI+U(2FVkKCzI|d^73DeS(7qnI4tY{t!<8x9<~f?hi*Zf9ig5wZd@OKiYyaSFY4?!k#5Yh1KPR4RY{KkO0xaUAur+k^B(E#*8Y z&dKynUhU`h0Bh1*zJWCliKiS2i3^!nK_MtJ60ctAe>h!}4> zjXN4C_K14`PD|y39xIdEa?Y)nf?UJFS!xT&p?7b9zJ@QQp8Ii~-TzII$1_1N6C8&x zqCa4Ip^jmNAl8V*2q7XR0;$vcH;Zv}bQ|)?i{j&N;t~+wb;iX)P#w%CuL@ac#oKN{ z7d!W3*Ymyx{p!HIxVl=O$H}~M3zq7fTOfjJ*o%=^Ha9AfD!drvQ+q{% zE@#b-i_T8%&3>5U*ItKC9{!pT(H7A-Vo9h|1`5#V|%8IOxU(4IBW zF8ALn+&bu+vhkGjIK*#PJOQCm!(NyVeoz46UEC8w%)=roYP9Jv#?+y+lLHxboT5Q=>nD?u+OHn{bGXyM(6uQ zq54R(-n_bBjE5=Z`v=hcoCD$tE}^845}rCB=B9&}VyJuN_$d9z*a@SM=3flU&W*52 z5y<_{om*sn_5E6DtwOKu7crCM%jaf=83@u>RPr9K`| zAG_7ZW9s7}ZfiCUlf;AK+f_^!AllD*>6ORr4~I12S0xRyOLhv?!(cjC8%~4wlq5pl zIVh52Os-_11W$$!cnS@uaqEG&Lt>1CHg;3|FJQJIt#e?6Gs^ahJwV^_=?Dl}44=)3 ze%+VYi=qzP@7Fstc^{Nr4FjR`qdjy2g6x-Bvrho2@mdK#9ri8OJ^IL7jfXxSlY4; z5FL>QO83%apI+!%WH}H|{fYjO3teZGkPLy9nkWOx&g`7YXs@uZY+9>~Z`!{OXO*Qt z)w9_Gf?ei38e7Oy+duTOz|B9?XE}PRqC{HIaiUV9yr_|(ZQpd{%*e3#(z(0!{OAUS{k0HJ=-%7h z85+N%Nt>{0FpoN|_?2E{&7-amO&(aRCDQ%>(Cf+fHXhZ|zuwlzxu=>PDx}04&{i35 zY2isdF++)gFh{`IV&2SNQR5DK^6A!-`f@{Aa4(=^J77MdoznBuaqe6DgzcQAcRE%r zRg47=4PUVzoYX~SpJ`y+h`R+eC*lN{1xuufPQScB!X8oOzX6n4Iz~4P_CUi?wC1tlh}cQ<{UvE3=B0nbAj|T=!~A5h{}8+xEV0_+;UP+Df`j^3(Eu@+U(z>mQV5! z23ST~`0P$SGt3|+D;~D35+s-DD6pn<;!!NkB|z@R!e}_7zpR|aEKG+uI#LAyG+;j& zhPlAO-($zU;0JlT`wTj^Wf^>-8g(PnghsM(sA}@p zs*2Y#Ydw(4o&&ztYYnKp`#0$8$g`*%E?hZ$HBF`a?t#n3nNe_ENO(uTQeHD@p$v14 zeQ{9YL(tDZ=GSAV1usp$O@i$5SG|}RDy@K?e+Q#yRUJ#if1}TlE*gvq=41fP@|{}t zj+_6Qz&B~qxGyR^{4NX*BGxGvl<*dWkPO(Mv;CxpeDCOac{O!)Q)gE$T*$%I3vk4P zW`&^3l#{Ij8hIhLHtBiX%s3TyqK$E>KI+hb9TfC;MNZZsaIh!o4+}klGDm|bS)EO) z>_QHd1*>Ge-)Jc%v2-hWUT+NmGkuMd26bA+P8cR1EP)RcbDhYDztU?x*D(D_6{0_8 z)GH@55dW?Yv*_%9K!Q^KJ8S`Pap|=Fclz{-VjBZ3V$)jsfJo^IM;25A%A^R;et)lD z0j(2G7tj%O>>LEHwSkV`>#sQKVRY06t9S|5)8<`)I~THH;6kuLJ4|WE=`p z0ikTyq;aIWSxv)9wjGq|ilsY_jN4o)L%R;C=d&FMQ>O1FBFo}pwtm+059tZYI^oS{ zaHiy)0uwXzBOIIJAXo*KIOKlusaRT|LhU5v)s~MQjj%?{de=kNLu1|prqzCySxTXy z_kEm^J@4t0hUSNjlsVaEWS8J8sRW{f{{~lm>tSrbx8KtnRY`fjaH!j+;g9+#U5+qS zu7I8X!9VJ8INuKcQ9rCpm3?62pY)qp60d&%)D;W=j2`$vZ?6SQiTD8!hcK4~I!P(! zEkzWj0Fn@M394I5T{JCiuru=4<5+FpFpWtpe}e>OC=BUU5uF$d>mMnojQdcJPsSpM ztc)B(aBgyvfgw4)tWfQpxRcHeaAqTT^XH58;u)c1q^u64l^)-(R*OT5#ZK8j4tW@hKFLxJiJwq+%Vw(R?M|QuUpjBnI zfWYF~)e=one@@m(QL7=S(wEaVbgZb!BdcO*U-daCZ1>ZtI zQ~an3{V`4b7%tyTS3fwC7&Z#0#S<1&rAUh)o>w~hA^41*b9z>E=(z4WroiGP%}dS zG=UZ73LxHA{6z>1hjlXtWhu0_tQBi1 zzimaQGS(|aKjcC>?}7jg?d2S|DmPP z-bS3HK#q)?VuT)_NzH^sYT5c*g~6%xx2q3{Opny7%3O4AgfrV^ zHHG&47JfGS{tiGbd0UqJLoWmpR3a9ViRkDDO*2y&@0$Rj@(pdPf;dXXD6&|TUAY#} zMKG^oVeLVdVayP>78~YI&w26#>;I`waO8GQV~}JRfvkiW8Uk{EePKZ!K-TfC6kkA3 zpV*+K=LJih?Cszma1P^~k_43BXucP6yTAQQztOZxQj8Gp!$lTnE%~5F{tZfSz(=6_ z&-@#Ie)R`WVp3BGYwee8FP-}Xwli$d`_pTmfDnH69=K|K{BJ!!-=+e2UP4)}UNy-} zckq53bRg+9YUvLsfxpd%w-!71^*jF^Ou6eowtW6mL?7Ng(W&cd%$HRl=kbTZDgNXm zsEL|?>5iuNGWCR>BDc;`Km?KcHx?0lvQhUP@R?5d6rpn}KGo;b|J(@S42uT>MW5+& z9JJC@PvfCkCF|d7UwWJ|5|7~z@+rHzDO~QnSypUp&b9pe8 zmZLAx3-aFg3})1D_qd3JEZ(ayTM0fL9CYCd4sBT&)*0;G4p`$Lx-x?yjFu&h?W-iv zflce{zEVM-J?klx1;KdO?i9Bja-;rWkO2)Io9!Le;9on82L=+q{5I*#fG@aj;qEV; z@njJLB8xz;%GJRkld?`MCkIE81lgWBY@X%8v69a>>A(+Ls;j}oG3>=)7H2fItzp+5 zxc0ZRNCVD3GpEcMHf_q(s+m*S9k<0txn9?RlyD~86kX>o20Fm{_W|7e`y-xMqrRPC z9uNZ4=T2V4jDDxDy$SJUTN|KTtixNZk5F?*=BOf*pn$^2XPm8|&EHZ$zE>O>PDlXg z>|RF}{1Y9!wCu@!^taRYL<)9|-B*wl%44`K*(W=oYR-Pc2@C-sAVy0vT#3GR_=ZC+ z#K0`8vK{$ZxIM$95K4^Ck_Z&A2SJ8mGAgJ&Axay9=0&PaBRj;M@R0YAm$fM++nGnJZpZk$*S- z8k7?}NoUK*Zh;T0#dJr1>>Ei2K%%d{!DB#u8BcZn!JNcgq0a<|aoYlM`Ht5wiUzcV z7Bi4(5)gk7>OmbV3n<3r&*X${xkgvb7v=q+l{YI`sOo`No61awjyW?@@+E$P7lKx{ z<%1tPilzIX&@)rPcQ?XsOqsax-el&HdH+0*St81zZL>gka_E5^i%hbbBTL52s&aOe z|1|@?*JG|9 zc*E8p0BFGk96O!<`baqS8W89OeZK*Lj_@4y97qDjzV;m}OB}^Tma`J8cY(vpy73aP zIOizX%Z6tiF{(^uUfIzr@95$3-O3Km$_XPgj~O-6%-!JI&?|fS=;34db!GwHauG6l zNEu2!OxqSAN_8z=ajBRYXVGX%fMe0=8kK$9;|~1nQt>Q&orim3hhw}khbDEQ6s1)* zkQdle=@Wr1glSS!Q$&@e&Ot&Y4a{6DcEQCIuW0@p=g0KnmEw{2L)C|8Q&vfx;pTRU5`*RQAYO3K>2z$f~;B5o;C}(9HVNbU4h7A zT~b%P@+N(WrC8+$Q01MyNgu2_aQ0@<=QrOB*7S;-buU)ZhMV=v?N=@Kx52dUhfvl& zc#HlmIOs!xH;CGA)ng;dJ@YE~=JeZu2=t>{^*T7=Gb{j*a^YfsiG=y5x|J>$UHv4~ z=K7%pZ4~M{Ng(zhgHKIusx9SU2!8g_GJi3VR_=8N99!; z)OP)Io4!{dE|(AC-*<1vQg~^*ex!u=y?xWH>uBoov&&`Ic)7dn7t9S^-qA$c+V#|n zaR$KI6FAqMQ~X`){QlMj{)P^pw2F%G(r3Bk`I458r_a`48jrVOz~8(>zn6P=^$xvs zu;K@O%@J(?1fV36<^W6)6cVw+IlZ<6AvhQazb8-VJvTWgQpGAU@FLR=1l40ev0LN{ zU_1Krx4aYvn$yJfYH3#&x{~NmOW_Rm>OP3B=RU6+)2wFko@9$T8z4AD(aD@jnRmkZ zYhssI55!&=ujw8B)e;q+&TMoTBfp?+=WRDT1Y}a{AsA=Fsrt8}1p@#BHWR@7;B7xF z5JP&k!(L3acj*i?E^!@mH-nj5x=UY5tsMAg-d1P_4sO+rK~%52VwNYxoOzLy34R0BjJ_L&2%9t2(GUd?Hhrx-;76B-9o+MSwa`~L<#sUTnXA)?ic7KPI zmcUq7k#Ea=9n!W0qRT?QJWLyUY3dtXc_={P6%=CO6=K6g<{suPzo>{!fVtGtl1ag{ zK}rHtT?j`E8hcP=W;#~{tNDr_L0SL7!@A*;M0#h_)s)!d%t*Hz2=4`;P=Zv+$2-5u zwD%D`);8|Rrk^|lA>pZMKrmhWO&qc2EYsn=I9#`W6My7rx*pZz?E8cg+Yw@S?4$Zd zm2t?o^rY~Ni@${>FEhUPEj`)Jh=E2V>%Cz4Wra`d4bL}GWodgXJj(!@djQPIqmMyZ zDf10`TsPd-a$G^@ZV+h_%X;#2(7j&yxV}l_S)pG&uFvsImLmhz#cJ}s?8z*%&ILYW zc!dRo&s44$E_?q-_cQM9(y47__Q|n9lOEjoi7V2&R5Cl*wm<;QdHXK z0scirpC?O5(c7;xa%WiK6TqB+3-ooVSX8X7g)p*-Q3f`6*R(UBPMH25M}fEQ5uAyh0tEF>q8&pGJaHMsk>IW*5jGQU3rqE?m& zLz1xTgUjTN&#BqSBr)2^mJfZ4j?q>Vik)dL z>lyvI1JF&Tg)-D`(w|<+KB4(K>vp6VzJ|37k`csl;%mIAb0vqm?nj%R(4W+J9R-H% z(-$~sLJMxy=l1I^`H*hPRvDz^yxGK;X^d}?8HcCy704np-lS2O$a$&Y;H2-8IM)i z83wP2vLY`|nley!_Z&h?UONPJH~zpp>D&6sdUztW_-C@<90P)STAJWE$K{_yB*#@aY2XIf|wg#cj4h?=~-`0oGb)V=A zx14%0axGekin?G(+Gz7Re7T1=2p7Go{yf`>w%#g=Ia-};gP&pFdEmS_vzyuw(1hpL5a^} z_N)UagNmOAtvva8eUjVe%W3oTdI5d*ZGDPG7%)~#pyo;aVu$s_ajm|EC4_NQ+KweM z`n&oKN!GQ&(TmwQxv*%*v5PV(_j~#WRyGOxGW2QvbPyt%x}VYG!Vk&Rz{Ahzzje^V z&tnBJGhmYe=9O-d4ICLIIf5AEJC0Vr3-}^$aa5KYuDOj&=+2?IwYVdm`tG8$QY7eD;ZrfqKSV$xsf6oy;M=IesZ`wrGHkMVH zETe^lP3K&=^A9#)A)LAvPV>b_q4}%3#_dYLRGBc_sy6x{58NbE&RM+{86?8?%Bo(c zr{{znJH5^)=|peys>$%QP^U$Zlv1=}7&{EeJN-?X{C(XMcR!t2ogk zFX&T}@^Kr=xt(HBjdUyYoq-$lhG}f1@3wY zh8)3%0X%d^*}r9;I7+@%A5F(^fxX^m|D(f~6Gj3gOPu^;eGItebwAc8hCDs}V||AG zbJ_VBl9$)2cOuPCcBXf$8bF#_1=z*uwI%4Kr z^h%F&01ktUZc8_ZBxp8k-8=F^eYiIl+X(aOu#)A6ndPb)6|XQ#K7zSc%Rs(cH~hW{nc*g$i-fzOJ6a&uWa6j=EjM4m3wO(~yz|Ad+uc+;8mgTtbmQ(baI6hO$e{)m_v%XU_xtc?ml9h1+Pp6dsT>MU67 z@o8eqzo67(D^?shHA@127%Vn%%2kCTJI%W1)pmeCNn1xJJQ*28IB>8~Z1&KB%k;!- zoDa&E*(A82u4({5V+tk^cNLz&m!K_gj1X^_s-fXC#SOIh3P7jFc{C%&oH^M9Ony{; zVA3oBAnM*B7!oLJY?O=oCyJg6!{B^6QB)Z)9q9yI7=4;31|$SQPG%ySu6kOKW+n+b zXQNRCn59c8E2|tPpKAH_275U7{i!{N! zNoK++pv>D^g3ke(BavLxbF0|Iu%~v(R&7XTKT8R3fhtF~BRTj68A4v924BdA1Yc!# zE9c8ajC(O%%EEbkCah?jXveAo)?$}`yg8*4mjlvz5@XN9;}0$vVJj~Lx#z2v<+cl> zMM>gteC@(T3+k#XtLhfaoN@6YpyXcaNTX57qA6sjgXh!em1J=pJ$E}Wt@(fsG^dDM zM|Wqbd6twf3Vgn^bGw!Qot?Wwiv23X@z{l=@BUveF|@#kg1y-8 z9XodH@bZ$2#*~zom5laszpI+oUc!XYRD|jVVs*$r`PK*S+*{d<4Gui;rifAD@_hT7czwy@JEB`yDx0Zgw9sz_mC1VtiXi(tU2dM z9@x%w&S~V8vB3);^Ir3WhpiEVZXs+mWNuKB`n?0odEou)eQe?gUFZ&H{~55nkePr< zEkAo_8XlSnbm{6fzGgs2TD2*`9Y+Js;jl3py|_;#59_qAN;91$(`Qo;S&5ol1!aBoYtsT zz?TMAj1cJnKQ|)G2;|+2t6)WdIl51zM?V4~f z(EG^pFLV&3?_6oR@Wg~JCd%ClEmB>&$o&7u)rcc6;&SAZk*`MwOqlB(DgW{1SROnN z!%nXYx*E5=^A*n03oJ3%nlHZ^VM_Ra<7#~1ojbSm{y)6;Bl+aH^E~gPhHDIPUGX2^@Bgp8 z-hY=aQZMvor^F1Ab4BPG+`%^nn5y$$=xkfcD#Q!B&T**wmi~9wIfPo5nRN&6%3gO{ zdmQez_tM2Ed9!!_2Y1`~>bZbB&X(`dReNE?E^qvYfb}p0H@-D~!9GBC)cc{j{=b$X zCjFne{@=<#Sa2qO{;ypB0bwMYa~Zn$m;lJ8<8L|i_~k+Jn4RG0>~ru|9o^v=lpaZY zn1C^s%^9@1SwX5Qv~;<&i>2PTpEcm;dEY-+LgYGE1>{);^m?rhVQ@{f`md1djms2C zJI+;Pc3X#YIFEn6i@NXgYcJ0Uv>d$ z%_6^me)$hd+qrF|9W`8Dv3>FLVeI@Q=APw0ChQQa=l>8tKc*KE(HHq)5esD(lo~YX z7ZrxL7gnBK+{n;X)EBv;sFm*jP8{)HkSlWHhID&Jf5io=l8w5c)L)u-)buY+(r1E; ztkDgXLX;~sY;#TGW2z}?4HZL_g-R6Y><&-=^8Bv0c9!T`86kFtDh|KTE4|=sWt)KL-TRXz4DFhmG2_J3)wPn zu2PAcduP3XmV%nb96oGh^hKj_#GSoO@|!LuUI%8$!FABP?$skTGJOG~w_ULtd_uC%ax;q9{;jtt>1GR;iAjsw-ojNt3A zZLZ!948E1k3~u0{1EOML|JY9~4$)}y?HOq8FK&wn0jUKFvc-+P9=??$_J=-%^MV$5 z(hE%6kTRu~d~u%0pHkb@S|@>C3K>6%?Ro${ZY$bnPn*67x|J}!d&qAD=eZamH&5d} zJGxODNSkIk+<~ZpVwi(w4Tno0JDv3JBQjIaUgR~;fOrOY4zV#HxB_?!dgrokUK~BJ zs}E6@$xwK@EP+bza}2aX>LvH@BOZ`dHTy^;_OeM(b@$G8-nyehim)n=30ytI5rfF; zufo9i^E#MohWWN#4&XsCpPm>cuBF{eoLWYO@@0!uuMMZ6qs2-}sDc~#d!xnJOx6-x zF^1Xo+}F{#rUl?1olF^K(V8(x{hKkOjt*A>ME!fmoN0kO#$r3B=Y~a(uI^~7hxxb_ zHd@A}%&l^zbek`f;TLePS~;vc0w{K@fz_CDa5s~1GXVX9x>Rr^a zfwM5Ek~dE##Aymw500^H$C++djmQIVly%k7ghP4~-9Jt|O^3&e!kGFNX{MBqPXuv= ze^^v*EnPkyQl8E4Ix>9KK4~fg*J^uAfR$yLE`okGg^^#ZUxX8JI|_nRgjB+Z7DW$? zaiwN*$KX=Ukl5k+M*8$!hqs$shYPqyDKjm!ZhMI3z{8J~y*3syT*=h7mKMw%+XNP{ zUxl5ruN3g;Z)uPoGH}x~Q>tgCS(lgob)}Y+#rWZBh03=aG75x*boVGCZGyNcmN_k} zsVWXrVy~q1{qbVBj?D1ZSiK@DS)g+Kq7#z=zbjV>;=^Ym0*B`Ap4kdF2IehQcVJ)E z#-SM-*aKaS`?#?2>|EKl2DtSq8mByN;Q0dNGp`Kw;q^EBc_B*(GsK65qMp}!J8Tv# zxQXSk{l>at2Y0N-fuKGR+|V47Jg>4F44)$g-9VI(cM;8c??mheV8F%(Zk`~V4uh>M zF|a-FI{O9i?$Ic@$qchNdZ%ewnYMYE28AC~BuR zV>?+Nl>3IBo7w9n9>`?0y4aD~9eiyU(WJh?pcj!pJaBodfD;mAtKJ1|&3s@??*JrE zCrm^ptT4ZocE~psjU2|h6tf9)DA;S|50DK;0U;n~YZc)t z=XHngW_Qhj7&or!(mB<2v)RP0u5!VG$}7B^ zf_cohQ|HZ@Q(0%mRHPJ!uT9wJ(34cnC6kzBmlm9b*(YT;buxBj{N$CUC99=3U@laj~4{&O!-(0^1DQ zu6t4_Yb|^vqLa0pFB?-hwgGMbLq9xyB-U&63O(M53b5{-4Ed)?FgfLXxb>fo^dulD z!nF>5RLVm%Ea`5;Gl0Wi>PehP!Ldkm!mw1!geQx({nOz}m1Ttr{n<`Fv+_7@>tdoK@ zE2)+pxw&DAO_eL$f-K7&_wCWZdSn7f1D@sUGce`ra-ao6YaS6Z?bdhEAV* zv?8{@9u}>o@~7`1BPY-ltsRpV=;g86Ks*i9#A?gsgT&47$^-0@PVdBNyXYJH;Q)8@ zE-fLDoS?Pqu(KYLt}P7wJXKqS0MP;b$c##mZYwkAE~=YTxfnLnwSoDWTAG8lw7X*S zCaB|c6Z`mW!ia8?o}ioL6|#wU&Lql>#r^cb<7n`ye%e6GTKmHR4iU)fuZ@(=Vz2=^ z{!Pu3XT^Y*H=R~X(7x|L$bna#Lh04-i<^IB$ex2&ZkbzoqU{{XzhTE}- zS_-w_eB~CNYjNh%?!lP1H;RHSOcF#j=IWCiA3q|JyD?Et-Rs;8Z!wdob=JLm(DPu>O7W=vaLcj?^um(GJ- zRvoyBnR91wqY7)5)^^t7-;$w|i!6g-RmxkVwX1DFTe@b9W@K2j9ROn)JPDA{pfEuw z(CuSj>3gWyD6%kbU{@z0l*s$OGX=vU{g;ZyYD;*$2T}4kZ9%Fvz!J{LVr8j$oR*m$ zwnj`R7>-o3dz@Ah3xN$RJkfeyee}XO%-=E(j$V1F$ie^>xu&BN#DniOM_RT@&WN7s zC7h?!YbMeN0Zmff_9L4AFZk8Jo(Z_*iWOKB%ktsgD8_3U0H(TcJaCB+-$YZse-B=) zF<_&h=f`W&x~znJS@5kmwH#0h1GD}g?%q8v%In%2|I9qk!!RQXhysF_LD2ytFvA_Z z4#QwfRTMO70tShq5)~BCXp9|`UXtEGYh|A_4JIvVn>La}+fY((Iqf;UB_?T`rft$j zPIG!%PFvH{rcKkddB1D#wVxRf6LZe*_j%9f^$+J^J^R_$wbxpE?RA0cEaxk63-4mA zWBo$2MpcvT^yZ6ySqS3LApW+{%*cX2g%9$rjtwM3C^i%U3Jbry0A=ubiqemvnoM!W zA~QRtnx_|;b4@A}E#h3idTgo1FTv?A=`7q5A80L^o<=u-0eI0@3b6?8~>$n@?R$o0{;(i{CtD9q4b?EVuJIpu=dvxR^_DRCS*yvMFn4cS6 z{w{I&28ygw2j^gvPZbTfLvncFv&MY!Rx0NGa2i5EJ~LoWjrpwkQ?8j$JZd6O(c61H zo-BQ`mEluxeo~xMJ7M7;AP91#aF*C&wf7@(bBOW_|x!UnlXkon*5JUadZy})M zlzyC?{B35QDEU{TXwbdNH6_YWJh2HdFu%)ENT87c6}BNk8(d_u(?sC3k&#i?j-5v~ z_i$VFF6yAa@;Ax9gyWDg9WIY5kH!j$HyJ%bAUP1yvUkF~8(@+39cVlKTMbiO_Y>H5qbqy<9WI3RP3iws^oW2ABa#|UH>=DQ~KegHz& zoR6FDZ;_`l5;*3AC`ppkylGPll9fn~ASn+K5H*|LoR<8p`QE&|{gihL>J&sRp@T7% z&|3UkS}-H6IM`7L07b3xk3P6*3i56ezr8-Va(%dIb?xe~IP@tib!E`2BGBqgVWjZ@ z-I9bYreQQ9?*eoOWLyVH3K!!xw!@p(T9PZ9X^U;9F1&XAin?$$IAS5YlE#d8U36SK zoA*;K^g~oxttt0RH%VibP07(O-qF5ivug6z*d}Y&tXomLI=B)|7QbVYYMMKv)LYI& zr#;1+TRRpPK!bG75MWakD^On?85imHw&M;|Fg&ZvMkbjNf(i#!n@Rj0&emd}Eurc`@a#l-f0f8Al2r ztZO9}l)}j2QNj4{ygYi)rRbTDNgr=TlSG-NtK#72ZZ$m)(Xbm-wc?jhP9lM=B@XU3 z-IHTah?GxoXRf$ww~2r#Bq$;I%REt#hIOjgUoe&* zz4#|n+}vh};eF#3A0$od7`9Z+Mu%G~jnDb7q!w77VjGQ^OasT#ip zSmWMh&ZdP%I@+lM2P@>fXoG4S^K#7?~@y12pr;A_j25&@;wiG*iA5}A9#ppJvV>;`rOhzHQ)3lS4zDj-vMB?b< zbOJzhM=V$~QX?W2i?_r44WXT>(&5O60%k2^~ z_nGG%bmmJEAG6|NTKTGH=Fz169u+DM$77c`@fiNQ?sjvXxH%Ql#Y4B7IZh}Q7T<;t zD!;njyvvw7=459R{{ZXy)bTCy0dtx@5Q+~#mXRdpa$1@oRz<*IM^VsZ(Z0`>C=N$( zv^w_@Xc^saKp*s8Xz3HPMpIC1Io!@)kzP&`e?NkAi0@8w`r!II%?akak?Xf-BK^$a z51Stm$LCnC39X%V>Uv{yj_}`SHi+(zm|_%R{KtQnCJuro{=^|{!E-Qc8HuEFHgPjF z!OF%h5Xi=@kY_(rZoW^_E%D20b7_uzgDt3jNf`-+VcqrNx&|M8qatVHs5`hdY<|gk z8OzALmZW`|3FV0uX0k>i@v&NPw?6>_!eCuz{xNzYSS?U6X+k~4TUHEA?4Dyzji=zU z=trY?e5Lte(d{$b;?3)=v;>NZr`4Zg%@;uqk!fVU*tiP5|Bf52DFJku$~0uRk}tg- zGdD-`#a4MjMQnO_{()c8Arxuv2fwh&yoY;!d##xi+w(mxPJ1E})_~)lx*OzY*H&Z} zJM?w*YRwvKtefkdv%~|_KJ0YVPq!72ZbcQFT1PGG~Dm8DO*mcg8ZX(QlqbO@I zpAnbVArZ@jMuhZ6{*9Qc-!_QGu{Fp$T^T9*!kdWIQQe3U$)o$|$r}7YqiHxSiZY!g zB368vCMj-}l4|jOoH#bzYz`-9w|3S_K@~G3m9R=3MOr$sx(QpZ72H@na4pbSGTF{1 z6X`<17|MwtLipp92y#9_I2Ysgj1rc$LXrhLRmTze5*eggz1JX1dGp^83j4VS+!+*W zXDMP=t=NKVJ|A5YLT$a31!u}~A)PQec3TTf&G(}^6lmUpU>)Asd3m$Ftzy zwOG}+|AKSv@8_C{CM}>yegu=hjCf1hW6(X3>fMD=wzaqK5>KskWIA%h@LY4cfq54f z=Ry^)z-}20H%m4$6J;SQqrN*Vw(8SW@lgdfRPoqzaP!x~)>Lt!2|fPB%ZP_0LuVZR7V=bi?t{dp z1+Xu~Def%#t_5|G@)V@3ERob~=5L_2RHrBv*+!ibD(!u(R$Q*R*IR=#Obq@YQ*T!b z7M;{bXhNOFAl@Jh;4LkP-PI;G{??jOfF{(ZvB)s`TZpKmKAKv(0~gPPhzNT>Rw|HP zlmdjjMkYZ7;*gZ9#1TrmBa_~KW|NsxWG4dQ+ORN}RmUg;N-bMd;#XAa?EVcBOI)1c zoIgtH+$KJHi&+9O@$4;TG&diUaTkr5*FGD!v)mS-<*yt7~sqP5OT+w24_iHg}}y zFjXi)*S_mGYL#d{ff{d4g}UI;VVo51{V{YPxD`ri8Q+Gf2-Fd5u?uEpdElwhc%~{I zsK1vIly~y~sT5jmnn9gK(=x zFLHbv@GVns?dXhH6)?U$y#5U(2Xv;`t#&mX+}_ z2Yzba>+gWpw57xDG3Fs^4be#PMQ@{kvB;6dncu|Ue+urtD-riSZ-3e<6T4nAlPB8c zkk@K~Sb7Zk&%X4MS&|S77rVD3WWy)?W@2Tu_hhJ%jRZk@r-K_JDNxHk(x4&)SQFoo zQ{pq(P4U`Yj!dLMa=3aw)eRMNf; zp=+UVy^PEt5^umvn-HZt9b#YsbS%4m5$9Pb&4{91A6>09)UfB3ON|-`F4N!Vj4QB5 zkG@>tqu7SToqjW0yjBk_!1X^ff1akNM$Z|RfShK=-m+l4xSp@TM!VowQH2r1hGek zsAVa+4bct}fCf_a*dB?;H{j*~Ya=e+OIP(FM||-+FS8y?u2P-p#XlT@8djQ({N-K{ ze}5(}Lgmx5*BTxpE4xL!j5Q{SvP_b!_qH_h&X*+UjOfyS)$V$#5rGHc2rivdb_5zqq7SjX*7yZDst1pq7FoouG04)5Hnq}C=pf# zn#P~d703_r#rYOjmU!VdsAk;%4sC5yspWsaWTm8FhX@SozSga6?TC|%JOwz1dT}j7 z@@oNv(^iDPMrVOFyO1NRQw9m<=+}f+Ompd;V|!csZEgAD$P(l(`}r&8^+_~Vm`?7J z1Kp+uip#rd+=Q15tK`2*HGkJdvuKj71a2bLf%xn&Vj-^mC3Yi@uNmSW7tQ_R+b*!i zOJ6iyy)WVb^b!W-)>JZE+`k*b^Me+mzR!LI;d!IB*}6!Bcz%{+YC^28Svc+o*(zRw z7>NG+T^^D33R02%_I)mQfe%JenE7hx4Le#TxuOiOlK19bUNvqA--yeWYk2hV8!jY? z#Hr@&zoC=4(_!-V%&-{}KYI;RpZ;&4uTu^<#6K;>#xY?XK72~81Qzf#~5utx1T4X%C4$i}|w?+Z9%@M}FW*O(OA!1-|;O{Ro@h_cNS* zKl1~Rrz&sBEj!vbZO^f@5jVE6P~mNa6>KB)2Fd~fS0`jCkl)xw8HouofdxcMdVd9b zkGC4k__bNMa768}scUb8QS45;QXj4i_qXry-UfeWZU2hOQMa;8hBh5_#&jN4lZHh+ zzXm22|2C7gUG(+5U)LotJ9w!#!iF{X1rLkCN4po|1m6g7B7al zMdly9li{Fp-}|9Dm#GRac}T|ng)39^{JZ%keV-~m^ALF8Uw@4Me)4^sB9PM05)Xi? z#wqDpJoR5-+VTb#4nB~d#l?MQdheG^&ji})%37yd^zEj-dC#jaTp0BYB{Dxl2$ z;p^si9h0|WgSXlASklmeznEc4&t_6Tde>o9?o9xhN^*kU)h1YOsvtpZc*878p&pUB zObksIzlWA557+n#O3E&I%M4vdOev^T=x7S(+Py71#M)0_CHtO%__9|TyV)&WcpS#( znps3W6t>W@6Z~gWGab)h%a47hMGahZ<0Y!LO?YTfkkE-mLO%ve9@<`;+uIs_T_jpU z1-H3%3(_rsig>B4cW)~>8DP70?Ag@So`h?6s0C4ymK2f926tiTPJ4#LA09<~@Jl{0 z84MwL2j$*oL7jW94j?favQhB7CEJ=2xrADd)uJ_T-aKwKlF)H+8M6M^G9c?qiB`hk zAKx_NV(;zZM8;dt3`hm*)6cow(5YS9x_L7)@E!RD&c0HeMwC$`#yQ>MH*cAhgORt) zHymyns666}WXnn$JoXQBCGu&1ZP+S^eYeYPEfsAOEH_j_O-`#sJbMIcqx+mzaZClT zJ>$xlGkYC)J`GS-8bd6bVN$hq4-!b`i)Z7lndaQi{MmzPhSlz*jWAPh1dZNA_gZ1s z%LnP?1-LhrD&?O{vL=e`x4lST0aaoe9k zUEX&begc|K#2F|il1WdAn9q~qv4!O<6BSDrAF-@SspGEdQn3`yZ{@KEN4Z3D4vG7# zYeifUVv*JPjhDYuUL_v2tk*>c@?8=QjT1}btc>_pMdEQS`Xf-XynS&K%COV0qubi` zR)q{E^%RIF3Aw7pdn-v~8e~s(r&!yAyU<9SH4%&Si8y39Y90J?oOO?58Y)z|;Jn); zPS_QTtZ$+-6W3!wPu7EaNa31vgVVFP|9Wa#Ann*FMO;^0`+#F&@8`k1{gtlxxBx_T zF9{ak7rUl|;-8Pl+I-hx-I}51MCn~|aTR6Eo#e)mCLVQLtH>P6BarW-JWg#O@zhM$ z)XFV8T6c|^NcB2))=B6ZGuODa&G%S-vGwmDnp-@U&oNJY(qpAfSm2$f(Mmk{k~>4} zdd}sVwGu*dgWQz09YI36QD?%C2&BfV{OHd;>T*?%QyLP+s2;?0Qte(UvdTmufowzFO;CjV9b+cRi(D8nL&k-VJ)6ig+67kwHJb}4Pu!@IdEO#) zB0nD;snkmo)vu7Wb5L|AAiv101dz>JA8{uL!(+{m_kS-;uu2oRw9<~$4Rng6TOox* zn)cX2K>Uo^A+*qt2;B9c)<=MZgAQ}Yng*sz9o5*NG7Y9!#g2jZk+_NNS;n7 z-W3-guTfC^Aq@BEWrJ1%qH)4;>S@G9y`dY%%aY13@F1ZDu1S)n>GDz>iX~y<_nGlC z#Q9sC2}s8*HNUv&q@Kf~CVJOq^Q>K8fVU0mP8Lu9)#WxoV#N7}am9Y|7g*;5K*6bL|o;U%{`NJp=9Mk=a@4LDlP8qLI& zgnVR+k&;CxmQFZZk!WiVtv0Hp%@K}^u-1Az7e{3pVwznjXOzkosUX~T3Ps0CBPG(* z#NCrg+u+uV0ECs5${7%d7JW@7YdLg0#Y>t>D2>dt zJ7ACBwl#zcbEp$+Jcm~5hEZ*hV(qHhuyq($YD2VL!nvJXha)6?;t2hJYn|gbJ~482 zPmvnQ;ib-b!h4q^E(wfelux1$?(x1RKsaXMkP%mm)k?4)suljQ(v=lkYibh;=!!#rD5H`opU&0~rcUxc}^U1d? z4{X|Cul6b!#iciJ#-BgSnrq|e6yWG+j6|Qr@D^kG)#B^%XF!=Q-D$b6;)6fDV5Pa> zxg&FM0(H~L@oa+VpJiPqoEsse|9+OW%$d7D-1!t}UXRyG62E;DJO*9P6UV()`qFob zZmsw7a8s9z!!pjI zy!}cXf)M4nQfBGS{$C*wmo7t<3H$ozjdp_r8(?{dcQri3V&xcDhE?kdnwZ+g$XD`M>BJS#zMe5ndJKolrb zCg+J;4C6N>z4dyLS*~$0(#Mc`HJQ!+bbcT29U?0O!B5YB2)8WzGjI&_XF07DkYC87 zO`BV8*|W8YF0FI2Rf@V#d=;ie%TlcPsXpYZpW8VX$3LlemDGBHIFVu%i#_#FMw1)1 z_&}N!H^r9D`K;50NaNy29en$66){DY5eNUnk%)YK&Xl=yet?dN&D@|Fq14bwhPAA@ z4W|)`f+9ym%!~Qg z#8kD<@6VsVv@stSR5?p4{ri^QQQ3gv8?L#gF*}!@n)9{<^J?&S0p#K6ZEyC@(Rb1! zG7EZsc_eDhaZcL06N+=CeunM}Niu0RVfYPAT9ce9q#8vDysE@?;ePhNC!=c_{{adS z`C7jB$q(rC6z#V>zo3XnUg%0O4nk6wc?+K|gQ}rmij}y0+(WGGhClAxJZ}J}qF5hf z9C#zg;-(tp3ygzpYN@uM;#I-G;DEZdsdLv3=w*EcjU7uH+i0FNb`gJutopZfVAyjT z+(}|-s&$`;`Hy!1LQLJy`{ z@0T5+`_Zh}+a0e>%%Zjnmti$f1&O4lL65Y_L?ZAvw^#{I-vZ&-7&mR5zP0eJXrq)p z)HHr8F^*fHQlpcF7ATaIpjM@=pqWM*D=*M$`UnmK+~E^Az+Y;_2?wpZ#9z~(;qfnp z-F`_rG>re%U`~Gbtr+d}fpjaJKHffRA*a+M*TUEz27Dgz%-0Q1?=)+ksF-HWA>KbN zo`yrHCN>l3-%hw^#B}S_G;5Ps_F<&Zgj5hO#h1a_3~Q1@Ot}>&Cfmq0p3Hm5v{v5v ziM~v0iHip-lHZ7Jn%ogun^>~Lkoeu6{0 z`a~{{id3-VNL>7=dTE+ey|pu~MWSb>H9Onh?zC~xZoUo4_vPeD&kdhAKhyg5(QlQc zif`mvH;VEFFo<84=5~wo^Q~47UD+bkNUOT6^@{gjV_i3qfNkw#;S|J1GW6JzN+$G67?R1e}3QX$DL&i^8%KabkuAToMo`BN}8;6DQQ$?E}8wo4v z63t%EG&2Athy7xvc;G3^bRtijd{-FzE?2>dVquvgsWIN7^2z@JHGcjz@$s3kxY`EC zwCh_sZfWmq?LuN>=)Am8b~SI8fr+Tk$uvB~IBMy__VDHH)#hKVN$Q1Y{~Hw~j&k-lxb!(V;+Y_} z{{qS29`%E?e6PS-W)+V5?pkrEGR`A<{ZQgZzw`emzWdz{XivS*ILyHTeC&vMJwmSw zwz(%M%Y&`|?wN-WRoEBNIj5D8rb);h_0FbA_1A`1u55yrK~-)2igh=Vk<#eN6U{$$ zr@p@_y!!eE-G28T<_c>{@Ct3p6WSQ-t#L25b5yt9 zuEnkPeJ`7CCsKa?VIjziydS6Yq`l0Gm*TyZ7=+YXQuIt^9c1wm7#Cre4rq zWr$bGLHckjD6hy9#9Kx1-^F!%tJwHETxAU=L%Y0m0hq|M`{L(`e=I_s6lotfqETB! z98e#CNyY?HGs>INyd~nfCvf3Vu-JM9yZZ6_abcUd+?71Ia0&RD*gYX`mU!+z;a0gT z1D953gVqpA9jvk-b`9dLIQr`QRo3_L>b{UA=&KBQ$<=rr1h=nOgZP!d&q_~|8eFa4 zq$Kf>sn9zLr~*AK{`ruRde;s*3nP&z0q8cKHPvftFa?LEnG**+E3Gd&Op1J<(sMrW z9Av*=ud-%A<>XooPhpymqYwPq6royc^?cQcy48ngCS(j{42KMgtP`<=OZ3-T61JYGcZ5V7Uj z)>)~J;_Zk-fqSdi8x@M*S6jEPX?1Yj`Z_q#!VyINU9&Q{yeSl{536A>`$A9GS|?lLCf{o36K}z^@*z0WtN9U=ISH?5YRF?EW#l6nd|>CZ*Xk zDXj$U@^rbMnu#l|aGSj0MNjm77EIW1eL#5$rlvrRY+ov@rip~;M~Uhuj<&EJ&U9oW zsNi%_+Toa&W;de7LSZn;YgPs^O^BTil@pni8RGLdSShnLrl?=`;=PUXz-kN`{MQ?- zNzU}q@kdB5qW~`G+v1;LQ#?~?x;9AxR9^2v0L?!TSP<~z-@$@CB%JN(+EQLGaUXx| zRQCbxTed*Sewj&Wwt{<+JKIJnDTAXml6}R0PKBl?5$1m;fyJzwu-i7Cf(z)Pn;5(`~oTm~9xC9#zy5oc8V6_+_1{{HoE4MpKiB&Jjn&(hb&eQU}W$-#0fPj}`e=i8(i0 z|12I38_-Q*)}_6Ic>HbmbeMVA=FuYAbj}uunVxvDYc0m{i7h~=Ko6+f^aarFBS22$ z*Akrw-?*mTIQfnN8jHo-?Z%gn4s3FXhj$saqO zL$N_&3r|)c7Cd^`p2%CAUo5`RVk{E*Ta3NvE)v{7u$6MZ{~j0Fn>QN%LFZOuDe9wq zxv0uBPgz|miw~kR6c+%-A8oKPhPbEWE{cnBxLJr4o34z_E#B+M+iB5l?O@#<%hb=U z`E5JIg>Rb~CYfi6r&^4xL_2hwv?N_9a<>>20s$&4SmGGDQ$aRt{RQNI`VQx>Urvnk z+1kz*`<$tYMBnrG_=a?Qlo0Q-n(^6;Fx#x= z(9GEutTA7S^IMGx3HBQ@dHu#t?BhGOIo8)XlS2BU-lP=|PHY5c7D*+@%{ zopU`o*ywv^{)R7fwdt%fF)!a_OtdO-!_Y;eL{momW{RekWBXXEYhYQ2)M_d1tki1x zrOsW~OA{AU0_V;vy{YsDWOT4WVBWVJj-?{8*jght{sv6-^mgN6ONPo47fo!m!|Nfc zw?E^GAADekamE=>7m_WAJ$Q8Iwb{b|11n=9TP7)6Jh6KlOh%f%Z%!QR8sZ$sO(dNh zD5l2O<3bV!kGF`&&jFDae#hmm2X*cAUJJW4L<#jSx|ROS@5)Ea4gxIO+TIQ+A~pzN zOzgrd#`-wYZl&f(+|h%G^|z4y*F9-L&_Q@!#O-L`x|N=hbNcAUiZt>0)sA#BEjij< zkuH83c23Q1hYg>yMU;3O`-iL%h_+WWC&4Jep9Ol6zsnV8QmrCTVx^OEe7#&*xd}!a zBIeM|4lz^uC(W^xkfca8eV{M{N)u_ctKc|3x; zwf0R2Dh111rUU9$RB=5y7??XLl~Sd5_5s#o9Gnei(co***IY6ng5KFaE))Y)mkVxv zyRbpr`IeO`uLDTWcUj-$!i-CvY*sw`0ACayoc-QA$e*eXN@=q`mzmxbJ0I=)A95Wt zQ|z@~r;H!ET5`nWEk>&GZfoq(dtQm$=}>}w^kox4Mi(Fm!J7S6+afOm^N`FwIQCL6v;l-0wivn5LL~fjAX|*e65l+@2?~o79e%A(M zx!76OlRRGA!F*$GA`sZ#cbkbyT=Go))a$O54L0`E4$wP`uv?q_(nuP7_OeJ60+Qwh z3d=W)wwIO%mutq9x0mtqZ=g>L8#%eL8!NU0w5!n%@Q$TQJQImY@vt8ASn-?W8>Yi@ zGH^=?Qalb=79v3sB`T$XZ_M#kV#H{&AbUe(;pqAL>5xX@-vdt6)YR3k_P$T7odv(G z8NYVG_n*vkt=Ac3gknmP6SuP#Q#HE)&&(FOA zBbI}&yFE@o&NU-!9E?(xNq|Y;3_4c1JdUb0?K}2EjkKe2&9+_TFa#PKSGJ}FW|RB( zZ1)D+x?tSDsI_fN`!bmKw|92!+1%Qm-?2wre9<+1CO%&$qvl0by*PBpPC#gW;2x8XwY@|Jxfc`tM_8C$?qsFX?iQn7Zo zG3IMCdsjPxVuQw4NXcMS9uev3F2SVx!g}N(%ANchAAzo790U`|tK!n<$_x$TM712vwpA>_p$O%xm5k)e(a2KDvWO|enOB<#hUrKLW>A#=_ z4kVbL-eXRywqoWZUK;d)$8giM4!RfUIY*9%P0WOGg4;|MwS|TZlA6-mxq|#kNZz$iTWi1P zNn06hNsWyfXlPv5bi=hP)`jcW1VdqxTAN6V6JEVeK3CUd%&Si@h9$3?g zYVVT8NR5tv`j$$CdtB%_sETK?BSwx-1RnBCNrdk_tW8D%(-M z=?3Z(?W>LSEnAT4BwF0on-e%k2C9WxXwOd2m*^jbSbz1`0odEhV3fNQd9AFJ-|-jp zQ<%HZdk}5yT5Y67*^c`Ih6rDZeHt}ALXPPax?WLMzLz&VPdobdN_ ztn%T^7M&#e4sAh`)&$wq8dl!cS5%DKZsdADga~9_B|b&TAErnU!l#I667nZilbek zvzKG|m^x#=P-wnrDK5bkd5DZ9CyNv{AtKQT$_LU4@t|o3*=BCe@o9435$&hE!t>hV zj{F7zCw0Jp(ee~+`*lP%H7lU_GT85)m@ZwRN18&Z_M~n?9k+Cg@-JQQ)m9s^>87f8 zeVbA@ZC)ik*6BQq(*mXeLwbh><}?Jmz-DfNzA49ks;pcWtXm!iGbY=|+zq303~;GP zSBuUwAft%MGf9# z(XFkigJe**?nV?VA5$!*l(Liz)vm5z7hJuLI#+t-!fS$cL9`vNL%E{y`q#+A2(F~i zmZe4GRJEeMsV=-G99$QyS{bH7F##~W%Mg@a?gFH6h#45m2P6;A7$u8zw(QtquL~L# z6efMAmQ>Vdst@lCE71r?bEwxceoG84QrC2dP~rH9ktrSSxX+^b4fpK9S2sB09hIZE z%jL(96_C}dns0~k_af}e{9EWzrLqu-#~f4BytOSmwt^XW7qzu+YVW*lbM$4Qc>hFW zrb`MGo&!gRJEt#*<=QfZ8SvcZ+yuZ?3aE@^-gKvwx{TsWP}&pto)sWIrYa)n2t0Fq zQl}ZQNcs@$5dYF*&51~&S*b+zSu$8*=Y<6V2&q!+pj zPbqzIsGfZbMUYRY52-MXrI2W2*c zst<4S%4HNenV=B}0A%QFy#+DjaC_7aHSeY_Jj<|$Et{{RmD-w`dT?IlR8Jk9K?+8` z`P+>1AH`#q6?Y=5*Jg42tTlDH3`B=_+#Aw7?rOi%hUQU)-nXtU72X*O!x1<=)qYL+jPKZftGK>sly-0%>Zly0+`kAMohV`^Hwb z5O3(5`d+%Wx;ADm-K*PqxfRJF0y2pyg?{n;&A2W=&X=@e>}>l0WvdDFsX>Qe(&roO zM56A*Y;3DJb#kH@e2>>*pS@ZDjahlvm|I3Q#~wx$jgLKjX~?L<7gavdFV#eFvzgJe0L`2aG=}V|OO2!LQa@8}JSrk)9SID<*i^c9FXNs8J zV5CgS8&&h*@CN4uhj{;L%x|Z|xV3&;hhoRE|K}m77aifDaY3xcmQAf&S~o>Et_q<- zUS{h_{=f#3|H)lMSHgMX2%?-0{?=hkbBIij@i}1`#gPVq<6_^n@A$i`NkM_PXbt|2FT z#vagr^4{y{Xx=~gL(5ohd@<8)I0nynjPE#Sj1ux!RY~)drkdK7B)vC^&rCEj5DkFj zak5*{FB+t*NzFF+{`qTQ625;qhyQ0c?h92n?kg{W(%kp#T@0yd+*je3YV>^}dJe=q zQ%U-Y;HA;$s+jUsk(dvv_=9kuabHysA62Q3Rc!NcVP(s^FQCS zAC#bzF`x@ykNM--k3|2-^F4bg`j_v*lQDlhduPla7icC#TcVLVQ8vdt*&w`?uroeA z(MUv8pV3hQ?L?bgTC!1omg*BRz z8wLpmVxSJDVL3@qY*)9NN#g#=M$+I-NyaI%W}28{WKJw7Sh0L{ZCx1cWOs@qAA|!@ zU5b$d^R7cF#vE9EZk&b?^KU0Z%l~4EQI5|Nrx@$;vw4c)osjRdzZVz0#scx!6r&&! z&aIS1tCK_Wisq@tVP#PC*Qv(u9F2p&N=4PE!<}xFLJdeeu?Z@+mJWpNLnfiF{mA%$ z{s5cyBI375UTn;!Q2Gc8jAT{|J4x(8u-T?gT)R@fvrb7svgD<{mP!?DbS6j)@Y|c? zy&|E&m~?{=A&kduIu{HP=_YMWq5@=07INr+m9E3X!T8bxJ+ zF;^hwX_EN+P3FYKvC+LOK{K7)n-fJ_fib~O#A7LOgXqzi znb34fH19{4fJp^L!h0KM(R&*wjPV!BNUSTc?Gde%D4LWT_w520F*j=B50{?+@qgx!$F;e4{4HbokNXwxQmNkNSQ`9}RC-mm9u~1?$ z0Vtw8KEAaT9`=;0$H2Sb?`V7hD1d zd~t52IXwY|7vctwOtp%|+K3|sq)(a{ws&Z(+Savm$0(%cfLw6M=W11O@BzlZ2qS_S%W) z$V!VL&aX5x$IRn{j%hiY=-$8{7DXEejw6^i1cw-?_ZpFGI4ClnO7thZ^9*k7=^?uLCGolARtM!d)iAwdozjl_$4 zy~d2}u}Ej5(q;5-Nt)p*8MW%8NEuqvTNJoPTLlnMGR)J_-EU48hb|#X;r}P}O`J(H zCafIYlmE9U+trTnJ<>Fy-Bw^MRf7zyY1(*912oN10xtmKPt(Wo4 zfr^$v0%A87Js6>X}O*21Wk zXxlY0v<=0;5Fq@FffbQUUYeM+*6CVAStOal!1};;Gn+SO-`w{vB%zP1C+h5*H-}=Q zsP^)G3zeG^B2mRViH24?=Br!`lj@vtZdox+19{!d8ACM>*TW_1JI(P*iU=sj$(w4fGt&kjrcRFO{ z-`{6Wnh*

Y^)kL9`TBQy~<@$m-^3y$7b9kr-P&`M)j6fMg_7 z-XO3bB?Ko+kHHUR7-7d8`|Jf42Nj0AREWX?WR9ex8vU9#BZT~{8OD6bO6L0*w`0_{H9!FSQ$}TKfE4Bj!H%HRPn&H_nGjP%ESPPSN~K2H6~ynT zZbK9#x;!^GMz8b6(VNZ*U{7j>9#xcTZJmCDgDb^|)Mtd~7Yfyn%{C6i^m3(0o?~=O zigtS?V*1(vrDWKA%x8PCV=O48C-Y0q;5g7KbYy(btp{;IdpJZSWrppvTE4s!adLI>i@S zQ(oei*99>`7#iktHjGEJLdNvoUwPu=H75~S`w*Ccl-AB=jpAa7ktwz>M54wW`9}MH zr*d)ltL}J5m-s~ixX%y22#ND!6$siNrE5x6wots3kEZT=!kBW!HQqf75-kq0`Is3T zIT1SNb=6+3OK%m-`fRQ7q%ff*1xeD#ottNo*;R+knX5qB1 zOQCnVP+=^XH42Jr14;HMN0CxTis#Fr(R{QFxP!^DgtyRGnZ+*Slv@%fY0whsLf!=K z507uqXILGM(mT|uf@9@61szWVA?uYd#;PIYo2V{gE$Jdq5BKOji|MMNchEv)1!#fB zjE}Ej6jZ!YX=c1DvQ1hpt)Y2}aM*8Y-h{+BEn9a&ZDZdPZG|r`DNSUU(c4=(+977> z&`LK1>sBM*v~ZkI@$qEzwy7fN7mkUd$!&QmV~Lf|zMz^@2tuoxjgqKQ?f88nxWt*Q zIaIQkfpc6MmJw5nixPPgWUFy0^lPTLlnzGyWWF(LiMHS%oT7i(9Wd7O`U-N!+=wW@ zo}AK>lA;n4@1k>;O7Yne@fpM|U;Y7E;-I{MOdUP%c`y^8&&83$<_xd>0eR+91OrCD zeBZ&`f<2u+@nEVmb(OsNlCN>6wvRBCQI@P_)dg7nnw7XzsSe{t1$x;va3&0sFQL2& zQt#-VWYwB=H;U%PacLCgO^L;$-P<(o+gnHMz5xnE>>RiF&PtdxVryuR2PMu+n5`1EU5a_=;!%km)#N6XRR?Nh}Ai;*#Q#(ebdTSZ2t`1z;Z30Fj7+*%Yz z{eCt{rsJdJLCh025!LZ2{i9EGzXti?&|<_fqKghG3~apuZjuln$1D}^O}0Wmim9`y z!=!$u=IB?oGMmDKYGHwtpz2OfG#7zMUSDi%`|r?enjtcgb&IvdM#^madYHElXl7xc zxU9ImsI<6@G%`DcH#ulBh}LpeU5Ke_ze$n#;%gR5tkzRbN%h zG3Ryh@*)J`0cA#}q!3(3i98GEqlnYcbE7p4;b85x70>r0(2NWRsm%yd;^f&Jfr6QF zo8olV_%*pTY9QLTO^oQaGm+xr#@taJ^Sh?SDQkX`2GeWhn$cODW@=9xlEQ6=Y&jo1 z&Zc|P$+s9$QLx#vJ1HMrWvsq}HjA8HQfbn1PN6-!K8MuJz=u4nQw`8-(IRi4oPyKf zMJM#9@^n4!Y)V???nG6`G+s*GxKQEZdp%W59oq^?=FH>zf! z^QfA$V`~nnnso(swRAR^Atr~Mlf`4#BVNeHPg+TX{~E^aQk>E^i_GQ5M$n)G%Z^$HVa7E&}wYYrZCN zs1B!)x2GD(9Pt1z#wn%`SW%XdA{+Zp_ zp^`F?--6T$`i1Ps573cCW9p_MkF69it_@GBl9;hi8&7kqW}SvF4FWE^hSaU{JtR^W z)EU!?#;XatG^Q{*FwXQ(1~ zW|B27lGUM&hhD~o)#<TUN#dKw&Rye3n)~q#VnWUKzS!}}+9MWqeLloB;NtUV?vz;nd!GKI;*5OuL6-Ys9xlP;cs#M9kI%AFjTY9m*SWUw< zQ}EaL1D`U+Ttw9XT2JE zd`3|R0P)*Gtk{?jKX%!Nnc~!XBZcwe!S#l3%6P)O!oT0GH&QdkdmUYoOpiSNs3D`e zR5w{D$Q2QDuQ#$q+G5@SlWc)Oy}h&4m|@uyKEvH=&s_KQ7>GS{CeF6VtltY4-J8(w1F=OVam*e8~jEM-t9<8$%qWTr9+;}5S zWXToAw5zFi5->leVsT@oam_o{>}Y*2b?f<))ZoJljce7YWfyxFLIpS8^pUZzTs-;J zg#u%_{gqpMc9G$WVqC(gnSObZk$c6?zj7ls$-Hu7%2iBDMlu=FlKXD7AHF5PocT8y z3z$?*+1Ayys|is=;H4Zbm01O`K(4H~$w-=@5^+Z{$|K|3D9rrIO%QUvU5Dsc(M|RH zn{XlrEV`*OlO!_3N)qM}>O(?lF|7f!=UoU@TJ-Ci8esSWSacs}q^J(+tbnS54>lNC zL@J=k%C9&j9Bovdo^atHBX$A%$fM<@&4#jq}TR>NDw3Z-1#d2N_V#6bEjw+{xqiY(}NhZ(gBqw)!(F zMvYd*D$y$$*fLskD;zCxQ`bwRQJ!O$JBRJ0lnlVPXw!<>jpK_t>I5MUuQuk*IHF)1m}lv9TmwC-&<`YT(R7`73)@pRk;zAOSFB;R3`?PJmI`J(eq^))xkH?Hz3l! z<@~tkF8=%YhsAy0a^B;)U%x*&IQ?Io-${&o@UVgmpFHd%Lq^~52ajmT5e@m2hI~px zj%vtJ4f(W&d|E?}X~;1R>D7>44T%U15*qYR8uCvXa<7Kmt0AA!kk4qyeHwC~hJ02- zKC2--_~DcHYe-*27wXfX;~H{YLmtqO2Q=hC4S7&QKBpm{(~!?=$mcbrUqkve# z!d>`=Pd=nUU(kiVpdnw>kS}V;mo(%{8uGA)Jggy%2*W48tRY{~Wxk>zkNCV1)%+tG zbV3(8p&C zt*iR%2@QEdLk2ZuP(!}1A+WJkUkzypta26PNrFUZ@?l`BKxcHJGa7PML(Xc*ISqjU zvizz?H`b#^-=iDr(WCE?jiId`J^G$+$a*3G>CyL`=Bj)2=zDaBdi3Z|9#UnV(>w9x zoea?1?j&#d=QKv2{2-Um$a?Za3;?c%1WqzUPA8uxGiK!>2zQg>grRPk$^5E ze(Y7}p%f2K$H?&y3FjNmCnF<$yopEp7_mqCc*~CT@g^SW<2^Id$6I!!Pwf!!GTxsf zeY_n;`e0>GcskO@yK$tC_vgrQ#-Neoa0ifOBF8nV9>1GG$3LcV^`jcXRAuBi@3fH< zywW3mygx@yXfoH$j9}!1CUf1qw?_WdFmgguo^ECYBPX8JEUugP^2iCE*x_#G1S2Oj z<>_WdFmgguo^ECYBPTQ|>}EzVazc~BZe|1{15BNUyO|V@4BV;rK{wOFkpaE$yO|b_ z4Cr0ot*3fG@A+N!RUJm92BLj>L z!`&Lu20pIKe1q|0;1e36QE%Xr8p6zCWPmB)aJNRrfgY5REUufm#mImrK0Wa9koY;E zNly=aI}}6{o*s?E1Dfpgz>h?g(L|@`LmHyxt)35Sh@>~f;(Fj-qCV5)rbq9E0WEL! z+@s6f%OmU2yJJAhTRk7sWwgB2^KlK)@>b6$G~|9+53#sUYEYl9x?4kzYe=yw$@J>BxYVw|bbtjSOgctA{1hkpV4lMS55y9T|YYB`HABxX4L_L}i4QN8tqY2S~CPY0EO^F6HA?neDXh0L99!-b_G$HEI zglIq$q8?3%1~eh+(S&F~6QUkXhz2wv>UlV#r`nc*G$9($gs4Xoq5(~adNd&#(1fT* z6QTi4hzj1e9%CQ^VYl=lI~WC}2e^Vo#|GNl5L(H=0SRe&+#1IEM(Fh+gA zm|OwI$PXA3EWjB30b`N{7;gZ;PWvKq{{zTd06?Z&fbk{(j42mjybSE9`va-C$Rgn~BZI>~GaFq?9nWX1%TO}MnO z1TdR$on+<&m`%7&GJ68-ODu(AB+Q`zv?@elgy?7vkBKpW>kRL zgzF@;D!^>QRdX6op)&74lzgzMzV!7u;a`9Y^d?A{^0 z1ieF=4)hM`CFmW}bf9-guR!mRCIh`gdIfriG#Tg}(kswAq{%?vS9q1j>yrXwWlY!nL%{zLBG#Tg}(!8U0NRxryA(|KD*RPSVuU{iqU%y7ezJ85def=5<`}#F<_4R8c?CaOtyRTm( zVPC(-t-gMRgkbD_{TjLY`ZW^v^=stn>(@xw*RPSQuU{i!U%y7KzJ85_ef=7_`ua5z z_VsJr>g(4?*w+u-lE+JQK_g*bzecXUevO2E{TjLY`ZW^v^=stn>(@xw*RPSQuU{i! zU%$q!zJ85_ef=7@`uZc98TIvRg(4?*w?R- ztFK=pVc$bq(CO>fNZ9uf2|9GVMi*=(d`JsAef^pl^*y8ooxXm_jJ&>YG8?O}S5niZ zN4Wl)8Vz76s%C`-aK$w%H9*#i{a+I;!_retv=GZq_3QLkEI4Vvk6CE?(brz!mAv!_ zOBFAC=mkdSOOLQn@xq6G#0QH@j~tU*FyaG@W&TT#ut@Pjcl1k^C{T(8{(oWV>wBkH zt3F*|3FyMTPv7%2@6rp5u@@eS!oJP0>z-z0AAYiz>Cd%KGm9F2lG|JNG;gutCs}^E z;c4DX!%wpGa$^+2vPAw6lOSbhNnhCx%b0ocp?b+ z3=^5*v%DED9I-*?cr`AFC`h+Lv!Po#$4e4BMZ@Q)5yHO<_eQ_w;ZwmVkO`xlOuI^^ zj1s8(eU3@vg$M0XpJOU`;h|`KOa$rENEE7v_pl8*%hLC7tS+9Hf0Qnsh3`?icox1# z>Ec=Vj?u+OhR?F}JxUqR(zjN|L;4;*%fk04T|DE)aI7w#v12$^7ti=H9IK0$vMu)C zaI7+(W!vFcWjxEa!?C(}mTiY)b@5CThGTW{%vy$Hb@9wvhDjG6QG00kEc2G(SY`?)l^4mMM7Oau6M+?@k zUQvxOn+4Sf5wo{ta|qT~{E z3aZ}{^>@Ty>Q{hZIsaDkZ;kq`D&}9Vs7jS9tnwd3g4YB7!cagKC=3;9KnVj%8Bon7 zs&$EKRd-?7AK@Zl)kkzo)X479{By@k{i;N1Km!7*$E5)^2c^YosY;8hR3oJ&s@2jm zeo@UcURupxRIBclV!~y&N_n13^*l#P!=IH&=tk}|()tt_CHv#f~w zSyrt2Sr+8x%YYj+__8o}w5+B`0WfIUkFpvy*0M+qe_Nv(DGzWRMS_t`z4@Tre zQCRgM#5*ih%vc!W*$M&0WiLbAXsCp-F2t>ebn78*Jw(e(t?(p;m_&p^s=J|32vySh zhjhR6R*1sB5 zgE|^6QXLK#@g@y3&WAA@vVg{+aIr$aa20<69wBEZT%|T`xQhE3=D~+~&|%<%D#>Gx z)C3q(!yCS)NRft`BDH^Nid3C7z()CLO_^%FrkwG#1{9t8S5wZbR>SnWro5Uzso=UQ zm;%&rziJ|?V*x*C1l1n!gQ}@twdVkk-{Mz&iw8NA__aTg9SZnM)KKssyNq9jR{>_S z0Y8rc53E7pNhAVACERL}BL0E00C%)3pz16u(f}+Z zRZ&)=0VR@r1j@=Zpe(`=Uco?Fm7IP2svV36)qWXIR9T3pp{$xetyc3>rg%-D+^^Oi z59-TuznY%%V)a3}9%?y;O8YNR9#r#HQK(ilP*Ere41T#66^f<@Dlj(sqCzi51$G1h zf&nfW1U@MMzfk)#5Y&qkRFY31CS49+M|G*%cGYN>KCQ0cK~^im8mI=Dm#tOnPiu4u#aaS2yi7ItLYAxvMbv0(K#mxq zmbeDktN=<@4b)(w6abPZwO<2?MFA8uhDWSw4iB$%Xzh{<}hdQ6X`((9es22MtjDEcB~Iz^@!Let}1{ z|M0}Eu~b;-uaWCj7y{zU{_qkPhFI(_3@J1ztmb}IbAPJQi2R~j&3R$CP<9mJxkT0? z8Z;Ha17S@B58yirq9{KAa_biPnOfsPEEL9^2k`PUw;z43BeiioOfj?1W43?sGRZ`Jr02H0agB)zI6!WJ_ zsA+;o#eg!%x70`()2j%c)Hh{J{DNhLa(#kjN~#Z*l}m)jucEwokkb(?(_<=A2p=q0 zQXqa+BSea+F)bqFfnV^cBv>9%5?ipG*DYAiJuX-47p%Z1awru_iVjw=6c8jymujzI z0)+=PaTQgPVgxIy^ruQJ06@-pup*>}ToEpbs45hF3I>Q$9GVFas6_=_sVteZkO^sjD8~my!YSfXcrUqg!?f;q@ zCHB_TsJW}DVSL7es<}o9q%{D@@!~;oSARflC&*7s;vp_Ei^CHOO8S@*@CTV6;z6xr zgkW;c=s`^uJ;`?QP{iy2Pr5R79>6=MR`kR*RD;6OdIbE{ipB=~H7v^GsYEd$L=liP z8-N5?uFijWR5C6eu*qc=5Xp2g;4_1O(NulF4~*6z)h~b)7Yz87Xd6H&wdv_et_&Wu zK!YbagAsx;BMAgpN(cm)_Xi+EaXSIs8%PKm#L`9}pk*>V$z6atffK5Og-WakNY`Gd zIXOTPCCT7P;s$j_O?{vcYtA)56Cg*ebu8$pp28wNkpQHQBs2(~=OSia0I@_BC}JWD zkdlBg{$jnxc;dE;Aq=Uui`BUXrSt+7v-}n)wwI+?ZD16t;+__34j(91hd;by{S-YZ zi6&4|RjAj$gymkq7zy#j3rflz)teGsSqYdcgIMehltNBYpi)LvfVhTI42<9D$ti`5 zhDpWvOIb(@lxlGjPjUz29f*{i`m%sV66P1c5eUhu(lV$(R4E(1$`pD5fow!5XSpp< zu7zhjMR>yOEgA^=HOL+i?Lt|9&|dAJ#urj7sCTUR2td^4T@qx43xO292n4~qRHuU# zR0{HU0F1+iDWMNSr^b5{J7xVL8%;ubT01dxIx6pwgOh#jQ^AM{klJ6R z;3fQF1nfi>s|v9!6~L3C1y!LS7sHdPzdBIL=PW$2fKJ3p_M$q#1RoDt@&^9N>Z=3# z)Q2a93)MJBDfu^mN3~NxzAdkB` z7*wJrUIx`vM8IBoka$w_iU&r>FpKa3JaCI)zY@;?f+A9m8&9gMcwpL$C$)>h<@!*B zC$7E%BU2w%6!ZS8Dbi;ZJjtF>zvRl`ff+rXlmv?2aHsJEiF`wDPUEhX^1u1lAZ8Zg zYw%42UkIphAvt8k7gUxH&FW&MYVi0D=f9fHr|%wY+3lQ`8G&ifFT1BJu-cd3+DhH>p5MBuaU`JfInkX z2yz!-2wx_Vw*W)f41&A`7{ZrJBk&er$k+HfdIatQ4B|`C5x5I5gs+uG;4Z)rHhv&? z0fw;Y!w9?u7{Z1R0JkpVUv7=~|vx{e-!y8svBd%BSUw*DA~a{yP(wjbmh zz!0|l7=~{EL)h+P7`_1vVXKc}_y#aU-~Yik01#Zqj=)`jo98R!kpZ^%7>08If5z4x zcw)Gh9;k)CJ0k-rQ?%|u`kpVXI7=~{EfAxTF>xhIz(ENiM#5eimF2Eh)YkYDS zU;=>*0&+2)PR|i0`qq;Iw1 z!pUWr5DmkHlOarqhT*}f?Cgi(u=#(Q`xfZ9iYwc+THSqb%eJsBebPWn0+LCZ0DhYX*WrV`@z@E0`BDNnSo)*qJmL{u3q% zAz>hy46s4~y-b)SFB$BF1O_}X`&8Ab+ds*Iz+2C2fo`9BtLoJG)u~f;s&v(C8nL-p zL6C8+ieYQ9hOka!W3h&?PGeiKhOkOwQ?Z7yN}tpMJ9Y#rE%%v^ozxOLc7$~r+lh5C z)@f`e))3ZdY$etZ)@f`c)(}={>>}0>R%z@Z)(}!@nRSUR#2UmpjSa*a!a9xZ!y3Xm zjm^Uv!a9wu!y3XWjeWx!!YYkj!x|!0nzn;r)364yPGifkhOka!!?1?1PGh^UhOka! zuds%&N@J(6hOkOwpRk4~l}5G`wh3zx>ohhAYY6K!wg_to>ooQUYY6K!b_Z(+t2Fio zYY3|}b_Q#RR_XNENtW0ntkWl1Vvn#+pJa(W!a9AD1@;K*^hrH(jvZl@KB-5}u_LU~ zC-ulVc7!#kq$K-jvaY4v;Ve|Usv0j zKu`W}vEyqc5u}ysj($%I8D(n9hA4Masu(4lDhN_gHH7^Eq@ZdDkN!wO)es)*k%For zdiM;aplV2($8qGKDiAVGRb$9O)es(jKdW{1SNG`Q_j}r{`PDso^c_R~v@XP>FY;D3 zgvVOst!l{M*IBx)Z)9%%TFKkUZ@Nnh2hu~dLL+xaiw9s@r2*4q157J5V48A(X|)DS z(+)5_Rs*J`1Tal>z$8VXcK~YT22hI%U|PKa(}V_0D>z_US^(234wxoCU|Pum)6N!P zdgKO7GX=2wOnwuxnj~QW)T)jTHLC#A$_|(oFTk|A<4L<+c+v`wC+&FQNvk}bG^6pP z$8pMUBJWG4mLStfatW_B|M8?1A5U5W@T65APg)4@q?I2}S`6@{)gMpV4a1W*0C-Zu zA@iHG4FFL3Vv;4=2mq#?F+6EAfG6#a;Yk|;JZXmvPg-g4q+K#RX=8vV?UdmOs>JzC zdXxiDTLe7maSl&f!|Iy`BkfG0iH;YsTqG9L^}km;nUimWD0X=FMv%*$^&rBw@s z4NH*e#2*@#Ak&Fqh9$^!VwhnGGMyM^Sb|I^hG~`{zX_>M4Acq>n4UiX8N(7}I`Mag zCCGGQm|+Profu|Vf=nld8I~Z^iSwI~)x@OHa|twTSb|I^E^JtGO8Xx8&aecTPW+u= z2{N4+rX3J;PFppU_41oe!3j~hZtR5ML+yp&L+yqDru`7Wv?BtTFsqJ0pM@ z!^Q5%=`^J}al_gp!H33ju}cD&v0Utw0A>sqyCr}b!^MsXV8(Esq92Iqt41mURv9AJ{v0Ut}0A?%~ zyDNYh!^I8@V8(E<%L14&TtR}9I#}3MBVwj#NqJ*BA;7NOOc+ztdJZa|>PkMH8 z8u?AyzeAD<3n67XDP$BKM=LdtYv7z-g~Ix&oekTRVZMnbq$ z<~JeLiGjx%Lu5KJ>|O&SN2mVS$Ni_pHJkj)&v87oJs{)Sht#=thvX^$=HR?G1fT*IMt3;vDfpbHWXJ6p{ja zkk98H>Jl3}af0-h+Wj-$?@8qL^@a#J`ksp*W8!*9D&3(n-SV>JXulgX>T@V-sK7Dh zp=De_#3Ls+XT%aGptItrYO@Gk{2=s&O*!L}8v3{?k80{8PgW;!aQeKy0Dq2B6f zUU&zo7wOt$PgGx-EidRij=PN%AYcH6J;W$OBI{Ha!GXW_sF`~Z`&>@~`l2Ja#6=|=;@g~1_H1dLi6X54x zWGKNhWB`S@s87V+ZT^M0;t40oXQ9HyjRmjGV)%@Tg_LXGch^E)50dbq}Z#Zzo%1-~h7Ky}U z8406PpEn|;b1r5m=){NIhl7q-jVW+5A@Rp_0Ps9f4gyd@PB#lOx zPQlL-xh)@t(Wu&1aDPP(yZEiw+0@7odBSzk{{A}l#@QFmaVshpn8Kb)P-$-ruNwDi zj7o1BGM>kfH4T}}4H{KVhF>5gNIRj;Mo-9Jn_nld;mDFAE?dMS8Rr6yKS`=9IXn_h zBrmG|g1a6-X^GMf{{@$L)buLyU~B-2AXs%>kvl#LW<$B(cvy4Km1UvZ)N%g@n?^Ms z`{y10@a;js7ATkx(M}7PR^^gO?VfIk`Ibo$qP{?R5OKT7P%Hl4+5CM<;kj|h%nDf zpX2hB_e2YYNX{iIZEeLbB#yv-(SGHUEuw9c#ob&;5yLkJA%(yA!w>(uwx($JD%mj4#ZCJ2J34(eH-4 z`=hSAD|P_>z8f)k=oZphO|-VkPjU24PLc6(@(P5T7B3Dvi=7n?C=gFMsf5!M`l7BDe@C2H8mtnp)s;@2YKrfujpGieGQefI=kEy35`Q`;RoLf_y>WjM#%e&=$>IHm@Q2A%C@KuSO7Y3)6X==z;x850^ z8Ho3w2csW-eb#_}m37T7MJrL9y4WR^dY9V|36JO&bpgE!u*;1_F$<&ipwB2(U!*1w z7UYWefY^4RqB#fkRqWcwuqrX552jAKTX$haRv);!usA$oSBb;Z0@LQ? zkanj+7O035Lq12`+>3j!pSdU)oRVFO*t)=4E}FkwI-^p{YLAvUH^M``m_8Ibe`=1% zjNW>-a)uObB|=)p#GU8+7A!PqI1umJ!RP>dS6s}jz$4<`pV*bNy5jDxZn(42-Tj~{ zzgpoBR*GkSQW~nvX>EtBgnC@pChv?F&34H`(Qu6~v^0X%9;XYG>yOFU@>(5ZHkH=b zH!O!!+>X&BIY{yz5z}u7RE#=rm!-#PrB?boZMegj9vYSd&%}Or6TBbX?1go`wmMu` zTvu1$s6K#~2+s^`OY~-AvI!lR)S+9BRYkyqpz40G)QAPYoNCgYdSyY$VsZLi+YWn_ z701`$I=R`@P{8ZX>NERd4PgxeCSqif&sJE!h? z{DxJ;T(`QcBqEMC1TERf;_(~NbyL-{sJOMcG$QUf6$tqu_jgzNXNg_6*s7YrPN1d> zD9m88aN#_>s2JU_+dbl7u_Ef=cKQZ6pwOke+21!hov=VozcS9wA{VWqWS*IzUXW=J zE&m$ECBj=uXL~3t?@+W*%?~D0PA?6Jt&(cp!%3I}ugRQtvZ`$OQLs#$hx^}Wk}}BA zEK)lVb6wmETYuNO8j-%inlgWU(Qpomrgg!{b|qmGSR+r=%mV08G}Q;W%O7a7##ym< zRiG-ZuyQd14W@c=A-Fbq@anY91JzSdVT|Osi!+DHOK>l1s;^a&Nb;44Y2?Ofz%~L< zSR#Te#pUgGu-skkxRMdKI4fH!7WZ4_3nswQIheU-RcN*^o#)hatw>?!x_dZ9?u{At z^)=RTMvSO5!XY4^KuScE3&A$@#4&WoTyQj+f-u46(7AjgPG6!QXhuN+c_p^4D=p=Y z1Sak5>q!8HlC&67YBW62tvH&h8jB+MO75$z8M#hcV1V&Gu#^=jP^U- z<>bCO?V2XxgBf4EBrq{o$m#4D8R$(6j!4Hd$0=p!v;#{7-C$%)`A{A+x1sd@c&g7i zc$FJNMM@v@KfjrLJnSjC5e!odsB?M6k!(9LLD~+N+X07ERpQ08|B}^{qmoAlNd|+3 z8kEJ}CxR8?=$Aqvv1QahrKa}A*oYJq`V0Js5TrcBUe&m$x;$82yP;QKGfp4WtfH!E z7;0@*J)!3sasQG~y?F4t61!$do+;_gbEtN;p+WkWxF|U@{VrdbuRKpxM(t~ZYkI*HvkK&uH9Pr1;BIK;6ZTUH>}tTEU2#ReU623T%uWa&tK4a+)NVXg|Q z4~xjc@8Et{XE#>obPL$5y*RHGrIEw#Fj^QvjkstX5)YS+nu`vO;Bz@9_B*?Wdtr>A zlNhK#$NkYH`Oj3NR2Y<(t?=hY_vwsHs7pUoEX{{*vYP4s=O9cqGR~4$V1ObC^{o$c zoc%-+Jnx50^~RHK3IvVzFq4^Z($r{kfE#GZ8l<7vz%vF5Ns<5!rYXr1#ggt3^jmX; z?NKsDV$%cRC9Jf_V$s=6pwlo|z;6Uq4#Lo=55dVk5C|2yG0eiiOfq0G%(g&CC(Zq# z+SuasClW(W1hy=u>f8_0*0V1TVH}9wNL(063>%a0DoXT|sUic0euI`&ota%JIl;gy zIR_608cYO3?77N~!=r4h$M;QP?{z!GQB=QSR|l17WnOvMAM&;532;{@y1}#9^;@<< zSi9CH!JPex3vAC9rv$5FRCnyfbfq{|Sk9Uqnubnyi z%yq%a&g3vAAKI&GSWfd*iBtXP*tK(uz9pRG+xcs0Ye#-z)mptcQ}0_SDYGt?`miap za6-zM&N>~C#!uEa9@ITPq&AJTPzc z=$oOHF$wYJ_+7cSWPCr}1fay3F9v6&bF0~?{QXE>ry2b**rO9Qu-B8H)qu@4dDEKW zldaw?TxzSqb$jrrrx8@uwncop1M0ptxFFjiAEOwII&Y08+; zvG$#4mYf`b(Se_oJ=OSA8G?tmh{NN_S<-HyKIDa_DDY8r^ksQYFxo>dJ06Y6v2zuc=!&=%;@&!IW?0WSW65QrMffigkDRb)rcGUiamW1e zMB5q)%BtRRlpm753p)-GD%qvO46*)RHkM8s#p;$gyLPSJwrN%8hRvIH?V>22DsX9Q zE9r@$q^1ypp9sux*j$cYW=g+#D79fwjHN;|=f`^;7>D&+c5PqN-a$2QSnVvo(zy)h z^E8WRuJ%D=_mT-oBrQ*>*I2e&#bE>a| zf2F!Ft>Eey;53y{HKR7MiWb@zP#OmXjjvCzLdgKVH;Y-1$ zGq3C8A*}Eps#`;I z=43UH9gLSGnOB>Q3PSUZ9zfi>+E*d*y_Rjqj#{G%4a+e>+Mq-C5hxDDIUwj+{A#Rg zZAFF5Ga`swcQH+hme+kVr<*FJX#hpU*uRArj-EGSi!CF8;I!QLADm(M|4sc)_xr3I z`|!tEuE%zl1lB~dm_M#^L=g9#Nb-d5oBlcCy!Jo~+0(!*Prw?M$K92~@%~gC8w*Io zvdvrRoNxVWW);tStm ztAYlMH0zJMA~<_0QV9f?c>Rc^eC2h!r9HC6^gs?XifEiucAjm`NffT|kOTvMHqS9BocO)Nll& z1=Hm>5#Q2kvk0&eaoS<`CZ{7lgy_He(dfp9gzvC_UcC~#Vz{KR43-sO64l=g&O3Hh zskIAZE=I*fH!Vu+gWrk81gx?dtTdW1#R@ONJi9m9IMX{`B4gf(wp$UI+Ix*vk=}vK zhCO>?NtHlKbL?vpd+0yFj6BrsgjP{Rm@3n;THOZCnKi8(viw-QR29~!D5eQVx-uA; zU-{@$m(h_?i=7=N&IN7BZjNzIGAH2DD~ihY^yD4186I>ILm+uaIl1Mqf^wOzgb&P6+2JUI$f;zmuzO0oubu%@ubwO+(Cid;qE>&2DykxEXKwq z8WrTKgP|0O8K{+}{Zf+4u8OM1^`b)mh&M}98Y`pl=wK470klj7bmYg$#2z{7$jKfp zOx3hui5-(VZgvTR;&Dvvq-5iNNem;f5A?}E8WDW*y@9uuxNN$5>kH&K()tYqk3ZC* zL)Yn8zj@m=tDQ}oJFycB8zh`)w_IPu0s*b6BxIAilnZAXt2Rc8)1VmPrA9PvZ$rwV ztp_?_rnIa>;g=;1Jj7rX2dkdLSUTC#(caL~(y%*93mFA?W|5X?B^OQ75-3*=dJx5w z*kPTPR;48Js@Jq?s>fWttcD3ie*IVp@5gLycu$|iCzTwg-B{F;R|$FrCm}I_tzodY z=&tx}#Mdm|`uo!G^nwl=TPc209+;Bm_LMYCAaaKBwErU8esT?D#0tet8xyuEYiWhq zNJmf1)>|R4sPIQwRoSrQxv`>z4>yY`w#O%0t?G@XpirI#hAiXv0OoWM5{{Y_HN033 z0)^?{Vr3zf)pjQw2X^etGMhXS6yWUEq@~iD>c_#F*6uL5rN9cz_c%ijIt;bOwjnnc z-Elq#eh{NHD1ycLR5#p3$fQAphMDmS%F$uGmpgS8T$5DW{aBl8&3gfAVnj`64XJJ8 z)(I<3t9{aTvN`fB_XxM8s+2Wq?u=KZWDixE&ac%F+8D6h>c^{5k@G!MvpS{++j09Y zN6zJX7dH%c}I-F9*w(7J2JOS#h?stP>9{VpphaiFhSYR*ga}jY|azEzAD>PHEX3 zu>e5%H5yzzi>DwklHNQ=HY~qE4Oh-IQ=?*E$U3V-UY*-y!3RTSz4C$H`z{s>OUqih z)un-bFYy0h=7H+)3qb42@~?Jk zZf4pW_UC=FjSSj&E-1cwyKQ9-J!>}xGHAKi&V05he9$`eZhS@Q=;?1fm-(;F;gz=d zAu!AQ_0I5vi^P_V;j+=CiQB}2&0$NN&4lk4KRsei6`xvbZ_3~M0^PjTjEZ`&*te@MqavaUkFA=dfV>x2ls5O0x z%rt@3$H-78qVHH6GhZIH{vjw1ecHNqI`6K-;EjbBR3uuS3sz*#eA+ruil&d>1H7Hg z?&H?~^5bvmeby7`j`;515q_CzU$DOJ!%y_`eo_B`RhhZ%OIArhJn^bkDPH-JHCvo` z#0rZAXRT1?2Vb*}_{4$NtY3MsgK`peTF`*5<_oW5pl&ys}IooPFjNsdf_SS zE&v`rWj%_v4t?FKBNRTDvF!yH3Z&E0Xg2Q-!9R;(BZg>s$XbNr+aI!?z@Msz zt!wdT@59z%{5kWm^(oYqe#E+ty7T;F)+2dHXP$oCDyMfp{g!nMpC+HMTB)mF`6ugD z{JiVi*5f5MHtWhAfR4ESN$Wa*Pd#bHd}8i{kf-a9q5G{*S^og=>rYuvh4A;$A6b9r zYn-eUfEkGOXZHNqT2L|-O<|KE#dTo&#Ix^$U=KWJ9T88yYc*x!&s%>9FfNYdXFB=+CTD-xMcO z-3w=4u6T&HpF{4J|IBI=fBtXQ8>sf+&#f=v)7n?9%cw}#zgzeDiN8M&+7fZ`@Bi1@ zYWQ0%-g(suiUYs47NG3k{?@w8dzA_O#_IAr=pr?@VX!wr5wf*-rWhLurK<4O)7CLn zs_6^_jztF>fq!e=URdk2-&v6YSsZ-Rx|>R7%O`pr%&h!R>mKw&jJ;(wsy~$?^0xJ$ z*!H$HPrURhvX{xYQ>l zl<+U{)>|+mbtU#mQ0s*f`-k9E=F0*5K5BJy$nM0?&xPzKeWr=m#9D`{PLEhOQ_YEk)&rvZ zu(c$EvS0Lz^X?8^EFOC&G*etzVShUFe1-iiM3Yqb6PXJa*q?%qiElbU!^wQ2+CD+z z)KY7o%``5uKUpF=|I?b8`EH#ZBIN(M-u{+vy54xBHk);%5<{8KUugfvC$=}+J2U^$ zU{6tx0*~uqo$bRV;`|2e-adRb5XiJ%WY6|zwq9cI3y9axS{34@R(n)@djwC9?8KJC zJC@mTwDjgOI~87db9h?!{2zYh&4->`xaqIjU+K7H<2~I|_m_O+BOh6}a^uSX2Hort AKmY&$ delta 121582 zcmeFa33yyrkuRQBZ|asMtF2v@r7Kx>OR`q)mRDJpW5>Azpx zmiAj;XKPLBE!SOl{JQI|^WlFs{7?RC#^XRRG8Bzw9jao!M7w$84dlP_{tNhraTq-y1E=o3sU6hu+g)nWXM_qY!mZPwg$YbQzU9@Ou(m zn8Sz#*GCe;*l=JlNKG}XkTZ=L=*j^emsc@`%w&g6!R({ST;o7q{?!`*qiaUe@|g>QCDn>tn$HW1z?*TcPLk4;nK4#9{os**LS2_mZImhx^v4;>MI?czE?m11OYwA-`Wodp0>C8E-IYTbIJ-TzfC(cs2zSBhlRbtZ>VI z==s}=4?kse)0ffB4JP?yf!mSwCT+1kfrUh5PtUJ~dcJs4_tjM|R-|Z3Q8(YJPQ6|5drM7W&M}{o{%L;Z4EOXl%lKNwq(!))qZK_NRgo zV{jJsISF}otPKYeiC`qHxzAQhU_A84n-+a+`bqsRU-in&p_phl$SAFmISL*0{Bd3X zf1K32@~g`-+h79G2d0$ymZ|de^so8CJ5K6HW>+uIEN}KHr#h|2*{TJ4e&vyg=dUmU zjQ6z4m5SKudE@6l6+Wq-@K$$ccHbL?)H;;NuD(z8P0#CXg_S4u(U~jsP-CI*AF*6$ zX6gCjv44IGec9k!a)W$J&pRu(0y~e^RqM-VPMfib)CDj;n%7r0%2M=v`%9N!IH_Np zL8a<^Kbk7P(DUZS+S4@Fj+y3&`oPav5H44Yi=K~tr2I)L*W;^p%G&fi9K2LQy)X8C zPQ9h)MkU4Qxn#o&BLr`g{>GZAzL-bWqvxx`>md#| zYSjK}{bTY7$HtEa(aQ2L|g_4>-nGT#IB zvIISUG3NtkCAmERAveC}>p!h@``UYC33~d@-BL_gU+VkpeEF81dH){5LipQ?X8q}t zF8$aGZr@(7{7O&P@W1>{QU|qqqS~cD{;_=DXG&!WdhYw1X%Er@Y0#hlkVoHAUGBT7 zSbnAFyMOwwk4Z|Q`Wrvu^Zkz!`IVk;|5OjyV{z-jVRr3SY zm8|c)gqOe4UwTTSa_S3`L;}b$Sl3y7#oC?o}VGVn|jh$wAK-W_;<* z#Pl0~(BnI!zS46|*WX_PHhuJUw(m9tCp}-8@N7J(KUKWmH(L#yp0|B=K2|TW zo`qmNm5Pe#8M)z2H`2Ho^k0-r_kCH-2|XiuGY*~9$4YvAi&Xpc{MYx*zDF{b6F#^8 z+OcBa$JNTC=a2T^^ATQo`j)ckzRv33U!Dea5L2RhfBt@Pl}F)`o-clR%6tQ3 z^YpI5YW<9>K%biL^KG9c+o0!%&Tl?OI9cPnpeTf%H@u+}s&hwuwSLN7qVIE8`|OJU z(6j2p`bA=q4cy`n9xV5LNsW=7YbM?bLLv@R?4IF!tNKFE#LkQA%Nf@U-*LZ$f}U^s z?9YEIc^1L=#(eJ#;(3K?jneb?KmXio>7%*tb2Yvx<+2TWmNG_3+ zzVOGB`Umkgs(Pa5M;<%=@ss*DJ7;p6r?57EH|K+APU`RM(tOEc!TF79&`@V} z8NoP=n&0?*(>enuUHY-Mnc|q+>+^Llla=WCrPT#nPwHCx5^lT&bEN=cgDzi}E-8P-yo(6hn)Ngp}N&Rr^I(~B*;_dkIw_iA^e|t_Zzxg#5 zY~%S2pP)Bw;?K^4X;shQ6^)Ue!Fiu?7-MY582#d+&Fl4jLm``DL) zK)&*O8$MvP(#oyWI*W4bv$b}O_sd&4in+B`FpHX!b6{B)+vo6`)E=J7zN4dx`*;@Y zV*jW2y2wok+p!BIl#cw{^-x_<6x5a-Smctq{Evq+q~ z*XHzSTH_#ZoW$if=T+)s{q^49XfU=n7#W;s602UbO?L-kvA{%Av*`M^t-=qiG+|oU z9M|35x2bR2^?jRrZ*A2YX*?JX{z8MI=sS5cv>vu#XrtrtgtiCc59|wKo<>K5Lm?n9 zJRt(h9F@0geUU^c7Ss*~_rycM=}`1wq*Vj`1oi~tL4Y1O5D0~7OWvvl6NBxNPU0ic z@$isWqkklTij3qGFks<9MdetVP1usHH%`*iWz4UYVFt!Hd3jCV}IgVE8kXaoeE zKDhBn@DQjm5gZbmrl6uWY_Abtzt>inW0pLFs*fCi&Q1rkciZ|M>w9}P=7cr4Z5-GK zaWcsfv0`xzMYTvY0lM5jP7`C!m z31AQykht(Adj(HNP`eS7g~c`$9E$}pD*(4=%lde$HWtOg8slm;4&#AXC_JGZj71}RuZi61#pr$Z;_Q*nN}t4=d$w&}zxn!HW1msA zIT{qhz^y8bq=QgnVIFaN4*vECVq3`cVS*N_g}`ps+m zbAnd3CYS*8!1S`Y2w)5YS7PgrT;*3pi;Iir=s1G`uIXESW7edQ8A?3-0dLJMIA_|m z(JJCr2jUPl>q)w$1RCfNg}}aWhGac_ft2X*;(Q81&GMZNh{Vc(yTSz=ppy7x++8j1 zZge;tR7%v};AzOG$-}p$;{Go=%ku+rNyb2s6&126(>$uFqGJD+JZ*;jNE{xuGs}ps zm6*8whuoFoJui4ml3AmhOn}QV@M0Mxi#gUMxH>PVs0L)=a865?XCxq-_F!ewQiK4V zFp330uO#`=PBM=53W3n9#Q$J;d?%+~ahD8rMX}H;Oa8w^@MqA2I~e1` zLUDPmtEBM1Mg4z^`tJW0_5UsECsi5$Th!;&q$d^i8Mm{@9UuRLfPCC zg20PS$o(71+``e&A*dh_wX~xX^`FSAxT@;o6F>c|&8vSm=o1THv&}NK;)n0>lozEW zFUeE!u*WrBw2nccs=FhvD$jdZbe{B-ZcLR@8|*c~IJOOYAejt}pe;Zu2h^f?A^?4v zq-TdWWVnA=)D95{Vly(<;&Rn0Wx}ka@tz#&^q$+Xd7<%^<Xp|)i{$1ob0xJQj0-|fwQ;}TCe;c3C8E;2ZhJ-D#=z$P)b_|oZkl6MoNMpbT z8|t4HjKs(37!SL5C}JTRxST!Osb_$0>Jx^_7LCPsv%;bD7OEqgrp>0gOVer=B82Tji-ukOSRe*N2JiSo*t!ys@p0^c|xe;5dfweJM z77j*Z`v&NHFNmRYrxV8keQr}5tYk_O-+kO$>R^S@R%t73VO@=P=CNR6JVt==&W-I7 zteu1+S~LdF25~fCFI}!oGNeA^RGP4-Y!zzXPnMf*tzp^5{_C}keK+-OT%j%7)VF4@%$cpU1_d45|=7%Wx5u2i}RbjE^(;9Rw!1z zVyj3>d|=vm!qQAs{wz>UQrvNrw=*RDBFH$x-xs~>6TWZ?5@}%b;WMP z+h4KOX2G9Q>9X52Y(Q6RmL`k-rJ!dkN-pT}VKLcPvU`%NGo2>VktBRC+h+7<;=?ps zWH$-H6EW0VWH(6mf-5#Bacjjc z>j}BAs}u<8WDZ$MQ!7T=CMLnIxc^PIhUu$}HDdaaKn6(bg4q9@XQ9~D@0l{VK5`%s z4h=EsH#PHmJ#4Pp*U7Ai-}pnaLCGG#QvGYi?ya6#$zI7Awgq7ZA7oR;|893|={x zL*cN|h}1}K3WUdlP5w1EZrXIKzge6O+Dg`$vb?FeZH3|>O^pl+Ch1DkY_J>IoJel+ zR9@o*R?`G3g6|DP=&wL1(i53TjEF78&Qh;BK}ksYTK0xL(P)_IFA*CLri&1N1g^;Z zjsD2^CY{S9<&uV!@fm8lIQD0Ec`_UgB)C*(`+|%z5r7&T;*W{|n5#(DT=pA0sF`$< zA>jNO<#w$BP42+yKw2+THGeD^kB-L%gWRGx`_8}` z^N^~hMDI0DVvaUm&y03jX4K@T8-f#<-PJ+!MSrZHOpQc_`sLLnuUFYKsMEg<8-wVm zp=_m=X3#jYU@ZEh(Xn`L%}G7u(Bg*TVRXMkhfl zse@%}jFpiIr@5MF9fLv1Gc7F_2wuHwLka72%de`_8OrSu?-8$8?wm||6l3ST6=LiG z_Z0ESr(6Z%v&TGT*=FX{HWo5Uil(^Sxyt4YO~)%`A4m&3r#|DT671A(>V1BxrOP5x ztE17P2u$yP=BlcLN`3ElABuwZJ-4+GnK=$qp3S(+Wt9dyJTsxJ{XvY(-Ci!9qR*O$RFAb598R4YA2~1bf`3W?gmG)F={Iu z+QZfo7H-sNKug7Iq>KyzY$R|1C+SfVCRC0O>fx+S9bl`UpvKTgK-(LQk}Y^5HJA(%-?wH6kj2Jtx#W(gqn{M2`gJuk; z7pxv&udggPDI*49IVG~2nl0@lQw{ap%G?|>QDbdzBpQa*fR6mwra%^hZdTupXa~Vh zgRsG{I|WI6f*>Z9$RTYHW{j*UQnzH$K#lCf=}!adG+4UVl13@U6_YT%As|u)INIrx zy8!4ifJG(BJmCoB+Er;e!<)IJHLFhb3x~V&L#Q}zr4Y@pnXC6lG9CJ`OiH4rw5idELk#t&*GuQ zi#msf_AHq@4}rz=hKD-`g8}?ovM{jFdsx5FQ+9gm!53}X)ynESCt_v0hC(r7<4pqt zYu9h=8yFxpTdaJ+gYdss>RNqdcFFShp)dnu&sA~>RJj_ z>eG(=lm2hXTd!JJ^t{VmrjOrUjVYX^yPlY(ADijX`)3yFMM<~#Vu80@y!L0$Y(4&_ zMSB0&rs`Gq)ab=0JVk3L>~q&H-ZIUduW!C5R3C8}&19D?GjAtrK}=u(pvi&#qlo zR}~R(d#6`sv|z@S>vgBf^T|X*74-|x)#=k8D$VSVqqgD^tl_;puwdp*H>Te=gRyytPO_FUs{_|8qG{ioWHYji)yq zyWOUL@?VPebr0;;|NJhm{`e23V?GfF;huH+2|aArpZ+gQ| zr#+?!)cfDPEZ@-g^!whu>hulo8MU8&>HQOSU3)SAbk&EZ*-pRj!xx?UOTQ{QUHq}L z4*kW;h58*IZ=n#h(;s`JC-3y3Pyee;pYkW~>5KmWw$}f-mrK=pNQ=p4jOm>p%%948 zz*N9C5Y{q9)sU;A>%RH|SxEj4Jk$uuz)OrDy+(ku*`^8;P5&Cy_aC3-Qx*Hn*lx3u zZ-^tuQ(w4((UXZH4#+kuWd@|maBb?T!sy9B=dN80sQ%;k%+0LTA-^DuRd0LFZOmqA zZH^}7zJr0(3m91IdyRHe>y6Z7Rp$%#dLtOqm+2 z%WN>Cl%1NW5bpLnfMU;KCvX%~-QT|s&86z}G%meQX&+jrGMVzkiPF9sb2 zKhU50PNBZ!trZ`B-*@tSrrHpNd|BNsCT_Qox17DDl1is+(TnULLq*QwWgte z$S9_4&~mC9cxjB5%#voJp+T#O~;D#AAaAj?=CCQzx8zf>Gtot zN!i#-ipJ^3e{jE{TpZQUz1ySj`$?NV^`}cM%0=KOi&Dyk_LF6&Z}{mVyZ+Mq%k2eAumD`d=T?-}m9t(?$Ol zb)J6dSL2S;FJ68_-s!LZ?s3*R^o##cqW|azb^7ejG@!Aj)9?J_I?_RE^#1?+cClLA zrXB)XZYYuK)qIDU+N<~cTSK}E;yYiHrh?r6L(NbOxKUFD(Ys!%EtXBDKIo^uH#=ML zuoO+{9MrYZa=OYv#Y<(&86Qw(Qe~t3LfaLUjhd_J7_}E>T}{VmzOrh87Ot#XG}kez zcI`69wQCo%S3_42ciC(W^%-N&&V-`ZKig25qbb%H^rO$uzJfB*d=(u6gSd(gk!uub zGDpAb`R1#t4T0}e=okN3s$~zuY>VZGKI6jdt7{D{f1$EKv^HPjJ44RFsLQlIiJm~@ z+pJ*Es;OqxLhMJMsnaigH~;l03N8N|N&*c_CDh3R?uto`VA~GU(EeiefO=jy8A8)% zHZ%PY`mNCWpYXz5;DvV3$EKt&7JBc}*FI5#ms>6N1KZac-Q0`6S+~91s26;F5gQO} zU#lUZQ)uD#D6#)LrTRO+-tgGXK3knluep25V|h<{Zg8AFy!_@RkG=8+Tb@mtC4}!! zwz?%o0BjFJxKwT}k{*z&@&tm96XNomiyT<7>L8V1wilOmcbl(69iy6zmX4@qmBvB` zP>#J1lj%@QVV%wBExz+Mqg1A!Ar3K&1A1|OkG-~iFdPg-z|P}2y?&@S zyFLz6iARa>bYpB}sXNn4q%fr(l<_|kSB4b%TvACa!U?Di}6?YCDd zewbos)=in%eZ*cbe)gEF%*iXk{JnI#TsWy}mQ4zmYL^AFXm^)ML225tc;Ycv%j_$Z zwrHYUwlTYG_G0IfGqX!(y%G0cbd)4}G=%BmRC7>Et$UCRQ3##+z(p9Y&N!zvgQB(= ze$m4?wbJ0Gt__p(tvctT^RrkK0mnE}4bmPSXQ?=?8=(~%9O|ayq&75+6W0j$mxRBs zDktBPPxCJRWa3#?!c-$5l)s>k{H3b4(wSg{!%bJU#bK<(xf-8bwQ2Fe=vb;&dQY?n zkZ6#?O!*iW+q0u@4UR;UL-=~*_P%Y_*I{;(Ml39K#blwXqF(<^ zecO6g!&ENaB*;TRH6UN8y2_g%Re3W441k%z5e^wN2_cEtJB7!gV1nbO;ROJngz*H0 zkZT;)OcZQPHxU{w44S;aXo~(RB|!9G9IgcnYfoHFo^&_}Xk$o*NpA0i!og@f(Mm_w z!9X%a6ueN-it4HrO`#_ML){G#NgB;U1%03bYgCX+gK|%bEYseo*0oP;E z7*2ihI*KKFh}wcPKFVNCD!2Q1U<#tP8D#`DOM;{!379IC?Lv9MjG5v<&XD2%XnOgi z%`SPOuQ6kz)#itM5VB{Sirz?ZzH5R>BbYj^!e)*fX6JUOHV8IO`^p4lDZ)+VD7Ssb zw)MR`xD_L0J*!l*Z@_S|A*gPa9>&?-SqpK0xk~o-Z`wlVI@ZFy2p9p6(sGyIHa)X6 z=F%vtUwpDW$>4L3JVR-aWiJpKL$68qECeK{PpfCZDc2C!QBY>}ksR34vu%4HLjhM) z#M5LIQEQW$$^O>czs*>@vLB4kTFP)UOVJuDF{b2CHcd)x@`x`&PLUQ*b#iyIxE1Ck zzH6*WB$n*uvFEO#<~h5&6medA#T2z#>rlEA)@r)DbMRP*Y?Nag@>l^6VxDm=5vG}AZ!RdE~_~zwlu3oDG zHhF{B-X8lyC6&s=4K7-=c6A1XYUL1cjQvcINOT)&7q_usfoee_ehw;Huql5^PR<3A z8okQVwA2z(=u__GCN|`EoPttX5kq=n5=bhVg+lRdK_nlElYWgU$o?A5LmrZgH`puY znJSl((-~#qM4o_W9&|h?YhVG`3@#P*Tb*T78{vH&j2#FfR*kaFila65@(Na9EqIY6 z)XX1itRI>GSO&l)d`6Ifskn;&NKAgJ9u0vArw52=`Z1%*C>lrw<{WqLqG(qF~j zw&&F%STsD$jTUoZM&AR5?l~~5vNyvyq<3S__U!`$?f&j= ziJsJMPHg>^dwQJ#>-zX+_~uK1wdKpPhvxEP|4*DHr3Pm48HF&RP^84=dS`_=vD8_# z2#VJM0ydZ!;JF%5<(niO7+oOHM1Ej0hn-^UNQtQZp?&5KaEa}l32TCP4(6OAzYoYg z7>Hq~5mOPH2>FOYcNpiL$4DYE7Vqxpz?pHJEbQ%(V4`E;yt$nVy`uRCb|au|G6-N< zP@uN0NMm4kT0U5pW(Mk0wXyWDWPk*Ux{!;B=0@+_S0GM&CC|}n6qR_MJsa+u0}4Ha zzGe-t8tJc{owtdvo%F&lIE8iNL#knFTv3&Hc&(#Ej9qpYwHS1!-Fc^0&z0a$Y-&AR zM>Q$}Uv-t+F=L|s>#mae$tKF!nEA#20b7Hp`5`PEuhu&Y78<}Qy!9lSB%8+|a$>ZV z5yQ3@w*kV1J@y%*bFqC&gK0aGtVV0h;y>d4=DZoxa=a({)X!~jwPaNR#ej-)ycYYT zwz63m`B}(BG?kbofpZD3~m7P7;S81a-n6&QL|9% zN#9AM+87d7VUvXv>(r}hDPbpG6-Xc+eacz36|S;0SNJF6T;rP7L!QORga&8fG1`Rn z4Y1QM@TF9`7ILA+K8@UL$#iGhSE#gDy4h7Dj{PprNxU$B3AJqSzH4NMyb5BX{&83R z$~3geDKlMOjCf-#Ek+43dnOIMP+jVetgke31jR+|^|q?w)MAj8#D#y$tErZIMWC#a z7y)e@D2k83iMgqmpy7#;H8GD0k?pyYM(V-~H5 zo|TSrQM}seBpW5rYV?3XsU;)d(`eOH2;aT7R&l=9=@iBHI7>v`vu-bvx)F8Mzr_Xt znvND>8@0_AV^4cs6{-uO5$k}(*=O_0#CgBhd9!?tH746&rqL9HSNQ~trqR7Q$1UGq zd6;MCAvGBdbE;9A$Fnym0#zy0A)^p-bosx3J*|@8Y`kUt8EbVz5Bp^-dSX@3tes2h%bUn($S*D#V$8 z^14gO4$4y&*Jdx*?qV7hN8j$MqG5w1Wyk`|S71aN84=>XA3LkWrI&04lB$gAcM|R~ zK(TeYt5lrWU@I~4ARc zbp@F`6GU@)4n}g~E8hGS*2w~<+g5PPmW7w9X7*tIp}Ojlm4Js$*Ns8v12M`C>vi?Gb4x^(p^m6nyi_LSED%u`oMhi2D0 zqo#p}XSCD&sb&<4Y_l<_Tyr68586t33eswtQxJI8S(m4lO4}7MN<_;h3K=nneVGW) zbxeQVSY`W?I;Z<(|yjn=f9Inml8brMB*GQ5(|xvGs0oB~L_ zOF@d*CK)++iBgvslZs8v)tHYwD>F7(e?6=ctyb|l++FBd+RsZH8Tk)kZ5bHv|~?l0rQWCnMk{;=&F`eNj5c5oZ@V%IIk9fL2ddoouZm zH&2?(Z~$hTZRhcWAq^l8#+Wr(328A(bhVKfOYQO00GhRxMu8YGVMD=FJf-Tk?K9QGEAxME|(e|;Z^I8a0VY*ZM3}8fGobJ>TQlUXxlg;8-zcSVn9rPGt5e4i;d)*70UjNI2r0k zwEw+x!40xeu8xR#Y!Wb=Dw-UBQB)ZoG**>-#`GC7f6Ji;2F3X=+N+YhazK>~A=y}Q z=8f?+!EkU5Dg+lw=?eTa<1`~Bvv?Z7ubM)z@x}<>gl(&9W{rVG z`C5Jl!dS7=&u%TjDY!fe8AkYfSfW?Db*L=)Qny~W?xsylTxr%x*nvkz4veUzvyj$zX^c;iY53F9J(oR(b7$)3rKf z6K|rVjL0+J#G54;+>NAM^d}J+J&DTbX*PxYKxdZZm5aMWuBoQQ*Co+NTl`YmIKv$D zQ>Q~ecE~-&dfp)(ecVNSh~>upu-SeVuXR#GNrG??m)>oicEwiSq0CBdIj zR(8(iX49h292US=pfJ(+Z13r5}jZ9+D*ZJBF*&-M>-Bq$D2!W!u@N^eTdIk|5?#;p~dzLIidNr0WRi&IOF!fnk%TQJ6s(uF1fNpe(- zWA6x$!wMCcY%GQoJ6I{Bj&hnju{+`Lirvne2!>u^*?#Q+qNcRu8qDqdb^n?kRqh)c7;Ncpc*OKtA*EDlVZA}G#99Tlon ztoOmZ_T5>NM7OkM| ziRc*57i_3>VF=}&0lg7X5`*ARvTMvWkyHd{y>KUx>KA78=w(l%*mA)=U7TBQE2sa% z>BaxdD-=`_IjC#7HafJR zso^jSk0TvOU5kZEPm&@>b{*>MJZuP=BMtIw(Q-7~h?esPgQEY(_VVTRh73vD&ze#Z zd`YoBxi^sN88dzy_K;Du)Il}nDeF@%XH98(ksvv)cZq;6zhWK!%2FUQwFZ`#v`;d} z%cfqXNlEohJo*h+85ydJ(nUGTuIY`zoqm2lfNfXYPyL$?@)xGKD)OMvZ*?KdH=Wz8 zr^1vFNR~6DfCfp&5d{P0t0vCiHL$v;cf*ctJ-zT#+17v4`Zaw6{i|>2>)k;ITMeTB zD=-~zneaO7z_RRykKyQOz$KeXb-p;Q^Q(2Y{`$@2;@7k7`t8(Lsoa1O=kS>@l7)MA z<1ltC-@(BYIKY(SAI)=58>U3mJN<#!Uf_fF12H5cm*gqW@5<94F@+&9gfh|j2Twhp z(u=#7INUQWZZuiDV4_{P)(GFtFr#nT>~KwMWbCRVkd1uKcmG;jWzzaOExN%%XDK6h zC!hwQvbwEwc-|i8EZjwV<&EaiuS)G|EC>ugh+H5iA9U4<&HysnkvYG>GAObCZ*VWq ziFFQ#IQ690GnmsB|5pXZD=z)O-o#AGn*xNE6j<3`B&G4>;R1jTHLKnX?CAAG{!_9Adnlo6Hj|RvnMZ|hKLKt?UGr! z89W0ccddtl^8P}b7t$3o+bZ?UkL5cH>y0I!HrqVvO`J(y4xChzGAr(|EupRKZK^54 znP;cm*2;Hf;#23K8fh>RiSvJS&8kI8N+ulI+?k^>I}&vt#X{b)566Eb87$OfMNevL zCsA|$C`N#W%`lKFv<-8gbC%h$wbjhMscf5$F=v70!`?;FI8yeR^%-zgQFOrpO+2CF z$o5lzaCzHO;Pe?}#9P|*$|icB$AKmv^=e=67Rd8y<20Lhn&sleJM-Mjd6ihX{Z$V< z%`G%k&WGd9>Nl7GSVy00HM0pPXK72=nK?LEcf|eQ!}NV%pUums%=O@4sdgm~jv>~L z50{xQO1BuA6IRuX^U1aql56r308=8~M8ZfUzv`O7%1B`fEbu4R#(8(Ziue}};eyCh z!jmtw&*e$Ko+7h6gCXFjQX=mDex7SdiVE5P_IeH}BLz0~fn-6p1}l1oK&J0q=Jx4t zxnt@~=*VVa6i(p{VLgYRKa#enLk-w5(Yo44HvGBS<`Ab*U#KOfq1k0cRk zw=qn6ReAg1r5^M_rr%EBiKge;W!dKMWlK6~YXQu@dv*LJMxCd+I6Iv^pHnA~=UVfMLJ0s((@|B=4^>yoT>=clS7* zu@CO!rGmRriH*GZ`|ve$e8^E*jIGl;R(+sWAb9H_(OBIipPo5qui7N%5({4fDP29l z^k5HG-sWtfmWElfZ(DrS;%#O5=Gc&EjL3XeTfLx?ETUaM0fa@~Qm@UX-6M)*X- z16c8wou+{n3ben6%q&<8qwJfGOJ1tyrS6)J%%(!N^NVfU$|xkQONp>^froaX8T zFXyB8od)>QwsxB`hN>|shECfPvWlv=vS{kJ6wKJt8U@(cj5>2$<%tZwFe(Kcx^P7G zY+h*=u&MQF@{RvOSX=9I!OF?!C8%QSgRW}ve6Q0h&h^7s!}6f&_(oVsXx*5e(WdxF zu|IPf415qTF7>7cDEhzesHwnuSx<+|6xaycRV>)XM5{kDSTFwkW&6}5BipcHFo(pA z%z+6|ioq!n#Yq1UEKAoj!RZ{QUnD*dMG0@;wp0Kpb5p55%3}=~Y-$7#8|@g)_22|+ zBuO4L*dUO%dZx4b{JEV=7Grqg8n(imsyl~m`P43 z;efdOUT4Xk9b{}oFsdb3bQp2Uz??KuVHWUT2w*yRh7HshLSQ@*#RUSqTchN$VO+&& zVT4dJP>s#E@HB=te6G?~?BoJs%j5Qnq&ghoH`Xn;++g!GTh8(_f6KEyj=p&v{7@N| zkS|^nKY7qrH1|dcGG>-oIEaY*!MtD+)ozr>PRfT={6yD0T%x9iN+YS9!z=^bg^!j8 z#-d}B3XZt`@KALpm(Mas5J$}%r8FVw7e-1~2l>ojIY;r3U+>_F9hQmbpLDoy!f4pJ zPB|N}ZpD2|F9g^z$ul0j6nn>m*ge9atLB}Tmi)ggU?q3h@?G~-G4(Z zM@hX|(2_VJyI4zh&WN-^mdMG+Y?XOswmF>E0-Bw=0nqSFA?_Mx`eBnG_(U`;&Wt*H z++0B>!*vJwlHMWR*HbO(2HjI+o+d6F7e~KhuYn>dqpoP_$z@NB?TK%+V(V2mRmg#W>P0!)TO z*^EO3ZX>QW5w}*c|8&=LGlhrTJ`Rozjzp**l|^t2fUNO!MkOAeVlQKcJ6B>}X;>Km zr=mHm03CnUUgN^jqqwk|Uw~1v^8CaBn|ly!|D+_j-mgz1>XC#zicw zJQwmr;0e1{mRXX6O~k{e-P4B$!y!L&KuFGk?YK=nvzJgLG(hU8UyVf`CB|{MpBZFl zYEo+9baxxX*CcFR?y{bY`GGFpR8P%gpU_0tb{kEzPHKLTz~eKb;m&L=4fSqZkE7F! zxnx-k_JUcPK%^lv*+3Yfs6)~e3JC;ByM4zR==YK&6?sfPye_sW++v-=cqVfCEPTQ; zTw*NNPfhe9BY;bc4cKNjSxZ?Oz}-o#p277FiZB#KQU6U>h0GReS%2N#iVP($Q5lPl zelxF%a_snAGF>RA&$(iLouhRwIHeeTKusSxIYUgrzbK7K0F41SK*h1{;roonRE^~k&#H9wX#K5L{WtDd+qPKUl4EHr4FZZ9CD3oRz)qFTrVsHD+Nsh2 zwuAcyz}s;Rs_cU75QD>e=_n8(!nsR|%d7LMDV!SK>Q-k0g?unDn5GaI=-#BTMWFJ( zK9<29;1e9mAaO~=ZV(tX$SRjQ%?0%+rUG}=%a1y178uAU+O zb*rd4GXqUj6~~ddvnPUsYJ|Ok1#pBxS0+7XMQocLm_tU?cDc#IuZc)D8|Dqn7x6qP z?r{Gb(G8SFH7fj-4!8BF*YGOFLg2t#Ofs zW{vxkp+WSC`@W9bnBgMp5x0NErK!l6H+~h-Sd(=nE|1s{%JqJGzOqz4d|RH3+^diZ ze=rk!W;6}Pst`)bs_`f9nkNsZnMLzRuyZ&_R^t@;1ZxvV)l{sL>>+0`%{1KfLrX_m zaJh31p&>U2Z@vMTpr9E$iVBLEsg_HJO#nnjyib$2$%%94JqSmJ^Xwc|h~S*OJbCs8 zKl8XYszTIcM^K z5bso78$klK0CYwrv(PQGb?HOYC;F$@E0a5-Fb$CTei*F3Egl%=A26cDL#7-^%>$P3 za3}^%QO+mwq0v8FNHqc371PvJ%&GEf+F6{inIi$b@lH{dNy61d6*AOssrTY4XHs4> z6NQloq*M$_QnEu9wMi&NdBBG}R)awb(=x3YOf(d=1(}Gyu@B{2y7s_lW~4^BEJIqe z3}slzIzAS_C5lHEIcqB=culEeV(bBl>cxeVaQ)kT)Kl82Mj(Ba%oSl-dl@!DI*6*N zjw3E=%gC4^Wua3WRmo+vb-h)ZrHDD>Ei!qSdR=tS02og!(PSF@;fsj8jhv`~!ePp- z!jqb$uh<%%C3n}Sf0kFo*CVz}4w%J}hE3XH>r_Wc4f~==iHsv7=tct=*#L(RHj(Pu z(nn#)*j+@&S~WU8#s!spCU0KF1qDOi=_ZVmk>f9U+>0y?gPApFYN3;kmqW8D4B){t zc}};&n7B}hvzpG??t+b=KwM}}_n^}@f-Z_B>r%>(N`AvTS~8&ZKzwE->0-Uvx~FLK!S&ONffRa6KZW z$ycXTP8CgBsxKLW4L_?&vE>U6pEy-(%g>hu5h|hOxo7kQ2S=jm9m=*-JcL$on&yN) zfLT7ofF^bP^PalW47%Y%8FBV0R}CGMA)1sA%G4^r_=u3jnW$}gt#ynHJ5Q;hp@}2k zchriV-**&?Q=K+vz5xbL)$s|NyB$`0gFi?X6&z~UZ~(!lSF%GaT(-m>Z1;*YYhW1s z@P`}-Sctl`soOz^q#Ua}F`_5nENOy&B2EOY_olJk6l4GP3Qkfj;oKjrNvyTQa*KC(x7cQ=JVC4woY zBreA(rwd$s_3&4wi@QJRa4c2Bk3(gTB!-*(>vrte($Ur4sm-E&a*Chvq55{10LJ6J zP!MqqZ?m{inXWK`zlG>pW1n8DdTOMX>gK;CzVuJ`3t^jjCoP!Pd4JbGCUYe6-d z!bb$&nW`Cl-kz9%#2*Qg`#0lNB)<*uPUb-$UvWnpCfZphU~pkNbV)iC8>iT7^v;E@ zb*V}J%gKX{H6Lg};OD7}_5z=^Q6X#6(+`}s2NHjtInAC%u1?BsRjJ`hwl8!$>?1?`W8=#XD|SvGrx0w zxBl=AB`ZS-D1&ft*&dC>Cgg5=jLvJwOdP=G9I}$V!ASrOM#rJelKC8(+Aw*Cw~PA4 zo)YP!{DFr&wbK(udpD2JZN2128-)T(JW6Okbe7rRZha5T)t=G30=wV8RJVtBnUMhL8! zy=-Kz#y~7@;44=V9;5v8@EWP729N@^VFi0xw=Rp1!Cs_Fo8<-=LBUwVidjP)vxb&+ zP$^lXWs({^mna{f74No|Z=R&QIy|NtW^n-TT-Gr%7d_$6l4V1o0|sb35Cyb<8L}!X zkon}8NG6U;?%XIlkX~Dl`;m`_R3+!S~8eb7L zpNg%4jon+zvn}ss1(jQ7+YiNo@H{KtG%MarA}a@_F~E}A;6Th=U-n_1&#MxKZopo~ z)`oiEdfZeb&*lwBWG2H@U;xDgh|Z@S`7;&#*b|~NQl||Uboqf$CVK9HD3);v<#y)+ zh!h%C8t`%+49K`O8lI(*%WJ)5DF8^vEU{p?VOa-oyDK7Wc6W)`O>qmC(ARX;R|8|e zBN|4LWv~GqP(|y-D*^9pQr%{z444tPyyAqLw_333kgkLiW^B~-Pc10Vr~MpRHO2ma za+Q-~yMq{$%xnaxTuH^-j3w&tGpG}q9fBAlG7y!OK~mGxthSifZcH)FEnCAV$PMI~ zlHF-+g4vz&-y^9fpRMH^he# z!VN=@LU@C*2#xnxcU0c`Z`nxKibm!QSlC@Fgl(O(w1(A*w4!n{c+qZsb6$NuFwcsK z=$YXt%hWmkVmUe0Xcn5dsaG^ul%Oj~OI-`QlLn(r1HRoDKW@6lnOmY;>*^Xiq}>#Z z4Fw{BR;>rAEx>r=d>}C#YZ9moRQtdzphLunlL_N_x z5*kAK^QBjToBFV{4%0qCs5+SpycW2OjD|Hia@B$wRM#x@n7ksYGP=BSU#(hd+S<7& zpdCfHMJUp(kyA&m@g<4+wZNV|gt$G3bPvYbFfWNHZsevZAHv^Y6*D_KF(s6@lqPv3 z7#^D(TVrU6h(^w2*Zi?V>61CPlio;rnVDR?kp8n2cAg>fI59e>Lb>2&aA60Cg2AY6 zWPWr|Q+Q}{paLkZx?DK8uxr5*HJT)bqmBixR5>(C-AVj(!`Uc!g~Hto=WRxH2vQ9hHBw4##V+39wjAHt+ zU>kOXpq^-(VG`dKMV@*%ukoAKB-}T#ekVnBYIAC6P=p7#)a>Q($Tnly4-cpF0CPgS zwS_d@!!X!@jf8{4iKU7t+Ym-Kk|f^31d&!kolkUYS0;JQ0-jX84T^80p1QSp!BMk2 zgRDE-7tveUMRMZx^r2Kdpg^uGYcJOfGRuBa@Mx}JcQqEuT*8xD2ADt4zgjwRlptbg zBSohh1QkN)syQqks9aN%F(H#1WKG=6Br-sA5@@4inhb63VuD4DQQ?idNaI#Sifspj zd-jDAShg0{!84m^i@}F%9AdwVC}5JB$;_%WoU7Fwjox8&DEm-cg9wV~DR+N4YbC+y zB&p=C_4>z^UgK)Rq4l3uqno&HJQ@yx=?)GKX5&qjmSerf!aTyOm8Hn%p|*oaD2*in zqtm`NdO^7_YmzAjC21+OGs(pcW)2O36&tJp8bOM#uZfBf|H>=Nq=RJc$;lu-s>WzB z>rGNEn-Wmq?+%UR`$^rq%1Yb?28vXss-gmf)|)?KRn{|SO=%uR|U=fJiPLL-0% zB`*B4yR__@h=`HLQ5RkplDm|}N>Q2_~ykyrr{AcMkiDg2uMV-R#{BVjj zGmC^eG#R@c=}H@(l9Ac0R_j_Y39n`8oxSuk=-uS6BtNtHYbMF=C03lXsKHVUetm^P zXyOX|=?L$4dY-Y>;O|}1#LQLOSY_jO@Hr>TetMFlDxvZjC5tW z<61^W_SpVmyScKi6;P zO+-sa+9cDv!)noxdTt^7nIzJW?1>Idv|^{*IuvdlO0*6QwT_2dqv2L;dRn13j?8Tx znb$fpzjb6m>&U`ZoR7B-lGg~?k6PumU%^Cc7@4YJYzjr-5YsTu*X8XsZ ziC}ADq%|>gSnV`Aml~Qx=h7ny@<=(X$P1u`17q=E_h3@}wN!n9Ep8CHKX!db%zmM9 ztBUj*n*(4r-U?G9nbune;kqoL9U6|b21i@vmViKklg(kd{a^(eAqS)_@f)>Mh$Q8^ zBjM0tGP6nTN^+qiMh}UR!_0x8e(#NRlW z`4L8rNcyqT=@DS{$oM?dFkl##w8L=b8%m6H zFIfcU2BU*Pt-LYLtWAu{Txzi85+NzJ)RE##%V>S2c!f;wpu#AYb;yq}5iv^xx04*2 zA`~>S@fll*OWJA0hF^MWj&F2NE7-M*44-Vv6_+)nE+~G{k-u;m@6CC0v%FzeTw0gu z-3qg`ic#kPg~l=X9mJbO&u&Lu(rO7NKMFKY+s|em+hKErsFR><*ovuIEphb4;%mTO zQz!{uv3CGx0D~h<{+T=9*s%-$Zfj|rNg%0?;0m)EG3JODBc~X0fkM_M`eyNyz`hf4 z52iC<3IxNCX05pRTSxg#R0JQf#uGV@6;e&Wo+w?Y{IiCU@(9W3B{=?BVgA{qGL{k+ zWInK>7aiX9@Hx-7lyaCHx8(vQGtUVOLWsP*Gwlw{x z{K_rKFS60$rMX~I`1e|XvfXd57U!c*Pl<6u0iU!>cM3DRd!^P$xj8g)slp%QPn{92jtG%g^W4 z7BiTceT1&u2iLK7k#g^&h7pTmN&aC$2@it5g5YIIvGt?KJcqD*r%&QM6O_f1g3{o} z5k7?)N`=R|HqGHpB{z`FCSii3Q#uO<{e(Fx%7gM#0{6-iN>@&fE}7NW=C1B;6Q-nLhopbH)1w0W zU?d+L2@dkPHdrvZ<*?KtuRSPth)E=qC|KkW@i6x41A_xW(TTV6btfj#ONTfr5Qkk! z$#%eDL(*xt2ASY+%4GHmnF`l-I&=z!!}_BOO6Id4DLZLW-`oLbavO>UxiFozV@6_tYRY!}qsqFw5n37AN zIHC}?cG4fT{^%*Gg8rhgTrNV%UFi>A-m=m5p+F27@Op7W2Qfv}W(U^QiqsE72Ew`L z;VpS31-+CkK86UQDBa8jH)7=2uTYwXn!X-I0bzaBp(=gL>M}9?IfvIJaiX6+Q+7Py z%&)M_H<-1FF!t!(YG4Uqr8uQoCK%&0R2hc{u7P>O`Jd%8Gz1J4R5!Gi4oRVOh^-&; zPPd@D>(`#DMI_aX>H`C7>H5t9TD->J&@!MTghrc)kVzCa`P==J6ed!tPl*+XGym#z zlpt*)YZEd?odsoDfqDcAQ8r}deyHR-Hho=mSw)Cot8aIgCey#0A8FTU{A)}gL$2&C z5gkWbUMMisVY3u?^e3Rl^cYN4eFgKOch(x|TYNNJ$t{}$C7|I@h5p3RA0snY|K}V9 zh1@+N>^V~~W#F4$he&MdHa>xLb)&TI*dqq6Y~&V#YkMe#sRiwIFSy~=h?FrijNww7 ztr~VsFU~!|F=r8`AyEYZ!N*oqfUK^{GqZtK7sUF{B&o5=wEu#o6XfgI>XQ9Vjz2eb# zIW_=VeX{enXY-v6xAT?8|RgK-^0Y+epdjV0Q@8a&ey5d(x2(G%vwIF7tT$STfU^m@ zERHhvI>n_ncL8$XQACL~K*i_)8yG|)28McRw#5E_x7F$S6XhPWF-|U1wnoPK$ThkvS1Ge z_4;vKm9);`5@T<%%_3LrD#L(jE=o#gL`@+o7IfIw4mYI#Np}Wv>bdi~HY|S0esU=_=~t z_A%JZH~`rdEk5?USMnWVQ@{WA>YEgNS(UKqCKpCp4ZF7CZ`h?^;_D^Ms1__12$HMp ze2f~Kx#g8O4qxK3m2l3C`6>l**(dLka$wj^dxN`nA>X{ag43&I ze8*NRob|obtPh;Zya%cYL5`V)41-Zd-ycDg4dqP!bA#Ir|1+tr3EycX3*q;i(e0)6 z-Y!^LV`S`E&c1o_#{d(uT7WV?@%dMfJXjTlN{JRDaz(+bB0iEFyg@uh1rA@#PA4&8=7i3>?BM;Kh%?61-rdhc26HSgl7n6()FB=pSjY znCMU4Wy3Tlk;uU_QW!e&nZCq>1DY552ZZQQoZFYkk2^C8w-eIKZo&* zGU1YMwx^E49|$2jHb_eYges9B9kfH@*pJCtfz;V`>VwgI5c!U=gOuzWi-r8XQIfJe zvuh}Me%G0c&#Xnv#R%s}wLXR7oDiNgr@*~9H4 zKPJR7nIJMVwqi4>Ed zJo(?N(Vv`?P~2=3u}Uj7zd25Wmi^ekvO_&W@=Wp|c5Rk4B?JbA=x8=Qq|I3x9UBS2 zmpf=GmCZ&S&jy=kSHGmV~UJ9^qEfn5CRwk#*M3} z8g@01*$E=6m18X$IvUyu0o(^n8iNRYkWqFisBnk0X=MT?k@|(479~^!0By4nvthAn z@y1)iMy4$Oc@VmN$_8cFn=mfCCrcEdLT)bFrCDVz0z)E!ImS?st7Q*%bL3@Bwmx`l zMN`mY6zJ&qBi?2&BJ9+TR@67y%G+SA0Q&{#VT#L=0!t2=EUvM^5oI^Pq_q3lXT7*F zfk1I2WZOr+>>7t2bWesffT$P~YNc6g;*G5(dfDgzdgrlf$<&`pI#$=OgVGSV;sV)(rB~dnL*=`pl=}MFL6&@={6DNXWEYd6O;+a?;3f-5(An3<5(YPpNkd)1`GaJUrqGQ^0#AN{8h|xm77F z`cmx=(=;^>3nni{^CK%A`LxAayu4$BUW^KW(Z zhSpi};?`*rE#2?S>fSQnYUbrdDm*YE&bpjaL!*$R62*@rI@M6zlyVHzR}xF$kf+q> zc~rEpu|2vTtDEw{E|Sa&F66kmD~4cZ#m|T(!;;Lb8O&NSaQ=%_+ zEzfE%0}4w2VXCfKNfGZ4dS)DdC9icZZE(5ICgy{PNu*q6t(FSr5b%vc%_zjTED233 zjtJfVkG=N*kFrYp#;+Y&y)m7I*(6uaU`Ty>7=9!X!y6^X0|8{+NIhi@nIp;a$ zKKHr%4Ilx0T6eo>8{k|TATeT@!`ZC5oQoJ6@Zf>7Z+1>#xToOf!Tkn5<6eh(H9Nv~ zCHOHng&4v=K=KFGW`F(aBB`$E2gUuzj#CiaFM~&L3Eo6otF`$ts_dpY-_sx z#&zaqyv`O2((ko=h#~s@+!!>i##&)(qCeIlUy5hwllvRzNI$m%CK-sr0`>%(#Zh#9 zr^_Wc6%k3t*M}$*3`F4c0^cIX$6*%JhXvNb(m~9Arj3(>nf$W`!~D+5HDGJj_*u5# zAOKX^5Ldcu(`DB!uLd0Gjkjr$FN`_t44 z+@9c)k@Sm zUrAoVJxL{#>{Wi}240b}uYLmpHCn-Zs{+Dd2%sDOAHU$Cs2)||weS)9hQs0)81fIH zr9+5GK!Hd*G?UMKENysSaTKjvCIZCC6k&{1akyNyFgf?ha)c_)cSnOB$V~GRC}$=J z(z-|5vgY->SR~X0qs9N296&7e7(ezd`5D+d_;&LRf-!hXl~^#Ib^xkALxZ0}*EQEe zJh6L`saO33E#Mo1lxLk`3PL=^d5mJ_23^0bWn?zvN2vhz0OeU>%)S{0j=zQ`T&X7w z23y4_R~&gO)tYZO6NKrf#H%v2i+7#Qu&sRY#E8%?=i=O0X1G5w_A?RZWE=Zayho~+q;l(}Vx|7W8;aXf#Z;|0HgLK5Y7$TOuh(+BuR%&_-}RJZT~FYy zFdc}8YcrtCg}fU!2cQa}3Bp|^8gn4P?qN<{7jvdg)l3P9=p&3k=-^w5BX=b-uuC%# zhHgKBCb!-jVNHMvZT(7#+f*rRJL_SX4Z8>qG|u6PnA@wFJ14(LsEGO7NGajQO<~1f z1;Kh@V?D-fg<(gVdf#m&kqWFk{bKlRamTc;5Qu45zMa4!w-{Z5ShD?}ftR&zK!kqC+j%9(9d*IJxOKnKVkFkDR! z7pv!k7@7rFi^BiVUZ`vKss!qt;WX&;bUnUOn07%xV66h6(YFWzv-i7?$a9K?wB&sh z^@tcn$%+FZj1r%>4nR~u0ewd6~sXcv;p0*d^lYDa$5 zpR*Xj(;FVpCTMyvk{ijv4?zd~zhR1FsrL&bENoqKHjN2hJtudSF=Fs?8pq%b=SF)n0@0<+;l6M#|R zE`W)TyKDc37)o6dGMIMOg{12ObZAdq2yD)73kkEi$aZ^3N^Esi#ko~;>t@ZYKHn>t zmb%=yWdR*C^M|(xz<`8Xs(#IDnj-8Tl%sjrcd_cc|F829EWJTsefB>xwc#Kt<(1;d2`=| z=j|>CiQ@*Ssj8SGuYjN@fpd4)Zen*rH^X}W;RWP?;h6+=C~w{~&N%oL{x`@Y60{JT z_;CM6ullhC`iU2xX5CVQ-VVmjw^n=&Qr}S^4ZmQ(cRwTK(i+&;0L}XdP1sI)aW&i( zeZ@I!h=&3>byzjZG{b(2LupB2_2Pr%oN*g1F0<>l3&J@E`+O0E4Xmi>l1b+PItu1` zA{4kt<%NqHkDEljwgzEgI!<`ZU{2gl9CY7A(KSq>xL?5&OVb6mvkd6|JRyS==7Qc1 zMMr!FT=gqC6ffMvmJ922n0y3woq?s`zTxE4fcIjQ;_VqSMNR=7KWd8!l-uy_0*p@e6EsAy%UrO>K(2|IQ;`>vNC~VsnPkFX82U`;D6oR7FImFZg&p)DQ!=G z!BUzOEcs2xnP5uQ&Pg8wb`{fnXq>8>X8C;K`0XTyezo%!7t+gq-JJ2-v*lfdlSaMHa$K> zY#v{GuJPU1IO0{+M6FOX}$8I_;KP=7^M3DW~RhmRCmn=TJkuZw% zi}?NT!jOF<3B+91`GF|c%TJJFSV$PLw7r0(?V=S3RUWiuJf8{FmOU?W(a$JS35fr)8j87iWk{4bspO;0q4zpJfZONd; zc=%oNkc&KX|GySK7X=ERDNd; z^6|v%HsZTd`5qP7bpn=?ABs`u(Q_^%?<^SwUku@AtF(n)q5h9bgw2qMTj=5w#gJX| zII606tLT(nZ|P*0nLnmb-ac~9zFMM^Wk(vk9^U0>?R6pr{725P5MLwC@cp_PACE+k zepx_m4X1%Ze{^y*M1Q?^spcf$8@DKybB2{Fvdjx!V}?}7!&%0MU3sH3+d0Do!fT?X zH^DJQ%~xaNk&is^UGpH)40_cpeifJg&)zhrYT~SOtL9Wx!ZlPRQ>Kb#;G=jFBhmAJ zGHB7ftA0gXYOPpY-ytn2se>(x*Q++0irr@1CU2S(o;v<{Un8UJ_j_b5Ouu43=LT1a z;H8w0s^OAt9Spo8=wj%gqYb#g5X^HPhZaU?U9mUv$CC+4d=P*oBM%DuG0J?(fEjNz zZ6Ao8Wr0|~gel@!{TPgO+0JrP%^Ll~h<=0!aaOpDDF}BYQ=s{y?ALOkZ)s`k2`y&R zfUvbJ;$nkZ_GIzZW#q<5a}Z>Rzj7o?;Y$jsq2;FzooXZB#v-;m`?`uNw+*?cISDVT z-(@Tb2tnIgn#6&JRz*SD3@F4ZLITo5P|-(vES2;j0r-+>F$0-a1Cu3M<+dI>Lzb42>;pv&aAz|ZOdY0nb`q= z&R*kQ4i_1qK*O`7&=NxC^!Mk)p$y8H6>yjtlmJ&a<`Hao1JJTwN$;eaiG#h*1*rR< z3Gm}GI(DTJli_OF&pCacBtKL;MNFaX)QT!GiX=uEwM6s``>B^`gsvn^b%9e8scvHY)2CfCUZc#Hf z$=c#@oei+5vKAy@Z2}v~>Ju6CvVBxqVBLY0&juU>)DROAWgHB9J_8c}^DezW4E<&= zkp(LIFbQ+2GM^V?L2JmO=NkEhHeX?jv0K$>Z-O~A$NLIzjdsYyIDx1?Es0e-N2J(n z@xLSp$6Ghq0OvosG-v9ac~x;2`tB=%hXvCurb7Gw2~+7M6{dr3dDDbnK&I|cI$CJ& zCL=yjVPYE=5+|r+n%-&)&GAZxSboa_AD@P)A|S&8q=WFrwB4ztg!>jt7*Gh&6WwFi zqi~f4Eu;4)q~fDSY?}1q5Rn=BRbxOvjCmt2!yANO2&99%l8BoF7gQ(GbJyFV9lqz3 zJ`TxxdahF@(ylj6lggjhLn8tq7lB47{RTB5)C=i2gzyyF?X<%Q^-ValVUa?0aXP5z zB}cj;4-j{oPKQchKXcbee2Y8+6Y{!INGFjwj)TreD4NOxFMi1(oX06+9MYSJ=v9af z5i0PiSGXxh*!y3)ra(@)_7l~m0yDC=4$O-ZIRKTxn z3H0Y{8S0Rr&Sl(`zPsFvreD5khV!Iisr?f*&4989c*@@fCb!x+D$CTlRjy94el-&vrwcQ}(GeP=JA zd0GzeK@il5v%=`8;sPzbHJcu z;*|_uVkI=bviwVtc^aHH;I?5q%;cE?q(;youpqZTj*-}F0G1XT3b&s9OLSMFY%8-P zpe6$b{#d)M^H`DR>nk__9sRdvI>c|5Nb`}5qqh^Z@bM7j`WBB-q#GK@HZNl=4d z;)0fs$fntnRP;dgd1h`D!jT{pi8!5NC{B7V&m0tw@ig>%2?WGcZ^9CO?DUYXXE!*r z#L$F723p-V#24~!DUZr4K^IP>M?N>4>`poeP8(*ZsP4^j!TBW;NLyq^MakfB0S`Ih zN_>Ls$GX=25#Xd3xzBPT9yKgq85WgdQNdPq(8;cD{sNzMmH4M&C!7bT>Ah@9{@wTHyd1l(C z;3k&*Hn^F;6io%W6a+b9o<0cZ*C7K&(BMTy4ss_tnl`W}h8h7&!99uMpq^xj)svG> z%W4wVYO^5^B|K@m+6Mhj#6n5lXFJ+M%`tYjQF6;-Kkzcz%^#A)Gh6Onm`%3Q?_BdNlnLqa;kX=aK0 z6;S5RojZMMO->-7lD-RCog6HD)0QXW^M3p|-A$ z!wLCeqfXSMEo}xuXNf%mu!)!z6&%cE*3t{$bSeO7T?1|Yoh^2VsI<_1`i|-t`rIB{ zC~|@YihfdjQg_$cmeQ%px?id91tkFyMO-s3u3z1b)Sa%<)h)~Nm$#N*49!Wy`hvD~ zh)0Sr!2;?2h<)piaquLhM16NU!ZIW!1(@k4{t${!Nq-l0D4C~~e|U+Ub{`)&K&TN^ zW3E?N^y9V82HHJCjgjl*tEz>NB={oo5n_SN4*cPrUB%O5=%r(dGs#PN1dU0S4G^9b z3rKKf!vG33U_^y4KDX{1*G#CygujVjP9gTK;AiifgtW*uB`M}KvdjOoKP}#^KEwVb z`Hzs4tp{wxClP9SxbL}mOt#CEnE$iT|AT`NC&ko)B@b9*Mp7ewHn964oO;SaV#B-= z{6L8{<03kzLy4N>lblN4fC*H-&~W6NTljuw{$SRM6`az@5`f7HW>rh)7X~%7ZVljSz%*xSy@!?z)Q+Cl@!eBQ$Vwv_BVAK*v8qq7v6H=NO+t zZ(@G4Da%hN2`*j`%=^r>ivNT_)9l+CUgRnbSV5{kjO4vOFa0R)NVq9lON_*` zV7U+`CG~Xkc9l9qiQR5PtjU6C7wPiYi*zXnyz_*7n1lVeh8GkU6#KmAkz|U4(ZH~i zw^3+dSWL?_z6&&-6)_*PZZDAY;z*x`7dAFr#I`*Xkk)PV*ij-=BF8rg3H6RZ+=>2- zeX+i65bOjN$z4+7Phr@X<%DZEd*Hg4Uko^FTn5@*_}9qI#Bivm#OaC&n4epC*W}AY zh|)>9vs`l|AhsvV%zkbM-eHJ_HzGhE?+8vbJ>{Ih?b z=$es?JOMSUo!Nnc2?Pf+s5}u8q*=uXW-yN%S|gtQ1ca4MOVyZur<`S3F`-;@j*NfS z(%o#P6!;S?GAkwC8yF{1j>KxwMwfLdgWdfKh2;KRCj2o5;2UfF(w8Za@SNQbjmu~* z=W-4LRw_MP{Qr5(sk=rj2=0BEFC_f#fN$u zirxi=cla>8(5OT}kH$R%W+V`woPurjq5PsB!^)UVzt)KF2#R!c+K;t@4q@|BN32u6 zlzX7UtIf;_;`K;v2x^{nV1y_T!r8p-1hB$)2z`?C+z?W;SlFO}<>#UM1tdi@k zk}Iu}8?2J6tdbk8lB=zfo2-&wSS6cowu-h`MZdI4wpt~(StYkvCAV88T~^6vGWAmV-CY{Caz%di>z8 zJ-@5BcgE1U>+FwunlEM8D!j&isWS3^0$ZNh@7QcM+O)^qKz$EF1<_=;+dcJnnu#__ zxyvl~Y`e=`V58D|%*FKeJ?7s$arc?yR9pMKH4mCLy5v{pot~P9%;y!v`7z@{1)q&@ z<})hJgLZGW9!JrCHRGbQ-4$~uPMylA@0@vO=bz=45wPjwedgJ8MT#1`iCsv}M%G6Q zb!7X5ZsI6syMOb9JJ0?5gYLYH+VvAB)viBlR7Rfr=;iYF*|qD(7G;P>{I%Hs6}7kl zmyY&*t@PKelyx_8jY?U$su*7@(4bN@5I?I>RFx5+%J+`y2=>j5D2eVPPh)cOpZn+) zT=1yB;K)<{??f?~I?0ejdq(jd^@A}je5bgCmVV*-n zpEO-G`$=1u8sMJskr8ekmI{s@lfph)%b=pHSk?0a# z3GpR=AVoG>@y7~4IX(NNxrG+Q+6U7LkNLW1{8Jb>)jw^Hrkec_2W@)6Eb59pU!#{_ zFdaGvHG!X8jT6!J-c<%s=kLu6sct?@=EQ_{D~P3YP_e_K0f8N8%1h=@`C!mNGoiS4 zX>IF<>NOh+*I^svI@Q%ptge_lx2}$Fa!xK%$Ix3R;(G(KkG+Ucq2Vu^$))bX+RBC8 zeBDO=?AW+y*iUyO@-d*BnwQON&&4mBRW{s=-qQhR8(+vcUm4==h*uus2rc%b=4;k= zzJ1gjj_r)^hoJ?03Tr}db*#RdbKA6_xGbi%Vk?%6K+ijubF4r8ff8b*o8woRFhm8N;GQ$lc?!+bAxRS zeet^4hCi)u46Je4pRnpIZ#E=?pqh8hYF+$-GiL($;mXIE!X~0{HXw??L}= zn|EV;9#FM8n- z>SCFwCCy$$N4T%Qzc2d=qj&#qZl!4-nr?dg157mJ1E^E;KQwRjHaY&jnMRvVVGLMA zoi6yutft;HyOS23FelQU6Xuq%8I^StE9O?!odcQt96Ef;97$;|dmLTUXQp)JwL9q3 zKC^@lG#If7GVIVYsAuFBLMg);_#lDS?D@3ub8{t6FpNI=0+V^@3ydDqA55=(VZO@W zZlS6#%{;Zh?e?tw()>uF(O&_=`@S)AL)m{1$6C(Q8uTT!CBvc7`(K-rXv|l@MO>B6 z`WlVC#*{pmSCvX_A+}i0tKXT|Dz=;_7TGHm;)CeHK|IUm`9`&;*{Cob5Ph)KVbDFN zOt5Bk=a;BJ52zMi60iMU;I5-E=M@Ah@1VG*3vheZ7qy2}f9j+9XFL{jm@qsRd9h zUtZ{N@dq?*g$N4T7vo6eOEk=x*};Mgwnd`-S@v}5jBvz6qQqC6gJe}ypJE5Ph;&3M zneDW75K!-|NJq4h2@7XDtxK}U({qs!n%w)8nI7sxp_yw|&^u2dn*Y;T_C)$B4)y>M z@%Fg5s^(>Q!v znP`u<^8>z`Y02y65IU8Km*0_S57$J4ql_ z*cOfv)iLt~s(lxs%gX+OGw^XTfDzv!!cdWA{mbOwQO!+F@8A*=bKQ{Wh__cGn6>ER zV4@>=1kY@!kEr${1KAe$Xr0ipN zwj-V%Om#%+nVc(uA7@Y_&a$0Sw!7?+vPSin=3w6-5*d1YHM7eM5CQYaGDS{^{_}}7Wi%oG#B=espee`FgrUJxX0I~2(`OpP zsiF3HRPA=81i=0wx81v0yy4*@|C|qA`GHDH3Pa_l+u1|FN%NpsokL+F-4e2mZKsF+PhG@YJw&=HRh(Xn{U05{xvmAUF7RU!SZn^Xy(b)p2BB3EpGeV_KNQV#D+3 z>Xl|)thYvh?Hu_1o+e>O?O6^B_<2j-Y||x{WM5^ts~Y zwDzz%#E|2pioY4j_Bjo$Yapv>r^-+@i#Dl-KF&W48F<~-8H~uATcE*iN4Rb%uVI18 zQcY;?gb3k6AX`q!lMyfyzp)q$zd*#jC0!<>L6_1XD}aZ~xVio^5v zD)T&rs#ch-^vksfFlWCARLaQ}xCJNIn-O-1IpAFmOQ`WBCiXW|OQragW|QX^E6p7$ z^~C7$2-0E1QTAH%8+wD3NGfhKPf};SzFzi!U%PpcLe)#myJ^>G)j^5%=1w|LZ?2}0 zb`S~ZQKR3a+M;RG5QJx}yVGWRCM-4Qs@+?lfX-g4-a!Xr^e71-Np0#2^z<`oD7FpJ z?+z`%#|MM7DEj$nO) zFl_#}l19lFsQ=9g@rF>??douPzX|rhH5WkUw|uqw3-Q1cwnjb2CSDcl<;3_;CiRR_ ztmNL@Ybbu0_318u`3pg;d^&)qZW0dKqo#RCkhVvwBy++PSVp5R+3!LYyXF^2p^% z`xhv2{Z^BDH>(#%T7ARx8}+iG-mSu}KX|!%KizSKn&8d0#ztffZB32M^=syHW=+^> zMh8m=2_0U9A=&K_F*D zvBEC3Q~F<^mk7CDbyD9iR2L=xLM>OJy`lPFsC%hig&HR98a2sjHOR@MsB2U=bzP&@ zf_>?`=0|H~TxZo<wIx@CZ*cz%+W| zMm0~qeK9@0QjMequftvN&=$b>`8TPMhQm4_`jcT}O@D}x6g$|8Zay@{f zTU45Tk8OzO$PQIeyIyIIp{vu?NKeupH3H-%AArBTszuX3oAp%Ma)FWRnRBPQRH5))7r7l2H4Rd)0{aH5~XDg5UfyK+C#i4RUk+3!OtJ)?ql2GnLHl zd(>QCZzdhM2kh889cl*< zcfd;=IV5AKIZL-ImGxa~*T>VLF*;^&zj{~7K%f#L9br31x9wK4>4&>)W(cB^B3Md0 za3HAP3vID679>vcm1naJMqH@xHwb%Le}y`jCLeDmX?ixV~{TK8PwG?S*IIs1wvUc8hHiT zu4>Sk7WuA+)Eu?rq857TA=R}AN}U>937oz|+yk&i>Tn_C3Me;(eaAh~#_<6~J}clg zws=C$x8*Gt;UT2a7r~>8Yvx$j2(}lg-7bb7Fe3%3nC6V5(bog~e)D@MH(ZN=XJ39_ zGjqHKK=~~5vvATzuYkfE+(H65?YS3BRO$n&Gdf$8Ad#Zi7Q~xc)|8$Im6Ut6dS2I~ zQ{(8pht-X=_<+Mfxsz>SRP-E2XeX85s8>?h2qT)2^%&|+QDW$VETxJ{h9Y>;{835* zeVV0A<)8mGAOT%E&XzdZ=TuBjzFScg+8%;bE2l1ik8$x?$_xmibkDvV<$yxX z$B?68Z=T{xX88nCnlxO*OXosV+-%93LoZ2>{HZf1&6+>A4(?oYr_P!Q3GuX9a}YSgU2xi`Q)m9j)5>$ER!_3P zo_<@TY?lI|yuSkZyjiRaa`K9ngL`XSPkV}$6puYYx!Oi&Ez~2aXEQ_xf?(OZSv5R6 z5|uk_8Y2f!MY8g&gCcviOln$-@D}(6yS^sf=_xo*dCC^J^%PYAJNnM|K<5;-Ln>6T zSqrBYx6(kZ3zXv&Hp~J5@w2((?uT&OC^1dU* zpS6!J#_};z-t}LV%GY8`ZRJ!mN=c$Osz9lIQK?L$gOdP-TZUqzw@g%Y>Ybz{#&Y%z zsN+fsk=`4wQEi-fgN|1zu^uHs$-*g5QM||cwrR>8bY&MfsOssUcg45%=}HuTi=my< zamC|XRd+SI4y{%|m{#NMv#XWmv>UfP6}9T&G0=-bNh**jD;N0$(Ys)|M`930>pNEAp7bASbkzTTeY$dRU zJ?a5%yZbFz{)T+47m$(WjHWk^VU$sayyX)(hSYznr%?50Xqw`&IaQ!E z+WHAJP4|8bv(SC>uuEGyjY!Y!C-hd`6Y`~guZ{3Imm)_xOi$R?`axSbgWgoBreaXp z*Nu1-N5{beR>6Lc)cJ30Ttul6 zLQ_xaLr5PM5+&!`demunt~sTT^v|aFWgBc(4+2#v!$PFX!?y1Yhky1I^{w9HTOM02 z*8j+10MXFz^pSG%uh?)yVe%RD$=_{uG4EqGBUen>)B2tMzQfi*=bFZQJYqd007U6X zwvor9j|gAG+s7f}pcA*IP@`ZVH`|T=Q=lVu<49N0=y0kwjWAOXR^VRbrp-5Ce{LaQhm=SoHJMpq znQRGRFp(41|0_qv8=U^R9!5I}Q~>H%Qg5U&)zh_9Pw^g}nrP!6)c7qxsqAxQsHY~z zSfS8!aYhwQj5jV0MDrZdPM0j!E!Sd%u1cuQK%~d|HtKK#Mzwa3u?XuFk;u%L;Pgcs z_G9g6S>4dwcnKZO!Qx!=wHmF95?b=5I-0&1WXzF$9(cs?9+(B6na-|_=L6Ogj4V2m zfQ{RcXk=-uIirI~Fy)^4Tex)z^KN8w3#0W(#@W87ne<$$VbX_5Mt-_H%kB&W3WcJo z*3AKW@kjp5$Z+RSak7ydj|)KvKSlhEg(Kj;kdKrJRNf23hZiK%FOx8~(i9`k{}zpX zlIUo%krfx*obw2xc|hyylZ{k=!xZVvghq|6%i2LJuR=UG8M;HJf6JiaJ-w275lc#aQ+;$JcZ#5Z`a&z(qWzrCO*XGLtK#p zak*NgzdOth>7fE6br2wfZ!^J2iNHA>_|?)%ea%1&yWN;t?-rws%mCw05ARBS?w z%*(r`1sQ&WJ4~nZ)*0c-fDX+1<;$y4omwl56#-k)w;N}7=1ySV@U`GU3fhgiY2YP6 zmUB2a7sr*qSPo9a_W*2D@ux<-DaOm$c8-ByDLO~hY3o7o;DbLxPtae7(}z2ZJw6X< zy8;h}hjtoi8m|#W-T;h!VyAIGyQk6aT}B#dz2J5__Zar>-9WO8R-EG9%$%&J;>)pN zoA#jZ%xTh-2DHa?zz?=I%`YfugU6C~yB#Tb#RMz}W0OOFxZ|$EwT=j(IP#8!hYd zA)FSunxLmXugM6dxi?}5dhRiXdP4UZb3pG-HQH(4Qsc^D-aCMgzO*Y^(bB@#Kz{zx zdXUM;H19?Ue@8slWk9?+C$*3P*j3Pn^RkS{40bg{U&2n+7ySh^u)mn1uC>MfTrBGe zUv4;U^woZdrXx=%dK?=CgLQM~OU98M!4?*E&7K1QYrtVFyAx>Kf{lr^X_b*{OQ+mM z!11va#u#Vjg#!R3g$|vgN7KwkaIjc5PQVgQgC|2sgaBmG%x+AkLwCSe>id<(v)P=! zN31gjz#KaKn!p{SSjJxTcQ0~^0uDv@F_hPcgEgbkSnAo=Xk^&>(SkhC2>R{4-4Ol6pXEmf36rP6C>?Y%6C{N!SkA!^8z#v4oa#Hn^n1XP) zW8@nG zq~3PS?NqDrCSO-S8&g`HjHYi|fD%gEjLCEnaHXfO&48HokyE&%wycGwA?A7;w6MS~ zimRk6eRUGKO27k@RRRrwIdIahzd=s)MF+^(Lxs2uAI&vJcz~0)sB~gIRyq7)eB@tj zYzPEzs`wV%{_7WmjP5%h#y@G780XT{8-SIzUjnT3_c4(1esGELAYJ&LI$4kd^sfy@ zSuzJ67J$L}bYW~FH0wwiGlnYWg513JQsZfrW?X3t4-walq`K*oT!5;@qpYRQ_nk(< zoT}O9Oq~P2Kw*3ZIG9TR+n%(3=|9 zL$dnz-_^17%}k?ejRQZqq#i8k1STzz zk?ð~UJcEJ{Gclj5XUlG^Y2N=Y{m*Ad44)cbchdA#r)#82fVP-i__XMC@CK+o>7 z(MzdHGz)DarZV^7Cr_zjKcw4#8VMTCIm&RRcv*8P?nP?K4w)E}soZsR(*~Fjl#T-I zKQvtpLg0d3{yF%VRdB2{(mkD{m>3j{Jos{x9ytu*k>GCGQ=fkLwHoGejWK#`bn-0Y zQcv?(_@{okl){0}4x`XMBw1ckX6P!s!f8esXp3*kaRBQGCpCS%aVIypf|kq! zFVjh&C{dT5oM3n$(Bk$Ve}|3j)eOV)PPs8mm8w6V?BfQyZLskz1BGXo%a~}Rf2~wg zJy&EH!xizB@HLh$%QDW66Obsm0I&pJ=9hYAg04}A8sq503}da>c6xrO@h59%buwPI z#VZy^uzNHh?n}3!+c=`Ji)Q75+L@GN+)ll@#%7iQMAPD2V;v{1w|oAQYed;-^%wdi zk-wg5G(0Zx6v$ zqD*9=+f;7QH;FL#T<26j?N`(iqL$jvn^;vd50Y8h8=~gW@ets5}i)`bmW*-P42)jb4cP|{OoKG4B&;-DQGe%FN@)!{5wVM?;^=$`8 zLURh0@^&PKD_Q{cDL(A<bhe_r%BXv?w?h;kYpHA?K({3z-oWGg-N zsBtq3)`oHvzEY}r%E+NRPH1+|$)}7fY&7yC9APNB?M}?pdm`z>Y>EjG`kp7$XID?4DE>wr=X!5*OA zqCJbi#xHrn$oE4wYmSq=nqv{ePaq!FRdv)ib4(6Pne5~Me^PTSqVLh}>u^QxIB3iX zU)}<7ug{sEHoxr{N>dLR^JvR6Fd#YSuyLC_+7CU4VcLFgyd|Q>(|82}u=3vk>K{&o z!Q<0^0cG~UZ;Vm=Gl6!z3c{yvFO*#m{{a{w><_qCK-`#gbOWBcUH}t;2dnAO2Vi*b z|D*BV|IRrLrx#u@E>G|h%=!83o&+I*AePSsb$qNCW2h@;MY6^MTm>=h>ysBYM ztEjmOHS2#5$ss!y(xHv`=s1F7-1jlQ-Fz30@V=Lg!bERFPM-j0Z%K!XK3H%9Km0#q zf`U%F?=vh($CUtf*I;m6!a%wC2+OoeO`Tc~gE3ol2PfVYTrrNG=#V~r8FHfeU)m5# z=XtE!%pR=x{jUMBJlq3tI`1D?;$b}y*`0dLxZ5=sMlAI%em!FKvqg)H#3poVoVtN3 zO3YNT)aA#uI43jBvNDoi!4s_ayiock1yPK852{mW;Ty&?bm$~hvRnQHTzB-S5)v+6 zz}7%49fQ8LSB-OU$IzEHLg{-IOfQ5<1EX9?&v>f}Q4P6T^mMmVmAQ$)=4X1a? zaG5yY1a2Pr7bDU^XD6ExsV?u%xk`C8fV0Z7+Di+)-|3w9jF}Yi4^32#rt{y!<_t4n z7ts3(kSrVRCc8@;n^&}yffHxtmunvIYiXeEZNgDXfmOT5PaQ`A!|O?GQlx zt#{NqPs~4zKiZEhBEH2V5eVE~@Zy{~xd&g67(ujry!WWaOl&EK^(h07y`tAcU4Q7ag^t>JjxtY9o(yv&?cSoKWk8CJtJG`E!V>1@ zmC~9iQ<#6V+em#aq>|<9Y@wShD-+A!35zc|uYqPO5NH=;Qv!5Gevsh7LTWc<%DFRO z+5tc3`ekgi*zOuJ+_jYR-GE7KSjkybn?*W<_SQ9=cD`W~h$-oQ7|^W=@&TTBV-w8Gv_j-aOb3aZ!FQmx5XkRHGB&ums$4KFS`+GMzDq0f-fxVTF+uarasp;C{|t^-}Wpd6v0-u2CG{UV{Fe*bEx;W7C{5>oS#%TG_S;! zB~saNLTUOT!!+n$L(SRrj|Va4p6L*=PjCY>?94SI;uv6HHv-)UL|XY}@++-*9VF)O zvdwq}_NE938_$)E=m8b8X>pEOW!X=i2IO+^kB*0fatQkXOnHynjE))jzHExlHHSFG z_=VF#cRMcpHMv+*Wv?@p%G_9DjG!@O);aTP&Y4#?r(!3cg zp?otIMiQup;61qG%#YG5-NuuH@r3mAkijF-E)uwEvU7a-BMT+_y4=Lhz~ z5HxVqvJ@zQ`*9PJvx7q$BPl_w?(4e4fn;y|A6%9X7MK|kJPiP(6~%${Li4}6?pmHo z;mPJSYE3rFX@9bLtw{UjT!EVrkrQB@L$)i_xKu_Ajmso;Oo0q`K{4K>EIH;mDHFhu~ zu%ACHyEQE8xzdr4>o@WHPlr^z$Ty@y|2hdnI~-VHvFZxweJT9pma~l=bUD;ojw|E) z!=QCLq4^#xe8It+A}1T$slXy?IY>~D-=Jn2SFR$KD*4AfEgklS6Bejuxb+^naJ1+5 zkSy@E8x{Nj8^j4olT41u2Wq9Or#Vg-ebV+!m=#86Kx}YZq7jv_IJ4^Gt)3-bN#n1FmEN^(wNi9Puioew zM&G;yG>K6q(D7_FUDn%_4MRSjk*spxtxyjkn^b5>He;eZfsg3eHrRPUj%P#<+)#R} zR~B3YAQr{N#E&XepN1J~MxIlvm6jls0k5DwxG;R-M zaF;!%x$MaL)y~+b>v$vhPh@eXyt{GHy!eJErEtvQ9z#u1?V z`Rbz$BjJ_|Uf86*V)$S_vdxI?ei{ZOvtGfljxo6CMh~n#+*f-9xq8rV=zWe5s_s?7J!p~&qmo-~q1~U_z_-5u zp8AsC;+}H-9a{GzW6dp0LPt;ZvWR?n@;|VOm(=SnVUQpU`ID`^{!w{Mh5Af-*CXb>_moh=+>__=J(x6ePISb8o;3_f&1p+L^OBVRS|Avvq&T=!)dB$ONSC|R*;34!(f{im~ot~xU z(?fqSLc1rJBWQIL+_(;m$9YDF3xb<*@IjjX8l*YX#;_0>UO%*>!W<#QF&3)GqIJ_j zAe9_N_LyBCK?%0ejimvGh$FocOjuK;c}n_OJXd8pJeN&08&y9~NzTdUVVM>4P%HGH zJ(F>eCYI=l@@>&m%vWUN&!?EzakFH)E(a*Up7(C?HyDoLD zY-?zR?eUs*P0j6Y+H|v{GFEWn0jBQE+t5Gq;dE12035oo0Jrsp{IRtFV&0d=;y6E3 zpoVVSVRwq$PdJ%6-ISv)q}Ci;Xk@9l3d+`(O0112Pr2$CYP}NjnpL?V7(Th-=Zro! zVDzl8b4{Ez^M5qn8~*|-9adgp^g*s#O|2)uz_&Iy?dI@B1@86k05i%3 zO-5e}N&EB|Ga`2Gx|J&>x`$Pkw?nEw4}!x;h|Dg4NQ9|e=Eb}Z1-s(=!Gwxsiz7#q z1NL$_Bpbd|!-C+-TJCCUX=^|~{cE%7857!cvJ!G@Of=NfKFz$(mK?D6;xhAxM{bvP z!@D~m^Dn6e>@KV}_tBQsFi*esE{Ksk-^Zbww~9{8MCb>$6HBi}ASV_QieN~PvaDGH zRT>l6;?BoU`m7oDoC!0`IaFga?S`zv9(jZ4o*AawXZ?3{hMC5SGOyid&ulZ(DVIF6=a?}z*cQWfl1-UFvP68=o^GLoET)OuUFHj@i;; zAb8g@yrvyElPgb?55eon1+b4vTnN$KxGNpu6#gOvv~3LtBqpAovkknH6ztx|KR8$jFGG?gZR<7oa!GzJd(kGh8Ul(KHXb5 z3A`oSTZM3wM#O_^Y0HL;1uqm~a@qDO5(1~D`qd2(6N>bC%jwu%M#6AQis^k71U#%v zXYHWx^(gZhGyw!@FyXl1QgYIvZ?wp`3a>F7#Fkdq1#a3CVV*_h4&cx7S2RNi05(dH z3|r=~)8P-1@AQq^)e*FB5d5to_i9t9<_cJsm2K4qc~)%I+BDdnLmrb&M;_-4y|-$$ zH2x}J+UvWuv*@b5_-LusjI8mP)OzXvP}fx7$`=Bk6CeqB;9=R)o=p|ov_a_a;PbeK zDz{;OPVUz-a_pb;gyro$6q=U0DH%cWIc zz{h06=kRE~>!enqz)a(>C$&o=ycKa61ye<>pKIwvpKBlbbXizJ87SU;DSs`L4ny~U zp-u99_Jwx28b5Gs=&gv#zsCBOeTh@pT%?C|f1^1(cYLiq1ArZgkQ_H>hnN(fp@$0% ze|UyI$X4QM{!Z&r1D;>>gBB&8xBQ?bL7dZhHAI1jy0QD0+Vtzf+8fraV2X=5R`9;1 zh&djw=+#bed^j}xl=lA-wr#(d2ZQd-iax8WWMX(UT=y)I9rjJsI=+|vb)Enp(9(c> z@Zl<41d3FB6g_4)h1i_|#J`I>&ejY*dXp|7W!jleA3E1^)@eIr~i zHb*EKg*amny)-~N0I3I3^tD2U#T=-xk{0p@Ar)#zMolSjOfpl$g4U6aCm4yG7c(}f zSX6hFQSo(ZHidV>!ziLcH)+I$Q1U_LQJUP2xsM* zJ8w>1O~s_TIa4Q3nMa3v)SRw}RR+y4^a*sl4fJi_eqhLbhF(j1zk}M0Eic>yJLHWI z%rk@O!D%OWu)~-qU>N0pOo<^3c{7g6=|;(`0IkKmC%OGh9j^3IH*R> z9V$}HuMfe)^|SSG&rMFf-NsQG!7GZ}1=b6bq@y?PnT+mOeV0HKDc0O7>)V_g#0mop zrI~R%Jr%3}t}CW8s{2lxM!(I}^1J(h3Wmk&cd%qTjE=_Z*^w(6+uA!=H811idSkGi z>eEUB%@8*HyKw$_?bt?%bL{96mr*!Ecy^g9oAk686jTyE6MPJJR19zSTxcF3l zV#GlmV5e{$$MWV!as9rTs2@hq-Htg8%iHQNI-9Q#M8RMuaCBJ6LGq)%hK*f_mPf6ndP4UP zxO5Jr>yWDcfIu?4UHS*~_P5&l036g0M-lo-^-RjpciJ45Cu|;FkO{w=7ky)-d5c&e>T(Fb{^^6E9u8u~k_!_3uMYk&vXL!Ez z^(!sDt8bD?UuA+3T6~of%M66SUo2H)6E2~$V%QH1?3P!uy`!O3MlDFm!qSg?3Cfx2 zSujcA-e_OG=2TGO(3hY}xPz#m{<(3NZBhoc!e3jqy*&$9=be)vz<8R222}To%r+l1 zQj(eMJX3{Z!@=Jj%+f=;UR|6@pJeIrUA+rsr#vcq@I+x}unep^6`!jlWUW}!QZEH@ zmU~0cOJrRkoE3iNlsXiL`>wx&dYd*BS`s!e5LSTELCwTn&n}KBiS3P-K#4zK@bJk= zf7g*7hO=hT!zik_2~O=dyLD%XR|dR1oUsBusMKboy?pdiA%1uNJ_fvA0I)%qVG1AlM%r()QVzp#y6x&=hi;^7dHG!57D zqq3QLhrhn{9ElA7iG#N0OU;hFRRVQT@%0L>J(hDXDc1EEhQ@vesjKrm)R+frKrFc( z(>^v_j~fZb4pJ6)9798mSMV>tT3cM|q5{Ve2XThj!;E_BdzgF!uaJ3u%Q_cQ0N1)X zXSl>+9sSOja7>4j^jIMJlf(71>H9I5*mEQFOha}_$4BTR0=~ynY6;?B3?Hd4A#=2z zMcOERBz2yG?RV#BJ?fSzA=EGiuKLS1sL7t^$LLdRbd^o-WSg4pOgFBku6g?GWKI!T z2MV&Sjv25ZV$pMAo(|Jicu6>P2@c2Fp-!tU(NEw6#mMLtYsTsCbWil6m4P7T^n(;_ zcoS?*U8x@80Vu%%n@@Hyt_wiw8EK5d2cQcsa672>E%OYGBLX-aSA2f%G{iU7-V9|psI#98=a^djl0d;9jB?9q4 z;%aO=1pIJ&rH*JgEU)!-PY3RWl<;_^?%oyy8=~HcdJgR#i|hA<0T@NJPLA@}`A>Mv zNQ#Em&IjlJ(SC%Z01Z2cc0G>XiXMh}evJxN-$&+qK<0NS0Yu}sa~#njHQsv`$ewy9 z>y<7XbuiYMxXy+A*02l2tYtPI%&f+eOmwLi5&3Vpqv@{0#D_1{dWU8kQF?rpep?v zclIxE(SOgvMdee6$@wjPkStCT>hc3>y564S7;vIymbB$d_YxYSQY^5_5y+@M^@E^$pUA zF*D3mY^0T9dbU?RP_sa<9x$7`SxLmq;(t84^rofD^Ui3qF8J9cZ( zs&Vj`KkWtr|E?Vm!uM#E0cF?j0R?>ND15X=VjCaWqm81sZpV0q7s6*n*t+P+#sjqK zOXy~Yy{d(>Z!O|5uw73xGRf4lVOPsKT5R0}?V1VU->KVR-{ z-@@Lp8r;FZoB3`_w`mcV3Ojq@QhO|F-o z25P6#l0TTP5QJS9j8kJ%HtoG%8%bNAQ4)|djZ5jJ2ejwu?MK1({PhtnS;R&7nX8o0 z%#jTCY7f)8{aT{TC1r*1x1?N1UD{vFrNMY;92L3EB-0xfgzEPq>d3p{P{H++eT8J1 zj#OL@g4%?^n(xw%9pBqAj^!tlh%j=Wf6u2e*Ceg=0B z^iq)&^MrOboihn4+JwUZoK<&gX?8ED!Ia_&?fe8k0hHOiu4x7v&?9943{Rt;)LyXB z#HTe^IFm*hwZ&t`WUwlkD#pSsw)F$kNv;);4z@iF@#ptXYb{DG%PyMcNwe z{f%ZswEOF0e;Va|!#O*`8Zk_C1!)R;6WJ_0OMau7;HQ75l~eOfoU-0$aJ`Ou77%~q zGeGk<{vHT#&y_H*DjEvD;cvg!Rti7vEOaAW34w4#jyViYdOtSG@LA$5Qg$q66Mm!9 z;o0&BZINwTA864n&ubAG)C^&|Bfff{q#8@zy`_dqHyeSEy0ja>Ae@>_VGX-Fvz|WYKQ>?h>IH9gm--T zU0Mgd{E{|?cRdnlRvTcP<7s$VE49(yQ@Wmv6>Nk0qA43e2|z(MtZxAEh)+I+vpIJU z4FBzvbX2=e(zHNCRW$QSXeyjN5c$7&1e^ND9!%xD`v6|yh|@&BehSCnoET6k0ta1u z3^Ba=kZsZDpC4s+3v>i$xwT&a@OdC~@|c#`9RUM^#cYpZy)~M8#zK@(=71S9OXBG) zR)|1xgUr6Esy;}J8guX-eVBaB<$2KlS&o>gxJ#B#Y~l#)ncjNr<+`kWm78PdfaY{H zUEGR1iWjxCiAtp$LdVUmT={JQ&#-Np8NY;q4av`&J62?86s~J;D_q*xT-eZjAq48K z{AK7+=yDsDt!f#EqH%ys=yv5#{&dx5`d{Z}5xf`_{(8qrhmL3oDFb)IYuqqkM^3jk z5%f+mgn@_!5XC{Wvglux3Jm^#04coe6)ndCpX*=I=J<_kW}XS;`XMjt8uVfuS0?0L z!c2w>DqPlMSZx9T7%n|uzoN~sQPqEIzhxOVJ@t^5>R{vGHcoa#6897T zS@iuzBPQCq^4B#tfeL0$40i7T95xg@YQ8RV<;{Bh&-r>Hl9FgJf!2Nb} zaI#ISU_=K;i54&jZLV2!+aWcAWgTqsRux`?|B>CW5Rk@_;`$5g8`lW6D@5t58lf_0 zrcoYQxx(HB&4kFEZ{5>EmjIzz)7`G&Wv;^I4d#V~tog`bL)$^#bl`4&J1aXd0RDq9 z@E-~T|g!BR5U?qhipf*Zycf(%C#1!h)zy{ z$xrWgM+7~)9%##2y0zbdM;0pjgL4&o)LaIAth{gPR52T5uegy;UgcQX)wIGvFT2#L z2;iE=4uorkUKQgh^4K~}r>%Q3fR=^E9yqm?`{M~kJqwlKH4F9V0dn0v3-!f51vTOb zEuh+3yL5)rCAM{4yxRf;|ZSzA)CpT#6$ zpq~qjmqt@(xR&hsXbIFlxago_U${s}qc*$^JMTjq97Ue%m+I5~5%&7%DBS3%=_c?3 zsoTK-X>od-9fA*J(}K`5?q)EIv$jA$(s(nZmnXLB57UlY^c$(RKyy=dmwt^m@c#!k z)AL1_o{lhtccV$nc3khG&U4%K@w9Iai24b)Lqzxj-l0Hs5w#t{*3Ac?3JTo;Va+?G z5b$|+K)3)WC1`B71BY(kiRqxXDYB!R;CM+F+y(W)lza5d|Esm{fUly;{@;6N-g|j( zAjLom5b_dA3Lzwv0HHUfgET=}5)vQ~NJ!{4paK?}ksOt-h^urL96+k52nYei1yLld zibxGM)CKu}@12>Kmyl)M-{;Tgvu@tZojZ4KIrrRizUO-k-nRYgZ9eYy5RMtS9fYwC zGr($k=~eNX#x&_oTWjMr;eQ8;K&afMpSf(cEsEytvh_1wg+5g2iQTrCLZn@%weR7~ zv2=$GIatS!60b2T9KXkwfO!eyp-;z9+P}xvi&8dXvwU-(ZD46NdY%2Y#mwvX7YA&J zo{?Q6UZXEKWZPo=)}J_R!%;}yy7Pf8I;1oN25zT*61yywQIJmB>gkAQ%VoMV-@!ez z5g?=ssza|a!xqM@Y!k^dZN1@{6;4fS`so{H+Ga9S;f;dYjqa1dZb&w4n1G}+9%pH4 zHyb9z+irk1fHZOFIkRn(UDUcE!c;^^Er-86VU8_Y95{kXp++vF?*S}?JKaR7_~?zE zwS5Zz!cp6Knm8HT_FKnnevbB&GPCe@+I7tKG=;CjfoQ~WIG2QW8Ctq1r1Yr`B({iD zGtZPXa5-XVKRS*>@ySy*R{$heM&5{2WUv$1VF2vty|cDNRXj=!Ke3ImHkK8i*is-k z9JKWurfBCLP>r_i!)Bcmg>zZA6Slj;i~O!C^ht_41vBP}(>5&zmI|;@=b6n-PByqX z5eqaf-2hpd1)_;10^fC^2%U2Bw9SQ-_v6y3-3aIq_*ti5PQ*P(9>K6Sa{vn^M{9=QR$Gl71$0%XOJFC*&>R1*>W91M;qmQx>iX^{?Bzx+IAwJ>9}5fRA#MlA4}skX^n z%rMCj`MYucZyu&Lm1k!WB}r2{1GAg(4I8aC1W%3!X+6=_cp6}J8^z;?Ai+=KodXwwpuB&~q zUx^$c06J9_yr4l$$Nt(xrO6X)4aze^2PEM{`_TmKNHXF{vKfL)x{k4u_HR`h8VIG~ zxwc0=7K)9zwtl8mL?lmD;2)C7KNNstZ6e%l>%%t)lvpJlh~{{i2(bYzdwpwI^ez zGy;B2a8|ejVU>BQqu`Jl0%xj+447t3wnY|<8W~h|T-tEY$;&7j2OLL0xU;IhY_d%k zRJvvWy=APcMnzTZKKfO+3Ri{Pq3cKD^fIs(^j5(eKyTMktJ_E8Ab>;FoOV^IatN@B zZ`8t3)^l3{mwM?vUK>Xs&pnE(t%ejl)h@tzaA0jUPF6{)YO5zpug|HY_NRzrFv-A^ z?jXOqaE(k~=BN%%__p*)UG-=cDJx`rq*Q(LCQi%Bpk?1-!x$Q;y1?%)uejUMk~qA- z^;P)JPK7YgKt`!8m>_Z}b3IVM8?C<2)P7J#4X?|+&$y=Fj8#7=y%A zA{7v?+>MS~S1cti<2jDeY+gKe<&L(OC6*X3ER8oK*4NHRD8s0>m zV(sk+R0z>;HNg>|dNfr(Gam1ltY(sbYn-PJ_Jd~Er==QC&$q;x_)JR(yBEZN(p%v_ z?FOhF=%-e=(XzEVf&5Qm@eOT{qfYQ})!)wx*eN;r0!))4$3bZDU(#IfUz@2>W?k4w!RJ1K{bbXVO!mjJwH$%vp3-`&(JY>hb%#v49f6rDd6~8@f$di~b3}lg56$kUzARcJk;D#K)?baN ze}lX{H)Y)5fdAgu-Dj?L&ln zj#nQwf3KSjW~de8A=Z{Er2W&HXqv$jFXjpP}9^U%1S-1p1)`-eQOT zj8lX4jx*J@ILXvOrU6)DOwlK2l*9~>?{I8$BijSBpRo+K=ET|RKx1BkGEPS5m#&f! zT3ZA+*}rGQcPZDa$ofv`D<7IM2OdBXB}JQOVq(fg3beM3dgUYewdGupiy9L!n3kS~ zbsD6Wpx+CEB5^Wb4N>LY+xc*U$aw!08|)O_=fdxjG7#J1t8>-n#^OHJ1-3K%2h9X1+Vk_&t^)QUoCB2%{mX=;$uQ`H{vcD49bI_=AjPep zQvCry3!({6sqF$E+)SdWt%zO{mAOPijjALVQtT$?p+2VQjiE|U zt3Nzp#g9vTjL|yjf5YlBei^IDvUCXTvD|$a*}c)W@U%?I9Zzx3K+v37jvhMyj5^O4 zNy)sHJzssS;FtD()U!Xfn$PB|eU#{^R`lgU?9jazAUNgPbJ!^3o`q(yZ~;V!KlXLH zwGi53>D}fFF4Ql3Zcr5M&3uR@&7dmj6@g?A00nJ-{; z7TT0Reaj1KYwpRTVH_t4*WrvXtuhR1Wiu|Q!leZ6Lc|=ogAhr&wGP_%b!D5&T46s_ zhMjI*Z`i`uCMbR)CIa-eM#3hbpmOMvi#MRIzP2!rWE1hWdcLo1AsATKGM8RF0;<4& zI_A*O4BH*gp~Ks9N^_gyFfS6=_Klz#qJT8JHeMP2i zFr)166b+6r6Y^fJF?4AJ?3aVb!mx2>tP-qsgk=iM+CW8jrh|iRk$TctTOc=VAU-wJ zvr_n!wNL1D)2ipVn>z!eGX6UWq>5#{CLX0-V(QXY52AzUI{Gsnre8b7 zzcB!2H1=n{jQl_2-GnG}Qh0y9gq|6OWEERKgCi%Vj_L#Q91)WnH8{2Y^r7NE3H6%~Z`Gpy(AauWC_MKP z4-Sf~)iN4*3bQoWSltcqlSlq2__aiD}C&SsTroOmXz8VNCIioS>xdLXzPxl6k%4wB`fHf#gr8j zSN;IigfUmwo=1dBuldZ^Vcd_R))BBGx=(UVChMAY2Q#bJ1-=0iAXvfM4S>$J&cMDV z{K$Q47*0jgeK^vbtR`@Y+C=~yEOpsRUyJjLF=|HS;Qd>$v~)X+^UsX0`Q&i#PBDrB z*<$r3&eFDvyslT4`H0X2FZwHd*YP7a9Ofw0;IwK6N?ZbcZRGGt22p2GX zOr7X9P*-BiKm}1#bN3a8<8%;7Ocfb)!l~6a{1Ka!IJE3DL9qKR_YFco9X?WmE<`0J zdXN&Xz^dH&TOO!8@*S$-H4y?2@1e_@aI2x zu$4;!Kml2zQ4>r;u+dmQnf+sL*rom1%nOw@8Gub-PpM7px|v44oc&)gCdGmG$@VB4vHuy2F23U-rm8h`Iw(m zIsi_(wu8F{8I#a!6tc6t=db5eh0mgN7By_>-95l5AVeE`XPG(KW+x9VGdyWHtCm?i z*(g!dyCMX|qoOjktV5YL-eo`wG$JE4%WL*~+SsgY8=HB)`RARyy;NR33ZgCZtN6t3%~|LFaWm8-Ho`qtiOy<}l;r>Gpnv6b-!& zf5h569PNhe#0d({;3sL-AK2!Bx2zK=5EVFnATUl^%QN%FN71l**v(IEMCPo}GuU0* z?dBg-Qe^;RoO^g1psm5K7Z@ZTD(kdCV`=Pu9!GQb@JEo7%8n!kKf~;hvKs^od-tFN z@N$iun>eClb?AC)HX`ZWUua9_CaW!}?^$h$+56YpvSzQ<7HRq{+RHmq&B3rbtlY#0 zl)k)*=m1eyY<1nwysMXWXN?TmQ`eZk%8KzbK(m zdiP&B((v~D5xaZx=e&~c_Zvq(T6uE8#@Yj?P8eI>!`EHNfWwF8sInIv`38>LYrG=@omZcR&t1R9SJ8-$ES$z)=e6YF%Uj=e(C5+M((c{fNpD`~ z%cX6{y04k95!$$6RfGzMs3TL|w(Bcy@Z(G$b&CU-+VD1S2%j=O(|TMqqY}Lz0~D8~ z`bFxCZu1x}0QWxhXA`9px$8iWK?G_88r)U+%058CuBlBor3;lw6)3V`(bfbAm>Er# zc##yLKK1FYbflo>FaT`pt~6tUK|RuwbfBA_-BYQ;s#q{MDe){aEkNQz4P>~?gRr@m zGK&qMgeL&902^+oKDf8y!viaLl;(DZ;XwM-7xqzh1qsmCOu5y}^kVcN8G1LSuM$PY zcYxvfYM@dH^|x~(VzBocHaq$DQyKpG=%<7~yxHNjwx2SNeETbflyM(tK!^rk zO~BgdIwYDojO&YfaCo{=Jec2M>`BCCNn6Ra_y*+gO^>85;mH@js31r-j3(=&2E!s<>9Ra&c}gQ?pv zT+9C)tkFw`Deb7JDePM%!<1bP^F2ne=&9j~!4H0Li~_dy+T#UfKo&wgm&WtZhkuD) zoT5ZC0@4Ii#sPU3pN34_o70q*W*P#qgmf&Sj50Yv%Pf;av}YVb{>C>0$P5YNs*+zr zrHLAVRp+5X>ML!D{-oHj0ylAQ-&^*l|*G04;@W1Ew0ld-CGJoYr0muZe?D zDSNAkACR1_U}undDrjyfru^@1mCPg@;@j1KQk>)K53Lv7COJ+V>r1c1#2PGy){{nW z4~v{%CX1Pg?Gk5QW1&1A8Z(_VSR(pOuzS3(Qd!9p>% z1KJ^X!&2jTaeFwuw{!p_&9C7IBw0HR#<-FW$_{#?qp~!xPF_5|Myy9*GZ7krWvX}Y zq~xpgeFJ5;w-wQv0Y6H~NWE7o4i-m6iAqI3!AMdxHaZhXcYytV1vKs@3XxB(pxqlnxbTcnF`% z6AV@a_aau$_{3YqaBj=g4HjVKNpkN}GO7PMtp8rqAb)G`R!Y_8oc9n+ICC1}nfB~f zKJaMM`FoTQ&yTsgF>5yOQGx+!ML>Z}hf5`+u*X%|s~n=Q_9|(Dv_GKWR5v@#+ov>@ zga?#!62za_p(Mq*AYE_b2RE@rQ7w%8)N3aLFX2ArsOVVC_G0h{+&-wp%AGx8B6RhJ zhmIVxT$78fQJk`qL;s3~?L)k1f$rM}I|D>4}Vc7*}L1 z+7he!`+J12_ycp8mVJQj=fD9w@aZCFDiVm=_3uAWLZBi1ZZjNBf2n?xi!$VhGOq3z z5v`Uw5*T9%?3R&c?$H2Oq`^L6V9{X;rToJr&uYarrvcLY6 z(E%cPg@6VFhS}v4xaLGyTEU=R{#5frrHZZ}Q~t#T^<@BUJOQ~~uSjWTutJJ!`kO_{ zVx>m;z+%g>lMb$5a-T*Z@vzU74ph_{wzyU+aV~-d*`e<_qx566J=b^qW{YtqaTOyM<7%eH)stT_G zO%j$1_)CpzKnF?Y4_}-E^iMA+{{VA|cgBT8{jFl98mG0PW=dHQ@IysHJfxV#F~ac< zhN8>L&E?SjmyXO-S06Gwb@W?5VEkf1)9!8(-=v<9{^DRM zP^*$w-rc)XhwjJ$otB%LD}nxWFV!jJsW0`p25ngke1+XjZ(LK>%RIVeh#McNR?V@6W95_mD8%AcYB0(|BB`aqXuCRBBTX+c??`;8JFx; zWz=lk1xMwb=_)c&RlFgZU`K1qsie0FRG((9JQzsi4wpvadXL)BXB-4I@r318$h zp5#S2lrbY$BY>}pcDij*hx^LSgZHl$;(9v!nsOhU#ILxH`&5X(Dj zFKa+yVmU53z&hx6_p)|e!s4Bt%^D0{O3eo!?|lIFij*sMe;rRg#^|QV!RdP#-_-FC z>uRY*OAfJM1r~bBziJQC4;*5bjp|A6R&{%0a!9+**lq}qeV~bB4ngD`{s1tUb zfc_#xwv$pmWX*`Z#Dab0$a>Nn(Y_DaAoBl}RjXX)22v3sRPyA9@Vbrph@Gd)6A@r~ zVH4^c{W07E3HJd}opprysGdz6e&5FQ-f^~~?3EWjVXu2%`NaE21ByS%R+qhU?<9+~ z8=fEvFGA*0!98EI2%wQb^fGV{fg z_MCovhL@c*(n~S?G)tuGw{Y%Ve1OI1|2)lFb05$E%40HJ9EO%9onbW{CNrSC;)K7; zbQ|=(%wlEkR+J3!v98NfE?^amQZaP#4EvdUp9OH_Ix>+zIDf6C_|WywF*%OkGuuOG zPb+%ypKQ7V$Ag(saLc8h##vRwFOqTyHqh$lph0DxW$7UveS2noXx|xAP3?OoT{;Vo zY~FAv#Wl{c-kiprXD#Th^DM%e)5p)VC{?hCA_Xc7Qt%a&bDo7cJ?+=)eaV(6wEJDy zi}vR^3|$A76FUih?f=E$?+b}){WI|ik>q!gwX`Ogo_drAGacd}hJn`+n(|wrTodX3 z946T~^~{1jWav6r=6>#Om+W5VAzDs{IkjMw3V#i2H*%hE=y_lhxb{ND*;>mkU77Y7 zCpCj~K$xm%_c|y+&5qyQOOP_J4P|X$AuyiJ-@r1xU@te`V&Hx#4a^95lby3Vn6ACao~LWy zAT*=*KxcFP*56sMCnU-7Hs1aCPJEe^xWb6a-L>h@>rko6f%FExjoJM1WhBUX{%we4 zaX>_Jo-Cxs%`zpe7v!+bPx#J1-e%)$5h8Nl;0NEjk@-2Jh8xdBk?$rJX>fJ|?puYx zGU_bcgqbSfy@i_@j+z@80@ls1vLJ|M-Ut*LC2qzR6Ywe2ocePx30iDsl^MW3n^_H1 z;-D#;(b%{N%oT;hxpbv~A!1|(B$Gi`I5q<$Kk%X;T4_X9259BzppPS1>5F)CNi7{W z44W4!b?QHEX6q2>V&>a3x2&Q|Y`4Mdd2lgn>*@3D-?DlXzHzEBkAG|Z2v>1LS!$!0VvP?NkHPia|IKu_D#I{lLf3g1XR&Y zRy6>fX<>i(r&wG5QTG;af(bASe_e^yn?t3L~vQb&Gvj8o>Ja zi>z*i8!y)Xk{8*N!lV#_Qp$HuT)j>=Law;&Q%whiMfmYx=!KOet+Fw2d$dU&3~HM$Ebr zNHbQV14EXw!V2ycFDCmYojExJ=eVg9=%71yD*uSu549%W6wyMSdWCQV1KN(3Q$@c3yZHg0>z( z#VHCg^ON>SQpC9gB1>XxIUw&zrt!UncTYk`;1Jq6~1rO zUaVTS0&$Y^gwSjSROM1Ka>$PL#wIFZ^7v^;20AzvYd>iv1La5$mxDH~WX*}v;8YWz zSnga={u3Rmun@$lLL@gF>ID*&owjWiYi3PSAqb#>vej5eCQDS=Ly?X{kyg6IN*&%b zjMXTsvl=-8&ktiiv?xCtCT34e%^EI)pUlKfo{3WCmQV-lr9k0J`4ppDIR&4ApEVrr zdhUiI!^Pucpc;Rj0r~iNWw4^Xl*0PfOKghmxuI$1MnQuuNBm)=gA~u2cj@_&te2A5 zG=_#@KclQyVL=}MIRx$MRQ8f*sY@}xas;-wi*m=Z2@cO5aUUF!Kh<_sr`lO; zU%9s++MuT4@{StE7Cm?q$rrmKsZ4PRdyI;Av3g~;)jG7~I1FqM&0x8&OUPKEF5{^JVR9tm*tr7NCKj3ES2r8Sj}m zg;mv|=CwucM<5YsbuOgqN4Kz5mVHQmxLzp_1wDQK-}V&3@xQ6B7q;F@i?`sHl?DTYx6~&!4O+qZ>W_C%ZHg`(Igh^h?d;GAdDwC7w+aWFfag|Gm%n< zu^`VULH~@UlDX_S1wIWu==W!MZR6ZL?P<)tw1Mz?!(i2b=FCS+UYXCD(x}Vu6xeTo z_IRH^VsNdPfpA0RZ@YkbAm~!pmJ0rr%Ye3mnjXaW3(?(Bk77i&Ll{(lvNxs{3o&Fp z7vg;)7^LvB>f;BxP%{iuE-YftvX*qE1}s4A<_caD|a{e!$pF|dTt#B;uMi7JIP3kZ8=Fi zF#P`XMlqaTKW<~+d3q13OR$bOwH}JzdM6VxGS(SbnxslMO#!?Qu#UGDpdB=oAfd5I zx;HxYF3a@PD{=eo-C$@OtfO1JYc)4bQK6q%p#_NYt}aJsBPyuw7ad!icXj5TD5}E| z%JZ+HD$zn5F|V@b57evCs$G~KR=xfngPN%+NFXI2HtxP zc=h3{0UnEe6Z0f@H4sI;Bai|^0F@0i`}TP}9+^n&f*IK^>2Yb#GrYevlxID~AE)>Q zP*sjUjWhMQ1%Q>~uP*e*0zOpFeTFaK;?Kq6`C1fy5mu%57V?9}&$piCM~%PW2^#Ok zXM#?Sl6m6`*8*6E-mZ!G5eMy_3zN*1cOe4=i6t(%3H={NX9{^+T9brc>`Aa#4R{Sg zYyqK*f4hYf$P!`5sR%$6Q+|GdCd#^G@tTPQ18|Qea(lQ0713D&6m0HmyeXZ3nI}=r zS6~YFM8DGN*I^d;_!aIka_WVza*(*1#{^|1uM3eCyOQ^)X!vE6Zi75{{I@LzZp)k? zPU^M<$f1j?fP<2Jtkb8!IoN&)FkwCFYrf03`ZzF+oU~vGW>&EshP|Ts(wKDduP%F@FBX(bRrp^9?UDXh*|EK8_TTtY)mt zqYJ({XLTC!JFL^M{f@=|{_hY}mPO85PAYv=6=PazYP+C2L2`JHSqCsZ;18y95ma!f zDx`U7!PPY|NctaB`{39n5_3ii#_3t%3cQ-qg|I{<$;7$fbt`AFd;2eh~ukOxwk z8U8jxCYpAFkE0*wx?!*LSNTjD_#5zPVUsY&#PQJyNi0+W1EC)$H~dOK6=fijA`4z+ zMEBiiA*p6?t>-8VRV7Vu|48;#>HHEo;f)Uz5!qNTN+j4Zx>(?+BuQelxMo1OWZE4>qs*kkHr}S@V2d#?YDS&BSukG+ z)1f4K5D(M3!D`)Pug`%Uue7xWI!j=@ARyp$GhilOKY`z+4Y`m& zVhrd?E~IVKJYFxfl)V!SJ{glUMQ(TT5BUl5_>+ECK#xglO6!;-C^TBcf*1^EZt%O5 zGJsO}M84Wk;vp8Z=x#3L=^6$!pluQdpao62NG-cVslV4)n-Jf;dE>NZ>CKuZq^GAf zZ`dd!ZA7DyBNKq&#=quCsY%JnKxTB$7Mvx5!JusmEl$t>NDET*#V52oj3WScev!6@ z7T!@Fp<$=A$8bg8a7vpcZ`J-(+oiW_p}nBc%A?v>dVG?0SfM-3wPJE6X|?t0ZM4hq z%%y4D^?!8Ijxc@3W7_+SGP`K)X;T+1hW^<_o2mEhsx{^GQ#Y+T`3%wmXsolvRMAnkqK=Sl4~Mc+77`v8HNDcYmDo}%qwI$Hb* za`$Y)%XuMwhZa7v;%s=cr8lN2TstIspLCZi=@QK+6VOOWbFy+IYrB-qAA*9 zeb`iO5T{+!wf&_Hp!|)RUEeuFb8 zZIHg=DJ_E$dj=!&^)uRWhyL~=Z3E+(BlX!!v@lL9mub4F9LZ!~)~f3BUc}ewm0!{_ zIZY|lULcjUHX5S4rQ;E(A98O(=Bn|ey)2*7@l+zy`@EvPj%Y};lj`b?S85svf>voN z)1o6pMrja(0_u~xMnf{pRiK61uv)uAtJi36>7CbV&6qxSowi;n+pT?(A=;Ta5{xj~ zsRrK!P6&82tS ztc8`1Yh8Nt9c`&79in5HKV&>Qg4XOtYa8s;s(OA5+o`=r7v4p0g};mmaccxdx8J+k zLLJx6FltbwAzrEnTKe5CtcKOQwL(t#Z-}TRkW%()@1QSbhJeTtAq|nWctI^47rSs;F$alMw=_Z8%3H}=yt{FH zLVQA6#>CV{^%LulN@|)mGOgaKwX-`AD6i~PZ zvz0iZr(M#Qp4C2eh}Ahy|L&r;SfPpEXh-$d-)dVq-Mp;b)qnV2dzRCmH?*4iva8y^ znZD?{b{MW0i;YCaZ}y#-o#WP1Z)!K-yerX0!$@4Bt=EVAsO58F_q1UB$Dg(8ieBkA zZHmp{etY_!wt;M)V54pQr_K}fj_w71wW6gihl8kYa%qF zr7lhX^;Oqzie6`_>kCEiTkLuRD11@k=4#jNXkC5D^@UwjJX@dqFV}LrzWI)8l8-*@ zPvOA%nM5i7&ok+f-+m-ufx$uFCqqraOoDQ1*IfCEckzKL?LZU$_cofwsm_`OClWuck=f~;MB8f%K8hchK4|Lr VV{L!Yp8tXW?Qeg3tbLF6{|{nz#%=%r diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index cdd2a655..8d39ebb5 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -19,6 +19,7 @@ 'NC\\Updater\\UpdateCommand' => $baseDir . '/lib/UpdateCommand.php', 'NC\\Updater\\UpdateException' => $baseDir . '/lib/UpdateException.php', 'NC\\Updater\\Updater' => $baseDir . '/lib/Updater.php', + 'NC\\Updater\\Version' => $baseDir . '/lib/Version.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 6f0511c9..0b062231 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -85,6 +85,7 @@ class ComposerStaticInitd7f5ddc48e4715174279359c16c76340 'NC\\Updater\\UpdateCommand' => __DIR__ . '/../..' . '/lib/UpdateCommand.php', 'NC\\Updater\\UpdateException' => __DIR__ . '/../..' . '/lib/UpdateException.php', 'NC\\Updater\\Updater' => __DIR__ . '/../..' . '/lib/Updater.php', + 'NC\\Updater\\Version' => __DIR__ . '/../..' . '/lib/Version.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php',